(self.webpackChunkitg_nextgen_frontend=self.webpackChunkitg_nextgen_frontend||[]).push([[96],{119:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Persian [fa]\n//! author : Ebrahim Byagowi : https://github.com/ebraminio\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '۱',\n 2: '۲',\n 3: '۳',\n 4: '۴',\n 5: '۵',\n 6: '۶',\n 7: '۷',\n 8: '۸',\n 9: '۹',\n 0: '۰',\n },\n numberMap = {\n '۱': '1',\n '۲': '2',\n '۳': '3',\n '۴': '4',\n '۵': '5',\n '۶': '6',\n '۷': '7',\n '۸': '8',\n '۹': '9',\n '۰': '0',\n };\n\n var fa = moment.defineLocale('fa', {\n months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n '_'\n ),\n monthsShort:\n 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(\n '_'\n ),\n weekdays:\n 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n '_'\n ),\n weekdaysShort:\n 'یک\\u200cشنبه_دوشنبه_سه\\u200cشنبه_چهارشنبه_پنج\\u200cشنبه_جمعه_شنبه'.split(\n '_'\n ),\n weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n meridiemParse: /قبل از ظهر|بعد از ظهر/,\n isPM: function (input) {\n return /بعد از ظهر/.test(input);\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'قبل از ظهر';\n } else {\n return 'بعد از ظهر';\n }\n },\n calendar: {\n sameDay: '[امروز ساعت] LT',\n nextDay: '[فردا ساعت] LT',\n nextWeek: 'dddd [ساعت] LT',\n lastDay: '[دیروز ساعت] LT',\n lastWeek: 'dddd [پیش] [ساعت] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'در %s',\n past: '%s پیش',\n s: 'چند ثانیه',\n ss: '%d ثانیه',\n m: 'یک دقیقه',\n mm: '%d دقیقه',\n h: 'یک ساعت',\n hh: '%d ساعت',\n d: 'یک روز',\n dd: '%d روز',\n M: 'یک ماه',\n MM: '%d ماه',\n y: 'یک سال',\n yy: '%d سال',\n },\n preparse: function (string) {\n return string\n .replace(/[۰-۹]/g, function (match) {\n return numberMap[match];\n })\n .replace(/،/g, ',');\n },\n postformat: function (string) {\n return string\n .replace(/\\d/g, function (match) {\n return symbolMap[match];\n })\n .replace(/,/g, '،');\n },\n dayOfMonthOrdinalParse: /\\d{1,2}م/,\n ordinal: '%dم',\n week: {\n dow: 6, // Saturday is the first day of the week.\n doy: 12, // The week that contains Jan 12th is the first week of the year.\n },\n });\n\n return fa;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzPzhkZjQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBlcnNpYW4gW2ZhXVxuLy8hIGF1dGhvciA6IEVicmFoaW0gQnlhZ293aSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lYnJhbWluaW9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn27EnLFxuICAgICAgICAgICAgMjogJ9uyJyxcbiAgICAgICAgICAgIDM6ICfbsycsXG4gICAgICAgICAgICA0OiAn27QnLFxuICAgICAgICAgICAgNTogJ9u1JyxcbiAgICAgICAgICAgIDY6ICfbticsXG4gICAgICAgICAgICA3OiAn27cnLFxuICAgICAgICAgICAgODogJ9u4JyxcbiAgICAgICAgICAgIDk6ICfbuScsXG4gICAgICAgICAgICAwOiAn27AnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn27EnOiAnMScsXG4gICAgICAgICAgICAn27InOiAnMicsXG4gICAgICAgICAgICAn27MnOiAnMycsXG4gICAgICAgICAgICAn27QnOiAnNCcsXG4gICAgICAgICAgICAn27UnOiAnNScsXG4gICAgICAgICAgICAn27YnOiAnNicsXG4gICAgICAgICAgICAn27cnOiAnNycsXG4gICAgICAgICAgICAn27gnOiAnOCcsXG4gICAgICAgICAgICAn27knOiAnOScsXG4gICAgICAgICAgICAn27AnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgZmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmYScsIHtcbiAgICAgICAgbW9udGhzOiAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2pjYp9mG2YjbjNmHX9mB2YjYsduM2Ydf2YXYp9ix2LNf2KLZiNix24zZhF/ZhdmHX9qY2YjYptmGX9qY2YjYptuM2Ydf2KfZiNiqX9iz2b7Yqtin2YXYqNixX9in2qnYqtio2LFf2YbZiNin2YXYqNixX9iv2LPYp9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfbjNqpXFx1MjAwY9i02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHXFx1MjAwY9i02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisXFx1MjAwY9i02YbYqNmHX9is2YXYudmHX9i02YbYqNmHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6XG4gICAgICAgICAgICAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9uMX9ivX9izX9qGX9m+X9isX9i0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mC2KjZhCDYp9iyINi42YfYsXzYqNi52K8g2KfYsiDYuNmH2LEvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KjYudivINin2LIg2LjZh9ixLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mC2KjZhCDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KjYudivINin2LIg2LjZh9ixJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhdix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vZgdix2K/YpyDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYr9uM2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9m+24zYtF0gW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9iv2LEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINm+24zYtCcsXG4gICAgICAgICAgICBzOiAn2obZhtivINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbbjNmHJyxcbiAgICAgICAgICAgIG06ICfbjNqpINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC24zZgtmHJyxcbiAgICAgICAgICAgIGg6ICfbjNqpINiz2KfYudiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KonLFxuICAgICAgICAgICAgZDogJ9uM2qkg2LHZiNiyJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2LHZiNiyJyxcbiAgICAgICAgICAgIE06ICfbjNqpINmF2KfZhycsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfZhycsXG4gICAgICAgICAgICB5OiAn24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXk6ICclZCDYs9in2YQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b27At27ldL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ92YUvLFxuICAgICAgICBvcmRpbmFsOiAnJWTZhScsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmE7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///119\n")},251:(__unused_webpack_module,exports)=>{eval("/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcz85MTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///251\n")},391:(I,g,n)=>{"use strict";I.exports=n.p+"2f8704752126fde9c7cb.png"},705:(I,g,n)=>{"use strict";I.exports=n.p+"74650407adecad72eabf.png"},723:(I,g,n)=>{"use strict";I.exports=n.p+"701d6fc251f287bf9eca.png"},786:(I,g,n)=>{"use strict";I.exports=n.p+"af3ea11b20f62aa9a79d.png"},1063:(I,g,n)=>{"use strict";I.exports=n.p+"5b8a1fdbe97764d30f36.png"},1190:(I,g,n)=>{"use strict";I.exports=n.p+"cc481acf63aa33e0d367.png"},1221:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Sindhi [sd]\n//! author : Narain Sagar : https://github.com/narainsagar\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = [\n 'جنوري',\n 'فيبروري',\n 'مارچ',\n 'اپريل',\n 'مئي',\n 'جون',\n 'جولاءِ',\n 'آگسٽ',\n 'سيپٽمبر',\n 'آڪٽوبر',\n 'نومبر',\n 'ڊسمبر',\n ],\n days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];\n\n var sd = moment.defineLocale('sd', {\n months: months,\n monthsShort: months,\n weekdays: days,\n weekdaysShort: days,\n weekdaysMin: days,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd، D MMMM YYYY HH:mm',\n },\n meridiemParse: /صبح|شام/,\n isPM: function (input) {\n return 'شام' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'صبح';\n }\n return 'شام';\n },\n calendar: {\n sameDay: '[اڄ] LT',\n nextDay: '[سڀاڻي] LT',\n nextWeek: 'dddd [اڳين هفتي تي] LT',\n lastDay: '[ڪالهه] LT',\n lastWeek: '[گزريل هفتي] dddd [تي] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s پوء',\n past: '%s اڳ',\n s: 'چند سيڪنڊ',\n ss: '%d سيڪنڊ',\n m: 'هڪ منٽ',\n mm: '%d منٽ',\n h: 'هڪ ڪلاڪ',\n hh: '%d ڪلاڪ',\n d: 'هڪ ڏينهن',\n dd: '%d ڏينهن',\n M: 'هڪ مهينو',\n MM: '%d مهينا',\n y: 'هڪ سال',\n yy: '%d سال',\n },\n preparse: function (string) {\n return string.replace(/،/g, ',');\n },\n postformat: function (string) {\n return string.replace(/,/g, '،');\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return sd;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyMS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NkLmpzPzY3ODQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNpbmRoaSBbc2RdXG4vLyEgYXV0aG9yIDogTmFyYWluIFNhZ2FyIDogaHR0cHM6Ly9naXRodWIuY29tL25hcmFpbnNhZ2FyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9is2YbZiNix2YonLFxuICAgICAgICAgICAgJ9mB2YrYqNix2YjYsdmKJyxcbiAgICAgICAgICAgICfZhdin2LHahicsXG4gICAgICAgICAgICAn2KfZvtix2YrZhCcsXG4gICAgICAgICAgICAn2YXYptmKJyxcbiAgICAgICAgICAgICfYrNmI2YYnLFxuICAgICAgICAgICAgJ9is2YjZhNin2KHZkCcsXG4gICAgICAgICAgICAn2KLar9iz2b0nLFxuICAgICAgICAgICAgJ9iz2YrZvtm92YXYqNixJyxcbiAgICAgICAgICAgICfYotqq2b3ZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZhdio2LEnLFxuICAgICAgICAgICAgJ9qK2LPZhdio2LEnLFxuICAgICAgICBdLFxuICAgICAgICBkYXlzID0gWyfYotqG2LEnLCAn2LPZiNmF2LEnLCAn2Kfasdin2LHZiCcsICfYp9ix2KjYuScsICfYrtmF2YrYsycsICfYrNmF2LknLCAn2ofZhtqH2LEnXTtcblxuICAgIHZhciBzZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NkJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkYXlzLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LXYqNitfNi02KfZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i12KjYrSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhSc7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2oRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LPagNin2rvZil0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYp9qz2YrZhiDZh9mB2KrZiiDYqtmKXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9qq2KfZhNmH2YddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9qv2LLYsdmK2YQg2YfZgdiq2YpdIGRkZGQgW9iq2YpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2b7ZiNihJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDYp9qzJyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2LPZitqq2YbaiicsXG4gICAgICAgICAgICBzczogJyVkINiz2YraqtmG2oonLFxuICAgICAgICAgICAgbTogJ9mH2qog2YXZhtm9JyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZhtm9JyxcbiAgICAgICAgICAgIGg6ICfZh9qqINqq2YTYp9qqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2qrZhNin2qonLFxuICAgICAgICAgICAgZDogJ9mH2qog2o/ZitmG2YfZhicsXG4gICAgICAgICAgICBkZDogJyVkINqP2YrZhtmH2YYnLFxuICAgICAgICAgICAgTTogJ9mH2qog2YXZh9mK2YbZiCcsXG4gICAgICAgICAgICBNTTogJyVkINmF2YfZitmG2KcnLFxuICAgICAgICAgICAgeTogJ9mH2qog2LPYp9mEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9mEJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2Q7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1221\n")},1632:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Chinese (Hong Kong) [zh-hk]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Konstantin : https://github.com/skfd\n//! author : Anthony : https://github.com/anthonylau\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var zhHk = moment.defineLocale('zh-hk', {\n months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n '_'\n ),\n monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n '_'\n ),\n weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY/MM/DD',\n LL: 'YYYY年M月D日',\n LLL: 'YYYY年M月D日 HH:mm',\n LLLL: 'YYYY年M月D日dddd HH:mm',\n l: 'YYYY/M/D',\n ll: 'YYYY年M月D日',\n lll: 'YYYY年M月D日 HH:mm',\n llll: 'YYYY年M月D日dddd HH:mm',\n },\n meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n return hour;\n } else if (meridiem === '中午') {\n return hour >= 11 ? hour : hour + 12;\n } else if (meridiem === '下午' || meridiem === '晚上') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n var hm = hour * 100 + minute;\n if (hm < 600) {\n return '凌晨';\n } else if (hm < 900) {\n return '早上';\n } else if (hm < 1200) {\n return '上午';\n } else if (hm === 1200) {\n return '中午';\n } else if (hm < 1800) {\n return '下午';\n } else {\n return '晚上';\n }\n },\n calendar: {\n sameDay: '[今天]LT',\n nextDay: '[明天]LT',\n nextWeek: '[下]ddddLT',\n lastDay: '[昨天]LT',\n lastWeek: '[上]ddddLT',\n sameElse: 'L',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '日';\n case 'M':\n return number + '月';\n case 'w':\n case 'W':\n return number + '週';\n default:\n return number;\n }\n },\n relativeTime: {\n future: '%s後',\n past: '%s前',\n s: '幾秒',\n ss: '%d 秒',\n m: '1 分鐘',\n mm: '%d 分鐘',\n h: '1 小時',\n hh: '%d 小時',\n d: '1 天',\n dd: '%d 天',\n M: '1 個月',\n MM: '%d 個月',\n y: '1 年',\n yy: '%d 年',\n },\n });\n\n return zhHk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qcz80OWFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChIb25nIEtvbmcpIFt6aC1oa11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcbi8vISBhdXRob3IgOiBLb25zdGFudGluIDogaHR0cHM6Ly9naXRodWIuY29tL3NrZmRcbi8vISBhdXRob3IgOiBBbnRob255IDogaHR0cHM6Ly9naXRodWIuY29tL2FudGhvbnlsYXVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aEhrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtaGsnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA9PT0gMTIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il1kZGRkTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhIaztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1632\n")},2246:(I,g,n)=>{"use strict";I.exports=n.p+"c7dc1f998cc02a16890f.png"},2355:(I,g,n)=>{"use strict";I.exports=n.p+"f4b352b31ee751d11826.png"},2694:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = __webpack_require__(6925);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY5NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanM/ZDdhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2694\n")},2833:module=>{eval('//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n\n if (ret !== void 0) {\n return !!ret;\n }\n\n if (objA === objB) {\n return true;\n }\n\n if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n // Test for A\'s keys different from B.\n for (var idx = 0; idx < keysA.length; idx++) {\n var key = keysA[idx];\n\n if (!bHasOwnProperty(key)) {\n return false;\n }\n\n var valueA = objA[key];\n var valueB = objB[key];\n\n ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n\n if (ret === false || (ret === void 0 && valueA !== valueB)) {\n return false;\n }\n }\n\n return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3NoYWxsb3dlcXVhbC9pbmRleC5qcz8xYjJiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2833\n')},2955:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar _Object$setPrototypeO;\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar finished = __webpack_require__(86238);\nvar kLastResolve = Symbol('lastResolve');\nvar kLastReject = Symbol('lastReject');\nvar kError = Symbol('error');\nvar kEnded = Symbol('ended');\nvar kLastPromise = Symbol('lastPromise');\nvar kHandlePromise = Symbol('handlePromise');\nvar kStream = Symbol('stream');\nfunction createIterResult(value, done) {\n return {\n value: value,\n done: done\n };\n}\nfunction readAndResolve(iter) {\n var resolve = iter[kLastResolve];\n if (resolve !== null) {\n var data = iter[kStream].read();\n // we defer if data is null\n // we can be expecting either 'end' or\n // 'error'\n if (data !== null) {\n iter[kLastPromise] = null;\n iter[kLastResolve] = null;\n iter[kLastReject] = null;\n resolve(createIterResult(data, false));\n }\n }\n}\nfunction onReadable(iter) {\n // we wait for the next tick, because it might\n // emit an error with process.nextTick\n process.nextTick(readAndResolve, iter);\n}\nfunction wrapForNext(lastPromise, iter) {\n return function (resolve, reject) {\n lastPromise.then(function () {\n if (iter[kEnded]) {\n resolve(createIterResult(undefined, true));\n return;\n }\n iter[kHandlePromise](resolve, reject);\n }, reject);\n };\n}\nvar AsyncIteratorPrototype = Object.getPrototypeOf(function () {});\nvar ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {\n get stream() {\n return this[kStream];\n },\n next: function next() {\n var _this = this;\n // if we have detected an error in the meanwhile\n // reject straight away\n var error = this[kError];\n if (error !== null) {\n return Promise.reject(error);\n }\n if (this[kEnded]) {\n return Promise.resolve(createIterResult(undefined, true));\n }\n if (this[kStream].destroyed) {\n // We need to defer via nextTick because if .destroy(err) is\n // called, the error will be emitted via nextTick, and\n // we cannot guarantee that there is no error lingering around\n // waiting to be emitted.\n return new Promise(function (resolve, reject) {\n process.nextTick(function () {\n if (_this[kError]) {\n reject(_this[kError]);\n } else {\n resolve(createIterResult(undefined, true));\n }\n });\n });\n }\n\n // if we have multiple next() calls\n // we will wait for the previous Promise to finish\n // this logic is optimized to support for await loops,\n // where next() is only called once at a time\n var lastPromise = this[kLastPromise];\n var promise;\n if (lastPromise) {\n promise = new Promise(wrapForNext(lastPromise, this));\n } else {\n // fast path needed to support multiple this.push()\n // without triggering the next() queue\n var data = this[kStream].read();\n if (data !== null) {\n return Promise.resolve(createIterResult(data, false));\n }\n promise = new Promise(this[kHandlePromise]);\n }\n this[kLastPromise] = promise;\n return promise;\n }\n}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {\n return this;\n}), _defineProperty(_Object$setPrototypeO, \"return\", function _return() {\n var _this2 = this;\n // destroy(err, cb) is a private API\n // we can guarantee we have that here, because we control the\n // Readable class this is attached to\n return new Promise(function (resolve, reject) {\n _this2[kStream].destroy(null, function (err) {\n if (err) {\n reject(err);\n return;\n }\n resolve(createIterResult(undefined, true));\n });\n });\n}), _Object$setPrototypeO), AsyncIteratorPrototype);\nvar createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {\n var _Object$create;\n var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {\n value: stream,\n writable: true\n }), _defineProperty(_Object$create, kLastResolve, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kLastReject, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kError, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kEnded, {\n value: stream._readableState.endEmitted,\n writable: true\n }), _defineProperty(_Object$create, kHandlePromise, {\n value: function value(resolve, reject) {\n var data = iterator[kStream].read();\n if (data) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(data, false));\n } else {\n iterator[kLastResolve] = resolve;\n iterator[kLastReject] = reject;\n }\n },\n writable: true\n }), _Object$create));\n iterator[kLastPromise] = null;\n finished(stream, function (err) {\n if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {\n var reject = iterator[kLastReject];\n // reject if we are waiting for data in the Promise\n // returned by next() and store the error\n if (reject !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n reject(err);\n }\n iterator[kError] = err;\n return;\n }\n var resolve = iterator[kLastResolve];\n if (resolve !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(undefined, true));\n }\n iterator[kEnded] = true;\n });\n stream.on('readable', onReadable.bind(null, iterator));\n return iterator;\n};\nmodule.exports = createReadableStreamAsyncIterator;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk1NS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3IuanM/OWMwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBfT2JqZWN0JHNldFByb3RvdHlwZU87XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG52YXIgZmluaXNoZWQgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKTtcbnZhciBrTGFzdFJlc29sdmUgPSBTeW1ib2woJ2xhc3RSZXNvbHZlJyk7XG52YXIga0xhc3RSZWplY3QgPSBTeW1ib2woJ2xhc3RSZWplY3QnKTtcbnZhciBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG52YXIga0VuZGVkID0gU3ltYm9sKCdlbmRlZCcpO1xudmFyIGtMYXN0UHJvbWlzZSA9IFN5bWJvbCgnbGFzdFByb21pc2UnKTtcbnZhciBrSGFuZGxlUHJvbWlzZSA9IFN5bWJvbCgnaGFuZGxlUHJvbWlzZScpO1xudmFyIGtTdHJlYW0gPSBTeW1ib2woJ3N0cmVhbScpO1xuZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdCh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBkb25lOiBkb25lXG4gIH07XG59XG5mdW5jdGlvbiByZWFkQW5kUmVzb2x2ZShpdGVyKSB7XG4gIHZhciByZXNvbHZlID0gaXRlcltrTGFzdFJlc29sdmVdO1xuICBpZiAocmVzb2x2ZSAhPT0gbnVsbCkge1xuICAgIHZhciBkYXRhID0gaXRlcltrU3RyZWFtXS5yZWFkKCk7XG4gICAgLy8gd2UgZGVmZXIgaWYgZGF0YSBpcyBudWxsXG4gICAgLy8gd2UgY2FuIGJlIGV4cGVjdGluZyBlaXRoZXIgJ2VuZCcgb3JcbiAgICAvLyAnZXJyb3InXG4gICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgIGl0ZXJba0xhc3RQcm9taXNlXSA9IG51bGw7XG4gICAgICBpdGVyW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcltrTGFzdFJlamVjdF0gPSBudWxsO1xuICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpIHtcbiAgLy8gd2Ugd2FpdCBmb3IgdGhlIG5leHQgdGljaywgYmVjYXVzZSBpdCBtaWdodFxuICAvLyBlbWl0IGFuIGVycm9yIHdpdGggcHJvY2Vzcy5uZXh0VGlja1xuICBwcm9jZXNzLm5leHRUaWNrKHJlYWRBbmRSZXNvbHZlLCBpdGVyKTtcbn1cbmZ1bmN0aW9uIHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLCBpdGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgbGFzdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXRlcltrRW5kZWRdKSB7XG4gICAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9LCByZWplY3QpO1xuICB9O1xufVxudmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24gKCkge30pO1xudmFyIFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZigoX09iamVjdCRzZXRQcm90b3R5cGVPID0ge1xuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzW2tTdHJlYW1dO1xuICB9LFxuICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgLy8gaWYgd2UgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvciBpbiB0aGUgbWVhbndoaWxlXG4gICAgLy8gcmVqZWN0IHN0cmFpZ2h0IGF3YXlcbiAgICB2YXIgZXJyb3IgPSB0aGlzW2tFcnJvcl07XG4gICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAodGhpc1trRW5kZWRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB2aWEgbmV4dFRpY2sgYmVjYXVzZSBpZiAuZGVzdHJveShlcnIpIGlzXG4gICAgICAvLyBjYWxsZWQsIHRoZSBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgdmlhIG5leHRUaWNrLCBhbmRcbiAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcyBubyBlcnJvciBsaW5nZXJpbmcgYXJvdW5kXG4gICAgICAvLyB3YWl0aW5nIHRvIGJlIGVtaXR0ZWQuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXNba0Vycm9yXSkge1xuICAgICAgICAgICAgcmVqZWN0KF90aGlzW2tFcnJvcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgbXVsdGlwbGUgbmV4dCgpIGNhbGxzXG4gICAgLy8gd2Ugd2lsbCB3YWl0IGZvciB0aGUgcHJldmlvdXMgUHJvbWlzZSB0byBmaW5pc2hcbiAgICAvLyB0aGlzIGxvZ2ljIGlzIG9wdGltaXplZCB0byBzdXBwb3J0IGZvciBhd2FpdCBsb29wcyxcbiAgICAvLyB3aGVyZSBuZXh0KCkgaXMgb25seSBjYWxsZWQgb25jZSBhdCBhIHRpbWVcbiAgICB2YXIgbGFzdFByb21pc2UgPSB0aGlzW2tMYXN0UHJvbWlzZV07XG4gICAgdmFyIHByb21pc2U7XG4gICAgaWYgKGxhc3RQcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gbmV3IFByb21pc2Uod3JhcEZvck5leHQobGFzdFByb21pc2UsIHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZmFzdCBwYXRoIG5lZWRlZCB0byBzdXBwb3J0IG11bHRpcGxlIHRoaXMucHVzaCgpXG4gICAgICAvLyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG5leHQoKSBxdWV1ZVxuICAgICAgdmFyIGRhdGEgPSB0aGlzW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCBmYWxzZSkpO1xuICAgICAgfVxuICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKTtcbiAgICB9XG4gICAgdGhpc1trTGFzdFByb21pc2VdID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXM7XG59KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTywgXCJyZXR1cm5cIiwgZnVuY3Rpb24gX3JldHVybigpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG4gIC8vIGRlc3Ryb3koZXJyLCBjYikgaXMgYSBwcml2YXRlIEFQSVxuICAvLyB3ZSBjYW4gZ3VhcmFudGVlIHdlIGhhdmUgdGhhdCBoZXJlLCBiZWNhdXNlIHdlIGNvbnRyb2wgdGhlXG4gIC8vIFJlYWRhYmxlIGNsYXNzIHRoaXMgaXMgYXR0YWNoZWQgdG9cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBfdGhpczJba1N0cmVhbV0uZGVzdHJveShudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodW5kZWZpbmVkLCB0cnVlKSk7XG4gICAgfSk7XG4gIH0pO1xufSksIF9PYmplY3Qkc2V0UHJvdG90eXBlTyksIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO1xudmFyIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0pIHtcbiAgdmFyIF9PYmplY3QkY3JlYXRlO1xuICB2YXIgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgKF9PYmplY3QkY3JlYXRlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga1N0cmVhbSwge1xuICAgIHZhbHVlOiBzdHJlYW0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZXNvbHZlLCB7XG4gICAgdmFsdWU6IG51bGwsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0xhc3RSZWplY3QsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRXJyb3IsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KSwgX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLCBrRW5kZWQsIHtcbiAgICB2YWx1ZTogc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSwga0hhbmRsZVByb21pc2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZGF0YSA9IGl0ZXJhdG9yW2tTdHJlYW1dLnJlYWQoKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsIGZhbHNlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFJlc29sdmVdID0gcmVzb2x2ZTtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gcmVqZWN0O1xuICAgICAgfVxuICAgIH0sXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSksIF9PYmplY3QkY3JlYXRlKSk7XG4gIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV0gPSBudWxsO1xuICBmaW5pc2hlZChzdHJlYW0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKSB7XG4gICAgICB2YXIgcmVqZWN0ID0gaXRlcmF0b3Jba0xhc3RSZWplY3RdO1xuICAgICAgLy8gcmVqZWN0IGlmIHdlIGFyZSB3YWl0aW5nIGZvciBkYXRhIGluIHRoZSBQcm9taXNlXG4gICAgICAvLyByZXR1cm5lZCBieSBuZXh0KCkgYW5kIHN0b3JlIHRoZSBlcnJvclxuICAgICAgaWYgKHJlamVjdCAhPT0gbnVsbCkge1xuICAgICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgICAgaXRlcmF0b3Jba0xhc3RSZXNvbHZlXSA9IG51bGw7XG4gICAgICAgIGl0ZXJhdG9yW2tMYXN0UmVqZWN0XSA9IG51bGw7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3Jba0Vycm9yXSA9IGVycjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc29sdmUgPSBpdGVyYXRvcltrTGFzdFJlc29sdmVdO1xuICAgIGlmIChyZXNvbHZlICE9PSBudWxsKSB7XG4gICAgICBpdGVyYXRvcltrTGFzdFByb21pc2VdID0gbnVsbDtcbiAgICAgIGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV0gPSBudWxsO1xuICAgICAgaXRlcmF0b3Jba0xhc3RSZWplY3RdID0gbnVsbDtcbiAgICAgIHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh1bmRlZmluZWQsIHRydWUpKTtcbiAgICB9XG4gICAgaXRlcmF0b3Jba0VuZGVkXSA9IHRydWU7XG4gIH0pO1xuICBzdHJlYW0ub24oJ3JlYWRhYmxlJywgb25SZWFkYWJsZS5iaW5kKG51bGwsIGl0ZXJhdG9yKSk7XG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2955\n")},3035:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Estonian [et]\n//! author : Henry Kehlmann : https://github.com/madhenry\n//! improvements : Illimar Tambek : https://github.com/ragulka\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n var format = {\n s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],\n ss: [number + 'sekundi', number + 'sekundit'],\n m: ['ühe minuti', 'üks minut'],\n mm: [number + ' minuti', number + ' minutit'],\n h: ['ühe tunni', 'tund aega', 'üks tund'],\n hh: [number + ' tunni', number + ' tundi'],\n d: ['ühe päeva', 'üks päev'],\n M: ['kuu aja', 'kuu aega', 'üks kuu'],\n MM: [number + ' kuu', number + ' kuud'],\n y: ['ühe aasta', 'aasta', 'üks aasta'],\n yy: [number + ' aasta', number + ' aastat'],\n };\n if (withoutSuffix) {\n return format[key][2] ? format[key][2] : format[key][1];\n }\n return isFuture ? format[key][0] : format[key][1];\n }\n\n var et = moment.defineLocale('et', {\n months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(\n '_'\n ),\n monthsShort:\n 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),\n weekdays:\n 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(\n '_'\n ),\n weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),\n weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd, D. MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[Täna,] LT',\n nextDay: '[Homme,] LT',\n nextWeek: '[Järgmine] dddd LT',\n lastDay: '[Eile,] LT',\n lastWeek: '[Eelmine] dddd LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s pärast',\n past: '%s tagasi',\n s: processRelativeTime,\n ss: processRelativeTime,\n m: processRelativeTime,\n mm: processRelativeTime,\n h: processRelativeTime,\n hh: processRelativeTime,\n d: processRelativeTime,\n dd: '%d päeva',\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return et;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAzNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzP2VjMTgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVzdG9uaWFuIFtldF1cbi8vISBhdXRob3IgOiBIZW5yeSBLZWhsbWFubiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRoZW5yeVxuLy8hIGltcHJvdmVtZW50cyA6IElsbGltYXIgVGFtYmVrIDogaHR0cHM6Ly9naXRodWIuY29tL3JhZ3Vsa2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ23DtW5lIHNla3VuZGknLCAnbcO1bmkgc2VrdW5kJywgJ3BhYXIgc2VrdW5kaXQnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJ3Nla3VuZGknLCBudW1iZXIgKyAnc2VrdW5kaXQnXSxcbiAgICAgICAgICAgIG06IFsnw7xoZSBtaW51dGknLCAnw7xrcyBtaW51dCddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG1pbnV0aScsIG51bWJlciArICcgbWludXRpdCddLFxuICAgICAgICAgICAgaDogWyfDvGhlIHR1bm5pJywgJ3R1bmQgYWVnYScsICfDvGtzIHR1bmQnXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyB0dW5uaScsIG51bWJlciArICcgdHVuZGknXSxcbiAgICAgICAgICAgIGQ6IFsnw7xoZSBww6RldmEnLCAnw7xrcyBww6RldiddLFxuICAgICAgICAgICAgTTogWydrdXUgYWphJywgJ2t1dSBhZWdhJywgJ8O8a3Mga3V1J10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcga3V1JywgbnVtYmVyICsgJyBrdXVkJ10sXG4gICAgICAgICAgICB5OiBbJ8O8aGUgYWFzdGEnLCAnYWFzdGEnLCAnw7xrcyBhYXN0YSddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIGFhc3RhJywgbnVtYmVyICsgJyBhYXN0YXQnXSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRba2V5XVsyXSA/IGZvcm1hdFtrZXldWzJdIDogZm9ybWF0W2tleV1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdldCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFhbnVhcl92ZWVicnVhcl9tw6RydHNfYXByaWxsX21haV9qdXVuaV9qdXVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9vYmVyX25vdmVtYmVyX2RldHNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFhbl92ZWVicl9tw6RydHNfYXByX21haV9qdXVuaV9qdXVsaV9hdWdfc2VwdF9va3Rfbm92X2RldHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3DDvGhhcMOkZXZfZXNtYXNww6Rldl90ZWlzaXDDpGV2X2tvbG1hcMOkZXZfbmVsamFww6Rldl9yZWVkZV9sYXVww6Rldicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdQX0VfVF9LX05fUl9MJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVMOkbmEsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0hvbW1lLF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbSsOkcmdtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRWlsZSxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0VlbG1pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBww6RyYXN0JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0YWdhc2knLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiAnJWQgcMOkZXZhJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBldDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3035\n")},3072:(__unused_webpack_module,exports)=>{"use strict";eval('/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?\nSymbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119;\nfunction z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzPzBhOGEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3072\n')},3191:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar Cancel = __webpack_require__(31928);\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE5MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz84ZGY0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcblxuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICB0aGlzLnByb21pc2UudGhlbihmdW5jdGlvbihjYW5jZWwpIHtcbiAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgIHZhciBpO1xuICAgIHZhciBsID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgfVxuICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICB0aGlzLnByb21pc2UudGhlbiA9IGZ1bmN0aW9uKG9uZnVsZmlsbGVkKSB7XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSkudGhlbihvbmZ1bGZpbGxlZCk7XG5cbiAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH07XG5cbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gKi9cblxuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICB9XG59O1xuXG4vKipcbiAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAqL1xuXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3191\n")},3322:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Serbian Cyrillic [sr-cyrl]\n//! author : Milan Janačković : https://github.com/milan-j\n//! author : Stefan Crnjaković : https://github.com/crnjakovic\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var translator = {\n words: {\n //Different grammatical cases\n ss: ['секунда', 'секунде', 'секунди'],\n m: ['један минут', 'једног минута'],\n mm: ['минут', 'минута', 'минута'],\n h: ['један сат', 'једног сата'],\n hh: ['сат', 'сата', 'сати'],\n d: ['један дан', 'једног дана'],\n dd: ['дан', 'дана', 'дана'],\n M: ['један месец', 'једног месеца'],\n MM: ['месец', 'месеца', 'месеци'],\n y: ['једну годину', 'једне године'],\n yy: ['годину', 'године', 'година'],\n },\n correctGrammaticalCase: function (number, wordKey) {\n if (\n number % 10 >= 1 &&\n number % 10 <= 4 &&\n (number % 100 < 10 || number % 100 >= 20)\n ) {\n return number % 10 === 1 ? wordKey[0] : wordKey[1];\n }\n return wordKey[2];\n },\n translate: function (number, withoutSuffix, key, isFuture) {\n var wordKey = translator.words[key],\n word;\n\n if (key.length === 1) {\n // Nominativ\n if (key === 'y' && withoutSuffix) return 'једна година';\n return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n }\n\n word = translator.correctGrammaticalCase(number, wordKey);\n // Nominativ\n if (key === 'yy' && withoutSuffix && word === 'годину') {\n return number + ' година';\n }\n\n return number + ' ' + word;\n },\n };\n\n var srCyrl = moment.defineLocale('sr-cyrl', {\n months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(\n '_'\n ),\n monthsShort:\n 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),\n monthsParseExact: true,\n weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),\n weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),\n weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'D. M. YYYY.',\n LL: 'D. MMMM YYYY.',\n LLL: 'D. MMMM YYYY. H:mm',\n LLLL: 'dddd, D. MMMM YYYY. H:mm',\n },\n calendar: {\n sameDay: '[данас у] LT',\n nextDay: '[сутра у] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[у] [недељу] [у] LT';\n case 3:\n return '[у] [среду] [у] LT';\n case 6:\n return '[у] [суботу] [у] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[у] dddd [у] LT';\n }\n },\n lastDay: '[јуче у] LT',\n lastWeek: function () {\n var lastWeekDays = [\n '[прошле] [недеље] [у] LT',\n '[прошлог] [понедељка] [у] LT',\n '[прошлог] [уторка] [у] LT',\n '[прошле] [среде] [у] LT',\n '[прошлог] [четвртка] [у] LT',\n '[прошлог] [петка] [у] LT',\n '[прошле] [суботе] [у] LT',\n ];\n return lastWeekDays[this.day()];\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'за %s',\n past: 'пре %s',\n s: 'неколико секунди',\n ss: translator.translate,\n m: translator.translate,\n mm: translator.translate,\n h: translator.translate,\n hh: translator.translate,\n d: translator.translate,\n dd: translator.translate,\n M: translator.translate,\n MM: translator.translate,\n y: translator.translate,\n yy: translator.translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 1st is the first week of the year.\n },\n });\n\n return srCyrl;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMyMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qcz8xM2U5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTZXJiaWFuIEN5cmlsbGljIFtzci1jeXJsXVxuLy8hIGF1dGhvciA6IE1pbGFuIEphbmHEjWtvdmnEhzxtaWxhbmphbmFja292aWNAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWxhbi1qXG4vLyEgYXV0aG9yIDogU3RlZmFuIENybmpha292acSHIDxzdGVmYW5AaG90bWFpbC5ycz4gOiBodHRwczovL2dpdGh1Yi5jb20vY3JuamFrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsn0YHQtdC60YPQvdC00LAnLCAn0YHQtdC60YPQvdC00LUnLCAn0YHQtdC60YPQvdC00LgnXSxcbiAgICAgICAgICAgIG06IFsn0ZjQtdC00LDQvSDQvNC40L3Rg9GCJywgJ9GY0LXQtNC90L7QsyDQvNC40L3Rg9GC0LAnXSxcbiAgICAgICAgICAgIG1tOiBbJ9C80LjQvdGD0YInLCAn0LzQuNC90YPRgtCwJywgJ9C80LjQvdGD0YLQsCddLFxuICAgICAgICAgICAgaDogWyfRmNC10LTQsNC9INGB0LDRgicsICfRmNC10LTQvdC+0LMg0YHQsNGC0LAnXSxcbiAgICAgICAgICAgIGhoOiBbJ9GB0LDRgicsICfRgdCw0YLQsCcsICfRgdCw0YLQuCddLFxuICAgICAgICAgICAgZDogWyfRmNC10LTQsNC9INC00LDQvScsICfRmNC10LTQvdC+0LMg0LTQsNC90LAnXSxcbiAgICAgICAgICAgIGRkOiBbJ9C00LDQvScsICfQtNCw0L3QsCcsICfQtNCw0L3QsCddLFxuICAgICAgICAgICAgTTogWyfRmNC10LTQsNC9INC80LXRgdC10YYnLCAn0ZjQtdC00L3QvtCzINC80LXRgdC10YbQsCddLFxuICAgICAgICAgICAgTU06IFsn0LzQtdGB0LXRhicsICfQvNC10YHQtdGG0LAnLCAn0LzQtdGB0LXRhtC4J10sXG4gICAgICAgICAgICB5OiBbJ9GY0LXQtNC90YMg0LPQvtC00LjQvdGDJywgJ9GY0LXQtNC90LUg0LPQvtC00LjQvdC1J10sXG4gICAgICAgICAgICB5eTogWyfQs9C+0LTQuNC90YMnLCAn0LPQvtC00LjQvdC1JywgJ9Cz0L7QtNC40L3QsCddLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPj0gMSAmJlxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAobnVtYmVyICUgMTAwIDwgMTAgfHwgbnVtYmVyICUgMTAwID49IDIwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XSxcbiAgICAgICAgICAgICAgICB3b3JkO1xuXG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JyAmJiB3aXRob3V0U3VmZml4KSByZXR1cm4gJ9GY0LXQtNC90LAg0LPQvtC00LjQvdCwJztcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JkID0gdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5eScgJiYgd2l0aG91dFN1ZmZpeCAmJiB3b3JkID09PSAn0LPQvtC00LjQvdGDJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINCz0L7QtNC40L3QsCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyB3b3JkO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgc3JDeXJsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3ItY3lybCcsIHtcbiAgICAgICAgbW9udGhzOiAn0ZjQsNC90YPQsNGAX9GE0LXQsdGA0YPQsNGAX9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCx0LDRgF/QvtC60YLQvtCx0LDRgF/QvdC+0LLQtdC80LHQsNGAX9C00LXRhtC10LzQsdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9GY0LDQvS5f0YTQtdCxLl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCzLl/RgdC10L8uX9C+0LrRgi5f0L3QvtCyLl/QtNC10YYuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10ZnQsF/Qv9C+0L3QtdC00LXRmdCw0Lpf0YPRgtC+0YDQsNC6X9GB0YDQtdC00LBf0YfQtdGC0LLRgNGC0LDQul/Qv9C10YLQsNC6X9GB0YPQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtC5f0L/QvtC9Ll/Rg9GC0L4uX9GB0YDQtS5f0YfQtdGCLl/Qv9C10YIuX9GB0YPQsS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtV/Qv9C+X9GD0YJf0YHRgF/Rh9C1X9C/0LVf0YHRgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuIE0uIFlZWVkuJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZLicsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9C00LDQvdCw0YEg0YNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0YHRg9GC0YDQsCDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvQvdC10LTQtdGZ0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YDQtdC00YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YPQsdC+0YLRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBkZGRkIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9GY0YPRh9C1INGDXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0L3QtdC00LXRmdC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0L7QvdC10LTQtdGZ0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRg9GC0L7RgNC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YDQtdC00LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0YfQtdGC0LLRgNGC0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvQv9C10YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvRgdGD0LHQvtGC0LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtSAlcycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60L7Qu9C40LrQviDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNyQ3lybDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3322\n")},3508:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Basque [eu]\n//! author : Eneko Illarramendi : https://github.com/eillarra\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var eu = moment.defineLocale('eu', {\n months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(\n '_'\n ),\n monthsShort:\n 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays:\n 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(\n '_'\n ),\n weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),\n weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: 'YYYY[ko] MMMM[ren] D[a]',\n LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',\n LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',\n l: 'YYYY-M-D',\n ll: 'YYYY[ko] MMM D[a]',\n lll: 'YYYY[ko] MMM D[a] HH:mm',\n llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',\n },\n calendar: {\n sameDay: '[gaur] LT[etan]',\n nextDay: '[bihar] LT[etan]',\n nextWeek: 'dddd LT[etan]',\n lastDay: '[atzo] LT[etan]',\n lastWeek: '[aurreko] dddd LT[etan]',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s barru',\n past: 'duela %s',\n s: 'segundo batzuk',\n ss: '%d segundo',\n m: 'minutu bat',\n mm: '%d minutu',\n h: 'ordu bat',\n hh: '%d ordu',\n d: 'egun bat',\n dd: '%d egun',\n M: 'hilabete bat',\n MM: '%d hilabete',\n y: 'urte bat',\n yy: '%d urte',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return eu;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUwOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qcz8wZmYyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCYXNxdWUgW2V1XVxuLy8hIGF1dGhvciA6IEVuZWtvIElsbGFycmFtZW5kaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9laWxsYXJyYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGV1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXUnLCB7XG4gICAgICAgIG1vbnRoczogJ3VydGFycmlsYV9vdHNhaWxhX21hcnR4b2FfYXBpcmlsYV9tYWlhdHphX2VrYWluYV91enRhaWxhX2FidXp0dWFfaXJhaWxhX3VycmlhX2F6YXJvYV9hYmVuZHVhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICd1cnQuX290cy5fbWFyLl9hcGkuX21haS5fZWthLl91enQuX2FidS5faXJhLl91cnIuX2F6YS5fYWJlLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdpZ2FuZGVhX2FzdGVsZWhlbmFfYXN0ZWFydGVhX2FzdGVhemtlbmFfb3N0ZWd1bmFfb3N0aXJhbGFfbGFydW5iYXRhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdpZy5fYWwuX2FyLl9hei5fb2cuX29sLl9sci4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnaWdfYWxfYXJfYXpfb2dfb2xfbHInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgWVlZWVtrb10gTU1NTVtyZW5dIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVktTS1EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWVtrb10gTU1NIERbYV0nLFxuICAgICAgICAgICAgbGxsOiAnWVlZWVtrb10gTU1NIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgWVlZWVtrb10gTU1NIERbYV0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tnYXVyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2JpaGFyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFRbZXRhbl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1thdHpvXSBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thdXJyZWtvXSBkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgYmFycnUnLFxuICAgICAgICAgICAgcGFzdDogJ2R1ZWxhICVzJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmRvIGJhdHp1aycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbTogJ21pbnV0dSBiYXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHUnLFxuICAgICAgICAgICAgaDogJ29yZHUgYmF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JkdScsXG4gICAgICAgICAgICBkOiAnZWd1biBiYXQnLFxuICAgICAgICAgICAgZGQ6ICclZCBlZ3VuJyxcbiAgICAgICAgICAgIE06ICdoaWxhYmV0ZSBiYXQnLFxuICAgICAgICAgICAgTU06ICclZCBoaWxhYmV0ZScsXG4gICAgICAgICAgICB5OiAndXJ0ZSBiYXQnLFxuICAgICAgICAgICAgeXk6ICclZCB1cnRlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBldTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3508\n")},4146:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar reactIs = __webpack_require__(73404);\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzP2RhNmEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4146\n")},4265:(I,g,n)=>{"use strict";I.exports=n.p+"19f639343496e166a37e.png"},4417:module=>{"use strict";eval('\n\nmodule.exports = function (url, options) {\n if (!options) {\n // eslint-disable-next-line no-param-reassign\n options = {};\n } // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n\n\n url = url && url.__esModule ? url.default : url;\n\n if (typeof url !== "string") {\n return url;\n } // If url is already wrapped in quotes, remove them\n\n\n if (/^[\'"].*[\'"]$/.test(url)) {\n // eslint-disable-next-line no-param-reassign\n url = url.slice(1, -1);\n }\n\n if (options.hash) {\n // eslint-disable-next-line no-param-reassign\n url += options.hash;\n } // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n\n\n if (/["\'() \\t\\n]/.test(url) || options.needQuotes) {\n return "\\"".concat(url.replace(/"/g, \'\\\\"\').replace(/\\n/g, "\\\\n"), "\\"");\n }\n\n return url;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQxNy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcz8xZGU1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgb3B0aW9ucyA9IHt9O1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSwgbm8tcGFyYW0tcmVhc3NpZ25cblxuXG4gIHVybCA9IHVybCAmJiB1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsO1xuXG4gIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfSAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cblxuXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfSAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG5cblxuICBpZiAoL1tcIicoKSBcXHRcXG5dLy50ZXN0KHVybCkgfHwgb3B0aW9ucy5uZWVkUXVvdGVzKSB7XG4gICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdCh1cmwucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLCBcIlxcXCJcIik7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4417\n')},4522:(I,g,n)=>{"use strict";I.exports=n.p+"64918220967d8ddaf426.png"},4565:(I,g,n)=>{"use strict";I.exports=n.p+"3d0f0af9a84fc86da124.png"},5209:(I,g,n)=>{"use strict";I.exports=n.p+"02b192017637f8e379e0.png"},5449:module=>{"use strict";eval("\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n };\n return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ0OS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2VuaGFuY2VFcnJvci5qcz8zODdmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cblxuICBlcnJvci5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgZXJyb3IuaXNBeGlvc0Vycm9yID0gdHJ1ZTtcblxuICBlcnJvci50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB0aGlzLnJlc3BvbnNlLnN0YXR1cyA6IG51bGxcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5449\n")},5531:(I,g,n)=>{"use strict";I.exports=n.p+"90dc7c772b95808091f5.png"},5556:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (false) // removed by dead control flow\n{ var throwOnDirectAccess, ReactIs; } else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = __webpack_require__(2694)();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1Ni5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanM/ZDdiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5556\n")},5784:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Slovak [sk]\n//! author : Martin Minka : https://github.com/k2s\n//! based on work of petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months =\n 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(\n '_'\n ),\n monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');\n function plural(n) {\n return n > 1 && n < 5;\n }\n function translate(number, withoutSuffix, key, isFuture) {\n var result = number + ' ';\n switch (key) {\n case 's': // a few seconds / in a few seconds / a few seconds ago\n return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';\n case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'sekundy' : 'sekúnd');\n } else {\n return result + 'sekundami';\n }\n case 'm': // a minute / in a minute / a minute ago\n return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';\n case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'minúty' : 'minút');\n } else {\n return result + 'minútami';\n }\n case 'h': // an hour / in an hour / an hour ago\n return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n case 'hh': // 9 hours / in 9 hours / 9 hours ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'hodiny' : 'hodín');\n } else {\n return result + 'hodinami';\n }\n case 'd': // a day / in a day / a day ago\n return withoutSuffix || isFuture ? 'deň' : 'dňom';\n case 'dd': // 9 days / in 9 days / 9 days ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'dni' : 'dní');\n } else {\n return result + 'dňami';\n }\n case 'M': // a month / in a month / a month ago\n return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';\n case 'MM': // 9 months / in 9 months / 9 months ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'mesiace' : 'mesiacov');\n } else {\n return result + 'mesiacmi';\n }\n case 'y': // a year / in a year / a year ago\n return withoutSuffix || isFuture ? 'rok' : 'rokom';\n case 'yy': // 9 years / in 9 years / 9 years ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'roky' : 'rokov');\n } else {\n return result + 'rokmi';\n }\n }\n }\n\n var sk = moment.defineLocale('sk', {\n months: months,\n monthsShort: monthsShort,\n weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),\n weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),\n weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd D. MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[dnes o] LT',\n nextDay: '[zajtra o] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[v nedeľu o] LT';\n case 1:\n case 2:\n return '[v] dddd [o] LT';\n case 3:\n return '[v stredu o] LT';\n case 4:\n return '[vo štvrtok o] LT';\n case 5:\n return '[v piatok o] LT';\n case 6:\n return '[v sobotu o] LT';\n }\n },\n lastDay: '[včera o] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n return '[minulú nedeľu o] LT';\n case 1:\n case 2:\n return '[minulý] dddd [o] LT';\n case 3:\n return '[minulú stredu o] LT';\n case 4:\n case 5:\n return '[minulý] dddd [o] LT';\n case 6:\n return '[minulú sobotu o] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'pred %s',\n s: translate,\n ss: translate,\n m: translate,\n mm: translate,\n h: translate,\n hh: translate,\n d: translate,\n dd: translate,\n M: translate,\n MM: translate,\n y: translate,\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return sk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc4NC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanM/N2JlNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2xvdmFrIFtza11cbi8vISBhdXRob3IgOiBNYXJ0aW4gTWlua2EgOiBodHRwczovL2dpdGh1Yi5jb20vazJzXG4vLyEgYmFzZWQgb24gd29yayBvZiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9XG4gICAgICAgICAgICAnamFudcOhcl9mZWJydcOhcl9tYXJlY19hcHLDrWxfbcOhal9qw7puX2rDumxfYXVndXN0X3NlcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdqYW5fZmViX21hcl9hcHJfbcOhal9qw7puX2rDumxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gbiA+IDEgJiYgbiA8IDU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOiAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncMOhciBzZWvDum5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla8O6bmQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla3VuZGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbSc6IC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW7DunRhJyA6IGlzRnV0dXJlID8gJ21pbsO6dHUnIDogJ21pbsO6dG91JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzogLy8gOSBtaW51dGVzIC8gaW4gOSBtaW51dGVzIC8gOSBtaW51dGVzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWluw7p0eScgOiAnbWluw7p0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW7DunRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2gnOiAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IGlzRnV0dXJlID8gJ2hvZGludScgOiAnaG9kaW5vdSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6IC8vIDkgaG91cnMgLyBpbiA5IGhvdXJzIC8gOSBob3VycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2hvZGlueScgOiAnaG9kw61uJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZCc6IC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkZcWIJyA6ICdkxYhvbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6IC8vIDkgZGF5cyAvIGluIDkgZGF5cyAvIDkgZGF5cyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2RuaScgOiAnZG7DrScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZMWIYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdNJzogLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2lhYycgOiAnbWVzaWFjb20nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOiAvLyA5IG1vbnRocyAvIGluIDkgbW9udGhzIC8gOSBtb250aHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtZXNpYWNlJyA6ICdtZXNpYWNvdicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWVzaWFjbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tvbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ3Jva292Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdyb2ttaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2snLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZcS+YV9wb25kZWxva191dG9yb2tfc3RyZWRhX8WhdHZydG9rX3BpYXRva19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3RfxaF0X3BpX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbemFqdHJhIG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZvIMWhdHZydG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBwaWF0b2sgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNrO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5784\n")},6062:(I,g,n)=>{"use strict";I.exports=n.p+"7baba4ad51af0ec74705.png"},6181:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Northern Kurdish [ku-kmr]\n//! authors : Mazlum Özdogan : https://github.com/mergehez\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(num, withoutSuffix, key, isFuture) {\n var format = {\n s: ['çend sanîye', 'çend sanîyeyan'],\n ss: [num + ' sanîye', num + ' sanîyeyan'],\n m: ['deqîqeyek', 'deqîqeyekê'],\n mm: [num + ' deqîqe', num + ' deqîqeyan'],\n h: ['saetek', 'saetekê'],\n hh: [num + ' saet', num + ' saetan'],\n d: ['rojek', 'rojekê'],\n dd: [num + ' roj', num + ' rojan'],\n w: ['hefteyek', 'hefteyekê'],\n ww: [num + ' hefte', num + ' hefteyan'],\n M: ['mehek', 'mehekê'],\n MM: [num + ' meh', num + ' mehan'],\n y: ['salek', 'salekê'],\n yy: [num + ' sal', num + ' salan'],\n };\n return withoutSuffix ? format[key][0] : format[key][1];\n }\n // function obliqueNumSuffix(num) {\n // if(num.includes(':'))\n // num = parseInt(num.split(':')[0]);\n // else\n // num = parseInt(num);\n // return num == 0 || num % 10 == 1 ? 'ê'\n // : (num > 10 && num % 10 == 0 ? 'î' : 'an');\n // }\n function ezafeNumSuffix(num) {\n num = '' + num;\n var l = num.substring(num.length - 1),\n ll = num.length > 1 ? num.substring(num.length - 2) : '';\n if (\n !(ll == 12 || ll == 13) &&\n (l == '2' || l == '3' || ll == '50' || l == '70' || l == '80')\n )\n return 'yê';\n return 'ê';\n }\n\n var kuKmr = moment.defineLocale('ku-kmr', {\n // According to the spelling rules defined by the work group of Weqfa Mezopotamyayê (Mesopotamia Foundation)\n // this should be: 'Kanûna Paşîn_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Çirîya Pêşîn_Çirîya Paşîn_Kanûna Pêşîn'\n // But the names below are more well known and handy\n months: 'Rêbendan_Sibat_Adar_Nîsan_Gulan_Hezîran_Tîrmeh_Tebax_Îlon_Cotmeh_Mijdar_Berfanbar'.split(\n '_'\n ),\n monthsShort: 'Rêb_Sib_Ada_Nîs_Gul_Hez_Tîr_Teb_Îlo_Cot_Mij_Ber'.split('_'),\n monthsParseExact: true,\n weekdays: 'Yekşem_Duşem_Sêşem_Çarşem_Pêncşem_În_Şemî'.split('_'),\n weekdaysShort: 'Yek_Du_Sê_Çar_Pên_În_Şem'.split('_'),\n weekdaysMin: 'Ye_Du_Sê_Ça_Pê_În_Şe'.split('_'),\n meridiem: function (hours, minutes, isLower) {\n if (hours < 12) {\n return isLower ? 'bn' : 'BN';\n } else {\n return isLower ? 'pn' : 'PN';\n }\n },\n meridiemParse: /bn|BN|pn|PN/,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'Do MMMM[a] YYYY[an]',\n LLL: 'Do MMMM[a] YYYY[an] HH:mm',\n LLLL: 'dddd, Do MMMM[a] YYYY[an] HH:mm',\n ll: 'Do MMM[.] YYYY[an]',\n lll: 'Do MMM[.] YYYY[an] HH:mm',\n llll: 'ddd[.], Do MMM[.] YYYY[an] HH:mm',\n },\n calendar: {\n sameDay: '[Îro di saet] LT [de]',\n nextDay: '[Sibê di saet] LT [de]',\n nextWeek: 'dddd [di saet] LT [de]',\n lastDay: '[Duh di saet] LT [de]',\n lastWeek: 'dddd[a borî di saet] LT [de]',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'di %s de',\n past: 'berî %s',\n s: processRelativeTime,\n ss: processRelativeTime,\n m: processRelativeTime,\n mm: processRelativeTime,\n h: processRelativeTime,\n hh: processRelativeTime,\n d: processRelativeTime,\n dd: processRelativeTime,\n w: processRelativeTime,\n ww: processRelativeTime,\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(?:yê|ê|\\.)/,\n ordinal: function (num, period) {\n var p = period.toLowerCase();\n if (p.includes('w') || p.includes('m')) return num + '.';\n\n return num + ezafeNumSuffix(num);\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return kuKmr;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE4MS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LWttci5qcz83NTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J0aGVybiBLdXJkaXNoIFtrdS1rbXJdXG4vLyEgYXV0aG9ycyA6IE1hemx1bSDDlnpkb2dhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZXJnZWhlelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW0sIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsnw6dlbmQgc2Fuw655ZScsICfDp2VuZCBzYW7DrnlleWFuJ10sXG4gICAgICAgICAgICBzczogW251bSArICcgc2Fuw655ZScsIG51bSArICcgc2Fuw655ZXlhbiddLFxuICAgICAgICAgICAgbTogWydkZXHDrnFleWVrJywgJ2RlccOucWV5ZWvDqiddLFxuICAgICAgICAgICAgbW06IFtudW0gKyAnIGRlccOucWUnLCBudW0gKyAnIGRlccOucWV5YW4nXSxcbiAgICAgICAgICAgIGg6IFsnc2FldGVrJywgJ3NhZXRla8OqJ10sXG4gICAgICAgICAgICBoaDogW251bSArICcgc2FldCcsIG51bSArICcgc2FldGFuJ10sXG4gICAgICAgICAgICBkOiBbJ3JvamVrJywgJ3JvamVrw6onXSxcbiAgICAgICAgICAgIGRkOiBbbnVtICsgJyByb2onLCBudW0gKyAnIHJvamFuJ10sXG4gICAgICAgICAgICB3OiBbJ2hlZnRleWVrJywgJ2hlZnRleWVrw6onXSxcbiAgICAgICAgICAgIHd3OiBbbnVtICsgJyBoZWZ0ZScsIG51bSArICcgaGVmdGV5YW4nXSxcbiAgICAgICAgICAgIE06IFsnbWVoZWsnLCAnbWVoZWvDqiddLFxuICAgICAgICAgICAgTU06IFtudW0gKyAnIG1laCcsIG51bSArICcgbWVoYW4nXSxcbiAgICAgICAgICAgIHk6IFsnc2FsZWsnLCAnc2FsZWvDqiddLFxuICAgICAgICAgICAgeXk6IFtudW0gKyAnIHNhbCcsIG51bSArICcgc2FsYW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cbiAgICAvLyBmdW5jdGlvbiBvYmxpcXVlTnVtU3VmZml4KG51bSkge1xuICAgIC8vICAgICBpZihudW0uaW5jbHVkZXMoJzonKSlcbiAgICAvLyAgICAgICAgIG51bSA9IHBhcnNlSW50KG51bS5zcGxpdCgnOicpWzBdKTtcbiAgICAvLyAgICAgZWxzZVxuICAgIC8vICAgICAgICAgbnVtID0gcGFyc2VJbnQobnVtKTtcbiAgICAvLyAgICAgcmV0dXJuIG51bSA9PSAwIHx8IG51bSAlIDEwID09IDEgPyAnw6onXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOiAobnVtID4gMTAgJiYgbnVtICUgMTAgPT0gMCA/ICfDricgOiAnYW4nKTtcbiAgICAvLyB9XG4gICAgZnVuY3Rpb24gZXphZmVOdW1TdWZmaXgobnVtKSB7XG4gICAgICAgIG51bSA9ICcnICsgbnVtO1xuICAgICAgICB2YXIgbCA9IG51bS5zdWJzdHJpbmcobnVtLmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgbGwgPSBudW0ubGVuZ3RoID4gMSA/IG51bS5zdWJzdHJpbmcobnVtLmxlbmd0aCAtIDIpIDogJyc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEobGwgPT0gMTIgfHwgbGwgPT0gMTMpICYmXG4gICAgICAgICAgICAobCA9PSAnMicgfHwgbCA9PSAnMycgfHwgbGwgPT0gJzUwJyB8fCBsID09ICc3MCcgfHwgbCA9PSAnODAnKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJ3nDqic7XG4gICAgICAgIHJldHVybiAnw6onO1xuICAgIH1cblxuICAgIHZhciBrdUttciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2t1LWttcicsIHtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVsbGluZyBydWxlcyBkZWZpbmVkIGJ5IHRoZSB3b3JrIGdyb3VwIG9mIFdlcWZhIE1lem9wb3RhbXlhecOqIChNZXNvcG90YW1pYSBGb3VuZGF0aW9uKVxuICAgICAgICAvLyB0aGlzIHNob3VsZCBiZTogJ0thbsO7bmEgUGHFn8Oubl9TaWJhdF9BZGFyX07DrnNhbl9HdWxhbl9IZXrDrnJhbl9Uw65ybWVoX1RlYmF4X8OObG9uX8OHaXLDrnlhIFDDqsWfw65uX8OHaXLDrnlhIFBhxZ/Drm5fS2Fuw7tuYSBQw6rFn8OubidcbiAgICAgICAgLy8gQnV0IHRoZSBuYW1lcyBiZWxvdyBhcmUgbW9yZSB3ZWxsIGtub3duIGFuZCBoYW5keVxuICAgICAgICBtb250aHM6ICdSw6piZW5kYW5fU2liYXRfQWRhcl9Ow65zYW5fR3VsYW5fSGV6w65yYW5fVMOucm1laF9UZWJheF/Djmxvbl9Db3RtZWhfTWlqZGFyX0JlcmZhbmJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdSw6piX1NpYl9BZGFfTsOuc19HdWxfSGV6X1TDrnJfVGViX8OObG9fQ290X01pal9CZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnWWVrxZ9lbV9EdcWfZW1fU8OqxZ9lbV/Dh2FyxZ9lbV9Qw6puY8WfZW1fw45uX8WeZW3Dricuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1lla19EdV9Tw6pfw4dhcl9Qw6puX8OObl/FnmVtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1llX0R1X1PDql/Dh2FfUMOqX8OObl/FnmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYm4nIDogJ0JOJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG4nIDogJ1BOJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2JufEJOfHBufFBOLyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEbyBNTU1NW2FdIFlZWVlbYW5dJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU1bYV0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIERvIE1NTU1bYV0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgbGw6ICdEbyBNTU1bLl0gWVlZWVthbl0nLFxuICAgICAgICAgICAgbGxsOiAnRG8gTU1NWy5dIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGRbLl0sIERvIE1NTVsuXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8OOcm8gZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1NpYsOqIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRHVoIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkW2EgYm9yw64gZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RpICVzIGRlJyxcbiAgICAgICAgICAgIHBhc3Q6ICdiZXLDriAlcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSg/OnnDqnzDqnxcXC4pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bSwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHBlcmlvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ3cnKSB8fCBwLmluY2x1ZGVzKCdtJykpIHJldHVybiBudW0gKyAnLic7XG5cbiAgICAgICAgICAgIHJldHVybiBudW0gKyBlemFmZU51bVN1ZmZpeChudW0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga3VLbXI7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6181\n")},6340:(I,g,n)=>{"use strict";I.exports=n.p+"dbb54d922122179ebbb5.png"},6372:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/** @preserve\n\t * Counter block mode compatible with Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher\n\t var blockSize = cipher.blockSize;\n\t var iv = this._iv;\n\t var counter = this._counter;\n\n\t // Generate keystream\n\t if (iv) {\n\t counter = this._counter = iv.slice(0);\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t cipher.encryptBlock(keystream, 0);\n\n\t // Encrypt\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= keystream[i];\n\t }\n\t }\n\t });\n\n\t CTRGladman.Decryptor = Encryptor;\n\n\t return CTRGladman;\n\t}());\n\n\n\n\n\treturn CryptoJS.mode.CTRGladman;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM3Mi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL21vZGUtY3RyLWdsYWRtYW4uanM/YWFlZiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKiBAcHJlc2VydmVcblx0ICogQ291bnRlciBibG9jayBtb2RlIGNvbXBhdGlibGUgd2l0aCAgRHIgQnJpYW4gR2xhZG1hbiBmaWxlZW5jLmNcblx0ICogZGVyaXZlZCBmcm9tIENyeXB0b0pTLm1vZGUuQ1RSXG5cdCAqIEphbiBIcnVieSBqaHJ1Ynkud2ViQGdtYWlsLmNvbVxuXHQgKi9cblx0Q3J5cHRvSlMubW9kZS5DVFJHbGFkbWFuID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBDVFJHbGFkbWFuID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHRcdGZ1bmN0aW9uIGluY1dvcmQod29yZClcblx0XHR7XG5cdFx0XHRpZiAoKCh3b3JkID4+IDI0KSAmIDB4ZmYpID09PSAweGZmKSB7IC8vb3ZlcmZsb3dcblx0XHRcdHZhciBiMSA9ICh3b3JkID4+IDE2KSYweGZmO1xuXHRcdFx0dmFyIGIyID0gKHdvcmQgPj4gOCkmMHhmZjtcblx0XHRcdHZhciBiMyA9IHdvcmQgJiAweGZmO1xuXG5cdFx0XHRpZiAoYjEgPT09IDB4ZmYpIC8vIG92ZXJmbG93IGIxXG5cdFx0XHR7XG5cdFx0XHRiMSA9IDA7XG5cdFx0XHRpZiAoYjIgPT09IDB4ZmYpXG5cdFx0XHR7XG5cdFx0XHRcdGIyID0gMDtcblx0XHRcdFx0aWYgKGIzID09PSAweGZmKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YjMgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdCsrYjM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0KytiMjtcblx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdCsrYjE7XG5cdFx0XHR9XG5cblx0XHRcdHdvcmQgPSAwO1xuXHRcdFx0d29yZCArPSAoYjEgPDwgMTYpO1xuXHRcdFx0d29yZCArPSAoYjIgPDwgOCk7XG5cdFx0XHR3b3JkICs9IGIzO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0d29yZCArPSAoMHgwMSA8PCAyNCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gd29yZDtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpbmNDb3VudGVyKGNvdW50ZXIpXG5cdFx0e1xuXHRcdFx0aWYgKChjb3VudGVyWzBdID0gaW5jV29yZChjb3VudGVyWzBdKSkgPT09IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGVuY3JfZGF0YSBpbiBmaWxlZW5jLmMgZnJvbSAgRHIgQnJpYW4gR2xhZG1hbidzIGNvdW50cyBvbmx5IHdpdGggRFdPUkQgaiA8IDhcblx0XHRcdFx0Y291bnRlclsxXSA9IGluY1dvcmQoY291bnRlclsxXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY291bnRlcjtcblx0XHR9XG5cblx0ICAgIHZhciBFbmNyeXB0b3IgPSBDVFJHbGFkbWFuLkVuY3J5cHRvciA9IENUUkdsYWRtYW4uZXh0ZW5kKHtcblx0ICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyXG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblx0ICAgICAgICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyO1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleXN0cmVhbVxuXHQgICAgICAgICAgICBpZiAoaXYpIHtcblx0ICAgICAgICAgICAgICAgIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyID0gaXYuc2xpY2UoMCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICB9XG5cblx0XHRcdFx0aW5jQ291bnRlcihjb3VudGVyKTtcblxuXHRcdFx0XHR2YXIga2V5c3RyZWFtID0gY291bnRlci5zbGljZSgwKTtcblx0ICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApO1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIENUUkdsYWRtYW4uRGVjcnlwdG9yID0gRW5jcnlwdG9yO1xuXG5cdCAgICByZXR1cm4gQ1RSR2xhZG1hbjtcblx0fSgpKTtcblxuXG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMubW9kZS5DVFJHbGFkbWFuO1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6372\n")},6373:(I,g,n)=>{"use strict";I.exports=n.p+"8c37c256a0d0d69b7cfc.png"},6440:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Check if typed arrays are supported\n\t if (typeof ArrayBuffer != 'function') {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\n\t // Reference original init\n\t var superInit = WordArray.init;\n\n\t // Augment WordArray.init to handle typed arrays\n\t var subInit = WordArray.init = function (typedArray) {\n\t // Convert buffers to uint8\n\t if (typedArray instanceof ArrayBuffer) {\n\t typedArray = new Uint8Array(typedArray);\n\t }\n\n\t // Convert other array views to uint8\n\t if (\n\t typedArray instanceof Int8Array ||\n\t (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t typedArray instanceof Int16Array ||\n\t typedArray instanceof Uint16Array ||\n\t typedArray instanceof Int32Array ||\n\t typedArray instanceof Uint32Array ||\n\t typedArray instanceof Float32Array ||\n\t typedArray instanceof Float64Array\n\t ) {\n\t typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t }\n\n\t // Handle Uint8Array\n\t if (typedArray instanceof Uint8Array) {\n\t // Shortcut\n\t var typedArrayByteLength = typedArray.byteLength;\n\n\t // Extract bytes\n\t var words = [];\n\t for (var i = 0; i < typedArrayByteLength; i++) {\n\t words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t }\n\n\t // Initialize this word array\n\t superInit.call(this, words, typedArrayByteLength);\n\t } else {\n\t // Else call normal init\n\t superInit.apply(this, arguments);\n\t }\n\t };\n\n\t subInit.prototype = WordArray;\n\t}());\n\n\n\treturn CryptoJS.lib.WordArray;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ0MC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9saWItdHlwZWRhcnJheXMuanM/MTdlMSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBDaGVjayBpZiB0eXBlZCBhcnJheXMgYXJlIHN1cHBvcnRlZFxuXHQgICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cblx0ICAgIC8vIFJlZmVyZW5jZSBvcmlnaW5hbCBpbml0XG5cdCAgICB2YXIgc3VwZXJJbml0ID0gV29yZEFycmF5LmluaXQ7XG5cblx0ICAgIC8vIEF1Z21lbnQgV29yZEFycmF5LmluaXQgdG8gaGFuZGxlIHR5cGVkIGFycmF5c1xuXHQgICAgdmFyIHN1YkluaXQgPSBXb3JkQXJyYXkuaW5pdCA9IGZ1bmN0aW9uICh0eXBlZEFycmF5KSB7XG5cdCAgICAgICAgLy8gQ29udmVydCBidWZmZXJzIHRvIHVpbnQ4XG5cdCAgICAgICAgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuXHQgICAgICAgICAgICB0eXBlZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodHlwZWRBcnJheSk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gQ29udmVydCBvdGhlciBhcnJheSB2aWV3cyB0byB1aW50OFxuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuXHQgICAgICAgICAgICAodHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkgfHxcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fFxuXHQgICAgICAgICAgICB0eXBlZEFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG5cdCAgICAgICAgICAgIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXlcblx0ICAgICAgICApIHtcblx0ICAgICAgICAgICAgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KHR5cGVkQXJyYXkuYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkuYnl0ZUxlbmd0aCk7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gSGFuZGxlIFVpbnQ4QXJyYXlcblx0ICAgICAgICBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIHR5cGVkQXJyYXlCeXRlTGVuZ3RoID0gdHlwZWRBcnJheS5ieXRlTGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIEV4dHJhY3QgYnl0ZXNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZWRBcnJheUJ5dGVMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gdHlwZWRBcnJheVtpXSA8PCAoMjQgLSAoaSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoaXMgd29yZCBhcnJheVxuXHQgICAgICAgICAgICBzdXBlckluaXQuY2FsbCh0aGlzLCB3b3JkcywgdHlwZWRBcnJheUJ5dGVMZW5ndGgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vIEVsc2UgY2FsbCBub3JtYWwgaW5pdFxuXHQgICAgICAgICAgICBzdXBlckluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICBzdWJJbml0LnByb3RvdHlwZSA9IFdvcmRBcnJheTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5saWIuV29yZEFycmF5O1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6440\n")},6897:(I,g,n)=>{"use strict";I.exports=n.p+"9a32c2fb41aed2e6a191.png"},6925:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkyNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcz81OWIwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6925\n")},6947:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic (Palestine) [ar-ps]\n//! author : Majd Al-Shihabi : https://github.com/majdal\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '١',\n 2: '٢',\n 3: '٣',\n 4: '٤',\n 5: '٥',\n 6: '٦',\n 7: '٧',\n 8: '٨',\n 9: '٩',\n 0: '٠',\n },\n numberMap = {\n '١': '1',\n '٢': '2',\n '٣': '3',\n '٤': '4',\n '٥': '5',\n '٦': '6',\n '٧': '7',\n '٨': '8',\n '٩': '9',\n '٠': '0',\n };\n\n var arPs = moment.defineLocale('ar-ps', {\n months: 'كانون الثاني_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_تشري الأوّل_تشرين الثاني_كانون الأوّل'.split(\n '_'\n ),\n monthsShort:\n 'ك٢_شباط_آذار_نيسان_أيّار_حزيران_تمّوز_آب_أيلول_ت١_ت٢_ك١'.split('_'),\n weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /ص|م/,\n isPM: function (input) {\n return 'م' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ص';\n } else {\n return 'م';\n }\n },\n calendar: {\n sameDay: '[اليوم على الساعة] LT',\n nextDay: '[غدا على الساعة] LT',\n nextWeek: 'dddd [على الساعة] LT',\n lastDay: '[أمس على الساعة] LT',\n lastWeek: 'dddd [على الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'في %s',\n past: 'منذ %s',\n s: 'ثوان',\n ss: '%d ثانية',\n m: 'دقيقة',\n mm: '%d دقائق',\n h: 'ساعة',\n hh: '%d ساعات',\n d: 'يوم',\n dd: '%d أيام',\n M: 'شهر',\n MM: '%d أشهر',\n y: 'سنة',\n yy: '%d سنوات',\n },\n preparse: function (string) {\n return string\n .replace(/[٣٤٥٦٧٨٩٠]/g, function (match) {\n return numberMap[match];\n })\n .split('') // reversed since negative lookbehind not supported everywhere\n .reverse()\n .join('')\n .replace(/[١٢](?![\\u062a\\u0643])/g, function (match) {\n return numberMap[match];\n })\n .split('')\n .reverse()\n .join('')\n .replace(/،/g, ',');\n },\n postformat: function (string) {\n return string\n .replace(/\\d/g, function (match) {\n return symbolMap[match];\n })\n .replace(/,/g, '،');\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return arPs;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk0Ny5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanM/NGM5OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChQYWxlc3RpbmUpIFthci1wc11cbi8vISBhdXRob3IgOiBNYWpkIEFsLVNoaWhhYmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWFqZGFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGFyUHMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1wcycsIHtcbiAgICAgICAgbW9udGhzOiAn2YPYp9mG2YjZhiDYp9mE2KvYp9mG2Ypf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/Yqti02LHZiiDYp9mE2KPZiNmR2YRf2KrYtNix2YrZhiDYp9mE2KvYp9mG2Ypf2YPYp9mG2YjZhiDYp9mE2KPZiNmR2YQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mD2aJf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/YqtmhX9iq2aJf2YPZoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKSAvLyByZXZlcnNlZCBzaW5jZSBuZWdhdGl2ZSBsb29rYmVoaW5kIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aJdKD8hW1xcdTA2MmFcXHUwNjQzXSkvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclBzO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6947\n")},6963:(I,g,n)=>{"use strict";I.exports=n.p+"7ccaa2b1799b2bed444c.png"},7018:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAxOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzP2M4YWYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7018\n")},7265:(I,g,n)=>{"use strict";I.exports=n.p+"3213adeb99448322ef87.png"},7306:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Catalan [ca]\n//! author : Juan G. Hurtado : https://github.com/juanghurtado\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ca = moment.defineLocale('ca', {\n months: {\n standalone:\n 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(\n '_'\n ),\n format: \"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre\".split(\n '_'\n ),\n isFormat: /D[oD]?(\\s)+MMMM/,\n },\n monthsShort:\n 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays:\n 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(\n '_'\n ),\n weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),\n weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM [de] YYYY',\n ll: 'D MMM YYYY',\n LLL: 'D MMMM [de] YYYY [a les] H:mm',\n lll: 'D MMM YYYY, H:mm',\n LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',\n llll: 'ddd D MMM YYYY, H:mm',\n },\n calendar: {\n sameDay: function () {\n return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n },\n nextDay: function () {\n return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n },\n nextWeek: function () {\n return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n },\n lastDay: function () {\n return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';\n },\n lastWeek: function () {\n return (\n '[el] dddd [passat a ' +\n (this.hours() !== 1 ? 'les' : 'la') +\n '] LT'\n );\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: \"d'aquí %s\",\n past: 'fa %s',\n s: 'uns segons',\n ss: '%d segons',\n m: 'un minut',\n mm: '%d minuts',\n h: 'una hora',\n hh: '%d hores',\n d: 'un dia',\n dd: '%d dies',\n M: 'un mes',\n MM: '%d mesos',\n y: 'un any',\n yy: '%d anys',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n ordinal: function (number, period) {\n var output =\n number === 1\n ? 'r'\n : number === 2\n ? 'n'\n : number === 3\n ? 'r'\n : number === 4\n ? 't'\n : 'è';\n if (period === 'w' || period === 'W') {\n output = 'a';\n }\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return ca;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMwNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanM/ZDcxNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2F0YWxhbiBbY2FdXG4vLyEgYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY2EnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuZXJfZmVicmVyX21hcsOnX2FicmlsX21haWdfanVueV9qdWxpb2xfYWdvc3Rfc2V0ZW1icmVfb2N0dWJyZV9ub3ZlbWJyZV9kZXNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGUgZ2VuZXJfZGUgZmVicmVyX2RlIG1hcsOnX2QnYWJyaWxfZGUgbWFpZ19kZSBqdW55X2RlIGp1bGlvbF9kJ2Fnb3N0X2RlIHNldGVtYnJlX2Qnb2N0dWJyZV9kZSBub3ZlbWJyZV9kZSBkZXNlbWJyZVwiLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxccykrTU1NTS8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2dlbi5fZmVici5fbWFyw6dfYWJyLl9tYWlnX2p1bnlfanVsLl9hZy5fc2V0Ll9vY3QuX25vdi5fZGVzLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdkaXVtZW5nZV9kaWxsdW5zX2RpbWFydHNfZGltZWNyZXNfZGlqb3VzX2RpdmVuZHJlc19kaXNzYWJ0ZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGcuX2RsLl9kdC5fZGMuX2RqLl9kdi5fZHMuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RnX2RsX2R0X2RjX2RqX2R2X2RzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBbZGVdIFlZWVkgW2EgbGVzXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1thdnVpIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tkZW3DoCBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2FoaXIgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNzYXQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5zIHNlZ29ucycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29ucycsXG4gICAgICAgICAgICBtOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHMnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpZXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc29zJyxcbiAgICAgICAgICAgIHk6ICd1biBhbnknLFxuICAgICAgICAgICAgeXk6ICclZCBhbnlzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7306\n")},7463:(__unused_webpack_module,exports)=>{"use strict";eval('/** @license React v0.20.2\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar f,g,h,k;if("object"===typeof performance&&"function"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}\nif("undefined"===typeof window||"function"!==typeof MessageChannel){var t=null,u=null,w=function(){if(null!==t)try{var a=exports.unstable_now();t(!0,a);t=null}catch(b){throw setTimeout(w,0),b;}};f=function(a){null!==t?setTimeout(f,0,a):(t=a,setTimeout(w,0))};g=function(a,b){u=setTimeout(a,b)};h=function(){clearTimeout(u)};exports.unstable_shouldYield=function(){return!1};k=exports.unstable_forceFrameRate=function(){}}else{var x=window.setTimeout,y=window.clearTimeout;if("undefined"!==typeof console){var z=\nwindow.cancelAnimationFrame;"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn\'t support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills");"function"!==typeof z&&console.error("This browser doesn\'t support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var A=!1,B=null,C=-1,D=5,E=0;exports.unstable_shouldYield=function(){return exports.unstable_now()>=\nE};k=function(){};exports.unstable_forceFrameRate=function(a){0>a||125>>1,e=a[d];if(void 0!==e&&0I(n,c))void 0!==r&&0>I(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>I(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function I(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var L=[],M=[],N=1,O=null,P=3,Q=!1,R=!1,S=!1;\nfunction T(a){for(var b=J(M);null!==b;){if(null===b.callback)K(M);else if(b.startTime<=a)K(M),b.sortIndex=b.expirationTime,H(L,b);else break;b=J(M)}}function U(a){S=!1;T(a);if(!R)if(null!==J(L))R=!0,f(V);else{var b=J(M);null!==b&&g(U,b.startTime-a)}}\nfunction V(a,b){R=!1;S&&(S=!1,h());Q=!0;var c=P;try{T(b);for(O=J(L);null!==O&&(!(O.expirationTime>b)||a&&!exports.unstable_shouldYield());){var d=O.callback;if("function"===typeof d){O.callback=null;P=O.priorityLevel;var e=d(O.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?O.callback=e:O===J(L)&&K(L);T(b)}else K(L);O=J(L)}if(null!==O)var m=!0;else{var n=J(M);null!==n&&g(U,n.startTime-b);m=!1}return m}finally{O=null,P=c,Q=!1}}var W=k;exports.unstable_IdlePriority=5;\nexports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){R||Q||(R=!0,f(V))};exports.unstable_getCurrentPriorityLevel=function(){return P};exports.unstable_getFirstCallbackNode=function(){return J(L)};\nexports.unstable_next=function(a){switch(P){case 1:case 2:case 3:var b=3;break;default:b=P}var c=P;P=b;try{return a()}finally{P=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=W;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=P;P=a;try{return b()}finally{P=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0d?(a.sortIndex=c,H(M,a),null===J(L)&&a===J(M)&&(S?h():S=!0,g(U,c-d))):(a.sortIndex=e,H(L,a),R||Q||(R=!0,f(V)));return a};\nexports.unstable_wrapCallback=function(a){var b=P;return function(){var c=P;P=b;try{return a.apply(this,arguments)}finally{P=c}}};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQ2My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanM/ZmIwNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZixnLGgsaztpZihcIm9iamVjdFwiPT09dHlwZW9mIHBlcmZvcm1hbmNlJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgcGVyZm9ybWFuY2Uubm93KXt2YXIgbD1wZXJmb3JtYW5jZTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpfX1lbHNle3ZhciBwPURhdGUscT1wLm5vdygpO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHAubm93KCktcX19XG5pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJmdW5jdGlvblwiIT09dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgdD1udWxsLHU9bnVsbCx3PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXQpdHJ5e3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7dCghMCxhKTt0PW51bGx9Y2F0Y2goYil7dGhyb3cgc2V0VGltZW91dCh3LDApLGI7fX07Zj1mdW5jdGlvbihhKXtudWxsIT09dD9zZXRUaW1lb3V0KGYsMCxhKToodD1hLHNldFRpbWVvdXQodywwKSl9O2c9ZnVuY3Rpb24oYSxiKXt1PXNldFRpbWVvdXQoYSxiKX07aD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh1KX07ZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3JldHVybiExfTtrPWV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oKXt9fWVsc2V7dmFyIHg9d2luZG93LnNldFRpbWVvdXQseT13aW5kb3cuY2xlYXJUaW1lb3V0O2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSl7dmFyIHo9XG53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XCJmdW5jdGlvblwiIT09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxsc1wiKTtcImZ1bmN0aW9uXCIhPT10eXBlb2YgeiYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgY2FuY2VsQW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHNcIil9dmFyIEE9ITEsQj1udWxsLEM9LTEsRD01LEU9MDtleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMudW5zdGFibGVfbm93KCk+PVxuRX07az1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbihhKXswPmF8fDEyNTxhP2NvbnNvbGUuZXJyb3IoXCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWRcIik6RD0wPGE/TWF0aC5mbG9vcigxRTMvYSk6NX07dmFyIEY9bmV3IE1lc3NhZ2VDaGFubmVsLEc9Ri5wb3J0MjtGLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbigpe2lmKG51bGwhPT1CKXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO0U9YStEO3RyeXtCKCEwLGEpP0cucG9zdE1lc3NhZ2UobnVsbCk6KEE9ITEsQj1udWxsKX1jYXRjaChiKXt0aHJvdyBHLnBvc3RNZXNzYWdlKG51bGwpLGI7fX1lbHNlIEE9ITF9O2Y9ZnVuY3Rpb24oYSl7Qj1hO0F8fChBPSEwLEcucG9zdE1lc3NhZ2UobnVsbCkpfTtnPWZ1bmN0aW9uKGEsYil7Qz1cbngoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX07aD1mdW5jdGlvbigpe3koQyk7Qz0tMX19ZnVuY3Rpb24gSChhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7Oyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYodm9pZCAwIT09ZSYmMDxJKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBKKGEpe2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9udWxsOmF9XG5mdW5jdGlvbiBLKGEpe3ZhciBiPWFbMF07aWYodm9pZCAwIT09Yil7dmFyIGM9YS5wb3AoKTtpZihjIT09Yil7YVswXT1jO2E6Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7KXt2YXIgbT0yKihkKzEpLTEsbj1hW21dLHY9bSsxLHI9YVt2XTtpZih2b2lkIDAhPT1uJiYwPkkobixjKSl2b2lkIDAhPT1yJiYwPkkocixuKT8oYVtkXT1yLGFbdl09YyxkPXYpOihhW2RdPW4sYVttXT1jLGQ9bSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYwPkkocixjKSlhW2RdPXIsYVt2XT1jLGQ9djtlbHNlIGJyZWFrIGF9fXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIEkoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9dmFyIEw9W10sTT1bXSxOPTEsTz1udWxsLFA9MyxRPSExLFI9ITEsUz0hMTtcbmZ1bmN0aW9uIFQoYSl7Zm9yKHZhciBiPUooTSk7bnVsbCE9PWI7KXtpZihudWxsPT09Yi5jYWxsYmFjaylLKE0pO2Vsc2UgaWYoYi5zdGFydFRpbWU8PWEpSyhNKSxiLnNvcnRJbmRleD1iLmV4cGlyYXRpb25UaW1lLEgoTCxiKTtlbHNlIGJyZWFrO2I9SihNKX19ZnVuY3Rpb24gVShhKXtTPSExO1QoYSk7aWYoIVIpaWYobnVsbCE9PUooTCkpUj0hMCxmKFYpO2Vsc2V7dmFyIGI9SihNKTtudWxsIT09YiYmZyhVLGIuc3RhcnRUaW1lLWEpfX1cbmZ1bmN0aW9uIFYoYSxiKXtSPSExO1MmJihTPSExLGgoKSk7UT0hMDt2YXIgYz1QO3RyeXtUKGIpO2ZvcihPPUooTCk7bnVsbCE9PU8mJighKE8uZXhwaXJhdGlvblRpbWU+Yil8fGEmJiFleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkKCkpOyl7dmFyIGQ9Ty5jYWxsYmFjaztpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7Ty5jYWxsYmFjaz1udWxsO1A9Ty5wcmlvcml0eUxldmVsO3ZhciBlPWQoTy5leHBpcmF0aW9uVGltZTw9Yik7Yj1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlP08uY2FsbGJhY2s9ZTpPPT09SihMKSYmSyhMKTtUKGIpfWVsc2UgSyhMKTtPPUooTCl9aWYobnVsbCE9PU8pdmFyIG09ITA7ZWxzZXt2YXIgbj1KKE0pO251bGwhPT1uJiZnKFUsbi5zdGFydFRpbWUtYik7bT0hMX1yZXR1cm4gbX1maW5hbGx5e089bnVsbCxQPWMsUT0hMX19dmFyIFc9aztleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtSfHxRfHwoUj0hMCxmKFYpKX07ZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBQfTtleHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIEooTCl9O1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChQKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj1QfXZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7UD1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9VztleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPVA7UD1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7UD1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOk4rKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLEgoTSxhKSxudWxsPT09SihMKSYmYT09PUooTSkmJihTP2goKTpTPSEwLGcoVSxjLWQpKSk6KGEuc29ydEluZGV4PWUsSChMLGEpLFJ8fFF8fChSPSEwLGYoVikpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1QO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtQPWN9fX07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7463\n')},7498:(I,g,n)=>{"use strict";I.exports=n.p+"1f94c3be1a48ce1fea59.png"},7522:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar createError = __webpack_require__(47763);\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUyMi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qcz80NjdmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi9jcmVhdGVFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QoY3JlYXRlRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgbnVsbCxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7522\n")},7628:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(80754), __webpack_require__(84636), __webpack_require__(39506), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Permuted Choice 1 constants\n\t var PC1 = [\n\t 57, 49, 41, 33, 25, 17, 9, 1,\n\t 58, 50, 42, 34, 26, 18, 10, 2,\n\t 59, 51, 43, 35, 27, 19, 11, 3,\n\t 60, 52, 44, 36, 63, 55, 47, 39,\n\t 31, 23, 15, 7, 62, 54, 46, 38,\n\t 30, 22, 14, 6, 61, 53, 45, 37,\n\t 29, 21, 13, 5, 28, 20, 12, 4\n\t ];\n\n\t // Permuted Choice 2 constants\n\t var PC2 = [\n\t 14, 17, 11, 24, 1, 5,\n\t 3, 28, 15, 6, 21, 10,\n\t 23, 19, 12, 4, 26, 8,\n\t 16, 7, 27, 20, 13, 2,\n\t 41, 52, 31, 37, 47, 55,\n\t 30, 40, 51, 45, 33, 48,\n\t 44, 49, 39, 56, 34, 53,\n\t 46, 42, 50, 36, 29, 32\n\t ];\n\n\t // Cumulative bit shift constants\n\t var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t // SBOXes and round permutation constants\n\t var SBOX_P = [\n\t {\n\t 0x0: 0x808200,\n\t 0x10000000: 0x8000,\n\t 0x20000000: 0x808002,\n\t 0x30000000: 0x2,\n\t 0x40000000: 0x200,\n\t 0x50000000: 0x808202,\n\t 0x60000000: 0x800202,\n\t 0x70000000: 0x800000,\n\t 0x80000000: 0x202,\n\t 0x90000000: 0x800200,\n\t 0xa0000000: 0x8200,\n\t 0xb0000000: 0x808000,\n\t 0xc0000000: 0x8002,\n\t 0xd0000000: 0x800002,\n\t 0xe0000000: 0x0,\n\t 0xf0000000: 0x8202,\n\t 0x8000000: 0x0,\n\t 0x18000000: 0x808202,\n\t 0x28000000: 0x8202,\n\t 0x38000000: 0x8000,\n\t 0x48000000: 0x808200,\n\t 0x58000000: 0x200,\n\t 0x68000000: 0x808002,\n\t 0x78000000: 0x2,\n\t 0x88000000: 0x800200,\n\t 0x98000000: 0x8200,\n\t 0xa8000000: 0x808000,\n\t 0xb8000000: 0x800202,\n\t 0xc8000000: 0x800002,\n\t 0xd8000000: 0x8002,\n\t 0xe8000000: 0x202,\n\t 0xf8000000: 0x800000,\n\t 0x1: 0x8000,\n\t 0x10000001: 0x2,\n\t 0x20000001: 0x808200,\n\t 0x30000001: 0x800000,\n\t 0x40000001: 0x808002,\n\t 0x50000001: 0x8200,\n\t 0x60000001: 0x200,\n\t 0x70000001: 0x800202,\n\t 0x80000001: 0x808202,\n\t 0x90000001: 0x808000,\n\t 0xa0000001: 0x800002,\n\t 0xb0000001: 0x8202,\n\t 0xc0000001: 0x202,\n\t 0xd0000001: 0x800200,\n\t 0xe0000001: 0x8002,\n\t 0xf0000001: 0x0,\n\t 0x8000001: 0x808202,\n\t 0x18000001: 0x808000,\n\t 0x28000001: 0x800000,\n\t 0x38000001: 0x200,\n\t 0x48000001: 0x8000,\n\t 0x58000001: 0x800002,\n\t 0x68000001: 0x2,\n\t 0x78000001: 0x8202,\n\t 0x88000001: 0x8002,\n\t 0x98000001: 0x800202,\n\t 0xa8000001: 0x202,\n\t 0xb8000001: 0x808200,\n\t 0xc8000001: 0x800200,\n\t 0xd8000001: 0x0,\n\t 0xe8000001: 0x8200,\n\t 0xf8000001: 0x808002\n\t },\n\t {\n\t 0x0: 0x40084010,\n\t 0x1000000: 0x4000,\n\t 0x2000000: 0x80000,\n\t 0x3000000: 0x40080010,\n\t 0x4000000: 0x40000010,\n\t 0x5000000: 0x40084000,\n\t 0x6000000: 0x40004000,\n\t 0x7000000: 0x10,\n\t 0x8000000: 0x84000,\n\t 0x9000000: 0x40004010,\n\t 0xa000000: 0x40000000,\n\t 0xb000000: 0x84010,\n\t 0xc000000: 0x80010,\n\t 0xd000000: 0x0,\n\t 0xe000000: 0x4010,\n\t 0xf000000: 0x40080000,\n\t 0x800000: 0x40004000,\n\t 0x1800000: 0x84010,\n\t 0x2800000: 0x10,\n\t 0x3800000: 0x40004010,\n\t 0x4800000: 0x40084010,\n\t 0x5800000: 0x40000000,\n\t 0x6800000: 0x80000,\n\t 0x7800000: 0x40080010,\n\t 0x8800000: 0x80010,\n\t 0x9800000: 0x0,\n\t 0xa800000: 0x4000,\n\t 0xb800000: 0x40080000,\n\t 0xc800000: 0x40000010,\n\t 0xd800000: 0x84000,\n\t 0xe800000: 0x40084000,\n\t 0xf800000: 0x4010,\n\t 0x10000000: 0x0,\n\t 0x11000000: 0x40080010,\n\t 0x12000000: 0x40004010,\n\t 0x13000000: 0x40084000,\n\t 0x14000000: 0x40080000,\n\t 0x15000000: 0x10,\n\t 0x16000000: 0x84010,\n\t 0x17000000: 0x4000,\n\t 0x18000000: 0x4010,\n\t 0x19000000: 0x80000,\n\t 0x1a000000: 0x80010,\n\t 0x1b000000: 0x40000010,\n\t 0x1c000000: 0x84000,\n\t 0x1d000000: 0x40004000,\n\t 0x1e000000: 0x40000000,\n\t 0x1f000000: 0x40084010,\n\t 0x10800000: 0x84010,\n\t 0x11800000: 0x80000,\n\t 0x12800000: 0x40080000,\n\t 0x13800000: 0x4000,\n\t 0x14800000: 0x40004000,\n\t 0x15800000: 0x40084010,\n\t 0x16800000: 0x10,\n\t 0x17800000: 0x40000000,\n\t 0x18800000: 0x40084000,\n\t 0x19800000: 0x40000010,\n\t 0x1a800000: 0x40004010,\n\t 0x1b800000: 0x80010,\n\t 0x1c800000: 0x0,\n\t 0x1d800000: 0x4010,\n\t 0x1e800000: 0x40080010,\n\t 0x1f800000: 0x84000\n\t },\n\t {\n\t 0x0: 0x104,\n\t 0x100000: 0x0,\n\t 0x200000: 0x4000100,\n\t 0x300000: 0x10104,\n\t 0x400000: 0x10004,\n\t 0x500000: 0x4000004,\n\t 0x600000: 0x4010104,\n\t 0x700000: 0x4010000,\n\t 0x800000: 0x4000000,\n\t 0x900000: 0x4010100,\n\t 0xa00000: 0x10100,\n\t 0xb00000: 0x4010004,\n\t 0xc00000: 0x4000104,\n\t 0xd00000: 0x10000,\n\t 0xe00000: 0x4,\n\t 0xf00000: 0x100,\n\t 0x80000: 0x4010100,\n\t 0x180000: 0x4010004,\n\t 0x280000: 0x0,\n\t 0x380000: 0x4000100,\n\t 0x480000: 0x4000004,\n\t 0x580000: 0x10000,\n\t 0x680000: 0x10004,\n\t 0x780000: 0x104,\n\t 0x880000: 0x4,\n\t 0x980000: 0x100,\n\t 0xa80000: 0x4010000,\n\t 0xb80000: 0x10104,\n\t 0xc80000: 0x10100,\n\t 0xd80000: 0x4000104,\n\t 0xe80000: 0x4010104,\n\t 0xf80000: 0x4000000,\n\t 0x1000000: 0x4010100,\n\t 0x1100000: 0x10004,\n\t 0x1200000: 0x10000,\n\t 0x1300000: 0x4000100,\n\t 0x1400000: 0x100,\n\t 0x1500000: 0x4010104,\n\t 0x1600000: 0x4000004,\n\t 0x1700000: 0x0,\n\t 0x1800000: 0x4000104,\n\t 0x1900000: 0x4000000,\n\t 0x1a00000: 0x4,\n\t 0x1b00000: 0x10100,\n\t 0x1c00000: 0x4010000,\n\t 0x1d00000: 0x104,\n\t 0x1e00000: 0x10104,\n\t 0x1f00000: 0x4010004,\n\t 0x1080000: 0x4000000,\n\t 0x1180000: 0x104,\n\t 0x1280000: 0x4010100,\n\t 0x1380000: 0x0,\n\t 0x1480000: 0x10004,\n\t 0x1580000: 0x4000100,\n\t 0x1680000: 0x100,\n\t 0x1780000: 0x4010004,\n\t 0x1880000: 0x10000,\n\t 0x1980000: 0x4010104,\n\t 0x1a80000: 0x10104,\n\t 0x1b80000: 0x4000004,\n\t 0x1c80000: 0x4000104,\n\t 0x1d80000: 0x4010000,\n\t 0x1e80000: 0x4,\n\t 0x1f80000: 0x10100\n\t },\n\t {\n\t 0x0: 0x80401000,\n\t 0x10000: 0x80001040,\n\t 0x20000: 0x401040,\n\t 0x30000: 0x80400000,\n\t 0x40000: 0x0,\n\t 0x50000: 0x401000,\n\t 0x60000: 0x80000040,\n\t 0x70000: 0x400040,\n\t 0x80000: 0x80000000,\n\t 0x90000: 0x400000,\n\t 0xa0000: 0x40,\n\t 0xb0000: 0x80001000,\n\t 0xc0000: 0x80400040,\n\t 0xd0000: 0x1040,\n\t 0xe0000: 0x1000,\n\t 0xf0000: 0x80401040,\n\t 0x8000: 0x80001040,\n\t 0x18000: 0x40,\n\t 0x28000: 0x80400040,\n\t 0x38000: 0x80001000,\n\t 0x48000: 0x401000,\n\t 0x58000: 0x80401040,\n\t 0x68000: 0x0,\n\t 0x78000: 0x80400000,\n\t 0x88000: 0x1000,\n\t 0x98000: 0x80401000,\n\t 0xa8000: 0x400000,\n\t 0xb8000: 0x1040,\n\t 0xc8000: 0x80000000,\n\t 0xd8000: 0x400040,\n\t 0xe8000: 0x401040,\n\t 0xf8000: 0x80000040,\n\t 0x100000: 0x400040,\n\t 0x110000: 0x401000,\n\t 0x120000: 0x80000040,\n\t 0x130000: 0x0,\n\t 0x140000: 0x1040,\n\t 0x150000: 0x80400040,\n\t 0x160000: 0x80401000,\n\t 0x170000: 0x80001040,\n\t 0x180000: 0x80401040,\n\t 0x190000: 0x80000000,\n\t 0x1a0000: 0x80400000,\n\t 0x1b0000: 0x401040,\n\t 0x1c0000: 0x80001000,\n\t 0x1d0000: 0x400000,\n\t 0x1e0000: 0x40,\n\t 0x1f0000: 0x1000,\n\t 0x108000: 0x80400000,\n\t 0x118000: 0x80401040,\n\t 0x128000: 0x0,\n\t 0x138000: 0x401000,\n\t 0x148000: 0x400040,\n\t 0x158000: 0x80000000,\n\t 0x168000: 0x80001040,\n\t 0x178000: 0x40,\n\t 0x188000: 0x80000040,\n\t 0x198000: 0x1000,\n\t 0x1a8000: 0x80001000,\n\t 0x1b8000: 0x80400040,\n\t 0x1c8000: 0x1040,\n\t 0x1d8000: 0x80401000,\n\t 0x1e8000: 0x400000,\n\t 0x1f8000: 0x401040\n\t },\n\t {\n\t 0x0: 0x80,\n\t 0x1000: 0x1040000,\n\t 0x2000: 0x40000,\n\t 0x3000: 0x20000000,\n\t 0x4000: 0x20040080,\n\t 0x5000: 0x1000080,\n\t 0x6000: 0x21000080,\n\t 0x7000: 0x40080,\n\t 0x8000: 0x1000000,\n\t 0x9000: 0x20040000,\n\t 0xa000: 0x20000080,\n\t 0xb000: 0x21040080,\n\t 0xc000: 0x21040000,\n\t 0xd000: 0x0,\n\t 0xe000: 0x1040080,\n\t 0xf000: 0x21000000,\n\t 0x800: 0x1040080,\n\t 0x1800: 0x21000080,\n\t 0x2800: 0x80,\n\t 0x3800: 0x1040000,\n\t 0x4800: 0x40000,\n\t 0x5800: 0x20040080,\n\t 0x6800: 0x21040000,\n\t 0x7800: 0x20000000,\n\t 0x8800: 0x20040000,\n\t 0x9800: 0x0,\n\t 0xa800: 0x21040080,\n\t 0xb800: 0x1000080,\n\t 0xc800: 0x20000080,\n\t 0xd800: 0x21000000,\n\t 0xe800: 0x1000000,\n\t 0xf800: 0x40080,\n\t 0x10000: 0x40000,\n\t 0x11000: 0x80,\n\t 0x12000: 0x20000000,\n\t 0x13000: 0x21000080,\n\t 0x14000: 0x1000080,\n\t 0x15000: 0x21040000,\n\t 0x16000: 0x20040080,\n\t 0x17000: 0x1000000,\n\t 0x18000: 0x21040080,\n\t 0x19000: 0x21000000,\n\t 0x1a000: 0x1040000,\n\t 0x1b000: 0x20040000,\n\t 0x1c000: 0x40080,\n\t 0x1d000: 0x20000080,\n\t 0x1e000: 0x0,\n\t 0x1f000: 0x1040080,\n\t 0x10800: 0x21000080,\n\t 0x11800: 0x1000000,\n\t 0x12800: 0x1040000,\n\t 0x13800: 0x20040080,\n\t 0x14800: 0x20000000,\n\t 0x15800: 0x1040080,\n\t 0x16800: 0x80,\n\t 0x17800: 0x21040000,\n\t 0x18800: 0x40080,\n\t 0x19800: 0x21040080,\n\t 0x1a800: 0x0,\n\t 0x1b800: 0x21000000,\n\t 0x1c800: 0x1000080,\n\t 0x1d800: 0x40000,\n\t 0x1e800: 0x20040000,\n\t 0x1f800: 0x20000080\n\t },\n\t {\n\t 0x0: 0x10000008,\n\t 0x100: 0x2000,\n\t 0x200: 0x10200000,\n\t 0x300: 0x10202008,\n\t 0x400: 0x10002000,\n\t 0x500: 0x200000,\n\t 0x600: 0x200008,\n\t 0x700: 0x10000000,\n\t 0x800: 0x0,\n\t 0x900: 0x10002008,\n\t 0xa00: 0x202000,\n\t 0xb00: 0x8,\n\t 0xc00: 0x10200008,\n\t 0xd00: 0x202008,\n\t 0xe00: 0x2008,\n\t 0xf00: 0x10202000,\n\t 0x80: 0x10200000,\n\t 0x180: 0x10202008,\n\t 0x280: 0x8,\n\t 0x380: 0x200000,\n\t 0x480: 0x202008,\n\t 0x580: 0x10000008,\n\t 0x680: 0x10002000,\n\t 0x780: 0x2008,\n\t 0x880: 0x200008,\n\t 0x980: 0x2000,\n\t 0xa80: 0x10002008,\n\t 0xb80: 0x10200008,\n\t 0xc80: 0x0,\n\t 0xd80: 0x10202000,\n\t 0xe80: 0x202000,\n\t 0xf80: 0x10000000,\n\t 0x1000: 0x10002000,\n\t 0x1100: 0x10200008,\n\t 0x1200: 0x10202008,\n\t 0x1300: 0x2008,\n\t 0x1400: 0x200000,\n\t 0x1500: 0x10000000,\n\t 0x1600: 0x10000008,\n\t 0x1700: 0x202000,\n\t 0x1800: 0x202008,\n\t 0x1900: 0x0,\n\t 0x1a00: 0x8,\n\t 0x1b00: 0x10200000,\n\t 0x1c00: 0x2000,\n\t 0x1d00: 0x10002008,\n\t 0x1e00: 0x10202000,\n\t 0x1f00: 0x200008,\n\t 0x1080: 0x8,\n\t 0x1180: 0x202000,\n\t 0x1280: 0x200000,\n\t 0x1380: 0x10000008,\n\t 0x1480: 0x10002000,\n\t 0x1580: 0x2008,\n\t 0x1680: 0x10202008,\n\t 0x1780: 0x10200000,\n\t 0x1880: 0x10202000,\n\t 0x1980: 0x10200008,\n\t 0x1a80: 0x2000,\n\t 0x1b80: 0x202008,\n\t 0x1c80: 0x200008,\n\t 0x1d80: 0x0,\n\t 0x1e80: 0x10000000,\n\t 0x1f80: 0x10002008\n\t },\n\t {\n\t 0x0: 0x100000,\n\t 0x10: 0x2000401,\n\t 0x20: 0x400,\n\t 0x30: 0x100401,\n\t 0x40: 0x2100401,\n\t 0x50: 0x0,\n\t 0x60: 0x1,\n\t 0x70: 0x2100001,\n\t 0x80: 0x2000400,\n\t 0x90: 0x100001,\n\t 0xa0: 0x2000001,\n\t 0xb0: 0x2100400,\n\t 0xc0: 0x2100000,\n\t 0xd0: 0x401,\n\t 0xe0: 0x100400,\n\t 0xf0: 0x2000000,\n\t 0x8: 0x2100001,\n\t 0x18: 0x0,\n\t 0x28: 0x2000401,\n\t 0x38: 0x2100400,\n\t 0x48: 0x100000,\n\t 0x58: 0x2000001,\n\t 0x68: 0x2000000,\n\t 0x78: 0x401,\n\t 0x88: 0x100401,\n\t 0x98: 0x2000400,\n\t 0xa8: 0x2100000,\n\t 0xb8: 0x100001,\n\t 0xc8: 0x400,\n\t 0xd8: 0x2100401,\n\t 0xe8: 0x1,\n\t 0xf8: 0x100400,\n\t 0x100: 0x2000000,\n\t 0x110: 0x100000,\n\t 0x120: 0x2000401,\n\t 0x130: 0x2100001,\n\t 0x140: 0x100001,\n\t 0x150: 0x2000400,\n\t 0x160: 0x2100400,\n\t 0x170: 0x100401,\n\t 0x180: 0x401,\n\t 0x190: 0x2100401,\n\t 0x1a0: 0x100400,\n\t 0x1b0: 0x1,\n\t 0x1c0: 0x0,\n\t 0x1d0: 0x2100000,\n\t 0x1e0: 0x2000001,\n\t 0x1f0: 0x400,\n\t 0x108: 0x100400,\n\t 0x118: 0x2000401,\n\t 0x128: 0x2100001,\n\t 0x138: 0x1,\n\t 0x148: 0x2000000,\n\t 0x158: 0x100000,\n\t 0x168: 0x401,\n\t 0x178: 0x2100400,\n\t 0x188: 0x2000001,\n\t 0x198: 0x2100000,\n\t 0x1a8: 0x0,\n\t 0x1b8: 0x2100401,\n\t 0x1c8: 0x100401,\n\t 0x1d8: 0x400,\n\t 0x1e8: 0x2000400,\n\t 0x1f8: 0x100001\n\t },\n\t {\n\t 0x0: 0x8000820,\n\t 0x1: 0x20000,\n\t 0x2: 0x8000000,\n\t 0x3: 0x20,\n\t 0x4: 0x20020,\n\t 0x5: 0x8020820,\n\t 0x6: 0x8020800,\n\t 0x7: 0x800,\n\t 0x8: 0x8020000,\n\t 0x9: 0x8000800,\n\t 0xa: 0x20800,\n\t 0xb: 0x8020020,\n\t 0xc: 0x820,\n\t 0xd: 0x0,\n\t 0xe: 0x8000020,\n\t 0xf: 0x20820,\n\t 0x80000000: 0x800,\n\t 0x80000001: 0x8020820,\n\t 0x80000002: 0x8000820,\n\t 0x80000003: 0x8000000,\n\t 0x80000004: 0x8020000,\n\t 0x80000005: 0x20800,\n\t 0x80000006: 0x20820,\n\t 0x80000007: 0x20,\n\t 0x80000008: 0x8000020,\n\t 0x80000009: 0x820,\n\t 0x8000000a: 0x20020,\n\t 0x8000000b: 0x8020800,\n\t 0x8000000c: 0x0,\n\t 0x8000000d: 0x8020020,\n\t 0x8000000e: 0x8000800,\n\t 0x8000000f: 0x20000,\n\t 0x10: 0x20820,\n\t 0x11: 0x8020800,\n\t 0x12: 0x20,\n\t 0x13: 0x800,\n\t 0x14: 0x8000800,\n\t 0x15: 0x8000020,\n\t 0x16: 0x8020020,\n\t 0x17: 0x20000,\n\t 0x18: 0x0,\n\t 0x19: 0x20020,\n\t 0x1a: 0x8020000,\n\t 0x1b: 0x8000820,\n\t 0x1c: 0x8020820,\n\t 0x1d: 0x20800,\n\t 0x1e: 0x820,\n\t 0x1f: 0x8000000,\n\t 0x80000010: 0x20000,\n\t 0x80000011: 0x800,\n\t 0x80000012: 0x8020020,\n\t 0x80000013: 0x20820,\n\t 0x80000014: 0x20,\n\t 0x80000015: 0x8020000,\n\t 0x80000016: 0x8000000,\n\t 0x80000017: 0x8000820,\n\t 0x80000018: 0x8020820,\n\t 0x80000019: 0x8000020,\n\t 0x8000001a: 0x8000800,\n\t 0x8000001b: 0x0,\n\t 0x8000001c: 0x20800,\n\t 0x8000001d: 0x820,\n\t 0x8000001e: 0x20020,\n\t 0x8000001f: 0x8020800\n\t }\n\t ];\n\n\t // Masks that select the SBOX input\n\t var SBOX_MASK = [\n\t 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t ];\n\n\t /**\n\t * DES block cipher algorithm.\n\t */\n\t var DES = C_algo.DES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\n\t // Select 56 bits according to PC1\n\t var keyBits = [];\n\t for (var i = 0; i < 56; i++) {\n\t var keyBitPos = PC1[i] - 1;\n\t keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t }\n\n\t // Assemble 16 subkeys\n\t var subKeys = this._subKeys = [];\n\t for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t // Create subkey\n\t var subKey = subKeys[nSubKey] = [];\n\n\t // Shortcut\n\t var bitShift = BIT_SHIFTS[nSubKey];\n\n\t // Select 48 bits according to PC2\n\t for (var i = 0; i < 24; i++) {\n\t // Select from the left 28 key bits\n\t subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t // Select from the right 28 key bits\n\t subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t }\n\n\t // Since each subkey is applied to an expanded 32-bit input,\n\t // the subkey can be broken into 8 values scaled to 32-bits,\n\t // which allows the key to be used without expansion\n\t subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t for (var i = 1; i < 7; i++) {\n\t subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t }\n\t subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t }\n\n\t // Compute inverse subkeys\n\t var invSubKeys = this._invSubKeys = [];\n\t for (var i = 0; i < 16; i++) {\n\t invSubKeys[i] = subKeys[15 - i];\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._subKeys);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._invSubKeys);\n\t },\n\n\t _doCryptBlock: function (M, offset, subKeys) {\n\t // Get input\n\t this._lBlock = M[offset];\n\t this._rBlock = M[offset + 1];\n\n\t // Initial permutation\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeLR.call(this, 1, 0x55555555);\n\n\t // Rounds\n\t for (var round = 0; round < 16; round++) {\n\t // Shortcuts\n\t var subKey = subKeys[round];\n\t var lBlock = this._lBlock;\n\t var rBlock = this._rBlock;\n\n\t // Feistel function\n\t var f = 0;\n\t for (var i = 0; i < 8; i++) {\n\t f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t }\n\t this._lBlock = rBlock;\n\t this._rBlock = lBlock ^ f;\n\t }\n\n\t // Undo swap from last round\n\t var t = this._lBlock;\n\t this._lBlock = this._rBlock;\n\t this._rBlock = t;\n\n\t // Final permutation\n\t exchangeLR.call(this, 1, 0x55555555);\n\t exchangeRL.call(this, 8, 0x00ff00ff);\n\t exchangeRL.call(this, 2, 0x33333333);\n\t exchangeLR.call(this, 16, 0x0000ffff);\n\t exchangeLR.call(this, 4, 0x0f0f0f0f);\n\n\t // Set output\n\t M[offset] = this._lBlock;\n\t M[offset + 1] = this._rBlock;\n\t },\n\n\t keySize: 64/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t // Swap bits across the left and right words\n\t function exchangeLR(offset, mask) {\n\t var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t this._rBlock ^= t;\n\t this._lBlock ^= t << offset;\n\t }\n\n\t function exchangeRL(offset, mask) {\n\t var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t this._lBlock ^= t;\n\t this._rBlock ^= t << offset;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.DES = BlockCipher._createHelper(DES);\n\n\t /**\n\t * Triple-DES block cipher algorithm.\n\t */\n\t var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t _doReset: function () {\n\t // Shortcuts\n\t var key = this._key;\n\t var keyWords = key.words;\n\t // Make sure the key length is valid (64, 128 or >= 192 bit)\n\t if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {\n\t throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');\n\t }\n\n\t // Extend the key according to the keying options defined in 3DES standard\n\t var key1 = keyWords.slice(0, 2);\n\t var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);\n\t var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);\n\n\t // Create DES instances\n\t this._des1 = DES.createEncryptor(WordArray.create(key1));\n\t this._des2 = DES.createEncryptor(WordArray.create(key2));\n\t this._des3 = DES.createEncryptor(WordArray.create(key3));\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._des1.encryptBlock(M, offset);\n\t this._des2.decryptBlock(M, offset);\n\t this._des3.encryptBlock(M, offset);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t this._des3.decryptBlock(M, offset);\n\t this._des2.encryptBlock(M, offset);\n\t this._des1.decryptBlock(M, offset);\n\t },\n\n\t keySize: 192/32,\n\n\t ivSize: 64/32,\n\n\t blockSize: 64/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\treturn CryptoJS.TripleDES;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYyOC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL3RyaXBsZWRlcy5qcz9hNDBlIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9lbmMtYmFzZTY0XCIpLCByZXF1aXJlKFwiLi9tZDVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vbWQ1XCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBQZXJtdXRlZCBDaG9pY2UgMSBjb25zdGFudHNcblx0ICAgIHZhciBQQzEgPSBbXG5cdCAgICAgICAgNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgOSwgIDEsXG5cdCAgICAgICAgNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCwgMTAsIDIsXG5cdCAgICAgICAgNTksIDUxLCA0MywgMzUsIDI3LCAxOSwgMTEsIDMsXG5cdCAgICAgICAgNjAsIDUyLCA0NCwgMzYsIDYzLCA1NSwgNDcsIDM5LFxuXHQgICAgICAgIDMxLCAyMywgMTUsIDcsICA2MiwgNTQsIDQ2LCAzOCxcblx0ICAgICAgICAzMCwgMjIsIDE0LCA2LCAgNjEsIDUzLCA0NSwgMzcsXG5cdCAgICAgICAgMjksIDIxLCAxMywgNSwgIDI4LCAyMCwgMTIsIDRcblx0ICAgIF07XG5cblx0ICAgIC8vIFBlcm11dGVkIENob2ljZSAyIGNvbnN0YW50c1xuXHQgICAgdmFyIFBDMiA9IFtcblx0ICAgICAgICAxNCwgMTcsIDExLCAyNCwgMSwgIDUsXG5cdCAgICAgICAgMywgIDI4LCAxNSwgNiwgIDIxLCAxMCxcblx0ICAgICAgICAyMywgMTksIDEyLCA0LCAgMjYsIDgsXG5cdCAgICAgICAgMTYsIDcsICAyNywgMjAsIDEzLCAyLFxuXHQgICAgICAgIDQxLCA1MiwgMzEsIDM3LCA0NywgNTUsXG5cdCAgICAgICAgMzAsIDQwLCA1MSwgNDUsIDMzLCA0OCxcblx0ICAgICAgICA0NCwgNDksIDM5LCA1NiwgMzQsIDUzLFxuXHQgICAgICAgIDQ2LCA0MiwgNTAsIDM2LCAyOSwgMzJcblx0ICAgIF07XG5cblx0ICAgIC8vIEN1bXVsYXRpdmUgYml0IHNoaWZ0IGNvbnN0YW50c1xuXHQgICAgdmFyIEJJVF9TSElGVFMgPSBbMSwgIDIsICA0LCAgNiwgIDgsICAxMCwgMTIsIDE0LCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjhdO1xuXG5cdCAgICAvLyBTQk9YZXMgYW5kIHJvdW5kIHBlcm11dGF0aW9uIGNvbnN0YW50c1xuXHQgICAgdmFyIFNCT1hfUCA9IFtcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIDB4MDogMHg4MDgyMDAsXG5cdCAgICAgICAgICAgIDB4MTAwMDAwMDA6IDB4ODAwMCxcblx0ICAgICAgICAgICAgMHgyMDAwMDAwMDogMHg4MDgwMDIsXG5cdCAgICAgICAgICAgIDB4MzAwMDAwMDA6IDB4Mixcblx0ICAgICAgICAgICAgMHg0MDAwMDAwMDogMHgyMDAsXG5cdCAgICAgICAgICAgIDB4NTAwMDAwMDA6IDB4ODA4MjAyLFxuXHQgICAgICAgICAgICAweDYwMDAwMDAwOiAweDgwMDIwMixcblx0ICAgICAgICAgICAgMHg3MDAwMDAwMDogMHg4MDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDA6IDB4MjAyLFxuXHQgICAgICAgICAgICAweDkwMDAwMDAwOiAweDgwMDIwMCxcblx0ICAgICAgICAgICAgMHhhMDAwMDAwMDogMHg4MjAwLFxuXHQgICAgICAgICAgICAweGIwMDAwMDAwOiAweDgwODAwMCxcblx0ICAgICAgICAgICAgMHhjMDAwMDAwMDogMHg4MDAyLFxuXHQgICAgICAgICAgICAweGQwMDAwMDAwOiAweDgwMDAwMixcblx0ICAgICAgICAgICAgMHhlMDAwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweGYwMDAwMDAwOiAweDgyMDIsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDE4MDAwMDAwOiAweDgwODIwMixcblx0ICAgICAgICAgICAgMHgyODAwMDAwMDogMHg4MjAyLFxuXHQgICAgICAgICAgICAweDM4MDAwMDAwOiAweDgwMDAsXG5cdCAgICAgICAgICAgIDB4NDgwMDAwMDA6IDB4ODA4MjAwLFxuXHQgICAgICAgICAgICAweDU4MDAwMDAwOiAweDIwMCxcblx0ICAgICAgICAgICAgMHg2ODAwMDAwMDogMHg4MDgwMDIsXG5cdCAgICAgICAgICAgIDB4NzgwMDAwMDA6IDB4Mixcblx0ICAgICAgICAgICAgMHg4ODAwMDAwMDogMHg4MDAyMDAsXG5cdCAgICAgICAgICAgIDB4OTgwMDAwMDA6IDB4ODIwMCxcblx0ICAgICAgICAgICAgMHhhODAwMDAwMDogMHg4MDgwMDAsXG5cdCAgICAgICAgICAgIDB4YjgwMDAwMDA6IDB4ODAwMjAyLFxuXHQgICAgICAgICAgICAweGM4MDAwMDAwOiAweDgwMDAwMixcblx0ICAgICAgICAgICAgMHhkODAwMDAwMDogMHg4MDAyLFxuXHQgICAgICAgICAgICAweGU4MDAwMDAwOiAweDIwMixcblx0ICAgICAgICAgICAgMHhmODAwMDAwMDogMHg4MDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTogMHg4MDAwLFxuXHQgICAgICAgICAgICAweDEwMDAwMDAxOiAweDIsXG5cdCAgICAgICAgICAgIDB4MjAwMDAwMDE6IDB4ODA4MjAwLFxuXHQgICAgICAgICAgICAweDMwMDAwMDAxOiAweDgwMDAwMCxcblx0ICAgICAgICAgICAgMHg0MDAwMDAwMTogMHg4MDgwMDIsXG5cdCAgICAgICAgICAgIDB4NTAwMDAwMDE6IDB4ODIwMCxcblx0ICAgICAgICAgICAgMHg2MDAwMDAwMTogMHgyMDAsXG5cdCAgICAgICAgICAgIDB4NzAwMDAwMDE6IDB4ODAwMjAyLFxuXHQgICAgICAgICAgICAweDgwMDAwMDAxOiAweDgwODIwMixcblx0ICAgICAgICAgICAgMHg5MDAwMDAwMTogMHg4MDgwMDAsXG5cdCAgICAgICAgICAgIDB4YTAwMDAwMDE6IDB4ODAwMDAyLFxuXHQgICAgICAgICAgICAweGIwMDAwMDAxOiAweDgyMDIsXG5cdCAgICAgICAgICAgIDB4YzAwMDAwMDE6IDB4MjAyLFxuXHQgICAgICAgICAgICAweGQwMDAwMDAxOiAweDgwMDIwMCxcblx0ICAgICAgICAgICAgMHhlMDAwMDAwMTogMHg4MDAyLFxuXHQgICAgICAgICAgICAweGYwMDAwMDAxOiAweDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTogMHg4MDgyMDIsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwMDE6IDB4ODA4MDAwLFxuXHQgICAgICAgICAgICAweDI4MDAwMDAxOiAweDgwMDAwMCxcblx0ICAgICAgICAgICAgMHgzODAwMDAwMTogMHgyMDAsXG5cdCAgICAgICAgICAgIDB4NDgwMDAwMDE6IDB4ODAwMCxcblx0ICAgICAgICAgICAgMHg1ODAwMDAwMTogMHg4MDAwMDIsXG5cdCAgICAgICAgICAgIDB4NjgwMDAwMDE6IDB4Mixcblx0ICAgICAgICAgICAgMHg3ODAwMDAwMTogMHg4MjAyLFxuXHQgICAgICAgICAgICAweDg4MDAwMDAxOiAweDgwMDIsXG5cdCAgICAgICAgICAgIDB4OTgwMDAwMDE6IDB4ODAwMjAyLFxuXHQgICAgICAgICAgICAweGE4MDAwMDAxOiAweDIwMixcblx0ICAgICAgICAgICAgMHhiODAwMDAwMTogMHg4MDgyMDAsXG5cdCAgICAgICAgICAgIDB4YzgwMDAwMDE6IDB4ODAwMjAwLFxuXHQgICAgICAgICAgICAweGQ4MDAwMDAxOiAweDAsXG5cdCAgICAgICAgICAgIDB4ZTgwMDAwMDE6IDB4ODIwMCxcblx0ICAgICAgICAgICAgMHhmODAwMDAwMTogMHg4MDgwMDJcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgMHgwOiAweDQwMDg0MDEwLFxuXHQgICAgICAgICAgICAweDEwMDAwMDA6IDB4NDAwMCxcblx0ICAgICAgICAgICAgMHgyMDAwMDAwOiAweDgwMDAwLFxuXHQgICAgICAgICAgICAweDMwMDAwMDA6IDB4NDAwODAwMTAsXG5cdCAgICAgICAgICAgIDB4NDAwMDAwMDogMHg0MDAwMDAxMCxcblx0ICAgICAgICAgICAgMHg1MDAwMDAwOiAweDQwMDg0MDAwLFxuXHQgICAgICAgICAgICAweDYwMDAwMDA6IDB4NDAwMDQwMDAsXG5cdCAgICAgICAgICAgIDB4NzAwMDAwMDogMHgxMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwOiAweDg0MDAwLFxuXHQgICAgICAgICAgICAweDkwMDAwMDA6IDB4NDAwMDQwMTAsXG5cdCAgICAgICAgICAgIDB4YTAwMDAwMDogMHg0MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHhiMDAwMDAwOiAweDg0MDEwLFxuXHQgICAgICAgICAgICAweGMwMDAwMDA6IDB4ODAwMTAsXG5cdCAgICAgICAgICAgIDB4ZDAwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweGUwMDAwMDA6IDB4NDAxMCxcblx0ICAgICAgICAgICAgMHhmMDAwMDAwOiAweDQwMDgwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDogMHg0MDAwNDAwMCxcblx0ICAgICAgICAgICAgMHgxODAwMDAwOiAweDg0MDEwLFxuXHQgICAgICAgICAgICAweDI4MDAwMDA6IDB4MTAsXG5cdCAgICAgICAgICAgIDB4MzgwMDAwMDogMHg0MDAwNDAxMCxcblx0ICAgICAgICAgICAgMHg0ODAwMDAwOiAweDQwMDg0MDEwLFxuXHQgICAgICAgICAgICAweDU4MDAwMDA6IDB4NDAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4NjgwMDAwMDogMHg4MDAwMCxcblx0ICAgICAgICAgICAgMHg3ODAwMDAwOiAweDQwMDgwMDEwLFxuXHQgICAgICAgICAgICAweDg4MDAwMDA6IDB4ODAwMTAsXG5cdCAgICAgICAgICAgIDB4OTgwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweGE4MDAwMDA6IDB4NDAwMCxcblx0ICAgICAgICAgICAgMHhiODAwMDAwOiAweDQwMDgwMDAwLFxuXHQgICAgICAgICAgICAweGM4MDAwMDA6IDB4NDAwMDAwMTAsXG5cdCAgICAgICAgICAgIDB4ZDgwMDAwMDogMHg4NDAwMCxcblx0ICAgICAgICAgICAgMHhlODAwMDAwOiAweDQwMDg0MDAwLFxuXHQgICAgICAgICAgICAweGY4MDAwMDA6IDB4NDAxMCxcblx0ICAgICAgICAgICAgMHgxMDAwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDExMDAwMDAwOiAweDQwMDgwMDEwLFxuXHQgICAgICAgICAgICAweDEyMDAwMDAwOiAweDQwMDA0MDEwLFxuXHQgICAgICAgICAgICAweDEzMDAwMDAwOiAweDQwMDg0MDAwLFxuXHQgICAgICAgICAgICAweDE0MDAwMDAwOiAweDQwMDgwMDAwLFxuXHQgICAgICAgICAgICAweDE1MDAwMDAwOiAweDEwLFxuXHQgICAgICAgICAgICAweDE2MDAwMDAwOiAweDg0MDEwLFxuXHQgICAgICAgICAgICAweDE3MDAwMDAwOiAweDQwMDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwMDA6IDB4NDAxMCxcblx0ICAgICAgICAgICAgMHgxOTAwMDAwMDogMHg4MDAwMCxcblx0ICAgICAgICAgICAgMHgxYTAwMDAwMDogMHg4MDAxMCxcblx0ICAgICAgICAgICAgMHgxYjAwMDAwMDogMHg0MDAwMDAxMCxcblx0ICAgICAgICAgICAgMHgxYzAwMDAwMDogMHg4NDAwMCxcblx0ICAgICAgICAgICAgMHgxZDAwMDAwMDogMHg0MDAwNDAwMCxcblx0ICAgICAgICAgICAgMHgxZTAwMDAwMDogMHg0MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxZjAwMDAwMDogMHg0MDA4NDAxMCxcblx0ICAgICAgICAgICAgMHgxMDgwMDAwMDogMHg4NDAxMCxcblx0ICAgICAgICAgICAgMHgxMTgwMDAwMDogMHg4MDAwMCxcblx0ICAgICAgICAgICAgMHgxMjgwMDAwMDogMHg0MDA4MDAwMCxcblx0ICAgICAgICAgICAgMHgxMzgwMDAwMDogMHg0MDAwLFxuXHQgICAgICAgICAgICAweDE0ODAwMDAwOiAweDQwMDA0MDAwLFxuXHQgICAgICAgICAgICAweDE1ODAwMDAwOiAweDQwMDg0MDEwLFxuXHQgICAgICAgICAgICAweDE2ODAwMDAwOiAweDEwLFxuXHQgICAgICAgICAgICAweDE3ODAwMDAwOiAweDQwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDE4ODAwMDAwOiAweDQwMDg0MDAwLFxuXHQgICAgICAgICAgICAweDE5ODAwMDAwOiAweDQwMDAwMDEwLFxuXHQgICAgICAgICAgICAweDFhODAwMDAwOiAweDQwMDA0MDEwLFxuXHQgICAgICAgICAgICAweDFiODAwMDAwOiAweDgwMDEwLFxuXHQgICAgICAgICAgICAweDFjODAwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWQ4MDAwMDA6IDB4NDAxMCxcblx0ICAgICAgICAgICAgMHgxZTgwMDAwMDogMHg0MDA4MDAxMCxcblx0ICAgICAgICAgICAgMHgxZjgwMDAwMDogMHg4NDAwMFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4MTA0LFxuXHQgICAgICAgICAgICAweDEwMDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweDIwMDAwMDogMHg0MDAwMTAwLFxuXHQgICAgICAgICAgICAweDMwMDAwMDogMHgxMDEwNCxcblx0ICAgICAgICAgICAgMHg0MDAwMDA6IDB4MTAwMDQsXG5cdCAgICAgICAgICAgIDB4NTAwMDAwOiAweDQwMDAwMDQsXG5cdCAgICAgICAgICAgIDB4NjAwMDAwOiAweDQwMTAxMDQsXG5cdCAgICAgICAgICAgIDB4NzAwMDAwOiAweDQwMTAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwOiAweDQwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4OTAwMDAwOiAweDQwMTAxMDAsXG5cdCAgICAgICAgICAgIDB4YTAwMDAwOiAweDEwMTAwLFxuXHQgICAgICAgICAgICAweGIwMDAwMDogMHg0MDEwMDA0LFxuXHQgICAgICAgICAgICAweGMwMDAwMDogMHg0MDAwMTA0LFxuXHQgICAgICAgICAgICAweGQwMDAwMDogMHgxMDAwMCxcblx0ICAgICAgICAgICAgMHhlMDAwMDA6IDB4NCxcblx0ICAgICAgICAgICAgMHhmMDAwMDA6IDB4MTAwLFxuXHQgICAgICAgICAgICAweDgwMDAwOiAweDQwMTAxMDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwOiAweDQwMTAwMDQsXG5cdCAgICAgICAgICAgIDB4MjgwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MzgwMDAwOiAweDQwMDAxMDAsXG5cdCAgICAgICAgICAgIDB4NDgwMDAwOiAweDQwMDAwMDQsXG5cdCAgICAgICAgICAgIDB4NTgwMDAwOiAweDEwMDAwLFxuXHQgICAgICAgICAgICAweDY4MDAwMDogMHgxMDAwNCxcblx0ICAgICAgICAgICAgMHg3ODAwMDA6IDB4MTA0LFxuXHQgICAgICAgICAgICAweDg4MDAwMDogMHg0LFxuXHQgICAgICAgICAgICAweDk4MDAwMDogMHgxMDAsXG5cdCAgICAgICAgICAgIDB4YTgwMDAwOiAweDQwMTAwMDAsXG5cdCAgICAgICAgICAgIDB4YjgwMDAwOiAweDEwMTA0LFxuXHQgICAgICAgICAgICAweGM4MDAwMDogMHgxMDEwMCxcblx0ICAgICAgICAgICAgMHhkODAwMDA6IDB4NDAwMDEwNCxcblx0ICAgICAgICAgICAgMHhlODAwMDA6IDB4NDAxMDEwNCxcblx0ICAgICAgICAgICAgMHhmODAwMDA6IDB4NDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxMDAwMDAwOiAweDQwMTAxMDAsXG5cdCAgICAgICAgICAgIDB4MTEwMDAwMDogMHgxMDAwNCxcblx0ICAgICAgICAgICAgMHgxMjAwMDAwOiAweDEwMDAwLFxuXHQgICAgICAgICAgICAweDEzMDAwMDA6IDB4NDAwMDEwMCxcblx0ICAgICAgICAgICAgMHgxNDAwMDAwOiAweDEwMCxcblx0ICAgICAgICAgICAgMHgxNTAwMDAwOiAweDQwMTAxMDQsXG5cdCAgICAgICAgICAgIDB4MTYwMDAwMDogMHg0MDAwMDA0LFxuXHQgICAgICAgICAgICAweDE3MDAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxODAwMDAwOiAweDQwMDAxMDQsXG5cdCAgICAgICAgICAgIDB4MTkwMDAwMDogMHg0MDAwMDAwLFxuXHQgICAgICAgICAgICAweDFhMDAwMDA6IDB4NCxcblx0ICAgICAgICAgICAgMHgxYjAwMDAwOiAweDEwMTAwLFxuXHQgICAgICAgICAgICAweDFjMDAwMDA6IDB4NDAxMDAwMCxcblx0ICAgICAgICAgICAgMHgxZDAwMDAwOiAweDEwNCxcblx0ICAgICAgICAgICAgMHgxZTAwMDAwOiAweDEwMTA0LFxuXHQgICAgICAgICAgICAweDFmMDAwMDA6IDB4NDAxMDAwNCxcblx0ICAgICAgICAgICAgMHgxMDgwMDAwOiAweDQwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTE4MDAwMDogMHgxMDQsXG5cdCAgICAgICAgICAgIDB4MTI4MDAwMDogMHg0MDEwMTAwLFxuXHQgICAgICAgICAgICAweDEzODAwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxNDgwMDAwOiAweDEwMDA0LFxuXHQgICAgICAgICAgICAweDE1ODAwMDA6IDB4NDAwMDEwMCxcblx0ICAgICAgICAgICAgMHgxNjgwMDAwOiAweDEwMCxcblx0ICAgICAgICAgICAgMHgxNzgwMDAwOiAweDQwMTAwMDQsXG5cdCAgICAgICAgICAgIDB4MTg4MDAwMDogMHgxMDAwMCxcblx0ICAgICAgICAgICAgMHgxOTgwMDAwOiAweDQwMTAxMDQsXG5cdCAgICAgICAgICAgIDB4MWE4MDAwMDogMHgxMDEwNCxcblx0ICAgICAgICAgICAgMHgxYjgwMDAwOiAweDQwMDAwMDQsXG5cdCAgICAgICAgICAgIDB4MWM4MDAwMDogMHg0MDAwMTA0LFxuXHQgICAgICAgICAgICAweDFkODAwMDA6IDB4NDAxMDAwMCxcblx0ICAgICAgICAgICAgMHgxZTgwMDAwOiAweDQsXG5cdCAgICAgICAgICAgIDB4MWY4MDAwMDogMHgxMDEwMFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4ODA0MDEwMDAsXG5cdCAgICAgICAgICAgIDB4MTAwMDA6IDB4ODAwMDEwNDAsXG5cdCAgICAgICAgICAgIDB4MjAwMDA6IDB4NDAxMDQwLFxuXHQgICAgICAgICAgICAweDMwMDAwOiAweDgwNDAwMDAwLFxuXHQgICAgICAgICAgICAweDQwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4NTAwMDA6IDB4NDAxMDAwLFxuXHQgICAgICAgICAgICAweDYwMDAwOiAweDgwMDAwMDQwLFxuXHQgICAgICAgICAgICAweDcwMDAwOiAweDQwMDA0MCxcblx0ICAgICAgICAgICAgMHg4MDAwMDogMHg4MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHg5MDAwMDogMHg0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4YTAwMDA6IDB4NDAsXG5cdCAgICAgICAgICAgIDB4YjAwMDA6IDB4ODAwMDEwMDAsXG5cdCAgICAgICAgICAgIDB4YzAwMDA6IDB4ODA0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4ZDAwMDA6IDB4MTA0MCxcblx0ICAgICAgICAgICAgMHhlMDAwMDogMHgxMDAwLFxuXHQgICAgICAgICAgICAweGYwMDAwOiAweDgwNDAxMDQwLFxuXHQgICAgICAgICAgICAweDgwMDA6IDB4ODAwMDEwNDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDA6IDB4NDAsXG5cdCAgICAgICAgICAgIDB4MjgwMDA6IDB4ODA0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4MzgwMDA6IDB4ODAwMDEwMDAsXG5cdCAgICAgICAgICAgIDB4NDgwMDA6IDB4NDAxMDAwLFxuXHQgICAgICAgICAgICAweDU4MDAwOiAweDgwNDAxMDQwLFxuXHQgICAgICAgICAgICAweDY4MDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4NzgwMDA6IDB4ODA0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODgwMDA6IDB4MTAwMCxcblx0ICAgICAgICAgICAgMHg5ODAwMDogMHg4MDQwMTAwMCxcblx0ICAgICAgICAgICAgMHhhODAwMDogMHg0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4YjgwMDA6IDB4MTA0MCxcblx0ICAgICAgICAgICAgMHhjODAwMDogMHg4MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHhkODAwMDogMHg0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4ZTgwMDA6IDB4NDAxMDQwLFxuXHQgICAgICAgICAgICAweGY4MDAwOiAweDgwMDAwMDQwLFxuXHQgICAgICAgICAgICAweDEwMDAwMDogMHg0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4MTEwMDAwOiAweDQwMTAwMCxcblx0ICAgICAgICAgICAgMHgxMjAwMDA6IDB4ODAwMDAwNDAsXG5cdCAgICAgICAgICAgIDB4MTMwMDAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MTQwMDAwOiAweDEwNDAsXG5cdCAgICAgICAgICAgIDB4MTUwMDAwOiAweDgwNDAwMDQwLFxuXHQgICAgICAgICAgICAweDE2MDAwMDogMHg4MDQwMTAwMCxcblx0ICAgICAgICAgICAgMHgxNzAwMDA6IDB4ODAwMDEwNDAsXG5cdCAgICAgICAgICAgIDB4MTgwMDAwOiAweDgwNDAxMDQwLFxuXHQgICAgICAgICAgICAweDE5MDAwMDogMHg4MDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxYTAwMDA6IDB4ODA0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWIwMDAwOiAweDQwMTA0MCxcblx0ICAgICAgICAgICAgMHgxYzAwMDA6IDB4ODAwMDEwMDAsXG5cdCAgICAgICAgICAgIDB4MWQwMDAwOiAweDQwMDAwMCxcblx0ICAgICAgICAgICAgMHgxZTAwMDA6IDB4NDAsXG5cdCAgICAgICAgICAgIDB4MWYwMDAwOiAweDEwMDAsXG5cdCAgICAgICAgICAgIDB4MTA4MDAwOiAweDgwNDAwMDAwLFxuXHQgICAgICAgICAgICAweDExODAwMDogMHg4MDQwMTA0MCxcblx0ICAgICAgICAgICAgMHgxMjgwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxMzgwMDA6IDB4NDAxMDAwLFxuXHQgICAgICAgICAgICAweDE0ODAwMDogMHg0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4MTU4MDAwOiAweDgwMDAwMDAwLFxuXHQgICAgICAgICAgICAweDE2ODAwMDogMHg4MDAwMTA0MCxcblx0ICAgICAgICAgICAgMHgxNzgwMDA6IDB4NDAsXG5cdCAgICAgICAgICAgIDB4MTg4MDAwOiAweDgwMDAwMDQwLFxuXHQgICAgICAgICAgICAweDE5ODAwMDogMHgxMDAwLFxuXHQgICAgICAgICAgICAweDFhODAwMDogMHg4MDAwMTAwMCxcblx0ICAgICAgICAgICAgMHgxYjgwMDA6IDB4ODA0MDAwNDAsXG5cdCAgICAgICAgICAgIDB4MWM4MDAwOiAweDEwNDAsXG5cdCAgICAgICAgICAgIDB4MWQ4MDAwOiAweDgwNDAxMDAwLFxuXHQgICAgICAgICAgICAweDFlODAwMDogMHg0MDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWY4MDAwOiAweDQwMTA0MFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4ODAsXG5cdCAgICAgICAgICAgIDB4MTAwMDogMHgxMDQwMDAwLFxuXHQgICAgICAgICAgICAweDIwMDA6IDB4NDAwMDAsXG5cdCAgICAgICAgICAgIDB4MzAwMDogMHgyMDAwMDAwMCxcblx0ICAgICAgICAgICAgMHg0MDAwOiAweDIwMDQwMDgwLFxuXHQgICAgICAgICAgICAweDUwMDA6IDB4MTAwMDA4MCxcblx0ICAgICAgICAgICAgMHg2MDAwOiAweDIxMDAwMDgwLFxuXHQgICAgICAgICAgICAweDcwMDA6IDB4NDAwODAsXG5cdCAgICAgICAgICAgIDB4ODAwMDogMHgxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDkwMDA6IDB4MjAwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4YTAwMDogMHgyMDAwMDA4MCxcblx0ICAgICAgICAgICAgMHhiMDAwOiAweDIxMDQwMDgwLFxuXHQgICAgICAgICAgICAweGMwMDA6IDB4MjEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4ZDAwMDogMHgwLFxuXHQgICAgICAgICAgICAweGUwMDA6IDB4MTA0MDA4MCxcblx0ICAgICAgICAgICAgMHhmMDAwOiAweDIxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDogMHgxMDQwMDgwLFxuXHQgICAgICAgICAgICAweDE4MDA6IDB4MjEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4MjgwMDogMHg4MCxcblx0ICAgICAgICAgICAgMHgzODAwOiAweDEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4NDgwMDogMHg0MDAwMCxcblx0ICAgICAgICAgICAgMHg1ODAwOiAweDIwMDQwMDgwLFxuXHQgICAgICAgICAgICAweDY4MDA6IDB4MjEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4NzgwMDogMHgyMDAwMDAwMCxcblx0ICAgICAgICAgICAgMHg4ODAwOiAweDIwMDQwMDAwLFxuXHQgICAgICAgICAgICAweDk4MDA6IDB4MCxcblx0ICAgICAgICAgICAgMHhhODAwOiAweDIxMDQwMDgwLFxuXHQgICAgICAgICAgICAweGI4MDA6IDB4MTAwMDA4MCxcblx0ICAgICAgICAgICAgMHhjODAwOiAweDIwMDAwMDgwLFxuXHQgICAgICAgICAgICAweGQ4MDA6IDB4MjEwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ZTgwMDogMHgxMDAwMDAwLFxuXHQgICAgICAgICAgICAweGY4MDA6IDB4NDAwODAsXG5cdCAgICAgICAgICAgIDB4MTAwMDA6IDB4NDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTEwMDA6IDB4ODAsXG5cdCAgICAgICAgICAgIDB4MTIwMDA6IDB4MjAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTMwMDA6IDB4MjEwMDAwODAsXG5cdCAgICAgICAgICAgIDB4MTQwMDA6IDB4MTAwMDA4MCxcblx0ICAgICAgICAgICAgMHgxNTAwMDogMHgyMTA0MDAwMCxcblx0ICAgICAgICAgICAgMHgxNjAwMDogMHgyMDA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxNzAwMDogMHgxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDE4MDAwOiAweDIxMDQwMDgwLFxuXHQgICAgICAgICAgICAweDE5MDAwOiAweDIxMDAwMDAwLFxuXHQgICAgICAgICAgICAweDFhMDAwOiAweDEwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWIwMDA6IDB4MjAwNDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWMwMDA6IDB4NDAwODAsXG5cdCAgICAgICAgICAgIDB4MWQwMDA6IDB4MjAwMDAwODAsXG5cdCAgICAgICAgICAgIDB4MWUwMDA6IDB4MCxcblx0ICAgICAgICAgICAgMHgxZjAwMDogMHgxMDQwMDgwLFxuXHQgICAgICAgICAgICAweDEwODAwOiAweDIxMDAwMDgwLFxuXHQgICAgICAgICAgICAweDExODAwOiAweDEwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTI4MDA6IDB4MTA0MDAwMCxcblx0ICAgICAgICAgICAgMHgxMzgwMDogMHgyMDA0MDA4MCxcblx0ICAgICAgICAgICAgMHgxNDgwMDogMHgyMDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxNTgwMDogMHgxMDQwMDgwLFxuXHQgICAgICAgICAgICAweDE2ODAwOiAweDgwLFxuXHQgICAgICAgICAgICAweDE3ODAwOiAweDIxMDQwMDAwLFxuXHQgICAgICAgICAgICAweDE4ODAwOiAweDQwMDgwLFxuXHQgICAgICAgICAgICAweDE5ODAwOiAweDIxMDQwMDgwLFxuXHQgICAgICAgICAgICAweDFhODAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWI4MDA6IDB4MjEwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWM4MDA6IDB4MTAwMDA4MCxcblx0ICAgICAgICAgICAgMHgxZDgwMDogMHg0MDAwMCxcblx0ICAgICAgICAgICAgMHgxZTgwMDogMHgyMDA0MDAwMCxcblx0ICAgICAgICAgICAgMHgxZjgwMDogMHgyMDAwMDA4MFxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4MTAwMDAwMDgsXG5cdCAgICAgICAgICAgIDB4MTAwOiAweDIwMDAsXG5cdCAgICAgICAgICAgIDB4MjAwOiAweDEwMjAwMDAwLFxuXHQgICAgICAgICAgICAweDMwMDogMHgxMDIwMjAwOCxcblx0ICAgICAgICAgICAgMHg0MDA6IDB4MTAwMDIwMDAsXG5cdCAgICAgICAgICAgIDB4NTAwOiAweDIwMDAwMCxcblx0ICAgICAgICAgICAgMHg2MDA6IDB4MjAwMDA4LFxuXHQgICAgICAgICAgICAweDcwMDogMHgxMDAwMDAwMCxcblx0ICAgICAgICAgICAgMHg4MDA6IDB4MCxcblx0ICAgICAgICAgICAgMHg5MDA6IDB4MTAwMDIwMDgsXG5cdCAgICAgICAgICAgIDB4YTAwOiAweDIwMjAwMCxcblx0ICAgICAgICAgICAgMHhiMDA6IDB4OCxcblx0ICAgICAgICAgICAgMHhjMDA6IDB4MTAyMDAwMDgsXG5cdCAgICAgICAgICAgIDB4ZDAwOiAweDIwMjAwOCxcblx0ICAgICAgICAgICAgMHhlMDA6IDB4MjAwOCxcblx0ICAgICAgICAgICAgMHhmMDA6IDB4MTAyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4ODA6IDB4MTAyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTgwOiAweDEwMjAyMDA4LFxuXHQgICAgICAgICAgICAweDI4MDogMHg4LFxuXHQgICAgICAgICAgICAweDM4MDogMHgyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4NDgwOiAweDIwMjAwOCxcblx0ICAgICAgICAgICAgMHg1ODA6IDB4MTAwMDAwMDgsXG5cdCAgICAgICAgICAgIDB4NjgwOiAweDEwMDAyMDAwLFxuXHQgICAgICAgICAgICAweDc4MDogMHgyMDA4LFxuXHQgICAgICAgICAgICAweDg4MDogMHgyMDAwMDgsXG5cdCAgICAgICAgICAgIDB4OTgwOiAweDIwMDAsXG5cdCAgICAgICAgICAgIDB4YTgwOiAweDEwMDAyMDA4LFxuXHQgICAgICAgICAgICAweGI4MDogMHgxMDIwMDAwOCxcblx0ICAgICAgICAgICAgMHhjODA6IDB4MCxcblx0ICAgICAgICAgICAgMHhkODA6IDB4MTAyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4ZTgwOiAweDIwMjAwMCxcblx0ICAgICAgICAgICAgMHhmODA6IDB4MTAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTAwMDogMHgxMDAwMjAwMCxcblx0ICAgICAgICAgICAgMHgxMTAwOiAweDEwMjAwMDA4LFxuXHQgICAgICAgICAgICAweDEyMDA6IDB4MTAyMDIwMDgsXG5cdCAgICAgICAgICAgIDB4MTMwMDogMHgyMDA4LFxuXHQgICAgICAgICAgICAweDE0MDA6IDB4MjAwMDAwLFxuXHQgICAgICAgICAgICAweDE1MDA6IDB4MTAwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTYwMDogMHgxMDAwMDAwOCxcblx0ICAgICAgICAgICAgMHgxNzAwOiAweDIwMjAwMCxcblx0ICAgICAgICAgICAgMHgxODAwOiAweDIwMjAwOCxcblx0ICAgICAgICAgICAgMHgxOTAwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWEwMDogMHg4LFxuXHQgICAgICAgICAgICAweDFiMDA6IDB4MTAyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWMwMDogMHgyMDAwLFxuXHQgICAgICAgICAgICAweDFkMDA6IDB4MTAwMDIwMDgsXG5cdCAgICAgICAgICAgIDB4MWUwMDogMHgxMDIwMjAwMCxcblx0ICAgICAgICAgICAgMHgxZjAwOiAweDIwMDAwOCxcblx0ICAgICAgICAgICAgMHgxMDgwOiAweDgsXG5cdCAgICAgICAgICAgIDB4MTE4MDogMHgyMDIwMDAsXG5cdCAgICAgICAgICAgIDB4MTI4MDogMHgyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTM4MDogMHgxMDAwMDAwOCxcblx0ICAgICAgICAgICAgMHgxNDgwOiAweDEwMDAyMDAwLFxuXHQgICAgICAgICAgICAweDE1ODA6IDB4MjAwOCxcblx0ICAgICAgICAgICAgMHgxNjgwOiAweDEwMjAyMDA4LFxuXHQgICAgICAgICAgICAweDE3ODA6IDB4MTAyMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTg4MDogMHgxMDIwMjAwMCxcblx0ICAgICAgICAgICAgMHgxOTgwOiAweDEwMjAwMDA4LFxuXHQgICAgICAgICAgICAweDFhODA6IDB4MjAwMCxcblx0ICAgICAgICAgICAgMHgxYjgwOiAweDIwMjAwOCxcblx0ICAgICAgICAgICAgMHgxYzgwOiAweDIwMDAwOCxcblx0ICAgICAgICAgICAgMHgxZDgwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWU4MDogMHgxMDAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxZjgwOiAweDEwMDAyMDA4XG5cdCAgICAgICAgfSxcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIDB4MDogMHgxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTA6IDB4MjAwMDQwMSxcblx0ICAgICAgICAgICAgMHgyMDogMHg0MDAsXG5cdCAgICAgICAgICAgIDB4MzA6IDB4MTAwNDAxLFxuXHQgICAgICAgICAgICAweDQwOiAweDIxMDA0MDEsXG5cdCAgICAgICAgICAgIDB4NTA6IDB4MCxcblx0ICAgICAgICAgICAgMHg2MDogMHgxLFxuXHQgICAgICAgICAgICAweDcwOiAweDIxMDAwMDEsXG5cdCAgICAgICAgICAgIDB4ODA6IDB4MjAwMDQwMCxcblx0ICAgICAgICAgICAgMHg5MDogMHgxMDAwMDEsXG5cdCAgICAgICAgICAgIDB4YTA6IDB4MjAwMDAwMSxcblx0ICAgICAgICAgICAgMHhiMDogMHgyMTAwNDAwLFxuXHQgICAgICAgICAgICAweGMwOiAweDIxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ZDA6IDB4NDAxLFxuXHQgICAgICAgICAgICAweGUwOiAweDEwMDQwMCxcblx0ICAgICAgICAgICAgMHhmMDogMHgyMDAwMDAwLFxuXHQgICAgICAgICAgICAweDg6IDB4MjEwMDAwMSxcblx0ICAgICAgICAgICAgMHgxODogMHgwLFxuXHQgICAgICAgICAgICAweDI4OiAweDIwMDA0MDEsXG5cdCAgICAgICAgICAgIDB4Mzg6IDB4MjEwMDQwMCxcblx0ICAgICAgICAgICAgMHg0ODogMHgxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4NTg6IDB4MjAwMDAwMSxcblx0ICAgICAgICAgICAgMHg2ODogMHgyMDAwMDAwLFxuXHQgICAgICAgICAgICAweDc4OiAweDQwMSxcblx0ICAgICAgICAgICAgMHg4ODogMHgxMDA0MDEsXG5cdCAgICAgICAgICAgIDB4OTg6IDB4MjAwMDQwMCxcblx0ICAgICAgICAgICAgMHhhODogMHgyMTAwMDAwLFxuXHQgICAgICAgICAgICAweGI4OiAweDEwMDAwMSxcblx0ICAgICAgICAgICAgMHhjODogMHg0MDAsXG5cdCAgICAgICAgICAgIDB4ZDg6IDB4MjEwMDQwMSxcblx0ICAgICAgICAgICAgMHhlODogMHgxLFxuXHQgICAgICAgICAgICAweGY4OiAweDEwMDQwMCxcblx0ICAgICAgICAgICAgMHgxMDA6IDB4MjAwMDAwMCxcblx0ICAgICAgICAgICAgMHgxMTA6IDB4MTAwMDAwLFxuXHQgICAgICAgICAgICAweDEyMDogMHgyMDAwNDAxLFxuXHQgICAgICAgICAgICAweDEzMDogMHgyMTAwMDAxLFxuXHQgICAgICAgICAgICAweDE0MDogMHgxMDAwMDEsXG5cdCAgICAgICAgICAgIDB4MTUwOiAweDIwMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MTYwOiAweDIxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MTcwOiAweDEwMDQwMSxcblx0ICAgICAgICAgICAgMHgxODA6IDB4NDAxLFxuXHQgICAgICAgICAgICAweDE5MDogMHgyMTAwNDAxLFxuXHQgICAgICAgICAgICAweDFhMDogMHgxMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MWIwOiAweDEsXG5cdCAgICAgICAgICAgIDB4MWMwOiAweDAsXG5cdCAgICAgICAgICAgIDB4MWQwOiAweDIxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MWUwOiAweDIwMDAwMDEsXG5cdCAgICAgICAgICAgIDB4MWYwOiAweDQwMCxcblx0ICAgICAgICAgICAgMHgxMDg6IDB4MTAwNDAwLFxuXHQgICAgICAgICAgICAweDExODogMHgyMDAwNDAxLFxuXHQgICAgICAgICAgICAweDEyODogMHgyMTAwMDAxLFxuXHQgICAgICAgICAgICAweDEzODogMHgxLFxuXHQgICAgICAgICAgICAweDE0ODogMHgyMDAwMDAwLFxuXHQgICAgICAgICAgICAweDE1ODogMHgxMDAwMDAsXG5cdCAgICAgICAgICAgIDB4MTY4OiAweDQwMSxcblx0ICAgICAgICAgICAgMHgxNzg6IDB4MjEwMDQwMCxcblx0ICAgICAgICAgICAgMHgxODg6IDB4MjAwMDAwMSxcblx0ICAgICAgICAgICAgMHgxOTg6IDB4MjEwMDAwMCxcblx0ICAgICAgICAgICAgMHgxYTg6IDB4MCxcblx0ICAgICAgICAgICAgMHgxYjg6IDB4MjEwMDQwMSxcblx0ICAgICAgICAgICAgMHgxYzg6IDB4MTAwNDAxLFxuXHQgICAgICAgICAgICAweDFkODogMHg0MDAsXG5cdCAgICAgICAgICAgIDB4MWU4OiAweDIwMDA0MDAsXG5cdCAgICAgICAgICAgIDB4MWY4OiAweDEwMDAwMVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAge1xuXHQgICAgICAgICAgICAweDA6IDB4ODAwMDgyMCxcblx0ICAgICAgICAgICAgMHgxOiAweDIwMDAwLFxuXHQgICAgICAgICAgICAweDI6IDB4ODAwMDAwMCxcblx0ICAgICAgICAgICAgMHgzOiAweDIwLFxuXHQgICAgICAgICAgICAweDQ6IDB4MjAwMjAsXG5cdCAgICAgICAgICAgIDB4NTogMHg4MDIwODIwLFxuXHQgICAgICAgICAgICAweDY6IDB4ODAyMDgwMCxcblx0ICAgICAgICAgICAgMHg3OiAweDgwMCxcblx0ICAgICAgICAgICAgMHg4OiAweDgwMjAwMDAsXG5cdCAgICAgICAgICAgIDB4OTogMHg4MDAwODAwLFxuXHQgICAgICAgICAgICAweGE6IDB4MjA4MDAsXG5cdCAgICAgICAgICAgIDB4YjogMHg4MDIwMDIwLFxuXHQgICAgICAgICAgICAweGM6IDB4ODIwLFxuXHQgICAgICAgICAgICAweGQ6IDB4MCxcblx0ICAgICAgICAgICAgMHhlOiAweDgwMDAwMjAsXG5cdCAgICAgICAgICAgIDB4ZjogMHgyMDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwMDogMHg4MDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDE6IDB4ODAyMDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwMjogMHg4MDAwODIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDAzOiAweDgwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMDQ6IDB4ODAyMDAwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwNTogMHgyMDgwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwNjogMHgyMDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwNzogMHgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwODogMHg4MDAwMDIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDA5OiAweDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwYTogMHgyMDAyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwYjogMHg4MDIwODAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDBjOiAweDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMGQ6IDB4ODAyMDAyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAwZTogMHg4MDAwODAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDBmOiAweDIwMDAwLFxuXHQgICAgICAgICAgICAweDEwOiAweDIwODIwLFxuXHQgICAgICAgICAgICAweDExOiAweDgwMjA4MDAsXG5cdCAgICAgICAgICAgIDB4MTI6IDB4MjAsXG5cdCAgICAgICAgICAgIDB4MTM6IDB4ODAwLFxuXHQgICAgICAgICAgICAweDE0OiAweDgwMDA4MDAsXG5cdCAgICAgICAgICAgIDB4MTU6IDB4ODAwMDAyMCxcblx0ICAgICAgICAgICAgMHgxNjogMHg4MDIwMDIwLFxuXHQgICAgICAgICAgICAweDE3OiAweDIwMDAwLFxuXHQgICAgICAgICAgICAweDE4OiAweDAsXG5cdCAgICAgICAgICAgIDB4MTk6IDB4MjAwMjAsXG5cdCAgICAgICAgICAgIDB4MWE6IDB4ODAyMDAwMCxcblx0ICAgICAgICAgICAgMHgxYjogMHg4MDAwODIwLFxuXHQgICAgICAgICAgICAweDFjOiAweDgwMjA4MjAsXG5cdCAgICAgICAgICAgIDB4MWQ6IDB4MjA4MDAsXG5cdCAgICAgICAgICAgIDB4MWU6IDB4ODIwLFxuXHQgICAgICAgICAgICAweDFmOiAweDgwMDAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTA6IDB4MjAwMDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTE6IDB4ODAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDEyOiAweDgwMjAwMjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTM6IDB4MjA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTQ6IDB4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTU6IDB4ODAyMDAwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxNjogMHg4MDAwMDAwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDE3OiAweDgwMDA4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMTg6IDB4ODAyMDgyMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxOTogMHg4MDAwMDIwLFxuXHQgICAgICAgICAgICAweDgwMDAwMDFhOiAweDgwMDA4MDAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMWI6IDB4MCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxYzogMHgyMDgwMCxcblx0ICAgICAgICAgICAgMHg4MDAwMDAxZDogMHg4MjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMWU6IDB4MjAwMjAsXG5cdCAgICAgICAgICAgIDB4ODAwMDAwMWY6IDB4ODAyMDgwMFxuXHQgICAgICAgIH1cblx0ICAgIF07XG5cblx0ICAgIC8vIE1hc2tzIHRoYXQgc2VsZWN0IHRoZSBTQk9YIGlucHV0XG5cdCAgICB2YXIgU0JPWF9NQVNLID0gW1xuXHQgICAgICAgIDB4ZjgwMDAwMDEsIDB4MWY4MDAwMDAsIDB4MDFmODAwMDAsIDB4MDAxZjgwMDAsXG5cdCAgICAgICAgMHgwMDAxZjgwMCwgMHgwMDAwMWY4MCwgMHgwMDAwMDFmOCwgMHg4MDAwMDAxZlxuXHQgICAgXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBERVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIERFUyA9IENfYWxnby5ERVMgPSBCbG9ja0NpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5O1xuXHQgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU2VsZWN0IDU2IGJpdHMgYWNjb3JkaW5nIHRvIFBDMVxuXHQgICAgICAgICAgICB2YXIga2V5Qml0cyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU2OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrZXlCaXRQb3MgPSBQQzFbaV0gLSAxO1xuXHQgICAgICAgICAgICAgICAga2V5Qml0c1tpXSA9IChrZXlXb3Jkc1trZXlCaXRQb3MgPj4+IDVdID4+PiAoMzEgLSBrZXlCaXRQb3MgJSAzMikpICYgMTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFzc2VtYmxlIDE2IHN1YmtleXNcblx0ICAgICAgICAgICAgdmFyIHN1YktleXMgPSB0aGlzLl9zdWJLZXlzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIG5TdWJLZXkgPSAwOyBuU3ViS2V5IDwgMTY7IG5TdWJLZXkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHN1YmtleVxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YktleSA9IHN1YktleXNbblN1YktleV0gPSBbXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRTaGlmdCA9IEJJVF9TSElGVFNbblN1YktleV07XG5cblx0ICAgICAgICAgICAgICAgIC8vIFNlbGVjdCA0OCBiaXRzIGFjY29yZGluZyB0byBQQzJcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCBmcm9tIHRoZSBsZWZ0IDI4IGtleSBiaXRzXG5cdCAgICAgICAgICAgICAgICAgICAgc3ViS2V5WyhpIC8gNikgfCAwXSB8PSBrZXlCaXRzWygoUEMyW2ldIC0gMSkgKyBiaXRTaGlmdCkgJSAyOF0gPDwgKDMxIC0gaSAlIDYpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IGZyb20gdGhlIHJpZ2h0IDI4IGtleSBiaXRzXG5cdCAgICAgICAgICAgICAgICAgICAgc3ViS2V5WzQgKyAoKGkgLyA2KSB8IDApXSB8PSBrZXlCaXRzWzI4ICsgKCgoUEMyW2kgKyAyNF0gLSAxKSArIGJpdFNoaWZ0KSAlIDI4KV0gPDwgKDMxIC0gaSAlIDYpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBTaW5jZSBlYWNoIHN1YmtleSBpcyBhcHBsaWVkIHRvIGFuIGV4cGFuZGVkIDMyLWJpdCBpbnB1dCxcblx0ICAgICAgICAgICAgICAgIC8vIHRoZSBzdWJrZXkgY2FuIGJlIGJyb2tlbiBpbnRvIDggdmFsdWVzIHNjYWxlZCB0byAzMi1iaXRzLFxuXHQgICAgICAgICAgICAgICAgLy8gd2hpY2ggYWxsb3dzIHRoZSBrZXkgdG8gYmUgdXNlZCB3aXRob3V0IGV4cGFuc2lvblxuXHQgICAgICAgICAgICAgICAgc3ViS2V5WzBdID0gKHN1YktleVswXSA8PCAxKSB8IChzdWJLZXlbMF0gPj4+IDMxKTtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3ViS2V5W2ldID0gc3ViS2V5W2ldID4+PiAoKGkgLSAxKSAqIDQgKyAzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHN1YktleVs3XSA9IChzdWJLZXlbN10gPDwgNSkgfCAoc3ViS2V5WzddID4+PiAyNyk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludmVyc2Ugc3Via2V5c1xuXHQgICAgICAgICAgICB2YXIgaW52U3ViS2V5cyA9IHRoaXMuX2ludlN1YktleXMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpbnZTdWJLZXlzW2ldID0gc3ViS2V5c1sxNSAtIGldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9zdWJLZXlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2ludlN1YktleXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9DcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0LCBzdWJLZXlzKSB7XG5cdCAgICAgICAgICAgIC8vIEdldCBpbnB1dFxuXHQgICAgICAgICAgICB0aGlzLl9sQmxvY2sgPSBNW29mZnNldF07XG5cdCAgICAgICAgICAgIHRoaXMuX3JCbG9jayA9IE1bb2Zmc2V0ICsgMV07XG5cblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCBwZXJtdXRhdGlvblxuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgNCwgIDB4MGYwZjBmMGYpO1xuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgMTYsIDB4MDAwMGZmZmYpO1xuXHQgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgMiwgIDB4MzMzMzMzMzMpO1xuXHQgICAgICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgOCwgIDB4MDBmZjAwZmYpO1xuXHQgICAgICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgMSwgIDB4NTU1NTU1NTUpO1xuXG5cdCAgICAgICAgICAgIC8vIFJvdW5kc1xuXHQgICAgICAgICAgICBmb3IgKHZhciByb3VuZCA9IDA7IHJvdW5kIDwgMTY7IHJvdW5kKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIHN1YktleSA9IHN1YktleXNbcm91bmRdO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxCbG9jayA9IHRoaXMuX2xCbG9jaztcblx0ICAgICAgICAgICAgICAgIHZhciByQmxvY2sgPSB0aGlzLl9yQmxvY2s7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEZlaXN0ZWwgZnVuY3Rpb25cblx0ICAgICAgICAgICAgICAgIHZhciBmID0gMDtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZiB8PSBTQk9YX1BbaV1bKChyQmxvY2sgXiBzdWJLZXlbaV0pICYgU0JPWF9NQVNLW2ldKSA+Pj4gMF07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9sQmxvY2sgPSByQmxvY2s7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9yQmxvY2sgPSBsQmxvY2sgXiBmO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVW5kbyBzd2FwIGZyb20gbGFzdCByb3VuZFxuXHQgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2xCbG9jaztcblx0ICAgICAgICAgICAgdGhpcy5fbEJsb2NrID0gdGhpcy5fckJsb2NrO1xuXHQgICAgICAgICAgICB0aGlzLl9yQmxvY2sgPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIEZpbmFsIHBlcm11dGF0aW9uXG5cdCAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxLCAgMHg1NTU1NTU1NSk7XG5cdCAgICAgICAgICAgIGV4Y2hhbmdlUkwuY2FsbCh0aGlzLCA4LCAgMHgwMGZmMDBmZik7XG5cdCAgICAgICAgICAgIGV4Y2hhbmdlUkwuY2FsbCh0aGlzLCAyLCAgMHgzMzMzMzMzMyk7XG5cdCAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxNiwgMHgwMDAwZmZmZik7XG5cdCAgICAgICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCA0LCAgMHgwZjBmMGYwZik7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IG91dHB1dFxuXHQgICAgICAgICAgICBNW29mZnNldF0gPSB0aGlzLl9sQmxvY2s7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSB0aGlzLl9yQmxvY2s7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDY0LzMyLFxuXG5cdCAgICAgICAgaXZTaXplOiA2NC8zMixcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogNjQvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvLyBTd2FwIGJpdHMgYWNyb3NzIHRoZSBsZWZ0IGFuZCByaWdodCB3b3Jkc1xuXHQgICAgZnVuY3Rpb24gZXhjaGFuZ2VMUihvZmZzZXQsIG1hc2spIHtcblx0ICAgICAgICB2YXIgdCA9ICgodGhpcy5fbEJsb2NrID4+PiBvZmZzZXQpIF4gdGhpcy5fckJsb2NrKSAmIG1hc2s7XG5cdCAgICAgICAgdGhpcy5fckJsb2NrIF49IHQ7XG5cdCAgICAgICAgdGhpcy5fbEJsb2NrIF49IHQgPDwgb2Zmc2V0O1xuXHQgICAgfVxuXG5cdCAgICBmdW5jdGlvbiBleGNoYW5nZVJMKG9mZnNldCwgbWFzaykge1xuXHQgICAgICAgIHZhciB0ID0gKCh0aGlzLl9yQmxvY2sgPj4+IG9mZnNldCkgXiB0aGlzLl9sQmxvY2spICYgbWFzaztcblx0ICAgICAgICB0aGlzLl9sQmxvY2sgXj0gdDtcblx0ICAgICAgICB0aGlzLl9yQmxvY2sgXj0gdCA8PCBvZmZzZXQ7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuREVTLmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuREVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLkRFUyA9IEJsb2NrQ2lwaGVyLl9jcmVhdGVIZWxwZXIoREVTKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBUcmlwbGUtREVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBUcmlwbGVERVMgPSBDX2FsZ28uVHJpcGxlREVTID0gQmxvY2tDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleTtcblx0ICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzO1xuXHQgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGtleSBsZW5ndGggaXMgdmFsaWQgKDY0LCAxMjggb3IgPj0gMTkyIGJpdClcblx0ICAgICAgICAgICAgaWYgKGtleVdvcmRzLmxlbmd0aCAhPT0gMiAmJiBrZXlXb3Jkcy5sZW5ndGggIT09IDQgJiYga2V5V29yZHMubGVuZ3RoIDwgNikge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBsZW5ndGggLSAzREVTIHJlcXVpcmVzIHRoZSBrZXkgbGVuZ3RoIHRvIGJlIDY0LCAxMjgsIDE5MiBvciA+MTkyLicpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBrZXkgYWNjb3JkaW5nIHRvIHRoZSBrZXlpbmcgb3B0aW9ucyBkZWZpbmVkIGluIDNERVMgc3RhbmRhcmRcblx0ICAgICAgICAgICAgdmFyIGtleTEgPSBrZXlXb3Jkcy5zbGljZSgwLCAyKTtcblx0ICAgICAgICAgICAgdmFyIGtleTIgPSBrZXlXb3Jkcy5sZW5ndGggPCA0ID8ga2V5V29yZHMuc2xpY2UoMCwgMikgOiBrZXlXb3Jkcy5zbGljZSgyLCA0KTtcblx0ICAgICAgICAgICAgdmFyIGtleTMgPSBrZXlXb3Jkcy5sZW5ndGggPCA2ID8ga2V5V29yZHMuc2xpY2UoMCwgMikgOiBrZXlXb3Jkcy5zbGljZSg0LCA2KTtcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgREVTIGluc3RhbmNlc1xuXHQgICAgICAgICAgICB0aGlzLl9kZXMxID0gREVTLmNyZWF0ZUVuY3J5cHRvcihXb3JkQXJyYXkuY3JlYXRlKGtleTEpKTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMiA9IERFUy5jcmVhdGVFbmNyeXB0b3IoV29yZEFycmF5LmNyZWF0ZShrZXkyKSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczMgPSBERVMuY3JlYXRlRW5jcnlwdG9yKFdvcmRBcnJheS5jcmVhdGUoa2V5MykpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMS5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMi5kZWNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczMuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczIuZW5jcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlczEuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDE5Mi8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogNjQvMzIsXG5cblx0ICAgICAgICBibG9ja1NpemU6IDY0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgKi9cblx0ICAgIEMuVHJpcGxlREVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihUcmlwbGVERVMpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlRyaXBsZURFUztcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7628\n")},7952:(I,g,n)=>{"use strict";I.exports=n.p+"63046345ad9c36a73eda.png"},8235:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Nepalese [ne]\n//! author : suvash : https://github.com/suvash\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '१',\n 2: '२',\n 3: '३',\n 4: '४',\n 5: '५',\n 6: '६',\n 7: '७',\n 8: '८',\n 9: '९',\n 0: '०',\n },\n numberMap = {\n '१': '1',\n '२': '2',\n '३': '3',\n '४': '4',\n '५': '5',\n '६': '6',\n '७': '7',\n '८': '8',\n '९': '9',\n '०': '0',\n };\n\n var ne = moment.defineLocale('ne', {\n months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(\n '_'\n ),\n monthsShort:\n 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(\n '_'\n ),\n weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),\n weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'Aको h:mm बजे',\n LTS: 'Aको h:mm:ss बजे',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, Aको h:mm बजे',\n LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',\n },\n preparse: function (string) {\n return string.replace(/[१२३४५६७८९०]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n meridiemParse: /राति|बिहान|दिउँसो|साँझ/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'राति') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'बिहान') {\n return hour;\n } else if (meridiem === 'दिउँसो') {\n return hour >= 10 ? hour : hour + 12;\n } else if (meridiem === 'साँझ') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 3) {\n return 'राति';\n } else if (hour < 12) {\n return 'बिहान';\n } else if (hour < 16) {\n return 'दिउँसो';\n } else if (hour < 20) {\n return 'साँझ';\n } else {\n return 'राति';\n }\n },\n calendar: {\n sameDay: '[आज] LT',\n nextDay: '[भोलि] LT',\n nextWeek: '[आउँदो] dddd[,] LT',\n lastDay: '[हिजो] LT',\n lastWeek: '[गएको] dddd[,] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%sमा',\n past: '%s अगाडि',\n s: 'केही क्षण',\n ss: '%d सेकेण्ड',\n m: 'एक मिनेट',\n mm: '%d मिनेट',\n h: 'एक घण्टा',\n hh: '%d घण्टा',\n d: 'एक दिन',\n dd: '%d दिन',\n M: 'एक महिना',\n MM: '%d महिना',\n y: 'एक बर्ष',\n yy: '%d बर्ष',\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return ne;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIzNS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanM/M2EzOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTmVwYWxlc2UgW25lXVxuLy8hIGF1dGhvciA6IHN1dmFzaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXZhc2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBuZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25lJywge1xuICAgICAgICBtb250aHM6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL/gpLJf4KSu4KSIX+CknOClgeCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS34KWN4KSfX+CkuOClh+CkquCljeCkn+Clh+CkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KSt4KWH4KSu4KWN4KSs4KSwX+CkoeCkv+CkuOClh+CkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KSoLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL8uX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSILl/gpIXgpJcuX+CkuOClh+CkquCljeCkny5f4KSF4KSV4KWN4KSf4KWLLl/gpKjgpYvgpK3gpYcuX+CkoeCkv+CkuOClhy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpIbgpIfgpKTgpKzgpL7gpLBf4KS44KWL4KSu4KSs4KS+4KSwX+CkruCkmeCljeCkl+CksuCkrOCkvuCksF/gpKzgpYHgpKfgpKzgpL7gpLBf4KSs4KS/4KS54KS/4KSs4KS+4KSwX+CktuClgeCkleCljeCksOCkrOCkvuCksF/gpLbgpKjgpL/gpKzgpL7gpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpIbgpIfgpKQuX+CkuOCli+Ckri5f4KSu4KSZ4KWN4KSX4KSyLl/gpKzgpYHgpKcuX+CkrOCkv+CkueCkvy5f4KS24KWB4KSV4KWN4KSwLl/gpLbgpKjgpL8uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Ckhi5f4KS44KWLLl/gpK7gpIIuX+CkrOClgS5f4KSs4KS/Ll/gpLbgpYEuX+Ckti4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMVFM6ICdB4KSV4KWLIGg6bW06c3Mg4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEHgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpOCkv3zgpKzgpL/gpLngpL7gpKh84KSm4KS/4KSJ4KSB4KS44KWLfOCkuOCkvuCkgeCknS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCkvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkrOCkv+CkueCkvuCkqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpL/gpIngpIHgpLjgpYsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkgeCknScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkrOCkv+CkueCkvuCkqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KS/4KSJ4KSB4KS44KWLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpIHgpJ0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCkvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpK3gpYvgpLLgpL9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+CkhuCkieCkgeCkpuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkueCkv+CknOCli10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSX4KSP4KSV4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgpK7gpL4nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkheCkl+CkvuCkoeCkvycsXG4gICAgICAgICAgICBzOiAn4KSV4KWH4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBzczogJyVkIOCkuOClh+CkleClh+Cko+CljeCkoScsXG4gICAgICAgICAgICBtOiAn4KSP4KSVIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBtbTogJyVkIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBoOiAn4KSP4KSVIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBoaDogJyVkIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBkOiAn4KSP4KSVIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNOiAn4KSP4KSVIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICBNTTogJyVkIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICB5OiAn4KSP4KSVIOCkrOCksOCljeCktycsXG4gICAgICAgICAgICB5eTogJyVkIOCkrOCksOCljeCktycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8235\n")},8616:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n AccountEntity: () => (/* reexport */ AccountEntity),\n ApiId: () => (/* reexport */ ApiId),\n AuthError: () => (/* reexport */ AuthError),\n AuthErrorCodes: () => (/* reexport */ AuthErrorCodes_namespaceObject),\n AuthErrorMessage: () => (/* reexport */ AuthErrorMessage),\n AuthenticationHeaderParser: () => (/* reexport */ AuthenticationHeaderParser),\n AuthenticationScheme: () => (/* reexport */ AuthenticationScheme),\n AzureCloudInstance: () => (/* reexport */ AzureCloudInstance),\n BrowserAuthError: () => (/* reexport */ BrowserAuthError),\n BrowserAuthErrorCodes: () => (/* reexport */ BrowserAuthErrorCodes_namespaceObject),\n BrowserAuthErrorMessage: () => (/* reexport */ BrowserAuthErrorMessage),\n BrowserCacheLocation: () => (/* reexport */ BrowserCacheLocation),\n BrowserConfigurationAuthError: () => (/* reexport */ BrowserConfigurationAuthError),\n BrowserConfigurationAuthErrorCodes: () => (/* reexport */ BrowserConfigurationAuthErrorCodes_namespaceObject),\n BrowserConfigurationAuthErrorMessage: () => (/* reexport */ BrowserConfigurationAuthErrorMessage),\n BrowserPerformanceClient: () => (/* reexport */ BrowserPerformanceClient),\n BrowserPerformanceMeasurement: () => (/* reexport */ BrowserPerformanceMeasurement.BrowserPerformanceMeasurement),\n BrowserStorage: () => (/* reexport */ BrowserStorage),\n BrowserUtils: () => (/* reexport */ BrowserUtils_namespaceObject),\n CacheLookupPolicy: () => (/* reexport */ CacheLookupPolicy),\n ClientAuthError: () => (/* reexport */ ClientAuthError),\n ClientAuthErrorCodes: () => (/* reexport */ ClientAuthErrorCodes_namespaceObject),\n ClientAuthErrorMessage: () => (/* reexport */ ClientAuthErrorMessage),\n ClientConfigurationError: () => (/* reexport */ ClientConfigurationError),\n ClientConfigurationErrorCodes: () => (/* reexport */ ClientConfigurationErrorCodes_namespaceObject),\n ClientConfigurationErrorMessage: () => (/* reexport */ ClientConfigurationErrorMessage),\n DEFAULT_IFRAME_TIMEOUT_MS: () => (/* reexport */ DEFAULT_IFRAME_TIMEOUT_MS),\n EventHandler: () => (/* reexport */ EventHandler),\n EventMessageUtils: () => (/* reexport */ EventMessageUtils),\n EventType: () => (/* reexport */ EventType),\n InteractionRequiredAuthError: () => (/* reexport */ InteractionRequiredAuthError),\n InteractionRequiredAuthErrorCodes: () => (/* reexport */ InteractionRequiredAuthErrorCodes_namespaceObject),\n InteractionRequiredAuthErrorMessage: () => (/* reexport */ InteractionRequiredAuthErrorMessage),\n InteractionStatus: () => (/* reexport */ InteractionStatus),\n InteractionType: () => (/* reexport */ InteractionType),\n JsonWebTokenTypes: () => (/* reexport */ JsonWebTokenTypes),\n LocalStorage: () => (/* reexport */ LocalStorage),\n LogLevel: () => (/* reexport */ LogLevel),\n Logger: () => (/* reexport */ Logger),\n MemoryStorage: () => (/* reexport */ MemoryStorage),\n NavigationClient: () => (/* reexport */ NavigationClient),\n OIDC_DEFAULT_SCOPES: () => (/* reexport */ OIDC_DEFAULT_SCOPES),\n PerformanceEvents: () => (/* reexport */ PerformanceEvents),\n PromptValue: () => (/* reexport */ PromptValue),\n ProtocolMode: () => (/* reexport */ ProtocolMode),\n PublicClientApplication: () => (/* reexport */ PublicClientApplication),\n PublicClientNext: () => (/* reexport */ PublicClientNext),\n ServerError: () => (/* reexport */ ServerError),\n ServerResponseType: () => (/* reexport */ ServerResponseType),\n SessionStorage: () => (/* reexport */ SessionStorage),\n SignedHttpRequest: () => (/* reexport */ SignedHttpRequest),\n StringUtils: () => (/* reexport */ StringUtils),\n StubPerformanceClient: () => (/* reexport */ StubPerformanceClient),\n UrlString: () => (/* reexport */ UrlString),\n WrapperSKU: () => (/* reexport */ WrapperSKU),\n createNestablePublicClientApplication: () => (/* reexport */ createNestablePublicClientApplication),\n createStandardPublicClientApplication: () => (/* reexport */ createStandardPublicClientApplication),\n stubbedPublicClientApplication: () => (/* reexport */ stubbedPublicClientApplication),\n version: () => (/* reexport */ packageMetadata_version)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-common/dist/error/AuthErrorCodes.mjs\nvar AuthErrorCodes_namespaceObject = {};\n__webpack_require__.r(AuthErrorCodes_namespaceObject);\n__webpack_require__.d(AuthErrorCodes_namespaceObject, {\n postRequestFailed: () => (postRequestFailed),\n unexpectedError: () => (unexpectedError)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-common/dist/error/ClientConfigurationErrorCodes.mjs\nvar ClientConfigurationErrorCodes_namespaceObject = {};\n__webpack_require__.r(ClientConfigurationErrorCodes_namespaceObject);\n__webpack_require__.d(ClientConfigurationErrorCodes_namespaceObject, {\n authorityMismatch: () => (authorityMismatch),\n authorityUriInsecure: () => (authorityUriInsecure),\n cannotAllowNativeBroker: () => (cannotAllowNativeBroker),\n cannotSetOIDCOptions: () => (cannotSetOIDCOptions),\n claimsRequestParsingError: () => (claimsRequestParsingError),\n emptyInputScopesError: () => (emptyInputScopesError),\n invalidAuthenticationHeader: () => (invalidAuthenticationHeader),\n invalidAuthorityMetadata: () => (invalidAuthorityMetadata),\n invalidClaims: () => (invalidClaims),\n invalidCloudDiscoveryMetadata: () => (invalidCloudDiscoveryMetadata),\n invalidCodeChallengeMethod: () => (invalidCodeChallengeMethod),\n invalidPromptValue: () => (invalidPromptValue),\n logoutRequestEmpty: () => (logoutRequestEmpty),\n missingNonceAuthenticationHeader: () => (missingNonceAuthenticationHeader),\n missingSshJwk: () => (missingSshJwk),\n missingSshKid: () => (missingSshKid),\n pkceParamsMissing: () => (pkceParamsMissing),\n redirectUriEmpty: () => (redirectUriEmpty),\n tokenRequestEmpty: () => (tokenRequestEmpty),\n untrustedAuthority: () => (untrustedAuthority),\n urlEmptyError: () => (urlEmptyError),\n urlParseError: () => (urlParseError)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-common/dist/error/ClientAuthErrorCodes.mjs\nvar ClientAuthErrorCodes_namespaceObject = {};\n__webpack_require__.r(ClientAuthErrorCodes_namespaceObject);\n__webpack_require__.d(ClientAuthErrorCodes_namespaceObject, {\n authTimeNotFound: () => (authTimeNotFound),\n authorizationCodeMissingFromServerResponse: () => (authorizationCodeMissingFromServerResponse),\n bindingKeyNotRemoved: () => (bindingKeyNotRemoved),\n cannotAppendScopeSet: () => (cannotAppendScopeSet),\n cannotRemoveEmptyScope: () => (cannotRemoveEmptyScope),\n clientInfoDecodingError: () => (clientInfoDecodingError),\n clientInfoEmptyError: () => (clientInfoEmptyError),\n deviceCodeExpired: () => (deviceCodeExpired),\n deviceCodePollingCancelled: () => (deviceCodePollingCancelled),\n deviceCodeUnknownError: () => (deviceCodeUnknownError),\n emptyInputScopeSet: () => (emptyInputScopeSet),\n endSessionEndpointNotSupported: () => (endSessionEndpointNotSupported),\n endpointResolutionError: () => (endpointResolutionError),\n hashNotDeserialized: () => (hashNotDeserialized),\n invalidAssertion: () => (invalidAssertion),\n invalidCacheEnvironment: () => (invalidCacheEnvironment),\n invalidCacheRecord: () => (invalidCacheRecord),\n invalidClientCredential: () => (invalidClientCredential),\n invalidState: () => (invalidState),\n keyIdMissing: () => (keyIdMissing),\n maxAgeTranspired: () => (maxAgeTranspired),\n methodNotImplemented: () => (methodNotImplemented),\n missingTenantIdError: () => (missingTenantIdError),\n multipleMatchingAccounts: () => (multipleMatchingAccounts),\n multipleMatchingAppMetadata: () => (multipleMatchingAppMetadata),\n multipleMatchingTokens: () => (multipleMatchingTokens),\n nestedAppAuthBridgeDisabled: () => (nestedAppAuthBridgeDisabled),\n networkError: () => (networkError),\n noAccountFound: () => (noAccountFound),\n noAccountInSilentRequest: () => (noAccountInSilentRequest),\n noCryptoObject: () => (noCryptoObject),\n noNetworkConnectivity: () => (noNetworkConnectivity),\n nonceMismatch: () => (nonceMismatch),\n nullOrEmptyToken: () => (nullOrEmptyToken),\n openIdConfigError: () => (openIdConfigError),\n requestCannotBeMade: () => (requestCannotBeMade),\n stateMismatch: () => (stateMismatch),\n stateNotFound: () => (stateNotFound),\n tokenClaimsCnfRequiredForSignedJwt: () => (tokenClaimsCnfRequiredForSignedJwt),\n tokenParsingError: () => (tokenParsingError),\n tokenRefreshRequired: () => (tokenRefreshRequired),\n unexpectedCredentialType: () => (unexpectedCredentialType),\n userCanceled: () => (userCanceled),\n userTimeoutReached: () => (userTimeoutReached)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-browser/dist/error/BrowserAuthErrorCodes.mjs\nvar BrowserAuthErrorCodes_namespaceObject = {};\n__webpack_require__.r(BrowserAuthErrorCodes_namespaceObject);\n__webpack_require__.d(BrowserAuthErrorCodes_namespaceObject, {\n authCodeOrNativeAccountIdRequired: () => (authCodeOrNativeAccountIdRequired),\n authCodeRequired: () => (authCodeRequired),\n authRequestNotSetError: () => (authRequestNotSetError),\n blockIframeReload: () => (blockIframeReload),\n blockNestedPopups: () => (blockNestedPopups),\n cryptoKeyNotFound: () => (cryptoKeyNotFound),\n cryptoNonExistent: () => (cryptoNonExistent),\n databaseNotOpen: () => (databaseNotOpen),\n databaseUnavailable: () => (databaseUnavailable),\n emptyNavigateUri: () => (emptyNavigateUri),\n emptyWindowError: () => (emptyWindowError),\n failedToBuildHeaders: () => (failedToBuildHeaders),\n failedToParseHeaders: () => (failedToParseHeaders),\n failedToParseResponse: () => (failedToParseResponse),\n getRequestFailed: () => (getRequestFailed),\n hashDoesNotContainKnownProperties: () => (hashDoesNotContainKnownProperties),\n hashEmptyError: () => (hashEmptyError),\n iframeClosedPrematurely: () => (iframeClosedPrematurely),\n interactionInProgress: () => (interactionInProgress),\n invalidBase64String: () => (invalidBase64String),\n invalidCacheType: () => (invalidCacheType),\n invalidPopTokenRequest: () => (invalidPopTokenRequest),\n monitorPopupTimeout: () => (monitorPopupTimeout),\n monitorWindowTimeout: () => (monitorWindowTimeout),\n nativeConnectionNotEstablished: () => (nativeConnectionNotEstablished),\n nativeExtensionNotInstalled: () => (nativeExtensionNotInstalled),\n nativeHandshakeTimeout: () => (nativeHandshakeTimeout),\n nativePromptNotSupported: () => (nativePromptNotSupported),\n noAccountError: () => (noAccountError),\n noCachedAuthorityError: () => (noCachedAuthorityError),\n noNetworkConnectivity: () => (BrowserAuthErrorCodes_noNetworkConnectivity),\n noStateInHash: () => (noStateInHash),\n noTokenRequestCacheError: () => (noTokenRequestCacheError),\n nonBrowserEnvironment: () => (nonBrowserEnvironment),\n pkceNotCreated: () => (pkceNotCreated),\n popupWindowError: () => (popupWindowError),\n postRequestFailed: () => (BrowserAuthErrorCodes_postRequestFailed),\n redirectInIframe: () => (redirectInIframe),\n silentLogoutUnsupported: () => (silentLogoutUnsupported),\n silentPromptValueError: () => (silentPromptValueError),\n spaCodeAndNativeAccountIdPresent: () => (spaCodeAndNativeAccountIdPresent),\n stateInteractionTypeMismatch: () => (stateInteractionTypeMismatch),\n unableToAcquireTokenFromNativePlatform: () => (unableToAcquireTokenFromNativePlatform),\n unableToLoadToken: () => (unableToLoadToken),\n unableToParseState: () => (unableToParseState),\n unableToParseTokenRequestCacheError: () => (unableToParseTokenRequestCacheError),\n uninitializedPublicClientApplication: () => (uninitializedPublicClientApplication),\n userCancelled: () => (userCancelled)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-browser/dist/error/BrowserConfigurationAuthErrorCodes.mjs\nvar BrowserConfigurationAuthErrorCodes_namespaceObject = {};\n__webpack_require__.r(BrowserConfigurationAuthErrorCodes_namespaceObject);\n__webpack_require__.d(BrowserConfigurationAuthErrorCodes_namespaceObject, {\n inMemRedirectUnavailable: () => (inMemRedirectUnavailable),\n storageNotSupported: () => (storageNotSupported),\n stubbedPublicClientApplicationCalled: () => (stubbedPublicClientApplicationCalled)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-browser/dist/utils/BrowserUtils.mjs\nvar BrowserUtils_namespaceObject = {};\n__webpack_require__.r(BrowserUtils_namespaceObject);\n__webpack_require__.d(BrowserUtils_namespaceObject, {\n blockAPICallsBeforeInitialize: () => (blockAPICallsBeforeInitialize),\n blockAcquireTokenInPopups: () => (blockAcquireTokenInPopups),\n blockNonBrowserEnvironment: () => (blockNonBrowserEnvironment),\n blockRedirectInIframe: () => (blockRedirectInIframe),\n blockReloadInHiddenIframes: () => (blockReloadInHiddenIframes),\n clearHash: () => (clearHash),\n createGuid: () => (createGuid),\n getCurrentUri: () => (getCurrentUri),\n getHomepage: () => (getHomepage),\n invoke: () => (invoke),\n invokeAsync: () => (invokeAsync),\n isInIframe: () => (isInIframe),\n isInPopup: () => (isInPopup),\n preconnect: () => (preconnect),\n preflightCheck: () => (preflightCheck),\n redirectPreflightCheck: () => (redirectPreflightCheck),\n replaceHash: () => (replaceHash)\n});\n\n// NAMESPACE OBJECT: ./node_modules/@azure/msal-common/dist/error/InteractionRequiredAuthErrorCodes.mjs\nvar InteractionRequiredAuthErrorCodes_namespaceObject = {};\n__webpack_require__.r(InteractionRequiredAuthErrorCodes_namespaceObject);\n__webpack_require__.d(InteractionRequiredAuthErrorCodes_namespaceObject, {\n badToken: () => (badToken),\n consentRequired: () => (consentRequired),\n interactionRequired: () => (interactionRequired),\n loginRequired: () => (loginRequired),\n nativeAccountUnavailable: () => (nativeAccountUnavailable),\n noTokensFound: () => (noTokensFound),\n refreshTokenExpired: () => (refreshTokenExpired)\n});\n\n;// ./node_modules/@azure/msal-common/dist/utils/Constants.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst Constants = {\r\n LIBRARY_NAME: "MSAL.JS",\r\n SKU: "msal.js.common",\r\n // Prefix for all library cache entries\r\n CACHE_PREFIX: "msal",\r\n // default authority\r\n DEFAULT_AUTHORITY: "https://login.microsoftonline.com/common/",\r\n DEFAULT_AUTHORITY_HOST: "login.microsoftonline.com",\r\n DEFAULT_COMMON_TENANT: "common",\r\n // ADFS String\r\n ADFS: "adfs",\r\n DSTS: "dstsv2",\r\n // Default AAD Instance Discovery Endpoint\r\n AAD_INSTANCE_DISCOVERY_ENDPT: "https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",\r\n // CIAM URL\r\n CIAM_AUTH_URL: ".ciamlogin.com",\r\n AAD_TENANT_DOMAIN_SUFFIX: ".onmicrosoft.com",\r\n // Resource delimiter - used for certain cache entries\r\n RESOURCE_DELIM: "|",\r\n // Placeholder for non-existent account ids/objects\r\n NO_ACCOUNT: "NO_ACCOUNT",\r\n // Claims\r\n CLAIMS: "claims",\r\n // Consumer UTID\r\n CONSUMER_UTID: "9188040d-6c67-4c5b-b112-36a304b66dad",\r\n // Default scopes\r\n OPENID_SCOPE: "openid",\r\n PROFILE_SCOPE: "profile",\r\n OFFLINE_ACCESS_SCOPE: "offline_access",\r\n EMAIL_SCOPE: "email",\r\n // Default response type for authorization code flow\r\n CODE_RESPONSE_TYPE: "code",\r\n CODE_GRANT_TYPE: "authorization_code",\r\n RT_GRANT_TYPE: "refresh_token",\r\n FRAGMENT_RESPONSE_MODE: "fragment",\r\n S256_CODE_CHALLENGE_METHOD: "S256",\r\n URL_FORM_CONTENT_TYPE: "application/x-www-form-urlencoded;charset=utf-8",\r\n AUTHORIZATION_PENDING: "authorization_pending",\r\n NOT_DEFINED: "not_defined",\r\n EMPTY_STRING: "",\r\n NOT_APPLICABLE: "N/A",\r\n NOT_AVAILABLE: "Not Available",\r\n FORWARD_SLASH: "/",\r\n IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location",\r\n IMDS_VERSION: "2020-06-01",\r\n IMDS_TIMEOUT: 2000,\r\n AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect",\r\n REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com",\r\n KNOWN_PUBLIC_CLOUDS: [\r\n "login.microsoftonline.com",\r\n "login.windows.net",\r\n "login.microsoft.com",\r\n "sts.windows.net",\r\n ],\r\n TOKEN_RESPONSE_TYPE: "token",\r\n ID_TOKEN_RESPONSE_TYPE: "id_token",\r\n SHR_NONCE_VALIDITY: 240,\r\n INVALID_INSTANCE: "invalid_instance",\r\n};\r\nconst HttpStatus = {\r\n SUCCESS: 200,\r\n SUCCESS_RANGE_START: 200,\r\n SUCCESS_RANGE_END: 299,\r\n REDIRECT: 302,\r\n CLIENT_ERROR: 400,\r\n CLIENT_ERROR_RANGE_START: 400,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n NOT_FOUND: 404,\r\n REQUEST_TIMEOUT: 408,\r\n TOO_MANY_REQUESTS: 429,\r\n CLIENT_ERROR_RANGE_END: 499,\r\n SERVER_ERROR: 500,\r\n SERVER_ERROR_RANGE_START: 500,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n SERVER_ERROR_RANGE_END: 599,\r\n MULTI_SIDED_ERROR: 600,\r\n};\r\nconst OIDC_DEFAULT_SCOPES = [\r\n Constants.OPENID_SCOPE,\r\n Constants.PROFILE_SCOPE,\r\n Constants.OFFLINE_ACCESS_SCOPE,\r\n];\r\nconst OIDC_SCOPES = [...OIDC_DEFAULT_SCOPES, Constants.EMAIL_SCOPE];\r\n/**\r\n * Request header names\r\n */\r\nconst HeaderNames = {\r\n CONTENT_TYPE: "Content-Type",\r\n CONTENT_LENGTH: "Content-Length",\r\n RETRY_AFTER: "Retry-After",\r\n CCS_HEADER: "X-AnchorMailbox",\r\n WWWAuthenticate: "WWW-Authenticate",\r\n AuthenticationInfo: "Authentication-Info",\r\n X_MS_REQUEST_ID: "x-ms-request-id",\r\n X_MS_HTTP_VERSION: "x-ms-httpver",\r\n};\r\n/**\r\n * Persistent cache keys MSAL which stay while user is logged in.\r\n */\r\nconst PersistentCacheKeys = {\r\n ID_TOKEN: "idtoken",\r\n CLIENT_INFO: "client.info",\r\n ADAL_ID_TOKEN: "adal.idtoken",\r\n ERROR: "error",\r\n ERROR_DESC: "error.description",\r\n ACTIVE_ACCOUNT: "active-account",\r\n ACTIVE_ACCOUNT_FILTERS: "active-account-filters", // new cache entry for active_account for a more robust version for browser\r\n};\r\n/**\r\n * String constants related to AAD Authority\r\n */\r\nconst AADAuthorityConstants = {\r\n COMMON: "common",\r\n ORGANIZATIONS: "organizations",\r\n CONSUMERS: "consumers",\r\n};\r\n/**\r\n * Claims request keys\r\n */\r\nconst ClaimsRequestKeys = {\r\n ACCESS_TOKEN: "access_token",\r\n XMS_CC: "xms_cc",\r\n};\r\n/**\r\n * we considered making this "enum" in the request instead of string, however it looks like the allowed list of\r\n * prompt values kept changing over past couple of years. There are some undocumented prompt values for some\r\n * internal partners too, hence the choice of generic "string" type instead of the "enum"\r\n */\r\nconst PromptValue = {\r\n LOGIN: "login",\r\n SELECT_ACCOUNT: "select_account",\r\n CONSENT: "consent",\r\n NONE: "none",\r\n CREATE: "create",\r\n NO_SESSION: "no_session",\r\n};\r\n/**\r\n * allowed values for codeVerifier\r\n */\r\nconst CodeChallengeMethodValues = {\r\n PLAIN: "plain",\r\n S256: "S256",\r\n};\r\n/**\r\n * allowed values for server response type\r\n */\r\nconst ServerResponseType = {\r\n QUERY: "query",\r\n FRAGMENT: "fragment",\r\n};\r\n/**\r\n * allowed values for response_mode\r\n */\r\nconst ResponseMode = {\r\n ...ServerResponseType,\r\n FORM_POST: "form_post",\r\n};\r\n/**\r\n * allowed grant_type\r\n */\r\nconst GrantType = {\r\n IMPLICIT_GRANT: "implicit",\r\n AUTHORIZATION_CODE_GRANT: "authorization_code",\r\n CLIENT_CREDENTIALS_GRANT: "client_credentials",\r\n RESOURCE_OWNER_PASSWORD_GRANT: "password",\r\n REFRESH_TOKEN_GRANT: "refresh_token",\r\n DEVICE_CODE_GRANT: "device_code",\r\n JWT_BEARER: "urn:ietf:params:oauth:grant-type:jwt-bearer",\r\n};\r\n/**\r\n * Account types in Cache\r\n */\r\nconst CacheAccountType = {\r\n MSSTS_ACCOUNT_TYPE: "MSSTS",\r\n ADFS_ACCOUNT_TYPE: "ADFS",\r\n MSAV1_ACCOUNT_TYPE: "MSA",\r\n GENERIC_ACCOUNT_TYPE: "Generic", // NTLM, Kerberos, FBA, Basic etc\r\n};\r\n/**\r\n * Separators used in cache\r\n */\r\nconst Separators = {\r\n CACHE_KEY_SEPARATOR: "-",\r\n CLIENT_INFO_SEPARATOR: ".",\r\n};\r\n/**\r\n * Credential Type stored in the cache\r\n */\r\nconst CredentialType = {\r\n ID_TOKEN: "IdToken",\r\n ACCESS_TOKEN: "AccessToken",\r\n ACCESS_TOKEN_WITH_AUTH_SCHEME: "AccessToken_With_AuthScheme",\r\n REFRESH_TOKEN: "RefreshToken",\r\n};\r\n/**\r\n * Combine all cache types\r\n */\r\nconst CacheType = {\r\n ADFS: 1001,\r\n MSA: 1002,\r\n MSSTS: 1003,\r\n GENERIC: 1004,\r\n ACCESS_TOKEN: 2001,\r\n REFRESH_TOKEN: 2002,\r\n ID_TOKEN: 2003,\r\n APP_METADATA: 3001,\r\n UNDEFINED: 9999,\r\n};\r\n/**\r\n * More Cache related constants\r\n */\r\nconst APP_METADATA = "appmetadata";\r\nconst CLIENT_INFO = "client_info";\r\nconst THE_FAMILY_ID = "1";\r\nconst AUTHORITY_METADATA_CONSTANTS = {\r\n CACHE_KEY: "authority-metadata",\r\n REFRESH_TIME_SECONDS: 3600 * 24, // 24 Hours\r\n};\r\nconst AuthorityMetadataSource = {\r\n CONFIG: "config",\r\n CACHE: "cache",\r\n NETWORK: "network",\r\n HARDCODED_VALUES: "hardcoded_values",\r\n};\r\nconst SERVER_TELEM_CONSTANTS = {\r\n SCHEMA_VERSION: 5,\r\n MAX_CUR_HEADER_BYTES: 80,\r\n MAX_LAST_HEADER_BYTES: 330,\r\n MAX_CACHED_ERRORS: 50,\r\n CACHE_KEY: "server-telemetry",\r\n CATEGORY_SEPARATOR: "|",\r\n VALUE_SEPARATOR: ",",\r\n OVERFLOW_TRUE: "1",\r\n OVERFLOW_FALSE: "0",\r\n UNKNOWN_ERROR: "unknown_error",\r\n};\r\n/**\r\n * Type of the authentication request\r\n */\r\nconst AuthenticationScheme = {\r\n BEARER: "Bearer",\r\n POP: "pop",\r\n SSH: "ssh-cert",\r\n};\r\n/**\r\n * Constants related to throttling\r\n */\r\nconst ThrottlingConstants = {\r\n // Default time to throttle RequestThumbprint in seconds\r\n DEFAULT_THROTTLE_TIME_SECONDS: 60,\r\n // Default maximum time to throttle in seconds, overrides what the server sends back\r\n DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,\r\n // Prefix for storing throttling entries\r\n THROTTLING_PREFIX: "throttling",\r\n // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling\r\n X_MS_LIB_CAPABILITY_VALUE: "retry-after, h429",\r\n};\r\nconst Errors = {\r\n INVALID_GRANT_ERROR: "invalid_grant",\r\n CLIENT_MISMATCH_ERROR: "client_mismatch",\r\n};\r\n/**\r\n * Password grant parameters\r\n */\r\nconst PasswordGrantConstants = {\r\n username: "username",\r\n password: "password",\r\n};\r\n/**\r\n * Response codes\r\n */\r\nconst ResponseCodes = {\r\n httpSuccess: 200,\r\n httpBadRequest: 400,\r\n};\r\n/**\r\n * Region Discovery Sources\r\n */\r\nconst RegionDiscoverySources = {\r\n FAILED_AUTO_DETECTION: "1",\r\n INTERNAL_CACHE: "2",\r\n ENVIRONMENT_VARIABLE: "3",\r\n IMDS: "4",\r\n};\r\n/**\r\n * Region Discovery Outcomes\r\n */\r\nconst RegionDiscoveryOutcomes = {\r\n CONFIGURED_MATCHES_DETECTED: "1",\r\n CONFIGURED_NO_AUTO_DETECTION: "2",\r\n CONFIGURED_NOT_DETECTED: "3",\r\n AUTO_DETECTION_REQUESTED_SUCCESSFUL: "4",\r\n AUTO_DETECTION_REQUESTED_FAILED: "5",\r\n};\r\n/**\r\n * Specifies the reason for fetching the access token from the identity provider\r\n */\r\nconst CacheOutcome = {\r\n // When a token is found in the cache or the cache is not supposed to be hit when making the request\r\n NOT_APPLICABLE: "0",\r\n // When the token request goes to the identity provider because force_refresh was set to true. Also occurs if claims were requested\r\n FORCE_REFRESH_OR_CLAIMS: "1",\r\n // When the token request goes to the identity provider because no cached access token exists\r\n NO_CACHED_ACCESS_TOKEN: "2",\r\n // When the token request goes to the identity provider because cached access token expired\r\n CACHED_ACCESS_TOKEN_EXPIRED: "3",\r\n // When the token request goes to the identity provider because refresh_in was used and the existing token needs to be refreshed\r\n PROACTIVELY_REFRESHED: "4",\r\n};\r\nconst JsonWebTokenTypes = {\r\n Jwt: "JWT",\r\n Jwk: "JWK",\r\n Pop: "pop",\r\n};\r\nconst ONE_DAY_IN_MS = 86400000;\r\n// Token renewal offset default in seconds\r\nconst DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;\n\n\n//# sourceMappingURL=Constants.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/AuthErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * AuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nconst unexpectedError = "unexpected_error";\r\nconst postRequestFailed = "post_request_failed";\n\n\n//# sourceMappingURL=AuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/AuthError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst AuthErrorMessages = {\r\n [unexpectedError]: "Unexpected error in authentication.",\r\n [postRequestFailed]: "Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details.",\r\n};\r\n/**\r\n * AuthErrorMessage class containing string constants used by error codes and messages.\r\n * @deprecated Use AuthErrorCodes instead\r\n */\r\nconst AuthErrorMessage = {\r\n unexpectedError: {\r\n code: unexpectedError,\r\n desc: AuthErrorMessages[unexpectedError],\r\n },\r\n postRequestFailed: {\r\n code: postRequestFailed,\r\n desc: AuthErrorMessages[postRequestFailed],\r\n },\r\n};\r\n/**\r\n * General error class thrown by the MSAL.js library.\r\n */\r\nclass AuthError extends Error {\r\n constructor(errorCode, errorMessage, suberror) {\r\n const errorString = errorMessage\r\n ? `${errorCode}: ${errorMessage}`\r\n : errorCode;\r\n super(errorString);\r\n Object.setPrototypeOf(this, AuthError.prototype);\r\n this.errorCode = errorCode || Constants.EMPTY_STRING;\r\n this.errorMessage = errorMessage || Constants.EMPTY_STRING;\r\n this.subError = suberror || Constants.EMPTY_STRING;\r\n this.name = "AuthError";\r\n }\r\n setCorrelationId(correlationId) {\r\n this.correlationId = correlationId;\r\n }\r\n}\r\nfunction createAuthError(code, additionalMessage) {\r\n return new AuthError(code, additionalMessage\r\n ? `${AuthErrorMessages[code]} ${additionalMessage}`\r\n : AuthErrorMessages[code]);\r\n}\n\n\n//# sourceMappingURL=AuthError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/ClientConfigurationErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst redirectUriEmpty = "redirect_uri_empty";\r\nconst claimsRequestParsingError = "claims_request_parsing_error";\r\nconst authorityUriInsecure = "authority_uri_insecure";\r\nconst urlParseError = "url_parse_error";\r\nconst urlEmptyError = "empty_url_error";\r\nconst emptyInputScopesError = "empty_input_scopes_error";\r\nconst invalidPromptValue = "invalid_prompt_value";\r\nconst invalidClaims = "invalid_claims";\r\nconst tokenRequestEmpty = "token_request_empty";\r\nconst logoutRequestEmpty = "logout_request_empty";\r\nconst invalidCodeChallengeMethod = "invalid_code_challenge_method";\r\nconst pkceParamsMissing = "pkce_params_missing";\r\nconst invalidCloudDiscoveryMetadata = "invalid_cloud_discovery_metadata";\r\nconst invalidAuthorityMetadata = "invalid_authority_metadata";\r\nconst untrustedAuthority = "untrusted_authority";\r\nconst missingSshJwk = "missing_ssh_jwk";\r\nconst missingSshKid = "missing_ssh_kid";\r\nconst missingNonceAuthenticationHeader = "missing_nonce_authentication_header";\r\nconst invalidAuthenticationHeader = "invalid_authentication_header";\r\nconst cannotSetOIDCOptions = "cannot_set_OIDCOptions";\r\nconst cannotAllowNativeBroker = "cannot_allow_native_broker";\r\nconst authorityMismatch = "authority_mismatch";\n\n\n//# sourceMappingURL=ClientConfigurationErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/ClientConfigurationError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst ClientConfigurationErrorMessages = {\r\n [redirectUriEmpty]: "A redirect URI is required for all calls, and none has been set.",\r\n [claimsRequestParsingError]: "Could not parse the given claims request object.",\r\n [authorityUriInsecure]: "Authority URIs must use https. Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options",\r\n [urlParseError]: "URL could not be parsed into appropriate segments.",\r\n [urlEmptyError]: "URL was empty or null.",\r\n [emptyInputScopesError]: "Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token.",\r\n [invalidPromptValue]: "Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest",\r\n [invalidClaims]: "Given claims parameter must be a stringified JSON object.",\r\n [tokenRequestEmpty]: "Token request was empty and not found in cache.",\r\n [logoutRequestEmpty]: "The logout request was null or undefined.",\r\n [invalidCodeChallengeMethod]: \'code_challenge_method passed is invalid. Valid values are "plain" and "S256".\',\r\n [pkceParamsMissing]: "Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request",\r\n [invalidCloudDiscoveryMetadata]: "Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields",\r\n [invalidAuthorityMetadata]: "Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields.",\r\n [untrustedAuthority]: "The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter.",\r\n [missingSshJwk]: "Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme.",\r\n [missingSshKid]: "Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme.",\r\n [missingNonceAuthenticationHeader]: "Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce.",\r\n [invalidAuthenticationHeader]: "Invalid authentication header provided",\r\n [cannotSetOIDCOptions]: "Cannot set OIDCOptions parameter. Please change the protocol mode to OIDC or use a non-Microsoft authority.",\r\n [cannotAllowNativeBroker]: "Cannot set allowNativeBroker parameter to true when not in AAD protocol mode.",\r\n [authorityMismatch]: "Authority mismatch error. Authority provided in login request or PublicClientApplication config does not match the environment of the provided account. Please use a matching account or make an interactive request to login to this authority.",\r\n};\r\n/**\r\n * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.\r\n * @deprecated Use ClientConfigurationErrorCodes instead\r\n */\r\nconst ClientConfigurationErrorMessage = {\r\n redirectUriNotSet: {\r\n code: redirectUriEmpty,\r\n desc: ClientConfigurationErrorMessages[redirectUriEmpty],\r\n },\r\n claimsRequestParsingError: {\r\n code: claimsRequestParsingError,\r\n desc: ClientConfigurationErrorMessages[claimsRequestParsingError],\r\n },\r\n authorityUriInsecure: {\r\n code: authorityUriInsecure,\r\n desc: ClientConfigurationErrorMessages[authorityUriInsecure],\r\n },\r\n urlParseError: {\r\n code: urlParseError,\r\n desc: ClientConfigurationErrorMessages[urlParseError],\r\n },\r\n urlEmptyError: {\r\n code: urlEmptyError,\r\n desc: ClientConfigurationErrorMessages[urlEmptyError],\r\n },\r\n emptyScopesError: {\r\n code: emptyInputScopesError,\r\n desc: ClientConfigurationErrorMessages[emptyInputScopesError],\r\n },\r\n invalidPrompt: {\r\n code: invalidPromptValue,\r\n desc: ClientConfigurationErrorMessages[invalidPromptValue],\r\n },\r\n invalidClaimsRequest: {\r\n code: invalidClaims,\r\n desc: ClientConfigurationErrorMessages[invalidClaims],\r\n },\r\n tokenRequestEmptyError: {\r\n code: tokenRequestEmpty,\r\n desc: ClientConfigurationErrorMessages[tokenRequestEmpty],\r\n },\r\n logoutRequestEmptyError: {\r\n code: logoutRequestEmpty,\r\n desc: ClientConfigurationErrorMessages[logoutRequestEmpty],\r\n },\r\n invalidCodeChallengeMethod: {\r\n code: invalidCodeChallengeMethod,\r\n desc: ClientConfigurationErrorMessages[invalidCodeChallengeMethod],\r\n },\r\n invalidCodeChallengeParams: {\r\n code: pkceParamsMissing,\r\n desc: ClientConfigurationErrorMessages[pkceParamsMissing],\r\n },\r\n invalidCloudDiscoveryMetadata: {\r\n code: invalidCloudDiscoveryMetadata,\r\n desc: ClientConfigurationErrorMessages[invalidCloudDiscoveryMetadata],\r\n },\r\n invalidAuthorityMetadata: {\r\n code: invalidAuthorityMetadata,\r\n desc: ClientConfigurationErrorMessages[invalidAuthorityMetadata],\r\n },\r\n untrustedAuthority: {\r\n code: untrustedAuthority,\r\n desc: ClientConfigurationErrorMessages[untrustedAuthority],\r\n },\r\n missingSshJwk: {\r\n code: missingSshJwk,\r\n desc: ClientConfigurationErrorMessages[missingSshJwk],\r\n },\r\n missingSshKid: {\r\n code: missingSshKid,\r\n desc: ClientConfigurationErrorMessages[missingSshKid],\r\n },\r\n missingNonceAuthenticationHeader: {\r\n code: missingNonceAuthenticationHeader,\r\n desc: ClientConfigurationErrorMessages[missingNonceAuthenticationHeader],\r\n },\r\n invalidAuthenticationHeader: {\r\n code: invalidAuthenticationHeader,\r\n desc: ClientConfigurationErrorMessages[invalidAuthenticationHeader],\r\n },\r\n cannotSetOIDCOptions: {\r\n code: cannotSetOIDCOptions,\r\n desc: ClientConfigurationErrorMessages[cannotSetOIDCOptions],\r\n },\r\n cannotAllowNativeBroker: {\r\n code: cannotAllowNativeBroker,\r\n desc: ClientConfigurationErrorMessages[cannotAllowNativeBroker],\r\n },\r\n authorityMismatch: {\r\n code: authorityMismatch,\r\n desc: ClientConfigurationErrorMessages[authorityMismatch],\r\n },\r\n};\r\n/**\r\n * Error thrown when there is an error in configuration of the MSAL.js library.\r\n */\r\nclass ClientConfigurationError extends AuthError {\r\n constructor(errorCode) {\r\n super(errorCode, ClientConfigurationErrorMessages[errorCode]);\r\n this.name = "ClientConfigurationError";\r\n Object.setPrototypeOf(this, ClientConfigurationError.prototype);\r\n }\r\n}\r\nfunction createClientConfigurationError(errorCode) {\r\n return new ClientConfigurationError(errorCode);\r\n}\n\n\n//# sourceMappingURL=ClientConfigurationError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/StringUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @hidden\r\n */\r\nclass StringUtils {\r\n /**\r\n * Check if stringified object is empty\r\n * @param strObj\r\n */\r\n static isEmptyObj(strObj) {\r\n if (strObj) {\r\n try {\r\n const obj = JSON.parse(strObj);\r\n return Object.keys(obj).length === 0;\r\n }\r\n catch (e) { }\r\n }\r\n return true;\r\n }\r\n static startsWith(str, search) {\r\n return str.indexOf(search) === 0;\r\n }\r\n static endsWith(str, search) {\r\n return (str.length >= search.length &&\r\n str.lastIndexOf(search) === str.length - search.length);\r\n }\r\n /**\r\n * Parses string into an object.\r\n *\r\n * @param query\r\n */\r\n static queryStringToObject(query) {\r\n const obj = {};\r\n const params = query.split("&");\r\n const decode = (s) => decodeURIComponent(s.replace(/\\+/g, " "));\r\n params.forEach((pair) => {\r\n if (pair.trim()) {\r\n const [key, value] = pair.split(/=(.+)/g, 2); // Split on the first occurence of the \'=\' character\r\n if (key && value) {\r\n obj[decode(key)] = decode(value);\r\n }\r\n }\r\n });\r\n return obj;\r\n }\r\n /**\r\n * Trims entries in an array.\r\n *\r\n * @param arr\r\n */\r\n static trimArrayEntries(arr) {\r\n return arr.map((entry) => entry.trim());\r\n }\r\n /**\r\n * Removes empty strings from array\r\n * @param arr\r\n */\r\n static removeEmptyStringsFromArray(arr) {\r\n return arr.filter((entry) => {\r\n return !!entry;\r\n });\r\n }\r\n /**\r\n * Attempts to parse a string into JSON\r\n * @param str\r\n */\r\n static jsonParseHelper(str) {\r\n try {\r\n return JSON.parse(str);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n /**\r\n * Tests if a given string matches a given pattern, with support for wildcards and queries.\r\n * @param pattern Wildcard pattern to string match. Supports "*" for wildcards and "?" for queries\r\n * @param input String to match against\r\n */\r\n static matchPattern(pattern, input) {\r\n /**\r\n * Wildcard support: https://stackoverflow.com/a/3117248/4888559\r\n * Queries: replaces "?" in string with escaped "\\?" for regex test\r\n */\r\n // eslint-disable-next-line security/detect-non-literal-regexp\r\n const regex = new RegExp(pattern\r\n .replace(/\\\\/g, "\\\\\\\\")\r\n .replace(/\\*/g, "[^ ]*")\r\n .replace(/\\?/g, "\\\\?"));\r\n return regex.test(input);\r\n }\r\n}\n\n\n//# sourceMappingURL=StringUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/ClientAuthErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst clientInfoDecodingError = "client_info_decoding_error";\r\nconst clientInfoEmptyError = "client_info_empty_error";\r\nconst tokenParsingError = "token_parsing_error";\r\nconst nullOrEmptyToken = "null_or_empty_token";\r\nconst endpointResolutionError = "endpoints_resolution_error";\r\nconst networkError = "network_error";\r\nconst openIdConfigError = "openid_config_error";\r\nconst hashNotDeserialized = "hash_not_deserialized";\r\nconst invalidState = "invalid_state";\r\nconst stateMismatch = "state_mismatch";\r\nconst stateNotFound = "state_not_found";\r\nconst nonceMismatch = "nonce_mismatch";\r\nconst authTimeNotFound = "auth_time_not_found";\r\nconst maxAgeTranspired = "max_age_transpired";\r\nconst multipleMatchingTokens = "multiple_matching_tokens";\r\nconst multipleMatchingAccounts = "multiple_matching_accounts";\r\nconst multipleMatchingAppMetadata = "multiple_matching_appMetadata";\r\nconst requestCannotBeMade = "request_cannot_be_made";\r\nconst cannotRemoveEmptyScope = "cannot_remove_empty_scope";\r\nconst cannotAppendScopeSet = "cannot_append_scopeset";\r\nconst emptyInputScopeSet = "empty_input_scopeset";\r\nconst deviceCodePollingCancelled = "device_code_polling_cancelled";\r\nconst deviceCodeExpired = "device_code_expired";\r\nconst deviceCodeUnknownError = "device_code_unknown_error";\r\nconst noAccountInSilentRequest = "no_account_in_silent_request";\r\nconst invalidCacheRecord = "invalid_cache_record";\r\nconst invalidCacheEnvironment = "invalid_cache_environment";\r\nconst noAccountFound = "no_account_found";\r\nconst noCryptoObject = "no_crypto_object";\r\nconst unexpectedCredentialType = "unexpected_credential_type";\r\nconst invalidAssertion = "invalid_assertion";\r\nconst invalidClientCredential = "invalid_client_credential";\r\nconst tokenRefreshRequired = "token_refresh_required";\r\nconst userTimeoutReached = "user_timeout_reached";\r\nconst tokenClaimsCnfRequiredForSignedJwt = "token_claims_cnf_required_for_signedjwt";\r\nconst authorizationCodeMissingFromServerResponse = "authorization_code_missing_from_server_response";\r\nconst bindingKeyNotRemoved = "binding_key_not_removed";\r\nconst endSessionEndpointNotSupported = "end_session_endpoint_not_supported";\r\nconst keyIdMissing = "key_id_missing";\r\nconst noNetworkConnectivity = "no_network_connectivity";\r\nconst userCanceled = "user_canceled";\r\nconst missingTenantIdError = "missing_tenant_id_error";\r\nconst methodNotImplemented = "method_not_implemented";\r\nconst nestedAppAuthBridgeDisabled = "nested_app_auth_bridge_disabled";\n\n\n//# sourceMappingURL=ClientAuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/ClientAuthError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * ClientAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nconst ClientAuthErrorMessages = {\r\n [clientInfoDecodingError]: "The client info could not be parsed/decoded correctly",\r\n [clientInfoEmptyError]: "The client info was empty",\r\n [tokenParsingError]: "Token cannot be parsed",\r\n [nullOrEmptyToken]: "The token is null or empty",\r\n [endpointResolutionError]: "Endpoints cannot be resolved",\r\n [networkError]: "Network request failed",\r\n [openIdConfigError]: "Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints.",\r\n [hashNotDeserialized]: "The hash parameters could not be deserialized",\r\n [invalidState]: "State was not the expected format",\r\n [stateMismatch]: "State mismatch error",\r\n [stateNotFound]: "State not found",\r\n [nonceMismatch]: "Nonce mismatch error",\r\n [authTimeNotFound]: "Max Age was requested and the ID token is missing the auth_time variable." +\r\n " auth_time is an optional claim and is not enabled by default - it must be enabled." +\r\n " See https://aka.ms/msaljs/optional-claims for more information.",\r\n [maxAgeTranspired]: "Max Age is set to 0, or too much time has elapsed since the last end-user authentication.",\r\n [multipleMatchingTokens]: "The cache contains multiple tokens satisfying the requirements. " +\r\n "Call AcquireToken again providing more requirements such as authority or account.",\r\n [multipleMatchingAccounts]: "The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account",\r\n [multipleMatchingAppMetadata]: "The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata",\r\n [requestCannotBeMade]: "Token request cannot be made without authorization code or refresh token.",\r\n [cannotRemoveEmptyScope]: "Cannot remove null or empty scope from ScopeSet",\r\n [cannotAppendScopeSet]: "Cannot append ScopeSet",\r\n [emptyInputScopeSet]: "Empty input ScopeSet cannot be processed",\r\n [deviceCodePollingCancelled]: "Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true.",\r\n [deviceCodeExpired]: "Device code is expired.",\r\n [deviceCodeUnknownError]: "Device code stopped polling for unknown reasons.",\r\n [noAccountInSilentRequest]: "Please pass an account object, silent flow is not supported without account information",\r\n [invalidCacheRecord]: "Cache record object was null or undefined.",\r\n [invalidCacheEnvironment]: "Invalid environment when attempting to create cache entry",\r\n [noAccountFound]: "No account found in cache for given key.",\r\n [noCryptoObject]: "No crypto object detected.",\r\n [unexpectedCredentialType]: "Unexpected credential type.",\r\n [invalidAssertion]: "Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515",\r\n [invalidClientCredential]: "Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential",\r\n [tokenRefreshRequired]: "Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired.",\r\n [userTimeoutReached]: "User defined timeout for device code polling reached",\r\n [tokenClaimsCnfRequiredForSignedJwt]: "Cannot generate a POP jwt if the token_claims are not populated",\r\n [authorizationCodeMissingFromServerResponse]: "Server response does not contain an authorization code to proceed",\r\n [bindingKeyNotRemoved]: "Could not remove the credential\'s binding key from storage.",\r\n [endSessionEndpointNotSupported]: "The provided authority does not support logout",\r\n [keyIdMissing]: "A keyId value is missing from the requested bound token\'s cache record and is required to match the token to it\'s stored binding key.",\r\n [noNetworkConnectivity]: "No network connectivity. Check your internet connection.",\r\n [userCanceled]: "User cancelled the flow.",\r\n [missingTenantIdError]: "A tenant id - not common, organizations, or consumers - must be specified when using the client_credentials flow.",\r\n [methodNotImplemented]: "This method has not been implemented",\r\n [nestedAppAuthBridgeDisabled]: "The nested app auth bridge is disabled",\r\n};\r\n/**\r\n * String constants used by error codes and messages.\r\n * @deprecated Use ClientAuthErrorCodes instead\r\n */\r\nconst ClientAuthErrorMessage = {\r\n clientInfoDecodingError: {\r\n code: clientInfoDecodingError,\r\n desc: ClientAuthErrorMessages[clientInfoDecodingError],\r\n },\r\n clientInfoEmptyError: {\r\n code: clientInfoEmptyError,\r\n desc: ClientAuthErrorMessages[clientInfoEmptyError],\r\n },\r\n tokenParsingError: {\r\n code: tokenParsingError,\r\n desc: ClientAuthErrorMessages[tokenParsingError],\r\n },\r\n nullOrEmptyToken: {\r\n code: nullOrEmptyToken,\r\n desc: ClientAuthErrorMessages[nullOrEmptyToken],\r\n },\r\n endpointResolutionError: {\r\n code: endpointResolutionError,\r\n desc: ClientAuthErrorMessages[endpointResolutionError],\r\n },\r\n networkError: {\r\n code: networkError,\r\n desc: ClientAuthErrorMessages[networkError],\r\n },\r\n unableToGetOpenidConfigError: {\r\n code: openIdConfigError,\r\n desc: ClientAuthErrorMessages[openIdConfigError],\r\n },\r\n hashNotDeserialized: {\r\n code: hashNotDeserialized,\r\n desc: ClientAuthErrorMessages[hashNotDeserialized],\r\n },\r\n invalidStateError: {\r\n code: invalidState,\r\n desc: ClientAuthErrorMessages[invalidState],\r\n },\r\n stateMismatchError: {\r\n code: stateMismatch,\r\n desc: ClientAuthErrorMessages[stateMismatch],\r\n },\r\n stateNotFoundError: {\r\n code: stateNotFound,\r\n desc: ClientAuthErrorMessages[stateNotFound],\r\n },\r\n nonceMismatchError: {\r\n code: nonceMismatch,\r\n desc: ClientAuthErrorMessages[nonceMismatch],\r\n },\r\n authTimeNotFoundError: {\r\n code: authTimeNotFound,\r\n desc: ClientAuthErrorMessages[authTimeNotFound],\r\n },\r\n maxAgeTranspired: {\r\n code: maxAgeTranspired,\r\n desc: ClientAuthErrorMessages[maxAgeTranspired],\r\n },\r\n multipleMatchingTokens: {\r\n code: multipleMatchingTokens,\r\n desc: ClientAuthErrorMessages[multipleMatchingTokens],\r\n },\r\n multipleMatchingAccounts: {\r\n code: multipleMatchingAccounts,\r\n desc: ClientAuthErrorMessages[multipleMatchingAccounts],\r\n },\r\n multipleMatchingAppMetadata: {\r\n code: multipleMatchingAppMetadata,\r\n desc: ClientAuthErrorMessages[multipleMatchingAppMetadata],\r\n },\r\n tokenRequestCannotBeMade: {\r\n code: requestCannotBeMade,\r\n desc: ClientAuthErrorMessages[requestCannotBeMade],\r\n },\r\n removeEmptyScopeError: {\r\n code: cannotRemoveEmptyScope,\r\n desc: ClientAuthErrorMessages[cannotRemoveEmptyScope],\r\n },\r\n appendScopeSetError: {\r\n code: cannotAppendScopeSet,\r\n desc: ClientAuthErrorMessages[cannotAppendScopeSet],\r\n },\r\n emptyInputScopeSetError: {\r\n code: emptyInputScopeSet,\r\n desc: ClientAuthErrorMessages[emptyInputScopeSet],\r\n },\r\n DeviceCodePollingCancelled: {\r\n code: deviceCodePollingCancelled,\r\n desc: ClientAuthErrorMessages[deviceCodePollingCancelled],\r\n },\r\n DeviceCodeExpired: {\r\n code: deviceCodeExpired,\r\n desc: ClientAuthErrorMessages[deviceCodeExpired],\r\n },\r\n DeviceCodeUnknownError: {\r\n code: deviceCodeUnknownError,\r\n desc: ClientAuthErrorMessages[deviceCodeUnknownError],\r\n },\r\n NoAccountInSilentRequest: {\r\n code: noAccountInSilentRequest,\r\n desc: ClientAuthErrorMessages[noAccountInSilentRequest],\r\n },\r\n invalidCacheRecord: {\r\n code: invalidCacheRecord,\r\n desc: ClientAuthErrorMessages[invalidCacheRecord],\r\n },\r\n invalidCacheEnvironment: {\r\n code: invalidCacheEnvironment,\r\n desc: ClientAuthErrorMessages[invalidCacheEnvironment],\r\n },\r\n noAccountFound: {\r\n code: noAccountFound,\r\n desc: ClientAuthErrorMessages[noAccountFound],\r\n },\r\n noCryptoObj: {\r\n code: noCryptoObject,\r\n desc: ClientAuthErrorMessages[noCryptoObject],\r\n },\r\n unexpectedCredentialType: {\r\n code: unexpectedCredentialType,\r\n desc: ClientAuthErrorMessages[unexpectedCredentialType],\r\n },\r\n invalidAssertion: {\r\n code: invalidAssertion,\r\n desc: ClientAuthErrorMessages[invalidAssertion],\r\n },\r\n invalidClientCredential: {\r\n code: invalidClientCredential,\r\n desc: ClientAuthErrorMessages[invalidClientCredential],\r\n },\r\n tokenRefreshRequired: {\r\n code: tokenRefreshRequired,\r\n desc: ClientAuthErrorMessages[tokenRefreshRequired],\r\n },\r\n userTimeoutReached: {\r\n code: userTimeoutReached,\r\n desc: ClientAuthErrorMessages[userTimeoutReached],\r\n },\r\n tokenClaimsRequired: {\r\n code: tokenClaimsCnfRequiredForSignedJwt,\r\n desc: ClientAuthErrorMessages[tokenClaimsCnfRequiredForSignedJwt],\r\n },\r\n noAuthorizationCodeFromServer: {\r\n code: authorizationCodeMissingFromServerResponse,\r\n desc: ClientAuthErrorMessages[authorizationCodeMissingFromServerResponse],\r\n },\r\n bindingKeyNotRemovedError: {\r\n code: bindingKeyNotRemoved,\r\n desc: ClientAuthErrorMessages[bindingKeyNotRemoved],\r\n },\r\n logoutNotSupported: {\r\n code: endSessionEndpointNotSupported,\r\n desc: ClientAuthErrorMessages[endSessionEndpointNotSupported],\r\n },\r\n keyIdMissing: {\r\n code: keyIdMissing,\r\n desc: ClientAuthErrorMessages[keyIdMissing],\r\n },\r\n noNetworkConnectivity: {\r\n code: noNetworkConnectivity,\r\n desc: ClientAuthErrorMessages[noNetworkConnectivity],\r\n },\r\n userCanceledError: {\r\n code: userCanceled,\r\n desc: ClientAuthErrorMessages[userCanceled],\r\n },\r\n missingTenantIdError: {\r\n code: missingTenantIdError,\r\n desc: ClientAuthErrorMessages[missingTenantIdError],\r\n },\r\n nestedAppAuthBridgeDisabled: {\r\n code: nestedAppAuthBridgeDisabled,\r\n desc: ClientAuthErrorMessages[nestedAppAuthBridgeDisabled],\r\n },\r\n};\r\n/**\r\n * Error thrown when there is an error in the client code running on the browser.\r\n */\r\nclass ClientAuthError extends AuthError {\r\n constructor(errorCode, additionalMessage) {\r\n super(errorCode, additionalMessage\r\n ? `${ClientAuthErrorMessages[errorCode]}: ${additionalMessage}`\r\n : ClientAuthErrorMessages[errorCode]);\r\n this.name = "ClientAuthError";\r\n Object.setPrototypeOf(this, ClientAuthError.prototype);\r\n }\r\n}\r\nfunction createClientAuthError(errorCode, additionalMessage) {\r\n return new ClientAuthError(errorCode, additionalMessage);\r\n}\n\n\n//# sourceMappingURL=ClientAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/UrlUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Parses hash string from given string. Returns empty string if no hash symbol is found.\r\n * @param hashString\r\n */\r\nfunction stripLeadingHashOrQuery(responseString) {\r\n if (responseString.startsWith("#/")) {\r\n return responseString.substring(2);\r\n }\r\n else if (responseString.startsWith("#") ||\r\n responseString.startsWith("?")) {\r\n return responseString.substring(1);\r\n }\r\n return responseString;\r\n}\r\n/**\r\n * Returns URL hash as server auth code response object.\r\n */\r\nfunction getDeserializedResponse(responseString) {\r\n // Check if given hash is empty\r\n if (!responseString || responseString.indexOf("=") < 0) {\r\n return null;\r\n }\r\n try {\r\n // Strip the # or ? symbol if present\r\n const normalizedResponse = stripLeadingHashOrQuery(responseString);\r\n // If # symbol was not present, above will return empty string, so give original hash value\r\n const deserializedHash = Object.fromEntries(new URLSearchParams(normalizedResponse));\r\n // Check for known response properties\r\n if (deserializedHash.code ||\r\n deserializedHash.error ||\r\n deserializedHash.error_description ||\r\n deserializedHash.state) {\r\n return deserializedHash;\r\n }\r\n }\r\n catch (e) {\r\n throw createClientAuthError(hashNotDeserialized);\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=UrlUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/url/UrlString.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Url object class which can perform various transformations on url strings.\r\n */\r\nclass UrlString {\r\n get urlString() {\r\n return this._urlString;\r\n }\r\n constructor(url) {\r\n this._urlString = url;\r\n if (!this._urlString) {\r\n // Throws error if url is empty\r\n throw createClientConfigurationError(urlEmptyError);\r\n }\r\n if (!url.includes("#")) {\r\n this._urlString = UrlString.canonicalizeUri(url);\r\n }\r\n }\r\n /**\r\n * Ensure urls are lower case and end with a / character.\r\n * @param url\r\n */\r\n static canonicalizeUri(url) {\r\n if (url) {\r\n let lowerCaseUrl = url.toLowerCase();\r\n if (StringUtils.endsWith(lowerCaseUrl, "?")) {\r\n lowerCaseUrl = lowerCaseUrl.slice(0, -1);\r\n }\r\n else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {\r\n lowerCaseUrl = lowerCaseUrl.slice(0, -2);\r\n }\r\n if (!StringUtils.endsWith(lowerCaseUrl, "/")) {\r\n lowerCaseUrl += "/";\r\n }\r\n return lowerCaseUrl;\r\n }\r\n return url;\r\n }\r\n /**\r\n * Throws if urlString passed is not a valid authority URI string.\r\n */\r\n validateAsUri() {\r\n // Attempts to parse url for uri components\r\n let components;\r\n try {\r\n components = this.getUrlComponents();\r\n }\r\n catch (e) {\r\n throw createClientConfigurationError(urlParseError);\r\n }\r\n // Throw error if URI or path segments are not parseable.\r\n if (!components.HostNameAndPort || !components.PathSegments) {\r\n throw createClientConfigurationError(urlParseError);\r\n }\r\n // Throw error if uri is insecure.\r\n if (!components.Protocol ||\r\n components.Protocol.toLowerCase() !== "https:") {\r\n throw createClientConfigurationError(authorityUriInsecure);\r\n }\r\n }\r\n /**\r\n * Given a url and a query string return the url with provided query string appended\r\n * @param url\r\n * @param queryString\r\n */\r\n static appendQueryString(url, queryString) {\r\n if (!queryString) {\r\n return url;\r\n }\r\n return url.indexOf("?") < 0\r\n ? `${url}?${queryString}`\r\n : `${url}&${queryString}`;\r\n }\r\n /**\r\n * Returns a url with the hash removed\r\n * @param url\r\n */\r\n static removeHashFromUrl(url) {\r\n return UrlString.canonicalizeUri(url.split("#")[0]);\r\n }\r\n /**\r\n * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d\r\n * @param href The url\r\n * @param tenantId The tenant id to replace\r\n */\r\n replaceTenantPath(tenantId) {\r\n const urlObject = this.getUrlComponents();\r\n const pathArray = urlObject.PathSegments;\r\n if (tenantId &&\r\n pathArray.length !== 0 &&\r\n (pathArray[0] === AADAuthorityConstants.COMMON ||\r\n pathArray[0] === AADAuthorityConstants.ORGANIZATIONS)) {\r\n pathArray[0] = tenantId;\r\n }\r\n return UrlString.constructAuthorityUriFromObject(urlObject);\r\n }\r\n /**\r\n * Parses out the components from a url string.\r\n * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.\r\n */\r\n getUrlComponents() {\r\n // https://gist.github.com/curtisz/11139b2cfcaef4a261e0\r\n const regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\\\?([^#]*))?(#(.*))?");\r\n // If url string does not match regEx, we throw an error\r\n const match = this.urlString.match(regEx);\r\n if (!match) {\r\n throw createClientConfigurationError(urlParseError);\r\n }\r\n // Url component object\r\n const urlComponents = {\r\n Protocol: match[1],\r\n HostNameAndPort: match[4],\r\n AbsolutePath: match[5],\r\n QueryString: match[7],\r\n };\r\n let pathSegments = urlComponents.AbsolutePath.split("/");\r\n pathSegments = pathSegments.filter((val) => val && val.length > 0); // remove empty elements\r\n urlComponents.PathSegments = pathSegments;\r\n if (urlComponents.QueryString &&\r\n urlComponents.QueryString.endsWith("/")) {\r\n urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);\r\n }\r\n return urlComponents;\r\n }\r\n static getDomainFromUrl(url) {\r\n const regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");\r\n const match = url.match(regEx);\r\n if (!match) {\r\n throw createClientConfigurationError(urlParseError);\r\n }\r\n return match[2];\r\n }\r\n static getAbsoluteUrl(relativeUrl, baseUrl) {\r\n if (relativeUrl[0] === Constants.FORWARD_SLASH) {\r\n const url = new UrlString(baseUrl);\r\n const baseComponents = url.getUrlComponents();\r\n return (baseComponents.Protocol +\r\n "//" +\r\n baseComponents.HostNameAndPort +\r\n relativeUrl);\r\n }\r\n return relativeUrl;\r\n }\r\n static constructAuthorityUriFromObject(urlObject) {\r\n return new UrlString(urlObject.Protocol +\r\n "//" +\r\n urlObject.HostNameAndPort +\r\n "/" +\r\n urlObject.PathSegments.join("/"));\r\n }\r\n /**\r\n * Check if the hash of the URL string contains known properties\r\n * @deprecated This API will be removed in a future version\r\n */\r\n static hashContainsKnownProperties(response) {\r\n return !!getDeserializedResponse(response);\r\n }\r\n}\n\n\n//# sourceMappingURL=UrlString.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/FunctionWrappers.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Wraps a function with a performance measurement.\r\n * Usage: invoke(functionToCall, performanceClient, "EventName", "correlationId")(...argsToPassToFunction)\r\n * @param callback\r\n * @param eventName\r\n * @param logger\r\n * @param telemetryClient\r\n * @param correlationId\r\n * @returns\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst invoke = (callback, eventName, logger, telemetryClient, correlationId) => {\r\n return (...args) => {\r\n logger.trace(`Executing function ${eventName}`);\r\n const inProgressEvent = telemetryClient?.startMeasurement(eventName, correlationId);\r\n if (correlationId) {\r\n // Track number of times this API is called in a single request\r\n const eventCount = eventName + "CallCount";\r\n telemetryClient?.incrementFields({ [eventCount]: 1 }, correlationId);\r\n }\r\n try {\r\n const result = callback(...args);\r\n inProgressEvent?.end({\r\n success: true,\r\n });\r\n logger.trace(`Returning result from ${eventName}`);\r\n return result;\r\n }\r\n catch (e) {\r\n logger.trace(`Error occurred in ${eventName}`);\r\n try {\r\n logger.trace(JSON.stringify(e));\r\n }\r\n catch (e) {\r\n logger.trace("Unable to print error message.");\r\n }\r\n inProgressEvent?.end({\r\n success: false,\r\n }, e);\r\n throw e;\r\n }\r\n };\r\n};\r\n/**\r\n * Wraps an async function with a performance measurement.\r\n * Usage: invokeAsync(functionToCall, performanceClient, "EventName", "correlationId")(...argsToPassToFunction)\r\n * @param callback\r\n * @param eventName\r\n * @param logger\r\n * @param telemetryClient\r\n * @param correlationId\r\n * @returns\r\n * @internal\r\n *\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst invokeAsync = (callback, eventName, logger, telemetryClient, correlationId) => {\r\n return (...args) => {\r\n logger.trace(`Executing function ${eventName}`);\r\n const inProgressEvent = telemetryClient?.startMeasurement(eventName, correlationId);\r\n if (correlationId) {\r\n // Track number of times this API is called in a single request\r\n const eventCount = eventName + "CallCount";\r\n telemetryClient?.incrementFields({ [eventCount]: 1 }, correlationId);\r\n }\r\n telemetryClient?.setPreQueueTime(eventName, correlationId);\r\n return callback(...args)\r\n .then((response) => {\r\n logger.trace(`Returning result from ${eventName}`);\r\n inProgressEvent?.end({\r\n success: true,\r\n });\r\n return response;\r\n })\r\n .catch((e) => {\r\n logger.trace(`Error occurred in ${eventName}`);\r\n try {\r\n logger.trace(JSON.stringify(e));\r\n }\r\n catch (e) {\r\n logger.trace("Unable to print error message.");\r\n }\r\n inProgressEvent?.end({\r\n success: false,\r\n }, e);\r\n throw e;\r\n });\r\n };\r\n};\n\n\n//# sourceMappingURL=FunctionWrappers.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/BrowserAuthErrorCodes.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst pkceNotCreated = "pkce_not_created";\r\nconst cryptoNonExistent = "crypto_nonexistent";\r\nconst emptyNavigateUri = "empty_navigate_uri";\r\nconst hashEmptyError = "hash_empty_error";\r\nconst noStateInHash = "no_state_in_hash";\r\nconst hashDoesNotContainKnownProperties = "hash_does_not_contain_known_properties";\r\nconst unableToParseState = "unable_to_parse_state";\r\nconst stateInteractionTypeMismatch = "state_interaction_type_mismatch";\r\nconst interactionInProgress = "interaction_in_progress";\r\nconst popupWindowError = "popup_window_error";\r\nconst emptyWindowError = "empty_window_error";\r\nconst userCancelled = "user_cancelled";\r\nconst monitorPopupTimeout = "monitor_popup_timeout";\r\nconst monitorWindowTimeout = "monitor_window_timeout";\r\nconst redirectInIframe = "redirect_in_iframe";\r\nconst blockIframeReload = "block_iframe_reload";\r\nconst blockNestedPopups = "block_nested_popups";\r\nconst iframeClosedPrematurely = "iframe_closed_prematurely";\r\nconst silentLogoutUnsupported = "silent_logout_unsupported";\r\nconst noAccountError = "no_account_error";\r\nconst silentPromptValueError = "silent_prompt_value_error";\r\nconst noTokenRequestCacheError = "no_token_request_cache_error";\r\nconst unableToParseTokenRequestCacheError = "unable_to_parse_token_request_cache_error";\r\nconst noCachedAuthorityError = "no_cached_authority_error";\r\nconst authRequestNotSetError = "auth_request_not_set_error";\r\nconst invalidCacheType = "invalid_cache_type";\r\nconst nonBrowserEnvironment = "non_browser_environment";\r\nconst databaseNotOpen = "database_not_open";\r\nconst BrowserAuthErrorCodes_noNetworkConnectivity = "no_network_connectivity";\r\nconst BrowserAuthErrorCodes_postRequestFailed = "post_request_failed";\r\nconst getRequestFailed = "get_request_failed";\r\nconst failedToParseResponse = "failed_to_parse_response";\r\nconst unableToLoadToken = "unable_to_load_token";\r\nconst cryptoKeyNotFound = "crypto_key_not_found";\r\nconst authCodeRequired = "auth_code_required";\r\nconst authCodeOrNativeAccountIdRequired = "auth_code_or_nativeAccountId_required";\r\nconst spaCodeAndNativeAccountIdPresent = "spa_code_and_nativeAccountId_present";\r\nconst databaseUnavailable = "database_unavailable";\r\nconst unableToAcquireTokenFromNativePlatform = "unable_to_acquire_token_from_native_platform";\r\nconst nativeHandshakeTimeout = "native_handshake_timeout";\r\nconst nativeExtensionNotInstalled = "native_extension_not_installed";\r\nconst nativeConnectionNotEstablished = "native_connection_not_established";\r\nconst uninitializedPublicClientApplication = "uninitialized_public_client_application";\r\nconst nativePromptNotSupported = "native_prompt_not_supported";\r\nconst invalidBase64String = "invalid_base64_string";\r\nconst invalidPopTokenRequest = "invalid_pop_token_request";\r\nconst failedToBuildHeaders = "failed_to_build_headers";\r\nconst failedToParseHeaders = "failed_to_parse_headers";\n\n\n//# sourceMappingURL=BrowserAuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/BrowserAuthError.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst ErrorLink = "For more visit: aka.ms/msaljs/browser-errors";\r\n/**\r\n * BrowserAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nconst BrowserAuthErrorMessages = {\r\n [pkceNotCreated]: "The PKCE code challenge and verifier could not be generated.",\r\n [cryptoNonExistent]: "The crypto object or function is not available.",\r\n [emptyNavigateUri]: "Navigation URI is empty. Please check stack trace for more info.",\r\n [hashEmptyError]: `Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. ${ErrorLink}`,\r\n [noStateInHash]: "Hash does not contain state. Please verify that the request originated from msal.",\r\n [hashDoesNotContainKnownProperties]: `Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. ${ErrorLink}`,\r\n [unableToParseState]: "Unable to parse state. Please verify that the request originated from msal.",\r\n [stateInteractionTypeMismatch]: "Hash contains state but the interaction type does not match the caller.",\r\n [interactionInProgress]: `Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API. ${ErrorLink}`,\r\n [popupWindowError]: "Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser.",\r\n [emptyWindowError]: "window.open returned null or undefined window object.",\r\n [userCancelled]: "User cancelled the flow.",\r\n [monitorPopupTimeout]: `Token acquisition in popup failed due to timeout. ${ErrorLink}`,\r\n [monitorWindowTimeout]: `Token acquisition in iframe failed due to timeout. ${ErrorLink}`,\r\n [redirectInIframe]: "Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs.",\r\n [blockIframeReload]: `Request was blocked inside an iframe because MSAL detected an authentication response. ${ErrorLink}`,\r\n [blockNestedPopups]: "Request was blocked inside a popup because MSAL detected it was running in a popup.",\r\n [iframeClosedPrematurely]: "The iframe being monitored was closed prematurely.",\r\n [silentLogoutUnsupported]: "Silent logout not supported. Please call logoutRedirect or logoutPopup instead.",\r\n [noAccountError]: "No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request.",\r\n [silentPromptValueError]: "The value given for the prompt value is not valid for silent requests - must be set to \'none\' or \'no_session\'.",\r\n [noTokenRequestCacheError]: "No token request found in cache.",\r\n [unableToParseTokenRequestCacheError]: "The cached token request could not be parsed.",\r\n [noCachedAuthorityError]: "No cached authority found.",\r\n [authRequestNotSetError]: "Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler",\r\n [invalidCacheType]: "Invalid cache type",\r\n [nonBrowserEnvironment]: "Login and token requests are not supported in non-browser environments.",\r\n [databaseNotOpen]: "Database is not open!",\r\n [BrowserAuthErrorCodes_noNetworkConnectivity]: "No network connectivity. Check your internet connection.",\r\n [BrowserAuthErrorCodes_postRequestFailed]: "Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type \'SPA\'",\r\n [getRequestFailed]: "Network request failed. Please check the network trace to determine root cause.",\r\n [failedToParseResponse]: "Failed to parse network response. Check network trace.",\r\n [unableToLoadToken]: "Error loading token to cache.",\r\n [cryptoKeyNotFound]: "Cryptographic Key or Keypair not found in browser storage.",\r\n [authCodeRequired]: "An authorization code must be provided (as the `code` property on the request) to this flow.",\r\n [authCodeOrNativeAccountIdRequired]: "An authorization code or nativeAccountId must be provided to this flow.",\r\n [spaCodeAndNativeAccountIdPresent]: "Request cannot contain both spa code and native account id.",\r\n [databaseUnavailable]: "IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts.",\r\n [unableToAcquireTokenFromNativePlatform]: `Unable to acquire token from native platform. ${ErrorLink}`,\r\n [nativeHandshakeTimeout]: "Timed out while attempting to establish connection to browser extension",\r\n [nativeExtensionNotInstalled]: "Native extension is not installed. If you think this is a mistake call the initialize function.",\r\n [nativeConnectionNotEstablished]: `Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). ${ErrorLink}`,\r\n [uninitializedPublicClientApplication]: `You must call and await the initialize function before attempting to call any other MSAL API. ${ErrorLink}`,\r\n [nativePromptNotSupported]: "The provided prompt is not supported by the native platform. This request should be routed to the web based flow.",\r\n [invalidBase64String]: "Invalid base64 encoded string.",\r\n [invalidPopTokenRequest]: "Invalid PoP token request. The request should not have both a popKid value and signPopToken set to true.",\r\n [failedToBuildHeaders]: "Failed to build request headers object.",\r\n [failedToParseHeaders]: "Failed to parse response headers",\r\n};\r\n/**\r\n * BrowserAuthErrorMessage class containing string constants used by error codes and messages.\r\n * @deprecated Use exported BrowserAuthErrorCodes instead.\r\n * In your app you can do :\r\n * ```\r\n * import { BrowserAuthErrorCodes } from "@azure/msal-browser";\r\n * ```\r\n */\r\nconst BrowserAuthErrorMessage = {\r\n pkceNotGenerated: {\r\n code: pkceNotCreated,\r\n desc: BrowserAuthErrorMessages[pkceNotCreated],\r\n },\r\n cryptoDoesNotExist: {\r\n code: cryptoNonExistent,\r\n desc: BrowserAuthErrorMessages[cryptoNonExistent],\r\n },\r\n emptyNavigateUriError: {\r\n code: emptyNavigateUri,\r\n desc: BrowserAuthErrorMessages[emptyNavigateUri],\r\n },\r\n hashEmptyError: {\r\n code: hashEmptyError,\r\n desc: BrowserAuthErrorMessages[hashEmptyError],\r\n },\r\n hashDoesNotContainStateError: {\r\n code: noStateInHash,\r\n desc: BrowserAuthErrorMessages[noStateInHash],\r\n },\r\n hashDoesNotContainKnownPropertiesError: {\r\n code: hashDoesNotContainKnownProperties,\r\n desc: BrowserAuthErrorMessages[hashDoesNotContainKnownProperties],\r\n },\r\n unableToParseStateError: {\r\n code: unableToParseState,\r\n desc: BrowserAuthErrorMessages[unableToParseState],\r\n },\r\n stateInteractionTypeMismatchError: {\r\n code: stateInteractionTypeMismatch,\r\n desc: BrowserAuthErrorMessages[stateInteractionTypeMismatch],\r\n },\r\n interactionInProgress: {\r\n code: interactionInProgress,\r\n desc: BrowserAuthErrorMessages[interactionInProgress],\r\n },\r\n popupWindowError: {\r\n code: popupWindowError,\r\n desc: BrowserAuthErrorMessages[popupWindowError],\r\n },\r\n emptyWindowError: {\r\n code: emptyWindowError,\r\n desc: BrowserAuthErrorMessages[emptyWindowError],\r\n },\r\n userCancelledError: {\r\n code: userCancelled,\r\n desc: BrowserAuthErrorMessages[userCancelled],\r\n },\r\n monitorPopupTimeoutError: {\r\n code: monitorPopupTimeout,\r\n desc: BrowserAuthErrorMessages[monitorPopupTimeout],\r\n },\r\n monitorIframeTimeoutError: {\r\n code: monitorWindowTimeout,\r\n desc: BrowserAuthErrorMessages[monitorWindowTimeout],\r\n },\r\n redirectInIframeError: {\r\n code: redirectInIframe,\r\n desc: BrowserAuthErrorMessages[redirectInIframe],\r\n },\r\n blockTokenRequestsInHiddenIframeError: {\r\n code: blockIframeReload,\r\n desc: BrowserAuthErrorMessages[blockIframeReload],\r\n },\r\n blockAcquireTokenInPopupsError: {\r\n code: blockNestedPopups,\r\n desc: BrowserAuthErrorMessages[blockNestedPopups],\r\n },\r\n iframeClosedPrematurelyError: {\r\n code: iframeClosedPrematurely,\r\n desc: BrowserAuthErrorMessages[iframeClosedPrematurely],\r\n },\r\n silentLogoutUnsupportedError: {\r\n code: silentLogoutUnsupported,\r\n desc: BrowserAuthErrorMessages[silentLogoutUnsupported],\r\n },\r\n noAccountError: {\r\n code: noAccountError,\r\n desc: BrowserAuthErrorMessages[noAccountError],\r\n },\r\n silentPromptValueError: {\r\n code: silentPromptValueError,\r\n desc: BrowserAuthErrorMessages[silentPromptValueError],\r\n },\r\n noTokenRequestCacheError: {\r\n code: noTokenRequestCacheError,\r\n desc: BrowserAuthErrorMessages[noTokenRequestCacheError],\r\n },\r\n unableToParseTokenRequestCacheError: {\r\n code: unableToParseTokenRequestCacheError,\r\n desc: BrowserAuthErrorMessages[unableToParseTokenRequestCacheError],\r\n },\r\n noCachedAuthorityError: {\r\n code: noCachedAuthorityError,\r\n desc: BrowserAuthErrorMessages[noCachedAuthorityError],\r\n },\r\n authRequestNotSet: {\r\n code: authRequestNotSetError,\r\n desc: BrowserAuthErrorMessages[authRequestNotSetError],\r\n },\r\n invalidCacheType: {\r\n code: invalidCacheType,\r\n desc: BrowserAuthErrorMessages[invalidCacheType],\r\n },\r\n notInBrowserEnvironment: {\r\n code: nonBrowserEnvironment,\r\n desc: BrowserAuthErrorMessages[nonBrowserEnvironment],\r\n },\r\n databaseNotOpen: {\r\n code: databaseNotOpen,\r\n desc: BrowserAuthErrorMessages[databaseNotOpen],\r\n },\r\n noNetworkConnectivity: {\r\n code: BrowserAuthErrorCodes_noNetworkConnectivity,\r\n desc: BrowserAuthErrorMessages[BrowserAuthErrorCodes_noNetworkConnectivity],\r\n },\r\n postRequestFailed: {\r\n code: BrowserAuthErrorCodes_postRequestFailed,\r\n desc: BrowserAuthErrorMessages[BrowserAuthErrorCodes_postRequestFailed],\r\n },\r\n getRequestFailed: {\r\n code: getRequestFailed,\r\n desc: BrowserAuthErrorMessages[getRequestFailed],\r\n },\r\n failedToParseNetworkResponse: {\r\n code: failedToParseResponse,\r\n desc: BrowserAuthErrorMessages[failedToParseResponse],\r\n },\r\n unableToLoadTokenError: {\r\n code: unableToLoadToken,\r\n desc: BrowserAuthErrorMessages[unableToLoadToken],\r\n },\r\n signingKeyNotFoundInStorage: {\r\n code: cryptoKeyNotFound,\r\n desc: BrowserAuthErrorMessages[cryptoKeyNotFound],\r\n },\r\n authCodeRequired: {\r\n code: authCodeRequired,\r\n desc: BrowserAuthErrorMessages[authCodeRequired],\r\n },\r\n authCodeOrNativeAccountRequired: {\r\n code: authCodeOrNativeAccountIdRequired,\r\n desc: BrowserAuthErrorMessages[authCodeOrNativeAccountIdRequired],\r\n },\r\n spaCodeAndNativeAccountPresent: {\r\n code: spaCodeAndNativeAccountIdPresent,\r\n desc: BrowserAuthErrorMessages[spaCodeAndNativeAccountIdPresent],\r\n },\r\n databaseUnavailable: {\r\n code: databaseUnavailable,\r\n desc: BrowserAuthErrorMessages[databaseUnavailable],\r\n },\r\n unableToAcquireTokenFromNativePlatform: {\r\n code: unableToAcquireTokenFromNativePlatform,\r\n desc: BrowserAuthErrorMessages[unableToAcquireTokenFromNativePlatform],\r\n },\r\n nativeHandshakeTimeout: {\r\n code: nativeHandshakeTimeout,\r\n desc: BrowserAuthErrorMessages[nativeHandshakeTimeout],\r\n },\r\n nativeExtensionNotInstalled: {\r\n code: nativeExtensionNotInstalled,\r\n desc: BrowserAuthErrorMessages[nativeExtensionNotInstalled],\r\n },\r\n nativeConnectionNotEstablished: {\r\n code: nativeConnectionNotEstablished,\r\n desc: BrowserAuthErrorMessages[nativeConnectionNotEstablished],\r\n },\r\n uninitializedPublicClientApplication: {\r\n code: uninitializedPublicClientApplication,\r\n desc: BrowserAuthErrorMessages[uninitializedPublicClientApplication],\r\n },\r\n nativePromptNotSupported: {\r\n code: nativePromptNotSupported,\r\n desc: BrowserAuthErrorMessages[nativePromptNotSupported],\r\n },\r\n invalidBase64StringError: {\r\n code: invalidBase64String,\r\n desc: BrowserAuthErrorMessages[invalidBase64String],\r\n },\r\n invalidPopTokenRequest: {\r\n code: invalidPopTokenRequest,\r\n desc: BrowserAuthErrorMessages[invalidPopTokenRequest],\r\n },\r\n};\r\n/**\r\n * Browser library error class thrown by the MSAL.js library for SPAs\r\n */\r\nclass BrowserAuthError extends AuthError {\r\n constructor(errorCode, subError) {\r\n super(errorCode, BrowserAuthErrorMessages[errorCode], subError);\r\n Object.setPrototypeOf(this, BrowserAuthError.prototype);\r\n this.name = "BrowserAuthError";\r\n }\r\n}\r\nfunction createBrowserAuthError(errorCode, subError) {\r\n return new BrowserAuthError(errorCode, subError);\r\n}\n\n\n//# sourceMappingURL=BrowserAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/utils/BrowserConstants.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Constants\r\n */\r\nconst BrowserConstants = {\r\n /**\r\n * Interaction in progress cache value\r\n */\r\n INTERACTION_IN_PROGRESS_VALUE: "interaction_in_progress",\r\n /**\r\n * Invalid grant error code\r\n */\r\n INVALID_GRANT_ERROR: "invalid_grant",\r\n /**\r\n * Default popup window width\r\n */\r\n POPUP_WIDTH: 483,\r\n /**\r\n * Default popup window height\r\n */\r\n POPUP_HEIGHT: 600,\r\n /**\r\n * Name of the popup window starts with\r\n */\r\n POPUP_NAME_PREFIX: "msal",\r\n /**\r\n * Default popup monitor poll interval in milliseconds\r\n */\r\n DEFAULT_POLL_INTERVAL_MS: 30,\r\n /**\r\n * Msal-browser SKU\r\n */\r\n MSAL_SKU: "msal.js.browser",\r\n};\r\nconst NativeConstants = {\r\n CHANNEL_ID: "53ee284d-920a-4b59-9d30-a60315b26836",\r\n PREFERRED_EXTENSION_ID: "ppnbnpeolgkicgegkbkbjmhlideopiji",\r\n MATS_TELEMETRY: "MATS",\r\n};\r\nconst NativeExtensionMethod = {\r\n HandshakeRequest: "Handshake",\r\n HandshakeResponse: "HandshakeResponse",\r\n GetToken: "GetToken",\r\n Response: "Response",\r\n};\r\nconst BrowserCacheLocation = {\r\n LocalStorage: "localStorage",\r\n SessionStorage: "sessionStorage",\r\n MemoryStorage: "memoryStorage",\r\n};\r\n/**\r\n * HTTP Request types supported by MSAL.\r\n */\r\nconst HTTP_REQUEST_TYPE = {\r\n GET: "GET",\r\n POST: "POST",\r\n};\r\n/**\r\n * Temporary cache keys for MSAL, deleted after any request.\r\n */\r\nconst TemporaryCacheKeys = {\r\n AUTHORITY: "authority",\r\n ACQUIRE_TOKEN_ACCOUNT: "acquireToken.account",\r\n SESSION_STATE: "session.state",\r\n REQUEST_STATE: "request.state",\r\n NONCE_IDTOKEN: "nonce.id_token",\r\n ORIGIN_URI: "request.origin",\r\n RENEW_STATUS: "token.renew.status",\r\n URL_HASH: "urlHash",\r\n REQUEST_PARAMS: "request.params",\r\n SCOPES: "scopes",\r\n INTERACTION_STATUS_KEY: "interaction.status",\r\n CCS_CREDENTIAL: "ccs.credential",\r\n CORRELATION_ID: "request.correlationId",\r\n NATIVE_REQUEST: "request.native",\r\n REDIRECT_CONTEXT: "request.redirect.context",\r\n};\r\nconst StaticCacheKeys = {\r\n ACCOUNT_KEYS: "msal.account.keys",\r\n TOKEN_KEYS: "msal.token.keys",\r\n};\r\n/**\r\n * Cache keys stored in-memory\r\n */\r\nconst InMemoryCacheKeys = {\r\n WRAPPER_SKU: "wrapper.sku",\r\n WRAPPER_VER: "wrapper.version",\r\n};\r\n/**\r\n * API Codes for Telemetry purposes.\r\n * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs\r\n * 0-99 Silent Flow\r\n * 800-899 Auth Code Flow\r\n */\r\nconst ApiId = {\r\n acquireTokenRedirect: 861,\r\n acquireTokenPopup: 862,\r\n ssoSilent: 863,\r\n acquireTokenSilent_authCode: 864,\r\n handleRedirectPromise: 865,\r\n acquireTokenByCode: 866,\r\n acquireTokenSilent_silentFlow: 61,\r\n logout: 961,\r\n logoutPopup: 962,\r\n};\r\n/*\r\n * Interaction type of the API - used for state and telemetry\r\n */\r\nvar InteractionType;\r\n(function (InteractionType) {\r\n InteractionType["Redirect"] = "redirect";\r\n InteractionType["Popup"] = "popup";\r\n InteractionType["Silent"] = "silent";\r\n InteractionType["None"] = "none";\r\n})(InteractionType || (InteractionType = {}));\r\n/**\r\n * Types of interaction currently in progress.\r\n * Used in events in wrapper libraries to invoke functions when certain interaction is in progress or all interactions are complete.\r\n */\r\nconst InteractionStatus = {\r\n /**\r\n * Initial status before interaction occurs\r\n */\r\n Startup: "startup",\r\n /**\r\n * Status set when all login calls occuring\r\n */\r\n Login: "login",\r\n /**\r\n * Status set when logout call occuring\r\n */\r\n Logout: "logout",\r\n /**\r\n * Status set for acquireToken calls\r\n */\r\n AcquireToken: "acquireToken",\r\n /**\r\n * Status set for ssoSilent calls\r\n */\r\n SsoSilent: "ssoSilent",\r\n /**\r\n * Status set when handleRedirect in progress\r\n */\r\n HandleRedirect: "handleRedirect",\r\n /**\r\n * Status set when interaction is complete\r\n */\r\n None: "none",\r\n};\r\nconst DEFAULT_REQUEST = {\r\n scopes: OIDC_DEFAULT_SCOPES,\r\n};\r\n/**\r\n * JWK Key Format string (Type MUST be defined for window crypto APIs)\r\n */\r\nconst KEY_FORMAT_JWK = "jwk";\r\n// Supported wrapper SKUs\r\nconst WrapperSKU = {\r\n React: "@azure/msal-react",\r\n Angular: "@azure/msal-angular",\r\n};\r\n// DatabaseStorage Constants\r\nconst DB_NAME = "msal.db";\r\nconst DB_VERSION = 1;\r\nconst DB_TABLE_NAME = `${DB_NAME}.keys`;\r\nconst CacheLookupPolicy = {\r\n /*\r\n * acquireTokenSilent will attempt to retrieve an access token from the cache. If the access token is expired\r\n * or cannot be found the refresh token will be used to acquire a new one. Finally, if the refresh token\r\n * is expired acquireTokenSilent will attempt to acquire new access and refresh tokens.\r\n */\r\n Default: 0,\r\n /*\r\n * acquireTokenSilent will only look for access tokens in the cache. It will not attempt to renew access or\r\n * refresh tokens.\r\n */\r\n AccessToken: 1,\r\n /*\r\n * acquireTokenSilent will attempt to retrieve an access token from the cache. If the access token is expired or\r\n * cannot be found, the refresh token will be used to acquire a new one. If the refresh token is expired, it\r\n * will not be renewed and acquireTokenSilent will fail.\r\n */\r\n AccessTokenAndRefreshToken: 2,\r\n /*\r\n * acquireTokenSilent will not attempt to retrieve access tokens from the cache and will instead attempt to\r\n * exchange the cached refresh token for a new access token. If the refresh token is expired, it will not be\r\n * renewed and acquireTokenSilent will fail.\r\n */\r\n RefreshToken: 3,\r\n /*\r\n * acquireTokenSilent will not look in the cache for the access token. It will go directly to network with the\r\n * cached refresh token. If the refresh token is expired an attempt will be made to renew it. This is equivalent to\r\n * setting "forceRefresh: true".\r\n */\r\n RefreshTokenAndNetwork: 4,\r\n /*\r\n * acquireTokenSilent will attempt to renew both access and refresh tokens. It will not look in the cache. This will\r\n * always fail if 3rd party cookies are blocked by the browser.\r\n */\r\n Skip: 5,\r\n};\r\nconst iFrameRenewalPolicies = [\r\n CacheLookupPolicy.Default,\r\n CacheLookupPolicy.Skip,\r\n CacheLookupPolicy.RefreshTokenAndNetwork,\r\n];\r\nconst LOG_LEVEL_CACHE_KEY = "msal.browser.log.level";\r\nconst LOG_PII_CACHE_KEY = "msal.browser.log.pii";\r\nconst BROWSER_PERF_ENABLED_KEY = "msal.browser.performance.enabled";\n\n\n//# sourceMappingURL=BrowserConstants.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/telemetry/performance/PerformanceEvent.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.\r\n *\r\n * @export\r\n * @enum {number}\r\n */\r\nconst PerformanceEvents = {\r\n /**\r\n * acquireTokenByCode API (msal-browser and msal-node).\r\n * Used to acquire tokens by trading an authorization code against the token endpoint.\r\n */\r\n AcquireTokenByCode: "acquireTokenByCode",\r\n /**\r\n * acquireTokenByRefreshToken API (msal-browser and msal-node).\r\n * Used to renew an access token using a refresh token against the token endpoint.\r\n */\r\n AcquireTokenByRefreshToken: "acquireTokenByRefreshToken",\r\n /**\r\n * acquireTokenSilent API (msal-browser and msal-node).\r\n * Used to silently acquire a new access token (from the cache or the network).\r\n */\r\n AcquireTokenSilent: "acquireTokenSilent",\r\n /**\r\n * acquireTokenSilentAsync (msal-browser).\r\n * Internal API for acquireTokenSilent.\r\n */\r\n AcquireTokenSilentAsync: "acquireTokenSilentAsync",\r\n /**\r\n * acquireTokenPopup (msal-browser).\r\n * Used to acquire a new access token interactively through pop ups\r\n */\r\n AcquireTokenPopup: "acquireTokenPopup",\r\n /**\r\n * acquireTokenPreRedirect (msal-browser).\r\n * First part of the redirect flow.\r\n * Used to acquire a new access token interactively through redirects.\r\n */\r\n AcquireTokenPreRedirect: "acquireTokenPreRedirect",\r\n /**\r\n * acquireTokenRedirect (msal-browser).\r\n * Second part of the redirect flow.\r\n * Used to acquire a new access token interactively through redirects.\r\n */\r\n AcquireTokenRedirect: "acquireTokenRedirect",\r\n /**\r\n * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).\r\n * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.\r\n */\r\n CryptoOptsGetPublicKeyThumbprint: "cryptoOptsGetPublicKeyThumbprint",\r\n /**\r\n * signJwt API in CryptoOpts class (msal-browser).\r\n * Used to signed a pop token.\r\n */\r\n CryptoOptsSignJwt: "cryptoOptsSignJwt",\r\n /**\r\n * acquireToken API in the SilentCacheClient class (msal-browser).\r\n * Used to read access tokens from the cache.\r\n */\r\n SilentCacheClientAcquireToken: "silentCacheClientAcquireToken",\r\n /**\r\n * acquireToken API in the SilentIframeClient class (msal-browser).\r\n * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.\r\n */\r\n SilentIframeClientAcquireToken: "silentIframeClientAcquireToken",\r\n AwaitConcurrentIframe: "awaitConcurrentIframe",\r\n /**\r\n * acquireToken API in SilentRereshClient (msal-browser).\r\n * Used to acquire a new set of tokens from the token endpoint using a refresh token.\r\n */\r\n SilentRefreshClientAcquireToken: "silentRefreshClientAcquireToken",\r\n /**\r\n * ssoSilent API (msal-browser).\r\n * Used to silently acquire an authorization code and set of tokens using a hidden iframe.\r\n */\r\n SsoSilent: "ssoSilent",\r\n /**\r\n * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).\r\n * Used to load authority metadata for a request.\r\n */\r\n StandardInteractionClientGetDiscoveredAuthority: "standardInteractionClientGetDiscoveredAuthority",\r\n /**\r\n * acquireToken APIs in msal-browser.\r\n * Used to make an /authorize endpoint call with native brokering enabled.\r\n */\r\n FetchAccountIdWithNativeBroker: "fetchAccountIdWithNativeBroker",\r\n /**\r\n * acquireToken API in NativeInteractionClient class (msal-browser).\r\n * Used to acquire a token from Native component when native brokering is enabled.\r\n */\r\n NativeInteractionClientAcquireToken: "nativeInteractionClientAcquireToken",\r\n /**\r\n * Time spent creating default headers for requests to token endpoint\r\n */\r\n BaseClientCreateTokenRequestHeaders: "baseClientCreateTokenRequestHeaders",\r\n /**\r\n * Time spent sending/waiting for the response of a request to the token endpoint\r\n */\r\n NetworkClientSendPostRequestAsync: "networkClientSendPostRequestAsync",\r\n RefreshTokenClientExecutePostToTokenEndpoint: "refreshTokenClientExecutePostToTokenEndpoint",\r\n AuthorizationCodeClientExecutePostToTokenEndpoint: "authorizationCodeClientExecutePostToTokenEndpoint",\r\n /**\r\n * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).\r\n */\r\n BrokerHandhshake: "brokerHandshake",\r\n /**\r\n * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .\r\n */\r\n AcquireTokenByRefreshTokenInBroker: "acquireTokenByRefreshTokenInBroker",\r\n /**\r\n * Time taken for token acquisition by broker\r\n */\r\n AcquireTokenByBroker: "acquireTokenByBroker",\r\n /**\r\n * Time spent on the network for refresh token acquisition\r\n */\r\n RefreshTokenClientExecuteTokenRequest: "refreshTokenClientExecuteTokenRequest",\r\n /**\r\n * Time taken for acquiring refresh token , records RT size\r\n */\r\n RefreshTokenClientAcquireToken: "refreshTokenClientAcquireToken",\r\n /**\r\n * Time taken for acquiring cached refresh token\r\n */\r\n RefreshTokenClientAcquireTokenWithCachedRefreshToken: "refreshTokenClientAcquireTokenWithCachedRefreshToken",\r\n /**\r\n * acquireTokenByRefreshToken API in RefreshTokenClient (msal-common).\r\n */\r\n RefreshTokenClientAcquireTokenByRefreshToken: "refreshTokenClientAcquireTokenByRefreshToken",\r\n /**\r\n * Helper function to create token request body in RefreshTokenClient (msal-common).\r\n */\r\n RefreshTokenClientCreateTokenRequestBody: "refreshTokenClientCreateTokenRequestBody",\r\n /**\r\n * acquireTokenFromCache (msal-browser).\r\n * Internal API for acquiring token from cache\r\n */\r\n AcquireTokenFromCache: "acquireTokenFromCache",\r\n SilentFlowClientAcquireCachedToken: "silentFlowClientAcquireCachedToken",\r\n SilentFlowClientGenerateResultFromCacheRecord: "silentFlowClientGenerateResultFromCacheRecord",\r\n /**\r\n * acquireTokenBySilentIframe (msal-browser).\r\n * Internal API for acquiring token by silent Iframe\r\n */\r\n AcquireTokenBySilentIframe: "acquireTokenBySilentIframe",\r\n /**\r\n * Internal API for initializing base request in BaseInteractionClient (msal-browser)\r\n */\r\n InitializeBaseRequest: "initializeBaseRequest",\r\n /**\r\n * Internal API for initializing silent request in SilentCacheClient (msal-browser)\r\n */\r\n InitializeSilentRequest: "initializeSilentRequest",\r\n InitializeClientApplication: "initializeClientApplication",\r\n /**\r\n * Helper function in SilentIframeClient class (msal-browser).\r\n */\r\n SilentIframeClientTokenHelper: "silentIframeClientTokenHelper",\r\n /**\r\n * SilentHandler\r\n */\r\n SilentHandlerInitiateAuthRequest: "silentHandlerInitiateAuthRequest",\r\n SilentHandlerMonitorIframeForHash: "silentHandlerMonitorIframeForHash",\r\n SilentHandlerLoadFrame: "silentHandlerLoadFrame",\r\n SilentHandlerLoadFrameSync: "silentHandlerLoadFrameSync",\r\n /**\r\n * Helper functions in StandardInteractionClient class (msal-browser)\r\n */\r\n StandardInteractionClientCreateAuthCodeClient: "standardInteractionClientCreateAuthCodeClient",\r\n StandardInteractionClientGetClientConfiguration: "standardInteractionClientGetClientConfiguration",\r\n StandardInteractionClientInitializeAuthorizationRequest: "standardInteractionClientInitializeAuthorizationRequest",\r\n StandardInteractionClientInitializeAuthorizationCodeRequest: "standardInteractionClientInitializeAuthorizationCodeRequest",\r\n /**\r\n * getAuthCodeUrl API (msal-browser and msal-node).\r\n */\r\n GetAuthCodeUrl: "getAuthCodeUrl",\r\n /**\r\n * Functions from InteractionHandler (msal-browser)\r\n */\r\n HandleCodeResponseFromServer: "handleCodeResponseFromServer",\r\n HandleCodeResponse: "handleCodeResponse",\r\n UpdateTokenEndpointAuthority: "updateTokenEndpointAuthority",\r\n /**\r\n * APIs in Authorization Code Client (msal-common)\r\n */\r\n AuthClientAcquireToken: "authClientAcquireToken",\r\n AuthClientExecuteTokenRequest: "authClientExecuteTokenRequest",\r\n AuthClientCreateTokenRequestBody: "authClientCreateTokenRequestBody",\r\n AuthClientCreateQueryString: "authClientCreateQueryString",\r\n /**\r\n * Generate functions in PopTokenGenerator (msal-common)\r\n */\r\n PopTokenGenerateCnf: "popTokenGenerateCnf",\r\n PopTokenGenerateKid: "popTokenGenerateKid",\r\n /**\r\n * handleServerTokenResponse API in ResponseHandler (msal-common)\r\n */\r\n HandleServerTokenResponse: "handleServerTokenResponse",\r\n DeserializeResponse: "deserializeResponse",\r\n /**\r\n * Authority functions\r\n */\r\n AuthorityFactoryCreateDiscoveredInstance: "authorityFactoryCreateDiscoveredInstance",\r\n AuthorityResolveEndpointsAsync: "authorityResolveEndpointsAsync",\r\n AuthorityResolveEndpointsFromLocalSources: "authorityResolveEndpointsFromLocalSources",\r\n AuthorityGetCloudDiscoveryMetadataFromNetwork: "authorityGetCloudDiscoveryMetadataFromNetwork",\r\n AuthorityUpdateCloudDiscoveryMetadata: "authorityUpdateCloudDiscoveryMetadata",\r\n AuthorityGetEndpointMetadataFromNetwork: "authorityGetEndpointMetadataFromNetwork",\r\n AuthorityUpdateEndpointMetadata: "authorityUpdateEndpointMetadata",\r\n AuthorityUpdateMetadataWithRegionalInformation: "authorityUpdateMetadataWithRegionalInformation",\r\n /**\r\n * Region Discovery functions\r\n */\r\n RegionDiscoveryDetectRegion: "regionDiscoveryDetectRegion",\r\n RegionDiscoveryGetRegionFromIMDS: "regionDiscoveryGetRegionFromIMDS",\r\n RegionDiscoveryGetCurrentVersion: "regionDiscoveryGetCurrentVersion",\r\n AcquireTokenByCodeAsync: "acquireTokenByCodeAsync",\r\n GetEndpointMetadataFromNetwork: "getEndpointMetadataFromNetwork",\r\n GetCloudDiscoveryMetadataFromNetworkMeasurement: "getCloudDiscoveryMetadataFromNetworkMeasurement",\r\n HandleRedirectPromiseMeasurement: "handleRedirectPromise",\r\n HandleNativeRedirectPromiseMeasurement: "handleNativeRedirectPromise",\r\n UpdateCloudDiscoveryMetadataMeasurement: "updateCloudDiscoveryMetadataMeasurement",\r\n UsernamePasswordClientAcquireToken: "usernamePasswordClientAcquireToken",\r\n NativeMessageHandlerHandshake: "nativeMessageHandlerHandshake",\r\n NativeGenerateAuthResult: "nativeGenerateAuthResult",\r\n RemoveHiddenIframe: "removeHiddenIframe",\r\n /**\r\n * Cache operations\r\n */\r\n ClearTokensAndKeysWithClaims: "clearTokensAndKeysWithClaims",\r\n CacheManagerGetRefreshToken: "cacheManagerGetRefreshToken",\r\n /**\r\n * Crypto Operations\r\n */\r\n GeneratePkceCodes: "generatePkceCodes",\r\n GenerateCodeVerifier: "generateCodeVerifier",\r\n GenerateCodeChallengeFromVerifier: "generateCodeChallengeFromVerifier",\r\n Sha256Digest: "sha256Digest",\r\n GetRandomValues: "getRandomValues",\r\n};\r\nconst PerformanceEventAbbreviations = new Map([\r\n [PerformanceEvents.AcquireTokenByCode, "ATByCode"],\r\n [PerformanceEvents.AcquireTokenByRefreshToken, "ATByRT"],\r\n [PerformanceEvents.AcquireTokenSilent, "ATS"],\r\n [PerformanceEvents.AcquireTokenSilentAsync, "ATSAsync"],\r\n [PerformanceEvents.AcquireTokenPopup, "ATPopup"],\r\n [PerformanceEvents.AcquireTokenRedirect, "ATRedirect"],\r\n [\r\n PerformanceEvents.CryptoOptsGetPublicKeyThumbprint,\r\n "CryptoGetPKThumb",\r\n ],\r\n [PerformanceEvents.CryptoOptsSignJwt, "CryptoSignJwt"],\r\n [PerformanceEvents.SilentCacheClientAcquireToken, "SltCacheClientAT"],\r\n [PerformanceEvents.SilentIframeClientAcquireToken, "SltIframeClientAT"],\r\n [PerformanceEvents.SilentRefreshClientAcquireToken, "SltRClientAT"],\r\n [PerformanceEvents.SsoSilent, "SsoSlt"],\r\n [\r\n PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority,\r\n "StdIntClientGetDiscAuth",\r\n ],\r\n [\r\n PerformanceEvents.FetchAccountIdWithNativeBroker,\r\n "FetchAccIdWithNtvBroker",\r\n ],\r\n [\r\n PerformanceEvents.NativeInteractionClientAcquireToken,\r\n "NtvIntClientAT",\r\n ],\r\n [\r\n PerformanceEvents.BaseClientCreateTokenRequestHeaders,\r\n "BaseClientCreateTReqHead",\r\n ],\r\n [\r\n PerformanceEvents.NetworkClientSendPostRequestAsync,\r\n "NetClientSendPost",\r\n ],\r\n [\r\n PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint,\r\n "RTClientExecPost",\r\n ],\r\n [\r\n PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint,\r\n "AuthCodeClientExecPost",\r\n ],\r\n [PerformanceEvents.BrokerHandhshake, "BrokerHandshake"],\r\n [\r\n PerformanceEvents.AcquireTokenByRefreshTokenInBroker,\r\n "ATByRTInBroker",\r\n ],\r\n [PerformanceEvents.AcquireTokenByBroker, "ATByBroker"],\r\n [\r\n PerformanceEvents.RefreshTokenClientExecuteTokenRequest,\r\n "RTClientExecTReq",\r\n ],\r\n [PerformanceEvents.RefreshTokenClientAcquireToken, "RTClientAT"],\r\n [\r\n PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken,\r\n "RTClientATWithCachedRT",\r\n ],\r\n [\r\n PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken,\r\n "RTClientATByRT",\r\n ],\r\n [\r\n PerformanceEvents.RefreshTokenClientCreateTokenRequestBody,\r\n "RTClientCreateTReqBody",\r\n ],\r\n [PerformanceEvents.AcquireTokenFromCache, "ATFromCache"],\r\n [\r\n PerformanceEvents.SilentFlowClientAcquireCachedToken,\r\n "SltFlowClientATCached",\r\n ],\r\n [\r\n PerformanceEvents.SilentFlowClientGenerateResultFromCacheRecord,\r\n "SltFlowClientGenResFromCache",\r\n ],\r\n [PerformanceEvents.AcquireTokenBySilentIframe, "ATBySltIframe"],\r\n [PerformanceEvents.InitializeBaseRequest, "InitBaseReq"],\r\n [PerformanceEvents.InitializeSilentRequest, "InitSltReq"],\r\n [\r\n PerformanceEvents.InitializeClientApplication,\r\n "InitClientApplication",\r\n ],\r\n [PerformanceEvents.SilentIframeClientTokenHelper, "SIClientTHelper"],\r\n [\r\n PerformanceEvents.SilentHandlerInitiateAuthRequest,\r\n "SHandlerInitAuthReq",\r\n ],\r\n [\r\n PerformanceEvents.SilentHandlerMonitorIframeForHash,\r\n "SltHandlerMonitorIframeForHash",\r\n ],\r\n [PerformanceEvents.SilentHandlerLoadFrame, "SHandlerLoadFrame"],\r\n [PerformanceEvents.SilentHandlerLoadFrameSync, "SHandlerLoadFrameSync"],\r\n [\r\n PerformanceEvents.StandardInteractionClientCreateAuthCodeClient,\r\n "StdIntClientCreateAuthCodeClient",\r\n ],\r\n [\r\n PerformanceEvents.StandardInteractionClientGetClientConfiguration,\r\n "StdIntClientGetClientConf",\r\n ],\r\n [\r\n PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest,\r\n "StdIntClientInitAuthReq",\r\n ],\r\n [\r\n PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest,\r\n "StdIntClientInitAuthCodeReq",\r\n ],\r\n [PerformanceEvents.GetAuthCodeUrl, "GetAuthCodeUrl"],\r\n [\r\n PerformanceEvents.HandleCodeResponseFromServer,\r\n "HandleCodeResFromServer",\r\n ],\r\n [PerformanceEvents.HandleCodeResponse, "HandleCodeResp"],\r\n [PerformanceEvents.UpdateTokenEndpointAuthority, "UpdTEndpointAuth"],\r\n [PerformanceEvents.AuthClientAcquireToken, "AuthClientAT"],\r\n [PerformanceEvents.AuthClientExecuteTokenRequest, "AuthClientExecTReq"],\r\n [\r\n PerformanceEvents.AuthClientCreateTokenRequestBody,\r\n "AuthClientCreateTReqBody",\r\n ],\r\n [\r\n PerformanceEvents.AuthClientCreateQueryString,\r\n "AuthClientCreateQueryStr",\r\n ],\r\n [PerformanceEvents.PopTokenGenerateCnf, "PopTGenCnf"],\r\n [PerformanceEvents.PopTokenGenerateKid, "PopTGenKid"],\r\n [PerformanceEvents.HandleServerTokenResponse, "HandleServerTRes"],\r\n [PerformanceEvents.DeserializeResponse, "DeserializeRes"],\r\n [\r\n PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance,\r\n "AuthFactCreateDiscInst",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityResolveEndpointsAsync,\r\n "AuthResolveEndpointsAsync",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityResolveEndpointsFromLocalSources,\r\n "AuthResolveEndpointsFromLocal",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityGetCloudDiscoveryMetadataFromNetwork,\r\n "AuthGetCDMetaFromNet",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityUpdateCloudDiscoveryMetadata,\r\n "AuthUpdCDMeta",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityGetEndpointMetadataFromNetwork,\r\n "AuthUpdCDMetaFromNet",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityUpdateEndpointMetadata,\r\n "AuthUpdEndpointMeta",\r\n ],\r\n [\r\n PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation,\r\n "AuthUpdMetaWithRegInfo",\r\n ],\r\n [PerformanceEvents.RegionDiscoveryDetectRegion, "RegDiscDetectReg"],\r\n [\r\n PerformanceEvents.RegionDiscoveryGetRegionFromIMDS,\r\n "RegDiscGetRegFromIMDS",\r\n ],\r\n [\r\n PerformanceEvents.RegionDiscoveryGetCurrentVersion,\r\n "RegDiscGetCurrentVer",\r\n ],\r\n [PerformanceEvents.AcquireTokenByCodeAsync, "ATByCodeAsync"],\r\n [\r\n PerformanceEvents.GetEndpointMetadataFromNetwork,\r\n "GetEndpointMetaFromNet",\r\n ],\r\n [\r\n PerformanceEvents.GetCloudDiscoveryMetadataFromNetworkMeasurement,\r\n "GetCDMetaFromNet",\r\n ],\r\n [\r\n PerformanceEvents.HandleRedirectPromiseMeasurement,\r\n "HandleRedirectPromise",\r\n ],\r\n [\r\n PerformanceEvents.HandleNativeRedirectPromiseMeasurement,\r\n "HandleNtvRedirectPromise",\r\n ],\r\n [\r\n PerformanceEvents.UpdateCloudDiscoveryMetadataMeasurement,\r\n "UpdateCDMeta",\r\n ],\r\n [\r\n PerformanceEvents.UsernamePasswordClientAcquireToken,\r\n "UserPassClientAT",\r\n ],\r\n [\r\n PerformanceEvents.NativeMessageHandlerHandshake,\r\n "NtvMsgHandlerHandshake",\r\n ],\r\n [PerformanceEvents.NativeGenerateAuthResult, "NtvGenAuthRes"],\r\n [PerformanceEvents.RemoveHiddenIframe, "RemoveHiddenIframe"],\r\n [\r\n PerformanceEvents.ClearTokensAndKeysWithClaims,\r\n "ClearTAndKeysWithClaims",\r\n ],\r\n [PerformanceEvents.CacheManagerGetRefreshToken, "CacheManagerGetRT"],\r\n [PerformanceEvents.GeneratePkceCodes, "GenPkceCodes"],\r\n [PerformanceEvents.GenerateCodeVerifier, "GenCodeVerifier"],\r\n [\r\n PerformanceEvents.GenerateCodeChallengeFromVerifier,\r\n "GenCodeChallengeFromVerifier",\r\n ],\r\n [PerformanceEvents.Sha256Digest, "Sha256Digest"],\r\n [PerformanceEvents.GetRandomValues, "GetRandomValues"],\r\n]);\r\n/**\r\n * State of the performance event.\r\n *\r\n * @export\r\n * @enum {number}\r\n */\r\nconst PerformanceEventStatus = {\r\n NotStarted: 0,\r\n InProgress: 1,\r\n Completed: 2,\r\n};\r\nconst IntFields = new Set([\r\n "accessTokenSize",\r\n "durationMs",\r\n "idTokenSize",\r\n "matsSilentStatus",\r\n "matsHttpStatus",\r\n "refreshTokenSize",\r\n "queuedTimeMs",\r\n "startTimeMs",\r\n "status",\r\n "multiMatchedAT",\r\n "multiMatchedID",\r\n "multiMatchedRT",\r\n]);\n\n\n//# sourceMappingURL=PerformanceEvent.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/encode/Base64Encode.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Class which exposes APIs to encode plaintext to base64 encoded string. See here for implementation details:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript\'s_UTF-16_%3E_UTF-8_%3E_base64\r\n */\r\n/**\r\n * Returns URL Safe b64 encoded string from a plaintext string.\r\n * @param input\r\n */\r\nfunction urlEncode(input) {\r\n return encodeURIComponent(base64Encode(input)\r\n .replace(/=/g, "")\r\n .replace(/\\+/g, "-")\r\n .replace(/\\//g, "_"));\r\n}\r\n/**\r\n * Returns URL Safe b64 encoded string from an int8Array.\r\n * @param inputArr\r\n */\r\nfunction urlEncodeArr(inputArr) {\r\n return base64EncArr(inputArr)\r\n .replace(/=/g, "")\r\n .replace(/\\+/g, "-")\r\n .replace(/\\//g, "_");\r\n}\r\n/**\r\n * Returns b64 encoded string from plaintext string.\r\n * @param input\r\n */\r\nfunction base64Encode(input) {\r\n return base64EncArr(new TextEncoder().encode(input));\r\n}\r\n/**\r\n * Base64 encode byte array\r\n * @param aBytes\r\n */\r\nfunction base64EncArr(aBytes) {\r\n const binString = Array.from(aBytes, (x) => String.fromCodePoint(x)).join("");\r\n return btoa(binString);\r\n}\n\n\n//# sourceMappingURL=Base64Encode.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/crypto/BrowserCrypto.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This file defines functions used by the browser library to perform cryptography operations such as\r\n * hashing and encoding. It also has helper functions to validate the availability of specific APIs.\r\n */\r\n/**\r\n * See here for more info on RsaHashedKeyGenParams: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams\r\n */\r\n// RSA KeyGen Algorithm\r\nconst PKCS1_V15_KEYGEN_ALG = "RSASSA-PKCS1-v1_5";\r\n// SHA-256 hashing algorithm\r\nconst S256_HASH_ALG = "SHA-256";\r\n// MOD length for PoP tokens\r\nconst MODULUS_LENGTH = 2048;\r\n// Public Exponent\r\nconst PUBLIC_EXPONENT = new Uint8Array([0x01, 0x00, 0x01]);\r\n// UUID hex digits\r\nconst UUID_CHARS = "0123456789abcdef";\r\n// Array to store UINT32 random value\r\nconst UINT32_ARR = new Uint32Array(1);\r\nconst SUBTLE_SUBERROR = "crypto_subtle_undefined";\r\nconst keygenAlgorithmOptions = {\r\n name: PKCS1_V15_KEYGEN_ALG,\r\n hash: S256_HASH_ALG,\r\n modulusLength: MODULUS_LENGTH,\r\n publicExponent: PUBLIC_EXPONENT,\r\n};\r\n/**\r\n * Check whether browser crypto is available.\r\n */\r\nfunction validateCryptoAvailable(skipValidateSubtleCrypto) {\r\n if (!window) {\r\n throw createBrowserAuthError(nonBrowserEnvironment);\r\n }\r\n if (!window.crypto) {\r\n throw createBrowserAuthError(cryptoNonExistent);\r\n }\r\n if (!skipValidateSubtleCrypto && !window.crypto.subtle) {\r\n throw createBrowserAuthError(cryptoNonExistent, SUBTLE_SUBERROR);\r\n }\r\n}\r\n/**\r\n * Returns a sha-256 hash of the given dataString as an ArrayBuffer.\r\n * @param dataString {string} data string\r\n * @param performanceClient {?IPerformanceClient}\r\n * @param correlationId {?string} correlation id\r\n */\r\nasync function sha256Digest(dataString, performanceClient, correlationId) {\r\n performanceClient?.addQueueMeasurement(PerformanceEvents.Sha256Digest, correlationId);\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(dataString);\r\n return window.crypto.subtle.digest(S256_HASH_ALG, data);\r\n}\r\n/**\r\n * Populates buffer with cryptographically random values.\r\n * @param dataBuffer\r\n */\r\nfunction getRandomValues(dataBuffer) {\r\n return window.crypto.getRandomValues(dataBuffer);\r\n}\r\n/**\r\n * Returns random Uint32 value.\r\n * @returns {number}\r\n */\r\nfunction getRandomUint32() {\r\n window.crypto.getRandomValues(UINT32_ARR);\r\n return UINT32_ARR[0];\r\n}\r\n/**\r\n * Creates a UUID v7 from the current timestamp.\r\n * Implementation relies on the system clock to guarantee increasing order of generated identifiers.\r\n * @returns {number}\r\n */\r\nfunction createNewGuid() {\r\n const currentTimestamp = Date.now();\r\n const baseRand = getRandomUint32() * 0x400 + (getRandomUint32() & 0x3ff);\r\n // Result byte array\r\n const bytes = new Uint8Array(16);\r\n // A 12-bit `rand_a` field value\r\n const randA = Math.trunc(baseRand / 2 ** 30);\r\n // The higher 30 bits of 62-bit `rand_b` field value\r\n const randBHi = baseRand & (2 ** 30 - 1);\r\n // The lower 32 bits of 62-bit `rand_b` field value\r\n const randBLo = getRandomUint32();\r\n bytes[0] = currentTimestamp / 2 ** 40;\r\n bytes[1] = currentTimestamp / 2 ** 32;\r\n bytes[2] = currentTimestamp / 2 ** 24;\r\n bytes[3] = currentTimestamp / 2 ** 16;\r\n bytes[4] = currentTimestamp / 2 ** 8;\r\n bytes[5] = currentTimestamp;\r\n bytes[6] = 0x70 | (randA >>> 8);\r\n bytes[7] = randA;\r\n bytes[8] = 0x80 | (randBHi >>> 24);\r\n bytes[9] = randBHi >>> 16;\r\n bytes[10] = randBHi >>> 8;\r\n bytes[11] = randBHi;\r\n bytes[12] = randBLo >>> 24;\r\n bytes[13] = randBLo >>> 16;\r\n bytes[14] = randBLo >>> 8;\r\n bytes[15] = randBLo;\r\n let text = "";\r\n for (let i = 0; i < bytes.length; i++) {\r\n text += UUID_CHARS.charAt(bytes[i] >>> 4);\r\n text += UUID_CHARS.charAt(bytes[i] & 0xf);\r\n if (i === 3 || i === 5 || i === 7 || i === 9) {\r\n text += "-";\r\n }\r\n }\r\n return text;\r\n}\r\n/**\r\n * Generates a keypair based on current keygen algorithm config.\r\n * @param extractable\r\n * @param usages\r\n */\r\nasync function generateKeyPair(extractable, usages) {\r\n return window.crypto.subtle.generateKey(keygenAlgorithmOptions, extractable, usages);\r\n}\r\n/**\r\n * Export key as Json Web Key (JWK)\r\n * @param key\r\n */\r\nasync function exportJwk(key) {\r\n return window.crypto.subtle.exportKey(KEY_FORMAT_JWK, key);\r\n}\r\n/**\r\n * Imports key as Json Web Key (JWK), can set extractable and usages.\r\n * @param key\r\n * @param extractable\r\n * @param usages\r\n */\r\nasync function importJwk(key, extractable, usages) {\r\n return window.crypto.subtle.importKey(KEY_FORMAT_JWK, key, keygenAlgorithmOptions, extractable, usages);\r\n}\r\n/**\r\n * Signs given data with given key\r\n * @param key\r\n * @param data\r\n */\r\nasync function sign(key, data) {\r\n return window.crypto.subtle.sign(keygenAlgorithmOptions, key, data);\r\n}\r\n/**\r\n * Returns the SHA-256 hash of an input string\r\n * @param plainText\r\n */\r\nasync function hashString(plainText) {\r\n const hashBuffer = await sha256Digest(plainText);\r\n const hashBytes = new Uint8Array(hashBuffer);\r\n return urlEncodeArr(hashBytes);\r\n}\n\n\n//# sourceMappingURL=BrowserCrypto.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/BrowserConfigurationAuthErrorCodes.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst storageNotSupported = "storage_not_supported";\r\nconst stubbedPublicClientApplicationCalled = "stubbed_public_client_application_called";\r\nconst inMemRedirectUnavailable = "in_mem_redirect_unavailable";\n\n\n//# sourceMappingURL=BrowserConfigurationAuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/BrowserConfigurationAuthError.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst BrowserConfigurationAuthErrorMessages = {\r\n [storageNotSupported]: "Given storage configuration option was not supported.",\r\n [stubbedPublicClientApplicationCalled]: "Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors",\r\n [inMemRedirectUnavailable]: "Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true.",\r\n};\r\n/**\r\n * BrowserAuthErrorMessage class containing string constants used by error codes and messages.\r\n * @deprecated Use BrowserAuthErrorCodes instead\r\n */\r\nconst BrowserConfigurationAuthErrorMessage = {\r\n storageNotSupportedError: {\r\n code: storageNotSupported,\r\n desc: BrowserConfigurationAuthErrorMessages[storageNotSupported],\r\n },\r\n stubPcaInstanceCalled: {\r\n code: stubbedPublicClientApplicationCalled,\r\n desc: BrowserConfigurationAuthErrorMessages[stubbedPublicClientApplicationCalled],\r\n },\r\n inMemRedirectUnavailable: {\r\n code: inMemRedirectUnavailable,\r\n desc: BrowserConfigurationAuthErrorMessages[inMemRedirectUnavailable],\r\n },\r\n};\r\n/**\r\n * Browser library error class thrown by the MSAL.js library for SPAs\r\n */\r\nclass BrowserConfigurationAuthError extends AuthError {\r\n constructor(errorCode, errorMessage) {\r\n super(errorCode, errorMessage);\r\n this.name = "BrowserConfigurationAuthError";\r\n Object.setPrototypeOf(this, BrowserConfigurationAuthError.prototype);\r\n }\r\n}\r\nfunction createBrowserConfigurationAuthError(errorCode) {\r\n return new BrowserConfigurationAuthError(errorCode, BrowserConfigurationAuthErrorMessages[errorCode]);\r\n}\n\n\n//# sourceMappingURL=BrowserConfigurationAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/utils/BrowserUtils.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Clears hash from window url.\r\n */\r\nfunction clearHash(contentWindow) {\r\n // Office.js sets history.replaceState to null\r\n contentWindow.location.hash = "";\r\n if (typeof contentWindow.history.replaceState === "function") {\r\n // Full removes "#" from url\r\n contentWindow.history.replaceState(null, "", `${contentWindow.location.origin}${contentWindow.location.pathname}${contentWindow.location.search}`);\r\n }\r\n}\r\n/**\r\n * Replaces current hash with hash from provided url\r\n */\r\nfunction replaceHash(url) {\r\n const urlParts = url.split("#");\r\n urlParts.shift(); // Remove part before the hash\r\n window.location.hash = urlParts.length > 0 ? urlParts.join("#") : "";\r\n}\r\n/**\r\n * Returns boolean of whether the current window is in an iframe or not.\r\n */\r\nfunction isInIframe() {\r\n return window.parent !== window;\r\n}\r\n/**\r\n * Returns boolean of whether or not the current window is a popup opened by msal\r\n */\r\nfunction isInPopup() {\r\n return (typeof window !== "undefined" &&\r\n !!window.opener &&\r\n window.opener !== window &&\r\n typeof window.name === "string" &&\r\n window.name.indexOf(`${BrowserConstants.POPUP_NAME_PREFIX}.`) === 0);\r\n}\r\n// #endregion\r\n/**\r\n * Returns current window URL as redirect uri\r\n */\r\nfunction getCurrentUri() {\r\n return typeof window !== "undefined" && window.location\r\n ? window.location.href.split("?")[0].split("#")[0]\r\n : "";\r\n}\r\n/**\r\n * Gets the homepage url for the current window location.\r\n */\r\nfunction getHomepage() {\r\n const currentUrl = new UrlString(window.location.href);\r\n const urlComponents = currentUrl.getUrlComponents();\r\n return `${urlComponents.Protocol}//${urlComponents.HostNameAndPort}/`;\r\n}\r\n/**\r\n * Throws error if we have completed an auth and are\r\n * attempting another auth request inside an iframe.\r\n */\r\nfunction blockReloadInHiddenIframes() {\r\n const isResponseHash = UrlString.hashContainsKnownProperties(window.location.hash);\r\n // return an error if called from the hidden iframe created by the msal js silent calls\r\n if (isResponseHash && isInIframe()) {\r\n throw createBrowserAuthError(blockIframeReload);\r\n }\r\n}\r\n/**\r\n * Block redirect operations in iframes unless explicitly allowed\r\n * @param interactionType Interaction type for the request\r\n * @param allowRedirectInIframe Config value to allow redirects when app is inside an iframe\r\n */\r\nfunction blockRedirectInIframe(allowRedirectInIframe) {\r\n if (isInIframe() && !allowRedirectInIframe) {\r\n // If we are not in top frame, we shouldn\'t redirect. This is also handled by the service.\r\n throw createBrowserAuthError(redirectInIframe);\r\n }\r\n}\r\n/**\r\n * Block redirectUri loaded in popup from calling AcquireToken APIs\r\n */\r\nfunction blockAcquireTokenInPopups() {\r\n // Popups opened by msal popup APIs are given a name that starts with "msal."\r\n if (isInPopup()) {\r\n throw createBrowserAuthError(blockNestedPopups);\r\n }\r\n}\r\n/**\r\n * Throws error if token requests are made in non-browser environment\r\n * @param isBrowserEnvironment Flag indicating if environment is a browser.\r\n */\r\nfunction blockNonBrowserEnvironment() {\r\n if (typeof window === "undefined") {\r\n throw createBrowserAuthError(nonBrowserEnvironment);\r\n }\r\n}\r\n/**\r\n * Throws error if initialize hasn\'t been called\r\n * @param initialized\r\n */\r\nfunction blockAPICallsBeforeInitialize(initialized) {\r\n if (!initialized) {\r\n throw createBrowserAuthError(uninitializedPublicClientApplication);\r\n }\r\n}\r\n/**\r\n * Helper to validate app environment before making an auth request\r\n * @param initialized\r\n */\r\nfunction preflightCheck(initialized) {\r\n // Block request if not in browser environment\r\n blockNonBrowserEnvironment();\r\n // Block auth requests inside a hidden iframe\r\n blockReloadInHiddenIframes();\r\n // Block redirectUri opened in a popup from calling MSAL APIs\r\n blockAcquireTokenInPopups();\r\n // Block token acquisition before initialize has been called\r\n blockAPICallsBeforeInitialize(initialized);\r\n}\r\n/**\r\n * Helper to validate app enviornment before making redirect request\r\n * @param initialized\r\n * @param config\r\n */\r\nfunction redirectPreflightCheck(initialized, config) {\r\n preflightCheck(initialized);\r\n blockRedirectInIframe(config.system.allowRedirectInIframe);\r\n // Block redirects if memory storage is enabled but storeAuthStateInCookie is not\r\n if (config.cache.cacheLocation === BrowserCacheLocation.MemoryStorage &&\r\n !config.cache.storeAuthStateInCookie) {\r\n throw createBrowserConfigurationAuthError(inMemRedirectUnavailable);\r\n }\r\n}\r\n/**\r\n * Adds a preconnect link element to the header which begins DNS resolution and SSL connection in anticipation of the /token request\r\n * @param loginDomain Authority domain, including https protocol e.g. https://login.microsoftonline.com\r\n * @returns\r\n */\r\nfunction preconnect(authority) {\r\n const link = document.createElement("link");\r\n link.rel = "preconnect";\r\n link.href = new URL(authority).origin;\r\n link.crossOrigin = "anonymous";\r\n document.head.appendChild(link);\r\n // The browser will close connection if not used within a few seconds, remove element from the header after 10s\r\n window.setTimeout(() => {\r\n try {\r\n document.head.removeChild(link);\r\n }\r\n catch { }\r\n }, 10000); // 10s Timeout\r\n}\r\n/**\r\n * Wrapper function that creates a UUID v7 from the current timestamp.\r\n * @returns {string}\r\n */\r\nfunction createGuid() {\r\n return createNewGuid();\r\n}\n\n\n//# sourceMappingURL=BrowserUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/logger/Logger.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Log message level.\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel["Error"] = 0] = "Error";\r\n LogLevel[LogLevel["Warning"] = 1] = "Warning";\r\n LogLevel[LogLevel["Info"] = 2] = "Info";\r\n LogLevel[LogLevel["Verbose"] = 3] = "Verbose";\r\n LogLevel[LogLevel["Trace"] = 4] = "Trace";\r\n})(LogLevel || (LogLevel = {}));\r\n/**\r\n * Class which facilitates logging of messages to a specific place.\r\n */\r\nclass Logger {\r\n constructor(loggerOptions, packageName, packageVersion) {\r\n // Current log level, defaults to info.\r\n this.level = LogLevel.Info;\r\n const defaultLoggerCallback = () => {\r\n return;\r\n };\r\n const setLoggerOptions = loggerOptions || Logger.createDefaultLoggerOptions();\r\n this.localCallback =\r\n setLoggerOptions.loggerCallback || defaultLoggerCallback;\r\n this.piiLoggingEnabled = setLoggerOptions.piiLoggingEnabled || false;\r\n this.level =\r\n typeof setLoggerOptions.logLevel === "number"\r\n ? setLoggerOptions.logLevel\r\n : LogLevel.Info;\r\n this.correlationId =\r\n setLoggerOptions.correlationId || Constants.EMPTY_STRING;\r\n this.packageName = packageName || Constants.EMPTY_STRING;\r\n this.packageVersion = packageVersion || Constants.EMPTY_STRING;\r\n }\r\n static createDefaultLoggerOptions() {\r\n return {\r\n loggerCallback: () => {\r\n // allow users to not set loggerCallback\r\n },\r\n piiLoggingEnabled: false,\r\n logLevel: LogLevel.Info,\r\n };\r\n }\r\n /**\r\n * Create new Logger with existing configurations.\r\n */\r\n clone(packageName, packageVersion, correlationId) {\r\n return new Logger({\r\n loggerCallback: this.localCallback,\r\n piiLoggingEnabled: this.piiLoggingEnabled,\r\n logLevel: this.level,\r\n correlationId: correlationId || this.correlationId,\r\n }, packageName, packageVersion);\r\n }\r\n /**\r\n * Log message with required options.\r\n */\r\n logMessage(logMessage, options) {\r\n if (options.logLevel > this.level ||\r\n (!this.piiLoggingEnabled && options.containsPii)) {\r\n return;\r\n }\r\n const timestamp = new Date().toUTCString();\r\n // Add correlationId to logs if set, correlationId provided on log messages take precedence\r\n const logHeader = `[${timestamp}] : [${options.correlationId || this.correlationId || ""}]`;\r\n const log = `${logHeader} : ${this.packageName}@${this.packageVersion} : ${LogLevel[options.logLevel]} - ${logMessage}`;\r\n // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? "-Pii": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);\r\n this.executeCallback(options.logLevel, log, options.containsPii || false);\r\n }\r\n /**\r\n * Execute callback with message.\r\n */\r\n executeCallback(level, message, containsPii) {\r\n if (this.localCallback) {\r\n this.localCallback(level, message, containsPii);\r\n }\r\n }\r\n /**\r\n * Logs error messages.\r\n */\r\n error(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Error,\r\n containsPii: false,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs error messages with PII.\r\n */\r\n errorPii(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Error,\r\n containsPii: true,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs warning messages.\r\n */\r\n warning(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Warning,\r\n containsPii: false,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs warning messages with PII.\r\n */\r\n warningPii(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Warning,\r\n containsPii: true,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs info messages.\r\n */\r\n info(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Info,\r\n containsPii: false,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs info messages with PII.\r\n */\r\n infoPii(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Info,\r\n containsPii: true,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs verbose messages.\r\n */\r\n verbose(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Verbose,\r\n containsPii: false,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs verbose messages with PII.\r\n */\r\n verbosePii(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Verbose,\r\n containsPii: true,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs trace messages.\r\n */\r\n trace(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Trace,\r\n containsPii: false,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Logs trace messages with PII.\r\n */\r\n tracePii(message, correlationId) {\r\n this.logMessage(message, {\r\n logLevel: LogLevel.Trace,\r\n containsPii: true,\r\n correlationId: correlationId || Constants.EMPTY_STRING,\r\n });\r\n }\r\n /**\r\n * Returns whether PII Logging is enabled or not.\r\n */\r\n isPiiLoggingEnabled() {\r\n return this.piiLoggingEnabled || false;\r\n }\r\n}\n\n\n//# sourceMappingURL=Logger.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/ProtocolMode.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Protocol modes supported by MSAL.\r\n */\r\nconst ProtocolMode = {\r\n AAD: "AAD",\r\n OIDC: "OIDC",\r\n};\n\n\n//# sourceMappingURL=ProtocolMode.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/AuthorityOptions.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst AzureCloudInstance = {\r\n // AzureCloudInstance is not specified.\r\n None: "none",\r\n // Microsoft Azure public cloud\r\n AzurePublic: "https://login.microsoftonline.com",\r\n // Microsoft PPE\r\n AzurePpe: "https://login.windows-ppe.net",\r\n // Microsoft Chinese national/regional cloud\r\n AzureChina: "https://login.chinacloudapi.cn",\r\n // Microsoft German national/regional cloud ("Black Forest")\r\n AzureGermany: "https://login.microsoftonline.de",\r\n // US Government cloud\r\n AzureUsGovernment: "https://login.microsoftonline.us",\r\n};\n\n\n//# sourceMappingURL=AuthorityOptions.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/crypto/ICrypto.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst DEFAULT_CRYPTO_IMPLEMENTATION = {\r\n createNewGuid: () => {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n base64Decode: () => {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n base64Encode: () => {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n base64UrlEncode: () => {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n encodeKid: () => {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async getPublicKeyThumbprint() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async removeTokenBindingKey() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async clearKeystore() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async signJwt() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async hashString() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n};\n\n\n//# sourceMappingURL=ICrypto.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/packageMetadata.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/* eslint-disable header/header */\r\nconst packageMetadata_name = "@azure/msal-common";\r\nconst version = "14.16.0";\n\n\n//# sourceMappingURL=packageMetadata.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/account/AuthToken.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Extract token by decoding the rawToken\r\n *\r\n * @param encodedToken\r\n */\r\nfunction extractTokenClaims(encodedToken, base64Decode) {\r\n const jswPayload = getJWSPayload(encodedToken);\r\n // token will be decoded to get the username\r\n try {\r\n // base64Decode() should throw an error if there is an issue\r\n const base64Decoded = base64Decode(jswPayload);\r\n return JSON.parse(base64Decoded);\r\n }\r\n catch (err) {\r\n throw createClientAuthError(tokenParsingError);\r\n }\r\n}\r\n/**\r\n * decode a JWT\r\n *\r\n * @param authToken\r\n */\r\nfunction getJWSPayload(authToken) {\r\n if (!authToken) {\r\n throw createClientAuthError(nullOrEmptyToken);\r\n }\r\n const tokenPartsRegex = /^([^\\.\\s]*)\\.([^\\.\\s]+)\\.([^\\.\\s]*)$/;\r\n const matches = tokenPartsRegex.exec(authToken);\r\n if (!matches || matches.length < 4) {\r\n throw createClientAuthError(tokenParsingError);\r\n }\r\n /**\r\n * const crackedToken = {\r\n * header: matches[1],\r\n * JWSPayload: matches[2],\r\n * JWSSig: matches[3],\r\n * };\r\n */\r\n return matches[2];\r\n}\r\n/**\r\n * Determine if the token\'s max_age has transpired\r\n */\r\nfunction checkMaxAge(authTime, maxAge) {\r\n /*\r\n * per https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest\r\n * To force an immediate re-authentication: If an app requires that a user re-authenticate prior to access,\r\n * provide a value of 0 for the max_age parameter and the AS will force a fresh login.\r\n */\r\n const fiveMinuteSkew = 300000; // five minutes in milliseconds\r\n if (maxAge === 0 || Date.now() - fiveMinuteSkew > authTime + maxAge) {\r\n throw createClientAuthError(maxAgeTranspired);\r\n }\r\n}\n\n\n//# sourceMappingURL=AuthToken.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/TimeUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Utility functions for managing date and time operations.\r\n */\r\n/**\r\n * return the current time in Unix time (seconds).\r\n */\r\nfunction nowSeconds() {\r\n // Date.getTime() returns in milliseconds.\r\n return Math.round(new Date().getTime() / 1000.0);\r\n}\r\n/**\r\n * check if a token is expired based on given UTC time in seconds.\r\n * @param expiresOn\r\n */\r\nfunction isTokenExpired(expiresOn, offset) {\r\n // check for access token expiry\r\n const expirationSec = Number(expiresOn) || 0;\r\n const offsetCurrentTimeSec = nowSeconds() + offset;\r\n // If current time + offset is greater than token expiration time, then token is expired.\r\n return offsetCurrentTimeSec > expirationSec;\r\n}\r\n/**\r\n * If the current time is earlier than the time that a token was cached at, we must discard the token\r\n * i.e. The system clock was turned back after acquiring the cached token\r\n * @param cachedAt\r\n * @param offset\r\n */\r\nfunction wasClockTurnedBack(cachedAt) {\r\n const cachedAtSec = Number(cachedAt);\r\n return cachedAtSec > nowSeconds();\r\n}\r\n/**\r\n * Waits for t number of milliseconds\r\n * @param t number\r\n * @param value T\r\n */\r\nfunction delay(t, value) {\r\n return new Promise((resolve) => setTimeout(() => resolve(value), t));\r\n}\n\n\n//# sourceMappingURL=TimeUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/cache/utils/CacheHelpers.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Cache Key: -------\r\n * IdToken Example: uid.utid-login.microsoftonline.com-idtoken-app_client_id-contoso.com\r\n * AccessToken Example: uid.utid-login.microsoftonline.com-accesstoken-app_client_id-contoso.com-scope1 scope2--pop\r\n * RefreshToken Example: uid.utid-login.microsoftonline.com-refreshtoken-1-contoso.com\r\n * @param credentialEntity\r\n * @returns\r\n */\r\nfunction generateCredentialKey(credentialEntity) {\r\n const credentialKey = [\r\n generateAccountId(credentialEntity),\r\n generateCredentialId(credentialEntity),\r\n generateTarget(credentialEntity),\r\n generateClaimsHash(credentialEntity),\r\n generateScheme(credentialEntity),\r\n ];\r\n return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n}\r\n/**\r\n * Create IdTokenEntity\r\n * @param homeAccountId\r\n * @param authenticationResult\r\n * @param clientId\r\n * @param authority\r\n */\r\nfunction createIdTokenEntity(homeAccountId, environment, idToken, clientId, tenantId) {\r\n const idTokenEntity = {\r\n credentialType: CredentialType.ID_TOKEN,\r\n homeAccountId: homeAccountId,\r\n environment: environment,\r\n clientId: clientId,\r\n secret: idToken,\r\n realm: tenantId,\r\n };\r\n return idTokenEntity;\r\n}\r\n/**\r\n * Create AccessTokenEntity\r\n * @param homeAccountId\r\n * @param environment\r\n * @param accessToken\r\n * @param clientId\r\n * @param tenantId\r\n * @param scopes\r\n * @param expiresOn\r\n * @param extExpiresOn\r\n */\r\nfunction createAccessTokenEntity(homeAccountId, environment, accessToken, clientId, tenantId, scopes, expiresOn, extExpiresOn, base64Decode, refreshOn, tokenType, userAssertionHash, keyId, requestedClaims, requestedClaimsHash) {\r\n const atEntity = {\r\n homeAccountId: homeAccountId,\r\n credentialType: CredentialType.ACCESS_TOKEN,\r\n secret: accessToken,\r\n cachedAt: nowSeconds().toString(),\r\n expiresOn: expiresOn.toString(),\r\n extendedExpiresOn: extExpiresOn.toString(),\r\n environment: environment,\r\n clientId: clientId,\r\n realm: tenantId,\r\n target: scopes,\r\n tokenType: tokenType || AuthenticationScheme.BEARER,\r\n };\r\n if (userAssertionHash) {\r\n atEntity.userAssertionHash = userAssertionHash;\r\n }\r\n if (refreshOn) {\r\n atEntity.refreshOn = refreshOn.toString();\r\n }\r\n if (requestedClaims) {\r\n atEntity.requestedClaims = requestedClaims;\r\n atEntity.requestedClaimsHash = requestedClaimsHash;\r\n }\r\n /*\r\n * Create Access Token With Auth Scheme instead of regular access token\r\n * Cast to lower to handle "bearer" from ADFS\r\n */\r\n if (atEntity.tokenType?.toLowerCase() !==\r\n AuthenticationScheme.BEARER.toLowerCase()) {\r\n atEntity.credentialType = CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;\r\n switch (atEntity.tokenType) {\r\n case AuthenticationScheme.POP:\r\n // Make sure keyId is present and add it to credential\r\n const tokenClaims = extractTokenClaims(accessToken, base64Decode);\r\n if (!tokenClaims?.cnf?.kid) {\r\n throw createClientAuthError(tokenClaimsCnfRequiredForSignedJwt);\r\n }\r\n atEntity.keyId = tokenClaims.cnf.kid;\r\n break;\r\n case AuthenticationScheme.SSH:\r\n atEntity.keyId = keyId;\r\n }\r\n }\r\n return atEntity;\r\n}\r\n/**\r\n * Create RefreshTokenEntity\r\n * @param homeAccountId\r\n * @param authenticationResult\r\n * @param clientId\r\n * @param authority\r\n */\r\nfunction createRefreshTokenEntity(homeAccountId, environment, refreshToken, clientId, familyId, userAssertionHash, expiresOn) {\r\n const rtEntity = {\r\n credentialType: CredentialType.REFRESH_TOKEN,\r\n homeAccountId: homeAccountId,\r\n environment: environment,\r\n clientId: clientId,\r\n secret: refreshToken,\r\n };\r\n if (userAssertionHash) {\r\n rtEntity.userAssertionHash = userAssertionHash;\r\n }\r\n if (familyId) {\r\n rtEntity.familyId = familyId;\r\n }\r\n if (expiresOn) {\r\n rtEntity.expiresOn = expiresOn.toString();\r\n }\r\n return rtEntity;\r\n}\r\nfunction isCredentialEntity(entity) {\r\n return (entity.hasOwnProperty("homeAccountId") &&\r\n entity.hasOwnProperty("environment") &&\r\n entity.hasOwnProperty("credentialType") &&\r\n entity.hasOwnProperty("clientId") &&\r\n entity.hasOwnProperty("secret"));\r\n}\r\n/**\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\nfunction isAccessTokenEntity(entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (isCredentialEntity(entity) &&\r\n entity.hasOwnProperty("realm") &&\r\n entity.hasOwnProperty("target") &&\r\n (entity["credentialType"] === CredentialType.ACCESS_TOKEN ||\r\n entity["credentialType"] ===\r\n CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME));\r\n}\r\n/**\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\nfunction isIdTokenEntity(entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (isCredentialEntity(entity) &&\r\n entity.hasOwnProperty("realm") &&\r\n entity["credentialType"] === CredentialType.ID_TOKEN);\r\n}\r\n/**\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\nfunction isRefreshTokenEntity(entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (isCredentialEntity(entity) &&\r\n entity["credentialType"] === CredentialType.REFRESH_TOKEN);\r\n}\r\n/**\r\n * Generate Account Id key component as per the schema: -\r\n */\r\nfunction generateAccountId(credentialEntity) {\r\n const accountId = [\r\n credentialEntity.homeAccountId,\r\n credentialEntity.environment,\r\n ];\r\n return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n}\r\n/**\r\n * Generate Credential Id key component as per the schema: --\r\n */\r\nfunction generateCredentialId(credentialEntity) {\r\n const clientOrFamilyId = credentialEntity.credentialType === CredentialType.REFRESH_TOKEN\r\n ? credentialEntity.familyId || credentialEntity.clientId\r\n : credentialEntity.clientId;\r\n const credentialId = [\r\n credentialEntity.credentialType,\r\n clientOrFamilyId,\r\n credentialEntity.realm || "",\r\n ];\r\n return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n}\r\n/**\r\n * Generate target key component as per schema: \r\n */\r\nfunction generateTarget(credentialEntity) {\r\n return (credentialEntity.target || "").toLowerCase();\r\n}\r\n/**\r\n * Generate requested claims key component as per schema: \r\n */\r\nfunction generateClaimsHash(credentialEntity) {\r\n return (credentialEntity.requestedClaimsHash || "").toLowerCase();\r\n}\r\n/**\r\n * Generate scheme key componenet as per schema: \r\n */\r\nfunction generateScheme(credentialEntity) {\r\n /*\r\n * PoP Tokens and SSH certs include scheme in cache key\r\n * Cast to lowercase to handle "bearer" from ADFS\r\n */\r\n return credentialEntity.tokenType &&\r\n credentialEntity.tokenType.toLowerCase() !==\r\n AuthenticationScheme.BEARER.toLowerCase()\r\n ? credentialEntity.tokenType.toLowerCase()\r\n : "";\r\n}\r\n/**\r\n * validates if a given cache entry is "Telemetry", parses \r\n * @param key\r\n * @param entity\r\n */\r\nfunction isServerTelemetryEntity(key, entity) {\r\n const validateKey = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;\r\n let validateEntity = true;\r\n if (entity) {\r\n validateEntity =\r\n entity.hasOwnProperty("failedRequests") &&\r\n entity.hasOwnProperty("errors") &&\r\n entity.hasOwnProperty("cacheHits");\r\n }\r\n return validateKey && validateEntity;\r\n}\r\n/**\r\n * validates if a given cache entry is "Throttling", parses \r\n * @param key\r\n * @param entity\r\n */\r\nfunction isThrottlingEntity(key, entity) {\r\n let validateKey = false;\r\n if (key) {\r\n validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;\r\n }\r\n let validateEntity = true;\r\n if (entity) {\r\n validateEntity = entity.hasOwnProperty("throttleTime");\r\n }\r\n return validateKey && validateEntity;\r\n}\r\n/**\r\n * Generate AppMetadata Cache Key as per the schema: appmetadata--\r\n */\r\nfunction generateAppMetadataKey({ environment, clientId, }) {\r\n const appMetaDataKeyArray = [\r\n APP_METADATA,\r\n environment,\r\n clientId,\r\n ];\r\n return appMetaDataKeyArray\r\n .join(Separators.CACHE_KEY_SEPARATOR)\r\n .toLowerCase();\r\n}\r\n/*\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\nfunction isAppMetadataEntity(key, entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (key.indexOf(APP_METADATA) === 0 &&\r\n entity.hasOwnProperty("clientId") &&\r\n entity.hasOwnProperty("environment"));\r\n}\r\n/**\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\nfunction isAuthorityMetadataEntity(key, entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&\r\n entity.hasOwnProperty("aliases") &&\r\n entity.hasOwnProperty("preferred_cache") &&\r\n entity.hasOwnProperty("preferred_network") &&\r\n entity.hasOwnProperty("canonical_authority") &&\r\n entity.hasOwnProperty("authorization_endpoint") &&\r\n entity.hasOwnProperty("token_endpoint") &&\r\n entity.hasOwnProperty("issuer") &&\r\n entity.hasOwnProperty("aliasesFromNetwork") &&\r\n entity.hasOwnProperty("endpointsFromNetwork") &&\r\n entity.hasOwnProperty("expiresAt") &&\r\n entity.hasOwnProperty("jwks_uri"));\r\n}\r\n/**\r\n * Reset the exiresAt value\r\n */\r\nfunction generateAuthorityMetadataExpiresAt() {\r\n return (nowSeconds() +\r\n AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS);\r\n}\r\nfunction updateAuthorityEndpointMetadata(authorityMetadata, updatedValues, fromNetwork) {\r\n authorityMetadata.authorization_endpoint =\r\n updatedValues.authorization_endpoint;\r\n authorityMetadata.token_endpoint = updatedValues.token_endpoint;\r\n authorityMetadata.end_session_endpoint = updatedValues.end_session_endpoint;\r\n authorityMetadata.issuer = updatedValues.issuer;\r\n authorityMetadata.endpointsFromNetwork = fromNetwork;\r\n authorityMetadata.jwks_uri = updatedValues.jwks_uri;\r\n}\r\nfunction updateCloudDiscoveryMetadata(authorityMetadata, updatedValues, fromNetwork) {\r\n authorityMetadata.aliases = updatedValues.aliases;\r\n authorityMetadata.preferred_cache = updatedValues.preferred_cache;\r\n authorityMetadata.preferred_network = updatedValues.preferred_network;\r\n authorityMetadata.aliasesFromNetwork = fromNetwork;\r\n}\r\n/**\r\n * Returns whether or not the data needs to be refreshed\r\n */\r\nfunction isAuthorityMetadataExpired(metadata) {\r\n return metadata.expiresAt <= nowSeconds();\r\n}\n\n\n//# sourceMappingURL=CacheHelpers.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/request/ScopeSet.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes\r\n * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions\r\n * to ensure uniqueness of strings.\r\n */\r\nclass ScopeSet {\r\n constructor(inputScopes) {\r\n // Filter empty string and null/undefined array items\r\n const scopeArr = inputScopes\r\n ? StringUtils.trimArrayEntries([...inputScopes])\r\n : [];\r\n const filteredInput = scopeArr\r\n ? StringUtils.removeEmptyStringsFromArray(scopeArr)\r\n : [];\r\n // Validate and filter scopes (validate function throws if validation fails)\r\n this.validateInputScopes(filteredInput);\r\n this.scopes = new Set(); // Iterator in constructor not supported by IE11\r\n filteredInput.forEach((scope) => this.scopes.add(scope));\r\n }\r\n /**\r\n * Factory method to create ScopeSet from space-delimited string\r\n * @param inputScopeString\r\n * @param appClientId\r\n * @param scopesRequired\r\n */\r\n static fromString(inputScopeString) {\r\n const scopeString = inputScopeString || Constants.EMPTY_STRING;\r\n const inputScopes = scopeString.split(" ");\r\n return new ScopeSet(inputScopes);\r\n }\r\n /**\r\n * Creates the set of scopes to search for in cache lookups\r\n * @param inputScopeString\r\n * @returns\r\n */\r\n static createSearchScopes(inputScopeString) {\r\n const scopeSet = new ScopeSet(inputScopeString);\r\n if (!scopeSet.containsOnlyOIDCScopes()) {\r\n scopeSet.removeOIDCScopes();\r\n }\r\n else {\r\n scopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);\r\n }\r\n return scopeSet;\r\n }\r\n /**\r\n * Used to validate the scopes input parameter requested by the developer.\r\n * @param {Array} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.\r\n * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not\r\n */\r\n validateInputScopes(inputScopes) {\r\n // Check if scopes are required but not given or is an empty array\r\n if (!inputScopes || inputScopes.length < 1) {\r\n throw createClientConfigurationError(emptyInputScopesError);\r\n }\r\n }\r\n /**\r\n * Check if a given scope is present in this set of scopes.\r\n * @param scope\r\n */\r\n containsScope(scope) {\r\n const lowerCaseScopes = this.printScopesLowerCase().split(" ");\r\n const lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);\r\n // compare lowercase scopes\r\n return scope\r\n ? lowerCaseScopesSet.scopes.has(scope.toLowerCase())\r\n : false;\r\n }\r\n /**\r\n * Check if a set of scopes is present in this set of scopes.\r\n * @param scopeSet\r\n */\r\n containsScopeSet(scopeSet) {\r\n if (!scopeSet || scopeSet.scopes.size <= 0) {\r\n return false;\r\n }\r\n return (this.scopes.size >= scopeSet.scopes.size &&\r\n scopeSet.asArray().every((scope) => this.containsScope(scope)));\r\n }\r\n /**\r\n * Check if set of scopes contains only the defaults\r\n */\r\n containsOnlyOIDCScopes() {\r\n let defaultScopeCount = 0;\r\n OIDC_SCOPES.forEach((defaultScope) => {\r\n if (this.containsScope(defaultScope)) {\r\n defaultScopeCount += 1;\r\n }\r\n });\r\n return this.scopes.size === defaultScopeCount;\r\n }\r\n /**\r\n * Appends single scope if passed\r\n * @param newScope\r\n */\r\n appendScope(newScope) {\r\n if (newScope) {\r\n this.scopes.add(newScope.trim());\r\n }\r\n }\r\n /**\r\n * Appends multiple scopes if passed\r\n * @param newScopes\r\n */\r\n appendScopes(newScopes) {\r\n try {\r\n newScopes.forEach((newScope) => this.appendScope(newScope));\r\n }\r\n catch (e) {\r\n throw createClientAuthError(cannotAppendScopeSet);\r\n }\r\n }\r\n /**\r\n * Removes element from set of scopes.\r\n * @param scope\r\n */\r\n removeScope(scope) {\r\n if (!scope) {\r\n throw createClientAuthError(cannotRemoveEmptyScope);\r\n }\r\n this.scopes.delete(scope.trim());\r\n }\r\n /**\r\n * Removes default scopes from set of scopes\r\n * Primarily used to prevent cache misses if the default scopes are not returned from the server\r\n */\r\n removeOIDCScopes() {\r\n OIDC_SCOPES.forEach((defaultScope) => {\r\n this.scopes.delete(defaultScope);\r\n });\r\n }\r\n /**\r\n * Combines an array of scopes with the current set of scopes.\r\n * @param otherScopes\r\n */\r\n unionScopeSets(otherScopes) {\r\n if (!otherScopes) {\r\n throw createClientAuthError(emptyInputScopeSet);\r\n }\r\n const unionScopes = new Set(); // Iterator in constructor not supported in IE11\r\n otherScopes.scopes.forEach((scope) => unionScopes.add(scope.toLowerCase()));\r\n this.scopes.forEach((scope) => unionScopes.add(scope.toLowerCase()));\r\n return unionScopes;\r\n }\r\n /**\r\n * Check if scopes intersect between this set and another.\r\n * @param otherScopes\r\n */\r\n intersectingScopeSets(otherScopes) {\r\n if (!otherScopes) {\r\n throw createClientAuthError(emptyInputScopeSet);\r\n }\r\n // Do not allow OIDC scopes to be the only intersecting scopes\r\n if (!otherScopes.containsOnlyOIDCScopes()) {\r\n otherScopes.removeOIDCScopes();\r\n }\r\n const unionScopes = this.unionScopeSets(otherScopes);\r\n const sizeOtherScopes = otherScopes.getScopeCount();\r\n const sizeThisScopes = this.getScopeCount();\r\n const sizeUnionScopes = unionScopes.size;\r\n return sizeUnionScopes < sizeThisScopes + sizeOtherScopes;\r\n }\r\n /**\r\n * Returns size of set of scopes.\r\n */\r\n getScopeCount() {\r\n return this.scopes.size;\r\n }\r\n /**\r\n * Returns the scopes as an array of string values\r\n */\r\n asArray() {\r\n const array = [];\r\n this.scopes.forEach((val) => array.push(val));\r\n return array;\r\n }\r\n /**\r\n * Prints scopes into a space-delimited string\r\n */\r\n printScopes() {\r\n if (this.scopes) {\r\n const scopeArr = this.asArray();\r\n return scopeArr.join(" ");\r\n }\r\n return Constants.EMPTY_STRING;\r\n }\r\n /**\r\n * Prints scopes into a space-delimited lower-case string (used for caching)\r\n */\r\n printScopesLowerCase() {\r\n return this.printScopes().toLowerCase();\r\n }\r\n}\n\n\n//# sourceMappingURL=ScopeSet.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/account/ClientInfo.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Function to build a client info object from server clientInfo string\r\n * @param rawClientInfo\r\n * @param crypto\r\n */\r\nfunction buildClientInfo(rawClientInfo, base64Decode) {\r\n if (!rawClientInfo) {\r\n throw createClientAuthError(clientInfoEmptyError);\r\n }\r\n try {\r\n const decodedClientInfo = base64Decode(rawClientInfo);\r\n return JSON.parse(decodedClientInfo);\r\n }\r\n catch (e) {\r\n throw createClientAuthError(clientInfoDecodingError);\r\n }\r\n}\r\n/**\r\n * Function to build a client info object from cached homeAccountId string\r\n * @param homeAccountId\r\n */\r\nfunction buildClientInfoFromHomeAccountId(homeAccountId) {\r\n if (!homeAccountId) {\r\n throw createClientAuthError(clientInfoDecodingError);\r\n }\r\n const clientInfoParts = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);\r\n return {\r\n uid: clientInfoParts[0],\r\n utid: clientInfoParts.length < 2\r\n ? Constants.EMPTY_STRING\r\n : clientInfoParts[1],\r\n };\r\n}\n\n\n//# sourceMappingURL=ClientInfo.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/account/AccountInfo.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Returns true if tenantId matches the utid portion of homeAccountId\r\n * @param tenantId\r\n * @param homeAccountId\r\n * @returns\r\n */\r\nfunction tenantIdMatchesHomeTenant(tenantId, homeAccountId) {\r\n return (!!tenantId &&\r\n !!homeAccountId &&\r\n tenantId === homeAccountId.split(".")[1]);\r\n}\r\n/**\r\n * Build tenant profile\r\n * @param homeAccountId - Home account identifier for this account object\r\n * @param localAccountId - Local account identifer for this account object\r\n * @param tenantId - Full tenant or organizational id that this account belongs to\r\n * @param idTokenClaims - Claims from the ID token\r\n * @returns\r\n */\r\nfunction buildTenantProfile(homeAccountId, localAccountId, tenantId, idTokenClaims) {\r\n if (idTokenClaims) {\r\n const { oid, sub, tid, name, tfp, acr } = idTokenClaims;\r\n /**\r\n * Since there is no way to determine if the authority is AAD or B2C, we exhaust all the possible claims that can serve as tenant ID with the following precedence:\r\n * tid - TenantID claim that identifies the tenant that issued the token in AAD. Expected in all AAD ID tokens, not present in B2C ID Tokens.\r\n * tfp - Trust Framework Policy claim that identifies the policy that was used to authenticate the user. Functions as tenant for B2C scenarios.\r\n * acr - Authentication Context Class Reference claim used only with older B2C policies. Fallback in case tfp is not present, but likely won\'t be present anyway.\r\n */\r\n const tenantId = tid || tfp || acr || "";\r\n return {\r\n tenantId: tenantId,\r\n localAccountId: oid || sub || "",\r\n name: name,\r\n isHomeTenant: tenantIdMatchesHomeTenant(tenantId, homeAccountId),\r\n };\r\n }\r\n else {\r\n return {\r\n tenantId,\r\n localAccountId,\r\n isHomeTenant: tenantIdMatchesHomeTenant(tenantId, homeAccountId),\r\n };\r\n }\r\n}\r\n/**\r\n * Replaces account info that varies by tenant profile sourced from the ID token claims passed in with the tenant-specific account info\r\n * @param baseAccountInfo\r\n * @param idTokenClaims\r\n * @returns\r\n */\r\nfunction updateAccountTenantProfileData(baseAccountInfo, tenantProfile, idTokenClaims, idTokenSecret) {\r\n let updatedAccountInfo = baseAccountInfo;\r\n // Tenant Profile overrides passed in account info\r\n if (tenantProfile) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { isHomeTenant, ...tenantProfileOverride } = tenantProfile;\r\n updatedAccountInfo = { ...baseAccountInfo, ...tenantProfileOverride };\r\n }\r\n // ID token claims override passed in account info and tenant profile\r\n if (idTokenClaims) {\r\n // Ignore isHomeTenant, loginHint, and sid which are part of tenant profile but not base account info\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { isHomeTenant, ...claimsSourcedTenantProfile } = buildTenantProfile(baseAccountInfo.homeAccountId, baseAccountInfo.localAccountId, baseAccountInfo.tenantId, idTokenClaims);\r\n updatedAccountInfo = {\r\n ...updatedAccountInfo,\r\n ...claimsSourcedTenantProfile,\r\n idTokenClaims: idTokenClaims,\r\n idToken: idTokenSecret,\r\n };\r\n return updatedAccountInfo;\r\n }\r\n return updatedAccountInfo;\r\n}\n\n\n//# sourceMappingURL=AccountInfo.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/AuthorityType.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Authority types supported by MSAL.\r\n */\r\nconst AuthorityType = {\r\n Default: 0,\r\n Adfs: 1,\r\n Dsts: 2,\r\n Ciam: 3,\r\n};\n\n\n//# sourceMappingURL=AuthorityType.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/account/TokenClaims.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Gets tenantId from available ID token claims to set as credential realm with the following precedence:\r\n * 1. tid - if the token is acquired from an Azure AD tenant tid will be present\r\n * 2. tfp - if the token is acquired from a modern B2C tenant tfp should be present\r\n * 3. acr - if the token is acquired from a legacy B2C tenant acr should be present\r\n * Downcased to match the realm case-insensitive comparison requirements\r\n * @param idTokenClaims\r\n * @returns\r\n */\r\nfunction getTenantIdFromIdTokenClaims(idTokenClaims) {\r\n if (idTokenClaims) {\r\n const tenantId = idTokenClaims.tid || idTokenClaims.tfp || idTokenClaims.acr;\r\n return tenantId || null;\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=TokenClaims.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/cache/entities/AccountEntity.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).\r\n *\r\n * Key : Value Schema\r\n *\r\n * Key: --\r\n *\r\n * Value Schema:\r\n * {\r\n * homeAccountId: home account identifier for the auth scheme,\r\n * environment: entity that issued the token, represented as a full host\r\n * realm: Full tenant or organizational identifier that the account belongs to\r\n * localAccountId: Original tenant-specific accountID, usually used for legacy cases\r\n * username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt\r\n * authorityType: Accounts authority type as a string\r\n * name: Full name for the account, including given name and family name,\r\n * lastModificationTime: last time this entity was modified in the cache\r\n * lastModificationApp:\r\n * nativeAccountId: Account identifier on the native device\r\n * tenantProfiles: Array of tenant profile objects for each tenant that the account has authenticated with in the browser\r\n * }\r\n * @internal\r\n */\r\nclass AccountEntity {\r\n /**\r\n * Generate Account Id key component as per the schema: -\r\n */\r\n generateAccountId() {\r\n const accountId = [this.homeAccountId, this.environment];\r\n return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n }\r\n /**\r\n * Generate Account Cache Key as per the schema: --\r\n */\r\n generateAccountKey() {\r\n return AccountEntity.generateAccountCacheKey({\r\n homeAccountId: this.homeAccountId,\r\n environment: this.environment,\r\n tenantId: this.realm,\r\n username: this.username,\r\n localAccountId: this.localAccountId,\r\n });\r\n }\r\n /**\r\n * Returns the AccountInfo interface for this account.\r\n */\r\n getAccountInfo() {\r\n return {\r\n homeAccountId: this.homeAccountId,\r\n environment: this.environment,\r\n tenantId: this.realm,\r\n username: this.username,\r\n localAccountId: this.localAccountId,\r\n name: this.name,\r\n nativeAccountId: this.nativeAccountId,\r\n authorityType: this.authorityType,\r\n // Deserialize tenant profiles array into a Map\r\n tenantProfiles: new Map((this.tenantProfiles || []).map((tenantProfile) => {\r\n return [tenantProfile.tenantId, tenantProfile];\r\n })),\r\n };\r\n }\r\n /**\r\n * Returns true if the account entity is in single tenant format (outdated), false otherwise\r\n */\r\n isSingleTenant() {\r\n return !this.tenantProfiles;\r\n }\r\n /**\r\n * Generates account key from interface\r\n * @param accountInterface\r\n */\r\n static generateAccountCacheKey(accountInterface) {\r\n const homeTenantId = accountInterface.homeAccountId.split(".")[1];\r\n const accountKey = [\r\n accountInterface.homeAccountId,\r\n accountInterface.environment || "",\r\n homeTenantId || accountInterface.tenantId || "",\r\n ];\r\n return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n }\r\n /**\r\n * Build Account cache from IdToken, clientInfo and authority/policy. Associated with AAD.\r\n * @param accountDetails\r\n */\r\n static createAccount(accountDetails, authority, base64Decode) {\r\n const account = new AccountEntity();\r\n if (authority.authorityType === AuthorityType.Adfs) {\r\n account.authorityType = CacheAccountType.ADFS_ACCOUNT_TYPE;\r\n }\r\n else if (authority.protocolMode === ProtocolMode.AAD) {\r\n account.authorityType = CacheAccountType.MSSTS_ACCOUNT_TYPE;\r\n }\r\n else {\r\n account.authorityType = CacheAccountType.GENERIC_ACCOUNT_TYPE;\r\n }\r\n let clientInfo;\r\n if (accountDetails.clientInfo && base64Decode) {\r\n clientInfo = buildClientInfo(accountDetails.clientInfo, base64Decode);\r\n }\r\n account.clientInfo = accountDetails.clientInfo;\r\n account.homeAccountId = accountDetails.homeAccountId;\r\n account.nativeAccountId = accountDetails.nativeAccountId;\r\n const env = accountDetails.environment ||\r\n (authority && authority.getPreferredCache());\r\n if (!env) {\r\n throw createClientAuthError(invalidCacheEnvironment);\r\n }\r\n account.environment = env;\r\n // non AAD scenarios can have empty realm\r\n account.realm =\r\n clientInfo?.utid ||\r\n getTenantIdFromIdTokenClaims(accountDetails.idTokenClaims) ||\r\n "";\r\n // How do you account for MSA CID here?\r\n account.localAccountId =\r\n clientInfo?.uid ||\r\n accountDetails.idTokenClaims?.oid ||\r\n accountDetails.idTokenClaims?.sub ||\r\n "";\r\n /*\r\n * In B2C scenarios the emails claim is used instead of preferred_username and it is an array.\r\n * In most cases it will contain a single email. This field should not be relied upon if a custom\r\n * policy is configured to return more than 1 email.\r\n */\r\n const preferredUsername = accountDetails.idTokenClaims?.preferred_username ||\r\n accountDetails.idTokenClaims?.upn;\r\n const email = accountDetails.idTokenClaims?.emails\r\n ? accountDetails.idTokenClaims.emails[0]\r\n : null;\r\n account.username = preferredUsername || email || "";\r\n account.name = accountDetails.idTokenClaims?.name || "";\r\n account.cloudGraphHostName = accountDetails.cloudGraphHostName;\r\n account.msGraphHost = accountDetails.msGraphHost;\r\n if (accountDetails.tenantProfiles) {\r\n account.tenantProfiles = accountDetails.tenantProfiles;\r\n }\r\n else {\r\n const tenantProfile = buildTenantProfile(accountDetails.homeAccountId, account.localAccountId, account.realm, accountDetails.idTokenClaims);\r\n account.tenantProfiles = [tenantProfile];\r\n }\r\n return account;\r\n }\r\n /**\r\n * Creates an AccountEntity object from AccountInfo\r\n * @param accountInfo\r\n * @param cloudGraphHostName\r\n * @param msGraphHost\r\n * @returns\r\n */\r\n static createFromAccountInfo(accountInfo, cloudGraphHostName, msGraphHost) {\r\n const account = new AccountEntity();\r\n account.authorityType =\r\n accountInfo.authorityType || CacheAccountType.GENERIC_ACCOUNT_TYPE;\r\n account.homeAccountId = accountInfo.homeAccountId;\r\n account.localAccountId = accountInfo.localAccountId;\r\n account.nativeAccountId = accountInfo.nativeAccountId;\r\n account.realm = accountInfo.tenantId;\r\n account.environment = accountInfo.environment;\r\n account.username = accountInfo.username;\r\n account.name = accountInfo.name;\r\n account.cloudGraphHostName = cloudGraphHostName;\r\n account.msGraphHost = msGraphHost;\r\n // Serialize tenant profiles map into an array\r\n account.tenantProfiles = Array.from(accountInfo.tenantProfiles?.values() || []);\r\n return account;\r\n }\r\n /**\r\n * Generate HomeAccountId from server response\r\n * @param serverClientInfo\r\n * @param authType\r\n */\r\n static generateHomeAccountId(serverClientInfo, authType, logger, cryptoObj, idTokenClaims) {\r\n // since ADFS/DSTS do not have tid and does not set client_info\r\n if (!(authType === AuthorityType.Adfs ||\r\n authType === AuthorityType.Dsts)) {\r\n // for cases where there is clientInfo\r\n if (serverClientInfo) {\r\n try {\r\n const clientInfo = buildClientInfo(serverClientInfo, cryptoObj.base64Decode);\r\n if (clientInfo.uid && clientInfo.utid) {\r\n return `${clientInfo.uid}.${clientInfo.utid}`;\r\n }\r\n }\r\n catch (e) { }\r\n }\r\n logger.warning("No client info in response");\r\n }\r\n // default to "sub" claim\r\n return idTokenClaims?.sub || "";\r\n }\r\n /**\r\n * Validates an entity: checks for all expected params\r\n * @param entity\r\n */\r\n static isAccountEntity(entity) {\r\n if (!entity) {\r\n return false;\r\n }\r\n return (entity.hasOwnProperty("homeAccountId") &&\r\n entity.hasOwnProperty("environment") &&\r\n entity.hasOwnProperty("realm") &&\r\n entity.hasOwnProperty("localAccountId") &&\r\n entity.hasOwnProperty("username") &&\r\n entity.hasOwnProperty("authorityType"));\r\n }\r\n /**\r\n * Helper function to determine whether 2 accountInfo objects represent the same account\r\n * @param accountA\r\n * @param accountB\r\n * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality\r\n */\r\n static accountInfoIsEqual(accountA, accountB, compareClaims) {\r\n if (!accountA || !accountB) {\r\n return false;\r\n }\r\n let claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false\r\n if (compareClaims) {\r\n const accountAClaims = (accountA.idTokenClaims ||\r\n {});\r\n const accountBClaims = (accountB.idTokenClaims ||\r\n {});\r\n // issued at timestamp and nonce are expected to change each time a new id token is acquired\r\n claimsMatch =\r\n accountAClaims.iat === accountBClaims.iat &&\r\n accountAClaims.nonce === accountBClaims.nonce;\r\n }\r\n return (accountA.homeAccountId === accountB.homeAccountId &&\r\n accountA.localAccountId === accountB.localAccountId &&\r\n accountA.username === accountB.username &&\r\n accountA.tenantId === accountB.tenantId &&\r\n accountA.environment === accountB.environment &&\r\n accountA.nativeAccountId === accountB.nativeAccountId &&\r\n claimsMatch);\r\n }\r\n}\n\n\n//# sourceMappingURL=AccountEntity.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/AuthorityMetadata.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst rawMetdataJSON = {\r\n endpointMetadata: {\r\n "login.microsoftonline.com": {\r\n token_endpoint: "https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/token",\r\n jwks_uri: "https://login.microsoftonline.com/{tenantid}/discovery/v2.0/keys",\r\n issuer: "https://login.microsoftonline.com/{tenantid}/v2.0",\r\n authorization_endpoint: "https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/authorize",\r\n end_session_endpoint: "https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/logout",\r\n },\r\n "login.chinacloudapi.cn": {\r\n token_endpoint: "https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/token",\r\n jwks_uri: "https://login.chinacloudapi.cn/{tenantid}/discovery/v2.0/keys",\r\n issuer: "https://login.partner.microsoftonline.cn/{tenantid}/v2.0",\r\n authorization_endpoint: "https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/authorize",\r\n end_session_endpoint: "https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/logout",\r\n },\r\n "login.microsoftonline.us": {\r\n token_endpoint: "https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/token",\r\n jwks_uri: "https://login.microsoftonline.us/{tenantid}/discovery/v2.0/keys",\r\n issuer: "https://login.microsoftonline.us/{tenantid}/v2.0",\r\n authorization_endpoint: "https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/authorize",\r\n end_session_endpoint: "https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/logout",\r\n },\r\n },\r\n instanceDiscoveryMetadata: {\r\n tenant_discovery_endpoint: "https://{canonicalAuthority}/v2.0/.well-known/openid-configuration",\r\n metadata: [\r\n {\r\n preferred_network: "login.microsoftonline.com",\r\n preferred_cache: "login.windows.net",\r\n aliases: [\r\n "login.microsoftonline.com",\r\n "login.windows.net",\r\n "login.microsoft.com",\r\n "sts.windows.net",\r\n ],\r\n },\r\n {\r\n preferred_network: "login.partner.microsoftonline.cn",\r\n preferred_cache: "login.partner.microsoftonline.cn",\r\n aliases: [\r\n "login.partner.microsoftonline.cn",\r\n "login.chinacloudapi.cn",\r\n ],\r\n },\r\n {\r\n preferred_network: "login.microsoftonline.de",\r\n preferred_cache: "login.microsoftonline.de",\r\n aliases: ["login.microsoftonline.de"],\r\n },\r\n {\r\n preferred_network: "login.microsoftonline.us",\r\n preferred_cache: "login.microsoftonline.us",\r\n aliases: [\r\n "login.microsoftonline.us",\r\n "login.usgovcloudapi.net",\r\n ],\r\n },\r\n {\r\n preferred_network: "login-us.microsoftonline.com",\r\n preferred_cache: "login-us.microsoftonline.com",\r\n aliases: ["login-us.microsoftonline.com"],\r\n },\r\n ],\r\n },\r\n};\r\nconst EndpointMetadata = rawMetdataJSON.endpointMetadata;\r\nconst InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;\r\nconst InstanceDiscoveryMetadataAliases = new Set();\r\nInstanceDiscoveryMetadata.metadata.forEach((metadataEntry) => {\r\n metadataEntry.aliases.forEach((alias) => {\r\n InstanceDiscoveryMetadataAliases.add(alias);\r\n });\r\n});\r\n/**\r\n * Attempts to get an aliases array from the static authority metadata sources based on the canonical authority host\r\n * @param staticAuthorityOptions\r\n * @param logger\r\n * @returns\r\n */\r\nfunction getAliasesFromStaticSources(staticAuthorityOptions, logger) {\r\n let staticAliases;\r\n const canonicalAuthority = staticAuthorityOptions.canonicalAuthority;\r\n if (canonicalAuthority) {\r\n const authorityHost = new UrlString(canonicalAuthority).getUrlComponents().HostNameAndPort;\r\n staticAliases =\r\n getAliasesFromMetadata(authorityHost, staticAuthorityOptions.cloudDiscoveryMetadata?.metadata, AuthorityMetadataSource.CONFIG, logger) ||\r\n getAliasesFromMetadata(authorityHost, InstanceDiscoveryMetadata.metadata, AuthorityMetadataSource.HARDCODED_VALUES, logger) ||\r\n staticAuthorityOptions.knownAuthorities;\r\n }\r\n return staticAliases || [];\r\n}\r\n/**\r\n * Returns aliases for from the raw cloud discovery metadata passed in\r\n * @param authorityHost\r\n * @param rawCloudDiscoveryMetadata\r\n * @returns\r\n */\r\nfunction getAliasesFromMetadata(authorityHost, cloudDiscoveryMetadata, source, logger) {\r\n logger?.trace(`getAliasesFromMetadata called with source: ${source}`);\r\n if (authorityHost && cloudDiscoveryMetadata) {\r\n const metadata = getCloudDiscoveryMetadataFromNetworkResponse(cloudDiscoveryMetadata, authorityHost);\r\n if (metadata) {\r\n logger?.trace(`getAliasesFromMetadata: found cloud discovery metadata in ${source}, returning aliases`);\r\n return metadata.aliases;\r\n }\r\n else {\r\n logger?.trace(`getAliasesFromMetadata: did not find cloud discovery metadata in ${source}`);\r\n }\r\n }\r\n return null;\r\n}\r\n/**\r\n * Get cloud discovery metadata for common authorities\r\n */\r\nfunction getCloudDiscoveryMetadataFromHardcodedValues(authorityHost) {\r\n const metadata = getCloudDiscoveryMetadataFromNetworkResponse(InstanceDiscoveryMetadata.metadata, authorityHost);\r\n return metadata;\r\n}\r\n/**\r\n * Searches instance discovery network response for the entry that contains the host in the aliases list\r\n * @param response\r\n * @param authority\r\n */\r\nfunction getCloudDiscoveryMetadataFromNetworkResponse(response, authorityHost) {\r\n for (let i = 0; i < response.length; i++) {\r\n const metadata = response[i];\r\n if (metadata.aliases.includes(authorityHost)) {\r\n return metadata;\r\n }\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=AuthorityMetadata.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/CacheErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst cacheQuotaExceededErrorCode = "cache_quota_exceeded";\r\nconst cacheUnknownErrorCode = "cache_error_unknown";\n\n\n//# sourceMappingURL=CacheErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/CacheError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst CacheErrorMessages = {\r\n [cacheQuotaExceededErrorCode]: "Exceeded cache storage capacity.",\r\n [cacheUnknownErrorCode]: "Unexpected error occurred when using cache storage.",\r\n};\r\n/**\r\n * Error thrown when there is an error with the cache\r\n */\r\nclass CacheError extends Error {\r\n constructor(errorCode, errorMessage) {\r\n const message = errorMessage ||\r\n (CacheErrorMessages[errorCode]\r\n ? CacheErrorMessages[errorCode]\r\n : CacheErrorMessages[cacheUnknownErrorCode]);\r\n super(`${errorCode}: ${message}`);\r\n Object.setPrototypeOf(this, CacheError.prototype);\r\n this.name = "CacheError";\r\n this.errorCode = errorCode;\r\n this.errorMessage = message;\r\n }\r\n}\n\n\n//# sourceMappingURL=CacheError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/cache/CacheManager.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.\r\n * @internal\r\n */\r\nclass CacheManager {\r\n constructor(clientId, cryptoImpl, logger, staticAuthorityOptions) {\r\n this.clientId = clientId;\r\n this.cryptoImpl = cryptoImpl;\r\n this.commonLogger = logger.clone(packageMetadata_name, version);\r\n this.staticAuthorityOptions = staticAuthorityOptions;\r\n }\r\n /**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\n getAllAccounts(accountFilter) {\r\n return this.buildTenantProfiles(this.getAccountsFilteredBy(accountFilter || {}), accountFilter);\r\n }\r\n /**\r\n * Gets first tenanted AccountInfo object found based on provided filters\r\n */\r\n getAccountInfoFilteredBy(accountFilter) {\r\n const allAccounts = this.getAllAccounts(accountFilter);\r\n if (allAccounts.length > 1) {\r\n // If one or more accounts are found, prioritize accounts that have an ID token\r\n const sortedAccounts = allAccounts.sort((account) => {\r\n return account.idTokenClaims ? -1 : 1;\r\n });\r\n return sortedAccounts[0];\r\n }\r\n else if (allAccounts.length === 1) {\r\n // If only one account is found, return it regardless of whether a matching ID token was found\r\n return allAccounts[0];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * Returns a single matching\r\n * @param accountFilter\r\n * @returns\r\n */\r\n getBaseAccountInfo(accountFilter) {\r\n const accountEntities = this.getAccountsFilteredBy(accountFilter);\r\n if (accountEntities.length > 0) {\r\n return accountEntities[0].getAccountInfo();\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * Matches filtered account entities with cached ID tokens that match the tenant profile-specific account filters\r\n * and builds the account info objects from the matching ID token\'s claims\r\n * @param cachedAccounts\r\n * @param accountFilter\r\n * @returns Array of AccountInfo objects that match account and tenant profile filters\r\n */\r\n buildTenantProfiles(cachedAccounts, accountFilter) {\r\n return cachedAccounts.flatMap((accountEntity) => {\r\n return this.getTenantProfilesFromAccountEntity(accountEntity, accountFilter?.tenantId, accountFilter);\r\n });\r\n }\r\n getTenantedAccountInfoByFilter(accountInfo, tokenKeys, tenantProfile, tenantProfileFilter) {\r\n let tenantedAccountInfo = null;\r\n let idTokenClaims;\r\n if (tenantProfileFilter) {\r\n if (!this.tenantProfileMatchesFilter(tenantProfile, tenantProfileFilter)) {\r\n return null;\r\n }\r\n }\r\n const idToken = this.getIdToken(accountInfo, tokenKeys, tenantProfile.tenantId);\r\n if (idToken) {\r\n idTokenClaims = extractTokenClaims(idToken.secret, this.cryptoImpl.base64Decode);\r\n if (!this.idTokenClaimsMatchTenantProfileFilter(idTokenClaims, tenantProfileFilter)) {\r\n // ID token sourced claims don\'t match so this tenant profile is not a match\r\n return null;\r\n }\r\n }\r\n // Expand tenant profile into account info based on matching tenant profile and if available matching ID token claims\r\n tenantedAccountInfo = updateAccountTenantProfileData(accountInfo, tenantProfile, idTokenClaims, idToken?.secret);\r\n return tenantedAccountInfo;\r\n }\r\n getTenantProfilesFromAccountEntity(accountEntity, targetTenantId, tenantProfileFilter) {\r\n const accountInfo = accountEntity.getAccountInfo();\r\n let searchTenantProfiles = accountInfo.tenantProfiles || new Map();\r\n const tokenKeys = this.getTokenKeys();\r\n // If a tenant ID was provided, only return the tenant profile for that tenant ID if it exists\r\n if (targetTenantId) {\r\n const tenantProfile = searchTenantProfiles.get(targetTenantId);\r\n if (tenantProfile) {\r\n // Reduce search field to just this tenant profile\r\n searchTenantProfiles = new Map([\r\n [targetTenantId, tenantProfile],\r\n ]);\r\n }\r\n else {\r\n // No tenant profile for search tenant ID, return empty array\r\n return [];\r\n }\r\n }\r\n const matchingTenantProfiles = [];\r\n searchTenantProfiles.forEach((tenantProfile) => {\r\n const tenantedAccountInfo = this.getTenantedAccountInfoByFilter(accountInfo, tokenKeys, tenantProfile, tenantProfileFilter);\r\n if (tenantedAccountInfo) {\r\n matchingTenantProfiles.push(tenantedAccountInfo);\r\n }\r\n });\r\n return matchingTenantProfiles;\r\n }\r\n tenantProfileMatchesFilter(tenantProfile, tenantProfileFilter) {\r\n if (!!tenantProfileFilter.localAccountId &&\r\n !this.matchLocalAccountIdFromTenantProfile(tenantProfile, tenantProfileFilter.localAccountId)) {\r\n return false;\r\n }\r\n if (!!tenantProfileFilter.name &&\r\n !(tenantProfile.name === tenantProfileFilter.name)) {\r\n return false;\r\n }\r\n if (tenantProfileFilter.isHomeTenant !== undefined &&\r\n !(tenantProfile.isHomeTenant === tenantProfileFilter.isHomeTenant)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n idTokenClaimsMatchTenantProfileFilter(idTokenClaims, tenantProfileFilter) {\r\n // Tenant Profile filtering\r\n if (tenantProfileFilter) {\r\n if (!!tenantProfileFilter.localAccountId &&\r\n !this.matchLocalAccountIdFromTokenClaims(idTokenClaims, tenantProfileFilter.localAccountId)) {\r\n return false;\r\n }\r\n if (!!tenantProfileFilter.loginHint &&\r\n !this.matchLoginHintFromTokenClaims(idTokenClaims, tenantProfileFilter.loginHint)) {\r\n return false;\r\n }\r\n if (!!tenantProfileFilter.username &&\r\n !this.matchUsername(idTokenClaims.preferred_username, tenantProfileFilter.username)) {\r\n return false;\r\n }\r\n if (!!tenantProfileFilter.name &&\r\n !this.matchName(idTokenClaims, tenantProfileFilter.name)) {\r\n return false;\r\n }\r\n if (!!tenantProfileFilter.sid &&\r\n !this.matchSid(idTokenClaims, tenantProfileFilter.sid)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * saves a cache record\r\n * @param cacheRecord {CacheRecord}\r\n * @param storeInCache {?StoreInCache}\r\n * @param correlationId {?string} correlation id\r\n */\r\n async saveCacheRecord(cacheRecord, storeInCache, correlationId) {\r\n if (!cacheRecord) {\r\n throw createClientAuthError(invalidCacheRecord);\r\n }\r\n try {\r\n if (!!cacheRecord.account) {\r\n this.setAccount(cacheRecord.account);\r\n }\r\n if (!!cacheRecord.idToken && storeInCache?.idToken !== false) {\r\n this.setIdTokenCredential(cacheRecord.idToken);\r\n }\r\n if (!!cacheRecord.accessToken &&\r\n storeInCache?.accessToken !== false) {\r\n await this.saveAccessToken(cacheRecord.accessToken);\r\n }\r\n if (!!cacheRecord.refreshToken &&\r\n storeInCache?.refreshToken !== false) {\r\n this.setRefreshTokenCredential(cacheRecord.refreshToken);\r\n }\r\n if (!!cacheRecord.appMetadata) {\r\n this.setAppMetadata(cacheRecord.appMetadata);\r\n }\r\n }\r\n catch (e) {\r\n this.commonLogger?.error(`CacheManager.saveCacheRecord: failed`);\r\n if (e instanceof Error) {\r\n this.commonLogger?.errorPii(`CacheManager.saveCacheRecord: ${e.message}`, correlationId);\r\n if (e.name === "QuotaExceededError" ||\r\n e.name === "NS_ERROR_DOM_QUOTA_REACHED" ||\r\n e.message.includes("exceeded the quota")) {\r\n this.commonLogger?.error(`CacheManager.saveCacheRecord: exceeded storage quota`, correlationId);\r\n throw new CacheError(cacheQuotaExceededErrorCode);\r\n }\r\n else {\r\n throw new CacheError(e.name, e.message);\r\n }\r\n }\r\n else {\r\n this.commonLogger?.errorPii(`CacheManager.saveCacheRecord: ${e}`, correlationId);\r\n throw new CacheError(cacheUnknownErrorCode);\r\n }\r\n }\r\n }\r\n /**\r\n * saves access token credential\r\n * @param credential\r\n */\r\n async saveAccessToken(credential) {\r\n const accessTokenFilter = {\r\n clientId: credential.clientId,\r\n credentialType: credential.credentialType,\r\n environment: credential.environment,\r\n homeAccountId: credential.homeAccountId,\r\n realm: credential.realm,\r\n tokenType: credential.tokenType,\r\n requestedClaimsHash: credential.requestedClaimsHash,\r\n };\r\n const tokenKeys = this.getTokenKeys();\r\n const currentScopes = ScopeSet.fromString(credential.target);\r\n const removedAccessTokens = [];\r\n tokenKeys.accessToken.forEach((key) => {\r\n if (!this.accessTokenKeyMatchesFilter(key, accessTokenFilter, false)) {\r\n return;\r\n }\r\n const tokenEntity = this.getAccessTokenCredential(key);\r\n if (tokenEntity &&\r\n this.credentialMatchesFilter(tokenEntity, accessTokenFilter)) {\r\n const tokenScopeSet = ScopeSet.fromString(tokenEntity.target);\r\n if (tokenScopeSet.intersectingScopeSets(currentScopes)) {\r\n removedAccessTokens.push(this.removeAccessToken(key));\r\n }\r\n }\r\n });\r\n await Promise.all(removedAccessTokens);\r\n this.setAccessTokenCredential(credential);\r\n }\r\n /**\r\n * Retrieve account entities matching all provided tenant-agnostic filters; if no filter is set, get all account entities in the cache\r\n * Not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared\r\n * @param accountFilter - An object containing Account properties to filter by\r\n */\r\n getAccountsFilteredBy(accountFilter) {\r\n const allAccountKeys = this.getAccountKeys();\r\n const matchingAccounts = [];\r\n allAccountKeys.forEach((cacheKey) => {\r\n if (!this.isAccountKey(cacheKey, accountFilter.homeAccountId)) {\r\n // Don\'t parse value if the key doesn\'t match the account filters\r\n return;\r\n }\r\n const entity = this.getAccount(cacheKey, this.commonLogger);\r\n // Match base account fields\r\n if (!entity) {\r\n return;\r\n }\r\n if (!!accountFilter.homeAccountId &&\r\n !this.matchHomeAccountId(entity, accountFilter.homeAccountId)) {\r\n return;\r\n }\r\n if (!!accountFilter.username &&\r\n !this.matchUsername(entity.username, accountFilter.username)) {\r\n return;\r\n }\r\n if (!!accountFilter.environment &&\r\n !this.matchEnvironment(entity, accountFilter.environment)) {\r\n return;\r\n }\r\n if (!!accountFilter.realm &&\r\n !this.matchRealm(entity, accountFilter.realm)) {\r\n return;\r\n }\r\n if (!!accountFilter.nativeAccountId &&\r\n !this.matchNativeAccountId(entity, accountFilter.nativeAccountId)) {\r\n return;\r\n }\r\n if (!!accountFilter.authorityType &&\r\n !this.matchAuthorityType(entity, accountFilter.authorityType)) {\r\n return;\r\n }\r\n // If at least one tenant profile matches the tenant profile filter, add the account to the list of matching accounts\r\n const tenantProfileFilter = {\r\n localAccountId: accountFilter?.localAccountId,\r\n name: accountFilter?.name,\r\n };\r\n const matchingTenantProfiles = entity.tenantProfiles?.filter((tenantProfile) => {\r\n return this.tenantProfileMatchesFilter(tenantProfile, tenantProfileFilter);\r\n });\r\n if (matchingTenantProfiles && matchingTenantProfiles.length === 0) {\r\n // No tenant profile for this account matches filter, don\'t add to list of matching accounts\r\n return;\r\n }\r\n matchingAccounts.push(entity);\r\n });\r\n return matchingAccounts;\r\n }\r\n /**\r\n * Returns true if the given key matches our account key schema. Also matches homeAccountId and/or tenantId if provided\r\n * @param key\r\n * @param homeAccountId\r\n * @param tenantId\r\n * @returns\r\n */\r\n isAccountKey(key, homeAccountId, tenantId) {\r\n if (key.split(Separators.CACHE_KEY_SEPARATOR).length < 3) {\r\n // Account cache keys contain 3 items separated by \'-\' (each item may also contain \'-\')\r\n return false;\r\n }\r\n if (homeAccountId &&\r\n !key.toLowerCase().includes(homeAccountId.toLowerCase())) {\r\n return false;\r\n }\r\n if (tenantId && !key.toLowerCase().includes(tenantId.toLowerCase())) {\r\n return false;\r\n }\r\n // Do not check environment as aliasing can cause false negatives\r\n return true;\r\n }\r\n /**\r\n * Returns true if the given key matches our credential key schema.\r\n * @param key\r\n */\r\n isCredentialKey(key) {\r\n if (key.split(Separators.CACHE_KEY_SEPARATOR).length < 6) {\r\n // Credential cache keys contain 6 items separated by \'-\' (each item may also contain \'-\')\r\n return false;\r\n }\r\n const lowerCaseKey = key.toLowerCase();\r\n // Credential keys must indicate what credential type they represent\r\n if (lowerCaseKey.indexOf(CredentialType.ID_TOKEN.toLowerCase()) ===\r\n -1 &&\r\n lowerCaseKey.indexOf(CredentialType.ACCESS_TOKEN.toLowerCase()) ===\r\n -1 &&\r\n lowerCaseKey.indexOf(CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) === -1 &&\r\n lowerCaseKey.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) ===\r\n -1) {\r\n return false;\r\n }\r\n if (lowerCaseKey.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) >\r\n -1) {\r\n // Refresh tokens must contain the client id or family id\r\n const clientIdValidation = `${CredentialType.REFRESH_TOKEN}${Separators.CACHE_KEY_SEPARATOR}${this.clientId}${Separators.CACHE_KEY_SEPARATOR}`;\r\n const familyIdValidation = `${CredentialType.REFRESH_TOKEN}${Separators.CACHE_KEY_SEPARATOR}${THE_FAMILY_ID}${Separators.CACHE_KEY_SEPARATOR}`;\r\n if (lowerCaseKey.indexOf(clientIdValidation.toLowerCase()) === -1 &&\r\n lowerCaseKey.indexOf(familyIdValidation.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n }\r\n else if (lowerCaseKey.indexOf(this.clientId.toLowerCase()) === -1) {\r\n // Tokens must contain the clientId\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Returns whether or not the given credential entity matches the filter\r\n * @param entity\r\n * @param filter\r\n * @returns\r\n */\r\n credentialMatchesFilter(entity, filter) {\r\n if (!!filter.clientId && !this.matchClientId(entity, filter.clientId)) {\r\n return false;\r\n }\r\n if (!!filter.userAssertionHash &&\r\n !this.matchUserAssertionHash(entity, filter.userAssertionHash)) {\r\n return false;\r\n }\r\n /*\r\n * homeAccountId can be undefined, and we want to filter out cached items that have a homeAccountId of ""\r\n * because we don\'t want a client_credential request to return a cached token that has a homeAccountId\r\n */\r\n if (typeof filter.homeAccountId === "string" &&\r\n !this.matchHomeAccountId(entity, filter.homeAccountId)) {\r\n return false;\r\n }\r\n if (!!filter.environment &&\r\n !this.matchEnvironment(entity, filter.environment)) {\r\n return false;\r\n }\r\n if (!!filter.realm && !this.matchRealm(entity, filter.realm)) {\r\n return false;\r\n }\r\n if (!!filter.credentialType &&\r\n !this.matchCredentialType(entity, filter.credentialType)) {\r\n return false;\r\n }\r\n if (!!filter.familyId && !this.matchFamilyId(entity, filter.familyId)) {\r\n return false;\r\n }\r\n /*\r\n * idTokens do not have "target", target specific refreshTokens do exist for some types of authentication\r\n * Resource specific refresh tokens case will be added when the support is deemed necessary\r\n */\r\n if (!!filter.target && !this.matchTarget(entity, filter.target)) {\r\n return false;\r\n }\r\n // If request OR cached entity has requested Claims Hash, check if they match\r\n if (filter.requestedClaimsHash || entity.requestedClaimsHash) {\r\n // Don\'t match if either is undefined or they are different\r\n if (entity.requestedClaimsHash !== filter.requestedClaimsHash) {\r\n return false;\r\n }\r\n }\r\n // Access Token with Auth Scheme specific matching\r\n if (entity.credentialType ===\r\n CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {\r\n if (!!filter.tokenType &&\r\n !this.matchTokenType(entity, filter.tokenType)) {\r\n return false;\r\n }\r\n // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key\r\n if (filter.tokenType === AuthenticationScheme.SSH) {\r\n if (filter.keyId && !this.matchKeyId(entity, filter.keyId)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata\r\n * @param filter\r\n */\r\n getAppMetadataFilteredBy(filter) {\r\n const allCacheKeys = this.getKeys();\r\n const matchingAppMetadata = {};\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don\'t parse any non-appMetadata type cache entities\r\n if (!this.isAppMetadata(cacheKey)) {\r\n return;\r\n }\r\n // Attempt retrieval\r\n const entity = this.getAppMetadata(cacheKey);\r\n if (!entity) {\r\n return;\r\n }\r\n if (!!filter.environment &&\r\n !this.matchEnvironment(entity, filter.environment)) {\r\n return;\r\n }\r\n if (!!filter.clientId &&\r\n !this.matchClientId(entity, filter.clientId)) {\r\n return;\r\n }\r\n matchingAppMetadata[cacheKey] = entity;\r\n });\r\n return matchingAppMetadata;\r\n }\r\n /**\r\n * retrieve authorityMetadata that contains a matching alias\r\n * @param filter\r\n */\r\n getAuthorityMetadataByAlias(host) {\r\n const allCacheKeys = this.getAuthorityMetadataKeys();\r\n let matchedEntity = null;\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don\'t parse any non-authorityMetadata type cache entities\r\n if (!this.isAuthorityMetadata(cacheKey) ||\r\n cacheKey.indexOf(this.clientId) === -1) {\r\n return;\r\n }\r\n // Attempt retrieval\r\n const entity = this.getAuthorityMetadata(cacheKey);\r\n if (!entity) {\r\n return;\r\n }\r\n if (entity.aliases.indexOf(host) === -1) {\r\n return;\r\n }\r\n matchedEntity = entity;\r\n });\r\n return matchedEntity;\r\n }\r\n /**\r\n * Removes all accounts and related tokens from cache.\r\n */\r\n async removeAllAccounts() {\r\n const allAccountKeys = this.getAccountKeys();\r\n const removedAccounts = [];\r\n allAccountKeys.forEach((cacheKey) => {\r\n removedAccounts.push(this.removeAccount(cacheKey));\r\n });\r\n await Promise.all(removedAccounts);\r\n }\r\n /**\r\n * Removes the account and related tokens for a given account key\r\n * @param account\r\n */\r\n async removeAccount(accountKey) {\r\n const account = this.getAccount(accountKey, this.commonLogger);\r\n if (!account) {\r\n return;\r\n }\r\n await this.removeAccountContext(account);\r\n this.removeItem(accountKey);\r\n }\r\n /**\r\n * Removes credentials associated with the provided account\r\n * @param account\r\n */\r\n async removeAccountContext(account) {\r\n const allTokenKeys = this.getTokenKeys();\r\n const accountId = account.generateAccountId();\r\n const removedCredentials = [];\r\n allTokenKeys.idToken.forEach((key) => {\r\n if (key.indexOf(accountId) === 0) {\r\n this.removeIdToken(key);\r\n }\r\n });\r\n allTokenKeys.accessToken.forEach((key) => {\r\n if (key.indexOf(accountId) === 0) {\r\n removedCredentials.push(this.removeAccessToken(key));\r\n }\r\n });\r\n allTokenKeys.refreshToken.forEach((key) => {\r\n if (key.indexOf(accountId) === 0) {\r\n this.removeRefreshToken(key);\r\n }\r\n });\r\n await Promise.all(removedCredentials);\r\n }\r\n /**\r\n * Migrates a single-tenant account and all it\'s associated alternate cross-tenant account objects in the\r\n * cache into a condensed multi-tenant account object with tenant profiles.\r\n * @param accountKey\r\n * @param accountEntity\r\n * @param logger\r\n * @returns\r\n */\r\n updateOutdatedCachedAccount(accountKey, accountEntity, logger) {\r\n // Only update if account entity is defined and has no tenantProfiles object (is outdated)\r\n if (accountEntity && accountEntity.isSingleTenant()) {\r\n this.commonLogger?.verbose("updateOutdatedCachedAccount: Found a single-tenant (outdated) account entity in the cache, migrating to multi-tenant account entity");\r\n // Get keys of all accounts belonging to user\r\n const matchingAccountKeys = this.getAccountKeys().filter((key) => {\r\n return key.startsWith(accountEntity.homeAccountId);\r\n });\r\n // Get all account entities belonging to user\r\n const accountsToMerge = [];\r\n matchingAccountKeys.forEach((key) => {\r\n const account = this.getCachedAccountEntity(key);\r\n if (account) {\r\n accountsToMerge.push(account);\r\n }\r\n });\r\n // Set base account to home account if available, any account if not\r\n const baseAccount = accountsToMerge.find((account) => {\r\n return tenantIdMatchesHomeTenant(account.realm, account.homeAccountId);\r\n }) || accountsToMerge[0];\r\n // Populate tenant profiles built from each account entity belonging to the user\r\n baseAccount.tenantProfiles = accountsToMerge.map((account) => {\r\n return {\r\n tenantId: account.realm,\r\n localAccountId: account.localAccountId,\r\n name: account.name,\r\n isHomeTenant: tenantIdMatchesHomeTenant(account.realm, account.homeAccountId),\r\n };\r\n });\r\n const updatedAccount = CacheManager.toObject(new AccountEntity(), {\r\n ...baseAccount,\r\n });\r\n const newAccountKey = updatedAccount.generateAccountKey();\r\n // Clear cache of legacy account objects that have been collpsed into tenant profiles\r\n matchingAccountKeys.forEach((key) => {\r\n if (key !== newAccountKey) {\r\n this.removeOutdatedAccount(accountKey);\r\n }\r\n });\r\n // Cache updated account object\r\n this.setAccount(updatedAccount);\r\n logger?.verbose("Updated an outdated account entity in the cache");\r\n return updatedAccount;\r\n }\r\n // No update is necessary\r\n return accountEntity;\r\n }\r\n /**\r\n * returns a boolean if the given credential is removed\r\n * @param credential\r\n */\r\n async removeAccessToken(key) {\r\n const credential = this.getAccessTokenCredential(key);\r\n if (!credential) {\r\n return;\r\n }\r\n // Remove Token Binding Key from key store for PoP Tokens Credentials\r\n if (credential.credentialType.toLowerCase() ===\r\n CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) {\r\n if (credential.tokenType === AuthenticationScheme.POP) {\r\n const accessTokenWithAuthSchemeEntity = credential;\r\n const kid = accessTokenWithAuthSchemeEntity.keyId;\r\n if (kid) {\r\n try {\r\n await this.cryptoImpl.removeTokenBindingKey(kid);\r\n }\r\n catch (error) {\r\n throw createClientAuthError(bindingKeyNotRemoved);\r\n }\r\n }\r\n }\r\n }\r\n return this.removeItem(key);\r\n }\r\n /**\r\n * Removes all app metadata objects from cache.\r\n */\r\n removeAppMetadata() {\r\n const allCacheKeys = this.getKeys();\r\n allCacheKeys.forEach((cacheKey) => {\r\n if (this.isAppMetadata(cacheKey)) {\r\n this.removeItem(cacheKey);\r\n }\r\n });\r\n return true;\r\n }\r\n /**\r\n * Retrieve AccountEntity from cache\r\n * @param account\r\n */\r\n readAccountFromCache(account) {\r\n const accountKey = AccountEntity.generateAccountCacheKey(account);\r\n return this.getAccount(accountKey, this.commonLogger);\r\n }\r\n /**\r\n * Retrieve IdTokenEntity from cache\r\n * @param account {AccountInfo}\r\n * @param tokenKeys {?TokenKeys}\r\n * @param targetRealm {?string}\r\n * @param performanceClient {?IPerformanceClient}\r\n * @param correlationId {?string}\r\n */\r\n getIdToken(account, tokenKeys, targetRealm, performanceClient, correlationId) {\r\n this.commonLogger.trace("CacheManager - getIdToken called");\r\n const idTokenFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: CredentialType.ID_TOKEN,\r\n clientId: this.clientId,\r\n realm: targetRealm,\r\n };\r\n const idTokenMap = this.getIdTokensByFilter(idTokenFilter, tokenKeys);\r\n const numIdTokens = idTokenMap.size;\r\n if (numIdTokens < 1) {\r\n this.commonLogger.info("CacheManager:getIdToken - No token found");\r\n return null;\r\n }\r\n else if (numIdTokens > 1) {\r\n let tokensToBeRemoved = idTokenMap;\r\n // Multiple tenant profiles and no tenant specified, pick home account\r\n if (!targetRealm) {\r\n const homeIdTokenMap = new Map();\r\n idTokenMap.forEach((idToken, key) => {\r\n if (idToken.realm === account.tenantId) {\r\n homeIdTokenMap.set(key, idToken);\r\n }\r\n });\r\n const numHomeIdTokens = homeIdTokenMap.size;\r\n if (numHomeIdTokens < 1) {\r\n this.commonLogger.info("CacheManager:getIdToken - Multiple ID tokens found for account but none match account entity tenant id, returning first result");\r\n return idTokenMap.values().next().value;\r\n }\r\n else if (numHomeIdTokens === 1) {\r\n this.commonLogger.info("CacheManager:getIdToken - Multiple ID tokens found for account, defaulting to home tenant profile");\r\n return homeIdTokenMap.values().next().value;\r\n }\r\n else {\r\n // Multiple ID tokens for home tenant profile, remove all and return null\r\n tokensToBeRemoved = homeIdTokenMap;\r\n }\r\n }\r\n // Multiple tokens for a single tenant profile, remove all and return null\r\n this.commonLogger.info("CacheManager:getIdToken - Multiple matching ID tokens found, clearing them");\r\n tokensToBeRemoved.forEach((idToken, key) => {\r\n this.removeIdToken(key);\r\n });\r\n if (performanceClient && correlationId) {\r\n performanceClient.addFields({ multiMatchedID: idTokenMap.size }, correlationId);\r\n }\r\n return null;\r\n }\r\n this.commonLogger.info("CacheManager:getIdToken - Returning ID token");\r\n return idTokenMap.values().next().value;\r\n }\r\n /**\r\n * Gets all idTokens matching the given filter\r\n * @param filter\r\n * @returns\r\n */\r\n getIdTokensByFilter(filter, tokenKeys) {\r\n const idTokenKeys = (tokenKeys && tokenKeys.idToken) || this.getTokenKeys().idToken;\r\n const idTokens = new Map();\r\n idTokenKeys.forEach((key) => {\r\n if (!this.idTokenKeyMatchesFilter(key, {\r\n clientId: this.clientId,\r\n ...filter,\r\n })) {\r\n return;\r\n }\r\n const idToken = this.getIdTokenCredential(key);\r\n if (idToken && this.credentialMatchesFilter(idToken, filter)) {\r\n idTokens.set(key, idToken);\r\n }\r\n });\r\n return idTokens;\r\n }\r\n /**\r\n * Validate the cache key against filter before retrieving and parsing cache value\r\n * @param key\r\n * @param filter\r\n * @returns\r\n */\r\n idTokenKeyMatchesFilter(inputKey, filter) {\r\n const key = inputKey.toLowerCase();\r\n if (filter.clientId &&\r\n key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.homeAccountId &&\r\n key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Removes idToken from the cache\r\n * @param key\r\n */\r\n removeIdToken(key) {\r\n this.removeItem(key);\r\n }\r\n /**\r\n * Removes refresh token from the cache\r\n * @param key\r\n */\r\n removeRefreshToken(key) {\r\n this.removeItem(key);\r\n }\r\n /**\r\n * Retrieve AccessTokenEntity from cache\r\n * @param account {AccountInfo}\r\n * @param request {BaseAuthRequest}\r\n * @param tokenKeys {?TokenKeys}\r\n * @param performanceClient {?IPerformanceClient}\r\n * @param correlationId {?string}\r\n */\r\n getAccessToken(account, request, tokenKeys, targetRealm, performanceClient, correlationId) {\r\n this.commonLogger.trace("CacheManager - getAccessToken called");\r\n const scopes = ScopeSet.createSearchScopes(request.scopes);\r\n const authScheme = request.authenticationScheme || AuthenticationScheme.BEARER;\r\n /*\r\n * Distinguish between Bearer and PoP/SSH token cache types\r\n * Cast to lowercase to handle "bearer" from ADFS\r\n */\r\n const credentialType = authScheme &&\r\n authScheme.toLowerCase() !==\r\n AuthenticationScheme.BEARER.toLowerCase()\r\n ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME\r\n : CredentialType.ACCESS_TOKEN;\r\n const accessTokenFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: credentialType,\r\n clientId: this.clientId,\r\n realm: targetRealm || account.tenantId,\r\n target: scopes,\r\n tokenType: authScheme,\r\n keyId: request.sshKid,\r\n requestedClaimsHash: request.requestedClaimsHash,\r\n };\r\n const accessTokenKeys = (tokenKeys && tokenKeys.accessToken) ||\r\n this.getTokenKeys().accessToken;\r\n const accessTokens = [];\r\n accessTokenKeys.forEach((key) => {\r\n // Validate key\r\n if (this.accessTokenKeyMatchesFilter(key, accessTokenFilter, true)) {\r\n const accessToken = this.getAccessTokenCredential(key);\r\n // Validate value\r\n if (accessToken &&\r\n this.credentialMatchesFilter(accessToken, accessTokenFilter)) {\r\n accessTokens.push(accessToken);\r\n }\r\n }\r\n });\r\n const numAccessTokens = accessTokens.length;\r\n if (numAccessTokens < 1) {\r\n this.commonLogger.info("CacheManager:getAccessToken - No token found");\r\n return null;\r\n }\r\n else if (numAccessTokens > 1) {\r\n this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them");\r\n accessTokens.forEach((accessToken) => {\r\n void this.removeAccessToken(generateCredentialKey(accessToken));\r\n });\r\n if (performanceClient && correlationId) {\r\n performanceClient.addFields({ multiMatchedAT: accessTokens.length }, correlationId);\r\n }\r\n return null;\r\n }\r\n this.commonLogger.info("CacheManager:getAccessToken - Returning access token");\r\n return accessTokens[0];\r\n }\r\n /**\r\n * Validate the cache key against filter before retrieving and parsing cache value\r\n * @param key\r\n * @param filter\r\n * @param keyMustContainAllScopes\r\n * @returns\r\n */\r\n accessTokenKeyMatchesFilter(inputKey, filter, keyMustContainAllScopes) {\r\n const key = inputKey.toLowerCase();\r\n if (filter.clientId &&\r\n key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.homeAccountId &&\r\n key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.realm && key.indexOf(filter.realm.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.requestedClaimsHash &&\r\n key.indexOf(filter.requestedClaimsHash.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.target) {\r\n const scopes = filter.target.asArray();\r\n for (let i = 0; i < scopes.length; i++) {\r\n if (keyMustContainAllScopes &&\r\n !key.includes(scopes[i].toLowerCase())) {\r\n // When performing a cache lookup a missing scope would be a cache miss\r\n return false;\r\n }\r\n else if (!keyMustContainAllScopes &&\r\n key.includes(scopes[i].toLowerCase())) {\r\n // When performing a cache write, any token with a subset of requested scopes should be replaced\r\n return true;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Gets all access tokens matching the filter\r\n * @param filter\r\n * @returns\r\n */\r\n getAccessTokensByFilter(filter) {\r\n const tokenKeys = this.getTokenKeys();\r\n const accessTokens = [];\r\n tokenKeys.accessToken.forEach((key) => {\r\n if (!this.accessTokenKeyMatchesFilter(key, filter, true)) {\r\n return;\r\n }\r\n const accessToken = this.getAccessTokenCredential(key);\r\n if (accessToken &&\r\n this.credentialMatchesFilter(accessToken, filter)) {\r\n accessTokens.push(accessToken);\r\n }\r\n });\r\n return accessTokens;\r\n }\r\n /**\r\n * Helper to retrieve the appropriate refresh token from cache\r\n * @param account {AccountInfo}\r\n * @param familyRT {boolean}\r\n * @param tokenKeys {?TokenKeys}\r\n * @param performanceClient {?IPerformanceClient}\r\n * @param correlationId {?string}\r\n */\r\n getRefreshToken(account, familyRT, tokenKeys, performanceClient, correlationId) {\r\n this.commonLogger.trace("CacheManager - getRefreshToken called");\r\n const id = familyRT ? THE_FAMILY_ID : undefined;\r\n const refreshTokenFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: CredentialType.REFRESH_TOKEN,\r\n clientId: this.clientId,\r\n familyId: id,\r\n };\r\n const refreshTokenKeys = (tokenKeys && tokenKeys.refreshToken) ||\r\n this.getTokenKeys().refreshToken;\r\n const refreshTokens = [];\r\n refreshTokenKeys.forEach((key) => {\r\n // Validate key\r\n if (this.refreshTokenKeyMatchesFilter(key, refreshTokenFilter)) {\r\n const refreshToken = this.getRefreshTokenCredential(key);\r\n // Validate value\r\n if (refreshToken &&\r\n this.credentialMatchesFilter(refreshToken, refreshTokenFilter)) {\r\n refreshTokens.push(refreshToken);\r\n }\r\n }\r\n });\r\n const numRefreshTokens = refreshTokens.length;\r\n if (numRefreshTokens < 1) {\r\n this.commonLogger.info("CacheManager:getRefreshToken - No refresh token found.");\r\n return null;\r\n }\r\n // address the else case after remove functions address environment aliases\r\n if (numRefreshTokens > 1 && performanceClient && correlationId) {\r\n performanceClient.addFields({ multiMatchedRT: numRefreshTokens }, correlationId);\r\n }\r\n this.commonLogger.info("CacheManager:getRefreshToken - returning refresh token");\r\n return refreshTokens[0];\r\n }\r\n /**\r\n * Validate the cache key against filter before retrieving and parsing cache value\r\n * @param key\r\n * @param filter\r\n */\r\n refreshTokenKeyMatchesFilter(inputKey, filter) {\r\n const key = inputKey.toLowerCase();\r\n if (filter.familyId &&\r\n key.indexOf(filter.familyId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n // If familyId is used, clientId is not in the key\r\n if (!filter.familyId &&\r\n filter.clientId &&\r\n key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n if (filter.homeAccountId &&\r\n key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Retrieve AppMetadataEntity from cache\r\n */\r\n readAppMetadataFromCache(environment) {\r\n const appMetadataFilter = {\r\n environment,\r\n clientId: this.clientId,\r\n };\r\n const appMetadata = this.getAppMetadataFilteredBy(appMetadataFilter);\r\n const appMetadataEntries = Object.keys(appMetadata).map((key) => appMetadata[key]);\r\n const numAppMetadata = appMetadataEntries.length;\r\n if (numAppMetadata < 1) {\r\n return null;\r\n }\r\n else if (numAppMetadata > 1) {\r\n throw createClientAuthError(multipleMatchingAppMetadata);\r\n }\r\n return appMetadataEntries[0];\r\n }\r\n /**\r\n * Return the family_id value associated with FOCI\r\n * @param environment\r\n * @param clientId\r\n */\r\n isAppMetadataFOCI(environment) {\r\n const appMetadata = this.readAppMetadataFromCache(environment);\r\n return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);\r\n }\r\n /**\r\n * helper to match account ids\r\n * @param value\r\n * @param homeAccountId\r\n */\r\n matchHomeAccountId(entity, homeAccountId) {\r\n return !!(typeof entity.homeAccountId === "string" &&\r\n homeAccountId === entity.homeAccountId);\r\n }\r\n /**\r\n * helper to match account ids\r\n * @param entity\r\n * @param localAccountId\r\n * @returns\r\n */\r\n matchLocalAccountIdFromTokenClaims(tokenClaims, localAccountId) {\r\n const idTokenLocalAccountId = tokenClaims.oid || tokenClaims.sub;\r\n return localAccountId === idTokenLocalAccountId;\r\n }\r\n matchLocalAccountIdFromTenantProfile(tenantProfile, localAccountId) {\r\n return tenantProfile.localAccountId === localAccountId;\r\n }\r\n /**\r\n * helper to match names\r\n * @param entity\r\n * @param name\r\n * @returns true if the downcased name properties are present and match in the filter and the entity\r\n */\r\n matchName(claims, name) {\r\n return !!(name.toLowerCase() === claims.name?.toLowerCase());\r\n }\r\n /**\r\n * helper to match usernames\r\n * @param entity\r\n * @param username\r\n * @returns\r\n */\r\n matchUsername(cachedUsername, filterUsername) {\r\n return !!(cachedUsername &&\r\n typeof cachedUsername === "string" &&\r\n filterUsername?.toLowerCase() === cachedUsername.toLowerCase());\r\n }\r\n /**\r\n * helper to match assertion\r\n * @param value\r\n * @param oboAssertion\r\n */\r\n matchUserAssertionHash(entity, userAssertionHash) {\r\n return !!(entity.userAssertionHash &&\r\n userAssertionHash === entity.userAssertionHash);\r\n }\r\n /**\r\n * helper to match environment\r\n * @param value\r\n * @param environment\r\n */\r\n matchEnvironment(entity, environment) {\r\n // Check static authority options first for cases where authority metadata has not been resolved and cached yet\r\n if (this.staticAuthorityOptions) {\r\n const staticAliases = getAliasesFromStaticSources(this.staticAuthorityOptions, this.commonLogger);\r\n if (staticAliases.includes(environment) &&\r\n staticAliases.includes(entity.environment)) {\r\n return true;\r\n }\r\n }\r\n // Query metadata cache if no static authority configuration has aliases that match enviroment\r\n const cloudMetadata = this.getAuthorityMetadataByAlias(environment);\r\n if (cloudMetadata &&\r\n cloudMetadata.aliases.indexOf(entity.environment) > -1) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * helper to match credential type\r\n * @param entity\r\n * @param credentialType\r\n */\r\n matchCredentialType(entity, credentialType) {\r\n return (entity.credentialType &&\r\n credentialType.toLowerCase() === entity.credentialType.toLowerCase());\r\n }\r\n /**\r\n * helper to match client ids\r\n * @param entity\r\n * @param clientId\r\n */\r\n matchClientId(entity, clientId) {\r\n return !!(entity.clientId && clientId === entity.clientId);\r\n }\r\n /**\r\n * helper to match family ids\r\n * @param entity\r\n * @param familyId\r\n */\r\n matchFamilyId(entity, familyId) {\r\n return !!(entity.familyId && familyId === entity.familyId);\r\n }\r\n /**\r\n * helper to match realm\r\n * @param entity\r\n * @param realm\r\n */\r\n matchRealm(entity, realm) {\r\n return !!(entity.realm?.toLowerCase() === realm.toLowerCase());\r\n }\r\n /**\r\n * helper to match nativeAccountId\r\n * @param entity\r\n * @param nativeAccountId\r\n * @returns boolean indicating the match result\r\n */\r\n matchNativeAccountId(entity, nativeAccountId) {\r\n return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);\r\n }\r\n /**\r\n * helper to match loginHint which can be either:\r\n * 1. login_hint ID token claim\r\n * 2. username in cached account object\r\n * 3. upn in ID token claims\r\n * @param entity\r\n * @param loginHint\r\n * @returns\r\n */\r\n matchLoginHintFromTokenClaims(tokenClaims, loginHint) {\r\n if (tokenClaims.login_hint === loginHint) {\r\n return true;\r\n }\r\n if (tokenClaims.preferred_username === loginHint) {\r\n return true;\r\n }\r\n if (tokenClaims.upn === loginHint) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Helper to match sid\r\n * @param entity\r\n * @param sid\r\n * @returns true if the sid claim is present and matches the filter\r\n */\r\n matchSid(idTokenClaims, sid) {\r\n return idTokenClaims.sid === sid;\r\n }\r\n matchAuthorityType(entity, authorityType) {\r\n return !!(entity.authorityType &&\r\n authorityType.toLowerCase() === entity.authorityType.toLowerCase());\r\n }\r\n /**\r\n * Returns true if the target scopes are a subset of the current entity\'s scopes, false otherwise.\r\n * @param entity\r\n * @param target\r\n */\r\n matchTarget(entity, target) {\r\n const isNotAccessTokenCredential = entity.credentialType !== CredentialType.ACCESS_TOKEN &&\r\n entity.credentialType !==\r\n CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;\r\n if (isNotAccessTokenCredential || !entity.target) {\r\n return false;\r\n }\r\n const entityScopeSet = ScopeSet.fromString(entity.target);\r\n return entityScopeSet.containsScopeSet(target);\r\n }\r\n /**\r\n * Returns true if the credential\'s tokenType or Authentication Scheme matches the one in the request, false otherwise\r\n * @param entity\r\n * @param tokenType\r\n */\r\n matchTokenType(entity, tokenType) {\r\n return !!(entity.tokenType && entity.tokenType === tokenType);\r\n }\r\n /**\r\n * Returns true if the credential\'s keyId matches the one in the request, false otherwise\r\n * @param entity\r\n * @param keyId\r\n */\r\n matchKeyId(entity, keyId) {\r\n return !!(entity.keyId && entity.keyId === keyId);\r\n }\r\n /**\r\n * returns if a given cache entity is of the type appmetadata\r\n * @param key\r\n */\r\n isAppMetadata(key) {\r\n return key.indexOf(APP_METADATA) !== -1;\r\n }\r\n /**\r\n * returns if a given cache entity is of the type authoritymetadata\r\n * @param key\r\n */\r\n isAuthorityMetadata(key) {\r\n return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;\r\n }\r\n /**\r\n * returns cache key used for cloud instance metadata\r\n */\r\n generateAuthorityMetadataCacheKey(authority) {\r\n return `${AUTHORITY_METADATA_CONSTANTS.CACHE_KEY}-${this.clientId}-${authority}`;\r\n }\r\n /**\r\n * Helper to convert serialized data to object\r\n * @param obj\r\n * @param json\r\n */\r\n static toObject(obj, json) {\r\n for (const propertyName in json) {\r\n obj[propertyName] = json[propertyName];\r\n }\r\n return obj;\r\n }\r\n}\r\n/** @internal */\r\nclass DefaultStorageClass extends CacheManager {\r\n setAccount() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAccount() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getCachedAccountEntity() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setIdTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getIdTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setAccessTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAccessTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setRefreshTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getRefreshTokenCredential() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setAppMetadata() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAppMetadata() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setServerTelemetry() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getServerTelemetry() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setAuthorityMetadata() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAuthorityMetadata() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAuthorityMetadataKeys() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n setThrottlingCache() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getThrottlingCache() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n removeItem() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getKeys() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getAccountKeys() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n getTokenKeys() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n updateCredentialCacheKey() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n removeOutdatedAccount() {\r\n throw createClientAuthError(methodNotImplemented);\r\n }\r\n}\n\n\n//# sourceMappingURL=CacheManager.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/config/ClientConfiguration.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst DEFAULT_SYSTEM_OPTIONS = {\r\n tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,\r\n preventCorsPreflight: false,\r\n};\r\nconst DEFAULT_LOGGER_IMPLEMENTATION = {\r\n loggerCallback: () => {\r\n // allow users to not set loggerCallback\r\n },\r\n piiLoggingEnabled: false,\r\n logLevel: LogLevel.Info,\r\n correlationId: Constants.EMPTY_STRING,\r\n};\r\nconst DEFAULT_CACHE_OPTIONS = {\r\n claimsBasedCachingEnabled: false,\r\n};\r\nconst DEFAULT_NETWORK_IMPLEMENTATION = {\r\n async sendGetRequestAsync() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n async sendPostRequestAsync() {\r\n throw createClientAuthError(methodNotImplemented);\r\n },\r\n};\r\nconst DEFAULT_LIBRARY_INFO = {\r\n sku: Constants.SKU,\r\n version: version,\r\n cpu: Constants.EMPTY_STRING,\r\n os: Constants.EMPTY_STRING,\r\n};\r\nconst DEFAULT_CLIENT_CREDENTIALS = {\r\n clientSecret: Constants.EMPTY_STRING,\r\n clientAssertion: undefined,\r\n};\r\nconst DEFAULT_AZURE_CLOUD_OPTIONS = {\r\n azureCloudInstance: AzureCloudInstance.None,\r\n tenant: `${Constants.DEFAULT_COMMON_TENANT}`,\r\n};\r\nconst DEFAULT_TELEMETRY_OPTIONS = {\r\n application: {\r\n appName: "",\r\n appVersion: "",\r\n },\r\n};\r\n/**\r\n * Function that sets the default options when not explicitly configured from app developer\r\n *\r\n * @param Configuration\r\n *\r\n * @returns Configuration\r\n */\r\nfunction buildClientConfiguration({ authOptions: userAuthOptions, systemOptions: userSystemOptions, loggerOptions: userLoggerOption, cacheOptions: userCacheOptions, storageInterface: storageImplementation, networkInterface: networkImplementation, cryptoInterface: cryptoImplementation, clientCredentials: clientCredentials, libraryInfo: libraryInfo, telemetry: telemetry, serverTelemetryManager: serverTelemetryManager, persistencePlugin: persistencePlugin, serializableCache: serializableCache, }) {\r\n const loggerOptions = {\r\n ...DEFAULT_LOGGER_IMPLEMENTATION,\r\n ...userLoggerOption,\r\n };\r\n return {\r\n authOptions: buildAuthOptions(userAuthOptions),\r\n systemOptions: { ...DEFAULT_SYSTEM_OPTIONS, ...userSystemOptions },\r\n loggerOptions: loggerOptions,\r\n cacheOptions: { ...DEFAULT_CACHE_OPTIONS, ...userCacheOptions },\r\n storageInterface: storageImplementation ||\r\n new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION, new Logger(loggerOptions)),\r\n networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,\r\n cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,\r\n clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,\r\n libraryInfo: { ...DEFAULT_LIBRARY_INFO, ...libraryInfo },\r\n telemetry: { ...DEFAULT_TELEMETRY_OPTIONS, ...telemetry },\r\n serverTelemetryManager: serverTelemetryManager || null,\r\n persistencePlugin: persistencePlugin || null,\r\n serializableCache: serializableCache || null,\r\n };\r\n}\r\n/**\r\n * Construct authoptions from the client and platform passed values\r\n * @param authOptions\r\n */\r\nfunction buildAuthOptions(authOptions) {\r\n return {\r\n clientCapabilities: [],\r\n azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS,\r\n skipAuthorityMetadataCache: false,\r\n instanceAware: false,\r\n ...authOptions,\r\n };\r\n}\r\n/**\r\n * Returns true if config has protocolMode set to ProtocolMode.OIDC, false otherwise\r\n * @param ClientConfiguration\r\n */\r\nfunction isOidcProtocolMode(config) {\r\n return (config.authOptions.authority.options.protocolMode === ProtocolMode.OIDC);\r\n}\n\n\n//# sourceMappingURL=ClientConfiguration.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/network/INetworkModule.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst StubbedNetworkModule = {\r\n sendGetRequestAsync: () => {\r\n return Promise.reject(createClientAuthError(methodNotImplemented));\r\n },\r\n sendPostRequestAsync: () => {\r\n return Promise.reject(createClientAuthError(methodNotImplemented));\r\n },\r\n};\n\n\n//# sourceMappingURL=INetworkModule.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/telemetry/performance/StubPerformanceClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass StubPerformanceMeasurement {\r\n startMeasurement() {\r\n return;\r\n }\r\n endMeasurement() {\r\n return;\r\n }\r\n flushMeasurement() {\r\n return null;\r\n }\r\n}\r\nclass StubPerformanceClient {\r\n generateId() {\r\n return "callback-id";\r\n }\r\n startMeasurement(measureName, correlationId) {\r\n return {\r\n end: () => null,\r\n discard: () => { },\r\n add: () => { },\r\n increment: () => { },\r\n event: {\r\n eventId: this.generateId(),\r\n status: PerformanceEventStatus.InProgress,\r\n authority: "",\r\n libraryName: "",\r\n libraryVersion: "",\r\n clientId: "",\r\n name: measureName,\r\n startTimeMs: Date.now(),\r\n correlationId: correlationId || "",\r\n },\r\n measurement: new StubPerformanceMeasurement(),\r\n };\r\n }\r\n startPerformanceMeasurement() {\r\n return new StubPerformanceMeasurement();\r\n }\r\n calculateQueuedTime() {\r\n return 0;\r\n }\r\n addQueueMeasurement() {\r\n return;\r\n }\r\n setPreQueueTime() {\r\n return;\r\n }\r\n endMeasurement() {\r\n return null;\r\n }\r\n discardMeasurements() {\r\n return;\r\n }\r\n removePerformanceCallback() {\r\n return true;\r\n }\r\n addPerformanceCallback() {\r\n return "";\r\n }\r\n emitEvents() {\r\n return;\r\n }\r\n addFields() {\r\n return;\r\n }\r\n incrementFields() {\r\n return;\r\n }\r\n cacheEventByCorrelationId() {\r\n return;\r\n }\r\n}\n\n\n//# sourceMappingURL=StubPerformanceClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/navigation/NavigationClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NavigationClient {\r\n /**\r\n * Navigates to other pages within the same web application\r\n * @param url\r\n * @param options\r\n */\r\n navigateInternal(url, options) {\r\n return NavigationClient.defaultNavigateWindow(url, options);\r\n }\r\n /**\r\n * Navigates to other pages outside the web application i.e. the Identity Provider\r\n * @param url\r\n * @param options\r\n */\r\n navigateExternal(url, options) {\r\n return NavigationClient.defaultNavigateWindow(url, options);\r\n }\r\n /**\r\n * Default navigation implementation invoked by the internal and external functions\r\n * @param url\r\n * @param options\r\n */\r\n static defaultNavigateWindow(url, options) {\r\n if (options.noHistory) {\r\n window.location.replace(url);\r\n }\r\n else {\r\n window.location.assign(url);\r\n }\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve(true);\r\n }, options.timeout);\r\n });\r\n }\r\n}\n\n\n//# sourceMappingURL=NavigationClient.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/NetworkError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Represents network related errors\r\n */\r\nclass NetworkError extends AuthError {\r\n constructor(error, httpStatus, responseHeaders) {\r\n super(error.errorCode, error.errorMessage, error.subError);\r\n Object.setPrototypeOf(this, NetworkError.prototype);\r\n this.name = "NetworkError";\r\n this.error = error;\r\n this.httpStatus = httpStatus;\r\n this.responseHeaders = responseHeaders;\r\n }\r\n}\r\n/**\r\n * Creates NetworkError object for a failed network request\r\n * @param error - Error to be thrown back to the caller\r\n * @param httpStatus - Status code of the network request\r\n * @param responseHeaders - Response headers of the network request, when available\r\n * @returns NetworkError object\r\n */\r\nfunction createNetworkError(error, httpStatus, responseHeaders) {\r\n return new NetworkError(error, httpStatus, responseHeaders);\r\n}\n\n\n//# sourceMappingURL=NetworkError.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/network/FetchClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class implements the Fetch API for GET and POST requests. See more here: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\r\n */\r\nclass FetchClient {\r\n /**\r\n * Fetch Client for REST endpoints - Get request\r\n * @param url\r\n * @param headers\r\n * @param body\r\n */\r\n async sendGetRequestAsync(url, options) {\r\n let response;\r\n let responseHeaders = {};\r\n let responseStatus = 0;\r\n const reqHeaders = getFetchHeaders(options);\r\n try {\r\n response = await fetch(url, {\r\n method: HTTP_REQUEST_TYPE.GET,\r\n headers: reqHeaders,\r\n });\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(window.navigator.onLine\r\n ? getRequestFailed\r\n : BrowserAuthErrorCodes_noNetworkConnectivity);\r\n }\r\n responseHeaders = getHeaderDict(response.headers);\r\n try {\r\n responseStatus = response.status;\r\n return {\r\n headers: responseHeaders,\r\n body: (await response.json()),\r\n status: responseStatus,\r\n };\r\n }\r\n catch (e) {\r\n throw createNetworkError(createBrowserAuthError(failedToParseResponse), responseStatus, responseHeaders);\r\n }\r\n }\r\n /**\r\n * Fetch Client for REST endpoints - Post request\r\n * @param url\r\n * @param headers\r\n * @param body\r\n */\r\n async sendPostRequestAsync(url, options) {\r\n const reqBody = (options && options.body) || "";\r\n const reqHeaders = getFetchHeaders(options);\r\n let response;\r\n let responseStatus = 0;\r\n let responseHeaders = {};\r\n try {\r\n response = await fetch(url, {\r\n method: HTTP_REQUEST_TYPE.POST,\r\n headers: reqHeaders,\r\n body: reqBody,\r\n });\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(window.navigator.onLine\r\n ? BrowserAuthErrorCodes_postRequestFailed\r\n : BrowserAuthErrorCodes_noNetworkConnectivity);\r\n }\r\n responseHeaders = getHeaderDict(response.headers);\r\n try {\r\n responseStatus = response.status;\r\n return {\r\n headers: responseHeaders,\r\n body: (await response.json()),\r\n status: responseStatus,\r\n };\r\n }\r\n catch (e) {\r\n throw createNetworkError(createBrowserAuthError(failedToParseResponse), responseStatus, responseHeaders);\r\n }\r\n }\r\n}\r\n/**\r\n * Get Fetch API Headers object from string map\r\n * @param inputHeaders\r\n */\r\nfunction getFetchHeaders(options) {\r\n try {\r\n const headers = new Headers();\r\n if (!(options && options.headers)) {\r\n return headers;\r\n }\r\n const optionsHeaders = options.headers;\r\n Object.entries(optionsHeaders).forEach(([key, value]) => {\r\n headers.append(key, value);\r\n });\r\n return headers;\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(failedToBuildHeaders);\r\n }\r\n}\r\n/**\r\n * Returns object representing response headers\r\n * @param headers\r\n * @returns\r\n */\r\nfunction getHeaderDict(headers) {\r\n try {\r\n const headerDict = {};\r\n headers.forEach((value, key) => {\r\n headerDict[key] = value;\r\n });\r\n return headerDict;\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(failedToParseHeaders);\r\n }\r\n}\n\n\n//# sourceMappingURL=FetchClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/config/Configuration.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n// Default timeout for popup windows and iframes in milliseconds\r\nconst DEFAULT_POPUP_TIMEOUT_MS = 60000;\r\nconst DEFAULT_IFRAME_TIMEOUT_MS = 10000;\r\nconst DEFAULT_REDIRECT_TIMEOUT_MS = 30000;\r\nconst DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS = 2000;\r\n/**\r\n * MSAL function that sets the default options when not explicitly configured from app developer\r\n *\r\n * @param auth\r\n * @param cache\r\n * @param system\r\n *\r\n * @returns Configuration object\r\n */\r\nfunction buildConfiguration({ auth: userInputAuth, cache: userInputCache, system: userInputSystem, telemetry: userInputTelemetry, }, isBrowserEnvironment) {\r\n // Default auth options for browser\r\n const DEFAULT_AUTH_OPTIONS = {\r\n clientId: Constants.EMPTY_STRING,\r\n authority: `${Constants.DEFAULT_AUTHORITY}`,\r\n knownAuthorities: [],\r\n cloudDiscoveryMetadata: Constants.EMPTY_STRING,\r\n authorityMetadata: Constants.EMPTY_STRING,\r\n redirectUri: typeof window !== "undefined" ? getCurrentUri() : "",\r\n postLogoutRedirectUri: Constants.EMPTY_STRING,\r\n navigateToLoginRequestUrl: true,\r\n clientCapabilities: [],\r\n protocolMode: ProtocolMode.AAD,\r\n OIDCOptions: {\r\n serverResponseType: ServerResponseType.FRAGMENT,\r\n defaultScopes: [\r\n Constants.OPENID_SCOPE,\r\n Constants.PROFILE_SCOPE,\r\n Constants.OFFLINE_ACCESS_SCOPE,\r\n ],\r\n },\r\n azureCloudOptions: {\r\n azureCloudInstance: AzureCloudInstance.None,\r\n tenant: Constants.EMPTY_STRING,\r\n },\r\n skipAuthorityMetadataCache: false,\r\n supportsNestedAppAuth: false,\r\n instanceAware: false,\r\n };\r\n // Default cache options for browser\r\n const DEFAULT_CACHE_OPTIONS = {\r\n cacheLocation: BrowserCacheLocation.SessionStorage,\r\n temporaryCacheLocation: BrowserCacheLocation.SessionStorage,\r\n storeAuthStateInCookie: false,\r\n secureCookies: false,\r\n // Default cache migration to true if cache location is localStorage since entries are preserved across tabs/windows. Migration has little to no benefit in sessionStorage and memoryStorage\r\n cacheMigrationEnabled: userInputCache &&\r\n userInputCache.cacheLocation === BrowserCacheLocation.LocalStorage\r\n ? true\r\n : false,\r\n claimsBasedCachingEnabled: false,\r\n };\r\n // Default logger options for browser\r\n const DEFAULT_LOGGER_OPTIONS = {\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n loggerCallback: () => {\r\n // allow users to not set logger call back\r\n },\r\n logLevel: LogLevel.Info,\r\n piiLoggingEnabled: false,\r\n };\r\n // Default system options for browser\r\n const DEFAULT_BROWSER_SYSTEM_OPTIONS = {\r\n ...DEFAULT_SYSTEM_OPTIONS,\r\n loggerOptions: DEFAULT_LOGGER_OPTIONS,\r\n networkClient: isBrowserEnvironment\r\n ? new FetchClient()\r\n : StubbedNetworkModule,\r\n navigationClient: new NavigationClient(),\r\n loadFrameTimeout: 0,\r\n // If loadFrameTimeout is provided, use that as default.\r\n windowHashTimeout: userInputSystem?.loadFrameTimeout || DEFAULT_POPUP_TIMEOUT_MS,\r\n iframeHashTimeout: userInputSystem?.loadFrameTimeout || DEFAULT_IFRAME_TIMEOUT_MS,\r\n navigateFrameWait: 0,\r\n redirectNavigationTimeout: DEFAULT_REDIRECT_TIMEOUT_MS,\r\n asyncPopups: false,\r\n allowRedirectInIframe: false,\r\n allowNativeBroker: false,\r\n nativeBrokerHandshakeTimeout: userInputSystem?.nativeBrokerHandshakeTimeout ||\r\n DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS,\r\n pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS,\r\n };\r\n const providedSystemOptions = {\r\n ...DEFAULT_BROWSER_SYSTEM_OPTIONS,\r\n ...userInputSystem,\r\n loggerOptions: userInputSystem?.loggerOptions || DEFAULT_LOGGER_OPTIONS,\r\n };\r\n const DEFAULT_TELEMETRY_OPTIONS = {\r\n application: {\r\n appName: Constants.EMPTY_STRING,\r\n appVersion: Constants.EMPTY_STRING,\r\n },\r\n client: new StubPerformanceClient(),\r\n };\r\n // Throw an error if user has set OIDCOptions without being in OIDC protocol mode\r\n if (userInputAuth?.protocolMode !== ProtocolMode.OIDC &&\r\n userInputAuth?.OIDCOptions) {\r\n const logger = new Logger(providedSystemOptions.loggerOptions);\r\n logger.warning(JSON.stringify(createClientConfigurationError(cannotSetOIDCOptions)));\r\n }\r\n // Throw an error if user has set allowNativeBroker to true without being in AAD protocol mode\r\n if (userInputAuth?.protocolMode &&\r\n userInputAuth.protocolMode !== ProtocolMode.AAD &&\r\n providedSystemOptions?.allowNativeBroker) {\r\n throw createClientConfigurationError(cannotAllowNativeBroker);\r\n }\r\n const overlayedConfig = {\r\n auth: {\r\n ...DEFAULT_AUTH_OPTIONS,\r\n ...userInputAuth,\r\n OIDCOptions: {\r\n ...DEFAULT_AUTH_OPTIONS.OIDCOptions,\r\n ...userInputAuth?.OIDCOptions,\r\n },\r\n },\r\n cache: { ...DEFAULT_CACHE_OPTIONS, ...userInputCache },\r\n system: providedSystemOptions,\r\n telemetry: { ...DEFAULT_TELEMETRY_OPTIONS, ...userInputTelemetry },\r\n };\r\n return overlayedConfig;\r\n}\n\n\n//# sourceMappingURL=Configuration.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/packageMetadata.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/* eslint-disable header/header */\r\nconst dist_packageMetadata_name = "@azure/msal-browser";\r\nconst packageMetadata_version = "3.28.1";\n\n\n//# sourceMappingURL=packageMetadata.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/operatingcontext/BaseOperatingContext.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Base class for operating context\r\n * Operating contexts are contexts in which MSAL.js is being run\r\n * More than one operating context may be available at a time\r\n * It\'s important from a logging and telemetry point of view for us to be able to identify the operating context.\r\n * For example: Some operating contexts will pre-cache tokens impacting performance telemetry\r\n */\r\nclass BaseOperatingContext {\r\n static loggerCallback(level, message) {\r\n switch (level) {\r\n case LogLevel.Error:\r\n // eslint-disable-next-line no-console\r\n console.error(message);\r\n return;\r\n case LogLevel.Info:\r\n // eslint-disable-next-line no-console\r\n console.info(message);\r\n return;\r\n case LogLevel.Verbose:\r\n // eslint-disable-next-line no-console\r\n console.debug(message);\r\n return;\r\n case LogLevel.Warning:\r\n // eslint-disable-next-line no-console\r\n console.warn(message);\r\n return;\r\n default:\r\n // eslint-disable-next-line no-console\r\n console.log(message);\r\n return;\r\n }\r\n }\r\n constructor(config) {\r\n /*\r\n * If loaded in an environment where window is not available,\r\n * set internal flag to false so that further requests fail.\r\n * This is to support server-side rendering environments.\r\n */\r\n this.browserEnvironment = typeof window !== "undefined";\r\n this.config = buildConfiguration(config, this.browserEnvironment);\r\n let sessionStorage;\r\n try {\r\n sessionStorage = window[BrowserCacheLocation.SessionStorage];\r\n // Mute errors if it\'s a non-browser environment or cookies are blocked.\r\n }\r\n catch (e) { }\r\n const logLevelKey = sessionStorage?.getItem(LOG_LEVEL_CACHE_KEY);\r\n const piiLoggingKey = sessionStorage\r\n ?.getItem(LOG_PII_CACHE_KEY)\r\n ?.toLowerCase();\r\n const piiLoggingEnabled = piiLoggingKey === "true"\r\n ? true\r\n : piiLoggingKey === "false"\r\n ? false\r\n : undefined;\r\n const loggerOptions = { ...this.config.system.loggerOptions };\r\n const logLevel = logLevelKey && Object.keys(LogLevel).includes(logLevelKey)\r\n ? LogLevel[logLevelKey]\r\n : undefined;\r\n if (logLevel) {\r\n loggerOptions.loggerCallback = BaseOperatingContext.loggerCallback;\r\n loggerOptions.logLevel = logLevel;\r\n }\r\n if (piiLoggingEnabled !== undefined) {\r\n loggerOptions.piiLoggingEnabled = piiLoggingEnabled;\r\n }\r\n this.logger = new Logger(loggerOptions, dist_packageMetadata_name, packageMetadata_version);\r\n this.available = false;\r\n }\r\n /**\r\n * Return the MSAL config\r\n * @returns BrowserConfiguration\r\n */\r\n getConfig() {\r\n return this.config;\r\n }\r\n /**\r\n * Returns the MSAL Logger\r\n * @returns Logger\r\n */\r\n getLogger() {\r\n return this.logger;\r\n }\r\n isAvailable() {\r\n return this.available;\r\n }\r\n isBrowserEnvironment() {\r\n return this.browserEnvironment;\r\n }\r\n}\n\n\n//# sourceMappingURL=BaseOperatingContext.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/naa/BridgeStatusCode.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst BridgeStatusCode = {\r\n UserInteractionRequired: "USER_INTERACTION_REQUIRED",\r\n UserCancel: "USER_CANCEL",\r\n NoNetwork: "NO_NETWORK",\r\n TransientError: "TRANSIENT_ERROR",\r\n PersistentError: "PERSISTENT_ERROR",\r\n Disabled: "DISABLED",\r\n AccountUnavailable: "ACCOUNT_UNAVAILABLE",\r\n NestedAppAuthUnavailable: "NESTED_APP_AUTH_UNAVAILABLE", // NAA is unavailable in the current context, can retry with standard browser based auth\r\n};\n\n\n//# sourceMappingURL=BridgeStatusCode.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/naa/BridgeProxy.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * BridgeProxy\r\n * Provides a proxy for accessing a bridge to a host app and/or\r\n * platform broker\r\n */\r\nclass BridgeProxy {\r\n /**\r\n * initializeNestedAppAuthBridge - Initializes the bridge to the host app\r\n * @returns a promise that resolves to an InitializeBridgeResponse or rejects with an Error\r\n * @remarks This method will be called by the create factory method\r\n * @remarks If the bridge is not available, this method will throw an error\r\n */\r\n static async initializeNestedAppAuthBridge() {\r\n if (window === undefined) {\r\n throw new Error("window is undefined");\r\n }\r\n if (window.nestedAppAuthBridge === undefined) {\r\n throw new Error("window.nestedAppAuthBridge is undefined");\r\n }\r\n try {\r\n window.nestedAppAuthBridge.addEventListener("message", (response) => {\r\n const responsePayload = typeof response === "string" ? response : response.data;\r\n const responseEnvelope = JSON.parse(responsePayload);\r\n const request = BridgeProxy.bridgeRequests.find((element) => element.requestId === responseEnvelope.requestId);\r\n if (request !== undefined) {\r\n BridgeProxy.bridgeRequests.splice(BridgeProxy.bridgeRequests.indexOf(request), 1);\r\n if (responseEnvelope.success) {\r\n request.resolve(responseEnvelope);\r\n }\r\n else {\r\n request.reject(responseEnvelope.error);\r\n }\r\n }\r\n });\r\n const bridgeResponse = await new Promise((resolve, reject) => {\r\n const message = BridgeProxy.buildRequest("GetInitContext");\r\n const request = {\r\n requestId: message.requestId,\r\n method: message.method,\r\n resolve: resolve,\r\n reject: reject,\r\n };\r\n BridgeProxy.bridgeRequests.push(request);\r\n window.nestedAppAuthBridge.postMessage(JSON.stringify(message));\r\n });\r\n return BridgeProxy.validateBridgeResultOrThrow(bridgeResponse.initContext);\r\n }\r\n catch (error) {\r\n window.console.log(error);\r\n throw error;\r\n }\r\n }\r\n /**\r\n * getTokenInteractive - Attempts to get a token interactively from the bridge\r\n * @param request A token request\r\n * @returns a promise that resolves to an auth result or rejects with a BridgeError\r\n */\r\n getTokenInteractive(request) {\r\n return this.getToken("GetTokenPopup", request);\r\n }\r\n /**\r\n * getTokenSilent Attempts to get a token silently from the bridge\r\n * @param request A token request\r\n * @returns a promise that resolves to an auth result or rejects with a BridgeError\r\n */\r\n getTokenSilent(request) {\r\n return this.getToken("GetToken", request);\r\n }\r\n async getToken(requestType, request) {\r\n const result = await this.sendRequest(requestType, {\r\n tokenParams: request,\r\n });\r\n return {\r\n token: BridgeProxy.validateBridgeResultOrThrow(result.token),\r\n account: BridgeProxy.validateBridgeResultOrThrow(result.account),\r\n };\r\n }\r\n getHostCapabilities() {\r\n return this.capabilities ?? null;\r\n }\r\n getAccountContext() {\r\n return this.accountContext ? this.accountContext : null;\r\n }\r\n static buildRequest(method, requestParams) {\r\n return {\r\n messageType: "NestedAppAuthRequest",\r\n method: method,\r\n requestId: createNewGuid(),\r\n sendTime: Date.now(),\r\n clientLibrary: BrowserConstants.MSAL_SKU,\r\n clientLibraryVersion: packageMetadata_version,\r\n ...requestParams,\r\n };\r\n }\r\n /**\r\n * A method used to send a request to the bridge\r\n * @param request A token request\r\n * @returns a promise that resolves to a response of provided type or rejects with a BridgeError\r\n */\r\n sendRequest(method, requestParams) {\r\n const message = BridgeProxy.buildRequest(method, requestParams);\r\n const promise = new Promise((resolve, reject) => {\r\n const request = {\r\n requestId: message.requestId,\r\n method: message.method,\r\n resolve: resolve,\r\n reject: reject,\r\n };\r\n BridgeProxy.bridgeRequests.push(request);\r\n window.nestedAppAuthBridge.postMessage(JSON.stringify(message));\r\n });\r\n return promise;\r\n }\r\n static validateBridgeResultOrThrow(input) {\r\n if (input === undefined) {\r\n const bridgeError = {\r\n status: BridgeStatusCode.NestedAppAuthUnavailable,\r\n };\r\n throw bridgeError;\r\n }\r\n return input;\r\n }\r\n /**\r\n * Private constructor for BridgeProxy\r\n * @param sdkName The name of the SDK being used to make requests on behalf of the app\r\n * @param sdkVersion The version of the SDK being used to make requests on behalf of the app\r\n * @param capabilities The capabilities of the bridge / SDK / platform broker\r\n */\r\n constructor(sdkName, sdkVersion, accountContext, capabilities) {\r\n this.sdkName = sdkName;\r\n this.sdkVersion = sdkVersion;\r\n this.accountContext = accountContext;\r\n this.capabilities = capabilities;\r\n }\r\n /**\r\n * Factory method for creating an implementation of IBridgeProxy\r\n * @returns A promise that resolves to a BridgeProxy implementation\r\n */\r\n static async create() {\r\n const response = await BridgeProxy.initializeNestedAppAuthBridge();\r\n return new BridgeProxy(response.sdkName, response.sdkVersion, response.accountContext, response.capabilities);\r\n }\r\n}\r\nBridgeProxy.bridgeRequests = [];\n\n\n//# sourceMappingURL=BridgeProxy.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/operatingcontext/NestedAppOperatingContext.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NestedAppOperatingContext extends BaseOperatingContext {\r\n constructor() {\r\n super(...arguments);\r\n this.bridgeProxy = undefined;\r\n this.accountContext = null;\r\n }\r\n /**\r\n * Return the module name. Intended for use with import() to enable dynamic import\r\n * of the implementation associated with this operating context\r\n * @returns\r\n */\r\n getModuleName() {\r\n return NestedAppOperatingContext.MODULE_NAME;\r\n }\r\n /**\r\n * Returns the unique identifier for this operating context\r\n * @returns string\r\n */\r\n getId() {\r\n return NestedAppOperatingContext.ID;\r\n }\r\n /**\r\n * Returns the current BridgeProxy\r\n * @returns IBridgeProxy | undefined\r\n */\r\n getBridgeProxy() {\r\n return this.bridgeProxy;\r\n }\r\n /**\r\n * Checks whether the operating context is available.\r\n * Confirms that the code is running a browser rather. This is required.\r\n * @returns Promise indicating whether this operating context is currently available.\r\n */\r\n async initialize() {\r\n try {\r\n if (typeof window !== "undefined") {\r\n if (typeof window.__initializeNestedAppAuth === "function") {\r\n await window.__initializeNestedAppAuth();\r\n }\r\n const bridgeProxy = await BridgeProxy.create();\r\n /*\r\n * Because we want single sign on we expect the host app to provide the account context\r\n * with a min set of params that can be used to identify the account\r\n * this.account = nestedApp.getAccountByFilter(bridgeProxy.getAccountContext());\r\n */\r\n this.accountContext = bridgeProxy.getAccountContext();\r\n this.bridgeProxy = bridgeProxy;\r\n this.available = bridgeProxy !== undefined;\r\n }\r\n }\r\n catch (ex) {\r\n this.logger.infoPii(`Could not initialize Nested App Auth bridge (${ex})`);\r\n }\r\n this.logger.info(`Nested App Auth Bridge available: ${this.available}`);\r\n return this.available;\r\n }\r\n}\r\n/*\r\n * TODO: Once we have determine the bundling code return here to specify the name of the bundle\r\n * containing the implementation for this operating context\r\n */\r\nNestedAppOperatingContext.MODULE_NAME = "";\r\n/**\r\n * Unique identifier for the operating context\r\n */\r\nNestedAppOperatingContext.ID = "NestedAppOperatingContext";\n\n\n//# sourceMappingURL=NestedAppOperatingContext.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/operatingcontext/StandardOperatingContext.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass StandardOperatingContext extends BaseOperatingContext {\r\n /**\r\n * Return the module name. Intended for use with import() to enable dynamic import\r\n * of the implementation associated with this operating context\r\n * @returns\r\n */\r\n getModuleName() {\r\n return StandardOperatingContext.MODULE_NAME;\r\n }\r\n /**\r\n * Returns the unique identifier for this operating context\r\n * @returns string\r\n */\r\n getId() {\r\n return StandardOperatingContext.ID;\r\n }\r\n /**\r\n * Checks whether the operating context is available.\r\n * Confirms that the code is running a browser rather. This is required.\r\n * @returns Promise indicating whether this operating context is currently available.\r\n */\r\n async initialize() {\r\n this.available = typeof window !== "undefined";\r\n return this.available;\r\n /*\r\n * NOTE: The standard context is available as long as there is a window. If/when we split out WAM from Browser\r\n * We can move the current contents of the initialize method to here and verify that the WAM extension is available\r\n */\r\n }\r\n}\r\n/*\r\n * TODO: Once we have determine the bundling code return here to specify the name of the bundle\r\n * containing the implementation for this operating context\r\n */\r\nStandardOperatingContext.MODULE_NAME = "";\r\n/**\r\n * Unique identifier for the operating context\r\n */\r\nStandardOperatingContext.ID = "StandardOperatingContext";\n\n\n//# sourceMappingURL=StandardOperatingContext.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/JoseHeaderErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst missingKidError = "missing_kid_error";\r\nconst missingAlgError = "missing_alg_error";\n\n\n//# sourceMappingURL=JoseHeaderErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/JoseHeaderError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst JoseHeaderErrorMessages = {\r\n [missingKidError]: "The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the \'kid\' header claim. No \'kid\' value was provided.",\r\n [missingAlgError]: "The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the \'alg\' header claim. No \'alg\' value was provided.",\r\n};\r\n/**\r\n * Error thrown when there is an error in the client code running on the browser.\r\n */\r\nclass JoseHeaderError extends AuthError {\r\n constructor(errorCode, errorMessage) {\r\n super(errorCode, errorMessage);\r\n this.name = "JoseHeaderError";\r\n Object.setPrototypeOf(this, JoseHeaderError.prototype);\r\n }\r\n}\r\n/** Returns JoseHeaderError object */\r\nfunction createJoseHeaderError(code) {\r\n return new JoseHeaderError(code, JoseHeaderErrorMessages[code]);\r\n}\n\n\n//# sourceMappingURL=JoseHeaderError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/crypto/JoseHeader.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/** @internal */\r\nclass JoseHeader {\r\n constructor(options) {\r\n this.typ = options.typ;\r\n this.alg = options.alg;\r\n this.kid = options.kid;\r\n }\r\n /**\r\n * Builds SignedHttpRequest formatted JOSE Header from the\r\n * JOSE Header options provided or previously set on the object and returns\r\n * the stringified header object.\r\n * Throws if keyId or algorithm aren\'t provided since they are required for Access Token Binding.\r\n * @param shrHeaderOptions\r\n * @returns\r\n */\r\n static getShrHeaderString(shrHeaderOptions) {\r\n // KeyID is required on the SHR header\r\n if (!shrHeaderOptions.kid) {\r\n throw createJoseHeaderError(missingKidError);\r\n }\r\n // Alg is required on the SHR header\r\n if (!shrHeaderOptions.alg) {\r\n throw createJoseHeaderError(missingAlgError);\r\n }\r\n const shrHeader = new JoseHeader({\r\n // Access Token PoP headers must have type pop, but the type header can be overriden for special cases\r\n typ: shrHeaderOptions.typ || JsonWebTokenTypes.Pop,\r\n kid: shrHeaderOptions.kid,\r\n alg: shrHeaderOptions.alg,\r\n });\r\n return JSON.stringify(shrHeader);\r\n }\r\n}\n\n\n//# sourceMappingURL=JoseHeader.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/encode/Base64Decode.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Class which exposes APIs to decode base64 strings to plaintext. See here for implementation details:\r\n * https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem\r\n */\r\n/**\r\n * Returns a URL-safe plaintext decoded string from b64 encoded input.\r\n * @param input\r\n */\r\nfunction base64Decode(input) {\r\n return new TextDecoder().decode(base64DecToArr(input));\r\n}\r\n/**\r\n * Decodes base64 into Uint8Array\r\n * @param base64String\r\n */\r\nfunction base64DecToArr(base64String) {\r\n let encodedString = base64String.replace(/-/g, "+").replace(/_/g, "/");\r\n switch (encodedString.length % 4) {\r\n case 0:\r\n break;\r\n case 2:\r\n encodedString += "==";\r\n break;\r\n case 3:\r\n encodedString += "=";\r\n break;\r\n default:\r\n throw createBrowserAuthError(invalidBase64String);\r\n }\r\n const binString = atob(encodedString);\r\n return Uint8Array.from(binString, (m) => m.codePointAt(0) || 0);\r\n}\n\n\n//# sourceMappingURL=Base64Decode.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/DatabaseStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\r\n */\r\nclass DatabaseStorage {\r\n constructor() {\r\n this.dbName = DB_NAME;\r\n this.version = DB_VERSION;\r\n this.tableName = DB_TABLE_NAME;\r\n this.dbOpen = false;\r\n }\r\n /**\r\n * Opens IndexedDB instance.\r\n */\r\n async open() {\r\n return new Promise((resolve, reject) => {\r\n const openDB = window.indexedDB.open(this.dbName, this.version);\r\n openDB.addEventListener("upgradeneeded", (e) => {\r\n const event = e;\r\n event.target.result.createObjectStore(this.tableName);\r\n });\r\n openDB.addEventListener("success", (e) => {\r\n const event = e;\r\n this.db = event.target.result;\r\n this.dbOpen = true;\r\n resolve();\r\n });\r\n openDB.addEventListener("error", () => reject(createBrowserAuthError(databaseUnavailable)));\r\n });\r\n }\r\n /**\r\n * Closes the connection to IndexedDB database when all pending transactions\r\n * complete.\r\n */\r\n closeConnection() {\r\n const db = this.db;\r\n if (db && this.dbOpen) {\r\n db.close();\r\n this.dbOpen = false;\r\n }\r\n }\r\n /**\r\n * Opens database if it\'s not already open\r\n */\r\n async validateDbIsOpen() {\r\n if (!this.dbOpen) {\r\n return this.open();\r\n }\r\n }\r\n /**\r\n * Retrieves item from IndexedDB instance.\r\n * @param key\r\n */\r\n async getItem(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n // TODO: Add timeouts?\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], "readonly");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbGet = objectStore.get(key);\r\n dbGet.addEventListener("success", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result);\r\n });\r\n dbGet.addEventListener("error", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Adds item to IndexedDB under given key\r\n * @param key\r\n * @param payload\r\n */\r\n async setItem(key, payload) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n // TODO: Add timeouts?\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], "readwrite");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbPut = objectStore.put(payload, key);\r\n dbPut.addEventListener("success", () => {\r\n this.closeConnection();\r\n resolve();\r\n });\r\n dbPut.addEventListener("error", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes item from IndexedDB under given key\r\n * @param key\r\n */\r\n async removeItem(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], "readwrite");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbDelete = objectStore.delete(key);\r\n dbDelete.addEventListener("success", () => {\r\n this.closeConnection();\r\n resolve();\r\n });\r\n dbDelete.addEventListener("error", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Get all the keys from the storage object as an iterable array of strings.\r\n */\r\n async getKeys() {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], "readonly");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbGetKeys = objectStore.getAllKeys();\r\n dbGetKeys.addEventListener("success", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result);\r\n });\r\n dbGetKeys.addEventListener("error", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * Checks whether there is an object under the search key in the object store\r\n */\r\n async containsKey(key) {\r\n await this.validateDbIsOpen();\r\n return new Promise((resolve, reject) => {\r\n if (!this.db) {\r\n return reject(createBrowserAuthError(databaseNotOpen));\r\n }\r\n const transaction = this.db.transaction([this.tableName], "readonly");\r\n const objectStore = transaction.objectStore(this.tableName);\r\n const dbContainsKey = objectStore.count(key);\r\n dbContainsKey.addEventListener("success", (e) => {\r\n const event = e;\r\n this.closeConnection();\r\n resolve(event.target.result === 1);\r\n });\r\n dbContainsKey.addEventListener("error", (e) => {\r\n this.closeConnection();\r\n reject(e);\r\n });\r\n });\r\n }\r\n /**\r\n * Deletes the MSAL database. The database is deleted rather than cleared to make it possible\r\n * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues\r\n * with IndexedDB database versions.\r\n */\r\n async deleteDatabase() {\r\n // Check if database being deleted exists\r\n if (this.db && this.dbOpen) {\r\n this.closeConnection();\r\n }\r\n return new Promise((resolve, reject) => {\r\n const deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);\r\n const id = setTimeout(() => reject(false), 200); // Reject if events aren\'t raised within 200ms\r\n deleteDbRequest.addEventListener("success", () => {\r\n clearTimeout(id);\r\n return resolve(true);\r\n });\r\n deleteDbRequest.addEventListener("blocked", () => {\r\n clearTimeout(id);\r\n return resolve(true);\r\n });\r\n deleteDbRequest.addEventListener("error", () => {\r\n clearTimeout(id);\r\n return reject(false);\r\n });\r\n });\r\n }\r\n}\n\n\n//# sourceMappingURL=DatabaseStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/MemoryStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass MemoryStorage {\r\n constructor() {\r\n this.cache = new Map();\r\n }\r\n getItem(key) {\r\n return this.cache.get(key) || null;\r\n }\r\n setItem(key, value) {\r\n this.cache.set(key, value);\r\n }\r\n removeItem(key) {\r\n this.cache.delete(key);\r\n }\r\n getKeys() {\r\n const cacheKeys = [];\r\n this.cache.forEach((value, key) => {\r\n cacheKeys.push(key);\r\n });\r\n return cacheKeys;\r\n }\r\n containsKey(key) {\r\n return this.cache.has(key);\r\n }\r\n clear() {\r\n this.cache.clear();\r\n }\r\n}\n\n\n//# sourceMappingURL=MemoryStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/AsyncMemoryStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,\r\n * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.\r\n */\r\nclass AsyncMemoryStorage {\r\n constructor(logger) {\r\n this.inMemoryCache = new MemoryStorage();\r\n this.indexedDBCache = new DatabaseStorage();\r\n this.logger = logger;\r\n }\r\n handleDatabaseAccessError(error) {\r\n if (error instanceof BrowserAuthError &&\r\n error.errorCode === databaseUnavailable) {\r\n this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");\r\n }\r\n else {\r\n throw error;\r\n }\r\n }\r\n /**\r\n * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous\r\n * storage object if item isn\'t found in-memory.\r\n * @param key\r\n */\r\n async getItem(key) {\r\n const item = this.inMemoryCache.getItem(key);\r\n if (!item) {\r\n try {\r\n this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage.");\r\n return await this.indexedDBCache.getItem(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return item;\r\n }\r\n /**\r\n * Sets the item in the in-memory cache and then tries to set it in the asynchronous\r\n * storage object with the given key.\r\n * @param key\r\n * @param value\r\n */\r\n async setItem(key, value) {\r\n this.inMemoryCache.setItem(key, value);\r\n try {\r\n await this.indexedDBCache.setItem(key, value);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n /**\r\n * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.\r\n * @param key\r\n */\r\n async removeItem(key) {\r\n this.inMemoryCache.removeItem(key);\r\n try {\r\n await this.indexedDBCache.removeItem(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n /**\r\n * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the\r\n * asynchronous storage object.\r\n */\r\n async getKeys() {\r\n const cacheKeys = this.inMemoryCache.getKeys();\r\n if (cacheKeys.length === 0) {\r\n try {\r\n this.logger.verbose("In-memory cache is empty, now querying persistent storage.");\r\n return await this.indexedDBCache.getKeys();\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return cacheKeys;\r\n }\r\n /**\r\n * Returns true or false if the given key is present in the cache.\r\n * @param key\r\n */\r\n async containsKey(key) {\r\n const containsKey = this.inMemoryCache.containsKey(key);\r\n if (!containsKey) {\r\n try {\r\n this.logger.verbose("Key not found in in-memory cache, now querying persistent storage.");\r\n return await this.indexedDBCache.containsKey(key);\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n }\r\n }\r\n return containsKey;\r\n }\r\n /**\r\n * Clears in-memory Map\r\n */\r\n clearInMemory() {\r\n // InMemory cache is a Map instance, clear is straightforward\r\n this.logger.verbose(`Deleting in-memory keystore`);\r\n this.inMemoryCache.clear();\r\n this.logger.verbose(`In-memory keystore deleted`);\r\n }\r\n /**\r\n * Tries to delete the IndexedDB database\r\n * @returns\r\n */\r\n async clearPersistent() {\r\n try {\r\n this.logger.verbose("Deleting persistent keystore");\r\n const dbDeleted = await this.indexedDBCache.deleteDatabase();\r\n if (dbDeleted) {\r\n this.logger.verbose("Persistent keystore deleted");\r\n }\r\n return dbDeleted;\r\n }\r\n catch (e) {\r\n this.handleDatabaseAccessError(e);\r\n return false;\r\n }\r\n }\r\n}\n\n\n//# sourceMappingURL=AsyncMemoryStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/crypto/CryptoOps.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class implements MSAL\'s crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and\r\n * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).\r\n */\r\nclass CryptoOps {\r\n constructor(logger, performanceClient, skipValidateSubtleCrypto) {\r\n this.logger = logger;\r\n // Browser crypto needs to be validated first before any other classes can be set.\r\n validateCryptoAvailable(skipValidateSubtleCrypto ?? false);\r\n this.cache = new AsyncMemoryStorage(this.logger);\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Creates a new random GUID - used to populate state and nonce.\r\n * @returns string (GUID)\r\n */\r\n createNewGuid() {\r\n return createNewGuid();\r\n }\r\n /**\r\n * Encodes input string to base64.\r\n * @param input\r\n */\r\n base64Encode(input) {\r\n return base64Encode(input);\r\n }\r\n /**\r\n * Decodes input string from base64.\r\n * @param input\r\n */\r\n base64Decode(input) {\r\n return base64Decode(input);\r\n }\r\n /**\r\n * Encodes input string to base64 URL safe string.\r\n * @param input\r\n */\r\n base64UrlEncode(input) {\r\n return urlEncode(input);\r\n }\r\n /**\r\n * Stringifies and base64Url encodes input public key\r\n * @param inputKid\r\n * @returns Base64Url encoded public key\r\n */\r\n encodeKid(inputKid) {\r\n return this.base64UrlEncode(JSON.stringify({ kid: inputKid }));\r\n }\r\n /**\r\n * Generates a keypair, stores it and returns a thumbprint\r\n * @param request\r\n */\r\n async getPublicKeyThumbprint(request) {\r\n const publicKeyThumbMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);\r\n // Generate Keypair\r\n const keyPair = await generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES);\r\n // Generate Thumbprint for Public Key\r\n const publicKeyJwk = await exportJwk(keyPair.publicKey);\r\n const pubKeyThumprintObj = {\r\n e: publicKeyJwk.e,\r\n kty: publicKeyJwk.kty,\r\n n: publicKeyJwk.n,\r\n };\r\n const publicJwkString = getSortedObjectString(pubKeyThumprintObj);\r\n const publicJwkHash = await this.hashString(publicJwkString);\r\n // Generate Thumbprint for Private Key\r\n const privateKeyJwk = await exportJwk(keyPair.privateKey);\r\n // Re-import private key to make it unextractable\r\n const unextractablePrivateKey = await importJwk(privateKeyJwk, false, ["sign"]);\r\n // Store Keypair data in keystore\r\n await this.cache.setItem(publicJwkHash, {\r\n privateKey: unextractablePrivateKey,\r\n publicKey: keyPair.publicKey,\r\n requestMethod: request.resourceRequestMethod,\r\n requestUri: request.resourceRequestUri,\r\n });\r\n if (publicKeyThumbMeasurement) {\r\n publicKeyThumbMeasurement.end({\r\n success: true,\r\n });\r\n }\r\n return publicJwkHash;\r\n }\r\n /**\r\n * Removes cryptographic keypair from key store matching the keyId passed in\r\n * @param kid\r\n */\r\n async removeTokenBindingKey(kid) {\r\n await this.cache.removeItem(kid);\r\n const keyFound = await this.cache.containsKey(kid);\r\n return !keyFound;\r\n }\r\n /**\r\n * Removes all cryptographic keys from IndexedDB storage\r\n */\r\n async clearKeystore() {\r\n // Delete in-memory keystores\r\n this.cache.clearInMemory();\r\n /**\r\n * There is only one database, so calling clearPersistent on asymmetric keystore takes care of\r\n * every persistent keystore\r\n */\r\n try {\r\n await this.cache.clearPersistent();\r\n return true;\r\n }\r\n catch (e) {\r\n if (e instanceof Error) {\r\n this.logger.error(`Clearing keystore failed with error: ${e.message}`);\r\n }\r\n else {\r\n this.logger.error("Clearing keystore failed with unknown error");\r\n }\r\n return false;\r\n }\r\n }\r\n /**\r\n * Signs the given object as a jwt payload with private key retrieved by given kid.\r\n * @param payload\r\n * @param kid\r\n */\r\n async signJwt(payload, kid, shrOptions, correlationId) {\r\n const signJwtMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsSignJwt, correlationId);\r\n const cachedKeyPair = await this.cache.getItem(kid);\r\n if (!cachedKeyPair) {\r\n throw createBrowserAuthError(cryptoKeyNotFound);\r\n }\r\n // Get public key as JWK\r\n const publicKeyJwk = await exportJwk(cachedKeyPair.publicKey);\r\n const publicKeyJwkString = getSortedObjectString(publicKeyJwk);\r\n // Base64URL encode public key thumbprint with keyId only: BASE64URL({ kid: "FULL_PUBLIC_KEY_HASH" })\r\n const encodedKeyIdThumbprint = urlEncode(JSON.stringify({ kid: kid }));\r\n // Generate header\r\n const shrHeader = JoseHeader.getShrHeaderString({\r\n ...shrOptions?.header,\r\n alg: publicKeyJwk.alg,\r\n kid: encodedKeyIdThumbprint,\r\n });\r\n const encodedShrHeader = urlEncode(shrHeader);\r\n // Generate payload\r\n payload.cnf = {\r\n jwk: JSON.parse(publicKeyJwkString),\r\n };\r\n const encodedPayload = urlEncode(JSON.stringify(payload));\r\n // Form token string\r\n const tokenString = `${encodedShrHeader}.${encodedPayload}`;\r\n // Sign token\r\n const encoder = new TextEncoder();\r\n const tokenBuffer = encoder.encode(tokenString);\r\n const signatureBuffer = await sign(cachedKeyPair.privateKey, tokenBuffer);\r\n const encodedSignature = urlEncodeArr(new Uint8Array(signatureBuffer));\r\n const signedJwt = `${tokenString}.${encodedSignature}`;\r\n if (signJwtMeasurement) {\r\n signJwtMeasurement.end({\r\n success: true,\r\n });\r\n }\r\n return signedJwt;\r\n }\r\n /**\r\n * Returns the SHA-256 hash of an input string\r\n * @param plainText\r\n */\r\n async hashString(plainText) {\r\n return hashString(plainText);\r\n }\r\n}\r\nCryptoOps.POP_KEY_USAGES = ["sign", "verify"];\r\nCryptoOps.EXTRACTABLE = true;\r\nfunction getSortedObjectString(obj) {\r\n return JSON.stringify(obj, Object.keys(obj).sort());\r\n}\n\n\n//# sourceMappingURL=CryptoOps.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/OpenIdConfigResponse.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction isOpenIdConfigResponse(response) {\r\n return (response.hasOwnProperty("authorization_endpoint") &&\r\n response.hasOwnProperty("token_endpoint") &&\r\n response.hasOwnProperty("issuer") &&\r\n response.hasOwnProperty("jwks_uri"));\r\n}\n\n\n//# sourceMappingURL=OpenIdConfigResponse.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/CloudInstanceDiscoveryResponse.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction isCloudInstanceDiscoveryResponse(response) {\r\n return (response.hasOwnProperty("tenant_discovery_endpoint") &&\r\n response.hasOwnProperty("metadata"));\r\n}\n\n\n//# sourceMappingURL=CloudInstanceDiscoveryResponse.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction isCloudInstanceDiscoveryErrorResponse(response) {\r\n return (response.hasOwnProperty("error") &&\r\n response.hasOwnProperty("error_description"));\r\n}\n\n\n//# sourceMappingURL=CloudInstanceDiscoveryErrorResponse.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/RegionDiscovery.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass RegionDiscovery {\r\n constructor(networkInterface, logger, performanceClient, correlationId) {\r\n this.networkInterface = networkInterface;\r\n this.logger = logger;\r\n this.performanceClient = performanceClient;\r\n this.correlationId = correlationId;\r\n }\r\n /**\r\n * Detect the region from the application\'s environment.\r\n *\r\n * @returns Promise\r\n */\r\n async detectRegion(environmentRegion, regionDiscoveryMetadata) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryDetectRegion, this.correlationId);\r\n // Initialize auto detected region with the region from the envrionment\r\n let autodetectedRegionName = environmentRegion;\r\n // Check if a region was detected from the environment, if not, attempt to get the region from IMDS\r\n if (!autodetectedRegionName) {\r\n const options = RegionDiscovery.IMDS_OPTIONS;\r\n try {\r\n const localIMDSVersionResponse = await invokeAsync(this.getRegionFromIMDS.bind(this), PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.logger, this.performanceClient, this.correlationId)(Constants.IMDS_VERSION, options);\r\n if (localIMDSVersionResponse.status ===\r\n ResponseCodes.httpSuccess) {\r\n autodetectedRegionName = localIMDSVersionResponse.body;\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.IMDS;\r\n }\r\n // If the response using the local IMDS version failed, try to fetch the current version of IMDS and retry.\r\n if (localIMDSVersionResponse.status ===\r\n ResponseCodes.httpBadRequest) {\r\n const currentIMDSVersion = await invokeAsync(this.getCurrentVersion.bind(this), PerformanceEvents.RegionDiscoveryGetCurrentVersion, this.logger, this.performanceClient, this.correlationId)(options);\r\n if (!currentIMDSVersion) {\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n return null;\r\n }\r\n const currentIMDSVersionResponse = await invokeAsync(this.getRegionFromIMDS.bind(this), PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.logger, this.performanceClient, this.correlationId)(currentIMDSVersion, options);\r\n if (currentIMDSVersionResponse.status ===\r\n ResponseCodes.httpSuccess) {\r\n autodetectedRegionName =\r\n currentIMDSVersionResponse.body;\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.IMDS;\r\n }\r\n }\r\n }\r\n catch (e) {\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n return null;\r\n }\r\n }\r\n else {\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.ENVIRONMENT_VARIABLE;\r\n }\r\n // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION\r\n if (!autodetectedRegionName) {\r\n regionDiscoveryMetadata.region_source =\r\n RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n }\r\n return autodetectedRegionName || null;\r\n }\r\n /**\r\n * Make the call to the IMDS endpoint\r\n *\r\n * @param imdsEndpointUrl\r\n * @returns Promise>\r\n */\r\n async getRegionFromIMDS(version, options) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.correlationId);\r\n return this.networkInterface.sendGetRequestAsync(`${Constants.IMDS_ENDPOINT}?api-version=${version}&format=text`, options, Constants.IMDS_TIMEOUT);\r\n }\r\n /**\r\n * Get the most recent version of the IMDS endpoint available\r\n *\r\n * @returns Promise\r\n */\r\n async getCurrentVersion(options) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryGetCurrentVersion, this.correlationId);\r\n try {\r\n const response = await this.networkInterface.sendGetRequestAsync(`${Constants.IMDS_ENDPOINT}?format=json`, options);\r\n // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.\r\n if (response.status === ResponseCodes.httpBadRequest &&\r\n response.body &&\r\n response.body["newest-versions"] &&\r\n response.body["newest-versions"].length > 0) {\r\n return response.body["newest-versions"][0];\r\n }\r\n return null;\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n }\r\n}\r\n// Options for the IMDS endpoint request\r\nRegionDiscovery.IMDS_OPTIONS = {\r\n headers: {\r\n Metadata: "true",\r\n },\r\n};\n\n\n//# sourceMappingURL=RegionDiscovery.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/Authority.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the\r\n * endpoint. It will store the pertinent config data in this object for use during token calls.\r\n * @internal\r\n */\r\nclass Authority {\r\n constructor(authority, networkInterface, cacheManager, authorityOptions, logger, correlationId, performanceClient, managedIdentity) {\r\n this.canonicalAuthority = authority;\r\n this._canonicalAuthority.validateAsUri();\r\n this.networkInterface = networkInterface;\r\n this.cacheManager = cacheManager;\r\n this.authorityOptions = authorityOptions;\r\n this.regionDiscoveryMetadata = {\r\n region_used: undefined,\r\n region_source: undefined,\r\n region_outcome: undefined,\r\n };\r\n this.logger = logger;\r\n this.performanceClient = performanceClient;\r\n this.correlationId = correlationId;\r\n this.managedIdentity = managedIdentity || false;\r\n this.regionDiscovery = new RegionDiscovery(networkInterface, this.logger, this.performanceClient, this.correlationId);\r\n }\r\n /**\r\n * Get {@link AuthorityType}\r\n * @param authorityUri {@link IUri}\r\n * @private\r\n */\r\n getAuthorityType(authorityUri) {\r\n // CIAM auth url pattern is being standardized as: .ciamlogin.com\r\n if (authorityUri.HostNameAndPort.endsWith(Constants.CIAM_AUTH_URL)) {\r\n return AuthorityType.Ciam;\r\n }\r\n const pathSegments = authorityUri.PathSegments;\r\n if (pathSegments.length) {\r\n switch (pathSegments[0].toLowerCase()) {\r\n case Constants.ADFS:\r\n return AuthorityType.Adfs;\r\n case Constants.DSTS:\r\n return AuthorityType.Dsts;\r\n }\r\n }\r\n return AuthorityType.Default;\r\n }\r\n // See above for AuthorityType\r\n get authorityType() {\r\n return this.getAuthorityType(this.canonicalAuthorityUrlComponents);\r\n }\r\n /**\r\n * ProtocolMode enum representing the way endpoints are constructed.\r\n */\r\n get protocolMode() {\r\n return this.authorityOptions.protocolMode;\r\n }\r\n /**\r\n * Returns authorityOptions which can be used to reinstantiate a new authority instance\r\n */\r\n get options() {\r\n return this.authorityOptions;\r\n }\r\n /**\r\n * A URL that is the authority set by the developer\r\n */\r\n get canonicalAuthority() {\r\n return this._canonicalAuthority.urlString;\r\n }\r\n /**\r\n * Sets canonical authority.\r\n */\r\n set canonicalAuthority(url) {\r\n this._canonicalAuthority = new UrlString(url);\r\n this._canonicalAuthority.validateAsUri();\r\n this._canonicalAuthorityUrlComponents = null;\r\n }\r\n /**\r\n * Get authority components.\r\n */\r\n get canonicalAuthorityUrlComponents() {\r\n if (!this._canonicalAuthorityUrlComponents) {\r\n this._canonicalAuthorityUrlComponents =\r\n this._canonicalAuthority.getUrlComponents();\r\n }\r\n return this._canonicalAuthorityUrlComponents;\r\n }\r\n /**\r\n * Get hostname and port i.e. login.microsoftonline.com\r\n */\r\n get hostnameAndPort() {\r\n return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();\r\n }\r\n /**\r\n * Get tenant for authority.\r\n */\r\n get tenant() {\r\n return this.canonicalAuthorityUrlComponents.PathSegments[0];\r\n }\r\n /**\r\n * OAuth /authorize endpoint for requests\r\n */\r\n get authorizationEndpoint() {\r\n if (this.discoveryComplete()) {\r\n return this.replacePath(this.metadata.authorization_endpoint);\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * OAuth /token endpoint for requests\r\n */\r\n get tokenEndpoint() {\r\n if (this.discoveryComplete()) {\r\n return this.replacePath(this.metadata.token_endpoint);\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n get deviceCodeEndpoint() {\r\n if (this.discoveryComplete()) {\r\n return this.replacePath(this.metadata.token_endpoint.replace("/token", "/devicecode"));\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * OAuth logout endpoint for requests\r\n */\r\n get endSessionEndpoint() {\r\n if (this.discoveryComplete()) {\r\n // ROPC policies may not have end_session_endpoint set\r\n if (!this.metadata.end_session_endpoint) {\r\n throw createClientAuthError(endSessionEndpointNotSupported);\r\n }\r\n return this.replacePath(this.metadata.end_session_endpoint);\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * OAuth issuer for requests\r\n */\r\n get selfSignedJwtAudience() {\r\n if (this.discoveryComplete()) {\r\n return this.replacePath(this.metadata.issuer);\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * Jwks_uri for token signing keys\r\n */\r\n get jwksUri() {\r\n if (this.discoveryComplete()) {\r\n return this.replacePath(this.metadata.jwks_uri);\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * Returns a flag indicating that tenant name can be replaced in authority {@link IUri}\r\n * @param authorityUri {@link IUri}\r\n * @private\r\n */\r\n canReplaceTenant(authorityUri) {\r\n return (authorityUri.PathSegments.length === 1 &&\r\n !Authority.reservedTenantDomains.has(authorityUri.PathSegments[0]) &&\r\n this.getAuthorityType(authorityUri) === AuthorityType.Default &&\r\n this.protocolMode === ProtocolMode.AAD);\r\n }\r\n /**\r\n * Replaces tenant in url path with current tenant. Defaults to common.\r\n * @param urlString\r\n */\r\n replaceTenant(urlString) {\r\n return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);\r\n }\r\n /**\r\n * Replaces path such as tenant or policy with the current tenant or policy.\r\n * @param urlString\r\n */\r\n replacePath(urlString) {\r\n let endpoint = urlString;\r\n const cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);\r\n const cachedAuthorityUrlComponents = cachedAuthorityUrl.getUrlComponents();\r\n const cachedAuthorityParts = cachedAuthorityUrlComponents.PathSegments;\r\n const currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;\r\n currentAuthorityParts.forEach((currentPart, index) => {\r\n let cachedPart = cachedAuthorityParts[index];\r\n if (index === 0 &&\r\n this.canReplaceTenant(cachedAuthorityUrlComponents)) {\r\n const tenantId = new UrlString(this.metadata.authorization_endpoint).getUrlComponents().PathSegments[0];\r\n /**\r\n * Check if AAD canonical authority contains tenant domain name, for example "testdomain.onmicrosoft.com",\r\n * by comparing its first path segment to the corresponding authorization endpoint path segment, which is\r\n * always resolved with tenant id by OIDC.\r\n */\r\n if (cachedPart !== tenantId) {\r\n this.logger.verbose(`Replacing tenant domain name ${cachedPart} with id ${tenantId}`);\r\n cachedPart = tenantId;\r\n }\r\n }\r\n if (currentPart !== cachedPart) {\r\n endpoint = endpoint.replace(`/${cachedPart}/`, `/${currentPart}/`);\r\n }\r\n });\r\n return this.replaceTenant(endpoint);\r\n }\r\n /**\r\n * The default open id configuration endpoint for any canonical authority.\r\n */\r\n get defaultOpenIdConfigurationEndpoint() {\r\n const canonicalAuthorityHost = this.hostnameAndPort;\r\n if (this.canonicalAuthority.endsWith("v2.0/") ||\r\n this.authorityType === AuthorityType.Adfs ||\r\n (this.protocolMode !== ProtocolMode.AAD &&\r\n !this.isAliasOfKnownMicrosoftAuthority(canonicalAuthorityHost))) {\r\n return `${this.canonicalAuthority}.well-known/openid-configuration`;\r\n }\r\n return `${this.canonicalAuthority}v2.0/.well-known/openid-configuration`;\r\n }\r\n /**\r\n * Boolean that returns whether or not tenant discovery has been completed.\r\n */\r\n discoveryComplete() {\r\n return !!this.metadata;\r\n }\r\n /**\r\n * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network\r\n * and the /authorize, /token and logout endpoints.\r\n */\r\n async resolveEndpointsAsync() {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityResolveEndpointsAsync, this.correlationId);\r\n const metadataEntity = this.getCurrentMetadataEntity();\r\n const cloudDiscoverySource = await invokeAsync(this.updateCloudDiscoveryMetadata.bind(this), PerformanceEvents.AuthorityUpdateCloudDiscoveryMetadata, this.logger, this.performanceClient, this.correlationId)(metadataEntity);\r\n this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);\r\n const endpointSource = await invokeAsync(this.updateEndpointMetadata.bind(this), PerformanceEvents.AuthorityUpdateEndpointMetadata, this.logger, this.performanceClient, this.correlationId)(metadataEntity);\r\n this.updateCachedMetadata(metadataEntity, cloudDiscoverySource, {\r\n source: endpointSource,\r\n });\r\n this.performanceClient?.addFields({\r\n cloudDiscoverySource: cloudDiscoverySource,\r\n authorityEndpointSource: endpointSource,\r\n }, this.correlationId);\r\n }\r\n /**\r\n * Returns metadata entity from cache if it exists, otherwiser returns a new metadata entity built\r\n * from the configured canonical authority\r\n * @returns\r\n */\r\n getCurrentMetadataEntity() {\r\n let metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);\r\n if (!metadataEntity) {\r\n metadataEntity = {\r\n aliases: [],\r\n preferred_cache: this.hostnameAndPort,\r\n preferred_network: this.hostnameAndPort,\r\n canonical_authority: this.canonicalAuthority,\r\n authorization_endpoint: "",\r\n token_endpoint: "",\r\n end_session_endpoint: "",\r\n issuer: "",\r\n aliasesFromNetwork: false,\r\n endpointsFromNetwork: false,\r\n expiresAt: generateAuthorityMetadataExpiresAt(),\r\n jwks_uri: "",\r\n };\r\n }\r\n return metadataEntity;\r\n }\r\n /**\r\n * Updates cached metadata based on metadata source and sets the instance\'s metadata\r\n * property to the same value\r\n * @param metadataEntity\r\n * @param cloudDiscoverySource\r\n * @param endpointMetadataResult\r\n */\r\n updateCachedMetadata(metadataEntity, cloudDiscoverySource, endpointMetadataResult) {\r\n if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE &&\r\n endpointMetadataResult?.source !== AuthorityMetadataSource.CACHE) {\r\n // Reset the expiration time unless both values came from a successful cache lookup\r\n metadataEntity.expiresAt =\r\n generateAuthorityMetadataExpiresAt();\r\n metadataEntity.canonical_authority = this.canonicalAuthority;\r\n }\r\n const cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);\r\n this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);\r\n this.metadata = metadataEntity;\r\n }\r\n /**\r\n * Update AuthorityMetadataEntity with new endpoints and return where the information came from\r\n * @param metadataEntity\r\n */\r\n async updateEndpointMetadata(metadataEntity) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityUpdateEndpointMetadata, this.correlationId);\r\n const localMetadata = this.updateEndpointMetadataFromLocalSources(metadataEntity);\r\n // Further update may be required for hardcoded metadata if regional metadata is preferred\r\n if (localMetadata) {\r\n if (localMetadata.source ===\r\n AuthorityMetadataSource.HARDCODED_VALUES) {\r\n // If the user prefers to use an azure region replace the global endpoints with regional information.\r\n if (this.authorityOptions.azureRegionConfiguration?.azureRegion) {\r\n if (localMetadata.metadata) {\r\n const hardcodedMetadata = await invokeAsync(this.updateMetadataWithRegionalInformation.bind(this), PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation, this.logger, this.performanceClient, this.correlationId)(localMetadata.metadata);\r\n updateAuthorityEndpointMetadata(metadataEntity, hardcodedMetadata, false);\r\n metadataEntity.canonical_authority =\r\n this.canonicalAuthority;\r\n }\r\n }\r\n }\r\n return localMetadata.source;\r\n }\r\n // Get metadata from network if local sources aren\'t available\r\n let metadata = await invokeAsync(this.getEndpointMetadataFromNetwork.bind(this), PerformanceEvents.AuthorityGetEndpointMetadataFromNetwork, this.logger, this.performanceClient, this.correlationId)();\r\n if (metadata) {\r\n // If the user prefers to use an azure region replace the global endpoints with regional information.\r\n if (this.authorityOptions.azureRegionConfiguration?.azureRegion) {\r\n metadata = await invokeAsync(this.updateMetadataWithRegionalInformation.bind(this), PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation, this.logger, this.performanceClient, this.correlationId)(metadata);\r\n }\r\n updateAuthorityEndpointMetadata(metadataEntity, metadata, true);\r\n return AuthorityMetadataSource.NETWORK;\r\n }\r\n else {\r\n // Metadata could not be obtained from the config, cache, network or hardcoded values\r\n throw createClientAuthError(openIdConfigError, this.defaultOpenIdConfigurationEndpoint);\r\n }\r\n }\r\n /**\r\n * Updates endpoint metadata from local sources and returns where the information was retrieved from and the metadata config\r\n * response if the source is hardcoded metadata\r\n * @param metadataEntity\r\n * @returns\r\n */\r\n updateEndpointMetadataFromLocalSources(metadataEntity) {\r\n this.logger.verbose("Attempting to get endpoint metadata from authority configuration");\r\n const configMetadata = this.getEndpointMetadataFromConfig();\r\n if (configMetadata) {\r\n this.logger.verbose("Found endpoint metadata in authority configuration");\r\n updateAuthorityEndpointMetadata(metadataEntity, configMetadata, false);\r\n return {\r\n source: AuthorityMetadataSource.CONFIG,\r\n };\r\n }\r\n this.logger.verbose("Did not find endpoint metadata in the config... Attempting to get endpoint metadata from the hardcoded values.");\r\n // skipAuthorityMetadataCache is used to bypass hardcoded authority metadata and force a network metadata cache lookup and network metadata request if no cached response is available.\r\n if (this.authorityOptions.skipAuthorityMetadataCache) {\r\n this.logger.verbose("Skipping hardcoded metadata cache since skipAuthorityMetadataCache is set to true. Attempting to get endpoint metadata from the network metadata cache.");\r\n }\r\n else {\r\n const hardcodedMetadata = this.getEndpointMetadataFromHardcodedValues();\r\n if (hardcodedMetadata) {\r\n updateAuthorityEndpointMetadata(metadataEntity, hardcodedMetadata, false);\r\n return {\r\n source: AuthorityMetadataSource.HARDCODED_VALUES,\r\n metadata: hardcodedMetadata,\r\n };\r\n }\r\n else {\r\n this.logger.verbose("Did not find endpoint metadata in hardcoded values... Attempting to get endpoint metadata from the network metadata cache.");\r\n }\r\n }\r\n // Check cached metadata entity expiration status\r\n const metadataEntityExpired = isAuthorityMetadataExpired(metadataEntity);\r\n if (this.isAuthoritySameType(metadataEntity) &&\r\n metadataEntity.endpointsFromNetwork &&\r\n !metadataEntityExpired) {\r\n // No need to update\r\n this.logger.verbose("Found endpoint metadata in the cache.");\r\n return { source: AuthorityMetadataSource.CACHE };\r\n }\r\n else if (metadataEntityExpired) {\r\n this.logger.verbose("The metadata entity is expired.");\r\n }\r\n return null;\r\n }\r\n /**\r\n * Compares the number of url components after the domain to determine if the cached\r\n * authority metadata can be used for the requested authority. Protects against same domain different\r\n * authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy\r\n * @param metadataEntity\r\n */\r\n isAuthoritySameType(metadataEntity) {\r\n const cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);\r\n const cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;\r\n return (cachedParts.length ===\r\n this.canonicalAuthorityUrlComponents.PathSegments.length);\r\n }\r\n /**\r\n * Parse authorityMetadata config option\r\n */\r\n getEndpointMetadataFromConfig() {\r\n if (this.authorityOptions.authorityMetadata) {\r\n try {\r\n return JSON.parse(this.authorityOptions.authorityMetadata);\r\n }\r\n catch (e) {\r\n throw createClientConfigurationError(invalidAuthorityMetadata);\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Gets OAuth endpoints from the given OpenID configuration endpoint.\r\n *\r\n * @param hasHardcodedMetadata boolean\r\n */\r\n async getEndpointMetadataFromNetwork() {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityGetEndpointMetadataFromNetwork, this.correlationId);\r\n const options = {};\r\n /*\r\n * TODO: Add a timeout if the authority exists in our library\'s\r\n * hardcoded list of metadata\r\n */\r\n const openIdConfigurationEndpoint = this.defaultOpenIdConfigurationEndpoint;\r\n this.logger.verbose(`Authority.getEndpointMetadataFromNetwork: attempting to retrieve OAuth endpoints from ${openIdConfigurationEndpoint}`);\r\n try {\r\n const response = await this.networkInterface.sendGetRequestAsync(openIdConfigurationEndpoint, options);\r\n const isValidResponse = isOpenIdConfigResponse(response.body);\r\n if (isValidResponse) {\r\n return response.body;\r\n }\r\n else {\r\n this.logger.verbose(`Authority.getEndpointMetadataFromNetwork: could not parse response as OpenID configuration`);\r\n return null;\r\n }\r\n }\r\n catch (e) {\r\n this.logger.verbose(`Authority.getEndpointMetadataFromNetwork: ${e}`);\r\n return null;\r\n }\r\n }\r\n /**\r\n * Get OAuth endpoints for common authorities.\r\n */\r\n getEndpointMetadataFromHardcodedValues() {\r\n if (this.hostnameAndPort in EndpointMetadata) {\r\n return EndpointMetadata[this.hostnameAndPort];\r\n }\r\n return null;\r\n }\r\n /**\r\n * Update the retrieved metadata with regional information.\r\n * User selected Azure region will be used if configured.\r\n */\r\n async updateMetadataWithRegionalInformation(metadata) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation, this.correlationId);\r\n const userConfiguredAzureRegion = this.authorityOptions.azureRegionConfiguration?.azureRegion;\r\n if (userConfiguredAzureRegion) {\r\n if (userConfiguredAzureRegion !==\r\n Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {\r\n this.regionDiscoveryMetadata.region_outcome =\r\n RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;\r\n this.regionDiscoveryMetadata.region_used =\r\n userConfiguredAzureRegion;\r\n return Authority.replaceWithRegionalInformation(metadata, userConfiguredAzureRegion);\r\n }\r\n const autodetectedRegionName = await invokeAsync(this.regionDiscovery.detectRegion.bind(this.regionDiscovery), PerformanceEvents.RegionDiscoveryDetectRegion, this.logger, this.performanceClient, this.correlationId)(this.authorityOptions.azureRegionConfiguration\r\n ?.environmentRegion, this.regionDiscoveryMetadata);\r\n if (autodetectedRegionName) {\r\n this.regionDiscoveryMetadata.region_outcome =\r\n RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL;\r\n this.regionDiscoveryMetadata.region_used =\r\n autodetectedRegionName;\r\n return Authority.replaceWithRegionalInformation(metadata, autodetectedRegionName);\r\n }\r\n this.regionDiscoveryMetadata.region_outcome =\r\n RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;\r\n }\r\n return metadata;\r\n }\r\n /**\r\n * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache\r\n * and returns where the information was retrieved from\r\n * @param metadataEntity\r\n * @returns AuthorityMetadataSource\r\n */\r\n async updateCloudDiscoveryMetadata(metadataEntity) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityUpdateCloudDiscoveryMetadata, this.correlationId);\r\n const localMetadataSource = this.updateCloudDiscoveryMetadataFromLocalSources(metadataEntity);\r\n if (localMetadataSource) {\r\n return localMetadataSource;\r\n }\r\n // Fallback to network as metadata source\r\n const metadata = await invokeAsync(this.getCloudDiscoveryMetadataFromNetwork.bind(this), PerformanceEvents.AuthorityGetCloudDiscoveryMetadataFromNetwork, this.logger, this.performanceClient, this.correlationId)();\r\n if (metadata) {\r\n updateCloudDiscoveryMetadata(metadataEntity, metadata, true);\r\n return AuthorityMetadataSource.NETWORK;\r\n }\r\n // Metadata could not be obtained from the config, cache, network or hardcoded values\r\n throw createClientConfigurationError(untrustedAuthority);\r\n }\r\n updateCloudDiscoveryMetadataFromLocalSources(metadataEntity) {\r\n this.logger.verbose("Attempting to get cloud discovery metadata from authority configuration");\r\n this.logger.verbosePii(`Known Authorities: ${this.authorityOptions.knownAuthorities ||\r\n Constants.NOT_APPLICABLE}`);\r\n this.logger.verbosePii(`Authority Metadata: ${this.authorityOptions.authorityMetadata ||\r\n Constants.NOT_APPLICABLE}`);\r\n this.logger.verbosePii(`Canonical Authority: ${metadataEntity.canonical_authority || Constants.NOT_APPLICABLE}`);\r\n const metadata = this.getCloudDiscoveryMetadataFromConfig();\r\n if (metadata) {\r\n this.logger.verbose("Found cloud discovery metadata in authority configuration");\r\n updateCloudDiscoveryMetadata(metadataEntity, metadata, false);\r\n return AuthorityMetadataSource.CONFIG;\r\n }\r\n // If the cached metadata came from config but that config was not passed to this instance, we must go to hardcoded values\r\n this.logger.verbose("Did not find cloud discovery metadata in the config... Attempting to get cloud discovery metadata from the hardcoded values.");\r\n if (this.options.skipAuthorityMetadataCache) {\r\n this.logger.verbose("Skipping hardcoded cloud discovery metadata cache since skipAuthorityMetadataCache is set to true. Attempting to get cloud discovery metadata from the network metadata cache.");\r\n }\r\n else {\r\n const hardcodedMetadata = getCloudDiscoveryMetadataFromHardcodedValues(this.hostnameAndPort);\r\n if (hardcodedMetadata) {\r\n this.logger.verbose("Found cloud discovery metadata from hardcoded values.");\r\n updateCloudDiscoveryMetadata(metadataEntity, hardcodedMetadata, false);\r\n return AuthorityMetadataSource.HARDCODED_VALUES;\r\n }\r\n this.logger.verbose("Did not find cloud discovery metadata in hardcoded values... Attempting to get cloud discovery metadata from the network metadata cache.");\r\n }\r\n const metadataEntityExpired = isAuthorityMetadataExpired(metadataEntity);\r\n if (this.isAuthoritySameType(metadataEntity) &&\r\n metadataEntity.aliasesFromNetwork &&\r\n !metadataEntityExpired) {\r\n this.logger.verbose("Found cloud discovery metadata in the cache.");\r\n // No need to update\r\n return AuthorityMetadataSource.CACHE;\r\n }\r\n else if (metadataEntityExpired) {\r\n this.logger.verbose("The metadata entity is expired.");\r\n }\r\n return null;\r\n }\r\n /**\r\n * Parse cloudDiscoveryMetadata config or check knownAuthorities\r\n */\r\n getCloudDiscoveryMetadataFromConfig() {\r\n // CIAM does not support cloud discovery metadata\r\n if (this.authorityType === AuthorityType.Ciam) {\r\n this.logger.verbose("CIAM authorities do not support cloud discovery metadata, generate the aliases from authority host.");\r\n return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);\r\n }\r\n // Check if network response was provided in config\r\n if (this.authorityOptions.cloudDiscoveryMetadata) {\r\n this.logger.verbose("The cloud discovery metadata has been provided as a network response, in the config.");\r\n try {\r\n this.logger.verbose("Attempting to parse the cloud discovery metadata.");\r\n const parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata);\r\n const metadata = getCloudDiscoveryMetadataFromNetworkResponse(parsedResponse.metadata, this.hostnameAndPort);\r\n this.logger.verbose("Parsed the cloud discovery metadata.");\r\n if (metadata) {\r\n this.logger.verbose("There is returnable metadata attached to the parsed cloud discovery metadata.");\r\n return metadata;\r\n }\r\n else {\r\n this.logger.verbose("There is no metadata attached to the parsed cloud discovery metadata.");\r\n }\r\n }\r\n catch (e) {\r\n this.logger.verbose("Unable to parse the cloud discovery metadata. Throwing Invalid Cloud Discovery Metadata Error.");\r\n throw createClientConfigurationError(invalidCloudDiscoveryMetadata);\r\n }\r\n }\r\n // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities\r\n if (this.isInKnownAuthorities()) {\r\n this.logger.verbose("The host is included in knownAuthorities. Creating new cloud discovery metadata from the host.");\r\n return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);\r\n }\r\n return null;\r\n }\r\n /**\r\n * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config\r\n *\r\n * @param hasHardcodedMetadata boolean\r\n */\r\n async getCloudDiscoveryMetadataFromNetwork() {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityGetCloudDiscoveryMetadataFromNetwork, this.correlationId);\r\n const instanceDiscoveryEndpoint = `${Constants.AAD_INSTANCE_DISCOVERY_ENDPT}${this.canonicalAuthority}oauth2/v2.0/authorize`;\r\n const options = {};\r\n /*\r\n * TODO: Add a timeout if the authority exists in our library\'s\r\n * hardcoded list of metadata\r\n */\r\n let match = null;\r\n try {\r\n const response = await this.networkInterface.sendGetRequestAsync(instanceDiscoveryEndpoint, options);\r\n let typedResponseBody;\r\n let metadata;\r\n if (isCloudInstanceDiscoveryResponse(response.body)) {\r\n typedResponseBody =\r\n response.body;\r\n metadata = typedResponseBody.metadata;\r\n this.logger.verbosePii(`tenant_discovery_endpoint is: ${typedResponseBody.tenant_discovery_endpoint}`);\r\n }\r\n else if (isCloudInstanceDiscoveryErrorResponse(response.body)) {\r\n this.logger.warning(`A CloudInstanceDiscoveryErrorResponse was returned. The cloud instance discovery network request\'s status code is: ${response.status}`);\r\n typedResponseBody =\r\n response.body;\r\n if (typedResponseBody.error === Constants.INVALID_INSTANCE) {\r\n this.logger.error("The CloudInstanceDiscoveryErrorResponse error is invalid_instance.");\r\n return null;\r\n }\r\n this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error is ${typedResponseBody.error}`);\r\n this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error description is ${typedResponseBody.error_description}`);\r\n this.logger.warning("Setting the value of the CloudInstanceDiscoveryMetadata (returned from the network) to []");\r\n metadata = [];\r\n }\r\n else {\r\n this.logger.error("AAD did not return a CloudInstanceDiscoveryResponse or CloudInstanceDiscoveryErrorResponse");\r\n return null;\r\n }\r\n this.logger.verbose("Attempting to find a match between the developer\'s authority and the CloudInstanceDiscoveryMetadata returned from the network request.");\r\n match = getCloudDiscoveryMetadataFromNetworkResponse(metadata, this.hostnameAndPort);\r\n }\r\n catch (error) {\r\n if (error instanceof AuthError) {\r\n this.logger.error(`There was a network error while attempting to get the cloud discovery instance metadata.\\nError: ${error.errorCode}\\nError Description: ${error.errorMessage}`);\r\n }\r\n else {\r\n const typedError = error;\r\n this.logger.error(`A non-MSALJS error was thrown while attempting to get the cloud instance discovery metadata.\\nError: ${typedError.name}\\nError Description: ${typedError.message}`);\r\n }\r\n return null;\r\n }\r\n // Custom Domain scenario, host is trusted because Instance Discovery call succeeded\r\n if (!match) {\r\n this.logger.warning("The developer\'s authority was not found within the CloudInstanceDiscoveryMetadata returned from the network request.");\r\n this.logger.verbose("Creating custom Authority for custom domain scenario.");\r\n match = Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);\r\n }\r\n return match;\r\n }\r\n /**\r\n * Helper function to determine if this host is included in the knownAuthorities config option\r\n */\r\n isInKnownAuthorities() {\r\n const matches = this.authorityOptions.knownAuthorities.filter((authority) => {\r\n return (authority &&\r\n UrlString.getDomainFromUrl(authority).toLowerCase() ===\r\n this.hostnameAndPort);\r\n });\r\n return matches.length > 0;\r\n }\r\n /**\r\n * helper function to populate the authority based on azureCloudOptions\r\n * @param authorityString\r\n * @param azureCloudOptions\r\n */\r\n static generateAuthority(authorityString, azureCloudOptions) {\r\n let authorityAzureCloudInstance;\r\n if (azureCloudOptions &&\r\n azureCloudOptions.azureCloudInstance !== AzureCloudInstance.None) {\r\n const tenant = azureCloudOptions.tenant\r\n ? azureCloudOptions.tenant\r\n : Constants.DEFAULT_COMMON_TENANT;\r\n authorityAzureCloudInstance = `${azureCloudOptions.azureCloudInstance}/${tenant}/`;\r\n }\r\n return authorityAzureCloudInstance\r\n ? authorityAzureCloudInstance\r\n : authorityString;\r\n }\r\n /**\r\n * Creates cloud discovery metadata object from a given host\r\n * @param host\r\n */\r\n static createCloudDiscoveryMetadataFromHost(host) {\r\n return {\r\n preferred_network: host,\r\n preferred_cache: host,\r\n aliases: [host],\r\n };\r\n }\r\n /**\r\n * helper function to generate environment from authority object\r\n */\r\n getPreferredCache() {\r\n if (this.managedIdentity) {\r\n return Constants.DEFAULT_AUTHORITY_HOST;\r\n }\r\n else if (this.discoveryComplete()) {\r\n return this.metadata.preferred_cache;\r\n }\r\n else {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n }\r\n /**\r\n * Returns whether or not the provided host is an alias of this authority instance\r\n * @param host\r\n */\r\n isAlias(host) {\r\n return this.metadata.aliases.indexOf(host) > -1;\r\n }\r\n /**\r\n * Returns whether or not the provided host is an alias of a known Microsoft authority for purposes of endpoint discovery\r\n * @param host\r\n */\r\n isAliasOfKnownMicrosoftAuthority(host) {\r\n return InstanceDiscoveryMetadataAliases.has(host);\r\n }\r\n /**\r\n * Checks whether the provided host is that of a public cloud authority\r\n *\r\n * @param authority string\r\n * @returns bool\r\n */\r\n static isPublicCloudAuthority(host) {\r\n return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;\r\n }\r\n /**\r\n * Rebuild the authority string with the region\r\n *\r\n * @param host string\r\n * @param region string\r\n */\r\n static buildRegionalAuthorityString(host, region, queryString) {\r\n // Create and validate a Url string object with the initial authority string\r\n const authorityUrlInstance = new UrlString(host);\r\n authorityUrlInstance.validateAsUri();\r\n const authorityUrlParts = authorityUrlInstance.getUrlComponents();\r\n let hostNameAndPort = `${region}.${authorityUrlParts.HostNameAndPort}`;\r\n if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {\r\n hostNameAndPort = `${region}.${Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX}`;\r\n }\r\n // Include the query string portion of the url\r\n const url = UrlString.constructAuthorityUriFromObject({\r\n ...authorityUrlInstance.getUrlComponents(),\r\n HostNameAndPort: hostNameAndPort,\r\n }).urlString;\r\n // Add the query string if a query string was provided\r\n if (queryString)\r\n return `${url}?${queryString}`;\r\n return url;\r\n }\r\n /**\r\n * Replace the endpoints in the metadata object with their regional equivalents.\r\n *\r\n * @param metadata OpenIdConfigResponse\r\n * @param azureRegion string\r\n */\r\n static replaceWithRegionalInformation(metadata, azureRegion) {\r\n const regionalMetadata = { ...metadata };\r\n regionalMetadata.authorization_endpoint =\r\n Authority.buildRegionalAuthorityString(regionalMetadata.authorization_endpoint, azureRegion);\r\n regionalMetadata.token_endpoint =\r\n Authority.buildRegionalAuthorityString(regionalMetadata.token_endpoint, azureRegion);\r\n if (regionalMetadata.end_session_endpoint) {\r\n regionalMetadata.end_session_endpoint =\r\n Authority.buildRegionalAuthorityString(regionalMetadata.end_session_endpoint, azureRegion);\r\n }\r\n return regionalMetadata;\r\n }\r\n /**\r\n * Transform CIAM_AUTHORIY as per the below rules:\r\n * If no path segments found and it is a CIAM authority (hostname ends with .ciamlogin.com), then transform it\r\n *\r\n * NOTE: The transformation path should go away once STS supports CIAM with the format: `tenantIdorDomain.ciamlogin.com`\r\n * `ciamlogin.com` can also change in the future and we should accommodate the same\r\n *\r\n * @param authority\r\n */\r\n static transformCIAMAuthority(authority) {\r\n let ciamAuthority = authority;\r\n const authorityUrl = new UrlString(authority);\r\n const authorityUrlComponents = authorityUrl.getUrlComponents();\r\n // check if transformation is needed\r\n if (authorityUrlComponents.PathSegments.length === 0 &&\r\n authorityUrlComponents.HostNameAndPort.endsWith(Constants.CIAM_AUTH_URL)) {\r\n const tenantIdOrDomain = authorityUrlComponents.HostNameAndPort.split(".")[0];\r\n ciamAuthority = `${ciamAuthority}${tenantIdOrDomain}${Constants.AAD_TENANT_DOMAIN_SUFFIX}`;\r\n }\r\n return ciamAuthority;\r\n }\r\n}\r\n// Reserved tenant domain names that will not be replaced with tenant id\r\nAuthority.reservedTenantDomains = new Set([\r\n "{tenant}",\r\n "{tenantid}",\r\n AADAuthorityConstants.COMMON,\r\n AADAuthorityConstants.CONSUMERS,\r\n AADAuthorityConstants.ORGANIZATIONS,\r\n]);\r\n/**\r\n * Extract tenantId from authority\r\n */\r\nfunction getTenantFromAuthorityString(authority) {\r\n const authorityUrl = new UrlString(authority);\r\n const authorityUrlComponents = authorityUrl.getUrlComponents();\r\n /**\r\n * For credential matching purposes, tenantId is the last path segment of the authority URL:\r\n * AAD Authority - domain/tenantId -> Credentials are cached with realm = tenantId\r\n * B2C Authority - domain/{tenantId}?/.../policy -> Credentials are cached with realm = policy\r\n * tenantId is downcased because B2C policies can have mixed case but tfp claim is downcased\r\n *\r\n * Note that we may not have any path segments in certain OIDC scenarios.\r\n */\r\n const tenantId = authorityUrlComponents.PathSegments.slice(-1)[0]?.toLowerCase();\r\n switch (tenantId) {\r\n case AADAuthorityConstants.COMMON:\r\n case AADAuthorityConstants.ORGANIZATIONS:\r\n case AADAuthorityConstants.CONSUMERS:\r\n return undefined;\r\n default:\r\n return tenantId;\r\n }\r\n}\r\nfunction formatAuthorityUri(authorityUri) {\r\n return authorityUri.endsWith(Constants.FORWARD_SLASH)\r\n ? authorityUri\r\n : `${authorityUri}${Constants.FORWARD_SLASH}`;\r\n}\r\nfunction buildStaticAuthorityOptions(authOptions) {\r\n const rawCloudDiscoveryMetadata = authOptions.cloudDiscoveryMetadata;\r\n let cloudDiscoveryMetadata = undefined;\r\n if (rawCloudDiscoveryMetadata) {\r\n try {\r\n cloudDiscoveryMetadata = JSON.parse(rawCloudDiscoveryMetadata);\r\n }\r\n catch (e) {\r\n throw createClientConfigurationError(invalidCloudDiscoveryMetadata);\r\n }\r\n }\r\n return {\r\n canonicalAuthority: authOptions.authority\r\n ? formatAuthorityUri(authOptions.authority)\r\n : undefined,\r\n knownAuthorities: authOptions.knownAuthorities,\r\n cloudDiscoveryMetadata: cloudDiscoveryMetadata,\r\n };\r\n}\n\n\n//# sourceMappingURL=Authority.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/InteractionRequiredAuthErrorCodes.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n// Codes defined by MSAL\r\nconst noTokensFound = "no_tokens_found";\r\nconst nativeAccountUnavailable = "native_account_unavailable";\r\nconst refreshTokenExpired = "refresh_token_expired";\r\n// Codes potentially returned by server\r\nconst interactionRequired = "interaction_required";\r\nconst consentRequired = "consent_required";\r\nconst loginRequired = "login_required";\r\nconst badToken = "bad_token";\n\n\n//# sourceMappingURL=InteractionRequiredAuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/InteractionRequiredAuthError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required\r\n */\r\nconst InteractionRequiredServerErrorMessage = [\r\n interactionRequired,\r\n consentRequired,\r\n loginRequired,\r\n badToken,\r\n];\r\nconst InteractionRequiredAuthSubErrorMessage = [\r\n "message_only",\r\n "additional_action",\r\n "basic_action",\r\n "user_password_expired",\r\n "consent_required",\r\n "bad_token",\r\n];\r\nconst InteractionRequiredAuthErrorMessages = {\r\n [noTokensFound]: "No refresh token found in the cache. Please sign-in.",\r\n [nativeAccountUnavailable]: "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API.",\r\n [refreshTokenExpired]: "Refresh token has expired.",\r\n [badToken]: "Identity provider returned bad_token due to an expired or invalid refresh token. Please invoke an interactive API to resolve.",\r\n};\r\n/**\r\n * Interaction required errors defined by the SDK\r\n * @deprecated Use InteractionRequiredAuthErrorCodes instead\r\n */\r\nconst InteractionRequiredAuthErrorMessage = {\r\n noTokensFoundError: {\r\n code: noTokensFound,\r\n desc: InteractionRequiredAuthErrorMessages[noTokensFound],\r\n },\r\n native_account_unavailable: {\r\n code: nativeAccountUnavailable,\r\n desc: InteractionRequiredAuthErrorMessages[nativeAccountUnavailable],\r\n },\r\n bad_token: {\r\n code: badToken,\r\n desc: InteractionRequiredAuthErrorMessages[badToken],\r\n },\r\n};\r\n/**\r\n * Error thrown when user interaction is required.\r\n */\r\nclass InteractionRequiredAuthError extends AuthError {\r\n constructor(errorCode, errorMessage, subError, timestamp, traceId, correlationId, claims, errorNo) {\r\n super(errorCode, errorMessage, subError);\r\n Object.setPrototypeOf(this, InteractionRequiredAuthError.prototype);\r\n this.timestamp = timestamp || Constants.EMPTY_STRING;\r\n this.traceId = traceId || Constants.EMPTY_STRING;\r\n this.correlationId = correlationId || Constants.EMPTY_STRING;\r\n this.claims = claims || Constants.EMPTY_STRING;\r\n this.name = "InteractionRequiredAuthError";\r\n this.errorNo = errorNo;\r\n }\r\n}\r\n/**\r\n * Helper function used to determine if an error thrown by the server requires interaction to resolve\r\n * @param errorCode\r\n * @param errorString\r\n * @param subError\r\n */\r\nfunction isInteractionRequiredError(errorCode, errorString, subError) {\r\n const isInteractionRequiredErrorCode = !!errorCode &&\r\n InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;\r\n const isInteractionRequiredSubError = !!subError &&\r\n InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;\r\n const isInteractionRequiredErrorDesc = !!errorString &&\r\n InteractionRequiredServerErrorMessage.some((irErrorCode) => {\r\n return errorString.indexOf(irErrorCode) > -1;\r\n });\r\n return (isInteractionRequiredErrorCode ||\r\n isInteractionRequiredErrorDesc ||\r\n isInteractionRequiredSubError);\r\n}\r\n/**\r\n * Creates an InteractionRequiredAuthError\r\n */\r\nfunction createInteractionRequiredAuthError(errorCode) {\r\n return new InteractionRequiredAuthError(errorCode, InteractionRequiredAuthErrorMessages[errorCode]);\r\n}\n\n\n//# sourceMappingURL=InteractionRequiredAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/ProtocolUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Class which provides helpers for OAuth 2.0 protocol specific values\r\n */\r\nclass ProtocolUtils {\r\n /**\r\n * Appends user state with random guid, or returns random guid.\r\n * @param userState\r\n * @param randomGuid\r\n */\r\n static setRequestState(cryptoObj, userState, meta) {\r\n const libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);\r\n return userState\r\n ? `${libraryState}${Constants.RESOURCE_DELIM}${userState}`\r\n : libraryState;\r\n }\r\n /**\r\n * Generates the state value used by the common library.\r\n * @param randomGuid\r\n * @param cryptoObj\r\n */\r\n static generateLibraryState(cryptoObj, meta) {\r\n if (!cryptoObj) {\r\n throw createClientAuthError(noCryptoObject);\r\n }\r\n // Create a state object containing a unique id and the timestamp of the request creation\r\n const stateObj = {\r\n id: cryptoObj.createNewGuid(),\r\n };\r\n if (meta) {\r\n stateObj.meta = meta;\r\n }\r\n const stateString = JSON.stringify(stateObj);\r\n return cryptoObj.base64Encode(stateString);\r\n }\r\n /**\r\n * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.\r\n * @param state\r\n * @param cryptoObj\r\n */\r\n static parseRequestState(cryptoObj, state) {\r\n if (!cryptoObj) {\r\n throw createClientAuthError(noCryptoObject);\r\n }\r\n if (!state) {\r\n throw createClientAuthError(invalidState);\r\n }\r\n try {\r\n // Split the state between library state and user passed state and decode them separately\r\n const splitState = state.split(Constants.RESOURCE_DELIM);\r\n const libraryState = splitState[0];\r\n const userState = splitState.length > 1\r\n ? splitState.slice(1).join(Constants.RESOURCE_DELIM)\r\n : Constants.EMPTY_STRING;\r\n const libraryStateString = cryptoObj.base64Decode(libraryState);\r\n const libraryStateObj = JSON.parse(libraryStateString);\r\n return {\r\n userRequestState: userState || Constants.EMPTY_STRING,\r\n libraryState: libraryStateObj,\r\n };\r\n }\r\n catch (e) {\r\n throw createClientAuthError(invalidState);\r\n }\r\n }\r\n}\n\n\n//# sourceMappingURL=ProtocolUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/account/CcsCredential.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst CcsCredentialType = {\r\n HOME_ACCOUNT_ID: "home_account_id",\r\n UPN: "UPN",\r\n};\n\n\n//# sourceMappingURL=CcsCredential.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/LocalStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass LocalStorage {\r\n constructor() {\r\n if (!window.localStorage) {\r\n throw createBrowserConfigurationAuthError(storageNotSupported);\r\n }\r\n }\r\n getItem(key) {\r\n return window.localStorage.getItem(key);\r\n }\r\n setItem(key, value) {\r\n window.localStorage.setItem(key, value);\r\n }\r\n removeItem(key) {\r\n window.localStorage.removeItem(key);\r\n }\r\n getKeys() {\r\n return Object.keys(window.localStorage);\r\n }\r\n containsKey(key) {\r\n return window.localStorage.hasOwnProperty(key);\r\n }\r\n}\n\n\n//# sourceMappingURL=LocalStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/SessionStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SessionStorage {\r\n constructor() {\r\n if (!window.sessionStorage) {\r\n throw createBrowserConfigurationAuthError(storageNotSupported);\r\n }\r\n }\r\n getItem(key) {\r\n return window.sessionStorage.getItem(key);\r\n }\r\n setItem(key, value) {\r\n window.sessionStorage.setItem(key, value);\r\n }\r\n removeItem(key) {\r\n window.sessionStorage.removeItem(key);\r\n }\r\n getKeys() {\r\n return Object.keys(window.sessionStorage);\r\n }\r\n containsKey(key) {\r\n return window.sessionStorage.hasOwnProperty(key);\r\n }\r\n}\n\n\n//# sourceMappingURL=SessionStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/utils/BrowserProtocolUtils.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Extracts the BrowserStateObject from the state string.\r\n * @param browserCrypto\r\n * @param state\r\n */\r\nfunction extractBrowserRequestState(browserCrypto, state) {\r\n if (!state) {\r\n return null;\r\n }\r\n try {\r\n const requestStateObj = ProtocolUtils.parseRequestState(browserCrypto, state);\r\n return requestStateObj.libraryState.meta;\r\n }\r\n catch (e) {\r\n throw createClientAuthError(invalidState);\r\n }\r\n}\n\n\n//# sourceMappingURL=BrowserProtocolUtils.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/CookieStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n// Cookie life calculation (hours * minutes * seconds * ms)\r\nconst COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;\r\nclass CookieStorage {\r\n getItem(key) {\r\n const name = `${encodeURIComponent(key)}`;\r\n const cookieList = document.cookie.split(";");\r\n for (let i = 0; i < cookieList.length; i++) {\r\n const cookie = cookieList[i];\r\n const [key, ...rest] = decodeURIComponent(cookie).trim().split("=");\r\n const value = rest.join("=");\r\n if (key === name) {\r\n return value;\r\n }\r\n }\r\n return "";\r\n }\r\n setItem(key, value, cookieLifeDays, secure = true) {\r\n let cookieStr = `${encodeURIComponent(key)}=${encodeURIComponent(value)};path=/;SameSite=Lax;`;\r\n if (cookieLifeDays) {\r\n const expireTime = getCookieExpirationTime(cookieLifeDays);\r\n cookieStr += `expires=${expireTime};`;\r\n }\r\n if (secure) {\r\n cookieStr += "Secure;";\r\n }\r\n document.cookie = cookieStr;\r\n }\r\n removeItem(key) {\r\n // Setting expiration to -1 removes it\r\n this.setItem(key, "", -1);\r\n }\r\n getKeys() {\r\n const cookieList = document.cookie.split(";");\r\n const keys = [];\r\n cookieList.forEach((cookie) => {\r\n const cookieParts = decodeURIComponent(cookie).trim().split("=");\r\n keys.push(cookieParts[0]);\r\n });\r\n return keys;\r\n }\r\n containsKey(key) {\r\n return this.getKeys().includes(key);\r\n }\r\n}\r\n/**\r\n * Get cookie expiration time\r\n * @param cookieLifeDays\r\n */\r\nfunction getCookieExpirationTime(cookieLifeDays) {\r\n const today = new Date();\r\n const expr = new Date(today.getTime() + cookieLifeDays * COOKIE_LIFE_MULTIPLIER);\r\n return expr.toUTCString();\r\n}\n\n\n//# sourceMappingURL=CookieStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/BrowserCacheManager.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class implements the cache storage interface for MSAL through browser local or session storage.\r\n * Cookies are only used if storeAuthStateInCookie is true, and are only used for\r\n * parameters such as state and nonce, generally.\r\n */\r\nclass BrowserCacheManager extends CacheManager {\r\n constructor(clientId, cacheConfig, cryptoImpl, logger, staticAuthorityOptions, performanceClient) {\r\n super(clientId, cryptoImpl, logger, staticAuthorityOptions);\r\n this.cacheConfig = cacheConfig;\r\n this.logger = logger;\r\n this.internalStorage = new MemoryStorage();\r\n this.browserStorage = this.setupBrowserStorage(this.cacheConfig.cacheLocation);\r\n this.temporaryCacheStorage = this.setupBrowserStorage(this.cacheConfig.temporaryCacheLocation);\r\n this.cookieStorage = new CookieStorage();\r\n // Migrate cache entries from older versions of MSAL.\r\n if (cacheConfig.cacheMigrationEnabled) {\r\n this.migrateCacheEntries();\r\n this.createKeyMaps();\r\n }\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.\r\n * @param cacheLocation\r\n */\r\n setupBrowserStorage(cacheLocation) {\r\n try {\r\n switch (cacheLocation) {\r\n case BrowserCacheLocation.LocalStorage:\r\n return new LocalStorage();\r\n case BrowserCacheLocation.SessionStorage:\r\n return new SessionStorage();\r\n case BrowserCacheLocation.MemoryStorage:\r\n default:\r\n break;\r\n }\r\n }\r\n catch (e) {\r\n this.logger.error(e);\r\n }\r\n this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;\r\n return new MemoryStorage();\r\n }\r\n /**\r\n * Migrate all old cache entries to new schema. No rollback supported.\r\n * @param storeAuthStateInCookie\r\n */\r\n migrateCacheEntries() {\r\n const idTokenKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ID_TOKEN}`;\r\n const clientInfoKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.CLIENT_INFO}`;\r\n const errorKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR}`;\r\n const errorDescKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR_DESC}`;\r\n const idTokenValue = this.browserStorage.getItem(idTokenKey);\r\n const clientInfoValue = this.browserStorage.getItem(clientInfoKey);\r\n const errorValue = this.browserStorage.getItem(errorKey);\r\n const errorDescValue = this.browserStorage.getItem(errorDescKey);\r\n const values = [\r\n idTokenValue,\r\n clientInfoValue,\r\n errorValue,\r\n errorDescValue,\r\n ];\r\n const keysToMigrate = [\r\n PersistentCacheKeys.ID_TOKEN,\r\n PersistentCacheKeys.CLIENT_INFO,\r\n PersistentCacheKeys.ERROR,\r\n PersistentCacheKeys.ERROR_DESC,\r\n ];\r\n keysToMigrate.forEach((cacheKey, index) => {\r\n const value = values[index];\r\n if (value) {\r\n this.setTemporaryCache(cacheKey, value, true);\r\n }\r\n });\r\n }\r\n /**\r\n * Searches all cache entries for MSAL accounts and creates the account key map\r\n * This is used to migrate users from older versions of MSAL which did not create the map.\r\n * @returns\r\n */\r\n createKeyMaps() {\r\n this.logger.trace("BrowserCacheManager - createKeyMaps called.");\r\n const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n const tokenKeys = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n if (accountKeys && tokenKeys) {\r\n this.logger.verbose("BrowserCacheManager:createKeyMaps - account and token key maps already exist, skipping migration.");\r\n // Key maps already exist, no need to iterate through cache\r\n return;\r\n }\r\n const allKeys = this.browserStorage.getKeys();\r\n allKeys.forEach((key) => {\r\n if (this.isCredentialKey(key)) {\r\n // Get item, parse, validate and write key to map\r\n const value = this.getItem(key);\r\n if (value) {\r\n const credObj = this.validateAndParseJson(value);\r\n if (credObj && credObj.hasOwnProperty("credentialType")) {\r\n switch (credObj["credentialType"]) {\r\n case CredentialType.ID_TOKEN:\r\n if (isIdTokenEntity(credObj)) {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - idToken found, saving key to token key map");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - idToken with key: ${key} found, saving key to token key map`);\r\n const idTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, idTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.ID_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - key found matching idToken schema with value containing idToken credentialType field but value failed IdTokenEntity validation, skipping.");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed idToken validation on key: ${key}`);\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:\r\n if (isAccessTokenEntity(credObj)) {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - accessToken found, saving key to token key map");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - accessToken with key: ${key} found, saving key to token key map`);\r\n const accessTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, accessTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.ACCESS_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - key found matching accessToken schema with value containing accessToken credentialType field but value failed AccessTokenEntity validation, skipping.");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed accessToken validation on key: ${key}`);\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n if (isRefreshTokenEntity(credObj)) {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - refreshToken found, saving key to token key map");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - refreshToken with key: ${key} found, saving key to token key map`);\r\n const refreshTokenEntity = credObj;\r\n const newKey = this.updateCredentialCacheKey(key, refreshTokenEntity);\r\n this.addTokenKey(newKey, CredentialType.REFRESH_TOKEN);\r\n return;\r\n }\r\n else {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - key found matching refreshToken schema with value containing refreshToken credentialType field but value failed RefreshTokenEntity validation, skipping.");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed refreshToken validation on key: ${key}`);\r\n }\r\n break;\r\n // If credentialType isn\'t one of our predefined ones, it may not be an MSAL cache value. Ignore.\r\n }\r\n }\r\n }\r\n }\r\n if (this.isAccountKey(key)) {\r\n const value = this.getItem(key);\r\n if (value) {\r\n const accountObj = this.validateAndParseJson(value);\r\n if (accountObj &&\r\n AccountEntity.isAccountEntity(accountObj)) {\r\n this.logger.trace("BrowserCacheManager:createKeyMaps - account found, saving key to account key map");\r\n this.logger.tracePii(`BrowserCacheManager:createKeyMaps - account with key: ${key} found, saving key to account key map`);\r\n this.addAccountKeyToMap(key);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Parses passed value as JSON object, JSON.parse() will throw an error.\r\n * @param input\r\n */\r\n validateAndParseJson(jsonValue) {\r\n try {\r\n const parsedJson = JSON.parse(jsonValue);\r\n /**\r\n * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object\r\n * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check\r\n * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.\r\n *\r\n */\r\n return parsedJson && typeof parsedJson === "object"\r\n ? parsedJson\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n }\r\n /**\r\n * fetches the entry from the browser storage based off the key\r\n * @param key\r\n */\r\n getItem(key) {\r\n return this.browserStorage.getItem(key);\r\n }\r\n /**\r\n * sets the entry in the browser storage\r\n * @param key\r\n * @param value\r\n */\r\n setItem(key, value) {\r\n this.browserStorage.setItem(key, value);\r\n }\r\n /**\r\n * fetch the account entity from the platform cache\r\n * @param accountKey\r\n */\r\n getAccount(accountKey, logger) {\r\n this.logger.trace("BrowserCacheManager.getAccount called");\r\n const accountEntity = this.getCachedAccountEntity(accountKey);\r\n return this.updateOutdatedCachedAccount(accountKey, accountEntity, logger);\r\n }\r\n /**\r\n * Reads account from cache, deserializes it into an account entity and returns it.\r\n * If account is not found from the key, returns null and removes key from map.\r\n * @param accountKey\r\n * @returns\r\n */\r\n getCachedAccountEntity(accountKey) {\r\n const serializedAccount = this.getItem(accountKey);\r\n if (!serializedAccount) {\r\n this.removeAccountKeyFromMap(accountKey);\r\n return null;\r\n }\r\n const parsedAccount = this.validateAndParseJson(serializedAccount);\r\n if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {\r\n this.removeAccountKeyFromMap(accountKey);\r\n return null;\r\n }\r\n return CacheManager.toObject(new AccountEntity(), parsedAccount);\r\n }\r\n /**\r\n * set account entity in the platform cache\r\n * @param account\r\n */\r\n setAccount(account) {\r\n this.logger.trace("BrowserCacheManager.setAccount called");\r\n const key = account.generateAccountKey();\r\n this.setItem(key, JSON.stringify(account));\r\n this.addAccountKeyToMap(key);\r\n }\r\n /**\r\n * Returns the array of account keys currently cached\r\n * @returns\r\n */\r\n getAccountKeys() {\r\n this.logger.trace("BrowserCacheManager.getAccountKeys called");\r\n const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n if (accountKeys) {\r\n return JSON.parse(accountKeys);\r\n }\r\n this.logger.verbose("BrowserCacheManager.getAccountKeys - No account keys found");\r\n return [];\r\n }\r\n /**\r\n * Add a new account to the key map\r\n * @param key\r\n */\r\n addAccountKeyToMap(key) {\r\n this.logger.trace("BrowserCacheManager.addAccountKeyToMap called");\r\n this.logger.tracePii(`BrowserCacheManager.addAccountKeyToMap called with key: ${key}`);\r\n const accountKeys = this.getAccountKeys();\r\n if (accountKeys.indexOf(key) === -1) {\r\n // Only add key if it does not already exist in the map\r\n accountKeys.push(key);\r\n this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n this.logger.verbose("BrowserCacheManager.addAccountKeyToMap account key added");\r\n }\r\n else {\r\n this.logger.verbose("BrowserCacheManager.addAccountKeyToMap account key already exists in map");\r\n }\r\n }\r\n /**\r\n * Remove an account from the key map\r\n * @param key\r\n */\r\n removeAccountKeyFromMap(key) {\r\n this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap called");\r\n this.logger.tracePii(`BrowserCacheManager.removeAccountKeyFromMap called with key: ${key}`);\r\n const accountKeys = this.getAccountKeys();\r\n const removalIndex = accountKeys.indexOf(key);\r\n if (removalIndex > -1) {\r\n accountKeys.splice(removalIndex, 1);\r\n this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap account key removed");\r\n }\r\n else {\r\n this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap key not found in existing map");\r\n }\r\n }\r\n /**\r\n * Extends inherited removeAccount function to include removal of the account key from the map\r\n * @param key\r\n */\r\n async removeAccount(key) {\r\n void super.removeAccount(key);\r\n this.removeAccountKeyFromMap(key);\r\n }\r\n /**\r\n * Remove account entity from the platform cache if it\'s outdated\r\n * @param accountKey\r\n */\r\n removeOutdatedAccount(accountKey) {\r\n this.removeItem(accountKey);\r\n this.removeAccountKeyFromMap(accountKey);\r\n }\r\n /**\r\n * Removes given idToken from the cache and from the key map\r\n * @param key\r\n */\r\n removeIdToken(key) {\r\n super.removeIdToken(key);\r\n this.removeTokenKey(key, CredentialType.ID_TOKEN);\r\n }\r\n /**\r\n * Removes given accessToken from the cache and from the key map\r\n * @param key\r\n */\r\n async removeAccessToken(key) {\r\n void super.removeAccessToken(key);\r\n this.removeTokenKey(key, CredentialType.ACCESS_TOKEN);\r\n }\r\n /**\r\n * Removes given refreshToken from the cache and from the key map\r\n * @param key\r\n */\r\n removeRefreshToken(key) {\r\n super.removeRefreshToken(key);\r\n this.removeTokenKey(key, CredentialType.REFRESH_TOKEN);\r\n }\r\n /**\r\n * Gets the keys for the cached tokens associated with this clientId\r\n * @returns\r\n */\r\n getTokenKeys() {\r\n this.logger.trace("BrowserCacheManager.getTokenKeys called");\r\n const item = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n if (item) {\r\n const tokenKeys = this.validateAndParseJson(item);\r\n if (tokenKeys &&\r\n tokenKeys.hasOwnProperty("idToken") &&\r\n tokenKeys.hasOwnProperty("accessToken") &&\r\n tokenKeys.hasOwnProperty("refreshToken")) {\r\n return tokenKeys;\r\n }\r\n else {\r\n this.logger.error("BrowserCacheManager.getTokenKeys - Token keys found but in an unknown format. Returning empty key map.");\r\n }\r\n }\r\n else {\r\n this.logger.verbose("BrowserCacheManager.getTokenKeys - No token keys found");\r\n }\r\n return {\r\n idToken: [],\r\n accessToken: [],\r\n refreshToken: [],\r\n };\r\n }\r\n /**\r\n * Adds the given key to the token key map\r\n * @param key\r\n * @param type\r\n */\r\n addTokenKey(key, type) {\r\n this.logger.trace("BrowserCacheManager addTokenKey called");\r\n const tokenKeys = this.getTokenKeys();\r\n switch (type) {\r\n case CredentialType.ID_TOKEN:\r\n if (tokenKeys.idToken.indexOf(key) === -1) {\r\n this.logger.info("BrowserCacheManager: addTokenKey - idToken added to map");\r\n tokenKeys.idToken.push(key);\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n if (tokenKeys.accessToken.indexOf(key) === -1) {\r\n this.logger.info("BrowserCacheManager: addTokenKey - accessToken added to map");\r\n tokenKeys.accessToken.push(key);\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n if (tokenKeys.refreshToken.indexOf(key) === -1) {\r\n this.logger.info("BrowserCacheManager: addTokenKey - refreshToken added to map");\r\n tokenKeys.refreshToken.push(key);\r\n }\r\n break;\r\n default:\r\n this.logger.error(`BrowserCacheManager:addTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n throw createClientAuthError(unexpectedCredentialType);\r\n }\r\n this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n }\r\n /**\r\n * Removes the given key from the token key map\r\n * @param key\r\n * @param type\r\n */\r\n removeTokenKey(key, type) {\r\n this.logger.trace("BrowserCacheManager removeTokenKey called");\r\n const tokenKeys = this.getTokenKeys();\r\n switch (type) {\r\n case CredentialType.ID_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove idToken with key: ${key} from map`);\r\n const idRemoval = tokenKeys.idToken.indexOf(key);\r\n if (idRemoval > -1) {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - idToken removed from map");\r\n tokenKeys.idToken.splice(idRemoval, 1);\r\n }\r\n else {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - idToken does not exist in map. Either it was previously removed or it was never added.");\r\n }\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove accessToken with key: ${key} from map`);\r\n const accessRemoval = tokenKeys.accessToken.indexOf(key);\r\n if (accessRemoval > -1) {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - accessToken removed from map");\r\n tokenKeys.accessToken.splice(accessRemoval, 1);\r\n }\r\n else {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - accessToken does not exist in map. Either it was previously removed or it was never added.");\r\n }\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove refreshToken with key: ${key} from map`);\r\n const refreshRemoval = tokenKeys.refreshToken.indexOf(key);\r\n if (refreshRemoval > -1) {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - refreshToken removed from map");\r\n tokenKeys.refreshToken.splice(refreshRemoval, 1);\r\n }\r\n else {\r\n this.logger.info("BrowserCacheManager: removeTokenKey - refreshToken does not exist in map. Either it was previously removed or it was never added.");\r\n }\r\n break;\r\n default:\r\n this.logger.error(`BrowserCacheManager:removeTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n throw createClientAuthError(unexpectedCredentialType);\r\n }\r\n this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n }\r\n /**\r\n * generates idToken entity from a string\r\n * @param idTokenKey\r\n */\r\n getIdTokenCredential(idTokenKey) {\r\n const value = this.getItem(idTokenKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");\r\n this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n return null;\r\n }\r\n const parsedIdToken = this.validateAndParseJson(value);\r\n if (!parsedIdToken || !isIdTokenEntity(parsedIdToken)) {\r\n this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");\r\n this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit");\r\n return parsedIdToken;\r\n }\r\n /**\r\n * set IdToken credential to the platform cache\r\n * @param idToken\r\n */\r\n setIdTokenCredential(idToken) {\r\n this.logger.trace("BrowserCacheManager.setIdTokenCredential called");\r\n const idTokenKey = generateCredentialKey(idToken);\r\n this.setItem(idTokenKey, JSON.stringify(idToken));\r\n this.addTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n }\r\n /**\r\n * generates accessToken entity from a string\r\n * @param key\r\n */\r\n getAccessTokenCredential(accessTokenKey) {\r\n const value = this.getItem(accessTokenKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");\r\n this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n return null;\r\n }\r\n const parsedAccessToken = this.validateAndParseJson(value);\r\n if (!parsedAccessToken ||\r\n !isAccessTokenEntity(parsedAccessToken)) {\r\n this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");\r\n this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit");\r\n return parsedAccessToken;\r\n }\r\n /**\r\n * set accessToken credential to the platform cache\r\n * @param accessToken\r\n */\r\n setAccessTokenCredential(accessToken) {\r\n this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");\r\n const accessTokenKey = generateCredentialKey(accessToken);\r\n this.setItem(accessTokenKey, JSON.stringify(accessToken));\r\n this.addTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n }\r\n /**\r\n * generates refreshToken entity from a string\r\n * @param refreshTokenKey\r\n */\r\n getRefreshTokenCredential(refreshTokenKey) {\r\n const value = this.getItem(refreshTokenKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");\r\n this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n return null;\r\n }\r\n const parsedRefreshToken = this.validateAndParseJson(value);\r\n if (!parsedRefreshToken ||\r\n !isRefreshTokenEntity(parsedRefreshToken)) {\r\n this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");\r\n this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit");\r\n return parsedRefreshToken;\r\n }\r\n /**\r\n * set refreshToken credential to the platform cache\r\n * @param refreshToken\r\n */\r\n setRefreshTokenCredential(refreshToken) {\r\n this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");\r\n const refreshTokenKey = generateCredentialKey(refreshToken);\r\n this.setItem(refreshTokenKey, JSON.stringify(refreshToken));\r\n this.addTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n }\r\n /**\r\n * fetch appMetadata entity from the platform cache\r\n * @param appMetadataKey\r\n */\r\n getAppMetadata(appMetadataKey) {\r\n const value = this.getItem(appMetadataKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");\r\n return null;\r\n }\r\n const parsedMetadata = this.validateAndParseJson(value);\r\n if (!parsedMetadata ||\r\n !isAppMetadataEntity(appMetadataKey, parsedMetadata)) {\r\n this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit");\r\n return parsedMetadata;\r\n }\r\n /**\r\n * set appMetadata entity to the platform cache\r\n * @param appMetadata\r\n */\r\n setAppMetadata(appMetadata) {\r\n this.logger.trace("BrowserCacheManager.setAppMetadata called");\r\n const appMetadataKey = generateAppMetadataKey(appMetadata);\r\n this.setItem(appMetadataKey, JSON.stringify(appMetadata));\r\n }\r\n /**\r\n * fetch server telemetry entity from the platform cache\r\n * @param serverTelemetryKey\r\n */\r\n getServerTelemetry(serverTelemetryKey) {\r\n const value = this.getItem(serverTelemetryKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");\r\n return null;\r\n }\r\n const parsedEntity = this.validateAndParseJson(value);\r\n if (!parsedEntity ||\r\n !isServerTelemetryEntity(serverTelemetryKey, parsedEntity)) {\r\n this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit");\r\n return parsedEntity;\r\n }\r\n /**\r\n * set server telemetry entity to the platform cache\r\n * @param serverTelemetryKey\r\n * @param serverTelemetry\r\n */\r\n setServerTelemetry(serverTelemetryKey, serverTelemetry) {\r\n this.logger.trace("BrowserCacheManager.setServerTelemetry called");\r\n this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));\r\n }\r\n /**\r\n *\r\n */\r\n getAuthorityMetadata(key) {\r\n const value = this.internalStorage.getItem(key);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit");\r\n return null;\r\n }\r\n const parsedMetadata = this.validateAndParseJson(value);\r\n if (parsedMetadata &&\r\n isAuthorityMetadataEntity(key, parsedMetadata)) {\r\n this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit");\r\n return parsedMetadata;\r\n }\r\n return null;\r\n }\r\n /**\r\n *\r\n */\r\n getAuthorityMetadataKeys() {\r\n const allKeys = this.internalStorage.getKeys();\r\n return allKeys.filter((key) => {\r\n return this.isAuthorityMetadata(key);\r\n });\r\n }\r\n /**\r\n * Sets wrapper metadata in memory\r\n * @param wrapperSKU\r\n * @param wrapperVersion\r\n */\r\n setWrapperMetadata(wrapperSKU, wrapperVersion) {\r\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);\r\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);\r\n }\r\n /**\r\n * Returns wrapper metadata from in-memory storage\r\n */\r\n getWrapperMetadata() {\r\n const sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) ||\r\n Constants.EMPTY_STRING;\r\n const version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) ||\r\n Constants.EMPTY_STRING;\r\n return [sku, version];\r\n }\r\n /**\r\n *\r\n * @param entity\r\n */\r\n setAuthorityMetadata(key, entity) {\r\n this.logger.trace("BrowserCacheManager.setAuthorityMetadata called");\r\n this.internalStorage.setItem(key, JSON.stringify(entity));\r\n }\r\n /**\r\n * Gets the active account\r\n */\r\n getActiveAccount() {\r\n const activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n const activeAccountValueFilters = this.getItem(activeAccountKeyFilters);\r\n if (!activeAccountValueFilters) {\r\n // if new active account cache type isn\'t found, it\'s an old version, so look for that instead\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: No active account filters cache schema found, looking for legacy schema");\r\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n const activeAccountValueLocal = this.getItem(activeAccountKeyLocal);\r\n if (!activeAccountValueLocal) {\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: No active account found");\r\n return null;\r\n }\r\n const activeAccount = this.getAccountInfoFilteredBy({\r\n localAccountId: activeAccountValueLocal,\r\n });\r\n if (activeAccount) {\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: Legacy active account cache schema found");\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: Adding active account filters cache schema");\r\n this.setActiveAccount(activeAccount);\r\n return activeAccount;\r\n }\r\n return null;\r\n }\r\n const activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);\r\n if (activeAccountValueObj) {\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: Active account filters schema found");\r\n return this.getAccountInfoFilteredBy({\r\n homeAccountId: activeAccountValueObj.homeAccountId,\r\n localAccountId: activeAccountValueObj.localAccountId,\r\n tenantId: activeAccountValueObj.tenantId,\r\n });\r\n }\r\n this.logger.trace("BrowserCacheManager.getActiveAccount: No active account found");\r\n return null;\r\n }\r\n /**\r\n * Sets the active account\'s localAccountId in cache\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n const activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n if (account) {\r\n this.logger.verbose("setActiveAccount: Active account set");\r\n const activeAccountValue = {\r\n homeAccountId: account.homeAccountId,\r\n localAccountId: account.localAccountId,\r\n tenantId: account.tenantId,\r\n };\r\n this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));\r\n this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);\r\n }\r\n else {\r\n this.logger.verbose("setActiveAccount: No account passed, active account not set");\r\n this.browserStorage.removeItem(activeAccountKey);\r\n this.browserStorage.removeItem(activeAccountKeyLocal);\r\n }\r\n }\r\n /**\r\n * fetch throttling entity from the platform cache\r\n * @param throttlingCacheKey\r\n */\r\n getThrottlingCache(throttlingCacheKey) {\r\n const value = this.getItem(throttlingCacheKey);\r\n if (!value) {\r\n this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");\r\n return null;\r\n }\r\n const parsedThrottlingCache = this.validateAndParseJson(value);\r\n if (!parsedThrottlingCache ||\r\n !isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {\r\n this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit");\r\n return parsedThrottlingCache;\r\n }\r\n /**\r\n * set throttling entity to the platform cache\r\n * @param throttlingCacheKey\r\n * @param throttlingCache\r\n */\r\n setThrottlingCache(throttlingCacheKey, throttlingCache) {\r\n this.logger.trace("BrowserCacheManager.setThrottlingCache called");\r\n this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));\r\n }\r\n /**\r\n * Gets cache item with given key.\r\n * Will retrieve from cookies if storeAuthStateInCookie is set to true.\r\n * @param key\r\n */\r\n getTemporaryCache(cacheKey, generateKey) {\r\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n const itemCookie = this.cookieStorage.getItem(key);\r\n if (itemCookie) {\r\n this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies");\r\n return itemCookie;\r\n }\r\n }\r\n const value = this.temporaryCacheStorage.getItem(key);\r\n if (!value) {\r\n // If temp cache item not found in session/memory, check local storage for items set by old versions\r\n if (this.cacheConfig.cacheLocation ===\r\n BrowserCacheLocation.LocalStorage) {\r\n const item = this.browserStorage.getItem(key);\r\n if (item) {\r\n this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage");\r\n return item;\r\n }\r\n }\r\n this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage");\r\n return null;\r\n }\r\n this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned");\r\n return value;\r\n }\r\n /**\r\n * Sets the cache item with the key and value given.\r\n * Stores in cookie if storeAuthStateInCookie is set to true.\r\n * This can cause cookie overflow if used incorrectly.\r\n * @param key\r\n * @param value\r\n */\r\n setTemporaryCache(cacheKey, value, generateKey) {\r\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n this.temporaryCacheStorage.setItem(key, value);\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie");\r\n this.cookieStorage.setItem(key, value, undefined, this.cacheConfig.secureCookies);\r\n }\r\n }\r\n /**\r\n * Removes the cache item with the given key.\r\n * @param key\r\n */\r\n removeItem(key) {\r\n this.browserStorage.removeItem(key);\r\n }\r\n /**\r\n * Removes the temporary cache item with the given key.\r\n * Will also clear the cookie item if storeAuthStateInCookie is set to true.\r\n * @param key\r\n */\r\n removeTemporaryItem(key) {\r\n this.temporaryCacheStorage.removeItem(key);\r\n if (this.cacheConfig.storeAuthStateInCookie) {\r\n this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie");\r\n this.cookieStorage.removeItem(key);\r\n }\r\n }\r\n /**\r\n * Gets all keys in window.\r\n */\r\n getKeys() {\r\n return this.browserStorage.getKeys();\r\n }\r\n /**\r\n * Clears all cache entries created by MSAL.\r\n */\r\n async clear() {\r\n // Removes all accounts and their credentials\r\n await this.removeAllAccounts();\r\n this.removeAppMetadata();\r\n // Remove temp storage first to make sure any cookies are cleared\r\n this.temporaryCacheStorage.getKeys().forEach((cacheKey) => {\r\n if (cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1 ||\r\n cacheKey.indexOf(this.clientId) !== -1) {\r\n this.removeTemporaryItem(cacheKey);\r\n }\r\n });\r\n // Removes all remaining MSAL cache items\r\n this.browserStorage.getKeys().forEach((cacheKey) => {\r\n if (cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1 ||\r\n cacheKey.indexOf(this.clientId) !== -1) {\r\n this.browserStorage.removeItem(cacheKey);\r\n }\r\n });\r\n this.internalStorage.clear();\r\n }\r\n /**\r\n * Clears all access tokes that have claims prior to saving the current one\r\n * @param performanceClient {IPerformanceClient}\r\n * @param correlationId {string} correlation id\r\n * @returns\r\n */\r\n async clearTokensAndKeysWithClaims(performanceClient, correlationId) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.ClearTokensAndKeysWithClaims, correlationId);\r\n const tokenKeys = this.getTokenKeys();\r\n const removedAccessTokens = [];\r\n tokenKeys.accessToken.forEach((key) => {\r\n // if the access token has claims in its key, remove the token key and the token\r\n const credential = this.getAccessTokenCredential(key);\r\n if (credential?.requestedClaimsHash &&\r\n key.includes(credential.requestedClaimsHash.toLowerCase())) {\r\n removedAccessTokens.push(this.removeAccessToken(key));\r\n }\r\n });\r\n await Promise.all(removedAccessTokens);\r\n // warn if any access tokens are removed\r\n if (removedAccessTokens.length > 0) {\r\n this.logger.warning(`${removedAccessTokens.length} access tokens with claims in the cache keys have been removed from the cache.`);\r\n }\r\n }\r\n /**\r\n * Prepend msal. to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)\r\n * @param key\r\n * @param addInstanceId\r\n */\r\n generateCacheKey(key) {\r\n const generatedKey = this.validateAndParseJson(key);\r\n if (!generatedKey) {\r\n if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) ||\r\n StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {\r\n return key;\r\n }\r\n return `${Constants.CACHE_PREFIX}.${this.clientId}.${key}`;\r\n }\r\n return JSON.stringify(key);\r\n }\r\n /**\r\n * Create authorityKey to cache authority\r\n * @param state\r\n */\r\n generateAuthorityKey(stateString) {\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.AUTHORITY}.${stateId}`);\r\n }\r\n /**\r\n * Create Nonce key to cache nonce\r\n * @param state\r\n */\r\n generateNonceKey(stateString) {\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.NONCE_IDTOKEN}.${stateId}`);\r\n }\r\n /**\r\n * Creates full cache key for the request state\r\n * @param stateString State string for the request\r\n */\r\n generateStateKey(stateString) {\r\n // Use the library state id to key temp storage for uniqueness for multiple concurrent requests\r\n const { libraryState: { id: stateId }, } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n return this.generateCacheKey(`${TemporaryCacheKeys.REQUEST_STATE}.${stateId}`);\r\n }\r\n /**\r\n * Gets the cached authority based on the cached state. Returns empty if no cached state found.\r\n */\r\n getCachedAuthority(cachedState) {\r\n const stateCacheKey = this.generateStateKey(cachedState);\r\n const state = this.getTemporaryCache(stateCacheKey);\r\n if (!state) {\r\n return null;\r\n }\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n return this.getTemporaryCache(authorityCacheKey);\r\n }\r\n /**\r\n * Updates account, authority, and state in cache\r\n * @param serverAuthenticationRequest\r\n * @param account\r\n */\r\n updateCacheEntries(state, nonce, authorityInstance, loginHint, account) {\r\n this.logger.trace("BrowserCacheManager.updateCacheEntries called");\r\n // Cache the request state\r\n const stateCacheKey = this.generateStateKey(state);\r\n this.setTemporaryCache(stateCacheKey, state, false);\r\n // Cache the nonce\r\n const nonceCacheKey = this.generateNonceKey(state);\r\n this.setTemporaryCache(nonceCacheKey, nonce, false);\r\n // Cache authorityKey\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n this.setTemporaryCache(authorityCacheKey, authorityInstance, false);\r\n if (account) {\r\n const ccsCredential = {\r\n credential: account.homeAccountId,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n };\r\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n }\r\n else if (loginHint) {\r\n const ccsCredential = {\r\n credential: loginHint,\r\n type: CcsCredentialType.UPN,\r\n };\r\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n }\r\n }\r\n /**\r\n * Reset all temporary cache items\r\n * @param state\r\n */\r\n resetRequestCache(state) {\r\n this.logger.trace("BrowserCacheManager.resetRequestCache called");\r\n // check state and remove associated cache items\r\n if (state) {\r\n this.temporaryCacheStorage.getKeys().forEach((key) => {\r\n if (key.indexOf(state) !== -1) {\r\n this.removeTemporaryItem(key);\r\n }\r\n });\r\n // delete generic interactive request parameters\r\n this.removeTemporaryItem(this.generateStateKey(state));\r\n this.removeTemporaryItem(this.generateNonceKey(state));\r\n this.removeTemporaryItem(this.generateAuthorityKey(state));\r\n }\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\r\n this.setInteractionInProgress(false);\r\n }\r\n /**\r\n * Removes temporary cache for the provided state\r\n * @param stateString\r\n */\r\n cleanRequestByState(stateString) {\r\n this.logger.trace("BrowserCacheManager.cleanRequestByState called");\r\n // Interaction is completed - remove interaction status.\r\n if (stateString) {\r\n const stateKey = this.generateStateKey(stateString);\r\n const cachedState = this.temporaryCacheStorage.getItem(stateKey);\r\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: ${cachedState}`);\r\n this.resetRequestCache(cachedState || Constants.EMPTY_STRING);\r\n }\r\n }\r\n /**\r\n * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state\r\n * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.\r\n * @param interactionType\r\n */\r\n cleanRequestByInteractionType(interactionType) {\r\n this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called");\r\n // Loop through all keys to find state key\r\n this.temporaryCacheStorage.getKeys().forEach((key) => {\r\n // If this key is not the state key, move on\r\n if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {\r\n return;\r\n }\r\n // Retrieve state value, return if not a valid value\r\n const stateValue = this.temporaryCacheStorage.getItem(key);\r\n if (!stateValue) {\r\n return;\r\n }\r\n // Extract state and ensure it matches given InteractionType, then clean request cache\r\n const parsedState = extractBrowserRequestState(this.cryptoImpl, stateValue);\r\n if (parsedState &&\r\n parsedState.interactionType === interactionType) {\r\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: ${stateValue}`);\r\n this.resetRequestCache(stateValue);\r\n }\r\n });\r\n this.setInteractionInProgress(false);\r\n }\r\n cacheCodeRequest(authCodeRequest) {\r\n this.logger.trace("BrowserCacheManager.cacheCodeRequest called");\r\n const encodedValue = base64Encode(JSON.stringify(authCodeRequest));\r\n this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);\r\n }\r\n /**\r\n * Gets the token exchange parameters from the cache. Throws an error if nothing is found.\r\n */\r\n getCachedRequest(state) {\r\n this.logger.trace("BrowserCacheManager.getCachedRequest called");\r\n // Get token request from cache and parse as TokenExchangeParameters.\r\n const encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);\r\n if (!encodedTokenRequest) {\r\n throw createBrowserAuthError(noTokenRequestCacheError);\r\n }\r\n let parsedRequest;\r\n try {\r\n parsedRequest = JSON.parse(base64Decode(encodedTokenRequest));\r\n }\r\n catch (e) {\r\n this.logger.errorPii(`Attempted to parse: ${encodedTokenRequest}`);\r\n this.logger.error(`Parsing cached token request threw with error: ${e}`);\r\n throw createBrowserAuthError(unableToParseTokenRequestCacheError);\r\n }\r\n this.removeTemporaryItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n // Get cached authority and use if no authority is cached with request.\r\n if (!parsedRequest.authority) {\r\n const authorityCacheKey = this.generateAuthorityKey(state);\r\n const cachedAuthority = this.getTemporaryCache(authorityCacheKey);\r\n if (!cachedAuthority) {\r\n throw createBrowserAuthError(noCachedAuthorityError);\r\n }\r\n parsedRequest.authority = cachedAuthority;\r\n }\r\n return parsedRequest;\r\n }\r\n /**\r\n * Gets cached native request for redirect flows\r\n */\r\n getCachedNativeRequest() {\r\n this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");\r\n const cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);\r\n if (!cachedRequest) {\r\n this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found");\r\n return null;\r\n }\r\n const parsedRequest = this.validateAndParseJson(cachedRequest);\r\n if (!parsedRequest) {\r\n this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request");\r\n return null;\r\n }\r\n return parsedRequest;\r\n }\r\n isInteractionInProgress(matchClientId) {\r\n const clientId = this.getInteractionInProgress();\r\n if (matchClientId) {\r\n return clientId === this.clientId;\r\n }\r\n else {\r\n return !!clientId;\r\n }\r\n }\r\n getInteractionInProgress() {\r\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n return this.getTemporaryCache(key, false);\r\n }\r\n setInteractionInProgress(inProgress) {\r\n // Ensure we don\'t overwrite interaction in progress for a different clientId\r\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n if (inProgress) {\r\n if (this.getInteractionInProgress()) {\r\n throw createBrowserAuthError(interactionInProgress);\r\n }\r\n else {\r\n // No interaction is in progress\r\n this.setTemporaryCache(key, this.clientId, false);\r\n }\r\n }\r\n else if (!inProgress &&\r\n this.getInteractionInProgress() === this.clientId) {\r\n this.removeTemporaryItem(key);\r\n }\r\n }\r\n /**\r\n * Returns username retrieved from ADAL or MSAL v1 idToken\r\n * @deprecated\r\n */\r\n getLegacyLoginHint() {\r\n // Only check for adal/msal token if no SSO params are being used\r\n const adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n if (adalIdTokenString) {\r\n this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n this.logger.verbose("Cached ADAL id token retrieved.");\r\n }\r\n // Check for cached MSAL v1 id token\r\n const msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);\r\n if (msalIdTokenString) {\r\n this.browserStorage.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));\r\n this.logger.verbose("Cached MSAL.js v1 id token retrieved");\r\n }\r\n const cachedIdTokenString = msalIdTokenString || adalIdTokenString;\r\n if (cachedIdTokenString) {\r\n const idTokenClaims = extractTokenClaims(cachedIdTokenString, base64Decode);\r\n if (idTokenClaims.preferred_username) {\r\n this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint");\r\n return idTokenClaims.preferred_username;\r\n }\r\n else if (idTokenClaims.upn) {\r\n this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint");\r\n return idTokenClaims.upn;\r\n }\r\n else {\r\n this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.");\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Updates a credential\'s cache key if the current cache key is outdated\r\n */\r\n updateCredentialCacheKey(currentCacheKey, credential) {\r\n const updatedCacheKey = generateCredentialKey(credential);\r\n if (currentCacheKey !== updatedCacheKey) {\r\n const cacheItem = this.getItem(currentCacheKey);\r\n if (cacheItem) {\r\n this.browserStorage.removeItem(currentCacheKey);\r\n this.setItem(updatedCacheKey, cacheItem);\r\n this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);\r\n return updatedCacheKey;\r\n }\r\n else {\r\n this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);\r\n }\r\n }\r\n return currentCacheKey;\r\n }\r\n /**\r\n * Builds credential entities from AuthenticationResult object and saves the resulting credentials to the cache\r\n * @param result\r\n * @param request\r\n */\r\n async hydrateCache(result, request) {\r\n const idTokenEntity = createIdTokenEntity(result.account?.homeAccountId, result.account?.environment, result.idToken, this.clientId, result.tenantId);\r\n let claimsHash;\r\n if (request.claims) {\r\n claimsHash = await this.cryptoImpl.hashString(request.claims);\r\n }\r\n /**\r\n * meta data for cache stores time in seconds from epoch\r\n * AuthenticationResult returns expiresOn and extExpiresOn in milliseconds (as a Date object which is in ms)\r\n * We need to map these for the cache when building tokens from AuthenticationResult\r\n *\r\n * The next MSAL VFuture should map these both to same value if possible\r\n */\r\n const accessTokenEntity = createAccessTokenEntity(result.account?.homeAccountId, result.account.environment, result.accessToken, this.clientId, result.tenantId, result.scopes.join(" "), result.expiresOn ? result.expiresOn.getTime() / 1000 : 0, result.extExpiresOn ? result.extExpiresOn.getTime() / 1000 : 0, base64Decode, undefined, // refreshOn\r\n result.tokenType, undefined, // userAssertionHash\r\n request.sshKid, request.claims, claimsHash);\r\n const cacheRecord = {\r\n idToken: idTokenEntity,\r\n accessToken: accessTokenEntity,\r\n };\r\n return this.saveCacheRecord(cacheRecord);\r\n }\r\n /**\r\n * saves a cache record\r\n * @param cacheRecord {CacheRecord}\r\n * @param storeInCache {?StoreInCache}\r\n * @param correlationId {?string} correlation id\r\n */\r\n async saveCacheRecord(cacheRecord, storeInCache, correlationId) {\r\n try {\r\n await super.saveCacheRecord(cacheRecord, storeInCache, correlationId);\r\n }\r\n catch (e) {\r\n if (e instanceof CacheError &&\r\n this.performanceClient &&\r\n correlationId) {\r\n try {\r\n const tokenKeys = this.getTokenKeys();\r\n this.performanceClient.addFields({\r\n cacheRtCount: tokenKeys.refreshToken.length,\r\n cacheIdCount: tokenKeys.idToken.length,\r\n cacheAtCount: tokenKeys.accessToken.length,\r\n }, correlationId);\r\n }\r\n catch (e) { }\r\n }\r\n throw e;\r\n }\r\n }\r\n}\r\nconst DEFAULT_BROWSER_CACHE_MANAGER = (clientId, logger) => {\r\n const cacheOptions = {\r\n cacheLocation: BrowserCacheLocation.MemoryStorage,\r\n temporaryCacheLocation: BrowserCacheLocation.MemoryStorage,\r\n storeAuthStateInCookie: false,\r\n secureCookies: false,\r\n cacheMigrationEnabled: false,\r\n claimsBasedCachingEnabled: false,\r\n };\r\n return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);\r\n};\n\n\n//# sourceMappingURL=BrowserCacheManager.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/AccountManager.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\nfunction getAllAccounts(logger, browserStorage, isInBrowser, accountFilter) {\r\n logger.verbose("getAllAccounts called");\r\n return isInBrowser ? browserStorage.getAllAccounts(accountFilter) : [];\r\n}\r\n/**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\nfunction getAccount(accountFilter, logger, browserStorage) {\r\n logger.trace("getAccount called");\r\n if (Object.keys(accountFilter).length === 0) {\r\n logger.warning("getAccount: No accountFilter provided");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy(accountFilter);\r\n if (account) {\r\n logger.verbose("getAccount: Account matching provided filter found, returning");\r\n return account;\r\n }\r\n else {\r\n logger.verbose("getAccount: No matching account found, returning null");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param username\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByUsername(username, logger, browserStorage) {\r\n logger.trace("getAccountByUsername called");\r\n if (!username) {\r\n logger.warning("getAccountByUsername: No username provided");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n username,\r\n });\r\n if (account) {\r\n logger.verbose("getAccountByUsername: Account matching username found, returning");\r\n logger.verbosePii(`getAccountByUsername: Returning signed-in accounts matching username: ${username}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose("getAccountByUsername: No matching account found, returning null");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByHomeId(homeAccountId, logger, browserStorage) {\r\n logger.trace("getAccountByHomeId called");\r\n if (!homeAccountId) {\r\n logger.warning("getAccountByHomeId: No homeAccountId provided");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n homeAccountId,\r\n });\r\n if (account) {\r\n logger.verbose("getAccountByHomeId: Account matching homeAccountId found, returning");\r\n logger.verbosePii(`getAccountByHomeId: Returning signed-in accounts matching homeAccountId: ${homeAccountId}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose("getAccountByHomeId: No matching account found, returning null");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\nfunction getAccountByLocalId(localAccountId, logger, browserStorage) {\r\n logger.trace("getAccountByLocalId called");\r\n if (!localAccountId) {\r\n logger.warning("getAccountByLocalId: No localAccountId provided");\r\n return null;\r\n }\r\n const account = browserStorage.getAccountInfoFilteredBy({\r\n localAccountId,\r\n });\r\n if (account) {\r\n logger.verbose("getAccountByLocalId: Account matching localAccountId found, returning");\r\n logger.verbosePii(`getAccountByLocalId: Returning signed-in accounts matching localAccountId: ${localAccountId}`);\r\n return account;\r\n }\r\n else {\r\n logger.verbose("getAccountByLocalId: No matching account found, returning null");\r\n return null;\r\n }\r\n}\r\n/**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\nfunction setActiveAccount(account, browserStorage) {\r\n browserStorage.setActiveAccount(account);\r\n}\r\n/**\r\n * Gets the currently active account\r\n */\r\nfunction getActiveAccount(browserStorage) {\r\n return browserStorage.getActiveAccount();\r\n}\n\n\n//# sourceMappingURL=AccountManager.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/event/EventType.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst EventType = {\r\n INITIALIZE_START: "msal:initializeStart",\r\n INITIALIZE_END: "msal:initializeEnd",\r\n ACCOUNT_ADDED: "msal:accountAdded",\r\n ACCOUNT_REMOVED: "msal:accountRemoved",\r\n ACTIVE_ACCOUNT_CHANGED: "msal:activeAccountChanged",\r\n LOGIN_START: "msal:loginStart",\r\n LOGIN_SUCCESS: "msal:loginSuccess",\r\n LOGIN_FAILURE: "msal:loginFailure",\r\n ACQUIRE_TOKEN_START: "msal:acquireTokenStart",\r\n ACQUIRE_TOKEN_SUCCESS: "msal:acquireTokenSuccess",\r\n ACQUIRE_TOKEN_FAILURE: "msal:acquireTokenFailure",\r\n ACQUIRE_TOKEN_NETWORK_START: "msal:acquireTokenFromNetworkStart",\r\n SSO_SILENT_START: "msal:ssoSilentStart",\r\n SSO_SILENT_SUCCESS: "msal:ssoSilentSuccess",\r\n SSO_SILENT_FAILURE: "msal:ssoSilentFailure",\r\n ACQUIRE_TOKEN_BY_CODE_START: "msal:acquireTokenByCodeStart",\r\n ACQUIRE_TOKEN_BY_CODE_SUCCESS: "msal:acquireTokenByCodeSuccess",\r\n ACQUIRE_TOKEN_BY_CODE_FAILURE: "msal:acquireTokenByCodeFailure",\r\n HANDLE_REDIRECT_START: "msal:handleRedirectStart",\r\n HANDLE_REDIRECT_END: "msal:handleRedirectEnd",\r\n POPUP_OPENED: "msal:popupOpened",\r\n LOGOUT_START: "msal:logoutStart",\r\n LOGOUT_SUCCESS: "msal:logoutSuccess",\r\n LOGOUT_FAILURE: "msal:logoutFailure",\r\n LOGOUT_END: "msal:logoutEnd",\r\n RESTORE_FROM_BFCACHE: "msal:restoreFromBFCache",\r\n};\n\n\n//# sourceMappingURL=EventType.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/event/EventHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass EventHandler {\r\n constructor(logger) {\r\n this.eventCallbacks = new Map();\r\n this.logger = logger || new Logger({});\r\n }\r\n /**\r\n * Adds event callbacks to array\r\n * @param callback - callback to be invoked when an event is raised\r\n * @param eventTypes - list of events that this callback will be invoked for, if not provided callback will be invoked for all events\r\n * @param callbackId - Identifier for the callback, used to locate and remove the callback when no longer required\r\n */\r\n addEventCallback(callback, eventTypes, callbackId) {\r\n if (typeof window !== "undefined") {\r\n const id = callbackId || createGuid();\r\n if (this.eventCallbacks.has(id)) {\r\n this.logger.error(`Event callback with id: ${id} is already registered. Please provide a unique id or remove the existing callback and try again.`);\r\n return null;\r\n }\r\n this.eventCallbacks.set(id, [callback, eventTypes || []]);\r\n this.logger.verbose(`Event callback registered with id: ${id}`);\r\n return id;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Removes callback with provided id from callback array\r\n * @param callbackId\r\n */\r\n removeEventCallback(callbackId) {\r\n this.eventCallbacks.delete(callbackId);\r\n this.logger.verbose(`Event callback ${callbackId} removed.`);\r\n }\r\n /**\r\n * Emits events by calling callback with event message\r\n * @param eventType\r\n * @param interactionType\r\n * @param payload\r\n * @param error\r\n */\r\n emitEvent(eventType, interactionType, payload, error) {\r\n if (typeof window !== "undefined") {\r\n const message = {\r\n eventType: eventType,\r\n interactionType: interactionType || null,\r\n payload: payload || null,\r\n error: error || null,\r\n timestamp: Date.now(),\r\n };\r\n this.eventCallbacks.forEach(([callback, eventTypes], callbackId) => {\r\n if (eventTypes.length === 0 ||\r\n eventTypes.includes(eventType)) {\r\n this.logger.verbose(`Emitting event to callback ${callbackId}: ${eventType}`);\r\n callback.apply(null, [message]);\r\n }\r\n });\r\n }\r\n }\r\n}\n\n\n//# sourceMappingURL=EventHandler.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/error/ServerError.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Error thrown when there is an error with the server code, for example, unavailability.\r\n */\r\nclass ServerError extends AuthError {\r\n constructor(errorCode, errorMessage, subError, errorNo, status) {\r\n super(errorCode, errorMessage, subError);\r\n this.name = "ServerError";\r\n this.errorNo = errorNo;\r\n this.status = status;\r\n Object.setPrototypeOf(this, ServerError.prototype);\r\n }\r\n}\n\n\n//# sourceMappingURL=ServerError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/network/ThrottlingUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/** @internal */\r\nclass ThrottlingUtils {\r\n /**\r\n * Prepares a RequestThumbprint to be stored as a key.\r\n * @param thumbprint\r\n */\r\n static generateThrottlingStorageKey(thumbprint) {\r\n return `${ThrottlingConstants.THROTTLING_PREFIX}.${JSON.stringify(thumbprint)}`;\r\n }\r\n /**\r\n * Performs necessary throttling checks before a network request.\r\n * @param cacheManager\r\n * @param thumbprint\r\n */\r\n static preProcess(cacheManager, thumbprint) {\r\n const key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);\r\n const value = cacheManager.getThrottlingCache(key);\r\n if (value) {\r\n if (value.throttleTime < Date.now()) {\r\n cacheManager.removeItem(key);\r\n return;\r\n }\r\n throw new ServerError(value.errorCodes?.join(" ") || Constants.EMPTY_STRING, value.errorMessage, value.subError);\r\n }\r\n }\r\n /**\r\n * Performs necessary throttling checks after a network request.\r\n * @param cacheManager\r\n * @param thumbprint\r\n * @param response\r\n */\r\n static postProcess(cacheManager, thumbprint, response) {\r\n if (ThrottlingUtils.checkResponseStatus(response) ||\r\n ThrottlingUtils.checkResponseForRetryAfter(response)) {\r\n const thumbprintValue = {\r\n throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),\r\n error: response.body.error,\r\n errorCodes: response.body.error_codes,\r\n errorMessage: response.body.error_description,\r\n subError: response.body.suberror,\r\n };\r\n cacheManager.setThrottlingCache(ThrottlingUtils.generateThrottlingStorageKey(thumbprint), thumbprintValue);\r\n }\r\n }\r\n /**\r\n * Checks a NetworkResponse object\'s status codes against 429 or 5xx\r\n * @param response\r\n */\r\n static checkResponseStatus(response) {\r\n return (response.status === 429 ||\r\n (response.status >= 500 && response.status < 600));\r\n }\r\n /**\r\n * Checks a NetworkResponse object\'s RetryAfter header\r\n * @param response\r\n */\r\n static checkResponseForRetryAfter(response) {\r\n if (response.headers) {\r\n return (response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) &&\r\n (response.status < 200 || response.status >= 300));\r\n }\r\n return false;\r\n }\r\n /**\r\n * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.\r\n * @param throttleTime\r\n */\r\n static calculateThrottleTime(throttleTime) {\r\n const time = throttleTime <= 0 ? 0 : throttleTime;\r\n const currentSeconds = Date.now() / 1000;\r\n return Math.floor(Math.min(currentSeconds +\r\n (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS), currentSeconds +\r\n ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS) * 1000);\r\n }\r\n static removeThrottle(cacheManager, clientId, request, homeAccountIdentifier) {\r\n const thumbprint = {\r\n clientId: clientId,\r\n authority: request.authority,\r\n scopes: request.scopes,\r\n homeAccountIdentifier: homeAccountIdentifier,\r\n claims: request.claims,\r\n authenticationScheme: request.authenticationScheme,\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n resourceRequestUri: request.resourceRequestUri,\r\n shrClaims: request.shrClaims,\r\n sshKid: request.sshKid,\r\n };\r\n const key = this.generateThrottlingStorageKey(thumbprint);\r\n cacheManager.removeItem(key);\r\n }\r\n}\n\n\n//# sourceMappingURL=ThrottlingUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/constants/AADServerParamKeys.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst CLIENT_ID = "client_id";\r\nconst REDIRECT_URI = "redirect_uri";\r\nconst RESPONSE_TYPE = "response_type";\r\nconst RESPONSE_MODE = "response_mode";\r\nconst GRANT_TYPE = "grant_type";\r\nconst CLAIMS = "claims";\r\nconst SCOPE = "scope";\r\nconst ERROR = "error";\r\nconst ERROR_DESCRIPTION = "error_description";\r\nconst ACCESS_TOKEN = "access_token";\r\nconst ID_TOKEN = "id_token";\r\nconst REFRESH_TOKEN = "refresh_token";\r\nconst EXPIRES_IN = "expires_in";\r\nconst REFRESH_TOKEN_EXPIRES_IN = "refresh_token_expires_in";\r\nconst STATE = "state";\r\nconst NONCE = "nonce";\r\nconst PROMPT = "prompt";\r\nconst SESSION_STATE = "session_state";\r\nconst AADServerParamKeys_CLIENT_INFO = "client_info";\r\nconst CODE = "code";\r\nconst CODE_CHALLENGE = "code_challenge";\r\nconst CODE_CHALLENGE_METHOD = "code_challenge_method";\r\nconst CODE_VERIFIER = "code_verifier";\r\nconst CLIENT_REQUEST_ID = "client-request-id";\r\nconst X_CLIENT_SKU = "x-client-SKU";\r\nconst X_CLIENT_VER = "x-client-VER";\r\nconst X_CLIENT_OS = "x-client-OS";\r\nconst X_CLIENT_CPU = "x-client-CPU";\r\nconst X_CLIENT_CURR_TELEM = "x-client-current-telemetry";\r\nconst X_CLIENT_LAST_TELEM = "x-client-last-telemetry";\r\nconst X_MS_LIB_CAPABILITY = "x-ms-lib-capability";\r\nconst X_APP_NAME = "x-app-name";\r\nconst X_APP_VER = "x-app-ver";\r\nconst POST_LOGOUT_URI = "post_logout_redirect_uri";\r\nconst ID_TOKEN_HINT = "id_token_hint";\r\nconst DEVICE_CODE = "device_code";\r\nconst CLIENT_SECRET = "client_secret";\r\nconst CLIENT_ASSERTION = "client_assertion";\r\nconst CLIENT_ASSERTION_TYPE = "client_assertion_type";\r\nconst TOKEN_TYPE = "token_type";\r\nconst REQ_CNF = "req_cnf";\r\nconst OBO_ASSERTION = "assertion";\r\nconst REQUESTED_TOKEN_USE = "requested_token_use";\r\nconst ON_BEHALF_OF = "on_behalf_of";\r\nconst FOCI = "foci";\r\nconst CCS_HEADER = "X-AnchorMailbox";\r\nconst RETURN_SPA_CODE = "return_spa_code";\r\nconst NATIVE_BROKER = "nativebroker";\r\nconst LOGOUT_HINT = "logout_hint";\r\nconst SID = "sid";\r\nconst LOGIN_HINT = "login_hint";\r\nconst DOMAIN_HINT = "domain_hint";\r\nconst X_CLIENT_EXTRA_SKU = "x-client-xtra-sku";\r\nconst BROKER_CLIENT_ID = "brk_client_id";\r\nconst BROKER_REDIRECT_URI = "brk_redirect_uri";\n\n\n//# sourceMappingURL=AADServerParamKeys.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/request/RequestValidator.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Validates server consumable params from the "request" objects\r\n */\r\nclass RequestValidator {\r\n /**\r\n * Utility to check if the `redirectUri` in the request is a non-null value\r\n * @param redirectUri\r\n */\r\n static validateRedirectUri(redirectUri) {\r\n if (!redirectUri) {\r\n throw createClientConfigurationError(redirectUriEmpty);\r\n }\r\n }\r\n /**\r\n * Utility to validate prompt sent by the user in the request\r\n * @param prompt\r\n */\r\n static validatePrompt(prompt) {\r\n const promptValues = [];\r\n for (const value in PromptValue) {\r\n promptValues.push(PromptValue[value]);\r\n }\r\n if (promptValues.indexOf(prompt) < 0) {\r\n throw createClientConfigurationError(invalidPromptValue);\r\n }\r\n }\r\n static validateClaims(claims) {\r\n try {\r\n JSON.parse(claims);\r\n }\r\n catch (e) {\r\n throw createClientConfigurationError(invalidClaims);\r\n }\r\n }\r\n /**\r\n * Utility to validate code_challenge and code_challenge_method\r\n * @param codeChallenge\r\n * @param codeChallengeMethod\r\n */\r\n static validateCodeChallengeParams(codeChallenge, codeChallengeMethod) {\r\n if (!codeChallenge || !codeChallengeMethod) {\r\n throw createClientConfigurationError(pkceParamsMissing);\r\n }\r\n else {\r\n this.validateCodeChallengeMethod(codeChallengeMethod);\r\n }\r\n }\r\n /**\r\n * Utility to validate code_challenge_method\r\n * @param codeChallengeMethod\r\n */\r\n static validateCodeChallengeMethod(codeChallengeMethod) {\r\n if ([\r\n CodeChallengeMethodValues.PLAIN,\r\n CodeChallengeMethodValues.S256,\r\n ].indexOf(codeChallengeMethod) < 0) {\r\n throw createClientConfigurationError(invalidCodeChallengeMethod);\r\n }\r\n }\r\n}\n\n\n//# sourceMappingURL=RequestValidator.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/request/RequestParameterBuilder.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction instrumentBrokerParams(parameters, correlationId, performanceClient) {\r\n if (!correlationId) {\r\n return;\r\n }\r\n const clientId = parameters.get(CLIENT_ID);\r\n if (clientId && parameters.has(BROKER_CLIENT_ID)) {\r\n performanceClient?.addFields({\r\n embeddedClientId: clientId,\r\n embeddedRedirectUri: parameters.get(REDIRECT_URI),\r\n }, correlationId);\r\n }\r\n}\r\n/** @internal */\r\nclass RequestParameterBuilder {\r\n constructor(correlationId, performanceClient) {\r\n this.parameters = new Map();\r\n this.performanceClient = performanceClient;\r\n this.correlationId = correlationId;\r\n }\r\n /**\r\n * add response_type = code\r\n */\r\n addResponseTypeCode() {\r\n this.parameters.set(RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE));\r\n }\r\n /**\r\n * add response_type = token id_token\r\n */\r\n addResponseTypeForTokenAndIdToken() {\r\n this.parameters.set(RESPONSE_TYPE, encodeURIComponent(`${Constants.TOKEN_RESPONSE_TYPE} ${Constants.ID_TOKEN_RESPONSE_TYPE}`));\r\n }\r\n /**\r\n * add response_mode. defaults to query.\r\n * @param responseMode\r\n */\r\n addResponseMode(responseMode) {\r\n this.parameters.set(RESPONSE_MODE, encodeURIComponent(responseMode ? responseMode : ResponseMode.QUERY));\r\n }\r\n /**\r\n * Add flag to indicate STS should attempt to use WAM if available\r\n */\r\n addNativeBroker() {\r\n this.parameters.set(NATIVE_BROKER, encodeURIComponent("1"));\r\n }\r\n /**\r\n * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios\r\n * @param scopeSet\r\n * @param addOidcScopes\r\n */\r\n addScopes(scopes, addOidcScopes = true, defaultScopes = OIDC_DEFAULT_SCOPES) {\r\n // Always add openid to the scopes when adding OIDC scopes\r\n if (addOidcScopes &&\r\n !defaultScopes.includes("openid") &&\r\n !scopes.includes("openid")) {\r\n defaultScopes.push("openid");\r\n }\r\n const requestScopes = addOidcScopes\r\n ? [...(scopes || []), ...defaultScopes]\r\n : scopes || [];\r\n const scopeSet = new ScopeSet(requestScopes);\r\n this.parameters.set(SCOPE, encodeURIComponent(scopeSet.printScopes()));\r\n }\r\n /**\r\n * add clientId\r\n * @param clientId\r\n */\r\n addClientId(clientId) {\r\n this.parameters.set(CLIENT_ID, encodeURIComponent(clientId));\r\n }\r\n /**\r\n * add redirect_uri\r\n * @param redirectUri\r\n */\r\n addRedirectUri(redirectUri) {\r\n RequestValidator.validateRedirectUri(redirectUri);\r\n this.parameters.set(REDIRECT_URI, encodeURIComponent(redirectUri));\r\n }\r\n /**\r\n * add post logout redirectUri\r\n * @param redirectUri\r\n */\r\n addPostLogoutRedirectUri(redirectUri) {\r\n RequestValidator.validateRedirectUri(redirectUri);\r\n this.parameters.set(POST_LOGOUT_URI, encodeURIComponent(redirectUri));\r\n }\r\n /**\r\n * add id_token_hint to logout request\r\n * @param idTokenHint\r\n */\r\n addIdTokenHint(idTokenHint) {\r\n this.parameters.set(ID_TOKEN_HINT, encodeURIComponent(idTokenHint));\r\n }\r\n /**\r\n * add domain_hint\r\n * @param domainHint\r\n */\r\n addDomainHint(domainHint) {\r\n this.parameters.set(DOMAIN_HINT, encodeURIComponent(domainHint));\r\n }\r\n /**\r\n * add login_hint\r\n * @param loginHint\r\n */\r\n addLoginHint(loginHint) {\r\n this.parameters.set(LOGIN_HINT, encodeURIComponent(loginHint));\r\n }\r\n /**\r\n * Adds the CCS (Cache Credential Service) query parameter for login_hint\r\n * @param loginHint\r\n */\r\n addCcsUpn(loginHint) {\r\n this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent(`UPN:${loginHint}`));\r\n }\r\n /**\r\n * Adds the CCS (Cache Credential Service) query parameter for account object\r\n * @param loginHint\r\n */\r\n addCcsOid(clientInfo) {\r\n this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent(`Oid:${clientInfo.uid}@${clientInfo.utid}`));\r\n }\r\n /**\r\n * add sid\r\n * @param sid\r\n */\r\n addSid(sid) {\r\n this.parameters.set(SID, encodeURIComponent(sid));\r\n }\r\n /**\r\n * add claims\r\n * @param claims\r\n */\r\n addClaims(claims, clientCapabilities) {\r\n const mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);\r\n RequestValidator.validateClaims(mergedClaims);\r\n this.parameters.set(CLAIMS, encodeURIComponent(mergedClaims));\r\n }\r\n /**\r\n * add correlationId\r\n * @param correlationId\r\n */\r\n addCorrelationId(correlationId) {\r\n this.parameters.set(CLIENT_REQUEST_ID, encodeURIComponent(correlationId));\r\n }\r\n /**\r\n * add library info query params\r\n * @param libraryInfo\r\n */\r\n addLibraryInfo(libraryInfo) {\r\n // Telemetry Info\r\n this.parameters.set(X_CLIENT_SKU, libraryInfo.sku);\r\n this.parameters.set(X_CLIENT_VER, libraryInfo.version);\r\n if (libraryInfo.os) {\r\n this.parameters.set(X_CLIENT_OS, libraryInfo.os);\r\n }\r\n if (libraryInfo.cpu) {\r\n this.parameters.set(X_CLIENT_CPU, libraryInfo.cpu);\r\n }\r\n }\r\n /**\r\n * Add client telemetry parameters\r\n * @param appTelemetry\r\n */\r\n addApplicationTelemetry(appTelemetry) {\r\n if (appTelemetry?.appName) {\r\n this.parameters.set(X_APP_NAME, appTelemetry.appName);\r\n }\r\n if (appTelemetry?.appVersion) {\r\n this.parameters.set(X_APP_VER, appTelemetry.appVersion);\r\n }\r\n }\r\n /**\r\n * add prompt\r\n * @param prompt\r\n */\r\n addPrompt(prompt) {\r\n RequestValidator.validatePrompt(prompt);\r\n this.parameters.set(`${PROMPT}`, encodeURIComponent(prompt));\r\n }\r\n /**\r\n * add state\r\n * @param state\r\n */\r\n addState(state) {\r\n if (state) {\r\n this.parameters.set(STATE, encodeURIComponent(state));\r\n }\r\n }\r\n /**\r\n * add nonce\r\n * @param nonce\r\n */\r\n addNonce(nonce) {\r\n this.parameters.set(NONCE, encodeURIComponent(nonce));\r\n }\r\n /**\r\n * add code_challenge and code_challenge_method\r\n * - throw if either of them are not passed\r\n * @param codeChallenge\r\n * @param codeChallengeMethod\r\n */\r\n addCodeChallengeParams(codeChallenge, codeChallengeMethod) {\r\n RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);\r\n if (codeChallenge && codeChallengeMethod) {\r\n this.parameters.set(CODE_CHALLENGE, encodeURIComponent(codeChallenge));\r\n this.parameters.set(CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));\r\n }\r\n else {\r\n throw createClientConfigurationError(pkceParamsMissing);\r\n }\r\n }\r\n /**\r\n * add the `authorization_code` passed by the user to exchange for a token\r\n * @param code\r\n */\r\n addAuthorizationCode(code) {\r\n this.parameters.set(CODE, encodeURIComponent(code));\r\n }\r\n /**\r\n * add the `authorization_code` passed by the user to exchange for a token\r\n * @param code\r\n */\r\n addDeviceCode(code) {\r\n this.parameters.set(DEVICE_CODE, encodeURIComponent(code));\r\n }\r\n /**\r\n * add the `refreshToken` passed by the user\r\n * @param refreshToken\r\n */\r\n addRefreshToken(refreshToken) {\r\n this.parameters.set(REFRESH_TOKEN, encodeURIComponent(refreshToken));\r\n }\r\n /**\r\n * add the `code_verifier` passed by the user to exchange for a token\r\n * @param codeVerifier\r\n */\r\n addCodeVerifier(codeVerifier) {\r\n this.parameters.set(CODE_VERIFIER, encodeURIComponent(codeVerifier));\r\n }\r\n /**\r\n * add client_secret\r\n * @param clientSecret\r\n */\r\n addClientSecret(clientSecret) {\r\n this.parameters.set(CLIENT_SECRET, encodeURIComponent(clientSecret));\r\n }\r\n /**\r\n * add clientAssertion for confidential client flows\r\n * @param clientAssertion\r\n */\r\n addClientAssertion(clientAssertion) {\r\n if (clientAssertion) {\r\n this.parameters.set(CLIENT_ASSERTION, encodeURIComponent(clientAssertion));\r\n }\r\n }\r\n /**\r\n * add clientAssertionType for confidential client flows\r\n * @param clientAssertionType\r\n */\r\n addClientAssertionType(clientAssertionType) {\r\n if (clientAssertionType) {\r\n this.parameters.set(CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));\r\n }\r\n }\r\n /**\r\n * add OBO assertion for confidential client flows\r\n * @param clientAssertion\r\n */\r\n addOboAssertion(oboAssertion) {\r\n this.parameters.set(OBO_ASSERTION, encodeURIComponent(oboAssertion));\r\n }\r\n /**\r\n * add grant type\r\n * @param grantType\r\n */\r\n addRequestTokenUse(tokenUse) {\r\n this.parameters.set(REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));\r\n }\r\n /**\r\n * add grant type\r\n * @param grantType\r\n */\r\n addGrantType(grantType) {\r\n this.parameters.set(GRANT_TYPE, encodeURIComponent(grantType));\r\n }\r\n /**\r\n * add client info\r\n *\r\n */\r\n addClientInfo() {\r\n this.parameters.set(CLIENT_INFO, "1");\r\n }\r\n /**\r\n * add extraQueryParams\r\n * @param eQParams\r\n */\r\n addExtraQueryParameters(eQParams) {\r\n Object.entries(eQParams).forEach(([key, value]) => {\r\n if (!this.parameters.has(key) && value) {\r\n this.parameters.set(key, value);\r\n }\r\n });\r\n }\r\n addClientCapabilitiesToClaims(claims, clientCapabilities) {\r\n let mergedClaims;\r\n // Parse provided claims into JSON object or initialize empty object\r\n if (!claims) {\r\n mergedClaims = {};\r\n }\r\n else {\r\n try {\r\n mergedClaims = JSON.parse(claims);\r\n }\r\n catch (e) {\r\n throw createClientConfigurationError(invalidClaims);\r\n }\r\n }\r\n if (clientCapabilities && clientCapabilities.length > 0) {\r\n if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)) {\r\n // Add access_token key to claims object\r\n mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};\r\n }\r\n // Add xms_cc claim with provided clientCapabilities to access_token key\r\n mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {\r\n values: clientCapabilities,\r\n };\r\n }\r\n return JSON.stringify(mergedClaims);\r\n }\r\n /**\r\n * adds `username` for Password Grant flow\r\n * @param username\r\n */\r\n addUsername(username) {\r\n this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));\r\n }\r\n /**\r\n * adds `password` for Password Grant flow\r\n * @param password\r\n */\r\n addPassword(password) {\r\n this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));\r\n }\r\n /**\r\n * add pop_jwk to query params\r\n * @param cnfString\r\n */\r\n addPopToken(cnfString) {\r\n if (cnfString) {\r\n this.parameters.set(TOKEN_TYPE, AuthenticationScheme.POP);\r\n this.parameters.set(REQ_CNF, encodeURIComponent(cnfString));\r\n }\r\n }\r\n /**\r\n * add SSH JWK and key ID to query params\r\n */\r\n addSshJwk(sshJwkString) {\r\n if (sshJwkString) {\r\n this.parameters.set(TOKEN_TYPE, AuthenticationScheme.SSH);\r\n this.parameters.set(REQ_CNF, encodeURIComponent(sshJwkString));\r\n }\r\n }\r\n /**\r\n * add server telemetry fields\r\n * @param serverTelemetryManager\r\n */\r\n addServerTelemetry(serverTelemetryManager) {\r\n this.parameters.set(X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());\r\n this.parameters.set(X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());\r\n }\r\n /**\r\n * Adds parameter that indicates to the server that throttling is supported\r\n */\r\n addThrottling() {\r\n this.parameters.set(X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);\r\n }\r\n /**\r\n * Adds logout_hint parameter for "silent" logout which prevent server account picker\r\n */\r\n addLogoutHint(logoutHint) {\r\n this.parameters.set(LOGOUT_HINT, encodeURIComponent(logoutHint));\r\n }\r\n addBrokerParameters(params) {\r\n const brokerParams = {};\r\n brokerParams[BROKER_CLIENT_ID] =\r\n params.brokerClientId;\r\n brokerParams[BROKER_REDIRECT_URI] =\r\n params.brokerRedirectUri;\r\n this.addExtraQueryParameters(brokerParams);\r\n }\r\n /**\r\n * Utility to create a URL from the params map\r\n */\r\n createQueryString() {\r\n const queryParameterArray = new Array();\r\n this.parameters.forEach((value, key) => {\r\n queryParameterArray.push(`${key}=${value}`);\r\n });\r\n instrumentBrokerParams(this.parameters, this.correlationId, this.performanceClient);\r\n return queryParameterArray.join("&");\r\n }\r\n}\n\n\n//# sourceMappingURL=RequestParameterBuilder.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/authority/AuthorityFactory.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Create an authority object of the correct type based on the url\r\n * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)\r\n *\r\n * Also performs endpoint discovery.\r\n *\r\n * @param authorityUri\r\n * @param networkClient\r\n * @param protocolMode\r\n * @internal\r\n */\r\nasync function createDiscoveredInstance(authorityUri, networkClient, cacheManager, authorityOptions, logger, correlationId, performanceClient) {\r\n performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, correlationId);\r\n const authorityUriFinal = Authority.transformCIAMAuthority(formatAuthorityUri(authorityUri));\r\n // Initialize authority and perform discovery endpoint check.\r\n const acquireTokenAuthority = new Authority(authorityUriFinal, networkClient, cacheManager, authorityOptions, logger, correlationId, performanceClient);\r\n try {\r\n await invokeAsync(acquireTokenAuthority.resolveEndpointsAsync.bind(acquireTokenAuthority), PerformanceEvents.AuthorityResolveEndpointsAsync, logger, performanceClient, correlationId)();\r\n return acquireTokenAuthority;\r\n }\r\n catch (e) {\r\n throw createClientAuthError(endpointResolutionError);\r\n }\r\n}\n\n\n//# sourceMappingURL=AuthorityFactory.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/client/BaseClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.\r\n * @internal\r\n */\r\nclass BaseClient {\r\n constructor(configuration, performanceClient) {\r\n // Set the configuration\r\n this.config = buildClientConfiguration(configuration);\r\n // Initialize the logger\r\n this.logger = new Logger(this.config.loggerOptions, packageMetadata_name, version);\r\n // Initialize crypto\r\n this.cryptoUtils = this.config.cryptoInterface;\r\n // Initialize storage interface\r\n this.cacheManager = this.config.storageInterface;\r\n // Set the network interface\r\n this.networkClient = this.config.networkInterface;\r\n // Set TelemetryManager\r\n this.serverTelemetryManager = this.config.serverTelemetryManager;\r\n // set Authority\r\n this.authority = this.config.authOptions.authority;\r\n // set performance telemetry client\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Creates default headers for requests to token endpoint\r\n */\r\n createTokenRequestHeaders(ccsCred) {\r\n const headers = {};\r\n headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;\r\n if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {\r\n switch (ccsCred.type) {\r\n case CcsCredentialType.HOME_ACCOUNT_ID:\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);\r\n headers[HeaderNames.CCS_HEADER] = `Oid:${clientInfo.uid}@${clientInfo.utid}`;\r\n }\r\n catch (e) {\r\n this.logger.verbose("Could not parse home account ID for CCS Header: " +\r\n e);\r\n }\r\n break;\r\n case CcsCredentialType.UPN:\r\n headers[HeaderNames.CCS_HEADER] = `UPN: ${ccsCred.credential}`;\r\n break;\r\n }\r\n }\r\n return headers;\r\n }\r\n /**\r\n * Http post to token endpoint\r\n * @param tokenEndpoint\r\n * @param queryString\r\n * @param headers\r\n * @param thumbprint\r\n */\r\n async executePostToTokenEndpoint(tokenEndpoint, queryString, headers, thumbprint, correlationId, queuedEvent) {\r\n if (queuedEvent) {\r\n this.performanceClient?.addQueueMeasurement(queuedEvent, correlationId);\r\n }\r\n const response = await this.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers }, correlationId);\r\n if (this.config.serverTelemetryManager &&\r\n response.status < 500 &&\r\n response.status !== 429) {\r\n // Telemetry data successfully logged by server, clear Telemetry cache\r\n this.config.serverTelemetryManager.clearTelemetryCache();\r\n }\r\n return response;\r\n }\r\n /**\r\n * Wraps sendPostRequestAsync with necessary preflight and postflight logic\r\n * @param thumbprint - Request thumbprint for throttling\r\n * @param tokenEndpoint - Endpoint to make the POST to\r\n * @param options - Body and Headers to include on the POST request\r\n * @param correlationId - CorrelationId for telemetry\r\n */\r\n async sendPostRequest(thumbprint, tokenEndpoint, options, correlationId) {\r\n ThrottlingUtils.preProcess(this.cacheManager, thumbprint);\r\n let response;\r\n try {\r\n response = await invokeAsync((this.networkClient.sendPostRequestAsync.bind(this.networkClient)), PerformanceEvents.NetworkClientSendPostRequestAsync, this.logger, this.performanceClient, correlationId)(tokenEndpoint, options);\r\n const responseHeaders = response.headers || {};\r\n this.performanceClient?.addFields({\r\n refreshTokenSize: response.body.refresh_token?.length || 0,\r\n httpVerToken: responseHeaders[HeaderNames.X_MS_HTTP_VERSION] || "",\r\n requestId: responseHeaders[HeaderNames.X_MS_REQUEST_ID] || "",\r\n }, correlationId);\r\n }\r\n catch (e) {\r\n if (e instanceof NetworkError) {\r\n const responseHeaders = e.responseHeaders;\r\n if (responseHeaders) {\r\n this.performanceClient?.addFields({\r\n httpVerToken: responseHeaders[HeaderNames.X_MS_HTTP_VERSION] || "",\r\n requestId: responseHeaders[HeaderNames.X_MS_REQUEST_ID] ||\r\n "",\r\n contentTypeHeader: responseHeaders[HeaderNames.CONTENT_TYPE] ||\r\n undefined,\r\n contentLengthHeader: responseHeaders[HeaderNames.CONTENT_LENGTH] ||\r\n undefined,\r\n httpStatus: e.httpStatus,\r\n }, correlationId);\r\n }\r\n throw e.error;\r\n }\r\n if (e instanceof AuthError) {\r\n throw e;\r\n }\r\n else {\r\n throw createClientAuthError(networkError);\r\n }\r\n }\r\n ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);\r\n return response;\r\n }\r\n /**\r\n * Updates the authority object of the client. Endpoint discovery must be completed.\r\n * @param updatedAuthority\r\n */\r\n async updateAuthority(cloudInstanceHostname, correlationId) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.UpdateTokenEndpointAuthority, correlationId);\r\n const cloudInstanceAuthorityUri = `https://${cloudInstanceHostname}/${this.authority.tenant}/`;\r\n const cloudInstanceAuthority = await createDiscoveredInstance(cloudInstanceAuthorityUri, this.networkClient, this.cacheManager, this.authority.options, this.logger, correlationId, this.performanceClient);\r\n this.authority = cloudInstanceAuthority;\r\n }\r\n /**\r\n * Creates query string for the /token request\r\n * @param request\r\n */\r\n createTokenQueryParameters(request) {\r\n const parameterBuilder = new RequestParameterBuilder(request.correlationId, this.performanceClient);\r\n if (request.embeddedClientId) {\r\n parameterBuilder.addBrokerParameters({\r\n brokerClientId: this.config.authOptions.clientId,\r\n brokerRedirectUri: this.config.authOptions.redirectUri,\r\n });\r\n }\r\n if (request.tokenQueryParameters) {\r\n parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);\r\n }\r\n parameterBuilder.addCorrelationId(request.correlationId);\r\n return parameterBuilder.createQueryString();\r\n }\r\n}\n\n\n//# sourceMappingURL=BaseClient.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/crypto/PopTokenGenerator.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst KeyLocation = {\r\n SW: "sw",\r\n UHW: "uhw",\r\n};\r\n/** @internal */\r\nclass PopTokenGenerator {\r\n constructor(cryptoUtils, performanceClient) {\r\n this.cryptoUtils = cryptoUtils;\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters\r\n * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash\r\n * @param request\r\n * @returns\r\n */\r\n async generateCnf(request, logger) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.PopTokenGenerateCnf, request.correlationId);\r\n const reqCnf = await invokeAsync(this.generateKid.bind(this), PerformanceEvents.PopTokenGenerateCnf, logger, this.performanceClient, request.correlationId)(request);\r\n const reqCnfString = this.cryptoUtils.base64UrlEncode(JSON.stringify(reqCnf));\r\n return {\r\n kid: reqCnf.kid,\r\n reqCnfString,\r\n };\r\n }\r\n /**\r\n * Generates key_id for a SHR token request\r\n * @param request\r\n * @returns\r\n */\r\n async generateKid(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.PopTokenGenerateKid, request.correlationId);\r\n const kidThumbprint = await this.cryptoUtils.getPublicKeyThumbprint(request);\r\n return {\r\n kid: kidThumbprint,\r\n xms_ksl: KeyLocation.SW,\r\n };\r\n }\r\n /**\r\n * Signs the POP access_token with the local generated key-pair\r\n * @param accessToken\r\n * @param request\r\n * @returns\r\n */\r\n async signPopToken(accessToken, keyId, request) {\r\n return this.signPayload(accessToken, keyId, request);\r\n }\r\n /**\r\n * Utility function to generate the signed JWT for an access_token\r\n * @param payload\r\n * @param kid\r\n * @param request\r\n * @param claims\r\n * @returns\r\n */\r\n async signPayload(payload, keyId, request, claims) {\r\n // Deconstruct request to extract SHR parameters\r\n const { resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce, shrOptions, } = request;\r\n const resourceUrlString = resourceRequestUri\r\n ? new UrlString(resourceRequestUri)\r\n : undefined;\r\n const resourceUrlComponents = resourceUrlString?.getUrlComponents();\r\n return this.cryptoUtils.signJwt({\r\n at: payload,\r\n ts: nowSeconds(),\r\n m: resourceRequestMethod?.toUpperCase(),\r\n u: resourceUrlComponents?.HostNameAndPort,\r\n nonce: shrNonce || this.cryptoUtils.createNewGuid(),\r\n p: resourceUrlComponents?.AbsolutePath,\r\n q: resourceUrlComponents?.QueryString\r\n ? [[], resourceUrlComponents.QueryString]\r\n : undefined,\r\n client_claims: shrClaims || undefined,\r\n ...claims,\r\n }, keyId, shrOptions, request.correlationId);\r\n }\r\n}\n\n\n//# sourceMappingURL=PopTokenGenerator.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/cache/persistence/TokenCacheContext.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This class instance helps track the memory changes facilitating\r\n * decisions to read from and write to the persistent cache\r\n */ class TokenCacheContext {\r\n constructor(tokenCache, hasChanged) {\r\n this.cache = tokenCache;\r\n this.hasChanged = hasChanged;\r\n }\r\n /**\r\n * boolean which indicates the changes in cache\r\n */\r\n get cacheHasChanged() {\r\n return this.hasChanged;\r\n }\r\n /**\r\n * function to retrieve the token cache\r\n */\r\n get tokenCache() {\r\n return this.cache;\r\n }\r\n}\n\n\n//# sourceMappingURL=TokenCacheContext.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/response/ResponseHandler.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction parseServerErrorNo(serverResponse) {\r\n const errorCodePrefix = "code=";\r\n const errorCodePrefixIndex = serverResponse.error_uri?.lastIndexOf(errorCodePrefix);\r\n return errorCodePrefixIndex && errorCodePrefixIndex >= 0\r\n ? serverResponse.error_uri?.substring(errorCodePrefixIndex + errorCodePrefix.length)\r\n : undefined;\r\n}\r\n/**\r\n * Class that handles response parsing.\r\n * @internal\r\n */\r\nclass ResponseHandler {\r\n constructor(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin, performanceClient) {\r\n this.clientId = clientId;\r\n this.cacheStorage = cacheStorage;\r\n this.cryptoObj = cryptoObj;\r\n this.logger = logger;\r\n this.serializableCache = serializableCache;\r\n this.persistencePlugin = persistencePlugin;\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Function which validates server authorization code response.\r\n * @param serverResponseHash\r\n * @param requestState\r\n * @param cryptoObj\r\n */\r\n validateServerAuthorizationCodeResponse(serverResponse, requestState) {\r\n if (!serverResponse.state || !requestState) {\r\n throw serverResponse.state\r\n ? createClientAuthError(stateNotFound, "Cached State")\r\n : createClientAuthError(stateNotFound, "Server State");\r\n }\r\n let decodedServerResponseState;\r\n let decodedRequestState;\r\n try {\r\n decodedServerResponseState = decodeURIComponent(serverResponse.state);\r\n }\r\n catch (e) {\r\n throw createClientAuthError(invalidState, serverResponse.state);\r\n }\r\n try {\r\n decodedRequestState = decodeURIComponent(requestState);\r\n }\r\n catch (e) {\r\n throw createClientAuthError(invalidState, serverResponse.state);\r\n }\r\n if (decodedServerResponseState !== decodedRequestState) {\r\n throw createClientAuthError(stateMismatch);\r\n }\r\n // Check for error\r\n if (serverResponse.error ||\r\n serverResponse.error_description ||\r\n serverResponse.suberror) {\r\n const serverErrorNo = parseServerErrorNo(serverResponse);\r\n if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {\r\n throw new InteractionRequiredAuthError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || "", serverResponse.trace_id || "", serverResponse.correlation_id || "", serverResponse.claims || "", serverErrorNo);\r\n }\r\n throw new ServerError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror, serverErrorNo);\r\n }\r\n }\r\n /**\r\n * Function which validates server authorization token response.\r\n * @param serverResponse\r\n * @param refreshAccessToken\r\n */\r\n validateTokenResponse(serverResponse, refreshAccessToken) {\r\n // Check for error\r\n if (serverResponse.error ||\r\n serverResponse.error_description ||\r\n serverResponse.suberror) {\r\n const errString = `Error(s): ${serverResponse.error_codes || Constants.NOT_AVAILABLE} - Timestamp: ${serverResponse.timestamp || Constants.NOT_AVAILABLE} - Description: ${serverResponse.error_description || Constants.NOT_AVAILABLE} - Correlation ID: ${serverResponse.correlation_id || Constants.NOT_AVAILABLE} - Trace ID: ${serverResponse.trace_id || Constants.NOT_AVAILABLE}`;\r\n const serverErrorNo = serverResponse.error_codes?.length\r\n ? serverResponse.error_codes[0]\r\n : undefined;\r\n const serverError = new ServerError(serverResponse.error, errString, serverResponse.suberror, serverErrorNo, serverResponse.status);\r\n // check if 500 error\r\n if (refreshAccessToken &&\r\n serverResponse.status &&\r\n serverResponse.status >= HttpStatus.SERVER_ERROR_RANGE_START &&\r\n serverResponse.status <= HttpStatus.SERVER_ERROR_RANGE_END) {\r\n this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently unavailable and the access token is unable to be refreshed.\\n${serverError}`);\r\n // don\'t throw an exception, but alert the user via a log that the token was unable to be refreshed\r\n return;\r\n // check if 400 error\r\n }\r\n else if (refreshAccessToken &&\r\n serverResponse.status &&\r\n serverResponse.status >= HttpStatus.CLIENT_ERROR_RANGE_START &&\r\n serverResponse.status <= HttpStatus.CLIENT_ERROR_RANGE_END) {\r\n this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently available but is unable to refresh the access token.\\n${serverError}`);\r\n // don\'t throw an exception, but alert the user via a log that the token was unable to be refreshed\r\n return;\r\n }\r\n if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {\r\n throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || Constants.EMPTY_STRING, serverResponse.trace_id || Constants.EMPTY_STRING, serverResponse.correlation_id || Constants.EMPTY_STRING, serverResponse.claims || Constants.EMPTY_STRING, serverErrorNo);\r\n }\r\n throw serverError;\r\n }\r\n }\r\n /**\r\n * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.\r\n * @param serverTokenResponse\r\n * @param authority\r\n */\r\n async handleServerTokenResponse(serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse, serverRequestId) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.HandleServerTokenResponse, serverTokenResponse.correlation_id);\r\n // create an idToken object (not entity)\r\n let idTokenClaims;\r\n if (serverTokenResponse.id_token) {\r\n idTokenClaims = extractTokenClaims(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj.base64Decode);\r\n // token nonce check (TODO: Add a warning if no nonce is given?)\r\n if (authCodePayload && authCodePayload.nonce) {\r\n if (idTokenClaims.nonce !== authCodePayload.nonce) {\r\n throw createClientAuthError(nonceMismatch);\r\n }\r\n }\r\n // token max_age check\r\n if (request.maxAge || request.maxAge === 0) {\r\n const authTime = idTokenClaims.auth_time;\r\n if (!authTime) {\r\n throw createClientAuthError(authTimeNotFound);\r\n }\r\n checkMaxAge(authTime, request.maxAge);\r\n }\r\n }\r\n // generate homeAccountId\r\n this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenClaims);\r\n // save the response tokens\r\n let requestStateObj;\r\n if (!!authCodePayload && !!authCodePayload.state) {\r\n requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);\r\n }\r\n // Add keyId from request to serverTokenResponse if defined\r\n serverTokenResponse.key_id =\r\n serverTokenResponse.key_id || request.sshKid || undefined;\r\n const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload);\r\n let cacheContext;\r\n try {\r\n if (this.persistencePlugin && this.serializableCache) {\r\n this.logger.verbose("Persistence enabled, calling beforeCacheAccess");\r\n cacheContext = new TokenCacheContext(this.serializableCache, true);\r\n await this.persistencePlugin.beforeCacheAccess(cacheContext);\r\n }\r\n /*\r\n * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.\r\n * If not present, we should return null, as it\'s the case that another application called removeAccount in between\r\n * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by\r\n * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.\r\n */\r\n if (handlingRefreshTokenResponse &&\r\n !forceCacheRefreshTokenResponse &&\r\n cacheRecord.account) {\r\n const key = cacheRecord.account.generateAccountKey();\r\n const account = this.cacheStorage.getAccount(key, this.logger);\r\n if (!account) {\r\n this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");\r\n return await ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, undefined, serverRequestId);\r\n }\r\n }\r\n await this.cacheStorage.saveCacheRecord(cacheRecord, request.storeInCache, request.correlationId);\r\n }\r\n finally {\r\n if (this.persistencePlugin &&\r\n this.serializableCache &&\r\n cacheContext) {\r\n this.logger.verbose("Persistence enabled, calling afterCacheAccess");\r\n await this.persistencePlugin.afterCacheAccess(cacheContext);\r\n }\r\n }\r\n return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, serverTokenResponse, serverRequestId);\r\n }\r\n /**\r\n * Generates CacheRecord\r\n * @param serverTokenResponse\r\n * @param idTokenObj\r\n * @param authority\r\n */\r\n generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload) {\r\n const env = authority.getPreferredCache();\r\n if (!env) {\r\n throw createClientAuthError(invalidCacheEnvironment);\r\n }\r\n const claimsTenantId = getTenantIdFromIdTokenClaims(idTokenClaims);\r\n // IdToken: non AAD scenarios can have empty realm\r\n let cachedIdToken;\r\n let cachedAccount;\r\n if (serverTokenResponse.id_token && !!idTokenClaims) {\r\n cachedIdToken = createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token, this.clientId, claimsTenantId || "");\r\n cachedAccount = buildAccountToCache(this.cacheStorage, authority, this.homeAccountIdentifier, this.cryptoObj.base64Decode, idTokenClaims, serverTokenResponse.client_info, env, claimsTenantId, authCodePayload, undefined, // nativeAccountId\r\n this.logger);\r\n }\r\n // AccessToken\r\n let cachedAccessToken = null;\r\n if (serverTokenResponse.access_token) {\r\n // If scopes not returned in server response, use request scopes\r\n const responseScopes = serverTokenResponse.scope\r\n ? ScopeSet.fromString(serverTokenResponse.scope)\r\n : new ScopeSet(request.scopes || []);\r\n /*\r\n * Use timestamp calculated before request\r\n * Server may return timestamps as strings, parse to numbers if so.\r\n */\r\n const expiresIn = (typeof serverTokenResponse.expires_in === "string"\r\n ? parseInt(serverTokenResponse.expires_in, 10)\r\n : serverTokenResponse.expires_in) || 0;\r\n const extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string"\r\n ? parseInt(serverTokenResponse.ext_expires_in, 10)\r\n : serverTokenResponse.ext_expires_in) || 0;\r\n const refreshIn = (typeof serverTokenResponse.refresh_in === "string"\r\n ? parseInt(serverTokenResponse.refresh_in, 10)\r\n : serverTokenResponse.refresh_in) || undefined;\r\n const tokenExpirationSeconds = reqTimestamp + expiresIn;\r\n const extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;\r\n const refreshOnSeconds = refreshIn && refreshIn > 0\r\n ? reqTimestamp + refreshIn\r\n : undefined;\r\n // non AAD scenarios can have empty realm\r\n cachedAccessToken = createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token, this.clientId, claimsTenantId || authority.tenant || "", responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj.base64Decode, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);\r\n }\r\n // refreshToken\r\n let cachedRefreshToken = null;\r\n if (serverTokenResponse.refresh_token) {\r\n let rtExpiresOn;\r\n if (serverTokenResponse.refresh_token_expires_in) {\r\n const rtExpiresIn = typeof serverTokenResponse.refresh_token_expires_in ===\r\n "string"\r\n ? parseInt(serverTokenResponse.refresh_token_expires_in, 10)\r\n : serverTokenResponse.refresh_token_expires_in;\r\n rtExpiresOn = reqTimestamp + rtExpiresIn;\r\n }\r\n cachedRefreshToken = createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token, this.clientId, serverTokenResponse.foci, userAssertionHash, rtExpiresOn);\r\n }\r\n // appMetadata\r\n let cachedAppMetadata = null;\r\n if (serverTokenResponse.foci) {\r\n cachedAppMetadata = {\r\n clientId: this.clientId,\r\n environment: env,\r\n familyId: serverTokenResponse.foci,\r\n };\r\n }\r\n return {\r\n account: cachedAccount,\r\n idToken: cachedIdToken,\r\n accessToken: cachedAccessToken,\r\n refreshToken: cachedRefreshToken,\r\n appMetadata: cachedAppMetadata,\r\n };\r\n }\r\n /**\r\n * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.\r\n *\r\n * Optionally takes a state string that is set as-is in the response.\r\n *\r\n * @param cacheRecord\r\n * @param idTokenObj\r\n * @param fromTokenCache\r\n * @param stateString\r\n */\r\n static async generateAuthenticationResult(cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenClaims, requestState, serverTokenResponse, requestId) {\r\n let accessToken = Constants.EMPTY_STRING;\r\n let responseScopes = [];\r\n let expiresOn = null;\r\n let extExpiresOn;\r\n let refreshOn;\r\n let familyId = Constants.EMPTY_STRING;\r\n if (cacheRecord.accessToken) {\r\n /*\r\n * if the request object has `popKid` property, `signPopToken` will be set to false and\r\n * the token will be returned unsigned\r\n */\r\n if (cacheRecord.accessToken.tokenType ===\r\n AuthenticationScheme.POP &&\r\n !request.popKid) {\r\n const popTokenGenerator = new PopTokenGenerator(cryptoObj);\r\n const { secret, keyId } = cacheRecord.accessToken;\r\n if (!keyId) {\r\n throw createClientAuthError(keyIdMissing);\r\n }\r\n accessToken = await popTokenGenerator.signPopToken(secret, keyId, request);\r\n }\r\n else {\r\n accessToken = cacheRecord.accessToken.secret;\r\n }\r\n responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();\r\n expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);\r\n extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);\r\n if (cacheRecord.accessToken.refreshOn) {\r\n refreshOn = new Date(Number(cacheRecord.accessToken.refreshOn) * 1000);\r\n }\r\n }\r\n if (cacheRecord.appMetadata) {\r\n familyId =\r\n cacheRecord.appMetadata.familyId === THE_FAMILY_ID\r\n ? THE_FAMILY_ID\r\n : "";\r\n }\r\n const uid = idTokenClaims?.oid || idTokenClaims?.sub || "";\r\n const tid = idTokenClaims?.tid || "";\r\n // for hybrid + native bridge enablement, send back the native account Id\r\n if (serverTokenResponse?.spa_accountid && !!cacheRecord.account) {\r\n cacheRecord.account.nativeAccountId =\r\n serverTokenResponse?.spa_accountid;\r\n }\r\n const accountInfo = cacheRecord.account\r\n ? updateAccountTenantProfileData(cacheRecord.account.getAccountInfo(), undefined, // tenantProfile optional\r\n idTokenClaims, cacheRecord.idToken?.secret)\r\n : null;\r\n return {\r\n authority: authority.canonicalAuthority,\r\n uniqueId: uid,\r\n tenantId: tid,\r\n scopes: responseScopes,\r\n account: accountInfo,\r\n idToken: cacheRecord?.idToken?.secret || "",\r\n idTokenClaims: idTokenClaims || {},\r\n accessToken: accessToken,\r\n fromCache: fromTokenCache,\r\n expiresOn: expiresOn,\r\n extExpiresOn: extExpiresOn,\r\n refreshOn: refreshOn,\r\n correlationId: request.correlationId,\r\n requestId: requestId || Constants.EMPTY_STRING,\r\n familyId: familyId,\r\n tokenType: cacheRecord.accessToken?.tokenType || Constants.EMPTY_STRING,\r\n state: requestState\r\n ? requestState.userRequestState\r\n : Constants.EMPTY_STRING,\r\n cloudGraphHostName: cacheRecord.account?.cloudGraphHostName ||\r\n Constants.EMPTY_STRING,\r\n msGraphHost: cacheRecord.account?.msGraphHost || Constants.EMPTY_STRING,\r\n code: serverTokenResponse?.spa_code,\r\n fromNativeBroker: false,\r\n };\r\n }\r\n}\r\nfunction buildAccountToCache(cacheStorage, authority, homeAccountId, base64Decode, idTokenClaims, clientInfo, environment, claimsTenantId, authCodePayload, nativeAccountId, logger) {\r\n logger?.verbose("setCachedAccount called");\r\n // Check if base account is already cached\r\n const accountKeys = cacheStorage.getAccountKeys();\r\n const baseAccountKey = accountKeys.find((accountKey) => {\r\n return accountKey.startsWith(homeAccountId);\r\n });\r\n let cachedAccount = null;\r\n if (baseAccountKey) {\r\n cachedAccount = cacheStorage.getAccount(baseAccountKey, logger);\r\n }\r\n const baseAccount = cachedAccount ||\r\n AccountEntity.createAccount({\r\n homeAccountId,\r\n idTokenClaims,\r\n clientInfo,\r\n environment,\r\n cloudGraphHostName: authCodePayload?.cloud_graph_host_name,\r\n msGraphHost: authCodePayload?.msgraph_host,\r\n nativeAccountId: nativeAccountId,\r\n }, authority, base64Decode);\r\n const tenantProfiles = baseAccount.tenantProfiles || [];\r\n const tenantId = claimsTenantId || baseAccount.realm;\r\n if (tenantId &&\r\n !tenantProfiles.find((tenantProfile) => {\r\n return tenantProfile.tenantId === tenantId;\r\n })) {\r\n const newTenantProfile = buildTenantProfile(homeAccountId, baseAccount.localAccountId, tenantId, idTokenClaims);\r\n tenantProfiles.push(newTenantProfile);\r\n }\r\n baseAccount.tenantProfiles = tenantProfiles;\r\n return baseAccount;\r\n}\n\n\n//# sourceMappingURL=ResponseHandler.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/utils/ClientAssertionUtils.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nasync function getClientAssertion(clientAssertion, clientId, tokenEndpoint) {\r\n if (typeof clientAssertion === "string") {\r\n return clientAssertion;\r\n }\r\n else {\r\n const config = {\r\n clientId: clientId,\r\n tokenEndpoint: tokenEndpoint,\r\n };\r\n return clientAssertion(config);\r\n }\r\n}\n\n\n//# sourceMappingURL=ClientAssertionUtils.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/client/AuthorizationCodeClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Oauth2.0 Authorization Code client\r\n * @internal\r\n */\r\nclass AuthorizationCodeClient extends BaseClient {\r\n constructor(configuration, performanceClient) {\r\n super(configuration, performanceClient);\r\n // Flag to indicate if client is for hybrid spa auth code redemption\r\n this.includeRedirectUri = true;\r\n this.oidcDefaultScopes =\r\n this.config.authOptions.authority.options.OIDCOptions?.defaultScopes;\r\n }\r\n /**\r\n * Creates the URL of the authorization request letting the user input credentials and consent to the\r\n * application. The URL target the /authorize endpoint of the authority configured in the\r\n * application object.\r\n *\r\n * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI\r\n * sent in the request and should contain an authorization code, which can then be used to acquire tokens via\r\n * acquireToken(AuthorizationCodeRequest)\r\n * @param request\r\n */\r\n async getAuthCodeUrl(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.GetAuthCodeUrl, request.correlationId);\r\n const queryString = await invokeAsync(this.createAuthCodeUrlQueryString.bind(this), PerformanceEvents.AuthClientCreateQueryString, this.logger, this.performanceClient, request.correlationId)(request);\r\n return UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString);\r\n }\r\n /**\r\n * API to acquire a token in exchange of \'authorization_code` acquired by the user in the first leg of the\r\n * authorization_code_grant\r\n * @param request\r\n */\r\n async acquireToken(request, authCodePayload) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientAcquireToken, request.correlationId);\r\n if (!request.code) {\r\n throw createClientAuthError(requestCannotBeMade);\r\n }\r\n const reqTimestamp = nowSeconds();\r\n const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.AuthClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(this.authority, request);\r\n // Retrieve requestId from response headers\r\n const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];\r\n const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin, this.performanceClient);\r\n // Validate response. This function throws a server error if an error is returned by the server.\r\n responseHandler.validateTokenResponse(response.body);\r\n return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, authCodePayload, undefined, undefined, undefined, requestId);\r\n }\r\n /**\r\n * Handles the hash fragment response from public client code request. Returns a code response used by\r\n * the client to exchange for a token in acquireToken.\r\n * @param hashFragment\r\n */\r\n handleFragmentResponse(serverParams, cachedState) {\r\n // Handle responses.\r\n const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);\r\n // Get code response\r\n responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState);\r\n // throw when there is no auth code in the response\r\n if (!serverParams.code) {\r\n throw createClientAuthError(authorizationCodeMissingFromServerResponse);\r\n }\r\n return serverParams;\r\n }\r\n /**\r\n * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n * @param authorityUri\r\n */\r\n getLogoutUri(logoutRequest) {\r\n // Throw error if logoutRequest is null/undefined\r\n if (!logoutRequest) {\r\n throw createClientConfigurationError(logoutRequestEmpty);\r\n }\r\n const queryString = this.createLogoutUrlQueryString(logoutRequest);\r\n // Construct logout URI\r\n return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);\r\n }\r\n /**\r\n * Executes POST request to token endpoint\r\n * @param authority\r\n * @param request\r\n */\r\n async executeTokenRequest(authority, request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientExecuteTokenRequest, request.correlationId);\r\n const queryParametersString = this.createTokenQueryParameters(request);\r\n const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);\r\n const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.AuthClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);\r\n let ccsCredential = undefined;\r\n if (request.clientInfo) {\r\n try {\r\n const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils.base64Decode);\r\n ccsCredential = {\r\n credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n };\r\n }\r\n catch (e) {\r\n this.logger.verbose("Could not parse client info for CCS Header: " + e);\r\n }\r\n }\r\n const headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);\r\n const thumbprint = {\r\n clientId: request.tokenBodyParameters?.clientId ||\r\n this.config.authOptions.clientId,\r\n authority: authority.canonicalAuthority,\r\n scopes: request.scopes,\r\n claims: request.claims,\r\n authenticationScheme: request.authenticationScheme,\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n resourceRequestUri: request.resourceRequestUri,\r\n shrClaims: request.shrClaims,\r\n sshKid: request.sshKid,\r\n };\r\n return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.AuthorizationCodeClientExecutePostToTokenEndpoint);\r\n }\r\n /**\r\n * Generates a map for all the params to be sent to the service\r\n * @param request\r\n */\r\n async createTokenRequestBody(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateTokenRequestBody, request.correlationId);\r\n const parameterBuilder = new RequestParameterBuilder(request.correlationId, this.performanceClient);\r\n parameterBuilder.addClientId(request.embeddedClientId ||\r\n request.tokenBodyParameters?.[CLIENT_ID] ||\r\n this.config.authOptions.clientId);\r\n /*\r\n * For hybrid spa flow, there will be a code but no verifier\r\n * In this scenario, don\'t include redirect uri as auth code will not be bound to redirect URI\r\n */\r\n if (!this.includeRedirectUri) {\r\n // Just validate\r\n RequestValidator.validateRedirectUri(request.redirectUri);\r\n }\r\n else {\r\n // Validate and include redirect uri\r\n parameterBuilder.addRedirectUri(request.redirectUri);\r\n }\r\n // Add scope array, parameter builder will add default scopes and dedupe\r\n parameterBuilder.addScopes(request.scopes, true, this.oidcDefaultScopes);\r\n // add code: user set, not validated\r\n parameterBuilder.addAuthorizationCode(request.code);\r\n // Add library metadata\r\n parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n parameterBuilder.addThrottling();\r\n if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {\r\n parameterBuilder.addServerTelemetry(this.serverTelemetryManager);\r\n }\r\n // add code_verifier if passed\r\n if (request.codeVerifier) {\r\n parameterBuilder.addCodeVerifier(request.codeVerifier);\r\n }\r\n if (this.config.clientCredentials.clientSecret) {\r\n parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);\r\n }\r\n if (this.config.clientCredentials.clientAssertion) {\r\n const clientAssertion = this.config.clientCredentials.clientAssertion;\r\n parameterBuilder.addClientAssertion(await getClientAssertion(clientAssertion.assertion, this.config.authOptions.clientId, request.resourceRequestUri));\r\n parameterBuilder.addClientAssertionType(clientAssertion.assertionType);\r\n }\r\n parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);\r\n parameterBuilder.addClientInfo();\r\n if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);\r\n let reqCnfData;\r\n if (!request.popKid) {\r\n const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);\r\n reqCnfData = generatedReqCnfData.reqCnfString;\r\n }\r\n else {\r\n reqCnfData = this.cryptoUtils.encodeKid(request.popKid);\r\n }\r\n // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)\r\n parameterBuilder.addPopToken(reqCnfData);\r\n }\r\n else if (request.authenticationScheme === AuthenticationScheme.SSH) {\r\n if (request.sshJwk) {\r\n parameterBuilder.addSshJwk(request.sshJwk);\r\n }\r\n else {\r\n throw createClientConfigurationError(missingSshJwk);\r\n }\r\n }\r\n if (!StringUtils.isEmptyObj(request.claims) ||\r\n (this.config.authOptions.clientCapabilities &&\r\n this.config.authOptions.clientCapabilities.length > 0)) {\r\n parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n }\r\n let ccsCred = undefined;\r\n if (request.clientInfo) {\r\n try {\r\n const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils.base64Decode);\r\n ccsCred = {\r\n credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n };\r\n }\r\n catch (e) {\r\n this.logger.verbose("Could not parse client info for CCS Header: " + e);\r\n }\r\n }\r\n else {\r\n ccsCred = request.ccsCredential;\r\n }\r\n // Adds these as parameters in the request instead of headers to prevent CORS preflight request\r\n if (this.config.systemOptions.preventCorsPreflight && ccsCred) {\r\n switch (ccsCred.type) {\r\n case CcsCredentialType.HOME_ACCOUNT_ID:\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);\r\n parameterBuilder.addCcsOid(clientInfo);\r\n }\r\n catch (e) {\r\n this.logger.verbose("Could not parse home account ID for CCS Header: " +\r\n e);\r\n }\r\n break;\r\n case CcsCredentialType.UPN:\r\n parameterBuilder.addCcsUpn(ccsCred.credential);\r\n break;\r\n }\r\n }\r\n if (request.embeddedClientId) {\r\n parameterBuilder.addBrokerParameters({\r\n brokerClientId: this.config.authOptions.clientId,\r\n brokerRedirectUri: this.config.authOptions.redirectUri,\r\n });\r\n }\r\n if (request.tokenBodyParameters) {\r\n parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);\r\n }\r\n // Add hybrid spa parameters if not already provided\r\n if (request.enableSpaAuthorizationCode &&\r\n (!request.tokenBodyParameters ||\r\n !request.tokenBodyParameters[RETURN_SPA_CODE])) {\r\n parameterBuilder.addExtraQueryParameters({\r\n [RETURN_SPA_CODE]: "1",\r\n });\r\n }\r\n return parameterBuilder.createQueryString();\r\n }\r\n /**\r\n * This API validates the `AuthorizationCodeUrlRequest` and creates a URL\r\n * @param request\r\n */\r\n async createAuthCodeUrlQueryString(request) {\r\n // generate the correlationId if not set by the user and add\r\n const correlationId = request.correlationId ||\r\n this.config.cryptoInterface.createNewGuid();\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateQueryString, correlationId);\r\n const parameterBuilder = new RequestParameterBuilder(correlationId, this.performanceClient);\r\n parameterBuilder.addClientId(request.embeddedClientId ||\r\n request.extraQueryParameters?.[CLIENT_ID] ||\r\n this.config.authOptions.clientId);\r\n const requestScopes = [\r\n ...(request.scopes || []),\r\n ...(request.extraScopesToConsent || []),\r\n ];\r\n parameterBuilder.addScopes(requestScopes, true, this.oidcDefaultScopes);\r\n // validate the redirectUri (to be a non null value)\r\n parameterBuilder.addRedirectUri(request.redirectUri);\r\n parameterBuilder.addCorrelationId(correlationId);\r\n // add response_mode. If not passed in it defaults to query.\r\n parameterBuilder.addResponseMode(request.responseMode);\r\n // add response_type = code\r\n parameterBuilder.addResponseTypeCode();\r\n // add library info parameters\r\n parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n if (!isOidcProtocolMode(this.config)) {\r\n parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n }\r\n // add client_info=1\r\n parameterBuilder.addClientInfo();\r\n if (request.codeChallenge && request.codeChallengeMethod) {\r\n parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);\r\n }\r\n if (request.prompt) {\r\n parameterBuilder.addPrompt(request.prompt);\r\n }\r\n if (request.domainHint) {\r\n parameterBuilder.addDomainHint(request.domainHint);\r\n }\r\n // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object\r\n if (request.prompt !== PromptValue.SELECT_ACCOUNT) {\r\n // AAD will throw if prompt=select_account is passed with an account hint\r\n if (request.sid && request.prompt === PromptValue.NONE) {\r\n // SessionID is only used in silent calls\r\n this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");\r\n parameterBuilder.addSid(request.sid);\r\n }\r\n else if (request.account) {\r\n const accountSid = this.extractAccountSid(request.account);\r\n let accountLoginHintClaim = this.extractLoginHint(request.account);\r\n if (accountLoginHintClaim && request.domainHint) {\r\n this.logger.warning(`AuthorizationCodeClient.createAuthCodeUrlQueryString: "domainHint" param is set, skipping opaque "login_hint" claim. Please consider not passing domainHint`);\r\n accountLoginHintClaim = null;\r\n }\r\n // If login_hint claim is present, use it over sid/username\r\n if (accountLoginHintClaim) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");\r\n parameterBuilder.addLoginHint(accountLoginHintClaim);\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n parameterBuilder.addCcsOid(clientInfo);\r\n }\r\n catch (e) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");\r\n }\r\n }\r\n else if (accountSid && request.prompt === PromptValue.NONE) {\r\n /*\r\n * If account and loginHint are provided, we will check account first for sid before adding loginHint\r\n * SessionId is only used in silent calls\r\n */\r\n this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");\r\n parameterBuilder.addSid(accountSid);\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n parameterBuilder.addCcsOid(clientInfo);\r\n }\r\n catch (e) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");\r\n }\r\n }\r\n else if (request.loginHint) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");\r\n parameterBuilder.addLoginHint(request.loginHint);\r\n parameterBuilder.addCcsUpn(request.loginHint);\r\n }\r\n else if (request.account.username) {\r\n // Fallback to account username if provided\r\n this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");\r\n parameterBuilder.addLoginHint(request.account.username);\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n parameterBuilder.addCcsOid(clientInfo);\r\n }\r\n catch (e) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");\r\n }\r\n }\r\n }\r\n else if (request.loginHint) {\r\n this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");\r\n parameterBuilder.addLoginHint(request.loginHint);\r\n parameterBuilder.addCcsUpn(request.loginHint);\r\n }\r\n }\r\n else {\r\n this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");\r\n }\r\n if (request.nonce) {\r\n parameterBuilder.addNonce(request.nonce);\r\n }\r\n if (request.state) {\r\n parameterBuilder.addState(request.state);\r\n }\r\n if (request.claims ||\r\n (this.config.authOptions.clientCapabilities &&\r\n this.config.authOptions.clientCapabilities.length > 0)) {\r\n parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n }\r\n if (request.embeddedClientId) {\r\n parameterBuilder.addBrokerParameters({\r\n brokerClientId: this.config.authOptions.clientId,\r\n brokerRedirectUri: this.config.authOptions.redirectUri,\r\n });\r\n }\r\n this.addExtraQueryParams(request, parameterBuilder);\r\n if (request.nativeBroker) {\r\n // signal ests that this is a WAM call\r\n parameterBuilder.addNativeBroker();\r\n // pass the req_cnf for POP\r\n if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);\r\n // req_cnf is always sent as a string for SPAs\r\n let reqCnfData;\r\n if (!request.popKid) {\r\n const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);\r\n reqCnfData = generatedReqCnfData.reqCnfString;\r\n }\r\n else {\r\n reqCnfData = this.cryptoUtils.encodeKid(request.popKid);\r\n }\r\n parameterBuilder.addPopToken(reqCnfData);\r\n }\r\n }\r\n return parameterBuilder.createQueryString();\r\n }\r\n /**\r\n * This API validates the `EndSessionRequest` and creates a URL\r\n * @param request\r\n */\r\n createLogoutUrlQueryString(request) {\r\n const parameterBuilder = new RequestParameterBuilder(request.correlationId, this.performanceClient);\r\n if (request.postLogoutRedirectUri) {\r\n parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);\r\n }\r\n if (request.correlationId) {\r\n parameterBuilder.addCorrelationId(request.correlationId);\r\n }\r\n if (request.idTokenHint) {\r\n parameterBuilder.addIdTokenHint(request.idTokenHint);\r\n }\r\n if (request.state) {\r\n parameterBuilder.addState(request.state);\r\n }\r\n if (request.logoutHint) {\r\n parameterBuilder.addLogoutHint(request.logoutHint);\r\n }\r\n this.addExtraQueryParams(request, parameterBuilder);\r\n return parameterBuilder.createQueryString();\r\n }\r\n addExtraQueryParams(request, parameterBuilder) {\r\n const hasRequestInstanceAware = request.extraQueryParameters &&\r\n request.extraQueryParameters.hasOwnProperty("instance_aware");\r\n // Set instance_aware flag if config auth param is set\r\n if (!hasRequestInstanceAware && this.config.authOptions.instanceAware) {\r\n request.extraQueryParameters = request.extraQueryParameters || {};\r\n request.extraQueryParameters["instance_aware"] = "true";\r\n }\r\n if (request.extraQueryParameters) {\r\n parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);\r\n }\r\n }\r\n /**\r\n * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.\r\n * @param account\r\n */\r\n extractAccountSid(account) {\r\n return account.idTokenClaims?.sid || null;\r\n }\r\n extractLoginHint(account) {\r\n return account.idTokenClaims?.login_hint || null;\r\n }\r\n}\n\n\n//# sourceMappingURL=AuthorizationCodeClient.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/telemetry/server/ServerTelemetryManager.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst skuGroupSeparator = ",";\r\nconst skuValueSeparator = "|";\r\nfunction makeExtraSkuString(params) {\r\n const { skus, libraryName, libraryVersion, extensionName, extensionVersion, } = params;\r\n const skuMap = new Map([\r\n [0, [libraryName, libraryVersion]],\r\n [2, [extensionName, extensionVersion]],\r\n ]);\r\n let skuArr = [];\r\n if (skus?.length) {\r\n skuArr = skus.split(skuGroupSeparator);\r\n // Ignore invalid input sku param\r\n if (skuArr.length < 4) {\r\n return skus;\r\n }\r\n }\r\n else {\r\n skuArr = Array.from({ length: 4 }, () => skuValueSeparator);\r\n }\r\n skuMap.forEach((value, key) => {\r\n if (value.length === 2 && value[0]?.length && value[1]?.length) {\r\n setSku({\r\n skuArr,\r\n index: key,\r\n skuName: value[0],\r\n skuVersion: value[1],\r\n });\r\n }\r\n });\r\n return skuArr.join(skuGroupSeparator);\r\n}\r\nfunction setSku(params) {\r\n const { skuArr, index, skuName, skuVersion } = params;\r\n if (index >= skuArr.length) {\r\n return;\r\n }\r\n skuArr[index] = [skuName, skuVersion].join(skuValueSeparator);\r\n}\r\n/** @internal */\r\nclass ServerTelemetryManager {\r\n constructor(telemetryRequest, cacheManager) {\r\n this.cacheOutcome = CacheOutcome.NOT_APPLICABLE;\r\n this.cacheManager = cacheManager;\r\n this.apiId = telemetryRequest.apiId;\r\n this.correlationId = telemetryRequest.correlationId;\r\n this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;\r\n this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;\r\n this.telemetryCacheKey =\r\n SERVER_TELEM_CONSTANTS.CACHE_KEY +\r\n Separators.CACHE_KEY_SEPARATOR +\r\n telemetryRequest.clientId;\r\n }\r\n /**\r\n * API to add MSER Telemetry to request\r\n */\r\n generateCurrentRequestHeaderValue() {\r\n const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${this.cacheOutcome}`;\r\n const platformFieldsArr = [this.wrapperSKU, this.wrapperVer];\r\n const nativeBrokerErrorCode = this.getNativeBrokerErrorCode();\r\n if (nativeBrokerErrorCode?.length) {\r\n platformFieldsArr.push(`broker_error=${nativeBrokerErrorCode}`);\r\n }\r\n const platformFields = platformFieldsArr.join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n const regionDiscoveryFields = this.getRegionDiscoveryFields();\r\n const requestWithRegionDiscoveryFields = [\r\n request,\r\n regionDiscoveryFields,\r\n ].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n return [\r\n SERVER_TELEM_CONSTANTS.SCHEMA_VERSION,\r\n requestWithRegionDiscoveryFields,\r\n platformFields,\r\n ].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);\r\n }\r\n /**\r\n * API to add MSER Telemetry for the last failed request\r\n */\r\n generateLastRequestHeaderValue() {\r\n const lastRequests = this.getLastRequests();\r\n const maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);\r\n const failedRequests = lastRequests.failedRequests\r\n .slice(0, 2 * maxErrors)\r\n .join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n const errors = lastRequests.errors\r\n .slice(0, maxErrors)\r\n .join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n const errorCount = lastRequests.errors.length;\r\n // Indicate whether this header contains all data or partial data\r\n const overflow = maxErrors < errorCount\r\n ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE\r\n : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;\r\n const platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n return [\r\n SERVER_TELEM_CONSTANTS.SCHEMA_VERSION,\r\n lastRequests.cacheHits,\r\n failedRequests,\r\n errors,\r\n platformFields,\r\n ].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);\r\n }\r\n /**\r\n * API to cache token failures for MSER data capture\r\n * @param error\r\n */\r\n cacheFailedRequest(error) {\r\n const lastRequests = this.getLastRequests();\r\n if (lastRequests.errors.length >=\r\n SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {\r\n // Remove a cached error to make room, first in first out\r\n lastRequests.failedRequests.shift(); // apiId\r\n lastRequests.failedRequests.shift(); // correlationId\r\n lastRequests.errors.shift();\r\n }\r\n lastRequests.failedRequests.push(this.apiId, this.correlationId);\r\n if (error instanceof Error && !!error && error.toString()) {\r\n if (error instanceof AuthError) {\r\n if (error.subError) {\r\n lastRequests.errors.push(error.subError);\r\n }\r\n else if (error.errorCode) {\r\n lastRequests.errors.push(error.errorCode);\r\n }\r\n else {\r\n lastRequests.errors.push(error.toString());\r\n }\r\n }\r\n else {\r\n lastRequests.errors.push(error.toString());\r\n }\r\n }\r\n else {\r\n lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);\r\n }\r\n this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n return;\r\n }\r\n /**\r\n * Update server telemetry cache entry by incrementing cache hit counter\r\n */\r\n incrementCacheHits() {\r\n const lastRequests = this.getLastRequests();\r\n lastRequests.cacheHits += 1;\r\n this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n return lastRequests.cacheHits;\r\n }\r\n /**\r\n * Get the server telemetry entity from cache or initialize a new one\r\n */\r\n getLastRequests() {\r\n const initialValue = {\r\n failedRequests: [],\r\n errors: [],\r\n cacheHits: 0,\r\n };\r\n const lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey);\r\n return lastRequests || initialValue;\r\n }\r\n /**\r\n * Remove server telemetry cache entry\r\n */\r\n clearTelemetryCache() {\r\n const lastRequests = this.getLastRequests();\r\n const numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);\r\n const errorCount = lastRequests.errors.length;\r\n if (numErrorsFlushed === errorCount) {\r\n // All errors were sent on last request, clear Telemetry cache\r\n this.cacheManager.removeItem(this.telemetryCacheKey);\r\n }\r\n else {\r\n // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed\r\n const serverTelemEntity = {\r\n failedRequests: lastRequests.failedRequests.slice(numErrorsFlushed * 2),\r\n errors: lastRequests.errors.slice(numErrorsFlushed),\r\n cacheHits: 0,\r\n };\r\n this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);\r\n }\r\n }\r\n /**\r\n * Returns the maximum number of errors that can be flushed to the server in the next network request\r\n * @param serverTelemetryEntity\r\n */\r\n static maxErrorsToSend(serverTelemetryEntity) {\r\n let i;\r\n let maxErrors = 0;\r\n let dataSize = 0;\r\n const errorCount = serverTelemetryEntity.errors.length;\r\n for (i = 0; i < errorCount; i++) {\r\n // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs\r\n const apiId = serverTelemetryEntity.failedRequests[2 * i] ||\r\n Constants.EMPTY_STRING;\r\n const correlationId = serverTelemetryEntity.failedRequests[2 * i + 1] ||\r\n Constants.EMPTY_STRING;\r\n const errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;\r\n // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators\r\n dataSize +=\r\n apiId.toString().length +\r\n correlationId.toString().length +\r\n errorCode.length +\r\n 3;\r\n if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {\r\n // Adding this entry to the header would still keep header size below the limit\r\n maxErrors += 1;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n return maxErrors;\r\n }\r\n /**\r\n * Get the region discovery fields\r\n *\r\n * @returns string\r\n */\r\n getRegionDiscoveryFields() {\r\n const regionDiscoveryFields = [];\r\n regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);\r\n regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);\r\n regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);\r\n return regionDiscoveryFields.join(",");\r\n }\r\n /**\r\n * Update the region discovery metadata\r\n *\r\n * @param regionDiscoveryMetadata\r\n * @returns void\r\n */\r\n updateRegionDiscoveryMetadata(regionDiscoveryMetadata) {\r\n this.regionUsed = regionDiscoveryMetadata.region_used;\r\n this.regionSource = regionDiscoveryMetadata.region_source;\r\n this.regionOutcome = regionDiscoveryMetadata.region_outcome;\r\n }\r\n /**\r\n * Set cache outcome\r\n */\r\n setCacheOutcome(cacheOutcome) {\r\n this.cacheOutcome = cacheOutcome;\r\n }\r\n setNativeBrokerErrorCode(errorCode) {\r\n const lastRequests = this.getLastRequests();\r\n lastRequests.nativeBrokerErrorCode = errorCode;\r\n this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n }\r\n getNativeBrokerErrorCode() {\r\n return this.getLastRequests().nativeBrokerErrorCode;\r\n }\r\n clearNativeBrokerErrorCode() {\r\n const lastRequests = this.getLastRequests();\r\n delete lastRequests.nativeBrokerErrorCode;\r\n this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n }\r\n static makeExtraSkuString(params) {\r\n return makeExtraSkuString(params);\r\n }\r\n}\n\n\n//# sourceMappingURL=ServerTelemetryManager.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/BaseInteractionClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass BaseInteractionClient {\r\n constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) {\r\n this.config = config;\r\n this.browserStorage = storageImpl;\r\n this.browserCrypto = browserCrypto;\r\n this.networkClient = this.config.system.networkClient;\r\n this.eventHandler = eventHandler;\r\n this.navigationClient = navigationClient;\r\n this.nativeMessageHandler = nativeMessageHandler;\r\n this.correlationId = correlationId || createNewGuid();\r\n this.logger = logger.clone(BrowserConstants.MSAL_SKU, packageMetadata_version, this.correlationId);\r\n this.performanceClient = performanceClient;\r\n }\r\n async clearCacheOnLogout(account) {\r\n if (account) {\r\n if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {\r\n this.logger.verbose("Setting active account to null");\r\n this.browserStorage.setActiveAccount(null);\r\n }\r\n // Clear given account.\r\n try {\r\n await this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account));\r\n this.logger.verbose("Cleared cache items belonging to the account provided in the logout request.");\r\n }\r\n catch (error) {\r\n this.logger.error("Account provided in logout request was not found. Local cache unchanged.");\r\n }\r\n }\r\n else {\r\n try {\r\n this.logger.verbose("No account provided in logout request, clearing all cache items.", this.correlationId);\r\n // Clear all accounts and tokens\r\n await this.browserStorage.clear();\r\n // Clear any stray keys from IndexedDB\r\n await this.browserCrypto.clearKeystore();\r\n }\r\n catch (e) {\r\n this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged.");\r\n }\r\n }\r\n }\r\n /**\r\n *\r\n * Use to get the redirect uri configured in MSAL or null.\r\n * @param requestRedirectUri\r\n * @returns Redirect URL\r\n *\r\n */\r\n getRedirectUri(requestRedirectUri) {\r\n this.logger.verbose("getRedirectUri called");\r\n const redirectUri = requestRedirectUri || this.config.auth.redirectUri;\r\n return UrlString.getAbsoluteUrl(redirectUri, getCurrentUri());\r\n }\r\n /**\r\n *\r\n * @param apiId\r\n * @param correlationId\r\n * @param forceRefresh\r\n */\r\n initializeServerTelemetryManager(apiId, forceRefresh) {\r\n this.logger.verbose("initializeServerTelemetryManager called");\r\n const telemetryPayload = {\r\n clientId: this.config.auth.clientId,\r\n correlationId: this.correlationId,\r\n apiId: apiId,\r\n forceRefresh: forceRefresh || false,\r\n wrapperSKU: this.browserStorage.getWrapperMetadata()[0],\r\n wrapperVer: this.browserStorage.getWrapperMetadata()[1],\r\n };\r\n return new ServerTelemetryManager(telemetryPayload, this.browserStorage);\r\n }\r\n /**\r\n * Used to get a discovered version of the default authority.\r\n * @param params {\r\n * requestAuthority?: string;\r\n * requestAzureCloudOptions?: AzureCloudOptions;\r\n * requestExtraQueryParameters?: StringDict;\r\n * account?: AccountInfo;\r\n * }\r\n */\r\n async getDiscoveredAuthority(params) {\r\n const { account } = params;\r\n const instanceAwareEQ = params.requestExtraQueryParameters &&\r\n params.requestExtraQueryParameters.hasOwnProperty("instance_aware")\r\n ? params.requestExtraQueryParameters["instance_aware"]\r\n : undefined;\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);\r\n const authorityOptions = {\r\n protocolMode: this.config.auth.protocolMode,\r\n OIDCOptions: this.config.auth.OIDCOptions,\r\n knownAuthorities: this.config.auth.knownAuthorities,\r\n cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n authorityMetadata: this.config.auth.authorityMetadata,\r\n skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,\r\n };\r\n // build authority string based on auth params, precedence - azureCloudInstance + tenant >> authority\r\n const resolvedAuthority = params.requestAuthority || this.config.auth.authority;\r\n const resolvedInstanceAware = instanceAwareEQ?.length\r\n ? instanceAwareEQ === "true"\r\n : this.config.auth.instanceAware;\r\n const userAuthority = account && resolvedInstanceAware\r\n ? this.config.auth.authority.replace(UrlString.getDomainFromUrl(resolvedAuthority), account.environment)\r\n : resolvedAuthority;\r\n // fall back to the authority from config\r\n const builtAuthority = Authority.generateAuthority(userAuthority, params.requestAzureCloudOptions ||\r\n this.config.auth.azureCloudOptions);\r\n const discoveredAuthority = await invokeAsync(createDiscoveredInstance, PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, this.logger, this.performanceClient, this.correlationId)(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger, this.correlationId, this.performanceClient);\r\n if (account && !discoveredAuthority.isAlias(account.environment)) {\r\n throw createClientConfigurationError(authorityMismatch);\r\n }\r\n return discoveredAuthority;\r\n }\r\n}\n\n\n//# sourceMappingURL=BaseInteractionClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/crypto/PkceGenerator.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n// Constant byte array length\r\nconst RANDOM_BYTE_ARR_LENGTH = 32;\r\n/**\r\n * This file defines APIs to generate PKCE codes and code verifiers.\r\n */\r\n/**\r\n * Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636\r\n */\r\nasync function generatePkceCodes(performanceClient, logger, correlationId) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.GeneratePkceCodes, correlationId);\r\n const codeVerifier = invoke(generateCodeVerifier, PerformanceEvents.GenerateCodeVerifier, logger, performanceClient, correlationId)(performanceClient, logger, correlationId);\r\n const codeChallenge = await invokeAsync(generateCodeChallengeFromVerifier, PerformanceEvents.GenerateCodeChallengeFromVerifier, logger, performanceClient, correlationId)(codeVerifier, performanceClient, logger, correlationId);\r\n return {\r\n verifier: codeVerifier,\r\n challenge: codeChallenge,\r\n };\r\n}\r\n/**\r\n * Generates a random 32 byte buffer and returns the base64\r\n * encoded string to be used as a PKCE Code Verifier\r\n */\r\nfunction generateCodeVerifier(performanceClient, logger, correlationId) {\r\n try {\r\n // Generate random values as utf-8\r\n const buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);\r\n invoke(getRandomValues, PerformanceEvents.GetRandomValues, logger, performanceClient, correlationId)(buffer);\r\n // encode verifier as base64\r\n const pkceCodeVerifierB64 = urlEncodeArr(buffer);\r\n return pkceCodeVerifierB64;\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(pkceNotCreated);\r\n }\r\n}\r\n/**\r\n * Creates a base64 encoded PKCE Code Challenge string from the\r\n * hash created from the PKCE Code Verifier supplied\r\n */\r\nasync function generateCodeChallengeFromVerifier(pkceCodeVerifier, performanceClient, logger, correlationId) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.GenerateCodeChallengeFromVerifier, correlationId);\r\n try {\r\n // hashed verifier\r\n const pkceHashedCodeVerifier = await invokeAsync(sha256Digest, PerformanceEvents.Sha256Digest, logger, performanceClient, correlationId)(pkceCodeVerifier, performanceClient, correlationId);\r\n // encode hash as base64\r\n return urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier));\r\n }\r\n catch (e) {\r\n throw createBrowserAuthError(pkceNotCreated);\r\n }\r\n}\n\n\n//# sourceMappingURL=PkceGenerator.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/request/RequestHelpers.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Initializer function for all request APIs\r\n * @param request\r\n */\r\nasync function initializeBaseRequest(request, config, performanceClient, logger) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.InitializeBaseRequest, request.correlationId);\r\n const authority = request.authority || config.auth.authority;\r\n const scopes = [...((request && request.scopes) || [])];\r\n const validatedRequest = {\r\n ...request,\r\n correlationId: request.correlationId,\r\n authority,\r\n scopes,\r\n };\r\n // Set authenticationScheme to BEARER if not explicitly set in the request\r\n if (!validatedRequest.authenticationScheme) {\r\n validatedRequest.authenticationScheme = AuthenticationScheme.BEARER;\r\n logger.verbose(\'Authentication Scheme wasn\\\'t explicitly set in request, defaulting to "Bearer" request\');\r\n }\r\n else {\r\n if (validatedRequest.authenticationScheme === AuthenticationScheme.SSH) {\r\n if (!request.sshJwk) {\r\n throw createClientConfigurationError(missingSshJwk);\r\n }\r\n if (!request.sshKid) {\r\n throw createClientConfigurationError(missingSshKid);\r\n }\r\n }\r\n logger.verbose(`Authentication Scheme set to "${validatedRequest.authenticationScheme}" as configured in Auth request`);\r\n }\r\n // Set requested claims hash if claims-based caching is enabled and claims were requested\r\n if (config.cache.claimsBasedCachingEnabled &&\r\n request.claims &&\r\n // Checks for empty stringified object "{}" which doesn\'t qualify as requested claims\r\n !StringUtils.isEmptyObj(request.claims)) {\r\n validatedRequest.requestedClaimsHash = await hashString(request.claims);\r\n }\r\n return validatedRequest;\r\n}\r\nasync function initializeSilentRequest(request, account, config, performanceClient, logger) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.InitializeSilentRequest, request.correlationId);\r\n const baseRequest = await invokeAsync(initializeBaseRequest, PerformanceEvents.InitializeBaseRequest, logger, performanceClient, request.correlationId)(request, config, performanceClient, logger);\r\n return {\r\n ...request,\r\n ...baseRequest,\r\n account: account,\r\n forceRefresh: request.forceRefresh || false,\r\n };\r\n}\n\n\n//# sourceMappingURL=RequestHelpers.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/StandardInteractionClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))\r\n */\r\nclass StandardInteractionClient extends BaseInteractionClient {\r\n /**\r\n * Generates an auth code request tied to the url request.\r\n * @param request\r\n */\r\n async initializeAuthorizationCodeRequest(request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.correlationId);\r\n const generatedPkceParams = await invokeAsync(generatePkceCodes, PerformanceEvents.GeneratePkceCodes, this.logger, this.performanceClient, this.correlationId)(this.performanceClient, this.logger, this.correlationId);\r\n const authCodeRequest = {\r\n ...request,\r\n redirectUri: request.redirectUri,\r\n code: Constants.EMPTY_STRING,\r\n codeVerifier: generatedPkceParams.verifier,\r\n };\r\n request.codeChallenge = generatedPkceParams.challenge;\r\n request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;\r\n return authCodeRequest;\r\n }\r\n /**\r\n * Initializer for the logout request.\r\n * @param logoutRequest\r\n */\r\n initializeLogoutRequest(logoutRequest) {\r\n this.logger.verbose("initializeLogoutRequest called", logoutRequest?.correlationId);\r\n const validLogoutRequest = {\r\n correlationId: this.correlationId || createNewGuid(),\r\n ...logoutRequest,\r\n };\r\n /**\r\n * Set logout_hint to be login_hint from ID Token Claims if present\r\n * and logoutHint attribute wasn\'t manually set in logout request\r\n */\r\n if (logoutRequest) {\r\n // If logoutHint isn\'t set and an account was passed in, try to extract logoutHint from ID Token Claims\r\n if (!logoutRequest.logoutHint) {\r\n if (logoutRequest.account) {\r\n const logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);\r\n if (logoutHint) {\r\n this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");\r\n validLogoutRequest.logoutHint = logoutHint;\r\n }\r\n }\r\n else {\r\n this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");\r\n }\r\n }\r\n else {\r\n this.logger.verbose("logoutHint has already been set in logoutRequest");\r\n }\r\n }\r\n else {\r\n this.logger.verbose("logoutHint will not be set since no logout request was configured");\r\n }\r\n /*\r\n * Only set redirect uri if logout request isn\'t provided or the set uri isn\'t null.\r\n * Otherwise, use passed uri, config, or current page.\r\n */\r\n if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {\r\n if (logoutRequest && logoutRequest.postLogoutRedirectUri) {\r\n this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);\r\n validLogoutRequest.postLogoutRedirectUri =\r\n UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, getCurrentUri());\r\n }\r\n else if (this.config.auth.postLogoutRedirectUri === null) {\r\n this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);\r\n }\r\n else if (this.config.auth.postLogoutRedirectUri) {\r\n this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);\r\n validLogoutRequest.postLogoutRedirectUri =\r\n UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, getCurrentUri());\r\n }\r\n else {\r\n this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);\r\n validLogoutRequest.postLogoutRedirectUri =\r\n UrlString.getAbsoluteUrl(getCurrentUri(), getCurrentUri());\r\n }\r\n }\r\n else {\r\n this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);\r\n }\r\n return validLogoutRequest;\r\n }\r\n /**\r\n * Parses login_hint ID Token Claim out of AccountInfo object to be used as\r\n * logout_hint in end session request.\r\n * @param account\r\n */\r\n getLogoutHintFromIdTokenClaims(account) {\r\n const idTokenClaims = account.idTokenClaims;\r\n if (idTokenClaims) {\r\n if (idTokenClaims.login_hint) {\r\n return idTokenClaims.login_hint;\r\n }\r\n else {\r\n this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");\r\n }\r\n }\r\n else {\r\n this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");\r\n }\r\n return null;\r\n }\r\n /**\r\n * Creates an Authorization Code Client with the given authority, or the default authority.\r\n * @param params {\r\n * serverTelemetryManager: ServerTelemetryManager;\r\n * authorityUrl?: string;\r\n * requestAzureCloudOptions?: AzureCloudOptions;\r\n * requestExtraQueryParameters?: StringDict;\r\n * account?: AccountInfo;\r\n * }\r\n */\r\n async createAuthCodeClient(params) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.correlationId);\r\n // Create auth module.\r\n const clientConfig = await invokeAsync(this.getClientConfiguration.bind(this), PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.logger, this.performanceClient, this.correlationId)(params);\r\n return new AuthorizationCodeClient(clientConfig, this.performanceClient);\r\n }\r\n /**\r\n * Creates a Client Configuration object with the given request authority, or the default authority.\r\n * @param params {\r\n * serverTelemetryManager: ServerTelemetryManager;\r\n * requestAuthority?: string;\r\n * requestAzureCloudOptions?: AzureCloudOptions;\r\n * requestExtraQueryParameters?: boolean;\r\n * account?: AccountInfo;\r\n * }\r\n */\r\n async getClientConfiguration(params) {\r\n const { serverTelemetryManager, requestAuthority, requestAzureCloudOptions, requestExtraQueryParameters, account, } = params;\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);\r\n const discoveredAuthority = await invokeAsync(this.getDiscoveredAuthority.bind(this), PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.logger, this.performanceClient, this.correlationId)({\r\n requestAuthority,\r\n requestAzureCloudOptions,\r\n requestExtraQueryParameters,\r\n account,\r\n });\r\n const logger = this.config.system.loggerOptions;\r\n return {\r\n authOptions: {\r\n clientId: this.config.auth.clientId,\r\n authority: discoveredAuthority,\r\n clientCapabilities: this.config.auth.clientCapabilities,\r\n redirectUri: this.config.auth.redirectUri,\r\n },\r\n systemOptions: {\r\n tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,\r\n preventCorsPreflight: true,\r\n },\r\n loggerOptions: {\r\n loggerCallback: logger.loggerCallback,\r\n piiLoggingEnabled: logger.piiLoggingEnabled,\r\n logLevel: logger.logLevel,\r\n correlationId: this.correlationId,\r\n },\r\n cacheOptions: {\r\n claimsBasedCachingEnabled: this.config.cache.claimsBasedCachingEnabled,\r\n },\r\n cryptoInterface: this.browserCrypto,\r\n networkInterface: this.networkClient,\r\n storageInterface: this.browserStorage,\r\n serverTelemetryManager: serverTelemetryManager,\r\n libraryInfo: {\r\n sku: BrowserConstants.MSAL_SKU,\r\n version: packageMetadata_version,\r\n cpu: Constants.EMPTY_STRING,\r\n os: Constants.EMPTY_STRING,\r\n },\r\n telemetry: this.config.telemetry,\r\n };\r\n }\r\n /**\r\n * Helper to initialize required request parameters for interactive APIs and ssoSilent()\r\n * @param request\r\n * @param interactionType\r\n */\r\n async initializeAuthorizationRequest(request, interactionType) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.correlationId);\r\n const redirectUri = this.getRedirectUri(request.redirectUri);\r\n const browserState = {\r\n interactionType: interactionType,\r\n };\r\n const state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);\r\n const baseRequest = await invokeAsync(initializeBaseRequest, PerformanceEvents.InitializeBaseRequest, this.logger, this.performanceClient, this.correlationId)({ ...request, correlationId: this.correlationId }, this.config, this.performanceClient, this.logger);\r\n const validatedRequest = {\r\n ...baseRequest,\r\n redirectUri: redirectUri,\r\n state: state,\r\n nonce: request.nonce || createNewGuid(),\r\n responseMode: this.config.auth.OIDCOptions\r\n .serverResponseType,\r\n };\r\n // Skip active account lookup if either login hint or session id is set\r\n if (request.loginHint || request.sid) {\r\n return validatedRequest;\r\n }\r\n const account = request.account || this.browserStorage.getActiveAccount();\r\n if (account) {\r\n this.logger.verbose("Setting validated request account", this.correlationId);\r\n this.logger.verbosePii(`Setting validated request account: ${account.homeAccountId}`, this.correlationId);\r\n validatedRequest.account = account;\r\n }\r\n // Check for ADAL/MSAL v1 SSO\r\n if (!validatedRequest.loginHint && !account) {\r\n const legacyLoginHint = this.browserStorage.getLegacyLoginHint();\r\n if (legacyLoginHint) {\r\n validatedRequest.loginHint = legacyLoginHint;\r\n }\r\n }\r\n return validatedRequest;\r\n }\r\n}\n\n\n//# sourceMappingURL=StandardInteractionClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/NativeAuthErrorCodes.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst contentError = "ContentError";\r\nconst userSwitch = "user_switch";\n\n\n//# sourceMappingURL=NativeAuthErrorCodes.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/broker/nativeBroker/NativeStatusCodes.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n// Status Codes that can be thrown by WAM\r\nconst USER_INTERACTION_REQUIRED = "USER_INTERACTION_REQUIRED";\r\nconst USER_CANCEL = "USER_CANCEL";\r\nconst NO_NETWORK = "NO_NETWORK";\r\nconst PERSISTENT_ERROR = "PERSISTENT_ERROR";\r\nconst DISABLED = "DISABLED";\r\nconst ACCOUNT_UNAVAILABLE = "ACCOUNT_UNAVAILABLE";\n\n\n//# sourceMappingURL=NativeStatusCodes.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/NativeAuthError.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst INVALID_METHOD_ERROR = -2147186943;\r\nconst NativeAuthErrorMessages = {\r\n [userSwitch]: "User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again.",\r\n};\r\nclass NativeAuthError extends AuthError {\r\n constructor(errorCode, description, ext) {\r\n super(errorCode, description);\r\n Object.setPrototypeOf(this, NativeAuthError.prototype);\r\n this.name = "NativeAuthError";\r\n this.ext = ext;\r\n }\r\n}\r\n/**\r\n * These errors should result in a fallback to the \'standard\' browser based auth flow.\r\n */\r\nfunction isFatalNativeAuthError(error) {\r\n if (error.ext &&\r\n error.ext.status &&\r\n (error.ext.status === PERSISTENT_ERROR ||\r\n error.ext.status === DISABLED)) {\r\n return true;\r\n }\r\n if (error.ext &&\r\n error.ext.error &&\r\n error.ext.error === INVALID_METHOD_ERROR) {\r\n return true;\r\n }\r\n switch (error.errorCode) {\r\n case contentError:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n/**\r\n * Create the appropriate error object based on the WAM status code.\r\n * @param code\r\n * @param description\r\n * @param ext\r\n * @returns\r\n */\r\nfunction createNativeAuthError(code, description, ext) {\r\n if (ext && ext.status) {\r\n switch (ext.status) {\r\n case ACCOUNT_UNAVAILABLE:\r\n return createInteractionRequiredAuthError(nativeAccountUnavailable);\r\n case USER_INTERACTION_REQUIRED:\r\n return new InteractionRequiredAuthError(code, description);\r\n case USER_CANCEL:\r\n return createBrowserAuthError(userCancelled);\r\n case NO_NETWORK:\r\n return createBrowserAuthError(BrowserAuthErrorCodes_noNetworkConnectivity);\r\n }\r\n }\r\n return new NativeAuthError(code, NativeAuthErrorMessages[code] || description, ext);\r\n}\n\n\n//# sourceMappingURL=NativeAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/client/RefreshTokenClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS = 300; // 5 Minutes\r\n/**\r\n * OAuth2.0 refresh token client\r\n * @internal\r\n */\r\nclass RefreshTokenClient extends BaseClient {\r\n constructor(configuration, performanceClient) {\r\n super(configuration, performanceClient);\r\n }\r\n async acquireToken(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);\r\n const reqTimestamp = nowSeconds();\r\n const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.RefreshTokenClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(request, this.authority);\r\n // Retrieve requestId from response headers\r\n const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];\r\n const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);\r\n responseHandler.validateTokenResponse(response.body);\r\n return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache, requestId);\r\n }\r\n /**\r\n * Gets cached refresh token and attaches to request, then calls acquireToken API\r\n * @param request\r\n */\r\n async acquireTokenByRefreshToken(request) {\r\n // Cannot renew token if no request object is given.\r\n if (!request) {\r\n throw createClientConfigurationError(tokenRequestEmpty);\r\n }\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, request.correlationId);\r\n // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases\r\n if (!request.account) {\r\n throw createClientAuthError(noAccountInSilentRequest);\r\n }\r\n // try checking if FOCI is enabled for the given application\r\n const isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment);\r\n // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest\r\n if (isFOCI) {\r\n try {\r\n return await invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, true);\r\n }\r\n catch (e) {\r\n const noFamilyRTInCache = e instanceof InteractionRequiredAuthError &&\r\n e.errorCode ===\r\n noTokensFound;\r\n const clientMismatchErrorWithFamilyRT = e instanceof ServerError &&\r\n e.errorCode === Errors.INVALID_GRANT_ERROR &&\r\n e.subError === Errors.CLIENT_MISMATCH_ERROR;\r\n // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)\r\n if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {\r\n return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);\r\n // throw in all other cases\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n // fall back to application refresh token acquisition\r\n return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);\r\n }\r\n /**\r\n * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached\r\n * @param request\r\n */\r\n async acquireTokenWithCachedRefreshToken(request, foci) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n // fetches family RT or application RT based on FOCI value\r\n const refreshToken = invoke(this.cacheManager.getRefreshToken.bind(this.cacheManager), PerformanceEvents.CacheManagerGetRefreshToken, this.logger, this.performanceClient, request.correlationId)(request.account, foci, undefined, this.performanceClient, request.correlationId);\r\n if (!refreshToken) {\r\n throw createInteractionRequiredAuthError(noTokensFound);\r\n }\r\n if (refreshToken.expiresOn &&\r\n isTokenExpired(refreshToken.expiresOn, request.refreshTokenExpirationOffsetSeconds ||\r\n DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS)) {\r\n throw createInteractionRequiredAuthError(refreshTokenExpired);\r\n }\r\n // attach cached RT size to the current measurement\r\n const refreshTokenRequest = {\r\n ...request,\r\n refreshToken: refreshToken.secret,\r\n authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER,\r\n ccsCredential: {\r\n credential: request.account.homeAccountId,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n },\r\n };\r\n try {\r\n return await invokeAsync(this.acquireToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireToken, this.logger, this.performanceClient, request.correlationId)(refreshTokenRequest);\r\n }\r\n catch (e) {\r\n if (e instanceof InteractionRequiredAuthError &&\r\n e.subError === badToken) {\r\n // Remove bad refresh token from cache\r\n this.logger.verbose("acquireTokenWithRefreshToken: bad refresh token, removing from cache");\r\n const badRefreshTokenKey = generateCredentialKey(refreshToken);\r\n this.cacheManager.removeRefreshToken(badRefreshTokenKey);\r\n }\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Constructs the network message and makes a NW call to the underlying secure token service\r\n * @param request\r\n * @param authority\r\n */\r\n async executeTokenRequest(request, authority) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);\r\n const queryParametersString = this.createTokenQueryParameters(request);\r\n const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);\r\n const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);\r\n const headers = this.createTokenRequestHeaders(request.ccsCredential);\r\n const thumbprint = {\r\n clientId: request.tokenBodyParameters?.clientId ||\r\n this.config.authOptions.clientId,\r\n authority: authority.canonicalAuthority,\r\n scopes: request.scopes,\r\n claims: request.claims,\r\n authenticationScheme: request.authenticationScheme,\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n resourceRequestUri: request.resourceRequestUri,\r\n shrClaims: request.shrClaims,\r\n sshKid: request.sshKid,\r\n };\r\n return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint);\r\n }\r\n /**\r\n * Helper function to create the token request body\r\n * @param request\r\n */\r\n async createTokenRequestBody(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, request.correlationId);\r\n const correlationId = request.correlationId;\r\n const parameterBuilder = new RequestParameterBuilder(correlationId, this.performanceClient);\r\n parameterBuilder.addClientId(request.embeddedClientId ||\r\n request.tokenBodyParameters?.[CLIENT_ID] ||\r\n this.config.authOptions.clientId);\r\n if (request.redirectUri) {\r\n parameterBuilder.addRedirectUri(request.redirectUri);\r\n }\r\n parameterBuilder.addScopes(request.scopes, true, this.config.authOptions.authority.options.OIDCOptions?.defaultScopes);\r\n parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);\r\n parameterBuilder.addClientInfo();\r\n parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n parameterBuilder.addThrottling();\r\n if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {\r\n parameterBuilder.addServerTelemetry(this.serverTelemetryManager);\r\n }\r\n parameterBuilder.addRefreshToken(request.refreshToken);\r\n if (this.config.clientCredentials.clientSecret) {\r\n parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);\r\n }\r\n if (this.config.clientCredentials.clientAssertion) {\r\n const clientAssertion = this.config.clientCredentials.clientAssertion;\r\n parameterBuilder.addClientAssertion(await getClientAssertion(clientAssertion.assertion, this.config.authOptions.clientId, request.resourceRequestUri));\r\n parameterBuilder.addClientAssertionType(clientAssertion.assertionType);\r\n }\r\n if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);\r\n let reqCnfData;\r\n if (!request.popKid) {\r\n const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);\r\n reqCnfData = generatedReqCnfData.reqCnfString;\r\n }\r\n else {\r\n reqCnfData = this.cryptoUtils.encodeKid(request.popKid);\r\n }\r\n // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)\r\n parameterBuilder.addPopToken(reqCnfData);\r\n }\r\n else if (request.authenticationScheme === AuthenticationScheme.SSH) {\r\n if (request.sshJwk) {\r\n parameterBuilder.addSshJwk(request.sshJwk);\r\n }\r\n else {\r\n throw createClientConfigurationError(missingSshJwk);\r\n }\r\n }\r\n if (!StringUtils.isEmptyObj(request.claims) ||\r\n (this.config.authOptions.clientCapabilities &&\r\n this.config.authOptions.clientCapabilities.length > 0)) {\r\n parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n }\r\n if (this.config.systemOptions.preventCorsPreflight &&\r\n request.ccsCredential) {\r\n switch (request.ccsCredential.type) {\r\n case CcsCredentialType.HOME_ACCOUNT_ID:\r\n try {\r\n const clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);\r\n parameterBuilder.addCcsOid(clientInfo);\r\n }\r\n catch (e) {\r\n this.logger.verbose("Could not parse home account ID for CCS Header: " +\r\n e);\r\n }\r\n break;\r\n case CcsCredentialType.UPN:\r\n parameterBuilder.addCcsUpn(request.ccsCredential.credential);\r\n break;\r\n }\r\n }\r\n if (request.embeddedClientId) {\r\n parameterBuilder.addBrokerParameters({\r\n brokerClientId: this.config.authOptions.clientId,\r\n brokerRedirectUri: this.config.authOptions.redirectUri,\r\n });\r\n }\r\n if (request.tokenBodyParameters) {\r\n parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);\r\n }\r\n return parameterBuilder.createQueryString();\r\n }\r\n}\n\n\n//# sourceMappingURL=RefreshTokenClient.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/client/SilentFlowClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/** @internal */\r\nclass SilentFlowClient extends BaseClient {\r\n constructor(configuration, performanceClient) {\r\n super(configuration, performanceClient);\r\n }\r\n /**\r\n * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew\r\n * the given token and returns the renewed token\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n try {\r\n const [authResponse, cacheOutcome] = await this.acquireCachedToken({\r\n ...request,\r\n scopes: request.scopes?.length\r\n ? request.scopes\r\n : [...OIDC_DEFAULT_SCOPES],\r\n });\r\n // if the token is not expired but must be refreshed; get a new one in the background\r\n if (cacheOutcome === CacheOutcome.PROACTIVELY_REFRESHED) {\r\n this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token\'s refreshOn property has been exceeded\'. It\'s not expired, but must be refreshed.");\r\n // refresh the access token in the background\r\n const refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);\r\n refreshTokenClient\r\n .acquireTokenByRefreshToken(request)\r\n .catch(() => {\r\n // do nothing, this is running in the background and no action is to be taken upon success or failure\r\n });\r\n }\r\n // return the cached token\r\n return authResponse;\r\n }\r\n catch (e) {\r\n if (e instanceof ClientAuthError &&\r\n e.errorCode === tokenRefreshRequired) {\r\n const refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);\r\n return refreshTokenClient.acquireTokenByRefreshToken(request);\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n }\r\n /**\r\n * Retrieves token from cache or throws an error if it must be refreshed.\r\n * @param request\r\n */\r\n async acquireCachedToken(request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.SilentFlowClientAcquireCachedToken, request.correlationId);\r\n let lastCacheOutcome = CacheOutcome.NOT_APPLICABLE;\r\n if (request.forceRefresh ||\r\n (!this.config.cacheOptions.claimsBasedCachingEnabled &&\r\n !StringUtils.isEmptyObj(request.claims))) {\r\n // Must refresh due to present force_refresh flag.\r\n this.setCacheOutcome(CacheOutcome.FORCE_REFRESH_OR_CLAIMS, request.correlationId);\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases\r\n if (!request.account) {\r\n throw createClientAuthError(noAccountInSilentRequest);\r\n }\r\n const requestTenantId = request.account.tenantId ||\r\n getTenantFromAuthorityString(request.authority);\r\n const tokenKeys = this.cacheManager.getTokenKeys();\r\n const cachedAccessToken = this.cacheManager.getAccessToken(request.account, request, tokenKeys, requestTenantId, this.performanceClient, request.correlationId);\r\n if (!cachedAccessToken) {\r\n // must refresh due to non-existent access_token\r\n this.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN, request.correlationId);\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n else if (wasClockTurnedBack(cachedAccessToken.cachedAt) ||\r\n isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {\r\n // must refresh due to the expires_in value\r\n this.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED, request.correlationId);\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n else if (cachedAccessToken.refreshOn &&\r\n isTokenExpired(cachedAccessToken.refreshOn, 0)) {\r\n // must refresh (in the background) due to the refresh_in value\r\n lastCacheOutcome = CacheOutcome.PROACTIVELY_REFRESHED;\r\n // don\'t throw ClientAuthError.createRefreshRequiredError(), return cached token instead\r\n }\r\n const environment = request.authority || this.authority.getPreferredCache();\r\n const cacheRecord = {\r\n account: this.cacheManager.readAccountFromCache(request.account),\r\n accessToken: cachedAccessToken,\r\n idToken: this.cacheManager.getIdToken(request.account, tokenKeys, requestTenantId, this.performanceClient, request.correlationId),\r\n refreshToken: null,\r\n appMetadata: this.cacheManager.readAppMetadataFromCache(environment),\r\n };\r\n this.setCacheOutcome(lastCacheOutcome, request.correlationId);\r\n if (this.config.serverTelemetryManager) {\r\n this.config.serverTelemetryManager.incrementCacheHits();\r\n }\r\n return [\r\n await invokeAsync(this.generateResultFromCacheRecord.bind(this), PerformanceEvents.SilentFlowClientGenerateResultFromCacheRecord, this.logger, this.performanceClient, request.correlationId)(cacheRecord, request),\r\n lastCacheOutcome,\r\n ];\r\n }\r\n setCacheOutcome(cacheOutcome, correlationId) {\r\n this.serverTelemetryManager?.setCacheOutcome(cacheOutcome);\r\n this.performanceClient?.addFields({\r\n cacheOutcome: cacheOutcome,\r\n }, correlationId);\r\n if (cacheOutcome !== CacheOutcome.NOT_APPLICABLE) {\r\n this.logger.info(`Token refresh is required due to cache outcome: ${cacheOutcome}`);\r\n }\r\n }\r\n /**\r\n * Helper function to build response object from the CacheRecord\r\n * @param cacheRecord\r\n */\r\n async generateResultFromCacheRecord(cacheRecord, request) {\r\n this.performanceClient?.addQueueMeasurement(PerformanceEvents.SilentFlowClientGenerateResultFromCacheRecord, request.correlationId);\r\n let idTokenClaims;\r\n if (cacheRecord.idToken) {\r\n idTokenClaims = extractTokenClaims(cacheRecord.idToken.secret, this.config.cryptoInterface.base64Decode);\r\n }\r\n // token max_age check\r\n if (request.maxAge || request.maxAge === 0) {\r\n const authTime = idTokenClaims?.auth_time;\r\n if (!authTime) {\r\n throw createClientAuthError(authTimeNotFound);\r\n }\r\n checkMaxAge(authTime, request.maxAge);\r\n }\r\n return ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, idTokenClaims);\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentFlowClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/SilentCacheClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SilentCacheClient extends StandardInteractionClient {\r\n /**\r\n * Returns unexpired tokens from the cache, if available\r\n * @param silentRequest\r\n */\r\n async acquireToken(silentRequest) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentCacheClientAcquireToken, silentRequest.correlationId);\r\n // Telemetry manager only used to increment cacheHits here\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);\r\n const clientConfig = await invokeAsync(this.getClientConfiguration.bind(this), PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: silentRequest.authority,\r\n requestAzureCloudOptions: silentRequest.azureCloudOptions,\r\n account: silentRequest.account,\r\n });\r\n const silentAuthClient = new SilentFlowClient(clientConfig, this.performanceClient);\r\n this.logger.verbose("Silent auth client created");\r\n try {\r\n const response = await invokeAsync(silentAuthClient.acquireCachedToken.bind(silentAuthClient), PerformanceEvents.SilentFlowClientAcquireCachedToken, this.logger, this.performanceClient, silentRequest.correlationId)(silentRequest);\r\n const authResponse = response[0];\r\n this.performanceClient.addFields({\r\n fromCache: true,\r\n }, silentRequest.correlationId);\r\n return authResponse;\r\n }\r\n catch (error) {\r\n if (error instanceof BrowserAuthError &&\r\n error.errorCode === cryptoKeyNotFound) {\r\n this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.");\r\n }\r\n throw error;\r\n }\r\n }\r\n /**\r\n * API to silenty clear the browser cache.\r\n * @param logoutRequest\r\n */\r\n logout(logoutRequest) {\r\n this.logger.verbose("logoutRedirect called");\r\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\r\n return this.clearCacheOnLogout(validLogoutRequest?.account);\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentCacheClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/NativeInteractionClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NativeInteractionClient extends BaseInteractionClient {\r\n constructor(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, provider, accountId, nativeStorageImpl, correlationId) {\r\n super(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);\r\n this.apiId = apiId;\r\n this.accountId = accountId;\r\n this.nativeMessageHandler = provider;\r\n this.nativeStorageManager = nativeStorageImpl;\r\n this.silentCacheClient = new SilentCacheClient(config, this.nativeStorageManager, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);\r\n this.serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);\r\n const extensionName = this.nativeMessageHandler.getExtensionId() ===\r\n NativeConstants.PREFERRED_EXTENSION_ID\r\n ? "chrome"\r\n : this.nativeMessageHandler.getExtensionId()?.length\r\n ? "unknown"\r\n : undefined;\r\n this.skus = ServerTelemetryManager.makeExtraSkuString({\r\n libraryName: BrowserConstants.MSAL_SKU,\r\n libraryVersion: packageMetadata_version,\r\n extensionName: extensionName,\r\n extensionVersion: this.nativeMessageHandler.getExtensionVersion(),\r\n });\r\n }\r\n /**\r\n * Adds SKUs to request extra query parameters\r\n * @param request {NativeTokenRequest}\r\n * @private\r\n */\r\n addRequestSKUs(request) {\r\n request.extraParameters = {\r\n ...request.extraParameters,\r\n [X_CLIENT_EXTRA_SKU]: this.skus,\r\n };\r\n }\r\n /**\r\n * Acquire token from native platform via browser extension\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);\r\n this.logger.trace("NativeInteractionClient - acquireToken called.");\r\n // start the perf measurement\r\n const nativeATMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);\r\n const reqTimestamp = nowSeconds();\r\n try {\r\n // initialize native request\r\n const nativeRequest = await this.initializeNativeRequest(request);\r\n // check if the tokens can be retrieved from internal cache\r\n try {\r\n const result = await this.acquireTokensFromCache(this.accountId, nativeRequest);\r\n nativeATMeasurement.end({\r\n success: true,\r\n isNativeBroker: false,\r\n fromCache: true,\r\n });\r\n return result;\r\n }\r\n catch (e) {\r\n // continue with a native call for any and all errors\r\n this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call");\r\n }\r\n const { ...nativeTokenRequest } = nativeRequest;\r\n // fall back to native calls\r\n const messageBody = {\r\n method: NativeExtensionMethod.GetToken,\r\n request: nativeTokenRequest,\r\n };\r\n const response = await this.nativeMessageHandler.sendMessage(messageBody);\r\n const validatedResponse = this.validateNativeResponse(response);\r\n return await this.handleNativeResponse(validatedResponse, nativeRequest, reqTimestamp)\r\n .then((result) => {\r\n nativeATMeasurement.end({\r\n success: true,\r\n isNativeBroker: true,\r\n requestId: result.requestId,\r\n });\r\n this.serverTelemetryManager.clearNativeBrokerErrorCode();\r\n return result;\r\n })\r\n .catch((error) => {\r\n nativeATMeasurement.end({\r\n success: false,\r\n errorCode: error.errorCode,\r\n subErrorCode: error.subError,\r\n isNativeBroker: true,\r\n });\r\n throw error;\r\n });\r\n }\r\n catch (e) {\r\n if (e instanceof NativeAuthError) {\r\n this.serverTelemetryManager.setNativeBrokerErrorCode(e.errorCode);\r\n }\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Creates silent flow request\r\n * @param request\r\n * @param cachedAccount\r\n * @returns CommonSilentFlowRequest\r\n */\r\n createSilentCacheRequest(request, cachedAccount) {\r\n return {\r\n authority: request.authority,\r\n correlationId: this.correlationId,\r\n scopes: ScopeSet.fromString(request.scope).asArray(),\r\n account: cachedAccount,\r\n forceRefresh: false,\r\n };\r\n }\r\n /**\r\n * Fetches the tokens from the cache if un-expired\r\n * @param nativeAccountId\r\n * @param request\r\n * @returns authenticationResult\r\n */\r\n async acquireTokensFromCache(nativeAccountId, request) {\r\n if (!nativeAccountId) {\r\n this.logger.warning("NativeInteractionClient:acquireTokensFromCache - No nativeAccountId provided");\r\n throw createClientAuthError(noAccountFound);\r\n }\r\n // fetch the account from browser cache\r\n const account = this.browserStorage.getBaseAccountInfo({\r\n nativeAccountId,\r\n });\r\n if (!account) {\r\n throw createClientAuthError(noAccountFound);\r\n }\r\n // leverage silent flow for cached tokens retrieval\r\n try {\r\n const silentRequest = this.createSilentCacheRequest(request, account);\r\n const result = await this.silentCacheClient.acquireToken(silentRequest);\r\n const fullAccount = {\r\n ...account,\r\n idTokenClaims: result?.idTokenClaims,\r\n idToken: result?.idToken,\r\n };\r\n return {\r\n ...result,\r\n account: fullAccount,\r\n };\r\n }\r\n catch (e) {\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Acquires a token from native platform then redirects to the redirectUri instead of returning the response\r\n * @param {RedirectRequest} request\r\n * @param {InProgressPerformanceEvent} rootMeasurement\r\n */\r\n async acquireTokenRedirect(request, rootMeasurement) {\r\n this.logger.trace("NativeInteractionClient - acquireTokenRedirect called.");\r\n const { ...remainingParameters } = request;\r\n delete remainingParameters.onRedirectNavigate;\r\n const nativeRequest = await this.initializeNativeRequest(remainingParameters);\r\n const messageBody = {\r\n method: NativeExtensionMethod.GetToken,\r\n request: nativeRequest,\r\n };\r\n try {\r\n const response = await this.nativeMessageHandler.sendMessage(messageBody);\r\n this.validateNativeResponse(response);\r\n }\r\n catch (e) {\r\n // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise\r\n if (e instanceof NativeAuthError) {\r\n this.serverTelemetryManager.setNativeBrokerErrorCode(e.errorCode);\r\n if (isFatalNativeAuthError(e)) {\r\n throw e;\r\n }\r\n }\r\n }\r\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, JSON.stringify(nativeRequest), true);\r\n const navigationOptions = {\r\n apiId: ApiId.acquireTokenRedirect,\r\n timeout: this.config.system.redirectNavigationTimeout,\r\n noHistory: false,\r\n };\r\n const redirectUri = this.config.auth.navigateToLoginRequestUrl\r\n ? window.location.href\r\n : this.getRedirectUri(request.redirectUri);\r\n rootMeasurement.end({ success: true });\r\n await this.navigationClient.navigateExternal(redirectUri, navigationOptions); // Need to treat this as external to ensure handleRedirectPromise is run again\r\n }\r\n /**\r\n * If the previous page called native platform for a token using redirect APIs, send the same request again and return the response\r\n * @param performanceClient {IPerformanceClient?}\r\n * @param correlationId {string?} correlation identifier\r\n */\r\n async handleRedirectPromise(performanceClient, correlationId) {\r\n this.logger.trace("NativeInteractionClient - handleRedirectPromise called.");\r\n if (!this.browserStorage.isInteractionInProgress(true)) {\r\n this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");\r\n return null;\r\n }\r\n // remove prompt from the request to prevent WAM from prompting twice\r\n const cachedRequest = this.browserStorage.getCachedNativeRequest();\r\n if (!cachedRequest) {\r\n this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null.");\r\n if (performanceClient && correlationId) {\r\n performanceClient?.addFields({ errorCode: "no_cached_request" }, correlationId);\r\n }\r\n return null;\r\n }\r\n const { prompt, ...request } = cachedRequest;\r\n if (prompt) {\r\n this.logger.verbose("NativeInteractionClient - handleRedirectPromise called and prompt was included in the original request, removing prompt from cached request to prevent second interaction with native broker window.");\r\n }\r\n this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\r\n const messageBody = {\r\n method: NativeExtensionMethod.GetToken,\r\n request: request,\r\n };\r\n const reqTimestamp = nowSeconds();\r\n try {\r\n this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker.");\r\n const response = await this.nativeMessageHandler.sendMessage(messageBody);\r\n this.validateNativeResponse(response);\r\n const result = this.handleNativeResponse(response, request, reqTimestamp);\r\n this.browserStorage.setInteractionInProgress(false);\r\n const res = await result;\r\n this.serverTelemetryManager.clearNativeBrokerErrorCode();\r\n return res;\r\n }\r\n catch (e) {\r\n this.browserStorage.setInteractionInProgress(false);\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Logout from native platform via browser extension\r\n * @param request\r\n */\r\n logout() {\r\n this.logger.trace("NativeInteractionClient - logout called.");\r\n return Promise.reject("Logout not implemented yet");\r\n }\r\n /**\r\n * Transform response from native platform into AuthenticationResult object which will be returned to the end user\r\n * @param response\r\n * @param request\r\n * @param reqTimestamp\r\n */\r\n async handleNativeResponse(response, request, reqTimestamp) {\r\n this.logger.trace("NativeInteractionClient - handleNativeResponse called.");\r\n // generate identifiers\r\n const idTokenClaims = extractTokenClaims(response.id_token, base64Decode);\r\n const homeAccountIdentifier = this.createHomeAccountIdentifier(response, idTokenClaims);\r\n const cachedhomeAccountId = this.browserStorage.getAccountInfoFilteredBy({\r\n nativeAccountId: request.accountId,\r\n })?.homeAccountId;\r\n if (homeAccountIdentifier !== cachedhomeAccountId &&\r\n response.account.id !== request.accountId) {\r\n // User switch in native broker prompt is not supported. All users must first sign in through web flow to ensure server state is in sync\r\n throw createNativeAuthError(userSwitch);\r\n }\r\n // Get the preferred_cache domain for the given authority\r\n const authority = await this.getDiscoveredAuthority({\r\n requestAuthority: request.authority,\r\n });\r\n const baseAccount = buildAccountToCache(this.browserStorage, authority, homeAccountIdentifier, base64Decode, idTokenClaims, response.client_info, undefined, // environment\r\n idTokenClaims.tid, undefined, // auth code payload\r\n response.account.id, this.logger);\r\n // generate authenticationResult\r\n const result = await this.generateAuthenticationResult(response, request, idTokenClaims, baseAccount, authority.canonicalAuthority, reqTimestamp);\r\n // cache accounts and tokens in the appropriate storage\r\n this.cacheAccount(baseAccount);\r\n this.cacheNativeTokens(response, request, homeAccountIdentifier, idTokenClaims, response.access_token, result.tenantId, reqTimestamp);\r\n return result;\r\n }\r\n /**\r\n * creates an homeAccountIdentifier for the account\r\n * @param response\r\n * @param idTokenObj\r\n * @returns\r\n */\r\n createHomeAccountIdentifier(response, idTokenClaims) {\r\n // Save account in browser storage\r\n const homeAccountIdentifier = AccountEntity.generateHomeAccountId(response.client_info || Constants.EMPTY_STRING, AuthorityType.Default, this.logger, this.browserCrypto, idTokenClaims);\r\n return homeAccountIdentifier;\r\n }\r\n /**\r\n * Helper to generate scopes\r\n * @param response\r\n * @param request\r\n * @returns\r\n */\r\n generateScopes(response, request) {\r\n return response.scope\r\n ? ScopeSet.fromString(response.scope)\r\n : ScopeSet.fromString(request.scope);\r\n }\r\n /**\r\n * If PoP token is requesred, records the PoP token if returned from the WAM, else generates one in the browser\r\n * @param request\r\n * @param response\r\n */\r\n async generatePopAccessToken(response, request) {\r\n if (request.tokenType === AuthenticationScheme.POP &&\r\n request.signPopToken) {\r\n /**\r\n * This code prioritizes SHR returned from the native layer. In case of error/SHR not calculated from WAM and the AT\r\n * is still received, SHR is calculated locally\r\n */\r\n // Check if native layer returned an SHR token\r\n if (response.shr) {\r\n this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer");\r\n return response.shr;\r\n }\r\n // Generate SHR in msal js if WAM does not compute it when POP is enabled\r\n const popTokenGenerator = new PopTokenGenerator(this.browserCrypto);\r\n const shrParameters = {\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n resourceRequestUri: request.resourceRequestUri,\r\n shrClaims: request.shrClaims,\r\n shrNonce: request.shrNonce,\r\n };\r\n /**\r\n * KeyID must be present in the native request from when the PoP key was generated in order for\r\n * PopTokenGenerator to query the full key for signing\r\n */\r\n if (!request.keyId) {\r\n throw createClientAuthError(keyIdMissing);\r\n }\r\n return popTokenGenerator.signPopToken(response.access_token, request.keyId, shrParameters);\r\n }\r\n else {\r\n return response.access_token;\r\n }\r\n }\r\n /**\r\n * Generates authentication result\r\n * @param response\r\n * @param request\r\n * @param idTokenObj\r\n * @param accountEntity\r\n * @param authority\r\n * @param reqTimestamp\r\n * @returns\r\n */\r\n async generateAuthenticationResult(response, request, idTokenClaims, accountEntity, authority, reqTimestamp) {\r\n // Add Native Broker fields to Telemetry\r\n const mats = this.addTelemetryFromNativeResponse(response);\r\n // If scopes not returned in server response, use request scopes\r\n const responseScopes = response.scope\r\n ? ScopeSet.fromString(response.scope)\r\n : ScopeSet.fromString(request.scope);\r\n const accountProperties = response.account.properties || {};\r\n const uid = accountProperties["UID"] ||\r\n idTokenClaims.oid ||\r\n idTokenClaims.sub ||\r\n Constants.EMPTY_STRING;\r\n const tid = accountProperties["TenantId"] ||\r\n idTokenClaims.tid ||\r\n Constants.EMPTY_STRING;\r\n const accountInfo = updateAccountTenantProfileData(accountEntity.getAccountInfo(), undefined, // tenantProfile optional\r\n idTokenClaims, response.id_token);\r\n /**\r\n * In pairwise broker flows, this check prevents the broker\'s native account id\r\n * from being returned over the embedded app\'s account id.\r\n */\r\n if (accountInfo.nativeAccountId !== response.account.id) {\r\n accountInfo.nativeAccountId = response.account.id;\r\n }\r\n // generate PoP token as needed\r\n const responseAccessToken = await this.generatePopAccessToken(response, request);\r\n const tokenType = request.tokenType === AuthenticationScheme.POP\r\n ? AuthenticationScheme.POP\r\n : AuthenticationScheme.BEARER;\r\n const result = {\r\n authority: authority,\r\n uniqueId: uid,\r\n tenantId: tid,\r\n scopes: responseScopes.asArray(),\r\n account: accountInfo,\r\n idToken: response.id_token,\r\n idTokenClaims: idTokenClaims,\r\n accessToken: responseAccessToken,\r\n fromCache: mats ? this.isResponseFromCache(mats) : false,\r\n expiresOn: new Date(Number(reqTimestamp + response.expires_in) * 1000),\r\n tokenType: tokenType,\r\n correlationId: this.correlationId,\r\n state: response.state,\r\n fromNativeBroker: true,\r\n };\r\n return result;\r\n }\r\n /**\r\n * cache the account entity in browser storage\r\n * @param accountEntity\r\n */\r\n cacheAccount(accountEntity) {\r\n // Store the account info and hence `nativeAccountId` in browser cache\r\n this.browserStorage.setAccount(accountEntity);\r\n // Remove any existing cached tokens for this account in browser storage\r\n this.browserStorage.removeAccountContext(accountEntity).catch((e) => {\r\n this.logger.error(`Error occurred while removing account context from browser storage. ${e}`);\r\n });\r\n }\r\n /**\r\n * Stores the access_token and id_token in inmemory storage\r\n * @param response\r\n * @param request\r\n * @param homeAccountIdentifier\r\n * @param idTokenObj\r\n * @param responseAccessToken\r\n * @param tenantId\r\n * @param reqTimestamp\r\n */\r\n cacheNativeTokens(response, request, homeAccountIdentifier, idTokenClaims, responseAccessToken, tenantId, reqTimestamp) {\r\n const cachedIdToken = createIdTokenEntity(homeAccountIdentifier, request.authority, response.id_token || "", request.clientId, idTokenClaims.tid || "");\r\n // cache accessToken in inmemory storage\r\n const expiresIn = request.tokenType === AuthenticationScheme.POP\r\n ? Constants.SHR_NONCE_VALIDITY\r\n : (typeof response.expires_in === "string"\r\n ? parseInt(response.expires_in, 10)\r\n : response.expires_in) || 0;\r\n const tokenExpirationSeconds = reqTimestamp + expiresIn;\r\n const responseScopes = this.generateScopes(response, request);\r\n const cachedAccessToken = createAccessTokenEntity(homeAccountIdentifier, request.authority, responseAccessToken, request.clientId, idTokenClaims.tid || tenantId, responseScopes.printScopes(), tokenExpirationSeconds, 0, base64Decode, undefined, request.tokenType, undefined, request.keyId);\r\n const nativeCacheRecord = {\r\n idToken: cachedIdToken,\r\n accessToken: cachedAccessToken,\r\n };\r\n void this.nativeStorageManager.saveCacheRecord(nativeCacheRecord, request.storeInCache);\r\n }\r\n addTelemetryFromNativeResponse(response) {\r\n const mats = this.getMATSFromResponse(response);\r\n if (!mats) {\r\n return null;\r\n }\r\n this.performanceClient.addFields({\r\n extensionId: this.nativeMessageHandler.getExtensionId(),\r\n extensionVersion: this.nativeMessageHandler.getExtensionVersion(),\r\n matsBrokerVersion: mats.broker_version,\r\n matsAccountJoinOnStart: mats.account_join_on_start,\r\n matsAccountJoinOnEnd: mats.account_join_on_end,\r\n matsDeviceJoin: mats.device_join,\r\n matsPromptBehavior: mats.prompt_behavior,\r\n matsApiErrorCode: mats.api_error_code,\r\n matsUiVisible: mats.ui_visible,\r\n matsSilentCode: mats.silent_code,\r\n matsSilentBiSubCode: mats.silent_bi_sub_code,\r\n matsSilentMessage: mats.silent_message,\r\n matsSilentStatus: mats.silent_status,\r\n matsHttpStatus: mats.http_status,\r\n matsHttpEventCount: mats.http_event_count,\r\n }, this.correlationId);\r\n return mats;\r\n }\r\n /**\r\n * Validates native platform response before processing\r\n * @param response\r\n */\r\n validateNativeResponse(response) {\r\n if (response.hasOwnProperty("access_token") &&\r\n response.hasOwnProperty("id_token") &&\r\n response.hasOwnProperty("client_info") &&\r\n response.hasOwnProperty("account") &&\r\n response.hasOwnProperty("scope") &&\r\n response.hasOwnProperty("expires_in")) {\r\n return response;\r\n }\r\n else {\r\n throw createAuthError(unexpectedError, "Response missing expected properties.");\r\n }\r\n }\r\n /**\r\n * Gets MATS telemetry from native response\r\n * @param response\r\n * @returns\r\n */\r\n getMATSFromResponse(response) {\r\n if (response.properties.MATS) {\r\n try {\r\n return JSON.parse(response.properties.MATS);\r\n }\r\n catch (e) {\r\n this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead");\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Returns whether or not response came from native cache\r\n * @param response\r\n * @returns\r\n */\r\n isResponseFromCache(mats) {\r\n if (typeof mats.is_cached === "undefined") {\r\n this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false.");\r\n return false;\r\n }\r\n return !!mats.is_cached;\r\n }\r\n /**\r\n * Translates developer provided request object into NativeRequest object\r\n * @param request\r\n */\r\n async initializeNativeRequest(request) {\r\n this.logger.trace("NativeInteractionClient - initializeNativeRequest called");\r\n const requestAuthority = request.authority || this.config.auth.authority;\r\n if (request.account) {\r\n // validate authority\r\n await this.getDiscoveredAuthority({\r\n requestAuthority,\r\n requestAzureCloudOptions: request.azureCloudOptions,\r\n account: request.account,\r\n });\r\n }\r\n const canonicalAuthority = new UrlString(requestAuthority);\r\n canonicalAuthority.validateAsUri();\r\n // scopes are expected to be received by the native broker as "scope" and will be added to the request below. Other properties that should be dropped from the request to the native broker can be included in the object destructuring here.\r\n const { scopes, ...remainingProperties } = request;\r\n const scopeSet = new ScopeSet(scopes || []);\r\n scopeSet.appendScopes(OIDC_DEFAULT_SCOPES);\r\n const getPrompt = () => {\r\n // If request is silent, prompt is always none\r\n switch (this.apiId) {\r\n case ApiId.ssoSilent:\r\n case ApiId.acquireTokenSilent_silentFlow:\r\n this.logger.trace("initializeNativeRequest: silent request sets prompt to none");\r\n return PromptValue.NONE;\r\n }\r\n // Prompt not provided, request may proceed and native broker decides if it needs to prompt\r\n if (!request.prompt) {\r\n this.logger.trace("initializeNativeRequest: prompt was not provided");\r\n return undefined;\r\n }\r\n // If request is interactive, check if prompt provided is allowed to go directly to native broker\r\n switch (request.prompt) {\r\n case PromptValue.NONE:\r\n case PromptValue.CONSENT:\r\n case PromptValue.LOGIN:\r\n this.logger.trace("initializeNativeRequest: prompt is compatible with native flow");\r\n return request.prompt;\r\n default:\r\n this.logger.trace(`initializeNativeRequest: prompt = ${request.prompt} is not compatible with native flow`);\r\n throw createBrowserAuthError(nativePromptNotSupported);\r\n }\r\n };\r\n const validatedRequest = {\r\n ...remainingProperties,\r\n accountId: this.accountId,\r\n clientId: this.config.auth.clientId,\r\n authority: canonicalAuthority.urlString,\r\n scope: scopeSet.printScopes(),\r\n redirectUri: this.getRedirectUri(request.redirectUri),\r\n prompt: getPrompt(),\r\n correlationId: this.correlationId,\r\n tokenType: request.authenticationScheme,\r\n windowTitleSubstring: document.title,\r\n extraParameters: {\r\n ...request.extraQueryParameters,\r\n ...request.tokenQueryParameters,\r\n },\r\n extendedExpiryToken: false,\r\n keyId: request.popKid,\r\n };\r\n // Check for PoP token requests: signPopToken should only be set to true if popKid is not set\r\n if (validatedRequest.signPopToken && !!request.popKid) {\r\n throw createBrowserAuthError(invalidPopTokenRequest);\r\n }\r\n this.handleExtraBrokerParams(validatedRequest);\r\n validatedRequest.extraParameters =\r\n validatedRequest.extraParameters || {};\r\n validatedRequest.extraParameters.telemetry =\r\n NativeConstants.MATS_TELEMETRY;\r\n if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n // add POP request type\r\n const shrParameters = {\r\n resourceRequestUri: request.resourceRequestUri,\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n shrClaims: request.shrClaims,\r\n shrNonce: request.shrNonce,\r\n };\r\n const popTokenGenerator = new PopTokenGenerator(this.browserCrypto);\r\n // generate reqCnf if not provided in the request\r\n let reqCnfData;\r\n if (!validatedRequest.keyId) {\r\n const generatedReqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(shrParameters, this.logger);\r\n reqCnfData = generatedReqCnfData.reqCnfString;\r\n validatedRequest.keyId = generatedReqCnfData.kid;\r\n validatedRequest.signPopToken = true;\r\n }\r\n else {\r\n reqCnfData = this.browserCrypto.base64UrlEncode(JSON.stringify({ kid: validatedRequest.keyId }));\r\n validatedRequest.signPopToken = false;\r\n }\r\n // SPAs require whole string to be passed to broker\r\n validatedRequest.reqCnf = reqCnfData;\r\n }\r\n this.addRequestSKUs(validatedRequest);\r\n return validatedRequest;\r\n }\r\n /**\r\n * Handles extra broker request parameters\r\n * @param request {NativeTokenRequest}\r\n * @private\r\n */\r\n handleExtraBrokerParams(request) {\r\n const hasExtraBrokerParams = request.extraParameters &&\r\n request.extraParameters.hasOwnProperty(BROKER_CLIENT_ID) &&\r\n request.extraParameters.hasOwnProperty(BROKER_REDIRECT_URI) &&\r\n request.extraParameters.hasOwnProperty(CLIENT_ID);\r\n if (!request.embeddedClientId && !hasExtraBrokerParams) {\r\n return;\r\n }\r\n let child_client_id = "";\r\n const child_redirect_uri = request.redirectUri;\r\n if (request.embeddedClientId) {\r\n request.redirectUri = this.config.auth.redirectUri;\r\n child_client_id = request.embeddedClientId;\r\n }\r\n else if (request.extraParameters) {\r\n request.redirectUri =\r\n request.extraParameters[BROKER_REDIRECT_URI];\r\n child_client_id =\r\n request.extraParameters[CLIENT_ID];\r\n }\r\n request.extraParameters = {\r\n child_client_id,\r\n child_redirect_uri,\r\n };\r\n this.performanceClient?.addFields({\r\n embeddedClientId: child_client_id,\r\n embeddedRedirectUri: child_redirect_uri,\r\n }, request.correlationId);\r\n }\r\n}\n\n\n//# sourceMappingURL=NativeInteractionClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/broker/nativeBroker/NativeMessageHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NativeMessageHandler {\r\n constructor(logger, handshakeTimeoutMs, performanceClient, extensionId) {\r\n this.logger = logger;\r\n this.handshakeTimeoutMs = handshakeTimeoutMs;\r\n this.extensionId = extensionId;\r\n this.resolvers = new Map(); // Used for non-handshake messages\r\n this.handshakeResolvers = new Map(); // Used for handshake messages\r\n this.messageChannel = new MessageChannel();\r\n this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn\'t have access to \'this\' unless it\'s bound\r\n this.performanceClient = performanceClient;\r\n this.handshakeEvent = performanceClient.startMeasurement(PerformanceEvents.NativeMessageHandlerHandshake);\r\n }\r\n /**\r\n * Sends a given message to the extension and resolves with the extension response\r\n * @param body\r\n */\r\n async sendMessage(body) {\r\n this.logger.trace("NativeMessageHandler - sendMessage called.");\r\n const req = {\r\n channel: NativeConstants.CHANNEL_ID,\r\n extensionId: this.extensionId,\r\n responseId: createNewGuid(),\r\n body: body,\r\n };\r\n this.logger.trace("NativeMessageHandler - Sending request to browser extension");\r\n this.logger.tracePii(`NativeMessageHandler - Sending request to browser extension: ${JSON.stringify(req)}`);\r\n this.messageChannel.port1.postMessage(req);\r\n return new Promise((resolve, reject) => {\r\n this.resolvers.set(req.responseId, { resolve, reject });\r\n });\r\n }\r\n /**\r\n * Returns an instance of the MessageHandler that has successfully established a connection with an extension\r\n * @param {Logger} logger\r\n * @param {number} handshakeTimeoutMs\r\n * @param {IPerformanceClient} performanceClient\r\n * @param {ICrypto} crypto\r\n */\r\n static async createProvider(logger, handshakeTimeoutMs, performanceClient) {\r\n logger.trace("NativeMessageHandler - createProvider called.");\r\n try {\r\n const preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient, NativeConstants.PREFERRED_EXTENSION_ID);\r\n await preferredProvider.sendHandshakeRequest();\r\n return preferredProvider;\r\n }\r\n catch (e) {\r\n // If preferred extension fails for whatever reason, fallback to using any installed extension\r\n const backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient);\r\n await backupProvider.sendHandshakeRequest();\r\n return backupProvider;\r\n }\r\n }\r\n /**\r\n * Send handshake request helper.\r\n */\r\n async sendHandshakeRequest() {\r\n this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");\r\n // Register this event listener before sending handshake\r\n window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first\r\n const req = {\r\n channel: NativeConstants.CHANNEL_ID,\r\n extensionId: this.extensionId,\r\n responseId: createNewGuid(),\r\n body: {\r\n method: NativeExtensionMethod.HandshakeRequest,\r\n },\r\n };\r\n this.handshakeEvent.add({\r\n extensionId: this.extensionId,\r\n extensionHandshakeTimeoutMs: this.handshakeTimeoutMs,\r\n });\r\n this.messageChannel.port1.onmessage = (event) => {\r\n this.onChannelMessage(event);\r\n };\r\n window.postMessage(req, window.origin, [this.messageChannel.port2]);\r\n return new Promise((resolve, reject) => {\r\n this.handshakeResolvers.set(req.responseId, { resolve, reject });\r\n this.timeoutId = window.setTimeout(() => {\r\n /*\r\n * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.\r\n * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port\r\n */\r\n window.removeEventListener("message", this.windowListener, false);\r\n this.messageChannel.port1.close();\r\n this.messageChannel.port2.close();\r\n this.handshakeEvent.end({\r\n extensionHandshakeTimedOut: true,\r\n success: false,\r\n });\r\n reject(createBrowserAuthError(nativeHandshakeTimeout));\r\n this.handshakeResolvers.delete(req.responseId);\r\n }, this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here\r\n });\r\n }\r\n /**\r\n * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.\r\n * @param event\r\n */\r\n onWindowMessage(event) {\r\n this.logger.trace("NativeMessageHandler - onWindowMessage called");\r\n // We only accept messages from ourselves\r\n if (event.source !== window) {\r\n return;\r\n }\r\n const request = event.data;\r\n if (!request.channel ||\r\n request.channel !== NativeConstants.CHANNEL_ID) {\r\n return;\r\n }\r\n if (request.extensionId && request.extensionId !== this.extensionId) {\r\n return;\r\n }\r\n if (request.body.method === NativeExtensionMethod.HandshakeRequest) {\r\n const handshakeResolver = this.handshakeResolvers.get(request.responseId);\r\n /*\r\n * Filter out responses with no matched resolvers sooner to keep channel ports open while waiting for\r\n * the proper response.\r\n */\r\n if (!handshakeResolver) {\r\n this.logger.trace(`NativeMessageHandler.onWindowMessage - resolver can\'t be found for request ${request.responseId}`);\r\n return;\r\n }\r\n // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed\r\n this.logger.verbose(request.extensionId\r\n ? `Extension with id: ${request.extensionId} not installed`\r\n : "No extension installed");\r\n clearTimeout(this.timeoutId);\r\n this.messageChannel.port1.close();\r\n this.messageChannel.port2.close();\r\n window.removeEventListener("message", this.windowListener, false);\r\n this.handshakeEvent.end({\r\n success: false,\r\n extensionInstalled: false,\r\n });\r\n handshakeResolver.reject(createBrowserAuthError(nativeExtensionNotInstalled));\r\n }\r\n }\r\n /**\r\n * Invoked when a message is received from the extension on the MessageChannel port\r\n * @param event\r\n */\r\n onChannelMessage(event) {\r\n this.logger.trace("NativeMessageHandler - onChannelMessage called.");\r\n const request = event.data;\r\n const resolver = this.resolvers.get(request.responseId);\r\n const handshakeResolver = this.handshakeResolvers.get(request.responseId);\r\n try {\r\n const method = request.body.method;\r\n if (method === NativeExtensionMethod.Response) {\r\n if (!resolver) {\r\n return;\r\n }\r\n const response = request.body.response;\r\n this.logger.trace("NativeMessageHandler - Received response from browser extension");\r\n this.logger.tracePii(`NativeMessageHandler - Received response from browser extension: ${JSON.stringify(response)}`);\r\n if (response.status !== "Success") {\r\n resolver.reject(createNativeAuthError(response.code, response.description, response.ext));\r\n }\r\n else if (response.result) {\r\n if (response.result["code"] &&\r\n response.result["description"]) {\r\n resolver.reject(createNativeAuthError(response.result["code"], response.result["description"], response.result["ext"]));\r\n }\r\n else {\r\n resolver.resolve(response.result);\r\n }\r\n }\r\n else {\r\n throw createAuthError(unexpectedError, "Event does not contain result.");\r\n }\r\n this.resolvers.delete(request.responseId);\r\n }\r\n else if (method === NativeExtensionMethod.HandshakeResponse) {\r\n if (!handshakeResolver) {\r\n this.logger.trace(`NativeMessageHandler.onChannelMessage - resolver can\'t be found for request ${request.responseId}`);\r\n return;\r\n }\r\n clearTimeout(this.timeoutId); // Clear setTimeout\r\n window.removeEventListener("message", this.windowListener, false); // Remove \'No extension\' listener\r\n this.extensionId = request.extensionId;\r\n this.extensionVersion = request.body.version;\r\n this.logger.verbose(`NativeMessageHandler - Received HandshakeResponse from extension: ${this.extensionId}`);\r\n this.handshakeEvent.end({\r\n extensionInstalled: true,\r\n success: true,\r\n });\r\n handshakeResolver.resolve();\r\n this.handshakeResolvers.delete(request.responseId);\r\n }\r\n // Do nothing if method is not Response or HandshakeResponse\r\n }\r\n catch (err) {\r\n this.logger.error("Error parsing response from WAM Extension");\r\n this.logger.errorPii(`Error parsing response from WAM Extension: ${err}`);\r\n this.logger.errorPii(`Unable to parse ${event}`);\r\n if (resolver) {\r\n resolver.reject(err);\r\n }\r\n else if (handshakeResolver) {\r\n handshakeResolver.reject(err);\r\n }\r\n }\r\n }\r\n /**\r\n * Returns the Id for the browser extension this handler is communicating with\r\n * @returns\r\n */\r\n getExtensionId() {\r\n return this.extensionId;\r\n }\r\n /**\r\n * Returns the version for the browser extension this handler is communicating with\r\n * @returns\r\n */\r\n getExtensionVersion() {\r\n return this.extensionVersion;\r\n }\r\n /**\r\n * Returns boolean indicating whether or not the request should attempt to use native broker\r\n * @param logger\r\n * @param config\r\n * @param nativeExtensionProvider\r\n * @param authenticationScheme\r\n */\r\n static isNativeAvailable(config, logger, nativeExtensionProvider, authenticationScheme) {\r\n logger.trace("isNativeAvailable called");\r\n if (!config.system.allowNativeBroker) {\r\n logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");\r\n // Developer disabled WAM\r\n return false;\r\n }\r\n if (!nativeExtensionProvider) {\r\n logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");\r\n // Extension is not available\r\n return false;\r\n }\r\n if (authenticationScheme) {\r\n switch (authenticationScheme) {\r\n case AuthenticationScheme.BEARER:\r\n case AuthenticationScheme.POP:\r\n logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");\r\n return true;\r\n default:\r\n logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\n\n\n//# sourceMappingURL=NativeMessageHandler.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_handler/InteractionHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Abstract class which defines operations for a browser interaction handling class.\r\n */\r\nclass InteractionHandler {\r\n constructor(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient) {\r\n this.authModule = authCodeModule;\r\n this.browserStorage = storageImpl;\r\n this.authCodeRequest = authCodeRequest;\r\n this.logger = logger;\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Function to handle response parameters from hash.\r\n * @param locationHash\r\n */\r\n async handleCodeResponse(response, request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.HandleCodeResponse, request.correlationId);\r\n let authCodeResponse;\r\n try {\r\n authCodeResponse = this.authModule.handleFragmentResponse(response, request.state);\r\n }\r\n catch (e) {\r\n if (e instanceof ServerError &&\r\n e.subError === userCancelled) {\r\n // Translate server error caused by user closing native prompt to corresponding first class MSAL error\r\n throw createBrowserAuthError(userCancelled);\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n return invokeAsync(this.handleCodeResponseFromServer.bind(this), PerformanceEvents.HandleCodeResponseFromServer, this.logger, this.performanceClient, request.correlationId)(authCodeResponse, request);\r\n }\r\n /**\r\n * Process auth code response from AAD\r\n * @param authCodeResponse\r\n * @param state\r\n * @param authority\r\n * @param networkModule\r\n * @returns\r\n */\r\n async handleCodeResponseFromServer(authCodeResponse, request, validateNonce = true) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.HandleCodeResponseFromServer, request.correlationId);\r\n this.logger.trace("InteractionHandler.handleCodeResponseFromServer called");\r\n // Assign code to request\r\n this.authCodeRequest.code = authCodeResponse.code;\r\n // Check for new cloud instance\r\n if (authCodeResponse.cloud_instance_host_name) {\r\n await invokeAsync(this.authModule.updateAuthority.bind(this.authModule), PerformanceEvents.UpdateTokenEndpointAuthority, this.logger, this.performanceClient, request.correlationId)(authCodeResponse.cloud_instance_host_name, request.correlationId);\r\n }\r\n // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)\r\n if (validateNonce) {\r\n // TODO: Assigning "response nonce" to "request nonce" is confusing. Refactor the function doing validation to accept request nonce directly\r\n authCodeResponse.nonce = request.nonce || undefined;\r\n }\r\n authCodeResponse.state = request.state;\r\n // Add CCS parameters if available\r\n if (authCodeResponse.client_info) {\r\n this.authCodeRequest.clientInfo = authCodeResponse.client_info;\r\n }\r\n else {\r\n const ccsCred = this.createCcsCredentials(request);\r\n if (ccsCred) {\r\n this.authCodeRequest.ccsCredential = ccsCred;\r\n }\r\n }\r\n // Acquire token with retrieved code.\r\n const tokenResponse = (await invokeAsync(this.authModule.acquireToken.bind(this.authModule), PerformanceEvents.AuthClientAcquireToken, this.logger, this.performanceClient, request.correlationId)(this.authCodeRequest, authCodeResponse));\r\n return tokenResponse;\r\n }\r\n /**\r\n * Build ccs creds if available\r\n */\r\n createCcsCredentials(request) {\r\n if (request.account) {\r\n return {\r\n credential: request.account.homeAccountId,\r\n type: CcsCredentialType.HOME_ACCOUNT_ID,\r\n };\r\n }\r\n else if (request.loginHint) {\r\n return {\r\n credential: request.loginHint,\r\n type: CcsCredentialType.UPN,\r\n };\r\n }\r\n return null;\r\n }\r\n}\n\n\n//# sourceMappingURL=InteractionHandler.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/response/ResponseHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction deserializeResponse(responseString, responseLocation, logger) {\r\n // Deserialize hash fragment response parameters.\r\n const serverParams = getDeserializedResponse(responseString);\r\n if (!serverParams) {\r\n if (!stripLeadingHashOrQuery(responseString)) {\r\n // Hash or Query string is empty\r\n logger.error(`The request has returned to the redirectUri but a ${responseLocation} is not present. It\'s likely that the ${responseLocation} has been removed or the page has been redirected by code running on the redirectUri page.`);\r\n throw createBrowserAuthError(hashEmptyError);\r\n }\r\n else {\r\n logger.error(`A ${responseLocation} is present in the iframe but it does not contain known properties. It\'s likely that the ${responseLocation} has been replaced by code running on the redirectUri page.`);\r\n logger.errorPii(`The ${responseLocation} detected is: ${responseString}`);\r\n throw createBrowserAuthError(hashDoesNotContainKnownProperties);\r\n }\r\n }\r\n return serverParams;\r\n}\r\n/**\r\n * Returns the interaction type that the response object belongs to\r\n */\r\nfunction validateInteractionType(response, browserCrypto, interactionType) {\r\n if (!response.state) {\r\n throw createBrowserAuthError(noStateInHash);\r\n }\r\n const platformStateObj = extractBrowserRequestState(browserCrypto, response.state);\r\n if (!platformStateObj) {\r\n throw createBrowserAuthError(unableToParseState);\r\n }\r\n if (platformStateObj.interactionType !== interactionType) {\r\n throw createBrowserAuthError(stateInteractionTypeMismatch);\r\n }\r\n}\n\n\n//# sourceMappingURL=ResponseHandler.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/PopupClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass PopupClient extends StandardInteractionClient {\r\n constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {\r\n super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n // Properly sets this reference for the unload event.\r\n this.unloadWindow = this.unloadWindow.bind(this);\r\n this.nativeStorage = nativeStorageImpl;\r\n }\r\n /**\r\n * Acquires tokens by opening a popup window to the /authorize endpoint of the authority\r\n * @param request\r\n */\r\n acquireToken(request) {\r\n try {\r\n const popupName = this.generatePopupName(request.scopes || OIDC_DEFAULT_SCOPES, request.authority || this.config.auth.authority);\r\n const popupParams = {\r\n popupName,\r\n popupWindowAttributes: request.popupWindowAttributes || {},\r\n popupWindowParent: request.popupWindowParent ?? window,\r\n };\r\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\r\n if (this.config.system.asyncPopups) {\r\n this.logger.verbose("asyncPopups set to true, acquiring token");\r\n // Passes on popup position and dimensions if in request\r\n return this.acquireTokenPopupAsync(request, popupParams);\r\n }\r\n else {\r\n // asyncPopups flag is set to false. Opens popup before acquiring token.\r\n this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");\r\n popupParams.popup = this.openSizedPopup("about:blank", popupParams);\r\n return this.acquireTokenPopupAsync(request, popupParams);\r\n }\r\n }\r\n catch (e) {\r\n return Promise.reject(e);\r\n }\r\n }\r\n /**\r\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n * @param logoutRequest\r\n */\r\n logout(logoutRequest) {\r\n try {\r\n this.logger.verbose("logoutPopup called");\r\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\r\n const popupParams = {\r\n popupName: this.generateLogoutPopupName(validLogoutRequest),\r\n popupWindowAttributes: logoutRequest?.popupWindowAttributes || {},\r\n popupWindowParent: logoutRequest?.popupWindowParent ?? window,\r\n };\r\n const authority = logoutRequest && logoutRequest.authority;\r\n const mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;\r\n // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\r\n if (this.config.system.asyncPopups) {\r\n this.logger.verbose("asyncPopups set to true");\r\n // Passes on popup position and dimensions if in request\r\n return this.logoutPopupAsync(validLogoutRequest, popupParams, authority, mainWindowRedirectUri);\r\n }\r\n else {\r\n // asyncPopups flag is set to false. Opens popup before logging out.\r\n this.logger.verbose("asyncPopup set to false, opening popup");\r\n popupParams.popup = this.openSizedPopup("about:blank", popupParams);\r\n return this.logoutPopupAsync(validLogoutRequest, popupParams, authority, mainWindowRedirectUri);\r\n }\r\n }\r\n catch (e) {\r\n // Since this function is synchronous we need to reject\r\n return Promise.reject(e);\r\n }\r\n }\r\n /**\r\n * Helper which obtains an access_token for your API via opening a popup window in the user\'s browser\r\n * @param validRequest\r\n * @param popupName\r\n * @param popup\r\n * @param popupWindowAttributes\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n async acquireTokenPopupAsync(request, popupParams) {\r\n this.logger.verbose("acquireTokenPopupAsync called");\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenPopup);\r\n const validRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, this.correlationId)(request, InteractionType.Popup);\r\n preconnect(validRequest.authority);\r\n try {\r\n // Create auth code request and generate PKCE params\r\n const authCodeRequest = await invokeAsync(this.initializeAuthorizationCodeRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.logger, this.performanceClient, this.correlationId)(validRequest);\r\n // Initialize the client\r\n const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: validRequest.authority,\r\n requestAzureCloudOptions: validRequest.azureCloudOptions,\r\n requestExtraQueryParameters: validRequest.extraQueryParameters,\r\n account: validRequest.account,\r\n });\r\n const isNativeBroker = NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme);\r\n // Start measurement for server calls with native brokering enabled\r\n let fetchNativeAccountIdMeasurement;\r\n if (isNativeBroker) {\r\n fetchNativeAccountIdMeasurement =\r\n this.performanceClient.startMeasurement(PerformanceEvents.FetchAccountIdWithNativeBroker, request.correlationId);\r\n }\r\n // Create acquire token url.\r\n const navigateUrl = await authClient.getAuthCodeUrl({\r\n ...validRequest,\r\n nativeBroker: isNativeBroker,\r\n });\r\n // Create popup interaction handler.\r\n const interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);\r\n // Show the UI once the url has been created. Get the window handle for the popup.\r\n const popupWindow = this.initiateAuthRequest(navigateUrl, popupParams);\r\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, { popupWindow }, null);\r\n // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\r\n const responseString = await this.monitorPopupForHash(popupWindow, popupParams.popupWindowParent);\r\n const serverParams = invoke(deserializeResponse, PerformanceEvents.DeserializeResponse, this.logger, this.performanceClient, this.correlationId)(responseString, this.config.auth.OIDCOptions.serverResponseType, this.logger);\r\n // Remove throttle if it exists\r\n ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);\r\n if (serverParams.accountId) {\r\n this.logger.verbose("Account id found in hash, calling WAM for token");\r\n // end measurement for server call with native brokering enabled\r\n if (fetchNativeAccountIdMeasurement) {\r\n fetchNativeAccountIdMeasurement.end({\r\n success: true,\r\n isNativeBroker: true,\r\n });\r\n }\r\n if (!this.nativeMessageHandler) {\r\n throw createBrowserAuthError(nativeConnectionNotEstablished);\r\n }\r\n const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, validRequest.correlationId);\r\n const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, validRequest.state);\r\n return await nativeInteractionClient.acquireToken({\r\n ...validRequest,\r\n state: userRequestState,\r\n prompt: undefined, // Server should handle the prompt, ideally native broker can do this part silently\r\n });\r\n }\r\n // Handle response from hash string.\r\n const result = await interactionHandler.handleCodeResponse(serverParams, validRequest);\r\n return result;\r\n }\r\n catch (e) {\r\n // Close the synchronous popup if an error is thrown before the window unload event is registered\r\n popupParams.popup?.close();\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n throw e;\r\n }\r\n }\r\n /**\r\n *\r\n * @param validRequest\r\n * @param popupName\r\n * @param requestAuthority\r\n * @param popup\r\n * @param mainWindowRedirectUri\r\n * @param popupWindowAttributes\r\n */\r\n async logoutPopupAsync(validRequest, popupParams, requestAuthority, mainWindowRedirectUri) {\r\n this.logger.verbose("logoutPopupAsync called");\r\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Popup, validRequest);\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logoutPopup);\r\n try {\r\n // Clear cache on logout\r\n await this.clearCacheOnLogout(validRequest.account);\r\n // Initialize the client\r\n const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: requestAuthority,\r\n account: validRequest.account || undefined,\r\n });\r\n try {\r\n authClient.authority.endSessionEndpoint;\r\n }\r\n catch {\r\n if (validRequest.account?.homeAccountId &&\r\n validRequest.postLogoutRedirectUri &&\r\n authClient.authority.protocolMode === ProtocolMode.OIDC) {\r\n void this.browserStorage.removeAccount(validRequest.account?.homeAccountId);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);\r\n if (mainWindowRedirectUri) {\r\n const navigationOptions = {\r\n apiId: ApiId.logoutPopup,\r\n timeout: this.config.system.redirectNavigationTimeout,\r\n noHistory: false,\r\n };\r\n const absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, getCurrentUri());\r\n await this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);\r\n }\r\n popupParams.popup?.close();\r\n return;\r\n }\r\n }\r\n // Create logout string and navigate user window to logout.\r\n const logoutUri = authClient.getLogoutUri(validRequest);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);\r\n // Open the popup window to requestUrl.\r\n const popupWindow = this.openPopup(logoutUri, popupParams);\r\n this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, { popupWindow }, null);\r\n await this.monitorPopupForHash(popupWindow, popupParams.popupWindowParent).catch(() => {\r\n // Swallow any errors related to monitoring the window. Server logout is best effort\r\n });\r\n if (mainWindowRedirectUri) {\r\n const navigationOptions = {\r\n apiId: ApiId.logoutPopup,\r\n timeout: this.config.system.redirectNavigationTimeout,\r\n noHistory: false,\r\n };\r\n const absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, getCurrentUri());\r\n this.logger.verbose("Redirecting main window to url specified in the request");\r\n this.logger.verbosePii(`Redirecting main window to: ${absoluteUrl}`);\r\n await this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);\r\n }\r\n else {\r\n this.logger.verbose("No main window navigation requested");\r\n }\r\n }\r\n catch (e) {\r\n // Close the synchronous popup if an error is thrown before the window unload event is registered\r\n popupParams.popup?.close();\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n this.browserStorage.setInteractionInProgress(false);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\r\n throw e;\r\n }\r\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\r\n }\r\n /**\r\n * Opens a popup window with given request Url.\r\n * @param requestUrl\r\n */\r\n initiateAuthRequest(requestUrl, params) {\r\n // Check that request url is not empty.\r\n if (requestUrl) {\r\n this.logger.infoPii(`Navigate to: ${requestUrl}`);\r\n // Open the popup window to requestUrl.\r\n return this.openPopup(requestUrl, params);\r\n }\r\n else {\r\n // Throw error if request URL is empty.\r\n this.logger.error("Navigate url is empty");\r\n throw createBrowserAuthError(emptyNavigateUri);\r\n }\r\n }\r\n /**\r\n * Monitors a window until it loads a url with the same origin.\r\n * @param popupWindow - window that is being monitored\r\n * @param timeout - timeout for processing hash once popup is redirected back to application\r\n */\r\n monitorPopupForHash(popupWindow, popupWindowParent) {\r\n return new Promise((resolve, reject) => {\r\n this.logger.verbose("PopupHandler.monitorPopupForHash - polling started");\r\n const intervalId = setInterval(() => {\r\n // Window is closed\r\n if (popupWindow.closed) {\r\n this.logger.error("PopupHandler.monitorPopupForHash - window closed");\r\n clearInterval(intervalId);\r\n reject(createBrowserAuthError(userCancelled));\r\n return;\r\n }\r\n let href = "";\r\n try {\r\n /*\r\n * Will throw if cross origin,\r\n * which should be caught and ignored\r\n * since we need the interval to keep running while on STS UI.\r\n */\r\n href = popupWindow.location.href;\r\n }\r\n catch (e) { }\r\n // Don\'t process blank pages or cross domain\r\n if (!href || href === "about:blank") {\r\n return;\r\n }\r\n clearInterval(intervalId);\r\n let responseString = "";\r\n const responseType = this.config.auth.OIDCOptions.serverResponseType;\r\n if (popupWindow) {\r\n if (responseType === ServerResponseType.QUERY) {\r\n responseString = popupWindow.location.search;\r\n }\r\n else {\r\n responseString = popupWindow.location.hash;\r\n }\r\n }\r\n this.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller");\r\n resolve(responseString);\r\n }, this.config.system.pollIntervalMilliseconds);\r\n }).finally(() => {\r\n this.cleanPopup(popupWindow, popupWindowParent);\r\n });\r\n }\r\n /**\r\n * @hidden\r\n *\r\n * Configures popup window for login.\r\n *\r\n * @param urlNavigate\r\n * @param title\r\n * @param popUpWidth\r\n * @param popUpHeight\r\n * @param popupWindowAttributes\r\n * @ignore\r\n * @hidden\r\n */\r\n openPopup(urlNavigate, popupParams) {\r\n try {\r\n let popupWindow;\r\n // Popup window passed in, setting url to navigate to\r\n if (popupParams.popup) {\r\n popupWindow = popupParams.popup;\r\n this.logger.verbosePii(`Navigating popup window to: ${urlNavigate}`);\r\n popupWindow.location.assign(urlNavigate);\r\n }\r\n else if (typeof popupParams.popup === "undefined") {\r\n // Popup will be undefined if it was not passed in\r\n this.logger.verbosePii(`Opening popup window to: ${urlNavigate}`);\r\n popupWindow = this.openSizedPopup(urlNavigate, popupParams);\r\n }\r\n // Popup will be null if popups are blocked\r\n if (!popupWindow) {\r\n throw createBrowserAuthError(emptyWindowError);\r\n }\r\n if (popupWindow.focus) {\r\n popupWindow.focus();\r\n }\r\n this.currentWindow = popupWindow;\r\n popupParams.popupWindowParent.addEventListener("beforeunload", this.unloadWindow);\r\n return popupWindow;\r\n }\r\n catch (e) {\r\n this.logger.error("error opening popup " + e.message);\r\n this.browserStorage.setInteractionInProgress(false);\r\n throw createBrowserAuthError(popupWindowError);\r\n }\r\n }\r\n /**\r\n * Helper function to set popup window dimensions and position\r\n * @param urlNavigate\r\n * @param popupName\r\n * @param popupWindowAttributes\r\n * @returns\r\n */\r\n openSizedPopup(urlNavigate, { popupName, popupWindowAttributes, popupWindowParent }) {\r\n /**\r\n * adding winLeft and winTop to account for dual monitor\r\n * using screenLeft and screenTop for IE8 and earlier\r\n */\r\n const winLeft = popupWindowParent.screenLeft\r\n ? popupWindowParent.screenLeft\r\n : popupWindowParent.screenX;\r\n const winTop = popupWindowParent.screenTop\r\n ? popupWindowParent.screenTop\r\n : popupWindowParent.screenY;\r\n /**\r\n * window.innerWidth displays browser window"s height and width excluding toolbars\r\n * using document.documentElement.clientWidth for IE8 and earlier\r\n */\r\n const winWidth = popupWindowParent.innerWidth ||\r\n document.documentElement.clientWidth ||\r\n document.body.clientWidth;\r\n const winHeight = popupWindowParent.innerHeight ||\r\n document.documentElement.clientHeight ||\r\n document.body.clientHeight;\r\n let width = popupWindowAttributes.popupSize?.width;\r\n let height = popupWindowAttributes.popupSize?.height;\r\n let top = popupWindowAttributes.popupPosition?.top;\r\n let left = popupWindowAttributes.popupPosition?.left;\r\n if (!width || width < 0 || width > winWidth) {\r\n this.logger.verbose("Default popup window width used. Window width not configured or invalid.");\r\n width = BrowserConstants.POPUP_WIDTH;\r\n }\r\n if (!height || height < 0 || height > winHeight) {\r\n this.logger.verbose("Default popup window height used. Window height not configured or invalid.");\r\n height = BrowserConstants.POPUP_HEIGHT;\r\n }\r\n if (!top || top < 0 || top > winHeight) {\r\n this.logger.verbose("Default popup window top position used. Window top not configured or invalid.");\r\n top = Math.max(0, winHeight / 2 - BrowserConstants.POPUP_HEIGHT / 2 + winTop);\r\n }\r\n if (!left || left < 0 || left > winWidth) {\r\n this.logger.verbose("Default popup window left position used. Window left not configured or invalid.");\r\n left = Math.max(0, winWidth / 2 - BrowserConstants.POPUP_WIDTH / 2 + winLeft);\r\n }\r\n return popupWindowParent.open(urlNavigate, popupName, `width=${width}, height=${height}, top=${top}, left=${left}, scrollbars=yes`);\r\n }\r\n /**\r\n * Event callback to unload main window.\r\n */\r\n unloadWindow(e) {\r\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Popup);\r\n if (this.currentWindow) {\r\n this.currentWindow.close();\r\n }\r\n // Guarantees browser unload will happen, so no other errors will be thrown.\r\n e.preventDefault();\r\n }\r\n /**\r\n * Closes popup, removes any state vars created during popup calls.\r\n * @param popupWindow\r\n */\r\n cleanPopup(popupWindow, popupWindowParent) {\r\n // Close window.\r\n popupWindow.close();\r\n // Remove window unload function\r\n popupWindowParent.removeEventListener("beforeunload", this.unloadWindow);\r\n // Interaction is completed - remove interaction status.\r\n this.browserStorage.setInteractionInProgress(false);\r\n }\r\n /**\r\n * Generates the name for the popup based on the client id and request\r\n * @param clientId\r\n * @param request\r\n */\r\n generatePopupName(scopes, authority) {\r\n return `${BrowserConstants.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${scopes.join("-")}.${authority}.${this.correlationId}`;\r\n }\r\n /**\r\n * Generates the name for the popup based on the client id and request for logouts\r\n * @param clientId\r\n * @param request\r\n */\r\n generateLogoutPopupName(request) {\r\n const homeAccountId = request.account && request.account.homeAccountId;\r\n return `${BrowserConstants.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${homeAccountId}.${this.correlationId}`;\r\n }\r\n}\n\n\n//# sourceMappingURL=PopupClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_handler/RedirectHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass RedirectHandler {\r\n constructor(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient) {\r\n this.authModule = authCodeModule;\r\n this.browserStorage = storageImpl;\r\n this.authCodeRequest = authCodeRequest;\r\n this.logger = logger;\r\n this.performanceClient = performanceClient;\r\n }\r\n /**\r\n * Redirects window to given URL.\r\n * @param urlNavigate\r\n */\r\n async initiateAuthRequest(requestUrl, params) {\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest called");\r\n // Navigate if valid URL\r\n if (requestUrl) {\r\n // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true\r\n if (params.redirectStartPage) {\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page");\r\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, params.redirectStartPage, true);\r\n }\r\n // Set interaction status in the library.\r\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, this.authCodeRequest.correlationId, true);\r\n this.browserStorage.cacheCodeRequest(this.authCodeRequest);\r\n this.logger.infoPii(`RedirectHandler.initiateAuthRequest: Navigate to: ${requestUrl}`);\r\n const navigationOptions = {\r\n apiId: ApiId.acquireTokenRedirect,\r\n timeout: params.redirectTimeout,\r\n noHistory: false,\r\n };\r\n // If onRedirectNavigate is implemented, invoke it and provide requestUrl\r\n if (typeof params.onRedirectNavigate === "function") {\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback");\r\n const navigate = params.onRedirectNavigate(requestUrl);\r\n // Returning false from onRedirectNavigate will stop navigation\r\n if (navigate !== false) {\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating");\r\n await params.navigationClient.navigateExternal(requestUrl, navigationOptions);\r\n return;\r\n }\r\n else {\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation");\r\n return;\r\n }\r\n }\r\n else {\r\n // Navigate window to request URL\r\n this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url");\r\n await params.navigationClient.navigateExternal(requestUrl, navigationOptions);\r\n return;\r\n }\r\n }\r\n else {\r\n // Throw error if request URL is empty.\r\n this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty");\r\n throw createBrowserAuthError(emptyNavigateUri);\r\n }\r\n }\r\n /**\r\n * Handle authorization code response in the window.\r\n * @param hash\r\n */\r\n async handleCodeResponse(response, state) {\r\n this.logger.verbose("RedirectHandler.handleCodeResponse called");\r\n // Interaction is completed - remove interaction status.\r\n this.browserStorage.setInteractionInProgress(false);\r\n // Handle code response.\r\n const stateKey = this.browserStorage.generateStateKey(state);\r\n const requestState = this.browserStorage.getTemporaryCache(stateKey);\r\n if (!requestState) {\r\n throw createClientAuthError(stateNotFound, "Cached State");\r\n }\r\n let authCodeResponse;\r\n try {\r\n authCodeResponse = this.authModule.handleFragmentResponse(response, requestState);\r\n }\r\n catch (e) {\r\n if (e instanceof ServerError &&\r\n e.subError === userCancelled) {\r\n // Translate server error caused by user closing native prompt to corresponding first class MSAL error\r\n throw createBrowserAuthError(userCancelled);\r\n }\r\n else {\r\n throw e;\r\n }\r\n }\r\n // Get cached items\r\n const nonceKey = this.browserStorage.generateNonceKey(requestState);\r\n const cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);\r\n // Assign code to request\r\n this.authCodeRequest.code = authCodeResponse.code;\r\n // Check for new cloud instance\r\n if (authCodeResponse.cloud_instance_host_name) {\r\n await invokeAsync(this.authModule.updateAuthority.bind(this.authModule), PerformanceEvents.UpdateTokenEndpointAuthority, this.logger, this.performanceClient, this.authCodeRequest.correlationId)(authCodeResponse.cloud_instance_host_name, this.authCodeRequest.correlationId);\r\n }\r\n authCodeResponse.nonce = cachedNonce || undefined;\r\n authCodeResponse.state = requestState;\r\n // Add CCS parameters if available\r\n if (authCodeResponse.client_info) {\r\n this.authCodeRequest.clientInfo = authCodeResponse.client_info;\r\n }\r\n else {\r\n const cachedCcsCred = this.checkCcsCredentials();\r\n if (cachedCcsCred) {\r\n this.authCodeRequest.ccsCredential = cachedCcsCred;\r\n }\r\n }\r\n // Acquire token with retrieved code.\r\n const tokenResponse = (await this.authModule.acquireToken(this.authCodeRequest, authCodeResponse));\r\n this.browserStorage.cleanRequestByState(state);\r\n return tokenResponse;\r\n }\r\n /**\r\n * Looks up ccs creds in the cache\r\n */\r\n checkCcsCredentials() {\r\n // Look up ccs credential in temp cache\r\n const cachedCcsCred = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, true);\r\n if (cachedCcsCred) {\r\n try {\r\n return JSON.parse(cachedCcsCred);\r\n }\r\n catch (e) {\r\n this.authModule.logger.error("Cache credential could not be parsed");\r\n this.authModule.logger.errorPii(`Cache credential could not be parsed: ${cachedCcsCred}`);\r\n }\r\n }\r\n return null;\r\n }\r\n}\n\n\n//# sourceMappingURL=RedirectHandler.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/RedirectClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction getNavigationType() {\r\n if (typeof window === "undefined" ||\r\n typeof window.performance === "undefined" ||\r\n typeof window.performance.getEntriesByType !== "function") {\r\n return undefined;\r\n }\r\n const navigationEntries = window.performance.getEntriesByType("navigation");\r\n const navigation = navigationEntries.length\r\n ? navigationEntries[0]\r\n : undefined;\r\n return navigation?.type;\r\n}\r\nclass RedirectClient extends StandardInteractionClient {\r\n constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {\r\n super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n this.nativeStorage = nativeStorageImpl;\r\n }\r\n /**\r\n * Redirects the page to the /authorize endpoint of the IDP\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n const validRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, this.correlationId)(request, InteractionType.Redirect);\r\n this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || "", validRequest.account || null);\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);\r\n const handleBackButton = (event) => {\r\n // Clear temporary cache if the back button is clicked during the redirect flow.\r\n if (event.persisted) {\r\n this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");\r\n this.browserStorage.cleanRequestByState(validRequest.state);\r\n this.eventHandler.emitEvent(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect);\r\n }\r\n };\r\n try {\r\n // Create auth code request and generate PKCE params\r\n const authCodeRequest = await invokeAsync(this.initializeAuthorizationCodeRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.logger, this.performanceClient, this.correlationId)(validRequest);\r\n // Initialize the client\r\n const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: validRequest.authority,\r\n requestAzureCloudOptions: validRequest.azureCloudOptions,\r\n requestExtraQueryParameters: validRequest.extraQueryParameters,\r\n account: validRequest.account,\r\n });\r\n // Create redirect interaction handler.\r\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);\r\n // Create acquire token url.\r\n const navigateUrl = await authClient.getAuthCodeUrl({\r\n ...validRequest,\r\n nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme),\r\n });\r\n const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);\r\n this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);\r\n // Clear temporary cache if the back button is clicked during the redirect flow.\r\n window.addEventListener("pageshow", handleBackButton);\r\n // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.\r\n return await interactionHandler.initiateAuthRequest(navigateUrl, {\r\n navigationClient: this.navigationClient,\r\n redirectTimeout: this.config.system.redirectNavigationTimeout,\r\n redirectStartPage: redirectStartPage,\r\n onRedirectNavigate: request.onRedirectNavigate ||\r\n this.config.auth.onRedirectNavigate,\r\n });\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n window.removeEventListener("pageshow", handleBackButton);\r\n this.browserStorage.cleanRequestByState(validRequest.state);\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Checks if navigateToLoginRequestUrl is set, and:\r\n * - if true, performs logic to cache and navigate\r\n * - if false, handles hash string and parses response\r\n * @param hash {string} url hash\r\n * @param parentMeasurement {InProgressPerformanceEvent} parent measurement\r\n */\r\n async handleRedirectPromise(hash = "", parentMeasurement) {\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);\r\n try {\r\n if (!this.browserStorage.isInteractionInProgress(true)) {\r\n this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");\r\n return null;\r\n }\r\n const [serverParams, responseString] = this.getRedirectResponse(hash || "");\r\n if (!serverParams) {\r\n // Not a recognized server response hash or hash not associated with a redirect request\r\n this.logger.info("handleRedirectPromise did not detect a response as a result of a redirect. Cleaning temporary cache.");\r\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\r\n // Do not instrument "no_server_response" if user clicked back button\r\n if (getNavigationType() !== "back_forward") {\r\n parentMeasurement.event.errorCode = "no_server_response";\r\n }\r\n else {\r\n this.logger.verbose("Back navigation event detected. Muting no_server_response error");\r\n }\r\n return null;\r\n }\r\n // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated\r\n const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;\r\n const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);\r\n const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);\r\n if (loginRequestUrlNormalized === currentUrlNormalized &&\r\n this.config.auth.navigateToLoginRequestUrl) {\r\n // We are on the page we need to navigate to - handle hash\r\n this.logger.verbose("Current page is loginRequestUrl, handling response");\r\n if (loginRequestUrl.indexOf("#") > -1) {\r\n // Replace current hash with non-msal hash, if present\r\n replaceHash(loginRequestUrl);\r\n }\r\n const handleHashResult = await this.handleResponse(serverParams, serverTelemetryManager);\r\n return handleHashResult;\r\n }\r\n else if (!this.config.auth.navigateToLoginRequestUrl) {\r\n this.logger.verbose("NavigateToLoginRequestUrl set to false, handling response");\r\n return await this.handleResponse(serverParams, serverTelemetryManager);\r\n }\r\n else if (!isInIframe() ||\r\n this.config.system.allowRedirectInIframe) {\r\n /*\r\n * Returned from authority using redirect - need to perform navigation before processing response\r\n * Cache the hash to be retrieved after the next redirect\r\n */\r\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseString, true);\r\n const navigationOptions = {\r\n apiId: ApiId.handleRedirectPromise,\r\n timeout: this.config.system.redirectNavigationTimeout,\r\n noHistory: true,\r\n };\r\n /**\r\n * Default behavior is to redirect to the start page and not process the hash now.\r\n * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.\r\n */\r\n let processHashOnRedirect = true;\r\n if (!loginRequestUrl || loginRequestUrl === "null") {\r\n // Redirect to home page if login request url is null (real null or the string null)\r\n const homepage = getHomepage();\r\n // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage\r\n this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);\r\n this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");\r\n processHashOnRedirect =\r\n await this.navigationClient.navigateInternal(homepage, navigationOptions);\r\n }\r\n else {\r\n // Navigate to page that initiated the redirect request\r\n this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);\r\n processHashOnRedirect =\r\n await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);\r\n }\r\n // If navigateInternal implementation returns false, handle the hash now\r\n if (!processHashOnRedirect) {\r\n return await this.handleResponse(serverParams, serverTelemetryManager);\r\n }\r\n }\r\n return null;\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Gets the response hash for a redirect request\r\n * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties\r\n * @param hash\r\n */\r\n getRedirectResponse(userProvidedResponse) {\r\n this.logger.verbose("getRedirectResponseHash called");\r\n // Get current location hash from window or cache.\r\n let responseString = userProvidedResponse;\r\n if (!responseString) {\r\n if (this.config.auth.OIDCOptions.serverResponseType ===\r\n ServerResponseType.QUERY) {\r\n responseString = window.location.search;\r\n }\r\n else {\r\n responseString = window.location.hash;\r\n }\r\n }\r\n let response = getDeserializedResponse(responseString);\r\n if (response) {\r\n try {\r\n validateInteractionType(response, this.browserCrypto, InteractionType.Redirect);\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n this.logger.error(`Interaction type validation failed due to ${e.errorCode}: ${e.errorMessage}`);\r\n }\r\n return [null, ""];\r\n }\r\n clearHash(window);\r\n this.logger.verbose("Hash contains known properties, returning response hash");\r\n return [response, responseString];\r\n }\r\n const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);\r\n this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));\r\n if (cachedHash) {\r\n response = getDeserializedResponse(cachedHash);\r\n if (response) {\r\n this.logger.verbose("Hash does not contain known properties, returning cached hash");\r\n return [response, cachedHash];\r\n }\r\n }\r\n return [null, ""];\r\n }\r\n /**\r\n * Checks if hash exists and handles in window.\r\n * @param hash\r\n * @param state\r\n */\r\n async handleResponse(serverParams, serverTelemetryManager) {\r\n const state = serverParams.state;\r\n if (!state) {\r\n throw createBrowserAuthError(noStateInHash);\r\n }\r\n const cachedRequest = this.browserStorage.getCachedRequest(state);\r\n this.logger.verbose("handleResponse called, retrieved cached request");\r\n if (serverParams.accountId) {\r\n this.logger.verbose("Account id found in hash, calling WAM for token");\r\n if (!this.nativeMessageHandler) {\r\n throw createBrowserAuthError(nativeConnectionNotEstablished);\r\n }\r\n const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, cachedRequest.correlationId);\r\n const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);\r\n return nativeInteractionClient\r\n .acquireToken({\r\n ...cachedRequest,\r\n state: userRequestState,\r\n prompt: undefined, // Server should handle the prompt, ideally native broker can do this part silently\r\n })\r\n .finally(() => {\r\n this.browserStorage.cleanRequestByState(state);\r\n });\r\n }\r\n // Hash contains known properties - handle and return in callback\r\n const currentAuthority = this.browserStorage.getCachedAuthority(state);\r\n if (!currentAuthority) {\r\n throw createBrowserAuthError(noCachedAuthorityError);\r\n }\r\n const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)({ serverTelemetryManager, requestAuthority: currentAuthority });\r\n ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);\r\n const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.performanceClient);\r\n return interactionHandler.handleCodeResponse(serverParams, state);\r\n }\r\n /**\r\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n * @param logoutRequest\r\n */\r\n async logout(logoutRequest) {\r\n this.logger.verbose("logoutRedirect called");\r\n const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);\r\n try {\r\n this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);\r\n // Clear cache on logout\r\n await this.clearCacheOnLogout(validLogoutRequest.account);\r\n const navigationOptions = {\r\n apiId: ApiId.logout,\r\n timeout: this.config.system.redirectNavigationTimeout,\r\n noHistory: false,\r\n };\r\n const authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: logoutRequest && logoutRequest.authority,\r\n requestExtraQueryParameters: logoutRequest?.extraQueryParameters,\r\n account: (logoutRequest && logoutRequest.account) || undefined,\r\n });\r\n if (authClient.authority.protocolMode === ProtocolMode.OIDC) {\r\n try {\r\n authClient.authority.endSessionEndpoint;\r\n }\r\n catch {\r\n if (validLogoutRequest.account?.homeAccountId) {\r\n void this.browserStorage.removeAccount(validLogoutRequest.account?.homeAccountId);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);\r\n return;\r\n }\r\n }\r\n }\r\n // Create logout string and navigate user window to logout.\r\n const logoutUri = authClient.getLogoutUri(validLogoutRequest);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);\r\n // Check if onRedirectNavigate is implemented, and invoke it if so\r\n if (logoutRequest &&\r\n typeof logoutRequest.onRedirectNavigate === "function") {\r\n const navigate = logoutRequest.onRedirectNavigate(logoutUri);\r\n if (navigate !== false) {\r\n this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");\r\n // Ensure interaction is in progress\r\n if (!this.browserStorage.getInteractionInProgress()) {\r\n this.browserStorage.setInteractionInProgress(true);\r\n }\r\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\r\n return;\r\n }\r\n else {\r\n // Ensure interaction is not in progress\r\n this.browserStorage.setInteractionInProgress(false);\r\n this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");\r\n }\r\n }\r\n else {\r\n // Ensure interaction is in progress\r\n if (!this.browserStorage.getInteractionInProgress()) {\r\n this.browserStorage.setInteractionInProgress(true);\r\n }\r\n await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);\r\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\r\n throw e;\r\n }\r\n this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\r\n }\r\n /**\r\n * Use to get the redirectStartPage either from request or use current window\r\n * @param requestStartPage\r\n */\r\n getRedirectStartPage(requestStartPage) {\r\n const redirectStartPage = requestStartPage || window.location.href;\r\n return UrlString.getAbsoluteUrl(redirectStartPage, getCurrentUri());\r\n }\r\n}\n\n\n//# sourceMappingURL=RedirectClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_handler/SilentHandler.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Creates a hidden iframe to given URL using user-requested scopes as an id.\r\n * @param urlNavigate\r\n * @param userRequestScopes\r\n */\r\nasync function initiateAuthRequest(requestUrl, performanceClient, logger, correlationId, navigateFrameWait) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, correlationId);\r\n if (!requestUrl) {\r\n // Throw error if request URL is empty.\r\n logger.info("Navigate url is empty");\r\n throw createBrowserAuthError(emptyNavigateUri);\r\n }\r\n if (navigateFrameWait) {\r\n return invokeAsync(loadFrame, PerformanceEvents.SilentHandlerLoadFrame, logger, performanceClient, correlationId)(requestUrl, navigateFrameWait, performanceClient, correlationId);\r\n }\r\n return invoke(loadFrameSync, PerformanceEvents.SilentHandlerLoadFrameSync, logger, performanceClient, correlationId)(requestUrl);\r\n}\r\n/**\r\n * Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.\r\n * @param iframe\r\n * @param timeout\r\n */\r\nasync function monitorIframeForHash(iframe, timeout, pollIntervalMilliseconds, performanceClient, logger, correlationId, responseType) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, correlationId);\r\n return new Promise((resolve, reject) => {\r\n if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {\r\n logger.warning(`system.loadFrameTimeout or system.iframeHashTimeout set to lower (${timeout}ms) than the default (${DEFAULT_IFRAME_TIMEOUT_MS}ms). This may result in timeouts.`);\r\n }\r\n /*\r\n * Polling for iframes can be purely timing based,\r\n * since we don\'t need to account for interaction.\r\n */\r\n const timeoutId = window.setTimeout(() => {\r\n window.clearInterval(intervalId);\r\n reject(createBrowserAuthError(monitorWindowTimeout));\r\n }, timeout);\r\n const intervalId = window.setInterval(() => {\r\n let href = "";\r\n const contentWindow = iframe.contentWindow;\r\n try {\r\n /*\r\n * Will throw if cross origin,\r\n * which should be caught and ignored\r\n * since we need the interval to keep running while on STS UI.\r\n */\r\n href = contentWindow ? contentWindow.location.href : "";\r\n }\r\n catch (e) { }\r\n if (!href || href === "about:blank") {\r\n return;\r\n }\r\n let responseString = "";\r\n if (contentWindow) {\r\n if (responseType === ServerResponseType.QUERY) {\r\n responseString = contentWindow.location.search;\r\n }\r\n else {\r\n responseString = contentWindow.location.hash;\r\n }\r\n }\r\n window.clearTimeout(timeoutId);\r\n window.clearInterval(intervalId);\r\n resolve(responseString);\r\n }, pollIntervalMilliseconds);\r\n }).finally(() => {\r\n invoke(removeHiddenIframe, PerformanceEvents.RemoveHiddenIframe, logger, performanceClient, correlationId)(iframe);\r\n });\r\n}\r\n/**\r\n * @hidden\r\n * Loads iframe with authorization endpoint URL\r\n * @ignore\r\n * @deprecated\r\n */\r\nfunction loadFrame(urlNavigate, navigateFrameWait, performanceClient, correlationId) {\r\n performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, correlationId);\r\n /*\r\n * This trick overcomes iframe navigation in IE\r\n * IE does not load the page consistently in iframe\r\n */\r\n return new Promise((resolve, reject) => {\r\n const frameHandle = createHiddenIframe();\r\n window.setTimeout(() => {\r\n if (!frameHandle) {\r\n reject("Unable to load iframe");\r\n return;\r\n }\r\n frameHandle.src = urlNavigate;\r\n resolve(frameHandle);\r\n }, navigateFrameWait);\r\n });\r\n}\r\n/**\r\n * @hidden\r\n * Loads the iframe synchronously when the navigateTimeFrame is set to `0`\r\n * @param urlNavigate\r\n * @param frameName\r\n * @param logger\r\n */\r\nfunction loadFrameSync(urlNavigate) {\r\n const frameHandle = createHiddenIframe();\r\n frameHandle.src = urlNavigate;\r\n return frameHandle;\r\n}\r\n/**\r\n * @hidden\r\n * Creates a new hidden iframe or gets an existing one for silent token renewal.\r\n * @ignore\r\n */\r\nfunction createHiddenIframe() {\r\n const authFrame = document.createElement("iframe");\r\n authFrame.className = "msalSilentIframe";\r\n authFrame.style.visibility = "hidden";\r\n authFrame.style.position = "absolute";\r\n authFrame.style.width = authFrame.style.height = "0";\r\n authFrame.style.border = "0";\r\n authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");\r\n document.body.appendChild(authFrame);\r\n return authFrame;\r\n}\r\n/**\r\n * @hidden\r\n * Removes a hidden iframe from the page.\r\n * @ignore\r\n */\r\nfunction removeHiddenIframe(iframe) {\r\n if (document.body === iframe.parentNode) {\r\n document.body.removeChild(iframe);\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentHandler.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/SilentIframeClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SilentIframeClient extends StandardInteractionClient {\r\n constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {\r\n super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n this.apiId = apiId;\r\n this.nativeStorage = nativeStorageImpl;\r\n }\r\n /**\r\n * Acquires a token silently by opening a hidden iframe to the /authorize endpoint with prompt=none or prompt=no_session\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);\r\n // Check that we have some SSO data\r\n if (!request.loginHint &&\r\n !request.sid &&\r\n (!request.account || !request.account.username)) {\r\n this.logger.warning("No user hint provided. The authorization server may need more information to complete this request.");\r\n }\r\n // Check the prompt value\r\n const inputRequest = { ...request };\r\n if (inputRequest.prompt) {\r\n if (inputRequest.prompt !== PromptValue.NONE &&\r\n inputRequest.prompt !== PromptValue.NO_SESSION) {\r\n this.logger.warning(`SilentIframeClient. Replacing invalid prompt ${inputRequest.prompt} with ${PromptValue.NONE}`);\r\n inputRequest.prompt = PromptValue.NONE;\r\n }\r\n }\r\n else {\r\n inputRequest.prompt = PromptValue.NONE;\r\n }\r\n // Create silent request\r\n const silentRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, request.correlationId)(inputRequest, InteractionType.Silent);\r\n preconnect(silentRequest.authority);\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);\r\n let authClient;\r\n try {\r\n // Initialize the client\r\n authClient = await invokeAsync(this.createAuthCodeClient.bind(this), PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.logger, this.performanceClient, request.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: silentRequest.authority,\r\n requestAzureCloudOptions: silentRequest.azureCloudOptions,\r\n requestExtraQueryParameters: silentRequest.extraQueryParameters,\r\n account: silentRequest.account,\r\n });\r\n return await invokeAsync(this.silentTokenHelper.bind(this), PerformanceEvents.SilentIframeClientTokenHelper, this.logger, this.performanceClient, request.correlationId)(authClient, silentRequest);\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n if (!authClient ||\r\n !(e instanceof AuthError) ||\r\n e.errorCode !== BrowserConstants.INVALID_GRANT_ERROR) {\r\n throw e;\r\n }\r\n this.performanceClient.addFields({\r\n retryError: e.errorCode,\r\n }, this.correlationId);\r\n const retrySilentRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, request.correlationId)(inputRequest, InteractionType.Silent);\r\n return await invokeAsync(this.silentTokenHelper.bind(this), PerformanceEvents.SilentIframeClientTokenHelper, this.logger, this.performanceClient, this.correlationId)(authClient, retrySilentRequest);\r\n }\r\n }\r\n /**\r\n * Currently Unsupported\r\n */\r\n logout() {\r\n // Synchronous so we must reject\r\n return Promise.reject(createBrowserAuthError(silentLogoutUnsupported));\r\n }\r\n /**\r\n * Helper which acquires an authorization code silently using a hidden iframe from given url\r\n * using the scopes requested as part of the id, and exchanges the code for a set of OAuth tokens.\r\n * @param navigateUrl\r\n * @param userRequestScopes\r\n */\r\n async silentTokenHelper(authClient, silentRequest) {\r\n const correlationId = silentRequest.correlationId;\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentIframeClientTokenHelper, correlationId);\r\n // Create auth code request and generate PKCE params\r\n const authCodeRequest = await invokeAsync(this.initializeAuthorizationCodeRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, this.logger, this.performanceClient, correlationId)(silentRequest);\r\n // Create authorize request url\r\n const navigateUrl = await invokeAsync(authClient.getAuthCodeUrl.bind(authClient), PerformanceEvents.GetAuthCodeUrl, this.logger, this.performanceClient, correlationId)({\r\n ...silentRequest,\r\n nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, silentRequest.authenticationScheme),\r\n });\r\n // Create silent handler\r\n const interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);\r\n // Get the frame handle for the silent request\r\n const msalFrame = await invokeAsync(initiateAuthRequest, PerformanceEvents.SilentHandlerInitiateAuthRequest, this.logger, this.performanceClient, correlationId)(navigateUrl, this.performanceClient, this.logger, correlationId, this.config.system.navigateFrameWait);\r\n const responseType = this.config.auth.OIDCOptions.serverResponseType;\r\n // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\r\n const responseString = await invokeAsync(monitorIframeForHash, PerformanceEvents.SilentHandlerMonitorIframeForHash, this.logger, this.performanceClient, correlationId)(msalFrame, this.config.system.iframeHashTimeout, this.config.system.pollIntervalMilliseconds, this.performanceClient, this.logger, correlationId, responseType);\r\n const serverParams = invoke(deserializeResponse, PerformanceEvents.DeserializeResponse, this.logger, this.performanceClient, this.correlationId)(responseString, responseType, this.logger);\r\n if (serverParams.accountId) {\r\n this.logger.verbose("Account id found in hash, calling WAM for token");\r\n if (!this.nativeMessageHandler) {\r\n throw createBrowserAuthError(nativeConnectionNotEstablished);\r\n }\r\n const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.apiId, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, correlationId);\r\n const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, silentRequest.state);\r\n return invokeAsync(nativeInteractionClient.acquireToken.bind(nativeInteractionClient), PerformanceEvents.NativeInteractionClientAcquireToken, this.logger, this.performanceClient, correlationId)({\r\n ...silentRequest,\r\n state: userRequestState,\r\n prompt: silentRequest.prompt || PromptValue.NONE,\r\n });\r\n }\r\n // Handle response from hash string\r\n return invokeAsync(interactionHandler.handleCodeResponse.bind(interactionHandler), PerformanceEvents.HandleCodeResponse, this.logger, this.performanceClient, correlationId)(serverParams, silentRequest);\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentIframeClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/SilentRefreshClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SilentRefreshClient extends StandardInteractionClient {\r\n /**\r\n * Exchanges the refresh token for new tokens\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentRefreshClientAcquireToken, request.correlationId);\r\n const baseRequest = await invokeAsync(initializeBaseRequest, PerformanceEvents.InitializeBaseRequest, this.logger, this.performanceClient, request.correlationId)(request, this.config, this.performanceClient, this.logger);\r\n const silentRequest = {\r\n ...request,\r\n ...baseRequest,\r\n };\r\n if (request.redirectUri) {\r\n // Make sure any passed redirectUri is converted to an absolute URL - redirectUri is not a required parameter for refresh token redemption so only include if explicitly provided\r\n silentRequest.redirectUri = this.getRedirectUri(request.redirectUri);\r\n }\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);\r\n const refreshTokenClient = await this.createRefreshTokenClient({\r\n serverTelemetryManager,\r\n authorityUrl: silentRequest.authority,\r\n azureCloudOptions: silentRequest.azureCloudOptions,\r\n account: silentRequest.account,\r\n });\r\n // Send request to renew token. Auth module will throw errors if token cannot be renewed.\r\n return invokeAsync(refreshTokenClient.acquireTokenByRefreshToken.bind(refreshTokenClient), PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, this.logger, this.performanceClient, request.correlationId)(silentRequest).catch((e) => {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n throw e;\r\n });\r\n }\r\n /**\r\n * Currently Unsupported\r\n */\r\n logout() {\r\n // Synchronous so we must reject\r\n return Promise.reject(createBrowserAuthError(silentLogoutUnsupported));\r\n }\r\n /**\r\n * Creates a Refresh Client with the given authority, or the default authority.\r\n * @param params {\r\n * serverTelemetryManager: ServerTelemetryManager;\r\n * authorityUrl?: string;\r\n * azureCloudOptions?: AzureCloudOptions;\r\n * extraQueryParams?: StringDict;\r\n * account?: AccountInfo;\r\n * }\r\n */\r\n async createRefreshTokenClient(params) {\r\n // Create auth module.\r\n const clientConfig = await invokeAsync(this.getClientConfiguration.bind(this), PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.logger, this.performanceClient, this.correlationId)({\r\n serverTelemetryManager: params.serverTelemetryManager,\r\n requestAuthority: params.authorityUrl,\r\n requestAzureCloudOptions: params.azureCloudOptions,\r\n requestExtraQueryParameters: params.extraQueryParameters,\r\n account: params.account,\r\n });\r\n return new RefreshTokenClient(clientConfig, this.performanceClient);\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentRefreshClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/TokenCache.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Token cache manager\r\n */\r\nclass TokenCache {\r\n constructor(configuration, storage, logger, cryptoObj) {\r\n this.isBrowserEnvironment = typeof window !== "undefined";\r\n this.config = configuration;\r\n this.storage = storage;\r\n this.logger = logger;\r\n this.cryptoObj = cryptoObj;\r\n }\r\n // Move getAllAccounts here and cache utility APIs\r\n /**\r\n * API to load tokens to msal-browser cache.\r\n * @param request\r\n * @param response\r\n * @param options\r\n * @returns `AuthenticationResult` for the response that was loaded.\r\n */\r\n loadExternalTokens(request, response, options) {\r\n if (!this.isBrowserEnvironment) {\r\n throw createBrowserAuthError(nonBrowserEnvironment);\r\n }\r\n const idTokenClaims = response.id_token\r\n ? extractTokenClaims(response.id_token, base64Decode)\r\n : undefined;\r\n const authorityOptions = {\r\n protocolMode: this.config.auth.protocolMode,\r\n knownAuthorities: this.config.auth.knownAuthorities,\r\n cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n authorityMetadata: this.config.auth.authorityMetadata,\r\n skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,\r\n };\r\n const authority = request.authority\r\n ? new Authority(Authority.generateAuthority(request.authority, request.azureCloudOptions), this.config.system.networkClient, this.storage, authorityOptions, this.logger, request.correlationId || createNewGuid())\r\n : undefined;\r\n const cacheRecordAccount = this.loadAccount(request, options.clientInfo || response.client_info || "", idTokenClaims, authority);\r\n const idToken = this.loadIdToken(response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment, cacheRecordAccount.realm);\r\n const accessToken = this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment, cacheRecordAccount.realm, options);\r\n const refreshToken = this.loadRefreshToken(response, cacheRecordAccount.homeAccountId, cacheRecordAccount.environment);\r\n return this.generateAuthenticationResult(request, {\r\n account: cacheRecordAccount,\r\n idToken,\r\n accessToken,\r\n refreshToken,\r\n }, idTokenClaims, authority);\r\n }\r\n /**\r\n * Helper function to load account to msal-browser cache\r\n * @param idToken\r\n * @param environment\r\n * @param clientInfo\r\n * @param authorityType\r\n * @param requestHomeAccountId\r\n * @returns `AccountEntity`\r\n */\r\n loadAccount(request, clientInfo, idTokenClaims, authority) {\r\n this.logger.verbose("TokenCache - loading account");\r\n if (request.account) {\r\n const accountEntity = AccountEntity.createFromAccountInfo(request.account);\r\n this.storage.setAccount(accountEntity);\r\n return accountEntity;\r\n }\r\n else if (!authority || (!clientInfo && !idTokenClaims)) {\r\n this.logger.error("TokenCache - if an account is not provided on the request, authority and either clientInfo or idToken must be provided instead.");\r\n throw createBrowserAuthError(unableToLoadToken);\r\n }\r\n const homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authority.authorityType, this.logger, this.cryptoObj, idTokenClaims);\r\n const claimsTenantId = idTokenClaims?.tid;\r\n const cachedAccount = buildAccountToCache(this.storage, authority, homeAccountId, base64Decode, idTokenClaims, clientInfo, authority.hostnameAndPort, claimsTenantId, undefined, // authCodePayload\r\n undefined, // nativeAccountId\r\n this.logger);\r\n this.storage.setAccount(cachedAccount);\r\n return cachedAccount;\r\n }\r\n /**\r\n * Helper function to load id tokens to msal-browser cache\r\n * @param idToken\r\n * @param homeAccountId\r\n * @param environment\r\n * @param tenantId\r\n * @returns `IdTokenEntity`\r\n */\r\n loadIdToken(response, homeAccountId, environment, tenantId) {\r\n if (!response.id_token) {\r\n this.logger.verbose("TokenCache - no id token found in response");\r\n return null;\r\n }\r\n this.logger.verbose("TokenCache - loading id token");\r\n const idTokenEntity = createIdTokenEntity(homeAccountId, environment, response.id_token, this.config.auth.clientId, tenantId);\r\n this.storage.setIdTokenCredential(idTokenEntity);\r\n return idTokenEntity;\r\n }\r\n /**\r\n * Helper function to load access tokens to msal-browser cache\r\n * @param request\r\n * @param response\r\n * @param homeAccountId\r\n * @param environment\r\n * @param tenantId\r\n * @returns `AccessTokenEntity`\r\n */\r\n loadAccessToken(request, response, homeAccountId, environment, tenantId, options) {\r\n if (!response.access_token) {\r\n this.logger.verbose("TokenCache - no access token found in response");\r\n return null;\r\n }\r\n else if (!response.expires_in) {\r\n this.logger.error("TokenCache - no expiration set on the access token. Cannot add it to the cache.");\r\n return null;\r\n }\r\n else if (!response.scope &&\r\n (!request.scopes || !request.scopes.length)) {\r\n this.logger.error("TokenCache - scopes not specified in the request or response. Cannot add token to the cache.");\r\n return null;\r\n }\r\n this.logger.verbose("TokenCache - loading access token");\r\n const scopes = response.scope\r\n ? ScopeSet.fromString(response.scope)\r\n : new ScopeSet(request.scopes);\r\n const expiresOn = options.expiresOn ||\r\n response.expires_in + new Date().getTime() / 1000;\r\n const extendedExpiresOn = options.extendedExpiresOn ||\r\n (response.ext_expires_in || response.expires_in) +\r\n new Date().getTime() / 1000;\r\n const accessTokenEntity = createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes.printScopes(), expiresOn, extendedExpiresOn, base64Decode);\r\n this.storage.setAccessTokenCredential(accessTokenEntity);\r\n return accessTokenEntity;\r\n }\r\n /**\r\n * Helper function to load refresh tokens to msal-browser cache\r\n * @param request\r\n * @param response\r\n * @param homeAccountId\r\n * @param environment\r\n * @returns `RefreshTokenEntity`\r\n */\r\n loadRefreshToken(response, homeAccountId, environment) {\r\n if (!response.refresh_token) {\r\n this.logger.verbose("TokenCache - no refresh token found in response");\r\n return null;\r\n }\r\n this.logger.verbose("TokenCache - loading refresh token");\r\n const refreshTokenEntity = createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId, response.foci, undefined, // userAssertionHash\r\n response.refresh_token_expires_in);\r\n this.storage.setRefreshTokenCredential(refreshTokenEntity);\r\n return refreshTokenEntity;\r\n }\r\n /**\r\n * Helper function to generate an `AuthenticationResult` for the result.\r\n * @param request\r\n * @param idTokenObj\r\n * @param cacheRecord\r\n * @param authority\r\n * @returns `AuthenticationResult`\r\n */\r\n generateAuthenticationResult(request, cacheRecord, idTokenClaims, authority) {\r\n let accessToken = "";\r\n let responseScopes = [];\r\n let expiresOn = null;\r\n let extExpiresOn;\r\n if (cacheRecord?.accessToken) {\r\n accessToken = cacheRecord.accessToken.secret;\r\n responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();\r\n expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);\r\n extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);\r\n }\r\n const accountEntity = cacheRecord.account;\r\n return {\r\n authority: authority ? authority.canonicalAuthority : "",\r\n uniqueId: cacheRecord.account.localAccountId,\r\n tenantId: cacheRecord.account.realm,\r\n scopes: responseScopes,\r\n account: accountEntity.getAccountInfo(),\r\n idToken: cacheRecord.idToken?.secret || "",\r\n idTokenClaims: idTokenClaims || {},\r\n accessToken: accessToken,\r\n fromCache: true,\r\n expiresOn: expiresOn,\r\n correlationId: request.correlationId || "",\r\n requestId: "",\r\n extExpiresOn: extExpiresOn,\r\n familyId: cacheRecord.refreshToken?.familyId || "",\r\n tokenType: cacheRecord?.accessToken?.tokenType || "",\r\n state: request.state || "",\r\n cloudGraphHostName: accountEntity.cloudGraphHostName || "",\r\n msGraphHost: accountEntity.msGraphHost || "",\r\n fromNativeBroker: false,\r\n };\r\n }\r\n}\n\n\n//# sourceMappingURL=TokenCache.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass HybridSpaAuthorizationCodeClient extends AuthorizationCodeClient {\r\n constructor(config) {\r\n super(config);\r\n this.includeRedirectUri = false;\r\n }\r\n}\n\n\n//# sourceMappingURL=HybridSpaAuthorizationCodeClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/interaction_client/SilentAuthCodeClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SilentAuthCodeClient extends StandardInteractionClient {\r\n constructor(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeMessageHandler, correlationId) {\r\n super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n this.apiId = apiId;\r\n }\r\n /**\r\n * Acquires a token silently by redeeming an authorization code against the /token endpoint\r\n * @param request\r\n */\r\n async acquireToken(request) {\r\n // Auth code payload is required\r\n if (!request.code) {\r\n throw createBrowserAuthError(authCodeRequired);\r\n }\r\n // Create silent request\r\n const silentRequest = await invokeAsync(this.initializeAuthorizationRequest.bind(this), PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.logger, this.performanceClient, request.correlationId)(request, InteractionType.Silent);\r\n const serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);\r\n try {\r\n // Create auth code request (PKCE not needed)\r\n const authCodeRequest = {\r\n ...silentRequest,\r\n code: request.code,\r\n };\r\n // Initialize the client\r\n const clientConfig = await invokeAsync(this.getClientConfiguration.bind(this), PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.logger, this.performanceClient, request.correlationId)({\r\n serverTelemetryManager,\r\n requestAuthority: silentRequest.authority,\r\n requestAzureCloudOptions: silentRequest.azureCloudOptions,\r\n requestExtraQueryParameters: silentRequest.extraQueryParameters,\r\n account: silentRequest.account,\r\n });\r\n const authClient = new HybridSpaAuthorizationCodeClient(clientConfig);\r\n this.logger.verbose("Auth code client created");\r\n // Create silent handler\r\n const interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);\r\n // Handle auth code parameters from request\r\n return await invokeAsync(interactionHandler.handleCodeResponseFromServer.bind(interactionHandler), PerformanceEvents.HandleCodeResponseFromServer, this.logger, this.performanceClient, request.correlationId)({\r\n code: request.code,\r\n msgraph_host: request.msGraphHost,\r\n cloud_graph_host_name: request.cloudGraphHostName,\r\n cloud_instance_host_name: request.cloudInstanceHostName,\r\n }, silentRequest, false);\r\n }\r\n catch (e) {\r\n if (e instanceof AuthError) {\r\n e.setCorrelationId(this.correlationId);\r\n serverTelemetryManager.cacheFailedRequest(e);\r\n }\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Currently Unsupported\r\n */\r\n logout() {\r\n // Synchronous so we must reject\r\n return Promise.reject(createBrowserAuthError(silentLogoutUnsupported));\r\n }\r\n}\n\n\n//# sourceMappingURL=SilentAuthCodeClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/controllers/StandardController.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction getAccountType(account) {\r\n const idTokenClaims = account?.idTokenClaims;\r\n if (idTokenClaims?.tfp || idTokenClaims?.acr) {\r\n return "B2C";\r\n }\r\n if (!idTokenClaims?.tid) {\r\n return undefined;\r\n }\r\n else if (idTokenClaims?.tid === "9188040d-6c67-4c5b-b112-36a304b66dad") {\r\n return "MSA";\r\n }\r\n return "AAD";\r\n}\r\nfunction StandardController_preflightCheck(initialized, performanceEvent) {\r\n try {\r\n preflightCheck(initialized);\r\n }\r\n catch (e) {\r\n performanceEvent.end({ success: false }, e);\r\n throw e;\r\n }\r\n}\r\nclass StandardController {\r\n /**\r\n * @constructor\r\n * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object\r\n *\r\n * Important attributes in the Configuration object for auth are:\r\n * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n * - authority: the authority URL for your application.\r\n * - redirect_uri: the uri of your application registered in the portal.\r\n *\r\n * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}\r\n * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.\r\n * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.\r\n * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.\r\n *\r\n * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/\r\n * Full B2C functionality will be available in this library in future versions.\r\n *\r\n * @param configuration Object for the MSAL PublicClientApplication instance\r\n */\r\n constructor(operatingContext) {\r\n this.operatingContext = operatingContext;\r\n this.isBrowserEnvironment =\r\n this.operatingContext.isBrowserEnvironment();\r\n // Set the configuration.\r\n this.config = operatingContext.getConfig();\r\n this.initialized = false;\r\n // Initialize logger\r\n this.logger = this.operatingContext.getLogger();\r\n // Initialize the network module class.\r\n this.networkClient = this.config.system.networkClient;\r\n // Initialize the navigation client class.\r\n this.navigationClient = this.config.system.navigationClient;\r\n // Initialize redirectResponse Map\r\n this.redirectResponse = new Map();\r\n // Initial hybrid spa map\r\n this.hybridAuthCodeResponses = new Map();\r\n // Initialize performance client\r\n this.performanceClient = this.config.telemetry.client;\r\n // Initialize the crypto class.\r\n this.browserCrypto = this.isBrowserEnvironment\r\n ? new CryptoOps(this.logger, this.performanceClient)\r\n : DEFAULT_CRYPTO_IMPLEMENTATION;\r\n this.eventHandler = new EventHandler(this.logger);\r\n // Initialize the browser storage class.\r\n this.browserStorage = this.isBrowserEnvironment\r\n ? new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger, buildStaticAuthorityOptions(this.config.auth), this.performanceClient)\r\n : DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);\r\n // initialize in memory storage for native flows\r\n const nativeCacheOptions = {\r\n cacheLocation: BrowserCacheLocation.MemoryStorage,\r\n temporaryCacheLocation: BrowserCacheLocation.MemoryStorage,\r\n storeAuthStateInCookie: false,\r\n secureCookies: false,\r\n cacheMigrationEnabled: false,\r\n claimsBasedCachingEnabled: false,\r\n };\r\n this.nativeInternalStorage = new BrowserCacheManager(this.config.auth.clientId, nativeCacheOptions, this.browserCrypto, this.logger, undefined, this.performanceClient);\r\n // Initialize the token cache\r\n this.tokenCache = new TokenCache(this.config, this.browserStorage, this.logger, this.browserCrypto);\r\n this.activeSilentTokenRequests = new Map();\r\n // Register listener functions\r\n this.trackPageVisibility = this.trackPageVisibility.bind(this);\r\n // Register listener functions\r\n this.trackPageVisibilityWithMeasurement =\r\n this.trackPageVisibilityWithMeasurement.bind(this);\r\n // account storage events\r\n this.listeningToStorageEvents = false;\r\n this.handleAccountCacheChange =\r\n this.handleAccountCacheChange.bind(this);\r\n }\r\n static async createController(operatingContext, request) {\r\n const controller = new StandardController(operatingContext);\r\n await controller.initialize(request);\r\n return controller;\r\n }\r\n trackPageVisibility(correlationId) {\r\n if (!correlationId) {\r\n return;\r\n }\r\n this.logger.info("Perf: Visibility change detected");\r\n this.performanceClient.incrementFields({ visibilityChangeCount: 1 }, correlationId);\r\n }\r\n /**\r\n * Initializer function to perform async startup tasks such as connecting to WAM extension\r\n * @param request {?InitializeApplicationRequest} correlation id\r\n */\r\n async initialize(request) {\r\n this.logger.trace("initialize called");\r\n if (this.initialized) {\r\n this.logger.info("initialize has already been called, exiting early.");\r\n return;\r\n }\r\n if (!this.isBrowserEnvironment) {\r\n this.logger.info("in non-browser environment, exiting early.");\r\n this.initialized = true;\r\n this.eventHandler.emitEvent(EventType.INITIALIZE_END);\r\n return;\r\n }\r\n const initCorrelationId = request?.correlationId || this.getRequestCorrelationId();\r\n const allowNativeBroker = this.config.system.allowNativeBroker;\r\n const initMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.InitializeClientApplication, initCorrelationId);\r\n this.eventHandler.emitEvent(EventType.INITIALIZE_START);\r\n if (allowNativeBroker) {\r\n try {\r\n this.nativeExtensionProvider =\r\n await NativeMessageHandler.createProvider(this.logger, this.config.system.nativeBrokerHandshakeTimeout, this.performanceClient);\r\n }\r\n catch (e) {\r\n this.logger.verbose(e);\r\n }\r\n }\r\n if (!this.config.cache.claimsBasedCachingEnabled) {\r\n this.logger.verbose("Claims-based caching is disabled. Clearing the previous cache with claims");\r\n await invokeAsync(this.browserStorage.clearTokensAndKeysWithClaims.bind(this.browserStorage), PerformanceEvents.ClearTokensAndKeysWithClaims, this.logger, this.performanceClient, initCorrelationId)(this.performanceClient, initCorrelationId);\r\n }\r\n this.initialized = true;\r\n this.eventHandler.emitEvent(EventType.INITIALIZE_END);\r\n initMeasurement.end({ allowNativeBroker, success: true });\r\n }\r\n // #region Redirect Flow\r\n /**\r\n * Event handler function which allows users to fire events after the PublicClientApplication object\r\n * has loaded during redirect flows. This should be invoked on all page loads involved in redirect\r\n * auth flows.\r\n * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.\r\n * @returns Token response or null. If the return value is null, then no auth redirect was detected.\r\n */\r\n async handleRedirectPromise(hash) {\r\n this.logger.verbose("handleRedirectPromise called");\r\n // Block token acquisition before initialize has been called\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n if (this.isBrowserEnvironment) {\r\n /**\r\n * Store the promise on the PublicClientApplication instance if this is the first invocation of handleRedirectPromise,\r\n * otherwise return the promise from the first invocation. Prevents race conditions when handleRedirectPromise is called\r\n * several times concurrently.\r\n */\r\n const redirectResponseKey = hash || "";\r\n let response = this.redirectResponse.get(redirectResponseKey);\r\n if (typeof response === "undefined") {\r\n response = this.handleRedirectPromiseInternal(hash);\r\n this.redirectResponse.set(redirectResponseKey, response);\r\n this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise");\r\n }\r\n else {\r\n this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call");\r\n }\r\n return response;\r\n }\r\n this.logger.verbose("handleRedirectPromise returns null, not browser environment");\r\n return null;\r\n }\r\n /**\r\n * The internal details of handleRedirectPromise. This is separated out to a helper to allow handleRedirectPromise to memoize requests\r\n * @param hash\r\n * @returns\r\n */\r\n async handleRedirectPromiseInternal(hash) {\r\n const loggedInAccounts = this.getAllAccounts();\r\n const request = this.browserStorage.getCachedNativeRequest();\r\n const useNative = request &&\r\n NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider) &&\r\n this.nativeExtensionProvider &&\r\n !hash;\r\n const correlationId = useNative\r\n ? request?.correlationId\r\n : this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, true) || "";\r\n const rootMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenRedirect, correlationId);\r\n this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_START, InteractionType.Redirect);\r\n let redirectResponse;\r\n if (useNative && this.nativeExtensionProvider) {\r\n this.logger.trace("handleRedirectPromise - acquiring token from native platform");\r\n const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.handleRedirectPromise, this.performanceClient, this.nativeExtensionProvider, request.accountId, this.nativeInternalStorage, request.correlationId);\r\n redirectResponse = invokeAsync(nativeClient.handleRedirectPromise.bind(nativeClient), PerformanceEvents.HandleNativeRedirectPromiseMeasurement, this.logger, this.performanceClient, rootMeasurement.event.correlationId)(this.performanceClient, rootMeasurement.event.correlationId);\r\n }\r\n else {\r\n this.logger.trace("handleRedirectPromise - acquiring token from web flow");\r\n const redirectClient = this.createRedirectClient(correlationId);\r\n redirectResponse = invokeAsync(redirectClient.handleRedirectPromise.bind(redirectClient), PerformanceEvents.HandleRedirectPromiseMeasurement, this.logger, this.performanceClient, rootMeasurement.event.correlationId)(hash, rootMeasurement);\r\n }\r\n return redirectResponse\r\n .then((result) => {\r\n if (result) {\r\n // Emit login event if number of accounts change\r\n const isLoggingIn = loggedInAccounts.length < this.getAllAccounts().length;\r\n if (isLoggingIn) {\r\n this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Redirect, result);\r\n this.logger.verbose("handleRedirectResponse returned result, login success");\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Redirect, result);\r\n this.logger.verbose("handleRedirectResponse returned result, acquire token success");\r\n }\r\n rootMeasurement.end({\r\n success: true,\r\n accountType: getAccountType(result.account),\r\n });\r\n }\r\n else {\r\n /*\r\n * Instrument an event only if an error code is set. Otherwise, discard it when the redirect response\r\n * is empty and the error code is missing.\r\n */\r\n if (rootMeasurement.event.errorCode) {\r\n rootMeasurement.end({ success: false });\r\n }\r\n else {\r\n rootMeasurement.discard();\r\n }\r\n }\r\n this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);\r\n return result;\r\n })\r\n .catch((e) => {\r\n const eventError = e;\r\n // Emit login event if there is an account\r\n if (loggedInAccounts.length > 0) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, eventError);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, eventError);\r\n }\r\n this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);\r\n rootMeasurement.end({\r\n success: false,\r\n }, eventError);\r\n throw e;\r\n });\r\n }\r\n /**\r\n * Use when you want to obtain an access_token for your API by redirecting the user\'s browser window to the authorization endpoint. This function redirects\r\n * the page, so any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n async acquireTokenRedirect(request) {\r\n // Preflight request\r\n const correlationId = this.getRequestCorrelationId(request);\r\n this.logger.verbose("acquireTokenRedirect called", correlationId);\r\n const atrMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenPreRedirect, correlationId);\r\n atrMeasurement.add({\r\n accountType: getAccountType(request.account),\r\n scenarioId: request.scenarioId,\r\n });\r\n // Override on request only if set, as onRedirectNavigate field is deprecated\r\n const onRedirectNavigateCb = request.onRedirectNavigate;\r\n if (onRedirectNavigateCb) {\r\n request.onRedirectNavigate = (url) => {\r\n const navigate = typeof onRedirectNavigateCb === "function"\r\n ? onRedirectNavigateCb(url)\r\n : undefined;\r\n if (navigate !== false) {\r\n atrMeasurement.end({ success: true });\r\n }\r\n else {\r\n atrMeasurement.discard();\r\n }\r\n return navigate;\r\n };\r\n }\r\n else {\r\n const configOnRedirectNavigateCb = this.config.auth.onRedirectNavigate;\r\n this.config.auth.onRedirectNavigate = (url) => {\r\n const navigate = typeof configOnRedirectNavigateCb === "function"\r\n ? configOnRedirectNavigateCb(url)\r\n : undefined;\r\n if (navigate !== false) {\r\n atrMeasurement.end({ success: true });\r\n }\r\n else {\r\n atrMeasurement.discard();\r\n }\r\n return navigate;\r\n };\r\n }\r\n // If logged in, emit acquire token events\r\n const isLoggedIn = this.getAllAccounts().length > 0;\r\n try {\r\n redirectPreflightCheck(this.initialized, this.config);\r\n this.browserStorage.setInteractionInProgress(true);\r\n if (isLoggedIn) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Redirect, request);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Redirect, request);\r\n }\r\n let result;\r\n if (this.nativeExtensionProvider && this.canUseNative(request)) {\r\n const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenRedirect, this.performanceClient, this.nativeExtensionProvider, this.getNativeAccountId(request), this.nativeInternalStorage, correlationId);\r\n result = nativeClient\r\n .acquireTokenRedirect(request, atrMeasurement)\r\n .catch((e) => {\r\n if (e instanceof NativeAuthError &&\r\n isFatalNativeAuthError(e)) {\r\n this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n const redirectClient = this.createRedirectClient(correlationId);\r\n return redirectClient.acquireToken(request);\r\n }\r\n else if (e instanceof InteractionRequiredAuthError) {\r\n this.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow");\r\n const redirectClient = this.createRedirectClient(correlationId);\r\n return redirectClient.acquireToken(request);\r\n }\r\n this.browserStorage.setInteractionInProgress(false);\r\n throw e;\r\n });\r\n }\r\n else {\r\n const redirectClient = this.createRedirectClient(correlationId);\r\n result = redirectClient.acquireToken(request);\r\n }\r\n return await result;\r\n }\r\n catch (e) {\r\n atrMeasurement.end({ success: false }, e);\r\n if (isLoggedIn) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, e);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);\r\n }\r\n throw e;\r\n }\r\n }\r\n // #endregion\r\n // #region Popup Flow\r\n /**\r\n * Use when you want to obtain an access_token for your API via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n acquireTokenPopup(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n const atPopupMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenPopup, correlationId);\r\n atPopupMeasurement.add({\r\n scenarioId: request.scenarioId,\r\n accountType: getAccountType(request.account),\r\n });\r\n try {\r\n this.logger.verbose("acquireTokenPopup called", correlationId);\r\n StandardController_preflightCheck(this.initialized, atPopupMeasurement);\r\n this.browserStorage.setInteractionInProgress(true);\r\n }\r\n catch (e) {\r\n // Since this function is syncronous we need to reject\r\n return Promise.reject(e);\r\n }\r\n // If logged in, emit acquire token events\r\n const loggedInAccounts = this.getAllAccounts();\r\n if (loggedInAccounts.length > 0) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Popup, request);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Popup, request);\r\n }\r\n let result;\r\n if (this.canUseNative(request)) {\r\n result = this.acquireTokenNative({\r\n ...request,\r\n correlationId,\r\n }, ApiId.acquireTokenPopup)\r\n .then((response) => {\r\n this.browserStorage.setInteractionInProgress(false);\r\n atPopupMeasurement.end({\r\n success: true,\r\n isNativeBroker: true,\r\n accountType: getAccountType(response.account),\r\n });\r\n return response;\r\n })\r\n .catch((e) => {\r\n if (e instanceof NativeAuthError &&\r\n isFatalNativeAuthError(e)) {\r\n this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n const popupClient = this.createPopupClient(correlationId);\r\n return popupClient.acquireToken(request);\r\n }\r\n else if (e instanceof InteractionRequiredAuthError) {\r\n this.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow");\r\n const popupClient = this.createPopupClient(correlationId);\r\n return popupClient.acquireToken(request);\r\n }\r\n this.browserStorage.setInteractionInProgress(false);\r\n throw e;\r\n });\r\n }\r\n else {\r\n const popupClient = this.createPopupClient(correlationId);\r\n result = popupClient.acquireToken(request);\r\n }\r\n return result\r\n .then((result) => {\r\n /*\r\n * If logged in, emit acquire token events\r\n */\r\n const isLoggingIn = loggedInAccounts.length < this.getAllAccounts().length;\r\n if (isLoggingIn) {\r\n this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Popup, result);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Popup, result);\r\n }\r\n atPopupMeasurement.end({\r\n success: true,\r\n accessTokenSize: result.accessToken.length,\r\n idTokenSize: result.idToken.length,\r\n accountType: getAccountType(result.account),\r\n });\r\n return result;\r\n })\r\n .catch((e) => {\r\n if (loggedInAccounts.length > 0) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Popup, null, e);\r\n }\r\n else {\r\n this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Popup, null, e);\r\n }\r\n atPopupMeasurement.end({\r\n success: false,\r\n }, e);\r\n // Since this function is syncronous we need to reject\r\n return Promise.reject(e);\r\n });\r\n }\r\n trackPageVisibilityWithMeasurement() {\r\n const measurement = this.ssoSilentMeasurement ||\r\n this.acquireTokenByCodeAsyncMeasurement;\r\n if (!measurement) {\r\n return;\r\n }\r\n this.logger.info("Perf: Visibility change detected in ", measurement.event.name);\r\n measurement.increment({\r\n visibilityChangeCount: 1,\r\n });\r\n }\r\n // #endregion\r\n // #region Silent Flow\r\n /**\r\n * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:\r\n * - Any browser using a form of Intelligent Tracking Prevention\r\n * - If there is not an established session with the service\r\n *\r\n * In these cases, the request must be done inside a popup or full frame redirect.\r\n *\r\n * For the cases where interaction is required, you cannot send a request with prompt=none.\r\n *\r\n * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as\r\n * you session on the server still exists.\r\n * @param request {@link SsoSilentRequest}\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n async ssoSilent(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n const validRequest = {\r\n ...request,\r\n // will be PromptValue.NONE or PromptValue.NO_SESSION\r\n prompt: request.prompt,\r\n correlationId: correlationId,\r\n };\r\n this.ssoSilentMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SsoSilent, correlationId);\r\n this.ssoSilentMeasurement?.add({\r\n scenarioId: request.scenarioId,\r\n accountType: getAccountType(request.account),\r\n });\r\n StandardController_preflightCheck(this.initialized, this.ssoSilentMeasurement);\r\n this.ssoSilentMeasurement?.increment({\r\n visibilityChangeCount: 0,\r\n });\r\n document.addEventListener("visibilitychange", this.trackPageVisibilityWithMeasurement);\r\n this.logger.verbose("ssoSilent called", correlationId);\r\n this.eventHandler.emitEvent(EventType.SSO_SILENT_START, InteractionType.Silent, validRequest);\r\n let result;\r\n if (this.canUseNative(validRequest)) {\r\n result = this.acquireTokenNative(validRequest, ApiId.ssoSilent).catch((e) => {\r\n // If native token acquisition fails for availability reasons fallback to standard flow\r\n if (e instanceof NativeAuthError && isFatalNativeAuthError(e)) {\r\n this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n const silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);\r\n return silentIframeClient.acquireToken(validRequest);\r\n }\r\n throw e;\r\n });\r\n }\r\n else {\r\n const silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);\r\n result = silentIframeClient.acquireToken(validRequest);\r\n }\r\n return result\r\n .then((response) => {\r\n this.eventHandler.emitEvent(EventType.SSO_SILENT_SUCCESS, InteractionType.Silent, response);\r\n this.ssoSilentMeasurement?.end({\r\n success: true,\r\n isNativeBroker: response.fromNativeBroker,\r\n accessTokenSize: response.accessToken.length,\r\n idTokenSize: response.idToken.length,\r\n accountType: getAccountType(response.account),\r\n });\r\n return response;\r\n })\r\n .catch((e) => {\r\n this.eventHandler.emitEvent(EventType.SSO_SILENT_FAILURE, InteractionType.Silent, null, e);\r\n this.ssoSilentMeasurement?.end({\r\n success: false,\r\n }, e);\r\n throw e;\r\n })\r\n .finally(() => {\r\n document.removeEventListener("visibilitychange", this.trackPageVisibilityWithMeasurement);\r\n });\r\n }\r\n /**\r\n * This function redeems an authorization code (passed as code) from the eSTS token endpoint.\r\n * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.\r\n * This API is not indended for normal authorization code acquisition and redemption.\r\n *\r\n * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.\r\n *\r\n * @param request {@link AuthorizationCodeRequest}\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n async acquireTokenByCode(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n this.logger.trace("acquireTokenByCode called", correlationId);\r\n const atbcMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByCode, correlationId);\r\n StandardController_preflightCheck(this.initialized, atbcMeasurement);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_START, InteractionType.Silent, request);\r\n atbcMeasurement.add({ scenarioId: request.scenarioId });\r\n try {\r\n if (request.code && request.nativeAccountId) {\r\n // Throw error in case server returns both spa_code and spa_accountid in exchange for auth code.\r\n throw createBrowserAuthError(spaCodeAndNativeAccountIdPresent);\r\n }\r\n else if (request.code) {\r\n const hybridAuthCode = request.code;\r\n let response = this.hybridAuthCodeResponses.get(hybridAuthCode);\r\n if (!response) {\r\n this.logger.verbose("Initiating new acquireTokenByCode request", correlationId);\r\n response = this.acquireTokenByCodeAsync({\r\n ...request,\r\n correlationId,\r\n })\r\n .then((result) => {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS, InteractionType.Silent, result);\r\n this.hybridAuthCodeResponses.delete(hybridAuthCode);\r\n atbcMeasurement.end({\r\n success: true,\r\n isNativeBroker: result.fromNativeBroker,\r\n accessTokenSize: result.accessToken.length,\r\n idTokenSize: result.idToken.length,\r\n accountType: getAccountType(result.account),\r\n });\r\n return result;\r\n })\r\n .catch((error) => {\r\n this.hybridAuthCodeResponses.delete(hybridAuthCode);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, error);\r\n atbcMeasurement.end({\r\n success: false,\r\n }, error);\r\n throw error;\r\n });\r\n this.hybridAuthCodeResponses.set(hybridAuthCode, response);\r\n }\r\n else {\r\n this.logger.verbose("Existing acquireTokenByCode request found", correlationId);\r\n atbcMeasurement.discard();\r\n }\r\n return await response;\r\n }\r\n else if (request.nativeAccountId) {\r\n if (this.canUseNative(request, request.nativeAccountId)) {\r\n const result = await this.acquireTokenNative({\r\n ...request,\r\n correlationId,\r\n }, ApiId.acquireTokenByCode, request.nativeAccountId).catch((e) => {\r\n // If native token acquisition fails for availability reasons fallback to standard flow\r\n if (e instanceof NativeAuthError &&\r\n isFatalNativeAuthError(e)) {\r\n this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n }\r\n throw e;\r\n });\r\n atbcMeasurement.end({\r\n accountType: getAccountType(result.account),\r\n success: true,\r\n });\r\n return result;\r\n }\r\n else {\r\n throw createBrowserAuthError(unableToAcquireTokenFromNativePlatform);\r\n }\r\n }\r\n else {\r\n throw createBrowserAuthError(authCodeOrNativeAccountIdRequired);\r\n }\r\n }\r\n catch (e) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, e);\r\n atbcMeasurement.end({\r\n success: false,\r\n }, e);\r\n throw e;\r\n }\r\n }\r\n /**\r\n * Creates a SilentAuthCodeClient to redeem an authorization code.\r\n * @param request\r\n * @returns Result of the operation to redeem the authorization code\r\n */\r\n async acquireTokenByCodeAsync(request) {\r\n this.logger.trace("acquireTokenByCodeAsync called", request.correlationId);\r\n this.acquireTokenByCodeAsyncMeasurement =\r\n this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByCodeAsync, request.correlationId);\r\n this.acquireTokenByCodeAsyncMeasurement?.increment({\r\n visibilityChangeCount: 0,\r\n });\r\n document.addEventListener("visibilitychange", this.trackPageVisibilityWithMeasurement);\r\n const silentAuthCodeClient = this.createSilentAuthCodeClient(request.correlationId);\r\n const silentTokenResult = await silentAuthCodeClient\r\n .acquireToken(request)\r\n .then((response) => {\r\n this.acquireTokenByCodeAsyncMeasurement?.end({\r\n success: true,\r\n fromCache: response.fromCache,\r\n isNativeBroker: response.fromNativeBroker,\r\n });\r\n return response;\r\n })\r\n .catch((tokenRenewalError) => {\r\n this.acquireTokenByCodeAsyncMeasurement?.end({\r\n success: false,\r\n }, tokenRenewalError);\r\n throw tokenRenewalError;\r\n })\r\n .finally(() => {\r\n document.removeEventListener("visibilitychange", this.trackPageVisibilityWithMeasurement);\r\n });\r\n return silentTokenResult;\r\n }\r\n /**\r\n * Attempt to acquire an access token from the cache\r\n * @param silentCacheClient SilentCacheClient\r\n * @param commonRequest CommonSilentFlowRequest\r\n * @param silentRequest SilentRequest\r\n * @returns A promise that, when resolved, returns the access token\r\n */\r\n async acquireTokenFromCache(commonRequest, cacheLookupPolicy) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenFromCache, commonRequest.correlationId);\r\n switch (cacheLookupPolicy) {\r\n case CacheLookupPolicy.Default:\r\n case CacheLookupPolicy.AccessToken:\r\n case CacheLookupPolicy.AccessTokenAndRefreshToken:\r\n const silentCacheClient = this.createSilentCacheClient(commonRequest.correlationId);\r\n return invokeAsync(silentCacheClient.acquireToken.bind(silentCacheClient), PerformanceEvents.SilentCacheClientAcquireToken, this.logger, this.performanceClient, commonRequest.correlationId)(commonRequest);\r\n default:\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n }\r\n /**\r\n * Attempt to acquire an access token via a refresh token\r\n * @param commonRequest CommonSilentFlowRequest\r\n * @param cacheLookupPolicy CacheLookupPolicy\r\n * @returns A promise that, when resolved, returns the access token\r\n */\r\n async acquireTokenByRefreshToken(commonRequest, cacheLookupPolicy) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenByRefreshToken, commonRequest.correlationId);\r\n switch (cacheLookupPolicy) {\r\n case CacheLookupPolicy.Default:\r\n case CacheLookupPolicy.AccessTokenAndRefreshToken:\r\n case CacheLookupPolicy.RefreshToken:\r\n case CacheLookupPolicy.RefreshTokenAndNetwork:\r\n const silentRefreshClient = this.createSilentRefreshClient(commonRequest.correlationId);\r\n return invokeAsync(silentRefreshClient.acquireToken.bind(silentRefreshClient), PerformanceEvents.SilentRefreshClientAcquireToken, this.logger, this.performanceClient, commonRequest.correlationId)(commonRequest);\r\n default:\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n }\r\n /**\r\n * Attempt to acquire an access token via an iframe\r\n * @param request CommonSilentFlowRequest\r\n * @returns A promise that, when resolved, returns the access token\r\n */\r\n async acquireTokenBySilentIframe(request) {\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenBySilentIframe, request.correlationId);\r\n const silentIframeClient = this.createSilentIframeClient(request.correlationId);\r\n return invokeAsync(silentIframeClient.acquireToken.bind(silentIframeClient), PerformanceEvents.SilentIframeClientAcquireToken, this.logger, this.performanceClient, request.correlationId)(request);\r\n }\r\n // #endregion\r\n // #region Logout\r\n /**\r\n * Deprecated logout function. Use logoutRedirect or logoutPopup instead\r\n * @param logoutRequest\r\n * @deprecated\r\n */\r\n async logout(logoutRequest) {\r\n const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.", correlationId);\r\n return this.logoutRedirect({\r\n correlationId,\r\n ...logoutRequest,\r\n });\r\n }\r\n /**\r\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n * @param logoutRequest\r\n */\r\n async logoutRedirect(logoutRequest) {\r\n const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n redirectPreflightCheck(this.initialized, this.config);\r\n this.browserStorage.setInteractionInProgress(true);\r\n const redirectClient = this.createRedirectClient(correlationId);\r\n return redirectClient.logout(logoutRequest);\r\n }\r\n /**\r\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n * @param logoutRequest\r\n */\r\n logoutPopup(logoutRequest) {\r\n try {\r\n const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n preflightCheck(this.initialized);\r\n this.browserStorage.setInteractionInProgress(true);\r\n const popupClient = this.createPopupClient(correlationId);\r\n return popupClient.logout(logoutRequest);\r\n }\r\n catch (e) {\r\n // Since this function is syncronous we need to reject\r\n return Promise.reject(e);\r\n }\r\n }\r\n /**\r\n * Creates a cache interaction client to clear broswer cache.\r\n * @param logoutRequest\r\n */\r\n async clearCache(logoutRequest) {\r\n if (!this.isBrowserEnvironment) {\r\n this.logger.info("in non-browser environment, returning early.");\r\n return;\r\n }\r\n const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n const cacheClient = this.createSilentCacheClient(correlationId);\r\n return cacheClient.logout(logoutRequest);\r\n }\r\n // #endregion\r\n // #region Account APIs\r\n /**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\n getAllAccounts(accountFilter) {\r\n return getAllAccounts(this.logger, this.browserStorage, this.isBrowserEnvironment, accountFilter);\r\n }\r\n /**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\n getAccount(accountFilter) {\r\n return getAccount(accountFilter, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param username\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByUsername(username) {\r\n return getAccountByUsername(username, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByHomeId(homeAccountId) {\r\n return getAccountByHomeId(homeAccountId, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByLocalId(localAccountId) {\r\n return getAccountByLocalId(localAccountId, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n setActiveAccount(account, this.browserStorage);\r\n }\r\n /**\r\n * Gets the currently active account\r\n */\r\n getActiveAccount() {\r\n return getActiveAccount(this.browserStorage);\r\n }\r\n // #endregion\r\n /**\r\n * Hydrates the cache with the tokens from an AuthenticationResult\r\n * @param result\r\n * @param request\r\n * @returns\r\n */\r\n async hydrateCache(result, request) {\r\n this.logger.verbose("hydrateCache called");\r\n // Account gets saved to browser storage regardless of native or not\r\n const accountEntity = AccountEntity.createFromAccountInfo(result.account, result.cloudGraphHostName, result.msGraphHost);\r\n this.browserStorage.setAccount(accountEntity);\r\n if (result.fromNativeBroker) {\r\n this.logger.verbose("Response was from native broker, storing in-memory");\r\n // Tokens from native broker are stored in-memory\r\n return this.nativeInternalStorage.hydrateCache(result, request);\r\n }\r\n else {\r\n return this.browserStorage.hydrateCache(result, request);\r\n }\r\n }\r\n // #region Helpers\r\n /**\r\n * Acquire a token from native device (e.g. WAM)\r\n * @param request\r\n */\r\n async acquireTokenNative(request, apiId, accountId) {\r\n this.logger.trace("acquireTokenNative called");\r\n if (!this.nativeExtensionProvider) {\r\n throw createBrowserAuthError(nativeConnectionNotEstablished);\r\n }\r\n const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, apiId, this.performanceClient, this.nativeExtensionProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);\r\n return nativeClient.acquireToken(request);\r\n }\r\n /**\r\n * Returns boolean indicating if this request can use the native broker\r\n * @param request\r\n */\r\n canUseNative(request, accountId) {\r\n this.logger.trace("canUseNative called");\r\n if (!NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme)) {\r\n this.logger.trace("canUseNative: isNativeAvailable returned false, returning false");\r\n return false;\r\n }\r\n if (request.prompt) {\r\n switch (request.prompt) {\r\n case PromptValue.NONE:\r\n case PromptValue.CONSENT:\r\n case PromptValue.LOGIN:\r\n this.logger.trace("canUseNative: prompt is compatible with native flow");\r\n break;\r\n default:\r\n this.logger.trace(`canUseNative: prompt = ${request.prompt} is not compatible with native flow, returning false`);\r\n return false;\r\n }\r\n }\r\n if (!accountId && !this.getNativeAccountId(request)) {\r\n this.logger.trace("canUseNative: nativeAccountId is not available, returning false");\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Get the native accountId from the account\r\n * @param request\r\n * @returns\r\n */\r\n getNativeAccountId(request) {\r\n const account = request.account ||\r\n this.getAccount({\r\n loginHint: request.loginHint,\r\n sid: request.sid,\r\n }) ||\r\n this.getActiveAccount();\r\n return (account && account.nativeAccountId) || "";\r\n }\r\n /**\r\n * Returns new instance of the Popup Interaction Client\r\n * @param correlationId\r\n */\r\n createPopupClient(correlationId) {\r\n return new PopupClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Returns new instance of the Redirect Interaction Client\r\n * @param correlationId\r\n */\r\n createRedirectClient(correlationId) {\r\n return new RedirectClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Returns new instance of the Silent Iframe Interaction Client\r\n * @param correlationId\r\n */\r\n createSilentIframeClient(correlationId) {\r\n return new SilentIframeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Returns new instance of the Silent Cache Interaction Client\r\n */\r\n createSilentCacheClient(correlationId) {\r\n return new SilentCacheClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Returns new instance of the Silent Refresh Interaction Client\r\n */\r\n createSilentRefreshClient(correlationId) {\r\n return new SilentRefreshClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Returns new instance of the Silent AuthCode Interaction Client\r\n */\r\n createSilentAuthCodeClient(correlationId) {\r\n return new SilentAuthCodeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenByCode, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n }\r\n /**\r\n * Adds event callbacks to array\r\n * @param callback\r\n */\r\n addEventCallback(callback, eventTypes) {\r\n return this.eventHandler.addEventCallback(callback, eventTypes);\r\n }\r\n /**\r\n * Removes callback with provided id from callback array\r\n * @param callbackId\r\n */\r\n removeEventCallback(callbackId) {\r\n this.eventHandler.removeEventCallback(callbackId);\r\n }\r\n /**\r\n * Registers a callback to receive performance events.\r\n *\r\n * @param {PerformanceCallbackFunction} callback\r\n * @returns {string}\r\n */\r\n addPerformanceCallback(callback) {\r\n blockNonBrowserEnvironment();\r\n return this.performanceClient.addPerformanceCallback(callback);\r\n }\r\n /**\r\n * Removes a callback registered with addPerformanceCallback.\r\n *\r\n * @param {string} callbackId\r\n * @returns {boolean}\r\n */\r\n removePerformanceCallback(callbackId) {\r\n return this.performanceClient.removePerformanceCallback(callbackId);\r\n }\r\n /**\r\n * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n enableAccountStorageEvents() {\r\n if (typeof window === "undefined") {\r\n return;\r\n }\r\n if (!this.listeningToStorageEvents) {\r\n this.logger.verbose("Adding account storage listener.");\r\n this.listeningToStorageEvents = true;\r\n window.addEventListener("storage", this.handleAccountCacheChange);\r\n }\r\n else {\r\n this.logger.verbose("Account storage listener already registered.");\r\n }\r\n }\r\n /**\r\n * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n disableAccountStorageEvents() {\r\n if (typeof window === "undefined") {\r\n return;\r\n }\r\n if (this.listeningToStorageEvents) {\r\n this.logger.verbose("Removing account storage listener.");\r\n window.removeEventListener("storage", this.handleAccountCacheChange);\r\n this.listeningToStorageEvents = false;\r\n }\r\n else {\r\n this.logger.verbose("No account storage listener registered.");\r\n }\r\n }\r\n /**\r\n * Emit account added/removed events when cached accounts are changed in a different tab or frame\r\n */\r\n handleAccountCacheChange(e) {\r\n try {\r\n // Handle active account filter change\r\n if (e.key?.includes(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS)) {\r\n // This event has no payload, it only signals cross-tab app instances that the results of calling getActiveAccount() will have changed\r\n this.eventHandler.emitEvent(EventType.ACTIVE_ACCOUNT_CHANGED);\r\n }\r\n // Handle account object change\r\n const cacheValue = e.newValue || e.oldValue;\r\n if (!cacheValue) {\r\n return;\r\n }\r\n const parsedValue = JSON.parse(cacheValue);\r\n if (typeof parsedValue !== "object" ||\r\n !AccountEntity.isAccountEntity(parsedValue)) {\r\n return;\r\n }\r\n const accountEntity = CacheManager.toObject(new AccountEntity(), parsedValue);\r\n const accountInfo = accountEntity.getAccountInfo();\r\n if (!e.oldValue && e.newValue) {\r\n this.logger.info("Account was added to cache in a different window");\r\n this.eventHandler.emitEvent(EventType.ACCOUNT_ADDED, undefined, accountInfo);\r\n }\r\n else if (!e.newValue && e.oldValue) {\r\n this.logger.info("Account was removed from cache in a different window");\r\n this.eventHandler.emitEvent(EventType.ACCOUNT_REMOVED, undefined, accountInfo);\r\n }\r\n }\r\n catch (e) {\r\n return;\r\n }\r\n }\r\n /**\r\n * Gets the token cache for the application.\r\n */\r\n getTokenCache() {\r\n return this.tokenCache;\r\n }\r\n /**\r\n * Returns the logger instance\r\n */\r\n getLogger() {\r\n return this.logger;\r\n }\r\n /**\r\n * Replaces the default logger set in configurations with new Logger with new configurations\r\n * @param logger Logger instance\r\n */\r\n setLogger(logger) {\r\n this.logger = logger;\r\n }\r\n /**\r\n * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.\r\n * @param sku\r\n * @param version\r\n */\r\n initializeWrapperLibrary(sku, version) {\r\n // Validate the SKU passed in is one we expect\r\n this.browserStorage.setWrapperMetadata(sku, version);\r\n }\r\n /**\r\n * Sets navigation client\r\n * @param navigationClient\r\n */\r\n setNavigationClient(navigationClient) {\r\n this.navigationClient = navigationClient;\r\n }\r\n /**\r\n * Returns the configuration object\r\n */\r\n getConfiguration() {\r\n return this.config;\r\n }\r\n /**\r\n * Returns the performance client\r\n */\r\n getPerformanceClient() {\r\n return this.performanceClient;\r\n }\r\n /**\r\n * Returns the browser env indicator\r\n */\r\n isBrowserEnv() {\r\n return this.isBrowserEnvironment;\r\n }\r\n /**\r\n * Generates a correlation id for a request if none is provided.\r\n *\r\n * @protected\r\n * @param {?Partial} [request]\r\n * @returns {string}\r\n */\r\n getRequestCorrelationId(request) {\r\n if (request?.correlationId) {\r\n return request.correlationId;\r\n }\r\n if (this.isBrowserEnvironment) {\r\n return createNewGuid();\r\n }\r\n /*\r\n * Included for fallback for non-browser environments,\r\n * and to ensure this method always returns a string.\r\n */\r\n return Constants.EMPTY_STRING;\r\n }\r\n // #endregion\r\n /**\r\n * Use when initiating the login process by redirecting the user\'s browser to the authorization endpoint. This function redirects the page, so\r\n * any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n async loginRedirect(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n this.logger.verbose("loginRedirect called", correlationId);\r\n return this.acquireTokenRedirect({\r\n correlationId,\r\n ...(request || DEFAULT_REQUEST),\r\n });\r\n }\r\n /**\r\n * Use when initiating the login process via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n loginPopup(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n this.logger.verbose("loginPopup called", correlationId);\r\n return this.acquireTokenPopup({\r\n correlationId,\r\n ...(request || DEFAULT_REQUEST),\r\n });\r\n }\r\n /**\r\n * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.\r\n *\r\n * @param {@link (SilentRequest:type)}\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object\r\n */\r\n async acquireTokenSilent(request) {\r\n const correlationId = this.getRequestCorrelationId(request);\r\n const atsMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilent, correlationId);\r\n atsMeasurement.add({\r\n cacheLookupPolicy: request.cacheLookupPolicy,\r\n scenarioId: request.scenarioId,\r\n });\r\n StandardController_preflightCheck(this.initialized, atsMeasurement);\r\n this.logger.verbose("acquireTokenSilent called", correlationId);\r\n const account = request.account || this.getActiveAccount();\r\n if (!account) {\r\n throw createBrowserAuthError(noAccountError);\r\n }\r\n atsMeasurement.add({ accountType: getAccountType(account) });\r\n const thumbprint = {\r\n clientId: this.config.auth.clientId,\r\n authority: request.authority || Constants.EMPTY_STRING,\r\n scopes: request.scopes,\r\n homeAccountIdentifier: account.homeAccountId,\r\n claims: request.claims,\r\n authenticationScheme: request.authenticationScheme,\r\n resourceRequestMethod: request.resourceRequestMethod,\r\n resourceRequestUri: request.resourceRequestUri,\r\n shrClaims: request.shrClaims,\r\n sshKid: request.sshKid,\r\n shrOptions: request.shrOptions,\r\n };\r\n const silentRequestKey = JSON.stringify(thumbprint);\r\n const cachedResponse = this.activeSilentTokenRequests.get(silentRequestKey);\r\n if (typeof cachedResponse === "undefined") {\r\n this.logger.verbose("acquireTokenSilent called for the first time, storing active request", correlationId);\r\n const response = invokeAsync(this.acquireTokenSilentAsync.bind(this), PerformanceEvents.AcquireTokenSilentAsync, this.logger, this.performanceClient, correlationId)({\r\n ...request,\r\n correlationId,\r\n }, account)\r\n .then((result) => {\r\n this.activeSilentTokenRequests.delete(silentRequestKey);\r\n atsMeasurement.end({\r\n success: true,\r\n fromCache: result.fromCache,\r\n isNativeBroker: result.fromNativeBroker,\r\n cacheLookupPolicy: request.cacheLookupPolicy,\r\n accessTokenSize: result.accessToken.length,\r\n idTokenSize: result.idToken.length,\r\n });\r\n return result;\r\n })\r\n .catch((error) => {\r\n this.activeSilentTokenRequests.delete(silentRequestKey);\r\n atsMeasurement.end({\r\n success: false,\r\n }, error);\r\n throw error;\r\n });\r\n this.activeSilentTokenRequests.set(silentRequestKey, response);\r\n return {\r\n ...(await response),\r\n state: request.state,\r\n };\r\n }\r\n else {\r\n this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call", correlationId);\r\n // Discard measurements for memoized calls, as they are usually only a couple of ms and will artificially deflate metrics\r\n atsMeasurement.discard();\r\n return {\r\n ...(await cachedResponse),\r\n state: request.state,\r\n };\r\n }\r\n }\r\n /**\r\n * Silently acquire an access token for a given set of scopes. Will use cached token if available, otherwise will attempt to acquire a new token from the network via refresh token.\r\n * @param {@link (SilentRequest:type)}\r\n * @param {@link (AccountInfo:type)}\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse}\r\n */\r\n async acquireTokenSilentAsync(request, account) {\r\n const trackPageVisibility = () => this.trackPageVisibility(request.correlationId);\r\n this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Silent, request);\r\n if (request.correlationId) {\r\n this.performanceClient.incrementFields({ visibilityChangeCount: 0 }, request.correlationId);\r\n }\r\n document.addEventListener("visibilitychange", trackPageVisibility);\r\n const silentRequest = await invokeAsync(initializeSilentRequest, PerformanceEvents.InitializeSilentRequest, this.logger, this.performanceClient, request.correlationId)(request, account, this.config, this.performanceClient, this.logger);\r\n const cacheLookupPolicy = request.cacheLookupPolicy || CacheLookupPolicy.Default;\r\n const result = this.acquireTokenSilentNoIframe(silentRequest, cacheLookupPolicy).catch(async (refreshTokenError) => {\r\n const shouldTryToResolveSilently = checkIfRefreshTokenErrorCanBeResolvedSilently(refreshTokenError, cacheLookupPolicy);\r\n if (shouldTryToResolveSilently) {\r\n if (!this.activeIframeRequest) {\r\n let _resolve;\r\n // Always set the active request tracker immediately after checking it to prevent races\r\n this.activeIframeRequest = [\r\n new Promise((resolve) => {\r\n _resolve = resolve;\r\n }),\r\n silentRequest.correlationId,\r\n ];\r\n this.logger.verbose("Refresh token expired/invalid or CacheLookupPolicy is set to Skip, attempting acquire token by iframe.", silentRequest.correlationId);\r\n return invokeAsync(this.acquireTokenBySilentIframe.bind(this), PerformanceEvents.AcquireTokenBySilentIframe, this.logger, this.performanceClient, silentRequest.correlationId)(silentRequest)\r\n .then((iframeResult) => {\r\n _resolve(true);\r\n return iframeResult;\r\n })\r\n .catch((e) => {\r\n _resolve(false);\r\n throw e;\r\n })\r\n .finally(() => {\r\n this.activeIframeRequest = undefined;\r\n });\r\n }\r\n else if (cacheLookupPolicy !== CacheLookupPolicy.Skip) {\r\n const [activePromise, activeCorrelationId] = this.activeIframeRequest;\r\n this.logger.verbose(`Iframe request is already in progress, awaiting resolution for request with correlationId: ${activeCorrelationId}`, silentRequest.correlationId);\r\n const awaitConcurrentIframeMeasure = this.performanceClient.startMeasurement(PerformanceEvents.AwaitConcurrentIframe, silentRequest.correlationId);\r\n awaitConcurrentIframeMeasure.add({\r\n awaitIframeCorrelationId: activeCorrelationId,\r\n });\r\n const activePromiseResult = await activePromise;\r\n awaitConcurrentIframeMeasure.end({\r\n success: activePromiseResult,\r\n });\r\n if (activePromiseResult) {\r\n this.logger.verbose(`Parallel iframe request with correlationId: ${activeCorrelationId} succeeded. Retrying cache and/or RT redemption`, silentRequest.correlationId);\r\n // Retry cache lookup and/or RT exchange after iframe completes\r\n return this.acquireTokenSilentNoIframe(silentRequest, cacheLookupPolicy);\r\n }\r\n else {\r\n this.logger.info(`Iframe request with correlationId: ${activeCorrelationId} failed. Interaction is required.`);\r\n // If previous iframe request failed, it\'s unlikely to succeed this time. Throw original error.\r\n throw refreshTokenError;\r\n }\r\n }\r\n else {\r\n // Cache policy set to skip and another iframe request is already in progress\r\n this.logger.warning("Another iframe request is currently in progress and CacheLookupPolicy is set to Skip. This may result in degraded performance and/or reliability for both calls. Please consider changing the CacheLookupPolicy to take advantage of request queuing and token cache.", silentRequest.correlationId);\r\n return invokeAsync(this.acquireTokenBySilentIframe.bind(this), PerformanceEvents.AcquireTokenBySilentIframe, this.logger, this.performanceClient, silentRequest.correlationId)(silentRequest);\r\n }\r\n }\r\n else {\r\n // Error cannot be silently resolved or iframe renewal is not allowed, interaction required\r\n throw refreshTokenError;\r\n }\r\n });\r\n return result\r\n .then((response) => {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, response);\r\n if (request.correlationId) {\r\n this.performanceClient.addFields({\r\n fromCache: response.fromCache,\r\n isNativeBroker: response.fromNativeBroker,\r\n }, request.correlationId);\r\n }\r\n return response;\r\n })\r\n .catch((tokenRenewalError) => {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Silent, null, tokenRenewalError);\r\n throw tokenRenewalError;\r\n })\r\n .finally(() => {\r\n document.removeEventListener("visibilitychange", trackPageVisibility);\r\n });\r\n }\r\n /**\r\n * AcquireTokenSilent without the iframe fallback. This is used to enable the correct fallbacks in cases where there\'s a potential for multiple silent requests to be made in parallel and prevent those requests from making concurrent iframe requests.\r\n * @param silentRequest\r\n * @param cacheLookupPolicy\r\n * @returns\r\n */\r\n async acquireTokenSilentNoIframe(silentRequest, cacheLookupPolicy) {\r\n if (NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, silentRequest.authenticationScheme) &&\r\n silentRequest.account.nativeAccountId) {\r\n this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform");\r\n return this.acquireTokenNative(silentRequest, ApiId.acquireTokenSilent_silentFlow).catch(async (e) => {\r\n // If native token acquisition fails for availability reasons fallback to web flow\r\n if (e instanceof NativeAuthError && isFatalNativeAuthError(e)) {\r\n this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow");\r\n this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt\r\n // Cache will not contain tokens, given that previous WAM requests succeeded. Skip cache and RT renewal and go straight to iframe renewal\r\n throw createClientAuthError(tokenRefreshRequired);\r\n }\r\n throw e;\r\n });\r\n }\r\n else {\r\n this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow");\r\n return invokeAsync(this.acquireTokenFromCache.bind(this), PerformanceEvents.AcquireTokenFromCache, this.logger, this.performanceClient, silentRequest.correlationId)(silentRequest, cacheLookupPolicy).catch((cacheError) => {\r\n if (cacheLookupPolicy === CacheLookupPolicy.AccessToken) {\r\n throw cacheError;\r\n }\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_NETWORK_START, InteractionType.Silent, silentRequest);\r\n return invokeAsync(this.acquireTokenByRefreshToken.bind(this), PerformanceEvents.AcquireTokenByRefreshToken, this.logger, this.performanceClient, silentRequest.correlationId)(silentRequest, cacheLookupPolicy);\r\n });\r\n }\r\n }\r\n}\r\n/**\r\n * Determines whether an error thrown by the refresh token endpoint can be resolved without interaction\r\n * @param refreshTokenError\r\n * @param silentRequest\r\n * @param cacheLookupPolicy\r\n * @returns\r\n */\r\nfunction checkIfRefreshTokenErrorCanBeResolvedSilently(refreshTokenError, cacheLookupPolicy) {\r\n const noInteractionRequired = !(refreshTokenError instanceof InteractionRequiredAuthError &&\r\n // For refresh token errors, bad_token does not always require interaction (silently resolvable)\r\n refreshTokenError.subError !==\r\n badToken);\r\n // Errors that result when the refresh token needs to be replaced\r\n const refreshTokenRefreshRequired = refreshTokenError.errorCode === BrowserConstants.INVALID_GRANT_ERROR ||\r\n refreshTokenError.errorCode ===\r\n tokenRefreshRequired;\r\n // Errors that may be resolved before falling back to interaction (through iframe renewal)\r\n const isSilentlyResolvable = (noInteractionRequired && refreshTokenRefreshRequired) ||\r\n refreshTokenError.errorCode ===\r\n noTokensFound ||\r\n refreshTokenError.errorCode ===\r\n refreshTokenExpired;\r\n // Only these policies allow for an iframe renewal attempt\r\n const tryIframeRenewal = iFrameRenewalPolicies.includes(cacheLookupPolicy);\r\n return isSilentlyResolvable && tryIframeRenewal;\r\n}\n\n\n//# sourceMappingURL=StandardController.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/naa/BridgeError.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction isBridgeError(error) {\r\n return error.status !== undefined;\r\n}\n\n\n//# sourceMappingURL=BridgeError.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/naa/mapping/NestedAppAuthAdapter.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NestedAppAuthAdapter {\r\n constructor(clientId, clientCapabilities, crypto, logger) {\r\n this.clientId = clientId;\r\n this.clientCapabilities = clientCapabilities;\r\n this.crypto = crypto;\r\n this.logger = logger;\r\n }\r\n toNaaTokenRequest(request) {\r\n let extraParams;\r\n if (request.extraQueryParameters === undefined) {\r\n extraParams = new Map();\r\n }\r\n else {\r\n extraParams = new Map(Object.entries(request.extraQueryParameters));\r\n }\r\n const correlationId = request.correlationId || this.crypto.createNewGuid();\r\n const requestBuilder = new RequestParameterBuilder(correlationId);\r\n const claims = requestBuilder.addClientCapabilitiesToClaims(request.claims, this.clientCapabilities);\r\n const scopes = request.scopes || OIDC_DEFAULT_SCOPES;\r\n const tokenRequest = {\r\n platformBrokerId: request.account?.homeAccountId,\r\n clientId: this.clientId,\r\n authority: request.authority,\r\n scope: scopes.join(" "),\r\n correlationId,\r\n claims: !StringUtils.isEmptyObj(claims) ? claims : undefined,\r\n state: request.state,\r\n authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER,\r\n extraParameters: extraParams,\r\n };\r\n return tokenRequest;\r\n }\r\n fromNaaTokenResponse(request, response, reqTimestamp) {\r\n if (!response.token.id_token || !response.token.access_token) {\r\n throw createClientAuthError(nullOrEmptyToken);\r\n }\r\n const expiresOn = new Date((reqTimestamp + (response.token.expires_in || 0)) * 1000);\r\n const idTokenClaims = extractTokenClaims(response.token.id_token, this.crypto.base64Decode);\r\n const account = this.fromNaaAccountInfo(response.account, response.token.id_token, idTokenClaims);\r\n const scopes = response.token.scope || request.scope;\r\n const authenticationResult = {\r\n authority: response.token.authority || account.environment,\r\n uniqueId: account.localAccountId,\r\n tenantId: account.tenantId,\r\n scopes: scopes.split(" "),\r\n account,\r\n idToken: response.token.id_token,\r\n idTokenClaims,\r\n accessToken: response.token.access_token,\r\n fromCache: false,\r\n expiresOn: expiresOn,\r\n tokenType: request.authenticationScheme || AuthenticationScheme.BEARER,\r\n correlationId: request.correlationId,\r\n extExpiresOn: expiresOn,\r\n state: request.state,\r\n };\r\n return authenticationResult;\r\n }\r\n /*\r\n * export type AccountInfo = {\r\n * homeAccountId: string;\r\n * environment: string;\r\n * tenantId: string;\r\n * username: string;\r\n * localAccountId: string;\r\n * name?: string;\r\n * idToken?: string;\r\n * idTokenClaims?: TokenClaims & {\r\n * [key: string]:\r\n * | string\r\n * | number\r\n * | string[]\r\n * | object\r\n * | undefined\r\n * | unknown;\r\n * };\r\n * nativeAccountId?: string;\r\n * authorityType?: string;\r\n * };\r\n */\r\n fromNaaAccountInfo(fromAccount, idToken, idTokenClaims) {\r\n const effectiveIdTokenClaims = idTokenClaims || fromAccount.idTokenClaims;\r\n const localAccountId = fromAccount.localAccountId ||\r\n effectiveIdTokenClaims?.oid ||\r\n effectiveIdTokenClaims?.sub ||\r\n "";\r\n const tenantId = fromAccount.tenantId || effectiveIdTokenClaims?.tid || "";\r\n const homeAccountId = fromAccount.homeAccountId || `${localAccountId}.${tenantId}`;\r\n const username = fromAccount.username ||\r\n effectiveIdTokenClaims?.preferred_username ||\r\n "";\r\n const name = fromAccount.name || effectiveIdTokenClaims?.name;\r\n const tenantProfiles = new Map();\r\n const tenantProfile = buildTenantProfile(homeAccountId, localAccountId, tenantId, effectiveIdTokenClaims);\r\n tenantProfiles.set(tenantId, tenantProfile);\r\n const account = {\r\n homeAccountId,\r\n environment: fromAccount.environment,\r\n tenantId,\r\n username,\r\n localAccountId,\r\n name,\r\n idToken: idToken,\r\n idTokenClaims: effectiveIdTokenClaims,\r\n tenantProfiles,\r\n };\r\n return account;\r\n }\r\n /**\r\n *\r\n * @param error BridgeError\r\n * @returns AuthError, ClientAuthError, ClientConfigurationError, ServerError, InteractionRequiredError\r\n */\r\n fromBridgeError(error) {\r\n if (isBridgeError(error)) {\r\n switch (error.status) {\r\n case BridgeStatusCode.UserCancel:\r\n return new ClientAuthError(userCanceled);\r\n case BridgeStatusCode.NoNetwork:\r\n return new ClientAuthError(noNetworkConnectivity);\r\n case BridgeStatusCode.AccountUnavailable:\r\n return new ClientAuthError(noAccountFound);\r\n case BridgeStatusCode.Disabled:\r\n return new ClientAuthError(nestedAppAuthBridgeDisabled);\r\n case BridgeStatusCode.NestedAppAuthUnavailable:\r\n return new ClientAuthError(error.code ||\r\n nestedAppAuthBridgeDisabled, error.description);\r\n case BridgeStatusCode.TransientError:\r\n case BridgeStatusCode.PersistentError:\r\n return new ServerError(error.code, error.description);\r\n case BridgeStatusCode.UserInteractionRequired:\r\n return new InteractionRequiredAuthError(error.code, error.description);\r\n default:\r\n return new AuthError(error.code, error.description);\r\n }\r\n }\r\n else {\r\n return new AuthError("unknown_error", "An unknown error occurred");\r\n }\r\n }\r\n /**\r\n * Returns an AuthenticationResult from the given cache items\r\n *\r\n * @param account\r\n * @param idToken\r\n * @param accessToken\r\n * @param reqTimestamp\r\n * @returns\r\n */\r\n toAuthenticationResultFromCache(account, idToken, accessToken, request, correlationId) {\r\n if (!idToken || !accessToken) {\r\n throw createClientAuthError(nullOrEmptyToken);\r\n }\r\n const idTokenClaims = extractTokenClaims(idToken.secret, this.crypto.base64Decode);\r\n const scopes = accessToken.target || request.scopes.join(" ");\r\n const authenticationResult = {\r\n authority: accessToken.environment || account.environment,\r\n uniqueId: account.localAccountId,\r\n tenantId: account.tenantId,\r\n scopes: scopes.split(" "),\r\n account,\r\n idToken: idToken.secret,\r\n idTokenClaims: idTokenClaims || {},\r\n accessToken: accessToken.secret,\r\n fromCache: true,\r\n expiresOn: new Date(Number(accessToken.expiresOn) * 1000),\r\n tokenType: request.authenticationScheme || AuthenticationScheme.BEARER,\r\n correlationId,\r\n extExpiresOn: new Date(Number(accessToken.extendedExpiresOn) * 1000),\r\n state: request.state,\r\n };\r\n return authenticationResult;\r\n }\r\n}\n\n\n//# sourceMappingURL=NestedAppAuthAdapter.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/error/NestedAppAuthError.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * NestedAppAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nconst NestedAppAuthErrorMessage = {\r\n unsupportedMethod: {\r\n code: "unsupported_method",\r\n desc: "This method is not supported in nested app environment.",\r\n },\r\n};\r\nclass NestedAppAuthError extends AuthError {\r\n constructor(errorCode, errorMessage) {\r\n super(errorCode, errorMessage);\r\n Object.setPrototypeOf(this, NestedAppAuthError.prototype);\r\n this.name = "NestedAppAuthError";\r\n }\r\n static createUnsupportedError() {\r\n return new NestedAppAuthError(NestedAppAuthErrorMessage.unsupportedMethod.code, NestedAppAuthErrorMessage.unsupportedMethod.desc);\r\n }\r\n}\n\n\n//# sourceMappingURL=NestedAppAuthError.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/controllers/NestedAppAuthController.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass NestedAppAuthController {\r\n constructor(operatingContext) {\r\n this.operatingContext = operatingContext;\r\n const proxy = this.operatingContext.getBridgeProxy();\r\n if (proxy !== undefined) {\r\n this.bridgeProxy = proxy;\r\n }\r\n else {\r\n throw new Error("unexpected: bridgeProxy is undefined");\r\n }\r\n // Set the configuration.\r\n this.config = operatingContext.getConfig();\r\n // Initialize logger\r\n this.logger = this.operatingContext.getLogger();\r\n // Initialize performance client\r\n this.performanceClient = this.config.telemetry.client;\r\n // Initialize the crypto class.\r\n this.browserCrypto = operatingContext.isBrowserEnvironment()\r\n ? new CryptoOps(this.logger, this.performanceClient, true)\r\n : DEFAULT_CRYPTO_IMPLEMENTATION;\r\n // Initialize the browser storage class.\r\n this.browserStorage = this.operatingContext.isBrowserEnvironment()\r\n ? new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger, buildStaticAuthorityOptions(this.config.auth))\r\n : DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);\r\n this.eventHandler = new EventHandler(this.logger);\r\n this.nestedAppAuthAdapter = new NestedAppAuthAdapter(this.config.auth.clientId, this.config.auth.clientCapabilities, this.browserCrypto, this.logger);\r\n // Set the active account if available\r\n const accountContext = this.bridgeProxy.getAccountContext();\r\n if (accountContext) {\r\n const cachedAccount = getAccount(accountContext, this.logger, this.browserStorage);\r\n setActiveAccount(cachedAccount, this.browserStorage);\r\n }\r\n }\r\n /**\r\n * Factory function to create a new instance of NestedAppAuthController\r\n * @param operatingContext\r\n * @returns Promise\r\n */\r\n static async createController(operatingContext) {\r\n const controller = new NestedAppAuthController(operatingContext);\r\n return Promise.resolve(controller);\r\n }\r\n /**\r\n * Specific implementation of initialize function for NestedAppAuthController\r\n * @returns\r\n */\r\n initialize() {\r\n // do nothing not required by this controller\r\n return Promise.resolve();\r\n }\r\n /**\r\n * Validate the incoming request and add correlationId if not present\r\n * @param request\r\n * @returns\r\n */\r\n ensureValidRequest(request) {\r\n if (request?.correlationId) {\r\n return request;\r\n }\r\n return {\r\n ...request,\r\n correlationId: this.browserCrypto.createNewGuid(),\r\n };\r\n }\r\n /**\r\n * Internal implementation of acquireTokenInteractive flow\r\n * @param request\r\n * @returns\r\n */\r\n async acquireTokenInteractive(request) {\r\n const validRequest = this.ensureValidRequest(request);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Popup, validRequest);\r\n const atPopupMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenPopup, validRequest.correlationId);\r\n atPopupMeasurement?.add({ nestedAppAuthRequest: true });\r\n try {\r\n const naaRequest = this.nestedAppAuthAdapter.toNaaTokenRequest(validRequest);\r\n const reqTimestamp = nowSeconds();\r\n const response = await this.bridgeProxy.getTokenInteractive(naaRequest);\r\n const result = {\r\n ...this.nestedAppAuthAdapter.fromNaaTokenResponse(naaRequest, response, reqTimestamp),\r\n };\r\n // cache the tokens in the response\r\n await this.hydrateCache(result, request);\r\n this.browserStorage.setActiveAccount(result.account);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Popup, result);\r\n atPopupMeasurement.add({\r\n accessTokenSize: result.accessToken.length,\r\n idTokenSize: result.idToken.length,\r\n });\r\n atPopupMeasurement.end({\r\n success: true,\r\n requestId: result.requestId,\r\n });\r\n return result;\r\n }\r\n catch (e) {\r\n const error = this.nestedAppAuthAdapter.fromBridgeError(e);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Popup, null, e);\r\n atPopupMeasurement.end({\r\n success: false,\r\n }, e);\r\n throw error;\r\n }\r\n }\r\n /**\r\n * Internal implementation of acquireTokenSilent flow\r\n * @param request\r\n * @returns\r\n */\r\n async acquireTokenSilentInternal(request) {\r\n const validRequest = this.ensureValidRequest(request);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Silent, validRequest);\r\n // Look for tokens in the cache first\r\n const result = await this.acquireTokenFromCache(validRequest);\r\n if (result) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, result);\r\n return result;\r\n }\r\n // proceed with acquiring tokens via the host\r\n const ssoSilentMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SsoSilent, validRequest.correlationId);\r\n ssoSilentMeasurement?.increment({\r\n visibilityChangeCount: 0,\r\n });\r\n ssoSilentMeasurement?.add({\r\n nestedAppAuthRequest: true,\r\n });\r\n try {\r\n const naaRequest = this.nestedAppAuthAdapter.toNaaTokenRequest(validRequest);\r\n const reqTimestamp = nowSeconds();\r\n const response = await this.bridgeProxy.getTokenSilent(naaRequest);\r\n const result = this.nestedAppAuthAdapter.fromNaaTokenResponse(naaRequest, response, reqTimestamp);\r\n // cache the tokens in the response\r\n await this.hydrateCache(result, request);\r\n this.browserStorage.setActiveAccount(result.account);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, result);\r\n ssoSilentMeasurement?.add({\r\n accessTokenSize: result.accessToken.length,\r\n idTokenSize: result.idToken.length,\r\n });\r\n ssoSilentMeasurement?.end({\r\n success: true,\r\n requestId: result.requestId,\r\n });\r\n return result;\r\n }\r\n catch (e) {\r\n const error = this.nestedAppAuthAdapter.fromBridgeError(e);\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Silent, null, e);\r\n ssoSilentMeasurement?.end({\r\n success: false,\r\n }, e);\r\n throw error;\r\n }\r\n }\r\n /**\r\n * acquires tokens from cache\r\n * @param request\r\n * @returns\r\n */\r\n async acquireTokenFromCache(request) {\r\n const atsMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilent, request.correlationId);\r\n atsMeasurement?.add({\r\n nestedAppAuthRequest: true,\r\n });\r\n // if the request has claims, we cannot look up in the cache\r\n if (request.claims) {\r\n this.logger.verbose("Claims are present in the request, skipping cache lookup");\r\n return null;\r\n }\r\n // respect cache lookup policy\r\n let result = null;\r\n switch (request.cacheLookupPolicy) {\r\n case CacheLookupPolicy.Default:\r\n case CacheLookupPolicy.AccessToken:\r\n case CacheLookupPolicy.AccessTokenAndRefreshToken:\r\n result = await this.acquireTokenFromCacheInternal(request);\r\n break;\r\n default:\r\n return null;\r\n }\r\n if (result) {\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, result);\r\n atsMeasurement?.add({\r\n accessTokenSize: result?.accessToken.length,\r\n idTokenSize: result?.idToken.length,\r\n });\r\n atsMeasurement?.end({\r\n success: true,\r\n });\r\n return result;\r\n }\r\n this.logger.error("Cached tokens are not found for the account, proceeding with silent token request.");\r\n this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Silent, null);\r\n atsMeasurement?.end({\r\n success: false,\r\n });\r\n return null;\r\n }\r\n /**\r\n *\r\n * @param request\r\n * @returns\r\n */\r\n async acquireTokenFromCacheInternal(request) {\r\n const accountContext = this.bridgeProxy.getAccountContext();\r\n let currentAccount = null;\r\n if (accountContext) {\r\n const hubAccount = getAccount(accountContext, this.logger, this.browserStorage);\r\n // always prioritize for hub account context, the reqirement of `request.account` will be removed soon\r\n currentAccount = hubAccount || request.account;\r\n }\r\n // fall back to brokering if no cached account is found\r\n if (!currentAccount) {\r\n this.logger.verbose("No active account found, falling back to the host");\r\n return Promise.resolve(null);\r\n }\r\n this.logger.verbose("active account found, attempting to acquire token silently");\r\n const authRequest = {\r\n ...request,\r\n correlationId: request.correlationId || this.browserCrypto.createNewGuid(),\r\n authority: request.authority || currentAccount.environment,\r\n scopes: request.scopes?.length\r\n ? request.scopes\r\n : [...OIDC_DEFAULT_SCOPES],\r\n };\r\n // fetch access token and check for expiry\r\n const tokenKeys = this.browserStorage.getTokenKeys();\r\n const cachedAccessToken = this.browserStorage.getAccessToken(currentAccount, authRequest, tokenKeys, currentAccount.tenantId, this.performanceClient, authRequest.correlationId);\r\n // If there is no access token, log it and return null\r\n if (!cachedAccessToken) {\r\n this.logger.verbose("No cached access token found");\r\n return Promise.resolve(null);\r\n }\r\n else if (wasClockTurnedBack(cachedAccessToken.cachedAt) ||\r\n isTokenExpired(cachedAccessToken.expiresOn, this.config.system.tokenRenewalOffsetSeconds)) {\r\n this.logger.verbose("Cached access token has expired");\r\n return Promise.resolve(null);\r\n }\r\n const cachedIdToken = this.browserStorage.getIdToken(currentAccount, tokenKeys, currentAccount.tenantId, this.performanceClient, authRequest.correlationId);\r\n if (!cachedIdToken) {\r\n this.logger.verbose("No cached id token found");\r\n return Promise.resolve(null);\r\n }\r\n return this.nestedAppAuthAdapter.toAuthenticationResultFromCache(currentAccount, cachedIdToken, cachedAccessToken, authRequest, authRequest.correlationId);\r\n }\r\n /**\r\n * acquireTokenPopup flow implementation\r\n * @param request\r\n * @returns\r\n */\r\n async acquireTokenPopup(request) {\r\n return this.acquireTokenInteractive(request);\r\n }\r\n /**\r\n * acquireTokenRedirect flow is not supported in nested app auth\r\n * @param request\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n acquireTokenRedirect(request) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n /**\r\n * acquireTokenSilent flow implementation\r\n * @param silentRequest\r\n * @returns\r\n */\r\n async acquireTokenSilent(silentRequest) {\r\n return this.acquireTokenSilentInternal(silentRequest);\r\n }\r\n /**\r\n * Hybrid flow is not currently supported in nested app auth\r\n * @param request\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n acquireTokenByCode(request // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n /**\r\n * acquireTokenNative flow is not currently supported in nested app auth\r\n * @param request\r\n * @param apiId\r\n * @param accountId\r\n */\r\n acquireTokenNative(request, apiId, // eslint-disable-line @typescript-eslint/no-unused-vars\r\n accountId // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n /**\r\n * acquireTokenByRefreshToken flow is not currently supported in nested app auth\r\n * @param commonRequest\r\n * @param silentRequest\r\n */\r\n acquireTokenByRefreshToken(commonRequest, // eslint-disable-line @typescript-eslint/no-unused-vars\r\n silentRequest // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n /**\r\n * Adds event callbacks to array\r\n * @param callback\r\n * @param eventTypes\r\n */\r\n addEventCallback(callback, eventTypes) {\r\n return this.eventHandler.addEventCallback(callback, eventTypes);\r\n }\r\n /**\r\n * Removes callback with provided id from callback array\r\n * @param callbackId\r\n */\r\n removeEventCallback(callbackId) {\r\n this.eventHandler.removeEventCallback(callbackId);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n addPerformanceCallback(callback) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n removePerformanceCallback(callbackId) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n enableAccountStorageEvents() {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n disableAccountStorageEvents() {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n // #region Account APIs\r\n /**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\n getAllAccounts(accountFilter) {\r\n return getAllAccounts(this.logger, this.browserStorage, this.isBrowserEnv(), accountFilter);\r\n }\r\n /**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\n getAccount(accountFilter) {\r\n return getAccount(accountFilter, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param username\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByUsername(username) {\r\n return getAccountByUsername(username, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByHomeId(homeAccountId) {\r\n return getAccountByHomeId(homeAccountId, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n */\r\n getAccountByLocalId(localAccountId) {\r\n return getAccountByLocalId(localAccountId, this.logger, this.browserStorage);\r\n }\r\n /**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n /*\r\n * StandardController uses this to allow the developer to set the active account\r\n * in the nested app auth scenario the active account is controlled by the app hosting the nested app\r\n */\r\n return setActiveAccount(account, this.browserStorage);\r\n }\r\n /**\r\n * Gets the currently active account\r\n */\r\n getActiveAccount() {\r\n return getActiveAccount(this.browserStorage);\r\n }\r\n // #endregion\r\n handleRedirectPromise(hash // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n return Promise.resolve(null);\r\n }\r\n loginPopup(request // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n return this.acquireTokenInteractive(request || DEFAULT_REQUEST);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n loginRedirect(request) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n logout(logoutRequest) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n logoutRedirect(logoutRequest // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n logoutPopup(logoutRequest // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n ssoSilent(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request) {\r\n return this.acquireTokenSilentInternal(request);\r\n }\r\n getTokenCache() {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n /**\r\n * Returns the logger instance\r\n */\r\n getLogger() {\r\n return this.logger;\r\n }\r\n /**\r\n * Replaces the default logger set in configurations with new Logger with new configurations\r\n * @param logger Logger instance\r\n */\r\n setLogger(logger) {\r\n this.logger = logger;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n initializeWrapperLibrary(sku, version) {\r\n /*\r\n * Standard controller uses this to set the sku and version of the wrapper library in the storage\r\n * we do nothing here\r\n */\r\n return;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n setNavigationClient(navigationClient) {\r\n this.logger.warning("setNavigationClient is not supported in nested app auth");\r\n }\r\n getConfiguration() {\r\n return this.config;\r\n }\r\n isBrowserEnv() {\r\n return this.operatingContext.isBrowserEnvironment();\r\n }\r\n getBrowserCrypto() {\r\n return this.browserCrypto;\r\n }\r\n getPerformanceClient() {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n getRedirectResponse() {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n async clearCache(logoutRequest) {\r\n throw NestedAppAuthError.createUnsupportedError();\r\n }\r\n async hydrateCache(result, request) {\r\n this.logger.verbose("hydrateCache called");\r\n const accountEntity = AccountEntity.createFromAccountInfo(result.account, result.cloudGraphHostName, result.msGraphHost);\r\n this.browserStorage.setAccount(accountEntity);\r\n return this.browserStorage.hydrateCache(result, request);\r\n }\r\n}\n\n\n//# sourceMappingURL=NestedAppAuthController.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/controllers/ControllerFactory.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nasync function createV3Controller(config, request) {\r\n const standard = new StandardOperatingContext(config);\r\n await standard.initialize();\r\n return StandardController.createController(standard, request);\r\n}\r\nasync function createController(config) {\r\n const standard = new StandardOperatingContext(config);\r\n const nestedApp = new NestedAppOperatingContext(config);\r\n const operatingContexts = [standard.initialize(), nestedApp.initialize()];\r\n await Promise.all(operatingContexts);\r\n if (nestedApp.isAvailable() && config.auth.supportsNestedAppAuth) {\r\n return NestedAppAuthController.createController(nestedApp);\r\n }\r\n else if (standard.isAvailable()) {\r\n return StandardController.createController(standard);\r\n }\r\n else {\r\n // Since neither of the actual operating contexts are available keep the UnknownOperatingContextController\r\n return null;\r\n }\r\n}\n\n\n//# sourceMappingURL=ControllerFactory.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/app/PublicClientApplication.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications\r\n * to obtain JWT tokens as described in the OAuth 2.0 Authorization Code Flow with PKCE specification.\r\n */\r\nclass PublicClientApplication {\r\n /**\r\n * Creates StandardController and passes it to the PublicClientApplication\r\n *\r\n * @param configuration {Configuration}\r\n */\r\n static async createPublicClientApplication(configuration) {\r\n const controller = await createV3Controller(configuration);\r\n const pca = new PublicClientApplication(configuration, controller);\r\n return pca;\r\n }\r\n /**\r\n * @constructor\r\n * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object\r\n *\r\n * Important attributes in the Configuration object for auth are:\r\n * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n * - authority: the authority URL for your application.\r\n * - redirect_uri: the uri of your application registered in the portal.\r\n *\r\n * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}\r\n * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.\r\n * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.\r\n * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.\r\n *\r\n * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/\r\n * Full B2C functionality will be available in this library in future versions.\r\n *\r\n * @param configuration Object for the MSAL PublicClientApplication instance\r\n * @param IController Optional parameter to explictly set the controller. (Will be removed when we remove public constructor)\r\n */\r\n constructor(configuration, controller) {\r\n this.controller =\r\n controller ||\r\n new StandardController(new StandardOperatingContext(configuration));\r\n }\r\n /**\r\n * Initializer function to perform async startup tasks such as connecting to WAM extension\r\n * @param request {?InitializeApplicationRequest}\r\n */\r\n async initialize(request) {\r\n return this.controller.initialize(request);\r\n }\r\n /**\r\n * Use when you want to obtain an access_token for your API via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n async acquireTokenPopup(request) {\r\n return this.controller.acquireTokenPopup(request);\r\n }\r\n /**\r\n * Use when you want to obtain an access_token for your API by redirecting the user\'s browser window to the authorization endpoint. This function redirects\r\n * the page, so any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n acquireTokenRedirect(request) {\r\n return this.controller.acquireTokenRedirect(request);\r\n }\r\n /**\r\n * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.\r\n *\r\n * @param {@link (SilentRequest:type)}\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthenticationResult} object\r\n */\r\n acquireTokenSilent(silentRequest) {\r\n return this.controller.acquireTokenSilent(silentRequest);\r\n }\r\n /**\r\n * This function redeems an authorization code (passed as code) from the eSTS token endpoint.\r\n * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.\r\n * This API is not indended for normal authorization code acquisition and redemption.\r\n *\r\n * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.\r\n *\r\n * @param request {@link AuthorizationCodeRequest}\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n acquireTokenByCode(request) {\r\n return this.controller.acquireTokenByCode(request);\r\n }\r\n /**\r\n * Adds event callbacks to array\r\n * @param callback\r\n * @param eventTypes\r\n */\r\n addEventCallback(callback, eventTypes) {\r\n return this.controller.addEventCallback(callback, eventTypes);\r\n }\r\n /**\r\n * Removes callback with provided id from callback array\r\n * @param callbackId\r\n */\r\n removeEventCallback(callbackId) {\r\n return this.controller.removeEventCallback(callbackId);\r\n }\r\n /**\r\n * Registers a callback to receive performance events.\r\n *\r\n * @param {PerformanceCallbackFunction} callback\r\n * @returns {string}\r\n */\r\n addPerformanceCallback(callback) {\r\n return this.controller.addPerformanceCallback(callback);\r\n }\r\n /**\r\n * Removes a callback registered with addPerformanceCallback.\r\n *\r\n * @param {string} callbackId\r\n * @returns {boolean}\r\n */\r\n removePerformanceCallback(callbackId) {\r\n return this.controller.removePerformanceCallback(callbackId);\r\n }\r\n /**\r\n * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n enableAccountStorageEvents() {\r\n this.controller.enableAccountStorageEvents();\r\n }\r\n /**\r\n * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n disableAccountStorageEvents() {\r\n this.controller.disableAccountStorageEvents();\r\n }\r\n /**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\n getAccount(accountFilter) {\r\n return this.controller.getAccount(accountFilter);\r\n }\r\n /**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByHomeId(homeAccountId) {\r\n return this.controller.getAccountByHomeId(homeAccountId);\r\n }\r\n /**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByLocalId(localId) {\r\n return this.controller.getAccountByLocalId(localId);\r\n }\r\n /**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param userName\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByUsername(userName) {\r\n return this.controller.getAccountByUsername(userName);\r\n }\r\n /**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\n getAllAccounts(accountFilter) {\r\n return this.controller.getAllAccounts(accountFilter);\r\n }\r\n /**\r\n * Event handler function which allows users to fire events after the PublicClientApplication object\r\n * has loaded during redirect flows. This should be invoked on all page loads involved in redirect\r\n * auth flows.\r\n * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.\r\n * @returns Token response or null. If the return value is null, then no auth redirect was detected.\r\n */\r\n handleRedirectPromise(hash) {\r\n return this.controller.handleRedirectPromise(hash);\r\n }\r\n /**\r\n * Use when initiating the login process via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n loginPopup(request) {\r\n return this.controller.loginPopup(request);\r\n }\r\n /**\r\n * Use when initiating the login process by redirecting the user\'s browser to the authorization endpoint. This function redirects the page, so\r\n * any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n loginRedirect(request) {\r\n return this.controller.loginRedirect(request);\r\n }\r\n /**\r\n * Deprecated logout function. Use logoutRedirect or logoutPopup instead\r\n * @param logoutRequest\r\n * @deprecated\r\n */\r\n logout(logoutRequest) {\r\n return this.controller.logout(logoutRequest);\r\n }\r\n /**\r\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n * @param logoutRequest\r\n */\r\n logoutRedirect(logoutRequest) {\r\n return this.controller.logoutRedirect(logoutRequest);\r\n }\r\n /**\r\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n * @param logoutRequest\r\n */\r\n logoutPopup(logoutRequest) {\r\n return this.controller.logoutPopup(logoutRequest);\r\n }\r\n /**\r\n * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:\r\n * - Any browser using a form of Intelligent Tracking Prevention\r\n * - If there is not an established session with the service\r\n *\r\n * In these cases, the request must be done inside a popup or full frame redirect.\r\n *\r\n * For the cases where interaction is required, you cannot send a request with prompt=none.\r\n *\r\n * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as\r\n * you session on the server still exists.\r\n * @param request {@link SsoSilentRequest}\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n ssoSilent(request) {\r\n return this.controller.ssoSilent(request);\r\n }\r\n /**\r\n * Gets the token cache for the application.\r\n */\r\n getTokenCache() {\r\n return this.controller.getTokenCache();\r\n }\r\n /**\r\n * Returns the logger instance\r\n */\r\n getLogger() {\r\n return this.controller.getLogger();\r\n }\r\n /**\r\n * Replaces the default logger set in configurations with new Logger with new configurations\r\n * @param logger Logger instance\r\n */\r\n setLogger(logger) {\r\n this.controller.setLogger(logger);\r\n }\r\n /**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n this.controller.setActiveAccount(account);\r\n }\r\n /**\r\n * Gets the currently active account\r\n */\r\n getActiveAccount() {\r\n return this.controller.getActiveAccount();\r\n }\r\n /**\r\n * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.\r\n * @param sku\r\n * @param version\r\n */\r\n initializeWrapperLibrary(sku, version) {\r\n return this.controller.initializeWrapperLibrary(sku, version);\r\n }\r\n /**\r\n * Sets navigation client\r\n * @param navigationClient\r\n */\r\n setNavigationClient(navigationClient) {\r\n this.controller.setNavigationClient(navigationClient);\r\n }\r\n /**\r\n * Returns the configuration object\r\n * @internal\r\n */\r\n getConfiguration() {\r\n return this.controller.getConfiguration();\r\n }\r\n /**\r\n * Hydrates cache with the tokens and account in the AuthenticationResult object\r\n * @param result\r\n * @param request - The request object that was used to obtain the AuthenticationResult\r\n * @returns\r\n */\r\n async hydrateCache(result, request) {\r\n return this.controller.hydrateCache(result, request);\r\n }\r\n /**\r\n * Clears tokens and account from the browser cache.\r\n * @param logoutRequest\r\n */\r\n clearCache(logoutRequest) {\r\n return this.controller.clearCache(logoutRequest);\r\n }\r\n}\r\n/**\r\n * creates NestedAppAuthController and passes it to the PublicClientApplication,\r\n * falls back to StandardController if NestedAppAuthController is not available\r\n *\r\n * @param configuration\r\n * @returns IPublicClientApplication\r\n *\r\n */\r\nasync function createNestablePublicClientApplication(configuration) {\r\n const nestedAppAuth = new NestedAppOperatingContext(configuration);\r\n await nestedAppAuth.initialize();\r\n if (nestedAppAuth.isAvailable()) {\r\n const controller = new NestedAppAuthController(nestedAppAuth);\r\n return new PublicClientApplication(configuration, controller);\r\n }\r\n return createStandardPublicClientApplication(configuration);\r\n}\r\n/**\r\n * creates PublicClientApplication using StandardController\r\n *\r\n * @param configuration\r\n * @returns IPublicClientApplication\r\n *\r\n */\r\nasync function createStandardPublicClientApplication(configuration) {\r\n const pca = new PublicClientApplication(configuration);\r\n await pca.initialize();\r\n return pca;\r\n}\n\n\n//# sourceMappingURL=PublicClientApplication.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/controllers/UnknownOperatingContextController.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * UnknownOperatingContextController class\r\n *\r\n * - Until initialize method is called, this controller is the default\r\n * - AFter initialize method is called, this controller will be swapped out for the appropriate controller\r\n * if the operating context can be determined; otherwise this controller will continued be used\r\n *\r\n * - Why do we have this? We don\'t want to dynamically import (download) all of the code in StandardController if we don\'t need to.\r\n *\r\n * - Only includes implementation for getAccounts and handleRedirectPromise\r\n * - All other methods are will throw initialization error (because either initialize method or the factory method were not used)\r\n * - This controller is necessary for React Native wrapper, server side rendering and any other scenario where we don\'t have a DOM\r\n *\r\n */\r\nclass UnknownOperatingContextController {\r\n constructor(operatingContext) {\r\n // Flag representing whether or not the initialize API has been called and completed\r\n this.initialized = false;\r\n this.operatingContext = operatingContext;\r\n this.isBrowserEnvironment =\r\n this.operatingContext.isBrowserEnvironment();\r\n this.config = operatingContext.getConfig();\r\n this.logger = operatingContext.getLogger();\r\n // Initialize performance client\r\n this.performanceClient = this.config.telemetry.client;\r\n // Initialize the crypto class.\r\n this.browserCrypto = this.isBrowserEnvironment\r\n ? new CryptoOps(this.logger, this.performanceClient)\r\n : DEFAULT_CRYPTO_IMPLEMENTATION;\r\n // Initialize the browser storage class.\r\n this.browserStorage = this.isBrowserEnvironment\r\n ? new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger, undefined, this.performanceClient)\r\n : DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);\r\n }\r\n getBrowserStorage() {\r\n return this.browserStorage;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n getAccount(accountFilter) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n getAccountByHomeId(homeAccountId) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n getAccountByLocalId(localAccountId) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n getAccountByUsername(username) {\r\n return null;\r\n }\r\n getAllAccounts() {\r\n return [];\r\n }\r\n initialize() {\r\n this.initialized = true;\r\n return Promise.resolve();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n acquireTokenPopup(request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n acquireTokenRedirect(request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return Promise.resolve();\r\n }\r\n acquireTokenSilent(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n silentRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n acquireTokenByCode(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n acquireTokenNative(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request, \r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n apiId, \r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n accountId) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n acquireTokenByRefreshToken(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n commonRequest, \r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n silentRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n addEventCallback(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n callback, \r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n eventTypes) {\r\n return null;\r\n }\r\n removeEventCallback(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n callbackId) { }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n addPerformanceCallback(callback) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return "";\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n removePerformanceCallback(callbackId) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return true;\r\n }\r\n enableAccountStorageEvents() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n disableAccountStorageEvents() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n handleRedirectPromise(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n hash) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n return Promise.resolve(null);\r\n }\r\n loginPopup(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n loginRedirect(request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n logout(logoutRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n logoutRedirect(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n logoutRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n logoutPopup(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n logoutRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n ssoSilent(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n getTokenCache() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n getLogger() {\r\n return this.logger;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n setLogger(logger) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n setActiveAccount(account) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n getActiveAccount() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n initializeWrapperLibrary(sku, version) {\r\n this.browserStorage.setWrapperMetadata(sku, version);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n setNavigationClient(navigationClient) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n getConfiguration() {\r\n return this.config;\r\n }\r\n isBrowserEnv() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return true;\r\n }\r\n getBrowserCrypto() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n getPerformanceClient() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n getRedirectResponse() {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n return {};\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n async clearCache(logoutRequest) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n async hydrateCache(\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n result, \r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n request) {\r\n blockAPICallsBeforeInitialize(this.initialized);\r\n blockNonBrowserEnvironment();\r\n }\r\n}\n\n\n//# sourceMappingURL=UnknownOperatingContextController.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/operatingcontext/UnknownOperatingContext.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass UnknownOperatingContext extends BaseOperatingContext {\r\n /**\r\n * Returns the unique identifier for this operating context\r\n * @returns string\r\n */\r\n getId() {\r\n return UnknownOperatingContext.ID;\r\n }\r\n /**\r\n * Return the module name. Intended for use with import() to enable dynamic import\r\n * of the implementation associated with this operating context\r\n * @returns\r\n */\r\n getModuleName() {\r\n return UnknownOperatingContext.MODULE_NAME;\r\n }\r\n /**\r\n * Checks whether the operating context is available.\r\n * Confirms that the code is running a browser rather. This is required.\r\n * @returns Promise indicating whether this operating context is currently available.\r\n */\r\n async initialize() {\r\n /**\r\n * This operating context is in use when we have not checked for what the operating context is.\r\n * The context is unknown until we check it.\r\n */\r\n return true;\r\n }\r\n}\r\n/*\r\n * TODO: Once we have determine the bundling code return here to specify the name of the bundle\r\n * containing the implementation for this operating context\r\n */\r\nUnknownOperatingContext.MODULE_NAME = "";\r\n/**\r\n * Unique identifier for the operating context\r\n */\r\nUnknownOperatingContext.ID = "UnknownOperatingContext";\n\n\n//# sourceMappingURL=UnknownOperatingContext.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/app/PublicClientNext.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * PublicClientNext is an early look at the planned implementation of PublicClientApplication in the next major version of MSAL.js.\r\n * It contains support for multiple API implementations based on the runtime environment that it is running in.\r\n *\r\n * The goals of these changes are to provide a clean separation of behavior between different operating contexts (Nested App Auth, Platform Brokers, Plain old Browser, etc.)\r\n * while still providing a consistent API surface for developers.\r\n *\r\n * Please use PublicClientApplication for any prod/real-world scenarios.\r\n * Note: PublicClientNext is experimental and subject to breaking changes without following semver\r\n *\r\n */\r\nclass PublicClientNext {\r\n static async createPublicClientApplication(configuration) {\r\n const controller = await createController(configuration);\r\n let pca;\r\n if (controller !== null) {\r\n pca = new PublicClientNext(configuration, controller);\r\n }\r\n else {\r\n pca = new PublicClientNext(configuration);\r\n }\r\n return pca;\r\n }\r\n /**\r\n * @constructor\r\n * Constructor for the PublicClientNext used to instantiate the PublicClientNext object\r\n *\r\n * Important attributes in the Configuration object for auth are:\r\n * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n * - authority: the authority URL for your application.\r\n * - redirect_uri: the uri of your application registered in the portal.\r\n *\r\n * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}\r\n * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.\r\n * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.\r\n * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.\r\n *\r\n * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/\r\n * Full B2C functionality will be available in this library in future versions.\r\n *\r\n * @param configuration Object for the MSAL PublicClientApplication instance\r\n * @param IController Optional parameter to explictly set the controller. (Will be removed when we remove public constructor)\r\n */\r\n constructor(configuration, controller) {\r\n this.configuration = configuration;\r\n if (controller) {\r\n this.controller = controller;\r\n }\r\n else {\r\n const operatingContext = new UnknownOperatingContext(configuration);\r\n this.controller = new UnknownOperatingContextController(operatingContext);\r\n }\r\n }\r\n /**\r\n * Initializer function to perform async startup tasks such as connecting to WAM extension\r\n */\r\n async initialize() {\r\n if (this.controller instanceof UnknownOperatingContextController) {\r\n const result = await createController(this.configuration);\r\n if (result !== null) {\r\n this.controller = result;\r\n }\r\n return this.controller.initialize();\r\n }\r\n return Promise.resolve();\r\n }\r\n /**\r\n * Use when you want to obtain an access_token for your API via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n async acquireTokenPopup(request) {\r\n return this.controller.acquireTokenPopup(request);\r\n }\r\n /**\r\n * Use when you want to obtain an access_token for your API by redirecting the user\'s browser window to the authorization endpoint. This function redirects\r\n * the page, so any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n acquireTokenRedirect(request) {\r\n return this.controller.acquireTokenRedirect(request);\r\n }\r\n /**\r\n * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.\r\n *\r\n * @param {@link (SilentRequest:type)}\r\n * @returns {Promise.} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthenticationResult} object\r\n */\r\n acquireTokenSilent(silentRequest) {\r\n return this.controller.acquireTokenSilent(silentRequest);\r\n }\r\n /**\r\n * This function redeems an authorization code (passed as code) from the eSTS token endpoint.\r\n * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.\r\n * This API is not indended for normal authorization code acquisition and redemption.\r\n *\r\n * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.\r\n *\r\n * @param request {@link AuthorizationCodeRequest}\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n acquireTokenByCode(request) {\r\n return this.controller.acquireTokenByCode(request);\r\n }\r\n /**\r\n * Adds event callbacks to array\r\n * @param callback\r\n */\r\n addEventCallback(callback, eventTypes) {\r\n return this.controller.addEventCallback(callback, eventTypes);\r\n }\r\n /**\r\n * Removes callback with provided id from callback array\r\n * @param callbackId\r\n */\r\n removeEventCallback(callbackId) {\r\n return this.controller.removeEventCallback(callbackId);\r\n }\r\n /**\r\n * Registers a callback to receive performance events.\r\n *\r\n * @param {PerformanceCallbackFunction} callback\r\n * @returns {string}\r\n */\r\n addPerformanceCallback(callback) {\r\n return this.controller.addPerformanceCallback(callback);\r\n }\r\n /**\r\n * Removes a callback registered with addPerformanceCallback.\r\n *\r\n * @param {string} callbackId\r\n * @returns {boolean}\r\n */\r\n removePerformanceCallback(callbackId) {\r\n return this.controller.removePerformanceCallback(callbackId);\r\n }\r\n /**\r\n * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n enableAccountStorageEvents() {\r\n this.controller.enableAccountStorageEvents();\r\n }\r\n /**\r\n * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n */\r\n disableAccountStorageEvents() {\r\n this.controller.disableAccountStorageEvents();\r\n }\r\n /**\r\n * Returns the first account found in the cache that matches the account filter passed in.\r\n * @param accountFilter\r\n * @returns The first account found in the cache matching the provided filter or null if no account could be found.\r\n */\r\n getAccount(accountFilter) {\r\n return this.controller.getAccount(accountFilter);\r\n }\r\n /**\r\n * Returns the signed in account matching homeAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param homeAccountId\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByHomeId(homeAccountId) {\r\n return this.controller.getAccountByHomeId(homeAccountId);\r\n }\r\n /**\r\n * Returns the signed in account matching localAccountId.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found\r\n * @param localAccountId\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByLocalId(localId) {\r\n return this.controller.getAccountByLocalId(localId);\r\n }\r\n /**\r\n * Returns the signed in account matching username.\r\n * (the account object is created at the time of successful login)\r\n * or null when no matching account is found.\r\n * This API is provided for convenience but getAccountById should be used for best reliability\r\n * @param userName\r\n * @returns The account object stored in MSAL\r\n * @deprecated - Use getAccount instead\r\n */\r\n getAccountByUsername(userName) {\r\n return this.controller.getAccountByUsername(userName);\r\n }\r\n /**\r\n * Returns all the accounts in the cache that match the optional filter. If no filter is provided, all accounts are returned.\r\n * @param accountFilter - (Optional) filter to narrow down the accounts returned\r\n * @returns Array of AccountInfo objects in cache\r\n */\r\n getAllAccounts(accountFilter) {\r\n return this.controller.getAllAccounts(accountFilter);\r\n }\r\n /**\r\n * Event handler function which allows users to fire events after the PublicClientApplication object\r\n * has loaded during redirect flows. This should be invoked on all page loads involved in redirect\r\n * auth flows.\r\n * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.\r\n * @returns Token response or null. If the return value is null, then no auth redirect was detected.\r\n */\r\n handleRedirectPromise(hash) {\r\n return this.controller.handleRedirectPromise(hash);\r\n }\r\n /**\r\n * Use when initiating the login process via opening a popup window in the user\'s browser\r\n *\r\n * @param request\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n loginPopup(request) {\r\n return this.controller.loginPopup(request);\r\n }\r\n /**\r\n * Use when initiating the login process by redirecting the user\'s browser to the authorization endpoint. This function redirects the page, so\r\n * any code that follows this function will not execute.\r\n *\r\n * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n *\r\n * @param request\r\n */\r\n loginRedirect(request) {\r\n return this.controller.loginRedirect(request);\r\n }\r\n /**\r\n * Deprecated logout function. Use logoutRedirect or logoutPopup instead\r\n * @param logoutRequest\r\n * @deprecated\r\n */\r\n logout(logoutRequest) {\r\n return this.controller.logout(logoutRequest);\r\n }\r\n /**\r\n * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n * Default behaviour is to redirect the user to `window.location.href`.\r\n * @param logoutRequest\r\n */\r\n logoutRedirect(logoutRequest) {\r\n return this.controller.logoutRedirect(logoutRequest);\r\n }\r\n /**\r\n * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n * @param logoutRequest\r\n */\r\n logoutPopup(logoutRequest) {\r\n return this.controller.logoutPopup(logoutRequest);\r\n }\r\n /**\r\n * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:\r\n * - Any browser using a form of Intelligent Tracking Prevention\r\n * - If there is not an established session with the service\r\n *\r\n * In these cases, the request must be done inside a popup or full frame redirect.\r\n *\r\n * For the cases where interaction is required, you cannot send a request with prompt=none.\r\n *\r\n * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as\r\n * you session on the server still exists.\r\n * @param request {@link SsoSilentRequest}\r\n *\r\n * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n */\r\n ssoSilent(request) {\r\n return this.controller.ssoSilent(request);\r\n }\r\n /**\r\n * Gets the token cache for the application.\r\n */\r\n getTokenCache() {\r\n return this.controller.getTokenCache();\r\n }\r\n /**\r\n * Returns the logger instance\r\n */\r\n getLogger() {\r\n return this.controller.getLogger();\r\n }\r\n /**\r\n * Replaces the default logger set in configurations with new Logger with new configurations\r\n * @param logger Logger instance\r\n */\r\n setLogger(logger) {\r\n this.controller.setLogger(logger);\r\n }\r\n /**\r\n * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n * @param account\r\n */\r\n setActiveAccount(account) {\r\n this.controller.setActiveAccount(account);\r\n }\r\n /**\r\n * Gets the currently active account\r\n */\r\n getActiveAccount() {\r\n return this.controller.getActiveAccount();\r\n }\r\n /**\r\n * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.\r\n * @param sku\r\n * @param version\r\n */\r\n initializeWrapperLibrary(sku, version) {\r\n return this.controller.initializeWrapperLibrary(sku, version);\r\n }\r\n /**\r\n * Sets navigation client\r\n * @param navigationClient\r\n */\r\n setNavigationClient(navigationClient) {\r\n this.controller.setNavigationClient(navigationClient);\r\n }\r\n /**\r\n * Returns the configuration object\r\n * @internal\r\n */\r\n getConfiguration() {\r\n return this.controller.getConfiguration();\r\n }\r\n /**\r\n * Hydrates cache with the tokens and account in the AuthenticationResult object\r\n * @param result\r\n * @param request - The request object that was used to obtain the AuthenticationResult\r\n * @returns\r\n */\r\n async hydrateCache(result, request) {\r\n return this.controller.hydrateCache(result, request);\r\n }\r\n /**\r\n * Clears tokens and account from the browser cache.\r\n * @param logoutRequest\r\n */\r\n clearCache(logoutRequest) {\r\n return this.controller.clearCache(logoutRequest);\r\n }\r\n}\n\n\n//# sourceMappingURL=PublicClientNext.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/app/IPublicClientApplication.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst stubbedPublicClientApplication = {\r\n initialize: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n acquireTokenPopup: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n acquireTokenRedirect: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n acquireTokenSilent: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n acquireTokenByCode: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n getAllAccounts: () => {\r\n return [];\r\n },\r\n getAccount: () => {\r\n return null;\r\n },\r\n getAccountByHomeId: () => {\r\n return null;\r\n },\r\n getAccountByUsername: () => {\r\n return null;\r\n },\r\n getAccountByLocalId: () => {\r\n return null;\r\n },\r\n handleRedirectPromise: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n loginPopup: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n loginRedirect: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n logout: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n logoutRedirect: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n logoutPopup: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n ssoSilent: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n addEventCallback: () => {\r\n return null;\r\n },\r\n removeEventCallback: () => {\r\n return;\r\n },\r\n addPerformanceCallback: () => {\r\n return "";\r\n },\r\n removePerformanceCallback: () => {\r\n return false;\r\n },\r\n enableAccountStorageEvents: () => {\r\n return;\r\n },\r\n disableAccountStorageEvents: () => {\r\n return;\r\n },\r\n getTokenCache: () => {\r\n throw createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled);\r\n },\r\n getLogger: () => {\r\n throw createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled);\r\n },\r\n setLogger: () => {\r\n return;\r\n },\r\n setActiveAccount: () => {\r\n return;\r\n },\r\n getActiveAccount: () => {\r\n return null;\r\n },\r\n initializeWrapperLibrary: () => {\r\n return;\r\n },\r\n setNavigationClient: () => {\r\n return;\r\n },\r\n getConfiguration: () => {\r\n throw createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled);\r\n },\r\n hydrateCache: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n clearCache: () => {\r\n return Promise.reject(createBrowserConfigurationAuthError(stubbedPublicClientApplicationCalled));\r\n },\r\n};\n\n\n//# sourceMappingURL=IPublicClientApplication.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/cache/BrowserStorage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * @deprecated This class will be removed in a future major version\r\n */\r\nclass BrowserStorage {\r\n constructor(cacheLocation) {\r\n if (cacheLocation === BrowserCacheLocation.LocalStorage) {\r\n this.windowStorage = new LocalStorage();\r\n }\r\n else if (cacheLocation === BrowserCacheLocation.SessionStorage) {\r\n this.windowStorage = new SessionStorage();\r\n }\r\n else {\r\n throw createBrowserConfigurationAuthError(storageNotSupported);\r\n }\r\n }\r\n getItem(key) {\r\n return this.windowStorage.getItem(key);\r\n }\r\n setItem(key, value) {\r\n this.windowStorage.setItem(key, value);\r\n }\r\n removeItem(key) {\r\n this.windowStorage.removeItem(key);\r\n }\r\n getKeys() {\r\n return Object.keys(this.windowStorage);\r\n }\r\n containsKey(key) {\r\n return this.windowStorage.hasOwnProperty(key);\r\n }\r\n}\n\n\n//# sourceMappingURL=BrowserStorage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/event/EventMessage.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass EventMessageUtils {\r\n /**\r\n * Gets interaction status from event message\r\n * @param message\r\n * @param currentStatus\r\n */\r\n static getInteractionStatusFromEvent(message, currentStatus) {\r\n switch (message.eventType) {\r\n case EventType.LOGIN_START:\r\n return InteractionStatus.Login;\r\n case EventType.SSO_SILENT_START:\r\n return InteractionStatus.SsoSilent;\r\n case EventType.ACQUIRE_TOKEN_START:\r\n if (message.interactionType === InteractionType.Redirect ||\r\n message.interactionType === InteractionType.Popup) {\r\n return InteractionStatus.AcquireToken;\r\n }\r\n break;\r\n case EventType.HANDLE_REDIRECT_START:\r\n return InteractionStatus.HandleRedirect;\r\n case EventType.LOGOUT_START:\r\n return InteractionStatus.Logout;\r\n case EventType.SSO_SILENT_SUCCESS:\r\n case EventType.SSO_SILENT_FAILURE:\r\n if (currentStatus &&\r\n currentStatus !== InteractionStatus.SsoSilent) {\r\n // Prevent this event from clearing any status other than ssoSilent\r\n break;\r\n }\r\n return InteractionStatus.None;\r\n case EventType.LOGOUT_END:\r\n if (currentStatus &&\r\n currentStatus !== InteractionStatus.Logout) {\r\n // Prevent this event from clearing any status other than logout\r\n break;\r\n }\r\n return InteractionStatus.None;\r\n case EventType.HANDLE_REDIRECT_END:\r\n if (currentStatus &&\r\n currentStatus !== InteractionStatus.HandleRedirect) {\r\n // Prevent this event from clearing any status other than handleRedirect\r\n break;\r\n }\r\n return InteractionStatus.None;\r\n case EventType.LOGIN_SUCCESS:\r\n case EventType.LOGIN_FAILURE:\r\n case EventType.ACQUIRE_TOKEN_SUCCESS:\r\n case EventType.ACQUIRE_TOKEN_FAILURE:\r\n case EventType.RESTORE_FROM_BFCACHE:\r\n if (message.interactionType === InteractionType.Redirect ||\r\n message.interactionType === InteractionType.Popup) {\r\n if (currentStatus &&\r\n currentStatus !== InteractionStatus.Login &&\r\n currentStatus !== InteractionStatus.AcquireToken) {\r\n // Prevent this event from clearing any status other than login or acquireToken\r\n break;\r\n }\r\n return InteractionStatus.None;\r\n }\r\n break;\r\n }\r\n return null;\r\n }\r\n}\n\n\n//# sourceMappingURL=EventMessage.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/crypto/SignedHttpRequest.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nclass SignedHttpRequest {\r\n constructor(shrParameters, shrOptions) {\r\n const loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};\r\n this.logger = new Logger(loggerOptions, dist_packageMetadata_name, packageMetadata_version);\r\n this.cryptoOps = new CryptoOps(this.logger);\r\n this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);\r\n this.shrParameters = shrParameters;\r\n }\r\n /**\r\n * Generates and caches a keypair for the given request options.\r\n * @returns Public key digest, which should be sent to the token issuer.\r\n */\r\n async generatePublicKeyThumbprint() {\r\n const { kid } = await this.popTokenGenerator.generateKid(this.shrParameters);\r\n return kid;\r\n }\r\n /**\r\n * Generates a signed http request for the given payload with the given key.\r\n * @param payload Payload to sign (e.g. access token)\r\n * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)\r\n * @param claims Additional claims to include/override in the signed JWT\r\n * @returns Pop token signed with the corresponding private key\r\n */\r\n async signRequest(payload, publicKeyThumbprint, claims) {\r\n return this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims);\r\n }\r\n /**\r\n * Removes cached keys from browser for given public key thumbprint\r\n * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)\r\n * @returns If keys are properly deleted\r\n */\r\n async removeKeys(publicKeyThumbprint) {\r\n return this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint);\r\n }\r\n}\n\n\n//# sourceMappingURL=SignedHttpRequest.mjs.map\n\n;// ./node_modules/@azure/msal-common/dist/telemetry/performance/PerformanceClient.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Starts context by adding payload to the stack\r\n * @param event {PerformanceEvent}\r\n * @param abbreviations {Map} event name abbreviations\r\n * @param stack {?PerformanceEventStackedContext[]} stack\r\n */\r\nfunction startContext(event, abbreviations, stack) {\r\n if (!stack) {\r\n return;\r\n }\r\n stack.push({\r\n name: abbreviations.get(event.name) || event.name,\r\n });\r\n}\r\n/**\r\n * Ends context by removing payload from the stack and returning parent or self, if stack is empty, payload\r\n *\r\n * @param event {PerformanceEvent}\r\n * @param abbreviations {Map} event name abbreviations\r\n * @param stack {?PerformanceEventStackedContext[]} stack\r\n * @param error {?unknown} error\r\n */\r\nfunction endContext(event, abbreviations, stack, error) {\r\n if (!stack?.length) {\r\n return;\r\n }\r\n const peek = (stack) => {\r\n return stack.length ? stack[stack.length - 1] : undefined;\r\n };\r\n const abbrEventName = abbreviations.get(event.name) || event.name;\r\n const top = peek(stack);\r\n if (top?.name !== abbrEventName) {\r\n return;\r\n }\r\n const current = stack?.pop();\r\n if (!current) {\r\n return;\r\n }\r\n const errorCode = error instanceof AuthError\r\n ? error.errorCode\r\n : error instanceof Error\r\n ? error.name\r\n : undefined;\r\n const subErr = error instanceof AuthError ? error.subError : undefined;\r\n if (errorCode && current.childErr !== errorCode) {\r\n current.err = errorCode;\r\n if (subErr) {\r\n current.subErr = subErr;\r\n }\r\n }\r\n delete current.name;\r\n delete current.childErr;\r\n const context = {\r\n ...current,\r\n dur: event.durationMs,\r\n };\r\n if (!event.success) {\r\n context.fail = 1;\r\n }\r\n const parent = peek(stack);\r\n if (!parent) {\r\n return { [abbrEventName]: context };\r\n }\r\n if (errorCode) {\r\n parent.childErr = errorCode;\r\n }\r\n let childName;\r\n if (!parent[abbrEventName]) {\r\n childName = abbrEventName;\r\n }\r\n else {\r\n const siblings = Object.keys(parent).filter((key) => key.startsWith(abbrEventName)).length;\r\n childName = `${abbrEventName}_${siblings + 1}`;\r\n }\r\n parent[childName] = context;\r\n return parent;\r\n}\r\n/**\r\n * Adds error name and stack trace to the telemetry event\r\n * @param error {Error}\r\n * @param logger {Logger}\r\n * @param event {PerformanceEvent}\r\n * @param stackMaxSize {number} max error stack size to capture\r\n */\r\nfunction addError(error, logger, event, stackMaxSize = 5) {\r\n if (!(error instanceof Error)) {\r\n logger.trace("PerformanceClient.addErrorStack: Input error is not instance of Error", event.correlationId);\r\n return;\r\n }\r\n else if (error instanceof AuthError) {\r\n event.errorCode = error.errorCode;\r\n event.subErrorCode = error.subError;\r\n if (error instanceof ServerError ||\r\n error instanceof InteractionRequiredAuthError) {\r\n event.serverErrorNo = error.errorNo;\r\n }\r\n return;\r\n }\r\n else if (error instanceof CacheError) {\r\n event.errorCode = error.errorCode;\r\n return;\r\n }\r\n else if (event.errorStack?.length) {\r\n logger.trace("PerformanceClient.addErrorStack: Stack already exist", event.correlationId);\r\n return;\r\n }\r\n else if (!error.stack?.length) {\r\n logger.trace("PerformanceClient.addErrorStack: Input stack is empty", event.correlationId);\r\n return;\r\n }\r\n if (error.stack) {\r\n event.errorStack = compactStack(error.stack, stackMaxSize);\r\n }\r\n event.errorName = error.name;\r\n}\r\n/**\r\n * Compacts error stack into array by fetching N first entries\r\n * @param stack {string} error stack\r\n * @param stackMaxSize {number} max error stack size to capture\r\n * @returns {string[]}\r\n */\r\nfunction compactStack(stack, stackMaxSize) {\r\n if (stackMaxSize < 0) {\r\n return [];\r\n }\r\n const stackArr = stack.split("\\n") || [];\r\n const res = [];\r\n // Check for a handful of known, common runtime errors and log them (with redaction where applicable).\r\n const firstLine = stackArr[0];\r\n if (firstLine.startsWith("TypeError: Cannot read property") ||\r\n firstLine.startsWith("TypeError: Cannot read properties of") ||\r\n firstLine.startsWith("TypeError: Cannot set property") ||\r\n firstLine.startsWith("TypeError: Cannot set properties of") ||\r\n firstLine.endsWith("is not a function")) {\r\n // These types of errors are not at risk of leaking PII. They will indicate unavailable APIs\r\n res.push(compactStackLine(firstLine));\r\n }\r\n else if (firstLine.startsWith("SyntaxError") ||\r\n firstLine.startsWith("TypeError")) {\r\n // Prevent unintentional leaking of arbitrary info by redacting contents between both single and double quotes\r\n res.push(compactStackLine(\r\n // Example: SyntaxError: Unexpected token \'e\', "test" is not valid JSON -> SyntaxError: Unexpected token , is not valid JSON\r\n firstLine.replace(/[\'].*[\']|["].*["]/g, "")));\r\n }\r\n // Get top N stack lines\r\n for (let ix = 1; ix < stackArr.length; ix++) {\r\n if (res.length >= stackMaxSize) {\r\n break;\r\n }\r\n const line = stackArr[ix];\r\n res.push(compactStackLine(line));\r\n }\r\n return res;\r\n}\r\n/**\r\n * Compacts error stack line by shortening file path\r\n * Example: https://localhost/msal-common/src/authority/Authority.js:100:1 -> Authority.js:100:1\r\n * @param line {string} stack line\r\n * @returns {string}\r\n */\r\nfunction compactStackLine(line) {\r\n const filePathIx = line.lastIndexOf(" ") + 1;\r\n if (filePathIx < 1) {\r\n return line;\r\n }\r\n const filePath = line.substring(filePathIx);\r\n let fileNameIx = filePath.lastIndexOf("/");\r\n fileNameIx = fileNameIx < 0 ? filePath.lastIndexOf("\\\\") : fileNameIx;\r\n if (fileNameIx >= 0) {\r\n return (line.substring(0, filePathIx) +\r\n "(" +\r\n filePath.substring(fileNameIx + 1) +\r\n (filePath.charAt(filePath.length - 1) === ")" ? "" : ")")).trimStart();\r\n }\r\n return line.trimStart();\r\n}\r\nclass PerformanceClient {\r\n /**\r\n * Creates an instance of PerformanceClient,\r\n * an abstract class containing core performance telemetry logic.\r\n *\r\n * @constructor\r\n * @param {string} clientId Client ID of the application\r\n * @param {string} authority Authority used by the application\r\n * @param {Logger} logger Logger used by the application\r\n * @param {string} libraryName Name of the library\r\n * @param {string} libraryVersion Version of the library\r\n * @param {ApplicationTelemetry} applicationTelemetry application name and version\r\n * @param {Set} intFields integer fields to be truncated\r\n * @param {Map} abbreviations event name abbreviations\r\n */\r\n constructor(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry, intFields, abbreviations) {\r\n this.authority = authority;\r\n this.libraryName = libraryName;\r\n this.libraryVersion = libraryVersion;\r\n this.applicationTelemetry = applicationTelemetry;\r\n this.clientId = clientId;\r\n this.logger = logger;\r\n this.callbacks = new Map();\r\n this.eventsByCorrelationId = new Map();\r\n this.eventStack = new Map();\r\n this.queueMeasurements = new Map();\r\n this.preQueueTimeByCorrelationId = new Map();\r\n this.intFields = intFields || new Set();\r\n for (const item of IntFields) {\r\n this.intFields.add(item);\r\n }\r\n this.abbreviations = abbreviations || new Map();\r\n for (const [key, value] of PerformanceEventAbbreviations) {\r\n this.abbreviations.set(key, value);\r\n }\r\n }\r\n /**\r\n * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\r\n * Note: this function can be changed to abstract at the next major version bump.\r\n *\r\n * @param {string} measureName\r\n * @param {string} correlationId\r\n * @returns {IPerformanceMeasurement}\r\n * @deprecated This method will be removed in the next major version\r\n */\r\n startPerformanceMeasurement(measureName, // eslint-disable-line @typescript-eslint/no-unused-vars\r\n correlationId // eslint-disable-line @typescript-eslint/no-unused-vars\r\n ) {\r\n return {};\r\n }\r\n /**\r\n * Gets map of pre-queue times by correlation Id\r\n *\r\n * @param {PerformanceEvents} eventName\r\n * @param {string} correlationId\r\n * @returns {number}\r\n */\r\n getPreQueueTime(eventName, correlationId) {\r\n const preQueueEvent = this.preQueueTimeByCorrelationId.get(correlationId);\r\n if (!preQueueEvent) {\r\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue times found for correlationId: ${correlationId}, unable to add queue measurement`);\r\n return;\r\n }\r\n else if (preQueueEvent.name !== eventName) {\r\n this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue time found for ${eventName}, unable to add queue measurement`);\r\n return;\r\n }\r\n return preQueueEvent.time;\r\n }\r\n /**\r\n * Calculates the difference between current time and time when function was queued.\r\n * Note: It is possible to have 0 as the queue time if the current time and the queued time was the same.\r\n *\r\n * @param {number} preQueueTime\r\n * @param {number} currentTime\r\n * @returns {number}\r\n */\r\n calculateQueuedTime(preQueueTime, currentTime) {\r\n if (preQueueTime < 1) {\r\n this.logger.trace(`PerformanceClient: preQueueTime should be a positive integer and not ${preQueueTime}`);\r\n return 0;\r\n }\r\n if (currentTime < 1) {\r\n this.logger.trace(`PerformanceClient: currentTime should be a positive integer and not ${currentTime}`);\r\n return 0;\r\n }\r\n if (currentTime < preQueueTime) {\r\n this.logger.trace("PerformanceClient: currentTime is less than preQueueTime, check how time is being retrieved");\r\n return 0;\r\n }\r\n return currentTime - preQueueTime;\r\n }\r\n /**\r\n * Adds queue measurement time to QueueMeasurements array for given correlation ID.\r\n *\r\n * @param {PerformanceEvents} eventName\r\n * @param {?string} correlationId\r\n * @param {?number} queueTime\r\n * @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements\r\n * @returns\r\n */\r\n addQueueMeasurement(eventName, correlationId, queueTime, manuallyCompleted) {\r\n if (!correlationId) {\r\n this.logger.trace(`PerformanceClient.addQueueMeasurement: correlationId not provided for ${eventName}, cannot add queue measurement`);\r\n return;\r\n }\r\n if (queueTime === 0) {\r\n // Possible for there to be no queue time after calculation\r\n this.logger.trace(`PerformanceClient.addQueueMeasurement: queue time provided for ${eventName} is ${queueTime}`);\r\n }\r\n else if (!queueTime) {\r\n this.logger.trace(`PerformanceClient.addQueueMeasurement: no queue time provided for ${eventName}`);\r\n return;\r\n }\r\n const queueMeasurement = {\r\n eventName,\r\n // Always default queue time to 0 for manually completed (improperly instrumented)\r\n queueTime: manuallyCompleted ? 0 : queueTime,\r\n manuallyCompleted,\r\n };\r\n // Adds to existing correlation Id if present in queueMeasurements\r\n const existingMeasurements = this.queueMeasurements.get(correlationId);\r\n if (existingMeasurements) {\r\n existingMeasurements.push(queueMeasurement);\r\n this.queueMeasurements.set(correlationId, existingMeasurements);\r\n }\r\n else {\r\n // Sets new correlation Id if not present in queueMeasurements\r\n this.logger.trace(`PerformanceClient.addQueueMeasurement: adding correlationId ${correlationId} to queue measurements`);\r\n const measurementArray = [queueMeasurement];\r\n this.queueMeasurements.set(correlationId, measurementArray);\r\n }\r\n // Delete processed pre-queue event.\r\n this.preQueueTimeByCorrelationId.delete(correlationId);\r\n }\r\n /**\r\n * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\r\n *\r\n * @param {PerformanceEvents} measureName\r\n * @param {?string} [correlationId]\r\n * @returns {InProgressPerformanceEvent}\r\n */\r\n startMeasurement(measureName, correlationId) {\r\n // Generate a placeholder correlation if the request does not provide one\r\n const eventCorrelationId = correlationId || this.generateId();\r\n if (!correlationId) {\r\n this.logger.info(`PerformanceClient: No correlation id provided for ${measureName}, generating`, eventCorrelationId);\r\n }\r\n this.logger.trace(`PerformanceClient: Performance measurement started for ${measureName}`, eventCorrelationId);\r\n const inProgressEvent = {\r\n eventId: this.generateId(),\r\n status: PerformanceEventStatus.InProgress,\r\n authority: this.authority,\r\n libraryName: this.libraryName,\r\n libraryVersion: this.libraryVersion,\r\n clientId: this.clientId,\r\n name: measureName,\r\n startTimeMs: Date.now(),\r\n correlationId: eventCorrelationId,\r\n appName: this.applicationTelemetry?.appName,\r\n appVersion: this.applicationTelemetry?.appVersion,\r\n };\r\n // Store in progress events so they can be discarded if not ended properly\r\n this.cacheEventByCorrelationId(inProgressEvent);\r\n startContext(inProgressEvent, this.abbreviations, this.eventStack.get(eventCorrelationId));\r\n // Return the event and functions the caller can use to properly end/flush the measurement\r\n return {\r\n end: (event, error) => {\r\n return this.endMeasurement({\r\n // Initial set of event properties\r\n ...inProgressEvent,\r\n // Properties set when event ends\r\n ...event,\r\n }, error);\r\n },\r\n discard: () => {\r\n return this.discardMeasurements(inProgressEvent.correlationId);\r\n },\r\n add: (fields) => {\r\n return this.addFields(fields, inProgressEvent.correlationId);\r\n },\r\n increment: (fields) => {\r\n return this.incrementFields(fields, inProgressEvent.correlationId);\r\n },\r\n event: inProgressEvent,\r\n measurement: new StubPerformanceMeasurement(),\r\n };\r\n }\r\n /**\r\n * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,\r\n * as consumers should instead use the function returned by startMeasurement.\r\n * Adds a new field named as "[event name]DurationMs" for sub-measurements, completes and emits an event\r\n * otherwise.\r\n *\r\n * @param {PerformanceEvent} event\r\n * @param {unknown} error\r\n * @returns {(PerformanceEvent | null)}\r\n */\r\n endMeasurement(event, error) {\r\n const rootEvent = this.eventsByCorrelationId.get(event.correlationId);\r\n if (!rootEvent) {\r\n this.logger.trace(`PerformanceClient: Measurement not found for ${event.eventId}`, event.correlationId);\r\n return null;\r\n }\r\n const isRoot = event.eventId === rootEvent.eventId;\r\n let queueInfo = {\r\n totalQueueTime: 0,\r\n totalQueueCount: 0,\r\n manuallyCompletedCount: 0,\r\n };\r\n event.durationMs = Math.round(event.durationMs || this.getDurationMs(event.startTimeMs));\r\n const context = JSON.stringify(endContext(event, this.abbreviations, this.eventStack.get(rootEvent.correlationId), error));\r\n if (isRoot) {\r\n queueInfo = this.getQueueInfo(event.correlationId);\r\n this.discardMeasurements(rootEvent.correlationId);\r\n }\r\n else {\r\n rootEvent.incompleteSubMeasurements?.delete(event.eventId);\r\n }\r\n this.logger.trace(`PerformanceClient: Performance measurement ended for ${event.name}: ${event.durationMs} ms`, event.correlationId);\r\n if (error) {\r\n addError(error, this.logger, rootEvent);\r\n }\r\n // Add sub-measurement attribute to root event.\r\n if (!isRoot) {\r\n rootEvent[event.name + "DurationMs"] = Math.floor(event.durationMs);\r\n return { ...rootEvent };\r\n }\r\n if (isRoot &&\r\n !error &&\r\n (rootEvent.errorCode || rootEvent.subErrorCode)) {\r\n this.logger.trace(`PerformanceClient: Remove error and sub-error codes for root event ${event.name} as intermediate error was successfully handled`, event.correlationId);\r\n rootEvent.errorCode = undefined;\r\n rootEvent.subErrorCode = undefined;\r\n }\r\n let finalEvent = { ...rootEvent, ...event };\r\n let incompleteSubsCount = 0;\r\n // Incomplete sub-measurements are discarded. They are likely an instrumentation bug that should be fixed.\r\n finalEvent.incompleteSubMeasurements?.forEach((subMeasurement) => {\r\n this.logger.trace(`PerformanceClient: Incomplete submeasurement ${subMeasurement.name} found for ${event.name}`, finalEvent.correlationId);\r\n incompleteSubsCount++;\r\n });\r\n finalEvent.incompleteSubMeasurements = undefined;\r\n finalEvent = {\r\n ...finalEvent,\r\n queuedTimeMs: queueInfo.totalQueueTime,\r\n queuedCount: queueInfo.totalQueueCount,\r\n queuedManuallyCompletedCount: queueInfo.manuallyCompletedCount,\r\n status: PerformanceEventStatus.Completed,\r\n incompleteSubsCount,\r\n context,\r\n };\r\n this.truncateIntegralFields(finalEvent);\r\n this.emitEvents([finalEvent], event.correlationId);\r\n return finalEvent;\r\n }\r\n /**\r\n * Saves extra information to be emitted when the measurements are flushed\r\n * @param fields\r\n * @param correlationId\r\n */\r\n addFields(fields, correlationId) {\r\n this.logger.trace("PerformanceClient: Updating static fields");\r\n const event = this.eventsByCorrelationId.get(correlationId);\r\n if (event) {\r\n this.eventsByCorrelationId.set(correlationId, {\r\n ...event,\r\n ...fields,\r\n });\r\n }\r\n else {\r\n this.logger.trace("PerformanceClient: Event not found for", correlationId);\r\n }\r\n }\r\n /**\r\n * Increment counters to be emitted when the measurements are flushed\r\n * @param fields {string[]}\r\n * @param correlationId {string} correlation identifier\r\n */\r\n incrementFields(fields, correlationId) {\r\n this.logger.trace("PerformanceClient: Updating counters");\r\n const event = this.eventsByCorrelationId.get(correlationId);\r\n if (event) {\r\n for (const counter in fields) {\r\n if (!event.hasOwnProperty(counter)) {\r\n event[counter] = 0;\r\n }\r\n else if (isNaN(Number(event[counter]))) {\r\n return;\r\n }\r\n event[counter] += fields[counter];\r\n }\r\n }\r\n else {\r\n this.logger.trace("PerformanceClient: Event not found for", correlationId);\r\n }\r\n }\r\n /**\r\n * Upserts event into event cache.\r\n * First key is the correlation id, second key is the event id.\r\n * Allows for events to be grouped by correlation id,\r\n * and to easily allow for properties on them to be updated.\r\n *\r\n * @private\r\n * @param {PerformanceEvent} event\r\n */\r\n cacheEventByCorrelationId(event) {\r\n const rootEvent = this.eventsByCorrelationId.get(event.correlationId);\r\n if (rootEvent) {\r\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} added/updated`, event.correlationId);\r\n rootEvent.incompleteSubMeasurements =\r\n rootEvent.incompleteSubMeasurements || new Map();\r\n rootEvent.incompleteSubMeasurements.set(event.eventId, {\r\n name: event.name,\r\n startTimeMs: event.startTimeMs,\r\n });\r\n }\r\n else {\r\n this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} started`, event.correlationId);\r\n this.eventsByCorrelationId.set(event.correlationId, { ...event });\r\n this.eventStack.set(event.correlationId, []);\r\n }\r\n }\r\n getQueueInfo(correlationId) {\r\n const queueMeasurementForCorrelationId = this.queueMeasurements.get(correlationId);\r\n if (!queueMeasurementForCorrelationId) {\r\n this.logger.trace(`PerformanceClient: no queue measurements found for for correlationId: ${correlationId}`);\r\n }\r\n let totalQueueTime = 0;\r\n let totalQueueCount = 0;\r\n let manuallyCompletedCount = 0;\r\n queueMeasurementForCorrelationId?.forEach((measurement) => {\r\n totalQueueTime += measurement.queueTime;\r\n totalQueueCount++;\r\n manuallyCompletedCount += measurement.manuallyCompleted ? 1 : 0;\r\n });\r\n return {\r\n totalQueueTime,\r\n totalQueueCount,\r\n manuallyCompletedCount,\r\n };\r\n }\r\n /**\r\n * Removes measurements and aux data for a given correlation id.\r\n *\r\n * @param {string} correlationId\r\n */\r\n discardMeasurements(correlationId) {\r\n this.logger.trace("PerformanceClient: Performance measurements discarded", correlationId);\r\n this.eventsByCorrelationId.delete(correlationId);\r\n this.logger.trace("PerformanceClient: QueueMeasurements discarded", correlationId);\r\n this.queueMeasurements.delete(correlationId);\r\n this.logger.trace("PerformanceClient: Pre-queue times discarded", correlationId);\r\n this.preQueueTimeByCorrelationId.delete(correlationId);\r\n this.logger.trace("PerformanceClient: Event stack discarded", correlationId);\r\n this.eventStack.delete(correlationId);\r\n }\r\n /**\r\n * Registers a callback function to receive performance events.\r\n *\r\n * @param {PerformanceCallbackFunction} callback\r\n * @returns {string}\r\n */\r\n addPerformanceCallback(callback) {\r\n for (const [id, cb] of this.callbacks) {\r\n if (cb.toString() === callback.toString()) {\r\n this.logger.warning(`PerformanceClient: Performance callback is already registered with id: ${id}`);\r\n return id;\r\n }\r\n }\r\n const callbackId = this.generateId();\r\n this.callbacks.set(callbackId, callback);\r\n this.logger.verbose(`PerformanceClient: Performance callback registered with id: ${callbackId}`);\r\n return callbackId;\r\n }\r\n /**\r\n * Removes a callback registered with addPerformanceCallback.\r\n *\r\n * @param {string} callbackId\r\n * @returns {boolean}\r\n */\r\n removePerformanceCallback(callbackId) {\r\n const result = this.callbacks.delete(callbackId);\r\n if (result) {\r\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} removed.`);\r\n }\r\n else {\r\n this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} not removed.`);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Emits events to all registered callbacks.\r\n *\r\n * @param {PerformanceEvent[]} events\r\n * @param {?string} [correlationId]\r\n */\r\n emitEvents(events, correlationId) {\r\n this.logger.verbose("PerformanceClient: Emitting performance events", correlationId);\r\n this.callbacks.forEach((callback, callbackId) => {\r\n this.logger.trace(`PerformanceClient: Emitting event to callback ${callbackId}`, correlationId);\r\n callback.apply(null, [events]);\r\n });\r\n }\r\n /**\r\n * Enforce truncation of integral fields in performance event.\r\n * @param {PerformanceEvent} event performance event to update.\r\n */\r\n truncateIntegralFields(event) {\r\n this.intFields.forEach((key) => {\r\n if (key in event && typeof event[key] === "number") {\r\n event[key] = Math.floor(event[key]);\r\n }\r\n });\r\n }\r\n /**\r\n * Returns event duration in milliseconds\r\n * @param startTimeMs {number}\r\n * @returns {number}\r\n */\r\n getDurationMs(startTimeMs) {\r\n const durationMs = Date.now() - startTimeMs;\r\n // Handle clock skew\r\n return durationMs < 0 ? durationMs : 0;\r\n }\r\n}\n\n\n//# sourceMappingURL=PerformanceClient.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/telemetry/BrowserPerformanceClient.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Returns browser performance measurement module if session flag is enabled. Returns undefined otherwise.\r\n */\r\nfunction getPerfMeasurementModule() {\r\n let sessionStorage;\r\n try {\r\n sessionStorage = window[BrowserCacheLocation.SessionStorage];\r\n const perfEnabled = sessionStorage?.getItem(BROWSER_PERF_ENABLED_KEY);\r\n if (Number(perfEnabled) === 1) {\r\n return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 89162));\r\n }\r\n // Mute errors if it\'s a non-browser environment or cookies are blocked.\r\n }\r\n catch (e) { }\r\n return undefined;\r\n}\r\n/**\r\n * Returns boolean, indicating whether browser supports window.performance.now() function.\r\n */\r\nfunction supportsBrowserPerformanceNow() {\r\n return (typeof window !== "undefined" &&\r\n typeof window.performance !== "undefined" &&\r\n typeof window.performance.now === "function");\r\n}\r\n/**\r\n * Returns event duration in milliseconds using window performance API if available. Returns undefined otherwise.\r\n * @param startTime {DOMHighResTimeStamp | undefined}\r\n * @returns {number | undefined}\r\n */\r\nfunction getPerfDurationMs(startTime) {\r\n if (!startTime || !supportsBrowserPerformanceNow()) {\r\n return undefined;\r\n }\r\n return Math.round(window.performance.now() - startTime);\r\n}\r\nclass BrowserPerformanceClient extends PerformanceClient {\r\n constructor(configuration, intFields, abbreviations) {\r\n super(configuration.auth.clientId, configuration.auth.authority || `${Constants.DEFAULT_AUTHORITY}`, new Logger(configuration.system?.loggerOptions || {}, dist_packageMetadata_name, packageMetadata_version), dist_packageMetadata_name, packageMetadata_version, configuration.telemetry?.application || {\r\n appName: "",\r\n appVersion: "",\r\n }, intFields, abbreviations);\r\n }\r\n generateId() {\r\n return createNewGuid();\r\n }\r\n getPageVisibility() {\r\n return document.visibilityState?.toString() || null;\r\n }\r\n deleteIncompleteSubMeasurements(inProgressEvent) {\r\n void getPerfMeasurementModule()?.then((module) => {\r\n const rootEvent = this.eventsByCorrelationId.get(inProgressEvent.event.correlationId);\r\n const isRootEvent = rootEvent &&\r\n rootEvent.eventId === inProgressEvent.event.eventId;\r\n const incompleteMeasurements = [];\r\n if (isRootEvent && rootEvent?.incompleteSubMeasurements) {\r\n rootEvent.incompleteSubMeasurements.forEach((subMeasurement) => {\r\n incompleteMeasurements.push({ ...subMeasurement });\r\n });\r\n }\r\n // Clean up remaining marks for incomplete sub-measurements\r\n module.BrowserPerformanceMeasurement.flushMeasurements(inProgressEvent.event.correlationId, incompleteMeasurements);\r\n });\r\n }\r\n /**\r\n * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\r\n * Also captures browser page visibilityState.\r\n *\r\n * @param {PerformanceEvents} measureName\r\n * @param {?string} [correlationId]\r\n * @returns {((event?: Partial) => PerformanceEvent| null)}\r\n */\r\n startMeasurement(measureName, correlationId) {\r\n // Capture page visibilityState and then invoke start/end measurement\r\n const startPageVisibility = this.getPageVisibility();\r\n const inProgressEvent = super.startMeasurement(measureName, correlationId);\r\n const startTime = supportsBrowserPerformanceNow()\r\n ? window.performance.now()\r\n : undefined;\r\n const browserMeasurement = getPerfMeasurementModule()?.then((module) => {\r\n return new module.BrowserPerformanceMeasurement(measureName, inProgressEvent.event.correlationId);\r\n });\r\n void browserMeasurement?.then((measurement) => measurement.startMeasurement());\r\n return {\r\n ...inProgressEvent,\r\n end: (event, error) => {\r\n const res = inProgressEvent.end({\r\n ...event,\r\n startPageVisibility,\r\n endPageVisibility: this.getPageVisibility(),\r\n durationMs: getPerfDurationMs(startTime),\r\n }, error);\r\n void browserMeasurement?.then((measurement) => measurement.endMeasurement());\r\n this.deleteIncompleteSubMeasurements(inProgressEvent);\r\n return res;\r\n },\r\n discard: () => {\r\n inProgressEvent.discard();\r\n void browserMeasurement?.then((measurement) => measurement.flushMeasurement());\r\n this.deleteIncompleteSubMeasurements(inProgressEvent);\r\n },\r\n };\r\n }\r\n /**\r\n * Adds pre-queue time to preQueueTimeByCorrelationId map.\r\n * @param {PerformanceEvents} eventName\r\n * @param {?string} correlationId\r\n * @returns\r\n */\r\n setPreQueueTime(eventName, correlationId) {\r\n if (!supportsBrowserPerformanceNow()) {\r\n this.logger.trace(`BrowserPerformanceClient: window performance API not available, unable to set telemetry queue time for ${eventName}`);\r\n return;\r\n }\r\n if (!correlationId) {\r\n this.logger.trace(`BrowserPerformanceClient: correlationId for ${eventName} not provided, unable to set telemetry queue time`);\r\n return;\r\n }\r\n const preQueueEvent = this.preQueueTimeByCorrelationId.get(correlationId);\r\n /**\r\n * Manually complete queue measurement if there is an incomplete pre-queue event.\r\n * Incomplete pre-queue events are instrumentation bugs that should be fixed.\r\n */\r\n if (preQueueEvent) {\r\n this.logger.trace(`BrowserPerformanceClient: Incomplete pre-queue ${preQueueEvent.name} found`, correlationId);\r\n this.addQueueMeasurement(preQueueEvent.name, correlationId, undefined, true);\r\n }\r\n this.preQueueTimeByCorrelationId.set(correlationId, {\r\n name: eventName,\r\n time: window.performance.now(),\r\n });\r\n }\r\n /**\r\n * Calculates and adds queue time measurement for given performance event.\r\n *\r\n * @param {PerformanceEvents} eventName\r\n * @param {?string} correlationId\r\n * @param {?number} queueTime\r\n * @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements\r\n * @returns\r\n */\r\n addQueueMeasurement(eventName, correlationId, queueTime, manuallyCompleted) {\r\n if (!supportsBrowserPerformanceNow()) {\r\n this.logger.trace(`BrowserPerformanceClient: window performance API not available, unable to add queue measurement for ${eventName}`);\r\n return;\r\n }\r\n if (!correlationId) {\r\n this.logger.trace(`BrowserPerformanceClient: correlationId for ${eventName} not provided, unable to add queue measurement`);\r\n return;\r\n }\r\n const preQueueTime = super.getPreQueueTime(eventName, correlationId);\r\n if (!preQueueTime) {\r\n return;\r\n }\r\n const currentTime = window.performance.now();\r\n const resQueueTime = queueTime || super.calculateQueuedTime(preQueueTime, currentTime);\r\n return super.addQueueMeasurement(eventName, correlationId, resQueueTime, manuallyCompleted);\r\n }\r\n}\n\n\n//# sourceMappingURL=BrowserPerformanceClient.mjs.map\n\n// EXTERNAL MODULE: ./node_modules/@azure/msal-browser/dist/telemetry/BrowserPerformanceMeasurement.mjs\nvar BrowserPerformanceMeasurement = __webpack_require__(89162);\n;// ./node_modules/@azure/msal-common/dist/request/AuthenticationHeaderParser.mjs\n/*! @azure/msal-common v14.16.0 2024-11-05 */\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * This is a helper class that parses supported HTTP response authentication headers to extract and return\r\n * header challenge values that can be used outside the basic authorization flows.\r\n */\r\nclass AuthenticationHeaderParser {\r\n constructor(headers) {\r\n this.headers = headers;\r\n }\r\n /**\r\n * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.\r\n * @returns\r\n */\r\n getShrNonce() {\r\n // Attempt to parse nonce from Authentiacation-Info\r\n const authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];\r\n if (authenticationInfo) {\r\n const authenticationInfoChallenges = this.parseChallenges(authenticationInfo);\r\n if (authenticationInfoChallenges.nextnonce) {\r\n return authenticationInfoChallenges.nextnonce;\r\n }\r\n throw createClientConfigurationError(invalidAuthenticationHeader);\r\n }\r\n // Attempt to parse nonce from WWW-Authenticate\r\n const wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];\r\n if (wwwAuthenticate) {\r\n const wwwAuthenticateChallenges = this.parseChallenges(wwwAuthenticate);\r\n if (wwwAuthenticateChallenges.nonce) {\r\n return wwwAuthenticateChallenges.nonce;\r\n }\r\n throw createClientConfigurationError(invalidAuthenticationHeader);\r\n }\r\n // If neither header is present, throw missing headers error\r\n throw createClientConfigurationError(missingNonceAuthenticationHeader);\r\n }\r\n /**\r\n * Parses an HTTP header\'s challenge set into a key/value map.\r\n * @param header\r\n * @returns\r\n */\r\n parseChallenges(header) {\r\n const schemeSeparator = header.indexOf(" ");\r\n const challenges = header.substr(schemeSeparator + 1).split(",");\r\n const challengeMap = {};\r\n challenges.forEach((challenge) => {\r\n const [key, value] = challenge.split("=");\r\n // Remove escaped quotation marks (\', ") from challenge string to keep only the challenge value\r\n challengeMap[key] = unescape(value.replace(/[\'"]+/g, Constants.EMPTY_STRING));\r\n });\r\n return challengeMap;\r\n }\r\n}\n\n\n//# sourceMappingURL=AuthenticationHeaderParser.mjs.map\n\n;// ./node_modules/@azure/msal-browser/dist/index.mjs\n/*! @azure/msal-browser v3.28.1 2025-01-14 */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYxNi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMzS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6ZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy91Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOXJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM1FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3JQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcGNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzE0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDelFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ptQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDM0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3V0aWxzL0NvbnN0YW50cy5tanM/MTA0MSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9lcnJvci9BdXRoRXJyb3JDb2Rlcy5tanM/ZjM2ZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9lcnJvci9BdXRoRXJyb3IubWpzPzY1YTUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMubWpzP2IzZWIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yLm1qcz9jNDNkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3V0aWxzL1N0cmluZ1V0aWxzLm1qcz84MjNhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcz8xMTZhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanM/NWFhMCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC91dGlscy9VcmxVdGlscy5tanM/ZGRiOSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC91cmwvVXJsU3RyaW5nLm1qcz84NDZkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3V0aWxzL0Z1bmN0aW9uV3JhcHBlcnMubWpzPzUwNmIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanM/Njk1NiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanM/NjFjOSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanM/MzUzOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VFdmVudC5tanM/NDQ3YyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvZW5jb2RlL0Jhc2U2NEVuY29kZS5tanM/ZDE1NyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvY3J5cHRvL0Jyb3dzZXJDcnlwdG8ubWpzP2Q4ZmYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMubWpzP2MyODEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcz9hMzI0Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC91dGlscy9Ccm93c2VyVXRpbHMubWpzP2Y2ZWMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvbG9nZ2VyL0xvZ2dlci5tanM/NmQxNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9hdXRob3JpdHkvUHJvdG9jb2xNb2RlLm1qcz81ZjAxIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2F1dGhvcml0eS9BdXRob3JpdHlPcHRpb25zLm1qcz8zYmNmIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2NyeXB0by9JQ3J5cHRvLm1qcz83OGFjIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3BhY2thZ2VNZXRhZGF0YS5tanM/NGE0MyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9hY2NvdW50L0F1dGhUb2tlbi5tanM/NGRmZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC91dGlscy9UaW1lVXRpbHMubWpzPzBmNGYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvY2FjaGUvdXRpbHMvQ2FjaGVIZWxwZXJzLm1qcz9iYzY0Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3JlcXVlc3QvU2NvcGVTZXQubWpzP2RjNmIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYWNjb3VudC9DbGllbnRJbmZvLm1qcz85NzViIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2FjY291bnQvQWNjb3VudEluZm8ubWpzP2VkN2QiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYXV0aG9yaXR5L0F1dGhvcml0eVR5cGUubWpzP2M2ZTMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYWNjb3VudC9Ub2tlbkNsYWltcy5tanM/N2FiOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9jYWNoZS9lbnRpdGllcy9BY2NvdW50RW50aXR5Lm1qcz8zYWVlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2F1dGhvcml0eS9BdXRob3JpdHlNZXRhZGF0YS5tanM/Yjk3NyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9lcnJvci9DYWNoZUVycm9yQ29kZXMubWpzPzc5NTMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvZXJyb3IvQ2FjaGVFcnJvci5tanM/YWVmZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9jYWNoZS9DYWNoZU1hbmFnZXIubWpzPzc3NTUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvY29uZmlnL0NsaWVudENvbmZpZ3VyYXRpb24ubWpzP2E0MjAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvbmV0d29yay9JTmV0d29ya01vZHVsZS5tanM/YTg5NSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvU3R1YlBlcmZvcm1hbmNlQ2xpZW50Lm1qcz8wZWVlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9uYXZpZ2F0aW9uL05hdmlnYXRpb25DbGllbnQubWpzP2E3NWEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvZXJyb3IvTmV0d29ya0Vycm9yLm1qcz9mZWY2Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9uZXR3b3JrL0ZldGNoQ2xpZW50Lm1qcz8zYTAyIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9jb25maWcvQ29uZmlndXJhdGlvbi5tanM/Y2VlZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvcGFja2FnZU1ldGFkYXRhLm1qcz80M2NhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9vcGVyYXRpbmdjb250ZXh0L0Jhc2VPcGVyYXRpbmdDb250ZXh0Lm1qcz81MDE4Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9uYWEvQnJpZGdlU3RhdHVzQ29kZS5tanM/NDhkMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvbmFhL0JyaWRnZVByb3h5Lm1qcz9hN2M2Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9vcGVyYXRpbmdjb250ZXh0L05lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQubWpzPzgxNmMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L29wZXJhdGluZ2NvbnRleHQvU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0Lm1qcz8zOWQ2Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2Vycm9yL0pvc2VIZWFkZXJFcnJvckNvZGVzLm1qcz82OWUwIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2Vycm9yL0pvc2VIZWFkZXJFcnJvci5tanM/MWFiZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9jcnlwdG8vSm9zZUhlYWRlci5tanM/MDYwNiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvZW5jb2RlL0Jhc2U2NERlY29kZS5tanM/MWNlNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvY2FjaGUvRGF0YWJhc2VTdG9yYWdlLm1qcz8wYTY5Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9jYWNoZS9NZW1vcnlTdG9yYWdlLm1qcz8yMjM3Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9jYWNoZS9Bc3luY01lbW9yeVN0b3JhZ2UubWpzPzk4MWIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NyeXB0by9DcnlwdG9PcHMubWpzPzY3YzciLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYXV0aG9yaXR5L09wZW5JZENvbmZpZ1Jlc3BvbnNlLm1qcz9jZTg4Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2F1dGhvcml0eS9DbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2UubWpzPzNjN2EiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYXV0aG9yaXR5L0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlLm1qcz9iYmUzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2F1dGhvcml0eS9SZWdpb25EaXNjb3ZlcnkubWpzP2M4YTIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvYXV0aG9yaXR5L0F1dGhvcml0eS5tanM/NTI1MiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9lcnJvci9JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMubWpzPzA4ODYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvZXJyb3IvSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvci5tanM/MzhlNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC91dGlscy9Qcm90b2NvbFV0aWxzLm1qcz81NDNhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2FjY291bnQvQ2NzQ3JlZGVudGlhbC5tanM/MzY5OSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvY2FjaGUvTG9jYWxTdG9yYWdlLm1qcz9hZDcyIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9jYWNoZS9TZXNzaW9uU3RvcmFnZS5tanM/NzZmZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvdXRpbHMvQnJvd3NlclByb3RvY29sVXRpbHMubWpzP2QxOGYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NhY2hlL0Nvb2tpZVN0b3JhZ2UubWpzPzFmNzYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NhY2hlL0Jyb3dzZXJDYWNoZU1hbmFnZXIubWpzPzc0NjAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NhY2hlL0FjY291bnRNYW5hZ2VyLm1qcz8zMjBkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9ldmVudC9FdmVudFR5cGUubWpzPzY3MDMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2V2ZW50L0V2ZW50SGFuZGxlci5tanM/NmQ2YiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9lcnJvci9TZXJ2ZXJFcnJvci5tanM/MWJmNyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9uZXR3b3JrL1Rocm90dGxpbmdVdGlscy5tanM/MWNkZCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9jb25zdGFudHMvQUFEU2VydmVyUGFyYW1LZXlzLm1qcz9kOTlmIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3JlcXVlc3QvUmVxdWVzdFZhbGlkYXRvci5tanM/MzliOSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9yZXF1ZXN0L1JlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyLm1qcz8yYWExIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2F1dGhvcml0eS9BdXRob3JpdHlGYWN0b3J5Lm1qcz84YjhkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2NsaWVudC9CYXNlQ2xpZW50Lm1qcz8yMTFkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2NyeXB0by9Qb3BUb2tlbkdlbmVyYXRvci5tanM/MzljMCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9jYWNoZS9wZXJzaXN0ZW5jZS9Ub2tlbkNhY2hlQ29udGV4dC5tanM/NjRiOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzPzZjYmMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvdXRpbHMvQ2xpZW50QXNzZXJ0aW9uVXRpbHMubWpzP2ZiMzUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvY2xpZW50L0F1dGhvcml6YXRpb25Db2RlQ2xpZW50Lm1qcz84YzYxIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L3RlbGVtZXRyeS9zZXJ2ZXIvU2VydmVyVGVsZW1ldHJ5TWFuYWdlci5tanM/NWNhNSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW50ZXJhY3Rpb25fY2xpZW50L0Jhc2VJbnRlcmFjdGlvbkNsaWVudC5tanM/OWEzOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvY3J5cHRvL1BrY2VHZW5lcmF0b3IubWpzP2YwNjkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L3JlcXVlc3QvUmVxdWVzdEhlbHBlcnMubWpzP2YxZDgiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2ludGVyYWN0aW9uX2NsaWVudC9TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Lm1qcz80NGQ5Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9lcnJvci9OYXRpdmVBdXRoRXJyb3JDb2Rlcy5tanM/N2Q3NiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvYnJva2VyL25hdGl2ZUJyb2tlci9OYXRpdmVTdGF0dXNDb2Rlcy5tanM/MGMwOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvZXJyb3IvTmF0aXZlQXV0aEVycm9yLm1qcz83MGIzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWNvbW1vbi9kaXN0L2NsaWVudC9SZWZyZXNoVG9rZW5DbGllbnQubWpzP2NkNDEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvY2xpZW50L1NpbGVudEZsb3dDbGllbnQubWpzPzI5NTQiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2ludGVyYWN0aW9uX2NsaWVudC9TaWxlbnRDYWNoZUNsaWVudC5tanM/ZjY4NiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW50ZXJhY3Rpb25fY2xpZW50L05hdGl2ZUludGVyYWN0aW9uQ2xpZW50Lm1qcz9lNmYwIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9icm9rZXIvbmF0aXZlQnJva2VyL05hdGl2ZU1lc3NhZ2VIYW5kbGVyLm1qcz85YTVhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9pbnRlcmFjdGlvbl9oYW5kbGVyL0ludGVyYWN0aW9uSGFuZGxlci5tanM/Y2ExMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvcmVzcG9uc2UvUmVzcG9uc2VIYW5kbGVyLm1qcz84MTYzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9pbnRlcmFjdGlvbl9jbGllbnQvUG9wdXBDbGllbnQubWpzPzAyNWEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2ludGVyYWN0aW9uX2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyLm1qcz9hOWNhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9pbnRlcmFjdGlvbl9jbGllbnQvUmVkaXJlY3RDbGllbnQubWpzPzI5ZTAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2ludGVyYWN0aW9uX2hhbmRsZXIvU2lsZW50SGFuZGxlci5tanM/NWM4OCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW50ZXJhY3Rpb25fY2xpZW50L1NpbGVudElmcmFtZUNsaWVudC5tanM/MzRjZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW50ZXJhY3Rpb25fY2xpZW50L1NpbGVudFJlZnJlc2hDbGllbnQubWpzPzg1MzIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NhY2hlL1Rva2VuQ2FjaGUubWpzPzM2Y2UiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2ludGVyYWN0aW9uX2NsaWVudC9IeWJyaWRTcGFBdXRob3JpemF0aW9uQ29kZUNsaWVudC5tanM/NzMzYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW50ZXJhY3Rpb25fY2xpZW50L1NpbGVudEF1dGhDb2RlQ2xpZW50Lm1qcz8wYWI0Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9jb250cm9sbGVycy9TdGFuZGFyZENvbnRyb2xsZXIubWpzP2Y5MDgiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L25hYS9CcmlkZ2VFcnJvci5tanM/YmZjNiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvbmFhL21hcHBpbmcvTmVzdGVkQXBwQXV0aEFkYXB0ZXIubWpzP2U4ZjkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2Vycm9yL05lc3RlZEFwcEF1dGhFcnJvci5tanM/MzA3MSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvY29udHJvbGxlcnMvTmVzdGVkQXBwQXV0aENvbnRyb2xsZXIubWpzPzMzMTYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NvbnRyb2xsZXJzL0NvbnRyb2xsZXJGYWN0b3J5Lm1qcz81YmIzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9hcHAvUHVibGljQ2xpZW50QXBwbGljYXRpb24ubWpzPzU2NjAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NvbnRyb2xsZXJzL1Vua25vd25PcGVyYXRpbmdDb250ZXh0Q29udHJvbGxlci5tanM/NDlkZCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3Qvb3BlcmF0aW5nY29udGV4dC9Vbmtub3duT3BlcmF0aW5nQ29udGV4dC5tanM/YjRhMiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvYXBwL1B1YmxpY0NsaWVudE5leHQubWpzPzlkZjEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2FwcC9JUHVibGljQ2xpZW50QXBwbGljYXRpb24ubWpzPzI2OTMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NhY2hlL0Jyb3dzZXJTdG9yYWdlLm1qcz85M2ZjIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLWJyb3dzZXIvZGlzdC9ldmVudC9FdmVudE1lc3NhZ2UubWpzPzk1ZTQiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L2NyeXB0by9TaWduZWRIdHRwUmVxdWVzdC5tanM/NWJhNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1jb21tb24vZGlzdC90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VDbGllbnQubWpzP2NiZjYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtYnJvd3Nlci9kaXN0L3RlbGVtZXRyeS9Ccm93c2VyUGVyZm9ybWFuY2VDbGllbnQubWpzP2Q0NTUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtY29tbW9uL2Rpc3QvcmVxdWVzdC9BdXRoZW50aWNhdGlvbkhlYWRlclBhcnNlci5tanM/ODNjOSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1icm93c2VyL2Rpc3QvaW5kZXgubWpzPzdjNGEiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgTElCUkFSWV9OQU1FOiBcIk1TQUwuSlNcIixcclxuICAgIFNLVTogXCJtc2FsLmpzLmNvbW1vblwiLFxyXG4gICAgLy8gUHJlZml4IGZvciBhbGwgbGlicmFyeSBjYWNoZSBlbnRyaWVzXHJcbiAgICBDQUNIRV9QUkVGSVg6IFwibXNhbFwiLFxyXG4gICAgLy8gZGVmYXVsdCBhdXRob3JpdHlcclxuICAgIERFRkFVTFRfQVVUSE9SSVRZOiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9jb21tb24vXCIsXHJcbiAgICBERUZBVUxUX0FVVEhPUklUWV9IT1NUOiBcImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb21cIixcclxuICAgIERFRkFVTFRfQ09NTU9OX1RFTkFOVDogXCJjb21tb25cIixcclxuICAgIC8vIEFERlMgU3RyaW5nXHJcbiAgICBBREZTOiBcImFkZnNcIixcclxuICAgIERTVFM6IFwiZHN0c3YyXCIsXHJcbiAgICAvLyBEZWZhdWx0IEFBRCBJbnN0YW5jZSBEaXNjb3ZlcnkgRW5kcG9pbnRcclxuICAgIEFBRF9JTlNUQU5DRV9ESVNDT1ZFUllfRU5EUFQ6IFwiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi9kaXNjb3ZlcnkvaW5zdGFuY2U/YXBpLXZlcnNpb249MS4xJmF1dGhvcml6YXRpb25fZW5kcG9pbnQ9XCIsXHJcbiAgICAvLyBDSUFNIFVSTFxyXG4gICAgQ0lBTV9BVVRIX1VSTDogXCIuY2lhbWxvZ2luLmNvbVwiLFxyXG4gICAgQUFEX1RFTkFOVF9ET01BSU5fU1VGRklYOiBcIi5vbm1pY3Jvc29mdC5jb21cIixcclxuICAgIC8vIFJlc291cmNlIGRlbGltaXRlciAtIHVzZWQgZm9yIGNlcnRhaW4gY2FjaGUgZW50cmllc1xyXG4gICAgUkVTT1VSQ0VfREVMSU06IFwifFwiLFxyXG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIG5vbi1leGlzdGVudCBhY2NvdW50IGlkcy9vYmplY3RzXHJcbiAgICBOT19BQ0NPVU5UOiBcIk5PX0FDQ09VTlRcIixcclxuICAgIC8vIENsYWltc1xyXG4gICAgQ0xBSU1TOiBcImNsYWltc1wiLFxyXG4gICAgLy8gQ29uc3VtZXIgVVRJRFxyXG4gICAgQ09OU1VNRVJfVVRJRDogXCI5MTg4MDQwZC02YzY3LTRjNWItYjExMi0zNmEzMDRiNjZkYWRcIixcclxuICAgIC8vIERlZmF1bHQgc2NvcGVzXHJcbiAgICBPUEVOSURfU0NPUEU6IFwib3BlbmlkXCIsXHJcbiAgICBQUk9GSUxFX1NDT1BFOiBcInByb2ZpbGVcIixcclxuICAgIE9GRkxJTkVfQUNDRVNTX1NDT1BFOiBcIm9mZmxpbmVfYWNjZXNzXCIsXHJcbiAgICBFTUFJTF9TQ09QRTogXCJlbWFpbFwiLFxyXG4gICAgLy8gRGVmYXVsdCByZXNwb25zZSB0eXBlIGZvciBhdXRob3JpemF0aW9uIGNvZGUgZmxvd1xyXG4gICAgQ09ERV9SRVNQT05TRV9UWVBFOiBcImNvZGVcIixcclxuICAgIENPREVfR1JBTlRfVFlQRTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcclxuICAgIFJUX0dSQU5UX1RZUEU6IFwicmVmcmVzaF90b2tlblwiLFxyXG4gICAgRlJBR01FTlRfUkVTUE9OU0VfTU9ERTogXCJmcmFnbWVudFwiLFxyXG4gICAgUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0Q6IFwiUzI1NlwiLFxyXG4gICAgVVJMX0ZPUk1fQ09OVEVOVF9UWVBFOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04XCIsXHJcbiAgICBBVVRIT1JJWkFUSU9OX1BFTkRJTkc6IFwiYXV0aG9yaXphdGlvbl9wZW5kaW5nXCIsXHJcbiAgICBOT1RfREVGSU5FRDogXCJub3RfZGVmaW5lZFwiLFxyXG4gICAgRU1QVFlfU1RSSU5HOiBcIlwiLFxyXG4gICAgTk9UX0FQUExJQ0FCTEU6IFwiTi9BXCIsXHJcbiAgICBOT1RfQVZBSUxBQkxFOiBcIk5vdCBBdmFpbGFibGVcIixcclxuICAgIEZPUldBUkRfU0xBU0g6IFwiL1wiLFxyXG4gICAgSU1EU19FTkRQT0lOVDogXCJodHRwOi8vMTY5LjI1NC4xNjkuMjU0L21ldGFkYXRhL2luc3RhbmNlL2NvbXB1dGUvbG9jYXRpb25cIixcclxuICAgIElNRFNfVkVSU0lPTjogXCIyMDIwLTA2LTAxXCIsXHJcbiAgICBJTURTX1RJTUVPVVQ6IDIwMDAsXHJcbiAgICBBWlVSRV9SRUdJT05fQVVUT19ESVNDT1ZFUl9GTEFHOiBcIlRyeUF1dG9EZXRlY3RcIixcclxuICAgIFJFR0lPTkFMX0FVVEhfUFVCTElDX0NMT1VEX1NVRkZJWDogXCJsb2dpbi5taWNyb3NvZnQuY29tXCIsXHJcbiAgICBLTk9XTl9QVUJMSUNfQ0xPVURTOiBbXHJcbiAgICAgICAgXCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tXCIsXHJcbiAgICAgICAgXCJsb2dpbi53aW5kb3dzLm5ldFwiLFxyXG4gICAgICAgIFwibG9naW4ubWljcm9zb2Z0LmNvbVwiLFxyXG4gICAgICAgIFwic3RzLndpbmRvd3MubmV0XCIsXHJcbiAgICBdLFxyXG4gICAgVE9LRU5fUkVTUE9OU0VfVFlQRTogXCJ0b2tlblwiLFxyXG4gICAgSURfVE9LRU5fUkVTUE9OU0VfVFlQRTogXCJpZF90b2tlblwiLFxyXG4gICAgU0hSX05PTkNFX1ZBTElESVRZOiAyNDAsXHJcbiAgICBJTlZBTElEX0lOU1RBTkNFOiBcImludmFsaWRfaW5zdGFuY2VcIixcclxufTtcclxuY29uc3QgSHR0cFN0YXR1cyA9IHtcclxuICAgIFNVQ0NFU1M6IDIwMCxcclxuICAgIFNVQ0NFU1NfUkFOR0VfU1RBUlQ6IDIwMCxcclxuICAgIFNVQ0NFU1NfUkFOR0VfRU5EOiAyOTksXHJcbiAgICBSRURJUkVDVDogMzAyLFxyXG4gICAgQ0xJRU5UX0VSUk9SOiA0MDAsXHJcbiAgICBDTElFTlRfRVJST1JfUkFOR0VfU1RBUlQ6IDQwMCxcclxuICAgIEJBRF9SRVFVRVNUOiA0MDAsXHJcbiAgICBVTkFVVEhPUklaRUQ6IDQwMSxcclxuICAgIE5PVF9GT1VORDogNDA0LFxyXG4gICAgUkVRVUVTVF9USU1FT1VUOiA0MDgsXHJcbiAgICBUT09fTUFOWV9SRVFVRVNUUzogNDI5LFxyXG4gICAgQ0xJRU5UX0VSUk9SX1JBTkdFX0VORDogNDk5LFxyXG4gICAgU0VSVkVSX0VSUk9SOiA1MDAsXHJcbiAgICBTRVJWRVJfRVJST1JfUkFOR0VfU1RBUlQ6IDUwMCxcclxuICAgIFNFUlZJQ0VfVU5BVkFJTEFCTEU6IDUwMyxcclxuICAgIEdBVEVXQVlfVElNRU9VVDogNTA0LFxyXG4gICAgU0VSVkVSX0VSUk9SX1JBTkdFX0VORDogNTk5LFxyXG4gICAgTVVMVElfU0lERURfRVJST1I6IDYwMCxcclxufTtcclxuY29uc3QgT0lEQ19ERUZBVUxUX1NDT1BFUyA9IFtcclxuICAgIENvbnN0YW50cy5PUEVOSURfU0NPUEUsXHJcbiAgICBDb25zdGFudHMuUFJPRklMRV9TQ09QRSxcclxuICAgIENvbnN0YW50cy5PRkZMSU5FX0FDQ0VTU19TQ09QRSxcclxuXTtcclxuY29uc3QgT0lEQ19TQ09QRVMgPSBbLi4uT0lEQ19ERUZBVUxUX1NDT1BFUywgQ29uc3RhbnRzLkVNQUlMX1NDT1BFXTtcclxuLyoqXHJcbiAqIFJlcXVlc3QgaGVhZGVyIG5hbWVzXHJcbiAqL1xyXG5jb25zdCBIZWFkZXJOYW1lcyA9IHtcclxuICAgIENPTlRFTlRfVFlQRTogXCJDb250ZW50LVR5cGVcIixcclxuICAgIENPTlRFTlRfTEVOR1RIOiBcIkNvbnRlbnQtTGVuZ3RoXCIsXHJcbiAgICBSRVRSWV9BRlRFUjogXCJSZXRyeS1BZnRlclwiLFxyXG4gICAgQ0NTX0hFQURFUjogXCJYLUFuY2hvck1haWxib3hcIixcclxuICAgIFdXV0F1dGhlbnRpY2F0ZTogXCJXV1ctQXV0aGVudGljYXRlXCIsXHJcbiAgICBBdXRoZW50aWNhdGlvbkluZm86IFwiQXV0aGVudGljYXRpb24tSW5mb1wiLFxyXG4gICAgWF9NU19SRVFVRVNUX0lEOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxyXG4gICAgWF9NU19IVFRQX1ZFUlNJT046IFwieC1tcy1odHRwdmVyXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBQZXJzaXN0ZW50IGNhY2hlIGtleXMgTVNBTCB3aGljaCBzdGF5IHdoaWxlIHVzZXIgaXMgbG9nZ2VkIGluLlxyXG4gKi9cclxuY29uc3QgUGVyc2lzdGVudENhY2hlS2V5cyA9IHtcclxuICAgIElEX1RPS0VOOiBcImlkdG9rZW5cIixcclxuICAgIENMSUVOVF9JTkZPOiBcImNsaWVudC5pbmZvXCIsXHJcbiAgICBBREFMX0lEX1RPS0VOOiBcImFkYWwuaWR0b2tlblwiLFxyXG4gICAgRVJST1I6IFwiZXJyb3JcIixcclxuICAgIEVSUk9SX0RFU0M6IFwiZXJyb3IuZGVzY3JpcHRpb25cIixcclxuICAgIEFDVElWRV9BQ0NPVU5UOiBcImFjdGl2ZS1hY2NvdW50XCIsXHJcbiAgICBBQ1RJVkVfQUNDT1VOVF9GSUxURVJTOiBcImFjdGl2ZS1hY2NvdW50LWZpbHRlcnNcIiwgLy8gbmV3IGNhY2hlIGVudHJ5IGZvciBhY3RpdmVfYWNjb3VudCBmb3IgYSBtb3JlIHJvYnVzdCB2ZXJzaW9uIGZvciBicm93c2VyXHJcbn07XHJcbi8qKlxyXG4gKiBTdHJpbmcgY29uc3RhbnRzIHJlbGF0ZWQgdG8gQUFEIEF1dGhvcml0eVxyXG4gKi9cclxuY29uc3QgQUFEQXV0aG9yaXR5Q29uc3RhbnRzID0ge1xyXG4gICAgQ09NTU9OOiBcImNvbW1vblwiLFxyXG4gICAgT1JHQU5JWkFUSU9OUzogXCJvcmdhbml6YXRpb25zXCIsXHJcbiAgICBDT05TVU1FUlM6IFwiY29uc3VtZXJzXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBDbGFpbXMgcmVxdWVzdCBrZXlzXHJcbiAqL1xyXG5jb25zdCBDbGFpbXNSZXF1ZXN0S2V5cyA9IHtcclxuICAgIEFDQ0VTU19UT0tFTjogXCJhY2Nlc3NfdG9rZW5cIixcclxuICAgIFhNU19DQzogXCJ4bXNfY2NcIixcclxufTtcclxuLyoqXHJcbiAqIHdlIGNvbnNpZGVyZWQgbWFraW5nIHRoaXMgXCJlbnVtXCIgaW4gdGhlIHJlcXVlc3QgaW5zdGVhZCBvZiBzdHJpbmcsIGhvd2V2ZXIgaXQgbG9va3MgbGlrZSB0aGUgYWxsb3dlZCBsaXN0IG9mXHJcbiAqIHByb21wdCB2YWx1ZXMga2VwdCBjaGFuZ2luZyBvdmVyIHBhc3QgY291cGxlIG9mIHllYXJzLiBUaGVyZSBhcmUgc29tZSB1bmRvY3VtZW50ZWQgcHJvbXB0IHZhbHVlcyBmb3Igc29tZVxyXG4gKiBpbnRlcm5hbCBwYXJ0bmVycyB0b28sIGhlbmNlIHRoZSBjaG9pY2Ugb2YgZ2VuZXJpYyBcInN0cmluZ1wiIHR5cGUgaW5zdGVhZCBvZiB0aGUgXCJlbnVtXCJcclxuICovXHJcbmNvbnN0IFByb21wdFZhbHVlID0ge1xyXG4gICAgTE9HSU46IFwibG9naW5cIixcclxuICAgIFNFTEVDVF9BQ0NPVU5UOiBcInNlbGVjdF9hY2NvdW50XCIsXHJcbiAgICBDT05TRU5UOiBcImNvbnNlbnRcIixcclxuICAgIE5PTkU6IFwibm9uZVwiLFxyXG4gICAgQ1JFQVRFOiBcImNyZWF0ZVwiLFxyXG4gICAgTk9fU0VTU0lPTjogXCJub19zZXNzaW9uXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBhbGxvd2VkIHZhbHVlcyBmb3IgY29kZVZlcmlmaWVyXHJcbiAqL1xyXG5jb25zdCBDb2RlQ2hhbGxlbmdlTWV0aG9kVmFsdWVzID0ge1xyXG4gICAgUExBSU46IFwicGxhaW5cIixcclxuICAgIFMyNTY6IFwiUzI1NlwiLFxyXG59O1xyXG4vKipcclxuICogYWxsb3dlZCB2YWx1ZXMgZm9yIHNlcnZlciByZXNwb25zZSB0eXBlXHJcbiAqL1xyXG5jb25zdCBTZXJ2ZXJSZXNwb25zZVR5cGUgPSB7XHJcbiAgICBRVUVSWTogXCJxdWVyeVwiLFxyXG4gICAgRlJBR01FTlQ6IFwiZnJhZ21lbnRcIixcclxufTtcclxuLyoqXHJcbiAqIGFsbG93ZWQgdmFsdWVzIGZvciByZXNwb25zZV9tb2RlXHJcbiAqL1xyXG5jb25zdCBSZXNwb25zZU1vZGUgPSB7XHJcbiAgICAuLi5TZXJ2ZXJSZXNwb25zZVR5cGUsXHJcbiAgICBGT1JNX1BPU1Q6IFwiZm9ybV9wb3N0XCIsXHJcbn07XHJcbi8qKlxyXG4gKiBhbGxvd2VkIGdyYW50X3R5cGVcclxuICovXHJcbmNvbnN0IEdyYW50VHlwZSA9IHtcclxuICAgIElNUExJQ0lUX0dSQU5UOiBcImltcGxpY2l0XCIsXHJcbiAgICBBVVRIT1JJWkFUSU9OX0NPREVfR1JBTlQ6IFwiYXV0aG9yaXphdGlvbl9jb2RlXCIsXHJcbiAgICBDTElFTlRfQ1JFREVOVElBTFNfR1JBTlQ6IFwiY2xpZW50X2NyZWRlbnRpYWxzXCIsXHJcbiAgICBSRVNPVVJDRV9PV05FUl9QQVNTV09SRF9HUkFOVDogXCJwYXNzd29yZFwiLFxyXG4gICAgUkVGUkVTSF9UT0tFTl9HUkFOVDogXCJyZWZyZXNoX3Rva2VuXCIsXHJcbiAgICBERVZJQ0VfQ09ERV9HUkFOVDogXCJkZXZpY2VfY29kZVwiLFxyXG4gICAgSldUX0JFQVJFUjogXCJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBBY2NvdW50IHR5cGVzIGluIENhY2hlXHJcbiAqL1xyXG5jb25zdCBDYWNoZUFjY291bnRUeXBlID0ge1xyXG4gICAgTVNTVFNfQUNDT1VOVF9UWVBFOiBcIk1TU1RTXCIsXHJcbiAgICBBREZTX0FDQ09VTlRfVFlQRTogXCJBREZTXCIsXHJcbiAgICBNU0FWMV9BQ0NPVU5UX1RZUEU6IFwiTVNBXCIsXHJcbiAgICBHRU5FUklDX0FDQ09VTlRfVFlQRTogXCJHZW5lcmljXCIsIC8vIE5UTE0sIEtlcmJlcm9zLCBGQkEsIEJhc2ljIGV0Y1xyXG59O1xyXG4vKipcclxuICogU2VwYXJhdG9ycyB1c2VkIGluIGNhY2hlXHJcbiAqL1xyXG5jb25zdCBTZXBhcmF0b3JzID0ge1xyXG4gICAgQ0FDSEVfS0VZX1NFUEFSQVRPUjogXCItXCIsXHJcbiAgICBDTElFTlRfSU5GT19TRVBBUkFUT1I6IFwiLlwiLFxyXG59O1xyXG4vKipcclxuICogQ3JlZGVudGlhbCBUeXBlIHN0b3JlZCBpbiB0aGUgY2FjaGVcclxuICovXHJcbmNvbnN0IENyZWRlbnRpYWxUeXBlID0ge1xyXG4gICAgSURfVE9LRU46IFwiSWRUb2tlblwiLFxyXG4gICAgQUNDRVNTX1RPS0VOOiBcIkFjY2Vzc1Rva2VuXCIsXHJcbiAgICBBQ0NFU1NfVE9LRU5fV0lUSF9BVVRIX1NDSEVNRTogXCJBY2Nlc3NUb2tlbl9XaXRoX0F1dGhTY2hlbWVcIixcclxuICAgIFJFRlJFU0hfVE9LRU46IFwiUmVmcmVzaFRva2VuXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBDb21iaW5lIGFsbCBjYWNoZSB0eXBlc1xyXG4gKi9cclxuY29uc3QgQ2FjaGVUeXBlID0ge1xyXG4gICAgQURGUzogMTAwMSxcclxuICAgIE1TQTogMTAwMixcclxuICAgIE1TU1RTOiAxMDAzLFxyXG4gICAgR0VORVJJQzogMTAwNCxcclxuICAgIEFDQ0VTU19UT0tFTjogMjAwMSxcclxuICAgIFJFRlJFU0hfVE9LRU46IDIwMDIsXHJcbiAgICBJRF9UT0tFTjogMjAwMyxcclxuICAgIEFQUF9NRVRBREFUQTogMzAwMSxcclxuICAgIFVOREVGSU5FRDogOTk5OSxcclxufTtcclxuLyoqXHJcbiAqIE1vcmUgQ2FjaGUgcmVsYXRlZCBjb25zdGFudHNcclxuICovXHJcbmNvbnN0IEFQUF9NRVRBREFUQSA9IFwiYXBwbWV0YWRhdGFcIjtcclxuY29uc3QgQ0xJRU5UX0lORk8gPSBcImNsaWVudF9pbmZvXCI7XHJcbmNvbnN0IFRIRV9GQU1JTFlfSUQgPSBcIjFcIjtcclxuY29uc3QgQVVUSE9SSVRZX01FVEFEQVRBX0NPTlNUQU5UUyA9IHtcclxuICAgIENBQ0hFX0tFWTogXCJhdXRob3JpdHktbWV0YWRhdGFcIixcclxuICAgIFJFRlJFU0hfVElNRV9TRUNPTkRTOiAzNjAwICogMjQsIC8vIDI0IEhvdXJzXHJcbn07XHJcbmNvbnN0IEF1dGhvcml0eU1ldGFkYXRhU291cmNlID0ge1xyXG4gICAgQ09ORklHOiBcImNvbmZpZ1wiLFxyXG4gICAgQ0FDSEU6IFwiY2FjaGVcIixcclxuICAgIE5FVFdPUks6IFwibmV0d29ya1wiLFxyXG4gICAgSEFSRENPREVEX1ZBTFVFUzogXCJoYXJkY29kZWRfdmFsdWVzXCIsXHJcbn07XHJcbmNvbnN0IFNFUlZFUl9URUxFTV9DT05TVEFOVFMgPSB7XHJcbiAgICBTQ0hFTUFfVkVSU0lPTjogNSxcclxuICAgIE1BWF9DVVJfSEVBREVSX0JZVEVTOiA4MCxcclxuICAgIE1BWF9MQVNUX0hFQURFUl9CWVRFUzogMzMwLFxyXG4gICAgTUFYX0NBQ0hFRF9FUlJPUlM6IDUwLFxyXG4gICAgQ0FDSEVfS0VZOiBcInNlcnZlci10ZWxlbWV0cnlcIixcclxuICAgIENBVEVHT1JZX1NFUEFSQVRPUjogXCJ8XCIsXHJcbiAgICBWQUxVRV9TRVBBUkFUT1I6IFwiLFwiLFxyXG4gICAgT1ZFUkZMT1dfVFJVRTogXCIxXCIsXHJcbiAgICBPVkVSRkxPV19GQUxTRTogXCIwXCIsXHJcbiAgICBVTktOT1dOX0VSUk9SOiBcInVua25vd25fZXJyb3JcIixcclxufTtcclxuLyoqXHJcbiAqIFR5cGUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcclxuICovXHJcbmNvbnN0IEF1dGhlbnRpY2F0aW9uU2NoZW1lID0ge1xyXG4gICAgQkVBUkVSOiBcIkJlYXJlclwiLFxyXG4gICAgUE9QOiBcInBvcFwiLFxyXG4gICAgU1NIOiBcInNzaC1jZXJ0XCIsXHJcbn07XHJcbi8qKlxyXG4gKiBDb25zdGFudHMgcmVsYXRlZCB0byB0aHJvdHRsaW5nXHJcbiAqL1xyXG5jb25zdCBUaHJvdHRsaW5nQ29uc3RhbnRzID0ge1xyXG4gICAgLy8gRGVmYXVsdCB0aW1lIHRvIHRocm90dGxlIFJlcXVlc3RUaHVtYnByaW50IGluIHNlY29uZHNcclxuICAgIERFRkFVTFRfVEhST1RUTEVfVElNRV9TRUNPTkRTOiA2MCxcclxuICAgIC8vIERlZmF1bHQgbWF4aW11bSB0aW1lIHRvIHRocm90dGxlIGluIHNlY29uZHMsIG92ZXJyaWRlcyB3aGF0IHRoZSBzZXJ2ZXIgc2VuZHMgYmFja1xyXG4gICAgREVGQVVMVF9NQVhfVEhST1RUTEVfVElNRV9TRUNPTkRTOiAzNjAwLFxyXG4gICAgLy8gUHJlZml4IGZvciBzdG9yaW5nIHRocm90dGxpbmcgZW50cmllc1xyXG4gICAgVEhST1RUTElOR19QUkVGSVg6IFwidGhyb3R0bGluZ1wiLFxyXG4gICAgLy8gVmFsdWUgYXNzaWduZWQgdG8gdGhlIHgtbXMtbGliLWNhcGFiaWxpdHkgaGVhZGVyIHRvIGluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgdGhlIGxpYnJhcnkgc3VwcG9ydHMgdGhyb3R0bGluZ1xyXG4gICAgWF9NU19MSUJfQ0FQQUJJTElUWV9WQUxVRTogXCJyZXRyeS1hZnRlciwgaDQyOVwiLFxyXG59O1xyXG5jb25zdCBFcnJvcnMgPSB7XHJcbiAgICBJTlZBTElEX0dSQU5UX0VSUk9SOiBcImludmFsaWRfZ3JhbnRcIixcclxuICAgIENMSUVOVF9NSVNNQVRDSF9FUlJPUjogXCJjbGllbnRfbWlzbWF0Y2hcIixcclxufTtcclxuLyoqXHJcbiAqIFBhc3N3b3JkIGdyYW50IHBhcmFtZXRlcnNcclxuICovXHJcbmNvbnN0IFBhc3N3b3JkR3JhbnRDb25zdGFudHMgPSB7XHJcbiAgICB1c2VybmFtZTogXCJ1c2VybmFtZVwiLFxyXG4gICAgcGFzc3dvcmQ6IFwicGFzc3dvcmRcIixcclxufTtcclxuLyoqXHJcbiAqIFJlc3BvbnNlIGNvZGVzXHJcbiAqL1xyXG5jb25zdCBSZXNwb25zZUNvZGVzID0ge1xyXG4gICAgaHR0cFN1Y2Nlc3M6IDIwMCxcclxuICAgIGh0dHBCYWRSZXF1ZXN0OiA0MDAsXHJcbn07XHJcbi8qKlxyXG4gKiBSZWdpb24gRGlzY292ZXJ5IFNvdXJjZXNcclxuICovXHJcbmNvbnN0IFJlZ2lvbkRpc2NvdmVyeVNvdXJjZXMgPSB7XHJcbiAgICBGQUlMRURfQVVUT19ERVRFQ1RJT046IFwiMVwiLFxyXG4gICAgSU5URVJOQUxfQ0FDSEU6IFwiMlwiLFxyXG4gICAgRU5WSVJPTk1FTlRfVkFSSUFCTEU6IFwiM1wiLFxyXG4gICAgSU1EUzogXCI0XCIsXHJcbn07XHJcbi8qKlxyXG4gKiBSZWdpb24gRGlzY292ZXJ5IE91dGNvbWVzXHJcbiAqL1xyXG5jb25zdCBSZWdpb25EaXNjb3ZlcnlPdXRjb21lcyA9IHtcclxuICAgIENPTkZJR1VSRURfTUFUQ0hFU19ERVRFQ1RFRDogXCIxXCIsXHJcbiAgICBDT05GSUdVUkVEX05PX0FVVE9fREVURUNUSU9OOiBcIjJcIixcclxuICAgIENPTkZJR1VSRURfTk9UX0RFVEVDVEVEOiBcIjNcIixcclxuICAgIEFVVE9fREVURUNUSU9OX1JFUVVFU1RFRF9TVUNDRVNTRlVMOiBcIjRcIixcclxuICAgIEFVVE9fREVURUNUSU9OX1JFUVVFU1RFRF9GQUlMRUQ6IFwiNVwiLFxyXG59O1xyXG4vKipcclxuICogU3BlY2lmaWVzIHRoZSByZWFzb24gZm9yIGZldGNoaW5nIHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgaWRlbnRpdHkgcHJvdmlkZXJcclxuICovXHJcbmNvbnN0IENhY2hlT3V0Y29tZSA9IHtcclxuICAgIC8vIFdoZW4gYSB0b2tlbiBpcyBmb3VuZCBpbiB0aGUgY2FjaGUgb3IgdGhlIGNhY2hlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBoaXQgd2hlbiBtYWtpbmcgdGhlIHJlcXVlc3RcclxuICAgIE5PVF9BUFBMSUNBQkxFOiBcIjBcIixcclxuICAgIC8vIFdoZW4gdGhlIHRva2VuIHJlcXVlc3QgZ29lcyB0byB0aGUgaWRlbnRpdHkgcHJvdmlkZXIgYmVjYXVzZSBmb3JjZV9yZWZyZXNoIHdhcyBzZXQgdG8gdHJ1ZS4gQWxzbyBvY2N1cnMgaWYgY2xhaW1zIHdlcmUgcmVxdWVzdGVkXHJcbiAgICBGT1JDRV9SRUZSRVNIX09SX0NMQUlNUzogXCIxXCIsXHJcbiAgICAvLyBXaGVuIHRoZSB0b2tlbiByZXF1ZXN0IGdvZXMgdG8gdGhlIGlkZW50aXR5IHByb3ZpZGVyIGJlY2F1c2Ugbm8gY2FjaGVkIGFjY2VzcyB0b2tlbiBleGlzdHNcclxuICAgIE5PX0NBQ0hFRF9BQ0NFU1NfVE9LRU46IFwiMlwiLFxyXG4gICAgLy8gV2hlbiB0aGUgdG9rZW4gcmVxdWVzdCBnb2VzIHRvIHRoZSBpZGVudGl0eSBwcm92aWRlciBiZWNhdXNlIGNhY2hlZCBhY2Nlc3MgdG9rZW4gZXhwaXJlZFxyXG4gICAgQ0FDSEVEX0FDQ0VTU19UT0tFTl9FWFBJUkVEOiBcIjNcIixcclxuICAgIC8vIFdoZW4gdGhlIHRva2VuIHJlcXVlc3QgZ29lcyB0byB0aGUgaWRlbnRpdHkgcHJvdmlkZXIgYmVjYXVzZSByZWZyZXNoX2luIHdhcyB1c2VkIGFuZCB0aGUgZXhpc3RpbmcgdG9rZW4gbmVlZHMgdG8gYmUgcmVmcmVzaGVkXHJcbiAgICBQUk9BQ1RJVkVMWV9SRUZSRVNIRUQ6IFwiNFwiLFxyXG59O1xyXG5jb25zdCBKc29uV2ViVG9rZW5UeXBlcyA9IHtcclxuICAgIEp3dDogXCJKV1RcIixcclxuICAgIEp3azogXCJKV0tcIixcclxuICAgIFBvcDogXCJwb3BcIixcclxufTtcclxuY29uc3QgT05FX0RBWV9JTl9NUyA9IDg2NDAwMDAwO1xyXG4vLyBUb2tlbiByZW5ld2FsIG9mZnNldCBkZWZhdWx0IGluIHNlY29uZHNcclxuY29uc3QgREVGQVVMVF9UT0tFTl9SRU5FV0FMX09GRlNFVF9TRUMgPSAzMDA7XG5cbmV4cG9ydCB7IEFBREF1dGhvcml0eUNvbnN0YW50cywgQVBQX01FVEFEQVRBLCBBVVRIT1JJVFlfTUVUQURBVEFfQ09OU1RBTlRTLCBBdXRoZW50aWNhdGlvblNjaGVtZSwgQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UsIENMSUVOVF9JTkZPLCBDYWNoZUFjY291bnRUeXBlLCBDYWNoZU91dGNvbWUsIENhY2hlVHlwZSwgQ2xhaW1zUmVxdWVzdEtleXMsIENvZGVDaGFsbGVuZ2VNZXRob2RWYWx1ZXMsIENvbnN0YW50cywgQ3JlZGVudGlhbFR5cGUsIERFRkFVTFRfVE9LRU5fUkVORVdBTF9PRkZTRVRfU0VDLCBFcnJvcnMsIEdyYW50VHlwZSwgSGVhZGVyTmFtZXMsIEh0dHBTdGF0dXMsIEpzb25XZWJUb2tlblR5cGVzLCBPSURDX0RFRkFVTFRfU0NPUEVTLCBPSURDX1NDT1BFUywgT05FX0RBWV9JTl9NUywgUGFzc3dvcmRHcmFudENvbnN0YW50cywgUGVyc2lzdGVudENhY2hlS2V5cywgUHJvbXB0VmFsdWUsIFJlZ2lvbkRpc2NvdmVyeU91dGNvbWVzLCBSZWdpb25EaXNjb3ZlcnlTb3VyY2VzLCBSZXNwb25zZUNvZGVzLCBSZXNwb25zZU1vZGUsIFNFUlZFUl9URUxFTV9DT05TVEFOVFMsIFNlcGFyYXRvcnMsIFNlcnZlclJlc3BvbnNlVHlwZSwgVEhFX0ZBTUlMWV9JRCwgVGhyb3R0bGluZ0NvbnN0YW50cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uc3RhbnRzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdXRoRXJyb3JNZXNzYWdlIGNsYXNzIGNvbnRhaW5pbmcgc3RyaW5nIGNvbnN0YW50cyB1c2VkIGJ5IGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cclxuICovXHJcbmNvbnN0IHVuZXhwZWN0ZWRFcnJvciA9IFwidW5leHBlY3RlZF9lcnJvclwiO1xyXG5jb25zdCBwb3N0UmVxdWVzdEZhaWxlZCA9IFwicG9zdF9yZXF1ZXN0X2ZhaWxlZFwiO1xuXG5leHBvcnQgeyBwb3N0UmVxdWVzdEZhaWxlZCwgdW5leHBlY3RlZEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoRXJyb3JDb2Rlcy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgdW5leHBlY3RlZEVycm9yLCBwb3N0UmVxdWVzdEZhaWxlZCB9IGZyb20gJy4vQXV0aEVycm9yQ29kZXMubWpzJztcbmltcG9ydCAqIGFzIEF1dGhFcnJvckNvZGVzIGZyb20gJy4vQXV0aEVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IEF1dGhFcnJvckNvZGVzIH07XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBBdXRoRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIFt1bmV4cGVjdGVkRXJyb3JdOiBcIlVuZXhwZWN0ZWQgZXJyb3IgaW4gYXV0aGVudGljYXRpb24uXCIsXHJcbiAgICBbcG9zdFJlcXVlc3RGYWlsZWRdOiBcIlBvc3QgcmVxdWVzdCBmYWlsZWQgZnJvbSB0aGUgbmV0d29yaywgY291bGQgYmUgYSA0eHgvNXh4IG9yIGEgbmV0d29yayB1bmF2YWlsYWJpbGl0eS4gUGxlYXNlIGNoZWNrIHRoZSBleGFjdCBlcnJvciBjb2RlIGZvciBkZXRhaWxzLlwiLFxyXG59O1xyXG4vKipcclxuICogQXV0aEVycm9yTWVzc2FnZSBjbGFzcyBjb250YWluaW5nIHN0cmluZyBjb25zdGFudHMgdXNlZCBieSBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXHJcbiAqIEBkZXByZWNhdGVkIFVzZSBBdXRoRXJyb3JDb2RlcyBpbnN0ZWFkXHJcbiAqL1xyXG5jb25zdCBBdXRoRXJyb3JNZXNzYWdlID0ge1xyXG4gICAgdW5leHBlY3RlZEVycm9yOiB7XHJcbiAgICAgICAgY29kZTogdW5leHBlY3RlZEVycm9yLFxyXG4gICAgICAgIGRlc2M6IEF1dGhFcnJvck1lc3NhZ2VzW3VuZXhwZWN0ZWRFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgcG9zdFJlcXVlc3RGYWlsZWQ6IHtcclxuICAgICAgICBjb2RlOiBwb3N0UmVxdWVzdEZhaWxlZCxcclxuICAgICAgICBkZXNjOiBBdXRoRXJyb3JNZXNzYWdlc1twb3N0UmVxdWVzdEZhaWxlZF0sXHJcbiAgICB9LFxyXG59O1xyXG4vKipcclxuICogR2VuZXJhbCBlcnJvciBjbGFzcyB0aHJvd24gYnkgdGhlIE1TQUwuanMgbGlicmFyeS5cclxuICovXHJcbmNsYXNzIEF1dGhFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlLCBzdWJlcnJvcikge1xyXG4gICAgICAgIGNvbnN0IGVycm9yU3RyaW5nID0gZXJyb3JNZXNzYWdlXHJcbiAgICAgICAgICAgID8gYCR7ZXJyb3JDb2RlfTogJHtlcnJvck1lc3NhZ2V9YFxyXG4gICAgICAgICAgICA6IGVycm9yQ29kZTtcclxuICAgICAgICBzdXBlcihlcnJvclN0cmluZyk7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEF1dGhFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIHRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICB0aGlzLnN1YkVycm9yID0gc3ViZXJyb3IgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkF1dGhFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgc2V0Q29ycmVsYXRpb25JZChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvbklkID0gY29ycmVsYXRpb25JZDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVhdGVBdXRoRXJyb3IoY29kZSwgYWRkaXRpb25hbE1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBuZXcgQXV0aEVycm9yKGNvZGUsIGFkZGl0aW9uYWxNZXNzYWdlXHJcbiAgICAgICAgPyBgJHtBdXRoRXJyb3JNZXNzYWdlc1tjb2RlXX0gJHthZGRpdGlvbmFsTWVzc2FnZX1gXHJcbiAgICAgICAgOiBBdXRoRXJyb3JNZXNzYWdlc1tjb2RlXSk7XHJcbn1cblxuZXhwb3J0IHsgQXV0aEVycm9yLCBBdXRoRXJyb3JNZXNzYWdlLCBBdXRoRXJyb3JNZXNzYWdlcywgY3JlYXRlQXV0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoRXJyb3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgcmVkaXJlY3RVcmlFbXB0eSA9IFwicmVkaXJlY3RfdXJpX2VtcHR5XCI7XHJcbmNvbnN0IGNsYWltc1JlcXVlc3RQYXJzaW5nRXJyb3IgPSBcImNsYWltc19yZXF1ZXN0X3BhcnNpbmdfZXJyb3JcIjtcclxuY29uc3QgYXV0aG9yaXR5VXJpSW5zZWN1cmUgPSBcImF1dGhvcml0eV91cmlfaW5zZWN1cmVcIjtcclxuY29uc3QgdXJsUGFyc2VFcnJvciA9IFwidXJsX3BhcnNlX2Vycm9yXCI7XHJcbmNvbnN0IHVybEVtcHR5RXJyb3IgPSBcImVtcHR5X3VybF9lcnJvclwiO1xyXG5jb25zdCBlbXB0eUlucHV0U2NvcGVzRXJyb3IgPSBcImVtcHR5X2lucHV0X3Njb3Blc19lcnJvclwiO1xyXG5jb25zdCBpbnZhbGlkUHJvbXB0VmFsdWUgPSBcImludmFsaWRfcHJvbXB0X3ZhbHVlXCI7XHJcbmNvbnN0IGludmFsaWRDbGFpbXMgPSBcImludmFsaWRfY2xhaW1zXCI7XHJcbmNvbnN0IHRva2VuUmVxdWVzdEVtcHR5ID0gXCJ0b2tlbl9yZXF1ZXN0X2VtcHR5XCI7XHJcbmNvbnN0IGxvZ291dFJlcXVlc3RFbXB0eSA9IFwibG9nb3V0X3JlcXVlc3RfZW1wdHlcIjtcclxuY29uc3QgaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2QgPSBcImludmFsaWRfY29kZV9jaGFsbGVuZ2VfbWV0aG9kXCI7XHJcbmNvbnN0IHBrY2VQYXJhbXNNaXNzaW5nID0gXCJwa2NlX3BhcmFtc19taXNzaW5nXCI7XHJcbmNvbnN0IGludmFsaWRDbG91ZERpc2NvdmVyeU1ldGFkYXRhID0gXCJpbnZhbGlkX2Nsb3VkX2Rpc2NvdmVyeV9tZXRhZGF0YVwiO1xyXG5jb25zdCBpbnZhbGlkQXV0aG9yaXR5TWV0YWRhdGEgPSBcImludmFsaWRfYXV0aG9yaXR5X21ldGFkYXRhXCI7XHJcbmNvbnN0IHVudHJ1c3RlZEF1dGhvcml0eSA9IFwidW50cnVzdGVkX2F1dGhvcml0eVwiO1xyXG5jb25zdCBtaXNzaW5nU3NoSndrID0gXCJtaXNzaW5nX3NzaF9qd2tcIjtcclxuY29uc3QgbWlzc2luZ1NzaEtpZCA9IFwibWlzc2luZ19zc2hfa2lkXCI7XHJcbmNvbnN0IG1pc3NpbmdOb25jZUF1dGhlbnRpY2F0aW9uSGVhZGVyID0gXCJtaXNzaW5nX25vbmNlX2F1dGhlbnRpY2F0aW9uX2hlYWRlclwiO1xyXG5jb25zdCBpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXIgPSBcImludmFsaWRfYXV0aGVudGljYXRpb25faGVhZGVyXCI7XHJcbmNvbnN0IGNhbm5vdFNldE9JRENPcHRpb25zID0gXCJjYW5ub3Rfc2V0X09JRENPcHRpb25zXCI7XHJcbmNvbnN0IGNhbm5vdEFsbG93TmF0aXZlQnJva2VyID0gXCJjYW5ub3RfYWxsb3dfbmF0aXZlX2Jyb2tlclwiO1xyXG5jb25zdCBhdXRob3JpdHlNaXNtYXRjaCA9IFwiYXV0aG9yaXR5X21pc21hdGNoXCI7XG5cbmV4cG9ydCB7IGF1dGhvcml0eU1pc21hdGNoLCBhdXRob3JpdHlVcmlJbnNlY3VyZSwgY2Fubm90QWxsb3dOYXRpdmVCcm9rZXIsIGNhbm5vdFNldE9JRENPcHRpb25zLCBjbGFpbXNSZXF1ZXN0UGFyc2luZ0Vycm9yLCBlbXB0eUlucHV0U2NvcGVzRXJyb3IsIGludmFsaWRBdXRoZW50aWNhdGlvbkhlYWRlciwgaW52YWxpZEF1dGhvcml0eU1ldGFkYXRhLCBpbnZhbGlkQ2xhaW1zLCBpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSwgaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2QsIGludmFsaWRQcm9tcHRWYWx1ZSwgbG9nb3V0UmVxdWVzdEVtcHR5LCBtaXNzaW5nTm9uY2VBdXRoZW50aWNhdGlvbkhlYWRlciwgbWlzc2luZ1NzaEp3aywgbWlzc2luZ1NzaEtpZCwgcGtjZVBhcmFtc01pc3NpbmcsIHJlZGlyZWN0VXJpRW1wdHksIHRva2VuUmVxdWVzdEVtcHR5LCB1bnRydXN0ZWRBdXRob3JpdHksIHVybEVtcHR5RXJyb3IsIHVybFBhcnNlRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnLi9BdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IHJlZGlyZWN0VXJpRW1wdHksIGNsYWltc1JlcXVlc3RQYXJzaW5nRXJyb3IsIGF1dGhvcml0eVVyaUluc2VjdXJlLCB1cmxQYXJzZUVycm9yLCB1cmxFbXB0eUVycm9yLCBlbXB0eUlucHV0U2NvcGVzRXJyb3IsIGludmFsaWRQcm9tcHRWYWx1ZSwgaW52YWxpZENsYWltcywgdG9rZW5SZXF1ZXN0RW1wdHksIGxvZ291dFJlcXVlc3RFbXB0eSwgaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2QsIHBrY2VQYXJhbXNNaXNzaW5nLCBpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSwgaW52YWxpZEF1dGhvcml0eU1ldGFkYXRhLCB1bnRydXN0ZWRBdXRob3JpdHksIG1pc3NpbmdTc2hKd2ssIG1pc3NpbmdTc2hLaWQsIG1pc3NpbmdOb25jZUF1dGhlbnRpY2F0aW9uSGVhZGVyLCBpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXIsIGNhbm5vdFNldE9JRENPcHRpb25zLCBjYW5ub3RBbGxvd05hdGl2ZUJyb2tlciwgYXV0aG9yaXR5TWlzbWF0Y2ggfSBmcm9tICcuL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgKiBhcyBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JDb2RlcyBmcm9tICcuL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcyc7XG5leHBvcnQgeyBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JDb2RlcyB9O1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXMgPSB7XHJcbiAgICBbcmVkaXJlY3RVcmlFbXB0eV06IFwiQSByZWRpcmVjdCBVUkkgaXMgcmVxdWlyZWQgZm9yIGFsbCBjYWxscywgYW5kIG5vbmUgaGFzIGJlZW4gc2V0LlwiLFxyXG4gICAgW2NsYWltc1JlcXVlc3RQYXJzaW5nRXJyb3JdOiBcIkNvdWxkIG5vdCBwYXJzZSB0aGUgZ2l2ZW4gY2xhaW1zIHJlcXVlc3Qgb2JqZWN0LlwiLFxyXG4gICAgW2F1dGhvcml0eVVyaUluc2VjdXJlXTogXCJBdXRob3JpdHkgVVJJcyBtdXN0IHVzZSBodHRwcy4gIFBsZWFzZSBzZWUgaGVyZSBmb3IgdmFsaWQgYXV0aG9yaXR5IGNvbmZpZ3VyYXRpb24gb3B0aW9uczogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvYWN0aXZlLWRpcmVjdG9yeS9kZXZlbG9wL21zYWwtanMtaW5pdGlhbGl6aW5nLWNsaWVudC1hcHBsaWNhdGlvbnMjY29uZmlndXJhdGlvbi1vcHRpb25zXCIsXHJcbiAgICBbdXJsUGFyc2VFcnJvcl06IFwiVVJMIGNvdWxkIG5vdCBiZSBwYXJzZWQgaW50byBhcHByb3ByaWF0ZSBzZWdtZW50cy5cIixcclxuICAgIFt1cmxFbXB0eUVycm9yXTogXCJVUkwgd2FzIGVtcHR5IG9yIG51bGwuXCIsXHJcbiAgICBbZW1wdHlJbnB1dFNjb3Blc0Vycm9yXTogXCJTY29wZXMgY2Fubm90IGJlIHBhc3NlZCBhcyBudWxsLCB1bmRlZmluZWQgb3IgZW1wdHkgYXJyYXkgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuLlwiLFxyXG4gICAgW2ludmFsaWRQcm9tcHRWYWx1ZV06IFwiUGxlYXNlIHNlZSBoZXJlIGZvciB2YWxpZCBjb25maWd1cmF0aW9uIG9wdGlvbnM6IGh0dHBzOi8vYXp1cmVhZC5naXRodWIuaW8vbWljcm9zb2Z0LWF1dGhlbnRpY2F0aW9uLWxpYnJhcnktZm9yLWpzL3JlZi9tb2R1bGVzL19henVyZV9tc2FsX2NvbW1vbi5odG1sI2NvbW1vbmF1dGhvcml6YXRpb251cmxyZXF1ZXN0XCIsXHJcbiAgICBbaW52YWxpZENsYWltc106IFwiR2l2ZW4gY2xhaW1zIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuXCIsXHJcbiAgICBbdG9rZW5SZXF1ZXN0RW1wdHldOiBcIlRva2VuIHJlcXVlc3Qgd2FzIGVtcHR5IGFuZCBub3QgZm91bmQgaW4gY2FjaGUuXCIsXHJcbiAgICBbbG9nb3V0UmVxdWVzdEVtcHR5XTogXCJUaGUgbG9nb3V0IHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkLlwiLFxyXG4gICAgW2ludmFsaWRDb2RlQ2hhbGxlbmdlTWV0aG9kXTogJ2NvZGVfY2hhbGxlbmdlX21ldGhvZCBwYXNzZWQgaXMgaW52YWxpZC4gVmFsaWQgdmFsdWVzIGFyZSBcInBsYWluXCIgYW5kIFwiUzI1NlwiLicsXHJcbiAgICBbcGtjZVBhcmFtc01pc3NpbmddOiBcIkJvdGggcGFyYW1zOiBjb2RlX2NoYWxsZW5nZSBhbmQgY29kZV9jaGFsbGVuZ2VfbWV0aG9kIGFyZSB0byBiZSBwYXNzZWQgaWYgdG8gYmUgc2VudCBpbiB0aGUgcmVxdWVzdFwiLFxyXG4gICAgW2ludmFsaWRDbG91ZERpc2NvdmVyeU1ldGFkYXRhXTogXCJJbnZhbGlkIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGEgcHJvdmlkZWQuIE11c3QgYmUgYSBzdHJpbmdpZmllZCBKU09OIG9iamVjdCBjb250YWluaW5nIHRlbmFudF9kaXNjb3ZlcnlfZW5kcG9pbnQgYW5kIG1ldGFkYXRhIGZpZWxkc1wiLFxyXG4gICAgW2ludmFsaWRBdXRob3JpdHlNZXRhZGF0YV06IFwiSW52YWxpZCBhdXRob3JpdHlNZXRhZGF0YSBwcm92aWRlZC4gTXVzdCBieSBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgYXV0aG9yaXphdGlvbl9lbmRwb2ludCwgdG9rZW5fZW5kcG9pbnQsIGlzc3VlciBmaWVsZHMuXCIsXHJcbiAgICBbdW50cnVzdGVkQXV0aG9yaXR5XTogXCJUaGUgcHJvdmlkZWQgYXV0aG9yaXR5IGlzIG5vdCBhIHRydXN0ZWQgYXV0aG9yaXR5LiBQbGVhc2UgaW5jbHVkZSB0aGlzIGF1dGhvcml0eSBpbiB0aGUga25vd25BdXRob3JpdGllcyBjb25maWcgcGFyYW1ldGVyLlwiLFxyXG4gICAgW21pc3NpbmdTc2hKd2tdOiBcIk1pc3Npbmcgc3NoSndrIGluIFNTSCBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBBIHN0cmluZ2lmaWVkIEpTT04gV2ViIEtleSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBTU0ggYXV0aGVudGljYXRpb24gc2NoZW1lLlwiLFxyXG4gICAgW21pc3NpbmdTc2hLaWRdOiBcIk1pc3Npbmcgc3NoS2lkIGluIFNTSCBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBBIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHB1YmxpYyBTU0gga2V5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIFNTSCBhdXRoZW50aWNhdGlvbiBzY2hlbWUuXCIsXHJcbiAgICBbbWlzc2luZ05vbmNlQXV0aGVudGljYXRpb25IZWFkZXJdOiBcIlVuYWJsZSB0byBmaW5kIGFuIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBjb250YWluaW5nIHNlcnZlciBub25jZS4gRWl0aGVyIHRoZSBBdXRoZW50aWNhdGlvbi1JbmZvIG9yIFdXVy1BdXRoZW50aWNhdGUgaGVhZGVycyBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gb2J0YWluIGEgc2VydmVyIG5vbmNlLlwiLFxyXG4gICAgW2ludmFsaWRBdXRoZW50aWNhdGlvbkhlYWRlcl06IFwiSW52YWxpZCBhdXRoZW50aWNhdGlvbiBoZWFkZXIgcHJvdmlkZWRcIixcclxuICAgIFtjYW5ub3RTZXRPSURDT3B0aW9uc106IFwiQ2Fubm90IHNldCBPSURDT3B0aW9ucyBwYXJhbWV0ZXIuIFBsZWFzZSBjaGFuZ2UgdGhlIHByb3RvY29sIG1vZGUgdG8gT0lEQyBvciB1c2UgYSBub24tTWljcm9zb2Z0IGF1dGhvcml0eS5cIixcclxuICAgIFtjYW5ub3RBbGxvd05hdGl2ZUJyb2tlcl06IFwiQ2Fubm90IHNldCBhbGxvd05hdGl2ZUJyb2tlciBwYXJhbWV0ZXIgdG8gdHJ1ZSB3aGVuIG5vdCBpbiBBQUQgcHJvdG9jb2wgbW9kZS5cIixcclxuICAgIFthdXRob3JpdHlNaXNtYXRjaF06IFwiQXV0aG9yaXR5IG1pc21hdGNoIGVycm9yLiBBdXRob3JpdHkgcHJvdmlkZWQgaW4gbG9naW4gcmVxdWVzdCBvciBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBjb25maWcgZG9lcyBub3QgbWF0Y2ggdGhlIGVudmlyb25tZW50IG9mIHRoZSBwcm92aWRlZCBhY2NvdW50LiBQbGVhc2UgdXNlIGEgbWF0Y2hpbmcgYWNjb3VudCBvciBtYWtlIGFuIGludGVyYWN0aXZlIHJlcXVlc3QgdG8gbG9naW4gdG8gdGhpcyBhdXRob3JpdHkuXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlIGNsYXNzIGNvbnRhaW5pbmcgc3RyaW5nIGNvbnN0YW50cyB1c2VkIGJ5IGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cclxuICogQGRlcHJlY2F0ZWQgVXNlIENsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzIGluc3RlYWRcclxuICovXHJcbmNvbnN0IENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2UgPSB7XHJcbiAgICByZWRpcmVjdFVyaU5vdFNldDoge1xyXG4gICAgICAgIGNvZGU6IHJlZGlyZWN0VXJpRW1wdHksXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbcmVkaXJlY3RVcmlFbXB0eV0sXHJcbiAgICB9LFxyXG4gICAgY2xhaW1zUmVxdWVzdFBhcnNpbmdFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGNsYWltc1JlcXVlc3RQYXJzaW5nRXJyb3IsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbY2xhaW1zUmVxdWVzdFBhcnNpbmdFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgYXV0aG9yaXR5VXJpSW5zZWN1cmU6IHtcclxuICAgICAgICBjb2RlOiBhdXRob3JpdHlVcmlJbnNlY3VyZSxcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1thdXRob3JpdHlVcmlJbnNlY3VyZV0sXHJcbiAgICB9LFxyXG4gICAgdXJsUGFyc2VFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHVybFBhcnNlRXJyb3IsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbdXJsUGFyc2VFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgdXJsRW1wdHlFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHVybEVtcHR5RXJyb3IsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbdXJsRW1wdHlFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgZW1wdHlTY29wZXNFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGVtcHR5SW5wdXRTY29wZXNFcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1tlbXB0eUlucHV0U2NvcGVzRXJyb3JdLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRQcm9tcHQ6IHtcclxuICAgICAgICBjb2RlOiBpbnZhbGlkUHJvbXB0VmFsdWUsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbaW52YWxpZFByb21wdFZhbHVlXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQ2xhaW1zUmVxdWVzdDoge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRDbGFpbXMsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbaW52YWxpZENsYWltc10sXHJcbiAgICB9LFxyXG4gICAgdG9rZW5SZXF1ZXN0RW1wdHlFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHRva2VuUmVxdWVzdEVtcHR5LFxyXG4gICAgICAgIGRlc2M6IENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2VzW3Rva2VuUmVxdWVzdEVtcHR5XSxcclxuICAgIH0sXHJcbiAgICBsb2dvdXRSZXF1ZXN0RW1wdHlFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGxvZ291dFJlcXVlc3RFbXB0eSxcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1tsb2dvdXRSZXF1ZXN0RW1wdHldLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRDb2RlQ2hhbGxlbmdlTWV0aG9kOiB7XHJcbiAgICAgICAgY29kZTogaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2QsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2RdLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRDb2RlQ2hhbGxlbmdlUGFyYW1zOiB7XHJcbiAgICAgICAgY29kZTogcGtjZVBhcmFtc01pc3NpbmcsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbcGtjZVBhcmFtc01pc3NpbmddLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRDbG91ZERpc2NvdmVyeU1ldGFkYXRhOiB7XHJcbiAgICAgICAgY29kZTogaW52YWxpZENsb3VkRGlzY292ZXJ5TWV0YWRhdGEsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbaW52YWxpZENsb3VkRGlzY292ZXJ5TWV0YWRhdGFdLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRBdXRob3JpdHlNZXRhZGF0YToge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRBdXRob3JpdHlNZXRhZGF0YSxcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1tpbnZhbGlkQXV0aG9yaXR5TWV0YWRhdGFdLFxyXG4gICAgfSxcclxuICAgIHVudHJ1c3RlZEF1dGhvcml0eToge1xyXG4gICAgICAgIGNvZGU6IHVudHJ1c3RlZEF1dGhvcml0eSxcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1t1bnRydXN0ZWRBdXRob3JpdHldLFxyXG4gICAgfSxcclxuICAgIG1pc3NpbmdTc2hKd2s6IHtcclxuICAgICAgICBjb2RlOiBtaXNzaW5nU3NoSndrLFxyXG4gICAgICAgIGRlc2M6IENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2VzW21pc3NpbmdTc2hKd2tdLFxyXG4gICAgfSxcclxuICAgIG1pc3NpbmdTc2hLaWQ6IHtcclxuICAgICAgICBjb2RlOiBtaXNzaW5nU3NoS2lkLFxyXG4gICAgICAgIGRlc2M6IENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2VzW21pc3NpbmdTc2hLaWRdLFxyXG4gICAgfSxcclxuICAgIG1pc3NpbmdOb25jZUF1dGhlbnRpY2F0aW9uSGVhZGVyOiB7XHJcbiAgICAgICAgY29kZTogbWlzc2luZ05vbmNlQXV0aGVudGljYXRpb25IZWFkZXIsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbbWlzc2luZ05vbmNlQXV0aGVudGljYXRpb25IZWFkZXJdLFxyXG4gICAgfSxcclxuICAgIGludmFsaWRBdXRoZW50aWNhdGlvbkhlYWRlcjoge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRBdXRoZW50aWNhdGlvbkhlYWRlcixcclxuICAgICAgICBkZXNjOiBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlc1tpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXJdLFxyXG4gICAgfSxcclxuICAgIGNhbm5vdFNldE9JRENPcHRpb25zOiB7XHJcbiAgICAgICAgY29kZTogY2Fubm90U2V0T0lEQ09wdGlvbnMsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbY2Fubm90U2V0T0lEQ09wdGlvbnNdLFxyXG4gICAgfSxcclxuICAgIGNhbm5vdEFsbG93TmF0aXZlQnJva2VyOiB7XHJcbiAgICAgICAgY29kZTogY2Fubm90QWxsb3dOYXRpdmVCcm9rZXIsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbY2Fubm90QWxsb3dOYXRpdmVCcm9rZXJdLFxyXG4gICAgfSxcclxuICAgIGF1dGhvcml0eU1pc21hdGNoOiB7XHJcbiAgICAgICAgY29kZTogYXV0aG9yaXR5TWlzbWF0Y2gsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZXNbYXV0aG9yaXR5TWlzbWF0Y2hdLFxyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGNvbmZpZ3VyYXRpb24gb2YgdGhlIE1TQUwuanMgbGlicmFyeS5cclxuICovXHJcbmNsYXNzIENsaWVudENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUpIHtcclxuICAgICAgICBzdXBlcihlcnJvckNvZGUsIENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2VzW2Vycm9yQ29kZV0pO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yXCI7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENsaWVudENvbmZpZ3VyYXRpb25FcnJvci5wcm90b3R5cGUpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcihlcnJvckNvZGUpIHtcclxuICAgIHJldHVybiBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGVycm9yQ29kZSk7XHJcbn1cblxuZXhwb3J0IHsgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yLCBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlLCBDbGllbnRDb25maWd1cmF0aW9uRXJyb3JNZXNzYWdlcywgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRDb25maWd1cmF0aW9uRXJyb3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBoaWRkZW5cclxuICovXHJcbmNsYXNzIFN0cmluZ1V0aWxzIHtcclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgc3RyaW5naWZpZWQgb2JqZWN0IGlzIGVtcHR5XHJcbiAgICAgKiBAcGFyYW0gc3RyT2JqXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpc0VtcHR5T2JqKHN0ck9iaikge1xyXG4gICAgICAgIGlmIChzdHJPYmopIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2Uoc3RyT2JqKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHN0YXJ0c1dpdGgoc3RyLCBzZWFyY2gpIHtcclxuICAgICAgICByZXR1cm4gc3RyLmluZGV4T2Yoc2VhcmNoKSA9PT0gMDtcclxuICAgIH1cclxuICAgIHN0YXRpYyBlbmRzV2l0aChzdHIsIHNlYXJjaCkge1xyXG4gICAgICAgIHJldHVybiAoc3RyLmxlbmd0aCA+PSBzZWFyY2gubGVuZ3RoICYmXHJcbiAgICAgICAgICAgIHN0ci5sYXN0SW5kZXhPZihzZWFyY2gpID09PSBzdHIubGVuZ3RoIC0gc2VhcmNoLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBzdHJpbmcgaW50byBhbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHF1ZXJ5XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeVN0cmluZ1RvT2JqZWN0KHF1ZXJ5KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXVlcnkuc3BsaXQoXCImXCIpO1xyXG4gICAgICAgIGNvbnN0IGRlY29kZSA9IChzKSA9PiBkZWNvZGVVUklDb21wb25lbnQocy5yZXBsYWNlKC9cXCsvZywgXCIgXCIpKTtcclxuICAgICAgICBwYXJhbXMuZm9yRWFjaCgocGFpcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGFpci50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoLz0oLispL2csIDIpOyAvLyBTcGxpdCBvbiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHRoZSAnPScgY2hhcmFjdGVyXHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqW2RlY29kZShrZXkpXSA9IGRlY29kZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmltcyBlbnRyaWVzIGluIGFuIGFycmF5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRyaW1BcnJheUVudHJpZXMoYXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGFyci5tYXAoKGVudHJ5KSA9PiBlbnRyeS50cmltKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGVtcHR5IHN0cmluZ3MgZnJvbSBhcnJheVxyXG4gICAgICogQHBhcmFtIGFyclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVtb3ZlRW1wdHlTdHJpbmdzRnJvbUFycmF5KGFycikge1xyXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gISFlbnRyeTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdHMgdG8gcGFyc2UgYSBzdHJpbmcgaW50byBKU09OXHJcbiAgICAgKiBAcGFyYW0gc3RyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqc29uUGFyc2VIZWxwZXIoc3RyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiBhIGdpdmVuIHN0cmluZyBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybiwgd2l0aCBzdXBwb3J0IGZvciB3aWxkY2FyZHMgYW5kIHF1ZXJpZXMuXHJcbiAgICAgKiBAcGFyYW0gcGF0dGVybiBXaWxkY2FyZCBwYXR0ZXJuIHRvIHN0cmluZyBtYXRjaC4gU3VwcG9ydHMgXCIqXCIgZm9yIHdpbGRjYXJkcyBhbmQgXCI/XCIgZm9yIHF1ZXJpZXNcclxuICAgICAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIGlucHV0KSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2lsZGNhcmQgc3VwcG9ydDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxMTcyNDgvNDg4ODU1OVxyXG4gICAgICAgICAqIFF1ZXJpZXM6IHJlcGxhY2VzIFwiP1wiIGluIHN0cmluZyB3aXRoIGVzY2FwZWQgXCJcXD9cIiBmb3IgcmVnZXggdGVzdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtbm9uLWxpdGVyYWwtcmVnZXhwXHJcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm5cclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwqL2csIFwiW14gXSpcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcPy9nLCBcIlxcXFw/XCIpKTtcclxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChpbnB1dCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU3RyaW5nVXRpbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmluZ1V0aWxzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGNsaWVudEluZm9EZWNvZGluZ0Vycm9yID0gXCJjbGllbnRfaW5mb19kZWNvZGluZ19lcnJvclwiO1xyXG5jb25zdCBjbGllbnRJbmZvRW1wdHlFcnJvciA9IFwiY2xpZW50X2luZm9fZW1wdHlfZXJyb3JcIjtcclxuY29uc3QgdG9rZW5QYXJzaW5nRXJyb3IgPSBcInRva2VuX3BhcnNpbmdfZXJyb3JcIjtcclxuY29uc3QgbnVsbE9yRW1wdHlUb2tlbiA9IFwibnVsbF9vcl9lbXB0eV90b2tlblwiO1xyXG5jb25zdCBlbmRwb2ludFJlc29sdXRpb25FcnJvciA9IFwiZW5kcG9pbnRzX3Jlc29sdXRpb25fZXJyb3JcIjtcclxuY29uc3QgbmV0d29ya0Vycm9yID0gXCJuZXR3b3JrX2Vycm9yXCI7XHJcbmNvbnN0IG9wZW5JZENvbmZpZ0Vycm9yID0gXCJvcGVuaWRfY29uZmlnX2Vycm9yXCI7XHJcbmNvbnN0IGhhc2hOb3REZXNlcmlhbGl6ZWQgPSBcImhhc2hfbm90X2Rlc2VyaWFsaXplZFwiO1xyXG5jb25zdCBpbnZhbGlkU3RhdGUgPSBcImludmFsaWRfc3RhdGVcIjtcclxuY29uc3Qgc3RhdGVNaXNtYXRjaCA9IFwic3RhdGVfbWlzbWF0Y2hcIjtcclxuY29uc3Qgc3RhdGVOb3RGb3VuZCA9IFwic3RhdGVfbm90X2ZvdW5kXCI7XHJcbmNvbnN0IG5vbmNlTWlzbWF0Y2ggPSBcIm5vbmNlX21pc21hdGNoXCI7XHJcbmNvbnN0IGF1dGhUaW1lTm90Rm91bmQgPSBcImF1dGhfdGltZV9ub3RfZm91bmRcIjtcclxuY29uc3QgbWF4QWdlVHJhbnNwaXJlZCA9IFwibWF4X2FnZV90cmFuc3BpcmVkXCI7XHJcbmNvbnN0IG11bHRpcGxlTWF0Y2hpbmdUb2tlbnMgPSBcIm11bHRpcGxlX21hdGNoaW5nX3Rva2Vuc1wiO1xyXG5jb25zdCBtdWx0aXBsZU1hdGNoaW5nQWNjb3VudHMgPSBcIm11bHRpcGxlX21hdGNoaW5nX2FjY291bnRzXCI7XHJcbmNvbnN0IG11bHRpcGxlTWF0Y2hpbmdBcHBNZXRhZGF0YSA9IFwibXVsdGlwbGVfbWF0Y2hpbmdfYXBwTWV0YWRhdGFcIjtcclxuY29uc3QgcmVxdWVzdENhbm5vdEJlTWFkZSA9IFwicmVxdWVzdF9jYW5ub3RfYmVfbWFkZVwiO1xyXG5jb25zdCBjYW5ub3RSZW1vdmVFbXB0eVNjb3BlID0gXCJjYW5ub3RfcmVtb3ZlX2VtcHR5X3Njb3BlXCI7XHJcbmNvbnN0IGNhbm5vdEFwcGVuZFNjb3BlU2V0ID0gXCJjYW5ub3RfYXBwZW5kX3Njb3Blc2V0XCI7XHJcbmNvbnN0IGVtcHR5SW5wdXRTY29wZVNldCA9IFwiZW1wdHlfaW5wdXRfc2NvcGVzZXRcIjtcclxuY29uc3QgZGV2aWNlQ29kZVBvbGxpbmdDYW5jZWxsZWQgPSBcImRldmljZV9jb2RlX3BvbGxpbmdfY2FuY2VsbGVkXCI7XHJcbmNvbnN0IGRldmljZUNvZGVFeHBpcmVkID0gXCJkZXZpY2VfY29kZV9leHBpcmVkXCI7XHJcbmNvbnN0IGRldmljZUNvZGVVbmtub3duRXJyb3IgPSBcImRldmljZV9jb2RlX3Vua25vd25fZXJyb3JcIjtcclxuY29uc3Qgbm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0ID0gXCJub19hY2NvdW50X2luX3NpbGVudF9yZXF1ZXN0XCI7XHJcbmNvbnN0IGludmFsaWRDYWNoZVJlY29yZCA9IFwiaW52YWxpZF9jYWNoZV9yZWNvcmRcIjtcclxuY29uc3QgaW52YWxpZENhY2hlRW52aXJvbm1lbnQgPSBcImludmFsaWRfY2FjaGVfZW52aXJvbm1lbnRcIjtcclxuY29uc3Qgbm9BY2NvdW50Rm91bmQgPSBcIm5vX2FjY291bnRfZm91bmRcIjtcclxuY29uc3Qgbm9DcnlwdG9PYmplY3QgPSBcIm5vX2NyeXB0b19vYmplY3RcIjtcclxuY29uc3QgdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlID0gXCJ1bmV4cGVjdGVkX2NyZWRlbnRpYWxfdHlwZVwiO1xyXG5jb25zdCBpbnZhbGlkQXNzZXJ0aW9uID0gXCJpbnZhbGlkX2Fzc2VydGlvblwiO1xyXG5jb25zdCBpbnZhbGlkQ2xpZW50Q3JlZGVudGlhbCA9IFwiaW52YWxpZF9jbGllbnRfY3JlZGVudGlhbFwiO1xyXG5jb25zdCB0b2tlblJlZnJlc2hSZXF1aXJlZCA9IFwidG9rZW5fcmVmcmVzaF9yZXF1aXJlZFwiO1xyXG5jb25zdCB1c2VyVGltZW91dFJlYWNoZWQgPSBcInVzZXJfdGltZW91dF9yZWFjaGVkXCI7XHJcbmNvbnN0IHRva2VuQ2xhaW1zQ25mUmVxdWlyZWRGb3JTaWduZWRKd3QgPSBcInRva2VuX2NsYWltc19jbmZfcmVxdWlyZWRfZm9yX3NpZ25lZGp3dFwiO1xyXG5jb25zdCBhdXRob3JpemF0aW9uQ29kZU1pc3NpbmdGcm9tU2VydmVyUmVzcG9uc2UgPSBcImF1dGhvcml6YXRpb25fY29kZV9taXNzaW5nX2Zyb21fc2VydmVyX3Jlc3BvbnNlXCI7XHJcbmNvbnN0IGJpbmRpbmdLZXlOb3RSZW1vdmVkID0gXCJiaW5kaW5nX2tleV9ub3RfcmVtb3ZlZFwiO1xyXG5jb25zdCBlbmRTZXNzaW9uRW5kcG9pbnROb3RTdXBwb3J0ZWQgPSBcImVuZF9zZXNzaW9uX2VuZHBvaW50X25vdF9zdXBwb3J0ZWRcIjtcclxuY29uc3Qga2V5SWRNaXNzaW5nID0gXCJrZXlfaWRfbWlzc2luZ1wiO1xyXG5jb25zdCBub05ldHdvcmtDb25uZWN0aXZpdHkgPSBcIm5vX25ldHdvcmtfY29ubmVjdGl2aXR5XCI7XHJcbmNvbnN0IHVzZXJDYW5jZWxlZCA9IFwidXNlcl9jYW5jZWxlZFwiO1xyXG5jb25zdCBtaXNzaW5nVGVuYW50SWRFcnJvciA9IFwibWlzc2luZ190ZW5hbnRfaWRfZXJyb3JcIjtcclxuY29uc3QgbWV0aG9kTm90SW1wbGVtZW50ZWQgPSBcIm1ldGhvZF9ub3RfaW1wbGVtZW50ZWRcIjtcclxuY29uc3QgbmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkID0gXCJuZXN0ZWRfYXBwX2F1dGhfYnJpZGdlX2Rpc2FibGVkXCI7XG5cbmV4cG9ydCB7IGF1dGhUaW1lTm90Rm91bmQsIGF1dGhvcml6YXRpb25Db2RlTWlzc2luZ0Zyb21TZXJ2ZXJSZXNwb25zZSwgYmluZGluZ0tleU5vdFJlbW92ZWQsIGNhbm5vdEFwcGVuZFNjb3BlU2V0LCBjYW5ub3RSZW1vdmVFbXB0eVNjb3BlLCBjbGllbnRJbmZvRGVjb2RpbmdFcnJvciwgY2xpZW50SW5mb0VtcHR5RXJyb3IsIGRldmljZUNvZGVFeHBpcmVkLCBkZXZpY2VDb2RlUG9sbGluZ0NhbmNlbGxlZCwgZGV2aWNlQ29kZVVua25vd25FcnJvciwgZW1wdHlJbnB1dFNjb3BlU2V0LCBlbmRTZXNzaW9uRW5kcG9pbnROb3RTdXBwb3J0ZWQsIGVuZHBvaW50UmVzb2x1dGlvbkVycm9yLCBoYXNoTm90RGVzZXJpYWxpemVkLCBpbnZhbGlkQXNzZXJ0aW9uLCBpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudCwgaW52YWxpZENhY2hlUmVjb3JkLCBpbnZhbGlkQ2xpZW50Q3JlZGVudGlhbCwgaW52YWxpZFN0YXRlLCBrZXlJZE1pc3NpbmcsIG1heEFnZVRyYW5zcGlyZWQsIG1ldGhvZE5vdEltcGxlbWVudGVkLCBtaXNzaW5nVGVuYW50SWRFcnJvciwgbXVsdGlwbGVNYXRjaGluZ0FjY291bnRzLCBtdWx0aXBsZU1hdGNoaW5nQXBwTWV0YWRhdGEsIG11bHRpcGxlTWF0Y2hpbmdUb2tlbnMsIG5lc3RlZEFwcEF1dGhCcmlkZ2VEaXNhYmxlZCwgbmV0d29ya0Vycm9yLCBub0FjY291bnRGb3VuZCwgbm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0LCBub0NyeXB0b09iamVjdCwgbm9OZXR3b3JrQ29ubmVjdGl2aXR5LCBub25jZU1pc21hdGNoLCBudWxsT3JFbXB0eVRva2VuLCBvcGVuSWRDb25maWdFcnJvciwgcmVxdWVzdENhbm5vdEJlTWFkZSwgc3RhdGVNaXNtYXRjaCwgc3RhdGVOb3RGb3VuZCwgdG9rZW5DbGFpbXNDbmZSZXF1aXJlZEZvclNpZ25lZEp3dCwgdG9rZW5QYXJzaW5nRXJyb3IsIHRva2VuUmVmcmVzaFJlcXVpcmVkLCB1bmV4cGVjdGVkQ3JlZGVudGlhbFR5cGUsIHVzZXJDYW5jZWxlZCwgdXNlclRpbWVvdXRSZWFjaGVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJy4vQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBjbGllbnRJbmZvRGVjb2RpbmdFcnJvciwgY2xpZW50SW5mb0VtcHR5RXJyb3IsIHRva2VuUGFyc2luZ0Vycm9yLCBudWxsT3JFbXB0eVRva2VuLCBlbmRwb2ludFJlc29sdXRpb25FcnJvciwgbmV0d29ya0Vycm9yLCBvcGVuSWRDb25maWdFcnJvciwgaGFzaE5vdERlc2VyaWFsaXplZCwgaW52YWxpZFN0YXRlLCBzdGF0ZU1pc21hdGNoLCBzdGF0ZU5vdEZvdW5kLCBub25jZU1pc21hdGNoLCBhdXRoVGltZU5vdEZvdW5kLCBtYXhBZ2VUcmFuc3BpcmVkLCBtdWx0aXBsZU1hdGNoaW5nVG9rZW5zLCBtdWx0aXBsZU1hdGNoaW5nQWNjb3VudHMsIG11bHRpcGxlTWF0Y2hpbmdBcHBNZXRhZGF0YSwgcmVxdWVzdENhbm5vdEJlTWFkZSwgY2Fubm90UmVtb3ZlRW1wdHlTY29wZSwgY2Fubm90QXBwZW5kU2NvcGVTZXQsIGVtcHR5SW5wdXRTY29wZVNldCwgZGV2aWNlQ29kZVBvbGxpbmdDYW5jZWxsZWQsIGRldmljZUNvZGVFeHBpcmVkLCBkZXZpY2VDb2RlVW5rbm93bkVycm9yLCBub0FjY291bnRJblNpbGVudFJlcXVlc3QsIGludmFsaWRDYWNoZVJlY29yZCwgaW52YWxpZENhY2hlRW52aXJvbm1lbnQsIG5vQWNjb3VudEZvdW5kLCBub0NyeXB0b09iamVjdCwgdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlLCBpbnZhbGlkQXNzZXJ0aW9uLCBpbnZhbGlkQ2xpZW50Q3JlZGVudGlhbCwgdG9rZW5SZWZyZXNoUmVxdWlyZWQsIHVzZXJUaW1lb3V0UmVhY2hlZCwgdG9rZW5DbGFpbXNDbmZSZXF1aXJlZEZvclNpZ25lZEp3dCwgYXV0aG9yaXphdGlvbkNvZGVNaXNzaW5nRnJvbVNlcnZlclJlc3BvbnNlLCBiaW5kaW5nS2V5Tm90UmVtb3ZlZCwgZW5kU2Vzc2lvbkVuZHBvaW50Tm90U3VwcG9ydGVkLCBrZXlJZE1pc3NpbmcsIG5vTmV0d29ya0Nvbm5lY3Rpdml0eSwgdXNlckNhbmNlbGVkLCBtaXNzaW5nVGVuYW50SWRFcnJvciwgbmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkLCBtZXRob2ROb3RJbXBsZW1lbnRlZCB9IGZyb20gJy4vQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcbmltcG9ydCAqIGFzIENsaWVudEF1dGhFcnJvckNvZGVzIGZyb20gJy4vQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IENsaWVudEF1dGhFcnJvckNvZGVzIH07XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2xpZW50QXV0aEVycm9yTWVzc2FnZSBjbGFzcyBjb250YWluaW5nIHN0cmluZyBjb25zdGFudHMgdXNlZCBieSBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXHJcbiAqL1xyXG5jb25zdCBDbGllbnRBdXRoRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIFtjbGllbnRJbmZvRGVjb2RpbmdFcnJvcl06IFwiVGhlIGNsaWVudCBpbmZvIGNvdWxkIG5vdCBiZSBwYXJzZWQvZGVjb2RlZCBjb3JyZWN0bHlcIixcclxuICAgIFtjbGllbnRJbmZvRW1wdHlFcnJvcl06IFwiVGhlIGNsaWVudCBpbmZvIHdhcyBlbXB0eVwiLFxyXG4gICAgW3Rva2VuUGFyc2luZ0Vycm9yXTogXCJUb2tlbiBjYW5ub3QgYmUgcGFyc2VkXCIsXHJcbiAgICBbbnVsbE9yRW1wdHlUb2tlbl06IFwiVGhlIHRva2VuIGlzIG51bGwgb3IgZW1wdHlcIixcclxuICAgIFtlbmRwb2ludFJlc29sdXRpb25FcnJvcl06IFwiRW5kcG9pbnRzIGNhbm5vdCBiZSByZXNvbHZlZFwiLFxyXG4gICAgW25ldHdvcmtFcnJvcl06IFwiTmV0d29yayByZXF1ZXN0IGZhaWxlZFwiLFxyXG4gICAgW29wZW5JZENvbmZpZ0Vycm9yXTogXCJDb3VsZCBub3QgcmV0cmlldmUgZW5kcG9pbnRzLiBDaGVjayB5b3VyIGF1dGhvcml0eSBhbmQgdmVyaWZ5IHRoZSAud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiBlbmRwb2ludCByZXR1cm5zIHRoZSByZXF1aXJlZCBlbmRwb2ludHMuXCIsXHJcbiAgICBbaGFzaE5vdERlc2VyaWFsaXplZF06IFwiVGhlIGhhc2ggcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkXCIsXHJcbiAgICBbaW52YWxpZFN0YXRlXTogXCJTdGF0ZSB3YXMgbm90IHRoZSBleHBlY3RlZCBmb3JtYXRcIixcclxuICAgIFtzdGF0ZU1pc21hdGNoXTogXCJTdGF0ZSBtaXNtYXRjaCBlcnJvclwiLFxyXG4gICAgW3N0YXRlTm90Rm91bmRdOiBcIlN0YXRlIG5vdCBmb3VuZFwiLFxyXG4gICAgW25vbmNlTWlzbWF0Y2hdOiBcIk5vbmNlIG1pc21hdGNoIGVycm9yXCIsXHJcbiAgICBbYXV0aFRpbWVOb3RGb3VuZF06IFwiTWF4IEFnZSB3YXMgcmVxdWVzdGVkIGFuZCB0aGUgSUQgdG9rZW4gaXMgbWlzc2luZyB0aGUgYXV0aF90aW1lIHZhcmlhYmxlLlwiICtcclxuICAgICAgICBcIiBhdXRoX3RpbWUgaXMgYW4gb3B0aW9uYWwgY2xhaW0gYW5kIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgLSBpdCBtdXN0IGJlIGVuYWJsZWQuXCIgK1xyXG4gICAgICAgIFwiIFNlZSBodHRwczovL2FrYS5tcy9tc2FsanMvb3B0aW9uYWwtY2xhaW1zIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiLFxyXG4gICAgW21heEFnZVRyYW5zcGlyZWRdOiBcIk1heCBBZ2UgaXMgc2V0IHRvIDAsIG9yIHRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZW5kLXVzZXIgYXV0aGVudGljYXRpb24uXCIsXHJcbiAgICBbbXVsdGlwbGVNYXRjaGluZ1Rva2Vuc106IFwiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIHRva2VucyBzYXRpc2Z5aW5nIHRoZSByZXF1aXJlbWVudHMuIFwiICtcclxuICAgICAgICBcIkNhbGwgQWNxdWlyZVRva2VuIGFnYWluIHByb3ZpZGluZyBtb3JlIHJlcXVpcmVtZW50cyBzdWNoIGFzIGF1dGhvcml0eSBvciBhY2NvdW50LlwiLFxyXG4gICAgW211bHRpcGxlTWF0Y2hpbmdBY2NvdW50c106IFwiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYWNjb3VudFwiLFxyXG4gICAgW211bHRpcGxlTWF0Y2hpbmdBcHBNZXRhZGF0YV06IFwiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFwcE1ldGFkYXRhIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYXBwTWV0YWRhdGFcIixcclxuICAgIFtyZXF1ZXN0Q2Fubm90QmVNYWRlXTogXCJUb2tlbiByZXF1ZXN0IGNhbm5vdCBiZSBtYWRlIHdpdGhvdXQgYXV0aG9yaXphdGlvbiBjb2RlIG9yIHJlZnJlc2ggdG9rZW4uXCIsXHJcbiAgICBbY2Fubm90UmVtb3ZlRW1wdHlTY29wZV06IFwiQ2Fubm90IHJlbW92ZSBudWxsIG9yIGVtcHR5IHNjb3BlIGZyb20gU2NvcGVTZXRcIixcclxuICAgIFtjYW5ub3RBcHBlbmRTY29wZVNldF06IFwiQ2Fubm90IGFwcGVuZCBTY29wZVNldFwiLFxyXG4gICAgW2VtcHR5SW5wdXRTY29wZVNldF06IFwiRW1wdHkgaW5wdXQgU2NvcGVTZXQgY2Fubm90IGJlIHByb2Nlc3NlZFwiLFxyXG4gICAgW2RldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkXTogXCJDYWxsZXIgaGFzIGNhbmNlbGxlZCB0b2tlbiBlbmRwb2ludCBwb2xsaW5nIGR1cmluZyBkZXZpY2UgY29kZSBmbG93IGJ5IHNldHRpbmcgRGV2aWNlQ29kZVJlcXVlc3QuY2FuY2VsID0gdHJ1ZS5cIixcclxuICAgIFtkZXZpY2VDb2RlRXhwaXJlZF06IFwiRGV2aWNlIGNvZGUgaXMgZXhwaXJlZC5cIixcclxuICAgIFtkZXZpY2VDb2RlVW5rbm93bkVycm9yXTogXCJEZXZpY2UgY29kZSBzdG9wcGVkIHBvbGxpbmcgZm9yIHVua25vd24gcmVhc29ucy5cIixcclxuICAgIFtub0FjY291bnRJblNpbGVudFJlcXVlc3RdOiBcIlBsZWFzZSBwYXNzIGFuIGFjY291bnQgb2JqZWN0LCBzaWxlbnQgZmxvdyBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgYWNjb3VudCBpbmZvcm1hdGlvblwiLFxyXG4gICAgW2ludmFsaWRDYWNoZVJlY29yZF06IFwiQ2FjaGUgcmVjb3JkIG9iamVjdCB3YXMgbnVsbCBvciB1bmRlZmluZWQuXCIsXHJcbiAgICBbaW52YWxpZENhY2hlRW52aXJvbm1lbnRdOiBcIkludmFsaWQgZW52aXJvbm1lbnQgd2hlbiBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBjYWNoZSBlbnRyeVwiLFxyXG4gICAgW25vQWNjb3VudEZvdW5kXTogXCJObyBhY2NvdW50IGZvdW5kIGluIGNhY2hlIGZvciBnaXZlbiBrZXkuXCIsXHJcbiAgICBbbm9DcnlwdG9PYmplY3RdOiBcIk5vIGNyeXB0byBvYmplY3QgZGV0ZWN0ZWQuXCIsXHJcbiAgICBbdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlXTogXCJVbmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZS5cIixcclxuICAgIFtpbnZhbGlkQXNzZXJ0aW9uXTogXCJDbGllbnQgYXNzZXJ0aW9uIG11c3QgbWVldCByZXF1aXJlbWVudHMgZGVzY3JpYmVkIGluIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE1XCIsXHJcbiAgICBbaW52YWxpZENsaWVudENyZWRlbnRpYWxdOiBcIkNsaWVudCBjcmVkZW50aWFsIChzZWNyZXQsIGNlcnRpZmljYXRlLCBvciBhc3NlcnRpb24pIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gY3JlYXRpbmcgYSBjb25maWRlbnRpYWwgY2xpZW50LiBBbiBhcHBsaWNhdGlvbiBzaG91bGQgYXQgbW9zdCBoYXZlIG9uZSBjcmVkZW50aWFsXCIsXHJcbiAgICBbdG9rZW5SZWZyZXNoUmVxdWlyZWRdOiBcIkNhbm5vdCByZXR1cm4gdG9rZW4gZnJvbSBjYWNoZSBiZWNhdXNlIGl0IG11c3QgYmUgcmVmcmVzaGVkLiBUaGlzIG1heSBiZSBkdWUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczogZm9yY2VSZWZyZXNoIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgY2xhaW1zIGhhdmUgYmVlbiByZXF1ZXN0ZWQsIHRoZXJlIGlzIG5vIGNhY2hlZCBhY2Nlc3MgdG9rZW4gb3IgaXQgaXMgZXhwaXJlZC5cIixcclxuICAgIFt1c2VyVGltZW91dFJlYWNoZWRdOiBcIlVzZXIgZGVmaW5lZCB0aW1lb3V0IGZvciBkZXZpY2UgY29kZSBwb2xsaW5nIHJlYWNoZWRcIixcclxuICAgIFt0b2tlbkNsYWltc0NuZlJlcXVpcmVkRm9yU2lnbmVkSnd0XTogXCJDYW5ub3QgZ2VuZXJhdGUgYSBQT1Agand0IGlmIHRoZSB0b2tlbl9jbGFpbXMgYXJlIG5vdCBwb3B1bGF0ZWRcIixcclxuICAgIFthdXRob3JpemF0aW9uQ29kZU1pc3NpbmdGcm9tU2VydmVyUmVzcG9uc2VdOiBcIlNlcnZlciByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml6YXRpb24gY29kZSB0byBwcm9jZWVkXCIsXHJcbiAgICBbYmluZGluZ0tleU5vdFJlbW92ZWRdOiBcIkNvdWxkIG5vdCByZW1vdmUgdGhlIGNyZWRlbnRpYWwncyBiaW5kaW5nIGtleSBmcm9tIHN0b3JhZ2UuXCIsXHJcbiAgICBbZW5kU2Vzc2lvbkVuZHBvaW50Tm90U3VwcG9ydGVkXTogXCJUaGUgcHJvdmlkZWQgYXV0aG9yaXR5IGRvZXMgbm90IHN1cHBvcnQgbG9nb3V0XCIsXHJcbiAgICBba2V5SWRNaXNzaW5nXTogXCJBIGtleUlkIHZhbHVlIGlzIG1pc3NpbmcgZnJvbSB0aGUgcmVxdWVzdGVkIGJvdW5kIHRva2VuJ3MgY2FjaGUgcmVjb3JkIGFuZCBpcyByZXF1aXJlZCB0byBtYXRjaCB0aGUgdG9rZW4gdG8gaXQncyBzdG9yZWQgYmluZGluZyBrZXkuXCIsXHJcbiAgICBbbm9OZXR3b3JrQ29ubmVjdGl2aXR5XTogXCJObyBuZXR3b3JrIGNvbm5lY3Rpdml0eS4gQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLlwiLFxyXG4gICAgW3VzZXJDYW5jZWxlZF06IFwiVXNlciBjYW5jZWxsZWQgdGhlIGZsb3cuXCIsXHJcbiAgICBbbWlzc2luZ1RlbmFudElkRXJyb3JdOiBcIkEgdGVuYW50IGlkIC0gbm90IGNvbW1vbiwgb3JnYW5pemF0aW9ucywgb3IgY29uc3VtZXJzIC0gbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB1c2luZyB0aGUgY2xpZW50X2NyZWRlbnRpYWxzIGZsb3cuXCIsXHJcbiAgICBbbWV0aG9kTm90SW1wbGVtZW50ZWRdOiBcIlRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZFwiLFxyXG4gICAgW25lc3RlZEFwcEF1dGhCcmlkZ2VEaXNhYmxlZF06IFwiVGhlIG5lc3RlZCBhcHAgYXV0aCBicmlkZ2UgaXMgZGlzYWJsZWRcIixcclxufTtcclxuLyoqXHJcbiAqIFN0cmluZyBjb25zdGFudHMgdXNlZCBieSBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMuXHJcbiAqIEBkZXByZWNhdGVkIFVzZSBDbGllbnRBdXRoRXJyb3JDb2RlcyBpbnN0ZWFkXHJcbiAqL1xyXG5jb25zdCBDbGllbnRBdXRoRXJyb3JNZXNzYWdlID0ge1xyXG4gICAgY2xpZW50SW5mb0RlY29kaW5nRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBjbGllbnRJbmZvRGVjb2RpbmdFcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tjbGllbnRJbmZvRGVjb2RpbmdFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgY2xpZW50SW5mb0VtcHR5RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBjbGllbnRJbmZvRW1wdHlFcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tjbGllbnRJbmZvRW1wdHlFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgdG9rZW5QYXJzaW5nRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiB0b2tlblBhcnNpbmdFcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1t0b2tlblBhcnNpbmdFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgbnVsbE9yRW1wdHlUb2tlbjoge1xyXG4gICAgICAgIGNvZGU6IG51bGxPckVtcHR5VG9rZW4sXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbbnVsbE9yRW1wdHlUb2tlbl0sXHJcbiAgICB9LFxyXG4gICAgZW5kcG9pbnRSZXNvbHV0aW9uRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBlbmRwb2ludFJlc29sdXRpb25FcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tlbmRwb2ludFJlc29sdXRpb25FcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgbmV0d29ya0Vycm9yOiB7XHJcbiAgICAgICAgY29kZTogbmV0d29ya0Vycm9yLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW25ldHdvcmtFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgdW5hYmxlVG9HZXRPcGVuaWRDb25maWdFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IG9wZW5JZENvbmZpZ0Vycm9yLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW29wZW5JZENvbmZpZ0Vycm9yXSxcclxuICAgIH0sXHJcbiAgICBoYXNoTm90RGVzZXJpYWxpemVkOiB7XHJcbiAgICAgICAgY29kZTogaGFzaE5vdERlc2VyaWFsaXplZCxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1toYXNoTm90RGVzZXJpYWxpemVkXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkU3RhdGVFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRTdGF0ZSxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tpbnZhbGlkU3RhdGVdLFxyXG4gICAgfSxcclxuICAgIHN0YXRlTWlzbWF0Y2hFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHN0YXRlTWlzbWF0Y2gsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbc3RhdGVNaXNtYXRjaF0sXHJcbiAgICB9LFxyXG4gICAgc3RhdGVOb3RGb3VuZEVycm9yOiB7XHJcbiAgICAgICAgY29kZTogc3RhdGVOb3RGb3VuZCxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tzdGF0ZU5vdEZvdW5kXSxcclxuICAgIH0sXHJcbiAgICBub25jZU1pc21hdGNoRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBub25jZU1pc21hdGNoLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW25vbmNlTWlzbWF0Y2hdLFxyXG4gICAgfSxcclxuICAgIGF1dGhUaW1lTm90Rm91bmRFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGF1dGhUaW1lTm90Rm91bmQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbYXV0aFRpbWVOb3RGb3VuZF0sXHJcbiAgICB9LFxyXG4gICAgbWF4QWdlVHJhbnNwaXJlZDoge1xyXG4gICAgICAgIGNvZGU6IG1heEFnZVRyYW5zcGlyZWQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbbWF4QWdlVHJhbnNwaXJlZF0sXHJcbiAgICB9LFxyXG4gICAgbXVsdGlwbGVNYXRjaGluZ1Rva2Vuczoge1xyXG4gICAgICAgIGNvZGU6IG11bHRpcGxlTWF0Y2hpbmdUb2tlbnMsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbbXVsdGlwbGVNYXRjaGluZ1Rva2Vuc10sXHJcbiAgICB9LFxyXG4gICAgbXVsdGlwbGVNYXRjaGluZ0FjY291bnRzOiB7XHJcbiAgICAgICAgY29kZTogbXVsdGlwbGVNYXRjaGluZ0FjY291bnRzLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW211bHRpcGxlTWF0Y2hpbmdBY2NvdW50c10sXHJcbiAgICB9LFxyXG4gICAgbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhOiB7XHJcbiAgICAgICAgY29kZTogbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW211bHRpcGxlTWF0Y2hpbmdBcHBNZXRhZGF0YV0sXHJcbiAgICB9LFxyXG4gICAgdG9rZW5SZXF1ZXN0Q2Fubm90QmVNYWRlOiB7XHJcbiAgICAgICAgY29kZTogcmVxdWVzdENhbm5vdEJlTWFkZSxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tyZXF1ZXN0Q2Fubm90QmVNYWRlXSxcclxuICAgIH0sXHJcbiAgICByZW1vdmVFbXB0eVNjb3BlRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBjYW5ub3RSZW1vdmVFbXB0eVNjb3BlLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2Nhbm5vdFJlbW92ZUVtcHR5U2NvcGVdLFxyXG4gICAgfSxcclxuICAgIGFwcGVuZFNjb3BlU2V0RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBjYW5ub3RBcHBlbmRTY29wZVNldCxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tjYW5ub3RBcHBlbmRTY29wZVNldF0sXHJcbiAgICB9LFxyXG4gICAgZW1wdHlJbnB1dFNjb3BlU2V0RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBlbXB0eUlucHV0U2NvcGVTZXQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbZW1wdHlJbnB1dFNjb3BlU2V0XSxcclxuICAgIH0sXHJcbiAgICBEZXZpY2VDb2RlUG9sbGluZ0NhbmNlbGxlZDoge1xyXG4gICAgICAgIGNvZGU6IGRldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2RldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkXSxcclxuICAgIH0sXHJcbiAgICBEZXZpY2VDb2RlRXhwaXJlZDoge1xyXG4gICAgICAgIGNvZGU6IGRldmljZUNvZGVFeHBpcmVkLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2RldmljZUNvZGVFeHBpcmVkXSxcclxuICAgIH0sXHJcbiAgICBEZXZpY2VDb2RlVW5rbm93bkVycm9yOiB7XHJcbiAgICAgICAgY29kZTogZGV2aWNlQ29kZVVua25vd25FcnJvcixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tkZXZpY2VDb2RlVW5rbm93bkVycm9yXSxcclxuICAgIH0sXHJcbiAgICBOb0FjY291bnRJblNpbGVudFJlcXVlc3Q6IHtcclxuICAgICAgICBjb2RlOiBub0FjY291bnRJblNpbGVudFJlcXVlc3QsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbbm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0XSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQ2FjaGVSZWNvcmQ6IHtcclxuICAgICAgICBjb2RlOiBpbnZhbGlkQ2FjaGVSZWNvcmQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbaW52YWxpZENhY2hlUmVjb3JkXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudDoge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRDYWNoZUVudmlyb25tZW50LFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2ludmFsaWRDYWNoZUVudmlyb25tZW50XSxcclxuICAgIH0sXHJcbiAgICBub0FjY291bnRGb3VuZDoge1xyXG4gICAgICAgIGNvZGU6IG5vQWNjb3VudEZvdW5kLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW25vQWNjb3VudEZvdW5kXSxcclxuICAgIH0sXHJcbiAgICBub0NyeXB0b09iajoge1xyXG4gICAgICAgIGNvZGU6IG5vQ3J5cHRvT2JqZWN0LFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW25vQ3J5cHRvT2JqZWN0XSxcclxuICAgIH0sXHJcbiAgICB1bmV4cGVjdGVkQ3JlZGVudGlhbFR5cGU6IHtcclxuICAgICAgICBjb2RlOiB1bmV4cGVjdGVkQ3JlZGVudGlhbFR5cGUsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQXNzZXJ0aW9uOiB7XHJcbiAgICAgICAgY29kZTogaW52YWxpZEFzc2VydGlvbixcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tpbnZhbGlkQXNzZXJ0aW9uXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQ2xpZW50Q3JlZGVudGlhbDoge1xyXG4gICAgICAgIGNvZGU6IGludmFsaWRDbGllbnRDcmVkZW50aWFsLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2ludmFsaWRDbGllbnRDcmVkZW50aWFsXSxcclxuICAgIH0sXHJcbiAgICB0b2tlblJlZnJlc2hSZXF1aXJlZDoge1xyXG4gICAgICAgIGNvZGU6IHRva2VuUmVmcmVzaFJlcXVpcmVkLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW3Rva2VuUmVmcmVzaFJlcXVpcmVkXSxcclxuICAgIH0sXHJcbiAgICB1c2VyVGltZW91dFJlYWNoZWQ6IHtcclxuICAgICAgICBjb2RlOiB1c2VyVGltZW91dFJlYWNoZWQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbdXNlclRpbWVvdXRSZWFjaGVkXSxcclxuICAgIH0sXHJcbiAgICB0b2tlbkNsYWltc1JlcXVpcmVkOiB7XHJcbiAgICAgICAgY29kZTogdG9rZW5DbGFpbXNDbmZSZXF1aXJlZEZvclNpZ25lZEp3dCxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1t0b2tlbkNsYWltc0NuZlJlcXVpcmVkRm9yU2lnbmVkSnd0XSxcclxuICAgIH0sXHJcbiAgICBub0F1dGhvcml6YXRpb25Db2RlRnJvbVNlcnZlcjoge1xyXG4gICAgICAgIGNvZGU6IGF1dGhvcml6YXRpb25Db2RlTWlzc2luZ0Zyb21TZXJ2ZXJSZXNwb25zZSxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1thdXRob3JpemF0aW9uQ29kZU1pc3NpbmdGcm9tU2VydmVyUmVzcG9uc2VdLFxyXG4gICAgfSxcclxuICAgIGJpbmRpbmdLZXlOb3RSZW1vdmVkRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBiaW5kaW5nS2V5Tm90UmVtb3ZlZCxcclxuICAgICAgICBkZXNjOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tiaW5kaW5nS2V5Tm90UmVtb3ZlZF0sXHJcbiAgICB9LFxyXG4gICAgbG9nb3V0Tm90U3VwcG9ydGVkOiB7XHJcbiAgICAgICAgY29kZTogZW5kU2Vzc2lvbkVuZHBvaW50Tm90U3VwcG9ydGVkLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2VuZFNlc3Npb25FbmRwb2ludE5vdFN1cHBvcnRlZF0sXHJcbiAgICB9LFxyXG4gICAga2V5SWRNaXNzaW5nOiB7XHJcbiAgICAgICAgY29kZToga2V5SWRNaXNzaW5nLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2tleUlkTWlzc2luZ10sXHJcbiAgICB9LFxyXG4gICAgbm9OZXR3b3JrQ29ubmVjdGl2aXR5OiB7XHJcbiAgICAgICAgY29kZTogbm9OZXR3b3JrQ29ubmVjdGl2aXR5LFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW25vTmV0d29ya0Nvbm5lY3Rpdml0eV0sXHJcbiAgICB9LFxyXG4gICAgdXNlckNhbmNlbGVkRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiB1c2VyQ2FuY2VsZWQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbdXNlckNhbmNlbGVkXSxcclxuICAgIH0sXHJcbiAgICBtaXNzaW5nVGVuYW50SWRFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IG1pc3NpbmdUZW5hbnRJZEVycm9yLFxyXG4gICAgICAgIGRlc2M6IENsaWVudEF1dGhFcnJvck1lc3NhZ2VzW21pc3NpbmdUZW5hbnRJZEVycm9yXSxcclxuICAgIH0sXHJcbiAgICBuZXN0ZWRBcHBBdXRoQnJpZGdlRGlzYWJsZWQ6IHtcclxuICAgICAgICBjb2RlOiBuZXN0ZWRBcHBBdXRoQnJpZGdlRGlzYWJsZWQsXHJcbiAgICAgICAgZGVzYzogQ2xpZW50QXV0aEVycm9yTWVzc2FnZXNbbmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkXSxcclxuICAgIH0sXHJcbn07XHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgY2xpZW50IGNvZGUgcnVubmluZyBvbiB0aGUgYnJvd3Nlci5cclxuICovXHJcbmNsYXNzIENsaWVudEF1dGhFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUsIGFkZGl0aW9uYWxNZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIoZXJyb3JDb2RlLCBhZGRpdGlvbmFsTWVzc2FnZVxyXG4gICAgICAgICAgICA/IGAke0NsaWVudEF1dGhFcnJvck1lc3NhZ2VzW2Vycm9yQ29kZV19OiAke2FkZGl0aW9uYWxNZXNzYWdlfWBcclxuICAgICAgICAgICAgOiBDbGllbnRBdXRoRXJyb3JNZXNzYWdlc1tlcnJvckNvZGVdKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkNsaWVudEF1dGhFcnJvclwiO1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDbGllbnRBdXRoRXJyb3IucHJvdG90eXBlKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRBdXRoRXJyb3IoZXJyb3JDb2RlLCBhZGRpdGlvbmFsTWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoRXJyb3IoZXJyb3JDb2RlLCBhZGRpdGlvbmFsTWVzc2FnZSk7XHJcbn1cblxuZXhwb3J0IHsgQ2xpZW50QXV0aEVycm9yLCBDbGllbnRBdXRoRXJyb3JNZXNzYWdlLCBDbGllbnRBdXRoRXJyb3JNZXNzYWdlcywgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRBdXRoRXJyb3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGhhc2hOb3REZXNlcmlhbGl6ZWQgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFBhcnNlcyBoYXNoIHN0cmluZyBmcm9tIGdpdmVuIHN0cmluZy4gUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgbm8gaGFzaCBzeW1ib2wgaXMgZm91bmQuXHJcbiAqIEBwYXJhbSBoYXNoU3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdIYXNoT3JRdWVyeShyZXNwb25zZVN0cmluZykge1xyXG4gICAgaWYgKHJlc3BvbnNlU3RyaW5nLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZVN0cmluZy5zdWJzdHJpbmcoMik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChyZXNwb25zZVN0cmluZy5zdGFydHNXaXRoKFwiI1wiKSB8fFxyXG4gICAgICAgIHJlc3BvbnNlU3RyaW5nLnN0YXJ0c1dpdGgoXCI/XCIpKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlU3RyaW5nLnN1YnN0cmluZygxKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZVN0cmluZztcclxufVxyXG4vKipcclxuICogUmV0dXJucyBVUkwgaGFzaCBhcyBzZXJ2ZXIgYXV0aCBjb2RlIHJlc3BvbnNlIG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGdldERlc2VyaWFsaXplZFJlc3BvbnNlKHJlc3BvbnNlU3RyaW5nKSB7XHJcbiAgICAvLyBDaGVjayBpZiBnaXZlbiBoYXNoIGlzIGVtcHR5XHJcbiAgICBpZiAoIXJlc3BvbnNlU3RyaW5nIHx8IHJlc3BvbnNlU3RyaW5nLmluZGV4T2YoXCI9XCIpIDwgMCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBTdHJpcCB0aGUgIyBvciA/IHN5bWJvbCBpZiBwcmVzZW50XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc3BvbnNlID0gc3RyaXBMZWFkaW5nSGFzaE9yUXVlcnkocmVzcG9uc2VTdHJpbmcpO1xyXG4gICAgICAgIC8vIElmICMgc3ltYm9sIHdhcyBub3QgcHJlc2VudCwgYWJvdmUgd2lsbCByZXR1cm4gZW1wdHkgc3RyaW5nLCBzbyBnaXZlIG9yaWdpbmFsIGhhc2ggdmFsdWVcclxuICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZWRIYXNoID0gT2JqZWN0LmZyb21FbnRyaWVzKG5ldyBVUkxTZWFyY2hQYXJhbXMobm9ybWFsaXplZFJlc3BvbnNlKSk7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGtub3duIHJlc3BvbnNlIHByb3BlcnRpZXNcclxuICAgICAgICBpZiAoZGVzZXJpYWxpemVkSGFzaC5jb2RlIHx8XHJcbiAgICAgICAgICAgIGRlc2VyaWFsaXplZEhhc2guZXJyb3IgfHxcclxuICAgICAgICAgICAgZGVzZXJpYWxpemVkSGFzaC5lcnJvcl9kZXNjcmlwdGlvbiB8fFxyXG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWRIYXNoLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZWRIYXNoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGhhc2hOb3REZXNlcmlhbGl6ZWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cblxuZXhwb3J0IHsgZ2V0RGVzZXJpYWxpemVkUmVzcG9uc2UsIHN0cmlwTGVhZGluZ0hhc2hPclF1ZXJ5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VcmxVdGlscy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvci5tanMnO1xuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICcuLi91dGlscy9TdHJpbmdVdGlscy5tanMnO1xuaW1wb3J0IHsgQUFEQXV0aG9yaXR5Q29uc3RhbnRzLCBDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IGdldERlc2VyaWFsaXplZFJlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMvVXJsVXRpbHMubWpzJztcbmltcG9ydCB7IHVybEVtcHR5RXJyb3IsIHVybFBhcnNlRXJyb3IsIGF1dGhvcml0eVVyaUluc2VjdXJlIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBVcmwgb2JqZWN0IGNsYXNzIHdoaWNoIGNhbiBwZXJmb3JtIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIG9uIHVybCBzdHJpbmdzLlxyXG4gKi9cclxuY2xhc3MgVXJsU3RyaW5nIHtcclxuICAgIGdldCB1cmxTdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VybFN0cmluZztcclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKHVybCkge1xyXG4gICAgICAgIHRoaXMuX3VybFN0cmluZyA9IHVybDtcclxuICAgICAgICBpZiAoIXRoaXMuX3VybFN0cmluZykge1xyXG4gICAgICAgICAgICAvLyBUaHJvd3MgZXJyb3IgaWYgdXJsIGlzIGVtcHR5XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcih1cmxFbXB0eUVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF1cmwuaW5jbHVkZXMoXCIjXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VybFN0cmluZyA9IFVybFN0cmluZy5jYW5vbmljYWxpemVVcmkodXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZSB1cmxzIGFyZSBsb3dlciBjYXNlIGFuZCBlbmQgd2l0aCBhIC8gY2hhcmFjdGVyLlxyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY2Fub25pY2FsaXplVXJpKHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgbGV0IGxvd2VyQ2FzZVVybCA9IHVybC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGgobG93ZXJDYXNlVXJsLCBcIj9cIikpIHtcclxuICAgICAgICAgICAgICAgIGxvd2VyQ2FzZVVybCA9IGxvd2VyQ2FzZVVybC5zbGljZSgwLCAtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuZW5kc1dpdGgobG93ZXJDYXNlVXJsLCBcIj8vXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBsb3dlckNhc2VVcmwgPSBsb3dlckNhc2VVcmwuc2xpY2UoMCwgLTIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghU3RyaW5nVXRpbHMuZW5kc1dpdGgobG93ZXJDYXNlVXJsLCBcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIGxvd2VyQ2FzZVVybCArPSBcIi9cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbG93ZXJDYXNlVXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaHJvd3MgaWYgdXJsU3RyaW5nIHBhc3NlZCBpcyBub3QgYSB2YWxpZCBhdXRob3JpdHkgVVJJIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGVBc1VyaSgpIHtcclxuICAgICAgICAvLyBBdHRlbXB0cyB0byBwYXJzZSB1cmwgZm9yIHVyaSBjb21wb25lbnRzXHJcbiAgICAgICAgbGV0IGNvbXBvbmVudHM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29tcG9uZW50cyA9IHRoaXMuZ2V0VXJsQ29tcG9uZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IodXJsUGFyc2VFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRocm93IGVycm9yIGlmIFVSSSBvciBwYXRoIHNlZ21lbnRzIGFyZSBub3QgcGFyc2VhYmxlLlxyXG4gICAgICAgIGlmICghY29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgfHwgIWNvbXBvbmVudHMuUGF0aFNlZ21lbnRzKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcih1cmxQYXJzZUVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGhyb3cgZXJyb3IgaWYgdXJpIGlzIGluc2VjdXJlLlxyXG4gICAgICAgIGlmICghY29tcG9uZW50cy5Qcm90b2NvbCB8fFxyXG4gICAgICAgICAgICBjb21wb25lbnRzLlByb3RvY29sLnRvTG93ZXJDYXNlKCkgIT09IFwiaHR0cHM6XCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGF1dGhvcml0eVVyaUluc2VjdXJlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgdXJsIGFuZCBhIHF1ZXJ5IHN0cmluZyByZXR1cm4gdGhlIHVybCB3aXRoIHByb3ZpZGVkIHF1ZXJ5IHN0cmluZyBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhcHBlbmRRdWVyeVN0cmluZyh1cmwsIHF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFxdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdXJsLmluZGV4T2YoXCI/XCIpIDwgMFxyXG4gICAgICAgICAgICA/IGAke3VybH0/JHtxdWVyeVN0cmluZ31gXHJcbiAgICAgICAgICAgIDogYCR7dXJsfSYke3F1ZXJ5U3RyaW5nfWA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB1cmwgd2l0aCB0aGUgaGFzaCByZW1vdmVkXHJcbiAgICAgKiBAcGFyYW0gdXJsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZW1vdmVIYXNoRnJvbVVybCh1cmwpIHtcclxuICAgICAgICByZXR1cm4gVXJsU3RyaW5nLmNhbm9uaWNhbGl6ZVVyaSh1cmwuc3BsaXQoXCIjXCIpWzBdKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gYSB1cmwgbGlrZSBodHRwczovL2E6Yi9jb21tb24vZD9lPWYjZywgYW5kIGEgdGVuYW50SWQsIHJldHVybnMgaHR0cHM6Ly9hOmIvdGVuYW50SWQvZFxyXG4gICAgICogQHBhcmFtIGhyZWYgVGhlIHVybFxyXG4gICAgICogQHBhcmFtIHRlbmFudElkIFRoZSB0ZW5hbnQgaWQgdG8gcmVwbGFjZVxyXG4gICAgICovXHJcbiAgICByZXBsYWNlVGVuYW50UGF0aCh0ZW5hbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHRoaXMuZ2V0VXJsQ29tcG9uZW50cygpO1xyXG4gICAgICAgIGNvbnN0IHBhdGhBcnJheSA9IHVybE9iamVjdC5QYXRoU2VnbWVudHM7XHJcbiAgICAgICAgaWYgKHRlbmFudElkICYmXHJcbiAgICAgICAgICAgIHBhdGhBcnJheS5sZW5ndGggIT09IDAgJiZcclxuICAgICAgICAgICAgKHBhdGhBcnJheVswXSA9PT0gQUFEQXV0aG9yaXR5Q29uc3RhbnRzLkNPTU1PTiB8fFxyXG4gICAgICAgICAgICAgICAgcGF0aEFycmF5WzBdID09PSBBQURBdXRob3JpdHlDb25zdGFudHMuT1JHQU5JWkFUSU9OUykpIHtcclxuICAgICAgICAgICAgcGF0aEFycmF5WzBdID0gdGVuYW50SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBVcmxTdHJpbmcuY29uc3RydWN0QXV0aG9yaXR5VXJpRnJvbU9iamVjdCh1cmxPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgb3V0IHRoZSBjb21wb25lbnRzIGZyb20gYSB1cmwgc3RyaW5nLlxyXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHZhcmlvdXMgY29tcG9uZW50cy4gUGxlYXNlIGNhY2hlIHRoaXMgdmFsdWUgaW5zdGVkIG9mIGNhbGxpbmcgdGhpcyBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSB1cmwuXHJcbiAgICAgKi9cclxuICAgIGdldFVybENvbXBvbmVudHMoKSB7XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vY3VydGlzei8xMTEzOWIyY2ZjYWVmNGEyNjFlMFxyXG4gICAgICAgIGNvbnN0IHJlZ0V4ID0gUmVnRXhwKFwiXigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcXFxcPyhbXiNdKikpPygjKC4qKSk/XCIpO1xyXG4gICAgICAgIC8vIElmIHVybCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggcmVnRXgsIHdlIHRocm93IGFuIGVycm9yXHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnVybFN0cmluZy5tYXRjaChyZWdFeCk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IodXJsUGFyc2VFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVybCBjb21wb25lbnQgb2JqZWN0XHJcbiAgICAgICAgY29uc3QgdXJsQ29tcG9uZW50cyA9IHtcclxuICAgICAgICAgICAgUHJvdG9jb2w6IG1hdGNoWzFdLFxyXG4gICAgICAgICAgICBIb3N0TmFtZUFuZFBvcnQ6IG1hdGNoWzRdLFxyXG4gICAgICAgICAgICBBYnNvbHV0ZVBhdGg6IG1hdGNoWzVdLFxyXG4gICAgICAgICAgICBRdWVyeVN0cmluZzogbWF0Y2hbN10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgcGF0aFNlZ21lbnRzID0gdXJsQ29tcG9uZW50cy5BYnNvbHV0ZVBhdGguc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgIHBhdGhTZWdtZW50cyA9IHBhdGhTZWdtZW50cy5maWx0ZXIoKHZhbCkgPT4gdmFsICYmIHZhbC5sZW5ndGggPiAwKTsgLy8gcmVtb3ZlIGVtcHR5IGVsZW1lbnRzXHJcbiAgICAgICAgdXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHMgPSBwYXRoU2VnbWVudHM7XHJcbiAgICAgICAgaWYgKHVybENvbXBvbmVudHMuUXVlcnlTdHJpbmcgJiZcclxuICAgICAgICAgICAgdXJsQ29tcG9uZW50cy5RdWVyeVN0cmluZy5lbmRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICAgICAgdXJsQ29tcG9uZW50cy5RdWVyeVN0cmluZyA9IHVybENvbXBvbmVudHMuUXVlcnlTdHJpbmcuc3Vic3RyaW5nKDAsIHVybENvbXBvbmVudHMuUXVlcnlTdHJpbmcubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1cmxDb21wb25lbnRzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldERvbWFpbkZyb21VcmwodXJsKSB7XHJcbiAgICAgICAgY29uc3QgcmVnRXggPSBSZWdFeHAoXCJeKFteOi8/I10rOi8vKT8oW14vPyNdKilcIik7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2gocmVnRXgpO1xyXG4gICAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKHVybFBhcnNlRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hbMl07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0QWJzb2x1dGVVcmwocmVsYXRpdmVVcmwsIGJhc2VVcmwpIHtcclxuICAgICAgICBpZiAocmVsYXRpdmVVcmxbMF0gPT09IENvbnN0YW50cy5GT1JXQVJEX1NMQVNIKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVcmxTdHJpbmcoYmFzZVVybCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb21wb25lbnRzID0gdXJsLmdldFVybENvbXBvbmVudHMoKTtcclxuICAgICAgICAgICAgcmV0dXJuIChiYXNlQ29tcG9uZW50cy5Qcm90b2NvbCArXHJcbiAgICAgICAgICAgICAgICBcIi8vXCIgK1xyXG4gICAgICAgICAgICAgICAgYmFzZUNvbXBvbmVudHMuSG9zdE5hbWVBbmRQb3J0ICtcclxuICAgICAgICAgICAgICAgIHJlbGF0aXZlVXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlVXJsO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNvbnN0cnVjdEF1dGhvcml0eVVyaUZyb21PYmplY3QodXJsT2JqZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVcmxTdHJpbmcodXJsT2JqZWN0LlByb3RvY29sICtcclxuICAgICAgICAgICAgXCIvL1wiICtcclxuICAgICAgICAgICAgdXJsT2JqZWN0Lkhvc3ROYW1lQW5kUG9ydCArXHJcbiAgICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgICAgdXJsT2JqZWN0LlBhdGhTZWdtZW50cy5qb2luKFwiL1wiKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIHRoZSBoYXNoIG9mIHRoZSBVUkwgc3RyaW5nIGNvbnRhaW5zIGtub3duIHByb3BlcnRpZXNcclxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoYXNoQ29udGFpbnNLbm93blByb3BlcnRpZXMocmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gISFnZXREZXNlcmlhbGl6ZWRSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgVXJsU3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VcmxTdHJpbmcubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFdyYXBzIGEgZnVuY3Rpb24gd2l0aCBhIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50LlxyXG4gKiBVc2FnZTogaW52b2tlKGZ1bmN0aW9uVG9DYWxsLCBwZXJmb3JtYW5jZUNsaWVudCwgXCJFdmVudE5hbWVcIiwgXCJjb3JyZWxhdGlvbklkXCIpKC4uLmFyZ3NUb1Bhc3NUb0Z1bmN0aW9uKVxyXG4gKiBAcGFyYW0gY2FsbGJhY2tcclxuICogQHBhcmFtIGV2ZW50TmFtZVxyXG4gKiBAcGFyYW0gbG9nZ2VyXHJcbiAqIEBwYXJhbSB0ZWxlbWV0cnlDbGllbnRcclxuICogQHBhcmFtIGNvcnJlbGF0aW9uSWRcclxuICogQHJldHVybnNcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5jb25zdCBpbnZva2UgPSAoY2FsbGJhY2ssIGV2ZW50TmFtZSwgbG9nZ2VyLCB0ZWxlbWV0cnlDbGllbnQsIGNvcnJlbGF0aW9uSWQpID0+IHtcclxuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgIGxvZ2dlci50cmFjZShgRXhlY3V0aW5nIGZ1bmN0aW9uICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgIGNvbnN0IGluUHJvZ3Jlc3NFdmVudCA9IHRlbGVtZXRyeUNsaWVudD8uc3RhcnRNZWFzdXJlbWVudChldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyYWNrIG51bWJlciBvZiB0aW1lcyB0aGlzIEFQSSBpcyBjYWxsZWQgaW4gYSBzaW5nbGUgcmVxdWVzdFxyXG4gICAgICAgICAgICBjb25zdCBldmVudENvdW50ID0gZXZlbnROYW1lICsgXCJDYWxsQ291bnRcIjtcclxuICAgICAgICAgICAgdGVsZW1ldHJ5Q2xpZW50Py5pbmNyZW1lbnRGaWVsZHMoeyBbZXZlbnRDb3VudF06IDEgfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICBpblByb2dyZXNzRXZlbnQ/LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGBSZXR1cm5pbmcgcmVzdWx0IGZyb20gJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShgRXJyb3Igb2NjdXJyZWQgaW4gJHtldmVudE5hbWV9YCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoSlNPTi5zdHJpbmdpZnkoZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJVbmFibGUgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5Qcm9ncmVzc0V2ZW50Py5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn07XHJcbi8qKlxyXG4gKiBXcmFwcyBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIGEgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQuXHJcbiAqIFVzYWdlOiBpbnZva2VBc3luYyhmdW5jdGlvblRvQ2FsbCwgcGVyZm9ybWFuY2VDbGllbnQsIFwiRXZlbnROYW1lXCIsIFwiY29ycmVsYXRpb25JZFwiKSguLi5hcmdzVG9QYXNzVG9GdW5jdGlvbilcclxuICogQHBhcmFtIGNhbGxiYWNrXHJcbiAqIEBwYXJhbSBldmVudE5hbWVcclxuICogQHBhcmFtIGxvZ2dlclxyXG4gKiBAcGFyYW0gdGVsZW1ldHJ5Q2xpZW50XHJcbiAqIEBwYXJhbSBjb3JyZWxhdGlvbklkXHJcbiAqIEByZXR1cm5zXHJcbiAqIEBpbnRlcm5hbFxyXG4gKlxyXG4gKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuY29uc3QgaW52b2tlQXN5bmMgPSAoY2FsbGJhY2ssIGV2ZW50TmFtZSwgbG9nZ2VyLCB0ZWxlbWV0cnlDbGllbnQsIGNvcnJlbGF0aW9uSWQpID0+IHtcclxuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICAgIGxvZ2dlci50cmFjZShgRXhlY3V0aW5nIGZ1bmN0aW9uICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgIGNvbnN0IGluUHJvZ3Jlc3NFdmVudCA9IHRlbGVtZXRyeUNsaWVudD8uc3RhcnRNZWFzdXJlbWVudChldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyYWNrIG51bWJlciBvZiB0aW1lcyB0aGlzIEFQSSBpcyBjYWxsZWQgaW4gYSBzaW5nbGUgcmVxdWVzdFxyXG4gICAgICAgICAgICBjb25zdCBldmVudENvdW50ID0gZXZlbnROYW1lICsgXCJDYWxsQ291bnRcIjtcclxuICAgICAgICAgICAgdGVsZW1ldHJ5Q2xpZW50Py5pbmNyZW1lbnRGaWVsZHMoeyBbZXZlbnRDb3VudF06IDEgfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRlbGVtZXRyeUNsaWVudD8uc2V0UHJlUXVldWVUaW1lKGV2ZW50TmFtZSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKC4uLmFyZ3MpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoYFJldHVybmluZyByZXN1bHQgZnJvbSAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgICAgaW5Qcm9ncmVzc0V2ZW50Py5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKGBFcnJvciBvY2N1cnJlZCBpbiAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShKU09OLnN0cmluZ2lmeShlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcIlVuYWJsZSB0byBwcmludCBlcnJvciBtZXNzYWdlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpblByb2dyZXNzRXZlbnQ/LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgfSwgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59O1xuXG5leHBvcnQgeyBpbnZva2UsIGludm9rZUFzeW5jIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdW5jdGlvbldyYXBwZXJzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IHBrY2VOb3RDcmVhdGVkID0gXCJwa2NlX25vdF9jcmVhdGVkXCI7XHJcbmNvbnN0IGNyeXB0b05vbkV4aXN0ZW50ID0gXCJjcnlwdG9fbm9uZXhpc3RlbnRcIjtcclxuY29uc3QgZW1wdHlOYXZpZ2F0ZVVyaSA9IFwiZW1wdHlfbmF2aWdhdGVfdXJpXCI7XHJcbmNvbnN0IGhhc2hFbXB0eUVycm9yID0gXCJoYXNoX2VtcHR5X2Vycm9yXCI7XHJcbmNvbnN0IG5vU3RhdGVJbkhhc2ggPSBcIm5vX3N0YXRlX2luX2hhc2hcIjtcclxuY29uc3QgaGFzaERvZXNOb3RDb250YWluS25vd25Qcm9wZXJ0aWVzID0gXCJoYXNoX2RvZXNfbm90X2NvbnRhaW5fa25vd25fcHJvcGVydGllc1wiO1xyXG5jb25zdCB1bmFibGVUb1BhcnNlU3RhdGUgPSBcInVuYWJsZV90b19wYXJzZV9zdGF0ZVwiO1xyXG5jb25zdCBzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoID0gXCJzdGF0ZV9pbnRlcmFjdGlvbl90eXBlX21pc21hdGNoXCI7XHJcbmNvbnN0IGludGVyYWN0aW9uSW5Qcm9ncmVzcyA9IFwiaW50ZXJhY3Rpb25faW5fcHJvZ3Jlc3NcIjtcclxuY29uc3QgcG9wdXBXaW5kb3dFcnJvciA9IFwicG9wdXBfd2luZG93X2Vycm9yXCI7XHJcbmNvbnN0IGVtcHR5V2luZG93RXJyb3IgPSBcImVtcHR5X3dpbmRvd19lcnJvclwiO1xyXG5jb25zdCB1c2VyQ2FuY2VsbGVkID0gXCJ1c2VyX2NhbmNlbGxlZFwiO1xyXG5jb25zdCBtb25pdG9yUG9wdXBUaW1lb3V0ID0gXCJtb25pdG9yX3BvcHVwX3RpbWVvdXRcIjtcclxuY29uc3QgbW9uaXRvcldpbmRvd1RpbWVvdXQgPSBcIm1vbml0b3Jfd2luZG93X3RpbWVvdXRcIjtcclxuY29uc3QgcmVkaXJlY3RJbklmcmFtZSA9IFwicmVkaXJlY3RfaW5faWZyYW1lXCI7XHJcbmNvbnN0IGJsb2NrSWZyYW1lUmVsb2FkID0gXCJibG9ja19pZnJhbWVfcmVsb2FkXCI7XHJcbmNvbnN0IGJsb2NrTmVzdGVkUG9wdXBzID0gXCJibG9ja19uZXN0ZWRfcG9wdXBzXCI7XHJcbmNvbnN0IGlmcmFtZUNsb3NlZFByZW1hdHVyZWx5ID0gXCJpZnJhbWVfY2xvc2VkX3ByZW1hdHVyZWx5XCI7XHJcbmNvbnN0IHNpbGVudExvZ291dFVuc3VwcG9ydGVkID0gXCJzaWxlbnRfbG9nb3V0X3Vuc3VwcG9ydGVkXCI7XHJcbmNvbnN0IG5vQWNjb3VudEVycm9yID0gXCJub19hY2NvdW50X2Vycm9yXCI7XHJcbmNvbnN0IHNpbGVudFByb21wdFZhbHVlRXJyb3IgPSBcInNpbGVudF9wcm9tcHRfdmFsdWVfZXJyb3JcIjtcclxuY29uc3Qgbm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yID0gXCJub190b2tlbl9yZXF1ZXN0X2NhY2hlX2Vycm9yXCI7XHJcbmNvbnN0IHVuYWJsZVRvUGFyc2VUb2tlblJlcXVlc3RDYWNoZUVycm9yID0gXCJ1bmFibGVfdG9fcGFyc2VfdG9rZW5fcmVxdWVzdF9jYWNoZV9lcnJvclwiO1xyXG5jb25zdCBub0NhY2hlZEF1dGhvcml0eUVycm9yID0gXCJub19jYWNoZWRfYXV0aG9yaXR5X2Vycm9yXCI7XHJcbmNvbnN0IGF1dGhSZXF1ZXN0Tm90U2V0RXJyb3IgPSBcImF1dGhfcmVxdWVzdF9ub3Rfc2V0X2Vycm9yXCI7XHJcbmNvbnN0IGludmFsaWRDYWNoZVR5cGUgPSBcImludmFsaWRfY2FjaGVfdHlwZVwiO1xyXG5jb25zdCBub25Ccm93c2VyRW52aXJvbm1lbnQgPSBcIm5vbl9icm93c2VyX2Vudmlyb25tZW50XCI7XHJcbmNvbnN0IGRhdGFiYXNlTm90T3BlbiA9IFwiZGF0YWJhc2Vfbm90X29wZW5cIjtcclxuY29uc3Qgbm9OZXR3b3JrQ29ubmVjdGl2aXR5ID0gXCJub19uZXR3b3JrX2Nvbm5lY3Rpdml0eVwiO1xyXG5jb25zdCBwb3N0UmVxdWVzdEZhaWxlZCA9IFwicG9zdF9yZXF1ZXN0X2ZhaWxlZFwiO1xyXG5jb25zdCBnZXRSZXF1ZXN0RmFpbGVkID0gXCJnZXRfcmVxdWVzdF9mYWlsZWRcIjtcclxuY29uc3QgZmFpbGVkVG9QYXJzZVJlc3BvbnNlID0gXCJmYWlsZWRfdG9fcGFyc2VfcmVzcG9uc2VcIjtcclxuY29uc3QgdW5hYmxlVG9Mb2FkVG9rZW4gPSBcInVuYWJsZV90b19sb2FkX3Rva2VuXCI7XHJcbmNvbnN0IGNyeXB0b0tleU5vdEZvdW5kID0gXCJjcnlwdG9fa2V5X25vdF9mb3VuZFwiO1xyXG5jb25zdCBhdXRoQ29kZVJlcXVpcmVkID0gXCJhdXRoX2NvZGVfcmVxdWlyZWRcIjtcclxuY29uc3QgYXV0aENvZGVPck5hdGl2ZUFjY291bnRJZFJlcXVpcmVkID0gXCJhdXRoX2NvZGVfb3JfbmF0aXZlQWNjb3VudElkX3JlcXVpcmVkXCI7XHJcbmNvbnN0IHNwYUNvZGVBbmROYXRpdmVBY2NvdW50SWRQcmVzZW50ID0gXCJzcGFfY29kZV9hbmRfbmF0aXZlQWNjb3VudElkX3ByZXNlbnRcIjtcclxuY29uc3QgZGF0YWJhc2VVbmF2YWlsYWJsZSA9IFwiZGF0YWJhc2VfdW5hdmFpbGFibGVcIjtcclxuY29uc3QgdW5hYmxlVG9BY3F1aXJlVG9rZW5Gcm9tTmF0aXZlUGxhdGZvcm0gPSBcInVuYWJsZV90b19hY3F1aXJlX3Rva2VuX2Zyb21fbmF0aXZlX3BsYXRmb3JtXCI7XHJcbmNvbnN0IG5hdGl2ZUhhbmRzaGFrZVRpbWVvdXQgPSBcIm5hdGl2ZV9oYW5kc2hha2VfdGltZW91dFwiO1xyXG5jb25zdCBuYXRpdmVFeHRlbnNpb25Ob3RJbnN0YWxsZWQgPSBcIm5hdGl2ZV9leHRlbnNpb25fbm90X2luc3RhbGxlZFwiO1xyXG5jb25zdCBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQgPSBcIm5hdGl2ZV9jb25uZWN0aW9uX25vdF9lc3RhYmxpc2hlZFwiO1xyXG5jb25zdCB1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb24gPSBcInVuaW5pdGlhbGl6ZWRfcHVibGljX2NsaWVudF9hcHBsaWNhdGlvblwiO1xyXG5jb25zdCBuYXRpdmVQcm9tcHROb3RTdXBwb3J0ZWQgPSBcIm5hdGl2ZV9wcm9tcHRfbm90X3N1cHBvcnRlZFwiO1xyXG5jb25zdCBpbnZhbGlkQmFzZTY0U3RyaW5nID0gXCJpbnZhbGlkX2Jhc2U2NF9zdHJpbmdcIjtcclxuY29uc3QgaW52YWxpZFBvcFRva2VuUmVxdWVzdCA9IFwiaW52YWxpZF9wb3BfdG9rZW5fcmVxdWVzdFwiO1xyXG5jb25zdCBmYWlsZWRUb0J1aWxkSGVhZGVycyA9IFwiZmFpbGVkX3RvX2J1aWxkX2hlYWRlcnNcIjtcclxuY29uc3QgZmFpbGVkVG9QYXJzZUhlYWRlcnMgPSBcImZhaWxlZF90b19wYXJzZV9oZWFkZXJzXCI7XG5cbmV4cG9ydCB7IGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50SWRSZXF1aXJlZCwgYXV0aENvZGVSZXF1aXJlZCwgYXV0aFJlcXVlc3ROb3RTZXRFcnJvciwgYmxvY2tJZnJhbWVSZWxvYWQsIGJsb2NrTmVzdGVkUG9wdXBzLCBjcnlwdG9LZXlOb3RGb3VuZCwgY3J5cHRvTm9uRXhpc3RlbnQsIGRhdGFiYXNlTm90T3BlbiwgZGF0YWJhc2VVbmF2YWlsYWJsZSwgZW1wdHlOYXZpZ2F0ZVVyaSwgZW1wdHlXaW5kb3dFcnJvciwgZmFpbGVkVG9CdWlsZEhlYWRlcnMsIGZhaWxlZFRvUGFyc2VIZWFkZXJzLCBmYWlsZWRUb1BhcnNlUmVzcG9uc2UsIGdldFJlcXVlc3RGYWlsZWQsIGhhc2hEb2VzTm90Q29udGFpbktub3duUHJvcGVydGllcywgaGFzaEVtcHR5RXJyb3IsIGlmcmFtZUNsb3NlZFByZW1hdHVyZWx5LCBpbnRlcmFjdGlvbkluUHJvZ3Jlc3MsIGludmFsaWRCYXNlNjRTdHJpbmcsIGludmFsaWRDYWNoZVR5cGUsIGludmFsaWRQb3BUb2tlblJlcXVlc3QsIG1vbml0b3JQb3B1cFRpbWVvdXQsIG1vbml0b3JXaW5kb3dUaW1lb3V0LCBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQsIG5hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZCwgbmF0aXZlSGFuZHNoYWtlVGltZW91dCwgbmF0aXZlUHJvbXB0Tm90U3VwcG9ydGVkLCBub0FjY291bnRFcnJvciwgbm9DYWNoZWRBdXRob3JpdHlFcnJvciwgbm9OZXR3b3JrQ29ubmVjdGl2aXR5LCBub1N0YXRlSW5IYXNoLCBub1Rva2VuUmVxdWVzdENhY2hlRXJyb3IsIG5vbkJyb3dzZXJFbnZpcm9ubWVudCwgcGtjZU5vdENyZWF0ZWQsIHBvcHVwV2luZG93RXJyb3IsIHBvc3RSZXF1ZXN0RmFpbGVkLCByZWRpcmVjdEluSWZyYW1lLCBzaWxlbnRMb2dvdXRVbnN1cHBvcnRlZCwgc2lsZW50UHJvbXB0VmFsdWVFcnJvciwgc3BhQ29kZUFuZE5hdGl2ZUFjY291bnRJZFByZXNlbnQsIHN0YXRlSW50ZXJhY3Rpb25UeXBlTWlzbWF0Y2gsIHVuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtLCB1bmFibGVUb0xvYWRUb2tlbiwgdW5hYmxlVG9QYXJzZVN0YXRlLCB1bmFibGVUb1BhcnNlVG9rZW5SZXF1ZXN0Q2FjaGVFcnJvciwgdW5pbml0aWFsaXplZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLCB1c2VyQ2FuY2VsbGVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBwa2NlTm90Q3JlYXRlZCwgY3J5cHRvTm9uRXhpc3RlbnQsIGVtcHR5TmF2aWdhdGVVcmksIGhhc2hFbXB0eUVycm9yLCBub1N0YXRlSW5IYXNoLCBoYXNoRG9lc05vdENvbnRhaW5Lbm93blByb3BlcnRpZXMsIHVuYWJsZVRvUGFyc2VTdGF0ZSwgc3RhdGVJbnRlcmFjdGlvblR5cGVNaXNtYXRjaCwgaW50ZXJhY3Rpb25JblByb2dyZXNzLCBwb3B1cFdpbmRvd0Vycm9yLCBlbXB0eVdpbmRvd0Vycm9yLCB1c2VyQ2FuY2VsbGVkLCBtb25pdG9yUG9wdXBUaW1lb3V0LCBtb25pdG9yV2luZG93VGltZW91dCwgcmVkaXJlY3RJbklmcmFtZSwgYmxvY2tJZnJhbWVSZWxvYWQsIGJsb2NrTmVzdGVkUG9wdXBzLCBpZnJhbWVDbG9zZWRQcmVtYXR1cmVseSwgc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWQsIG5vQWNjb3VudEVycm9yLCBzaWxlbnRQcm9tcHRWYWx1ZUVycm9yLCBub1Rva2VuUmVxdWVzdENhY2hlRXJyb3IsIHVuYWJsZVRvUGFyc2VUb2tlblJlcXVlc3RDYWNoZUVycm9yLCBub0NhY2hlZEF1dGhvcml0eUVycm9yLCBhdXRoUmVxdWVzdE5vdFNldEVycm9yLCBpbnZhbGlkQ2FjaGVUeXBlLCBub25Ccm93c2VyRW52aXJvbm1lbnQsIGRhdGFiYXNlTm90T3Blbiwgbm9OZXR3b3JrQ29ubmVjdGl2aXR5LCBwb3N0UmVxdWVzdEZhaWxlZCwgZ2V0UmVxdWVzdEZhaWxlZCwgZmFpbGVkVG9QYXJzZVJlc3BvbnNlLCB1bmFibGVUb0xvYWRUb2tlbiwgY3J5cHRvS2V5Tm90Rm91bmQsIGF1dGhDb2RlUmVxdWlyZWQsIGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50SWRSZXF1aXJlZCwgc3BhQ29kZUFuZE5hdGl2ZUFjY291bnRJZFByZXNlbnQsIGRhdGFiYXNlVW5hdmFpbGFibGUsIHVuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtLCBuYXRpdmVIYW5kc2hha2VUaW1lb3V0LCBuYXRpdmVFeHRlbnNpb25Ob3RJbnN0YWxsZWQsIG5hdGl2ZUNvbm5lY3Rpb25Ob3RFc3RhYmxpc2hlZCwgdW5pbml0aWFsaXplZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLCBuYXRpdmVQcm9tcHROb3RTdXBwb3J0ZWQsIGludmFsaWRCYXNlNjRTdHJpbmcsIGludmFsaWRQb3BUb2tlblJlcXVlc3QsIGZhaWxlZFRvQnVpbGRIZWFkZXJzLCBmYWlsZWRUb1BhcnNlSGVhZGVycyB9IGZyb20gJy4vQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgKiBhcyBCcm93c2VyQXV0aEVycm9yQ29kZXMgZnJvbSAnLi9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IEJyb3dzZXJBdXRoRXJyb3JDb2RlcyB9O1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgRXJyb3JMaW5rID0gXCJGb3IgbW9yZSB2aXNpdDogYWthLm1zL21zYWxqcy9icm93c2VyLWVycm9yc1wiO1xyXG4vKipcclxuICogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2UgY2xhc3MgY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYnkgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzLlxyXG4gKi9cclxuY29uc3QgQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzID0ge1xyXG4gICAgW3BrY2VOb3RDcmVhdGVkXTogXCJUaGUgUEtDRSBjb2RlIGNoYWxsZW5nZSBhbmQgdmVyaWZpZXIgY291bGQgbm90IGJlIGdlbmVyYXRlZC5cIixcclxuICAgIFtjcnlwdG9Ob25FeGlzdGVudF06IFwiVGhlIGNyeXB0byBvYmplY3Qgb3IgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS5cIixcclxuICAgIFtlbXB0eU5hdmlnYXRlVXJpXTogXCJOYXZpZ2F0aW9uIFVSSSBpcyBlbXB0eS4gUGxlYXNlIGNoZWNrIHN0YWNrIHRyYWNlIGZvciBtb3JlIGluZm8uXCIsXHJcbiAgICBbaGFzaEVtcHR5RXJyb3JdOiBgSGFzaCB2YWx1ZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2UgaXQgaXMgZW1wdHkuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjbGVhcmluZyB0aGUgaGFzaC4gJHtFcnJvckxpbmt9YCxcclxuICAgIFtub1N0YXRlSW5IYXNoXTogXCJIYXNoIGRvZXMgbm90IGNvbnRhaW4gc3RhdGUuIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gbXNhbC5cIixcclxuICAgIFtoYXNoRG9lc05vdENvbnRhaW5Lbm93blByb3BlcnRpZXNdOiBgSGFzaCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3Blcml0ZXMuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjaGFuZ2luZyB0aGUgaGFzaC4gICR7RXJyb3JMaW5rfWAsXHJcbiAgICBbdW5hYmxlVG9QYXJzZVN0YXRlXTogXCJVbmFibGUgdG8gcGFyc2Ugc3RhdGUuIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gbXNhbC5cIixcclxuICAgIFtzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoXTogXCJIYXNoIGNvbnRhaW5zIHN0YXRlIGJ1dCB0aGUgaW50ZXJhY3Rpb24gdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbGVyLlwiLFxyXG4gICAgW2ludGVyYWN0aW9uSW5Qcm9ncmVzc106IGBJbnRlcmFjdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuIFBsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIGludGVyYWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyBhbiBpbnRlcmFjdGl2ZSBBUEkuICAgJHtFcnJvckxpbmt9YCxcclxuICAgIFtwb3B1cFdpbmRvd0Vycm9yXTogXCJFcnJvciBvcGVuaW5nIHBvcHVwIHdpbmRvdy4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgSUUgb3IgaWYgcG9wdXBzIGFyZSBibG9ja2VkIGluIHRoZSBicm93c2VyLlwiLFxyXG4gICAgW2VtcHR5V2luZG93RXJyb3JdOiBcIndpbmRvdy5vcGVuIHJldHVybmVkIG51bGwgb3IgdW5kZWZpbmVkIHdpbmRvdyBvYmplY3QuXCIsXHJcbiAgICBbdXNlckNhbmNlbGxlZF06IFwiVXNlciBjYW5jZWxsZWQgdGhlIGZsb3cuXCIsXHJcbiAgICBbbW9uaXRvclBvcHVwVGltZW91dF06IGBUb2tlbiBhY3F1aXNpdGlvbiBpbiBwb3B1cCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQuICAke0Vycm9yTGlua31gLFxyXG4gICAgW21vbml0b3JXaW5kb3dUaW1lb3V0XTogYFRva2VuIGFjcXVpc2l0aW9uIGluIGlmcmFtZSBmYWlsZWQgZHVlIHRvIHRpbWVvdXQuICAke0Vycm9yTGlua31gLFxyXG4gICAgW3JlZGlyZWN0SW5JZnJhbWVdOiBcIlJlZGlyZWN0cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaWZyYW1lZCBvciBicm9rZXJlZCBhcHBsaWNhdGlvbnMuIFBsZWFzZSBlbnN1cmUgeW91IGFyZSB1c2luZyBNU0FMLmpzIGluIGEgdG9wIGZyYW1lIG9mIHRoZSB3aW5kb3cgaWYgdXNpbmcgdGhlIHJlZGlyZWN0IEFQSXMsIG9yIHVzZSB0aGUgcG9wdXAgQVBJcy5cIixcclxuICAgIFtibG9ja0lmcmFtZVJlbG9hZF06IGBSZXF1ZXN0IHdhcyBibG9ja2VkIGluc2lkZSBhbiBpZnJhbWUgYmVjYXVzZSBNU0FMIGRldGVjdGVkIGFuIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlLiAgJHtFcnJvckxpbmt9YCxcclxuICAgIFtibG9ja05lc3RlZFBvcHVwc106IFwiUmVxdWVzdCB3YXMgYmxvY2tlZCBpbnNpZGUgYSBwb3B1cCBiZWNhdXNlIE1TQUwgZGV0ZWN0ZWQgaXQgd2FzIHJ1bm5pbmcgaW4gYSBwb3B1cC5cIixcclxuICAgIFtpZnJhbWVDbG9zZWRQcmVtYXR1cmVseV06IFwiVGhlIGlmcmFtZSBiZWluZyBtb25pdG9yZWQgd2FzIGNsb3NlZCBwcmVtYXR1cmVseS5cIixcclxuICAgIFtzaWxlbnRMb2dvdXRVbnN1cHBvcnRlZF06IFwiU2lsZW50IGxvZ291dCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgY2FsbCBsb2dvdXRSZWRpcmVjdCBvciBsb2dvdXRQb3B1cCBpbnN0ZWFkLlwiLFxyXG4gICAgW25vQWNjb3VudEVycm9yXTogXCJObyBhY2NvdW50IG9iamVjdCBwcm92aWRlZCB0byBhY3F1aXJlVG9rZW5TaWxlbnQgYW5kIG5vIGFjdGl2ZSBhY2NvdW50IGhhcyBiZWVuIHNldC4gUGxlYXNlIGNhbGwgc2V0QWN0aXZlQWNjb3VudCBvciBwcm92aWRlIGFuIGFjY291bnQgb24gdGhlIHJlcXVlc3QuXCIsXHJcbiAgICBbc2lsZW50UHJvbXB0VmFsdWVFcnJvcl06IFwiVGhlIHZhbHVlIGdpdmVuIGZvciB0aGUgcHJvbXB0IHZhbHVlIGlzIG5vdCB2YWxpZCBmb3Igc2lsZW50IHJlcXVlc3RzIC0gbXVzdCBiZSBzZXQgdG8gJ25vbmUnIG9yICdub19zZXNzaW9uJy5cIixcclxuICAgIFtub1Rva2VuUmVxdWVzdENhY2hlRXJyb3JdOiBcIk5vIHRva2VuIHJlcXVlc3QgZm91bmQgaW4gY2FjaGUuXCIsXHJcbiAgICBbdW5hYmxlVG9QYXJzZVRva2VuUmVxdWVzdENhY2hlRXJyb3JdOiBcIlRoZSBjYWNoZWQgdG9rZW4gcmVxdWVzdCBjb3VsZCBub3QgYmUgcGFyc2VkLlwiLFxyXG4gICAgW25vQ2FjaGVkQXV0aG9yaXR5RXJyb3JdOiBcIk5vIGNhY2hlZCBhdXRob3JpdHkgZm91bmQuXCIsXHJcbiAgICBbYXV0aFJlcXVlc3ROb3RTZXRFcnJvcl06IFwiQXV0aCBSZXF1ZXN0IG5vdCBzZXQuIFBsZWFzZSBlbnN1cmUgaW5pdGlhdGVBdXRoUmVxdWVzdCB3YXMgY2FsbGVkIGZyb20gdGhlIEludGVyYWN0aW9uSGFuZGxlclwiLFxyXG4gICAgW2ludmFsaWRDYWNoZVR5cGVdOiBcIkludmFsaWQgY2FjaGUgdHlwZVwiLFxyXG4gICAgW25vbkJyb3dzZXJFbnZpcm9ubWVudF06IFwiTG9naW4gYW5kIHRva2VuIHJlcXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cIixcclxuICAgIFtkYXRhYmFzZU5vdE9wZW5dOiBcIkRhdGFiYXNlIGlzIG5vdCBvcGVuIVwiLFxyXG4gICAgW25vTmV0d29ya0Nvbm5lY3Rpdml0eV06IFwiTm8gbmV0d29yayBjb25uZWN0aXZpdHkuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi5cIixcclxuICAgIFtwb3N0UmVxdWVzdEZhaWxlZF06IFwiTmV0d29yayByZXF1ZXN0IGZhaWxlZDogSWYgdGhlIGJyb3dzZXIgdGhyZXcgYSBDT1JTIGVycm9yLCBjaGVjayB0aGF0IHRoZSByZWRpcmVjdFVyaSBpcyByZWdpc3RlcmVkIGluIHRoZSBBenVyZSBBcHAgUG9ydGFsIGFzIHR5cGUgJ1NQQSdcIixcclxuICAgIFtnZXRSZXF1ZXN0RmFpbGVkXTogXCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkLiBQbGVhc2UgY2hlY2sgdGhlIG5ldHdvcmsgdHJhY2UgdG8gZGV0ZXJtaW5lIHJvb3QgY2F1c2UuXCIsXHJcbiAgICBbZmFpbGVkVG9QYXJzZVJlc3BvbnNlXTogXCJGYWlsZWQgdG8gcGFyc2UgbmV0d29yayByZXNwb25zZS4gQ2hlY2sgbmV0d29yayB0cmFjZS5cIixcclxuICAgIFt1bmFibGVUb0xvYWRUb2tlbl06IFwiRXJyb3IgbG9hZGluZyB0b2tlbiB0byBjYWNoZS5cIixcclxuICAgIFtjcnlwdG9LZXlOb3RGb3VuZF06IFwiQ3J5cHRvZ3JhcGhpYyBLZXkgb3IgS2V5cGFpciBub3QgZm91bmQgaW4gYnJvd3NlciBzdG9yYWdlLlwiLFxyXG4gICAgW2F1dGhDb2RlUmVxdWlyZWRdOiBcIkFuIGF1dGhvcml6YXRpb24gY29kZSBtdXN0IGJlIHByb3ZpZGVkIChhcyB0aGUgYGNvZGVgIHByb3BlcnR5IG9uIHRoZSByZXF1ZXN0KSB0byB0aGlzIGZsb3cuXCIsXHJcbiAgICBbYXV0aENvZGVPck5hdGl2ZUFjY291bnRJZFJlcXVpcmVkXTogXCJBbiBhdXRob3JpemF0aW9uIGNvZGUgb3IgbmF0aXZlQWNjb3VudElkIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhpcyBmbG93LlwiLFxyXG4gICAgW3NwYUNvZGVBbmROYXRpdmVBY2NvdW50SWRQcmVzZW50XTogXCJSZXF1ZXN0IGNhbm5vdCBjb250YWluIGJvdGggc3BhIGNvZGUgYW5kIG5hdGl2ZSBhY2NvdW50IGlkLlwiLFxyXG4gICAgW2RhdGFiYXNlVW5hdmFpbGFibGVdOiBcIkluZGV4ZWREQiwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHBlcnNpc3RlbnQgY3J5cHRvZ3JhcGhpYyBrZXkgc3RvcmFnZSwgaXMgdW5hdmFpbGFibGUuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBicm93c2VyIHByaXZhY3kgZmVhdHVyZXMgd2hpY2ggYmxvY2sgcGVyc2lzdGVudCBzdG9yYWdlIGluIHRoaXJkLXBhcnR5IGNvbnRleHRzLlwiLFxyXG4gICAgW3VuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtXTogYFVuYWJsZSB0byBhY3F1aXJlIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtLiAgJHtFcnJvckxpbmt9YCxcclxuICAgIFtuYXRpdmVIYW5kc2hha2VUaW1lb3V0XTogXCJUaW1lZCBvdXQgd2hpbGUgYXR0ZW1wdGluZyB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBicm93c2VyIGV4dGVuc2lvblwiLFxyXG4gICAgW25hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZF06IFwiTmF0aXZlIGV4dGVuc2lvbiBpcyBub3QgaW5zdGFsbGVkLiBJZiB5b3UgdGhpbmsgdGhpcyBpcyBhIG1pc3Rha2UgY2FsbCB0aGUgaW5pdGlhbGl6ZSBmdW5jdGlvbi5cIixcclxuICAgIFtuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWRdOiBgQ29ubmVjdGlvbiB0byBuYXRpdmUgcGxhdGZvcm0gaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkLiBQbGVhc2UgaW5zdGFsbCBhIGNvbXBhdGlibGUgYnJvd3NlciBleHRlbnNpb24gYW5kIHJ1biBpbml0aWFsaXplKCkuICAke0Vycm9yTGlua31gLFxyXG4gICAgW3VuaW5pdGlhbGl6ZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbl06IGBZb3UgbXVzdCBjYWxsIGFuZCBhd2FpdCB0aGUgaW5pdGlhbGl6ZSBmdW5jdGlvbiBiZWZvcmUgYXR0ZW1wdGluZyB0byBjYWxsIGFueSBvdGhlciBNU0FMIEFQSS4gICR7RXJyb3JMaW5rfWAsXHJcbiAgICBbbmF0aXZlUHJvbXB0Tm90U3VwcG9ydGVkXTogXCJUaGUgcHJvdmlkZWQgcHJvbXB0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG5hdGl2ZSBwbGF0Zm9ybS4gVGhpcyByZXF1ZXN0IHNob3VsZCBiZSByb3V0ZWQgdG8gdGhlIHdlYiBiYXNlZCBmbG93LlwiLFxyXG4gICAgW2ludmFsaWRCYXNlNjRTdHJpbmddOiBcIkludmFsaWQgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlwiLFxyXG4gICAgW2ludmFsaWRQb3BUb2tlblJlcXVlc3RdOiBcIkludmFsaWQgUG9QIHRva2VuIHJlcXVlc3QuIFRoZSByZXF1ZXN0IHNob3VsZCBub3QgaGF2ZSBib3RoIGEgcG9wS2lkIHZhbHVlIGFuZCBzaWduUG9wVG9rZW4gc2V0IHRvIHRydWUuXCIsXHJcbiAgICBbZmFpbGVkVG9CdWlsZEhlYWRlcnNdOiBcIkZhaWxlZCB0byBidWlsZCByZXF1ZXN0IGhlYWRlcnMgb2JqZWN0LlwiLFxyXG4gICAgW2ZhaWxlZFRvUGFyc2VIZWFkZXJzXTogXCJGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgaGVhZGVyc1wiLFxyXG59O1xyXG4vKipcclxuICogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2UgY2xhc3MgY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYnkgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzLlxyXG4gKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0ZWQgQnJvd3NlckF1dGhFcnJvckNvZGVzIGluc3RlYWQuXHJcbiAqIEluIHlvdXIgYXBwIHlvdSBjYW4gZG8gOlxyXG4gKiBgYGBcclxuICogaW1wb3J0IHsgQnJvd3NlckF1dGhFcnJvckNvZGVzIH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcclxuICogYGBgXHJcbiAqL1xyXG5jb25zdCBCcm93c2VyQXV0aEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHBrY2VOb3RHZW5lcmF0ZWQ6IHtcclxuICAgICAgICBjb2RlOiBwa2NlTm90Q3JlYXRlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbcGtjZU5vdENyZWF0ZWRdLFxyXG4gICAgfSxcclxuICAgIGNyeXB0b0RvZXNOb3RFeGlzdDoge1xyXG4gICAgICAgIGNvZGU6IGNyeXB0b05vbkV4aXN0ZW50LFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tjcnlwdG9Ob25FeGlzdGVudF0sXHJcbiAgICB9LFxyXG4gICAgZW1wdHlOYXZpZ2F0ZVVyaUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogZW1wdHlOYXZpZ2F0ZVVyaSxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbZW1wdHlOYXZpZ2F0ZVVyaV0sXHJcbiAgICB9LFxyXG4gICAgaGFzaEVtcHR5RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBoYXNoRW1wdHlFcnJvcixcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbaGFzaEVtcHR5RXJyb3JdLFxyXG4gICAgfSxcclxuICAgIGhhc2hEb2VzTm90Q29udGFpblN0YXRlRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBub1N0YXRlSW5IYXNoLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tub1N0YXRlSW5IYXNoXSxcclxuICAgIH0sXHJcbiAgICBoYXNoRG9lc05vdENvbnRhaW5Lbm93blByb3BlcnRpZXNFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IGhhc2hEb2VzTm90Q29udGFpbktub3duUHJvcGVydGllcyxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbaGFzaERvZXNOb3RDb250YWluS25vd25Qcm9wZXJ0aWVzXSxcclxuICAgIH0sXHJcbiAgICB1bmFibGVUb1BhcnNlU3RhdGVFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHVuYWJsZVRvUGFyc2VTdGF0ZSxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbdW5hYmxlVG9QYXJzZVN0YXRlXSxcclxuICAgIH0sXHJcbiAgICBzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoXSxcclxuICAgIH0sXHJcbiAgICBpbnRlcmFjdGlvbkluUHJvZ3Jlc3M6IHtcclxuICAgICAgICBjb2RlOiBpbnRlcmFjdGlvbkluUHJvZ3Jlc3MsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW2ludGVyYWN0aW9uSW5Qcm9ncmVzc10sXHJcbiAgICB9LFxyXG4gICAgcG9wdXBXaW5kb3dFcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHBvcHVwV2luZG93RXJyb3IsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW3BvcHVwV2luZG93RXJyb3JdLFxyXG4gICAgfSxcclxuICAgIGVtcHR5V2luZG93RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBlbXB0eVdpbmRvd0Vycm9yLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tlbXB0eVdpbmRvd0Vycm9yXSxcclxuICAgIH0sXHJcbiAgICB1c2VyQ2FuY2VsbGVkRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiB1c2VyQ2FuY2VsbGVkLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1t1c2VyQ2FuY2VsbGVkXSxcclxuICAgIH0sXHJcbiAgICBtb25pdG9yUG9wdXBUaW1lb3V0RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBtb25pdG9yUG9wdXBUaW1lb3V0LFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1ttb25pdG9yUG9wdXBUaW1lb3V0XSxcclxuICAgIH0sXHJcbiAgICBtb25pdG9ySWZyYW1lVGltZW91dEVycm9yOiB7XHJcbiAgICAgICAgY29kZTogbW9uaXRvcldpbmRvd1RpbWVvdXQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW21vbml0b3JXaW5kb3dUaW1lb3V0XSxcclxuICAgIH0sXHJcbiAgICByZWRpcmVjdEluSWZyYW1lRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiByZWRpcmVjdEluSWZyYW1lLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tyZWRpcmVjdEluSWZyYW1lXSxcclxuICAgIH0sXHJcbiAgICBibG9ja1Rva2VuUmVxdWVzdHNJbkhpZGRlbklmcmFtZUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogYmxvY2tJZnJhbWVSZWxvYWQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW2Jsb2NrSWZyYW1lUmVsb2FkXSxcclxuICAgIH0sXHJcbiAgICBibG9ja0FjcXVpcmVUb2tlbkluUG9wdXBzRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBibG9ja05lc3RlZFBvcHVwcyxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbYmxvY2tOZXN0ZWRQb3B1cHNdLFxyXG4gICAgfSxcclxuICAgIGlmcmFtZUNsb3NlZFByZW1hdHVyZWx5RXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBpZnJhbWVDbG9zZWRQcmVtYXR1cmVseSxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbaWZyYW1lQ2xvc2VkUHJlbWF0dXJlbHldLFxyXG4gICAgfSxcclxuICAgIHNpbGVudExvZ291dFVuc3VwcG9ydGVkRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBzaWxlbnRMb2dvdXRVbnN1cHBvcnRlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWRdLFxyXG4gICAgfSxcclxuICAgIG5vQWNjb3VudEVycm9yOiB7XHJcbiAgICAgICAgY29kZTogbm9BY2NvdW50RXJyb3IsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW25vQWNjb3VudEVycm9yXSxcclxuICAgIH0sXHJcbiAgICBzaWxlbnRQcm9tcHRWYWx1ZUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogc2lsZW50UHJvbXB0VmFsdWVFcnJvcixcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbc2lsZW50UHJvbXB0VmFsdWVFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgbm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogbm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tub1Rva2VuUmVxdWVzdENhY2hlRXJyb3JdLFxyXG4gICAgfSxcclxuICAgIHVuYWJsZVRvUGFyc2VUb2tlblJlcXVlc3RDYWNoZUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogdW5hYmxlVG9QYXJzZVRva2VuUmVxdWVzdENhY2hlRXJyb3IsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW3VuYWJsZVRvUGFyc2VUb2tlblJlcXVlc3RDYWNoZUVycm9yXSxcclxuICAgIH0sXHJcbiAgICBub0NhY2hlZEF1dGhvcml0eUVycm9yOiB7XHJcbiAgICAgICAgY29kZTogbm9DYWNoZWRBdXRob3JpdHlFcnJvcixcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbbm9DYWNoZWRBdXRob3JpdHlFcnJvcl0sXHJcbiAgICB9LFxyXG4gICAgYXV0aFJlcXVlc3ROb3RTZXQ6IHtcclxuICAgICAgICBjb2RlOiBhdXRoUmVxdWVzdE5vdFNldEVycm9yLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1thdXRoUmVxdWVzdE5vdFNldEVycm9yXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQ2FjaGVUeXBlOiB7XHJcbiAgICAgICAgY29kZTogaW52YWxpZENhY2hlVHlwZSxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbaW52YWxpZENhY2hlVHlwZV0sXHJcbiAgICB9LFxyXG4gICAgbm90SW5Ccm93c2VyRW52aXJvbm1lbnQ6IHtcclxuICAgICAgICBjb2RlOiBub25Ccm93c2VyRW52aXJvbm1lbnQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW25vbkJyb3dzZXJFbnZpcm9ubWVudF0sXHJcbiAgICB9LFxyXG4gICAgZGF0YWJhc2VOb3RPcGVuOiB7XHJcbiAgICAgICAgY29kZTogZGF0YWJhc2VOb3RPcGVuLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tkYXRhYmFzZU5vdE9wZW5dLFxyXG4gICAgfSxcclxuICAgIG5vTmV0d29ya0Nvbm5lY3Rpdml0eToge1xyXG4gICAgICAgIGNvZGU6IG5vTmV0d29ya0Nvbm5lY3Rpdml0eSxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbbm9OZXR3b3JrQ29ubmVjdGl2aXR5XSxcclxuICAgIH0sXHJcbiAgICBwb3N0UmVxdWVzdEZhaWxlZDoge1xyXG4gICAgICAgIGNvZGU6IHBvc3RSZXF1ZXN0RmFpbGVkLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1twb3N0UmVxdWVzdEZhaWxlZF0sXHJcbiAgICB9LFxyXG4gICAgZ2V0UmVxdWVzdEZhaWxlZDoge1xyXG4gICAgICAgIGNvZGU6IGdldFJlcXVlc3RGYWlsZWQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW2dldFJlcXVlc3RGYWlsZWRdLFxyXG4gICAgfSxcclxuICAgIGZhaWxlZFRvUGFyc2VOZXR3b3JrUmVzcG9uc2U6IHtcclxuICAgICAgICBjb2RlOiBmYWlsZWRUb1BhcnNlUmVzcG9uc2UsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW2ZhaWxlZFRvUGFyc2VSZXNwb25zZV0sXHJcbiAgICB9LFxyXG4gICAgdW5hYmxlVG9Mb2FkVG9rZW5FcnJvcjoge1xyXG4gICAgICAgIGNvZGU6IHVuYWJsZVRvTG9hZFRva2VuLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1t1bmFibGVUb0xvYWRUb2tlbl0sXHJcbiAgICB9LFxyXG4gICAgc2lnbmluZ0tleU5vdEZvdW5kSW5TdG9yYWdlOiB7XHJcbiAgICAgICAgY29kZTogY3J5cHRvS2V5Tm90Rm91bmQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW2NyeXB0b0tleU5vdEZvdW5kXSxcclxuICAgIH0sXHJcbiAgICBhdXRoQ29kZVJlcXVpcmVkOiB7XHJcbiAgICAgICAgY29kZTogYXV0aENvZGVSZXF1aXJlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbYXV0aENvZGVSZXF1aXJlZF0sXHJcbiAgICB9LFxyXG4gICAgYXV0aENvZGVPck5hdGl2ZUFjY291bnRSZXF1aXJlZDoge1xyXG4gICAgICAgIGNvZGU6IGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50SWRSZXF1aXJlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbYXV0aENvZGVPck5hdGl2ZUFjY291bnRJZFJlcXVpcmVkXSxcclxuICAgIH0sXHJcbiAgICBzcGFDb2RlQW5kTmF0aXZlQWNjb3VudFByZXNlbnQ6IHtcclxuICAgICAgICBjb2RlOiBzcGFDb2RlQW5kTmF0aXZlQWNjb3VudElkUHJlc2VudCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbc3BhQ29kZUFuZE5hdGl2ZUFjY291bnRJZFByZXNlbnRdLFxyXG4gICAgfSxcclxuICAgIGRhdGFiYXNlVW5hdmFpbGFibGU6IHtcclxuICAgICAgICBjb2RlOiBkYXRhYmFzZVVuYXZhaWxhYmxlLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tkYXRhYmFzZVVuYXZhaWxhYmxlXSxcclxuICAgIH0sXHJcbiAgICB1bmFibGVUb0FjcXVpcmVUb2tlbkZyb21OYXRpdmVQbGF0Zm9ybToge1xyXG4gICAgICAgIGNvZGU6IHVuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1t1bmFibGVUb0FjcXVpcmVUb2tlbkZyb21OYXRpdmVQbGF0Zm9ybV0sXHJcbiAgICB9LFxyXG4gICAgbmF0aXZlSGFuZHNoYWtlVGltZW91dDoge1xyXG4gICAgICAgIGNvZGU6IG5hdGl2ZUhhbmRzaGFrZVRpbWVvdXQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW25hdGl2ZUhhbmRzaGFrZVRpbWVvdXRdLFxyXG4gICAgfSxcclxuICAgIG5hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZDoge1xyXG4gICAgICAgIGNvZGU6IG5hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbbmF0aXZlRXh0ZW5zaW9uTm90SW5zdGFsbGVkXSxcclxuICAgIH0sXHJcbiAgICBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQ6IHtcclxuICAgICAgICBjb2RlOiBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzW25hdGl2ZUNvbm5lY3Rpb25Ob3RFc3RhYmxpc2hlZF0sXHJcbiAgICB9LFxyXG4gICAgdW5pbml0aWFsaXplZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uOiB7XHJcbiAgICAgICAgY29kZTogdW5pbml0aWFsaXplZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1t1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb25dLFxyXG4gICAgfSxcclxuICAgIG5hdGl2ZVByb21wdE5vdFN1cHBvcnRlZDoge1xyXG4gICAgICAgIGNvZGU6IG5hdGl2ZVByb21wdE5vdFN1cHBvcnRlZCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbbmF0aXZlUHJvbXB0Tm90U3VwcG9ydGVkXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkQmFzZTY0U3RyaW5nRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBpbnZhbGlkQmFzZTY0U3RyaW5nLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tpbnZhbGlkQmFzZTY0U3RyaW5nXSxcclxuICAgIH0sXHJcbiAgICBpbnZhbGlkUG9wVG9rZW5SZXF1ZXN0OiB7XHJcbiAgICAgICAgY29kZTogaW52YWxpZFBvcFRva2VuUmVxdWVzdCxcclxuICAgICAgICBkZXNjOiBCcm93c2VyQXV0aEVycm9yTWVzc2FnZXNbaW52YWxpZFBvcFRva2VuUmVxdWVzdF0sXHJcbiAgICB9LFxyXG59O1xyXG4vKipcclxuICogQnJvd3NlciBsaWJyYXJ5IGVycm9yIGNsYXNzIHRocm93biBieSB0aGUgTVNBTC5qcyBsaWJyYXJ5IGZvciBTUEFzXHJcbiAqL1xyXG5jbGFzcyBCcm93c2VyQXV0aEVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGVycm9yQ29kZSwgc3ViRXJyb3IpIHtcclxuICAgICAgICBzdXBlcihlcnJvckNvZGUsIEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlc1tlcnJvckNvZGVdLCBzdWJFcnJvcik7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEJyb3dzZXJBdXRoRXJyb3IucHJvdG90eXBlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkJyb3dzZXJBdXRoRXJyb3JcIjtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGVycm9yQ29kZSwgc3ViRXJyb3IpIHtcclxuICAgIHJldHVybiBuZXcgQnJvd3NlckF1dGhFcnJvcihlcnJvckNvZGUsIHN1YkVycm9yKTtcclxufVxuXG5leHBvcnQgeyBCcm93c2VyQXV0aEVycm9yLCBCcm93c2VyQXV0aEVycm9yTWVzc2FnZSwgQnJvd3NlckF1dGhFcnJvck1lc3NhZ2VzLCBjcmVhdGVCcm93c2VyQXV0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQXV0aEVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgT0lEQ19ERUZBVUxUX1NDT1BFUyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDb25zdGFudHNcclxuICovXHJcbmNvbnN0IEJyb3dzZXJDb25zdGFudHMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIEludGVyYWN0aW9uIGluIHByb2dyZXNzIGNhY2hlIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIElOVEVSQUNUSU9OX0lOX1BST0dSRVNTX1ZBTFVFOiBcImludGVyYWN0aW9uX2luX3Byb2dyZXNzXCIsXHJcbiAgICAvKipcclxuICAgICAqIEludmFsaWQgZ3JhbnQgZXJyb3IgY29kZVxyXG4gICAgICovXHJcbiAgICBJTlZBTElEX0dSQU5UX0VSUk9SOiBcImludmFsaWRfZ3JhbnRcIixcclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBwb3B1cCB3aW5kb3cgd2lkdGhcclxuICAgICAqL1xyXG4gICAgUE9QVVBfV0lEVEg6IDQ4MyxcclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBwb3B1cCB3aW5kb3cgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIFBPUFVQX0hFSUdIVDogNjAwLFxyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lIG9mIHRoZSBwb3B1cCB3aW5kb3cgc3RhcnRzIHdpdGhcclxuICAgICAqL1xyXG4gICAgUE9QVVBfTkFNRV9QUkVGSVg6IFwibXNhbFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IHBvcHVwIG1vbml0b3IgcG9sbCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcclxuICAgICAqL1xyXG4gICAgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TOiAzMCxcclxuICAgIC8qKlxyXG4gICAgICogTXNhbC1icm93c2VyIFNLVVxyXG4gICAgICovXHJcbiAgICBNU0FMX1NLVTogXCJtc2FsLmpzLmJyb3dzZXJcIixcclxufTtcclxuY29uc3QgTmF0aXZlQ29uc3RhbnRzID0ge1xyXG4gICAgQ0hBTk5FTF9JRDogXCI1M2VlMjg0ZC05MjBhLTRiNTktOWQzMC1hNjAzMTViMjY4MzZcIixcclxuICAgIFBSRUZFUlJFRF9FWFRFTlNJT05fSUQ6IFwicHBuYm5wZW9sZ2tpY2dlZ2tia2JqbWhsaWRlb3BpamlcIixcclxuICAgIE1BVFNfVEVMRU1FVFJZOiBcIk1BVFNcIixcclxufTtcclxuY29uc3QgTmF0aXZlRXh0ZW5zaW9uTWV0aG9kID0ge1xyXG4gICAgSGFuZHNoYWtlUmVxdWVzdDogXCJIYW5kc2hha2VcIixcclxuICAgIEhhbmRzaGFrZVJlc3BvbnNlOiBcIkhhbmRzaGFrZVJlc3BvbnNlXCIsXHJcbiAgICBHZXRUb2tlbjogXCJHZXRUb2tlblwiLFxyXG4gICAgUmVzcG9uc2U6IFwiUmVzcG9uc2VcIixcclxufTtcclxuY29uc3QgQnJvd3NlckNhY2hlTG9jYXRpb24gPSB7XHJcbiAgICBMb2NhbFN0b3JhZ2U6IFwibG9jYWxTdG9yYWdlXCIsXHJcbiAgICBTZXNzaW9uU3RvcmFnZTogXCJzZXNzaW9uU3RvcmFnZVwiLFxyXG4gICAgTWVtb3J5U3RvcmFnZTogXCJtZW1vcnlTdG9yYWdlXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBIVFRQIFJlcXVlc3QgdHlwZXMgc3VwcG9ydGVkIGJ5IE1TQUwuXHJcbiAqL1xyXG5jb25zdCBIVFRQX1JFUVVFU1RfVFlQRSA9IHtcclxuICAgIEdFVDogXCJHRVRcIixcclxuICAgIFBPU1Q6IFwiUE9TVFwiLFxyXG59O1xyXG4vKipcclxuICogVGVtcG9yYXJ5IGNhY2hlIGtleXMgZm9yIE1TQUwsIGRlbGV0ZWQgYWZ0ZXIgYW55IHJlcXVlc3QuXHJcbiAqL1xyXG5jb25zdCBUZW1wb3JhcnlDYWNoZUtleXMgPSB7XHJcbiAgICBBVVRIT1JJVFk6IFwiYXV0aG9yaXR5XCIsXHJcbiAgICBBQ1FVSVJFX1RPS0VOX0FDQ09VTlQ6IFwiYWNxdWlyZVRva2VuLmFjY291bnRcIixcclxuICAgIFNFU1NJT05fU1RBVEU6IFwic2Vzc2lvbi5zdGF0ZVwiLFxyXG4gICAgUkVRVUVTVF9TVEFURTogXCJyZXF1ZXN0LnN0YXRlXCIsXHJcbiAgICBOT05DRV9JRFRPS0VOOiBcIm5vbmNlLmlkX3Rva2VuXCIsXHJcbiAgICBPUklHSU5fVVJJOiBcInJlcXVlc3Qub3JpZ2luXCIsXHJcbiAgICBSRU5FV19TVEFUVVM6IFwidG9rZW4ucmVuZXcuc3RhdHVzXCIsXHJcbiAgICBVUkxfSEFTSDogXCJ1cmxIYXNoXCIsXHJcbiAgICBSRVFVRVNUX1BBUkFNUzogXCJyZXF1ZXN0LnBhcmFtc1wiLFxyXG4gICAgU0NPUEVTOiBcInNjb3Blc1wiLFxyXG4gICAgSU5URVJBQ1RJT05fU1RBVFVTX0tFWTogXCJpbnRlcmFjdGlvbi5zdGF0dXNcIixcclxuICAgIENDU19DUkVERU5USUFMOiBcImNjcy5jcmVkZW50aWFsXCIsXHJcbiAgICBDT1JSRUxBVElPTl9JRDogXCJyZXF1ZXN0LmNvcnJlbGF0aW9uSWRcIixcclxuICAgIE5BVElWRV9SRVFVRVNUOiBcInJlcXVlc3QubmF0aXZlXCIsXHJcbiAgICBSRURJUkVDVF9DT05URVhUOiBcInJlcXVlc3QucmVkaXJlY3QuY29udGV4dFwiLFxyXG59O1xyXG5jb25zdCBTdGF0aWNDYWNoZUtleXMgPSB7XHJcbiAgICBBQ0NPVU5UX0tFWVM6IFwibXNhbC5hY2NvdW50LmtleXNcIixcclxuICAgIFRPS0VOX0tFWVM6IFwibXNhbC50b2tlbi5rZXlzXCIsXHJcbn07XHJcbi8qKlxyXG4gKiBDYWNoZSBrZXlzIHN0b3JlZCBpbi1tZW1vcnlcclxuICovXHJcbmNvbnN0IEluTWVtb3J5Q2FjaGVLZXlzID0ge1xyXG4gICAgV1JBUFBFUl9TS1U6IFwid3JhcHBlci5za3VcIixcclxuICAgIFdSQVBQRVJfVkVSOiBcIndyYXBwZXIudmVyc2lvblwiLFxyXG59O1xyXG4vKipcclxuICogQVBJIENvZGVzIGZvciBUZWxlbWV0cnkgcHVycG9zZXMuXHJcbiAqIEJlZm9yZSBhZGRpbmcgYSBuZXcgY29kZSB5b3UgbXVzdCBjbGFpbSBpdCBpbiB0aGUgTVNBTCBUZWxlbWV0cnkgdHJhY2tlciBhcyB0aGVzZSBudW1iZXIgc3BhY2VzIGFyZSBzaGFyZWQgYWNyb3NzIGFsbCBNU0FMc1xyXG4gKiAwLTk5IFNpbGVudCBGbG93XHJcbiAqIDgwMC04OTkgQXV0aCBDb2RlIEZsb3dcclxuICovXHJcbmNvbnN0IEFwaUlkID0ge1xyXG4gICAgYWNxdWlyZVRva2VuUmVkaXJlY3Q6IDg2MSxcclxuICAgIGFjcXVpcmVUb2tlblBvcHVwOiA4NjIsXHJcbiAgICBzc29TaWxlbnQ6IDg2MyxcclxuICAgIGFjcXVpcmVUb2tlblNpbGVudF9hdXRoQ29kZTogODY0LFxyXG4gICAgaGFuZGxlUmVkaXJlY3RQcm9taXNlOiA4NjUsXHJcbiAgICBhY3F1aXJlVG9rZW5CeUNvZGU6IDg2NixcclxuICAgIGFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93OiA2MSxcclxuICAgIGxvZ291dDogOTYxLFxyXG4gICAgbG9nb3V0UG9wdXA6IDk2MixcclxufTtcclxuLypcclxuICogSW50ZXJhY3Rpb24gdHlwZSBvZiB0aGUgQVBJIC0gdXNlZCBmb3Igc3RhdGUgYW5kIHRlbGVtZXRyeVxyXG4gKi9cclxudmFyIEludGVyYWN0aW9uVHlwZTtcclxuKGZ1bmN0aW9uIChJbnRlcmFjdGlvblR5cGUpIHtcclxuICAgIEludGVyYWN0aW9uVHlwZVtcIlJlZGlyZWN0XCJdID0gXCJyZWRpcmVjdFwiO1xyXG4gICAgSW50ZXJhY3Rpb25UeXBlW1wiUG9wdXBcIl0gPSBcInBvcHVwXCI7XHJcbiAgICBJbnRlcmFjdGlvblR5cGVbXCJTaWxlbnRcIl0gPSBcInNpbGVudFwiO1xyXG4gICAgSW50ZXJhY3Rpb25UeXBlW1wiTm9uZVwiXSA9IFwibm9uZVwiO1xyXG59KShJbnRlcmFjdGlvblR5cGUgfHwgKEludGVyYWN0aW9uVHlwZSA9IHt9KSk7XHJcbi8qKlxyXG4gKiBUeXBlcyBvZiBpbnRlcmFjdGlvbiBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXHJcbiAqIFVzZWQgaW4gZXZlbnRzIGluIHdyYXBwZXIgbGlicmFyaWVzIHRvIGludm9rZSBmdW5jdGlvbnMgd2hlbiBjZXJ0YWluIGludGVyYWN0aW9uIGlzIGluIHByb2dyZXNzIG9yIGFsbCBpbnRlcmFjdGlvbnMgYXJlIGNvbXBsZXRlLlxyXG4gKi9cclxuY29uc3QgSW50ZXJhY3Rpb25TdGF0dXMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWwgc3RhdHVzIGJlZm9yZSBpbnRlcmFjdGlvbiBvY2N1cnNcclxuICAgICAqL1xyXG4gICAgU3RhcnR1cDogXCJzdGFydHVwXCIsXHJcbiAgICAvKipcclxuICAgICAqIFN0YXR1cyBzZXQgd2hlbiBhbGwgbG9naW4gY2FsbHMgb2NjdXJpbmdcclxuICAgICAqL1xyXG4gICAgTG9naW46IFwibG9naW5cIixcclxuICAgIC8qKlxyXG4gICAgICogU3RhdHVzIHNldCB3aGVuIGxvZ291dCBjYWxsIG9jY3VyaW5nXHJcbiAgICAgKi9cclxuICAgIExvZ291dDogXCJsb2dvdXRcIixcclxuICAgIC8qKlxyXG4gICAgICogU3RhdHVzIHNldCBmb3IgYWNxdWlyZVRva2VuIGNhbGxzXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlbjogXCJhY3F1aXJlVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogU3RhdHVzIHNldCBmb3Igc3NvU2lsZW50IGNhbGxzXHJcbiAgICAgKi9cclxuICAgIFNzb1NpbGVudDogXCJzc29TaWxlbnRcIixcclxuICAgIC8qKlxyXG4gICAgICogU3RhdHVzIHNldCB3aGVuIGhhbmRsZVJlZGlyZWN0IGluIHByb2dyZXNzXHJcbiAgICAgKi9cclxuICAgIEhhbmRsZVJlZGlyZWN0OiBcImhhbmRsZVJlZGlyZWN0XCIsXHJcbiAgICAvKipcclxuICAgICAqIFN0YXR1cyBzZXQgd2hlbiBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZVxyXG4gICAgICovXHJcbiAgICBOb25lOiBcIm5vbmVcIixcclxufTtcclxuY29uc3QgREVGQVVMVF9SRVFVRVNUID0ge1xyXG4gICAgc2NvcGVzOiBPSURDX0RFRkFVTFRfU0NPUEVTLFxyXG59O1xyXG4vKipcclxuICogSldLIEtleSBGb3JtYXQgc3RyaW5nIChUeXBlIE1VU1QgYmUgZGVmaW5lZCBmb3Igd2luZG93IGNyeXB0byBBUElzKVxyXG4gKi9cclxuY29uc3QgS0VZX0ZPUk1BVF9KV0sgPSBcImp3a1wiO1xyXG4vLyBTdXBwb3J0ZWQgd3JhcHBlciBTS1VzXHJcbmNvbnN0IFdyYXBwZXJTS1UgPSB7XHJcbiAgICBSZWFjdDogXCJAYXp1cmUvbXNhbC1yZWFjdFwiLFxyXG4gICAgQW5ndWxhcjogXCJAYXp1cmUvbXNhbC1hbmd1bGFyXCIsXHJcbn07XHJcbi8vIERhdGFiYXNlU3RvcmFnZSBDb25zdGFudHNcclxuY29uc3QgREJfTkFNRSA9IFwibXNhbC5kYlwiO1xyXG5jb25zdCBEQl9WRVJTSU9OID0gMTtcclxuY29uc3QgREJfVEFCTEVfTkFNRSA9IGAke0RCX05BTUV9LmtleXNgO1xyXG5jb25zdCBDYWNoZUxvb2t1cFBvbGljeSA9IHtcclxuICAgIC8qXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5TaWxlbnQgd2lsbCBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGFjY2VzcyB0b2tlbiBpcyBleHBpcmVkXHJcbiAgICAgKiBvciBjYW5ub3QgYmUgZm91bmQgdGhlIHJlZnJlc2ggdG9rZW4gd2lsbCBiZSB1c2VkIHRvIGFjcXVpcmUgYSBuZXcgb25lLiBGaW5hbGx5LCBpZiB0aGUgcmVmcmVzaCB0b2tlblxyXG4gICAgICogaXMgZXhwaXJlZCBhY3F1aXJlVG9rZW5TaWxlbnQgd2lsbCBhdHRlbXB0IHRvIGFjcXVpcmUgbmV3IGFjY2VzcyBhbmQgcmVmcmVzaCB0b2tlbnMuXHJcbiAgICAgKi9cclxuICAgIERlZmF1bHQ6IDAsXHJcbiAgICAvKlxyXG4gICAgICogYWNxdWlyZVRva2VuU2lsZW50IHdpbGwgb25seSBsb29rIGZvciBhY2Nlc3MgdG9rZW5zIGluIHRoZSBjYWNoZS4gSXQgd2lsbCBub3QgYXR0ZW1wdCB0byByZW5ldyBhY2Nlc3Mgb3JcclxuICAgICAqIHJlZnJlc2ggdG9rZW5zLlxyXG4gICAgICovXHJcbiAgICBBY2Nlc3NUb2tlbjogMSxcclxuICAgIC8qXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5TaWxlbnQgd2lsbCBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGFjY2VzcyB0b2tlbiBpcyBleHBpcmVkIG9yXHJcbiAgICAgKiBjYW5ub3QgYmUgZm91bmQsIHRoZSByZWZyZXNoIHRva2VuIHdpbGwgYmUgdXNlZCB0byBhY3F1aXJlIGEgbmV3IG9uZS4gSWYgdGhlIHJlZnJlc2ggdG9rZW4gaXMgZXhwaXJlZCwgaXRcclxuICAgICAqIHdpbGwgbm90IGJlIHJlbmV3ZWQgYW5kIGFjcXVpcmVUb2tlblNpbGVudCB3aWxsIGZhaWwuXHJcbiAgICAgKi9cclxuICAgIEFjY2Vzc1Rva2VuQW5kUmVmcmVzaFRva2VuOiAyLFxyXG4gICAgLypcclxuICAgICAqIGFjcXVpcmVUb2tlblNpbGVudCB3aWxsIG5vdCBhdHRlbXB0IHRvIHJldHJpZXZlIGFjY2VzcyB0b2tlbnMgZnJvbSB0aGUgY2FjaGUgYW5kIHdpbGwgaW5zdGVhZCBhdHRlbXB0IHRvXHJcbiAgICAgKiBleGNoYW5nZSB0aGUgY2FjaGVkIHJlZnJlc2ggdG9rZW4gZm9yIGEgbmV3IGFjY2VzcyB0b2tlbi4gSWYgdGhlIHJlZnJlc2ggdG9rZW4gaXMgZXhwaXJlZCwgaXQgd2lsbCBub3QgYmVcclxuICAgICAqIHJlbmV3ZWQgYW5kIGFjcXVpcmVUb2tlblNpbGVudCB3aWxsIGZhaWwuXHJcbiAgICAgKi9cclxuICAgIFJlZnJlc2hUb2tlbjogMyxcclxuICAgIC8qXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5TaWxlbnQgd2lsbCBub3QgbG9vayBpbiB0aGUgY2FjaGUgZm9yIHRoZSBhY2Nlc3MgdG9rZW4uIEl0IHdpbGwgZ28gZGlyZWN0bHkgdG8gbmV0d29yayB3aXRoIHRoZVxyXG4gICAgICogY2FjaGVkIHJlZnJlc2ggdG9rZW4uIElmIHRoZSByZWZyZXNoIHRva2VuIGlzIGV4cGlyZWQgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gcmVuZXcgaXQuIFRoaXMgaXMgZXF1aXZhbGVudCB0b1xyXG4gICAgICogc2V0dGluZyBcImZvcmNlUmVmcmVzaDogdHJ1ZVwiLlxyXG4gICAgICovXHJcbiAgICBSZWZyZXNoVG9rZW5BbmROZXR3b3JrOiA0LFxyXG4gICAgLypcclxuICAgICAqIGFjcXVpcmVUb2tlblNpbGVudCB3aWxsIGF0dGVtcHQgdG8gcmVuZXcgYm90aCBhY2Nlc3MgYW5kIHJlZnJlc2ggdG9rZW5zLiBJdCB3aWxsIG5vdCBsb29rIGluIHRoZSBjYWNoZS4gVGhpcyB3aWxsXHJcbiAgICAgKiBhbHdheXMgZmFpbCBpZiAzcmQgcGFydHkgY29va2llcyBhcmUgYmxvY2tlZCBieSB0aGUgYnJvd3Nlci5cclxuICAgICAqL1xyXG4gICAgU2tpcDogNSxcclxufTtcclxuY29uc3QgaUZyYW1lUmVuZXdhbFBvbGljaWVzID0gW1xyXG4gICAgQ2FjaGVMb29rdXBQb2xpY3kuRGVmYXVsdCxcclxuICAgIENhY2hlTG9va3VwUG9saWN5LlNraXAsXHJcbiAgICBDYWNoZUxvb2t1cFBvbGljeS5SZWZyZXNoVG9rZW5BbmROZXR3b3JrLFxyXG5dO1xyXG5jb25zdCBMT0dfTEVWRUxfQ0FDSEVfS0VZID0gXCJtc2FsLmJyb3dzZXIubG9nLmxldmVsXCI7XHJcbmNvbnN0IExPR19QSUlfQ0FDSEVfS0VZID0gXCJtc2FsLmJyb3dzZXIubG9nLnBpaVwiO1xyXG5jb25zdCBCUk9XU0VSX1BFUkZfRU5BQkxFRF9LRVkgPSBcIm1zYWwuYnJvd3Nlci5wZXJmb3JtYW5jZS5lbmFibGVkXCI7XG5cbmV4cG9ydCB7IEFwaUlkLCBCUk9XU0VSX1BFUkZfRU5BQkxFRF9LRVksIEJyb3dzZXJDYWNoZUxvY2F0aW9uLCBCcm93c2VyQ29uc3RhbnRzLCBDYWNoZUxvb2t1cFBvbGljeSwgREJfTkFNRSwgREJfVEFCTEVfTkFNRSwgREJfVkVSU0lPTiwgREVGQVVMVF9SRVFVRVNULCBIVFRQX1JFUVVFU1RfVFlQRSwgSW5NZW1vcnlDYWNoZUtleXMsIEludGVyYWN0aW9uU3RhdHVzLCBJbnRlcmFjdGlvblR5cGUsIEtFWV9GT1JNQVRfSldLLCBMT0dfTEVWRUxfQ0FDSEVfS0VZLCBMT0dfUElJX0NBQ0hFX0tFWSwgTmF0aXZlQ29uc3RhbnRzLCBOYXRpdmVFeHRlbnNpb25NZXRob2QsIFN0YXRpY0NhY2hlS2V5cywgVGVtcG9yYXJ5Q2FjaGVLZXlzLCBXcmFwcGVyU0tVLCBpRnJhbWVSZW5ld2FsUG9saWNpZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25zdGFudHMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW5zdHJ1bWVudGVkIGJ5IGhhdmUgdGhlaXIgcGVyZm9ybWFuY2UgbWVhc3VyZWQgYnkgdGhlIFBlcmZvcm1hbmNlQ2xpZW50LlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBlbnVtIHtudW1iZXJ9XHJcbiAqL1xyXG5jb25zdCBQZXJmb3JtYW5jZUV2ZW50cyA9IHtcclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZVRva2VuQnlDb2RlIEFQSSAobXNhbC1icm93c2VyIGFuZCBtc2FsLW5vZGUpLlxyXG4gICAgICogVXNlZCB0byBhY3F1aXJlIHRva2VucyBieSB0cmFkaW5nIGFuIGF1dGhvcml6YXRpb24gY29kZSBhZ2FpbnN0IHRoZSB0b2tlbiBlbmRwb2ludC5cclxuICAgICAqL1xyXG4gICAgQWNxdWlyZVRva2VuQnlDb2RlOiBcImFjcXVpcmVUb2tlbkJ5Q29kZVwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiBBUEkgKG1zYWwtYnJvd3NlciBhbmQgbXNhbC1ub2RlKS5cclxuICAgICAqIFVzZWQgdG8gcmVuZXcgYW4gYWNjZXNzIHRva2VuIHVzaW5nIGEgcmVmcmVzaCB0b2tlbiBhZ2FpbnN0IHRoZSB0b2tlbiBlbmRwb2ludC5cclxuICAgICAqL1xyXG4gICAgQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW46IFwiYWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZVRva2VuU2lsZW50IEFQSSAobXNhbC1icm93c2VyIGFuZCBtc2FsLW5vZGUpLlxyXG4gICAgICogVXNlZCB0byBzaWxlbnRseSBhY3F1aXJlIGEgbmV3IGFjY2VzcyB0b2tlbiAoZnJvbSB0aGUgY2FjaGUgb3IgdGhlIG5ldHdvcmspLlxyXG4gICAgICovXHJcbiAgICBBY3F1aXJlVG9rZW5TaWxlbnQ6IFwiYWNxdWlyZVRva2VuU2lsZW50XCIsXHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlblNpbGVudEFzeW5jIChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICogSW50ZXJuYWwgQVBJIGZvciBhY3F1aXJlVG9rZW5TaWxlbnQuXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlblNpbGVudEFzeW5jOiBcImFjcXVpcmVUb2tlblNpbGVudEFzeW5jXCIsXHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlblBvcHVwIChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICogVXNlZCB0byBhY3F1aXJlIGEgbmV3IGFjY2VzcyB0b2tlbiBpbnRlcmFjdGl2ZWx5IHRocm91Z2ggcG9wIHVwc1xyXG4gICAgICovXHJcbiAgICBBY3F1aXJlVG9rZW5Qb3B1cDogXCJhY3F1aXJlVG9rZW5Qb3B1cFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5QcmVSZWRpcmVjdCAobXNhbC1icm93c2VyKS5cclxuICAgICAqIEZpcnN0IHBhcnQgb2YgdGhlIHJlZGlyZWN0IGZsb3cuXHJcbiAgICAgKiBVc2VkIHRvIGFjcXVpcmUgYSBuZXcgYWNjZXNzIHRva2VuIGludGVyYWN0aXZlbHkgdGhyb3VnaCByZWRpcmVjdHMuXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlblByZVJlZGlyZWN0OiBcImFjcXVpcmVUb2tlblByZVJlZGlyZWN0XCIsXHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlblJlZGlyZWN0IChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICogU2Vjb25kIHBhcnQgb2YgdGhlIHJlZGlyZWN0IGZsb3cuXHJcbiAgICAgKiBVc2VkIHRvIGFjcXVpcmUgYSBuZXcgYWNjZXNzIHRva2VuIGludGVyYWN0aXZlbHkgdGhyb3VnaCByZWRpcmVjdHMuXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlblJlZGlyZWN0OiBcImFjcXVpcmVUb2tlblJlZGlyZWN0XCIsXHJcbiAgICAvKipcclxuICAgICAqIGdldFB1YmxpY0tleVRodW1icHJpbnQgQVBJIGluIENyeXB0b09wdHMgY2xhc3MgKG1zYWwtYnJvd3NlcikuXHJcbiAgICAgKiBVc2VkIHRvIGdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5cGFpciBhbmQgZ2VuZXJhdGUgYSBwdWJsaWMga2V5IHRodW1icHJpbnQgZm9yIHBvcCByZXF1ZXN0cy5cclxuICAgICAqL1xyXG4gICAgQ3J5cHRvT3B0c0dldFB1YmxpY0tleVRodW1icHJpbnQ6IFwiY3J5cHRvT3B0c0dldFB1YmxpY0tleVRodW1icHJpbnRcIixcclxuICAgIC8qKlxyXG4gICAgICogc2lnbkp3dCBBUEkgaW4gQ3J5cHRvT3B0cyBjbGFzcyAobXNhbC1icm93c2VyKS5cclxuICAgICAqIFVzZWQgdG8gc2lnbmVkIGEgcG9wIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBDcnlwdG9PcHRzU2lnbkp3dDogXCJjcnlwdG9PcHRzU2lnbkp3dFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW4gQVBJIGluIHRoZSBTaWxlbnRDYWNoZUNsaWVudCBjbGFzcyAobXNhbC1icm93c2VyKS5cclxuICAgICAqIFVzZWQgdG8gcmVhZCBhY2Nlc3MgdG9rZW5zIGZyb20gdGhlIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBTaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlbjogXCJzaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlblwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW4gQVBJIGluIHRoZSBTaWxlbnRJZnJhbWVDbGllbnQgY2xhc3MgKG1zYWwtYnJvd3NlcikuXHJcbiAgICAgKiBVc2VkIHRvIGFjcXVpcmUgYSBuZXcgc2V0IG9mIHRva2VucyBmcm9tIHRoZSBhdXRob3JpemUgZW5kcG9pbnQgaW4gYSBoaWRkZW4gaWZyYW1lLlxyXG4gICAgICovXHJcbiAgICBTaWxlbnRJZnJhbWVDbGllbnRBY3F1aXJlVG9rZW46IFwic2lsZW50SWZyYW1lQ2xpZW50QWNxdWlyZVRva2VuXCIsXHJcbiAgICBBd2FpdENvbmN1cnJlbnRJZnJhbWU6IFwiYXdhaXRDb25jdXJyZW50SWZyYW1lXCIsXHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlbiBBUEkgaW4gU2lsZW50UmVyZXNoQ2xpZW50IChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICogVXNlZCB0byBhY3F1aXJlIGEgbmV3IHNldCBvZiB0b2tlbnMgZnJvbSB0aGUgdG9rZW4gZW5kcG9pbnQgdXNpbmcgYSByZWZyZXNoIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBTaWxlbnRSZWZyZXNoQ2xpZW50QWNxdWlyZVRva2VuOiBcInNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogc3NvU2lsZW50IEFQSSAobXNhbC1icm93c2VyKS5cclxuICAgICAqIFVzZWQgdG8gc2lsZW50bHkgYWNxdWlyZSBhbiBhdXRob3JpemF0aW9uIGNvZGUgYW5kIHNldCBvZiB0b2tlbnMgdXNpbmcgYSBoaWRkZW4gaWZyYW1lLlxyXG4gICAgICovXHJcbiAgICBTc29TaWxlbnQ6IFwic3NvU2lsZW50XCIsXHJcbiAgICAvKipcclxuICAgICAqIGdldERpc2NvdmVyZWRBdXRob3JpdHkgQVBJIGluIFN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnQgY2xhc3MgKG1zYWwtYnJvd3NlcikuXHJcbiAgICAgKiBVc2VkIHRvIGxvYWQgYXV0aG9yaXR5IG1ldGFkYXRhIGZvciBhIHJlcXVlc3QuXHJcbiAgICAgKi9cclxuICAgIFN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5OiBcInN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5XCIsXHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlbiBBUElzIGluIG1zYWwtYnJvd3Nlci5cclxuICAgICAqIFVzZWQgdG8gbWFrZSBhbiAvYXV0aG9yaXplIGVuZHBvaW50IGNhbGwgd2l0aCBuYXRpdmUgYnJva2VyaW5nIGVuYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIEZldGNoQWNjb3VudElkV2l0aE5hdGl2ZUJyb2tlcjogXCJmZXRjaEFjY291bnRJZFdpdGhOYXRpdmVCcm9rZXJcIixcclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZVRva2VuIEFQSSBpbiBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCBjbGFzcyAobXNhbC1icm93c2VyKS5cclxuICAgICAqIFVzZWQgdG8gYWNxdWlyZSBhIHRva2VuIGZyb20gTmF0aXZlIGNvbXBvbmVudCB3aGVuIG5hdGl2ZSBicm9rZXJpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgTmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW46IFwibmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogVGltZSBzcGVudCBjcmVhdGluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIHJlcXVlc3RzIHRvIHRva2VuIGVuZHBvaW50XHJcbiAgICAgKi9cclxuICAgIEJhc2VDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzOiBcImJhc2VDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzXCIsXHJcbiAgICAvKipcclxuICAgICAqIFRpbWUgc3BlbnQgc2VuZGluZy93YWl0aW5nIGZvciB0aGUgcmVzcG9uc2Ugb2YgYSByZXF1ZXN0IHRvIHRoZSB0b2tlbiBlbmRwb2ludFxyXG4gICAgICovXHJcbiAgICBOZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmM6IFwibmV0d29ya0NsaWVudFNlbmRQb3N0UmVxdWVzdEFzeW5jXCIsXHJcbiAgICBSZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludDogXCJyZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludFwiLFxyXG4gICAgQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludDogXCJhdXRob3JpemF0aW9uQ29kZUNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50XCIsXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gbWVhc3VyZSB0aGUgdGltZSB0YWtlbiBmb3IgY29tcGxldGluZyBlbWJlZGRlZC1icm9rZXIgaGFuZHNoYWtlIChQVy1Ccm9rZXIpLlxyXG4gICAgICovXHJcbiAgICBCcm9rZXJIYW5kaHNoYWtlOiBcImJyb2tlckhhbmRzaGFrZVwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiBBUEkgaW4gQnJva2VyQ2xpZW50QXBwbGljYXRpb24gKFBXLUJyb2tlcikgLlxyXG4gICAgICovXHJcbiAgICBBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbkluQnJva2VyOiBcImFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuSW5Ccm9rZXJcIixcclxuICAgIC8qKlxyXG4gICAgICogVGltZSB0YWtlbiBmb3IgdG9rZW4gYWNxdWlzaXRpb24gYnkgYnJva2VyXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlbkJ5QnJva2VyOiBcImFjcXVpcmVUb2tlbkJ5QnJva2VyXCIsXHJcbiAgICAvKipcclxuICAgICAqIFRpbWUgc3BlbnQgb24gdGhlIG5ldHdvcmsgZm9yIHJlZnJlc2ggdG9rZW4gYWNxdWlzaXRpb25cclxuICAgICAqL1xyXG4gICAgUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdDogXCJyZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0XCIsXHJcbiAgICAvKipcclxuICAgICAqIFRpbWUgdGFrZW4gZm9yIGFjcXVpcmluZyByZWZyZXNoIHRva2VuICwgcmVjb3JkcyBSVCBzaXplXHJcbiAgICAgKi9cclxuICAgIFJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbjogXCJyZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogVGltZSB0YWtlbiBmb3IgYWNxdWlyaW5nIGNhY2hlZCByZWZyZXNoIHRva2VuXHJcbiAgICAgKi9cclxuICAgIFJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW46IFwicmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlblwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiBBUEkgaW4gUmVmcmVzaFRva2VuQ2xpZW50IChtc2FsLWNvbW1vbikuXHJcbiAgICAgKi9cclxuICAgIFJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuOiBcInJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuXCIsXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgdG9rZW4gcmVxdWVzdCBib2R5IGluIFJlZnJlc2hUb2tlbkNsaWVudCAobXNhbC1jb21tb24pLlxyXG4gICAgICovXHJcbiAgICBSZWZyZXNoVG9rZW5DbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5OiBcInJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHlcIixcclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZVRva2VuRnJvbUNhY2hlIChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICogSW50ZXJuYWwgQVBJIGZvciBhY3F1aXJpbmcgdG9rZW4gZnJvbSBjYWNoZVxyXG4gICAgICovXHJcbiAgICBBY3F1aXJlVG9rZW5Gcm9tQ2FjaGU6IFwiYWNxdWlyZVRva2VuRnJvbUNhY2hlXCIsXHJcbiAgICBTaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuOiBcInNpbGVudEZsb3dDbGllbnRBY3F1aXJlQ2FjaGVkVG9rZW5cIixcclxuICAgIFNpbGVudEZsb3dDbGllbnRHZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZDogXCJzaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmRcIixcclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUgKG1zYWwtYnJvd3NlcikuXHJcbiAgICAgKiBJbnRlcm5hbCBBUEkgZm9yIGFjcXVpcmluZyB0b2tlbiBieSBzaWxlbnQgSWZyYW1lXHJcbiAgICAgKi9cclxuICAgIEFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lOiBcImFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lXCIsXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIEFQSSBmb3IgaW5pdGlhbGl6aW5nIGJhc2UgcmVxdWVzdCBpbiBCYXNlSW50ZXJhY3Rpb25DbGllbnQgKG1zYWwtYnJvd3NlcilcclxuICAgICAqL1xyXG4gICAgSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0OiBcImluaXRpYWxpemVCYXNlUmVxdWVzdFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBBUEkgZm9yIGluaXRpYWxpemluZyBzaWxlbnQgcmVxdWVzdCBpbiBTaWxlbnRDYWNoZUNsaWVudCAobXNhbC1icm93c2VyKVxyXG4gICAgICovXHJcbiAgICBJbml0aWFsaXplU2lsZW50UmVxdWVzdDogXCJpbml0aWFsaXplU2lsZW50UmVxdWVzdFwiLFxyXG4gICAgSW5pdGlhbGl6ZUNsaWVudEFwcGxpY2F0aW9uOiBcImluaXRpYWxpemVDbGllbnRBcHBsaWNhdGlvblwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gaW4gU2lsZW50SWZyYW1lQ2xpZW50IGNsYXNzIChtc2FsLWJyb3dzZXIpLlxyXG4gICAgICovXHJcbiAgICBTaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlcjogXCJzaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlclwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBTaWxlbnRIYW5kbGVyXHJcbiAgICAgKi9cclxuICAgIFNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0OiBcInNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0XCIsXHJcbiAgICBTaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2g6IFwic2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoXCIsXHJcbiAgICBTaWxlbnRIYW5kbGVyTG9hZEZyYW1lOiBcInNpbGVudEhhbmRsZXJMb2FkRnJhbWVcIixcclxuICAgIFNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jOiBcInNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jXCIsXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbnMgaW4gU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCBjbGFzcyAobXNhbC1icm93c2VyKVxyXG4gICAgICovXHJcbiAgICBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQ6IFwic3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50XCIsXHJcbiAgICBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbjogXCJzdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvblwiLFxyXG4gICAgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdDogXCJzdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0XCIsXHJcbiAgICBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25Db2RlUmVxdWVzdDogXCJzdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25Db2RlUmVxdWVzdFwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXRBdXRoQ29kZVVybCBBUEkgKG1zYWwtYnJvd3NlciBhbmQgbXNhbC1ub2RlKS5cclxuICAgICAqL1xyXG4gICAgR2V0QXV0aENvZGVVcmw6IFwiZ2V0QXV0aENvZGVVcmxcIixcclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb25zIGZyb20gSW50ZXJhY3Rpb25IYW5kbGVyIChtc2FsLWJyb3dzZXIpXHJcbiAgICAgKi9cclxuICAgIEhhbmRsZUNvZGVSZXNwb25zZUZyb21TZXJ2ZXI6IFwiaGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlclwiLFxyXG4gICAgSGFuZGxlQ29kZVJlc3BvbnNlOiBcImhhbmRsZUNvZGVSZXNwb25zZVwiLFxyXG4gICAgVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eTogXCJ1cGRhdGVUb2tlbkVuZHBvaW50QXV0aG9yaXR5XCIsXHJcbiAgICAvKipcclxuICAgICAqIEFQSXMgaW4gQXV0aG9yaXphdGlvbiBDb2RlIENsaWVudCAobXNhbC1jb21tb24pXHJcbiAgICAgKi9cclxuICAgIEF1dGhDbGllbnRBY3F1aXJlVG9rZW46IFwiYXV0aENsaWVudEFjcXVpcmVUb2tlblwiLFxyXG4gICAgQXV0aENsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3Q6IFwiYXV0aENsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3RcIixcclxuICAgIEF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5OiBcImF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5XCIsXHJcbiAgICBBdXRoQ2xpZW50Q3JlYXRlUXVlcnlTdHJpbmc6IFwiYXV0aENsaWVudENyZWF0ZVF1ZXJ5U3RyaW5nXCIsXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGZ1bmN0aW9ucyBpbiBQb3BUb2tlbkdlbmVyYXRvciAobXNhbC1jb21tb24pXHJcbiAgICAgKi9cclxuICAgIFBvcFRva2VuR2VuZXJhdGVDbmY6IFwicG9wVG9rZW5HZW5lcmF0ZUNuZlwiLFxyXG4gICAgUG9wVG9rZW5HZW5lcmF0ZUtpZDogXCJwb3BUb2tlbkdlbmVyYXRlS2lkXCIsXHJcbiAgICAvKipcclxuICAgICAqIGhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UgQVBJIGluIFJlc3BvbnNlSGFuZGxlciAobXNhbC1jb21tb24pXHJcbiAgICAgKi9cclxuICAgIEhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2U6IFwiaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZVwiLFxyXG4gICAgRGVzZXJpYWxpemVSZXNwb25zZTogXCJkZXNlcmlhbGl6ZVJlc3BvbnNlXCIsXHJcbiAgICAvKipcclxuICAgICAqIEF1dGhvcml0eSBmdW5jdGlvbnNcclxuICAgICAqL1xyXG4gICAgQXV0aG9yaXR5RmFjdG9yeUNyZWF0ZURpc2NvdmVyZWRJbnN0YW5jZTogXCJhdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlXCIsXHJcbiAgICBBdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzQXN5bmM6IFwiYXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0FzeW5jXCIsXHJcbiAgICBBdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzRnJvbUxvY2FsU291cmNlczogXCJhdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzRnJvbUxvY2FsU291cmNlc1wiLFxyXG4gICAgQXV0aG9yaXR5R2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrOiBcImF1dGhvcml0eUdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29ya1wiLFxyXG4gICAgQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YTogXCJhdXRob3JpdHlVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhXCIsXHJcbiAgICBBdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IFwiYXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrXCIsXHJcbiAgICBBdXRob3JpdHlVcGRhdGVFbmRwb2ludE1ldGFkYXRhOiBcImF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGFcIixcclxuICAgIEF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb246IFwiYXV0aG9yaXR5VXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvblwiLFxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpb24gRGlzY292ZXJ5IGZ1bmN0aW9uc1xyXG4gICAgICovXHJcbiAgICBSZWdpb25EaXNjb3ZlcnlEZXRlY3RSZWdpb246IFwicmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uXCIsXHJcbiAgICBSZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUzogXCJyZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EU1wiLFxyXG4gICAgUmVnaW9uRGlzY292ZXJ5R2V0Q3VycmVudFZlcnNpb246IFwicmVnaW9uRGlzY292ZXJ5R2V0Q3VycmVudFZlcnNpb25cIixcclxuICAgIEFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jOiBcImFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jXCIsXHJcbiAgICBHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IFwiZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrXCIsXHJcbiAgICBHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtNZWFzdXJlbWVudDogXCJnZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtNZWFzdXJlbWVudFwiLFxyXG4gICAgSGFuZGxlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQ6IFwiaGFuZGxlUmVkaXJlY3RQcm9taXNlXCIsXHJcbiAgICBIYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudDogXCJoYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VcIixcclxuICAgIFVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFNZWFzdXJlbWVudDogXCJ1cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhTWVhc3VyZW1lbnRcIixcclxuICAgIFVzZXJuYW1lUGFzc3dvcmRDbGllbnRBY3F1aXJlVG9rZW46IFwidXNlcm5hbWVQYXNzd29yZENsaWVudEFjcXVpcmVUb2tlblwiLFxyXG4gICAgTmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2U6IFwibmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2VcIixcclxuICAgIE5hdGl2ZUdlbmVyYXRlQXV0aFJlc3VsdDogXCJuYXRpdmVHZW5lcmF0ZUF1dGhSZXN1bHRcIixcclxuICAgIFJlbW92ZUhpZGRlbklmcmFtZTogXCJyZW1vdmVIaWRkZW5JZnJhbWVcIixcclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgb3BlcmF0aW9uc1xyXG4gICAgICovXHJcbiAgICBDbGVhclRva2Vuc0FuZEtleXNXaXRoQ2xhaW1zOiBcImNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXNcIixcclxuICAgIENhY2hlTWFuYWdlckdldFJlZnJlc2hUb2tlbjogXCJjYWNoZU1hbmFnZXJHZXRSZWZyZXNoVG9rZW5cIixcclxuICAgIC8qKlxyXG4gICAgICogQ3J5cHRvIE9wZXJhdGlvbnNcclxuICAgICAqL1xyXG4gICAgR2VuZXJhdGVQa2NlQ29kZXM6IFwiZ2VuZXJhdGVQa2NlQ29kZXNcIixcclxuICAgIEdlbmVyYXRlQ29kZVZlcmlmaWVyOiBcImdlbmVyYXRlQ29kZVZlcmlmaWVyXCIsXHJcbiAgICBHZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXI6IFwiZ2VuZXJhdGVDb2RlQ2hhbGxlbmdlRnJvbVZlcmlmaWVyXCIsXHJcbiAgICBTaGEyNTZEaWdlc3Q6IFwic2hhMjU2RGlnZXN0XCIsXHJcbiAgICBHZXRSYW5kb21WYWx1ZXM6IFwiZ2V0UmFuZG9tVmFsdWVzXCIsXHJcbn07XHJcbmNvbnN0IFBlcmZvcm1hbmNlRXZlbnRBYmJyZXZpYXRpb25zID0gbmV3IE1hcChbXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuQnlDb2RlLCBcIkFUQnlDb2RlXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLCBcIkFUQnlSVFwiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5BY3F1aXJlVG9rZW5TaWxlbnQsIFwiQVRTXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLCBcIkFUU0FzeW5jXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblBvcHVwLCBcIkFUUG9wdXBcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuUmVkaXJlY3QsIFwiQVRSZWRpcmVjdFwiXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5DcnlwdG9PcHRzR2V0UHVibGljS2V5VGh1bWJwcmludCxcclxuICAgICAgICBcIkNyeXB0b0dldFBLVGh1bWJcIixcclxuICAgIF0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQ3J5cHRvT3B0c1NpZ25Kd3QsIFwiQ3J5cHRvU2lnbkp3dFwiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlbiwgXCJTbHRDYWNoZUNsaWVudEFUXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiwgXCJTbHRJZnJhbWVDbGllbnRBVFwiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRSZWZyZXNoQ2xpZW50QWNxdWlyZVRva2VuLCBcIlNsdFJDbGllbnRBVFwiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5Tc29TaWxlbnQsIFwiU3NvU2x0XCJdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LFxyXG4gICAgICAgIFwiU3RkSW50Q2xpZW50R2V0RGlzY0F1dGhcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuRmV0Y2hBY2NvdW50SWRXaXRoTmF0aXZlQnJva2VyLFxyXG4gICAgICAgIFwiRmV0Y2hBY2NJZFdpdGhOdHZCcm9rZXJcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuTmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4sXHJcbiAgICAgICAgXCJOdHZJbnRDbGllbnRBVFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5CYXNlQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0SGVhZGVycyxcclxuICAgICAgICBcIkJhc2VDbGllbnRDcmVhdGVUUmVxSGVhZFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5OZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmMsXHJcbiAgICAgICAgXCJOZXRDbGllbnRTZW5kUG9zdFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCxcclxuICAgICAgICBcIlJUQ2xpZW50RXhlY1Bvc3RcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCxcclxuICAgICAgICBcIkF1dGhDb2RlQ2xpZW50RXhlY1Bvc3RcIixcclxuICAgIF0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQnJva2VySGFuZGhzaGFrZSwgXCJCcm9rZXJIYW5kc2hha2VcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW5JbkJyb2tlcixcclxuICAgICAgICBcIkFUQnlSVEluQnJva2VyXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5QnJva2VyLCBcIkFUQnlCcm9rZXJcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCxcclxuICAgICAgICBcIlJUQ2xpZW50RXhlY1RSZXFcIixcclxuICAgIF0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuLCBcIlJUQ2xpZW50QVRcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbixcclxuICAgICAgICBcIlJUQ2xpZW50QVRXaXRoQ2FjaGVkUlRcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sXHJcbiAgICAgICAgXCJSVENsaWVudEFUQnlSVFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LFxyXG4gICAgICAgIFwiUlRDbGllbnRDcmVhdGVUUmVxQm9keVwiLFxyXG4gICAgXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5BY3F1aXJlVG9rZW5Gcm9tQ2FjaGUsIFwiQVRGcm9tQ2FjaGVcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50Rmxvd0NsaWVudEFjcXVpcmVDYWNoZWRUb2tlbixcclxuICAgICAgICBcIlNsdEZsb3dDbGllbnRBVENhY2hlZFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsXHJcbiAgICAgICAgXCJTbHRGbG93Q2xpZW50R2VuUmVzRnJvbUNhY2hlXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLCBcIkFUQnlTbHRJZnJhbWVcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LCBcIkluaXRCYXNlUmVxXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVTaWxlbnRSZXF1ZXN0LCBcIkluaXRTbHRSZXFcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuSW5pdGlhbGl6ZUNsaWVudEFwcGxpY2F0aW9uLFxyXG4gICAgICAgIFwiSW5pdENsaWVudEFwcGxpY2F0aW9uXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudFRva2VuSGVscGVyLCBcIlNJQ2xpZW50VEhlbHBlclwiXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCxcclxuICAgICAgICBcIlNIYW5kbGVySW5pdEF1dGhSZXFcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLFxyXG4gICAgICAgIFwiU2x0SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUsIFwiU0hhbmRsZXJMb2FkRnJhbWVcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SGFuZGxlckxvYWRGcmFtZVN5bmMsIFwiU0hhbmRsZXJMb2FkRnJhbWVTeW5jXCJdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCxcclxuICAgICAgICBcIlN0ZEludENsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50XCIsXHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLFxyXG4gICAgICAgIFwiU3RkSW50Q2xpZW50R2V0Q2xpZW50Q29uZlwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LFxyXG4gICAgICAgIFwiU3RkSW50Q2xpZW50SW5pdEF1dGhSZXFcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEluaXRpYWxpemVBdXRob3JpemF0aW9uQ29kZVJlcXVlc3QsXHJcbiAgICAgICAgXCJTdGRJbnRDbGllbnRJbml0QXV0aENvZGVSZXFcIixcclxuICAgIF0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuR2V0QXV0aENvZGVVcmwsIFwiR2V0QXV0aENvZGVVcmxcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcixcclxuICAgICAgICBcIkhhbmRsZUNvZGVSZXNGcm9tU2VydmVyXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkhhbmRsZUNvZGVSZXNwb25zZSwgXCJIYW5kbGVDb2RlUmVzcFwiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5VcGRhdGVUb2tlbkVuZHBvaW50QXV0aG9yaXR5LCBcIlVwZFRFbmRwb2ludEF1dGhcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQXV0aENsaWVudEFjcXVpcmVUb2tlbiwgXCJBdXRoQ2xpZW50QVRcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuQXV0aENsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QsIFwiQXV0aENsaWVudEV4ZWNUUmVxXCJdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LFxyXG4gICAgICAgIFwiQXV0aENsaWVudENyZWF0ZVRSZXFCb2R5XCIsXHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRDcmVhdGVRdWVyeVN0cmluZyxcclxuICAgICAgICBcIkF1dGhDbGllbnRDcmVhdGVRdWVyeVN0clwiLFxyXG4gICAgXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5Qb3BUb2tlbkdlbmVyYXRlQ25mLCBcIlBvcFRHZW5DbmZcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuUG9wVG9rZW5HZW5lcmF0ZUtpZCwgXCJQb3BUR2VuS2lkXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsIFwiSGFuZGxlU2VydmVyVFJlc1wiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5EZXNlcmlhbGl6ZVJlc3BvbnNlLCBcIkRlc2VyaWFsaXplUmVzXCJdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eUZhY3RvcnlDcmVhdGVEaXNjb3ZlcmVkSW5zdGFuY2UsXHJcbiAgICAgICAgXCJBdXRoRmFjdENyZWF0ZURpc2NJbnN0XCIsXHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYyxcclxuICAgICAgICBcIkF1dGhSZXNvbHZlRW5kcG9pbnRzQXN5bmNcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0Zyb21Mb2NhbFNvdXJjZXMsXHJcbiAgICAgICAgXCJBdXRoUmVzb2x2ZUVuZHBvaW50c0Zyb21Mb2NhbFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmssXHJcbiAgICAgICAgXCJBdXRoR2V0Q0RNZXRhRnJvbU5ldFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLFxyXG4gICAgICAgIFwiQXV0aFVwZENETWV0YVwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmssXHJcbiAgICAgICAgXCJBdXRoVXBkQ0RNZXRhRnJvbU5ldFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlVcGRhdGVFbmRwb2ludE1ldGFkYXRhLFxyXG4gICAgICAgIFwiQXV0aFVwZEVuZHBvaW50TWV0YVwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlVcGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLFxyXG4gICAgICAgIFwiQXV0aFVwZE1ldGFXaXRoUmVnSW5mb1wiLFxyXG4gICAgXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5SZWdpb25EaXNjb3ZlcnlEZXRlY3RSZWdpb24sIFwiUmVnRGlzY0RldGVjdFJlZ1wiXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5SZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUyxcclxuICAgICAgICBcIlJlZ0Rpc2NHZXRSZWdGcm9tSU1EU1wiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5SZWdpb25EaXNjb3ZlcnlHZXRDdXJyZW50VmVyc2lvbixcclxuICAgICAgICBcIlJlZ0Rpc2NHZXRDdXJyZW50VmVyXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jLCBcIkFUQnlDb2RlQXN5bmNcIl0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuR2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLFxyXG4gICAgICAgIFwiR2V0RW5kcG9pbnRNZXRhRnJvbU5ldFwiLFxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5HZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtNZWFzdXJlbWVudCxcclxuICAgICAgICBcIkdldENETWV0YUZyb21OZXRcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsXHJcbiAgICAgICAgXCJIYW5kbGVSZWRpcmVjdFByb21pc2VcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsXHJcbiAgICAgICAgXCJIYW5kbGVOdHZSZWRpcmVjdFByb21pc2VcIixcclxuICAgIF0sXHJcbiAgICBbXHJcbiAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuVXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YU1lYXN1cmVtZW50LFxyXG4gICAgICAgIFwiVXBkYXRlQ0RNZXRhXCIsXHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLlVzZXJuYW1lUGFzc3dvcmRDbGllbnRBY3F1aXJlVG9rZW4sXHJcbiAgICAgICAgXCJVc2VyUGFzc0NsaWVudEFUXCIsXHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLk5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlLFxyXG4gICAgICAgIFwiTnR2TXNnSGFuZGxlckhhbmRzaGFrZVwiLFxyXG4gICAgXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5OYXRpdmVHZW5lcmF0ZUF1dGhSZXN1bHQsIFwiTnR2R2VuQXV0aFJlc1wiXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5SZW1vdmVIaWRkZW5JZnJhbWUsIFwiUmVtb3ZlSGlkZGVuSWZyYW1lXCJdLFxyXG4gICAgW1xyXG4gICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsXHJcbiAgICAgICAgXCJDbGVhclRBbmRLZXlzV2l0aENsYWltc1wiLFxyXG4gICAgXSxcclxuICAgIFtQZXJmb3JtYW5jZUV2ZW50cy5DYWNoZU1hbmFnZXJHZXRSZWZyZXNoVG9rZW4sIFwiQ2FjaGVNYW5hZ2VyR2V0UlRcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuR2VuZXJhdGVQa2NlQ29kZXMsIFwiR2VuUGtjZUNvZGVzXCJdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLkdlbmVyYXRlQ29kZVZlcmlmaWVyLCBcIkdlbkNvZGVWZXJpZmllclwiXSxcclxuICAgIFtcclxuICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5HZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXIsXHJcbiAgICAgICAgXCJHZW5Db2RlQ2hhbGxlbmdlRnJvbVZlcmlmaWVyXCIsXHJcbiAgICBdLFxyXG4gICAgW1BlcmZvcm1hbmNlRXZlbnRzLlNoYTI1NkRpZ2VzdCwgXCJTaGEyNTZEaWdlc3RcIl0sXHJcbiAgICBbUGVyZm9ybWFuY2VFdmVudHMuR2V0UmFuZG9tVmFsdWVzLCBcIkdldFJhbmRvbVZhbHVlc1wiXSxcclxuXSk7XHJcbi8qKlxyXG4gKiBTdGF0ZSBvZiB0aGUgcGVyZm9ybWFuY2UgZXZlbnQuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQGVudW0ge251bWJlcn1cclxuICovXHJcbmNvbnN0IFBlcmZvcm1hbmNlRXZlbnRTdGF0dXMgPSB7XHJcbiAgICBOb3RTdGFydGVkOiAwLFxyXG4gICAgSW5Qcm9ncmVzczogMSxcclxuICAgIENvbXBsZXRlZDogMixcclxufTtcclxuY29uc3QgSW50RmllbGRzID0gbmV3IFNldChbXHJcbiAgICBcImFjY2Vzc1Rva2VuU2l6ZVwiLFxyXG4gICAgXCJkdXJhdGlvbk1zXCIsXHJcbiAgICBcImlkVG9rZW5TaXplXCIsXHJcbiAgICBcIm1hdHNTaWxlbnRTdGF0dXNcIixcclxuICAgIFwibWF0c0h0dHBTdGF0dXNcIixcclxuICAgIFwicmVmcmVzaFRva2VuU2l6ZVwiLFxyXG4gICAgXCJxdWV1ZWRUaW1lTXNcIixcclxuICAgIFwic3RhcnRUaW1lTXNcIixcclxuICAgIFwic3RhdHVzXCIsXHJcbiAgICBcIm11bHRpTWF0Y2hlZEFUXCIsXHJcbiAgICBcIm11bHRpTWF0Y2hlZElEXCIsXHJcbiAgICBcIm11bHRpTWF0Y2hlZFJUXCIsXHJcbl0pO1xuXG5leHBvcnQgeyBJbnRGaWVsZHMsIFBlcmZvcm1hbmNlRXZlbnRBYmJyZXZpYXRpb25zLCBQZXJmb3JtYW5jZUV2ZW50U3RhdHVzLCBQZXJmb3JtYW5jZUV2ZW50cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGVyZm9ybWFuY2VFdmVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2xhc3Mgd2hpY2ggZXhwb3NlcyBBUElzIHRvIGVuY29kZSBwbGFpbnRleHQgdG8gYmFzZTY0IGVuY29kZWQgc3RyaW5nLiBTZWUgaGVyZSBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlsczpcclxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0Jhc2U2NC9CYXNlNjRfZW5jb2RpbmdfYW5kX2RlY29kaW5nI1NvbHV0aW9uXzJfJUUyJTgwJTkzX0phdmFTY3JpcHQnc19VVEYtMTZfJTNFX1VURi04XyUzRV9iYXNlNjRcclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIFVSTCBTYWZlIGI2NCBlbmNvZGVkIHN0cmluZyBmcm9tIGEgcGxhaW50ZXh0IHN0cmluZy5cclxuICogQHBhcmFtIGlucHV0XHJcbiAqL1xyXG5mdW5jdGlvbiB1cmxFbmNvZGUoaW5wdXQpIHtcclxuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKGlucHV0KVxyXG4gICAgICAgIC5yZXBsYWNlKC89L2csIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCBcIi1cIilcclxuICAgICAgICAucmVwbGFjZSgvXFwvL2csIFwiX1wiKSk7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgVVJMIFNhZmUgYjY0IGVuY29kZWQgc3RyaW5nIGZyb20gYW4gaW50OEFycmF5LlxyXG4gKiBAcGFyYW0gaW5wdXRBcnJcclxuICovXHJcbmZ1bmN0aW9uIHVybEVuY29kZUFycihpbnB1dEFycikge1xyXG4gICAgcmV0dXJuIGJhc2U2NEVuY0FycihpbnB1dEFycilcclxuICAgICAgICAucmVwbGFjZSgvPS9nLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgXCItXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgYjY0IGVuY29kZWQgc3RyaW5nIGZyb20gcGxhaW50ZXh0IHN0cmluZy5cclxuICogQHBhcmFtIGlucHV0XHJcbiAqL1xyXG5mdW5jdGlvbiBiYXNlNjRFbmNvZGUoaW5wdXQpIHtcclxuICAgIHJldHVybiBiYXNlNjRFbmNBcnIobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGlucHV0KSk7XHJcbn1cclxuLyoqXHJcbiAqIEJhc2U2NCBlbmNvZGUgYnl0ZSBhcnJheVxyXG4gKiBAcGFyYW0gYUJ5dGVzXHJcbiAqL1xyXG5mdW5jdGlvbiBiYXNlNjRFbmNBcnIoYUJ5dGVzKSB7XHJcbiAgICBjb25zdCBiaW5TdHJpbmcgPSBBcnJheS5mcm9tKGFCeXRlcywgKHgpID0+IFN0cmluZy5mcm9tQ29kZVBvaW50KHgpKS5qb2luKFwiXCIpO1xyXG4gICAgcmV0dXJuIGJ0b2EoYmluU3RyaW5nKTtcclxufVxuXG5leHBvcnQgeyBiYXNlNjRFbmNvZGUsIHVybEVuY29kZSwgdXJsRW5jb2RlQXJyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlNjRFbmNvZGUubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBLRVlfRk9STUFUX0pXSyB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IHVybEVuY29kZUFyciB9IGZyb20gJy4uL2VuY29kZS9CYXNlNjRFbmNvZGUubWpzJztcbmltcG9ydCB7IG5vbkJyb3dzZXJFbnZpcm9ubWVudCwgY3J5cHRvTm9uRXhpc3RlbnQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbnMgdXNlZCBieSB0aGUgYnJvd3NlciBsaWJyYXJ5IHRvIHBlcmZvcm0gY3J5cHRvZ3JhcGh5IG9wZXJhdGlvbnMgc3VjaCBhc1xyXG4gKiBoYXNoaW5nIGFuZCBlbmNvZGluZy4gSXQgYWxzbyBoYXMgaGVscGVyIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHNwZWNpZmljIEFQSXMuXHJcbiAqL1xyXG4vKipcclxuICogU2VlIGhlcmUgZm9yIG1vcmUgaW5mbyBvbiBSc2FIYXNoZWRLZXlHZW5QYXJhbXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Sc2FIYXNoZWRLZXlHZW5QYXJhbXNcclxuICovXHJcbi8vIFJTQSBLZXlHZW4gQWxnb3JpdGhtXHJcbmNvbnN0IFBLQ1MxX1YxNV9LRVlHRU5fQUxHID0gXCJSU0FTU0EtUEtDUzEtdjFfNVwiO1xyXG4vLyBTSEEtMjU2IGhhc2hpbmcgYWxnb3JpdGhtXHJcbmNvbnN0IFMyNTZfSEFTSF9BTEcgPSBcIlNIQS0yNTZcIjtcclxuLy8gTU9EIGxlbmd0aCBmb3IgUG9QIHRva2Vuc1xyXG5jb25zdCBNT0RVTFVTX0xFTkdUSCA9IDIwNDg7XHJcbi8vIFB1YmxpYyBFeHBvbmVudFxyXG5jb25zdCBQVUJMSUNfRVhQT05FTlQgPSBuZXcgVWludDhBcnJheShbMHgwMSwgMHgwMCwgMHgwMV0pO1xyXG4vLyBVVUlEIGhleCBkaWdpdHNcclxuY29uc3QgVVVJRF9DSEFSUyA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xyXG4vLyBBcnJheSB0byBzdG9yZSBVSU5UMzIgcmFuZG9tIHZhbHVlXHJcbmNvbnN0IFVJTlQzMl9BUlIgPSBuZXcgVWludDMyQXJyYXkoMSk7XHJcbmNvbnN0IFNVQlRMRV9TVUJFUlJPUiA9IFwiY3J5cHRvX3N1YnRsZV91bmRlZmluZWRcIjtcclxuY29uc3Qga2V5Z2VuQWxnb3JpdGhtT3B0aW9ucyA9IHtcclxuICAgIG5hbWU6IFBLQ1MxX1YxNV9LRVlHRU5fQUxHLFxyXG4gICAgaGFzaDogUzI1Nl9IQVNIX0FMRyxcclxuICAgIG1vZHVsdXNMZW5ndGg6IE1PRFVMVVNfTEVOR1RILFxyXG4gICAgcHVibGljRXhwb25lbnQ6IFBVQkxJQ19FWFBPTkVOVCxcclxufTtcclxuLyoqXHJcbiAqIENoZWNrIHdoZXRoZXIgYnJvd3NlciBjcnlwdG8gaXMgYXZhaWxhYmxlLlxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVDcnlwdG9BdmFpbGFibGUoc2tpcFZhbGlkYXRlU3VidGxlQ3J5cHRvKSB7XHJcbiAgICBpZiAoIXdpbmRvdykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9uQnJvd3NlckVudmlyb25tZW50KTtcclxuICAgIH1cclxuICAgIGlmICghd2luZG93LmNyeXB0bykge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoY3J5cHRvTm9uRXhpc3RlbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFza2lwVmFsaWRhdGVTdWJ0bGVDcnlwdG8gJiYgIXdpbmRvdy5jcnlwdG8uc3VidGxlKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihjcnlwdG9Ob25FeGlzdGVudCwgU1VCVExFX1NVQkVSUk9SKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUmV0dXJucyBhIHNoYS0yNTYgaGFzaCBvZiB0aGUgZ2l2ZW4gZGF0YVN0cmluZyBhcyBhbiBBcnJheUJ1ZmZlci5cclxuICogQHBhcmFtIGRhdGFTdHJpbmcge3N0cmluZ30gZGF0YSBzdHJpbmdcclxuICogQHBhcmFtIHBlcmZvcm1hbmNlQ2xpZW50IHs/SVBlcmZvcm1hbmNlQ2xpZW50fVxyXG4gKiBAcGFyYW0gY29ycmVsYXRpb25JZCB7P3N0cmluZ30gY29ycmVsYXRpb24gaWRcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNoYTI1NkRpZ2VzdChkYXRhU3RyaW5nLCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuU2hhMjU2RGlnZXN0LCBjb3JyZWxhdGlvbklkKTtcclxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcclxuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShkYXRhU3RyaW5nKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kaWdlc3QoUzI1Nl9IQVNIX0FMRywgZGF0YSk7XHJcbn1cclxuLyoqXHJcbiAqIFBvcHVsYXRlcyBidWZmZXIgd2l0aCBjcnlwdG9ncmFwaGljYWxseSByYW5kb20gdmFsdWVzLlxyXG4gKiBAcGFyYW0gZGF0YUJ1ZmZlclxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UmFuZG9tVmFsdWVzKGRhdGFCdWZmZXIpIHtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhkYXRhQnVmZmVyKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyByYW5kb20gVWludDMyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UmFuZG9tVWludDMyKCkge1xyXG4gICAgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoVUlOVDMyX0FSUik7XHJcbiAgICByZXR1cm4gVUlOVDMyX0FSUlswXTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlcyBhIFVVSUQgdjcgZnJvbSB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAqIEltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0aGUgc3lzdGVtIGNsb2NrIHRvIGd1YXJhbnRlZSBpbmNyZWFzaW5nIG9yZGVyIG9mIGdlbmVyYXRlZCBpZGVudGlmaWVycy5cclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZU5ld0d1aWQoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGJhc2VSYW5kID0gZ2V0UmFuZG9tVWludDMyKCkgKiAweDQwMCArIChnZXRSYW5kb21VaW50MzIoKSAmIDB4M2ZmKTtcclxuICAgIC8vIFJlc3VsdCBieXRlIGFycmF5XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2KTtcclxuICAgIC8vIEEgMTItYml0IGByYW5kX2FgIGZpZWxkIHZhbHVlXHJcbiAgICBjb25zdCByYW5kQSA9IE1hdGgudHJ1bmMoYmFzZVJhbmQgLyAyICoqIDMwKTtcclxuICAgIC8vIFRoZSBoaWdoZXIgMzAgYml0cyBvZiA2Mi1iaXQgYHJhbmRfYmAgZmllbGQgdmFsdWVcclxuICAgIGNvbnN0IHJhbmRCSGkgPSBiYXNlUmFuZCAmICgyICoqIDMwIC0gMSk7XHJcbiAgICAvLyBUaGUgbG93ZXIgMzIgYml0cyBvZiA2Mi1iaXQgYHJhbmRfYmAgZmllbGQgdmFsdWVcclxuICAgIGNvbnN0IHJhbmRCTG8gPSBnZXRSYW5kb21VaW50MzIoKTtcclxuICAgIGJ5dGVzWzBdID0gY3VycmVudFRpbWVzdGFtcCAvIDIgKiogNDA7XHJcbiAgICBieXRlc1sxXSA9IGN1cnJlbnRUaW1lc3RhbXAgLyAyICoqIDMyO1xyXG4gICAgYnl0ZXNbMl0gPSBjdXJyZW50VGltZXN0YW1wIC8gMiAqKiAyNDtcclxuICAgIGJ5dGVzWzNdID0gY3VycmVudFRpbWVzdGFtcCAvIDIgKiogMTY7XHJcbiAgICBieXRlc1s0XSA9IGN1cnJlbnRUaW1lc3RhbXAgLyAyICoqIDg7XHJcbiAgICBieXRlc1s1XSA9IGN1cnJlbnRUaW1lc3RhbXA7XHJcbiAgICBieXRlc1s2XSA9IDB4NzAgfCAocmFuZEEgPj4+IDgpO1xyXG4gICAgYnl0ZXNbN10gPSByYW5kQTtcclxuICAgIGJ5dGVzWzhdID0gMHg4MCB8IChyYW5kQkhpID4+PiAyNCk7XHJcbiAgICBieXRlc1s5XSA9IHJhbmRCSGkgPj4+IDE2O1xyXG4gICAgYnl0ZXNbMTBdID0gcmFuZEJIaSA+Pj4gODtcclxuICAgIGJ5dGVzWzExXSA9IHJhbmRCSGk7XHJcbiAgICBieXRlc1sxMl0gPSByYW5kQkxvID4+PiAyNDtcclxuICAgIGJ5dGVzWzEzXSA9IHJhbmRCTG8gPj4+IDE2O1xyXG4gICAgYnl0ZXNbMTRdID0gcmFuZEJMbyA+Pj4gODtcclxuICAgIGJ5dGVzWzE1XSA9IHJhbmRCTG87XHJcbiAgICBsZXQgdGV4dCA9IFwiXCI7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGV4dCArPSBVVUlEX0NIQVJTLmNoYXJBdChieXRlc1tpXSA+Pj4gNCk7XHJcbiAgICAgICAgdGV4dCArPSBVVUlEX0NIQVJTLmNoYXJBdChieXRlc1tpXSAmIDB4Zik7XHJcbiAgICAgICAgaWYgKGkgPT09IDMgfHwgaSA9PT0gNSB8fCBpID09PSA3IHx8IGkgPT09IDkpIHtcclxuICAgICAgICAgICAgdGV4dCArPSBcIi1cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGV4dDtcclxufVxyXG4vKipcclxuICogR2VuZXJhdGVzIGEga2V5cGFpciBiYXNlZCBvbiBjdXJyZW50IGtleWdlbiBhbGdvcml0aG0gY29uZmlnLlxyXG4gKiBAcGFyYW0gZXh0cmFjdGFibGVcclxuICogQHBhcmFtIHVzYWdlc1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKGV4dHJhY3RhYmxlLCB1c2FnZXMpIHtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShrZXlnZW5BbGdvcml0aG1PcHRpb25zLCBleHRyYWN0YWJsZSwgdXNhZ2VzKTtcclxufVxyXG4vKipcclxuICogRXhwb3J0IGtleSBhcyBKc29uIFdlYiBLZXkgKEpXSylcclxuICogQHBhcmFtIGtleVxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZXhwb3J0SndrKGtleSkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShLRVlfRk9STUFUX0pXSywga2V5KTtcclxufVxyXG4vKipcclxuICogSW1wb3J0cyBrZXkgYXMgSnNvbiBXZWIgS2V5IChKV0spLCBjYW4gc2V0IGV4dHJhY3RhYmxlIGFuZCB1c2FnZXMuXHJcbiAqIEBwYXJhbSBrZXlcclxuICogQHBhcmFtIGV4dHJhY3RhYmxlXHJcbiAqIEBwYXJhbSB1c2FnZXNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGltcG9ydEp3ayhrZXksIGV4dHJhY3RhYmxlLCB1c2FnZXMpIHtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoS0VZX0ZPUk1BVF9KV0ssIGtleSwga2V5Z2VuQWxnb3JpdGhtT3B0aW9ucywgZXh0cmFjdGFibGUsIHVzYWdlcyk7XHJcbn1cclxuLyoqXHJcbiAqIFNpZ25zIGdpdmVuIGRhdGEgd2l0aCBnaXZlbiBrZXlcclxuICogQHBhcmFtIGtleVxyXG4gKiBAcGFyYW0gZGF0YVxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbihrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5zaWduKGtleWdlbkFsZ29yaXRobU9wdGlvbnMsIGtleSwgZGF0YSk7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIFNIQS0yNTYgaGFzaCBvZiBhbiBpbnB1dCBzdHJpbmdcclxuICogQHBhcmFtIHBsYWluVGV4dFxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gaGFzaFN0cmluZyhwbGFpblRleHQpIHtcclxuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBzaGEyNTZEaWdlc3QocGxhaW5UZXh0KTtcclxuICAgIGNvbnN0IGhhc2hCeXRlcyA9IG5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpO1xyXG4gICAgcmV0dXJuIHVybEVuY29kZUFycihoYXNoQnl0ZXMpO1xyXG59XG5cbmV4cG9ydCB7IGNyZWF0ZU5ld0d1aWQsIGV4cG9ydEp3aywgZ2VuZXJhdGVLZXlQYWlyLCBnZXRSYW5kb21WYWx1ZXMsIGhhc2hTdHJpbmcsIGltcG9ydEp3aywgc2hhMjU2RGlnZXN0LCBzaWduLCB2YWxpZGF0ZUNyeXB0b0F2YWlsYWJsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNyeXB0by5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBzdG9yYWdlTm90U3VwcG9ydGVkID0gXCJzdG9yYWdlX25vdF9zdXBwb3J0ZWRcIjtcclxuY29uc3Qgc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkID0gXCJzdHViYmVkX3B1YmxpY19jbGllbnRfYXBwbGljYXRpb25fY2FsbGVkXCI7XHJcbmNvbnN0IGluTWVtUmVkaXJlY3RVbmF2YWlsYWJsZSA9IFwiaW5fbWVtX3JlZGlyZWN0X3VuYXZhaWxhYmxlXCI7XG5cbmV4cG9ydCB7IGluTWVtUmVkaXJlY3RVbmF2YWlsYWJsZSwgc3RvcmFnZU5vdFN1cHBvcnRlZCwgc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvckNvZGVzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgc3RvcmFnZU5vdFN1cHBvcnRlZCwgc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkLCBpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGUgfSBmcm9tICcuL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMubWpzJztcbmltcG9ydCAqIGFzIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMgZnJvbSAnLi9Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvckNvZGVzLm1qcyc7XG5leHBvcnQgeyBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvckNvZGVzIH07XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvck1lc3NhZ2VzID0ge1xyXG4gICAgW3N0b3JhZ2VOb3RTdXBwb3J0ZWRdOiBcIkdpdmVuIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBvcHRpb24gd2FzIG5vdCBzdXBwb3J0ZWQuXCIsXHJcbiAgICBbc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkXTogXCJTdHViIGluc3RhbmNlIG9mIFB1YmxpYyBDbGllbnQgQXBwbGljYXRpb24gd2FzIGNhbGxlZC4gSWYgdXNpbmcgbXNhbC1yZWFjdCwgcGxlYXNlIGVuc3VyZSBjb250ZXh0IGlzIG5vdCB1c2VkIHdpdGhvdXQgYSBwcm92aWRlci4gRm9yIG1vcmUgdmlzaXQ6IGFrYS5tcy9tc2FsanMvYnJvd3Nlci1lcnJvcnNcIixcclxuICAgIFtpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGVdOiBcIlJlZGlyZWN0IGNhbm5vdCBiZSBzdXBwb3J0ZWQuIEluLW1lbW9yeSBzdG9yYWdlIHdhcyBzZWxlY3RlZCBhbmQgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZT1mYWxzZSwgd2hpY2ggd291bGQgY2F1c2UgdGhlIGxpYnJhcnkgdG8gYmUgdW5hYmxlIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgaGFzaC4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSByZWRpcmVjdCBBUEksIHBsZWFzZSB1c2Ugc2Vzc2lvbi9sb2NhbFN0b3JhZ2Ugb3Igc2V0IHN0b3JlQXV0aFN0YXRlSW5Db29raWU9dHJ1ZS5cIixcclxufTtcclxuLyoqXHJcbiAqIEJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlIGNsYXNzIGNvbnRhaW5pbmcgc3RyaW5nIGNvbnN0YW50cyB1c2VkIGJ5IGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cclxuICogQGRlcHJlY2F0ZWQgVXNlIEJyb3dzZXJBdXRoRXJyb3JDb2RlcyBpbnN0ZWFkXHJcbiAqL1xyXG5jb25zdCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvck1lc3NhZ2UgPSB7XHJcbiAgICBzdG9yYWdlTm90U3VwcG9ydGVkRXJyb3I6IHtcclxuICAgICAgICBjb2RlOiBzdG9yYWdlTm90U3VwcG9ydGVkLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yTWVzc2FnZXNbc3RvcmFnZU5vdFN1cHBvcnRlZF0sXHJcbiAgICB9LFxyXG4gICAgc3R1YlBjYUluc3RhbmNlQ2FsbGVkOiB7XHJcbiAgICAgICAgY29kZTogc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkLFxyXG4gICAgICAgIGRlc2M6IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yTWVzc2FnZXNbc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkXSxcclxuICAgIH0sXHJcbiAgICBpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGU6IHtcclxuICAgICAgICBjb2RlOiBpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGUsXHJcbiAgICAgICAgZGVzYzogQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JNZXNzYWdlc1tpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGVdLFxyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqIEJyb3dzZXIgbGlicmFyeSBlcnJvciBjbGFzcyB0aHJvd24gYnkgdGhlIE1TQUwuanMgbGlicmFyeSBmb3IgU1BBc1xyXG4gKi9cclxuY2xhc3MgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvclwiO1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKGVycm9yQ29kZSkge1xyXG4gICAgcmV0dXJuIG5ldyBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihlcnJvckNvZGUsIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yTWVzc2FnZXNbZXJyb3JDb2RlXSk7XHJcbn1cblxuZXhwb3J0IHsgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IsIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yTWVzc2FnZSwgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JNZXNzYWdlcywgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgVXJsU3RyaW5nIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuZXhwb3J0IHsgaW52b2tlLCBpbnZva2VBc3luYyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBCcm93c2VyQ29uc3RhbnRzLCBCcm93c2VyQ2FjaGVMb2NhdGlvbiB9IGZyb20gJy4vQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgY3JlYXRlTmV3R3VpZCB9IGZyb20gJy4uL2NyeXB0by9Ccm93c2VyQ3J5cHRvLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBibG9ja0lmcmFtZVJlbG9hZCwgcmVkaXJlY3RJbklmcmFtZSwgYmxvY2tOZXN0ZWRQb3B1cHMsIG5vbkJyb3dzZXJFbnZpcm9ubWVudCwgdW5pbml0aWFsaXplZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgeyBpbk1lbVJlZGlyZWN0VW5hdmFpbGFibGUgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2xlYXJzIGhhc2ggZnJvbSB3aW5kb3cgdXJsLlxyXG4gKi9cclxuZnVuY3Rpb24gY2xlYXJIYXNoKGNvbnRlbnRXaW5kb3cpIHtcclxuICAgIC8vIE9mZmljZS5qcyBzZXRzIGhpc3RvcnkucmVwbGFjZVN0YXRlIHRvIG51bGxcclxuICAgIGNvbnRlbnRXaW5kb3cubG9jYXRpb24uaGFzaCA9IFwiXCI7XHJcbiAgICBpZiAodHlwZW9mIGNvbnRlbnRXaW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIC8vIEZ1bGwgcmVtb3ZlcyBcIiNcIiBmcm9tIHVybFxyXG4gICAgICAgIGNvbnRlbnRXaW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgXCJcIiwgYCR7Y29udGVudFdpbmRvdy5sb2NhdGlvbi5vcmlnaW59JHtjb250ZW50V2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7Y29udGVudFdpbmRvdy5sb2NhdGlvbi5zZWFyY2h9YCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJlcGxhY2VzIGN1cnJlbnQgaGFzaCB3aXRoIGhhc2ggZnJvbSBwcm92aWRlZCB1cmxcclxuICovXHJcbmZ1bmN0aW9uIHJlcGxhY2VIYXNoKHVybCkge1xyXG4gICAgY29uc3QgdXJsUGFydHMgPSB1cmwuc3BsaXQoXCIjXCIpO1xyXG4gICAgdXJsUGFydHMuc2hpZnQoKTsgLy8gUmVtb3ZlIHBhcnQgYmVmb3JlIHRoZSBoYXNoXHJcbiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IHVybFBhcnRzLmxlbmd0aCA+IDAgPyB1cmxQYXJ0cy5qb2luKFwiI1wiKSA6IFwiXCI7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgYm9vbGVhbiBvZiB3aGV0aGVyIHRoZSBjdXJyZW50IHdpbmRvdyBpcyBpbiBhbiBpZnJhbWUgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNJbklmcmFtZSgpIHtcclxuICAgIHJldHVybiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3c7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgYm9vbGVhbiBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCB3aW5kb3cgaXMgYSBwb3B1cCBvcGVuZWQgYnkgbXNhbFxyXG4gKi9cclxuZnVuY3Rpb24gaXNJblBvcHVwKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgISF3aW5kb3cub3BlbmVyICYmXHJcbiAgICAgICAgd2luZG93Lm9wZW5lciAhPT0gd2luZG93ICYmXHJcbiAgICAgICAgdHlwZW9mIHdpbmRvdy5uYW1lID09PSBcInN0cmluZ1wiICYmXHJcbiAgICAgICAgd2luZG93Lm5hbWUuaW5kZXhPZihgJHtCcm93c2VyQ29uc3RhbnRzLlBPUFVQX05BTUVfUFJFRklYfS5gKSA9PT0gMCk7XHJcbn1cclxuLy8gI2VuZHJlZ2lvblxyXG4vKipcclxuICogUmV0dXJucyBjdXJyZW50IHdpbmRvdyBVUkwgYXMgcmVkaXJlY3QgdXJpXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDdXJyZW50VXJpKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uXHJcbiAgICAgICAgPyB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCIjXCIpWzBdXHJcbiAgICAgICAgOiBcIlwiO1xyXG59XHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBob21lcGFnZSB1cmwgZm9yIHRoZSBjdXJyZW50IHdpbmRvdyBsb2NhdGlvbi5cclxuICovXHJcbmZ1bmN0aW9uIGdldEhvbWVwYWdlKCkge1xyXG4gICAgY29uc3QgY3VycmVudFVybCA9IG5ldyBVcmxTdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgY29uc3QgdXJsQ29tcG9uZW50cyA9IGN1cnJlbnRVcmwuZ2V0VXJsQ29tcG9uZW50cygpO1xyXG4gICAgcmV0dXJuIGAke3VybENvbXBvbmVudHMuUHJvdG9jb2x9Ly8ke3VybENvbXBvbmVudHMuSG9zdE5hbWVBbmRQb3J0fS9gO1xyXG59XHJcbi8qKlxyXG4gKiBUaHJvd3MgZXJyb3IgaWYgd2UgaGF2ZSBjb21wbGV0ZWQgYW4gYXV0aCBhbmQgYXJlXHJcbiAqIGF0dGVtcHRpbmcgYW5vdGhlciBhdXRoIHJlcXVlc3QgaW5zaWRlIGFuIGlmcmFtZS5cclxuICovXHJcbmZ1bmN0aW9uIGJsb2NrUmVsb2FkSW5IaWRkZW5JZnJhbWVzKCkge1xyXG4gICAgY29uc3QgaXNSZXNwb25zZUhhc2ggPSBVcmxTdHJpbmcuaGFzaENvbnRhaW5zS25vd25Qcm9wZXJ0aWVzKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtcclxuICAgIC8vIHJldHVybiBhbiBlcnJvciBpZiBjYWxsZWQgZnJvbSB0aGUgaGlkZGVuIGlmcmFtZSBjcmVhdGVkIGJ5IHRoZSBtc2FsIGpzIHNpbGVudCBjYWxsc1xyXG4gICAgaWYgKGlzUmVzcG9uc2VIYXNoICYmIGlzSW5JZnJhbWUoKSkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoYmxvY2tJZnJhbWVSZWxvYWQpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBCbG9jayByZWRpcmVjdCBvcGVyYXRpb25zIGluIGlmcmFtZXMgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZFxyXG4gKiBAcGFyYW0gaW50ZXJhY3Rpb25UeXBlIEludGVyYWN0aW9uIHR5cGUgZm9yIHRoZSByZXF1ZXN0XHJcbiAqIEBwYXJhbSBhbGxvd1JlZGlyZWN0SW5JZnJhbWUgQ29uZmlnIHZhbHVlIHRvIGFsbG93IHJlZGlyZWN0cyB3aGVuIGFwcCBpcyBpbnNpZGUgYW4gaWZyYW1lXHJcbiAqL1xyXG5mdW5jdGlvbiBibG9ja1JlZGlyZWN0SW5JZnJhbWUoYWxsb3dSZWRpcmVjdEluSWZyYW1lKSB7XHJcbiAgICBpZiAoaXNJbklmcmFtZSgpICYmICFhbGxvd1JlZGlyZWN0SW5JZnJhbWUpIHtcclxuICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGluIHRvcCBmcmFtZSwgd2Ugc2hvdWxkbid0IHJlZGlyZWN0LiBUaGlzIGlzIGFsc28gaGFuZGxlZCBieSB0aGUgc2VydmljZS5cclxuICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKHJlZGlyZWN0SW5JZnJhbWUpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBCbG9jayByZWRpcmVjdFVyaSBsb2FkZWQgaW4gcG9wdXAgZnJvbSBjYWxsaW5nIEFjcXVpcmVUb2tlbiBBUElzXHJcbiAqL1xyXG5mdW5jdGlvbiBibG9ja0FjcXVpcmVUb2tlbkluUG9wdXBzKCkge1xyXG4gICAgLy8gUG9wdXBzIG9wZW5lZCBieSBtc2FsIHBvcHVwIEFQSXMgYXJlIGdpdmVuIGEgbmFtZSB0aGF0IHN0YXJ0cyB3aXRoIFwibXNhbC5cIlxyXG4gICAgaWYgKGlzSW5Qb3B1cCgpKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihibG9ja05lc3RlZFBvcHVwcyk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFRocm93cyBlcnJvciBpZiB0b2tlbiByZXF1ZXN0cyBhcmUgbWFkZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudFxyXG4gKiBAcGFyYW0gaXNCcm93c2VyRW52aXJvbm1lbnQgRmxhZyBpbmRpY2F0aW5nIGlmIGVudmlyb25tZW50IGlzIGEgYnJvd3Nlci5cclxuICovXHJcbmZ1bmN0aW9uIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCkge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKG5vbkJyb3dzZXJFbnZpcm9ubWVudCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFRocm93cyBlcnJvciBpZiBpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZFxyXG4gKiBAcGFyYW0gaW5pdGlhbGl6ZWRcclxuICovXHJcbmZ1bmN0aW9uIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKGluaXRpYWxpemVkKSB7XHJcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcih1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb24pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gdmFsaWRhdGUgYXBwIGVudmlyb25tZW50IGJlZm9yZSBtYWtpbmcgYW4gYXV0aCByZXF1ZXN0XHJcbiAqIEBwYXJhbSBpbml0aWFsaXplZFxyXG4gKi9cclxuZnVuY3Rpb24gcHJlZmxpZ2h0Q2hlY2soaW5pdGlhbGl6ZWQpIHtcclxuICAgIC8vIEJsb2NrIHJlcXVlc3QgaWYgbm90IGluIGJyb3dzZXIgZW52aXJvbm1lbnRcclxuICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAvLyBCbG9jayBhdXRoIHJlcXVlc3RzIGluc2lkZSBhIGhpZGRlbiBpZnJhbWVcclxuICAgIGJsb2NrUmVsb2FkSW5IaWRkZW5JZnJhbWVzKCk7XHJcbiAgICAvLyBCbG9jayByZWRpcmVjdFVyaSBvcGVuZWQgaW4gYSBwb3B1cCBmcm9tIGNhbGxpbmcgTVNBTCBBUElzXHJcbiAgICBibG9ja0FjcXVpcmVUb2tlbkluUG9wdXBzKCk7XHJcbiAgICAvLyBCbG9jayB0b2tlbiBhY3F1aXNpdGlvbiBiZWZvcmUgaW5pdGlhbGl6ZSBoYXMgYmVlbiBjYWxsZWRcclxuICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKGluaXRpYWxpemVkKTtcclxufVxyXG4vKipcclxuICogSGVscGVyIHRvIHZhbGlkYXRlIGFwcCBlbnZpb3JubWVudCBiZWZvcmUgbWFraW5nIHJlZGlyZWN0IHJlcXVlc3RcclxuICogQHBhcmFtIGluaXRpYWxpemVkXHJcbiAqIEBwYXJhbSBjb25maWdcclxuICovXHJcbmZ1bmN0aW9uIHJlZGlyZWN0UHJlZmxpZ2h0Q2hlY2soaW5pdGlhbGl6ZWQsIGNvbmZpZykge1xyXG4gICAgcHJlZmxpZ2h0Q2hlY2soaW5pdGlhbGl6ZWQpO1xyXG4gICAgYmxvY2tSZWRpcmVjdEluSWZyYW1lKGNvbmZpZy5zeXN0ZW0uYWxsb3dSZWRpcmVjdEluSWZyYW1lKTtcclxuICAgIC8vIEJsb2NrIHJlZGlyZWN0cyBpZiBtZW1vcnkgc3RvcmFnZSBpcyBlbmFibGVkIGJ1dCBzdG9yZUF1dGhTdGF0ZUluQ29va2llIGlzIG5vdFxyXG4gICAgaWYgKGNvbmZpZy5jYWNoZS5jYWNoZUxvY2F0aW9uID09PSBCcm93c2VyQ2FjaGVMb2NhdGlvbi5NZW1vcnlTdG9yYWdlICYmXHJcbiAgICAgICAgIWNvbmZpZy5jYWNoZS5zdG9yZUF1dGhTdGF0ZUluQ29va2llKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IoaW5NZW1SZWRpcmVjdFVuYXZhaWxhYmxlKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQWRkcyBhIHByZWNvbm5lY3QgbGluayBlbGVtZW50IHRvIHRoZSBoZWFkZXIgd2hpY2ggYmVnaW5zIEROUyByZXNvbHV0aW9uIGFuZCBTU0wgY29ubmVjdGlvbiBpbiBhbnRpY2lwYXRpb24gb2YgdGhlIC90b2tlbiByZXF1ZXN0XHJcbiAqIEBwYXJhbSBsb2dpbkRvbWFpbiBBdXRob3JpdHkgZG9tYWluLCBpbmNsdWRpbmcgaHR0cHMgcHJvdG9jb2wgZS5nLiBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb21cclxuICogQHJldHVybnNcclxuICovXHJcbmZ1bmN0aW9uIHByZWNvbm5lY3QoYXV0aG9yaXR5KSB7XHJcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcbiAgICBsaW5rLnJlbCA9IFwicHJlY29ubmVjdFwiO1xyXG4gICAgbGluay5ocmVmID0gbmV3IFVSTChhdXRob3JpdHkpLm9yaWdpbjtcclxuICAgIGxpbmsuY3Jvc3NPcmlnaW4gPSBcImFub255bW91c1wiO1xyXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIC8vIFRoZSBicm93c2VyIHdpbGwgY2xvc2UgY29ubmVjdGlvbiBpZiBub3QgdXNlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcywgcmVtb3ZlIGVsZW1lbnQgZnJvbSB0aGUgaGVhZGVyIGFmdGVyIDEwc1xyXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHsgfVxyXG4gICAgfSwgMTAwMDApOyAvLyAxMHMgVGltZW91dFxyXG59XHJcbi8qKlxyXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIFVVSUQgdjcgZnJvbSB0aGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVHdWlkKCkge1xyXG4gICAgcmV0dXJuIGNyZWF0ZU5ld0d1aWQoKTtcclxufVxuXG5leHBvcnQgeyBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSwgYmxvY2tBY3F1aXJlVG9rZW5JblBvcHVwcywgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQsIGJsb2NrUmVkaXJlY3RJbklmcmFtZSwgYmxvY2tSZWxvYWRJbkhpZGRlbklmcmFtZXMsIGNsZWFySGFzaCwgY3JlYXRlR3VpZCwgZ2V0Q3VycmVudFVyaSwgZ2V0SG9tZXBhZ2UsIGlzSW5JZnJhbWUsIGlzSW5Qb3B1cCwgcHJlY29ubmVjdCwgcHJlZmxpZ2h0Q2hlY2ssIHJlZGlyZWN0UHJlZmxpZ2h0Q2hlY2ssIHJlcGxhY2VIYXNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyVXRpbHMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBMb2cgbWVzc2FnZSBsZXZlbC5cclxuICovXHJcbnZhciBMb2dMZXZlbDtcclxuKGZ1bmN0aW9uIChMb2dMZXZlbCkge1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJFcnJvclwiXSA9IDBdID0gXCJFcnJvclwiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJXYXJuaW5nXCJdID0gMV0gPSBcIldhcm5pbmdcIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiSW5mb1wiXSA9IDJdID0gXCJJbmZvXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlZlcmJvc2VcIl0gPSAzXSA9IFwiVmVyYm9zZVwiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJUcmFjZVwiXSA9IDRdID0gXCJUcmFjZVwiO1xyXG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xyXG4vKipcclxuICogQ2xhc3Mgd2hpY2ggZmFjaWxpdGF0ZXMgbG9nZ2luZyBvZiBtZXNzYWdlcyB0byBhIHNwZWNpZmljIHBsYWNlLlxyXG4gKi9cclxuY2xhc3MgTG9nZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGxvZ2dlck9wdGlvbnMsIHBhY2thZ2VOYW1lLCBwYWNrYWdlVmVyc2lvbikge1xyXG4gICAgICAgIC8vIEN1cnJlbnQgbG9nIGxldmVsLCBkZWZhdWx0cyB0byBpbmZvLlxyXG4gICAgICAgIHRoaXMubGV2ZWwgPSBMb2dMZXZlbC5JbmZvO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMb2dnZXJDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2V0TG9nZ2VyT3B0aW9ucyA9IGxvZ2dlck9wdGlvbnMgfHwgTG9nZ2VyLmNyZWF0ZURlZmF1bHRMb2dnZXJPcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhbGxiYWNrID1cclxuICAgICAgICAgICAgc2V0TG9nZ2VyT3B0aW9ucy5sb2dnZXJDYWxsYmFjayB8fCBkZWZhdWx0TG9nZ2VyQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5waWlMb2dnaW5nRW5hYmxlZCA9IHNldExvZ2dlck9wdGlvbnMucGlpTG9nZ2luZ0VuYWJsZWQgfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sZXZlbCA9XHJcbiAgICAgICAgICAgIHR5cGVvZiBzZXRMb2dnZXJPcHRpb25zLmxvZ0xldmVsID09PSBcIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICA/IHNldExvZ2dlck9wdGlvbnMubG9nTGV2ZWxcclxuICAgICAgICAgICAgICAgIDogTG9nTGV2ZWwuSW5mbztcclxuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uSWQgPVxyXG4gICAgICAgICAgICBzZXRMb2dnZXJPcHRpb25zLmNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICB0aGlzLnBhY2thZ2VWZXJzaW9uID0gcGFja2FnZVZlcnNpb24gfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVhdGVEZWZhdWx0TG9nZ2VyT3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsb2dnZXJDYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsb3cgdXNlcnMgdG8gbm90IHNldCBsb2dnZXJDYWxsYmFja1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwaWlMb2dnaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiBMb2dMZXZlbC5JbmZvLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBuZXcgTG9nZ2VyIHdpdGggZXhpc3RpbmcgY29uZmlndXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIGNsb25lKHBhY2thZ2VOYW1lLCBwYWNrYWdlVmVyc2lvbiwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyKHtcclxuICAgICAgICAgICAgbG9nZ2VyQ2FsbGJhY2s6IHRoaXMubG9jYWxDYWxsYmFjayxcclxuICAgICAgICAgICAgcGlpTG9nZ2luZ0VuYWJsZWQ6IHRoaXMucGlpTG9nZ2luZ0VuYWJsZWQsXHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLmxldmVsLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IHRoaXMuY29ycmVsYXRpb25JZCxcclxuICAgICAgICB9LCBwYWNrYWdlTmFtZSwgcGFja2FnZVZlcnNpb24pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2cgbWVzc2FnZSB3aXRoIHJlcXVpcmVkIG9wdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIGxvZ01lc3NhZ2UobG9nTWVzc2FnZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGlmIChvcHRpb25zLmxvZ0xldmVsID4gdGhpcy5sZXZlbCB8fFxyXG4gICAgICAgICAgICAoIXRoaXMucGlpTG9nZ2luZ0VuYWJsZWQgJiYgb3B0aW9ucy5jb250YWluc1BpaSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCk7XHJcbiAgICAgICAgLy8gQWRkIGNvcnJlbGF0aW9uSWQgdG8gbG9ncyBpZiBzZXQsIGNvcnJlbGF0aW9uSWQgcHJvdmlkZWQgb24gbG9nIG1lc3NhZ2VzIHRha2UgcHJlY2VkZW5jZVxyXG4gICAgICAgIGNvbnN0IGxvZ0hlYWRlciA9IGBbJHt0aW1lc3RhbXB9XSA6IFske29wdGlvbnMuY29ycmVsYXRpb25JZCB8fCB0aGlzLmNvcnJlbGF0aW9uSWQgfHwgXCJcIn1dYDtcclxuICAgICAgICBjb25zdCBsb2cgPSBgJHtsb2dIZWFkZXJ9IDogJHt0aGlzLnBhY2thZ2VOYW1lfUAke3RoaXMucGFja2FnZVZlcnNpb259IDogJHtMb2dMZXZlbFtvcHRpb25zLmxvZ0xldmVsXX0gLSAke2xvZ01lc3NhZ2V9YDtcclxuICAgICAgICAvLyBkZWJ1ZyhgbXNhbDoke0xvZ0xldmVsW29wdGlvbnMubG9nTGV2ZWxdfSR7b3B0aW9ucy5jb250YWluc1BpaSA/IFwiLVBpaVwiOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HfSR7b3B0aW9ucy5jb250ZXh0ID8gYDoke29wdGlvbnMuY29udGV4dH1gIDogQ29uc3RhbnRzLkVNUFRZX1NUUklOR31gKShsb2dNZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhvcHRpb25zLmxvZ0xldmVsLCBsb2csIG9wdGlvbnMuY29udGFpbnNQaWkgfHwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeGVjdXRlIGNhbGxiYWNrIHdpdGggbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgZXhlY3V0ZUNhbGxiYWNrKGxldmVsLCBtZXNzYWdlLCBjb250YWluc1BpaSkge1xyXG4gICAgICAgIGlmICh0aGlzLmxvY2FsQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5sb2NhbENhbGxiYWNrKGxldmVsLCBtZXNzYWdlLCBjb250YWluc1BpaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIGVycm9yIG1lc3NhZ2VzLlxyXG4gICAgICovXHJcbiAgICBlcnJvcihtZXNzYWdlLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKG1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLkVycm9yLFxyXG4gICAgICAgICAgICBjb250YWluc1BpaTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyBlcnJvciBtZXNzYWdlcyB3aXRoIFBJSS5cclxuICAgICAqL1xyXG4gICAgZXJyb3JQaWkobWVzc2FnZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZShtZXNzYWdlLCB7XHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiBMb2dMZXZlbC5FcnJvcixcclxuICAgICAgICAgICAgY29udGFpbnNQaWk6IHRydWUsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB3YXJuaW5nIG1lc3NhZ2VzLlxyXG4gICAgICovXHJcbiAgICB3YXJuaW5nKG1lc3NhZ2UsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UobWVzc2FnZSwge1xyXG4gICAgICAgICAgICBsb2dMZXZlbDogTG9nTGV2ZWwuV2FybmluZyxcclxuICAgICAgICAgICAgY29udGFpbnNQaWk6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIExvZ3Mgd2FybmluZyBtZXNzYWdlcyB3aXRoIFBJSS5cclxuICAgICAqL1xyXG4gICAgd2FybmluZ1BpaShtZXNzYWdlLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKG1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLldhcm5pbmcsXHJcbiAgICAgICAgICAgIGNvbnRhaW5zUGlpOiB0cnVlLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIExvZ3MgaW5mbyBtZXNzYWdlcy5cclxuICAgICAqL1xyXG4gICAgaW5mbyhtZXNzYWdlLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dNZXNzYWdlKG1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLkluZm8sXHJcbiAgICAgICAgICAgIGNvbnRhaW5zUGlpOiBmYWxzZSxcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIGluZm8gbWVzc2FnZXMgd2l0aCBQSUkuXHJcbiAgICAgKi9cclxuICAgIGluZm9QaWkobWVzc2FnZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZShtZXNzYWdlLCB7XHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiBMb2dMZXZlbC5JbmZvLFxyXG4gICAgICAgICAgICBjb250YWluc1BpaTogdHJ1ZSxcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHZlcmJvc2UgbWVzc2FnZXMuXHJcbiAgICAgKi9cclxuICAgIHZlcmJvc2UobWVzc2FnZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZShtZXNzYWdlLCB7XHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiBMb2dMZXZlbC5WZXJib3NlLFxyXG4gICAgICAgICAgICBjb250YWluc1BpaTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB2ZXJib3NlIG1lc3NhZ2VzIHdpdGggUElJLlxyXG4gICAgICovXHJcbiAgICB2ZXJib3NlUGlpKG1lc3NhZ2UsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UobWVzc2FnZSwge1xyXG4gICAgICAgICAgICBsb2dMZXZlbDogTG9nTGV2ZWwuVmVyYm9zZSxcclxuICAgICAgICAgICAgY29udGFpbnNQaWk6IHRydWUsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0cmFjZSBtZXNzYWdlcy5cclxuICAgICAqL1xyXG4gICAgdHJhY2UobWVzc2FnZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubG9nTWVzc2FnZShtZXNzYWdlLCB7XHJcbiAgICAgICAgICAgIGxvZ0xldmVsOiBMb2dMZXZlbC5UcmFjZSxcclxuICAgICAgICAgICAgY29udGFpbnNQaWk6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIExvZ3MgdHJhY2UgbWVzc2FnZXMgd2l0aCBQSUkuXHJcbiAgICAgKi9cclxuICAgIHRyYWNlUGlpKG1lc3NhZ2UsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmxvZ01lc3NhZ2UobWVzc2FnZSwge1xyXG4gICAgICAgICAgICBsb2dMZXZlbDogTG9nTGV2ZWwuVHJhY2UsXHJcbiAgICAgICAgICAgIGNvbnRhaW5zUGlpOiB0cnVlLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciBQSUkgTG9nZ2luZyBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNQaWlMb2dnaW5nRW5hYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWlMb2dnaW5nRW5hYmxlZCB8fCBmYWxzZTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nZ2VyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dnZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3RvY29sIG1vZGVzIHN1cHBvcnRlZCBieSBNU0FMLlxyXG4gKi9cclxuY29uc3QgUHJvdG9jb2xNb2RlID0ge1xyXG4gICAgQUFEOiBcIkFBRFwiLFxyXG4gICAgT0lEQzogXCJPSURDXCIsXHJcbn07XG5cbmV4cG9ydCB7IFByb3RvY29sTW9kZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvdG9jb2xNb2RlLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEF6dXJlQ2xvdWRJbnN0YW5jZSA9IHtcclxuICAgIC8vIEF6dXJlQ2xvdWRJbnN0YW5jZSBpcyBub3Qgc3BlY2lmaWVkLlxyXG4gICAgTm9uZTogXCJub25lXCIsXHJcbiAgICAvLyBNaWNyb3NvZnQgQXp1cmUgcHVibGljIGNsb3VkXHJcbiAgICBBenVyZVB1YmxpYzogXCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb21cIixcclxuICAgIC8vIE1pY3Jvc29mdCBQUEVcclxuICAgIEF6dXJlUHBlOiBcImh0dHBzOi8vbG9naW4ud2luZG93cy1wcGUubmV0XCIsXHJcbiAgICAvLyBNaWNyb3NvZnQgQ2hpbmVzZSBuYXRpb25hbC9yZWdpb25hbCBjbG91ZFxyXG4gICAgQXp1cmVDaGluYTogXCJodHRwczovL2xvZ2luLmNoaW5hY2xvdWRhcGkuY25cIixcclxuICAgIC8vIE1pY3Jvc29mdCBHZXJtYW4gbmF0aW9uYWwvcmVnaW9uYWwgY2xvdWQgKFwiQmxhY2sgRm9yZXN0XCIpXHJcbiAgICBBenVyZUdlcm1hbnk6IFwiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuZGVcIixcclxuICAgIC8vIFVTIEdvdmVybm1lbnQgY2xvdWRcclxuICAgIEF6dXJlVXNHb3Zlcm5tZW50OiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzXCIsXHJcbn07XG5cbmV4cG9ydCB7IEF6dXJlQ2xvdWRJbnN0YW5jZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aG9yaXR5T3B0aW9ucy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgbWV0aG9kTm90SW1wbGVtZW50ZWQgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9DUllQVE9fSU1QTEVNRU5UQVRJT04gPSB7XHJcbiAgICBjcmVhdGVOZXdHdWlkOiAoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH0sXHJcbiAgICBiYXNlNjREZWNvZGU6ICgpID0+IHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfSxcclxuICAgIGJhc2U2NEVuY29kZTogKCkgPT4ge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9LFxyXG4gICAgYmFzZTY0VXJsRW5jb2RlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH0sXHJcbiAgICBlbmNvZGVLaWQ6ICgpID0+IHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIGdldFB1YmxpY0tleVRodW1icHJpbnQoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH0sXHJcbiAgICBhc3luYyByZW1vdmVUb2tlbkJpbmRpbmdLZXkoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH0sXHJcbiAgICBhc3luYyBjbGVhcktleXN0b3JlKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9LFxyXG4gICAgYXN5bmMgc2lnbkp3dCgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIGhhc2hTdHJpbmcoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH0sXHJcbn07XG5cbmV4cG9ydCB7IERFRkFVTFRfQ1JZUFRPX0lNUExFTUVOVEFUSU9OIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JQ3J5cHRvLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgaGVhZGVyL2hlYWRlciAqL1xyXG5jb25zdCBuYW1lID0gXCJAYXp1cmUvbXNhbC1jb21tb25cIjtcclxuY29uc3QgdmVyc2lvbiA9IFwiMTQuMTYuMFwiO1xuXG5leHBvcnQgeyBuYW1lLCB2ZXJzaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWNrYWdlTWV0YWRhdGEubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IHRva2VuUGFyc2luZ0Vycm9yLCBudWxsT3JFbXB0eVRva2VuLCBtYXhBZ2VUcmFuc3BpcmVkIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBFeHRyYWN0IHRva2VuIGJ5IGRlY29kaW5nIHRoZSByYXdUb2tlblxyXG4gKlxyXG4gKiBAcGFyYW0gZW5jb2RlZFRva2VuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0VG9rZW5DbGFpbXMoZW5jb2RlZFRva2VuLCBiYXNlNjREZWNvZGUpIHtcclxuICAgIGNvbnN0IGpzd1BheWxvYWQgPSBnZXRKV1NQYXlsb2FkKGVuY29kZWRUb2tlbik7XHJcbiAgICAvLyB0b2tlbiB3aWxsIGJlIGRlY29kZWQgdG8gZ2V0IHRoZSB1c2VybmFtZVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBiYXNlNjREZWNvZGUoKSBzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWVcclxuICAgICAgICBjb25zdCBiYXNlNjREZWNvZGVkID0gYmFzZTY0RGVjb2RlKGpzd1BheWxvYWQpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGJhc2U2NERlY29kZWQpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcih0b2tlblBhcnNpbmdFcnJvcik7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIGRlY29kZSBhIEpXVFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aFRva2VuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRKV1NQYXlsb2FkKGF1dGhUb2tlbikge1xyXG4gICAgaWYgKCFhdXRoVG9rZW4pIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobnVsbE9yRW1wdHlUb2tlbik7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0b2tlblBhcnRzUmVnZXggPSAvXihbXlxcLlxcc10qKVxcLihbXlxcLlxcc10rKVxcLihbXlxcLlxcc10qKSQvO1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IHRva2VuUGFydHNSZWdleC5leGVjKGF1dGhUb2tlbik7XHJcbiAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCA0KSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKHRva2VuUGFyc2luZ0Vycm9yKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY29uc3QgY3JhY2tlZFRva2VuID0ge1xyXG4gICAgICogIGhlYWRlcjogbWF0Y2hlc1sxXSxcclxuICAgICAqICBKV1NQYXlsb2FkOiBtYXRjaGVzWzJdLFxyXG4gICAgICogIEpXU1NpZzogbWF0Y2hlc1szXSxcclxuICAgICAqIH07XHJcbiAgICAgKi9cclxuICAgIHJldHVybiBtYXRjaGVzWzJdO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHRva2VuJ3MgbWF4X2FnZSBoYXMgdHJhbnNwaXJlZFxyXG4gKi9cclxuZnVuY3Rpb24gY2hlY2tNYXhBZ2UoYXV0aFRpbWUsIG1heEFnZSkge1xyXG4gICAgLypcclxuICAgICAqIHBlciBodHRwczovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLWNvbm5lY3QtY29yZS0xXzAuaHRtbCNBdXRoUmVxdWVzdFxyXG4gICAgICogVG8gZm9yY2UgYW4gaW1tZWRpYXRlIHJlLWF1dGhlbnRpY2F0aW9uOiBJZiBhbiBhcHAgcmVxdWlyZXMgdGhhdCBhIHVzZXIgcmUtYXV0aGVudGljYXRlIHByaW9yIHRvIGFjY2VzcyxcclxuICAgICAqIHByb3ZpZGUgYSB2YWx1ZSBvZiAwIGZvciB0aGUgbWF4X2FnZSBwYXJhbWV0ZXIgYW5kIHRoZSBBUyB3aWxsIGZvcmNlIGEgZnJlc2ggbG9naW4uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGZpdmVNaW51dGVTa2V3ID0gMzAwMDAwOyAvLyBmaXZlIG1pbnV0ZXMgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICBpZiAobWF4QWdlID09PSAwIHx8IERhdGUubm93KCkgLSBmaXZlTWludXRlU2tldyA+IGF1dGhUaW1lICsgbWF4QWdlKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1heEFnZVRyYW5zcGlyZWQpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGNoZWNrTWF4QWdlLCBleHRyYWN0VG9rZW5DbGFpbXMsIGdldEpXU1BheWxvYWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF1dGhUb2tlbi5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGRhdGUgYW5kIHRpbWUgb3BlcmF0aW9ucy5cclxuICovXHJcbi8qKlxyXG4gKiByZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBpbiBVbml4IHRpbWUgKHNlY29uZHMpLlxyXG4gKi9cclxuZnVuY3Rpb24gbm93U2Vjb25kcygpIHtcclxuICAgIC8vIERhdGUuZ2V0VGltZSgpIHJldHVybnMgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwLjApO1xyXG59XHJcbi8qKlxyXG4gKiBjaGVjayBpZiBhIHRva2VuIGlzIGV4cGlyZWQgYmFzZWQgb24gZ2l2ZW4gVVRDIHRpbWUgaW4gc2Vjb25kcy5cclxuICogQHBhcmFtIGV4cGlyZXNPblxyXG4gKi9cclxuZnVuY3Rpb24gaXNUb2tlbkV4cGlyZWQoZXhwaXJlc09uLCBvZmZzZXQpIHtcclxuICAgIC8vIGNoZWNrIGZvciBhY2Nlc3MgdG9rZW4gZXhwaXJ5XHJcbiAgICBjb25zdCBleHBpcmF0aW9uU2VjID0gTnVtYmVyKGV4cGlyZXNPbikgfHwgMDtcclxuICAgIGNvbnN0IG9mZnNldEN1cnJlbnRUaW1lU2VjID0gbm93U2Vjb25kcygpICsgb2Zmc2V0O1xyXG4gICAgLy8gSWYgY3VycmVudCB0aW1lICsgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiB0b2tlbiBleHBpcmF0aW9uIHRpbWUsIHRoZW4gdG9rZW4gaXMgZXhwaXJlZC5cclxuICAgIHJldHVybiBvZmZzZXRDdXJyZW50VGltZVNlYyA+IGV4cGlyYXRpb25TZWM7XHJcbn1cclxuLyoqXHJcbiAqIElmIHRoZSBjdXJyZW50IHRpbWUgaXMgZWFybGllciB0aGFuIHRoZSB0aW1lIHRoYXQgYSB0b2tlbiB3YXMgY2FjaGVkIGF0LCB3ZSBtdXN0IGRpc2NhcmQgdGhlIHRva2VuXHJcbiAqIGkuZS4gVGhlIHN5c3RlbSBjbG9jayB3YXMgdHVybmVkIGJhY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBjYWNoZWQgdG9rZW5cclxuICogQHBhcmFtIGNhY2hlZEF0XHJcbiAqIEBwYXJhbSBvZmZzZXRcclxuICovXHJcbmZ1bmN0aW9uIHdhc0Nsb2NrVHVybmVkQmFjayhjYWNoZWRBdCkge1xyXG4gICAgY29uc3QgY2FjaGVkQXRTZWMgPSBOdW1iZXIoY2FjaGVkQXQpO1xyXG4gICAgcmV0dXJuIGNhY2hlZEF0U2VjID4gbm93U2Vjb25kcygpO1xyXG59XHJcbi8qKlxyXG4gKiBXYWl0cyBmb3IgdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXHJcbiAqIEBwYXJhbSB0IG51bWJlclxyXG4gKiBAcGFyYW0gdmFsdWUgVFxyXG4gKi9cclxuZnVuY3Rpb24gZGVsYXkodCwgdmFsdWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHZhbHVlKSwgdCkpO1xyXG59XG5cbmV4cG9ydCB7IGRlbGF5LCBpc1Rva2VuRXhwaXJlZCwgbm93U2Vjb25kcywgd2FzQ2xvY2tUdXJuZWRCYWNrIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaW1lVXRpbHMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBleHRyYWN0VG9rZW5DbGFpbXMgfSBmcm9tICcuLi8uLi9hY2NvdW50L0F1dGhUb2tlbi5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBTZXBhcmF0b3JzLCBDcmVkZW50aWFsVHlwZSwgQXV0aGVudGljYXRpb25TY2hlbWUsIFNFUlZFUl9URUxFTV9DT05TVEFOVFMsIFRocm90dGxpbmdDb25zdGFudHMsIEFQUF9NRVRBREFUQSwgQVVUSE9SSVRZX01FVEFEQVRBX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgbm93U2Vjb25kcyB9IGZyb20gJy4uLy4uL3V0aWxzL1RpbWVVdGlscy5tanMnO1xuaW1wb3J0IHsgdG9rZW5DbGFpbXNDbmZSZXF1aXJlZEZvclNpZ25lZEp3dCB9IGZyb20gJy4uLy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2FjaGUgS2V5OiA8aG9tZV9hY2NvdW50X2lkPi08ZW52aXJvbm1lbnQ+LTxjcmVkZW50aWFsX3R5cGU+LTxjbGllbnRfaWQgb3IgZmFtaWx5SWQ+LTxyZWFsbT4tPHNjb3Blcz4tPGNsYWltcyBoYXNoPi08c2NoZW1lPlxyXG4gKiBJZFRva2VuIEV4YW1wbGU6IHVpZC51dGlkLWxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20taWR0b2tlbi1hcHBfY2xpZW50X2lkLWNvbnRvc28uY29tXHJcbiAqIEFjY2Vzc1Rva2VuIEV4YW1wbGU6IHVpZC51dGlkLWxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20tYWNjZXNzdG9rZW4tYXBwX2NsaWVudF9pZC1jb250b3NvLmNvbS1zY29wZTEgc2NvcGUyLS1wb3BcclxuICogUmVmcmVzaFRva2VuIEV4YW1wbGU6IHVpZC51dGlkLWxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20tcmVmcmVzaHRva2VuLTEtY29udG9zby5jb21cclxuICogQHBhcmFtIGNyZWRlbnRpYWxFbnRpdHlcclxuICogQHJldHVybnNcclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQ3JlZGVudGlhbEtleShjcmVkZW50aWFsRW50aXR5KSB7XHJcbiAgICBjb25zdCBjcmVkZW50aWFsS2V5ID0gW1xyXG4gICAgICAgIGdlbmVyYXRlQWNjb3VudElkKGNyZWRlbnRpYWxFbnRpdHkpLFxyXG4gICAgICAgIGdlbmVyYXRlQ3JlZGVudGlhbElkKGNyZWRlbnRpYWxFbnRpdHkpLFxyXG4gICAgICAgIGdlbmVyYXRlVGFyZ2V0KGNyZWRlbnRpYWxFbnRpdHkpLFxyXG4gICAgICAgIGdlbmVyYXRlQ2xhaW1zSGFzaChjcmVkZW50aWFsRW50aXR5KSxcclxuICAgICAgICBnZW5lcmF0ZVNjaGVtZShjcmVkZW50aWFsRW50aXR5KSxcclxuICAgIF07XHJcbiAgICByZXR1cm4gY3JlZGVudGlhbEtleS5qb2luKFNlcGFyYXRvcnMuQ0FDSEVfS0VZX1NFUEFSQVRPUikudG9Mb3dlckNhc2UoKTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlIElkVG9rZW5FbnRpdHlcclxuICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uUmVzdWx0XHJcbiAqIEBwYXJhbSBjbGllbnRJZFxyXG4gKiBAcGFyYW0gYXV0aG9yaXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVJZFRva2VuRW50aXR5KGhvbWVBY2NvdW50SWQsIGVudmlyb25tZW50LCBpZFRva2VuLCBjbGllbnRJZCwgdGVuYW50SWQpIHtcclxuICAgIGNvbnN0IGlkVG9rZW5FbnRpdHkgPSB7XHJcbiAgICAgICAgY3JlZGVudGlhbFR5cGU6IENyZWRlbnRpYWxUeXBlLklEX1RPS0VOLFxyXG4gICAgICAgIGhvbWVBY2NvdW50SWQ6IGhvbWVBY2NvdW50SWQsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50LFxyXG4gICAgICAgIGNsaWVudElkOiBjbGllbnRJZCxcclxuICAgICAgICBzZWNyZXQ6IGlkVG9rZW4sXHJcbiAgICAgICAgcmVhbG06IHRlbmFudElkLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpZFRva2VuRW50aXR5O1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGUgQWNjZXNzVG9rZW5FbnRpdHlcclxuICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICogQHBhcmFtIGVudmlyb25tZW50XHJcbiAqIEBwYXJhbSBhY2Nlc3NUb2tlblxyXG4gKiBAcGFyYW0gY2xpZW50SWRcclxuICogQHBhcmFtIHRlbmFudElkXHJcbiAqIEBwYXJhbSBzY29wZXNcclxuICogQHBhcmFtIGV4cGlyZXNPblxyXG4gKiBAcGFyYW0gZXh0RXhwaXJlc09uXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVBY2Nlc3NUb2tlbkVudGl0eShob21lQWNjb3VudElkLCBlbnZpcm9ubWVudCwgYWNjZXNzVG9rZW4sIGNsaWVudElkLCB0ZW5hbnRJZCwgc2NvcGVzLCBleHBpcmVzT24sIGV4dEV4cGlyZXNPbiwgYmFzZTY0RGVjb2RlLCByZWZyZXNoT24sIHRva2VuVHlwZSwgdXNlckFzc2VydGlvbkhhc2gsIGtleUlkLCByZXF1ZXN0ZWRDbGFpbXMsIHJlcXVlc3RlZENsYWltc0hhc2gpIHtcclxuICAgIGNvbnN0IGF0RW50aXR5ID0ge1xyXG4gICAgICAgIGhvbWVBY2NvdW50SWQ6IGhvbWVBY2NvdW50SWQsXHJcbiAgICAgICAgY3JlZGVudGlhbFR5cGU6IENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTixcclxuICAgICAgICBzZWNyZXQ6IGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgIGNhY2hlZEF0OiBub3dTZWNvbmRzKCkudG9TdHJpbmcoKSxcclxuICAgICAgICBleHBpcmVzT246IGV4cGlyZXNPbi50b1N0cmluZygpLFxyXG4gICAgICAgIGV4dGVuZGVkRXhwaXJlc09uOiBleHRFeHBpcmVzT24udG9TdHJpbmcoKSxcclxuICAgICAgICBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQsXHJcbiAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkLFxyXG4gICAgICAgIHJlYWxtOiB0ZW5hbnRJZCxcclxuICAgICAgICB0YXJnZXQ6IHNjb3BlcyxcclxuICAgICAgICB0b2tlblR5cGU6IHRva2VuVHlwZSB8fCBBdXRoZW50aWNhdGlvblNjaGVtZS5CRUFSRVIsXHJcbiAgICB9O1xyXG4gICAgaWYgKHVzZXJBc3NlcnRpb25IYXNoKSB7XHJcbiAgICAgICAgYXRFbnRpdHkudXNlckFzc2VydGlvbkhhc2ggPSB1c2VyQXNzZXJ0aW9uSGFzaDtcclxuICAgIH1cclxuICAgIGlmIChyZWZyZXNoT24pIHtcclxuICAgICAgICBhdEVudGl0eS5yZWZyZXNoT24gPSByZWZyZXNoT24udG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGlmIChyZXF1ZXN0ZWRDbGFpbXMpIHtcclxuICAgICAgICBhdEVudGl0eS5yZXF1ZXN0ZWRDbGFpbXMgPSByZXF1ZXN0ZWRDbGFpbXM7XHJcbiAgICAgICAgYXRFbnRpdHkucmVxdWVzdGVkQ2xhaW1zSGFzaCA9IHJlcXVlc3RlZENsYWltc0hhc2g7XHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgICogQ3JlYXRlIEFjY2VzcyBUb2tlbiBXaXRoIEF1dGggU2NoZW1lIGluc3RlYWQgb2YgcmVndWxhciBhY2Nlc3MgdG9rZW5cclxuICAgICAqIENhc3QgdG8gbG93ZXIgdG8gaGFuZGxlIFwiYmVhcmVyXCIgZnJvbSBBREZTXHJcbiAgICAgKi9cclxuICAgIGlmIChhdEVudGl0eS50b2tlblR5cGU/LnRvTG93ZXJDYXNlKCkgIT09XHJcbiAgICAgICAgQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICBhdEVudGl0eS5jcmVkZW50aWFsVHlwZSA9IENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FO1xyXG4gICAgICAgIHN3aXRjaCAoYXRFbnRpdHkudG9rZW5UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgQXV0aGVudGljYXRpb25TY2hlbWUuUE9QOlxyXG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGtleUlkIGlzIHByZXNlbnQgYW5kIGFkZCBpdCB0byBjcmVkZW50aWFsXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbkNsYWltcyA9IGV4dHJhY3RUb2tlbkNsYWltcyhhY2Nlc3NUb2tlbiwgYmFzZTY0RGVjb2RlKTtcclxuICAgICAgICAgICAgICAgIGlmICghdG9rZW5DbGFpbXM/LmNuZj8ua2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKHRva2VuQ2xhaW1zQ25mUmVxdWlyZWRGb3JTaWduZWRKd3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXRFbnRpdHkua2V5SWQgPSB0b2tlbkNsYWltcy5jbmYua2lkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQXV0aGVudGljYXRpb25TY2hlbWUuU1NIOlxyXG4gICAgICAgICAgICAgICAgYXRFbnRpdHkua2V5SWQgPSBrZXlJZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXRFbnRpdHk7XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZSBSZWZyZXNoVG9rZW5FbnRpdHlcclxuICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uUmVzdWx0XHJcbiAqIEBwYXJhbSBjbGllbnRJZFxyXG4gKiBAcGFyYW0gYXV0aG9yaXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSZWZyZXNoVG9rZW5FbnRpdHkoaG9tZUFjY291bnRJZCwgZW52aXJvbm1lbnQsIHJlZnJlc2hUb2tlbiwgY2xpZW50SWQsIGZhbWlseUlkLCB1c2VyQXNzZXJ0aW9uSGFzaCwgZXhwaXJlc09uKSB7XHJcbiAgICBjb25zdCBydEVudGl0eSA9IHtcclxuICAgICAgICBjcmVkZW50aWFsVHlwZTogQ3JlZGVudGlhbFR5cGUuUkVGUkVTSF9UT0tFTixcclxuICAgICAgICBob21lQWNjb3VudElkOiBob21lQWNjb3VudElkLFxyXG4gICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCxcclxuICAgICAgICBjbGllbnRJZDogY2xpZW50SWQsXHJcbiAgICAgICAgc2VjcmV0OiByZWZyZXNoVG9rZW4sXHJcbiAgICB9O1xyXG4gICAgaWYgKHVzZXJBc3NlcnRpb25IYXNoKSB7XHJcbiAgICAgICAgcnRFbnRpdHkudXNlckFzc2VydGlvbkhhc2ggPSB1c2VyQXNzZXJ0aW9uSGFzaDtcclxuICAgIH1cclxuICAgIGlmIChmYW1pbHlJZCkge1xyXG4gICAgICAgIHJ0RW50aXR5LmZhbWlseUlkID0gZmFtaWx5SWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoZXhwaXJlc09uKSB7XHJcbiAgICAgICAgcnRFbnRpdHkuZXhwaXJlc09uID0gZXhwaXJlc09uLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnRFbnRpdHk7XHJcbn1cclxuZnVuY3Rpb24gaXNDcmVkZW50aWFsRW50aXR5KGVudGl0eSkge1xyXG4gICAgcmV0dXJuIChlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJob21lQWNjb3VudElkXCIpICYmXHJcbiAgICAgICAgZW50aXR5Lmhhc093blByb3BlcnR5KFwiZW52aXJvbm1lbnRcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJjcmVkZW50aWFsVHlwZVwiKSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImNsaWVudElkXCIpICYmXHJcbiAgICAgICAgZW50aXR5Lmhhc093blByb3BlcnR5KFwic2VjcmV0XCIpKTtcclxufVxyXG4vKipcclxuICogVmFsaWRhdGVzIGFuIGVudGl0eTogY2hlY2tzIGZvciBhbGwgZXhwZWN0ZWQgcGFyYW1zXHJcbiAqIEBwYXJhbSBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIGlzQWNjZXNzVG9rZW5FbnRpdHkoZW50aXR5KSB7XHJcbiAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoaXNDcmVkZW50aWFsRW50aXR5KGVudGl0eSkgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJyZWFsbVwiKSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcInRhcmdldFwiKSAmJlxyXG4gICAgICAgIChlbnRpdHlbXCJjcmVkZW50aWFsVHlwZVwiXSA9PT0gQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOIHx8XHJcbiAgICAgICAgICAgIGVudGl0eVtcImNyZWRlbnRpYWxUeXBlXCJdID09PVxyXG4gICAgICAgICAgICAgICAgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUUpKTtcclxufVxyXG4vKipcclxuICogVmFsaWRhdGVzIGFuIGVudGl0eTogY2hlY2tzIGZvciBhbGwgZXhwZWN0ZWQgcGFyYW1zXHJcbiAqIEBwYXJhbSBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIGlzSWRUb2tlbkVudGl0eShlbnRpdHkpIHtcclxuICAgIGlmICghZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChpc0NyZWRlbnRpYWxFbnRpdHkoZW50aXR5KSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcInJlYWxtXCIpICYmXHJcbiAgICAgICAgZW50aXR5W1wiY3JlZGVudGlhbFR5cGVcIl0gPT09IENyZWRlbnRpYWxUeXBlLklEX1RPS0VOKTtcclxufVxyXG4vKipcclxuICogVmFsaWRhdGVzIGFuIGVudGl0eTogY2hlY2tzIGZvciBhbGwgZXhwZWN0ZWQgcGFyYW1zXHJcbiAqIEBwYXJhbSBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIGlzUmVmcmVzaFRva2VuRW50aXR5KGVudGl0eSkge1xyXG4gICAgaWYgKCFlbnRpdHkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKGlzQ3JlZGVudGlhbEVudGl0eShlbnRpdHkpICYmXHJcbiAgICAgICAgZW50aXR5W1wiY3JlZGVudGlhbFR5cGVcIl0gPT09IENyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU4pO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBBY2NvdW50IElkIGtleSBjb21wb25lbnQgYXMgcGVyIHRoZSBzY2hlbWE6IDxob21lX2FjY291bnRfaWQ+LTxlbnZpcm9ubWVudD5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQWNjb3VudElkKGNyZWRlbnRpYWxFbnRpdHkpIHtcclxuICAgIGNvbnN0IGFjY291bnRJZCA9IFtcclxuICAgICAgICBjcmVkZW50aWFsRW50aXR5LmhvbWVBY2NvdW50SWQsXHJcbiAgICAgICAgY3JlZGVudGlhbEVudGl0eS5lbnZpcm9ubWVudCxcclxuICAgIF07XHJcbiAgICByZXR1cm4gYWNjb3VudElkLmpvaW4oU2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBDcmVkZW50aWFsIElkIGtleSBjb21wb25lbnQgYXMgcGVyIHRoZSBzY2hlbWE6IDxjcmVkZW50aWFsX3R5cGU+LTxjbGllbnRfaWQ+LTxyZWFsbT5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQ3JlZGVudGlhbElkKGNyZWRlbnRpYWxFbnRpdHkpIHtcclxuICAgIGNvbnN0IGNsaWVudE9yRmFtaWx5SWQgPSBjcmVkZW50aWFsRW50aXR5LmNyZWRlbnRpYWxUeXBlID09PSBDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOXHJcbiAgICAgICAgPyBjcmVkZW50aWFsRW50aXR5LmZhbWlseUlkIHx8IGNyZWRlbnRpYWxFbnRpdHkuY2xpZW50SWRcclxuICAgICAgICA6IGNyZWRlbnRpYWxFbnRpdHkuY2xpZW50SWQ7XHJcbiAgICBjb25zdCBjcmVkZW50aWFsSWQgPSBbXHJcbiAgICAgICAgY3JlZGVudGlhbEVudGl0eS5jcmVkZW50aWFsVHlwZSxcclxuICAgICAgICBjbGllbnRPckZhbWlseUlkLFxyXG4gICAgICAgIGNyZWRlbnRpYWxFbnRpdHkucmVhbG0gfHwgXCJcIixcclxuICAgIF07XHJcbiAgICByZXR1cm4gY3JlZGVudGlhbElkLmpvaW4oU2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSB0YXJnZXQga2V5IGNvbXBvbmVudCBhcyBwZXIgc2NoZW1hOiA8dGFyZ2V0PlxyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVUYXJnZXQoY3JlZGVudGlhbEVudGl0eSkge1xyXG4gICAgcmV0dXJuIChjcmVkZW50aWFsRW50aXR5LnRhcmdldCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSByZXF1ZXN0ZWQgY2xhaW1zIGtleSBjb21wb25lbnQgYXMgcGVyIHNjaGVtYTogPHJlcXVlc3RlZENsYWltcz5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhaW1zSGFzaChjcmVkZW50aWFsRW50aXR5KSB7XHJcbiAgICByZXR1cm4gKGNyZWRlbnRpYWxFbnRpdHkucmVxdWVzdGVkQ2xhaW1zSGFzaCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBzY2hlbWUga2V5IGNvbXBvbmVuZXQgYXMgcGVyIHNjaGVtYTogPHNjaGVtZT5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1lKGNyZWRlbnRpYWxFbnRpdHkpIHtcclxuICAgIC8qXHJcbiAgICAgKiBQb1AgVG9rZW5zIGFuZCBTU0ggY2VydHMgaW5jbHVkZSBzY2hlbWUgaW4gY2FjaGUga2V5XHJcbiAgICAgKiBDYXN0IHRvIGxvd2VyY2FzZSB0byBoYW5kbGUgXCJiZWFyZXJcIiBmcm9tIEFERlNcclxuICAgICAqL1xyXG4gICAgcmV0dXJuIGNyZWRlbnRpYWxFbnRpdHkudG9rZW5UeXBlICYmXHJcbiAgICAgICAgY3JlZGVudGlhbEVudGl0eS50b2tlblR5cGUudG9Mb3dlckNhc2UoKSAhPT1cclxuICAgICAgICAgICAgQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSLnRvTG93ZXJDYXNlKClcclxuICAgICAgICA/IGNyZWRlbnRpYWxFbnRpdHkudG9rZW5UeXBlLnRvTG93ZXJDYXNlKClcclxuICAgICAgICA6IFwiXCI7XHJcbn1cclxuLyoqXHJcbiAqIHZhbGlkYXRlcyBpZiBhIGdpdmVuIGNhY2hlIGVudHJ5IGlzIFwiVGVsZW1ldHJ5XCIsIHBhcnNlcyA8a2V5LHZhbHVlPlxyXG4gKiBAcGFyYW0ga2V5XHJcbiAqIEBwYXJhbSBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIGlzU2VydmVyVGVsZW1ldHJ5RW50aXR5KGtleSwgZW50aXR5KSB7XHJcbiAgICBjb25zdCB2YWxpZGF0ZUtleSA9IGtleS5pbmRleE9mKFNFUlZFUl9URUxFTV9DT05TVEFOVFMuQ0FDSEVfS0VZKSA9PT0gMDtcclxuICAgIGxldCB2YWxpZGF0ZUVudGl0eSA9IHRydWU7XHJcbiAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgICAgdmFsaWRhdGVFbnRpdHkgPVxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJmYWlsZWRSZXF1ZXN0c1wiKSAmJlxyXG4gICAgICAgICAgICAgICAgZW50aXR5Lmhhc093blByb3BlcnR5KFwiZXJyb3JzXCIpICYmXHJcbiAgICAgICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJjYWNoZUhpdHNcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWRhdGVLZXkgJiYgdmFsaWRhdGVFbnRpdHk7XHJcbn1cclxuLyoqXHJcbiAqIHZhbGlkYXRlcyBpZiBhIGdpdmVuIGNhY2hlIGVudHJ5IGlzIFwiVGhyb3R0bGluZ1wiLCBwYXJzZXMgPGtleSx2YWx1ZT5cclxuICogQHBhcmFtIGtleVxyXG4gKiBAcGFyYW0gZW50aXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBpc1Rocm90dGxpbmdFbnRpdHkoa2V5LCBlbnRpdHkpIHtcclxuICAgIGxldCB2YWxpZGF0ZUtleSA9IGZhbHNlO1xyXG4gICAgaWYgKGtleSkge1xyXG4gICAgICAgIHZhbGlkYXRlS2V5ID0ga2V5LmluZGV4T2YoVGhyb3R0bGluZ0NvbnN0YW50cy5USFJPVFRMSU5HX1BSRUZJWCkgPT09IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsaWRhdGVFbnRpdHkgPSB0cnVlO1xyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgIHZhbGlkYXRlRW50aXR5ID0gZW50aXR5Lmhhc093blByb3BlcnR5KFwidGhyb3R0bGVUaW1lXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRlS2V5ICYmIHZhbGlkYXRlRW50aXR5O1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBBcHBNZXRhZGF0YSBDYWNoZSBLZXkgYXMgcGVyIHRoZSBzY2hlbWE6IGFwcG1ldGFkYXRhLTxlbnZpcm9ubWVudD4tPGNsaWVudF9pZD5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQXBwTWV0YWRhdGFLZXkoeyBlbnZpcm9ubWVudCwgY2xpZW50SWQsIH0pIHtcclxuICAgIGNvbnN0IGFwcE1ldGFEYXRhS2V5QXJyYXkgPSBbXHJcbiAgICAgICAgQVBQX01FVEFEQVRBLFxyXG4gICAgICAgIGVudmlyb25tZW50LFxyXG4gICAgICAgIGNsaWVudElkLFxyXG4gICAgXTtcclxuICAgIHJldHVybiBhcHBNZXRhRGF0YUtleUFycmF5XHJcbiAgICAgICAgLmpvaW4oU2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SKVxyXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbi8qXHJcbiAqIFZhbGlkYXRlcyBhbiBlbnRpdHk6IGNoZWNrcyBmb3IgYWxsIGV4cGVjdGVkIHBhcmFtc1xyXG4gKiBAcGFyYW0gZW50aXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FwcE1ldGFkYXRhRW50aXR5KGtleSwgZW50aXR5KSB7XHJcbiAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoa2V5LmluZGV4T2YoQVBQX01FVEFEQVRBKSA9PT0gMCAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImNsaWVudElkXCIpICYmXHJcbiAgICAgICAgZW50aXR5Lmhhc093blByb3BlcnR5KFwiZW52aXJvbm1lbnRcIikpO1xyXG59XHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgYW4gZW50aXR5OiBjaGVja3MgZm9yIGFsbCBleHBlY3RlZCBwYXJhbXNcclxuICogQHBhcmFtIGVudGl0eVxyXG4gKi9cclxuZnVuY3Rpb24gaXNBdXRob3JpdHlNZXRhZGF0YUVudGl0eShrZXksIGVudGl0eSkge1xyXG4gICAgaWYgKCFlbnRpdHkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKGtleS5pbmRleE9mKEFVVEhPUklUWV9NRVRBREFUQV9DT05TVEFOVFMuQ0FDSEVfS0VZKSA9PT0gMCAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImFsaWFzZXNcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJwcmVmZXJyZWRfY2FjaGVcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJwcmVmZXJyZWRfbmV0d29ya1wiKSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImNhbm9uaWNhbF9hdXRob3JpdHlcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpICYmXHJcbiAgICAgICAgZW50aXR5Lmhhc093blByb3BlcnR5KFwidG9rZW5fZW5kcG9pbnRcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJpc3N1ZXJcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJhbGlhc2VzRnJvbU5ldHdvcmtcIikgJiZcclxuICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJlbmRwb2ludHNGcm9tTmV0d29ya1wiKSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImV4cGlyZXNBdFwiKSAmJlxyXG4gICAgICAgIGVudGl0eS5oYXNPd25Qcm9wZXJ0eShcImp3a3NfdXJpXCIpKTtcclxufVxyXG4vKipcclxuICogUmVzZXQgdGhlIGV4aXJlc0F0IHZhbHVlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dGhvcml0eU1ldGFkYXRhRXhwaXJlc0F0KCkge1xyXG4gICAgcmV0dXJuIChub3dTZWNvbmRzKCkgK1xyXG4gICAgICAgIEFVVEhPUklUWV9NRVRBREFUQV9DT05TVEFOVFMuUkVGUkVTSF9USU1FX1NFQ09ORFMpO1xyXG59XHJcbmZ1bmN0aW9uIHVwZGF0ZUF1dGhvcml0eUVuZHBvaW50TWV0YWRhdGEoYXV0aG9yaXR5TWV0YWRhdGEsIHVwZGF0ZWRWYWx1ZXMsIGZyb21OZXR3b3JrKSB7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS5hdXRob3JpemF0aW9uX2VuZHBvaW50ID1cclxuICAgICAgICB1cGRhdGVkVmFsdWVzLmF1dGhvcml6YXRpb25fZW5kcG9pbnQ7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS50b2tlbl9lbmRwb2ludCA9IHVwZGF0ZWRWYWx1ZXMudG9rZW5fZW5kcG9pbnQ7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCA9IHVwZGF0ZWRWYWx1ZXMuZW5kX3Nlc3Npb25fZW5kcG9pbnQ7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS5pc3N1ZXIgPSB1cGRhdGVkVmFsdWVzLmlzc3VlcjtcclxuICAgIGF1dGhvcml0eU1ldGFkYXRhLmVuZHBvaW50c0Zyb21OZXR3b3JrID0gZnJvbU5ldHdvcms7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS5qd2tzX3VyaSA9IHVwZGF0ZWRWYWx1ZXMuandrc191cmk7XHJcbn1cclxuZnVuY3Rpb24gdXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YShhdXRob3JpdHlNZXRhZGF0YSwgdXBkYXRlZFZhbHVlcywgZnJvbU5ldHdvcmspIHtcclxuICAgIGF1dGhvcml0eU1ldGFkYXRhLmFsaWFzZXMgPSB1cGRhdGVkVmFsdWVzLmFsaWFzZXM7XHJcbiAgICBhdXRob3JpdHlNZXRhZGF0YS5wcmVmZXJyZWRfY2FjaGUgPSB1cGRhdGVkVmFsdWVzLnByZWZlcnJlZF9jYWNoZTtcclxuICAgIGF1dGhvcml0eU1ldGFkYXRhLnByZWZlcnJlZF9uZXR3b3JrID0gdXBkYXRlZFZhbHVlcy5wcmVmZXJyZWRfbmV0d29yaztcclxuICAgIGF1dGhvcml0eU1ldGFkYXRhLmFsaWFzZXNGcm9tTmV0d29yayA9IGZyb21OZXR3b3JrO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIG5lZWRzIHRvIGJlIHJlZnJlc2hlZFxyXG4gKi9cclxuZnVuY3Rpb24gaXNBdXRob3JpdHlNZXRhZGF0YUV4cGlyZWQobWV0YWRhdGEpIHtcclxuICAgIHJldHVybiBtZXRhZGF0YS5leHBpcmVzQXQgPD0gbm93U2Vjb25kcygpO1xyXG59XG5cbmV4cG9ydCB7IGNyZWF0ZUFjY2Vzc1Rva2VuRW50aXR5LCBjcmVhdGVJZFRva2VuRW50aXR5LCBjcmVhdGVSZWZyZXNoVG9rZW5FbnRpdHksIGdlbmVyYXRlQXBwTWV0YWRhdGFLZXksIGdlbmVyYXRlQXV0aG9yaXR5TWV0YWRhdGFFeHBpcmVzQXQsIGdlbmVyYXRlQ3JlZGVudGlhbEtleSwgaXNBY2Nlc3NUb2tlbkVudGl0eSwgaXNBcHBNZXRhZGF0YUVudGl0eSwgaXNBdXRob3JpdHlNZXRhZGF0YUVudGl0eSwgaXNBdXRob3JpdHlNZXRhZGF0YUV4cGlyZWQsIGlzQ3JlZGVudGlhbEVudGl0eSwgaXNJZFRva2VuRW50aXR5LCBpc1JlZnJlc2hUb2tlbkVudGl0eSwgaXNTZXJ2ZXJUZWxlbWV0cnlFbnRpdHksIGlzVGhyb3R0bGluZ0VudGl0eSwgdXBkYXRlQXV0aG9yaXR5RW5kcG9pbnRNZXRhZGF0YSwgdXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FjaGVIZWxwZXJzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yLm1qcyc7XG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJy4uL3V0aWxzL1N0cmluZ1V0aWxzLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IENvbnN0YW50cywgT0lEQ19TQ09QRVMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IGVtcHR5SW5wdXRTY29wZXNFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgeyBjYW5ub3RBcHBlbmRTY29wZVNldCwgY2Fubm90UmVtb3ZlRW1wdHlTY29wZSwgZW1wdHlJbnB1dFNjb3BlU2V0IH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgU2NvcGVTZXQgY2xhc3MgY3JlYXRlcyBhIHNldCBvZiBzY29wZXMuIFNjb3BlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgdW5pcXVlIHZhbHVlcywgc28gdGhlIFNldCBvYmplY3QgaW4gSlMgbWFrZXNcclxuICogdGhlIG1vc3Qgc2Vuc2UgdG8gaW1wbGVtZW50IGZvciB0aGlzIGNsYXNzLiBBbGwgc2NvcGVzIGFyZSB0cmltbWVkIGFuZCBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBzdHJpbmdzIGluIGludGVyc2VjdGlvbiBhbmQgdW5pb24gZnVuY3Rpb25zXHJcbiAqIHRvIGVuc3VyZSB1bmlxdWVuZXNzIG9mIHN0cmluZ3MuXHJcbiAqL1xyXG5jbGFzcyBTY29wZVNldCB7XHJcbiAgICBjb25zdHJ1Y3RvcihpbnB1dFNjb3Blcykge1xyXG4gICAgICAgIC8vIEZpbHRlciBlbXB0eSBzdHJpbmcgYW5kIG51bGwvdW5kZWZpbmVkIGFycmF5IGl0ZW1zXHJcbiAgICAgICAgY29uc3Qgc2NvcGVBcnIgPSBpbnB1dFNjb3Blc1xyXG4gICAgICAgICAgICA/IFN0cmluZ1V0aWxzLnRyaW1BcnJheUVudHJpZXMoWy4uLmlucHV0U2NvcGVzXSlcclxuICAgICAgICAgICAgOiBbXTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZElucHV0ID0gc2NvcGVBcnJcclxuICAgICAgICAgICAgPyBTdHJpbmdVdGlscy5yZW1vdmVFbXB0eVN0cmluZ3NGcm9tQXJyYXkoc2NvcGVBcnIpXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgLy8gVmFsaWRhdGUgYW5kIGZpbHRlciBzY29wZXMgKHZhbGlkYXRlIGZ1bmN0aW9uIHRocm93cyBpZiB2YWxpZGF0aW9uIGZhaWxzKVxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVJbnB1dFNjb3BlcyhmaWx0ZXJlZElucHV0KTtcclxuICAgICAgICB0aGlzLnNjb3BlcyA9IG5ldyBTZXQoKTsgLy8gSXRlcmF0b3IgaW4gY29uc3RydWN0b3Igbm90IHN1cHBvcnRlZCBieSBJRTExXHJcbiAgICAgICAgZmlsdGVyZWRJbnB1dC5mb3JFYWNoKChzY29wZSkgPT4gdGhpcy5zY29wZXMuYWRkKHNjb3BlKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBTY29wZVNldCBmcm9tIHNwYWNlLWRlbGltaXRlZCBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBpbnB1dFNjb3BlU3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gYXBwQ2xpZW50SWRcclxuICAgICAqIEBwYXJhbSBzY29wZXNSZXF1aXJlZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbVN0cmluZyhpbnB1dFNjb3BlU3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc2NvcGVTdHJpbmcgPSBpbnB1dFNjb3BlU3RyaW5nIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgY29uc3QgaW5wdXRTY29wZXMgPSBzY29wZVN0cmluZy5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZVNldChpbnB1dFNjb3Blcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIHNldCBvZiBzY29wZXMgdG8gc2VhcmNoIGZvciBpbiBjYWNoZSBsb29rdXBzXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRTY29wZVN0cmluZ1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZVNlYXJjaFNjb3BlcyhpbnB1dFNjb3BlU3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc2NvcGVTZXQgPSBuZXcgU2NvcGVTZXQoaW5wdXRTY29wZVN0cmluZyk7XHJcbiAgICAgICAgaWYgKCFzY29wZVNldC5jb250YWluc09ubHlPSURDU2NvcGVzKCkpIHtcclxuICAgICAgICAgICAgc2NvcGVTZXQucmVtb3ZlT0lEQ1Njb3BlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2NvcGVTZXQucmVtb3ZlU2NvcGUoQ29uc3RhbnRzLk9GRkxJTkVfQUNDRVNTX1NDT1BFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNjb3BlU2V0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBzY29wZXMgaW5wdXQgcGFyYW1ldGVyIHJlcXVlc3RlZCAgYnkgdGhlIGRldmVsb3Blci5cclxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gaW5wdXRTY29wZXMgLSBEZXZlbG9wZXIgcmVxdWVzdGVkIHBlcm1pc3Npb25zLiBOb3QgYWxsIHNjb3BlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYWNjZXNzIHRva2VuIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzY29wZXNSZXF1aXJlZCAtIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzY29wZXMgYXJyYXkgaXMgcmVxdWlyZWQgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlSW5wdXRTY29wZXMoaW5wdXRTY29wZXMpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiBzY29wZXMgYXJlIHJlcXVpcmVkIGJ1dCBub3QgZ2l2ZW4gb3IgaXMgYW4gZW1wdHkgYXJyYXlcclxuICAgICAgICBpZiAoIWlucHV0U2NvcGVzIHx8IGlucHV0U2NvcGVzLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGVtcHR5SW5wdXRTY29wZXNFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiBhIGdpdmVuIHNjb3BlIGlzIHByZXNlbnQgaW4gdGhpcyBzZXQgb2Ygc2NvcGVzLlxyXG4gICAgICogQHBhcmFtIHNjb3BlXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5zU2NvcGUoc2NvcGUpIHtcclxuICAgICAgICBjb25zdCBsb3dlckNhc2VTY29wZXMgPSB0aGlzLnByaW50U2NvcGVzTG93ZXJDYXNlKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGxvd2VyQ2FzZVNjb3Blc1NldCA9IG5ldyBTY29wZVNldChsb3dlckNhc2VTY29wZXMpO1xyXG4gICAgICAgIC8vIGNvbXBhcmUgbG93ZXJjYXNlIHNjb3Blc1xyXG4gICAgICAgIHJldHVybiBzY29wZVxyXG4gICAgICAgICAgICA/IGxvd2VyQ2FzZVNjb3Blc1NldC5zY29wZXMuaGFzKHNjb3BlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIGEgc2V0IG9mIHNjb3BlcyBpcyBwcmVzZW50IGluIHRoaXMgc2V0IG9mIHNjb3Blcy5cclxuICAgICAqIEBwYXJhbSBzY29wZVNldFxyXG4gICAgICovXHJcbiAgICBjb250YWluc1Njb3BlU2V0KHNjb3BlU2V0KSB7XHJcbiAgICAgICAgaWYgKCFzY29wZVNldCB8fCBzY29wZVNldC5zY29wZXMuc2l6ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3Blcy5zaXplID49IHNjb3BlU2V0LnNjb3Blcy5zaXplICYmXHJcbiAgICAgICAgICAgIHNjb3BlU2V0LmFzQXJyYXkoKS5ldmVyeSgoc2NvcGUpID0+IHRoaXMuY29udGFpbnNTY29wZShzY29wZSkpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgc2V0IG9mIHNjb3BlcyBjb250YWlucyBvbmx5IHRoZSBkZWZhdWx0c1xyXG4gICAgICovXHJcbiAgICBjb250YWluc09ubHlPSURDU2NvcGVzKCkge1xyXG4gICAgICAgIGxldCBkZWZhdWx0U2NvcGVDb3VudCA9IDA7XHJcbiAgICAgICAgT0lEQ19TQ09QRVMuZm9yRWFjaCgoZGVmYXVsdFNjb3BlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5zU2NvcGUoZGVmYXVsdFNjb3BlKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNjb3BlQ291bnQgKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNjb3Blcy5zaXplID09PSBkZWZhdWx0U2NvcGVDb3VudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQXBwZW5kcyBzaW5nbGUgc2NvcGUgaWYgcGFzc2VkXHJcbiAgICAgKiBAcGFyYW0gbmV3U2NvcGVcclxuICAgICAqL1xyXG4gICAgYXBwZW5kU2NvcGUobmV3U2NvcGUpIHtcclxuICAgICAgICBpZiAobmV3U2NvcGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zY29wZXMuYWRkKG5ld1Njb3BlLnRyaW0oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIG11bHRpcGxlIHNjb3BlcyBpZiBwYXNzZWRcclxuICAgICAqIEBwYXJhbSBuZXdTY29wZXNcclxuICAgICAqL1xyXG4gICAgYXBwZW5kU2NvcGVzKG5ld1Njb3Blcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG5ld1Njb3Blcy5mb3JFYWNoKChuZXdTY29wZSkgPT4gdGhpcy5hcHBlbmRTY29wZShuZXdTY29wZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoY2Fubm90QXBwZW5kU2NvcGVTZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBlbGVtZW50IGZyb20gc2V0IG9mIHNjb3Blcy5cclxuICAgICAqIEBwYXJhbSBzY29wZVxyXG4gICAgICovXHJcbiAgICByZW1vdmVTY29wZShzY29wZSkge1xyXG4gICAgICAgIGlmICghc2NvcGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGNhbm5vdFJlbW92ZUVtcHR5U2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjb3Blcy5kZWxldGUoc2NvcGUudHJpbSgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBkZWZhdWx0IHNjb3BlcyBmcm9tIHNldCBvZiBzY29wZXNcclxuICAgICAqIFByaW1hcmlseSB1c2VkIHRvIHByZXZlbnQgY2FjaGUgbWlzc2VzIGlmIHRoZSBkZWZhdWx0IHNjb3BlcyBhcmUgbm90IHJldHVybmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICovXHJcbiAgICByZW1vdmVPSURDU2NvcGVzKCkge1xyXG4gICAgICAgIE9JRENfU0NPUEVTLmZvckVhY2goKGRlZmF1bHRTY29wZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjb3Blcy5kZWxldGUoZGVmYXVsdFNjb3BlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tYmluZXMgYW4gYXJyYXkgb2Ygc2NvcGVzIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHNjb3Blcy5cclxuICAgICAqIEBwYXJhbSBvdGhlclNjb3Blc1xyXG4gICAgICovXHJcbiAgICB1bmlvblNjb3BlU2V0cyhvdGhlclNjb3Blcykge1xyXG4gICAgICAgIGlmICghb3RoZXJTY29wZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGVtcHR5SW5wdXRTY29wZVNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVuaW9uU2NvcGVzID0gbmV3IFNldCgpOyAvLyBJdGVyYXRvciBpbiBjb25zdHJ1Y3RvciBub3Qgc3VwcG9ydGVkIGluIElFMTFcclxuICAgICAgICBvdGhlclNjb3Blcy5zY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHVuaW9uU2NvcGVzLmFkZChzY29wZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICAgICAgdGhpcy5zY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHVuaW9uU2NvcGVzLmFkZChzY29wZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICAgICAgcmV0dXJuIHVuaW9uU2NvcGVzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiBzY29wZXMgaW50ZXJzZWN0IGJldHdlZW4gdGhpcyBzZXQgYW5kIGFub3RoZXIuXHJcbiAgICAgKiBAcGFyYW0gb3RoZXJTY29wZXNcclxuICAgICAqL1xyXG4gICAgaW50ZXJzZWN0aW5nU2NvcGVTZXRzKG90aGVyU2NvcGVzKSB7XHJcbiAgICAgICAgaWYgKCFvdGhlclNjb3Blcykge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoZW1wdHlJbnB1dFNjb3BlU2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90IGFsbG93IE9JREMgc2NvcGVzIHRvIGJlIHRoZSBvbmx5IGludGVyc2VjdGluZyBzY29wZXNcclxuICAgICAgICBpZiAoIW90aGVyU2NvcGVzLmNvbnRhaW5zT25seU9JRENTY29wZXMoKSkge1xyXG4gICAgICAgICAgICBvdGhlclNjb3Blcy5yZW1vdmVPSURDU2NvcGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVuaW9uU2NvcGVzID0gdGhpcy51bmlvblNjb3BlU2V0cyhvdGhlclNjb3Blcyk7XHJcbiAgICAgICAgY29uc3Qgc2l6ZU90aGVyU2NvcGVzID0gb3RoZXJTY29wZXMuZ2V0U2NvcGVDb3VudCgpO1xyXG4gICAgICAgIGNvbnN0IHNpemVUaGlzU2NvcGVzID0gdGhpcy5nZXRTY29wZUNvdW50KCk7XHJcbiAgICAgICAgY29uc3Qgc2l6ZVVuaW9uU2NvcGVzID0gdW5pb25TY29wZXMuc2l6ZTtcclxuICAgICAgICByZXR1cm4gc2l6ZVVuaW9uU2NvcGVzIDwgc2l6ZVRoaXNTY29wZXMgKyBzaXplT3RoZXJTY29wZXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgc2l6ZSBvZiBzZXQgb2Ygc2NvcGVzLlxyXG4gICAgICovXHJcbiAgICBnZXRTY29wZUNvdW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNjb3Blcy5zaXplO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzY29wZXMgYXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlc1xyXG4gICAgICovXHJcbiAgICBhc0FycmF5KCkge1xyXG4gICAgICAgIGNvbnN0IGFycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5zY29wZXMuZm9yRWFjaCgodmFsKSA9PiBhcnJheS5wdXNoKHZhbCkpO1xyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJpbnRzIHNjb3BlcyBpbnRvIGEgc3BhY2UtZGVsaW1pdGVkIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwcmludFNjb3BlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5zY29wZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NvcGVBcnIgPSB0aGlzLmFzQXJyYXkoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNjb3BlQXJyLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJpbnRzIHNjb3BlcyBpbnRvIGEgc3BhY2UtZGVsaW1pdGVkIGxvd2VyLWNhc2Ugc3RyaW5nICh1c2VkIGZvciBjYWNoaW5nKVxyXG4gICAgICovXHJcbiAgICBwcmludFNjb3Blc0xvd2VyQ2FzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmludFNjb3BlcygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2NvcGVTZXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjb3BlU2V0Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBTZXBhcmF0b3JzLCBDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IGNsaWVudEluZm9FbXB0eUVycm9yLCBjbGllbnRJbmZvRGVjb2RpbmdFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRnVuY3Rpb24gdG8gYnVpbGQgYSBjbGllbnQgaW5mbyBvYmplY3QgZnJvbSBzZXJ2ZXIgY2xpZW50SW5mbyBzdHJpbmdcclxuICogQHBhcmFtIHJhd0NsaWVudEluZm9cclxuICogQHBhcmFtIGNyeXB0b1xyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRDbGllbnRJbmZvKHJhd0NsaWVudEluZm8sIGJhc2U2NERlY29kZSkge1xyXG4gICAgaWYgKCFyYXdDbGllbnRJbmZvKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGNsaWVudEluZm9FbXB0eUVycm9yKTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGVjb2RlZENsaWVudEluZm8gPSBiYXNlNjREZWNvZGUocmF3Q2xpZW50SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZENsaWVudEluZm8pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoY2xpZW50SW5mb0RlY29kaW5nRXJyb3IpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBGdW5jdGlvbiB0byBidWlsZCBhIGNsaWVudCBpbmZvIG9iamVjdCBmcm9tIGNhY2hlZCBob21lQWNjb3VudElkIHN0cmluZ1xyXG4gKiBAcGFyYW0gaG9tZUFjY291bnRJZFxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQoaG9tZUFjY291bnRJZCkge1xyXG4gICAgaWYgKCFob21lQWNjb3VudElkKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGNsaWVudEluZm9EZWNvZGluZ0Vycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNsaWVudEluZm9QYXJ0cyA9IGhvbWVBY2NvdW50SWQuc3BsaXQoU2VwYXJhdG9ycy5DTElFTlRfSU5GT19TRVBBUkFUT1IsIDIpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB1aWQ6IGNsaWVudEluZm9QYXJ0c1swXSxcclxuICAgICAgICB1dGlkOiBjbGllbnRJbmZvUGFydHMubGVuZ3RoIDwgMlxyXG4gICAgICAgICAgICA/IENvbnN0YW50cy5FTVBUWV9TVFJJTkdcclxuICAgICAgICAgICAgOiBjbGllbnRJbmZvUGFydHNbMV0sXHJcbiAgICB9O1xyXG59XG5cbmV4cG9ydCB7IGJ1aWxkQ2xpZW50SW5mbywgYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsaWVudEluZm8ubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0ZW5hbnRJZCBtYXRjaGVzIHRoZSB1dGlkIHBvcnRpb24gb2YgaG9tZUFjY291bnRJZFxyXG4gKiBAcGFyYW0gdGVuYW50SWRcclxuICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICogQHJldHVybnNcclxuICovXHJcbmZ1bmN0aW9uIHRlbmFudElkTWF0Y2hlc0hvbWVUZW5hbnQodGVuYW50SWQsIGhvbWVBY2NvdW50SWQpIHtcclxuICAgIHJldHVybiAoISF0ZW5hbnRJZCAmJlxyXG4gICAgICAgICEhaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgIHRlbmFudElkID09PSBob21lQWNjb3VudElkLnNwbGl0KFwiLlwiKVsxXSk7XHJcbn1cclxuLyoqXHJcbiAqIEJ1aWxkIHRlbmFudCBwcm9maWxlXHJcbiAqIEBwYXJhbSBob21lQWNjb3VudElkIC0gSG9tZSBhY2NvdW50IGlkZW50aWZpZXIgZm9yIHRoaXMgYWNjb3VudCBvYmplY3RcclxuICogQHBhcmFtIGxvY2FsQWNjb3VudElkIC0gTG9jYWwgYWNjb3VudCBpZGVudGlmZXIgZm9yIHRoaXMgYWNjb3VudCBvYmplY3RcclxuICogQHBhcmFtIHRlbmFudElkIC0gRnVsbCB0ZW5hbnQgb3Igb3JnYW5pemF0aW9uYWwgaWQgdGhhdCB0aGlzIGFjY291bnQgYmVsb25ncyB0b1xyXG4gKiBAcGFyYW0gaWRUb2tlbkNsYWltcyAtIENsYWltcyBmcm9tIHRoZSBJRCB0b2tlblxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW5hbnRQcm9maWxlKGhvbWVBY2NvdW50SWQsIGxvY2FsQWNjb3VudElkLCB0ZW5hbnRJZCwgaWRUb2tlbkNsYWltcykge1xyXG4gICAgaWYgKGlkVG9rZW5DbGFpbXMpIHtcclxuICAgICAgICBjb25zdCB7IG9pZCwgc3ViLCB0aWQsIG5hbWUsIHRmcCwgYWNyIH0gPSBpZFRva2VuQ2xhaW1zO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBkZXRlcm1pbmUgaWYgdGhlIGF1dGhvcml0eSBpcyBBQUQgb3IgQjJDLCB3ZSBleGhhdXN0IGFsbCB0aGUgcG9zc2libGUgY2xhaW1zIHRoYXQgY2FuIHNlcnZlIGFzIHRlbmFudCBJRCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZTpcclxuICAgICAgICAgKiB0aWQgLSBUZW5hbnRJRCBjbGFpbSB0aGF0IGlkZW50aWZpZXMgdGhlIHRlbmFudCB0aGF0IGlzc3VlZCB0aGUgdG9rZW4gaW4gQUFELiBFeHBlY3RlZCBpbiBhbGwgQUFEIElEIHRva2Vucywgbm90IHByZXNlbnQgaW4gQjJDIElEIFRva2Vucy5cclxuICAgICAgICAgKiB0ZnAgLSBUcnVzdCBGcmFtZXdvcmsgUG9saWN5IGNsYWltIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9saWN5IHRoYXQgd2FzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLiBGdW5jdGlvbnMgYXMgdGVuYW50IGZvciBCMkMgc2NlbmFyaW9zLlxyXG4gICAgICAgICAqIGFjciAtIEF1dGhlbnRpY2F0aW9uIENvbnRleHQgQ2xhc3MgUmVmZXJlbmNlIGNsYWltIHVzZWQgb25seSB3aXRoIG9sZGVyIEIyQyBwb2xpY2llcy4gRmFsbGJhY2sgaW4gY2FzZSB0ZnAgaXMgbm90IHByZXNlbnQsIGJ1dCBsaWtlbHkgd29uJ3QgYmUgcHJlc2VudCBhbnl3YXkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSB0aWQgfHwgdGZwIHx8IGFjciB8fCBcIlwiO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnRJZCxcclxuICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQ6IG9pZCB8fCBzdWIgfHwgXCJcIixcclxuICAgICAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICAgICAgaXNIb21lVGVuYW50OiB0ZW5hbnRJZE1hdGNoZXNIb21lVGVuYW50KHRlbmFudElkLCBob21lQWNjb3VudElkKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGVuYW50SWQsXHJcbiAgICAgICAgICAgIGxvY2FsQWNjb3VudElkLFxyXG4gICAgICAgICAgICBpc0hvbWVUZW5hbnQ6IHRlbmFudElkTWF0Y2hlc0hvbWVUZW5hbnQodGVuYW50SWQsIGhvbWVBY2NvdW50SWQpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJlcGxhY2VzIGFjY291bnQgaW5mbyB0aGF0IHZhcmllcyBieSB0ZW5hbnQgcHJvZmlsZSBzb3VyY2VkIGZyb20gdGhlIElEIHRva2VuIGNsYWltcyBwYXNzZWQgaW4gd2l0aCB0aGUgdGVuYW50LXNwZWNpZmljIGFjY291bnQgaW5mb1xyXG4gKiBAcGFyYW0gYmFzZUFjY291bnRJbmZvXHJcbiAqIEBwYXJhbSBpZFRva2VuQ2xhaW1zXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVBY2NvdW50VGVuYW50UHJvZmlsZURhdGEoYmFzZUFjY291bnRJbmZvLCB0ZW5hbnRQcm9maWxlLCBpZFRva2VuQ2xhaW1zLCBpZFRva2VuU2VjcmV0KSB7XHJcbiAgICBsZXQgdXBkYXRlZEFjY291bnRJbmZvID0gYmFzZUFjY291bnRJbmZvO1xyXG4gICAgLy8gVGVuYW50IFByb2ZpbGUgb3ZlcnJpZGVzIHBhc3NlZCBpbiBhY2NvdW50IGluZm9cclxuICAgIGlmICh0ZW5hbnRQcm9maWxlKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgICAgIGNvbnN0IHsgaXNIb21lVGVuYW50LCAuLi50ZW5hbnRQcm9maWxlT3ZlcnJpZGUgfSA9IHRlbmFudFByb2ZpbGU7XHJcbiAgICAgICAgdXBkYXRlZEFjY291bnRJbmZvID0geyAuLi5iYXNlQWNjb3VudEluZm8sIC4uLnRlbmFudFByb2ZpbGVPdmVycmlkZSB9O1xyXG4gICAgfVxyXG4gICAgLy8gSUQgdG9rZW4gY2xhaW1zIG92ZXJyaWRlIHBhc3NlZCBpbiBhY2NvdW50IGluZm8gYW5kIHRlbmFudCBwcm9maWxlXHJcbiAgICBpZiAoaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgIC8vIElnbm9yZSBpc0hvbWVUZW5hbnQsIGxvZ2luSGludCwgYW5kIHNpZCB3aGljaCBhcmUgcGFydCBvZiB0ZW5hbnQgcHJvZmlsZSBidXQgbm90IGJhc2UgYWNjb3VudCBpbmZvXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgICAgIGNvbnN0IHsgaXNIb21lVGVuYW50LCAuLi5jbGFpbXNTb3VyY2VkVGVuYW50UHJvZmlsZSB9ID0gYnVpbGRUZW5hbnRQcm9maWxlKGJhc2VBY2NvdW50SW5mby5ob21lQWNjb3VudElkLCBiYXNlQWNjb3VudEluZm8ubG9jYWxBY2NvdW50SWQsIGJhc2VBY2NvdW50SW5mby50ZW5hbnRJZCwgaWRUb2tlbkNsYWltcyk7XHJcbiAgICAgICAgdXBkYXRlZEFjY291bnRJbmZvID0ge1xyXG4gICAgICAgICAgICAuLi51cGRhdGVkQWNjb3VudEluZm8sXHJcbiAgICAgICAgICAgIC4uLmNsYWltc1NvdXJjZWRUZW5hbnRQcm9maWxlLFxyXG4gICAgICAgICAgICBpZFRva2VuQ2xhaW1zOiBpZFRva2VuQ2xhaW1zLFxyXG4gICAgICAgICAgICBpZFRva2VuOiBpZFRva2VuU2VjcmV0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRBY2NvdW50SW5mbztcclxuICAgIH1cclxuICAgIHJldHVybiB1cGRhdGVkQWNjb3VudEluZm87XHJcbn1cblxuZXhwb3J0IHsgYnVpbGRUZW5hbnRQcm9maWxlLCB0ZW5hbnRJZE1hdGNoZXNIb21lVGVuYW50LCB1cGRhdGVBY2NvdW50VGVuYW50UHJvZmlsZURhdGEgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjY291bnRJbmZvLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdXRob3JpdHkgdHlwZXMgc3VwcG9ydGVkIGJ5IE1TQUwuXHJcbiAqL1xyXG5jb25zdCBBdXRob3JpdHlUeXBlID0ge1xyXG4gICAgRGVmYXVsdDogMCxcclxuICAgIEFkZnM6IDEsXHJcbiAgICBEc3RzOiAyLFxyXG4gICAgQ2lhbTogMyxcclxufTtcblxuZXhwb3J0IHsgQXV0aG9yaXR5VHlwZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aG9yaXR5VHlwZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogR2V0cyB0ZW5hbnRJZCBmcm9tIGF2YWlsYWJsZSBJRCB0b2tlbiBjbGFpbXMgdG8gc2V0IGFzIGNyZWRlbnRpYWwgcmVhbG0gd2l0aCB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6XHJcbiAqIDEuIHRpZCAtIGlmIHRoZSB0b2tlbiBpcyBhY3F1aXJlZCBmcm9tIGFuIEF6dXJlIEFEIHRlbmFudCB0aWQgd2lsbCBiZSBwcmVzZW50XHJcbiAqIDIuIHRmcCAtIGlmIHRoZSB0b2tlbiBpcyBhY3F1aXJlZCBmcm9tIGEgbW9kZXJuIEIyQyB0ZW5hbnQgdGZwIHNob3VsZCBiZSBwcmVzZW50XHJcbiAqIDMuIGFjciAtIGlmIHRoZSB0b2tlbiBpcyBhY3F1aXJlZCBmcm9tIGEgbGVnYWN5IEIyQyB0ZW5hbnQgYWNyIHNob3VsZCBiZSBwcmVzZW50XHJcbiAqIERvd25jYXNlZCB0byBtYXRjaCB0aGUgcmVhbG0gY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uIHJlcXVpcmVtZW50c1xyXG4gKiBAcGFyYW0gaWRUb2tlbkNsYWltc1xyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VGVuYW50SWRGcm9tSWRUb2tlbkNsYWltcyhpZFRva2VuQ2xhaW1zKSB7XHJcbiAgICBpZiAoaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudElkID0gaWRUb2tlbkNsYWltcy50aWQgfHwgaWRUb2tlbkNsYWltcy50ZnAgfHwgaWRUb2tlbkNsYWltcy5hY3I7XHJcbiAgICAgICAgcmV0dXJuIHRlbmFudElkIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxuXG5leHBvcnQgeyBnZXRUZW5hbnRJZEZyb21JZFRva2VuQ2xhaW1zIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub2tlbkNsYWltcy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IFNlcGFyYXRvcnMsIENhY2hlQWNjb3VudFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IGJ1aWxkQ2xpZW50SW5mbyB9IGZyb20gJy4uLy4uL2FjY291bnQvQ2xpZW50SW5mby5tanMnO1xuaW1wb3J0IHsgYnVpbGRUZW5hbnRQcm9maWxlIH0gZnJvbSAnLi4vLi4vYWNjb3VudC9BY2NvdW50SW5mby5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBBdXRob3JpdHlUeXBlIH0gZnJvbSAnLi4vLi4vYXV0aG9yaXR5L0F1dGhvcml0eVR5cGUubWpzJztcbmltcG9ydCB7IGdldFRlbmFudElkRnJvbUlkVG9rZW5DbGFpbXMgfSBmcm9tICcuLi8uLi9hY2NvdW50L1Rva2VuQ2xhaW1zLm1qcyc7XG5pbXBvcnQgeyBQcm90b2NvbE1vZGUgfSBmcm9tICcuLi8uLi9hdXRob3JpdHkvUHJvdG9jb2xNb2RlLm1qcyc7XG5pbXBvcnQgeyBpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVHlwZSB0aGF0IGRlZmluZXMgcmVxdWlyZWQgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGFuIEFjY291bnQgZmllbGQgKGJhc2VkIG9uIHVuaXZlcnNhbCBjYWNoZSBzY2hlbWEgaW1wbGVtZW50ZWQgYnkgYWxsIE1TQUxzKS5cclxuICpcclxuICogS2V5IDogVmFsdWUgU2NoZW1hXHJcbiAqXHJcbiAqIEtleTogPGhvbWVfYWNjb3VudF9pZD4tPGVudmlyb25tZW50Pi08cmVhbG0qPlxyXG4gKlxyXG4gKiBWYWx1ZSBTY2hlbWE6XHJcbiAqIHtcclxuICogICAgICBob21lQWNjb3VudElkOiBob21lIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhlIGF1dGggc2NoZW1lLFxyXG4gKiAgICAgIGVudmlyb25tZW50OiBlbnRpdHkgdGhhdCBpc3N1ZWQgdGhlIHRva2VuLCByZXByZXNlbnRlZCBhcyBhIGZ1bGwgaG9zdFxyXG4gKiAgICAgIHJlYWxtOiBGdWxsIHRlbmFudCBvciBvcmdhbml6YXRpb25hbCBpZGVudGlmaWVyIHRoYXQgdGhlIGFjY291bnQgYmVsb25ncyB0b1xyXG4gKiAgICAgIGxvY2FsQWNjb3VudElkOiBPcmlnaW5hbCB0ZW5hbnQtc3BlY2lmaWMgYWNjb3VudElELCB1c3VhbGx5IHVzZWQgZm9yIGxlZ2FjeSBjYXNlc1xyXG4gKiAgICAgIHVzZXJuYW1lOiBwcmltYXJ5IHVzZXJuYW1lIHRoYXQgcmVwcmVzZW50cyB0aGUgdXNlciwgdXN1YWxseSBjb3JyZXNwb25kcyB0byBwcmVmZXJyZWRfdXNlcm5hbWUgaW4gdGhlIHYyIGVuZHB0XHJcbiAqICAgICAgYXV0aG9yaXR5VHlwZTogQWNjb3VudHMgYXV0aG9yaXR5IHR5cGUgYXMgYSBzdHJpbmdcclxuICogICAgICBuYW1lOiBGdWxsIG5hbWUgZm9yIHRoZSBhY2NvdW50LCBpbmNsdWRpbmcgZ2l2ZW4gbmFtZSBhbmQgZmFtaWx5IG5hbWUsXHJcbiAqICAgICAgbGFzdE1vZGlmaWNhdGlvblRpbWU6IGxhc3QgdGltZSB0aGlzIGVudGl0eSB3YXMgbW9kaWZpZWQgaW4gdGhlIGNhY2hlXHJcbiAqICAgICAgbGFzdE1vZGlmaWNhdGlvbkFwcDpcclxuICogICAgICBuYXRpdmVBY2NvdW50SWQ6IEFjY291bnQgaWRlbnRpZmllciBvbiB0aGUgbmF0aXZlIGRldmljZVxyXG4gKiAgICAgIHRlbmFudFByb2ZpbGVzOiBBcnJheSBvZiB0ZW5hbnQgcHJvZmlsZSBvYmplY3RzIGZvciBlYWNoIHRlbmFudCB0aGF0IHRoZSBhY2NvdW50IGhhcyBhdXRoZW50aWNhdGVkIHdpdGggaW4gdGhlIGJyb3dzZXJcclxuICogfVxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNsYXNzIEFjY291bnRFbnRpdHkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBBY2NvdW50IElkIGtleSBjb21wb25lbnQgYXMgcGVyIHRoZSBzY2hlbWE6IDxob21lX2FjY291bnRfaWQ+LTxlbnZpcm9ubWVudD5cclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVBY2NvdW50SWQoKSB7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gW3RoaXMuaG9tZUFjY291bnRJZCwgdGhpcy5lbnZpcm9ubWVudF07XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnRJZC5qb2luKFNlcGFyYXRvcnMuQ0FDSEVfS0VZX1NFUEFSQVRPUikudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgQWNjb3VudCBDYWNoZSBLZXkgYXMgcGVyIHRoZSBzY2hlbWE6IDxob21lX2FjY291bnRfaWQ+LTxlbnZpcm9ubWVudD4tPHJlYWxtKj5cclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVBY2NvdW50S2V5KCkge1xyXG4gICAgICAgIHJldHVybiBBY2NvdW50RW50aXR5LmdlbmVyYXRlQWNjb3VudENhY2hlS2V5KHtcclxuICAgICAgICAgICAgaG9tZUFjY291bnRJZDogdGhpcy5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudCxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRoaXMucmVhbG0sXHJcbiAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxyXG4gICAgICAgICAgICBsb2NhbEFjY291bnRJZDogdGhpcy5sb2NhbEFjY291bnRJZCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgQWNjb3VudEluZm8gaW50ZXJmYWNlIGZvciB0aGlzIGFjY291bnQuXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGhvbWVBY2NvdW50SWQ6IHRoaXMuaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0aGlzLnJlYWxtLFxyXG4gICAgICAgICAgICB1c2VybmFtZTogdGhpcy51c2VybmFtZSxcclxuICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQ6IHRoaXMubG9jYWxBY2NvdW50SWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbmF0aXZlQWNjb3VudElkOiB0aGlzLm5hdGl2ZUFjY291bnRJZCxcclxuICAgICAgICAgICAgYXV0aG9yaXR5VHlwZTogdGhpcy5hdXRob3JpdHlUeXBlLFxyXG4gICAgICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0ZW5hbnQgcHJvZmlsZXMgYXJyYXkgaW50byBhIE1hcFxyXG4gICAgICAgICAgICB0ZW5hbnRQcm9maWxlczogbmV3IE1hcCgodGhpcy50ZW5hbnRQcm9maWxlcyB8fCBbXSkubWFwKCh0ZW5hbnRQcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RlbmFudFByb2ZpbGUudGVuYW50SWQsIHRlbmFudFByb2ZpbGVdO1xyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhY2NvdW50IGVudGl0eSBpcyBpbiBzaW5nbGUgdGVuYW50IGZvcm1hdCAob3V0ZGF0ZWQpLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqL1xyXG4gICAgaXNTaW5nbGVUZW5hbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnRlbmFudFByb2ZpbGVzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYWNjb3VudCBrZXkgZnJvbSBpbnRlcmZhY2VcclxuICAgICAqIEBwYXJhbSBhY2NvdW50SW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZW5lcmF0ZUFjY291bnRDYWNoZUtleShhY2NvdW50SW50ZXJmYWNlKSB7XHJcbiAgICAgICAgY29uc3QgaG9tZVRlbmFudElkID0gYWNjb3VudEludGVyZmFjZS5ob21lQWNjb3VudElkLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgICAgICBjb25zdCBhY2NvdW50S2V5ID0gW1xyXG4gICAgICAgICAgICBhY2NvdW50SW50ZXJmYWNlLmhvbWVBY2NvdW50SWQsXHJcbiAgICAgICAgICAgIGFjY291bnRJbnRlcmZhY2UuZW52aXJvbm1lbnQgfHwgXCJcIixcclxuICAgICAgICAgICAgaG9tZVRlbmFudElkIHx8IGFjY291bnRJbnRlcmZhY2UudGVuYW50SWQgfHwgXCJcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIHJldHVybiBhY2NvdW50S2V5LmpvaW4oU2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZCBBY2NvdW50IGNhY2hlIGZyb20gSWRUb2tlbiwgY2xpZW50SW5mbyBhbmQgYXV0aG9yaXR5L3BvbGljeS4gQXNzb2NpYXRlZCB3aXRoIEFBRC5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RGV0YWlsc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlYXRlQWNjb3VudChhY2NvdW50RGV0YWlscywgYXV0aG9yaXR5LCBiYXNlNjREZWNvZGUpIHtcclxuICAgICAgICBjb25zdCBhY2NvdW50ID0gbmV3IEFjY291bnRFbnRpdHkoKTtcclxuICAgICAgICBpZiAoYXV0aG9yaXR5LmF1dGhvcml0eVR5cGUgPT09IEF1dGhvcml0eVR5cGUuQWRmcykge1xyXG4gICAgICAgICAgICBhY2NvdW50LmF1dGhvcml0eVR5cGUgPSBDYWNoZUFjY291bnRUeXBlLkFERlNfQUNDT1VOVF9UWVBFO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhdXRob3JpdHkucHJvdG9jb2xNb2RlID09PSBQcm90b2NvbE1vZGUuQUFEKSB7XHJcbiAgICAgICAgICAgIGFjY291bnQuYXV0aG9yaXR5VHlwZSA9IENhY2hlQWNjb3VudFR5cGUuTVNTVFNfQUNDT1VOVF9UWVBFO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYWNjb3VudC5hdXRob3JpdHlUeXBlID0gQ2FjaGVBY2NvdW50VHlwZS5HRU5FUklDX0FDQ09VTlRfVFlQRTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNsaWVudEluZm87XHJcbiAgICAgICAgaWYgKGFjY291bnREZXRhaWxzLmNsaWVudEluZm8gJiYgYmFzZTY0RGVjb2RlKSB7XHJcbiAgICAgICAgICAgIGNsaWVudEluZm8gPSBidWlsZENsaWVudEluZm8oYWNjb3VudERldGFpbHMuY2xpZW50SW5mbywgYmFzZTY0RGVjb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWNjb3VudC5jbGllbnRJbmZvID0gYWNjb3VudERldGFpbHMuY2xpZW50SW5mbztcclxuICAgICAgICBhY2NvdW50LmhvbWVBY2NvdW50SWQgPSBhY2NvdW50RGV0YWlscy5ob21lQWNjb3VudElkO1xyXG4gICAgICAgIGFjY291bnQubmF0aXZlQWNjb3VudElkID0gYWNjb3VudERldGFpbHMubmF0aXZlQWNjb3VudElkO1xyXG4gICAgICAgIGNvbnN0IGVudiA9IGFjY291bnREZXRhaWxzLmVudmlyb25tZW50IHx8XHJcbiAgICAgICAgICAgIChhdXRob3JpdHkgJiYgYXV0aG9yaXR5LmdldFByZWZlcnJlZENhY2hlKCkpO1xyXG4gICAgICAgIGlmICghZW52KSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFjY291bnQuZW52aXJvbm1lbnQgPSBlbnY7XHJcbiAgICAgICAgLy8gbm9uIEFBRCBzY2VuYXJpb3MgY2FuIGhhdmUgZW1wdHkgcmVhbG1cclxuICAgICAgICBhY2NvdW50LnJlYWxtID1cclxuICAgICAgICAgICAgY2xpZW50SW5mbz8udXRpZCB8fFxyXG4gICAgICAgICAgICAgICAgZ2V0VGVuYW50SWRGcm9tSWRUb2tlbkNsYWltcyhhY2NvdW50RGV0YWlscy5pZFRva2VuQ2xhaW1zKSB8fFxyXG4gICAgICAgICAgICAgICAgXCJcIjtcclxuICAgICAgICAvLyBIb3cgZG8geW91IGFjY291bnQgZm9yIE1TQSBDSUQgaGVyZT9cclxuICAgICAgICBhY2NvdW50LmxvY2FsQWNjb3VudElkID1cclxuICAgICAgICAgICAgY2xpZW50SW5mbz8udWlkIHx8XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50RGV0YWlscy5pZFRva2VuQ2xhaW1zPy5vaWQgfHxcclxuICAgICAgICAgICAgICAgIGFjY291bnREZXRhaWxzLmlkVG9rZW5DbGFpbXM/LnN1YiB8fFxyXG4gICAgICAgICAgICAgICAgXCJcIjtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEluIEIyQyBzY2VuYXJpb3MgdGhlIGVtYWlscyBjbGFpbSBpcyB1c2VkIGluc3RlYWQgb2YgcHJlZmVycmVkX3VzZXJuYW1lIGFuZCBpdCBpcyBhbiBhcnJheS5cclxuICAgICAgICAgKiBJbiBtb3N0IGNhc2VzIGl0IHdpbGwgY29udGFpbiBhIHNpbmdsZSBlbWFpbC4gVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGlmIGEgY3VzdG9tXHJcbiAgICAgICAgICogcG9saWN5IGlzIGNvbmZpZ3VyZWQgdG8gcmV0dXJuIG1vcmUgdGhhbiAxIGVtYWlsLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHByZWZlcnJlZFVzZXJuYW1lID0gYWNjb3VudERldGFpbHMuaWRUb2tlbkNsYWltcz8ucHJlZmVycmVkX3VzZXJuYW1lIHx8XHJcbiAgICAgICAgICAgIGFjY291bnREZXRhaWxzLmlkVG9rZW5DbGFpbXM/LnVwbjtcclxuICAgICAgICBjb25zdCBlbWFpbCA9IGFjY291bnREZXRhaWxzLmlkVG9rZW5DbGFpbXM/LmVtYWlsc1xyXG4gICAgICAgICAgICA/IGFjY291bnREZXRhaWxzLmlkVG9rZW5DbGFpbXMuZW1haWxzWzBdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICBhY2NvdW50LnVzZXJuYW1lID0gcHJlZmVycmVkVXNlcm5hbWUgfHwgZW1haWwgfHwgXCJcIjtcclxuICAgICAgICBhY2NvdW50Lm5hbWUgPSBhY2NvdW50RGV0YWlscy5pZFRva2VuQ2xhaW1zPy5uYW1lIHx8IFwiXCI7XHJcbiAgICAgICAgYWNjb3VudC5jbG91ZEdyYXBoSG9zdE5hbWUgPSBhY2NvdW50RGV0YWlscy5jbG91ZEdyYXBoSG9zdE5hbWU7XHJcbiAgICAgICAgYWNjb3VudC5tc0dyYXBoSG9zdCA9IGFjY291bnREZXRhaWxzLm1zR3JhcGhIb3N0O1xyXG4gICAgICAgIGlmIChhY2NvdW50RGV0YWlscy50ZW5hbnRQcm9maWxlcykge1xyXG4gICAgICAgICAgICBhY2NvdW50LnRlbmFudFByb2ZpbGVzID0gYWNjb3VudERldGFpbHMudGVuYW50UHJvZmlsZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW5hbnRQcm9maWxlID0gYnVpbGRUZW5hbnRQcm9maWxlKGFjY291bnREZXRhaWxzLmhvbWVBY2NvdW50SWQsIGFjY291bnQubG9jYWxBY2NvdW50SWQsIGFjY291bnQucmVhbG0sIGFjY291bnREZXRhaWxzLmlkVG9rZW5DbGFpbXMpO1xyXG4gICAgICAgICAgICBhY2NvdW50LnRlbmFudFByb2ZpbGVzID0gW3RlbmFudFByb2ZpbGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWNjb3VudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBBY2NvdW50RW50aXR5IG9iamVjdCBmcm9tIEFjY291bnRJbmZvXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEluZm9cclxuICAgICAqIEBwYXJhbSBjbG91ZEdyYXBoSG9zdE5hbWVcclxuICAgICAqIEBwYXJhbSBtc0dyYXBoSG9zdFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUZyb21BY2NvdW50SW5mbyhhY2NvdW50SW5mbywgY2xvdWRHcmFwaEhvc3ROYW1lLCBtc0dyYXBoSG9zdCkge1xyXG4gICAgICAgIGNvbnN0IGFjY291bnQgPSBuZXcgQWNjb3VudEVudGl0eSgpO1xyXG4gICAgICAgIGFjY291bnQuYXV0aG9yaXR5VHlwZSA9XHJcbiAgICAgICAgICAgIGFjY291bnRJbmZvLmF1dGhvcml0eVR5cGUgfHwgQ2FjaGVBY2NvdW50VHlwZS5HRU5FUklDX0FDQ09VTlRfVFlQRTtcclxuICAgICAgICBhY2NvdW50LmhvbWVBY2NvdW50SWQgPSBhY2NvdW50SW5mby5ob21lQWNjb3VudElkO1xyXG4gICAgICAgIGFjY291bnQubG9jYWxBY2NvdW50SWQgPSBhY2NvdW50SW5mby5sb2NhbEFjY291bnRJZDtcclxuICAgICAgICBhY2NvdW50Lm5hdGl2ZUFjY291bnRJZCA9IGFjY291bnRJbmZvLm5hdGl2ZUFjY291bnRJZDtcclxuICAgICAgICBhY2NvdW50LnJlYWxtID0gYWNjb3VudEluZm8udGVuYW50SWQ7XHJcbiAgICAgICAgYWNjb3VudC5lbnZpcm9ubWVudCA9IGFjY291bnRJbmZvLmVudmlyb25tZW50O1xyXG4gICAgICAgIGFjY291bnQudXNlcm5hbWUgPSBhY2NvdW50SW5mby51c2VybmFtZTtcclxuICAgICAgICBhY2NvdW50Lm5hbWUgPSBhY2NvdW50SW5mby5uYW1lO1xyXG4gICAgICAgIGFjY291bnQuY2xvdWRHcmFwaEhvc3ROYW1lID0gY2xvdWRHcmFwaEhvc3ROYW1lO1xyXG4gICAgICAgIGFjY291bnQubXNHcmFwaEhvc3QgPSBtc0dyYXBoSG9zdDtcclxuICAgICAgICAvLyBTZXJpYWxpemUgdGVuYW50IHByb2ZpbGVzIG1hcCBpbnRvIGFuIGFycmF5XHJcbiAgICAgICAgYWNjb3VudC50ZW5hbnRQcm9maWxlcyA9IEFycmF5LmZyb20oYWNjb3VudEluZm8udGVuYW50UHJvZmlsZXM/LnZhbHVlcygpIHx8IFtdKTtcclxuICAgICAgICByZXR1cm4gYWNjb3VudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgSG9tZUFjY291bnRJZCBmcm9tIHNlcnZlciByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIHNlcnZlckNsaWVudEluZm9cclxuICAgICAqIEBwYXJhbSBhdXRoVHlwZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2VuZXJhdGVIb21lQWNjb3VudElkKHNlcnZlckNsaWVudEluZm8sIGF1dGhUeXBlLCBsb2dnZXIsIGNyeXB0b09iaiwgaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgIC8vIHNpbmNlIEFERlMvRFNUUyBkbyBub3QgaGF2ZSB0aWQgYW5kIGRvZXMgbm90IHNldCBjbGllbnRfaW5mb1xyXG4gICAgICAgIGlmICghKGF1dGhUeXBlID09PSBBdXRob3JpdHlUeXBlLkFkZnMgfHxcclxuICAgICAgICAgICAgYXV0aFR5cGUgPT09IEF1dGhvcml0eVR5cGUuRHN0cykpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZXJlIGlzIGNsaWVudEluZm9cclxuICAgICAgICAgICAgaWYgKHNlcnZlckNsaWVudEluZm8pIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50SW5mbyA9IGJ1aWxkQ2xpZW50SW5mbyhzZXJ2ZXJDbGllbnRJbmZvLCBjcnlwdG9PYmouYmFzZTY0RGVjb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50SW5mby51aWQgJiYgY2xpZW50SW5mby51dGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtjbGllbnRJbmZvLnVpZH0uJHtjbGllbnRJbmZvLnV0aWR9YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoXCJObyBjbGllbnQgaW5mbyBpbiByZXNwb25zZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZGVmYXVsdCB0byBcInN1YlwiIGNsYWltXHJcbiAgICAgICAgcmV0dXJuIGlkVG9rZW5DbGFpbXM/LnN1YiB8fCBcIlwiO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZXMgYW4gZW50aXR5OiBjaGVja3MgZm9yIGFsbCBleHBlY3RlZCBwYXJhbXNcclxuICAgICAqIEBwYXJhbSBlbnRpdHlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlzQWNjb3VudEVudGl0eShlbnRpdHkpIHtcclxuICAgICAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoZW50aXR5Lmhhc093blByb3BlcnR5KFwiaG9tZUFjY291bnRJZFwiKSAmJlxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJlbnZpcm9ubWVudFwiKSAmJlxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJyZWFsbVwiKSAmJlxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJsb2NhbEFjY291bnRJZFwiKSAmJlxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJ1c2VybmFtZVwiKSAmJlxyXG4gICAgICAgICAgICBlbnRpdHkuaGFzT3duUHJvcGVydHkoXCJhdXRob3JpdHlUeXBlXCIpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIDIgYWNjb3VudEluZm8gb2JqZWN0cyByZXByZXNlbnQgdGhlIHNhbWUgYWNjb3VudFxyXG4gICAgICogQHBhcmFtIGFjY291bnRBXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEJcclxuICAgICAqIEBwYXJhbSBjb21wYXJlQ2xhaW1zIC0gSWYgc2V0IHRvIHRydWUgaWRUb2tlbkNsYWltcyB3aWxsIGFsc28gYmUgY29tcGFyZWQgdG8gZGV0ZXJtaW5lIGFjY291bnQgZXF1YWxpdHlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFjY291bnRJbmZvSXNFcXVhbChhY2NvdW50QSwgYWNjb3VudEIsIGNvbXBhcmVDbGFpbXMpIHtcclxuICAgICAgICBpZiAoIWFjY291bnRBIHx8ICFhY2NvdW50Qikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjbGFpbXNNYXRjaCA9IHRydWU7IC8vIGRlZmF1bHQgdG8gdHJ1ZSBzbyBhcyB0byBub3QgZmFpbCBjb21wYXJpc29uIGJlbG93IGlmIGNvbXBhcmVDbGFpbXM6IGZhbHNlXHJcbiAgICAgICAgaWYgKGNvbXBhcmVDbGFpbXMpIHtcclxuICAgICAgICAgICAgY29uc3QgYWNjb3VudEFDbGFpbXMgPSAoYWNjb3VudEEuaWRUb2tlbkNsYWltcyB8fFxyXG4gICAgICAgICAgICAgICAge30pO1xyXG4gICAgICAgICAgICBjb25zdCBhY2NvdW50QkNsYWltcyA9IChhY2NvdW50Qi5pZFRva2VuQ2xhaW1zIHx8XHJcbiAgICAgICAgICAgICAgICB7fSk7XHJcbiAgICAgICAgICAgIC8vIGlzc3VlZCBhdCB0aW1lc3RhbXAgYW5kIG5vbmNlIGFyZSBleHBlY3RlZCB0byBjaGFuZ2UgZWFjaCB0aW1lIGEgbmV3IGlkIHRva2VuIGlzIGFjcXVpcmVkXHJcbiAgICAgICAgICAgIGNsYWltc01hdGNoID1cclxuICAgICAgICAgICAgICAgIGFjY291bnRBQ2xhaW1zLmlhdCA9PT0gYWNjb3VudEJDbGFpbXMuaWF0ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudEFDbGFpbXMubm9uY2UgPT09IGFjY291bnRCQ2xhaW1zLm5vbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGFjY291bnRBLmhvbWVBY2NvdW50SWQgPT09IGFjY291bnRCLmhvbWVBY2NvdW50SWQgJiZcclxuICAgICAgICAgICAgYWNjb3VudEEubG9jYWxBY2NvdW50SWQgPT09IGFjY291bnRCLmxvY2FsQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgIGFjY291bnRBLnVzZXJuYW1lID09PSBhY2NvdW50Qi51c2VybmFtZSAmJlxyXG4gICAgICAgICAgICBhY2NvdW50QS50ZW5hbnRJZCA9PT0gYWNjb3VudEIudGVuYW50SWQgJiZcclxuICAgICAgICAgICAgYWNjb3VudEEuZW52aXJvbm1lbnQgPT09IGFjY291bnRCLmVudmlyb25tZW50ICYmXHJcbiAgICAgICAgICAgIGFjY291bnRBLm5hdGl2ZUFjY291bnRJZCA9PT0gYWNjb3VudEIubmF0aXZlQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgIGNsYWltc01hdGNoKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBBY2NvdW50RW50aXR5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BY2NvdW50RW50aXR5Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgVXJsU3RyaW5nIH0gZnJvbSAnLi4vdXJsL1VybFN0cmluZy5tanMnO1xuaW1wb3J0IHsgQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IHJhd01ldGRhdGFKU09OID0ge1xyXG4gICAgZW5kcG9pbnRNZXRhZGF0YToge1xyXG4gICAgICAgIFwibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbVwiOiB7XHJcbiAgICAgICAgICAgIHRva2VuX2VuZHBvaW50OiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L29hdXRoMi92Mi4wL3Rva2VuXCIsXHJcbiAgICAgICAgICAgIGp3a3NfdXJpOiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L2Rpc2NvdmVyeS92Mi4wL2tleXNcIixcclxuICAgICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L3YyLjBcIixcclxuICAgICAgICAgICAgYXV0aG9yaXphdGlvbl9lbmRwb2ludDogXCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20ve3RlbmFudGlkfS9vYXV0aDIvdjIuMC9hdXRob3JpemVcIixcclxuICAgICAgICAgICAgZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IFwiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvbG9nb3V0XCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxvZ2luLmNoaW5hY2xvdWRhcGkuY25cIjoge1xyXG4gICAgICAgICAgICB0b2tlbl9lbmRwb2ludDogXCJodHRwczovL2xvZ2luLmNoaW5hY2xvdWRhcGkuY24ve3RlbmFudGlkfS9vYXV0aDIvdjIuMC90b2tlblwiLFxyXG4gICAgICAgICAgICBqd2tzX3VyaTogXCJodHRwczovL2xvZ2luLmNoaW5hY2xvdWRhcGkuY24ve3RlbmFudGlkfS9kaXNjb3ZlcnkvdjIuMC9rZXlzXCIsXHJcbiAgICAgICAgICAgIGlzc3VlcjogXCJodHRwczovL2xvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuL3t0ZW5hbnRpZH0vdjIuMFwiLFxyXG4gICAgICAgICAgICBhdXRob3JpemF0aW9uX2VuZHBvaW50OiBcImh0dHBzOi8vbG9naW4uY2hpbmFjbG91ZGFwaS5jbi97dGVuYW50aWR9L29hdXRoMi92Mi4wL2F1dGhvcml6ZVwiLFxyXG4gICAgICAgICAgICBlbmRfc2Vzc2lvbl9lbmRwb2ludDogXCJodHRwczovL2xvZ2luLmNoaW5hY2xvdWRhcGkuY24ve3RlbmFudGlkfS9vYXV0aDIvdjIuMC9sb2dvdXRcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwibG9naW4ubWljcm9zb2Z0b25saW5lLnVzXCI6IHtcclxuICAgICAgICAgICAgdG9rZW5fZW5kcG9pbnQ6IFwiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMve3RlbmFudGlkfS9vYXV0aDIvdjIuMC90b2tlblwiLFxyXG4gICAgICAgICAgICBqd2tzX3VyaTogXCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS51cy97dGVuYW50aWR9L2Rpc2NvdmVyeS92Mi4wL2tleXNcIixcclxuICAgICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzL3t0ZW5hbnRpZH0vdjIuMFwiLFxyXG4gICAgICAgICAgICBhdXRob3JpemF0aW9uX2VuZHBvaW50OiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvYXV0aG9yaXplXCIsXHJcbiAgICAgICAgICAgIGVuZF9zZXNzaW9uX2VuZHBvaW50OiBcImh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvbG9nb3V0XCIsXHJcbiAgICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBpbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhOiB7XHJcbiAgICAgICAgdGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludDogXCJodHRwczovL3tjYW5vbmljYWxBdXRob3JpdHl9L3YyLjAvLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25cIixcclxuICAgICAgICBtZXRhZGF0YTogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfbmV0d29yazogXCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tXCIsXHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfY2FjaGU6IFwibG9naW4ud2luZG93cy5uZXRcIixcclxuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICBcImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb21cIixcclxuICAgICAgICAgICAgICAgICAgICBcImxvZ2luLndpbmRvd3MubmV0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb2dpbi5taWNyb3NvZnQuY29tXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJzdHMud2luZG93cy5uZXRcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHByZWZlcnJlZF9uZXR3b3JrOiBcImxvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuXCIsXHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfY2FjaGU6IFwibG9naW4ucGFydG5lci5taWNyb3NvZnRvbmxpbmUuY25cIixcclxuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICBcImxvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb2dpbi5jaGluYWNsb3VkYXBpLmNuXCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfbmV0d29yazogXCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGVcIixcclxuICAgICAgICAgICAgICAgIHByZWZlcnJlZF9jYWNoZTogXCJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGVcIixcclxuICAgICAgICAgICAgICAgIGFsaWFzZXM6IFtcImxvZ2luLm1pY3Jvc29mdG9ubGluZS5kZVwiXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcHJlZmVycmVkX25ldHdvcms6IFwibG9naW4ubWljcm9zb2Z0b25saW5lLnVzXCIsXHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfY2FjaGU6IFwibG9naW4ubWljcm9zb2Z0b25saW5lLnVzXCIsXHJcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb2dpbi5taWNyb3NvZnRvbmxpbmUudXNcIixcclxuICAgICAgICAgICAgICAgICAgICBcImxvZ2luLnVzZ292Y2xvdWRhcGkubmV0XCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfbmV0d29yazogXCJsb2dpbi11cy5taWNyb3NvZnRvbmxpbmUuY29tXCIsXHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfY2FjaGU6IFwibG9naW4tdXMubWljcm9zb2Z0b25saW5lLmNvbVwiLFxyXG4gICAgICAgICAgICAgICAgYWxpYXNlczogW1wibG9naW4tdXMubWljcm9zb2Z0b25saW5lLmNvbVwiXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgfSxcclxufTtcclxuY29uc3QgRW5kcG9pbnRNZXRhZGF0YSA9IHJhd01ldGRhdGFKU09OLmVuZHBvaW50TWV0YWRhdGE7XHJcbmNvbnN0IEluc3RhbmNlRGlzY292ZXJ5TWV0YWRhdGEgPSByYXdNZXRkYXRhSlNPTi5pbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhO1xyXG5jb25zdCBJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhQWxpYXNlcyA9IG5ldyBTZXQoKTtcclxuSW5zdGFuY2VEaXNjb3ZlcnlNZXRhZGF0YS5tZXRhZGF0YS5mb3JFYWNoKChtZXRhZGF0YUVudHJ5KSA9PiB7XHJcbiAgICBtZXRhZGF0YUVudHJ5LmFsaWFzZXMuZm9yRWFjaCgoYWxpYXMpID0+IHtcclxuICAgICAgICBJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhQWxpYXNlcy5hZGQoYWxpYXMpO1xyXG4gICAgfSk7XHJcbn0pO1xyXG4vKipcclxuICogQXR0ZW1wdHMgdG8gZ2V0IGFuIGFsaWFzZXMgYXJyYXkgZnJvbSB0aGUgc3RhdGljIGF1dGhvcml0eSBtZXRhZGF0YSBzb3VyY2VzIGJhc2VkIG9uIHRoZSBjYW5vbmljYWwgYXV0aG9yaXR5IGhvc3RcclxuICogQHBhcmFtIHN0YXRpY0F1dGhvcml0eU9wdGlvbnNcclxuICogQHBhcmFtIGxvZ2dlclxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWxpYXNlc0Zyb21TdGF0aWNTb3VyY2VzKHN0YXRpY0F1dGhvcml0eU9wdGlvbnMsIGxvZ2dlcikge1xyXG4gICAgbGV0IHN0YXRpY0FsaWFzZXM7XHJcbiAgICBjb25zdCBjYW5vbmljYWxBdXRob3JpdHkgPSBzdGF0aWNBdXRob3JpdHlPcHRpb25zLmNhbm9uaWNhbEF1dGhvcml0eTtcclxuICAgIGlmIChjYW5vbmljYWxBdXRob3JpdHkpIHtcclxuICAgICAgICBjb25zdCBhdXRob3JpdHlIb3N0ID0gbmV3IFVybFN0cmluZyhjYW5vbmljYWxBdXRob3JpdHkpLmdldFVybENvbXBvbmVudHMoKS5Ib3N0TmFtZUFuZFBvcnQ7XHJcbiAgICAgICAgc3RhdGljQWxpYXNlcyA9XHJcbiAgICAgICAgICAgIGdldEFsaWFzZXNGcm9tTWV0YWRhdGEoYXV0aG9yaXR5SG9zdCwgc3RhdGljQXV0aG9yaXR5T3B0aW9ucy5jbG91ZERpc2NvdmVyeU1ldGFkYXRhPy5tZXRhZGF0YSwgQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuQ09ORklHLCBsb2dnZXIpIHx8XHJcbiAgICAgICAgICAgICAgICBnZXRBbGlhc2VzRnJvbU1ldGFkYXRhKGF1dGhvcml0eUhvc3QsIEluc3RhbmNlRGlzY292ZXJ5TWV0YWRhdGEubWV0YWRhdGEsIEF1dGhvcml0eU1ldGFkYXRhU291cmNlLkhBUkRDT0RFRF9WQUxVRVMsIGxvZ2dlcikgfHxcclxuICAgICAgICAgICAgICAgIHN0YXRpY0F1dGhvcml0eU9wdGlvbnMua25vd25BdXRob3JpdGllcztcclxuICAgIH1cclxuICAgIHJldHVybiBzdGF0aWNBbGlhc2VzIHx8IFtdO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFsaWFzZXMgZm9yIGZyb20gdGhlIHJhdyBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgcGFzc2VkIGluXHJcbiAqIEBwYXJhbSBhdXRob3JpdHlIb3N0XHJcbiAqIEBwYXJhbSByYXdDbG91ZERpc2NvdmVyeU1ldGFkYXRhXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBbGlhc2VzRnJvbU1ldGFkYXRhKGF1dGhvcml0eUhvc3QsIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGEsIHNvdXJjZSwgbG9nZ2VyKSB7XHJcbiAgICBsb2dnZXI/LnRyYWNlKGBnZXRBbGlhc2VzRnJvbU1ldGFkYXRhIGNhbGxlZCB3aXRoIHNvdXJjZTogJHtzb3VyY2V9YCk7XHJcbiAgICBpZiAoYXV0aG9yaXR5SG9zdCAmJiBjbG91ZERpc2NvdmVyeU1ldGFkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtSZXNwb25zZShjbG91ZERpc2NvdmVyeU1ldGFkYXRhLCBhdXRob3JpdHlIb3N0KTtcclxuICAgICAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgbG9nZ2VyPy50cmFjZShgZ2V0QWxpYXNlc0Zyb21NZXRhZGF0YTogZm91bmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluICR7c291cmNlfSwgcmV0dXJuaW5nIGFsaWFzZXNgKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmFsaWFzZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2dnZXI/LnRyYWNlKGBnZXRBbGlhc2VzRnJvbU1ldGFkYXRhOiBkaWQgbm90IGZpbmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluICR7c291cmNlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbi8qKlxyXG4gKiBHZXQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZvciBjb21tb24gYXV0aG9yaXRpZXNcclxuICovXHJcbmZ1bmN0aW9uIGdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSGFyZGNvZGVkVmFsdWVzKGF1dGhvcml0eUhvc3QpIHtcclxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrUmVzcG9uc2UoSW5zdGFuY2VEaXNjb3ZlcnlNZXRhZGF0YS5tZXRhZGF0YSwgYXV0aG9yaXR5SG9zdCk7XHJcbiAgICByZXR1cm4gbWV0YWRhdGE7XHJcbn1cclxuLyoqXHJcbiAqIFNlYXJjaGVzIGluc3RhbmNlIGRpc2NvdmVyeSBuZXR3b3JrIHJlc3BvbnNlIGZvciB0aGUgZW50cnkgdGhhdCBjb250YWlucyB0aGUgaG9zdCBpbiB0aGUgYWxpYXNlcyBsaXN0XHJcbiAqIEBwYXJhbSByZXNwb25zZVxyXG4gKiBAcGFyYW0gYXV0aG9yaXR5XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtSZXNwb25zZShyZXNwb25zZSwgYXV0aG9yaXR5SG9zdCkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzcG9uc2VbaV07XHJcbiAgICAgICAgaWYgKG1ldGFkYXRhLmFsaWFzZXMuaW5jbHVkZXMoYXV0aG9yaXR5SG9zdCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XG5cbmV4cG9ydCB7IEVuZHBvaW50TWV0YWRhdGEsIEluc3RhbmNlRGlzY292ZXJ5TWV0YWRhdGEsIEluc3RhbmNlRGlzY292ZXJ5TWV0YWRhdGFBbGlhc2VzLCBnZXRBbGlhc2VzRnJvbU1ldGFkYXRhLCBnZXRBbGlhc2VzRnJvbVN0YXRpY1NvdXJjZXMsIGdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSGFyZGNvZGVkVmFsdWVzLCBnZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmtSZXNwb25zZSwgcmF3TWV0ZGF0YUpTT04gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF1dGhvcml0eU1ldGFkYXRhLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGNhY2hlUXVvdGFFeGNlZWRlZEVycm9yQ29kZSA9IFwiY2FjaGVfcXVvdGFfZXhjZWVkZWRcIjtcclxuY29uc3QgY2FjaGVVbmtub3duRXJyb3JDb2RlID0gXCJjYWNoZV9lcnJvcl91bmtub3duXCI7XG5cbmV4cG9ydCB7IGNhY2hlUXVvdGFFeGNlZWRlZEVycm9yQ29kZSwgY2FjaGVVbmtub3duRXJyb3JDb2RlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZUVycm9yQ29kZXMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjYWNoZVVua25vd25FcnJvckNvZGUsIGNhY2hlUXVvdGFFeGNlZWRlZEVycm9yQ29kZSB9IGZyb20gJy4vQ2FjaGVFcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgKiBhcyBDYWNoZUVycm9yQ29kZXMgZnJvbSAnLi9DYWNoZUVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IENhY2hlRXJyb3JDb2RlcyB9O1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQ2FjaGVFcnJvck1lc3NhZ2VzID0ge1xyXG4gICAgW2NhY2hlUXVvdGFFeGNlZWRlZEVycm9yQ29kZV06IFwiRXhjZWVkZWQgY2FjaGUgc3RvcmFnZSBjYXBhY2l0eS5cIixcclxuICAgIFtjYWNoZVVua25vd25FcnJvckNvZGVdOiBcIlVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hlbiB1c2luZyBjYWNoZSBzdG9yYWdlLlwiLFxyXG59O1xyXG4vKipcclxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgY2FjaGVcclxuICovXHJcbmNsYXNzIENhY2hlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHxcclxuICAgICAgICAgICAgKENhY2hlRXJyb3JNZXNzYWdlc1tlcnJvckNvZGVdXHJcbiAgICAgICAgICAgICAgICA/IENhY2hlRXJyb3JNZXNzYWdlc1tlcnJvckNvZGVdXHJcbiAgICAgICAgICAgICAgICA6IENhY2hlRXJyb3JNZXNzYWdlc1tjYWNoZVVua25vd25FcnJvckNvZGVdKTtcclxuICAgICAgICBzdXBlcihgJHtlcnJvckNvZGV9OiAke21lc3NhZ2V9YCk7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENhY2hlRXJyb3IucHJvdG90eXBlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkNhY2hlRXJyb3JcIjtcclxuICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQ2FjaGVFcnJvciwgQ2FjaGVFcnJvck1lc3NhZ2VzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZUVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgU2VwYXJhdG9ycywgQ3JlZGVudGlhbFR5cGUsIEF1dGhlbnRpY2F0aW9uU2NoZW1lLCBUSEVfRkFNSUxZX0lELCBBUFBfTUVUQURBVEEsIEFVVEhPUklUWV9NRVRBREFUQV9DT05TVEFOVFMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IGdlbmVyYXRlQ3JlZGVudGlhbEtleSB9IGZyb20gJy4vdXRpbHMvQ2FjaGVIZWxwZXJzLm1qcyc7XG5pbXBvcnQgeyBTY29wZVNldCB9IGZyb20gJy4uL3JlcXVlc3QvU2NvcGVTZXQubWpzJztcbmltcG9ydCB7IEFjY291bnRFbnRpdHkgfSBmcm9tICcuL2VudGl0aWVzL0FjY291bnRFbnRpdHkubWpzJztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgdXBkYXRlQWNjb3VudFRlbmFudFByb2ZpbGVEYXRhLCB0ZW5hbnRJZE1hdGNoZXNIb21lVGVuYW50IH0gZnJvbSAnLi4vYWNjb3VudC9BY2NvdW50SW5mby5tanMnO1xuaW1wb3J0IHsgZXh0cmFjdFRva2VuQ2xhaW1zIH0gZnJvbSAnLi4vYWNjb3VudC9BdXRoVG9rZW4ubWpzJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlTWV0YWRhdGEubWpzJztcbmltcG9ydCB7IGdldEFsaWFzZXNGcm9tU3RhdGljU291cmNlcyB9IGZyb20gJy4uL2F1dGhvcml0eS9BdXRob3JpdHlNZXRhZGF0YS5tanMnO1xuaW1wb3J0IHsgQ2FjaGVFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NhY2hlRXJyb3IubWpzJztcbmltcG9ydCB7IGludmFsaWRDYWNoZVJlY29yZCwgYmluZGluZ0tleU5vdFJlbW92ZWQsIG11bHRpcGxlTWF0Y2hpbmdBcHBNZXRhZGF0YSwgbWV0aG9kTm90SW1wbGVtZW50ZWQgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuaW1wb3J0IHsgY2FjaGVRdW90YUV4Y2VlZGVkRXJyb3JDb2RlLCBjYWNoZVVua25vd25FcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvci9DYWNoZUVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgY2xhc3Mgd2hpY2ggaW1wbGVtZW50IGNhY2hlIHN0b3JhZ2UgZnVuY3Rpb25zIHVzZWQgYnkgTVNBTCB0byBwZXJmb3JtIHZhbGlkaXR5IGNoZWNrcywgYW5kIHN0b3JlIHRva2Vucy5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jbGFzcyBDYWNoZU1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoY2xpZW50SWQsIGNyeXB0b0ltcGwsIGxvZ2dlciwgc3RhdGljQXV0aG9yaXR5T3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcclxuICAgICAgICB0aGlzLmNyeXB0b0ltcGwgPSBjcnlwdG9JbXBsO1xyXG4gICAgICAgIHRoaXMuY29tbW9uTG9nZ2VyID0gbG9nZ2VyLmNsb25lKG5hbWUsIHZlcnNpb24pO1xyXG4gICAgICAgIHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucyA9IHN0YXRpY0F1dGhvcml0eU9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYWxsIHRoZSBhY2NvdW50cyBpbiB0aGUgY2FjaGUgdGhhdCBtYXRjaCB0aGUgb3B0aW9uYWwgZmlsdGVyLiBJZiBubyBmaWx0ZXIgaXMgcHJvdmlkZWQsIGFsbCBhY2NvdW50cyBhcmUgcmV0dXJuZWQuXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEZpbHRlciAtIChPcHRpb25hbCkgZmlsdGVyIHRvIG5hcnJvdyBkb3duIHRoZSBhY2NvdW50cyByZXR1cm5lZFxyXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgQWNjb3VudEluZm8gb2JqZWN0cyBpbiBjYWNoZVxyXG4gICAgICovXHJcbiAgICBnZXRBbGxBY2NvdW50cyhhY2NvdW50RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUZW5hbnRQcm9maWxlcyh0aGlzLmdldEFjY291bnRzRmlsdGVyZWRCeShhY2NvdW50RmlsdGVyIHx8IHt9KSwgYWNjb3VudEZpbHRlcik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgZmlyc3QgdGVuYW50ZWQgQWNjb3VudEluZm8gb2JqZWN0IGZvdW5kIGJhc2VkIG9uIHByb3ZpZGVkIGZpbHRlcnNcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICBjb25zdCBhbGxBY2NvdW50cyA9IHRoaXMuZ2V0QWxsQWNjb3VudHMoYWNjb3VudEZpbHRlcik7XHJcbiAgICAgICAgaWYgKGFsbEFjY291bnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgLy8gSWYgb25lIG9yIG1vcmUgYWNjb3VudHMgYXJlIGZvdW5kLCBwcmlvcml0aXplIGFjY291bnRzIHRoYXQgaGF2ZSBhbiBJRCB0b2tlblxyXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRBY2NvdW50cyA9IGFsbEFjY291bnRzLnNvcnQoKGFjY291bnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2NvdW50LmlkVG9rZW5DbGFpbXMgPyAtMSA6IDE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkQWNjb3VudHNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFsbEFjY291bnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAvLyBJZiBvbmx5IG9uZSBhY2NvdW50IGlzIGZvdW5kLCByZXR1cm4gaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgbWF0Y2hpbmcgSUQgdG9rZW4gd2FzIGZvdW5kXHJcbiAgICAgICAgICAgIHJldHVybiBhbGxBY2NvdW50c1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNpbmdsZSBtYXRjaGluZ1xyXG4gICAgICogQHBhcmFtIGFjY291bnRGaWx0ZXJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldEJhc2VBY2NvdW50SW5mbyhhY2NvdW50RmlsdGVyKSB7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEVudGl0aWVzID0gdGhpcy5nZXRBY2NvdW50c0ZpbHRlcmVkQnkoYWNjb3VudEZpbHRlcik7XHJcbiAgICAgICAgaWYgKGFjY291bnRFbnRpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhY2NvdW50RW50aXRpZXNbMF0uZ2V0QWNjb3VudEluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWF0Y2hlcyBmaWx0ZXJlZCBhY2NvdW50IGVudGl0aWVzIHdpdGggY2FjaGVkIElEIHRva2VucyB0aGF0IG1hdGNoIHRoZSB0ZW5hbnQgcHJvZmlsZS1zcGVjaWZpYyBhY2NvdW50IGZpbHRlcnNcclxuICAgICAqIGFuZCBidWlsZHMgdGhlIGFjY291bnQgaW5mbyBvYmplY3RzIGZyb20gdGhlIG1hdGNoaW5nIElEIHRva2VuJ3MgY2xhaW1zXHJcbiAgICAgKiBAcGFyYW0gY2FjaGVkQWNjb3VudHNcclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyXHJcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBBY2NvdW50SW5mbyBvYmplY3RzIHRoYXQgbWF0Y2ggYWNjb3VudCBhbmQgdGVuYW50IHByb2ZpbGUgZmlsdGVyc1xyXG4gICAgICovXHJcbiAgICBidWlsZFRlbmFudFByb2ZpbGVzKGNhY2hlZEFjY291bnRzLCBhY2NvdW50RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZEFjY291bnRzLmZsYXRNYXAoKGFjY291bnRFbnRpdHkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVuYW50UHJvZmlsZXNGcm9tQWNjb3VudEVudGl0eShhY2NvdW50RW50aXR5LCBhY2NvdW50RmlsdGVyPy50ZW5hbnRJZCwgYWNjb3VudEZpbHRlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXRUZW5hbnRlZEFjY291bnRJbmZvQnlGaWx0ZXIoYWNjb3VudEluZm8sIHRva2VuS2V5cywgdGVuYW50UHJvZmlsZSwgdGVuYW50UHJvZmlsZUZpbHRlcikge1xyXG4gICAgICAgIGxldCB0ZW5hbnRlZEFjY291bnRJbmZvID0gbnVsbDtcclxuICAgICAgICBsZXQgaWRUb2tlbkNsYWltcztcclxuICAgICAgICBpZiAodGVuYW50UHJvZmlsZUZpbHRlcikge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMudGVuYW50UHJvZmlsZU1hdGNoZXNGaWx0ZXIodGVuYW50UHJvZmlsZSwgdGVuYW50UHJvZmlsZUZpbHRlcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkVG9rZW4gPSB0aGlzLmdldElkVG9rZW4oYWNjb3VudEluZm8sIHRva2VuS2V5cywgdGVuYW50UHJvZmlsZS50ZW5hbnRJZCk7XHJcbiAgICAgICAgaWYgKGlkVG9rZW4pIHtcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltcyA9IGV4dHJhY3RUb2tlbkNsYWltcyhpZFRva2VuLnNlY3JldCwgdGhpcy5jcnlwdG9JbXBsLmJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pZFRva2VuQ2xhaW1zTWF0Y2hUZW5hbnRQcm9maWxlRmlsdGVyKGlkVG9rZW5DbGFpbXMsIHRlbmFudFByb2ZpbGVGaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJRCB0b2tlbiBzb3VyY2VkIGNsYWltcyBkb24ndCBtYXRjaCBzbyB0aGlzIHRlbmFudCBwcm9maWxlIGlzIG5vdCBhIG1hdGNoXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFeHBhbmQgdGVuYW50IHByb2ZpbGUgaW50byBhY2NvdW50IGluZm8gYmFzZWQgb24gbWF0Y2hpbmcgdGVuYW50IHByb2ZpbGUgYW5kIGlmIGF2YWlsYWJsZSBtYXRjaGluZyBJRCB0b2tlbiBjbGFpbXNcclxuICAgICAgICB0ZW5hbnRlZEFjY291bnRJbmZvID0gdXBkYXRlQWNjb3VudFRlbmFudFByb2ZpbGVEYXRhKGFjY291bnRJbmZvLCB0ZW5hbnRQcm9maWxlLCBpZFRva2VuQ2xhaW1zLCBpZFRva2VuPy5zZWNyZXQpO1xyXG4gICAgICAgIHJldHVybiB0ZW5hbnRlZEFjY291bnRJbmZvO1xyXG4gICAgfVxyXG4gICAgZ2V0VGVuYW50UHJvZmlsZXNGcm9tQWNjb3VudEVudGl0eShhY2NvdW50RW50aXR5LCB0YXJnZXRUZW5hbnRJZCwgdGVuYW50UHJvZmlsZUZpbHRlcikge1xyXG4gICAgICAgIGNvbnN0IGFjY291bnRJbmZvID0gYWNjb3VudEVudGl0eS5nZXRBY2NvdW50SW5mbygpO1xyXG4gICAgICAgIGxldCBzZWFyY2hUZW5hbnRQcm9maWxlcyA9IGFjY291bnRJbmZvLnRlbmFudFByb2ZpbGVzIHx8IG5ldyBNYXAoKTtcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIC8vIElmIGEgdGVuYW50IElEIHdhcyBwcm92aWRlZCwgb25seSByZXR1cm4gdGhlIHRlbmFudCBwcm9maWxlIGZvciB0aGF0IHRlbmFudCBJRCBpZiBpdCBleGlzdHNcclxuICAgICAgICBpZiAodGFyZ2V0VGVuYW50SWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVuYW50UHJvZmlsZSA9IHNlYXJjaFRlbmFudFByb2ZpbGVzLmdldCh0YXJnZXRUZW5hbnRJZCk7XHJcbiAgICAgICAgICAgIGlmICh0ZW5hbnRQcm9maWxlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWR1Y2Ugc2VhcmNoIGZpZWxkIHRvIGp1c3QgdGhpcyB0ZW5hbnQgcHJvZmlsZVxyXG4gICAgICAgICAgICAgICAgc2VhcmNoVGVuYW50UHJvZmlsZXMgPSBuZXcgTWFwKFtcclxuICAgICAgICAgICAgICAgICAgICBbdGFyZ2V0VGVuYW50SWQsIHRlbmFudFByb2ZpbGVdLFxyXG4gICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyB0ZW5hbnQgcHJvZmlsZSBmb3Igc2VhcmNoIHRlbmFudCBJRCwgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdUZW5hbnRQcm9maWxlcyA9IFtdO1xyXG4gICAgICAgIHNlYXJjaFRlbmFudFByb2ZpbGVzLmZvckVhY2goKHRlbmFudFByb2ZpbGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGVuYW50ZWRBY2NvdW50SW5mbyA9IHRoaXMuZ2V0VGVuYW50ZWRBY2NvdW50SW5mb0J5RmlsdGVyKGFjY291bnRJbmZvLCB0b2tlbktleXMsIHRlbmFudFByb2ZpbGUsIHRlbmFudFByb2ZpbGVGaWx0ZXIpO1xyXG4gICAgICAgICAgICBpZiAodGVuYW50ZWRBY2NvdW50SW5mbykge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdUZW5hbnRQcm9maWxlcy5wdXNoKHRlbmFudGVkQWNjb3VudEluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nVGVuYW50UHJvZmlsZXM7XHJcbiAgICB9XHJcbiAgICB0ZW5hbnRQcm9maWxlTWF0Y2hlc0ZpbHRlcih0ZW5hbnRQcm9maWxlLCB0ZW5hbnRQcm9maWxlRmlsdGVyKSB7XHJcbiAgICAgICAgaWYgKCEhdGVuYW50UHJvZmlsZUZpbHRlci5sb2NhbEFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAhdGhpcy5tYXRjaExvY2FsQWNjb3VudElkRnJvbVRlbmFudFByb2ZpbGUodGVuYW50UHJvZmlsZSwgdGVuYW50UHJvZmlsZUZpbHRlci5sb2NhbEFjY291bnRJZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoISF0ZW5hbnRQcm9maWxlRmlsdGVyLm5hbWUgJiZcclxuICAgICAgICAgICAgISh0ZW5hbnRQcm9maWxlLm5hbWUgPT09IHRlbmFudFByb2ZpbGVGaWx0ZXIubmFtZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGVuYW50UHJvZmlsZUZpbHRlci5pc0hvbWVUZW5hbnQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAhKHRlbmFudFByb2ZpbGUuaXNIb21lVGVuYW50ID09PSB0ZW5hbnRQcm9maWxlRmlsdGVyLmlzSG9tZVRlbmFudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlkVG9rZW5DbGFpbXNNYXRjaFRlbmFudFByb2ZpbGVGaWx0ZXIoaWRUb2tlbkNsYWltcywgdGVuYW50UHJvZmlsZUZpbHRlcikge1xyXG4gICAgICAgIC8vIFRlbmFudCBQcm9maWxlIGZpbHRlcmluZ1xyXG4gICAgICAgIGlmICh0ZW5hbnRQcm9maWxlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGlmICghIXRlbmFudFByb2ZpbGVGaWx0ZXIubG9jYWxBY2NvdW50SWQgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoTG9jYWxBY2NvdW50SWRGcm9tVG9rZW5DbGFpbXMoaWRUb2tlbkNsYWltcywgdGVuYW50UHJvZmlsZUZpbHRlci5sb2NhbEFjY291bnRJZCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISF0ZW5hbnRQcm9maWxlRmlsdGVyLmxvZ2luSGludCAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hMb2dpbkhpbnRGcm9tVG9rZW5DbGFpbXMoaWRUb2tlbkNsYWltcywgdGVuYW50UHJvZmlsZUZpbHRlci5sb2dpbkhpbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEhdGVuYW50UHJvZmlsZUZpbHRlci51c2VybmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hVc2VybmFtZShpZFRva2VuQ2xhaW1zLnByZWZlcnJlZF91c2VybmFtZSwgdGVuYW50UHJvZmlsZUZpbHRlci51c2VybmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISF0ZW5hbnRQcm9maWxlRmlsdGVyLm5hbWUgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoTmFtZShpZFRva2VuQ2xhaW1zLCB0ZW5hbnRQcm9maWxlRmlsdGVyLm5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEhdGVuYW50UHJvZmlsZUZpbHRlci5zaWQgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoU2lkKGlkVG9rZW5DbGFpbXMsIHRlbmFudFByb2ZpbGVGaWx0ZXIuc2lkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBzYXZlcyBhIGNhY2hlIHJlY29yZFxyXG4gICAgICogQHBhcmFtIGNhY2hlUmVjb3JkIHtDYWNoZVJlY29yZH1cclxuICAgICAqIEBwYXJhbSBzdG9yZUluQ2FjaGUgez9TdG9yZUluQ2FjaGV9XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZCB7P3N0cmluZ30gY29ycmVsYXRpb24gaWRcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2F2ZUNhY2hlUmVjb3JkKGNhY2hlUmVjb3JkLCBzdG9yZUluQ2FjaGUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBpZiAoIWNhY2hlUmVjb3JkKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihpbnZhbGlkQ2FjaGVSZWNvcmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoISFjYWNoZVJlY29yZC5hY2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjY291bnQoY2FjaGVSZWNvcmQuYWNjb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCEhY2FjaGVSZWNvcmQuaWRUb2tlbiAmJiBzdG9yZUluQ2FjaGU/LmlkVG9rZW4gIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldElkVG9rZW5DcmVkZW50aWFsKGNhY2hlUmVjb3JkLmlkVG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWNhY2hlUmVjb3JkLmFjY2Vzc1Rva2VuICYmXHJcbiAgICAgICAgICAgICAgICBzdG9yZUluQ2FjaGU/LmFjY2Vzc1Rva2VuICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQWNjZXNzVG9rZW4oY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWNhY2hlUmVjb3JkLnJlZnJlc2hUb2tlbiAmJlxyXG4gICAgICAgICAgICAgICAgc3RvcmVJbkNhY2hlPy5yZWZyZXNoVG9rZW4gIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoY2FjaGVSZWNvcmQucmVmcmVzaFRva2VuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISFjYWNoZVJlY29yZC5hcHBNZXRhZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBNZXRhZGF0YShjYWNoZVJlY29yZC5hcHBNZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXI/LmVycm9yKGBDYWNoZU1hbmFnZXIuc2F2ZUNhY2hlUmVjb3JkOiBmYWlsZWRgKTtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXI/LmVycm9yUGlpKGBDYWNoZU1hbmFnZXIuc2F2ZUNhY2hlUmVjb3JkOiAke2UubWVzc2FnZX1gLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChlLm5hbWUgPT09IFwiUXVvdGFFeGNlZWRlZEVycm9yXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBlLm5hbWUgPT09IFwiTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRURcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGUubWVzc2FnZS5pbmNsdWRlcyhcImV4Y2VlZGVkIHRoZSBxdW90YVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uTG9nZ2VyPy5lcnJvcihgQ2FjaGVNYW5hZ2VyLnNhdmVDYWNoZVJlY29yZDogZXhjZWVkZWQgc3RvcmFnZSBxdW90YWAsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUVycm9yKGNhY2hlUXVvdGFFeGNlZWRlZEVycm9yQ29kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2FjaGVFcnJvcihlLm5hbWUsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlcj8uZXJyb3JQaWkoYENhY2hlTWFuYWdlci5zYXZlQ2FjaGVSZWNvcmQ6ICR7ZX1gLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYWNoZUVycm9yKGNhY2hlVW5rbm93bkVycm9yQ29kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNhdmVzIGFjY2VzcyB0b2tlbiBjcmVkZW50aWFsXHJcbiAgICAgKiBAcGFyYW0gY3JlZGVudGlhbFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlQWNjZXNzVG9rZW4oY3JlZGVudGlhbCkge1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuRmlsdGVyID0ge1xyXG4gICAgICAgICAgICBjbGllbnRJZDogY3JlZGVudGlhbC5jbGllbnRJZCxcclxuICAgICAgICAgICAgY3JlZGVudGlhbFR5cGU6IGNyZWRlbnRpYWwuY3JlZGVudGlhbFR5cGUsXHJcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBjcmVkZW50aWFsLmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICBob21lQWNjb3VudElkOiBjcmVkZW50aWFsLmhvbWVBY2NvdW50SWQsXHJcbiAgICAgICAgICAgIHJlYWxtOiBjcmVkZW50aWFsLnJlYWxtLFxyXG4gICAgICAgICAgICB0b2tlblR5cGU6IGNyZWRlbnRpYWwudG9rZW5UeXBlLFxyXG4gICAgICAgICAgICByZXF1ZXN0ZWRDbGFpbXNIYXNoOiBjcmVkZW50aWFsLnJlcXVlc3RlZENsYWltc0hhc2gsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTY29wZXMgPSBTY29wZVNldC5mcm9tU3RyaW5nKGNyZWRlbnRpYWwudGFyZ2V0KTtcclxuICAgICAgICBjb25zdCByZW1vdmVkQWNjZXNzVG9rZW5zID0gW107XHJcbiAgICAgICAgdG9rZW5LZXlzLmFjY2Vzc1Rva2VuLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWNjZXNzVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGtleSwgYWNjZXNzVG9rZW5GaWx0ZXIsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRva2VuRW50aXR5ID0gdGhpcy5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwoa2V5KTtcclxuICAgICAgICAgICAgaWYgKHRva2VuRW50aXR5ICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxNYXRjaGVzRmlsdGVyKHRva2VuRW50aXR5LCBhY2Nlc3NUb2tlbkZpbHRlcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuU2NvcGVTZXQgPSBTY29wZVNldC5mcm9tU3RyaW5nKHRva2VuRW50aXR5LnRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5TY29wZVNldC5pbnRlcnNlY3RpbmdTY29wZVNldHMoY3VycmVudFNjb3BlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkQWNjZXNzVG9rZW5zLnB1c2godGhpcy5yZW1vdmVBY2Nlc3NUb2tlbihrZXkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlbW92ZWRBY2Nlc3NUb2tlbnMpO1xyXG4gICAgICAgIHRoaXMuc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBhY2NvdW50IGVudGl0aWVzIG1hdGNoaW5nIGFsbCBwcm92aWRlZCB0ZW5hbnQtYWdub3N0aWMgZmlsdGVyczsgaWYgbm8gZmlsdGVyIGlzIHNldCwgZ2V0IGFsbCBhY2NvdW50IGVudGl0aWVzIGluIHRoZSBjYWNoZVxyXG4gICAgICogTm90IGNoZWNraW5nIGZvciBjYXNpbmcgYXMga2V5cyBhcmUgYWxsIGdlbmVyYXRlZCBpbiBsb3dlciBjYXNlLCByZW1lbWJlciB0byBjb252ZXJ0IHRvIGxvd2VyIGNhc2UgaWYgb2JqZWN0IHByb3BlcnRpZXMgYXJlIGNvbXBhcmVkXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEZpbHRlciAtIEFuIG9iamVjdCBjb250YWluaW5nIEFjY291bnQgcHJvcGVydGllcyB0byBmaWx0ZXIgYnlcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudHNGaWx0ZXJlZEJ5KGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICBjb25zdCBhbGxBY2NvdW50S2V5cyA9IHRoaXMuZ2V0QWNjb3VudEtleXMoKTtcclxuICAgICAgICBjb25zdCBtYXRjaGluZ0FjY291bnRzID0gW107XHJcbiAgICAgICAgYWxsQWNjb3VudEtleXMuZm9yRWFjaCgoY2FjaGVLZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWNjb3VudEtleShjYWNoZUtleSwgYWNjb3VudEZpbHRlci5ob21lQWNjb3VudElkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcGFyc2UgdmFsdWUgaWYgdGhlIGtleSBkb2Vzbid0IG1hdGNoIHRoZSBhY2NvdW50IGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldEFjY291bnQoY2FjaGVLZXksIHRoaXMuY29tbW9uTG9nZ2VyKTtcclxuICAgICAgICAgICAgLy8gTWF0Y2ggYmFzZSBhY2NvdW50IGZpZWxkc1xyXG4gICAgICAgICAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIuaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hIb21lQWNjb3VudElkKGVudGl0eSwgYWNjb3VudEZpbHRlci5ob21lQWNjb3VudElkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIudXNlcm5hbWUgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoVXNlcm5hbWUoZW50aXR5LnVzZXJuYW1lLCBhY2NvdW50RmlsdGVyLnVzZXJuYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIuZW52aXJvbm1lbnQgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoRW52aXJvbm1lbnQoZW50aXR5LCBhY2NvdW50RmlsdGVyLmVudmlyb25tZW50KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIucmVhbG0gJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoUmVhbG0oZW50aXR5LCBhY2NvdW50RmlsdGVyLnJlYWxtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIubmF0aXZlQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5tYXRjaE5hdGl2ZUFjY291bnRJZChlbnRpdHksIGFjY291bnRGaWx0ZXIubmF0aXZlQWNjb3VudElkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWFjY291bnRGaWx0ZXIuYXV0aG9yaXR5VHlwZSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hBdXRob3JpdHlUeXBlKGVudGl0eSwgYWNjb3VudEZpbHRlci5hdXRob3JpdHlUeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSB0ZW5hbnQgcHJvZmlsZSBtYXRjaGVzIHRoZSB0ZW5hbnQgcHJvZmlsZSBmaWx0ZXIsIGFkZCB0aGUgYWNjb3VudCB0byB0aGUgbGlzdCBvZiBtYXRjaGluZyBhY2NvdW50c1xyXG4gICAgICAgICAgICBjb25zdCB0ZW5hbnRQcm9maWxlRmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQ6IGFjY291bnRGaWx0ZXI/LmxvY2FsQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogYWNjb3VudEZpbHRlcj8ubmFtZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdUZW5hbnRQcm9maWxlcyA9IGVudGl0eS50ZW5hbnRQcm9maWxlcz8uZmlsdGVyKCh0ZW5hbnRQcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZW5hbnRQcm9maWxlTWF0Y2hlc0ZpbHRlcih0ZW5hbnRQcm9maWxlLCB0ZW5hbnRQcm9maWxlRmlsdGVyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1RlbmFudFByb2ZpbGVzICYmIG1hdGNoaW5nVGVuYW50UHJvZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyB0ZW5hbnQgcHJvZmlsZSBmb3IgdGhpcyBhY2NvdW50IG1hdGNoZXMgZmlsdGVyLCBkb24ndCBhZGQgdG8gbGlzdCBvZiBtYXRjaGluZyBhY2NvdW50c1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1hdGNoaW5nQWNjb3VudHMucHVzaChlbnRpdHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBtYXRjaGluZ0FjY291bnRzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleSBtYXRjaGVzIG91ciBhY2NvdW50IGtleSBzY2hlbWEuIEFsc28gbWF0Y2hlcyBob21lQWNjb3VudElkIGFuZC9vciB0ZW5hbnRJZCBpZiBwcm92aWRlZFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgaXNBY2NvdW50S2V5KGtleSwgaG9tZUFjY291bnRJZCwgdGVuYW50SWQpIHtcclxuICAgICAgICBpZiAoa2V5LnNwbGl0KFNlcGFyYXRvcnMuQ0FDSEVfS0VZX1NFUEFSQVRPUikubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgICAvLyBBY2NvdW50IGNhY2hlIGtleXMgY29udGFpbiAzIGl0ZW1zIHNlcGFyYXRlZCBieSAnLScgKGVhY2ggaXRlbSBtYXkgYWxzbyBjb250YWluICctJylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAha2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaG9tZUFjY291bnRJZC50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0ZW5hbnRJZCAmJiAha2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVuYW50SWQudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEbyBub3QgY2hlY2sgZW52aXJvbm1lbnQgYXMgYWxpYXNpbmcgY2FuIGNhdXNlIGZhbHNlIG5lZ2F0aXZlc1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleSBtYXRjaGVzIG91ciBjcmVkZW50aWFsIGtleSBzY2hlbWEuXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIGlzQ3JlZGVudGlhbEtleShrZXkpIHtcclxuICAgICAgICBpZiAoa2V5LnNwbGl0KFNlcGFyYXRvcnMuQ0FDSEVfS0VZX1NFUEFSQVRPUikubGVuZ3RoIDwgNikge1xyXG4gICAgICAgICAgICAvLyBDcmVkZW50aWFsIGNhY2hlIGtleXMgY29udGFpbiA2IGl0ZW1zIHNlcGFyYXRlZCBieSAnLScgKGVhY2ggaXRlbSBtYXkgYWxzbyBjb250YWluICctJylcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAvLyBDcmVkZW50aWFsIGtleXMgbXVzdCBpbmRpY2F0ZSB3aGF0IGNyZWRlbnRpYWwgdHlwZSB0aGV5IHJlcHJlc2VudFxyXG4gICAgICAgIGlmIChsb3dlckNhc2VLZXkuaW5kZXhPZihDcmVkZW50aWFsVHlwZS5JRF9UT0tFTi50b0xvd2VyQ2FzZSgpKSA9PT1cclxuICAgICAgICAgICAgLTEgJiZcclxuICAgICAgICAgICAgbG93ZXJDYXNlS2V5LmluZGV4T2YoQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOLnRvTG93ZXJDYXNlKCkpID09PVxyXG4gICAgICAgICAgICAgICAgLTEgJiZcclxuICAgICAgICAgICAgbG93ZXJDYXNlS2V5LmluZGV4T2YoQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUUudG9Mb3dlckNhc2UoKSkgPT09IC0xICYmXHJcbiAgICAgICAgICAgIGxvd2VyQ2FzZUtleS5pbmRleE9mKENyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU4udG9Mb3dlckNhc2UoKSkgPT09XHJcbiAgICAgICAgICAgICAgICAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb3dlckNhc2VLZXkuaW5kZXhPZihDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOLnRvTG93ZXJDYXNlKCkpID5cclxuICAgICAgICAgICAgLTEpIHtcclxuICAgICAgICAgICAgLy8gUmVmcmVzaCB0b2tlbnMgbXVzdCBjb250YWluIHRoZSBjbGllbnQgaWQgb3IgZmFtaWx5IGlkXHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudElkVmFsaWRhdGlvbiA9IGAke0NyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU59JHtTZXBhcmF0b3JzLkNBQ0hFX0tFWV9TRVBBUkFUT1J9JHt0aGlzLmNsaWVudElkfSR7U2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGZhbWlseUlkVmFsaWRhdGlvbiA9IGAke0NyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU59JHtTZXBhcmF0b3JzLkNBQ0hFX0tFWV9TRVBBUkFUT1J9JHtUSEVfRkFNSUxZX0lEfSR7U2VwYXJhdG9ycy5DQUNIRV9LRVlfU0VQQVJBVE9SfWA7XHJcbiAgICAgICAgICAgIGlmIChsb3dlckNhc2VLZXkuaW5kZXhPZihjbGllbnRJZFZhbGlkYXRpb24udG9Mb3dlckNhc2UoKSkgPT09IC0xICYmXHJcbiAgICAgICAgICAgICAgICBsb3dlckNhc2VLZXkuaW5kZXhPZihmYW1pbHlJZFZhbGlkYXRpb24udG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobG93ZXJDYXNlS2V5LmluZGV4T2YodGhpcy5jbGllbnRJZC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gVG9rZW5zIG11c3QgY29udGFpbiB0aGUgY2xpZW50SWRcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gY3JlZGVudGlhbCBlbnRpdHkgbWF0Y2hlcyB0aGUgZmlsdGVyXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gZmlsdGVyXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBjcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihlbnRpdHksIGZpbHRlcikge1xyXG4gICAgICAgIGlmICghIWZpbHRlci5jbGllbnRJZCAmJiAhdGhpcy5tYXRjaENsaWVudElkKGVudGl0eSwgZmlsdGVyLmNsaWVudElkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWZpbHRlci51c2VyQXNzZXJ0aW9uSGFzaCAmJlxyXG4gICAgICAgICAgICAhdGhpcy5tYXRjaFVzZXJBc3NlcnRpb25IYXNoKGVudGl0eSwgZmlsdGVyLnVzZXJBc3NlcnRpb25IYXNoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogaG9tZUFjY291bnRJZCBjYW4gYmUgdW5kZWZpbmVkLCBhbmQgd2Ugd2FudCB0byBmaWx0ZXIgb3V0IGNhY2hlZCBpdGVtcyB0aGF0IGhhdmUgYSBob21lQWNjb3VudElkIG9mIFwiXCJcclxuICAgICAgICAgKiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBjbGllbnRfY3JlZGVudGlhbCByZXF1ZXN0IHRvIHJldHVybiBhIGNhY2hlZCB0b2tlbiB0aGF0IGhhcyBhIGhvbWVBY2NvdW50SWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIGZpbHRlci5ob21lQWNjb3VudElkID09PSBcInN0cmluZ1wiICYmXHJcbiAgICAgICAgICAgICF0aGlzLm1hdGNoSG9tZUFjY291bnRJZChlbnRpdHksIGZpbHRlci5ob21lQWNjb3VudElkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWZpbHRlci5lbnZpcm9ubWVudCAmJlxyXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEVudmlyb25tZW50KGVudGl0eSwgZmlsdGVyLmVudmlyb25tZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWZpbHRlci5yZWFsbSAmJiAhdGhpcy5tYXRjaFJlYWxtKGVudGl0eSwgZmlsdGVyLnJlYWxtKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWZpbHRlci5jcmVkZW50aWFsVHlwZSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5tYXRjaENyZWRlbnRpYWxUeXBlKGVudGl0eSwgZmlsdGVyLmNyZWRlbnRpYWxUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWZpbHRlci5mYW1pbHlJZCAmJiAhdGhpcy5tYXRjaEZhbWlseUlkKGVudGl0eSwgZmlsdGVyLmZhbWlseUlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogaWRUb2tlbnMgZG8gbm90IGhhdmUgXCJ0YXJnZXRcIiwgdGFyZ2V0IHNwZWNpZmljIHJlZnJlc2hUb2tlbnMgZG8gZXhpc3QgZm9yIHNvbWUgdHlwZXMgb2YgYXV0aGVudGljYXRpb25cclxuICAgICAgICAgKiBSZXNvdXJjZSBzcGVjaWZpYyByZWZyZXNoIHRva2VucyBjYXNlIHdpbGwgYmUgYWRkZWQgd2hlbiB0aGUgc3VwcG9ydCBpcyBkZWVtZWQgbmVjZXNzYXJ5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCEhZmlsdGVyLnRhcmdldCAmJiAhdGhpcy5tYXRjaFRhcmdldChlbnRpdHksIGZpbHRlci50YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgcmVxdWVzdCBPUiBjYWNoZWQgZW50aXR5IGhhcyByZXF1ZXN0ZWQgQ2xhaW1zIEhhc2gsIGNoZWNrIGlmIHRoZXkgbWF0Y2hcclxuICAgICAgICBpZiAoZmlsdGVyLnJlcXVlc3RlZENsYWltc0hhc2ggfHwgZW50aXR5LnJlcXVlc3RlZENsYWltc0hhc2gpIHtcclxuICAgICAgICAgICAgLy8gRG9uJ3QgbWF0Y2ggaWYgZWl0aGVyIGlzIHVuZGVmaW5lZCBvciB0aGV5IGFyZSBkaWZmZXJlbnRcclxuICAgICAgICAgICAgaWYgKGVudGl0eS5yZXF1ZXN0ZWRDbGFpbXNIYXNoICE9PSBmaWx0ZXIucmVxdWVzdGVkQ2xhaW1zSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFjY2VzcyBUb2tlbiB3aXRoIEF1dGggU2NoZW1lIHNwZWNpZmljIG1hdGNoaW5nXHJcbiAgICAgICAgaWYgKGVudGl0eS5jcmVkZW50aWFsVHlwZSA9PT1cclxuICAgICAgICAgICAgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUUpIHtcclxuICAgICAgICAgICAgaWYgKCEhZmlsdGVyLnRva2VuVHlwZSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hUb2tlblR5cGUoZW50aXR5LCBmaWx0ZXIudG9rZW5UeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEtleUlkIChzc2hLaWQpIGluIHJlcXVlc3QgbXVzdCBtYXRjaCBjYWNoZWQgU1NIIGNlcnRpZmljYXRlIGtleUlkIGJlY2F1c2UgU1NIIGNlcnQgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBrZXlcclxuICAgICAgICAgICAgaWYgKGZpbHRlci50b2tlblR5cGUgPT09IEF1dGhlbnRpY2F0aW9uU2NoZW1lLlNTSCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5rZXlJZCAmJiAhdGhpcy5tYXRjaEtleUlkKGVudGl0eSwgZmlsdGVyLmtleUlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogcmV0cmlldmUgYXBwTWV0YWRhdGEgbWF0Y2hpbmcgYWxsIHByb3ZpZGVkIGZpbHRlcnM7IGlmIG5vIGZpbHRlciBpcyBzZXQsIGdldCBhbGwgYXBwTWV0YWRhdGFcclxuICAgICAqIEBwYXJhbSBmaWx0ZXJcclxuICAgICAqL1xyXG4gICAgZ2V0QXBwTWV0YWRhdGFGaWx0ZXJlZEJ5KGZpbHRlcikge1xyXG4gICAgICAgIGNvbnN0IGFsbENhY2hlS2V5cyA9IHRoaXMuZ2V0S2V5cygpO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nQXBwTWV0YWRhdGEgPSB7fTtcclxuICAgICAgICBhbGxDYWNoZUtleXMuZm9yRWFjaCgoY2FjaGVLZXkpID0+IHtcclxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgYW55IG5vbi1hcHBNZXRhZGF0YSB0eXBlIGNhY2hlIGVudGl0aWVzXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FwcE1ldGFkYXRhKGNhY2hlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgcmV0cmlldmFsXHJcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0QXBwTWV0YWRhdGEoY2FjaGVLZXkpO1xyXG4gICAgICAgICAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIWZpbHRlci5lbnZpcm9ubWVudCAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hFbnZpcm9ubWVudChlbnRpdHksIGZpbHRlci5lbnZpcm9ubWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISFmaWx0ZXIuY2xpZW50SWQgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoQ2xpZW50SWQoZW50aXR5LCBmaWx0ZXIuY2xpZW50SWQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWF0Y2hpbmdBcHBNZXRhZGF0YVtjYWNoZUtleV0gPSBlbnRpdHk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXBwTWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHJldHJpZXZlIGF1dGhvcml0eU1ldGFkYXRhIHRoYXQgY29udGFpbnMgYSBtYXRjaGluZyBhbGlhc1xyXG4gICAgICogQHBhcmFtIGZpbHRlclxyXG4gICAgICovXHJcbiAgICBnZXRBdXRob3JpdHlNZXRhZGF0YUJ5QWxpYXMoaG9zdCkge1xyXG4gICAgICAgIGNvbnN0IGFsbENhY2hlS2V5cyA9IHRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGFLZXlzKCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRFbnRpdHkgPSBudWxsO1xyXG4gICAgICAgIGFsbENhY2hlS2V5cy5mb3JFYWNoKChjYWNoZUtleSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBhbnkgbm9uLWF1dGhvcml0eU1ldGFkYXRhIHR5cGUgY2FjaGUgZW50aXRpZXNcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXV0aG9yaXR5TWV0YWRhdGEoY2FjaGVLZXkpIHx8XHJcbiAgICAgICAgICAgICAgICBjYWNoZUtleS5pbmRleE9mKHRoaXMuY2xpZW50SWQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgcmV0cmlldmFsXHJcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGEoY2FjaGVLZXkpO1xyXG4gICAgICAgICAgICBpZiAoIWVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbnRpdHkuYWxpYXNlcy5pbmRleE9mKGhvc3QpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1hdGNoZWRFbnRpdHkgPSBlbnRpdHk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZWRFbnRpdHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGFjY291bnRzIGFuZCByZWxhdGVkIHRva2VucyBmcm9tIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICBhc3luYyByZW1vdmVBbGxBY2NvdW50cygpIHtcclxuICAgICAgICBjb25zdCBhbGxBY2NvdW50S2V5cyA9IHRoaXMuZ2V0QWNjb3VudEtleXMoKTtcclxuICAgICAgICBjb25zdCByZW1vdmVkQWNjb3VudHMgPSBbXTtcclxuICAgICAgICBhbGxBY2NvdW50S2V5cy5mb3JFYWNoKChjYWNoZUtleSkgPT4ge1xyXG4gICAgICAgICAgICByZW1vdmVkQWNjb3VudHMucHVzaCh0aGlzLnJlbW92ZUFjY291bnQoY2FjaGVLZXkpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZW1vdmVkQWNjb3VudHMpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBhY2NvdW50IGFuZCByZWxhdGVkIHRva2VucyBmb3IgYSBnaXZlbiBhY2NvdW50IGtleVxyXG4gICAgICogQHBhcmFtIGFjY291bnRcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVtb3ZlQWNjb3VudChhY2NvdW50S2V5KSB7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IHRoaXMuZ2V0QWNjb3VudChhY2NvdW50S2V5LCB0aGlzLmNvbW1vbkxvZ2dlcik7XHJcbiAgICAgICAgaWYgKCFhY2NvdW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBY2NvdW50Q29udGV4dChhY2NvdW50KTtcclxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oYWNjb3VudEtleSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgY3JlZGVudGlhbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhY2NvdW50XHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZW1vdmVBY2NvdW50Q29udGV4dChhY2NvdW50KSB7XHJcbiAgICAgICAgY29uc3QgYWxsVG9rZW5LZXlzID0gdGhpcy5nZXRUb2tlbktleXMoKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSBhY2NvdW50LmdlbmVyYXRlQWNjb3VudElkKCk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZENyZWRlbnRpYWxzID0gW107XHJcbiAgICAgICAgYWxsVG9rZW5LZXlzLmlkVG9rZW4uZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihhY2NvdW50SWQpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUlkVG9rZW4oa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFsbFRva2VuS2V5cy5hY2Nlc3NUb2tlbi5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKGFjY291bnRJZCkgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZWRDcmVkZW50aWFscy5wdXNoKHRoaXMucmVtb3ZlQWNjZXNzVG9rZW4oa2V5KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBhbGxUb2tlbktleXMucmVmcmVzaFRva2VuLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoYWNjb3VudElkKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVSZWZyZXNoVG9rZW4oa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlbW92ZWRDcmVkZW50aWFscyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1pZ3JhdGVzIGEgc2luZ2xlLXRlbmFudCBhY2NvdW50IGFuZCBhbGwgaXQncyBhc3NvY2lhdGVkIGFsdGVybmF0ZSBjcm9zcy10ZW5hbnQgYWNjb3VudCBvYmplY3RzIGluIHRoZVxyXG4gICAgICogY2FjaGUgaW50byBhIGNvbmRlbnNlZCBtdWx0aS10ZW5hbnQgYWNjb3VudCBvYmplY3Qgd2l0aCB0ZW5hbnQgcHJvZmlsZXMuXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEtleVxyXG4gICAgICogQHBhcmFtIGFjY291bnRFbnRpdHlcclxuICAgICAqIEBwYXJhbSBsb2dnZXJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZU91dGRhdGVkQ2FjaGVkQWNjb3VudChhY2NvdW50S2V5LCBhY2NvdW50RW50aXR5LCBsb2dnZXIpIHtcclxuICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhY2NvdW50IGVudGl0eSBpcyBkZWZpbmVkIGFuZCBoYXMgbm8gdGVuYW50UHJvZmlsZXMgb2JqZWN0IChpcyBvdXRkYXRlZClcclxuICAgICAgICBpZiAoYWNjb3VudEVudGl0eSAmJiBhY2NvdW50RW50aXR5LmlzU2luZ2xlVGVuYW50KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXI/LnZlcmJvc2UoXCJ1cGRhdGVPdXRkYXRlZENhY2hlZEFjY291bnQ6IEZvdW5kIGEgc2luZ2xlLXRlbmFudCAob3V0ZGF0ZWQpIGFjY291bnQgZW50aXR5IGluIHRoZSBjYWNoZSwgbWlncmF0aW5nIHRvIG11bHRpLXRlbmFudCBhY2NvdW50IGVudGl0eVwiKTtcclxuICAgICAgICAgICAgLy8gR2V0IGtleXMgb2YgYWxsIGFjY291bnRzIGJlbG9uZ2luZyB0byB1c2VyXHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nQWNjb3VudEtleXMgPSB0aGlzLmdldEFjY291bnRLZXlzKCkuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkuc3RhcnRzV2l0aChhY2NvdW50RW50aXR5LmhvbWVBY2NvdW50SWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gR2V0IGFsbCBhY2NvdW50IGVudGl0aWVzIGJlbG9uZ2luZyB0byB1c2VyXHJcbiAgICAgICAgICAgIGNvbnN0IGFjY291bnRzVG9NZXJnZSA9IFtdO1xyXG4gICAgICAgICAgICBtYXRjaGluZ0FjY291bnRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjb3VudCA9IHRoaXMuZ2V0Q2FjaGVkQWNjb3VudEVudGl0eShrZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50c1RvTWVyZ2UucHVzaChhY2NvdW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIFNldCBiYXNlIGFjY291bnQgdG8gaG9tZSBhY2NvdW50IGlmIGF2YWlsYWJsZSwgYW55IGFjY291bnQgaWYgbm90XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VBY2NvdW50ID0gYWNjb3VudHNUb01lcmdlLmZpbmQoKGFjY291bnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZW5hbnRJZE1hdGNoZXNIb21lVGVuYW50KGFjY291bnQucmVhbG0sIGFjY291bnQuaG9tZUFjY291bnRJZCk7XHJcbiAgICAgICAgICAgIH0pIHx8IGFjY291bnRzVG9NZXJnZVswXTtcclxuICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGVuYW50IHByb2ZpbGVzIGJ1aWx0IGZyb20gZWFjaCBhY2NvdW50IGVudGl0eSBiZWxvbmdpbmcgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYmFzZUFjY291bnQudGVuYW50UHJvZmlsZXMgPSBhY2NvdW50c1RvTWVyZ2UubWFwKChhY2NvdW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbmFudElkOiBhY2NvdW50LnJlYWxtLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsQWNjb3VudElkOiBhY2NvdW50LmxvY2FsQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGFjY291bnQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0hvbWVUZW5hbnQ6IHRlbmFudElkTWF0Y2hlc0hvbWVUZW5hbnQoYWNjb3VudC5yZWFsbSwgYWNjb3VudC5ob21lQWNjb3VudElkKSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQWNjb3VudCA9IENhY2hlTWFuYWdlci50b09iamVjdChuZXcgQWNjb3VudEVudGl0eSgpLCB7XHJcbiAgICAgICAgICAgICAgICAuLi5iYXNlQWNjb3VudCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0FjY291bnRLZXkgPSB1cGRhdGVkQWNjb3VudC5nZW5lcmF0ZUFjY291bnRLZXkoKTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgY2FjaGUgb2YgbGVnYWN5IGFjY291bnQgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjb2xscHNlZCBpbnRvIHRlbmFudCBwcm9maWxlc1xyXG4gICAgICAgICAgICBtYXRjaGluZ0FjY291bnRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gbmV3QWNjb3VudEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlT3V0ZGF0ZWRBY2NvdW50KGFjY291bnRLZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gQ2FjaGUgdXBkYXRlZCBhY2NvdW50IG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLnNldEFjY291bnQodXBkYXRlZEFjY291bnQpO1xyXG4gICAgICAgICAgICBsb2dnZXI/LnZlcmJvc2UoXCJVcGRhdGVkIGFuIG91dGRhdGVkIGFjY291bnQgZW50aXR5IGluIHRoZSBjYWNoZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRBY2NvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBObyB1cGRhdGUgaXMgbmVjZXNzYXJ5XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnRFbnRpdHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgYSBib29sZWFuIGlmIHRoZSBnaXZlbiBjcmVkZW50aWFsIGlzIHJlbW92ZWRcclxuICAgICAqIEBwYXJhbSBjcmVkZW50aWFsXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlbW92ZUFjY2Vzc1Rva2VuKGtleSkge1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChrZXkpO1xyXG4gICAgICAgIGlmICghY3JlZGVudGlhbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBUb2tlbiBCaW5kaW5nIEtleSBmcm9tIGtleSBzdG9yZSBmb3IgUG9QIFRva2VucyBDcmVkZW50aWFsc1xyXG4gICAgICAgIGlmIChjcmVkZW50aWFsLmNyZWRlbnRpYWxUeXBlLnRvTG93ZXJDYXNlKCkgPT09XHJcbiAgICAgICAgICAgIENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWwudG9rZW5UeXBlID09PSBBdXRoZW50aWNhdGlvblNjaGVtZS5QT1ApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuV2l0aEF1dGhTY2hlbWVFbnRpdHkgPSBjcmVkZW50aWFsO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2lkID0gYWNjZXNzVG9rZW5XaXRoQXV0aFNjaGVtZUVudGl0eS5rZXlJZDtcclxuICAgICAgICAgICAgICAgIGlmIChraWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyeXB0b0ltcGwucmVtb3ZlVG9rZW5CaW5kaW5nS2V5KGtpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoYmluZGluZ0tleU5vdFJlbW92ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGFwcCBtZXRhZGF0YSBvYmplY3RzIGZyb20gY2FjaGUuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUFwcE1ldGFkYXRhKCkge1xyXG4gICAgICAgIGNvbnN0IGFsbENhY2hlS2V5cyA9IHRoaXMuZ2V0S2V5cygpO1xyXG4gICAgICAgIGFsbENhY2hlS2V5cy5mb3JFYWNoKChjYWNoZUtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0FwcE1ldGFkYXRhKGNhY2hlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBBY2NvdW50RW50aXR5IGZyb20gY2FjaGVcclxuICAgICAqIEBwYXJhbSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIHJlYWRBY2NvdW50RnJvbUNhY2hlKGFjY291bnQpIHtcclxuICAgICAgICBjb25zdCBhY2NvdW50S2V5ID0gQWNjb3VudEVudGl0eS5nZW5lcmF0ZUFjY291bnRDYWNoZUtleShhY2NvdW50KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY2NvdW50KGFjY291bnRLZXksIHRoaXMuY29tbW9uTG9nZ2VyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgSWRUb2tlbkVudGl0eSBmcm9tIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudCB7QWNjb3VudEluZm99XHJcbiAgICAgKiBAcGFyYW0gdG9rZW5LZXlzIHs/VG9rZW5LZXlzfVxyXG4gICAgICogQHBhcmFtIHRhcmdldFJlYWxtIHs/c3RyaW5nfVxyXG4gICAgICogQHBhcmFtIHBlcmZvcm1hbmNlQ2xpZW50IHs/SVBlcmZvcm1hbmNlQ2xpZW50fVxyXG4gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgez9zdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldElkVG9rZW4oYWNjb3VudCwgdG9rZW5LZXlzLCB0YXJnZXRSZWFsbSwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlci50cmFjZShcIkNhY2hlTWFuYWdlciAtIGdldElkVG9rZW4gY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5GaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIGhvbWVBY2NvdW50SWQ6IGFjY291bnQuaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IGFjY291bnQuZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxUeXBlOiBDcmVkZW50aWFsVHlwZS5JRF9UT0tFTixcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIHJlYWxtOiB0YXJnZXRSZWFsbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5NYXAgPSB0aGlzLmdldElkVG9rZW5zQnlGaWx0ZXIoaWRUb2tlbkZpbHRlciwgdG9rZW5LZXlzKTtcclxuICAgICAgICBjb25zdCBudW1JZFRva2VucyA9IGlkVG9rZW5NYXAuc2l6ZTtcclxuICAgICAgICBpZiAobnVtSWRUb2tlbnMgPCAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oXCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIE5vIHRva2VuIGZvdW5kXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobnVtSWRUb2tlbnMgPiAxKSB7XHJcbiAgICAgICAgICAgIGxldCB0b2tlbnNUb0JlUmVtb3ZlZCA9IGlkVG9rZW5NYXA7XHJcbiAgICAgICAgICAgIC8vIE11bHRpcGxlIHRlbmFudCBwcm9maWxlcyBhbmQgbm8gdGVuYW50IHNwZWNpZmllZCwgcGljayBob21lIGFjY291bnRcclxuICAgICAgICAgICAgaWYgKCF0YXJnZXRSZWFsbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaG9tZUlkVG9rZW5NYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICAgICAgICBpZFRva2VuTWFwLmZvckVhY2goKGlkVG9rZW4sIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZFRva2VuLnJlYWxtID09PSBhY2NvdW50LnRlbmFudElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvbWVJZFRva2VuTWFwLnNldChrZXksIGlkVG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtSG9tZUlkVG9rZW5zID0gaG9tZUlkVG9rZW5NYXAuc2l6ZTtcclxuICAgICAgICAgICAgICAgIGlmIChudW1Ib21lSWRUb2tlbnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXIuaW5mbyhcIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTXVsdGlwbGUgSUQgdG9rZW5zIGZvdW5kIGZvciBhY2NvdW50IGJ1dCBub25lIG1hdGNoIGFjY291bnQgZW50aXR5IHRlbmFudCBpZCwgcmV0dXJuaW5nIGZpcnN0IHJlc3VsdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRUb2tlbk1hcC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChudW1Ib21lSWRUb2tlbnMgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKFwiQ2FjaGVNYW5hZ2VyOmdldElkVG9rZW4gLSBNdWx0aXBsZSBJRCB0b2tlbnMgZm91bmQgZm9yIGFjY291bnQsIGRlZmF1bHRpbmcgdG8gaG9tZSB0ZW5hbnQgcHJvZmlsZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9tZUlkVG9rZW5NYXAudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgSUQgdG9rZW5zIGZvciBob21lIHRlbmFudCBwcm9maWxlLCByZW1vdmUgYWxsIGFuZCByZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc1RvQmVSZW1vdmVkID0gaG9tZUlkVG9rZW5NYXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gTXVsdGlwbGUgdG9rZW5zIGZvciBhIHNpbmdsZSB0ZW5hbnQgcHJvZmlsZSwgcmVtb3ZlIGFsbCBhbmQgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXIuaW5mbyhcIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTXVsdGlwbGUgbWF0Y2hpbmcgSUQgdG9rZW5zIGZvdW5kLCBjbGVhcmluZyB0aGVtXCIpO1xyXG4gICAgICAgICAgICB0b2tlbnNUb0JlUmVtb3ZlZC5mb3JFYWNoKChpZFRva2VuLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSWRUb2tlbihrZXkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHBlcmZvcm1hbmNlQ2xpZW50ICYmIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7IG11bHRpTWF0Y2hlZElEOiBpZFRva2VuTWFwLnNpemUgfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oXCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIFJldHVybmluZyBJRCB0b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gaWRUb2tlbk1hcC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGlkVG9rZW5zIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJcclxuICAgICAqIEBwYXJhbSBmaWx0ZXJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldElkVG9rZW5zQnlGaWx0ZXIoZmlsdGVyLCB0b2tlbktleXMpIHtcclxuICAgICAgICBjb25zdCBpZFRva2VuS2V5cyA9ICh0b2tlbktleXMgJiYgdG9rZW5LZXlzLmlkVG9rZW4pIHx8IHRoaXMuZ2V0VG9rZW5LZXlzKCkuaWRUb2tlbjtcclxuICAgICAgICBjb25zdCBpZFRva2VucyA9IG5ldyBNYXAoKTtcclxuICAgICAgICBpZFRva2VuS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlkVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGtleSwge1xyXG4gICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXIsXHJcbiAgICAgICAgICAgIH0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaWRUb2tlbiA9IHRoaXMuZ2V0SWRUb2tlbkNyZWRlbnRpYWwoa2V5KTtcclxuICAgICAgICAgICAgaWYgKGlkVG9rZW4gJiYgdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihpZFRva2VuLCBmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZFRva2Vucy5zZXQoa2V5LCBpZFRva2VuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBpZFRva2VucztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGUgdGhlIGNhY2hlIGtleSBhZ2FpbnN0IGZpbHRlciBiZWZvcmUgcmV0cmlldmluZyBhbmQgcGFyc2luZyBjYWNoZSB2YWx1ZVxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIGZpbHRlclxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgaWRUb2tlbktleU1hdGNoZXNGaWx0ZXIoaW5wdXRLZXksIGZpbHRlcikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGlucHV0S2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGZpbHRlci5jbGllbnRJZCAmJlxyXG4gICAgICAgICAgICBrZXkuaW5kZXhPZihmaWx0ZXIuY2xpZW50SWQudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5ob21lQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgIGtleS5pbmRleE9mKGZpbHRlci5ob21lQWNjb3VudElkLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGlkVG9rZW4gZnJvbSB0aGUgY2FjaGVcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlSWRUb2tlbihrZXkpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyByZWZyZXNoIHRva2VuIGZyb20gdGhlIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVJlZnJlc2hUb2tlbihrZXkpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgQWNjZXNzVG9rZW5FbnRpdHkgZnJvbSBjYWNoZVxyXG4gICAgICogQHBhcmFtIGFjY291bnQge0FjY291bnRJbmZvfVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3Qge0Jhc2VBdXRoUmVxdWVzdH1cclxuICAgICAqIEBwYXJhbSB0b2tlbktleXMgez9Ub2tlbktleXN9XHJcbiAgICAgKiBAcGFyYW0gcGVyZm9ybWFuY2VDbGllbnQgez9JUGVyZm9ybWFuY2VDbGllbnR9XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZCB7P3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgZ2V0QWNjZXNzVG9rZW4oYWNjb3VudCwgcmVxdWVzdCwgdG9rZW5LZXlzLCB0YXJnZXRSZWFsbSwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlci50cmFjZShcIkNhY2hlTWFuYWdlciAtIGdldEFjY2Vzc1Rva2VuIGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBzY29wZXMgPSBTY29wZVNldC5jcmVhdGVTZWFyY2hTY29wZXMocmVxdWVzdC5zY29wZXMpO1xyXG4gICAgICAgIGNvbnN0IGF1dGhTY2hlbWUgPSByZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lIHx8IEF1dGhlbnRpY2F0aW9uU2NoZW1lLkJFQVJFUjtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIERpc3Rpbmd1aXNoIGJldHdlZW4gQmVhcmVyIGFuZCBQb1AvU1NIIHRva2VuIGNhY2hlIHR5cGVzXHJcbiAgICAgICAgICogQ2FzdCB0byBsb3dlcmNhc2UgdG8gaGFuZGxlIFwiYmVhcmVyXCIgZnJvbSBBREZTXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbFR5cGUgPSBhdXRoU2NoZW1lICYmXHJcbiAgICAgICAgICAgIGF1dGhTY2hlbWUudG9Mb3dlckNhc2UoKSAhPT1cclxuICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uU2NoZW1lLkJFQVJFUi50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgID8gQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUVcclxuICAgICAgICAgICAgOiBDcmVkZW50aWFsVHlwZS5BQ0NFU1NfVE9LRU47XHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5GaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgIGhvbWVBY2NvdW50SWQ6IGFjY291bnQuaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IGFjY291bnQuZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxUeXBlOiBjcmVkZW50aWFsVHlwZSxcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIHJlYWxtOiB0YXJnZXRSZWFsbSB8fCBhY2NvdW50LnRlbmFudElkLFxyXG4gICAgICAgICAgICB0YXJnZXQ6IHNjb3BlcyxcclxuICAgICAgICAgICAgdG9rZW5UeXBlOiBhdXRoU2NoZW1lLFxyXG4gICAgICAgICAgICBrZXlJZDogcmVxdWVzdC5zc2hLaWQsXHJcbiAgICAgICAgICAgIHJlcXVlc3RlZENsYWltc0hhc2g6IHJlcXVlc3QucmVxdWVzdGVkQ2xhaW1zSGFzaCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuS2V5cyA9ICh0b2tlbktleXMgJiYgdG9rZW5LZXlzLmFjY2Vzc1Rva2VuKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmdldFRva2VuS2V5cygpLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VucyA9IFtdO1xyXG4gICAgICAgIGFjY2Vzc1Rva2VuS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgLy8gVmFsaWRhdGUga2V5XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuS2V5TWF0Y2hlc0ZpbHRlcihrZXksIGFjY2Vzc1Rva2VuRmlsdGVyLCB0cnVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChrZXkpO1xyXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdmFsdWVcclxuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbE1hdGNoZXNGaWx0ZXIoYWNjZXNzVG9rZW4sIGFjY2Vzc1Rva2VuRmlsdGVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2Vucy5wdXNoKGFjY2Vzc1Rva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG51bUFjY2Vzc1Rva2VucyA9IGFjY2Vzc1Rva2Vucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKG51bUFjY2Vzc1Rva2VucyA8IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXIuaW5mbyhcIkNhY2hlTWFuYWdlcjpnZXRBY2Nlc3NUb2tlbiAtIE5vIHRva2VuIGZvdW5kXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobnVtQWNjZXNzVG9rZW5zID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKFwiQ2FjaGVNYW5hZ2VyOmdldEFjY2Vzc1Rva2VuIC0gTXVsdGlwbGUgYWNjZXNzIHRva2VucyBmb3VuZCwgY2xlYXJpbmcgdGhlbVwiKTtcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW5zLmZvckVhY2goKGFjY2Vzc1Rva2VuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMucmVtb3ZlQWNjZXNzVG9rZW4oZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGFjY2Vzc1Rva2VuKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAocGVyZm9ybWFuY2VDbGllbnQgJiYgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHsgbXVsdGlNYXRjaGVkQVQ6IGFjY2Vzc1Rva2Vucy5sZW5ndGggfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oXCJDYWNoZU1hbmFnZXI6Z2V0QWNjZXNzVG9rZW4gLSBSZXR1cm5pbmcgYWNjZXNzIHRva2VuXCIpO1xyXG4gICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbnNbMF07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlIHRoZSBjYWNoZSBrZXkgYWdhaW5zdCBmaWx0ZXIgYmVmb3JlIHJldHJpZXZpbmcgYW5kIHBhcnNpbmcgY2FjaGUgdmFsdWVcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqIEBwYXJhbSBmaWx0ZXJcclxuICAgICAqIEBwYXJhbSBrZXlNdXN0Q29udGFpbkFsbFNjb3Blc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYWNjZXNzVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGlucHV0S2V5LCBmaWx0ZXIsIGtleU11c3RDb250YWluQWxsU2NvcGVzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gaW5wdXRLZXkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoZmlsdGVyLmNsaWVudElkICYmXHJcbiAgICAgICAgICAgIGtleS5pbmRleE9mKGZpbHRlci5jbGllbnRJZC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVyLmhvbWVBY2NvdW50SWQgJiZcclxuICAgICAgICAgICAga2V5LmluZGV4T2YoZmlsdGVyLmhvbWVBY2NvdW50SWQudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5yZWFsbSAmJiBrZXkuaW5kZXhPZihmaWx0ZXIucmVhbG0udG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5yZXF1ZXN0ZWRDbGFpbXNIYXNoICYmXHJcbiAgICAgICAgICAgIGtleS5pbmRleE9mKGZpbHRlci5yZXF1ZXN0ZWRDbGFpbXNIYXNoLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIudGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlcyA9IGZpbHRlci50YXJnZXQuYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjb3Blcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleU11c3RDb250YWluQWxsU2NvcGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIWtleS5pbmNsdWRlcyhzY29wZXNbaV0udG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHBlcmZvcm1pbmcgYSBjYWNoZSBsb29rdXAgYSBtaXNzaW5nIHNjb3BlIHdvdWxkIGJlIGEgY2FjaGUgbWlzc1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFrZXlNdXN0Q29udGFpbkFsbFNjb3BlcyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGtleS5pbmNsdWRlcyhzY29wZXNbaV0udG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHBlcmZvcm1pbmcgYSBjYWNoZSB3cml0ZSwgYW55IHRva2VuIHdpdGggYSBzdWJzZXQgb2YgcmVxdWVzdGVkIHNjb3BlcyBzaG91bGQgYmUgcmVwbGFjZWRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgYWNjZXNzIHRva2VucyBtYXRjaGluZyB0aGUgZmlsdGVyXHJcbiAgICAgKiBAcGFyYW0gZmlsdGVyXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRBY2Nlc3NUb2tlbnNCeUZpbHRlcihmaWx0ZXIpIHtcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VucyA9IFtdO1xyXG4gICAgICAgIHRva2VuS2V5cy5hY2Nlc3NUb2tlbi5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc1Rva2VuS2V5TWF0Y2hlc0ZpbHRlcihrZXksIGZpbHRlciwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlbiAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihhY2Nlc3NUb2tlbiwgZmlsdGVyKSkge1xyXG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5zLnB1c2goYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VucztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHRvIHJldHJpZXZlIHRoZSBhcHByb3ByaWF0ZSByZWZyZXNoIHRva2VuIGZyb20gY2FjaGVcclxuICAgICAqIEBwYXJhbSBhY2NvdW50IHtBY2NvdW50SW5mb31cclxuICAgICAqIEBwYXJhbSBmYW1pbHlSVCB7Ym9vbGVhbn1cclxuICAgICAqIEBwYXJhbSB0b2tlbktleXMgez9Ub2tlbktleXN9XHJcbiAgICAgKiBAcGFyYW0gcGVyZm9ybWFuY2VDbGllbnQgez9JUGVyZm9ybWFuY2VDbGllbnR9XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZCB7P3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgZ2V0UmVmcmVzaFRva2VuKGFjY291bnQsIGZhbWlseVJULCB0b2tlbktleXMsIHBlcmZvcm1hbmNlQ2xpZW50LCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5jb21tb25Mb2dnZXIudHJhY2UoXCJDYWNoZU1hbmFnZXIgLSBnZXRSZWZyZXNoVG9rZW4gY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IGlkID0gZmFtaWx5UlQgPyBUSEVfRkFNSUxZX0lEIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbkZpbHRlciA9IHtcclxuICAgICAgICAgICAgaG9tZUFjY291bnRJZDogYWNjb3VudC5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogYWNjb3VudC5lbnZpcm9ubWVudCxcclxuICAgICAgICAgICAgY3JlZGVudGlhbFR5cGU6IENyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU4sXHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgICBmYW1pbHlJZDogaWQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW5LZXlzID0gKHRva2VuS2V5cyAmJiB0b2tlbktleXMucmVmcmVzaFRva2VuKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmdldFRva2VuS2V5cygpLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW5zID0gW107XHJcbiAgICAgICAgcmVmcmVzaFRva2VuS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgLy8gVmFsaWRhdGUga2V5XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbktleU1hdGNoZXNGaWx0ZXIoa2V5LCByZWZyZXNoVG9rZW5GaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoa2V5KTtcclxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHZhbHVlXHJcbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaFRva2VuICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihyZWZyZXNoVG9rZW4sIHJlZnJlc2hUb2tlbkZpbHRlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5zLnB1c2gocmVmcmVzaFRva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG51bVJlZnJlc2hUb2tlbnMgPSByZWZyZXNoVG9rZW5zLmxlbmd0aDtcclxuICAgICAgICBpZiAobnVtUmVmcmVzaFRva2VucyA8IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb21tb25Mb2dnZXIuaW5mbyhcIkNhY2hlTWFuYWdlcjpnZXRSZWZyZXNoVG9rZW4gLSBObyByZWZyZXNoIHRva2VuIGZvdW5kLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFkZHJlc3MgdGhlIGVsc2UgY2FzZSBhZnRlciByZW1vdmUgZnVuY3Rpb25zIGFkZHJlc3MgZW52aXJvbm1lbnQgYWxpYXNlc1xyXG4gICAgICAgIGlmIChudW1SZWZyZXNoVG9rZW5zID4gMSAmJiBwZXJmb3JtYW5jZUNsaWVudCAmJiBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7IG11bHRpTWF0Y2hlZFJUOiBudW1SZWZyZXNoVG9rZW5zIH0sIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKFwiQ2FjaGVNYW5hZ2VyOmdldFJlZnJlc2hUb2tlbiAtIHJldHVybmluZyByZWZyZXNoIHRva2VuXCIpO1xyXG4gICAgICAgIHJldHVybiByZWZyZXNoVG9rZW5zWzBdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZSB0aGUgY2FjaGUga2V5IGFnYWluc3QgZmlsdGVyIGJlZm9yZSByZXRyaWV2aW5nIGFuZCBwYXJzaW5nIGNhY2hlIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKiBAcGFyYW0gZmlsdGVyXHJcbiAgICAgKi9cclxuICAgIHJlZnJlc2hUb2tlbktleU1hdGNoZXNGaWx0ZXIoaW5wdXRLZXksIGZpbHRlcikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGlucHV0S2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGZpbHRlci5mYW1pbHlJZCAmJlxyXG4gICAgICAgICAgICBrZXkuaW5kZXhPZihmaWx0ZXIuZmFtaWx5SWQudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgZmFtaWx5SWQgaXMgdXNlZCwgY2xpZW50SWQgaXMgbm90IGluIHRoZSBrZXlcclxuICAgICAgICBpZiAoIWZpbHRlci5mYW1pbHlJZCAmJlxyXG4gICAgICAgICAgICBmaWx0ZXIuY2xpZW50SWQgJiZcclxuICAgICAgICAgICAga2V5LmluZGV4T2YoZmlsdGVyLmNsaWVudElkLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIuaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICBrZXkuaW5kZXhPZihmaWx0ZXIuaG9tZUFjY291bnRJZC50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgQXBwTWV0YWRhdGFFbnRpdHkgZnJvbSBjYWNoZVxyXG4gICAgICovXHJcbiAgICByZWFkQXBwTWV0YWRhdGFGcm9tQ2FjaGUoZW52aXJvbm1lbnQpIHtcclxuICAgICAgICBjb25zdCBhcHBNZXRhZGF0YUZpbHRlciA9IHtcclxuICAgICAgICAgICAgZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgYXBwTWV0YWRhdGEgPSB0aGlzLmdldEFwcE1ldGFkYXRhRmlsdGVyZWRCeShhcHBNZXRhZGF0YUZpbHRlcik7XHJcbiAgICAgICAgY29uc3QgYXBwTWV0YWRhdGFFbnRyaWVzID0gT2JqZWN0LmtleXMoYXBwTWV0YWRhdGEpLm1hcCgoa2V5KSA9PiBhcHBNZXRhZGF0YVtrZXldKTtcclxuICAgICAgICBjb25zdCBudW1BcHBNZXRhZGF0YSA9IGFwcE1ldGFkYXRhRW50cmllcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKG51bUFwcE1ldGFkYXRhIDwgMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobnVtQXBwTWV0YWRhdGEgPiAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtdWx0aXBsZU1hdGNoaW5nQXBwTWV0YWRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXBwTWV0YWRhdGFFbnRyaWVzWzBdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGZhbWlseV9pZCB2YWx1ZSBhc3NvY2lhdGVkICB3aXRoIEZPQ0lcclxuICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudFxyXG4gICAgICogQHBhcmFtIGNsaWVudElkXHJcbiAgICAgKi9cclxuICAgIGlzQXBwTWV0YWRhdGFGT0NJKGVudmlyb25tZW50KSB7XHJcbiAgICAgICAgY29uc3QgYXBwTWV0YWRhdGEgPSB0aGlzLnJlYWRBcHBNZXRhZGF0YUZyb21DYWNoZShlbnZpcm9ubWVudCk7XHJcbiAgICAgICAgcmV0dXJuICEhKGFwcE1ldGFkYXRhICYmIGFwcE1ldGFkYXRhLmZhbWlseUlkID09PSBUSEVfRkFNSUxZX0lEKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaGVscGVyIHRvIG1hdGNoIGFjY291bnQgaWRzXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVcclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKi9cclxuICAgIG1hdGNoSG9tZUFjY291bnRJZChlbnRpdHksIGhvbWVBY2NvdW50SWQpIHtcclxuICAgICAgICByZXR1cm4gISEodHlwZW9mIGVudGl0eS5ob21lQWNjb3VudElkID09PSBcInN0cmluZ1wiICYmXHJcbiAgICAgICAgICAgIGhvbWVBY2NvdW50SWQgPT09IGVudGl0eS5ob21lQWNjb3VudElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaGVscGVyIHRvIG1hdGNoIGFjY291bnQgaWRzXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gbG9jYWxBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIG1hdGNoTG9jYWxBY2NvdW50SWRGcm9tVG9rZW5DbGFpbXModG9rZW5DbGFpbXMsIGxvY2FsQWNjb3VudElkKSB7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkxvY2FsQWNjb3VudElkID0gdG9rZW5DbGFpbXMub2lkIHx8IHRva2VuQ2xhaW1zLnN1YjtcclxuICAgICAgICByZXR1cm4gbG9jYWxBY2NvdW50SWQgPT09IGlkVG9rZW5Mb2NhbEFjY291bnRJZDtcclxuICAgIH1cclxuICAgIG1hdGNoTG9jYWxBY2NvdW50SWRGcm9tVGVuYW50UHJvZmlsZSh0ZW5hbnRQcm9maWxlLCBsb2NhbEFjY291bnRJZCkge1xyXG4gICAgICAgIHJldHVybiB0ZW5hbnRQcm9maWxlLmxvY2FsQWNjb3VudElkID09PSBsb2NhbEFjY291bnRJZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaGVscGVyIHRvIG1hdGNoIG5hbWVzXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gbmFtZVxyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZG93bmNhc2VkIG5hbWUgcHJvcGVydGllcyBhcmUgcHJlc2VudCBhbmQgbWF0Y2ggaW4gdGhlIGZpbHRlciBhbmQgdGhlIGVudGl0eVxyXG4gICAgICovXHJcbiAgICBtYXRjaE5hbWUoY2xhaW1zLCBuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gY2xhaW1zLm5hbWU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXIgdG8gbWF0Y2ggdXNlcm5hbWVzXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gdXNlcm5hbWVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIG1hdGNoVXNlcm5hbWUoY2FjaGVkVXNlcm5hbWUsIGZpbHRlclVzZXJuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGNhY2hlZFVzZXJuYW1lICYmXHJcbiAgICAgICAgICAgIHR5cGVvZiBjYWNoZWRVc2VybmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxyXG4gICAgICAgICAgICBmaWx0ZXJVc2VybmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gY2FjaGVkVXNlcm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGhlbHBlciB0byBtYXRjaCBhc3NlcnRpb25cclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHBhcmFtIG9ib0Fzc2VydGlvblxyXG4gICAgICovXHJcbiAgICBtYXRjaFVzZXJBc3NlcnRpb25IYXNoKGVudGl0eSwgdXNlckFzc2VydGlvbkhhc2gpIHtcclxuICAgICAgICByZXR1cm4gISEoZW50aXR5LnVzZXJBc3NlcnRpb25IYXNoICYmXHJcbiAgICAgICAgICAgIHVzZXJBc3NlcnRpb25IYXNoID09PSBlbnRpdHkudXNlckFzc2VydGlvbkhhc2gpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXIgdG8gbWF0Y2ggZW52aXJvbm1lbnRcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICogQHBhcmFtIGVudmlyb25tZW50XHJcbiAgICAgKi9cclxuICAgIG1hdGNoRW52aXJvbm1lbnQoZW50aXR5LCBlbnZpcm9ubWVudCkge1xyXG4gICAgICAgIC8vIENoZWNrIHN0YXRpYyBhdXRob3JpdHkgb3B0aW9ucyBmaXJzdCBmb3IgY2FzZXMgd2hlcmUgYXV0aG9yaXR5IG1ldGFkYXRhIGhhcyBub3QgYmVlbiByZXNvbHZlZCBhbmQgY2FjaGVkIHlldFxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRpY0F1dGhvcml0eU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGljQWxpYXNlcyA9IGdldEFsaWFzZXNGcm9tU3RhdGljU291cmNlcyh0aGlzLnN0YXRpY0F1dGhvcml0eU9wdGlvbnMsIHRoaXMuY29tbW9uTG9nZ2VyKTtcclxuICAgICAgICAgICAgaWYgKHN0YXRpY0FsaWFzZXMuaW5jbHVkZXMoZW52aXJvbm1lbnQpICYmXHJcbiAgICAgICAgICAgICAgICBzdGF0aWNBbGlhc2VzLmluY2x1ZGVzKGVudGl0eS5lbnZpcm9ubWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFF1ZXJ5IG1ldGFkYXRhIGNhY2hlIGlmIG5vIHN0YXRpYyBhdXRob3JpdHkgY29uZmlndXJhdGlvbiBoYXMgYWxpYXNlcyB0aGF0IG1hdGNoIGVudmlyb21lbnRcclxuICAgICAgICBjb25zdCBjbG91ZE1ldGFkYXRhID0gdGhpcy5nZXRBdXRob3JpdHlNZXRhZGF0YUJ5QWxpYXMoZW52aXJvbm1lbnQpO1xyXG4gICAgICAgIGlmIChjbG91ZE1ldGFkYXRhICYmXHJcbiAgICAgICAgICAgIGNsb3VkTWV0YWRhdGEuYWxpYXNlcy5pbmRleE9mKGVudGl0eS5lbnZpcm9ubWVudCkgPiAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXIgdG8gbWF0Y2ggY3JlZGVudGlhbCB0eXBlXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gY3JlZGVudGlhbFR5cGVcclxuICAgICAqL1xyXG4gICAgbWF0Y2hDcmVkZW50aWFsVHlwZShlbnRpdHksIGNyZWRlbnRpYWxUeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIChlbnRpdHkuY3JlZGVudGlhbFR5cGUgJiZcclxuICAgICAgICAgICAgY3JlZGVudGlhbFR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZW50aXR5LmNyZWRlbnRpYWxUeXBlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXIgdG8gbWF0Y2ggY2xpZW50IGlkc1xyXG4gICAgICogQHBhcmFtIGVudGl0eVxyXG4gICAgICogQHBhcmFtIGNsaWVudElkXHJcbiAgICAgKi9cclxuICAgIG1hdGNoQ2xpZW50SWQoZW50aXR5LCBjbGllbnRJZCkge1xyXG4gICAgICAgIHJldHVybiAhIShlbnRpdHkuY2xpZW50SWQgJiYgY2xpZW50SWQgPT09IGVudGl0eS5jbGllbnRJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGhlbHBlciB0byBtYXRjaCBmYW1pbHkgaWRzXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gZmFtaWx5SWRcclxuICAgICAqL1xyXG4gICAgbWF0Y2hGYW1pbHlJZChlbnRpdHksIGZhbWlseUlkKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGVudGl0eS5mYW1pbHlJZCAmJiBmYW1pbHlJZCA9PT0gZW50aXR5LmZhbWlseUlkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaGVscGVyIHRvIG1hdGNoIHJlYWxtXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gcmVhbG1cclxuICAgICAqL1xyXG4gICAgbWF0Y2hSZWFsbShlbnRpdHksIHJlYWxtKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGVudGl0eS5yZWFsbT8udG9Mb3dlckNhc2UoKSA9PT0gcmVhbG0udG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGhlbHBlciB0byBtYXRjaCBuYXRpdmVBY2NvdW50SWRcclxuICAgICAqIEBwYXJhbSBlbnRpdHlcclxuICAgICAqIEBwYXJhbSBuYXRpdmVBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbWF0Y2ggcmVzdWx0XHJcbiAgICAgKi9cclxuICAgIG1hdGNoTmF0aXZlQWNjb3VudElkKGVudGl0eSwgbmF0aXZlQWNjb3VudElkKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGVudGl0eS5uYXRpdmVBY2NvdW50SWQgJiYgbmF0aXZlQWNjb3VudElkID09PSBlbnRpdHkubmF0aXZlQWNjb3VudElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogaGVscGVyIHRvIG1hdGNoIGxvZ2luSGludCB3aGljaCBjYW4gYmUgZWl0aGVyOlxyXG4gICAgICogMS4gbG9naW5faGludCBJRCB0b2tlbiBjbGFpbVxyXG4gICAgICogMi4gdXNlcm5hbWUgaW4gY2FjaGVkIGFjY291bnQgb2JqZWN0XHJcbiAgICAgKiAzLiB1cG4gaW4gSUQgdG9rZW4gY2xhaW1zXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gbG9naW5IaW50XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBtYXRjaExvZ2luSGludEZyb21Ub2tlbkNsYWltcyh0b2tlbkNsYWltcywgbG9naW5IaW50KSB7XHJcbiAgICAgICAgaWYgKHRva2VuQ2xhaW1zLmxvZ2luX2hpbnQgPT09IGxvZ2luSGludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRva2VuQ2xhaW1zLnByZWZlcnJlZF91c2VybmFtZSA9PT0gbG9naW5IaW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodG9rZW5DbGFpbXMudXBuID09PSBsb2dpbkhpbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHRvIG1hdGNoIHNpZFxyXG4gICAgICogQHBhcmFtIGVudGl0eVxyXG4gICAgICogQHBhcmFtIHNpZFxyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc2lkIGNsYWltIGlzIHByZXNlbnQgYW5kIG1hdGNoZXMgdGhlIGZpbHRlclxyXG4gICAgICovXHJcbiAgICBtYXRjaFNpZChpZFRva2VuQ2xhaW1zLCBzaWQpIHtcclxuICAgICAgICByZXR1cm4gaWRUb2tlbkNsYWltcy5zaWQgPT09IHNpZDtcclxuICAgIH1cclxuICAgIG1hdGNoQXV0aG9yaXR5VHlwZShlbnRpdHksIGF1dGhvcml0eVR5cGUpIHtcclxuICAgICAgICByZXR1cm4gISEoZW50aXR5LmF1dGhvcml0eVR5cGUgJiZcclxuICAgICAgICAgICAgYXV0aG9yaXR5VHlwZS50b0xvd2VyQ2FzZSgpID09PSBlbnRpdHkuYXV0aG9yaXR5VHlwZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgc2NvcGVzIGFyZSBhIHN1YnNldCBvZiB0aGUgY3VycmVudCBlbnRpdHkncyBzY29wZXMsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqIEBwYXJhbSBlbnRpdHlcclxuICAgICAqIEBwYXJhbSB0YXJnZXRcclxuICAgICAqL1xyXG4gICAgbWF0Y2hUYXJnZXQoZW50aXR5LCB0YXJnZXQpIHtcclxuICAgICAgICBjb25zdCBpc05vdEFjY2Vzc1Rva2VuQ3JlZGVudGlhbCA9IGVudGl0eS5jcmVkZW50aWFsVHlwZSAhPT0gQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOICYmXHJcbiAgICAgICAgICAgIGVudGl0eS5jcmVkZW50aWFsVHlwZSAhPT1cclxuICAgICAgICAgICAgICAgIENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FO1xyXG4gICAgICAgIGlmIChpc05vdEFjY2Vzc1Rva2VuQ3JlZGVudGlhbCB8fCAhZW50aXR5LnRhcmdldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVudGl0eVNjb3BlU2V0ID0gU2NvcGVTZXQuZnJvbVN0cmluZyhlbnRpdHkudGFyZ2V0KTtcclxuICAgICAgICByZXR1cm4gZW50aXR5U2NvcGVTZXQuY29udGFpbnNTY29wZVNldCh0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNyZWRlbnRpYWwncyB0b2tlblR5cGUgb3IgQXV0aGVudGljYXRpb24gU2NoZW1lIG1hdGNoZXMgdGhlIG9uZSBpbiB0aGUgcmVxdWVzdCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKiBAcGFyYW0gdG9rZW5UeXBlXHJcbiAgICAgKi9cclxuICAgIG1hdGNoVG9rZW5UeXBlKGVudGl0eSwgdG9rZW5UeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuICEhKGVudGl0eS50b2tlblR5cGUgJiYgZW50aXR5LnRva2VuVHlwZSA9PT0gdG9rZW5UeXBlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjcmVkZW50aWFsJ3Mga2V5SWQgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSByZXF1ZXN0LCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBwYXJhbSBlbnRpdHlcclxuICAgICAqIEBwYXJhbSBrZXlJZFxyXG4gICAgICovXHJcbiAgICBtYXRjaEtleUlkKGVudGl0eSwga2V5SWQpIHtcclxuICAgICAgICByZXR1cm4gISEoZW50aXR5LmtleUlkICYmIGVudGl0eS5rZXlJZCA9PT0ga2V5SWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIGlmIGEgZ2l2ZW4gY2FjaGUgZW50aXR5IGlzIG9mIHRoZSB0eXBlIGFwcG1ldGFkYXRhXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIGlzQXBwTWV0YWRhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIGtleS5pbmRleE9mKEFQUF9NRVRBREFUQSkgIT09IC0xO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiByZXR1cm5zIGlmIGEgZ2l2ZW4gY2FjaGUgZW50aXR5IGlzIG9mIHRoZSB0eXBlIGF1dGhvcml0eW1ldGFkYXRhXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIGlzQXV0aG9yaXR5TWV0YWRhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIGtleS5pbmRleE9mKEFVVEhPUklUWV9NRVRBREFUQV9DT05TVEFOVFMuQ0FDSEVfS0VZKSAhPT0gLTE7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHJldHVybnMgY2FjaGUga2V5IHVzZWQgZm9yIGNsb3VkIGluc3RhbmNlIG1ldGFkYXRhXHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlQXV0aG9yaXR5TWV0YWRhdGFDYWNoZUtleShhdXRob3JpdHkpIHtcclxuICAgICAgICByZXR1cm4gYCR7QVVUSE9SSVRZX01FVEFEQVRBX0NPTlNUQU5UUy5DQUNIRV9LRVl9LSR7dGhpcy5jbGllbnRJZH0tJHthdXRob3JpdHl9YDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHRvIGNvbnZlcnQgc2VyaWFsaXplZCBkYXRhIHRvIG9iamVjdFxyXG4gICAgICogQHBhcmFtIG9ialxyXG4gICAgICogQHBhcmFtIGpzb25cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRvT2JqZWN0KG9iaiwganNvbikge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIGpzb24pIHtcclxuICAgICAgICAgICAgb2JqW3Byb3BlcnR5TmFtZV0gPSBqc29uW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbn1cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBEZWZhdWx0U3RvcmFnZUNsYXNzIGV4dGVuZHMgQ2FjaGVNYW5hZ2VyIHtcclxuICAgIHNldEFjY291bnQoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIGdldEFjY291bnQoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIGdldENhY2hlZEFjY291bnRFbnRpdHkoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIHNldElkVG9rZW5DcmVkZW50aWFsKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBnZXRJZFRva2VuQ3JlZGVudGlhbCgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBnZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIHNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIGdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIHNldEFwcE1ldGFkYXRhKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBnZXRBcHBNZXRhZGF0YSgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgc2V0U2VydmVyVGVsZW1ldHJ5KCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBnZXRTZXJ2ZXJUZWxlbWV0cnkoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIHNldEF1dGhvcml0eU1ldGFkYXRhKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBnZXRBdXRob3JpdHlNZXRhZGF0YSgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0QXV0aG9yaXR5TWV0YWRhdGFLZXlzKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICBzZXRUaHJvdHRsaW5nQ2FjaGUoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIGdldFRocm90dGxpbmdDYWNoZSgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlSXRlbSgpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5cygpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0QWNjb3VudEtleXMoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxuICAgIGdldFRva2VuS2V5cygpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlQ3JlZGVudGlhbENhY2hlS2V5KCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVPdXRkYXRlZEFjY291bnQoKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBDYWNoZU1hbmFnZXIsIERlZmF1bHRTdG9yYWdlQ2xhc3MgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhY2hlTWFuYWdlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IERFRkFVTFRfQ1JZUFRPX0lNUExFTUVOVEFUSU9OIH0gZnJvbSAnLi4vY3J5cHRvL0lDcnlwdG8ubWpzJztcbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICcuLi9sb2dnZXIvTG9nZ2VyLm1qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1RPS0VOX1JFTkVXQUxfT0ZGU0VUX1NFQywgQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBBenVyZUNsb3VkSW5zdGFuY2UgfSBmcm9tICcuLi9hdXRob3JpdHkvQXV0aG9yaXR5T3B0aW9ucy5tanMnO1xuaW1wb3J0IHsgRGVmYXVsdFN0b3JhZ2VDbGFzcyB9IGZyb20gJy4uL2NhY2hlL0NhY2hlTWFuYWdlci5tanMnO1xuaW1wb3J0IHsgUHJvdG9jb2xNb2RlIH0gZnJvbSAnLi4vYXV0aG9yaXR5L1Byb3RvY29sTW9kZS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBtZXRob2ROb3RJbXBsZW1lbnRlZCB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX1NZU1RFTV9PUFRJT05TID0ge1xyXG4gICAgdG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kczogREVGQVVMVF9UT0tFTl9SRU5FV0FMX09GRlNFVF9TRUMsXHJcbiAgICBwcmV2ZW50Q29yc1ByZWZsaWdodDogZmFsc2UsXHJcbn07XHJcbmNvbnN0IERFRkFVTFRfTE9HR0VSX0lNUExFTUVOVEFUSU9OID0ge1xyXG4gICAgbG9nZ2VyQ2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICAvLyBhbGxvdyB1c2VycyB0byBub3Qgc2V0IGxvZ2dlckNhbGxiYWNrXHJcbiAgICB9LFxyXG4gICAgcGlpTG9nZ2luZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgbG9nTGV2ZWw6IExvZ0xldmVsLkluZm8sXHJcbiAgICBjb3JyZWxhdGlvbklkOiBDb25zdGFudHMuRU1QVFlfU1RSSU5HLFxyXG59O1xyXG5jb25zdCBERUZBVUxUX0NBQ0hFX09QVElPTlMgPSB7XHJcbiAgICBjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiBmYWxzZSxcclxufTtcclxuY29uc3QgREVGQVVMVF9ORVRXT1JLX0lNUExFTUVOVEFUSU9OID0ge1xyXG4gICAgYXN5bmMgc2VuZEdldFJlcXVlc3RBc3luYygpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobWV0aG9kTm90SW1wbGVtZW50ZWQpO1xyXG4gICAgfSxcclxuICAgIGFzeW5jIHNlbmRQb3N0UmVxdWVzdEFzeW5jKCkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihtZXRob2ROb3RJbXBsZW1lbnRlZCk7XHJcbiAgICB9LFxyXG59O1xyXG5jb25zdCBERUZBVUxUX0xJQlJBUllfSU5GTyA9IHtcclxuICAgIHNrdTogQ29uc3RhbnRzLlNLVSxcclxuICAgIHZlcnNpb246IHZlcnNpb24sXHJcbiAgICBjcHU6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICBvczogQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxufTtcclxuY29uc3QgREVGQVVMVF9DTElFTlRfQ1JFREVOVElBTFMgPSB7XHJcbiAgICBjbGllbnRTZWNyZXQ6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICBjbGllbnRBc3NlcnRpb246IHVuZGVmaW5lZCxcclxufTtcclxuY29uc3QgREVGQVVMVF9BWlVSRV9DTE9VRF9PUFRJT05TID0ge1xyXG4gICAgYXp1cmVDbG91ZEluc3RhbmNlOiBBenVyZUNsb3VkSW5zdGFuY2UuTm9uZSxcclxuICAgIHRlbmFudDogYCR7Q29uc3RhbnRzLkRFRkFVTFRfQ09NTU9OX1RFTkFOVH1gLFxyXG59O1xyXG5jb25zdCBERUZBVUxUX1RFTEVNRVRSWV9PUFRJT05TID0ge1xyXG4gICAgYXBwbGljYXRpb246IHtcclxuICAgICAgICBhcHBOYW1lOiBcIlwiLFxyXG4gICAgICAgIGFwcFZlcnNpb246IFwiXCIsXHJcbiAgICB9LFxyXG59O1xyXG4vKipcclxuICogRnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBkZWZhdWx0IG9wdGlvbnMgd2hlbiBub3QgZXhwbGljaXRseSBjb25maWd1cmVkIGZyb20gYXBwIGRldmVsb3BlclxyXG4gKlxyXG4gKiBAcGFyYW0gQ29uZmlndXJhdGlvblxyXG4gKlxyXG4gKiBAcmV0dXJucyBDb25maWd1cmF0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZENsaWVudENvbmZpZ3VyYXRpb24oeyBhdXRoT3B0aW9uczogdXNlckF1dGhPcHRpb25zLCBzeXN0ZW1PcHRpb25zOiB1c2VyU3lzdGVtT3B0aW9ucywgbG9nZ2VyT3B0aW9uczogdXNlckxvZ2dlck9wdGlvbiwgY2FjaGVPcHRpb25zOiB1c2VyQ2FjaGVPcHRpb25zLCBzdG9yYWdlSW50ZXJmYWNlOiBzdG9yYWdlSW1wbGVtZW50YXRpb24sIG5ldHdvcmtJbnRlcmZhY2U6IG5ldHdvcmtJbXBsZW1lbnRhdGlvbiwgY3J5cHRvSW50ZXJmYWNlOiBjcnlwdG9JbXBsZW1lbnRhdGlvbiwgY2xpZW50Q3JlZGVudGlhbHM6IGNsaWVudENyZWRlbnRpYWxzLCBsaWJyYXJ5SW5mbzogbGlicmFyeUluZm8sIHRlbGVtZXRyeTogdGVsZW1ldHJ5LCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOiBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLCBwZXJzaXN0ZW5jZVBsdWdpbjogcGVyc2lzdGVuY2VQbHVnaW4sIHNlcmlhbGl6YWJsZUNhY2hlOiBzZXJpYWxpemFibGVDYWNoZSwgfSkge1xyXG4gICAgY29uc3QgbG9nZ2VyT3B0aW9ucyA9IHtcclxuICAgICAgICAuLi5ERUZBVUxUX0xPR0dFUl9JTVBMRU1FTlRBVElPTixcclxuICAgICAgICAuLi51c2VyTG9nZ2VyT3B0aW9uLFxyXG4gICAgfTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYXV0aE9wdGlvbnM6IGJ1aWxkQXV0aE9wdGlvbnModXNlckF1dGhPcHRpb25zKSxcclxuICAgICAgICBzeXN0ZW1PcHRpb25zOiB7IC4uLkRFRkFVTFRfU1lTVEVNX09QVElPTlMsIC4uLnVzZXJTeXN0ZW1PcHRpb25zIH0sXHJcbiAgICAgICAgbG9nZ2VyT3B0aW9uczogbG9nZ2VyT3B0aW9ucyxcclxuICAgICAgICBjYWNoZU9wdGlvbnM6IHsgLi4uREVGQVVMVF9DQUNIRV9PUFRJT05TLCAuLi51c2VyQ2FjaGVPcHRpb25zIH0sXHJcbiAgICAgICAgc3RvcmFnZUludGVyZmFjZTogc3RvcmFnZUltcGxlbWVudGF0aW9uIHx8XHJcbiAgICAgICAgICAgIG5ldyBEZWZhdWx0U3RvcmFnZUNsYXNzKHVzZXJBdXRoT3B0aW9ucy5jbGllbnRJZCwgREVGQVVMVF9DUllQVE9fSU1QTEVNRU5UQVRJT04sIG5ldyBMb2dnZXIobG9nZ2VyT3B0aW9ucykpLFxyXG4gICAgICAgIG5ldHdvcmtJbnRlcmZhY2U6IG5ldHdvcmtJbXBsZW1lbnRhdGlvbiB8fCBERUZBVUxUX05FVFdPUktfSU1QTEVNRU5UQVRJT04sXHJcbiAgICAgICAgY3J5cHRvSW50ZXJmYWNlOiBjcnlwdG9JbXBsZW1lbnRhdGlvbiB8fCBERUZBVUxUX0NSWVBUT19JTVBMRU1FTlRBVElPTixcclxuICAgICAgICBjbGllbnRDcmVkZW50aWFsczogY2xpZW50Q3JlZGVudGlhbHMgfHwgREVGQVVMVF9DTElFTlRfQ1JFREVOVElBTFMsXHJcbiAgICAgICAgbGlicmFyeUluZm86IHsgLi4uREVGQVVMVF9MSUJSQVJZX0lORk8sIC4uLmxpYnJhcnlJbmZvIH0sXHJcbiAgICAgICAgdGVsZW1ldHJ5OiB7IC4uLkRFRkFVTFRfVEVMRU1FVFJZX09QVElPTlMsIC4uLnRlbGVtZXRyeSB9LFxyXG4gICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6IHNlcnZlclRlbGVtZXRyeU1hbmFnZXIgfHwgbnVsbCxcclxuICAgICAgICBwZXJzaXN0ZW5jZVBsdWdpbjogcGVyc2lzdGVuY2VQbHVnaW4gfHwgbnVsbCxcclxuICAgICAgICBzZXJpYWxpemFibGVDYWNoZTogc2VyaWFsaXphYmxlQ2FjaGUgfHwgbnVsbCxcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIENvbnN0cnVjdCBhdXRob3B0aW9ucyBmcm9tIHRoZSBjbGllbnQgYW5kIHBsYXRmb3JtIHBhc3NlZCB2YWx1ZXNcclxuICogQHBhcmFtIGF1dGhPcHRpb25zXHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZEF1dGhPcHRpb25zKGF1dGhPcHRpb25zKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsaWVudENhcGFiaWxpdGllczogW10sXHJcbiAgICAgICAgYXp1cmVDbG91ZE9wdGlvbnM6IERFRkFVTFRfQVpVUkVfQ0xPVURfT1BUSU9OUyxcclxuICAgICAgICBza2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZTogZmFsc2UsXHJcbiAgICAgICAgaW5zdGFuY2VBd2FyZTogZmFsc2UsXHJcbiAgICAgICAgLi4uYXV0aE9wdGlvbnMsXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgY29uZmlnIGhhcyBwcm90b2NvbE1vZGUgc2V0IHRvIFByb3RvY29sTW9kZS5PSURDLCBmYWxzZSBvdGhlcndpc2VcclxuICogQHBhcmFtIENsaWVudENvbmZpZ3VyYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGlzT2lkY1Byb3RvY29sTW9kZShjb25maWcpIHtcclxuICAgIHJldHVybiAoY29uZmlnLmF1dGhPcHRpb25zLmF1dGhvcml0eS5vcHRpb25zLnByb3RvY29sTW9kZSA9PT0gUHJvdG9jb2xNb2RlLk9JREMpO1xyXG59XG5cbmV4cG9ydCB7IERFRkFVTFRfU1lTVEVNX09QVElPTlMsIGJ1aWxkQ2xpZW50Q29uZmlndXJhdGlvbiwgaXNPaWRjUHJvdG9jb2xNb2RlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRDb25maWd1cmF0aW9uLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBtZXRob2ROb3RJbXBsZW1lbnRlZCB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBTdHViYmVkTmV0d29ya01vZHVsZSA9IHtcclxuICAgIHNlbmRHZXRSZXF1ZXN0QXN5bmM6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKSk7XHJcbiAgICB9LFxyXG4gICAgc2VuZFBvc3RSZXF1ZXN0QXN5bmM6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQ2xpZW50QXV0aEVycm9yKG1ldGhvZE5vdEltcGxlbWVudGVkKSk7XHJcbiAgICB9LFxyXG59O1xuXG5leHBvcnQgeyBTdHViYmVkTmV0d29ya01vZHVsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SU5ldHdvcmtNb2R1bGUubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50U3RhdHVzIH0gZnJvbSAnLi9QZXJmb3JtYW5jZUV2ZW50Lm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBTdHViUGVyZm9ybWFuY2VNZWFzdXJlbWVudCB7XHJcbiAgICBzdGFydE1lYXN1cmVtZW50KCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVuZE1lYXN1cmVtZW50KCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZsdXNoTWVhc3VyZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgU3R1YlBlcmZvcm1hbmNlQ2xpZW50IHtcclxuICAgIGdlbmVyYXRlSWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiY2FsbGJhY2staWRcIjtcclxuICAgIH1cclxuICAgIHN0YXJ0TWVhc3VyZW1lbnQobWVhc3VyZU5hbWUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlbmQ6ICgpID0+IG51bGwsXHJcbiAgICAgICAgICAgIGRpc2NhcmQ6ICgpID0+IHsgfSxcclxuICAgICAgICAgICAgYWRkOiAoKSA9PiB7IH0sXHJcbiAgICAgICAgICAgIGluY3JlbWVudDogKCkgPT4geyB9LFxyXG4gICAgICAgICAgICBldmVudDoge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRJZDogdGhpcy5nZW5lcmF0ZUlkKCksXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFBlcmZvcm1hbmNlRXZlbnRTdGF0dXMuSW5Qcm9ncmVzcyxcclxuICAgICAgICAgICAgICAgIGF1dGhvcml0eTogXCJcIixcclxuICAgICAgICAgICAgICAgIGxpYnJhcnlOYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgbGlicmFyeVZlcnNpb246IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjbGllbnRJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6IG1lYXN1cmVOYW1lLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lTXM6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkIHx8IFwiXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lYXN1cmVtZW50OiBuZXcgU3R1YlBlcmZvcm1hbmNlTWVhc3VyZW1lbnQoKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhcnRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgU3R1YlBlcmZvcm1hbmNlTWVhc3VyZW1lbnQoKTtcclxuICAgIH1cclxuICAgIGNhbGN1bGF0ZVF1ZXVlZFRpbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBhZGRRdWV1ZU1lYXN1cmVtZW50KCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHNldFByZVF1ZXVlVGltZSgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbmRNZWFzdXJlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGRpc2NhcmRNZWFzdXJlbWVudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjaygpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBlbWl0RXZlbnRzKCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGFkZEZpZWxkcygpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpbmNyZW1lbnRGaWVsZHMoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2FjaGVFdmVudEJ5Q29ycmVsYXRpb25JZCgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU3R1YlBlcmZvcm1hbmNlQ2xpZW50LCBTdHViUGVyZm9ybWFuY2VNZWFzdXJlbWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3R1YlBlcmZvcm1hbmNlQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIE5hdmlnYXRpb25DbGllbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gb3RoZXIgcGFnZXMgd2l0aGluIHRoZSBzYW1lIHdlYiBhcHBsaWNhdGlvblxyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgbmF2aWdhdGVJbnRlcm5hbCh1cmwsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkNsaWVudC5kZWZhdWx0TmF2aWdhdGVXaW5kb3codXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTmF2aWdhdGVzIHRvIG90aGVyIHBhZ2VzIG91dHNpZGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBpLmUuIHRoZSBJZGVudGl0eSBQcm92aWRlclxyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgbmF2aWdhdGVFeHRlcm5hbCh1cmwsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gTmF2aWdhdGlvbkNsaWVudC5kZWZhdWx0TmF2aWdhdGVXaW5kb3codXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBuYXZpZ2F0aW9uIGltcGxlbWVudGF0aW9uIGludm9rZWQgYnkgdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCBmdW5jdGlvbnNcclxuICAgICAqIEBwYXJhbSB1cmxcclxuICAgICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBkZWZhdWx0TmF2aWdhdGVXaW5kb3codXJsLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubm9IaXN0b3J5KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0sIG9wdGlvbnMudGltZW91dCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTmF2aWdhdGlvbkNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF2aWdhdGlvbkNsaWVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJy4vQXV0aEVycm9yLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmVwcmVzZW50cyBuZXR3b3JrIHJlbGF0ZWQgZXJyb3JzXHJcbiAqL1xyXG5jbGFzcyBOZXR3b3JrRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoZXJyb3IsIGh0dHBTdGF0dXMsIHJlc3BvbnNlSGVhZGVycykge1xyXG4gICAgICAgIHN1cGVyKGVycm9yLmVycm9yQ29kZSwgZXJyb3IuZXJyb3JNZXNzYWdlLCBlcnJvci5zdWJFcnJvcik7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE5ldHdvcmtFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTmV0d29ya0Vycm9yXCI7XHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHRoaXMuaHR0cFN0YXR1cyA9IGh0dHBTdGF0dXM7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnM7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgTmV0d29ya0Vycm9yIG9iamVjdCBmb3IgYSBmYWlsZWQgbmV0d29yayByZXF1ZXN0XHJcbiAqIEBwYXJhbSBlcnJvciAtIEVycm9yIHRvIGJlIHRocm93biBiYWNrIHRvIHRoZSBjYWxsZXJcclxuICogQHBhcmFtIGh0dHBTdGF0dXMgLSBTdGF0dXMgY29kZSBvZiB0aGUgbmV0d29yayByZXF1ZXN0XHJcbiAqIEBwYXJhbSByZXNwb25zZUhlYWRlcnMgLSBSZXNwb25zZSBoZWFkZXJzIG9mIHRoZSBuZXR3b3JrIHJlcXVlc3QsIHdoZW4gYXZhaWxhYmxlXHJcbiAqIEByZXR1cm5zIE5ldHdvcmtFcnJvciBvYmplY3RcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZU5ldHdvcmtFcnJvcihlcnJvciwgaHR0cFN0YXR1cywgcmVzcG9uc2VIZWFkZXJzKSB7XHJcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtFcnJvcihlcnJvciwgaHR0cFN0YXR1cywgcmVzcG9uc2VIZWFkZXJzKTtcclxufVxuXG5leHBvcnQgeyBOZXR3b3JrRXJyb3IsIGNyZWF0ZU5ldHdvcmtFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya0Vycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlTmV0d29ya0Vycm9yIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IEhUVFBfUkVRVUVTVF9UWVBFIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgZ2V0UmVxdWVzdEZhaWxlZCwgbm9OZXR3b3JrQ29ubmVjdGl2aXR5LCBmYWlsZWRUb1BhcnNlUmVzcG9uc2UsIHBvc3RSZXF1ZXN0RmFpbGVkLCBmYWlsZWRUb0J1aWxkSGVhZGVycywgZmFpbGVkVG9QYXJzZUhlYWRlcnMgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIEZldGNoIEFQSSBmb3IgR0VUIGFuZCBQT1NUIHJlcXVlc3RzLiBTZWUgbW9yZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJXHJcbiAqL1xyXG5jbGFzcyBGZXRjaENsaWVudCB7XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIENsaWVudCBmb3IgUkVTVCBlbmRwb2ludHMgLSBHZXQgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICogQHBhcmFtIGhlYWRlcnNcclxuICAgICAqIEBwYXJhbSBib2R5XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNlbmRHZXRSZXF1ZXN0QXN5bmModXJsLCBvcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIGxldCByZXNwb25zZUhlYWRlcnMgPSB7fTtcclxuICAgICAgICBsZXQgcmVzcG9uc2VTdGF0dXMgPSAwO1xyXG4gICAgICAgIGNvbnN0IHJlcUhlYWRlcnMgPSBnZXRGZXRjaEhlYWRlcnMob3B0aW9ucyk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogSFRUUF9SRVFVRVNUX1RZUEUuR0VULFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVxSGVhZGVycyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iod2luZG93Lm5hdmlnYXRvci5vbkxpbmVcclxuICAgICAgICAgICAgICAgID8gZ2V0UmVxdWVzdEZhaWxlZFxyXG4gICAgICAgICAgICAgICAgOiBub05ldHdvcmtDb25uZWN0aXZpdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNwb25zZUhlYWRlcnMgPSBnZXRIZWFkZXJEaWN0KHJlc3BvbnNlLmhlYWRlcnMpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgYm9keTogKGF3YWl0IHJlc3BvbnNlLmpzb24oKSksXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlU3RhdHVzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVOZXR3b3JrRXJyb3IoY3JlYXRlQnJvd3NlckF1dGhFcnJvcihmYWlsZWRUb1BhcnNlUmVzcG9uc2UpLCByZXNwb25zZVN0YXR1cywgcmVzcG9uc2VIZWFkZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIENsaWVudCBmb3IgUkVTVCBlbmRwb2ludHMgLSBQb3N0IHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSB1cmxcclxuICAgICAqIEBwYXJhbSBoZWFkZXJzXHJcbiAgICAgKiBAcGFyYW0gYm9keVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzZW5kUG9zdFJlcXVlc3RBc3luYyh1cmwsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCByZXFCb2R5ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5ib2R5KSB8fCBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHJlcUhlYWRlcnMgPSBnZXRGZXRjaEhlYWRlcnMob3B0aW9ucyk7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIGxldCByZXNwb25zZVN0YXR1cyA9IDA7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlSGVhZGVycyA9IHt9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IEhUVFBfUkVRVUVTVF9UWVBFLlBPU1QsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXFIZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVxQm9keSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iod2luZG93Lm5hdmlnYXRvci5vbkxpbmVcclxuICAgICAgICAgICAgICAgID8gcG9zdFJlcXVlc3RGYWlsZWRcclxuICAgICAgICAgICAgICAgIDogbm9OZXR3b3JrQ29ubmVjdGl2aXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0gZ2V0SGVhZGVyRGljdChyZXNwb25zZS5oZWFkZXJzKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwb25zZVN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcclxuICAgICAgICAgICAgICAgIGJvZHk6IChhd2FpdCByZXNwb25zZS5qc29uKCkpLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZVN0YXR1cyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTmV0d29ya0Vycm9yKGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoZmFpbGVkVG9QYXJzZVJlc3BvbnNlKSwgcmVzcG9uc2VTdGF0dXMsIHJlc3BvbnNlSGVhZGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBHZXQgRmV0Y2ggQVBJIEhlYWRlcnMgb2JqZWN0IGZyb20gc3RyaW5nIG1hcFxyXG4gKiBAcGFyYW0gaW5wdXRIZWFkZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRGZXRjaEhlYWRlcnMob3B0aW9ucykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuICAgICAgICBpZiAoIShvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnNIZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnNIZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoZmFpbGVkVG9CdWlsZEhlYWRlcnMpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIG9iamVjdCByZXByZXNlbnRpbmcgcmVzcG9uc2UgaGVhZGVyc1xyXG4gKiBAcGFyYW0gaGVhZGVyc1xyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0SGVhZGVyRGljdChoZWFkZXJzKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckRpY3QgPSB7fTtcclxuICAgICAgICBoZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgaGVhZGVyRGljdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGhlYWRlckRpY3Q7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoZmFpbGVkVG9QYXJzZUhlYWRlcnMpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEZldGNoQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GZXRjaENsaWVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IENvbnN0YW50cywgUHJvdG9jb2xNb2RlLCBTZXJ2ZXJSZXNwb25zZVR5cGUsIEF6dXJlQ2xvdWRJbnN0YW5jZSwgU3R1YlBlcmZvcm1hbmNlQ2xpZW50LCBMb2dnZXIsIGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvciwgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMsIExvZ0xldmVsLCBERUZBVUxUX1NZU1RFTV9PUFRJT05TLCBTdHViYmVkTmV0d29ya01vZHVsZSB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJDYWNoZUxvY2F0aW9uLCBCcm93c2VyQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNsaWVudCB9IGZyb20gJy4uL25hdmlnYXRpb24vTmF2aWdhdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgRmV0Y2hDbGllbnQgfSBmcm9tICcuLi9uZXR3b3JrL0ZldGNoQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXJpIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBEZWZhdWx0IHRpbWVvdXQgZm9yIHBvcHVwIHdpbmRvd3MgYW5kIGlmcmFtZXMgaW4gbWlsbGlzZWNvbmRzXHJcbmNvbnN0IERFRkFVTFRfUE9QVVBfVElNRU9VVF9NUyA9IDYwMDAwO1xyXG5jb25zdCBERUZBVUxUX0lGUkFNRV9USU1FT1VUX01TID0gMTAwMDA7XHJcbmNvbnN0IERFRkFVTFRfUkVESVJFQ1RfVElNRU9VVF9NUyA9IDMwMDAwO1xyXG5jb25zdCBERUZBVUxUX05BVElWRV9CUk9LRVJfSEFORFNIQUtFX1RJTUVPVVRfTVMgPSAyMDAwO1xyXG4vKipcclxuICogTVNBTCBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIGRlZmF1bHQgb3B0aW9ucyB3aGVuIG5vdCBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZnJvbSBhcHAgZGV2ZWxvcGVyXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoXHJcbiAqIEBwYXJhbSBjYWNoZVxyXG4gKiBAcGFyYW0gc3lzdGVtXHJcbiAqXHJcbiAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZENvbmZpZ3VyYXRpb24oeyBhdXRoOiB1c2VySW5wdXRBdXRoLCBjYWNoZTogdXNlcklucHV0Q2FjaGUsIHN5c3RlbTogdXNlcklucHV0U3lzdGVtLCB0ZWxlbWV0cnk6IHVzZXJJbnB1dFRlbGVtZXRyeSwgfSwgaXNCcm93c2VyRW52aXJvbm1lbnQpIHtcclxuICAgIC8vIERlZmF1bHQgYXV0aCBvcHRpb25zIGZvciBicm93c2VyXHJcbiAgICBjb25zdCBERUZBVUxUX0FVVEhfT1BUSU9OUyA9IHtcclxuICAgICAgICBjbGllbnRJZDogQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICBhdXRob3JpdHk6IGAke0NvbnN0YW50cy5ERUZBVUxUX0FVVEhPUklUWX1gLFxyXG4gICAgICAgIGtub3duQXV0aG9yaXRpZXM6IFtdLFxyXG4gICAgICAgIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgYXV0aG9yaXR5TWV0YWRhdGE6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgcmVkaXJlY3RVcmk6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyBnZXRDdXJyZW50VXJpKCkgOiBcIlwiLFxyXG4gICAgICAgIHBvc3RMb2dvdXRSZWRpcmVjdFVyaTogQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICBuYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsOiB0cnVlLFxyXG4gICAgICAgIGNsaWVudENhcGFiaWxpdGllczogW10sXHJcbiAgICAgICAgcHJvdG9jb2xNb2RlOiBQcm90b2NvbE1vZGUuQUFELFxyXG4gICAgICAgIE9JRENPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlVHlwZTogU2VydmVyUmVzcG9uc2VUeXBlLkZSQUdNRU5ULFxyXG4gICAgICAgICAgICBkZWZhdWx0U2NvcGVzOiBbXHJcbiAgICAgICAgICAgICAgICBDb25zdGFudHMuT1BFTklEX1NDT1BFLFxyXG4gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlBST0ZJTEVfU0NPUEUsXHJcbiAgICAgICAgICAgICAgICBDb25zdGFudHMuT0ZGTElORV9BQ0NFU1NfU0NPUEUsXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhenVyZUNsb3VkT3B0aW9uczoge1xyXG4gICAgICAgICAgICBhenVyZUNsb3VkSW5zdGFuY2U6IEF6dXJlQ2xvdWRJbnN0YW5jZS5Ob25lLFxyXG4gICAgICAgICAgICB0ZW5hbnQ6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBza2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZTogZmFsc2UsXHJcbiAgICAgICAgc3VwcG9ydHNOZXN0ZWRBcHBBdXRoOiBmYWxzZSxcclxuICAgICAgICBpbnN0YW5jZUF3YXJlOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICAvLyBEZWZhdWx0IGNhY2hlIG9wdGlvbnMgZm9yIGJyb3dzZXJcclxuICAgIGNvbnN0IERFRkFVTFRfQ0FDSEVfT1BUSU9OUyA9IHtcclxuICAgICAgICBjYWNoZUxvY2F0aW9uOiBCcm93c2VyQ2FjaGVMb2NhdGlvbi5TZXNzaW9uU3RvcmFnZSxcclxuICAgICAgICB0ZW1wb3JhcnlDYWNoZUxvY2F0aW9uOiBCcm93c2VyQ2FjaGVMb2NhdGlvbi5TZXNzaW9uU3RvcmFnZSxcclxuICAgICAgICBzdG9yZUF1dGhTdGF0ZUluQ29va2llOiBmYWxzZSxcclxuICAgICAgICBzZWN1cmVDb29raWVzOiBmYWxzZSxcclxuICAgICAgICAvLyBEZWZhdWx0IGNhY2hlIG1pZ3JhdGlvbiB0byB0cnVlIGlmIGNhY2hlIGxvY2F0aW9uIGlzIGxvY2FsU3RvcmFnZSBzaW5jZSBlbnRyaWVzIGFyZSBwcmVzZXJ2ZWQgYWNyb3NzIHRhYnMvd2luZG93cy4gTWlncmF0aW9uIGhhcyBsaXR0bGUgdG8gbm8gYmVuZWZpdCBpbiBzZXNzaW9uU3RvcmFnZSBhbmQgbWVtb3J5U3RvcmFnZVxyXG4gICAgICAgIGNhY2hlTWlncmF0aW9uRW5hYmxlZDogdXNlcklucHV0Q2FjaGUgJiZcclxuICAgICAgICAgICAgdXNlcklucHV0Q2FjaGUuY2FjaGVMb2NhdGlvbiA9PT0gQnJvd3NlckNhY2hlTG9jYXRpb24uTG9jYWxTdG9yYWdlXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IGZhbHNlLFxyXG4gICAgICAgIGNsYWltc0Jhc2VkQ2FjaGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIC8vIERlZmF1bHQgbG9nZ2VyIG9wdGlvbnMgZm9yIGJyb3dzZXJcclxuICAgIGNvbnN0IERFRkFVTFRfTE9HR0VSX09QVElPTlMgPSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gICAgICAgIGxvZ2dlckNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGFsbG93IHVzZXJzIHRvIG5vdCBzZXQgbG9nZ2VyIGNhbGwgYmFja1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLkluZm8sXHJcbiAgICAgICAgcGlpTG9nZ2luZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIC8vIERlZmF1bHQgc3lzdGVtIG9wdGlvbnMgZm9yIGJyb3dzZXJcclxuICAgIGNvbnN0IERFRkFVTFRfQlJPV1NFUl9TWVNURU1fT1BUSU9OUyA9IHtcclxuICAgICAgICAuLi5ERUZBVUxUX1NZU1RFTV9PUFRJT05TLFxyXG4gICAgICAgIGxvZ2dlck9wdGlvbnM6IERFRkFVTFRfTE9HR0VSX09QVElPTlMsXHJcbiAgICAgICAgbmV0d29ya0NsaWVudDogaXNCcm93c2VyRW52aXJvbm1lbnRcclxuICAgICAgICAgICAgPyBuZXcgRmV0Y2hDbGllbnQoKVxyXG4gICAgICAgICAgICA6IFN0dWJiZWROZXR3b3JrTW9kdWxlLFxyXG4gICAgICAgIG5hdmlnYXRpb25DbGllbnQ6IG5ldyBOYXZpZ2F0aW9uQ2xpZW50KCksXHJcbiAgICAgICAgbG9hZEZyYW1lVGltZW91dDogMCxcclxuICAgICAgICAvLyBJZiBsb2FkRnJhbWVUaW1lb3V0IGlzIHByb3ZpZGVkLCB1c2UgdGhhdCBhcyBkZWZhdWx0LlxyXG4gICAgICAgIHdpbmRvd0hhc2hUaW1lb3V0OiB1c2VySW5wdXRTeXN0ZW0/LmxvYWRGcmFtZVRpbWVvdXQgfHwgREVGQVVMVF9QT1BVUF9USU1FT1VUX01TLFxyXG4gICAgICAgIGlmcmFtZUhhc2hUaW1lb3V0OiB1c2VySW5wdXRTeXN0ZW0/LmxvYWRGcmFtZVRpbWVvdXQgfHwgREVGQVVMVF9JRlJBTUVfVElNRU9VVF9NUyxcclxuICAgICAgICBuYXZpZ2F0ZUZyYW1lV2FpdDogMCxcclxuICAgICAgICByZWRpcmVjdE5hdmlnYXRpb25UaW1lb3V0OiBERUZBVUxUX1JFRElSRUNUX1RJTUVPVVRfTVMsXHJcbiAgICAgICAgYXN5bmNQb3B1cHM6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93UmVkaXJlY3RJbklmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dOYXRpdmVCcm9rZXI6IGZhbHNlLFxyXG4gICAgICAgIG5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQ6IHVzZXJJbnB1dFN5c3RlbT8ubmF0aXZlQnJva2VySGFuZHNoYWtlVGltZW91dCB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX05BVElWRV9CUk9LRVJfSEFORFNIQUtFX1RJTUVPVVRfTVMsXHJcbiAgICAgICAgcG9sbEludGVydmFsTWlsbGlzZWNvbmRzOiBCcm93c2VyQ29uc3RhbnRzLkRFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUyxcclxuICAgIH07XHJcbiAgICBjb25zdCBwcm92aWRlZFN5c3RlbU9wdGlvbnMgPSB7XHJcbiAgICAgICAgLi4uREVGQVVMVF9CUk9XU0VSX1NZU1RFTV9PUFRJT05TLFxyXG4gICAgICAgIC4uLnVzZXJJbnB1dFN5c3RlbSxcclxuICAgICAgICBsb2dnZXJPcHRpb25zOiB1c2VySW5wdXRTeXN0ZW0/LmxvZ2dlck9wdGlvbnMgfHwgREVGQVVMVF9MT0dHRVJfT1BUSU9OUyxcclxuICAgIH07XHJcbiAgICBjb25zdCBERUZBVUxUX1RFTEVNRVRSWV9PUFRJT05TID0ge1xyXG4gICAgICAgIGFwcGxpY2F0aW9uOiB7XHJcbiAgICAgICAgICAgIGFwcE5hbWU6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIGFwcFZlcnNpb246IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGllbnQ6IG5ldyBTdHViUGVyZm9ybWFuY2VDbGllbnQoKSxcclxuICAgIH07XHJcbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB1c2VyIGhhcyBzZXQgT0lEQ09wdGlvbnMgd2l0aG91dCBiZWluZyBpbiBPSURDIHByb3RvY29sIG1vZGVcclxuICAgIGlmICh1c2VySW5wdXRBdXRoPy5wcm90b2NvbE1vZGUgIT09IFByb3RvY29sTW9kZS5PSURDICYmXHJcbiAgICAgICAgdXNlcklucHV0QXV0aD8uT0lEQ09wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHByb3ZpZGVkU3lzdGVtT3B0aW9ucy5sb2dnZXJPcHRpb25zKTtcclxuICAgICAgICBsb2dnZXIud2FybmluZyhKU09OLnN0cmluZ2lmeShjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMuY2Fubm90U2V0T0lEQ09wdGlvbnMpKSk7XHJcbiAgICB9XHJcbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB1c2VyIGhhcyBzZXQgYWxsb3dOYXRpdmVCcm9rZXIgdG8gdHJ1ZSB3aXRob3V0IGJlaW5nIGluIEFBRCBwcm90b2NvbCBtb2RlXHJcbiAgICBpZiAodXNlcklucHV0QXV0aD8ucHJvdG9jb2xNb2RlICYmXHJcbiAgICAgICAgdXNlcklucHV0QXV0aC5wcm90b2NvbE1vZGUgIT09IFByb3RvY29sTW9kZS5BQUQgJiZcclxuICAgICAgICBwcm92aWRlZFN5c3RlbU9wdGlvbnM/LmFsbG93TmF0aXZlQnJva2VyKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKENsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLmNhbm5vdEFsbG93TmF0aXZlQnJva2VyKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG92ZXJsYXllZENvbmZpZyA9IHtcclxuICAgICAgICBhdXRoOiB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfQVVUSF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi51c2VySW5wdXRBdXRoLFxyXG4gICAgICAgICAgICBPSURDT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgLi4uREVGQVVMVF9BVVRIX09QVElPTlMuT0lEQ09wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAuLi51c2VySW5wdXRBdXRoPy5PSURDT3B0aW9ucyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNhY2hlOiB7IC4uLkRFRkFVTFRfQ0FDSEVfT1BUSU9OUywgLi4udXNlcklucHV0Q2FjaGUgfSxcclxuICAgICAgICBzeXN0ZW06IHByb3ZpZGVkU3lzdGVtT3B0aW9ucyxcclxuICAgICAgICB0ZWxlbWV0cnk6IHsgLi4uREVGQVVMVF9URUxFTUVUUllfT1BUSU9OUywgLi4udXNlcklucHV0VGVsZW1ldHJ5IH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG92ZXJsYXllZENvbmZpZztcclxufVxuXG5leHBvcnQgeyBERUZBVUxUX0lGUkFNRV9USU1FT1VUX01TLCBERUZBVUxUX05BVElWRV9CUk9LRVJfSEFORFNIQUtFX1RJTUVPVVRfTVMsIERFRkFVTFRfUE9QVVBfVElNRU9VVF9NUywgREVGQVVMVF9SRURJUkVDVF9USU1FT1VUX01TLCBidWlsZENvbmZpZ3VyYXRpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmZpZ3VyYXRpb24ubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBoZWFkZXIvaGVhZGVyICovXHJcbmNvbnN0IG5hbWUgPSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcclxuY29uc3QgdmVyc2lvbiA9IFwiMy4yOC4xXCI7XG5cbmV4cG9ydCB7IG5hbWUsIHZlcnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhY2thZ2VNZXRhZGF0YS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IExvZ0xldmVsLCBMb2dnZXIgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBidWlsZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb25maWcvQ29uZmlndXJhdGlvbi5tanMnO1xuaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2VNZXRhZGF0YS5tanMnO1xuaW1wb3J0IHsgQnJvd3NlckNhY2hlTG9jYXRpb24sIExPR19MRVZFTF9DQUNIRV9LRVksIExPR19QSUlfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIG9wZXJhdGluZyBjb250ZXh0XHJcbiAqIE9wZXJhdGluZyBjb250ZXh0cyBhcmUgY29udGV4dHMgaW4gd2hpY2ggTVNBTC5qcyBpcyBiZWluZyBydW5cclxuICogTW9yZSB0aGFuIG9uZSBvcGVyYXRpbmcgY29udGV4dCBtYXkgYmUgYXZhaWxhYmxlIGF0IGEgdGltZVxyXG4gKiBJdCdzIGltcG9ydGFudCBmcm9tIGEgbG9nZ2luZyBhbmQgdGVsZW1ldHJ5IHBvaW50IG9mIHZpZXcgZm9yIHVzIHRvIGJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIG9wZXJhdGluZyBjb250ZXh0LlxyXG4gKiBGb3IgZXhhbXBsZTogU29tZSBvcGVyYXRpbmcgY29udGV4dHMgd2lsbCBwcmUtY2FjaGUgdG9rZW5zIGltcGFjdGluZyBwZXJmb3JtYW5jZSB0ZWxlbWV0cnlcclxuICovXHJcbmNsYXNzIEJhc2VPcGVyYXRpbmdDb250ZXh0IHtcclxuICAgIHN0YXRpYyBsb2dnZXJDYWxsYmFjayhsZXZlbCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5FcnJvcjpcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLkluZm86XHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLlZlcmJvc2U6XHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5XYXJuaW5nOlxyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIGxvYWRlZCBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3aW5kb3cgaXMgbm90IGF2YWlsYWJsZSxcclxuICAgICAgICAgKiBzZXQgaW50ZXJuYWwgZmxhZyB0byBmYWxzZSBzbyB0aGF0IGZ1cnRoZXIgcmVxdWVzdHMgZmFpbC5cclxuICAgICAgICAgKiBUaGlzIGlzIHRvIHN1cHBvcnQgc2VydmVyLXNpZGUgcmVuZGVyaW5nIGVudmlyb25tZW50cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJyb3dzZXJFbnZpcm9ubWVudCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBidWlsZENvbmZpZ3VyYXRpb24oY29uZmlnLCB0aGlzLmJyb3dzZXJFbnZpcm9ubWVudCk7XHJcbiAgICAgICAgbGV0IHNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlID0gd2luZG93W0Jyb3dzZXJDYWNoZUxvY2F0aW9uLlNlc3Npb25TdG9yYWdlXTtcclxuICAgICAgICAgICAgLy8gTXV0ZSBlcnJvcnMgaWYgaXQncyBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGNvb2tpZXMgYXJlIGJsb2NrZWQuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICBjb25zdCBsb2dMZXZlbEtleSA9IHNlc3Npb25TdG9yYWdlPy5nZXRJdGVtKExPR19MRVZFTF9DQUNIRV9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHBpaUxvZ2dpbmdLZXkgPSBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICAgICAgICA/LmdldEl0ZW0oTE9HX1BJSV9DQUNIRV9LRVkpXHJcbiAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBwaWlMb2dnaW5nRW5hYmxlZCA9IHBpaUxvZ2dpbmdLZXkgPT09IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IHBpaUxvZ2dpbmdLZXkgPT09IFwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgPyBmYWxzZVxyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyT3B0aW9ucyA9IHsgLi4udGhpcy5jb25maWcuc3lzdGVtLmxvZ2dlck9wdGlvbnMgfTtcclxuICAgICAgICBjb25zdCBsb2dMZXZlbCA9IGxvZ0xldmVsS2V5ICYmIE9iamVjdC5rZXlzKExvZ0xldmVsKS5pbmNsdWRlcyhsb2dMZXZlbEtleSlcclxuICAgICAgICAgICAgPyBMb2dMZXZlbFtsb2dMZXZlbEtleV1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKGxvZ0xldmVsKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlck9wdGlvbnMubG9nZ2VyQ2FsbGJhY2sgPSBCYXNlT3BlcmF0aW5nQ29udGV4dC5sb2dnZXJDYWxsYmFjaztcclxuICAgICAgICAgICAgbG9nZ2VyT3B0aW9ucy5sb2dMZXZlbCA9IGxvZ0xldmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGlpTG9nZ2luZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsb2dnZXJPcHRpb25zLnBpaUxvZ2dpbmdFbmFibGVkID0gcGlpTG9nZ2luZ0VuYWJsZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcihsb2dnZXJPcHRpb25zLCBuYW1lLCB2ZXJzaW9uKTtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIE1TQUwgY29uZmlnXHJcbiAgICAgKiBAcmV0dXJucyBCcm93c2VyQ29uZmlndXJhdGlvblxyXG4gICAgICovXHJcbiAgICBnZXRDb25maWcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBNU0FMIExvZ2dlclxyXG4gICAgICogQHJldHVybnMgTG9nZ2VyXHJcbiAgICAgKi9cclxuICAgIGdldExvZ2dlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXI7XHJcbiAgICB9XHJcbiAgICBpc0F2YWlsYWJsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGU7XHJcbiAgICB9XHJcbiAgICBpc0Jyb3dzZXJFbnZpcm9ubWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyRW52aXJvbm1lbnQ7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQmFzZU9wZXJhdGluZ0NvbnRleHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VPcGVyYXRpbmdDb250ZXh0Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEJyaWRnZVN0YXR1c0NvZGUgPSB7XHJcbiAgICBVc2VySW50ZXJhY3Rpb25SZXF1aXJlZDogXCJVU0VSX0lOVEVSQUNUSU9OX1JFUVVJUkVEXCIsXHJcbiAgICBVc2VyQ2FuY2VsOiBcIlVTRVJfQ0FOQ0VMXCIsXHJcbiAgICBOb05ldHdvcms6IFwiTk9fTkVUV09SS1wiLFxyXG4gICAgVHJhbnNpZW50RXJyb3I6IFwiVFJBTlNJRU5UX0VSUk9SXCIsXHJcbiAgICBQZXJzaXN0ZW50RXJyb3I6IFwiUEVSU0lTVEVOVF9FUlJPUlwiLFxyXG4gICAgRGlzYWJsZWQ6IFwiRElTQUJMRURcIixcclxuICAgIEFjY291bnRVbmF2YWlsYWJsZTogXCJBQ0NPVU5UX1VOQVZBSUxBQkxFXCIsXHJcbiAgICBOZXN0ZWRBcHBBdXRoVW5hdmFpbGFibGU6IFwiTkVTVEVEX0FQUF9BVVRIX1VOQVZBSUxBQkxFXCIsIC8vIE5BQSBpcyB1bmF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBjb250ZXh0LCBjYW4gcmV0cnkgd2l0aCBzdGFuZGFyZCBicm93c2VyIGJhc2VkIGF1dGhcclxufTtcblxuZXhwb3J0IHsgQnJpZGdlU3RhdHVzQ29kZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJpZGdlU3RhdHVzQ29kZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEJyaWRnZVN0YXR1c0NvZGUgfSBmcm9tICcuL0JyaWRnZVN0YXR1c0NvZGUubWpzJztcbmltcG9ydCB7IGNyZWF0ZU5ld0d1aWQgfSBmcm9tICcuLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgQnJvd3NlckNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlTWV0YWRhdGEubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBCcmlkZ2VQcm94eVxyXG4gKiBQcm92aWRlcyBhIHByb3h5IGZvciBhY2Nlc3NpbmcgYSBicmlkZ2UgdG8gYSBob3N0IGFwcCBhbmQvb3JcclxuICogcGxhdGZvcm0gYnJva2VyXHJcbiAqL1xyXG5jbGFzcyBCcmlkZ2VQcm94eSB7XHJcbiAgICAvKipcclxuICAgICAqIGluaXRpYWxpemVOZXN0ZWRBcHBBdXRoQnJpZGdlIC0gSW5pdGlhbGl6ZXMgdGhlIGJyaWRnZSB0byB0aGUgaG9zdCBhcHBcclxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIEluaXRpYWxpemVCcmlkZ2VSZXNwb25zZSBvciByZWplY3RzIHdpdGggYW4gRXJyb3JcclxuICAgICAqIEByZW1hcmtzIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBjcmVhdGUgZmFjdG9yeSBtZXRob2RcclxuICAgICAqIEByZW1hcmtzIElmIHRoZSBicmlkZ2UgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgaW5pdGlhbGl6ZU5lc3RlZEFwcEF1dGhCcmlkZ2UoKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndpbmRvdyBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndpbmRvdy5uZXN0ZWRBcHBBdXRoQnJpZGdlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgd2luZG93Lm5lc3RlZEFwcEF1dGhCcmlkZ2UuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVBheWxvYWQgPSB0eXBlb2YgcmVzcG9uc2UgPT09IFwic3RyaW5nXCIgPyByZXNwb25zZSA6IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUVudmVsb3BlID0gSlNPTi5wYXJzZShyZXNwb25zZVBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJyaWRnZVByb3h5LmJyaWRnZVJlcXVlc3RzLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQucmVxdWVzdElkID09PSByZXNwb25zZUVudmVsb3BlLnJlcXVlc3RJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgQnJpZGdlUHJveHkuYnJpZGdlUmVxdWVzdHMuc3BsaWNlKEJyaWRnZVByb3h5LmJyaWRnZVJlcXVlc3RzLmluZGV4T2YocmVxdWVzdCksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUVudmVsb3BlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHJlc3BvbnNlRW52ZWxvcGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QocmVzcG9uc2VFbnZlbG9wZS5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgYnJpZGdlUmVzcG9uc2UgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gQnJpZGdlUHJveHkuYnVpbGRSZXF1ZXN0KFwiR2V0SW5pdENvbnRleHRcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogbWVzc2FnZS5yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXNzYWdlLm1ldGhvZCxcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdDogcmVqZWN0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIEJyaWRnZVByb3h5LmJyaWRnZVJlcXVlc3RzLnB1c2gocmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gQnJpZGdlUHJveHkudmFsaWRhdGVCcmlkZ2VSZXN1bHRPclRocm93KGJyaWRnZVJlc3BvbnNlLmluaXRDb250ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZ2V0VG9rZW5JbnRlcmFjdGl2ZSAtIEF0dGVtcHRzIHRvIGdldCBhIHRva2VuIGludGVyYWN0aXZlbHkgZnJvbSB0aGUgYnJpZGdlXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBBIHRva2VuIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGF1dGggcmVzdWx0IG9yIHJlamVjdHMgd2l0aCBhIEJyaWRnZUVycm9yXHJcbiAgICAgKi9cclxuICAgIGdldFRva2VuSW50ZXJhY3RpdmUocmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKFwiR2V0VG9rZW5Qb3B1cFwiLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZ2V0VG9rZW5TaWxlbnQgQXR0ZW1wdHMgdG8gZ2V0IGEgdG9rZW4gc2lsZW50bHkgZnJvbSB0aGUgYnJpZGdlXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBBIHRva2VuIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGF1dGggcmVzdWx0IG9yIHJlamVjdHMgd2l0aCBhIEJyaWRnZUVycm9yXHJcbiAgICAgKi9cclxuICAgIGdldFRva2VuU2lsZW50KHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbihcIkdldFRva2VuXCIsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2V0VG9rZW4ocmVxdWVzdFR5cGUsIHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RUeXBlLCB7XHJcbiAgICAgICAgICAgIHRva2VuUGFyYW1zOiByZXF1ZXN0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRva2VuOiBCcmlkZ2VQcm94eS52YWxpZGF0ZUJyaWRnZVJlc3VsdE9yVGhyb3cocmVzdWx0LnRva2VuKSxcclxuICAgICAgICAgICAgYWNjb3VudDogQnJpZGdlUHJveHkudmFsaWRhdGVCcmlkZ2VSZXN1bHRPclRocm93KHJlc3VsdC5hY2NvdW50KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZ2V0SG9zdENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMgPz8gbnVsbDtcclxuICAgIH1cclxuICAgIGdldEFjY291bnRDb250ZXh0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjY291bnRDb250ZXh0ID8gdGhpcy5hY2NvdW50Q29udGV4dCA6IG51bGw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYnVpbGRSZXF1ZXN0KG1ldGhvZCwgcmVxdWVzdFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VUeXBlOiBcIk5lc3RlZEFwcEF1dGhSZXF1ZXN0XCIsXHJcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGNyZWF0ZU5ld0d1aWQoKSxcclxuICAgICAgICAgICAgc2VuZFRpbWU6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgIGNsaWVudExpYnJhcnk6IEJyb3dzZXJDb25zdGFudHMuTVNBTF9TS1UsXHJcbiAgICAgICAgICAgIGNsaWVudExpYnJhcnlWZXJzaW9uOiB2ZXJzaW9uLFxyXG4gICAgICAgICAgICAuLi5yZXF1ZXN0UGFyYW1zLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEEgbWV0aG9kIHVzZWQgdG8gc2VuZCBhIHJlcXVlc3QgdG8gdGhlIGJyaWRnZVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3QgQSB0b2tlbiByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHJlc3BvbnNlIG9mIHByb3ZpZGVkIHR5cGUgb3IgcmVqZWN0cyB3aXRoIGEgQnJpZGdlRXJyb3JcclxuICAgICAqL1xyXG4gICAgc2VuZFJlcXVlc3QobWV0aG9kLCByZXF1ZXN0UGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEJyaWRnZVByb3h5LmJ1aWxkUmVxdWVzdChtZXRob2QsIHJlcXVlc3RQYXJhbXMpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IG1lc3NhZ2UucmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXNzYWdlLm1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXHJcbiAgICAgICAgICAgICAgICByZWplY3Q6IHJlamVjdCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgQnJpZGdlUHJveHkuYnJpZGdlUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcclxuICAgICAgICAgICAgd2luZG93Lm5lc3RlZEFwcEF1dGhCcmlkZ2UucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhpbnB1dCkge1xyXG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJyaWRnZUVycm9yID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBCcmlkZ2VTdGF0dXNDb2RlLk5lc3RlZEFwcEF1dGhVbmF2YWlsYWJsZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhyb3cgYnJpZGdlRXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnB1dDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgQnJpZGdlUHJveHlcclxuICAgICAqIEBwYXJhbSBzZGtOYW1lIFRoZSBuYW1lIG9mIHRoZSBTREsgYmVpbmcgdXNlZCB0byBtYWtlIHJlcXVlc3RzIG9uIGJlaGFsZiBvZiB0aGUgYXBwXHJcbiAgICAgKiBAcGFyYW0gc2RrVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgU0RLIGJlaW5nIHVzZWQgdG8gbWFrZSByZXF1ZXN0cyBvbiBiZWhhbGYgb2YgdGhlIGFwcFxyXG4gICAgICogQHBhcmFtIGNhcGFiaWxpdGllcyBUaGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBicmlkZ2UgLyBTREsgLyBwbGF0Zm9ybSBicm9rZXJcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Ioc2RrTmFtZSwgc2RrVmVyc2lvbiwgYWNjb3VudENvbnRleHQsIGNhcGFiaWxpdGllcykge1xyXG4gICAgICAgIHRoaXMuc2RrTmFtZSA9IHNka05hbWU7XHJcbiAgICAgICAgdGhpcy5zZGtWZXJzaW9uID0gc2RrVmVyc2lvbjtcclxuICAgICAgICB0aGlzLmFjY291bnRDb250ZXh0ID0gYWNjb3VudENvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJQnJpZGdlUHJveHlcclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgQnJpZGdlUHJveHkgaW1wbGVtZW50YXRpb25cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZSgpIHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IEJyaWRnZVByb3h5LmluaXRpYWxpemVOZXN0ZWRBcHBBdXRoQnJpZGdlKCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCcmlkZ2VQcm94eShyZXNwb25zZS5zZGtOYW1lLCByZXNwb25zZS5zZGtWZXJzaW9uLCByZXNwb25zZS5hY2NvdW50Q29udGV4dCwgcmVzcG9uc2UuY2FwYWJpbGl0aWVzKTtcclxuICAgIH1cclxufVxyXG5CcmlkZ2VQcm94eS5icmlkZ2VSZXF1ZXN0cyA9IFtdO1xuXG5leHBvcnQgeyBCcmlkZ2VQcm94eSwgQnJpZGdlUHJveHkgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJpZGdlUHJveHkubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBCYXNlT3BlcmF0aW5nQ29udGV4dCB9IGZyb20gJy4vQmFzZU9wZXJhdGluZ0NvbnRleHQubWpzJztcbmltcG9ydCB7IEJyaWRnZVByb3h5IH0gZnJvbSAnLi4vbmFhL0JyaWRnZVByb3h5Lm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBOZXN0ZWRBcHBPcGVyYXRpbmdDb250ZXh0IGV4dGVuZHMgQmFzZU9wZXJhdGluZ0NvbnRleHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmJyaWRnZVByb3h5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuYWNjb3VudENvbnRleHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG1vZHVsZSBuYW1lLiAgSW50ZW5kZWQgZm9yIHVzZSB3aXRoIGltcG9ydCgpIHRvIGVuYWJsZSBkeW5hbWljIGltcG9ydFxyXG4gICAgICogb2YgdGhlIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGluZyBjb250ZXh0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRNb2R1bGVOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBOZXN0ZWRBcHBPcGVyYXRpbmdDb250ZXh0Lk1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBvcGVyYXRpbmcgY29udGV4dFxyXG4gICAgICogQHJldHVybnMgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIGdldElkKCkge1xyXG4gICAgICAgIHJldHVybiBOZXN0ZWRBcHBPcGVyYXRpbmdDb250ZXh0LklEO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEJyaWRnZVByb3h5XHJcbiAgICAgKiBAcmV0dXJucyBJQnJpZGdlUHJveHkgfCB1bmRlZmluZWRcclxuICAgICAqL1xyXG4gICAgZ2V0QnJpZGdlUHJveHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpZGdlUHJveHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBvcGVyYXRpbmcgY29udGV4dCBpcyBhdmFpbGFibGUuXHJcbiAgICAgKiBDb25maXJtcyB0aGF0IHRoZSBjb2RlIGlzIHJ1bm5pbmcgYSBicm93c2VyIHJhdGhlci4gIFRoaXMgaXMgcmVxdWlyZWQuXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IGluZGljYXRpbmcgd2hldGhlciB0aGlzIG9wZXJhdGluZyBjb250ZXh0IGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Ll9faW5pdGlhbGl6ZU5lc3RlZEFwcEF1dGggPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5fX2luaXRpYWxpemVOZXN0ZWRBcHBBdXRoKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmlkZ2VQcm94eSA9IGF3YWl0IEJyaWRnZVByb3h5LmNyZWF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugd2Ugd2FudCBzaW5nbGUgc2lnbiBvbiB3ZSBleHBlY3QgdGhlIGhvc3QgYXBwIHRvIHByb3ZpZGUgdGhlIGFjY291bnQgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgICogd2l0aCBhIG1pbiBzZXQgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFjY291bnRcclxuICAgICAgICAgICAgICAgICAqIHRoaXMuYWNjb3VudCA9IG5lc3RlZEFwcC5nZXRBY2NvdW50QnlGaWx0ZXIoYnJpZGdlUHJveHkuZ2V0QWNjb3VudENvbnRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudENvbnRleHQgPSBicmlkZ2VQcm94eS5nZXRBY2NvdW50Q29udGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmlkZ2VQcm94eSA9IGJyaWRnZVByb3h5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGUgPSBicmlkZ2VQcm94eSAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvUGlpKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBOZXN0ZWQgQXBwIEF1dGggYnJpZGdlICgke2V4fSlgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgTmVzdGVkIEFwcCBBdXRoIEJyaWRnZSBhdmFpbGFibGU6ICR7dGhpcy5hdmFpbGFibGV9YCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlO1xyXG4gICAgfVxyXG59XHJcbi8qXHJcbiAqIFRPRE86IE9uY2Ugd2UgaGF2ZSBkZXRlcm1pbmUgdGhlIGJ1bmRsaW5nIGNvZGUgcmV0dXJuIGhlcmUgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlXHJcbiAqIGNvbnRhaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG9wZXJhdGluZyBjb250ZXh0XHJcbiAqL1xyXG5OZXN0ZWRBcHBPcGVyYXRpbmdDb250ZXh0Lk1PRFVMRV9OQU1FID0gXCJcIjtcclxuLyoqXHJcbiAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3BlcmF0aW5nIGNvbnRleHRcclxuICovXHJcbk5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQuSUQgPSBcIk5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHRcIjtcblxuZXhwb3J0IHsgTmVzdGVkQXBwT3BlcmF0aW5nQ29udGV4dCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmVzdGVkQXBwT3BlcmF0aW5nQ29udGV4dC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEJhc2VPcGVyYXRpbmdDb250ZXh0IH0gZnJvbSAnLi9CYXNlT3BlcmF0aW5nQ29udGV4dC5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0IGV4dGVuZHMgQmFzZU9wZXJhdGluZ0NvbnRleHQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIG1vZHVsZSBuYW1lLiAgSW50ZW5kZWQgZm9yIHVzZSB3aXRoIGltcG9ydCgpIHRvIGVuYWJsZSBkeW5hbWljIGltcG9ydFxyXG4gICAgICogb2YgdGhlIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGluZyBjb250ZXh0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRNb2R1bGVOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBTdGFuZGFyZE9wZXJhdGluZ0NvbnRleHQuTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIG9wZXJhdGluZyBjb250ZXh0XHJcbiAgICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgZ2V0SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0YW5kYXJkT3BlcmF0aW5nQ29udGV4dC5JRDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG9wZXJhdGluZyBjb250ZXh0IGlzIGF2YWlsYWJsZS5cclxuICAgICAqIENvbmZpcm1zIHRoYXQgdGhlIGNvZGUgaXMgcnVubmluZyBhIGJyb3dzZXIgcmF0aGVyLiAgVGhpcyBpcyByZXF1aXJlZC5cclxuICAgICAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgb3BlcmF0aW5nIGNvbnRleHQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlO1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogTk9URTogVGhlIHN0YW5kYXJkIGNvbnRleHQgaXMgYXZhaWxhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgYSB3aW5kb3cuICBJZi93aGVuIHdlIHNwbGl0IG91dCBXQU0gZnJvbSBCcm93c2VyXHJcbiAgICAgICAgICogV2UgY2FuIG1vdmUgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGluaXRpYWxpemUgbWV0aG9kIHRvIGhlcmUgYW5kIHZlcmlmeSB0aGF0IHRoZSBXQU0gZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgfVxyXG59XHJcbi8qXHJcbiAqIFRPRE86IE9uY2Ugd2UgaGF2ZSBkZXRlcm1pbmUgdGhlIGJ1bmRsaW5nIGNvZGUgcmV0dXJuIGhlcmUgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlXHJcbiAqIGNvbnRhaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG9wZXJhdGluZyBjb250ZXh0XHJcbiAqL1xyXG5TdGFuZGFyZE9wZXJhdGluZ0NvbnRleHQuTU9EVUxFX05BTUUgPSBcIlwiO1xyXG4vKipcclxuICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcGVyYXRpbmcgY29udGV4dFxyXG4gKi9cclxuU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0LklEID0gXCJTdGFuZGFyZE9wZXJhdGluZ0NvbnRleHRcIjtcblxuZXhwb3J0IHsgU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZE9wZXJhdGluZ0NvbnRleHQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgbWlzc2luZ0tpZEVycm9yID0gXCJtaXNzaW5nX2tpZF9lcnJvclwiO1xyXG5jb25zdCBtaXNzaW5nQWxnRXJyb3IgPSBcIm1pc3NpbmdfYWxnX2Vycm9yXCI7XG5cbmV4cG9ydCB7IG1pc3NpbmdBbGdFcnJvciwgbWlzc2luZ0tpZEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb3NlSGVhZGVyRXJyb3JDb2Rlcy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJy4vQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBtaXNzaW5nS2lkRXJyb3IsIG1pc3NpbmdBbGdFcnJvciB9IGZyb20gJy4vSm9zZUhlYWRlckVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEpvc2VIZWFkZXJFcnJvck1lc3NhZ2VzID0ge1xyXG4gICAgW21pc3NpbmdLaWRFcnJvcl06IFwiVGhlIEpPU0UgSGVhZGVyIGZvciB0aGUgcmVxdWVzdGVkIEpXVCwgSldTIG9yIEpXSyBvYmplY3QgcmVxdWlyZXMgYSBrZXlJZCB0byBiZSBjb25maWd1cmVkIGFzIHRoZSAna2lkJyBoZWFkZXIgY2xhaW0uIE5vICdraWQnIHZhbHVlIHdhcyBwcm92aWRlZC5cIixcclxuICAgIFttaXNzaW5nQWxnRXJyb3JdOiBcIlRoZSBKT1NFIEhlYWRlciBmb3IgdGhlIHJlcXVlc3RlZCBKV1QsIEpXUyBvciBKV0sgb2JqZWN0IHJlcXVpcmVzIGFuIGFsZ29yaXRobSB0byBiZSBzcGVjaWZpZWQgYXMgdGhlICdhbGcnIGhlYWRlciBjbGFpbS4gTm8gJ2FsZycgdmFsdWUgd2FzIHByb3ZpZGVkLlwiLFxyXG59O1xyXG4vKipcclxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGNsaWVudCBjb2RlIHJ1bm5pbmcgb24gdGhlIGJyb3dzZXIuXHJcbiAqL1xyXG5jbGFzcyBKb3NlSGVhZGVyRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJKb3NlSGVhZGVyRXJyb3JcIjtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSm9zZUhlYWRlckVycm9yLnByb3RvdHlwZSk7XHJcbiAgICB9XHJcbn1cclxuLyoqIFJldHVybnMgSm9zZUhlYWRlckVycm9yIG9iamVjdCAqL1xyXG5mdW5jdGlvbiBjcmVhdGVKb3NlSGVhZGVyRXJyb3IoY29kZSkge1xyXG4gICAgcmV0dXJuIG5ldyBKb3NlSGVhZGVyRXJyb3IoY29kZSwgSm9zZUhlYWRlckVycm9yTWVzc2FnZXNbY29kZV0pO1xyXG59XG5cbmV4cG9ydCB7IEpvc2VIZWFkZXJFcnJvciwgSm9zZUhlYWRlckVycm9yTWVzc2FnZXMsIGNyZWF0ZUpvc2VIZWFkZXJFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Sm9zZUhlYWRlckVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlSm9zZUhlYWRlckVycm9yIH0gZnJvbSAnLi4vZXJyb3IvSm9zZUhlYWRlckVycm9yLm1qcyc7XG5pbXBvcnQgeyBKc29uV2ViVG9rZW5UeXBlcyB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgbWlzc2luZ0tpZEVycm9yLCBtaXNzaW5nQWxnRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Kb3NlSGVhZGVyRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBKb3NlSGVhZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLnR5cCA9IG9wdGlvbnMudHlwO1xyXG4gICAgICAgIHRoaXMuYWxnID0gb3B0aW9ucy5hbGc7XHJcbiAgICAgICAgdGhpcy5raWQgPSBvcHRpb25zLmtpZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGRzIFNpZ25lZEh0dHBSZXF1ZXN0IGZvcm1hdHRlZCBKT1NFIEhlYWRlciBmcm9tIHRoZVxyXG4gICAgICogSk9TRSBIZWFkZXIgb3B0aW9ucyBwcm92aWRlZCBvciBwcmV2aW91c2x5IHNldCBvbiB0aGUgb2JqZWN0IGFuZCByZXR1cm5zXHJcbiAgICAgKiB0aGUgc3RyaW5naWZpZWQgaGVhZGVyIG9iamVjdC5cclxuICAgICAqIFRocm93cyBpZiBrZXlJZCBvciBhbGdvcml0aG0gYXJlbid0IHByb3ZpZGVkIHNpbmNlIHRoZXkgYXJlIHJlcXVpcmVkIGZvciBBY2Nlc3MgVG9rZW4gQmluZGluZy5cclxuICAgICAqIEBwYXJhbSBzaHJIZWFkZXJPcHRpb25zXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0U2hySGVhZGVyU3RyaW5nKHNockhlYWRlck9wdGlvbnMpIHtcclxuICAgICAgICAvLyBLZXlJRCBpcyByZXF1aXJlZCBvbiB0aGUgU0hSIGhlYWRlclxyXG4gICAgICAgIGlmICghc2hySGVhZGVyT3B0aW9ucy5raWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlSm9zZUhlYWRlckVycm9yKG1pc3NpbmdLaWRFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFsZyBpcyByZXF1aXJlZCBvbiB0aGUgU0hSIGhlYWRlclxyXG4gICAgICAgIGlmICghc2hySGVhZGVyT3B0aW9ucy5hbGcpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlSm9zZUhlYWRlckVycm9yKG1pc3NpbmdBbGdFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNockhlYWRlciA9IG5ldyBKb3NlSGVhZGVyKHtcclxuICAgICAgICAgICAgLy8gQWNjZXNzIFRva2VuIFBvUCBoZWFkZXJzIG11c3QgaGF2ZSB0eXBlIHBvcCwgYnV0IHRoZSB0eXBlIGhlYWRlciBjYW4gYmUgb3ZlcnJpZGVuIGZvciBzcGVjaWFsIGNhc2VzXHJcbiAgICAgICAgICAgIHR5cDogc2hySGVhZGVyT3B0aW9ucy50eXAgfHwgSnNvbldlYlRva2VuVHlwZXMuUG9wLFxyXG4gICAgICAgICAgICBraWQ6IHNockhlYWRlck9wdGlvbnMua2lkLFxyXG4gICAgICAgICAgICBhbGc6IHNockhlYWRlck9wdGlvbnMuYWxnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzaHJIZWFkZXIpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEpvc2VIZWFkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpvc2VIZWFkZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgaW52YWxpZEJhc2U2NFN0cmluZyB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIENsYXNzIHdoaWNoIGV4cG9zZXMgQVBJcyB0byBkZWNvZGUgYmFzZTY0IHN0cmluZ3MgdG8gcGxhaW50ZXh0LiBTZWUgaGVyZSBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlsczpcclxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9CYXNlNjQjdGhlX3VuaWNvZGVfcHJvYmxlbVxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgYSBVUkwtc2FmZSBwbGFpbnRleHQgZGVjb2RlZCBzdHJpbmcgZnJvbSBiNjQgZW5jb2RlZCBpbnB1dC5cclxuICogQHBhcmFtIGlucHV0XHJcbiAqL1xyXG5mdW5jdGlvbiBiYXNlNjREZWNvZGUoaW5wdXQpIHtcclxuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYmFzZTY0RGVjVG9BcnIoaW5wdXQpKTtcclxufVxyXG4vKipcclxuICogRGVjb2RlcyBiYXNlNjQgaW50byBVaW50OEFycmF5XHJcbiAqIEBwYXJhbSBiYXNlNjRTdHJpbmdcclxuICovXHJcbmZ1bmN0aW9uIGJhc2U2NERlY1RvQXJyKGJhc2U2NFN0cmluZykge1xyXG4gICAgbGV0IGVuY29kZWRTdHJpbmcgPSBiYXNlNjRTdHJpbmcucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XHJcbiAgICBzd2l0Y2ggKGVuY29kZWRTdHJpbmcubGVuZ3RoICUgNCkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBlbmNvZGVkU3RyaW5nICs9IFwiPT1cIjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICBlbmNvZGVkU3RyaW5nICs9IFwiPVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGludmFsaWRCYXNlNjRTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYmluU3RyaW5nID0gYXRvYihlbmNvZGVkU3RyaW5nKTtcclxuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluU3RyaW5nLCAobSkgPT4gbS5jb2RlUG9pbnRBdCgwKSB8fCAwKTtcclxufVxuXG5leHBvcnQgeyBiYXNlNjREZWNvZGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2U2NERlY29kZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBEQl9OQU1FLCBEQl9WRVJTSU9OLCBEQl9UQUJMRV9OQU1FIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgZGF0YWJhc2VVbmF2YWlsYWJsZSwgZGF0YWJhc2VOb3RPcGVuIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogU3RvcmFnZSB3cmFwcGVyIGZvciBJbmRleGVkREIgc3RvcmFnZSBpbiBicm93c2VyczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUElcclxuICovXHJcbmNsYXNzIERhdGFiYXNlU3RvcmFnZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRiTmFtZSA9IERCX05BTUU7XHJcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gREJfVkVSU0lPTjtcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IERCX1RBQkxFX05BTUU7XHJcbiAgICAgICAgdGhpcy5kYk9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgSW5kZXhlZERCIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBvcGVuKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wZW5EQiA9IHdpbmRvdy5pbmRleGVkREIub3Blbih0aGlzLmRiTmFtZSwgdGhpcy52ZXJzaW9uKTtcclxuICAgICAgICAgICAgb3BlbkRCLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGdyYWRlbmVlZGVkXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGU7XHJcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9wZW5EQi5hZGRFdmVudExpc3RlbmVyKFwic3VjY2Vzc1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRiT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvcGVuREIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsICgpID0+IHJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKGRhdGFiYXNlVW5hdmFpbGFibGUpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB0byBJbmRleGVkREIgZGF0YWJhc2Ugd2hlbiBhbGwgcGVuZGluZyB0cmFuc2FjdGlvbnNcclxuICAgICAqIGNvbXBsZXRlLlxyXG4gICAgICovXHJcbiAgICBjbG9zZUNvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgZGIgPSB0aGlzLmRiO1xyXG4gICAgICAgIGlmIChkYiAmJiB0aGlzLmRiT3Blbikge1xyXG4gICAgICAgICAgICBkYi5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmRiT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3BlbnMgZGF0YWJhc2UgaWYgaXQncyBub3QgYWxyZWFkeSBvcGVuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHZhbGlkYXRlRGJJc09wZW4oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRiT3Blbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgaXRlbSBmcm9tIEluZGV4ZWREQiBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0SXRlbShrZXkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZW91dHM/XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKGRhdGFiYXNlTm90T3BlbikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCBcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgZGJHZXQgPSBvYmplY3RTdG9yZS5nZXQoa2V5KTtcclxuICAgICAgICAgICAgZGJHZXQuYWRkRXZlbnRMaXN0ZW5lcihcInN1Y2Nlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGJHZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBpdGVtIHRvIEluZGV4ZWREQiB1bmRlciBnaXZlbiBrZXlcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqIEBwYXJhbSBwYXlsb2FkXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNldEl0ZW0oa2V5LCBwYXlsb2FkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gVE9ETzogQWRkIHRpbWVvdXRzP1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoY3JlYXRlQnJvd3NlckF1dGhFcnJvcihkYXRhYmFzZU5vdE9wZW4pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGIudHJhbnNhY3Rpb24oW3RoaXMudGFibGVOYW1lXSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50YWJsZU5hbWUpO1xyXG4gICAgICAgICAgICBjb25zdCBkYlB1dCA9IG9iamVjdFN0b3JlLnB1dChwYXlsb2FkLCBrZXkpO1xyXG4gICAgICAgICAgICBkYlB1dC5hZGRFdmVudExpc3RlbmVyKFwic3VjY2Vzc1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGJQdXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBpdGVtIGZyb20gSW5kZXhlZERCIHVuZGVyIGdpdmVuIGtleVxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBhc3luYyByZW1vdmVJdGVtKGtleSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVEYklzT3BlbigpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKGRhdGFiYXNlTm90T3BlbikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCBcInJlYWR3cml0ZVwiKTtcclxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRiRGVsZXRlID0gb2JqZWN0U3RvcmUuZGVsZXRlKGtleSk7XHJcbiAgICAgICAgICAgIGRiRGVsZXRlLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWNjZXNzXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBkYkRlbGV0ZS5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYWxsIHRoZSBrZXlzIGZyb20gdGhlIHN0b3JhZ2Ugb2JqZWN0IGFzIGFuIGl0ZXJhYmxlIGFycmF5IG9mIHN0cmluZ3MuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEtleXMoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoZGF0YWJhc2VOb3RPcGVuKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFt0aGlzLnRhYmxlTmFtZV0sIFwicmVhZG9ubHlcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50YWJsZU5hbWUpO1xyXG4gICAgICAgICAgICBjb25zdCBkYkdldEtleXMgPSBvYmplY3RTdG9yZS5nZXRBbGxLZXlzKCk7XHJcbiAgICAgICAgICAgIGRiR2V0S2V5cy5hZGRFdmVudExpc3RlbmVyKFwic3VjY2Vzc1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBkYkdldEtleXMuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIGFuIG9iamVjdCB1bmRlciB0aGUgc2VhcmNoIGtleSBpbiB0aGUgb2JqZWN0IHN0b3JlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNvbnRhaW5zS2V5KGtleSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVEYklzT3BlbigpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKGRhdGFiYXNlTm90T3BlbikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCBcInJlYWRvbmx5XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgZGJDb250YWluc0tleSA9IG9iamVjdFN0b3JlLmNvdW50KGtleSk7XHJcbiAgICAgICAgICAgIGRiQ29udGFpbnNLZXkuYWRkRXZlbnRMaXN0ZW5lcihcInN1Y2Nlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQgPT09IDEpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGJDb250YWluc0tleS5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSBNU0FMIGRhdGFiYXNlLiBUaGUgZGF0YWJhc2UgaXMgZGVsZXRlZCByYXRoZXIgdGhhbiBjbGVhcmVkIHRvIG1ha2UgaXQgcG9zc2libGVcclxuICAgICAqIGZvciBjbGllbnQgYXBwbGljYXRpb25zIHRvIGRvd25ncmFkZSB0byBhIHByZXZpb3VzIE1TQUwgdmVyc2lvbiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGZvcndhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXNcclxuICAgICAqIHdpdGggSW5kZXhlZERCIGRhdGFiYXNlIHZlcnNpb25zLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZWxldGVEYXRhYmFzZSgpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiBkYXRhYmFzZSBiZWluZyBkZWxldGVkIGV4aXN0c1xyXG4gICAgICAgIGlmICh0aGlzLmRiICYmIHRoaXMuZGJPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbGV0ZURiUmVxdWVzdCA9IHdpbmRvdy5pbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfTkFNRSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QoZmFsc2UpLCAyMDApOyAvLyBSZWplY3QgaWYgZXZlbnRzIGFyZW4ndCByYWlzZWQgd2l0aGluIDIwMG1zXHJcbiAgICAgICAgICAgIGRlbGV0ZURiUmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKFwic3VjY2Vzc1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBkZWxldGVEYlJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcihcImJsb2NrZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVsZXRlRGJSZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IERhdGFiYXNlU3RvcmFnZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YWJhc2VTdG9yYWdlLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIE1lbW9yeVN0b3JhZ2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGdldEl0ZW0oa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGtleSkgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcclxuICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5cygpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUtleXMgPSBbXTtcclxuICAgICAgICB0aGlzLmNhY2hlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY2FjaGVLZXlzLnB1c2goa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gY2FjaGVLZXlzO1xyXG4gICAgfVxyXG4gICAgY29udGFpbnNLZXkoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGtleSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTWVtb3J5U3RvcmFnZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVtb3J5U3RvcmFnZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBEYXRhYmFzZVN0b3JhZ2UgfSBmcm9tICcuL0RhdGFiYXNlU3RvcmFnZS5tanMnO1xuaW1wb3J0IHsgTWVtb3J5U3RvcmFnZSB9IGZyb20gJy4vTWVtb3J5U3RvcmFnZS5tanMnO1xuaW1wb3J0IHsgZGF0YWJhc2VVbmF2YWlsYWJsZSB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgYWxsb3dzIE1TQUwgdG8gc3RvcmUgYXJ0aWZhY3RzIGFzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBEYXRhYmFzZVN0b3JhZ2UgSW5kZXhlZERCIHdyYXBwZXIsXHJcbiAqIGJhY2tlZCB1cCB3aXRoIHRoZSBtb3JlIHZvbGF0aWxlIE1lbW9yeVN0b3JhZ2Ugb2JqZWN0IGZvciBjYXNlcyBpbiB3aGljaCBJbmRleGVkREIgbWF5IGJlIHVuYXZhaWxhYmxlLlxyXG4gKi9cclxuY2xhc3MgQXN5bmNNZW1vcnlTdG9yYWdlIHtcclxuICAgIGNvbnN0cnVjdG9yKGxvZ2dlcikge1xyXG4gICAgICAgIHRoaXMuaW5NZW1vcnlDYWNoZSA9IG5ldyBNZW1vcnlTdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5pbmRleGVkREJDYWNoZSA9IG5ldyBEYXRhYmFzZVN0b3JhZ2UoKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICAgIH1cclxuICAgIGhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2VyQXV0aEVycm9yICYmXHJcbiAgICAgICAgICAgIGVycm9yLmVycm9yQ29kZSA9PT0gZGF0YWJhc2VVbmF2YWlsYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIkNvdWxkIG5vdCBhY2Nlc3MgcGVyc2lzdGVudCBzdG9yYWdlLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYnJvd3NlciBwcml2YWN5IGZlYXR1cmVzIHdoaWNoIGJsb2NrIHBlcnNpc3RlbnQgc3RvcmFnZSBpbiB0aGlyZC1wYXJ0eSBjb250ZXh0cy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaXRlbSBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LiBUcmllcyBpbi1tZW1vcnkgY2FjaGUgZmlyc3QsIHRoZW4gaW4gdGhlIGFzeW5jaHJvbm91c1xyXG4gICAgICogc3RvcmFnZSBvYmplY3QgaWYgaXRlbSBpc24ndCBmb3VuZCBpbi1tZW1vcnkuXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEl0ZW0oa2V5KSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaW5NZW1vcnlDYWNoZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiUXVlcmllZCBpdGVtIG5vdCBmb3VuZCBpbiBpbi1tZW1vcnkgY2FjaGUsIG5vdyBxdWVyeWluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGl0ZW0gaW4gdGhlIGluLW1lbW9yeSBjYWNoZSBhbmQgdGhlbiB0cmllcyB0byBzZXQgaXQgaW4gdGhlIGFzeW5jaHJvbm91c1xyXG4gICAgICogc3RvcmFnZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuaW5NZW1vcnlDYWNoZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgaXRlbSBtYXRjaGluZyB0aGUga2V5IGZyb20gdGhlIGluLW1lbW9yeSBjYWNoZSwgdGhlbiB0cmllcyB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXN5bmNocm9ub3VzIHN0b3JhZ2Ugb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBhc3luYyByZW1vdmVJdGVtKGtleSkge1xyXG4gICAgICAgIHRoaXMuaW5NZW1vcnlDYWNoZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCBhbGwgdGhlIGtleXMgZnJvbSB0aGUgaW4tbWVtb3J5IGNhY2hlIGFzIGFuIGl0ZXJhYmxlIGFycmF5IG9mIHN0cmluZ3MuIElmIG5vIGtleXMgYXJlIGZvdW5kLCBxdWVyeSB0aGUga2V5cyBpbiB0aGVcclxuICAgICAqIGFzeW5jaHJvbm91cyBzdG9yYWdlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0S2V5cygpIHtcclxuICAgICAgICBjb25zdCBjYWNoZUtleXMgPSB0aGlzLmluTWVtb3J5Q2FjaGUuZ2V0S2V5cygpO1xyXG4gICAgICAgIGlmIChjYWNoZUtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiSW4tbWVtb3J5IGNhY2hlIGlzIGVtcHR5LCBub3cgcXVlcnlpbmcgcGVyc2lzdGVudCBzdG9yYWdlLlwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmluZGV4ZWREQkNhY2hlLmdldEtleXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYWNoZUtleXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIHByZXNlbnQgaW4gdGhlIGNhY2hlLlxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBhc3luYyBjb250YWluc0tleShrZXkpIHtcclxuICAgICAgICBjb25zdCBjb250YWluc0tleSA9IHRoaXMuaW5NZW1vcnlDYWNoZS5jb250YWluc0tleShrZXkpO1xyXG4gICAgICAgIGlmICghY29udGFpbnNLZXkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJLZXkgbm90IGZvdW5kIGluIGluLW1lbW9yeSBjYWNoZSwgbm93IHF1ZXJ5aW5nIHBlcnNpc3RlbnQgc3RvcmFnZS5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5jb250YWluc0tleShrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zS2V5O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgaW4tbWVtb3J5IE1hcFxyXG4gICAgICovXHJcbiAgICBjbGVhckluTWVtb3J5KCkge1xyXG4gICAgICAgIC8vIEluTWVtb3J5IGNhY2hlIGlzIGEgTWFwIGluc3RhbmNlLCBjbGVhciBpcyBzdHJhaWdodGZvcndhcmRcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBEZWxldGluZyBpbi1tZW1vcnkga2V5c3RvcmVgKTtcclxuICAgICAgICB0aGlzLmluTWVtb3J5Q2FjaGUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBJbi1tZW1vcnkga2V5c3RvcmUgZGVsZXRlZGApO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmllcyB0byBkZWxldGUgdGhlIEluZGV4ZWREQiBkYXRhYmFzZVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY2xlYXJQZXJzaXN0ZW50KCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJEZWxldGluZyBwZXJzaXN0ZW50IGtleXN0b3JlXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkYkRlbGV0ZWQgPSBhd2FpdCB0aGlzLmluZGV4ZWREQkNhY2hlLmRlbGV0ZURhdGFiYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChkYkRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJQZXJzaXN0ZW50IGtleXN0b3JlIGRlbGV0ZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRiRGVsZXRlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEFzeW5jTWVtb3J5U3RvcmFnZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXN5bmNNZW1vcnlTdG9yYWdlLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMsIEpvc2VIZWFkZXIgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBiYXNlNjRFbmNvZGUsIHVybEVuY29kZSwgdXJsRW5jb2RlQXJyIH0gZnJvbSAnLi4vZW5jb2RlL0Jhc2U2NEVuY29kZS5tanMnO1xuaW1wb3J0IHsgYmFzZTY0RGVjb2RlIH0gZnJvbSAnLi4vZW5jb2RlL0Jhc2U2NERlY29kZS5tanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVDcnlwdG9BdmFpbGFibGUsIGNyZWF0ZU5ld0d1aWQsIGdlbmVyYXRlS2V5UGFpciwgZXhwb3J0SndrLCBpbXBvcnRKd2ssIHNpZ24sIGhhc2hTdHJpbmcgfSBmcm9tICcuL0Jyb3dzZXJDcnlwdG8ubWpzJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBBc3luY01lbW9yeVN0b3JhZ2UgfSBmcm9tICcuLi9jYWNoZS9Bc3luY01lbW9yeVN0b3JhZ2UubWpzJztcbmltcG9ydCB7IGNyeXB0b0tleU5vdEZvdW5kIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIE1TQUwncyBjcnlwdG8gaW50ZXJmYWNlLCB3aGljaCBhbGxvd3MgaXQgdG8gcGVyZm9ybSBiYXNlNjQgZW5jb2RpbmcgYW5kIGRlY29kaW5nLCBnZW5lcmF0aW5nIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSBHVUlEcyBhbmRcclxuICogaW1wbGVtZW50aW5nIFByb29mIEtleSBmb3IgQ29kZSBFeGNoYW5nZSBzcGVjcyBmb3IgdGhlIE9BdXRoIEF1dGhvcml6YXRpb24gQ29kZSBGbG93IHVzaW5nIFBLQ0UgKHJmYyBoZXJlOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzYzNikuXHJcbiAqL1xyXG5jbGFzcyBDcnlwdG9PcHMge1xyXG4gICAgY29uc3RydWN0b3IobG9nZ2VyLCBwZXJmb3JtYW5jZUNsaWVudCwgc2tpcFZhbGlkYXRlU3VidGxlQ3J5cHRvKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgLy8gQnJvd3NlciBjcnlwdG8gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIGZpcnN0IGJlZm9yZSBhbnkgb3RoZXIgY2xhc3NlcyBjYW4gYmUgc2V0LlxyXG4gICAgICAgIHZhbGlkYXRlQ3J5cHRvQXZhaWxhYmxlKHNraXBWYWxpZGF0ZVN1YnRsZUNyeXB0byA/PyBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBBc3luY01lbW9yeVN0b3JhZ2UodGhpcy5sb2dnZXIpO1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQgPSBwZXJmb3JtYW5jZUNsaWVudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyByYW5kb20gR1VJRCAtIHVzZWQgdG8gcG9wdWxhdGUgc3RhdGUgYW5kIG5vbmNlLlxyXG4gICAgICogQHJldHVybnMgc3RyaW5nIChHVUlEKVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVOZXdHdWlkKCkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVOZXdHdWlkKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIHRvIGJhc2U2NC5cclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBiYXNlNjRFbmNvZGUoaW5wdXQpIHtcclxuICAgICAgICByZXR1cm4gYmFzZTY0RW5jb2RlKGlucHV0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVjb2RlcyBpbnB1dCBzdHJpbmcgZnJvbSBiYXNlNjQuXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqL1xyXG4gICAgYmFzZTY0RGVjb2RlKGlucHV0KSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NERlY29kZShpbnB1dCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEVuY29kZXMgaW5wdXQgc3RyaW5nIHRvIGJhc2U2NCBVUkwgc2FmZSBzdHJpbmcuXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqL1xyXG4gICAgYmFzZTY0VXJsRW5jb2RlKGlucHV0KSB7XHJcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShpbnB1dCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0cmluZ2lmaWVzIGFuZCBiYXNlNjRVcmwgZW5jb2RlcyBpbnB1dCBwdWJsaWMga2V5XHJcbiAgICAgKiBAcGFyYW0gaW5wdXRLaWRcclxuICAgICAqIEByZXR1cm5zIEJhc2U2NFVybCBlbmNvZGVkIHB1YmxpYyBrZXlcclxuICAgICAqL1xyXG4gICAgZW5jb2RlS2lkKGlucHV0S2lkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KHsga2lkOiBpbnB1dEtpZCB9KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhIGtleXBhaXIsIHN0b3JlcyBpdCBhbmQgcmV0dXJucyBhIHRodW1icHJpbnRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFB1YmxpY0tleVRodW1icHJpbnQocmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleVRodW1iTWVhc3VyZW1lbnQgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkNyeXB0b09wdHNHZXRQdWJsaWNLZXlUaHVtYnByaW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIC8vIEdlbmVyYXRlIEtleXBhaXJcclxuICAgICAgICBjb25zdCBrZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVLZXlQYWlyKENyeXB0b09wcy5FWFRSQUNUQUJMRSwgQ3J5cHRvT3BzLlBPUF9LRVlfVVNBR0VTKTtcclxuICAgICAgICAvLyBHZW5lcmF0ZSBUaHVtYnByaW50IGZvciBQdWJsaWMgS2V5XHJcbiAgICAgICAgY29uc3QgcHVibGljS2V5SndrID0gYXdhaXQgZXhwb3J0SndrKGtleVBhaXIucHVibGljS2V5KTtcclxuICAgICAgICBjb25zdCBwdWJLZXlUaHVtcHJpbnRPYmogPSB7XHJcbiAgICAgICAgICAgIGU6IHB1YmxpY0tleUp3ay5lLFxyXG4gICAgICAgICAgICBrdHk6IHB1YmxpY0tleUp3ay5rdHksXHJcbiAgICAgICAgICAgIG46IHB1YmxpY0tleUp3ay5uLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcHVibGljSndrU3RyaW5nID0gZ2V0U29ydGVkT2JqZWN0U3RyaW5nKHB1YktleVRodW1wcmludE9iaik7XHJcbiAgICAgICAgY29uc3QgcHVibGljSndrSGFzaCA9IGF3YWl0IHRoaXMuaGFzaFN0cmluZyhwdWJsaWNKd2tTdHJpbmcpO1xyXG4gICAgICAgIC8vIEdlbmVyYXRlIFRodW1icHJpbnQgZm9yIFByaXZhdGUgS2V5XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleUp3ayA9IGF3YWl0IGV4cG9ydEp3ayhrZXlQYWlyLnByaXZhdGVLZXkpO1xyXG4gICAgICAgIC8vIFJlLWltcG9ydCBwcml2YXRlIGtleSB0byBtYWtlIGl0IHVuZXh0cmFjdGFibGVcclxuICAgICAgICBjb25zdCB1bmV4dHJhY3RhYmxlUHJpdmF0ZUtleSA9IGF3YWl0IGltcG9ydEp3ayhwcml2YXRlS2V5SndrLCBmYWxzZSwgW1wic2lnblwiXSk7XHJcbiAgICAgICAgLy8gU3RvcmUgS2V5cGFpciBkYXRhIGluIGtleXN0b3JlXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZS5zZXRJdGVtKHB1YmxpY0p3a0hhc2gsIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogdW5leHRyYWN0YWJsZVByaXZhdGVLZXksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleToga2V5UGFpci5wdWJsaWNLZXksXHJcbiAgICAgICAgICAgIHJlcXVlc3RNZXRob2Q6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLFxyXG4gICAgICAgICAgICByZXF1ZXN0VXJpOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdFVyaSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocHVibGljS2V5VGh1bWJNZWFzdXJlbWVudCkge1xyXG4gICAgICAgICAgICBwdWJsaWNLZXlUaHVtYk1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHB1YmxpY0p3a0hhc2g7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgY3J5cHRvZ3JhcGhpYyBrZXlwYWlyIGZyb20ga2V5IHN0b3JlIG1hdGNoaW5nIHRoZSBrZXlJZCBwYXNzZWQgaW5cclxuICAgICAqIEBwYXJhbSBraWRcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVtb3ZlVG9rZW5CaW5kaW5nS2V5KGtpZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2FjaGUucmVtb3ZlSXRlbShraWQpO1xyXG4gICAgICAgIGNvbnN0IGtleUZvdW5kID0gYXdhaXQgdGhpcy5jYWNoZS5jb250YWluc0tleShraWQpO1xyXG4gICAgICAgIHJldHVybiAha2V5Rm91bmQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGNyeXB0b2dyYXBoaWMga2V5cyBmcm9tIEluZGV4ZWREQiBzdG9yYWdlXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNsZWFyS2V5c3RvcmUoKSB7XHJcbiAgICAgICAgLy8gRGVsZXRlIGluLW1lbW9yeSBrZXlzdG9yZXNcclxuICAgICAgICB0aGlzLmNhY2hlLmNsZWFySW5NZW1vcnkoKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGVyZSBpcyBvbmx5IG9uZSBkYXRhYmFzZSwgc28gY2FsbGluZyBjbGVhclBlcnNpc3RlbnQgb24gYXN5bW1ldHJpYyBrZXlzdG9yZSB0YWtlcyBjYXJlIG9mXHJcbiAgICAgICAgICogZXZlcnkgcGVyc2lzdGVudCBrZXlzdG9yZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGUuY2xlYXJQZXJzaXN0ZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQ2xlYXJpbmcga2V5c3RvcmUgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJDbGVhcmluZyBrZXlzdG9yZSBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNpZ25zIHRoZSBnaXZlbiBvYmplY3QgYXMgYSBqd3QgcGF5bG9hZCB3aXRoIHByaXZhdGUga2V5IHJldHJpZXZlZCBieSBnaXZlbiBraWQuXHJcbiAgICAgKiBAcGFyYW0gcGF5bG9hZFxyXG4gICAgICogQHBhcmFtIGtpZFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzaWduSnd0KHBheWxvYWQsIGtpZCwgc2hyT3B0aW9ucywgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIGNvbnN0IHNpZ25Kd3RNZWFzdXJlbWVudCA9IHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQ3J5cHRvT3B0c1NpZ25Kd3QsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEtleVBhaXIgPSBhd2FpdCB0aGlzLmNhY2hlLmdldEl0ZW0oa2lkKTtcclxuICAgICAgICBpZiAoIWNhY2hlZEtleVBhaXIpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihjcnlwdG9LZXlOb3RGb3VuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCBwdWJsaWMga2V5IGFzIEpXS1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleUp3ayA9IGF3YWl0IGV4cG9ydEp3ayhjYWNoZWRLZXlQYWlyLnB1YmxpY0tleSk7XHJcbiAgICAgICAgY29uc3QgcHVibGljS2V5SndrU3RyaW5nID0gZ2V0U29ydGVkT2JqZWN0U3RyaW5nKHB1YmxpY0tleUp3ayk7XHJcbiAgICAgICAgLy8gQmFzZTY0VVJMIGVuY29kZSBwdWJsaWMga2V5IHRodW1icHJpbnQgd2l0aCBrZXlJZCBvbmx5OiBCQVNFNjRVUkwoeyBraWQ6IFwiRlVMTF9QVUJMSUNfS0VZX0hBU0hcIiB9KVxyXG4gICAgICAgIGNvbnN0IGVuY29kZWRLZXlJZFRodW1icHJpbnQgPSB1cmxFbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyBraWQ6IGtpZCB9KSk7XHJcbiAgICAgICAgLy8gR2VuZXJhdGUgaGVhZGVyXHJcbiAgICAgICAgY29uc3Qgc2hySGVhZGVyID0gSm9zZUhlYWRlci5nZXRTaHJIZWFkZXJTdHJpbmcoe1xyXG4gICAgICAgICAgICAuLi5zaHJPcHRpb25zPy5oZWFkZXIsXHJcbiAgICAgICAgICAgIGFsZzogcHVibGljS2V5SndrLmFsZyxcclxuICAgICAgICAgICAga2lkOiBlbmNvZGVkS2V5SWRUaHVtYnByaW50LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGVuY29kZWRTaHJIZWFkZXIgPSB1cmxFbmNvZGUoc2hySGVhZGVyKTtcclxuICAgICAgICAvLyBHZW5lcmF0ZSBwYXlsb2FkXHJcbiAgICAgICAgcGF5bG9hZC5jbmYgPSB7XHJcbiAgICAgICAgICAgIGp3azogSlNPTi5wYXJzZShwdWJsaWNLZXlKd2tTdHJpbmcpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZW5jb2RlZFBheWxvYWQgPSB1cmxFbmNvZGUoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xyXG4gICAgICAgIC8vIEZvcm0gdG9rZW4gc3RyaW5nXHJcbiAgICAgICAgY29uc3QgdG9rZW5TdHJpbmcgPSBgJHtlbmNvZGVkU2hySGVhZGVyfS4ke2VuY29kZWRQYXlsb2FkfWA7XHJcbiAgICAgICAgLy8gU2lnbiB0b2tlblxyXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcclxuICAgICAgICBjb25zdCB0b2tlbkJ1ZmZlciA9IGVuY29kZXIuZW5jb2RlKHRva2VuU3RyaW5nKTtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCBzaWduKGNhY2hlZEtleVBhaXIucHJpdmF0ZUtleSwgdG9rZW5CdWZmZXIpO1xyXG4gICAgICAgIGNvbnN0IGVuY29kZWRTaWduYXR1cmUgPSB1cmxFbmNvZGVBcnIobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlQnVmZmVyKSk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmVkSnd0ID0gYCR7dG9rZW5TdHJpbmd9LiR7ZW5jb2RlZFNpZ25hdHVyZX1gO1xyXG4gICAgICAgIGlmIChzaWduSnd0TWVhc3VyZW1lbnQpIHtcclxuICAgICAgICAgICAgc2lnbkp3dE1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNpZ25lZEp3dDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgU0hBLTI1NiBoYXNoIG9mIGFuIGlucHV0IHN0cmluZ1xyXG4gICAgICogQHBhcmFtIHBsYWluVGV4dFxyXG4gICAgICovXHJcbiAgICBhc3luYyBoYXNoU3RyaW5nKHBsYWluVGV4dCkge1xyXG4gICAgICAgIHJldHVybiBoYXNoU3RyaW5nKHBsYWluVGV4dCk7XHJcbiAgICB9XHJcbn1cclxuQ3J5cHRvT3BzLlBPUF9LRVlfVVNBR0VTID0gW1wic2lnblwiLCBcInZlcmlmeVwiXTtcclxuQ3J5cHRvT3BzLkVYVFJBQ1RBQkxFID0gdHJ1ZTtcclxuZnVuY3Rpb24gZ2V0U29ydGVkT2JqZWN0U3RyaW5nKG9iaikge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgT2JqZWN0LmtleXMob2JqKS5zb3J0KCkpO1xyXG59XG5cbmV4cG9ydCB7IENyeXB0b09wcyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3J5cHRvT3BzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGlzT3BlbklkQ29uZmlnUmVzcG9uc2UocmVzcG9uc2UpIHtcclxuICAgIHJldHVybiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJhdXRob3JpemF0aW9uX2VuZHBvaW50XCIpICYmXHJcbiAgICAgICAgcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJ0b2tlbl9lbmRwb2ludFwiKSAmJlxyXG4gICAgICAgIHJlc3BvbnNlLmhhc093blByb3BlcnR5KFwiaXNzdWVyXCIpICYmXHJcbiAgICAgICAgcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJqd2tzX3VyaVwiKSk7XHJcbn1cblxuZXhwb3J0IHsgaXNPcGVuSWRDb25maWdSZXNwb25zZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3BlbklkQ29uZmlnUmVzcG9uc2UubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2UocmVzcG9uc2UpIHtcclxuICAgIHJldHVybiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJ0ZW5hbnRfZGlzY292ZXJ5X2VuZHBvaW50XCIpICYmXHJcbiAgICAgICAgcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJtZXRhZGF0YVwiKSk7XHJcbn1cblxuZXhwb3J0IHsgaXNDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNsb3VkSW5zdGFuY2VEaXNjb3ZlcnlSZXNwb25zZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlKHJlc3BvbnNlKSB7XHJcbiAgICByZXR1cm4gKHJlc3BvbnNlLmhhc093blByb3BlcnR5KFwiZXJyb3JcIikgJiZcclxuICAgICAgICByZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShcImVycm9yX2Rlc2NyaXB0aW9uXCIpKTtcclxufVxuXG5leHBvcnQgeyBpc0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IENvbnN0YW50cywgUmVzcG9uc2VDb2RlcywgUmVnaW9uRGlzY292ZXJ5U291cmNlcyB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VFdmVudC5tanMnO1xuaW1wb3J0IHsgaW52b2tlQXN5bmMgfSBmcm9tICcuLi91dGlscy9GdW5jdGlvbldyYXBwZXJzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBSZWdpb25EaXNjb3Zlcnkge1xyXG4gICAgY29uc3RydWN0b3IobmV0d29ya0ludGVyZmFjZSwgbG9nZ2VyLCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubmV0d29ya0ludGVyZmFjZSA9IG5ldHdvcmtJbnRlcmZhY2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVjdCB0aGUgcmVnaW9uIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxzdHJpbmcgfCBudWxsPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZXRlY3RSZWdpb24oZW52aXJvbm1lbnRSZWdpb24sIHJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5SZWdpb25EaXNjb3ZlcnlEZXRlY3RSZWdpb24sIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhdXRvIGRldGVjdGVkIHJlZ2lvbiB3aXRoIHRoZSByZWdpb24gZnJvbSB0aGUgZW52cmlvbm1lbnRcclxuICAgICAgICBsZXQgYXV0b2RldGVjdGVkUmVnaW9uTmFtZSA9IGVudmlyb25tZW50UmVnaW9uO1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGEgcmVnaW9uIHdhcyBkZXRlY3RlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgaWYgbm90LCBhdHRlbXB0IHRvIGdldCB0aGUgcmVnaW9uIGZyb20gSU1EU1xyXG4gICAgICAgIGlmICghYXV0b2RldGVjdGVkUmVnaW9uTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gUmVnaW9uRGlzY292ZXJ5LklNRFNfT1BUSU9OUztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSU1EU1ZlcnNpb25SZXNwb25zZSA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuZ2V0UmVnaW9uRnJvbUlNRFMuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuUmVnaW9uRGlzY292ZXJ5R2V0UmVnaW9uRnJvbUlNRFMsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKENvbnN0YW50cy5JTURTX1ZFUlNJT04sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsSU1EU1ZlcnNpb25SZXNwb25zZS5zdGF0dXMgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VDb2Rlcy5odHRwU3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9kZXRlY3RlZFJlZ2lvbk5hbWUgPSBsb2NhbElNRFNWZXJzaW9uUmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICByZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fc291cmNlID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uRGlzY292ZXJ5U291cmNlcy5JTURTO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIHVzaW5nIHRoZSBsb2NhbCBJTURTIHZlcnNpb24gZmFpbGVkLCB0cnkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBJTURTIGFuZCByZXRyeS5cclxuICAgICAgICAgICAgICAgIGlmIChsb2NhbElNRFNWZXJzaW9uUmVzcG9uc2Uuc3RhdHVzID09PVxyXG4gICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlQ29kZXMuaHR0cEJhZFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SU1EU1ZlcnNpb24gPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmdldEN1cnJlbnRWZXJzaW9uLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRJTURTVmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fc291cmNlID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbkRpc2NvdmVyeVNvdXJjZXMuRkFJTEVEX0FVVE9fREVURUNUSU9OO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudElNRFNWZXJzaW9uUmVzcG9uc2UgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmdldFJlZ2lvbkZyb21JTURTLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlJlZ2lvbkRpc2NvdmVyeUdldFJlZ2lvbkZyb21JTURTLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShjdXJyZW50SU1EU1ZlcnNpb24sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SU1EU1ZlcnNpb25SZXNwb25zZS5zdGF0dXMgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlQ29kZXMuaHR0cFN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RldGVjdGVkUmVnaW9uTmFtZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SU1EU1ZlcnNpb25SZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fc291cmNlID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbkRpc2NvdmVyeVNvdXJjZXMuSU1EUztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl9zb3VyY2UgPVxyXG4gICAgICAgICAgICAgICAgICAgIFJlZ2lvbkRpc2NvdmVyeVNvdXJjZXMuRkFJTEVEX0FVVE9fREVURUNUSU9OO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl9zb3VyY2UgPVxyXG4gICAgICAgICAgICAgICAgUmVnaW9uRGlzY292ZXJ5U291cmNlcy5FTlZJUk9OTUVOVF9WQVJJQUJMRTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm8gcmVnaW9uIHdhcyBhdXRvIGRldGVjdGVkIGZyb20gdGhlIGVudmlyb25tZW50IG9yIGZyb20gdGhlIElNRFMgZW5kcG9pbnQsIG1hcmsgdGhlIGF0dGVtcHQgYXMgYSBGQUlMRURfQVVUT19ERVRFQ1RJT05cclxuICAgICAgICBpZiAoIWF1dG9kZXRlY3RlZFJlZ2lvbk5hbWUpIHtcclxuICAgICAgICAgICAgcmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX3NvdXJjZSA9XHJcbiAgICAgICAgICAgICAgICBSZWdpb25EaXNjb3ZlcnlTb3VyY2VzLkZBSUxFRF9BVVRPX0RFVEVDVElPTjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF1dG9kZXRlY3RlZFJlZ2lvbk5hbWUgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSB0aGUgY2FsbCB0byB0aGUgSU1EUyBlbmRwb2ludFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbWRzRW5kcG9pbnRVcmxcclxuICAgICAqIEByZXR1cm5zIFByb21pc2U8TmV0d29ya1Jlc3BvbnNlPHN0cmluZz4+XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFJlZ2lvbkZyb21JTURTKHZlcnNpb24sIG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlJlZ2lvbkRpc2NvdmVyeUdldFJlZ2lvbkZyb21JTURTLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtJbnRlcmZhY2Uuc2VuZEdldFJlcXVlc3RBc3luYyhgJHtDb25zdGFudHMuSU1EU19FTkRQT0lOVH0/YXBpLXZlcnNpb249JHt2ZXJzaW9ufSZmb3JtYXQ9dGV4dGAsIG9wdGlvbnMsIENvbnN0YW50cy5JTURTX1RJTUVPVVQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIElNRFMgZW5kcG9pbnQgYXZhaWxhYmxlXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxzdHJpbmcgfCBudWxsPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRDdXJyZW50VmVyc2lvbihvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5SZWdpb25EaXNjb3ZlcnlHZXRDdXJyZW50VmVyc2lvbiwgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubmV0d29ya0ludGVyZmFjZS5zZW5kR2V0UmVxdWVzdEFzeW5jKGAke0NvbnN0YW50cy5JTURTX0VORFBPSU5UfT9mb3JtYXQ9anNvbmAsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAvLyBXaGVuIElNRFMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGFwaSB2ZXJzaW9uIHF1ZXJ5IHBhcmFtLCBiYWQgcmVxdWVzdCByZXNwb25zZSBjb21lcyBiYWNrIHdpdGggbGF0ZXN0IHZlcnNpb24uXHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFJlc3BvbnNlQ29kZXMuaHR0cEJhZFJlcXVlc3QgJiZcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHlbXCJuZXdlc3QtdmVyc2lvbnNcIl0gJiZcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHlbXCJuZXdlc3QtdmVyc2lvbnNcIl0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHlbXCJuZXdlc3QtdmVyc2lvbnNcIl1bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vLyBPcHRpb25zIGZvciB0aGUgSU1EUyBlbmRwb2ludCByZXF1ZXN0XHJcblJlZ2lvbkRpc2NvdmVyeS5JTURTX09QVElPTlMgPSB7XHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgTWV0YWRhdGE6IFwidHJ1ZVwiLFxyXG4gICAgfSxcclxufTtcblxuZXhwb3J0IHsgUmVnaW9uRGlzY292ZXJ5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdpb25EaXNjb3ZlcnkubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBBdXRob3JpdHlUeXBlIH0gZnJvbSAnLi9BdXRob3JpdHlUeXBlLm1qcyc7XG5pbXBvcnQgeyBpc09wZW5JZENvbmZpZ1Jlc3BvbnNlIH0gZnJvbSAnLi9PcGVuSWRDb25maWdSZXNwb25zZS5tanMnO1xuaW1wb3J0IHsgVXJsU3RyaW5nIH0gZnJvbSAnLi4vdXJsL1VybFN0cmluZy5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBDb25zdGFudHMsIEF1dGhvcml0eU1ldGFkYXRhU291cmNlLCBSZWdpb25EaXNjb3ZlcnlPdXRjb21lcywgQUFEQXV0aG9yaXR5Q29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBFbmRwb2ludE1ldGFkYXRhLCBnZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUhhcmRjb2RlZFZhbHVlcywgZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrUmVzcG9uc2UsIEluc3RhbmNlRGlzY292ZXJ5TWV0YWRhdGFBbGlhc2VzIH0gZnJvbSAnLi9BdXRob3JpdHlNZXRhZGF0YS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yLm1qcyc7XG5pbXBvcnQgeyBQcm90b2NvbE1vZGUgfSBmcm9tICcuL1Byb3RvY29sTW9kZS5tanMnO1xuaW1wb3J0IHsgQXp1cmVDbG91ZEluc3RhbmNlIH0gZnJvbSAnLi9BdXRob3JpdHlPcHRpb25zLm1qcyc7XG5pbXBvcnQgeyBpc0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlSZXNwb25zZSB9IGZyb20gJy4vQ2xvdWRJbnN0YW5jZURpc2NvdmVyeVJlc3BvbnNlLm1qcyc7XG5pbXBvcnQgeyBpc0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi9DbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZS5tanMnO1xuaW1wb3J0IHsgUmVnaW9uRGlzY292ZXJ5IH0gZnJvbSAnLi9SZWdpb25EaXNjb3ZlcnkubWpzJztcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0F1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VFdmVudC5tanMnO1xuaW1wb3J0IHsgaW52b2tlQXN5bmMgfSBmcm9tICcuLi91dGlscy9GdW5jdGlvbldyYXBwZXJzLm1qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUF1dGhvcml0eU1ldGFkYXRhRXhwaXJlc0F0LCB1cGRhdGVBdXRob3JpdHlFbmRwb2ludE1ldGFkYXRhLCBpc0F1dGhvcml0eU1ldGFkYXRhRXhwaXJlZCwgdXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSB9IGZyb20gJy4uL2NhY2hlL3V0aWxzL0NhY2hlSGVscGVycy5tanMnO1xuaW1wb3J0IHsgZW5kcG9pbnRSZXNvbHV0aW9uRXJyb3IsIGVuZFNlc3Npb25FbmRwb2ludE5vdFN1cHBvcnRlZCwgb3BlbklkQ29uZmlnRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuaW1wb3J0IHsgaW52YWxpZEF1dGhvcml0eU1ldGFkYXRhLCB1bnRydXN0ZWRBdXRob3JpdHksIGludmFsaWRDbG91ZERpc2NvdmVyeU1ldGFkYXRhIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgYXV0aG9yaXR5IGNsYXNzIHZhbGlkYXRlcyB0aGUgYXV0aG9yaXR5IFVSSXMgdXNlZCBieSB0aGUgdXNlciwgYW5kIHJldHJpZXZlcyB0aGUgT3BlbklEIENvbmZpZ3VyYXRpb24gRGF0YSBmcm9tIHRoZVxyXG4gKiBlbmRwb2ludC4gSXQgd2lsbCBzdG9yZSB0aGUgcGVydGluZW50IGNvbmZpZyBkYXRhIGluIHRoaXMgb2JqZWN0IGZvciB1c2UgZHVyaW5nIHRva2VuIGNhbGxzLlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNsYXNzIEF1dGhvcml0eSB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRob3JpdHksIG5ldHdvcmtJbnRlcmZhY2UsIGNhY2hlTWFuYWdlciwgYXV0aG9yaXR5T3B0aW9ucywgbG9nZ2VyLCBjb3JyZWxhdGlvbklkLCBwZXJmb3JtYW5jZUNsaWVudCwgbWFuYWdlZElkZW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5jYW5vbmljYWxBdXRob3JpdHkgPSBhdXRob3JpdHk7XHJcbiAgICAgICAgdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LnZhbGlkYXRlQXNVcmkoKTtcclxuICAgICAgICB0aGlzLm5ldHdvcmtJbnRlcmZhY2UgPSBuZXR3b3JrSW50ZXJmYWNlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyID0gY2FjaGVNYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMuYXV0aG9yaXR5T3B0aW9ucyA9IGF1dGhvcml0eU9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YSA9IHtcclxuICAgICAgICAgICAgcmVnaW9uX3VzZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgcmVnaW9uX3NvdXJjZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICByZWdpb25fb3V0Y29tZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VkSWRlbnRpdHkgPSBtYW5hZ2VkSWRlbnRpdHkgfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZWdpb25EaXNjb3ZlcnkgPSBuZXcgUmVnaW9uRGlzY292ZXJ5KG5ldHdvcmtJbnRlcmZhY2UsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQge0BsaW5rIEF1dGhvcml0eVR5cGV9XHJcbiAgICAgKiBAcGFyYW0gYXV0aG9yaXR5VXJpIHtAbGluayBJVXJpfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgZ2V0QXV0aG9yaXR5VHlwZShhdXRob3JpdHlVcmkpIHtcclxuICAgICAgICAvLyBDSUFNIGF1dGggdXJsIHBhdHRlcm4gaXMgYmVpbmcgc3RhbmRhcmRpemVkIGFzOiA8dGVuYW50Pi5jaWFtbG9naW4uY29tXHJcbiAgICAgICAgaWYgKGF1dGhvcml0eVVyaS5Ib3N0TmFtZUFuZFBvcnQuZW5kc1dpdGgoQ29uc3RhbnRzLkNJQU1fQVVUSF9VUkwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBBdXRob3JpdHlUeXBlLkNpYW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IGF1dGhvcml0eVVyaS5QYXRoU2VnbWVudHM7XHJcbiAgICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChwYXRoU2VnbWVudHNbMF0udG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuQURGUzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5VHlwZS5BZGZzO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuRFNUUzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5VHlwZS5Ec3RzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBBdXRob3JpdHlUeXBlLkRlZmF1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyBTZWUgYWJvdmUgZm9yIEF1dGhvcml0eVR5cGVcclxuICAgIGdldCBhdXRob3JpdHlUeXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEF1dGhvcml0eVR5cGUodGhpcy5jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJvdG9jb2xNb2RlIGVudW0gcmVwcmVzZW50aW5nIHRoZSB3YXkgZW5kcG9pbnRzIGFyZSBjb25zdHJ1Y3RlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0IHByb3RvY29sTW9kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdXRob3JpdHlPcHRpb25zLnByb3RvY29sTW9kZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhdXRob3JpdHlPcHRpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlaW5zdGFudGlhdGUgYSBuZXcgYXV0aG9yaXR5IGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhvcml0eU9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEEgVVJMIHRoYXQgaXMgdGhlIGF1dGhvcml0eSBzZXQgYnkgdGhlIGRldmVsb3BlclxyXG4gICAgICovXHJcbiAgICBnZXQgY2Fub25pY2FsQXV0aG9yaXR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5vbmljYWxBdXRob3JpdHkudXJsU3RyaW5nO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNhbm9uaWNhbCBhdXRob3JpdHkuXHJcbiAgICAgKi9cclxuICAgIHNldCBjYW5vbmljYWxBdXRob3JpdHkodXJsKSB7XHJcbiAgICAgICAgdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5ID0gbmV3IFVybFN0cmluZyh1cmwpO1xyXG4gICAgICAgIHRoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eS52YWxpZGF0ZUFzVXJpKCk7XHJcbiAgICAgICAgdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cyA9IG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCBhdXRob3JpdHkgY29tcG9uZW50cy5cclxuICAgICAqL1xyXG4gICAgZ2V0IGNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LmdldFVybENvbXBvbmVudHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCBob3N0bmFtZSBhbmQgcG9ydCBpLmUuIGxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb21cclxuICAgICAqL1xyXG4gICAgZ2V0IGhvc3RuYW1lQW5kUG9ydCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzLkhvc3ROYW1lQW5kUG9ydC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGVuYW50IGZvciBhdXRob3JpdHkuXHJcbiAgICAgKi9cclxuICAgIGdldCB0ZW5hbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHNbMF07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9BdXRoIC9hdXRob3JpemUgZW5kcG9pbnQgZm9yIHJlcXVlc3RzXHJcbiAgICAgKi9cclxuICAgIGdldCBhdXRob3JpemF0aW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmF1dGhvcml6YXRpb25fZW5kcG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGVuZHBvaW50UmVzb2x1dGlvbkVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9BdXRoIC90b2tlbiBlbmRwb2ludCBmb3IgcmVxdWVzdHNcclxuICAgICAqL1xyXG4gICAgZ2V0IHRva2VuRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLnRva2VuX2VuZHBvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihlbmRwb2ludFJlc29sdXRpb25FcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGRldmljZUNvZGVFbmRwb2ludCgpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNjb3ZlcnlDb21wbGV0ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VQYXRoKHRoaXMubWV0YWRhdGEudG9rZW5fZW5kcG9pbnQucmVwbGFjZShcIi90b2tlblwiLCBcIi9kZXZpY2Vjb2RlXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihlbmRwb2ludFJlc29sdXRpb25FcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPQXV0aCBsb2dvdXQgZW5kcG9pbnQgZm9yIHJlcXVlc3RzXHJcbiAgICAgKi9cclxuICAgIGdldCBlbmRTZXNzaW9uRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSkge1xyXG4gICAgICAgICAgICAvLyBST1BDIHBvbGljaWVzIG1heSBub3QgaGF2ZSBlbmRfc2Vzc2lvbl9lbmRwb2ludCBzZXRcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhLmVuZF9zZXNzaW9uX2VuZHBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoZW5kU2Vzc2lvbkVuZHBvaW50Tm90U3VwcG9ydGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmVuZF9zZXNzaW9uX2VuZHBvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihlbmRwb2ludFJlc29sdXRpb25FcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPQXV0aCBpc3N1ZXIgZm9yIHJlcXVlc3RzXHJcbiAgICAgKi9cclxuICAgIGdldCBzZWxmU2lnbmVkSnd0QXVkaWVuY2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmlzc3Vlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoZW5kcG9pbnRSZXNvbHV0aW9uRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSndrc191cmkgZm9yIHRva2VuIHNpZ25pbmcga2V5c1xyXG4gICAgICovXHJcbiAgICBnZXQgandrc1VyaSgpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNjb3ZlcnlDb21wbGV0ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VQYXRoKHRoaXMubWV0YWRhdGEuandrc191cmkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGVuZHBvaW50UmVzb2x1dGlvbkVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmbGFnIGluZGljYXRpbmcgdGhhdCB0ZW5hbnQgbmFtZSBjYW4gYmUgcmVwbGFjZWQgaW4gYXV0aG9yaXR5IHtAbGluayBJVXJpfVxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVVyaSB7QGxpbmsgSVVyaX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNhblJlcGxhY2VUZW5hbnQoYXV0aG9yaXR5VXJpKSB7XHJcbiAgICAgICAgcmV0dXJuIChhdXRob3JpdHlVcmkuUGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAgICAgICAhQXV0aG9yaXR5LnJlc2VydmVkVGVuYW50RG9tYWlucy5oYXMoYXV0aG9yaXR5VXJpLlBhdGhTZWdtZW50c1swXSkgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRBdXRob3JpdHlUeXBlKGF1dGhvcml0eVVyaSkgPT09IEF1dGhvcml0eVR5cGUuRGVmYXVsdCAmJlxyXG4gICAgICAgICAgICB0aGlzLnByb3RvY29sTW9kZSA9PT0gUHJvdG9jb2xNb2RlLkFBRCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIHRlbmFudCBpbiB1cmwgcGF0aCB3aXRoIGN1cnJlbnQgdGVuYW50LiBEZWZhdWx0cyB0byBjb21tb24uXHJcbiAgICAgKiBAcGFyYW0gdXJsU3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2VUZW5hbnQodXJsU3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHVybFN0cmluZy5yZXBsYWNlKC97dGVuYW50fXx7dGVuYW50aWR9L2csIHRoaXMudGVuYW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgcGF0aCBzdWNoIGFzIHRlbmFudCBvciBwb2xpY3kgd2l0aCB0aGUgY3VycmVudCB0ZW5hbnQgb3IgcG9saWN5LlxyXG4gICAgICogQHBhcmFtIHVybFN0cmluZ1xyXG4gICAgICovXHJcbiAgICByZXBsYWNlUGF0aCh1cmxTdHJpbmcpIHtcclxuICAgICAgICBsZXQgZW5kcG9pbnQgPSB1cmxTdHJpbmc7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkQXV0aG9yaXR5VXJsID0gbmV3IFVybFN0cmluZyh0aGlzLm1ldGFkYXRhLmNhbm9uaWNhbF9hdXRob3JpdHkpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEF1dGhvcml0eVVybENvbXBvbmVudHMgPSBjYWNoZWRBdXRob3JpdHlVcmwuZ2V0VXJsQ29tcG9uZW50cygpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEF1dGhvcml0eVBhcnRzID0gY2FjaGVkQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHM7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEF1dGhvcml0eVBhcnRzID0gdGhpcy5jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzLlBhdGhTZWdtZW50cztcclxuICAgICAgICBjdXJyZW50QXV0aG9yaXR5UGFydHMuZm9yRWFjaCgoY3VycmVudFBhcnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjYWNoZWRQYXJ0ID0gY2FjaGVkQXV0aG9yaXR5UGFydHNbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuUmVwbGFjZVRlbmFudChjYWNoZWRBdXRob3JpdHlVcmxDb21wb25lbnRzKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVuYW50SWQgPSBuZXcgVXJsU3RyaW5nKHRoaXMubWV0YWRhdGEuYXV0aG9yaXphdGlvbl9lbmRwb2ludCkuZ2V0VXJsQ29tcG9uZW50cygpLlBhdGhTZWdtZW50c1swXTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgQUFEIGNhbm9uaWNhbCBhdXRob3JpdHkgY29udGFpbnMgdGVuYW50IGRvbWFpbiBuYW1lLCBmb3IgZXhhbXBsZSBcInRlc3Rkb21haW4ub25taWNyb3NvZnQuY29tXCIsXHJcbiAgICAgICAgICAgICAgICAgKiBieSBjb21wYXJpbmcgaXRzIGZpcnN0IHBhdGggc2VnbWVudCB0byB0aGUgY29ycmVzcG9uZGluZyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHBhdGggc2VnbWVudCwgd2hpY2ggaXNcclxuICAgICAgICAgICAgICAgICAqIGFsd2F5cyByZXNvbHZlZCB3aXRoIHRlbmFudCBpZCBieSBPSURDLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkUGFydCAhPT0gdGVuYW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBSZXBsYWNpbmcgdGVuYW50IGRvbWFpbiBuYW1lICR7Y2FjaGVkUGFydH0gd2l0aCBpZCAke3RlbmFudElkfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFBhcnQgPSB0ZW5hbnRJZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhcnQgIT09IGNhY2hlZFBhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZShgLyR7Y2FjaGVkUGFydH0vYCwgYC8ke2N1cnJlbnRQYXJ0fS9gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VUZW5hbnQoZW5kcG9pbnQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBvcGVuIGlkIGNvbmZpZ3VyYXRpb24gZW5kcG9pbnQgZm9yIGFueSBjYW5vbmljYWwgYXV0aG9yaXR5LlxyXG4gICAgICovXHJcbiAgICBnZXQgZGVmYXVsdE9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludCgpIHtcclxuICAgICAgICBjb25zdCBjYW5vbmljYWxBdXRob3JpdHlIb3N0ID0gdGhpcy5ob3N0bmFtZUFuZFBvcnQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5LmVuZHNXaXRoKFwidjIuMC9cIikgfHxcclxuICAgICAgICAgICAgdGhpcy5hdXRob3JpdHlUeXBlID09PSBBdXRob3JpdHlUeXBlLkFkZnMgfHxcclxuICAgICAgICAgICAgKHRoaXMucHJvdG9jb2xNb2RlICE9PSBQcm90b2NvbE1vZGUuQUFEICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pc0FsaWFzT2ZLbm93bk1pY3Jvc29mdEF1dGhvcml0eShjYW5vbmljYWxBdXRob3JpdHlIb3N0KSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fS53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fXYyLjAvLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBCb29sZWFuIHRoYXQgcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0ZW5hbnQgZGlzY292ZXJ5IGhhcyBiZWVuIGNvbXBsZXRlZC5cclxuICAgICAqL1xyXG4gICAgZGlzY292ZXJ5Q29tcGxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybSBlbmRwb2ludCBkaXNjb3ZlcnkgdG8gZGlzY292ZXIgYWxpYXNlcywgcHJlZmVycmVkX2NhY2hlLCBwcmVmZXJyZWRfbmV0d29ya1xyXG4gICAgICogYW5kIHRoZSAvYXV0aG9yaXplLCAvdG9rZW4gYW5kIGxvZ291dCBlbmRwb2ludHMuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc29sdmVFbmRwb2ludHNBc3luYygpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYywgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCBtZXRhZGF0YUVudGl0eSA9IHRoaXMuZ2V0Q3VycmVudE1ldGFkYXRhRW50aXR5KCk7XHJcbiAgICAgICAgY29uc3QgY2xvdWREaXNjb3ZlcnlTb3VyY2UgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLnVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGEuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkobWV0YWRhdGFFbnRpdHkpO1xyXG4gICAgICAgIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5ID0gdGhpcy5jYW5vbmljYWxBdXRob3JpdHkucmVwbGFjZSh0aGlzLmhvc3RuYW1lQW5kUG9ydCwgbWV0YWRhdGFFbnRpdHkucHJlZmVycmVkX25ldHdvcmspO1xyXG4gICAgICAgIGNvbnN0IGVuZHBvaW50U291cmNlID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy51cGRhdGVFbmRwb2ludE1ldGFkYXRhLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGEsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKG1ldGFkYXRhRW50aXR5KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlZE1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBjbG91ZERpc2NvdmVyeVNvdXJjZSwge1xyXG4gICAgICAgICAgICBzb3VyY2U6IGVuZHBvaW50U291cmNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7XHJcbiAgICAgICAgICAgIGNsb3VkRGlzY292ZXJ5U291cmNlOiBjbG91ZERpc2NvdmVyeVNvdXJjZSxcclxuICAgICAgICAgICAgYXV0aG9yaXR5RW5kcG9pbnRTb3VyY2U6IGVuZHBvaW50U291cmNlLFxyXG4gICAgICAgIH0sIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbWV0YWRhdGEgZW50aXR5IGZyb20gY2FjaGUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2VyIHJldHVybnMgYSBuZXcgbWV0YWRhdGEgZW50aXR5IGJ1aWx0XHJcbiAgICAgKiBmcm9tIHRoZSBjb25maWd1cmVkIGNhbm9uaWNhbCBhdXRob3JpdHlcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldEN1cnJlbnRNZXRhZGF0YUVudGl0eSgpIHtcclxuICAgICAgICBsZXQgbWV0YWRhdGFFbnRpdHkgPSB0aGlzLmNhY2hlTWFuYWdlci5nZXRBdXRob3JpdHlNZXRhZGF0YUJ5QWxpYXModGhpcy5ob3N0bmFtZUFuZFBvcnQpO1xyXG4gICAgICAgIGlmICghbWV0YWRhdGFFbnRpdHkpIHtcclxuICAgICAgICAgICAgbWV0YWRhdGFFbnRpdHkgPSB7XHJcbiAgICAgICAgICAgICAgICBhbGlhc2VzOiBbXSxcclxuICAgICAgICAgICAgICAgIHByZWZlcnJlZF9jYWNoZTogdGhpcy5ob3N0bmFtZUFuZFBvcnQsXHJcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRfbmV0d29yazogdGhpcy5ob3N0bmFtZUFuZFBvcnQsXHJcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxfYXV0aG9yaXR5OiB0aGlzLmNhbm9uaWNhbEF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0b2tlbl9lbmRwb2ludDogXCJcIixcclxuICAgICAgICAgICAgICAgIGVuZF9zZXNzaW9uX2VuZHBvaW50OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgaXNzdWVyOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgYWxpYXNlc0Zyb21OZXR3b3JrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGVuZHBvaW50c0Zyb21OZXR3b3JrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGV4cGlyZXNBdDogZ2VuZXJhdGVBdXRob3JpdHlNZXRhZGF0YUV4cGlyZXNBdCgpLFxyXG4gICAgICAgICAgICAgICAgandrc191cmk6IFwiXCIsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtZXRhZGF0YUVudGl0eTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBjYWNoZWQgbWV0YWRhdGEgYmFzZWQgb24gbWV0YWRhdGEgc291cmNlIGFuZCBzZXRzIHRoZSBpbnN0YW5jZSdzIG1ldGFkYXRhXHJcbiAgICAgKiBwcm9wZXJ0eSB0byB0aGUgc2FtZSB2YWx1ZVxyXG4gICAgICogQHBhcmFtIG1ldGFkYXRhRW50aXR5XHJcbiAgICAgKiBAcGFyYW0gY2xvdWREaXNjb3ZlcnlTb3VyY2VcclxuICAgICAqIEBwYXJhbSBlbmRwb2ludE1ldGFkYXRhUmVzdWx0XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNhY2hlZE1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBjbG91ZERpc2NvdmVyeVNvdXJjZSwgZW5kcG9pbnRNZXRhZGF0YVJlc3VsdCkge1xyXG4gICAgICAgIGlmIChjbG91ZERpc2NvdmVyeVNvdXJjZSAhPT0gQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuQ0FDSEUgJiZcclxuICAgICAgICAgICAgZW5kcG9pbnRNZXRhZGF0YVJlc3VsdD8uc291cmNlICE9PSBBdXRob3JpdHlNZXRhZGF0YVNvdXJjZS5DQUNIRSkge1xyXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIHVubGVzcyBib3RoIHZhbHVlcyBjYW1lIGZyb20gYSBzdWNjZXNzZnVsIGNhY2hlIGxvb2t1cFxyXG4gICAgICAgICAgICBtZXRhZGF0YUVudGl0eS5leHBpcmVzQXQgPVxyXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBdXRob3JpdHlNZXRhZGF0YUV4cGlyZXNBdCgpO1xyXG4gICAgICAgICAgICBtZXRhZGF0YUVudGl0eS5jYW5vbmljYWxfYXV0aG9yaXR5ID0gdGhpcy5jYW5vbmljYWxBdXRob3JpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5jYWNoZU1hbmFnZXIuZ2VuZXJhdGVBdXRob3JpdHlNZXRhZGF0YUNhY2hlS2V5KG1ldGFkYXRhRW50aXR5LnByZWZlcnJlZF9jYWNoZSk7XHJcbiAgICAgICAgdGhpcy5jYWNoZU1hbmFnZXIuc2V0QXV0aG9yaXR5TWV0YWRhdGEoY2FjaGVLZXksIG1ldGFkYXRhRW50aXR5KTtcclxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGFFbnRpdHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBBdXRob3JpdHlNZXRhZGF0YUVudGl0eSB3aXRoIG5ldyBlbmRwb2ludHMgYW5kIHJldHVybiB3aGVyZSB0aGUgaW5mb3JtYXRpb24gY2FtZSBmcm9tXHJcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGFFbnRpdHlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdXBkYXRlRW5kcG9pbnRNZXRhZGF0YShtZXRhZGF0YUVudGl0eSkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5VXBkYXRlRW5kcG9pbnRNZXRhZGF0YSwgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCBsb2NhbE1ldGFkYXRhID0gdGhpcy51cGRhdGVFbmRwb2ludE1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhtZXRhZGF0YUVudGl0eSk7XHJcbiAgICAgICAgLy8gRnVydGhlciB1cGRhdGUgbWF5IGJlIHJlcXVpcmVkIGZvciBoYXJkY29kZWQgbWV0YWRhdGEgaWYgcmVnaW9uYWwgbWV0YWRhdGEgaXMgcHJlZmVycmVkXHJcbiAgICAgICAgaWYgKGxvY2FsTWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKGxvY2FsTWV0YWRhdGEuc291cmNlID09PVxyXG4gICAgICAgICAgICAgICAgQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuSEFSRENPREVEX1ZBTFVFUykge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgcHJlZmVycyB0byB1c2UgYW4gYXp1cmUgcmVnaW9uIHJlcGxhY2UgdGhlIGdsb2JhbCBlbmRwb2ludHMgd2l0aCByZWdpb25hbCBpbmZvcm1hdGlvbi5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dGhvcml0eU9wdGlvbnMuYXp1cmVSZWdpb25Db25maWd1cmF0aW9uPy5henVyZVJlZ2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE1ldGFkYXRhLm1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmRjb2RlZE1ldGFkYXRhID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy51cGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKGxvY2FsTWV0YWRhdGEubWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBdXRob3JpdHlFbmRwb2ludE1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBoYXJkY29kZWRNZXRhZGF0YSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUVudGl0eS5jYW5vbmljYWxfYXV0aG9yaXR5ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxNZXRhZGF0YS5zb3VyY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdldCBtZXRhZGF0YSBmcm9tIG5ldHdvcmsgaWYgbG9jYWwgc291cmNlcyBhcmVuJ3QgYXZhaWxhYmxlXHJcbiAgICAgICAgbGV0IG1ldGFkYXRhID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmsuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKSgpO1xyXG4gICAgICAgIGlmIChtZXRhZGF0YSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBwcmVmZXJzIHRvIHVzZSBhbiBhenVyZSByZWdpb24gcmVwbGFjZSB0aGUgZ2xvYmFsIGVuZHBvaW50cyB3aXRoIHJlZ2lvbmFsIGluZm9ybWF0aW9uLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRob3JpdHlPcHRpb25zLmF6dXJlUmVnaW9uQ29uZmlndXJhdGlvbj8uYXp1cmVSZWdpb24pIHtcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy51cGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB1cGRhdGVBdXRob3JpdHlFbmRwb2ludE1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBtZXRhZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBBdXRob3JpdHlNZXRhZGF0YVNvdXJjZS5ORVRXT1JLO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTWV0YWRhdGEgY291bGQgbm90IGJlIG9idGFpbmVkIGZyb20gdGhlIGNvbmZpZywgY2FjaGUsIG5ldHdvcmsgb3IgaGFyZGNvZGVkIHZhbHVlc1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3Iob3BlbklkQ29uZmlnRXJyb3IsIHRoaXMuZGVmYXVsdE9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGVuZHBvaW50IG1ldGFkYXRhIGZyb20gbG9jYWwgc291cmNlcyBhbmQgcmV0dXJucyB3aGVyZSB0aGUgaW5mb3JtYXRpb24gd2FzIHJldHJpZXZlZCBmcm9tIGFuZCB0aGUgbWV0YWRhdGEgY29uZmlnXHJcbiAgICAgKiByZXNwb25zZSBpZiB0aGUgc291cmNlIGlzIGhhcmRjb2RlZCBtZXRhZGF0YVxyXG4gICAgICogQHBhcmFtIG1ldGFkYXRhRW50aXR5XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVFbmRwb2ludE1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhtZXRhZGF0YUVudGl0eSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJBdHRlbXB0aW5nIHRvIGdldCBlbmRwb2ludCBtZXRhZGF0YSBmcm9tIGF1dGhvcml0eSBjb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ01ldGFkYXRhID0gdGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUNvbmZpZygpO1xyXG4gICAgICAgIGlmIChjb25maWdNZXRhZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiRm91bmQgZW5kcG9pbnQgbWV0YWRhdGEgaW4gYXV0aG9yaXR5IGNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgICAgICAgIHVwZGF0ZUF1dGhvcml0eUVuZHBvaW50TWV0YWRhdGEobWV0YWRhdGFFbnRpdHksIGNvbmZpZ01ldGFkYXRhLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IEF1dGhvcml0eU1ldGFkYXRhU291cmNlLkNPTkZJRyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkRpZCBub3QgZmluZCBlbmRwb2ludCBtZXRhZGF0YSBpbiB0aGUgY29uZmlnLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGVuZHBvaW50IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuXCIpO1xyXG4gICAgICAgIC8vIHNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlIGlzIHVzZWQgdG8gYnlwYXNzIGhhcmRjb2RlZCBhdXRob3JpdHkgbWV0YWRhdGEgYW5kIGZvcmNlIGEgbmV0d29yayBtZXRhZGF0YSBjYWNoZSBsb29rdXAgYW5kIG5ldHdvcmsgbWV0YWRhdGEgcmVxdWVzdCBpZiBubyBjYWNoZWQgcmVzcG9uc2UgaXMgYXZhaWxhYmxlLlxyXG4gICAgICAgIGlmICh0aGlzLmF1dGhvcml0eU9wdGlvbnMuc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNraXBwaW5nIGhhcmRjb2RlZCBtZXRhZGF0YSBjYWNoZSBzaW5jZSBza2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZSBpcyBzZXQgdG8gdHJ1ZS4gQXR0ZW1wdGluZyB0byBnZXQgZW5kcG9pbnQgbWV0YWRhdGEgZnJvbSB0aGUgbmV0d29yayBtZXRhZGF0YSBjYWNoZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBoYXJkY29kZWRNZXRhZGF0YSA9IHRoaXMuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21IYXJkY29kZWRWYWx1ZXMoKTtcclxuICAgICAgICAgICAgaWYgKGhhcmRjb2RlZE1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVBdXRob3JpdHlFbmRwb2ludE1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBoYXJkY29kZWRNZXRhZGF0YSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IEF1dGhvcml0eU1ldGFkYXRhU291cmNlLkhBUkRDT0RFRF9WQUxVRVMsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGhhcmRjb2RlZE1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJEaWQgbm90IGZpbmQgZW5kcG9pbnQgbWV0YWRhdGEgaW4gaGFyZGNvZGVkIHZhbHVlcy4uLiBBdHRlbXB0aW5nIHRvIGdldCBlbmRwb2ludCBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayBjYWNoZWQgbWV0YWRhdGEgZW50aXR5IGV4cGlyYXRpb24gc3RhdHVzXHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGFFbnRpdHlFeHBpcmVkID0gaXNBdXRob3JpdHlNZXRhZGF0YUV4cGlyZWQobWV0YWRhdGFFbnRpdHkpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQXV0aG9yaXR5U2FtZVR5cGUobWV0YWRhdGFFbnRpdHkpICYmXHJcbiAgICAgICAgICAgIG1ldGFkYXRhRW50aXR5LmVuZHBvaW50c0Zyb21OZXR3b3JrICYmXHJcbiAgICAgICAgICAgICFtZXRhZGF0YUVudGl0eUV4cGlyZWQpIHtcclxuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB1cGRhdGVcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkZvdW5kIGVuZHBvaW50IG1ldGFkYXRhIGluIHRoZSBjYWNoZS5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuQ0FDSEUgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFFbnRpdHlFeHBpcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUaGUgbWV0YWRhdGEgZW50aXR5IGlzIGV4cGlyZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZXMgdGhlIG51bWJlciBvZiB1cmwgY29tcG9uZW50cyBhZnRlciB0aGUgZG9tYWluIHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGVkXHJcbiAgICAgKiBhdXRob3JpdHkgbWV0YWRhdGEgY2FuIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0ZWQgYXV0aG9yaXR5LiBQcm90ZWN0cyBhZ2FpbnN0IHNhbWUgZG9tYWluIGRpZmZlcmVudFxyXG4gICAgICogYXV0aG9yaXR5IHN1Y2ggYXMgbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS90ZW5hbnQgYW5kIGxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vdGZwL3RlbmFudC9wb2xpY3lcclxuICAgICAqIEBwYXJhbSBtZXRhZGF0YUVudGl0eVxyXG4gICAgICovXHJcbiAgICBpc0F1dGhvcml0eVNhbWVUeXBlKG1ldGFkYXRhRW50aXR5KSB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkQXV0aG9yaXR5VXJsID0gbmV3IFVybFN0cmluZyhtZXRhZGF0YUVudGl0eS5jYW5vbmljYWxfYXV0aG9yaXR5KTtcclxuICAgICAgICBjb25zdCBjYWNoZWRQYXJ0cyA9IGNhY2hlZEF1dGhvcml0eVVybC5nZXRVcmxDb21wb25lbnRzKCkuUGF0aFNlZ21lbnRzO1xyXG4gICAgICAgIHJldHVybiAoY2FjaGVkUGFydHMubGVuZ3RoID09PVxyXG4gICAgICAgICAgICB0aGlzLmNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMuUGF0aFNlZ21lbnRzLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIGF1dGhvcml0eU1ldGFkYXRhIGNvbmZpZyBvcHRpb25cclxuICAgICAqL1xyXG4gICAgZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21Db25maWcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5hdXRob3JpdHlNZXRhZGF0YSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGludmFsaWRBdXRob3JpdHlNZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgT0F1dGggZW5kcG9pbnRzIGZyb20gdGhlIGdpdmVuIE9wZW5JRCBjb25maWd1cmF0aW9uIGVuZHBvaW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBoYXNIYXJkY29kZWRNZXRhZGF0YSBib29sZWFuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yaygpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eUdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yaywgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUT0RPOiBBZGQgYSB0aW1lb3V0IGlmIHRoZSBhdXRob3JpdHkgZXhpc3RzIGluIG91ciBsaWJyYXJ5J3NcclxuICAgICAgICAgKiBoYXJkY29kZWQgbGlzdCBvZiBtZXRhZGF0YVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IG9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludCA9IHRoaXMuZGVmYXVsdE9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludDtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBBdXRob3JpdHkuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIE9BdXRoIGVuZHBvaW50cyBmcm9tICR7b3BlbklkQ29uZmlndXJhdGlvbkVuZHBvaW50fWApO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMob3BlbklkQ29uZmlndXJhdGlvbkVuZHBvaW50LCBvcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgaXNWYWxpZFJlc3BvbnNlID0gaXNPcGVuSWRDb25maWdSZXNwb25zZShyZXNwb25zZS5ib2R5KTtcclxuICAgICAgICAgICAgaWYgKGlzVmFsaWRSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBBdXRob3JpdHkuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiBjb3VsZCBub3QgcGFyc2UgcmVzcG9uc2UgYXMgT3BlbklEIGNvbmZpZ3VyYXRpb25gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYEF1dGhvcml0eS5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6ICR7ZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgT0F1dGggZW5kcG9pbnRzIGZvciBjb21tb24gYXV0aG9yaXRpZXMuXHJcbiAgICAgKi9cclxuICAgIGdldEVuZHBvaW50TWV0YWRhdGFGcm9tSGFyZGNvZGVkVmFsdWVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhvc3RuYW1lQW5kUG9ydCBpbiBFbmRwb2ludE1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbmRwb2ludE1ldGFkYXRhW3RoaXMuaG9zdG5hbWVBbmRQb3J0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgcmV0cmlldmVkIG1ldGFkYXRhIHdpdGggcmVnaW9uYWwgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBVc2VyIHNlbGVjdGVkIEF6dXJlIHJlZ2lvbiB3aWxsIGJlIHVzZWQgaWYgY29uZmlndXJlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihtZXRhZGF0YSkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5VXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbiwgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCB1c2VyQ29uZmlndXJlZEF6dXJlUmVnaW9uID0gdGhpcy5hdXRob3JpdHlPcHRpb25zLmF6dXJlUmVnaW9uQ29uZmlndXJhdGlvbj8uYXp1cmVSZWdpb247XHJcbiAgICAgICAgaWYgKHVzZXJDb25maWd1cmVkQXp1cmVSZWdpb24pIHtcclxuICAgICAgICAgICAgaWYgKHVzZXJDb25maWd1cmVkQXp1cmVSZWdpb24gIT09XHJcbiAgICAgICAgICAgICAgICBDb25zdGFudHMuQVpVUkVfUkVHSU9OX0FVVE9fRElTQ09WRVJfRkxBRykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgUmVnaW9uRGlzY292ZXJ5T3V0Y29tZXMuQ09ORklHVVJFRF9OT19BVVRPX0RFVEVDVElPTjtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX3VzZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJDb25maWd1cmVkQXp1cmVSZWdpb247XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5LnJlcGxhY2VXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihtZXRhZGF0YSwgdXNlckNvbmZpZ3VyZWRBenVyZVJlZ2lvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYXV0b2RldGVjdGVkUmVnaW9uTmFtZSA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMucmVnaW9uRGlzY292ZXJ5LmRldGVjdFJlZ2lvbi5iaW5kKHRoaXMucmVnaW9uRGlzY292ZXJ5KSwgUGVyZm9ybWFuY2VFdmVudHMuUmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKSh0aGlzLmF1dGhvcml0eU9wdGlvbnMuYXp1cmVSZWdpb25Db25maWd1cmF0aW9uXHJcbiAgICAgICAgICAgICAgICA/LmVudmlyb25tZW50UmVnaW9uLCB0aGlzLnJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhKTtcclxuICAgICAgICAgICAgaWYgKGF1dG9kZXRlY3RlZFJlZ2lvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX291dGNvbWUgPVxyXG4gICAgICAgICAgICAgICAgICAgIFJlZ2lvbkRpc2NvdmVyeU91dGNvbWVzLkFVVE9fREVURUNUSU9OX1JFUVVFU1RFRF9TVUNDRVNTRlVMO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fdXNlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2RldGVjdGVkUmVnaW9uTmFtZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBBdXRob3JpdHkucmVwbGFjZVdpdGhSZWdpb25hbEluZm9ybWF0aW9uKG1ldGFkYXRhLCBhdXRvZGV0ZWN0ZWRSZWdpb25OYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl9vdXRjb21lID1cclxuICAgICAgICAgICAgICAgIFJlZ2lvbkRpc2NvdmVyeU91dGNvbWVzLkFVVE9fREVURUNUSU9OX1JFUVVFU1RFRF9GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtZXRhZGF0YTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgQXV0aG9yaXR5TWV0YWRhdGFFbnRpdHkgd2l0aCBuZXcgYWxpYXNlcywgcHJlZmVycmVkX25ldHdvcmsgYW5kIHByZWZlcnJlZF9jYWNoZVxyXG4gICAgICogYW5kIHJldHVybnMgd2hlcmUgdGhlIGluZm9ybWF0aW9uIHdhcyByZXRyaWV2ZWQgZnJvbVxyXG4gICAgICogQHBhcmFtIG1ldGFkYXRhRW50aXR5XHJcbiAgICAgKiBAcmV0dXJucyBBdXRob3JpdHlNZXRhZGF0YVNvdXJjZVxyXG4gICAgICovXHJcbiAgICBhc3luYyB1cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhKG1ldGFkYXRhRW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGxvY2FsTWV0YWRhdGFTb3VyY2UgPSB0aGlzLnVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTG9jYWxTb3VyY2VzKG1ldGFkYXRhRW50aXR5KTtcclxuICAgICAgICBpZiAobG9jYWxNZXRhZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxNZXRhZGF0YVNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbmV0d29yayBhcyBtZXRhZGF0YSBzb3VyY2VcclxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eUdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29yaywgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkoKTtcclxuICAgICAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgdXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YShtZXRhZGF0YUVudGl0eSwgbWV0YWRhdGEsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuTkVUV09SSztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTWV0YWRhdGEgY291bGQgbm90IGJlIG9idGFpbmVkIGZyb20gdGhlIGNvbmZpZywgY2FjaGUsIG5ldHdvcmsgb3IgaGFyZGNvZGVkIHZhbHVlc1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcih1bnRydXN0ZWRBdXRob3JpdHkpO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Mb2NhbFNvdXJjZXMobWV0YWRhdGFFbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQXR0ZW1wdGluZyB0byBnZXQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhICBmcm9tIGF1dGhvcml0eSBjb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYEtub3duIEF1dGhvcml0aWVzOiAke3RoaXMuYXV0aG9yaXR5T3B0aW9ucy5rbm93bkF1dGhvcml0aWVzIHx8XHJcbiAgICAgICAgICAgIENvbnN0YW50cy5OT1RfQVBQTElDQUJMRX1gKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBBdXRob3JpdHkgTWV0YWRhdGE6ICR7dGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhIHx8XHJcbiAgICAgICAgICAgIENvbnN0YW50cy5OT1RfQVBQTElDQUJMRX1gKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBDYW5vbmljYWwgQXV0aG9yaXR5OiAke21ldGFkYXRhRW50aXR5LmNhbm9uaWNhbF9hdXRob3JpdHkgfHwgQ29uc3RhbnRzLk5PVF9BUFBMSUNBQkxFfWApO1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5nZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUNvbmZpZygpO1xyXG4gICAgICAgIGlmIChtZXRhZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiRm91bmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluIGF1dGhvcml0eSBjb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICAgICAgICB1cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhKG1ldGFkYXRhRW50aXR5LCBtZXRhZGF0YSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuQ09ORklHO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiB0aGUgY2FjaGVkIG1ldGFkYXRhIGNhbWUgZnJvbSBjb25maWcgYnV0IHRoYXQgY29uZmlnIHdhcyBub3QgcGFzc2VkIHRvIHRoaXMgaW5zdGFuY2UsIHdlIG11c3QgZ28gdG8gaGFyZGNvZGVkIHZhbHVlc1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJEaWQgbm90IGZpbmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluIHRoZSBjb25maWcuLi4gQXR0ZW1wdGluZyB0byBnZXQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNraXBwaW5nIGhhcmRjb2RlZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgY2FjaGUgc2luY2Ugc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGUgaXMgc2V0IHRvIHRydWUuIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhcmRjb2RlZE1ldGFkYXRhID0gZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21IYXJkY29kZWRWYWx1ZXModGhpcy5ob3N0bmFtZUFuZFBvcnQpO1xyXG4gICAgICAgICAgICBpZiAoaGFyZGNvZGVkTWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJGb3VuZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgZnJvbSBoYXJkY29kZWQgdmFsdWVzLlwiKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGEobWV0YWRhdGFFbnRpdHksIGhhcmRjb2RlZE1ldGFkYXRhLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQXV0aG9yaXR5TWV0YWRhdGFTb3VyY2UuSEFSRENPREVEX1ZBTFVFUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiRGlkIG5vdCBmaW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiBoYXJkY29kZWQgdmFsdWVzLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGFFbnRpdHlFeHBpcmVkID0gaXNBdXRob3JpdHlNZXRhZGF0YUV4cGlyZWQobWV0YWRhdGFFbnRpdHkpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQXV0aG9yaXR5U2FtZVR5cGUobWV0YWRhdGFFbnRpdHkpICYmXHJcbiAgICAgICAgICAgIG1ldGFkYXRhRW50aXR5LmFsaWFzZXNGcm9tTmV0d29yayAmJlxyXG4gICAgICAgICAgICAhbWV0YWRhdGFFbnRpdHlFeHBpcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJGb3VuZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgaW4gdGhlIGNhY2hlLlwiKTtcclxuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB1cGRhdGVcclxuICAgICAgICAgICAgcmV0dXJuIEF1dGhvcml0eU1ldGFkYXRhU291cmNlLkNBQ0hFO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChtZXRhZGF0YUVudGl0eUV4cGlyZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlRoZSBtZXRhZGF0YSBlbnRpdHkgaXMgZXhwaXJlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBjbG91ZERpc2NvdmVyeU1ldGFkYXRhIGNvbmZpZyBvciBjaGVjayBrbm93bkF1dGhvcml0aWVzXHJcbiAgICAgKi9cclxuICAgIGdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tQ29uZmlnKCkge1xyXG4gICAgICAgIC8vIENJQU0gZG9lcyBub3Qgc3VwcG9ydCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGFcclxuICAgICAgICBpZiAodGhpcy5hdXRob3JpdHlUeXBlID09PSBBdXRob3JpdHlUeXBlLkNpYW0pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkNJQU0gYXV0aG9yaXRpZXMgZG8gbm90IHN1cHBvcnQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhLCBnZW5lcmF0ZSB0aGUgYWxpYXNlcyBmcm9tIGF1dGhvcml0eSBob3N0LlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIEF1dGhvcml0eS5jcmVhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUhvc3QodGhpcy5ob3N0bmFtZUFuZFBvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayBpZiBuZXR3b3JrIHJlc3BvbnNlIHdhcyBwcm92aWRlZCBpbiBjb25maWdcclxuICAgICAgICBpZiAodGhpcy5hdXRob3JpdHlPcHRpb25zLmNsb3VkRGlzY292ZXJ5TWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlRoZSBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgaGFzIGJlZW4gcHJvdmlkZWQgYXMgYSBuZXR3b3JrIHJlc3BvbnNlLCBpbiB0aGUgY29uZmlnLlwiKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJBdHRlbXB0aW5nIHRvIHBhcnNlIHRoZSBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEuXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmVzcG9uc2UgPSBKU09OLnBhcnNlKHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5jbG91ZERpc2NvdmVyeU1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UubWV0YWRhdGEsIHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJQYXJzZWQgdGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS5cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiVGhlcmUgaXMgcmV0dXJuYWJsZSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgcGFyc2VkIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlRoZXJlIGlzIG5vIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBwYXJzZWQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlVuYWJsZSB0byBwYXJzZSB0aGUgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhLiBUaHJvd2luZyBJbnZhbGlkIENsb3VkIERpc2NvdmVyeSBNZXRhZGF0YSBFcnJvci5cIik7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoaW52YWxpZENsb3VkRGlzY292ZXJ5TWV0YWRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGEgaXMgZW1wdHkgb3IgZG9lcyBub3QgY29udGFpbiB0aGUgaG9zdCwgY2hlY2sga25vd25BdXRob3JpdGllc1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5Lbm93bkF1dGhvcml0aWVzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlRoZSBob3N0IGlzIGluY2x1ZGVkIGluIGtub3duQXV0aG9yaXRpZXMuIENyZWF0aW5nIG5ldyBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgZnJvbSB0aGUgaG9zdC5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBBdXRob3JpdHkuY3JlYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Ib3N0KHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB0byBnZXQgbWV0YWRhdGEgZnJvbSBuZXR3b3JrIGlmIENsb3VkRGlzY292ZXJ5TWV0YWRhdGEgd2FzIG5vdCBwb3B1bGF0ZWQgYnkgY29uZmlnXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGhhc0hhcmRjb2RlZE1ldGFkYXRhIGJvb2xlYW5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrKCkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQXV0aG9yaXR5R2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRGlzY292ZXJ5RW5kcG9pbnQgPSBgJHtDb25zdGFudHMuQUFEX0lOU1RBTkNFX0RJU0NPVkVSWV9FTkRQVH0ke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fW9hdXRoMi92Mi4wL2F1dGhvcml6ZWA7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVE9ETzogQWRkIGEgdGltZW91dCBpZiB0aGUgYXV0aG9yaXR5IGV4aXN0cyBpbiBvdXIgbGlicmFyeSdzXHJcbiAgICAgICAgICogaGFyZGNvZGVkIGxpc3Qgb2YgbWV0YWRhdGFcclxuICAgICAgICAgKi9cclxuICAgICAgICBsZXQgbWF0Y2ggPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMoaW5zdGFuY2VEaXNjb3ZlcnlFbmRwb2ludCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGxldCB0eXBlZFJlc3BvbnNlQm9keTtcclxuICAgICAgICAgICAgbGV0IG1ldGFkYXRhO1xyXG4gICAgICAgICAgICBpZiAoaXNDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2UocmVzcG9uc2UuYm9keSkpIHtcclxuICAgICAgICAgICAgICAgIHR5cGVkUmVzcG9uc2VCb2R5ID1cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0eXBlZFJlc3BvbnNlQm9keS5tZXRhZGF0YTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYHRlbmFudF9kaXNjb3ZlcnlfZW5kcG9pbnQgaXM6ICR7dHlwZWRSZXNwb25zZUJvZHkudGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludH1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpc0Nsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKGBBIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIHdhcyByZXR1cm5lZC4gVGhlIGNsb3VkIGluc3RhbmNlIGRpc2NvdmVyeSBuZXR3b3JrIHJlcXVlc3QncyBzdGF0dXMgY29kZSBpczogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICAgICAgICAgICAgICB0eXBlZFJlc3BvbnNlQm9keSA9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlc3BvbnNlQm9keS5lcnJvciA9PT0gQ29uc3RhbnRzLklOVkFMSURfSU5TVEFOQ0UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIlRoZSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZSBlcnJvciBpcyBpbnZhbGlkX2luc3RhbmNlLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoYFRoZSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZSBlcnJvciBpcyAke3R5cGVkUmVzcG9uc2VCb2R5LmVycm9yfWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhgVGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIGVycm9yIGRlc2NyaXB0aW9uIGlzICR7dHlwZWRSZXNwb25zZUJvZHkuZXJyb3JfZGVzY3JpcHRpb259YCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKFwiU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlNZXRhZGF0YSAocmV0dXJuZWQgZnJvbSB0aGUgbmV0d29yaykgdG8gW11cIik7XHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJBQUQgZGlkIG5vdCByZXR1cm4gYSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2Ugb3IgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQXR0ZW1wdGluZyB0byBmaW5kIGEgbWF0Y2ggYmV0d2VlbiB0aGUgZGV2ZWxvcGVyJ3MgYXV0aG9yaXR5IGFuZCB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIHJldHVybmVkIGZyb20gdGhlIG5ldHdvcmsgcmVxdWVzdC5cIik7XHJcbiAgICAgICAgICAgIG1hdGNoID0gZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrUmVzcG9uc2UobWV0YWRhdGEsIHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFRoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3Igd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgdGhlIGNsb3VkIGRpc2NvdmVyeSBpbnN0YW5jZSBtZXRhZGF0YS5cXG5FcnJvcjogJHtlcnJvci5lcnJvckNvZGV9XFxuRXJyb3IgRGVzY3JpcHRpb246ICR7ZXJyb3IuZXJyb3JNZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEEgbm9uLU1TQUxKUyBlcnJvciB3YXMgdGhyb3duIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2V0IHRoZSBjbG91ZCBpbnN0YW5jZSBkaXNjb3ZlcnkgbWV0YWRhdGEuXFxuRXJyb3I6ICR7dHlwZWRFcnJvci5uYW1lfVxcbkVycm9yIERlc2NyaXB0aW9uOiAke3R5cGVkRXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ3VzdG9tIERvbWFpbiBzY2VuYXJpbywgaG9zdCBpcyB0cnVzdGVkIGJlY2F1c2UgSW5zdGFuY2UgRGlzY292ZXJ5IGNhbGwgc3VjY2VlZGVkXHJcbiAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKFwiVGhlIGRldmVsb3BlcidzIGF1dGhvcml0eSB3YXMgbm90IGZvdW5kIHdpdGhpbiB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIHJldHVybmVkIGZyb20gdGhlIG5ldHdvcmsgcmVxdWVzdC5cIik7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJDcmVhdGluZyBjdXN0b20gQXV0aG9yaXR5IGZvciBjdXN0b20gZG9tYWluIHNjZW5hcmlvLlwiKTtcclxuICAgICAgICAgICAgbWF0Y2ggPSBBdXRob3JpdHkuY3JlYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Ib3N0KHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaG9zdCBpcyBpbmNsdWRlZCBpbiB0aGUga25vd25BdXRob3JpdGllcyBjb25maWcgb3B0aW9uXHJcbiAgICAgKi9cclxuICAgIGlzSW5Lbm93bkF1dGhvcml0aWVzKCkge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLmF1dGhvcml0eU9wdGlvbnMua25vd25BdXRob3JpdGllcy5maWx0ZXIoKGF1dGhvcml0eSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKGF1dGhvcml0eSAmJlxyXG4gICAgICAgICAgICAgICAgVXJsU3RyaW5nLmdldERvbWFpbkZyb21VcmwoYXV0aG9yaXR5KS50b0xvd2VyQ2FzZSgpID09PVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gcG9wdWxhdGUgdGhlIGF1dGhvcml0eSBiYXNlZCBvbiBhenVyZUNsb3VkT3B0aW9uc1xyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVN0cmluZ1xyXG4gICAgICogQHBhcmFtIGF6dXJlQ2xvdWRPcHRpb25zXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZW5lcmF0ZUF1dGhvcml0eShhdXRob3JpdHlTdHJpbmcsIGF6dXJlQ2xvdWRPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IGF1dGhvcml0eUF6dXJlQ2xvdWRJbnN0YW5jZTtcclxuICAgICAgICBpZiAoYXp1cmVDbG91ZE9wdGlvbnMgJiZcclxuICAgICAgICAgICAgYXp1cmVDbG91ZE9wdGlvbnMuYXp1cmVDbG91ZEluc3RhbmNlICE9PSBBenVyZUNsb3VkSW5zdGFuY2UuTm9uZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW5hbnQgPSBhenVyZUNsb3VkT3B0aW9ucy50ZW5hbnRcclxuICAgICAgICAgICAgICAgID8gYXp1cmVDbG91ZE9wdGlvbnMudGVuYW50XHJcbiAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5ERUZBVUxUX0NPTU1PTl9URU5BTlQ7XHJcbiAgICAgICAgICAgIGF1dGhvcml0eUF6dXJlQ2xvdWRJbnN0YW5jZSA9IGAke2F6dXJlQ2xvdWRPcHRpb25zLmF6dXJlQ2xvdWRJbnN0YW5jZX0vJHt0ZW5hbnR9L2A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhdXRob3JpdHlBenVyZUNsb3VkSW5zdGFuY2VcclxuICAgICAgICAgICAgPyBhdXRob3JpdHlBenVyZUNsb3VkSW5zdGFuY2VcclxuICAgICAgICAgICAgOiBhdXRob3JpdHlTdHJpbmc7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIG9iamVjdCBmcm9tIGEgZ2l2ZW4gaG9zdFxyXG4gICAgICogQHBhcmFtIGhvc3RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdChob3N0KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJlZmVycmVkX25ldHdvcms6IGhvc3QsXHJcbiAgICAgICAgICAgIHByZWZlcnJlZF9jYWNoZTogaG9zdCxcclxuICAgICAgICAgICAgYWxpYXNlczogW2hvc3RdLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBlbnZpcm9ubWVudCBmcm9tIGF1dGhvcml0eSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgZ2V0UHJlZmVycmVkQ2FjaGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlZElkZW50aXR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuREVGQVVMVF9BVVRIT1JJVFlfSE9TVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5kaXNjb3ZlcnlDb21wbGV0ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnByZWZlcnJlZF9jYWNoZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihlbmRwb2ludFJlc29sdXRpb25FcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBob3N0IGlzIGFuIGFsaWFzIG9mIHRoaXMgYXV0aG9yaXR5IGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gaG9zdFxyXG4gICAgICovXHJcbiAgICBpc0FsaWFzKGhvc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5hbGlhc2VzLmluZGV4T2YoaG9zdCkgPiAtMTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgaG9zdCBpcyBhbiBhbGlhcyBvZiBhIGtub3duIE1pY3Jvc29mdCBhdXRob3JpdHkgZm9yIHB1cnBvc2VzIG9mIGVuZHBvaW50IGRpc2NvdmVyeVxyXG4gICAgICogQHBhcmFtIGhvc3RcclxuICAgICAqL1xyXG4gICAgaXNBbGlhc09mS25vd25NaWNyb3NvZnRBdXRob3JpdHkoaG9zdCkge1xyXG4gICAgICAgIHJldHVybiBJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhQWxpYXNlcy5oYXMoaG9zdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBob3N0IGlzIHRoYXQgb2YgYSBwdWJsaWMgY2xvdWQgYXV0aG9yaXR5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIGJvb2xcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlzUHVibGljQ2xvdWRBdXRob3JpdHkoaG9zdCkge1xyXG4gICAgICAgIHJldHVybiBDb25zdGFudHMuS05PV05fUFVCTElDX0NMT1VEUy5pbmRleE9mKGhvc3QpID49IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlYnVpbGQgdGhlIGF1dGhvcml0eSBzdHJpbmcgd2l0aCB0aGUgcmVnaW9uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGhvc3Qgc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gcmVnaW9uIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYnVpbGRSZWdpb25hbEF1dGhvcml0eVN0cmluZyhob3N0LCByZWdpb24sIHF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGFuZCB2YWxpZGF0ZSBhIFVybCBzdHJpbmcgb2JqZWN0IHdpdGggdGhlIGluaXRpYWwgYXV0aG9yaXR5IHN0cmluZ1xyXG4gICAgICAgIGNvbnN0IGF1dGhvcml0eVVybEluc3RhbmNlID0gbmV3IFVybFN0cmluZyhob3N0KTtcclxuICAgICAgICBhdXRob3JpdHlVcmxJbnN0YW5jZS52YWxpZGF0ZUFzVXJpKCk7XHJcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5VXJsUGFydHMgPSBhdXRob3JpdHlVcmxJbnN0YW5jZS5nZXRVcmxDb21wb25lbnRzKCk7XHJcbiAgICAgICAgbGV0IGhvc3ROYW1lQW5kUG9ydCA9IGAke3JlZ2lvbn0uJHthdXRob3JpdHlVcmxQYXJ0cy5Ib3N0TmFtZUFuZFBvcnR9YDtcclxuICAgICAgICBpZiAodGhpcy5pc1B1YmxpY0Nsb3VkQXV0aG9yaXR5KGF1dGhvcml0eVVybFBhcnRzLkhvc3ROYW1lQW5kUG9ydCkpIHtcclxuICAgICAgICAgICAgaG9zdE5hbWVBbmRQb3J0ID0gYCR7cmVnaW9ufS4ke0NvbnN0YW50cy5SRUdJT05BTF9BVVRIX1BVQkxJQ19DTE9VRF9TVUZGSVh9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgcXVlcnkgc3RyaW5nIHBvcnRpb24gb2YgdGhlIHVybFxyXG4gICAgICAgIGNvbnN0IHVybCA9IFVybFN0cmluZy5jb25zdHJ1Y3RBdXRob3JpdHlVcmlGcm9tT2JqZWN0KHtcclxuICAgICAgICAgICAgLi4uYXV0aG9yaXR5VXJsSW5zdGFuY2UuZ2V0VXJsQ29tcG9uZW50cygpLFxyXG4gICAgICAgICAgICBIb3N0TmFtZUFuZFBvcnQ6IGhvc3ROYW1lQW5kUG9ydCxcclxuICAgICAgICB9KS51cmxTdHJpbmc7XHJcbiAgICAgICAgLy8gQWRkIHRoZSBxdWVyeSBzdHJpbmcgaWYgYSBxdWVyeSBzdHJpbmcgd2FzIHByb3ZpZGVkXHJcbiAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nKVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7dXJsfT8ke3F1ZXJ5U3RyaW5nfWA7XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZSB0aGUgZW5kcG9pbnRzIGluIHRoZSBtZXRhZGF0YSBvYmplY3Qgd2l0aCB0aGVpciByZWdpb25hbCBlcXVpdmFsZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgT3BlbklkQ29uZmlnUmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBhenVyZVJlZ2lvbiBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlcGxhY2VXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihtZXRhZGF0YSwgYXp1cmVSZWdpb24pIHtcclxuICAgICAgICBjb25zdCByZWdpb25hbE1ldGFkYXRhID0geyAuLi5tZXRhZGF0YSB9O1xyXG4gICAgICAgIHJlZ2lvbmFsTWV0YWRhdGEuYXV0aG9yaXphdGlvbl9lbmRwb2ludCA9XHJcbiAgICAgICAgICAgIEF1dGhvcml0eS5idWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKHJlZ2lvbmFsTWV0YWRhdGEuYXV0aG9yaXphdGlvbl9lbmRwb2ludCwgYXp1cmVSZWdpb24pO1xyXG4gICAgICAgIHJlZ2lvbmFsTWV0YWRhdGEudG9rZW5fZW5kcG9pbnQgPVxyXG4gICAgICAgICAgICBBdXRob3JpdHkuYnVpbGRSZWdpb25hbEF1dGhvcml0eVN0cmluZyhyZWdpb25hbE1ldGFkYXRhLnRva2VuX2VuZHBvaW50LCBhenVyZVJlZ2lvbik7XHJcbiAgICAgICAgaWYgKHJlZ2lvbmFsTWV0YWRhdGEuZW5kX3Nlc3Npb25fZW5kcG9pbnQpIHtcclxuICAgICAgICAgICAgcmVnaW9uYWxNZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCA9XHJcbiAgICAgICAgICAgICAgICBBdXRob3JpdHkuYnVpbGRSZWdpb25hbEF1dGhvcml0eVN0cmluZyhyZWdpb25hbE1ldGFkYXRhLmVuZF9zZXNzaW9uX2VuZHBvaW50LCBhenVyZVJlZ2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZWdpb25hbE1ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gQ0lBTV9BVVRIT1JJWSBhcyBwZXIgdGhlIGJlbG93IHJ1bGVzOlxyXG4gICAgICogSWYgbm8gcGF0aCBzZWdtZW50cyBmb3VuZCBhbmQgaXQgaXMgYSBDSUFNIGF1dGhvcml0eSAoaG9zdG5hbWUgZW5kcyB3aXRoIC5jaWFtbG9naW4uY29tKSwgdGhlbiB0cmFuc2Zvcm0gaXRcclxuICAgICAqXHJcbiAgICAgKiBOT1RFOiBUaGUgdHJhbnNmb3JtYXRpb24gcGF0aCBzaG91bGQgZ28gYXdheSBvbmNlIFNUUyBzdXBwb3J0cyBDSUFNIHdpdGggdGhlIGZvcm1hdDogYHRlbmFudElkb3JEb21haW4uY2lhbWxvZ2luLmNvbWBcclxuICAgICAqIGBjaWFtbG9naW4uY29tYCBjYW4gYWxzbyBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBhbmQgd2Ugc2hvdWxkIGFjY29tbW9kYXRlIHRoZSBzYW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdHJhbnNmb3JtQ0lBTUF1dGhvcml0eShhdXRob3JpdHkpIHtcclxuICAgICAgICBsZXQgY2lhbUF1dGhvcml0eSA9IGF1dGhvcml0eTtcclxuICAgICAgICBjb25zdCBhdXRob3JpdHlVcmwgPSBuZXcgVXJsU3RyaW5nKGF1dGhvcml0eSk7XHJcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5VXJsQ29tcG9uZW50cyA9IGF1dGhvcml0eVVybC5nZXRVcmxDb21wb25lbnRzKCk7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdHJhbnNmb3JtYXRpb24gaXMgbmVlZGVkXHJcbiAgICAgICAgaWYgKGF1dGhvcml0eVVybENvbXBvbmVudHMuUGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAgICAgICBhdXRob3JpdHlVcmxDb21wb25lbnRzLkhvc3ROYW1lQW5kUG9ydC5lbmRzV2l0aChDb25zdGFudHMuQ0lBTV9BVVRIX1VSTCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVuYW50SWRPckRvbWFpbiA9IGF1dGhvcml0eVVybENvbXBvbmVudHMuSG9zdE5hbWVBbmRQb3J0LnNwbGl0KFwiLlwiKVswXTtcclxuICAgICAgICAgICAgY2lhbUF1dGhvcml0eSA9IGAke2NpYW1BdXRob3JpdHl9JHt0ZW5hbnRJZE9yRG9tYWlufSR7Q29uc3RhbnRzLkFBRF9URU5BTlRfRE9NQUlOX1NVRkZJWH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2lhbUF1dGhvcml0eTtcclxuICAgIH1cclxufVxyXG4vLyBSZXNlcnZlZCB0ZW5hbnQgZG9tYWluIG5hbWVzIHRoYXQgd2lsbCBub3QgYmUgcmVwbGFjZWQgd2l0aCB0ZW5hbnQgaWRcclxuQXV0aG9yaXR5LnJlc2VydmVkVGVuYW50RG9tYWlucyA9IG5ldyBTZXQoW1xyXG4gICAgXCJ7dGVuYW50fVwiLFxyXG4gICAgXCJ7dGVuYW50aWR9XCIsXHJcbiAgICBBQURBdXRob3JpdHlDb25zdGFudHMuQ09NTU9OLFxyXG4gICAgQUFEQXV0aG9yaXR5Q29uc3RhbnRzLkNPTlNVTUVSUyxcclxuICAgIEFBREF1dGhvcml0eUNvbnN0YW50cy5PUkdBTklaQVRJT05TLFxyXG5dKTtcclxuLyoqXHJcbiAqIEV4dHJhY3QgdGVuYW50SWQgZnJvbSBhdXRob3JpdHlcclxuICovXHJcbmZ1bmN0aW9uIGdldFRlbmFudEZyb21BdXRob3JpdHlTdHJpbmcoYXV0aG9yaXR5KSB7XHJcbiAgICBjb25zdCBhdXRob3JpdHlVcmwgPSBuZXcgVXJsU3RyaW5nKGF1dGhvcml0eSk7XHJcbiAgICBjb25zdCBhdXRob3JpdHlVcmxDb21wb25lbnRzID0gYXV0aG9yaXR5VXJsLmdldFVybENvbXBvbmVudHMoKTtcclxuICAgIC8qKlxyXG4gICAgICogRm9yIGNyZWRlbnRpYWwgbWF0Y2hpbmcgcHVycG9zZXMsIHRlbmFudElkIGlzIHRoZSBsYXN0IHBhdGggc2VnbWVudCBvZiB0aGUgYXV0aG9yaXR5IFVSTDpcclxuICAgICAqICBBQUQgQXV0aG9yaXR5IC0gZG9tYWluL3RlbmFudElkIC0+IENyZWRlbnRpYWxzIGFyZSBjYWNoZWQgd2l0aCByZWFsbSA9IHRlbmFudElkXHJcbiAgICAgKiAgQjJDIEF1dGhvcml0eSAtIGRvbWFpbi97dGVuYW50SWR9Py8uLi4vcG9saWN5IC0+IENyZWRlbnRpYWxzIGFyZSBjYWNoZWQgd2l0aCByZWFsbSA9IHBvbGljeVxyXG4gICAgICogIHRlbmFudElkIGlzIGRvd25jYXNlZCBiZWNhdXNlIEIyQyBwb2xpY2llcyBjYW4gaGF2ZSBtaXhlZCBjYXNlIGJ1dCB0ZnAgY2xhaW0gaXMgZG93bmNhc2VkXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGF0IHdlIG1heSBub3QgaGF2ZSBhbnkgcGF0aCBzZWdtZW50cyBpbiBjZXJ0YWluIE9JREMgc2NlbmFyaW9zLlxyXG4gICAgICovXHJcbiAgICBjb25zdCB0ZW5hbnRJZCA9IGF1dGhvcml0eVVybENvbXBvbmVudHMuUGF0aFNlZ21lbnRzLnNsaWNlKC0xKVswXT8udG9Mb3dlckNhc2UoKTtcclxuICAgIHN3aXRjaCAodGVuYW50SWQpIHtcclxuICAgICAgICBjYXNlIEFBREF1dGhvcml0eUNvbnN0YW50cy5DT01NT046XHJcbiAgICAgICAgY2FzZSBBQURBdXRob3JpdHlDb25zdGFudHMuT1JHQU5JWkFUSU9OUzpcclxuICAgICAgICBjYXNlIEFBREF1dGhvcml0eUNvbnN0YW50cy5DT05TVU1FUlM6XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHRlbmFudElkO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGZvcm1hdEF1dGhvcml0eVVyaShhdXRob3JpdHlVcmkpIHtcclxuICAgIHJldHVybiBhdXRob3JpdHlVcmkuZW5kc1dpdGgoQ29uc3RhbnRzLkZPUldBUkRfU0xBU0gpXHJcbiAgICAgICAgPyBhdXRob3JpdHlVcmlcclxuICAgICAgICA6IGAke2F1dGhvcml0eVVyaX0ke0NvbnN0YW50cy5GT1JXQVJEX1NMQVNIfWA7XHJcbn1cclxuZnVuY3Rpb24gYnVpbGRTdGF0aWNBdXRob3JpdHlPcHRpb25zKGF1dGhPcHRpb25zKSB7XHJcbiAgICBjb25zdCByYXdDbG91ZERpc2NvdmVyeU1ldGFkYXRhID0gYXV0aE9wdGlvbnMuY2xvdWREaXNjb3ZlcnlNZXRhZGF0YTtcclxuICAgIGxldCBjbG91ZERpc2NvdmVyeU1ldGFkYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKHJhd0Nsb3VkRGlzY292ZXJ5TWV0YWRhdGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjbG91ZERpc2NvdmVyeU1ldGFkYXRhID0gSlNPTi5wYXJzZShyYXdDbG91ZERpc2NvdmVyeU1ldGFkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGludmFsaWRDbG91ZERpc2NvdmVyeU1ldGFkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNhbm9uaWNhbEF1dGhvcml0eTogYXV0aE9wdGlvbnMuYXV0aG9yaXR5XHJcbiAgICAgICAgICAgID8gZm9ybWF0QXV0aG9yaXR5VXJpKGF1dGhPcHRpb25zLmF1dGhvcml0eSlcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAga25vd25BdXRob3JpdGllczogYXV0aE9wdGlvbnMua25vd25BdXRob3JpdGllcyxcclxuICAgICAgICBjbG91ZERpc2NvdmVyeU1ldGFkYXRhOiBjbG91ZERpc2NvdmVyeU1ldGFkYXRhLFxyXG4gICAgfTtcclxufVxuXG5leHBvcnQgeyBBdXRob3JpdHksIGJ1aWxkU3RhdGljQXV0aG9yaXR5T3B0aW9ucywgZm9ybWF0QXV0aG9yaXR5VXJpLCBnZXRUZW5hbnRGcm9tQXV0aG9yaXR5U3RyaW5nIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRob3JpdHkubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLy8gQ29kZXMgZGVmaW5lZCBieSBNU0FMXHJcbmNvbnN0IG5vVG9rZW5zRm91bmQgPSBcIm5vX3Rva2Vuc19mb3VuZFwiO1xyXG5jb25zdCBuYXRpdmVBY2NvdW50VW5hdmFpbGFibGUgPSBcIm5hdGl2ZV9hY2NvdW50X3VuYXZhaWxhYmxlXCI7XHJcbmNvbnN0IHJlZnJlc2hUb2tlbkV4cGlyZWQgPSBcInJlZnJlc2hfdG9rZW5fZXhwaXJlZFwiO1xyXG4vLyBDb2RlcyBwb3RlbnRpYWxseSByZXR1cm5lZCBieSBzZXJ2ZXJcclxuY29uc3QgaW50ZXJhY3Rpb25SZXF1aXJlZCA9IFwiaW50ZXJhY3Rpb25fcmVxdWlyZWRcIjtcclxuY29uc3QgY29uc2VudFJlcXVpcmVkID0gXCJjb25zZW50X3JlcXVpcmVkXCI7XHJcbmNvbnN0IGxvZ2luUmVxdWlyZWQgPSBcImxvZ2luX3JlcXVpcmVkXCI7XHJcbmNvbnN0IGJhZFRva2VuID0gXCJiYWRfdG9rZW5cIjtcblxuZXhwb3J0IHsgYmFkVG9rZW4sIGNvbnNlbnRSZXF1aXJlZCwgaW50ZXJhY3Rpb25SZXF1aXJlZCwgbG9naW5SZXF1aXJlZCwgbmF0aXZlQWNjb3VudFVuYXZhaWxhYmxlLCBub1Rva2Vuc0ZvdW5kLCByZWZyZXNoVG9rZW5FeHBpcmVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJy4vQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBub1Rva2Vuc0ZvdW5kLCBuYXRpdmVBY2NvdW50VW5hdmFpbGFibGUsIGJhZFRva2VuLCByZWZyZXNoVG9rZW5FeHBpcmVkLCBpbnRlcmFjdGlvblJlcXVpcmVkLCBjb25zZW50UmVxdWlyZWQsIGxvZ2luUmVxdWlyZWQgfSBmcm9tICcuL0ludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuaW1wb3J0ICogYXMgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvckNvZGVzIGZyb20gJy4vSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvckNvZGVzLm1qcyc7XG5leHBvcnQgeyBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMgfTtcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBJbnRlcmFjdGlvblJlcXVpcmVkU2VydmVyRXJyb3JNZXNzYWdlIGNvbnRhaW5zIHN0cmluZyBjb25zdGFudHMgdXNlZCBieSBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBpbmRpY2F0aW5nIGludGVyYWN0aW9uIGlzIHJlcXVpcmVkXHJcbiAqL1xyXG5jb25zdCBJbnRlcmFjdGlvblJlcXVpcmVkU2VydmVyRXJyb3JNZXNzYWdlID0gW1xyXG4gICAgaW50ZXJhY3Rpb25SZXF1aXJlZCxcclxuICAgIGNvbnNlbnRSZXF1aXJlZCxcclxuICAgIGxvZ2luUmVxdWlyZWQsXHJcbiAgICBiYWRUb2tlbixcclxuXTtcclxuY29uc3QgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhTdWJFcnJvck1lc3NhZ2UgPSBbXHJcbiAgICBcIm1lc3NhZ2Vfb25seVwiLFxyXG4gICAgXCJhZGRpdGlvbmFsX2FjdGlvblwiLFxyXG4gICAgXCJiYXNpY19hY3Rpb25cIixcclxuICAgIFwidXNlcl9wYXNzd29yZF9leHBpcmVkXCIsXHJcbiAgICBcImNvbnNlbnRfcmVxdWlyZWRcIixcclxuICAgIFwiYmFkX3Rva2VuXCIsXHJcbl07XHJcbmNvbnN0IEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIFtub1Rva2Vuc0ZvdW5kXTogXCJObyByZWZyZXNoIHRva2VuIGZvdW5kIGluIHRoZSBjYWNoZS4gUGxlYXNlIHNpZ24taW4uXCIsXHJcbiAgICBbbmF0aXZlQWNjb3VudFVuYXZhaWxhYmxlXTogXCJUaGUgcmVxdWVzdGVkIGFjY291bnQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGJyb2tlci4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGxvZ2dlZCBvdXQuIFBsZWFzZSBzaWduLWluIGFnYWluIHVzaW5nIGFuIGludGVyYWN0aXZlIEFQSS5cIixcclxuICAgIFtyZWZyZXNoVG9rZW5FeHBpcmVkXTogXCJSZWZyZXNoIHRva2VuIGhhcyBleHBpcmVkLlwiLFxyXG4gICAgW2JhZFRva2VuXTogXCJJZGVudGl0eSBwcm92aWRlciByZXR1cm5lZCBiYWRfdG9rZW4gZHVlIHRvIGFuIGV4cGlyZWQgb3IgaW52YWxpZCByZWZyZXNoIHRva2VuLiBQbGVhc2UgaW52b2tlIGFuIGludGVyYWN0aXZlIEFQSSB0byByZXNvbHZlLlwiLFxyXG59O1xyXG4vKipcclxuICogSW50ZXJhY3Rpb24gcmVxdWlyZWQgZXJyb3JzIGRlZmluZWQgYnkgdGhlIFNES1xyXG4gKiBAZGVwcmVjYXRlZCBVc2UgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvckNvZGVzIGluc3RlYWRcclxuICovXHJcbmNvbnN0IEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JNZXNzYWdlID0ge1xyXG4gICAgbm9Ub2tlbnNGb3VuZEVycm9yOiB7XHJcbiAgICAgICAgY29kZTogbm9Ub2tlbnNGb3VuZCxcclxuICAgICAgICBkZXNjOiBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yTWVzc2FnZXNbbm9Ub2tlbnNGb3VuZF0sXHJcbiAgICB9LFxyXG4gICAgbmF0aXZlX2FjY291bnRfdW5hdmFpbGFibGU6IHtcclxuICAgICAgICBjb2RlOiBuYXRpdmVBY2NvdW50VW5hdmFpbGFibGUsXHJcbiAgICAgICAgZGVzYzogSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2VzW25hdGl2ZUFjY291bnRVbmF2YWlsYWJsZV0sXHJcbiAgICB9LFxyXG4gICAgYmFkX3Rva2VuOiB7XHJcbiAgICAgICAgY29kZTogYmFkVG9rZW4sXHJcbiAgICAgICAgZGVzYzogSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2VzW2JhZFRva2VuXSxcclxuICAgIH0sXHJcbn07XHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gd2hlbiB1c2VyIGludGVyYWN0aW9uIGlzIHJlcXVpcmVkLlxyXG4gKi9cclxuY2xhc3MgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSwgc3ViRXJyb3IsIHRpbWVzdGFtcCwgdHJhY2VJZCwgY29ycmVsYXRpb25JZCwgY2xhaW1zLCBlcnJvck5vKSB7XHJcbiAgICAgICAgc3VwZXIoZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UsIHN1YkVycm9yKTtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgdGhpcy50cmFjZUlkID0gdHJhY2VJZCB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HO1xyXG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICB0aGlzLmNsYWltcyA9IGNsYWltcyB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvclwiO1xyXG4gICAgICAgIHRoaXMuZXJyb3JObyA9IGVycm9yTm87XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBlcnJvciB0aHJvd24gYnkgdGhlIHNlcnZlciByZXF1aXJlcyBpbnRlcmFjdGlvbiB0byByZXNvbHZlXHJcbiAqIEBwYXJhbSBlcnJvckNvZGVcclxuICogQHBhcmFtIGVycm9yU3RyaW5nXHJcbiAqIEBwYXJhbSBzdWJFcnJvclxyXG4gKi9cclxuZnVuY3Rpb24gaXNJbnRlcmFjdGlvblJlcXVpcmVkRXJyb3IoZXJyb3JDb2RlLCBlcnJvclN0cmluZywgc3ViRXJyb3IpIHtcclxuICAgIGNvbnN0IGlzSW50ZXJhY3Rpb25SZXF1aXJlZEVycm9yQ29kZSA9ICEhZXJyb3JDb2RlICYmXHJcbiAgICAgICAgSW50ZXJhY3Rpb25SZXF1aXJlZFNlcnZlckVycm9yTWVzc2FnZS5pbmRleE9mKGVycm9yQ29kZSkgPiAtMTtcclxuICAgIGNvbnN0IGlzSW50ZXJhY3Rpb25SZXF1aXJlZFN1YkVycm9yID0gISFzdWJFcnJvciAmJlxyXG4gICAgICAgIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoU3ViRXJyb3JNZXNzYWdlLmluZGV4T2Yoc3ViRXJyb3IpID4gLTE7XHJcbiAgICBjb25zdCBpc0ludGVyYWN0aW9uUmVxdWlyZWRFcnJvckRlc2MgPSAhIWVycm9yU3RyaW5nICYmXHJcbiAgICAgICAgSW50ZXJhY3Rpb25SZXF1aXJlZFNlcnZlckVycm9yTWVzc2FnZS5zb21lKChpckVycm9yQ29kZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JTdHJpbmcuaW5kZXhPZihpckVycm9yQ29kZSkgPiAtMTtcclxuICAgICAgICB9KTtcclxuICAgIHJldHVybiAoaXNJbnRlcmFjdGlvblJlcXVpcmVkRXJyb3JDb2RlIHx8XHJcbiAgICAgICAgaXNJbnRlcmFjdGlvblJlcXVpcmVkRXJyb3JEZXNjIHx8XHJcbiAgICAgICAgaXNJbnRlcmFjdGlvblJlcXVpcmVkU3ViRXJyb3IpO1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IoZXJyb3JDb2RlKSB7XHJcbiAgICByZXR1cm4gbmV3IEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IoZXJyb3JDb2RlLCBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yTWVzc2FnZXNbZXJyb3JDb2RlXSk7XHJcbn1cblxuZXhwb3J0IHsgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciwgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2UsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoU3ViRXJyb3JNZXNzYWdlLCBJbnRlcmFjdGlvblJlcXVpcmVkU2VydmVyRXJyb3JNZXNzYWdlLCBjcmVhdGVJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yLCBpc0ludGVyYWN0aW9uUmVxdWlyZWRFcnJvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4vQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IG5vQ3J5cHRvT2JqZWN0LCBpbnZhbGlkU3RhdGUgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIENsYXNzIHdoaWNoIHByb3ZpZGVzIGhlbHBlcnMgZm9yIE9BdXRoIDIuMCBwcm90b2NvbCBzcGVjaWZpYyB2YWx1ZXNcclxuICovXHJcbmNsYXNzIFByb3RvY29sVXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIHVzZXIgc3RhdGUgd2l0aCByYW5kb20gZ3VpZCwgb3IgcmV0dXJucyByYW5kb20gZ3VpZC5cclxuICAgICAqIEBwYXJhbSB1c2VyU3RhdGVcclxuICAgICAqIEBwYXJhbSByYW5kb21HdWlkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzZXRSZXF1ZXN0U3RhdGUoY3J5cHRvT2JqLCB1c2VyU3RhdGUsIG1ldGEpIHtcclxuICAgICAgICBjb25zdCBsaWJyYXJ5U3RhdGUgPSBQcm90b2NvbFV0aWxzLmdlbmVyYXRlTGlicmFyeVN0YXRlKGNyeXB0b09iaiwgbWV0YSk7XHJcbiAgICAgICAgcmV0dXJuIHVzZXJTdGF0ZVxyXG4gICAgICAgICAgICA/IGAke2xpYnJhcnlTdGF0ZX0ke0NvbnN0YW50cy5SRVNPVVJDRV9ERUxJTX0ke3VzZXJTdGF0ZX1gXHJcbiAgICAgICAgICAgIDogbGlicmFyeVN0YXRlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIHN0YXRlIHZhbHVlIHVzZWQgYnkgdGhlIGNvbW1vbiBsaWJyYXJ5LlxyXG4gICAgICogQHBhcmFtIHJhbmRvbUd1aWRcclxuICAgICAqIEBwYXJhbSBjcnlwdG9PYmpcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGdlbmVyYXRlTGlicmFyeVN0YXRlKGNyeXB0b09iaiwgbWV0YSkge1xyXG4gICAgICAgIGlmICghY3J5cHRvT2JqKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihub0NyeXB0b09iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyZWF0ZSBhIHN0YXRlIG9iamVjdCBjb250YWluaW5nIGEgdW5pcXVlIGlkIGFuZCB0aGUgdGltZXN0YW1wIG9mIHRoZSByZXF1ZXN0IGNyZWF0aW9uXHJcbiAgICAgICAgY29uc3Qgc3RhdGVPYmogPSB7XHJcbiAgICAgICAgICAgIGlkOiBjcnlwdG9PYmouY3JlYXRlTmV3R3VpZCgpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG1ldGEpIHtcclxuICAgICAgICAgICAgc3RhdGVPYmoubWV0YSA9IG1ldGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXRlU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc3RhdGVPYmopO1xyXG4gICAgICAgIHJldHVybiBjcnlwdG9PYmouYmFzZTY0RW5jb2RlKHN0YXRlU3RyaW5nKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIHRoZSBzdGF0ZSBpbnRvIHRoZSBSZXF1ZXN0U3RhdGVPYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBMaWJyYXJ5U3RhdGUgaW5mbyBhbmQgdGhlIHN0YXRlIHBhc3NlZCBieSB0aGUgdXNlci5cclxuICAgICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAgICogQHBhcmFtIGNyeXB0b09ialxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VSZXF1ZXN0U3RhdGUoY3J5cHRvT2JqLCBzdGF0ZSkge1xyXG4gICAgICAgIGlmICghY3J5cHRvT2JqKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihub0NyeXB0b09iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc3RhdGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGludmFsaWRTdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBzdGF0ZSBiZXR3ZWVuIGxpYnJhcnkgc3RhdGUgYW5kIHVzZXIgcGFzc2VkIHN0YXRlIGFuZCBkZWNvZGUgdGhlbSBzZXBhcmF0ZWx5XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0U3RhdGUgPSBzdGF0ZS5zcGxpdChDb25zdGFudHMuUkVTT1VSQ0VfREVMSU0pO1xyXG4gICAgICAgICAgICBjb25zdCBsaWJyYXJ5U3RhdGUgPSBzcGxpdFN0YXRlWzBdO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyU3RhdGUgPSBzcGxpdFN0YXRlLmxlbmd0aCA+IDFcclxuICAgICAgICAgICAgICAgID8gc3BsaXRTdGF0ZS5zbGljZSgxKS5qb2luKENvbnN0YW50cy5SRVNPVVJDRV9ERUxJTSlcclxuICAgICAgICAgICAgICAgIDogQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICAgICAgY29uc3QgbGlicmFyeVN0YXRlU3RyaW5nID0gY3J5cHRvT2JqLmJhc2U2NERlY29kZShsaWJyYXJ5U3RhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBsaWJyYXJ5U3RhdGVPYmogPSBKU09OLnBhcnNlKGxpYnJhcnlTdGF0ZVN0cmluZyk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1c2VyUmVxdWVzdFN0YXRlOiB1c2VyU3RhdGUgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgICAgICAgIGxpYnJhcnlTdGF0ZTogbGlicmFyeVN0YXRlT2JqLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoaW52YWxpZFN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUHJvdG9jb2xVdGlscyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvdG9jb2xVdGlscy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBDY3NDcmVkZW50aWFsVHlwZSA9IHtcclxuICAgIEhPTUVfQUNDT1VOVF9JRDogXCJob21lX2FjY291bnRfaWRcIixcclxuICAgIFVQTjogXCJVUE5cIixcclxufTtcblxuZXhwb3J0IHsgQ2NzQ3JlZGVudGlhbFR5cGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNjc0NyZWRlbnRpYWwubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBzdG9yYWdlTm90U3VwcG9ydGVkIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTG9jYWxTdG9yYWdlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghd2luZG93LmxvY2FsU3RvcmFnZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdG9yYWdlTm90U3VwcG9ydGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRJdGVtKGtleSkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbiAgICBnZXRLZXlzKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh3aW5kb3cubG9jYWxTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIGNvbnRhaW5zS2V5KGtleSkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmhhc093blByb3BlcnR5KGtleSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTG9jYWxTdG9yYWdlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2NhbFN0b3JhZ2UubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBzdG9yYWdlTm90U3VwcG9ydGVkIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgU2Vzc2lvblN0b3JhZ2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF3aW5kb3cuc2Vzc2lvblN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3RvcmFnZU5vdFN1cHBvcnRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0SXRlbShrZXkpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5cygpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LnNlc3Npb25TdG9yYWdlKTtcclxuICAgIH1cclxuICAgIGNvbnRhaW5zS2V5KGtleSkge1xyXG4gICAgICAgIHJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuaGFzT3duUHJvcGVydHkoa2V5KTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBTZXNzaW9uU3RvcmFnZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2Vzc2lvblN0b3JhZ2UubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQcm90b2NvbFV0aWxzLCBjcmVhdGVDbGllbnRBdXRoRXJyb3IsIENsaWVudEF1dGhFcnJvckNvZGVzIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEV4dHJhY3RzIHRoZSBCcm93c2VyU3RhdGVPYmplY3QgZnJvbSB0aGUgc3RhdGUgc3RyaW5nLlxyXG4gKiBAcGFyYW0gYnJvd3NlckNyeXB0b1xyXG4gKiBAcGFyYW0gc3RhdGVcclxuICovXHJcbmZ1bmN0aW9uIGV4dHJhY3RCcm93c2VyUmVxdWVzdFN0YXRlKGJyb3dzZXJDcnlwdG8sIHN0YXRlKSB7XHJcbiAgICBpZiAoIXN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTdGF0ZU9iaiA9IFByb3RvY29sVXRpbHMucGFyc2VSZXF1ZXN0U3RhdGUoYnJvd3NlckNyeXB0bywgc3RhdGUpO1xyXG4gICAgICAgIHJldHVybiByZXF1ZXN0U3RhdGVPYmoubGlicmFyeVN0YXRlLm1ldGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy5pbnZhbGlkU3RhdGUpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGV4dHJhY3RCcm93c2VyUmVxdWVzdFN0YXRlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyUHJvdG9jb2xVdGlscy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBDb29raWUgbGlmZSBjYWxjdWxhdGlvbiAoaG91cnMgKiBtaW51dGVzICogc2Vjb25kcyAqIG1zKVxyXG5jb25zdCBDT09LSUVfTElGRV9NVUxUSVBMSUVSID0gMjQgKiA2MCAqIDYwICogMTAwMDtcclxuY2xhc3MgQ29va2llU3RvcmFnZSB7XHJcbiAgICBnZXRJdGVtKGtleSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX1gO1xyXG4gICAgICAgIGNvbnN0IGNvb2tpZUxpc3QgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29va2llTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb29raWUgPSBjb29raWVMaXN0W2ldO1xyXG4gICAgICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IGRlY29kZVVSSUNvbXBvbmVudChjb29raWUpLnRyaW0oKS5zcGxpdChcIj1cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdC5qb2luKFwiPVwiKTtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgc2V0SXRlbShrZXksIHZhbHVlLCBjb29raWVMaWZlRGF5cywgc2VjdXJlID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBjb29raWVTdHIgPSBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfTtwYXRoPS87U2FtZVNpdGU9TGF4O2A7XHJcbiAgICAgICAgaWYgKGNvb2tpZUxpZmVEYXlzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4cGlyZVRpbWUgPSBnZXRDb29raWVFeHBpcmF0aW9uVGltZShjb29raWVMaWZlRGF5cyk7XHJcbiAgICAgICAgICAgIGNvb2tpZVN0ciArPSBgZXhwaXJlcz0ke2V4cGlyZVRpbWV9O2A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWN1cmUpIHtcclxuICAgICAgICAgICAgY29va2llU3RyICs9IFwiU2VjdXJlO1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVTdHI7XHJcbiAgICB9XHJcbiAgICByZW1vdmVJdGVtKGtleSkge1xyXG4gICAgICAgIC8vIFNldHRpbmcgZXhwaXJhdGlvbiB0byAtMSByZW1vdmVzIGl0XHJcbiAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgXCJcIiwgLTEpO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5cygpIHtcclxuICAgICAgICBjb25zdCBjb29raWVMaXN0ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICBjb25zdCBrZXlzID0gW107XHJcbiAgICAgICAgY29va2llTGlzdC5mb3JFYWNoKChjb29raWUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29va2llUGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQoY29va2llKS50cmltKCkuc3BsaXQoXCI9XCIpO1xyXG4gICAgICAgICAgICBrZXlzLnB1c2goY29va2llUGFydHNbMF0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfVxyXG4gICAgY29udGFpbnNLZXkoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0S2V5cygpLmluY2x1ZGVzKGtleSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEdldCBjb29raWUgZXhwaXJhdGlvbiB0aW1lXHJcbiAqIEBwYXJhbSBjb29raWVMaWZlRGF5c1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q29va2llRXhwaXJhdGlvblRpbWUoY29va2llTGlmZURheXMpIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGV4cHIgPSBuZXcgRGF0ZSh0b2RheS5nZXRUaW1lKCkgKyBjb29raWVMaWZlRGF5cyAqIENPT0tJRV9MSUZFX01VTFRJUExJRVIpO1xyXG4gICAgcmV0dXJuIGV4cHIudG9VVENTdHJpbmcoKTtcclxufVxuXG5leHBvcnQgeyBDb29raWVTdG9yYWdlLCBnZXRDb29raWVFeHBpcmF0aW9uVGltZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29va2llU3RvcmFnZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IENhY2hlTWFuYWdlciwgQ3JlZGVudGlhbFR5cGUsIENhY2hlSGVscGVycywgQWNjb3VudEVudGl0eSwgY3JlYXRlQ2xpZW50QXV0aEVycm9yLCBDbGllbnRBdXRoRXJyb3JDb2RlcywgQ29uc3RhbnRzLCBQZXJzaXN0ZW50Q2FjaGVLZXlzLCBQZXJmb3JtYW5jZUV2ZW50cywgU3RyaW5nVXRpbHMsIFByb3RvY29sVXRpbHMsIEF1dGhUb2tlbiwgQ2FjaGVFcnJvciwgREVGQVVMVF9DUllQVE9fSU1QTEVNRU5UQVRJT04sIENjc0NyZWRlbnRpYWxUeXBlIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IEJyb3dzZXJDYWNoZUxvY2F0aW9uLCBTdGF0aWNDYWNoZUtleXMsIEluTWVtb3J5Q2FjaGVLZXlzLCBUZW1wb3JhcnlDYWNoZUtleXMgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tICcuL0xvY2FsU3RvcmFnZS5tanMnO1xuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tICcuL1Nlc3Npb25TdG9yYWdlLm1qcyc7XG5pbXBvcnQgeyBNZW1vcnlTdG9yYWdlIH0gZnJvbSAnLi9NZW1vcnlTdG9yYWdlLm1qcyc7XG5pbXBvcnQgeyBleHRyYWN0QnJvd3NlclJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJQcm90b2NvbFV0aWxzLm1qcyc7XG5pbXBvcnQgeyBiYXNlNjREZWNvZGUgfSBmcm9tICcuLi9lbmNvZGUvQmFzZTY0RGVjb2RlLm1qcyc7XG5pbXBvcnQgeyBiYXNlNjRFbmNvZGUgfSBmcm9tICcuLi9lbmNvZGUvQmFzZTY0RW5jb2RlLm1qcyc7XG5pbXBvcnQgeyBDb29raWVTdG9yYWdlIH0gZnJvbSAnLi9Db29raWVTdG9yYWdlLm1qcyc7XG5pbXBvcnQgeyBub1Rva2VuUmVxdWVzdENhY2hlRXJyb3IsIHVuYWJsZVRvUGFyc2VUb2tlblJlcXVlc3RDYWNoZUVycm9yLCBub0NhY2hlZEF1dGhvcml0eUVycm9yLCBpbnRlcmFjdGlvbkluUHJvZ3Jlc3MgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNhY2hlIHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBNU0FMIHRocm91Z2ggYnJvd3NlciBsb2NhbCBvciBzZXNzaW9uIHN0b3JhZ2UuXHJcbiAqIENvb2tpZXMgYXJlIG9ubHkgdXNlZCBpZiBzdG9yZUF1dGhTdGF0ZUluQ29va2llIGlzIHRydWUsIGFuZCBhcmUgb25seSB1c2VkIGZvclxyXG4gKiBwYXJhbWV0ZXJzIHN1Y2ggYXMgc3RhdGUgYW5kIG5vbmNlLCBnZW5lcmFsbHkuXHJcbiAqL1xyXG5jbGFzcyBCcm93c2VyQ2FjaGVNYW5hZ2VyIGV4dGVuZHMgQ2FjaGVNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGNsaWVudElkLCBjYWNoZUNvbmZpZywgY3J5cHRvSW1wbCwgbG9nZ2VyLCBzdGF0aWNBdXRob3JpdHlPcHRpb25zLCBwZXJmb3JtYW5jZUNsaWVudCkge1xyXG4gICAgICAgIHN1cGVyKGNsaWVudElkLCBjcnlwdG9JbXBsLCBsb2dnZXIsIHN0YXRpY0F1dGhvcml0eU9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcgPSBjYWNoZUNvbmZpZztcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICAgICAgICB0aGlzLmludGVybmFsU3RvcmFnZSA9IG5ldyBNZW1vcnlTdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZSA9IHRoaXMuc2V0dXBCcm93c2VyU3RvcmFnZSh0aGlzLmNhY2hlQ29uZmlnLmNhY2hlTG9jYXRpb24pO1xyXG4gICAgICAgIHRoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlID0gdGhpcy5zZXR1cEJyb3dzZXJTdG9yYWdlKHRoaXMuY2FjaGVDb25maWcudGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbik7XHJcbiAgICAgICAgdGhpcy5jb29raWVTdG9yYWdlID0gbmV3IENvb2tpZVN0b3JhZ2UoKTtcclxuICAgICAgICAvLyBNaWdyYXRlIGNhY2hlIGVudHJpZXMgZnJvbSBvbGRlciB2ZXJzaW9ucyBvZiBNU0FMLlxyXG4gICAgICAgIGlmIChjYWNoZUNvbmZpZy5jYWNoZU1pZ3JhdGlvbkVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5taWdyYXRlQ2FjaGVFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlS2V5TWFwcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50ID0gcGVyZm9ybWFuY2VDbGllbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB3aW5kb3cgc3RvcmFnZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIElXaW5kb3dTdG9yYWdlIGludGVyZmFjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb25maWd1cmVkIGNhY2hlTG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gY2FjaGVMb2NhdGlvblxyXG4gICAgICovXHJcbiAgICBzZXR1cEJyb3dzZXJTdG9yYWdlKGNhY2hlTG9jYXRpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNhY2hlTG9jYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlckNhY2hlTG9jYXRpb24uTG9jYWxTdG9yYWdlOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJDYWNoZUxvY2F0aW9uLlNlc3Npb25TdG9yYWdlOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblN0b3JhZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlckNhY2hlTG9jYXRpb24uTWVtb3J5U3RvcmFnZTpcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbiA9IEJyb3dzZXJDYWNoZUxvY2F0aW9uLk1lbW9yeVN0b3JhZ2U7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNZW1vcnlTdG9yYWdlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1pZ3JhdGUgYWxsIG9sZCBjYWNoZSBlbnRyaWVzIHRvIG5ldyBzY2hlbWEuIE5vIHJvbGxiYWNrIHN1cHBvcnRlZC5cclxuICAgICAqIEBwYXJhbSBzdG9yZUF1dGhTdGF0ZUluQ29va2llXHJcbiAgICAgKi9cclxuICAgIG1pZ3JhdGVDYWNoZUVudHJpZXMoKSB7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbktleSA9IGAke0NvbnN0YW50cy5DQUNIRV9QUkVGSVh9LiR7UGVyc2lzdGVudENhY2hlS2V5cy5JRF9UT0tFTn1gO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudEluZm9LZXkgPSBgJHtDb25zdGFudHMuQ0FDSEVfUFJFRklYfS4ke1BlcnNpc3RlbnRDYWNoZUtleXMuQ0xJRU5UX0lORk99YDtcclxuICAgICAgICBjb25zdCBlcnJvcktleSA9IGAke0NvbnN0YW50cy5DQUNIRV9QUkVGSVh9LiR7UGVyc2lzdGVudENhY2hlS2V5cy5FUlJPUn1gO1xyXG4gICAgICAgIGNvbnN0IGVycm9yRGVzY0tleSA9IGAke0NvbnN0YW50cy5DQUNIRV9QUkVGSVh9LiR7UGVyc2lzdGVudENhY2hlS2V5cy5FUlJPUl9ERVNDfWA7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlblZhbHVlID0gdGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGlkVG9rZW5LZXkpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudEluZm9WYWx1ZSA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShjbGllbnRJbmZvS2V5KTtcclxuICAgICAgICBjb25zdCBlcnJvclZhbHVlID0gdGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGVycm9yS2V5KTtcclxuICAgICAgICBjb25zdCBlcnJvckRlc2NWYWx1ZSA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShlcnJvckRlc2NLZXkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtcclxuICAgICAgICAgICAgaWRUb2tlblZhbHVlLFxyXG4gICAgICAgICAgICBjbGllbnRJbmZvVmFsdWUsXHJcbiAgICAgICAgICAgIGVycm9yVmFsdWUsXHJcbiAgICAgICAgICAgIGVycm9yRGVzY1ZhbHVlLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3Qga2V5c1RvTWlncmF0ZSA9IFtcclxuICAgICAgICAgICAgUGVyc2lzdGVudENhY2hlS2V5cy5JRF9UT0tFTixcclxuICAgICAgICAgICAgUGVyc2lzdGVudENhY2hlS2V5cy5DTElFTlRfSU5GTyxcclxuICAgICAgICAgICAgUGVyc2lzdGVudENhY2hlS2V5cy5FUlJPUixcclxuICAgICAgICAgICAgUGVyc2lzdGVudENhY2hlS2V5cy5FUlJPUl9ERVNDLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAga2V5c1RvTWlncmF0ZS5mb3JFYWNoKChjYWNoZUtleSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVtcG9yYXJ5Q2FjaGUoY2FjaGVLZXksIHZhbHVlLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2hlcyBhbGwgY2FjaGUgZW50cmllcyBmb3IgTVNBTCBhY2NvdW50cyBhbmQgY3JlYXRlcyB0aGUgYWNjb3VudCBrZXkgbWFwXHJcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gbWlncmF0ZSB1c2VycyBmcm9tIG9sZGVyIHZlcnNpb25zIG9mIE1TQUwgd2hpY2ggZGlkIG5vdCBjcmVhdGUgdGhlIG1hcC5cclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUtleU1hcHMoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyIC0gY3JlYXRlS2V5TWFwcyBjYWxsZWQuXCIpO1xyXG4gICAgICAgIGNvbnN0IGFjY291bnRLZXlzID0gdGhpcy5nZXRJdGVtKFN0YXRpY0NhY2hlS2V5cy5BQ0NPVU5UX0tFWVMpO1xyXG4gICAgICAgIGNvbnN0IHRva2VuS2V5cyA9IHRoaXMuZ2V0SXRlbShgJHtTdGF0aWNDYWNoZUtleXMuVE9LRU5fS0VZU30uJHt0aGlzLmNsaWVudElkfWApO1xyXG4gICAgICAgIGlmIChhY2NvdW50S2V5cyAmJiB0b2tlbktleXMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGFjY291bnQgYW5kIHRva2VuIGtleSBtYXBzIGFscmVhZHkgZXhpc3QsIHNraXBwaW5nIG1pZ3JhdGlvbi5cIik7XHJcbiAgICAgICAgICAgIC8vIEtleSBtYXBzIGFscmVhZHkgZXhpc3QsIG5vIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGNhY2hlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsS2V5cyA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0S2V5cygpO1xyXG4gICAgICAgIGFsbEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ3JlZGVudGlhbEtleShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBHZXQgaXRlbSwgcGFyc2UsIHZhbGlkYXRlIGFuZCB3cml0ZSBrZXkgdG8gbWFwXHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlZE9iaiA9IHRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjcmVkT2JqICYmIGNyZWRPYmouaGFzT3duUHJvcGVydHkoXCJjcmVkZW50aWFsVHlwZVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNyZWRPYmpbXCJjcmVkZW50aWFsVHlwZVwiXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDcmVkZW50aWFsVHlwZS5JRF9UT0tFTjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FjaGVIZWxwZXJzLmlzSWRUb2tlbkVudGl0eShjcmVkT2JqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGlkVG9rZW4gZm91bmQsIHNhdmluZyBrZXkgdG8gdG9rZW4ga2V5IG1hcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2VQaWkoYEJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGlkVG9rZW4gd2l0aCBrZXk6ICR7a2V5fSBmb3VuZCwgc2F2aW5nIGtleSB0byB0b2tlbiBrZXkgbWFwYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkVG9rZW5FbnRpdHkgPSBjcmVkT2JqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdLZXkgPSB0aGlzLnVwZGF0ZUNyZWRlbnRpYWxDYWNoZUtleShrZXksIGlkVG9rZW5FbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRva2VuS2V5KG5ld0tleSwgQ3JlZGVudGlhbFR5cGUuSURfVE9LRU4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGtleSBmb3VuZCBtYXRjaGluZyBpZFRva2VuIHNjaGVtYSB3aXRoIHZhbHVlIGNvbnRhaW5pbmcgaWRUb2tlbiBjcmVkZW50aWFsVHlwZSBmaWVsZCBidXQgdmFsdWUgZmFpbGVkIElkVG9rZW5FbnRpdHkgdmFsaWRhdGlvbiwgc2tpcHBpbmcuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlcjpjcmVhdGVLZXlNYXBzIC0gZmFpbGVkIGlkVG9rZW4gdmFsaWRhdGlvbiBvbiBrZXk6ICR7a2V5fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDcmVkZW50aWFsVHlwZS5BQ0NFU1NfVE9LRU5fV0lUSF9BVVRIX1NDSEVNRTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FjaGVIZWxwZXJzLmlzQWNjZXNzVG9rZW5FbnRpdHkoY3JlZE9iaikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyOmNyZWF0ZUtleU1hcHMgLSBhY2Nlc3NUb2tlbiBmb3VuZCwgc2F2aW5nIGtleSB0byB0b2tlbiBrZXkgbWFwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlcjpjcmVhdGVLZXlNYXBzIC0gYWNjZXNzVG9rZW4gd2l0aCBrZXk6ICR7a2V5fSBmb3VuZCwgc2F2aW5nIGtleSB0byB0b2tlbiBrZXkgbWFwYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuRW50aXR5ID0gY3JlZE9iajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3S2V5ID0gdGhpcy51cGRhdGVDcmVkZW50aWFsQ2FjaGVLZXkoa2V5LCBhY2Nlc3NUb2tlbkVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9rZW5LZXkobmV3S2V5LCBDcmVkZW50aWFsVHlwZS5BQ0NFU1NfVE9LRU4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGtleSBmb3VuZCBtYXRjaGluZyBhY2Nlc3NUb2tlbiBzY2hlbWEgd2l0aCB2YWx1ZSBjb250YWluaW5nIGFjY2Vzc1Rva2VuIGNyZWRlbnRpYWxUeXBlIGZpZWxkIGJ1dCB2YWx1ZSBmYWlsZWQgQWNjZXNzVG9rZW5FbnRpdHkgdmFsaWRhdGlvbiwgc2tpcHBpbmcuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlcjpjcmVhdGVLZXlNYXBzIC0gZmFpbGVkIGFjY2Vzc1Rva2VuIHZhbGlkYXRpb24gb24ga2V5OiAke2tleX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhY2hlSGVscGVycy5pc1JlZnJlc2hUb2tlbkVudGl0eShjcmVkT2JqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIHJlZnJlc2hUb2tlbiBmb3VuZCwgc2F2aW5nIGtleSB0byB0b2tlbiBrZXkgbWFwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlcjpjcmVhdGVLZXlNYXBzIC0gcmVmcmVzaFRva2VuIHdpdGgga2V5OiAke2tleX0gZm91bmQsIHNhdmluZyBrZXkgdG8gdG9rZW4ga2V5IG1hcGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoVG9rZW5FbnRpdHkgPSBjcmVkT2JqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdLZXkgPSB0aGlzLnVwZGF0ZUNyZWRlbnRpYWxDYWNoZUtleShrZXksIHJlZnJlc2hUb2tlbkVudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9rZW5LZXkobmV3S2V5LCBDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyOmNyZWF0ZUtleU1hcHMgLSBrZXkgZm91bmQgbWF0Y2hpbmcgcmVmcmVzaFRva2VuIHNjaGVtYSB3aXRoIHZhbHVlIGNvbnRhaW5pbmcgcmVmcmVzaFRva2VuIGNyZWRlbnRpYWxUeXBlIGZpZWxkIGJ1dCB2YWx1ZSBmYWlsZWQgUmVmcmVzaFRva2VuRW50aXR5IHZhbGlkYXRpb24sIHNraXBwaW5nLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2VQaWkoYEJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGZhaWxlZCByZWZyZXNoVG9rZW4gdmFsaWRhdGlvbiBvbiBrZXk6ICR7a2V5fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGNyZWRlbnRpYWxUeXBlIGlzbid0IG9uZSBvZiBvdXIgcHJlZGVmaW5lZCBvbmVzLCBpdCBtYXkgbm90IGJlIGFuIE1TQUwgY2FjaGUgdmFsdWUuIElnbm9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0FjY291bnRLZXkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY291bnRPYmogPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudE9iaiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50RW50aXR5LmlzQWNjb3VudEVudGl0eShhY2NvdW50T2JqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXI6Y3JlYXRlS2V5TWFwcyAtIGFjY291bnQgZm91bmQsIHNhdmluZyBrZXkgdG8gYWNjb3VudCBrZXkgbWFwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlcjpjcmVhdGVLZXlNYXBzIC0gYWNjb3VudCB3aXRoIGtleTogJHtrZXl9IGZvdW5kLCBzYXZpbmcga2V5IHRvIGFjY291bnQga2V5IG1hcGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEFjY291bnRLZXlUb01hcChrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgcGFzc2VkIHZhbHVlIGFzIEpTT04gb2JqZWN0LCBKU09OLnBhcnNlKCkgd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZUFuZFBhcnNlSnNvbihqc29uVmFsdWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRKc29uID0gSlNPTi5wYXJzZShqc29uVmFsdWUpO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlcmUgYXJlIGVkZ2UgY2FzZXMgaW4gd2hpY2ggSlNPTi5wYXJzZSB3aWxsIHN1Y2Nlc3NmdWxseSBwYXJzZSBhIG5vbi12YWxpZCBKU09OIG9iamVjdFxyXG4gICAgICAgICAgICAgKiAoZS5nLiBKU09OLnBhcnNlIHdpbGwgcGFyc2UgYW4gZXNjYXBlZCBzdHJpbmcgaW50byBhbiB1bmVzY2FwZWQgc3RyaW5nKSwgc28gYWRkaW5nIGEgdHlwZSBjaGVja1xyXG4gICAgICAgICAgICAgKiBvZiB0aGUgcGFyc2VkIHZhbHVlIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBiZSBjZXJ0YWluIHRoYXQgdGhlIHN0cmluZyByZXByZXNlbnRzIGEgdmFsaWQgSlNPTiBvYmplY3QuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkSnNvbiAmJiB0eXBlb2YgcGFyc2VkSnNvbiA9PT0gXCJvYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgPyBwYXJzZWRKc29uXHJcbiAgICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGZldGNoZXMgdGhlIGVudHJ5IGZyb20gdGhlIGJyb3dzZXIgc3RvcmFnZSBiYXNlZCBvZmYgdGhlIGtleVxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBnZXRJdGVtKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogc2V0cyB0aGUgZW50cnkgaW4gdGhlIGJyb3dzZXIgc3RvcmFnZVxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZmV0Y2ggdGhlIGFjY291bnQgZW50aXR5IGZyb20gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEtleVxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50KGFjY291bnRLZXksIGxvZ2dlcikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY2NvdW50IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50RW50aXR5ID0gdGhpcy5nZXRDYWNoZWRBY2NvdW50RW50aXR5KGFjY291bnRLZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU91dGRhdGVkQ2FjaGVkQWNjb3VudChhY2NvdW50S2V5LCBhY2NvdW50RW50aXR5LCBsb2dnZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhY2NvdW50IGZyb20gY2FjaGUsIGRlc2VyaWFsaXplcyBpdCBpbnRvIGFuIGFjY291bnQgZW50aXR5IGFuZCByZXR1cm5zIGl0LlxyXG4gICAgICogSWYgYWNjb3VudCBpcyBub3QgZm91bmQgZnJvbSB0aGUga2V5LCByZXR1cm5zIG51bGwgYW5kIHJlbW92ZXMga2V5IGZyb20gbWFwLlxyXG4gICAgICogQHBhcmFtIGFjY291bnRLZXlcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldENhY2hlZEFjY291bnRFbnRpdHkoYWNjb3VudEtleSkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRBY2NvdW50ID0gdGhpcy5nZXRJdGVtKGFjY291bnRLZXkpO1xyXG4gICAgICAgIGlmICghc2VyaWFsaXplZEFjY291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcChhY2NvdW50S2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZEFjY291bnQgPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHNlcmlhbGl6ZWRBY2NvdW50KTtcclxuICAgICAgICBpZiAoIXBhcnNlZEFjY291bnQgfHwgIUFjY291bnRFbnRpdHkuaXNBY2NvdW50RW50aXR5KHBhcnNlZEFjY291bnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWNjb3VudEtleUZyb21NYXAoYWNjb3VudEtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ2FjaGVNYW5hZ2VyLnRvT2JqZWN0KG5ldyBBY2NvdW50RW50aXR5KCksIHBhcnNlZEFjY291bnQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBzZXQgYWNjb3VudCBlbnRpdHkgaW4gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBzZXRBY2NvdW50KGFjY291bnQpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QWNjb3VudCBjYWxsZWRcIik7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYWNjb3VudC5nZW5lcmF0ZUFjY291bnRLZXkoKTtcclxuICAgICAgICB0aGlzLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShhY2NvdW50KSk7XHJcbiAgICAgICAgdGhpcy5hZGRBY2NvdW50S2V5VG9NYXAoa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgYWNjb3VudCBrZXlzIGN1cnJlbnRseSBjYWNoZWRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnRLZXlzKCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY2NvdW50S2V5cyBjYWxsZWRcIik7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEtleXMgPSB0aGlzLmdldEl0ZW0oU3RhdGljQ2FjaGVLZXlzLkFDQ09VTlRfS0VZUyk7XHJcbiAgICAgICAgaWYgKGFjY291bnRLZXlzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGFjY291bnRLZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjb3VudEtleXMgLSBObyBhY2NvdW50IGtleXMgZm91bmRcIik7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBuZXcgYWNjb3VudCB0byB0aGUga2V5IG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBhZGRBY2NvdW50S2V5VG9NYXAoa2V5KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmFkZEFjY291bnRLZXlUb01hcCBjYWxsZWRcIik7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2VQaWkoYEJyb3dzZXJDYWNoZU1hbmFnZXIuYWRkQWNjb3VudEtleVRvTWFwIGNhbGxlZCB3aXRoIGtleTogJHtrZXl9YCk7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEtleXMgPSB0aGlzLmdldEFjY291bnRLZXlzKCk7XHJcbiAgICAgICAgaWYgKGFjY291bnRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgLy8gT25seSBhZGQga2V5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIG1hcFxyXG4gICAgICAgICAgICBhY2NvdW50S2V5cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SXRlbShTdGF0aWNDYWNoZUtleXMuQUNDT1VOVF9LRVlTLCBKU09OLnN0cmluZ2lmeShhY2NvdW50S2V5cykpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5hZGRBY2NvdW50S2V5VG9NYXAgYWNjb3VudCBrZXkgYWRkZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5hZGRBY2NvdW50S2V5VG9NYXAgYWNjb3VudCBrZXkgYWxyZWFkeSBleGlzdHMgaW4gbWFwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFuIGFjY291bnQgZnJvbSB0aGUga2V5IG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICByZW1vdmVBY2NvdW50S2V5RnJvbU1hcChrZXkpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIucmVtb3ZlQWNjb3VudEtleUZyb21NYXAgY2FsbGVkXCIpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlUGlpKGBCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwIGNhbGxlZCB3aXRoIGtleTogJHtrZXl9YCk7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEtleXMgPSB0aGlzLmdldEFjY291bnRLZXlzKCk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZhbEluZGV4ID0gYWNjb3VudEtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChyZW1vdmFsSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBhY2NvdW50S2V5cy5zcGxpY2UocmVtb3ZhbEluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKFN0YXRpY0NhY2hlS2V5cy5BQ0NPVU5UX0tFWVMsIEpTT04uc3RyaW5naWZ5KGFjY291bnRLZXlzKSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBhY2NvdW50IGtleSByZW1vdmVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwIGtleSBub3QgZm91bmQgaW4gZXhpc3RpbmcgbWFwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRXh0ZW5kcyBpbmhlcml0ZWQgcmVtb3ZlQWNjb3VudCBmdW5jdGlvbiB0byBpbmNsdWRlIHJlbW92YWwgb2YgdGhlIGFjY291bnQga2V5IGZyb20gdGhlIG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICBhc3luYyByZW1vdmVBY2NvdW50KGtleSkge1xyXG4gICAgICAgIHZvaWQgc3VwZXIucmVtb3ZlQWNjb3VudChrZXkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWNjb3VudEtleUZyb21NYXAoa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFjY291bnQgZW50aXR5IGZyb20gdGhlIHBsYXRmb3JtIGNhY2hlIGlmIGl0J3Mgb3V0ZGF0ZWRcclxuICAgICAqIEBwYXJhbSBhY2NvdW50S2V5XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZU91dGRhdGVkQWNjb3VudChhY2NvdW50S2V5KSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGFjY291bnRLZXkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWNjb3VudEtleUZyb21NYXAoYWNjb3VudEtleSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgZ2l2ZW4gaWRUb2tlbiBmcm9tIHRoZSBjYWNoZSBhbmQgZnJvbSB0aGUga2V5IG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICByZW1vdmVJZFRva2VuKGtleSkge1xyXG4gICAgICAgIHN1cGVyLnJlbW92ZUlkVG9rZW4oa2V5KTtcclxuICAgICAgICB0aGlzLnJlbW92ZVRva2VuS2V5KGtleSwgQ3JlZGVudGlhbFR5cGUuSURfVE9LRU4pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGFjY2Vzc1Rva2VuIGZyb20gdGhlIGNhY2hlIGFuZCBmcm9tIHRoZSBrZXkgbWFwXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlbW92ZUFjY2Vzc1Rva2VuKGtleSkge1xyXG4gICAgICAgIHZvaWQgc3VwZXIucmVtb3ZlQWNjZXNzVG9rZW4oa2V5KTtcclxuICAgICAgICB0aGlzLnJlbW92ZVRva2VuS2V5KGtleSwgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBnaXZlbiByZWZyZXNoVG9rZW4gZnJvbSB0aGUgY2FjaGUgYW5kIGZyb20gdGhlIGtleSBtYXBcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlUmVmcmVzaFRva2VuKGtleSkge1xyXG4gICAgICAgIHN1cGVyLnJlbW92ZVJlZnJlc2hUb2tlbihrZXkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlVG9rZW5LZXkoa2V5LCBDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUga2V5cyBmb3IgdGhlIGNhY2hlZCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xpZW50SWRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldFRva2VuS2V5cygpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VG9rZW5LZXlzIGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKGAke1N0YXRpY0NhY2hlS2V5cy5UT0tFTl9LRVlTfS4ke3RoaXMuY2xpZW50SWR9YCk7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgY29uc3QgdG9rZW5LZXlzID0gdGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihpdGVtKTtcclxuICAgICAgICAgICAgaWYgKHRva2VuS2V5cyAmJlxyXG4gICAgICAgICAgICAgICAgdG9rZW5LZXlzLmhhc093blByb3BlcnR5KFwiaWRUb2tlblwiKSAmJlxyXG4gICAgICAgICAgICAgICAgdG9rZW5LZXlzLmhhc093blByb3BlcnR5KFwiYWNjZXNzVG9rZW5cIikgJiZcclxuICAgICAgICAgICAgICAgIHRva2VuS2V5cy5oYXNPd25Qcm9wZXJ0eShcInJlZnJlc2hUb2tlblwiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuS2V5cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUb2tlbktleXMgLSBUb2tlbiBrZXlzIGZvdW5kIGJ1dCBpbiBhbiB1bmtub3duIGZvcm1hdC4gUmV0dXJuaW5nIGVtcHR5IGtleSBtYXAuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUb2tlbktleXMgLSBObyB0b2tlbiBrZXlzIGZvdW5kXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZFRva2VuOiBbXSxcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IFtdLFxyXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIGtleSB0byB0aGUgdG9rZW4ga2V5IG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIHR5cGVcclxuICAgICAqL1xyXG4gICAgYWRkVG9rZW5LZXkoa2V5LCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyIGFkZFRva2VuS2V5IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIENyZWRlbnRpYWxUeXBlLklEX1RPS0VOOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRva2VuS2V5cy5pZFRva2VuLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlckNhY2hlTWFuYWdlcjogYWRkVG9rZW5LZXkgLSBpZFRva2VuIGFkZGVkIHRvIG1hcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbktleXMuaWRUb2tlbi5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDcmVkZW50aWFsVHlwZS5BQ0NFU1NfVE9LRU46XHJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5LZXlzLmFjY2Vzc1Rva2VuLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlckNhY2hlTWFuYWdlcjogYWRkVG9rZW5LZXkgLSBhY2Nlc3NUb2tlbiBhZGRlZCB0byBtYXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5LZXlzLmFjY2Vzc1Rva2VuLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENyZWRlbnRpYWxUeXBlLlJFRlJFU0hfVE9LRU46XHJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5LZXlzLnJlZnJlc2hUb2tlbi5pbmRleE9mKGtleSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIkJyb3dzZXJDYWNoZU1hbmFnZXI6IGFkZFRva2VuS2V5IC0gcmVmcmVzaFRva2VuIGFkZGVkIHRvIG1hcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbktleXMucmVmcmVzaFRva2VuLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEJyb3dzZXJDYWNoZU1hbmFnZXI6YWRkVG9rZW5LZXkgLSBDcmVkZW50aWFsVHlwZSBwcm92aWRlZCBpbnZhbGlkLiBDcmVkZW50aWFsVHlwZTogJHt0eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKENsaWVudEF1dGhFcnJvckNvZGVzLnVuZXhwZWN0ZWRDcmVkZW50aWFsVHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0SXRlbShgJHtTdGF0aWNDYWNoZUtleXMuVE9LRU5fS0VZU30uJHt0aGlzLmNsaWVudElkfWAsIEpTT04uc3RyaW5naWZ5KHRva2VuS2V5cykpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgdG9rZW4ga2V5IG1hcFxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIHR5cGVcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVG9rZW5LZXkoa2V5LCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyIHJlbW92ZVRva2VuS2V5IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIENyZWRlbnRpYWxUeXBlLklEX1RPS0VOOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mb1BpaShgQnJvd3NlckNhY2hlTWFuYWdlcjogcmVtb3ZlVG9rZW5LZXkgLSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBpZFRva2VuIHdpdGgga2V5OiAke2tleX0gZnJvbSBtYXBgKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkUmVtb3ZhbCA9IHRva2VuS2V5cy5pZFRva2VuLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChpZFJlbW92YWwgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiByZW1vdmVUb2tlbktleSAtIGlkVG9rZW4gcmVtb3ZlZCBmcm9tIG1hcFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0b2tlbktleXMuaWRUb2tlbi5zcGxpY2UoaWRSZW1vdmFsLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiByZW1vdmVUb2tlbktleSAtIGlkVG9rZW4gZG9lcyBub3QgZXhpc3QgaW4gbWFwLiBFaXRoZXIgaXQgd2FzIHByZXZpb3VzbHkgcmVtb3ZlZCBvciBpdCB3YXMgbmV2ZXIgYWRkZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mb1BpaShgQnJvd3NlckNhY2hlTWFuYWdlcjogcmVtb3ZlVG9rZW5LZXkgLSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhY2Nlc3NUb2tlbiB3aXRoIGtleTogJHtrZXl9IGZyb20gbWFwYCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NSZW1vdmFsID0gdG9rZW5LZXlzLmFjY2Vzc1Rva2VuLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NSZW1vdmFsID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlckNhY2hlTWFuYWdlcjogcmVtb3ZlVG9rZW5LZXkgLSBhY2Nlc3NUb2tlbiByZW1vdmVkIGZyb20gbWFwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuS2V5cy5hY2Nlc3NUb2tlbi5zcGxpY2UoYWNjZXNzUmVtb3ZhbCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQnJvd3NlckNhY2hlTWFuYWdlcjogcmVtb3ZlVG9rZW5LZXkgLSBhY2Nlc3NUb2tlbiBkb2VzIG5vdCBleGlzdCBpbiBtYXAuIEVpdGhlciBpdCB3YXMgcHJldmlvdXNseSByZW1vdmVkIG9yIGl0IHdhcyBuZXZlciBhZGRlZC5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mb1BpaShgQnJvd3NlckNhY2hlTWFuYWdlcjogcmVtb3ZlVG9rZW5LZXkgLSBhdHRlbXB0aW5nIHRvIHJlbW92ZSByZWZyZXNoVG9rZW4gd2l0aCBrZXk6ICR7a2V5fSBmcm9tIG1hcGApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmcmVzaFJlbW92YWwgPSB0b2tlbktleXMucmVmcmVzaFRva2VuLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoUmVtb3ZhbCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIkJyb3dzZXJDYWNoZU1hbmFnZXI6IHJlbW92ZVRva2VuS2V5IC0gcmVmcmVzaFRva2VuIHJlbW92ZWQgZnJvbSBtYXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5LZXlzLnJlZnJlc2hUb2tlbi5zcGxpY2UocmVmcmVzaFJlbW92YWwsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIkJyb3dzZXJDYWNoZU1hbmFnZXI6IHJlbW92ZVRva2VuS2V5IC0gcmVmcmVzaFRva2VuIGRvZXMgbm90IGV4aXN0IGluIG1hcC4gRWl0aGVyIGl0IHdhcyBwcmV2aW91c2x5IHJlbW92ZWQgb3IgaXQgd2FzIG5ldmVyIGFkZGVkLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEJyb3dzZXJDYWNoZU1hbmFnZXI6cmVtb3ZlVG9rZW5LZXkgLSBDcmVkZW50aWFsVHlwZSBwcm92aWRlZCBpbnZhbGlkLiBDcmVkZW50aWFsVHlwZTogJHt0eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKENsaWVudEF1dGhFcnJvckNvZGVzLnVuZXhwZWN0ZWRDcmVkZW50aWFsVHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0SXRlbShgJHtTdGF0aWNDYWNoZUtleXMuVE9LRU5fS0VZU30uJHt0aGlzLmNsaWVudElkfWAsIEpTT04uc3RyaW5naWZ5KHRva2VuS2V5cykpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBnZW5lcmF0ZXMgaWRUb2tlbiBlbnRpdHkgZnJvbSBhIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGlkVG9rZW5LZXlcclxuICAgICAqL1xyXG4gICAgZ2V0SWRUb2tlbkNyZWRlbnRpYWwoaWRUb2tlbktleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRJdGVtKGlkVG9rZW5LZXkpO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldElkVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdFwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2tlbktleShpZFRva2VuS2V5LCBDcmVkZW50aWFsVHlwZS5JRF9UT0tFTik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZWRJZFRva2VuID0gdGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih2YWx1ZSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWRJZFRva2VuIHx8ICFDYWNoZUhlbHBlcnMuaXNJZFRva2VuRW50aXR5KHBhcnNlZElkVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRJZFRva2VuQ3JlZGVudGlhbDogY2FsbGVkLCBubyBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVG9rZW5LZXkoaWRUb2tlbktleSwgQ3JlZGVudGlhbFR5cGUuSURfVE9LRU4pO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldElkVG9rZW5DcmVkZW50aWFsOiBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZElkVG9rZW47XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCBJZFRva2VuIGNyZWRlbnRpYWwgdG8gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlblxyXG4gICAgICovXHJcbiAgICBzZXRJZFRva2VuQ3JlZGVudGlhbChpZFRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldElkVG9rZW5DcmVkZW50aWFsIGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBpZFRva2VuS2V5ID0gQ2FjaGVIZWxwZXJzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShpZFRva2VuKTtcclxuICAgICAgICB0aGlzLnNldEl0ZW0oaWRUb2tlbktleSwgSlNPTi5zdHJpbmdpZnkoaWRUb2tlbikpO1xyXG4gICAgICAgIHRoaXMuYWRkVG9rZW5LZXkoaWRUb2tlbktleSwgQ3JlZGVudGlhbFR5cGUuSURfVE9LRU4pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBnZW5lcmF0ZXMgYWNjZXNzVG9rZW4gZW50aXR5IGZyb20gYSBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGFjY2Vzc1Rva2VuS2V5KSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEl0ZW0oYWNjZXNzVG9rZW5LZXkpO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbDogY2FsbGVkLCBubyBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVG9rZW5LZXkoYWNjZXNzVG9rZW5LZXksIENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZWRBY2Nlc3NUb2tlbiA9IHRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24odmFsdWUpO1xyXG4gICAgICAgIGlmICghcGFyc2VkQWNjZXNzVG9rZW4gfHxcclxuICAgICAgICAgICAgIUNhY2hlSGVscGVycy5pc0FjY2Vzc1Rva2VuRW50aXR5KHBhcnNlZEFjY2Vzc1Rva2VuKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdFwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2tlbktleShhY2Nlc3NUb2tlbktleSwgQ3JlZGVudGlhbFR5cGUuQUNDRVNTX1RPS0VOKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWw6IGNhY2hlIGhpdFwiKTtcclxuICAgICAgICByZXR1cm4gcGFyc2VkQWNjZXNzVG9rZW47XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCBhY2Nlc3NUb2tlbiBjcmVkZW50aWFsIHRvIHRoZSBwbGF0Zm9ybSBjYWNoZVxyXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuXHJcbiAgICAgKi9cclxuICAgIHNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwgY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuS2V5ID0gQ2FjaGVIZWxwZXJzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShhY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgdGhpcy5zZXRJdGVtKGFjY2Vzc1Rva2VuS2V5LCBKU09OLnN0cmluZ2lmeShhY2Nlc3NUb2tlbikpO1xyXG4gICAgICAgIHRoaXMuYWRkVG9rZW5LZXkoYWNjZXNzVG9rZW5LZXksIENyZWRlbnRpYWxUeXBlLkFDQ0VTU19UT0tFTik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGdlbmVyYXRlcyByZWZyZXNoVG9rZW4gZW50aXR5IGZyb20gYSBzdHJpbmdcclxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW5LZXlcclxuICAgICAqL1xyXG4gICAgZ2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChyZWZyZXNoVG9rZW5LZXkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0SXRlbShyZWZyZXNoVG9rZW5LZXkpO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRva2VuS2V5KHJlZnJlc2hUb2tlbktleSwgQ3JlZGVudGlhbFR5cGUuUkVGUkVTSF9UT0tFTik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZWRSZWZyZXNoVG9rZW4gPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHZhbHVlKTtcclxuICAgICAgICBpZiAoIXBhcnNlZFJlZnJlc2hUb2tlbiB8fFxyXG4gICAgICAgICAgICAhQ2FjaGVIZWxwZXJzLmlzUmVmcmVzaFRva2VuRW50aXR5KHBhcnNlZFJlZnJlc2hUb2tlbikpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRva2VuS2V5KHJlZnJlc2hUb2tlbktleSwgQ3JlZGVudGlhbFR5cGUuUkVGUkVTSF9UT0tFTik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbDogY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWRSZWZyZXNoVG9rZW47XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCByZWZyZXNoVG9rZW4gY3JlZGVudGlhbCB0byB0aGUgcGxhdGZvcm0gY2FjaGVcclxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW5cclxuICAgICAqL1xyXG4gICAgc2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChyZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbCBjYWxsZWRcIik7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuS2V5ID0gQ2FjaGVIZWxwZXJzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShyZWZyZXNoVG9rZW4pO1xyXG4gICAgICAgIHRoaXMuc2V0SXRlbShyZWZyZXNoVG9rZW5LZXksIEpTT04uc3RyaW5naWZ5KHJlZnJlc2hUb2tlbikpO1xyXG4gICAgICAgIHRoaXMuYWRkVG9rZW5LZXkocmVmcmVzaFRva2VuS2V5LCBDcmVkZW50aWFsVHlwZS5SRUZSRVNIX1RPS0VOKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZmV0Y2ggYXBwTWV0YWRhdGEgZW50aXR5IGZyb20gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gYXBwTWV0YWRhdGFLZXlcclxuICAgICAqL1xyXG4gICAgZ2V0QXBwTWV0YWRhdGEoYXBwTWV0YWRhdGFLZXkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0SXRlbShhcHBNZXRhZGF0YUtleSk7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QXBwTWV0YWRhdGE6IGNhbGxlZCwgbm8gY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFyc2VkTWV0YWRhdGEgPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHZhbHVlKTtcclxuICAgICAgICBpZiAoIXBhcnNlZE1ldGFkYXRhIHx8XHJcbiAgICAgICAgICAgICFDYWNoZUhlbHBlcnMuaXNBcHBNZXRhZGF0YUVudGl0eShhcHBNZXRhZGF0YUtleSwgcGFyc2VkTWV0YWRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBcHBNZXRhZGF0YTogY2FsbGVkLCBubyBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QXBwTWV0YWRhdGE6IGNhY2hlIGhpdFwiKTtcclxuICAgICAgICByZXR1cm4gcGFyc2VkTWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCBhcHBNZXRhZGF0YSBlbnRpdHkgdG8gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gYXBwTWV0YWRhdGFcclxuICAgICAqL1xyXG4gICAgc2V0QXBwTWV0YWRhdGEoYXBwTWV0YWRhdGEpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QXBwTWV0YWRhdGEgY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IGFwcE1ldGFkYXRhS2V5ID0gQ2FjaGVIZWxwZXJzLmdlbmVyYXRlQXBwTWV0YWRhdGFLZXkoYXBwTWV0YWRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2V0SXRlbShhcHBNZXRhZGF0YUtleSwgSlNPTi5zdHJpbmdpZnkoYXBwTWV0YWRhdGEpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZmV0Y2ggc2VydmVyIHRlbGVtZXRyeSBlbnRpdHkgZnJvbSB0aGUgcGxhdGZvcm0gY2FjaGVcclxuICAgICAqIEBwYXJhbSBzZXJ2ZXJUZWxlbWV0cnlLZXlcclxuICAgICAqL1xyXG4gICAgZ2V0U2VydmVyVGVsZW1ldHJ5KHNlcnZlclRlbGVtZXRyeUtleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRJdGVtKHNlcnZlclRlbGVtZXRyeUtleSk7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0U2VydmVyVGVsZW1ldHJ5OiBjYWxsZWQsIG5vIGNhY2hlIGhpdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZEVudGl0eSA9IHRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24odmFsdWUpO1xyXG4gICAgICAgIGlmICghcGFyc2VkRW50aXR5IHx8XHJcbiAgICAgICAgICAgICFDYWNoZUhlbHBlcnMuaXNTZXJ2ZXJUZWxlbWV0cnlFbnRpdHkoc2VydmVyVGVsZW1ldHJ5S2V5LCBwYXJzZWRFbnRpdHkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRTZXJ2ZXJUZWxlbWV0cnk6IGNhbGxlZCwgbm8gY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWRFbnRpdHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNldCBzZXJ2ZXIgdGVsZW1ldHJ5IGVudGl0eSB0byB0aGUgcGxhdGZvcm0gY2FjaGVcclxuICAgICAqIEBwYXJhbSBzZXJ2ZXJUZWxlbWV0cnlLZXlcclxuICAgICAqIEBwYXJhbSBzZXJ2ZXJUZWxlbWV0cnlcclxuICAgICAqL1xyXG4gICAgc2V0U2VydmVyVGVsZW1ldHJ5KHNlcnZlclRlbGVtZXRyeUtleSwgc2VydmVyVGVsZW1ldHJ5KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSBjYWxsZWRcIik7XHJcbiAgICAgICAgdGhpcy5zZXRJdGVtKHNlcnZlclRlbGVtZXRyeUtleSwgSlNPTi5zdHJpbmdpZnkoc2VydmVyVGVsZW1ldHJ5KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGdldEF1dGhvcml0eU1ldGFkYXRhKGtleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnRlcm5hbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhOiBjYWxsZWQsIG5vIGNhY2hlIGhpdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZE1ldGFkYXRhID0gdGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHBhcnNlZE1ldGFkYXRhICYmXHJcbiAgICAgICAgICAgIENhY2hlSGVscGVycy5pc0F1dGhvcml0eU1ldGFkYXRhRW50aXR5KGtleSwgcGFyc2VkTWV0YWRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBdXRob3JpdHlNZXRhZGF0YTogY2FjaGUgaGl0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkTWV0YWRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBnZXRBdXRob3JpdHlNZXRhZGF0YUtleXMoKSB7XHJcbiAgICAgICAgY29uc3QgYWxsS2V5cyA9IHRoaXMuaW50ZXJuYWxTdG9yYWdlLmdldEtleXMoKTtcclxuICAgICAgICByZXR1cm4gYWxsS2V5cy5maWx0ZXIoKGtleSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhvcml0eU1ldGFkYXRhKGtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgd3JhcHBlciBtZXRhZGF0YSBpbiBtZW1vcnlcclxuICAgICAqIEBwYXJhbSB3cmFwcGVyU0tVXHJcbiAgICAgKiBAcGFyYW0gd3JhcHBlclZlcnNpb25cclxuICAgICAqL1xyXG4gICAgc2V0V3JhcHBlck1ldGFkYXRhKHdyYXBwZXJTS1UsIHdyYXBwZXJWZXJzaW9uKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFN0b3JhZ2Uuc2V0SXRlbShJbk1lbW9yeUNhY2hlS2V5cy5XUkFQUEVSX1NLVSwgd3JhcHBlclNLVSk7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFN0b3JhZ2Uuc2V0SXRlbShJbk1lbW9yeUNhY2hlS2V5cy5XUkFQUEVSX1ZFUiwgd3JhcHBlclZlcnNpb24pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdyYXBwZXIgbWV0YWRhdGEgZnJvbSBpbi1tZW1vcnkgc3RvcmFnZVxyXG4gICAgICovXHJcbiAgICBnZXRXcmFwcGVyTWV0YWRhdGEoKSB7XHJcbiAgICAgICAgY29uc3Qgc2t1ID0gdGhpcy5pbnRlcm5hbFN0b3JhZ2UuZ2V0SXRlbShJbk1lbW9yeUNhY2hlS2V5cy5XUkFQUEVSX1NLVSkgfHxcclxuICAgICAgICAgICAgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5pbnRlcm5hbFN0b3JhZ2UuZ2V0SXRlbShJbk1lbW9yeUNhY2hlS2V5cy5XUkFQUEVSX1ZFUikgfHxcclxuICAgICAgICAgICAgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICByZXR1cm4gW3NrdSwgdmVyc2lvbl07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZW50aXR5XHJcbiAgICAgKi9cclxuICAgIHNldEF1dGhvcml0eU1ldGFkYXRhKGtleSwgZW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldEF1dGhvcml0eU1ldGFkYXRhIGNhbGxlZFwiKTtcclxuICAgICAgICB0aGlzLmludGVybmFsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50aXR5KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFjdGl2ZSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIGdldEFjdGl2ZUFjY291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlQWNjb3VudEtleUZpbHRlcnMgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoUGVyc2lzdGVudENhY2hlS2V5cy5BQ1RJVkVfQUNDT1VOVF9GSUxURVJTKTtcclxuICAgICAgICBjb25zdCBhY3RpdmVBY2NvdW50VmFsdWVGaWx0ZXJzID0gdGhpcy5nZXRJdGVtKGFjdGl2ZUFjY291bnRLZXlGaWx0ZXJzKTtcclxuICAgICAgICBpZiAoIWFjdGl2ZUFjY291bnRWYWx1ZUZpbHRlcnMpIHtcclxuICAgICAgICAgICAgLy8gaWYgbmV3IGFjdGl2ZSBhY2NvdW50IGNhY2hlIHR5cGUgaXNuJ3QgZm91bmQsIGl0J3MgYW4gb2xkIHZlcnNpb24sIHNvIGxvb2sgZm9yIHRoYXQgaW5zdGVhZFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWN0aXZlQWNjb3VudDogTm8gYWN0aXZlIGFjY291bnQgZmlsdGVycyBjYWNoZSBzY2hlbWEgZm91bmQsIGxvb2tpbmcgZm9yIGxlZ2FjeSBzY2hlbWFcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUFjY291bnRLZXlMb2NhbCA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShQZXJzaXN0ZW50Q2FjaGVLZXlzLkFDVElWRV9BQ0NPVU5UKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQWNjb3VudFZhbHVlTG9jYWwgPSB0aGlzLmdldEl0ZW0oYWN0aXZlQWNjb3VudEtleUxvY2FsKTtcclxuICAgICAgICAgICAgaWYgKCFhY3RpdmVBY2NvdW50VmFsdWVMb2NhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjdGl2ZUFjY291bnQ6IE5vIGFjdGl2ZSBhY2NvdW50IGZvdW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQWNjb3VudCA9IHRoaXMuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtcclxuICAgICAgICAgICAgICAgIGxvY2FsQWNjb3VudElkOiBhY3RpdmVBY2NvdW50VmFsdWVMb2NhbCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWN0aXZlQWNjb3VudDogTGVnYWN5IGFjdGl2ZSBhY2NvdW50IGNhY2hlIHNjaGVtYSBmb3VuZFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBBZGRpbmcgYWN0aXZlIGFjY291bnQgZmlsdGVycyBjYWNoZSBzY2hlbWFcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUFjY291bnQoYWN0aXZlQWNjb3VudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZlQWNjb3VudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWN0aXZlQWNjb3VudFZhbHVlT2JqID0gdGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihhY3RpdmVBY2NvdW50VmFsdWVGaWx0ZXJzKTtcclxuICAgICAgICBpZiAoYWN0aXZlQWNjb3VudFZhbHVlT2JqKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBBY3RpdmUgYWNjb3VudCBmaWx0ZXJzIHNjaGVtYSBmb3VuZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtcclxuICAgICAgICAgICAgICAgIGhvbWVBY2NvdW50SWQ6IGFjdGl2ZUFjY291bnRWYWx1ZU9iai5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQ6IGFjdGl2ZUFjY291bnRWYWx1ZU9iai5sb2NhbEFjY291bnRJZCxcclxuICAgICAgICAgICAgICAgIHRlbmFudElkOiBhY3RpdmVBY2NvdW50VmFsdWVPYmoudGVuYW50SWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWN0aXZlQWNjb3VudDogTm8gYWN0aXZlIGFjY291bnQgZm91bmRcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFjdGl2ZSBhY2NvdW50J3MgbG9jYWxBY2NvdW50SWQgaW4gY2FjaGVcclxuICAgICAqIEBwYXJhbSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIHNldEFjdGl2ZUFjY291bnQoYWNjb3VudCkge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUFjY291bnRLZXkgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoUGVyc2lzdGVudENhY2hlS2V5cy5BQ1RJVkVfQUNDT1VOVF9GSUxURVJTKTtcclxuICAgICAgICBjb25zdCBhY3RpdmVBY2NvdW50S2V5TG9jYWwgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoUGVyc2lzdGVudENhY2hlS2V5cy5BQ1RJVkVfQUNDT1VOVCk7XHJcbiAgICAgICAgaWYgKGFjY291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcInNldEFjdGl2ZUFjY291bnQ6IEFjdGl2ZSBhY2NvdW50IHNldFwiKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQWNjb3VudFZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgaG9tZUFjY291bnRJZDogYWNjb3VudC5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQ6IGFjY291bnQubG9jYWxBY2NvdW50SWQsXHJcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogYWNjb3VudC50ZW5hbnRJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJdGVtKGFjdGl2ZUFjY291bnRLZXksIEpTT04uc3RyaW5naWZ5KGFjdGl2ZUFjY291bnRWYWx1ZSkpO1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEl0ZW0oYWN0aXZlQWNjb3VudEtleUxvY2FsLCBhY2NvdW50LmxvY2FsQWNjb3VudElkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJzZXRBY3RpdmVBY2NvdW50OiBObyBhY2NvdW50IHBhc3NlZCwgYWN0aXZlIGFjY291bnQgbm90IHNldFwiKTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKGFjdGl2ZUFjY291bnRLZXkpO1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0oYWN0aXZlQWNjb3VudEtleUxvY2FsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGZldGNoIHRocm90dGxpbmcgZW50aXR5IGZyb20gdGhlIHBsYXRmb3JtIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gdGhyb3R0bGluZ0NhY2hlS2V5XHJcbiAgICAgKi9cclxuICAgIGdldFRocm90dGxpbmdDYWNoZSh0aHJvdHRsaW5nQ2FjaGVLZXkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0SXRlbSh0aHJvdHRsaW5nQ2FjaGVLZXkpO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFRocm90dGxpbmdDYWNoZTogY2FsbGVkLCBubyBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZWRUaHJvdHRsaW5nQ2FjaGUgPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHZhbHVlKTtcclxuICAgICAgICBpZiAoIXBhcnNlZFRocm90dGxpbmdDYWNoZSB8fFxyXG4gICAgICAgICAgICAhQ2FjaGVIZWxwZXJzLmlzVGhyb3R0bGluZ0VudGl0eSh0aHJvdHRsaW5nQ2FjaGVLZXksIHBhcnNlZFRocm90dGxpbmdDYWNoZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFRocm90dGxpbmdDYWNoZTogY2FsbGVkLCBubyBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWNoZSBoaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZFRocm90dGxpbmdDYWNoZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogc2V0IHRocm90dGxpbmcgZW50aXR5IHRvIHRoZSBwbGF0Zm9ybSBjYWNoZVxyXG4gICAgICogQHBhcmFtIHRocm90dGxpbmdDYWNoZUtleVxyXG4gICAgICogQHBhcmFtIHRocm90dGxpbmdDYWNoZVxyXG4gICAgICovXHJcbiAgICBzZXRUaHJvdHRsaW5nQ2FjaGUodGhyb3R0bGluZ0NhY2hlS2V5LCB0aHJvdHRsaW5nQ2FjaGUpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0VGhyb3R0bGluZ0NhY2hlIGNhbGxlZFwiKTtcclxuICAgICAgICB0aGlzLnNldEl0ZW0odGhyb3R0bGluZ0NhY2hlS2V5LCBKU09OLnN0cmluZ2lmeSh0aHJvdHRsaW5nQ2FjaGUpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBjYWNoZSBpdGVtIHdpdGggZ2l2ZW4ga2V5LlxyXG4gICAgICogV2lsbCByZXRyaWV2ZSBmcm9tIGNvb2tpZXMgaWYgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSBpcyBzZXQgdG8gdHJ1ZS5cclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgZ2V0VGVtcG9yYXJ5Q2FjaGUoY2FjaGVLZXksIGdlbmVyYXRlS2V5KSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gZ2VuZXJhdGVLZXkgPyB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoY2FjaGVLZXkpIDogY2FjaGVLZXk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVDb25maWcuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29va2llID0gdGhpcy5jb29raWVTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1Db29raWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogc3RvcmVBdXRoU3RhdGVJbkNvb2tpZXMgc2V0IHRvIHRydWUsIHJldHJpZXZpbmcgZnJvbSBjb29raWVzXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1Db29raWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0ZW1wIGNhY2hlIGl0ZW0gbm90IGZvdW5kIGluIHNlc3Npb24vbWVtb3J5LCBjaGVjayBsb2NhbCBzdG9yYWdlIGZvciBpdGVtcyBzZXQgYnkgb2xkIHZlcnNpb25zXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlQ29uZmlnLmNhY2hlTG9jYXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICBCcm93c2VyQ2FjaGVMb2NhdGlvbi5Mb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFRlbXBvcmFyeUNhY2hlOiBUZW1wb3JhcnkgY2FjaGUgaXRlbSBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogTm8gY2FjaGUgaXRlbSBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFRlbXBvcmFyeUNhY2hlOiBUZW1wb3JhcnkgY2FjaGUgaXRlbSByZXR1cm5lZFwiKTtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNhY2hlIGl0ZW0gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZSBnaXZlbi5cclxuICAgICAqIFN0b3JlcyBpbiBjb29raWUgaWYgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSBpcyBzZXQgdG8gdHJ1ZS5cclxuICAgICAqIFRoaXMgY2FuIGNhdXNlIGNvb2tpZSBvdmVyZmxvdyBpZiB1c2VkIGluY29ycmVjdGx5LlxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHNldFRlbXBvcmFyeUNhY2hlKGNhY2hlS2V5LCB2YWx1ZSwgZ2VuZXJhdGVLZXkpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBnZW5lcmF0ZUtleSA/IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShjYWNoZUtleSkgOiBjYWNoZUtleTtcclxuICAgICAgICB0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlQ29uZmlnLnN0b3JlQXV0aFN0YXRlSW5Db29raWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFRlbXBvcmFyeUNhY2hlOiBzdG9yZUF1dGhTdGF0ZUluQ29va2llIHNldCB0byB0cnVlLCBzZXR0aW5nIGl0ZW0gY29va2llXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuY2FjaGVDb25maWcuc2VjdXJlQ29va2llcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBjYWNoZSBpdGVtIHdpdGggdGhlIGdpdmVuIGtleS5cclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IGNhY2hlIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogV2lsbCBhbHNvIGNsZWFyIHRoZSBjb29raWUgaXRlbSBpZiBzdG9yZUF1dGhTdGF0ZUluQ29va2llIGlzIHNldCB0byB0cnVlLlxyXG4gICAgICogQHBhcmFtIGtleVxyXG4gICAgICovXHJcbiAgICByZW1vdmVUZW1wb3JhcnlJdGVtKGtleSkge1xyXG4gICAgICAgIHRoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZUNvbmZpZy5zdG9yZUF1dGhTdGF0ZUluQ29va2llKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVJdGVtOiBzdG9yZUF1dGhTdGF0ZUluQ29va2llIGlzIHRydWUsIGNsZWFyaW5nIGl0ZW0gY29va2llXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwga2V5cyBpbiB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIGdldEtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0S2V5cygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgYWxsIGNhY2hlIGVudHJpZXMgY3JlYXRlZCBieSBNU0FMLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBjbGVhcigpIHtcclxuICAgICAgICAvLyBSZW1vdmVzIGFsbCBhY2NvdW50cyBhbmQgdGhlaXIgY3JlZGVudGlhbHNcclxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUFsbEFjY291bnRzKCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBcHBNZXRhZGF0YSgpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0ZW1wIHN0b3JhZ2UgZmlyc3QgdG8gbWFrZSBzdXJlIGFueSBjb29raWVzIGFyZSBjbGVhcmVkXHJcbiAgICAgICAgdGhpcy50ZW1wb3JhcnlDYWNoZVN0b3JhZ2UuZ2V0S2V5cygpLmZvckVhY2goKGNhY2hlS2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZUtleS5pbmRleE9mKENvbnN0YW50cy5DQUNIRV9QUkVGSVgpICE9PSAtMSB8fFxyXG4gICAgICAgICAgICAgICAgY2FjaGVLZXkuaW5kZXhPZih0aGlzLmNsaWVudElkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbShjYWNoZUtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBSZW1vdmVzIGFsbCByZW1haW5pbmcgTVNBTCBjYWNoZSBpdGVtc1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0S2V5cygpLmZvckVhY2goKGNhY2hlS2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZUtleS5pbmRleE9mKENvbnN0YW50cy5DQUNIRV9QUkVGSVgpICE9PSAtMSB8fFxyXG4gICAgICAgICAgICAgICAgY2FjaGVLZXkuaW5kZXhPZih0aGlzLmNsaWVudElkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShjYWNoZUtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmludGVybmFsU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgYWxsIGFjY2VzcyB0b2tlcyB0aGF0IGhhdmUgY2xhaW1zIHByaW9yIHRvIHNhdmluZyB0aGUgY3VycmVudCBvbmVcclxuICAgICAqIEBwYXJhbSBwZXJmb3JtYW5jZUNsaWVudCB7SVBlcmZvcm1hbmNlQ2xpZW50fVxyXG4gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQge3N0cmluZ30gY29ycmVsYXRpb24gaWRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMocGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBwZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHRva2VuS2V5cyA9IHRoaXMuZ2V0VG9rZW5LZXlzKCk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZEFjY2Vzc1Rva2VucyA9IFtdO1xyXG4gICAgICAgIHRva2VuS2V5cy5hY2Nlc3NUb2tlbi5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgLy8gaWYgdGhlIGFjY2VzcyB0b2tlbiBoYXMgY2xhaW1zIGluIGl0cyBrZXksIHJlbW92ZSB0aGUgdG9rZW4ga2V5IGFuZCB0aGUgdG9rZW5cclxuICAgICAgICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChjcmVkZW50aWFsPy5yZXF1ZXN0ZWRDbGFpbXNIYXNoICYmXHJcbiAgICAgICAgICAgICAgICBrZXkuaW5jbHVkZXMoY3JlZGVudGlhbC5yZXF1ZXN0ZWRDbGFpbXNIYXNoLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVkQWNjZXNzVG9rZW5zLnB1c2godGhpcy5yZW1vdmVBY2Nlc3NUb2tlbihrZXkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlbW92ZWRBY2Nlc3NUb2tlbnMpO1xyXG4gICAgICAgIC8vIHdhcm4gaWYgYW55IGFjY2VzcyB0b2tlbnMgYXJlIHJlbW92ZWRcclxuICAgICAgICBpZiAocmVtb3ZlZEFjY2Vzc1Rva2Vucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoYCR7cmVtb3ZlZEFjY2Vzc1Rva2Vucy5sZW5ndGh9IGFjY2VzcyB0b2tlbnMgd2l0aCBjbGFpbXMgaW4gdGhlIGNhY2hlIGtleXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwZW5kIG1zYWwuPGNsaWVudC1pZD4gdG8gZWFjaCBrZXk7IFNraXAgZm9yIGFueSBKU09OIG9iamVjdCBhcyBLZXkgKGRlZmluZWQgc2NoZW1hcyBkbyBub3QgbmVlZCB0aGUga2V5IGFwcGVuZGVkOiBBY2Nlc3NUb2tlbiBLZXlzIG9yIHRoZSB1cGNvbWluZyBzY2hlbWEpXHJcbiAgICAgKiBAcGFyYW0ga2V5XHJcbiAgICAgKiBAcGFyYW0gYWRkSW5zdGFuY2VJZFxyXG4gICAgICovXHJcbiAgICBnZW5lcmF0ZUNhY2hlS2V5KGtleSkge1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZEtleSA9IHRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24oa2V5KTtcclxuICAgICAgICBpZiAoIWdlbmVyYXRlZEtleSkge1xyXG4gICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuc3RhcnRzV2l0aChrZXksIENvbnN0YW50cy5DQUNIRV9QUkVGSVgpIHx8XHJcbiAgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5zdGFydHNXaXRoKGtleSwgUGVyc2lzdGVudENhY2hlS2V5cy5BREFMX0lEX1RPS0VOKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7Q29uc3RhbnRzLkNBQ0hFX1BSRUZJWH0uJHt0aGlzLmNsaWVudElkfS4ke2tleX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGF1dGhvcml0eUtleSB0byBjYWNoZSBhdXRob3JpdHlcclxuICAgICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAgICovXHJcbiAgICBnZW5lcmF0ZUF1dGhvcml0eUtleShzdGF0ZVN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHsgbGlicmFyeVN0YXRlOiB7IGlkOiBzdGF0ZUlkIH0sIH0gPSBQcm90b2NvbFV0aWxzLnBhcnNlUmVxdWVzdFN0YXRlKHRoaXMuY3J5cHRvSW1wbCwgc3RhdGVTdHJpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoYCR7VGVtcG9yYXJ5Q2FjaGVLZXlzLkFVVEhPUklUWX0uJHtzdGF0ZUlkfWApO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgTm9uY2Uga2V5IHRvIGNhY2hlIG5vbmNlXHJcbiAgICAgKiBAcGFyYW0gc3RhdGVcclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVOb25jZUtleShzdGF0ZVN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHsgbGlicmFyeVN0YXRlOiB7IGlkOiBzdGF0ZUlkIH0sIH0gPSBQcm90b2NvbFV0aWxzLnBhcnNlUmVxdWVzdFN0YXRlKHRoaXMuY3J5cHRvSW1wbCwgc3RhdGVTdHJpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoYCR7VGVtcG9yYXJ5Q2FjaGVLZXlzLk5PTkNFX0lEVE9LRU59LiR7c3RhdGVJZH1gKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBmdWxsIGNhY2hlIGtleSBmb3IgdGhlIHJlcXVlc3Qgc3RhdGVcclxuICAgICAqIEBwYXJhbSBzdGF0ZVN0cmluZyBTdGF0ZSBzdHJpbmcgZm9yIHRoZSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlU3RhdGVLZXkoc3RhdGVTdHJpbmcpIHtcclxuICAgICAgICAvLyBVc2UgdGhlIGxpYnJhcnkgc3RhdGUgaWQgdG8ga2V5IHRlbXAgc3RvcmFnZSBmb3IgdW5pcXVlbmVzcyBmb3IgbXVsdGlwbGUgY29uY3VycmVudCByZXF1ZXN0c1xyXG4gICAgICAgIGNvbnN0IHsgbGlicmFyeVN0YXRlOiB7IGlkOiBzdGF0ZUlkIH0sIH0gPSBQcm90b2NvbFV0aWxzLnBhcnNlUmVxdWVzdFN0YXRlKHRoaXMuY3J5cHRvSW1wbCwgc3RhdGVTdHJpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoYCR7VGVtcG9yYXJ5Q2FjaGVLZXlzLlJFUVVFU1RfU1RBVEV9LiR7c3RhdGVJZH1gKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY2FjaGVkIGF1dGhvcml0eSBiYXNlZCBvbiB0aGUgY2FjaGVkIHN0YXRlLiBSZXR1cm5zIGVtcHR5IGlmIG5vIGNhY2hlZCBzdGF0ZSBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FjaGVkQXV0aG9yaXR5KGNhY2hlZFN0YXRlKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGVDYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZUtleShjYWNoZWRTdGF0ZSk7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFRlbXBvcmFyeUNhY2hlKHN0YXRlQ2FjaGVLZXkpO1xyXG4gICAgICAgIGlmICghc3RhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF1dGhvcml0eUNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZUF1dGhvcml0eUtleShzdGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoYXV0aG9yaXR5Q2FjaGVLZXkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGFjY291bnQsIGF1dGhvcml0eSwgYW5kIHN0YXRlIGluIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gc2VydmVyQXV0aGVudGljYXRpb25SZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVDYWNoZUVudHJpZXMoc3RhdGUsIG5vbmNlLCBhdXRob3JpdHlJbnN0YW5jZSwgbG9naW5IaW50LCBhY2NvdW50KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnVwZGF0ZUNhY2hlRW50cmllcyBjYWxsZWRcIik7XHJcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlcXVlc3Qgc3RhdGVcclxuICAgICAgICBjb25zdCBzdGF0ZUNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZVN0YXRlS2V5KHN0YXRlKTtcclxuICAgICAgICB0aGlzLnNldFRlbXBvcmFyeUNhY2hlKHN0YXRlQ2FjaGVLZXksIHN0YXRlLCBmYWxzZSk7XHJcbiAgICAgICAgLy8gQ2FjaGUgdGhlIG5vbmNlXHJcbiAgICAgICAgY29uc3Qgbm9uY2VDYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVOb25jZUtleShzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUZW1wb3JhcnlDYWNoZShub25jZUNhY2hlS2V5LCBub25jZSwgZmFsc2UpO1xyXG4gICAgICAgIC8vIENhY2hlIGF1dGhvcml0eUtleVxyXG4gICAgICAgIGNvbnN0IGF1dGhvcml0eUNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZUF1dGhvcml0eUtleShzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUZW1wb3JhcnlDYWNoZShhdXRob3JpdHlDYWNoZUtleSwgYXV0aG9yaXR5SW5zdGFuY2UsIGZhbHNlKTtcclxuICAgICAgICBpZiAoYWNjb3VudCkge1xyXG4gICAgICAgICAgICBjb25zdCBjY3NDcmVkZW50aWFsID0ge1xyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbDogYWNjb3VudC5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogQ2NzQ3JlZGVudGlhbFR5cGUuSE9NRV9BQ0NPVU5UX0lELFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNldFRlbXBvcmFyeUNhY2hlKFRlbXBvcmFyeUNhY2hlS2V5cy5DQ1NfQ1JFREVOVElBTCwgSlNPTi5zdHJpbmdpZnkoY2NzQ3JlZGVudGlhbCksIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb2dpbkhpbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2NzQ3JlZGVudGlhbCA9IHtcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IGxvZ2luSGludCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IENjc0NyZWRlbnRpYWxUeXBlLlVQTixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5zZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuQ0NTX0NSRURFTlRJQUwsIEpTT04uc3RyaW5naWZ5KGNjc0NyZWRlbnRpYWwpLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0IGFsbCB0ZW1wb3JhcnkgY2FjaGUgaXRlbXNcclxuICAgICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAgICovXHJcbiAgICByZXNldFJlcXVlc3RDYWNoZShzdGF0ZSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5yZXNldFJlcXVlc3RDYWNoZSBjYWxsZWRcIik7XHJcbiAgICAgICAgLy8gY2hlY2sgc3RhdGUgYW5kIHJlbW92ZSBhc3NvY2lhdGVkIGNhY2hlIGl0ZW1zXHJcbiAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLmdldEtleXMoKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihzdGF0ZSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgZ2VuZXJpYyBpbnRlcmFjdGl2ZSByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKHRoaXMuZ2VuZXJhdGVTdGF0ZUtleShzdGF0ZSkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZU5vbmNlS2V5KHN0YXRlKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQXV0aG9yaXR5S2V5KHN0YXRlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoVGVtcG9yYXJ5Q2FjaGVLZXlzLlJFUVVFU1RfUEFSQU1TKSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKHRoaXMuZ2VuZXJhdGVDYWNoZUtleShUZW1wb3JhcnlDYWNoZUtleXMuT1JJR0lOX1VSSSkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoVGVtcG9yYXJ5Q2FjaGVLZXlzLlVSTF9IQVNIKSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKHRoaXMuZ2VuZXJhdGVDYWNoZUtleShUZW1wb3JhcnlDYWNoZUtleXMuQ09SUkVMQVRJT05fSUQpKTtcclxuICAgICAgICB0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KFRlbXBvcmFyeUNhY2hlS2V5cy5DQ1NfQ1JFREVOVElBTCkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoVGVtcG9yYXJ5Q2FjaGVLZXlzLk5BVElWRV9SRVFVRVNUKSk7XHJcbiAgICAgICAgdGhpcy5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRlbXBvcmFyeSBjYWNoZSBmb3IgdGhlIHByb3ZpZGVkIHN0YXRlXHJcbiAgICAgKiBAcGFyYW0gc3RhdGVTdHJpbmdcclxuICAgICAqL1xyXG4gICAgY2xlYW5SZXF1ZXN0QnlTdGF0ZShzdGF0ZVN0cmluZykge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5jbGVhblJlcXVlc3RCeVN0YXRlIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBJbnRlcmFjdGlvbiBpcyBjb21wbGV0ZWQgLSByZW1vdmUgaW50ZXJhY3Rpb24gc3RhdHVzLlxyXG4gICAgICAgIGlmIChzdGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZUtleSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZUtleShzdGF0ZVN0cmluZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZFN0YXRlID0gdGhpcy50ZW1wb3JhcnlDYWNoZVN0b3JhZ2UuZ2V0SXRlbShzdGF0ZUtleSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm9QaWkoYEJyb3dzZXJDYWNoZU1hbmFnZXIuY2xlYW5SZXF1ZXN0QnlTdGF0ZTogUmVtb3ZpbmcgdGVtcG9yYXJ5IGNhY2hlIGl0ZW1zIGZvciBzdGF0ZTogJHtjYWNoZWRTdGF0ZX1gKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFJlcXVlc3RDYWNoZShjYWNoZWRTdGF0ZSB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIExvb2tzIGluIHRlbXBvcmFyeSBjYWNoZSBmb3IgYW55IHN0YXRlIHZhbHVlcyB3aXRoIHRoZSBwcm92aWRlZCBpbnRlcmFjdGlvblR5cGUgYW5kIHJlbW92ZXMgYWxsIHRlbXBvcmFyeSBjYWNoZSBpdGVtcyBmb3IgdGhhdCBzdGF0ZVxyXG4gICAgICogVXNlZCBpbiBzY2VuYXJpb3Mgd2hlcmUgdGVtcCBjYWNoZSBuZWVkcyB0byBiZSBjbGVhbmVkIGJ1dCBzdGF0ZSBpcyBub3Qga25vd24sIHN1Y2ggYXMgY2xpY2tpbmcgYnJvd3NlciBiYWNrIGJ1dHRvbi5cclxuICAgICAqIEBwYXJhbSBpbnRlcmFjdGlvblR5cGVcclxuICAgICAqL1xyXG4gICAgY2xlYW5SZXF1ZXN0QnlJbnRlcmFjdGlvblR5cGUoaW50ZXJhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmNsZWFuUmVxdWVzdEJ5SW50ZXJhY3Rpb25UeXBlIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGtleXMgdG8gZmluZCBzdGF0ZSBrZXlcclxuICAgICAgICB0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZS5nZXRLZXlzKCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMga2V5IGlzIG5vdCB0aGUgc3RhdGUga2V5LCBtb3ZlIG9uXHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihUZW1wb3JhcnlDYWNoZUtleXMuUkVRVUVTVF9TVEFURSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gUmV0cmlldmUgc3RhdGUgdmFsdWUsIHJldHVybiBpZiBub3QgYSB2YWxpZCB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCBzdGF0ZVZhbHVlID0gdGhpcy50ZW1wb3JhcnlDYWNoZVN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICBpZiAoIXN0YXRlVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBFeHRyYWN0IHN0YXRlIGFuZCBlbnN1cmUgaXQgbWF0Y2hlcyBnaXZlbiBJbnRlcmFjdGlvblR5cGUsIHRoZW4gY2xlYW4gcmVxdWVzdCBjYWNoZVxyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRTdGF0ZSA9IGV4dHJhY3RCcm93c2VyUmVxdWVzdFN0YXRlKHRoaXMuY3J5cHRvSW1wbCwgc3RhdGVWYWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChwYXJzZWRTdGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgcGFyc2VkU3RhdGUuaW50ZXJhY3Rpb25UeXBlID09PSBpbnRlcmFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm9QaWkoYEJyb3dzZXJDYWNoZU1hbmFnZXIuY2xlYW5SZXF1ZXN0QnlJbnRlcmFjdGlvblR5cGU6IFJlbW92aW5nIHRlbXBvcmFyeSBjYWNoZSBpdGVtcyBmb3Igc3RhdGU6ICR7c3RhdGVWYWx1ZX1gKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRSZXF1ZXN0Q2FjaGUoc3RhdGVWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBjYWNoZUNvZGVSZXF1ZXN0KGF1dGhDb2RlUmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiQnJvd3NlckNhY2hlTWFuYWdlci5jYWNoZUNvZGVSZXF1ZXN0IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBlbmNvZGVkVmFsdWUgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoYXV0aENvZGVSZXF1ZXN0KSk7XHJcbiAgICAgICAgdGhpcy5zZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuUkVRVUVTVF9QQVJBTVMsIGVuY29kZWRWYWx1ZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRva2VuIGV4Y2hhbmdlIHBhcmFtZXRlcnMgZnJvbSB0aGUgY2FjaGUuIFRocm93cyBhbiBlcnJvciBpZiBub3RoaW5nIGlzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRDYWNoZWRSZXF1ZXN0KHN0YXRlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZFJlcXVlc3QgY2FsbGVkXCIpO1xyXG4gICAgICAgIC8vIEdldCB0b2tlbiByZXF1ZXN0IGZyb20gY2FjaGUgYW5kIHBhcnNlIGFzIFRva2VuRXhjaGFuZ2VQYXJhbWV0ZXJzLlxyXG4gICAgICAgIGNvbnN0IGVuY29kZWRUb2tlblJlcXVlc3QgPSB0aGlzLmdldFRlbXBvcmFyeUNhY2hlKFRlbXBvcmFyeUNhY2hlS2V5cy5SRVFVRVNUX1BBUkFNUywgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKCFlbmNvZGVkVG9rZW5SZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBhcnNlZFJlcXVlc3Q7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcGFyc2VkUmVxdWVzdCA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKGVuY29kZWRUb2tlblJlcXVlc3QpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3JQaWkoYEF0dGVtcHRlZCB0byBwYXJzZTogJHtlbmNvZGVkVG9rZW5SZXF1ZXN0fWApO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgUGFyc2luZyBjYWNoZWQgdG9rZW4gcmVxdWVzdCB0aHJldyB3aXRoIGVycm9yOiAke2V9YCk7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IodW5hYmxlVG9QYXJzZVRva2VuUmVxdWVzdENhY2hlRXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KFRlbXBvcmFyeUNhY2hlS2V5cy5SRVFVRVNUX1BBUkFNUykpO1xyXG4gICAgICAgIC8vIEdldCBjYWNoZWQgYXV0aG9yaXR5IGFuZCB1c2UgaWYgbm8gYXV0aG9yaXR5IGlzIGNhY2hlZCB3aXRoIHJlcXVlc3QuXHJcbiAgICAgICAgaWYgKCFwYXJzZWRSZXF1ZXN0LmF1dGhvcml0eSkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRob3JpdHlDYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVBdXRob3JpdHlLZXkoc3RhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZWRBdXRob3JpdHkgPSB0aGlzLmdldFRlbXBvcmFyeUNhY2hlKGF1dGhvcml0eUNhY2hlS2V5KTtcclxuICAgICAgICAgICAgaWYgKCFjYWNoZWRBdXRob3JpdHkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9DYWNoZWRBdXRob3JpdHlFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyc2VkUmVxdWVzdC5hdXRob3JpdHkgPSBjYWNoZWRBdXRob3JpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJzZWRSZXF1ZXN0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGNhY2hlZCBuYXRpdmUgcmVxdWVzdCBmb3IgcmVkaXJlY3QgZmxvd3NcclxuICAgICAqL1xyXG4gICAgZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCgpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCBjYWxsZWRcIik7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkUmVxdWVzdCA9IHRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoVGVtcG9yYXJ5Q2FjaGVLZXlzLk5BVElWRV9SRVFVRVNULCB0cnVlKTtcclxuICAgICAgICBpZiAoIWNhY2hlZFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZE5hdGl2ZVJlcXVlc3Q6IE5vIGNhY2hlZCBuYXRpdmUgcmVxdWVzdCBmb3VuZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFJlcXVlc3QgPSB0aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKGNhY2hlZFJlcXVlc3QpO1xyXG4gICAgICAgIGlmICghcGFyc2VkUmVxdWVzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdDogVW5hYmxlIHRvIHBhcnNlIG5hdGl2ZSByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZFJlcXVlc3Q7XHJcbiAgICB9XHJcbiAgICBpc0ludGVyYWN0aW9uSW5Qcm9ncmVzcyhtYXRjaENsaWVudElkKSB7XHJcbiAgICAgICAgY29uc3QgY2xpZW50SWQgPSB0aGlzLmdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpO1xyXG4gICAgICAgIGlmIChtYXRjaENsaWVudElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGllbnRJZCA9PT0gdGhpcy5jbGllbnRJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAhIWNsaWVudElkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBgJHtDb25zdGFudHMuQ0FDSEVfUFJFRklYfS4ke1RlbXBvcmFyeUNhY2hlS2V5cy5JTlRFUkFDVElPTl9TVEFUVVNfS0VZfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoa2V5LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBzZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoaW5Qcm9ncmVzcykge1xyXG4gICAgICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgaW50ZXJhY3Rpb24gaW4gcHJvZ3Jlc3MgZm9yIGEgZGlmZmVyZW50IGNsaWVudElkXHJcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7Q29uc3RhbnRzLkNBQ0hFX1BSRUZJWH0uJHtUZW1wb3JhcnlDYWNoZUtleXMuSU5URVJBQ1RJT05fU1RBVFVTX0tFWX1gO1xyXG4gICAgICAgIGlmIChpblByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGludGVyYWN0aW9uSW5Qcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyBpbnRlcmFjdGlvbiBpcyBpbiBwcm9ncmVzc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZW1wb3JhcnlDYWNoZShrZXksIHRoaXMuY2xpZW50SWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghaW5Qcm9ncmVzcyAmJlxyXG4gICAgICAgICAgICB0aGlzLmdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpID09PSB0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB1c2VybmFtZSByZXRyaWV2ZWQgZnJvbSBBREFMIG9yIE1TQUwgdjEgaWRUb2tlblxyXG4gICAgICogQGRlcHJlY2F0ZWRcclxuICAgICAqL1xyXG4gICAgZ2V0TGVnYWN5TG9naW5IaW50KCkge1xyXG4gICAgICAgIC8vIE9ubHkgY2hlY2sgZm9yIGFkYWwvbXNhbCB0b2tlbiBpZiBubyBTU08gcGFyYW1zIGFyZSBiZWluZyB1c2VkXHJcbiAgICAgICAgY29uc3QgYWRhbElkVG9rZW5TdHJpbmcgPSB0aGlzLmdldFRlbXBvcmFyeUNhY2hlKFBlcnNpc3RlbnRDYWNoZUtleXMuQURBTF9JRF9UT0tFTik7XHJcbiAgICAgICAgaWYgKGFkYWxJZFRva2VuU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShQZXJzaXN0ZW50Q2FjaGVLZXlzLkFEQUxfSURfVE9LRU4pO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ2FjaGVkIEFEQUwgaWQgdG9rZW4gcmV0cmlldmVkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNhY2hlZCBNU0FMIHYxIGlkIHRva2VuXHJcbiAgICAgICAgY29uc3QgbXNhbElkVG9rZW5TdHJpbmcgPSB0aGlzLmdldFRlbXBvcmFyeUNhY2hlKFBlcnNpc3RlbnRDYWNoZUtleXMuSURfVE9LRU4sIHRydWUpO1xyXG4gICAgICAgIGlmIChtc2FsSWRUb2tlblN0cmluZykge1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KFBlcnNpc3RlbnRDYWNoZUtleXMuSURfVE9LRU4pKTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkNhY2hlZCBNU0FMLmpzIHYxIGlkIHRva2VuIHJldHJpZXZlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FjaGVkSWRUb2tlblN0cmluZyA9IG1zYWxJZFRva2VuU3RyaW5nIHx8IGFkYWxJZFRva2VuU3RyaW5nO1xyXG4gICAgICAgIGlmIChjYWNoZWRJZFRva2VuU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkVG9rZW5DbGFpbXMgPSBBdXRoVG9rZW4uZXh0cmFjdFRva2VuQ2xhaW1zKGNhY2hlZElkVG9rZW5TdHJpbmcsIGJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgICAgIGlmIChpZFRva2VuQ2xhaW1zLnByZWZlcnJlZF91c2VybmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIk5vIFNTTyBwYXJhbXMgdXNlZCBhbmQgQURBTC9NU0FMIHYxIHRva2VuIHJldHJpZXZlZCwgc2V0dGluZyBBREFML01TQUwgdjEgcHJlZmVycmVkX3VzZXJuYW1lIGFzIGxvZ2luSGludFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpZFRva2VuQ2xhaW1zLnByZWZlcnJlZF91c2VybmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpZFRva2VuQ2xhaW1zLnVwbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIk5vIFNTTyBwYXJhbXMgdXNlZCBhbmQgQURBTC9NU0FMIHYxIHRva2VuIHJldHJpZXZlZCwgc2V0dGluZyBBREFML01TQUwgdjEgdXBuIGFzIGxvZ2luSGludFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpZFRva2VuQ2xhaW1zLnVwbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJObyBTU08gcGFyYW1zIHVzZWQgYW5kIEFEQUwvTVNBTCB2MSB0b2tlbiByZXRyaWV2ZWQsIGhvd2V2ZXIsIG5vIGFjY291bnQgaGludCBjbGFpbSBmb3VuZC4gRW5hYmxlIHByZWZlcnJlZF91c2VybmFtZSBvciB1cG4gaWQgdG9rZW4gY2xhaW0gdG8gZ2V0IFNTTy5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgYSBjcmVkZW50aWFsJ3MgY2FjaGUga2V5IGlmIHRoZSBjdXJyZW50IGNhY2hlIGtleSBpcyBvdXRkYXRlZFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVDcmVkZW50aWFsQ2FjaGVLZXkoY3VycmVudENhY2hlS2V5LCBjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZENhY2hlS2V5ID0gQ2FjaGVIZWxwZXJzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShjcmVkZW50aWFsKTtcclxuICAgICAgICBpZiAoY3VycmVudENhY2hlS2V5ICE9PSB1cGRhdGVkQ2FjaGVLZXkpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FjaGVJdGVtID0gdGhpcy5nZXRJdGVtKGN1cnJlbnRDYWNoZUtleSk7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZUl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShjdXJyZW50Q2FjaGVLZXkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtKHVwZGF0ZWRDYWNoZUtleSwgY2FjaGVJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFVwZGF0ZWQgYW4gb3V0ZGF0ZWQgJHtjcmVkZW50aWFsLmNyZWRlbnRpYWxUeXBlfSBjYWNoZSBrZXlgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkQ2FjaGVLZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBvdXRkYXRlZCAke2NyZWRlbnRpYWwuY3JlZGVudGlhbFR5cGV9IGNhY2hlIGtleSBidXQgbm8gaXRlbSBtYXRjaGluZyB0aGUgb3V0ZGF0ZWQga2V5IHdhcyBmb3VuZCBpbiBzdG9yYWdlYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDYWNoZUtleTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGRzIGNyZWRlbnRpYWwgZW50aXRpZXMgZnJvbSBBdXRoZW50aWNhdGlvblJlc3VsdCBvYmplY3QgYW5kIHNhdmVzIHRoZSByZXN1bHRpbmcgY3JlZGVudGlhbHMgdG8gdGhlIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gcmVzdWx0XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBoeWRyYXRlQ2FjaGUocmVzdWx0LCByZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkVudGl0eSA9IENhY2hlSGVscGVycy5jcmVhdGVJZFRva2VuRW50aXR5KHJlc3VsdC5hY2NvdW50Py5ob21lQWNjb3VudElkLCByZXN1bHQuYWNjb3VudD8uZW52aXJvbm1lbnQsIHJlc3VsdC5pZFRva2VuLCB0aGlzLmNsaWVudElkLCByZXN1bHQudGVuYW50SWQpO1xyXG4gICAgICAgIGxldCBjbGFpbXNIYXNoO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmNsYWltcykge1xyXG4gICAgICAgICAgICBjbGFpbXNIYXNoID0gYXdhaXQgdGhpcy5jcnlwdG9JbXBsLmhhc2hTdHJpbmcocmVxdWVzdC5jbGFpbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBtZXRhIGRhdGEgZm9yIGNhY2hlIHN0b3JlcyB0aW1lIGluIHNlY29uZHMgZnJvbSBlcG9jaFxyXG4gICAgICAgICAqIEF1dGhlbnRpY2F0aW9uUmVzdWx0IHJldHVybnMgZXhwaXJlc09uIGFuZCBleHRFeHBpcmVzT24gaW4gbWlsbGlzZWNvbmRzIChhcyBhIERhdGUgb2JqZWN0IHdoaWNoIGlzIGluIG1zKVxyXG4gICAgICAgICAqIFdlIG5lZWQgdG8gbWFwIHRoZXNlIGZvciB0aGUgY2FjaGUgd2hlbiBidWlsZGluZyB0b2tlbnMgZnJvbSBBdXRoZW50aWNhdGlvblJlc3VsdFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIG5leHQgTVNBTCBWRnV0dXJlIHNob3VsZCBtYXAgdGhlc2UgYm90aCB0byBzYW1lIHZhbHVlIGlmIHBvc3NpYmxlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5FbnRpdHkgPSBDYWNoZUhlbHBlcnMuY3JlYXRlQWNjZXNzVG9rZW5FbnRpdHkocmVzdWx0LmFjY291bnQ/LmhvbWVBY2NvdW50SWQsIHJlc3VsdC5hY2NvdW50LmVudmlyb25tZW50LCByZXN1bHQuYWNjZXNzVG9rZW4sIHRoaXMuY2xpZW50SWQsIHJlc3VsdC50ZW5hbnRJZCwgcmVzdWx0LnNjb3Blcy5qb2luKFwiIFwiKSwgcmVzdWx0LmV4cGlyZXNPbiA/IHJlc3VsdC5leHBpcmVzT24uZ2V0VGltZSgpIC8gMTAwMCA6IDAsIHJlc3VsdC5leHRFeHBpcmVzT24gPyByZXN1bHQuZXh0RXhwaXJlc09uLmdldFRpbWUoKSAvIDEwMDAgOiAwLCBiYXNlNjREZWNvZGUsIHVuZGVmaW5lZCwgLy8gcmVmcmVzaE9uXHJcbiAgICAgICAgcmVzdWx0LnRva2VuVHlwZSwgdW5kZWZpbmVkLCAvLyB1c2VyQXNzZXJ0aW9uSGFzaFxyXG4gICAgICAgIHJlcXVlc3Quc3NoS2lkLCByZXF1ZXN0LmNsYWltcywgY2xhaW1zSGFzaCk7XHJcbiAgICAgICAgY29uc3QgY2FjaGVSZWNvcmQgPSB7XHJcbiAgICAgICAgICAgIGlkVG9rZW46IGlkVG9rZW5FbnRpdHksXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbkVudGl0eSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVDYWNoZVJlY29yZChjYWNoZVJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIHNhdmVzIGEgY2FjaGUgcmVjb3JkXHJcbiAgICAgKiBAcGFyYW0gY2FjaGVSZWNvcmQge0NhY2hlUmVjb3JkfVxyXG4gICAgICogQHBhcmFtIHN0b3JlSW5DYWNoZSB7P1N0b3JlSW5DYWNoZX1cclxuICAgICAqIEBwYXJhbSBjb3JyZWxhdGlvbklkIHs/c3RyaW5nfSBjb3JyZWxhdGlvbiBpZFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlQ2FjaGVSZWNvcmQoY2FjaGVSZWNvcmQsIHN0b3JlSW5DYWNoZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHN1cGVyLnNhdmVDYWNoZVJlY29yZChjYWNoZVJlY29yZCwgc3RvcmVJbkNhY2hlLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDYWNoZUVycm9yICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50ICYmXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5cyA9IHRoaXMuZ2V0VG9rZW5LZXlzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVJ0Q291bnQ6IHRva2VuS2V5cy5yZWZyZXNoVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUlkQ291bnQ6IHRva2VuS2V5cy5pZFRva2VuLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVBdENvdW50OiB0b2tlbktleXMuYWNjZXNzVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9DQUNIRV9NQU5BR0VSID0gKGNsaWVudElkLCBsb2dnZXIpID0+IHtcclxuICAgIGNvbnN0IGNhY2hlT3B0aW9ucyA9IHtcclxuICAgICAgICBjYWNoZUxvY2F0aW9uOiBCcm93c2VyQ2FjaGVMb2NhdGlvbi5NZW1vcnlTdG9yYWdlLFxyXG4gICAgICAgIHRlbXBvcmFyeUNhY2hlTG9jYXRpb246IEJyb3dzZXJDYWNoZUxvY2F0aW9uLk1lbW9yeVN0b3JhZ2UsXHJcbiAgICAgICAgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZTogZmFsc2UsXHJcbiAgICAgICAgc2VjdXJlQ29va2llczogZmFsc2UsXHJcbiAgICAgICAgY2FjaGVNaWdyYXRpb25FbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IEJyb3dzZXJDYWNoZU1hbmFnZXIoY2xpZW50SWQsIGNhY2hlT3B0aW9ucywgREVGQVVMVF9DUllQVE9fSU1QTEVNRU5UQVRJT04sIGxvZ2dlcik7XHJcbn07XG5cbmV4cG9ydCB7IEJyb3dzZXJDYWNoZU1hbmFnZXIsIERFRkFVTFRfQlJPV1NFUl9DQUNIRV9NQU5BR0VSIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ2FjaGVNYW5hZ2VyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIGNhY2hlIHRoYXQgbWF0Y2ggdGhlIG9wdGlvbmFsIGZpbHRlci4gSWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkLCBhbGwgYWNjb3VudHMgYXJlIHJldHVybmVkLlxyXG4gKiBAcGFyYW0gYWNjb3VudEZpbHRlciAtIChPcHRpb25hbCkgZmlsdGVyIHRvIG5hcnJvdyBkb3duIHRoZSBhY2NvdW50cyByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyBBcnJheSBvZiBBY2NvdW50SW5mbyBvYmplY3RzIGluIGNhY2hlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBbGxBY2NvdW50cyhsb2dnZXIsIGJyb3dzZXJTdG9yYWdlLCBpc0luQnJvd3NlciwgYWNjb3VudEZpbHRlcikge1xyXG4gICAgbG9nZ2VyLnZlcmJvc2UoXCJnZXRBbGxBY2NvdW50cyBjYWxsZWRcIik7XHJcbiAgICByZXR1cm4gaXNJbkJyb3dzZXIgPyBicm93c2VyU3RvcmFnZS5nZXRBbGxBY2NvdW50cyhhY2NvdW50RmlsdGVyKSA6IFtdO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBhY2NvdW50IGZvdW5kIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoZXMgdGhlIGFjY291bnQgZmlsdGVyIHBhc3NlZCBpbi5cclxuICogQHBhcmFtIGFjY291bnRGaWx0ZXJcclxuICogQHJldHVybnMgVGhlIGZpcnN0IGFjY291bnQgZm91bmQgaW4gdGhlIGNhY2hlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBmaWx0ZXIgb3IgbnVsbCBpZiBubyBhY2NvdW50IGNvdWxkIGJlIGZvdW5kLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWNjb3VudChhY2NvdW50RmlsdGVyLCBsb2dnZXIsIGJyb3dzZXJTdG9yYWdlKSB7XHJcbiAgICBsb2dnZXIudHJhY2UoXCJnZXRBY2NvdW50IGNhbGxlZFwiKTtcclxuICAgIGlmIChPYmplY3Qua2V5cyhhY2NvdW50RmlsdGVyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBsb2dnZXIud2FybmluZyhcImdldEFjY291bnQ6IE5vIGFjY291bnRGaWx0ZXIgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY2NvdW50ID0gYnJvd3NlclN0b3JhZ2UuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KGFjY291bnRGaWx0ZXIpO1xyXG4gICAgaWYgKGFjY291bnQpIHtcclxuICAgICAgICBsb2dnZXIudmVyYm9zZShcImdldEFjY291bnQ6IEFjY291bnQgbWF0Y2hpbmcgcHJvdmlkZWQgZmlsdGVyIGZvdW5kLCByZXR1cm5pbmdcIik7XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsb2dnZXIudmVyYm9zZShcImdldEFjY291bnQ6IE5vIG1hdGNoaW5nIGFjY291bnQgZm91bmQsIHJldHVybmluZyBudWxsXCIpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzaWduZWQgaW4gYWNjb3VudCBtYXRjaGluZyB1c2VybmFtZS5cclxuICogKHRoZSBhY2NvdW50IG9iamVjdCBpcyBjcmVhdGVkIGF0IHRoZSB0aW1lIG9mIHN1Y2Nlc3NmdWwgbG9naW4pXHJcbiAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kLlxyXG4gKiBUaGlzIEFQSSBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UgYnV0IGdldEFjY291bnRCeUlkIHNob3VsZCBiZSB1c2VkIGZvciBiZXN0IHJlbGlhYmlsaXR5XHJcbiAqIEBwYXJhbSB1c2VybmFtZVxyXG4gKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICovXHJcbmZ1bmN0aW9uIGdldEFjY291bnRCeVVzZXJuYW1lKHVzZXJuYW1lLCBsb2dnZXIsIGJyb3dzZXJTdG9yYWdlKSB7XHJcbiAgICBsb2dnZXIudHJhY2UoXCJnZXRBY2NvdW50QnlVc2VybmFtZSBjYWxsZWRcIik7XHJcbiAgICBpZiAoIXVzZXJuYW1lKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoXCJnZXRBY2NvdW50QnlVc2VybmFtZTogTm8gdXNlcm5hbWUgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY2NvdW50ID0gYnJvd3NlclN0b3JhZ2UuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtcclxuICAgICAgICB1c2VybmFtZSxcclxuICAgIH0pO1xyXG4gICAgaWYgKGFjY291bnQpIHtcclxuICAgICAgICBsb2dnZXIudmVyYm9zZShcImdldEFjY291bnRCeVVzZXJuYW1lOiBBY2NvdW50IG1hdGNoaW5nIHVzZXJuYW1lIGZvdW5kLCByZXR1cm5pbmdcIik7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2VQaWkoYGdldEFjY291bnRCeVVzZXJuYW1lOiBSZXR1cm5pbmcgc2lnbmVkLWluIGFjY291bnRzIG1hdGNoaW5nIHVzZXJuYW1lOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICAgIHJldHVybiBhY2NvdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoXCJnZXRBY2NvdW50QnlVc2VybmFtZTogTm8gbWF0Y2hpbmcgYWNjb3VudCBmb3VuZCwgcmV0dXJuaW5nIG51bGxcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNpZ25lZCBpbiBhY2NvdW50IG1hdGNoaW5nIGhvbWVBY2NvdW50SWQuXHJcbiAqICh0aGUgYWNjb3VudCBvYmplY3QgaXMgY3JlYXRlZCBhdCB0aGUgdGltZSBvZiBzdWNjZXNzZnVsIGxvZ2luKVxyXG4gKiBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgYWNjb3VudCBpcyBmb3VuZFxyXG4gKiBAcGFyYW0gaG9tZUFjY291bnRJZFxyXG4gKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICovXHJcbmZ1bmN0aW9uIGdldEFjY291bnRCeUhvbWVJZChob21lQWNjb3VudElkLCBsb2dnZXIsIGJyb3dzZXJTdG9yYWdlKSB7XHJcbiAgICBsb2dnZXIudHJhY2UoXCJnZXRBY2NvdW50QnlIb21lSWQgY2FsbGVkXCIpO1xyXG4gICAgaWYgKCFob21lQWNjb3VudElkKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoXCJnZXRBY2NvdW50QnlIb21lSWQ6IE5vIGhvbWVBY2NvdW50SWQgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY2NvdW50ID0gYnJvd3NlclN0b3JhZ2UuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtcclxuICAgICAgICBob21lQWNjb3VudElkLFxyXG4gICAgfSk7XHJcbiAgICBpZiAoYWNjb3VudCkge1xyXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKFwiZ2V0QWNjb3VudEJ5SG9tZUlkOiBBY2NvdW50IG1hdGNoaW5nIGhvbWVBY2NvdW50SWQgZm91bmQsIHJldHVybmluZ1wiKTtcclxuICAgICAgICBsb2dnZXIudmVyYm9zZVBpaShgZ2V0QWNjb3VudEJ5SG9tZUlkOiBSZXR1cm5pbmcgc2lnbmVkLWluIGFjY291bnRzIG1hdGNoaW5nIGhvbWVBY2NvdW50SWQ6ICR7aG9tZUFjY291bnRJZH1gKTtcclxuICAgICAgICByZXR1cm4gYWNjb3VudDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKFwiZ2V0QWNjb3VudEJ5SG9tZUlkOiBObyBtYXRjaGluZyBhY2NvdW50IGZvdW5kLCByZXR1cm5pbmcgbnVsbFwiKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQuXHJcbiAqICh0aGUgYWNjb3VudCBvYmplY3QgaXMgY3JlYXRlZCBhdCB0aGUgdGltZSBvZiBzdWNjZXNzZnVsIGxvZ2luKVxyXG4gKiBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgYWNjb3VudCBpcyBmb3VuZFxyXG4gKiBAcGFyYW0gbG9jYWxBY2NvdW50SWRcclxuICogQHJldHVybnMgVGhlIGFjY291bnQgb2JqZWN0IHN0b3JlZCBpbiBNU0FMXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBY2NvdW50QnlMb2NhbElkKGxvY2FsQWNjb3VudElkLCBsb2dnZXIsIGJyb3dzZXJTdG9yYWdlKSB7XHJcbiAgICBsb2dnZXIudHJhY2UoXCJnZXRBY2NvdW50QnlMb2NhbElkIGNhbGxlZFwiKTtcclxuICAgIGlmICghbG9jYWxBY2NvdW50SWQpIHtcclxuICAgICAgICBsb2dnZXIud2FybmluZyhcImdldEFjY291bnRCeUxvY2FsSWQ6IE5vIGxvY2FsQWNjb3VudElkIHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWNjb3VudCA9IGJyb3dzZXJTdG9yYWdlLmdldEFjY291bnRJbmZvRmlsdGVyZWRCeSh7XHJcbiAgICAgICAgbG9jYWxBY2NvdW50SWQsXHJcbiAgICB9KTtcclxuICAgIGlmIChhY2NvdW50KSB7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoXCJnZXRBY2NvdW50QnlMb2NhbElkOiBBY2NvdW50IG1hdGNoaW5nIGxvY2FsQWNjb3VudElkIGZvdW5kLCByZXR1cm5pbmdcIik7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2VQaWkoYGdldEFjY291bnRCeUxvY2FsSWQ6IFJldHVybmluZyBzaWduZWQtaW4gYWNjb3VudHMgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQ6ICR7bG9jYWxBY2NvdW50SWR9YCk7XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsb2dnZXIudmVyYm9zZShcImdldEFjY291bnRCeUxvY2FsSWQ6IE5vIG1hdGNoaW5nIGFjY291bnQgZm91bmQsIHJldHVybmluZyBudWxsXCIpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBhY2NvdW50IHRvIHVzZSBhcyB0aGUgYWN0aXZlIGFjY291bnQuIElmIG5vIGFjY291bnQgaXMgcGFzc2VkIHRvIHRoZSBhY3F1aXJlVG9rZW4gQVBJcywgdGhlbiBNU0FMIHdpbGwgdXNlIHRoaXMgYWN0aXZlIGFjY291bnQuXHJcbiAqIEBwYXJhbSBhY2NvdW50XHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRBY3RpdmVBY2NvdW50KGFjY291bnQsIGJyb3dzZXJTdG9yYWdlKSB7XHJcbiAgICBicm93c2VyU3RvcmFnZS5zZXRBY3RpdmVBY2NvdW50KGFjY291bnQpO1xyXG59XHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY291bnRcclxuICovXHJcbmZ1bmN0aW9uIGdldEFjdGl2ZUFjY291bnQoYnJvd3NlclN0b3JhZ2UpIHtcclxuICAgIHJldHVybiBicm93c2VyU3RvcmFnZS5nZXRBY3RpdmVBY2NvdW50KCk7XHJcbn1cblxuZXhwb3J0IHsgZ2V0QWNjb3VudCwgZ2V0QWNjb3VudEJ5SG9tZUlkLCBnZXRBY2NvdW50QnlMb2NhbElkLCBnZXRBY2NvdW50QnlVc2VybmFtZSwgZ2V0QWN0aXZlQWNjb3VudCwgZ2V0QWxsQWNjb3VudHMsIHNldEFjdGl2ZUFjY291bnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjY291bnRNYW5hZ2VyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEV2ZW50VHlwZSA9IHtcclxuICAgIElOSVRJQUxJWkVfU1RBUlQ6IFwibXNhbDppbml0aWFsaXplU3RhcnRcIixcclxuICAgIElOSVRJQUxJWkVfRU5EOiBcIm1zYWw6aW5pdGlhbGl6ZUVuZFwiLFxyXG4gICAgQUNDT1VOVF9BRERFRDogXCJtc2FsOmFjY291bnRBZGRlZFwiLFxyXG4gICAgQUNDT1VOVF9SRU1PVkVEOiBcIm1zYWw6YWNjb3VudFJlbW92ZWRcIixcclxuICAgIEFDVElWRV9BQ0NPVU5UX0NIQU5HRUQ6IFwibXNhbDphY3RpdmVBY2NvdW50Q2hhbmdlZFwiLFxyXG4gICAgTE9HSU5fU1RBUlQ6IFwibXNhbDpsb2dpblN0YXJ0XCIsXHJcbiAgICBMT0dJTl9TVUNDRVNTOiBcIm1zYWw6bG9naW5TdWNjZXNzXCIsXHJcbiAgICBMT0dJTl9GQUlMVVJFOiBcIm1zYWw6bG9naW5GYWlsdXJlXCIsXHJcbiAgICBBQ1FVSVJFX1RPS0VOX1NUQVJUOiBcIm1zYWw6YWNxdWlyZVRva2VuU3RhcnRcIixcclxuICAgIEFDUVVJUkVfVE9LRU5fU1VDQ0VTUzogXCJtc2FsOmFjcXVpcmVUb2tlblN1Y2Nlc3NcIixcclxuICAgIEFDUVVJUkVfVE9LRU5fRkFJTFVSRTogXCJtc2FsOmFjcXVpcmVUb2tlbkZhaWx1cmVcIixcclxuICAgIEFDUVVJUkVfVE9LRU5fTkVUV09SS19TVEFSVDogXCJtc2FsOmFjcXVpcmVUb2tlbkZyb21OZXR3b3JrU3RhcnRcIixcclxuICAgIFNTT19TSUxFTlRfU1RBUlQ6IFwibXNhbDpzc29TaWxlbnRTdGFydFwiLFxyXG4gICAgU1NPX1NJTEVOVF9TVUNDRVNTOiBcIm1zYWw6c3NvU2lsZW50U3VjY2Vzc1wiLFxyXG4gICAgU1NPX1NJTEVOVF9GQUlMVVJFOiBcIm1zYWw6c3NvU2lsZW50RmFpbHVyZVwiLFxyXG4gICAgQUNRVUlSRV9UT0tFTl9CWV9DT0RFX1NUQVJUOiBcIm1zYWw6YWNxdWlyZVRva2VuQnlDb2RlU3RhcnRcIixcclxuICAgIEFDUVVJUkVfVE9LRU5fQllfQ09ERV9TVUNDRVNTOiBcIm1zYWw6YWNxdWlyZVRva2VuQnlDb2RlU3VjY2Vzc1wiLFxyXG4gICAgQUNRVUlSRV9UT0tFTl9CWV9DT0RFX0ZBSUxVUkU6IFwibXNhbDphY3F1aXJlVG9rZW5CeUNvZGVGYWlsdXJlXCIsXHJcbiAgICBIQU5ETEVfUkVESVJFQ1RfU1RBUlQ6IFwibXNhbDpoYW5kbGVSZWRpcmVjdFN0YXJ0XCIsXHJcbiAgICBIQU5ETEVfUkVESVJFQ1RfRU5EOiBcIm1zYWw6aGFuZGxlUmVkaXJlY3RFbmRcIixcclxuICAgIFBPUFVQX09QRU5FRDogXCJtc2FsOnBvcHVwT3BlbmVkXCIsXHJcbiAgICBMT0dPVVRfU1RBUlQ6IFwibXNhbDpsb2dvdXRTdGFydFwiLFxyXG4gICAgTE9HT1VUX1NVQ0NFU1M6IFwibXNhbDpsb2dvdXRTdWNjZXNzXCIsXHJcbiAgICBMT0dPVVRfRkFJTFVSRTogXCJtc2FsOmxvZ291dEZhaWx1cmVcIixcclxuICAgIExPR09VVF9FTkQ6IFwibXNhbDpsb2dvdXRFbmRcIixcclxuICAgIFJFU1RPUkVfRlJPTV9CRkNBQ0hFOiBcIm1zYWw6cmVzdG9yZUZyb21CRkNhY2hlXCIsXHJcbn07XG5cbmV4cG9ydCB7IEV2ZW50VHlwZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRUeXBlLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlR3VpZCB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJVdGlscy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRXZlbnRIYW5kbGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGxvZ2dlcikge1xyXG4gICAgICAgIHRoaXMuZXZlbnRDYWxsYmFja3MgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgfHwgbmV3IExvZ2dlcih7fSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgZXZlbnQgY2FsbGJhY2tzIHRvIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXZlbnQgaXMgcmFpc2VkXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlcyAtIGxpc3Qgb2YgZXZlbnRzIHRoYXQgdGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZm9yLCBpZiBub3QgcHJvdmlkZWQgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBhbGwgZXZlbnRzXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjYWxsYmFjaywgdXNlZCB0byBsb2NhdGUgYW5kIHJlbW92ZSB0aGUgY2FsbGJhY2sgd2hlbiBubyBsb25nZXIgcmVxdWlyZWRcclxuICAgICAqL1xyXG4gICAgYWRkRXZlbnRDYWxsYmFjayhjYWxsYmFjaywgZXZlbnRUeXBlcywgY2FsbGJhY2tJZCkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkID0gY2FsbGJhY2tJZCB8fCBjcmVhdGVHdWlkKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50Q2FsbGJhY2tzLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFdmVudCBjYWxsYmFjayB3aXRoIGlkOiAke2lkfSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFBsZWFzZSBwcm92aWRlIGEgdW5pcXVlIGlkIG9yIHJlbW92ZSB0aGUgZXhpc3RpbmcgY2FsbGJhY2sgYW5kIHRyeSBhZ2Fpbi5gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRDYWxsYmFja3Muc2V0KGlkLCBbY2FsbGJhY2ssIGV2ZW50VHlwZXMgfHwgW11dKTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgRXZlbnQgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke2lkfWApO1xyXG4gICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGNhbGxiYWNrIHdpdGggcHJvdmlkZWQgaWQgZnJvbSBjYWxsYmFjayBhcnJheVxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSWRcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRXZlbnRDYWxsYmFjayhjYWxsYmFja0lkKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudENhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2tJZCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgRXZlbnQgY2FsbGJhY2sgJHtjYWxsYmFja0lkfSByZW1vdmVkLmApO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyBldmVudHMgYnkgY2FsbGluZyBjYWxsYmFjayB3aXRoIGV2ZW50IG1lc3NhZ2VcclxuICAgICAqIEBwYXJhbSBldmVudFR5cGVcclxuICAgICAqIEBwYXJhbSBpbnRlcmFjdGlvblR5cGVcclxuICAgICAqIEBwYXJhbSBwYXlsb2FkXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JcclxuICAgICAqL1xyXG4gICAgZW1pdEV2ZW50KGV2ZW50VHlwZSwgaW50ZXJhY3Rpb25UeXBlLCBwYXlsb2FkLCBlcnJvcikge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGludGVyYWN0aW9uVHlwZTogaW50ZXJhY3Rpb25UeXBlIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudENhbGxiYWNrcy5mb3JFYWNoKChbY2FsbGJhY2ssIGV2ZW50VHlwZXNdLCBjYWxsYmFja0lkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlcy5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGVzLmluY2x1ZGVzKGV2ZW50VHlwZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBFbWl0dGluZyBldmVudCB0byBjYWxsYmFjayAke2NhbGxiYWNrSWR9OiAke2V2ZW50VHlwZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBbbWVzc2FnZV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudEhhbmRsZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICcuL0F1dGhFcnJvci5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIHNlcnZlciBjb2RlLCBmb3IgZXhhbXBsZSwgdW5hdmFpbGFiaWxpdHkuXHJcbiAqL1xyXG5jbGFzcyBTZXJ2ZXJFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSwgc3ViRXJyb3IsIGVycm9yTm8sIHN0YXR1cykge1xyXG4gICAgICAgIHN1cGVyKGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlLCBzdWJFcnJvcik7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTZXJ2ZXJFcnJvclwiO1xyXG4gICAgICAgIHRoaXMuZXJyb3JObyA9IGVycm9yTm87XHJcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFNlcnZlckVycm9yLnByb3RvdHlwZSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2VydmVyRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlcnZlckVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgVGhyb3R0bGluZ0NvbnN0YW50cywgQ29uc3RhbnRzLCBIZWFkZXJOYW1lcyB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi9lcnJvci9TZXJ2ZXJFcnJvci5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBUaHJvdHRsaW5nVXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwYXJlcyBhIFJlcXVlc3RUaHVtYnByaW50IHRvIGJlIHN0b3JlZCBhcyBhIGtleS5cclxuICAgICAqIEBwYXJhbSB0aHVtYnByaW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZW5lcmF0ZVRocm90dGxpbmdTdG9yYWdlS2V5KHRodW1icHJpbnQpIHtcclxuICAgICAgICByZXR1cm4gYCR7VGhyb3R0bGluZ0NvbnN0YW50cy5USFJPVFRMSU5HX1BSRUZJWH0uJHtKU09OLnN0cmluZ2lmeSh0aHVtYnByaW50KX1gO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBuZWNlc3NhcnkgdGhyb3R0bGluZyBjaGVja3MgYmVmb3JlIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIGNhY2hlTWFuYWdlclxyXG4gICAgICogQHBhcmFtIHRodW1icHJpbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZVByb2Nlc3MoY2FjaGVNYW5hZ2VyLCB0aHVtYnByaW50KSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gVGhyb3R0bGluZ1V0aWxzLmdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkodGh1bWJwcmludCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlKGtleSk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50aHJvdHRsZVRpbWUgPCBEYXRlLm5vdygpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWNoZU1hbmFnZXIucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcih2YWx1ZS5lcnJvckNvZGVzPy5qb2luKFwiIFwiKSB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCB2YWx1ZS5lcnJvck1lc3NhZ2UsIHZhbHVlLnN1YkVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIG5lY2Vzc2FyeSB0aHJvdHRsaW5nIGNoZWNrcyBhZnRlciBhIG5ldHdvcmsgcmVxdWVzdC5cclxuICAgICAqIEBwYXJhbSBjYWNoZU1hbmFnZXJcclxuICAgICAqIEBwYXJhbSB0aHVtYnByaW50XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBvc3RQcm9jZXNzKGNhY2hlTWFuYWdlciwgdGh1bWJwcmludCwgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoVGhyb3R0bGluZ1V0aWxzLmNoZWNrUmVzcG9uc2VTdGF0dXMocmVzcG9uc2UpIHx8XHJcbiAgICAgICAgICAgIFRocm90dGxpbmdVdGlscy5jaGVja1Jlc3BvbnNlRm9yUmV0cnlBZnRlcihyZXNwb25zZSkpIHtcclxuICAgICAgICAgICAgY29uc3QgdGh1bWJwcmludFZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lOiBUaHJvdHRsaW5nVXRpbHMuY2FsY3VsYXRlVGhyb3R0bGVUaW1lKHBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnNbSGVhZGVyTmFtZXMuUkVUUllfQUZURVJdKSksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogcmVzcG9uc2UuYm9keS5lcnJvcixcclxuICAgICAgICAgICAgICAgIGVycm9yQ29kZXM6IHJlc3BvbnNlLmJvZHkuZXJyb3JfY29kZXMsXHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkuZXJyb3JfZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICBzdWJFcnJvcjogcmVzcG9uc2UuYm9keS5zdWJlcnJvcixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2FjaGVNYW5hZ2VyLnNldFRocm90dGxpbmdDYWNoZShUaHJvdHRsaW5nVXRpbHMuZ2VuZXJhdGVUaHJvdHRsaW5nU3RvcmFnZUtleSh0aHVtYnByaW50KSwgdGh1bWJwcmludFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBhIE5ldHdvcmtSZXNwb25zZSBvYmplY3QncyBzdGF0dXMgY29kZXMgYWdhaW5zdCA0Mjkgb3IgNXh4XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNoZWNrUmVzcG9uc2VTdGF0dXMocmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5IHx8XHJcbiAgICAgICAgICAgIChyZXNwb25zZS5zdGF0dXMgPj0gNTAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDYwMCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgYSBOZXR3b3JrUmVzcG9uc2Ugb2JqZWN0J3MgUmV0cnlBZnRlciBoZWFkZXJcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY2hlY2tSZXNwb25zZUZvclJldHJ5QWZ0ZXIocmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xyXG4gICAgICAgICAgICByZXR1cm4gKHJlc3BvbnNlLmhlYWRlcnMuaGFzT3duUHJvcGVydHkoSGVhZGVyTmFtZXMuUkVUUllfQUZURVIpICYmXHJcbiAgICAgICAgICAgICAgICAocmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBVbml4LXRpbWUgdmFsdWUgZm9yIGEgdGhyb3R0bGUgdG8gZXhwaXJlIGdpdmVuIHRocm90dGxlVGltZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHRocm90dGxlVGltZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY2FsY3VsYXRlVGhyb3R0bGVUaW1lKHRocm90dGxlVGltZSkge1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSB0aHJvdHRsZVRpbWUgPD0gMCA/IDAgOiB0aHJvdHRsZVRpbWU7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFNlY29uZHMgPSBEYXRlLm5vdygpIC8gMTAwMDtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1pbihjdXJyZW50U2Vjb25kcyArXHJcbiAgICAgICAgICAgICh0aW1lIHx8IFRocm90dGxpbmdDb25zdGFudHMuREVGQVVMVF9USFJPVFRMRV9USU1FX1NFQ09ORFMpLCBjdXJyZW50U2Vjb25kcyArXHJcbiAgICAgICAgICAgIFRocm90dGxpbmdDb25zdGFudHMuREVGQVVMVF9NQVhfVEhST1RUTEVfVElNRV9TRUNPTkRTKSAqIDEwMDApO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHJlbW92ZVRocm90dGxlKGNhY2hlTWFuYWdlciwgY2xpZW50SWQsIHJlcXVlc3QsIGhvbWVBY2NvdW50SWRlbnRpZmllcikge1xyXG4gICAgICAgIGNvbnN0IHRodW1icHJpbnQgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZCxcclxuICAgICAgICAgICAgYXV0aG9yaXR5OiByZXF1ZXN0LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgc2NvcGVzOiByZXF1ZXN0LnNjb3BlcyxcclxuICAgICAgICAgICAgaG9tZUFjY291bnRJZGVudGlmaWVyOiBob21lQWNjb3VudElkZW50aWZpZXIsXHJcbiAgICAgICAgICAgIGNsYWltczogcmVxdWVzdC5jbGFpbXMsXHJcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uU2NoZW1lOiByZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lLFxyXG4gICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RNZXRob2Q6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLFxyXG4gICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RVcmk6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0VXJpLFxyXG4gICAgICAgICAgICBzaHJDbGFpbXM6IHJlcXVlc3Quc2hyQ2xhaW1zLFxyXG4gICAgICAgICAgICBzc2hLaWQ6IHJlcXVlc3Quc3NoS2lkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZW5lcmF0ZVRocm90dGxpbmdTdG9yYWdlS2V5KHRodW1icHJpbnQpO1xyXG4gICAgICAgIGNhY2hlTWFuYWdlci5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgVGhyb3R0bGluZ1V0aWxzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaHJvdHRsaW5nVXRpbHMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQ0xJRU5UX0lEID0gXCJjbGllbnRfaWRcIjtcclxuY29uc3QgUkVESVJFQ1RfVVJJID0gXCJyZWRpcmVjdF91cmlcIjtcclxuY29uc3QgUkVTUE9OU0VfVFlQRSA9IFwicmVzcG9uc2VfdHlwZVwiO1xyXG5jb25zdCBSRVNQT05TRV9NT0RFID0gXCJyZXNwb25zZV9tb2RlXCI7XHJcbmNvbnN0IEdSQU5UX1RZUEUgPSBcImdyYW50X3R5cGVcIjtcclxuY29uc3QgQ0xBSU1TID0gXCJjbGFpbXNcIjtcclxuY29uc3QgU0NPUEUgPSBcInNjb3BlXCI7XHJcbmNvbnN0IEVSUk9SID0gXCJlcnJvclwiO1xyXG5jb25zdCBFUlJPUl9ERVNDUklQVElPTiA9IFwiZXJyb3JfZGVzY3JpcHRpb25cIjtcclxuY29uc3QgQUNDRVNTX1RPS0VOID0gXCJhY2Nlc3NfdG9rZW5cIjtcclxuY29uc3QgSURfVE9LRU4gPSBcImlkX3Rva2VuXCI7XHJcbmNvbnN0IFJFRlJFU0hfVE9LRU4gPSBcInJlZnJlc2hfdG9rZW5cIjtcclxuY29uc3QgRVhQSVJFU19JTiA9IFwiZXhwaXJlc19pblwiO1xyXG5jb25zdCBSRUZSRVNIX1RPS0VOX0VYUElSRVNfSU4gPSBcInJlZnJlc2hfdG9rZW5fZXhwaXJlc19pblwiO1xyXG5jb25zdCBTVEFURSA9IFwic3RhdGVcIjtcclxuY29uc3QgTk9OQ0UgPSBcIm5vbmNlXCI7XHJcbmNvbnN0IFBST01QVCA9IFwicHJvbXB0XCI7XHJcbmNvbnN0IFNFU1NJT05fU1RBVEUgPSBcInNlc3Npb25fc3RhdGVcIjtcclxuY29uc3QgQ0xJRU5UX0lORk8gPSBcImNsaWVudF9pbmZvXCI7XHJcbmNvbnN0IENPREUgPSBcImNvZGVcIjtcclxuY29uc3QgQ09ERV9DSEFMTEVOR0UgPSBcImNvZGVfY2hhbGxlbmdlXCI7XHJcbmNvbnN0IENPREVfQ0hBTExFTkdFX01FVEhPRCA9IFwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kXCI7XHJcbmNvbnN0IENPREVfVkVSSUZJRVIgPSBcImNvZGVfdmVyaWZpZXJcIjtcclxuY29uc3QgQ0xJRU5UX1JFUVVFU1RfSUQgPSBcImNsaWVudC1yZXF1ZXN0LWlkXCI7XHJcbmNvbnN0IFhfQ0xJRU5UX1NLVSA9IFwieC1jbGllbnQtU0tVXCI7XHJcbmNvbnN0IFhfQ0xJRU5UX1ZFUiA9IFwieC1jbGllbnQtVkVSXCI7XHJcbmNvbnN0IFhfQ0xJRU5UX09TID0gXCJ4LWNsaWVudC1PU1wiO1xyXG5jb25zdCBYX0NMSUVOVF9DUFUgPSBcIngtY2xpZW50LUNQVVwiO1xyXG5jb25zdCBYX0NMSUVOVF9DVVJSX1RFTEVNID0gXCJ4LWNsaWVudC1jdXJyZW50LXRlbGVtZXRyeVwiO1xyXG5jb25zdCBYX0NMSUVOVF9MQVNUX1RFTEVNID0gXCJ4LWNsaWVudC1sYXN0LXRlbGVtZXRyeVwiO1xyXG5jb25zdCBYX01TX0xJQl9DQVBBQklMSVRZID0gXCJ4LW1zLWxpYi1jYXBhYmlsaXR5XCI7XHJcbmNvbnN0IFhfQVBQX05BTUUgPSBcIngtYXBwLW5hbWVcIjtcclxuY29uc3QgWF9BUFBfVkVSID0gXCJ4LWFwcC12ZXJcIjtcclxuY29uc3QgUE9TVF9MT0dPVVRfVVJJID0gXCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmlcIjtcclxuY29uc3QgSURfVE9LRU5fSElOVCA9IFwiaWRfdG9rZW5faGludFwiO1xyXG5jb25zdCBERVZJQ0VfQ09ERSA9IFwiZGV2aWNlX2NvZGVcIjtcclxuY29uc3QgQ0xJRU5UX1NFQ1JFVCA9IFwiY2xpZW50X3NlY3JldFwiO1xyXG5jb25zdCBDTElFTlRfQVNTRVJUSU9OID0gXCJjbGllbnRfYXNzZXJ0aW9uXCI7XHJcbmNvbnN0IENMSUVOVF9BU1NFUlRJT05fVFlQRSA9IFwiY2xpZW50X2Fzc2VydGlvbl90eXBlXCI7XHJcbmNvbnN0IFRPS0VOX1RZUEUgPSBcInRva2VuX3R5cGVcIjtcclxuY29uc3QgUkVRX0NORiA9IFwicmVxX2NuZlwiO1xyXG5jb25zdCBPQk9fQVNTRVJUSU9OID0gXCJhc3NlcnRpb25cIjtcclxuY29uc3QgUkVRVUVTVEVEX1RPS0VOX1VTRSA9IFwicmVxdWVzdGVkX3Rva2VuX3VzZVwiO1xyXG5jb25zdCBPTl9CRUhBTEZfT0YgPSBcIm9uX2JlaGFsZl9vZlwiO1xyXG5jb25zdCBGT0NJID0gXCJmb2NpXCI7XHJcbmNvbnN0IENDU19IRUFERVIgPSBcIlgtQW5jaG9yTWFpbGJveFwiO1xyXG5jb25zdCBSRVRVUk5fU1BBX0NPREUgPSBcInJldHVybl9zcGFfY29kZVwiO1xyXG5jb25zdCBOQVRJVkVfQlJPS0VSID0gXCJuYXRpdmVicm9rZXJcIjtcclxuY29uc3QgTE9HT1VUX0hJTlQgPSBcImxvZ291dF9oaW50XCI7XHJcbmNvbnN0IFNJRCA9IFwic2lkXCI7XHJcbmNvbnN0IExPR0lOX0hJTlQgPSBcImxvZ2luX2hpbnRcIjtcclxuY29uc3QgRE9NQUlOX0hJTlQgPSBcImRvbWFpbl9oaW50XCI7XHJcbmNvbnN0IFhfQ0xJRU5UX0VYVFJBX1NLVSA9IFwieC1jbGllbnQteHRyYS1za3VcIjtcclxuY29uc3QgQlJPS0VSX0NMSUVOVF9JRCA9IFwiYnJrX2NsaWVudF9pZFwiO1xyXG5jb25zdCBCUk9LRVJfUkVESVJFQ1RfVVJJID0gXCJicmtfcmVkaXJlY3RfdXJpXCI7XG5cbmV4cG9ydCB7IEFDQ0VTU19UT0tFTiwgQlJPS0VSX0NMSUVOVF9JRCwgQlJPS0VSX1JFRElSRUNUX1VSSSwgQ0NTX0hFQURFUiwgQ0xBSU1TLCBDTElFTlRfQVNTRVJUSU9OLCBDTElFTlRfQVNTRVJUSU9OX1RZUEUsIENMSUVOVF9JRCwgQ0xJRU5UX0lORk8sIENMSUVOVF9SRVFVRVNUX0lELCBDTElFTlRfU0VDUkVULCBDT0RFLCBDT0RFX0NIQUxMRU5HRSwgQ09ERV9DSEFMTEVOR0VfTUVUSE9ELCBDT0RFX1ZFUklGSUVSLCBERVZJQ0VfQ09ERSwgRE9NQUlOX0hJTlQsIEVSUk9SLCBFUlJPUl9ERVNDUklQVElPTiwgRVhQSVJFU19JTiwgRk9DSSwgR1JBTlRfVFlQRSwgSURfVE9LRU4sIElEX1RPS0VOX0hJTlQsIExPR0lOX0hJTlQsIExPR09VVF9ISU5ULCBOQVRJVkVfQlJPS0VSLCBOT05DRSwgT0JPX0FTU0VSVElPTiwgT05fQkVIQUxGX09GLCBQT1NUX0xPR09VVF9VUkksIFBST01QVCwgUkVESVJFQ1RfVVJJLCBSRUZSRVNIX1RPS0VOLCBSRUZSRVNIX1RPS0VOX0VYUElSRVNfSU4sIFJFUVVFU1RFRF9UT0tFTl9VU0UsIFJFUV9DTkYsIFJFU1BPTlNFX01PREUsIFJFU1BPTlNFX1RZUEUsIFJFVFVSTl9TUEFfQ09ERSwgU0NPUEUsIFNFU1NJT05fU1RBVEUsIFNJRCwgU1RBVEUsIFRPS0VOX1RZUEUsIFhfQVBQX05BTUUsIFhfQVBQX1ZFUiwgWF9DTElFTlRfQ1BVLCBYX0NMSUVOVF9DVVJSX1RFTEVNLCBYX0NMSUVOVF9FWFRSQV9TS1UsIFhfQ0xJRU5UX0xBU1RfVEVMRU0sIFhfQ0xJRU5UX09TLCBYX0NMSUVOVF9TS1UsIFhfQ0xJRU5UX1ZFUiwgWF9NU19MSUJfQ0FQQUJJTElUWSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QUFEU2VydmVyUGFyYW1LZXlzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yLm1qcyc7XG5pbXBvcnQgeyBDb2RlQ2hhbGxlbmdlTWV0aG9kVmFsdWVzLCBQcm9tcHRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgcmVkaXJlY3RVcmlFbXB0eSwgaW52YWxpZFByb21wdFZhbHVlLCBpbnZhbGlkQ2xhaW1zLCBwa2NlUGFyYW1zTWlzc2luZywgaW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2QgfSBmcm9tICcuLi9lcnJvci9DbGllbnRDb25maWd1cmF0aW9uRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyBzZXJ2ZXIgY29uc3VtYWJsZSBwYXJhbXMgZnJvbSB0aGUgXCJyZXF1ZXN0XCIgb2JqZWN0c1xyXG4gKi9cclxuY2xhc3MgUmVxdWVzdFZhbGlkYXRvciB7XHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgdG8gY2hlY2sgaWYgdGhlIGByZWRpcmVjdFVyaWAgaW4gdGhlIHJlcXVlc3QgaXMgYSBub24tbnVsbCB2YWx1ZVxyXG4gICAgICogQHBhcmFtIHJlZGlyZWN0VXJpXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB2YWxpZGF0ZVJlZGlyZWN0VXJpKHJlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgaWYgKCFyZWRpcmVjdFVyaSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IocmVkaXJlY3RVcmlFbXB0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXR5IHRvIHZhbGlkYXRlIHByb21wdCBzZW50IGJ5IHRoZSB1c2VyIGluIHRoZSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gcHJvbXB0XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB2YWxpZGF0ZVByb21wdChwcm9tcHQpIHtcclxuICAgICAgICBjb25zdCBwcm9tcHRWYWx1ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIGluIFByb21wdFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHByb21wdFZhbHVlcy5wdXNoKFByb21wdFZhbHVlW3ZhbHVlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9tcHRWYWx1ZXMuaW5kZXhPZihwcm9tcHQpIDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoaW52YWxpZFByb21wdFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdmFsaWRhdGVDbGFpbXMoY2xhaW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgSlNPTi5wYXJzZShjbGFpbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoaW52YWxpZENsYWltcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXR5IHRvIHZhbGlkYXRlIGNvZGVfY2hhbGxlbmdlIGFuZCBjb2RlX2NoYWxsZW5nZV9tZXRob2RcclxuICAgICAqIEBwYXJhbSBjb2RlQ2hhbGxlbmdlXHJcbiAgICAgKiBAcGFyYW0gY29kZUNoYWxsZW5nZU1ldGhvZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdmFsaWRhdGVDb2RlQ2hhbGxlbmdlUGFyYW1zKGNvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2QpIHtcclxuICAgICAgICBpZiAoIWNvZGVDaGFsbGVuZ2UgfHwgIWNvZGVDaGFsbGVuZ2VNZXRob2QpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKHBrY2VQYXJhbXNNaXNzaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb2RlQ2hhbGxlbmdlTWV0aG9kKGNvZGVDaGFsbGVuZ2VNZXRob2QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXRpbGl0eSB0byB2YWxpZGF0ZSBjb2RlX2NoYWxsZW5nZV9tZXRob2RcclxuICAgICAqIEBwYXJhbSBjb2RlQ2hhbGxlbmdlTWV0aG9kXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB2YWxpZGF0ZUNvZGVDaGFsbGVuZ2VNZXRob2QoY29kZUNoYWxsZW5nZU1ldGhvZCkge1xyXG4gICAgICAgIGlmIChbXHJcbiAgICAgICAgICAgIENvZGVDaGFsbGVuZ2VNZXRob2RWYWx1ZXMuUExBSU4sXHJcbiAgICAgICAgICAgIENvZGVDaGFsbGVuZ2VNZXRob2RWYWx1ZXMuUzI1NixcclxuICAgICAgICBdLmluZGV4T2YoY29kZUNoYWxsZW5nZU1ldGhvZCkgPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcihpbnZhbGlkQ29kZUNoYWxsZW5nZU1ldGhvZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFJlcXVlc3RWYWxpZGF0b3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcXVlc3RWYWxpZGF0b3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDb25zdGFudHMsIFJlc3BvbnNlTW9kZSwgT0lEQ19ERUZBVUxUX1NDT1BFUywgSGVhZGVyTmFtZXMsIENMSUVOVF9JTkZPLCBDbGFpbXNSZXF1ZXN0S2V5cywgUGFzc3dvcmRHcmFudENvbnN0YW50cywgQXV0aGVudGljYXRpb25TY2hlbWUsIFRocm90dGxpbmdDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Db25zdGFudHMubWpzJztcbmltcG9ydCB7IFJFU1BPTlNFX1RZUEUsIFJFU1BPTlNFX01PREUsIE5BVElWRV9CUk9LRVIsIFNDT1BFLCBDTElFTlRfSUQsIFJFRElSRUNUX1VSSSwgUE9TVF9MT0dPVVRfVVJJLCBJRF9UT0tFTl9ISU5ULCBET01BSU5fSElOVCwgTE9HSU5fSElOVCwgU0lELCBDTEFJTVMsIENMSUVOVF9SRVFVRVNUX0lELCBYX0NMSUVOVF9TS1UsIFhfQ0xJRU5UX1ZFUiwgWF9DTElFTlRfT1MsIFhfQ0xJRU5UX0NQVSwgWF9BUFBfTkFNRSwgWF9BUFBfVkVSLCBQUk9NUFQsIFNUQVRFLCBOT05DRSwgQ09ERV9DSEFMTEVOR0UsIENPREVfQ0hBTExFTkdFX01FVEhPRCwgQ09ERSwgREVWSUNFX0NPREUsIFJFRlJFU0hfVE9LRU4sIENPREVfVkVSSUZJRVIsIENMSUVOVF9TRUNSRVQsIENMSUVOVF9BU1NFUlRJT04sIENMSUVOVF9BU1NFUlRJT05fVFlQRSwgT0JPX0FTU0VSVElPTiwgUkVRVUVTVEVEX1RPS0VOX1VTRSwgR1JBTlRfVFlQRSwgVE9LRU5fVFlQRSwgUkVRX0NORiwgWF9DTElFTlRfQ1VSUl9URUxFTSwgWF9DTElFTlRfTEFTVF9URUxFTSwgWF9NU19MSUJfQ0FQQUJJTElUWSwgTE9HT1VUX0hJTlQsIEJST0tFUl9DTElFTlRfSUQsIEJST0tFUl9SRURJUkVDVF9VUkkgfSBmcm9tICcuLi9jb25zdGFudHMvQUFEU2VydmVyUGFyYW1LZXlzLm1qcyc7XG5pbXBvcnQgeyBTY29wZVNldCB9IGZyb20gJy4vU2NvcGVTZXQubWpzJztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvci5tanMnO1xuaW1wb3J0IHsgUmVxdWVzdFZhbGlkYXRvciB9IGZyb20gJy4vUmVxdWVzdFZhbGlkYXRvci5tanMnO1xuaW1wb3J0IHsgcGtjZVBhcmFtc01pc3NpbmcsIGludmFsaWRDbGFpbXMgfSBmcm9tICcuLi9lcnJvci9DbGllbnRDb25maWd1cmF0aW9uRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaW5zdHJ1bWVudEJyb2tlclBhcmFtcyhwYXJhbWV0ZXJzLCBjb3JyZWxhdGlvbklkLCBwZXJmb3JtYW5jZUNsaWVudCkge1xyXG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2xpZW50SWQgPSBwYXJhbWV0ZXJzLmdldChDTElFTlRfSUQpO1xyXG4gICAgaWYgKGNsaWVudElkICYmIHBhcmFtZXRlcnMuaGFzKEJST0tFUl9DTElFTlRfSUQpKSB7XHJcbiAgICAgICAgcGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7XHJcbiAgICAgICAgICAgIGVtYmVkZGVkQ2xpZW50SWQ6IGNsaWVudElkLFxyXG4gICAgICAgICAgICBlbWJlZGRlZFJlZGlyZWN0VXJpOiBwYXJhbWV0ZXJzLmdldChSRURJUkVDVF9VUkkpLFxyXG4gICAgICAgIH0sIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG59XHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIge1xyXG4gICAgY29uc3RydWN0b3IoY29ycmVsYXRpb25JZCwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCByZXNwb25zZV90eXBlID0gY29kZVxyXG4gICAgICovXHJcbiAgICBhZGRSZXNwb25zZVR5cGVDb2RlKCkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoUkVTUE9OU0VfVFlQRSwgZW5jb2RlVVJJQ29tcG9uZW50KENvbnN0YW50cy5DT0RFX1JFU1BPTlNFX1RZUEUpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIHJlc3BvbnNlX3R5cGUgPSB0b2tlbiBpZF90b2tlblxyXG4gICAgICovXHJcbiAgICBhZGRSZXNwb25zZVR5cGVGb3JUb2tlbkFuZElkVG9rZW4oKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChSRVNQT05TRV9UWVBFLCBlbmNvZGVVUklDb21wb25lbnQoYCR7Q29uc3RhbnRzLlRPS0VOX1JFU1BPTlNFX1RZUEV9ICR7Q29uc3RhbnRzLklEX1RPS0VOX1JFU1BPTlNFX1RZUEV9YCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgcmVzcG9uc2VfbW9kZS4gZGVmYXVsdHMgdG8gcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VNb2RlXHJcbiAgICAgKi9cclxuICAgIGFkZFJlc3BvbnNlTW9kZShyZXNwb25zZU1vZGUpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFJFU1BPTlNFX01PREUsIGVuY29kZVVSSUNvbXBvbmVudChyZXNwb25zZU1vZGUgPyByZXNwb25zZU1vZGUgOiBSZXNwb25zZU1vZGUuUVVFUlkpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGZsYWcgdG8gaW5kaWNhdGUgU1RTIHNob3VsZCBhdHRlbXB0IHRvIHVzZSBXQU0gaWYgYXZhaWxhYmxlXHJcbiAgICAgKi9cclxuICAgIGFkZE5hdGl2ZUJyb2tlcigpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KE5BVElWRV9CUk9LRVIsIGVuY29kZVVSSUNvbXBvbmVudChcIjFcIikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgc2NvcGVzLiBzZXQgYWRkT2lkY1Njb3BlcyB0byBmYWxzZSB0byBwcmV2ZW50IGRlZmF1bHQgc2NvcGVzIGluIG5vbi11c2VyIHNjZW5hcmlvc1xyXG4gICAgICogQHBhcmFtIHNjb3BlU2V0XHJcbiAgICAgKiBAcGFyYW0gYWRkT2lkY1Njb3Blc1xyXG4gICAgICovXHJcbiAgICBhZGRTY29wZXMoc2NvcGVzLCBhZGRPaWRjU2NvcGVzID0gdHJ1ZSwgZGVmYXVsdFNjb3BlcyA9IE9JRENfREVGQVVMVF9TQ09QRVMpIHtcclxuICAgICAgICAvLyBBbHdheXMgYWRkIG9wZW5pZCB0byB0aGUgc2NvcGVzIHdoZW4gYWRkaW5nIE9JREMgc2NvcGVzXHJcbiAgICAgICAgaWYgKGFkZE9pZGNTY29wZXMgJiZcclxuICAgICAgICAgICAgIWRlZmF1bHRTY29wZXMuaW5jbHVkZXMoXCJvcGVuaWRcIikgJiZcclxuICAgICAgICAgICAgIXNjb3Blcy5pbmNsdWRlcyhcIm9wZW5pZFwiKSkge1xyXG4gICAgICAgICAgICBkZWZhdWx0U2NvcGVzLnB1c2goXCJvcGVuaWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTY29wZXMgPSBhZGRPaWRjU2NvcGVzXHJcbiAgICAgICAgICAgID8gWy4uLihzY29wZXMgfHwgW10pLCAuLi5kZWZhdWx0U2NvcGVzXVxyXG4gICAgICAgICAgICA6IHNjb3BlcyB8fCBbXTtcclxuICAgICAgICBjb25zdCBzY29wZVNldCA9IG5ldyBTY29wZVNldChyZXF1ZXN0U2NvcGVzKTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFNDT1BFLCBlbmNvZGVVUklDb21wb25lbnQoc2NvcGVTZXQucHJpbnRTY29wZXMoKSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgY2xpZW50SWRcclxuICAgICAqIEBwYXJhbSBjbGllbnRJZFxyXG4gICAgICovXHJcbiAgICBhZGRDbGllbnRJZChjbGllbnRJZCkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoQ0xJRU5UX0lELCBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50SWQpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIHJlZGlyZWN0X3VyaVxyXG4gICAgICogQHBhcmFtIHJlZGlyZWN0VXJpXHJcbiAgICAgKi9cclxuICAgIGFkZFJlZGlyZWN0VXJpKHJlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgUmVxdWVzdFZhbGlkYXRvci52YWxpZGF0ZVJlZGlyZWN0VXJpKHJlZGlyZWN0VXJpKTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFJFRElSRUNUX1VSSSwgZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJpKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBwb3N0IGxvZ291dCByZWRpcmVjdFVyaVxyXG4gICAgICogQHBhcmFtIHJlZGlyZWN0VXJpXHJcbiAgICAgKi9cclxuICAgIGFkZFBvc3RMb2dvdXRSZWRpcmVjdFVyaShyZWRpcmVjdFVyaSkge1xyXG4gICAgICAgIFJlcXVlc3RWYWxpZGF0b3IudmFsaWRhdGVSZWRpcmVjdFVyaShyZWRpcmVjdFVyaSk7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChQT1NUX0xPR09VVF9VUkksIGVuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVyaSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgaWRfdG9rZW5faGludCB0byBsb2dvdXQgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5IaW50XHJcbiAgICAgKi9cclxuICAgIGFkZElkVG9rZW5IaW50KGlkVG9rZW5IaW50KSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChJRF9UT0tFTl9ISU5ULCBlbmNvZGVVUklDb21wb25lbnQoaWRUb2tlbkhpbnQpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIGRvbWFpbl9oaW50XHJcbiAgICAgKiBAcGFyYW0gZG9tYWluSGludFxyXG4gICAgICovXHJcbiAgICBhZGREb21haW5IaW50KGRvbWFpbkhpbnQpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KERPTUFJTl9ISU5ULCBlbmNvZGVVUklDb21wb25lbnQoZG9tYWluSGludCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgbG9naW5faGludFxyXG4gICAgICogQHBhcmFtIGxvZ2luSGludFxyXG4gICAgICovXHJcbiAgICBhZGRMb2dpbkhpbnQobG9naW5IaW50KSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChMT0dJTl9ISU5ULCBlbmNvZGVVUklDb21wb25lbnQobG9naW5IaW50KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIENDUyAoQ2FjaGUgQ3JlZGVudGlhbCBTZXJ2aWNlKSBxdWVyeSBwYXJhbWV0ZXIgZm9yIGxvZ2luX2hpbnRcclxuICAgICAqIEBwYXJhbSBsb2dpbkhpbnRcclxuICAgICAqL1xyXG4gICAgYWRkQ2NzVXBuKGxvZ2luSGludCkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoSGVhZGVyTmFtZXMuQ0NTX0hFQURFUiwgZW5jb2RlVVJJQ29tcG9uZW50KGBVUE46JHtsb2dpbkhpbnR9YCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBDQ1MgKENhY2hlIENyZWRlbnRpYWwgU2VydmljZSkgcXVlcnkgcGFyYW1ldGVyIGZvciBhY2NvdW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIGxvZ2luSGludFxyXG4gICAgICovXHJcbiAgICBhZGRDY3NPaWQoY2xpZW50SW5mbykge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoSGVhZGVyTmFtZXMuQ0NTX0hFQURFUiwgZW5jb2RlVVJJQ29tcG9uZW50KGBPaWQ6JHtjbGllbnRJbmZvLnVpZH1AJHtjbGllbnRJbmZvLnV0aWR9YCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgc2lkXHJcbiAgICAgKiBAcGFyYW0gc2lkXHJcbiAgICAgKi9cclxuICAgIGFkZFNpZChzaWQpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFNJRCwgZW5jb2RlVVJJQ29tcG9uZW50KHNpZCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgY2xhaW1zXHJcbiAgICAgKiBAcGFyYW0gY2xhaW1zXHJcbiAgICAgKi9cclxuICAgIGFkZENsYWltcyhjbGFpbXMsIGNsaWVudENhcGFiaWxpdGllcykge1xyXG4gICAgICAgIGNvbnN0IG1lcmdlZENsYWltcyA9IHRoaXMuYWRkQ2xpZW50Q2FwYWJpbGl0aWVzVG9DbGFpbXMoY2xhaW1zLCBjbGllbnRDYXBhYmlsaXRpZXMpO1xyXG4gICAgICAgIFJlcXVlc3RWYWxpZGF0b3IudmFsaWRhdGVDbGFpbXMobWVyZ2VkQ2xhaW1zKTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KENMQUlNUywgZW5jb2RlVVJJQ29tcG9uZW50KG1lcmdlZENsYWltcykpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgY29ycmVsYXRpb25JZFxyXG4gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWRcclxuICAgICAqL1xyXG4gICAgYWRkQ29ycmVsYXRpb25JZChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChDTElFTlRfUkVRVUVTVF9JRCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvcnJlbGF0aW9uSWQpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIGxpYnJhcnkgaW5mbyBxdWVyeSBwYXJhbXNcclxuICAgICAqIEBwYXJhbSBsaWJyYXJ5SW5mb1xyXG4gICAgICovXHJcbiAgICBhZGRMaWJyYXJ5SW5mbyhsaWJyYXJ5SW5mbykge1xyXG4gICAgICAgIC8vIFRlbGVtZXRyeSBJbmZvXHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0NMSUVOVF9TS1UsIGxpYnJhcnlJbmZvLnNrdSk7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0NMSUVOVF9WRVIsIGxpYnJhcnlJbmZvLnZlcnNpb24pO1xyXG4gICAgICAgIGlmIChsaWJyYXJ5SW5mby5vcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFhfQ0xJRU5UX09TLCBsaWJyYXJ5SW5mby5vcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaWJyYXJ5SW5mby5jcHUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0NMSUVOVF9DUFUsIGxpYnJhcnlJbmZvLmNwdSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgY2xpZW50IHRlbGVtZXRyeSBwYXJhbWV0ZXJzXHJcbiAgICAgKiBAcGFyYW0gYXBwVGVsZW1ldHJ5XHJcbiAgICAgKi9cclxuICAgIGFkZEFwcGxpY2F0aW9uVGVsZW1ldHJ5KGFwcFRlbGVtZXRyeSkge1xyXG4gICAgICAgIGlmIChhcHBUZWxlbWV0cnk/LmFwcE5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0FQUF9OQU1FLCBhcHBUZWxlbWV0cnkuYXBwTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcHBUZWxlbWV0cnk/LmFwcFZlcnNpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0FQUF9WRVIsIGFwcFRlbGVtZXRyeS5hcHBWZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBwcm9tcHRcclxuICAgICAqIEBwYXJhbSBwcm9tcHRcclxuICAgICAqL1xyXG4gICAgYWRkUHJvbXB0KHByb21wdCkge1xyXG4gICAgICAgIFJlcXVlc3RWYWxpZGF0b3IudmFsaWRhdGVQcm9tcHQocHJvbXB0KTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KGAke1BST01QVH1gLCBlbmNvZGVVUklDb21wb25lbnQocHJvbXB0KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBzdGF0ZVxyXG4gICAgICogQHBhcmFtIHN0YXRlXHJcbiAgICAgKi9cclxuICAgIGFkZFN0YXRlKHN0YXRlKSB7XHJcbiAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoU1RBVEUsIGVuY29kZVVSSUNvbXBvbmVudChzdGF0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIG5vbmNlXHJcbiAgICAgKiBAcGFyYW0gbm9uY2VcclxuICAgICAqL1xyXG4gICAgYWRkTm9uY2Uobm9uY2UpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KE5PTkNFLCBlbmNvZGVVUklDb21wb25lbnQobm9uY2UpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIGNvZGVfY2hhbGxlbmdlIGFuZCBjb2RlX2NoYWxsZW5nZV9tZXRob2RcclxuICAgICAqIC0gdGhyb3cgaWYgZWl0aGVyIG9mIHRoZW0gYXJlIG5vdCBwYXNzZWRcclxuICAgICAqIEBwYXJhbSBjb2RlQ2hhbGxlbmdlXHJcbiAgICAgKiBAcGFyYW0gY29kZUNoYWxsZW5nZU1ldGhvZFxyXG4gICAgICovXHJcbiAgICBhZGRDb2RlQ2hhbGxlbmdlUGFyYW1zKGNvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2QpIHtcclxuICAgICAgICBSZXF1ZXN0VmFsaWRhdG9yLnZhbGlkYXRlQ29kZUNoYWxsZW5nZVBhcmFtcyhjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kKTtcclxuICAgICAgICBpZiAoY29kZUNoYWxsZW5nZSAmJiBjb2RlQ2hhbGxlbmdlTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoQ09ERV9DSEFMTEVOR0UsIGVuY29kZVVSSUNvbXBvbmVudChjb2RlQ2hhbGxlbmdlKSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoQ09ERV9DSEFMTEVOR0VfTUVUSE9ELCBlbmNvZGVVUklDb21wb25lbnQoY29kZUNoYWxsZW5nZU1ldGhvZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKHBrY2VQYXJhbXNNaXNzaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCB0aGUgYGF1dGhvcml6YXRpb25fY29kZWAgcGFzc2VkIGJ5IHRoZSB1c2VyIHRvIGV4Y2hhbmdlIGZvciBhIHRva2VuXHJcbiAgICAgKiBAcGFyYW0gY29kZVxyXG4gICAgICovXHJcbiAgICBhZGRBdXRob3JpemF0aW9uQ29kZShjb2RlKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChDT0RFLCBlbmNvZGVVUklDb21wb25lbnQoY29kZSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgdGhlIGBhdXRob3JpemF0aW9uX2NvZGVgIHBhc3NlZCBieSB0aGUgdXNlciB0byBleGNoYW5nZSBmb3IgYSB0b2tlblxyXG4gICAgICogQHBhcmFtIGNvZGVcclxuICAgICAqL1xyXG4gICAgYWRkRGV2aWNlQ29kZShjb2RlKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChERVZJQ0VfQ09ERSwgZW5jb2RlVVJJQ29tcG9uZW50KGNvZGUpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIHRoZSBgcmVmcmVzaFRva2VuYCBwYXNzZWQgYnkgdGhlIHVzZXJcclxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW5cclxuICAgICAqL1xyXG4gICAgYWRkUmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoUkVGUkVTSF9UT0tFTiwgZW5jb2RlVVJJQ29tcG9uZW50KHJlZnJlc2hUb2tlbikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgdGhlIGBjb2RlX3ZlcmlmaWVyYCBwYXNzZWQgYnkgdGhlIHVzZXIgdG8gZXhjaGFuZ2UgZm9yIGEgdG9rZW5cclxuICAgICAqIEBwYXJhbSBjb2RlVmVyaWZpZXJcclxuICAgICAqL1xyXG4gICAgYWRkQ29kZVZlcmlmaWVyKGNvZGVWZXJpZmllcikge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoQ09ERV9WRVJJRklFUiwgZW5jb2RlVVJJQ29tcG9uZW50KGNvZGVWZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgY2xpZW50X3NlY3JldFxyXG4gICAgICogQHBhcmFtIGNsaWVudFNlY3JldFxyXG4gICAgICovXHJcbiAgICBhZGRDbGllbnRTZWNyZXQoY2xpZW50U2VjcmV0KSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChDTElFTlRfU0VDUkVULCBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50U2VjcmV0KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBjbGllbnRBc3NlcnRpb24gZm9yIGNvbmZpZGVudGlhbCBjbGllbnQgZmxvd3NcclxuICAgICAqIEBwYXJhbSBjbGllbnRBc3NlcnRpb25cclxuICAgICAqL1xyXG4gICAgYWRkQ2xpZW50QXNzZXJ0aW9uKGNsaWVudEFzc2VydGlvbikge1xyXG4gICAgICAgIGlmIChjbGllbnRBc3NlcnRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChDTElFTlRfQVNTRVJUSU9OLCBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50QXNzZXJ0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgY2xpZW50QXNzZXJ0aW9uVHlwZSBmb3IgY29uZmlkZW50aWFsIGNsaWVudCBmbG93c1xyXG4gICAgICogQHBhcmFtIGNsaWVudEFzc2VydGlvblR5cGVcclxuICAgICAqL1xyXG4gICAgYWRkQ2xpZW50QXNzZXJ0aW9uVHlwZShjbGllbnRBc3NlcnRpb25UeXBlKSB7XHJcbiAgICAgICAgaWYgKGNsaWVudEFzc2VydGlvblR5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChDTElFTlRfQVNTRVJUSU9OX1RZUEUsIGVuY29kZVVSSUNvbXBvbmVudChjbGllbnRBc3NlcnRpb25UeXBlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgT0JPIGFzc2VydGlvbiBmb3IgY29uZmlkZW50aWFsIGNsaWVudCBmbG93c1xyXG4gICAgICogQHBhcmFtIGNsaWVudEFzc2VydGlvblxyXG4gICAgICovXHJcbiAgICBhZGRPYm9Bc3NlcnRpb24ob2JvQXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChPQk9fQVNTRVJUSU9OLCBlbmNvZGVVUklDb21wb25lbnQob2JvQXNzZXJ0aW9uKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBncmFudCB0eXBlXHJcbiAgICAgKiBAcGFyYW0gZ3JhbnRUeXBlXHJcbiAgICAgKi9cclxuICAgIGFkZFJlcXVlc3RUb2tlblVzZSh0b2tlblVzZSkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoUkVRVUVTVEVEX1RPS0VOX1VTRSwgZW5jb2RlVVJJQ29tcG9uZW50KHRva2VuVXNlKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBncmFudCB0eXBlXHJcbiAgICAgKiBAcGFyYW0gZ3JhbnRUeXBlXHJcbiAgICAgKi9cclxuICAgIGFkZEdyYW50VHlwZShncmFudFR5cGUpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KEdSQU5UX1RZUEUsIGVuY29kZVVSSUNvbXBvbmVudChncmFudFR5cGUpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIGNsaWVudCBpbmZvXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBhZGRDbGllbnRJbmZvKCkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoQ0xJRU5UX0lORk8sIFwiMVwiKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIGV4dHJhUXVlcnlQYXJhbXNcclxuICAgICAqIEBwYXJhbSBlUVBhcmFtc1xyXG4gICAgICovXHJcbiAgICBhZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyhlUVBhcmFtcykge1xyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVRUGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtZXRlcnMuaGFzKGtleSkgJiYgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFkZENsaWVudENhcGFiaWxpdGllc1RvQ2xhaW1zKGNsYWltcywgY2xpZW50Q2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgbGV0IG1lcmdlZENsYWltcztcclxuICAgICAgICAvLyBQYXJzZSBwcm92aWRlZCBjbGFpbXMgaW50byBKU09OIG9iamVjdCBvciBpbml0aWFsaXplIGVtcHR5IG9iamVjdFxyXG4gICAgICAgIGlmICghY2xhaW1zKSB7XHJcbiAgICAgICAgICAgIG1lcmdlZENsYWltcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIG1lcmdlZENsYWltcyA9IEpTT04ucGFyc2UoY2xhaW1zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGludmFsaWRDbGFpbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjbGllbnRDYXBhYmlsaXRpZXMgJiYgY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCFtZXJnZWRDbGFpbXMuaGFzT3duUHJvcGVydHkoQ2xhaW1zUmVxdWVzdEtleXMuQUNDRVNTX1RPS0VOKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIGFjY2Vzc190b2tlbiBrZXkgdG8gY2xhaW1zIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VkQ2xhaW1zW0NsYWltc1JlcXVlc3RLZXlzLkFDQ0VTU19UT0tFTl0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBBZGQgeG1zX2NjIGNsYWltIHdpdGggcHJvdmlkZWQgY2xpZW50Q2FwYWJpbGl0aWVzIHRvIGFjY2Vzc190b2tlbiBrZXlcclxuICAgICAgICAgICAgbWVyZ2VkQ2xhaW1zW0NsYWltc1JlcXVlc3RLZXlzLkFDQ0VTU19UT0tFTl1bQ2xhaW1zUmVxdWVzdEtleXMuWE1TX0NDXSA9IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlczogY2xpZW50Q2FwYWJpbGl0aWVzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobWVyZ2VkQ2xhaW1zKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkcyBgdXNlcm5hbWVgIGZvciBQYXNzd29yZCBHcmFudCBmbG93XHJcbiAgICAgKiBAcGFyYW0gdXNlcm5hbWVcclxuICAgICAqL1xyXG4gICAgYWRkVXNlcm5hbWUodXNlcm5hbWUpIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFBhc3N3b3JkR3JhbnRDb25zdGFudHMudXNlcm5hbWUsIGVuY29kZVVSSUNvbXBvbmVudCh1c2VybmFtZSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGRzIGBwYXNzd29yZGAgZm9yIFBhc3N3b3JkIEdyYW50IGZsb3dcclxuICAgICAqIEBwYXJhbSBwYXNzd29yZFxyXG4gICAgICovXHJcbiAgICBhZGRQYXNzd29yZChwYXNzd29yZCkge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoUGFzc3dvcmRHcmFudENvbnN0YW50cy5wYXNzd29yZCwgZW5jb2RlVVJJQ29tcG9uZW50KHBhc3N3b3JkKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFkZCBwb3BfandrIHRvIHF1ZXJ5IHBhcmFtc1xyXG4gICAgICogQHBhcmFtIGNuZlN0cmluZ1xyXG4gICAgICovXHJcbiAgICBhZGRQb3BUb2tlbihjbmZTdHJpbmcpIHtcclxuICAgICAgICBpZiAoY25mU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoVE9LRU5fVFlQRSwgQXV0aGVudGljYXRpb25TY2hlbWUuUE9QKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChSRVFfQ05GLCBlbmNvZGVVUklDb21wb25lbnQoY25mU3RyaW5nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhZGQgU1NIIEpXSyBhbmQga2V5IElEIHRvIHF1ZXJ5IHBhcmFtc1xyXG4gICAgICovXHJcbiAgICBhZGRTc2hKd2soc3NoSndrU3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHNzaEp3a1N0cmluZykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2V0KFRPS0VOX1RZUEUsIEF1dGhlbnRpY2F0aW9uU2NoZW1lLlNTSCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoUkVRX0NORiwgZW5jb2RlVVJJQ29tcG9uZW50KHNzaEp3a1N0cmluZykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWRkIHNlcnZlciB0ZWxlbWV0cnkgZmllbGRzXHJcbiAgICAgKiBAcGFyYW0gc2VydmVyVGVsZW1ldHJ5TWFuYWdlclxyXG4gICAgICovXHJcbiAgICBhZGRTZXJ2ZXJUZWxlbWV0cnkoc2VydmVyVGVsZW1ldHJ5TWFuYWdlcikge1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXQoWF9DTElFTlRfQ1VSUl9URUxFTSwgc2VydmVyVGVsZW1ldHJ5TWFuYWdlci5nZW5lcmF0ZUN1cnJlbnRSZXF1ZXN0SGVhZGVyVmFsdWUoKSk7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX0NMSUVOVF9MQVNUX1RFTEVNLCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBwYXJhbWV0ZXIgdGhhdCBpbmRpY2F0ZXMgdG8gdGhlIHNlcnZlciB0aGF0IHRocm90dGxpbmcgaXMgc3VwcG9ydGVkXHJcbiAgICAgKi9cclxuICAgIGFkZFRocm90dGxpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChYX01TX0xJQl9DQVBBQklMSVRZLCBUaHJvdHRsaW5nQ29uc3RhbnRzLlhfTVNfTElCX0NBUEFCSUxJVFlfVkFMVUUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGxvZ291dF9oaW50IHBhcmFtZXRlciBmb3IgXCJzaWxlbnRcIiBsb2dvdXQgd2hpY2ggcHJldmVudCBzZXJ2ZXIgYWNjb3VudCBwaWNrZXJcclxuICAgICAqL1xyXG4gICAgYWRkTG9nb3V0SGludChsb2dvdXRIaW50KSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNldChMT0dPVVRfSElOVCwgZW5jb2RlVVJJQ29tcG9uZW50KGxvZ291dEhpbnQpKTtcclxuICAgIH1cclxuICAgIGFkZEJyb2tlclBhcmFtZXRlcnMocGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgYnJva2VyUGFyYW1zID0ge307XHJcbiAgICAgICAgYnJva2VyUGFyYW1zW0JST0tFUl9DTElFTlRfSURdID1cclxuICAgICAgICAgICAgcGFyYW1zLmJyb2tlckNsaWVudElkO1xyXG4gICAgICAgIGJyb2tlclBhcmFtc1tCUk9LRVJfUkVESVJFQ1RfVVJJXSA9XHJcbiAgICAgICAgICAgIHBhcmFtcy5icm9rZXJSZWRpcmVjdFVyaTtcclxuICAgICAgICB0aGlzLmFkZEV4dHJhUXVlcnlQYXJhbWV0ZXJzKGJyb2tlclBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgVVJMIGZyb20gdGhlIHBhcmFtcyBtYXBcclxuICAgICAqL1xyXG4gICAgY3JlYXRlUXVlcnlTdHJpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbWV0ZXJBcnJheSA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyQXJyYXkucHVzaChgJHtrZXl9PSR7dmFsdWV9YCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaW5zdHJ1bWVudEJyb2tlclBhcmFtcyh0aGlzLnBhcmFtZXRlcnMsIHRoaXMuY29ycmVsYXRpb25JZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1ldGVyQXJyYXkuam9pbihcIiZcIik7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQXV0aG9yaXR5LCBmb3JtYXRBdXRob3JpdHlVcmkgfSBmcm9tICcuL0F1dGhvcml0eS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50cyB9IGZyb20gJy4uL3RlbGVtZXRyeS9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZUV2ZW50Lm1qcyc7XG5pbXBvcnQgeyBpbnZva2VBc3luYyB9IGZyb20gJy4uL3V0aWxzL0Z1bmN0aW9uV3JhcHBlcnMubWpzJztcbmltcG9ydCB7IGVuZHBvaW50UmVzb2x1dGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gYXV0aG9yaXR5IG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlIGJhc2VkIG9uIHRoZSB1cmxcclxuICogUGVyZm9ybXMgYmFzaWMgYXV0aG9yaXR5IHZhbGlkYXRpb24gLSBjaGVja3MgdG8gc2VlIGlmIHRoZSBhdXRob3JpdHkgaXMgb2YgYSB2YWxpZCB0eXBlIChpLmUuIGFhZCwgYjJjLCBhZGZzKVxyXG4gKlxyXG4gKiBBbHNvIHBlcmZvcm1zIGVuZHBvaW50IGRpc2NvdmVyeS5cclxuICpcclxuICogQHBhcmFtIGF1dGhvcml0eVVyaVxyXG4gKiBAcGFyYW0gbmV0d29ya0NsaWVudFxyXG4gKiBAcGFyYW0gcHJvdG9jb2xNb2RlXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGlzY292ZXJlZEluc3RhbmNlKGF1dGhvcml0eVVyaSwgbmV0d29ya0NsaWVudCwgY2FjaGVNYW5hZ2VyLCBhdXRob3JpdHlPcHRpb25zLCBsb2dnZXIsIGNvcnJlbGF0aW9uSWQsIHBlcmZvcm1hbmNlQ2xpZW50KSB7XHJcbiAgICBwZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLCBjb3JyZWxhdGlvbklkKTtcclxuICAgIGNvbnN0IGF1dGhvcml0eVVyaUZpbmFsID0gQXV0aG9yaXR5LnRyYW5zZm9ybUNJQU1BdXRob3JpdHkoZm9ybWF0QXV0aG9yaXR5VXJpKGF1dGhvcml0eVVyaSkpO1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRob3JpdHkgYW5kIHBlcmZvcm0gZGlzY292ZXJ5IGVuZHBvaW50IGNoZWNrLlxyXG4gICAgY29uc3QgYWNxdWlyZVRva2VuQXV0aG9yaXR5ID0gbmV3IEF1dGhvcml0eShhdXRob3JpdHlVcmlGaW5hbCwgbmV0d29ya0NsaWVudCwgY2FjaGVNYW5hZ2VyLCBhdXRob3JpdHlPcHRpb25zLCBsb2dnZXIsIGNvcnJlbGF0aW9uSWQsIHBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgaW52b2tlQXN5bmMoYWNxdWlyZVRva2VuQXV0aG9yaXR5LnJlc29sdmVFbmRwb2ludHNBc3luYy5iaW5kKGFjcXVpcmVUb2tlbkF1dGhvcml0eSksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYywgbG9nZ2VyLCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkoKTtcclxuICAgICAgICByZXR1cm4gYWNxdWlyZVRva2VuQXV0aG9yaXR5O1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoZW5kcG9pbnRSZXNvbHV0aW9uRXJyb3IpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGNyZWF0ZURpc2NvdmVyZWRJbnN0YW5jZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aG9yaXR5RmFjdG9yeS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGJ1aWxkQ2xpZW50Q29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2NvbmZpZy9DbGllbnRDb25maWd1cmF0aW9uLm1qcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIvTG9nZ2VyLm1qcyc7XG5pbXBvcnQgeyBIZWFkZXJOYW1lcywgQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBuYW1lLCB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBDY3NDcmVkZW50aWFsVHlwZSB9IGZyb20gJy4uL2FjY291bnQvQ2NzQ3JlZGVudGlhbC5tanMnO1xuaW1wb3J0IHsgYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQgfSBmcm9tICcuLi9hY2NvdW50L0NsaWVudEluZm8ubWpzJztcbmltcG9ydCB7IFJlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0UGFyYW1ldGVyQnVpbGRlci5tanMnO1xuaW1wb3J0IHsgY3JlYXRlRGlzY292ZXJlZEluc3RhbmNlIH0gZnJvbSAnLi4vYXV0aG9yaXR5L0F1dGhvcml0eUZhY3RvcnkubWpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlRXZlbnQubWpzJztcbmltcG9ydCB7IFRocm90dGxpbmdVdGlscyB9IGZyb20gJy4uL25ldHdvcmsvVGhyb3R0bGluZ1V0aWxzLm1qcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9BdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgTmV0d29ya0Vycm9yIH0gZnJvbSAnLi4vZXJyb3IvTmV0d29ya0Vycm9yLm1qcyc7XG5pbXBvcnQgeyBpbnZva2VBc3luYyB9IGZyb20gJy4uL3V0aWxzL0Z1bmN0aW9uV3JhcHBlcnMubWpzJztcbmltcG9ydCB7IG5ldHdvcmtFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQmFzZSBhcHBsaWNhdGlvbiBjbGFzcyB3aGljaCB3aWxsIGNvbnN0cnVjdCByZXF1ZXN0cyB0byBzZW5kIHRvIGFuZCBoYW5kbGUgcmVzcG9uc2VzIGZyb20gdGhlIE1pY3Jvc29mdCBTVFMgdXNpbmcgdGhlIGF1dGhvcml6YXRpb24gY29kZSBmbG93LlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNsYXNzIEJhc2VDbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbiwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICAvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGJ1aWxkQ2xpZW50Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBsb2dnZXJcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcy5jb25maWcubG9nZ2VyT3B0aW9ucywgbmFtZSwgdmVyc2lvbik7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjcnlwdG9cclxuICAgICAgICB0aGlzLmNyeXB0b1V0aWxzID0gdGhpcy5jb25maWcuY3J5cHRvSW50ZXJmYWNlO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgc3RvcmFnZSBpbnRlcmZhY2VcclxuICAgICAgICB0aGlzLmNhY2hlTWFuYWdlciA9IHRoaXMuY29uZmlnLnN0b3JhZ2VJbnRlcmZhY2U7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBuZXR3b3JrIGludGVyZmFjZVxyXG4gICAgICAgIHRoaXMubmV0d29ya0NsaWVudCA9IHRoaXMuY29uZmlnLm5ldHdvcmtJbnRlcmZhY2U7XHJcbiAgICAgICAgLy8gU2V0IFRlbGVtZXRyeU1hbmFnZXJcclxuICAgICAgICB0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIgPSB0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyO1xyXG4gICAgICAgIC8vIHNldCBBdXRob3JpdHlcclxuICAgICAgICB0aGlzLmF1dGhvcml0eSA9IHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmF1dGhvcml0eTtcclxuICAgICAgICAvLyBzZXQgcGVyZm9ybWFuY2UgdGVsZW1ldHJ5IGNsaWVudFxyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQgPSBwZXJmb3JtYW5jZUNsaWVudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBkZWZhdWx0IGhlYWRlcnMgZm9yIHJlcXVlc3RzIHRvIHRva2VuIGVuZHBvaW50XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoY2NzQ3JlZCkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcclxuICAgICAgICBoZWFkZXJzW0hlYWRlck5hbWVzLkNPTlRFTlRfVFlQRV0gPSBDb25zdGFudHMuVVJMX0ZPUk1fQ09OVEVOVF9UWVBFO1xyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc3lzdGVtT3B0aW9ucy5wcmV2ZW50Q29yc1ByZWZsaWdodCAmJiBjY3NDcmVkKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY2NzQ3JlZC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENjc0NyZWRlbnRpYWxUeXBlLkhPTUVfQUNDT1VOVF9JRDpcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJbmZvID0gYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQoY2NzQ3JlZC5jcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1tIZWFkZXJOYW1lcy5DQ1NfSEVBREVSXSA9IGBPaWQ6JHtjbGllbnRJbmZvLnVpZH1AJHtjbGllbnRJbmZvLnV0aWR9YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkNvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXI6IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2NzQ3JlZGVudGlhbFR5cGUuVVBOOlxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbSGVhZGVyTmFtZXMuQ0NTX0hFQURFUl0gPSBgVVBOOiAke2Njc0NyZWQuY3JlZGVudGlhbH1gO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIdHRwIHBvc3QgdG8gdG9rZW4gZW5kcG9pbnRcclxuICAgICAqIEBwYXJhbSB0b2tlbkVuZHBvaW50XHJcbiAgICAgKiBAcGFyYW0gcXVlcnlTdHJpbmdcclxuICAgICAqIEBwYXJhbSBoZWFkZXJzXHJcbiAgICAgKiBAcGFyYW0gdGh1bWJwcmludFxyXG4gICAgICovXHJcbiAgICBhc3luYyBleGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCh0b2tlbkVuZHBvaW50LCBxdWVyeVN0cmluZywgaGVhZGVycywgdGh1bWJwcmludCwgY29ycmVsYXRpb25JZCwgcXVldWVkRXZlbnQpIHtcclxuICAgICAgICBpZiAocXVldWVkRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChxdWV1ZWRFdmVudCwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUG9zdFJlcXVlc3QodGh1bWJwcmludCwgdG9rZW5FbmRwb2ludCwgeyBib2R5OiBxdWVyeVN0cmluZywgaGVhZGVyczogaGVhZGVycyB9LCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciAmJlxyXG4gICAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPCA1MDAgJiZcclxuICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MjkpIHtcclxuICAgICAgICAgICAgLy8gVGVsZW1ldHJ5IGRhdGEgc3VjY2Vzc2Z1bGx5IGxvZ2dlZCBieSBzZXJ2ZXIsIGNsZWFyIFRlbGVtZXRyeSBjYWNoZVxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNsZWFyVGVsZW1ldHJ5Q2FjaGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwcyBzZW5kUG9zdFJlcXVlc3RBc3luYyB3aXRoIG5lY2Vzc2FyeSBwcmVmbGlnaHQgYW5kIHBvc3RmbGlnaHQgbG9naWNcclxuICAgICAqIEBwYXJhbSB0aHVtYnByaW50IC0gUmVxdWVzdCB0aHVtYnByaW50IGZvciB0aHJvdHRsaW5nXHJcbiAgICAgKiBAcGFyYW0gdG9rZW5FbmRwb2ludCAtIEVuZHBvaW50IHRvIG1ha2UgdGhlIFBPU1QgdG9cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQm9keSBhbmQgSGVhZGVycyB0byBpbmNsdWRlIG9uIHRoZSBQT1NUIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBjb3JyZWxhdGlvbklkIC0gQ29ycmVsYXRpb25JZCBmb3IgdGVsZW1ldHJ5XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNlbmRQb3N0UmVxdWVzdCh0aHVtYnByaW50LCB0b2tlbkVuZHBvaW50LCBvcHRpb25zLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgVGhyb3R0bGluZ1V0aWxzLnByZVByb2Nlc3ModGhpcy5jYWNoZU1hbmFnZXIsIHRodW1icHJpbnQpO1xyXG4gICAgICAgIGxldCByZXNwb25zZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGludm9rZUFzeW5jKCh0aGlzLm5ldHdvcmtDbGllbnQuc2VuZFBvc3RSZXF1ZXN0QXN5bmMuYmluZCh0aGlzLm5ldHdvcmtDbGllbnQpKSwgUGVyZm9ybWFuY2VFdmVudHMuTmV0d29ya0NsaWVudFNlbmRQb3N0UmVxdWVzdEFzeW5jLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkodG9rZW5FbmRwb2ludCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnMgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7XHJcbiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5TaXplOiByZXNwb25zZS5ib2R5LnJlZnJlc2hfdG9rZW4/Lmxlbmd0aCB8fCAwLFxyXG4gICAgICAgICAgICAgICAgaHR0cFZlclRva2VuOiByZXNwb25zZUhlYWRlcnNbSGVhZGVyTmFtZXMuWF9NU19IVFRQX1ZFUlNJT05dIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlc3BvbnNlSGVhZGVyc1tIZWFkZXJOYW1lcy5YX01TX1JFUVVFU1RfSURdIHx8IFwiXCIsXHJcbiAgICAgICAgICAgIH0sIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5ldHdvcmtFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gZS5yZXNwb25zZUhlYWRlcnM7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VIZWFkZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFZlclRva2VuOiByZXNwb25zZUhlYWRlcnNbSGVhZGVyTmFtZXMuWF9NU19IVFRQX1ZFUlNJT05dIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzcG9uc2VIZWFkZXJzW0hlYWRlck5hbWVzLlhfTVNfUkVRVUVTVF9JRF0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSGVhZGVyOiByZXNwb25zZUhlYWRlcnNbSGVhZGVyTmFtZXMuQ09OVEVOVF9UWVBFXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoSGVhZGVyOiByZXNwb25zZUhlYWRlcnNbSGVhZGVyTmFtZXMuQ09OVEVOVF9MRU5HVEhdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTdGF0dXM6IGUuaHR0cFN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICB9LCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IGUuZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IobmV0d29ya0Vycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBUaHJvdHRsaW5nVXRpbHMucG9zdFByb2Nlc3ModGhpcy5jYWNoZU1hbmFnZXIsIHRodW1icHJpbnQsIHJlc3BvbnNlKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGF1dGhvcml0eSBvYmplY3Qgb2YgdGhlIGNsaWVudC4gRW5kcG9pbnQgZGlzY292ZXJ5IG11c3QgYmUgY29tcGxldGVkLlxyXG4gICAgICogQHBhcmFtIHVwZGF0ZWRBdXRob3JpdHlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdXBkYXRlQXV0aG9yaXR5KGNsb3VkSW5zdGFuY2VIb3N0bmFtZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgY2xvdWRJbnN0YW5jZUF1dGhvcml0eVVyaSA9IGBodHRwczovLyR7Y2xvdWRJbnN0YW5jZUhvc3RuYW1lfS8ke3RoaXMuYXV0aG9yaXR5LnRlbmFudH0vYDtcclxuICAgICAgICBjb25zdCBjbG91ZEluc3RhbmNlQXV0aG9yaXR5ID0gYXdhaXQgY3JlYXRlRGlzY292ZXJlZEluc3RhbmNlKGNsb3VkSW5zdGFuY2VBdXRob3JpdHlVcmksIHRoaXMubmV0d29ya0NsaWVudCwgdGhpcy5jYWNoZU1hbmFnZXIsIHRoaXMuYXV0aG9yaXR5Lm9wdGlvbnMsIHRoaXMubG9nZ2VyLCBjb3JyZWxhdGlvbklkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICB0aGlzLmF1dGhvcml0eSA9IGNsb3VkSW5zdGFuY2VBdXRob3JpdHk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgcXVlcnkgc3RyaW5nIGZvciB0aGUgL3Rva2VuIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRva2VuUXVlcnlQYXJhbWV0ZXJzKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJCdWlsZGVyID0gbmV3IFJlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyKHJlcXVlc3QuY29ycmVsYXRpb25JZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZW1iZWRkZWRDbGllbnRJZCkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZEJyb2tlclBhcmFtZXRlcnMoe1xyXG4gICAgICAgICAgICAgICAgYnJva2VyQ2xpZW50SWQ6IHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgYnJva2VyUmVkaXJlY3RVcmk6IHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLnJlZGlyZWN0VXJpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcXVlc3QudG9rZW5RdWVyeVBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnRva2VuUXVlcnlQYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDb3JyZWxhdGlvbklkKHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlckJ1aWxkZXIuY3JlYXRlUXVlcnlTdHJpbmcoKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBCYXNlQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgbm93U2Vjb25kcyB9IGZyb20gJy4uL3V0aWxzL1RpbWVVdGlscy5tanMnO1xuaW1wb3J0IHsgVXJsU3RyaW5nIH0gZnJvbSAnLi4vdXJsL1VybFN0cmluZy5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi90ZWxlbWV0cnkvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VFdmVudC5tanMnO1xuaW1wb3J0IHsgaW52b2tlQXN5bmMgfSBmcm9tICcuLi91dGlscy9GdW5jdGlvbldyYXBwZXJzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBLZXlMb2NhdGlvbiA9IHtcclxuICAgIFNXOiBcInN3XCIsXHJcbiAgICBVSFc6IFwidWh3XCIsXHJcbn07XHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgUG9wVG9rZW5HZW5lcmF0b3Ige1xyXG4gICAgY29uc3RydWN0b3IoY3J5cHRvVXRpbHMsIHBlcmZvcm1hbmNlQ2xpZW50KSB7XHJcbiAgICAgICAgdGhpcy5jcnlwdG9VdGlscyA9IGNyeXB0b1V0aWxzO1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQgPSBwZXJmb3JtYW5jZUNsaWVudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIHRoZSByZXFfY25mIHZhbGlkYXRlZCBhdCB0aGUgUlAgaW4gdGhlIFBPUCBwcm90b2NvbCBmb3IgU0hSIHBhcmFtZXRlcnNcclxuICAgICAqIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXlpZCwgdGhlIGZ1bGwgcmVxX2NuZiBzdHJpbmcgYW5kIHRoZSByZXFfY25mIHN0cmluZyBoYXNoXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2VuZXJhdGVDbmYocmVxdWVzdCwgbG9nZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5Qb3BUb2tlbkdlbmVyYXRlQ25mLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHJlcUNuZiA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuZ2VuZXJhdGVLaWQuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuUG9wVG9rZW5HZW5lcmF0ZUNuZiwgbG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHJlcXVlc3QpO1xyXG4gICAgICAgIGNvbnN0IHJlcUNuZlN0cmluZyA9IHRoaXMuY3J5cHRvVXRpbHMuYmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KHJlcUNuZikpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtpZDogcmVxQ25mLmtpZCxcclxuICAgICAgICAgICAgcmVxQ25mU3RyaW5nLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBrZXlfaWQgZm9yIGEgU0hSIHRva2VuIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZUtpZChyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5Qb3BUb2tlbkdlbmVyYXRlS2lkLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGtpZFRodW1icHJpbnQgPSBhd2FpdCB0aGlzLmNyeXB0b1V0aWxzLmdldFB1YmxpY0tleVRodW1icHJpbnQocmVxdWVzdCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2lkOiBraWRUaHVtYnByaW50LFxyXG4gICAgICAgICAgICB4bXNfa3NsOiBLZXlMb2NhdGlvbi5TVyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTaWducyB0aGUgUE9QIGFjY2Vzc190b2tlbiB3aXRoIHRoZSBsb2NhbCBnZW5lcmF0ZWQga2V5LXBhaXJcclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNpZ25Qb3BUb2tlbihhY2Nlc3NUb2tlbiwga2V5SWQsIHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduUGF5bG9hZChhY2Nlc3NUb2tlbiwga2V5SWQsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSBzaWduZWQgSldUIGZvciBhbiBhY2Nlc3NfdG9rZW5cclxuICAgICAqIEBwYXJhbSBwYXlsb2FkXHJcbiAgICAgKiBAcGFyYW0ga2lkXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGNsYWltc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2lnblBheWxvYWQocGF5bG9hZCwga2V5SWQsIHJlcXVlc3QsIGNsYWltcykge1xyXG4gICAgICAgIC8vIERlY29uc3RydWN0IHJlcXVlc3QgdG8gZXh0cmFjdCBTSFIgcGFyYW1ldGVyc1xyXG4gICAgICAgIGNvbnN0IHsgcmVzb3VyY2VSZXF1ZXN0TWV0aG9kLCByZXNvdXJjZVJlcXVlc3RVcmksIHNockNsYWltcywgc2hyTm9uY2UsIHNock9wdGlvbnMsIH0gPSByZXF1ZXN0O1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlVXJsU3RyaW5nID0gcmVzb3VyY2VSZXF1ZXN0VXJpXHJcbiAgICAgICAgICAgID8gbmV3IFVybFN0cmluZyhyZXNvdXJjZVJlcXVlc3RVcmkpXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlVXJsQ29tcG9uZW50cyA9IHJlc291cmNlVXJsU3RyaW5nPy5nZXRVcmxDb21wb25lbnRzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3J5cHRvVXRpbHMuc2lnbkp3dCh7XHJcbiAgICAgICAgICAgIGF0OiBwYXlsb2FkLFxyXG4gICAgICAgICAgICB0czogbm93U2Vjb25kcygpLFxyXG4gICAgICAgICAgICBtOiByZXNvdXJjZVJlcXVlc3RNZXRob2Q/LnRvVXBwZXJDYXNlKCksXHJcbiAgICAgICAgICAgIHU6IHJlc291cmNlVXJsQ29tcG9uZW50cz8uSG9zdE5hbWVBbmRQb3J0LFxyXG4gICAgICAgICAgICBub25jZTogc2hyTm9uY2UgfHwgdGhpcy5jcnlwdG9VdGlscy5jcmVhdGVOZXdHdWlkKCksXHJcbiAgICAgICAgICAgIHA6IHJlc291cmNlVXJsQ29tcG9uZW50cz8uQWJzb2x1dGVQYXRoLFxyXG4gICAgICAgICAgICBxOiByZXNvdXJjZVVybENvbXBvbmVudHM/LlF1ZXJ5U3RyaW5nXHJcbiAgICAgICAgICAgICAgICA/IFtbXSwgcmVzb3VyY2VVcmxDb21wb25lbnRzLlF1ZXJ5U3RyaW5nXVxyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGNsaWVudF9jbGFpbXM6IHNockNsYWltcyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIC4uLmNsYWltcyxcclxuICAgICAgICB9LCBrZXlJZCwgc2hyT3B0aW9ucywgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBQb3BUb2tlbkdlbmVyYXRvciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG9wVG9rZW5HZW5lcmF0b3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaW5zdGFuY2UgaGVscHMgdHJhY2sgdGhlIG1lbW9yeSBjaGFuZ2VzIGZhY2lsaXRhdGluZ1xyXG4gKiBkZWNpc2lvbnMgdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0byB0aGUgcGVyc2lzdGVudCBjYWNoZVxyXG4gKi8gY2xhc3MgVG9rZW5DYWNoZUNvbnRleHQge1xyXG4gICAgY29uc3RydWN0b3IodG9rZW5DYWNoZSwgaGFzQ2hhbmdlZCkge1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB0b2tlbkNhY2hlO1xyXG4gICAgICAgIHRoaXMuaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIHRoZSBjaGFuZ2VzIGluIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIGdldCBjYWNoZUhhc0NoYW5nZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ2hhbmdlZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIHRva2VuIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIGdldCB0b2tlbkNhY2hlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFRva2VuQ2FjaGVDb250ZXh0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub2tlbkNhY2hlQ29udGV4dC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi9lcnJvci9TZXJ2ZXJFcnJvci5tanMnO1xuaW1wb3J0IHsgU2NvcGVTZXQgfSBmcm9tICcuLi9yZXF1ZXN0L1Njb3BlU2V0Lm1qcyc7XG5pbXBvcnQgeyBBY2NvdW50RW50aXR5IH0gZnJvbSAnLi4vY2FjaGUvZW50aXRpZXMvQWNjb3VudEVudGl0eS5tanMnO1xuaW1wb3J0IHsgaXNJbnRlcmFjdGlvblJlcXVpcmVkRXJyb3IsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBQcm90b2NvbFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvUHJvdG9jb2xVdGlscy5tanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cywgQ29uc3RhbnRzLCBBdXRoZW50aWNhdGlvblNjaGVtZSwgVEhFX0ZBTUlMWV9JRCB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgUG9wVG9rZW5HZW5lcmF0b3IgfSBmcm9tICcuLi9jcnlwdG8vUG9wVG9rZW5HZW5lcmF0b3IubWpzJztcbmltcG9ydCB7IFRva2VuQ2FjaGVDb250ZXh0IH0gZnJvbSAnLi4vY2FjaGUvcGVyc2lzdGVuY2UvVG9rZW5DYWNoZUNvbnRleHQubWpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlRXZlbnQubWpzJztcbmltcG9ydCB7IGV4dHJhY3RUb2tlbkNsYWltcywgY2hlY2tNYXhBZ2UgfSBmcm9tICcuLi9hY2NvdW50L0F1dGhUb2tlbi5tanMnO1xuaW1wb3J0IHsgZ2V0VGVuYW50SWRGcm9tSWRUb2tlbkNsYWltcyB9IGZyb20gJy4uL2FjY291bnQvVG9rZW5DbGFpbXMubWpzJztcbmltcG9ydCB7IHVwZGF0ZUFjY291bnRUZW5hbnRQcm9maWxlRGF0YSwgYnVpbGRUZW5hbnRQcm9maWxlIH0gZnJvbSAnLi4vYWNjb3VudC9BY2NvdW50SW5mby5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQWNjZXNzVG9rZW5FbnRpdHksIGNyZWF0ZVJlZnJlc2hUb2tlbkVudGl0eSwgY3JlYXRlSWRUb2tlbkVudGl0eSB9IGZyb20gJy4uL2NhY2hlL3V0aWxzL0NhY2hlSGVscGVycy5tanMnO1xuaW1wb3J0IHsgc3RhdGVOb3RGb3VuZCwgaW52YWxpZFN0YXRlLCBzdGF0ZU1pc21hdGNoLCBub25jZU1pc21hdGNoLCBhdXRoVGltZU5vdEZvdW5kLCBpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudCwga2V5SWRNaXNzaW5nIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlU2VydmVyRXJyb3JObyhzZXJ2ZXJSZXNwb25zZSkge1xyXG4gICAgY29uc3QgZXJyb3JDb2RlUHJlZml4ID0gXCJjb2RlPVwiO1xyXG4gICAgY29uc3QgZXJyb3JDb2RlUHJlZml4SW5kZXggPSBzZXJ2ZXJSZXNwb25zZS5lcnJvcl91cmk/Lmxhc3RJbmRleE9mKGVycm9yQ29kZVByZWZpeCk7XHJcbiAgICByZXR1cm4gZXJyb3JDb2RlUHJlZml4SW5kZXggJiYgZXJyb3JDb2RlUHJlZml4SW5kZXggPj0gMFxyXG4gICAgICAgID8gc2VydmVyUmVzcG9uc2UuZXJyb3JfdXJpPy5zdWJzdHJpbmcoZXJyb3JDb2RlUHJlZml4SW5kZXggKyBlcnJvckNvZGVQcmVmaXgubGVuZ3RoKVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG59XHJcbi8qKlxyXG4gKiBDbGFzcyB0aGF0IGhhbmRsZXMgcmVzcG9uc2UgcGFyc2luZy5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jbGFzcyBSZXNwb25zZUhhbmRsZXIge1xyXG4gICAgY29uc3RydWN0b3IoY2xpZW50SWQsIGNhY2hlU3RvcmFnZSwgY3J5cHRvT2JqLCBsb2dnZXIsIHNlcmlhbGl6YWJsZUNhY2hlLCBwZXJzaXN0ZW5jZVBsdWdpbiwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7XHJcbiAgICAgICAgdGhpcy5jYWNoZVN0b3JhZ2UgPSBjYWNoZVN0b3JhZ2U7XHJcbiAgICAgICAgdGhpcy5jcnlwdG9PYmogPSBjcnlwdG9PYmo7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVDYWNoZSA9IHNlcmlhbGl6YWJsZUNhY2hlO1xyXG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2VQbHVnaW4gPSBwZXJzaXN0ZW5jZVBsdWdpbjtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50ID0gcGVyZm9ybWFuY2VDbGllbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uIHdoaWNoIHZhbGlkYXRlcyBzZXJ2ZXIgYXV0aG9yaXphdGlvbiBjb2RlIHJlc3BvbnNlLlxyXG4gICAgICogQHBhcmFtIHNlcnZlclJlc3BvbnNlSGFzaFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RTdGF0ZVxyXG4gICAgICogQHBhcmFtIGNyeXB0b09ialxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZVNlcnZlckF1dGhvcml6YXRpb25Db2RlUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgIGlmICghc2VydmVyUmVzcG9uc2Uuc3RhdGUgfHwgIXJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBzZXJ2ZXJSZXNwb25zZS5zdGF0ZVxyXG4gICAgICAgICAgICAgICAgPyBjcmVhdGVDbGllbnRBdXRoRXJyb3Ioc3RhdGVOb3RGb3VuZCwgXCJDYWNoZWQgU3RhdGVcIilcclxuICAgICAgICAgICAgICAgIDogY3JlYXRlQ2xpZW50QXV0aEVycm9yKHN0YXRlTm90Rm91bmQsIFwiU2VydmVyIFN0YXRlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGVjb2RlZFNlcnZlclJlc3BvbnNlU3RhdGU7XHJcbiAgICAgICAgbGV0IGRlY29kZWRSZXF1ZXN0U3RhdGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVjb2RlZFNlcnZlclJlc3BvbnNlU3RhdGUgPSBkZWNvZGVVUklDb21wb25lbnQoc2VydmVyUmVzcG9uc2Uuc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoaW52YWxpZFN0YXRlLCBzZXJ2ZXJSZXNwb25zZS5zdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlY29kZWRSZXF1ZXN0U3RhdGUgPSBkZWNvZGVVUklDb21wb25lbnQocmVxdWVzdFN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGludmFsaWRTdGF0ZSwgc2VydmVyUmVzcG9uc2Uuc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGVjb2RlZFNlcnZlclJlc3BvbnNlU3RhdGUgIT09IGRlY29kZWRSZXF1ZXN0U3RhdGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKHN0YXRlTWlzbWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayBmb3IgZXJyb3JcclxuICAgICAgICBpZiAoc2VydmVyUmVzcG9uc2UuZXJyb3IgfHxcclxuICAgICAgICAgICAgc2VydmVyUmVzcG9uc2UuZXJyb3JfZGVzY3JpcHRpb24gfHxcclxuICAgICAgICAgICAgc2VydmVyUmVzcG9uc2Uuc3ViZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmVyRXJyb3JObyA9IHBhcnNlU2VydmVyRXJyb3JObyhzZXJ2ZXJSZXNwb25zZSk7XHJcbiAgICAgICAgICAgIGlmIChpc0ludGVyYWN0aW9uUmVxdWlyZWRFcnJvcihzZXJ2ZXJSZXNwb25zZS5lcnJvciwgc2VydmVyUmVzcG9uc2UuZXJyb3JfZGVzY3JpcHRpb24sIHNlcnZlclJlc3BvbnNlLnN1YmVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3Ioc2VydmVyUmVzcG9uc2UuZXJyb3IgfHwgXCJcIiwgc2VydmVyUmVzcG9uc2UuZXJyb3JfZGVzY3JpcHRpb24sIHNlcnZlclJlc3BvbnNlLnN1YmVycm9yLCBzZXJ2ZXJSZXNwb25zZS50aW1lc3RhbXAgfHwgXCJcIiwgc2VydmVyUmVzcG9uc2UudHJhY2VfaWQgfHwgXCJcIiwgc2VydmVyUmVzcG9uc2UuY29ycmVsYXRpb25faWQgfHwgXCJcIiwgc2VydmVyUmVzcG9uc2UuY2xhaW1zIHx8IFwiXCIsIHNlcnZlckVycm9yTm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihzZXJ2ZXJSZXNwb25zZS5lcnJvciB8fCBcIlwiLCBzZXJ2ZXJSZXNwb25zZS5lcnJvcl9kZXNjcmlwdGlvbiwgc2VydmVyUmVzcG9uc2Uuc3ViZXJyb3IsIHNlcnZlckVycm9yTm8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gd2hpY2ggdmFsaWRhdGVzIHNlcnZlciBhdXRob3JpemF0aW9uIHRva2VuIHJlc3BvbnNlLlxyXG4gICAgICogQHBhcmFtIHNlcnZlclJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gcmVmcmVzaEFjY2Vzc1Rva2VuXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlVG9rZW5SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgcmVmcmVzaEFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVycm9yXHJcbiAgICAgICAgaWYgKHNlcnZlclJlc3BvbnNlLmVycm9yIHx8XHJcbiAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlLmVycm9yX2Rlc2NyaXB0aW9uIHx8XHJcbiAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlLnN1YmVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVyclN0cmluZyA9IGBFcnJvcihzKTogJHtzZXJ2ZXJSZXNwb25zZS5lcnJvcl9jb2RlcyB8fCBDb25zdGFudHMuTk9UX0FWQUlMQUJMRX0gLSBUaW1lc3RhbXA6ICR7c2VydmVyUmVzcG9uc2UudGltZXN0YW1wIHx8IENvbnN0YW50cy5OT1RfQVZBSUxBQkxFfSAtIERlc2NyaXB0aW9uOiAke3NlcnZlclJlc3BvbnNlLmVycm9yX2Rlc2NyaXB0aW9uIHx8IENvbnN0YW50cy5OT1RfQVZBSUxBQkxFfSAtIENvcnJlbGF0aW9uIElEOiAke3NlcnZlclJlc3BvbnNlLmNvcnJlbGF0aW9uX2lkIHx8IENvbnN0YW50cy5OT1RfQVZBSUxBQkxFfSAtIFRyYWNlIElEOiAke3NlcnZlclJlc3BvbnNlLnRyYWNlX2lkIHx8IENvbnN0YW50cy5OT1RfQVZBSUxBQkxFfWA7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlckVycm9yTm8gPSBzZXJ2ZXJSZXNwb25zZS5lcnJvcl9jb2Rlcz8ubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHNlcnZlclJlc3BvbnNlLmVycm9yX2NvZGVzWzBdXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmVyRXJyb3IgPSBuZXcgU2VydmVyRXJyb3Ioc2VydmVyUmVzcG9uc2UuZXJyb3IsIGVyclN0cmluZywgc2VydmVyUmVzcG9uc2Uuc3ViZXJyb3IsIHNlcnZlckVycm9yTm8sIHNlcnZlclJlc3BvbnNlLnN0YXR1cyk7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIDUwMCBlcnJvclxyXG4gICAgICAgICAgICBpZiAocmVmcmVzaEFjY2Vzc1Rva2VuICYmXHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZS5zdGF0dXMgJiZcclxuICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwU3RhdHVzLlNFUlZFUl9FUlJPUl9SQU5HRV9TVEFSVCAmJlxyXG4gICAgICAgICAgICAgICAgc2VydmVyUmVzcG9uc2Uuc3RhdHVzIDw9IEh0dHBTdGF0dXMuU0VSVkVSX0VSUk9SX1JBTkdFX0VORCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhgZXhlY3V0ZVRva2VuUmVxdWVzdDp2YWxpZGF0ZVRva2VuUmVzcG9uc2UgLSBBQUQgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIGFuZCB0aGUgYWNjZXNzIHRva2VuIGlzIHVuYWJsZSB0byBiZSByZWZyZXNoZWQuXFxuJHtzZXJ2ZXJFcnJvcn1gKTtcclxuICAgICAgICAgICAgICAgIC8vIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IGFsZXJ0IHRoZSB1c2VyIHZpYSBhIGxvZyB0aGF0IHRoZSB0b2tlbiB3YXMgdW5hYmxlIHRvIGJlIHJlZnJlc2hlZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgNDAwIGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmVmcmVzaEFjY2Vzc1Rva2VuICYmXHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZS5zdGF0dXMgJiZcclxuICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwU3RhdHVzLkNMSUVOVF9FUlJPUl9SQU5HRV9TVEFSVCAmJlxyXG4gICAgICAgICAgICAgICAgc2VydmVyUmVzcG9uc2Uuc3RhdHVzIDw9IEh0dHBTdGF0dXMuQ0xJRU5UX0VSUk9SX1JBTkdFX0VORCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhgZXhlY3V0ZVRva2VuUmVxdWVzdDp2YWxpZGF0ZVRva2VuUmVzcG9uc2UgLSBBQUQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBidXQgaXMgdW5hYmxlIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbi5cXG4ke3NlcnZlckVycm9yfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLCBidXQgYWxlcnQgdGhlIHVzZXIgdmlhIGEgbG9nIHRoYXQgdGhlIHRva2VuIHdhcyB1bmFibGUgdG8gYmUgcmVmcmVzaGVkXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzSW50ZXJhY3Rpb25SZXF1aXJlZEVycm9yKHNlcnZlclJlc3BvbnNlLmVycm9yLCBzZXJ2ZXJSZXNwb25zZS5lcnJvcl9kZXNjcmlwdGlvbiwgc2VydmVyUmVzcG9uc2Uuc3ViZXJyb3IpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcihzZXJ2ZXJSZXNwb25zZS5lcnJvciwgc2VydmVyUmVzcG9uc2UuZXJyb3JfZGVzY3JpcHRpb24sIHNlcnZlclJlc3BvbnNlLnN1YmVycm9yLCBzZXJ2ZXJSZXNwb25zZS50aW1lc3RhbXAgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgc2VydmVyUmVzcG9uc2UudHJhY2VfaWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgc2VydmVyUmVzcG9uc2UuY29ycmVsYXRpb25faWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORywgc2VydmVyUmVzcG9uc2UuY2xhaW1zIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIHNlcnZlckVycm9yTm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IHNlcnZlckVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGNvbnN0cnVjdGVkIHRva2VuIHJlc3BvbnNlIGJhc2VkIG9uIGdpdmVuIHN0cmluZy4gQWxzbyBtYW5hZ2VzIHRoZSBjYWNoZSB1cGRhdGVzIGFuZCBjbGVhbnVwcy5cclxuICAgICAqIEBwYXJhbSBzZXJ2ZXJUb2tlblJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gYXV0aG9yaXR5XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2Uoc2VydmVyVG9rZW5SZXNwb25zZSwgYXV0aG9yaXR5LCByZXFUaW1lc3RhbXAsIHJlcXVlc3QsIGF1dGhDb2RlUGF5bG9hZCwgdXNlckFzc2VydGlvbkhhc2gsIGhhbmRsaW5nUmVmcmVzaFRva2VuUmVzcG9uc2UsIGZvcmNlQ2FjaGVSZWZyZXNoVG9rZW5SZXNwb25zZSwgc2VydmVyUmVxdWVzdElkKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5IYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlLCBzZXJ2ZXJUb2tlblJlc3BvbnNlLmNvcnJlbGF0aW9uX2lkKTtcclxuICAgICAgICAvLyBjcmVhdGUgYW4gaWRUb2tlbiBvYmplY3QgKG5vdCBlbnRpdHkpXHJcbiAgICAgICAgbGV0IGlkVG9rZW5DbGFpbXM7XHJcbiAgICAgICAgaWYgKHNlcnZlclRva2VuUmVzcG9uc2UuaWRfdG9rZW4pIHtcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltcyA9IGV4dHJhY3RUb2tlbkNsYWltcyhzZXJ2ZXJUb2tlblJlc3BvbnNlLmlkX3Rva2VuIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIHRoaXMuY3J5cHRvT2JqLmJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgICAgIC8vIHRva2VuIG5vbmNlIGNoZWNrIChUT0RPOiBBZGQgYSB3YXJuaW5nIGlmIG5vIG5vbmNlIGlzIGdpdmVuPylcclxuICAgICAgICAgICAgaWYgKGF1dGhDb2RlUGF5bG9hZCAmJiBhdXRoQ29kZVBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpZFRva2VuQ2xhaW1zLm5vbmNlICE9PSBhdXRoQ29kZVBheWxvYWQubm9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3Iobm9uY2VNaXNtYXRjaCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gdG9rZW4gbWF4X2FnZSBjaGVja1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5tYXhBZ2UgfHwgcmVxdWVzdC5tYXhBZ2UgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhUaW1lID0gaWRUb2tlbkNsYWltcy5hdXRoX3RpbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWF1dGhUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGF1dGhUaW1lTm90Rm91bmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2hlY2tNYXhBZ2UoYXV0aFRpbWUsIHJlcXVlc3QubWF4QWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSBob21lQWNjb3VudElkXHJcbiAgICAgICAgdGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIgPSBBY2NvdW50RW50aXR5LmdlbmVyYXRlSG9tZUFjY291bnRJZChzZXJ2ZXJUb2tlblJlc3BvbnNlLmNsaWVudF9pbmZvIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIGF1dGhvcml0eS5hdXRob3JpdHlUeXBlLCB0aGlzLmxvZ2dlciwgdGhpcy5jcnlwdG9PYmosIGlkVG9rZW5DbGFpbXMpO1xyXG4gICAgICAgIC8vIHNhdmUgdGhlIHJlc3BvbnNlIHRva2Vuc1xyXG4gICAgICAgIGxldCByZXF1ZXN0U3RhdGVPYmo7XHJcbiAgICAgICAgaWYgKCEhYXV0aENvZGVQYXlsb2FkICYmICEhYXV0aENvZGVQYXlsb2FkLnN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RTdGF0ZU9iaiA9IFByb3RvY29sVXRpbHMucGFyc2VSZXF1ZXN0U3RhdGUodGhpcy5jcnlwdG9PYmosIGF1dGhDb2RlUGF5bG9hZC5zdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBrZXlJZCBmcm9tIHJlcXVlc3QgdG8gc2VydmVyVG9rZW5SZXNwb25zZSBpZiBkZWZpbmVkXHJcbiAgICAgICAgc2VydmVyVG9rZW5SZXNwb25zZS5rZXlfaWQgPVxyXG4gICAgICAgICAgICBzZXJ2ZXJUb2tlblJlc3BvbnNlLmtleV9pZCB8fCByZXF1ZXN0LnNzaEtpZCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgY2FjaGVSZWNvcmQgPSB0aGlzLmdlbmVyYXRlQ2FjaGVSZWNvcmQoc2VydmVyVG9rZW5SZXNwb25zZSwgYXV0aG9yaXR5LCByZXFUaW1lc3RhbXAsIHJlcXVlc3QsIGlkVG9rZW5DbGFpbXMsIHVzZXJBc3NlcnRpb25IYXNoLCBhdXRoQ29kZVBheWxvYWQpO1xyXG4gICAgICAgIGxldCBjYWNoZUNvbnRleHQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2VQbHVnaW4gJiYgdGhpcy5zZXJpYWxpemFibGVDYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlBlcnNpc3RlbmNlIGVuYWJsZWQsIGNhbGxpbmcgYmVmb3JlQ2FjaGVBY2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICBjYWNoZUNvbnRleHQgPSBuZXcgVG9rZW5DYWNoZUNvbnRleHQodGhpcy5zZXJpYWxpemFibGVDYWNoZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlUGx1Z2luLmJlZm9yZUNhY2hlQWNjZXNzKGNhY2hlQ29udGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogV2hlbiBzYXZpbmcgYSByZWZyZXNoZWQgdG9rZW5zIHRvIHRoZSBjYWNoZSwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIGlzIHByZXNlbnQgaW4gdGhlIGNhY2hlLlxyXG4gICAgICAgICAgICAgKiBJZiBub3QgcHJlc2VudCwgd2Ugc2hvdWxkIHJldHVybiBudWxsLCBhcyBpdCdzIHRoZSBjYXNlIHRoYXQgYW5vdGhlciBhcHBsaWNhdGlvbiBjYWxsZWQgcmVtb3ZlQWNjb3VudCBpbiBiZXR3ZWVuXHJcbiAgICAgICAgICAgICAqIHRoZSBjYWxscyB0byBnZXRBbGxBY2NvdW50cyBhbmQgYWNxdWlyZVRva2VuU2lsZW50LiBXZSBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGF0IHJlbW92YWwsIHVubGVzcyBleHBsaWNpdGx5IGZsYWdnZWQgYnlcclxuICAgICAgICAgICAgICogdGhlIGRldmVsb3BlciwgYXMgaW4gdGhlIGNhc2Ugb2YgcmVmcmVzaCB0b2tlbiBmbG93IHVzZWQgaW4gQURBTCBOb2RlIHRvIE1TQUwgTm9kZSBtaWdyYXRpb24uXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxpbmdSZWZyZXNoVG9rZW5SZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgICAgIWZvcmNlQ2FjaGVSZWZyZXNoVG9rZW5SZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgICAgY2FjaGVSZWNvcmQuYWNjb3VudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY2FjaGVSZWNvcmQuYWNjb3VudC5nZW5lcmF0ZUFjY291bnRLZXkoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmNhY2hlU3RvcmFnZS5nZXRBY2NvdW50KGtleSwgdGhpcy5sb2dnZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhcIkFjY291bnQgdXNlZCB0byByZWZyZXNoIHRva2VucyBub3QgaW4gcGVyc2lzdGVuY2UsIHJlZnJlc2hlZCB0b2tlbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSBjYWNoZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVzcG9uc2VIYW5kbGVyLmdlbmVyYXRlQXV0aGVudGljYXRpb25SZXN1bHQodGhpcy5jcnlwdG9PYmosIGF1dGhvcml0eSwgY2FjaGVSZWNvcmQsIGZhbHNlLCByZXF1ZXN0LCBpZFRva2VuQ2xhaW1zLCByZXF1ZXN0U3RhdGVPYmosIHVuZGVmaW5lZCwgc2VydmVyUmVxdWVzdElkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlU3RvcmFnZS5zYXZlQ2FjaGVSZWNvcmQoY2FjaGVSZWNvcmQsIHJlcXVlc3Quc3RvcmVJbkNhY2hlLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2VQbHVnaW4gJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VyaWFsaXphYmxlQ2FjaGUgJiZcclxuICAgICAgICAgICAgICAgIGNhY2hlQ29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlBlcnNpc3RlbmNlIGVuYWJsZWQsIGNhbGxpbmcgYWZ0ZXJDYWNoZUFjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2VQbHVnaW4uYWZ0ZXJDYWNoZUFjY2VzcyhjYWNoZUNvbnRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBSZXNwb25zZUhhbmRsZXIuZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdCh0aGlzLmNyeXB0b09iaiwgYXV0aG9yaXR5LCBjYWNoZVJlY29yZCwgZmFsc2UsIHJlcXVlc3QsIGlkVG9rZW5DbGFpbXMsIHJlcXVlc3RTdGF0ZU9iaiwgc2VydmVyVG9rZW5SZXNwb25zZSwgc2VydmVyUmVxdWVzdElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIENhY2hlUmVjb3JkXHJcbiAgICAgKiBAcGFyYW0gc2VydmVyVG9rZW5SZXNwb25zZVxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5PYmpcclxuICAgICAqIEBwYXJhbSBhdXRob3JpdHlcclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVDYWNoZVJlY29yZChzZXJ2ZXJUb2tlblJlc3BvbnNlLCBhdXRob3JpdHksIHJlcVRpbWVzdGFtcCwgcmVxdWVzdCwgaWRUb2tlbkNsYWltcywgdXNlckFzc2VydGlvbkhhc2gsIGF1dGhDb2RlUGF5bG9hZCkge1xyXG4gICAgICAgIGNvbnN0IGVudiA9IGF1dGhvcml0eS5nZXRQcmVmZXJyZWRDYWNoZSgpO1xyXG4gICAgICAgIGlmICghZW52KSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihpbnZhbGlkQ2FjaGVFbnZpcm9ubWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNsYWltc1RlbmFudElkID0gZ2V0VGVuYW50SWRGcm9tSWRUb2tlbkNsYWltcyhpZFRva2VuQ2xhaW1zKTtcclxuICAgICAgICAvLyBJZFRva2VuOiBub24gQUFEIHNjZW5hcmlvcyBjYW4gaGF2ZSBlbXB0eSByZWFsbVxyXG4gICAgICAgIGxldCBjYWNoZWRJZFRva2VuO1xyXG4gICAgICAgIGxldCBjYWNoZWRBY2NvdW50O1xyXG4gICAgICAgIGlmIChzZXJ2ZXJUb2tlblJlc3BvbnNlLmlkX3Rva2VuICYmICEhaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgICAgICBjYWNoZWRJZFRva2VuID0gY3JlYXRlSWRUb2tlbkVudGl0eSh0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllciwgZW52LCBzZXJ2ZXJUb2tlblJlc3BvbnNlLmlkX3Rva2VuLCB0aGlzLmNsaWVudElkLCBjbGFpbXNUZW5hbnRJZCB8fCBcIlwiKTtcclxuICAgICAgICAgICAgY2FjaGVkQWNjb3VudCA9IGJ1aWxkQWNjb3VudFRvQ2FjaGUodGhpcy5jYWNoZVN0b3JhZ2UsIGF1dGhvcml0eSwgdGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIsIHRoaXMuY3J5cHRvT2JqLmJhc2U2NERlY29kZSwgaWRUb2tlbkNsYWltcywgc2VydmVyVG9rZW5SZXNwb25zZS5jbGllbnRfaW5mbywgZW52LCBjbGFpbXNUZW5hbnRJZCwgYXV0aENvZGVQYXlsb2FkLCB1bmRlZmluZWQsIC8vIG5hdGl2ZUFjY291bnRJZFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFjY2Vzc1Rva2VuXHJcbiAgICAgICAgbGV0IGNhY2hlZEFjY2Vzc1Rva2VuID0gbnVsbDtcclxuICAgICAgICBpZiAoc2VydmVyVG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCByZXR1cm5lZCBpbiBzZXJ2ZXIgcmVzcG9uc2UsIHVzZSByZXF1ZXN0IHNjb3Blc1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVNjb3BlcyA9IHNlcnZlclRva2VuUmVzcG9uc2Uuc2NvcGVcclxuICAgICAgICAgICAgICAgID8gU2NvcGVTZXQuZnJvbVN0cmluZyhzZXJ2ZXJUb2tlblJlc3BvbnNlLnNjb3BlKVxyXG4gICAgICAgICAgICAgICAgOiBuZXcgU2NvcGVTZXQocmVxdWVzdC5zY29wZXMgfHwgW10pO1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBVc2UgdGltZXN0YW1wIGNhbGN1bGF0ZWQgYmVmb3JlIHJlcXVlc3RcclxuICAgICAgICAgICAgICogU2VydmVyIG1heSByZXR1cm4gdGltZXN0YW1wcyBhcyBzdHJpbmdzLCBwYXJzZSB0byBudW1iZXJzIGlmIHNvLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gKHR5cGVvZiBzZXJ2ZXJUb2tlblJlc3BvbnNlLmV4cGlyZXNfaW4gPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoc2VydmVyVG9rZW5SZXNwb25zZS5leHBpcmVzX2luLCAxMClcclxuICAgICAgICAgICAgICAgIDogc2VydmVyVG9rZW5SZXNwb25zZS5leHBpcmVzX2luKSB8fCAwO1xyXG4gICAgICAgICAgICBjb25zdCBleHRFeHBpcmVzSW4gPSAodHlwZW9mIHNlcnZlclRva2VuUmVzcG9uc2UuZXh0X2V4cGlyZXNfaW4gPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoc2VydmVyVG9rZW5SZXNwb25zZS5leHRfZXhwaXJlc19pbiwgMTApXHJcbiAgICAgICAgICAgICAgICA6IHNlcnZlclRva2VuUmVzcG9uc2UuZXh0X2V4cGlyZXNfaW4pIHx8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hJbiA9ICh0eXBlb2Ygc2VydmVyVG9rZW5SZXNwb25zZS5yZWZyZXNoX2luID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHNlcnZlclRva2VuUmVzcG9uc2UucmVmcmVzaF9pbiwgMTApXHJcbiAgICAgICAgICAgICAgICA6IHNlcnZlclRva2VuUmVzcG9uc2UucmVmcmVzaF9pbikgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjb25zdCB0b2tlbkV4cGlyYXRpb25TZWNvbmRzID0gcmVxVGltZXN0YW1wICsgZXhwaXJlc0luO1xyXG4gICAgICAgICAgICBjb25zdCBleHRlbmRlZFRva2VuRXhwaXJhdGlvblNlY29uZHMgPSB0b2tlbkV4cGlyYXRpb25TZWNvbmRzICsgZXh0RXhwaXJlc0luO1xyXG4gICAgICAgICAgICBjb25zdCByZWZyZXNoT25TZWNvbmRzID0gcmVmcmVzaEluICYmIHJlZnJlc2hJbiA+IDBcclxuICAgICAgICAgICAgICAgID8gcmVxVGltZXN0YW1wICsgcmVmcmVzaEluXHJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgLy8gbm9uIEFBRCBzY2VuYXJpb3MgY2FuIGhhdmUgZW1wdHkgcmVhbG1cclxuICAgICAgICAgICAgY2FjaGVkQWNjZXNzVG9rZW4gPSBjcmVhdGVBY2Nlc3NUb2tlbkVudGl0eSh0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllciwgZW52LCBzZXJ2ZXJUb2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbiwgdGhpcy5jbGllbnRJZCwgY2xhaW1zVGVuYW50SWQgfHwgYXV0aG9yaXR5LnRlbmFudCB8fCBcIlwiLCByZXNwb25zZVNjb3Blcy5wcmludFNjb3BlcygpLCB0b2tlbkV4cGlyYXRpb25TZWNvbmRzLCBleHRlbmRlZFRva2VuRXhwaXJhdGlvblNlY29uZHMsIHRoaXMuY3J5cHRvT2JqLmJhc2U2NERlY29kZSwgcmVmcmVzaE9uU2Vjb25kcywgc2VydmVyVG9rZW5SZXNwb25zZS50b2tlbl90eXBlLCB1c2VyQXNzZXJ0aW9uSGFzaCwgc2VydmVyVG9rZW5SZXNwb25zZS5rZXlfaWQsIHJlcXVlc3QuY2xhaW1zLCByZXF1ZXN0LnJlcXVlc3RlZENsYWltc0hhc2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZWZyZXNoVG9rZW5cclxuICAgICAgICBsZXQgY2FjaGVkUmVmcmVzaFRva2VuID0gbnVsbDtcclxuICAgICAgICBpZiAoc2VydmVyVG9rZW5SZXNwb25zZS5yZWZyZXNoX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIGxldCBydEV4cGlyZXNPbjtcclxuICAgICAgICAgICAgaWYgKHNlcnZlclRva2VuUmVzcG9uc2UucmVmcmVzaF90b2tlbl9leHBpcmVzX2luKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBydEV4cGlyZXNJbiA9IHR5cGVvZiBzZXJ2ZXJUb2tlblJlc3BvbnNlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbiA9PT1cclxuICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChzZXJ2ZXJUb2tlblJlc3BvbnNlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbiwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzZXJ2ZXJUb2tlblJlc3BvbnNlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbjtcclxuICAgICAgICAgICAgICAgIHJ0RXhwaXJlc09uID0gcmVxVGltZXN0YW1wICsgcnRFeHBpcmVzSW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FjaGVkUmVmcmVzaFRva2VuID0gY3JlYXRlUmVmcmVzaFRva2VuRW50aXR5KHRoaXMuaG9tZUFjY291bnRJZGVudGlmaWVyLCBlbnYsIHNlcnZlclRva2VuUmVzcG9uc2UucmVmcmVzaF90b2tlbiwgdGhpcy5jbGllbnRJZCwgc2VydmVyVG9rZW5SZXNwb25zZS5mb2NpLCB1c2VyQXNzZXJ0aW9uSGFzaCwgcnRFeHBpcmVzT24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhcHBNZXRhZGF0YVxyXG4gICAgICAgIGxldCBjYWNoZWRBcHBNZXRhZGF0YSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHNlcnZlclRva2VuUmVzcG9uc2UuZm9jaSkge1xyXG4gICAgICAgICAgICBjYWNoZWRBcHBNZXRhZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IGVudixcclxuICAgICAgICAgICAgICAgIGZhbWlseUlkOiBzZXJ2ZXJUb2tlblJlc3BvbnNlLmZvY2ksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFjY291bnQ6IGNhY2hlZEFjY291bnQsXHJcbiAgICAgICAgICAgIGlkVG9rZW46IGNhY2hlZElkVG9rZW4sXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBjYWNoZWRBY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBjYWNoZWRSZWZyZXNoVG9rZW4sXHJcbiAgICAgICAgICAgIGFwcE1ldGFkYXRhOiBjYWNoZWRBcHBNZXRhZGF0YSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIEBBdXRoZW50aWNhdGlvblJlc3VsdCBmcm9tIEBDYWNoZVJlY29yZCAsIEBJZFRva2VuICwgYW5kIGEgYm9vbGVhbiB0aGF0IHN0YXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVzdWx0IGlzIGZyb20gY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogT3B0aW9uYWxseSB0YWtlcyBhIHN0YXRlIHN0cmluZyB0aGF0IGlzIHNldCBhcy1pcyBpbiB0aGUgcmVzcG9uc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNhY2hlUmVjb3JkXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlbk9ialxyXG4gICAgICogQHBhcmFtIGZyb21Ub2tlbkNhY2hlXHJcbiAgICAgKiBAcGFyYW0gc3RhdGVTdHJpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlQXV0aGVudGljYXRpb25SZXN1bHQoY3J5cHRvT2JqLCBhdXRob3JpdHksIGNhY2hlUmVjb3JkLCBmcm9tVG9rZW5DYWNoZSwgcmVxdWVzdCwgaWRUb2tlbkNsYWltcywgcmVxdWVzdFN0YXRlLCBzZXJ2ZXJUb2tlblJlc3BvbnNlLCByZXF1ZXN0SWQpIHtcclxuICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSBDb25zdGFudHMuRU1QVFlfU1RSSU5HO1xyXG4gICAgICAgIGxldCByZXNwb25zZVNjb3BlcyA9IFtdO1xyXG4gICAgICAgIGxldCBleHBpcmVzT24gPSBudWxsO1xyXG4gICAgICAgIGxldCBleHRFeHBpcmVzT247XHJcbiAgICAgICAgbGV0IHJlZnJlc2hPbjtcclxuICAgICAgICBsZXQgZmFtaWx5SWQgPSBDb25zdGFudHMuRU1QVFlfU1RSSU5HO1xyXG4gICAgICAgIGlmIChjYWNoZVJlY29yZC5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBpZiB0aGUgcmVxdWVzdCBvYmplY3QgaGFzIGBwb3BLaWRgIHByb3BlcnR5LCBgc2lnblBvcFRva2VuYCB3aWxsIGJlIHNldCB0byBmYWxzZSBhbmRcclxuICAgICAgICAgICAgICogdGhlIHRva2VuIHdpbGwgYmUgcmV0dXJuZWQgdW5zaWduZWRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChjYWNoZVJlY29yZC5hY2Nlc3NUb2tlbi50b2tlblR5cGUgPT09XHJcbiAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblNjaGVtZS5QT1AgJiZcclxuICAgICAgICAgICAgICAgICFyZXF1ZXN0LnBvcEtpZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9wVG9rZW5HZW5lcmF0b3IgPSBuZXcgUG9wVG9rZW5HZW5lcmF0b3IoY3J5cHRvT2JqKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VjcmV0LCBrZXlJZCB9ID0gY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKGtleUlkTWlzc2luZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHBvcFRva2VuR2VuZXJhdG9yLnNpZ25Qb3BUb2tlbihzZWNyZXQsIGtleUlkLCByZXF1ZXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuID0gY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4uc2VjcmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlU2NvcGVzID0gU2NvcGVTZXQuZnJvbVN0cmluZyhjYWNoZVJlY29yZC5hY2Nlc3NUb2tlbi50YXJnZXQpLmFzQXJyYXkoKTtcclxuICAgICAgICAgICAgZXhwaXJlc09uID0gbmV3IERhdGUoTnVtYmVyKGNhY2hlUmVjb3JkLmFjY2Vzc1Rva2VuLmV4cGlyZXNPbikgKiAxMDAwKTtcclxuICAgICAgICAgICAgZXh0RXhwaXJlc09uID0gbmV3IERhdGUoTnVtYmVyKGNhY2hlUmVjb3JkLmFjY2Vzc1Rva2VuLmV4dGVuZGVkRXhwaXJlc09uKSAqIDEwMDApO1xyXG4gICAgICAgICAgICBpZiAoY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4ucmVmcmVzaE9uKSB7XHJcbiAgICAgICAgICAgICAgICByZWZyZXNoT24gPSBuZXcgRGF0ZShOdW1iZXIoY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4ucmVmcmVzaE9uKSAqIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjYWNoZVJlY29yZC5hcHBNZXRhZGF0YSkge1xyXG4gICAgICAgICAgICBmYW1pbHlJZCA9XHJcbiAgICAgICAgICAgICAgICBjYWNoZVJlY29yZC5hcHBNZXRhZGF0YS5mYW1pbHlJZCA9PT0gVEhFX0ZBTUlMWV9JRFxyXG4gICAgICAgICAgICAgICAgICAgID8gVEhFX0ZBTUlMWV9JRFxyXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdWlkID0gaWRUb2tlbkNsYWltcz8ub2lkIHx8IGlkVG9rZW5DbGFpbXM/LnN1YiB8fCBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHRpZCA9IGlkVG9rZW5DbGFpbXM/LnRpZCB8fCBcIlwiO1xyXG4gICAgICAgIC8vIGZvciBoeWJyaWQgKyBuYXRpdmUgYnJpZGdlIGVuYWJsZW1lbnQsIHNlbmQgYmFjayB0aGUgbmF0aXZlIGFjY291bnQgSWRcclxuICAgICAgICBpZiAoc2VydmVyVG9rZW5SZXNwb25zZT8uc3BhX2FjY291bnRpZCAmJiAhIWNhY2hlUmVjb3JkLmFjY291bnQpIHtcclxuICAgICAgICAgICAgY2FjaGVSZWNvcmQuYWNjb3VudC5uYXRpdmVBY2NvdW50SWQgPVxyXG4gICAgICAgICAgICAgICAgc2VydmVyVG9rZW5SZXNwb25zZT8uc3BhX2FjY291bnRpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEluZm8gPSBjYWNoZVJlY29yZC5hY2NvdW50XHJcbiAgICAgICAgICAgID8gdXBkYXRlQWNjb3VudFRlbmFudFByb2ZpbGVEYXRhKGNhY2hlUmVjb3JkLmFjY291bnQuZ2V0QWNjb3VudEluZm8oKSwgdW5kZWZpbmVkLCAvLyB0ZW5hbnRQcm9maWxlIG9wdGlvbmFsXHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXMsIGNhY2hlUmVjb3JkLmlkVG9rZW4/LnNlY3JldClcclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5LmNhbm9uaWNhbEF1dGhvcml0eSxcclxuICAgICAgICAgICAgdW5pcXVlSWQ6IHVpZCxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRpZCxcclxuICAgICAgICAgICAgc2NvcGVzOiByZXNwb25zZVNjb3BlcyxcclxuICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudEluZm8sXHJcbiAgICAgICAgICAgIGlkVG9rZW46IGNhY2hlUmVjb3JkPy5pZFRva2VuPy5zZWNyZXQgfHwgXCJcIixcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltczogaWRUb2tlbkNsYWltcyB8fCB7fSxcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICBmcm9tQ2FjaGU6IGZyb21Ub2tlbkNhY2hlLFxyXG4gICAgICAgICAgICBleHBpcmVzT246IGV4cGlyZXNPbixcclxuICAgICAgICAgICAgZXh0RXhwaXJlc09uOiBleHRFeHBpcmVzT24sXHJcbiAgICAgICAgICAgIHJlZnJlc2hPbjogcmVmcmVzaE9uLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiByZXF1ZXN0LmNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdElkIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIGZhbWlseUlkOiBmYW1pbHlJZCxcclxuICAgICAgICAgICAgdG9rZW5UeXBlOiBjYWNoZVJlY29yZC5hY2Nlc3NUb2tlbj8udG9rZW5UeXBlIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIHN0YXRlOiByZXF1ZXN0U3RhdGVcclxuICAgICAgICAgICAgICAgID8gcmVxdWVzdFN0YXRlLnVzZXJSZXF1ZXN0U3RhdGVcclxuICAgICAgICAgICAgICAgIDogQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgICAgY2xvdWRHcmFwaEhvc3ROYW1lOiBjYWNoZVJlY29yZC5hY2NvdW50Py5jbG91ZEdyYXBoSG9zdE5hbWUgfHxcclxuICAgICAgICAgICAgICAgIENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIG1zR3JhcGhIb3N0OiBjYWNoZVJlY29yZC5hY2NvdW50Py5tc0dyYXBoSG9zdCB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLFxyXG4gICAgICAgICAgICBjb2RlOiBzZXJ2ZXJUb2tlblJlc3BvbnNlPy5zcGFfY29kZSxcclxuICAgICAgICAgICAgZnJvbU5hdGl2ZUJyb2tlcjogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBidWlsZEFjY291bnRUb0NhY2hlKGNhY2hlU3RvcmFnZSwgYXV0aG9yaXR5LCBob21lQWNjb3VudElkLCBiYXNlNjREZWNvZGUsIGlkVG9rZW5DbGFpbXMsIGNsaWVudEluZm8sIGVudmlyb25tZW50LCBjbGFpbXNUZW5hbnRJZCwgYXV0aENvZGVQYXlsb2FkLCBuYXRpdmVBY2NvdW50SWQsIGxvZ2dlcikge1xyXG4gICAgbG9nZ2VyPy52ZXJib3NlKFwic2V0Q2FjaGVkQWNjb3VudCBjYWxsZWRcIik7XHJcbiAgICAvLyBDaGVjayBpZiBiYXNlIGFjY291bnQgaXMgYWxyZWFkeSBjYWNoZWRcclxuICAgIGNvbnN0IGFjY291bnRLZXlzID0gY2FjaGVTdG9yYWdlLmdldEFjY291bnRLZXlzKCk7XHJcbiAgICBjb25zdCBiYXNlQWNjb3VudEtleSA9IGFjY291bnRLZXlzLmZpbmQoKGFjY291bnRLZXkpID0+IHtcclxuICAgICAgICByZXR1cm4gYWNjb3VudEtleS5zdGFydHNXaXRoKGhvbWVBY2NvdW50SWQpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQgY2FjaGVkQWNjb3VudCA9IG51bGw7XHJcbiAgICBpZiAoYmFzZUFjY291bnRLZXkpIHtcclxuICAgICAgICBjYWNoZWRBY2NvdW50ID0gY2FjaGVTdG9yYWdlLmdldEFjY291bnQoYmFzZUFjY291bnRLZXksIGxvZ2dlcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiYXNlQWNjb3VudCA9IGNhY2hlZEFjY291bnQgfHxcclxuICAgICAgICBBY2NvdW50RW50aXR5LmNyZWF0ZUFjY291bnQoe1xyXG4gICAgICAgICAgICBob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBpZFRva2VuQ2xhaW1zLFxyXG4gICAgICAgICAgICBjbGllbnRJbmZvLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudCxcclxuICAgICAgICAgICAgY2xvdWRHcmFwaEhvc3ROYW1lOiBhdXRoQ29kZVBheWxvYWQ/LmNsb3VkX2dyYXBoX2hvc3RfbmFtZSxcclxuICAgICAgICAgICAgbXNHcmFwaEhvc3Q6IGF1dGhDb2RlUGF5bG9hZD8ubXNncmFwaF9ob3N0LFxyXG4gICAgICAgICAgICBuYXRpdmVBY2NvdW50SWQ6IG5hdGl2ZUFjY291bnRJZCxcclxuICAgICAgICB9LCBhdXRob3JpdHksIGJhc2U2NERlY29kZSk7XHJcbiAgICBjb25zdCB0ZW5hbnRQcm9maWxlcyA9IGJhc2VBY2NvdW50LnRlbmFudFByb2ZpbGVzIHx8IFtdO1xyXG4gICAgY29uc3QgdGVuYW50SWQgPSBjbGFpbXNUZW5hbnRJZCB8fCBiYXNlQWNjb3VudC5yZWFsbTtcclxuICAgIGlmICh0ZW5hbnRJZCAmJlxyXG4gICAgICAgICF0ZW5hbnRQcm9maWxlcy5maW5kKCh0ZW5hbnRQcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW5hbnRQcm9maWxlLnRlbmFudElkID09PSB0ZW5hbnRJZDtcclxuICAgICAgICB9KSkge1xyXG4gICAgICAgIGNvbnN0IG5ld1RlbmFudFByb2ZpbGUgPSBidWlsZFRlbmFudFByb2ZpbGUoaG9tZUFjY291bnRJZCwgYmFzZUFjY291bnQubG9jYWxBY2NvdW50SWQsIHRlbmFudElkLCBpZFRva2VuQ2xhaW1zKTtcclxuICAgICAgICB0ZW5hbnRQcm9maWxlcy5wdXNoKG5ld1RlbmFudFByb2ZpbGUpO1xyXG4gICAgfVxyXG4gICAgYmFzZUFjY291bnQudGVuYW50UHJvZmlsZXMgPSB0ZW5hbnRQcm9maWxlcztcclxuICAgIHJldHVybiBiYXNlQWNjb3VudDtcclxufVxuXG5leHBvcnQgeyBSZXNwb25zZUhhbmRsZXIsIGJ1aWxkQWNjb3VudFRvQ2FjaGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc3BvbnNlSGFuZGxlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBnZXRDbGllbnRBc3NlcnRpb24oY2xpZW50QXNzZXJ0aW9uLCBjbGllbnRJZCwgdG9rZW5FbmRwb2ludCkge1xyXG4gICAgaWYgKHR5cGVvZiBjbGllbnRBc3NlcnRpb24gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICByZXR1cm4gY2xpZW50QXNzZXJ0aW9uO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWQsXHJcbiAgICAgICAgICAgIHRva2VuRW5kcG9pbnQ6IHRva2VuRW5kcG9pbnQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY2xpZW50QXNzZXJ0aW9uKGNvbmZpZyk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgZ2V0Q2xpZW50QXNzZXJ0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGllbnRBc3NlcnRpb25VdGlscy5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEJhc2VDbGllbnQgfSBmcm9tICcuL0Jhc2VDbGllbnQubWpzJztcbmltcG9ydCB7IFJlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0UGFyYW1ldGVyQnVpbGRlci5tanMnO1xuaW1wb3J0IHsgU2VwYXJhdG9ycywgR3JhbnRUeXBlLCBBdXRoZW50aWNhdGlvblNjaGVtZSwgUHJvbXB0VmFsdWUsIEhlYWRlck5hbWVzIH0gZnJvbSAnLi4vdXRpbHMvQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBDTElFTlRfSUQsIFJFVFVSTl9TUEFfQ09ERSB9IGZyb20gJy4uL2NvbnN0YW50cy9BQURTZXJ2ZXJQYXJhbUtleXMubWpzJztcbmltcG9ydCB7IGlzT2lkY1Byb3RvY29sTW9kZSB9IGZyb20gJy4uL2NvbmZpZy9DbGllbnRDb25maWd1cmF0aW9uLm1qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUhhbmRsZXIgfSBmcm9tICcuLi9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IFN0cmluZ1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvU3RyaW5nVXRpbHMubWpzJztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgVXJsU3RyaW5nIH0gZnJvbSAnLi4vdXJsL1VybFN0cmluZy5tanMnO1xuaW1wb3J0IHsgUG9wVG9rZW5HZW5lcmF0b3IgfSBmcm9tICcuLi9jcnlwdG8vUG9wVG9rZW5HZW5lcmF0b3IubWpzJztcbmltcG9ydCB7IG5vd1NlY29uZHMgfSBmcm9tICcuLi91dGlscy9UaW1lVXRpbHMubWpzJztcbmltcG9ydCB7IGJ1aWxkQ2xpZW50SW5mbywgYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQgfSBmcm9tICcuLi9hY2NvdW50L0NsaWVudEluZm8ubWpzJztcbmltcG9ydCB7IENjc0NyZWRlbnRpYWxUeXBlIH0gZnJvbSAnLi4vYWNjb3VudC9DY3NDcmVkZW50aWFsLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRDb25maWd1cmF0aW9uRXJyb3IubWpzJztcbmltcG9ydCB7IFJlcXVlc3RWYWxpZGF0b3IgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RWYWxpZGF0b3IubWpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlRXZlbnQubWpzJztcbmltcG9ydCB7IGludm9rZUFzeW5jIH0gZnJvbSAnLi4vdXRpbHMvRnVuY3Rpb25XcmFwcGVycy5tanMnO1xuaW1wb3J0IHsgZ2V0Q2xpZW50QXNzZXJ0aW9uIH0gZnJvbSAnLi4vdXRpbHMvQ2xpZW50QXNzZXJ0aW9uVXRpbHMubWpzJztcbmltcG9ydCB7IHJlcXVlc3RDYW5ub3RCZU1hZGUsIGF1dGhvcml6YXRpb25Db2RlTWlzc2luZ0Zyb21TZXJ2ZXJSZXNwb25zZSB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgeyBsb2dvdXRSZXF1ZXN0RW1wdHksIG1pc3NpbmdTc2hKd2sgfSBmcm9tICcuLi9lcnJvci9DbGllbnRDb25maWd1cmF0aW9uRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIE9hdXRoMi4wIEF1dGhvcml6YXRpb24gQ29kZSBjbGllbnRcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jbGFzcyBBdXRob3JpemF0aW9uQ29kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbiwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLCBwZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgLy8gRmxhZyB0byBpbmRpY2F0ZSBpZiBjbGllbnQgaXMgZm9yIGh5YnJpZCBzcGEgYXV0aCBjb2RlIHJlZGVtcHRpb25cclxuICAgICAgICB0aGlzLmluY2x1ZGVSZWRpcmVjdFVyaSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vaWRjRGVmYXVsdFNjb3BlcyA9XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmF1dGhvcml0eS5vcHRpb25zLk9JRENPcHRpb25zPy5kZWZhdWx0U2NvcGVzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgb2YgdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdCBsZXR0aW5nIHRoZSB1c2VyIGlucHV0IGNyZWRlbnRpYWxzIGFuZCBjb25zZW50IHRvIHRoZVxyXG4gICAgICogYXBwbGljYXRpb24uIFRoZSBVUkwgdGFyZ2V0IHRoZSAvYXV0aG9yaXplIGVuZHBvaW50IG9mIHRoZSBhdXRob3JpdHkgY29uZmlndXJlZCBpbiB0aGVcclxuICAgICAqIGFwcGxpY2F0aW9uIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBPbmNlIHRoZSB1c2VyIGlucHV0cyB0aGVpciBjcmVkZW50aWFscyBhbmQgY29uc2VudHMsIHRoZSBhdXRob3JpdHkgd2lsbCBzZW5kIGEgcmVzcG9uc2UgdG8gdGhlIHJlZGlyZWN0IFVSSVxyXG4gICAgICogc2VudCBpbiB0aGUgcmVxdWVzdCBhbmQgc2hvdWxkIGNvbnRhaW4gYW4gYXV0aG9yaXphdGlvbiBjb2RlLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGFjcXVpcmUgdG9rZW5zIHZpYVxyXG4gICAgICogYWNxdWlyZVRva2VuKEF1dGhvcml6YXRpb25Db2RlUmVxdWVzdClcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEF1dGhDb2RlVXJsKHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkdldEF1dGhDb2RlVXJsLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5jcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRDcmVhdGVRdWVyeVN0cmluZywgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCk7XHJcbiAgICAgICAgcmV0dXJuIFVybFN0cmluZy5hcHBlbmRRdWVyeVN0cmluZyh0aGlzLmF1dGhvcml0eS5hdXRob3JpemF0aW9uRW5kcG9pbnQsIHF1ZXJ5U3RyaW5nKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQVBJIHRvIGFjcXVpcmUgYSB0b2tlbiBpbiBleGNoYW5nZSBvZiAnYXV0aG9yaXphdGlvbl9jb2RlYCBhY3F1aXJlZCBieSB0aGUgdXNlciBpbiB0aGUgZmlyc3QgbGVnIG9mIHRoZVxyXG4gICAgICogYXV0aG9yaXphdGlvbl9jb2RlX2dyYW50XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW4ocmVxdWVzdCwgYXV0aENvZGVQYXlsb2FkKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BdXRoQ2xpZW50QWNxdWlyZVRva2VuLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmICghcmVxdWVzdC5jb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihyZXF1ZXN0Q2Fubm90QmVNYWRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVxVGltZXN0YW1wID0gbm93U2Vjb25kcygpO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5leGVjdXRlVG9rZW5SZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKSh0aGlzLmF1dGhvcml0eSwgcmVxdWVzdCk7XHJcbiAgICAgICAgLy8gUmV0cmlldmUgcmVxdWVzdElkIGZyb20gcmVzcG9uc2UgaGVhZGVyc1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlc3BvbnNlLmhlYWRlcnM/LltIZWFkZXJOYW1lcy5YX01TX1JFUVVFU1RfSURdO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IG5ldyBSZXNwb25zZUhhbmRsZXIodGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQsIHRoaXMuY2FjaGVNYW5hZ2VyLCB0aGlzLmNyeXB0b1V0aWxzLCB0aGlzLmxvZ2dlciwgdGhpcy5jb25maWcuc2VyaWFsaXphYmxlQ2FjaGUsIHRoaXMuY29uZmlnLnBlcnNpc3RlbmNlUGx1Z2luLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICAvLyBWYWxpZGF0ZSByZXNwb25zZS4gVGhpcyBmdW5jdGlvbiB0aHJvd3MgYSBzZXJ2ZXIgZXJyb3IgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci5cclxuICAgICAgICByZXNwb25zZUhhbmRsZXIudmFsaWRhdGVUb2tlblJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICAgIHJldHVybiBpbnZva2VBc3luYyhyZXNwb25zZUhhbmRsZXIuaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZS5iaW5kKHJlc3BvbnNlSGFuZGxlciksIFBlcmZvcm1hbmNlRXZlbnRzLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHJlc3BvbnNlLmJvZHksIHRoaXMuYXV0aG9yaXR5LCByZXFUaW1lc3RhbXAsIHJlcXVlc3QsIGF1dGhDb2RlUGF5bG9hZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB0aGUgaGFzaCBmcmFnbWVudCByZXNwb25zZSBmcm9tIHB1YmxpYyBjbGllbnQgY29kZSByZXF1ZXN0LiBSZXR1cm5zIGEgY29kZSByZXNwb25zZSB1c2VkIGJ5XHJcbiAgICAgKiB0aGUgY2xpZW50IHRvIGV4Y2hhbmdlIGZvciBhIHRva2VuIGluIGFjcXVpcmVUb2tlbi5cclxuICAgICAqIEBwYXJhbSBoYXNoRnJhZ21lbnRcclxuICAgICAqL1xyXG4gICAgaGFuZGxlRnJhZ21lbnRSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIGNhY2hlZFN0YXRlKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIHJlc3BvbnNlcy5cclxuICAgICAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBuZXcgUmVzcG9uc2VIYW5kbGVyKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLCB0aGlzLmNhY2hlTWFuYWdlciwgdGhpcy5jcnlwdG9VdGlscywgdGhpcy5sb2dnZXIsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vIEdldCBjb2RlIHJlc3BvbnNlXHJcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnZhbGlkYXRlU2VydmVyQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIGNhY2hlZFN0YXRlKTtcclxuICAgICAgICAvLyB0aHJvdyB3aGVuIHRoZXJlIGlzIG5vIGF1dGggY29kZSBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAgICBpZiAoIXNlcnZlclBhcmFtcy5jb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihhdXRob3JpemF0aW9uQ29kZU1pc3NpbmdGcm9tU2VydmVyUmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2VydmVyUGFyYW1zO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGxvZyBvdXQgdGhlIGN1cnJlbnQgdXNlciwgYW5kIHJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBwb3N0TG9nb3V0UmVkaXJlY3RVcmkuXHJcbiAgICAgKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byByZWRpcmVjdCB0aGUgdXNlciB0byBgd2luZG93LmxvY2F0aW9uLmhyZWZgLlxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVVyaVxyXG4gICAgICovXHJcbiAgICBnZXRMb2dvdXRVcmkobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIC8vIFRocm93IGVycm9yIGlmIGxvZ291dFJlcXVlc3QgaXMgbnVsbC91bmRlZmluZWRcclxuICAgICAgICBpZiAoIWxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGxvZ291dFJlcXVlc3RFbXB0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5jcmVhdGVMb2dvdXRVcmxRdWVyeVN0cmluZyhsb2dvdXRSZXF1ZXN0KTtcclxuICAgICAgICAvLyBDb25zdHJ1Y3QgbG9nb3V0IFVSSVxyXG4gICAgICAgIHJldHVybiBVcmxTdHJpbmcuYXBwZW5kUXVlcnlTdHJpbmcodGhpcy5hdXRob3JpdHkuZW5kU2Vzc2lvbkVuZHBvaW50LCBxdWVyeVN0cmluZyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4ZWN1dGVzIFBPU1QgcmVxdWVzdCB0byB0b2tlbiBlbmRwb2ludFxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChhdXRob3JpdHksIHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1ldGVyc1N0cmluZyA9IHRoaXMuY3JlYXRlVG9rZW5RdWVyeVBhcmFtZXRlcnMocmVxdWVzdCk7XHJcbiAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBVcmxTdHJpbmcuYXBwZW5kUXVlcnlTdHJpbmcoYXV0aG9yaXR5LnRva2VuRW5kcG9pbnQsIHF1ZXJ5UGFyYW1ldGVyc1N0cmluZyk7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEJvZHkuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuQXV0aENsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHJlcXVlc3QpO1xyXG4gICAgICAgIGxldCBjY3NDcmVkZW50aWFsID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmNsaWVudEluZm8pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudEluZm8gPSBidWlsZENsaWVudEluZm8ocmVxdWVzdC5jbGllbnRJbmZvLCB0aGlzLmNyeXB0b1V0aWxzLmJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgICAgICAgICBjY3NDcmVkZW50aWFsID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IGAke2NsaWVudEluZm8udWlkfSR7U2VwYXJhdG9ycy5DTElFTlRfSU5GT19TRVBBUkFUT1J9JHtjbGllbnRJbmZvLnV0aWR9YCxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBDY3NDcmVkZW50aWFsVHlwZS5IT01FX0FDQ09VTlRfSUQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ291bGQgbm90IHBhcnNlIGNsaWVudCBpbmZvIGZvciBDQ1MgSGVhZGVyOiBcIiArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoY2NzQ3JlZGVudGlhbCB8fCByZXF1ZXN0LmNjc0NyZWRlbnRpYWwpO1xyXG4gICAgICAgIGNvbnN0IHRodW1icHJpbnQgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiByZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnM/LmNsaWVudElkIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHkuY2Fub25pY2FsQXV0aG9yaXR5LFxyXG4gICAgICAgICAgICBzY29wZXM6IHJlcXVlc3Quc2NvcGVzLFxyXG4gICAgICAgICAgICBjbGFpbXM6IHJlcXVlc3QuY2xhaW1zLFxyXG4gICAgICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZTogcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSxcclxuICAgICAgICAgICAgcmVzb3VyY2VSZXF1ZXN0TWV0aG9kOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdE1ldGhvZCxcclxuICAgICAgICAgICAgcmVzb3VyY2VSZXF1ZXN0VXJpOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdFVyaSxcclxuICAgICAgICAgICAgc2hyQ2xhaW1zOiByZXF1ZXN0LnNockNsYWltcyxcclxuICAgICAgICAgICAgc3NoS2lkOiByZXF1ZXN0LnNzaEtpZCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBpbnZva2VBc3luYyh0aGlzLmV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhvcml6YXRpb25Db2RlQ2xpZW50RXhlY3V0ZVBvc3RUb1Rva2VuRW5kcG9pbnQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGVuZHBvaW50LCByZXF1ZXN0Qm9keSwgaGVhZGVycywgdGh1bWJwcmludCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkLCBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpemF0aW9uQ29kZUNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgbWFwIGZvciBhbGwgdGhlIHBhcmFtcyB0byBiZSBzZW50IHRvIHRoZSBzZXJ2aWNlXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBjcmVhdGVUb2tlblJlcXVlc3RCb2R5KHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckJ1aWxkZXIgPSBuZXcgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIocmVxdWVzdC5jb3JyZWxhdGlvbklkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudElkKHJlcXVlc3QuZW1iZWRkZWRDbGllbnRJZCB8fFxyXG4gICAgICAgICAgICByZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnM/LltDTElFTlRfSURdIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkKTtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEZvciBoeWJyaWQgc3BhIGZsb3csIHRoZXJlIHdpbGwgYmUgYSBjb2RlIGJ1dCBubyB2ZXJpZmllclxyXG4gICAgICAgICAqIEluIHRoaXMgc2NlbmFyaW8sIGRvbid0IGluY2x1ZGUgcmVkaXJlY3QgdXJpIGFzIGF1dGggY29kZSB3aWxsIG5vdCBiZSBib3VuZCB0byByZWRpcmVjdCBVUklcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuaW5jbHVkZVJlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgICAgIC8vIEp1c3QgdmFsaWRhdGVcclxuICAgICAgICAgICAgUmVxdWVzdFZhbGlkYXRvci52YWxpZGF0ZVJlZGlyZWN0VXJpKHJlcXVlc3QucmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgYW5kIGluY2x1ZGUgcmVkaXJlY3QgdXJpXHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkUmVkaXJlY3RVcmkocmVxdWVzdC5yZWRpcmVjdFVyaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBzY29wZSBhcnJheSwgcGFyYW1ldGVyIGJ1aWxkZXIgd2lsbCBhZGQgZGVmYXVsdCBzY29wZXMgYW5kIGRlZHVwZVxyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkU2NvcGVzKHJlcXVlc3Quc2NvcGVzLCB0cnVlLCB0aGlzLm9pZGNEZWZhdWx0U2NvcGVzKTtcclxuICAgICAgICAvLyBhZGQgY29kZTogdXNlciBzZXQsIG5vdCB2YWxpZGF0ZWRcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZEF1dGhvcml6YXRpb25Db2RlKHJlcXVlc3QuY29kZSk7XHJcbiAgICAgICAgLy8gQWRkIGxpYnJhcnkgbWV0YWRhdGFcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZExpYnJhcnlJbmZvKHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZEFwcGxpY2F0aW9uVGVsZW1ldHJ5KHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbik7XHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRUaHJvdHRsaW5nKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciAmJiAhaXNPaWRjUHJvdG9jb2xNb2RlKHRoaXMuY29uZmlnKSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFNlcnZlclRlbGVtZXRyeSh0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGQgY29kZV92ZXJpZmllciBpZiBwYXNzZWRcclxuICAgICAgICBpZiAocmVxdWVzdC5jb2RlVmVyaWZpZXIpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDb2RlVmVyaWZpZXIocmVxdWVzdC5jb2RlVmVyaWZpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50U2VjcmV0KSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2xpZW50U2VjcmV0KHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudFNlY3JldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRBc3NlcnRpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgY2xpZW50QXNzZXJ0aW9uID0gdGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50QXNzZXJ0aW9uO1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudEFzc2VydGlvbihhd2FpdCBnZXRDbGllbnRBc3NlcnRpb24oY2xpZW50QXNzZXJ0aW9uLmFzc2VydGlvbiwgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQsIHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0VXJpKSk7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2xpZW50QXNzZXJ0aW9uVHlwZShjbGllbnRBc3NlcnRpb24uYXNzZXJ0aW9uVHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkR3JhbnRUeXBlKEdyYW50VHlwZS5BVVRIT1JJWkFUSU9OX0NPREVfR1JBTlQpO1xyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2xpZW50SW5mbygpO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lID09PSBBdXRoZW50aWNhdGlvblNjaGVtZS5QT1ApIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wVG9rZW5HZW5lcmF0b3IgPSBuZXcgUG9wVG9rZW5HZW5lcmF0b3IodGhpcy5jcnlwdG9VdGlscywgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgICAgIGxldCByZXFDbmZEYXRhO1xyXG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QucG9wS2lkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0ZWRSZXFDbmZEYXRhID0gYXdhaXQgaW52b2tlQXN5bmMocG9wVG9rZW5HZW5lcmF0b3IuZ2VuZXJhdGVDbmYuYmluZChwb3BUb2tlbkdlbmVyYXRvciksIFBlcmZvcm1hbmNlRXZlbnRzLlBvcFRva2VuR2VuZXJhdGVDbmYsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHJlcXVlc3QsIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSBnZW5lcmF0ZWRSZXFDbmZEYXRhLnJlcUNuZlN0cmluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSB0aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChyZXF1ZXN0LnBvcEtpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU1BBIFBvUCByZXF1aXJlcyBmdWxsIEJhc2U2NFVybCBlbmNvZGVkIHJlcV9jbmYgc3RyaW5nICh1bmhhc2hlZClcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRQb3BUb2tlbihyZXFDbmZEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuU1NIKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNzaEp3aykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRTc2hKd2socmVxdWVzdC5zc2hKd2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKG1pc3NpbmdTc2hKd2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eU9iaihyZXF1ZXN0LmNsYWltcykgfHxcclxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2xhaW1zKHJlcXVlc3QuY2xhaW1zLCB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2NzQ3JlZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocmVxdWVzdC5jbGllbnRJbmZvKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJbmZvID0gYnVpbGRDbGllbnRJbmZvKHJlcXVlc3QuY2xpZW50SW5mbywgdGhpcy5jcnlwdG9VdGlscy5iYXNlNjREZWNvZGUpO1xyXG4gICAgICAgICAgICAgICAgY2NzQ3JlZCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBgJHtjbGllbnRJbmZvLnVpZH0ke1NlcGFyYXRvcnMuQ0xJRU5UX0lORk9fU0VQQVJBVE9SfSR7Y2xpZW50SW5mby51dGlkfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQ2NzQ3JlZGVudGlhbFR5cGUuSE9NRV9BQ0NPVU5UX0lELFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkNvdWxkIG5vdCBwYXJzZSBjbGllbnQgaW5mbyBmb3IgQ0NTIEhlYWRlcjogXCIgKyBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY2NzQ3JlZCA9IHJlcXVlc3QuY2NzQ3JlZGVudGlhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRkcyB0aGVzZSBhcyBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0IGluc3RlYWQgb2YgaGVhZGVycyB0byBwcmV2ZW50IENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuc3lzdGVtT3B0aW9ucy5wcmV2ZW50Q29yc1ByZWZsaWdodCAmJiBjY3NDcmVkKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY2NzQ3JlZC50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENjc0NyZWRlbnRpYWxUeXBlLkhPTUVfQUNDT1VOVF9JRDpcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJbmZvID0gYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQoY2NzQ3JlZC5jcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDY3NPaWQoY2xpZW50SW5mbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyOiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENjc0NyZWRlbnRpYWxUeXBlLlVQTjpcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENjc1VwbihjY3NDcmVkLmNyZWRlbnRpYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXF1ZXN0LmVtYmVkZGVkQ2xpZW50SWQpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRCcm9rZXJQYXJhbWV0ZXJzKHtcclxuICAgICAgICAgICAgICAgIGJyb2tlckNsaWVudElkOiB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGJyb2tlclJlZGlyZWN0VXJpOiB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBZGQgaHlicmlkIHNwYSBwYXJhbWV0ZXJzIGlmIG5vdCBhbHJlYWR5IHByb3ZpZGVkXHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZW5hYmxlU3BhQXV0aG9yaXphdGlvbkNvZGUgJiZcclxuICAgICAgICAgICAgKCFyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnMgfHxcclxuICAgICAgICAgICAgICAgICFyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnNbUkVUVVJOX1NQQV9DT0RFXSkpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyh7XHJcbiAgICAgICAgICAgICAgICBbUkVUVVJOX1NQQV9DT0RFXTogXCIxXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyQnVpbGRlci5jcmVhdGVRdWVyeVN0cmluZygpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIEFQSSB2YWxpZGF0ZXMgdGhlIGBBdXRob3JpemF0aW9uQ29kZVVybFJlcXVlc3RgIGFuZCBjcmVhdGVzIGEgVVJMXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nKHJlcXVlc3QpIHtcclxuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgY29ycmVsYXRpb25JZCBpZiBub3Qgc2V0IGJ5IHRoZSB1c2VyIGFuZCBhZGRcclxuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmVxdWVzdC5jb3JyZWxhdGlvbklkIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNyeXB0b0ludGVyZmFjZS5jcmVhdGVOZXdHdWlkKCk7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BdXRoQ2xpZW50Q3JlYXRlUXVlcnlTdHJpbmcsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckJ1aWxkZXIgPSBuZXcgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIoY29ycmVsYXRpb25JZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDbGllbnRJZChyZXF1ZXN0LmVtYmVkZGVkQ2xpZW50SWQgfHxcclxuICAgICAgICAgICAgcmVxdWVzdC5leHRyYVF1ZXJ5UGFyYW1ldGVycz8uW0NMSUVOVF9JRF0gfHxcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQpO1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTY29wZXMgPSBbXHJcbiAgICAgICAgICAgIC4uLihyZXF1ZXN0LnNjb3BlcyB8fCBbXSksXHJcbiAgICAgICAgICAgIC4uLihyZXF1ZXN0LmV4dHJhU2NvcGVzVG9Db25zZW50IHx8IFtdKSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkU2NvcGVzKHJlcXVlc3RTY29wZXMsIHRydWUsIHRoaXMub2lkY0RlZmF1bHRTY29wZXMpO1xyXG4gICAgICAgIC8vIHZhbGlkYXRlIHRoZSByZWRpcmVjdFVyaSAodG8gYmUgYSBub24gbnVsbCB2YWx1ZSlcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFJlZGlyZWN0VXJpKHJlcXVlc3QucmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ29ycmVsYXRpb25JZChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBhZGQgcmVzcG9uc2VfbW9kZS4gSWYgbm90IHBhc3NlZCBpbiBpdCBkZWZhdWx0cyB0byBxdWVyeS5cclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFJlc3BvbnNlTW9kZShyZXF1ZXN0LnJlc3BvbnNlTW9kZSk7XHJcbiAgICAgICAgLy8gYWRkIHJlc3BvbnNlX3R5cGUgPSBjb2RlXHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRSZXNwb25zZVR5cGVDb2RlKCk7XHJcbiAgICAgICAgLy8gYWRkIGxpYnJhcnkgaW5mbyBwYXJhbWV0ZXJzXHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRMaWJyYXJ5SW5mbyh0aGlzLmNvbmZpZy5saWJyYXJ5SW5mbyk7XHJcbiAgICAgICAgaWYgKCFpc09pZGNQcm90b2NvbE1vZGUodGhpcy5jb25maWcpKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQXBwbGljYXRpb25UZWxlbWV0cnkodGhpcy5jb25maWcudGVsZW1ldHJ5LmFwcGxpY2F0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIGNsaWVudF9pbmZvPTFcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudEluZm8oKTtcclxuICAgICAgICBpZiAocmVxdWVzdC5jb2RlQ2hhbGxlbmdlICYmIHJlcXVlc3QuY29kZUNoYWxsZW5nZU1ldGhvZCkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENvZGVDaGFsbGVuZ2VQYXJhbXMocmVxdWVzdC5jb2RlQ2hhbGxlbmdlLCByZXF1ZXN0LmNvZGVDaGFsbGVuZ2VNZXRob2QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5wcm9tcHQpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRQcm9tcHQocmVxdWVzdC5wcm9tcHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5kb21haW5IaW50KSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkRG9tYWluSGludChyZXF1ZXN0LmRvbWFpbkhpbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBZGQgc2lkIG9yIGxvZ2luSGludCB3aXRoIHByZWZlcmVuY2UgZm9yIGxvZ2luX2hpbnQgY2xhaW0gKGluIHJlcXVlc3QpIC0+IHNpZCAtPiBsb2dpbkhpbnQgKHVwbi9lbWFpbCkgLT4gdXNlcm5hbWUgb2YgQWNjb3VudEluZm8gb2JqZWN0XHJcbiAgICAgICAgaWYgKHJlcXVlc3QucHJvbXB0ICE9PSBQcm9tcHRWYWx1ZS5TRUxFQ1RfQUNDT1VOVCkge1xyXG4gICAgICAgICAgICAvLyBBQUQgd2lsbCB0aHJvdyBpZiBwcm9tcHQ9c2VsZWN0X2FjY291bnQgaXMgcGFzc2VkIHdpdGggYW4gYWNjb3VudCBoaW50XHJcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZCAmJiByZXF1ZXN0LnByb21wdCA9PT0gUHJvbXB0VmFsdWUuTk9ORSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2Vzc2lvbklEIGlzIG9ubHkgdXNlZCBpbiBzaWxlbnQgY2FsbHNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIHJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFNpZChyZXF1ZXN0LnNpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5hY2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY2NvdW50U2lkID0gdGhpcy5leHRyYWN0QWNjb3VudFNpZChyZXF1ZXN0LmFjY291bnQpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjY291bnRMb2dpbkhpbnRDbGFpbSA9IHRoaXMuZXh0cmFjdExvZ2luSGludChyZXF1ZXN0LmFjY291bnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY291bnRMb2dpbkhpbnRDbGFpbSAmJiByZXF1ZXN0LmRvbWFpbkhpbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKGBBdXRob3JpemF0aW9uQ29kZUNsaWVudC5jcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBcImRvbWFpbkhpbnRcIiBwYXJhbSBpcyBzZXQsIHNraXBwaW5nIG9wYXF1ZSBcImxvZ2luX2hpbnRcIiBjbGFpbS4gUGxlYXNlIGNvbnNpZGVyIG5vdCBwYXNzaW5nIGRvbWFpbkhpbnRgKTtcclxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50TG9naW5IaW50Q2xhaW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgbG9naW5faGludCBjbGFpbSBpcyBwcmVzZW50LCB1c2UgaXQgb3ZlciBzaWQvdXNlcm5hbWVcclxuICAgICAgICAgICAgICAgIGlmIChhY2NvdW50TG9naW5IaW50Q2xhaW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogbG9naW5faGludCBjbGFpbSBwcmVzZW50IG9uIGFjY291bnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRMb2dpbkhpbnQoYWNjb3VudExvZ2luSGludENsYWltKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJbmZvID0gYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQocmVxdWVzdC5hY2NvdW50LmhvbWVBY2NvdW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENjc09pZChjbGllbnRJbmZvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWNjb3VudFNpZCAmJiByZXF1ZXN0LnByb21wdCA9PT0gUHJvbXB0VmFsdWUuTk9ORSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAgICogSWYgYWNjb3VudCBhbmQgbG9naW5IaW50IGFyZSBwcm92aWRlZCwgd2Ugd2lsbCBjaGVjayBhY2NvdW50IGZpcnN0IGZvciBzaWQgYmVmb3JlIGFkZGluZyBsb2dpbkhpbnRcclxuICAgICAgICAgICAgICAgICAgICAgKiBTZXNzaW9uSWQgaXMgb25seSB1c2VkIGluIHNpbGVudCBjYWxsc1xyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIGFjY291bnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRTaWQoYWNjb3VudFNpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50SW5mbyA9IGJ1aWxkQ2xpZW50SW5mb0Zyb21Ib21lQWNjb3VudElkKHJlcXVlc3QuYWNjb3VudC5ob21lQWNjb3VudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDY3NPaWQoY2xpZW50SW5mbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVlc3QubG9naW5IaW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IEFkZGluZyBsb2dpbl9oaW50IGZyb20gcmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZExvZ2luSGludChyZXF1ZXN0LmxvZ2luSGludCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDY3NVcG4ocmVxdWVzdC5sb2dpbkhpbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5hY2NvdW50LnVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gYWNjb3VudCB1c2VybmFtZSBpZiBwcm92aWRlZFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBBZGRpbmcgbG9naW5faGludCBmcm9tIGFjY291bnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRMb2dpbkhpbnQocmVxdWVzdC5hY2NvdW50LnVzZXJuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRJbmZvID0gYnVpbGRDbGllbnRJbmZvRnJvbUhvbWVBY2NvdW50SWQocmVxdWVzdC5hY2NvdW50LmhvbWVBY2NvdW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENjc09pZChjbGllbnRJbmZvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVlc3QubG9naW5IaW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogTm8gYWNjb3VudCwgYWRkaW5nIGxvZ2luX2hpbnQgZnJvbSByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRMb2dpbkhpbnQocmVxdWVzdC5sb2dpbkhpbnQpO1xyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDY3NVcG4ocmVxdWVzdC5sb2dpbkhpbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogUHJvbXB0IGlzIHNlbGVjdF9hY2NvdW50LCBpZ25vcmluZyBhY2NvdW50IGhpbnRzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5ub25jZSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZE5vbmNlKHJlcXVlc3Qubm9uY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0ZSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFN0YXRlKHJlcXVlc3Quc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5jbGFpbXMgfHxcclxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2xhaW1zKHJlcXVlc3QuY2xhaW1zLCB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5lbWJlZGRlZENsaWVudElkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQnJva2VyUGFyYW1ldGVycyh7XHJcbiAgICAgICAgICAgICAgICBicm9rZXJDbGllbnRJZDogdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICBicm9rZXJSZWRpcmVjdFVyaTogdGhpcy5jb25maWcuYXV0aE9wdGlvbnMucmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZEV4dHJhUXVlcnlQYXJhbXMocmVxdWVzdCwgcGFyYW1ldGVyQnVpbGRlcik7XHJcbiAgICAgICAgaWYgKHJlcXVlc3QubmF0aXZlQnJva2VyKSB7XHJcbiAgICAgICAgICAgIC8vIHNpZ25hbCBlc3RzIHRoYXQgdGhpcyBpcyBhIFdBTSBjYWxsXHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkTmF0aXZlQnJva2VyKCk7XHJcbiAgICAgICAgICAgIC8vIHBhc3MgdGhlIHJlcV9jbmYgZm9yIFBPUFxyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3BUb2tlbkdlbmVyYXRvciA9IG5ldyBQb3BUb2tlbkdlbmVyYXRvcih0aGlzLmNyeXB0b1V0aWxzKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlcV9jbmYgaXMgYWx3YXlzIHNlbnQgYXMgYSBzdHJpbmcgZm9yIFNQQXNcclxuICAgICAgICAgICAgICAgIGxldCByZXFDbmZEYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnBvcEtpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFJlcUNuZkRhdGEgPSBhd2FpdCBpbnZva2VBc3luYyhwb3BUb2tlbkdlbmVyYXRvci5nZW5lcmF0ZUNuZi5iaW5kKHBvcFRva2VuR2VuZXJhdG9yKSwgUGVyZm9ybWFuY2VFdmVudHMuUG9wVG9rZW5HZW5lcmF0ZUNuZiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCwgdGhpcy5sb2dnZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSBnZW5lcmF0ZWRSZXFDbmZEYXRhLnJlcUNuZlN0cmluZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSB0aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChyZXF1ZXN0LnBvcEtpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFBvcFRva2VuKHJlcUNuZkRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXJCdWlsZGVyLmNyZWF0ZVF1ZXJ5U3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgQVBJIHZhbGlkYXRlcyB0aGUgYEVuZFNlc3Npb25SZXF1ZXN0YCBhbmQgY3JlYXRlcyBhIFVSTFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgY3JlYXRlTG9nb3V0VXJsUXVlcnlTdHJpbmcocmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckJ1aWxkZXIgPSBuZXcgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIocmVxdWVzdC5jb3JyZWxhdGlvbklkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICBpZiAocmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRQb3N0TG9nb3V0UmVkaXJlY3RVcmkocmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5jb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ29ycmVsYXRpb25JZChyZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5pZFRva2VuSGludCkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZElkVG9rZW5IaW50KHJlcXVlc3QuaWRUb2tlbkhpbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0ZSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFN0YXRlKHJlcXVlc3Quc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5sb2dvdXRIaW50KSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkTG9nb3V0SGludChyZXF1ZXN0LmxvZ291dEhpbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZEV4dHJhUXVlcnlQYXJhbXMocmVxdWVzdCwgcGFyYW1ldGVyQnVpbGRlcik7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlckJ1aWxkZXIuY3JlYXRlUXVlcnlTdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGFkZEV4dHJhUXVlcnlQYXJhbXMocmVxdWVzdCwgcGFyYW1ldGVyQnVpbGRlcikge1xyXG4gICAgICAgIGNvbnN0IGhhc1JlcXVlc3RJbnN0YW5jZUF3YXJlID0gcmVxdWVzdC5leHRyYVF1ZXJ5UGFyYW1ldGVycyAmJlxyXG4gICAgICAgICAgICByZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KFwiaW5zdGFuY2VfYXdhcmVcIik7XHJcbiAgICAgICAgLy8gU2V0IGluc3RhbmNlX2F3YXJlIGZsYWcgaWYgY29uZmlnIGF1dGggcGFyYW0gaXMgc2V0XHJcbiAgICAgICAgaWYgKCFoYXNSZXF1ZXN0SW5zdGFuY2VBd2FyZSAmJiB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5pbnN0YW5jZUF3YXJlKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXh0cmFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzIHx8IHt9O1xyXG4gICAgICAgICAgICByZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzW1wiaW5zdGFuY2VfYXdhcmVcIl0gPSBcInRydWVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZXh0cmFRdWVyeVBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciB0byBnZXQgc2lkIGZyb20gYWNjb3VudC4gUmV0dXJucyBudWxsIGlmIGlkVG9rZW5DbGFpbXMgYXJlIG5vdCBwcmVzZW50IG9yIHNpZCBpcyBub3QgcHJlc2VudC5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIGV4dHJhY3RBY2NvdW50U2lkKGFjY291bnQpIHtcclxuICAgICAgICByZXR1cm4gYWNjb3VudC5pZFRva2VuQ2xhaW1zPy5zaWQgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIGV4dHJhY3RMb2dpbkhpbnQoYWNjb3VudCkge1xyXG4gICAgICAgIHJldHVybiBhY2NvdW50LmlkVG9rZW5DbGFpbXM/LmxvZ2luX2hpbnQgfHwgbnVsbDtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBBdXRob3JpemF0aW9uQ29kZUNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aG9yaXphdGlvbkNvZGVDbGllbnQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDYWNoZU91dGNvbWUsIENvbnN0YW50cywgU0VSVkVSX1RFTEVNX0NPTlNUQU5UUywgU2VwYXJhdG9ycyB9IGZyb20gJy4uLy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IvQXV0aEVycm9yLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBza3VHcm91cFNlcGFyYXRvciA9IFwiLFwiO1xyXG5jb25zdCBza3VWYWx1ZVNlcGFyYXRvciA9IFwifFwiO1xyXG5mdW5jdGlvbiBtYWtlRXh0cmFTa3VTdHJpbmcocGFyYW1zKSB7XHJcbiAgICBjb25zdCB7IHNrdXMsIGxpYnJhcnlOYW1lLCBsaWJyYXJ5VmVyc2lvbiwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVmVyc2lvbiwgfSA9IHBhcmFtcztcclxuICAgIGNvbnN0IHNrdU1hcCA9IG5ldyBNYXAoW1xyXG4gICAgICAgIFswLCBbbGlicmFyeU5hbWUsIGxpYnJhcnlWZXJzaW9uXV0sXHJcbiAgICAgICAgWzIsIFtleHRlbnNpb25OYW1lLCBleHRlbnNpb25WZXJzaW9uXV0sXHJcbiAgICBdKTtcclxuICAgIGxldCBza3VBcnIgPSBbXTtcclxuICAgIGlmIChza3VzPy5sZW5ndGgpIHtcclxuICAgICAgICBza3VBcnIgPSBza3VzLnNwbGl0KHNrdUdyb3VwU2VwYXJhdG9yKTtcclxuICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCBpbnB1dCBza3UgcGFyYW1cclxuICAgICAgICBpZiAoc2t1QXJyLmxlbmd0aCA8IDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNrdXM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgc2t1QXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNCB9LCAoKSA9PiBza3VWYWx1ZVNlcGFyYXRvcik7XHJcbiAgICB9XHJcbiAgICBza3VNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIgJiYgdmFsdWVbMF0/Lmxlbmd0aCAmJiB2YWx1ZVsxXT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHNldFNrdSh7XHJcbiAgICAgICAgICAgICAgICBza3VBcnIsXHJcbiAgICAgICAgICAgICAgICBpbmRleDoga2V5LFxyXG4gICAgICAgICAgICAgICAgc2t1TmFtZTogdmFsdWVbMF0sXHJcbiAgICAgICAgICAgICAgICBza3VWZXJzaW9uOiB2YWx1ZVsxXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2t1QXJyLmpvaW4oc2t1R3JvdXBTZXBhcmF0b3IpO1xyXG59XHJcbmZ1bmN0aW9uIHNldFNrdShwYXJhbXMpIHtcclxuICAgIGNvbnN0IHsgc2t1QXJyLCBpbmRleCwgc2t1TmFtZSwgc2t1VmVyc2lvbiB9ID0gcGFyYW1zO1xyXG4gICAgaWYgKGluZGV4ID49IHNrdUFyci5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBza3VBcnJbaW5kZXhdID0gW3NrdU5hbWUsIHNrdVZlcnNpb25dLmpvaW4oc2t1VmFsdWVTZXBhcmF0b3IpO1xyXG59XHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgU2VydmVyVGVsZW1ldHJ5TWFuYWdlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0ZWxlbWV0cnlSZXF1ZXN0LCBjYWNoZU1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLmNhY2hlT3V0Y29tZSA9IENhY2hlT3V0Y29tZS5OT1RfQVBQTElDQUJMRTtcclxuICAgICAgICB0aGlzLmNhY2hlTWFuYWdlciA9IGNhY2hlTWFuYWdlcjtcclxuICAgICAgICB0aGlzLmFwaUlkID0gdGVsZW1ldHJ5UmVxdWVzdC5hcGlJZDtcclxuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uSWQgPSB0ZWxlbWV0cnlSZXF1ZXN0LmNvcnJlbGF0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy53cmFwcGVyU0tVID0gdGVsZW1ldHJ5UmVxdWVzdC53cmFwcGVyU0tVIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgdGhpcy53cmFwcGVyVmVyID0gdGVsZW1ldHJ5UmVxdWVzdC53cmFwcGVyVmVyIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgdGhpcy50ZWxlbWV0cnlDYWNoZUtleSA9XHJcbiAgICAgICAgICAgIFNFUlZFUl9URUxFTV9DT05TVEFOVFMuQ0FDSEVfS0VZICtcclxuICAgICAgICAgICAgICAgIFNlcGFyYXRvcnMuQ0FDSEVfS0VZX1NFUEFSQVRPUiArXHJcbiAgICAgICAgICAgICAgICB0ZWxlbWV0cnlSZXF1ZXN0LmNsaWVudElkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBUEkgdG8gYWRkIE1TRVIgVGVsZW1ldHJ5IHRvIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVDdXJyZW50UmVxdWVzdEhlYWRlclZhbHVlKCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBgJHt0aGlzLmFwaUlkfSR7U0VSVkVSX1RFTEVNX0NPTlNUQU5UUy5WQUxVRV9TRVBBUkFUT1J9JHt0aGlzLmNhY2hlT3V0Y29tZX1gO1xyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtRmllbGRzQXJyID0gW3RoaXMud3JhcHBlclNLVSwgdGhpcy53cmFwcGVyVmVyXTtcclxuICAgICAgICBjb25zdCBuYXRpdmVCcm9rZXJFcnJvckNvZGUgPSB0aGlzLmdldE5hdGl2ZUJyb2tlckVycm9yQ29kZSgpO1xyXG4gICAgICAgIGlmIChuYXRpdmVCcm9rZXJFcnJvckNvZGU/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBwbGF0Zm9ybUZpZWxkc0Fyci5wdXNoKGBicm9rZXJfZXJyb3I9JHtuYXRpdmVCcm9rZXJFcnJvckNvZGV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtRmllbGRzID0gcGxhdGZvcm1GaWVsZHNBcnIuam9pbihTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLlZBTFVFX1NFUEFSQVRPUik7XHJcbiAgICAgICAgY29uc3QgcmVnaW9uRGlzY292ZXJ5RmllbGRzID0gdGhpcy5nZXRSZWdpb25EaXNjb3ZlcnlGaWVsZHMoKTtcclxuICAgICAgICBjb25zdCByZXF1ZXN0V2l0aFJlZ2lvbkRpc2NvdmVyeUZpZWxkcyA9IFtcclxuICAgICAgICAgICAgcmVxdWVzdCxcclxuICAgICAgICAgICAgcmVnaW9uRGlzY292ZXJ5RmllbGRzLFxyXG4gICAgICAgIF0uam9pbihTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLlZBTFVFX1NFUEFSQVRPUik7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgU0VSVkVSX1RFTEVNX0NPTlNUQU5UUy5TQ0hFTUFfVkVSU0lPTixcclxuICAgICAgICAgICAgcmVxdWVzdFdpdGhSZWdpb25EaXNjb3ZlcnlGaWVsZHMsXHJcbiAgICAgICAgICAgIHBsYXRmb3JtRmllbGRzLFxyXG4gICAgICAgIF0uam9pbihTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLkNBVEVHT1JZX1NFUEFSQVRPUik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFQSSB0byBhZGQgTVNFUiBUZWxlbWV0cnkgZm9yIHRoZSBsYXN0IGZhaWxlZCByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpIHtcclxuICAgICAgICBjb25zdCBsYXN0UmVxdWVzdHMgPSB0aGlzLmdldExhc3RSZXF1ZXN0cygpO1xyXG4gICAgICAgIGNvbnN0IG1heEVycm9ycyA9IFNlcnZlclRlbGVtZXRyeU1hbmFnZXIubWF4RXJyb3JzVG9TZW5kKGxhc3RSZXF1ZXN0cyk7XHJcbiAgICAgICAgY29uc3QgZmFpbGVkUmVxdWVzdHMgPSBsYXN0UmVxdWVzdHMuZmFpbGVkUmVxdWVzdHNcclxuICAgICAgICAgICAgLnNsaWNlKDAsIDIgKiBtYXhFcnJvcnMpXHJcbiAgICAgICAgICAgIC5qb2luKFNFUlZFUl9URUxFTV9DT05TVEFOVFMuVkFMVUVfU0VQQVJBVE9SKTtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBsYXN0UmVxdWVzdHMuZXJyb3JzXHJcbiAgICAgICAgICAgIC5zbGljZSgwLCBtYXhFcnJvcnMpXHJcbiAgICAgICAgICAgIC5qb2luKFNFUlZFUl9URUxFTV9DT05TVEFOVFMuVkFMVUVfU0VQQVJBVE9SKTtcclxuICAgICAgICBjb25zdCBlcnJvckNvdW50ID0gbGFzdFJlcXVlc3RzLmVycm9ycy5sZW5ndGg7XHJcbiAgICAgICAgLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGhlYWRlciBjb250YWlucyBhbGwgZGF0YSBvciBwYXJ0aWFsIGRhdGFcclxuICAgICAgICBjb25zdCBvdmVyZmxvdyA9IG1heEVycm9ycyA8IGVycm9yQ291bnRcclxuICAgICAgICAgICAgPyBTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLk9WRVJGTE9XX1RSVUVcclxuICAgICAgICAgICAgOiBTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLk9WRVJGTE9XX0ZBTFNFO1xyXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtRmllbGRzID0gW2Vycm9yQ291bnQsIG92ZXJmbG93XS5qb2luKFNFUlZFUl9URUxFTV9DT05TVEFOVFMuVkFMVUVfU0VQQVJBVE9SKTtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLlNDSEVNQV9WRVJTSU9OLFxyXG4gICAgICAgICAgICBsYXN0UmVxdWVzdHMuY2FjaGVIaXRzLFxyXG4gICAgICAgICAgICBmYWlsZWRSZXF1ZXN0cyxcclxuICAgICAgICAgICAgZXJyb3JzLFxyXG4gICAgICAgICAgICBwbGF0Zm9ybUZpZWxkcyxcclxuICAgICAgICBdLmpvaW4oU0VSVkVSX1RFTEVNX0NPTlNUQU5UUy5DQVRFR09SWV9TRVBBUkFUT1IpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBUEkgdG8gY2FjaGUgdG9rZW4gZmFpbHVyZXMgZm9yIE1TRVIgZGF0YSBjYXB0dXJlXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JcclxuICAgICAqL1xyXG4gICAgY2FjaGVGYWlsZWRSZXF1ZXN0KGVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFJlcXVlc3RzID0gdGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtcclxuICAgICAgICBpZiAobGFzdFJlcXVlc3RzLmVycm9ycy5sZW5ndGggPj1cclxuICAgICAgICAgICAgU0VSVkVSX1RFTEVNX0NPTlNUQU5UUy5NQVhfQ0FDSEVEX0VSUk9SUykge1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgYSBjYWNoZWQgZXJyb3IgdG8gbWFrZSByb29tLCBmaXJzdCBpbiBmaXJzdCBvdXRcclxuICAgICAgICAgICAgbGFzdFJlcXVlc3RzLmZhaWxlZFJlcXVlc3RzLnNoaWZ0KCk7IC8vIGFwaUlkXHJcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0cy5mYWlsZWRSZXF1ZXN0cy5zaGlmdCgpOyAvLyBjb3JyZWxhdGlvbklkXHJcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0cy5lcnJvcnMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFzdFJlcXVlc3RzLmZhaWxlZFJlcXVlc3RzLnB1c2godGhpcy5hcGlJZCwgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhIWVycm9yICYmIGVycm9yLnRvU3RyaW5nKCkpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3ViRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UmVxdWVzdHMuZXJyb3JzLnB1c2goZXJyb3Iuc3ViRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IuZXJyb3JDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFJlcXVlc3RzLmVycm9ycy5wdXNoKGVycm9yLmVycm9yQ29kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UmVxdWVzdHMuZXJyb3JzLnB1c2goZXJyb3IudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0UmVxdWVzdHMuZXJyb3JzLnB1c2goZXJyb3IudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0cy5lcnJvcnMucHVzaChTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLlVOS05PV05fRVJST1IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlTWFuYWdlci5zZXRTZXJ2ZXJUZWxlbWV0cnkodGhpcy50ZWxlbWV0cnlDYWNoZUtleSwgbGFzdFJlcXVlc3RzKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBzZXJ2ZXIgdGVsZW1ldHJ5IGNhY2hlIGVudHJ5IGJ5IGluY3JlbWVudGluZyBjYWNoZSBoaXQgY291bnRlclxyXG4gICAgICovXHJcbiAgICBpbmNyZW1lbnRDYWNoZUhpdHMoKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFJlcXVlc3RzID0gdGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtcclxuICAgICAgICBsYXN0UmVxdWVzdHMuY2FjaGVIaXRzICs9IDE7XHJcbiAgICAgICAgdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksIGxhc3RSZXF1ZXN0cyk7XHJcbiAgICAgICAgcmV0dXJuIGxhc3RSZXF1ZXN0cy5jYWNoZUhpdHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgc2VydmVyIHRlbGVtZXRyeSBlbnRpdHkgZnJvbSBjYWNoZSBvciBpbml0aWFsaXplIGEgbmV3IG9uZVxyXG4gICAgICovXHJcbiAgICBnZXRMYXN0UmVxdWVzdHMoKSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0ge1xyXG4gICAgICAgICAgICBmYWlsZWRSZXF1ZXN0czogW10sXHJcbiAgICAgICAgICAgIGVycm9yczogW10sXHJcbiAgICAgICAgICAgIGNhY2hlSGl0czogMCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGxhc3RSZXF1ZXN0cyA9IHRoaXMuY2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeSh0aGlzLnRlbGVtZXRyeUNhY2hlS2V5KTtcclxuICAgICAgICByZXR1cm4gbGFzdFJlcXVlc3RzIHx8IGluaXRpYWxWYWx1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIHNlcnZlciB0ZWxlbWV0cnkgY2FjaGUgZW50cnlcclxuICAgICAqL1xyXG4gICAgY2xlYXJUZWxlbWV0cnlDYWNoZSgpIHtcclxuICAgICAgICBjb25zdCBsYXN0UmVxdWVzdHMgPSB0aGlzLmdldExhc3RSZXF1ZXN0cygpO1xyXG4gICAgICAgIGNvbnN0IG51bUVycm9yc0ZsdXNoZWQgPSBTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLm1heEVycm9yc1RvU2VuZChsYXN0UmVxdWVzdHMpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yQ291bnQgPSBsYXN0UmVxdWVzdHMuZXJyb3JzLmxlbmd0aDtcclxuICAgICAgICBpZiAobnVtRXJyb3JzRmx1c2hlZCA9PT0gZXJyb3JDb3VudCkge1xyXG4gICAgICAgICAgICAvLyBBbGwgZXJyb3JzIHdlcmUgc2VudCBvbiBsYXN0IHJlcXVlc3QsIGNsZWFyIFRlbGVtZXRyeSBjYWNoZVxyXG4gICAgICAgICAgICB0aGlzLmNhY2hlTWFuYWdlci5yZW1vdmVJdGVtKHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUGFydGlhbCBkYXRhIHdhcyBmbHVzaGVkIHRvIHNlcnZlciwgY29uc3RydWN0IGEgbmV3IHRlbGVtZXRyeSBjYWNoZSBpdGVtIHdpdGggZXJyb3JzIHRoYXQgd2VyZSBub3QgZmx1c2hlZFxyXG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJUZWxlbUVudGl0eSA9IHtcclxuICAgICAgICAgICAgICAgIGZhaWxlZFJlcXVlc3RzOiBsYXN0UmVxdWVzdHMuZmFpbGVkUmVxdWVzdHMuc2xpY2UobnVtRXJyb3JzRmx1c2hlZCAqIDIpLFxyXG4gICAgICAgICAgICAgICAgZXJyb3JzOiBsYXN0UmVxdWVzdHMuZXJyb3JzLnNsaWNlKG51bUVycm9yc0ZsdXNoZWQpLFxyXG4gICAgICAgICAgICAgICAgY2FjaGVIaXRzOiAwLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlTWFuYWdlci5zZXRTZXJ2ZXJUZWxlbWV0cnkodGhpcy50ZWxlbWV0cnlDYWNoZUtleSwgc2VydmVyVGVsZW1FbnRpdHkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIHRoYXQgY2FuIGJlIGZsdXNoZWQgdG8gdGhlIHNlcnZlciBpbiB0aGUgbmV4dCBuZXR3b3JrIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBzZXJ2ZXJUZWxlbWV0cnlFbnRpdHlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1heEVycm9yc1RvU2VuZChzZXJ2ZXJUZWxlbWV0cnlFbnRpdHkpIHtcclxuICAgICAgICBsZXQgaTtcclxuICAgICAgICBsZXQgbWF4RXJyb3JzID0gMDtcclxuICAgICAgICBsZXQgZGF0YVNpemUgPSAwO1xyXG4gICAgICAgIGNvbnN0IGVycm9yQ291bnQgPSBzZXJ2ZXJUZWxlbWV0cnlFbnRpdHkuZXJyb3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXJyb3JDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGZhaWxlZFJlcXVlc3RzIHBhcmFtZXRlciBjb250YWlucyBwYWlycyBvZiBhcGlJZCBhbmQgY29ycmVsYXRpb25JZCwgbXVsdGlwbHkgaW5kZXggYnkgMiB0byBwcmVzZXJ2ZSBwYWlyc1xyXG4gICAgICAgICAgICBjb25zdCBhcGlJZCA9IHNlcnZlclRlbGVtZXRyeUVudGl0eS5mYWlsZWRSZXF1ZXN0c1syICogaV0gfHxcclxuICAgICAgICAgICAgICAgIENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBzZXJ2ZXJUZWxlbWV0cnlFbnRpdHkuZmFpbGVkUmVxdWVzdHNbMiAqIGkgKyAxXSB8fFxyXG4gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gc2VydmVyVGVsZW1ldHJ5RW50aXR5LmVycm9yc1tpXSB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HO1xyXG4gICAgICAgICAgICAvLyBDb3VudCBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGJlIGFkZGVkIHRvIGhlYWRlciwgZWFjaCBjaGFyYWN0ZXIgaXMgMSBieXRlLiBBZGQgMyBhdCB0aGUgZW5kIHRvIGFjY291bnQgZm9yIHNlcGFyYXRvcnNcclxuICAgICAgICAgICAgZGF0YVNpemUgKz1cclxuICAgICAgICAgICAgICAgIGFwaUlkLnRvU3RyaW5nKCkubGVuZ3RoICtcclxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkLnRvU3RyaW5nKCkubGVuZ3RoICtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUubGVuZ3RoICtcclxuICAgICAgICAgICAgICAgICAgICAzO1xyXG4gICAgICAgICAgICBpZiAoZGF0YVNpemUgPCBTRVJWRVJfVEVMRU1fQ09OU1RBTlRTLk1BWF9MQVNUX0hFQURFUl9CWVRFUykge1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoaXMgZW50cnkgdG8gdGhlIGhlYWRlciB3b3VsZCBzdGlsbCBrZWVwIGhlYWRlciBzaXplIGJlbG93IHRoZSBsaW1pdFxyXG4gICAgICAgICAgICAgICAgbWF4RXJyb3JzICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF4RXJyb3JzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHJlZ2lvbiBkaXNjb3ZlcnkgZmllbGRzXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIGdldFJlZ2lvbkRpc2NvdmVyeUZpZWxkcygpIHtcclxuICAgICAgICBjb25zdCByZWdpb25EaXNjb3ZlcnlGaWVsZHMgPSBbXTtcclxuICAgICAgICByZWdpb25EaXNjb3ZlcnlGaWVsZHMucHVzaCh0aGlzLnJlZ2lvblVzZWQgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgcmVnaW9uRGlzY292ZXJ5RmllbGRzLnB1c2godGhpcy5yZWdpb25Tb3VyY2UgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgcmVnaW9uRGlzY292ZXJ5RmllbGRzLnB1c2godGhpcy5yZWdpb25PdXRjb21lIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgIHJldHVybiByZWdpb25EaXNjb3ZlcnlGaWVsZHMuam9pbihcIixcIik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgcmVnaW9uIGRpc2NvdmVyeSBtZXRhZGF0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZWdpb25EaXNjb3ZlcnlNZXRhZGF0YVxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVSZWdpb25EaXNjb3ZlcnlNZXRhZGF0YShyZWdpb25EaXNjb3ZlcnlNZXRhZGF0YSkge1xyXG4gICAgICAgIHRoaXMucmVnaW9uVXNlZCA9IHJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl91c2VkO1xyXG4gICAgICAgIHRoaXMucmVnaW9uU291cmNlID0gcmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX3NvdXJjZTtcclxuICAgICAgICB0aGlzLnJlZ2lvbk91dGNvbWUgPSByZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGNhY2hlIG91dGNvbWVcclxuICAgICAqL1xyXG4gICAgc2V0Q2FjaGVPdXRjb21lKGNhY2hlT3V0Y29tZSkge1xyXG4gICAgICAgIHRoaXMuY2FjaGVPdXRjb21lID0gY2FjaGVPdXRjb21lO1xyXG4gICAgfVxyXG4gICAgc2V0TmF0aXZlQnJva2VyRXJyb3JDb2RlKGVycm9yQ29kZSkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RSZXF1ZXN0cyA9IHRoaXMuZ2V0TGFzdFJlcXVlc3RzKCk7XHJcbiAgICAgICAgbGFzdFJlcXVlc3RzLm5hdGl2ZUJyb2tlckVycm9yQ29kZSA9IGVycm9yQ29kZTtcclxuICAgICAgICB0aGlzLmNhY2hlTWFuYWdlci5zZXRTZXJ2ZXJUZWxlbWV0cnkodGhpcy50ZWxlbWV0cnlDYWNoZUtleSwgbGFzdFJlcXVlc3RzKTtcclxuICAgIH1cclxuICAgIGdldE5hdGl2ZUJyb2tlckVycm9yQ29kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXN0UmVxdWVzdHMoKS5uYXRpdmVCcm9rZXJFcnJvckNvZGU7XHJcbiAgICB9XHJcbiAgICBjbGVhck5hdGl2ZUJyb2tlckVycm9yQ29kZSgpIHtcclxuICAgICAgICBjb25zdCBsYXN0UmVxdWVzdHMgPSB0aGlzLmdldExhc3RSZXF1ZXN0cygpO1xyXG4gICAgICAgIGRlbGV0ZSBsYXN0UmVxdWVzdHMubmF0aXZlQnJva2VyRXJyb3JDb2RlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSh0aGlzLnRlbGVtZXRyeUNhY2hlS2V5LCBsYXN0UmVxdWVzdHMpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIG1ha2VFeHRyYVNrdVN0cmluZyhwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gbWFrZUV4dHJhU2t1U3RyaW5nKHBhcmFtcyk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2VydmVyVGVsZW1ldHJ5TWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VydmVyVGVsZW1ldHJ5TWFuYWdlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEFjY291bnRFbnRpdHksIFVybFN0cmluZywgU2VydmVyVGVsZW1ldHJ5TWFuYWdlciwgUGVyZm9ybWFuY2VFdmVudHMsIEF1dGhvcml0eSwgaW52b2tlQXN5bmMsIEF1dGhvcml0eUZhY3RvcnksIGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvciwgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBCcm93c2VyQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVyaSB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJVdGlscy5tanMnO1xuaW1wb3J0IHsgY3JlYXRlTmV3R3VpZCB9IGZyb20gJy4uL2NyeXB0by9Ccm93c2VyQ3J5cHRvLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBCYXNlSW50ZXJhY3Rpb25DbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBzdG9yYWdlSW1wbCwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIHBlcmZvcm1hbmNlQ2xpZW50LCBuYXRpdmVNZXNzYWdlSGFuZGxlciwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UgPSBzdG9yYWdlSW1wbDtcclxuICAgICAgICB0aGlzLmJyb3dzZXJDcnlwdG8gPSBicm93c2VyQ3J5cHRvO1xyXG4gICAgICAgIHRoaXMubmV0d29ya0NsaWVudCA9IHRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkNsaWVudCA9IG5hdmlnYXRpb25DbGllbnQ7XHJcbiAgICAgICAgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciA9IG5hdGl2ZU1lc3NhZ2VIYW5kbGVyO1xyXG4gICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQgfHwgY3JlYXRlTmV3R3VpZCgpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyLmNsb25lKEJyb3dzZXJDb25zdGFudHMuTVNBTF9TS1UsIHZlcnNpb24sIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgY2xlYXJDYWNoZU9uTG9nb3V0KGFjY291bnQpIHtcclxuICAgICAgICBpZiAoYWNjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAoQWNjb3VudEVudGl0eS5hY2NvdW50SW5mb0lzRXF1YWwoYWNjb3VudCwgdGhpcy5icm93c2VyU3RvcmFnZS5nZXRBY3RpdmVBY2NvdW50KCksIGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNldHRpbmcgYWN0aXZlIGFjY291bnQgdG8gbnVsbFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0QWN0aXZlQWNjb3VudChudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBDbGVhciBnaXZlbiBhY2NvdW50LlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVBY2NvdW50KEFjY291bnRFbnRpdHkuZ2VuZXJhdGVBY2NvdW50Q2FjaGVLZXkoYWNjb3VudCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkNsZWFyZWQgY2FjaGUgaXRlbXMgYmVsb25naW5nIHRvIHRoZSBhY2NvdW50IHByb3ZpZGVkIGluIHRoZSBsb2dvdXQgcmVxdWVzdC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIkFjY291bnQgcHJvdmlkZWQgaW4gbG9nb3V0IHJlcXVlc3Qgd2FzIG5vdCBmb3VuZC4gTG9jYWwgY2FjaGUgdW5jaGFuZ2VkLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJObyBhY2NvdW50IHByb3ZpZGVkIGluIGxvZ291dCByZXF1ZXN0LCBjbGVhcmluZyBhbGwgY2FjaGUgaXRlbXMuXCIsIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBhbGwgYWNjb3VudHMgYW5kIHRva2Vuc1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHN0cmF5IGtleXMgZnJvbSBJbmRleGVkREJcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3NlckNyeXB0by5jbGVhcktleXN0b3JlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiQXR0ZW1wdGVkIHRvIGNsZWFyIGFsbCBNU0FMIGNhY2hlIGl0ZW1zIGFuZCBmYWlsZWQuIExvY2FsIGNhY2hlIHVuY2hhbmdlZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBVc2UgdG8gZ2V0IHRoZSByZWRpcmVjdCB1cmkgY29uZmlndXJlZCBpbiBNU0FMIG9yIG51bGwuXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFJlZGlyZWN0VXJpXHJcbiAgICAgKiBAcmV0dXJucyBSZWRpcmVjdCBVUkxcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGdldFJlZGlyZWN0VXJpKHJlcXVlc3RSZWRpcmVjdFVyaSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJnZXRSZWRpcmVjdFVyaSBjYWxsZWRcIik7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSByZXF1ZXN0UmVkaXJlY3RVcmkgfHwgdGhpcy5jb25maWcuYXV0aC5yZWRpcmVjdFVyaTtcclxuICAgICAgICByZXR1cm4gVXJsU3RyaW5nLmdldEFic29sdXRlVXJsKHJlZGlyZWN0VXJpLCBnZXRDdXJyZW50VXJpKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFwaUlkXHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZFxyXG4gICAgICogQHBhcmFtIGZvcmNlUmVmcmVzaFxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihhcGlJZCwgZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyIGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCB0ZWxlbWV0cnlQYXlsb2FkID0ge1xyXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5jb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICBhcGlJZDogYXBpSWQsXHJcbiAgICAgICAgICAgIGZvcmNlUmVmcmVzaDogZm9yY2VSZWZyZXNoIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICB3cmFwcGVyU0tVOiB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFdyYXBwZXJNZXRhZGF0YSgpWzBdLFxyXG4gICAgICAgICAgICB3cmFwcGVyVmVyOiB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFdyYXBwZXJNZXRhZGF0YSgpWzFdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRlbGVtZXRyeVBheWxvYWQsIHRoaXMuYnJvd3NlclN0b3JhZ2UpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGdldCBhIGRpc2NvdmVyZWQgdmVyc2lvbiBvZiB0aGUgZGVmYXVsdCBhdXRob3JpdHkuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHtcclxuICAgICAqICAgICAgICAgcmVxdWVzdEF1dGhvcml0eT86IHN0cmluZztcclxuICAgICAqICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zPzogQXp1cmVDbG91ZE9wdGlvbnM7XHJcbiAgICAgKiAgICAgICAgIHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVycz86IFN0cmluZ0RpY3Q7XHJcbiAgICAgKiAgICAgICAgIGFjY291bnQ/OiBBY2NvdW50SW5mbztcclxuICAgICAqICAgICAgICB9XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldERpc2NvdmVyZWRBdXRob3JpdHkocGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgeyBhY2NvdW50IH0gPSBwYXJhbXM7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VBd2FyZUVRID0gcGFyYW1zLnJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVycyAmJlxyXG4gICAgICAgICAgICBwYXJhbXMucmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KFwiaW5zdGFuY2VfYXdhcmVcIilcclxuICAgICAgICAgICAgPyBwYXJhbXMucmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzW1wiaW5zdGFuY2VfYXdhcmVcIl1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvcml0eU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHByb3RvY29sTW9kZTogdGhpcy5jb25maWcuYXV0aC5wcm90b2NvbE1vZGUsXHJcbiAgICAgICAgICAgIE9JRENPcHRpb25zOiB0aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLFxyXG4gICAgICAgICAgICBrbm93bkF1dGhvcml0aWVzOiB0aGlzLmNvbmZpZy5hdXRoLmtub3duQXV0aG9yaXRpZXMsXHJcbiAgICAgICAgICAgIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6IHRoaXMuY29uZmlnLmF1dGguY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSxcclxuICAgICAgICAgICAgYXV0aG9yaXR5TWV0YWRhdGE6IHRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsXHJcbiAgICAgICAgICAgIHNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlOiB0aGlzLmNvbmZpZy5hdXRoLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYnVpbGQgYXV0aG9yaXR5IHN0cmluZyBiYXNlZCBvbiBhdXRoIHBhcmFtcywgcHJlY2VkZW5jZSAtIGF6dXJlQ2xvdWRJbnN0YW5jZSArIHRlbmFudCA+PiBhdXRob3JpdHlcclxuICAgICAgICBjb25zdCByZXNvbHZlZEF1dGhvcml0eSA9IHBhcmFtcy5yZXF1ZXN0QXV0aG9yaXR5IHx8IHRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5O1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSW5zdGFuY2VBd2FyZSA9IGluc3RhbmNlQXdhcmVFUT8ubGVuZ3RoXHJcbiAgICAgICAgICAgID8gaW5zdGFuY2VBd2FyZUVRID09PSBcInRydWVcIlxyXG4gICAgICAgICAgICA6IHRoaXMuY29uZmlnLmF1dGguaW5zdGFuY2VBd2FyZTtcclxuICAgICAgICBjb25zdCB1c2VyQXV0aG9yaXR5ID0gYWNjb3VudCAmJiByZXNvbHZlZEluc3RhbmNlQXdhcmVcclxuICAgICAgICAgICAgPyB0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eS5yZXBsYWNlKFVybFN0cmluZy5nZXREb21haW5Gcm9tVXJsKHJlc29sdmVkQXV0aG9yaXR5KSwgYWNjb3VudC5lbnZpcm9ubWVudClcclxuICAgICAgICAgICAgOiByZXNvbHZlZEF1dGhvcml0eTtcclxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGF1dGhvcml0eSBmcm9tIGNvbmZpZ1xyXG4gICAgICAgIGNvbnN0IGJ1aWx0QXV0aG9yaXR5ID0gQXV0aG9yaXR5LmdlbmVyYXRlQXV0aG9yaXR5KHVzZXJBdXRob3JpdHksIHBhcmFtcy5yZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnMgfHxcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aC5henVyZUNsb3VkT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZGlzY292ZXJlZEF1dGhvcml0eSA9IGF3YWl0IGludm9rZUFzeW5jKEF1dGhvcml0eUZhY3RvcnkuY3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLCBQZXJmb3JtYW5jZUV2ZW50cy5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShidWlsdEF1dGhvcml0eSwgdGhpcy5jb25maWcuc3lzdGVtLm5ldHdvcmtDbGllbnQsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIGF1dGhvcml0eU9wdGlvbnMsIHRoaXMubG9nZ2VyLCB0aGlzLmNvcnJlbGF0aW9uSWQsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgIGlmIChhY2NvdW50ICYmICFkaXNjb3ZlcmVkQXV0aG9yaXR5LmlzQWxpYXMoYWNjb3VudC5lbnZpcm9ubWVudCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKENsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLmF1dGhvcml0eU1pc21hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc2NvdmVyZWRBdXRob3JpdHk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQmFzZUludGVyYWN0aW9uQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlSW50ZXJhY3Rpb25DbGllbnQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50cywgaW52b2tlLCBpbnZva2VBc3luYyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyB1cmxFbmNvZGVBcnIgfSBmcm9tICcuLi9lbmNvZGUvQmFzZTY0RW5jb2RlLm1qcyc7XG5pbXBvcnQgeyBnZXRSYW5kb21WYWx1ZXMsIHNoYTI1NkRpZ2VzdCB9IGZyb20gJy4vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgcGtjZU5vdENyZWF0ZWQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8vIENvbnN0YW50IGJ5dGUgYXJyYXkgbGVuZ3RoXHJcbmNvbnN0IFJBTkRPTV9CWVRFX0FSUl9MRU5HVEggPSAzMjtcclxuLyoqXHJcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIEFQSXMgdG8gZ2VuZXJhdGUgUEtDRSBjb2RlcyBhbmQgY29kZSB2ZXJpZmllcnMuXHJcbiAqL1xyXG4vKipcclxuICogR2VuZXJhdGVzIFBLQ0UgQ29kZXMuIFNlZSB0aGUgUkZDIGZvciBtb3JlIGluZm9ybWF0aW9uOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzYzNlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQa2NlQ29kZXMocGVyZm9ybWFuY2VDbGllbnQsIGxvZ2dlciwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5HZW5lcmF0ZVBrY2VDb2RlcywgY29ycmVsYXRpb25JZCk7XHJcbiAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBpbnZva2UoZ2VuZXJhdGVDb2RlVmVyaWZpZXIsIFBlcmZvcm1hbmNlRXZlbnRzLkdlbmVyYXRlQ29kZVZlcmlmaWVyLCBsb2dnZXIsIHBlcmZvcm1hbmNlQ2xpZW50LCBjb3JyZWxhdGlvbklkKShwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgIGNvbnN0IGNvZGVDaGFsbGVuZ2UgPSBhd2FpdCBpbnZva2VBc3luYyhnZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXIsIFBlcmZvcm1hbmNlRXZlbnRzLkdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciwgbG9nZ2VyLCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkoY29kZVZlcmlmaWVyLCBwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcclxuICAgICAgICBjaGFsbGVuZ2U6IGNvZGVDaGFsbGVuZ2UsXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gMzIgYnl0ZSBidWZmZXIgYW5kIHJldHVybnMgdGhlIGJhc2U2NFxyXG4gKiBlbmNvZGVkIHN0cmluZyB0byBiZSB1c2VkIGFzIGEgUEtDRSBDb2RlIFZlcmlmaWVyXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGVWZXJpZmllcihwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIEdlbmVyYXRlIHJhbmRvbSB2YWx1ZXMgYXMgdXRmLThcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShSQU5ET01fQllURV9BUlJfTEVOR1RIKTtcclxuICAgICAgICBpbnZva2UoZ2V0UmFuZG9tVmFsdWVzLCBQZXJmb3JtYW5jZUV2ZW50cy5HZXRSYW5kb21WYWx1ZXMsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKGJ1ZmZlcik7XHJcbiAgICAgICAgLy8gZW5jb2RlIHZlcmlmaWVyIGFzIGJhc2U2NFxyXG4gICAgICAgIGNvbnN0IHBrY2VDb2RlVmVyaWZpZXJCNjQgPSB1cmxFbmNvZGVBcnIoYnVmZmVyKTtcclxuICAgICAgICByZXR1cm4gcGtjZUNvZGVWZXJpZmllckI2NDtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihwa2NlTm90Q3JlYXRlZCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBiYXNlNjQgZW5jb2RlZCBQS0NFIENvZGUgQ2hhbGxlbmdlIHN0cmluZyBmcm9tIHRoZVxyXG4gKiBoYXNoIGNyZWF0ZWQgZnJvbSB0aGUgUEtDRSBDb2RlIFZlcmlmaWVyIHN1cHBsaWVkXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXIocGtjZUNvZGVWZXJpZmllciwgcGVyZm9ybWFuY2VDbGllbnQsIGxvZ2dlciwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5HZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBoYXNoZWQgdmVyaWZpZXJcclxuICAgICAgICBjb25zdCBwa2NlSGFzaGVkQ29kZVZlcmlmaWVyID0gYXdhaXQgaW52b2tlQXN5bmMoc2hhMjU2RGlnZXN0LCBQZXJmb3JtYW5jZUV2ZW50cy5TaGEyNTZEaWdlc3QsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKHBrY2VDb2RlVmVyaWZpZXIsIHBlcmZvcm1hbmNlQ2xpZW50LCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBlbmNvZGUgaGFzaCBhcyBiYXNlNjRcclxuICAgICAgICByZXR1cm4gdXJsRW5jb2RlQXJyKG5ldyBVaW50OEFycmF5KHBrY2VIYXNoZWRDb2RlVmVyaWZpZXIpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihwa2NlTm90Q3JlYXRlZCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgZ2VuZXJhdGVQa2NlQ29kZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBrY2VHZW5lcmF0b3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50cywgaW52b2tlQXN5bmMsIEF1dGhlbnRpY2F0aW9uU2NoZW1lLCBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IsIENsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLCBTdHJpbmdVdGlscyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGhhc2hTdHJpbmcgfSBmcm9tICcuLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEluaXRpYWxpemVyIGZ1bmN0aW9uIGZvciBhbGwgcmVxdWVzdCBBUElzXHJcbiAqIEBwYXJhbSByZXF1ZXN0XHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQmFzZVJlcXVlc3QocmVxdWVzdCwgY29uZmlnLCBwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyKSB7XHJcbiAgICBwZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVCYXNlUmVxdWVzdCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgIGNvbnN0IGF1dGhvcml0eSA9IHJlcXVlc3QuYXV0aG9yaXR5IHx8IGNvbmZpZy5hdXRoLmF1dGhvcml0eTtcclxuICAgIGNvbnN0IHNjb3BlcyA9IFsuLi4oKHJlcXVlc3QgJiYgcmVxdWVzdC5zY29wZXMpIHx8IFtdKV07XHJcbiAgICBjb25zdCB2YWxpZGF0ZWRSZXF1ZXN0ID0ge1xyXG4gICAgICAgIC4uLnJlcXVlc3QsXHJcbiAgICAgICAgY29ycmVsYXRpb25JZDogcmVxdWVzdC5jb3JyZWxhdGlvbklkLFxyXG4gICAgICAgIGF1dGhvcml0eSxcclxuICAgICAgICBzY29wZXMsXHJcbiAgICB9O1xyXG4gICAgLy8gU2V0IGF1dGhlbnRpY2F0aW9uU2NoZW1lIHRvIEJFQVJFUiBpZiBub3QgZXhwbGljaXRseSBzZXQgaW4gdGhlIHJlcXVlc3RcclxuICAgIGlmICghdmFsaWRhdGVkUmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSkge1xyXG4gICAgICAgIHZhbGlkYXRlZFJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgPSBBdXRoZW50aWNhdGlvblNjaGVtZS5CRUFSRVI7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoJ0F1dGhlbnRpY2F0aW9uIFNjaGVtZSB3YXNuXFwndCBleHBsaWNpdGx5IHNldCBpbiByZXF1ZXN0LCBkZWZhdWx0aW5nIHRvIFwiQmVhcmVyXCIgcmVxdWVzdCcpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRlZFJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgPT09IEF1dGhlbnRpY2F0aW9uU2NoZW1lLlNTSCkge1xyXG4gICAgICAgICAgICBpZiAoIXJlcXVlc3Quc3NoSndrKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMubWlzc2luZ1NzaEp3ayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnNzaEtpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKENsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1pc3NpbmdTc2hLaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBBdXRoZW50aWNhdGlvbiBTY2hlbWUgc2V0IHRvIFwiJHt2YWxpZGF0ZWRSZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lfVwiIGFzIGNvbmZpZ3VyZWQgaW4gQXV0aCByZXF1ZXN0YCk7XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgcmVxdWVzdGVkIGNsYWltcyBoYXNoIGlmIGNsYWltcy1iYXNlZCBjYWNoaW5nIGlzIGVuYWJsZWQgYW5kIGNsYWltcyB3ZXJlIHJlcXVlc3RlZFxyXG4gICAgaWYgKGNvbmZpZy5jYWNoZS5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkICYmXHJcbiAgICAgICAgcmVxdWVzdC5jbGFpbXMgJiZcclxuICAgICAgICAvLyBDaGVja3MgZm9yIGVtcHR5IHN0cmluZ2lmaWVkIG9iamVjdCBcInt9XCIgd2hpY2ggZG9lc24ndCBxdWFsaWZ5IGFzIHJlcXVlc3RlZCBjbGFpbXNcclxuICAgICAgICAhU3RyaW5nVXRpbHMuaXNFbXB0eU9iaihyZXF1ZXN0LmNsYWltcykpIHtcclxuICAgICAgICB2YWxpZGF0ZWRSZXF1ZXN0LnJlcXVlc3RlZENsYWltc0hhc2ggPSBhd2FpdCBoYXNoU3RyaW5nKHJlcXVlc3QuY2xhaW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0ZWRSZXF1ZXN0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVTaWxlbnRSZXF1ZXN0KHJlcXVlc3QsIGFjY291bnQsIGNvbmZpZywgcGVyZm9ybWFuY2VDbGllbnQsIGxvZ2dlcikge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5Jbml0aWFsaXplU2lsZW50UmVxdWVzdCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgIGNvbnN0IGJhc2VSZXF1ZXN0ID0gYXdhaXQgaW52b2tlQXN5bmMoaW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LCBQZXJmb3JtYW5jZUV2ZW50cy5Jbml0aWFsaXplQmFzZVJlcXVlc3QsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCwgY29uZmlnLCBwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAuLi5iYXNlUmVxdWVzdCxcclxuICAgICAgICBhY2NvdW50OiBhY2NvdW50LFxyXG4gICAgICAgIGZvcmNlUmVmcmVzaDogcmVxdWVzdC5mb3JjZVJlZnJlc2ggfHwgZmFsc2UsXHJcbiAgICB9O1xyXG59XG5cbmV4cG9ydCB7IGluaXRpYWxpemVCYXNlUmVxdWVzdCwgaW5pdGlhbGl6ZVNpbGVudFJlcXVlc3QgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcXVlc3RIZWxwZXJzLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZUFzeW5jLCBDb25zdGFudHMsIFVybFN0cmluZywgQXV0aG9yaXphdGlvbkNvZGVDbGllbnQsIFByb3RvY29sVXRpbHMgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBCYXNlSW50ZXJhY3Rpb25DbGllbnQgfSBmcm9tICcuL0Jhc2VJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgQnJvd3NlckNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlTWV0YWRhdGEubWpzJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmkgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyVXRpbHMubWpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGtjZUNvZGVzIH0gZnJvbSAnLi4vY3J5cHRvL1BrY2VHZW5lcmF0b3IubWpzJztcbmltcG9ydCB7IGNyZWF0ZU5ld0d1aWQgfSBmcm9tICcuLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUJhc2VSZXF1ZXN0IH0gZnJvbSAnLi4vcmVxdWVzdC9SZXF1ZXN0SGVscGVycy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIGNsYXNzIHN0cnVjdHVyZSBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBcInN0YW5kYXJkXCIsIG5vbi1icm9rZXJlZCBhdXRoIGZsb3dzIChwb3B1cCwgcmVkaXJlY3QsIHNpbGVudCAoUlQpLCBzaWxlbnQgKGlmcmFtZSkpXHJcbiAqL1xyXG5jbGFzcyBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50IGV4dGVuZHMgQmFzZUludGVyYWN0aW9uQ2xpZW50IHtcclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuIGF1dGggY29kZSByZXF1ZXN0IHRpZWQgdG8gdGhlIHVybCByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25Db2RlUmVxdWVzdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0LCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZFBrY2VQYXJhbXMgPSBhd2FpdCBpbnZva2VBc3luYyhnZW5lcmF0ZVBrY2VDb2RlcywgUGVyZm9ybWFuY2VFdmVudHMuR2VuZXJhdGVQa2NlQ29kZXMsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMubG9nZ2VyLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGF1dGhDb2RlUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmk6IHJlcXVlc3QucmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgIGNvZGU6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIGNvZGVWZXJpZmllcjogZ2VuZXJhdGVkUGtjZVBhcmFtcy52ZXJpZmllcixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlcXVlc3QuY29kZUNoYWxsZW5nZSA9IGdlbmVyYXRlZFBrY2VQYXJhbXMuY2hhbGxlbmdlO1xyXG4gICAgICAgIHJlcXVlc3QuY29kZUNoYWxsZW5nZU1ldGhvZCA9IENvbnN0YW50cy5TMjU2X0NPREVfQ0hBTExFTkdFX01FVEhPRDtcclxuICAgICAgICByZXR1cm4gYXV0aENvZGVSZXF1ZXN0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGxvZ291dCByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIGxvZ291dFJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJpbml0aWFsaXplTG9nb3V0UmVxdWVzdCBjYWxsZWRcIiwgbG9nb3V0UmVxdWVzdD8uY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgdmFsaWRMb2dvdXRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmNvcnJlbGF0aW9uSWQgfHwgY3JlYXRlTmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAuLi5sb2dvdXRSZXF1ZXN0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IGxvZ291dF9oaW50IHRvIGJlIGxvZ2luX2hpbnQgZnJvbSBJRCBUb2tlbiBDbGFpbXMgaWYgcHJlc2VudFxyXG4gICAgICAgICAqIGFuZCBsb2dvdXRIaW50IGF0dHJpYnV0ZSB3YXNuJ3QgbWFudWFsbHkgc2V0IGluIGxvZ291dCByZXF1ZXN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgLy8gSWYgbG9nb3V0SGludCBpc24ndCBzZXQgYW5kIGFuIGFjY291bnQgd2FzIHBhc3NlZCBpbiwgdHJ5IHRvIGV4dHJhY3QgbG9nb3V0SGludCBmcm9tIElEIFRva2VuIENsYWltc1xyXG4gICAgICAgICAgICBpZiAoIWxvZ291dFJlcXVlc3QubG9nb3V0SGludCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ291dFJlcXVlc3QuYWNjb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvZ291dEhpbnQgPSB0aGlzLmdldExvZ291dEhpbnRGcm9tSWRUb2tlbkNsYWltcyhsb2dvdXRSZXF1ZXN0LmFjY291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2dvdXRIaW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJTZXR0aW5nIGxvZ291dEhpbnQgdG8gbG9naW5faGludCBJRCBUb2tlbiBDbGFpbSB2YWx1ZSBmb3IgdGhlIGFjY291bnQgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkTG9nb3V0UmVxdWVzdC5sb2dvdXRIaW50ID0gbG9nb3V0SGludDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwibG9nb3V0SGludCB3YXMgbm90IHNldCBhbmQgYWNjb3VudCB3YXMgbm90IHBhc3NlZCBpbnRvIGxvZ291dCByZXF1ZXN0LCBsb2dvdXRIaW50IHdpbGwgbm90IGJlIHNldFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJsb2dvdXRIaW50IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIGxvZ291dFJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJsb2dvdXRIaW50IHdpbGwgbm90IGJlIHNldCBzaW5jZSBubyBsb2dvdXQgcmVxdWVzdCB3YXMgY29uZmlndXJlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBPbmx5IHNldCByZWRpcmVjdCB1cmkgaWYgbG9nb3V0IHJlcXVlc3QgaXNuJ3QgcHJvdmlkZWQgb3IgdGhlIHNldCB1cmkgaXNuJ3QgbnVsbC5cclxuICAgICAgICAgKiBPdGhlcndpc2UsIHVzZSBwYXNzZWQgdXJpLCBjb25maWcsIG9yIGN1cnJlbnQgcGFnZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIWxvZ291dFJlcXVlc3QgfHwgbG9nb3V0UmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGxvZ291dFJlcXVlc3QgJiYgbG9nb3V0UmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJTZXR0aW5nIHBvc3RMb2dvdXRSZWRpcmVjdFVyaSB0byB1cmkgc2V0IG9uIGxvZ291dCByZXF1ZXN0XCIsIHZhbGlkTG9nb3V0UmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIHZhbGlkTG9nb3V0UmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkgPVxyXG4gICAgICAgICAgICAgICAgICAgIFVybFN0cmluZy5nZXRBYnNvbHV0ZVVybChsb2dvdXRSZXF1ZXN0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaSwgZ2V0Q3VycmVudFVyaSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNvbmZpZy5hdXRoLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcInBvc3RMb2dvdXRSZWRpcmVjdFVyaSBjb25maWd1cmVkIGFzIG51bGwgYW5kIG5vIHVyaSBzZXQgb24gcmVxdWVzdCwgbm90IHBhc3NpbmcgcG9zdCBsb2dvdXQgcmVkaXJlY3RcIiwgdmFsaWRMb2dvdXRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY29uZmlnLmF1dGgucG9zdExvZ291dFJlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiU2V0dGluZyBwb3N0TG9nb3V0UmVkaXJlY3RVcmkgdG8gY29uZmlndXJlZCB1cmlcIiwgdmFsaWRMb2dvdXRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgdmFsaWRMb2dvdXRSZXF1ZXN0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaSA9XHJcbiAgICAgICAgICAgICAgICAgICAgVXJsU3RyaW5nLmdldEFic29sdXRlVXJsKHRoaXMuY29uZmlnLmF1dGgucG9zdExvZ291dFJlZGlyZWN0VXJpLCBnZXRDdXJyZW50VXJpKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNldHRpbmcgcG9zdExvZ291dFJlZGlyZWN0VXJpIHRvIGN1cnJlbnQgcGFnZVwiLCB2YWxpZExvZ291dFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICB2YWxpZExvZ291dFJlcXVlc3QucG9zdExvZ291dFJlZGlyZWN0VXJpID1cclxuICAgICAgICAgICAgICAgICAgICBVcmxTdHJpbmcuZ2V0QWJzb2x1dGVVcmwoZ2V0Q3VycmVudFVyaSgpLCBnZXRDdXJyZW50VXJpKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwicG9zdExvZ291dFJlZGlyZWN0VXJpIHBhc3NlZCBhcyBudWxsLCBub3Qgc2V0dGluZyBwb3N0IGxvZ291dCByZWRpcmVjdCB1cmlcIiwgdmFsaWRMb2dvdXRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsaWRMb2dvdXRSZXF1ZXN0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgbG9naW5faGludCBJRCBUb2tlbiBDbGFpbSBvdXQgb2YgQWNjb3VudEluZm8gb2JqZWN0IHRvIGJlIHVzZWQgYXNcclxuICAgICAqIGxvZ291dF9oaW50IGluIGVuZCBzZXNzaW9uIHJlcXVlc3QuXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBnZXRMb2dvdXRIaW50RnJvbUlkVG9rZW5DbGFpbXMoYWNjb3VudCkge1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5DbGFpbXMgPSBhY2NvdW50LmlkVG9rZW5DbGFpbXM7XHJcbiAgICAgICAgaWYgKGlkVG9rZW5DbGFpbXMpIHtcclxuICAgICAgICAgICAgaWYgKGlkVG9rZW5DbGFpbXMubG9naW5faGludCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkVG9rZW5DbGFpbXMubG9naW5faGludDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUaGUgSUQgVG9rZW4gQ2xhaW1zIHRpZWQgdG8gdGhlIHByb3ZpZGVkIGFjY291bnQgZG8gbm90IGNvbnRhaW4gYSBsb2dpbl9oaW50IGNsYWltLCBsb2dvdXRIaW50IHdpbGwgbm90IGJlIGFkZGVkIHRvIGxvZ291dCByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiVGhlIHByb3ZpZGVkIGFjY291bnQgZG9lcyBub3QgY29udGFpbiBJRCBUb2tlbiBDbGFpbXMsIGxvZ291dEhpbnQgd2lsbCBub3QgYmUgYWRkZWQgdG8gbG9nb3V0IHJlcXVlc3RcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIEF1dGhvcml6YXRpb24gQ29kZSBDbGllbnQgd2l0aCB0aGUgZ2l2ZW4gYXV0aG9yaXR5LCBvciB0aGUgZGVmYXVsdCBhdXRob3JpdHkuXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHtcclxuICAgICAqICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcjogU2VydmVyVGVsZW1ldHJ5TWFuYWdlcjtcclxuICAgICAqICAgICAgICAgYXV0aG9yaXR5VXJsPzogc3RyaW5nO1xyXG4gICAgICogICAgICAgICByZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM/OiBBenVyZUNsb3VkT3B0aW9ucztcclxuICAgICAqICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzPzogU3RyaW5nRGljdDtcclxuICAgICAqICAgICAgICAgYWNjb3VudD86IEFjY291bnRJbmZvO1xyXG4gICAgICogICAgICAgIH1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlQXV0aENvZGVDbGllbnQocGFyYW1zKSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBDcmVhdGUgYXV0aCBtb2R1bGUuXHJcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5nZXRDbGllbnRDb25maWd1cmF0aW9uLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShwYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkNvZGVDbGllbnQoY2xpZW50Q29uZmlnLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIENsaWVudCBDb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiByZXF1ZXN0IGF1dGhvcml0eSwgb3IgdGhlIGRlZmF1bHQgYXV0aG9yaXR5LlxyXG4gICAgICogQHBhcmFtIHBhcmFtcyB7XHJcbiAgICAgKiAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6IFNlcnZlclRlbGVtZXRyeU1hbmFnZXI7XHJcbiAgICAgKiAgICAgICAgIHJlcXVlc3RBdXRob3JpdHk/OiBzdHJpbmc7XHJcbiAgICAgKiAgICAgICAgIHJlcXVlc3RBenVyZUNsb3VkT3B0aW9ucz86IEF6dXJlQ2xvdWRPcHRpb25zO1xyXG4gICAgICogICAgICAgICByZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM/OiBib29sZWFuO1xyXG4gICAgICogICAgICAgICBhY2NvdW50PzogQWNjb3VudEluZm87XHJcbiAgICAgKiAgICAgICAgfVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRDbGllbnRDb25maWd1cmF0aW9uKHBhcmFtcykge1xyXG4gICAgICAgIGNvbnN0IHsgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciwgcmVxdWVzdEF1dGhvcml0eSwgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zLCByZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMsIGFjY291bnQsIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGRpc2NvdmVyZWRBdXRob3JpdHkgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldERpc2NvdmVyZWRBdXRob3JpdHksIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKHtcclxuICAgICAgICAgICAgcmVxdWVzdEF1dGhvcml0eSxcclxuICAgICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zLFxyXG4gICAgICAgICAgICByZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIGFjY291bnQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gdGhpcy5jb25maWcuc3lzdGVtLmxvZ2dlck9wdGlvbnM7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYXV0aE9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgYXV0aG9yaXR5OiBkaXNjb3ZlcmVkQXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgY2xpZW50Q2FwYWJpbGl0aWVzOiB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudENhcGFiaWxpdGllcyxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLmNvbmZpZy5hdXRoLnJlZGlyZWN0VXJpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzeXN0ZW1PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICB0b2tlblJlbmV3YWxPZmZzZXRTZWNvbmRzOiB0aGlzLmNvbmZpZy5zeXN0ZW0udG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kcyxcclxuICAgICAgICAgICAgICAgIHByZXZlbnRDb3JzUHJlZmxpZ2h0OiB0cnVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsb2dnZXJPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXJDYWxsYmFjazogbG9nZ2VyLmxvZ2dlckNhbGxiYWNrLFxyXG4gICAgICAgICAgICAgICAgcGlpTG9nZ2luZ0VuYWJsZWQ6IGxvZ2dlci5waWlMb2dnaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBsb2dnZXIubG9nTGV2ZWwsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhY2hlT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDogdGhpcy5jb25maWcuY2FjaGUuY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY3J5cHRvSW50ZXJmYWNlOiB0aGlzLmJyb3dzZXJDcnlwdG8sXHJcbiAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2U6IHRoaXMubmV0d29ya0NsaWVudCxcclxuICAgICAgICAgICAgc3RvcmFnZUludGVyZmFjZTogdGhpcy5icm93c2VyU3RvcmFnZSxcclxuICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcjogc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixcclxuICAgICAgICAgICAgbGlicmFyeUluZm86IHtcclxuICAgICAgICAgICAgICAgIHNrdTogQnJvd3NlckNvbnN0YW50cy5NU0FMX1NLVSxcclxuICAgICAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICBjcHU6IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgICAgICBvczogQ29uc3RhbnRzLkVNUFRZX1NUUklORyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGVsZW1ldHJ5OiB0aGlzLmNvbmZpZy50ZWxlbWV0cnksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHRvIGluaXRpYWxpemUgcmVxdWlyZWQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciBpbnRlcmFjdGl2ZSBBUElzIGFuZCBzc29TaWxlbnQoKVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBpbnRlcmFjdGlvblR5cGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0KHJlcXVlc3QsIGludGVyYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5nZXRSZWRpcmVjdFVyaShyZXF1ZXN0LnJlZGlyZWN0VXJpKTtcclxuICAgICAgICBjb25zdCBicm93c2VyU3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGludGVyYWN0aW9uVHlwZTogaW50ZXJhY3Rpb25UeXBlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBQcm90b2NvbFV0aWxzLnNldFJlcXVlc3RTdGF0ZSh0aGlzLmJyb3dzZXJDcnlwdG8sIChyZXF1ZXN0ICYmIHJlcXVlc3Quc3RhdGUpIHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsIGJyb3dzZXJTdGF0ZSk7XHJcbiAgICAgICAgY29uc3QgYmFzZVJlcXVlc3QgPSBhd2FpdCBpbnZva2VBc3luYyhpbml0aWFsaXplQmFzZVJlcXVlc3QsIFBlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVCYXNlUmVxdWVzdCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkoeyAuLi5yZXF1ZXN0LCBjb3JyZWxhdGlvbklkOiB0aGlzLmNvcnJlbGF0aW9uSWQgfSwgdGhpcy5jb25maWcsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAuLi5iYXNlUmVxdWVzdCxcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXHJcbiAgICAgICAgICAgIG5vbmNlOiByZXF1ZXN0Lm5vbmNlIHx8IGNyZWF0ZU5ld0d1aWQoKSxcclxuICAgICAgICAgICAgcmVzcG9uc2VNb2RlOiB0aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAuc2VydmVyUmVzcG9uc2VUeXBlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gU2tpcCBhY3RpdmUgYWNjb3VudCBsb29rdXAgaWYgZWl0aGVyIGxvZ2luIGhpbnQgb3Igc2Vzc2lvbiBpZCBpcyBzZXRcclxuICAgICAgICBpZiAocmVxdWVzdC5sb2dpbkhpbnQgfHwgcmVxdWVzdC5zaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFJlcXVlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFjY291bnQgPSByZXF1ZXN0LmFjY291bnQgfHwgdGhpcy5icm93c2VyU3RvcmFnZS5nZXRBY3RpdmVBY2NvdW50KCk7XHJcbiAgICAgICAgaWYgKGFjY291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNldHRpbmcgdmFsaWRhdGVkIHJlcXVlc3QgYWNjb3VudFwiLCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBTZXR0aW5nIHZhbGlkYXRlZCByZXF1ZXN0IGFjY291bnQ6ICR7YWNjb3VudC5ob21lQWNjb3VudElkfWAsIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3QuYWNjb3VudCA9IGFjY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIGZvciBBREFML01TQUwgdjEgU1NPXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0ZWRSZXF1ZXN0LmxvZ2luSGludCAmJiAhYWNjb3VudCkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWdhY3lMb2dpbkhpbnQgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldExlZ2FjeUxvZ2luSGludCgpO1xyXG4gICAgICAgICAgICBpZiAobGVnYWN5TG9naW5IaW50KSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZWRSZXF1ZXN0LmxvZ2luSGludCA9IGxlZ2FjeUxvZ2luSGludDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkUmVxdWVzdDtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGNvbnRlbnRFcnJvciA9IFwiQ29udGVudEVycm9yXCI7XHJcbmNvbnN0IHVzZXJTd2l0Y2ggPSBcInVzZXJfc3dpdGNoXCI7XG5cbmV4cG9ydCB7IGNvbnRlbnRFcnJvciwgdXNlclN3aXRjaCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlQXV0aEVycm9yQ29kZXMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLy8gU3RhdHVzIENvZGVzIHRoYXQgY2FuIGJlIHRocm93biBieSBXQU1cclxuY29uc3QgVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCA9IFwiVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRFwiO1xyXG5jb25zdCBVU0VSX0NBTkNFTCA9IFwiVVNFUl9DQU5DRUxcIjtcclxuY29uc3QgTk9fTkVUV09SSyA9IFwiTk9fTkVUV09SS1wiO1xyXG5jb25zdCBQRVJTSVNURU5UX0VSUk9SID0gXCJQRVJTSVNURU5UX0VSUk9SXCI7XHJcbmNvbnN0IERJU0FCTEVEID0gXCJESVNBQkxFRFwiO1xyXG5jb25zdCBBQ0NPVU5UX1VOQVZBSUxBQkxFID0gXCJBQ0NPVU5UX1VOQVZBSUxBQkxFXCI7XG5cbmV4cG9ydCB7IEFDQ09VTlRfVU5BVkFJTEFCTEUsIERJU0FCTEVELCBOT19ORVRXT1JLLCBQRVJTSVNURU5UX0VSUk9SLCBVU0VSX0NBTkNFTCwgVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlU3RhdHVzQ29kZXMubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IsIGNyZWF0ZUludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2RlcyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGNvbnRlbnRFcnJvciwgdXNlclN3aXRjaCB9IGZyb20gJy4vTmF0aXZlQXV0aEVycm9yQ29kZXMubWpzJztcbmltcG9ydCB7IFBFUlNJU1RFTlRfRVJST1IsIERJU0FCTEVELCBOT19ORVRXT1JLLCBVU0VSX0NBTkNFTCwgVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCwgQUNDT1VOVF9VTkFWQUlMQUJMRSB9IGZyb20gJy4uL2Jyb2tlci9uYXRpdmVCcm9rZXIvTmF0aXZlU3RhdHVzQ29kZXMubWpzJztcbmltcG9ydCB7IG5vTmV0d29ya0Nvbm5lY3Rpdml0eSwgdXNlckNhbmNlbGxlZCB9IGZyb20gJy4vQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBJTlZBTElEX01FVEhPRF9FUlJPUiA9IC0yMTQ3MTg2OTQzO1xyXG5jb25zdCBOYXRpdmVBdXRoRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIFt1c2VyU3dpdGNoXTogXCJVc2VyIGF0dGVtcHRlZCB0byBzd2l0Y2ggYWNjb3VudHMgaW4gdGhlIG5hdGl2ZSBicm9rZXIsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBBbGwgbmV3IGFjY291bnRzIG11c3Qgc2lnbi1pbiB0aHJvdWdoIHRoZSBzdGFuZGFyZCB3ZWIgZmxvdyBmaXJzdCwgcGxlYXNlIHRyeSBhZ2Fpbi5cIixcclxufTtcclxuY2xhc3MgTmF0aXZlQXV0aEVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGVycm9yQ29kZSwgZGVzY3JpcHRpb24sIGV4dCkge1xyXG4gICAgICAgIHN1cGVyKGVycm9yQ29kZSwgZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBOYXRpdmVBdXRoRXJyb3IucHJvdG90eXBlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk5hdGl2ZUF1dGhFcnJvclwiO1xyXG4gICAgICAgIHRoaXMuZXh0ID0gZXh0O1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBUaGVzZSBlcnJvcnMgc2hvdWxkIHJlc3VsdCBpbiBhIGZhbGxiYWNrIHRvIHRoZSAnc3RhbmRhcmQnIGJyb3dzZXIgYmFzZWQgYXV0aCBmbG93LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNGYXRhbE5hdGl2ZUF1dGhFcnJvcihlcnJvcikge1xyXG4gICAgaWYgKGVycm9yLmV4dCAmJlxyXG4gICAgICAgIGVycm9yLmV4dC5zdGF0dXMgJiZcclxuICAgICAgICAoZXJyb3IuZXh0LnN0YXR1cyA9PT0gUEVSU0lTVEVOVF9FUlJPUiB8fFxyXG4gICAgICAgICAgICBlcnJvci5leHQuc3RhdHVzID09PSBESVNBQkxFRCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChlcnJvci5leHQgJiZcclxuICAgICAgICBlcnJvci5leHQuZXJyb3IgJiZcclxuICAgICAgICBlcnJvci5leHQuZXJyb3IgPT09IElOVkFMSURfTUVUSE9EX0VSUk9SKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGVycm9yLmVycm9yQ29kZSkge1xyXG4gICAgICAgIGNhc2UgY29udGVudEVycm9yOlxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igb2JqZWN0IGJhc2VkIG9uIHRoZSBXQU0gc3RhdHVzIGNvZGUuXHJcbiAqIEBwYXJhbSBjb2RlXHJcbiAqIEBwYXJhbSBkZXNjcmlwdGlvblxyXG4gKiBAcGFyYW0gZXh0XHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVOYXRpdmVBdXRoRXJyb3IoY29kZSwgZGVzY3JpcHRpb24sIGV4dCkge1xyXG4gICAgaWYgKGV4dCAmJiBleHQuc3RhdHVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChleHQuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgQUNDT1VOVF9VTkFWQUlMQUJMRTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2Rlcy5uYXRpdmVBY2NvdW50VW5hdmFpbGFibGUpO1xyXG4gICAgICAgICAgICBjYXNlIFVTRVJfSU5URVJBQ1RJT05fUkVRVUlSRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IoY29kZSwgZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICBjYXNlIFVTRVJfQ0FOQ0VMOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IodXNlckNhbmNlbGxlZCk7XHJcbiAgICAgICAgICAgIGNhc2UgTk9fTkVUV09SSzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCcm93c2VyQXV0aEVycm9yKG5vTmV0d29ya0Nvbm5lY3Rpdml0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBOYXRpdmVBdXRoRXJyb3IoY29kZSwgTmF0aXZlQXV0aEVycm9yTWVzc2FnZXNbY29kZV0gfHwgZGVzY3JpcHRpb24sIGV4dCk7XHJcbn1cblxuZXhwb3J0IHsgTmF0aXZlQXV0aEVycm9yLCBOYXRpdmVBdXRoRXJyb3JNZXNzYWdlcywgY3JlYXRlTmF0aXZlQXV0aEVycm9yLCBpc0ZhdGFsTmF0aXZlQXV0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVBdXRoRXJyb3IubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTQuMTYuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBpc09pZGNQcm90b2NvbE1vZGUgfSBmcm9tICcuLi9jb25maWcvQ2xpZW50Q29uZmlndXJhdGlvbi5tanMnO1xuaW1wb3J0IHsgQmFzZUNsaWVudCB9IGZyb20gJy4vQmFzZUNsaWVudC5tanMnO1xuaW1wb3J0IHsgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RQYXJhbWV0ZXJCdWlsZGVyLm1qcyc7XG5pbXBvcnQgeyBHcmFudFR5cGUsIEF1dGhlbnRpY2F0aW9uU2NoZW1lLCBIZWFkZXJOYW1lcywgRXJyb3JzIH0gZnJvbSAnLi4vdXRpbHMvQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBDTElFTlRfSUQgfSBmcm9tICcuLi9jb25zdGFudHMvQUFEU2VydmVyUGFyYW1LZXlzLm1qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUhhbmRsZXIgfSBmcm9tICcuLi9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IFBvcFRva2VuR2VuZXJhdG9yIH0gZnJvbSAnLi4vY3J5cHRvL1BvcFRva2VuR2VuZXJhdG9yLm1qcyc7XG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJy4uL3V0aWxzL1N0cmluZ1V0aWxzLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvci9DbGllbnRDb25maWd1cmF0aW9uRXJyb3IubWpzJztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudEF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi9lcnJvci9TZXJ2ZXJFcnJvci5tanMnO1xuaW1wb3J0IHsgbm93U2Vjb25kcywgaXNUb2tlbkV4cGlyZWQgfSBmcm9tICcuLi91dGlscy9UaW1lVXRpbHMubWpzJztcbmltcG9ydCB7IFVybFN0cmluZyB9IGZyb20gJy4uL3VybC9VcmxTdHJpbmcubWpzJztcbmltcG9ydCB7IENjc0NyZWRlbnRpYWxUeXBlIH0gZnJvbSAnLi4vYWNjb3VudC9DY3NDcmVkZW50aWFsLm1qcyc7XG5pbXBvcnQgeyBidWlsZENsaWVudEluZm9Gcm9tSG9tZUFjY291bnRJZCB9IGZyb20gJy4uL2FjY291bnQvQ2xpZW50SW5mby5tanMnO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciwgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0ludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlRXZlbnQubWpzJztcbmltcG9ydCB7IGludm9rZUFzeW5jLCBpbnZva2UgfSBmcm9tICcuLi91dGlscy9GdW5jdGlvbldyYXBwZXJzLm1qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUNyZWRlbnRpYWxLZXkgfSBmcm9tICcuLi9jYWNoZS91dGlscy9DYWNoZUhlbHBlcnMubWpzJztcbmltcG9ydCB7IGdldENsaWVudEFzc2VydGlvbiB9IGZyb20gJy4uL3V0aWxzL0NsaWVudEFzc2VydGlvblV0aWxzLm1qcyc7XG5pbXBvcnQgeyB0b2tlblJlcXVlc3RFbXB0eSwgbWlzc2luZ1NzaEp3ayB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcyc7XG5pbXBvcnQgeyBub0FjY291bnRJblNpbGVudFJlcXVlc3QgfSBmcm9tICcuLi9lcnJvci9DbGllbnRBdXRoRXJyb3JDb2Rlcy5tanMnO1xuaW1wb3J0IHsgbm9Ub2tlbnNGb3VuZCwgcmVmcmVzaFRva2VuRXhwaXJlZCwgYmFkVG9rZW4gfSBmcm9tICcuLi9lcnJvci9JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UT0tFTl9FWFBJUkFUSU9OX09GRlNFVF9TRUNPTkRTID0gMzAwOyAvLyA1IE1pbnV0ZXNcclxuLyoqXHJcbiAqIE9BdXRoMi4wIHJlZnJlc2ggdG9rZW4gY2xpZW50XHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY2xhc3MgUmVmcmVzaFRva2VuQ2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uLCBwZXJmb3JtYW5jZUNsaWVudCkge1xyXG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24sIHBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgIH1cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW4sIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgcmVxVGltZXN0YW1wID0gbm93U2Vjb25kcygpO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5leGVjdXRlVG9rZW5SZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHJlcXVlc3QsIHRoaXMuYXV0aG9yaXR5KTtcclxuICAgICAgICAvLyBSZXRyaWV2ZSByZXF1ZXN0SWQgZnJvbSByZXNwb25zZSBoZWFkZXJzXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gcmVzcG9uc2UuaGVhZGVycz8uW0hlYWRlck5hbWVzLlhfTVNfUkVRVUVTVF9JRF07XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gbmV3IFJlc3BvbnNlSGFuZGxlcih0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCwgdGhpcy5jYWNoZU1hbmFnZXIsIHRoaXMuY3J5cHRvVXRpbHMsIHRoaXMubG9nZ2VyLCB0aGlzLmNvbmZpZy5zZXJpYWxpemFibGVDYWNoZSwgdGhpcy5jb25maWcucGVyc2lzdGVuY2VQbHVnaW4pO1xyXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlci52YWxpZGF0ZVRva2VuUmVzcG9uc2UocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHJlc3BvbnNlSGFuZGxlci5oYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlLmJpbmQocmVzcG9uc2VIYW5kbGVyKSwgUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZSwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVzcG9uc2UuYm9keSwgdGhpcy5hdXRob3JpdHksIHJlcVRpbWVzdGFtcCwgcmVxdWVzdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIHJlcXVlc3QuZm9yY2VDYWNoZSwgcmVxdWVzdElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBjYWNoZWQgcmVmcmVzaCB0b2tlbiBhbmQgYXR0YWNoZXMgdG8gcmVxdWVzdCwgdGhlbiBjYWxscyBhY3F1aXJlVG9rZW4gQVBJXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgLy8gQ2Fubm90IHJlbmV3IHRva2VuIGlmIG5vIHJlcXVlc3Qgb2JqZWN0IGlzIGdpdmVuLlxyXG4gICAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IodG9rZW5SZXF1ZXN0RW1wdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIC8vIFdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBzaWxlbnQgZmxvdyBmb3IgYWNjb3VudCA9PT0gbnVsbCB1c2UgY2FzZXM7IFRoaXMgd2lsbCBiZSByZXZpc2l0ZWQgZm9yIGNvbmZpZGVudGlhbCBmbG93IHVzZWNhc2VzXHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmFjY291bnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKG5vQWNjb3VudEluU2lsZW50UmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRyeSBjaGVja2luZyBpZiBGT0NJIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvblxyXG4gICAgICAgIGNvbnN0IGlzRk9DSSA9IHRoaXMuY2FjaGVNYW5hZ2VyLmlzQXBwTWV0YWRhdGFGT0NJKHJlcXVlc3QuYWNjb3VudC5lbnZpcm9ubWVudCk7XHJcbiAgICAgICAgLy8gaWYgdGhlIGFwcCBpcyBwYXJ0IG9mIHRoZSBmYW1pbHksIHJldHJpdmUgYSBGYW1pbHkgcmVmcmVzaCB0b2tlbiBpZiBwcmVzZW50IGFuZCBtYWtlIGEgcmVmcmVzaFRva2VuUmVxdWVzdFxyXG4gICAgICAgIGlmIChpc0ZPQ0kpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4uYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vRmFtaWx5UlRJbkNhY2hlID0gZSBpbnN0YW5jZW9mIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IgJiZcclxuICAgICAgICAgICAgICAgICAgICBlLmVycm9yQ29kZSA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9Ub2tlbnNGb3VuZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudE1pc21hdGNoRXJyb3JXaXRoRmFtaWx5UlQgPSBlIGluc3RhbmNlb2YgU2VydmVyRXJyb3IgJiZcclxuICAgICAgICAgICAgICAgICAgICBlLmVycm9yQ29kZSA9PT0gRXJyb3JzLklOVkFMSURfR1JBTlRfRVJST1IgJiZcclxuICAgICAgICAgICAgICAgICAgICBlLnN1YkVycm9yID09PSBFcnJvcnMuQ0xJRU5UX01JU01BVENIX0VSUk9SO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgZmFtaWx5IFJlZnJlc2ggVG9rZW4gKEZSVCkgY2FjaGUgYWNxdWlzaXRpb24gZmFpbHMgb3IgaWYgY2xpZW50X21pc21hdGNoIGVycm9yIGlzIHNlZW4gd2l0aCBGUlQsIHJlYXR0ZW1wdCB3aXRoIGFwcGxpY2F0aW9uIFJlZnJlc2ggVG9rZW4gKEFSVClcclxuICAgICAgICAgICAgICAgIGlmIChub0ZhbWlseVJUSW5DYWNoZSB8fCBjbGllbnRNaXNtYXRjaEVycm9yV2l0aEZhbWlseVJUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgaW4gYWxsIG90aGVyIGNhc2VzXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBhcHBsaWNhdGlvbiByZWZyZXNoIHRva2VuIGFjcXVpc2l0aW9uXHJcbiAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIG1ha2VzIGEgbmV0d29yayBjYWxsIHRvIGFjcXVpcmUgdG9rZW5zIGJ5IGV4Y2hhbmdpbmcgUmVmcmVzaFRva2VuIGF2YWlsYWJsZSBpbiB1c2VyQ2FjaGU7IHRocm93cyBpZiByZWZyZXNoIHRva2VuIGlzIG5vdCBjYWNoZWRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4ocmVxdWVzdCwgZm9jaSkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbiwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBmZXRjaGVzIGZhbWlseSBSVCBvciBhcHBsaWNhdGlvbiBSVCBiYXNlZCBvbiBGT0NJIHZhbHVlXHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gaW52b2tlKHRoaXMuY2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMuY2FjaGVNYW5hZ2VyKSwgUGVyZm9ybWFuY2VFdmVudHMuQ2FjaGVNYW5hZ2VyR2V0UmVmcmVzaFRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LmFjY291bnQsIGZvY2ksIHVuZGVmaW5lZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKG5vVG9rZW5zRm91bmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVmcmVzaFRva2VuLmV4cGlyZXNPbiAmJlxyXG4gICAgICAgICAgICBpc1Rva2VuRXhwaXJlZChyZWZyZXNoVG9rZW4uZXhwaXJlc09uLCByZXF1ZXN0LnJlZnJlc2hUb2tlbkV4cGlyYXRpb25PZmZzZXRTZWNvbmRzIHx8XHJcbiAgICAgICAgICAgICAgICBERUZBVUxUX1JFRlJFU0hfVE9LRU5fRVhQSVJBVElPTl9PRkZTRVRfU0VDT05EUykpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcihyZWZyZXNoVG9rZW5FeHBpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYXR0YWNoIGNhY2hlZCBSVCBzaXplIHRvIHRoZSBjdXJyZW50IG1lYXN1cmVtZW50XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoVG9rZW4uc2VjcmV0LFxyXG4gICAgICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZTogcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSB8fCBBdXRoZW50aWNhdGlvblNjaGVtZS5CRUFSRVIsXHJcbiAgICAgICAgICAgIGNjc0NyZWRlbnRpYWw6IHtcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IHJlcXVlc3QuYWNjb3VudC5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogQ2NzQ3JlZGVudGlhbFR5cGUuSE9NRV9BQ0NPVU5UX0lELFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGludm9rZUFzeW5jKHRoaXMuYWNxdWlyZVRva2VuLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVmcmVzaFRva2VuUmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgZS5zdWJFcnJvciA9PT0gYmFkVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBiYWQgcmVmcmVzaCB0b2tlbiBmcm9tIGNhY2hlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWNxdWlyZVRva2VuV2l0aFJlZnJlc2hUb2tlbjogYmFkIHJlZnJlc2ggdG9rZW4sIHJlbW92aW5nIGZyb20gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYWRSZWZyZXNoVG9rZW5LZXkgPSBnZW5lcmF0ZUNyZWRlbnRpYWxLZXkocmVmcmVzaFRva2VuKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyLnJlbW92ZVJlZnJlc2hUb2tlbihiYWRSZWZyZXNoVG9rZW5LZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBuZXR3b3JrIG1lc3NhZ2UgYW5kIG1ha2VzIGEgTlcgY2FsbCB0byB0aGUgdW5kZXJseWluZyBzZWN1cmUgdG9rZW4gc2VydmljZVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBhdXRob3JpdHlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChyZXF1ZXN0LCBhdXRob3JpdHkpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbWV0ZXJzU3RyaW5nID0gdGhpcy5jcmVhdGVUb2tlblF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBlbmRwb2ludCA9IFVybFN0cmluZy5hcHBlbmRRdWVyeVN0cmluZyhhdXRob3JpdHkudG9rZW5FbmRwb2ludCwgcXVlcnlQYXJhbWV0ZXJzU3RyaW5nKTtcclxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keS5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzKHJlcXVlc3QuY2NzQ3JlZGVudGlhbCk7XHJcbiAgICAgICAgY29uc3QgdGh1bWJwcmludCA9IHtcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHJlcXVlc3QudG9rZW5Cb2R5UGFyYW1ldGVycz8uY2xpZW50SWQgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eS5jYW5vbmljYWxBdXRob3JpdHksXHJcbiAgICAgICAgICAgIHNjb3BlczogcmVxdWVzdC5zY29wZXMsXHJcbiAgICAgICAgICAgIGNsYWltczogcmVxdWVzdC5jbGFpbXMsXHJcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uU2NoZW1lOiByZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lLFxyXG4gICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RNZXRob2Q6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLFxyXG4gICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RVcmk6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0VXJpLFxyXG4gICAgICAgICAgICBzaHJDbGFpbXM6IHJlcXVlc3Quc2hyQ2xhaW1zLFxyXG4gICAgICAgICAgICBzc2hLaWQ6IHJlcXVlc3Quc3NoS2lkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHRoaXMuZXhlY3V0ZVBvc3RUb1Rva2VuRW5kcG9pbnQuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVBvc3RUb1Rva2VuRW5kcG9pbnQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGVuZHBvaW50LCByZXF1ZXN0Qm9keSwgaGVhZGVycywgdGh1bWJwcmludCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkLCBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIHRva2VuIHJlcXVlc3QgYm9keVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keShyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByZXF1ZXN0LmNvcnJlbGF0aW9uSWQ7XHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyQnVpbGRlciA9IG5ldyBSZXF1ZXN0UGFyYW1ldGVyQnVpbGRlcihjb3JyZWxhdGlvbklkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudElkKHJlcXVlc3QuZW1iZWRkZWRDbGllbnRJZCB8fFxyXG4gICAgICAgICAgICByZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnM/LltDTElFTlRfSURdIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkKTtcclxuICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdFVyaSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFJlZGlyZWN0VXJpKHJlcXVlc3QucmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFNjb3BlcyhyZXF1ZXN0LnNjb3BlcywgdHJ1ZSwgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuYXV0aG9yaXR5Lm9wdGlvbnMuT0lEQ09wdGlvbnM/LmRlZmF1bHRTY29wZXMpO1xyXG4gICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkR3JhbnRUeXBlKEdyYW50VHlwZS5SRUZSRVNIX1RPS0VOX0dSQU5UKTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudEluZm8oKTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZExpYnJhcnlJbmZvKHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKTtcclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZEFwcGxpY2F0aW9uVGVsZW1ldHJ5KHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbik7XHJcbiAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRUaHJvdHRsaW5nKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciAmJiAhaXNPaWRjUHJvdG9jb2xNb2RlKHRoaXMuY29uZmlnKSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFNlcnZlclRlbGVtZXRyeSh0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZFJlZnJlc2hUb2tlbihyZXF1ZXN0LnJlZnJlc2hUb2tlbik7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudFNlY3JldCkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudFNlY3JldCh0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRTZWNyZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50QXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEFzc2VydGlvbiA9IHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudEFzc2VydGlvbjtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDbGllbnRBc3NlcnRpb24oYXdhaXQgZ2V0Q2xpZW50QXNzZXJ0aW9uKGNsaWVudEFzc2VydGlvbi5hc3NlcnRpb24sIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLCByZXF1ZXN0LnJlc291cmNlUmVxdWVzdFVyaSkpO1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsaWVudEFzc2VydGlvblR5cGUoY2xpZW50QXNzZXJ0aW9uLmFzc2VydGlvblR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcFRva2VuR2VuZXJhdG9yID0gbmV3IFBvcFRva2VuR2VuZXJhdG9yKHRoaXMuY3J5cHRvVXRpbHMsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICBsZXQgcmVxQ25mRGF0YTtcclxuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnBvcEtpZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUmVxQ25mRGF0YSA9IGF3YWl0IGludm9rZUFzeW5jKHBvcFRva2VuR2VuZXJhdG9yLmdlbmVyYXRlQ25mLmJpbmQocG9wVG9rZW5HZW5lcmF0b3IpLCBQZXJmb3JtYW5jZUV2ZW50cy5Qb3BUb2tlbkdlbmVyYXRlQ25mLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgICAgICAgICByZXFDbmZEYXRhID0gZ2VuZXJhdGVkUmVxQ25mRGF0YS5yZXFDbmZTdHJpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXFDbmZEYXRhID0gdGhpcy5jcnlwdG9VdGlscy5lbmNvZGVLaWQocmVxdWVzdC5wb3BLaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFNQQSBQb1AgcmVxdWlyZXMgZnVsbCBCYXNlNjRVcmwgZW5jb2RlZCByZXFfY25mIHN0cmluZyAodW5oYXNoZWQpXHJcbiAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkUG9wVG9rZW4ocmVxQ25mRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgPT09IEF1dGhlbnRpY2F0aW9uU2NoZW1lLlNTSCkge1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zc2hKd2spIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkU3NoSndrKHJlcXVlc3Quc3NoSndrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcihtaXNzaW5nU3NoSndrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPYmoocmVxdWVzdC5jbGFpbXMpIHx8XHJcbiAgICAgICAgICAgICh0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJCdWlsZGVyLmFkZENsYWltcyhyZXF1ZXN0LmNsYWltcywgdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnN5c3RlbU9wdGlvbnMucHJldmVudENvcnNQcmVmbGlnaHQgJiZcclxuICAgICAgICAgICAgcmVxdWVzdC5jY3NDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVxdWVzdC5jY3NDcmVkZW50aWFsLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2NzQ3JlZGVudGlhbFR5cGUuSE9NRV9BQ0NPVU5UX0lEOlxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudEluZm8gPSBidWlsZENsaWVudEluZm9Gcm9tSG9tZUFjY291bnRJZChyZXF1ZXN0LmNjc0NyZWRlbnRpYWwuY3JlZGVudGlhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckJ1aWxkZXIuYWRkQ2NzT2lkKGNsaWVudEluZm8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ291bGQgbm90IHBhcnNlIGhvbWUgYWNjb3VudCBJRCBmb3IgQ0NTIEhlYWRlcjogXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDY3NDcmVkZW50aWFsVHlwZS5VUE46XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRDY3NVcG4ocmVxdWVzdC5jY3NDcmVkZW50aWFsLmNyZWRlbnRpYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXF1ZXN0LmVtYmVkZGVkQ2xpZW50SWQpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRCcm9rZXJQYXJhbWV0ZXJzKHtcclxuICAgICAgICAgICAgICAgIGJyb2tlckNsaWVudElkOiB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGJyb2tlclJlZGlyZWN0VXJpOiB0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyQnVpbGRlci5hZGRFeHRyYVF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnRva2VuQm9keVBhcmFtZXRlcnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyQnVpbGRlci5jcmVhdGVRdWVyeVN0cmluZygpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFJlZnJlc2hUb2tlbkNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVmcmVzaFRva2VuQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQmFzZUNsaWVudCB9IGZyb20gJy4vQmFzZUNsaWVudC5tanMnO1xuaW1wb3J0IHsgd2FzQ2xvY2tUdXJuZWRCYWNrLCBpc1Rva2VuRXhwaXJlZCB9IGZyb20gJy4uL3V0aWxzL1RpbWVVdGlscy5tanMnO1xuaW1wb3J0IHsgUmVmcmVzaFRva2VuQ2xpZW50IH0gZnJvbSAnLi9SZWZyZXNoVG9rZW5DbGllbnQubWpzJztcbmltcG9ydCB7IENsaWVudEF1dGhFcnJvciwgY3JlYXRlQ2xpZW50QXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUhhbmRsZXIgfSBmcm9tICcuLi9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IE9JRENfREVGQVVMVF9TQ09QRVMsIENhY2hlT3V0Y29tZSB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICcuLi91dGlscy9TdHJpbmdVdGlscy5tanMnO1xuaW1wb3J0IHsgZXh0cmFjdFRva2VuQ2xhaW1zLCBjaGVja01heEFnZSB9IGZyb20gJy4uL2FjY291bnQvQXV0aFRva2VuLm1qcyc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50cyB9IGZyb20gJy4uL3RlbGVtZXRyeS9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZUV2ZW50Lm1qcyc7XG5pbXBvcnQgeyBpbnZva2VBc3luYyB9IGZyb20gJy4uL3V0aWxzL0Z1bmN0aW9uV3JhcHBlcnMubWpzJztcbmltcG9ydCB7IGdldFRlbmFudEZyb21BdXRob3JpdHlTdHJpbmcgfSBmcm9tICcuLi9hdXRob3JpdHkvQXV0aG9yaXR5Lm1qcyc7XG5pbXBvcnQgeyB0b2tlblJlZnJlc2hSZXF1aXJlZCwgbm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0LCBhdXRoVGltZU5vdEZvdW5kIH0gZnJvbSAnLi4vZXJyb3IvQ2xpZW50QXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgU2lsZW50Rmxvd0NsaWVudCBleHRlbmRzIEJhc2VDbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbiwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLCBwZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhIHRva2VuIGZyb20gY2FjaGUgaWYgaXQgaXMgc3RpbGwgdmFsaWQsIG9yIHVzZXMgdGhlIGNhY2hlZCByZWZyZXNoIHRva2VuIHRvIHJlbmV3XHJcbiAgICAgKiB0aGUgZ2l2ZW4gdG9rZW4gYW5kIHJldHVybnMgdGhlIHJlbmV3ZWQgdG9rZW5cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgW2F1dGhSZXNwb25zZSwgY2FjaGVPdXRjb21lXSA9IGF3YWl0IHRoaXMuYWNxdWlyZUNhY2hlZFRva2VuKHtcclxuICAgICAgICAgICAgICAgIC4uLnJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICBzY29wZXM6IHJlcXVlc3Quc2NvcGVzPy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3Quc2NvcGVzXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbLi4uT0lEQ19ERUZBVUxUX1NDT1BFU10sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBpZiB0aGUgdG9rZW4gaXMgbm90IGV4cGlyZWQgYnV0IG11c3QgYmUgcmVmcmVzaGVkOyBnZXQgYSBuZXcgb25lIGluIHRoZSBiYWNrZ3JvdW5kXHJcbiAgICAgICAgICAgIGlmIChjYWNoZU91dGNvbWUgPT09IENhY2hlT3V0Y29tZS5QUk9BQ1RJVkVMWV9SRUZSRVNIRUQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJTaWxlbnRGbG93Q2xpZW50OmFjcXVpcmVDYWNoZWRUb2tlbiAtIENhY2hlZCBhY2Nlc3MgdG9rZW4ncyByZWZyZXNoT24gcHJvcGVydHkgaGFzIGJlZW4gZXhjZWVkZWQnLiBJdCdzIG5vdCBleHBpcmVkLCBidXQgbXVzdCBiZSByZWZyZXNoZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGluIHRoZSBiYWNrZ3JvdW5kXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWZyZXNoVG9rZW5DbGllbnQgPSBuZXcgUmVmcmVzaFRva2VuQ2xpZW50KHRoaXMuY29uZmlnLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hUb2tlbkNsaWVudFxyXG4gICAgICAgICAgICAgICAgICAgIC5hY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihyZXF1ZXN0KVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBubyBhY3Rpb24gaXMgdG8gYmUgdGFrZW4gdXBvbiBzdWNjZXNzIG9yIGZhaWx1cmVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aGUgY2FjaGVkIHRva2VuXHJcbiAgICAgICAgICAgIHJldHVybiBhdXRoUmVzcG9uc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ2xpZW50QXV0aEVycm9yICYmXHJcbiAgICAgICAgICAgICAgICBlLmVycm9yQ29kZSA9PT0gdG9rZW5SZWZyZXNoUmVxdWlyZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbkNsaWVudCA9IG5ldyBSZWZyZXNoVG9rZW5DbGllbnQodGhpcy5jb25maWcsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2hUb2tlbkNsaWVudC5hY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihyZXF1ZXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0b2tlbiBmcm9tIGNhY2hlIG9yIHRocm93cyBhbiBlcnJvciBpZiBpdCBtdXN0IGJlIHJlZnJlc2hlZC5cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVDYWNoZWRUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGxldCBsYXN0Q2FjaGVPdXRjb21lID0gQ2FjaGVPdXRjb21lLk5PVF9BUFBMSUNBQkxFO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmZvcmNlUmVmcmVzaCB8fFxyXG4gICAgICAgICAgICAoIXRoaXMuY29uZmlnLmNhY2hlT3B0aW9ucy5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkICYmXHJcbiAgICAgICAgICAgICAgICAhU3RyaW5nVXRpbHMuaXNFbXB0eU9iaihyZXF1ZXN0LmNsYWltcykpKSB7XHJcbiAgICAgICAgICAgIC8vIE11c3QgcmVmcmVzaCBkdWUgdG8gcHJlc2VudCBmb3JjZV9yZWZyZXNoIGZsYWcuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVPdXRjb21lKENhY2hlT3V0Y29tZS5GT1JDRV9SRUZSRVNIX09SX0NMQUlNUywgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKHRva2VuUmVmcmVzaFJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHNpbGVudCBmbG93IGZvciBhY2NvdW50ID09PSBudWxsIHVzZSBjYXNlczsgVGhpcyB3aWxsIGJlIHJldmlzaXRlZCBmb3IgY29uZmlkZW50aWFsIGZsb3cgdXNlY2FzZXNcclxuICAgICAgICBpZiAoIXJlcXVlc3QuYWNjb3VudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3Iobm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdFRlbmFudElkID0gcmVxdWVzdC5hY2NvdW50LnRlbmFudElkIHx8XHJcbiAgICAgICAgICAgIGdldFRlbmFudEZyb21BdXRob3JpdHlTdHJpbmcocmVxdWVzdC5hdXRob3JpdHkpO1xyXG4gICAgICAgIGNvbnN0IHRva2VuS2V5cyA9IHRoaXMuY2FjaGVNYW5hZ2VyLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEFjY2Vzc1Rva2VuID0gdGhpcy5jYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW4ocmVxdWVzdC5hY2NvdW50LCByZXF1ZXN0LCB0b2tlbktleXMsIHJlcXVlc3RUZW5hbnRJZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAoIWNhY2hlZEFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIC8vIG11c3QgcmVmcmVzaCBkdWUgdG8gbm9uLWV4aXN0ZW50IGFjY2Vzc190b2tlblxyXG4gICAgICAgICAgICB0aGlzLnNldENhY2hlT3V0Y29tZShDYWNoZU91dGNvbWUuTk9fQ0FDSEVEX0FDQ0VTU19UT0tFTiwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKHRva2VuUmVmcmVzaFJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAod2FzQ2xvY2tUdXJuZWRCYWNrKGNhY2hlZEFjY2Vzc1Rva2VuLmNhY2hlZEF0KSB8fFxyXG4gICAgICAgICAgICBpc1Rva2VuRXhwaXJlZChjYWNoZWRBY2Nlc3NUb2tlbi5leHBpcmVzT24sIHRoaXMuY29uZmlnLnN5c3RlbU9wdGlvbnMudG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kcykpIHtcclxuICAgICAgICAgICAgLy8gbXVzdCByZWZyZXNoIGR1ZSB0byB0aGUgZXhwaXJlc19pbiB2YWx1ZVxyXG4gICAgICAgICAgICB0aGlzLnNldENhY2hlT3V0Y29tZShDYWNoZU91dGNvbWUuQ0FDSEVEX0FDQ0VTU19UT0tFTl9FWFBJUkVELCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IodG9rZW5SZWZyZXNoUmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYWNoZWRBY2Nlc3NUb2tlbi5yZWZyZXNoT24gJiZcclxuICAgICAgICAgICAgaXNUb2tlbkV4cGlyZWQoY2FjaGVkQWNjZXNzVG9rZW4ucmVmcmVzaE9uLCAwKSkge1xyXG4gICAgICAgICAgICAvLyBtdXN0IHJlZnJlc2ggKGluIHRoZSBiYWNrZ3JvdW5kKSBkdWUgdG8gdGhlIHJlZnJlc2hfaW4gdmFsdWVcclxuICAgICAgICAgICAgbGFzdENhY2hlT3V0Y29tZSA9IENhY2hlT3V0Y29tZS5QUk9BQ1RJVkVMWV9SRUZSRVNIRUQ7XHJcbiAgICAgICAgICAgIC8vIGRvbid0IHRocm93IENsaWVudEF1dGhFcnJvci5jcmVhdGVSZWZyZXNoUmVxdWlyZWRFcnJvcigpLCByZXR1cm4gY2FjaGVkIHRva2VuIGluc3RlYWRcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSByZXF1ZXN0LmF1dGhvcml0eSB8fCB0aGlzLmF1dGhvcml0eS5nZXRQcmVmZXJyZWRDYWNoZSgpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlUmVjb3JkID0ge1xyXG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLmNhY2hlTWFuYWdlci5yZWFkQWNjb3VudEZyb21DYWNoZShyZXF1ZXN0LmFjY291bnQpLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogY2FjaGVkQWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgIGlkVG9rZW46IHRoaXMuY2FjaGVNYW5hZ2VyLmdldElkVG9rZW4ocmVxdWVzdC5hY2NvdW50LCB0b2tlbktleXMsIHJlcXVlc3RUZW5hbnRJZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKSxcclxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBudWxsLFxyXG4gICAgICAgICAgICBhcHBNZXRhZGF0YTogdGhpcy5jYWNoZU1hbmFnZXIucmVhZEFwcE1ldGFkYXRhRnJvbUNhY2hlKGVudmlyb25tZW50KSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2V0Q2FjaGVPdXRjb21lKGxhc3RDYWNoZU91dGNvbWUsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyVGVsZW1ldHJ5TWFuYWdlci5pbmNyZW1lbnRDYWNoZUhpdHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgYXdhaXQgaW52b2tlQXN5bmModGhpcy5nZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZC5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGNhY2hlUmVjb3JkLCByZXF1ZXN0KSxcclxuICAgICAgICAgICAgbGFzdENhY2hlT3V0Y29tZSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG4gICAgc2V0Q2FjaGVPdXRjb21lKGNhY2hlT3V0Y29tZSwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlcj8uc2V0Q2FjaGVPdXRjb21lKGNhY2hlT3V0Y29tZSk7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtcclxuICAgICAgICAgICAgY2FjaGVPdXRjb21lOiBjYWNoZU91dGNvbWUsXHJcbiAgICAgICAgfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgaWYgKGNhY2hlT3V0Y29tZSAhPT0gQ2FjaGVPdXRjb21lLk5PVF9BUFBMSUNBQkxFKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFRva2VuIHJlZnJlc2ggaXMgcmVxdWlyZWQgZHVlIHRvIGNhY2hlIG91dGNvbWU6ICR7Y2FjaGVPdXRjb21lfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGJ1aWxkIHJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSBDYWNoZVJlY29yZFxyXG4gICAgICogQHBhcmFtIGNhY2hlUmVjb3JkXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlUmVzdWx0RnJvbUNhY2hlUmVjb3JkKGNhY2hlUmVjb3JkLCByZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgbGV0IGlkVG9rZW5DbGFpbXM7XHJcbiAgICAgICAgaWYgKGNhY2hlUmVjb3JkLmlkVG9rZW4pIHtcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltcyA9IGV4dHJhY3RUb2tlbkNsYWltcyhjYWNoZVJlY29yZC5pZFRva2VuLnNlY3JldCwgdGhpcy5jb25maWcuY3J5cHRvSW50ZXJmYWNlLmJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRva2VuIG1heF9hZ2UgY2hlY2tcclxuICAgICAgICBpZiAocmVxdWVzdC5tYXhBZ2UgfHwgcmVxdWVzdC5tYXhBZ2UgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgYXV0aFRpbWUgPSBpZFRva2VuQ2xhaW1zPy5hdXRoX3RpbWU7XHJcbiAgICAgICAgICAgIGlmICghYXV0aFRpbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihhdXRoVGltZU5vdEZvdW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjaGVja01heEFnZShhdXRoVGltZSwgcmVxdWVzdC5tYXhBZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVzcG9uc2VIYW5kbGVyLmdlbmVyYXRlQXV0aGVudGljYXRpb25SZXN1bHQodGhpcy5jcnlwdG9VdGlscywgdGhpcy5hdXRob3JpdHksIGNhY2hlUmVjb3JkLCB0cnVlLCByZXF1ZXN0LCBpZFRva2VuQ2xhaW1zKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBTaWxlbnRGbG93Q2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWxlbnRGbG93Q2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZUFzeW5jLCBTaWxlbnRGbG93Q2xpZW50IH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgQXBpSWQgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBCcm93c2VyQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgY3J5cHRvS2V5Tm90Rm91bmQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFNpbGVudENhY2hlQ2xpZW50IGV4dGVuZHMgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdW5leHBpcmVkIHRva2VucyBmcm9tIHRoZSBjYWNoZSwgaWYgYXZhaWxhYmxlXHJcbiAgICAgKiBAcGFyYW0gc2lsZW50UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW4oc2lsZW50UmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlbiwgc2lsZW50UmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBUZWxlbWV0cnkgbWFuYWdlciBvbmx5IHVzZWQgdG8gaW5jcmVtZW50IGNhY2hlSGl0cyBoZXJlXHJcbiAgICAgICAgY29uc3Qgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciA9IHRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoQXBpSWQuYWNxdWlyZVRva2VuU2lsZW50X3NpbGVudEZsb3cpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudENvbmZpZyA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkoe1xyXG4gICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLFxyXG4gICAgICAgICAgICByZXF1ZXN0QXV0aG9yaXR5OiBzaWxlbnRSZXF1ZXN0LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOiBzaWxlbnRSZXF1ZXN0LmF6dXJlQ2xvdWRPcHRpb25zLFxyXG4gICAgICAgICAgICBhY2NvdW50OiBzaWxlbnRSZXF1ZXN0LmFjY291bnQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3Qgc2lsZW50QXV0aENsaWVudCA9IG5ldyBTaWxlbnRGbG93Q2xpZW50KGNsaWVudENvbmZpZywgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlNpbGVudCBhdXRoIGNsaWVudCBjcmVhdGVkXCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW52b2tlQXN5bmMoc2lsZW50QXV0aENsaWVudC5hY3F1aXJlQ2FjaGVkVG9rZW4uYmluZChzaWxlbnRBdXRoQ2xpZW50KSwgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50Rmxvd0NsaWVudEFjcXVpcmVDYWNoZWRUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCkoc2lsZW50UmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGhSZXNwb25zZSA9IHJlc3BvbnNlWzBdO1xyXG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7XHJcbiAgICAgICAgICAgICAgICBmcm9tQ2FjaGU6IHRydWUsXHJcbiAgICAgICAgICAgIH0sIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHJldHVybiBhdXRoUmVzcG9uc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2VyQXV0aEVycm9yICYmXHJcbiAgICAgICAgICAgICAgICBlcnJvci5lcnJvckNvZGUgPT09IGNyeXB0b0tleU5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiU2lnbmluZyBrZXlwYWlyIGZvciBib3VuZCBhY2Nlc3MgdG9rZW4gbm90IGZvdW5kLiBSZWZyZXNoaW5nIGJvdW5kIGFjY2VzcyB0b2tlbiBhbmQgZ2VuZXJhdGluZyBhIG5ldyBjcnlwdG8ga2V5cGFpci5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBUEkgdG8gc2lsZW50eSBjbGVhciB0aGUgYnJvd3NlciBjYWNoZS5cclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGxvZ291dChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImxvZ291dFJlZGlyZWN0IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCB2YWxpZExvZ291dFJlcXVlc3QgPSB0aGlzLmluaXRpYWxpemVMb2dvdXRSZXF1ZXN0KGxvZ291dFJlcXVlc3QpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFyQ2FjaGVPbkxvZ291dCh2YWxpZExvZ291dFJlcXVlc3Q/LmFjY291bnQpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFNpbGVudENhY2hlQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWxlbnRDYWNoZUNsaWVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IFNlcnZlclRlbGVtZXRyeU1hbmFnZXIsIEFBRFNlcnZlclBhcmFtS2V5cywgUGVyZm9ybWFuY2VFdmVudHMsIFRpbWVVdGlscywgU2NvcGVTZXQsIGNyZWF0ZUNsaWVudEF1dGhFcnJvciwgQ2xpZW50QXV0aEVycm9yQ29kZXMsIEF1dGhUb2tlbiwgYnVpbGRBY2NvdW50VG9DYWNoZSwgQWNjb3VudEVudGl0eSwgQ29uc3RhbnRzLCBBdXRob3JpdHlUeXBlLCBBdXRoZW50aWNhdGlvblNjaGVtZSwgUG9wVG9rZW5HZW5lcmF0b3IsIHVwZGF0ZUFjY291bnRUZW5hbnRQcm9maWxlRGF0YSwgQ2FjaGVIZWxwZXJzLCBjcmVhdGVBdXRoRXJyb3IsIEF1dGhFcnJvckNvZGVzLCBVcmxTdHJpbmcsIE9JRENfREVGQVVMVF9TQ09QRVMsIGludm9rZUFzeW5jLCBQcm9tcHRWYWx1ZSB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IEJhc2VJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vQmFzZUludGVyYWN0aW9uQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVDb25zdGFudHMsIEJyb3dzZXJDb25zdGFudHMsIE5hdGl2ZUV4dGVuc2lvbk1ldGhvZCwgVGVtcG9yYXJ5Q2FjaGVLZXlzLCBBcGlJZCB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IE5hdGl2ZUF1dGhFcnJvciwgaXNGYXRhbE5hdGl2ZUF1dGhFcnJvciwgY3JlYXRlTmF0aXZlQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvTmF0aXZlQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgU2lsZW50Q2FjaGVDbGllbnQgfSBmcm9tICcuL1NpbGVudENhY2hlQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBiYXNlNjREZWNvZGUgfSBmcm9tICcuLi9lbmNvZGUvQmFzZTY0RGVjb2RlLm1qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBpbnZhbGlkUG9wVG9rZW5SZXF1ZXN0LCBuYXRpdmVQcm9tcHROb3RTdXBwb3J0ZWQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcbmltcG9ydCB7IHVzZXJTd2l0Y2ggfSBmcm9tICcuLi9lcnJvci9OYXRpdmVBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgZXh0ZW5kcyBCYXNlSW50ZXJhY3Rpb25DbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBicm93c2VyU3RvcmFnZSwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIGFwaUlkLCBwZXJmb3JtYW5jZUNsaWVudCwgcHJvdmlkZXIsIGFjY291bnRJZCwgbmF0aXZlU3RvcmFnZUltcGwsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBzdXBlcihjb25maWcsIGJyb3dzZXJTdG9yYWdlLCBicm93c2VyQ3J5cHRvLCBsb2dnZXIsIGV2ZW50SGFuZGxlciwgbmF2aWdhdGlvbkNsaWVudCwgcGVyZm9ybWFuY2VDbGllbnQsIHByb3ZpZGVyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmFwaUlkID0gYXBpSWQ7XHJcbiAgICAgICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50SWQ7XHJcbiAgICAgICAgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciA9IHByb3ZpZGVyO1xyXG4gICAgICAgIHRoaXMubmF0aXZlU3RvcmFnZU1hbmFnZXIgPSBuYXRpdmVTdG9yYWdlSW1wbDtcclxuICAgICAgICB0aGlzLnNpbGVudENhY2hlQ2xpZW50ID0gbmV3IFNpbGVudENhY2hlQ2xpZW50KGNvbmZpZywgdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlciwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIHBlcmZvcm1hbmNlQ2xpZW50LCBwcm92aWRlciwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyID0gdGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcih0aGlzLmFwaUlkKTtcclxuICAgICAgICBjb25zdCBleHRlbnNpb25OYW1lID0gdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlci5nZXRFeHRlbnNpb25JZCgpID09PVxyXG4gICAgICAgICAgICBOYXRpdmVDb25zdGFudHMuUFJFRkVSUkVEX0VYVEVOU0lPTl9JRFxyXG4gICAgICAgICAgICA/IFwiY2hyb21lXCJcclxuICAgICAgICAgICAgOiB0aGlzLm5hdGl2ZU1lc3NhZ2VIYW5kbGVyLmdldEV4dGVuc2lvbklkKCk/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyBcInVua25vd25cIlxyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5za3VzID0gU2VydmVyVGVsZW1ldHJ5TWFuYWdlci5tYWtlRXh0cmFTa3VTdHJpbmcoe1xyXG4gICAgICAgICAgICBsaWJyYXJ5TmFtZTogQnJvd3NlckNvbnN0YW50cy5NU0FMX1NLVSxcclxuICAgICAgICAgICAgbGlicmFyeVZlcnNpb246IHZlcnNpb24sXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbk5hbWU6IGV4dGVuc2lvbk5hbWUsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvblZlcnNpb246IHRoaXMubmF0aXZlTWVzc2FnZUhhbmRsZXIuZ2V0RXh0ZW5zaW9uVmVyc2lvbigpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIFNLVXMgdG8gcmVxdWVzdCBleHRyYSBxdWVyeSBwYXJhbWV0ZXJzXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCB7TmF0aXZlVG9rZW5SZXF1ZXN0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYWRkUmVxdWVzdFNLVXMocmVxdWVzdCkge1xyXG4gICAgICAgIHJlcXVlc3QuZXh0cmFQYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAuLi5yZXF1ZXN0LmV4dHJhUGFyYW1ldGVycyxcclxuICAgICAgICAgICAgW0FBRFNlcnZlclBhcmFtS2V5cy5YX0NMSUVOVF9FWFRSQV9TS1VdOiB0aGlzLnNrdXMsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWNxdWlyZSB0b2tlbiBmcm9tIG5hdGl2ZSBwbGF0Zm9ybSB2aWEgYnJvd3NlciBleHRlbnNpb25cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBhY3F1aXJlVG9rZW4gY2FsbGVkLlwiKTtcclxuICAgICAgICAvLyBzdGFydCB0aGUgcGVyZiBtZWFzdXJlbWVudFxyXG4gICAgICAgIGNvbnN0IG5hdGl2ZUFUTWVhc3VyZW1lbnQgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuTmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4sIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgcmVxVGltZXN0YW1wID0gVGltZVV0aWxzLm5vd1NlY29uZHMoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIG5hdGl2ZSByZXF1ZXN0XHJcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVJlcXVlc3QgPSBhd2FpdCB0aGlzLmluaXRpYWxpemVOYXRpdmVSZXF1ZXN0KHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW5zIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBpbnRlcm5hbCBjYWNoZVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hY3F1aXJlVG9rZW5zRnJvbUNhY2hlKHRoaXMuYWNjb3VudElkLCBuYXRpdmVSZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgIG5hdGl2ZUFUTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTmF0aXZlQnJva2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBmcm9tQ2FjaGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggYSBuYXRpdmUgY2FsbCBmb3IgYW55IGFuZCBhbGwgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiTVNBTCBpbnRlcm5hbCBDYWNoZSBkb2VzIG5vdCBjb250YWluIHRva2VucywgcHJvY2VlZCB0byBtYWtlIGEgbmF0aXZlIGNhbGxcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgeyAuLi5uYXRpdmVUb2tlblJlcXVlc3QgfSA9IG5hdGl2ZVJlcXVlc3Q7XHJcbiAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBuYXRpdmUgY2FsbHNcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IE5hdGl2ZUV4dGVuc2lvbk1ldGhvZC5HZXRUb2tlbixcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG5hdGl2ZVRva2VuUmVxdWVzdCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZU1lc3NhZ2VIYW5kbGVyLnNlbmRNZXNzYWdlKG1lc3NhZ2VCb2R5KTtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkUmVzcG9uc2UgPSB0aGlzLnZhbGlkYXRlTmF0aXZlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVOYXRpdmVSZXNwb25zZSh2YWxpZGF0ZWRSZXNwb25zZSwgbmF0aXZlUmVxdWVzdCwgcmVxVGltZXN0YW1wKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbmF0aXZlQVRNZWFzdXJlbWVudC5lbmQoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOYXRpdmVCcm9rZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIuY2xlYXJOYXRpdmVCcm9rZXJFcnJvckNvZGUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBuYXRpdmVBVE1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBlcnJvci5lcnJvckNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3ViRXJyb3JDb2RlOiBlcnJvci5zdWJFcnJvcixcclxuICAgICAgICAgICAgICAgICAgICBpc05hdGl2ZUJyb2tlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5hdGl2ZUF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLnNldE5hdGl2ZUJyb2tlckVycm9yQ29kZShlLmVycm9yQ29kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgc2lsZW50IGZsb3cgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBjYWNoZWRBY2NvdW50XHJcbiAgICAgKiBAcmV0dXJucyBDb21tb25TaWxlbnRGbG93UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTaWxlbnRDYWNoZVJlcXVlc3QocmVxdWVzdCwgY2FjaGVkQWNjb3VudCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogcmVxdWVzdC5hdXRob3JpdHksXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgc2NvcGVzOiBTY29wZVNldC5mcm9tU3RyaW5nKHJlcXVlc3Quc2NvcGUpLmFzQXJyYXkoKSxcclxuICAgICAgICAgICAgYWNjb3VudDogY2FjaGVkQWNjb3VudCxcclxuICAgICAgICAgICAgZm9yY2VSZWZyZXNoOiBmYWxzZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIHRoZSB0b2tlbnMgZnJvbSB0aGUgY2FjaGUgaWYgdW4tZXhwaXJlZFxyXG4gICAgICogQHBhcmFtIG5hdGl2ZUFjY291bnRJZFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIGF1dGhlbnRpY2F0aW9uUmVzdWx0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbnNGcm9tQ2FjaGUobmF0aXZlQWNjb3VudElkLCByZXF1ZXN0KSB7XHJcbiAgICAgICAgaWYgKCFuYXRpdmVBY2NvdW50SWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhcIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50OmFjcXVpcmVUb2tlbnNGcm9tQ2FjaGUgLSBObyBuYXRpdmVBY2NvdW50SWQgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy5ub0FjY291bnRGb3VuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZldGNoIHRoZSBhY2NvdW50IGZyb20gYnJvd3NlciBjYWNoZVxyXG4gICAgICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEJhc2VBY2NvdW50SW5mbyh7XHJcbiAgICAgICAgICAgIG5hdGl2ZUFjY291bnRJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWFjY291bnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKENsaWVudEF1dGhFcnJvckNvZGVzLm5vQWNjb3VudEZvdW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbGV2ZXJhZ2Ugc2lsZW50IGZsb3cgZm9yIGNhY2hlZCB0b2tlbnMgcmV0cmlldmFsXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgc2lsZW50UmVxdWVzdCA9IHRoaXMuY3JlYXRlU2lsZW50Q2FjaGVSZXF1ZXN0KHJlcXVlc3QsIGFjY291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpbGVudENhY2hlQ2xpZW50LmFjcXVpcmVUb2tlbihzaWxlbnRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgY29uc3QgZnVsbEFjY291bnQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5hY2NvdW50LFxyXG4gICAgICAgICAgICAgICAgaWRUb2tlbkNsYWltczogcmVzdWx0Py5pZFRva2VuQ2xhaW1zLFxyXG4gICAgICAgICAgICAgICAgaWRUb2tlbjogcmVzdWx0Py5pZFRva2VuLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgYWNjb3VudDogZnVsbEFjY291bnQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3F1aXJlcyBhIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtIHRoZW4gcmVkaXJlY3RzIHRvIHRoZSByZWRpcmVjdFVyaSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSB7UmVkaXJlY3RSZXF1ZXN0fSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0ge0luUHJvZ3Jlc3NQZXJmb3JtYW5jZUV2ZW50fSByb290TWVhc3VyZW1lbnRcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuUmVkaXJlY3QocmVxdWVzdCwgcm9vdE1lYXN1cmVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGFjcXVpcmVUb2tlblJlZGlyZWN0IGNhbGxlZC5cIik7XHJcbiAgICAgICAgY29uc3QgeyAuLi5yZW1haW5pbmdQYXJhbWV0ZXJzIH0gPSByZXF1ZXN0O1xyXG4gICAgICAgIGRlbGV0ZSByZW1haW5pbmdQYXJhbWV0ZXJzLm9uUmVkaXJlY3ROYXZpZ2F0ZTtcclxuICAgICAgICBjb25zdCBuYXRpdmVSZXF1ZXN0ID0gYXdhaXQgdGhpcy5pbml0aWFsaXplTmF0aXZlUmVxdWVzdChyZW1haW5pbmdQYXJhbWV0ZXJzKTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlQm9keSA9IHtcclxuICAgICAgICAgICAgbWV0aG9kOiBOYXRpdmVFeHRlbnNpb25NZXRob2QuR2V0VG9rZW4sXHJcbiAgICAgICAgICAgIHJlcXVlc3Q6IG5hdGl2ZVJlcXVlc3QsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlTWVzc2FnZUhhbmRsZXIuc2VuZE1lc3NhZ2UobWVzc2FnZUJvZHkpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlTmF0aXZlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBPbmx5IHRocm93IGZhdGFsIGVycm9ycyBoZXJlIHRvIGFsbG93IGFwcGxpY2F0aW9uIHRvIGZhbGxiYWNrIHRvIHJlZ3VsYXIgcmVkaXJlY3QuIE90aGVyd2lzZSBwcm9jZWVkIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSB0aHJvd24gaW4gaGFuZGxlUmVkaXJlY3RQcm9taXNlXHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF0aXZlQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIuc2V0TmF0aXZlQnJva2VyRXJyb3JDb2RlKGUuZXJyb3JDb2RlKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ZhdGFsTmF0aXZlQXV0aEVycm9yKGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldFRlbXBvcmFyeUNhY2hlKFRlbXBvcmFyeUNhY2hlS2V5cy5OQVRJVkVfUkVRVUVTVCwgSlNPTi5zdHJpbmdpZnkobmF0aXZlUmVxdWVzdCksIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICBhcGlJZDogQXBpSWQuYWNxdWlyZVRva2VuUmVkaXJlY3QsXHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLnN5c3RlbS5yZWRpcmVjdE5hdmlnYXRpb25UaW1lb3V0LFxyXG4gICAgICAgICAgICBub0hpc3Rvcnk6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSB0aGlzLmNvbmZpZy5hdXRoLm5hdmlnYXRlVG9Mb2dpblJlcXVlc3RVcmxcclxuICAgICAgICAgICAgPyB3aW5kb3cubG9jYXRpb24uaHJlZlxyXG4gICAgICAgICAgICA6IHRoaXMuZ2V0UmVkaXJlY3RVcmkocmVxdWVzdC5yZWRpcmVjdFVyaSk7XHJcbiAgICAgICAgcm9vdE1lYXN1cmVtZW50LmVuZCh7IHN1Y2Nlc3M6IHRydWUgfSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlRXh0ZXJuYWwocmVkaXJlY3RVcmksIG5hdmlnYXRpb25PcHRpb25zKTsgLy8gTmVlZCB0byB0cmVhdCB0aGlzIGFzIGV4dGVybmFsIHRvIGVuc3VyZSBoYW5kbGVSZWRpcmVjdFByb21pc2UgaXMgcnVuIGFnYWluXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBwcmV2aW91cyBwYWdlIGNhbGxlZCBuYXRpdmUgcGxhdGZvcm0gZm9yIGEgdG9rZW4gdXNpbmcgcmVkaXJlY3QgQVBJcywgc2VuZCB0aGUgc2FtZSByZXF1ZXN0IGFnYWluIGFuZCByZXR1cm4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gcGVyZm9ybWFuY2VDbGllbnQge0lQZXJmb3JtYW5jZUNsaWVudD99XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZCB7c3RyaW5nP30gY29ycmVsYXRpb24gaWRlbnRpZmllclxyXG4gICAgICovXHJcbiAgICBhc3luYyBoYW5kbGVSZWRpcmVjdFByb21pc2UocGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlUmVkaXJlY3RQcm9taXNlIGNhbGxlZC5cIik7XHJcbiAgICAgICAgaWYgKCF0aGlzLmJyb3dzZXJTdG9yYWdlLmlzSW50ZXJhY3Rpb25JblByb2dyZXNzKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBpbiBwcm9ncmVzcywgcmV0dXJuaW5nIG51bGwuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHByb21wdCBmcm9tIHRoZSByZXF1ZXN0IHRvIHByZXZlbnQgV0FNIGZyb20gcHJvbXB0aW5nIHR3aWNlXHJcbiAgICAgICAgY29uc3QgY2FjaGVkUmVxdWVzdCA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCgpO1xyXG4gICAgICAgIGlmICghY2FjaGVkUmVxdWVzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBjYWNoZWQgcmVxdWVzdCwgcmV0dXJuaW5nIG51bGwuXCIpO1xyXG4gICAgICAgICAgICBpZiAocGVyZm9ybWFuY2VDbGllbnQgJiYgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7IGVycm9yQ29kZTogXCJub19jYWNoZWRfcmVxdWVzdFwiIH0sIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IHByb21wdCwgLi4ucmVxdWVzdCB9ID0gY2FjaGVkUmVxdWVzdDtcclxuICAgICAgICBpZiAocHJvbXB0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQgYW5kIHByb21wdCB3YXMgaW5jbHVkZWQgaW4gdGhlIG9yaWdpbmFsIHJlcXVlc3QsIHJlbW92aW5nIHByb21wdCBmcm9tIGNhY2hlZCByZXF1ZXN0IHRvIHByZXZlbnQgc2Vjb25kIGludGVyYWN0aW9uIHdpdGggbmF0aXZlIGJyb2tlciB3aW5kb3cuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5icm93c2VyU3RvcmFnZS5nZW5lcmF0ZUNhY2hlS2V5KFRlbXBvcmFyeUNhY2hlS2V5cy5OQVRJVkVfUkVRVUVTVCkpO1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VCb2R5ID0ge1xyXG4gICAgICAgICAgICBtZXRob2Q6IE5hdGl2ZUV4dGVuc2lvbk1ldGhvZC5HZXRUb2tlbixcclxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJlcVRpbWVzdGFtcCA9IFRpbWVVdGlscy5ub3dTZWNvbmRzKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlUmVkaXJlY3RQcm9taXNlIHNlbmRpbmcgbWVzc2FnZSB0byBuYXRpdmUgYnJva2VyLlwiKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZU1lc3NhZ2VIYW5kbGVyLnNlbmRNZXNzYWdlKG1lc3NhZ2VCb2R5KTtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZU5hdGl2ZVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVOYXRpdmVSZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdCwgcmVxVGltZXN0YW1wKTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlci5jbGVhck5hdGl2ZUJyb2tlckVycm9yQ29kZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dvdXQgZnJvbSBuYXRpdmUgcGxhdGZvcm0gdmlhIGJyb3dzZXIgZXh0ZW5zaW9uXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBsb2dvdXQoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGxvZ291dCBjYWxsZWQuXCIpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkxvZ291dCBub3QgaW1wbGVtZW50ZWQgeWV0XCIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gcmVzcG9uc2UgZnJvbSBuYXRpdmUgcGxhdGZvcm0gaW50byBBdXRoZW50aWNhdGlvblJlc3VsdCBvYmplY3Qgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgZW5kIHVzZXJcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSByZXFUaW1lc3RhbXBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaGFuZGxlTmF0aXZlUmVzcG9uc2UocmVzcG9uc2UsIHJlcXVlc3QsIHJlcVRpbWVzdGFtcCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBoYW5kbGVOYXRpdmVSZXNwb25zZSBjYWxsZWQuXCIpO1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIGlkZW50aWZpZXJzXHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkNsYWltcyA9IEF1dGhUb2tlbi5leHRyYWN0VG9rZW5DbGFpbXMocmVzcG9uc2UuaWRfdG9rZW4sIGJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgY29uc3QgaG9tZUFjY291bnRJZGVudGlmaWVyID0gdGhpcy5jcmVhdGVIb21lQWNjb3VudElkZW50aWZpZXIocmVzcG9uc2UsIGlkVG9rZW5DbGFpbXMpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZGhvbWVBY2NvdW50SWQgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEFjY291bnRJbmZvRmlsdGVyZWRCeSh7XHJcbiAgICAgICAgICAgIG5hdGl2ZUFjY291bnRJZDogcmVxdWVzdC5hY2NvdW50SWQsXHJcbiAgICAgICAgfSk/LmhvbWVBY2NvdW50SWQ7XHJcbiAgICAgICAgaWYgKGhvbWVBY2NvdW50SWRlbnRpZmllciAhPT0gY2FjaGVkaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICByZXNwb25zZS5hY2NvdW50LmlkICE9PSByZXF1ZXN0LmFjY291bnRJZCkge1xyXG4gICAgICAgICAgICAvLyBVc2VyIHN3aXRjaCBpbiBuYXRpdmUgYnJva2VyIHByb21wdCBpcyBub3Qgc3VwcG9ydGVkLiBBbGwgdXNlcnMgbXVzdCBmaXJzdCBzaWduIGluIHRocm91Z2ggd2ViIGZsb3cgdG8gZW5zdXJlIHNlcnZlciBzdGF0ZSBpcyBpbiBzeW5jXHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZU5hdGl2ZUF1dGhFcnJvcih1c2VyU3dpdGNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IHRoZSBwcmVmZXJyZWRfY2FjaGUgZG9tYWluIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5XHJcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5ID0gYXdhaXQgdGhpcy5nZXREaXNjb3ZlcmVkQXV0aG9yaXR5KHtcclxuICAgICAgICAgICAgcmVxdWVzdEF1dGhvcml0eTogcmVxdWVzdC5hdXRob3JpdHksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgYmFzZUFjY291bnQgPSBidWlsZEFjY291bnRUb0NhY2hlKHRoaXMuYnJvd3NlclN0b3JhZ2UsIGF1dGhvcml0eSwgaG9tZUFjY291bnRJZGVudGlmaWVyLCBiYXNlNjREZWNvZGUsIGlkVG9rZW5DbGFpbXMsIHJlc3BvbnNlLmNsaWVudF9pbmZvLCB1bmRlZmluZWQsIC8vIGVudmlyb25tZW50XHJcbiAgICAgICAgaWRUb2tlbkNsYWltcy50aWQsIHVuZGVmaW5lZCwgLy8gYXV0aCBjb2RlIHBheWxvYWRcclxuICAgICAgICByZXNwb25zZS5hY2NvdW50LmlkLCB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgLy8gZ2VuZXJhdGUgYXV0aGVudGljYXRpb25SZXN1bHRcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQXV0aGVudGljYXRpb25SZXN1bHQocmVzcG9uc2UsIHJlcXVlc3QsIGlkVG9rZW5DbGFpbXMsIGJhc2VBY2NvdW50LCBhdXRob3JpdHkuY2Fub25pY2FsQXV0aG9yaXR5LCByZXFUaW1lc3RhbXApO1xyXG4gICAgICAgIC8vIGNhY2hlIGFjY291bnRzIGFuZCB0b2tlbnMgaW4gdGhlIGFwcHJvcHJpYXRlIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLmNhY2hlQWNjb3VudChiYXNlQWNjb3VudCk7XHJcbiAgICAgICAgdGhpcy5jYWNoZU5hdGl2ZVRva2VucyhyZXNwb25zZSwgcmVxdWVzdCwgaG9tZUFjY291bnRJZGVudGlmaWVyLCBpZFRva2VuQ2xhaW1zLCByZXNwb25zZS5hY2Nlc3NfdG9rZW4sIHJlc3VsdC50ZW5hbnRJZCwgcmVxVGltZXN0YW1wKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBjcmVhdGVzIGFuIGhvbWVBY2NvdW50SWRlbnRpZmllciBmb3IgdGhlIGFjY291bnRcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5PYmpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUhvbWVBY2NvdW50SWRlbnRpZmllcihyZXNwb25zZSwgaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgIC8vIFNhdmUgYWNjb3VudCBpbiBicm93c2VyIHN0b3JhZ2VcclxuICAgICAgICBjb25zdCBob21lQWNjb3VudElkZW50aWZpZXIgPSBBY2NvdW50RW50aXR5LmdlbmVyYXRlSG9tZUFjY291bnRJZChyZXNwb25zZS5jbGllbnRfaW5mbyB8fCBDb25zdGFudHMuRU1QVFlfU1RSSU5HLCBBdXRob3JpdHlUeXBlLkRlZmF1bHQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJDcnlwdG8sIGlkVG9rZW5DbGFpbXMpO1xyXG4gICAgICAgIHJldHVybiBob21lQWNjb3VudElkZW50aWZpZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciB0byBnZW5lcmF0ZSBzY29wZXNcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlU2NvcGVzKHJlc3BvbnNlLCByZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnNjb3BlXHJcbiAgICAgICAgICAgID8gU2NvcGVTZXQuZnJvbVN0cmluZyhyZXNwb25zZS5zY29wZSlcclxuICAgICAgICAgICAgOiBTY29wZVNldC5mcm9tU3RyaW5nKHJlcXVlc3Quc2NvcGUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBQb1AgdG9rZW4gaXMgcmVxdWVzcmVkLCByZWNvcmRzIHRoZSBQb1AgdG9rZW4gaWYgcmV0dXJuZWQgZnJvbSB0aGUgV0FNLCBlbHNlIGdlbmVyYXRlcyBvbmUgaW4gdGhlIGJyb3dzZXJcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2VuZXJhdGVQb3BBY2Nlc3NUb2tlbihyZXNwb25zZSwgcmVxdWVzdCkge1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LnRva2VuVHlwZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QICYmXHJcbiAgICAgICAgICAgIHJlcXVlc3Quc2lnblBvcFRva2VuKSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBUaGlzIGNvZGUgcHJpb3JpdGl6ZXMgU0hSIHJldHVybmVkIGZyb20gdGhlIG5hdGl2ZSBsYXllci4gSW4gY2FzZSBvZiBlcnJvci9TSFIgbm90IGNhbGN1bGF0ZWQgZnJvbSBXQU0gYW5kIHRoZSBBVFxyXG4gICAgICAgICAgICAgKiBpcyBzdGlsbCByZWNlaXZlZCwgU0hSIGlzIGNhbGN1bGF0ZWQgbG9jYWxseVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmF0aXZlIGxheWVyIHJldHVybmVkIGFuIFNIUiB0b2tlblxyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc2hyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcImhhbmRsZU5hdGl2ZVNlcnZlclJlc3BvbnNlOiBTSFIgaXMgZW5hYmxlZCBpbiBuYXRpdmUgbGF5ZXJcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc2hyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIFNIUiBpbiBtc2FsIGpzIGlmIFdBTSBkb2VzIG5vdCBjb21wdXRlIGl0IHdoZW4gUE9QIGlzIGVuYWJsZWRcclxuICAgICAgICAgICAgY29uc3QgcG9wVG9rZW5HZW5lcmF0b3IgPSBuZXcgUG9wVG9rZW5HZW5lcmF0b3IodGhpcy5icm93c2VyQ3J5cHRvKTtcclxuICAgICAgICAgICAgY29uc3Qgc2hyUGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICAgIHJlc291cmNlUmVxdWVzdE1ldGhvZDogcmVxdWVzdC5yZXNvdXJjZVJlcXVlc3RNZXRob2QsXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RVcmk6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0VXJpLFxyXG4gICAgICAgICAgICAgICAgc2hyQ2xhaW1zOiByZXF1ZXN0LnNockNsYWltcyxcclxuICAgICAgICAgICAgICAgIHNock5vbmNlOiByZXF1ZXN0LnNock5vbmNlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogS2V5SUQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBuYXRpdmUgcmVxdWVzdCBmcm9tIHdoZW4gdGhlIFBvUCBrZXkgd2FzIGdlbmVyYXRlZCBpbiBvcmRlciBmb3JcclxuICAgICAgICAgICAgICogUG9wVG9rZW5HZW5lcmF0b3IgdG8gcXVlcnkgdGhlIGZ1bGwga2V5IGZvciBzaWduaW5nXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoIXJlcXVlc3Qua2V5SWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy5rZXlJZE1pc3NpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwb3BUb2tlbkdlbmVyYXRvci5zaWduUG9wVG9rZW4ocmVzcG9uc2UuYWNjZXNzX3Rva2VuLCByZXF1ZXN0LmtleUlkLCBzaHJQYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5hY2Nlc3NfdG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYXV0aGVudGljYXRpb24gcmVzdWx0XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlbk9ialxyXG4gICAgICogQHBhcmFtIGFjY291bnRFbnRpdHlcclxuICAgICAqIEBwYXJhbSBhdXRob3JpdHlcclxuICAgICAqIEBwYXJhbSByZXFUaW1lc3RhbXBcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlQXV0aGVudGljYXRpb25SZXN1bHQocmVzcG9uc2UsIHJlcXVlc3QsIGlkVG9rZW5DbGFpbXMsIGFjY291bnRFbnRpdHksIGF1dGhvcml0eSwgcmVxVGltZXN0YW1wKSB7XHJcbiAgICAgICAgLy8gQWRkIE5hdGl2ZSBCcm9rZXIgZmllbGRzIHRvIFRlbGVtZXRyeVxyXG4gICAgICAgIGNvbnN0IG1hdHMgPSB0aGlzLmFkZFRlbGVtZXRyeUZyb21OYXRpdmVSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCByZXR1cm5lZCBpbiBzZXJ2ZXIgcmVzcG9uc2UsIHVzZSByZXF1ZXN0IHNjb3Blc1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU2NvcGVzID0gcmVzcG9uc2Uuc2NvcGVcclxuICAgICAgICAgICAgPyBTY29wZVNldC5mcm9tU3RyaW5nKHJlc3BvbnNlLnNjb3BlKVxyXG4gICAgICAgICAgICA6IFNjb3BlU2V0LmZyb21TdHJpbmcocmVxdWVzdC5zY29wZSk7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudFByb3BlcnRpZXMgPSByZXNwb25zZS5hY2NvdW50LnByb3BlcnRpZXMgfHwge307XHJcbiAgICAgICAgY29uc3QgdWlkID0gYWNjb3VudFByb3BlcnRpZXNbXCJVSURcIl0gfHxcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltcy5vaWQgfHxcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltcy5zdWIgfHxcclxuICAgICAgICAgICAgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICBjb25zdCB0aWQgPSBhY2NvdW50UHJvcGVydGllc1tcIlRlbmFudElkXCJdIHx8XHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXMudGlkIHx8XHJcbiAgICAgICAgICAgIENvbnN0YW50cy5FTVBUWV9TVFJJTkc7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudEluZm8gPSB1cGRhdGVBY2NvdW50VGVuYW50UHJvZmlsZURhdGEoYWNjb3VudEVudGl0eS5nZXRBY2NvdW50SW5mbygpLCB1bmRlZmluZWQsIC8vIHRlbmFudFByb2ZpbGUgb3B0aW9uYWxcclxuICAgICAgICBpZFRva2VuQ2xhaW1zLCByZXNwb25zZS5pZF90b2tlbik7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW4gcGFpcndpc2UgYnJva2VyIGZsb3dzLCB0aGlzIGNoZWNrIHByZXZlbnRzIHRoZSBicm9rZXIncyBuYXRpdmUgYWNjb3VudCBpZFxyXG4gICAgICAgICAqIGZyb20gYmVpbmcgcmV0dXJuZWQgb3ZlciB0aGUgZW1iZWRkZWQgYXBwJ3MgYWNjb3VudCBpZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoYWNjb3VudEluZm8ubmF0aXZlQWNjb3VudElkICE9PSByZXNwb25zZS5hY2NvdW50LmlkKSB7XHJcbiAgICAgICAgICAgIGFjY291bnRJbmZvLm5hdGl2ZUFjY291bnRJZCA9IHJlc3BvbnNlLmFjY291bnQuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGdlbmVyYXRlIFBvUCB0b2tlbiBhcyBuZWVkZWRcclxuICAgICAgICBjb25zdCByZXNwb25zZUFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVBvcEFjY2Vzc1Rva2VuKHJlc3BvbnNlLCByZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCB0b2tlblR5cGUgPSByZXF1ZXN0LnRva2VuVHlwZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QXHJcbiAgICAgICAgICAgID8gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QXHJcbiAgICAgICAgICAgIDogQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHksXHJcbiAgICAgICAgICAgIHVuaXF1ZUlkOiB1aWQsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0aWQsXHJcbiAgICAgICAgICAgIHNjb3BlczogcmVzcG9uc2VTY29wZXMuYXNBcnJheSgpLFxyXG4gICAgICAgICAgICBhY2NvdW50OiBhY2NvdW50SW5mbyxcclxuICAgICAgICAgICAgaWRUb2tlbjogcmVzcG9uc2UuaWRfdG9rZW4sXHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXM6IGlkVG9rZW5DbGFpbXMsXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZUFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICBmcm9tQ2FjaGU6IG1hdHMgPyB0aGlzLmlzUmVzcG9uc2VGcm9tQ2FjaGUobWF0cykgOiBmYWxzZSxcclxuICAgICAgICAgICAgZXhwaXJlc09uOiBuZXcgRGF0ZShOdW1iZXIocmVxVGltZXN0YW1wICsgcmVzcG9uc2UuZXhwaXJlc19pbikgKiAxMDAwKSxcclxuICAgICAgICAgICAgdG9rZW5UeXBlOiB0b2tlblR5cGUsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgc3RhdGU6IHJlc3BvbnNlLnN0YXRlLFxyXG4gICAgICAgICAgICBmcm9tTmF0aXZlQnJva2VyOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogY2FjaGUgdGhlIGFjY291bnQgZW50aXR5IGluIGJyb3dzZXIgc3RvcmFnZVxyXG4gICAgICogQHBhcmFtIGFjY291bnRFbnRpdHlcclxuICAgICAqL1xyXG4gICAgY2FjaGVBY2NvdW50KGFjY291bnRFbnRpdHkpIHtcclxuICAgICAgICAvLyBTdG9yZSB0aGUgYWNjb3VudCBpbmZvIGFuZCBoZW5jZSBgbmF0aXZlQWNjb3VudElkYCBpbiBicm93c2VyIGNhY2hlXHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRBY2NvdW50KGFjY291bnRFbnRpdHkpO1xyXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgY2FjaGVkIHRva2VucyBmb3IgdGhpcyBhY2NvdW50IGluIGJyb3dzZXIgc3RvcmFnZVxyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlQWNjb3VudENvbnRleHQoYWNjb3VudEVudGl0eSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIGFjY291bnQgY29udGV4dCBmcm9tIGJyb3dzZXIgc3RvcmFnZS4gJHtlfWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9yZXMgdGhlIGFjY2Vzc190b2tlbiBhbmQgaWRfdG9rZW4gaW4gaW5tZW1vcnkgc3RvcmFnZVxyXG4gICAgICogQHBhcmFtIHJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGhvbWVBY2NvdW50SWRlbnRpZmllclxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5PYmpcclxuICAgICAqIEBwYXJhbSByZXNwb25zZUFjY2Vzc1Rva2VuXHJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWRcclxuICAgICAqIEBwYXJhbSByZXFUaW1lc3RhbXBcclxuICAgICAqL1xyXG4gICAgY2FjaGVOYXRpdmVUb2tlbnMocmVzcG9uc2UsIHJlcXVlc3QsIGhvbWVBY2NvdW50SWRlbnRpZmllciwgaWRUb2tlbkNsYWltcywgcmVzcG9uc2VBY2Nlc3NUb2tlbiwgdGVuYW50SWQsIHJlcVRpbWVzdGFtcCkge1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZElkVG9rZW4gPSBDYWNoZUhlbHBlcnMuY3JlYXRlSWRUb2tlbkVudGl0eShob21lQWNjb3VudElkZW50aWZpZXIsIHJlcXVlc3QuYXV0aG9yaXR5LCByZXNwb25zZS5pZF90b2tlbiB8fCBcIlwiLCByZXF1ZXN0LmNsaWVudElkLCBpZFRva2VuQ2xhaW1zLnRpZCB8fCBcIlwiKTtcclxuICAgICAgICAvLyBjYWNoZSBhY2Nlc3NUb2tlbiBpbiBpbm1lbW9yeSBzdG9yYWdlXHJcbiAgICAgICAgY29uc3QgZXhwaXJlc0luID0gcmVxdWVzdC50b2tlblR5cGUgPT09IEF1dGhlbnRpY2F0aW9uU2NoZW1lLlBPUFxyXG4gICAgICAgICAgICA/IENvbnN0YW50cy5TSFJfTk9OQ0VfVkFMSURJVFlcclxuICAgICAgICAgICAgOiAodHlwZW9mIHJlc3BvbnNlLmV4cGlyZXNfaW4gPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocmVzcG9uc2UuZXhwaXJlc19pbiwgMTApXHJcbiAgICAgICAgICAgICAgICA6IHJlc3BvbnNlLmV4cGlyZXNfaW4pIHx8IDA7XHJcbiAgICAgICAgY29uc3QgdG9rZW5FeHBpcmF0aW9uU2Vjb25kcyA9IHJlcVRpbWVzdGFtcCArIGV4cGlyZXNJbjtcclxuICAgICAgICBjb25zdCByZXNwb25zZVNjb3BlcyA9IHRoaXMuZ2VuZXJhdGVTY29wZXMocmVzcG9uc2UsIHJlcXVlc3QpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEFjY2Vzc1Rva2VuID0gQ2FjaGVIZWxwZXJzLmNyZWF0ZUFjY2Vzc1Rva2VuRW50aXR5KGhvbWVBY2NvdW50SWRlbnRpZmllciwgcmVxdWVzdC5hdXRob3JpdHksIHJlc3BvbnNlQWNjZXNzVG9rZW4sIHJlcXVlc3QuY2xpZW50SWQsIGlkVG9rZW5DbGFpbXMudGlkIHx8IHRlbmFudElkLCByZXNwb25zZVNjb3Blcy5wcmludFNjb3BlcygpLCB0b2tlbkV4cGlyYXRpb25TZWNvbmRzLCAwLCBiYXNlNjREZWNvZGUsIHVuZGVmaW5lZCwgcmVxdWVzdC50b2tlblR5cGUsIHVuZGVmaW5lZCwgcmVxdWVzdC5rZXlJZCk7XHJcbiAgICAgICAgY29uc3QgbmF0aXZlQ2FjaGVSZWNvcmQgPSB7XHJcbiAgICAgICAgICAgIGlkVG9rZW46IGNhY2hlZElkVG9rZW4sXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBjYWNoZWRBY2Nlc3NUb2tlbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZvaWQgdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlci5zYXZlQ2FjaGVSZWNvcmQobmF0aXZlQ2FjaGVSZWNvcmQsIHJlcXVlc3Quc3RvcmVJbkNhY2hlKTtcclxuICAgIH1cclxuICAgIGFkZFRlbGVtZXRyeUZyb21OYXRpdmVSZXNwb25zZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IG1hdHMgPSB0aGlzLmdldE1BVFNGcm9tUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIGlmICghbWF0cykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe1xyXG4gICAgICAgICAgICBleHRlbnNpb25JZDogdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlci5nZXRFeHRlbnNpb25JZCgpLFxyXG4gICAgICAgICAgICBleHRlbnNpb25WZXJzaW9uOiB0aGlzLm5hdGl2ZU1lc3NhZ2VIYW5kbGVyLmdldEV4dGVuc2lvblZlcnNpb24oKSxcclxuICAgICAgICAgICAgbWF0c0Jyb2tlclZlcnNpb246IG1hdHMuYnJva2VyX3ZlcnNpb24sXHJcbiAgICAgICAgICAgIG1hdHNBY2NvdW50Sm9pbk9uU3RhcnQ6IG1hdHMuYWNjb3VudF9qb2luX29uX3N0YXJ0LFxyXG4gICAgICAgICAgICBtYXRzQWNjb3VudEpvaW5PbkVuZDogbWF0cy5hY2NvdW50X2pvaW5fb25fZW5kLFxyXG4gICAgICAgICAgICBtYXRzRGV2aWNlSm9pbjogbWF0cy5kZXZpY2Vfam9pbixcclxuICAgICAgICAgICAgbWF0c1Byb21wdEJlaGF2aW9yOiBtYXRzLnByb21wdF9iZWhhdmlvcixcclxuICAgICAgICAgICAgbWF0c0FwaUVycm9yQ29kZTogbWF0cy5hcGlfZXJyb3JfY29kZSxcclxuICAgICAgICAgICAgbWF0c1VpVmlzaWJsZTogbWF0cy51aV92aXNpYmxlLFxyXG4gICAgICAgICAgICBtYXRzU2lsZW50Q29kZTogbWF0cy5zaWxlbnRfY29kZSxcclxuICAgICAgICAgICAgbWF0c1NpbGVudEJpU3ViQ29kZTogbWF0cy5zaWxlbnRfYmlfc3ViX2NvZGUsXHJcbiAgICAgICAgICAgIG1hdHNTaWxlbnRNZXNzYWdlOiBtYXRzLnNpbGVudF9tZXNzYWdlLFxyXG4gICAgICAgICAgICBtYXRzU2lsZW50U3RhdHVzOiBtYXRzLnNpbGVudF9zdGF0dXMsXHJcbiAgICAgICAgICAgIG1hdHNIdHRwU3RhdHVzOiBtYXRzLmh0dHBfc3RhdHVzLFxyXG4gICAgICAgICAgICBtYXRzSHR0cEV2ZW50Q291bnQ6IG1hdHMuaHR0cF9ldmVudF9jb3VudCxcclxuICAgICAgICB9LCB0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiBtYXRzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0ZXMgbmF0aXZlIHBsYXRmb3JtIHJlc3BvbnNlIGJlZm9yZSBwcm9jZXNzaW5nXHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGVOYXRpdmVSZXNwb25zZShyZXNwb25zZSkge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShcImFjY2Vzc190b2tlblwiKSAmJlxyXG4gICAgICAgICAgICByZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShcImlkX3Rva2VuXCIpICYmXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmhhc093blByb3BlcnR5KFwiY2xpZW50X2luZm9cIikgJiZcclxuICAgICAgICAgICAgcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJhY2NvdW50XCIpICYmXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmhhc093blByb3BlcnR5KFwic2NvcGVcIikgJiZcclxuICAgICAgICAgICAgcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoXCJleHBpcmVzX2luXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUF1dGhFcnJvcihBdXRoRXJyb3JDb2Rlcy51bmV4cGVjdGVkRXJyb3IsIFwiUmVzcG9uc2UgbWlzc2luZyBleHBlY3RlZCBwcm9wZXJ0aWVzLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgTUFUUyB0ZWxlbWV0cnkgZnJvbSBuYXRpdmUgcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgZ2V0TUFUU0Zyb21SZXNwb25zZShyZXNwb25zZSkge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5wcm9wZXJ0aWVzLk1BVFMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlLnByb3BlcnRpZXMuTUFUUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBFcnJvciBwYXJzaW5nIE1BVFMgdGVsZW1ldHJ5LCByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHJlc3BvbnNlIGNhbWUgZnJvbSBuYXRpdmUgY2FjaGVcclxuICAgICAqIEBwYXJhbSByZXNwb25zZVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgaXNSZXNwb25zZUZyb21DYWNoZShtYXRzKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRzLmlzX2NhY2hlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBNQVRTIHRlbGVtZXRyeSBkb2VzIG5vdCBjb250YWluIGZpZWxkIGluZGljYXRpbmcgaWYgcmVzcG9uc2Ugd2FzIHNlcnZlZCBmcm9tIGNhY2hlLiBSZXR1cm5pbmcgZmFsc2UuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhIW1hdHMuaXNfY2FjaGVkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2xhdGVzIGRldmVsb3BlciBwcm92aWRlZCByZXF1ZXN0IG9iamVjdCBpbnRvIE5hdGl2ZVJlcXVlc3Qgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplTmF0aXZlUmVxdWVzdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGluaXRpYWxpemVOYXRpdmVSZXF1ZXN0IGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCByZXF1ZXN0QXV0aG9yaXR5ID0gcmVxdWVzdC5hdXRob3JpdHkgfHwgdGhpcy5jb25maWcuYXV0aC5hdXRob3JpdHk7XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuYWNjb3VudCkge1xyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhdXRob3JpdHlcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNjb3ZlcmVkQXV0aG9yaXR5KHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBdXRob3JpdHksXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6IHJlcXVlc3QuYXp1cmVDbG91ZE9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBhY2NvdW50OiByZXF1ZXN0LmFjY291bnQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjYW5vbmljYWxBdXRob3JpdHkgPSBuZXcgVXJsU3RyaW5nKHJlcXVlc3RBdXRob3JpdHkpO1xyXG4gICAgICAgIGNhbm9uaWNhbEF1dGhvcml0eS52YWxpZGF0ZUFzVXJpKCk7XHJcbiAgICAgICAgLy8gc2NvcGVzIGFyZSBleHBlY3RlZCB0byBiZSByZWNlaXZlZCBieSB0aGUgbmF0aXZlIGJyb2tlciBhcyBcInNjb3BlXCIgYW5kIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlcXVlc3QgYmVsb3cuIE90aGVyIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgZHJvcHBlZCBmcm9tIHRoZSByZXF1ZXN0IHRvIHRoZSBuYXRpdmUgYnJva2VyIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IGRlc3RydWN0dXJpbmcgaGVyZS5cclxuICAgICAgICBjb25zdCB7IHNjb3BlcywgLi4ucmVtYWluaW5nUHJvcGVydGllcyB9ID0gcmVxdWVzdDtcclxuICAgICAgICBjb25zdCBzY29wZVNldCA9IG5ldyBTY29wZVNldChzY29wZXMgfHwgW10pO1xyXG4gICAgICAgIHNjb3BlU2V0LmFwcGVuZFNjb3BlcyhPSURDX0RFRkFVTFRfU0NPUEVTKTtcclxuICAgICAgICBjb25zdCBnZXRQcm9tcHQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIElmIHJlcXVlc3QgaXMgc2lsZW50LCBwcm9tcHQgaXMgYWx3YXlzIG5vbmVcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmFwaUlkKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEFwaUlkLnNzb1NpbGVudDpcclxuICAgICAgICAgICAgICAgIGNhc2UgQXBpSWQuYWNxdWlyZVRva2VuU2lsZW50X3NpbGVudEZsb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJpbml0aWFsaXplTmF0aXZlUmVxdWVzdDogc2lsZW50IHJlcXVlc3Qgc2V0cyBwcm9tcHQgdG8gbm9uZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbXB0VmFsdWUuTk9ORTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBQcm9tcHQgbm90IHByb3ZpZGVkLCByZXF1ZXN0IG1heSBwcm9jZWVkIGFuZCBuYXRpdmUgYnJva2VyIGRlY2lkZXMgaWYgaXQgbmVlZHMgdG8gcHJvbXB0XHJcbiAgICAgICAgICAgIGlmICghcmVxdWVzdC5wcm9tcHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiaW5pdGlhbGl6ZU5hdGl2ZVJlcXVlc3Q6IHByb21wdCB3YXMgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJZiByZXF1ZXN0IGlzIGludGVyYWN0aXZlLCBjaGVjayBpZiBwcm9tcHQgcHJvdmlkZWQgaXMgYWxsb3dlZCB0byBnbyBkaXJlY3RseSB0byBuYXRpdmUgYnJva2VyXHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVxdWVzdC5wcm9tcHQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuTk9ORTpcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuQ09OU0VOVDpcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuTE9HSU46XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJpbml0aWFsaXplTmF0aXZlUmVxdWVzdDogcHJvbXB0IGlzIGNvbXBhdGlibGUgd2l0aCBuYXRpdmUgZmxvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5wcm9tcHQ7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBpbml0aWFsaXplTmF0aXZlUmVxdWVzdDogcHJvbXB0ID0gJHtyZXF1ZXN0LnByb21wdH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBuYXRpdmUgZmxvd2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IobmF0aXZlUHJvbXB0Tm90U3VwcG9ydGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgLi4ucmVtYWluaW5nUHJvcGVydGllcyxcclxuICAgICAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnRJZCxcclxuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogY2Fub25pY2FsQXV0aG9yaXR5LnVybFN0cmluZyxcclxuICAgICAgICAgICAgc2NvcGU6IHNjb3BlU2V0LnByaW50U2NvcGVzKCksXHJcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLmdldFJlZGlyZWN0VXJpKHJlcXVlc3QucmVkaXJlY3RVcmkpLFxyXG4gICAgICAgICAgICBwcm9tcHQ6IGdldFByb21wdCgpLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLmNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIHRva2VuVHlwZTogcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSxcclxuICAgICAgICAgICAgd2luZG93VGl0bGVTdWJzdHJpbmc6IGRvY3VtZW50LnRpdGxlLFxyXG4gICAgICAgICAgICBleHRyYVBhcmFtZXRlcnM6IHtcclxuICAgICAgICAgICAgICAgIC4uLnJlcXVlc3QuZXh0cmFRdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0LnRva2VuUXVlcnlQYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleHRlbmRlZEV4cGlyeVRva2VuOiBmYWxzZSxcclxuICAgICAgICAgICAga2V5SWQ6IHJlcXVlc3QucG9wS2lkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIFBvUCB0b2tlbiByZXF1ZXN0czogc2lnblBvcFRva2VuIHNob3VsZCBvbmx5IGJlIHNldCB0byB0cnVlIGlmIHBvcEtpZCBpcyBub3Qgc2V0XHJcbiAgICAgICAgaWYgKHZhbGlkYXRlZFJlcXVlc3Quc2lnblBvcFRva2VuICYmICEhcmVxdWVzdC5wb3BLaWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihpbnZhbGlkUG9wVG9rZW5SZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVFeHRyYUJyb2tlclBhcmFtcyh2YWxpZGF0ZWRSZXF1ZXN0KTtcclxuICAgICAgICB2YWxpZGF0ZWRSZXF1ZXN0LmV4dHJhUGFyYW1ldGVycyA9XHJcbiAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3QuZXh0cmFQYXJhbWV0ZXJzIHx8IHt9O1xyXG4gICAgICAgIHZhbGlkYXRlZFJlcXVlc3QuZXh0cmFQYXJhbWV0ZXJzLnRlbGVtZXRyeSA9XHJcbiAgICAgICAgICAgIE5hdGl2ZUNvbnN0YW50cy5NQVRTX1RFTEVNRVRSWTtcclxuICAgICAgICBpZiAocmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSA9PT0gQXV0aGVudGljYXRpb25TY2hlbWUuUE9QKSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCBQT1AgcmVxdWVzdCB0eXBlXHJcbiAgICAgICAgICAgIGNvbnN0IHNoclBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZVJlcXVlc3RVcmk6IHJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0VXJpLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VSZXF1ZXN0TWV0aG9kOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdE1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHNockNsYWltczogcmVxdWVzdC5zaHJDbGFpbXMsXHJcbiAgICAgICAgICAgICAgICBzaHJOb25jZTogcmVxdWVzdC5zaHJOb25jZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgcG9wVG9rZW5HZW5lcmF0b3IgPSBuZXcgUG9wVG9rZW5HZW5lcmF0b3IodGhpcy5icm93c2VyQ3J5cHRvKTtcclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgcmVxQ25mIGlmIG5vdCBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdFxyXG4gICAgICAgICAgICBsZXQgcmVxQ25mRGF0YTtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZWRSZXF1ZXN0LmtleUlkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0ZWRSZXFDbmZEYXRhID0gYXdhaXQgaW52b2tlQXN5bmMocG9wVG9rZW5HZW5lcmF0b3IuZ2VuZXJhdGVDbmYuYmluZChwb3BUb2tlbkdlbmVyYXRvciksIFBlcmZvcm1hbmNlRXZlbnRzLlBvcFRva2VuR2VuZXJhdGVDbmYsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHNoclBhcmFtZXRlcnMsIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSBnZW5lcmF0ZWRSZXFDbmZEYXRhLnJlcUNuZlN0cmluZztcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3Qua2V5SWQgPSBnZW5lcmF0ZWRSZXFDbmZEYXRhLmtpZDtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3Quc2lnblBvcFRva2VuID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcUNuZkRhdGEgPSB0aGlzLmJyb3dzZXJDcnlwdG8uYmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KHsga2lkOiB2YWxpZGF0ZWRSZXF1ZXN0LmtleUlkIH0pKTtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3Quc2lnblBvcFRva2VuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU1BBcyByZXF1aXJlIHdob2xlIHN0cmluZyB0byBiZSBwYXNzZWQgdG8gYnJva2VyXHJcbiAgICAgICAgICAgIHZhbGlkYXRlZFJlcXVlc3QucmVxQ25mID0gcmVxQ25mRGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRSZXF1ZXN0U0tVcyh2YWxpZGF0ZWRSZXF1ZXN0KTtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkUmVxdWVzdDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyBleHRyYSBicm9rZXIgcmVxdWVzdCBwYXJhbWV0ZXJzXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCB7TmF0aXZlVG9rZW5SZXF1ZXN0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgaGFuZGxlRXh0cmFCcm9rZXJQYXJhbXMocmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IGhhc0V4dHJhQnJva2VyUGFyYW1zID0gcmVxdWVzdC5leHRyYVBhcmFtZXRlcnMgJiZcclxuICAgICAgICAgICAgcmVxdWVzdC5leHRyYVBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoQUFEU2VydmVyUGFyYW1LZXlzLkJST0tFUl9DTElFTlRfSUQpICYmXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXh0cmFQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KEFBRFNlcnZlclBhcmFtS2V5cy5CUk9LRVJfUkVESVJFQ1RfVVJJKSAmJlxyXG4gICAgICAgICAgICByZXF1ZXN0LmV4dHJhUGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eShBQURTZXJ2ZXJQYXJhbUtleXMuQ0xJRU5UX0lEKTtcclxuICAgICAgICBpZiAoIXJlcXVlc3QuZW1iZWRkZWRDbGllbnRJZCAmJiAhaGFzRXh0cmFCcm9rZXJQYXJhbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2hpbGRfY2xpZW50X2lkID0gXCJcIjtcclxuICAgICAgICBjb25zdCBjaGlsZF9yZWRpcmVjdF91cmkgPSByZXF1ZXN0LnJlZGlyZWN0VXJpO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmVtYmVkZGVkQ2xpZW50SWQpIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5yZWRpcmVjdFVyaSA9IHRoaXMuY29uZmlnLmF1dGgucmVkaXJlY3RVcmk7XHJcbiAgICAgICAgICAgIGNoaWxkX2NsaWVudF9pZCA9IHJlcXVlc3QuZW1iZWRkZWRDbGllbnRJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5leHRyYVBhcmFtZXRlcnMpIHtcclxuICAgICAgICAgICAgcmVxdWVzdC5yZWRpcmVjdFVyaSA9XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmV4dHJhUGFyYW1ldGVyc1tBQURTZXJ2ZXJQYXJhbUtleXMuQlJPS0VSX1JFRElSRUNUX1VSSV07XHJcbiAgICAgICAgICAgIGNoaWxkX2NsaWVudF9pZCA9XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmV4dHJhUGFyYW1ldGVyc1tBQURTZXJ2ZXJQYXJhbUtleXMuQ0xJRU5UX0lEXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWVzdC5leHRyYVBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgIGNoaWxkX2NsaWVudF9pZCxcclxuICAgICAgICAgICAgY2hpbGRfcmVkaXJlY3RfdXJpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtcclxuICAgICAgICAgICAgZW1iZWRkZWRDbGllbnRJZDogY2hpbGRfY2xpZW50X2lkLFxyXG4gICAgICAgICAgICBlbWJlZGRlZFJlZGlyZWN0VXJpOiBjaGlsZF9yZWRpcmVjdF91cmksXHJcbiAgICAgICAgfSwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlSW50ZXJhY3Rpb25DbGllbnQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBOYXRpdmVDb25zdGFudHMsIE5hdGl2ZUV4dGVuc2lvbk1ldGhvZCB9IGZyb20gJy4uLy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzLCBjcmVhdGVBdXRoRXJyb3IsIEF1dGhFcnJvckNvZGVzLCBBdXRoZW50aWNhdGlvblNjaGVtZSB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZU5hdGl2ZUF1dGhFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9yL05hdGl2ZUF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGNyZWF0ZU5ld0d1aWQgfSBmcm9tICcuLi8uLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgbmF0aXZlSGFuZHNoYWtlVGltZW91dCwgbmF0aXZlRXh0ZW5zaW9uTm90SW5zdGFsbGVkIH0gZnJvbSAnLi4vLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBOYXRpdmVNZXNzYWdlSGFuZGxlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihsb2dnZXIsIGhhbmRzaGFrZVRpbWVvdXRNcywgcGVyZm9ybWFuY2VDbGllbnQsIGV4dGVuc2lvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5oYW5kc2hha2VUaW1lb3V0TXMgPSBoYW5kc2hha2VUaW1lb3V0TXM7XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25JZCA9IGV4dGVuc2lvbklkO1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZXJzID0gbmV3IE1hcCgpOyAvLyBVc2VkIGZvciBub24taGFuZHNoYWtlIG1lc3NhZ2VzXHJcbiAgICAgICAgdGhpcy5oYW5kc2hha2VSZXNvbHZlcnMgPSBuZXcgTWFwKCk7IC8vIFVzZWQgZm9yIGhhbmRzaGFrZSBtZXNzYWdlc1xyXG4gICAgICAgIHRoaXMubWVzc2FnZUNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcclxuICAgICAgICB0aGlzLndpbmRvd0xpc3RlbmVyID0gdGhpcy5vbldpbmRvd01lc3NhZ2UuYmluZCh0aGlzKTsgLy8gV2luZG93IGV2ZW50IGNhbGxiYWNrIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gJ3RoaXMnIHVubGVzcyBpdCdzIGJvdW5kXHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlRXZlbnQgPSBwZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLk5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2VuZHMgYSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBleHRlbnNpb24gYW5kIHJlc29sdmVzIHdpdGggdGhlIGV4dGVuc2lvbiByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIGJvZHlcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoYm9keSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiTmF0aXZlTWVzc2FnZUhhbmRsZXIgLSBzZW5kTWVzc2FnZSBjYWxsZWQuXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgICAgICAgY2hhbm5lbDogTmF0aXZlQ29uc3RhbnRzLkNIQU5ORUxfSUQsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbklkOiB0aGlzLmV4dGVuc2lvbklkLFxyXG4gICAgICAgICAgICByZXNwb25zZUlkOiBjcmVhdGVOZXdHdWlkKCksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIk5hdGl2ZU1lc3NhZ2VIYW5kbGVyIC0gU2VuZGluZyByZXF1ZXN0IHRvIGJyb3dzZXIgZXh0ZW5zaW9uXCIpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlUGlpKGBOYXRpdmVNZXNzYWdlSGFuZGxlciAtIFNlbmRpbmcgcmVxdWVzdCB0byBicm93c2VyIGV4dGVuc2lvbjogJHtKU09OLnN0cmluZ2lmeShyZXEpfWApO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZUNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UocmVxKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVycy5zZXQocmVxLnJlc3BvbnNlSWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBNZXNzYWdlSGFuZGxlciB0aGF0IGhhcyBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgYSBjb25uZWN0aW9uIHdpdGggYW4gZXh0ZW5zaW9uXHJcbiAgICAgKiBAcGFyYW0ge0xvZ2dlcn0gbG9nZ2VyXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZHNoYWtlVGltZW91dE1zXHJcbiAgICAgKiBAcGFyYW0ge0lQZXJmb3JtYW5jZUNsaWVudH0gcGVyZm9ybWFuY2VDbGllbnRcclxuICAgICAqIEBwYXJhbSB7SUNyeXB0b30gY3J5cHRvXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGVQcm92aWRlcihsb2dnZXIsIGhhbmRzaGFrZVRpbWVvdXRNcywgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICBsb2dnZXIudHJhY2UoXCJOYXRpdmVNZXNzYWdlSGFuZGxlciAtIGNyZWF0ZVByb3ZpZGVyIGNhbGxlZC5cIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcHJlZmVycmVkUHJvdmlkZXIgPSBuZXcgTmF0aXZlTWVzc2FnZUhhbmRsZXIobG9nZ2VyLCBoYW5kc2hha2VUaW1lb3V0TXMsIHBlcmZvcm1hbmNlQ2xpZW50LCBOYXRpdmVDb25zdGFudHMuUFJFRkVSUkVEX0VYVEVOU0lPTl9JRCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHByZWZlcnJlZFByb3ZpZGVyLnNlbmRIYW5kc2hha2VSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRQcm92aWRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gSWYgcHJlZmVycmVkIGV4dGVuc2lvbiBmYWlscyBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsYmFjayB0byB1c2luZyBhbnkgaW5zdGFsbGVkIGV4dGVuc2lvblxyXG4gICAgICAgICAgICBjb25zdCBiYWNrdXBQcm92aWRlciA9IG5ldyBOYXRpdmVNZXNzYWdlSGFuZGxlcihsb2dnZXIsIGhhbmRzaGFrZVRpbWVvdXRNcywgcGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICBhd2FpdCBiYWNrdXBQcm92aWRlci5zZW5kSGFuZHNoYWtlUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gYmFja3VwUHJvdmlkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kIGhhbmRzaGFrZSByZXF1ZXN0IGhlbHBlci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2VuZEhhbmRzaGFrZVJlcXVlc3QoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVNZXNzYWdlSGFuZGxlciAtIHNlbmRIYW5kc2hha2VSZXF1ZXN0IGNhbGxlZC5cIik7XHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhpcyBldmVudCBsaXN0ZW5lciBiZWZvcmUgc2VuZGluZyBoYW5kc2hha2VcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy53aW5kb3dMaXN0ZW5lciwgZmFsc2UpOyAvLyBmYWxzZSBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgY29udGVudCBzY3JpcHQgbWVzc2FnZSBwcm9jZXNzaW5nIHNob3VsZCB3b3JrIGZpcnN0XHJcbiAgICAgICAgY29uc3QgcmVxID0ge1xyXG4gICAgICAgICAgICBjaGFubmVsOiBOYXRpdmVDb25zdGFudHMuQ0hBTk5FTF9JRCxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uSWQ6IHRoaXMuZXh0ZW5zaW9uSWQsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlSWQ6IGNyZWF0ZU5ld0d1aWQoKSxcclxuICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBOYXRpdmVFeHRlbnNpb25NZXRob2QuSGFuZHNoYWtlUmVxdWVzdCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlRXZlbnQuYWRkKHtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uSWQ6IHRoaXMuZXh0ZW5zaW9uSWQsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbkhhbmRzaGFrZVRpbWVvdXRNczogdGhpcy5oYW5kc2hha2VUaW1lb3V0TXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5uZWxNZXNzYWdlKGV2ZW50KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShyZXEsIHdpbmRvdy5vcmlnaW4sIFt0aGlzLm1lc3NhZ2VDaGFubmVsLnBvcnQyXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kc2hha2VSZXNvbHZlcnMuc2V0KHJlcS5yZXNwb25zZUlkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcclxuICAgICAgICAgICAgdGhpcy50aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICogVGhyb3cgYW4gZXJyb3IgaWYgbmVpdGhlciBIYW5kc2hha2VSZXNwb25zZSBub3Igb3JpZ2luYWwgSGFuZHNoYWtlIHJlcXVlc3QgYXJlIHJlY2VpdmVkIGluIGEgcmVhc29uYWJsZSB0aW1lZnJhbWUuXHJcbiAgICAgICAgICAgICAgICAgKiBUaGlzIHR5cGljYWxseSBzdWdnZXN0cyBhbiBldmVudCBoYW5kbGVyIHN0b3BwZWQgcHJvcGFnYXRpb24gb2YgdGhlIEhhbmRzaGFrZSByZXF1ZXN0IGJ1dCBkaWQgbm90IHJlc3BvbmQgdG8gaXQgb24gdGhlIE1lc3NhZ2VDaGFubmVsIHBvcnRcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMud2luZG93TGlzdGVuZXIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5uZWwucG9ydDEuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5uZWwucG9ydDIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZHNoYWtlRXZlbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25IYW5kc2hha2VUaW1lZE91dDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IobmF0aXZlSGFuZHNoYWtlVGltZW91dCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kc2hha2VSZXNvbHZlcnMuZGVsZXRlKHJlcS5yZXNwb25zZUlkKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5oYW5kc2hha2VUaW1lb3V0TXMpOyAvLyBVc2UgYSByZWFzb25hYmxlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGhlcmVcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgbWVzc2FnZSBpcyBwb3N0ZWQgdG8gdGhlIHdpbmRvdy4gSWYgYSBoYW5kc2hha2UgcmVxdWVzdCBpcyByZWNlaXZlZCBpdCBtZWFucyB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBpbnN0YWxsZWQuXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgb25XaW5kb3dNZXNzYWdlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVNZXNzYWdlSGFuZGxlciAtIG9uV2luZG93TWVzc2FnZSBjYWxsZWRcIik7XHJcbiAgICAgICAgLy8gV2Ugb25seSBhY2NlcHQgbWVzc2FnZXMgZnJvbSBvdXJzZWx2ZXNcclxuICAgICAgICBpZiAoZXZlbnQuc291cmNlICE9PSB3aW5kb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQuZGF0YTtcclxuICAgICAgICBpZiAoIXJlcXVlc3QuY2hhbm5lbCB8fFxyXG4gICAgICAgICAgICByZXF1ZXN0LmNoYW5uZWwgIT09IE5hdGl2ZUNvbnN0YW50cy5DSEFOTkVMX0lEKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZXh0ZW5zaW9uSWQgJiYgcmVxdWVzdC5leHRlbnNpb25JZCAhPT0gdGhpcy5leHRlbnNpb25JZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkubWV0aG9kID09PSBOYXRpdmVFeHRlbnNpb25NZXRob2QuSGFuZHNoYWtlUmVxdWVzdCkge1xyXG4gICAgICAgICAgICBjb25zdCBoYW5kc2hha2VSZXNvbHZlciA9IHRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmdldChyZXF1ZXN0LnJlc3BvbnNlSWQpO1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBGaWx0ZXIgb3V0IHJlc3BvbnNlcyB3aXRoIG5vIG1hdGNoZWQgcmVzb2x2ZXJzIHNvb25lciB0byBrZWVwIGNoYW5uZWwgcG9ydHMgb3BlbiB3aGlsZSB3YWl0aW5nIGZvclxyXG4gICAgICAgICAgICAgKiB0aGUgcHJvcGVyIHJlc3BvbnNlLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKCFoYW5kc2hha2VSZXNvbHZlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYE5hdGl2ZU1lc3NhZ2VIYW5kbGVyLm9uV2luZG93TWVzc2FnZSAtIHJlc29sdmVyIGNhbid0IGJlIGZvdW5kIGZvciByZXF1ZXN0ICR7cmVxdWVzdC5yZXNwb25zZUlkfWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIElmIHdlIHJlY2VpdmUgdGhpcyBtZXNzYWdlIGJhY2sgaXQgbWVhbnMgbm8gZXh0ZW5zaW9uIGludGVyY2VwdGVkIHRoZSByZXF1ZXN0LCBtZWFuaW5nIG5vIGV4dGVuc2lvbiBzdXBwb3J0aW5nIGhhbmRzaGFrZSBwcm90b2NvbCBpcyBpbnN0YWxsZWRcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShyZXF1ZXN0LmV4dGVuc2lvbklkXHJcbiAgICAgICAgICAgICAgICA/IGBFeHRlbnNpb24gd2l0aCBpZDogJHtyZXF1ZXN0LmV4dGVuc2lvbklkfSBub3QgaW5zdGFsbGVkYFxyXG4gICAgICAgICAgICAgICAgOiBcIk5vIGV4dGVuc2lvbiBpbnN0YWxsZWRcIik7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUNoYW5uZWwucG9ydDEuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Mi5jbG9zZSgpO1xyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy53aW5kb3dMaXN0ZW5lciwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRzaGFrZUV2ZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbkluc3RhbGxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBoYW5kc2hha2VSZXNvbHZlci5yZWplY3QoY3JlYXRlQnJvd3NlckF1dGhFcnJvcihuYXRpdmVFeHRlbnNpb25Ob3RJbnN0YWxsZWQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgZXh0ZW5zaW9uIG9uIHRoZSBNZXNzYWdlQ2hhbm5lbCBwb3J0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgb25DaGFubmVsTWVzc2FnZShldmVudCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiTmF0aXZlTWVzc2FnZUhhbmRsZXIgLSBvbkNoYW5uZWxNZXNzYWdlIGNhbGxlZC5cIik7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LmRhdGE7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLnJlc29sdmVycy5nZXQocmVxdWVzdC5yZXNwb25zZUlkKTtcclxuICAgICAgICBjb25zdCBoYW5kc2hha2VSZXNvbHZlciA9IHRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmdldChyZXF1ZXN0LnJlc3BvbnNlSWQpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QuYm9keS5tZXRob2Q7XHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IE5hdGl2ZUV4dGVuc2lvbk1ldGhvZC5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVxdWVzdC5ib2R5LnJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJOYXRpdmVNZXNzYWdlSGFuZGxlciAtIFJlY2VpdmVkIHJlc3BvbnNlIGZyb20gYnJvd3NlciBleHRlbnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZVBpaShgTmF0aXZlTWVzc2FnZUhhbmRsZXIgLSBSZWNlaXZlZCByZXNwb25zZSBmcm9tIGJyb3dzZXIgZXh0ZW5zaW9uOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IFwiU3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNyZWF0ZU5hdGl2ZUF1dGhFcnJvcihyZXNwb25zZS5jb2RlLCByZXNwb25zZS5kZXNjcmlwdGlvbiwgcmVzcG9uc2UuZXh0KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5yZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0W1wiY29kZVwiXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bHRbXCJkZXNjcmlwdGlvblwiXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZWplY3QoY3JlYXRlTmF0aXZlQXV0aEVycm9yKHJlc3BvbnNlLnJlc3VsdFtcImNvZGVcIl0sIHJlc3BvbnNlLnJlc3VsdFtcImRlc2NyaXB0aW9uXCJdLCByZXNwb25zZS5yZXN1bHRbXCJleHRcIl0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUocmVzcG9uc2UucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVBdXRoRXJyb3IoQXV0aEVycm9yQ29kZXMudW5leHBlY3RlZEVycm9yLCBcIkV2ZW50IGRvZXMgbm90IGNvbnRhaW4gcmVzdWx0LlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJzLmRlbGV0ZShyZXF1ZXN0LnJlc3BvbnNlSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZCA9PT0gTmF0aXZlRXh0ZW5zaW9uTWV0aG9kLkhhbmRzaGFrZVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRzaGFrZVJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYE5hdGl2ZU1lc3NhZ2VIYW5kbGVyLm9uQ2hhbm5lbE1lc3NhZ2UgLSByZXNvbHZlciBjYW4ndCBiZSBmb3VuZCBmb3IgcmVxdWVzdCAke3JlcXVlc3QucmVzcG9uc2VJZH1gKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpOyAvLyBDbGVhciBzZXRUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy53aW5kb3dMaXN0ZW5lciwgZmFsc2UpOyAvLyBSZW1vdmUgJ05vIGV4dGVuc2lvbicgbGlzdGVuZXJcclxuICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uSWQgPSByZXF1ZXN0LmV4dGVuc2lvbklkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpb25WZXJzaW9uID0gcmVxdWVzdC5ib2R5LnZlcnNpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBOYXRpdmVNZXNzYWdlSGFuZGxlciAtIFJlY2VpdmVkIEhhbmRzaGFrZVJlc3BvbnNlIGZyb20gZXh0ZW5zaW9uOiAke3RoaXMuZXh0ZW5zaW9uSWR9YCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRzaGFrZUV2ZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uSW5zdGFsbGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGhhbmRzaGFrZVJlc29sdmVyLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmRlbGV0ZShyZXF1ZXN0LnJlc3BvbnNlSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgbWV0aG9kIGlzIG5vdCBSZXNwb25zZSBvciBIYW5kc2hha2VSZXNwb25zZVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiRXJyb3IgcGFyc2luZyByZXNwb25zZSBmcm9tIFdBTSBFeHRlbnNpb25cIik7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yUGlpKGBFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gV0FNIEV4dGVuc2lvbjogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yUGlpKGBVbmFibGUgdG8gcGFyc2UgJHtldmVudH1gKTtcclxuICAgICAgICAgICAgaWYgKHJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlci5yZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChoYW5kc2hha2VSZXNvbHZlcikge1xyXG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUmVzb2x2ZXIucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIElkIGZvciB0aGUgYnJvd3NlciBleHRlbnNpb24gdGhpcyBoYW5kbGVyIGlzIGNvbW11bmljYXRpbmcgd2l0aFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgZ2V0RXh0ZW5zaW9uSWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gZm9yIHRoZSBicm93c2VyIGV4dGVuc2lvbiB0aGlzIGhhbmRsZXIgaXMgY29tbXVuaWNhdGluZyB3aXRoXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRFeHRlbnNpb25WZXJzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV4dGVuc2lvblZlcnNpb247XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSByZXF1ZXN0IHNob3VsZCBhdHRlbXB0IHRvIHVzZSBuYXRpdmUgYnJva2VyXHJcbiAgICAgKiBAcGFyYW0gbG9nZ2VyXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0gbmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXJcclxuICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvblNjaGVtZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNOYXRpdmVBdmFpbGFibGUoY29uZmlnLCBsb2dnZXIsIG5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyLCBhdXRoZW50aWNhdGlvblNjaGVtZSkge1xyXG4gICAgICAgIGxvZ2dlci50cmFjZShcImlzTmF0aXZlQXZhaWxhYmxlIGNhbGxlZFwiKTtcclxuICAgICAgICBpZiAoIWNvbmZpZy5zeXN0ZW0uYWxsb3dOYXRpdmVCcm9rZXIpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKFwiaXNOYXRpdmVBdmFpbGFibGU6IGFsbG93TmF0aXZlQnJva2VyIGlzIG5vdCBlbmFibGVkLCByZXR1cm5pbmcgZmFsc2VcIik7XHJcbiAgICAgICAgICAgIC8vIERldmVsb3BlciBkaXNhYmxlZCBXQU1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyKSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImlzTmF0aXZlQXZhaWxhYmxlOiBXQU0gZXh0ZW5zaW9uIHByb3ZpZGVyIGlzIG5vdCBpbml0aWFsaXplZCwgcmV0dXJuaW5nIGZhbHNlXCIpO1xyXG4gICAgICAgICAgICAvLyBFeHRlbnNpb24gaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhdXRoZW50aWNhdGlvblNjaGVtZSkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uU2NoZW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEF1dGhlbnRpY2F0aW9uU2NoZW1lLkJFQVJFUjpcclxuICAgICAgICAgICAgICAgIGNhc2UgQXV0aGVudGljYXRpb25TY2hlbWUuUE9QOlxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShcImlzTmF0aXZlQXZhaWxhYmxlOiBhdXRoZW50aWNhdGlvblNjaGVtZSBpcyBzdXBwb3J0ZWQsIHJldHVybmluZyB0cnVlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJpc05hdGl2ZUF2YWlsYWJsZTogYXV0aGVudGljYXRpb25TY2hlbWUgaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJuaW5nIGZhbHNlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBOYXRpdmVNZXNzYWdlSGFuZGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlTWVzc2FnZUhhbmRsZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50cywgU2VydmVyRXJyb3IsIGludm9rZUFzeW5jLCBDY3NDcmVkZW50aWFsVHlwZSB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyB1c2VyQ2FuY2VsbGVkIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQWJzdHJhY3QgY2xhc3Mgd2hpY2ggZGVmaW5lcyBvcGVyYXRpb25zIGZvciBhIGJyb3dzZXIgaW50ZXJhY3Rpb24gaGFuZGxpbmcgY2xhc3MuXHJcbiAqL1xyXG5jbGFzcyBJbnRlcmFjdGlvbkhhbmRsZXIge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aENvZGVNb2R1bGUsIHN0b3JhZ2VJbXBsLCBhdXRoQ29kZVJlcXVlc3QsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICB0aGlzLmF1dGhNb2R1bGUgPSBhdXRoQ29kZU1vZHVsZTtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlID0gc3RvcmFnZUltcGw7XHJcbiAgICAgICAgdGhpcy5hdXRoQ29kZVJlcXVlc3QgPSBhdXRoQ29kZVJlcXVlc3Q7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiB0byBoYW5kbGUgcmVzcG9uc2UgcGFyYW1ldGVycyBmcm9tIGhhc2guXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25IYXNoXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGhhbmRsZUNvZGVSZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5IYW5kbGVDb2RlUmVzcG9uc2UsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgbGV0IGF1dGhDb2RlUmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXV0aENvZGVSZXNwb25zZSA9IHRoaXMuYXV0aE1vZHVsZS5oYW5kbGVGcmFnbWVudFJlc3BvbnNlKHJlc3BvbnNlLCByZXF1ZXN0LnN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgZS5zdWJFcnJvciA9PT0gdXNlckNhbmNlbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHNlcnZlciBlcnJvciBjYXVzZWQgYnkgdXNlciBjbG9zaW5nIG5hdGl2ZSBwcm9tcHQgdG8gY29ycmVzcG9uZGluZyBmaXJzdCBjbGFzcyBNU0FMIGVycm9yXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKHVzZXJDYW5jZWxsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW52b2tlQXN5bmModGhpcy5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkhhbmRsZUNvZGVSZXNwb25zZUZyb21TZXJ2ZXIsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGF1dGhDb2RlUmVzcG9uc2UsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzIGF1dGggY29kZSByZXNwb25zZSBmcm9tIEFBRFxyXG4gICAgICogQHBhcmFtIGF1dGhDb2RlUmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVxyXG4gICAgICogQHBhcmFtIG5ldHdvcmtNb2R1bGVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGhhbmRsZUNvZGVSZXNwb25zZUZyb21TZXJ2ZXIoYXV0aENvZGVSZXNwb25zZSwgcmVxdWVzdCwgdmFsaWRhdGVOb25jZSA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIkludGVyYWN0aW9uSGFuZGxlci5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBBc3NpZ24gY29kZSB0byByZXF1ZXN0XHJcbiAgICAgICAgdGhpcy5hdXRoQ29kZVJlcXVlc3QuY29kZSA9IGF1dGhDb2RlUmVzcG9uc2UuY29kZTtcclxuICAgICAgICAvLyBDaGVjayBmb3IgbmV3IGNsb3VkIGluc3RhbmNlXHJcbiAgICAgICAgaWYgKGF1dGhDb2RlUmVzcG9uc2UuY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGludm9rZUFzeW5jKHRoaXMuYXV0aE1vZHVsZS51cGRhdGVBdXRob3JpdHkuYmluZCh0aGlzLmF1dGhNb2R1bGUpLCBQZXJmb3JtYW5jZUV2ZW50cy5VcGRhdGVUb2tlbkVuZHBvaW50QXV0aG9yaXR5LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShhdXRoQ29kZVJlc3BvbnNlLmNsb3VkX2luc3RhbmNlX2hvc3RfbmFtZSwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTm9uY2UgdmFsaWRhdGlvbiBub3QgbmVlZGVkIHdoZW4gcmVkaXJlY3Qgbm90IGludm9sdmVkIChlLmcuIGh5YnJpZCBzcGEsIHJlbmV3aW5nIHRva2VuIHZpYSBydClcclxuICAgICAgICBpZiAodmFsaWRhdGVOb25jZSkge1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBBc3NpZ25pbmcgXCJyZXNwb25zZSBub25jZVwiIHRvIFwicmVxdWVzdCBub25jZVwiIGlzIGNvbmZ1c2luZy4gUmVmYWN0b3IgdGhlIGZ1bmN0aW9uIGRvaW5nIHZhbGlkYXRpb24gdG8gYWNjZXB0IHJlcXVlc3Qgbm9uY2UgZGlyZWN0bHlcclxuICAgICAgICAgICAgYXV0aENvZGVSZXNwb25zZS5ub25jZSA9IHJlcXVlc3Qubm9uY2UgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhdXRoQ29kZVJlc3BvbnNlLnN0YXRlID0gcmVxdWVzdC5zdGF0ZTtcclxuICAgICAgICAvLyBBZGQgQ0NTIHBhcmFtZXRlcnMgaWYgYXZhaWxhYmxlXHJcbiAgICAgICAgaWYgKGF1dGhDb2RlUmVzcG9uc2UuY2xpZW50X2luZm8pIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoQ29kZVJlcXVlc3QuY2xpZW50SW5mbyA9IGF1dGhDb2RlUmVzcG9uc2UuY2xpZW50X2luZm87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjY3NDcmVkID0gdGhpcy5jcmVhdGVDY3NDcmVkZW50aWFscyhyZXF1ZXN0KTtcclxuICAgICAgICAgICAgaWYgKGNjc0NyZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvZGVSZXF1ZXN0LmNjc0NyZWRlbnRpYWwgPSBjY3NDcmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFjcXVpcmUgdG9rZW4gd2l0aCByZXRyaWV2ZWQgY29kZS5cclxuICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gKGF3YWl0IGludm9rZUFzeW5jKHRoaXMuYXV0aE1vZHVsZS5hY3F1aXJlVG9rZW4uYmluZCh0aGlzLmF1dGhNb2R1bGUpLCBQZXJmb3JtYW5jZUV2ZW50cy5BdXRoQ2xpZW50QWNxdWlyZVRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKSh0aGlzLmF1dGhDb2RlUmVxdWVzdCwgYXV0aENvZGVSZXNwb25zZSkpO1xyXG4gICAgICAgIHJldHVybiB0b2tlblJlc3BvbnNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZCBjY3MgY3JlZHMgaWYgYXZhaWxhYmxlXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNjc0NyZWRlbnRpYWxzKHJlcXVlc3QpIHtcclxuICAgICAgICBpZiAocmVxdWVzdC5hY2NvdW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiByZXF1ZXN0LmFjY291bnQuaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IENjc0NyZWRlbnRpYWxUeXBlLkhPTUVfQUNDT1VOVF9JRCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5sb2dpbkhpbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWw6IHJlcXVlc3QubG9naW5IaW50LFxyXG4gICAgICAgICAgICAgICAgdHlwZTogQ2NzQ3JlZGVudGlhbFR5cGUuVVBOLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBJbnRlcmFjdGlvbkhhbmRsZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUludGVyYWN0aW9uSGFuZGxlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGV4dHJhY3RCcm93c2VyUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclByb3RvY29sVXRpbHMubWpzJztcbmltcG9ydCB7IGhhc2hFbXB0eUVycm9yLCBoYXNoRG9lc05vdENvbnRhaW5Lbm93blByb3BlcnRpZXMsIG5vU3RhdGVJbkhhc2gsIHVuYWJsZVRvUGFyc2VTdGF0ZSwgc3RhdGVJbnRlcmFjdGlvblR5cGVNaXNtYXRjaCB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVzZXJpYWxpemVSZXNwb25zZShyZXNwb25zZVN0cmluZywgcmVzcG9uc2VMb2NhdGlvbiwgbG9nZ2VyKSB7XHJcbiAgICAvLyBEZXNlcmlhbGl6ZSBoYXNoIGZyYWdtZW50IHJlc3BvbnNlIHBhcmFtZXRlcnMuXHJcbiAgICBjb25zdCBzZXJ2ZXJQYXJhbXMgPSBVcmxVdGlscy5nZXREZXNlcmlhbGl6ZWRSZXNwb25zZShyZXNwb25zZVN0cmluZyk7XHJcbiAgICBpZiAoIXNlcnZlclBhcmFtcykge1xyXG4gICAgICAgIGlmICghVXJsVXRpbHMuc3RyaXBMZWFkaW5nSGFzaE9yUXVlcnkocmVzcG9uc2VTdHJpbmcpKSB7XHJcbiAgICAgICAgICAgIC8vIEhhc2ggb3IgUXVlcnkgc3RyaW5nIGlzIGVtcHR5XHJcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgVGhlIHJlcXVlc3QgaGFzIHJldHVybmVkIHRvIHRoZSByZWRpcmVjdFVyaSBidXQgYSAke3Jlc3BvbnNlTG9jYXRpb259IGlzIG5vdCBwcmVzZW50LiBJdCdzIGxpa2VseSB0aGF0IHRoZSAke3Jlc3BvbnNlTG9jYXRpb259IGhhcyBiZWVuIHJlbW92ZWQgb3IgdGhlIHBhZ2UgaGFzIGJlZW4gcmVkaXJlY3RlZCBieSBjb2RlIHJ1bm5pbmcgb24gdGhlIHJlZGlyZWN0VXJpIHBhZ2UuYCk7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoaGFzaEVtcHR5RXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBBICR7cmVzcG9uc2VMb2NhdGlvbn0gaXMgcHJlc2VudCBpbiB0aGUgaWZyYW1lIGJ1dCBpdCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3BlcnRpZXMuIEl0J3MgbGlrZWx5IHRoYXQgdGhlICR7cmVzcG9uc2VMb2NhdGlvbn0gaGFzIGJlZW4gcmVwbGFjZWQgYnkgY29kZSBydW5uaW5nIG9uIHRoZSByZWRpcmVjdFVyaSBwYWdlLmApO1xyXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3JQaWkoYFRoZSAke3Jlc3BvbnNlTG9jYXRpb259IGRldGVjdGVkIGlzOiAke3Jlc3BvbnNlU3RyaW5nfWApO1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGhhc2hEb2VzTm90Q29udGFpbktub3duUHJvcGVydGllcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlcnZlclBhcmFtcztcclxufVxyXG4vKipcclxuICogUmV0dXJucyB0aGUgaW50ZXJhY3Rpb24gdHlwZSB0aGF0IHRoZSByZXNwb25zZSBvYmplY3QgYmVsb25ncyB0b1xyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvblR5cGUocmVzcG9uc2UsIGJyb3dzZXJDcnlwdG8sIGludGVyYWN0aW9uVHlwZSkge1xyXG4gICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9TdGF0ZUluSGFzaCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwbGF0Zm9ybVN0YXRlT2JqID0gZXh0cmFjdEJyb3dzZXJSZXF1ZXN0U3RhdGUoYnJvd3NlckNyeXB0bywgcmVzcG9uc2Uuc3RhdGUpO1xyXG4gICAgaWYgKCFwbGF0Zm9ybVN0YXRlT2JqKSB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcih1bmFibGVUb1BhcnNlU3RhdGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBsYXRmb3JtU3RhdGVPYmouaW50ZXJhY3Rpb25UeXBlICE9PSBpbnRlcmFjdGlvblR5cGUpIHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKHN0YXRlSW50ZXJhY3Rpb25UeXBlTWlzbWF0Y2gpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGRlc2VyaWFsaXplUmVzcG9uc2UsIHZhbGlkYXRlSW50ZXJhY3Rpb25UeXBlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNwb25zZUhhbmRsZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBPSURDX0RFRkFVTFRfU0NPUEVTLCBpbnZva2VBc3luYywgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZSwgVGhyb3R0bGluZ1V0aWxzLCBQcm90b2NvbFV0aWxzLCBBdXRoRXJyb3IsIFByb3RvY29sTW9kZSwgVXJsU3RyaW5nLCBTZXJ2ZXJSZXNwb25zZVR5cGUgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50IH0gZnJvbSAnLi9TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICcuLi9ldmVudC9FdmVudFR5cGUubWpzJztcbmltcG9ydCB7IEFwaUlkLCBJbnRlcmFjdGlvblR5cGUsIEJyb3dzZXJDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBwcmVjb25uZWN0LCBnZXRDdXJyZW50VXJpIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQubWpzJztcbmltcG9ydCB7IE5hdGl2ZU1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi4vYnJva2VyL25hdGl2ZUJyb2tlci9OYXRpdmVNZXNzYWdlSGFuZGxlci5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uX2hhbmRsZXIvSW50ZXJhY3Rpb25IYW5kbGVyLm1qcyc7XG5pbXBvcnQgeyBkZXNlcmlhbGl6ZVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UvUmVzcG9uc2VIYW5kbGVyLm1qcyc7XG5pbXBvcnQgeyBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQsIGVtcHR5TmF2aWdhdGVVcmksIHVzZXJDYW5jZWxsZWQsIGVtcHR5V2luZG93RXJyb3IsIHBvcHVwV2luZG93RXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFBvcHVwQ2xpZW50IGV4dGVuZHMgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHN0b3JhZ2VJbXBsLCBicm93c2VyQ3J5cHRvLCBsb2dnZXIsIGV2ZW50SGFuZGxlciwgbmF2aWdhdGlvbkNsaWVudCwgcGVyZm9ybWFuY2VDbGllbnQsIG5hdGl2ZVN0b3JhZ2VJbXBsLCBuYXRpdmVNZXNzYWdlSGFuZGxlciwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3RvcmFnZUltcGwsIGJyb3dzZXJDcnlwdG8sIGxvZ2dlciwgZXZlbnRIYW5kbGVyLCBuYXZpZ2F0aW9uQ2xpZW50LCBwZXJmb3JtYW5jZUNsaWVudCwgbmF0aXZlTWVzc2FnZUhhbmRsZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIC8vIFByb3Blcmx5IHNldHMgdGhpcyByZWZlcmVuY2UgZm9yIHRoZSB1bmxvYWQgZXZlbnQuXHJcbiAgICAgICAgdGhpcy51bmxvYWRXaW5kb3cgPSB0aGlzLnVubG9hZFdpbmRvdy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMubmF0aXZlU3RvcmFnZSA9IG5hdGl2ZVN0b3JhZ2VJbXBsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3F1aXJlcyB0b2tlbnMgYnkgb3BlbmluZyBhIHBvcHVwIHdpbmRvdyB0byB0aGUgL2F1dGhvcml6ZSBlbmRwb2ludCBvZiB0aGUgYXV0aG9yaXR5XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhY3F1aXJlVG9rZW4ocmVxdWVzdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcHVwTmFtZSA9IHRoaXMuZ2VuZXJhdGVQb3B1cE5hbWUocmVxdWVzdC5zY29wZXMgfHwgT0lEQ19ERUZBVUxUX1NDT1BFUywgcmVxdWVzdC5hdXRob3JpdHkgfHwgdGhpcy5jb25maWcuYXV0aC5hdXRob3JpdHkpO1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cFBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgIHBvcHVwTmFtZSxcclxuICAgICAgICAgICAgICAgIHBvcHVwV2luZG93QXR0cmlidXRlczogcmVxdWVzdC5wb3B1cFdpbmRvd0F0dHJpYnV0ZXMgfHwge30sXHJcbiAgICAgICAgICAgICAgICBwb3B1cFdpbmRvd1BhcmVudDogcmVxdWVzdC5wb3B1cFdpbmRvd1BhcmVudCA/PyB3aW5kb3csXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIGFzeW5jUG9wdXBzIGZsYWcgaXMgdHJ1ZS4gQWNxdWlyZXMgdG9rZW4gd2l0aG91dCBmaXJzdCBvcGVuaW5nIHBvcHVwLiBQb3B1cCB3aWxsIGJlIG9wZW5lZCBsYXRlciBhc3luY2hyb25vdXNseS5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnN5c3RlbS5hc3luY1BvcHVwcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImFzeW5jUG9wdXBzIHNldCB0byB0cnVlLCBhY3F1aXJpbmcgdG9rZW5cIik7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXNzZXMgb24gcG9wdXAgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgaWYgaW4gcmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuUG9wdXBBc3luYyhyZXF1ZXN0LCBwb3B1cFBhcmFtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhc3luY1BvcHVwcyBmbGFnIGlzIHNldCB0byBmYWxzZS4gT3BlbnMgcG9wdXAgYmVmb3JlIGFjcXVpcmluZyB0b2tlbi5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJhc3luY1BvcHVwIHNldCB0byBmYWxzZSwgb3BlbmluZyBwb3B1cCBiZWZvcmUgYWNxdWlyaW5nIHRva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgcG9wdXBQYXJhbXMucG9wdXAgPSB0aGlzLm9wZW5TaXplZFBvcHVwKFwiYWJvdXQ6YmxhbmtcIiwgcG9wdXBQYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuUG9wdXBBc3luYyhyZXF1ZXN0LCBwb3B1cFBhcmFtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIGxvY2FsIGNhY2hlIGZvciB0aGUgY3VycmVudCB1c2VyIHRoZW4gb3BlbnMgYSBwb3B1cCB3aW5kb3cgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHNpZ24tb3V0IG9mIHRoZSBzZXJ2ZXJcclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGxvZ291dChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImxvZ291dFBvcHVwIGNhbGxlZFwiKTtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRMb2dvdXRSZXF1ZXN0ID0gdGhpcy5pbml0aWFsaXplTG9nb3V0UmVxdWVzdChsb2dvdXRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgY29uc3QgcG9wdXBQYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICBwb3B1cE5hbWU6IHRoaXMuZ2VuZXJhdGVMb2dvdXRQb3B1cE5hbWUodmFsaWRMb2dvdXRSZXF1ZXN0KSxcclxuICAgICAgICAgICAgICAgIHBvcHVwV2luZG93QXR0cmlidXRlczogbG9nb3V0UmVxdWVzdD8ucG9wdXBXaW5kb3dBdHRyaWJ1dGVzIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgcG9wdXBXaW5kb3dQYXJlbnQ6IGxvZ291dFJlcXVlc3Q/LnBvcHVwV2luZG93UGFyZW50ID8/IHdpbmRvdyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgYXV0aG9yaXR5ID0gbG9nb3V0UmVxdWVzdCAmJiBsb2dvdXRSZXF1ZXN0LmF1dGhvcml0eTtcclxuICAgICAgICAgICAgY29uc3QgbWFpbldpbmRvd1JlZGlyZWN0VXJpID0gbG9nb3V0UmVxdWVzdCAmJiBsb2dvdXRSZXF1ZXN0Lm1haW5XaW5kb3dSZWRpcmVjdFVyaTtcclxuICAgICAgICAgICAgLy8gYXN5bmNQb3B1cHMgZmxhZyBpcyB0cnVlLiBBY3F1aXJlcyB0b2tlbiB3aXRob3V0IGZpcnN0IG9wZW5pbmcgcG9wdXAuIFBvcHVwIHdpbGwgYmUgb3BlbmVkIGxhdGVyIGFzeW5jaHJvbm91c2x5LlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc3lzdGVtLmFzeW5jUG9wdXBzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYXN5bmNQb3B1cHMgc2V0IHRvIHRydWVcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXNzZXMgb24gcG9wdXAgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgaWYgaW4gcmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nb3V0UG9wdXBBc3luYyh2YWxpZExvZ291dFJlcXVlc3QsIHBvcHVwUGFyYW1zLCBhdXRob3JpdHksIG1haW5XaW5kb3dSZWRpcmVjdFVyaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhc3luY1BvcHVwcyBmbGFnIGlzIHNldCB0byBmYWxzZS4gT3BlbnMgcG9wdXAgYmVmb3JlIGxvZ2dpbmcgb3V0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImFzeW5jUG9wdXAgc2V0IHRvIGZhbHNlLCBvcGVuaW5nIHBvcHVwXCIpO1xyXG4gICAgICAgICAgICAgICAgcG9wdXBQYXJhbXMucG9wdXAgPSB0aGlzLm9wZW5TaXplZFBvcHVwKFwiYWJvdXQ6YmxhbmtcIiwgcG9wdXBQYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nb3V0UG9wdXBBc3luYyh2YWxpZExvZ291dFJlcXVlc3QsIHBvcHVwUGFyYW1zLCBhdXRob3JpdHksIG1haW5XaW5kb3dSZWRpcmVjdFVyaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cyB3ZSBuZWVkIHRvIHJlamVjdFxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgd2hpY2ggb2J0YWlucyBhbiBhY2Nlc3NfdG9rZW4gZm9yIHlvdXIgQVBJIHZpYSBvcGVuaW5nIGEgcG9wdXAgd2luZG93IGluIHRoZSB1c2VyJ3MgYnJvd3NlclxyXG4gICAgICogQHBhcmFtIHZhbGlkUmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHBvcHVwTmFtZVxyXG4gICAgICogQHBhcmFtIHBvcHVwXHJcbiAgICAgKiBAcGFyYW0gcG9wdXBXaW5kb3dBdHRyaWJ1dGVzXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5Qb3B1cEFzeW5jKHJlcXVlc3QsIHBvcHVwUGFyYW1zKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImFjcXVpcmVUb2tlblBvcHVwQXN5bmMgY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZlclRlbGVtZXRyeU1hbmFnZXIgPSB0aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKEFwaUlkLmFjcXVpcmVUb2tlblBvcHVwKTtcclxuICAgICAgICBjb25zdCB2YWxpZFJlcXVlc3QgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCBJbnRlcmFjdGlvblR5cGUuUG9wdXApO1xyXG4gICAgICAgIHByZWNvbm5lY3QodmFsaWRSZXF1ZXN0LmF1dGhvcml0eSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGF1dGggY29kZSByZXF1ZXN0IGFuZCBnZW5lcmF0ZSBQS0NFIHBhcmFtc1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoQ29kZVJlcXVlc3QgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uQ29kZVJlcXVlc3QuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEluaXRpYWxpemVBdXRob3JpemF0aW9uQ29kZVJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNsaWVudFxyXG4gICAgICAgICAgICBjb25zdCBhdXRoQ2xpZW50ID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKHtcclxuICAgICAgICAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0QXV0aG9yaXR5OiB2YWxpZFJlcXVlc3QuYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOiB2YWxpZFJlcXVlc3QuYXp1cmVDbG91ZE9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6IHZhbGlkUmVxdWVzdC5leHRyYVF1ZXJ5UGFyYW1ldGVycyxcclxuICAgICAgICAgICAgICAgIGFjY291bnQ6IHZhbGlkUmVxdWVzdC5hY2NvdW50LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgaXNOYXRpdmVCcm9rZXIgPSBOYXRpdmVNZXNzYWdlSGFuZGxlci5pc05hdGl2ZUF2YWlsYWJsZSh0aGlzLmNvbmZpZywgdGhpcy5sb2dnZXIsIHRoaXMubmF0aXZlTWVzc2FnZUhhbmRsZXIsIHJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUpO1xyXG4gICAgICAgICAgICAvLyBTdGFydCBtZWFzdXJlbWVudCBmb3Igc2VydmVyIGNhbGxzIHdpdGggbmF0aXZlIGJyb2tlcmluZyBlbmFibGVkXHJcbiAgICAgICAgICAgIGxldCBmZXRjaE5hdGl2ZUFjY291bnRJZE1lYXN1cmVtZW50O1xyXG4gICAgICAgICAgICBpZiAoaXNOYXRpdmVCcm9rZXIpIHtcclxuICAgICAgICAgICAgICAgIGZldGNoTmF0aXZlQWNjb3VudElkTWVhc3VyZW1lbnQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5GZXRjaEFjY291bnRJZFdpdGhOYXRpdmVCcm9rZXIsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGFjcXVpcmUgdG9rZW4gdXJsLlxyXG4gICAgICAgICAgICBjb25zdCBuYXZpZ2F0ZVVybCA9IGF3YWl0IGF1dGhDbGllbnQuZ2V0QXV0aENvZGVVcmwoe1xyXG4gICAgICAgICAgICAgICAgLi4udmFsaWRSZXF1ZXN0LFxyXG4gICAgICAgICAgICAgICAgbmF0aXZlQnJva2VyOiBpc05hdGl2ZUJyb2tlcixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBwb3B1cCBpbnRlcmFjdGlvbiBoYW5kbGVyLlxyXG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkhhbmRsZXIgPSBuZXcgSW50ZXJhY3Rpb25IYW5kbGVyKGF1dGhDbGllbnQsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIGF1dGhDb2RlUmVxdWVzdCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICAvLyBTaG93IHRoZSBVSSBvbmNlIHRoZSB1cmwgaGFzIGJlZW4gY3JlYXRlZC4gR2V0IHRoZSB3aW5kb3cgaGFuZGxlIGZvciB0aGUgcG9wdXAuXHJcbiAgICAgICAgICAgIGNvbnN0IHBvcHVwV2luZG93ID0gdGhpcy5pbml0aWF0ZUF1dGhSZXF1ZXN0KG5hdmlnYXRlVXJsLCBwb3B1cFBhcmFtcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuUE9QVVBfT1BFTkVELCBJbnRlcmFjdGlvblR5cGUuUG9wdXAsIHsgcG9wdXBXaW5kb3cgfSwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vIE1vbml0b3IgdGhlIHdpbmRvdyBmb3IgdGhlIGhhc2guIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFuZCBjbG9zZSB0aGUgcG9wdXAgd2hlbiB0aGUgaGFzaCBpcyByZWNlaXZlZC4gRGVmYXVsdCB0aW1lb3V0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgdGhpcy5tb25pdG9yUG9wdXBGb3JIYXNoKHBvcHVwV2luZG93LCBwb3B1cFBhcmFtcy5wb3B1cFdpbmRvd1BhcmVudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlclBhcmFtcyA9IGludm9rZShkZXNlcmlhbGl6ZVJlc3BvbnNlLCBQZXJmb3JtYW5jZUV2ZW50cy5EZXNlcmlhbGl6ZVJlc3BvbnNlLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShyZXNwb25zZVN0cmluZywgdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGUsIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRocm90dGxlIGlmIGl0IGV4aXN0c1xyXG4gICAgICAgICAgICBUaHJvdHRsaW5nVXRpbHMucmVtb3ZlVGhyb3R0bGUodGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCwgYXV0aENvZGVSZXF1ZXN0KTtcclxuICAgICAgICAgICAgaWYgKHNlcnZlclBhcmFtcy5hY2NvdW50SWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJBY2NvdW50IGlkIGZvdW5kIGluIGhhc2gsIGNhbGxpbmcgV0FNIGZvciB0b2tlblwiKTtcclxuICAgICAgICAgICAgICAgIC8vIGVuZCBtZWFzdXJlbWVudCBmb3Igc2VydmVyIGNhbGwgd2l0aCBuYXRpdmUgYnJva2VyaW5nIGVuYWJsZWRcclxuICAgICAgICAgICAgICAgIGlmIChmZXRjaE5hdGl2ZUFjY291bnRJZE1lYXN1cmVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hOYXRpdmVBY2NvdW50SWRNZWFzdXJlbWVudC5lbmQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc05hdGl2ZUJyb2tlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IobmF0aXZlQ29ubmVjdGlvbk5vdEVzdGFibGlzaGVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUludGVyYWN0aW9uQ2xpZW50ID0gbmV3IE5hdGl2ZUludGVyYWN0aW9uQ2xpZW50KHRoaXMuY29uZmlnLCB0aGlzLmJyb3dzZXJTdG9yYWdlLCB0aGlzLmJyb3dzZXJDcnlwdG8sIHRoaXMubG9nZ2VyLCB0aGlzLmV2ZW50SGFuZGxlciwgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LCBBcGlJZC5hY3F1aXJlVG9rZW5Qb3B1cCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciwgc2VydmVyUGFyYW1zLmFjY291bnRJZCwgdGhpcy5uYXRpdmVTdG9yYWdlLCB2YWxpZFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVzZXJSZXF1ZXN0U3RhdGUgfSA9IFByb3RvY29sVXRpbHMucGFyc2VSZXF1ZXN0U3RhdGUodGhpcy5icm93c2VyQ3J5cHRvLCB2YWxpZFJlcXVlc3Quc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5hdGl2ZUludGVyYWN0aW9uQ2xpZW50LmFjcXVpcmVUb2tlbih7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRSZXF1ZXN0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB1c2VyUmVxdWVzdFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogdW5kZWZpbmVkLCAvLyBTZXJ2ZXIgc2hvdWxkIGhhbmRsZSB0aGUgcHJvbXB0LCBpZGVhbGx5IG5hdGl2ZSBicm9rZXIgY2FuIGRvIHRoaXMgcGFydCBzaWxlbnRseVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gSGFuZGxlIHJlc3BvbnNlIGZyb20gaGFzaCBzdHJpbmcuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGludGVyYWN0aW9uSGFuZGxlci5oYW5kbGVDb2RlUmVzcG9uc2Uoc2VydmVyUGFyYW1zLCB2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBDbG9zZSB0aGUgc3luY2hyb25vdXMgcG9wdXAgaWYgYW4gZXJyb3IgaXMgdGhyb3duIGJlZm9yZSB0aGUgd2luZG93IHVubG9hZCBldmVudCBpcyByZWdpc3RlcmVkXHJcbiAgICAgICAgICAgIHBvcHVwUGFyYW1zLnBvcHVwPy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNhY2hlRmFpbGVkUmVxdWVzdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWxpZFJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBwb3B1cE5hbWVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0QXV0aG9yaXR5XHJcbiAgICAgKiBAcGFyYW0gcG9wdXBcclxuICAgICAqIEBwYXJhbSBtYWluV2luZG93UmVkaXJlY3RVcmlcclxuICAgICAqIEBwYXJhbSBwb3B1cFdpbmRvd0F0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9nb3V0UG9wdXBBc3luYyh2YWxpZFJlcXVlc3QsIHBvcHVwUGFyYW1zLCByZXF1ZXN0QXV0aG9yaXR5LCBtYWluV2luZG93UmVkaXJlY3RVcmkpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwibG9nb3V0UG9wdXBBc3luYyBjYWxsZWRcIik7XHJcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dPVVRfU1RBUlQsIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgdmFsaWRSZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyID0gdGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihBcGlJZC5sb2dvdXRQb3B1cCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgY2FjaGUgb24gbG9nb3V0XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJDYWNoZU9uTG9nb3V0KHZhbGlkUmVxdWVzdC5hY2NvdW50KTtcclxuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY2xpZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGhDbGllbnQgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkoe1xyXG4gICAgICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBdXRob3JpdHk6IHJlcXVlc3RBdXRob3JpdHksXHJcbiAgICAgICAgICAgICAgICBhY2NvdW50OiB2YWxpZFJlcXVlc3QuYWNjb3VudCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXV0aENsaWVudC5hdXRob3JpdHkuZW5kU2Vzc2lvbkVuZHBvaW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZFJlcXVlc3QuYWNjb3VudD8uaG9tZUFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkUmVxdWVzdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmkgJiZcclxuICAgICAgICAgICAgICAgICAgICBhdXRoQ2xpZW50LmF1dGhvcml0eS5wcm90b2NvbE1vZGUgPT09IFByb3RvY29sTW9kZS5PSURDKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUFjY291bnQodmFsaWRSZXF1ZXN0LmFjY291bnQ/LmhvbWVBY2NvdW50SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuTE9HT1VUX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgdmFsaWRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbldpbmRvd1JlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpSWQ6IEFwaUlkLmxvZ291dFBvcHVwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogdGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0hpc3Rvcnk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVVybCA9IFVybFN0cmluZy5nZXRBYnNvbHV0ZVVybChtYWluV2luZG93UmVkaXJlY3RVcmksIGdldEN1cnJlbnRVcmkoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUludGVybmFsKGFic29sdXRlVXJsLCBuYXZpZ2F0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwUGFyYW1zLnBvcHVwPy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgbG9nb3V0IHN0cmluZyBhbmQgbmF2aWdhdGUgdXNlciB3aW5kb3cgdG8gbG9nb3V0LlxyXG4gICAgICAgICAgICBjb25zdCBsb2dvdXRVcmkgPSBhdXRoQ2xpZW50LmdldExvZ291dFVyaSh2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR09VVF9TVUNDRVNTLCBJbnRlcmFjdGlvblR5cGUuUG9wdXAsIHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgICAgIC8vIE9wZW4gdGhlIHBvcHVwIHdpbmRvdyB0byByZXF1ZXN0VXJsLlxyXG4gICAgICAgICAgICBjb25zdCBwb3B1cFdpbmRvdyA9IHRoaXMub3BlblBvcHVwKGxvZ291dFVyaSwgcG9wdXBQYXJhbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLlBPUFVQX09QRU5FRCwgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCB7IHBvcHVwV2luZG93IH0sIG51bGwpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1vbml0b3JQb3B1cEZvckhhc2gocG9wdXBXaW5kb3csIHBvcHVwUGFyYW1zLnBvcHVwV2luZG93UGFyZW50KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGFueSBlcnJvcnMgcmVsYXRlZCB0byBtb25pdG9yaW5nIHRoZSB3aW5kb3cuIFNlcnZlciBsb2dvdXQgaXMgYmVzdCBlZmZvcnRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChtYWluV2luZG93UmVkaXJlY3RVcmkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUlkOiBBcGlJZC5sb2dvdXRQb3B1cCxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICBub0hpc3Rvcnk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gVXJsU3RyaW5nLmdldEFic29sdXRlVXJsKG1haW5XaW5kb3dSZWRpcmVjdFVyaSwgZ2V0Q3VycmVudFVyaSgpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZWRpcmVjdGluZyBtYWluIHdpbmRvdyB0byB1cmwgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgUmVkaXJlY3RpbmcgbWFpbiB3aW5kb3cgdG86ICR7YWJzb2x1dGVVcmx9YCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVJbnRlcm5hbChhYnNvbHV0ZVVybCwgbmF2aWdhdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIk5vIG1haW4gd2luZG93IG5hdmlnYXRpb24gcmVxdWVzdGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzeW5jaHJvbm91cyBwb3B1cCBpZiBhbiBlcnJvciBpcyB0aHJvd24gYmVmb3JlIHRoZSB3aW5kb3cgdW5sb2FkIGV2ZW50IGlzIHJlZ2lzdGVyZWRcclxuICAgICAgICAgICAgcG9wdXBQYXJhbXMucG9wdXA/LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBlLnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIuY2FjaGVGYWlsZWRSZXF1ZXN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dPVVRfRkFJTFVSRSwgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dPVVRfRU5ELCBJbnRlcmFjdGlvblR5cGUuUG9wdXApO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR09VVF9FTkQsIEludGVyYWN0aW9uVHlwZS5Qb3B1cCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9wZW5zIGEgcG9wdXAgd2luZG93IHdpdGggZ2l2ZW4gcmVxdWVzdCBVcmwuXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFVybFxyXG4gICAgICovXHJcbiAgICBpbml0aWF0ZUF1dGhSZXF1ZXN0KHJlcXVlc3RVcmwsIHBhcmFtcykge1xyXG4gICAgICAgIC8vIENoZWNrIHRoYXQgcmVxdWVzdCB1cmwgaXMgbm90IGVtcHR5LlxyXG4gICAgICAgIGlmIChyZXF1ZXN0VXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm9QaWkoYE5hdmlnYXRlIHRvOiAke3JlcXVlc3RVcmx9YCk7XHJcbiAgICAgICAgICAgIC8vIE9wZW4gdGhlIHBvcHVwIHdpbmRvdyB0byByZXF1ZXN0VXJsLlxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuUG9wdXAocmVxdWVzdFVybCwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRocm93IGVycm9yIGlmIHJlcXVlc3QgVVJMIGlzIGVtcHR5LlxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIk5hdmlnYXRlIHVybCBpcyBlbXB0eVwiKTtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihlbXB0eU5hdmlnYXRlVXJpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1vbml0b3JzIGEgd2luZG93IHVudGlsIGl0IGxvYWRzIGEgdXJsIHdpdGggdGhlIHNhbWUgb3JpZ2luLlxyXG4gICAgICogQHBhcmFtIHBvcHVwV2luZG93IC0gd2luZG93IHRoYXQgaXMgYmVpbmcgbW9uaXRvcmVkXHJcbiAgICAgKiBAcGFyYW0gdGltZW91dCAtIHRpbWVvdXQgZm9yIHByb2Nlc3NpbmcgaGFzaCBvbmNlIHBvcHVwIGlzIHJlZGlyZWN0ZWQgYmFjayB0byBhcHBsaWNhdGlvblxyXG4gICAgICovXHJcbiAgICBtb25pdG9yUG9wdXBGb3JIYXNoKHBvcHVwV2luZG93LCBwb3B1cFdpbmRvd1BhcmVudCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJQb3B1cEhhbmRsZXIubW9uaXRvclBvcHVwRm9ySGFzaCAtIHBvbGxpbmcgc3RhcnRlZFwiKTtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFdpbmRvdyBpcyBjbG9zZWRcclxuICAgICAgICAgICAgICAgIGlmIChwb3B1cFdpbmRvdy5jbG9zZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gd2luZG93IGNsb3NlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKHVzZXJDYW5jZWxsZWQpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAgICogV2lsbCB0aHJvdyBpZiBjcm9zcyBvcmlnaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggc2hvdWxkIGJlIGNhdWdodCBhbmQgaWdub3JlZFxyXG4gICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIHdlIG5lZWQgdGhlIGludGVydmFsIHRvIGtlZXAgcnVubmluZyB3aGlsZSBvbiBTVFMgVUkuXHJcbiAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgaHJlZiA9IHBvcHVwV2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIGJsYW5rIHBhZ2VzIG9yIGNyb3NzIGRvbWFpblxyXG4gICAgICAgICAgICAgICAgaWYgKCFocmVmIHx8IGhyZWYgPT09IFwiYWJvdXQ6YmxhbmtcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGU7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9wdXBXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09PSBTZXJ2ZXJSZXNwb25zZVR5cGUuUVVFUlkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VTdHJpbmcgPSBwb3B1cFdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVN0cmluZyA9IHBvcHVwV2luZG93LmxvY2F0aW9uLmhhc2g7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gcG9wdXAgd2luZG93IGlzIG9uIHNhbWUgb3JpZ2luIGFzIGNhbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2VTdHJpbmcpO1xyXG4gICAgICAgICAgICB9LCB0aGlzLmNvbmZpZy5zeXN0ZW0ucG9sbEludGVydmFsTWlsbGlzZWNvbmRzKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhblBvcHVwKHBvcHVwV2luZG93LCBwb3B1cFdpbmRvd1BhcmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBoaWRkZW5cclxuICAgICAqXHJcbiAgICAgKiBDb25maWd1cmVzIHBvcHVwIHdpbmRvdyBmb3IgbG9naW4uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVybE5hdmlnYXRlXHJcbiAgICAgKiBAcGFyYW0gdGl0bGVcclxuICAgICAqIEBwYXJhbSBwb3BVcFdpZHRoXHJcbiAgICAgKiBAcGFyYW0gcG9wVXBIZWlnaHRcclxuICAgICAqIEBwYXJhbSBwb3B1cFdpbmRvd0F0dHJpYnV0ZXNcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIEBoaWRkZW5cclxuICAgICAqL1xyXG4gICAgb3BlblBvcHVwKHVybE5hdmlnYXRlLCBwb3B1cFBhcmFtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBwb3B1cFdpbmRvdztcclxuICAgICAgICAgICAgLy8gUG9wdXAgd2luZG93IHBhc3NlZCBpbiwgc2V0dGluZyB1cmwgdG8gbmF2aWdhdGUgdG9cclxuICAgICAgICAgICAgaWYgKHBvcHVwUGFyYW1zLnBvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICBwb3B1cFdpbmRvdyA9IHBvcHVwUGFyYW1zLnBvcHVwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgTmF2aWdhdGluZyBwb3B1cCB3aW5kb3cgdG86ICR7dXJsTmF2aWdhdGV9YCk7XHJcbiAgICAgICAgICAgICAgICBwb3B1cFdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsTmF2aWdhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwb3B1cFBhcmFtcy5wb3B1cCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gUG9wdXAgd2lsbCBiZSB1bmRlZmluZWQgaWYgaXQgd2FzIG5vdCBwYXNzZWQgaW5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYE9wZW5pbmcgcG9wdXAgd2luZG93IHRvOiAke3VybE5hdmlnYXRlfWApO1xyXG4gICAgICAgICAgICAgICAgcG9wdXBXaW5kb3cgPSB0aGlzLm9wZW5TaXplZFBvcHVwKHVybE5hdmlnYXRlLCBwb3B1cFBhcmFtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gUG9wdXAgd2lsbCBiZSBudWxsIGlmIHBvcHVwcyBhcmUgYmxvY2tlZFxyXG4gICAgICAgICAgICBpZiAoIXBvcHVwV2luZG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGVtcHR5V2luZG93RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwb3B1cFdpbmRvdy5mb2N1cykge1xyXG4gICAgICAgICAgICAgICAgcG9wdXBXaW5kb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRXaW5kb3cgPSBwb3B1cFdpbmRvdztcclxuICAgICAgICAgICAgcG9wdXBQYXJhbXMucG9wdXBXaW5kb3dQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCB0aGlzLnVubG9hZFdpbmRvdyk7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3B1cFdpbmRvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJlcnJvciBvcGVuaW5nIHBvcHVwIFwiICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKHBvcHVwV2luZG93RXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBwb3B1cCB3aW5kb3cgZGltZW5zaW9ucyBhbmQgcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB1cmxOYXZpZ2F0ZVxyXG4gICAgICogQHBhcmFtIHBvcHVwTmFtZVxyXG4gICAgICogQHBhcmFtIHBvcHVwV2luZG93QXR0cmlidXRlc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgb3BlblNpemVkUG9wdXAodXJsTmF2aWdhdGUsIHsgcG9wdXBOYW1lLCBwb3B1cFdpbmRvd0F0dHJpYnV0ZXMsIHBvcHVwV2luZG93UGFyZW50IH0pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBhZGRpbmcgd2luTGVmdCBhbmQgd2luVG9wIHRvIGFjY291bnQgZm9yIGR1YWwgbW9uaXRvclxyXG4gICAgICAgICAqIHVzaW5nIHNjcmVlbkxlZnQgYW5kIHNjcmVlblRvcCBmb3IgSUU4IGFuZCBlYXJsaWVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgd2luTGVmdCA9IHBvcHVwV2luZG93UGFyZW50LnNjcmVlbkxlZnRcclxuICAgICAgICAgICAgPyBwb3B1cFdpbmRvd1BhcmVudC5zY3JlZW5MZWZ0XHJcbiAgICAgICAgICAgIDogcG9wdXBXaW5kb3dQYXJlbnQuc2NyZWVuWDtcclxuICAgICAgICBjb25zdCB3aW5Ub3AgPSBwb3B1cFdpbmRvd1BhcmVudC5zY3JlZW5Ub3BcclxuICAgICAgICAgICAgPyBwb3B1cFdpbmRvd1BhcmVudC5zY3JlZW5Ub3BcclxuICAgICAgICAgICAgOiBwb3B1cFdpbmRvd1BhcmVudC5zY3JlZW5ZO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHdpbmRvdy5pbm5lcldpZHRoIGRpc3BsYXlzIGJyb3dzZXIgd2luZG93XCJzIGhlaWdodCBhbmQgd2lkdGggZXhjbHVkaW5nIHRvb2xiYXJzXHJcbiAgICAgICAgICogdXNpbmcgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIGZvciBJRTggYW5kIGVhcmxpZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHBvcHVwV2luZG93UGFyZW50LmlubmVyV2lkdGggfHxcclxuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgY29uc3Qgd2luSGVpZ2h0ID0gcG9wdXBXaW5kb3dQYXJlbnQuaW5uZXJIZWlnaHQgfHxcclxuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fFxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDtcclxuICAgICAgICBsZXQgd2lkdGggPSBwb3B1cFdpbmRvd0F0dHJpYnV0ZXMucG9wdXBTaXplPy53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gcG9wdXBXaW5kb3dBdHRyaWJ1dGVzLnBvcHVwU2l6ZT8uaGVpZ2h0O1xyXG4gICAgICAgIGxldCB0b3AgPSBwb3B1cFdpbmRvd0F0dHJpYnV0ZXMucG9wdXBQb3NpdGlvbj8udG9wO1xyXG4gICAgICAgIGxldCBsZWZ0ID0gcG9wdXBXaW5kb3dBdHRyaWJ1dGVzLnBvcHVwUG9zaXRpb24/LmxlZnQ7XHJcbiAgICAgICAgaWYgKCF3aWR0aCB8fCB3aWR0aCA8IDAgfHwgd2lkdGggPiB3aW5XaWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiRGVmYXVsdCBwb3B1cCB3aW5kb3cgd2lkdGggdXNlZC4gV2luZG93IHdpZHRoIG5vdCBjb25maWd1cmVkIG9yIGludmFsaWQuXCIpO1xyXG4gICAgICAgICAgICB3aWR0aCA9IEJyb3dzZXJDb25zdGFudHMuUE9QVVBfV0lEVEg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaGVpZ2h0IHx8IGhlaWdodCA8IDAgfHwgaGVpZ2h0ID4gd2luSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJEZWZhdWx0IHBvcHVwIHdpbmRvdyBoZWlnaHQgdXNlZC4gV2luZG93IGhlaWdodCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLlwiKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gQnJvd3NlckNvbnN0YW50cy5QT1BVUF9IRUlHSFQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdG9wIHx8IHRvcCA8IDAgfHwgdG9wID4gd2luSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJEZWZhdWx0IHBvcHVwIHdpbmRvdyB0b3AgcG9zaXRpb24gdXNlZC4gV2luZG93IHRvcCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLlwiKTtcclxuICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgoMCwgd2luSGVpZ2h0IC8gMiAtIEJyb3dzZXJDb25zdGFudHMuUE9QVVBfSEVJR0hUIC8gMiArIHdpblRvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGVmdCB8fCBsZWZ0IDwgMCB8fCBsZWZ0ID4gd2luV2lkdGgpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkRlZmF1bHQgcG9wdXAgd2luZG93IGxlZnQgcG9zaXRpb24gdXNlZC4gV2luZG93IGxlZnQgbm90IGNvbmZpZ3VyZWQgb3IgaW52YWxpZC5cIik7XHJcbiAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heCgwLCB3aW5XaWR0aCAvIDIgLSBCcm93c2VyQ29uc3RhbnRzLlBPUFVQX1dJRFRIIC8gMiArIHdpbkxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9wdXBXaW5kb3dQYXJlbnQub3Blbih1cmxOYXZpZ2F0ZSwgcG9wdXBOYW1lLCBgd2lkdGg9JHt3aWR0aH0sIGhlaWdodD0ke2hlaWdodH0sIHRvcD0ke3RvcH0sIGxlZnQ9JHtsZWZ0fSwgc2Nyb2xsYmFycz15ZXNgKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgY2FsbGJhY2sgdG8gdW5sb2FkIG1haW4gd2luZG93LlxyXG4gICAgICovXHJcbiAgICB1bmxvYWRXaW5kb3coZSkge1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UuY2xlYW5SZXF1ZXN0QnlJbnRlcmFjdGlvblR5cGUoSW50ZXJhY3Rpb25UeXBlLlBvcHVwKTtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50V2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFdpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHdWFyYW50ZWVzIGJyb3dzZXIgdW5sb2FkIHdpbGwgaGFwcGVuLCBzbyBubyBvdGhlciBlcnJvcnMgd2lsbCBiZSB0aHJvd24uXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgcG9wdXAsIHJlbW92ZXMgYW55IHN0YXRlIHZhcnMgY3JlYXRlZCBkdXJpbmcgcG9wdXAgY2FsbHMuXHJcbiAgICAgKiBAcGFyYW0gcG9wdXBXaW5kb3dcclxuICAgICAqL1xyXG4gICAgY2xlYW5Qb3B1cChwb3B1cFdpbmRvdywgcG9wdXBXaW5kb3dQYXJlbnQpIHtcclxuICAgICAgICAvLyBDbG9zZSB3aW5kb3cuXHJcbiAgICAgICAgcG9wdXBXaW5kb3cuY2xvc2UoKTtcclxuICAgICAgICAvLyBSZW1vdmUgd2luZG93IHVubG9hZCBmdW5jdGlvblxyXG4gICAgICAgIHBvcHVwV2luZG93UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy51bmxvYWRXaW5kb3cpO1xyXG4gICAgICAgIC8vIEludGVyYWN0aW9uIGlzIGNvbXBsZXRlZCAtIHJlbW92ZSBpbnRlcmFjdGlvbiBzdGF0dXMuXHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIG5hbWUgZm9yIHRoZSBwb3B1cCBiYXNlZCBvbiB0aGUgY2xpZW50IGlkIGFuZCByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gY2xpZW50SWRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlUG9wdXBOYW1lKHNjb3BlcywgYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgcmV0dXJuIGAke0Jyb3dzZXJDb25zdGFudHMuUE9QVVBfTkFNRV9QUkVGSVh9LiR7dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZH0uJHtzY29wZXMuam9pbihcIi1cIil9LiR7YXV0aG9yaXR5fS4ke3RoaXMuY29ycmVsYXRpb25JZH1gO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIG5hbWUgZm9yIHRoZSBwb3B1cCBiYXNlZCBvbiB0aGUgY2xpZW50IGlkIGFuZCByZXF1ZXN0IGZvciBsb2dvdXRzXHJcbiAgICAgKiBAcGFyYW0gY2xpZW50SWRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlTG9nb3V0UG9wdXBOYW1lKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBob21lQWNjb3VudElkID0gcmVxdWVzdC5hY2NvdW50ICYmIHJlcXVlc3QuYWNjb3VudC5ob21lQWNjb3VudElkO1xyXG4gICAgICAgIHJldHVybiBgJHtCcm93c2VyQ29uc3RhbnRzLlBPUFVQX05BTUVfUFJFRklYfS4ke3RoaXMuY29uZmlnLmF1dGguY2xpZW50SWR9LiR7aG9tZUFjY291bnRJZH0uJHt0aGlzLmNvcnJlbGF0aW9uSWR9YDtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBQb3B1cENsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG9wdXBDbGllbnQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRBdXRoRXJyb3IsIENsaWVudEF1dGhFcnJvckNvZGVzLCBTZXJ2ZXJFcnJvciwgaW52b2tlQXN5bmMsIFBlcmZvcm1hbmNlRXZlbnRzIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IFRlbXBvcmFyeUNhY2hlS2V5cywgQXBpSWQgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBlbXB0eU5hdmlnYXRlVXJpLCB1c2VyQ2FuY2VsbGVkIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBSZWRpcmVjdEhhbmRsZXIge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aENvZGVNb2R1bGUsIHN0b3JhZ2VJbXBsLCBhdXRoQ29kZVJlcXVlc3QsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQpIHtcclxuICAgICAgICB0aGlzLmF1dGhNb2R1bGUgPSBhdXRoQ29kZU1vZHVsZTtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlID0gc3RvcmFnZUltcGw7XHJcbiAgICAgICAgdGhpcy5hdXRoQ29kZVJlcXVlc3QgPSBhdXRoQ29kZVJlcXVlc3Q7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHBlcmZvcm1hbmNlQ2xpZW50O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWRpcmVjdHMgd2luZG93IHRvIGdpdmVuIFVSTC5cclxuICAgICAqIEBwYXJhbSB1cmxOYXZpZ2F0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWF0ZUF1dGhSZXF1ZXN0KHJlcXVlc3RVcmwsIHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdCBjYWxsZWRcIik7XHJcbiAgICAgICAgLy8gTmF2aWdhdGUgaWYgdmFsaWQgVVJMXHJcbiAgICAgICAgaWYgKHJlcXVlc3RVcmwpIHtcclxuICAgICAgICAgICAgLy8gQ2FjaGUgc3RhcnQgcGFnZSwgcmV0dXJucyB0byB0aGlzIHBhZ2UgYWZ0ZXIgcmVkaXJlY3RVcmkgaWYgbmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybCBpcyB0cnVlXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMucmVkaXJlY3RTdGFydFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogcmVkaXJlY3RTdGFydFBhZ2Ugc2V0LCBjYWNoaW5nIHN0YXJ0IHBhZ2VcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldFRlbXBvcmFyeUNhY2hlKFRlbXBvcmFyeUNhY2hlS2V5cy5PUklHSU5fVVJJLCBwYXJhbXMucmVkaXJlY3RTdGFydFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFNldCBpbnRlcmFjdGlvbiBzdGF0dXMgaW4gdGhlIGxpYnJhcnkuXHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0VGVtcG9yYXJ5Q2FjaGUoVGVtcG9yYXJ5Q2FjaGVLZXlzLkNPUlJFTEFUSU9OX0lELCB0aGlzLmF1dGhDb2RlUmVxdWVzdC5jb3JyZWxhdGlvbklkLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5jYWNoZUNvZGVSZXF1ZXN0KHRoaXMuYXV0aENvZGVSZXF1ZXN0KTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mb1BpaShgUmVkaXJlY3RIYW5kbGVyLmluaXRpYXRlQXV0aFJlcXVlc3Q6IE5hdmlnYXRlIHRvOiAke3JlcXVlc3RVcmx9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgYXBpSWQ6IEFwaUlkLmFjcXVpcmVUb2tlblJlZGlyZWN0LFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogcGFyYW1zLnJlZGlyZWN0VGltZW91dCxcclxuICAgICAgICAgICAgICAgIG5vSGlzdG9yeTogZmFsc2UsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIElmIG9uUmVkaXJlY3ROYXZpZ2F0ZSBpcyBpbXBsZW1lbnRlZCwgaW52b2tlIGl0IGFuZCBwcm92aWRlIHJlcXVlc3RVcmxcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMub25SZWRpcmVjdE5hdmlnYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogSW52b2tpbmcgb25SZWRpcmVjdE5hdmlnYXRlIGNhbGxiYWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGUgPSBwYXJhbXMub25SZWRpcmVjdE5hdmlnYXRlKHJlcXVlc3RVcmwpO1xyXG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuaW5nIGZhbHNlIGZyb20gb25SZWRpcmVjdE5hdmlnYXRlIHdpbGwgc3RvcCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBvblJlZGlyZWN0TmF2aWdhdGUgZGlkIG5vdCByZXR1cm4gZmFsc2UsIG5hdmlnYXRpbmdcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFyYW1zLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVFeHRlcm5hbChyZXF1ZXN0VXJsLCBuYXZpZ2F0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgd2luZG93IHRvIHJlcXVlc3QgVVJMXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiUmVkaXJlY3RIYW5kbGVyLmluaXRpYXRlQXV0aFJlcXVlc3Q6IE5hdmlnYXRpbmcgd2luZG93IHRvIG5hdmlnYXRlIHVybFwiKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHBhcmFtcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlRXh0ZXJuYWwocmVxdWVzdFVybCwgbmF2aWdhdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUaHJvdyBlcnJvciBpZiByZXF1ZXN0IFVSTCBpcyBlbXB0eS5cclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBOYXZpZ2F0ZSB1cmwgaXMgZW1wdHlcIik7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoZW1wdHlOYXZpZ2F0ZVVyaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgYXV0aG9yaXphdGlvbiBjb2RlIHJlc3BvbnNlIGluIHRoZSB3aW5kb3cuXHJcbiAgICAgKiBAcGFyYW0gaGFzaFxyXG4gICAgICovXHJcbiAgICBhc3luYyBoYW5kbGVDb2RlUmVzcG9uc2UocmVzcG9uc2UsIHN0YXRlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlJlZGlyZWN0SGFuZGxlci5oYW5kbGVDb2RlUmVzcG9uc2UgY2FsbGVkXCIpO1xyXG4gICAgICAgIC8vIEludGVyYWN0aW9uIGlzIGNvbXBsZXRlZCAtIHJlbW92ZSBpbnRlcmFjdGlvbiBzdGF0dXMuXHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgICAgIC8vIEhhbmRsZSBjb2RlIHJlc3BvbnNlLlxyXG4gICAgICAgIGNvbnN0IHN0YXRlS2V5ID0gdGhpcy5icm93c2VyU3RvcmFnZS5nZW5lcmF0ZVN0YXRlS2V5KHN0YXRlKTtcclxuICAgICAgICBjb25zdCByZXF1ZXN0U3RhdGUgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFRlbXBvcmFyeUNhY2hlKHN0YXRlS2V5KTtcclxuICAgICAgICBpZiAoIXJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoQ2xpZW50QXV0aEVycm9yQ29kZXMuc3RhdGVOb3RGb3VuZCwgXCJDYWNoZWQgU3RhdGVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhdXRoQ29kZVJlc3BvbnNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF1dGhDb2RlUmVzcG9uc2UgPSB0aGlzLmF1dGhNb2R1bGUuaGFuZGxlRnJhZ21lbnRSZXNwb25zZShyZXNwb25zZSwgcmVxdWVzdFN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgZS5zdWJFcnJvciA9PT0gdXNlckNhbmNlbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHNlcnZlciBlcnJvciBjYXVzZWQgYnkgdXNlciBjbG9zaW5nIG5hdGl2ZSBwcm9tcHQgdG8gY29ycmVzcG9uZGluZyBmaXJzdCBjbGFzcyBNU0FMIGVycm9yXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKHVzZXJDYW5jZWxsZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgY2FjaGVkIGl0ZW1zXHJcbiAgICAgICAgY29uc3Qgbm9uY2VLZXkgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdlbmVyYXRlTm9uY2VLZXkocmVxdWVzdFN0YXRlKTtcclxuICAgICAgICBjb25zdCBjYWNoZWROb25jZSA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VGVtcG9yYXJ5Q2FjaGUobm9uY2VLZXkpO1xyXG4gICAgICAgIC8vIEFzc2lnbiBjb2RlIHRvIHJlcXVlc3RcclxuICAgICAgICB0aGlzLmF1dGhDb2RlUmVxdWVzdC5jb2RlID0gYXV0aENvZGVSZXNwb25zZS5jb2RlO1xyXG4gICAgICAgIC8vIENoZWNrIGZvciBuZXcgY2xvdWQgaW5zdGFuY2VcclxuICAgICAgICBpZiAoYXV0aENvZGVSZXNwb25zZS5jbG91ZF9pbnN0YW5jZV9ob3N0X25hbWUpIHtcclxuICAgICAgICAgICAgYXdhaXQgaW52b2tlQXN5bmModGhpcy5hdXRoTW9kdWxlLnVwZGF0ZUF1dGhvcml0eS5iaW5kKHRoaXMuYXV0aE1vZHVsZSksIFBlcmZvcm1hbmNlRXZlbnRzLlVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHksIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmF1dGhDb2RlUmVxdWVzdC5jb3JyZWxhdGlvbklkKShhdXRoQ29kZVJlc3BvbnNlLmNsb3VkX2luc3RhbmNlX2hvc3RfbmFtZSwgdGhpcy5hdXRoQ29kZVJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF1dGhDb2RlUmVzcG9uc2Uubm9uY2UgPSBjYWNoZWROb25jZSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgYXV0aENvZGVSZXNwb25zZS5zdGF0ZSA9IHJlcXVlc3RTdGF0ZTtcclxuICAgICAgICAvLyBBZGQgQ0NTIHBhcmFtZXRlcnMgaWYgYXZhaWxhYmxlXHJcbiAgICAgICAgaWYgKGF1dGhDb2RlUmVzcG9uc2UuY2xpZW50X2luZm8pIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoQ29kZVJlcXVlc3QuY2xpZW50SW5mbyA9IGF1dGhDb2RlUmVzcG9uc2UuY2xpZW50X2luZm87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZWRDY3NDcmVkID0gdGhpcy5jaGVja0Njc0NyZWRlbnRpYWxzKCk7XHJcbiAgICAgICAgICAgIGlmIChjYWNoZWRDY3NDcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb2RlUmVxdWVzdC5jY3NDcmVkZW50aWFsID0gY2FjaGVkQ2NzQ3JlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBY3F1aXJlIHRva2VuIHdpdGggcmV0cmlldmVkIGNvZGUuXHJcbiAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IChhd2FpdCB0aGlzLmF1dGhNb2R1bGUuYWNxdWlyZVRva2VuKHRoaXMuYXV0aENvZGVSZXF1ZXN0LCBhdXRoQ29kZVJlc3BvbnNlKSk7XHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5jbGVhblJlcXVlc3RCeVN0YXRlKHN0YXRlKTtcclxuICAgICAgICByZXR1cm4gdG9rZW5SZXNwb25zZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG9va3MgdXAgY2NzIGNyZWRzIGluIHRoZSBjYWNoZVxyXG4gICAgICovXHJcbiAgICBjaGVja0Njc0NyZWRlbnRpYWxzKCkge1xyXG4gICAgICAgIC8vIExvb2sgdXAgY2NzIGNyZWRlbnRpYWwgaW4gdGVtcCBjYWNoZVxyXG4gICAgICAgIGNvbnN0IGNhY2hlZENjc0NyZWQgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFRlbXBvcmFyeUNhY2hlKFRlbXBvcmFyeUNhY2hlS2V5cy5DQ1NfQ1JFREVOVElBTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGNhY2hlZENjc0NyZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNhY2hlZENjc0NyZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhNb2R1bGUubG9nZ2VyLmVycm9yKFwiQ2FjaGUgY3JlZGVudGlhbCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoTW9kdWxlLmxvZ2dlci5lcnJvclBpaShgQ2FjaGUgY3JlZGVudGlhbCBjb3VsZCBub3QgYmUgcGFyc2VkOiAke2NhY2hlZENjc0NyZWR9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUmVkaXJlY3RIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWRpcmVjdEhhbmRsZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBpbnZva2VBc3luYywgUGVyZm9ybWFuY2VFdmVudHMsIEF1dGhFcnJvciwgQ29uc3RhbnRzLCBVcmxTdHJpbmcsIFVybFV0aWxzLCBQcm90b2NvbFV0aWxzLCBUaHJvdHRsaW5nVXRpbHMsIFByb3RvY29sTW9kZSwgU2VydmVyUmVzcG9uc2VUeXBlIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25UeXBlLCBBcGlJZCwgVGVtcG9yYXJ5Q2FjaGVLZXlzIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgUmVkaXJlY3RIYW5kbGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25faGFuZGxlci9SZWRpcmVjdEhhbmRsZXIubWpzJztcbmltcG9ydCB7IHJlcGxhY2VIYXNoLCBpc0luSWZyYW1lLCBnZXRIb21lcGFnZSwgY2xlYXJIYXNoLCBnZXRDdXJyZW50VXJpIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICcuLi9ldmVudC9FdmVudFR5cGUubWpzJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQubWpzJztcbmltcG9ydCB7IE5hdGl2ZU1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi4vYnJva2VyL25hdGl2ZUJyb2tlci9OYXRpdmVNZXNzYWdlSGFuZGxlci5tanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnRlcmFjdGlvblR5cGUgfSBmcm9tICcuLi9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IG5vU3RhdGVJbkhhc2gsIG5hdGl2ZUNvbm5lY3Rpb25Ob3RFc3RhYmxpc2hlZCwgbm9DYWNoZWRBdXRob3JpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblR5cGUoKSB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxyXG4gICAgICAgIHR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UgPT09IFwidW5kZWZpbmVkXCIgfHxcclxuICAgICAgICB0eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uRW50cmllcyA9IHdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKFwibmF2aWdhdGlvblwiKTtcclxuICAgIGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uRW50cmllcy5sZW5ndGhcclxuICAgICAgICA/IG5hdmlnYXRpb25FbnRyaWVzWzBdXHJcbiAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gbmF2aWdhdGlvbj8udHlwZTtcclxufVxyXG5jbGFzcyBSZWRpcmVjdENsaWVudCBleHRlbmRzIFN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBzdG9yYWdlSW1wbCwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIHBlcmZvcm1hbmNlQ2xpZW50LCBuYXRpdmVTdG9yYWdlSW1wbCwgbmF0aXZlTWVzc2FnZUhhbmRsZXIsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBzdXBlcihjb25maWcsIHN0b3JhZ2VJbXBsLCBicm93c2VyQ3J5cHRvLCBsb2dnZXIsIGV2ZW50SGFuZGxlciwgbmF2aWdhdGlvbkNsaWVudCwgcGVyZm9ybWFuY2VDbGllbnQsIG5hdGl2ZU1lc3NhZ2VIYW5kbGVyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLm5hdGl2ZVN0b3JhZ2UgPSBuYXRpdmVTdG9yYWdlSW1wbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVkaXJlY3RzIHRoZSBwYWdlIHRvIHRoZSAvYXV0aG9yaXplIGVuZHBvaW50IG9mIHRoZSBJRFBcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRSZXF1ZXN0ID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkocmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0KTtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnVwZGF0ZUNhY2hlRW50cmllcyh2YWxpZFJlcXVlc3Quc3RhdGUsIHZhbGlkUmVxdWVzdC5ub25jZSwgdmFsaWRSZXF1ZXN0LmF1dGhvcml0eSwgdmFsaWRSZXF1ZXN0LmxvZ2luSGludCB8fCBcIlwiLCB2YWxpZFJlcXVlc3QuYWNjb3VudCB8fCBudWxsKTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyID0gdGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihBcGlJZC5hY3F1aXJlVG9rZW5SZWRpcmVjdCk7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlQmFja0J1dHRvbiA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBDbGVhciB0ZW1wb3JhcnkgY2FjaGUgaWYgdGhlIGJhY2sgYnV0dG9uIGlzIGNsaWNrZWQgZHVyaW5nIHRoZSByZWRpcmVjdCBmbG93LlxyXG4gICAgICAgICAgICBpZiAoZXZlbnQucGVyc2lzdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiUGFnZSB3YXMgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGUuIENsZWFyaW5nIHRlbXBvcmFyeSBjYWNoZS5cIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLmNsZWFuUmVxdWVzdEJ5U3RhdGUodmFsaWRSZXF1ZXN0LnN0YXRlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuUkVTVE9SRV9GUk9NX0JGQ0FDSEUsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhdXRoIGNvZGUgcmVxdWVzdCBhbmQgZ2VuZXJhdGUgUEtDRSBwYXJhbXNcclxuICAgICAgICAgICAgY29uc3QgYXV0aENvZGVSZXF1ZXN0ID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKSh2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjbGllbnRcclxuICAgICAgICAgICAgY29uc3QgYXV0aENsaWVudCA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuY3JlYXRlQXV0aENvZGVDbGllbnQuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKSh7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEF1dGhvcml0eTogdmFsaWRSZXF1ZXN0LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczogdmFsaWRSZXF1ZXN0LmF6dXJlQ2xvdWRPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOiB2YWxpZFJlcXVlc3QuZXh0cmFRdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgICAgICBhY2NvdW50OiB2YWxpZFJlcXVlc3QuYWNjb3VudCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSByZWRpcmVjdCBpbnRlcmFjdGlvbiBoYW5kbGVyLlxyXG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkhhbmRsZXIgPSBuZXcgUmVkaXJlY3RIYW5kbGVyKGF1dGhDbGllbnQsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIGF1dGhDb2RlUmVxdWVzdCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYWNxdWlyZSB0b2tlbiB1cmwuXHJcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRlVXJsID0gYXdhaXQgYXV0aENsaWVudC5nZXRBdXRoQ29kZVVybCh7XHJcbiAgICAgICAgICAgICAgICAuLi52YWxpZFJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICBuYXRpdmVCcm9rZXI6IE5hdGl2ZU1lc3NhZ2VIYW5kbGVyLmlzTmF0aXZlQXZhaWxhYmxlKHRoaXMuY29uZmlnLCB0aGlzLmxvZ2dlciwgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciwgcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHRoaXMuZ2V0UmVkaXJlY3RTdGFydFBhZ2UocmVxdWVzdC5yZWRpcmVjdFN0YXJ0UGFnZSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYFJlZGlyZWN0IHN0YXJ0IHBhZ2U6ICR7cmVkaXJlY3RTdGFydFBhZ2V9YCk7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBpZiB0aGUgYmFjayBidXR0b24gaXMgY2xpY2tlZCBkdXJpbmcgdGhlIHJlZGlyZWN0IGZsb3cuXHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgaGFuZGxlQmFja0J1dHRvbik7XHJcbiAgICAgICAgICAgIC8vIFNob3cgdGhlIFVJIG9uY2UgdGhlIHVybCBoYXMgYmVlbiBjcmVhdGVkLiBSZXNwb25zZSB3aWxsIGNvbWUgYmFjayBpbiB0aGUgaGFzaCwgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGluIHRoZSBoYW5kbGVSZWRpcmVjdENhbGxiYWNrIGZ1bmN0aW9uLlxyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgaW50ZXJhY3Rpb25IYW5kbGVyLmluaXRpYXRlQXV0aFJlcXVlc3QobmF2aWdhdGVVcmwsIHtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25DbGllbnQ6IHRoaXMubmF2aWdhdGlvbkNsaWVudCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VGltZW91dDogdGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICByZWRpcmVjdFN0YXJ0UGFnZTogcmVkaXJlY3RTdGFydFBhZ2UsXHJcbiAgICAgICAgICAgICAgICBvblJlZGlyZWN0TmF2aWdhdGU6IHJlcXVlc3Qub25SZWRpcmVjdE5hdmlnYXRlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aC5vblJlZGlyZWN0TmF2aWdhdGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNhY2hlRmFpbGVkUmVxdWVzdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsIGhhbmRsZUJhY2tCdXR0b24pO1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLmNsZWFuUmVxdWVzdEJ5U3RhdGUodmFsaWRSZXF1ZXN0LnN0YXRlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBuYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsIGlzIHNldCwgYW5kOlxyXG4gICAgICogLSBpZiB0cnVlLCBwZXJmb3JtcyBsb2dpYyB0byBjYWNoZSBhbmQgbmF2aWdhdGVcclxuICAgICAqIC0gaWYgZmFsc2UsIGhhbmRsZXMgaGFzaCBzdHJpbmcgYW5kIHBhcnNlcyByZXNwb25zZVxyXG4gICAgICogQHBhcmFtIGhhc2gge3N0cmluZ30gdXJsIGhhc2hcclxuICAgICAqIEBwYXJhbSBwYXJlbnRNZWFzdXJlbWVudCB7SW5Qcm9ncmVzc1BlcmZvcm1hbmNlRXZlbnR9IHBhcmVudCBtZWFzdXJlbWVudFxyXG4gICAgICovXHJcbiAgICBhc3luYyBoYW5kbGVSZWRpcmVjdFByb21pc2UoaGFzaCA9IFwiXCIsIHBhcmVudE1lYXN1cmVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciA9IHRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoQXBpSWQuaGFuZGxlUmVkaXJlY3RQcm9taXNlKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYnJvd3NlclN0b3JhZ2UuaXNJbnRlcmFjdGlvbkluUHJvZ3Jlc3ModHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBpbiBwcm9ncmVzcywgcmV0dXJuaW5nIG51bGwuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgW3NlcnZlclBhcmFtcywgcmVzcG9uc2VTdHJpbmddID0gdGhpcy5nZXRSZWRpcmVjdFJlc3BvbnNlKGhhc2ggfHwgXCJcIik7XHJcbiAgICAgICAgICAgIGlmICghc2VydmVyUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb3QgYSByZWNvZ25pemVkIHNlcnZlciByZXNwb25zZSBoYXNoIG9yIGhhc2ggbm90IGFzc29jaWF0ZWQgd2l0aCBhIHJlZGlyZWN0IHJlcXVlc3RcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgZGlkIG5vdCBkZXRlY3QgYSByZXNwb25zZSBhcyBhIHJlc3VsdCBvZiBhIHJlZGlyZWN0LiBDbGVhbmluZyB0ZW1wb3JhcnkgY2FjaGUuXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5jbGVhblJlcXVlc3RCeUludGVyYWN0aW9uVHlwZShJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGluc3RydW1lbnQgXCJub19zZXJ2ZXJfcmVzcG9uc2VcIiBpZiB1c2VyIGNsaWNrZWQgYmFjayBidXR0b25cclxuICAgICAgICAgICAgICAgIGlmIChnZXROYXZpZ2F0aW9uVHlwZSgpICE9PSBcImJhY2tfZm9yd2FyZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TWVhc3VyZW1lbnQuZXZlbnQuZXJyb3JDb2RlID0gXCJub19zZXJ2ZXJfcmVzcG9uc2VcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJCYWNrIG5hdmlnYXRpb24gZXZlbnQgZGV0ZWN0ZWQuIE11dGluZyBub19zZXJ2ZXJfcmVzcG9uc2UgZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJZiBuYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsIGlzIHRydWUsIGdldCB0aGUgdXJsIHdoZXJlIHRoZSByZWRpcmVjdCByZXF1ZXN0IHdhcyBpbml0aWF0ZWRcclxuICAgICAgICAgICAgY29uc3QgbG9naW5SZXF1ZXN0VXJsID0gdGhpcy5icm93c2VyU3RvcmFnZS5nZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuT1JJR0lOX1VSSSwgdHJ1ZSkgfHwgQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgICAgICAgICAgY29uc3QgbG9naW5SZXF1ZXN0VXJsTm9ybWFsaXplZCA9IFVybFN0cmluZy5yZW1vdmVIYXNoRnJvbVVybChsb2dpblJlcXVlc3RVcmwpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VXJsTm9ybWFsaXplZCA9IFVybFN0cmluZy5yZW1vdmVIYXNoRnJvbVVybCh3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgICAgICAgICAgIGlmIChsb2dpblJlcXVlc3RVcmxOb3JtYWxpemVkID09PSBjdXJyZW50VXJsTm9ybWFsaXplZCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYXV0aC5uYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgb24gdGhlIHBhZ2Ugd2UgbmVlZCB0byBuYXZpZ2F0ZSB0byAtIGhhbmRsZSBoYXNoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ3VycmVudCBwYWdlIGlzIGxvZ2luUmVxdWVzdFVybCwgaGFuZGxpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9naW5SZXF1ZXN0VXJsLmluZGV4T2YoXCIjXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGN1cnJlbnQgaGFzaCB3aXRoIG5vbi1tc2FsIGhhc2gsIGlmIHByZXNlbnRcclxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlSGFzaChsb2dpblJlcXVlc3RVcmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlSGFzaFJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlUmVzcG9uc2Uoc2VydmVyUGFyYW1zLCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVIYXNoUmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbmZpZy5hdXRoLm5hdmlnYXRlVG9Mb2dpblJlcXVlc3RVcmwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJOYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsIHNldCB0byBmYWxzZSwgaGFuZGxpbmcgcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc0luSWZyYW1lKCkgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnN5c3RlbS5hbGxvd1JlZGlyZWN0SW5JZnJhbWUpIHtcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgKiBSZXR1cm5lZCBmcm9tIGF1dGhvcml0eSB1c2luZyByZWRpcmVjdCAtIG5lZWQgdG8gcGVyZm9ybSBuYXZpZ2F0aW9uIGJlZm9yZSBwcm9jZXNzaW5nIHJlc3BvbnNlXHJcbiAgICAgICAgICAgICAgICAgKiBDYWNoZSB0aGUgaGFzaCB0byBiZSByZXRyaWV2ZWQgYWZ0ZXIgdGhlIG5leHQgcmVkaXJlY3RcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuVVJMX0hBU0gsIHJlc3BvbnNlU3RyaW5nLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUlkOiBBcGlJZC5oYW5kbGVSZWRpcmVjdFByb21pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogdGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9IaXN0b3J5OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZWRpcmVjdCB0byB0aGUgc3RhcnQgcGFnZSBhbmQgbm90IHByb2Nlc3MgdGhlIGhhc2ggbm93LlxyXG4gICAgICAgICAgICAgICAgICogVGhlIHN0YXJ0IHBhZ2UgaXMgZXhwZWN0ZWQgdG8gYWxzbyBjYWxsIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSB3aGljaCB3aWxsIHByb2Nlc3MgdGhlIGhhc2ggaW4gb25lIG9mIHRoZSBjaGVja3MgYWJvdmUuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzSGFzaE9uUmVkaXJlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsb2dpblJlcXVlc3RVcmwgfHwgbG9naW5SZXF1ZXN0VXJsID09PSBcIm51bGxcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIGhvbWUgcGFnZSBpZiBsb2dpbiByZXF1ZXN0IHVybCBpcyBudWxsIChyZWFsIG51bGwgb3IgdGhlIHN0cmluZyBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvbWVwYWdlID0gZ2V0SG9tZXBhZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgaG9tZXBhZ2UgdW5kZXIgT1JJR0lOX1VSSSB0byBlbnN1cmUgY2FjaGVkIGhhc2ggaXMgcHJvY2Vzc2VkIG9uIGhvbWVwYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuT1JJR0lOX1VSSSwgaG9tZXBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoXCJVbmFibGUgdG8gZ2V0IHZhbGlkIGxvZ2luIHJlcXVlc3QgdXJsIGZyb20gY2FjaGUsIHJlZGlyZWN0aW5nIHRvIGhvbWUgcGFnZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSGFzaE9uUmVkaXJlY3QgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVJbnRlcm5hbChob21lcGFnZSwgbmF2aWdhdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gcGFnZSB0aGF0IGluaXRpYXRlZCB0aGUgcmVkaXJlY3QgcmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYE5hdmlnYXRpbmcgdG8gbG9naW5SZXF1ZXN0VXJsOiAke2xvZ2luUmVxdWVzdFVybH1gKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSGFzaE9uUmVkaXJlY3QgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVJbnRlcm5hbChsb2dpblJlcXVlc3RVcmwsIG5hdmlnYXRpb25PcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIElmIG5hdmlnYXRlSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZSwgaGFuZGxlIHRoZSBoYXNoIG5vd1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzSGFzaE9uUmVkaXJlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNhY2hlRmFpbGVkUmVxdWVzdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLmNsZWFuUmVxdWVzdEJ5SW50ZXJhY3Rpb25UeXBlKEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSByZXNwb25zZSBoYXNoIGZvciBhIHJlZGlyZWN0IHJlcXVlc3RcclxuICAgICAqIFJldHVybnMgbnVsbCBpZiBpbnRlcmFjdGlvblR5cGUgaW4gdGhlIHN0YXRlIHZhbHVlIGlzIG5vdCBcInJlZGlyZWN0XCIgb3IgdGhlIGhhc2ggZG9lcyBub3QgY29udGFpbiBrbm93biBwcm9wZXJ0aWVzXHJcbiAgICAgKiBAcGFyYW0gaGFzaFxyXG4gICAgICovXHJcbiAgICBnZXRSZWRpcmVjdFJlc3BvbnNlKHVzZXJQcm92aWRlZFJlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImdldFJlZGlyZWN0UmVzcG9uc2VIYXNoIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBHZXQgY3VycmVudCBsb2NhdGlvbiBoYXNoIGZyb20gd2luZG93IG9yIGNhY2hlLlxyXG4gICAgICAgIGxldCByZXNwb25zZVN0cmluZyA9IHVzZXJQcm92aWRlZFJlc3BvbnNlO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2VTdHJpbmcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlID09PVxyXG4gICAgICAgICAgICAgICAgU2VydmVyUmVzcG9uc2VUeXBlLlFVRVJZKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXNwb25zZSA9IFVybFV0aWxzLmdldERlc2VyaWFsaXplZFJlc3BvbnNlKHJlc3BvbnNlU3RyaW5nKTtcclxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25UeXBlKHJlc3BvbnNlLCB0aGlzLmJyb3dzZXJDcnlwdG8sIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEludGVyYWN0aW9uIHR5cGUgdmFsaWRhdGlvbiBmYWlsZWQgZHVlIHRvICR7ZS5lcnJvckNvZGV9OiAke2UuZXJyb3JNZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBcIlwiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhckhhc2god2luZG93KTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkhhc2ggY29udGFpbnMga25vd24gcHJvcGVydGllcywgcmV0dXJuaW5nIHJlc3BvbnNlIGhhc2hcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBbcmVzcG9uc2UsIHJlc3BvbnNlU3RyaW5nXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FjaGVkSGFzaCA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VGVtcG9yYXJ5Q2FjaGUoVGVtcG9yYXJ5Q2FjaGVLZXlzLlVSTF9IQVNILCB0cnVlKTtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5icm93c2VyU3RvcmFnZS5nZW5lcmF0ZUNhY2hlS2V5KFRlbXBvcmFyeUNhY2hlS2V5cy5VUkxfSEFTSCkpO1xyXG4gICAgICAgIGlmIChjYWNoZWRIYXNoKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gVXJsVXRpbHMuZ2V0RGVzZXJpYWxpemVkUmVzcG9uc2UoY2FjaGVkSGFzaCk7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkhhc2ggZG9lcyBub3QgY29udGFpbiBrbm93biBwcm9wZXJ0aWVzLCByZXR1cm5pbmcgY2FjaGVkIGhhc2hcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW3Jlc3BvbnNlLCBjYWNoZWRIYXNoXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW251bGwsIFwiXCJdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgaGFzaCBleGlzdHMgYW5kIGhhbmRsZXMgaW4gd2luZG93LlxyXG4gICAgICogQHBhcmFtIGhhc2hcclxuICAgICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBoYW5kbGVSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIpIHtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcnZlclBhcmFtcy5zdGF0ZTtcclxuICAgICAgICBpZiAoIXN0YXRlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9TdGF0ZUluSGFzaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhY2hlZFJlcXVlc3QgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldENhY2hlZFJlcXVlc3Qoc3RhdGUpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJoYW5kbGVSZXNwb25zZSBjYWxsZWQsIHJldHJpZXZlZCBjYWNoZWQgcmVxdWVzdFwiKTtcclxuICAgICAgICBpZiAoc2VydmVyUGFyYW1zLmFjY291bnRJZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQWNjb3VudCBpZCBmb3VuZCBpbiBoYXNoLCBjYWxsaW5nIFdBTSBmb3IgdG9rZW5cIik7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUludGVyYWN0aW9uQ2xpZW50ID0gbmV3IE5hdGl2ZUludGVyYWN0aW9uQ2xpZW50KHRoaXMuY29uZmlnLCB0aGlzLmJyb3dzZXJTdG9yYWdlLCB0aGlzLmJyb3dzZXJDcnlwdG8sIHRoaXMubG9nZ2VyLCB0aGlzLmV2ZW50SGFuZGxlciwgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LCBBcGlJZC5hY3F1aXJlVG9rZW5Qb3B1cCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciwgc2VydmVyUGFyYW1zLmFjY291bnRJZCwgdGhpcy5uYXRpdmVTdG9yYWdlLCBjYWNoZWRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHVzZXJSZXF1ZXN0U3RhdGUgfSA9IFByb3RvY29sVXRpbHMucGFyc2VSZXF1ZXN0U3RhdGUodGhpcy5icm93c2VyQ3J5cHRvLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVJbnRlcmFjdGlvbkNsaWVudFxyXG4gICAgICAgICAgICAgICAgLmFjcXVpcmVUb2tlbih7XHJcbiAgICAgICAgICAgICAgICAuLi5jYWNoZWRSZXF1ZXN0LFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6IHVzZXJSZXF1ZXN0U3RhdGUsXHJcbiAgICAgICAgICAgICAgICBwcm9tcHQ6IHVuZGVmaW5lZCwgLy8gU2VydmVyIHNob3VsZCBoYW5kbGUgdGhlIHByb21wdCwgaWRlYWxseSBuYXRpdmUgYnJva2VyIGNhbiBkbyB0aGlzIHBhcnQgc2lsZW50bHlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UuY2xlYW5SZXF1ZXN0QnlTdGF0ZShzdGF0ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBIYXNoIGNvbnRhaW5zIGtub3duIHByb3BlcnRpZXMgLSBoYW5kbGUgYW5kIHJldHVybiBpbiBjYWxsYmFja1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBdXRob3JpdHkgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldENhY2hlZEF1dGhvcml0eShzdGF0ZSk7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50QXV0aG9yaXR5KSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9DYWNoZWRBdXRob3JpdHlFcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF1dGhDbGllbnQgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMuY29ycmVsYXRpb25JZCkoeyBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLCByZXF1ZXN0QXV0aG9yaXR5OiBjdXJyZW50QXV0aG9yaXR5IH0pO1xyXG4gICAgICAgIFRocm90dGxpbmdVdGlscy5yZW1vdmVUaHJvdHRsZSh0aGlzLmJyb3dzZXJTdG9yYWdlLCB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCBjYWNoZWRSZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkhhbmRsZXIgPSBuZXcgUmVkaXJlY3RIYW5kbGVyKGF1dGhDbGllbnQsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIGNhY2hlZFJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICByZXR1cm4gaW50ZXJhY3Rpb25IYW5kbGVyLmhhbmRsZUNvZGVSZXNwb25zZShzZXJ2ZXJQYXJhbXMsIHN0YXRlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHRvIGxvZyBvdXQgdGhlIGN1cnJlbnQgdXNlciwgYW5kIHJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBwb3N0TG9nb3V0UmVkaXJlY3RVcmkuXHJcbiAgICAgKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byByZWRpcmVjdCB0aGUgdXNlciB0byBgd2luZG93LmxvY2F0aW9uLmhyZWZgLlxyXG4gICAgICogQHBhcmFtIGxvZ291dFJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9nb3V0KGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwibG9nb3V0UmVkaXJlY3QgY2FsbGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IHZhbGlkTG9nb3V0UmVxdWVzdCA9IHRoaXMuaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QobG9nb3V0UmVxdWVzdCk7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciA9IHRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoQXBpSWQubG9nb3V0KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR09VVF9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LCBsb2dvdXRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgY2FjaGUgb24gbG9nb3V0XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJDYWNoZU9uTG9nb3V0KHZhbGlkTG9nb3V0UmVxdWVzdC5hY2NvdW50KTtcclxuICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBhcGlJZDogQXBpSWQubG9nb3V0LFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogdGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICBub0hpc3Rvcnk6IGZhbHNlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoQ2xpZW50ID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLmNvcnJlbGF0aW9uSWQpKHtcclxuICAgICAgICAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0QXV0aG9yaXR5OiBsb2dvdXRSZXF1ZXN0ICYmIGxvZ291dFJlcXVlc3QuYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOiBsb2dvdXRSZXF1ZXN0Py5leHRyYVF1ZXJ5UGFyYW1ldGVycyxcclxuICAgICAgICAgICAgICAgIGFjY291bnQ6IChsb2dvdXRSZXF1ZXN0ICYmIGxvZ291dFJlcXVlc3QuYWNjb3VudCkgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGF1dGhDbGllbnQuYXV0aG9yaXR5LnByb3RvY29sTW9kZSA9PT0gUHJvdG9jb2xNb2RlLk9JREMpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXV0aENsaWVudC5hdXRob3JpdHkuZW5kU2Vzc2lvbkVuZHBvaW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZExvZ291dFJlcXVlc3QuYWNjb3VudD8uaG9tZUFjY291bnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlQWNjb3VudCh2YWxpZExvZ291dFJlcXVlc3QuYWNjb3VudD8uaG9tZUFjY291bnRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuTE9HT1VUX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCwgdmFsaWRMb2dvdXRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgbG9nb3V0IHN0cmluZyBhbmQgbmF2aWdhdGUgdXNlciB3aW5kb3cgdG8gbG9nb3V0LlxyXG4gICAgICAgICAgICBjb25zdCBsb2dvdXRVcmkgPSBhdXRoQ2xpZW50LmdldExvZ291dFVyaSh2YWxpZExvZ291dFJlcXVlc3QpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR09VVF9TVUNDRVNTLCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsIHZhbGlkTG9nb3V0UmVxdWVzdCk7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uUmVkaXJlY3ROYXZpZ2F0ZSBpcyBpbXBsZW1lbnRlZCwgYW5kIGludm9rZSBpdCBpZiBzb1xyXG4gICAgICAgICAgICBpZiAobG9nb3V0UmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIGxvZ291dFJlcXVlc3Qub25SZWRpcmVjdE5hdmlnYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRlID0gbG9nb3V0UmVxdWVzdC5vblJlZGlyZWN0TmF2aWdhdGUobG9nb3V0VXJpKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYXZpZ2F0ZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiTG9nb3V0IG9uUmVkaXJlY3ROYXZpZ2F0ZSBkaWQgbm90IHJldHVybiBmYWxzZSwgbmF2aWdhdGluZ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgaW50ZXJhY3Rpb24gaXMgaW4gcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3ModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUV4dGVybmFsKGxvZ291dFVyaSwgbmF2aWdhdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpbnRlcmFjdGlvbiBpcyBub3QgaW4gcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkxvZ291dCBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgaW50ZXJhY3Rpb24gaXMgaW4gcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5icm93c2VyU3RvcmFnZS5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlRXh0ZXJuYWwobG9nb3V0VXJpLCBuYXZpZ2F0aW9uT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlci5jYWNoZUZhaWxlZFJlcXVlc3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dPVVRfRkFJTFVSRSwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LCBudWxsLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dPVVRfRU5ELCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR09VVF9FTkQsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZSB0byBnZXQgdGhlIHJlZGlyZWN0U3RhcnRQYWdlIGVpdGhlciBmcm9tIHJlcXVlc3Qgb3IgdXNlIGN1cnJlbnQgd2luZG93XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFN0YXJ0UGFnZVxyXG4gICAgICovXHJcbiAgICBnZXRSZWRpcmVjdFN0YXJ0UGFnZShyZXF1ZXN0U3RhcnRQYWdlKSB7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RTdGFydFBhZ2UgPSByZXF1ZXN0U3RhcnRQYWdlIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIHJldHVybiBVcmxTdHJpbmcuZ2V0QWJzb2x1dGVVcmwocmVkaXJlY3RTdGFydFBhZ2UsIGdldEN1cnJlbnRVcmkoKSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUmVkaXJlY3RDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZGlyZWN0Q2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZUFzeW5jLCBpbnZva2UsIFNlcnZlclJlc3BvbnNlVHlwZSB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBERUZBVUxUX0lGUkFNRV9USU1FT1VUX01TIH0gZnJvbSAnLi4vY29uZmlnL0NvbmZpZ3VyYXRpb24ubWpzJztcbmltcG9ydCB7IGVtcHR5TmF2aWdhdGVVcmksIG1vbml0b3JXaW5kb3dUaW1lb3V0IH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ3JlYXRlcyBhIGhpZGRlbiBpZnJhbWUgdG8gZ2l2ZW4gVVJMIHVzaW5nIHVzZXItcmVxdWVzdGVkIHNjb3BlcyBhcyBhbiBpZC5cclxuICogQHBhcmFtIHVybE5hdmlnYXRlXHJcbiAqIEBwYXJhbSB1c2VyUmVxdWVzdFNjb3Blc1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gaW5pdGlhdGVBdXRoUmVxdWVzdChyZXF1ZXN0VXJsLCBwZXJmb3JtYW5jZUNsaWVudCwgbG9nZ2VyLCBjb3JyZWxhdGlvbklkLCBuYXZpZ2F0ZUZyYW1lV2FpdCkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCwgY29ycmVsYXRpb25JZCk7XHJcbiAgICBpZiAoIXJlcXVlc3RVcmwpIHtcclxuICAgICAgICAvLyBUaHJvdyBlcnJvciBpZiByZXF1ZXN0IFVSTCBpcyBlbXB0eS5cclxuICAgICAgICBsb2dnZXIuaW5mbyhcIk5hdmlnYXRlIHVybCBpcyBlbXB0eVwiKTtcclxuICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGVtcHR5TmF2aWdhdGVVcmkpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5hdmlnYXRlRnJhbWVXYWl0KSB7XHJcbiAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKGxvYWRGcmFtZSwgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SGFuZGxlckxvYWRGcmFtZSwgbG9nZ2VyLCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkocmVxdWVzdFVybCwgbmF2aWdhdGVGcmFtZVdhaXQsIHBlcmZvcm1hbmNlQ2xpZW50LCBjb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbnZva2UobG9hZEZyYW1lU3luYywgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SGFuZGxlckxvYWRGcmFtZVN5bmMsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKHJlcXVlc3RVcmwpO1xyXG59XHJcbi8qKlxyXG4gKiBNb25pdG9ycyBhbiBpZnJhbWUgY29udGVudCB3aW5kb3cgdW50aWwgaXQgbG9hZHMgYSB1cmwgd2l0aCBhIGtub3duIGhhc2gsIG9yIGhpdHMgYSBzcGVjaWZpZWQgdGltZW91dC5cclxuICogQHBhcmFtIGlmcmFtZVxyXG4gKiBAcGFyYW0gdGltZW91dFxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gbW9uaXRvcklmcmFtZUZvckhhc2goaWZyYW1lLCB0aW1lb3V0LCBwb2xsSW50ZXJ2YWxNaWxsaXNlY29uZHMsIHBlcmZvcm1hbmNlQ2xpZW50LCBsb2dnZXIsIGNvcnJlbGF0aW9uSWQsIHJlc3BvbnNlVHlwZSkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2gsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBpZiAodGltZW91dCA8IERFRkFVTFRfSUZSQU1FX1RJTUVPVVRfTVMpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoYHN5c3RlbS5sb2FkRnJhbWVUaW1lb3V0IG9yIHN5c3RlbS5pZnJhbWVIYXNoVGltZW91dCBzZXQgdG8gbG93ZXIgKCR7dGltZW91dH1tcykgdGhhbiB0aGUgZGVmYXVsdCAoJHtERUZBVUxUX0lGUkFNRV9USU1FT1VUX01TfW1zKS4gVGhpcyBtYXkgcmVzdWx0IGluIHRpbWVvdXRzLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFBvbGxpbmcgZm9yIGlmcmFtZXMgY2FuIGJlIHB1cmVseSB0aW1pbmcgYmFzZWQsXHJcbiAgICAgICAgICogc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBhY2NvdW50IGZvciBpbnRlcmFjdGlvbi5cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICByZWplY3QoY3JlYXRlQnJvd3NlckF1dGhFcnJvcihtb25pdG9yV2luZG93VGltZW91dCkpO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgICAgIGNvbnN0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaHJlZiA9IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgKiBXaWxsIHRocm93IGlmIGNyb3NzIG9yaWdpbixcclxuICAgICAgICAgICAgICAgICAqIHdoaWNoIHNob3VsZCBiZSBjYXVnaHQgYW5kIGlnbm9yZWRcclxuICAgICAgICAgICAgICAgICAqIHNpbmNlIHdlIG5lZWQgdGhlIGludGVydmFsIHRvIGtlZXAgcnVubmluZyB3aGlsZSBvbiBTVFMgVUkuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGhyZWYgPSBjb250ZW50V2luZG93ID8gY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmIDogXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgIGlmICghaHJlZiB8fCBocmVmID09PSBcImFib3V0OmJsYW5rXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAoY29udGVudFdpbmRvdykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gU2VydmVyUmVzcG9uc2VUeXBlLlFVRVJZKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VTdHJpbmcgPSBjb250ZW50V2luZG93LmxvY2F0aW9uLnNlYXJjaDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlU3RyaW5nID0gY29udGVudFdpbmRvdy5sb2NhdGlvbi5oYXNoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKTtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2VTdHJpbmcpO1xyXG4gICAgICAgIH0sIHBvbGxJbnRlcnZhbE1pbGxpc2Vjb25kcyk7XHJcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICBpbnZva2UocmVtb3ZlSGlkZGVuSWZyYW1lLCBQZXJmb3JtYW5jZUV2ZW50cy5SZW1vdmVIaWRkZW5JZnJhbWUsIGxvZ2dlciwgcGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKGlmcmFtZSk7XHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQGhpZGRlblxyXG4gKiBMb2FkcyBpZnJhbWUgd2l0aCBhdXRob3JpemF0aW9uIGVuZHBvaW50IFVSTFxyXG4gKiBAaWdub3JlXHJcbiAqIEBkZXByZWNhdGVkXHJcbiAqL1xyXG5mdW5jdGlvbiBsb2FkRnJhbWUodXJsTmF2aWdhdGUsIG5hdmlnYXRlRnJhbWVXYWl0LCBwZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgcGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRIYW5kbGVyTG9hZEZyYW1lLCBjb3JyZWxhdGlvbklkKTtcclxuICAgIC8qXHJcbiAgICAgKiBUaGlzIHRyaWNrIG92ZXJjb21lcyBpZnJhbWUgbmF2aWdhdGlvbiBpbiBJRVxyXG4gICAgICogSUUgZG9lcyBub3QgbG9hZCB0aGUgcGFnZSBjb25zaXN0ZW50bHkgaW4gaWZyYW1lXHJcbiAgICAgKi9cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnJhbWVIYW5kbGUgPSBjcmVhdGVIaWRkZW5JZnJhbWUoKTtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZnJhbWVIYW5kbGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChcIlVuYWJsZSB0byBsb2FkIGlmcmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmcmFtZUhhbmRsZS5zcmMgPSB1cmxOYXZpZ2F0ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZShmcmFtZUhhbmRsZSk7XHJcbiAgICAgICAgfSwgbmF2aWdhdGVGcmFtZVdhaXQpO1xyXG4gICAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIEBoaWRkZW5cclxuICogTG9hZHMgdGhlIGlmcmFtZSBzeW5jaHJvbm91c2x5IHdoZW4gdGhlIG5hdmlnYXRlVGltZUZyYW1lIGlzIHNldCB0byBgMGBcclxuICogQHBhcmFtIHVybE5hdmlnYXRlXHJcbiAqIEBwYXJhbSBmcmFtZU5hbWVcclxuICogQHBhcmFtIGxvZ2dlclxyXG4gKi9cclxuZnVuY3Rpb24gbG9hZEZyYW1lU3luYyh1cmxOYXZpZ2F0ZSkge1xyXG4gICAgY29uc3QgZnJhbWVIYW5kbGUgPSBjcmVhdGVIaWRkZW5JZnJhbWUoKTtcclxuICAgIGZyYW1lSGFuZGxlLnNyYyA9IHVybE5hdmlnYXRlO1xyXG4gICAgcmV0dXJuIGZyYW1lSGFuZGxlO1xyXG59XHJcbi8qKlxyXG4gKiBAaGlkZGVuXHJcbiAqIENyZWF0ZXMgYSBuZXcgaGlkZGVuIGlmcmFtZSBvciBnZXRzIGFuIGV4aXN0aW5nIG9uZSBmb3Igc2lsZW50IHRva2VuIHJlbmV3YWwuXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUhpZGRlbklmcmFtZSgpIHtcclxuICAgIGNvbnN0IGF1dGhGcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XHJcbiAgICBhdXRoRnJhbWUuY2xhc3NOYW1lID0gXCJtc2FsU2lsZW50SWZyYW1lXCI7XHJcbiAgICBhdXRoRnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICBhdXRoRnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICBhdXRoRnJhbWUuc3R5bGUud2lkdGggPSBhdXRoRnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCIwXCI7XHJcbiAgICBhdXRoRnJhbWUuc3R5bGUuYm9yZGVyID0gXCIwXCI7XHJcbiAgICBhdXRoRnJhbWUuc2V0QXR0cmlidXRlKFwic2FuZGJveFwiLCBcImFsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctZm9ybXNcIik7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGF1dGhGcmFtZSk7XHJcbiAgICByZXR1cm4gYXV0aEZyYW1lO1xyXG59XHJcbi8qKlxyXG4gKiBAaGlkZGVuXHJcbiAqIFJlbW92ZXMgYSBoaWRkZW4gaWZyYW1lIGZyb20gdGhlIHBhZ2UuXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmZ1bmN0aW9uIHJlbW92ZUhpZGRlbklmcmFtZShpZnJhbWUpIHtcclxuICAgIGlmIChkb2N1bWVudC5ib2R5ID09PSBpZnJhbWUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBpbml0aWF0ZUF1dGhSZXF1ZXN0LCBtb25pdG9ySWZyYW1lRm9ySGFzaCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lsZW50SGFuZGxlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRzLCBQcm9tcHRWYWx1ZSwgaW52b2tlQXN5bmMsIEF1dGhFcnJvciwgaW52b2tlLCBQcm90b2NvbFV0aWxzIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uVHlwZSwgQnJvd3NlckNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IGluaXRpYXRlQXV0aFJlcXVlc3QsIG1vbml0b3JJZnJhbWVGb3JIYXNoIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25faGFuZGxlci9TaWxlbnRIYW5kbGVyLm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVNZXNzYWdlSGFuZGxlciB9IGZyb20gJy4uL2Jyb2tlci9uYXRpdmVCcm9rZXIvTmF0aXZlTWVzc2FnZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IE5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IH0gZnJvbSAnLi9OYXRpdmVJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25faGFuZGxlci9JbnRlcmFjdGlvbkhhbmRsZXIubWpzJztcbmltcG9ydCB7IHByZWNvbm5lY3QgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyVXRpbHMubWpzJztcbmltcG9ydCB7IGRlc2VyaWFsaXplUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZS9SZXNwb25zZUhhbmRsZXIubWpzJztcbmltcG9ydCB7IHNpbGVudExvZ291dFVuc3VwcG9ydGVkLCBuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFNpbGVudElmcmFtZUNsaWVudCBleHRlbmRzIFN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnQge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBzdG9yYWdlSW1wbCwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIGFwaUlkLCBwZXJmb3JtYW5jZUNsaWVudCwgbmF0aXZlU3RvcmFnZUltcGwsIG5hdGl2ZU1lc3NhZ2VIYW5kbGVyLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgc3VwZXIoY29uZmlnLCBzdG9yYWdlSW1wbCwgYnJvd3NlckNyeXB0bywgbG9nZ2VyLCBldmVudEhhbmRsZXIsIG5hdmlnYXRpb25DbGllbnQsIHBlcmZvcm1hbmNlQ2xpZW50LCBuYXRpdmVNZXNzYWdlSGFuZGxlciwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5hcGlJZCA9IGFwaUlkO1xyXG4gICAgICAgIHRoaXMubmF0aXZlU3RvcmFnZSA9IG5hdGl2ZVN0b3JhZ2VJbXBsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3F1aXJlcyBhIHRva2VuIHNpbGVudGx5IGJ5IG9wZW5pbmcgYSBoaWRkZW4gaWZyYW1lIHRvIHRoZSAvYXV0aG9yaXplIGVuZHBvaW50IHdpdGggcHJvbXB0PW5vbmUgb3IgcHJvbXB0PW5vX3Nlc3Npb25cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgc29tZSBTU08gZGF0YVxyXG4gICAgICAgIGlmICghcmVxdWVzdC5sb2dpbkhpbnQgJiZcclxuICAgICAgICAgICAgIXJlcXVlc3Quc2lkICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdC5hY2NvdW50IHx8ICFyZXF1ZXN0LmFjY291bnQudXNlcm5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoXCJObyB1c2VyIGhpbnQgcHJvdmlkZWQuIFRoZSBhdXRob3JpemF0aW9uIHNlcnZlciBtYXkgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGNvbXBsZXRlIHRoaXMgcmVxdWVzdC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIHRoZSBwcm9tcHQgdmFsdWVcclxuICAgICAgICBjb25zdCBpbnB1dFJlcXVlc3QgPSB7IC4uLnJlcXVlc3QgfTtcclxuICAgICAgICBpZiAoaW5wdXRSZXF1ZXN0LnByb21wdCkge1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRSZXF1ZXN0LnByb21wdCAhPT0gUHJvbXB0VmFsdWUuTk9ORSAmJlxyXG4gICAgICAgICAgICAgICAgaW5wdXRSZXF1ZXN0LnByb21wdCAhPT0gUHJvbXB0VmFsdWUuTk9fU0VTU0lPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhgU2lsZW50SWZyYW1lQ2xpZW50LiBSZXBsYWNpbmcgaW52YWxpZCBwcm9tcHQgJHtpbnB1dFJlcXVlc3QucHJvbXB0fSB3aXRoICR7UHJvbXB0VmFsdWUuTk9ORX1gKTtcclxuICAgICAgICAgICAgICAgIGlucHV0UmVxdWVzdC5wcm9tcHQgPSBQcm9tcHRWYWx1ZS5OT05FO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbnB1dFJlcXVlc3QucHJvbXB0ID0gUHJvbXB0VmFsdWUuTk9ORTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ3JlYXRlIHNpbGVudCByZXF1ZXN0XHJcbiAgICAgICAgY29uc3Qgc2lsZW50UmVxdWVzdCA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGlucHV0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCk7XHJcbiAgICAgICAgcHJlY29ubmVjdChzaWxlbnRSZXF1ZXN0LmF1dGhvcml0eSk7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciA9IHRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIodGhpcy5hcGlJZCk7XHJcbiAgICAgICAgbGV0IGF1dGhDbGllbnQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY2xpZW50XHJcbiAgICAgICAgICAgIGF1dGhDbGllbnQgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkoe1xyXG4gICAgICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBdXRob3JpdHk6IHNpbGVudFJlcXVlc3QuYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOiBzaWxlbnRSZXF1ZXN0LmF6dXJlQ2xvdWRPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOiBzaWxlbnRSZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICAgICAgYWNjb3VudDogc2lsZW50UmVxdWVzdC5hY2NvdW50LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGludm9rZUFzeW5jKHRoaXMuc2lsZW50VG9rZW5IZWxwZXIuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGF1dGhDbGllbnQsIHNpbGVudFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNhY2hlRmFpbGVkUmVxdWVzdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWF1dGhDbGllbnQgfHxcclxuICAgICAgICAgICAgICAgICEoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikgfHxcclxuICAgICAgICAgICAgICAgIGUuZXJyb3JDb2RlICE9PSBCcm93c2VyQ29uc3RhbnRzLklOVkFMSURfR1JBTlRfRVJST1IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe1xyXG4gICAgICAgICAgICAgICAgcmV0cnlFcnJvcjogZS5lcnJvckNvZGUsXHJcbiAgICAgICAgICAgIH0sIHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5U2lsZW50UmVxdWVzdCA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGlucHV0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbnZva2VBc3luYyh0aGlzLnNpbGVudFRva2VuSGVscGVyLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudFRva2VuSGVscGVyLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShhdXRoQ2xpZW50LCByZXRyeVNpbGVudFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3VycmVudGx5IFVuc3VwcG9ydGVkXHJcbiAgICAgKi9cclxuICAgIGxvZ291dCgpIHtcclxuICAgICAgICAvLyBTeW5jaHJvbm91cyBzbyB3ZSBtdXN0IHJlamVjdFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKHNpbGVudExvZ291dFVuc3VwcG9ydGVkKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciB3aGljaCBhY3F1aXJlcyBhbiBhdXRob3JpemF0aW9uIGNvZGUgc2lsZW50bHkgdXNpbmcgYSBoaWRkZW4gaWZyYW1lIGZyb20gZ2l2ZW4gdXJsXHJcbiAgICAgKiB1c2luZyB0aGUgc2NvcGVzIHJlcXVlc3RlZCBhcyBwYXJ0IG9mIHRoZSBpZCwgYW5kIGV4Y2hhbmdlcyB0aGUgY29kZSBmb3IgYSBzZXQgb2YgT0F1dGggdG9rZW5zLlxyXG4gICAgICogQHBhcmFtIG5hdmlnYXRlVXJsXHJcbiAgICAgKiBAcGFyYW0gdXNlclJlcXVlc3RTY29wZXNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2lsZW50VG9rZW5IZWxwZXIoYXV0aENsaWVudCwgc2lsZW50UmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBzaWxlbnRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudFRva2VuSGVscGVyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAvLyBDcmVhdGUgYXV0aCBjb2RlIHJlcXVlc3QgYW5kIGdlbmVyYXRlIFBLQ0UgcGFyYW1zXHJcbiAgICAgICAgY29uc3QgYXV0aENvZGVSZXF1ZXN0ID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0LmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkoc2lsZW50UmVxdWVzdCk7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGF1dGhvcml6ZSByZXF1ZXN0IHVybFxyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRlVXJsID0gYXdhaXQgaW52b2tlQXN5bmMoYXV0aENsaWVudC5nZXRBdXRoQ29kZVVybC5iaW5kKGF1dGhDbGllbnQpLCBQZXJmb3JtYW5jZUV2ZW50cy5HZXRBdXRoQ29kZVVybCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKHtcclxuICAgICAgICAgICAgLi4uc2lsZW50UmVxdWVzdCxcclxuICAgICAgICAgICAgbmF0aXZlQnJva2VyOiBOYXRpdmVNZXNzYWdlSGFuZGxlci5pc05hdGl2ZUF2YWlsYWJsZSh0aGlzLmNvbmZpZywgdGhpcy5sb2dnZXIsIHRoaXMubmF0aXZlTWVzc2FnZUhhbmRsZXIsIHNpbGVudFJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIENyZWF0ZSBzaWxlbnQgaGFuZGxlclxyXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uSGFuZGxlciA9IG5ldyBJbnRlcmFjdGlvbkhhbmRsZXIoYXV0aENsaWVudCwgdGhpcy5icm93c2VyU3RvcmFnZSwgYXV0aENvZGVSZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBmcmFtZSBoYW5kbGUgZm9yIHRoZSBzaWxlbnQgcmVxdWVzdFxyXG4gICAgICAgIGNvbnN0IG1zYWxGcmFtZSA9IGF3YWl0IGludm9rZUFzeW5jKGluaXRpYXRlQXV0aFJlcXVlc3QsIFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkobmF2aWdhdGVVcmwsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMubG9nZ2VyLCBjb3JyZWxhdGlvbklkLCB0aGlzLmNvbmZpZy5zeXN0ZW0ubmF2aWdhdGVGcmFtZVdhaXQpO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlO1xyXG4gICAgICAgIC8vIE1vbml0b3IgdGhlIHdpbmRvdyBmb3IgdGhlIGhhc2guIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFuZCBjbG9zZSB0aGUgcG9wdXAgd2hlbiB0aGUgaGFzaCBpcyByZWNlaXZlZC4gRGVmYXVsdCB0aW1lb3V0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJpbmcgPSBhd2FpdCBpbnZva2VBc3luYyhtb25pdG9ySWZyYW1lRm9ySGFzaCwgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkobXNhbEZyYW1lLCB0aGlzLmNvbmZpZy5zeXN0ZW0uaWZyYW1lSGFzaFRpbWVvdXQsIHRoaXMuY29uZmlnLnN5c3RlbS5wb2xsSW50ZXJ2YWxNaWxsaXNlY29uZHMsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMubG9nZ2VyLCBjb3JyZWxhdGlvbklkLCByZXNwb25zZVR5cGUpO1xyXG4gICAgICAgIGNvbnN0IHNlcnZlclBhcmFtcyA9IGludm9rZShkZXNlcmlhbGl6ZVJlc3BvbnNlLCBQZXJmb3JtYW5jZUV2ZW50cy5EZXNlcmlhbGl6ZVJlc3BvbnNlLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKShyZXNwb25zZVN0cmluZywgcmVzcG9uc2VUeXBlLCB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgaWYgKHNlcnZlclBhcmFtcy5hY2NvdW50SWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkFjY291bnQgaWQgZm91bmQgaW4gaGFzaCwgY2FsbGluZyBXQU0gZm9yIHRva2VuXCIpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubmF0aXZlTWVzc2FnZUhhbmRsZXIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IobmF0aXZlQ29ubmVjdGlvbk5vdEVzdGFibGlzaGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBuYXRpdmVJbnRlcmFjdGlvbkNsaWVudCA9IG5ldyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdGhpcy5ldmVudEhhbmRsZXIsIHRoaXMubmF2aWdhdGlvbkNsaWVudCwgdGhpcy5hcGlJZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVNZXNzYWdlSGFuZGxlciwgc2VydmVyUGFyYW1zLmFjY291bnRJZCwgdGhpcy5icm93c2VyU3RvcmFnZSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdXNlclJlcXVlc3RTdGF0ZSB9ID0gUHJvdG9jb2xVdGlscy5wYXJzZVJlcXVlc3RTdGF0ZSh0aGlzLmJyb3dzZXJDcnlwdG8sIHNpbGVudFJlcXVlc3Quc3RhdGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW52b2tlQXN5bmMobmF0aXZlSW50ZXJhY3Rpb25DbGllbnQuYWNxdWlyZVRva2VuLmJpbmQobmF0aXZlSW50ZXJhY3Rpb25DbGllbnQpLCBQZXJmb3JtYW5jZUV2ZW50cy5OYXRpdmVJbnRlcmFjdGlvbkNsaWVudEFjcXVpcmVUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIGNvcnJlbGF0aW9uSWQpKHtcclxuICAgICAgICAgICAgICAgIC4uLnNpbGVudFJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdXNlclJlcXVlc3RTdGF0ZSxcclxuICAgICAgICAgICAgICAgIHByb21wdDogc2lsZW50UmVxdWVzdC5wcm9tcHQgfHwgUHJvbXB0VmFsdWUuTk9ORSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEhhbmRsZSByZXNwb25zZSBmcm9tIGhhc2ggc3RyaW5nXHJcbiAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKGludGVyYWN0aW9uSGFuZGxlci5oYW5kbGVDb2RlUmVzcG9uc2UuYmluZChpbnRlcmFjdGlvbkhhbmRsZXIpLCBQZXJmb3JtYW5jZUV2ZW50cy5IYW5kbGVDb2RlUmVzcG9uc2UsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCBjb3JyZWxhdGlvbklkKShzZXJ2ZXJQYXJhbXMsIHNpbGVudFJlcXVlc3QpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFNpbGVudElmcmFtZUNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lsZW50SWZyYW1lQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4vU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZUFzeW5jLCBSZWZyZXNoVG9rZW5DbGllbnQgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBBcGlJZCB9IGZyb20gJy4uL3V0aWxzL0Jyb3dzZXJDb25zdGFudHMubWpzJztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBpbml0aWFsaXplQmFzZVJlcXVlc3QgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RIZWxwZXJzLm1qcyc7XG5pbXBvcnQgeyBzaWxlbnRMb2dvdXRVbnN1cHBvcnRlZCB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgU2lsZW50UmVmcmVzaENsaWVudCBleHRlbmRzIFN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFeGNoYW5nZXMgdGhlIHJlZnJlc2ggdG9rZW4gZm9yIG5ldyB0b2tlbnNcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbihyZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW4sIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgYmFzZVJlcXVlc3QgPSBhd2FpdCBpbnZva2VBc3luYyhpbml0aWFsaXplQmFzZVJlcXVlc3QsIFBlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVCYXNlUmVxdWVzdCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCwgdGhpcy5jb25maWcsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICBjb25zdCBzaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAuLi5yZXF1ZXN0LFxyXG4gICAgICAgICAgICAuLi5iYXNlUmVxdWVzdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0VXJpKSB7XHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgcGFzc2VkIHJlZGlyZWN0VXJpIGlzIGNvbnZlcnRlZCB0byBhbiBhYnNvbHV0ZSBVUkwgLSByZWRpcmVjdFVyaSBpcyBub3QgYSByZXF1aXJlZCBwYXJhbWV0ZXIgZm9yIHJlZnJlc2ggdG9rZW4gcmVkZW1wdGlvbiBzbyBvbmx5IGluY2x1ZGUgaWYgZXhwbGljaXRseSBwcm92aWRlZFxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0LnJlZGlyZWN0VXJpID0gdGhpcy5nZXRSZWRpcmVjdFVyaShyZXF1ZXN0LnJlZGlyZWN0VXJpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VydmVyVGVsZW1ldHJ5TWFuYWdlciA9IHRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoQXBpSWQuYWNxdWlyZVRva2VuU2lsZW50X3NpbGVudEZsb3cpO1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbkNsaWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlUmVmcmVzaFRva2VuQ2xpZW50KHtcclxuICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixcclxuICAgICAgICAgICAgYXV0aG9yaXR5VXJsOiBzaWxlbnRSZXF1ZXN0LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgYXp1cmVDbG91ZE9wdGlvbnM6IHNpbGVudFJlcXVlc3QuYXp1cmVDbG91ZE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGFjY291bnQ6IHNpbGVudFJlcXVlc3QuYWNjb3VudCxcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBTZW5kIHJlcXVlc3QgdG8gcmVuZXcgdG9rZW4uIEF1dGggbW9kdWxlIHdpbGwgdGhyb3cgZXJyb3JzIGlmIHRva2VuIGNhbm5vdCBiZSByZW5ld2VkLlxyXG4gICAgICAgIHJldHVybiBpbnZva2VBc3luYyhyZWZyZXNoVG9rZW5DbGllbnQuYWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4uYmluZChyZWZyZXNoVG9rZW5DbGllbnQpLCBQZXJmb3JtYW5jZUV2ZW50cy5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkoc2lsZW50UmVxdWVzdCkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXIuY2FjaGVGYWlsZWRSZXF1ZXN0KGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDdXJyZW50bHkgVW5zdXBwb3J0ZWRcclxuICAgICAqL1xyXG4gICAgbG9nb3V0KCkge1xyXG4gICAgICAgIC8vIFN5bmNocm9ub3VzIHNvIHdlIG11c3QgcmVqZWN0XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Ioc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWQpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFJlZnJlc2ggQ2xpZW50IHdpdGggdGhlIGdpdmVuIGF1dGhvcml0eSwgb3IgdGhlIGRlZmF1bHQgYXV0aG9yaXR5LlxyXG4gICAgICogQHBhcmFtIHBhcmFtcyB7XHJcbiAgICAgKiAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6IFNlcnZlclRlbGVtZXRyeU1hbmFnZXI7XHJcbiAgICAgKiAgICAgICAgIGF1dGhvcml0eVVybD86IHN0cmluZztcclxuICAgICAqICAgICAgICAgYXp1cmVDbG91ZE9wdGlvbnM/OiBBenVyZUNsb3VkT3B0aW9ucztcclxuICAgICAqICAgICAgICAgZXh0cmFRdWVyeVBhcmFtcz86IFN0cmluZ0RpY3Q7XHJcbiAgICAgKiAgICAgICAgIGFjY291bnQ/OiBBY2NvdW50SW5mbztcclxuICAgICAqICAgICAgICB9XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNyZWF0ZVJlZnJlc2hUb2tlbkNsaWVudChwYXJhbXMpIHtcclxuICAgICAgICAvLyBDcmVhdGUgYXV0aCBtb2R1bGUuXHJcbiAgICAgICAgY29uc3QgY2xpZW50Q29uZmlnID0gYXdhaXQgaW52b2tlQXN5bmModGhpcy5nZXRDbGllbnRDb25maWd1cmF0aW9uLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5jb3JyZWxhdGlvbklkKSh7XHJcbiAgICAgICAgICAgIHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6IHBhcmFtcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLFxyXG4gICAgICAgICAgICByZXF1ZXN0QXV0aG9yaXR5OiBwYXJhbXMuYXV0aG9yaXR5VXJsLFxyXG4gICAgICAgICAgICByZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6IHBhcmFtcy5henVyZUNsb3VkT3B0aW9ucyxcclxuICAgICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOiBwYXJhbXMuZXh0cmFRdWVyeVBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIGFjY291bnQ6IHBhcmFtcy5hY2NvdW50LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaFRva2VuQ2xpZW50KGNsaWVudENvbmZpZywgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2lsZW50UmVmcmVzaENsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lsZW50UmVmcmVzaENsaWVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEF1dGhUb2tlbiwgQXV0aG9yaXR5LCBBY2NvdW50RW50aXR5LCBidWlsZEFjY291bnRUb0NhY2hlLCBDYWNoZUhlbHBlcnMsIFNjb3BlU2V0IH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGJhc2U2NERlY29kZSB9IGZyb20gJy4uL2VuY29kZS9CYXNlNjREZWNvZGUubWpzJztcbmltcG9ydCB7IGNyZWF0ZU5ld0d1aWQgfSBmcm9tICcuLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgbm9uQnJvd3NlckVudmlyb25tZW50LCB1bmFibGVUb0xvYWRUb2tlbiB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRva2VuIGNhY2hlIG1hbmFnZXJcclxuICovXHJcbmNsYXNzIFRva2VuQ2FjaGUge1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbiwgc3RvcmFnZSwgbG9nZ2VyLCBjcnlwdG9PYmopIHtcclxuICAgICAgICB0aGlzLmlzQnJvd3NlckVudmlyb25tZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICAgICAgICB0aGlzLmNyeXB0b09iaiA9IGNyeXB0b09iajtcclxuICAgIH1cclxuICAgIC8vIE1vdmUgZ2V0QWxsQWNjb3VudHMgaGVyZSBhbmQgY2FjaGUgdXRpbGl0eSBBUElzXHJcbiAgICAvKipcclxuICAgICAqIEFQSSB0byBsb2FkIHRva2VucyB0byBtc2FsLWJyb3dzZXIgY2FjaGUuXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHJlc3BvbnNlXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICogQHJldHVybnMgYEF1dGhlbnRpY2F0aW9uUmVzdWx0YCBmb3IgdGhlIHJlc3BvbnNlIHRoYXQgd2FzIGxvYWRlZC5cclxuICAgICAqL1xyXG4gICAgbG9hZEV4dGVybmFsVG9rZW5zKHJlcXVlc3QsIHJlc3BvbnNlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQnJvd3NlckVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Iobm9uQnJvd3NlckVudmlyb25tZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkNsYWltcyA9IHJlc3BvbnNlLmlkX3Rva2VuXHJcbiAgICAgICAgICAgID8gQXV0aFRva2VuLmV4dHJhY3RUb2tlbkNsYWltcyhyZXNwb25zZS5pZF90b2tlbiwgYmFzZTY0RGVjb2RlKVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBhdXRob3JpdHlPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwcm90b2NvbE1vZGU6IHRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlLFxyXG4gICAgICAgICAgICBrbm93bkF1dGhvcml0aWVzOiB0aGlzLmNvbmZpZy5hdXRoLmtub3duQXV0aG9yaXRpZXMsXHJcbiAgICAgICAgICAgIGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6IHRoaXMuY29uZmlnLmF1dGguY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSxcclxuICAgICAgICAgICAgYXV0aG9yaXR5TWV0YWRhdGE6IHRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsXHJcbiAgICAgICAgICAgIHNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlOiB0aGlzLmNvbmZpZy5hdXRoLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5ID0gcmVxdWVzdC5hdXRob3JpdHlcclxuICAgICAgICAgICAgPyBuZXcgQXV0aG9yaXR5KEF1dGhvcml0eS5nZW5lcmF0ZUF1dGhvcml0eShyZXF1ZXN0LmF1dGhvcml0eSwgcmVxdWVzdC5henVyZUNsb3VkT3B0aW9ucyksIHRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50LCB0aGlzLnN0b3JhZ2UsIGF1dGhvcml0eU9wdGlvbnMsIHRoaXMubG9nZ2VyLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQgfHwgY3JlYXRlTmV3R3VpZCgpKVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjYWNoZVJlY29yZEFjY291bnQgPSB0aGlzLmxvYWRBY2NvdW50KHJlcXVlc3QsIG9wdGlvbnMuY2xpZW50SW5mbyB8fCByZXNwb25zZS5jbGllbnRfaW5mbyB8fCBcIlwiLCBpZFRva2VuQ2xhaW1zLCBhdXRob3JpdHkpO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW4gPSB0aGlzLmxvYWRJZFRva2VuKHJlc3BvbnNlLCBjYWNoZVJlY29yZEFjY291bnQuaG9tZUFjY291bnRJZCwgY2FjaGVSZWNvcmRBY2NvdW50LmVudmlyb25tZW50LCBjYWNoZVJlY29yZEFjY291bnQucmVhbG0pO1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdGhpcy5sb2FkQWNjZXNzVG9rZW4ocmVxdWVzdCwgcmVzcG9uc2UsIGNhY2hlUmVjb3JkQWNjb3VudC5ob21lQWNjb3VudElkLCBjYWNoZVJlY29yZEFjY291bnQuZW52aXJvbm1lbnQsIGNhY2hlUmVjb3JkQWNjb3VudC5yZWFsbSwgb3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5sb2FkUmVmcmVzaFRva2VuKHJlc3BvbnNlLCBjYWNoZVJlY29yZEFjY291bnQuaG9tZUFjY291bnRJZCwgY2FjaGVSZWNvcmRBY2NvdW50LmVudmlyb25tZW50KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHJlcXVlc3QsIHtcclxuICAgICAgICAgICAgYWNjb3VudDogY2FjaGVSZWNvcmRBY2NvdW50LFxyXG4gICAgICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgcmVmcmVzaFRva2VuLFxyXG4gICAgICAgIH0sIGlkVG9rZW5DbGFpbXMsIGF1dGhvcml0eSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBsb2FkIGFjY291bnQgdG8gbXNhbC1icm93c2VyIGNhY2hlXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlblxyXG4gICAgICogQHBhcmFtIGVudmlyb25tZW50XHJcbiAgICAgKiBAcGFyYW0gY2xpZW50SW5mb1xyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVR5cGVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0SG9tZUFjY291bnRJZFxyXG4gICAgICogQHJldHVybnMgYEFjY291bnRFbnRpdHlgXHJcbiAgICAgKi9cclxuICAgIGxvYWRBY2NvdW50KHJlcXVlc3QsIGNsaWVudEluZm8sIGlkVG9rZW5DbGFpbXMsIGF1dGhvcml0eSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbG9hZGluZyBhY2NvdW50XCIpO1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LmFjY291bnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYWNjb3VudEVudGl0eSA9IEFjY291bnRFbnRpdHkuY3JlYXRlRnJvbUFjY291bnRJbmZvKHJlcXVlc3QuYWNjb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRBY2NvdW50KGFjY291bnRFbnRpdHkpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjb3VudEVudGl0eTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoIWF1dGhvcml0eSB8fCAoIWNsaWVudEluZm8gJiYgIWlkVG9rZW5DbGFpbXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiVG9rZW5DYWNoZSAtIGlmIGFuIGFjY291bnQgaXMgbm90IHByb3ZpZGVkIG9uIHRoZSByZXF1ZXN0LCBhdXRob3JpdHkgYW5kIGVpdGhlciBjbGllbnRJbmZvIG9yIGlkVG9rZW4gbXVzdCBiZSBwcm92aWRlZCBpbnN0ZWFkLlwiKTtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcih1bmFibGVUb0xvYWRUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhvbWVBY2NvdW50SWQgPSBBY2NvdW50RW50aXR5LmdlbmVyYXRlSG9tZUFjY291bnRJZChjbGllbnRJbmZvLCBhdXRob3JpdHkuYXV0aG9yaXR5VHlwZSwgdGhpcy5sb2dnZXIsIHRoaXMuY3J5cHRvT2JqLCBpZFRva2VuQ2xhaW1zKTtcclxuICAgICAgICBjb25zdCBjbGFpbXNUZW5hbnRJZCA9IGlkVG9rZW5DbGFpbXM/LnRpZDtcclxuICAgICAgICBjb25zdCBjYWNoZWRBY2NvdW50ID0gYnVpbGRBY2NvdW50VG9DYWNoZSh0aGlzLnN0b3JhZ2UsIGF1dGhvcml0eSwgaG9tZUFjY291bnRJZCwgYmFzZTY0RGVjb2RlLCBpZFRva2VuQ2xhaW1zLCBjbGllbnRJbmZvLCBhdXRob3JpdHkuaG9zdG5hbWVBbmRQb3J0LCBjbGFpbXNUZW5hbnRJZCwgdW5kZWZpbmVkLCAvLyBhdXRoQ29kZVBheWxvYWRcclxuICAgICAgICB1bmRlZmluZWQsIC8vIG5hdGl2ZUFjY291bnRJZFxyXG4gICAgICAgIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0QWNjb3VudChjYWNoZWRBY2NvdW50KTtcclxuICAgICAgICByZXR1cm4gY2FjaGVkQWNjb3VudDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgaWQgdG9rZW5zIHRvIG1zYWwtYnJvd3NlciBjYWNoZVxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5cclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnRcclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZFxyXG4gICAgICogQHJldHVybnMgYElkVG9rZW5FbnRpdHlgXHJcbiAgICAgKi9cclxuICAgIGxvYWRJZFRva2VuKHJlc3BvbnNlLCBob21lQWNjb3VudElkLCBlbnZpcm9ubWVudCwgdGVuYW50SWQpIHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLmlkX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbm8gaWQgdG9rZW4gZm91bmQgaW4gcmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiVG9rZW5DYWNoZSAtIGxvYWRpbmcgaWQgdG9rZW5cIik7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkVudGl0eSA9IENhY2hlSGVscGVycy5jcmVhdGVJZFRva2VuRW50aXR5KGhvbWVBY2NvdW50SWQsIGVudmlyb25tZW50LCByZXNwb25zZS5pZF90b2tlbiwgdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCwgdGVuYW50SWQpO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJZFRva2VuQ3JlZGVudGlhbChpZFRva2VuRW50aXR5KTtcclxuICAgICAgICByZXR1cm4gaWRUb2tlbkVudGl0eTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgYWNjZXNzIHRva2VucyB0byBtc2FsLWJyb3dzZXIgY2FjaGVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnRcclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZFxyXG4gICAgICogQHJldHVybnMgYEFjY2Vzc1Rva2VuRW50aXR5YFxyXG4gICAgICovXHJcbiAgICBsb2FkQWNjZXNzVG9rZW4ocmVxdWVzdCwgcmVzcG9uc2UsIGhvbWVBY2NvdW50SWQsIGVudmlyb25tZW50LCB0ZW5hbnRJZCwgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbm8gYWNjZXNzIHRva2VuIGZvdW5kIGluIHJlc3BvbnNlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoIXJlc3BvbnNlLmV4cGlyZXNfaW4pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJUb2tlbkNhY2hlIC0gbm8gZXhwaXJhdGlvbiBzZXQgb24gdGhlIGFjY2VzcyB0b2tlbi4gQ2Fubm90IGFkZCBpdCB0byB0aGUgY2FjaGUuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoIXJlc3BvbnNlLnNjb3BlICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdC5zY29wZXMgfHwgIXJlcXVlc3Quc2NvcGVzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJUb2tlbkNhY2hlIC0gc2NvcGVzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UuIENhbm5vdCBhZGQgdG9rZW4gdG8gdGhlIGNhY2hlLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbG9hZGluZyBhY2Nlc3MgdG9rZW5cIik7XHJcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gcmVzcG9uc2Uuc2NvcGVcclxuICAgICAgICAgICAgPyBTY29wZVNldC5mcm9tU3RyaW5nKHJlc3BvbnNlLnNjb3BlKVxyXG4gICAgICAgICAgICA6IG5ldyBTY29wZVNldChyZXF1ZXN0LnNjb3Blcyk7XHJcbiAgICAgICAgY29uc3QgZXhwaXJlc09uID0gb3B0aW9ucy5leHBpcmVzT24gfHxcclxuICAgICAgICAgICAgcmVzcG9uc2UuZXhwaXJlc19pbiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcclxuICAgICAgICBjb25zdCBleHRlbmRlZEV4cGlyZXNPbiA9IG9wdGlvbnMuZXh0ZW5kZWRFeHBpcmVzT24gfHxcclxuICAgICAgICAgICAgKHJlc3BvbnNlLmV4dF9leHBpcmVzX2luIHx8IHJlc3BvbnNlLmV4cGlyZXNfaW4pICtcclxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcclxuICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbkVudGl0eSA9IENhY2hlSGVscGVycy5jcmVhdGVBY2Nlc3NUb2tlbkVudGl0eShob21lQWNjb3VudElkLCBlbnZpcm9ubWVudCwgcmVzcG9uc2UuYWNjZXNzX3Rva2VuLCB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCB0ZW5hbnRJZCwgc2NvcGVzLnByaW50U2NvcGVzKCksIGV4cGlyZXNPbiwgZXh0ZW5kZWRFeHBpcmVzT24sIGJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChhY2Nlc3NUb2tlbkVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuRW50aXR5O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9hZCByZWZyZXNoIHRva2VucyB0byBtc2FsLWJyb3dzZXIgY2FjaGVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnRcclxuICAgICAqIEByZXR1cm5zIGBSZWZyZXNoVG9rZW5FbnRpdHlgXHJcbiAgICAgKi9cclxuICAgIGxvYWRSZWZyZXNoVG9rZW4ocmVzcG9uc2UsIGhvbWVBY2NvdW50SWQsIGVudmlyb25tZW50KSB7XHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5yZWZyZXNoX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiByZXNwb25zZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJUb2tlbkNhY2hlIC0gbG9hZGluZyByZWZyZXNoIHRva2VuXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbkVudGl0eSA9IENhY2hlSGVscGVycy5jcmVhdGVSZWZyZXNoVG9rZW5FbnRpdHkoaG9tZUFjY291bnRJZCwgZW52aXJvbm1lbnQsIHJlc3BvbnNlLnJlZnJlc2hfdG9rZW4sIHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsIHJlc3BvbnNlLmZvY2ksIHVuZGVmaW5lZCwgLy8gdXNlckFzc2VydGlvbkhhc2hcclxuICAgICAgICByZXNwb25zZS5yZWZyZXNoX3Rva2VuX2V4cGlyZXNfaW4pO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXRSZWZyZXNoVG9rZW5DcmVkZW50aWFsKHJlZnJlc2hUb2tlbkVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIHJlZnJlc2hUb2tlbkVudGl0eTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuIGBBdXRoZW50aWNhdGlvblJlc3VsdGAgZm9yIHRoZSByZXN1bHQuXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGlkVG9rZW5PYmpcclxuICAgICAqIEBwYXJhbSBjYWNoZVJlY29yZFxyXG4gICAgICogQHBhcmFtIGF1dGhvcml0eVxyXG4gICAgICogQHJldHVybnMgYEF1dGhlbnRpY2F0aW9uUmVzdWx0YFxyXG4gICAgICovXHJcbiAgICBnZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHJlcXVlc3QsIGNhY2hlUmVjb3JkLCBpZFRva2VuQ2xhaW1zLCBhdXRob3JpdHkpIHtcclxuICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSBcIlwiO1xyXG4gICAgICAgIGxldCByZXNwb25zZVNjb3BlcyA9IFtdO1xyXG4gICAgICAgIGxldCBleHBpcmVzT24gPSBudWxsO1xyXG4gICAgICAgIGxldCBleHRFeHBpcmVzT247XHJcbiAgICAgICAgaWYgKGNhY2hlUmVjb3JkPy5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGNhY2hlUmVjb3JkLmFjY2Vzc1Rva2VuLnNlY3JldDtcclxuICAgICAgICAgICAgcmVzcG9uc2VTY29wZXMgPSBTY29wZVNldC5mcm9tU3RyaW5nKGNhY2hlUmVjb3JkLmFjY2Vzc1Rva2VuLnRhcmdldCkuYXNBcnJheSgpO1xyXG4gICAgICAgICAgICBleHBpcmVzT24gPSBuZXcgRGF0ZShOdW1iZXIoY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4uZXhwaXJlc09uKSAqIDEwMDApO1xyXG4gICAgICAgICAgICBleHRFeHBpcmVzT24gPSBuZXcgRGF0ZShOdW1iZXIoY2FjaGVSZWNvcmQuYWNjZXNzVG9rZW4uZXh0ZW5kZWRFeHBpcmVzT24pICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFjY291bnRFbnRpdHkgPSBjYWNoZVJlY29yZC5hY2NvdW50O1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5ID8gYXV0aG9yaXR5LmNhbm9uaWNhbEF1dGhvcml0eSA6IFwiXCIsXHJcbiAgICAgICAgICAgIHVuaXF1ZUlkOiBjYWNoZVJlY29yZC5hY2NvdW50LmxvY2FsQWNjb3VudElkLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZDogY2FjaGVSZWNvcmQuYWNjb3VudC5yZWFsbSxcclxuICAgICAgICAgICAgc2NvcGVzOiByZXNwb25zZVNjb3BlcyxcclxuICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudEVudGl0eS5nZXRBY2NvdW50SW5mbygpLFxyXG4gICAgICAgICAgICBpZFRva2VuOiBjYWNoZVJlY29yZC5pZFRva2VuPy5zZWNyZXQgfHwgXCJcIixcclxuICAgICAgICAgICAgaWRUb2tlbkNsYWltczogaWRUb2tlbkNsYWltcyB8fCB7fSxcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICBmcm9tQ2FjaGU6IHRydWUsXHJcbiAgICAgICAgICAgIGV4cGlyZXNPbjogZXhwaXJlc09uLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiByZXF1ZXN0LmNvcnJlbGF0aW9uSWQgfHwgXCJcIixcclxuICAgICAgICAgICAgcmVxdWVzdElkOiBcIlwiLFxyXG4gICAgICAgICAgICBleHRFeHBpcmVzT246IGV4dEV4cGlyZXNPbixcclxuICAgICAgICAgICAgZmFtaWx5SWQ6IGNhY2hlUmVjb3JkLnJlZnJlc2hUb2tlbj8uZmFtaWx5SWQgfHwgXCJcIixcclxuICAgICAgICAgICAgdG9rZW5UeXBlOiBjYWNoZVJlY29yZD8uYWNjZXNzVG9rZW4/LnRva2VuVHlwZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICBzdGF0ZTogcmVxdWVzdC5zdGF0ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICBjbG91ZEdyYXBoSG9zdE5hbWU6IGFjY291bnRFbnRpdHkuY2xvdWRHcmFwaEhvc3ROYW1lIHx8IFwiXCIsXHJcbiAgICAgICAgICAgIG1zR3JhcGhIb3N0OiBhY2NvdW50RW50aXR5Lm1zR3JhcGhIb3N0IHx8IFwiXCIsXHJcbiAgICAgICAgICAgIGZyb21OYXRpdmVCcm9rZXI6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgVG9rZW5DYWNoZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9rZW5DYWNoZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Db2RlQ2xpZW50IH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgSHlicmlkU3BhQXV0aG9yaXphdGlvbkNvZGVDbGllbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uQ29kZUNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcclxuICAgICAgICBzdXBlcihjb25maWcpO1xyXG4gICAgICAgIHRoaXMuaW5jbHVkZVJlZGlyZWN0VXJpID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgSHlicmlkU3BhQXV0aG9yaXphdGlvbkNvZGVDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUh5YnJpZFNwYUF1dGhvcml6YXRpb25Db2RlQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgaW52b2tlQXN5bmMsIFBlcmZvcm1hbmNlRXZlbnRzLCBBdXRoRXJyb3IgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50IH0gZnJvbSAnLi9TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VyQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25UeXBlIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgSHlicmlkU3BhQXV0aG9yaXphdGlvbkNvZGVDbGllbnQgfSBmcm9tICcuL0h5YnJpZFNwYUF1dGhvcml6YXRpb25Db2RlQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbkhhbmRsZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbl9oYW5kbGVyL0ludGVyYWN0aW9uSGFuZGxlci5tanMnO1xuaW1wb3J0IHsgYXV0aENvZGVSZXF1aXJlZCwgc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWQgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFNpbGVudEF1dGhDb2RlQ2xpZW50IGV4dGVuZHMgU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHN0b3JhZ2VJbXBsLCBicm93c2VyQ3J5cHRvLCBsb2dnZXIsIGV2ZW50SGFuZGxlciwgbmF2aWdhdGlvbkNsaWVudCwgYXBpSWQsIHBlcmZvcm1hbmNlQ2xpZW50LCBuYXRpdmVNZXNzYWdlSGFuZGxlciwgY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHN1cGVyKGNvbmZpZywgc3RvcmFnZUltcGwsIGJyb3dzZXJDcnlwdG8sIGxvZ2dlciwgZXZlbnRIYW5kbGVyLCBuYXZpZ2F0aW9uQ2xpZW50LCBwZXJmb3JtYW5jZUNsaWVudCwgbmF0aXZlTWVzc2FnZUhhbmRsZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMuYXBpSWQgPSBhcGlJZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWNxdWlyZXMgYSB0b2tlbiBzaWxlbnRseSBieSByZWRlZW1pbmcgYW4gYXV0aG9yaXphdGlvbiBjb2RlIGFnYWluc3QgdGhlIC90b2tlbiBlbmRwb2ludFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuKHJlcXVlc3QpIHtcclxuICAgICAgICAvLyBBdXRoIGNvZGUgcGF5bG9hZCBpcyByZXF1aXJlZFxyXG4gICAgICAgIGlmICghcmVxdWVzdC5jb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3IoYXV0aENvZGVSZXF1aXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyZWF0ZSBzaWxlbnQgcmVxdWVzdFxyXG4gICAgICAgIGNvbnN0IHNpbGVudFJlcXVlc3QgPSBhd2FpdCBpbnZva2VBc3luYyh0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCBJbnRlcmFjdGlvblR5cGUuU2lsZW50KTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyID0gdGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcih0aGlzLmFwaUlkKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYXV0aCBjb2RlIHJlcXVlc3QgKFBLQ0Ugbm90IG5lZWRlZClcclxuICAgICAgICAgICAgY29uc3QgYXV0aENvZGVSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uc2lsZW50UmVxdWVzdCxcclxuICAgICAgICAgICAgICAgIGNvZGU6IHJlcXVlc3QuY29kZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY2xpZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudENvbmZpZyA9IGF3YWl0IGludm9rZUFzeW5jKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkoe1xyXG4gICAgICAgICAgICAgICAgc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBdXRob3JpdHk6IHNpbGVudFJlcXVlc3QuYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOiBzaWxlbnRSZXF1ZXN0LmF6dXJlQ2xvdWRPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOiBzaWxlbnRSZXF1ZXN0LmV4dHJhUXVlcnlQYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICAgICAgYWNjb3VudDogc2lsZW50UmVxdWVzdC5hY2NvdW50LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgYXV0aENsaWVudCA9IG5ldyBIeWJyaWRTcGFBdXRob3JpemF0aW9uQ29kZUNsaWVudChjbGllbnRDb25maWcpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQXV0aCBjb2RlIGNsaWVudCBjcmVhdGVkXCIpO1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgc2lsZW50IGhhbmRsZXJcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25IYW5kbGVyID0gbmV3IEludGVyYWN0aW9uSGFuZGxlcihhdXRoQ2xpZW50LCB0aGlzLmJyb3dzZXJTdG9yYWdlLCBhdXRoQ29kZVJlcXVlc3QsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtcclxuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dGggY29kZSBwYXJhbWV0ZXJzIGZyb20gcmVxdWVzdFxyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgaW52b2tlQXN5bmMoaW50ZXJhY3Rpb25IYW5kbGVyLmhhbmRsZUNvZGVSZXNwb25zZUZyb21TZXJ2ZXIuYmluZChpbnRlcmFjdGlvbkhhbmRsZXIpLCBQZXJmb3JtYW5jZUV2ZW50cy5IYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKSh7XHJcbiAgICAgICAgICAgICAgICBjb2RlOiByZXF1ZXN0LmNvZGUsXHJcbiAgICAgICAgICAgICAgICBtc2dyYXBoX2hvc3Q6IHJlcXVlc3QubXNHcmFwaEhvc3QsXHJcbiAgICAgICAgICAgICAgICBjbG91ZF9ncmFwaF9ob3N0X25hbWU6IHJlcXVlc3QuY2xvdWRHcmFwaEhvc3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lOiByZXF1ZXN0LmNsb3VkSW5zdGFuY2VIb3N0TmFtZSxcclxuICAgICAgICAgICAgfSwgc2lsZW50UmVxdWVzdCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNhY2hlRmFpbGVkUmVxdWVzdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3VycmVudGx5IFVuc3VwcG9ydGVkXHJcbiAgICAgKi9cclxuICAgIGxvZ291dCgpIHtcclxuICAgICAgICAvLyBTeW5jaHJvbm91cyBzbyB3ZSBtdXN0IHJlamVjdFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVCcm93c2VyQXV0aEVycm9yKHNpbGVudExvZ291dFVuc3VwcG9ydGVkKSk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2lsZW50QXV0aENvZGVDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpbGVudEF1dGhDb2RlQ2xpZW50Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQ3J5cHRvT3BzIH0gZnJvbSAnLi4vY3J5cHRvL0NyeXB0b09wcy5tanMnO1xuaW1wb3J0IHsgREVGQVVMVF9DUllQVE9fSU1QTEVNRU5UQVRJT04sIGJ1aWxkU3RhdGljQXV0aG9yaXR5T3B0aW9ucywgUGVyZm9ybWFuY2VFdmVudHMsIGludm9rZUFzeW5jLCBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yLCBjcmVhdGVDbGllbnRBdXRoRXJyb3IsIENsaWVudEF1dGhFcnJvckNvZGVzLCBBY2NvdW50RW50aXR5LCBQcm9tcHRWYWx1ZSwgUGVyc2lzdGVudENhY2hlS2V5cywgQ2FjaGVNYW5hZ2VyLCBDb25zdGFudHMsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2RlcyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJDYWNoZU1hbmFnZXIsIERFRkFVTFRfQlJPV1NFUl9DQUNIRV9NQU5BR0VSIH0gZnJvbSAnLi4vY2FjaGUvQnJvd3NlckNhY2hlTWFuYWdlci5tanMnO1xuaW1wb3J0IHsgZ2V0QWxsQWNjb3VudHMsIGdldEFjY291bnQsIGdldEFjY291bnRCeVVzZXJuYW1lLCBnZXRBY2NvdW50QnlIb21lSWQsIGdldEFjY291bnRCeUxvY2FsSWQsIHNldEFjdGl2ZUFjY291bnQsIGdldEFjdGl2ZUFjY291bnQgfSBmcm9tICcuLi9jYWNoZS9BY2NvdW50TWFuYWdlci5tanMnO1xuaW1wb3J0IHsgVGVtcG9yYXJ5Q2FjaGVLZXlzLCBJbnRlcmFjdGlvblR5cGUsIEFwaUlkLCBDYWNoZUxvb2t1cFBvbGljeSwgREVGQVVMVF9SRVFVRVNULCBCcm93c2VyQ2FjaGVMb2NhdGlvbiwgaUZyYW1lUmVuZXdhbFBvbGljaWVzLCBCcm93c2VyQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUsIHJlZGlyZWN0UHJlZmxpZ2h0Q2hlY2ssIHByZWZsaWdodENoZWNrIGFzIHByZWZsaWdodENoZWNrJDEsIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50IH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICcuLi9ldmVudC9FdmVudFR5cGUubWpzJztcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlci5tanMnO1xuaW1wb3J0IHsgUG9wdXBDbGllbnQgfSBmcm9tICcuLi9pbnRlcmFjdGlvbl9jbGllbnQvUG9wdXBDbGllbnQubWpzJztcbmltcG9ydCB7IFJlZGlyZWN0Q2xpZW50IH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25fY2xpZW50L1JlZGlyZWN0Q2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBTaWxlbnRJZnJhbWVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmFjdGlvbl9jbGllbnQvU2lsZW50SWZyYW1lQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBTaWxlbnRSZWZyZXNoQ2xpZW50IH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25fY2xpZW50L1NpbGVudFJlZnJlc2hDbGllbnQubWpzJztcbmltcG9ydCB7IFRva2VuQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9Ub2tlbkNhY2hlLm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCB9IGZyb20gJy4uL2ludGVyYWN0aW9uX2NsaWVudC9OYXRpdmVJbnRlcmFjdGlvbkNsaWVudC5tanMnO1xuaW1wb3J0IHsgTmF0aXZlTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuLi9icm9rZXIvbmF0aXZlQnJva2VyL05hdGl2ZU1lc3NhZ2VIYW5kbGVyLm1qcyc7XG5pbXBvcnQgeyBOYXRpdmVBdXRoRXJyb3IsIGlzRmF0YWxOYXRpdmVBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9OYXRpdmVBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IFNpbGVudENhY2hlQ2xpZW50IH0gZnJvbSAnLi4vaW50ZXJhY3Rpb25fY2xpZW50L1NpbGVudENhY2hlQ2xpZW50Lm1qcyc7XG5pbXBvcnQgeyBTaWxlbnRBdXRoQ29kZUNsaWVudCB9IGZyb20gJy4uL2ludGVyYWN0aW9uX2NsaWVudC9TaWxlbnRBdXRoQ29kZUNsaWVudC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckF1dGhFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IGNyZWF0ZU5ld0d1aWQgfSBmcm9tICcuLi9jcnlwdG8vQnJvd3NlckNyeXB0by5tanMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZVNpbGVudFJlcXVlc3QgfSBmcm9tICcuLi9yZXF1ZXN0L1JlcXVlc3RIZWxwZXJzLm1qcyc7XG5pbXBvcnQgeyBzcGFDb2RlQW5kTmF0aXZlQWNjb3VudElkUHJlc2VudCwgdW5hYmxlVG9BY3F1aXJlVG9rZW5Gcm9tTmF0aXZlUGxhdGZvcm0sIGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50SWRSZXF1aXJlZCwgbmF0aXZlQ29ubmVjdGlvbk5vdEVzdGFibGlzaGVkLCBub0FjY291bnRFcnJvciB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWNjb3VudFR5cGUoYWNjb3VudCkge1xyXG4gICAgY29uc3QgaWRUb2tlbkNsYWltcyA9IGFjY291bnQ/LmlkVG9rZW5DbGFpbXM7XHJcbiAgICBpZiAoaWRUb2tlbkNsYWltcz8udGZwIHx8IGlkVG9rZW5DbGFpbXM/LmFjcikge1xyXG4gICAgICAgIHJldHVybiBcIkIyQ1wiO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpZFRva2VuQ2xhaW1zPy50aWQpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaWRUb2tlbkNsYWltcz8udGlkID09PSBcIjkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiTVNBXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJBQURcIjtcclxufVxyXG5mdW5jdGlvbiBwcmVmbGlnaHRDaGVjayhpbml0aWFsaXplZCwgcGVyZm9ybWFuY2VFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBwcmVmbGlnaHRDaGVjayQxKGluaXRpYWxpemVkKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgcGVyZm9ybWFuY2VFdmVudC5lbmQoeyBzdWNjZXNzOiBmYWxzZSB9LCBlKTtcclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFN0YW5kYXJkQ29udHJvbGxlciB7XHJcbiAgICAvKipcclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBJbXBvcnRhbnQgYXR0cmlidXRlcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGF1dGggYXJlOlxyXG4gICAgICogLSBjbGllbnRJRDogdGhlIGFwcGxpY2F0aW9uIElEIG9mIHlvdXIgYXBwbGljYXRpb24uIFlvdSBjYW4gb2J0YWluIG9uZSBieSByZWdpc3RlcmluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGggb3VyIEFwcGxpY2F0aW9uIHJlZ2lzdHJhdGlvbiBwb3J0YWwgOiBodHRwczovL3BvcnRhbC5henVyZS5jb20vI2JsYWRlL01pY3Jvc29mdF9BQURfSUFNL0FjdGl2ZURpcmVjdG9yeU1lbnVCbGFkZS9SZWdpc3RlcmVkQXBwc1ByZXZpZXdcclxuICAgICAqIC0gYXV0aG9yaXR5OiB0aGUgYXV0aG9yaXR5IFVSTCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cclxuICAgICAqIC0gcmVkaXJlY3RfdXJpOiB0aGUgdXJpIG9mIHlvdXIgYXBwbGljYXRpb24gcmVnaXN0ZXJlZCBpbiB0aGUgcG9ydGFsLlxyXG4gICAgICpcclxuICAgICAqIEluIEF6dXJlIEFELCBhdXRob3JpdHkgaXMgYSBVUkwgaW5kaWNhdGluZyB0aGUgQXp1cmUgYWN0aXZlIGRpcmVjdG9yeSB0aGF0IE1TQUwgdXNlcyB0byBvYnRhaW4gdG9rZW5zLlxyXG4gICAgICogSXQgaXMgb2YgdGhlIGZvcm0gaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL3tFbnRlcl90aGVfVGVuYW50X0luZm9fSGVyZX1cclxuICAgICAqIElmIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgQWNjb3VudHMgaW4gb25lIG9yZ2FuaXphdGlvbmFsIGRpcmVjdG9yeSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCB0aGUgVGVuYW50IElkIG9yIFRlbmFudCBuYW1lIChmb3IgZXhhbXBsZSwgY29udG9zby5taWNyb3NvZnQuY29tKS5cclxuICAgICAqIElmIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgQWNjb3VudHMgaW4gYW55IG9yZ2FuaXphdGlvbmFsIGRpcmVjdG9yeSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCBvcmdhbml6YXRpb25zLlxyXG4gICAgICogSWYgeW91ciBhcHBsaWNhdGlvbiBzdXBwb3J0cyBBY2NvdW50cyBpbiBhbnkgb3JnYW5pemF0aW9uYWwgZGlyZWN0b3J5IGFuZCBwZXJzb25hbCBNaWNyb3NvZnQgYWNjb3VudHMsIHJlcGxhY2UgXCJFbnRlcl90aGVfVGVuYW50X0luZm9fSGVyZVwiIHZhbHVlIHdpdGggY29tbW9uLlxyXG4gICAgICogVG8gcmVzdHJpY3Qgc3VwcG9ydCB0byBQZXJzb25hbCBNaWNyb3NvZnQgYWNjb3VudHMgb25seSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCBjb25zdW1lcnMuXHJcbiAgICAgKlxyXG4gICAgICogSW4gQXp1cmUgQjJDLCBhdXRob3JpdHkgaXMgb2YgdGhlIGZvcm0gaHR0cHM6Ly97aW5zdGFuY2V9L3RmcC97dGVuYW50fS97cG9saWN5TmFtZX0vXHJcbiAgICAgKiBGdWxsIEIyQyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoaXMgbGlicmFyeSBpbiBmdXR1cmUgdmVyc2lvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gT2JqZWN0IGZvciB0aGUgTVNBTCBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgdGhpcy5vcGVyYXRpbmdDb250ZXh0ID0gb3BlcmF0aW5nQ29udGV4dDtcclxuICAgICAgICB0aGlzLmlzQnJvd3NlckVudmlyb25tZW50ID1cclxuICAgICAgICAgICAgdGhpcy5vcGVyYXRpbmdDb250ZXh0LmlzQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBjb25maWd1cmF0aW9uLlxyXG4gICAgICAgIHRoaXMuY29uZmlnID0gb3BlcmF0aW5nQ29udGV4dC5nZXRDb25maWcoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2dnZXJcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IHRoaXMub3BlcmF0aW5nQ29udGV4dC5nZXRMb2dnZXIoKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBuZXR3b3JrIG1vZHVsZSBjbGFzcy5cclxuICAgICAgICB0aGlzLm5ldHdvcmtDbGllbnQgPSB0aGlzLmNvbmZpZy5zeXN0ZW0ubmV0d29ya0NsaWVudDtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBuYXZpZ2F0aW9uIGNsaWVudCBjbGFzcy5cclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25DbGllbnQgPSB0aGlzLmNvbmZpZy5zeXN0ZW0ubmF2aWdhdGlvbkNsaWVudDtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHJlZGlyZWN0UmVzcG9uc2UgTWFwXHJcbiAgICAgICAgdGhpcy5yZWRpcmVjdFJlc3BvbnNlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8vIEluaXRpYWwgaHlicmlkIHNwYSBtYXBcclxuICAgICAgICB0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgcGVyZm9ybWFuY2UgY2xpZW50XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCA9IHRoaXMuY29uZmlnLnRlbGVtZXRyeS5jbGllbnQ7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY3J5cHRvIGNsYXNzLlxyXG4gICAgICAgIHRoaXMuYnJvd3NlckNyeXB0byA9IHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnRcclxuICAgICAgICAgICAgPyBuZXcgQ3J5cHRvT3BzKHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KVxyXG4gICAgICAgICAgICA6IERFRkFVTFRfQ1JZUFRPX0lNUExFTUVOVEFUSU9OO1xyXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcih0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnJvd3NlciBzdG9yYWdlIGNsYXNzLlxyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2UgPSB0aGlzLmlzQnJvd3NlckVudmlyb25tZW50XHJcbiAgICAgICAgICAgID8gbmV3IEJyb3dzZXJDYWNoZU1hbmFnZXIodGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCwgdGhpcy5jb25maWcuY2FjaGUsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIGJ1aWxkU3RhdGljQXV0aG9yaXR5T3B0aW9ucyh0aGlzLmNvbmZpZy5hdXRoKSwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudClcclxuICAgICAgICAgICAgOiBERUZBVUxUX0JST1dTRVJfQ0FDSEVfTUFOQUdFUih0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBpbiBtZW1vcnkgc3RvcmFnZSBmb3IgbmF0aXZlIGZsb3dzXHJcbiAgICAgICAgY29uc3QgbmF0aXZlQ2FjaGVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBjYWNoZUxvY2F0aW9uOiBCcm93c2VyQ2FjaGVMb2NhdGlvbi5NZW1vcnlTdG9yYWdlLFxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlDYWNoZUxvY2F0aW9uOiBCcm93c2VyQ2FjaGVMb2NhdGlvbi5NZW1vcnlTdG9yYWdlLFxyXG4gICAgICAgICAgICBzdG9yZUF1dGhTdGF0ZUluQ29va2llOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VjdXJlQ29va2llczogZmFsc2UsXHJcbiAgICAgICAgICAgIGNhY2hlTWlncmF0aW9uRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsYWltc0Jhc2VkQ2FjaGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UgPSBuZXcgQnJvd3NlckNhY2hlTWFuYWdlcih0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCBuYXRpdmVDYWNoZU9wdGlvbnMsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIHVuZGVmaW5lZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdG9rZW4gY2FjaGVcclxuICAgICAgICB0aGlzLnRva2VuQ2FjaGUgPSBuZXcgVG9rZW5DYWNoZSh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5sb2dnZXIsIHRoaXMuYnJvd3NlckNyeXB0byk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8vIFJlZ2lzdGVyIGxpc3RlbmVyIGZ1bmN0aW9uc1xyXG4gICAgICAgIHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eSA9IHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIFJlZ2lzdGVyIGxpc3RlbmVyIGZ1bmN0aW9uc1xyXG4gICAgICAgIHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCA9XHJcbiAgICAgICAgICAgIHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIGFjY291bnQgc3RvcmFnZSBldmVudHNcclxuICAgICAgICB0aGlzLmxpc3RlbmluZ1RvU3RvcmFnZUV2ZW50cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWNjb3VudENhY2hlQ2hhbmdlID1cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NvdW50Q2FjaGVDaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGVDb250cm9sbGVyKG9wZXJhdGluZ0NvbnRleHQsIHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IFN0YW5kYXJkQ29udHJvbGxlcihvcGVyYXRpbmdDb250ZXh0KTtcclxuICAgICAgICBhd2FpdCBjb250cm9sbGVyLmluaXRpYWxpemUocmVxdWVzdCk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7XHJcbiAgICB9XHJcbiAgICB0cmFja1BhZ2VWaXNpYmlsaXR5KGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiUGVyZjogVmlzaWJpbGl0eSBjaGFuZ2UgZGV0ZWN0ZWRcIik7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoeyB2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6IDEgfSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYXN5bmMgc3RhcnR1cCB0YXNrcyBzdWNoIGFzIGNvbm5lY3RpbmcgdG8gV0FNIGV4dGVuc2lvblxyXG4gICAgICogQHBhcmFtIHJlcXVlc3Qgez9Jbml0aWFsaXplQXBwbGljYXRpb25SZXF1ZXN0fSBjb3JyZWxhdGlvbiBpZFxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplKHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcImluaXRpYWxpemUgY2FsbGVkXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJpbml0aWFsaXplIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBleGl0aW5nIGVhcmx5LlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcImluIG5vbi1icm93c2VyIGVudmlyb25tZW50LCBleGl0aW5nIGVhcmx5LlwiKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuSU5JVElBTElaRV9FTkQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGluaXRDb3JyZWxhdGlvbklkID0gcmVxdWVzdD8uY29ycmVsYXRpb25JZCB8fCB0aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKCk7XHJcbiAgICAgICAgY29uc3QgYWxsb3dOYXRpdmVCcm9rZXIgPSB0aGlzLmNvbmZpZy5zeXN0ZW0uYWxsb3dOYXRpdmVCcm9rZXI7XHJcbiAgICAgICAgY29uc3QgaW5pdE1lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVDbGllbnRBcHBsaWNhdGlvbiwgaW5pdENvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuSU5JVElBTElaRV9TVEFSVCk7XHJcbiAgICAgICAgaWYgKGFsbG93TmF0aXZlQnJva2VyKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyID1cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBOYXRpdmVNZXNzYWdlSGFuZGxlci5jcmVhdGVQcm92aWRlcih0aGlzLmxvZ2dlciwgdGhpcy5jb25maWcuc3lzdGVtLm5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuY2FjaGUuY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ2xhaW1zLWJhc2VkIGNhY2hpbmcgaXMgZGlzYWJsZWQuIENsZWFyaW5nIHRoZSBwcmV2aW91cyBjYWNoZSB3aXRoIGNsYWltc1wiKTtcclxuICAgICAgICAgICAgYXdhaXQgaW52b2tlQXN5bmModGhpcy5icm93c2VyU3RvcmFnZS5jbGVhclRva2Vuc0FuZEtleXNXaXRoQ2xhaW1zLmJpbmQodGhpcy5icm93c2VyU3RvcmFnZSksIFBlcmZvcm1hbmNlRXZlbnRzLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCBpbml0Q29ycmVsYXRpb25JZCkodGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgaW5pdENvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLklOSVRJQUxJWkVfRU5EKTtcclxuICAgICAgICBpbml0TWVhc3VyZW1lbnQuZW5kKHsgYWxsb3dOYXRpdmVCcm9rZXIsIHN1Y2Nlc3M6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICAvLyAjcmVnaW9uIFJlZGlyZWN0IEZsb3dcclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgaGFuZGxlciBmdW5jdGlvbiB3aGljaCBhbGxvd3MgdXNlcnMgdG8gZmlyZSBldmVudHMgYWZ0ZXIgdGhlIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIG9iamVjdFxyXG4gICAgICogaGFzIGxvYWRlZCBkdXJpbmcgcmVkaXJlY3QgZmxvd3MuIFRoaXMgc2hvdWxkIGJlIGludm9rZWQgb24gYWxsIHBhZ2UgbG9hZHMgaW52b2x2ZWQgaW4gcmVkaXJlY3RcclxuICAgICAqIGF1dGggZmxvd3MuXHJcbiAgICAgKiBAcGFyYW0gaGFzaCBIYXNoIHRvIHByb2Nlc3MuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHdpbmRvdy5sb2NhdGlvbi5oYXNoLiBPbmx5IG5lZWRzIHRvIGJlIHByb3ZpZGVkIGV4cGxpY2l0bHkgaWYgdGhlIHJlc3BvbnNlIHRvIGJlIGhhbmRsZWQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIFRva2VuIHJlc3BvbnNlIG9yIG51bGwuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbnVsbCwgdGhlbiBubyBhdXRoIHJlZGlyZWN0IHdhcyBkZXRlY3RlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaGFuZGxlUmVkaXJlY3RQcm9taXNlKGhhc2gpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiaGFuZGxlUmVkaXJlY3RQcm9taXNlIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBCbG9jayB0b2tlbiBhY3F1aXNpdGlvbiBiZWZvcmUgaW5pdGlhbGl6ZSBoYXMgYmVlbiBjYWxsZWRcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBpZiAodGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudCkge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogU3RvcmUgdGhlIHByb21pc2Ugb24gdGhlIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIGluc3RhbmNlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGludm9jYXRpb24gb2YgaGFuZGxlUmVkaXJlY3RQcm9taXNlLFxyXG4gICAgICAgICAgICAgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBwcm9taXNlIGZyb20gdGhlIGZpcnN0IGludm9jYXRpb24uIFByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyB3aGVuIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBpcyBjYWxsZWRcclxuICAgICAgICAgICAgICogc2V2ZXJhbCB0aW1lcyBjb25jdXJyZW50bHkuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdFJlc3BvbnNlS2V5ID0gaGFzaCB8fCBcIlwiO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnJlZGlyZWN0UmVzcG9uc2UuZ2V0KHJlZGlyZWN0UmVzcG9uc2VLZXkpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHRoaXMuaGFuZGxlUmVkaXJlY3RQcm9taXNlSW50ZXJuYWwoaGFzaCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0UmVzcG9uc2Uuc2V0KHJlZGlyZWN0UmVzcG9uc2VLZXksIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgaGFzIGJlZW4gY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgc3RvcmluZyB0aGUgcHJvbWlzZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgaGFzIGJlZW4gY2FsbGVkIHByZXZpb3VzbHksIHJldHVybmluZyB0aGUgcmVzdWx0IGZyb20gdGhlIGZpcnN0IGNhbGxcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiaGFuZGxlUmVkaXJlY3RQcm9taXNlIHJldHVybnMgbnVsbCwgbm90IGJyb3dzZXIgZW52aXJvbm1lbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnRlcm5hbCBkZXRhaWxzIG9mIGhhbmRsZVJlZGlyZWN0UHJvbWlzZS4gVGhpcyBpcyBzZXBhcmF0ZWQgb3V0IHRvIGEgaGVscGVyIHRvIGFsbG93IGhhbmRsZVJlZGlyZWN0UHJvbWlzZSB0byBtZW1vaXplIHJlcXVlc3RzXHJcbiAgICAgKiBAcGFyYW0gaGFzaFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaGFuZGxlUmVkaXJlY3RQcm9taXNlSW50ZXJuYWwoaGFzaCkge1xyXG4gICAgICAgIGNvbnN0IGxvZ2dlZEluQWNjb3VudHMgPSB0aGlzLmdldEFsbEFjY291bnRzKCk7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCgpO1xyXG4gICAgICAgIGNvbnN0IHVzZU5hdGl2ZSA9IHJlcXVlc3QgJiZcclxuICAgICAgICAgICAgTmF0aXZlTWVzc2FnZUhhbmRsZXIuaXNOYXRpdmVBdmFpbGFibGUodGhpcy5jb25maWcsIHRoaXMubG9nZ2VyLCB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyKSAmJlxyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyICYmXHJcbiAgICAgICAgICAgICFoYXNoO1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB1c2VOYXRpdmVcclxuICAgICAgICAgICAgPyByZXF1ZXN0Py5jb3JyZWxhdGlvbklkXHJcbiAgICAgICAgICAgIDogdGhpcy5icm93c2VyU3RvcmFnZS5nZXRUZW1wb3JhcnlDYWNoZShUZW1wb3JhcnlDYWNoZUtleXMuQ09SUkVMQVRJT05fSUQsIHRydWUpIHx8IFwiXCI7XHJcbiAgICAgICAgY29uc3Qgcm9vdE1lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblJlZGlyZWN0LCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkhBTkRMRV9SRURJUkVDVF9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0KTtcclxuICAgICAgICBsZXQgcmVkaXJlY3RSZXNwb25zZTtcclxuICAgICAgICBpZiAodXNlTmF0aXZlICYmIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgLSBhY3F1aXJpbmcgdG9rZW4gZnJvbSBuYXRpdmUgcGxhdGZvcm1cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUNsaWVudCA9IG5ldyBOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdGhpcy5ldmVudEhhbmRsZXIsIHRoaXMubmF2aWdhdGlvbkNsaWVudCwgQXBpSWQuaGFuZGxlUmVkaXJlY3RQcm9taXNlLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyLCByZXF1ZXN0LmFjY291bnRJZCwgdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0UmVzcG9uc2UgPSBpbnZva2VBc3luYyhuYXRpdmVDbGllbnQuaGFuZGxlUmVkaXJlY3RQcm9taXNlLmJpbmQobmF0aXZlQ2xpZW50KSwgUGVyZm9ybWFuY2VFdmVudHMuSGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCByb290TWVhc3VyZW1lbnQuZXZlbnQuY29ycmVsYXRpb25JZCkodGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcm9vdE1lYXN1cmVtZW50LmV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJoYW5kbGVSZWRpcmVjdFByb21pc2UgLSBhY3F1aXJpbmcgdG9rZW4gZnJvbSB3ZWIgZmxvd1wiKTtcclxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RDbGllbnQgPSB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICByZWRpcmVjdFJlc3BvbnNlID0gaW52b2tlQXN5bmMocmVkaXJlY3RDbGllbnQuaGFuZGxlUmVkaXJlY3RQcm9taXNlLmJpbmQocmVkaXJlY3RDbGllbnQpLCBQZXJmb3JtYW5jZUV2ZW50cy5IYW5kbGVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudCwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJvb3RNZWFzdXJlbWVudC5ldmVudC5jb3JyZWxhdGlvbklkKShoYXNoLCByb290TWVhc3VyZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVkaXJlY3RSZXNwb25zZVxyXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEVtaXQgbG9naW4gZXZlbnQgaWYgbnVtYmVyIG9mIGFjY291bnRzIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNMb2dnaW5nSW4gPSBsb2dnZWRJbkFjY291bnRzLmxlbmd0aCA8IHRoaXMuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dnaW5nSW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR0lOX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSByZXR1cm5lZCByZXN1bHQsIGxvZ2luIHN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LCByZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJoYW5kbGVSZWRpcmVjdFJlc3BvbnNlIHJldHVybmVkIHJlc3VsdCwgYWNxdWlyZSB0b2tlbiBzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm9vdE1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogZ2V0QWNjb3VudFR5cGUocmVzdWx0LmFjY291bnQpLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgICogSW5zdHJ1bWVudCBhbiBldmVudCBvbmx5IGlmIGFuIGVycm9yIGNvZGUgaXMgc2V0LiBPdGhlcndpc2UsIGRpc2NhcmQgaXQgd2hlbiB0aGUgcmVkaXJlY3QgcmVzcG9uc2VcclxuICAgICAgICAgICAgICAgICAqIGlzIGVtcHR5IGFuZCB0aGUgZXJyb3IgY29kZSBpcyBtaXNzaW5nLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAocm9vdE1lYXN1cmVtZW50LmV2ZW50LmVycm9yQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RNZWFzdXJlbWVudC5lbmQoeyBzdWNjZXNzOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RNZWFzdXJlbWVudC5kaXNjYXJkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5IQU5ETEVfUkVESVJFQ1RfRU5ELCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudEVycm9yID0gZTtcclxuICAgICAgICAgICAgLy8gRW1pdCBsb2dpbiBldmVudCBpZiB0aGVyZSBpcyBhbiBhY2NvdW50XHJcbiAgICAgICAgICAgIGlmIChsb2dnZWRJbkFjY291bnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsIG51bGwsIGV2ZW50RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dJTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsIG51bGwsIGV2ZW50RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuSEFORExFX1JFRElSRUNUX0VORCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0KTtcclxuICAgICAgICAgICAgcm9vdE1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgfSwgZXZlbnRFcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZSB3aGVuIHlvdSB3YW50IHRvIG9idGFpbiBhbiBhY2Nlc3NfdG9rZW4gZm9yIHlvdXIgQVBJIGJ5IHJlZGlyZWN0aW5nIHRoZSB1c2VyJ3MgYnJvd3NlciB3aW5kb3cgdG8gdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQuIFRoaXMgZnVuY3Rpb24gcmVkaXJlY3RzXHJcbiAgICAgKiB0aGUgcGFnZSwgc28gYW55IGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZXhlY3V0ZS5cclxuICAgICAqXHJcbiAgICAgKiBJTVBPUlRBTlQ6IEl0IGlzIE5PVCByZWNvbW1lbmRlZCB0byBoYXZlIGNvZGUgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UuIFRoaXMgZnVuY3Rpb24gd2lsbCBuYXZpZ2F0ZSBhd2F5IGZyb20gdGhlIGN1cnJlbnRcclxuICAgICAqIGJyb3dzZXIgd2luZG93LiBJdCBjdXJyZW50bHkgcmV0dXJucyBhIFByb21pc2UgaW4gb3JkZXIgdG8gcmVmbGVjdCB0aGUgYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGUgY29kZSBydW5uaW5nIGluIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuUmVkaXJlY3QocmVxdWVzdCkge1xyXG4gICAgICAgIC8vIFByZWZsaWdodCByZXF1ZXN0XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQocmVxdWVzdCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImFjcXVpcmVUb2tlblJlZGlyZWN0IGNhbGxlZFwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCBhdHJNZWFzdXJlbWVudCA9IHRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BY3F1aXJlVG9rZW5QcmVSZWRpcmVjdCwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgYXRyTWVhc3VyZW1lbnQuYWRkKHtcclxuICAgICAgICAgICAgYWNjb3VudFR5cGU6IGdldEFjY291bnRUeXBlKHJlcXVlc3QuYWNjb3VudCksXHJcbiAgICAgICAgICAgIHNjZW5hcmlvSWQ6IHJlcXVlc3Quc2NlbmFyaW9JZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBPdmVycmlkZSBvbiByZXF1ZXN0IG9ubHkgaWYgc2V0LCBhcyBvblJlZGlyZWN0TmF2aWdhdGUgZmllbGQgaXMgZGVwcmVjYXRlZFxyXG4gICAgICAgIGNvbnN0IG9uUmVkaXJlY3ROYXZpZ2F0ZUNiID0gcmVxdWVzdC5vblJlZGlyZWN0TmF2aWdhdGU7XHJcbiAgICAgICAgaWYgKG9uUmVkaXJlY3ROYXZpZ2F0ZUNiKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25SZWRpcmVjdE5hdmlnYXRlID0gKHVybCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGUgPSB0eXBlb2Ygb25SZWRpcmVjdE5hdmlnYXRlQ2IgPT09IFwiZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgID8gb25SZWRpcmVjdE5hdmlnYXRlQ2IodXJsKVxyXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0ck1lYXN1cmVtZW50LmVuZCh7IHN1Y2Nlc3M6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHJNZWFzdXJlbWVudC5kaXNjYXJkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdGU7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWdPblJlZGlyZWN0TmF2aWdhdGVDYiA9IHRoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlO1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hdXRoLm9uUmVkaXJlY3ROYXZpZ2F0ZSA9ICh1cmwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRlID0gdHlwZW9mIGNvbmZpZ09uUmVkaXJlY3ROYXZpZ2F0ZUNiID09PSBcImZ1bmN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZ09uUmVkaXJlY3ROYXZpZ2F0ZUNiKHVybClcclxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGlmIChuYXZpZ2F0ZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHJNZWFzdXJlbWVudC5lbmQoeyBzdWNjZXNzOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXRyTWVhc3VyZW1lbnQuZGlzY2FyZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRlO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBsb2dnZWQgaW4sIGVtaXQgYWNxdWlyZSB0b2tlbiBldmVudHNcclxuICAgICAgICBjb25zdCBpc0xvZ2dlZEluID0gdGhpcy5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVkaXJlY3RQcmVmbGlnaHRDaGVjayh0aGlzLmluaXRpYWxpemVkLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKHRydWUpO1xyXG4gICAgICAgICAgICBpZiAoaXNMb2dnZWRJbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NUQVJULCBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsIHJlcXVlc3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dJTl9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LCByZXF1ZXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciAmJiB0aGlzLmNhblVzZU5hdGl2ZShyZXF1ZXN0KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlQ2xpZW50ID0gbmV3IE5hdGl2ZUludGVyYWN0aW9uQ2xpZW50KHRoaXMuY29uZmlnLCB0aGlzLmJyb3dzZXJTdG9yYWdlLCB0aGlzLmJyb3dzZXJDcnlwdG8sIHRoaXMubG9nZ2VyLCB0aGlzLmV2ZW50SGFuZGxlciwgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LCBBcGlJZC5hY3F1aXJlVG9rZW5SZWRpcmVjdCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciwgdGhpcy5nZXROYXRpdmVBY2NvdW50SWQocmVxdWVzdCksIHRoaXMubmF0aXZlSW50ZXJuYWxTdG9yYWdlLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5hdGl2ZUNsaWVudFxyXG4gICAgICAgICAgICAgICAgICAgIC5hY3F1aXJlVG9rZW5SZWRpcmVjdChyZXF1ZXN0LCBhdHJNZWFzdXJlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5hdGl2ZUF1dGhFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0ZhdGFsTmF0aXZlQXV0aEVycm9yKGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIgPSB1bmRlZmluZWQ7IC8vIElmIGV4dGVuc2lvbiBnZXRzIHVuaW5zdGFsbGVkIGR1cmluZyBzZXNzaW9uIHByZXZlbnQgZnV0dXJlIHJlcXVlc3RzIGZyb20gY29udGludWluZyB0byBhdHRlbXB0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0Q2xpZW50ID0gdGhpcy5jcmVhdGVSZWRpcmVjdENsaWVudChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0Q2xpZW50LmFjcXVpcmVUb2tlbihyZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImFjcXVpcmVUb2tlblJlZGlyZWN0IC0gUmVzb2x2aW5nIGludGVyYWN0aW9uIHJlcXVpcmVkIGVycm9yIHRocm93biBieSBuYXRpdmUgYnJva2VyIGJ5IGZhbGxpbmcgYmFjayB0byB3ZWIgZmxvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RDbGllbnQgPSB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3RDbGllbnQuYWNxdWlyZVRva2VuKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RDbGllbnQgPSB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVkaXJlY3RDbGllbnQuYWNxdWlyZVRva2VuKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGF0ck1lYXN1cmVtZW50LmVuZCh7IHN1Y2Nlc3M6IGZhbHNlIH0sIGUpO1xyXG4gICAgICAgICAgICBpZiAoaXNMb2dnZWRJbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCwgbnVsbCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkxPR0lOX0ZBSUxVUkUsIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCwgbnVsbCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcbiAgICAvLyAjcmVnaW9uIFBvcHVwIEZsb3dcclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4geW91IHdhbnQgdG8gb2J0YWluIGFuIGFjY2Vzc190b2tlbiBmb3IgeW91ciBBUEkgdmlhIG9wZW5pbmcgYSBwb3B1cCB3aW5kb3cgaW4gdGhlIHVzZXIncyBicm93c2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIHdhcyByYWlzZWQuXHJcbiAgICAgKi9cclxuICAgIGFjcXVpcmVUb2tlblBvcHVwKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gdGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChyZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBhdFBvcHVwTWVhc3VyZW1lbnQgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuUG9wdXAsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGF0UG9wdXBNZWFzdXJlbWVudC5hZGQoe1xyXG4gICAgICAgICAgICBzY2VuYXJpb0lkOiByZXF1ZXN0LnNjZW5hcmlvSWQsXHJcbiAgICAgICAgICAgIGFjY291bnRUeXBlOiBnZXRBY2NvdW50VHlwZShyZXF1ZXN0LmFjY291bnQpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJhY3F1aXJlVG9rZW5Qb3B1cCBjYWxsZWRcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHByZWZsaWdodENoZWNrKHRoaXMuaW5pdGlhbGl6ZWQsIGF0UG9wdXBNZWFzdXJlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN5bmNyb25vdXMgd2UgbmVlZCB0byByZWplY3RcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBsb2dnZWQgaW4sIGVtaXQgYWNxdWlyZSB0b2tlbiBldmVudHNcclxuICAgICAgICBjb25zdCBsb2dnZWRJbkFjY291bnRzID0gdGhpcy5nZXRBbGxBY2NvdW50cygpO1xyXG4gICAgICAgIGlmIChsb2dnZWRJbkFjY291bnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NUQVJULCBJbnRlcmFjdGlvblR5cGUuUG9wdXAsIHJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dJTl9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAodGhpcy5jYW5Vc2VOYXRpdmUocmVxdWVzdCkpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5hY3F1aXJlVG9rZW5OYXRpdmUoe1xyXG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIH0sIEFwaUlkLmFjcXVpcmVUb2tlblBvcHVwKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBhdFBvcHVwTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzTmF0aXZlQnJva2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRUeXBlOiBnZXRBY2NvdW50VHlwZShyZXNwb25zZS5hY2NvdW50KSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5hdGl2ZUF1dGhFcnJvciAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzRmF0YWxOYXRpdmVBdXRoRXJyb3IoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyID0gdW5kZWZpbmVkOyAvLyBJZiBleHRlbnNpb24gZ2V0cyB1bmluc3RhbGxlZCBkdXJpbmcgc2Vzc2lvbiBwcmV2ZW50IGZ1dHVyZSByZXF1ZXN0cyBmcm9tIGNvbnRpbnVpbmcgdG8gYXR0ZW1wdFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcHVwQ2xpZW50ID0gdGhpcy5jcmVhdGVQb3B1cENsaWVudChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9wdXBDbGllbnQuYWNxdWlyZVRva2VuKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWNxdWlyZVRva2VuUG9wdXAgLSBSZXNvbHZpbmcgaW50ZXJhY3Rpb24gcmVxdWlyZWQgZXJyb3IgdGhyb3duIGJ5IG5hdGl2ZSBicm9rZXIgYnkgZmFsbGluZyBiYWNrIHRvIHdlYiBmbG93XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcHVwQ2xpZW50ID0gdGhpcy5jcmVhdGVQb3B1cENsaWVudChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9wdXBDbGllbnQuYWNxdWlyZVRva2VuKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cENsaWVudCA9IHRoaXMuY3JlYXRlUG9wdXBDbGllbnQoY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHBvcHVwQ2xpZW50LmFjcXVpcmVUb2tlbihyZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqICBJZiBsb2dnZWQgaW4sIGVtaXQgYWNxdWlyZSB0b2tlbiBldmVudHNcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTG9nZ2luZ0luID0gbG9nZ2VkSW5BY2NvdW50cy5sZW5ndGggPCB0aGlzLmdldEFsbEFjY291bnRzKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoaXNMb2dnaW5nSW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuTE9HSU5fU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCByZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhdFBvcHVwTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlblNpemU6IHJlc3VsdC5hY2Nlc3NUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBpZFRva2VuU2l6ZTogcmVzdWx0LmlkVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgYWNjb3VudFR5cGU6IGdldEFjY291bnRUeXBlKHJlc3VsdC5hY2NvdW50KSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsb2dnZWRJbkFjY291bnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuUG9wdXAsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5MT0dJTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuUG9wdXAsIG51bGwsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF0UG9wdXBNZWFzdXJlbWVudC5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sIGUpO1xyXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN5bmNyb25vdXMgd2UgbmVlZCB0byByZWplY3RcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCgpIHtcclxuICAgICAgICBjb25zdCBtZWFzdXJlbWVudCA9IHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQgfHxcclxuICAgICAgICAgICAgdGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50O1xyXG4gICAgICAgIGlmICghbWVhc3VyZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiUGVyZjogVmlzaWJpbGl0eSBjaGFuZ2UgZGV0ZWN0ZWQgaW4gXCIsIG1lYXN1cmVtZW50LmV2ZW50Lm5hbWUpO1xyXG4gICAgICAgIG1lYXN1cmVtZW50LmluY3JlbWVudCh7XHJcbiAgICAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VDb3VudDogMSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICAgIC8vICNyZWdpb24gU2lsZW50IEZsb3dcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGEgaGlkZGVuIGlmcmFtZSB0byBmZXRjaCBhbiBhdXRob3JpemF0aW9uIGNvZGUgZnJvbSB0aGUgZVNUUy4gVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoaXMgbWF5IG5vdCB3b3JrOlxyXG4gICAgICogLSBBbnkgYnJvd3NlciB1c2luZyBhIGZvcm0gb2YgSW50ZWxsaWdlbnQgVHJhY2tpbmcgUHJldmVudGlvblxyXG4gICAgICogLSBJZiB0aGVyZSBpcyBub3QgYW4gZXN0YWJsaXNoZWQgc2Vzc2lvbiB3aXRoIHRoZSBzZXJ2aWNlXHJcbiAgICAgKlxyXG4gICAgICogSW4gdGhlc2UgY2FzZXMsIHRoZSByZXF1ZXN0IG11c3QgYmUgZG9uZSBpbnNpZGUgYSBwb3B1cCBvciBmdWxsIGZyYW1lIHJlZGlyZWN0LlxyXG4gICAgICpcclxuICAgICAqIEZvciB0aGUgY2FzZXMgd2hlcmUgaW50ZXJhY3Rpb24gaXMgcmVxdWlyZWQsIHlvdSBjYW5ub3Qgc2VuZCBhIHJlcXVlc3Qgd2l0aCBwcm9tcHQ9bm9uZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3VyIHJlZnJlc2ggdG9rZW4gaGFzIGV4cGlyZWQsIHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZmV0Y2ggYSBuZXcgc2V0IG9mIHRva2VucyBzaWxlbnRseSBhcyBsb25nIGFzXHJcbiAgICAgKiB5b3Ugc2Vzc2lvbiBvbiB0aGUgc2VydmVyIHN0aWxsIGV4aXN0cy5cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IHtAbGluayBTc29TaWxlbnRSZXF1ZXN0fVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgc3NvU2lsZW50KHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gdGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChyZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCB2YWxpZFJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgIC4uLnJlcXVlc3QsXHJcbiAgICAgICAgICAgIC8vIHdpbGwgYmUgUHJvbXB0VmFsdWUuTk9ORSBvciBQcm9tcHRWYWx1ZS5OT19TRVNTSU9OXHJcbiAgICAgICAgICAgIHByb21wdDogcmVxdWVzdC5wcm9tcHQsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlNzb1NpbGVudCwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uYWRkKHtcclxuICAgICAgICAgICAgc2NlbmFyaW9JZDogcmVxdWVzdC5zY2VuYXJpb0lkLFxyXG4gICAgICAgICAgICBhY2NvdW50VHlwZTogZ2V0QWNjb3VudFR5cGUocmVxdWVzdC5hY2NvdW50KSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcmVmbGlnaHRDaGVjayh0aGlzLmluaXRpYWxpemVkLCB0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50KTtcclxuICAgICAgICB0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50Py5pbmNyZW1lbnQoe1xyXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5V2l0aE1lYXN1cmVtZW50KTtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwic3NvU2lsZW50IGNhbGxlZFwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLlNTT19TSUxFTlRfU1RBUlQsIEludGVyYWN0aW9uVHlwZS5TaWxlbnQsIHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICBpZiAodGhpcy5jYW5Vc2VOYXRpdmUodmFsaWRSZXF1ZXN0KSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFjcXVpcmVUb2tlbk5hdGl2ZSh2YWxpZFJlcXVlc3QsIEFwaUlkLnNzb1NpbGVudCkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIElmIG5hdGl2ZSB0b2tlbiBhY3F1aXNpdGlvbiBmYWlscyBmb3IgYXZhaWxhYmlsaXR5IHJlYXNvbnMgZmFsbGJhY2sgdG8gc3RhbmRhcmQgZmxvd1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOYXRpdmVBdXRoRXJyb3IgJiYgaXNGYXRhbE5hdGl2ZUF1dGhFcnJvcihlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIgPSB1bmRlZmluZWQ7IC8vIElmIGV4dGVuc2lvbiBnZXRzIHVuaW5zdGFsbGVkIGR1cmluZyBzZXNzaW9uIHByZXZlbnQgZnV0dXJlIHJlcXVlc3RzIGZyb20gY29udGludWluZyB0byBhdHRlbXB0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lsZW50SWZyYW1lQ2xpZW50ID0gdGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQodmFsaWRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWxlbnRJZnJhbWVDbGllbnQuYWNxdWlyZVRva2VuKHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpbGVudElmcmFtZUNsaWVudCA9IHRoaXMuY3JlYXRlU2lsZW50SWZyYW1lQ2xpZW50KHZhbGlkUmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gc2lsZW50SWZyYW1lQ2xpZW50LmFjcXVpcmVUb2tlbih2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLlNTT19TSUxFTlRfU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50Py5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGlzTmF0aXZlQnJva2VyOiByZXNwb25zZS5mcm9tTmF0aXZlQnJva2VyLFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5TaXplOiByZXNwb25zZS5hY2Nlc3NUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBpZFRva2VuU2l6ZTogcmVzcG9uc2UuaWRUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogZ2V0QWNjb3VudFR5cGUocmVzcG9uc2UuYWNjb3VudCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuU1NPX1NJTEVOVF9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCBudWxsLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uZW5kKHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgICB9LCBlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gcmVkZWVtcyBhbiBhdXRob3JpemF0aW9uIGNvZGUgKHBhc3NlZCBhcyBjb2RlKSBmcm9tIHRoZSBlU1RTIHRva2VuIGVuZHBvaW50LlxyXG4gICAgICogVGhpcyBhdXRob3JpemF0aW9uIGNvZGUgc2hvdWxkIGJlIGFjcXVpcmVkIHNlcnZlci1zaWRlIHVzaW5nIGEgY29uZmlkZW50aWFsIGNsaWVudCB0byBhY3F1aXJlIGEgc3BhX2NvZGUuXHJcbiAgICAgKiBUaGlzIEFQSSBpcyBub3QgaW5kZW5kZWQgZm9yIG5vcm1hbCBhdXRob3JpemF0aW9uIGNvZGUgYWNxdWlzaXRpb24gYW5kIHJlZGVtcHRpb24uXHJcbiAgICAgKlxyXG4gICAgICogUmVkZW1wdGlvbiBvZiB0aGlzIGF1dGhvcml6YXRpb24gY29kZSB3aWxsIG5vdCByZXF1aXJlIFBLQ0UsIGFzIGl0IHdhcyBhY3F1aXJlZCBieSBhIGNvbmZpZGVudGlhbCBjbGllbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3Qge0BsaW5rIEF1dGhvcml6YXRpb25Db2RlUmVxdWVzdH1cclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuQnlDb2RlKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gdGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChyZXF1ZXN0KTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcImFjcXVpcmVUb2tlbkJ5Q29kZSBjYWxsZWRcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgYXRiY01lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5Q29kZSwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcHJlZmxpZ2h0Q2hlY2sodGhpcy5pbml0aWFsaXplZCwgYXRiY01lYXN1cmVtZW50KTtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgcmVxdWVzdCk7XHJcbiAgICAgICAgYXRiY01lYXN1cmVtZW50LmFkZCh7IHNjZW5hcmlvSWQ6IHJlcXVlc3Quc2NlbmFyaW9JZCB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5jb2RlICYmIHJlcXVlc3QubmF0aXZlQWNjb3VudElkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaHJvdyBlcnJvciBpbiBjYXNlIHNlcnZlciByZXR1cm5zIGJvdGggc3BhX2NvZGUgYW5kIHNwYV9hY2NvdW50aWQgaW4gZXhjaGFuZ2UgZm9yIGF1dGggY29kZS5cclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUJyb3dzZXJBdXRoRXJyb3Ioc3BhQ29kZUFuZE5hdGl2ZUFjY291bnRJZFByZXNlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcXVlc3QuY29kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHlicmlkQXV0aENvZGUgPSByZXF1ZXN0LmNvZGU7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzLmdldChoeWJyaWRBdXRoQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIkluaXRpYXRpbmcgbmV3IGFjcXVpcmVUb2tlbkJ5Q29kZSByZXF1ZXN0XCIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9TVUNDRVNTLCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCByZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzLmRlbGV0ZShoeWJyaWRBdXRoQ29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0YmNNZWFzdXJlbWVudC5lbmQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmF0aXZlQnJva2VyOiByZXN1bHQuZnJvbU5hdGl2ZUJyb2tlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuU2l6ZTogcmVzdWx0LmFjY2Vzc1Rva2VuLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5TaXplOiByZXN1bHQuaWRUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogZ2V0QWNjb3VudFR5cGUocmVzdWx0LmFjY291bnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHlicmlkQXV0aENvZGVSZXNwb25zZXMuZGVsZXRlKGh5YnJpZEF1dGhDb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0JZX0NPREVfRkFJTFVSRSwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgbnVsbCwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdGJjTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaHlicmlkQXV0aENvZGVSZXNwb25zZXMuc2V0KGh5YnJpZEF1dGhDb2RlLCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiRXhpc3RpbmcgYWNxdWlyZVRva2VuQnlDb2RlIHJlcXVlc3QgZm91bmRcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXRiY01lYXN1cmVtZW50LmRpc2NhcmQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyZXF1ZXN0Lm5hdGl2ZUFjY291bnRJZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuVXNlTmF0aXZlKHJlcXVlc3QsIHJlcXVlc3QubmF0aXZlQWNjb3VudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWNxdWlyZVRva2VuTmF0aXZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICB9LCBBcGlJZC5hY3F1aXJlVG9rZW5CeUNvZGUsIHJlcXVlc3QubmF0aXZlQWNjb3VudElkKS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBuYXRpdmUgdG9rZW4gYWNxdWlzaXRpb24gZmFpbHMgZm9yIGF2YWlsYWJpbGl0eSByZWFzb25zIGZhbGxiYWNrIHRvIHN0YW5kYXJkIGZsb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOYXRpdmVBdXRoRXJyb3IgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmF0YWxOYXRpdmVBdXRoRXJyb3IoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIgPSB1bmRlZmluZWQ7IC8vIElmIGV4dGVuc2lvbiBnZXRzIHVuaW5zdGFsbGVkIGR1cmluZyBzZXNzaW9uIHByZXZlbnQgZnV0dXJlIHJlcXVlc3RzIGZyb20gY29udGludWluZyB0byBhdHRlbXB0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhdGJjTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudFR5cGU6IGdldEFjY291bnRUeXBlKHJlc3VsdC5hY2NvdW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcih1bmFibGVUb0FjcXVpcmVUb2tlbkZyb21OYXRpdmVQbGF0Zm9ybSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50SWRSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0JZX0NPREVfRkFJTFVSRSwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgbnVsbCwgZSk7XHJcbiAgICAgICAgICAgIGF0YmNNZWFzdXJlbWVudC5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAgIH0sIGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFNpbGVudEF1dGhDb2RlQ2xpZW50IHRvIHJlZGVlbSBhbiBhdXRob3JpemF0aW9uIGNvZGUuXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gdG8gcmVkZWVtIHRoZSBhdXRob3JpemF0aW9uIGNvZGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMocmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMgY2FsbGVkXCIsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50ID1cclxuICAgICAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD8uaW5jcmVtZW50KHtcclxuICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZUNvdW50OiAwLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCk7XHJcbiAgICAgICAgY29uc3Qgc2lsZW50QXV0aENvZGVDbGllbnQgPSB0aGlzLmNyZWF0ZVNpbGVudEF1dGhDb2RlQ2xpZW50KHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3Qgc2lsZW50VG9rZW5SZXN1bHQgPSBhd2FpdCBzaWxlbnRBdXRoQ29kZUNsaWVudFxyXG4gICAgICAgICAgICAuYWNxdWlyZVRva2VuKHJlcXVlc3QpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jTWVhc3VyZW1lbnQ/LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZnJvbUNhY2hlOiByZXNwb25zZS5mcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpc05hdGl2ZUJyb2tlcjogcmVzcG9uc2UuZnJvbU5hdGl2ZUJyb2tlcixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKHRva2VuUmVuZXdhbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD8uZW5kKHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgICB9LCB0b2tlblJlbmV3YWxFcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IHRva2VuUmVuZXdhbEVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5V2l0aE1lYXN1cmVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc2lsZW50VG9rZW5SZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHQgdG8gYWNxdWlyZSBhbiBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgY2FjaGVcclxuICAgICAqIEBwYXJhbSBzaWxlbnRDYWNoZUNsaWVudCBTaWxlbnRDYWNoZUNsaWVudFxyXG4gICAgICogQHBhcmFtIGNvbW1vblJlcXVlc3QgQ29tbW9uU2lsZW50Rmxvd1JlcXVlc3RcclxuICAgICAqIEBwYXJhbSBzaWxlbnRSZXF1ZXN0IFNpbGVudFJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0LCB3aGVuIHJlc29sdmVkLCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuRnJvbUNhY2hlKGNvbW1vblJlcXVlc3QsIGNhY2hlTG9va3VwUG9saWN5KSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkZyb21DYWNoZSwgY29tbW9uUmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBzd2l0Y2ggKGNhY2hlTG9va3VwUG9saWN5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ2FjaGVMb29rdXBQb2xpY3kuRGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSBDYWNoZUxvb2t1cFBvbGljeS5BY2Nlc3NUb2tlbjpcclxuICAgICAgICAgICAgY2FzZSBDYWNoZUxvb2t1cFBvbGljeS5BY2Nlc3NUb2tlbkFuZFJlZnJlc2hUb2tlbjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpbGVudENhY2hlQ2xpZW50ID0gdGhpcy5jcmVhdGVTaWxlbnRDYWNoZUNsaWVudChjb21tb25SZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHNpbGVudENhY2hlQ2xpZW50LmFjcXVpcmVUb2tlbi5iaW5kKHNpbGVudENhY2hlQ2xpZW50KSwgUGVyZm9ybWFuY2VFdmVudHMuU2lsZW50Q2FjaGVDbGllbnRBY3F1aXJlVG9rZW4sIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCBjb21tb25SZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKGNvbW1vblJlcXVlc3QpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKENsaWVudEF1dGhFcnJvckNvZGVzLnRva2VuUmVmcmVzaFJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHQgdG8gYWNxdWlyZSBhbiBhY2Nlc3MgdG9rZW4gdmlhIGEgcmVmcmVzaCB0b2tlblxyXG4gICAgICogQHBhcmFtIGNvbW1vblJlcXVlc3QgQ29tbW9uU2lsZW50Rmxvd1JlcXVlc3RcclxuICAgICAqIEBwYXJhbSBjYWNoZUxvb2t1cFBvbGljeSBDYWNoZUxvb2t1cFBvbGljeVxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQsIHdoZW4gcmVzb2x2ZWQsIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlblxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihjb21tb25SZXF1ZXN0LCBjYWNoZUxvb2t1cFBvbGljeSkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChQZXJmb3JtYW5jZUV2ZW50cy5BY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiwgY29tbW9uUmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBzd2l0Y2ggKGNhY2hlTG9va3VwUG9saWN5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ2FjaGVMb29rdXBQb2xpY3kuRGVmYXVsdDpcclxuICAgICAgICAgICAgY2FzZSBDYWNoZUxvb2t1cFBvbGljeS5BY2Nlc3NUb2tlbkFuZFJlZnJlc2hUb2tlbjpcclxuICAgICAgICAgICAgY2FzZSBDYWNoZUxvb2t1cFBvbGljeS5SZWZyZXNoVG9rZW46XHJcbiAgICAgICAgICAgIGNhc2UgQ2FjaGVMb29rdXBQb2xpY3kuUmVmcmVzaFRva2VuQW5kTmV0d29yazpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpbGVudFJlZnJlc2hDbGllbnQgPSB0aGlzLmNyZWF0ZVNpbGVudFJlZnJlc2hDbGllbnQoY29tbW9uUmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VBc3luYyhzaWxlbnRSZWZyZXNoQ2xpZW50LmFjcXVpcmVUb2tlbi5iaW5kKHNpbGVudFJlZnJlc2hDbGllbnQpLCBQZXJmb3JtYW5jZUV2ZW50cy5TaWxlbnRSZWZyZXNoQ2xpZW50QWNxdWlyZVRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29tbW9uUmVxdWVzdC5jb3JyZWxhdGlvbklkKShjb21tb25SZXF1ZXN0KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy50b2tlblJlZnJlc2hSZXF1aXJlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0IHRvIGFjcXVpcmUgYW4gYWNjZXNzIHRva2VuIHZpYSBhbiBpZnJhbWVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IENvbW1vblNpbGVudEZsb3dSZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCwgd2hlbiByZXNvbHZlZCwgcmV0dXJucyB0aGUgYWNjZXNzIHRva2VuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lKHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUsIHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3Qgc2lsZW50SWZyYW1lQ2xpZW50ID0gdGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQocmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICByZXR1cm4gaW52b2tlQXN5bmMoc2lsZW50SWZyYW1lQ2xpZW50LmFjcXVpcmVUb2tlbi5iaW5kKHNpbGVudElmcmFtZUNsaWVudCksIFBlcmZvcm1hbmNlRXZlbnRzLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHJlcXVlc3QuY29ycmVsYXRpb25JZCkocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcbiAgICAvLyAjcmVnaW9uIExvZ291dFxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXByZWNhdGVkIGxvZ291dCBmdW5jdGlvbi4gVXNlIGxvZ291dFJlZGlyZWN0IG9yIGxvZ291dFBvcHVwIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKiBAZGVwcmVjYXRlZFxyXG4gICAgICovXHJcbiAgICBhc3luYyBsb2dvdXQobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGxvZ291dFJlcXVlc3QpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoXCJsb2dvdXQgQVBJIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBtc2FsLWJyb3dzZXIgdjMuMC4wLiBVc2UgbG9nb3V0UmVkaXJlY3QgaW5zdGVhZC5cIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nb3V0UmVkaXJlY3Qoe1xyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAuLi5sb2dvdXRSZXF1ZXN0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgdG8gbG9nIG91dCB0aGUgY3VycmVudCB1c2VyLCBhbmQgcmVkaXJlY3QgdGhlIHVzZXIgdG8gdGhlIHBvc3RMb2dvdXRSZWRpcmVjdFVyaS5cclxuICAgICAqIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHJlZGlyZWN0IHRoZSB1c2VyIHRvIGB3aW5kb3cubG9jYXRpb24uaHJlZmAuXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBsb2dvdXRSZWRpcmVjdChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQobG9nb3V0UmVxdWVzdCk7XHJcbiAgICAgICAgcmVkaXJlY3RQcmVmbGlnaHRDaGVjayh0aGlzLmluaXRpYWxpemVkLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3ModHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RDbGllbnQgPSB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiByZWRpcmVjdENsaWVudC5sb2dvdXQobG9nb3V0UmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBsb2NhbCBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgdXNlciB0aGVuIG9wZW5zIGEgcG9wdXAgd2luZG93IHByb21wdGluZyB0aGUgdXNlciB0byBzaWduLW91dCBvZiB0aGUgc2VydmVyXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBsb2dvdXRQb3B1cChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQobG9nb3V0UmVxdWVzdCk7XHJcbiAgICAgICAgICAgIHByZWZsaWdodENoZWNrJDEodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKHRydWUpO1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cENsaWVudCA9IHRoaXMuY3JlYXRlUG9wdXBDbGllbnQoY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3B1cENsaWVudC5sb2dvdXQobG9nb3V0UmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgc3luY3Jvbm91cyB3ZSBuZWVkIHRvIHJlamVjdFxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgaW50ZXJhY3Rpb24gY2xpZW50IHRvIGNsZWFyIGJyb3N3ZXIgY2FjaGUuXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBjbGVhckNhY2hlKGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcImluIG5vbi1icm93c2VyIGVudmlyb25tZW50LCByZXR1cm5pbmcgZWFybHkuXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGxvZ291dFJlcXVlc3QpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlQ2xpZW50ID0gdGhpcy5jcmVhdGVTaWxlbnRDYWNoZUNsaWVudChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICByZXR1cm4gY2FjaGVDbGllbnQubG9nb3V0KGxvZ291dFJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG4gICAgLy8gI3JlZ2lvbiBBY2NvdW50IEFQSXNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoIHRoZSBvcHRpb25hbCBmaWx0ZXIuIElmIG5vIGZpbHRlciBpcyBwcm92aWRlZCwgYWxsIGFjY291bnRzIGFyZSByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyIC0gKE9wdGlvbmFsKSBmaWx0ZXIgdG8gbmFycm93IGRvd24gdGhlIGFjY291bnRzIHJldHVybmVkXHJcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBBY2NvdW50SW5mbyBvYmplY3RzIGluIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIGdldEFsbEFjY291bnRzKGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWxsQWNjb3VudHModGhpcy5sb2dnZXIsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQsIGFjY291bnRGaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBhY2NvdW50IGZvdW5kIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoZXMgdGhlIGFjY291bnQgZmlsdGVyIHBhc3NlZCBpbi5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgZmlyc3QgYWNjb3VudCBmb3VuZCBpbiB0aGUgY2FjaGUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGZpbHRlciBvciBudWxsIGlmIG5vIGFjY291bnQgY291bGQgYmUgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnQoYWNjb3VudEZpbHRlcikge1xyXG4gICAgICAgIHJldHVybiBnZXRBY2NvdW50KGFjY291bnRGaWx0ZXIsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgdXNlcm5hbWUuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kLlxyXG4gICAgICogVGhpcyBBUEkgaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIGJ1dCBnZXRBY2NvdW50QnlJZCBzaG91bGQgYmUgdXNlZCBmb3IgYmVzdCByZWxpYWJpbGl0eVxyXG4gICAgICogQHBhcmFtIHVzZXJuYW1lXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlcm5hbWUpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlcm5hbWUsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgaG9tZUFjY291bnRJZC5cclxuICAgICAqICh0aGUgYWNjb3VudCBvYmplY3QgaXMgY3JlYXRlZCBhdCB0aGUgdGltZSBvZiBzdWNjZXNzZnVsIGxvZ2luKVxyXG4gICAgICogb3IgbnVsbCB3aGVuIG5vIG1hdGNoaW5nIGFjY291bnQgaXMgZm91bmRcclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zIFRoZSBhY2NvdW50IG9iamVjdCBzdG9yZWQgaW4gTVNBTFxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50QnlMb2NhbElkKGxvY2FsQWNjb3VudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldEFjY291bnRCeUxvY2FsSWQobG9jYWxBY2NvdW50SWQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYWNjb3VudCB0byB1c2UgYXMgdGhlIGFjdGl2ZSBhY2NvdW50LiBJZiBubyBhY2NvdW50IGlzIHBhc3NlZCB0byB0aGUgYWNxdWlyZVRva2VuIEFQSXMsIHRoZW4gTVNBTCB3aWxsIHVzZSB0aGlzIGFjdGl2ZSBhY2NvdW50LlxyXG4gICAgICogQHBhcmFtIGFjY291bnRcclxuICAgICAqL1xyXG4gICAgc2V0QWN0aXZlQWNjb3VudChhY2NvdW50KSB7XHJcbiAgICAgICAgc2V0QWN0aXZlQWNjb3VudChhY2NvdW50LCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIGdldEFjdGl2ZUFjY291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUFjY291bnQodGhpcy5icm93c2VyU3RvcmFnZSk7XHJcbiAgICB9XHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcbiAgICAvKipcclxuICAgICAqIEh5ZHJhdGVzIHRoZSBjYWNoZSB3aXRoIHRoZSB0b2tlbnMgZnJvbSBhbiBBdXRoZW50aWNhdGlvblJlc3VsdFxyXG4gICAgICogQHBhcmFtIHJlc3VsdFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiaHlkcmF0ZUNhY2hlIGNhbGxlZFwiKTtcclxuICAgICAgICAvLyBBY2NvdW50IGdldHMgc2F2ZWQgdG8gYnJvd3NlciBzdG9yYWdlIHJlZ2FyZGxlc3Mgb2YgbmF0aXZlIG9yIG5vdFxyXG4gICAgICAgIGNvbnN0IGFjY291bnRFbnRpdHkgPSBBY2NvdW50RW50aXR5LmNyZWF0ZUZyb21BY2NvdW50SW5mbyhyZXN1bHQuYWNjb3VudCwgcmVzdWx0LmNsb3VkR3JhcGhIb3N0TmFtZSwgcmVzdWx0Lm1zR3JhcGhIb3N0KTtcclxuICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEFjY291bnQoYWNjb3VudEVudGl0eSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5mcm9tTmF0aXZlQnJva2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZXNwb25zZSB3YXMgZnJvbSBuYXRpdmUgYnJva2VyLCBzdG9yaW5nIGluLW1lbW9yeVwiKTtcclxuICAgICAgICAgICAgLy8gVG9rZW5zIGZyb20gbmF0aXZlIGJyb2tlciBhcmUgc3RvcmVkIGluLW1lbW9yeVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UuaHlkcmF0ZUNhY2hlKHJlc3VsdCwgcmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyU3RvcmFnZS5oeWRyYXRlQ2FjaGUocmVzdWx0LCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyAjcmVnaW9uIEhlbHBlcnNcclxuICAgIC8qKlxyXG4gICAgICogQWNxdWlyZSBhIHRva2VuIGZyb20gbmF0aXZlIGRldmljZSAoZS5nLiBXQU0pXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5OYXRpdmUocmVxdWVzdCwgYXBpSWQsIGFjY291bnRJZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiYWNxdWlyZVRva2VuTmF0aXZlIGNhbGxlZFwiKTtcclxuICAgICAgICBpZiAoIXRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckF1dGhFcnJvcihuYXRpdmVDb25uZWN0aW9uTm90RXN0YWJsaXNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuYXRpdmVDbGllbnQgPSBuZXcgTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQodGhpcy5jb25maWcsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIHRoaXMuZXZlbnRIYW5kbGVyLCB0aGlzLm5hdmlnYXRpb25DbGllbnQsIGFwaUlkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyLCBhY2NvdW50SWQgfHwgdGhpcy5nZXROYXRpdmVBY2NvdW50SWQocmVxdWVzdCksIHRoaXMubmF0aXZlSW50ZXJuYWxTdG9yYWdlLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiBuYXRpdmVDbGllbnQuYWNxdWlyZVRva2VuKHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIHJlcXVlc3QgY2FuIHVzZSB0aGUgbmF0aXZlIGJyb2tlclxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgY2FuVXNlTmF0aXZlKHJlcXVlc3QsIGFjY291bnRJZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiY2FuVXNlTmF0aXZlIGNhbGxlZFwiKTtcclxuICAgICAgICBpZiAoIU5hdGl2ZU1lc3NhZ2VIYW5kbGVyLmlzTmF0aXZlQXZhaWxhYmxlKHRoaXMuY29uZmlnLCB0aGlzLmxvZ2dlciwgdGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciwgcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJjYW5Vc2VOYXRpdmU6IGlzTmF0aXZlQXZhaWxhYmxlIHJldHVybmVkIGZhbHNlLCByZXR1cm5pbmcgZmFsc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcXVlc3QucHJvbXB0KSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVxdWVzdC5wcm9tcHQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuTk9ORTpcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuQ09OU0VOVDpcclxuICAgICAgICAgICAgICAgIGNhc2UgUHJvbXB0VmFsdWUuTE9HSU46XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJjYW5Vc2VOYXRpdmU6IHByb21wdCBpcyBjb21wYXRpYmxlIHdpdGggbmF0aXZlIGZsb3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBjYW5Vc2VOYXRpdmU6IHByb21wdCA9ICR7cmVxdWVzdC5wcm9tcHR9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggbmF0aXZlIGZsb3csIHJldHVybmluZyBmYWxzZWApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFjY291bnRJZCAmJiAhdGhpcy5nZXROYXRpdmVBY2NvdW50SWQocmVxdWVzdCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJjYW5Vc2VOYXRpdmU6IG5hdGl2ZUFjY291bnRJZCBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5pbmcgZmFsc2VcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbmF0aXZlIGFjY291bnRJZCBmcm9tIHRoZSBhY2NvdW50XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgZ2V0TmF0aXZlQWNjb3VudElkKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCBhY2NvdW50ID0gcmVxdWVzdC5hY2NvdW50IHx8XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudCh7XHJcbiAgICAgICAgICAgICAgICBsb2dpbkhpbnQ6IHJlcXVlc3QubG9naW5IaW50LFxyXG4gICAgICAgICAgICAgICAgc2lkOiByZXF1ZXN0LnNpZCxcclxuICAgICAgICAgICAgfSkgfHxcclxuICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVBY2NvdW50KCk7XHJcbiAgICAgICAgcmV0dXJuIChhY2NvdW50ICYmIGFjY291bnQubmF0aXZlQWNjb3VudElkKSB8fCBcIlwiO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiB0aGUgUG9wdXAgSW50ZXJhY3Rpb24gQ2xpZW50XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVQb3B1cENsaWVudChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb3B1cENsaWVudCh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdGhpcy5ldmVudEhhbmRsZXIsIHRoaXMubmF2aWdhdGlvbkNsaWVudCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVkaXJlY3QgSW50ZXJhY3Rpb24gQ2xpZW50XHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVSZWRpcmVjdENsaWVudChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdENsaWVudCh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdGhpcy5ldmVudEhhbmRsZXIsIHRoaXMubmF2aWdhdGlvbkNsaWVudCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2lsZW50IElmcmFtZSBJbnRlcmFjdGlvbiBDbGllbnRcclxuICAgICAqIEBwYXJhbSBjb3JyZWxhdGlvbklkXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVNpbGVudElmcmFtZUNsaWVudChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTaWxlbnRJZnJhbWVDbGllbnQodGhpcy5jb25maWcsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIHRoaXMuZXZlbnRIYW5kbGVyLCB0aGlzLm5hdmlnYXRpb25DbGllbnQsIEFwaUlkLnNzb1NpbGVudCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsIHRoaXMubmF0aXZlRXh0ZW5zaW9uUHJvdmlkZXIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2lsZW50IENhY2hlIEludGVyYWN0aW9uIENsaWVudFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTaWxlbnRDYWNoZUNsaWVudChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTaWxlbnRDYWNoZUNsaWVudCh0aGlzLmNvbmZpZywgdGhpcy5icm93c2VyU3RvcmFnZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdGhpcy5ldmVudEhhbmRsZXIsIHRoaXMubmF2aWdhdGlvbkNsaWVudCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciwgY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIHRoZSBTaWxlbnQgUmVmcmVzaCBJbnRlcmFjdGlvbiBDbGllbnRcclxuICAgICAqL1xyXG4gICAgY3JlYXRlU2lsZW50UmVmcmVzaENsaWVudChjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTaWxlbnRSZWZyZXNoQ2xpZW50KHRoaXMuY29uZmlnLCB0aGlzLmJyb3dzZXJTdG9yYWdlLCB0aGlzLmJyb3dzZXJDcnlwdG8sIHRoaXMubG9nZ2VyLCB0aGlzLmV2ZW50SGFuZGxlciwgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyLCBjb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNpbGVudCBBdXRoQ29kZSBJbnRlcmFjdGlvbiBDbGllbnRcclxuICAgICAqL1xyXG4gICAgY3JlYXRlU2lsZW50QXV0aENvZGVDbGllbnQoY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgU2lsZW50QXV0aENvZGVDbGllbnQodGhpcy5jb25maWcsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIHRoaXMuZXZlbnRIYW5kbGVyLCB0aGlzLm5hdmlnYXRpb25DbGllbnQsIEFwaUlkLmFjcXVpcmVUb2tlbkJ5Q29kZSwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciwgY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgZXZlbnQgY2FsbGJhY2tzIHRvIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgYWRkRXZlbnRDYWxsYmFjayhjYWxsYmFjaywgZXZlbnRUeXBlcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5hZGRFdmVudENhbGxiYWNrKGNhbGxiYWNrLCBldmVudFR5cGVzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBjYWxsYmFjayB3aXRoIHByb3ZpZGVkIGlkIGZyb20gY2FsbGJhY2sgYXJyYXlcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0lkXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tJZCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnJlbW92ZUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgcGVyZm9ybWFuY2UgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGVyZm9ybWFuY2VDYWxsYmFja0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggYWRkUGVyZm9ybWFuY2VDYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tJZFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soY2FsbGJhY2tJZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soY2FsbGJhY2tJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgZXZlbnQgbGlzdGVuZXIgdGhhdCBlbWl0cyBhbiBldmVudCB3aGVuIGEgdXNlciBhY2NvdW50IGlzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBsb2NhbHN0b3JhZ2UgaW4gYSBkaWZmZXJlbnQgYnJvd3NlciB0YWIgb3Igd2luZG93XHJcbiAgICAgKi9cclxuICAgIGVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmluZ1RvU3RvcmFnZUV2ZW50cykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQWRkaW5nIGFjY291bnQgc3RvcmFnZSBsaXN0ZW5lci5cIik7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuaW5nVG9TdG9yYWdlRXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIHRoaXMuaGFuZGxlQWNjb3VudENhY2hlQ2hhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJBY2NvdW50IHN0b3JhZ2UgbGlzdGVuZXIgYWxyZWFkeSByZWdpc3RlcmVkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXIgdGhhdCBlbWl0cyBhbiBldmVudCB3aGVuIGEgdXNlciBhY2NvdW50IGlzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBsb2NhbHN0b3JhZ2UgaW4gYSBkaWZmZXJlbnQgYnJvd3NlciB0YWIgb3Igd2luZG93XHJcbiAgICAgKi9cclxuICAgIGRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmluZ1RvU3RvcmFnZUV2ZW50cykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiUmVtb3ZpbmcgYWNjb3VudCBzdG9yYWdlIGxpc3RlbmVyLlwiKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIHRoaXMuaGFuZGxlQWNjb3VudENhY2hlQ2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5pbmdUb1N0b3JhZ2VFdmVudHMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJObyBhY2NvdW50IHN0b3JhZ2UgbGlzdGVuZXIgcmVnaXN0ZXJlZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFjY291bnQgYWRkZWQvcmVtb3ZlZCBldmVudHMgd2hlbiBjYWNoZWQgYWNjb3VudHMgYXJlIGNoYW5nZWQgaW4gYSBkaWZmZXJlbnQgdGFiIG9yIGZyYW1lXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZUFjY291bnRDYWNoZUNoYW5nZShlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gSGFuZGxlIGFjdGl2ZSBhY2NvdW50IGZpbHRlciBjaGFuZ2VcclxuICAgICAgICAgICAgaWYgKGUua2V5Py5pbmNsdWRlcyhQZXJzaXN0ZW50Q2FjaGVLZXlzLkFDVElWRV9BQ0NPVU5UX0ZJTFRFUlMpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IGhhcyBubyBwYXlsb2FkLCBpdCBvbmx5IHNpZ25hbHMgY3Jvc3MtdGFiIGFwcCBpbnN0YW5jZXMgdGhhdCB0aGUgcmVzdWx0cyBvZiBjYWxsaW5nIGdldEFjdGl2ZUFjY291bnQoKSB3aWxsIGhhdmUgY2hhbmdlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1RJVkVfQUNDT1VOVF9DSEFOR0VEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBIYW5kbGUgYWNjb3VudCBvYmplY3QgY2hhbmdlXHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlVmFsdWUgPSBlLm5ld1ZhbHVlIHx8IGUub2xkVmFsdWU7XHJcbiAgICAgICAgICAgIGlmICghY2FjaGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gSlNPTi5wYXJzZShjYWNoZVZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fFxyXG4gICAgICAgICAgICAgICAgIUFjY291bnRFbnRpdHkuaXNBY2NvdW50RW50aXR5KHBhcnNlZFZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFjY291bnRFbnRpdHkgPSBDYWNoZU1hbmFnZXIudG9PYmplY3QobmV3IEFjY291bnRFbnRpdHkoKSwgcGFyc2VkVmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCBhY2NvdW50SW5mbyA9IGFjY291bnRFbnRpdHkuZ2V0QWNjb3VudEluZm8oKTtcclxuICAgICAgICAgICAgaWYgKCFlLm9sZFZhbHVlICYmIGUubmV3VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJBY2NvdW50IHdhcyBhZGRlZCB0byBjYWNoZSBpbiBhIGRpZmZlcmVudCB3aW5kb3dcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDQ09VTlRfQURERUQsIHVuZGVmaW5lZCwgYWNjb3VudEluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKCFlLm5ld1ZhbHVlICYmIGUub2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJBY2NvdW50IHdhcyByZW1vdmVkIGZyb20gY2FjaGUgaW4gYSBkaWZmZXJlbnQgd2luZG93XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ0NPVU5UX1JFTU9WRUQsIHVuZGVmaW5lZCwgYWNjb3VudEluZm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRva2VuIGNhY2hlIGZvciB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGdldFRva2VuQ2FjaGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5DYWNoZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbG9nZ2VyIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIGdldExvZ2dlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlciBzZXQgaW4gY29uZmlndXJhdGlvbnMgd2l0aCBuZXcgTG9nZ2VyIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25zXHJcbiAgICAgKiBAcGFyYW0gbG9nZ2VyIExvZ2dlciBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBzZXRMb2dnZXIobG9nZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSB3cmFwcGVyIGxpYnJhcmllcyAoQW5ndWxhciAmIFJlYWN0KSB0byBzZXQgU0tVIGFuZCBWZXJzaW9uIHBhc3NlZCBkb3duIHRvIHRlbGVtZXRyeSwgbG9nZ2VyLCBldGMuXHJcbiAgICAgKiBAcGFyYW0gc2t1XHJcbiAgICAgKiBAcGFyYW0gdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplV3JhcHBlckxpYnJhcnkoc2t1LCB2ZXJzaW9uKSB7XHJcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIFNLVSBwYXNzZWQgaW4gaXMgb25lIHdlIGV4cGVjdFxyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0V3JhcHBlck1ldGFkYXRhKHNrdSwgdmVyc2lvbik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgbmF2aWdhdGlvbiBjbGllbnRcclxuICAgICAqIEBwYXJhbSBuYXZpZ2F0aW9uQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIHNldE5hdmlnYXRpb25DbGllbnQobmF2aWdhdGlvbkNsaWVudCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkNsaWVudCA9IG5hdmlnYXRpb25DbGllbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGdldENvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwZXJmb3JtYW5jZSBjbGllbnRcclxuICAgICAqL1xyXG4gICAgZ2V0UGVyZm9ybWFuY2VDbGllbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybWFuY2VDbGllbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGJyb3dzZXIgZW52IGluZGljYXRvclxyXG4gICAgICovXHJcbiAgICBpc0Jyb3dzZXJFbnYoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhIGNvcnJlbGF0aW9uIGlkIGZvciBhIHJlcXVlc3QgaWYgbm9uZSBpcyBwcm92aWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gez9QYXJ0aWFsPEJhc2VBdXRoUmVxdWVzdD59IFtyZXF1ZXN0XVxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQocmVxdWVzdCkge1xyXG4gICAgICAgIGlmIChyZXF1ZXN0Py5jb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmNvcnJlbGF0aW9uSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzQnJvd3NlckVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXdHdWlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSW5jbHVkZWQgZm9yIGZhbGxiYWNrIGZvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHMsXHJcbiAgICAgICAgICogYW5kIHRvIGVuc3VyZSB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIHN0cmluZy5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gQ29uc3RhbnRzLkVNUFRZX1NUUklORztcclxuICAgIH1cclxuICAgIC8vICNlbmRyZWdpb25cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4gaW5pdGlhdGluZyB0aGUgbG9naW4gcHJvY2VzcyBieSByZWRpcmVjdGluZyB0aGUgdXNlcidzIGJyb3dzZXIgdG8gdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQuIFRoaXMgZnVuY3Rpb24gcmVkaXJlY3RzIHRoZSBwYWdlLCBzb1xyXG4gICAgICogYW55IGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZXhlY3V0ZS5cclxuICAgICAqXHJcbiAgICAgKiBJTVBPUlRBTlQ6IEl0IGlzIE5PVCByZWNvbW1lbmRlZCB0byBoYXZlIGNvZGUgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UuIFRoaXMgZnVuY3Rpb24gd2lsbCBuYXZpZ2F0ZSBhd2F5IGZyb20gdGhlIGN1cnJlbnRcclxuICAgICAqIGJyb3dzZXIgd2luZG93LiBJdCBjdXJyZW50bHkgcmV0dXJucyBhIFByb21pc2UgaW4gb3JkZXIgdG8gcmVmbGVjdCB0aGUgYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGUgY29kZSBydW5uaW5nIGluIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYXN5bmMgbG9naW5SZWRpcmVjdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQocmVxdWVzdCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImxvZ2luUmVkaXJlY3QgY2FsbGVkXCIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlblJlZGlyZWN0KHtcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgLi4uKHJlcXVlc3QgfHwgREVGQVVMVF9SRVFVRVNUKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4gaW5pdGlhdGluZyB0aGUgbG9naW4gcHJvY2VzcyB2aWEgb3BlbmluZyBhIHBvcHVwIHdpbmRvdyBpbiB0aGUgdXNlcidzIGJyb3dzZXJcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC5cclxuICAgICAqL1xyXG4gICAgbG9naW5Qb3B1cChyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQocmVxdWVzdCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcImxvZ2luUG9wdXAgY2FsbGVkXCIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlblBvcHVwKHtcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgLi4uKHJlcXVlc3QgfHwgREVGQVVMVF9SRVFVRVNUKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2lsZW50bHkgYWNxdWlyZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIGEgZ2l2ZW4gc2V0IG9mIHNjb3Blcy4gUmV0dXJucyBjdXJyZW50bHkgcHJvY2Vzc2luZyBwcm9taXNlIGlmIHBhcmFsbGVsIHJlcXVlc3RzIGFyZSBtYWRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QGxpbmsgKFNpbGVudFJlcXVlc3Q6dHlwZSl9XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48QXV0aGVudGljYXRpb25SZXN1bHQ+fSAtIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC4gUmV0dXJucyB0aGUge0BsaW5rIEF1dGhSZXNwb25zZX0gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlblNpbGVudChyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQocmVxdWVzdCk7XHJcbiAgICAgICAgY29uc3QgYXRzTWVhc3VyZW1lbnQgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuU2lsZW50LCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBhdHNNZWFzdXJlbWVudC5hZGQoe1xyXG4gICAgICAgICAgICBjYWNoZUxvb2t1cFBvbGljeTogcmVxdWVzdC5jYWNoZUxvb2t1cFBvbGljeSxcclxuICAgICAgICAgICAgc2NlbmFyaW9JZDogcmVxdWVzdC5zY2VuYXJpb0lkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByZWZsaWdodENoZWNrKHRoaXMuaW5pdGlhbGl6ZWQsIGF0c01lYXN1cmVtZW50KTtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWNxdWlyZVRva2VuU2lsZW50IGNhbGxlZFwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50ID0gcmVxdWVzdC5hY2NvdW50IHx8IHRoaXMuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG4gICAgICAgIGlmICghYWNjb3VudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQXV0aEVycm9yKG5vQWNjb3VudEVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXRzTWVhc3VyZW1lbnQuYWRkKHsgYWNjb3VudFR5cGU6IGdldEFjY291bnRUeXBlKGFjY291bnQpIH0pO1xyXG4gICAgICAgIGNvbnN0IHRodW1icHJpbnQgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLFxyXG4gICAgICAgICAgICBhdXRob3JpdHk6IHJlcXVlc3QuYXV0aG9yaXR5IHx8IENvbnN0YW50cy5FTVBUWV9TVFJJTkcsXHJcbiAgICAgICAgICAgIHNjb3BlczogcmVxdWVzdC5zY29wZXMsXHJcbiAgICAgICAgICAgIGhvbWVBY2NvdW50SWRlbnRpZmllcjogYWNjb3VudC5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBjbGFpbXM6IHJlcXVlc3QuY2xhaW1zLFxyXG4gICAgICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZTogcmVxdWVzdC5hdXRoZW50aWNhdGlvblNjaGVtZSxcclxuICAgICAgICAgICAgcmVzb3VyY2VSZXF1ZXN0TWV0aG9kOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdE1ldGhvZCxcclxuICAgICAgICAgICAgcmVzb3VyY2VSZXF1ZXN0VXJpOiByZXF1ZXN0LnJlc291cmNlUmVxdWVzdFVyaSxcclxuICAgICAgICAgICAgc2hyQ2xhaW1zOiByZXF1ZXN0LnNockNsYWltcyxcclxuICAgICAgICAgICAgc3NoS2lkOiByZXF1ZXN0LnNzaEtpZCxcclxuICAgICAgICAgICAgc2hyT3B0aW9uczogcmVxdWVzdC5zaHJPcHRpb25zLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2lsZW50UmVxdWVzdEtleSA9IEpTT04uc3RyaW5naWZ5KHRodW1icHJpbnQpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZFJlc3BvbnNlID0gdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLmdldChzaWxlbnRSZXF1ZXN0S2V5KTtcclxuICAgICAgICBpZiAodHlwZW9mIGNhY2hlZFJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJhY3F1aXJlVG9rZW5TaWxlbnQgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgc3RvcmluZyBhY3RpdmUgcmVxdWVzdFwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBpbnZva2VBc3luYyh0aGlzLmFjcXVpcmVUb2tlblNpbGVudEFzeW5jLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgY29ycmVsYXRpb25JZCkoe1xyXG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIH0sIGFjY291bnQpXHJcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNpbGVudFRva2VuUmVxdWVzdHMuZGVsZXRlKHNpbGVudFJlcXVlc3RLZXkpO1xyXG4gICAgICAgICAgICAgICAgYXRzTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb21DYWNoZTogcmVzdWx0LmZyb21DYWNoZSxcclxuICAgICAgICAgICAgICAgICAgICBpc05hdGl2ZUJyb2tlcjogcmVzdWx0LmZyb21OYXRpdmVCcm9rZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVMb29rdXBQb2xpY3k6IHJlcXVlc3QuY2FjaGVMb29rdXBQb2xpY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5TaXplOiByZXN1bHQuYWNjZXNzVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW5TaXplOiByZXN1bHQuaWRUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNpbGVudFRva2VuUmVxdWVzdHMuZGVsZXRlKHNpbGVudFJlcXVlc3RLZXkpO1xyXG4gICAgICAgICAgICAgICAgYXRzTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLnNldChzaWxlbnRSZXF1ZXN0S2V5LCByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVzcG9uc2UpLFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6IHJlcXVlc3Quc3RhdGUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWNxdWlyZVRva2VuU2lsZW50IGhhcyBiZWVuIGNhbGxlZCBwcmV2aW91c2x5LCByZXR1cm5pbmcgdGhlIHJlc3VsdCBmcm9tIHRoZSBmaXJzdCBjYWxsXCIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAvLyBEaXNjYXJkIG1lYXN1cmVtZW50cyBmb3IgbWVtb2l6ZWQgY2FsbHMsIGFzIHRoZXkgYXJlIHVzdWFsbHkgb25seSBhIGNvdXBsZSBvZiBtcyBhbmQgd2lsbCBhcnRpZmljaWFsbHkgZGVmbGF0ZSBtZXRyaWNzXHJcbiAgICAgICAgICAgIGF0c01lYXN1cmVtZW50LmRpc2NhcmQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLihhd2FpdCBjYWNoZWRSZXNwb25zZSksXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogcmVxdWVzdC5zdGF0ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNpbGVudGx5IGFjcXVpcmUgYW4gYWNjZXNzIHRva2VuIGZvciBhIGdpdmVuIHNldCBvZiBzY29wZXMuIFdpbGwgdXNlIGNhY2hlZCB0b2tlbiBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB3aWxsIGF0dGVtcHQgdG8gYWNxdWlyZSBhIG5ldyB0b2tlbiBmcm9tIHRoZSBuZXR3b3JrIHZpYSByZWZyZXNoIHRva2VuLlxyXG4gICAgICogQHBhcmFtIHtAbGluayAoU2lsZW50UmVxdWVzdDp0eXBlKX1cclxuICAgICAqIEBwYXJhbSB7QGxpbmsgKEFjY291bnRJbmZvOnR5cGUpfVxyXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPEF1dGhlbnRpY2F0aW9uUmVzdWx0Pn0gLSBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIHdhcyByYWlzZWQuIFJldHVybnMgdGhlIHtAbGluayBBdXRoUmVzcG9uc2V9XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlblNpbGVudEFzeW5jKHJlcXVlc3QsIGFjY291bnQpIHtcclxuICAgICAgICBjb25zdCB0cmFja1BhZ2VWaXNpYmlsaXR5ID0gKCkgPT4gdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5KHJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9TVEFSVCwgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgcmVxdWVzdCk7XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7IHZpc2liaWxpdHlDaGFuZ2VDb3VudDogMCB9LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB0cmFja1BhZ2VWaXNpYmlsaXR5KTtcclxuICAgICAgICBjb25zdCBzaWxlbnRSZXF1ZXN0ID0gYXdhaXQgaW52b2tlQXN5bmMoaW5pdGlhbGl6ZVNpbGVudFJlcXVlc3QsIFBlcmZvcm1hbmNlRXZlbnRzLkluaXRpYWxpemVTaWxlbnRSZXF1ZXN0LCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKShyZXF1ZXN0LCBhY2NvdW50LCB0aGlzLmNvbmZpZywgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdGhpcy5sb2dnZXIpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlTG9va3VwUG9saWN5ID0gcmVxdWVzdC5jYWNoZUxvb2t1cFBvbGljeSB8fCBDYWNoZUxvb2t1cFBvbGljeS5EZWZhdWx0O1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUoc2lsZW50UmVxdWVzdCwgY2FjaGVMb29rdXBQb2xpY3kpLmNhdGNoKGFzeW5jIChyZWZyZXNoVG9rZW5FcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRUcnlUb1Jlc29sdmVTaWxlbnRseSA9IGNoZWNrSWZSZWZyZXNoVG9rZW5FcnJvckNhbkJlUmVzb2x2ZWRTaWxlbnRseShyZWZyZXNoVG9rZW5FcnJvciwgY2FjaGVMb29rdXBQb2xpY3kpO1xyXG4gICAgICAgICAgICBpZiAoc2hvdWxkVHJ5VG9SZXNvbHZlU2lsZW50bHkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hY3RpdmVJZnJhbWVSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9yZXNvbHZlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBzZXQgdGhlIGFjdGl2ZSByZXF1ZXN0IHRyYWNrZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hlY2tpbmcgaXQgdG8gcHJldmVudCByYWNlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lUmVxdWVzdCA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJSZWZyZXNoIHRva2VuIGV4cGlyZWQvaW52YWxpZCBvciBDYWNoZUxvb2t1cFBvbGljeSBpcyBzZXQgdG8gU2tpcCwgYXR0ZW1wdGluZyBhY3F1aXJlIHRva2VuIGJ5IGlmcmFtZS5cIiwgc2lsZW50UmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlQXN5bmModGhpcy5hY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZS5iaW5kKHRoaXMpLCBQZXJmb3JtYW5jZUV2ZW50cy5BY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZSwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCkoc2lsZW50UmVxdWVzdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGlmcmFtZVJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZVJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJZnJhbWVSZXF1ZXN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FjaGVMb29rdXBQb2xpY3kgIT09IENhY2hlTG9va3VwUG9saWN5LlNraXApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBbYWN0aXZlUHJvbWlzZSwgYWN0aXZlQ29ycmVsYXRpb25JZF0gPSB0aGlzLmFjdGl2ZUlmcmFtZVJlcXVlc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgSWZyYW1lIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgYXdhaXRpbmcgcmVzb2x1dGlvbiBmb3IgcmVxdWVzdCB3aXRoIGNvcnJlbGF0aW9uSWQ6ICR7YWN0aXZlQ29ycmVsYXRpb25JZH1gLCBzaWxlbnRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0Q29uY3VycmVudElmcmFtZU1lYXN1cmUgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQXdhaXRDb25jdXJyZW50SWZyYW1lLCBzaWxlbnRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0Q29uY3VycmVudElmcmFtZU1lYXN1cmUuYWRkKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXRJZnJhbWVDb3JyZWxhdGlvbklkOiBhY3RpdmVDb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVByb21pc2VSZXN1bHQgPSBhd2FpdCBhY3RpdmVQcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0Q29uY3VycmVudElmcmFtZU1lYXN1cmUuZW5kKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogYWN0aXZlUHJvbWlzZVJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlUHJvbWlzZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKGBQYXJhbGxlbCBpZnJhbWUgcmVxdWVzdCB3aXRoIGNvcnJlbGF0aW9uSWQ6ICR7YWN0aXZlQ29ycmVsYXRpb25JZH0gc3VjY2VlZGVkLiBSZXRyeWluZyBjYWNoZSBhbmQvb3IgUlQgcmVkZW1wdGlvbmAsIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNhY2hlIGxvb2t1cCBhbmQvb3IgUlQgZXhjaGFuZ2UgYWZ0ZXIgaWZyYW1lIGNvbXBsZXRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW5TaWxlbnROb0lmcmFtZShzaWxlbnRSZXF1ZXN0LCBjYWNoZUxvb2t1cFBvbGljeSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBJZnJhbWUgcmVxdWVzdCB3aXRoIGNvcnJlbGF0aW9uSWQ6ICR7YWN0aXZlQ29ycmVsYXRpb25JZH0gZmFpbGVkLiBJbnRlcmFjdGlvbiBpcyByZXF1aXJlZC5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJldmlvdXMgaWZyYW1lIHJlcXVlc3QgZmFpbGVkLCBpdCdzIHVubGlrZWx5IHRvIHN1Y2NlZWQgdGhpcyB0aW1lLiBUaHJvdyBvcmlnaW5hbCBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVmcmVzaFRva2VuRXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgcG9saWN5IHNldCB0byBza2lwIGFuZCBhbm90aGVyIGlmcmFtZSByZXF1ZXN0IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuaW5nKFwiQW5vdGhlciBpZnJhbWUgcmVxdWVzdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgYW5kIENhY2hlTG9va3VwUG9saWN5IGlzIHNldCB0byBTa2lwLiBUaGlzIG1heSByZXN1bHQgaW4gZGVncmFkZWQgcGVyZm9ybWFuY2UgYW5kL29yIHJlbGlhYmlsaXR5IGZvciBib3RoIGNhbGxzLiBQbGVhc2UgY29uc2lkZXIgY2hhbmdpbmcgdGhlIENhY2hlTG9va3VwUG9saWN5IHRvIHRha2UgYWR2YW50YWdlIG9mIHJlcXVlc3QgcXVldWluZyBhbmQgdG9rZW4gY2FjaGUuXCIsIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHRoaXMuYWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUuYmluZCh0aGlzKSwgUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUsIHRoaXMubG9nZ2VyLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LCBzaWxlbnRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpKHNpbGVudFJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRXJyb3IgY2Fubm90IGJlIHNpbGVudGx5IHJlc29sdmVkIG9yIGlmcmFtZSByZW5ld2FsIGlzIG5vdCBhbGxvd2VkLCBpbnRlcmFjdGlvbiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVmcmVzaFRva2VuRXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5jb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbUNhY2hlOiByZXNwb25zZS5mcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOYXRpdmVCcm9rZXI6IHJlc3BvbnNlLmZyb21OYXRpdmVCcm9rZXIsXHJcbiAgICAgICAgICAgICAgICB9LCByZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKHRva2VuUmVuZXdhbEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCBudWxsLCB0b2tlblJlbmV3YWxFcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IHRva2VuUmVuZXdhbEVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdHJhY2tQYWdlVmlzaWJpbGl0eSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFjcXVpcmVUb2tlblNpbGVudCB3aXRob3V0IHRoZSBpZnJhbWUgZmFsbGJhY2suIFRoaXMgaXMgdXNlZCB0byBlbmFibGUgdGhlIGNvcnJlY3QgZmFsbGJhY2tzIGluIGNhc2VzIHdoZXJlIHRoZXJlJ3MgYSBwb3RlbnRpYWwgZm9yIG11bHRpcGxlIHNpbGVudCByZXF1ZXN0cyB0byBiZSBtYWRlIGluIHBhcmFsbGVsIGFuZCBwcmV2ZW50IHRob3NlIHJlcXVlc3RzIGZyb20gbWFraW5nIGNvbmN1cnJlbnQgaWZyYW1lIHJlcXVlc3RzLlxyXG4gICAgICogQHBhcmFtIHNpbGVudFJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBjYWNoZUxvb2t1cFBvbGljeVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUoc2lsZW50UmVxdWVzdCwgY2FjaGVMb29rdXBQb2xpY3kpIHtcclxuICAgICAgICBpZiAoTmF0aXZlTWVzc2FnZUhhbmRsZXIuaXNOYXRpdmVBdmFpbGFibGUodGhpcy5jb25maWcsIHRoaXMubG9nZ2VyLCB0aGlzLm5hdGl2ZUV4dGVuc2lvblByb3ZpZGVyLCBzaWxlbnRSZXF1ZXN0LmF1dGhlbnRpY2F0aW9uU2NoZW1lKSAmJlxyXG4gICAgICAgICAgICBzaWxlbnRSZXF1ZXN0LmFjY291bnQubmF0aXZlQWNjb3VudElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gZnJvbSBuYXRpdmUgcGxhdGZvcm1cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbk5hdGl2ZShzaWxlbnRSZXF1ZXN0LCBBcGlJZC5hY3F1aXJlVG9rZW5TaWxlbnRfc2lsZW50RmxvdykuY2F0Y2goYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIElmIG5hdGl2ZSB0b2tlbiBhY3F1aXNpdGlvbiBmYWlscyBmb3IgYXZhaWxhYmlsaXR5IHJlYXNvbnMgZmFsbGJhY2sgdG8gd2ViIGZsb3dcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF0aXZlQXV0aEVycm9yICYmIGlzRmF0YWxOYXRpdmVBdXRoRXJyb3IoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWNxdWlyZVRva2VuU2lsZW50IC0gbmF0aXZlIHBsYXRmb3JtIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gd2ViIGZsb3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFeHRlbnNpb25Qcm92aWRlciA9IHVuZGVmaW5lZDsgLy8gUHJldmVudCBmdXR1cmUgcmVxdWVzdHMgZnJvbSBjb250aW51aW5nIHRvIGF0dGVtcHRcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB3aWxsIG5vdCBjb250YWluIHRva2VucywgZ2l2ZW4gdGhhdCBwcmV2aW91cyBXQU0gcmVxdWVzdHMgc3VjY2VlZGVkLiBTa2lwIGNhY2hlIGFuZCBSVCByZW5ld2FsIGFuZCBnbyBzdHJhaWdodCB0byBpZnJhbWUgcmVuZXdhbFxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUNsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy50b2tlblJlZnJlc2hSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gZnJvbSB3ZWIgZmxvd1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGludm9rZUFzeW5jKHRoaXMuYWNxdWlyZVRva2VuRnJvbUNhY2hlLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkZyb21DYWNoZSwgdGhpcy5sb2dnZXIsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIHNpbGVudFJlcXVlc3QuY29ycmVsYXRpb25JZCkoc2lsZW50UmVxdWVzdCwgY2FjaGVMb29rdXBQb2xpY3kpLmNhdGNoKChjYWNoZUVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVMb29rdXBQb2xpY3kgPT09IENhY2hlTG9va3VwUG9saWN5LkFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY2FjaGVFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9ORVRXT1JLX1NUQVJULCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCBzaWxlbnRSZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VBc3luYyh0aGlzLmFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLmJpbmQodGhpcyksIFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLCB0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgc2lsZW50UmVxdWVzdC5jb3JyZWxhdGlvbklkKShzaWxlbnRSZXF1ZXN0LCBjYWNoZUxvb2t1cFBvbGljeSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIHRocm93biBieSB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBjYW4gYmUgcmVzb2x2ZWQgd2l0aG91dCBpbnRlcmFjdGlvblxyXG4gKiBAcGFyYW0gcmVmcmVzaFRva2VuRXJyb3JcclxuICogQHBhcmFtIHNpbGVudFJlcXVlc3RcclxuICogQHBhcmFtIGNhY2hlTG9va3VwUG9saWN5XHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5mdW5jdGlvbiBjaGVja0lmUmVmcmVzaFRva2VuRXJyb3JDYW5CZVJlc29sdmVkU2lsZW50bHkocmVmcmVzaFRva2VuRXJyb3IsIGNhY2hlTG9va3VwUG9saWN5KSB7XHJcbiAgICBjb25zdCBub0ludGVyYWN0aW9uUmVxdWlyZWQgPSAhKHJlZnJlc2hUb2tlbkVycm9yIGluc3RhbmNlb2YgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciAmJlxyXG4gICAgICAgIC8vIEZvciByZWZyZXNoIHRva2VuIGVycm9ycywgYmFkX3Rva2VuIGRvZXMgbm90IGFsd2F5cyByZXF1aXJlIGludGVyYWN0aW9uIChzaWxlbnRseSByZXNvbHZhYmxlKVxyXG4gICAgICAgIHJlZnJlc2hUb2tlbkVycm9yLnN1YkVycm9yICE9PVxyXG4gICAgICAgICAgICBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMuYmFkVG9rZW4pO1xyXG4gICAgLy8gRXJyb3JzIHRoYXQgcmVzdWx0IHdoZW4gdGhlIHJlZnJlc2ggdG9rZW4gbmVlZHMgdG8gYmUgcmVwbGFjZWRcclxuICAgIGNvbnN0IHJlZnJlc2hUb2tlblJlZnJlc2hSZXF1aXJlZCA9IHJlZnJlc2hUb2tlbkVycm9yLmVycm9yQ29kZSA9PT0gQnJvd3NlckNvbnN0YW50cy5JTlZBTElEX0dSQU5UX0VSUk9SIHx8XHJcbiAgICAgICAgcmVmcmVzaFRva2VuRXJyb3IuZXJyb3JDb2RlID09PVxyXG4gICAgICAgICAgICBDbGllbnRBdXRoRXJyb3JDb2Rlcy50b2tlblJlZnJlc2hSZXF1aXJlZDtcclxuICAgIC8vIEVycm9ycyB0aGF0IG1heSBiZSByZXNvbHZlZCBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGludGVyYWN0aW9uICh0aHJvdWdoIGlmcmFtZSByZW5ld2FsKVxyXG4gICAgY29uc3QgaXNTaWxlbnRseVJlc29sdmFibGUgPSAobm9JbnRlcmFjdGlvblJlcXVpcmVkICYmIHJlZnJlc2hUb2tlblJlZnJlc2hSZXF1aXJlZCkgfHxcclxuICAgICAgICByZWZyZXNoVG9rZW5FcnJvci5lcnJvckNvZGUgPT09XHJcbiAgICAgICAgICAgIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2Rlcy5ub1Rva2Vuc0ZvdW5kIHx8XHJcbiAgICAgICAgcmVmcmVzaFRva2VuRXJyb3IuZXJyb3JDb2RlID09PVxyXG4gICAgICAgICAgICBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yQ29kZXMucmVmcmVzaFRva2VuRXhwaXJlZDtcclxuICAgIC8vIE9ubHkgdGhlc2UgcG9saWNpZXMgYWxsb3cgZm9yIGFuIGlmcmFtZSByZW5ld2FsIGF0dGVtcHRcclxuICAgIGNvbnN0IHRyeUlmcmFtZVJlbmV3YWwgPSBpRnJhbWVSZW5ld2FsUG9saWNpZXMuaW5jbHVkZXMoY2FjaGVMb29rdXBQb2xpY3kpO1xyXG4gICAgcmV0dXJuIGlzU2lsZW50bHlSZXNvbHZhYmxlICYmIHRyeUlmcmFtZVJlbmV3YWw7XHJcbn1cblxuZXhwb3J0IHsgU3RhbmRhcmRDb250cm9sbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZENvbnRyb2xsZXIubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNCcmlkZ2VFcnJvcihlcnJvcikge1xyXG4gICAgcmV0dXJuIGVycm9yLnN0YXR1cyAhPT0gdW5kZWZpbmVkO1xyXG59XG5cbmV4cG9ydCB7IGlzQnJpZGdlRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyaWRnZUVycm9yLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIsIFN0cmluZ1V0aWxzLCBBdXRoZW50aWNhdGlvblNjaGVtZSwgY3JlYXRlQ2xpZW50QXV0aEVycm9yLCBDbGllbnRBdXRoRXJyb3JDb2RlcywgQXV0aFRva2VuLCBidWlsZFRlbmFudFByb2ZpbGUsIEF1dGhFcnJvciwgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciwgU2VydmVyRXJyb3IsIENsaWVudEF1dGhFcnJvciwgT0lEQ19ERUZBVUxUX1NDT1BFUyB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IGlzQnJpZGdlRXJyb3IgfSBmcm9tICcuLi9CcmlkZ2VFcnJvci5tanMnO1xuaW1wb3J0IHsgQnJpZGdlU3RhdHVzQ29kZSB9IGZyb20gJy4uL0JyaWRnZVN0YXR1c0NvZGUubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIE5lc3RlZEFwcEF1dGhBZGFwdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGNsaWVudElkLCBjbGllbnRDYXBhYmlsaXRpZXMsIGNyeXB0bywgbG9nZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xyXG4gICAgICAgIHRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzID0gY2xpZW50Q2FwYWJpbGl0aWVzO1xyXG4gICAgICAgIHRoaXMuY3J5cHRvID0gY3J5cHRvO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgdG9OYWFUb2tlblJlcXVlc3QocmVxdWVzdCkge1xyXG4gICAgICAgIGxldCBleHRyYVBhcmFtcztcclxuICAgICAgICBpZiAocmVxdWVzdC5leHRyYVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGV4dHJhUGFyYW1zID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZXh0cmFQYXJhbXMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHJlcXVlc3QuZXh0cmFRdWVyeVBhcmFtZXRlcnMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJlcXVlc3QuY29ycmVsYXRpb25JZCB8fCB0aGlzLmNyeXB0by5jcmVhdGVOZXdHdWlkKCk7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdEJ1aWxkZXIgPSBuZXcgUmVxdWVzdFBhcmFtZXRlckJ1aWxkZXIoY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgY29uc3QgY2xhaW1zID0gcmVxdWVzdEJ1aWxkZXIuYWRkQ2xpZW50Q2FwYWJpbGl0aWVzVG9DbGFpbXMocmVxdWVzdC5jbGFpbXMsIHRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzKTtcclxuICAgICAgICBjb25zdCBzY29wZXMgPSByZXF1ZXN0LnNjb3BlcyB8fCBPSURDX0RFRkFVTFRfU0NPUEVTO1xyXG4gICAgICAgIGNvbnN0IHRva2VuUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgcGxhdGZvcm1Ccm9rZXJJZDogcmVxdWVzdC5hY2NvdW50Py5ob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgICAgYXV0aG9yaXR5OiByZXF1ZXN0LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgc2NvcGU6IHNjb3Blcy5qb2luKFwiIFwiKSxcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgY2xhaW1zOiAhU3RyaW5nVXRpbHMuaXNFbXB0eU9iaihjbGFpbXMpID8gY2xhaW1zIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzdGF0ZTogcmVxdWVzdC5zdGF0ZSxcclxuICAgICAgICAgICAgYXV0aGVudGljYXRpb25TY2hlbWU6IHJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgfHwgQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSLFxyXG4gICAgICAgICAgICBleHRyYVBhcmFtZXRlcnM6IGV4dHJhUGFyYW1zLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRva2VuUmVxdWVzdDtcclxuICAgIH1cclxuICAgIGZyb21OYWFUb2tlblJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlLCByZXFUaW1lc3RhbXApIHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLnRva2VuLmlkX3Rva2VuIHx8ICFyZXNwb25zZS50b2tlbi5hY2Nlc3NfdG9rZW4pIHtcclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50QXV0aEVycm9yKENsaWVudEF1dGhFcnJvckNvZGVzLm51bGxPckVtcHR5VG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleHBpcmVzT24gPSBuZXcgRGF0ZSgocmVxVGltZXN0YW1wICsgKHJlc3BvbnNlLnRva2VuLmV4cGlyZXNfaW4gfHwgMCkpICogMTAwMCk7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbkNsYWltcyA9IEF1dGhUb2tlbi5leHRyYWN0VG9rZW5DbGFpbXMocmVzcG9uc2UudG9rZW4uaWRfdG9rZW4sIHRoaXMuY3J5cHRvLmJhc2U2NERlY29kZSk7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudCA9IHRoaXMuZnJvbU5hYUFjY291bnRJbmZvKHJlc3BvbnNlLmFjY291bnQsIHJlc3BvbnNlLnRva2VuLmlkX3Rva2VuLCBpZFRva2VuQ2xhaW1zKTtcclxuICAgICAgICBjb25zdCBzY29wZXMgPSByZXNwb25zZS50b2tlbi5zY29wZSB8fCByZXF1ZXN0LnNjb3BlO1xyXG4gICAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uUmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBhdXRob3JpdHk6IHJlc3BvbnNlLnRva2VuLmF1dGhvcml0eSB8fCBhY2NvdW50LmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICB1bmlxdWVJZDogYWNjb3VudC5sb2NhbEFjY291bnRJZCxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IGFjY291bnQudGVuYW50SWQsXHJcbiAgICAgICAgICAgIHNjb3Blczogc2NvcGVzLnNwbGl0KFwiIFwiKSxcclxuICAgICAgICAgICAgYWNjb3VudCxcclxuICAgICAgICAgICAgaWRUb2tlbjogcmVzcG9uc2UudG9rZW4uaWRfdG9rZW4sXHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXMsXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS50b2tlbi5hY2Nlc3NfdG9rZW4sXHJcbiAgICAgICAgICAgIGZyb21DYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGV4cGlyZXNPbjogZXhwaXJlc09uLFxyXG4gICAgICAgICAgICB0b2tlblR5cGU6IHJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgfHwgQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiByZXF1ZXN0LmNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgIGV4dEV4cGlyZXNPbjogZXhwaXJlc09uLFxyXG4gICAgICAgICAgICBzdGF0ZTogcmVxdWVzdC5zdGF0ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhdXRoZW50aWNhdGlvblJlc3VsdDtcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICAgKiAgZXhwb3J0IHR5cGUgQWNjb3VudEluZm8gPSB7XHJcbiAgICAgKiAgICAgaG9tZUFjY291bnRJZDogc3RyaW5nO1xyXG4gICAgICogICAgIGVudmlyb25tZW50OiBzdHJpbmc7XHJcbiAgICAgKiAgICAgdGVuYW50SWQ6IHN0cmluZztcclxuICAgICAqICAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gICAgICogICAgIGxvY2FsQWNjb3VudElkOiBzdHJpbmc7XHJcbiAgICAgKiAgICAgbmFtZT86IHN0cmluZztcclxuICAgICAqICAgICBpZFRva2VuPzogc3RyaW5nO1xyXG4gICAgICogICAgIGlkVG9rZW5DbGFpbXM/OiBUb2tlbkNsYWltcyAmIHtcclxuICAgICAqICAgICAgICAgW2tleTogc3RyaW5nXTpcclxuICAgICAqICAgICAgICAgICAgIHwgc3RyaW5nXHJcbiAgICAgKiAgICAgICAgICAgICB8IG51bWJlclxyXG4gICAgICogICAgICAgICAgICAgfCBzdHJpbmdbXVxyXG4gICAgICogICAgICAgICAgICAgfCBvYmplY3RcclxuICAgICAqICAgICAgICAgICAgIHwgdW5kZWZpbmVkXHJcbiAgICAgKiAgICAgICAgICAgICB8IHVua25vd247XHJcbiAgICAgKiAgICAgfTtcclxuICAgICAqICAgICBuYXRpdmVBY2NvdW50SWQ/OiBzdHJpbmc7XHJcbiAgICAgKiAgICAgYXV0aG9yaXR5VHlwZT86IHN0cmluZztcclxuICAgICAqIH07XHJcbiAgICAgKi9cclxuICAgIGZyb21OYWFBY2NvdW50SW5mbyhmcm9tQWNjb3VudCwgaWRUb2tlbiwgaWRUb2tlbkNsYWltcykge1xyXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUlkVG9rZW5DbGFpbXMgPSBpZFRva2VuQ2xhaW1zIHx8IGZyb21BY2NvdW50LmlkVG9rZW5DbGFpbXM7XHJcbiAgICAgICAgY29uc3QgbG9jYWxBY2NvdW50SWQgPSBmcm9tQWNjb3VudC5sb2NhbEFjY291bnRJZCB8fFxyXG4gICAgICAgICAgICBlZmZlY3RpdmVJZFRva2VuQ2xhaW1zPy5vaWQgfHxcclxuICAgICAgICAgICAgZWZmZWN0aXZlSWRUb2tlbkNsYWltcz8uc3ViIHx8XHJcbiAgICAgICAgICAgIFwiXCI7XHJcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSBmcm9tQWNjb3VudC50ZW5hbnRJZCB8fCBlZmZlY3RpdmVJZFRva2VuQ2xhaW1zPy50aWQgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBob21lQWNjb3VudElkID0gZnJvbUFjY291bnQuaG9tZUFjY291bnRJZCB8fCBgJHtsb2NhbEFjY291bnRJZH0uJHt0ZW5hbnRJZH1gO1xyXG4gICAgICAgIGNvbnN0IHVzZXJuYW1lID0gZnJvbUFjY291bnQudXNlcm5hbWUgfHxcclxuICAgICAgICAgICAgZWZmZWN0aXZlSWRUb2tlbkNsYWltcz8ucHJlZmVycmVkX3VzZXJuYW1lIHx8XHJcbiAgICAgICAgICAgIFwiXCI7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IGZyb21BY2NvdW50Lm5hbWUgfHwgZWZmZWN0aXZlSWRUb2tlbkNsYWltcz8ubmFtZTtcclxuICAgICAgICBjb25zdCB0ZW5hbnRQcm9maWxlcyA9IG5ldyBNYXAoKTtcclxuICAgICAgICBjb25zdCB0ZW5hbnRQcm9maWxlID0gYnVpbGRUZW5hbnRQcm9maWxlKGhvbWVBY2NvdW50SWQsIGxvY2FsQWNjb3VudElkLCB0ZW5hbnRJZCwgZWZmZWN0aXZlSWRUb2tlbkNsYWltcyk7XHJcbiAgICAgICAgdGVuYW50UHJvZmlsZXMuc2V0KHRlbmFudElkLCB0ZW5hbnRQcm9maWxlKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50ID0ge1xyXG4gICAgICAgICAgICBob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogZnJvbUFjY291bnQuZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIHRlbmFudElkLFxyXG4gICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQsXHJcbiAgICAgICAgICAgIG5hbWUsXHJcbiAgICAgICAgICAgIGlkVG9rZW46IGlkVG9rZW4sXHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXM6IGVmZmVjdGl2ZUlkVG9rZW5DbGFpbXMsXHJcbiAgICAgICAgICAgIHRlbmFudFByb2ZpbGVzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGFjY291bnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXJyb3IgQnJpZGdlRXJyb3JcclxuICAgICAqIEByZXR1cm5zIEF1dGhFcnJvciwgQ2xpZW50QXV0aEVycm9yLCBDbGllbnRDb25maWd1cmF0aW9uRXJyb3IsIFNlcnZlckVycm9yLCBJbnRlcmFjdGlvblJlcXVpcmVkRXJyb3JcclxuICAgICAqL1xyXG4gICAgZnJvbUJyaWRnZUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGlzQnJpZGdlRXJyb3IoZXJyb3IpKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEJyaWRnZVN0YXR1c0NvZGUuVXNlckNhbmNlbDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy51c2VyQ2FuY2VsZWQpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBCcmlkZ2VTdGF0dXNDb2RlLk5vTmV0d29yazpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy5ub05ldHdvcmtDb25uZWN0aXZpdHkpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBCcmlkZ2VTdGF0dXNDb2RlLkFjY291bnRVbmF2YWlsYWJsZTpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudEF1dGhFcnJvcihDbGllbnRBdXRoRXJyb3JDb2Rlcy5ub0FjY291bnRGb3VuZCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEJyaWRnZVN0YXR1c0NvZGUuRGlzYWJsZWQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoRXJyb3IoQ2xpZW50QXV0aEVycm9yQ29kZXMubmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgQnJpZGdlU3RhdHVzQ29kZS5OZXN0ZWRBcHBBdXRoVW5hdmFpbGFibGU6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoRXJyb3IoZXJyb3IuY29kZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRBdXRoRXJyb3JDb2Rlcy5uZXN0ZWRBcHBBdXRoQnJpZGdlRGlzYWJsZWQsIGVycm9yLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgQnJpZGdlU3RhdHVzQ29kZS5UcmFuc2llbnRFcnJvcjpcclxuICAgICAgICAgICAgICAgIGNhc2UgQnJpZGdlU3RhdHVzQ29kZS5QZXJzaXN0ZW50RXJyb3I6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFcnJvcihlcnJvci5jb2RlLCBlcnJvci5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEJyaWRnZVN0YXR1c0NvZGUuVXNlckludGVyYWN0aW9uUmVxdWlyZWQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKGVycm9yLmNvZGUsIGVycm9yLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoRXJyb3IoZXJyb3IuY29kZSwgZXJyb3IuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhFcnJvcihcInVua25vd25fZXJyb3JcIiwgXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBBdXRoZW50aWNhdGlvblJlc3VsdCBmcm9tIHRoZSBnaXZlbiBjYWNoZSBpdGVtc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhY2NvdW50XHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlblxyXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuXHJcbiAgICAgKiBAcGFyYW0gcmVxVGltZXN0YW1wXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICB0b0F1dGhlbnRpY2F0aW9uUmVzdWx0RnJvbUNhY2hlKGFjY291bnQsIGlkVG9rZW4sIGFjY2Vzc1Rva2VuLCByZXF1ZXN0LCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgaWYgKCFpZFRva2VuIHx8ICFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRBdXRoRXJyb3IoQ2xpZW50QXV0aEVycm9yQ29kZXMubnVsbE9yRW1wdHlUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5DbGFpbXMgPSBBdXRoVG9rZW4uZXh0cmFjdFRva2VuQ2xhaW1zKGlkVG9rZW4uc2VjcmV0LCB0aGlzLmNyeXB0by5iYXNlNjREZWNvZGUpO1xyXG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IGFjY2Vzc1Rva2VuLnRhcmdldCB8fCByZXF1ZXN0LnNjb3Blcy5qb2luKFwiIFwiKTtcclxuICAgICAgICBjb25zdCBhdXRoZW50aWNhdGlvblJlc3VsdCA9IHtcclxuICAgICAgICAgICAgYXV0aG9yaXR5OiBhY2Nlc3NUb2tlbi5lbnZpcm9ubWVudCB8fCBhY2NvdW50LmVudmlyb25tZW50LFxyXG4gICAgICAgICAgICB1bmlxdWVJZDogYWNjb3VudC5sb2NhbEFjY291bnRJZCxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IGFjY291bnQudGVuYW50SWQsXHJcbiAgICAgICAgICAgIHNjb3Blczogc2NvcGVzLnNwbGl0KFwiIFwiKSxcclxuICAgICAgICAgICAgYWNjb3VudCxcclxuICAgICAgICAgICAgaWRUb2tlbjogaWRUb2tlbi5zZWNyZXQsXHJcbiAgICAgICAgICAgIGlkVG9rZW5DbGFpbXM6IGlkVG9rZW5DbGFpbXMgfHwge30sXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBhY2Nlc3NUb2tlbi5zZWNyZXQsXHJcbiAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSxcclxuICAgICAgICAgICAgZXhwaXJlc09uOiBuZXcgRGF0ZShOdW1iZXIoYWNjZXNzVG9rZW4uZXhwaXJlc09uKSAqIDEwMDApLFxyXG4gICAgICAgICAgICB0b2tlblR5cGU6IHJlcXVlc3QuYXV0aGVudGljYXRpb25TY2hlbWUgfHwgQXV0aGVudGljYXRpb25TY2hlbWUuQkVBUkVSLFxyXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkLFxyXG4gICAgICAgICAgICBleHRFeHBpcmVzT246IG5ldyBEYXRlKE51bWJlcihhY2Nlc3NUb2tlbi5leHRlbmRlZEV4cGlyZXNPbikgKiAxMDAwKSxcclxuICAgICAgICAgICAgc3RhdGU6IHJlcXVlc3Quc3RhdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb25SZXN1bHQ7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTmVzdGVkQXBwQXV0aEFkYXB0ZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZEFwcEF1dGhBZGFwdGVyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIE5lc3RlZEFwcEF1dGhFcnJvck1lc3NhZ2UgY2xhc3MgY29udGFpbmluZyBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYnkgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzLlxyXG4gKi9cclxuY29uc3QgTmVzdGVkQXBwQXV0aEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHVuc3VwcG9ydGVkTWV0aG9kOiB7XHJcbiAgICAgICAgY29kZTogXCJ1bnN1cHBvcnRlZF9tZXRob2RcIixcclxuICAgICAgICBkZXNjOiBcIlRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbmVzdGVkIGFwcCBlbnZpcm9ubWVudC5cIixcclxuICAgIH0sXHJcbn07XHJcbmNsYXNzIE5lc3RlZEFwcEF1dGhFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIHN1cGVyKGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTmVzdGVkQXBwQXV0aEVycm9yLnByb3RvdHlwZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJOZXN0ZWRBcHBBdXRoRXJyb3JcIjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVhdGVVbnN1cHBvcnRlZEVycm9yKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgTmVzdGVkQXBwQXV0aEVycm9yKE5lc3RlZEFwcEF1dGhFcnJvck1lc3NhZ2UudW5zdXBwb3J0ZWRNZXRob2QuY29kZSwgTmVzdGVkQXBwQXV0aEVycm9yTWVzc2FnZS51bnN1cHBvcnRlZE1ldGhvZC5kZXNjKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBOZXN0ZWRBcHBBdXRoRXJyb3IsIE5lc3RlZEFwcEF1dGhFcnJvck1lc3NhZ2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZEFwcEF1dGhFcnJvci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IERFRkFVTFRfQ1JZUFRPX0lNUExFTUVOVEFUSU9OLCBidWlsZFN0YXRpY0F1dGhvcml0eU9wdGlvbnMsIFBlcmZvcm1hbmNlRXZlbnRzLCBUaW1lVXRpbHMsIE9JRENfREVGQVVMVF9TQ09QRVMsIEFjY291bnRFbnRpdHkgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvblR5cGUsIENhY2hlTG9va3VwUG9saWN5LCBERUZBVUxUX1JFUVVFU1QgfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBDcnlwdG9PcHMgfSBmcm9tICcuLi9jcnlwdG8vQ3J5cHRvT3BzLm1qcyc7XG5pbXBvcnQgeyBOZXN0ZWRBcHBBdXRoQWRhcHRlciB9IGZyb20gJy4uL25hYS9tYXBwaW5nL05lc3RlZEFwcEF1dGhBZGFwdGVyLm1qcyc7XG5pbXBvcnQgeyBOZXN0ZWRBcHBBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9OZXN0ZWRBcHBBdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlci5tanMnO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvRXZlbnRUeXBlLm1qcyc7XG5pbXBvcnQgeyBCcm93c2VyQ2FjaGVNYW5hZ2VyLCBERUZBVUxUX0JST1dTRVJfQ0FDSEVfTUFOQUdFUiB9IGZyb20gJy4uL2NhY2hlL0Jyb3dzZXJDYWNoZU1hbmFnZXIubWpzJztcbmltcG9ydCB7IGdldEFjY291bnQsIHNldEFjdGl2ZUFjY291bnQsIGdldEFsbEFjY291bnRzLCBnZXRBY2NvdW50QnlVc2VybmFtZSwgZ2V0QWNjb3VudEJ5SG9tZUlkLCBnZXRBY2NvdW50QnlMb2NhbElkLCBnZXRBY3RpdmVBY2NvdW50IH0gZnJvbSAnLi4vY2FjaGUvQWNjb3VudE1hbmFnZXIubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIE5lc3RlZEFwcEF1dGhDb250cm9sbGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wZXJhdGluZ0NvbnRleHQpIHtcclxuICAgICAgICB0aGlzLm9wZXJhdGluZ0NvbnRleHQgPSBvcGVyYXRpbmdDb250ZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb3h5ID0gdGhpcy5vcGVyYXRpbmdDb250ZXh0LmdldEJyaWRnZVByb3h5KCk7XHJcbiAgICAgICAgaWYgKHByb3h5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5icmlkZ2VQcm94eSA9IHByb3h5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZDogYnJpZGdlUHJveHkgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBvcGVyYXRpbmdDb250ZXh0LmdldENvbmZpZygpO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgbG9nZ2VyXHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLm9wZXJhdGluZ0NvbnRleHQuZ2V0TG9nZ2VyKCk7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwZXJmb3JtYW5jZSBjbGllbnRcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50ID0gdGhpcy5jb25maWcudGVsZW1ldHJ5LmNsaWVudDtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjcnlwdG8gY2xhc3MuXHJcbiAgICAgICAgdGhpcy5icm93c2VyQ3J5cHRvID0gb3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpXHJcbiAgICAgICAgICAgID8gbmV3IENyeXB0b09wcyh0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgdHJ1ZSlcclxuICAgICAgICAgICAgOiBERUZBVUxUX0NSWVBUT19JTVBMRU1FTlRBVElPTjtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBicm93c2VyIHN0b3JhZ2UgY2xhc3MuXHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZSA9IHRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpXHJcbiAgICAgICAgICAgID8gbmV3IEJyb3dzZXJDYWNoZU1hbmFnZXIodGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCwgdGhpcy5jb25maWcuY2FjaGUsIHRoaXMuYnJvd3NlckNyeXB0bywgdGhpcy5sb2dnZXIsIGJ1aWxkU3RhdGljQXV0aG9yaXR5T3B0aW9ucyh0aGlzLmNvbmZpZy5hdXRoKSlcclxuICAgICAgICAgICAgOiBERUZBVUxUX0JST1dTRVJfQ0FDSEVfTUFOQUdFUih0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCB0aGlzLmxvZ2dlcik7XHJcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyKHRoaXMubG9nZ2VyKTtcclxuICAgICAgICB0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyID0gbmV3IE5lc3RlZEFwcEF1dGhBZGFwdGVyKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsIHRoaXMuY29uZmlnLmF1dGguY2xpZW50Q2FwYWJpbGl0aWVzLCB0aGlzLmJyb3dzZXJDcnlwdG8sIHRoaXMubG9nZ2VyKTtcclxuICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSBhY2NvdW50IGlmIGF2YWlsYWJsZVxyXG4gICAgICAgIGNvbnN0IGFjY291bnRDb250ZXh0ID0gdGhpcy5icmlkZ2VQcm94eS5nZXRBY2NvdW50Q29udGV4dCgpO1xyXG4gICAgICAgIGlmIChhY2NvdW50Q29udGV4dCkge1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZWRBY2NvdW50ID0gZ2V0QWNjb3VudChhY2NvdW50Q29udGV4dCwgdGhpcy5sb2dnZXIsIHRoaXMuYnJvd3NlclN0b3JhZ2UpO1xyXG4gICAgICAgICAgICBzZXRBY3RpdmVBY2NvdW50KGNhY2hlZEFjY291bnQsIHRoaXMuYnJvd3NlclN0b3JhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgTmVzdGVkQXBwQXV0aENvbnRyb2xsZXJcclxuICAgICAqIEBwYXJhbSBvcGVyYXRpbmdDb250ZXh0XHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPElDb250cm9sbGVyPlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlQ29udHJvbGxlcihvcGVyYXRpbmdDb250ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBOZXN0ZWRBcHBBdXRoQ29udHJvbGxlcihvcGVyYXRpbmdDb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbnRyb2xsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXplIGZ1bmN0aW9uIGZvciBOZXN0ZWRBcHBBdXRoQ29udHJvbGxlclxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICAvLyBkbyBub3RoaW5nIG5vdCByZXF1aXJlZCBieSB0aGlzIGNvbnRyb2xsZXJcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlIHRoZSBpbmNvbWluZyByZXF1ZXN0IGFuZCBhZGQgY29ycmVsYXRpb25JZCBpZiBub3QgcHJlc2VudFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGVuc3VyZVZhbGlkUmVxdWVzdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgaWYgKHJlcXVlc3Q/LmNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnJlcXVlc3QsXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUgZmxvd1xyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlbkludGVyYWN0aXZlKHJlcXVlc3QpIHtcclxuICAgICAgICBjb25zdCB2YWxpZFJlcXVlc3QgPSB0aGlzLmVuc3VyZVZhbGlkUmVxdWVzdChyZXF1ZXN0KTtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1RBUlQsIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgdmFsaWRSZXF1ZXN0KTtcclxuICAgICAgICBjb25zdCBhdFBvcHVwTWVhc3VyZW1lbnQgPSB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoUGVyZm9ybWFuY2VFdmVudHMuQWNxdWlyZVRva2VuUG9wdXAsIHZhbGlkUmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBhdFBvcHVwTWVhc3VyZW1lbnQ/LmFkZCh7IG5lc3RlZEFwcEF1dGhSZXF1ZXN0OiB0cnVlIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hYVJlcXVlc3QgPSB0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLnRvTmFhVG9rZW5SZXF1ZXN0KHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcVRpbWVzdGFtcCA9IFRpbWVVdGlscy5ub3dTZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlbkludGVyYWN0aXZlKG5hYVJlcXVlc3QpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLmZyb21OYWFUb2tlblJlc3BvbnNlKG5hYVJlcXVlc3QsIHJlc3BvbnNlLCByZXFUaW1lc3RhbXApLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyBjYWNoZSB0aGUgdG9rZW5zIGluIHRoZSByZXNwb25zZVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpO1xyXG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEFjdGl2ZUFjY291bnQocmVzdWx0LmFjY291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCByZXN1bHQpO1xyXG4gICAgICAgICAgICBhdFBvcHVwTWVhc3VyZW1lbnQuYWRkKHtcclxuICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuU2l6ZTogcmVzdWx0LmFjY2Vzc1Rva2VuLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIGlkVG9rZW5TaXplOiByZXN1bHQuaWRUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhdFBvcHVwTWVhc3VyZW1lbnQuZW5kKHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIuZnJvbUJyaWRnZUVycm9yKGUpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSwgSW50ZXJhY3Rpb25UeXBlLlBvcHVwLCBudWxsLCBlKTtcclxuICAgICAgICAgICAgYXRQb3B1cE1lYXN1cmVtZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgfSwgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYWNxdWlyZVRva2VuU2lsZW50IGZsb3dcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5TaWxlbnRJbnRlcm5hbChyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRSZXF1ZXN0ID0gdGhpcy5lbnN1cmVWYWxpZFJlcXVlc3QocmVxdWVzdCk7XHJcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NUQVJULCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCB2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgIC8vIExvb2sgZm9yIHRva2VucyBpbiB0aGUgY2FjaGUgZmlyc3RcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZSh2YWxpZFJlcXVlc3QpO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5TaWxlbnQsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHByb2NlZWQgd2l0aCBhY3F1aXJpbmcgdG9rZW5zIHZpYSB0aGUgaG9zdFxyXG4gICAgICAgIGNvbnN0IHNzb1NpbGVudE1lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLlNzb1NpbGVudCwgdmFsaWRSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHNzb1NpbGVudE1lYXN1cmVtZW50Py5pbmNyZW1lbnQoe1xyXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6IDAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmFkZCh7XHJcbiAgICAgICAgICAgIG5lc3RlZEFwcEF1dGhSZXF1ZXN0OiB0cnVlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hYVJlcXVlc3QgPSB0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLnRvTmFhVG9rZW5SZXF1ZXN0KHZhbGlkUmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcVRpbWVzdGFtcCA9IFRpbWVVdGlscy5ub3dTZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlblNpbGVudChuYWFSZXF1ZXN0KTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci5mcm9tTmFhVG9rZW5SZXNwb25zZShuYWFSZXF1ZXN0LCByZXNwb25zZSwgcmVxVGltZXN0YW1wKTtcclxuICAgICAgICAgICAgLy8gY2FjaGUgdGhlIHRva2VucyBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oeWRyYXRlQ2FjaGUocmVzdWx0LCByZXF1ZXN0KTtcclxuICAgICAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRBY3RpdmVBY2NvdW50KHJlc3VsdC5hY2NvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsIEludGVyYWN0aW9uVHlwZS5TaWxlbnQsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHNzb1NpbGVudE1lYXN1cmVtZW50Py5hZGQoe1xyXG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5TaXplOiByZXN1bHQuYWNjZXNzVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgaWRUb2tlblNpemU6IHJlc3VsdC5pZFRva2VuLmxlbmd0aCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNzb1NpbGVudE1lYXN1cmVtZW50Py5lbmQoe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci5mcm9tQnJpZGdlRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLCBJbnRlcmFjdGlvblR5cGUuU2lsZW50LCBudWxsLCBlKTtcclxuICAgICAgICAgICAgc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmVuZCh7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgICAgfSwgZSk7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYWNxdWlyZXMgdG9rZW5zIGZyb20gY2FjaGVcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGUocmVxdWVzdCkge1xyXG4gICAgICAgIGNvbnN0IGF0c01lYXN1cmVtZW50ID0gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KFBlcmZvcm1hbmNlRXZlbnRzLkFjcXVpcmVUb2tlblNpbGVudCwgcmVxdWVzdC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBhdHNNZWFzdXJlbWVudD8uYWRkKHtcclxuICAgICAgICAgICAgbmVzdGVkQXBwQXV0aFJlcXVlc3Q6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaGFzIGNsYWltcywgd2UgY2Fubm90IGxvb2sgdXAgaW4gdGhlIGNhY2hlXHJcbiAgICAgICAgaWYgKHJlcXVlc3QuY2xhaW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJDbGFpbXMgYXJlIHByZXNlbnQgaW4gdGhlIHJlcXVlc3QsIHNraXBwaW5nIGNhY2hlIGxvb2t1cFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlc3BlY3QgY2FjaGUgbG9va3VwIHBvbGljeVxyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHN3aXRjaCAocmVxdWVzdC5jYWNoZUxvb2t1cFBvbGljeSkge1xyXG4gICAgICAgICAgICBjYXNlIENhY2hlTG9va3VwUG9saWN5LkRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNhc2UgQ2FjaGVMb29rdXBQb2xpY3kuQWNjZXNzVG9rZW46XHJcbiAgICAgICAgICAgIGNhc2UgQ2FjaGVMb29rdXBQb2xpY3kuQWNjZXNzVG9rZW5BbmRSZWZyZXNoVG9rZW46XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZUludGVybmFsKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUywgSW50ZXJhY3Rpb25UeXBlLlNpbGVudCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgYXRzTWVhc3VyZW1lbnQ/LmFkZCh7XHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlblNpemU6IHJlc3VsdD8uYWNjZXNzVG9rZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgaWRUb2tlblNpemU6IHJlc3VsdD8uaWRUb2tlbi5sZW5ndGgsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhdHNNZWFzdXJlbWVudD8uZW5kKHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcIkNhY2hlZCB0b2tlbnMgYXJlIG5vdCBmb3VuZCBmb3IgdGhlIGFjY291bnQsIHByb2NlZWRpbmcgd2l0aCBzaWxlbnQgdG9rZW4gcmVxdWVzdC5cIik7XHJcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsIEludGVyYWN0aW9uVHlwZS5TaWxlbnQsIG51bGwpO1xyXG4gICAgICAgIGF0c01lYXN1cmVtZW50Py5lbmQoe1xyXG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGVJbnRlcm5hbChyZXF1ZXN0KSB7XHJcbiAgICAgICAgY29uc3QgYWNjb3VudENvbnRleHQgPSB0aGlzLmJyaWRnZVByb3h5LmdldEFjY291bnRDb250ZXh0KCk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRBY2NvdW50ID0gbnVsbDtcclxuICAgICAgICBpZiAoYWNjb3VudENvbnRleHQpIHtcclxuICAgICAgICAgICAgY29uc3QgaHViQWNjb3VudCA9IGdldEFjY291bnQoYWNjb3VudENvbnRleHQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgICAgICAgICAgLy8gYWx3YXlzIHByaW9yaXRpemUgZm9yIGh1YiBhY2NvdW50IGNvbnRleHQsIHRoZSByZXFpcmVtZW50IG9mIGByZXF1ZXN0LmFjY291bnRgIHdpbGwgYmUgcmVtb3ZlZCBzb29uXHJcbiAgICAgICAgICAgIGN1cnJlbnRBY2NvdW50ID0gaHViQWNjb3VudCB8fCByZXF1ZXN0LmFjY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBicm9rZXJpbmcgaWYgbm8gY2FjaGVkIGFjY291bnQgaXMgZm91bmRcclxuICAgICAgICBpZiAoIWN1cnJlbnRBY2NvdW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJObyBhY3RpdmUgYWNjb3VudCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHRoZSBob3N0XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiYWN0aXZlIGFjY291bnQgZm91bmQsIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSB0b2tlbiBzaWxlbnRseVwiKTtcclxuICAgICAgICBjb25zdCBhdXRoUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgLi4ucmVxdWVzdCxcclxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcmVxdWVzdC5jb3JyZWxhdGlvbklkIHx8IHRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCksXHJcbiAgICAgICAgICAgIGF1dGhvcml0eTogcmVxdWVzdC5hdXRob3JpdHkgfHwgY3VycmVudEFjY291bnQuZW52aXJvbm1lbnQsXHJcbiAgICAgICAgICAgIHNjb3BlczogcmVxdWVzdC5zY29wZXM/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyByZXF1ZXN0LnNjb3Blc1xyXG4gICAgICAgICAgICAgICAgOiBbLi4uT0lEQ19ERUZBVUxUX1NDT1BFU10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBmZXRjaCBhY2Nlc3MgdG9rZW4gYW5kIGNoZWNrIGZvciBleHBpcnlcclxuICAgICAgICBjb25zdCB0b2tlbktleXMgPSB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFRva2VuS2V5cygpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEFjY2Vzc1Rva2VuID0gdGhpcy5icm93c2VyU3RvcmFnZS5nZXRBY2Nlc3NUb2tlbihjdXJyZW50QWNjb3VudCwgYXV0aFJlcXVlc3QsIHRva2VuS2V5cywgY3VycmVudEFjY291bnQudGVuYW50SWQsIHRoaXMucGVyZm9ybWFuY2VDbGllbnQsIGF1dGhSZXF1ZXN0LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGFjY2VzcyB0b2tlbiwgbG9nIGl0IGFuZCByZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmICghY2FjaGVkQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIk5vIGNhY2hlZCBhY2Nlc3MgdG9rZW4gZm91bmRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKFRpbWVVdGlscy53YXNDbG9ja1R1cm5lZEJhY2soY2FjaGVkQWNjZXNzVG9rZW4uY2FjaGVkQXQpIHx8XHJcbiAgICAgICAgICAgIFRpbWVVdGlscy5pc1Rva2VuRXhwaXJlZChjYWNoZWRBY2Nlc3NUb2tlbi5leHBpcmVzT24sIHRoaXMuY29uZmlnLnN5c3RlbS50b2tlblJlbmV3YWxPZmZzZXRTZWNvbmRzKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiQ2FjaGVkIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FjaGVkSWRUb2tlbiA9IHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SWRUb2tlbihjdXJyZW50QWNjb3VudCwgdG9rZW5LZXlzLCBjdXJyZW50QWNjb3VudC50ZW5hbnRJZCwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwgYXV0aFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgaWYgKCFjYWNoZWRJZFRva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoXCJObyBjYWNoZWQgaWQgdG9rZW4gZm91bmRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLnRvQXV0aGVudGljYXRpb25SZXN1bHRGcm9tQ2FjaGUoY3VycmVudEFjY291bnQsIGNhY2hlZElkVG9rZW4sIGNhY2hlZEFjY2Vzc1Rva2VuLCBhdXRoUmVxdWVzdCwgYXV0aFJlcXVlc3QuY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlblBvcHVwIGZsb3cgaW1wbGVtZW50YXRpb25cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlblJlZGlyZWN0IGZsb3cgaXMgbm90IHN1cHBvcnRlZCBpbiBuZXN0ZWQgYXBwIGF1dGhcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFjcXVpcmVUb2tlblJlZGlyZWN0KHJlcXVlc3QpIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBhY3F1aXJlVG9rZW5TaWxlbnQgZmxvdyBpbXBsZW1lbnRhdGlvblxyXG4gICAgICogQHBhcmFtIHNpbGVudFJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50SW50ZXJuYWwoc2lsZW50UmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEh5YnJpZCBmbG93IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgYXV0aFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWNxdWlyZVRva2VuQnlDb2RlKHJlcXVlc3QgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICkge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlbk5hdGl2ZSBmbG93IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgYXV0aFxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBhcGlJZFxyXG4gICAgICogQHBhcmFtIGFjY291bnRJZFxyXG4gICAgICovXHJcbiAgICBhY3F1aXJlVG9rZW5OYXRpdmUocmVxdWVzdCwgYXBpSWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhY2NvdW50SWQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICkge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuIGZsb3cgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gbmVzdGVkIGFwcCBhdXRoXHJcbiAgICAgKiBAcGFyYW0gY29tbW9uUmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHNpbGVudFJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgYWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4oY29tbW9uUmVxdWVzdCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHNpbGVudFJlcXVlc3QgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICkge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgZXZlbnQgY2FsbGJhY2tzIHRvIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgICAqIEBwYXJhbSBldmVudFR5cGVzXHJcbiAgICAgKi9cclxuICAgIGFkZEV2ZW50Q2FsbGJhY2soY2FsbGJhY2ssIGV2ZW50VHlwZXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuYWRkRXZlbnRDYWxsYmFjayhjYWxsYmFjaywgZXZlbnRUeXBlcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgY2FsbGJhY2sgd2l0aCBwcm92aWRlZCBpZCBmcm9tIGNhbGxiYWNrIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tJZFxyXG4gICAgICovXHJcbiAgICByZW1vdmVFdmVudENhbGxiYWNrKGNhbGxiYWNrSWQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGNhbGxiYWNrSWQpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICByZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrSWQpIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlQWNjb3VudFN0b3JhZ2VFdmVudHMoKSB7XHJcbiAgICAgICAgdGhyb3cgTmVzdGVkQXBwQXV0aEVycm9yLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKTtcclxuICAgIH1cclxuICAgIGRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgLy8gI3JlZ2lvbiBBY2NvdW50IEFQSXNcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoIHRoZSBvcHRpb25hbCBmaWx0ZXIuIElmIG5vIGZpbHRlciBpcyBwcm92aWRlZCwgYWxsIGFjY291bnRzIGFyZSByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyIC0gKE9wdGlvbmFsKSBmaWx0ZXIgdG8gbmFycm93IGRvd24gdGhlIGFjY291bnRzIHJldHVybmVkXHJcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBBY2NvdW50SW5mbyBvYmplY3RzIGluIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIGdldEFsbEFjY291bnRzKGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWxsQWNjb3VudHModGhpcy5sb2dnZXIsIHRoaXMuYnJvd3NlclN0b3JhZ2UsIHRoaXMuaXNCcm93c2VyRW52KCksIGFjY291bnRGaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBhY2NvdW50IGZvdW5kIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoZXMgdGhlIGFjY291bnQgZmlsdGVyIHBhc3NlZCBpbi5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgZmlyc3QgYWNjb3VudCBmb3VuZCBpbiB0aGUgY2FjaGUgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIGZpbHRlciBvciBudWxsIGlmIG5vIGFjY291bnQgY291bGQgYmUgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnQoYWNjb3VudEZpbHRlcikge1xyXG4gICAgICAgIHJldHVybiBnZXRBY2NvdW50KGFjY291bnRGaWx0ZXIsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgdXNlcm5hbWUuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kLlxyXG4gICAgICogVGhpcyBBUEkgaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIGJ1dCBnZXRBY2NvdW50QnlJZCBzaG91bGQgYmUgdXNlZCBmb3IgYmVzdCByZWxpYWJpbGl0eVxyXG4gICAgICogQHBhcmFtIHVzZXJuYW1lXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlcm5hbWUpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlcm5hbWUsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgaG9tZUFjY291bnRJZC5cclxuICAgICAqICh0aGUgYWNjb3VudCBvYmplY3QgaXMgY3JlYXRlZCBhdCB0aGUgdGltZSBvZiBzdWNjZXNzZnVsIGxvZ2luKVxyXG4gICAgICogb3IgbnVsbCB3aGVuIG5vIG1hdGNoaW5nIGFjY291bnQgaXMgZm91bmRcclxuICAgICAqIEBwYXJhbSBob21lQWNjb3VudElkXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQpIHtcclxuICAgICAgICByZXR1cm4gZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zIFRoZSBhY2NvdW50IG9iamVjdCBzdG9yZWQgaW4gTVNBTFxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50QnlMb2NhbElkKGxvY2FsQWNjb3VudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldEFjY291bnRCeUxvY2FsSWQobG9jYWxBY2NvdW50SWQsIHRoaXMubG9nZ2VyLCB0aGlzLmJyb3dzZXJTdG9yYWdlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYWNjb3VudCB0byB1c2UgYXMgdGhlIGFjdGl2ZSBhY2NvdW50LiBJZiBubyBhY2NvdW50IGlzIHBhc3NlZCB0byB0aGUgYWNxdWlyZVRva2VuIEFQSXMsIHRoZW4gTVNBTCB3aWxsIHVzZSB0aGlzIGFjdGl2ZSBhY2NvdW50LlxyXG4gICAgICogQHBhcmFtIGFjY291bnRcclxuICAgICAqL1xyXG4gICAgc2V0QWN0aXZlQWNjb3VudChhY2NvdW50KSB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBTdGFuZGFyZENvbnRyb2xsZXIgdXNlcyB0aGlzIHRvIGFsbG93IHRoZSBkZXZlbG9wZXIgdG8gc2V0IHRoZSBhY3RpdmUgYWNjb3VudFxyXG4gICAgICAgICAqIGluIHRoZSBuZXN0ZWQgYXBwIGF1dGggc2NlbmFyaW8gdGhlIGFjdGl2ZSBhY2NvdW50IGlzIGNvbnRyb2xsZWQgYnkgdGhlIGFwcCBob3N0aW5nIHRoZSBuZXN0ZWQgYXBwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuIHNldEFjdGl2ZUFjY291bnQoYWNjb3VudCwgdGhpcy5icm93c2VyU3RvcmFnZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBnZXRBY3RpdmVBY2NvdW50KCkge1xyXG4gICAgICAgIHJldHVybiBnZXRBY3RpdmVBY2NvdW50KHRoaXMuYnJvd3NlclN0b3JhZ2UpO1xyXG4gICAgfVxyXG4gICAgLy8gI2VuZHJlZ2lvblxyXG4gICAgaGFuZGxlUmVkaXJlY3RQcm9taXNlKGhhc2ggLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcbiAgICBsb2dpblBvcHVwKHJlcXVlc3QgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbkludGVyYWN0aXZlKHJlcXVlc3QgfHwgREVGQVVMVF9SRVFVRVNUKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGxvZ2luUmVkaXJlY3QocmVxdWVzdCkge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBsb2dvdXQobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIHRocm93IE5lc3RlZEFwcEF1dGhFcnJvci5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCk7XHJcbiAgICB9XHJcbiAgICBsb2dvdXRSZWRpcmVjdChsb2dvdXRSZXF1ZXN0IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICApIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgbG9nb3V0UG9wdXAobG9nb3V0UmVxdWVzdCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgKSB7XHJcbiAgICAgICAgdGhyb3cgTmVzdGVkQXBwQXV0aEVycm9yLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKTtcclxuICAgIH1cclxuICAgIHNzb1NpbGVudChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW5TaWxlbnRJbnRlcm5hbChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIGdldFRva2VuQ2FjaGUoKSB7XHJcbiAgICAgICAgdGhyb3cgTmVzdGVkQXBwQXV0aEVycm9yLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbG9nZ2VyIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIGdldExvZ2dlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlciBzZXQgaW4gY29uZmlndXJhdGlvbnMgd2l0aCBuZXcgTG9nZ2VyIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25zXHJcbiAgICAgKiBAcGFyYW0gbG9nZ2VyIExvZ2dlciBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBzZXRMb2dnZXIobG9nZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBpbml0aWFsaXplV3JhcHBlckxpYnJhcnkoc2t1LCB2ZXJzaW9uKSB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBTdGFuZGFyZCBjb250cm9sbGVyIHVzZXMgdGhpcyB0byBzZXQgdGhlIHNrdSBhbmQgdmVyc2lvbiBvZiB0aGUgd3JhcHBlciBsaWJyYXJ5IGluIHRoZSBzdG9yYWdlXHJcbiAgICAgICAgICogd2UgZG8gbm90aGluZyBoZXJlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2V0TmF2aWdhdGlvbkNsaWVudChuYXZpZ2F0aW9uQ2xpZW50KSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhcInNldE5hdmlnYXRpb25DbGllbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBuZXN0ZWQgYXBwIGF1dGhcIik7XHJcbiAgICB9XHJcbiAgICBnZXRDb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcclxuICAgIH1cclxuICAgIGlzQnJvd3NlckVudigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpbmdDb250ZXh0LmlzQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICB9XHJcbiAgICBnZXRCcm93c2VyQ3J5cHRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJDcnlwdG87XHJcbiAgICB9XHJcbiAgICBnZXRQZXJmb3JtYW5jZUNsaWVudCgpIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgZ2V0UmVkaXJlY3RSZXNwb25zZSgpIHtcclxuICAgICAgICB0aHJvdyBOZXN0ZWRBcHBBdXRoRXJyb3IuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmMgY2xlYXJDYWNoZShsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgdGhyb3cgTmVzdGVkQXBwQXV0aEVycm9yLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci52ZXJib3NlKFwiaHlkcmF0ZUNhY2hlIGNhbGxlZFwiKTtcclxuICAgICAgICBjb25zdCBhY2NvdW50RW50aXR5ID0gQWNjb3VudEVudGl0eS5jcmVhdGVGcm9tQWNjb3VudEluZm8ocmVzdWx0LmFjY291bnQsIHJlc3VsdC5jbG91ZEdyYXBoSG9zdE5hbWUsIHJlc3VsdC5tc0dyYXBoSG9zdCk7XHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRBY2NvdW50KGFjY291bnRFbnRpdHkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlLmh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IE5lc3RlZEFwcEF1dGhDb250cm9sbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZXN0ZWRBcHBBdXRoQ29udHJvbGxlci5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IE5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQgfSBmcm9tICcuLi9vcGVyYXRpbmdjb250ZXh0L05lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQubWpzJztcbmltcG9ydCB7IFN0YW5kYXJkT3BlcmF0aW5nQ29udGV4dCB9IGZyb20gJy4uL29wZXJhdGluZ2NvbnRleHQvU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0Lm1qcyc7XG5pbXBvcnQgeyBTdGFuZGFyZENvbnRyb2xsZXIgfSBmcm9tICcuL1N0YW5kYXJkQ29udHJvbGxlci5tanMnO1xuaW1wb3J0IHsgTmVzdGVkQXBwQXV0aENvbnRyb2xsZXIgfSBmcm9tICcuL05lc3RlZEFwcEF1dGhDb250cm9sbGVyLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVWM0NvbnRyb2xsZXIoY29uZmlnLCByZXF1ZXN0KSB7XHJcbiAgICBjb25zdCBzdGFuZGFyZCA9IG5ldyBTdGFuZGFyZE9wZXJhdGluZ0NvbnRleHQoY29uZmlnKTtcclxuICAgIGF3YWl0IHN0YW5kYXJkLmluaXRpYWxpemUoKTtcclxuICAgIHJldHVybiBTdGFuZGFyZENvbnRyb2xsZXIuY3JlYXRlQ29udHJvbGxlcihzdGFuZGFyZCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29udHJvbGxlcihjb25maWcpIHtcclxuICAgIGNvbnN0IHN0YW5kYXJkID0gbmV3IFN0YW5kYXJkT3BlcmF0aW5nQ29udGV4dChjb25maWcpO1xyXG4gICAgY29uc3QgbmVzdGVkQXBwID0gbmV3IE5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQoY29uZmlnKTtcclxuICAgIGNvbnN0IG9wZXJhdGluZ0NvbnRleHRzID0gW3N0YW5kYXJkLmluaXRpYWxpemUoKSwgbmVzdGVkQXBwLmluaXRpYWxpemUoKV07XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChvcGVyYXRpbmdDb250ZXh0cyk7XHJcbiAgICBpZiAobmVzdGVkQXBwLmlzQXZhaWxhYmxlKCkgJiYgY29uZmlnLmF1dGguc3VwcG9ydHNOZXN0ZWRBcHBBdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIE5lc3RlZEFwcEF1dGhDb250cm9sbGVyLmNyZWF0ZUNvbnRyb2xsZXIobmVzdGVkQXBwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHN0YW5kYXJkLmlzQXZhaWxhYmxlKCkpIHtcclxuICAgICAgICByZXR1cm4gU3RhbmRhcmRDb250cm9sbGVyLmNyZWF0ZUNvbnRyb2xsZXIoc3RhbmRhcmQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gU2luY2UgbmVpdGhlciBvZiB0aGUgYWN0dWFsIG9wZXJhdGluZyBjb250ZXh0cyBhcmUgYXZhaWxhYmxlIGtlZXAgdGhlIFVua25vd25PcGVyYXRpbmdDb250ZXh0Q29udHJvbGxlclxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGNyZWF0ZUNvbnRyb2xsZXIsIGNyZWF0ZVYzQ29udHJvbGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29udHJvbGxlckZhY3RvcnkubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBjcmVhdGVWM0NvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVycy9Db250cm9sbGVyRmFjdG9yeS5tanMnO1xuaW1wb3J0IHsgU3RhbmRhcmRDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlcnMvU3RhbmRhcmRDb250cm9sbGVyLm1qcyc7XG5pbXBvcnQgeyBTdGFuZGFyZE9wZXJhdGluZ0NvbnRleHQgfSBmcm9tICcuLi9vcGVyYXRpbmdjb250ZXh0L1N0YW5kYXJkT3BlcmF0aW5nQ29udGV4dC5tanMnO1xuaW1wb3J0IHsgTmVzdGVkQXBwQXV0aENvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVycy9OZXN0ZWRBcHBBdXRoQ29udHJvbGxlci5tanMnO1xuaW1wb3J0IHsgTmVzdGVkQXBwT3BlcmF0aW5nQ29udGV4dCB9IGZyb20gJy4uL29wZXJhdGluZ2NvbnRleHQvTmVzdGVkQXBwT3BlcmF0aW5nQ29udGV4dC5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBjbGFzcyBpcyB0aGUgb2JqZWN0IGV4cG9zZWQgYnkgdGhlIGxpYnJhcnkgdG8gcGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBmdW5jdGlvbnMgaW4gU2luZ2xlIFBhZ2UgQXBwbGljYXRpb25zXHJcbiAqIHRvIG9idGFpbiBKV1QgdG9rZW5zIGFzIGRlc2NyaWJlZCBpbiB0aGUgT0F1dGggMi4wIEF1dGhvcml6YXRpb24gQ29kZSBGbG93IHdpdGggUEtDRSBzcGVjaWZpY2F0aW9uLlxyXG4gKi9cclxuY2xhc3MgUHVibGljQ2xpZW50QXBwbGljYXRpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIFN0YW5kYXJkQ29udHJvbGxlciBhbmQgcGFzc2VzIGl0IHRvIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHtDb25maWd1cmF0aW9ufVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlUHVibGljQ2xpZW50QXBwbGljYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBhd2FpdCBjcmVhdGVWM0NvbnRyb2xsZXIoY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgY29uc3QgcGNhID0gbmV3IFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uKGNvbmZpZ3VyYXRpb24sIGNvbnRyb2xsZXIpO1xyXG4gICAgICAgIHJldHVybiBwY2E7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBJbXBvcnRhbnQgYXR0cmlidXRlcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGF1dGggYXJlOlxyXG4gICAgICogLSBjbGllbnRJRDogdGhlIGFwcGxpY2F0aW9uIElEIG9mIHlvdXIgYXBwbGljYXRpb24uIFlvdSBjYW4gb2J0YWluIG9uZSBieSByZWdpc3RlcmluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGggb3VyIEFwcGxpY2F0aW9uIHJlZ2lzdHJhdGlvbiBwb3J0YWwgOiBodHRwczovL3BvcnRhbC5henVyZS5jb20vI2JsYWRlL01pY3Jvc29mdF9BQURfSUFNL0FjdGl2ZURpcmVjdG9yeU1lbnVCbGFkZS9SZWdpc3RlcmVkQXBwc1ByZXZpZXdcclxuICAgICAqIC0gYXV0aG9yaXR5OiB0aGUgYXV0aG9yaXR5IFVSTCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cclxuICAgICAqIC0gcmVkaXJlY3RfdXJpOiB0aGUgdXJpIG9mIHlvdXIgYXBwbGljYXRpb24gcmVnaXN0ZXJlZCBpbiB0aGUgcG9ydGFsLlxyXG4gICAgICpcclxuICAgICAqIEluIEF6dXJlIEFELCBhdXRob3JpdHkgaXMgYSBVUkwgaW5kaWNhdGluZyB0aGUgQXp1cmUgYWN0aXZlIGRpcmVjdG9yeSB0aGF0IE1TQUwgdXNlcyB0byBvYnRhaW4gdG9rZW5zLlxyXG4gICAgICogSXQgaXMgb2YgdGhlIGZvcm0gaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL3tFbnRlcl90aGVfVGVuYW50X0luZm9fSGVyZX1cclxuICAgICAqIElmIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgQWNjb3VudHMgaW4gb25lIG9yZ2FuaXphdGlvbmFsIGRpcmVjdG9yeSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCB0aGUgVGVuYW50IElkIG9yIFRlbmFudCBuYW1lIChmb3IgZXhhbXBsZSwgY29udG9zby5taWNyb3NvZnQuY29tKS5cclxuICAgICAqIElmIHlvdXIgYXBwbGljYXRpb24gc3VwcG9ydHMgQWNjb3VudHMgaW4gYW55IG9yZ2FuaXphdGlvbmFsIGRpcmVjdG9yeSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCBvcmdhbml6YXRpb25zLlxyXG4gICAgICogSWYgeW91ciBhcHBsaWNhdGlvbiBzdXBwb3J0cyBBY2NvdW50cyBpbiBhbnkgb3JnYW5pemF0aW9uYWwgZGlyZWN0b3J5IGFuZCBwZXJzb25hbCBNaWNyb3NvZnQgYWNjb3VudHMsIHJlcGxhY2UgXCJFbnRlcl90aGVfVGVuYW50X0luZm9fSGVyZVwiIHZhbHVlIHdpdGggY29tbW9uLlxyXG4gICAgICogVG8gcmVzdHJpY3Qgc3VwcG9ydCB0byBQZXJzb25hbCBNaWNyb3NvZnQgYWNjb3VudHMgb25seSwgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCBjb25zdW1lcnMuXHJcbiAgICAgKlxyXG4gICAgICogSW4gQXp1cmUgQjJDLCBhdXRob3JpdHkgaXMgb2YgdGhlIGZvcm0gaHR0cHM6Ly97aW5zdGFuY2V9L3RmcC97dGVuYW50fS97cG9saWN5TmFtZX0vXHJcbiAgICAgKiBGdWxsIEIyQyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoaXMgbGlicmFyeSBpbiBmdXR1cmUgdmVyc2lvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gT2JqZWN0IGZvciB0aGUgTVNBTCBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBpbnN0YW5jZVxyXG4gICAgICogQHBhcmFtIElDb250cm9sbGVyIE9wdGlvbmFsIHBhcmFtZXRlciB0byBleHBsaWN0bHkgc2V0IHRoZSBjb250cm9sbGVyLiAoV2lsbCBiZSByZW1vdmVkIHdoZW4gd2UgcmVtb3ZlIHB1YmxpYyBjb25zdHJ1Y3RvcilcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbiwgY29udHJvbGxlcikge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9XHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgfHxcclxuICAgICAgICAgICAgICAgIG5ldyBTdGFuZGFyZENvbnRyb2xsZXIobmV3IFN0YW5kYXJkT3BlcmF0aW5nQ29udGV4dChjb25maWd1cmF0aW9uKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYXN5bmMgc3RhcnR1cCB0YXNrcyBzdWNoIGFzIGNvbm5lY3RpbmcgdG8gV0FNIGV4dGVuc2lvblxyXG4gICAgICogQHBhcmFtIHJlcXVlc3Qgez9Jbml0aWFsaXplQXBwbGljYXRpb25SZXF1ZXN0fVxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplKHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmluaXRpYWxpemUocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZSB3aGVuIHlvdSB3YW50IHRvIG9idGFpbiBhbiBhY2Nlc3NfdG9rZW4gZm9yIHlvdXIgQVBJIHZpYSBvcGVuaW5nIGEgcG9wdXAgd2luZG93IGluIHRoZSB1c2VyJ3MgYnJvd3NlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBhY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4geW91IHdhbnQgdG8gb2J0YWluIGFuIGFjY2Vzc190b2tlbiBmb3IgeW91ciBBUEkgYnkgcmVkaXJlY3RpbmcgdGhlIHVzZXIncyBicm93c2VyIHdpbmRvdyB0byB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludC4gVGhpcyBmdW5jdGlvbiByZWRpcmVjdHNcclxuICAgICAqIHRoZSBwYWdlLCBzbyBhbnkgY29kZSB0aGF0IGZvbGxvd3MgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBleGVjdXRlLlxyXG4gICAgICpcclxuICAgICAqIElNUE9SVEFOVDogSXQgaXMgTk9UIHJlY29tbWVuZGVkIHRvIGhhdmUgY29kZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5hdmlnYXRlIGF3YXkgZnJvbSB0aGUgY3VycmVudFxyXG4gICAgICogYnJvd3NlciB3aW5kb3cuIEl0IGN1cnJlbnRseSByZXR1cm5zIGEgUHJvbWlzZSBpbiBvcmRlciB0byByZWZsZWN0IHRoZSBhc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoZSBjb2RlIHJ1bm5pbmcgaW4gdGhpcyBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBhY3F1aXJlVG9rZW5SZWRpcmVjdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5SZWRpcmVjdChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2lsZW50bHkgYWNxdWlyZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIGEgZ2l2ZW4gc2V0IG9mIHNjb3Blcy4gUmV0dXJucyBjdXJyZW50bHkgcHJvY2Vzc2luZyBwcm9taXNlIGlmIHBhcmFsbGVsIHJlcXVlc3RzIGFyZSBtYWRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QGxpbmsgKFNpbGVudFJlcXVlc3Q6dHlwZSl9XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48QXV0aGVudGljYXRpb25SZXN1bHQ+fSAtIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC4gUmV0dXJucyB0aGUge0BsaW5rIEF1dGhlbnRpY2F0aW9uUmVzdWx0fSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgYWNxdWlyZVRva2VuU2lsZW50KHNpbGVudFJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiByZWRlZW1zIGFuIGF1dGhvcml6YXRpb24gY29kZSAocGFzc2VkIGFzIGNvZGUpIGZyb20gdGhlIGVTVFMgdG9rZW4gZW5kcG9pbnQuXHJcbiAgICAgKiBUaGlzIGF1dGhvcml6YXRpb24gY29kZSBzaG91bGQgYmUgYWNxdWlyZWQgc2VydmVyLXNpZGUgdXNpbmcgYSBjb25maWRlbnRpYWwgY2xpZW50IHRvIGFjcXVpcmUgYSBzcGFfY29kZS5cclxuICAgICAqIFRoaXMgQVBJIGlzIG5vdCBpbmRlbmRlZCBmb3Igbm9ybWFsIGF1dGhvcml6YXRpb24gY29kZSBhY3F1aXNpdGlvbiBhbmQgcmVkZW1wdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBSZWRlbXB0aW9uIG9mIHRoaXMgYXV0aG9yaXphdGlvbiBjb2RlIHdpbGwgbm90IHJlcXVpcmUgUEtDRSwgYXMgaXQgd2FzIGFjcXVpcmVkIGJ5IGEgY29uZmlkZW50aWFsIGNsaWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCB7QGxpbmsgQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0fVxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLlxyXG4gICAgICovXHJcbiAgICBhY3F1aXJlVG9rZW5CeUNvZGUocmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuYWNxdWlyZVRva2VuQnlDb2RlKHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGV2ZW50IGNhbGxiYWNrcyB0byBhcnJheVxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlc1xyXG4gICAgICovXHJcbiAgICBhZGRFdmVudENhbGxiYWNrKGNhbGxiYWNrLCBldmVudFR5cGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRFdmVudENhbGxiYWNrKGNhbGxiYWNrLCBldmVudFR5cGVzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBjYWxsYmFjayB3aXRoIHByb3ZpZGVkIGlkIGZyb20gY2FsbGJhY2sgYXJyYXlcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0lkXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tJZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIucmVtb3ZlRXZlbnRDYWxsYmFjayhjYWxsYmFja0lkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSBwZXJmb3JtYW5jZSBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUNhbGxiYWNrRnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBhZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBhZGRQZXJmb3JtYW5jZUNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja0lkXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFja0lkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrSWQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGV2ZW50IGxpc3RlbmVyIHRoYXQgZW1pdHMgYW4gZXZlbnQgd2hlbiBhIHVzZXIgYWNjb3VudCBpcyBhZGRlZCBvciByZW1vdmVkIGZyb20gbG9jYWxzdG9yYWdlIGluIGEgZGlmZmVyZW50IGJyb3dzZXIgdGFiIG9yIHdpbmRvd1xyXG4gICAgICovXHJcbiAgICBlbmFibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZW5hYmxlQWNjb3VudFN0b3JhZ2VFdmVudHMoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lciB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW4gYSB1c2VyIGFjY291bnQgaXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGxvY2Fsc3RvcmFnZSBpbiBhIGRpZmZlcmVudCBicm93c2VyIHRhYiBvciB3aW5kb3dcclxuICAgICAqL1xyXG4gICAgZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNhYmxlQWNjb3VudFN0b3JhZ2VFdmVudHMoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3QgYWNjb3VudCBmb3VuZCBpbiB0aGUgY2FjaGUgdGhhdCBtYXRjaGVzIHRoZSBhY2NvdW50IGZpbHRlciBwYXNzZWQgaW4uXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudEZpbHRlclxyXG4gICAgICogQHJldHVybnMgVGhlIGZpcnN0IGFjY291bnQgZm91bmQgaW4gdGhlIGNhY2hlIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBmaWx0ZXIgb3IgbnVsbCBpZiBubyBhY2NvdW50IGNvdWxkIGJlIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50KGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnQoYWNjb3VudEZpbHRlcik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBpbiBhY2NvdW50IG1hdGNoaW5nIGhvbWVBY2NvdW50SWQuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gaG9tZUFjY291bnRJZFxyXG4gICAgICogQHJldHVybnMgVGhlIGFjY291bnQgb2JqZWN0IHN0b3JlZCBpbiBNU0FMXHJcbiAgICAgKiBAZGVwcmVjYXRlZCAtIFVzZSBnZXRBY2NvdW50IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5SG9tZUlkKGhvbWVBY2NvdW50SWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUhvbWVJZChob21lQWNjb3VudElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gbG9jYWxBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zIFRoZSBhY2NvdW50IG9iamVjdCBzdG9yZWQgaW4gTVNBTFxyXG4gICAgICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0QWNjb3VudCBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnRCeUxvY2FsSWQobG9jYWxJZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5TG9jYWxJZChsb2NhbElkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2lnbmVkIGluIGFjY291bnQgbWF0Y2hpbmcgdXNlcm5hbWUuXHJcbiAgICAgKiAodGhlIGFjY291bnQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2Ygc3VjY2Vzc2Z1bCBsb2dpbilcclxuICAgICAqIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyBhY2NvdW50IGlzIGZvdW5kLlxyXG4gICAgICogVGhpcyBBUEkgaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIGJ1dCBnZXRBY2NvdW50QnlJZCBzaG91bGQgYmUgdXNlZCBmb3IgYmVzdCByZWxpYWJpbGl0eVxyXG4gICAgICogQHBhcmFtIHVzZXJOYW1lXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqIEBkZXByZWNhdGVkIC0gVXNlIGdldEFjY291bnQgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50QnlVc2VybmFtZSh1c2VyTmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlck5hbWUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgYWNjb3VudHMgaW4gdGhlIGNhY2hlIHRoYXQgbWF0Y2ggdGhlIG9wdGlvbmFsIGZpbHRlci4gSWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkLCBhbGwgYWNjb3VudHMgYXJlIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIGFjY291bnRGaWx0ZXIgLSAoT3B0aW9uYWwpIGZpbHRlciB0byBuYXJyb3cgZG93biB0aGUgYWNjb3VudHMgcmV0dXJuZWRcclxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIEFjY291bnRJbmZvIG9iamVjdHMgaW4gY2FjaGVcclxuICAgICAqL1xyXG4gICAgZ2V0QWxsQWNjb3VudHMoYWNjb3VudEZpbHRlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWxsQWNjb3VudHMoYWNjb3VudEZpbHRlcik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGZpcmUgZXZlbnRzIGFmdGVyIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBvYmplY3RcclxuICAgICAqIGhhcyBsb2FkZWQgZHVyaW5nIHJlZGlyZWN0IGZsb3dzLiBUaGlzIHNob3VsZCBiZSBpbnZva2VkIG9uIGFsbCBwYWdlIGxvYWRzIGludm9sdmVkIGluIHJlZGlyZWN0XHJcbiAgICAgKiBhdXRoIGZsb3dzLlxyXG4gICAgICogQHBhcmFtIGhhc2ggSGFzaCB0byBwcm9jZXNzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB3aW5kb3cubG9jYXRpb24uaGFzaC4gT25seSBuZWVkcyB0byBiZSBwcm92aWRlZCBleHBsaWNpdGx5IGlmIHRoZSByZXNwb25zZSB0byBiZSBoYW5kbGVkIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBUb2tlbiByZXNwb25zZSBvciBudWxsLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG51bGwsIHRoZW4gbm8gYXV0aCByZWRpcmVjdCB3YXMgZGV0ZWN0ZWQuXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZVJlZGlyZWN0UHJvbWlzZShoYXNoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5oYW5kbGVSZWRpcmVjdFByb21pc2UoaGFzaCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZSB3aGVuIGluaXRpYXRpbmcgdGhlIGxvZ2luIHByb2Nlc3MgdmlhIG9wZW5pbmcgYSBwb3B1cCB3aW5kb3cgaW4gdGhlIHVzZXIncyBicm93c2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIHdhcyByYWlzZWQuXHJcbiAgICAgKi9cclxuICAgIGxvZ2luUG9wdXAocmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIubG9naW5Qb3B1cChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4gaW5pdGlhdGluZyB0aGUgbG9naW4gcHJvY2VzcyBieSByZWRpcmVjdGluZyB0aGUgdXNlcidzIGJyb3dzZXIgdG8gdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQuIFRoaXMgZnVuY3Rpb24gcmVkaXJlY3RzIHRoZSBwYWdlLCBzb1xyXG4gICAgICogYW55IGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZXhlY3V0ZS5cclxuICAgICAqXHJcbiAgICAgKiBJTVBPUlRBTlQ6IEl0IGlzIE5PVCByZWNvbW1lbmRlZCB0byBoYXZlIGNvZGUgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UuIFRoaXMgZnVuY3Rpb24gd2lsbCBuYXZpZ2F0ZSBhd2F5IGZyb20gdGhlIGN1cnJlbnRcclxuICAgICAqIGJyb3dzZXIgd2luZG93LiBJdCBjdXJyZW50bHkgcmV0dXJucyBhIFByb21pc2UgaW4gb3JkZXIgdG8gcmVmbGVjdCB0aGUgYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGUgY29kZSBydW5uaW5nIGluIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgbG9naW5SZWRpcmVjdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblJlZGlyZWN0KHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXByZWNhdGVkIGxvZ291dCBmdW5jdGlvbi4gVXNlIGxvZ291dFJlZGlyZWN0IG9yIGxvZ291dFBvcHVwIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKiBAZGVwcmVjYXRlZFxyXG4gICAgICovXHJcbiAgICBsb2dvdXQobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0KGxvZ291dFJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgdG8gbG9nIG91dCB0aGUgY3VycmVudCB1c2VyLCBhbmQgcmVkaXJlY3QgdGhlIHVzZXIgdG8gdGhlIHBvc3RMb2dvdXRSZWRpcmVjdFVyaS5cclxuICAgICAqIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHJlZGlyZWN0IHRoZSB1c2VyIHRvIGB3aW5kb3cubG9jYXRpb24uaHJlZmAuXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBsb2dvdXRSZWRpcmVjdChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dvdXRSZWRpcmVjdChsb2dvdXRSZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIGxvY2FsIGNhY2hlIGZvciB0aGUgY3VycmVudCB1c2VyIHRoZW4gb3BlbnMgYSBwb3B1cCB3aW5kb3cgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHNpZ24tb3V0IG9mIHRoZSBzZXJ2ZXJcclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGxvZ291dFBvcHVwKGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dFBvcHVwKGxvZ291dFJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgYSBoaWRkZW4gaWZyYW1lIHRvIGZldGNoIGFuIGF1dGhvcml6YXRpb24gY29kZSBmcm9tIHRoZSBlU1RTLiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBtYXkgbm90IHdvcms6XHJcbiAgICAgKiAtIEFueSBicm93c2VyIHVzaW5nIGEgZm9ybSBvZiBJbnRlbGxpZ2VudCBUcmFja2luZyBQcmV2ZW50aW9uXHJcbiAgICAgKiAtIElmIHRoZXJlIGlzIG5vdCBhbiBlc3RhYmxpc2hlZCBzZXNzaW9uIHdpdGggdGhlIHNlcnZpY2VcclxuICAgICAqXHJcbiAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhlIHJlcXVlc3QgbXVzdCBiZSBkb25lIGluc2lkZSBhIHBvcHVwIG9yIGZ1bGwgZnJhbWUgcmVkaXJlY3QuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIHRoZSBjYXNlcyB3aGVyZSBpbnRlcmFjdGlvbiBpcyByZXF1aXJlZCwgeW91IGNhbm5vdCBzZW5kIGEgcmVxdWVzdCB3aXRoIHByb21wdD1ub25lLlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdXIgcmVmcmVzaCB0b2tlbiBoYXMgZXhwaXJlZCwgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBmZXRjaCBhIG5ldyBzZXQgb2YgdG9rZW5zIHNpbGVudGx5IGFzIGxvbmcgYXNcclxuICAgICAqIHlvdSBzZXNzaW9uIG9uIHRoZSBzZXJ2ZXIgc3RpbGwgZXhpc3RzLlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3Qge0BsaW5rIFNzb1NpbGVudFJlcXVlc3R9XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLlxyXG4gICAgICovXHJcbiAgICBzc29TaWxlbnQocmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuc3NvU2lsZW50KHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0b2tlbiBjYWNoZSBmb3IgdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBnZXRUb2tlbkNhY2hlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0VG9rZW5DYWNoZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsb2dnZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgZ2V0TG9nZ2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0TG9nZ2VyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlciBzZXQgaW4gY29uZmlndXJhdGlvbnMgd2l0aCBuZXcgTG9nZ2VyIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25zXHJcbiAgICAgKiBAcGFyYW0gbG9nZ2VyIExvZ2dlciBpbnN0YW5jZVxyXG4gICAgICovXHJcbiAgICBzZXRMb2dnZXIobG9nZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldExvZ2dlcihsb2dnZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhY2NvdW50IHRvIHVzZSBhcyB0aGUgYWN0aXZlIGFjY291bnQuIElmIG5vIGFjY291bnQgaXMgcGFzc2VkIHRvIHRoZSBhY3F1aXJlVG9rZW4gQVBJcywgdGhlbiBNU0FMIHdpbGwgdXNlIHRoaXMgYWN0aXZlIGFjY291bnQuXHJcbiAgICAgKiBAcGFyYW0gYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmVBY2NvdW50KGFjY291bnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlQWNjb3VudChhY2NvdW50KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2NvdW50XHJcbiAgICAgKi9cclxuICAgIGdldEFjdGl2ZUFjY291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY3RpdmVBY2NvdW50KCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSB3cmFwcGVyIGxpYnJhcmllcyAoQW5ndWxhciAmIFJlYWN0KSB0byBzZXQgU0tVIGFuZCBWZXJzaW9uIHBhc3NlZCBkb3duIHRvIHRlbGVtZXRyeSwgbG9nZ2VyLCBldGMuXHJcbiAgICAgKiBAcGFyYW0gc2t1XHJcbiAgICAgKiBAcGFyYW0gdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplV3JhcHBlckxpYnJhcnkoc2t1LCB2ZXJzaW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pbml0aWFsaXplV3JhcHBlckxpYnJhcnkoc2t1LCB2ZXJzaW9uKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBuYXZpZ2F0aW9uIGNsaWVudFxyXG4gICAgICogQHBhcmFtIG5hdmlnYXRpb25DbGllbnRcclxuICAgICAqL1xyXG4gICAgc2V0TmF2aWdhdGlvbkNsaWVudChuYXZpZ2F0aW9uQ2xpZW50KSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldE5hdmlnYXRpb25DbGllbnQobmF2aWdhdGlvbkNsaWVudCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZ2V0Q29uZmlndXJhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldENvbmZpZ3VyYXRpb24oKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSHlkcmF0ZXMgY2FjaGUgd2l0aCB0aGUgdG9rZW5zIGFuZCBhY2NvdW50IGluIHRoZSBBdXRoZW50aWNhdGlvblJlc3VsdCBvYmplY3RcclxuICAgICAqIEBwYXJhbSByZXN1bHRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC0gVGhlIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2FzIHVzZWQgdG8gb2J0YWluIHRoZSBBdXRoZW50aWNhdGlvblJlc3VsdFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaHlkcmF0ZUNhY2hlKHJlc3VsdCwgcmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaHlkcmF0ZUNhY2hlKHJlc3VsdCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0b2tlbnMgYW5kIGFjY291bnQgZnJvbSB0aGUgYnJvd3NlciBjYWNoZS5cclxuICAgICAqIEBwYXJhbSBsb2dvdXRSZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ2FjaGUobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuY2xlYXJDYWNoZShsb2dvdXRSZXF1ZXN0KTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogY3JlYXRlcyBOZXN0ZWRBcHBBdXRoQ29udHJvbGxlciBhbmQgcGFzc2VzIGl0IHRvIHRoZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbixcclxuICogZmFsbHMgYmFjayB0byBTdGFuZGFyZENvbnRyb2xsZXIgaWYgTmVzdGVkQXBwQXV0aENvbnRyb2xsZXIgaXMgbm90IGF2YWlsYWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0gY29uZmlndXJhdGlvblxyXG4gKiBAcmV0dXJucyBJUHVibGljQ2xpZW50QXBwbGljYXRpb25cclxuICpcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5lc3RhYmxlUHVibGljQ2xpZW50QXBwbGljYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgY29uc3QgbmVzdGVkQXBwQXV0aCA9IG5ldyBOZXN0ZWRBcHBPcGVyYXRpbmdDb250ZXh0KGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgYXdhaXQgbmVzdGVkQXBwQXV0aC5pbml0aWFsaXplKCk7XHJcbiAgICBpZiAobmVzdGVkQXBwQXV0aC5pc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBOZXN0ZWRBcHBBdXRoQ29udHJvbGxlcihuZXN0ZWRBcHBBdXRoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uKGNvbmZpZ3VyYXRpb24sIGNvbnRyb2xsZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZVN0YW5kYXJkUHVibGljQ2xpZW50QXBwbGljYXRpb24oY29uZmlndXJhdGlvbik7XHJcbn1cclxuLyoqXHJcbiAqIGNyZWF0ZXMgUHVibGljQ2xpZW50QXBwbGljYXRpb24gdXNpbmcgU3RhbmRhcmRDb250cm9sbGVyXHJcbiAqXHJcbiAqIEBwYXJhbSBjb25maWd1cmF0aW9uXHJcbiAqIEByZXR1cm5zIElQdWJsaWNDbGllbnRBcHBsaWNhdGlvblxyXG4gKlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbihjb25maWd1cmF0aW9uKSB7XHJcbiAgICBjb25zdCBwY2EgPSBuZXcgUHVibGljQ2xpZW50QXBwbGljYXRpb24oY29uZmlndXJhdGlvbik7XHJcbiAgICBhd2FpdCBwY2EuaW5pdGlhbGl6ZSgpO1xyXG4gICAgcmV0dXJuIHBjYTtcclxufVxuXG5leHBvcnQgeyBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiwgY3JlYXRlTmVzdGFibGVQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiwgY3JlYXRlU3RhbmRhcmRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHVibGljQ2xpZW50QXBwbGljYXRpb24ubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBERUZBVUxUX0NSWVBUT19JTVBMRU1FTlRBVElPTiB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IEJyb3dzZXJDYWNoZU1hbmFnZXIsIERFRkFVTFRfQlJPV1NFUl9DQUNIRV9NQU5BR0VSIH0gZnJvbSAnLi4vY2FjaGUvQnJvd3NlckNhY2hlTWFuYWdlci5tanMnO1xuaW1wb3J0IHsgQ3J5cHRvT3BzIH0gZnJvbSAnLi4vY3J5cHRvL0NyeXB0b09wcy5tanMnO1xuaW1wb3J0IHsgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUsIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50IH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVW5rbm93bk9wZXJhdGluZ0NvbnRleHRDb250cm9sbGVyIGNsYXNzXHJcbiAqXHJcbiAqIC0gVW50aWwgaW5pdGlhbGl6ZSBtZXRob2QgaXMgY2FsbGVkLCB0aGlzIGNvbnRyb2xsZXIgaXMgdGhlIGRlZmF1bHRcclxuICogLSBBRnRlciBpbml0aWFsaXplIG1ldGhvZCBpcyBjYWxsZWQsIHRoaXMgY29udHJvbGxlciB3aWxsIGJlIHN3YXBwZWQgb3V0IGZvciB0aGUgYXBwcm9wcmlhdGUgY29udHJvbGxlclxyXG4gKiBpZiB0aGUgb3BlcmF0aW5nIGNvbnRleHQgY2FuIGJlIGRldGVybWluZWQ7IG90aGVyd2lzZSB0aGlzIGNvbnRyb2xsZXIgd2lsbCBjb250aW51ZWQgYmUgdXNlZFxyXG4gKlxyXG4gKiAtIFdoeSBkbyB3ZSBoYXZlIHRoaXM/ICBXZSBkb24ndCB3YW50IHRvIGR5bmFtaWNhbGx5IGltcG9ydCAoZG93bmxvYWQpIGFsbCBvZiB0aGUgY29kZSBpbiBTdGFuZGFyZENvbnRyb2xsZXIgaWYgd2UgZG9uJ3QgbmVlZCB0by5cclxuICpcclxuICogLSBPbmx5IGluY2x1ZGVzIGltcGxlbWVudGF0aW9uIGZvciBnZXRBY2NvdW50cyBhbmQgaGFuZGxlUmVkaXJlY3RQcm9taXNlXHJcbiAqICAgLSBBbGwgb3RoZXIgbWV0aG9kcyBhcmUgd2lsbCB0aHJvdyBpbml0aWFsaXphdGlvbiBlcnJvciAoYmVjYXVzZSBlaXRoZXIgaW5pdGlhbGl6ZSBtZXRob2Qgb3IgdGhlIGZhY3RvcnkgbWV0aG9kIHdlcmUgbm90IHVzZWQpXHJcbiAqICAgLSBUaGlzIGNvbnRyb2xsZXIgaXMgbmVjZXNzYXJ5IGZvciBSZWFjdCBOYXRpdmUgd3JhcHBlciwgc2VydmVyIHNpZGUgcmVuZGVyaW5nIGFuZCBhbnkgb3RoZXIgc2NlbmFyaW8gd2hlcmUgd2UgZG9uJ3QgaGF2ZSBhIERPTVxyXG4gKlxyXG4gKi9cclxuY2xhc3MgVW5rbm93bk9wZXJhdGluZ0NvbnRleHRDb250cm9sbGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wZXJhdGluZ0NvbnRleHQpIHtcclxuICAgICAgICAvLyBGbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgaW5pdGlhbGl6ZSBBUEkgaGFzIGJlZW4gY2FsbGVkIGFuZCBjb21wbGV0ZWRcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcGVyYXRpbmdDb250ZXh0ID0gb3BlcmF0aW5nQ29udGV4dDtcclxuICAgICAgICB0aGlzLmlzQnJvd3NlckVudmlyb25tZW50ID1cclxuICAgICAgICAgICAgdGhpcy5vcGVyYXRpbmdDb250ZXh0LmlzQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSBvcGVyYXRpbmdDb250ZXh0LmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3BlcmF0aW5nQ29udGV4dC5nZXRMb2dnZXIoKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHBlcmZvcm1hbmNlIGNsaWVudFxyXG4gICAgICAgIHRoaXMucGVyZm9ybWFuY2VDbGllbnQgPSB0aGlzLmNvbmZpZy50ZWxlbWV0cnkuY2xpZW50O1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNyeXB0byBjbGFzcy5cclxuICAgICAgICB0aGlzLmJyb3dzZXJDcnlwdG8gPSB0aGlzLmlzQnJvd3NlckVudmlyb25tZW50XHJcbiAgICAgICAgICAgID8gbmV3IENyeXB0b09wcyh0aGlzLmxvZ2dlciwgdGhpcy5wZXJmb3JtYW5jZUNsaWVudClcclxuICAgICAgICAgICAgOiBERUZBVUxUX0NSWVBUT19JTVBMRU1FTlRBVElPTjtcclxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBicm93c2VyIHN0b3JhZ2UgY2xhc3MuXHJcbiAgICAgICAgdGhpcy5icm93c2VyU3RvcmFnZSA9IHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnRcclxuICAgICAgICAgICAgPyBuZXcgQnJvd3NlckNhY2hlTWFuYWdlcih0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLCB0aGlzLmNvbmZpZy5jYWNoZSwgdGhpcy5icm93c2VyQ3J5cHRvLCB0aGlzLmxvZ2dlciwgdW5kZWZpbmVkLCB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KVxyXG4gICAgICAgICAgICA6IERFRkFVTFRfQlJPV1NFUl9DQUNIRV9NQU5BR0VSKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsIHRoaXMubG9nZ2VyKTtcclxuICAgIH1cclxuICAgIGdldEJyb3dzZXJTdG9yYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgZ2V0QWNjb3VudChhY2NvdW50RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBnZXRBY2NvdW50QnlIb21lSWQoaG9tZUFjY291bnRJZCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgZ2V0QWNjb3VudEJ5TG9jYWxJZChsb2NhbEFjY291bnRJZCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlcm5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGdldEFsbEFjY291bnRzKCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWNxdWlyZVRva2VuUG9wdXAocmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWNxdWlyZVRva2VuUmVkaXJlY3QocmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgYWNxdWlyZVRva2VuU2lsZW50KFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2lsZW50UmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgYWNxdWlyZVRva2VuQnlDb2RlKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgYWNxdWlyZVRva2VuTmF0aXZlKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcmVxdWVzdCwgXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhcGlJZCwgXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhY2NvdW50SWQpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgY29tbW9uUmVxdWVzdCwgXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBzaWxlbnRSZXF1ZXN0KSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBhZGRFdmVudENhbGxiYWNrKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgY2FsbGJhY2ssIFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgZXZlbnRUeXBlcykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlRXZlbnRDYWxsYmFjayhcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGNhbGxiYWNrSWQpIHsgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICByZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrSWQpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlQWNjb3VudFN0b3JhZ2VFdmVudHMoKSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgIH1cclxuICAgIGRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG4gICAgaGFuZGxlUmVkaXJlY3RQcm9taXNlKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgaGFzaCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcbiAgICBsb2dpblBvcHVwKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgbG9naW5SZWRpcmVjdChyZXF1ZXN0KSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBsb2dvdXQobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgbG9nb3V0UmVkaXJlY3QoXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBsb2dvdXRQb3B1cChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIHNzb1NpbGVudChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHJlcXVlc3QpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGdldFRva2VuQ2FjaGUoKSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBnZXRMb2dnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2V0TG9nZ2VyKGxvZ2dlcikge1xyXG4gICAgICAgIGJsb2NrQVBJQ2FsbHNCZWZvcmVJbml0aWFsaXplKHRoaXMuaW5pdGlhbGl6ZWQpO1xyXG4gICAgICAgIGJsb2NrTm9uQnJvd3NlckVudmlyb25tZW50KCk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBzZXRBY3RpdmVBY2NvdW50KGFjY291bnQpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0QWN0aXZlQWNjb3VudCgpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KHNrdSwgdmVyc2lvbikge1xyXG4gICAgICAgIHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0V3JhcHBlck1ldGFkYXRhKHNrdSwgdmVyc2lvbik7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBzZXROYXZpZ2F0aW9uQ2xpZW50KG5hdmlnYXRpb25DbGllbnQpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0Q29uZmlndXJhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgICB9XHJcbiAgICBpc0Jyb3dzZXJFbnYoKSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGdldEJyb3dzZXJDcnlwdG8oKSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBnZXRQZXJmb3JtYW5jZUNsaWVudCgpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGdldFJlZGlyZWN0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemUodGhpcy5pbml0aWFsaXplZCk7XHJcbiAgICAgICAgYmxvY2tOb25Ccm93c2VyRW52aXJvbm1lbnQoKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBhc3luYyBjbGVhckNhY2hlKGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYXN5bmMgaHlkcmF0ZUNhY2hlKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcmVzdWx0LCBcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHJlcXVlc3QpIHtcclxuICAgICAgICBibG9ja0FQSUNhbGxzQmVmb3JlSW5pdGlhbGl6ZSh0aGlzLmluaXRpYWxpemVkKTtcclxuICAgICAgICBibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFVua25vd25PcGVyYXRpbmdDb250ZXh0Q29udHJvbGxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5rbm93bk9wZXJhdGluZ0NvbnRleHRDb250cm9sbGVyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQmFzZU9wZXJhdGluZ0NvbnRleHQgfSBmcm9tICcuL0Jhc2VPcGVyYXRpbmdDb250ZXh0Lm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBVbmtub3duT3BlcmF0aW5nQ29udGV4dCBleHRlbmRzIEJhc2VPcGVyYXRpbmdDb250ZXh0IHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgb3BlcmF0aW5nIGNvbnRleHRcclxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBnZXRJZCgpIHtcclxuICAgICAgICByZXR1cm4gVW5rbm93bk9wZXJhdGluZ0NvbnRleHQuSUQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0aGUgbW9kdWxlIG5hbWUuICBJbnRlbmRlZCBmb3IgdXNlIHdpdGggaW1wb3J0KCkgdG8gZW5hYmxlIGR5bmFtaWMgaW1wb3J0XHJcbiAgICAgKiBvZiB0aGUgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmF0aW5nIGNvbnRleHRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGdldE1vZHVsZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIFVua25vd25PcGVyYXRpbmdDb250ZXh0Lk1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgb3BlcmF0aW5nIGNvbnRleHQgaXMgYXZhaWxhYmxlLlxyXG4gICAgICogQ29uZmlybXMgdGhhdCB0aGUgY29kZSBpcyBydW5uaW5nIGEgYnJvd3NlciByYXRoZXIuICBUaGlzIGlzIHJlcXVpcmVkLlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxib29sZWFuPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBvcGVyYXRpbmcgY29udGV4dCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgb3BlcmF0aW5nIGNvbnRleHQgaXMgaW4gdXNlIHdoZW4gd2UgaGF2ZSBub3QgY2hlY2tlZCBmb3Igd2hhdCB0aGUgb3BlcmF0aW5nIGNvbnRleHQgaXMuXHJcbiAgICAgICAgICogVGhlIGNvbnRleHQgaXMgdW5rbm93biB1bnRpbCB3ZSBjaGVjayBpdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxufVxyXG4vKlxyXG4gKiBUT0RPOiBPbmNlIHdlIGhhdmUgZGV0ZXJtaW5lIHRoZSBidW5kbGluZyBjb2RlIHJldHVybiBoZXJlIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZVxyXG4gKiBjb250YWluaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBvcGVyYXRpbmcgY29udGV4dFxyXG4gKi9cclxuVW5rbm93bk9wZXJhdGluZ0NvbnRleHQuTU9EVUxFX05BTUUgPSBcIlwiO1xyXG4vKipcclxuICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcGVyYXRpbmcgY29udGV4dFxyXG4gKi9cclxuVW5rbm93bk9wZXJhdGluZ0NvbnRleHQuSUQgPSBcIlVua25vd25PcGVyYXRpbmdDb250ZXh0XCI7XG5cbmV4cG9ydCB7IFVua25vd25PcGVyYXRpbmdDb250ZXh0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Vbmtub3duT3BlcmF0aW5nQ29udGV4dC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVycy9Db250cm9sbGVyRmFjdG9yeS5tanMnO1xuaW1wb3J0IHsgVW5rbm93bk9wZXJhdGluZ0NvbnRleHRDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlcnMvVW5rbm93bk9wZXJhdGluZ0NvbnRleHRDb250cm9sbGVyLm1qcyc7XG5pbXBvcnQgeyBVbmtub3duT3BlcmF0aW5nQ29udGV4dCB9IGZyb20gJy4uL29wZXJhdGluZ2NvbnRleHQvVW5rbm93bk9wZXJhdGluZ0NvbnRleHQubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQdWJsaWNDbGllbnROZXh0IGlzIGFuIGVhcmx5IGxvb2sgYXQgdGhlIHBsYW5uZWQgaW1wbGVtZW50YXRpb24gb2YgUHVibGljQ2xpZW50QXBwbGljYXRpb24gaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBNU0FMLmpzLlxyXG4gKiBJdCBjb250YWlucyBzdXBwb3J0IGZvciBtdWx0aXBsZSBBUEkgaW1wbGVtZW50YXRpb25zIGJhc2VkIG9uIHRoZSBydW50aW1lIGVudmlyb25tZW50IHRoYXQgaXQgaXMgcnVubmluZyBpbi5cclxuICpcclxuICogVGhlIGdvYWxzIG9mIHRoZXNlIGNoYW5nZXMgYXJlIHRvIHByb3ZpZGUgYSBjbGVhbiBzZXBhcmF0aW9uIG9mIGJlaGF2aW9yIGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBjb250ZXh0cyAoTmVzdGVkIEFwcCBBdXRoLCBQbGF0Zm9ybSBCcm9rZXJzLCBQbGFpbiBvbGQgQnJvd3NlciwgZXRjLilcclxuICogd2hpbGUgc3RpbGwgcHJvdmlkaW5nIGEgY29uc2lzdGVudCBBUEkgc3VyZmFjZSBmb3IgZGV2ZWxvcGVycy5cclxuICpcclxuICogUGxlYXNlIHVzZSBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBmb3IgYW55IHByb2QvcmVhbC13b3JsZCBzY2VuYXJpb3MuXHJcbiAqIE5vdGU6IFB1YmxpY0NsaWVudE5leHQgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGJyZWFraW5nIGNoYW5nZXMgd2l0aG91dCBmb2xsb3dpbmcgc2VtdmVyXHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBQdWJsaWNDbGllbnROZXh0IHtcclxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGVQdWJsaWNDbGllbnRBcHBsaWNhdGlvbihjb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IGF3YWl0IGNyZWF0ZUNvbnRyb2xsZXIoY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgbGV0IHBjYTtcclxuICAgICAgICBpZiAoY29udHJvbGxlciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwY2EgPSBuZXcgUHVibGljQ2xpZW50TmV4dChjb25maWd1cmF0aW9uLCBjb250cm9sbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBjYSA9IG5ldyBQdWJsaWNDbGllbnROZXh0KGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGNhO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgUHVibGljQ2xpZW50TmV4dCB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBQdWJsaWNDbGllbnROZXh0IG9iamVjdFxyXG4gICAgICpcclxuICAgICAqIEltcG9ydGFudCBhdHRyaWJ1dGVzIGluIHRoZSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYXV0aCBhcmU6XHJcbiAgICAgKiAtIGNsaWVudElEOiB0aGUgYXBwbGljYXRpb24gSUQgb2YgeW91ciBhcHBsaWNhdGlvbi4gWW91IGNhbiBvYnRhaW4gb25lIGJ5IHJlZ2lzdGVyaW5nIHlvdXIgYXBwbGljYXRpb24gd2l0aCBvdXIgQXBwbGljYXRpb24gcmVnaXN0cmF0aW9uIHBvcnRhbCA6IGh0dHBzOi8vcG9ydGFsLmF6dXJlLmNvbS8jYmxhZGUvTWljcm9zb2Z0X0FBRF9JQU0vQWN0aXZlRGlyZWN0b3J5TWVudUJsYWRlL1JlZ2lzdGVyZWRBcHBzUHJldmlld1xyXG4gICAgICogLSBhdXRob3JpdHk6IHRoZSBhdXRob3JpdHkgVVJMIGZvciB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gICAgICogLSByZWRpcmVjdF91cmk6IHRoZSB1cmkgb2YgeW91ciBhcHBsaWNhdGlvbiByZWdpc3RlcmVkIGluIHRoZSBwb3J0YWwuXHJcbiAgICAgKlxyXG4gICAgICogSW4gQXp1cmUgQUQsIGF1dGhvcml0eSBpcyBhIFVSTCBpbmRpY2F0aW5nIHRoZSBBenVyZSBhY3RpdmUgZGlyZWN0b3J5IHRoYXQgTVNBTCB1c2VzIHRvIG9idGFpbiB0b2tlbnMuXHJcbiAgICAgKiBJdCBpcyBvZiB0aGUgZm9ybSBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20ve0VudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlfVxyXG4gICAgICogSWYgeW91ciBhcHBsaWNhdGlvbiBzdXBwb3J0cyBBY2NvdW50cyBpbiBvbmUgb3JnYW5pemF0aW9uYWwgZGlyZWN0b3J5LCByZXBsYWNlIFwiRW50ZXJfdGhlX1RlbmFudF9JbmZvX0hlcmVcIiB2YWx1ZSB3aXRoIHRoZSBUZW5hbnQgSWQgb3IgVGVuYW50IG5hbWUgKGZvciBleGFtcGxlLCBjb250b3NvLm1pY3Jvc29mdC5jb20pLlxyXG4gICAgICogSWYgeW91ciBhcHBsaWNhdGlvbiBzdXBwb3J0cyBBY2NvdW50cyBpbiBhbnkgb3JnYW5pemF0aW9uYWwgZGlyZWN0b3J5LCByZXBsYWNlIFwiRW50ZXJfdGhlX1RlbmFudF9JbmZvX0hlcmVcIiB2YWx1ZSB3aXRoIG9yZ2FuaXphdGlvbnMuXHJcbiAgICAgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHN1cHBvcnRzIEFjY291bnRzIGluIGFueSBvcmdhbml6YXRpb25hbCBkaXJlY3RvcnkgYW5kIHBlcnNvbmFsIE1pY3Jvc29mdCBhY2NvdW50cywgcmVwbGFjZSBcIkVudGVyX3RoZV9UZW5hbnRfSW5mb19IZXJlXCIgdmFsdWUgd2l0aCBjb21tb24uXHJcbiAgICAgKiBUbyByZXN0cmljdCBzdXBwb3J0IHRvIFBlcnNvbmFsIE1pY3Jvc29mdCBhY2NvdW50cyBvbmx5LCByZXBsYWNlIFwiRW50ZXJfdGhlX1RlbmFudF9JbmZvX0hlcmVcIiB2YWx1ZSB3aXRoIGNvbnN1bWVycy5cclxuICAgICAqXHJcbiAgICAgKiBJbiBBenVyZSBCMkMsIGF1dGhvcml0eSBpcyBvZiB0aGUgZm9ybSBodHRwczovL3tpbnN0YW5jZX0vdGZwL3t0ZW5hbnR9L3twb2xpY3lOYW1lfS9cclxuICAgICAqIEZ1bGwgQjJDIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhpcyBsaWJyYXJ5IGluIGZ1dHVyZSB2ZXJzaW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBPYmplY3QgZm9yIHRoZSBNU0FMIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gSUNvbnRyb2xsZXIgT3B0aW9uYWwgcGFyYW1ldGVyIHRvIGV4cGxpY3RseSBzZXQgdGhlIGNvbnRyb2xsZXIuIChXaWxsIGJlIHJlbW92ZWQgd2hlbiB3ZSByZW1vdmUgcHVibGljIGNvbnN0cnVjdG9yKVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uLCBjb250cm9sbGVyKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgICAgICBpZiAoY29udHJvbGxlcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW5nQ29udGV4dCA9IG5ldyBVbmtub3duT3BlcmF0aW5nQ29udGV4dChjb25maWd1cmF0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IFVua25vd25PcGVyYXRpbmdDb250ZXh0Q29udHJvbGxlcihvcGVyYXRpbmdDb250ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYXN5bmMgc3RhcnR1cCB0YXNrcyBzdWNoIGFzIGNvbm5lY3RpbmcgdG8gV0FNIGV4dGVuc2lvblxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIgaW5zdGFuY2VvZiBVbmtub3duT3BlcmF0aW5nQ29udGV4dENvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29udHJvbGxlcih0aGlzLmNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHdoZW4geW91IHdhbnQgdG8gb2J0YWluIGFuIGFjY2Vzc190b2tlbiBmb3IgeW91ciBBUEkgdmlhIG9wZW5pbmcgYSBwb3B1cCB3aW5kb3cgaW4gdGhlIHVzZXIncyBicm93c2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHJlcXVlc3RcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIHdhcyByYWlzZWQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFjcXVpcmVUb2tlblBvcHVwKHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblBvcHVwKHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2Ugd2hlbiB5b3Ugd2FudCB0byBvYnRhaW4gYW4gYWNjZXNzX3Rva2VuIGZvciB5b3VyIEFQSSBieSByZWRpcmVjdGluZyB0aGUgdXNlcidzIGJyb3dzZXIgd2luZG93IHRvIHRoZSBhdXRob3JpemF0aW9uIGVuZHBvaW50LiBUaGlzIGZ1bmN0aW9uIHJlZGlyZWN0c1xyXG4gICAgICogdGhlIHBhZ2UsIHNvIGFueSBjb2RlIHRoYXQgZm9sbG93cyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGV4ZWN1dGUuXHJcbiAgICAgKlxyXG4gICAgICogSU1QT1JUQU5UOiBJdCBpcyBOT1QgcmVjb21tZW5kZWQgdG8gaGF2ZSBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmF2aWdhdGUgYXdheSBmcm9tIHRoZSBjdXJyZW50XHJcbiAgICAgKiBicm93c2VyIHdpbmRvdy4gSXQgY3VycmVudGx5IHJldHVybnMgYSBQcm9taXNlIGluIG9yZGVyIHRvIHJlZmxlY3QgdGhlIGFzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhlIGNvZGUgcnVubmluZyBpbiB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGFjcXVpcmVUb2tlblJlZGlyZWN0KHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblJlZGlyZWN0KHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTaWxlbnRseSBhY3F1aXJlIGFuIGFjY2VzcyB0b2tlbiBmb3IgYSBnaXZlbiBzZXQgb2Ygc2NvcGVzLiBSZXR1cm5zIGN1cnJlbnRseSBwcm9jZXNzaW5nIHByb21pc2UgaWYgcGFyYWxsZWwgcmVxdWVzdHMgYXJlIG1hZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtAbGluayAoU2lsZW50UmVxdWVzdDp0eXBlKX1cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjxBdXRoZW50aWNhdGlvblJlc3VsdD59IC0gYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLiBSZXR1cm5zIHRoZSB7QGxpbmsgQXV0aGVudGljYXRpb25SZXN1bHR9IG9iamVjdFxyXG4gICAgICovXHJcbiAgICBhY3F1aXJlVG9rZW5TaWxlbnQoc2lsZW50UmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuYWNxdWlyZVRva2VuU2lsZW50KHNpbGVudFJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJlZGVlbXMgYW4gYXV0aG9yaXphdGlvbiBjb2RlIChwYXNzZWQgYXMgY29kZSkgZnJvbSB0aGUgZVNUUyB0b2tlbiBlbmRwb2ludC5cclxuICAgICAqIFRoaXMgYXV0aG9yaXphdGlvbiBjb2RlIHNob3VsZCBiZSBhY3F1aXJlZCBzZXJ2ZXItc2lkZSB1c2luZyBhIGNvbmZpZGVudGlhbCBjbGllbnQgdG8gYWNxdWlyZSBhIHNwYV9jb2RlLlxyXG4gICAgICogVGhpcyBBUEkgaXMgbm90IGluZGVuZGVkIGZvciBub3JtYWwgYXV0aG9yaXphdGlvbiBjb2RlIGFjcXVpc2l0aW9uIGFuZCByZWRlbXB0aW9uLlxyXG4gICAgICpcclxuICAgICAqIFJlZGVtcHRpb24gb2YgdGhpcyBhdXRob3JpemF0aW9uIGNvZGUgd2lsbCBub3QgcmVxdWlyZSBQS0NFLCBhcyBpdCB3YXMgYWNxdWlyZWQgYnkgYSBjb25maWRlbnRpYWwgY2xpZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IHtAbGluayBBdXRob3JpemF0aW9uQ29kZVJlcXVlc3R9XHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIG9yIHJlamVjdGVkIGlmIGFuIGVycm9yIHdhcyByYWlzZWQuXHJcbiAgICAgKi9cclxuICAgIGFjcXVpcmVUb2tlbkJ5Q29kZShyZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5CeUNvZGUocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgZXZlbnQgY2FsbGJhY2tzIHRvIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgYWRkRXZlbnRDYWxsYmFjayhjYWxsYmFjaywgZXZlbnRUeXBlcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkRXZlbnRDYWxsYmFjayhjYWxsYmFjaywgZXZlbnRUeXBlcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgY2FsbGJhY2sgd2l0aCBwcm92aWRlZCBpZCBmcm9tIGNhbGxiYWNrIGFycmF5XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tJZFxyXG4gICAgICovXHJcbiAgICByZW1vdmVFdmVudENhbGxiYWNrKGNhbGxiYWNrSWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnJlbW92ZUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgcGVyZm9ybWFuY2UgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGVyZm9ybWFuY2VDYWxsYmFja0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggYWRkUGVyZm9ybWFuY2VDYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tJZFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soY2FsbGJhY2tJZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIucmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFja0lkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBldmVudCBsaXN0ZW5lciB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW4gYSB1c2VyIGFjY291bnQgaXMgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGxvY2Fsc3RvcmFnZSBpbiBhIGRpZmZlcmVudCBicm93c2VyIHRhYiBvciB3aW5kb3dcclxuICAgICAqL1xyXG4gICAgZW5hYmxlQWNjb3VudFN0b3JhZ2VFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgZXZlbnQgbGlzdGVuZXIgdGhhdCBlbWl0cyBhbiBldmVudCB3aGVuIGEgdXNlciBhY2NvdW50IGlzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBsb2NhbHN0b3JhZ2UgaW4gYSBkaWZmZXJlbnQgYnJvd3NlciB0YWIgb3Igd2luZG93XHJcbiAgICAgKi9cclxuICAgIGRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGFjY291bnQgZm91bmQgaW4gdGhlIGNhY2hlIHRoYXQgbWF0Y2hlcyB0aGUgYWNjb3VudCBmaWx0ZXIgcGFzc2VkIGluLlxyXG4gICAgICogQHBhcmFtIGFjY291bnRGaWx0ZXJcclxuICAgICAqIEByZXR1cm5zIFRoZSBmaXJzdCBhY2NvdW50IGZvdW5kIGluIHRoZSBjYWNoZSBtYXRjaGluZyB0aGUgcHJvdmlkZWQgZmlsdGVyIG9yIG51bGwgaWYgbm8gYWNjb3VudCBjb3VsZCBiZSBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudChhY2NvdW50RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50KGFjY291bnRGaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaW4gYWNjb3VudCBtYXRjaGluZyBob21lQWNjb3VudElkLlxyXG4gICAgICogKHRoZSBhY2NvdW50IG9iamVjdCBpcyBjcmVhdGVkIGF0IHRoZSB0aW1lIG9mIHN1Y2Nlc3NmdWwgbG9naW4pXHJcbiAgICAgKiBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgYWNjb3VudCBpcyBmb3VuZFxyXG4gICAgICogQHBhcmFtIGhvbWVBY2NvdW50SWRcclxuICAgICAqIEByZXR1cm5zIFRoZSBhY2NvdW50IG9iamVjdCBzdG9yZWQgaW4gTVNBTFxyXG4gICAgICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0QWNjb3VudCBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIGdldEFjY291bnRCeUhvbWVJZChob21lQWNjb3VudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50QnlIb21lSWQoaG9tZUFjY291bnRJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBpbiBhY2NvdW50IG1hdGNoaW5nIGxvY2FsQWNjb3VudElkLlxyXG4gICAgICogKHRoZSBhY2NvdW50IG9iamVjdCBpcyBjcmVhdGVkIGF0IHRoZSB0aW1lIG9mIHN1Y2Nlc3NmdWwgbG9naW4pXHJcbiAgICAgKiBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgYWNjb3VudCBpcyBmb3VuZFxyXG4gICAgICogQHBhcmFtIGxvY2FsQWNjb3VudElkXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjb3VudCBvYmplY3Qgc3RvcmVkIGluIE1TQUxcclxuICAgICAqIEBkZXByZWNhdGVkIC0gVXNlIGdldEFjY291bnQgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBnZXRBY2NvdW50QnlMb2NhbElkKGxvY2FsSWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUxvY2FsSWQobG9jYWxJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBpbiBhY2NvdW50IG1hdGNoaW5nIHVzZXJuYW1lLlxyXG4gICAgICogKHRoZSBhY2NvdW50IG9iamVjdCBpcyBjcmVhdGVkIGF0IHRoZSB0aW1lIG9mIHN1Y2Nlc3NmdWwgbG9naW4pXHJcbiAgICAgKiBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgYWNjb3VudCBpcyBmb3VuZC5cclxuICAgICAqIFRoaXMgQVBJIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSBidXQgZ2V0QWNjb3VudEJ5SWQgc2hvdWxkIGJlIHVzZWQgZm9yIGJlc3QgcmVsaWFiaWxpdHlcclxuICAgICAqIEBwYXJhbSB1c2VyTmFtZVxyXG4gICAgICogQHJldHVybnMgVGhlIGFjY291bnQgb2JqZWN0IHN0b3JlZCBpbiBNU0FMXHJcbiAgICAgKiBAZGVwcmVjYXRlZCAtIFVzZSBnZXRBY2NvdW50IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgZ2V0QWNjb3VudEJ5VXNlcm5hbWUodXNlck5hbWUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeVVzZXJuYW1lKHVzZXJOYW1lKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgdGhlIGFjY291bnRzIGluIHRoZSBjYWNoZSB0aGF0IG1hdGNoIHRoZSBvcHRpb25hbCBmaWx0ZXIuIElmIG5vIGZpbHRlciBpcyBwcm92aWRlZCwgYWxsIGFjY291bnRzIGFyZSByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSBhY2NvdW50RmlsdGVyIC0gKE9wdGlvbmFsKSBmaWx0ZXIgdG8gbmFycm93IGRvd24gdGhlIGFjY291bnRzIHJldHVybmVkXHJcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBBY2NvdW50SW5mbyBvYmplY3RzIGluIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIGdldEFsbEFjY291bnRzKGFjY291bnRGaWx0ZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFsbEFjY291bnRzKGFjY291bnRGaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uIHdoaWNoIGFsbG93cyB1c2VycyB0byBmaXJlIGV2ZW50cyBhZnRlciB0aGUgUHVibGljQ2xpZW50QXBwbGljYXRpb24gb2JqZWN0XHJcbiAgICAgKiBoYXMgbG9hZGVkIGR1cmluZyByZWRpcmVjdCBmbG93cy4gVGhpcyBzaG91bGQgYmUgaW52b2tlZCBvbiBhbGwgcGFnZSBsb2FkcyBpbnZvbHZlZCBpbiByZWRpcmVjdFxyXG4gICAgICogYXV0aCBmbG93cy5cclxuICAgICAqIEBwYXJhbSBoYXNoIEhhc2ggdG8gcHJvY2Vzcy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygd2luZG93LmxvY2F0aW9uLmhhc2guIE9ubHkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgZXhwbGljaXRseSBpZiB0aGUgcmVzcG9uc2UgdG8gYmUgaGFuZGxlZCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgVG9rZW4gcmVzcG9uc2Ugb3IgbnVsbC4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBudWxsLCB0aGVuIG5vIGF1dGggcmVkaXJlY3Qgd2FzIGRldGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBoYW5kbGVSZWRpcmVjdFByb21pc2UoaGFzaCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlUmVkaXJlY3RQcm9taXNlKGhhc2gpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2Ugd2hlbiBpbml0aWF0aW5nIHRoZSBsb2dpbiBwcm9jZXNzIHZpYSBvcGVuaW5nIGEgcG9wdXAgd2luZG93IGluIHRoZSB1c2VyJ3MgYnJvd3NlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBoYXMgY29tcGxldGVkLCBvciByZWplY3RlZCBpZiBhbiBlcnJvciB3YXMgcmFpc2VkLlxyXG4gICAgICovXHJcbiAgICBsb2dpblBvcHVwKHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ2luUG9wdXAocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZSB3aGVuIGluaXRpYXRpbmcgdGhlIGxvZ2luIHByb2Nlc3MgYnkgcmVkaXJlY3RpbmcgdGhlIHVzZXIncyBicm93c2VyIHRvIHRoZSBhdXRob3JpemF0aW9uIGVuZHBvaW50LiBUaGlzIGZ1bmN0aW9uIHJlZGlyZWN0cyB0aGUgcGFnZSwgc29cclxuICAgICAqIGFueSBjb2RlIHRoYXQgZm9sbG93cyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGV4ZWN1dGUuXHJcbiAgICAgKlxyXG4gICAgICogSU1QT1JUQU5UOiBJdCBpcyBOT1QgcmVjb21tZW5kZWQgdG8gaGF2ZSBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbmF2aWdhdGUgYXdheSBmcm9tIHRoZSBjdXJyZW50XHJcbiAgICAgKiBicm93c2VyIHdpbmRvdy4gSXQgY3VycmVudGx5IHJldHVybnMgYSBQcm9taXNlIGluIG9yZGVyIHRvIHJlZmxlY3QgdGhlIGFzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhlIGNvZGUgcnVubmluZyBpbiB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIGxvZ2luUmVkaXJlY3QocmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIubG9naW5SZWRpcmVjdChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVwcmVjYXRlZCBsb2dvdXQgZnVuY3Rpb24uIFVzZSBsb2dvdXRSZWRpcmVjdCBvciBsb2dvdXRQb3B1cCBpbnN0ZWFkXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICogQGRlcHJlY2F0ZWRcclxuICAgICAqL1xyXG4gICAgbG9nb3V0KGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dChsb2dvdXRSZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlIHRvIGxvZyBvdXQgdGhlIGN1cnJlbnQgdXNlciwgYW5kIHJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBwb3N0TG9nb3V0UmVkaXJlY3RVcmkuXHJcbiAgICAgKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byByZWRpcmVjdCB0aGUgdXNlciB0byBgd2luZG93LmxvY2F0aW9uLmhyZWZgLlxyXG4gICAgICogQHBhcmFtIGxvZ291dFJlcXVlc3RcclxuICAgICAqL1xyXG4gICAgbG9nb3V0UmVkaXJlY3QobG9nb3V0UmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0UmVkaXJlY3QobG9nb3V0UmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBsb2NhbCBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgdXNlciB0aGVuIG9wZW5zIGEgcG9wdXAgd2luZG93IHByb21wdGluZyB0aGUgdXNlciB0byBzaWduLW91dCBvZiB0aGUgc2VydmVyXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBsb2dvdXRQb3B1cChsb2dvdXRSZXF1ZXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dvdXRQb3B1cChsb2dvdXRSZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGEgaGlkZGVuIGlmcmFtZSB0byBmZXRjaCBhbiBhdXRob3JpemF0aW9uIGNvZGUgZnJvbSB0aGUgZVNUUy4gVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoaXMgbWF5IG5vdCB3b3JrOlxyXG4gICAgICogLSBBbnkgYnJvd3NlciB1c2luZyBhIGZvcm0gb2YgSW50ZWxsaWdlbnQgVHJhY2tpbmcgUHJldmVudGlvblxyXG4gICAgICogLSBJZiB0aGVyZSBpcyBub3QgYW4gZXN0YWJsaXNoZWQgc2Vzc2lvbiB3aXRoIHRoZSBzZXJ2aWNlXHJcbiAgICAgKlxyXG4gICAgICogSW4gdGhlc2UgY2FzZXMsIHRoZSByZXF1ZXN0IG11c3QgYmUgZG9uZSBpbnNpZGUgYSBwb3B1cCBvciBmdWxsIGZyYW1lIHJlZGlyZWN0LlxyXG4gICAgICpcclxuICAgICAqIEZvciB0aGUgY2FzZXMgd2hlcmUgaW50ZXJhY3Rpb24gaXMgcmVxdWlyZWQsIHlvdSBjYW5ub3Qgc2VuZCBhIHJlcXVlc3Qgd2l0aCBwcm9tcHQ9bm9uZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3VyIHJlZnJlc2ggdG9rZW4gaGFzIGV4cGlyZWQsIHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZmV0Y2ggYSBuZXcgc2V0IG9mIHRva2VucyBzaWxlbnRseSBhcyBsb25nIGFzXHJcbiAgICAgKiB5b3Ugc2Vzc2lvbiBvbiB0aGUgc2VydmVyIHN0aWxsIGV4aXN0cy5cclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IHtAbGluayBTc29TaWxlbnRSZXF1ZXN0fVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCwgb3IgcmVqZWN0ZWQgaWYgYW4gZXJyb3Igd2FzIHJhaXNlZC5cclxuICAgICAqL1xyXG4gICAgc3NvU2lsZW50KHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnNzb1NpbGVudChyZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG9rZW4gY2FjaGUgZm9yIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZ2V0VG9rZW5DYWNoZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFRva2VuQ2FjaGUoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbG9nZ2VyIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIGdldExvZ2dlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldExvZ2dlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIgc2V0IGluIGNvbmZpZ3VyYXRpb25zIHdpdGggbmV3IExvZ2dlciB3aXRoIG5ldyBjb25maWd1cmF0aW9uc1xyXG4gICAgICogQHBhcmFtIGxvZ2dlciBMb2dnZXIgaW5zdGFuY2VcclxuICAgICAqL1xyXG4gICAgc2V0TG9nZ2VyKGxvZ2dlcikge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRMb2dnZXIobG9nZ2VyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYWNjb3VudCB0byB1c2UgYXMgdGhlIGFjdGl2ZSBhY2NvdW50LiBJZiBubyBhY2NvdW50IGlzIHBhc3NlZCB0byB0aGUgYWNxdWlyZVRva2VuIEFQSXMsIHRoZW4gTVNBTCB3aWxsIHVzZSB0aGlzIGFjdGl2ZSBhY2NvdW50LlxyXG4gICAgICogQHBhcmFtIGFjY291bnRcclxuICAgICAqL1xyXG4gICAgc2V0QWN0aXZlQWNjb3VudChhY2NvdW50KSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZUFjY291bnQoYWNjb3VudCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgYWNjb3VudFxyXG4gICAgICovXHJcbiAgICBnZXRBY3RpdmVBY2NvdW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgd3JhcHBlciBsaWJyYXJpZXMgKEFuZ3VsYXIgJiBSZWFjdCkgdG8gc2V0IFNLVSBhbmQgVmVyc2lvbiBwYXNzZWQgZG93biB0byB0ZWxlbWV0cnksIGxvZ2dlciwgZXRjLlxyXG4gICAgICogQHBhcmFtIHNrdVxyXG4gICAgICogQHBhcmFtIHZlcnNpb25cclxuICAgICAqL1xyXG4gICAgaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KHNrdSwgdmVyc2lvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KHNrdSwgdmVyc2lvbik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldHMgbmF2aWdhdGlvbiBjbGllbnRcclxuICAgICAqIEBwYXJhbSBuYXZpZ2F0aW9uQ2xpZW50XHJcbiAgICAgKi9cclxuICAgIHNldE5hdmlnYXRpb25DbGllbnQobmF2aWdhdGlvbkNsaWVudCkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXROYXZpZ2F0aW9uQ2xpZW50KG5hdmlnYXRpb25DbGllbnQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGdldENvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRDb25maWd1cmF0aW9uKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEh5ZHJhdGVzIGNhY2hlIHdpdGggdGhlIHRva2VucyBhbmQgYWNjb3VudCBpbiB0aGUgQXV0aGVudGljYXRpb25SZXN1bHQgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gcmVzdWx0XHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSByZXF1ZXN0IG9iamVjdCB0aGF0IHdhcyB1c2VkIHRvIG9idGFpbiB0aGUgQXV0aGVudGljYXRpb25SZXN1bHRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmh5ZHJhdGVDYWNoZShyZXN1bHQsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdG9rZW5zIGFuZCBhY2NvdW50IGZyb20gdGhlIGJyb3dzZXIgY2FjaGUuXHJcbiAgICAgKiBAcGFyYW0gbG9nb3V0UmVxdWVzdFxyXG4gICAgICovXHJcbiAgICBjbGVhckNhY2hlKGxvZ291dFJlcXVlc3QpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmNsZWFyQ2FjaGUobG9nb3V0UmVxdWVzdCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUHVibGljQ2xpZW50TmV4dCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHVibGljQ2xpZW50TmV4dC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IubWpzJztcbmltcG9ydCB7IHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbkNhbGxlZCB9IGZyb20gJy4uL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiA9IHtcclxuICAgIGluaXRpYWxpemU6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgYWNxdWlyZVRva2VuUG9wdXA6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgYWNxdWlyZVRva2VuUmVkaXJlY3Q6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgYWNxdWlyZVRva2VuU2lsZW50OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNyZWF0ZUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbkNhbGxlZCkpO1xyXG4gICAgfSxcclxuICAgIGFjcXVpcmVUb2tlbkJ5Q29kZTogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb25DYWxsZWQpKTtcclxuICAgIH0sXHJcbiAgICBnZXRBbGxBY2NvdW50czogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH0sXHJcbiAgICBnZXRBY2NvdW50OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgZ2V0QWNjb3VudEJ5SG9tZUlkOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgZ2V0QWNjb3VudEJ5VXNlcm5hbWU6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcbiAgICBnZXRBY2NvdW50QnlMb2NhbElkOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgaGFuZGxlUmVkaXJlY3RQcm9taXNlOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNyZWF0ZUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbkNhbGxlZCkpO1xyXG4gICAgfSxcclxuICAgIGxvZ2luUG9wdXA6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgbG9naW5SZWRpcmVjdDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb25DYWxsZWQpKTtcclxuICAgIH0sXHJcbiAgICBsb2dvdXQ6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgbG9nb3V0UmVkaXJlY3Q6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgbG9nb3V0UG9wdXA6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgc3NvU2lsZW50OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGNyZWF0ZUJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbkNhbGxlZCkpO1xyXG4gICAgfSxcclxuICAgIGFkZEV2ZW50Q2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcbiAgICByZW1vdmVFdmVudENhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSxcclxuICAgIGFkZFBlcmZvcm1hbmNlQ2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH0sXHJcbiAgICByZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuICAgIGVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzOiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSxcclxuICAgIGRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50czogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0sXHJcbiAgICBnZXRUb2tlbkNhY2hlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKTtcclxuICAgIH0sXHJcbiAgICBnZXRMb2dnZXI6ICgpID0+IHtcclxuICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb25DYWxsZWQpO1xyXG4gICAgfSxcclxuICAgIHNldExvZ2dlcjogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0sXHJcbiAgICBzZXRBY3RpdmVBY2NvdW50OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSxcclxuICAgIGdldEFjdGl2ZUFjY291bnQ6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcbiAgICBpbml0aWFsaXplV3JhcHBlckxpYnJhcnk6ICgpID0+IHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9LFxyXG4gICAgc2V0TmF2aWdhdGlvbkNsaWVudDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0sXHJcbiAgICBnZXRDb25maWd1cmF0aW9uOiAoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKTtcclxuICAgIH0sXHJcbiAgICBoeWRyYXRlQ2FjaGU6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3Ioc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkKSk7XHJcbiAgICB9LFxyXG4gICAgY2xlYXJDYWNoZTogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb25DYWxsZWQpKTtcclxuICAgIH0sXHJcbn07XG5cbmV4cG9ydCB7IHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgY3JlYXRlQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvci5tanMnO1xuaW1wb3J0IHsgQnJvd3NlckNhY2hlTG9jYXRpb24gfSBmcm9tICcuLi91dGlscy9Ccm93c2VyQ29uc3RhbnRzLm1qcyc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tICcuL0xvY2FsU3RvcmFnZS5tanMnO1xuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tICcuL1Nlc3Npb25TdG9yYWdlLm1qcyc7XG5pbXBvcnQgeyBzdG9yYWdlTm90U3VwcG9ydGVkIH0gZnJvbSAnLi4vZXJyb3IvQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JDb2Rlcy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb25cclxuICovXHJcbmNsYXNzIEJyb3dzZXJTdG9yYWdlIHtcclxuICAgIGNvbnN0cnVjdG9yKGNhY2hlTG9jYXRpb24pIHtcclxuICAgICAgICBpZiAoY2FjaGVMb2NhdGlvbiA9PT0gQnJvd3NlckNhY2hlTG9jYXRpb24uTG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2luZG93U3RvcmFnZSA9IG5ldyBMb2NhbFN0b3JhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2FjaGVMb2NhdGlvbiA9PT0gQnJvd3NlckNhY2hlTG9jYXRpb24uU2Vzc2lvblN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy53aW5kb3dTdG9yYWdlID0gbmV3IFNlc3Npb25TdG9yYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihzdG9yYWdlTm90U3VwcG9ydGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRJdGVtKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvd1N0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgfVxyXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy53aW5kb3dTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVJdGVtKGtleSkge1xyXG4gICAgICAgIHRoaXMud2luZG93U3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbiAgICBnZXRLZXlzKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLndpbmRvd1N0b3JhZ2UpO1xyXG4gICAgfVxyXG4gICAgY29udGFpbnNLZXkoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2luZG93U3RvcmFnZS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEJyb3dzZXJTdG9yYWdlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyU3RvcmFnZS5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtYnJvd3NlciB2My4yOC4xIDIwMjUtMDEtMTQgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IEV2ZW50VHlwZSB9IGZyb20gJy4vRXZlbnRUeXBlLm1qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvblR5cGUsIEludGVyYWN0aW9uU3RhdHVzIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRXZlbnRNZXNzYWdlVXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGludGVyYWN0aW9uIHN0YXR1cyBmcm9tIGV2ZW50IG1lc3NhZ2VcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHJcbiAgICAgKiBAcGFyYW0gY3VycmVudFN0YXR1c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0SW50ZXJhY3Rpb25TdGF0dXNGcm9tRXZlbnQobWVzc2FnZSwgY3VycmVudFN0YXR1cykge1xyXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS5ldmVudFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuTE9HSU5fU1RBUlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25TdGF0dXMuTG9naW47XHJcbiAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLlNTT19TSUxFTlRfU1RBUlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25TdGF0dXMuU3NvU2lsZW50O1xyXG4gICAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX1NUQVJUOlxyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QgfHxcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLlBvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVyYWN0aW9uU3RhdHVzLkFjcXVpcmVUb2tlbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5IQU5ETEVfUkVESVJFQ1RfU1RBUlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25TdGF0dXMuSGFuZGxlUmVkaXJlY3Q7XHJcbiAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR09VVF9TVEFSVDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcmFjdGlvblN0YXR1cy5Mb2dvdXQ7XHJcbiAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLlNTT19TSUxFTlRfU1VDQ0VTUzpcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuU1NPX1NJTEVOVF9GQUlMVVJFOlxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiZcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdHVzICE9PSBJbnRlcmFjdGlvblN0YXR1cy5Tc29TaWxlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHRoaXMgZXZlbnQgZnJvbSBjbGVhcmluZyBhbnkgc3RhdHVzIG90aGVyIHRoYW4gc3NvU2lsZW50XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25TdGF0dXMuTm9uZTtcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuTE9HT1VUX0VORDpcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdHVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cyAhPT0gSW50ZXJhY3Rpb25TdGF0dXMuTG9nb3V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB0aGlzIGV2ZW50IGZyb20gY2xlYXJpbmcgYW55IHN0YXR1cyBvdGhlciB0aGFuIGxvZ291dFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEludGVyYWN0aW9uU3RhdHVzLk5vbmU7XHJcbiAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkhBTkRMRV9SRURJUkVDVF9FTkQ6XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0dXMgIT09IEludGVyYWN0aW9uU3RhdHVzLkhhbmRsZVJlZGlyZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB0aGlzIGV2ZW50IGZyb20gY2xlYXJpbmcgYW55IHN0YXR1cyBvdGhlciB0aGFuIGhhbmRsZVJlZGlyZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25TdGF0dXMuTm9uZTtcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuTE9HSU5fU1VDQ0VTUzpcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuTE9HSU5fRkFJTFVSRTpcclxuICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9TVUNDRVNTOlxyXG4gICAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6XHJcbiAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLlJFU1RPUkVfRlJPTV9CRkNBQ0hFOlxyXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QgfHxcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLlBvcHVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cyAhPT0gSW50ZXJhY3Rpb25TdGF0dXMuTG9naW4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cyAhPT0gSW50ZXJhY3Rpb25TdGF0dXMuQWNxdWlyZVRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdGhpcyBldmVudCBmcm9tIGNsZWFyaW5nIGFueSBzdGF0dXMgb3RoZXIgdGhhbiBsb2dpbiBvciBhY3F1aXJlVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcmFjdGlvblN0YXR1cy5Ob25lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEV2ZW50TWVzc2FnZVV0aWxzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudE1lc3NhZ2UubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDcnlwdG9PcHMgfSBmcm9tICcuL0NyeXB0b09wcy5tanMnO1xuaW1wb3J0IHsgTG9nZ2VyLCBQb3BUb2tlbkdlbmVyYXRvciB9IGZyb20gJ0BhenVyZS9tc2FsLWNvbW1vbi9icm93c2VyJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlTWV0YWRhdGEubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFNpZ25lZEh0dHBSZXF1ZXN0IHtcclxuICAgIGNvbnN0cnVjdG9yKHNoclBhcmFtZXRlcnMsIHNock9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBsb2dnZXJPcHRpb25zID0gKHNock9wdGlvbnMgJiYgc2hyT3B0aW9ucy5sb2dnZXJPcHRpb25zKSB8fCB7fTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIobG9nZ2VyT3B0aW9ucywgbmFtZSwgdmVyc2lvbik7XHJcbiAgICAgICAgdGhpcy5jcnlwdG9PcHMgPSBuZXcgQ3J5cHRvT3BzKHRoaXMubG9nZ2VyKTtcclxuICAgICAgICB0aGlzLnBvcFRva2VuR2VuZXJhdG9yID0gbmV3IFBvcFRva2VuR2VuZXJhdG9yKHRoaXMuY3J5cHRvT3BzKTtcclxuICAgICAgICB0aGlzLnNoclBhcmFtZXRlcnMgPSBzaHJQYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIGNhY2hlcyBhIGtleXBhaXIgZm9yIHRoZSBnaXZlbiByZXF1ZXN0IG9wdGlvbnMuXHJcbiAgICAgKiBAcmV0dXJucyBQdWJsaWMga2V5IGRpZ2VzdCwgd2hpY2ggc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHRva2VuIGlzc3Vlci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2VuZXJhdGVQdWJsaWNLZXlUaHVtYnByaW50KCkge1xyXG4gICAgICAgIGNvbnN0IHsga2lkIH0gPSBhd2FpdCB0aGlzLnBvcFRva2VuR2VuZXJhdG9yLmdlbmVyYXRlS2lkKHRoaXMuc2hyUGFyYW1ldGVycyk7XHJcbiAgICAgICAgcmV0dXJuIGtpZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgc2lnbmVkIGh0dHAgcmVxdWVzdCBmb3IgdGhlIGdpdmVuIHBheWxvYWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCB0byBzaWduIChlLmcuIGFjY2VzcyB0b2tlbilcclxuICAgICAqIEBwYXJhbSBwdWJsaWNLZXlUaHVtYnByaW50IFB1YmxpYyBrZXkgZGlnZXN0IChmcm9tIGdlbmVyYXRlUHVibGljS2V5VGh1bWJwcmludCBBUEkpXHJcbiAgICAgKiBAcGFyYW0gY2xhaW1zIEFkZGl0aW9uYWwgY2xhaW1zIHRvIGluY2x1ZGUvb3ZlcnJpZGUgaW4gdGhlIHNpZ25lZCBKV1RcclxuICAgICAqIEByZXR1cm5zIFBvcCB0b2tlbiBzaWduZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcml2YXRlIGtleVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzaWduUmVxdWVzdChwYXlsb2FkLCBwdWJsaWNLZXlUaHVtYnByaW50LCBjbGFpbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3BUb2tlbkdlbmVyYXRvci5zaWduUGF5bG9hZChwYXlsb2FkLCBwdWJsaWNLZXlUaHVtYnByaW50LCB0aGlzLnNoclBhcmFtZXRlcnMsIGNsYWltcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgY2FjaGVkIGtleXMgZnJvbSBicm93c2VyIGZvciBnaXZlbiBwdWJsaWMga2V5IHRodW1icHJpbnRcclxuICAgICAqIEBwYXJhbSBwdWJsaWNLZXlUaHVtYnByaW50IFB1YmxpYyBrZXkgZGlnZXN0IChmcm9tIGdlbmVyYXRlUHVibGljS2V5VGh1bWJwcmludCBBUEkpXHJcbiAgICAgKiBAcmV0dXJucyBJZiBrZXlzIGFyZSBwcm9wZXJseSBkZWxldGVkXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlbW92ZUtleXMocHVibGljS2V5VGh1bWJwcmludCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNyeXB0b09wcy5yZW1vdmVUb2tlbkJpbmRpbmdLZXkocHVibGljS2V5VGh1bWJwcmludCk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgU2lnbmVkSHR0cFJlcXVlc3QgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpZ25lZEh0dHBSZXF1ZXN0Lm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE0LjE2LjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgSW50RmllbGRzLCBQZXJmb3JtYW5jZUV2ZW50QWJicmV2aWF0aW9ucywgUGVyZm9ybWFuY2VFdmVudFN0YXR1cyB9IGZyb20gJy4vUGVyZm9ybWFuY2VFdmVudC5tanMnO1xuaW1wb3J0IHsgU3R1YlBlcmZvcm1hbmNlTWVhc3VyZW1lbnQgfSBmcm9tICcuL1N0dWJQZXJmb3JtYW5jZUNsaWVudC5tanMnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IvQXV0aEVycm9yLm1qcyc7XG5pbXBvcnQgeyBDYWNoZUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3IvQ2FjaGVFcnJvci5tanMnO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvci9TZXJ2ZXJFcnJvci5tanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9yL0ludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IubWpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTdGFydHMgY29udGV4dCBieSBhZGRpbmcgcGF5bG9hZCB0byB0aGUgc3RhY2tcclxuICogQHBhcmFtIGV2ZW50IHtQZXJmb3JtYW5jZUV2ZW50fVxyXG4gKiBAcGFyYW0gYWJicmV2aWF0aW9ucyB7TWFwPHN0cmluZywgc3RyaW5nPn0gZXZlbnQgbmFtZSBhYmJyZXZpYXRpb25zXHJcbiAqIEBwYXJhbSBzdGFjayB7P1BlcmZvcm1hbmNlRXZlbnRTdGFja2VkQ29udGV4dFtdfSBzdGFja1xyXG4gKi9cclxuZnVuY3Rpb24gc3RhcnRDb250ZXh0KGV2ZW50LCBhYmJyZXZpYXRpb25zLCBzdGFjaykge1xyXG4gICAgaWYgKCFzdGFjaykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHN0YWNrLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IGFiYnJldmlhdGlvbnMuZ2V0KGV2ZW50Lm5hbWUpIHx8IGV2ZW50Lm5hbWUsXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogRW5kcyBjb250ZXh0IGJ5IHJlbW92aW5nIHBheWxvYWQgZnJvbSB0aGUgc3RhY2sgYW5kIHJldHVybmluZyBwYXJlbnQgb3Igc2VsZiwgaWYgc3RhY2sgaXMgZW1wdHksIHBheWxvYWRcclxuICpcclxuICogQHBhcmFtIGV2ZW50IHtQZXJmb3JtYW5jZUV2ZW50fVxyXG4gKiBAcGFyYW0gYWJicmV2aWF0aW9ucyB7TWFwPHN0cmluZywgc3RyaW5nPn0gZXZlbnQgbmFtZSBhYmJyZXZpYXRpb25zXHJcbiAqIEBwYXJhbSBzdGFjayB7P1BlcmZvcm1hbmNlRXZlbnRTdGFja2VkQ29udGV4dFtdfSBzdGFja1xyXG4gKiBAcGFyYW0gZXJyb3Igez91bmtub3dufSBlcnJvclxyXG4gKi9cclxuZnVuY3Rpb24gZW5kQ29udGV4dChldmVudCwgYWJicmV2aWF0aW9ucywgc3RhY2ssIGVycm9yKSB7XHJcbiAgICBpZiAoIXN0YWNrPy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwZWVrID0gKHN0YWNrKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrLmxlbmd0aCA/IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGFiYnJFdmVudE5hbWUgPSBhYmJyZXZpYXRpb25zLmdldChldmVudC5uYW1lKSB8fCBldmVudC5uYW1lO1xyXG4gICAgY29uc3QgdG9wID0gcGVlayhzdGFjayk7XHJcbiAgICBpZiAodG9wPy5uYW1lICE9PSBhYmJyRXZlbnROYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudCA9IHN0YWNrPy5wb3AoKTtcclxuICAgIGlmICghY3VycmVudCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yIGluc3RhbmNlb2YgQXV0aEVycm9yXHJcbiAgICAgICAgPyBlcnJvci5lcnJvckNvZGVcclxuICAgICAgICA6IGVycm9yIGluc3RhbmNlb2YgRXJyb3JcclxuICAgICAgICAgICAgPyBlcnJvci5uYW1lXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3Qgc3ViRXJyID0gZXJyb3IgaW5zdGFuY2VvZiBBdXRoRXJyb3IgPyBlcnJvci5zdWJFcnJvciA6IHVuZGVmaW5lZDtcclxuICAgIGlmIChlcnJvckNvZGUgJiYgY3VycmVudC5jaGlsZEVyciAhPT0gZXJyb3JDb2RlKSB7XHJcbiAgICAgICAgY3VycmVudC5lcnIgPSBlcnJvckNvZGU7XHJcbiAgICAgICAgaWYgKHN1YkVycikge1xyXG4gICAgICAgICAgICBjdXJyZW50LnN1YkVyciA9IHN1YkVycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUgY3VycmVudC5uYW1lO1xyXG4gICAgZGVsZXRlIGN1cnJlbnQuY2hpbGRFcnI7XHJcbiAgICBjb25zdCBjb250ZXh0ID0ge1xyXG4gICAgICAgIC4uLmN1cnJlbnQsXHJcbiAgICAgICAgZHVyOiBldmVudC5kdXJhdGlvbk1zLFxyXG4gICAgfTtcclxuICAgIGlmICghZXZlbnQuc3VjY2Vzcykge1xyXG4gICAgICAgIGNvbnRleHQuZmFpbCA9IDE7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBwZWVrKHN0YWNrKTtcclxuICAgIGlmICghcGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgW2FiYnJFdmVudE5hbWVdOiBjb250ZXh0IH07XHJcbiAgICB9XHJcbiAgICBpZiAoZXJyb3JDb2RlKSB7XHJcbiAgICAgICAgcGFyZW50LmNoaWxkRXJyID0gZXJyb3JDb2RlO1xyXG4gICAgfVxyXG4gICAgbGV0IGNoaWxkTmFtZTtcclxuICAgIGlmICghcGFyZW50W2FiYnJFdmVudE5hbWVdKSB7XHJcbiAgICAgICAgY2hpbGROYW1lID0gYWJickV2ZW50TmFtZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNpYmxpbmdzID0gT2JqZWN0LmtleXMocGFyZW50KS5maWx0ZXIoKGtleSkgPT4ga2V5LnN0YXJ0c1dpdGgoYWJickV2ZW50TmFtZSkpLmxlbmd0aDtcclxuICAgICAgICBjaGlsZE5hbWUgPSBgJHthYmJyRXZlbnROYW1lfV8ke3NpYmxpbmdzICsgMX1gO1xyXG4gICAgfVxyXG4gICAgcGFyZW50W2NoaWxkTmFtZV0gPSBjb250ZXh0O1xyXG4gICAgcmV0dXJuIHBhcmVudDtcclxufVxyXG4vKipcclxuICogQWRkcyBlcnJvciBuYW1lIGFuZCBzdGFjayB0cmFjZSB0byB0aGUgdGVsZW1ldHJ5IGV2ZW50XHJcbiAqIEBwYXJhbSBlcnJvciB7RXJyb3J9XHJcbiAqIEBwYXJhbSBsb2dnZXIge0xvZ2dlcn1cclxuICogQHBhcmFtIGV2ZW50IHtQZXJmb3JtYW5jZUV2ZW50fVxyXG4gKiBAcGFyYW0gc3RhY2tNYXhTaXplIHtudW1iZXJ9IG1heCBlcnJvciBzdGFjayBzaXplIHRvIGNhcHR1cmVcclxuICovXHJcbmZ1bmN0aW9uIGFkZEVycm9yKGVycm9yLCBsb2dnZXIsIGV2ZW50LCBzdGFja01heFNpemUgPSA1KSB7XHJcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xyXG4gICAgICAgIGxvZ2dlci50cmFjZShcIlBlcmZvcm1hbmNlQ2xpZW50LmFkZEVycm9yU3RhY2s6IElucHV0IGVycm9yIGlzIG5vdCBpbnN0YW5jZSBvZiBFcnJvclwiLCBldmVudC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEF1dGhFcnJvcikge1xyXG4gICAgICAgIGV2ZW50LmVycm9yQ29kZSA9IGVycm9yLmVycm9yQ29kZTtcclxuICAgICAgICBldmVudC5zdWJFcnJvckNvZGUgPSBlcnJvci5zdWJFcnJvcjtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvciB8fFxyXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgZXZlbnQuc2VydmVyRXJyb3JObyA9IGVycm9yLmVycm9yTm87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2FjaGVFcnJvcikge1xyXG4gICAgICAgIGV2ZW50LmVycm9yQ29kZSA9IGVycm9yLmVycm9yQ29kZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChldmVudC5lcnJvclN0YWNrPy5sZW5ndGgpIHtcclxuICAgICAgICBsb2dnZXIudHJhY2UoXCJQZXJmb3JtYW5jZUNsaWVudC5hZGRFcnJvclN0YWNrOiBTdGFjayBhbHJlYWR5IGV4aXN0XCIsIGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCFlcnJvci5zdGFjaz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFwiUGVyZm9ybWFuY2VDbGllbnQuYWRkRXJyb3JTdGFjazogSW5wdXQgc3RhY2sgaXMgZW1wdHlcIiwgZXZlbnQuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGVycm9yLnN0YWNrKSB7XHJcbiAgICAgICAgZXZlbnQuZXJyb3JTdGFjayA9IGNvbXBhY3RTdGFjayhlcnJvci5zdGFjaywgc3RhY2tNYXhTaXplKTtcclxuICAgIH1cclxuICAgIGV2ZW50LmVycm9yTmFtZSA9IGVycm9yLm5hbWU7XHJcbn1cclxuLyoqXHJcbiAqIENvbXBhY3RzIGVycm9yIHN0YWNrIGludG8gYXJyYXkgYnkgZmV0Y2hpbmcgTiBmaXJzdCBlbnRyaWVzXHJcbiAqIEBwYXJhbSBzdGFjayB7c3RyaW5nfSBlcnJvciBzdGFja1xyXG4gKiBAcGFyYW0gc3RhY2tNYXhTaXplIHtudW1iZXJ9IG1heCBlcnJvciBzdGFjayBzaXplIHRvIGNhcHR1cmVcclxuICogQHJldHVybnMge3N0cmluZ1tdfVxyXG4gKi9cclxuZnVuY3Rpb24gY29tcGFjdFN0YWNrKHN0YWNrLCBzdGFja01heFNpemUpIHtcclxuICAgIGlmIChzdGFja01heFNpemUgPCAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhY2tBcnIgPSBzdGFjay5zcGxpdChcIlxcblwiKSB8fCBbXTtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgLy8gQ2hlY2sgZm9yIGEgaGFuZGZ1bCBvZiBrbm93biwgY29tbW9uIHJ1bnRpbWUgZXJyb3JzIGFuZCBsb2cgdGhlbSAod2l0aCByZWRhY3Rpb24gd2hlcmUgYXBwbGljYWJsZSkuXHJcbiAgICBjb25zdCBmaXJzdExpbmUgPSBzdGFja0FyclswXTtcclxuICAgIGlmIChmaXJzdExpbmUuc3RhcnRzV2l0aChcIlR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydHlcIikgfHxcclxuICAgICAgICBmaXJzdExpbmUuc3RhcnRzV2l0aChcIlR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZlwiKSB8fFxyXG4gICAgICAgIGZpcnN0TGluZS5zdGFydHNXaXRoKFwiVHlwZUVycm9yOiBDYW5ub3Qgc2V0IHByb3BlcnR5XCIpIHx8XHJcbiAgICAgICAgZmlyc3RMaW5lLnN0YXJ0c1dpdGgoXCJUeXBlRXJyb3I6IENhbm5vdCBzZXQgcHJvcGVydGllcyBvZlwiKSB8fFxyXG4gICAgICAgIGZpcnN0TGluZS5lbmRzV2l0aChcImlzIG5vdCBhIGZ1bmN0aW9uXCIpKSB7XHJcbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgb2YgZXJyb3JzIGFyZSBub3QgYXQgcmlzayBvZiBsZWFraW5nIFBJSS4gVGhleSB3aWxsIGluZGljYXRlIHVuYXZhaWxhYmxlIEFQSXNcclxuICAgICAgICByZXMucHVzaChjb21wYWN0U3RhY2tMaW5lKGZpcnN0TGluZSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmlyc3RMaW5lLnN0YXJ0c1dpdGgoXCJTeW50YXhFcnJvclwiKSB8fFxyXG4gICAgICAgIGZpcnN0TGluZS5zdGFydHNXaXRoKFwiVHlwZUVycm9yXCIpKSB7XHJcbiAgICAgICAgLy8gUHJldmVudCB1bmludGVudGlvbmFsIGxlYWtpbmcgb2YgYXJiaXRyYXJ5IGluZm8gYnkgcmVkYWN0aW5nIGNvbnRlbnRzIGJldHdlZW4gYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXNcclxuICAgICAgICByZXMucHVzaChjb21wYWN0U3RhY2tMaW5lKFxyXG4gICAgICAgIC8vIEV4YW1wbGU6IFN5bnRheEVycm9yOiBVbmV4cGVjdGVkIHRva2VuICdlJywgXCJ0ZXN0XCIgaXMgbm90IHZhbGlkIEpTT04gLT4gU3ludGF4RXJyb3I6IFVuZXhwZWN0ZWQgdG9rZW4gPHJlZGFjdGVkPiwgPHJlZGFjdGVkPiBpcyBub3QgdmFsaWQgSlNPTlxyXG4gICAgICAgIGZpcnN0TGluZS5yZXBsYWNlKC9bJ10uKlsnXXxbXCJdLipbXCJdL2csIFwiPHJlZGFjdGVkPlwiKSkpO1xyXG4gICAgfVxyXG4gICAgLy8gR2V0IHRvcCBOIHN0YWNrIGxpbmVzXHJcbiAgICBmb3IgKGxldCBpeCA9IDE7IGl4IDwgc3RhY2tBcnIubGVuZ3RoOyBpeCsrKSB7XHJcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPj0gc3RhY2tNYXhTaXplKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsaW5lID0gc3RhY2tBcnJbaXhdO1xyXG4gICAgICAgIHJlcy5wdXNoKGNvbXBhY3RTdGFja0xpbmUobGluZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxufVxyXG4vKipcclxuICogQ29tcGFjdHMgZXJyb3Igc3RhY2sgbGluZSBieSBzaG9ydGVuaW5nIGZpbGUgcGF0aFxyXG4gKiBFeGFtcGxlOiBodHRwczovL2xvY2FsaG9zdC9tc2FsLWNvbW1vbi9zcmMvYXV0aG9yaXR5L0F1dGhvcml0eS5qczoxMDA6MSAtPiBBdXRob3JpdHkuanM6MTAwOjFcclxuICogQHBhcmFtIGxpbmUge3N0cmluZ30gc3RhY2sgbGluZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gY29tcGFjdFN0YWNrTGluZShsaW5lKSB7XHJcbiAgICBjb25zdCBmaWxlUGF0aEl4ID0gbGluZS5sYXN0SW5kZXhPZihcIiBcIikgKyAxO1xyXG4gICAgaWYgKGZpbGVQYXRoSXggPCAxKSB7XHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IGxpbmUuc3Vic3RyaW5nKGZpbGVQYXRoSXgpO1xyXG4gICAgbGV0IGZpbGVOYW1lSXggPSBmaWxlUGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XHJcbiAgICBmaWxlTmFtZUl4ID0gZmlsZU5hbWVJeCA8IDAgPyBmaWxlUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIikgOiBmaWxlTmFtZUl4O1xyXG4gICAgaWYgKGZpbGVOYW1lSXggPj0gMCkge1xyXG4gICAgICAgIHJldHVybiAobGluZS5zdWJzdHJpbmcoMCwgZmlsZVBhdGhJeCkgK1xyXG4gICAgICAgICAgICBcIihcIiArXHJcbiAgICAgICAgICAgIGZpbGVQYXRoLnN1YnN0cmluZyhmaWxlTmFtZUl4ICsgMSkgK1xyXG4gICAgICAgICAgICAoZmlsZVBhdGguY2hhckF0KGZpbGVQYXRoLmxlbmd0aCAtIDEpID09PSBcIilcIiA/IFwiXCIgOiBcIilcIikpLnRyaW1TdGFydCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpbmUudHJpbVN0YXJ0KCk7XHJcbn1cclxuY2xhc3MgUGVyZm9ybWFuY2VDbGllbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFBlcmZvcm1hbmNlQ2xpZW50LFxyXG4gICAgICogYW4gYWJzdHJhY3QgY2xhc3MgY29udGFpbmluZyBjb3JlIHBlcmZvcm1hbmNlIHRlbGVtZXRyeSBsb2dpYy5cclxuICAgICAqXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGllbnRJZCBDbGllbnQgSUQgb2YgdGhlIGFwcGxpY2F0aW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aG9yaXR5IEF1dGhvcml0eSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvblxyXG4gICAgICogQHBhcmFtIHtMb2dnZXJ9IGxvZ2dlciBMb2dnZXIgdXNlZCBieSB0aGUgYXBwbGljYXRpb25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJyYXJ5TmFtZSBOYW1lIG9mIHRoZSBsaWJyYXJ5XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGlicmFyeVZlcnNpb24gVmVyc2lvbiBvZiB0aGUgbGlicmFyeVxyXG4gICAgICogQHBhcmFtIHtBcHBsaWNhdGlvblRlbGVtZXRyeX0gYXBwbGljYXRpb25UZWxlbWV0cnkgYXBwbGljYXRpb24gbmFtZSBhbmQgdmVyc2lvblxyXG4gICAgICogQHBhcmFtIHtTZXQ8U3RyaW5nPn0gaW50RmllbGRzIGludGVnZXIgZmllbGRzIHRvIGJlIHRydW5jYXRlZFxyXG4gICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBhYmJyZXZpYXRpb25zIGV2ZW50IG5hbWUgYWJicmV2aWF0aW9uc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjbGllbnRJZCwgYXV0aG9yaXR5LCBsb2dnZXIsIGxpYnJhcnlOYW1lLCBsaWJyYXJ5VmVyc2lvbiwgYXBwbGljYXRpb25UZWxlbWV0cnksIGludEZpZWxkcywgYWJicmV2aWF0aW9ucykge1xyXG4gICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xyXG4gICAgICAgIHRoaXMubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTtcclxuICAgICAgICB0aGlzLmxpYnJhcnlWZXJzaW9uID0gbGlicmFyeVZlcnNpb247XHJcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvblRlbGVtZXRyeSA9IGFwcGxpY2F0aW9uVGVsZW1ldHJ5O1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmV2ZW50U3RhY2sgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5xdWV1ZU1lYXN1cmVtZW50cyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmludEZpZWxkcyA9IGludEZpZWxkcyB8fCBuZXcgU2V0KCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIEludEZpZWxkcykge1xyXG4gICAgICAgICAgICB0aGlzLmludEZpZWxkcy5hZGQoaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWJicmV2aWF0aW9ucyA9IGFiYnJldmlhdGlvbnMgfHwgbmV3IE1hcCgpO1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIFBlcmZvcm1hbmNlRXZlbnRBYmJyZXZpYXRpb25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWJicmV2aWF0aW9ucy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgYW5kIHJldHVybnMgYW4gcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgSVBlcmZvcm1hbmNlTWVhc3VyZW1lbnQuXHJcbiAgICAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjaGFuZ2VkIHRvIGFic3RyYWN0IGF0IHRoZSBuZXh0IG1ham9yIHZlcnNpb24gYnVtcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVhc3VyZU5hbWVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JyZWxhdGlvbklkXHJcbiAgICAgKiBAcmV0dXJucyB7SVBlcmZvcm1hbmNlTWVhc3VyZW1lbnR9XHJcbiAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBzdGFydFBlcmZvcm1hbmNlTWVhc3VyZW1lbnQobWVhc3VyZU5hbWUsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBjb3JyZWxhdGlvbklkIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgbWFwIG9mIHByZS1xdWV1ZSB0aW1lcyBieSBjb3JyZWxhdGlvbiBJZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGVyZm9ybWFuY2VFdmVudHN9IGV2ZW50TmFtZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvcnJlbGF0aW9uSWRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldFByZVF1ZXVlVGltZShldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBjb25zdCBwcmVRdWV1ZUV2ZW50ID0gdGhpcy5wcmVRdWV1ZVRpbWVCeUNvcnJlbGF0aW9uSWQuZ2V0KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmICghcHJlUXVldWVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQuZ2V0UHJlUXVldWVUaW1lOiBubyBwcmUtcXVldWUgdGltZXMgZm91bmQgZm9yIGNvcnJlbGF0aW9uSWQ6ICR7Y29ycmVsYXRpb25JZH0sIHVuYWJsZSB0byBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcmVRdWV1ZUV2ZW50Lm5hbWUgIT09IGV2ZW50TmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQuZ2V0UHJlUXVldWVUaW1lOiBubyBwcmUtcXVldWUgdGltZSBmb3VuZCBmb3IgJHtldmVudE5hbWV9LCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50YCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByZVF1ZXVlRXZlbnQudGltZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGltZSBhbmQgdGltZSB3aGVuIGZ1bmN0aW9uIHdhcyBxdWV1ZWQuXHJcbiAgICAgKiBOb3RlOiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIDAgYXMgdGhlIHF1ZXVlIHRpbWUgaWYgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIHF1ZXVlZCB0aW1lIHdhcyB0aGUgc2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcHJlUXVldWVUaW1lXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudFRpbWVcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVF1ZXVlZFRpbWUocHJlUXVldWVUaW1lLCBjdXJyZW50VGltZSkge1xyXG4gICAgICAgIGlmIChwcmVRdWV1ZVRpbWUgPCAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogcHJlUXVldWVUaW1lIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgYW5kIG5vdCAke3ByZVF1ZXVlVGltZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA8IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBjdXJyZW50VGltZSBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFuZCBub3QgJHtjdXJyZW50VGltZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA8IHByZVF1ZXVlVGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlBlcmZvcm1hbmNlQ2xpZW50OiBjdXJyZW50VGltZSBpcyBsZXNzIHRoYW4gcHJlUXVldWVUaW1lLCBjaGVjayBob3cgdGltZSBpcyBiZWluZyByZXRyaWV2ZWRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3VycmVudFRpbWUgLSBwcmVRdWV1ZVRpbWU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgcXVldWUgbWVhc3VyZW1lbnQgdGltZSB0byBRdWV1ZU1lYXN1cmVtZW50cyBhcnJheSBmb3IgZ2l2ZW4gY29ycmVsYXRpb24gSUQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUV2ZW50c30gZXZlbnROYW1lXHJcbiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGNvcnJlbGF0aW9uSWRcclxuICAgICAqIEBwYXJhbSB7P251bWJlcn0gcXVldWVUaW1lXHJcbiAgICAgKiBAcGFyYW0gez9ib29sZWFufSBtYW51YWxseUNvbXBsZXRlZCAtIGluZGljYXRvciBmb3IgbWFudWFsbHkgY29tcGxldGVkIHF1ZXVlIG1lYXN1cmVtZW50c1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYWRkUXVldWVNZWFzdXJlbWVudChldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQsIHF1ZXVlVGltZSwgbWFudWFsbHlDb21wbGV0ZWQpIHtcclxuICAgICAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IGNvcnJlbGF0aW9uSWQgbm90IHByb3ZpZGVkIGZvciAke2V2ZW50TmFtZX0sIGNhbm5vdCBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocXVldWVUaW1lID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIFBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBubyBxdWV1ZSB0aW1lIGFmdGVyIGNhbGN1bGF0aW9uXHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50OiBxdWV1ZSB0aW1lIHByb3ZpZGVkIGZvciAke2V2ZW50TmFtZX0gaXMgJHtxdWV1ZVRpbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFxdWV1ZVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IG5vIHF1ZXVlIHRpbWUgcHJvdmlkZWQgZm9yICR7ZXZlbnROYW1lfWApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHF1ZXVlTWVhc3VyZW1lbnQgPSB7XHJcbiAgICAgICAgICAgIGV2ZW50TmFtZSxcclxuICAgICAgICAgICAgLy8gQWx3YXlzIGRlZmF1bHQgcXVldWUgdGltZSB0byAwIGZvciBtYW51YWxseSBjb21wbGV0ZWQgKGltcHJvcGVybHkgaW5zdHJ1bWVudGVkKVxyXG4gICAgICAgICAgICBxdWV1ZVRpbWU6IG1hbnVhbGx5Q29tcGxldGVkID8gMCA6IHF1ZXVlVGltZSxcclxuICAgICAgICAgICAgbWFudWFsbHlDb21wbGV0ZWQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBBZGRzIHRvIGV4aXN0aW5nIGNvcnJlbGF0aW9uIElkIGlmIHByZXNlbnQgaW4gcXVldWVNZWFzdXJlbWVudHNcclxuICAgICAgICBjb25zdCBleGlzdGluZ01lYXN1cmVtZW50cyA9IHRoaXMucXVldWVNZWFzdXJlbWVudHMuZ2V0KGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ01lYXN1cmVtZW50cykge1xyXG4gICAgICAgICAgICBleGlzdGluZ01lYXN1cmVtZW50cy5wdXNoKHF1ZXVlTWVhc3VyZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLnNldChjb3JyZWxhdGlvbklkLCBleGlzdGluZ01lYXN1cmVtZW50cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTZXRzIG5ldyBjb3JyZWxhdGlvbiBJZCBpZiBub3QgcHJlc2VudCBpbiBxdWV1ZU1lYXN1cmVtZW50c1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudDogYWRkaW5nIGNvcnJlbGF0aW9uSWQgJHtjb3JyZWxhdGlvbklkfSB0byBxdWV1ZSBtZWFzdXJlbWVudHNgKTtcclxuICAgICAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRBcnJheSA9IFtxdWV1ZU1lYXN1cmVtZW50XTtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5zZXQoY29ycmVsYXRpb25JZCwgbWVhc3VyZW1lbnRBcnJheSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIERlbGV0ZSBwcm9jZXNzZWQgcHJlLXF1ZXVlIGV2ZW50LlxyXG4gICAgICAgIHRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBmb3IgYSBnaXZlbiBvcGVyYXRpb24uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGVuZCB0aGUgbWVhc3VyZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUV2ZW50c30gbWVhc3VyZU5hbWVcclxuICAgICAqIEBwYXJhbSB7P3N0cmluZ30gW2NvcnJlbGF0aW9uSWRdXHJcbiAgICAgKiBAcmV0dXJucyB7SW5Qcm9ncmVzc1BlcmZvcm1hbmNlRXZlbnR9XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0TWVhc3VyZW1lbnQobWVhc3VyZU5hbWUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHBsYWNlaG9sZGVyIGNvcnJlbGF0aW9uIGlmIHRoZSByZXF1ZXN0IGRvZXMgbm90IHByb3ZpZGUgb25lXHJcbiAgICAgICAgY29uc3QgZXZlbnRDb3JyZWxhdGlvbklkID0gY29ycmVsYXRpb25JZCB8fCB0aGlzLmdlbmVyYXRlSWQoKTtcclxuICAgICAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgUGVyZm9ybWFuY2VDbGllbnQ6IE5vIGNvcnJlbGF0aW9uIGlkIHByb3ZpZGVkIGZvciAke21lYXN1cmVOYW1lfSwgZ2VuZXJhdGluZ2AsIGV2ZW50Q29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogUGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgc3RhcnRlZCBmb3IgJHttZWFzdXJlTmFtZX1gLCBldmVudENvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IGluUHJvZ3Jlc3NFdmVudCA9IHtcclxuICAgICAgICAgICAgZXZlbnRJZDogdGhpcy5nZW5lcmF0ZUlkKCksXHJcbiAgICAgICAgICAgIHN0YXR1czogUGVyZm9ybWFuY2VFdmVudFN0YXR1cy5JblByb2dyZXNzLFxyXG4gICAgICAgICAgICBhdXRob3JpdHk6IHRoaXMuYXV0aG9yaXR5LFxyXG4gICAgICAgICAgICBsaWJyYXJ5TmFtZTogdGhpcy5saWJyYXJ5TmFtZSxcclxuICAgICAgICAgICAgbGlicmFyeVZlcnNpb246IHRoaXMubGlicmFyeVZlcnNpb24sXHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgICBuYW1lOiBtZWFzdXJlTmFtZSxcclxuICAgICAgICAgICAgc3RhcnRUaW1lTXM6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50Q29ycmVsYXRpb25JZCxcclxuICAgICAgICAgICAgYXBwTmFtZTogdGhpcy5hcHBsaWNhdGlvblRlbGVtZXRyeT8uYXBwTmFtZSxcclxuICAgICAgICAgICAgYXBwVmVyc2lvbjogdGhpcy5hcHBsaWNhdGlvblRlbGVtZXRyeT8uYXBwVmVyc2lvbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8vIFN0b3JlIGluIHByb2dyZXNzIGV2ZW50cyBzbyB0aGV5IGNhbiBiZSBkaXNjYXJkZWQgaWYgbm90IGVuZGVkIHByb3Blcmx5XHJcbiAgICAgICAgdGhpcy5jYWNoZUV2ZW50QnlDb3JyZWxhdGlvbklkKGluUHJvZ3Jlc3NFdmVudCk7XHJcbiAgICAgICAgc3RhcnRDb250ZXh0KGluUHJvZ3Jlc3NFdmVudCwgdGhpcy5hYmJyZXZpYXRpb25zLCB0aGlzLmV2ZW50U3RhY2suZ2V0KGV2ZW50Q29ycmVsYXRpb25JZCkpO1xyXG4gICAgICAgIC8vIFJldHVybiB0aGUgZXZlbnQgYW5kIGZ1bmN0aW9ucyB0aGUgY2FsbGVyIGNhbiB1c2UgdG8gcHJvcGVybHkgZW5kL2ZsdXNoIHRoZSBtZWFzdXJlbWVudFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGVuZDogKGV2ZW50LCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5kTWVhc3VyZW1lbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgc2V0IG9mIGV2ZW50IHByb3BlcnRpZXNcclxuICAgICAgICAgICAgICAgICAgICAuLi5pblByb2dyZXNzRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGVydGllcyBzZXQgd2hlbiBldmVudCBlbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQsXHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvcik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRpc2NhcmQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc2NhcmRNZWFzdXJlbWVudHMoaW5Qcm9ncmVzc0V2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhZGQ6IChmaWVsZHMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZEZpZWxkcyhmaWVsZHMsIGluUHJvZ3Jlc3NFdmVudC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaW5jcmVtZW50OiAoZmllbGRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnRGaWVsZHMoZmllbGRzLCBpblByb2dyZXNzRXZlbnQuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50OiBpblByb2dyZXNzRXZlbnQsXHJcbiAgICAgICAgICAgIG1lYXN1cmVtZW50OiBuZXcgU3R1YlBlcmZvcm1hbmNlTWVhc3VyZW1lbnQoKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBtZWFzdXJpbmcgdGhlIHBlcmZvcm1hbmNlIGZvciBhbiBvcGVyYXRpb24uIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkaXJlY3RseSBieSBQZXJmb3JtYW5jZUNsaWVudCBjbGFzc2VzLFxyXG4gICAgICogYXMgY29uc3VtZXJzIHNob3VsZCBpbnN0ZWFkIHVzZSB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc3RhcnRNZWFzdXJlbWVudC5cclxuICAgICAqIEFkZHMgYSBuZXcgZmllbGQgbmFtZWQgYXMgXCJbZXZlbnQgbmFtZV1EdXJhdGlvbk1zXCIgZm9yIHN1Yi1tZWFzdXJlbWVudHMsIGNvbXBsZXRlcyBhbmQgZW1pdHMgYW4gZXZlbnRcclxuICAgICAqIG90aGVyd2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BlcmZvcm1hbmNlRXZlbnR9IGV2ZW50XHJcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IGVycm9yXHJcbiAgICAgKiBAcmV0dXJucyB7KFBlcmZvcm1hbmNlRXZlbnQgfCBudWxsKX1cclxuICAgICAqL1xyXG4gICAgZW5kTWVhc3VyZW1lbnQoZXZlbnQsIGVycm9yKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdEV2ZW50ID0gdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuZ2V0KGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmICghcm9vdEV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogTWVhc3VyZW1lbnQgbm90IGZvdW5kIGZvciAke2V2ZW50LmV2ZW50SWR9YCwgZXZlbnQuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc1Jvb3QgPSBldmVudC5ldmVudElkID09PSByb290RXZlbnQuZXZlbnRJZDtcclxuICAgICAgICBsZXQgcXVldWVJbmZvID0ge1xyXG4gICAgICAgICAgICB0b3RhbFF1ZXVlVGltZTogMCxcclxuICAgICAgICAgICAgdG90YWxRdWV1ZUNvdW50OiAwLFxyXG4gICAgICAgICAgICBtYW51YWxseUNvbXBsZXRlZENvdW50OiAwLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZXZlbnQuZHVyYXRpb25NcyA9IE1hdGgucm91bmQoZXZlbnQuZHVyYXRpb25NcyB8fCB0aGlzLmdldER1cmF0aW9uTXMoZXZlbnQuc3RhcnRUaW1lTXMpKTtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gSlNPTi5zdHJpbmdpZnkoZW5kQ29udGV4dChldmVudCwgdGhpcy5hYmJyZXZpYXRpb25zLCB0aGlzLmV2ZW50U3RhY2suZ2V0KHJvb3RFdmVudC5jb3JyZWxhdGlvbklkKSwgZXJyb3IpKTtcclxuICAgICAgICBpZiAoaXNSb290KSB7XHJcbiAgICAgICAgICAgIHF1ZXVlSW5mbyA9IHRoaXMuZ2V0UXVldWVJbmZvKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc2NhcmRNZWFzdXJlbWVudHMocm9vdEV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcm9vdEV2ZW50LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHM/LmRlbGV0ZShldmVudC5ldmVudElkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBlbmRlZCBmb3IgJHtldmVudC5uYW1lfTogJHtldmVudC5kdXJhdGlvbk1zfSBtc2AsIGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBhZGRFcnJvcihlcnJvciwgdGhpcy5sb2dnZXIsIHJvb3RFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBzdWItbWVhc3VyZW1lbnQgYXR0cmlidXRlIHRvIHJvb3QgZXZlbnQuXHJcbiAgICAgICAgaWYgKCFpc1Jvb3QpIHtcclxuICAgICAgICAgICAgcm9vdEV2ZW50W2V2ZW50Lm5hbWUgKyBcIkR1cmF0aW9uTXNcIl0gPSBNYXRoLmZsb29yKGV2ZW50LmR1cmF0aW9uTXMpO1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi5yb290RXZlbnQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzUm9vdCAmJlxyXG4gICAgICAgICAgICAhZXJyb3IgJiZcclxuICAgICAgICAgICAgKHJvb3RFdmVudC5lcnJvckNvZGUgfHwgcm9vdEV2ZW50LnN1YkVycm9yQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBSZW1vdmUgZXJyb3IgYW5kIHN1Yi1lcnJvciBjb2RlcyBmb3Igcm9vdCBldmVudCAke2V2ZW50Lm5hbWV9IGFzIGludGVybWVkaWF0ZSBlcnJvciB3YXMgc3VjY2Vzc2Z1bGx5IGhhbmRsZWRgLCBldmVudC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgcm9vdEV2ZW50LmVycm9yQ29kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcm9vdEV2ZW50LnN1YkVycm9yQ29kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZpbmFsRXZlbnQgPSB7IC4uLnJvb3RFdmVudCwgLi4uZXZlbnQgfTtcclxuICAgICAgICBsZXQgaW5jb21wbGV0ZVN1YnNDb3VudCA9IDA7XHJcbiAgICAgICAgLy8gSW5jb21wbGV0ZSBzdWItbWVhc3VyZW1lbnRzIGFyZSBkaXNjYXJkZWQuIFRoZXkgYXJlIGxpa2VseSBhbiBpbnN0cnVtZW50YXRpb24gYnVnIHRoYXQgc2hvdWxkIGJlIGZpeGVkLlxyXG4gICAgICAgIGZpbmFsRXZlbnQuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cz8uZm9yRWFjaCgoc3ViTWVhc3VyZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBJbmNvbXBsZXRlIHN1Ym1lYXN1cmVtZW50ICR7c3ViTWVhc3VyZW1lbnQubmFtZX0gZm91bmQgZm9yICR7ZXZlbnQubmFtZX1gLCBmaW5hbEV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICBpbmNvbXBsZXRlU3Vic0NvdW50Kys7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZmluYWxFdmVudC5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGZpbmFsRXZlbnQgPSB7XHJcbiAgICAgICAgICAgIC4uLmZpbmFsRXZlbnQsXHJcbiAgICAgICAgICAgIHF1ZXVlZFRpbWVNczogcXVldWVJbmZvLnRvdGFsUXVldWVUaW1lLFxyXG4gICAgICAgICAgICBxdWV1ZWRDb3VudDogcXVldWVJbmZvLnRvdGFsUXVldWVDb3VudCxcclxuICAgICAgICAgICAgcXVldWVkTWFudWFsbHlDb21wbGV0ZWRDb3VudDogcXVldWVJbmZvLm1hbnVhbGx5Q29tcGxldGVkQ291bnQsXHJcbiAgICAgICAgICAgIHN0YXR1czogUGVyZm9ybWFuY2VFdmVudFN0YXR1cy5Db21wbGV0ZWQsXHJcbiAgICAgICAgICAgIGluY29tcGxldGVTdWJzQ291bnQsXHJcbiAgICAgICAgICAgIGNvbnRleHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRydW5jYXRlSW50ZWdyYWxGaWVsZHMoZmluYWxFdmVudCk7XHJcbiAgICAgICAgdGhpcy5lbWl0RXZlbnRzKFtmaW5hbEV2ZW50XSwgZXZlbnQuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsRXZlbnQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNhdmVzIGV4dHJhIGluZm9ybWF0aW9uIHRvIGJlIGVtaXR0ZWQgd2hlbiB0aGUgbWVhc3VyZW1lbnRzIGFyZSBmbHVzaGVkXHJcbiAgICAgKiBAcGFyYW0gZmllbGRzXHJcbiAgICAgKiBAcGFyYW0gY29ycmVsYXRpb25JZFxyXG4gICAgICovXHJcbiAgICBhZGRGaWVsZHMoZmllbGRzLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJQZXJmb3JtYW5jZUNsaWVudDogVXBkYXRpbmcgc3RhdGljIGZpZWxkc1wiKTtcclxuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkLmdldChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuc2V0KGNvcnJlbGF0aW9uSWQsIHtcclxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LFxyXG4gICAgICAgICAgICAgICAgLi4uZmllbGRzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiUGVyZm9ybWFuY2VDbGllbnQ6IEV2ZW50IG5vdCBmb3VuZCBmb3JcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNyZW1lbnQgY291bnRlcnMgdG8gYmUgZW1pdHRlZCB3aGVuIHRoZSBtZWFzdXJlbWVudHMgYXJlIGZsdXNoZWRcclxuICAgICAqIEBwYXJhbSBmaWVsZHMge3N0cmluZ1tdfVxyXG4gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQge3N0cmluZ30gY29ycmVsYXRpb24gaWRlbnRpZmllclxyXG4gICAgICovXHJcbiAgICBpbmNyZW1lbnRGaWVsZHMoZmllbGRzLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJQZXJmb3JtYW5jZUNsaWVudDogVXBkYXRpbmcgY291bnRlcnNcIik7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQoY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY291bnRlciBpbiBmaWVsZHMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuaGFzT3duUHJvcGVydHkoY291bnRlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudFtjb3VudGVyXSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc05hTihOdW1iZXIoZXZlbnRbY291bnRlcl0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGV2ZW50W2NvdW50ZXJdICs9IGZpZWxkc1tjb3VudGVyXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoXCJQZXJmb3JtYW5jZUNsaWVudDogRXZlbnQgbm90IGZvdW5kIGZvclwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwc2VydHMgZXZlbnQgaW50byBldmVudCBjYWNoZS5cclxuICAgICAqIEZpcnN0IGtleSBpcyB0aGUgY29ycmVsYXRpb24gaWQsIHNlY29uZCBrZXkgaXMgdGhlIGV2ZW50IGlkLlxyXG4gICAgICogQWxsb3dzIGZvciBldmVudHMgdG8gYmUgZ3JvdXBlZCBieSBjb3JyZWxhdGlvbiBpZCxcclxuICAgICAqIGFuZCB0byBlYXNpbHkgYWxsb3cgZm9yIHByb3BlcnRpZXMgb24gdGhlbSB0byBiZSB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge1BlcmZvcm1hbmNlRXZlbnR9IGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGNhY2hlRXZlbnRCeUNvcnJlbGF0aW9uSWQoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCByb290RXZlbnQgPSB0aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQoZXZlbnQuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgaWYgKHJvb3RFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGZvciAke2V2ZW50Lm5hbWV9IGFkZGVkL3VwZGF0ZWRgLCBldmVudC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgcm9vdEV2ZW50LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHMgPVxyXG4gICAgICAgICAgICAgICAgcm9vdEV2ZW50LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHMgfHwgbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICByb290RXZlbnQuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cy5zZXQoZXZlbnQuZXZlbnRJZCwge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogZXZlbnQubmFtZSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZU1zOiBldmVudC5zdGFydFRpbWVNcyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGZvciAke2V2ZW50Lm5hbWV9IHN0YXJ0ZWRgLCBldmVudC5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuc2V0KGV2ZW50LmNvcnJlbGF0aW9uSWQsIHsgLi4uZXZlbnQgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTdGFjay5zZXQoZXZlbnQuY29ycmVsYXRpb25JZCwgW10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldFF1ZXVlSW5mbyhjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgY29uc3QgcXVldWVNZWFzdXJlbWVudEZvckNvcnJlbGF0aW9uSWQgPSB0aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLmdldChjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICBpZiAoIXF1ZXVlTWVhc3VyZW1lbnRGb3JDb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogbm8gcXVldWUgbWVhc3VyZW1lbnRzIGZvdW5kIGZvciBmb3IgY29ycmVsYXRpb25JZDogJHtjb3JyZWxhdGlvbklkfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdG90YWxRdWV1ZVRpbWUgPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbFF1ZXVlQ291bnQgPSAwO1xyXG4gICAgICAgIGxldCBtYW51YWxseUNvbXBsZXRlZENvdW50ID0gMDtcclxuICAgICAgICBxdWV1ZU1lYXN1cmVtZW50Rm9yQ29ycmVsYXRpb25JZD8uZm9yRWFjaCgobWVhc3VyZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgdG90YWxRdWV1ZVRpbWUgKz0gbWVhc3VyZW1lbnQucXVldWVUaW1lO1xyXG4gICAgICAgICAgICB0b3RhbFF1ZXVlQ291bnQrKztcclxuICAgICAgICAgICAgbWFudWFsbHlDb21wbGV0ZWRDb3VudCArPSBtZWFzdXJlbWVudC5tYW51YWxseUNvbXBsZXRlZCA/IDEgOiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvdGFsUXVldWVUaW1lLFxyXG4gICAgICAgICAgICB0b3RhbFF1ZXVlQ291bnQsXHJcbiAgICAgICAgICAgIG1hbnVhbGx5Q29tcGxldGVkQ291bnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBtZWFzdXJlbWVudHMgYW5kIGF1eCBkYXRhIGZvciBhIGdpdmVuIGNvcnJlbGF0aW9uIGlkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JyZWxhdGlvbklkXHJcbiAgICAgKi9cclxuICAgIGRpc2NhcmRNZWFzdXJlbWVudHMoY29ycmVsYXRpb25JZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyBkaXNjYXJkZWRcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFwiUGVyZm9ybWFuY2VDbGllbnQ6IFF1ZXVlTWVhc3VyZW1lbnRzIGRpc2NhcmRlZFwiLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlBlcmZvcm1hbmNlQ2xpZW50OiBQcmUtcXVldWUgdGltZXMgZGlzY2FyZGVkXCIsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIHRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBzdGFjayBkaXNjYXJkZWRcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5ldmVudFN0YWNrLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjZWl2ZSBwZXJmb3JtYW5jZSBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUNhbGxiYWNrRnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBhZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIGNiXSBvZiB0aGlzLmNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICBpZiAoY2IudG9TdHJpbmcoKSA9PT0gY2FsbGJhY2sudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybmluZyhgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke2lkfWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmdlbmVyYXRlSWQoKTtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQoY2FsbGJhY2tJZCwgY2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggaWQ6ICR7Y2FsbGJhY2tJZH1gKTtcclxuICAgICAgICByZXR1cm4gY2FsbGJhY2tJZDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBhZGRQZXJmb3JtYW5jZUNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja0lkXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhjYWxsYmFja0lkKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrSWQpO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH0gcmVtb3ZlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9IG5vdCByZW1vdmVkLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyBldmVudHMgdG8gYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGVyZm9ybWFuY2VFdmVudFtdfSBldmVudHNcclxuICAgICAqIEBwYXJhbSB7P3N0cmluZ30gW2NvcnJlbGF0aW9uSWRdXHJcbiAgICAgKi9cclxuICAgIGVtaXRFdmVudHMoZXZlbnRzLCBjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmVyYm9zZShcIlBlcmZvcm1hbmNlQ2xpZW50OiBFbWl0dGluZyBwZXJmb3JtYW5jZSBldmVudHNcIiwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2ssIGNhbGxiYWNrSWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBFbWl0dGluZyBldmVudCB0byBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCwgY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIFtldmVudHNdKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRW5mb3JjZSB0cnVuY2F0aW9uIG9mIGludGVncmFsIGZpZWxkcyBpbiBwZXJmb3JtYW5jZSBldmVudC5cclxuICAgICAqIEBwYXJhbSB7UGVyZm9ybWFuY2VFdmVudH0gZXZlbnQgcGVyZm9ybWFuY2UgZXZlbnQgdG8gdXBkYXRlLlxyXG4gICAgICovXHJcbiAgICB0cnVuY2F0ZUludGVncmFsRmllbGRzKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5pbnRGaWVsZHMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgaW4gZXZlbnQgJiYgdHlwZW9mIGV2ZW50W2tleV0gPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50W2tleV0gPSBNYXRoLmZsb29yKGV2ZW50W2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgZXZlbnQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMge251bWJlcn1cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldER1cmF0aW9uTXMoc3RhcnRUaW1lTXMpIHtcclxuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZU1zO1xyXG4gICAgICAgIC8vIEhhbmRsZSBjbG9jayBza2V3XHJcbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uTXMgPCAwID8gZHVyYXRpb25NcyA6IDA7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgUGVyZm9ybWFuY2VDbGllbnQsIGFkZEVycm9yLCBjb21wYWN0U3RhY2ssIGNvbXBhY3RTdGFja0xpbmUsIGVuZENvbnRleHQsIHN0YXJ0Q29udGV4dCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGVyZm9ybWFuY2VDbGllbnQubWpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjMuMjguMSAyMDI1LTAxLTE0ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUNsaWVudCwgQ29uc3RhbnRzLCBMb2dnZXIgfSBmcm9tICdAYXp1cmUvbXNhbC1jb21tb24vYnJvd3Nlcic7XG5pbXBvcnQgeyBuYW1lLCB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBCcm93c2VyQ2FjaGVMb2NhdGlvbiwgQlJPV1NFUl9QRVJGX0VOQUJMRURfS0VZIH0gZnJvbSAnLi4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgY3JlYXRlTmV3R3VpZCB9IGZyb20gJy4uL2NyeXB0by9Ccm93c2VyQ3J5cHRvLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBicm93c2VyIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IG1vZHVsZSBpZiBzZXNzaW9uIGZsYWcgaXMgZW5hYmxlZC4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGVyZk1lYXN1cmVtZW50TW9kdWxlKCkge1xyXG4gICAgbGV0IHNlc3Npb25TdG9yYWdlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZSA9IHdpbmRvd1tCcm93c2VyQ2FjaGVMb2NhdGlvbi5TZXNzaW9uU3RvcmFnZV07XHJcbiAgICAgICAgY29uc3QgcGVyZkVuYWJsZWQgPSBzZXNzaW9uU3RvcmFnZT8uZ2V0SXRlbShCUk9XU0VSX1BFUkZfRU5BQkxFRF9LRVkpO1xyXG4gICAgICAgIGlmIChOdW1iZXIocGVyZkVuYWJsZWQpID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbXBvcnQoJy4vQnJvd3NlclBlcmZvcm1hbmNlTWVhc3VyZW1lbnQubWpzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE11dGUgZXJyb3JzIGlmIGl0J3MgYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCBvciBjb29raWVzIGFyZSBibG9ja2VkLlxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHsgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgYnJvd3NlciBzdXBwb3J0cyB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgZnVuY3Rpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBzdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZU5vdygpIHtcclxuICAgIHJldHVybiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxyXG4gICAgICAgIHR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuICAgICAgICB0eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLm5vdyA9PT0gXCJmdW5jdGlvblwiKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBldmVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdXNpbmcgd2luZG93IHBlcmZvcm1hbmNlIEFQSSBpZiBhdmFpbGFibGUuIFJldHVybnMgdW5kZWZpbmVkIG90aGVyd2lzZS5cclxuICogQHBhcmFtIHN0YXJ0VGltZSB7RE9NSGlnaFJlc1RpbWVTdGFtcCB8IHVuZGVmaW5lZH1cclxuICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH1cclxuICovXHJcbmZ1bmN0aW9uIGdldFBlcmZEdXJhdGlvbk1zKHN0YXJ0VGltZSkge1xyXG4gICAgaWYgKCFzdGFydFRpbWUgfHwgIXN1cHBvcnRzQnJvd3NlclBlcmZvcm1hbmNlTm93KCkpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQod2luZG93LnBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcclxufVxyXG5jbGFzcyBCcm93c2VyUGVyZm9ybWFuY2VDbGllbnQgZXh0ZW5kcyBQZXJmb3JtYW5jZUNsaWVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uLCBpbnRGaWVsZHMsIGFiYnJldmlhdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLmF1dGguY2xpZW50SWQsIGNvbmZpZ3VyYXRpb24uYXV0aC5hdXRob3JpdHkgfHwgYCR7Q29uc3RhbnRzLkRFRkFVTFRfQVVUSE9SSVRZfWAsIG5ldyBMb2dnZXIoY29uZmlndXJhdGlvbi5zeXN0ZW0/LmxvZ2dlck9wdGlvbnMgfHwge30sIG5hbWUsIHZlcnNpb24pLCBuYW1lLCB2ZXJzaW9uLCBjb25maWd1cmF0aW9uLnRlbGVtZXRyeT8uYXBwbGljYXRpb24gfHwge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICBhcHBWZXJzaW9uOiBcIlwiLFxyXG4gICAgICAgIH0sIGludEZpZWxkcywgYWJicmV2aWF0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBnZW5lcmF0ZUlkKCkge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVOZXdHdWlkKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQYWdlVmlzaWJpbGl0eSgpIHtcclxuICAgICAgICByZXR1cm4gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPy50b1N0cmluZygpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBkZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKGluUHJvZ3Jlc3NFdmVudCkge1xyXG4gICAgICAgIHZvaWQgZ2V0UGVyZk1lYXN1cmVtZW50TW9kdWxlKCk/LnRoZW4oKG1vZHVsZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByb290RXZlbnQgPSB0aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQoaW5Qcm9ncmVzc0V2ZW50LmV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1Jvb3RFdmVudCA9IHJvb3RFdmVudCAmJlxyXG4gICAgICAgICAgICAgICAgcm9vdEV2ZW50LmV2ZW50SWQgPT09IGluUHJvZ3Jlc3NFdmVudC5ldmVudC5ldmVudElkO1xyXG4gICAgICAgICAgICBjb25zdCBpbmNvbXBsZXRlTWVhc3VyZW1lbnRzID0gW107XHJcbiAgICAgICAgICAgIGlmIChpc1Jvb3RFdmVudCAmJiByb290RXZlbnQ/LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHMpIHtcclxuICAgICAgICAgICAgICAgIHJvb3RFdmVudC5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzLmZvckVhY2goKHN1Yk1lYXN1cmVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5jb21wbGV0ZU1lYXN1cmVtZW50cy5wdXNoKHsgLi4uc3ViTWVhc3VyZW1lbnQgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCByZW1haW5pbmcgbWFya3MgZm9yIGluY29tcGxldGUgc3ViLW1lYXN1cmVtZW50c1xyXG4gICAgICAgICAgICBtb2R1bGUuQnJvd3NlclBlcmZvcm1hbmNlTWVhc3VyZW1lbnQuZmx1c2hNZWFzdXJlbWVudHMoaW5Qcm9ncmVzc0V2ZW50LmV2ZW50LmNvcnJlbGF0aW9uSWQsIGluY29tcGxldGVNZWFzdXJlbWVudHMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIGZvciBhIGdpdmVuIG9wZXJhdGlvbi4gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW5kIHRoZSBtZWFzdXJlbWVudC5cclxuICAgICAqIEFsc28gY2FwdHVyZXMgYnJvd3NlciBwYWdlIHZpc2liaWxpdHlTdGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BlcmZvcm1hbmNlRXZlbnRzfSBtZWFzdXJlTmFtZVxyXG4gICAgICogQHBhcmFtIHs/c3RyaW5nfSBbY29ycmVsYXRpb25JZF1cclxuICAgICAqIEByZXR1cm5zIHsoKGV2ZW50PzogUGFydGlhbDxQZXJmb3JtYW5jZUV2ZW50PikgPT4gUGVyZm9ybWFuY2VFdmVudHwgbnVsbCl9XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0TWVhc3VyZW1lbnQobWVhc3VyZU5hbWUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAvLyBDYXB0dXJlIHBhZ2UgdmlzaWJpbGl0eVN0YXRlIGFuZCB0aGVuIGludm9rZSBzdGFydC9lbmQgbWVhc3VyZW1lbnRcclxuICAgICAgICBjb25zdCBzdGFydFBhZ2VWaXNpYmlsaXR5ID0gdGhpcy5nZXRQYWdlVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgIGNvbnN0IGluUHJvZ3Jlc3NFdmVudCA9IHN1cGVyLnN0YXJ0TWVhc3VyZW1lbnQobWVhc3VyZU5hbWUsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN1cHBvcnRzQnJvd3NlclBlcmZvcm1hbmNlTm93KClcclxuICAgICAgICAgICAgPyB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgYnJvd3Nlck1lYXN1cmVtZW50ID0gZ2V0UGVyZk1lYXN1cmVtZW50TW9kdWxlKCk/LnRoZW4oKG1vZHVsZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IG1vZHVsZS5Ccm93c2VyUGVyZm9ybWFuY2VNZWFzdXJlbWVudChtZWFzdXJlTmFtZSwgaW5Qcm9ncmVzc0V2ZW50LmV2ZW50LmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZvaWQgYnJvd3Nlck1lYXN1cmVtZW50Py50aGVuKChtZWFzdXJlbWVudCkgPT4gbWVhc3VyZW1lbnQuc3RhcnRNZWFzdXJlbWVudCgpKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pblByb2dyZXNzRXZlbnQsXHJcbiAgICAgICAgICAgIGVuZDogKGV2ZW50LCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gaW5Qcm9ncmVzc0V2ZW50LmVuZCh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRQYWdlVmlzaWJpbGl0eSxcclxuICAgICAgICAgICAgICAgICAgICBlbmRQYWdlVmlzaWJpbGl0eTogdGhpcy5nZXRQYWdlVmlzaWJpbGl0eSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGdldFBlcmZEdXJhdGlvbk1zKHN0YXJ0VGltZSksXHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB2b2lkIGJyb3dzZXJNZWFzdXJlbWVudD8udGhlbigobWVhc3VyZW1lbnQpID0+IG1lYXN1cmVtZW50LmVuZE1lYXN1cmVtZW50KCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKGluUHJvZ3Jlc3NFdmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkaXNjYXJkOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpblByb2dyZXNzRXZlbnQuZGlzY2FyZCgpO1xyXG4gICAgICAgICAgICAgICAgdm9pZCBicm93c2VyTWVhc3VyZW1lbnQ/LnRoZW4oKG1lYXN1cmVtZW50KSA9PiBtZWFzdXJlbWVudC5mbHVzaE1lYXN1cmVtZW50KCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKGluUHJvZ3Jlc3NFdmVudCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBwcmUtcXVldWUgdGltZSB0byBwcmVRdWV1ZVRpbWVCeUNvcnJlbGF0aW9uSWQgbWFwLlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUV2ZW50c30gZXZlbnROYW1lXHJcbiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGNvcnJlbGF0aW9uSWRcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHNldFByZVF1ZXVlVGltZShldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICBpZiAoIXN1cHBvcnRzQnJvd3NlclBlcmZvcm1hbmNlTm93KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gc2V0IHRlbGVtZXRyeSBxdWV1ZSB0aW1lIGZvciAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtldmVudE5hbWV9IG5vdCBwcm92aWRlZCwgdW5hYmxlIHRvIHNldCB0ZWxlbWV0cnkgcXVldWUgdGltZWApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByZVF1ZXVlRXZlbnQgPSB0aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5nZXQoY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWFudWFsbHkgY29tcGxldGUgcXVldWUgbWVhc3VyZW1lbnQgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBwcmUtcXVldWUgZXZlbnQuXHJcbiAgICAgICAgICogSW5jb21wbGV0ZSBwcmUtcXVldWUgZXZlbnRzIGFyZSBpbnN0cnVtZW50YXRpb24gYnVncyB0aGF0IHNob3VsZCBiZSBmaXhlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAocHJlUXVldWVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShgQnJvd3NlclBlcmZvcm1hbmNlQ2xpZW50OiBJbmNvbXBsZXRlIHByZS1xdWV1ZSAke3ByZVF1ZXVlRXZlbnQubmFtZX0gZm91bmRgLCBjb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRRdWV1ZU1lYXN1cmVtZW50KHByZVF1ZXVlRXZlbnQubmFtZSwgY29ycmVsYXRpb25JZCwgdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcmVRdWV1ZVRpbWVCeUNvcnJlbGF0aW9uSWQuc2V0KGNvcnJlbGF0aW9uSWQsIHtcclxuICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxyXG4gICAgICAgICAgICB0aW1lOiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIGFkZHMgcXVldWUgdGltZSBtZWFzdXJlbWVudCBmb3IgZ2l2ZW4gcGVyZm9ybWFuY2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJmb3JtYW5jZUV2ZW50c30gZXZlbnROYW1lXHJcbiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGNvcnJlbGF0aW9uSWRcclxuICAgICAqIEBwYXJhbSB7P251bWJlcn0gcXVldWVUaW1lXHJcbiAgICAgKiBAcGFyYW0gez9ib29sZWFufSBtYW51YWxseUNvbXBsZXRlZCAtIGluZGljYXRvciBmb3IgbWFudWFsbHkgY29tcGxldGVkIHF1ZXVlIG1lYXN1cmVtZW50c1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgYWRkUXVldWVNZWFzdXJlbWVudChldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQsIHF1ZXVlVGltZSwgbWFudWFsbHlDb21wbGV0ZWQpIHtcclxuICAgICAgICBpZiAoIXN1cHBvcnRzQnJvd3NlclBlcmZvcm1hbmNlTm93KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50IGZvciAke2V2ZW50TmFtZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtldmVudE5hbWV9IG5vdCBwcm92aWRlZCwgdW5hYmxlIHRvIGFkZCBxdWV1ZSBtZWFzdXJlbWVudGApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByZVF1ZXVlVGltZSA9IHN1cGVyLmdldFByZVF1ZXVlVGltZShldmVudE5hbWUsIGNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICAgIGlmICghcHJlUXVldWVUaW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgICAgY29uc3QgcmVzUXVldWVUaW1lID0gcXVldWVUaW1lIHx8IHN1cGVyLmNhbGN1bGF0ZVF1ZXVlZFRpbWUocHJlUXVldWVUaW1lLCBjdXJyZW50VGltZSk7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmFkZFF1ZXVlTWVhc3VyZW1lbnQoZXZlbnROYW1lLCBjb3JyZWxhdGlvbklkLCByZXNRdWV1ZVRpbWUsIG1hbnVhbGx5Q29tcGxldGVkKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBCcm93c2VyUGVyZm9ybWFuY2VDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudC5tanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNC4xNi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCB7IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvci5tanMnO1xuaW1wb3J0IHsgQ29uc3RhbnRzLCBIZWFkZXJOYW1lcyB9IGZyb20gJy4uL3V0aWxzL0NvbnN0YW50cy5tanMnO1xuaW1wb3J0IHsgaW52YWxpZEF1dGhlbnRpY2F0aW9uSGVhZGVyLCBtaXNzaW5nTm9uY2VBdXRoZW50aWNhdGlvbkhlYWRlciB9IGZyb20gJy4uL2Vycm9yL0NsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzLm1qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0aGF0IHBhcnNlcyBzdXBwb3J0ZWQgSFRUUCByZXNwb25zZSBhdXRoZW50aWNhdGlvbiBoZWFkZXJzIHRvIGV4dHJhY3QgYW5kIHJldHVyblxyXG4gKiBoZWFkZXIgY2hhbGxlbmdlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIG91dHNpZGUgdGhlIGJhc2ljIGF1dGhvcml6YXRpb24gZmxvd3MuXHJcbiAqL1xyXG5jbGFzcyBBdXRoZW50aWNhdGlvbkhlYWRlclBhcnNlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBTSFIgbm9uY2UgdmFsdWUgb3V0IG9mIGVpdGhlciB0aGUgQXV0aGVudGljYXRpb24tSW5mbyBvciBXV1ctQXV0aGVudGljYXRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBnZXRTaHJOb25jZSgpIHtcclxuICAgICAgICAvLyBBdHRlbXB0IHRvIHBhcnNlIG5vbmNlIGZyb20gQXV0aGVudGlhY2F0aW9uLUluZm9cclxuICAgICAgICBjb25zdCBhdXRoZW50aWNhdGlvbkluZm8gPSB0aGlzLmhlYWRlcnNbSGVhZGVyTmFtZXMuQXV0aGVudGljYXRpb25JbmZvXTtcclxuICAgICAgICBpZiAoYXV0aGVudGljYXRpb25JbmZvKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uSW5mb0NoYWxsZW5nZXMgPSB0aGlzLnBhcnNlQ2hhbGxlbmdlcyhhdXRoZW50aWNhdGlvbkluZm8pO1xyXG4gICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb25JbmZvQ2hhbGxlbmdlcy5uZXh0bm9uY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhdXRoZW50aWNhdGlvbkluZm9DaGFsbGVuZ2VzLm5leHRub25jZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRXJyb3IoaW52YWxpZEF1dGhlbnRpY2F0aW9uSGVhZGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSBub25jZSBmcm9tIFdXVy1BdXRoZW50aWNhdGVcclxuICAgICAgICBjb25zdCB3d3dBdXRoZW50aWNhdGUgPSB0aGlzLmhlYWRlcnNbSGVhZGVyTmFtZXMuV1dXQXV0aGVudGljYXRlXTtcclxuICAgICAgICBpZiAod3d3QXV0aGVudGljYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHd3d0F1dGhlbnRpY2F0ZUNoYWxsZW5nZXMgPSB0aGlzLnBhcnNlQ2hhbGxlbmdlcyh3d3dBdXRoZW50aWNhdGUpO1xyXG4gICAgICAgICAgICBpZiAod3d3QXV0aGVudGljYXRlQ2hhbGxlbmdlcy5ub25jZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHd3d0F1dGhlbnRpY2F0ZUNoYWxsZW5nZXMubm9uY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yKGludmFsaWRBdXRoZW50aWNhdGlvbkhlYWRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIG5laXRoZXIgaGVhZGVyIGlzIHByZXNlbnQsIHRocm93IG1pc3NpbmcgaGVhZGVycyBlcnJvclxyXG4gICAgICAgIHRocm93IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25FcnJvcihtaXNzaW5nTm9uY2VBdXRoZW50aWNhdGlvbkhlYWRlcik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhbiBIVFRQIGhlYWRlcidzIGNoYWxsZW5nZSBzZXQgaW50byBhIGtleS92YWx1ZSBtYXAuXHJcbiAgICAgKiBAcGFyYW0gaGVhZGVyXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwYXJzZUNoYWxsZW5nZXMoaGVhZGVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1lU2VwYXJhdG9yID0gaGVhZGVyLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZXMgPSBoZWFkZXIuc3Vic3RyKHNjaGVtZVNlcGFyYXRvciArIDEpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBjb25zdCBjaGFsbGVuZ2VNYXAgPSB7fTtcclxuICAgICAgICBjaGFsbGVuZ2VzLmZvckVhY2goKGNoYWxsZW5nZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjaGFsbGVuZ2Uuc3BsaXQoXCI9XCIpO1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgZXNjYXBlZCBxdW90YXRpb24gbWFya3MgKCcsIFwiKSBmcm9tIGNoYWxsZW5nZSBzdHJpbmcgdG8ga2VlcCBvbmx5IHRoZSBjaGFsbGVuZ2UgdmFsdWVcclxuICAgICAgICAgICAgY2hhbGxlbmdlTWFwW2tleV0gPSB1bmVzY2FwZSh2YWx1ZS5yZXBsYWNlKC9bJ1wiXSsvZywgQ29uc3RhbnRzLkVNUFRZX1NUUklORykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBjaGFsbGVuZ2VNYXA7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQXV0aGVudGljYXRpb25IZWFkZXJQYXJzZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF1dGhlbnRpY2F0aW9uSGVhZGVyUGFyc2VyLm1qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1icm93c2VyIHYzLjI4LjEgMjAyNS0wMS0xNCAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0ICogYXMgQnJvd3NlclV0aWxzIGZyb20gJy4vdXRpbHMvQnJvd3NlclV0aWxzLm1qcyc7XG5leHBvcnQgeyBCcm93c2VyVXRpbHMgfTtcbmV4cG9ydCB7IFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLCBjcmVhdGVOZXN0YWJsZVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLCBjcmVhdGVTdGFuZGFyZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHAvUHVibGljQ2xpZW50QXBwbGljYXRpb24ubWpzJztcbmV4cG9ydCB7IFB1YmxpY0NsaWVudE5leHQgfSBmcm9tICcuL2FwcC9QdWJsaWNDbGllbnROZXh0Lm1qcyc7XG5leHBvcnQgeyBERUZBVUxUX0lGUkFNRV9USU1FT1VUX01TIH0gZnJvbSAnLi9jb25maWcvQ29uZmlndXJhdGlvbi5tanMnO1xuZXhwb3J0IHsgQXBpSWQsIEJyb3dzZXJDYWNoZUxvY2F0aW9uLCBDYWNoZUxvb2t1cFBvbGljeSwgSW50ZXJhY3Rpb25TdGF0dXMsIEludGVyYWN0aW9uVHlwZSwgV3JhcHBlclNLVSB9IGZyb20gJy4vdXRpbHMvQnJvd3NlckNvbnN0YW50cy5tanMnO1xuZXhwb3J0IHsgQnJvd3NlckF1dGhFcnJvciwgQnJvd3NlckF1dGhFcnJvck1lc3NhZ2UgfSBmcm9tICcuL2Vycm9yL0Jyb3dzZXJBdXRoRXJyb3IubWpzJztcbmV4cG9ydCB7IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvck1lc3NhZ2UgfSBmcm9tICcuL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLm1qcyc7XG5leHBvcnQgeyBzdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb24gfSBmcm9tICcuL2FwcC9JUHVibGljQ2xpZW50QXBwbGljYXRpb24ubWpzJztcbmV4cG9ydCB7IE5hdmlnYXRpb25DbGllbnQgfSBmcm9tICcuL25hdmlnYXRpb24vTmF2aWdhdGlvbkNsaWVudC5tanMnO1xuZXhwb3J0IHsgTWVtb3J5U3RvcmFnZSB9IGZyb20gJy4vY2FjaGUvTWVtb3J5U3RvcmFnZS5tanMnO1xuZXhwb3J0IHsgQnJvd3NlclN0b3JhZ2UgfSBmcm9tICcuL2NhY2hlL0Jyb3dzZXJTdG9yYWdlLm1qcyc7XG5leHBvcnQgeyBMb2NhbFN0b3JhZ2UgfSBmcm9tICcuL2NhY2hlL0xvY2FsU3RvcmFnZS5tanMnO1xuZXhwb3J0IHsgU2Vzc2lvblN0b3JhZ2UgfSBmcm9tICcuL2NhY2hlL1Nlc3Npb25TdG9yYWdlLm1qcyc7XG5leHBvcnQgeyBFdmVudE1lc3NhZ2VVdGlscyB9IGZyb20gJy4vZXZlbnQvRXZlbnRNZXNzYWdlLm1qcyc7XG5leHBvcnQgeyBFdmVudFR5cGUgfSBmcm9tICcuL2V2ZW50L0V2ZW50VHlwZS5tanMnO1xuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi9ldmVudC9FdmVudEhhbmRsZXIubWpzJztcbmV4cG9ydCB7IFNpZ25lZEh0dHBSZXF1ZXN0IH0gZnJvbSAnLi9jcnlwdG8vU2lnbmVkSHR0cFJlcXVlc3QubWpzJztcbmV4cG9ydCB7IEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudCB9IGZyb20gJy4vdGVsZW1ldHJ5L0Jyb3dzZXJQZXJmb3JtYW5jZUNsaWVudC5tanMnO1xuZXhwb3J0IHsgQnJvd3NlclBlcmZvcm1hbmNlTWVhc3VyZW1lbnQgfSBmcm9tICcuL3RlbGVtZXRyeS9Ccm93c2VyUGVyZm9ybWFuY2VNZWFzdXJlbWVudC5tanMnO1xuZXhwb3J0IHsgQWNjb3VudEVudGl0eSwgQXV0aEVycm9yLCBBdXRoRXJyb3JDb2RlcywgQXV0aEVycm9yTWVzc2FnZSwgQXV0aGVudGljYXRpb25IZWFkZXJQYXJzZXIsIEF1dGhlbnRpY2F0aW9uU2NoZW1lLCBBenVyZUNsb3VkSW5zdGFuY2UsIENsaWVudEF1dGhFcnJvciwgQ2xpZW50QXV0aEVycm9yQ29kZXMsIENsaWVudEF1dGhFcnJvck1lc3NhZ2UsIENsaWVudENvbmZpZ3VyYXRpb25FcnJvciwgQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yQ29kZXMsIENsaWVudENvbmZpZ3VyYXRpb25FcnJvck1lc3NhZ2UsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IsIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3JDb2RlcywgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2UsIEpzb25XZWJUb2tlblR5cGVzLCBMb2dMZXZlbCwgTG9nZ2VyLCBPSURDX0RFRkFVTFRfU0NPUEVTLCBQZXJmb3JtYW5jZUV2ZW50cywgUHJvbXB0VmFsdWUsIFByb3RvY29sTW9kZSwgU2VydmVyRXJyb3IsIFNlcnZlclJlc3BvbnNlVHlwZSwgU3RyaW5nVXRpbHMsIFN0dWJQZXJmb3JtYW5jZUNsaWVudCwgVXJsU3RyaW5nIH0gZnJvbSAnQGF6dXJlL21zYWwtY29tbW9uL2Jyb3dzZXInO1xuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vcGFja2FnZU1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgKiBhcyBCcm93c2VyQXV0aEVycm9yQ29kZXMgZnJvbSAnLi9lcnJvci9Ccm93c2VyQXV0aEVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IEJyb3dzZXJBdXRoRXJyb3JDb2RlcyB9O1xuaW1wb3J0ICogYXMgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3JDb2RlcyBmcm9tICcuL2Vycm9yL0Jyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMubWpzJztcbmV4cG9ydCB7IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8616\n')},8675:(I,g,n)=>{"use strict";I.exports=n.p+"dcf54727e1982cf56604.png"},9033:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (India) [en-in]\n//! author : Jatin Agrawal : https://github.com/jatinag22\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enIn = moment.defineLocale('en-in', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY h:mm A',\n LLLL: 'dddd, D MMMM YYYY h:mm A',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 1st is the first week of the year.\n },\n });\n\n return enIn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAzMy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qcz9lYzJlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJbmRpYSkgW2VuLWluXVxuLy8hIGF1dGhvciA6IEphdGluIEFncmF3YWwgOiBodHRwczovL2dpdGh1Yi5jb20vamF0aW5hZzIyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWluJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkluO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9033\n")},9423:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n A: () => (/* binding */ es)\n});\n\n;// ./node_modules/symbol-observable/es/ponyfill.js\nfunction symbolObservablePonyfill(root) {\n\tvar result;\n\tvar Symbol = root.Symbol;\n\n\tif (typeof Symbol === 'function') {\n\t\tif (Symbol.observable) {\n\t\t\tresult = Symbol.observable;\n\t\t} else {\n\t\t\tresult = Symbol('observable');\n\t\t\tSymbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n\n;// ./node_modules/symbol-observable/es/index.js\n/* module decorator */ module = __webpack_require__.hmd(module);\n/* global window */\n\n\nvar root;\n\nif (typeof self !== 'undefined') {\n root = self;\n} else if (typeof window !== 'undefined') {\n root = window;\n} else if (typeof __webpack_require__.g !== 'undefined') {\n root = __webpack_require__.g;\n} else if (true) {\n root = module;\n} else // removed by dead control flow\n{}\n\nvar result = symbolObservablePonyfill(root);\n/* harmony default export */ const es = (result);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQyMy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9lcy9wb255ZmlsbC5qcz80OGI1Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL2luZGV4LmpzPzZjMjAiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9423\n")},9516:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar bind = __webpack_require__(69012);\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return Array.isArray(val);\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return toString.call(val) === '[object FormData]';\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return toString.call(val) === '[object URLSearchParams]';\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUxNi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcz9jNTMyIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWwpIHtcbiAgaWYgKHRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiBwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdJztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnRyaW0gPyBzdHIudHJpbSgpIDogc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKi9cbmZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOYXRpdmVTY3JpcHQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOUycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuKSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKGEsIGIsIHRoaXNBcmcpIHtcbiAgZm9yRWFjaChiLCBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0aGlzQXJnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuZnVuY3Rpb24gc3RyaXBCT00oY29udGVudCkge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0OiBpc1BsYWluT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtOiBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1N0YW5kYXJkQnJvd3NlckVudjogaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRyaW06IHRyaW0sXG4gIHN0cmlwQk9NOiBzdHJpcEJPTVxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9516\n")},9638:(I,g,n)=>{"use strict";I.exports=n.p+"24cc0f2102ee345623cd.png"},9743:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Konkani Devanagari script [gom-deva]\n//! author : The Discoverer : https://github.com/WikiDiscoverer\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n var format = {\n s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],\n ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],\n m: ['एका मिणटान', 'एक मिनूट'],\n mm: [number + ' मिणटांनी', number + ' मिणटां'],\n h: ['एका वरान', 'एक वर'],\n hh: [number + ' वरांनी', number + ' वरां'],\n d: ['एका दिसान', 'एक दीस'],\n dd: [number + ' दिसांनी', number + ' दीस'],\n M: ['एका म्हयन्यान', 'एक म्हयनो'],\n MM: [number + ' म्हयन्यानी', number + ' म्हयने'],\n y: ['एका वर्सान', 'एक वर्स'],\n yy: [number + ' वर्सांनी', number + ' वर्सां'],\n };\n return isFuture ? format[key][0] : format[key][1];\n }\n\n var gomDeva = moment.defineLocale('gom-deva', {\n months: {\n standalone:\n 'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(\n '_'\n ),\n format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(\n '_'\n ),\n isFormat: /MMMM(\\s)+D[oD]?/,\n },\n monthsShort:\n 'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),\n weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),\n weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'A h:mm [वाजतां]',\n LTS: 'A h:mm:ss [वाजतां]',\n L: 'DD-MM-YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY A h:mm [वाजतां]',\n LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',\n llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',\n },\n calendar: {\n sameDay: '[आयज] LT',\n nextDay: '[फाल्यां] LT',\n nextWeek: '[फुडलो] dddd[,] LT',\n lastDay: '[काल] LT',\n lastWeek: '[फाटलो] dddd[,] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s',\n past: '%s आदीं',\n s: processRelativeTime,\n ss: processRelativeTime,\n m: processRelativeTime,\n mm: processRelativeTime,\n h: processRelativeTime,\n hh: processRelativeTime,\n d: processRelativeTime,\n dd: processRelativeTime,\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(वेर)/,\n ordinal: function (number, period) {\n switch (period) {\n // the ordinal 'वेर' only applies to day of the month\n case 'D':\n return number + 'वेर';\n default:\n case 'M':\n case 'Q':\n case 'DDD':\n case 'd':\n case 'w':\n case 'W':\n return number;\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week\n doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)\n },\n meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'राती') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'सकाळीं') {\n return hour;\n } else if (meridiem === 'दनपारां') {\n return hour > 12 ? hour : hour + 12;\n } else if (meridiem === 'सांजे') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'राती';\n } else if (hour < 12) {\n return 'सकाळीं';\n } else if (hour < 16) {\n return 'दनपारां';\n } else if (hour < 20) {\n return 'सांजे';\n } else {\n return 'राती';\n }\n },\n });\n\n return gomDeva;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTc0My5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1kZXZhLmpzP2FhZjIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtvbmthbmkgRGV2YW5hZ2FyaSBzY3JpcHQgW2dvbS1kZXZhXVxuLy8hIGF1dGhvciA6IFRoZSBEaXNjb3ZlcmVyIDogaHR0cHM6Ly9naXRodWIuY29tL1dpa2lEaXNjb3ZlcmVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyfgpKXgpYvgpKHgpK/gpL4g4KS44KWF4KSV4KSC4KSh4KS+4KSC4KSo4KWAJywgJ+CkpeCli+CkoeClhyDgpLjgpYXgpJXgpILgpKEnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyDgpLjgpYXgpJXgpILgpKHgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkuOClheCkleCkguCkoSddLFxuICAgICAgICAgICAgbTogWyfgpI/gpJXgpL4g4KSu4KS/4KSj4KSf4KS+4KSoJywgJ+Ckj+CklSDgpK7gpL/gpKjgpYLgpJ8nXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyDgpK7gpL/gpKPgpJ/gpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkruCkv+Cko+Ckn+CkvuCkgiddLFxuICAgICAgICAgICAgaDogWyfgpI/gpJXgpL4g4KS14KSw4KS+4KSoJywgJ+Ckj+CklSDgpLXgpLAnXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyDgpLXgpLDgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkteCksOCkvuCkgiddLFxuICAgICAgICAgICAgZDogWyfgpI/gpJXgpL4g4KSm4KS/4KS44KS+4KSoJywgJ+Ckj+CklSDgpKbgpYDgpLgnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyDgpKbgpL/gpLjgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkpuClgOCkuCddLFxuICAgICAgICAgICAgTTogWyfgpI/gpJXgpL4g4KSu4KWN4KS54KSv4KSo4KWN4KSv4KS+4KSoJywgJ+Ckj+CklSDgpK7gpY3gpLngpK/gpKjgpYsnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyDgpK7gpY3gpLngpK/gpKjgpY3gpK/gpL7gpKjgpYAnLCBudW1iZXIgKyAnIOCkruCljeCkueCkr+CkqOClhyddLFxuICAgICAgICAgICAgeTogWyfgpI/gpJXgpL4g4KS14KSw4KWN4KS44KS+4KSoJywgJ+Ckj+CklSDgpLXgpLDgpY3gpLgnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyDgpLXgpLDgpY3gpLjgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkteCksOCljeCkuOCkvuCkgiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBnb21EZXZhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ29tLWRldmEnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KWA4KSyX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSy4KSvX+CkkeCkl+CkuOCljeCkn1/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLBf4KSR4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkteCljeCkueClh+CkguCkrOCksF/gpKHgpL/gpLjgpYfgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWA4KSa4KWN4KSv4KS+X+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgOCkmuCljeCkr+Ckvl/gpK7gpL7gpLDgpY3gpJrgpL7gpJrgpY3gpK/gpL5f4KSP4KSq4KWN4KSw4KWA4KSy4KS+4KSa4KWN4KSv4KS+X+CkruClh+Ckr+CkvuCkmuCljeCkr+Ckvl/gpJzgpYLgpKjgpL7gpJrgpY3gpK/gpL5f4KSc4KWB4KSy4KSv4KS+4KSa4KWN4KSv4KS+X+CkkeCkl+CkuOCljeCkn+CkvuCkmuCljeCkr+Ckvl/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSR4KSV4KWN4KSf4KWL4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkqOCli+CkteCljeCkueClh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvl/gpKHgpL/gpLjgpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvTU1NTShcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkvuCkqOClhy5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KWALl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksi5f4KSR4KSXLl/gpLjgpKrgpY3gpJ/gpYfgpIIuX+CkkeCkleCljeCkn+Cliy5f4KSo4KWL4KS14KWN4KS54KWH4KSCLl/gpKHgpL/gpLjgpYfgpIIuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSG4KSv4KSk4KS+4KSwX+CkuOCli+CkruCkvuCksF/gpK7gpILgpJfgpLPgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+CkrOCkv+CksOClh+CkuOCljeCkpOCkvuCksF/gpLjgpYHgpJXgpY3gpLDgpL7gpLBf4KS24KWH4KSo4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSG4KSv4KSkLl/gpLjgpYvgpK4uX+CkruCkguCkl+Cksy5f4KSs4KWB4KSnLl/gpKzgpY3gpLDgpYfgpLjgpY3gpKQuX+CkuOClgeCkleCljeCksC5f4KS24KWH4KSoLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpIZf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSs4KWN4KSw4KWHX+CkuOClgV/gpLbgpYcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBEbywgWVlZWSwgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVksIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCkr+CknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpKvgpL7gpLLgpY3gpK/gpL7gpIJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+Ckq+ClgeCkoeCksuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkleCkvuCksl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSr4KS+4KSf4KSy4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkhuCkpuClgOCkgicsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjgpLXgpYfgpLApLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFsICfgpLXgpYfgpLAnIG9ubHkgYXBwbGllcyB0byBkYXkgb2YgdGhlIG1vbnRoXG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4KS14KWH4KSwJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcbiAgICAgICAgICAgIGRveTogMywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICg3ICsgMCAtIDQpXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKTgpYB84KS44KSV4KS+4KSz4KWA4KSCfOCkpuCkqOCkquCkvuCksOCkvuCkgnzgpLjgpL7gpILgpJzgpYcvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpJXgpL7gpLPgpYDgpIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KSo4KSq4KS+4KSw4KS+4KSCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID4gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkguCknOClhycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgOCkgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KSo4KSq4KS+4KSw4KS+4KSCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpILgpJzgpYcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ29tRGV2YTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9743\n")},10482:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t pad: function (data, blockSize) {\n\t // Add 0x80 byte\n\t data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t // Zero pad the rest\n\t CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t },\n\n\t unpad: function (data) {\n\t // Remove zero padding\n\t CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t // Remove one more byte -- the 0x80 byte\n\t data.sigBytes--;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso97971;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0ODIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvcGFkLWlzbzk3OTcxLmpzPzhjZWYiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogSVNPL0lFQyA5Nzk3LTEgUGFkZGluZyBNZXRob2QgMi5cblx0ICovXG5cdENyeXB0b0pTLnBhZC5Jc285Nzk3MSA9IHtcblx0ICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgIC8vIEFkZCAweDgwIGJ5dGVcblx0ICAgICAgICBkYXRhLmNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHg4MDAwMDAwMF0sIDEpKTtcblxuXHQgICAgICAgIC8vIFplcm8gcGFkIHRoZSByZXN0XG5cdCAgICAgICAgQ3J5cHRvSlMucGFkLlplcm9QYWRkaW5nLnBhZChkYXRhLCBibG9ja1NpemUpO1xuXHQgICAgfSxcblxuXHQgICAgdW5wYWQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgLy8gUmVtb3ZlIHplcm8gcGFkZGluZ1xuXHQgICAgICAgIENyeXB0b0pTLnBhZC5aZXJvUGFkZGluZy51bnBhZChkYXRhKTtcblxuXHQgICAgICAgIC8vIFJlbW92ZSBvbmUgbW9yZSBieXRlIC0tIHRoZSAweDgwIGJ5dGVcblx0ICAgICAgICBkYXRhLnNpZ0J5dGVzLS07XG5cdCAgICB9XG5cdH07XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMucGFkLklzbzk3OTcxO1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10482\n")},10540:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n branch: () => (/* binding */ branch),\n componentFromProp: () => (/* binding */ componentFromProp),\n componentFromStream: () => (/* binding */ componentFromStream),\n componentFromStreamWithConfig: () => (/* binding */ componentFromStreamWithConfig),\n compose: () => (/* binding */ compose),\n createEventHandler: () => (/* binding */ createEventHandler),\n createEventHandlerWithConfig: () => (/* binding */ createEventHandlerWithConfig),\n createSink: () => (/* binding */ createSink),\n defaultProps: () => (/* binding */ defaultProps),\n flattenProp: () => (/* binding */ flattenProp),\n fromRenderProps: () => (/* binding */ fromRenderProps),\n getContext: () => (/* binding */ getContext),\n getDisplayName: () => (/* binding */ getDisplayName),\n hoistStatics: () => (/* binding */ hoistStatics),\n isClassComponent: () => (/* binding */ isClassComponent),\n lifecycle: () => (/* binding */ lifecycle),\n mapProps: () => (/* binding */ mapProps),\n mapPropsStream: () => (/* binding */ mapPropsStream),\n mapPropsStreamWithConfig: () => (/* binding */ mapPropsStreamWithConfig),\n nest: () => (/* binding */ nest),\n onlyUpdateForKeys: () => (/* binding */ onlyUpdateForKeys),\n onlyUpdateForPropTypes: () => (/* binding */ onlyUpdateForPropTypes),\n pure: () => (/* binding */ pure),\n renameProp: () => (/* binding */ renameProp),\n renameProps: () => (/* binding */ renameProps),\n renderComponent: () => (/* binding */ renderComponent),\n renderNothing: () => (/* binding */ renderNothing),\n setDisplayName: () => (/* binding */ setDisplayName),\n setObservableConfig: () => (/* binding */ configureObservable),\n setPropTypes: () => (/* binding */ setPropTypes),\n setStatic: () => (/* binding */ setStatic),\n shallowEqual: () => (/* reexport */ (shallowEqual_default())),\n shouldUpdate: () => (/* binding */ shouldUpdate),\n toClass: () => (/* binding */ toClass),\n toRenderProps: () => (/* binding */ toRenderProps),\n withContext: () => (/* binding */ withContext),\n withHandlers: () => (/* binding */ withHandlers),\n withProps: () => (/* binding */ withProps),\n withPropsOnChange: () => (/* binding */ withPropsOnChange),\n withReducer: () => (/* binding */ withReducer),\n withState: () => (/* binding */ withState),\n withStateHandlers: () => (/* binding */ withStateHandlers),\n wrapDisplayName: () => (/* binding */ wrapDisplayName)\n});\n\n// EXTERNAL MODULE: consume shared module (default) react@^17.0.2 (singleton) (fallback: ./node_modules/react/index.js) (eager)\nvar index_js_eager_ = __webpack_require__(24002);\nvar index_js_eager_default = /*#__PURE__*/__webpack_require__.n(index_js_eager_);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(58168);\n// EXTERNAL MODULE: ./node_modules/fbjs/lib/shallowEqual.js\nvar shallowEqual = __webpack_require__(48940);\nvar shallowEqual_default = /*#__PURE__*/__webpack_require__.n(shallowEqual);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js + 1 modules\nvar inheritsLoose = __webpack_require__(25540);\n;// ./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n // Call this.constructor.gDSFP to support sub-classes.\n var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n if (state !== null && state !== undefined) {\n this.setState(state);\n }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n // Call this.constructor.gDSFP to support sub-classes.\n // Use the setState() updater to ensure state isn't stale in certain edge cases.\n function updater(prevState) {\n var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n return state !== null && state !== undefined ? state : null;\n }\n // Binding \"this\" is important for shallow renderer support.\n this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n try {\n var prevProps = this.props;\n var prevState = this.state;\n this.props = nextProps;\n this.state = nextState;\n this.__reactInternalSnapshotFlag = true;\n this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n prevProps,\n prevState\n );\n } finally {\n this.props = prevProps;\n this.state = prevState;\n }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n var prototype = Component.prototype;\n\n if (!prototype || !prototype.isReactComponent) {\n throw new Error('Can only polyfill class components');\n }\n\n if (\n typeof Component.getDerivedStateFromProps !== 'function' &&\n typeof prototype.getSnapshotBeforeUpdate !== 'function'\n ) {\n return Component;\n }\n\n // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n // Error if any of these lifecycles are present,\n // Because they would work differently between older and newer (16.3+) versions of React.\n var foundWillMountName = null;\n var foundWillReceivePropsName = null;\n var foundWillUpdateName = null;\n if (typeof prototype.componentWillMount === 'function') {\n foundWillMountName = 'componentWillMount';\n } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n foundWillMountName = 'UNSAFE_componentWillMount';\n }\n if (typeof prototype.componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'componentWillReceiveProps';\n } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n }\n if (typeof prototype.componentWillUpdate === 'function') {\n foundWillUpdateName = 'componentWillUpdate';\n } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n }\n if (\n foundWillMountName !== null ||\n foundWillReceivePropsName !== null ||\n foundWillUpdateName !== null\n ) {\n var componentName = Component.displayName || Component.name;\n var newApiName =\n typeof Component.getDerivedStateFromProps === 'function'\n ? 'getDerivedStateFromProps()'\n : 'getSnapshotBeforeUpdate()';\n\n throw Error(\n 'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n componentName +\n ' uses ' +\n newApiName +\n ' but also contains the following legacy lifecycles:' +\n (foundWillMountName !== null ? '\\n ' + foundWillMountName : '') +\n (foundWillReceivePropsName !== null\n ? '\\n ' + foundWillReceivePropsName\n : '') +\n (foundWillUpdateName !== null ? '\\n ' + foundWillUpdateName : '') +\n '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n 'https://fb.me/react-async-component-lifecycle-hooks'\n );\n }\n\n // React <= 16.2 does not support static getDerivedStateFromProps.\n // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n // Newer versions of React will ignore these lifecycles if gDSFP exists.\n if (typeof Component.getDerivedStateFromProps === 'function') {\n prototype.componentWillMount = componentWillMount;\n prototype.componentWillReceiveProps = componentWillReceiveProps;\n }\n\n // React <= 16.2 does not support getSnapshotBeforeUpdate.\n // As a workaround, use cWU to invoke the new lifecycle.\n // Newer versions of React will ignore that lifecycle if gSBU exists.\n if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n if (typeof prototype.componentDidUpdate !== 'function') {\n throw new Error(\n 'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n );\n }\n\n prototype.componentWillUpdate = componentWillUpdate;\n\n var componentDidUpdate = prototype.componentDidUpdate;\n\n prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n prevProps,\n prevState,\n maybeSnapshot\n ) {\n // 16.3+ will not execute our will-update method;\n // It will pass a snapshot value to did-update though.\n // Older versions will require our polyfilled will-update value.\n // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n // Because for <= 15.x versions this might be a \"prevContext\" object.\n // We also can't just check \"__reactInternalSnapshot\",\n // Because get-snapshot might return a falsy value.\n // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n var snapshot = this.__reactInternalSnapshotFlag\n ? this.__reactInternalSnapshot\n : maybeSnapshot;\n\n componentDidUpdate.call(this, prevProps, prevState, snapshot);\n };\n }\n\n return Component;\n}\n\n\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nvar objectWithoutPropertiesLoose = __webpack_require__(98587);\n// EXTERNAL MODULE: ./node_modules/recompose/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(87939);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n// EXTERNAL MODULE: ./node_modules/change-emitter/lib/index.js\nvar lib = __webpack_require__(39606);\n// EXTERNAL MODULE: ./node_modules/symbol-observable/es/index.js + 1 modules\nvar es = __webpack_require__(9423);\n;// ./node_modules/recompose/dist/Recompose.esm.js\n\n\n\n\n\n\n\n\n\n\nvar setStatic = function setStatic(key, value) {\n return function (BaseComponent) {\n /* eslint-disable no-param-reassign */\n BaseComponent[key] = value;\n /* eslint-enable no-param-reassign */\n\n return BaseComponent;\n };\n};\n\nvar setDisplayName = function setDisplayName(displayName) {\n return setStatic('displayName', displayName);\n};\n\nvar getDisplayName = function getDisplayName(Component$$1) {\n if (typeof Component$$1 === 'string') {\n return Component$$1;\n }\n\n if (!Component$$1) {\n return undefined;\n }\n\n return Component$$1.displayName || Component$$1.name || 'Component';\n};\n\nvar wrapDisplayName = function wrapDisplayName(BaseComponent, hocName) {\n return hocName + \"(\" + getDisplayName(BaseComponent) + \")\";\n};\n\nvar mapProps = function mapProps(propsMapper) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var MapProps = function MapProps(props) {\n return factory(propsMapper(props));\n };\n\n if (false) // removed by dead control flow\n{}\n\n return MapProps;\n };\n};\n\nvar withProps = function withProps(input) {\n var hoc = mapProps(function (props) {\n return (0,esm_extends/* default */.A)({}, props, typeof input === 'function' ? input(props) : input);\n });\n\n if (false) // removed by dead control flow\n{}\n\n return hoc;\n};\n\nvar pick = function pick(obj, keys) {\n var result = {};\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (obj.hasOwnProperty(key)) {\n result[key] = obj[key];\n }\n }\n\n return result;\n};\n\nvar withPropsOnChange = function withPropsOnChange(shouldMapOrKeys, propsMapper) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n var shouldMap = typeof shouldMapOrKeys === 'function' ? shouldMapOrKeys : function (props, nextProps) {\n return !shallowEqual_default()(pick(props, shouldMapOrKeys), pick(nextProps, shouldMapOrKeys));\n };\n\n var WithPropsOnChange =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithPropsOnChange, _Component);\n\n function WithPropsOnChange() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {\n computedProps: propsMapper(_this.props),\n prevProps: _this.props\n };\n return _this;\n }\n\n WithPropsOnChange.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n if (shouldMap(prevState.prevProps, nextProps)) {\n return {\n computedProps: propsMapper(nextProps),\n prevProps: nextProps\n };\n }\n\n return {\n prevProps: nextProps\n };\n };\n\n var _proto = WithPropsOnChange.prototype;\n\n _proto.render = function render() {\n return factory((0,esm_extends/* default */.A)({}, this.props, this.state.computedProps));\n };\n\n return WithPropsOnChange;\n }(index_js_eager_.Component);\n\n polyfill(WithPropsOnChange);\n\n if (false) // removed by dead control flow\n{}\n\n return WithPropsOnChange;\n };\n};\n\nvar mapValues = function mapValues(obj, func) {\n var result = {};\n /* eslint-disable no-restricted-syntax */\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n result[key] = func(obj[key], key);\n }\n }\n /* eslint-enable no-restricted-syntax */\n\n\n return result;\n};\n\nvar withHandlers = function withHandlers(handlers) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var WithHandlers =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithHandlers, _Component);\n\n function WithHandlers() {\n var _this;\n\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(_args)) || this;\n _this.handlers = mapValues(typeof handlers === 'function' ? handlers(_this.props) : handlers, function (createHandler) {\n return function () {\n var handler = createHandler(_this.props);\n\n if (false) // removed by dead control flow\n{}\n\n return handler.apply(void 0, arguments);\n };\n });\n return _this;\n }\n\n var _proto = WithHandlers.prototype;\n\n _proto.render = function render() {\n return factory((0,esm_extends/* default */.A)({}, this.props, this.handlers));\n };\n\n return WithHandlers;\n }(index_js_eager_.Component);\n\n if (false) // removed by dead control flow\n{}\n\n return WithHandlers;\n };\n};\n\nvar defaultProps = function defaultProps(props) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var DefaultProps = function DefaultProps(ownerProps) {\n return factory(ownerProps);\n };\n\n DefaultProps.defaultProps = props;\n\n if (false) // removed by dead control flow\n{}\n\n return DefaultProps;\n };\n};\n\nvar omit = function omit(obj, keys) {\n var rest = (0,esm_extends/* default */.A)({}, obj);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (rest.hasOwnProperty(key)) {\n delete rest[key];\n }\n }\n\n return rest;\n};\n\nvar renameProp = function renameProp(oldName, newName) {\n var hoc = mapProps(function (props) {\n var _extends2;\n\n return (0,esm_extends/* default */.A)({}, omit(props, [oldName]), (_extends2 = {}, _extends2[newName] = props[oldName], _extends2));\n });\n\n if (false) // removed by dead control flow\n{}\n\n return hoc;\n};\n\nvar keys = Object.keys;\n\nvar mapKeys = function mapKeys(obj, func) {\n return keys(obj).reduce(function (result, key) {\n var val = obj[key];\n /* eslint-disable no-param-reassign */\n\n result[func(val, key)] = val;\n /* eslint-enable no-param-reassign */\n\n return result;\n }, {});\n};\n\nvar renameProps = function renameProps(nameMap) {\n var hoc = mapProps(function (props) {\n return (0,esm_extends/* default */.A)({}, omit(props, keys(nameMap)), mapKeys(pick(props, keys(nameMap)), function (_, oldName) {\n return nameMap[oldName];\n }));\n });\n\n if (false) // removed by dead control flow\n{}\n\n return hoc;\n};\n\nvar flattenProp = function flattenProp(propName) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var FlattenProp = function FlattenProp(props) {\n return factory((0,esm_extends/* default */.A)({}, props, props[propName]));\n };\n\n if (false) // removed by dead control flow\n{}\n\n return FlattenProp;\n };\n};\n\nvar withState = function withState(stateName, stateUpdaterName, initialState) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var WithState =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithState, _Component);\n\n function WithState() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {\n stateValue: typeof initialState === 'function' ? initialState(_this.props) : initialState\n };\n\n _this.updateStateValue = function (updateFn, callback) {\n return _this.setState(function (_ref) {\n var stateValue = _ref.stateValue;\n return {\n stateValue: typeof updateFn === 'function' ? updateFn(stateValue) : updateFn\n };\n }, callback);\n };\n\n return _this;\n }\n\n var _proto = WithState.prototype;\n\n _proto.render = function render() {\n var _extends2;\n\n return factory((0,esm_extends/* default */.A)({}, this.props, (_extends2 = {}, _extends2[stateName] = this.state.stateValue, _extends2[stateUpdaterName] = this.updateStateValue, _extends2)));\n };\n\n return WithState;\n }(index_js_eager_.Component);\n\n if (false) // removed by dead control flow\n{}\n\n return WithState;\n };\n};\n\nvar withStateHandlers = function withStateHandlers(initialState, stateUpdaters) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var WithStateHandlers =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithStateHandlers, _Component);\n\n function WithStateHandlers() {\n var _this;\n\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(_args)) || this;\n _this.state = typeof initialState === 'function' ? initialState(_this.props) : initialState;\n _this.stateUpdaters = mapValues(stateUpdaters, function (handler) {\n return function (mayBeEvent) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n // Having that functional form of setState can be called async\n // we need to persist SyntheticEvent\n if (mayBeEvent && typeof mayBeEvent.persist === 'function') {\n mayBeEvent.persist();\n }\n\n _this.setState(function (state, props) {\n return handler(state, props).apply(void 0, [mayBeEvent].concat(args));\n });\n };\n });\n return _this;\n }\n\n var _proto = WithStateHandlers.prototype;\n\n _proto.render = function render() {\n return factory((0,esm_extends/* default */.A)({}, this.props, this.state, this.stateUpdaters));\n };\n\n return WithStateHandlers;\n }(index_js_eager_.Component);\n\n if (false) // removed by dead control flow\n{}\n\n return WithStateHandlers;\n };\n};\n\nvar noop = function noop() {};\n\nvar withReducer = function withReducer(stateName, dispatchName, reducer, initialState) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var WithReducer =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithReducer, _Component);\n\n function WithReducer() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {\n stateValue: _this.initializeStateValue()\n };\n\n _this.dispatch = function (action, callback) {\n if (callback === void 0) {\n callback = noop;\n }\n\n return _this.setState(function (_ref) {\n var stateValue = _ref.stateValue;\n return {\n stateValue: reducer(stateValue, action)\n };\n }, function () {\n return callback(_this.state.stateValue);\n });\n };\n\n return _this;\n }\n\n var _proto = WithReducer.prototype;\n\n _proto.initializeStateValue = function initializeStateValue() {\n if (initialState !== undefined) {\n return typeof initialState === 'function' ? initialState(this.props) : initialState;\n }\n\n return reducer(undefined, {\n type: '@@recompose/INIT'\n });\n };\n\n _proto.render = function render() {\n var _extends2;\n\n return factory((0,esm_extends/* default */.A)({}, this.props, (_extends2 = {}, _extends2[stateName] = this.state.stateValue, _extends2[dispatchName] = this.dispatch, _extends2)));\n };\n\n return WithReducer;\n }(index_js_eager_.Component);\n\n if (false) // removed by dead control flow\n{}\n\n return WithReducer;\n };\n};\n\nvar identity = function identity(Component$$1) {\n return Component$$1;\n};\n\nvar branch = function branch(test, left, right) {\n if (right === void 0) {\n right = identity;\n }\n\n return function (BaseComponent) {\n var leftFactory;\n var rightFactory;\n\n var Branch = function Branch(props) {\n if (test(props)) {\n leftFactory = leftFactory || (0,index_js_eager_.createFactory)(left(BaseComponent));\n return leftFactory(props);\n }\n\n rightFactory = rightFactory || (0,index_js_eager_.createFactory)(right(BaseComponent));\n return rightFactory(props);\n };\n\n if (false) // removed by dead control flow\n{}\n\n return Branch;\n };\n};\n\nvar renderComponent = function renderComponent(Component$$1) {\n return function (_) {\n var factory = (0,index_js_eager_.createFactory)(Component$$1);\n\n var RenderComponent = function RenderComponent(props) {\n return factory(props);\n };\n\n if (false) // removed by dead control flow\n{}\n\n return RenderComponent;\n };\n};\n\nvar Nothing =\n/*#__PURE__*/\nfunction (_Component) {\n (0,inheritsLoose/* default */.A)(Nothing, _Component);\n\n function Nothing() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = Nothing.prototype;\n\n _proto.render = function render() {\n return null;\n };\n\n return Nothing;\n}(index_js_eager_.Component);\n\nvar renderNothing = function renderNothing(_) {\n return Nothing;\n};\n\nvar shouldUpdate = function shouldUpdate(test) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var ShouldUpdate =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(ShouldUpdate, _Component);\n\n function ShouldUpdate() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = ShouldUpdate.prototype;\n\n _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return test(this.props, nextProps);\n };\n\n _proto.render = function render() {\n return factory(this.props);\n };\n\n return ShouldUpdate;\n }(index_js_eager_.Component);\n\n if (false) // removed by dead control flow\n{}\n\n return ShouldUpdate;\n };\n};\n\nvar pure = function pure(BaseComponent) {\n var hoc = shouldUpdate(function (props, nextProps) {\n return !shallowEqual_default()(props, nextProps);\n });\n\n if (false) // removed by dead control flow\n{}\n\n return hoc(BaseComponent);\n};\n\nvar onlyUpdateForKeys = function onlyUpdateForKeys(propKeys) {\n var hoc = shouldUpdate(function (props, nextProps) {\n return !shallowEqual_default()(pick(nextProps, propKeys), pick(props, propKeys));\n });\n\n if (false) // removed by dead control flow\n{}\n\n return hoc;\n};\n\nvar onlyUpdateForPropTypes = function onlyUpdateForPropTypes(BaseComponent) {\n var propTypes = BaseComponent.propTypes;\n\n if (false) // removed by dead control flow\n{}\n\n var propKeys = Object.keys(propTypes || {});\n var OnlyUpdateForPropTypes = onlyUpdateForKeys(propKeys)(BaseComponent);\n\n if (false) // removed by dead control flow\n{}\n\n return OnlyUpdateForPropTypes;\n};\n\nvar withContext = function withContext(childContextTypes, getChildContext) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var WithContext =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(WithContext, _Component);\n\n function WithContext() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n\n _this.getChildContext = function () {\n return getChildContext(_this.props);\n };\n\n return _this;\n }\n\n var _proto = WithContext.prototype;\n\n _proto.render = function render() {\n return factory(this.props);\n };\n\n return WithContext;\n }(index_js_eager_.Component);\n\n WithContext.childContextTypes = childContextTypes;\n\n if (false) // removed by dead control flow\n{}\n\n return WithContext;\n };\n};\n\nvar getContext = function getContext(contextTypes) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n var GetContext = function GetContext(ownerProps, context) {\n return factory((0,esm_extends/* default */.A)({}, ownerProps, context));\n };\n\n GetContext.contextTypes = contextTypes;\n\n if (false) // removed by dead control flow\n{}\n\n return GetContext;\n };\n};\n\nvar lifecycle = function lifecycle(spec) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n\n if (false) // removed by dead control flow\n{}\n\n var Lifecycle =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(Lifecycle, _Component);\n\n function Lifecycle() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = Lifecycle.prototype;\n\n _proto.render = function render() {\n return factory((0,esm_extends/* default */.A)({}, this.props, this.state));\n };\n\n return Lifecycle;\n }(index_js_eager_.Component);\n\n Object.keys(spec).forEach(function (hook) {\n return Lifecycle.prototype[hook] = spec[hook];\n });\n\n if (false) // removed by dead control flow\n{}\n\n return Lifecycle;\n };\n};\n\nvar isClassComponent = function isClassComponent(Component$$1) {\n return Boolean(Component$$1 && Component$$1.prototype && typeof Component$$1.prototype.render === 'function');\n};\n\nvar toClass = function toClass(baseComponent) {\n var _class, _temp;\n\n return isClassComponent(baseComponent) ? baseComponent : (_temp = _class =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(ToClass, _Component);\n\n function ToClass() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = ToClass.prototype;\n\n _proto.render = function render() {\n if (typeof baseComponent === 'string') {\n return index_js_eager_default().createElement(baseComponent, this.props);\n }\n\n return baseComponent(this.props, this.context);\n };\n\n return ToClass;\n }(index_js_eager_.Component), _class.displayName = getDisplayName(baseComponent), _class.propTypes = baseComponent.propTypes, _class.contextTypes = baseComponent.contextTypes, _class.defaultProps = baseComponent.defaultProps, _temp);\n};\n\nfunction toRenderProps(hoc) {\n var RenderPropsComponent = function RenderPropsComponent(props) {\n return props.children(props);\n };\n\n return hoc(RenderPropsComponent);\n}\n\nvar fromRenderProps = function fromRenderProps(RenderPropsComponent, propsMapper, renderPropName) {\n if (renderPropName === void 0) {\n renderPropName = 'children';\n }\n\n return function (BaseComponent) {\n var baseFactory = index_js_eager_default().createFactory(BaseComponent);\n var renderPropsFactory = index_js_eager_default().createFactory(RenderPropsComponent);\n\n var FromRenderProps = function FromRenderProps(ownerProps) {\n var _renderPropsFactory;\n\n return renderPropsFactory((_renderPropsFactory = {}, _renderPropsFactory[renderPropName] = function () {\n return baseFactory((0,esm_extends/* default */.A)({}, ownerProps, propsMapper.apply(void 0, arguments)));\n }, _renderPropsFactory));\n };\n\n if (false) // removed by dead control flow\n{}\n\n return FromRenderProps;\n };\n};\n\nvar setPropTypes = function setPropTypes(propTypes) {\n return setStatic('propTypes', propTypes);\n};\n\nvar compose = function compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n }, function (arg) {\n return arg;\n });\n};\n\nvar createSink = function createSink(callback) {\n var Sink =\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(Sink, _Component);\n\n function Sink() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {};\n return _this;\n }\n\n Sink.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps) {\n callback(nextProps);\n return null;\n };\n\n var _proto = Sink.prototype;\n\n _proto.render = function render() {\n return null;\n };\n\n return Sink;\n }(index_js_eager_.Component);\n\n polyfill(Sink);\n return Sink;\n};\n\nvar componentFromProp = function componentFromProp(propName) {\n var Component$$1 = function Component$$1(props) {\n return (0,index_js_eager_.createElement)(props[propName], omit(props, [propName]));\n };\n\n Component$$1.displayName = \"componentFromProp(\" + propName + \")\";\n return Component$$1;\n};\n\nvar nest = function nest() {\n for (var _len = arguments.length, Components = new Array(_len), _key = 0; _key < _len; _key++) {\n Components[_key] = arguments[_key];\n }\n\n var factories = Components.map(index_js_eager_.createFactory);\n\n var Nest = function Nest(_ref) {\n var children = _ref.children,\n props = (0,objectWithoutPropertiesLoose/* default */.A)(_ref, [\"children\"]);\n\n return factories.reduceRight(function (child, factory) {\n return factory(props, child);\n }, children);\n };\n\n if (false) // removed by dead control flow\n{ var displayNames; }\n\n return Nest;\n};\n\nvar hoistStatics = function hoistStatics(higherOrderComponent, blacklist) {\n return function (BaseComponent) {\n var NewComponent = higherOrderComponent(BaseComponent);\n hoist_non_react_statics_cjs_default()(NewComponent, BaseComponent, blacklist);\n return NewComponent;\n };\n};\n\nvar _config = {\n fromESObservable: null,\n toESObservable: null\n};\n\nvar configureObservable = function configureObservable(c) {\n _config = c;\n};\n\nvar config = {\n fromESObservable: function fromESObservable(observable) {\n return typeof _config.fromESObservable === 'function' ? _config.fromESObservable(observable) : observable;\n },\n toESObservable: function toESObservable(stream) {\n return typeof _config.toESObservable === 'function' ? _config.toESObservable(stream) : stream;\n }\n};\n\nvar componentFromStreamWithConfig = function componentFromStreamWithConfig(config$$1) {\n return function (propsToVdom) {\n return (\n /*#__PURE__*/\n function (_Component) {\n (0,inheritsLoose/* default */.A)(ComponentFromStream, _Component);\n\n function ComponentFromStream() {\n var _config$fromESObserva;\n\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {\n vdom: null\n };\n _this.propsEmitter = (0,lib/* createChangeEmitter */.F)();\n _this.props$ = config$$1.fromESObservable((_config$fromESObserva = {\n subscribe: function subscribe(observer) {\n var unsubscribe = _this.propsEmitter.listen(function (props) {\n if (props) {\n observer.next(props);\n } else {\n observer.complete();\n }\n });\n\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _config$fromESObserva[es/* default */.A] = function () {\n return this;\n }, _config$fromESObserva));\n _this.vdom$ = config$$1.toESObservable(propsToVdom(_this.props$));\n return _this;\n }\n\n var _proto = ComponentFromStream.prototype;\n\n _proto.componentWillMount = function componentWillMount() {\n var _this2 = this;\n\n // Subscribe to child prop changes so we know when to re-render\n this.subscription = this.vdom$.subscribe({\n next: function next(vdom) {\n _this2.setState({\n vdom: vdom\n });\n }\n });\n this.propsEmitter.emit(this.props);\n };\n\n _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n // Receive new props from the owner\n this.propsEmitter.emit(nextProps);\n };\n\n _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {\n return nextState.vdom !== this.state.vdom;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n // Call without arguments to complete stream\n this.propsEmitter.emit(); // Clean-up subscription before un-mounting\n\n this.subscription.unsubscribe();\n };\n\n _proto.render = function render() {\n return this.state.vdom;\n };\n\n return ComponentFromStream;\n }(index_js_eager_.Component)\n );\n };\n};\n\nvar componentFromStream = function componentFromStream(propsToVdom) {\n return componentFromStreamWithConfig(config)(propsToVdom);\n};\n\nvar identity$1 = function identity(t) {\n return t;\n};\n\nvar mapPropsStreamWithConfig = function mapPropsStreamWithConfig(config$$1) {\n var componentFromStream$$1 = componentFromStreamWithConfig({\n fromESObservable: identity$1,\n toESObservable: identity$1\n });\n return function (transform) {\n return function (BaseComponent) {\n var factory = (0,index_js_eager_.createFactory)(BaseComponent);\n var fromESObservable = config$$1.fromESObservable,\n toESObservable = config$$1.toESObservable;\n return componentFromStream$$1(function (props$) {\n var _ref;\n\n return _ref = {\n subscribe: function subscribe(observer) {\n var subscription = toESObservable(transform(fromESObservable(props$))).subscribe({\n next: function next(childProps) {\n return observer.next(factory(childProps));\n }\n });\n return {\n unsubscribe: function unsubscribe() {\n return subscription.unsubscribe();\n }\n };\n }\n }, _ref[es/* default */.A] = function () {\n return this;\n }, _ref;\n });\n };\n };\n};\n\nvar mapPropsStream = function mapPropsStream(transform) {\n var hoc = mapPropsStreamWithConfig(config)(transform);\n\n if (false) // removed by dead control flow\n{}\n\n return hoc;\n};\n\nvar createEventHandlerWithConfig = function createEventHandlerWithConfig(config$$1) {\n return function () {\n var _config$fromESObserva;\n\n var emitter = (0,lib/* createChangeEmitter */.F)();\n var stream = config$$1.fromESObservable((_config$fromESObserva = {\n subscribe: function subscribe(observer) {\n var unsubscribe = emitter.listen(function (value) {\n return observer.next(value);\n });\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _config$fromESObserva[es/* default */.A] = function () {\n return this;\n }, _config$fromESObserva));\n return {\n handler: emitter.emit,\n stream: stream\n };\n };\n};\nvar createEventHandler = createEventHandlerWithConfig(config);\n\n// Higher-order component helpers\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1NDAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQvcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQuZXMuanM/NTQyMiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWNvbXBvc2UvZGlzdC9SZWNvbXBvc2UuZXNtLmpzPzc4NzEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gIC8vIENhbGwgdGhpcy5jb25zdHJ1Y3Rvci5nRFNGUCB0byBzdXBwb3J0IHN1Yi1jbGFzc2VzLlxuICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgaWYgKHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAvLyBDYWxsIHRoaXMuY29uc3RydWN0b3IuZ0RTRlAgdG8gc3VwcG9ydCBzdWItY2xhc3Nlcy5cbiAgLy8gVXNlIHRoZSBzZXRTdGF0ZSgpIHVwZGF0ZXIgdG8gZW5zdXJlIHN0YXRlIGlzbid0IHN0YWxlIGluIGNlcnRhaW4gZWRnZSBjYXNlcy5cbiAgZnVuY3Rpb24gdXBkYXRlcihwcmV2U3RhdGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZSA6IG51bGw7XG4gIH1cbiAgLy8gQmluZGluZyBcInRoaXNcIiBpcyBpbXBvcnRhbnQgZm9yIHNoYWxsb3cgcmVuZGVyZXIgc3VwcG9ydC5cbiAgdGhpcy5zZXRTdGF0ZSh1cGRhdGVyLmJpbmQodGhpcykpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gIHRyeSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHByZXZTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgdGhpcy5wcm9wcyA9IG5leHRQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgIHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnID0gdHJ1ZTtcbiAgICB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90ID0gdGhpcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5wcm9wcyA9IHByZXZQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gcHJldlN0YXRlO1xuICB9XG59XG5cbi8vIFJlYWN0IG1heSB3YXJuIGFib3V0IGNXTS9jV1JQL2NXVSBtZXRob2RzIGJlaW5nIGRlcHJlY2F0ZWQuXG4vLyBBZGQgYSBmbGFnIHRvIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGZvciB0aGlzIHNwZWNpYWwgY2FzZS5cbmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcbmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuXG5mdW5jdGlvbiBwb2x5ZmlsbChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgaWYgKCFwcm90b3R5cGUgfHwgIXByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBwb2x5ZmlsbCBjbGFzcyBjb21wb25lbnRzJyk7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH1cblxuICAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gIC8vIEVycm9yIGlmIGFueSBvZiB0aGVzZSBsaWZlY3ljbGVzIGFyZSBwcmVzZW50LFxuICAvLyBCZWNhdXNlIHRoZXkgd291bGQgd29yayBkaWZmZXJlbnRseSBiZXR3ZWVuIG9sZGVyIGFuZCBuZXdlciAoMTYuMyspIHZlcnNpb25zIG9mIFJlYWN0LlxuICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgfVxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICB9XG4gIGlmIChcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHxcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbFxuICApIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZTtcbiAgICB2YXIgbmV3QXBpTmFtZSA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSdcbiAgICAgICAgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICtcbiAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICcgdXNlcyAnICtcbiAgICAgICAgbmV3QXBpTmFtZSArXG4gICAgICAgICcgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczonICtcbiAgICAgICAgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJykgK1xuICAgICAgICAoZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbFxuICAgICAgICAgID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWVcbiAgICAgICAgICA6ICcnKSArXG4gICAgICAgIChmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJykgK1xuICAgICAgICAnXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArXG4gICAgICAgICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IDw9IDE2LjIgZG9lcyBub3Qgc3VwcG9ydCBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV00gYW5kIGNXUlAgdG8gaW52b2tlIHRoZSBuZXcgc3RhdGljIGxpZmVjeWNsZS5cbiAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgUmVhY3Qgd2lsbCBpZ25vcmUgdGhlc2UgbGlmZWN5Y2xlcyBpZiBnRFNGUCBleGlzdHMuXG4gIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBjb21wb25lbnRXaWxsTW91bnQ7XG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuICB9XG5cbiAgLy8gUmVhY3QgPD0gMTYuMiBkb2VzIG5vdCBzdXBwb3J0IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV1UgdG8gaW52b2tlIHRoZSBuZXcgbGlmZWN5Y2xlLlxuICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBSZWFjdCB3aWxsIGlnbm9yZSB0aGF0IGxpZmVjeWNsZSBpZiBnU0JVIGV4aXN0cy5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwb2x5ZmlsbCBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGZvciBjb21wb25lbnRzIHRoYXQgZG8gbm90IGRlZmluZSBjb21wb25lbnREaWRVcGRhdGUoKSBvbiB0aGUgcHJvdG90eXBlJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGNvbXBvbmVudFdpbGxVcGRhdGU7XG5cbiAgICB2YXIgY29tcG9uZW50RGlkVXBkYXRlID0gcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZTtcblxuICAgIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGVQb2x5ZmlsbChcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZSxcbiAgICAgIG1heWJlU25hcHNob3RcbiAgICApIHtcbiAgICAgIC8vIDE2LjMrIHdpbGwgbm90IGV4ZWN1dGUgb3VyIHdpbGwtdXBkYXRlIG1ldGhvZDtcbiAgICAgIC8vIEl0IHdpbGwgcGFzcyBhIHNuYXBzaG90IHZhbHVlIHRvIGRpZC11cGRhdGUgdGhvdWdoLlxuICAgICAgLy8gT2xkZXIgdmVyc2lvbnMgd2lsbCByZXF1aXJlIG91ciBwb2x5ZmlsbGVkIHdpbGwtdXBkYXRlIHZhbHVlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgYm90aCBjYXNlcywgYnV0IGNhbid0IGp1c3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBcIm1heWJlU25hcHNob3RcIixcbiAgICAgIC8vIEJlY2F1c2UgZm9yIDw9IDE1LnggdmVyc2lvbnMgdGhpcyBtaWdodCBiZSBhIFwicHJldkNvbnRleHRcIiBvYmplY3QuXG4gICAgICAvLyBXZSBhbHNvIGNhbid0IGp1c3QgY2hlY2sgXCJfX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFwiLFxuICAgICAgLy8gQmVjYXVzZSBnZXQtc25hcHNob3QgbWlnaHQgcmV0dXJuIGEgZmFsc3kgdmFsdWUuXG4gICAgICAvLyBTbyBjaGVjayBmb3IgdGhlIGV4cGxpY2l0IF9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZyBmbGFnIHRvIGRldGVybWluZSBiZWhhdmlvci5cbiAgICAgIHZhciBzbmFwc2hvdCA9IHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnXG4gICAgICAgID8gdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFxuICAgICAgICA6IG1heWJlU25hcHNob3Q7XG5cbiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZS5jYWxsKHRoaXMsIHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB7IHBvbHlmaWxsIH07XG4iLCJpbXBvcnQgUmVhY3QsIHsgY3JlYXRlRmFjdG9yeSwgQ29tcG9uZW50LCBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdmYmpzL2xpYi9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0IHsgcG9seWZpbGwgfSBmcm9tICdyZWFjdC1saWZlY3ljbGVzLWNvbXBhdCc7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgY3JlYXRlQ2hhbmdlRW1pdHRlciB9IGZyb20gJ2NoYW5nZS1lbWl0dGVyJztcbmltcG9ydCAkJG9ic2VydmFibGUgZnJvbSAnc3ltYm9sLW9ic2VydmFibGUnO1xuXG52YXIgc2V0U3RhdGljID0gZnVuY3Rpb24gc2V0U3RhdGljKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50KSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICBCYXNlQ29tcG9uZW50W2tleV0gPSB2YWx1ZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbiAgICByZXR1cm4gQmFzZUNvbXBvbmVudDtcbiAgfTtcbn07XG5cbnZhciBzZXREaXNwbGF5TmFtZSA9IGZ1bmN0aW9uIHNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKSB7XG4gIHJldHVybiBzZXRTdGF0aWMoJ2Rpc3BsYXlOYW1lJywgZGlzcGxheU5hbWUpO1xufTtcblxudmFyIGdldERpc3BsYXlOYW1lID0gZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoQ29tcG9uZW50JCQxKSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50JCQxID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDb21wb25lbnQkJDE7XG4gIH1cblxuICBpZiAoIUNvbXBvbmVudCQkMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gQ29tcG9uZW50JCQxLmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudCQkMS5uYW1lIHx8ICdDb21wb25lbnQnO1xufTtcblxudmFyIHdyYXBEaXNwbGF5TmFtZSA9IGZ1bmN0aW9uIHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCBob2NOYW1lKSB7XG4gIHJldHVybiBob2NOYW1lICsgXCIoXCIgKyBnZXREaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50KSArIFwiKVwiO1xufTtcblxudmFyIG1hcFByb3BzID0gZnVuY3Rpb24gbWFwUHJvcHMocHJvcHNNYXBwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50KSB7XG4gICAgdmFyIGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KEJhc2VDb21wb25lbnQpO1xuXG4gICAgdmFyIE1hcFByb3BzID0gZnVuY3Rpb24gTWFwUHJvcHMocHJvcHMpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KHByb3BzTWFwcGVyKHByb3BzKSk7XG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdtYXBQcm9wcycpKShNYXBQcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hcFByb3BzO1xuICB9O1xufTtcblxudmFyIHdpdGhQcm9wcyA9IGZ1bmN0aW9uIHdpdGhQcm9wcyhpbnB1dCkge1xuICB2YXIgaG9jID0gbWFwUHJvcHMoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCBwcm9wcywgdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nID8gaW5wdXQocHJvcHMpIDogaW5wdXQpO1xuICB9KTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHNldERpc3BsYXlOYW1lKHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCAnd2l0aFByb3BzJykpKGhvYyhCYXNlQ29tcG9uZW50KSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBob2M7XG59O1xuXG52YXIgcGljayA9IGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIHdpdGhQcm9wc09uQ2hhbmdlID0gZnVuY3Rpb24gd2l0aFByb3BzT25DaGFuZ2Uoc2hvdWxkTWFwT3JLZXlzLCBwcm9wc01hcHBlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoQmFzZUNvbXBvbmVudCk7XG4gICAgdmFyIHNob3VsZE1hcCA9IHR5cGVvZiBzaG91bGRNYXBPcktleXMgPT09ICdmdW5jdGlvbicgPyBzaG91bGRNYXBPcktleXMgOiBmdW5jdGlvbiAocHJvcHMsIG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuICFzaGFsbG93RXF1YWwocGljayhwcm9wcywgc2hvdWxkTWFwT3JLZXlzKSwgcGljayhuZXh0UHJvcHMsIHNob3VsZE1hcE9yS2V5cykpO1xuICAgIH07XG5cbiAgICB2YXIgV2l0aFByb3BzT25DaGFuZ2UgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoV2l0aFByb3BzT25DaGFuZ2UsIF9Db21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBXaXRoUHJvcHNPbkNoYW5nZSgpIHtcbiAgICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICBjb21wdXRlZFByb3BzOiBwcm9wc01hcHBlcihfdGhpcy5wcm9wcyksXG4gICAgICAgICAgcHJldlByb3BzOiBfdGhpcy5wcm9wc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9XG5cbiAgICAgIFdpdGhQcm9wc09uQ2hhbmdlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBpZiAoc2hvdWxkTWFwKHByZXZTdGF0ZS5wcmV2UHJvcHMsIG5leHRQcm9wcykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcHV0ZWRQcm9wczogcHJvcHNNYXBwZXIobmV4dFByb3BzKSxcbiAgICAgICAgICAgIHByZXZQcm9wczogbmV4dFByb3BzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJldlByb3BzOiBuZXh0UHJvcHNcbiAgICAgICAgfTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBfcHJvdG8gPSBXaXRoUHJvcHNPbkNoYW5nZS5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5KF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB0aGlzLnN0YXRlLmNvbXB1dGVkUHJvcHMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBXaXRoUHJvcHNPbkNoYW5nZTtcbiAgICB9KENvbXBvbmVudCk7XG5cbiAgICBwb2x5ZmlsbChXaXRoUHJvcHNPbkNoYW5nZSk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIHNldERpc3BsYXlOYW1lKHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCAnd2l0aFByb3BzT25DaGFuZ2UnKSkoV2l0aFByb3BzT25DaGFuZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBXaXRoUHJvcHNPbkNoYW5nZTtcbiAgfTtcbn07XG5cbnZhciBtYXBWYWx1ZXMgPSBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqLCBmdW5jKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGZ1bmMob2JqW2tleV0sIGtleSk7XG4gICAgfVxuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cblxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgd2l0aEhhbmRsZXJzID0gZnVuY3Rpb24gd2l0aEhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeShCYXNlQ29tcG9uZW50KTtcblxuICAgIHZhciBXaXRoSGFuZGxlcnMgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoV2l0aEhhbmRsZXJzLCBfQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gV2l0aEhhbmRsZXJzKCkge1xuICAgICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIF9hcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChfYXJncykpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZXJzID0gbWFwVmFsdWVzKHR5cGVvZiBoYW5kbGVycyA9PT0gJ2Z1bmN0aW9uJyA/IGhhbmRsZXJzKF90aGlzLnByb3BzKSA6IGhhbmRsZXJzLCBmdW5jdGlvbiAoY3JlYXRlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGNyZWF0ZUhhbmRsZXIoX3RoaXMucHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgJ3dpdGhIYW5kbGVycygpOiBFeHBlY3RlZCBhIG1hcCBvZiBoaWdoZXItb3JkZXIgZnVuY3Rpb25zLiAnICsgJ1JlZmVyIHRvIHRoZSBkb2NzIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3Byb3RvID0gV2l0aEhhbmRsZXJzLnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkoX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHRoaXMuaGFuZGxlcnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBXaXRoSGFuZGxlcnM7XG4gICAgfShDb21wb25lbnQpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ3dpdGhIYW5kbGVycycpKShXaXRoSGFuZGxlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBXaXRoSGFuZGxlcnM7XG4gIH07XG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdFByb3BzKHByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeShCYXNlQ29tcG9uZW50KTtcblxuICAgIHZhciBEZWZhdWx0UHJvcHMgPSBmdW5jdGlvbiBEZWZhdWx0UHJvcHMob3duZXJQcm9wcykge1xuICAgICAgcmV0dXJuIGZhY3Rvcnkob3duZXJQcm9wcyk7XG4gICAgfTtcblxuICAgIERlZmF1bHRQcm9wcy5kZWZhdWx0UHJvcHMgPSBwcm9wcztcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdkZWZhdWx0UHJvcHMnKSkoRGVmYXVsdFByb3BzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGVmYXVsdFByb3BzO1xuICB9O1xufTtcblxudmFyIG9taXQgPSBmdW5jdGlvbiBvbWl0KG9iaiwga2V5cykge1xuICB2YXIgcmVzdCA9IF9leHRlbmRzKHt9LCBvYmopO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgaWYgKHJlc3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgZGVsZXRlIHJlc3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdDtcbn07XG5cbnZhciByZW5hbWVQcm9wID0gZnVuY3Rpb24gcmVuYW1lUHJvcChvbGROYW1lLCBuZXdOYW1lKSB7XG4gIHZhciBob2MgPSBtYXBQcm9wcyhmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCBvbWl0KHByb3BzLCBbb2xkTmFtZV0pLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltuZXdOYW1lXSA9IHByb3BzW29sZE5hbWVdLCBfZXh0ZW5kczIpKTtcbiAgfSk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ3JlbmFtZVByb3AnKSkoaG9jKEJhc2VDb21wb25lbnQpKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGhvYztcbn07XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG5cbnZhciBtYXBLZXlzID0gZnVuY3Rpb24gbWFwS2V5cyhvYmosIGZ1bmMpIHtcbiAgcmV0dXJuIGtleXMob2JqKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwga2V5KSB7XG4gICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbiAgICByZXN1bHRbZnVuYyh2YWwsIGtleSldID0gdmFsO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcbn07XG5cbnZhciByZW5hbWVQcm9wcyA9IGZ1bmN0aW9uIHJlbmFtZVByb3BzKG5hbWVNYXApIHtcbiAgdmFyIGhvYyA9IG1hcFByb3BzKGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgb21pdChwcm9wcywga2V5cyhuYW1lTWFwKSksIG1hcEtleXMocGljayhwcm9wcywga2V5cyhuYW1lTWFwKSksIGZ1bmN0aW9uIChfLCBvbGROYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZU1hcFtvbGROYW1lXTtcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdyZW5hbWVQcm9wcycpKShob2MoQmFzZUNvbXBvbmVudCkpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gaG9jO1xufTtcblxudmFyIGZsYXR0ZW5Qcm9wID0gZnVuY3Rpb24gZmxhdHRlblByb3AocHJvcE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50KSB7XG4gICAgdmFyIGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KEJhc2VDb21wb25lbnQpO1xuXG4gICAgdmFyIEZsYXR0ZW5Qcm9wID0gZnVuY3Rpb24gRmxhdHRlblByb3AocHJvcHMpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KF9leHRlbmRzKHt9LCBwcm9wcywgcHJvcHNbcHJvcE5hbWVdKSk7XG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdmbGF0dGVuUHJvcCcpKShGbGF0dGVuUHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEZsYXR0ZW5Qcm9wO1xuICB9O1xufTtcblxudmFyIHdpdGhTdGF0ZSA9IGZ1bmN0aW9uIHdpdGhTdGF0ZShzdGF0ZU5hbWUsIHN0YXRlVXBkYXRlck5hbWUsIGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoQmFzZUNvbXBvbmVudCk7XG5cbiAgICB2YXIgV2l0aFN0YXRlID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0c0xvb3NlKFdpdGhTdGF0ZSwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFdpdGhTdGF0ZSgpIHtcbiAgICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICBzdGF0ZVZhbHVlOiB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nID8gaW5pdGlhbFN0YXRlKF90aGlzLnByb3BzKSA6IGluaXRpYWxTdGF0ZVxuICAgICAgICB9O1xuXG4gICAgICAgIF90aGlzLnVwZGF0ZVN0YXRlVmFsdWUgPSBmdW5jdGlvbiAodXBkYXRlRm4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgICB2YXIgc3RhdGVWYWx1ZSA9IF9yZWYuc3RhdGVWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN0YXRlVmFsdWU6IHR5cGVvZiB1cGRhdGVGbiA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZUZuKHN0YXRlVmFsdWUpIDogdXBkYXRlRm5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIF9wcm90byA9IFdpdGhTdGF0ZS5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgcmV0dXJuIGZhY3RvcnkoX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3N0YXRlTmFtZV0gPSB0aGlzLnN0YXRlLnN0YXRlVmFsdWUsIF9leHRlbmRzMltzdGF0ZVVwZGF0ZXJOYW1lXSA9IHRoaXMudXBkYXRlU3RhdGVWYWx1ZSwgX2V4dGVuZHMyKSkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFdpdGhTdGF0ZTtcbiAgICB9KENvbXBvbmVudCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIHNldERpc3BsYXlOYW1lKHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCAnd2l0aFN0YXRlJykpKFdpdGhTdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFdpdGhTdGF0ZTtcbiAgfTtcbn07XG5cbnZhciB3aXRoU3RhdGVIYW5kbGVycyA9IGZ1bmN0aW9uIHdpdGhTdGF0ZUhhbmRsZXJzKGluaXRpYWxTdGF0ZSwgc3RhdGVVcGRhdGVycykge1xuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoQmFzZUNvbXBvbmVudCk7XG5cbiAgICB2YXIgV2l0aFN0YXRlSGFuZGxlcnMgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoV2l0aFN0YXRlSGFuZGxlcnMsIF9Db21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBXaXRoU3RhdGVIYW5kbGVycygpIHtcbiAgICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBfYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoX2FyZ3MpKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgPyBpbml0aWFsU3RhdGUoX3RoaXMucHJvcHMpIDogaW5pdGlhbFN0YXRlO1xuICAgICAgICBfdGhpcy5zdGF0ZVVwZGF0ZXJzID0gbWFwVmFsdWVzKHN0YXRlVXBkYXRlcnMsIGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtYXlCZUV2ZW50KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYXZpbmcgdGhhdCBmdW5jdGlvbmFsIGZvcm0gb2Ygc2V0U3RhdGUgY2FuIGJlIGNhbGxlZCBhc3luY1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBwZXJzaXN0IFN5bnRoZXRpY0V2ZW50XG4gICAgICAgICAgICBpZiAobWF5QmVFdmVudCAmJiB0eXBlb2YgbWF5QmVFdmVudC5wZXJzaXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG1heUJlRXZlbnQucGVyc2lzdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUsIHByb3BzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHN0YXRlLCBwcm9wcykuYXBwbHkodm9pZCAwLCBbbWF5QmVFdmVudF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBXaXRoU3RhdGVIYW5kbGVycy5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5KF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB0aGlzLnN0YXRlLCB0aGlzLnN0YXRlVXBkYXRlcnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBXaXRoU3RhdGVIYW5kbGVycztcbiAgICB9KENvbXBvbmVudCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIHNldERpc3BsYXlOYW1lKHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCAnd2l0aFN0YXRlSGFuZGxlcnMnKSkoV2l0aFN0YXRlSGFuZGxlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBXaXRoU3RhdGVIYW5kbGVycztcbiAgfTtcbn07XG5cbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuXG52YXIgd2l0aFJlZHVjZXIgPSBmdW5jdGlvbiB3aXRoUmVkdWNlcihzdGF0ZU5hbWUsIGRpc3BhdGNoTmFtZSwgcmVkdWNlciwgaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeShCYXNlQ29tcG9uZW50KTtcblxuICAgIHZhciBXaXRoUmVkdWNlciA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShXaXRoUmVkdWNlciwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFdpdGhSZWR1Y2VyKCkge1xuICAgICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgIHN0YXRlVmFsdWU6IF90aGlzLmluaXRpYWxpemVTdGF0ZVZhbHVlKClcbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gbm9vcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZVZhbHVlID0gX3JlZi5zdGF0ZVZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3RhdGVWYWx1ZTogcmVkdWNlcihzdGF0ZVZhbHVlLCBhY3Rpb24pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhfdGhpcy5zdGF0ZS5zdGF0ZVZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBXaXRoUmVkdWNlci5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5pbml0aWFsaXplU3RhdGVWYWx1ZSA9IGZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZVZhbHVlKCkge1xuICAgICAgICBpZiAoaW5pdGlhbFN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IGluaXRpYWxTdGF0ZSh0aGlzLnByb3BzKSA6IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgICAgIHR5cGU6ICdAQHJlY29tcG9zZS9JTklUJ1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgcmV0dXJuIGZhY3RvcnkoX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3N0YXRlTmFtZV0gPSB0aGlzLnN0YXRlLnN0YXRlVmFsdWUsIF9leHRlbmRzMltkaXNwYXRjaE5hbWVdID0gdGhpcy5kaXNwYXRjaCwgX2V4dGVuZHMyKSkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFdpdGhSZWR1Y2VyO1xuICAgIH0oQ29tcG9uZW50KTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICd3aXRoUmVkdWNlcicpKShXaXRoUmVkdWNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFdpdGhSZWR1Y2VyO1xuICB9O1xufTtcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoQ29tcG9uZW50JCQxKSB7XG4gIHJldHVybiBDb21wb25lbnQkJDE7XG59O1xuXG52YXIgYnJhbmNoID0gZnVuY3Rpb24gYnJhbmNoKHRlc3QsIGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChyaWdodCA9PT0gdm9pZCAwKSB7XG4gICAgcmlnaHQgPSBpZGVudGl0eTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBsZWZ0RmFjdG9yeTtcbiAgICB2YXIgcmlnaHRGYWN0b3J5O1xuXG4gICAgdmFyIEJyYW5jaCA9IGZ1bmN0aW9uIEJyYW5jaChwcm9wcykge1xuICAgICAgaWYgKHRlc3QocHJvcHMpKSB7XG4gICAgICAgIGxlZnRGYWN0b3J5ID0gbGVmdEZhY3RvcnkgfHwgY3JlYXRlRmFjdG9yeShsZWZ0KEJhc2VDb21wb25lbnQpKTtcbiAgICAgICAgcmV0dXJuIGxlZnRGYWN0b3J5KHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcmlnaHRGYWN0b3J5ID0gcmlnaHRGYWN0b3J5IHx8IGNyZWF0ZUZhY3RvcnkocmlnaHQoQmFzZUNvbXBvbmVudCkpO1xuICAgICAgcmV0dXJuIHJpZ2h0RmFjdG9yeShwcm9wcyk7XG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdicmFuY2gnKSkoQnJhbmNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQnJhbmNoO1xuICB9O1xufTtcblxudmFyIHJlbmRlckNvbXBvbmVudCA9IGZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudChDb21wb25lbnQkJDEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChfKSB7XG4gICAgdmFyIGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KENvbXBvbmVudCQkMSk7XG5cbiAgICB2YXIgUmVuZGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gUmVuZGVyQ29tcG9uZW50KHByb3BzKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeShwcm9wcyk7XG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZW5kZXJDb21wb25lbnQuZGlzcGxheU5hbWUgPSB3cmFwRGlzcGxheU5hbWUoQ29tcG9uZW50JCQxLCAncmVuZGVyQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlbmRlckNvbXBvbmVudDtcbiAgfTtcbn07XG5cbnZhciBOb3RoaW5nID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKE5vdGhpbmcsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5vdGhpbmcoKSB7XG4gICAgcmV0dXJuIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE5vdGhpbmcucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIE5vdGhpbmc7XG59KENvbXBvbmVudCk7XG5cbnZhciByZW5kZXJOb3RoaW5nID0gZnVuY3Rpb24gcmVuZGVyTm90aGluZyhfKSB7XG4gIHJldHVybiBOb3RoaW5nO1xufTtcblxudmFyIHNob3VsZFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZSh0ZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeShCYXNlQ29tcG9uZW50KTtcblxuICAgIHZhciBTaG91bGRVcGRhdGUgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2hvdWxkVXBkYXRlLCBfQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gU2hvdWxkVXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gX0NvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBTaG91bGRVcGRhdGUucHJvdG90eXBlO1xuXG4gICAgICBfcHJvdG8uc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgICByZXR1cm4gdGVzdCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkodGhpcy5wcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gU2hvdWxkVXBkYXRlO1xuICAgIH0oQ29tcG9uZW50KTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdzaG91bGRVcGRhdGUnKSkoU2hvdWxkVXBkYXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU2hvdWxkVXBkYXRlO1xuICB9O1xufTtcblxudmFyIHB1cmUgPSBmdW5jdGlvbiBwdXJlKEJhc2VDb21wb25lbnQpIHtcbiAgdmFyIGhvYyA9IHNob3VsZFVwZGF0ZShmdW5jdGlvbiAocHJvcHMsIG5leHRQcm9wcykge1xuICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKHByb3BzLCBuZXh0UHJvcHMpO1xuICB9KTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ3B1cmUnKSkoaG9jKEJhc2VDb21wb25lbnQpKTtcbiAgfVxuXG4gIHJldHVybiBob2MoQmFzZUNvbXBvbmVudCk7XG59O1xuXG52YXIgb25seVVwZGF0ZUZvcktleXMgPSBmdW5jdGlvbiBvbmx5VXBkYXRlRm9yS2V5cyhwcm9wS2V5cykge1xuICB2YXIgaG9jID0gc2hvdWxkVXBkYXRlKGZ1bmN0aW9uIChwcm9wcywgbmV4dFByb3BzKSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwocGljayhuZXh0UHJvcHMsIHByb3BLZXlzKSwgcGljayhwcm9wcywgcHJvcEtleXMpKTtcbiAgfSk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ29ubHlVcGRhdGVGb3JLZXlzJykpKGhvYyhCYXNlQ29tcG9uZW50KSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBob2M7XG59O1xuXG52YXIgb25seVVwZGF0ZUZvclByb3BUeXBlcyA9IGZ1bmN0aW9uIG9ubHlVcGRhdGVGb3JQcm9wVHlwZXMoQmFzZUNvbXBvbmVudCkge1xuICB2YXIgcHJvcFR5cGVzID0gQmFzZUNvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoIXByb3BUeXBlcykge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0EgY29tcG9uZW50IHdpdGhvdXQgYW55IGBwcm9wVHlwZXNgIHdhcyBwYXNzZWQgdG8gJyArICdgb25seVVwZGF0ZUZvclByb3BUeXBlcygpYC4gQ2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnICsgKFwiY29tcG9uZW50IHdpdGggZGlzcGxheSBuYW1lIFxcXCJcIiArIGdldERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQpICsgXCJcXFwiLlwiKSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3BLZXlzID0gT2JqZWN0LmtleXMocHJvcFR5cGVzIHx8IHt9KTtcbiAgdmFyIE9ubHlVcGRhdGVGb3JQcm9wVHlwZXMgPSBvbmx5VXBkYXRlRm9yS2V5cyhwcm9wS2V5cykoQmFzZUNvbXBvbmVudCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdvbmx5VXBkYXRlRm9yUHJvcFR5cGVzJykpKE9ubHlVcGRhdGVGb3JQcm9wVHlwZXMpO1xuICB9XG5cbiAgcmV0dXJuIE9ubHlVcGRhdGVGb3JQcm9wVHlwZXM7XG59O1xuXG52YXIgd2l0aENvbnRleHQgPSBmdW5jdGlvbiB3aXRoQ29udGV4dChjaGlsZENvbnRleHRUeXBlcywgZ2V0Q2hpbGRDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgIHZhciBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeShCYXNlQ29tcG9uZW50KTtcblxuICAgIHZhciBXaXRoQ29udGV4dCA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShXaXRoQ29udGV4dCwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFdpdGhDb250ZXh0KCkge1xuICAgICAgICB2YXIgX3RoaXM7XG5cbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICAgICAgX3RoaXMuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBnZXRDaGlsZENvbnRleHQoX3RoaXMucHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIF9wcm90byA9IFdpdGhDb250ZXh0LnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkodGhpcy5wcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gV2l0aENvbnRleHQ7XG4gICAgfShDb21wb25lbnQpO1xuXG4gICAgV2l0aENvbnRleHQuY2hpbGRDb250ZXh0VHlwZXMgPSBjaGlsZENvbnRleHRUeXBlcztcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICd3aXRoQ29udGV4dCcpKShXaXRoQ29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFdpdGhDb250ZXh0O1xuICB9O1xufTtcblxudmFyIGdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0KGNvbnRleHRUeXBlcykge1xuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoQmFzZUNvbXBvbmVudCk7XG5cbiAgICB2YXIgR2V0Q29udGV4dCA9IGZ1bmN0aW9uIEdldENvbnRleHQob3duZXJQcm9wcywgY29udGV4dCkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoX2V4dGVuZHMoe30sIG93bmVyUHJvcHMsIGNvbnRleHQpKTtcbiAgICB9O1xuXG4gICAgR2V0Q29udGV4dC5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIHNldERpc3BsYXlOYW1lKHdyYXBEaXNwbGF5TmFtZShCYXNlQ29tcG9uZW50LCAnZ2V0Q29udGV4dCcpKShHZXRDb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gR2V0Q29udGV4dDtcbiAgfTtcbn07XG5cbnZhciBsaWZlY3ljbGUgPSBmdW5jdGlvbiBsaWZlY3ljbGUoc3BlYykge1xuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoQmFzZUNvbXBvbmVudCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBzcGVjLmhhc093blByb3BlcnR5KCdyZW5kZXInKSkge1xuICAgICAgY29uc29sZS5lcnJvcignbGlmZWN5Y2xlKCkgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVuZGVyIG1ldGhvZDsgaXRzIGJlaGF2aW9yIGlzIHRvICcgKyAncGFzcyBhbGwgcHJvcHMgYW5kIHN0YXRlIHRvIHRoZSBiYXNlIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICB2YXIgTGlmZWN5Y2xlID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0c0xvb3NlKExpZmVjeWNsZSwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIExpZmVjeWNsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3Byb3RvID0gTGlmZWN5Y2xlLnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkoX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBMaWZlY3ljbGU7XG4gICAgfShDb21wb25lbnQpO1xuXG4gICAgT2JqZWN0LmtleXMoc3BlYykuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICAgICAgcmV0dXJuIExpZmVjeWNsZS5wcm90b3R5cGVbaG9va10gPSBzcGVjW2hvb2tdO1xuICAgIH0pO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ2xpZmVjeWNsZScpKShMaWZlY3ljbGUpO1xuICAgIH1cblxuICAgIHJldHVybiBMaWZlY3ljbGU7XG4gIH07XG59O1xuXG52YXIgaXNDbGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQoQ29tcG9uZW50JCQxKSB7XG4gIHJldHVybiBCb29sZWFuKENvbXBvbmVudCQkMSAmJiBDb21wb25lbnQkJDEucHJvdG90eXBlICYmIHR5cGVvZiBDb21wb25lbnQkJDEucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyk7XG59O1xuXG52YXIgdG9DbGFzcyA9IGZ1bmN0aW9uIHRvQ2xhc3MoYmFzZUNvbXBvbmVudCkge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gaXNDbGFzc0NvbXBvbmVudChiYXNlQ29tcG9uZW50KSA/IGJhc2VDb21wb25lbnQgOiAoX3RlbXAgPSBfY2xhc3MgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2UoVG9DbGFzcywgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUb0NsYXNzKCkge1xuICAgICAgcmV0dXJuIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBUb0NsYXNzLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGJhc2VDb21wb25lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGJhc2VDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFzZUNvbXBvbmVudCh0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQpO1xuICAgIH07XG5cbiAgICByZXR1cm4gVG9DbGFzcztcbiAgfShDb21wb25lbnQpLCBfY2xhc3MuZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShiYXNlQ29tcG9uZW50KSwgX2NsYXNzLnByb3BUeXBlcyA9IGJhc2VDb21wb25lbnQucHJvcFR5cGVzLCBfY2xhc3MuY29udGV4dFR5cGVzID0gYmFzZUNvbXBvbmVudC5jb250ZXh0VHlwZXMsIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSBiYXNlQ29tcG9uZW50LmRlZmF1bHRQcm9wcywgX3RlbXApO1xufTtcblxuZnVuY3Rpb24gdG9SZW5kZXJQcm9wcyhob2MpIHtcbiAgdmFyIFJlbmRlclByb3BzQ29tcG9uZW50ID0gZnVuY3Rpb24gUmVuZGVyUHJvcHNDb21wb25lbnQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4ocHJvcHMpO1xuICB9O1xuXG4gIHJldHVybiBob2MoUmVuZGVyUHJvcHNDb21wb25lbnQpO1xufVxuXG52YXIgZnJvbVJlbmRlclByb3BzID0gZnVuY3Rpb24gZnJvbVJlbmRlclByb3BzKFJlbmRlclByb3BzQ29tcG9uZW50LCBwcm9wc01hcHBlciwgcmVuZGVyUHJvcE5hbWUpIHtcbiAgaWYgKHJlbmRlclByb3BOYW1lID09PSB2b2lkIDApIHtcbiAgICByZW5kZXJQcm9wTmFtZSA9ICdjaGlsZHJlbic7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICB2YXIgYmFzZUZhY3RvcnkgPSBSZWFjdC5jcmVhdGVGYWN0b3J5KEJhc2VDb21wb25lbnQpO1xuICAgIHZhciByZW5kZXJQcm9wc0ZhY3RvcnkgPSBSZWFjdC5jcmVhdGVGYWN0b3J5KFJlbmRlclByb3BzQ29tcG9uZW50KTtcblxuICAgIHZhciBGcm9tUmVuZGVyUHJvcHMgPSBmdW5jdGlvbiBGcm9tUmVuZGVyUHJvcHMob3duZXJQcm9wcykge1xuICAgICAgdmFyIF9yZW5kZXJQcm9wc0ZhY3Rvcnk7XG5cbiAgICAgIHJldHVybiByZW5kZXJQcm9wc0ZhY3RvcnkoKF9yZW5kZXJQcm9wc0ZhY3RvcnkgPSB7fSwgX3JlbmRlclByb3BzRmFjdG9yeVtyZW5kZXJQcm9wTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBiYXNlRmFjdG9yeShfZXh0ZW5kcyh7fSwgb3duZXJQcm9wcywgcHJvcHNNYXBwZXIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKSk7XG4gICAgICB9LCBfcmVuZGVyUHJvcHNGYWN0b3J5KSk7XG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2V0RGlzcGxheU5hbWUod3JhcERpc3BsYXlOYW1lKEJhc2VDb21wb25lbnQsICdmcm9tUmVuZGVyUHJvcHMnKSkoRnJvbVJlbmRlclByb3BzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRnJvbVJlbmRlclByb3BzO1xuICB9O1xufTtcblxudmFyIHNldFByb3BUeXBlcyA9IGZ1bmN0aW9uIHNldFByb3BUeXBlcyhwcm9wVHlwZXMpIHtcbiAgcmV0dXJuIHNldFN0YXRpYygncHJvcFR5cGVzJywgcHJvcFR5cGVzKTtcbn07XG5cbnZhciBjb21wb3NlID0gZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYShiLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgfTtcbiAgfSwgZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiBhcmc7XG4gIH0pO1xufTtcblxudmFyIGNyZWF0ZVNpbmsgPSBmdW5jdGlvbiBjcmVhdGVTaW5rKGNhbGxiYWNrKSB7XG4gIHZhciBTaW5rID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFNpbmssIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gU2luaygpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgICBfdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIFNpbmsuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgY2FsbGJhY2sobmV4dFByb3BzKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgX3Byb3RvID0gU2luay5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiBTaW5rO1xuICB9KENvbXBvbmVudCk7XG5cbiAgcG9seWZpbGwoU2luayk7XG4gIHJldHVybiBTaW5rO1xufTtcblxudmFyIGNvbXBvbmVudEZyb21Qcm9wID0gZnVuY3Rpb24gY29tcG9uZW50RnJvbVByb3AocHJvcE5hbWUpIHtcbiAgdmFyIENvbXBvbmVudCQkMSA9IGZ1bmN0aW9uIENvbXBvbmVudCQkMShwcm9wcykge1xuICAgIHJldHVybiBjcmVhdGVFbGVtZW50KHByb3BzW3Byb3BOYW1lXSwgb21pdChwcm9wcywgW3Byb3BOYW1lXSkpO1xuICB9O1xuXG4gIENvbXBvbmVudCQkMS5kaXNwbGF5TmFtZSA9IFwiY29tcG9uZW50RnJvbVByb3AoXCIgKyBwcm9wTmFtZSArIFwiKVwiO1xuICByZXR1cm4gQ29tcG9uZW50JCQxO1xufTtcblxudmFyIG5lc3QgPSBmdW5jdGlvbiBuZXN0KCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgQ29tcG9uZW50cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBDb21wb25lbnRzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIGZhY3RvcmllcyA9IENvbXBvbmVudHMubWFwKGNyZWF0ZUZhY3RvcnkpO1xuXG4gIHZhciBOZXN0ID0gZnVuY3Rpb24gTmVzdChfcmVmKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJjaGlsZHJlblwiXSk7XG5cbiAgICByZXR1cm4gZmFjdG9yaWVzLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uIChjaGlsZCwgZmFjdG9yeSkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkocHJvcHMsIGNoaWxkKTtcbiAgICB9LCBjaGlsZHJlbik7XG4gIH07XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgZGlzcGxheU5hbWVzID0gQ29tcG9uZW50cy5tYXAoZ2V0RGlzcGxheU5hbWUpO1xuICAgIE5lc3QuZGlzcGxheU5hbWUgPSBcIm5lc3QoXCIgKyBkaXNwbGF5TmFtZXMuam9pbignLCAnKSArIFwiKVwiO1xuICB9XG5cbiAgcmV0dXJuIE5lc3Q7XG59O1xuXG52YXIgaG9pc3RTdGF0aWNzID0gZnVuY3Rpb24gaG9pc3RTdGF0aWNzKGhpZ2hlck9yZGVyQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50KSB7XG4gICAgdmFyIE5ld0NvbXBvbmVudCA9IGhpZ2hlck9yZGVyQ29tcG9uZW50KEJhc2VDb21wb25lbnQpO1xuICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKE5ld0NvbXBvbmVudCwgQmFzZUNvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICByZXR1cm4gTmV3Q29tcG9uZW50O1xuICB9O1xufTtcblxudmFyIF9jb25maWcgPSB7XG4gIGZyb21FU09ic2VydmFibGU6IG51bGwsXG4gIHRvRVNPYnNlcnZhYmxlOiBudWxsXG59O1xuXG52YXIgY29uZmlndXJlT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIGNvbmZpZ3VyZU9ic2VydmFibGUoYykge1xuICBfY29uZmlnID0gYztcbn07XG5cbnZhciBjb25maWcgPSB7XG4gIGZyb21FU09ic2VydmFibGU6IGZ1bmN0aW9uIGZyb21FU09ic2VydmFibGUob2JzZXJ2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgX2NvbmZpZy5mcm9tRVNPYnNlcnZhYmxlID09PSAnZnVuY3Rpb24nID8gX2NvbmZpZy5mcm9tRVNPYnNlcnZhYmxlKG9ic2VydmFibGUpIDogb2JzZXJ2YWJsZTtcbiAgfSxcbiAgdG9FU09ic2VydmFibGU6IGZ1bmN0aW9uIHRvRVNPYnNlcnZhYmxlKHN0cmVhbSkge1xuICAgIHJldHVybiB0eXBlb2YgX2NvbmZpZy50b0VTT2JzZXJ2YWJsZSA9PT0gJ2Z1bmN0aW9uJyA/IF9jb25maWcudG9FU09ic2VydmFibGUoc3RyZWFtKSA6IHN0cmVhbTtcbiAgfVxufTtcblxudmFyIGNvbXBvbmVudEZyb21TdHJlYW1XaXRoQ29uZmlnID0gZnVuY3Rpb24gY29tcG9uZW50RnJvbVN0cmVhbVdpdGhDb25maWcoY29uZmlnJCQxKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHNUb1Zkb20pIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAgICAgX2luaGVyaXRzTG9vc2UoQ29tcG9uZW50RnJvbVN0cmVhbSwgX0NvbXBvbmVudCk7XG5cbiAgICAgICAgZnVuY3Rpb24gQ29tcG9uZW50RnJvbVN0cmVhbSgpIHtcbiAgICAgICAgICB2YXIgX2NvbmZpZyRmcm9tRVNPYnNlcnZhO1xuXG4gICAgICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB2ZG9tOiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBfdGhpcy5wcm9wc0VtaXR0ZXIgPSBjcmVhdGVDaGFuZ2VFbWl0dGVyKCk7XG4gICAgICAgICAgX3RoaXMucHJvcHMkID0gY29uZmlnJCQxLmZyb21FU09ic2VydmFibGUoKF9jb25maWckZnJvbUVTT2JzZXJ2YSA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgICAgICAgIHZhciB1bnN1YnNjcmliZSA9IF90aGlzLnByb3BzRW1pdHRlci5saXN0ZW4oZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHByb3BzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgX2NvbmZpZyRmcm9tRVNPYnNlcnZhWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LCBfY29uZmlnJGZyb21FU09ic2VydmEpKTtcbiAgICAgICAgICBfdGhpcy52ZG9tJCA9IGNvbmZpZyQkMS50b0VTT2JzZXJ2YWJsZShwcm9wc1RvVmRvbShfdGhpcy5wcm9wcyQpKTtcbiAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3Byb3RvID0gQ29tcG9uZW50RnJvbVN0cmVhbS5wcm90b3R5cGU7XG5cbiAgICAgICAgX3Byb3RvLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAgIC8vIFN1YnNjcmliZSB0byBjaGlsZCBwcm9wIGNoYW5nZXMgc28gd2Uga25vdyB3aGVuIHRvIHJlLXJlbmRlclxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy52ZG9tJC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCh2ZG9tKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmRvbTogdmRvbVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnByb3BzRW1pdHRlci5lbWl0KHRoaXMucHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIF9wcm90by5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgICAvLyBSZWNlaXZlIG5ldyBwcm9wcyBmcm9tIHRoZSBvd25lclxuICAgICAgICAgIHRoaXMucHJvcHNFbWl0dGVyLmVtaXQobmV4dFByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfcHJvdG8uc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZS52ZG9tICE9PSB0aGlzLnN0YXRlLnZkb207XG4gICAgICAgIH07XG5cbiAgICAgICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgICAgLy8gQ2FsbCB3aXRob3V0IGFyZ3VtZW50cyB0byBjb21wbGV0ZSBzdHJlYW1cbiAgICAgICAgICB0aGlzLnByb3BzRW1pdHRlci5lbWl0KCk7IC8vIENsZWFuLXVwIHN1YnNjcmlwdGlvbiBiZWZvcmUgdW4tbW91bnRpbmdcblxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS52ZG9tO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBDb21wb25lbnRGcm9tU3RyZWFtO1xuICAgICAgfShDb21wb25lbnQpXG4gICAgKTtcbiAgfTtcbn07XG5cbnZhciBjb21wb25lbnRGcm9tU3RyZWFtID0gZnVuY3Rpb24gY29tcG9uZW50RnJvbVN0cmVhbShwcm9wc1RvVmRvbSkge1xuICByZXR1cm4gY29tcG9uZW50RnJvbVN0cmVhbVdpdGhDb25maWcoY29uZmlnKShwcm9wc1RvVmRvbSk7XG59O1xuXG52YXIgaWRlbnRpdHkkMSA9IGZ1bmN0aW9uIGlkZW50aXR5KHQpIHtcbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgbWFwUHJvcHNTdHJlYW1XaXRoQ29uZmlnID0gZnVuY3Rpb24gbWFwUHJvcHNTdHJlYW1XaXRoQ29uZmlnKGNvbmZpZyQkMSkge1xuICB2YXIgY29tcG9uZW50RnJvbVN0cmVhbSQkMSA9IGNvbXBvbmVudEZyb21TdHJlYW1XaXRoQ29uZmlnKHtcbiAgICBmcm9tRVNPYnNlcnZhYmxlOiBpZGVudGl0eSQxLFxuICAgIHRvRVNPYnNlcnZhYmxlOiBpZGVudGl0eSQxXG4gIH0pO1xuICByZXR1cm4gZnVuY3Rpb24gKHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCkge1xuICAgICAgdmFyIGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KEJhc2VDb21wb25lbnQpO1xuICAgICAgdmFyIGZyb21FU09ic2VydmFibGUgPSBjb25maWckJDEuZnJvbUVTT2JzZXJ2YWJsZSxcbiAgICAgICAgICB0b0VTT2JzZXJ2YWJsZSA9IGNvbmZpZyQkMS50b0VTT2JzZXJ2YWJsZTtcbiAgICAgIHJldHVybiBjb21wb25lbnRGcm9tU3RyZWFtJCQxKGZ1bmN0aW9uIChwcm9wcyQpIHtcbiAgICAgICAgdmFyIF9yZWY7XG5cbiAgICAgICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0b0VTT2JzZXJ2YWJsZSh0cmFuc2Zvcm0oZnJvbUVTT2JzZXJ2YWJsZShwcm9wcyQpKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dChjaGlsZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQoZmFjdG9yeShjaGlsZFByb3BzKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSwgX3JlZjtcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59O1xuXG52YXIgbWFwUHJvcHNTdHJlYW0gPSBmdW5jdGlvbiBtYXBQcm9wc1N0cmVhbSh0cmFuc2Zvcm0pIHtcbiAgdmFyIGhvYyA9IG1hcFByb3BzU3RyZWFtV2l0aENvbmZpZyhjb25maWcpKHRyYW5zZm9ybSk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKEJhc2VDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBzZXREaXNwbGF5TmFtZSh3cmFwRGlzcGxheU5hbWUoQmFzZUNvbXBvbmVudCwgJ21hcFByb3BzU3RyZWFtJykpKGhvYyhCYXNlQ29tcG9uZW50KSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBob2M7XG59O1xuXG52YXIgY3JlYXRlRXZlbnRIYW5kbGVyV2l0aENvbmZpZyA9IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50SGFuZGxlcldpdGhDb25maWcoY29uZmlnJCQxKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jb25maWckZnJvbUVTT2JzZXJ2YTtcblxuICAgIHZhciBlbWl0dGVyID0gY3JlYXRlQ2hhbmdlRW1pdHRlcigpO1xuICAgIHZhciBzdHJlYW0gPSBjb25maWckJDEuZnJvbUVTT2JzZXJ2YWJsZSgoX2NvbmZpZyRmcm9tRVNPYnNlcnZhID0ge1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gZW1pdHRlci5saXN0ZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBfY29uZmlnJGZyb21FU09ic2VydmFbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9jb25maWckZnJvbUVTT2JzZXJ2YSkpO1xuICAgIHJldHVybiB7XG4gICAgICBoYW5kbGVyOiBlbWl0dGVyLmVtaXQsXG4gICAgICBzdHJlYW06IHN0cmVhbVxuICAgIH07XG4gIH07XG59O1xudmFyIGNyZWF0ZUV2ZW50SGFuZGxlciA9IGNyZWF0ZUV2ZW50SGFuZGxlcldpdGhDb25maWcoY29uZmlnKTtcblxuLy8gSGlnaGVyLW9yZGVyIGNvbXBvbmVudCBoZWxwZXJzXG5cbmV4cG9ydCB7IG1hcFByb3BzLCB3aXRoUHJvcHMsIHdpdGhQcm9wc09uQ2hhbmdlLCB3aXRoSGFuZGxlcnMsIGRlZmF1bHRQcm9wcywgcmVuYW1lUHJvcCwgcmVuYW1lUHJvcHMsIGZsYXR0ZW5Qcm9wLCB3aXRoU3RhdGUsIHdpdGhTdGF0ZUhhbmRsZXJzLCB3aXRoUmVkdWNlciwgYnJhbmNoLCByZW5kZXJDb21wb25lbnQsIHJlbmRlck5vdGhpbmcsIHNob3VsZFVwZGF0ZSwgcHVyZSwgb25seVVwZGF0ZUZvcktleXMsIG9ubHlVcGRhdGVGb3JQcm9wVHlwZXMsIHdpdGhDb250ZXh0LCBnZXRDb250ZXh0LCBsaWZlY3ljbGUsIHRvQ2xhc3MsIHRvUmVuZGVyUHJvcHMsIGZyb21SZW5kZXJQcm9wcywgc2V0U3RhdGljLCBzZXRQcm9wVHlwZXMsIHNldERpc3BsYXlOYW1lLCBjb21wb3NlLCBnZXREaXNwbGF5TmFtZSwgd3JhcERpc3BsYXlOYW1lLCBzaGFsbG93RXF1YWwsIGlzQ2xhc3NDb21wb25lbnQsIGNyZWF0ZVNpbmssIGNvbXBvbmVudEZyb21Qcm9wLCBuZXN0LCBob2lzdFN0YXRpY3MsIGNvbXBvbmVudEZyb21TdHJlYW0sIGNvbXBvbmVudEZyb21TdHJlYW1XaXRoQ29uZmlnLCBtYXBQcm9wc1N0cmVhbSwgbWFwUHJvcHNTdHJlYW1XaXRoQ29uZmlnLCBjcmVhdGVFdmVudEhhbmRsZXIsIGNyZWF0ZUV2ZW50SGFuZGxlcldpdGhDb25maWcsIGNvbmZpZ3VyZU9ic2VydmFibGUgYXMgc2V0T2JzZXJ2YWJsZUNvbmZpZyB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10540\n")},11025:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Tamil [ta]\n//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '௧',\n 2: '௨',\n 3: '௩',\n 4: '௪',\n 5: '௫',\n 6: '௬',\n 7: '௭',\n 8: '௮',\n 9: '௯',\n 0: '௦',\n },\n numberMap = {\n '௧': '1',\n '௨': '2',\n '௩': '3',\n '௪': '4',\n '௫': '5',\n '௬': '6',\n '௭': '7',\n '௮': '8',\n '௯': '9',\n '௦': '0',\n };\n\n var ta = moment.defineLocale('ta', {\n months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n '_'\n ),\n monthsShort:\n 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(\n '_'\n ),\n weekdays:\n 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(\n '_'\n ),\n weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(\n '_'\n ),\n weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, HH:mm',\n LLLL: 'dddd, D MMMM YYYY, HH:mm',\n },\n calendar: {\n sameDay: '[இன்று] LT',\n nextDay: '[நாளை] LT',\n nextWeek: 'dddd, LT',\n lastDay: '[நேற்று] LT',\n lastWeek: '[கடந்த வாரம்] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s இல்',\n past: '%s முன்',\n s: 'ஒரு சில விநாடிகள்',\n ss: '%d விநாடிகள்',\n m: 'ஒரு நிமிடம்',\n mm: '%d நிமிடங்கள்',\n h: 'ஒரு மணி நேரம்',\n hh: '%d மணி நேரம்',\n d: 'ஒரு நாள்',\n dd: '%d நாட்கள்',\n M: 'ஒரு மாதம்',\n MM: '%d மாதங்கள்',\n y: 'ஒரு வருடம்',\n yy: '%d ஆண்டுகள்',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}வது/,\n ordinal: function (number) {\n return number + 'வது';\n },\n preparse: function (string) {\n return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n // refer http://ta.wikipedia.org/s/1er1\n meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,\n meridiem: function (hour, minute, isLower) {\n if (hour < 2) {\n return ' யாமம்';\n } else if (hour < 6) {\n return ' வைகறை'; // வைகறை\n } else if (hour < 10) {\n return ' காலை'; // காலை\n } else if (hour < 14) {\n return ' நண்பகல்'; // நண்பகல்\n } else if (hour < 18) {\n return ' எற்பாடு'; // எற்பாடு\n } else if (hour < 22) {\n return ' மாலை'; // மாலை\n } else {\n return ' யாமம்';\n }\n },\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'யாமம்') {\n return hour < 2 ? hour : hour + 12;\n } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {\n return hour;\n } else if (meridiem === 'நண்பகல்') {\n return hour >= 10 ? hour : hour + 12;\n } else {\n return hour + 12;\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return ta;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwMjUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanM/M2RlNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFtaWwgW3RhXVxuLy8hIGF1dGhvciA6IEFyanVua3VtYXIgS3Jpc2huYW1vb3J0aHkgOiBodHRwczovL2dpdGh1Yi5jb20vdGsxMjA0MDRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4K+nJyxcbiAgICAgICAgICAgIDI6ICfgr6gnLFxuICAgICAgICAgICAgMzogJ+CvqScsXG4gICAgICAgICAgICA0OiAn4K+qJyxcbiAgICAgICAgICAgIDU6ICfgr6snLFxuICAgICAgICAgICAgNjogJ+CvrCcsXG4gICAgICAgICAgICA3OiAn4K+tJyxcbiAgICAgICAgICAgIDg6ICfgr64nLFxuICAgICAgICAgICAgOTogJ+CvrycsXG4gICAgICAgICAgICAwOiAn4K+mJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cvpyc6ICcxJyxcbiAgICAgICAgICAgICfgr6gnOiAnMicsXG4gICAgICAgICAgICAn4K+pJzogJzMnLFxuICAgICAgICAgICAgJ+Cvqic6ICc0JyxcbiAgICAgICAgICAgICfgr6snOiAnNScsXG4gICAgICAgICAgICAn4K+sJzogJzYnLFxuICAgICAgICAgICAgJ+CvrSc6ICc3JyxcbiAgICAgICAgICAgICfgr64nOiAnOCcsXG4gICAgICAgICAgICAn4K+vJzogJzknLFxuICAgICAgICAgICAgJ+Cvpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciB0YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RhJywge1xuICAgICAgICBtb250aHM6ICfgrpzgrqngrrXgrrDgrr9f4K6q4K6/4K6q4K+N4K6w4K614K6w4K6/X+CuruCuvuCusOCvjeCumuCvjV/gro/grqrgr43grrDgrrLgr41f4K6u4K+HX+CunOCvguCuqeCvjV/grpzgr4LgrrLgr4hf4K6G4K6V4K644K+N4K6f4K+NX+CumuCvhuCuquCvjeCun+CvhuCuruCvjeCuquCusOCvjV/groXgrpXgr43grp/gr4fgrr7grqrgrrDgr41f4K6o4K614K6u4K+N4K6q4K6w4K+NX+Cun+Cuv+CumuCuruCvjeCuquCusOCvjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4K6e4K6+4K6v4K6/4K6x4K+N4K6x4K+B4K6V4K+N4K6V4K6/4K604K6u4K+IX+CupOCuv+CumeCvjeCuleCun+CvjeCuleCuv+CutOCuruCviF/grprgr4bgrrXgr43grrXgrr7grq/gr43grpXgrr/grrTgrq7gr4hf4K6q4K+B4K6k4K6p4K+N4K6V4K6/4K604K6u4K+IX+CuteCuv+Cur+CuvuCutOCuleCvjeCuleCuv+CutOCuruCviF/grrXgr4bgrrPgr43grrPgrr/grpXgr43grpXgrr/grrTgrq7gr4hf4K6a4K6p4K6/4K6V4K+N4K6V4K6/4K604K6u4K+IJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgrp7grr7grq/grr/grrHgr4Ff4K6k4K6/4K6Z4K+N4K6V4K6z4K+NX+CumuCvhuCuteCvjeCuteCuvuCur+CvjV/grqrgr4HgrqTgrqngr41f4K614K6/4K6v4K6+4K604K6p4K+NX+CuteCvhuCus+CvjeCus+Cuv1/grprgrqngrr8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4K6e4K6+X+CupOCuv1/grprgr4Zf4K6q4K+BX+CuteCuv1/grrXgr4Zf4K6aJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4K6H4K6p4K+N4K6x4K+BXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CuqOCuvuCus+CviF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CuqOCvh+CuseCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4K6V4K6f4K6o4K+N4K6kIOCuteCuvuCusOCuruCvjV0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgrofgrrLgr40nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCuruCvgeCuqeCvjScsXG4gICAgICAgICAgICBzOiAn4K6S4K6w4K+BIOCumuCuv+CusiDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgc3M6ICclZCDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgbTogJ+CukuCusOCvgSDgrqjgrr/grq7grr/grp/grq7gr40nLFxuICAgICAgICAgICAgbW06ICclZCDgrqjgrr/grq7grr/grp/grpngr43grpXgrrPgr40nLFxuICAgICAgICAgICAgaDogJ+CukuCusOCvgSDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4K6u4K6j4K6/IOCuqOCvh+CusOCuruCvjScsXG4gICAgICAgICAgICBkOiAn4K6S4K6w4K+BIOCuqOCuvuCus+CvjScsXG4gICAgICAgICAgICBkZDogJyVkIOCuqOCuvuCun+CvjeCuleCus+CvjScsXG4gICAgICAgICAgICBNOiAn4K6S4K6w4K+BIOCuruCuvuCupOCuruCvjScsXG4gICAgICAgICAgICBNTTogJyVkIOCuruCuvuCupOCumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICB5OiAn4K6S4K6w4K+BIOCuteCusOCvgeCun+CuruCvjScsXG4gICAgICAgICAgICB5eTogJyVkIOCuhuCuo+CvjeCun+CvgeCuleCus+CvjScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeCuteCupOCvgS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4K614K6k4K+BJztcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cvp+CvqOCvqeCvquCvq+CvrOCvreCvruCvr+Cvpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gcmVmZXIgaHR0cDovL3RhLndpa2lwZWRpYS5vcmcvcy8xZXIxXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/grq/grr7grq7grq7gr4184K614K+I4K6V4K6x4K+IfOCuleCuvuCusuCviHzgrqjgrqPgr43grqrgrpXgrrLgr4184K6O4K6x4K+N4K6q4K6+4K6f4K+BfOCuruCuvuCusuCviC8sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuteCviOCuleCuseCviCc7IC8vIOCuteCviOCuleCuseCviFxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrpXgrr7grrLgr4gnOyAvLyDgrpXgrr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6o4K6j4K+N4K6q4K6V4K6y4K+NJzsgLy8g4K6o4K6j4K+N4K6q4K6V4K6y4K+NXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCujuCuseCvjeCuquCuvuCun+CvgSc7IC8vIOCujuCuseCvjeCuquCuvuCun+CvgVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq7grr7grrLgr4gnOyAvLyDgrq7grr7grrLgr4hcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6v4K6+4K6u4K6u4K+NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4K6v4K6+4K6u4K6u4K+NJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4K614K+I4K6V4K6x4K+IJyB8fCBtZXJpZGllbSA9PT0gJ+CuleCuvuCusuCviCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrqjgrqPgr43grqrgrpXgrrLgr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGE7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///11025\n")},11470:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Breton [br]\n//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function relativeTimeWithMutation(number, withoutSuffix, key) {\n var format = {\n mm: 'munutenn',\n MM: 'miz',\n dd: 'devezh',\n };\n return number + ' ' + mutation(format[key], number);\n }\n function specialMutationForYears(number) {\n switch (lastNumber(number)) {\n case 1:\n case 3:\n case 4:\n case 5:\n case 9:\n return number + ' bloaz';\n default:\n return number + ' vloaz';\n }\n }\n function lastNumber(number) {\n if (number > 9) {\n return lastNumber(number % 10);\n }\n return number;\n }\n function mutation(text, number) {\n if (number === 2) {\n return softMutation(text);\n }\n return text;\n }\n function softMutation(text) {\n var mutationTable = {\n m: 'v',\n b: 'v',\n d: 'z',\n };\n if (mutationTable[text.charAt(0)] === undefined) {\n return text;\n }\n return mutationTable[text.charAt(0)] + text.substring(1);\n }\n\n var monthsParse = [\n /^gen/i,\n /^c[ʼ\\']hwe/i,\n /^meu/i,\n /^ebr/i,\n /^mae/i,\n /^(mez|eve)/i,\n /^gou/i,\n /^eos/i,\n /^gwe/i,\n /^her/i,\n /^du/i,\n /^ker/i,\n ],\n monthsRegex =\n /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n monthsStrictRegex =\n /^(genver|c[ʼ\\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,\n monthsShortStrictRegex =\n /^(gen|c[ʼ\\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,\n fullWeekdaysParse = [\n /^sul/i,\n /^lun/i,\n /^meurzh/i,\n /^merc[ʼ\\']her/i,\n /^yaou/i,\n /^gwener/i,\n /^sadorn/i,\n ],\n shortWeekdaysParse = [\n /^Sul/i,\n /^Lun/i,\n /^Meu/i,\n /^Mer/i,\n /^Yao/i,\n /^Gwe/i,\n /^Sad/i,\n ],\n minWeekdaysParse = [\n /^Su/i,\n /^Lu/i,\n /^Me([^r]|$)/i,\n /^Mer/i,\n /^Ya/i,\n /^Gw/i,\n /^Sa/i,\n ];\n\n var br = moment.defineLocale('br', {\n months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(\n '_'\n ),\n monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),\n weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),\n weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),\n weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),\n weekdaysParse: minWeekdaysParse,\n fullWeekdaysParse: fullWeekdaysParse,\n shortWeekdaysParse: shortWeekdaysParse,\n minWeekdaysParse: minWeekdaysParse,\n\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n monthsStrictRegex: monthsStrictRegex,\n monthsShortStrictRegex: monthsShortStrictRegex,\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D [a viz] MMMM YYYY',\n LLL: 'D [a viz] MMMM YYYY HH:mm',\n LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Hiziv da] LT',\n nextDay: '[Warcʼhoazh da] LT',\n nextWeek: 'dddd [da] LT',\n lastDay: '[Decʼh da] LT',\n lastWeek: 'dddd [paset da] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'a-benn %s',\n past: '%s ʼzo',\n s: 'un nebeud segondennoù',\n ss: '%d eilenn',\n m: 'ur vunutenn',\n mm: relativeTimeWithMutation,\n h: 'un eur',\n hh: '%d eur',\n d: 'un devezh',\n dd: relativeTimeWithMutation,\n M: 'ur miz',\n MM: relativeTimeWithMutation,\n y: 'ur bloaz',\n yy: specialMutationForYears,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(añ|vet)/,\n ordinal: function (number) {\n var output = number === 1 ? 'añ' : 'vet';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn\n isPM: function (token) {\n return token === 'g.m.';\n },\n meridiem: function (hour, minute, isLower) {\n return hour < 12 ? 'a.m.' : 'g.m.';\n },\n });\n\n return br;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0NzAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qcz82ODg3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCcmV0b24gW2JyXVxuLy8hIGF1dGhvciA6IEplYW4tQmFwdGlzdGUgTGUgRHVpZ291IDogaHR0cHM6Ly9naXRodWIuY29tL2pibGVkdWlnb3VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgbW06ICdtdW51dGVubicsXG4gICAgICAgICAgICBNTTogJ21peicsXG4gICAgICAgICAgICBkZDogJ2RldmV6aCcsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBtdXRhdGlvbihmb3JtYXRba2V5XSwgbnVtYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMobnVtYmVyKSB7XG4gICAgICAgIHN3aXRjaCAobGFzdE51bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgYmxvYXonO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyB2bG9heic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGFzdE51bWJlcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA+IDkpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0TnVtYmVyKG51bWJlciAlIDEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtdXRhdGlvbih0ZXh0LCBudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHNvZnRNdXRhdGlvbih0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc29mdE11dGF0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG11dGF0aW9uVGFibGUgPSB7XG4gICAgICAgICAgICBtOiAndicsXG4gICAgICAgICAgICBiOiAndicsXG4gICAgICAgICAgICBkOiAneicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXV0YXRpb25UYWJsZVt0ZXh0LmNoYXJBdCgwKV0gKyB0ZXh0LnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmdlbi9pLFxuICAgICAgICAgICAgL15jW8q8XFwnXWh3ZS9pLFxuICAgICAgICAgICAgL15tZXUvaSxcbiAgICAgICAgICAgIC9eZWJyL2ksXG4gICAgICAgICAgICAvXm1hZS9pLFxuICAgICAgICAgICAgL14obWV6fGV2ZSkvaSxcbiAgICAgICAgICAgIC9eZ291L2ksXG4gICAgICAgICAgICAvXmVvcy9pLFxuICAgICAgICAgICAgL15nd2UvaSxcbiAgICAgICAgICAgIC9eaGVyL2ksXG4gICAgICAgICAgICAvXmR1L2ksXG4gICAgICAgICAgICAvXmtlci9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihnZW52ZXJ8Y1vKvFxcJ11od2V2cmVyfG1ldXJ6aHxlYnJlbHxtYWV8bWV6aGV2ZW58Z291ZXJlfGVvc3R8Z3dlbmdvbG98aGVyZXxkdXxrZXJ6dXxnZW58Y1vKvFxcJ11od2V8bWV1fGVicnxtYWV8ZXZlfGdvdXxlb3N8Z3dlfGhlcnxkdXxrZXIpL2ksXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnZlcnxjW8q8XFwnXWh3ZXZyZXJ8bWV1cnpofGVicmVsfG1hZXxtZXpoZXZlbnxnb3VlcmV8ZW9zdHxnd2VuZ29sb3xoZXJlfGR1fGtlcnp1KS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnxjW8q8XFwnXWh3ZXxtZXV8ZWJyfG1hZXxldmV8Z291fGVvc3xnd2V8aGVyfGR1fGtlcikvaSxcbiAgICAgICAgZnVsbFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXnN1bC9pLFxuICAgICAgICAgICAgL15sdW4vaSxcbiAgICAgICAgICAgIC9ebWV1cnpoL2ksXG4gICAgICAgICAgICAvXm1lcmNbyrxcXCddaGVyL2ksXG4gICAgICAgICAgICAvXnlhb3UvaSxcbiAgICAgICAgICAgIC9eZ3dlbmVyL2ksXG4gICAgICAgICAgICAvXnNhZG9ybi9pLFxuICAgICAgICBdLFxuICAgICAgICBzaG9ydFdlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXlN1bC9pLFxuICAgICAgICAgICAgL15MdW4vaSxcbiAgICAgICAgICAgIC9eTWV1L2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYW8vaSxcbiAgICAgICAgICAgIC9eR3dlL2ksXG4gICAgICAgICAgICAvXlNhZC9pLFxuICAgICAgICBdLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlID0gW1xuICAgICAgICAgICAgL15TdS9pLFxuICAgICAgICAgICAgL15MdS9pLFxuICAgICAgICAgICAgL15NZShbXnJdfCQpL2ksXG4gICAgICAgICAgICAvXk1lci9pLFxuICAgICAgICAgICAgL15ZYS9pLFxuICAgICAgICAgICAgL15Hdy9pLFxuICAgICAgICAgICAgL15TYS9pLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYnInLCB7XG4gICAgICAgIG1vbnRoczogJ0dlbnZlcl9Dyrxod2V2cmVyX01ldXJ6aF9FYnJlbF9NYWVfTWV6aGV2ZW5fR291ZXJlX0Vvc3RfR3dlbmdvbG9fSGVyZV9EdV9LZXJ6dScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdHZW5fQ8q8aHdlX01ldV9FYnJfTWFlX0V2ZV9Hb3VfRW9zX0d3ZV9IZXJfRHVfS2VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bF9MdW5fTWV1cnpoX01lcmPKvGhlcl9ZYW91X0d3ZW5lcl9TYWRvcm4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTHVuX01ldV9NZXJfWWFvX0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTHVfTWVfTWVyX1lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuICAgICAgICBmdWxsV2Vla2RheXNQYXJzZTogZnVsbFdlZWtkYXlzUGFyc2UsXG4gICAgICAgIHNob3J0V2Vla2RheXNQYXJzZTogc2hvcnRXZWVrZGF5c1BhcnNlLFxuICAgICAgICBtaW5XZWVrZGF5c1BhcnNlOiBtaW5XZWVrZGF5c1BhcnNlLFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiBtb250aHNTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogbW9udGhzU2hvcnRTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2Egdml6XSBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbYSB2aXpdIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hpeml2IGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1dhcmPKvGhvYXpoIGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2RhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0RlY8q8aCBkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtwYXNldCBkYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhLWJlbm4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMq8em8nLFxuICAgICAgICAgICAgczogJ3VuIG5lYmV1ZCBzZWdvbmRlbm5vw7knLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxlbm4nLFxuICAgICAgICAgICAgbTogJ3VyIHZ1bnV0ZW5uJyxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBoOiAndW4gZXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZXVyJyxcbiAgICAgICAgICAgIGQ6ICd1biBkZXZlemgnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIE06ICd1ciBtaXonLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIHk6ICd1ciBibG9heicsXG4gICAgICAgICAgICB5eTogc3BlY2lhbE11dGF0aW9uRm9yWWVhcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShhw7F8dmV0KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnYcOxJyA6ICd2ZXQnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvYS5tLnxnLm0uLywgLy8gZ291ZGUgbWVyZW5uIHwgYS1yYW9rIG1lcmVublxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9PT0gJ2cubS4nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICdhLm0uJyA6ICdnLm0uJztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicjtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11470\n")},11636:(I,g,n)=>{"use strict";I.exports=n.p+"aaa4bfbb218b9bb904f8.png"},11713:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Hebrew [he]\n//! author : Tomer Cohen : https://github.com/tomer\n//! author : Moshe Simantov : https://github.com/DevelopmentIL\n//! author : Tal Ater : https://github.com/TalAter\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var he = moment.defineLocale('he', {\n months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(\n '_'\n ),\n monthsShort:\n 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),\n weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),\n weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),\n weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D [ב]MMMM YYYY',\n LLL: 'D [ב]MMMM YYYY HH:mm',\n LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',\n l: 'D/M/YYYY',\n ll: 'D MMM YYYY',\n lll: 'D MMM YYYY HH:mm',\n llll: 'ddd, D MMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[היום ב־]LT',\n nextDay: '[מחר ב־]LT',\n nextWeek: 'dddd [בשעה] LT',\n lastDay: '[אתמול ב־]LT',\n lastWeek: '[ביום] dddd [האחרון בשעה] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'בעוד %s',\n past: 'לפני %s',\n s: 'מספר שניות',\n ss: '%d שניות',\n m: 'דקה',\n mm: '%d דקות',\n h: 'שעה',\n hh: function (number) {\n if (number === 2) {\n return 'שעתיים';\n }\n return number + ' שעות';\n },\n d: 'יום',\n dd: function (number) {\n if (number === 2) {\n return 'יומיים';\n }\n return number + ' ימים';\n },\n M: 'חודש',\n MM: function (number) {\n if (number === 2) {\n return 'חודשיים';\n }\n return number + ' חודשים';\n },\n y: 'שנה',\n yy: function (number) {\n if (number === 2) {\n return 'שנתיים';\n } else if (number % 10 === 0 && number !== 10) {\n return number + ' שנה';\n }\n return number + ' שנים';\n },\n },\n meridiemParse:\n /אחה\"צ|לפנה\"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,\n isPM: function (input) {\n return /^(אחה\"צ|אחרי הצהריים|בערב)$/.test(input);\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 5) {\n return 'לפנות בוקר';\n } else if (hour < 10) {\n return 'בבוקר';\n } else if (hour < 12) {\n return isLower ? 'לפנה\"צ' : 'לפני הצהריים';\n } else if (hour < 18) {\n return isLower ? 'אחה\"צ' : 'אחרי הצהריים';\n } else {\n return 'בערב';\n }\n },\n });\n\n return he;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3MTMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzP2M3YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEhlYnJldyBbaGVdXG4vLyEgYXV0aG9yIDogVG9tZXIgQ29oZW4gOiBodHRwczovL2dpdGh1Yi5jb20vdG9tZXJcbi8vISBhdXRob3IgOiBNb3NoZSBTaW1hbnRvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9EZXZlbG9wbWVudElMXG4vLyEgYXV0aG9yIDogVGFsIEF0ZXIgOiBodHRwczovL2dpdGh1Yi5jb20vVGFsQXRlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGhlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaGUnLCB7XG4gICAgICAgIG1vbnRoczogJ9eZ16DXldeQ16hf16TXkdeo15XXkNeoX9ee16jXpV/XkNek16jXmdecX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXldeh15hf16HXpNeY157XkdeoX9eQ15XXp9eY15XXkdeoX9eg15XXkdee15HXqF/Xk9em157XkdeoJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfXmdeg15XXs1/XpNeR16jXs1/Xnteo16Vf15DXpNeo17Nf157XkNeZX9eZ15XXoNeZX9eZ15XXnNeZX9eQ15XXktezX9eh16TXmNezX9eQ15XXp9ezX9eg15XXkdezX9eT16bXntezJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9eo15DXqdeV159f16nXoNeZX9ep15zXmdep15lf16jXkdeZ16LXmV/Xl9ee15nXqdeZX9ep15nXqdeZX9ep15HXqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9eQ17Nf15HXs1/XktezX9eT17Nf15TXs1/XldezX9ep17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn15Bf15Ff15Jf15Nf15Rf15Vf16knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBb15FdTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW9eRXU1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBb15FdTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb15TXmdeV150g15HWvl1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9ee15fXqCDXkda+XUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb15DXqtee15XXnCDXkda+XUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9eR15nXldedXSBkZGRkIFvXlNeQ15fXqNeV158g15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn15HXoteV15MgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9ec16TXoNeZICVzJyxcbiAgICAgICAgICAgIHM6ICfXnteh16TXqCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg16nXoNeZ15XXqicsXG4gICAgICAgICAgICBtOiAn15PXp9eUJyxcbiAgICAgICAgICAgIG1tOiAnJWQg15PXp9eV16onLFxuICAgICAgICAgICAgaDogJ9ep16LXlCcsXG4gICAgICAgICAgICBoaDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXqdei16rXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdei15XXqic7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZDogJ9eZ15XXnScsXG4gICAgICAgICAgICBkZDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXmdeV157XmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXmdee15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTTogJ9eX15XXk9epJyxcbiAgICAgICAgICAgIE1NOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eX15XXk9ep15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15fXldeT16nXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5OiAn16nXoNeUJyxcbiAgICAgICAgICAgIHl5OiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16DXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgJSAxMCA9PT0gMCAmJiBudW1iZXIgIT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXlCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16DXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6XG4gICAgICAgICAgICAv15DXl9eUXCLXpnzXnNek16DXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815zXpNeg15kg15TXpteU16jXmdeZ151815zXpNeg15XXqiDXkdeV16fXqHzXkdeR15XXp9eofNeR16LXqNeRL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNeQ15fXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815HXoteo15EpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9ec16TXoNeV16og15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR15HXlden16gnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXnNek16DXlFwi16YnIDogJ9ec16TXoNeZINeU16bXlNeo15nXmdedJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn15DXl9eUXCLXpicgOiAn15DXl9eo15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9eR16LXqNeRJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoZTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11713\n")},11729:(I,g,n)=>{"use strict";I.exports=n.p+"1826b0be16eb2d9ba2a4.png"},11885:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Telugu [te]\n//! author : Krishna Chaitanya Thota : https://github.com/kcthota\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var te = moment.defineLocale('te', {\n months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(\n '_'\n ),\n monthsShort:\n 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays:\n 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(\n '_'\n ),\n weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),\n weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),\n longDateFormat: {\n LT: 'A h:mm',\n LTS: 'A h:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm',\n LLLL: 'dddd, D MMMM YYYY, A h:mm',\n },\n calendar: {\n sameDay: '[నేడు] LT',\n nextDay: '[రేపు] LT',\n nextWeek: 'dddd, LT',\n lastDay: '[నిన్న] LT',\n lastWeek: '[గత] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s లో',\n past: '%s క్రితం',\n s: 'కొన్ని క్షణాలు',\n ss: '%d సెకన్లు',\n m: 'ఒక నిమిషం',\n mm: '%d నిమిషాలు',\n h: 'ఒక గంట',\n hh: '%d గంటలు',\n d: 'ఒక రోజు',\n dd: '%d రోజులు',\n M: 'ఒక నెల',\n MM: '%d నెలలు',\n y: 'ఒక సంవత్సరం',\n yy: '%d సంవత్సరాలు',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}వ/,\n ordinal: '%dవ',\n meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'రాత్రి') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'ఉదయం') {\n return hour;\n } else if (meridiem === 'మధ్యాహ్నం') {\n return hour >= 10 ? hour : hour + 12;\n } else if (meridiem === 'సాయంత్రం') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'రాత్రి';\n } else if (hour < 10) {\n return 'ఉదయం';\n } else if (hour < 17) {\n return 'మధ్యాహ్నం';\n } else if (hour < 20) {\n return 'సాయంత్రం';\n } else {\n return 'రాత్రి';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return te;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4ODUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzPzVjYmIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRlbHVndSBbdGVdXG4vLyEgYXV0aG9yIDogS3Jpc2huYSBDaGFpdGFueWEgVGhvdGEgOiBodHRwczovL2dpdGh1Yi5jb20va2N0aG90YVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRlID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGUnLCB7XG4gICAgICAgIG1vbnRoczogJ+CwnOCwqOCwteCwsOCwv1/gsKvgsL/gsKzgsY3gsLDgsLXgsLDgsL9f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwv+CwsuCxjV/gsK7gsYdf4LCc4LGC4LCo4LGNX+CwnOCxgeCwsuCxiF/gsIbgsJfgsLjgsY3gsJ/gsYFf4LC44LGG4LCq4LGN4LCf4LGG4LCC4LCs4LCw4LGNX+CwheCwleCxjeCwn+Cxi+CwrOCwsOCxjV/gsKjgsLXgsILgsKzgsLDgsY1f4LCh4LC/4LC44LGG4LCC4LCs4LCw4LGNJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgsJzgsKguX+Cwq+Cwv+CwrOCxjeCwsC5f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwvy5f4LCu4LGHX+CwnOCxguCwqOCxjV/gsJzgsYHgsLLgsYhf4LCG4LCXLl/gsLjgsYbgsKrgsY0uX+CwheCwleCxjeCwn+Cxiy5f4LCo4LC1Ll/gsKHgsL/gsLjgsYYuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+CwhuCwpuCwv+CwteCwvuCwsOCwgl/gsLjgsYvgsK7gsLXgsL7gsLDgsIJf4LCu4LCC4LCX4LCz4LC14LC+4LCw4LCCX+CwrOCxgeCwp+CwteCwvuCwsOCwgl/gsJfgsYHgsLDgsYHgsLXgsL7gsLDgsIJf4LC24LGB4LCV4LGN4LCw4LC14LC+4LCw4LCCX+CwtuCwqOCwv+CwteCwvuCwsOCwgicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LCG4LCm4LC/X+CwuOCxi+Cwrl/gsK7gsILgsJfgsLNf4LCs4LGB4LCnX+Cwl+CxgeCwsOCxgV/gsLbgsYHgsJXgsY3gsLBf4LC24LCo4LC/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Cwhl/gsLjgsYtf4LCu4LCCX+CwrOCxgV/gsJfgsYFf4LC24LGBX+Cwticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgsKjgsYfgsKHgsYFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LCw4LGH4LCq4LGBXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LCo4LC/4LCo4LGN4LCoXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgsJfgsKRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LCy4LGLJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgsJXgsY3gsLDgsL/gsKTgsIInLFxuICAgICAgICAgICAgczogJ+CwleCxiuCwqOCxjeCwqOCwvyDgsJXgsY3gsLfgsKPgsL7gsLLgsYEnLFxuICAgICAgICAgICAgc3M6ICclZCDgsLjgsYbgsJXgsKjgsY3gsLLgsYEnLFxuICAgICAgICAgICAgbTogJ+CwkuCwlSDgsKjgsL/gsK7gsL/gsLfgsIInLFxuICAgICAgICAgICAgbW06ICclZCDgsKjgsL/gsK7gsL/gsLfgsL7gsLLgsYEnLFxuICAgICAgICAgICAgaDogJ+CwkuCwlSDgsJfgsILgsJ8nLFxuICAgICAgICAgICAgaGg6ICclZCDgsJfgsILgsJ/gsLLgsYEnLFxuICAgICAgICAgICAgZDogJ+CwkuCwlSDgsLDgsYvgsJzgsYEnLFxuICAgICAgICAgICAgZGQ6ICclZCDgsLDgsYvgsJzgsYHgsLLgsYEnLFxuICAgICAgICAgICAgTTogJ+CwkuCwlSDgsKjgsYbgsLInLFxuICAgICAgICAgICAgTU06ICclZCDgsKjgsYbgsLLgsLLgsYEnLFxuICAgICAgICAgICAgeTogJ+CwkuCwlSDgsLjgsILgsLXgsKTgsY3gsLjgsLDgsIInLFxuICAgICAgICAgICAgeXk6ICclZCDgsLjgsILgsLXgsKTgsY3gsLjgsLDgsL7gsLLgsYEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3gsLUvLFxuICAgICAgICBvcmRpbmFsOiAnJWTgsLUnLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LCw4LC+4LCk4LGN4LCw4LC/fOCwieCwpuCwr+CwgnzgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIJ84LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4LCw4LC+4LCk4LGN4LCw4LC/Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LCJ4LCm4LCv4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwsOCwvuCwpOCxjeCwsOCwvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCJ4LCm4LCv4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwuOCwvuCwr+CwguCwpOCxjeCwsOCwgic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCw4LC+4LCk4LGN4LCw4LC/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11885\n")},13184:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n ServerStyleSheet: () => (/* binding */ vt),\n StyleSheetConsumer: () => (/* binding */ Be),\n StyleSheetContext: () => (/* binding */ $e),\n StyleSheetManager: () => (/* binding */ Ye),\n ThemeConsumer: () => (/* binding */ tt),\n ThemeContext: () => (/* binding */ et),\n ThemeProvider: () => (/* binding */ ot),\n __PRIVATE__: () => (/* binding */ gt),\n createGlobalStyle: () => (/* binding */ ft),\n css: () => (/* binding */ lt),\n "default": () => (/* binding */ dt),\n isStyledComponent: () => (/* binding */ se),\n keyframes: () => (/* binding */ mt),\n styled: () => (/* binding */ dt),\n useTheme: () => (/* binding */ nt),\n version: () => (/* binding */ v),\n withTheme: () => (/* binding */ yt)\n});\n\n;// ./node_modules/@intertrust/condensed-uikit/node_modules/tslib/tslib.es6.mjs\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== "function" && b !== null)\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nfunction __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nfunction __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nfunction __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }\n var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";\n var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === "accessor") {\n if (result === void 0) continue;\n if (result === null || typeof result !== "object") throw new TypeError("Object expected");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === "field") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nfunction __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nfunction __propKey(x) {\n return typeof x === "symbol" ? x : "".concat(x);\n};\n\nfunction __setFunctionName(f, name, prefix) {\n if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";\n return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });\n};\n\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nfunction __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nfunction __exportStar(m, o) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nfunction __values(o) {\n var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === "number") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n}\n\nfunction __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nfunction __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nfunction __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume("next", value); }\n function reject(value) { resume("throw", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, "default", { enumerable: true, value: v });\n}) : function(o, v) {\n o["default"] = v;\n};\n\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nfunction __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === "m") throw new TypeError("Private method is not writable");\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use \'in\' operator on non-object");\n return typeof state === "function" ? receiver === state : state.has(receiver);\n}\n\nfunction __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");\n var dispose;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");\n dispose = value[Symbol.dispose];\n }\n if (typeof dispose !== "function") throw new TypeError("Object not disposable.");\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;\n};\n\nfunction __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;\n env.hasError = true;\n }\n function next() {\n while (env.stack.length) {\n var rec = env.stack.pop();\n try {\n var result = rec.dispose && rec.dispose.call(rec.value);\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n catch (e) {\n fail(e);\n }\n }\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\n/* harmony default export */ const tslib_es6 = ({\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n});\n\n// EXTERNAL MODULE: consume shared module (default) react@^17.0.2 (singleton) (fallback: ./node_modules/react/index.js) (eager)\nvar index_js_eager_ = __webpack_require__(24002);\nvar index_js_eager_default = /*#__PURE__*/__webpack_require__.n(index_js_eager_);\n// EXTERNAL MODULE: ./node_modules/shallowequal/index.js\nvar shallowequal = __webpack_require__(2833);\nvar shallowequal_default = /*#__PURE__*/__webpack_require__.n(shallowequal);\n;// ./node_modules/stylis/src/Enum.js\nvar MS = \'-ms-\'\nvar MOZ = \'-moz-\'\nvar WEBKIT = \'-webkit-\'\n\nvar COMMENT = \'comm\'\nvar Enum_RULESET = \'rule\'\nvar DECLARATION = \'decl\'\n\nvar PAGE = \'@page\'\nvar MEDIA = \'@media\'\nvar IMPORT = \'@import\'\nvar CHARSET = \'@charset\'\nvar VIEWPORT = \'@viewport\'\nvar SUPPORTS = \'@supports\'\nvar DOCUMENT = \'@document\'\nvar NAMESPACE = \'@namespace\'\nvar KEYFRAMES = \'@keyframes\'\nvar FONT_FACE = \'@font-face\'\nvar COUNTER_STYLE = \'@counter-style\'\nvar FONT_FEATURE_VALUES = \'@font-feature-values\'\nvar LAYER = \'@layer\'\nvar SCOPE = \'@scope\'\n\n;// ./node_modules/stylis/src/Utility.js\n/**\n * @param {number}\n * @return {number}\n */\nvar abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nvar Utility_from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nvar Utility_assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nfunction hash (value, length) {\n\treturn Utility_charat(value, 0) ^ 45 ? (((((((length << 2) ^ Utility_charat(value, 0)) << 2) ^ Utility_charat(value, 1)) << 2) ^ Utility_charat(value, 2)) << 2) ^ Utility_charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nfunction trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nfunction match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nfunction replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @param {number} position\n * @return {number}\n */\nfunction indexof (value, search, position) {\n\treturn value.indexOf(search, position)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nfunction Utility_charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nfunction Utility_substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nfunction Utility_strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nfunction Utility_sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nfunction Utility_append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nfunction Utility_combine (array, callback) {\n\treturn array.map(callback).join(\'\')\n}\n\n/**\n * @param {string[]} array\n * @param {RegExp} pattern\n * @return {string[]}\n */\nfunction filter (array, pattern) {\n\treturn array.filter(function (value) { return !match(value, pattern) })\n}\n\n;// ./node_modules/stylis/src/Tokenizer.js\n\n\nvar line = 1\nvar column = 1\nvar Tokenizer_length = 0\nvar position = 0\nvar character = 0\nvar characters = \'\'\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {object[]} siblings\n * @param {number} length\n */\nfunction node (value, root, parent, type, props, children, length, siblings) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: \'\', siblings: siblings}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nfunction copy (root, props) {\n\treturn Utility_assign(node(\'\', null, null, \'\', null, null, 0, root.siblings), root, {length: -root.length}, props)\n}\n\n/**\n * @param {object} root\n */\nfunction lift (root) {\n\twhile (root.root)\n\t\troot = copy(root.root, {children: [root]})\n\n\tUtility_append(root, root.siblings)\n}\n\n/**\n * @return {number}\n */\nfunction Tokenizer_char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nfunction prev () {\n\tcharacter = position > 0 ? Utility_charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nfunction next () {\n\tcharacter = position < Tokenizer_length ? Utility_charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nfunction peek () {\n\treturn Utility_charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nfunction caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nfunction slice (begin, end) {\n\treturn Utility_substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nfunction token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// " \' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nfunction alloc (value) {\n\treturn line = column = 1, Tokenizer_length = Utility_strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nfunction dealloc (value) {\n\treturn characters = \'\', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nfunction delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nfunction Tokenizer_tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nfunction whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? \'\' : \' \'\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nfunction tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nfunction escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nfunction delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) " \'\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// " \'\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nfunction commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn \'/*\' + slice(index, position - 1) + \'*\' + Utility_from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nfunction identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n\n;// ./node_modules/stylis/src/Serializer.js\n\n\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nfunction serialize (children, callback) {\n\tvar output = \'\'\n\n\tfor (var i = 0; i < children.length; i++)\n\t\toutput += callback(children[i], i, children, callback) || \'\'\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nfunction stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return \'\'\n\t\tcase KEYFRAMES: return element.return = element.value + \'{\' + serialize(element.children, callback) + \'}\'\n\t\tcase Enum_RULESET: if (!Utility_strlen(element.value = element.props.join(\',\'))) return \'\'\n\t}\n\n\treturn Utility_strlen(children = serialize(element.children, callback)) ? element.return = element.value + \'{\' + children + \'}\' : \'\'\n}\n\n;// ./node_modules/stylis/src/Prefixer.js\n\n\n\n/**\n * @param {string} value\n * @param {number} length\n * @param {object[]} children\n * @return {string}\n */\nfunction prefix (value, length, children) {\n\tswitch (hash(value, length)) {\n\t\t// color-adjust\n\t\tcase 5103:\n\t\t\treturn WEBKIT + \'print-\' + value + value\n\t\t// animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\t\tcase 5737: case 4201: case 3177: case 3433: case 1641: case 4457: case 2921:\n\t\t// text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\t\tcase 5572: case 6356: case 5844: case 3191: case 6645: case 3005:\n\t\t// mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\t\tcase 6391: case 5879: case 5623: case 6135: case 4599: case 4855:\n\t\t// background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\t\tcase 4215: case 6389: case 5109: case 5365: case 5621: case 3829:\n\t\t\treturn WEBKIT + value + value\n\t\t// tab-size\n\t\tcase 4789:\n\t\t\treturn MOZ + value + value\n\t\t// appearance, user-select, transform, hyphens, text-size-adjust\n\t\tcase 5349: case 4246: case 4810: case 6968: case 2756:\n\t\t\treturn WEBKIT + value + MOZ + value + MS + value + value\n\t\t// writing-mode\n\t\tcase 5936:\n\t\t\tswitch (Utility_charat(value, length + 11)) {\n\t\t\t\t// vertical-l(r)\n\t\t\t\tcase 114:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, \'tb\') + value\n\t\t\t\t// vertical-r(l)\n\t\t\t\tcase 108:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, \'tb-rl\') + value\n\t\t\t\t// horizontal(-)tb\n\t\t\t\tcase 45:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, \'lr\') + value\n\t\t\t\t// default: fallthrough to below\n\t\t\t}\n\t\t// flex, flex-direction, scroll-snap-type, writing-mode\n\t\tcase 6828: case 4268: case 2903:\n\t\t\treturn WEBKIT + value + MS + value + value\n\t\t// order\n\t\tcase 6165:\n\t\t\treturn WEBKIT + value + MS + \'flex-\' + value + value\n\t\t// align-items\n\t\tcase 5187:\n\t\t\treturn WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + \'box-$1$2\' + MS + \'flex-$1$2\') + value\n\t\t// align-self\n\t\tcase 5443:\n\t\t\treturn WEBKIT + value + MS + \'flex-item-\' + replace(value, /flex-|-self/g, \'\') + (!match(value, /flex-|baseline/) ? MS + \'grid-row-\' + replace(value, /flex-|-self/g, \'\') : \'\') + value\n\t\t// align-content\n\t\tcase 4675:\n\t\t\treturn WEBKIT + value + MS + \'flex-line-pack\' + replace(value, /align-content|flex-|-self/g, \'\') + value\n\t\t// flex-shrink\n\t\tcase 5548:\n\t\t\treturn WEBKIT + value + MS + replace(value, \'shrink\', \'negative\') + value\n\t\t// flex-basis\n\t\tcase 5292:\n\t\t\treturn WEBKIT + value + MS + replace(value, \'basis\', \'preferred-size\') + value\n\t\t// flex-grow\n\t\tcase 6060:\n\t\t\treturn WEBKIT + \'box-\' + replace(value, \'-grow\', \'\') + WEBKIT + value + MS + replace(value, \'grow\', \'positive\') + value\n\t\t// transition\n\t\tcase 4554:\n\t\t\treturn WEBKIT + replace(value, /([^-])(transform)/g, \'$1\' + WEBKIT + \'$2\') + value\n\t\t// cursor\n\t\tcase 6187:\n\t\t\treturn replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + \'$1\'), /(image-set)/, WEBKIT + \'$1\'), value, \'\') + value\n\t\t// background, background-image\n\t\tcase 5495: case 3959:\n\t\t\treturn replace(value, /(image-set\\([^]*)/, WEBKIT + \'$1\' + \'$`$1\')\n\t\t// justify-content\n\t\tcase 4968:\n\t\t\treturn replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + \'box-pack:$3\' + MS + \'flex-pack:$3\'), /s.+-b[^;]+/, \'justify\') + WEBKIT + value + value\n\t\t// justify-self\n\t\tcase 4200:\n\t\t\tif (!match(value, /flex-|baseline/)) return MS + \'grid-column-align\' + Utility_substr(value, length) + value\n\t\t\tbreak\n\t\t// grid-template-(columns|rows)\n\t\tcase 2592: case 3360:\n\t\t\treturn MS + replace(value, \'template-\', \'\') + value\n\t\t// grid-(row|column)-start\n\t\tcase 4384: case 3616:\n\t\t\tif (children && children.some(function (element, index) { return length = index, match(element.props, /grid-\\w+-end/) })) {\n\t\t\t\treturn ~indexof(value + (children = children[length].value), \'span\', 0) ? value : (MS + replace(value, \'-start\', \'\') + value + MS + \'grid-row-span:\' + (~indexof(children, \'span\', 0) ? match(children, /\\d+/) : +match(children, /\\d+/) - +match(value, /\\d+/)) + \';\')\n\t\t\t}\n\t\t\treturn MS + replace(value, \'-start\', \'\') + value\n\t\t// grid-(row|column)-end\n\t\tcase 4896: case 4128:\n\t\t\treturn (children && children.some(function (element) { return match(element.props, /grid-\\w+-start/) })) ? value : MS + replace(replace(value, \'-end\', \'-span\'), \'span \', \'\') + value\n\t\t// (margin|padding)-inline-(start|end)\n\t\tcase 4095: case 3583: case 4068: case 2532:\n\t\t\treturn replace(value, /(.+)-inline(.+)/, WEBKIT + \'$1$2\') + value\n\t\t// (min|max)?(width|height|inline-size|block-size)\n\t\tcase 8116: case 7059: case 5753: case 5535:\n\t\tcase 5445: case 5701: case 4933: case 4677:\n\t\tcase 5533: case 5789: case 5021: case 4765:\n\t\t\t// stretch, max-content, min-content, fill-available\n\t\t\tif (Utility_strlen(value) - 1 - length > 6)\n\t\t\t\tswitch (Utility_charat(value, length + 1)) {\n\t\t\t\t\t// (m)ax-content, (m)in-content\n\t\t\t\t\tcase 109:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (Utility_charat(value, length + 4) !== 45)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t// (f)ill-available, (f)it-content\n\t\t\t\t\tcase 102:\n\t\t\t\t\t\treturn replace(value, /(.+:)(.+)-([^]+)/, \'$1\' + WEBKIT + \'$2-$3\' + \'$1\' + MOZ + (Utility_charat(value, length + 3) == 108 ? \'$3\' : \'$2-$3\')) + value\n\t\t\t\t\t// (s)tretch\n\t\t\t\t\tcase 115:\n\t\t\t\t\t\treturn ~indexof(value, \'stretch\', 0) ? prefix(replace(value, \'stretch\', \'fill-available\'), length, children) + value : value\n\t\t\t\t}\n\t\t\tbreak\n\t\t// grid-(column|row)\n\t\tcase 5152: case 5920:\n\t\t\treturn replace(value, /(.+?):(\\d+)(\\s*\\/\\s*(span)?\\s*(\\d+))?(.*)/, function (_, a, b, c, d, e, f) { return (MS + a + \':\' + b + f) + (c ? (MS + a + \'-span:\' + (d ? e : +e - +b)) + f : \'\') + value })\n\t\t// position: sticky\n\t\tcase 4949:\n\t\t\t// stick(y)?\n\t\t\tif (Utility_charat(value, length + 6) === 121)\n\t\t\t\treturn replace(value, \':\', \':\' + WEBKIT) + value\n\t\t\tbreak\n\t\t// display: (flex|inline-flex|grid|inline-grid)\n\t\tcase 6444:\n\t\t\tswitch (Utility_charat(value, Utility_charat(value, 14) === 45 ? 18 : 11)) {\n\t\t\t\t// (inline-)?fle(x)\n\t\t\t\tcase 120:\n\t\t\t\t\treturn replace(value, /(.+:)([^;\\s!]+)(;|(\\s+)?!.+)?/, \'$1\' + WEBKIT + (Utility_charat(value, 14) === 45 ? \'inline-\' : \'\') + \'box$3\' + \'$1\' + WEBKIT + \'$2$3\' + \'$1\' + MS + \'$2box$3\') + value\n\t\t\t\t// (inline-)?gri(d)\n\t\t\t\tcase 100:\n\t\t\t\t\treturn replace(value, \':\', \':\' + MS) + value\n\t\t\t}\n\t\t\tbreak\n\t\t// scroll-margin, scroll-margin-(top|right|bottom|left)\n\t\tcase 5719: case 2647: case 2135: case 3927: case 2391:\n\t\t\treturn replace(value, \'scroll-\', \'scroll-snap-\') + value\n\t}\n\n\treturn value\n}\n\n;// ./node_modules/stylis/src/Middleware.js\n\n\n\n\n\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nfunction middleware (collection) {\n\tvar length = Utility_sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = \'\'\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || \'\'\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nfunction rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nfunction prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length, children)\n\t\t\t\t\treturn\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, \'@\', \'@\' + WEBKIT)})], callback)\n\t\t\t\tcase Enum_RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn Utility_combine(children = element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, callback = /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase \':read-only\': case \':read-write\':\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [replace(value, /:(read-\\w+)/, \':\' + MOZ + \'$1\')]}))\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [value]}))\n\t\t\t\t\t\t\t\t\tUtility_assign(element, {props: filter(children, callback)})\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase \'::placeholder\':\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [replace(value, /:(plac\\w+)/, \':\' + WEBKIT + \'input-$1\')]}))\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [replace(value, /:(plac\\w+)/, \':\' + MOZ + \'$1\')]}))\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [replace(value, /:(plac\\w+)/, MS + \'input-$1\')]}))\n\t\t\t\t\t\t\t\t\tlift(copy(element, {props: [value]}))\n\t\t\t\t\t\t\t\t\tUtility_assign(element, {props: filter(children, callback)})\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn \'\'\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nfunction namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === \'global\')\n\t\t\t\t\t\t\t\tchildren[index] = \'\', children[++index] = \'\\f\' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? \'\' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? \'\' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n\n;// ./node_modules/stylis/src/Parser.js\n\n\n\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nfunction compile (value) {\n\treturn dealloc(parse(\'\', null, null, null, [\'\'], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nfunction parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = \'\'\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && Utility_charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), \'&\', \'&\\f\'), \'&\\f\', abs(index ? points[index - 1] : 0)) != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// " \' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tUtility_append(comment(commenter(next(), caret()), root, parent, declarations), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += \'/\'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = Utility_strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, \'\')\n\t\t\t\t\t\tif (property > 0 && (Utility_strlen(characters) - length))\n\t\t\t\t\t\t\tUtility_append(property > 32 ? declaration(characters + \';\', rule, parent, length - 1, declarations) : declaration(replace(characters, \' \', \'\') + \';\', rule, parent, length - 2, declarations), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += \';\'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tUtility_append(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length, rulesets), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule === 99 && Utility_charat(characters, 3) === 110 ? 100 : atrule) {\n\t\t\t\t\t\t\t\t\t// d l m s\n\t\t\t\t\t\t\t\t\tcase 100: case 108: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && Utility_append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length, children), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [\'\'], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = \'\', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + Utility_strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += Utility_from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += \'\\f\', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (Utility_strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = Utility_strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && Utility_strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @param {object[]} siblings\n * @return {object}\n */\nfunction ruleset (value, root, parent, index, offset, rules, points, type, props, children, length, siblings) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : [\'\']\n\tvar size = Utility_sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = Utility_substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + \' \' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? Enum_RULESET : type, props, children, length, siblings)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @param {object[]} siblings\n * @return {object}\n */\nfunction comment (value, root, parent, siblings) {\n\treturn node(value, root, parent, COMMENT, Utility_from(Tokenizer_char()), Utility_substr(value, 2, -2), 0, siblings)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @param {object[]} siblings\n * @return {object}\n */\nfunction declaration (value, root, parent, length, siblings) {\n\treturn node(value, root, parent, DECLARATION, Utility_substr(value, 0, length), Utility_substr(value, length + 1, -1), length, siblings)\n}\n\n;// ./node_modules/@intertrust/condensed-uikit/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js\nvar unitlessKeys = {\n animationIterationCount: 1,\n aspectRatio: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\n\n\n;// ./node_modules/@intertrust/condensed-uikit/node_modules/styled-components/dist/styled-components.browser.esm.js\nvar f="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",m="active",y="data-styled-version",v="6.1.19",g="/*!sc*/\\n",S="undefined"!=typeof window&&"undefined"!=typeof document,w=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY?"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY:"production"!=="production"),b={},E=/invalid hook call/i,N=new Set,P=function(t,n){if(false)// removed by dead control flow\n{ var a, o, s, i; }},_=Object.freeze([]),C=Object.freeze({});function I(e,t,n){return void 0===n&&(n=C),e.theme!==n.theme&&e.theme||t||n.theme}var A=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),O=/[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^`{|}~-]+/g,D=/(^-|-$)/g;function R(e){return e.replace(O,"-").replace(D,"")}var T=/(a)(d)/gi,k=52,j=function(e){return String.fromCharCode(e+(e>25?39:97))};function x(e){var t,n="";for(t=Math.abs(e);t>k;t=t/k|0)n=j(t%k)+n;return(j(t%k)+n).replace(T,"$1-$2")}var V,F=5381,M=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},z=function(e){return M(F,e)};function $(e){return x(z(e)>>>0)}function B(e){return false||e.displayName||e.name||"Component"}function L(e){return"string"==typeof e&&( true||0)}var G="function"==typeof Symbol&&Symbol.for,Y=G?Symbol.for("react.memo"):60115,W=G?Symbol.for("react.forward_ref"):60112,q={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},H={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},U={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},J=((V={})[W]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},V[Y]=U,V);function X(e){return("type"in(t=e)&&t.type.$$typeof)===Y?U:"$$typeof"in e?J[e.$$typeof]:q;// removed by dead control flow\n{ var t; }}var Z=Object.defineProperty,K=Object.getOwnPropertyNames,Q=Object.getOwnPropertySymbols,ee=Object.getOwnPropertyDescriptor,te=Object.getPrototypeOf,ne=Object.prototype;function oe(e,t,n){if("string"!=typeof t){if(ne){var o=te(t);o&&o!==ne&&oe(e,o,n)}var r=K(t);Q&&(r=r.concat(Q(t)));for(var s=X(e),i=X(t),a=0;a0?" Args: ".concat(n.join(", ")):"")):0}var fe=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,o=n.length,r=o;e>=r;)if((r<<=1)<0)throw he(16,"".concat(e));this.groupSizes=new Uint32Array(r),this.groupSizes.set(n),this.length=r;for(var s=o;s=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],o=this.indexOfGroup(e),r=o+n,s=o;s=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e0&&(c+="".concat(e,","))}),o+="".concat(i).concat(a,\'{content:"\').concat(c,\'"}\').concat(g)},s=0;s0?".".concat(t):e},u=c.slice();u.push(function(e){e.type===Enum_RULESET&&e.value.includes("&")&&(e.props[0]=e.props[0].replace(je,n).replace(o,l))}),i.prefix&&u.push(prefixer),u.push(stringify);var p=function(e,r,s,a){void 0===r&&(r=""),void 0===s&&(s=""),void 0===a&&(a="&"),t=a,n=r,o=new RegExp("\\\\".concat(n,"\\\\b"),"g");var c=e.replace(xe,""),l=compile(s||r?"".concat(s," ").concat(r," { ").concat(c," }"):c);i.namespace&&(l=Ve(l,i.namespace));var p=[];return serialize(l,middleware(u.concat(rulesheet(function(e){return p.push(e)})))),p};return p.hash=c.length?c.reduce(function(e,t){return t.name||he(15),M(e,t.name)},F).toString():"",p}var Me=new ke,ze=Fe(),$e=index_js_eager_default().createContext({shouldForwardProp:void 0,styleSheet:Me,stylis:ze}),Be=$e.Consumer,Le=index_js_eager_default().createContext(void 0);function Ge(){return (0,index_js_eager_.useContext)($e)}function Ye(e){var t=(0,index_js_eager_.useState)(e.stylisPlugins),n=t[0],r=t[1],c=Ge().styleSheet,l=(0,index_js_eager_.useMemo)(function(){var t=c;return e.sheet?t=e.sheet:e.target&&(t=t.reconstructWithOptions({target:e.target},!1)),e.disableCSSOMInjection&&(t=t.reconstructWithOptions({useCSSOMInjection:!1})),t},[e.disableCSSOMInjection,e.sheet,e.target,c]),u=(0,index_js_eager_.useMemo)(function(){return Fe({options:{namespace:e.namespace,prefix:e.enableVendorPrefixes},plugins:n})},[e.enableVendorPrefixes,e.namespace,n]);(0,index_js_eager_.useEffect)(function(){shallowequal_default()(n,e.stylisPlugins)||r(e.stylisPlugins)},[e.stylisPlugins]);var d=(0,index_js_eager_.useMemo)(function(){return{shouldForwardProp:e.shouldForwardProp,styleSheet:l,stylis:u}},[e.shouldForwardProp,l,u]);return index_js_eager_default().createElement($e.Provider,{value:d},index_js_eager_default().createElement(Le.Provider,{value:u},e.children))}var We=function(){function e(e,t){var n=this;this.inject=function(e,t){void 0===t&&(t=ze);var o=n.name+t.hash;e.hasNameForId(n.id,o)||e.insertRules(n.id,o,t(n.rules,o,"@keyframes"))},this.name=e,this.id="sc-keyframes-".concat(e),this.rules=t,ue(this,function(){throw he(12,String(n.name))})}return e.prototype.getName=function(e){return void 0===e&&(e=ze),this.name+e.hash},e}(),qe=function(e){return e>="A"&&e<="Z"};function He(e){for(var t="",n=0;n>>0);if(!t.hasNameForId(this.componentId,s)){var i=n(r,".".concat(s),void 0,this.componentId);t.insertRules(this.componentId,s,i)}o=ie(o,s),this.staticRulesId=s}else{for(var a=M(this.baseHash,n.hash),c="",l=0;l>>0);t.hasNameForId(this.componentId,d)||t.insertRules(this.componentId,d,n(c,".".concat(d),void 0,this.componentId)),o=ie(o,d)}}return o},e}(),et=index_js_eager_default().createContext(void 0),tt=et.Consumer;function nt(){var e=(0,index_js_eager_.useContext)(et);if(!e)throw he(18);return e}function ot(e){var n=index_js_eager_default().useContext(et),r=(0,index_js_eager_.useMemo)(function(){return function(e,n){if(!e)throw he(14);if(re(e)){var o=e(n);if(false)// removed by dead control flow\n{}return o}if(Array.isArray(e)||"object"!=typeof e)throw he(8);return n?__assign(__assign({},n),e):e}(e.theme,n)},[e.theme,n]);return e.children?index_js_eager_default().createElement(et.Provider,{value:r},e.children):null}var rt={},st=new Set;function it(e,r,s){var i=se(e),a=e,c=!L(e),p=r.attrs,d=void 0===p?_:p,h=r.componentId,f=void 0===h?function(e,t){var n="string"!=typeof e?"sc":R(e);rt[n]=(rt[n]||0)+1;var o="".concat(n,"-").concat($(v+n+rt[n]));return t?"".concat(t,"-").concat(o):o}(r.displayName,r.parentComponentId):h,m=r.displayName,y=void 0===m?function(e){return L(e)?"styled.".concat(e):"Styled(".concat(B(e),")")}(e):m,g=r.displayName&&r.componentId?"".concat(R(r.displayName),"-").concat(r.componentId):r.componentId||f,S=i&&a.attrs?a.attrs.concat(d).filter(Boolean):d,w=r.shouldForwardProp;if(i&&a.shouldForwardProp){var b=a.shouldForwardProp;if(r.shouldForwardProp){var E=r.shouldForwardProp;w=function(e,t){return b(e,t)&&E(e,t)}}else w=b}var N=new Qe(s,g,i?a.componentStyle:void 0);function O(e,r){return function(e,r,s){var i=e.attrs,a=e.componentStyle,c=e.defaultProps,p=e.foldedComponentIds,d=e.styledComponentId,h=e.target,f=index_js_eager_default().useContext(et),m=Ge(),y=e.shouldForwardProp||m.shouldForwardProp; false&&0;var v=I(r,f,c)||C,g=function(e,n,o){for(var r,s=__assign(__assign({},n),{className:void 0,theme:o}),i=0;i2&&ke.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,o)},e}();function ft(n){for(var r=[],s=1;s").concat(t,"")},this.getStyleTags=function(){if(e.sealed)throw he(2);return e._emitSheetCSS()},this.getStyleElement=function(){var n;if(e.sealed)throw he(2);var r=e.instance.toString();if(!r)return[];var s=((n={})[f]="",n[y]=v,n.dangerouslySetInnerHTML={__html:r},n),i=Ce();return i&&(s.nonce=i),[index_js_eager_default().createElement("style",__assign({},s,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new ke({isServer:!0}),this.sealed=!1}return e.prototype.collectStyles=function(e){if(this.sealed)throw he(2);return index_js_eager_default().createElement(Ye,{sheet:this.instance},e)},e.prototype.interleaveWithNodeStream=function(e){throw he(3)},e}(),gt={StyleSheet:ke,mainSheet:Me}; false&&0;var St="__sc-".concat(f,"__"); false&&(0);\n//# sourceMappingURL=styled-components.browser.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxODQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUNqWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDak1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGludGVydHJ1c3QvY29uZGVuc2VkLXVpa2l0L25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzP2Y2MWUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9FbnVtLmpzP2JmMTEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9VdGlsaXR5LmpzP2NkZDciLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9Ub2tlbml6ZXIuanM/ZjhmNiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9zdHlsaXMvc3JjL1NlcmlhbGl6ZXIuanM/N2E3MiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9zdHlsaXMvc3JjL1ByZWZpeGVyLmpzP2Q5ODkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9NaWRkbGV3YXJlLmpzPzA2MTUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9QYXJzZXIuanM/MTE0MyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AaW50ZXJ0cnVzdC9jb25kZW5zZWQtdWlraXQvbm9kZV9tb2R1bGVzL0BlbW90aW9uL3VuaXRsZXNzL2Rpc3QvZW1vdGlvbi11bml0bGVzcy5lc20uanM/MjE4ZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AaW50ZXJ0cnVzdC9jb25kZW5zZWQtdWlraXQvbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL2Rpc3Qvc3R5bGVkLWNvbXBvbmVudHMuYnJvd3Nlci5lc20uanM/OTYwNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlO1xuICAgIGlmIChhc3luYykge1xuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiZXhwb3J0IHZhciBNUyA9ICctbXMtJ1xuZXhwb3J0IHZhciBNT1ogPSAnLW1vei0nXG5leHBvcnQgdmFyIFdFQktJVCA9ICctd2Via2l0LSdcblxuZXhwb3J0IHZhciBDT01NRU5UID0gJ2NvbW0nXG5leHBvcnQgdmFyIFJVTEVTRVQgPSAncnVsZSdcbmV4cG9ydCB2YXIgREVDTEFSQVRJT04gPSAnZGVjbCdcblxuZXhwb3J0IHZhciBQQUdFID0gJ0BwYWdlJ1xuZXhwb3J0IHZhciBNRURJQSA9ICdAbWVkaWEnXG5leHBvcnQgdmFyIElNUE9SVCA9ICdAaW1wb3J0J1xuZXhwb3J0IHZhciBDSEFSU0VUID0gJ0BjaGFyc2V0J1xuZXhwb3J0IHZhciBWSUVXUE9SVCA9ICdAdmlld3BvcnQnXG5leHBvcnQgdmFyIFNVUFBPUlRTID0gJ0BzdXBwb3J0cydcbmV4cG9ydCB2YXIgRE9DVU1FTlQgPSAnQGRvY3VtZW50J1xuZXhwb3J0IHZhciBOQU1FU1BBQ0UgPSAnQG5hbWVzcGFjZSdcbmV4cG9ydCB2YXIgS0VZRlJBTUVTID0gJ0BrZXlmcmFtZXMnXG5leHBvcnQgdmFyIEZPTlRfRkFDRSA9ICdAZm9udC1mYWNlJ1xuZXhwb3J0IHZhciBDT1VOVEVSX1NUWUxFID0gJ0Bjb3VudGVyLXN0eWxlJ1xuZXhwb3J0IHZhciBGT05UX0ZFQVRVUkVfVkFMVUVTID0gJ0Bmb250LWZlYXR1cmUtdmFsdWVzJ1xuZXhwb3J0IHZhciBMQVlFUiA9ICdAbGF5ZXInXG5leHBvcnQgdmFyIFNDT1BFID0gJ0BzY29wZSdcbiIsIi8qKlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnNcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn1cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IHZhciBmcm9tID0gU3RyaW5nLmZyb21DaGFyQ29kZVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgdmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ25cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2ggKHZhbHVlLCBsZW5ndGgpIHtcblx0cmV0dXJuIGNoYXJhdCh2YWx1ZSwgMCkgXiA0NSA/ICgoKCgoKChsZW5ndGggPDwgMikgXiBjaGFyYXQodmFsdWUsIDApKSA8PCAyKSBeIGNoYXJhdCh2YWx1ZSwgMSkpIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAyKSkgPDwgMikgXiBjaGFyYXQodmFsdWUsIDMpIDogMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbSAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLnRyaW0oKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtSZWdFeHB9IHBhdHRlcm5cbiAqIEByZXR1cm4ge3N0cmluZz99XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaCAodmFsdWUsIHBhdHRlcm4pIHtcblx0cmV0dXJuICh2YWx1ZSA9IHBhdHRlcm4uZXhlYyh2YWx1ZSkpID8gdmFsdWVbMF0gOiB2YWx1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHsoc3RyaW5nfFJlZ0V4cCl9IHBhdHRlcm5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZXBsYWNlbWVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZSAodmFsdWUsIHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7XG5cdHJldHVybiB2YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleG9mICh2YWx1ZSwgc2VhcmNoLCBwb3NpdGlvbikge1xuXHRyZXR1cm4gdmFsdWUuaW5kZXhPZihzZWFyY2gsIHBvc2l0aW9uKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFyYXQgKHZhbHVlLCBpbmRleCkge1xuXHRyZXR1cm4gdmFsdWUuY2hhckNvZGVBdChpbmRleCkgfCAwXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnN0ciAodmFsdWUsIGJlZ2luLCBlbmQpIHtcblx0cmV0dXJuIHZhbHVlLnNsaWNlKGJlZ2luLCBlbmQpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJsZW4gKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueVtdfSB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZW9mICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUubGVuZ3RoXG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge2FueVtdfSBhcnJheVxuICogQHJldHVybiB7YW55fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kICh2YWx1ZSwgYXJyYXkpIHtcblx0cmV0dXJuIGFycmF5LnB1c2godmFsdWUpLCB2YWx1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFycmF5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZSAoYXJyYXksIGNhbGxiYWNrKSB7XG5cdHJldHVybiBhcnJheS5tYXAoY2FsbGJhY2spLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJyYXlcbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlciAoYXJyYXksIHBhdHRlcm4pIHtcblx0cmV0dXJuIGFycmF5LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICFtYXRjaCh2YWx1ZSwgcGF0dGVybikgfSlcbn1cbiIsImltcG9ydCB7ZnJvbSwgdHJpbSwgY2hhcmF0LCBzdHJsZW4sIHN1YnN0ciwgYXBwZW5kLCBhc3NpZ259IGZyb20gJy4vVXRpbGl0eS5qcydcblxuZXhwb3J0IHZhciBsaW5lID0gMVxuZXhwb3J0IHZhciBjb2x1bW4gPSAxXG5leHBvcnQgdmFyIGxlbmd0aCA9IDBcbmV4cG9ydCB2YXIgcG9zaXRpb24gPSAwXG5leHBvcnQgdmFyIGNoYXJhY3RlciA9IDBcbmV4cG9ydCB2YXIgY2hhcmFjdGVycyA9ICcnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdCB8IG51bGx9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbH0gcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0W10gfCBzdHJpbmd9IGNoaWxkcmVuXG4gKiBAcGFyYW0ge29iamVjdFtdfSBzaWJsaW5nc1xuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9kZSAodmFsdWUsIHJvb3QsIHBhcmVudCwgdHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBsZW5ndGgsIHNpYmxpbmdzKSB7XG5cdHJldHVybiB7dmFsdWU6IHZhbHVlLCByb290OiByb290LCBwYXJlbnQ6IHBhcmVudCwgdHlwZTogdHlwZSwgcHJvcHM6IHByb3BzLCBjaGlsZHJlbjogY2hpbGRyZW4sIGxpbmU6IGxpbmUsIGNvbHVtbjogY29sdW1uLCBsZW5ndGg6IGxlbmd0aCwgcmV0dXJuOiAnJywgc2libGluZ3M6IHNpYmxpbmdzfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHkgKHJvb3QsIHByb3BzKSB7XG5cdHJldHVybiBhc3NpZ24obm9kZSgnJywgbnVsbCwgbnVsbCwgJycsIG51bGwsIG51bGwsIDAsIHJvb3Quc2libGluZ3MpLCByb290LCB7bGVuZ3RoOiAtcm9vdC5sZW5ndGh9LCBwcm9wcylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlmdCAocm9vdCkge1xuXHR3aGlsZSAocm9vdC5yb290KVxuXHRcdHJvb3QgPSBjb3B5KHJvb3Qucm9vdCwge2NoaWxkcmVuOiBbcm9vdF19KVxuXG5cdGFwcGVuZChyb290LCByb290LnNpYmxpbmdzKVxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXIgKCkge1xuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJldiAoKSB7XG5cdGNoYXJhY3RlciA9IHBvc2l0aW9uID4gMCA/IGNoYXJhdChjaGFyYWN0ZXJzLCAtLXBvc2l0aW9uKSA6IDBcblxuXHRpZiAoY29sdW1uLS0sIGNoYXJhY3RlciA9PT0gMTApXG5cdFx0Y29sdW1uID0gMSwgbGluZS0tXG5cblx0cmV0dXJuIGNoYXJhY3RlclxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHQgKCkge1xuXHRjaGFyYWN0ZXIgPSBwb3NpdGlvbiA8IGxlbmd0aCA/IGNoYXJhdChjaGFyYWN0ZXJzLCBwb3NpdGlvbisrKSA6IDBcblxuXHRpZiAoY29sdW1uKyssIGNoYXJhY3RlciA9PT0gMTApXG5cdFx0Y29sdW1uID0gMSwgbGluZSsrXG5cblx0cmV0dXJuIGNoYXJhY3RlclxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlZWsgKCkge1xuXHRyZXR1cm4gY2hhcmF0KGNoYXJhY3RlcnMsIHBvc2l0aW9uKVxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcmV0ICgpIHtcblx0cmV0dXJuIHBvc2l0aW9uXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuXHRyZXR1cm4gc3Vic3RyKGNoYXJhY3RlcnMsIGJlZ2luLCBlbmQpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuICh0eXBlKSB7XG5cdHN3aXRjaCAodHlwZSkge1xuXHRcdC8vIFxcMCBcXHQgXFxuIFxcciBcXHMgd2hpdGVzcGFjZSB0b2tlblxuXHRcdGNhc2UgMDogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0cmV0dXJuIDVcblx0XHQvLyAhICsgLCAvID4gQCB+IGlzb2xhdGUgdG9rZW5cblx0XHRjYXNlIDMzOiBjYXNlIDQzOiBjYXNlIDQ0OiBjYXNlIDQ3OiBjYXNlIDYyOiBjYXNlIDY0OiBjYXNlIDEyNjpcblx0XHQvLyA7IHsgfSBicmVha3BvaW50IHRva2VuXG5cdFx0Y2FzZSA1OTogY2FzZSAxMjM6IGNhc2UgMTI1OlxuXHRcdFx0cmV0dXJuIDRcblx0XHQvLyA6IGFjY29tcGFuaWVkIHRva2VuXG5cdFx0Y2FzZSA1ODpcblx0XHRcdHJldHVybiAzXG5cdFx0Ly8gXCIgJyAoIFsgb3BlbmluZyBkZWxpbWl0IHRva2VuXG5cdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA0MDogY2FzZSA5MTpcblx0XHRcdHJldHVybiAyXG5cdFx0Ly8gKSBdIGNsb3NpbmcgZGVsaW1pdCB0b2tlblxuXHRcdGNhc2UgNDE6IGNhc2UgOTM6XG5cdFx0XHRyZXR1cm4gMVxuXHR9XG5cblx0cmV0dXJuIDBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsb2MgKHZhbHVlKSB7XG5cdHJldHVybiBsaW5lID0gY29sdW1uID0gMSwgbGVuZ3RoID0gc3RybGVuKGNoYXJhY3RlcnMgPSB2YWx1ZSksIHBvc2l0aW9uID0gMCwgW11cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWxsb2MgKHZhbHVlKSB7XG5cdHJldHVybiBjaGFyYWN0ZXJzID0gJycsIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGltaXQgKHR5cGUpIHtcblx0cmV0dXJuIHRyaW0oc2xpY2UocG9zaXRpb24gLSAxLCBkZWxpbWl0ZXIodHlwZSA9PT0gOTEgPyB0eXBlICsgMiA6IHR5cGUgPT09IDQwID8gdHlwZSArIDEgOiB0eXBlKSkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplICh2YWx1ZSkge1xuXHRyZXR1cm4gZGVhbGxvYyh0b2tlbml6ZXIoYWxsb2ModmFsdWUpKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hpdGVzcGFjZSAodHlwZSkge1xuXHR3aGlsZSAoY2hhcmFjdGVyID0gcGVlaygpKVxuXHRcdGlmIChjaGFyYWN0ZXIgPCAzMylcblx0XHRcdG5leHQoKVxuXHRcdGVsc2Vcblx0XHRcdGJyZWFrXG5cblx0cmV0dXJuIHRva2VuKHR5cGUpID4gMiB8fCB0b2tlbihjaGFyYWN0ZXIpID4gMyA/ICcnIDogJyAnXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hpbGRyZW5cbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemVyIChjaGlsZHJlbikge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdHN3aXRjaCAodG9rZW4oY2hhcmFjdGVyKSkge1xuXHRcdFx0Y2FzZSAwOiBhcHBlbmQoaWRlbnRpZmllcihwb3NpdGlvbiAtIDEpLCBjaGlsZHJlbilcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMjogYXBwZW5kKGRlbGltaXQoY2hhcmFjdGVyKSwgY2hpbGRyZW4pXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRkZWZhdWx0OiBhcHBlbmQoZnJvbShjaGFyYWN0ZXIpLCBjaGlsZHJlbilcblx0XHR9XG5cblx0cmV0dXJuIGNoaWxkcmVuXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwaW5nIChpbmRleCwgY291bnQpIHtcblx0d2hpbGUgKC0tY291bnQgJiYgbmV4dCgpKVxuXHRcdC8vIG5vdCAwLTkgQS1GIGEtZlxuXHRcdGlmIChjaGFyYWN0ZXIgPCA0OCB8fCBjaGFyYWN0ZXIgPiAxMDIgfHwgKGNoYXJhY3RlciA+IDU3ICYmIGNoYXJhY3RlciA8IDY1KSB8fCAoY2hhcmFjdGVyID4gNzAgJiYgY2hhcmFjdGVyIDwgOTcpKVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gc2xpY2UoaW5kZXgsIGNhcmV0KCkgKyAoY291bnQgPCA2ICYmIHBlZWsoKSA9PSAzMiAmJiBuZXh0KCkgPT0gMzIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZXIgKHR5cGUpIHtcblx0d2hpbGUgKG5leHQoKSlcblx0XHRzd2l0Y2ggKGNoYXJhY3Rlcikge1xuXHRcdFx0Ly8gXSApIFwiICdcblx0XHRcdGNhc2UgdHlwZTpcblx0XHRcdFx0cmV0dXJuIHBvc2l0aW9uXG5cdFx0XHQvLyBcIiAnXG5cdFx0XHRjYXNlIDM0OiBjYXNlIDM5OlxuXHRcdFx0XHRpZiAodHlwZSAhPT0gMzQgJiYgdHlwZSAhPT0gMzkpXG5cdFx0XHRcdFx0ZGVsaW1pdGVyKGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIChcblx0XHRcdGNhc2UgNDA6XG5cdFx0XHRcdGlmICh0eXBlID09PSA0MSlcblx0XHRcdFx0XHRkZWxpbWl0ZXIodHlwZSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcXG5cdFx0XHRjYXNlIDkyOlxuXHRcdFx0XHRuZXh0KClcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cblx0cmV0dXJuIHBvc2l0aW9uXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWVudGVyICh0eXBlLCBpbmRleCkge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdC8vIC8vXG5cdFx0aWYgKHR5cGUgKyBjaGFyYWN0ZXIgPT09IDQ3ICsgMTApXG5cdFx0XHRicmVha1xuXHRcdC8vIC8qXG5cdFx0ZWxzZSBpZiAodHlwZSArIGNoYXJhY3RlciA9PT0gNDIgKyA0MiAmJiBwZWVrKCkgPT09IDQ3KVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gJy8qJyArIHNsaWNlKGluZGV4LCBwb3NpdGlvbiAtIDEpICsgJyonICsgZnJvbSh0eXBlID09PSA0NyA/IHR5cGUgOiBuZXh0KCkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmaWVyIChpbmRleCkge1xuXHR3aGlsZSAoIXRva2VuKHBlZWsoKSkpXG5cdFx0bmV4dCgpXG5cblx0cmV0dXJuIHNsaWNlKGluZGV4LCBwb3NpdGlvbilcbn1cbiIsImltcG9ydCB7SU1QT1JULCBMQVlFUiwgQ09NTUVOVCwgUlVMRVNFVCwgREVDTEFSQVRJT04sIEtFWUZSQU1FU30gZnJvbSAnLi9FbnVtLmpzJ1xuaW1wb3J0IHtzdHJsZW59IGZyb20gJy4vVXRpbGl0eS5qcydcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZSAoY2hpbGRyZW4sIGNhbGxiYWNrKSB7XG5cdHZhciBvdXRwdXQgPSAnJ1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG5cdFx0b3V0cHV0ICs9IGNhbGxiYWNrKGNoaWxkcmVuW2ldLCBpLCBjaGlsZHJlbiwgY2FsbGJhY2spIHx8ICcnXG5cblx0cmV0dXJuIG91dHB1dFxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNoaWxkcmVuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5IChlbGVtZW50LCBpbmRleCwgY2hpbGRyZW4sIGNhbGxiYWNrKSB7XG5cdHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG5cdFx0Y2FzZSBMQVlFUjogaWYgKGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSBicmVha1xuXHRcdGNhc2UgSU1QT1JUOiBjYXNlIERFQ0xBUkFUSU9OOiByZXR1cm4gZWxlbWVudC5yZXR1cm4gPSBlbGVtZW50LnJldHVybiB8fCBlbGVtZW50LnZhbHVlXG5cdFx0Y2FzZSBDT01NRU5UOiByZXR1cm4gJydcblx0XHRjYXNlIEtFWUZSQU1FUzogcmV0dXJuIGVsZW1lbnQucmV0dXJuID0gZWxlbWVudC52YWx1ZSArICd7JyArIHNlcmlhbGl6ZShlbGVtZW50LmNoaWxkcmVuLCBjYWxsYmFjaykgKyAnfSdcblx0XHRjYXNlIFJVTEVTRVQ6IGlmICghc3RybGVuKGVsZW1lbnQudmFsdWUgPSBlbGVtZW50LnByb3BzLmpvaW4oJywnKSkpIHJldHVybiAnJ1xuXHR9XG5cblx0cmV0dXJuIHN0cmxlbihjaGlsZHJlbiA9IHNlcmlhbGl6ZShlbGVtZW50LmNoaWxkcmVuLCBjYWxsYmFjaykpID8gZWxlbWVudC5yZXR1cm4gPSBlbGVtZW50LnZhbHVlICsgJ3snICsgY2hpbGRyZW4gKyAnfScgOiAnJ1xufVxuIiwiaW1wb3J0IHtNUywgTU9aLCBXRUJLSVR9IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7aGFzaCwgY2hhcmF0LCBzdHJsZW4sIGluZGV4b2YsIHJlcGxhY2UsIHN1YnN0ciwgbWF0Y2h9IGZyb20gJy4vVXRpbGl0eS5qcydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNoaWxkcmVuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVmaXggKHZhbHVlLCBsZW5ndGgsIGNoaWxkcmVuKSB7XG5cdHN3aXRjaCAoaGFzaCh2YWx1ZSwgbGVuZ3RoKSkge1xuXHRcdC8vIGNvbG9yLWFkanVzdFxuXHRcdGNhc2UgNTEwMzpcblx0XHRcdHJldHVybiBXRUJLSVQgKyAncHJpbnQtJyArIHZhbHVlICsgdmFsdWVcblx0XHQvLyBhbmltYXRpb24sIGFuaW1hdGlvbi0oZGVsYXl8ZGlyZWN0aW9ufGR1cmF0aW9ufGZpbGwtbW9kZXxpdGVyYXRpb24tY291bnR8bmFtZXxwbGF5LXN0YXRlfHRpbWluZy1mdW5jdGlvbilcblx0XHRjYXNlIDU3Mzc6IGNhc2UgNDIwMTogY2FzZSAzMTc3OiBjYXNlIDM0MzM6IGNhc2UgMTY0MTogY2FzZSA0NDU3OiBjYXNlIDI5MjE6XG5cdFx0Ly8gdGV4dC1kZWNvcmF0aW9uLCBmaWx0ZXIsIGNsaXAtcGF0aCwgYmFja2ZhY2UtdmlzaWJpbGl0eSwgY29sdW1uLCBib3gtZGVjb3JhdGlvbi1icmVha1xuXHRcdGNhc2UgNTU3MjogY2FzZSA2MzU2OiBjYXNlIDU4NDQ6IGNhc2UgMzE5MTogY2FzZSA2NjQ1OiBjYXNlIDMwMDU6XG5cdFx0Ly8gbWFzaywgbWFzay1pbWFnZSwgbWFzay0obW9kZXxjbGlwfHNpemUpLCBtYXNrLShyZXBlYXR8b3JpZ2luKSwgbWFzay1wb3NpdGlvbiwgbWFzay1jb21wb3NpdGUsXG5cdFx0Y2FzZSA2MzkxOiBjYXNlIDU4Nzk6IGNhc2UgNTYyMzogY2FzZSA2MTM1OiBjYXNlIDQ1OTk6IGNhc2UgNDg1NTpcblx0XHQvLyBiYWNrZ3JvdW5kLWNsaXAsIGNvbHVtbnMsIGNvbHVtbi0oY291bnR8ZmlsbHxnYXB8cnVsZXxydWxlLWNvbG9yfHJ1bGUtc3R5bGV8cnVsZS13aWR0aHxzcGFufHdpZHRoKVxuXHRcdGNhc2UgNDIxNTogY2FzZSA2Mzg5OiBjYXNlIDUxMDk6IGNhc2UgNTM2NTogY2FzZSA1NjIxOiBjYXNlIDM4Mjk6XG5cdFx0XHRyZXR1cm4gV0VCS0lUICsgdmFsdWUgKyB2YWx1ZVxuXHRcdC8vIHRhYi1zaXplXG5cdFx0Y2FzZSA0Nzg5OlxuXHRcdFx0cmV0dXJuIE1PWiArIHZhbHVlICsgdmFsdWVcblx0XHQvLyBhcHBlYXJhbmNlLCB1c2VyLXNlbGVjdCwgdHJhbnNmb3JtLCBoeXBoZW5zLCB0ZXh0LXNpemUtYWRqdXN0XG5cdFx0Y2FzZSA1MzQ5OiBjYXNlIDQyNDY6IGNhc2UgNDgxMDogY2FzZSA2OTY4OiBjYXNlIDI3NTY6XG5cdFx0XHRyZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNT1ogKyB2YWx1ZSArIE1TICsgdmFsdWUgKyB2YWx1ZVxuXHRcdC8vIHdyaXRpbmctbW9kZVxuXHRcdGNhc2UgNTkzNjpcblx0XHRcdHN3aXRjaCAoY2hhcmF0KHZhbHVlLCBsZW5ndGggKyAxMSkpIHtcblx0XHRcdFx0Ly8gdmVydGljYWwtbChyKVxuXHRcdFx0XHRjYXNlIDExNDpcblx0XHRcdFx0XHRyZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArIHJlcGxhY2UodmFsdWUsIC9bc3ZoXVxcdystW3RibHJdezJ9LywgJ3RiJykgKyB2YWx1ZVxuXHRcdFx0XHQvLyB2ZXJ0aWNhbC1yKGwpXG5cdFx0XHRcdGNhc2UgMTA4OlxuXHRcdFx0XHRcdHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgL1tzdmhdXFx3Ky1bdGJscl17Mn0vLCAndGItcmwnKSArIHZhbHVlXG5cdFx0XHRcdC8vIGhvcml6b250YWwoLSl0YlxuXHRcdFx0XHRjYXNlIDQ1OlxuXHRcdFx0XHRcdHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgL1tzdmhdXFx3Ky1bdGJscl17Mn0vLCAnbHInKSArIHZhbHVlXG5cdFx0XHRcdC8vIGRlZmF1bHQ6IGZhbGx0aHJvdWdoIHRvIGJlbG93XG5cdFx0XHR9XG5cdFx0Ly8gZmxleCwgZmxleC1kaXJlY3Rpb24sIHNjcm9sbC1zbmFwLXR5cGUsIHdyaXRpbmctbW9kZVxuXHRcdGNhc2UgNjgyODogY2FzZSA0MjY4OiBjYXNlIDI5MDM6XG5cdFx0XHRyZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArIHZhbHVlICsgdmFsdWVcblx0XHQvLyBvcmRlclxuXHRcdGNhc2UgNjE2NTpcblx0XHRcdHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgJ2ZsZXgtJyArIHZhbHVlICsgdmFsdWVcblx0XHQvLyBhbGlnbi1pdGVtc1xuXHRcdGNhc2UgNTE4Nzpcblx0XHRcdHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIHJlcGxhY2UodmFsdWUsIC8oXFx3KykuKyg6W15dKykvLCBXRUJLSVQgKyAnYm94LSQxJDInICsgTVMgKyAnZmxleC0kMSQyJykgKyB2YWx1ZVxuXHRcdC8vIGFsaWduLXNlbGZcblx0XHRjYXNlIDU0NDM6XG5cdFx0XHRyZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArICdmbGV4LWl0ZW0tJyArIHJlcGxhY2UodmFsdWUsIC9mbGV4LXwtc2VsZi9nLCAnJykgKyAoIW1hdGNoKHZhbHVlLCAvZmxleC18YmFzZWxpbmUvKSA/IE1TICsgJ2dyaWQtcm93LScgKyByZXBsYWNlKHZhbHVlLCAvZmxleC18LXNlbGYvZywgJycpIDogJycpICsgdmFsdWVcblx0XHQvLyBhbGlnbi1jb250ZW50XG5cdFx0Y2FzZSA0Njc1OlxuXHRcdFx0cmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyAnZmxleC1saW5lLXBhY2snICsgcmVwbGFjZSh2YWx1ZSwgL2FsaWduLWNvbnRlbnR8ZmxleC18LXNlbGYvZywgJycpICsgdmFsdWVcblx0XHQvLyBmbGV4LXNocmlua1xuXHRcdGNhc2UgNTU0ODpcblx0XHRcdHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgJ3NocmluaycsICduZWdhdGl2ZScpICsgdmFsdWVcblx0XHQvLyBmbGV4LWJhc2lzXG5cdFx0Y2FzZSA1MjkyOlxuXHRcdFx0cmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyByZXBsYWNlKHZhbHVlLCAnYmFzaXMnLCAncHJlZmVycmVkLXNpemUnKSArIHZhbHVlXG5cdFx0Ly8gZmxleC1ncm93XG5cdFx0Y2FzZSA2MDYwOlxuXHRcdFx0cmV0dXJuIFdFQktJVCArICdib3gtJyArIHJlcGxhY2UodmFsdWUsICctZ3JvdycsICcnKSArIFdFQktJVCArIHZhbHVlICsgTVMgKyByZXBsYWNlKHZhbHVlLCAnZ3JvdycsICdwb3NpdGl2ZScpICsgdmFsdWVcblx0XHQvLyB0cmFuc2l0aW9uXG5cdFx0Y2FzZSA0NTU0OlxuXHRcdFx0cmV0dXJuIFdFQktJVCArIHJlcGxhY2UodmFsdWUsIC8oW14tXSkodHJhbnNmb3JtKS9nLCAnJDEnICsgV0VCS0lUICsgJyQyJykgKyB2YWx1ZVxuXHRcdC8vIGN1cnNvclxuXHRcdGNhc2UgNjE4Nzpcblx0XHRcdHJldHVybiByZXBsYWNlKHJlcGxhY2UocmVwbGFjZSh2YWx1ZSwgLyh6b29tLXxncmFiKS8sIFdFQktJVCArICckMScpLCAvKGltYWdlLXNldCkvLCBXRUJLSVQgKyAnJDEnKSwgdmFsdWUsICcnKSArIHZhbHVlXG5cdFx0Ly8gYmFja2dyb3VuZCwgYmFja2dyb3VuZC1pbWFnZVxuXHRcdGNhc2UgNTQ5NTogY2FzZSAzOTU5OlxuXHRcdFx0cmV0dXJuIHJlcGxhY2UodmFsdWUsIC8oaW1hZ2Utc2V0XFwoW15dKikvLCBXRUJLSVQgKyAnJDEnICsgJyRgJDEnKVxuXHRcdC8vIGp1c3RpZnktY29udGVudFxuXHRcdGNhc2UgNDk2ODpcblx0XHRcdHJldHVybiByZXBsYWNlKHJlcGxhY2UodmFsdWUsIC8oLis6KShmbGV4LSk/KC4qKS8sIFdFQktJVCArICdib3gtcGFjazokMycgKyBNUyArICdmbGV4LXBhY2s6JDMnKSwgL3MuKy1iW147XSsvLCAnanVzdGlmeScpICsgV0VCS0lUICsgdmFsdWUgKyB2YWx1ZVxuXHRcdC8vIGp1c3RpZnktc2VsZlxuXHRcdGNhc2UgNDIwMDpcblx0XHRcdGlmICghbWF0Y2godmFsdWUsIC9mbGV4LXxiYXNlbGluZS8pKSByZXR1cm4gTVMgKyAnZ3JpZC1jb2x1bW4tYWxpZ24nICsgc3Vic3RyKHZhbHVlLCBsZW5ndGgpICsgdmFsdWVcblx0XHRcdGJyZWFrXG5cdFx0Ly8gZ3JpZC10ZW1wbGF0ZS0oY29sdW1uc3xyb3dzKVxuXHRcdGNhc2UgMjU5MjogY2FzZSAzMzYwOlxuXHRcdFx0cmV0dXJuIE1TICsgcmVwbGFjZSh2YWx1ZSwgJ3RlbXBsYXRlLScsICcnKSArIHZhbHVlXG5cdFx0Ly8gZ3JpZC0ocm93fGNvbHVtbiktc3RhcnRcblx0XHRjYXNlIDQzODQ6IGNhc2UgMzYxNjpcblx0XHRcdGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkgeyByZXR1cm4gbGVuZ3RoID0gaW5kZXgsIG1hdGNoKGVsZW1lbnQucHJvcHMsIC9ncmlkLVxcdystZW5kLykgfSkpIHtcblx0XHRcdFx0cmV0dXJuIH5pbmRleG9mKHZhbHVlICsgKGNoaWxkcmVuID0gY2hpbGRyZW5bbGVuZ3RoXS52YWx1ZSksICdzcGFuJywgMCkgPyB2YWx1ZSA6IChNUyArIHJlcGxhY2UodmFsdWUsICctc3RhcnQnLCAnJykgKyB2YWx1ZSArIE1TICsgJ2dyaWQtcm93LXNwYW46JyArICh+aW5kZXhvZihjaGlsZHJlbiwgJ3NwYW4nLCAwKSA/IG1hdGNoKGNoaWxkcmVuLCAvXFxkKy8pIDogK21hdGNoKGNoaWxkcmVuLCAvXFxkKy8pIC0gK21hdGNoKHZhbHVlLCAvXFxkKy8pKSArICc7Jylcblx0XHRcdH1cblx0XHRcdHJldHVybiBNUyArIHJlcGxhY2UodmFsdWUsICctc3RhcnQnLCAnJykgKyB2YWx1ZVxuXHRcdC8vIGdyaWQtKHJvd3xjb2x1bW4pLWVuZFxuXHRcdGNhc2UgNDg5NjogY2FzZSA0MTI4OlxuXHRcdFx0cmV0dXJuIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBtYXRjaChlbGVtZW50LnByb3BzLCAvZ3JpZC1cXHcrLXN0YXJ0LykgfSkpID8gdmFsdWUgOiBNUyArIHJlcGxhY2UocmVwbGFjZSh2YWx1ZSwgJy1lbmQnLCAnLXNwYW4nKSwgJ3NwYW4gJywgJycpICsgdmFsdWVcblx0XHQvLyAobWFyZ2lufHBhZGRpbmcpLWlubGluZS0oc3RhcnR8ZW5kKVxuXHRcdGNhc2UgNDA5NTogY2FzZSAzNTgzOiBjYXNlIDQwNjg6IGNhc2UgMjUzMjpcblx0XHRcdHJldHVybiByZXBsYWNlKHZhbHVlLCAvKC4rKS1pbmxpbmUoLispLywgV0VCS0lUICsgJyQxJDInKSArIHZhbHVlXG5cdFx0Ly8gKG1pbnxtYXgpPyh3aWR0aHxoZWlnaHR8aW5saW5lLXNpemV8YmxvY2stc2l6ZSlcblx0XHRjYXNlIDgxMTY6IGNhc2UgNzA1OTogY2FzZSA1NzUzOiBjYXNlIDU1MzU6XG5cdFx0Y2FzZSA1NDQ1OiBjYXNlIDU3MDE6IGNhc2UgNDkzMzogY2FzZSA0Njc3OlxuXHRcdGNhc2UgNTUzMzogY2FzZSA1Nzg5OiBjYXNlIDUwMjE6IGNhc2UgNDc2NTpcblx0XHRcdC8vIHN0cmV0Y2gsIG1heC1jb250ZW50LCBtaW4tY29udGVudCwgZmlsbC1hdmFpbGFibGVcblx0XHRcdGlmIChzdHJsZW4odmFsdWUpIC0gMSAtIGxlbmd0aCA+IDYpXG5cdFx0XHRcdHN3aXRjaCAoY2hhcmF0KHZhbHVlLCBsZW5ndGggKyAxKSkge1xuXHRcdFx0XHRcdC8vIChtKWF4LWNvbnRlbnQsIChtKWluLWNvbnRlbnRcblx0XHRcdFx0XHRjYXNlIDEwOTpcblx0XHRcdFx0XHRcdC8vIC1cblx0XHRcdFx0XHRcdGlmIChjaGFyYXQodmFsdWUsIGxlbmd0aCArIDQpICE9PSA0NSlcblx0XHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyAoZilpbGwtYXZhaWxhYmxlLCAoZilpdC1jb250ZW50XG5cdFx0XHRcdFx0Y2FzZSAxMDI6XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVwbGFjZSh2YWx1ZSwgLyguKzopKC4rKS0oW15dKykvLCAnJDEnICsgV0VCS0lUICsgJyQyLSQzJyArICckMScgKyBNT1ogKyAoY2hhcmF0KHZhbHVlLCBsZW5ndGggKyAzKSA9PSAxMDggPyAnJDMnIDogJyQyLSQzJykpICsgdmFsdWVcblx0XHRcdFx0XHQvLyAocyl0cmV0Y2hcblx0XHRcdFx0XHRjYXNlIDExNTpcblx0XHRcdFx0XHRcdHJldHVybiB+aW5kZXhvZih2YWx1ZSwgJ3N0cmV0Y2gnLCAwKSA/IHByZWZpeChyZXBsYWNlKHZhbHVlLCAnc3RyZXRjaCcsICdmaWxsLWF2YWlsYWJsZScpLCBsZW5ndGgsIGNoaWxkcmVuKSArIHZhbHVlIDogdmFsdWVcblx0XHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHQvLyBncmlkLShjb2x1bW58cm93KVxuXHRcdGNhc2UgNTE1MjogY2FzZSA1OTIwOlxuXHRcdFx0cmV0dXJuIHJlcGxhY2UodmFsdWUsIC8oLis/KTooXFxkKykoXFxzKlxcL1xccyooc3Bhbik/XFxzKihcXGQrKSk/KC4qKS8sIGZ1bmN0aW9uIChfLCBhLCBiLCBjLCBkLCBlLCBmKSB7IHJldHVybiAoTVMgKyBhICsgJzonICsgYiArIGYpICsgKGMgPyAoTVMgKyBhICsgJy1zcGFuOicgKyAoZCA/IGUgOiArZSAtICtiKSkgKyBmIDogJycpICsgdmFsdWUgfSlcblx0XHQvLyBwb3NpdGlvbjogc3RpY2t5XG5cdFx0Y2FzZSA0OTQ5OlxuXHRcdFx0Ly8gc3RpY2soeSk/XG5cdFx0XHRpZiAoY2hhcmF0KHZhbHVlLCBsZW5ndGggKyA2KSA9PT0gMTIxKVxuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZSh2YWx1ZSwgJzonLCAnOicgKyBXRUJLSVQpICsgdmFsdWVcblx0XHRcdGJyZWFrXG5cdFx0Ly8gZGlzcGxheTogKGZsZXh8aW5saW5lLWZsZXh8Z3JpZHxpbmxpbmUtZ3JpZClcblx0XHRjYXNlIDY0NDQ6XG5cdFx0XHRzd2l0Y2ggKGNoYXJhdCh2YWx1ZSwgY2hhcmF0KHZhbHVlLCAxNCkgPT09IDQ1ID8gMTggOiAxMSkpIHtcblx0XHRcdFx0Ly8gKGlubGluZS0pP2ZsZSh4KVxuXHRcdFx0XHRjYXNlIDEyMDpcblx0XHRcdFx0XHRyZXR1cm4gcmVwbGFjZSh2YWx1ZSwgLyguKzopKFteO1xccyFdKykoO3woXFxzKyk/IS4rKT8vLCAnJDEnICsgV0VCS0lUICsgKGNoYXJhdCh2YWx1ZSwgMTQpID09PSA0NSA/ICdpbmxpbmUtJyA6ICcnKSArICdib3gkMycgKyAnJDEnICsgV0VCS0lUICsgJyQyJDMnICsgJyQxJyArIE1TICsgJyQyYm94JDMnKSArIHZhbHVlXG5cdFx0XHRcdC8vIChpbmxpbmUtKT9ncmkoZClcblx0XHRcdFx0Y2FzZSAxMDA6XG5cdFx0XHRcdFx0cmV0dXJuIHJlcGxhY2UodmFsdWUsICc6JywgJzonICsgTVMpICsgdmFsdWVcblx0XHRcdH1cblx0XHRcdGJyZWFrXG5cdFx0Ly8gc2Nyb2xsLW1hcmdpbiwgc2Nyb2xsLW1hcmdpbi0odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KVxuXHRcdGNhc2UgNTcxOTogY2FzZSAyNjQ3OiBjYXNlIDIxMzU6IGNhc2UgMzkyNzogY2FzZSAyMzkxOlxuXHRcdFx0cmV0dXJuIHJlcGxhY2UodmFsdWUsICdzY3JvbGwtJywgJ3Njcm9sbC1zbmFwLScpICsgdmFsdWVcblx0fVxuXG5cdHJldHVybiB2YWx1ZVxufVxuIiwiaW1wb3J0IHtNUywgTU9aLCBXRUJLSVQsIFJVTEVTRVQsIEtFWUZSQU1FUywgREVDTEFSQVRJT059IGZyb20gJy4vRW51bS5qcydcbmltcG9ydCB7bWF0Y2gsIGNoYXJhdCwgc3Vic3RyLCBzdHJsZW4sIHNpemVvZiwgcmVwbGFjZSwgY29tYmluZSwgZmlsdGVyLCBhc3NpZ259IGZyb20gJy4vVXRpbGl0eS5qcydcbmltcG9ydCB7Y29weSwgbGlmdCwgdG9rZW5pemV9IGZyb20gJy4vVG9rZW5pemVyLmpzJ1xuaW1wb3J0IHtzZXJpYWxpemV9IGZyb20gJy4vU2VyaWFsaXplci5qcydcbmltcG9ydCB7cHJlZml4fSBmcm9tICcuL1ByZWZpeGVyLmpzJ1xuXG4vKipcbiAqIEBwYXJhbSB7ZnVuY3Rpb25bXX0gY29sbGVjdGlvblxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRkbGV3YXJlIChjb2xsZWN0aW9uKSB7XG5cdHZhciBsZW5ndGggPSBzaXplb2YoY29sbGVjdGlvbilcblxuXHRyZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4LCBjaGlsZHJlbiwgY2FsbGJhY2spIHtcblx0XHR2YXIgb3V0cHV0ID0gJydcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG5cdFx0XHRvdXRwdXQgKz0gY29sbGVjdGlvbltpXShlbGVtZW50LCBpbmRleCwgY2hpbGRyZW4sIGNhbGxiYWNrKSB8fCAnJ1xuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVsZXNoZWV0IChjYWxsYmFjaykge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRpZiAoIWVsZW1lbnQucm9vdClcblx0XHRcdGlmIChlbGVtZW50ID0gZWxlbWVudC5yZXR1cm4pXG5cdFx0XHRcdGNhbGxiYWNrKGVsZW1lbnQpXG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeGVyIChlbGVtZW50LCBpbmRleCwgY2hpbGRyZW4sIGNhbGxiYWNrKSB7XG5cdGlmIChlbGVtZW50Lmxlbmd0aCA+IC0xKVxuXHRcdGlmICghZWxlbWVudC5yZXR1cm4pXG5cdFx0XHRzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXHRcdFx0XHRjYXNlIERFQ0xBUkFUSU9OOiBlbGVtZW50LnJldHVybiA9IHByZWZpeChlbGVtZW50LnZhbHVlLCBlbGVtZW50Lmxlbmd0aCwgY2hpbGRyZW4pXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGNhc2UgS0VZRlJBTUVTOlxuXHRcdFx0XHRcdHJldHVybiBzZXJpYWxpemUoW2NvcHkoZWxlbWVudCwge3ZhbHVlOiByZXBsYWNlKGVsZW1lbnQudmFsdWUsICdAJywgJ0AnICsgV0VCS0lUKX0pXSwgY2FsbGJhY2spXG5cdFx0XHRcdGNhc2UgUlVMRVNFVDpcblx0XHRcdFx0XHRpZiAoZWxlbWVudC5sZW5ndGgpXG5cdFx0XHRcdFx0XHRyZXR1cm4gY29tYmluZShjaGlsZHJlbiA9IGVsZW1lbnQucHJvcHMsIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKG1hdGNoKHZhbHVlLCBjYWxsYmFjayA9IC8oOjpwbGFjXFx3K3w6cmVhZC1cXHcrKS8pKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gOnJlYWQtKG9ubHl8d3JpdGUpXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnOnJlYWQtb25seSc6IGNhc2UgJzpyZWFkLXdyaXRlJzpcblx0XHRcdFx0XHRcdFx0XHRcdGxpZnQoY29weShlbGVtZW50LCB7cHJvcHM6IFtyZXBsYWNlKHZhbHVlLCAvOihyZWFkLVxcdyspLywgJzonICsgTU9aICsgJyQxJyldfSkpXG5cdFx0XHRcdFx0XHRcdFx0XHRsaWZ0KGNvcHkoZWxlbWVudCwge3Byb3BzOiBbdmFsdWVdfSkpXG5cdFx0XHRcdFx0XHRcdFx0XHRhc3NpZ24oZWxlbWVudCwge3Byb3BzOiBmaWx0ZXIoY2hpbGRyZW4sIGNhbGxiYWNrKX0pXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdFx0XHRcdC8vIDpwbGFjZWhvbGRlclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJzo6cGxhY2Vob2xkZXInOlxuXHRcdFx0XHRcdFx0XHRcdFx0bGlmdChjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIFdFQktJVCArICdpbnB1dC0kMScpXX0pKVxuXHRcdFx0XHRcdFx0XHRcdFx0bGlmdChjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIE1PWiArICckMScpXX0pKVxuXHRcdFx0XHRcdFx0XHRcdFx0bGlmdChjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sIE1TICsgJ2lucHV0LSQxJyldfSkpXG5cdFx0XHRcdFx0XHRcdFx0XHRsaWZ0KGNvcHkoZWxlbWVudCwge3Byb3BzOiBbdmFsdWVdfSkpXG5cdFx0XHRcdFx0XHRcdFx0XHRhc3NpZ24oZWxlbWVudCwge3Byb3BzOiBmaWx0ZXIoY2hpbGRyZW4sIGNhbGxiYWNrKX0pXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuICcnXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNoaWxkcmVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2UgKGVsZW1lbnQpIHtcblx0c3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblx0XHRjYXNlIFJVTEVTRVQ6XG5cdFx0XHRlbGVtZW50LnByb3BzID0gZWxlbWVudC5wcm9wcy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiBjb21iaW5lKHRva2VuaXplKHZhbHVlKSwgZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgY2hpbGRyZW4pIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGNoYXJhdCh2YWx1ZSwgMCkpIHtcblx0XHRcdFx0XHRcdC8vIFxcZlxuXHRcdFx0XHRcdFx0Y2FzZSAxMjpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHN1YnN0cih2YWx1ZSwgMSwgc3RybGVuKHZhbHVlKSlcblx0XHRcdFx0XHRcdC8vIFxcMCAoICsgPiB+XG5cdFx0XHRcdFx0XHRjYXNlIDA6IGNhc2UgNDA6IGNhc2UgNDM6IGNhc2UgNjI6IGNhc2UgMTI2OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0XHRcdC8vIDpcblx0XHRcdFx0XHRcdGNhc2UgNTg6XG5cdFx0XHRcdFx0XHRcdGlmIChjaGlsZHJlblsrK2luZGV4XSA9PT0gJ2dsb2JhbCcpXG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRyZW5baW5kZXhdID0gJycsIGNoaWxkcmVuWysraW5kZXhdID0gJ1xcZicgKyBzdWJzdHIoY2hpbGRyZW5baW5kZXhdLCBpbmRleCA9IDEsIC0xKVxuXHRcdFx0XHRcdFx0Ly8gXFxzXG5cdFx0XHRcdFx0XHRjYXNlIDMyOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaW5kZXggPT09IDEgPyAnJyA6IHZhbHVlXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGluZGV4KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAwOiBlbGVtZW50ID0gdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzaXplb2YoY2hpbGRyZW4pID4gMSA/ICcnIDogdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRjYXNlIGluZGV4ID0gc2l6ZW9mKGNoaWxkcmVuKSAtIDE6IGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBpbmRleCA9PT0gMiA/IHZhbHVlICsgZWxlbWVudCArIGVsZW1lbnQgOiB2YWx1ZSArIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHR9XG59XG4iLCJpbXBvcnQge0NPTU1FTlQsIFJVTEVTRVQsIERFQ0xBUkFUSU9OfSBmcm9tICcuL0VudW0uanMnXG5pbXBvcnQge2FicywgY2hhcmF0LCB0cmltLCBmcm9tLCBzaXplb2YsIHN0cmxlbiwgc3Vic3RyLCBhcHBlbmQsIHJlcGxhY2UsIGluZGV4b2Z9IGZyb20gJy4vVXRpbGl0eS5qcydcbmltcG9ydCB7bm9kZSwgY2hhciwgcHJldiwgbmV4dCwgcGVlaywgY2FyZXQsIGFsbG9jLCBkZWFsbG9jLCBkZWxpbWl0LCB3aGl0ZXNwYWNlLCBlc2NhcGluZywgaWRlbnRpZmllciwgY29tbWVudGVyfSBmcm9tICcuL1Rva2VuaXplci5qcydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZSAodmFsdWUpIHtcblx0cmV0dXJuIGRlYWxsb2MocGFyc2UoJycsIG51bGwsIG51bGwsIG51bGwsIFsnJ10sIHZhbHVlID0gYWxsb2ModmFsdWUpLCAwLCBbMF0sIHZhbHVlKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IHJ1bGVzZXRzXG4gKiBAcGFyYW0ge251bWJlcltdfSBwc2V1ZG9cbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50c1xuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVjbGFyYXRpb25zXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSAodmFsdWUsIHJvb3QsIHBhcmVudCwgcnVsZSwgcnVsZXMsIHJ1bGVzZXRzLCBwc2V1ZG8sIHBvaW50cywgZGVjbGFyYXRpb25zKSB7XG5cdHZhciBpbmRleCA9IDBcblx0dmFyIG9mZnNldCA9IDBcblx0dmFyIGxlbmd0aCA9IHBzZXVkb1xuXHR2YXIgYXRydWxlID0gMFxuXHR2YXIgcHJvcGVydHkgPSAwXG5cdHZhciBwcmV2aW91cyA9IDBcblx0dmFyIHZhcmlhYmxlID0gMVxuXHR2YXIgc2Nhbm5pbmcgPSAxXG5cdHZhciBhbXBlcnNhbmQgPSAxXG5cdHZhciBjaGFyYWN0ZXIgPSAwXG5cdHZhciB0eXBlID0gJydcblx0dmFyIHByb3BzID0gcnVsZXNcblx0dmFyIGNoaWxkcmVuID0gcnVsZXNldHNcblx0dmFyIHJlZmVyZW5jZSA9IHJ1bGVcblx0dmFyIGNoYXJhY3RlcnMgPSB0eXBlXG5cblx0d2hpbGUgKHNjYW5uaW5nKVxuXHRcdHN3aXRjaCAocHJldmlvdXMgPSBjaGFyYWN0ZXIsIGNoYXJhY3RlciA9IG5leHQoKSkge1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHByZXZpb3VzICE9IDEwOCAmJiBjaGFyYXQoY2hhcmFjdGVycywgbGVuZ3RoIC0gMSkgPT0gNTgpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXhvZihjaGFyYWN0ZXJzICs9IHJlcGxhY2UoZGVsaW1pdChjaGFyYWN0ZXIpLCAnJicsICcmXFxmJyksICcmXFxmJywgYWJzKGluZGV4ID8gcG9pbnRzW2luZGV4IC0gMV0gOiAwKSkgIT0gLTEpXG5cdFx0XHRcdFx0XHRhbXBlcnNhbmQgPSAtMVxuXHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdC8vIFwiICcgW1xuXHRcdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA5MTpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBkZWxpbWl0KGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcdCBcXG4gXFxyIFxcc1xuXHRcdFx0Y2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0XHRjaGFyYWN0ZXJzICs9IHdoaXRlc3BhY2UocHJldmlvdXMpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyBcXFxuXHRcdFx0Y2FzZSA5Mjpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBlc2NhcGluZyhjYXJldCgpIC0gMSwgNylcblx0XHRcdFx0Y29udGludWVcblx0XHRcdC8vIC9cblx0XHRcdGNhc2UgNDc6XG5cdFx0XHRcdHN3aXRjaCAocGVlaygpKSB7XG5cdFx0XHRcdFx0Y2FzZSA0MjogY2FzZSA0Nzpcblx0XHRcdFx0XHRcdGFwcGVuZChjb21tZW50KGNvbW1lbnRlcihuZXh0KCksIGNhcmV0KCkpLCByb290LCBwYXJlbnQsIGRlY2xhcmF0aW9ucyksIGRlY2xhcmF0aW9ucylcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGNoYXJhY3RlcnMgKz0gJy8nXG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIHtcblx0XHRcdGNhc2UgMTIzICogdmFyaWFibGU6XG5cdFx0XHRcdHBvaW50c1tpbmRleCsrXSA9IHN0cmxlbihjaGFyYWN0ZXJzKSAqIGFtcGVyc2FuZFxuXHRcdFx0Ly8gfSA7IFxcMFxuXHRcdFx0Y2FzZSAxMjUgKiB2YXJpYWJsZTogY2FzZSA1OTogY2FzZSAwOlxuXHRcdFx0XHRzd2l0Y2ggKGNoYXJhY3Rlcikge1xuXHRcdFx0XHRcdC8vIFxcMCB9XG5cdFx0XHRcdFx0Y2FzZSAwOiBjYXNlIDEyNTogc2Nhbm5pbmcgPSAwXG5cdFx0XHRcdFx0Ly8gO1xuXHRcdFx0XHRcdGNhc2UgNTkgKyBvZmZzZXQ6IGlmIChhbXBlcnNhbmQgPT0gLTEpIGNoYXJhY3RlcnMgPSByZXBsYWNlKGNoYXJhY3RlcnMsIC9cXGYvZywgJycpXG5cdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgPiAwICYmIChzdHJsZW4oY2hhcmFjdGVycykgLSBsZW5ndGgpKVxuXHRcdFx0XHRcdFx0XHRhcHBlbmQocHJvcGVydHkgPiAzMiA/IGRlY2xhcmF0aW9uKGNoYXJhY3RlcnMgKyAnOycsIHJ1bGUsIHBhcmVudCwgbGVuZ3RoIC0gMSwgZGVjbGFyYXRpb25zKSA6IGRlY2xhcmF0aW9uKHJlcGxhY2UoY2hhcmFjdGVycywgJyAnLCAnJykgKyAnOycsIHJ1bGUsIHBhcmVudCwgbGVuZ3RoIC0gMiwgZGVjbGFyYXRpb25zKSwgZGVjbGFyYXRpb25zKVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyBAIDtcblx0XHRcdFx0XHRjYXNlIDU5OiBjaGFyYWN0ZXJzICs9ICc7J1xuXHRcdFx0XHRcdC8vIHsgcnVsZS9hdC1ydWxlXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGFwcGVuZChyZWZlcmVuY2UgPSBydWxlc2V0KGNoYXJhY3RlcnMsIHJvb3QsIHBhcmVudCwgaW5kZXgsIG9mZnNldCwgcnVsZXMsIHBvaW50cywgdHlwZSwgcHJvcHMgPSBbXSwgY2hpbGRyZW4gPSBbXSwgbGVuZ3RoLCBydWxlc2V0cyksIHJ1bGVzZXRzKVxuXG5cdFx0XHRcdFx0XHRpZiAoY2hhcmFjdGVyID09PSAxMjMpXG5cdFx0XHRcdFx0XHRcdGlmIChvZmZzZXQgPT09IDApXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2UoY2hhcmFjdGVycywgcm9vdCwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIHByb3BzLCBydWxlc2V0cywgbGVuZ3RoLCBwb2ludHMsIGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChhdHJ1bGUgPT09IDk5ICYmIGNoYXJhdChjaGFyYWN0ZXJzLCAzKSA9PT0gMTEwID8gMTAwIDogYXRydWxlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBkIGwgbSBzXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIDEwMDogY2FzZSAxMDg6IGNhc2UgMTA5OiBjYXNlIDExNTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2UodmFsdWUsIHJlZmVyZW5jZSwgcmVmZXJlbmNlLCBydWxlICYmIGFwcGVuZChydWxlc2V0KHZhbHVlLCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgMCwgMCwgcnVsZXMsIHBvaW50cywgdHlwZSwgcnVsZXMsIHByb3BzID0gW10sIGxlbmd0aCwgY2hpbGRyZW4pLCBjaGlsZHJlbiksIHJ1bGVzLCBjaGlsZHJlbiwgbGVuZ3RoLCBwb2ludHMsIHJ1bGUgPyBwcm9wcyA6IGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2UoY2hhcmFjdGVycywgcmVmZXJlbmNlLCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgWycnXSwgY2hpbGRyZW4sIDAsIHBvaW50cywgY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5kZXggPSBvZmZzZXQgPSBwcm9wZXJ0eSA9IDAsIHZhcmlhYmxlID0gYW1wZXJzYW5kID0gMSwgdHlwZSA9IGNoYXJhY3RlcnMgPSAnJywgbGVuZ3RoID0gcHNldWRvXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyA6XG5cdFx0XHRjYXNlIDU4OlxuXHRcdFx0XHRsZW5ndGggPSAxICsgc3RybGVuKGNoYXJhY3RlcnMpLCBwcm9wZXJ0eSA9IHByZXZpb3VzXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZiAodmFyaWFibGUgPCAxKVxuXHRcdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT0gMTIzKVxuXHRcdFx0XHRcdFx0LS12YXJpYWJsZVxuXHRcdFx0XHRcdGVsc2UgaWYgKGNoYXJhY3RlciA9PSAxMjUgJiYgdmFyaWFibGUrKyA9PSAwICYmIHByZXYoKSA9PSAxMjUpXG5cdFx0XHRcdFx0XHRjb250aW51ZVxuXG5cdFx0XHRcdHN3aXRjaCAoY2hhcmFjdGVycyArPSBmcm9tKGNoYXJhY3RlciksIGNoYXJhY3RlciAqIHZhcmlhYmxlKSB7XG5cdFx0XHRcdFx0Ly8gJlxuXHRcdFx0XHRcdGNhc2UgMzg6XG5cdFx0XHRcdFx0XHRhbXBlcnNhbmQgPSBvZmZzZXQgPiAwID8gMSA6IChjaGFyYWN0ZXJzICs9ICdcXGYnLCAtMSlcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0Ly8gLFxuXHRcdFx0XHRcdGNhc2UgNDQ6XG5cdFx0XHRcdFx0XHRwb2ludHNbaW5kZXgrK10gPSAoc3RybGVuKGNoYXJhY3RlcnMpIC0gMSkgKiBhbXBlcnNhbmQsIGFtcGVyc2FuZCA9IDFcblx0XHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdFx0Ly8gQFxuXHRcdFx0XHRcdGNhc2UgNjQ6XG5cdFx0XHRcdFx0XHQvLyAtXG5cdFx0XHRcdFx0XHRpZiAocGVlaygpID09PSA0NSlcblx0XHRcdFx0XHRcdFx0Y2hhcmFjdGVycyArPSBkZWxpbWl0KG5leHQoKSlcblxuXHRcdFx0XHRcdFx0YXRydWxlID0gcGVlaygpLCBvZmZzZXQgPSBsZW5ndGggPSBzdHJsZW4odHlwZSA9IGNoYXJhY3RlcnMgKz0gaWRlbnRpZmllcihjYXJldCgpKSksIGNoYXJhY3RlcisrXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdC8vIC1cblx0XHRcdFx0XHRjYXNlIDQ1OlxuXHRcdFx0XHRcdFx0aWYgKHByZXZpb3VzID09PSA0NSAmJiBzdHJsZW4oY2hhcmFjdGVycykgPT0gMilcblx0XHRcdFx0XHRcdFx0dmFyaWFibGUgPSAwXG5cdFx0XHRcdH1cblx0XHR9XG5cblx0cmV0dXJuIHJ1bGVzZXRzXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdFxuICogQHBhcmFtIHtvYmplY3Q/fSBwYXJlbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZXNcbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGlsZHJlblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtvYmplY3RbXX0gc2libGluZ3NcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bGVzZXQgKHZhbHVlLCByb290LCBwYXJlbnQsIGluZGV4LCBvZmZzZXQsIHJ1bGVzLCBwb2ludHMsIHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgbGVuZ3RoLCBzaWJsaW5ncykge1xuXHR2YXIgcG9zdCA9IG9mZnNldCAtIDFcblx0dmFyIHJ1bGUgPSBvZmZzZXQgPT09IDAgPyBydWxlcyA6IFsnJ11cblx0dmFyIHNpemUgPSBzaXplb2YocnVsZSlcblxuXHRmb3IgKHZhciBpID0gMCwgaiA9IDAsIGsgPSAwOyBpIDwgaW5kZXg7ICsraSlcblx0XHRmb3IgKHZhciB4ID0gMCwgeSA9IHN1YnN0cih2YWx1ZSwgcG9zdCArIDEsIHBvc3QgPSBhYnMoaiA9IHBvaW50c1tpXSkpLCB6ID0gdmFsdWU7IHggPCBzaXplOyArK3gpXG5cdFx0XHRpZiAoeiA9IHRyaW0oaiA+IDAgPyBydWxlW3hdICsgJyAnICsgeSA6IHJlcGxhY2UoeSwgLyZcXGYvZywgcnVsZVt4XSkpKVxuXHRcdFx0XHRwcm9wc1trKytdID0gelxuXG5cdHJldHVybiBub2RlKHZhbHVlLCByb290LCBwYXJlbnQsIG9mZnNldCA9PT0gMCA/IFJVTEVTRVQgOiB0eXBlLCBwcm9wcywgY2hpbGRyZW4sIGxlbmd0aCwgc2libGluZ3MpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdFxuICogQHBhcmFtIHtvYmplY3Q/fSBwYXJlbnRcbiAqIEBwYXJhbSB7b2JqZWN0W119IHNpYmxpbmdzXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21tZW50ICh2YWx1ZSwgcm9vdCwgcGFyZW50LCBzaWJsaW5ncykge1xuXHRyZXR1cm4gbm9kZSh2YWx1ZSwgcm9vdCwgcGFyZW50LCBDT01NRU5ULCBmcm9tKGNoYXIoKSksIHN1YnN0cih2YWx1ZSwgMiwgLTIpLCAwLCBzaWJsaW5ncylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtvYmplY3RbXX0gc2libGluZ3NcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uICh2YWx1ZSwgcm9vdCwgcGFyZW50LCBsZW5ndGgsIHNpYmxpbmdzKSB7XG5cdHJldHVybiBub2RlKHZhbHVlLCByb290LCBwYXJlbnQsIERFQ0xBUkFUSU9OLCBzdWJzdHIodmFsdWUsIDAsIGxlbmd0aCksIHN1YnN0cih2YWx1ZSwgbGVuZ3RoICsgMSwgLTEpLCBsZW5ndGgsIHNpYmxpbmdzKVxufVxuIiwidmFyIHVuaXRsZXNzS2V5cyA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IDEsXG4gIGFzcGVjdFJhdGlvOiAxLFxuICBib3JkZXJJbWFnZU91dHNldDogMSxcbiAgYm9yZGVySW1hZ2VTbGljZTogMSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogMSxcbiAgYm94RmxleDogMSxcbiAgYm94RmxleEdyb3VwOiAxLFxuICBib3hPcmRpbmFsR3JvdXA6IDEsXG4gIGNvbHVtbkNvdW50OiAxLFxuICBjb2x1bW5zOiAxLFxuICBmbGV4OiAxLFxuICBmbGV4R3JvdzogMSxcbiAgZmxleFBvc2l0aXZlOiAxLFxuICBmbGV4U2hyaW5rOiAxLFxuICBmbGV4TmVnYXRpdmU6IDEsXG4gIGZsZXhPcmRlcjogMSxcbiAgZ3JpZFJvdzogMSxcbiAgZ3JpZFJvd0VuZDogMSxcbiAgZ3JpZFJvd1NwYW46IDEsXG4gIGdyaWRSb3dTdGFydDogMSxcbiAgZ3JpZENvbHVtbjogMSxcbiAgZ3JpZENvbHVtbkVuZDogMSxcbiAgZ3JpZENvbHVtblNwYW46IDEsXG4gIGdyaWRDb2x1bW5TdGFydDogMSxcbiAgbXNHcmlkUm93OiAxLFxuICBtc0dyaWRSb3dTcGFuOiAxLFxuICBtc0dyaWRDb2x1bW46IDEsXG4gIG1zR3JpZENvbHVtblNwYW46IDEsXG4gIGZvbnRXZWlnaHQ6IDEsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIG9yZGVyOiAxLFxuICBvcnBoYW5zOiAxLFxuICB0YWJTaXplOiAxLFxuICB3aWRvd3M6IDEsXG4gIHpJbmRleDogMSxcbiAgem9vbTogMSxcbiAgV2Via2l0TGluZUNsYW1wOiAxLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBmbG9vZE9wYWNpdHk6IDEsXG4gIHN0b3BPcGFjaXR5OiAxLFxuICBzdHJva2VEYXNoYXJyYXk6IDEsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IDEsXG4gIHN0cm9rZU1pdGVybGltaXQ6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdpZHRoOiAxXG59O1xuXG5leHBvcnQgeyB1bml0bGVzc0tleXMgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0e19fc3ByZWFkQXJyYXkgYXMgZSxfX2Fzc2lnbiBhcyB0fWZyb21cInRzbGliXCI7aW1wb3J0IG4gZnJvbVwiQGVtb3Rpb24vaXMtcHJvcC12YWxpZFwiO2ltcG9ydCBvLHt1c2VSZWYgYXMgcix1c2VTdGF0ZSBhcyBzLHVzZU1lbW8gYXMgaSx1c2VFZmZlY3QgYXMgYSx1c2VDb250ZXh0IGFzIGMsdXNlRGVidWdWYWx1ZSBhcyBsLGNyZWF0ZUVsZW1lbnQgYXMgdX1mcm9tXCJyZWFjdFwiO2ltcG9ydCBwIGZyb21cInNoYWxsb3dlcXVhbFwiO2ltcG9ydCphcyBkIGZyb21cInN0eWxpc1wiO2ltcG9ydCBoIGZyb21cIkBlbW90aW9uL3VuaXRsZXNzXCI7dmFyIGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiYocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0FUVFJ8fHByb2Nlc3MuZW52LlNDX0FUVFIpfHxcImRhdGEtc3R5bGVkXCIsbT1cImFjdGl2ZVwiLHk9XCJkYXRhLXN0eWxlZC12ZXJzaW9uXCIsdj1cIjYuMS4xOVwiLGc9XCIvKiFzYyovXFxuXCIsUz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQsdz1Cb29sZWFuKFwiYm9vbGVhblwiPT10eXBlb2YgU0NfRElTQUJMRV9TUEVFRFk/U0NfRElTQUJMRV9TUEVFRFk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiZ2b2lkIDAhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFkmJlwiXCIhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk/XCJmYWxzZVwiIT09cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiZ2b2lkIDAhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZP1wiZmFsc2VcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWTpcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKSxiPXt9LEU9L2ludmFsaWQgaG9vayBjYWxsL2ksTj1uZXcgU2V0LFA9ZnVuY3Rpb24odCxuKXtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKXt2YXIgbz1uPycgd2l0aCB0aGUgaWQgb2YgXCInLmNvbmNhdChuLCdcIicpOlwiXCIscz1cIlRoZSBjb21wb25lbnQgXCIuY29uY2F0KHQpLmNvbmNhdChvLFwiIGhhcyBiZWVuIGNyZWF0ZWQgZHluYW1pY2FsbHkuXFxuXCIpK1wiWW91IG1heSBzZWUgdGhpcyB3YXJuaW5nIGJlY2F1c2UgeW91J3ZlIGNhbGxlZCBzdHlsZWQgaW5zaWRlIGFub3RoZXIgY29tcG9uZW50LlxcblRvIHJlc29sdmUgdGhpcyBvbmx5IGNyZWF0ZSBuZXcgU3R5bGVkQ29tcG9uZW50cyBvdXRzaWRlIG9mIGFueSByZW5kZXIgbWV0aG9kIGFuZCBmdW5jdGlvbiBjb21wb25lbnQuXFxuU2VlIGh0dHBzOi8vc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYmFzaWNzI2RlZmluZS1zdHlsZWQtY29tcG9uZW50cy1vdXRzaWRlLW9mLXRoZS1yZW5kZXItbWV0aG9kIGZvciBtb3JlIGluZm8uXFxuXCIsaT1jb25zb2xlLmVycm9yO3RyeXt2YXIgYT0hMDtjb25zb2xlLmVycm9yPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1bXSxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyluW28tMV09YXJndW1lbnRzW29dO0UudGVzdCh0KT8oYT0hMSxOLmRlbGV0ZShzKSk6aS5hcHBseSh2b2lkIDAsZShbdF0sbiwhMSkpfSxyKCksYSYmIU4uaGFzKHMpJiYoY29uc29sZS53YXJuKHMpLE4uYWRkKHMpKX1jYXRjaChlKXtFLnRlc3QoZS5tZXNzYWdlKSYmTi5kZWxldGUocyl9ZmluYWxseXtjb25zb2xlLmVycm9yPWl9fX0sXz1PYmplY3QuZnJlZXplKFtdKSxDPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEkoZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj1DKSxlLnRoZW1lIT09bi50aGVtZSYmZS50aGVtZXx8dHx8bi50aGVtZX12YXIgQT1uZXcgU2V0KFtcImFcIixcImFiYnJcIixcImFkZHJlc3NcIixcImFyZWFcIixcImFydGljbGVcIixcImFzaWRlXCIsXCJhdWRpb1wiLFwiYlwiLFwiYmFzZVwiLFwiYmRpXCIsXCJiZG9cIixcImJpZ1wiLFwiYmxvY2txdW90ZVwiLFwiYm9keVwiLFwiYnJcIixcImJ1dHRvblwiLFwiY2FudmFzXCIsXCJjYXB0aW9uXCIsXCJjaXRlXCIsXCJjb2RlXCIsXCJjb2xcIixcImNvbGdyb3VwXCIsXCJkYXRhXCIsXCJkYXRhbGlzdFwiLFwiZGRcIixcImRlbFwiLFwiZGV0YWlsc1wiLFwiZGZuXCIsXCJkaWFsb2dcIixcImRpdlwiLFwiZGxcIixcImR0XCIsXCJlbVwiLFwiZW1iZWRcIixcImZpZWxkc2V0XCIsXCJmaWdjYXB0aW9uXCIsXCJmaWd1cmVcIixcImZvb3RlclwiLFwiZm9ybVwiLFwiaDFcIixcImgyXCIsXCJoM1wiLFwiaDRcIixcImg1XCIsXCJoNlwiLFwiaGVhZGVyXCIsXCJoZ3JvdXBcIixcImhyXCIsXCJodG1sXCIsXCJpXCIsXCJpZnJhbWVcIixcImltZ1wiLFwiaW5wdXRcIixcImluc1wiLFwia2JkXCIsXCJrZXlnZW5cIixcImxhYmVsXCIsXCJsZWdlbmRcIixcImxpXCIsXCJsaW5rXCIsXCJtYWluXCIsXCJtYXBcIixcIm1hcmtcIixcIm1lbnVcIixcIm1lbnVpdGVtXCIsXCJtZXRhXCIsXCJtZXRlclwiLFwibmF2XCIsXCJub3NjcmlwdFwiLFwib2JqZWN0XCIsXCJvbFwiLFwib3B0Z3JvdXBcIixcIm9wdGlvblwiLFwib3V0cHV0XCIsXCJwXCIsXCJwYXJhbVwiLFwicGljdHVyZVwiLFwicHJlXCIsXCJwcm9ncmVzc1wiLFwicVwiLFwicnBcIixcInJ0XCIsXCJydWJ5XCIsXCJzXCIsXCJzYW1wXCIsXCJzY3JpcHRcIixcInNlY3Rpb25cIixcInNlbGVjdFwiLFwic21hbGxcIixcInNvdXJjZVwiLFwic3BhblwiLFwic3Ryb25nXCIsXCJzdHlsZVwiLFwic3ViXCIsXCJzdW1tYXJ5XCIsXCJzdXBcIixcInRhYmxlXCIsXCJ0Ym9keVwiLFwidGRcIixcInRleHRhcmVhXCIsXCJ0Zm9vdFwiLFwidGhcIixcInRoZWFkXCIsXCJ0aW1lXCIsXCJ0clwiLFwidHJhY2tcIixcInVcIixcInVsXCIsXCJ1c2VcIixcInZhclwiLFwidmlkZW9cIixcIndiclwiLFwiY2lyY2xlXCIsXCJjbGlwUGF0aFwiLFwiZGVmc1wiLFwiZWxsaXBzZVwiLFwiZm9yZWlnbk9iamVjdFwiLFwiZ1wiLFwiaW1hZ2VcIixcImxpbmVcIixcImxpbmVhckdyYWRpZW50XCIsXCJtYXJrZXJcIixcIm1hc2tcIixcInBhdGhcIixcInBhdHRlcm5cIixcInBvbHlnb25cIixcInBvbHlsaW5lXCIsXCJyYWRpYWxHcmFkaWVudFwiLFwicmVjdFwiLFwic3RvcFwiLFwic3ZnXCIsXCJ0ZXh0XCIsXCJ0c3BhblwiXSksTz0vWyFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxcXFxcXV5ge3x9fi1dKy9nLEQ9LyheLXwtJCkvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlLnJlcGxhY2UoTyxcIi1cIikucmVwbGFjZShELFwiXCIpfXZhciBUPS8oYSkoZCkvZ2ksaz01MixqPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUrKGU+MjU/Mzk6OTcpKX07ZnVuY3Rpb24geChlKXt2YXIgdCxuPVwiXCI7Zm9yKHQ9TWF0aC5hYnMoZSk7dD5rO3Q9dC9rfDApbj1qKHQlaykrbjtyZXR1cm4oaih0JWspK24pLnJlcGxhY2UoVCxcIiQxLSQyXCIpfXZhciBWLEY9NTM4MSxNPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQubGVuZ3RoO247KWU9MzMqZV50LmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gZX0sej1mdW5jdGlvbihlKXtyZXR1cm4gTShGLGUpfTtmdW5jdGlvbiAkKGUpe3JldHVybiB4KHooZSk+Pj4wKX1mdW5jdGlvbiBCKGUpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlfHxlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fFwiQ29tcG9uZW50XCJ9ZnVuY3Rpb24gTChlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmKFwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fGUuY2hhckF0KDApPT09ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSl9dmFyIEc9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLFk9Rz9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSxXPUc/U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpOjYwMTEyLHE9e2NoaWxkQ29udGV4dFR5cGVzOiEwLGNvbnRleHRUeXBlOiEwLGNvbnRleHRUeXBlczohMCxkZWZhdWx0UHJvcHM6ITAsZGlzcGxheU5hbWU6ITAsZ2V0RGVmYXVsdFByb3BzOiEwLGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjohMCxnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6ITAsbWl4aW5zOiEwLHByb3BUeXBlczohMCx0eXBlOiEwfSxIPXtuYW1lOiEwLGxlbmd0aDohMCxwcm90b3R5cGU6ITAsY2FsbGVyOiEwLGNhbGxlZTohMCxhcmd1bWVudHM6ITAsYXJpdHk6ITB9LFU9eyQkdHlwZW9mOiEwLGNvbXBhcmU6ITAsZGVmYXVsdFByb3BzOiEwLGRpc3BsYXlOYW1lOiEwLHByb3BUeXBlczohMCx0eXBlOiEwfSxKPSgoVj17fSlbV109eyQkdHlwZW9mOiEwLHJlbmRlcjohMCxkZWZhdWx0UHJvcHM6ITAsZGlzcGxheU5hbWU6ITAscHJvcFR5cGVzOiEwfSxWW1ldPVUsVik7ZnVuY3Rpb24gWChlKXtyZXR1cm4oXCJ0eXBlXCJpbih0PWUpJiZ0LnR5cGUuJCR0eXBlb2YpPT09WT9VOlwiJCR0eXBlb2ZcImluIGU/SltlLiQkdHlwZW9mXTpxO3ZhciB0fXZhciBaPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxLPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxlZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHRlPU9iamVjdC5nZXRQcm90b3R5cGVPZixuZT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIG9lKGUsdCxuKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdCl7aWYobmUpe3ZhciBvPXRlKHQpO28mJm8hPT1uZSYmb2UoZSxvLG4pfXZhciByPUsodCk7USYmKHI9ci5jb25jYXQoUSh0KSkpO2Zvcih2YXIgcz1YKGUpLGk9WCh0KSxhPTA7YTxyLmxlbmd0aDsrK2Epe3ZhciBjPXJbYV07aWYoIShjIGluIEh8fG4mJm5bY118fGkmJmMgaW4gaXx8cyYmYyBpbiBzKSl7dmFyIGw9ZWUodCxjKTt0cnl7WihlLGMsbCl9Y2F0Y2goZSl7fX19fXJldHVybiBlfWZ1bmN0aW9uIHJlKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gc2UoZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGUmJlwic3R5bGVkQ29tcG9uZW50SWRcImluIGV9ZnVuY3Rpb24gaWUoZSx0KXtyZXR1cm4gZSYmdD9cIlwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQodCk6ZXx8dHx8XCJcIn1mdW5jdGlvbiBhZShlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm5cIlwiO2Zvcih2YXIgbj1lWzBdLG89MTtvPGUubGVuZ3RoO28rKyluKz10P3QrZVtvXTplW29dO3JldHVybiBufWZ1bmN0aW9uIGNlKGUpe3JldHVybiBudWxsIT09ZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3IubmFtZT09PU9iamVjdC5uYW1lJiYhKFwicHJvcHNcImluIGUmJmUuJCR0eXBlb2YpfWZ1bmN0aW9uIGxlKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj0hMSksIW4mJiFjZShlKSYmIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyllW29dPWxlKGVbb10sdFtvXSk7ZWxzZSBpZihjZSh0KSlmb3IodmFyIG8gaW4gdCllW29dPWxlKGVbb10sdFtvXSk7cmV0dXJuIGV9ZnVuY3Rpb24gdWUoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRvU3RyaW5nXCIse3ZhbHVlOnR9KX12YXIgcGU9XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj97MTpcIkNhbm5vdCBjcmVhdGUgc3R5bGVkLWNvbXBvbmVudCBmb3IgY29tcG9uZW50OiAlcy5cXG5cXG5cIiwyOlwiQ2FuJ3QgY29sbGVjdCBzdHlsZXMgb25jZSB5b3UndmUgY29uc3VtZWQgYSBgU2VydmVyU3R5bGVTaGVldGAncyBzdHlsZXMhIGBTZXJ2ZXJTdHlsZVNoZWV0YCBpcyBhIG9uZSBvZmYgaW5zdGFuY2UgZm9yIGVhY2ggc2VydmVyLXNpZGUgcmVuZGVyIGN5Y2xlLlxcblxcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcmV1c2UgaXQgYWNyb3NzIHJlbmRlcnM/XFxuLSBBcmUgeW91IGFjY2lkZW50YWxseSBjYWxsaW5nIGNvbGxlY3RTdHlsZXMgdHdpY2U/XFxuXFxuXCIsMzpcIlN0cmVhbWluZyBTU1IgaXMgb25seSBzdXBwb3J0ZWQgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50OyBQbGVhc2UgZG8gbm90IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBicm93c2VyLlxcblxcblwiLDQ6XCJUaGUgYFN0eWxlU2hlZXRNYW5hZ2VyYCBleHBlY3RzIGEgdmFsaWQgdGFyZ2V0IG9yIHNoZWV0IHByb3AhXFxuXFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIGNsaWVudCBhbmQgaXMgeW91ciB0YXJnZXQgZmFsc3k/XFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIHNlcnZlciBhbmQgaXMgdGhlIHNoZWV0IGZhbHN5P1xcblxcblwiLDU6XCJUaGUgY2xvbmUgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGllbnQhXFxuXFxuLSBBcmUgeW91IHJ1bm5pbmcgaW4gYSBjbGllbnQtbGlrZSBlbnZpcm9ubWVudCBvbiB0aGUgc2VydmVyP1xcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcnVuIFNTUiBvbiB0aGUgY2xpZW50P1xcblxcblwiLDY6XCJUcnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHN0eWxlIHRhZywgYnV0IHRoZSBnaXZlbiBOb2RlIGlzIHVubW91bnRlZCFcXG5cXG4tIEFyZSB5b3UgdXNpbmcgYSBjdXN0b20gdGFyZ2V0IHRoYXQgaXNuJ3QgbW91bnRlZD9cXG4tIERvZXMgeW91ciBkb2N1bWVudCBub3QgaGF2ZSBhIHZhbGlkIGhlYWQgZWxlbWVudD9cXG4tIEhhdmUgeW91IGFjY2lkZW50YWxseSByZW1vdmVkIGEgc3R5bGUgdGFnIG1hbnVhbGx5P1xcblxcblwiLDc6J1RoZW1lUHJvdmlkZXI6IFBsZWFzZSByZXR1cm4gYW4gb2JqZWN0IGZyb20geW91ciBcInRoZW1lXCIgcHJvcCBmdW5jdGlvbiwgZS5nLlxcblxcbmBgYGpzXFxudGhlbWU9eygpID0+ICh7fSl9XFxuYGBgXFxuXFxuJyw4OidUaGVtZVByb3ZpZGVyOiBQbGVhc2UgbWFrZSB5b3VyIFwidGhlbWVcIiBwcm9wIGFuIG9iamVjdC5cXG5cXG4nLDk6XCJNaXNzaW5nIGRvY3VtZW50IGA8aGVhZD5gXFxuXFxuXCIsMTA6XCJDYW5ub3QgZmluZCBhIFN0eWxlU2hlZXQgaW5zdGFuY2UuIFVzdWFsbHkgdGhpcyBoYXBwZW5zIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMgb2Ygc3R5bGVkLWNvbXBvbmVudHMgbG9hZGVkIGF0IG9uY2UuIENoZWNrIG91dCB0aGlzIGlzc3VlIGZvciBob3cgdG8gdHJvdWJsZXNob290IGFuZCBmaXggdGhlIGNvbW1vbiBjYXNlcyB3aGVyZSB0aGlzIHNpdHVhdGlvbiBjYW4gaGFwcGVuOiBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvaXNzdWVzLzE5NDEjaXNzdWVjb21tZW50LTQxNzg2MjAyMVxcblxcblwiLDExOlwiX1RoaXMgZXJyb3Igd2FzIHJlcGxhY2VkIHdpdGggYSBkZXYtdGltZSB3YXJuaW5nLCBpdCB3aWxsIGJlIGRlbGV0ZWQgZm9yIHY0IGZpbmFsLl8gW2NyZWF0ZUdsb2JhbFN0eWxlXSByZWNlaXZlZCBjaGlsZHJlbiB3aGljaCB3aWxsIG5vdCBiZSByZW5kZXJlZC4gUGxlYXNlIHVzZSB0aGUgY29tcG9uZW50IHdpdGhvdXQgcGFzc2luZyBjaGlsZHJlbiBlbGVtZW50cy5cXG5cXG5cIiwxMjpcIkl0IHNlZW1zIHlvdSBhcmUgaW50ZXJwb2xhdGluZyBhIGtleWZyYW1lIGRlY2xhcmF0aW9uICglcykgaW50byBhbiB1bnRhZ2dlZCBzdHJpbmcuIFRoaXMgd2FzIHN1cHBvcnRlZCBpbiBzdHlsZWQtY29tcG9uZW50cyB2MywgYnV0IGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkIGluIHY0IGFzIGtleWZyYW1lcyBhcmUgbm93IGluamVjdGVkIG9uLWRlbWFuZC4gUGxlYXNlIHdyYXAgeW91ciBzdHJpbmcgaW4gdGhlIGNzc1xcXFxgXFxcXGAgaGVscGVyIHdoaWNoIGVuc3VyZXMgdGhlIHN0eWxlcyBhcmUgaW5qZWN0ZWQgY29ycmVjdGx5LiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYXBpI2Nzc1xcblxcblwiLDEzOlwiJXMgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlxcblxcblwiLDE0OidUaGVtZVByb3ZpZGVyOiBcInRoZW1lXCIgcHJvcCBpcyByZXF1aXJlZC5cXG5cXG4nLDE1OlwiQSBzdHlsaXMgcGx1Z2luIGhhcyBiZWVuIHN1cHBsaWVkIHRoYXQgaXMgbm90IG5hbWVkLiBXZSBuZWVkIGEgbmFtZSBmb3IgZWFjaCBwbHVnaW4gdG8gYmUgYWJsZSB0byBwcmV2ZW50IHN0eWxpbmcgY29sbGlzaW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBzdHlsaXMgY29uZmlndXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIGFwcC4gQmVmb3JlIHlvdSBwYXNzIHlvdXIgcGx1Z2luIHRvIGA8U3R5bGVTaGVldE1hbmFnZXIgc3R5bGlzUGx1Z2lucz17W119PmAsIHBsZWFzZSBtYWtlIHN1cmUgZWFjaCBwbHVnaW4gaXMgdW5pcXVlbHktbmFtZWQsIGUuZy5cXG5cXG5gYGBqc1xcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnRlZFBsdWdpbiwgJ25hbWUnLCB7IHZhbHVlOiAnc29tZS11bmlxdWUtbmFtZScgfSk7XFxuYGBgXFxuXFxuXCIsMTY6XCJSZWFjaGVkIHRoZSBsaW1pdCBvZiBob3cgbWFueSBzdHlsZWQgY29tcG9uZW50cyBtYXkgYmUgY3JlYXRlZCBhdCBncm91cCAlcy5cXG5Zb3UgbWF5IG9ubHkgY3JlYXRlIHVwIHRvIDEsMDczLDc0MSw4MjQgY29tcG9uZW50cy4gSWYgeW91J3JlIGNyZWF0aW5nIGNvbXBvbmVudHMgZHluYW1pY2FsbHksXFxuYXMgZm9yIGluc3RhbmNlIGluIHlvdXIgcmVuZGVyIG1ldGhvZCB0aGVuIHlvdSBtYXkgYmUgcnVubmluZyBpbnRvIHRoaXMgbGltaXRhdGlvbi5cXG5cXG5cIiwxNzpcIkNTU1N0eWxlU2hlZXQgY291bGQgbm90IGJlIGZvdW5kIG9uIEhUTUxTdHlsZUVsZW1lbnQuXFxuSGFzIHN0eWxlZC1jb21wb25lbnRzJyBzdHlsZSB0YWcgYmVlbiB1bm1vdW50ZWQgb3IgYWx0ZXJlZCBieSBhbm90aGVyIHNjcmlwdD9cXG5cIiwxODpcIlRoZW1lUHJvdmlkZXI6IFBsZWFzZSBtYWtlIHN1cmUgeW91ciB1c2VUaGVtZSBob29rIGlzIHdpdGhpbiBhIGA8VGhlbWVQcm92aWRlcj5gXCJ9Ont9O2Z1bmN0aW9uIGRlKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbj1lWzBdLG89W10scj0xLHM9ZS5sZW5ndGg7cjxzO3IrPTEpby5wdXNoKGVbcl0pO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7bj1uLnJlcGxhY2UoLyVbYS16XS8sZSl9KSxufWZ1bmN0aW9uIGhlKHQpe2Zvcih2YXIgbj1bXSxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyluW28tMV09YXJndW1lbnRzW29dO3JldHVyblwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/bmV3IEVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvYmxvYi9tYWluL3BhY2thZ2VzL3N0eWxlZC1jb21wb25lbnRzL3NyYy91dGlscy9lcnJvcnMubWQjXCIuY29uY2F0KHQsXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpLmNvbmNhdChuLmxlbmd0aD4wP1wiIEFyZ3M6IFwiLmNvbmNhdChuLmpvaW4oXCIsIFwiKSk6XCJcIikpOm5ldyBFcnJvcihkZS5hcHBseSh2b2lkIDAsZShbcGVbdF1dLG4sITEpKS50cmltKCkpfXZhciBmZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5ncm91cFNpemVzPW5ldyBVaW50MzJBcnJheSg1MTIpLHRoaXMubGVuZ3RoPTUxMix0aGlzLnRhZz1lfXJldHVybiBlLnByb3RvdHlwZS5pbmRleE9mR3JvdXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wO248ZTtuKyspdCs9dGhpcy5ncm91cFNpemVzW25dO3JldHVybiB0fSxlLnByb3RvdHlwZS5pbnNlcnRSdWxlcz1mdW5jdGlvbihlLHQpe2lmKGU+PXRoaXMuZ3JvdXBTaXplcy5sZW5ndGgpe2Zvcih2YXIgbj10aGlzLmdyb3VwU2l6ZXMsbz1uLmxlbmd0aCxyPW87ZT49cjspaWYoKHI8PD0xKTwwKXRocm93IGhlKDE2LFwiXCIuY29uY2F0KGUpKTt0aGlzLmdyb3VwU2l6ZXM9bmV3IFVpbnQzMkFycmF5KHIpLHRoaXMuZ3JvdXBTaXplcy5zZXQobiksdGhpcy5sZW5ndGg9cjtmb3IodmFyIHM9bztzPHI7cysrKXRoaXMuZ3JvdXBTaXplc1tzXT0wfWZvcih2YXIgaT10aGlzLmluZGV4T2ZHcm91cChlKzEpLGE9KHM9MCx0Lmxlbmd0aCk7czxhO3MrKyl0aGlzLnRhZy5pbnNlcnRSdWxlKGksdFtzXSkmJih0aGlzLmdyb3VwU2l6ZXNbZV0rKyxpKyspfSxlLnByb3RvdHlwZS5jbGVhckdyb3VwPWZ1bmN0aW9uKGUpe2lmKGU8dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuZ3JvdXBTaXplc1tlXSxuPXRoaXMuaW5kZXhPZkdyb3VwKGUpLG89bit0O3RoaXMuZ3JvdXBTaXplc1tlXT0wO2Zvcih2YXIgcj1uO3I8bztyKyspdGhpcy50YWcuZGVsZXRlUnVsZShuKX19LGUucHJvdG90eXBlLmdldEdyb3VwPWZ1bmN0aW9uKGUpe3ZhciB0PVwiXCI7aWYoZT49dGhpcy5sZW5ndGh8fDA9PT10aGlzLmdyb3VwU2l6ZXNbZV0pcmV0dXJuIHQ7Zm9yKHZhciBuPXRoaXMuZ3JvdXBTaXplc1tlXSxvPXRoaXMuaW5kZXhPZkdyb3VwKGUpLHI9bytuLHM9bztzPHI7cysrKXQrPVwiXCIuY29uY2F0KHRoaXMudGFnLmdldFJ1bGUocykpLmNvbmNhdChnKTtyZXR1cm4gdH0sZX0oKSxtZT0xPDwzMCx5ZT1uZXcgTWFwLHZlPW5ldyBNYXAsZ2U9MSxTZT1mdW5jdGlvbihlKXtpZih5ZS5oYXMoZSkpcmV0dXJuIHllLmdldChlKTtmb3IoO3ZlLmhhcyhnZSk7KWdlKys7dmFyIHQ9Z2UrKztpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYoKDB8dCk8MHx8dD5tZSkpdGhyb3cgaGUoMTYsXCJcIi5jb25jYXQodCkpO3JldHVybiB5ZS5zZXQoZSx0KSx2ZS5zZXQodCxlKSx0fSx3ZT1mdW5jdGlvbihlLHQpe2dlPXQrMSx5ZS5zZXQoZSx0KSx2ZS5zZXQodCxlKX0sYmU9XCJzdHlsZVtcIi5jb25jYXQoZixcIl1bXCIpLmNvbmNhdCh5LCc9XCInKS5jb25jYXQodiwnXCJdJyksRWU9bmV3IFJlZ0V4cChcIl5cIi5jb25jYXQoZiwnXFxcXC5nKFxcXFxkKylcXFxcW2lkPVwiKFtcXFxcd1xcXFxkLV0rKVwiXFxcXF0uKj9cIihbXlwiXSopJykpLE5lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIG8scj1uLnNwbGl0KFwiLFwiKSxzPTAsaT1yLmxlbmd0aDtzPGk7cysrKShvPXJbc10pJiZlLnJlZ2lzdGVyTmFtZSh0LG8pfSxQZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixvPShudWxsIT09KG49dC50ZXh0Q29udGVudCkmJnZvaWQgMCE9PW4/bjpcIlwiKS5zcGxpdChnKSxyPVtdLHM9MCxpPW8ubGVuZ3RoO3M8aTtzKyspe3ZhciBhPW9bc10udHJpbSgpO2lmKGEpe3ZhciBjPWEubWF0Y2goRWUpO2lmKGMpe3ZhciBsPTB8cGFyc2VJbnQoY1sxXSwxMCksdT1jWzJdOzAhPT1sJiYod2UodSxsKSxOZShlLHUsY1szXSksZS5nZXRUYWcoKS5pbnNlcnRSdWxlcyhsLHIpKSxyLmxlbmd0aD0wfWVsc2Ugci5wdXNoKGEpfX19LF9lPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGJlKSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXt2YXIgcj10W25dO3ImJnIuZ2V0QXR0cmlidXRlKGYpIT09bSYmKFBlKGUsciksci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpfX07ZnVuY3Rpb24gQ2UoKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgX193ZWJwYWNrX25vbmNlX18/X193ZWJwYWNrX25vbmNlX186bnVsbH12YXIgSWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuaGVhZCxuPWV8fHQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIikscj1mdW5jdGlvbihlKXt2YXIgdD1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW1wiLmNvbmNhdChmLFwiXVwiKSkpO3JldHVybiB0W3QubGVuZ3RoLTFdfShuKSxzPXZvaWQgMCE9PXI/ci5uZXh0U2libGluZzpudWxsO28uc2V0QXR0cmlidXRlKGYsbSksby5zZXRBdHRyaWJ1dGUoeSx2KTt2YXIgaT1DZSgpO3JldHVybiBpJiZvLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsaSksbi5pbnNlcnRCZWZvcmUobyxzKSxvfSxBZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5lbGVtZW50PUllKGUpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSksdGhpcy5zaGVldD1mdW5jdGlvbihlKXtpZihlLnNoZWV0KXJldHVybiBlLnNoZWV0O2Zvcih2YXIgdD1kb2N1bWVudC5zdHlsZVNoZWV0cyxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXt2YXIgcj10W25dO2lmKHIub3duZXJOb2RlPT09ZSlyZXR1cm4gcn10aHJvdyBoZSgxNyl9KHRoaXMuZWxlbWVudCksdGhpcy5sZW5ndGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gdGhpcy5zaGVldC5pbnNlcnRSdWxlKHQsZSksdGhpcy5sZW5ndGgrKywhMH1jYXRjaChlKXtyZXR1cm4hMX19LGUucHJvdG90eXBlLmRlbGV0ZVJ1bGU9ZnVuY3Rpb24oZSl7dGhpcy5zaGVldC5kZWxldGVSdWxlKGUpLHRoaXMubGVuZ3RoLS19LGUucHJvdG90eXBlLmdldFJ1bGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zaGVldC5jc3NSdWxlc1tlXTtyZXR1cm4gdCYmdC5jc3NUZXh0P3QuY3NzVGV4dDpcIlwifSxlfSgpLE9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmVsZW1lbnQ9SWUoZSksdGhpcy5ub2Rlcz10aGlzLmVsZW1lbnQuY2hpbGROb2Rlcyx0aGlzLmxlbmd0aD0wfXJldHVybiBlLnByb3RvdHlwZS5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7aWYoZTw9dGhpcy5sZW5ndGgmJmU+PTApe3ZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpO3JldHVybiB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKG4sdGhpcy5ub2Rlc1tlXXx8bnVsbCksdGhpcy5sZW5ndGgrKywhMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlc1tlXSksdGhpcy5sZW5ndGgtLX0sZS5wcm90b3R5cGUuZ2V0UnVsZT1mdW5jdGlvbihlKXtyZXR1cm4gZTx0aGlzLmxlbmd0aD90aGlzLm5vZGVzW2VdLnRleHRDb250ZW50OlwiXCJ9LGV9KCksRGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMucnVsZXM9W10sdGhpcy5sZW5ndGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPD10aGlzLmxlbmd0aCYmKHRoaXMucnVsZXMuc3BsaWNlKGUsMCx0KSx0aGlzLmxlbmd0aCsrLCEwKX0sZS5wcm90b3R5cGUuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLnJ1bGVzLnNwbGljZShlLDEpLHRoaXMubGVuZ3RoLS19LGUucHJvdG90eXBlLmdldFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8dGhpcy5sZW5ndGg/dGhpcy5ydWxlc1tlXTpcIlwifSxlfSgpLFJlPVMsVGU9e2lzU2VydmVyOiFTLHVzZUNTU09NSW5qZWN0aW9uOiF3fSxrZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxuLG8pe3ZvaWQgMD09PWUmJihlPUMpLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj10aGlzO3RoaXMub3B0aW9ucz10KHQoe30sVGUpLGUpLHRoaXMuZ3M9bix0aGlzLm5hbWVzPW5ldyBNYXAobyksdGhpcy5zZXJ2ZXI9ISFlLmlzU2VydmVyLCF0aGlzLnNlcnZlciYmUyYmUmUmJihSZT0hMSxfZSh0aGlzKSksdWUodGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5nZXRUYWcoKSxuPXQubGVuZ3RoLG89XCJcIixyPWZ1bmN0aW9uKG4pe3ZhciByPWZ1bmN0aW9uKGUpe3JldHVybiB2ZS5nZXQoZSl9KG4pO2lmKHZvaWQgMD09PXIpcmV0dXJuXCJjb250aW51ZVwiO3ZhciBzPWUubmFtZXMuZ2V0KHIpLGk9dC5nZXRHcm91cChuKTtpZih2b2lkIDA9PT1zfHwhcy5zaXplfHwwPT09aS5sZW5ndGgpcmV0dXJuXCJjb250aW51ZVwiO3ZhciBhPVwiXCIuY29uY2F0KGYsXCIuZ1wiKS5jb25jYXQobiwnW2lkPVwiJykuY29uY2F0KHIsJ1wiXScpLGM9XCJcIjt2b2lkIDAhPT1zJiZzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5sZW5ndGg+MCYmKGMrPVwiXCIuY29uY2F0KGUsXCIsXCIpKX0pLG8rPVwiXCIuY29uY2F0KGkpLmNvbmNhdChhLCd7Y29udGVudDpcIicpLmNvbmNhdChjLCdcIn0nKS5jb25jYXQoZyl9LHM9MDtzPG47cysrKXIocyk7cmV0dXJuIG99KHIpfSl9cmV0dXJuIGUucmVnaXN0ZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gU2UoZSl9LGUucHJvdG90eXBlLnJlaHlkcmF0ZT1mdW5jdGlvbigpeyF0aGlzLnNlcnZlciYmUyYmX2UodGhpcyl9LGUucHJvdG90eXBlLnJlY29uc3RydWN0V2l0aE9wdGlvbnM9ZnVuY3Rpb24obixvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89ITApLG5ldyBlKHQodCh7fSx0aGlzLm9wdGlvbnMpLG4pLHRoaXMuZ3MsbyYmdGhpcy5uYW1lc3x8dm9pZCAwKX0sZS5wcm90b3R5cGUuYWxsb2NhdGVHU0luc3RhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdzW2VdPSh0aGlzLmdzW2VdfHwwKSsxfSxlLnByb3RvdHlwZS5nZXRUYWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWd8fCh0aGlzLnRhZz0oZT1mdW5jdGlvbihlKXt2YXIgdD1lLnVzZUNTU09NSW5qZWN0aW9uLG49ZS50YXJnZXQ7cmV0dXJuIGUuaXNTZXJ2ZXI/bmV3IERlKG4pOnQ/bmV3IEFlKG4pOm5ldyBPZShuKX0odGhpcy5vcHRpb25zKSxuZXcgZmUoZSkpKTt2YXIgZX0sZS5wcm90b3R5cGUuaGFzTmFtZUZvcklkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5oYXModCl9LGUucHJvdG90eXBlLnJlZ2lzdGVyTmFtZT1mdW5jdGlvbihlLHQpe2lmKFNlKGUpLHRoaXMubmFtZXMuaGFzKGUpKXRoaXMubmFtZXMuZ2V0KGUpLmFkZCh0KTtlbHNle3ZhciBuPW5ldyBTZXQ7bi5hZGQodCksdGhpcy5uYW1lcy5zZXQoZSxuKX19LGUucHJvdG90eXBlLmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnJlZ2lzdGVyTmFtZShlLHQpLHRoaXMuZ2V0VGFnKCkuaW5zZXJ0UnVsZXMoU2UoZSksbil9LGUucHJvdG90eXBlLmNsZWFyTmFtZXM9ZnVuY3Rpb24oZSl7dGhpcy5uYW1lcy5oYXMoZSkmJnRoaXMubmFtZXMuZ2V0KGUpLmNsZWFyKCl9LGUucHJvdG90eXBlLmNsZWFyUnVsZXM9ZnVuY3Rpb24oZSl7dGhpcy5nZXRUYWcoKS5jbGVhckdyb3VwKFNlKGUpKSx0aGlzLmNsZWFyTmFtZXMoZSl9LGUucHJvdG90eXBlLmNsZWFyVGFnPWZ1bmN0aW9uKCl7dGhpcy50YWc9dm9pZCAwfSxlfSgpLGplPS8mL2cseGU9L15cXHMqXFwvXFwvLiokL2dtO2Z1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwicnVsZVwiPT09ZS50eXBlJiYoZS52YWx1ZT1cIlwiLmNvbmNhdCh0LFwiIFwiKS5jb25jYXQoZS52YWx1ZSksZS52YWx1ZT1lLnZhbHVlLnJlcGxhY2VBbGwoXCIsXCIsXCIsXCIuY29uY2F0KHQsXCIgXCIpKSxlLnByb3BzPWUucHJvcHMubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiXCIuY29uY2F0KHQsXCIgXCIpLmNvbmNhdChlKX0pKSxBcnJheS5pc0FycmF5KGUuY2hpbGRyZW4pJiZcIkBrZXlmcmFtZXNcIiE9PWUudHlwZSYmKGUuY2hpbGRyZW49VmUoZS5jaGlsZHJlbix0KSksZX0pfWZ1bmN0aW9uIEZlKGUpe3ZhciB0LG4sbyxyPXZvaWQgMD09PWU/QzplLHM9ci5vcHRpb25zLGk9dm9pZCAwPT09cz9DOnMsYT1yLnBsdWdpbnMsYz12b2lkIDA9PT1hP186YSxsPWZ1bmN0aW9uKGUsbyxyKXtyZXR1cm4gci5zdGFydHNXaXRoKG4pJiZyLmVuZHNXaXRoKG4pJiZyLnJlcGxhY2VBbGwobixcIlwiKS5sZW5ndGg+MD9cIi5cIi5jb25jYXQodCk6ZX0sdT1jLnNsaWNlKCk7dS5wdXNoKGZ1bmN0aW9uKGUpe2UudHlwZT09PWQuUlVMRVNFVCYmZS52YWx1ZS5pbmNsdWRlcyhcIiZcIikmJihlLnByb3BzWzBdPWUucHJvcHNbMF0ucmVwbGFjZShqZSxuKS5yZXBsYWNlKG8sbCkpfSksaS5wcmVmaXgmJnUucHVzaChkLnByZWZpeGVyKSx1LnB1c2goZC5zdHJpbmdpZnkpO3ZhciBwPWZ1bmN0aW9uKGUscixzLGEpe3ZvaWQgMD09PXImJihyPVwiXCIpLHZvaWQgMD09PXMmJihzPVwiXCIpLHZvaWQgMD09PWEmJihhPVwiJlwiKSx0PWEsbj1yLG89bmV3IFJlZ0V4cChcIlxcXFxcIi5jb25jYXQobixcIlxcXFxiXCIpLFwiZ1wiKTt2YXIgYz1lLnJlcGxhY2UoeGUsXCJcIiksbD1kLmNvbXBpbGUoc3x8cj9cIlwiLmNvbmNhdChzLFwiIFwiKS5jb25jYXQocixcIiB7IFwiKS5jb25jYXQoYyxcIiB9XCIpOmMpO2kubmFtZXNwYWNlJiYobD1WZShsLGkubmFtZXNwYWNlKSk7dmFyIHA9W107cmV0dXJuIGQuc2VyaWFsaXplKGwsZC5taWRkbGV3YXJlKHUuY29uY2F0KGQucnVsZXNoZWV0KGZ1bmN0aW9uKGUpe3JldHVybiBwLnB1c2goZSl9KSkpKSxwfTtyZXR1cm4gcC5oYXNoPWMubGVuZ3RoP2MucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubmFtZXx8aGUoMTUpLE0oZSx0Lm5hbWUpfSxGKS50b1N0cmluZygpOlwiXCIscH12YXIgTWU9bmV3IGtlLHplPUZlKCksJGU9by5jcmVhdGVDb250ZXh0KHtzaG91bGRGb3J3YXJkUHJvcDp2b2lkIDAsc3R5bGVTaGVldDpNZSxzdHlsaXM6emV9KSxCZT0kZS5Db25zdW1lcixMZT1vLmNyZWF0ZUNvbnRleHQodm9pZCAwKTtmdW5jdGlvbiBHZSgpe3JldHVybiBjKCRlKX1mdW5jdGlvbiBZZShlKXt2YXIgdD1zKGUuc3R5bGlzUGx1Z2lucyksbj10WzBdLHI9dFsxXSxjPUdlKCkuc3R5bGVTaGVldCxsPWkoZnVuY3Rpb24oKXt2YXIgdD1jO3JldHVybiBlLnNoZWV0P3Q9ZS5zaGVldDplLnRhcmdldCYmKHQ9dC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zKHt0YXJnZXQ6ZS50YXJnZXR9LCExKSksZS5kaXNhYmxlQ1NTT01JbmplY3Rpb24mJih0PXQucmVjb25zdHJ1Y3RXaXRoT3B0aW9ucyh7dXNlQ1NTT01JbmplY3Rpb246ITF9KSksdH0sW2UuZGlzYWJsZUNTU09NSW5qZWN0aW9uLGUuc2hlZXQsZS50YXJnZXQsY10pLHU9aShmdW5jdGlvbigpe3JldHVybiBGZSh7b3B0aW9uczp7bmFtZXNwYWNlOmUubmFtZXNwYWNlLHByZWZpeDplLmVuYWJsZVZlbmRvclByZWZpeGVzfSxwbHVnaW5zOm59KX0sW2UuZW5hYmxlVmVuZG9yUHJlZml4ZXMsZS5uYW1lc3BhY2Usbl0pO2EoZnVuY3Rpb24oKXtwKG4sZS5zdHlsaXNQbHVnaW5zKXx8cihlLnN0eWxpc1BsdWdpbnMpfSxbZS5zdHlsaXNQbHVnaW5zXSk7dmFyIGQ9aShmdW5jdGlvbigpe3JldHVybntzaG91bGRGb3J3YXJkUHJvcDplLnNob3VsZEZvcndhcmRQcm9wLHN0eWxlU2hlZXQ6bCxzdHlsaXM6dX19LFtlLnNob3VsZEZvcndhcmRQcm9wLGwsdV0pO3JldHVybiBvLmNyZWF0ZUVsZW1lbnQoJGUuUHJvdmlkZXIse3ZhbHVlOmR9LG8uY3JlYXRlRWxlbWVudChMZS5Qcm92aWRlcix7dmFsdWU6dX0sZS5jaGlsZHJlbikpfXZhciBXZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2YXIgbj10aGlzO3RoaXMuaW5qZWN0PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9emUpO3ZhciBvPW4ubmFtZSt0Lmhhc2g7ZS5oYXNOYW1lRm9ySWQobi5pZCxvKXx8ZS5pbnNlcnRSdWxlcyhuLmlkLG8sdChuLnJ1bGVzLG8sXCJAa2V5ZnJhbWVzXCIpKX0sdGhpcy5uYW1lPWUsdGhpcy5pZD1cInNjLWtleWZyYW1lcy1cIi5jb25jYXQoZSksdGhpcy5ydWxlcz10LHVlKHRoaXMsZnVuY3Rpb24oKXt0aHJvdyBoZSgxMixTdHJpbmcobi5uYW1lKSl9KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9emUpLHRoaXMubmFtZStlLmhhc2h9LGV9KCkscWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PVwiQVwiJiZlPD1cIlpcIn07ZnVuY3Rpb24gSGUoZSl7Zm9yKHZhciB0PVwiXCIsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO2lmKDE9PT1uJiZcIi1cIj09PW8mJlwiLVwiPT09ZVswXSlyZXR1cm4gZTtxZShvKT90Kz1cIi1cIitvLnRvTG93ZXJDYXNlKCk6dCs9b31yZXR1cm4gdC5zdGFydHNXaXRoKFwibXMtXCIpP1wiLVwiK3Q6dH12YXIgVWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZXx8XCJcIj09PWV9LEplPWZ1bmN0aW9uKHQpe3ZhciBuLG8scj1bXTtmb3IodmFyIHMgaW4gdCl7dmFyIGk9dFtzXTt0Lmhhc093blByb3BlcnR5KHMpJiYhVWUoaSkmJihBcnJheS5pc0FycmF5KGkpJiZpLmlzQ3NzfHxyZShpKT9yLnB1c2goXCJcIi5jb25jYXQoSGUocyksXCI6XCIpLGksXCI7XCIpOmNlKGkpP3IucHVzaC5hcHBseShyLGUoZShbXCJcIi5jb25jYXQocyxcIiB7XCIpXSxKZShpKSwhMSksW1wifVwiXSwhMSkpOnIucHVzaChcIlwiLmNvbmNhdChIZShzKSxcIjogXCIpLmNvbmNhdCgobj1zLG51bGw9PShvPWkpfHxcImJvb2xlYW5cIj09dHlwZW9mIG98fFwiXCI9PT1vP1wiXCI6XCJudW1iZXJcIiE9dHlwZW9mIG98fDA9PT1vfHxuIGluIGh8fG4uc3RhcnRzV2l0aChcIi0tXCIpP1N0cmluZyhvKS50cmltKCk6XCJcIi5jb25jYXQobyxcInB4XCIpKSxcIjtcIikpKX1yZXR1cm4gcn07ZnVuY3Rpb24gWGUoZSx0LG4sbyl7aWYoVWUoZSkpcmV0dXJuW107aWYoc2UoZSkpcmV0dXJuW1wiLlwiLmNvbmNhdChlLnN0eWxlZENvbXBvbmVudElkKV07aWYocmUoZSkpe2lmKCFyZShzPWUpfHxzLnByb3RvdHlwZSYmcy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudHx8IXQpcmV0dXJuW2VdO3ZhciByPWUodCk7cmV0dXJuXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8XCJvYmplY3RcIiE9dHlwZW9mIHJ8fEFycmF5LmlzQXJyYXkocil8fHIgaW5zdGFuY2VvZiBXZXx8Y2Uocil8fG51bGw9PT1yfHxjb25zb2xlLmVycm9yKFwiXCIuY29uY2F0KEIoZSksXCIgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlwiKSksWGUocix0LG4sbyl9dmFyIHM7cmV0dXJuIGUgaW5zdGFuY2VvZiBXZT9uPyhlLmluamVjdChuLG8pLFtlLmdldE5hbWUobyldKTpbZV06Y2UoZSk/SmUoZSk6QXJyYXkuaXNBcnJheShlKT9BcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KF8sZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFhlKGUsdCxuLG8pfSkpOltlLnRvU3RyaW5nKCldfWZ1bmN0aW9uIFplKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCs9MSl7dmFyIG49ZVt0XTtpZihyZShuKSYmIXNlKG4pKXJldHVybiExfXJldHVybiEwfXZhciBLZT16KHYpLFFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5ydWxlcz1lLHRoaXMuc3RhdGljUnVsZXNJZD1cIlwiLHRoaXMuaXNTdGF0aWM9XCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKHZvaWQgMD09PW58fG4uaXNTdGF0aWMpJiZaZShlKSx0aGlzLmNvbXBvbmVudElkPXQsdGhpcy5iYXNlSGFzaD1NKEtlLHQpLHRoaXMuYmFzZVN0eWxlPW4sa2UucmVnaXN0ZXJJZCh0KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXMuYmFzZVN0eWxlP3RoaXMuYmFzZVN0eWxlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKGUsdCxuKTpcIlwiO2lmKHRoaXMuaXNTdGF0aWMmJiFuLmhhc2gpaWYodGhpcy5zdGF0aWNSdWxlc0lkJiZ0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLHRoaXMuc3RhdGljUnVsZXNJZCkpbz1pZShvLHRoaXMuc3RhdGljUnVsZXNJZCk7ZWxzZXt2YXIgcj1hZShYZSh0aGlzLnJ1bGVzLGUsdCxuKSkscz14KE0odGhpcy5iYXNlSGFzaCxyKT4+PjApO2lmKCF0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLHMpKXt2YXIgaT1uKHIsXCIuXCIuY29uY2F0KHMpLHZvaWQgMCx0aGlzLmNvbXBvbmVudElkKTt0Lmluc2VydFJ1bGVzKHRoaXMuY29tcG9uZW50SWQscyxpKX1vPWllKG8scyksdGhpcy5zdGF0aWNSdWxlc0lkPXN9ZWxzZXtmb3IodmFyIGE9TSh0aGlzLmJhc2VIYXNoLG4uaGFzaCksYz1cIlwiLGw9MDtsPHRoaXMucnVsZXMubGVuZ3RoO2wrKyl7dmFyIHU9dGhpcy5ydWxlc1tsXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdSljKz11LFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihhPU0oYSx1KSk7ZWxzZSBpZih1KXt2YXIgcD1hZShYZSh1LGUsdCxuKSk7YT1NKGEscCtsKSxjKz1wfX1pZihjKXt2YXIgZD14KGE+Pj4wKTt0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLGQpfHx0Lmluc2VydFJ1bGVzKHRoaXMuY29tcG9uZW50SWQsZCxuKGMsXCIuXCIuY29uY2F0KGQpLHZvaWQgMCx0aGlzLmNvbXBvbmVudElkKSksbz1pZShvLGQpfX1yZXR1cm4gb30sZX0oKSxldD1vLmNyZWF0ZUNvbnRleHQodm9pZCAwKSx0dD1ldC5Db25zdW1lcjtmdW5jdGlvbiBudCgpe3ZhciBlPWMoZXQpO2lmKCFlKXRocm93IGhlKDE4KTtyZXR1cm4gZX1mdW5jdGlvbiBvdChlKXt2YXIgbj1vLnVzZUNvbnRleHQoZXQpLHI9aShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLG4pe2lmKCFlKXRocm93IGhlKDE0KTtpZihyZShlKSl7dmFyIG89ZShuKTtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYobnVsbD09PW98fEFycmF5LmlzQXJyYXkobyl8fFwib2JqZWN0XCIhPXR5cGVvZiBvKSl0aHJvdyBoZSg3KTtyZXR1cm4gb31pZihBcnJheS5pc0FycmF5KGUpfHxcIm9iamVjdFwiIT10eXBlb2YgZSl0aHJvdyBoZSg4KTtyZXR1cm4gbj90KHQoe30sbiksZSk6ZX0oZS50aGVtZSxuKX0sW2UudGhlbWUsbl0pO3JldHVybiBlLmNoaWxkcmVuP28uY3JlYXRlRWxlbWVudChldC5Qcm92aWRlcix7dmFsdWU6cn0sZS5jaGlsZHJlbik6bnVsbH12YXIgcnQ9e30sc3Q9bmV3IFNldDtmdW5jdGlvbiBpdChlLHIscyl7dmFyIGk9c2UoZSksYT1lLGM9IUwoZSkscD1yLmF0dHJzLGQ9dm9pZCAwPT09cD9fOnAsaD1yLmNvbXBvbmVudElkLGY9dm9pZCAwPT09aD9mdW5jdGlvbihlLHQpe3ZhciBuPVwic3RyaW5nXCIhPXR5cGVvZiBlP1wic2NcIjpSKGUpO3J0W25dPShydFtuXXx8MCkrMTt2YXIgbz1cIlwiLmNvbmNhdChuLFwiLVwiKS5jb25jYXQoJCh2K24rcnRbbl0pKTtyZXR1cm4gdD9cIlwiLmNvbmNhdCh0LFwiLVwiKS5jb25jYXQobyk6b30oci5kaXNwbGF5TmFtZSxyLnBhcmVudENvbXBvbmVudElkKTpoLG09ci5kaXNwbGF5TmFtZSx5PXZvaWQgMD09PW0/ZnVuY3Rpb24oZSl7cmV0dXJuIEwoZSk/XCJzdHlsZWQuXCIuY29uY2F0KGUpOlwiU3R5bGVkKFwiLmNvbmNhdChCKGUpLFwiKVwiKX0oZSk6bSxnPXIuZGlzcGxheU5hbWUmJnIuY29tcG9uZW50SWQ/XCJcIi5jb25jYXQoUihyLmRpc3BsYXlOYW1lKSxcIi1cIikuY29uY2F0KHIuY29tcG9uZW50SWQpOnIuY29tcG9uZW50SWR8fGYsUz1pJiZhLmF0dHJzP2EuYXR0cnMuY29uY2F0KGQpLmZpbHRlcihCb29sZWFuKTpkLHc9ci5zaG91bGRGb3J3YXJkUHJvcDtpZihpJiZhLnNob3VsZEZvcndhcmRQcm9wKXt2YXIgYj1hLnNob3VsZEZvcndhcmRQcm9wO2lmKHIuc2hvdWxkRm9yd2FyZFByb3Ape3ZhciBFPXIuc2hvdWxkRm9yd2FyZFByb3A7dz1mdW5jdGlvbihlLHQpe3JldHVybiBiKGUsdCkmJkUoZSx0KX19ZWxzZSB3PWJ9dmFyIE49bmV3IFFlKHMsZyxpP2EuY29tcG9uZW50U3R5bGU6dm9pZCAwKTtmdW5jdGlvbiBPKGUscil7cmV0dXJuIGZ1bmN0aW9uKGUscixzKXt2YXIgaT1lLmF0dHJzLGE9ZS5jb21wb25lbnRTdHlsZSxjPWUuZGVmYXVsdFByb3BzLHA9ZS5mb2xkZWRDb21wb25lbnRJZHMsZD1lLnN0eWxlZENvbXBvbmVudElkLGg9ZS50YXJnZXQsZj1vLnVzZUNvbnRleHQoZXQpLG09R2UoKSx5PWUuc2hvdWxkRm9yd2FyZFByb3B8fG0uc2hvdWxkRm9yd2FyZFByb3A7XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmbChkKTt2YXIgdj1JKHIsZixjKXx8QyxnPWZ1bmN0aW9uKGUsbixvKXtmb3IodmFyIHIscz10KHQoe30sbikse2NsYXNzTmFtZTp2b2lkIDAsdGhlbWU6b30pLGk9MDtpPGUubGVuZ3RoO2krPTEpe3ZhciBhPXJlKHI9ZVtpXSk/cihzKTpyO2Zvcih2YXIgYyBpbiBhKXNbY109XCJjbGFzc05hbWVcIj09PWM/aWUoc1tjXSxhW2NdKTpcInN0eWxlXCI9PT1jP3QodCh7fSxzW2NdKSxhW2NdKTphW2NdfXJldHVybiBuLmNsYXNzTmFtZSYmKHMuY2xhc3NOYW1lPWllKHMuY2xhc3NOYW1lLG4uY2xhc3NOYW1lKSksc30oaSxyLHYpLFM9Zy5hc3x8aCx3PXt9O2Zvcih2YXIgYiBpbiBnKXZvaWQgMD09PWdbYl18fFwiJFwiPT09YlswXXx8XCJhc1wiPT09Ynx8XCJ0aGVtZVwiPT09YiYmZy50aGVtZT09PXZ8fChcImZvcndhcmRlZEFzXCI9PT1iP3cuYXM9Zy5mb3J3YXJkZWRBczp5JiYheShiLFMpfHwod1tiXT1nW2JdLHl8fFwiZGV2ZWxvcG1lbnRcIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WfHxuKGIpfHxzdC5oYXMoYil8fCFBLmhhcyhTKXx8KHN0LmFkZChiKSxjb25zb2xlLndhcm4oJ3N0eWxlZC1jb21wb25lbnRzOiBpdCBsb29rcyBsaWtlIGFuIHVua25vd24gcHJvcCBcIicuY29uY2F0KGIsJ1wiIGlzIGJlaW5nIHNlbnQgdGhyb3VnaCB0byB0aGUgRE9NLCB3aGljaCB3aWxsIGxpa2VseSB0cmlnZ2VyIGEgUmVhY3QgY29uc29sZSBlcnJvci4gSWYgeW91IHdvdWxkIGxpa2UgYXV0b21hdGljIGZpbHRlcmluZyBvZiB1bmtub3duIHByb3BzLCB5b3UgY2FuIG9wdC1pbnRvIHRoYXQgYmVoYXZpb3IgdmlhIGA8U3R5bGVTaGVldE1hbmFnZXIgc2hvdWxkRm9yd2FyZFByb3A9ey4uLn0+YCAoY29ubmVjdCBhbiBBUEkgbGlrZSBgQGVtb3Rpb24vaXMtcHJvcC12YWxpZGApIG9yIGNvbnNpZGVyIHVzaW5nIHRyYW5zaWVudCBwcm9wcyAoYCRgIHByZWZpeCBmb3IgYXV0b21hdGljIGZpbHRlcmluZy4pJykpKSkpO3ZhciBFPWZ1bmN0aW9uKGUsdCl7dmFyIG49R2UoKSxvPWUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXModCxuLnN0eWxlU2hlZXQsbi5zdHlsaXMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmwobyksb30oYSxnKTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZlLndhcm5Ub29NYW55Q2xhc3NlcyYmZS53YXJuVG9vTWFueUNsYXNzZXMoRSk7dmFyIE49aWUocCxkKTtyZXR1cm4gRSYmKE4rPVwiIFwiK0UpLGcuY2xhc3NOYW1lJiYoTis9XCIgXCIrZy5jbGFzc05hbWUpLHdbTChTKSYmIUEuaGFzKFMpP1wiY2xhc3NcIjpcImNsYXNzTmFtZVwiXT1OLHMmJih3LnJlZj1zKSx1KFMsdyl9KEQsZSxyKX1PLmRpc3BsYXlOYW1lPXk7dmFyIEQ9by5mb3J3YXJkUmVmKE8pO3JldHVybiBELmF0dHJzPVMsRC5jb21wb25lbnRTdHlsZT1OLEQuZGlzcGxheU5hbWU9eSxELnNob3VsZEZvcndhcmRQcm9wPXcsRC5mb2xkZWRDb21wb25lbnRJZHM9aT9pZShhLmZvbGRlZENvbXBvbmVudElkcyxhLnN0eWxlZENvbXBvbmVudElkKTpcIlwiLEQuc3R5bGVkQ29tcG9uZW50SWQ9ZyxELnRhcmdldD1pP2EudGFyZ2V0OmUsT2JqZWN0LmRlZmluZVByb3BlcnR5KEQsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbGRlZERlZmF1bHRQcm9wc30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2ZvbGRlZERlZmF1bHRQcm9wcz1pP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO2Zvcih2YXIgbz0wLHI9dDtvPHIubGVuZ3RoO28rKylsZShlLHJbb10sITApO3JldHVybiBlfSh7fSxhLmRlZmF1bHRQcm9wcyxlKTplfX0pLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihQKHksZyksRC53YXJuVG9vTWFueUNsYXNzZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fSxvPSExO3JldHVybiBmdW5jdGlvbihyKXtpZighbyYmKG5bcl09ITAsT2JqZWN0LmtleXMobikubGVuZ3RoPj0yMDApKXt2YXIgcz10Pycgd2l0aCB0aGUgaWQgb2YgXCInLmNvbmNhdCh0LCdcIicpOlwiXCI7Y29uc29sZS53YXJuKFwiT3ZlciBcIi5jb25jYXQoMjAwLFwiIGNsYXNzZXMgd2VyZSBnZW5lcmF0ZWQgZm9yIGNvbXBvbmVudCBcIikuY29uY2F0KGUpLmNvbmNhdChzLFwiLlxcblwiKStcIkNvbnNpZGVyIHVzaW5nIHRoZSBhdHRycyBtZXRob2QsIHRvZ2V0aGVyIHdpdGggYSBzdHlsZSBvYmplY3QgZm9yIGZyZXF1ZW50bHkgY2hhbmdlZCBzdHlsZXMuXFxuRXhhbXBsZTpcXG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlZC5kaXYuYXR0cnMocHJvcHMgPT4gKHtcXG4gICAgc3R5bGU6IHtcXG4gICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5iYWNrZ3JvdW5kLFxcbiAgICB9LFxcbiAgfSkpYHdpZHRoOiAxMDAlO2BcXG5cXG4gIDxDb21wb25lbnQgLz5cIiksbz0hMCxuPXt9fX19KHksZykpLHVlKEQsZnVuY3Rpb24oKXtyZXR1cm5cIi5cIi5jb25jYXQoRC5zdHlsZWRDb21wb25lbnRJZCl9KSxjJiZvZShELGUse2F0dHJzOiEwLGNvbXBvbmVudFN0eWxlOiEwLGRpc3BsYXlOYW1lOiEwLGZvbGRlZENvbXBvbmVudElkczohMCxzaG91bGRGb3J3YXJkUHJvcDohMCxzdHlsZWRDb21wb25lbnRJZDohMCx0YXJnZXQ6ITB9KSxEfWZ1bmN0aW9uIGF0KGUsdCl7Zm9yKHZhciBuPVtlWzBdXSxvPTAscj10Lmxlbmd0aDtvPHI7bys9MSluLnB1c2godFtvXSxlW28rMV0pO3JldHVybiBufXZhciBjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtpc0NzczohMH0pfTtmdW5jdGlvbiBsdCh0KXtmb3IodmFyIG49W10sbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTtpZihyZSh0KXx8Y2UodCkpcmV0dXJuIGN0KFhlKGF0KF8sZShbdF0sbiwhMCkpKSk7dmFyIHI9dDtyZXR1cm4gMD09PW4ubGVuZ3RoJiYxPT09ci5sZW5ndGgmJlwic3RyaW5nXCI9PXR5cGVvZiByWzBdP1hlKHIpOmN0KFhlKGF0KHIsbikpKX1mdW5jdGlvbiB1dChuLG8scil7aWYodm9pZCAwPT09ciYmKHI9QyksIW8pdGhyb3cgaGUoMSxvKTt2YXIgcz1mdW5jdGlvbih0KXtmb3IodmFyIHM9W10saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspc1tpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gbihvLHIsbHQuYXBwbHkodm9pZCAwLGUoW3RdLHMsITEpKSl9O3JldHVybiBzLmF0dHJzPWZ1bmN0aW9uKGUpe3JldHVybiB1dChuLG8sdCh0KHt9LHIpLHthdHRyczpBcnJheS5wcm90b3R5cGUuY29uY2F0KHIuYXR0cnMsZSkuZmlsdGVyKEJvb2xlYW4pfSkpfSxzLndpdGhDb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHV0KG4sbyx0KHQoe30sciksZSkpfSxzfXZhciBwdD1mdW5jdGlvbihlKXtyZXR1cm4gdXQoaXQsZSl9LGR0PXB0O0EuZm9yRWFjaChmdW5jdGlvbihlKXtkdFtlXT1wdChlKX0pO3ZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLnJ1bGVzPWUsdGhpcy5jb21wb25lbnRJZD10LHRoaXMuaXNTdGF0aWM9WmUoZSksa2UucmVnaXN0ZXJJZCh0aGlzLmNvbXBvbmVudElkKzEpfXJldHVybiBlLnByb3RvdHlwZS5jcmVhdGVTdHlsZXM9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9byhhZShYZSh0aGlzLnJ1bGVzLHQsbixvKSksXCJcIikscz10aGlzLmNvbXBvbmVudElkK2U7bi5pbnNlcnRSdWxlcyhzLHMscil9LGUucHJvdG90eXBlLnJlbW92ZVN0eWxlcz1mdW5jdGlvbihlLHQpe3QuY2xlYXJSdWxlcyh0aGlzLmNvbXBvbmVudElkK2UpfSxlLnByb3RvdHlwZS5yZW5kZXJTdHlsZXM9ZnVuY3Rpb24oZSx0LG4sbyl7ZT4yJiZrZS5yZWdpc3RlcklkKHRoaXMuY29tcG9uZW50SWQrZSksdGhpcy5yZW1vdmVTdHlsZXMoZSxuKSx0aGlzLmNyZWF0ZVN0eWxlcyhlLHQsbixvKX0sZX0oKTtmdW5jdGlvbiBmdChuKXtmb3IodmFyIHI9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspcltzLTFdPWFyZ3VtZW50c1tzXTt2YXIgaT1sdC5hcHBseSh2b2lkIDAsZShbbl0sciwhMSkpLGE9XCJzYy1nbG9iYWwtXCIuY29uY2F0KCQoSlNPTi5zdHJpbmdpZnkoaSkpKSxjPW5ldyBodChpLGEpO1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlAoYSk7dmFyIGw9ZnVuY3Rpb24oZSl7dmFyIHQ9R2UoKSxuPW8udXNlQ29udGV4dChldCkscj1vLnVzZVJlZih0LnN0eWxlU2hlZXQuYWxsb2NhdGVHU0luc3RhbmNlKGEpKS5jdXJyZW50O3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJm8uQ2hpbGRyZW4uY291bnQoZS5jaGlsZHJlbikmJmNvbnNvbGUud2FybihcIlRoZSBnbG9iYWwgc3R5bGUgY29tcG9uZW50IFwiLmNvbmNhdChhLFwiIHdhcyBnaXZlbiBjaGlsZCBKU1guIGNyZWF0ZUdsb2JhbFN0eWxlIGRvZXMgbm90IHJlbmRlciBjaGlsZHJlbi5cIikpLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmkuc29tZShmdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmLTEhPT1lLmluZGV4T2YoXCJAaW1wb3J0XCIpfSkmJmNvbnNvbGUud2FybihcIlBsZWFzZSBkbyBub3QgdXNlIEBpbXBvcnQgQ1NTIHN5bnRheCBpbiBjcmVhdGVHbG9iYWxTdHlsZSBhdCB0aGlzIHRpbWUsIGFzIHRoZSBDU1NPTSBBUElzIHdlIHVzZSBpbiBwcm9kdWN0aW9uIGRvIG5vdCBoYW5kbGUgaXQgd2VsbC4gSW5zdGVhZCwgd2UgcmVjb21tZW5kIHVzaW5nIGEgbGlicmFyeSBzdWNoIGFzIHJlYWN0LWhlbG1ldCB0byBpbmplY3QgYSB0eXBpY2FsIDxsaW5rPiBtZXRhIHRhZyB0byB0aGUgc3R5bGVzaGVldCwgb3Igc2ltcGx5IGVtYmVkZGluZyBpdCBtYW51YWxseSBpbiB5b3VyIGluZGV4Lmh0bWwgPGhlYWQ+IHNlY3Rpb24gZm9yIGEgc2ltcGxlciBhcHAuXCIpLHQuc3R5bGVTaGVldC5zZXJ2ZXImJnUocixlLHQuc3R5bGVTaGVldCxuLHQuc3R5bGlzKSxvLnVzZUxheW91dEVmZmVjdChmdW5jdGlvbigpe2lmKCF0LnN0eWxlU2hlZXQuc2VydmVyKXJldHVybiB1KHIsZSx0LnN0eWxlU2hlZXQsbix0LnN0eWxpcyksZnVuY3Rpb24oKXtyZXR1cm4gYy5yZW1vdmVTdHlsZXMocix0LnN0eWxlU2hlZXQpfX0sW3IsZSx0LnN0eWxlU2hlZXQsbix0LnN0eWxpc10pLG51bGx9O2Z1bmN0aW9uIHUoZSxuLG8scixzKXtpZihjLmlzU3RhdGljKWMucmVuZGVyU3R5bGVzKGUsYixvLHMpO2Vsc2V7dmFyIGk9dCh0KHt9LG4pLHt0aGVtZTpJKG4scixsLmRlZmF1bHRQcm9wcyl9KTtjLnJlbmRlclN0eWxlcyhlLGksbyxzKX19cmV0dXJuIG8ubWVtbyhsKX1mdW5jdGlvbiBtdCh0KXtmb3IodmFyIG49W10sbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdCYmY29uc29sZS53YXJuKFwiYGtleWZyYW1lc2AgY2Fubm90IGJlIHVzZWQgb24gUmVhY3ROYXRpdmUsIG9ubHkgb24gdGhlIHdlYi4gVG8gZG8gYW5pbWF0aW9uIGluIFJlYWN0TmF0aXZlIHBsZWFzZSB1c2UgQW5pbWF0ZWQuXCIpO3ZhciByPWFlKGx0LmFwcGx5KHZvaWQgMCxlKFt0XSxuLCExKSkpLHM9JChyKTtyZXR1cm4gbmV3IFdlKHMscil9ZnVuY3Rpb24geXQoZSl7dmFyIG49by5mb3J3YXJkUmVmKGZ1bmN0aW9uKG4scil7dmFyIHM9SShuLG8udXNlQ29udGV4dChldCksZS5kZWZhdWx0UHJvcHMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnZvaWQgMD09PXMmJmNvbnNvbGUud2FybignW3dpdGhUaGVtZV0gWW91IGFyZSBub3QgdXNpbmcgYSBUaGVtZVByb3ZpZGVyIG5vciBwYXNzaW5nIGEgdGhlbWUgcHJvcCBvciBhIHRoZW1lIGluIGRlZmF1bHRQcm9wcyBpbiBjb21wb25lbnQgY2xhc3MgXCInLmNvbmNhdChCKGUpLCdcIicpKSxvLmNyZWF0ZUVsZW1lbnQoZSx0KHt9LG4se3RoZW1lOnMscmVmOnJ9KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1cIldpdGhUaGVtZShcIi5jb25jYXQoQihlKSxcIilcIiksb2UobixlKX12YXIgdnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpczt0aGlzLl9lbWl0U2hlZXRDU1M9ZnVuY3Rpb24oKXt2YXIgdD1lLmluc3RhbmNlLnRvU3RyaW5nKCk7aWYoIXQpcmV0dXJuXCJcIjt2YXIgbj1DZSgpLG89YWUoW24mJidub25jZT1cIicuY29uY2F0KG4sJ1wiJyksXCJcIi5jb25jYXQoZiwnPVwidHJ1ZVwiJyksXCJcIi5jb25jYXQoeSwnPVwiJykuY29uY2F0KHYsJ1wiJyldLmZpbHRlcihCb29sZWFuKSxcIiBcIik7cmV0dXJuXCI8c3R5bGUgXCIuY29uY2F0KG8sXCI+XCIpLmNvbmNhdCh0LFwiPC9zdHlsZT5cIil9LHRoaXMuZ2V0U3R5bGVUYWdzPWZ1bmN0aW9uKCl7aWYoZS5zZWFsZWQpdGhyb3cgaGUoMik7cmV0dXJuIGUuX2VtaXRTaGVldENTUygpfSx0aGlzLmdldFN0eWxlRWxlbWVudD1mdW5jdGlvbigpe3ZhciBuO2lmKGUuc2VhbGVkKXRocm93IGhlKDIpO3ZhciByPWUuaW5zdGFuY2UudG9TdHJpbmcoKTtpZighcilyZXR1cm5bXTt2YXIgcz0oKG49e30pW2ZdPVwiXCIsblt5XT12LG4uZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e19faHRtbDpyfSxuKSxpPUNlKCk7cmV0dXJuIGkmJihzLm5vbmNlPWkpLFtvLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLHQoe30scyx7a2V5Olwic2MtMC0wXCJ9KSldfSx0aGlzLnNlYWw9ZnVuY3Rpb24oKXtlLnNlYWxlZD0hMH0sdGhpcy5pbnN0YW5jZT1uZXcga2Uoe2lzU2VydmVyOiEwfSksdGhpcy5zZWFsZWQ9ITF9cmV0dXJuIGUucHJvdG90eXBlLmNvbGxlY3RTdHlsZXM9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWFsZWQpdGhyb3cgaGUoMik7cmV0dXJuIG8uY3JlYXRlRWxlbWVudChZZSx7c2hlZXQ6dGhpcy5pbnN0YW5jZX0sZSl9LGUucHJvdG90eXBlLmludGVybGVhdmVXaXRoTm9kZVN0cmVhbT1mdW5jdGlvbihlKXt0aHJvdyBoZSgzKX0sZX0oKSxndD17U3R5bGVTaGVldDprZSxtYWluU2hlZXQ6TWV9O1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0JiZjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSd2ZSBpbXBvcnRlZCAnc3R5bGVkLWNvbXBvbmVudHMnIG9uIFJlYWN0IE5hdGl2ZS5cXG5QZXJoYXBzIHlvdSdyZSBsb29raW5nIHRvIGltcG9ydCAnc3R5bGVkLWNvbXBvbmVudHMvbmF0aXZlJz9cXG5SZWFkIG1vcmUgYWJvdXQgdGhpcyBhdCBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9iYXNpY3MjcmVhY3QtbmF0aXZlXCIpO3ZhciBTdD1cIl9fc2MtXCIuY29uY2F0KGYsXCJfX1wiKTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInRlc3RcIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93W1N0XXx8KHdpbmRvd1tTdF09MCksMT09PXdpbmRvd1tTdF0mJmNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mICdzdHlsZWQtY29tcG9uZW50cycgaW5pdGlhbGl6ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgY2F1c2UgZHluYW1pYyBzdHlsZXMgdG8gbm90IHJlbmRlciBwcm9wZXJseSwgZXJyb3JzIGR1cmluZyB0aGUgcmVoeWRyYXRpb24gcHJvY2VzcywgYSBtaXNzaW5nIHRoZW1lIHByb3AsIGFuZCBtYWtlcyB5b3VyIGFwcGxpY2F0aW9uIGJpZ2dlciB3aXRob3V0IGdvb2QgcmVhc29uLlxcblxcblNlZSBodHRwczovL3MtYy5zaC8yQkFYemVkIGZvciBtb3JlIGluZm8uXCIpLHdpbmRvd1tTdF0rPTEpO2V4cG9ydHt2dCBhcyBTZXJ2ZXJTdHlsZVNoZWV0LEJlIGFzIFN0eWxlU2hlZXRDb25zdW1lciwkZSBhcyBTdHlsZVNoZWV0Q29udGV4dCxZZSBhcyBTdHlsZVNoZWV0TWFuYWdlcix0dCBhcyBUaGVtZUNvbnN1bWVyLGV0IGFzIFRoZW1lQ29udGV4dCxvdCBhcyBUaGVtZVByb3ZpZGVyLGd0IGFzIF9fUFJJVkFURV9fLGZ0IGFzIGNyZWF0ZUdsb2JhbFN0eWxlLGx0IGFzIGNzcyxkdCBhcyBkZWZhdWx0LHNlIGFzIGlzU3R5bGVkQ29tcG9uZW50LG10IGFzIGtleWZyYW1lcyxkdCBhcyBzdHlsZWQsbnQgYXMgdXNlVGhlbWUsdiBhcyB2ZXJzaW9uLHl0IGFzIHdpdGhUaGVtZX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///13184\n')},13234:(I,g,n)=>{"use strict";I.exports=n.p+"f7942dd6e5bb84f05ccf.png"},13702:(I,g,n)=>{"use strict";I.exports=n.p+"c59a93c9f5b1c08c4299.png"},14149:(I,g,n)=>{"use strict";I.exports=n.p+"a682fb21367ac1342f48.png"},14835:(I,g,n)=>{"use strict";I.exports=n.p+"b5a41b638201292148b4.png"},14912:(__unused_webpack_module,exports)=>{"use strict";eval('var __webpack_unused_export__;\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?\nSymbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119;\nfunction z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}__webpack_unused_export__=l;__webpack_unused_export__=m;__webpack_unused_export__=k;__webpack_unused_export__=h;__webpack_unused_export__=c;__webpack_unused_export__=n;__webpack_unused_export__=e;__webpack_unused_export__=t;__webpack_unused_export__=r;__webpack_unused_export__=d;\n__webpack_unused_export__=g;__webpack_unused_export__=f;__webpack_unused_export__=p;__webpack_unused_export__=function(a){return A(a)||z(a)===l};__webpack_unused_export__=A;__webpack_unused_export__=function(a){return z(a)===k};__webpack_unused_export__=function(a){return z(a)===h};__webpack_unused_export__=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};__webpack_unused_export__=function(a){return z(a)===n};__webpack_unused_export__=function(a){return z(a)===e};__webpack_unused_export__=function(a){return z(a)===t};\n__webpack_unused_export__=function(a){return z(a)===r};__webpack_unused_export__=function(a){return z(a)===d};__webpack_unused_export__=function(a){return z(a)===g};__webpack_unused_export__=function(a){return z(a)===f};__webpack_unused_export__=function(a){return z(a)===p};\n__webpack_unused_export__=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};__webpack_unused_export__=z;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5MTIuanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzP2Y2MjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14912\n')},14976:(I,g,n)=>{"use strict";I.exports=n.p+"31082e49b553b695ac86.png"},15273:(I,g,n)=>{"use strict";I.exports=n.p+"8bfcd49d2c147c1db076.png"},15287:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('/** @license React v17.0.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar l=__webpack_require__(45228),n=60103,p=60106;exports.Fragment=60107;exports.StrictMode=60108;exports.Profiler=60114;var q=60109,r=60110,t=60112;exports.Suspense=60113;var u=60115,v=60116;\nif("function"===typeof Symbol&&Symbol.for){var w=Symbol.for;n=w("react.element");p=w("react.portal");exports.Fragment=w("react.fragment");exports.StrictMode=w("react.strict_mode");exports.Profiler=w("react.profiler");q=w("react.provider");r=w("react.context");t=w("react.forward_ref");exports.Suspense=w("react.suspense");u=w("react.memo");v=w("react.lazy")}var x="function"===typeof Symbol&&Symbol.iterator;\nfunction y(a){if(null===a||"object"!==typeof a)return null;a=x&&a[x]||a["@@iterator"];return"function"===typeof a?a:null}function z(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c{"use strict";I.exports=n.p+"bdc9034ceef498a244ec.png"},15867:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Lao [lo]\n//! author : Ryan Hart : https://github.com/ryanhart2\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var lo = moment.defineLocale('lo', {\n months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n '_'\n ),\n monthsShort:\n 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(\n '_'\n ),\n weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),\n weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'ວັນdddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,\n isPM: function (input) {\n return input === 'ຕອນແລງ';\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ຕອນເຊົ້າ';\n } else {\n return 'ຕອນແລງ';\n }\n },\n calendar: {\n sameDay: '[ມື້ນີ້ເວລາ] LT',\n nextDay: '[ມື້ອື່ນເວລາ] LT',\n nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',\n lastDay: '[ມື້ວານນີ້ເວລາ] LT',\n lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'ອີກ %s',\n past: '%sຜ່ານມາ',\n s: 'ບໍ່ເທົ່າໃດວິນາທີ',\n ss: '%d ວິນາທີ',\n m: '1 ນາທີ',\n mm: '%d ນາທີ',\n h: '1 ຊົ່ວໂມງ',\n hh: '%d ຊົ່ວໂມງ',\n d: '1 ມື້',\n dd: '%d ມື້',\n M: '1 ເດືອນ',\n MM: '%d ເດືອນ',\n y: '1 ປີ',\n yy: '%d ປີ',\n },\n dayOfMonthOrdinalParse: /(ທີ່)\\d{1,2}/,\n ordinal: function (number) {\n return 'ທີ່' + number;\n },\n });\n\n return lo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4NjcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qcz9iMjlkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMYW8gW2xvXVxuLy8hIGF1dGhvciA6IFJ5YW4gSGFydCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yeWFuaGFydDJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBsbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xvJywge1xuICAgICAgICBtb250aHM6ICfguqHgurHguofguoHguq3guplf4LqB4Lq44Lqh4Lqe4LqyX+C6oeC6teC6meC6sl/gu4DguqHguqrgurJf4Lqe4Lq24LqU4Lqq4Lqw4Lqe4LqyX+C6oeC6tOC6luC6uOC6meC6sl/guoHgu43guqXgurDguoHgurvgupRf4Lqq4Lq04LqH4Lqr4LqyX+C6geC6seC6meC6jeC6sl/gupXgurjguqXgurJf4Lqe4Lqw4LqI4Lq04LqBX+C6l+C6seC6meC6p+C6sicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfguq3gurLgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LqXX+C6iF/guq3guoRf4LqeX+C6nuC6q1/guqrguoFf4LqqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ+C6p+C6seC6mWRkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LqV4Lqt4LqZ4LuA4LqK4Lq74LuJ4LqyfOC6leC6reC6meC7geC6peC6hy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7gOC6iuC6u+C7ieC6sic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Lqh4Lq34LuJ4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C6oeC6t+C7ieC6reC6t+C7iOC6meC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4Luc4LuJ4Lqy4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C6oeC6t+C7ieC6p+C6suC6meC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4LuB4Lql4LuJ4Lqn4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+C6reC6teC6gSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXPgupzgu4jgurLgupnguqHgurInLFxuICAgICAgICAgICAgczogJ+C6muC7jeC7iOC7gOC6l+C6u+C7iOC6suC7g+C6lOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBzczogJyVkIOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBtOiAnMSDgupngurLgupfgurUnLFxuICAgICAgICAgICAgbW06ICclZCDgupngurLgupfgurUnLFxuICAgICAgICAgICAgaDogJzEg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGQ6ICcxIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBkZDogJyVkIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBNOiAnMSDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgTU06ICclZCDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgeTogJzEg4Lqb4Lq1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lqb4Lq1JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogLyjgupfgurXgu4gpXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ+C6l+C6teC7iCcgKyBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG87XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///15867\n")},16319:(I,g,n)=>{"use strict";I.exports=n.p+"a830ad8cfc751df80fdb.png"},16618:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Ukrainian [uk]\n//! author : zemlanin : https://github.com/zemlanin\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function plural(word, num) {\n var forms = word.split('_');\n return num % 10 === 1 && num % 100 !== 11\n ? forms[0]\n : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n ? forms[1]\n : forms[2];\n }\n function relativeTimeWithPlural(number, withoutSuffix, key) {\n var format = {\n ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',\n mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',\n hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',\n dd: 'день_дні_днів',\n MM: 'місяць_місяці_місяців',\n yy: 'рік_роки_років',\n };\n if (key === 'm') {\n return withoutSuffix ? 'хвилина' : 'хвилину';\n } else if (key === 'h') {\n return withoutSuffix ? 'година' : 'годину';\n } else {\n return number + ' ' + plural(format[key], +number);\n }\n }\n function weekdaysCaseReplace(m, format) {\n var weekdays = {\n nominative:\n 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(\n '_'\n ),\n accusative:\n 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(\n '_'\n ),\n genitive:\n 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(\n '_'\n ),\n },\n nounCase;\n\n if (m === true) {\n return weekdays['nominative']\n .slice(1, 7)\n .concat(weekdays['nominative'].slice(0, 1));\n }\n if (!m) {\n return weekdays['nominative'];\n }\n\n nounCase = /(\\[[ВвУу]\\]) ?dddd/.test(format)\n ? 'accusative'\n : /\\[?(?:минулої|наступної)? ?\\] ?dddd/.test(format)\n ? 'genitive'\n : 'nominative';\n return weekdays[nounCase][m.day()];\n }\n function processHoursFunction(str) {\n return function () {\n return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';\n };\n }\n\n var uk = moment.defineLocale('uk', {\n months: {\n format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(\n '_'\n ),\n standalone:\n 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(\n '_'\n ),\n },\n monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(\n '_'\n ),\n weekdays: weekdaysCaseReplace,\n weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY р.',\n LLL: 'D MMMM YYYY р., HH:mm',\n LLLL: 'dddd, D MMMM YYYY р., HH:mm',\n },\n calendar: {\n sameDay: processHoursFunction('[Сьогодні '),\n nextDay: processHoursFunction('[Завтра '),\n lastDay: processHoursFunction('[Вчора '),\n nextWeek: processHoursFunction('[У] dddd ['),\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n case 3:\n case 5:\n case 6:\n return processHoursFunction('[Минулої] dddd [').call(this);\n case 1:\n case 2:\n case 4:\n return processHoursFunction('[Минулого] dddd [').call(this);\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'за %s',\n past: '%s тому',\n s: 'декілька секунд',\n ss: relativeTimeWithPlural,\n m: relativeTimeWithPlural,\n mm: relativeTimeWithPlural,\n h: 'годину',\n hh: relativeTimeWithPlural,\n d: 'день',\n dd: relativeTimeWithPlural,\n M: 'місяць',\n MM: relativeTimeWithPlural,\n y: 'рік',\n yy: relativeTimeWithPlural,\n },\n // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason\n meridiemParse: /ночі|ранку|дня|вечора/,\n isPM: function (input) {\n return /^(дня|вечора)$/.test(input);\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'ночі';\n } else if (hour < 12) {\n return 'ранку';\n } else if (hour < 17) {\n return 'дня';\n } else {\n return 'вечора';\n }\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-(й|го)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'M':\n case 'd':\n case 'DDD':\n case 'w':\n case 'W':\n return number + '-й';\n case 'D':\n return number + '-го';\n default:\n return number;\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return uk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2MTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWsuanM/YWRhMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVWtyYWluaWFuIFt1a11cbi8vISBhdXRob3IgOiB6ZW1sYW5pbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS96ZW1sYW5pblxuLy8hIEF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTQuF/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LBf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyA6ICfRhdCy0LjQu9C40L3Rg1/RhdCy0LjQu9C40L3QuF/RhdCy0LjQu9C40L0nLFxuICAgICAgICAgICAgaGg6IHdpdGhvdXRTdWZmaXggPyAn0LPQvtC00LjQvdCwX9Cz0L7QtNC40L3QuF/Qs9C+0LTQuNC9JyA6ICfQs9C+0LTQuNC90YNf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nLFxuICAgICAgICAgICAgZGQ6ICfQtNC10L3RjF/QtNC90ZZf0LTQvdGW0LInLFxuICAgICAgICAgICAgTU06ICfQvNGW0YHRj9GG0Yxf0LzRltGB0Y/RhtGWX9C80ZbRgdGP0YbRltCyJyxcbiAgICAgICAgICAgIHl5OiAn0YDRltC6X9GA0L7QutC4X9GA0L7QutGW0LInLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0LLQuNC70LjQvdCwJyA6ICfRhdCy0LjQu9C40L3Rgyc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9Cz0L7QtNC40L3QsCcgOiAn0LPQvtC00LjQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzQ2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHtcbiAgICAgICAgICAgICAgICBub21pbmF0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GPX9C/0L7QvdC10LTRltC70L7Qul/QstGW0LLRgtC+0YDQvtC6X9GB0LXRgNC10LTQsF/Rh9C10YLQstC10YBf0L/igJnRj9GC0L3QuNGG0Y9f0YHRg9Cx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGFjY3VzYXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70Y5f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNGDX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRjl/RgdGD0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZ2VuaXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70ZZf0L/QvtC90LXQtNGW0LvQutCwX9Cy0ZbQstGC0L7RgNC60LBf0YHQtdGA0LXQtNC4X9GH0LXRgtCy0LXRgNCz0LBf0L/igJnRj9GC0L3QuNGG0ZZf0YHRg9Cx0L7RgtC4Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vdW5DYXNlO1xuXG4gICAgICAgIGlmIChtID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXVxuICAgICAgICAgICAgICAgIC5zbGljZSgxLCA3KVxuICAgICAgICAgICAgICAgIC5jb25jYXQod2Vla2RheXNbJ25vbWluYXRpdmUnXS5zbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdW5DYXNlID0gLyhcXFtb0JLQstCj0YNdXFxdKSA/ZGRkZC8udGVzdChmb3JtYXQpXG4gICAgICAgICAgICA/ICdhY2N1c2F0aXZlJ1xuICAgICAgICAgICAgOiAvXFxbPyg/OtC80LjQvdGD0LvQvtGXfNC90LDRgdGC0YPQv9C90L7Rlyk/ID9cXF0gP2RkZGQvLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICA/ICdnZW5pdGl2ZSdcbiAgICAgICAgICAgICAgOiAnbm9taW5hdGl2ZSc7XG4gICAgICAgIHJldHVybiB3ZWVrZGF5c1tub3VuQ2FzZV1bbS5kYXkoKV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKHN0cikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ciArICfQvicgKyAodGhpcy5ob3VycygpID09PSAxMSA/ICfQsScgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHVrID0gbW9tZW50LmRlZmluZUxvY2FsZSgndWsnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRltGH0L3Rj1/Qu9GO0YLQvtCz0L5f0LHQtdGA0LXQt9C90Y9f0LrQstGW0YLQvdGPX9GC0YDQsNCy0L3Rj1/Rh9C10YDQstC90Y9f0LvQuNC/0L3Rj1/RgdC10YDQv9C90Y9f0LLQtdGA0LXRgdC90Y9f0LbQvtCy0YLQvdGPX9C70LjRgdGC0L7Qv9Cw0LTQsF/Qs9GA0YPQtNC90Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GB0ZbRh9C10L3RjF/Qu9GO0YLQuNC5X9Cx0LXRgNC10LfQtdC90Yxf0LrQstGW0YLQtdC90Yxf0YLRgNCw0LLQtdC90Yxf0YfQtdGA0LLQtdC90Yxf0LvQuNC/0LXQvdGMX9GB0LXRgNC/0LXQvdGMX9Cy0LXRgNC10YHQtdC90Yxf0LbQvtCy0YLQtdC90Yxf0LvQuNGB0YLQvtC/0LDQtF/Qs9GA0YPQtNC10L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0YHRltGHX9C70Y7Rgl/QsdC10YBf0LrQstGW0YJf0YLRgNCw0LJf0YfQtdGA0LJf0LvQuNC/X9GB0LXRgNC/X9Cy0LXRgF/QttC+0LLRgl/Qu9C40YHRgl/Qs9GA0YPQtCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzQ2FzZVJlcGxhY2UsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0YAuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQodGM0L7Qs9C+0LTQvdGWICcpLFxuICAgICAgICAgICAgbmV4dERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQl9Cw0LLRgtGA0LAgJyksXG4gICAgICAgICAgICBsYXN0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CS0YfQvtGA0LAgJyksXG4gICAgICAgICAgICBuZXh0V2VlazogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQo10gZGRkZCBbJyksXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Rl10gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Cc0LjQvdGD0LvQvtCz0L5dIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQvtC80YMnLFxuICAgICAgICAgICAgczogJ9C00LXQutGW0LvRjNC60LAg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ9Cz0L7QtNC40L3RgycsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNGW0YHRj9GG0YwnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0YDRltC6JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICAvLyBNLiBFLjogdGhvc2UgdHdvIGFyZSB2aXJ0dWFsbHkgdW51c2VkIGJ1dCBhIHVzZXIgbWlnaHQgd2FudCB0byBpbXBsZW1lbnQgdGhlbSBmb3IgaGlzL2hlciB3ZWJzaXRlIGZvciBzb21lIHJlYXNvblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0ZZ80YDQsNC90LrRg3zQtNC90Y980LLQtdGH0L7RgNCwLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9C+0YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0ZYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA0LDQvdC60YMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0L7RgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0L4nO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1aztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16618\n")},16643:(I,g,n)=>{"use strict";I.exports=n.p+"534964126bfa76edf7db.png"},16702:(I,g,n)=>{"use strict";I.exports=n.p+"d7b1357b207187f85d32.png"},16708:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\nmodule.exports = Writable;\n\n/* */\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n var _this = this;\n this.next = null;\n this.entry = null;\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* */\n\n/**/\nvar Duplex;\n/**/\n\nWritable.WritableState = WritableState;\n\n/**/\nvar internalUtil = {\n deprecate: __webpack_require__(94643)\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(40345);\n/**/\n\nvar Buffer = (__webpack_require__(27650).Buffer);\nvar OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\nvar destroyImpl = __webpack_require__(75896);\nvar _require = __webpack_require__(65291),\n getHighWaterMark = _require.getHighWaterMark;\nvar _require$codes = (__webpack_require__(86048)/* .codes */ .F),\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,\n ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,\n ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,\n ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\n__webpack_require__(56698)(Writable, Stream);\nfunction nop() {}\nfunction WritableState(options, stream, isDuplex) {\n Duplex = Duplex || __webpack_require__(25382);\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream,\n // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;\n\n // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);\n\n // if _final has been called\n this.finalCalled = false;\n\n // drain event flag.\n this.needDrain = false;\n // at the start of calling end()\n this.ending = false;\n // when end() has been called, and returned\n this.ended = false;\n // when 'finish' is emitted\n this.finished = false;\n\n // has it been destroyed\n this.destroyed = false;\n\n // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n this.length = 0;\n\n // a flag to see when we're in the middle of a write.\n this.writing = false;\n\n // when true all writes will be buffered until .uncork() call\n this.corked = 0;\n\n // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n this.sync = true;\n\n // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n this.bufferProcessing = false;\n\n // the callback that's passed to _write(chunk,cb)\n this.onwrite = function (er) {\n onwrite(stream, er);\n };\n\n // the callback that the user supplies to write(chunk,encoding,cb)\n this.writecb = null;\n\n // the amount that is being written when _write is called.\n this.writelen = 0;\n this.bufferedRequest = null;\n this.lastBufferedRequest = null;\n\n // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n this.pendingcb = 0;\n\n // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n this.prefinished = false;\n\n // True if the error was already emitted and should not be thrown again\n this.errorEmitted = false;\n\n // Should close be emitted on destroy. Defaults to true.\n this.emitClose = options.emitClose !== false;\n\n // Should .destroy() be called after 'finish' (and potentially 'end')\n this.autoDestroy = !!options.autoDestroy;\n\n // count buffered requests\n this.bufferedRequestCount = 0;\n\n // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n this.corkedRequestsFree = new CorkedRequest(this);\n}\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n while (current) {\n out.push(current);\n current = current.next;\n }\n return out;\n};\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function writableStateBufferGetter() {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function value(object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function realHasInstance(object) {\n return object instanceof this;\n };\n}\nfunction Writable(options) {\n Duplex = Duplex || __webpack_require__(25382);\n\n // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the WritableState constructor, at least with V8 6.5\n var isDuplex = this instanceof Duplex;\n if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);\n this._writableState = new WritableState(options, this, isDuplex);\n\n // legacy.\n this.writable = true;\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n if (typeof options.writev === 'function') this._writev = options.writev;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n if (typeof options.final === 'function') this._final = options.final;\n }\n Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());\n};\nfunction writeAfterEnd(stream, cb) {\n var er = new ERR_STREAM_WRITE_AFTER_END();\n // TODO: defer error events consistently everywhere, not just the cb\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n var er;\n if (chunk === null) {\n er = new ERR_STREAM_NULL_VALUES();\n } else if (typeof chunk !== 'string' && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);\n }\n if (er) {\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n return false;\n }\n return true;\n}\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n if (typeof cb !== 'function') cb = nop;\n if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n return ret;\n};\nWritable.prototype.cork = function () {\n this._writableState.corked++;\n};\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n if (state.corked) {\n state.corked--;\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\nObject.defineProperty(Writable.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n return chunk;\n}\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n var len = state.objectMode ? 1 : chunk.length;\n state.length += len;\n var ret = state.length < state.highWaterMark;\n // we must ensure that previous needDrain will not be reset to false.\n if (!ret) state.needDrain = true;\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n return ret;\n}\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n process.nextTick(cb, er);\n // this can emit finish, and it will always happen\n // after error\n process.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er);\n // this can emit finish, but finish must\n // always follow error\n finishMaybe(stream, state);\n }\n}\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();\n onwriteStateUpdate(state);\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state) || stream.destroyed;\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n if (sync) {\n process.nextTick(afterWrite, stream, state, finished, cb);\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n var count = 0;\n var allBuffers = true;\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n buffer.allBuffers = allBuffers;\n doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n state.pendingcb++;\n state.lastBufferedRequest = null;\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--;\n // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n if (state.writing) {\n break;\n }\n }\n if (entry === null) state.lastBufferedRequest = null;\n }\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));\n};\nWritable.prototype._writev = null;\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n // .end() fully uncorks\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n }\n\n // ignore unnecessary end() calls.\n if (!state.ending) endWritable(this, state, cb);\n return this;\n};\nObject.defineProperty(Writable.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n});\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n if (err) {\n errorOrDestroy(stream, err);\n }\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function' && !state.destroyed) {\n state.pendingcb++;\n state.finalCalled = true;\n process.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n if (need) {\n prefinish(stream, state);\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the readable side is ready for autoDestroy as well\n var rState = stream._readableState;\n if (!rState || rState.autoDestroy && rState.endEmitted) {\n stream.destroy();\n }\n }\n }\n }\n return need;\n}\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n if (cb) {\n if (state.finished) process.nextTick(cb);else stream.once('finish', cb);\n }\n state.ended = true;\n stream.writable = false;\n}\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n }\n\n // reuse the free corkReq.\n state.corkedRequestsFree.next = corkReq;\n}\nObject.defineProperty(Writable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._writableState === undefined) {\n return false;\n }\n return this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._writableState.destroyed = value;\n }\n});\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n cb(err);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3MDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcz9kYzE0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG52YXIgT3VyVWludDhBcnJheSA9ICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9KS5VaW50OEFycmF5IHx8IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuaykge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xufVxuZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXk7XG59XG52YXIgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveScpO1xudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlJyksXG4gIGdldEhpZ2hXYXRlck1hcmsgPSBfcmVxdWlyZS5nZXRIaWdoV2F0ZXJNYXJrO1xudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFID0gX3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gX3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsXG4gIEVSUl9TVFJFQU1fREVTVFJPWUVEID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX05VTExfVkFMVUVTLFxuICBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELFxuICBFUlJfVU5LTk9XTl9FTkNPRElORyA9IF9yZXF1aXJlJGNvZGVzLkVSUl9VTktOT1dOX0VOQ09ESU5HO1xudmFyIGVycm9yT3JEZXN0cm95ID0gZGVzdHJveUltcGwuZXJyb3JPckRlc3Ryb3k7XG5yZXF1aXJlKCdpbmhlcml0cycpKFdyaXRhYmxlLCBTdHJlYW0pO1xuZnVuY3Rpb24gbm9wKCkge31cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbSxcbiAgLy8gZS5nLiBvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZSB2cy4gb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUsIGV0Yy5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAnd3JpdGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICB0aGlzLmVtaXRDbG9zZSA9IG9wdGlvbnMuZW1pdENsb3NlICE9PSBmYWxzZTtcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2ZpbmlzaCcgKGFuZCBwb3RlbnRpYWxseSAnZW5kJylcbiAgdGhpcy5hdXRvRGVzdHJveSA9ICEhb3B0aW9ucy5hdXRvRGVzdHJveTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiB3cml0YWJsZVN0YXRlQnVmZmVyR2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gcmVhbEhhc0luc3RhbmNlKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuXG4gIC8vIENoZWNraW5nIGZvciBhIFN0cmVhbS5EdXBsZXggaW5zdGFuY2UgaXMgZmFzdGVyIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGVcbiAgLy8gdGhlIFdyaXRhYmxlU3RhdGUgY29uc3RydWN0b3IsIGF0IGxlYXN0IHdpdGggVjggNi41XG4gIHZhciBpc0R1cGxleCA9IHRoaXMgaW5zdGFuY2VvZiBEdXBsZXg7XG4gIGlmICghaXNEdXBsZXggJiYgIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maW5hbCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmluYWwgPSBvcHRpb25zLmZpbmFsO1xuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUoKSk7XG59O1xuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCgpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgZXI7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJ10sIGNodW5rKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcbiAgaWYgKGlzQnVmICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuICBpZiAoc3RhdGUuZW5kaW5nKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKys7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IEVSUl9VTktOT1dOX0VOQ09ESU5HKGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpO1xuICB9XG59KTtcbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICghaXNCdWYpIHtcbiAgICB2YXIgbmV3Q2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAoc3RhdGUuZGVzdHJveWVkKSBzdGF0ZS5vbndyaXRlKG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKSk7ZWxzZSBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKTtcbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpIHx8IHN0cmVhbS5kZXN0cm95ZWQ7XG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3dyaXRlKCknKSk7XG59O1xuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZykgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nICYmICFzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICAgIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAgIC8vIGlmIHRoZSByZWFkYWJsZSBzaWRlIGlzIHJlYWR5IGZvciBhdXRvRGVzdHJveSBhcyB3ZWxsXG4gICAgICAgIHZhciByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gICAgICAgIGlmICghclN0YXRlIHx8IHJTdGF0ZS5hdXRvRGVzdHJveSAmJiByU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICAgIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBwcm9jZXNzLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG5cbiAgLy8gcmV1c2UgdGhlIGZyZWUgY29ya1JlcS5cbiAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBjb3JrUmVxO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///16708\n")},17160:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Armenian [hy-am]\n//! author : Armendarabyan : https://github.com/armendarabyan\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var hyAm = moment.defineLocale('hy-am', {\n months: {\n format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(\n '_'\n ),\n standalone:\n 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(\n '_'\n ),\n },\n monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),\n weekdays:\n 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(\n '_'\n ),\n weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY թ.',\n LLL: 'D MMMM YYYY թ., HH:mm',\n LLLL: 'dddd, D MMMM YYYY թ., HH:mm',\n },\n calendar: {\n sameDay: '[այսօր] LT',\n nextDay: '[վաղը] LT',\n lastDay: '[երեկ] LT',\n nextWeek: function () {\n return 'dddd [օրը ժամը] LT';\n },\n lastWeek: function () {\n return '[անցած] dddd [օրը ժամը] LT';\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s հետո',\n past: '%s առաջ',\n s: 'մի քանի վայրկյան',\n ss: '%d վայրկյան',\n m: 'րոպե',\n mm: '%d րոպե',\n h: 'ժամ',\n hh: '%d ժամ',\n d: 'օր',\n dd: '%d օր',\n M: 'ամիս',\n MM: '%d ամիս',\n y: 'տարի',\n yy: '%d տարի',\n },\n meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,\n isPM: function (input) {\n return /^(ցերեկվա|երեկոյան)$/.test(input);\n },\n meridiem: function (hour) {\n if (hour < 4) {\n return 'գիշերվա';\n } else if (hour < 12) {\n return 'առավոտվա';\n } else if (hour < 17) {\n return 'ցերեկվա';\n } else {\n return 'երեկոյան';\n }\n },\n dayOfMonthOrdinalParse: /\\d{1,2}|\\d{1,2}-(ին|րդ)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'DDD':\n case 'w':\n case 'W':\n case 'DDDo':\n if (number === 1) {\n return number + '-ին';\n }\n return number + '-րդ';\n default:\n return number;\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return hyAm;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxNjAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzP2Q2YjYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFybWVuaWFuIFtoeS1hbV1cbi8vISBhdXRob3IgOiBBcm1lbmRhcmFieWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2FybWVuZGFyYWJ5YW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBoeUFtID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHktYW0nLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn1bDVuNaC1bbVvtWh1oDVq1/Wg9Wl1b/WgNW+1aHWgNWrX9W01aHWgNW/1atf1aHVutaA1avVrNWrX9W01aHVtdWr1b3Vq1/VsNW41oLVttWr1b3Vq1/VsNW41oLVrNWr1b3Vq1/WhdWj1bjVvdW/1bjVvdWrX9W91aXVutW/1aXVtNWi1aXWgNWrX9Ww1bjVr9W/1aXVtNWi1aXWgNWrX9W21bjVtdWl1bTVotWl1oDVq1/VpNWl1a/Vv9Wl1bTVotWl1oDVqycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn1bDVuNaC1bbVvtWh1oBf1oPVpdW/1oDVvtWh1oBf1bTVodaA1b9f1aHVutaA1avVrF/VtNWh1bXVq9W9X9Ww1bjWgtW21avVvV/VsNW41oLVrNWr1b1f1oXVo9W41b3Vv9W41b1f1b3VpdW61b/VpdW01aLVpdaAX9Ww1bjVr9W/1aXVtNWi1aXWgF/VttW41bXVpdW01aLVpdaAX9Wk1aXVr9W/1aXVtNWi1aXWgCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn1bDVttW+X9aD1b/WgF/VtNaA1b9f1aHVutaAX9W01bXVvV/VsNW21b1f1bDVrNW9X9aF1aPVvV/VvdW61b9f1bDVr9W/X9W21bTVol/VpNWv1b8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9Wv1avWgNWh1a/Vq1/VpdaA1a/VuNaC1bfVodWi1anVq1/VpdaA1aXWhNW31aHVotWp1atf1bnVuNaA1aXWhNW31aHVotWp1atf1bDVq9W21aPVt9Wh1aLVqdWrX9W41oLWgNWi1aHVqV/Vt9Wh1aLVodWpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDVqS4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg1akuLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkg1akuLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Wh1bXVvdaF1oBdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb1b7VodWy1ahdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb1aXWgNWl1a9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW9Wh1bbWgdWh1a5dIGRkZGQgW9aF1oDVqCDVqtWh1bTVqF0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg1bDVpdW/1bgnLFxuICAgICAgICAgICAgcGFzdDogJyVzINWh1bzVodW7JyxcbiAgICAgICAgICAgIHM6ICfVtNWrINaE1aHVttWrINW+1aHVtdaA1a/VtdWh1bYnLFxuICAgICAgICAgICAgc3M6ICclZCDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIG06ICfWgNW41brVpScsXG4gICAgICAgICAgICBtbTogJyVkINaA1bjVutWlJyxcbiAgICAgICAgICAgIGg6ICfVqtWh1bQnLFxuICAgICAgICAgICAgaGg6ICclZCDVqtWh1bQnLFxuICAgICAgICAgICAgZDogJ9aF1oAnLFxuICAgICAgICAgICAgZGQ6ICclZCDWhdaAJyxcbiAgICAgICAgICAgIE06ICfVodW01avVvScsXG4gICAgICAgICAgICBNTTogJyVkINWh1bTVq9W9JyxcbiAgICAgICAgICAgIHk6ICfVv9Wh1oDVqycsXG4gICAgICAgICAgICB5eTogJyVkINW/1aHWgNWrJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9Wj1avVt9Wl1oDVvtWhfNWh1bzVodW+1bjVv9W+1aF81oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVti8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNaB1aXWgNWl1a/VvtWhfNWl1oDVpdWv1bjVtdWh1bYpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVo9Wr1bfVpdaA1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aHVvNWh1b7VuNW/1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1oHVpdaA1aXVr9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wl1oDVpdWv1bjVtdWh1bYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn18XFxkezEsMn0tKNWr1bZ81oDVpCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERERvJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1avVtic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1oDVpCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh5QW07XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17160\n")},17357:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Bengali (Bangladesh) [bn-bd]\n//! author : Asraf Hossain Patoary : https://github.com/ashwoolford\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '১',\n 2: '২',\n 3: '৩',\n 4: '৪',\n 5: '৫',\n 6: '৬',\n 7: '৭',\n 8: '৮',\n 9: '৯',\n 0: '০',\n },\n numberMap = {\n '১': '1',\n '২': '2',\n '৩': '3',\n '৪': '4',\n '৫': '5',\n '৬': '6',\n '৭': '7',\n '৮': '8',\n '৯': '9',\n '০': '0',\n };\n\n var bnBd = moment.defineLocale('bn-bd', {\n months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n '_'\n ),\n monthsShort:\n 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n '_'\n ),\n weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n '_'\n ),\n weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n longDateFormat: {\n LT: 'A h:mm সময়',\n LTS: 'A h:mm:ss সময়',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm সময়',\n LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n },\n calendar: {\n sameDay: '[আজ] LT',\n nextDay: '[আগামীকাল] LT',\n nextWeek: 'dddd, LT',\n lastDay: '[গতকাল] LT',\n lastWeek: '[গত] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s পরে',\n past: '%s আগে',\n s: 'কয়েক সেকেন্ড',\n ss: '%d সেকেন্ড',\n m: 'এক মিনিট',\n mm: '%d মিনিট',\n h: 'এক ঘন্টা',\n hh: '%d ঘন্টা',\n d: 'এক দিন',\n dd: '%d দিন',\n M: 'এক মাস',\n MM: '%d মাস',\n y: 'এক বছর',\n yy: '%d বছর',\n },\n preparse: function (string) {\n return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n\n meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'রাত') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'ভোর') {\n return hour;\n } else if (meridiem === 'সকাল') {\n return hour;\n } else if (meridiem === 'দুপুর') {\n return hour >= 3 ? hour : hour + 12;\n } else if (meridiem === 'বিকাল') {\n return hour + 12;\n } else if (meridiem === 'সন্ধ্যা') {\n return hour + 12;\n }\n },\n\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'রাত';\n } else if (hour < 6) {\n return 'ভোর';\n } else if (hour < 12) {\n return 'সকাল';\n } else if (hour < 15) {\n return 'দুপুর';\n } else if (hour < 18) {\n return 'বিকাল';\n } else if (hour < 20) {\n return 'সন্ধ্যা';\n } else {\n return 'রাত';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return bnBd;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczNTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qcz85Njg2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCZW5nYWxpIChCYW5nbGFkZXNoKSBbYm4tYmRdXG4vLyEgYXV0aG9yIDogQXNyYWYgSG9zc2FpbiBQYXRvYXJ5IDogaHR0cHM6Ly9naXRodWIuY29tL2FzaHdvb2xmb3JkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CnpycsXG4gICAgICAgICAgICAyOiAn4KeoJyxcbiAgICAgICAgICAgIDM6ICfgp6knLFxuICAgICAgICAgICAgNDogJ+CnqicsXG4gICAgICAgICAgICA1OiAn4KerJyxcbiAgICAgICAgICAgIDY6ICfgp6wnLFxuICAgICAgICAgICAgNzogJ+CnrScsXG4gICAgICAgICAgICA4OiAn4KeuJyxcbiAgICAgICAgICAgIDk6ICfgp68nLFxuICAgICAgICAgICAgMDogJ+CnpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgp6cnOiAnMScsXG4gICAgICAgICAgICAn4KeoJzogJzInLFxuICAgICAgICAgICAgJ+CnqSc6ICczJyxcbiAgICAgICAgICAgICfgp6onOiAnNCcsXG4gICAgICAgICAgICAn4KerJzogJzUnLFxuICAgICAgICAgICAgJ+CnrCc6ICc2JyxcbiAgICAgICAgICAgICfgp60nOiAnNycsXG4gICAgICAgICAgICAn4KeuJzogJzgnLFxuICAgICAgICAgICAgJ+Cnryc6ICc5JyxcbiAgICAgICAgICAgICfgp6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm5CZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JuLWJkJywge1xuICAgICAgICBtb250aHM6ICfgppzgpr7gpqjgp4Hgp5/gpr7gprDgpr9f4Kar4KeH4Kas4KeN4Kaw4KeB4Kef4Ka+4Kaw4Ka/X+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsF/gpoXgppXgp43gpp/gp4vgpqzgprBf4Kao4Kat4KeH4Kau4KeN4Kas4KawX+CmoeCmv+CmuOCnh+CmruCnjeCmrOCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kac4Ka+4Kao4KeBX+Cmq+Cnh+CmrOCnjeCmsOCngV/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp9f4KaF4KaV4KeN4Kaf4KeLX+CmqOCmreCnh1/gpqHgpr/gprjgp4cnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfgprDgpqzgpr/gpqzgpr7gprBf4Ka44KeL4Kau4Kas4Ka+4KawX+CmruCmmeCnjeCml+CmsuCmrOCmvuCmsF/gpqzgp4Hgpqfgpqzgpr7gprBf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/4Kas4Ka+4KawX+CmtuCngeCmleCnjeCmsOCmrOCmvuCmsF/gprbgpqjgpr/gpqzgpr7gprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmuV/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgprjgpq7gp58nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpobgppxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KaG4KaX4Ka+4Kau4KeA4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KaX4Kak4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgppfgpqRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Kaq4Kaw4KeHJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpobgppfgp4cnLFxuICAgICAgICAgICAgczogJ+CmleCnn+Cnh+CmlSDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgc3M6ICclZCDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgbTogJ+Cmj+CmlSDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgbW06ICclZCDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgaDogJ+Cmj+CmlSDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgaGg6ICclZCDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgZDogJ+Cmj+CmlSDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgTTogJ+Cmj+CmlSDgpq7gpr7gprgnLFxuICAgICAgICAgICAgTU06ICclZCDgpq7gpr7gprgnLFxuICAgICAgICAgICAgeTogJ+Cmj+CmlSDgpqzgppvgprAnLFxuICAgICAgICAgICAgeXk6ICclZCDgpqzgppvgprAnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Ken4Keo4Kep4Keq4Ker4Kes4Ket4Keu4Kev4KemXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gprDgpr7gpqR84Kat4KeL4KawfOCmuOCmleCmvuCmsnzgpqbgp4Hgpqrgp4HgprB84Kas4Ka/4KaV4Ka+4KayfOCmuOCmqOCnjeCmp+CnjeCmr+CmvnzgprDgpr7gpqQvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgprDgpr7gpqQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpq3gp4vgprAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ka44KaV4Ka+4KayJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAzID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpqzgpr/gppXgpr7gprInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgprjgpqjgp43gpqfgp43gpq/gpr4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kat4KeL4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgpqjgp43gpqfgp43gpq/gpr4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibkJkO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///17357\n")},17513:(I,g,n)=>{"use strict";I.exports=n.p+"e6a178d3155b9c7d2929.png"},17538:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Sinhalese [si]\n//! author : Sampath Sitinamaluwa : https://github.com/sampathsris\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n /*jshint -W100*/\n var si = moment.defineLocale('si', {\n months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(\n '_'\n ),\n monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(\n '_'\n ),\n weekdays:\n 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(\n '_'\n ),\n weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),\n weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'a h:mm',\n LTS: 'a h:mm:ss',\n L: 'YYYY/MM/DD',\n LL: 'YYYY MMMM D',\n LLL: 'YYYY MMMM D, a h:mm',\n LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',\n },\n calendar: {\n sameDay: '[අද] LT[ට]',\n nextDay: '[හෙට] LT[ට]',\n nextWeek: 'dddd LT[ට]',\n lastDay: '[ඊයේ] LT[ට]',\n lastWeek: '[පසුගිය] dddd LT[ට]',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%sකින්',\n past: '%sකට පෙර',\n s: 'තත්පර කිහිපය',\n ss: 'තත්පර %d',\n m: 'මිනිත්තුව',\n mm: 'මිනිත්තු %d',\n h: 'පැය',\n hh: 'පැය %d',\n d: 'දිනය',\n dd: 'දින %d',\n M: 'මාසය',\n MM: 'මාස %d',\n y: 'වසර',\n yy: 'වසර %d',\n },\n dayOfMonthOrdinalParse: /\\d{1,2} වැනි/,\n ordinal: function (number) {\n return number + ' වැනි';\n },\n meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,\n isPM: function (input) {\n return input === 'ප.ව.' || input === 'පස් වරු';\n },\n meridiem: function (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'ප.ව.' : 'පස් වරු';\n } else {\n return isLower ? 'පෙ.ව.' : 'පෙර වරු';\n }\n },\n });\n\n return si;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1MzguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zaS5qcz9lZGE1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTaW5oYWxlc2UgW3NpXVxuLy8hIGF1dGhvciA6IFNhbXBhdGggU2l0aW5hbWFsdXdhIDogaHR0cHM6Ly9naXRodWIuY29tL3NhbXBhdGhzcmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICAvKmpzaGludCAtVzEwMCovXG4gICAgdmFyIHNpID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2knLCB7XG4gICAgICAgIG1vbnRoczogJ+C2ouC2seC3gOC3j+C2u+C3kl/gtrTgt5ngtrbgtrvgt4Dgt4/gtrvgt5Jf4La44LeP4La74LeK4Lat4LeUX+C2heC2tOC3iuKAjeC2u+C3muC2veC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt53gt4Pgt4rgtq3gt5Rf4LeD4LeQ4La04LeK4Lat4LeQ4La44LeK4La24La74LeKX+C2lOC2muC3iuC2reC3neC2tuC2u+C3il/gtrHgt5zgt4Dgt5Dgtrjgt4rgtrbgtrvgt4pf4Lav4LeZ4LeD4LeQ4La44LeK4La24La74LeKJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+C2ouC2sV/gtrTgt5ngtrZf4La44LeP4La74LeKX+C2heC2tOC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt51f4LeD4LeQ4La04LeKX+C2lOC2muC3il/gtrHgt5zgt4Dgt5Bf4Lav4LeZ4LeD4LeQJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgtongtrvgt5Lgtq/gt49f4LeD4Laz4LeU4Lav4LePX+C2heC2n+C3hOC2u+C3lOC3gOC3j+C2r+C3j1/gtrbgtq/gt4/gtq/gt49f4La24LeK4oCN4La74LeE4LeD4LeK4La04Lat4LeS4Lax4LeK4Lav4LePX+C3g+C3kuC2muC3lOC2u+C3j+C2r+C3j1/gt4Pgt5ngtrHgt4Pgt5Tgtrvgt4/gtq/gt48nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C2ieC2u+C3kl/gt4PgtrPgt5Rf4LaF4LafX+C2tuC2r+C3j1/gtrbgt4rigI3gtrvgt4Rf4LeD4LeS4Laa4LeUX+C3g+C3meC2sScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgtolf4LeDX+C2hV/gtrZf4La24LeK4oCN4La7X+C3g+C3kl/gt4Pgt5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnYSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ2EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgTU1NTSBEJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkgTU1NTSBELCBhIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkgTU1NTSBEIFvgt4Dgt5DgtrHgt5JdIGRkZGQsIGEgaDptbTpzcycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C2heC2r10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C3hOC3meC2p10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C2iuC2uuC3ml0gTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgtrTgt4Pgt5Tgtpzgt5LgtrpdIGRkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4Laa4LeS4Lax4LeKJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C2muC2pyDgtrTgt5ngtrsnLFxuICAgICAgICAgICAgczogJ+C2reC2reC3iuC2tOC2uyDgtprgt5Lgt4Tgt5LgtrTgtronLFxuICAgICAgICAgICAgc3M6ICfgtq3gtq3gt4rgtrTgtrsgJWQnLFxuICAgICAgICAgICAgbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lOC3gCcsXG4gICAgICAgICAgICBtbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lCAlZCcsXG4gICAgICAgICAgICBoOiAn4La04LeQ4La6JyxcbiAgICAgICAgICAgIGhoOiAn4La04LeQ4La6ICVkJyxcbiAgICAgICAgICAgIGQ6ICfgtq/gt5LgtrHgtronLFxuICAgICAgICAgICAgZGQ6ICfgtq/gt5LgtrEgJWQnLFxuICAgICAgICAgICAgTTogJ+C2uOC3j+C3g+C2uicsXG4gICAgICAgICAgICBNTTogJ+C2uOC3j+C3gyAlZCcsXG4gICAgICAgICAgICB5OiAn4LeA4LeD4La7JyxcbiAgICAgICAgICAgIHl5OiAn4LeA4LeD4La7ICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9IOC3gOC3kOC2seC3ki8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIOC3gOC3kOC2seC3kic7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gtrTgt5ngtrsg4LeA4La74LeUfOC2tOC3g+C3iiDgt4Dgtrvgt5R84La04LeZLuC3gHzgtrQu4LeALi8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4La0LuC3gC4nIHx8IGlucHV0ID09PSAn4La04LeD4LeKIOC3gOC2u+C3lCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La0LuC3gC4nIDogJ+C2tOC3g+C3iiDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfgtrTgt5ku4LeALicgOiAn4La04LeZ4La7IOC3gOC2u+C3lCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2k7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17538\n")},17730:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Spanish (Mexico) [es-mx]\n//! author : JC Franco : https://github.com/jcfranco\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var monthsShortDot =\n 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n '_'\n ),\n monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n monthsParse = [\n /^ene/i,\n /^feb/i,\n /^mar/i,\n /^abr/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^ago/i,\n /^sep/i,\n /^oct/i,\n /^nov/i,\n /^dic/i,\n ],\n monthsRegex =\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n var esMx = moment.defineLocale('es-mx', {\n months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n '_'\n ),\n monthsShort: function (m, format) {\n if (!m) {\n return monthsShortDot;\n } else if (/-MMM-/.test(format)) {\n return monthsShort[m.month()];\n } else {\n return monthsShortDot[m.month()];\n }\n },\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n monthsStrictRegex:\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n monthsShortStrictRegex:\n /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D [de] MMMM [de] YYYY',\n LLL: 'D [de] MMMM [de] YYYY H:mm',\n LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',\n },\n calendar: {\n sameDay: function () {\n return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextDay: function () {\n return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextWeek: function () {\n return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastDay: function () {\n return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastWeek: function () {\n return (\n '[el] dddd [pasado a la' +\n (this.hours() !== 1 ? 's' : '') +\n '] LT'\n );\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'en %s',\n past: 'hace %s',\n s: 'unos segundos',\n ss: '%d segundos',\n m: 'un minuto',\n mm: '%d minutos',\n h: 'una hora',\n hh: '%d horas',\n d: 'un día',\n dd: '%d días',\n w: 'una semana',\n ww: '%d semanas',\n M: 'un mes',\n MM: '%d meses',\n y: 'un año',\n yy: '%d años',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n invalidDate: 'Fecha inválida',\n });\n\n return esMx;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3MzAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanM/YjViNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoTWV4aWNvKSBbZXMtbXhdXG4vLyEgYXV0aG9yIDogSkMgRnJhbmNvIDogaHR0cHM6Ly9naXRodWIuY29tL2pjZnJhbmNvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc014ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtbXgnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZERhdGU6ICdGZWNoYSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzTXg7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17730\n")},17798:(I,g,n)=>{"use strict";I.exports=n.p+"fd87d1123b4744c49f22.png"},17980:module=>{"use strict";eval("\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5ODAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzBkZjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///17980\n")},18015:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('\n\nvar utils = __webpack_require__(9516);\nvar bind = __webpack_require__(69012);\nvar Axios = __webpack_require__(35155);\nvar mergeConfig = __webpack_require__(85343);\nvar defaults = __webpack_require__(37412);\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(31928);\naxios.CancelToken = __webpack_require__(3191);\naxios.isCancel = __webpack_require__(93864);\naxios.VERSION = (__webpack_require__(49641).version);\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = __webpack_require__(17980);\n\n// Expose isAxiosError\naxios.isAxiosError = __webpack_require__(45019);\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports["default"] = axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwMTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2NlZTQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgQXhpb3MgPSByZXF1aXJlKCcuL2NvcmUvQXhpb3MnKTtcbnZhciBtZXJnZUNvbmZpZyA9IHJlcXVpcmUoJy4vY29yZS9tZXJnZUNvbmZpZycpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICB2YXIgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgdmFyIGluc3RhbmNlID0gYmluZChBeGlvcy5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcy5wcm90b3R5cGUsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQpO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWxUb2tlbicpO1xuYXhpb3MuaXNDYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9pc0NhbmNlbCcpO1xuYXhpb3MuVkVSU0lPTiA9IHJlcXVpcmUoJy4vZW52L2RhdGEnKS52ZXJzaW9uO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNBeGlvc0Vycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXhpb3M7XG5cbi8vIEFsbG93IHVzZSBvZiBkZWZhdWx0IGltcG9ydCBzeW50YXggaW4gVHlwZVNjcmlwdFxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGF4aW9zO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18015\n')},18305:(I,g,n)=>{"use strict";I.exports=n.p+"cbeb7de03c1986470f96.png"},19021:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t var crypto;\n\n\t // Native crypto from window (Browser)\n\t if (typeof window !== 'undefined' && window.crypto) {\n\t crypto = window.crypto;\n\t }\n\n\t // Native crypto in web worker (Browser)\n\t if (typeof self !== 'undefined' && self.crypto) {\n\t crypto = self.crypto;\n\t }\n\n\t // Native crypto from worker\n\t if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t crypto = globalThis.crypto;\n\t }\n\n\t // Native (experimental IE 11) crypto from window (Browser)\n\t if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t crypto = window.msCrypto;\n\t }\n\n\t // Native crypto from global (NodeJS)\n\t if (!crypto && typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g.crypto) {\n\t crypto = __webpack_require__.g.crypto;\n\t }\n\n\t // Native crypto import via require (NodeJS)\n\t if (!crypto && \"function\" === 'function') {\n\t try {\n\t crypto = __webpack_require__(28145);\n\t } catch (err) {}\n\t }\n\n\t /*\n\t * Cryptographically secure pseudorandom number generator\n\t *\n\t * As Math.random() is cryptographically not safe to use\n\t */\n\t var cryptoSecureRandomInt = function () {\n\t if (crypto) {\n\t // Use getRandomValues method (Browser)\n\t if (typeof crypto.getRandomValues === 'function') {\n\t try {\n\t return crypto.getRandomValues(new Uint32Array(1))[0];\n\t } catch (err) {}\n\t }\n\n\t // Use randomBytes method (NodeJS)\n\t if (typeof crypto.randomBytes === 'function') {\n\t try {\n\t return crypto.randomBytes(4).readInt32LE();\n\t } catch (err) {}\n\t }\n\t }\n\n\t throw new Error('Native crypto module could not be used to get secure random number.');\n\t };\n\n\t /*\n\t * Local polyfill of Object.create\n\n\t */\n\t var create = Object.create || (function () {\n\t function F() {}\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }());\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var j = 0; j < thatSigBytes; j += 4) {\n\t thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t for (var i = 0; i < nBytes; i += 4) {\n\t words.push(cryptoSecureRandomInt());\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t var processedWords;\n\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwMjEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2NvcmUuanM/MjFiZiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0cm9vdC5DcnlwdG9KUyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cblx0LypnbG9iYWxzIHdpbmRvdywgZ2xvYmFsLCByZXF1aXJlKi9cblxuXHQvKipcblx0ICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0dmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgKGZ1bmN0aW9uIChNYXRoLCB1bmRlZmluZWQpIHtcblxuXHQgICAgdmFyIGNyeXB0bztcblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93LmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbiB3ZWIgd29ya2VyIChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHNlbGYuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd29ya2VyXG5cdCAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsVGhpcy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSAoZXhwZXJpbWVudGFsIElFIDExKSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubXNDcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cubXNDcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSBnbG9iYWwgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGltcG9ydCB2aWEgcmVxdWlyZSAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblx0ICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICB9XG5cblx0ICAgIC8qXG5cdCAgICAgKiBDcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvcmFuZG9tIG51bWJlciBnZW5lcmF0b3Jcblx0ICAgICAqXG5cdCAgICAgKiBBcyBNYXRoLnJhbmRvbSgpIGlzIGNyeXB0b2dyYXBoaWNhbGx5IG5vdCBzYWZlIHRvIHVzZVxuXHQgICAgICovXG5cdCAgICB2YXIgY3J5cHRvU2VjdXJlUmFuZG9tSW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChjcnlwdG8pIHtcblx0ICAgICAgICAgICAgLy8gVXNlIGdldFJhbmRvbVZhbHVlcyBtZXRob2QgKEJyb3dzZXIpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVXNlIHJhbmRvbUJ5dGVzIG1ldGhvZCAoTm9kZUpTKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRJbnQzMkxFKCk7XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdGl2ZSBjcnlwdG8gbW9kdWxlIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGdldCBzZWN1cmUgcmFuZG9tIG51bWJlci4nKTtcblx0ICAgIH07XG5cblx0ICAgIC8qXG5cdCAgICAgKiBMb2NhbCBwb2x5ZmlsbCBvZiBPYmplY3QuY3JlYXRlXG5cblx0ICAgICAqL1xuXHQgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmdW5jdGlvbiBGKCkge31cblxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgICAgICAgICAgIHZhciBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gb2JqO1xuXG5cdCAgICAgICAgICAgIHN1YnR5cGUgPSBuZXcgRigpO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gbnVsbDtcblxuXHQgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcnlwdG9KUyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGlicmFyeSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2xpYiA9IEMubGliID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7XG5cblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTcGF3blxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YnR5cGUgPSBjcmVhdGUodGhpcyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEF1Z21lbnRcblx0ICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLm1peEluKG92ZXJyaWRlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyXG5cdCAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBzdXBlcnR5cGVcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpcztcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEV4dGVuZHMgdGhpcyBvYmplY3QgYW5kIHJ1bnMgdGhlIGluaXQgbWV0aG9kLlxuXHQgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgaW5zdGFuY2UgPSBNeVR5cGUuY3JlYXRlKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZXh0ZW5kKCk7XG5cdCAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi5cblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gbWl4IGluLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJ1xuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBtaXhJbjogZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlXG5cdCAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcgPSBwcm9wZXJ0aWVzLnRvU3RyaW5nO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBpbnN0YW5jZS5jbG9uZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICovXG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogNDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHdvcmQgYXJyYXkgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChlbmNvZGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uY2F0ZW5hdGVzIGEgd29yZCBhcnJheSB0byB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB0aGlzV29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRTaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB0aGlzLmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29uY2F0XG5cdCAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSBieXRlIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaSkgPj4+IDJdIHw9IHRoYXRCeXRlIDw8ICgyNCAtICgodGhpc1NpZ0J5dGVzICsgaSkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgd29yZCBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhhdFNpZ0J5dGVzOyBqICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGopID4+PiAyXSA9IHRoYXRXb3Jkc1tqID4+PiAyXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcFxuXHQgICAgICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSAoc2lnQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB3b3Jkcy5sZW5ndGggPSBNYXRoLmNlaWwoc2lnQnl0ZXMgLyA0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHJhbmRvbSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oMTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJhbmRvbTogZnVuY3Rpb24gKG5CeXRlcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5CeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKGNyeXB0b1NlY3VyZVJhbmRvbUludCgpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIG5CeXRlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRW5jb2RlciBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlICYgMHgwZikudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBoZXhDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShoZXhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaGV4U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGV4U3RyTGVuZ3RoOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExhdGluMSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGxhdGluMUNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGluMVN0ciBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMVN0ckxlbmd0aCA9IGxhdGluMVN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgKDI0IC0gKGkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmOC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjhTdHIgVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGUgcHJvcGVydHkgYmxvY2tTaXplIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfbWluQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBrZXB0IHVucHJvY2Vzc2VkIGluIHRoZSBidWZmZXIuIERlZmF1bHQ6IDBcblx0ICAgICAqL1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGRhdGEgYnVmZmVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBXb3JkQXJyYXkuaW5pdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBfZG9Qcm9jZXNzQmxvY2sob2Zmc2V0KSwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvRmx1c2ggV2hldGhlciBhbGwgYmxvY2tzIGFuZCBwYXJ0aWFsIGJsb2NrcyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcygpO1xuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcHJvY2VzczogZnVuY3Rpb24gKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgdmFyIHByb2Nlc3NlZFdvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJsb2Nrc1JlYWR5ID0gZGF0YVNpZ0J5dGVzIC8gYmxvY2tTaXplQnl0ZXM7XG5cdCAgICAgICAgICAgIGlmIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCB1cCB0byBpbmNsdWRlIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLmNlaWwobkJsb2Nrc1JlYWR5KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIGRvd24gdG8gaW5jbHVkZSBvbmx5IGZ1bGwgYmxvY2tzLFxuXHQgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBidWZmZXJcblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGgubWF4KChuQmxvY2tzUmVhZHkgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgd29yZHMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5Xb3Jkc1JlYWR5ID0gbkJsb2Nrc1JlYWR5ICogYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJ5dGVzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2Nrc1xuXHQgICAgICAgICAgICBpZiAobldvcmRzUmVhZHkpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG5Xb3Jkc1JlYWR5OyBvZmZzZXQgKz0gYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1hbGdvcml0aG0gbG9naWNcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb1Byb2Nlc3NCbG9jayhkYXRhV29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgICAgIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7XG5cdCAgICAgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5CeXRlc1JlYWR5O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21pbkJ1ZmZlclNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgaGFzaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2hcblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgbWVzc2FnZSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDUxMi8zMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byBhIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UgaW4gdGhpcyBITUFDIGhlbHBlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ19hbGdvLkhNQUMuaW5pdChoYXNoZXIsIGtleSkuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9O1xuXG5cdCAgICByZXR1cm4gQztcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///19021\n")},19508:(I,g,n)=>{"use strict";I.exports=n.p+"ba512fc50c99b3b5ae36.png"},19624:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n AttributeInputCallback: () => (/* reexport */ s),\n Auth: () => (/* reexport */ J),\n CallbackType: () => (/* reexport */ enums_l),\n ChoiceCallback: () => (/* reexport */ choice_callback_h),\n Config: () => (/* reexport */ config_c),\n ConfirmationCallback: () => (/* reexport */ confirmation_callback_i),\n Deferred: () => (/* reexport */ deferred_t),\n DeviceProfileCallback: () => (/* reexport */ device_profile_callback_i),\n ErrorCode: () => (/* reexport */ t),\n FRAuth: () => (/* reexport */ fr_auth_f),\n FRCallback: () => (/* reexport */ callbacks_r),\n FRDevice: () => (/* reexport */ O),\n FRLoginFailure: () => (/* reexport */ i),\n FRLoginSuccess: () => (/* reexport */ fr_login_success_r),\n FRPolicy: () => (/* reexport */ y),\n FRQRCode: () => (/* reexport */ fr_qr_code_i),\n FRRecoveryCodes: () => (/* reexport */ fr_recovery_codes_p),\n FRStep: () => (/* reexport */ fr_step_i),\n FRUser: () => (/* reexport */ fr_user_O),\n FRWebAuthn: () => (/* reexport */ V),\n HiddenValueCallback: () => (/* reexport */ hidden_value_callback_t),\n HttpClient: () => (/* reexport */ D),\n KbaCreateCallback: () => (/* reexport */ kba_create_callback_u),\n LocalStorage: () => (/* reexport */ storage_r),\n MetadataCallback: () => (/* reexport */ metadata_callback_s),\n NameCallback: () => (/* reexport */ name_callback_r),\n OAuth2Client: () => (/* reexport */ b),\n PKCE: () => (/* reexport */ pkce_c),\n PasswordCallback: () => (/* reexport */ password_callback_r),\n PingOneProtectEvaluationCallback: () => (/* reexport */ ping_protect_evaluation_callback_r),\n PingOneProtectInitializeCallback: () => (/* reexport */ ping_protect_initialize_callback_i),\n PolicyKey: () => (/* reexport */ _),\n PollingWaitCallback: () => (/* reexport */ polling_wait_callback_r),\n ReCaptchaCallback: () => (/* reexport */ recaptcha_callback_r),\n ReCaptchaEnterpriseCallback: () => (/* reexport */ recaptcha_enterprise_callback_r),\n RedirectCallback: () => (/* reexport */ c),\n ResponseType: () => (/* reexport */ oauth2_client_enums_r),\n SelectIdPCallback: () => (/* reexport */ d),\n SessionManager: () => (/* reexport */ M),\n StepType: () => (/* reexport */ enums_r),\n SuspendedTextOutputCallback: () => (/* reexport */ a),\n TermsAndConditionsCallback: () => (/* reexport */ terms_and_conditions_callback_a),\n TextInputCallback: () => (/* reexport */ text_input_callback_r),\n TextOutputCallback: () => (/* reexport */ text_output_callback_u),\n TokenManager: () => (/* reexport */ token_manager_f),\n TokenStorage: () => (/* reexport */ token_storage_d),\n UserManager: () => (/* reexport */ user_manager_a),\n ValidatedCreatePasswordCallback: () => (/* reexport */ validated_create_password_callback_i),\n ValidatedCreateUsernameCallback: () => (/* reexport */ validated_create_username_callback_s),\n WebAuthnOutcome: () => (/* reexport */ enums_o),\n WebAuthnStepType: () => (/* reexport */ enums_i),\n defaultMessageCreator: () => (/* reexport */ u),\n deviceClient: () => (/* reexport */ device_store_p)\n});\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/config/constants.js\nconst T = 5e3, E = 3e4, o = "FR-SDK";\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/middleware.js\nfunction f(t, { type: a, payload: o }) {\n const i = Object.freeze({ type: a, payload: o });\n return (e) => {\n if (!Array.isArray(e))\n return t;\n const c = e.map((r) => r);\n function n() {\n const r = c.shift();\n return r && r(t, i, n), t;\n }\n return n();\n };\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/timeout.js\n\nfunction timeout_T(t, o = T) {\n const i = o || T, r = new Promise(\n (n, m) => setTimeout(() => m(new Error("Timeout")), i)\n );\n return Promise.race([t, r]);\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/config/enums.js\nvar enums_e = /* @__PURE__ */ ((E) => (E.Authenticate = "AUTHENTICATE", E.Authorize = "AUTHORIZE", E.EndSession = "END_SESSION", E.Logout = "LOGOUT", E.ExchangeToken = "EXCHANGE_TOKEN", E.RefreshToken = "REFRESH_TOKEN", E.ResumeAuthenticate = "RESUME_AUTHENTICATE", E.RevokeToken = "REVOKE_TOKEN", E.StartAuthenticate = "START_AUTHENTICATE", E.UserInfo = "USER_INFO", E.WellKnown = "WELL_KNOWN", E))(enums_e || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/config/helpers.js\n\n\n\nfunction h(n, r) {\n if (!n.authorization_endpoint)\n throw new Error("Wellknown endpoint did not return `authorization_endpoint`");\n const t = new URL(n.authorization_endpoint).origin;\n let e, i;\n n.issuer.includes("/am/") ? (e = `${n.issuer.replace("oauth2", "json")}/authenticate`, i = `${n.issuer.replace("oauth2", "json")}/sessions`) : n.issuer.includes("/as/");\n const s = {\n ...e ? { authenticate: new URL(e).pathname } : {},\n authorize: new URL(n.authorization_endpoint).pathname,\n accessToken: new URL(n.token_endpoint).pathname,\n endSession: new URL(n.ping_end_idp_session_endpoint || n.end_session_endpoint).pathname,\n userInfo: new URL(n.userinfo_endpoint).pathname,\n revoke: new URL(n.revocation_endpoint).pathname,\n ...i ? { sessions: new URL(i).pathname } : {}\n };\n return {\n baseUrl: t,\n paths: s\n };\n}\nasync function m(n) {\n if (!n.serverConfig.wellknown)\n throw new Error("wellknown URL is missing in options");\n const o = f(\n {\n url: new URL(n.serverConfig?.wellknown),\n init: { method: "GET" }\n },\n {\n type: enums_e.WellKnown,\n payload: {}\n }\n )(n.middleware);\n return await (await timeout_T(fetch(o.url.toString(), o.init), n.serverConfig.timeout)).json();\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/config/index.js\n\n\nfunction w(n) {\n return {\n ...n,\n oauthThreshold: n.oauthThreshold || E,\n logLevel: n.logLevel || "none",\n platformHeader: n.platformHeader || !1,\n prefix: n.prefix || o\n };\n}\nclass config_c {\n /**\n * Sets the default options.\n *\n * @param options The options to use as defaults\n */\n static set(e) {\n if (!this.isValid(e))\n throw new Error("Configuration is invalid");\n e.serverConfig && this.validateServerConfig(e.serverConfig), this.options = { ...w(e) };\n }\n /**\n * @method setAsync - Asynchronously calls the WellKnown endpoint to collect the APIs for OAuth\n * @param {AsyncConfigOptions} options - config options with wellknown endpoint URL\n * @returns {Promise} - Returns a success or failure message object\n */\n static async setAsync(e) {\n if (!e.serverConfig.wellknown)\n throw new Error(\n "Missing well-known property. Use `Config.set` method if not using well-known endpoint."\n );\n e.serverConfig.baseUrl && console.warn(\n "The baseUrl property passed in will be ignored, and replaced with well-known origin."\n );\n const r = await m(e), i = h(r);\n delete e.serverConfig.wellknown;\n const t = e;\n t.serverConfig = i, this.set(t);\n }\n /**\n * Merges the provided options with the default options. Ensures a server configuration exists.\n *\n * @param options The options to merge with defaults\n */\n static get(e) {\n if (!this.options && !e)\n throw new Error("Configuration has not been set");\n const r = { ...this.options, ...e };\n if (!r.serverConfig || !r.serverConfig.baseUrl)\n throw new Error("Server configuration has not been set");\n return r;\n }\n static isValid(e) {\n return !!(e && e.serverConfig);\n }\n static validateServerConfig(e) {\n e.timeout || (e.timeout = T);\n const r = e.baseUrl;\n r && r.charAt(r.length - 1) !== "/" && (e.baseUrl = r + "/");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/shared/constants.js\nconst constants_E = "forgerock-sdk", constants_o = "javascript";\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/realm.js\nfunction realm_n(o) {\n const r = (o || "").split("/").map((t) => t.trim()).filter((t) => t !== "");\n return r[0] !== "root" && r.unshift("root"), r.map((t) => `realms/${t}`).join("/");\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/url.js\n\nfunction r(t) {\n const o = t.protocol === "http:" && ["", "80"].indexOf(t.port) === -1 || t.protocol === "https:" && ["", "443"].indexOf(t.port) === -1 ? `:${t.port}` : "";\n return `${t.protocol}//${t.hostname}${o}`;\n}\nfunction url_h(t, e, o) {\n const n = realm_n(e), s = {\n authenticate: `json/${n}/authenticate`,\n authorize: `oauth2/${n}/authorize`,\n accessToken: `oauth2/${n}/access_token`,\n endSession: `oauth2/${n}/connect/endSession`,\n userInfo: `oauth2/${n}/userinfo`,\n revoke: `oauth2/${n}/token/revoke`,\n sessions: `json/${n}/sessions/`\n };\n return o && o[t] ? o[t] : s[t];\n}\nfunction url_f(t, e) {\n const o = new URL(t);\n if (e.startsWith("/"))\n return `${r(o)}${e}`;\n const n = o.pathname.split("/"), s = e.split("/").filter((i) => !!i), a = [...n.slice(0, -1), ...s].join("/");\n return `${r(o)}${a}`;\n}\nfunction p(t) {\n const e = new URL(t), o = {};\n return e.searchParams.forEach((n, s) => o[s] = n), o;\n}\nfunction $(t) {\n const e = [];\n for (const o in t)\n t[o] && e.push(o + "=" + encodeURIComponent(t[o]));\n return e.join("&");\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/auth/index.js\n\n\n\n\n\n\nclass J {\n /**\n * Gets the next step in the authentication tree.\n *\n * @param {Step} previousStep The previous step, including any required input.\n * @param {StepOptions} options Configuration default overrides.\n * @return {Step} The next step in the authentication tree.\n */\n static async next(t, e) {\n const { middleware: r, platformHeader: n, realmPath: u, serverConfig: i, tree: o, type: a } = config_c.get(e), d = e ? e.query : {}, p = this.constructUrl(i, u, o, d), s = f(\n {\n url: new URL(p),\n init: this.configureRequest(t)\n },\n {\n type: t ? enums_e.Authenticate : enums_e.StartAuthenticate,\n payload: {\n tree: o,\n type: a || "service"\n }\n }\n )(r);\n n && (s.init.headers instanceof Headers ? s.init.headers.set("X-Requested-Platform", constants_o) : Array.isArray(s.init.headers) ? s.init.headers.push(["X-Requested-Platform", constants_o]) : s.init.headers ? s.init.headers["X-Requested-Platform"] = constants_o : s.init.headers = {\n "X-Requested-Platform": constants_o\n });\n const h = await timeout_T(fetch(s.url.toString(), s.init), i.timeout);\n return await this.getResponseJson(h);\n }\n static constructUrl(t, e, r, n) {\n const i = { ...n, ...r ? { authIndexType: "service", authIndexValue: r } : void 0 }, o = Object.keys(i).length > 0 ? `?${$(i)}` : "", a = url_h("authenticate", e, t.paths);\n return url_f(t.baseUrl, `${a}${o}`);\n }\n static configureRequest(t) {\n return {\n body: t ? JSON.stringify(t) : void 0,\n credentials: "include",\n headers: new Headers({\n Accept: "application/json",\n "Accept-API-Version": "protocol=1.0,resource=2.1",\n "Content-Type": "application/json",\n "X-Requested-With": constants_E\n }),\n method: "POST"\n };\n }\n static async getResponseJson(t) {\n const e = t.headers.get("content-type"), n = e && e.indexOf("application/json") > -1 ? await t.json() : {};\n return n.status = t.status, n.ok = t.ok, n;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/auth/enums.js\nvar t = /* @__PURE__ */ ((a) => (a.BadRequest = "BAD_REQUEST", a.Timeout = "TIMEOUT", a.Unauthorized = "UNAUTHORIZED", a.Unknown = "UNKNOWN", a))(t || {}), enums_l = /* @__PURE__ */ ((a) => (a.BooleanAttributeInputCallback = "BooleanAttributeInputCallback", a.ChoiceCallback = "ChoiceCallback", a.ConfirmationCallback = "ConfirmationCallback", a.DeviceProfileCallback = "DeviceProfileCallback", a.HiddenValueCallback = "HiddenValueCallback", a.KbaCreateCallback = "KbaCreateCallback", a.MetadataCallback = "MetadataCallback", a.NameCallback = "NameCallback", a.NumberAttributeInputCallback = "NumberAttributeInputCallback", a.PasswordCallback = "PasswordCallback", a.PingOneProtectEvaluationCallback = "PingOneProtectEvaluationCallback", a.PingOneProtectInitializeCallback = "PingOneProtectInitializeCallback", a.PollingWaitCallback = "PollingWaitCallback", a.ReCaptchaCallback = "ReCaptchaCallback", a.ReCaptchaEnterpriseCallback = "ReCaptchaEnterpriseCallback", a.RedirectCallback = "RedirectCallback", a.SelectIdPCallback = "SelectIdPCallback", a.StringAttributeInputCallback = "StringAttributeInputCallback", a.SuspendedTextOutputCallback = "SuspendedTextOutputCallback", a.TermsAndConditionsCallback = "TermsAndConditionsCallback", a.TextInputCallback = "TextInputCallback", a.TextOutputCallback = "TextOutputCallback", a.ValidatedCreatePasswordCallback = "ValidatedCreatePasswordCallback", a.ValidatedCreateUsernameCallback = "ValidatedCreateUsernameCallback", a))(enums_l || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-policy/enums.js\nvar _ = /* @__PURE__ */ ((A) => (A.CannotContainCharacters = "CANNOT_CONTAIN_CHARACTERS", A.CannotContainDuplicates = "CANNOT_CONTAIN_DUPLICATES", A.CannotContainOthers = "CANNOT_CONTAIN_OTHERS", A.LeastCapitalLetters = "AT_LEAST_X_CAPITAL_LETTERS", A.LeastNumbers = "AT_LEAST_X_NUMBERS", A.MatchRegexp = "MATCH_REGEXP", A.MaximumLength = "MAX_LENGTH", A.MaximumNumber = "MAXIMUM_NUMBER_VALUE", A.MinimumLength = "MIN_LENGTH", A.MinimumNumber = "MINIMUM_NUMBER_VALUE", A.Required = "REQUIRED", A.Unique = "UNIQUE", A.UnknownPolicy = "UNKNOWN_POLICY", A.ValidArrayItems = "VALID_ARRAY_ITEMS", A.ValidDate = "VALID_DATE", A.ValidEmailAddress = "VALID_EMAIL_ADDRESS_FORMAT", A.ValidNameFormat = "VALID_NAME_FORMAT", A.ValidNumber = "VALID_NUMBER", A.ValidPhoneFormat = "VALID_PHONE_FORMAT", A.ValidQueryFilter = "VALID_QUERY_FILTER", A.ValidType = "VALID_TYPE", A))(_ || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/strings.js\nfunction strings_f(o, r, n) {\n return o === 1 ? r : n !== void 0 ? n : r + "s";\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-policy/helpers.js\nfunction helpers_n(r, t, e) {\n return !r || r[t] === void 0 ? e : r[t];\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-policy/message-creator.js\n\n\n\nconst u = {\n [_.CannotContainCharacters]: (a, n) => {\n const t = helpers_n(n, "forbiddenChars", "");\n return `${a} must not contain following characters: "${t}"`;\n },\n [_.CannotContainDuplicates]: (a, n) => {\n const t = helpers_n(n, "duplicateValue", "");\n return `${a} must not contain duplicates: "${t}"`;\n },\n [_.CannotContainOthers]: (a, n) => {\n const t = helpers_n(n, "disallowedFields", "");\n return `${a} must not contain: "${t}"`;\n },\n [_.LeastCapitalLetters]: (a, n) => {\n const t = helpers_n(n, "numCaps", 0);\n return `${a} must contain at least ${t} capital ${strings_f(t, "letter")}`;\n },\n [_.LeastNumbers]: (a, n) => {\n const t = helpers_n(n, "numNums", 0);\n return `${a} must contain at least ${t} numeric ${strings_f(t, "value")}`;\n },\n [_.MatchRegexp]: (a) => `${a} has failed the "MATCH_REGEXP" policy`,\n [_.MaximumLength]: (a, n) => {\n const t = helpers_n(n, "maxLength", 0);\n return `${a} must be at most ${t} ${strings_f(t, "character")}`;\n },\n [_.MaximumNumber]: (a) => `${a} has failed the "MAXIMUM_NUMBER_VALUE" policy`,\n [_.MinimumLength]: (a, n) => {\n const t = helpers_n(n, "minLength", 0);\n return `${a} must be at least ${t} ${strings_f(t, "character")}`;\n },\n [_.MinimumNumber]: (a) => `${a} has failed the "MINIMUM_NUMBER_VALUE" policy`,\n [_.Required]: (a) => `${a} is required`,\n [_.Unique]: (a) => `${a} must be unique`,\n [_.UnknownPolicy]: (a, n) => {\n const t = helpers_n(n, "policyRequirement", "Unknown");\n return `${a}: Unknown policy requirement "${t}"`;\n },\n [_.ValidArrayItems]: (a) => `${a} has failed the "VALID_ARRAY_ITEMS" policy`,\n [_.ValidDate]: (a) => `${a} has an invalid date`,\n [_.ValidEmailAddress]: (a) => `${a} has an invalid email address`,\n [_.ValidNameFormat]: (a) => `${a} has an invalid name format`,\n [_.ValidNumber]: (a) => `${a} has an invalid number`,\n [_.ValidPhoneFormat]: (a) => `${a} has an invalid phone number`,\n [_.ValidQueryFilter]: (a) => `${a} has failed the "VALID_QUERY_FILTER" policy`,\n [_.ValidType]: (a) => `${a} has failed the "VALID_TYPE" policy`\n};\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-policy/index.js\n\n\nclass y {\n /**\n * Parses policy errors and generates human readable error messages.\n *\n * @param {Step} err The step containing the error.\n * @param {MessageCreator} messageCreator\n * Extensible and overridable custom error messages for policy failures.\n * @return {ProcessedPropertyError[]} Array of objects containing all processed policy errors.\n */\n static parseErrors(e, r) {\n const s = [];\n return e.detail && e.detail.failedPolicyRequirements && e.detail.failedPolicyRequirements.map((t) => {\n s.push.apply(s, [\n {\n detail: t,\n messages: this.parseFailedPolicyRequirement(t, r)\n }\n ]);\n }), s;\n }\n /**\n * Parses a failed policy and returns a string array of error messages.\n *\n * @param {FailedPolicyRequirement} failedPolicy The detail data of the failed policy.\n * @param {MessageCreator} customMessage\n * Extensible and overridable custom error messages for policy failures.\n * @return {string[]} Array of strings with all processed policy errors.\n */\n static parseFailedPolicyRequirement(e, r) {\n const s = [];\n return e.policyRequirements.map((t) => {\n s.push(\n this.parsePolicyRequirement(e.property, t, r)\n );\n }), s;\n }\n /**\n * Parses a policy error into a human readable error message.\n *\n * @param {string} property The property with the policy failure.\n * @param {PolicyRequirement} policy The policy failure data.\n * @param {MessageCreator} customMessage\n * Extensible and overridable custom error messages for policy failures.\n * @return {string} Human readable error message.\n */\n static parsePolicyRequirement(e, r, s = {}) {\n const t = typeof r == "string" ? JSON.parse(r) : { ...r }, a = t.policyRequirement, o = s[a] || u[a] || u[_.UnknownPolicy], c = t.params ? { ...t.params, policyRequirement: a } : { policyRequirement: a };\n return o(e, c);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/enums.js\nvar enums_r = /* @__PURE__ */ ((i) => (i.LoginFailure = "LoginFailure", i.LoginSuccess = "LoginSuccess", i.Step = "Step", i))(enums_r || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/fr-login-failure.js\n\n\nclass i {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n this.payload = e, this.type = enums_r.LoginFailure;\n }\n /**\n * Gets the error code.\n */\n getCode() {\n return Number(this.payload.code);\n }\n /**\n * Gets the failure details.\n */\n getDetail() {\n return this.payload.detail;\n }\n /**\n * Gets the failure message.\n */\n getMessage() {\n return this.payload.message;\n }\n /**\n * Gets processed failure message.\n */\n getProcessedMessage(e) {\n return y.parseErrors(this.payload, e);\n }\n /**\n * Gets the failure reason.\n */\n getReason() {\n return this.payload.reason;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/fr-login-success.js\n\nclass fr_login_success_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n this.payload = e, this.type = enums_r.LoginSuccess;\n }\n /**\n * Gets the step\'s realm.\n */\n getRealm() {\n return this.payload.realm;\n }\n /**\n * Gets the step\'s session token.\n */\n getSessionToken() {\n return this.payload.tokenId;\n }\n /**\n * Gets the step\'s success URL.\n */\n getSuccessUrl() {\n return this.payload.successUrl;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/index.js\nclass callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n this.payload = e;\n }\n /**\n * Gets the name of this callback type.\n */\n getType() {\n return this.payload.type;\n }\n /**\n * Gets the value of the specified input element, or the first element if `selector` is not\n * provided.\n *\n * @param selector The index position or name of the desired element\n */\n getInputValue(e = 0) {\n return this.getArrayElement(this.payload.input, e).value;\n }\n /**\n * Sets the value of the specified input element, or the first element if `selector` is not\n * provided.\n *\n * @param selector The index position or name of the desired element\n */\n setInputValue(e, t = 0) {\n this.getArrayElement(this.payload.input, t).value = e;\n }\n /**\n * Gets the value of the specified output element, or the first element if `selector`\n * is not provided.\n *\n * @param selector The index position or name of the desired element\n */\n getOutputValue(e = 0) {\n return this.getArrayElement(this.payload.output, e).value;\n }\n /**\n * Gets the value of the first output element with the specified name or the\n * specified default value.\n *\n * @param name The name of the desired element\n */\n getOutputByName(e, t) {\n const n = this.payload.output.find((a) => a.name === e);\n return n ? n.value : t;\n }\n getArrayElement(e, t = 0) {\n if (e === void 0)\n throw new Error(`No NameValue array was provided to search (selector ${t})`);\n if (typeof t == "number") {\n if (t < 0 || t > e.length - 1)\n throw new Error(`Selector index ${t} is out of range`);\n return e[t];\n }\n if (typeof t == "string") {\n const n = e.find((a) => a.name === t);\n if (!n)\n throw new Error(`Missing callback input entry "${t}"`);\n return n;\n }\n if (typeof t == "object" && t.test && t.exec) {\n const n = e.find((a) => t.test(a.name));\n if (!n)\n throw new Error(`Missing callback input entry "${t}"`);\n return n;\n }\n throw new Error("Invalid selector value type");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/attribute-input-callback.js\n\nclass s extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n super(e), this.payload = e;\n }\n /**\n * Gets the attribute name.\n */\n getName() {\n return this.getOutputByName("name", "");\n }\n /**\n * Gets the attribute prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Gets whether the attribute is required.\n */\n isRequired() {\n return this.getOutputByName("required", !1);\n }\n /**\n * Gets the callback\'s failed policies.\n */\n getFailedPolicies() {\n const e = this.getOutputByName(\n "failedPolicies",\n []\n );\n try {\n return e.map((t) => JSON.parse(t));\n } catch {\n throw new Error(\n \'Unable to parse "failed policies" from the ForgeRock server. The JSON within `AttributeInputCallback` was either malformed or missing.\'\n );\n }\n }\n /**\n * Gets the callback\'s applicable policies.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getPolicies() {\n return this.getOutputByName("policies", {});\n }\n /**\n * Set if validating value only.\n */\n setValidateOnly(e) {\n this.setInputValue(e, /validateOnly/);\n }\n /**\n * Sets the attribute\'s value.\n */\n setValue(e) {\n this.setInputValue(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/choice-callback.js\n\nclass choice_callback_h extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the choice\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Gets the choice\'s default answer.\n */\n getDefaultChoice() {\n return this.getOutputByName("defaultChoice", 0);\n }\n /**\n * Gets the choice\'s possible answers.\n */\n getChoices() {\n return this.getOutputByName("choices", []);\n }\n /**\n * Sets the choice\'s answer by index position.\n */\n setChoiceIndex(t) {\n const e = this.getChoices().length;\n if (t < 0 || t > e - 1)\n throw new Error(`${t} is out of bounds`);\n this.setInputValue(t);\n }\n /**\n * Sets the choice\'s answer by value.\n */\n setChoiceValue(t) {\n const e = this.getChoices().indexOf(t);\n if (e === -1)\n throw new Error(`"${t}" is not a valid choice`);\n this.setInputValue(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/confirmation-callback.js\n\nclass confirmation_callback_i extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the index position of the confirmation\'s default answer.\n */\n getDefaultOption() {\n return Number(this.getOutputByName("defaultOption", 0));\n }\n /**\n * Gets the confirmation\'s message type.\n */\n getMessageType() {\n return Number(this.getOutputByName("messageType", 0));\n }\n /**\n * Gets the confirmation\'s possible answers.\n */\n getOptions() {\n return this.getOutputByName("options", []);\n }\n /**\n * Gets the confirmation\'s option type.\n */\n getOptionType() {\n return Number(this.getOutputByName("optionType", 0));\n }\n /**\n * Gets the confirmation\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Set option index.\n */\n setOptionIndex(t) {\n if (t !== 0 && t !== 1)\n throw new Error(`"${t}" is not a valid choice`);\n this.setInputValue(t);\n }\n /**\n * Set option value.\n */\n setOptionValue(t) {\n const e = this.getOptions().indexOf(t);\n if (e === -1)\n throw new Error(`"${t}" is not a valid choice`);\n this.setInputValue(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/device-profile-callback.js\n\nclass device_profile_callback_i extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n super(e), this.payload = e;\n }\n /**\n * Gets the callback\'s data.\n */\n getMessage() {\n return this.getOutputByName("message", "");\n }\n /**\n * Does callback require metadata?\n */\n isMetadataRequired() {\n return this.getOutputByName("metadata", !1);\n }\n /**\n * Does callback require location data?\n */\n isLocationRequired() {\n return this.getOutputByName("location", !1);\n }\n /**\n * Sets the profile.\n */\n setProfile(e) {\n this.setInputValue(JSON.stringify(e));\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/hidden-value-callback.js\n\nclass hidden_value_callback_t extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(a) {\n super(a), this.payload = a;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/kba-create-callback.js\n\nclass kba_create_callback_u extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Gets the callback\'s list of pre-defined security questions.\n */\n getPredefinedQuestions() {\n return this.getOutputByName("predefinedQuestions", []);\n }\n /**\n * Sets the callback\'s security question.\n */\n setQuestion(t) {\n this.setValue("question", t);\n }\n /**\n * Sets the callback\'s security question answer.\n */\n setAnswer(t) {\n this.setValue("answer", t);\n }\n setValue(t, s) {\n if (!this.payload.input)\n throw new Error("KBA payload is missing input");\n const e = this.payload.input.find((i) => i.name.endsWith(t));\n if (!e)\n throw new Error(`No input has name ending in "${t}"`);\n e.value = s;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/metadata-callback.js\n\nclass metadata_callback_s extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback\'s data.\n */\n getData() {\n return this.getOutputByName("data", {});\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/name-callback.js\n\nclass name_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Sets the username.\n */\n setName(t) {\n this.setInputValue(t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/password-callback.js\n\nclass password_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback\'s failed policies.\n */\n getFailedPolicies() {\n return this.getOutputByName("failedPolicies", []);\n }\n /**\n * Gets the callback\'s applicable policies.\n */\n getPolicies() {\n return this.getOutputByName("policies", []);\n }\n /**\n * Gets the callback\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Sets the password.\n */\n setPassword(t) {\n this.setInputValue(t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/ping-protect-evaluation-callback.js\n\nclass ping_protect_evaluation_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback\'s pauseBehavioralData value.\n * @returns {boolean}\n */\n getPauseBehavioralData() {\n return this.getOutputByName("pauseBehavioralData", !1);\n }\n /**\n * @method setData - Set the result of data collection\n * @param {string} data - Data from calling pingProtect.get()\n * @returns {void}\n */\n setData(t) {\n this.setInputValue(t, /signals/);\n }\n /**\n * @method setClientError - Set the client error message\n * @param {string} errorMessage - Error message\n * @returns {void}\n */\n setClientError(t) {\n this.setInputValue(t, /clientError/);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/ping-protect-initialize-callback.js\n\nclass ping_protect_initialize_callback_i extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Get callback\'s initialization config settings\n */\n getConfig() {\n return {\n envId: this.getOutputByName("envId", ""),\n consoleLogEnabled: this.getOutputByName("consoleLogEnabled", !1),\n deviceAttributesToIgnore: this.getOutputByName("deviceAttributesToIgnore", []),\n customHost: this.getOutputByName("customHost", ""),\n lazyMetadata: this.getOutputByName("lazyMetadata", !1),\n behavioralDataCollection: this.getOutputByName("behavioralDataCollection", !0),\n deviceKeyRsyncIntervals: this.getOutputByName("deviceKeyRsyncIntervals", 14),\n enableTrust: this.getOutputByName("enableTrust", !1),\n disableTags: this.getOutputByName("disableTags", !1),\n disableHub: this.getOutputByName("disableHub", !1)\n };\n }\n setClientError(t) {\n this.setInputValue(t, /clientError/);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/polling-wait-callback.js\n\nclass polling_wait_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the message to display while polling.\n */\n getMessage() {\n return this.getOutputByName("message", "");\n }\n /**\n * Gets the polling interval in milliseconds.\n */\n getWaitTime() {\n return Number(this.getOutputByName("waitTime", 0));\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/recaptcha-callback.js\n\nclass recaptcha_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the reCAPTCHA site key.\n */\n getSiteKey() {\n return this.getOutputByName("recaptchaSiteKey", "");\n }\n /**\n * Sets the reCAPTCHA result.\n */\n setResult(t) {\n this.setInputValue(t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/recaptcha-enterprise-callback.js\n\nclass recaptcha_enterprise_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the reCAPTCHA site key.\n */\n getSiteKey() {\n return this.getOutputByName("recaptchaSiteKey", "");\n }\n /**\n * Get the api url\n */\n getApiUrl() {\n return this.getOutputByName("captchaApiUri", "");\n }\n /**\n * Get the class name\n */\n getElementClass() {\n return this.getOutputByName("captchaDivClass", "");\n }\n /**\n * Sets the reCAPTCHA result.\n */\n setResult(t) {\n this.setInputValue(t);\n }\n /**\n * Set client client error\n */\n setClientError(t) {\n this.setInputValue(t, "IDToken1clientError");\n }\n /**\n * Set the recaptcha payload\n */\n setPayload(t) {\n this.setInputValue(t, "IDToken1payload");\n }\n /**\n * Set the recaptcha action\n */\n setAction(t) {\n this.setInputValue(t, "IDToken1action");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/redirect-callback.js\n\nclass c extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the redirect URL.\n */\n getRedirectUrl() {\n return this.getOutputByName("redirectUrl", "");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/select-idp-callback.js\n\nclass d extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(r) {\n super(r), this.payload = r;\n }\n /**\n * Gets the available providers.\n */\n getProviders() {\n return this.getOutputByName("providers", []);\n }\n /**\n * Sets the provider by name.\n */\n setProvider(r) {\n const t = this.getProviders().find((e) => e.provider === r);\n if (!t)\n throw new Error(`"${r}" is not a valid choice`);\n this.setInputValue(t.provider);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/text-output-callback.js\n\nclass text_output_callback_u extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n super(e), this.payload = e;\n }\n /**\n * Gets the message content.\n */\n getMessage() {\n return this.getOutputByName("message", "");\n }\n /**\n * Gets the message type.\n */\n getMessageType() {\n return this.getOutputByName("messageType", "");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/suspended-text-output-callback.js\n\nclass a extends text_output_callback_u {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/terms-and-conditions-callback.js\n\nclass terms_and_conditions_callback_a extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the terms and conditions content.\n */\n getTerms() {\n return this.getOutputByName("terms", "");\n }\n /**\n * Gets the version of the terms and conditions.\n */\n getVersion() {\n return this.getOutputByName("version", "");\n }\n /**\n * Gets the date of the terms and conditions.\n */\n getCreateDate() {\n const t = this.getOutputByName("createDate", "");\n return new Date(t);\n }\n /**\n * Sets the callback\'s acceptance.\n */\n setAccepted(t = !0) {\n this.setInputValue(t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/text-input-callback.js\n\nclass text_input_callback_r extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(t) {\n super(t), this.payload = t;\n }\n /**\n * Gets the callback\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Sets the callback\'s input value.\n */\n setInput(t) {\n this.setInputValue(t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/validated-create-password-callback.js\n\nclass validated_create_password_callback_i extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n super(e), this.payload = e;\n }\n /**\n * Gets the callback\'s failed policies.\n */\n getFailedPolicies() {\n const e = this.getOutputByName(\n "failedPolicies",\n []\n );\n try {\n return e.map((t) => JSON.parse(t));\n } catch {\n throw new Error(\n \'Unable to parse "failed policies" from the ForgeRock server. The JSON within `ValidatedCreatePasswordCallback` was either malformed or missing.\'\n );\n }\n }\n /**\n * Gets the callback\'s applicable policies.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getPolicies() {\n return this.getOutputByName("policies", {});\n }\n /**\n * Gets the callback\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Gets whether the password is required.\n */\n isRequired() {\n return this.getOutputByName("required", !1);\n }\n /**\n * Sets the callback\'s password.\n */\n setPassword(e) {\n this.setInputValue(e);\n }\n /**\n * Set if validating value only.\n */\n setValidateOnly(e) {\n this.setInputValue(e, /validateOnly/);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/validated-create-username-callback.js\n\nclass validated_create_username_callback_s extends callbacks_r {\n /**\n * @param payload The raw payload returned by OpenAM\n */\n constructor(e) {\n super(e), this.payload = e;\n }\n /**\n * Gets the callback\'s prompt.\n */\n getPrompt() {\n return this.getOutputByName("prompt", "");\n }\n /**\n * Gets the callback\'s failed policies.\n */\n getFailedPolicies() {\n const e = this.getOutputByName(\n "failedPolicies",\n []\n );\n try {\n return e.map((t) => JSON.parse(t));\n } catch {\n throw new Error(\n \'Unable to parse "failed policies" from the ForgeRock server. The JSON within `ValidatedCreateUsernameCallback` was either malformed or missing.\'\n );\n }\n }\n /**\n * Gets the callback\'s applicable policies.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getPolicies() {\n return this.getOutputByName("policies", {});\n }\n /**\n * Gets whether the username is required.\n */\n isRequired() {\n return this.getOutputByName("required", !1);\n }\n /**\n * Sets the callback\'s username.\n */\n setName(e) {\n this.setInputValue(e);\n }\n /**\n * Set if validating value only.\n */\n setValidateOnly(e) {\n this.setInputValue(e, /validateOnly/);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/callbacks/factory.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction X(e) {\n switch (e.type) {\n case enums_l.BooleanAttributeInputCallback:\n return new s(e);\n case enums_l.ChoiceCallback:\n return new choice_callback_h(e);\n case enums_l.ConfirmationCallback:\n return new confirmation_callback_i(e);\n case enums_l.DeviceProfileCallback:\n return new device_profile_callback_i(e);\n case enums_l.HiddenValueCallback:\n return new hidden_value_callback_t(e);\n case enums_l.KbaCreateCallback:\n return new kba_create_callback_u(e);\n case enums_l.MetadataCallback:\n return new metadata_callback_s(e);\n case enums_l.NameCallback:\n return new name_callback_r(e);\n case enums_l.NumberAttributeInputCallback:\n return new s(e);\n case enums_l.PasswordCallback:\n return new password_callback_r(e);\n case enums_l.PingOneProtectEvaluationCallback:\n return new ping_protect_evaluation_callback_r(e);\n case enums_l.PingOneProtectInitializeCallback:\n return new ping_protect_initialize_callback_i(e);\n case enums_l.PollingWaitCallback:\n return new polling_wait_callback_r(e);\n case enums_l.ReCaptchaCallback:\n return new recaptcha_callback_r(e);\n case enums_l.ReCaptchaEnterpriseCallback:\n return new recaptcha_enterprise_callback_r(e);\n case enums_l.RedirectCallback:\n return new c(e);\n case enums_l.SelectIdPCallback:\n return new d(e);\n case enums_l.StringAttributeInputCallback:\n return new s(e);\n case enums_l.SuspendedTextOutputCallback:\n return new a(e);\n case enums_l.TermsAndConditionsCallback:\n return new terms_and_conditions_callback_a(e);\n case enums_l.TextInputCallback:\n return new text_input_callback_r(e);\n case enums_l.TextOutputCallback:\n return new text_output_callback_u(e);\n case enums_l.ValidatedCreatePasswordCallback:\n return new validated_create_password_callback_i(e);\n case enums_l.ValidatedCreateUsernameCallback:\n return new validated_create_username_callback_s(e);\n default:\n return new callbacks_r(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/fr-step.js\n\n\nclass fr_step_i {\n /**\n * @param payload The raw payload returned by OpenAM\n * @param callbackFactory A function that returns am implementation of FRCallback\n */\n constructor(t, e) {\n this.payload = t, this.type = enums_r.Step, this.callbacks = [], t.callbacks && (this.callbacks = this.convertCallbacks(t.callbacks, e));\n }\n /**\n * Gets the first callback of the specified type in this step.\n *\n * @param type The type of callback to find.\n */\n getCallbackOfType(t) {\n const e = this.getCallbacksOfType(t);\n if (e.length !== 1)\n throw new Error(`Expected 1 callback of type "${t}", but found ${e.length}`);\n return e[0];\n }\n /**\n * Gets all callbacks of the specified type in this step.\n *\n * @param type The type of callback to find.\n */\n getCallbacksOfType(t) {\n return this.callbacks.filter((e) => e.getType() === t);\n }\n /**\n * Sets the value of the first callback of the specified type in this step.\n *\n * @param type The type of callback to find.\n * @param value The value to set for the callback.\n */\n setCallbackValue(t, e) {\n const a = this.getCallbacksOfType(t);\n if (a.length !== 1)\n throw new Error(`Expected 1 callback of type "${t}", but found ${a.length}`);\n a[0].setInputValue(e);\n }\n /**\n * Gets the step\'s description.\n */\n getDescription() {\n return this.payload.description;\n }\n /**\n * Gets the step\'s header.\n */\n getHeader() {\n return this.payload.header;\n }\n /**\n * Gets the step\'s stage.\n */\n getStage() {\n return this.payload.stage;\n }\n convertCallbacks(t, e) {\n return t.map((l) => (e || X)(l) || X(l));\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-auth/index.js\n\n\n\n\n\n\nclass fr_auth_f {\n static get previousStepKey() {\n return `${config_c.get().prefix}-PreviousStep`;\n }\n /**\n * Requests the next step in the authentication tree.\n *\n * Call `FRAuth.next()` recursively. At each step, check for session token or error, otherwise\n * populate the step\'s callbacks and call `next()` again.\n *\n * Example:\n *\n * ```js\n * async function nextStep(previousStep) {\n * const thisStep = await FRAuth.next(previousStep);\n *\n * switch (thisStep.type) {\n * case StepType.LoginSuccess:\n * const token = thisStep.getSessionToken();\n * break;\n * case StepType.LoginFailure:\n * const detail = thisStep.getDetail();\n * break;\n * case StepType.Step:\n * // Populate `thisStep` callbacks here, and then continue\n * thisStep.setInputValue(\'foo\');\n * nextStep(thisStep);\n * break;\n * }\n * }\n * ```\n *\n * @param previousStep The previous step with its callback values populated\n * @param options Configuration overrides\n * @return The next step in the authentication tree\n */\n static async next(t, r) {\n const e = await J.next(t ? t.payload : void 0, r);\n if (e.authId) {\n const a = r ? r.callbackFactory : void 0;\n return new fr_step_i(e, a);\n }\n return !e.authId && e.ok ? new fr_login_success_r(e) : new i(e);\n }\n /**\n * Redirects to the URL identified in the RedirectCallback and saves the full\n * step information to localStorage for retrieval when user returns from login.\n *\n * Example:\n * ```js\n * forgerock.FRAuth.redirect(step);\n * ```\n */\n static redirect(t) {\n const e = t.getCallbackOfType(enums_l.RedirectCallback).getRedirectUrl();\n localStorage.setItem(this.previousStepKey, JSON.stringify(t)), location.assign(e);\n }\n /**\n * Resumes a tree after returning from an external client or provider.\n * Requires the full URL of the current window. It will parse URL for\n * key-value pairs as well as, if required, retrieves previous step.\n *\n * Example;\n * ```js\n * forgerock.FRAuth.resume(window.location.href)\n * ```\n */\n static async resume(t, r) {\n const e = new URL(t), a = e.searchParams.get("code"), n = e.searchParams.get("error"), i = e.searchParams.get("errorCode"), m = e.searchParams.get("errorMessage"), s = e.searchParams.get("form_post_entry"), l = e.searchParams.get("nonce"), u = e.searchParams.get("RelayState"), o = e.searchParams.get("responsekey"), d = e.searchParams.get("scope"), c = e.searchParams.get("state"), p = e.searchParams.get("suspendedId"), g = e.searchParams.get("authIndexValue") ?? void 0;\n let h;\n function S() {\n return a && c || s || o;\n }\n if (S()) {\n const y = localStorage.getItem(this.previousStepKey);\n if (!y)\n throw new Error("Error: could not retrieve original redirect information.");\n try {\n h = JSON.parse(y);\n } catch {\n throw new Error("Error: could not parse redirect params or step information");\n }\n localStorage.removeItem(this.previousStepKey);\n }\n const P = {\n ...r,\n query: {\n // Conditionally spread properties into object. Don\'t spread props with undefined/null.\n ...a && { code: a },\n ...n && { error: n },\n ...i && { errorCode: i },\n ...m && { errorMessage: m },\n ...s && { form_post_entry: s },\n ...l && { nonce: l },\n ...u && { RelayState: u },\n ...o && { responsekey: o },\n ...d && { scope: d },\n ...c && { state: c },\n ...p && { suspendedId: p },\n // Allow developer to add or override params with their own.\n ...r && r.query\n },\n ...(r?.tree ?? g) && {\n tree: r?.tree ?? g\n }\n };\n return await this.next(h, P);\n }\n /**\n * Requests the first step in the authentication tree.\n * This is essentially an alias to calling FRAuth.next without a previous step.\n *\n * @param options Configuration overrides\n * @return The next step in the authentication tree\n */\n static async start(t) {\n return await fr_auth_f.next(void 0, t);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/node_modules/redux/dist/redux.mjs\n// src/utils/formatProdErrorMessage.ts\nfunction formatProdErrorMessage(code) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `;\n}\n\n// src/utils/symbol-observable.ts\nvar $$observable = /* @__PURE__ */ (() => typeof Symbol === "function" && Symbol.observable || "@@observable")();\nvar symbol_observable_default = $$observable;\n\n// src/utils/actionTypes.ts\nvar randomString = () => Math.random().toString(36).substring(7).split("").join(".");\nvar ActionTypes = {\n INIT: `@@redux/INIT${/* @__PURE__ */ randomString()}`,\n REPLACE: `@@redux/REPLACE${/* @__PURE__ */ randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nvar actionTypes_default = ActionTypes;\n\n// src/utils/isPlainObject.ts\nfunction redux_isPlainObject(obj) {\n if (typeof obj !== "object" || obj === null)\n return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}\n\n// src/utils/kindOf.ts\nfunction miniKindOf(val) {\n if (val === void 0)\n return "undefined";\n if (val === null)\n return "null";\n const type = typeof val;\n switch (type) {\n case "boolean":\n case "string":\n case "number":\n case "symbol":\n case "function": {\n return type;\n }\n }\n if (Array.isArray(val))\n return "array";\n if (isDate(val))\n return "date";\n if (isError(val))\n return "error";\n const constructorName = ctorName(val);\n switch (constructorName) {\n case "Symbol":\n case "Promise":\n case "WeakMap":\n case "WeakSet":\n case "Map":\n case "Set":\n return constructorName;\n }\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, "");\n}\nfunction ctorName(val) {\n return typeof val.constructor === "function" ? val.constructor.name : null;\n}\nfunction isError(val) {\n return val instanceof Error || typeof val.message === "string" && val.constructor && typeof val.constructor.stackTraceLimit === "number";\n}\nfunction isDate(val) {\n if (val instanceof Date)\n return true;\n return typeof val.toDateString === "function" && typeof val.getDate === "function" && typeof val.setDate === "function";\n}\nfunction kindOf(val) {\n let typeOfVal = typeof val;\n if (false) // removed by dead control flow\n{}\n return typeOfVal;\n}\n\n// src/createStore.ts\nfunction createStore(reducer, preloadedState, enhancer) {\n if (typeof reducer !== "function") {\n throw new Error( true ? formatProdErrorMessage(2) : 0);\n }\n if (typeof preloadedState === "function" && typeof enhancer === "function" || typeof enhancer === "function" && typeof arguments[3] === "function") {\n throw new Error( true ? formatProdErrorMessage(0) : 0);\n }\n if (typeof preloadedState === "function" && typeof enhancer === "undefined") {\n enhancer = preloadedState;\n preloadedState = void 0;\n }\n if (typeof enhancer !== "undefined") {\n if (typeof enhancer !== "function") {\n throw new Error( true ? formatProdErrorMessage(1) : 0);\n }\n return enhancer(createStore)(reducer, preloadedState);\n }\n let currentReducer = reducer;\n let currentState = preloadedState;\n let currentListeners = /* @__PURE__ */ new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = /* @__PURE__ */ new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n function getState() {\n if (isDispatching) {\n throw new Error( true ? formatProdErrorMessage(3) : 0);\n }\n return currentState;\n }\n function subscribe(listener) {\n if (typeof listener !== "function") {\n throw new Error( true ? formatProdErrorMessage(4) : 0);\n }\n if (isDispatching) {\n throw new Error( true ? formatProdErrorMessage(5) : 0);\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error( true ? formatProdErrorMessage(6) : 0);\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n function dispatch(action) {\n if (!redux_isPlainObject(action)) {\n throw new Error( true ? formatProdErrorMessage(7) : 0);\n }\n if (typeof action.type === "undefined") {\n throw new Error( true ? formatProdErrorMessage(8) : 0);\n }\n if (typeof action.type !== "string") {\n throw new Error( true ? formatProdErrorMessage(17) : 0);\n }\n if (isDispatching) {\n throw new Error( true ? formatProdErrorMessage(9) : 0);\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach((listener) => {\n listener();\n });\n return action;\n }\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== "function") {\n throw new Error( true ? formatProdErrorMessage(10) : 0);\n }\n currentReducer = nextReducer;\n dispatch({\n type: actionTypes_default.REPLACE\n });\n }\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer) {\n if (typeof observer !== "object" || observer === null) {\n throw new Error( true ? formatProdErrorMessage(11) : 0);\n }\n function observeState() {\n const observerAsObserver = observer;\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [symbol_observable_default]() {\n return this;\n }\n };\n }\n dispatch({\n type: actionTypes_default.INIT\n });\n const store = {\n dispatch,\n subscribe,\n getState,\n replaceReducer,\n [symbol_observable_default]: observable\n };\n return store;\n}\nfunction legacy_createStore(reducer, preloadedState, enhancer) {\n return createStore(reducer, preloadedState, enhancer);\n}\n\n// src/utils/warning.ts\nfunction warning(message) {\n if (typeof console !== "undefined" && typeof console.error === "function") {\n console.error(message);\n }\n try {\n throw new Error(message);\n } catch (e) {\n }\n}\n\n// src/combineReducers.ts\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n const reducerKeys = Object.keys(reducers);\n const argumentName = action && action.type === actionTypes_default.INIT ? "preloadedState argument passed to createStore" : "previous state received by the reducer";\n if (reducerKeys.length === 0) {\n return "Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.";\n }\n if (!redux_isPlainObject(inputState)) {\n return `The ${argumentName} has unexpected type of "${kindOf(inputState)}". Expected argument to be an object with the following keys: "${reducerKeys.join(\'", "\')}"`;\n }\n const unexpectedKeys = Object.keys(inputState).filter((key) => !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]);\n unexpectedKeys.forEach((key) => {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === actionTypes_default.REPLACE)\n return;\n if (unexpectedKeys.length > 0) {\n return `Unexpected ${unexpectedKeys.length > 1 ? "keys" : "key"} "${unexpectedKeys.join(\'", "\')}" found in ${argumentName}. Expected to find one of the known reducer keys instead: "${reducerKeys.join(\'", "\')}". Unexpected keys will be ignored.`;\n }\n}\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach((key) => {\n const reducer = reducers[key];\n const initialState = reducer(void 0, {\n type: actionTypes_default.INIT\n });\n if (typeof initialState === "undefined") {\n throw new Error( true ? formatProdErrorMessage(12) : 0);\n }\n if (typeof reducer(void 0, {\n type: actionTypes_default.PROBE_UNKNOWN_ACTION()\n }) === "undefined") {\n throw new Error( true ? formatProdErrorMessage(13) : 0);\n }\n });\n}\nfunction combineReducers(reducers) {\n const reducerKeys = Object.keys(reducers);\n const finalReducers = {};\n for (let i = 0; i < reducerKeys.length; i++) {\n const key = reducerKeys[i];\n if (false) // removed by dead control flow\n{}\n if (typeof reducers[key] === "function") {\n finalReducers[key] = reducers[key];\n }\n }\n const finalReducerKeys = Object.keys(finalReducers);\n let unexpectedKeyCache;\n if (false) // removed by dead control flow\n{}\n let shapeAssertionError;\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n return function combination(state = {}, action) {\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n if (false) // removed by dead control flow\n{}\n let hasChanged = false;\n const nextState = {};\n for (let i = 0; i < finalReducerKeys.length; i++) {\n const key = finalReducerKeys[i];\n const reducer = finalReducers[key];\n const previousStateForKey = state[key];\n const nextStateForKey = reducer(previousStateForKey, action);\n if (typeof nextStateForKey === "undefined") {\n const actionType = action && action.type;\n throw new Error( true ? formatProdErrorMessage(14) : 0);\n }\n nextState[key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\n// src/bindActionCreators.ts\nfunction bindActionCreator(actionCreator, dispatch) {\n return function(...args) {\n return dispatch(actionCreator.apply(this, args));\n };\n}\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === "function") {\n return bindActionCreator(actionCreators, dispatch);\n }\n if (typeof actionCreators !== "object" || actionCreators === null) {\n throw new Error( true ? formatProdErrorMessage(16) : 0);\n }\n const boundActionCreators = {};\n for (const key in actionCreators) {\n const actionCreator = actionCreators[key];\n if (typeof actionCreator === "function") {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n return boundActionCreators;\n}\n\n// src/compose.ts\nfunction compose(...funcs) {\n if (funcs.length === 0) {\n return (arg) => arg;\n }\n if (funcs.length === 1) {\n return funcs[0];\n }\n return funcs.reduce((a, b) => (...args) => a(b(...args)));\n}\n\n// src/applyMiddleware.ts\nfunction applyMiddleware(...middlewares) {\n return (createStore2) => (reducer, preloadedState) => {\n const store = createStore2(reducer, preloadedState);\n let dispatch = () => {\n throw new Error( true ? formatProdErrorMessage(15) : 0);\n };\n const middlewareAPI = {\n getState: store.getState,\n dispatch: (action, ...args) => dispatch(action, ...args)\n };\n const chain = middlewares.map((middleware) => middleware(middlewareAPI));\n dispatch = compose(...chain)(store.dispatch);\n return {\n ...store,\n dispatch\n };\n };\n}\n\n// src/utils/isAction.ts\nfunction redux_isAction(action) {\n return redux_isPlainObject(action) && "type" in action && typeof action.type === "string";\n}\n\n//# sourceMappingURL=redux.mjs.map\n;// ./node_modules/@forgerock/javascript-sdk/node_modules/redux-thunk/dist/redux-thunk.mjs\n// src/index.ts\nfunction createThunkMiddleware(extraArgument) {\n const middleware = ({ dispatch, getState }) => (next) => (action) => {\n if (typeof action === "function") {\n return action(dispatch, getState, extraArgument);\n }\n return next(action);\n };\n return middleware;\n}\nvar redux_thunk_thunk = createThunkMiddleware();\nvar withExtraArgument = createThunkMiddleware;\n\n\n;// ./node_modules/immer/dist/immer.mjs\n// src/utils/env.ts\nvar NOTHING = Symbol.for("immer-nothing");\nvar DRAFTABLE = Symbol.for("immer-draftable");\nvar DRAFT_STATE = Symbol.for("immer-state");\n\n// src/utils/errors.ts\nvar errors = false ? 0 : [];\nfunction die(error, ...args) {\n if (false) // removed by dead control flow\n{}\n throw new Error(\n `[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n );\n}\n\n// src/utils/common.ts\nvar getPrototypeOf = Object.getPrototypeOf;\nfunction immer_isDraft(value) {\n return !!value && !!value[DRAFT_STATE];\n}\nfunction isDraftable(value) {\n if (!value)\n return false;\n return immer_isPlainObject(value) || Array.isArray(value) || !!value[DRAFTABLE] || !!value.constructor?.[DRAFTABLE] || isMap(value) || isSet(value);\n}\nvar objectCtorString = Object.prototype.constructor.toString();\nfunction immer_isPlainObject(value) {\n if (!value || typeof value !== "object")\n return false;\n const proto = getPrototypeOf(value);\n if (proto === null) {\n return true;\n }\n const Ctor = Object.hasOwnProperty.call(proto, "constructor") && proto.constructor;\n if (Ctor === Object)\n return true;\n return typeof Ctor == "function" && Function.toString.call(Ctor) === objectCtorString;\n}\nfunction original(value) {\n if (!immer_isDraft(value))\n die(15, value);\n return value[DRAFT_STATE].base_;\n}\nfunction each(obj, iter) {\n if (getArchtype(obj) === 0 /* Object */) {\n Reflect.ownKeys(obj).forEach((key) => {\n iter(key, obj[key], obj);\n });\n } else {\n obj.forEach((entry, index) => iter(index, entry, obj));\n }\n}\nfunction getArchtype(thing) {\n const state = thing[DRAFT_STATE];\n return state ? state.type_ : Array.isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;\n}\nfunction has(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.has(prop) : Object.prototype.hasOwnProperty.call(thing, prop);\n}\nfunction get(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.get(prop) : thing[prop];\n}\nfunction set(thing, propOrOldValue, value) {\n const t = getArchtype(thing);\n if (t === 2 /* Map */)\n thing.set(propOrOldValue, value);\n else if (t === 3 /* Set */) {\n thing.add(value);\n } else\n thing[propOrOldValue] = value;\n}\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\nfunction isMap(target) {\n return target instanceof Map;\n}\nfunction isSet(target) {\n return target instanceof Set;\n}\nfunction latest(state) {\n return state.copy_ || state.base_;\n}\nfunction shallowCopy(base, strict) {\n if (isMap(base)) {\n return new Map(base);\n }\n if (isSet(base)) {\n return new Set(base);\n }\n if (Array.isArray(base))\n return Array.prototype.slice.call(base);\n const isPlain = immer_isPlainObject(base);\n if (strict === true || strict === "class_only" && !isPlain) {\n const descriptors = Object.getOwnPropertyDescriptors(base);\n delete descriptors[DRAFT_STATE];\n let keys = Reflect.ownKeys(descriptors);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const desc = descriptors[key];\n if (desc.writable === false) {\n desc.writable = true;\n desc.configurable = true;\n }\n if (desc.get || desc.set)\n descriptors[key] = {\n configurable: true,\n writable: true,\n // could live with !!desc.set as well here...\n enumerable: desc.enumerable,\n value: base[key]\n };\n }\n return Object.create(getPrototypeOf(base), descriptors);\n } else {\n const proto = getPrototypeOf(base);\n if (proto !== null && isPlain) {\n return { ...base };\n }\n const obj = Object.create(proto);\n return Object.assign(obj, base);\n }\n}\nfunction freeze(obj, deep = false) {\n if (isFrozen(obj) || immer_isDraft(obj) || !isDraftable(obj))\n return obj;\n if (getArchtype(obj) > 1) {\n obj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections;\n }\n Object.freeze(obj);\n if (deep)\n Object.entries(obj).forEach(([key, value]) => freeze(value, true));\n return obj;\n}\nfunction dontMutateFrozenCollections() {\n die(2);\n}\nfunction isFrozen(obj) {\n return Object.isFrozen(obj);\n}\n\n// src/utils/plugins.ts\nvar plugins = {};\nfunction getPlugin(pluginKey) {\n const plugin = plugins[pluginKey];\n if (!plugin) {\n die(0, pluginKey);\n }\n return plugin;\n}\nfunction loadPlugin(pluginKey, implementation) {\n if (!plugins[pluginKey])\n plugins[pluginKey] = implementation;\n}\n\n// src/core/scope.ts\nvar currentScope;\nfunction getCurrentScope() {\n return currentScope;\n}\nfunction createScope(parent_, immer_) {\n return {\n drafts_: [],\n parent_,\n immer_,\n // Whenever the modified draft contains a draft from another scope, we\n // need to prevent auto-freezing so the unowned draft can be finalized.\n canAutoFreeze_: true,\n unfinalizedDrafts_: 0\n };\n}\nfunction usePatchesInScope(scope, patchListener) {\n if (patchListener) {\n getPlugin("Patches");\n scope.patches_ = [];\n scope.inversePatches_ = [];\n scope.patchListener_ = patchListener;\n }\n}\nfunction revokeScope(scope) {\n leaveScope(scope);\n scope.drafts_.forEach(revokeDraft);\n scope.drafts_ = null;\n}\nfunction leaveScope(scope) {\n if (scope === currentScope) {\n currentScope = scope.parent_;\n }\n}\nfunction enterScope(immer2) {\n return currentScope = createScope(currentScope, immer2);\n}\nfunction revokeDraft(draft) {\n const state = draft[DRAFT_STATE];\n if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)\n state.revoke_();\n else\n state.revoked_ = true;\n}\n\n// src/core/finalize.ts\nfunction processResult(result, scope) {\n scope.unfinalizedDrafts_ = scope.drafts_.length;\n const baseDraft = scope.drafts_[0];\n const isReplaced = result !== void 0 && result !== baseDraft;\n if (isReplaced) {\n if (baseDraft[DRAFT_STATE].modified_) {\n revokeScope(scope);\n die(4);\n }\n if (isDraftable(result)) {\n result = finalize(scope, result);\n if (!scope.parent_)\n maybeFreeze(scope, result);\n }\n if (scope.patches_) {\n getPlugin("Patches").generateReplacementPatches_(\n baseDraft[DRAFT_STATE].base_,\n result,\n scope.patches_,\n scope.inversePatches_\n );\n }\n } else {\n result = finalize(scope, baseDraft, []);\n }\n revokeScope(scope);\n if (scope.patches_) {\n scope.patchListener_(scope.patches_, scope.inversePatches_);\n }\n return result !== NOTHING ? result : void 0;\n}\nfunction finalize(rootScope, value, path) {\n if (isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n if (!state) {\n each(\n value,\n (key, childValue) => finalizeProperty(rootScope, state, value, key, childValue, path)\n );\n return value;\n }\n if (state.scope_ !== rootScope)\n return value;\n if (!state.modified_) {\n maybeFreeze(rootScope, state.base_, true);\n return state.base_;\n }\n if (!state.finalized_) {\n state.finalized_ = true;\n state.scope_.unfinalizedDrafts_--;\n const result = state.copy_;\n let resultEach = result;\n let isSet2 = false;\n if (state.type_ === 3 /* Set */) {\n resultEach = new Set(result);\n result.clear();\n isSet2 = true;\n }\n each(\n resultEach,\n (key, childValue) => finalizeProperty(rootScope, state, result, key, childValue, path, isSet2)\n );\n maybeFreeze(rootScope, result, false);\n if (path && rootScope.patches_) {\n getPlugin("Patches").generatePatches_(\n state,\n path,\n rootScope.patches_,\n rootScope.inversePatches_\n );\n }\n }\n return state.copy_;\n}\nfunction finalizeProperty(rootScope, parentState, targetObject, prop, childValue, rootPath, targetIsSet) {\n if (false)\n // removed by dead control flow\n{}\n if (immer_isDraft(childValue)) {\n const path = rootPath && parentState && parentState.type_ !== 3 /* Set */ && // Set objects are atomic since they have no keys.\n !has(parentState.assigned_, prop) ? rootPath.concat(prop) : void 0;\n const res = finalize(rootScope, childValue, path);\n set(targetObject, prop, res);\n if (immer_isDraft(res)) {\n rootScope.canAutoFreeze_ = false;\n } else\n return;\n } else if (targetIsSet) {\n targetObject.add(childValue);\n }\n if (isDraftable(childValue) && !isFrozen(childValue)) {\n if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n return;\n }\n finalize(rootScope, childValue);\n if ((!parentState || !parentState.scope_.parent_) && typeof prop !== "symbol" && Object.prototype.propertyIsEnumerable.call(targetObject, prop))\n maybeFreeze(rootScope, childValue);\n }\n}\nfunction maybeFreeze(scope, value, deep = false) {\n if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n freeze(value, deep);\n }\n}\n\n// src/core/proxy.ts\nfunction createProxyProxy(base, parent) {\n const isArray = Array.isArray(base);\n const state = {\n type_: isArray ? 1 /* Array */ : 0 /* Object */,\n // Track which produce call this is associated with.\n scope_: parent ? parent.scope_ : getCurrentScope(),\n // True for both shallow and deep changes.\n modified_: false,\n // Used during finalization.\n finalized_: false,\n // Track which properties have been assigned (true) or deleted (false).\n assigned_: {},\n // The parent draft state.\n parent_: parent,\n // The base state.\n base_: base,\n // The base proxy.\n draft_: null,\n // set below\n // The base copy with any updated values.\n copy_: null,\n // Called by the `produce` function.\n revoke_: null,\n isManual_: false\n };\n let target = state;\n let traps = objectTraps;\n if (isArray) {\n target = [state];\n traps = arrayTraps;\n }\n const { revoke, proxy } = Proxy.revocable(target, traps);\n state.draft_ = proxy;\n state.revoke_ = revoke;\n return proxy;\n}\nvar objectTraps = {\n get(state, prop) {\n if (prop === DRAFT_STATE)\n return state;\n const source = latest(state);\n if (!has(source, prop)) {\n return readPropFromProto(state, source, prop);\n }\n const value = source[prop];\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value === peek(state.base_, prop)) {\n prepareCopy(state);\n return state.copy_[prop] = createProxy(value, state);\n }\n return value;\n },\n has(state, prop) {\n return prop in latest(state);\n },\n ownKeys(state) {\n return Reflect.ownKeys(latest(state));\n },\n set(state, prop, value) {\n const desc = getDescriptorFromProto(latest(state), prop);\n if (desc?.set) {\n desc.set.call(state.draft_, value);\n return true;\n }\n if (!state.modified_) {\n const current2 = peek(latest(state), prop);\n const currentState = current2?.[DRAFT_STATE];\n if (currentState && currentState.base_ === value) {\n state.copy_[prop] = value;\n state.assigned_[prop] = false;\n return true;\n }\n if (is(value, current2) && (value !== void 0 || has(state.base_, prop)))\n return true;\n prepareCopy(state);\n markChanged(state);\n }\n if (state.copy_[prop] === value && // special case: handle new props with value \'undefined\'\n (value !== void 0 || prop in state.copy_) || // special case: NaN\n Number.isNaN(value) && Number.isNaN(state.copy_[prop]))\n return true;\n state.copy_[prop] = value;\n state.assigned_[prop] = true;\n return true;\n },\n deleteProperty(state, prop) {\n if (peek(state.base_, prop) !== void 0 || prop in state.base_) {\n state.assigned_[prop] = false;\n prepareCopy(state);\n markChanged(state);\n } else {\n delete state.assigned_[prop];\n }\n if (state.copy_) {\n delete state.copy_[prop];\n }\n return true;\n },\n // Note: We never coerce `desc.value` into an Immer draft, because we can\'t make\n // the same guarantee in ES5 mode.\n getOwnPropertyDescriptor(state, prop) {\n const owner = latest(state);\n const desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n if (!desc)\n return desc;\n return {\n writable: true,\n configurable: state.type_ !== 1 /* Array */ || prop !== "length",\n enumerable: desc.enumerable,\n value: owner[prop]\n };\n },\n defineProperty() {\n die(11);\n },\n getPrototypeOf(state) {\n return getPrototypeOf(state.base_);\n },\n setPrototypeOf() {\n die(12);\n }\n};\nvar arrayTraps = {};\neach(objectTraps, (key, fn) => {\n arrayTraps[key] = function() {\n arguments[0] = arguments[0][0];\n return fn.apply(this, arguments);\n };\n});\narrayTraps.deleteProperty = function(state, prop) {\n if (false)\n // removed by dead control flow\n{}\n return arrayTraps.set.call(this, state, prop, void 0);\n};\narrayTraps.set = function(state, prop, value) {\n if (false)\n // removed by dead control flow\n{}\n return objectTraps.set.call(this, state[0], prop, value, state[0]);\n};\nfunction peek(draft, prop) {\n const state = draft[DRAFT_STATE];\n const source = state ? latest(state) : draft;\n return source[prop];\n}\nfunction readPropFromProto(state, source, prop) {\n const desc = getDescriptorFromProto(source, prop);\n return desc ? `value` in desc ? desc.value : (\n // This is a very special case, if the prop is a getter defined by the\n // prototype, we should invoke it with the draft as context!\n desc.get?.call(state.draft_)\n ) : void 0;\n}\nfunction getDescriptorFromProto(source, prop) {\n if (!(prop in source))\n return void 0;\n let proto = getPrototypeOf(source);\n while (proto) {\n const desc = Object.getOwnPropertyDescriptor(proto, prop);\n if (desc)\n return desc;\n proto = getPrototypeOf(proto);\n }\n return void 0;\n}\nfunction markChanged(state) {\n if (!state.modified_) {\n state.modified_ = true;\n if (state.parent_) {\n markChanged(state.parent_);\n }\n }\n}\nfunction prepareCopy(state) {\n if (!state.copy_) {\n state.copy_ = shallowCopy(\n state.base_,\n state.scope_.immer_.useStrictShallowCopy_\n );\n }\n}\n\n// src/core/immerClass.ts\nvar Immer2 = class {\n constructor(config) {\n this.autoFreeze_ = true;\n this.useStrictShallowCopy_ = false;\n /**\n * The `produce` function takes a value and a "recipe function" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a "curried producer" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\n this.produce = (base, recipe, patchListener) => {\n if (typeof base === "function" && typeof recipe !== "function") {\n const defaultBase = recipe;\n recipe = base;\n const self = this;\n return function curriedProduce(base2 = defaultBase, ...args) {\n return self.produce(base2, (draft) => recipe.call(this, draft, ...args));\n };\n }\n if (typeof recipe !== "function")\n die(6);\n if (patchListener !== void 0 && typeof patchListener !== "function")\n die(7);\n let result;\n if (isDraftable(base)) {\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n let hasError = true;\n try {\n result = recipe(proxy);\n hasError = false;\n } finally {\n if (hasError)\n revokeScope(scope);\n else\n leaveScope(scope);\n }\n usePatchesInScope(scope, patchListener);\n return processResult(result, scope);\n } else if (!base || typeof base !== "object") {\n result = recipe(base);\n if (result === void 0)\n result = base;\n if (result === NOTHING)\n result = void 0;\n if (this.autoFreeze_)\n freeze(result, true);\n if (patchListener) {\n const p = [];\n const ip = [];\n getPlugin("Patches").generateReplacementPatches_(base, result, p, ip);\n patchListener(p, ip);\n }\n return result;\n } else\n die(1, base);\n };\n this.produceWithPatches = (base, recipe) => {\n if (typeof base === "function") {\n return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));\n }\n let patches, inversePatches;\n const result = this.produce(base, recipe, (p, ip) => {\n patches = p;\n inversePatches = ip;\n });\n return [result, patches, inversePatches];\n };\n if (typeof config?.autoFreeze === "boolean")\n this.setAutoFreeze(config.autoFreeze);\n if (typeof config?.useStrictShallowCopy === "boolean")\n this.setUseStrictShallowCopy(config.useStrictShallowCopy);\n }\n createDraft(base) {\n if (!isDraftable(base))\n die(8);\n if (immer_isDraft(base))\n base = immer_current(base);\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n proxy[DRAFT_STATE].isManual_ = true;\n leaveScope(scope);\n return proxy;\n }\n finishDraft(draft, patchListener) {\n const state = draft && draft[DRAFT_STATE];\n if (!state || !state.isManual_)\n die(9);\n const { scope_: scope } = state;\n usePatchesInScope(scope, patchListener);\n return processResult(void 0, scope);\n }\n /**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * By default, auto-freezing is enabled.\n */\n setAutoFreeze(value) {\n this.autoFreeze_ = value;\n }\n /**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\n setUseStrictShallowCopy(value) {\n this.useStrictShallowCopy_ = value;\n }\n applyPatches(base, patches) {\n let i;\n for (i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (patch.path.length === 0 && patch.op === "replace") {\n base = patch.value;\n break;\n }\n }\n if (i > -1) {\n patches = patches.slice(i + 1);\n }\n const applyPatchesImpl = getPlugin("Patches").applyPatches_;\n if (immer_isDraft(base)) {\n return applyPatchesImpl(base, patches);\n }\n return this.produce(\n base,\n (draft) => applyPatchesImpl(draft, patches)\n );\n }\n};\nfunction createProxy(value, parent) {\n const draft = isMap(value) ? getPlugin("MapSet").proxyMap_(value, parent) : isSet(value) ? getPlugin("MapSet").proxySet_(value, parent) : createProxyProxy(value, parent);\n const scope = parent ? parent.scope_ : getCurrentScope();\n scope.drafts_.push(draft);\n return draft;\n}\n\n// src/core/current.ts\nfunction immer_current(value) {\n if (!immer_isDraft(value))\n die(10, value);\n return currentImpl(value);\n}\nfunction currentImpl(value) {\n if (!isDraftable(value) || isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n let copy;\n if (state) {\n if (!state.modified_)\n return state.base_;\n state.finalized_ = true;\n copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);\n } else {\n copy = shallowCopy(value, true);\n }\n each(copy, (key, childValue) => {\n set(copy, key, currentImpl(childValue));\n });\n if (state) {\n state.finalized_ = false;\n }\n return copy;\n}\n\n// src/plugins/patches.ts\nfunction enablePatches() {\n const errorOffset = 16;\n if (false) // removed by dead control flow\n{}\n const REPLACE = "replace";\n const ADD = "add";\n const REMOVE = "remove";\n function generatePatches_(state, basePath, patches, inversePatches) {\n switch (state.type_) {\n case 0 /* Object */:\n case 2 /* Map */:\n return generatePatchesFromAssigned(\n state,\n basePath,\n patches,\n inversePatches\n );\n case 1 /* Array */:\n return generateArrayPatches(state, basePath, patches, inversePatches);\n case 3 /* Set */:\n return generateSetPatches(\n state,\n basePath,\n patches,\n inversePatches\n );\n }\n }\n function generateArrayPatches(state, basePath, patches, inversePatches) {\n let { base_, assigned_ } = state;\n let copy_ = state.copy_;\n if (copy_.length < base_.length) {\n ;\n [base_, copy_] = [copy_, base_];\n [patches, inversePatches] = [inversePatches, patches];\n }\n for (let i = 0; i < base_.length; i++) {\n if (assigned_[i] && copy_[i] !== base_[i]) {\n const path = basePath.concat([i]);\n patches.push({\n op: REPLACE,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n inversePatches.push({\n op: REPLACE,\n path,\n value: clonePatchValueIfNeeded(base_[i])\n });\n }\n }\n for (let i = base_.length; i < copy_.length; i++) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n }\n for (let i = copy_.length - 1; base_.length <= i; --i) {\n const path = basePath.concat([i]);\n inversePatches.push({\n op: REMOVE,\n path\n });\n }\n }\n function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n const { base_, copy_ } = state;\n each(state.assigned_, (key, assignedValue) => {\n const origValue = get(base_, key);\n const value = get(copy_, key);\n const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n if (origValue === value && op === REPLACE)\n return;\n const path = basePath.concat(key);\n patches.push(op === REMOVE ? { op, path } : { op, path, value });\n inversePatches.push(\n op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }\n );\n });\n }\n function generateSetPatches(state, basePath, patches, inversePatches) {\n let { base_, copy_ } = state;\n let i = 0;\n base_.forEach((value) => {\n if (!copy_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: REMOVE,\n path,\n value\n });\n inversePatches.unshift({\n op: ADD,\n path,\n value\n });\n }\n i++;\n });\n i = 0;\n copy_.forEach((value) => {\n if (!base_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n value\n });\n inversePatches.unshift({\n op: REMOVE,\n path,\n value\n });\n }\n i++;\n });\n }\n function generateReplacementPatches_(baseValue, replacement, patches, inversePatches) {\n patches.push({\n op: REPLACE,\n path: [],\n value: replacement === NOTHING ? void 0 : replacement\n });\n inversePatches.push({\n op: REPLACE,\n path: [],\n value: baseValue\n });\n }\n function applyPatches_(draft, patches) {\n patches.forEach((patch) => {\n const { path, op } = patch;\n let base = draft;\n for (let i = 0; i < path.length - 1; i++) {\n const parentType = getArchtype(base);\n let p = path[i];\n if (typeof p !== "string" && typeof p !== "number") {\n p = "" + p;\n }\n if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === "__proto__" || p === "constructor"))\n die(errorOffset + 3);\n if (typeof base === "function" && p === "prototype")\n die(errorOffset + 3);\n base = get(base, p);\n if (typeof base !== "object")\n die(errorOffset + 2, path.join("/"));\n }\n const type = getArchtype(base);\n const value = deepClonePatchValue(patch.value);\n const key = path[path.length - 1];\n switch (op) {\n case REPLACE:\n switch (type) {\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n die(errorOffset);\n default:\n return base[key] = value;\n }\n case ADD:\n switch (type) {\n case 1 /* Array */:\n return key === "-" ? base.push(value) : base.splice(key, 0, value);\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n return base.add(value);\n default:\n return base[key] = value;\n }\n case REMOVE:\n switch (type) {\n case 1 /* Array */:\n return base.splice(key, 1);\n case 2 /* Map */:\n return base.delete(key);\n case 3 /* Set */:\n return base.delete(patch.value);\n default:\n return delete base[key];\n }\n default:\n die(errorOffset + 1, op);\n }\n });\n return draft;\n }\n function deepClonePatchValue(obj) {\n if (!isDraftable(obj))\n return obj;\n if (Array.isArray(obj))\n return obj.map(deepClonePatchValue);\n if (isMap(obj))\n return new Map(\n Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n );\n if (isSet(obj))\n return new Set(Array.from(obj).map(deepClonePatchValue));\n const cloned = Object.create(getPrototypeOf(obj));\n for (const key in obj)\n cloned[key] = deepClonePatchValue(obj[key]);\n if (has(obj, DRAFTABLE))\n cloned[DRAFTABLE] = obj[DRAFTABLE];\n return cloned;\n }\n function clonePatchValueIfNeeded(obj) {\n if (immer_isDraft(obj)) {\n return deepClonePatchValue(obj);\n } else\n return obj;\n }\n loadPlugin("Patches", {\n applyPatches_,\n generatePatches_,\n generateReplacementPatches_\n });\n}\n\n// src/plugins/mapset.ts\nfunction enableMapSet() {\n class DraftMap extends Map {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 2 /* Map */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n assigned_: void 0,\n base_: target,\n draft_: this,\n isManual_: false,\n revoked_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(key) {\n return latest(this[DRAFT_STATE]).has(key);\n }\n set(key, value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!latest(state).has(key) || latest(state).get(key) !== value) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_.set(key, true);\n state.copy_.set(key, value);\n state.assigned_.set(key, true);\n }\n return this;\n }\n delete(key) {\n if (!this.has(key)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareMapCopy(state);\n markChanged(state);\n if (state.base_.has(key)) {\n state.assigned_.set(key, false);\n } else {\n state.assigned_.delete(key);\n }\n state.copy_.delete(key);\n return true;\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_ = /* @__PURE__ */ new Map();\n each(state.base_, (key) => {\n state.assigned_.set(key, false);\n });\n state.copy_.clear();\n }\n }\n forEach(cb, thisArg) {\n const state = this[DRAFT_STATE];\n latest(state).forEach((_value, key, _map) => {\n cb.call(thisArg, this.get(key), key, this);\n });\n }\n get(key) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n const value = latest(state).get(key);\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value !== state.base_.get(key)) {\n return value;\n }\n const draft = createProxy(value, state);\n prepareMapCopy(state);\n state.copy_.set(key, draft);\n return draft;\n }\n keys() {\n return latest(this[DRAFT_STATE]).keys();\n }\n values() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.values(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value\n };\n }\n };\n }\n entries() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.entries(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value: [r.value, value]\n };\n }\n };\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.entries();\n }\n }\n function proxyMap_(target, parent) {\n return new DraftMap(target, parent);\n }\n function prepareMapCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = new Map(state.base_);\n }\n }\n class DraftSet extends Set {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 3 /* Set */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n base_: target,\n draft_: this,\n drafts_: /* @__PURE__ */ new Map(),\n revoked_: false,\n isManual_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!state.copy_) {\n return state.base_.has(value);\n }\n if (state.copy_.has(value))\n return true;\n if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n return true;\n return false;\n }\n add(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!this.has(value)) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.add(value);\n }\n return this;\n }\n delete(value) {\n if (!this.has(value)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n markChanged(state);\n return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (\n /* istanbul ignore next */\n false\n ));\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.clear();\n }\n }\n values() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.values();\n }\n entries() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.entries();\n }\n keys() {\n return this.values();\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.values();\n }\n forEach(cb, thisArg) {\n const iterator = this.values();\n let result = iterator.next();\n while (!result.done) {\n cb.call(thisArg, result.value, result.value, this);\n result = iterator.next();\n }\n }\n }\n function proxySet_(target, parent) {\n return new DraftSet(target, parent);\n }\n function prepareSetCopy(state) {\n if (!state.copy_) {\n state.copy_ = /* @__PURE__ */ new Set();\n state.base_.forEach((value) => {\n if (isDraftable(value)) {\n const draft = createProxy(value, state);\n state.drafts_.set(value, draft);\n state.copy_.add(draft);\n } else {\n state.copy_.add(value);\n }\n });\n }\n }\n function assertUnrevoked(state) {\n if (state.revoked_)\n die(3, JSON.stringify(latest(state)));\n }\n loadPlugin("MapSet", { proxyMap_, proxySet_ });\n}\n\n// src/immer.ts\nvar immer = new Immer2();\nvar produce = immer.produce;\nvar produceWithPatches = immer.produceWithPatches.bind(\n immer\n);\nvar setAutoFreeze = immer.setAutoFreeze.bind(immer);\nvar setUseStrictShallowCopy = immer.setUseStrictShallowCopy.bind(immer);\nvar applyPatches = immer.applyPatches.bind(immer);\nvar createDraft = immer.createDraft.bind(immer);\nvar finishDraft = immer.finishDraft.bind(immer);\nfunction castDraft(value) {\n return value;\n}\nfunction castImmutable(value) {\n return value;\n}\n\n//# sourceMappingURL=immer.mjs.map\n;// ./node_modules/@forgerock/javascript-sdk/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.mjs\n// src/index.ts\n\n\n\n\n// src/createDraftSafeSelector.ts\n\n\nvar createDraftSafeSelectorCreator = (...args) => {\n const createSelector2 = createSelectorCreator(...args);\n const createDraftSafeSelector2 = Object.assign((...args2) => {\n const selector = createSelector2(...args2);\n const wrappedSelector = (value, ...rest) => selector(isDraft(value) ? current(value) : value, ...rest);\n Object.assign(wrappedSelector, selector);\n return wrappedSelector;\n }, {\n withTypes: () => createDraftSafeSelector2\n });\n return createDraftSafeSelector2;\n};\nvar createDraftSafeSelector = /* @__PURE__ */ (/* unused pure expression or super */ null && (createDraftSafeSelectorCreator(weakMapMemoize)));\n\n// src/configureStore.ts\n\n\n// src/devtoolsExtension.ts\n\nvar composeWithDevTools = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0) return void 0;\n if (typeof arguments[0] === "object") return compose;\n return compose.apply(null, arguments);\n};\nvar devToolsEnhancer = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {\n return function(noop3) {\n return noop3;\n };\n};\n\n// src/getDefaultMiddleware.ts\n\n\n// src/createAction.ts\n\n\n// src/tsHelpers.ts\nvar hasMatchFunction = (v) => {\n return v && typeof v.match === "function";\n};\n\n// src/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(0) : 0);\n }\n return {\n type,\n payload: prepared.payload,\n ..."meta" in prepared && {\n meta: prepared.meta\n },\n ..."error" in prepared && {\n error: prepared.error\n }\n };\n }\n return {\n type,\n payload: args[0]\n };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => redux_isAction(action) && action.type === type;\n return actionCreator;\n}\nfunction isActionCreator(action) {\n return typeof action === "function" && "type" in action && // hasMatchFunction only wants Matchers but I don\'t see the point in rewriting it\n hasMatchFunction(action);\n}\nfunction isFSA(action) {\n return isAction(action) && Object.keys(action).every(isValidKey);\n}\nfunction isValidKey(key) {\n return ["type", "payload", "error", "meta"].indexOf(key) > -1;\n}\n\n// src/actionCreatorInvariantMiddleware.ts\nfunction getMessage(type) {\n const splitType = type ? `${type}`.split("/") : [];\n const actionName = splitType[splitType.length - 1] || "actionCreator";\n return `Detected an action creator with type "${type || "unknown"}" being dispatched. \nMake sure you\'re calling the action creator before dispatching, i.e. \\`dispatch(${actionName}())\\` instead of \\`dispatch(${actionName})\\`. This is necessary even if the action has no payload.`;\n}\nfunction createActionCreatorInvariantMiddleware(options = {}) {\n if (true) {\n return () => (next) => (action) => next(action);\n }\n // removed by dead control flow\n{}\n // removed by dead control flow\n{}\n}\n\n// src/utils.ts\n\nfunction getTimeMeasureUtils(maxDelay, fnName) {\n let elapsed = 0;\n return {\n measureTime(fn) {\n const started = Date.now();\n try {\n return fn();\n } finally {\n const finished = Date.now();\n elapsed += finished - started;\n }\n },\n warnIfExceeded() {\n if (elapsed > maxDelay) {\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\nIt is disabled in production builds, so you don\'t need to worry about that.`);\n }\n }\n };\n}\nvar Tuple = class _Tuple extends Array {\n constructor(...items) {\n super(...items);\n Object.setPrototypeOf(this, _Tuple.prototype);\n }\n static get [Symbol.species]() {\n return _Tuple;\n }\n concat(...arr) {\n return super.concat.apply(this, arr);\n }\n prepend(...arr) {\n if (arr.length === 1 && Array.isArray(arr[0])) {\n return new _Tuple(...arr[0].concat(this));\n }\n return new _Tuple(...arr.concat(this));\n }\n};\nfunction freezeDraftable(val) {\n return isDraftable(val) ? produce(val, () => {\n }) : val;\n}\nfunction getOrInsertComputed(map, key, compute) {\n if (map.has(key)) return map.get(key);\n return map.set(key, compute(key)).get(key);\n}\n\n// src/immutableStateInvariantMiddleware.ts\nfunction isImmutableDefault(value) {\n return typeof value !== "object" || value == null || Object.isFrozen(value);\n}\nfunction trackForMutations(isImmutable, ignorePaths, obj) {\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj);\n return {\n detectMutations() {\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj);\n }\n };\n}\nfunction trackProperties(isImmutable, ignorePaths = [], obj, path = "", checkedObjects = /* @__PURE__ */ new Set()) {\n const tracked = {\n value: obj\n };\n if (!isImmutable(obj) && !checkedObjects.has(obj)) {\n checkedObjects.add(obj);\n tracked.children = {};\n for (const key in obj) {\n const childPath = path ? path + "." + key : key;\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\n continue;\n }\n tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath);\n }\n }\n return tracked;\n}\nfunction detectMutations(isImmutable, ignoredPaths = [], trackedProperty, obj, sameParentRef = false, path = "") {\n const prevObj = trackedProperty ? trackedProperty.value : void 0;\n const sameRef = prevObj === obj;\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\n return {\n wasMutated: true,\n path\n };\n }\n if (isImmutable(prevObj) || isImmutable(obj)) {\n return {\n wasMutated: false\n };\n }\n const keysToDetect = {};\n for (let key in trackedProperty.children) {\n keysToDetect[key] = true;\n }\n for (let key in obj) {\n keysToDetect[key] = true;\n }\n const hasIgnoredPaths = ignoredPaths.length > 0;\n for (let key in keysToDetect) {\n const nestedPath = path ? path + "." + key : key;\n if (hasIgnoredPaths) {\n const hasMatches = ignoredPaths.some((ignored) => {\n if (ignored instanceof RegExp) {\n return ignored.test(nestedPath);\n }\n return nestedPath === ignored;\n });\n if (hasMatches) {\n continue;\n }\n }\n const result = detectMutations(isImmutable, ignoredPaths, trackedProperty.children[key], obj[key], sameRef, nestedPath);\n if (result.wasMutated) {\n return result;\n }\n }\n return {\n wasMutated: false\n };\n}\nfunction createImmutableStateInvariantMiddleware(options = {}) {\n if (true) {\n return () => (next) => (action) => next(action);\n } else // removed by dead control flow\n{ var stringify, getSerialize; }\n}\n\n// src/serializableStateInvariantMiddleware.ts\n\nfunction isPlain(val) {\n const type = typeof val;\n return val == null || type === "string" || type === "boolean" || type === "number" || Array.isArray(val) || isPlainObject(val);\n}\nfunction findNonSerializableValue(value, path = "", isSerializable = isPlain, getEntries, ignoredPaths = [], cache) {\n let foundNestedSerializable;\n if (!isSerializable(value)) {\n return {\n keyPath: path || "",\n value\n };\n }\n if (typeof value !== "object" || value === null) {\n return false;\n }\n if (cache?.has(value)) return false;\n const entries = getEntries != null ? getEntries(value) : Object.entries(value);\n const hasIgnoredPaths = ignoredPaths.length > 0;\n for (const [key, nestedValue] of entries) {\n const nestedPath = path ? path + "." + key : key;\n if (hasIgnoredPaths) {\n const hasMatches = ignoredPaths.some((ignored) => {\n if (ignored instanceof RegExp) {\n return ignored.test(nestedPath);\n }\n return nestedPath === ignored;\n });\n if (hasMatches) {\n continue;\n }\n }\n if (!isSerializable(nestedValue)) {\n return {\n keyPath: nestedPath,\n value: nestedValue\n };\n }\n if (typeof nestedValue === "object") {\n foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths, cache);\n if (foundNestedSerializable) {\n return foundNestedSerializable;\n }\n }\n }\n if (cache && isNestedFrozen(value)) cache.add(value);\n return false;\n}\nfunction isNestedFrozen(value) {\n if (!Object.isFrozen(value)) return false;\n for (const nestedValue of Object.values(value)) {\n if (typeof nestedValue !== "object" || nestedValue === null) continue;\n if (!isNestedFrozen(nestedValue)) return false;\n }\n return true;\n}\nfunction createSerializableStateInvariantMiddleware(options = {}) {\n if (true) {\n return () => (next) => (action) => next(action);\n } else // removed by dead control flow\n{}\n}\n\n// src/getDefaultMiddleware.ts\nfunction isBoolean(x) {\n return typeof x === "boolean";\n}\nvar buildGetDefaultMiddleware = () => function getDefaultMiddleware(options) {\n const {\n thunk = true,\n immutableCheck = true,\n serializableCheck = true,\n actionCreatorCheck = true\n } = options ?? {};\n let middlewareArray = new Tuple();\n if (thunk) {\n if (isBoolean(thunk)) {\n middlewareArray.push(redux_thunk_thunk);\n } else {\n middlewareArray.push(withExtraArgument(thunk.extraArgument));\n }\n }\n if (false) // removed by dead control flow\n{}\n return middlewareArray;\n};\n\n// src/autoBatchEnhancer.ts\nvar SHOULD_AUTOBATCH = "RTK_autoBatch";\nvar prepareAutoBatched = () => (payload) => ({\n payload,\n meta: {\n [SHOULD_AUTOBATCH]: true\n }\n});\nvar createQueueWithTimer = (timeout) => {\n return (notify) => {\n setTimeout(notify, timeout);\n };\n};\nvar autoBatchEnhancer = (options = {\n type: "raf"\n}) => (next) => (...args) => {\n const store = next(...args);\n let notifying = true;\n let shouldNotifyAtEndOfTick = false;\n let notificationQueued = false;\n const listeners = /* @__PURE__ */ new Set();\n const queueCallback = options.type === "tick" ? queueMicrotask : options.type === "raf" ? (\n // requestAnimationFrame won\'t exist in SSR environments. Fall back to a vague approximation just to keep from erroring.\n typeof window !== "undefined" && window.requestAnimationFrame ? window.requestAnimationFrame : createQueueWithTimer(10)\n ) : options.type === "callback" ? options.queueNotification : createQueueWithTimer(options.timeout);\n const notifyListeners = () => {\n notificationQueued = false;\n if (shouldNotifyAtEndOfTick) {\n shouldNotifyAtEndOfTick = false;\n listeners.forEach((l) => l());\n }\n };\n return Object.assign({}, store, {\n // Override the base `store.subscribe` method to keep original listeners\n // from running if we\'re delaying notifications\n subscribe(listener2) {\n const wrappedListener = () => notifying && listener2();\n const unsubscribe = store.subscribe(wrappedListener);\n listeners.add(listener2);\n return () => {\n unsubscribe();\n listeners.delete(listener2);\n };\n },\n // Override the base `store.dispatch` method so that we can check actions\n // for the `shouldAutoBatch` flag and determine if batching is active\n dispatch(action) {\n try {\n notifying = !action?.meta?.[SHOULD_AUTOBATCH];\n shouldNotifyAtEndOfTick = !notifying;\n if (shouldNotifyAtEndOfTick) {\n if (!notificationQueued) {\n notificationQueued = true;\n queueCallback(notifyListeners);\n }\n }\n return store.dispatch(action);\n } finally {\n notifying = true;\n }\n }\n });\n};\n\n// src/getDefaultEnhancers.ts\nvar buildGetDefaultEnhancers = (middlewareEnhancer) => function getDefaultEnhancers(options) {\n const {\n autoBatch = true\n } = options ?? {};\n let enhancerArray = new Tuple(middlewareEnhancer);\n if (autoBatch) {\n enhancerArray.push(autoBatchEnhancer(typeof autoBatch === "object" ? autoBatch : void 0));\n }\n return enhancerArray;\n};\n\n// src/configureStore.ts\nfunction configureStore(options) {\n const getDefaultMiddleware = buildGetDefaultMiddleware();\n const {\n reducer = void 0,\n middleware,\n devTools = true,\n duplicateMiddlewareCheck = true,\n preloadedState = void 0,\n enhancers = void 0\n } = options || {};\n let rootReducer;\n if (typeof reducer === "function") {\n rootReducer = reducer;\n } else if (redux_isPlainObject(reducer)) {\n rootReducer = combineReducers(reducer);\n } else {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(1) : 0);\n }\n if (false) // removed by dead control flow\n{}\n let finalMiddleware;\n if (typeof middleware === "function") {\n finalMiddleware = middleware(getDefaultMiddleware);\n if (false) // removed by dead control flow\n{}\n } else {\n finalMiddleware = getDefaultMiddleware();\n }\n if (false) // removed by dead control flow\n{}\n if (false) // removed by dead control flow\n{}\n let finalCompose = compose;\n if (devTools) {\n finalCompose = composeWithDevTools({\n // Enable capture of stack traces for dispatched Redux actions\n trace: "production" !== "production",\n ...typeof devTools === "object" && devTools\n });\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n const getDefaultEnhancers = buildGetDefaultEnhancers(middlewareEnhancer);\n if (false) // removed by dead control flow\n{}\n let storeEnhancers = typeof enhancers === "function" ? enhancers(getDefaultEnhancers) : getDefaultEnhancers();\n if (false) // removed by dead control flow\n{}\n if (false) // removed by dead control flow\n{}\n if (false) // removed by dead control flow\n{}\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer, preloadedState, composedEnhancer);\n}\n\n// src/createReducer.ts\n\n\n// src/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (false) // removed by dead control flow\n{}\n const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type;\n if (!type) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(28) : 0);\n }\n if (type in actionsMap) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(29) : 0);\n }\n actionsMap[type] = reducer;\n return builder;\n },\n addMatcher(matcher, reducer) {\n if (false) // removed by dead control flow\n{}\n actionMatchers.push({\n matcher,\n reducer\n });\n return builder;\n },\n addDefaultCase(reducer) {\n if (false) // removed by dead control flow\n{}\n defaultCaseReducer = reducer;\n return builder;\n }\n };\n builderCallback(builder);\n return [actionsMap, actionMatchers, defaultCaseReducer];\n}\n\n// src/createReducer.ts\nfunction isStateFunction(x) {\n return typeof x === "function";\n}\nfunction createReducer(initialState, mapOrBuilderCallback) {\n if (false) // removed by dead control flow\n{}\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = executeReducerBuilderCallback(mapOrBuilderCallback);\n let getInitialState;\n if (isStateFunction(initialState)) {\n getInitialState = () => freezeDraftable(initialState());\n } else {\n const frozenInitialState = freezeDraftable(initialState);\n getInitialState = () => frozenInitialState;\n }\n function reducer(state = getInitialState(), action) {\n let caseReducers = [actionsMap[action.type], ...finalActionMatchers.filter(({\n matcher\n }) => matcher(action)).map(({\n reducer: reducer2\n }) => reducer2)];\n if (caseReducers.filter((cr) => !!cr).length === 0) {\n caseReducers = [finalDefaultCaseReducer];\n }\n return caseReducers.reduce((previousState, caseReducer) => {\n if (caseReducer) {\n if (immer_isDraft(previousState)) {\n const draft = previousState;\n const result = caseReducer(draft, action);\n if (result === void 0) {\n return previousState;\n }\n return result;\n } else if (!isDraftable(previousState)) {\n const result = caseReducer(previousState, action);\n if (result === void 0) {\n if (previousState === null) {\n return previousState;\n }\n throw Error("A case reducer on a non-draftable value must not return undefined");\n }\n return result;\n } else {\n return produce(previousState, (draft) => {\n return caseReducer(draft, action);\n });\n }\n }\n return previousState;\n }, state);\n }\n reducer.getInitialState = getInitialState;\n return reducer;\n}\n\n// src/matchers.ts\nvar matches = (matcher, action) => {\n if (hasMatchFunction(matcher)) {\n return matcher.match(action);\n } else {\n return matcher(action);\n }\n};\nfunction isAnyOf(...matchers) {\n return (action) => {\n return matchers.some((matcher) => matches(matcher, action));\n };\n}\nfunction isAllOf(...matchers) {\n return (action) => {\n return matchers.every((matcher) => matches(matcher, action));\n };\n}\nfunction hasExpectedRequestMetadata(action, validStatus) {\n if (!action || !action.meta) return false;\n const hasValidRequestId = typeof action.meta.requestId === "string";\n const hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1;\n return hasValidRequestId && hasValidRequestStatus;\n}\nfunction isAsyncThunkArray(a) {\n return typeof a[0] === "function" && "pending" in a[0] && "fulfilled" in a[0] && "rejected" in a[0];\n}\nfunction isPending(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, ["pending"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isPending()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.pending));\n}\nfunction isRejected(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, ["rejected"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isRejected()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.rejected));\n}\nfunction isRejectedWithValue(...asyncThunks) {\n const hasFlag = (action) => {\n return action && action.meta && action.meta.rejectedWithValue;\n };\n if (asyncThunks.length === 0) {\n return isAllOf(isRejected(...asyncThunks), hasFlag);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isRejectedWithValue()(asyncThunks[0]);\n }\n return isAllOf(isRejected(...asyncThunks), hasFlag);\n}\nfunction isFulfilled(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, ["fulfilled"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isFulfilled()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.fulfilled));\n}\nfunction isAsyncThunkAction(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, ["pending", "fulfilled", "rejected"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isAsyncThunkAction()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.flatMap((asyncThunk) => [asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled]));\n}\n\n// src/nanoid.ts\nvar urlAlphabet = "ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW";\nvar nanoid = (size = 21) => {\n let id = "";\n let i = size;\n while (i--) {\n id += urlAlphabet[Math.random() * 64 | 0];\n }\n return id;\n};\n\n// src/createAsyncThunk.ts\nvar commonProperties = ["name", "message", "stack", "code"];\nvar RejectWithValue = class {\n constructor(payload, meta) {\n this.payload = payload;\n this.meta = meta;\n }\n /*\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\n does not exist at runtime\n */\n _type;\n};\nvar FulfillWithMeta = class {\n constructor(payload, meta) {\n this.payload = payload;\n this.meta = meta;\n }\n /*\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\n does not exist at runtime\n */\n _type;\n};\nvar miniSerializeError = (value) => {\n if (typeof value === "object" && value !== null) {\n const simpleError = {};\n for (const property of commonProperties) {\n if (typeof value[property] === "string") {\n simpleError[property] = value[property];\n }\n }\n return simpleError;\n }\n return {\n message: String(value)\n };\n};\nvar externalAbortMessage = "External signal was aborted";\nvar createAsyncThunk = /* @__PURE__ */ (() => {\n function createAsyncThunk2(typePrefix, payloadCreator, options) {\n const fulfilled = createAction(typePrefix + "/fulfilled", (payload, requestId, arg, meta) => ({\n payload,\n meta: {\n ...meta || {},\n arg,\n requestId,\n requestStatus: "fulfilled"\n }\n }));\n const pending = createAction(typePrefix + "/pending", (requestId, arg, meta) => ({\n payload: void 0,\n meta: {\n ...meta || {},\n arg,\n requestId,\n requestStatus: "pending"\n }\n }));\n const rejected = createAction(typePrefix + "/rejected", (error, requestId, arg, payload, meta) => ({\n payload,\n error: (options && options.serializeError || miniSerializeError)(error || "Rejected"),\n meta: {\n ...meta || {},\n arg,\n requestId,\n rejectedWithValue: !!payload,\n requestStatus: "rejected",\n aborted: error?.name === "AbortError",\n condition: error?.name === "ConditionError"\n }\n }));\n function actionCreator(arg, {\n signal\n } = {}) {\n return (dispatch, getState, extra) => {\n const requestId = options?.idGenerator ? options.idGenerator(arg) : nanoid();\n const abortController = new AbortController();\n let abortHandler;\n let abortReason;\n function abort(reason) {\n abortReason = reason;\n abortController.abort();\n }\n if (signal) {\n if (signal.aborted) {\n abort(externalAbortMessage);\n } else {\n signal.addEventListener("abort", () => abort(externalAbortMessage), {\n once: true\n });\n }\n }\n const promise = async function() {\n let finalAction;\n try {\n let conditionResult = options?.condition?.(arg, {\n getState,\n extra\n });\n if (isThenable(conditionResult)) {\n conditionResult = await conditionResult;\n }\n if (conditionResult === false || abortController.signal.aborted) {\n throw {\n name: "ConditionError",\n message: "Aborted due to condition callback returning false."\n };\n }\n const abortedPromise = new Promise((_, reject) => {\n abortHandler = () => {\n reject({\n name: "AbortError",\n message: abortReason || "Aborted"\n });\n };\n abortController.signal.addEventListener("abort", abortHandler);\n });\n dispatch(pending(requestId, arg, options?.getPendingMeta?.({\n requestId,\n arg\n }, {\n getState,\n extra\n })));\n finalAction = await Promise.race([abortedPromise, Promise.resolve(payloadCreator(arg, {\n dispatch,\n getState,\n extra,\n requestId,\n signal: abortController.signal,\n abort,\n rejectWithValue: (value, meta) => {\n return new RejectWithValue(value, meta);\n },\n fulfillWithValue: (value, meta) => {\n return new FulfillWithMeta(value, meta);\n }\n })).then((result) => {\n if (result instanceof RejectWithValue) {\n throw result;\n }\n if (result instanceof FulfillWithMeta) {\n return fulfilled(result.payload, requestId, arg, result.meta);\n }\n return fulfilled(result, requestId, arg);\n })]);\n } catch (err) {\n finalAction = err instanceof RejectWithValue ? rejected(null, requestId, arg, err.payload, err.meta) : rejected(err, requestId, arg);\n } finally {\n if (abortHandler) {\n abortController.signal.removeEventListener("abort", abortHandler);\n }\n }\n const skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition;\n if (!skipDispatch) {\n dispatch(finalAction);\n }\n return finalAction;\n }();\n return Object.assign(promise, {\n abort,\n requestId,\n arg,\n unwrap() {\n return promise.then(unwrapResult);\n }\n });\n };\n }\n return Object.assign(actionCreator, {\n pending,\n rejected,\n fulfilled,\n settled: isAnyOf(rejected, fulfilled),\n typePrefix\n });\n }\n createAsyncThunk2.withTypes = () => createAsyncThunk2;\n return createAsyncThunk2;\n})();\nfunction unwrapResult(action) {\n if (action.meta && action.meta.rejectedWithValue) {\n throw action.payload;\n }\n if (action.error) {\n throw action.error;\n }\n return action.payload;\n}\nfunction isThenable(value) {\n return value !== null && typeof value === "object" && typeof value.then === "function";\n}\n\n// src/createSlice.ts\nvar asyncThunkSymbol = /* @__PURE__ */ Symbol.for("rtk-slice-createasyncthunk");\nvar asyncThunkCreator = {\n [asyncThunkSymbol]: createAsyncThunk\n};\nvar ReducerType = /* @__PURE__ */ ((ReducerType2) => {\n ReducerType2["reducer"] = "reducer";\n ReducerType2["reducerWithPrepare"] = "reducerWithPrepare";\n ReducerType2["asyncThunk"] = "asyncThunk";\n return ReducerType2;\n})(ReducerType || {});\nfunction getType(slice, actionKey) {\n return `${slice}/${actionKey}`;\n}\nfunction buildCreateSlice({\n creators\n} = {}) {\n const cAT = creators?.asyncThunk?.[asyncThunkSymbol];\n return function createSlice2(options) {\n const {\n name,\n reducerPath = name\n } = options;\n if (!name) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(11) : 0);\n }\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n const reducers = (typeof options.reducers === "function" ? options.reducers(buildReducerCreators()) : options.reducers) || {};\n const reducerNames = Object.keys(reducers);\n const context = {\n sliceCaseReducersByName: {},\n sliceCaseReducersByType: {},\n actionCreators: {},\n sliceMatchers: []\n };\n const contextMethods = {\n addCase(typeOrActionCreator, reducer2) {\n const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type;\n if (!type) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(12) : 0);\n }\n if (type in context.sliceCaseReducersByType) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(13) : 0);\n }\n context.sliceCaseReducersByType[type] = reducer2;\n return contextMethods;\n },\n addMatcher(matcher, reducer2) {\n context.sliceMatchers.push({\n matcher,\n reducer: reducer2\n });\n return contextMethods;\n },\n exposeAction(name2, actionCreator) {\n context.actionCreators[name2] = actionCreator;\n return contextMethods;\n },\n exposeCaseReducer(name2, reducer2) {\n context.sliceCaseReducersByName[name2] = reducer2;\n return contextMethods;\n }\n };\n reducerNames.forEach((reducerName) => {\n const reducerDefinition = reducers[reducerName];\n const reducerDetails = {\n reducerName,\n type: getType(name, reducerName),\n createNotation: typeof options.reducers === "function"\n };\n if (isAsyncThunkSliceReducerDefinition(reducerDefinition)) {\n handleThunkCaseReducerDefinition(reducerDetails, reducerDefinition, contextMethods, cAT);\n } else {\n handleNormalReducerDefinition(reducerDetails, reducerDefinition, contextMethods);\n }\n });\n function buildReducer() {\n if (false) // removed by dead control flow\n{}\n const [extraReducers = {}, actionMatchers = [], defaultCaseReducer = void 0] = typeof options.extraReducers === "function" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];\n const finalCaseReducers = {\n ...extraReducers,\n ...context.sliceCaseReducersByType\n };\n return createReducer(options.initialState, (builder) => {\n for (let key in finalCaseReducers) {\n builder.addCase(key, finalCaseReducers[key]);\n }\n for (let sM of context.sliceMatchers) {\n builder.addMatcher(sM.matcher, sM.reducer);\n }\n for (let m of actionMatchers) {\n builder.addMatcher(m.matcher, m.reducer);\n }\n if (defaultCaseReducer) {\n builder.addDefaultCase(defaultCaseReducer);\n }\n });\n }\n const selectSelf = (state) => state;\n const injectedSelectorCache = /* @__PURE__ */ new Map();\n const injectedStateCache = /* @__PURE__ */ new WeakMap();\n let _reducer;\n function reducer(state, action) {\n if (!_reducer) _reducer = buildReducer();\n return _reducer(state, action);\n }\n function getInitialState() {\n if (!_reducer) _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n function makeSelectorProps(reducerPath2, injected = false) {\n function selectSlice(state) {\n let sliceState = state[reducerPath2];\n if (typeof sliceState === "undefined") {\n if (injected) {\n sliceState = getOrInsertComputed(injectedStateCache, selectSlice, getInitialState);\n } else if (false) // removed by dead control flow\n{}\n }\n return sliceState;\n }\n function getSelectors(selectState = selectSelf) {\n const selectorCache = getOrInsertComputed(injectedSelectorCache, injected, () => /* @__PURE__ */ new WeakMap());\n return getOrInsertComputed(selectorCache, selectState, () => {\n const map = {};\n for (const [name2, selector] of Object.entries(options.selectors ?? {})) {\n map[name2] = wrapSelector(selector, selectState, () => getOrInsertComputed(injectedStateCache, selectState, getInitialState), injected);\n }\n return map;\n });\n }\n return {\n reducerPath: reducerPath2,\n getSelectors,\n get selectors() {\n return getSelectors(selectSlice);\n },\n selectSlice\n };\n }\n const slice = {\n name,\n reducer,\n actions: context.actionCreators,\n caseReducers: context.sliceCaseReducersByName,\n getInitialState,\n ...makeSelectorProps(reducerPath),\n injectInto(injectable, {\n reducerPath: pathOpt,\n ...config\n } = {}) {\n const newReducerPath = pathOpt ?? reducerPath;\n injectable.inject({\n reducerPath: newReducerPath,\n reducer\n }, config);\n return {\n ...slice,\n ...makeSelectorProps(newReducerPath, true)\n };\n }\n };\n return slice;\n };\n}\nfunction wrapSelector(selector, selectState, getInitialState, injected) {\n function wrapper(rootState, ...args) {\n let sliceState = selectState(rootState);\n if (typeof sliceState === "undefined") {\n if (injected) {\n sliceState = getInitialState();\n } else if (false) // removed by dead control flow\n{}\n }\n return selector(sliceState, ...args);\n }\n wrapper.unwrapped = selector;\n return wrapper;\n}\nvar createSlice = /* @__PURE__ */ buildCreateSlice();\nfunction buildReducerCreators() {\n function asyncThunk(payloadCreator, config) {\n return {\n _reducerDefinitionType: "asyncThunk" /* asyncThunk */,\n payloadCreator,\n ...config\n };\n }\n asyncThunk.withTypes = () => asyncThunk;\n return {\n reducer(caseReducer) {\n return Object.assign({\n // hack so the wrapping function has the same name as the original\n // we need to create a wrapper so the `reducerDefinitionType` is not assigned to the original\n [caseReducer.name](...args) {\n return caseReducer(...args);\n }\n }[caseReducer.name], {\n _reducerDefinitionType: "reducer" /* reducer */\n });\n },\n preparedReducer(prepare, reducer) {\n return {\n _reducerDefinitionType: "reducerWithPrepare" /* reducerWithPrepare */,\n prepare,\n reducer\n };\n },\n asyncThunk\n };\n}\nfunction handleNormalReducerDefinition({\n type,\n reducerName,\n createNotation\n}, maybeReducerWithPrepare, context) {\n let caseReducer;\n let prepareCallback;\n if ("reducer" in maybeReducerWithPrepare) {\n if (createNotation && !isCaseReducerWithPrepareDefinition(maybeReducerWithPrepare)) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(17) : 0);\n }\n caseReducer = maybeReducerWithPrepare.reducer;\n prepareCallback = maybeReducerWithPrepare.prepare;\n } else {\n caseReducer = maybeReducerWithPrepare;\n }\n context.addCase(type, caseReducer).exposeCaseReducer(reducerName, caseReducer).exposeAction(reducerName, prepareCallback ? createAction(type, prepareCallback) : createAction(type));\n}\nfunction isAsyncThunkSliceReducerDefinition(reducerDefinition) {\n return reducerDefinition._reducerDefinitionType === "asyncThunk" /* asyncThunk */;\n}\nfunction isCaseReducerWithPrepareDefinition(reducerDefinition) {\n return reducerDefinition._reducerDefinitionType === "reducerWithPrepare" /* reducerWithPrepare */;\n}\nfunction handleThunkCaseReducerDefinition({\n type,\n reducerName\n}, reducerDefinition, context, cAT) {\n if (!cAT) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(18) : 0);\n }\n const {\n payloadCreator,\n fulfilled,\n pending,\n rejected,\n settled,\n options\n } = reducerDefinition;\n const thunk = cAT(type, payloadCreator, options);\n context.exposeAction(reducerName, thunk);\n if (fulfilled) {\n context.addCase(thunk.fulfilled, fulfilled);\n }\n if (pending) {\n context.addCase(thunk.pending, pending);\n }\n if (rejected) {\n context.addCase(thunk.rejected, rejected);\n }\n if (settled) {\n context.addMatcher(thunk.settled, settled);\n }\n context.exposeCaseReducer(reducerName, {\n fulfilled: fulfilled || noop,\n pending: pending || noop,\n rejected: rejected || noop,\n settled: settled || noop\n });\n}\nfunction noop() {\n}\n\n// src/entities/entity_state.ts\nfunction getInitialEntityState() {\n return {\n ids: [],\n entities: {}\n };\n}\nfunction createInitialStateFactory(stateAdapter) {\n function getInitialState(additionalState = {}, entities) {\n const state = Object.assign(getInitialEntityState(), additionalState);\n return entities ? stateAdapter.setAll(state, entities) : state;\n }\n return {\n getInitialState\n };\n}\n\n// src/entities/state_selectors.ts\nfunction createSelectorsFactory() {\n function getSelectors(selectState, options = {}) {\n const {\n createSelector: createSelector2 = createDraftSafeSelector\n } = options;\n const selectIds = (state) => state.ids;\n const selectEntities = (state) => state.entities;\n const selectAll = createSelector2(selectIds, selectEntities, (ids, entities) => ids.map((id) => entities[id]));\n const selectId = (_, id) => id;\n const selectById = (entities, id) => entities[id];\n const selectTotal = createSelector2(selectIds, (ids) => ids.length);\n if (!selectState) {\n return {\n selectIds,\n selectEntities,\n selectAll,\n selectTotal,\n selectById: createSelector2(selectEntities, selectId, selectById)\n };\n }\n const selectGlobalizedEntities = createSelector2(selectState, selectEntities);\n return {\n selectIds: createSelector2(selectState, selectIds),\n selectEntities: selectGlobalizedEntities,\n selectAll: createSelector2(selectState, selectAll),\n selectTotal: createSelector2(selectState, selectTotal),\n selectById: createSelector2(selectGlobalizedEntities, selectId, selectById)\n };\n }\n return {\n getSelectors\n };\n}\n\n// src/entities/state_adapter.ts\n\nvar isDraftTyped = (/* unused pure expression or super */ null && (isDraft3));\nfunction createSingleArgumentStateOperator(mutator) {\n const operator = createStateOperator((_, state) => mutator(state));\n return function operation(state) {\n return operator(state, void 0);\n };\n}\nfunction createStateOperator(mutator) {\n return function operation(state, arg) {\n function isPayloadActionArgument(arg2) {\n return isFSA(arg2);\n }\n const runMutator = (draft) => {\n if (isPayloadActionArgument(arg)) {\n mutator(arg.payload, draft);\n } else {\n mutator(arg, draft);\n }\n };\n if (isDraftTyped(state)) {\n runMutator(state);\n return state;\n }\n return createNextState3(state, runMutator);\n };\n}\n\n// src/entities/utils.ts\n\nfunction selectIdValue(entity, selectId) {\n const key = selectId(entity);\n if (false) // removed by dead control flow\n{}\n return key;\n}\nfunction ensureEntitiesArray(entities) {\n if (!Array.isArray(entities)) {\n entities = Object.values(entities);\n }\n return entities;\n}\nfunction getCurrent(value) {\n return isDraft4(value) ? current2(value) : value;\n}\nfunction splitAddedUpdatedEntities(newEntities, selectId, state) {\n newEntities = ensureEntitiesArray(newEntities);\n const existingIdsArray = getCurrent(state.ids);\n const existingIds = new Set(existingIdsArray);\n const added = [];\n const addedIds = /* @__PURE__ */ new Set([]);\n const updated = [];\n for (const entity of newEntities) {\n const id = selectIdValue(entity, selectId);\n if (existingIds.has(id) || addedIds.has(id)) {\n updated.push({\n id,\n changes: entity\n });\n } else {\n addedIds.add(id);\n added.push(entity);\n }\n }\n return [added, updated, existingIdsArray];\n}\n\n// src/entities/unsorted_state_adapter.ts\nfunction createUnsortedStateAdapter(selectId) {\n function addOneMutably(entity, state) {\n const key = selectIdValue(entity, selectId);\n if (key in state.entities) {\n return;\n }\n state.ids.push(key);\n state.entities[key] = entity;\n }\n function addManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n for (const entity of newEntities) {\n addOneMutably(entity, state);\n }\n }\n function setOneMutably(entity, state) {\n const key = selectIdValue(entity, selectId);\n if (!(key in state.entities)) {\n state.ids.push(key);\n }\n ;\n state.entities[key] = entity;\n }\n function setManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n for (const entity of newEntities) {\n setOneMutably(entity, state);\n }\n }\n function setAllMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n state.ids = [];\n state.entities = {};\n addManyMutably(newEntities, state);\n }\n function removeOneMutably(key, state) {\n return removeManyMutably([key], state);\n }\n function removeManyMutably(keys, state) {\n let didMutate = false;\n keys.forEach((key) => {\n if (key in state.entities) {\n delete state.entities[key];\n didMutate = true;\n }\n });\n if (didMutate) {\n state.ids = state.ids.filter((id) => id in state.entities);\n }\n }\n function removeAllMutably(state) {\n Object.assign(state, {\n ids: [],\n entities: {}\n });\n }\n function takeNewKey(keys, update, state) {\n const original3 = state.entities[update.id];\n if (original3 === void 0) {\n return false;\n }\n const updated = Object.assign({}, original3, update.changes);\n const newKey = selectIdValue(updated, selectId);\n const hasNewKey = newKey !== update.id;\n if (hasNewKey) {\n keys[update.id] = newKey;\n delete state.entities[update.id];\n }\n ;\n state.entities[newKey] = updated;\n return hasNewKey;\n }\n function updateOneMutably(update, state) {\n return updateManyMutably([update], state);\n }\n function updateManyMutably(updates, state) {\n const newKeys = {};\n const updatesPerEntity = {};\n updates.forEach((update) => {\n if (update.id in state.entities) {\n updatesPerEntity[update.id] = {\n id: update.id,\n // Spreads ignore falsy values, so this works even if there isn\'t\n // an existing update already at this key\n changes: {\n ...updatesPerEntity[update.id]?.changes,\n ...update.changes\n }\n };\n }\n });\n updates = Object.values(updatesPerEntity);\n const didMutateEntities = updates.length > 0;\n if (didMutateEntities) {\n const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0;\n if (didMutateIds) {\n state.ids = Object.values(state.entities).map((e) => selectIdValue(e, selectId));\n }\n }\n }\n function upsertOneMutably(entity, state) {\n return upsertManyMutably([entity], state);\n }\n function upsertManyMutably(newEntities, state) {\n const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state);\n addManyMutably(added, state);\n updateManyMutably(updated, state);\n }\n return {\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\n addOne: createStateOperator(addOneMutably),\n addMany: createStateOperator(addManyMutably),\n setOne: createStateOperator(setOneMutably),\n setMany: createStateOperator(setManyMutably),\n setAll: createStateOperator(setAllMutably),\n updateOne: createStateOperator(updateOneMutably),\n updateMany: createStateOperator(updateManyMutably),\n upsertOne: createStateOperator(upsertOneMutably),\n upsertMany: createStateOperator(upsertManyMutably),\n removeOne: createStateOperator(removeOneMutably),\n removeMany: createStateOperator(removeManyMutably)\n };\n}\n\n// src/entities/sorted_state_adapter.ts\nfunction findInsertIndex(sortedItems, item, comparisonFunction) {\n let lowIndex = 0;\n let highIndex = sortedItems.length;\n while (lowIndex < highIndex) {\n let middleIndex = lowIndex + highIndex >>> 1;\n const currentItem = sortedItems[middleIndex];\n const res = comparisonFunction(item, currentItem);\n if (res >= 0) {\n lowIndex = middleIndex + 1;\n } else {\n highIndex = middleIndex;\n }\n }\n return lowIndex;\n}\nfunction insert(sortedItems, item, comparisonFunction) {\n const insertAtIndex = findInsertIndex(sortedItems, item, comparisonFunction);\n sortedItems.splice(insertAtIndex, 0, item);\n return sortedItems;\n}\nfunction createSortedStateAdapter(selectId, comparer) {\n const {\n removeOne,\n removeMany,\n removeAll\n } = createUnsortedStateAdapter(selectId);\n function addOneMutably(entity, state) {\n return addManyMutably([entity], state);\n }\n function addManyMutably(newEntities, state, existingIds) {\n newEntities = ensureEntitiesArray(newEntities);\n const existingKeys = new Set(existingIds ?? getCurrent(state.ids));\n const models = newEntities.filter((model) => !existingKeys.has(selectIdValue(model, selectId)));\n if (models.length !== 0) {\n mergeFunction(state, models);\n }\n }\n function setOneMutably(entity, state) {\n return setManyMutably([entity], state);\n }\n function setManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n if (newEntities.length !== 0) {\n for (const item of newEntities) {\n delete state.entities[selectId(item)];\n }\n mergeFunction(state, newEntities);\n }\n }\n function setAllMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n state.entities = {};\n state.ids = [];\n addManyMutably(newEntities, state, []);\n }\n function updateOneMutably(update, state) {\n return updateManyMutably([update], state);\n }\n function updateManyMutably(updates, state) {\n let appliedUpdates = false;\n let replacedIds = false;\n for (let update of updates) {\n const entity = state.entities[update.id];\n if (!entity) {\n continue;\n }\n appliedUpdates = true;\n Object.assign(entity, update.changes);\n const newId = selectId(entity);\n if (update.id !== newId) {\n replacedIds = true;\n delete state.entities[update.id];\n const oldIndex = state.ids.indexOf(update.id);\n state.ids[oldIndex] = newId;\n state.entities[newId] = entity;\n }\n }\n if (appliedUpdates) {\n mergeFunction(state, [], appliedUpdates, replacedIds);\n }\n }\n function upsertOneMutably(entity, state) {\n return upsertManyMutably([entity], state);\n }\n function upsertManyMutably(newEntities, state) {\n const [added, updated, existingIdsArray] = splitAddedUpdatedEntities(newEntities, selectId, state);\n if (added.length) {\n addManyMutably(added, state, existingIdsArray);\n }\n if (updated.length) {\n updateManyMutably(updated, state);\n }\n }\n function areArraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] === b[i]) {\n continue;\n }\n return false;\n }\n return true;\n }\n const mergeFunction = (state, addedItems, appliedUpdates, replacedIds) => {\n const currentEntities = getCurrent(state.entities);\n const currentIds = getCurrent(state.ids);\n const stateEntities = state.entities;\n let ids = currentIds;\n if (replacedIds) {\n ids = new Set(currentIds);\n }\n let sortedEntities = [];\n for (const id of ids) {\n const entity = currentEntities[id];\n if (entity) {\n sortedEntities.push(entity);\n }\n }\n const wasPreviouslyEmpty = sortedEntities.length === 0;\n for (const item of addedItems) {\n stateEntities[selectId(item)] = item;\n if (!wasPreviouslyEmpty) {\n insert(sortedEntities, item, comparer);\n }\n }\n if (wasPreviouslyEmpty) {\n sortedEntities = addedItems.slice().sort(comparer);\n } else if (appliedUpdates) {\n sortedEntities.sort(comparer);\n }\n const newSortedIds = sortedEntities.map(selectId);\n if (!areArraysEqual(currentIds, newSortedIds)) {\n state.ids = newSortedIds;\n }\n };\n return {\n removeOne,\n removeMany,\n removeAll,\n addOne: createStateOperator(addOneMutably),\n updateOne: createStateOperator(updateOneMutably),\n upsertOne: createStateOperator(upsertOneMutably),\n setOne: createStateOperator(setOneMutably),\n setMany: createStateOperator(setManyMutably),\n setAll: createStateOperator(setAllMutably),\n addMany: createStateOperator(addManyMutably),\n updateMany: createStateOperator(updateManyMutably),\n upsertMany: createStateOperator(upsertManyMutably)\n };\n}\n\n// src/entities/create_adapter.ts\nfunction createEntityAdapter(options = {}) {\n const {\n selectId,\n sortComparer\n } = {\n sortComparer: false,\n selectId: (instance) => instance.id,\n ...options\n };\n const stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId);\n const stateFactory = createInitialStateFactory(stateAdapter);\n const selectorsFactory = createSelectorsFactory();\n return {\n selectId,\n sortComparer,\n ...stateFactory,\n ...selectorsFactory,\n ...stateAdapter\n };\n}\n\n// src/listenerMiddleware/index.ts\n\n\n// src/listenerMiddleware/exceptions.ts\nvar task = "task";\nvar listener = "listener";\nvar completed = "completed";\nvar cancelled = "cancelled";\nvar taskCancelled = (/* unused pure expression or super */ null && (`task-${cancelled}`));\nvar taskCompleted = (/* unused pure expression or super */ null && (`task-${completed}`));\nvar listenerCancelled = (/* unused pure expression or super */ null && (`${listener}-${cancelled}`));\nvar listenerCompleted = (/* unused pure expression or super */ null && (`${listener}-${completed}`));\nvar TaskAbortError = class {\n constructor(code) {\n this.code = code;\n this.message = `${task} ${cancelled} (reason: ${code})`;\n }\n name = "TaskAbortError";\n message;\n};\n\n// src/listenerMiddleware/utils.ts\nvar assertFunction = (func, expected) => {\n if (typeof func !== "function") {\n throw new TypeError( true ? redux_toolkit_modern_formatProdErrorMessage(32) : 0);\n }\n};\nvar noop2 = () => {\n};\nvar catchRejection = (promise, onError = noop2) => {\n promise.catch(onError);\n return promise;\n};\nvar addAbortSignalListener = (abortSignal, callback) => {\n abortSignal.addEventListener("abort", callback, {\n once: true\n });\n return () => abortSignal.removeEventListener("abort", callback);\n};\nvar abortControllerWithReason = (abortController, reason) => {\n const signal = abortController.signal;\n if (signal.aborted) {\n return;\n }\n if (!("reason" in signal)) {\n Object.defineProperty(signal, "reason", {\n enumerable: true,\n value: reason,\n configurable: true,\n writable: true\n });\n }\n ;\n abortController.abort(reason);\n};\n\n// src/listenerMiddleware/task.ts\nvar validateActive = (signal) => {\n if (signal.aborted) {\n const {\n reason\n } = signal;\n throw new TaskAbortError(reason);\n }\n};\nfunction raceWithSignal(signal, promise) {\n let cleanup = noop2;\n return new Promise((resolve, reject) => {\n const notifyRejection = () => reject(new TaskAbortError(signal.reason));\n if (signal.aborted) {\n notifyRejection();\n return;\n }\n cleanup = addAbortSignalListener(signal, notifyRejection);\n promise.finally(() => cleanup()).then(resolve, reject);\n }).finally(() => {\n cleanup = noop2;\n });\n}\nvar runTask = async (task2, cleanUp) => {\n try {\n await Promise.resolve();\n const value = await task2();\n return {\n status: "ok",\n value\n };\n } catch (error) {\n return {\n status: error instanceof TaskAbortError ? "cancelled" : "rejected",\n error\n };\n } finally {\n cleanUp?.();\n }\n};\nvar createPause = (signal) => {\n return (promise) => {\n return catchRejection(raceWithSignal(signal, promise).then((output) => {\n validateActive(signal);\n return output;\n }));\n };\n};\nvar createDelay = (signal) => {\n const pause = createPause(signal);\n return (timeoutMs) => {\n return pause(new Promise((resolve) => setTimeout(resolve, timeoutMs)));\n };\n};\n\n// src/listenerMiddleware/index.ts\nvar {\n assign: redux_toolkit_modern_assign\n} = Object;\nvar INTERNAL_NIL_TOKEN = {};\nvar alm = "listenerMiddleware";\nvar createFork = (parentAbortSignal, parentBlockingPromises) => {\n const linkControllers = (controller) => addAbortSignalListener(parentAbortSignal, () => abortControllerWithReason(controller, parentAbortSignal.reason));\n return (taskExecutor, opts) => {\n assertFunction(taskExecutor, "taskExecutor");\n const childAbortController = new AbortController();\n linkControllers(childAbortController);\n const result = runTask(async () => {\n validateActive(parentAbortSignal);\n validateActive(childAbortController.signal);\n const result2 = await taskExecutor({\n pause: createPause(childAbortController.signal),\n delay: createDelay(childAbortController.signal),\n signal: childAbortController.signal\n });\n validateActive(childAbortController.signal);\n return result2;\n }, () => abortControllerWithReason(childAbortController, taskCompleted));\n if (opts?.autoJoin) {\n parentBlockingPromises.push(result.catch(noop2));\n }\n return {\n result: createPause(parentAbortSignal)(result),\n cancel() {\n abortControllerWithReason(childAbortController, taskCancelled);\n }\n };\n };\n};\nvar createTakePattern = (startListening, signal) => {\n const take = async (predicate, timeout) => {\n validateActive(signal);\n let unsubscribe = () => {\n };\n const tuplePromise = new Promise((resolve, reject) => {\n let stopListening = startListening({\n predicate,\n effect: (action, listenerApi) => {\n listenerApi.unsubscribe();\n resolve([action, listenerApi.getState(), listenerApi.getOriginalState()]);\n }\n });\n unsubscribe = () => {\n stopListening();\n reject();\n };\n });\n const promises = [tuplePromise];\n if (timeout != null) {\n promises.push(new Promise((resolve) => setTimeout(resolve, timeout, null)));\n }\n try {\n const output = await raceWithSignal(signal, Promise.race(promises));\n validateActive(signal);\n return output;\n } finally {\n unsubscribe();\n }\n };\n return (predicate, timeout) => catchRejection(take(predicate, timeout));\n};\nvar getListenerEntryPropsFrom = (options) => {\n let {\n type,\n actionCreator,\n matcher,\n predicate,\n effect\n } = options;\n if (type) {\n predicate = createAction(type).match;\n } else if (actionCreator) {\n type = actionCreator.type;\n predicate = actionCreator.match;\n } else if (matcher) {\n predicate = matcher;\n } else if (predicate) {\n } else {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(21) : 0);\n }\n assertFunction(effect, "options.listener");\n return {\n predicate,\n type,\n effect\n };\n};\nvar createListenerEntry = /* @__PURE__ */ redux_toolkit_modern_assign((options) => {\n const {\n type,\n predicate,\n effect\n } = getListenerEntryPropsFrom(options);\n const entry = {\n id: nanoid(),\n effect,\n type,\n predicate,\n pending: /* @__PURE__ */ new Set(),\n unsubscribe: () => {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(22) : 0);\n }\n };\n return entry;\n}, {\n withTypes: () => createListenerEntry\n});\nvar findListenerEntry = (listenerMap, options) => {\n const {\n type,\n effect,\n predicate\n } = getListenerEntryPropsFrom(options);\n return Array.from(listenerMap.values()).find((entry) => {\n const matchPredicateOrType = typeof type === "string" ? entry.type === type : entry.predicate === predicate;\n return matchPredicateOrType && entry.effect === effect;\n });\n};\nvar cancelActiveListeners = (entry) => {\n entry.pending.forEach((controller) => {\n abortControllerWithReason(controller, listenerCancelled);\n });\n};\nvar createClearListenerMiddleware = (listenerMap) => {\n return () => {\n listenerMap.forEach(cancelActiveListeners);\n listenerMap.clear();\n };\n};\nvar safelyNotifyError = (errorHandler, errorToNotify, errorInfo) => {\n try {\n errorHandler(errorToNotify, errorInfo);\n } catch (errorHandlerError) {\n setTimeout(() => {\n throw errorHandlerError;\n }, 0);\n }\n};\nvar addListener = /* @__PURE__ */ redux_toolkit_modern_assign(/* @__PURE__ */ createAction(`${alm}/add`), {\n withTypes: () => addListener\n});\nvar clearAllListeners = /* @__PURE__ */ (/* unused pure expression or super */ null && (createAction(`${alm}/removeAll`)));\nvar removeListener = /* @__PURE__ */ redux_toolkit_modern_assign(/* @__PURE__ */ createAction(`${alm}/remove`), {\n withTypes: () => removeListener\n});\nvar defaultErrorHandler = (...args) => {\n console.error(`${alm}/error`, ...args);\n};\nvar createListenerMiddleware = (middlewareOptions = {}) => {\n const listenerMap = /* @__PURE__ */ new Map();\n const {\n extra,\n onError = defaultErrorHandler\n } = middlewareOptions;\n assertFunction(onError, "onError");\n const insertEntry = (entry) => {\n entry.unsubscribe = () => listenerMap.delete(entry.id);\n listenerMap.set(entry.id, entry);\n return (cancelOptions) => {\n entry.unsubscribe();\n if (cancelOptions?.cancelActive) {\n cancelActiveListeners(entry);\n }\n };\n };\n const startListening = (options) => {\n const entry = findListenerEntry(listenerMap, options) ?? createListenerEntry(options);\n return insertEntry(entry);\n };\n redux_toolkit_modern_assign(startListening, {\n withTypes: () => startListening\n });\n const stopListening = (options) => {\n const entry = findListenerEntry(listenerMap, options);\n if (entry) {\n entry.unsubscribe();\n if (options.cancelActive) {\n cancelActiveListeners(entry);\n }\n }\n return !!entry;\n };\n redux_toolkit_modern_assign(stopListening, {\n withTypes: () => stopListening\n });\n const notifyListener = async (entry, action, api, getOriginalState) => {\n const internalTaskController = new AbortController();\n const take = createTakePattern(startListening, internalTaskController.signal);\n const autoJoinPromises = [];\n try {\n entry.pending.add(internalTaskController);\n await Promise.resolve(entry.effect(\n action,\n // Use assign() rather than ... to avoid extra helper functions added to bundle\n redux_toolkit_modern_assign({}, api, {\n getOriginalState,\n condition: (predicate, timeout) => take(predicate, timeout).then(Boolean),\n take,\n delay: createDelay(internalTaskController.signal),\n pause: createPause(internalTaskController.signal),\n extra,\n signal: internalTaskController.signal,\n fork: createFork(internalTaskController.signal, autoJoinPromises),\n unsubscribe: entry.unsubscribe,\n subscribe: () => {\n listenerMap.set(entry.id, entry);\n },\n cancelActiveListeners: () => {\n entry.pending.forEach((controller, _, set) => {\n if (controller !== internalTaskController) {\n abortControllerWithReason(controller, listenerCancelled);\n set.delete(controller);\n }\n });\n },\n cancel: () => {\n abortControllerWithReason(internalTaskController, listenerCancelled);\n entry.pending.delete(internalTaskController);\n },\n throwIfCancelled: () => {\n validateActive(internalTaskController.signal);\n }\n })\n ));\n } catch (listenerError) {\n if (!(listenerError instanceof TaskAbortError)) {\n safelyNotifyError(onError, listenerError, {\n raisedBy: "effect"\n });\n }\n } finally {\n await Promise.all(autoJoinPromises);\n abortControllerWithReason(internalTaskController, listenerCompleted);\n entry.pending.delete(internalTaskController);\n }\n };\n const clearListenerMiddleware = createClearListenerMiddleware(listenerMap);\n const middleware = (api) => (next) => (action) => {\n if (!isAction3(action)) {\n return next(action);\n }\n if (addListener.match(action)) {\n return startListening(action.payload);\n }\n if (clearAllListeners.match(action)) {\n clearListenerMiddleware();\n return;\n }\n if (removeListener.match(action)) {\n return stopListening(action.payload);\n }\n let originalState = api.getState();\n const getOriginalState = () => {\n if (originalState === INTERNAL_NIL_TOKEN) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(23) : 0);\n }\n return originalState;\n };\n let result;\n try {\n result = next(action);\n if (listenerMap.size > 0) {\n const currentState = api.getState();\n const listenerEntries = Array.from(listenerMap.values());\n for (const entry of listenerEntries) {\n let runListener = false;\n try {\n runListener = entry.predicate(action, currentState, originalState);\n } catch (predicateError) {\n runListener = false;\n safelyNotifyError(onError, predicateError, {\n raisedBy: "predicate"\n });\n }\n if (!runListener) {\n continue;\n }\n notifyListener(entry, action, api, getOriginalState);\n }\n }\n } finally {\n originalState = INTERNAL_NIL_TOKEN;\n }\n return result;\n };\n return {\n middleware,\n startListening,\n stopListening,\n clearListeners: clearListenerMiddleware\n };\n};\n\n// src/dynamicMiddleware/index.ts\n\nvar createMiddlewareEntry = (middleware) => ({\n middleware,\n applied: /* @__PURE__ */ new Map()\n});\nvar matchInstance = (instanceId) => (action) => action?.meta?.instanceId === instanceId;\nvar createDynamicMiddleware = () => {\n const instanceId = nanoid();\n const middlewareMap = /* @__PURE__ */ new Map();\n const withMiddleware = Object.assign(createAction("dynamicMiddleware/add", (...middlewares) => ({\n payload: middlewares,\n meta: {\n instanceId\n }\n })), {\n withTypes: () => withMiddleware\n });\n const addMiddleware = Object.assign(function addMiddleware2(...middlewares) {\n middlewares.forEach((middleware2) => {\n getOrInsertComputed(middlewareMap, middleware2, createMiddlewareEntry);\n });\n }, {\n withTypes: () => addMiddleware\n });\n const getFinalMiddleware = (api) => {\n const appliedMiddleware = Array.from(middlewareMap.values()).map((entry) => getOrInsertComputed(entry.applied, api, entry.middleware));\n return compose3(...appliedMiddleware);\n };\n const isWithMiddleware = isAllOf(withMiddleware, matchInstance(instanceId));\n const middleware = (api) => (next) => (action) => {\n if (isWithMiddleware(action)) {\n addMiddleware(...action.payload);\n return api.dispatch;\n }\n return getFinalMiddleware(api)(next)(action);\n };\n return {\n middleware,\n addMiddleware,\n withMiddleware,\n instanceId\n };\n};\n\n// src/combineSlices.ts\n\nvar isSliceLike = (maybeSliceLike) => "reducerPath" in maybeSliceLike && typeof maybeSliceLike.reducerPath === "string";\nvar getReducers = (slices) => slices.flatMap((sliceOrMap) => isSliceLike(sliceOrMap) ? [[sliceOrMap.reducerPath, sliceOrMap.reducer]] : Object.entries(sliceOrMap));\nvar ORIGINAL_STATE = Symbol.for("rtk-state-proxy-original");\nvar isStateProxy = (value) => !!value && !!value[ORIGINAL_STATE];\nvar stateProxyMap = /* @__PURE__ */ new WeakMap();\nvar createStateProxy = (state, reducerMap, initialStateCache) => getOrInsertComputed(stateProxyMap, state, () => new Proxy(state, {\n get: (target, prop, receiver) => {\n if (prop === ORIGINAL_STATE) return target;\n const result = Reflect.get(target, prop, receiver);\n if (typeof result === "undefined") {\n const cached = initialStateCache[prop];\n if (typeof cached !== "undefined") return cached;\n const reducer = reducerMap[prop];\n if (reducer) {\n const reducerResult = reducer(void 0, {\n type: nanoid()\n });\n if (typeof reducerResult === "undefined") {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(24) : 0);\n }\n initialStateCache[prop] = reducerResult;\n return reducerResult;\n }\n }\n return result;\n }\n}));\nvar redux_toolkit_modern_original = (state) => {\n if (!isStateProxy(state)) {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(25) : 0);\n }\n return state[ORIGINAL_STATE];\n};\nvar emptyObject = {};\nvar noopReducer = (state = emptyObject) => state;\nfunction combineSlices(...slices) {\n const reducerMap = Object.fromEntries(getReducers(slices));\n const getReducer = () => Object.keys(reducerMap).length ? combineReducers2(reducerMap) : noopReducer;\n let reducer = getReducer();\n function combinedReducer(state, action) {\n return reducer(state, action);\n }\n combinedReducer.withLazyLoadedSlices = () => combinedReducer;\n const initialStateCache = {};\n const inject = (slice, config = {}) => {\n const {\n reducerPath,\n reducer: reducerToInject\n } = slice;\n const currentReducer = reducerMap[reducerPath];\n if (!config.overrideExisting && currentReducer && currentReducer !== reducerToInject) {\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n return combinedReducer;\n }\n if (config.overrideExisting && currentReducer !== reducerToInject) {\n delete initialStateCache[reducerPath];\n }\n reducerMap[reducerPath] = reducerToInject;\n reducer = getReducer();\n return combinedReducer;\n };\n const selector = Object.assign(function makeSelector(selectorFn, selectState) {\n return function selector2(state, ...args) {\n return selectorFn(createStateProxy(selectState ? selectState(state, ...args) : state, reducerMap, initialStateCache), ...args);\n };\n }, {\n original: redux_toolkit_modern_original\n });\n return Object.assign(combinedReducer, {\n inject,\n selector\n });\n}\n\n// src/formatProdErrorMessage.ts\nfunction redux_toolkit_modern_formatProdErrorMessage(code) {\n return `Minified Redux Toolkit error #${code}; visit https://redux-toolkit.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `;\n}\n\n//# sourceMappingURL=redux-toolkit.modern.mjs.map\n;// ./node_modules/reselect/dist/reselect.mjs\n// src/devModeChecks/identityFunctionCheck.ts\nvar runIdentityFunctionCheck = (resultFunc, inputSelectorsResults, outputSelectorResult) => {\n if (inputSelectorsResults.length === 1 && inputSelectorsResults[0] === outputSelectorResult) {\n let isInputSameAsOutput = false;\n try {\n const emptyObject = {};\n if (resultFunc(emptyObject) === emptyObject)\n isInputSameAsOutput = true;\n } catch {\n }\n if (isInputSameAsOutput) {\n let stack = void 0;\n try {\n throw new Error();\n } catch (e) {\n ;\n ({ stack } = e);\n }\n console.warn(\n "The result function returned its own inputs without modification. e.g\\n`createSelector([state => state.todos], todos => todos)`\\nThis could lead to inefficient memoization and unnecessary re-renders.\\nEnsure transformation logic is in the result function, and extraction logic is in the input selectors.",\n { stack }\n );\n }\n }\n};\n\n// src/devModeChecks/inputStabilityCheck.ts\nvar runInputStabilityCheck = (inputSelectorResultsObject, options, inputSelectorArgs) => {\n const { memoize, memoizeOptions } = options;\n const { inputSelectorResults, inputSelectorResultsCopy } = inputSelectorResultsObject;\n const createAnEmptyObject = memoize(() => ({}), ...memoizeOptions);\n const areInputSelectorResultsEqual = createAnEmptyObject.apply(null, inputSelectorResults) === createAnEmptyObject.apply(null, inputSelectorResultsCopy);\n if (!areInputSelectorResultsEqual) {\n let stack = void 0;\n try {\n throw new Error();\n } catch (e) {\n ;\n ({ stack } = e);\n }\n console.warn(\n "An input selector returned a different result when passed same arguments.\\nThis means your output selector will likely run more frequently than intended.\\nAvoid returning a new reference inside your input selector, e.g.\\n`createSelector([state => state.todos.map(todo => todo.id)], todoIds => todoIds.length)`",\n {\n arguments: inputSelectorArgs,\n firstInputs: inputSelectorResults,\n secondInputs: inputSelectorResultsCopy,\n stack\n }\n );\n }\n};\n\n// src/devModeChecks/setGlobalDevModeChecks.ts\nvar globalDevModeChecks = {\n inputStabilityCheck: "once",\n identityFunctionCheck: "once"\n};\nvar setGlobalDevModeChecks = (devModeChecks) => {\n Object.assign(globalDevModeChecks, devModeChecks);\n};\n\n// src/utils.ts\nvar NOT_FOUND = /* @__PURE__ */ (/* unused pure expression or super */ null && (Symbol("NOT_FOUND")));\nfunction assertIsFunction(func, errorMessage = `expected a function, instead received ${typeof func}`) {\n if (typeof func !== "function") {\n throw new TypeError(errorMessage);\n }\n}\nfunction assertIsObject(object, errorMessage = `expected an object, instead received ${typeof object}`) {\n if (typeof object !== "object") {\n throw new TypeError(errorMessage);\n }\n}\nfunction assertIsArrayOfFunctions(array, errorMessage = `expected all items to be functions, instead received the following types: `) {\n if (!array.every((item) => typeof item === "function")) {\n const itemTypes = array.map(\n (item) => typeof item === "function" ? `function ${item.name || "unnamed"}()` : typeof item\n ).join(", ");\n throw new TypeError(`${errorMessage}[${itemTypes}]`);\n }\n}\nvar ensureIsArray = (item) => {\n return Array.isArray(item) ? item : [item];\n};\nfunction getDependencies(createSelectorArgs) {\n const dependencies = Array.isArray(createSelectorArgs[0]) ? createSelectorArgs[0] : createSelectorArgs;\n assertIsArrayOfFunctions(\n dependencies,\n `createSelector expects all input-selectors to be functions, but received the following types: `\n );\n return dependencies;\n}\nfunction collectInputSelectorResults(dependencies, inputSelectorArgs) {\n const inputSelectorResults = [];\n const { length } = dependencies;\n for (let i = 0; i < length; i++) {\n inputSelectorResults.push(dependencies[i].apply(null, inputSelectorArgs));\n }\n return inputSelectorResults;\n}\nvar getDevModeChecksExecutionInfo = (firstRun, devModeChecks) => {\n const { identityFunctionCheck, inputStabilityCheck } = {\n ...globalDevModeChecks,\n ...devModeChecks\n };\n return {\n identityFunctionCheck: {\n shouldRun: identityFunctionCheck === "always" || identityFunctionCheck === "once" && firstRun,\n run: runIdentityFunctionCheck\n },\n inputStabilityCheck: {\n shouldRun: inputStabilityCheck === "always" || inputStabilityCheck === "once" && firstRun,\n run: runInputStabilityCheck\n }\n };\n};\n\n// src/autotrackMemoize/autotracking.ts\nvar $REVISION = 0;\nvar CURRENT_TRACKER = null;\nvar Cell = class {\n revision = $REVISION;\n _value;\n _lastValue;\n _isEqual = tripleEq;\n constructor(initialValue, isEqual = tripleEq) {\n this._value = this._lastValue = initialValue;\n this._isEqual = isEqual;\n }\n // Whenever a storage value is read, it\'ll add itself to the current tracker if\n // one exists, entangling its state with that cache.\n get value() {\n CURRENT_TRACKER?.add(this);\n return this._value;\n }\n // Whenever a storage value is updated, we bump the global revision clock,\n // assign the revision for this storage to the new value, _and_ we schedule a\n // rerender. This is important, and it\'s what makes autotracking _pull_\n // based. We don\'t actively tell the caches which depend on the storage that\n // anything has happened. Instead, we recompute the caches when needed.\n set value(newValue) {\n if (this.value === newValue)\n return;\n this._value = newValue;\n this.revision = ++$REVISION;\n }\n};\nfunction tripleEq(a, b) {\n return a === b;\n}\nvar TrackingCache = class {\n _cachedValue;\n _cachedRevision = -1;\n _deps = [];\n hits = 0;\n fn;\n constructor(fn) {\n this.fn = fn;\n }\n clear() {\n this._cachedValue = void 0;\n this._cachedRevision = -1;\n this._deps = [];\n this.hits = 0;\n }\n get value() {\n if (this.revision > this._cachedRevision) {\n const { fn } = this;\n const currentTracker = /* @__PURE__ */ new Set();\n const prevTracker = CURRENT_TRACKER;\n CURRENT_TRACKER = currentTracker;\n this._cachedValue = fn();\n CURRENT_TRACKER = prevTracker;\n this.hits++;\n this._deps = Array.from(currentTracker);\n this._cachedRevision = this.revision;\n }\n CURRENT_TRACKER?.add(this);\n return this._cachedValue;\n }\n get revision() {\n return Math.max(...this._deps.map((d) => d.revision), 0);\n }\n};\nfunction getValue(cell) {\n if (!(cell instanceof Cell)) {\n console.warn("Not a valid cell! ", cell);\n }\n return cell.value;\n}\nfunction setValue(storage, value) {\n if (!(storage instanceof Cell)) {\n throw new TypeError(\n "setValue must be passed a tracked store created with `createStorage`."\n );\n }\n storage.value = storage._lastValue = value;\n}\nfunction createCell(initialValue, isEqual = tripleEq) {\n return new Cell(initialValue, isEqual);\n}\nfunction createCache(fn) {\n assertIsFunction(\n fn,\n "the first parameter to `createCache` must be a function"\n );\n return new TrackingCache(fn);\n}\n\n// src/autotrackMemoize/tracking.ts\nvar neverEq = (a, b) => false;\nfunction createTag() {\n return createCell(null, neverEq);\n}\nfunction dirtyTag(tag, value) {\n setValue(tag, value);\n}\nvar consumeCollection = (node) => {\n let tag = node.collectionTag;\n if (tag === null) {\n tag = node.collectionTag = createTag();\n }\n getValue(tag);\n};\nvar dirtyCollection = (node) => {\n const tag = node.collectionTag;\n if (tag !== null) {\n dirtyTag(tag, null);\n }\n};\n\n// src/autotrackMemoize/proxy.ts\nvar REDUX_PROXY_LABEL = Symbol();\nvar nextId = 0;\nvar proto = Object.getPrototypeOf({});\nvar ObjectTreeNode = class {\n constructor(value) {\n this.value = value;\n this.value = value;\n this.tag.value = value;\n }\n proxy = new Proxy(this, objectProxyHandler);\n tag = createTag();\n tags = {};\n children = {};\n collectionTag = null;\n id = nextId++;\n};\nvar objectProxyHandler = {\n get(node, key) {\n function calculateResult() {\n const { value } = node;\n const childValue = Reflect.get(value, key);\n if (typeof key === "symbol") {\n return childValue;\n }\n if (key in proto) {\n return childValue;\n }\n if (typeof childValue === "object" && childValue !== null) {\n let childNode = node.children[key];\n if (childNode === void 0) {\n childNode = node.children[key] = createNode(childValue);\n }\n if (childNode.tag) {\n getValue(childNode.tag);\n }\n return childNode.proxy;\n } else {\n let tag = node.tags[key];\n if (tag === void 0) {\n tag = node.tags[key] = createTag();\n tag.value = childValue;\n }\n getValue(tag);\n return childValue;\n }\n }\n const res = calculateResult();\n return res;\n },\n ownKeys(node) {\n consumeCollection(node);\n return Reflect.ownKeys(node.value);\n },\n getOwnPropertyDescriptor(node, prop) {\n return Reflect.getOwnPropertyDescriptor(node.value, prop);\n },\n has(node, prop) {\n return Reflect.has(node.value, prop);\n }\n};\nvar ArrayTreeNode = class {\n constructor(value) {\n this.value = value;\n this.value = value;\n this.tag.value = value;\n }\n proxy = new Proxy([this], arrayProxyHandler);\n tag = createTag();\n tags = {};\n children = {};\n collectionTag = null;\n id = nextId++;\n};\nvar arrayProxyHandler = {\n get([node], key) {\n if (key === "length") {\n consumeCollection(node);\n }\n return objectProxyHandler.get(node, key);\n },\n ownKeys([node]) {\n return objectProxyHandler.ownKeys(node);\n },\n getOwnPropertyDescriptor([node], prop) {\n return objectProxyHandler.getOwnPropertyDescriptor(node, prop);\n },\n has([node], prop) {\n return objectProxyHandler.has(node, prop);\n }\n};\nfunction createNode(value) {\n if (Array.isArray(value)) {\n return new ArrayTreeNode(value);\n }\n return new ObjectTreeNode(value);\n}\nfunction updateNode(node, newValue) {\n const { value, tags, children } = node;\n node.value = newValue;\n if (Array.isArray(value) && Array.isArray(newValue) && value.length !== newValue.length) {\n dirtyCollection(node);\n } else {\n if (value !== newValue) {\n let oldKeysSize = 0;\n let newKeysSize = 0;\n let anyKeysAdded = false;\n for (const _key in value) {\n oldKeysSize++;\n }\n for (const key in newValue) {\n newKeysSize++;\n if (!(key in value)) {\n anyKeysAdded = true;\n break;\n }\n }\n const isDifferent = anyKeysAdded || oldKeysSize !== newKeysSize;\n if (isDifferent) {\n dirtyCollection(node);\n }\n }\n }\n for (const key in tags) {\n const childValue = value[key];\n const newChildValue = newValue[key];\n if (childValue !== newChildValue) {\n dirtyCollection(node);\n dirtyTag(tags[key], newChildValue);\n }\n if (typeof newChildValue === "object" && newChildValue !== null) {\n delete tags[key];\n }\n }\n for (const key in children) {\n const childNode = children[key];\n const newChildValue = newValue[key];\n const childValue = childNode.value;\n if (childValue === newChildValue) {\n continue;\n } else if (typeof newChildValue === "object" && newChildValue !== null) {\n updateNode(childNode, newChildValue);\n } else {\n deleteNode(childNode);\n delete children[key];\n }\n }\n}\nfunction deleteNode(node) {\n if (node.tag) {\n dirtyTag(node.tag, null);\n }\n dirtyCollection(node);\n for (const key in node.tags) {\n dirtyTag(node.tags[key], null);\n }\n for (const key in node.children) {\n deleteNode(node.children[key]);\n }\n}\n\n// src/lruMemoize.ts\nfunction createSingletonCache(equals) {\n let entry;\n return {\n get(key) {\n if (entry && equals(entry.key, key)) {\n return entry.value;\n }\n return NOT_FOUND;\n },\n put(key, value) {\n entry = { key, value };\n },\n getEntries() {\n return entry ? [entry] : [];\n },\n clear() {\n entry = void 0;\n }\n };\n}\nfunction createLruCache(maxSize, equals) {\n let entries = [];\n function get(key) {\n const cacheIndex = entries.findIndex((entry) => equals(key, entry.key));\n if (cacheIndex > -1) {\n const entry = entries[cacheIndex];\n if (cacheIndex > 0) {\n entries.splice(cacheIndex, 1);\n entries.unshift(entry);\n }\n return entry.value;\n }\n return NOT_FOUND;\n }\n function put(key, value) {\n if (get(key) === NOT_FOUND) {\n entries.unshift({ key, value });\n if (entries.length > maxSize) {\n entries.pop();\n }\n }\n }\n function getEntries() {\n return entries;\n }\n function clear() {\n entries = [];\n }\n return { get, put, getEntries, clear };\n}\nvar referenceEqualityCheck = (a, b) => a === b;\nfunction createCacheKeyComparator(equalityCheck) {\n return function areArgumentsShallowlyEqual(prev, next) {\n if (prev === null || next === null || prev.length !== next.length) {\n return false;\n }\n const { length } = prev;\n for (let i = 0; i < length; i++) {\n if (!equalityCheck(prev[i], next[i])) {\n return false;\n }\n }\n return true;\n };\n}\nfunction lruMemoize(func, equalityCheckOrOptions) {\n const providedOptions = typeof equalityCheckOrOptions === "object" ? equalityCheckOrOptions : { equalityCheck: equalityCheckOrOptions };\n const {\n equalityCheck = referenceEqualityCheck,\n maxSize = 1,\n resultEqualityCheck\n } = providedOptions;\n const comparator = createCacheKeyComparator(equalityCheck);\n let resultsCount = 0;\n const cache = maxSize <= 1 ? createSingletonCache(comparator) : createLruCache(maxSize, comparator);\n function memoized() {\n let value = cache.get(arguments);\n if (value === NOT_FOUND) {\n value = func.apply(null, arguments);\n resultsCount++;\n if (resultEqualityCheck) {\n const entries = cache.getEntries();\n const matchingEntry = entries.find(\n (entry) => resultEqualityCheck(entry.value, value)\n );\n if (matchingEntry) {\n value = matchingEntry.value;\n resultsCount !== 0 && resultsCount--;\n }\n }\n cache.put(arguments, value);\n }\n return value;\n }\n memoized.clearCache = () => {\n cache.clear();\n memoized.resetResultsCount();\n };\n memoized.resultsCount = () => resultsCount;\n memoized.resetResultsCount = () => {\n resultsCount = 0;\n };\n return memoized;\n}\n\n// src/autotrackMemoize/autotrackMemoize.ts\nfunction autotrackMemoize(func) {\n const node = createNode(\n []\n );\n let lastArgs = null;\n const shallowEqual = createCacheKeyComparator(referenceEqualityCheck);\n const cache = createCache(() => {\n const res = func.apply(null, node.proxy);\n return res;\n });\n function memoized() {\n if (!shallowEqual(lastArgs, arguments)) {\n updateNode(node, arguments);\n lastArgs = arguments;\n }\n return cache.value;\n }\n memoized.clearCache = () => {\n return cache.clear();\n };\n return memoized;\n}\n\n// src/weakMapMemoize.ts\nvar StrongRef = class {\n constructor(value) {\n this.value = value;\n }\n deref() {\n return this.value;\n }\n};\nvar Ref = typeof WeakRef !== "undefined" ? WeakRef : StrongRef;\nvar UNTERMINATED = 0;\nvar TERMINATED = 1;\nfunction createCacheNode() {\n return {\n s: UNTERMINATED,\n v: void 0,\n o: null,\n p: null\n };\n}\nfunction reselect_weakMapMemoize(func, options = {}) {\n let fnNode = createCacheNode();\n const { resultEqualityCheck } = options;\n let lastResult;\n let resultsCount = 0;\n function memoized() {\n let cacheNode = fnNode;\n const { length } = arguments;\n for (let i = 0, l = length; i < l; i++) {\n const arg = arguments[i];\n if (typeof arg === "function" || typeof arg === "object" && arg !== null) {\n let objectCache = cacheNode.o;\n if (objectCache === null) {\n cacheNode.o = objectCache = /* @__PURE__ */ new WeakMap();\n }\n const objectNode = objectCache.get(arg);\n if (objectNode === void 0) {\n cacheNode = createCacheNode();\n objectCache.set(arg, cacheNode);\n } else {\n cacheNode = objectNode;\n }\n } else {\n let primitiveCache = cacheNode.p;\n if (primitiveCache === null) {\n cacheNode.p = primitiveCache = /* @__PURE__ */ new Map();\n }\n const primitiveNode = primitiveCache.get(arg);\n if (primitiveNode === void 0) {\n cacheNode = createCacheNode();\n primitiveCache.set(arg, cacheNode);\n } else {\n cacheNode = primitiveNode;\n }\n }\n }\n const terminatedNode = cacheNode;\n let result;\n if (cacheNode.s === TERMINATED) {\n result = cacheNode.v;\n } else {\n result = func.apply(null, arguments);\n resultsCount++;\n if (resultEqualityCheck) {\n const lastResultValue = lastResult?.deref?.() ?? lastResult;\n if (lastResultValue != null && resultEqualityCheck(lastResultValue, result)) {\n result = lastResultValue;\n resultsCount !== 0 && resultsCount--;\n }\n const needsWeakRef = typeof result === "object" && result !== null || typeof result === "function";\n lastResult = needsWeakRef ? new Ref(result) : result;\n }\n }\n terminatedNode.s = TERMINATED;\n terminatedNode.v = result;\n return result;\n }\n memoized.clearCache = () => {\n fnNode = createCacheNode();\n memoized.resetResultsCount();\n };\n memoized.resultsCount = () => resultsCount;\n memoized.resetResultsCount = () => {\n resultsCount = 0;\n };\n return memoized;\n}\n\n// src/createSelectorCreator.ts\nfunction reselect_createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) {\n const createSelectorCreatorOptions = typeof memoizeOrOptions === "function" ? {\n memoize: memoizeOrOptions,\n memoizeOptions: memoizeOptionsFromArgs\n } : memoizeOrOptions;\n const createSelector2 = (...createSelectorArgs) => {\n let recomputations = 0;\n let dependencyRecomputations = 0;\n let lastResult;\n let directlyPassedOptions = {};\n let resultFunc = createSelectorArgs.pop();\n if (typeof resultFunc === "object") {\n directlyPassedOptions = resultFunc;\n resultFunc = createSelectorArgs.pop();\n }\n assertIsFunction(\n resultFunc,\n `createSelector expects an output function after the inputs, but received: [${typeof resultFunc}]`\n );\n const combinedOptions = {\n ...createSelectorCreatorOptions,\n ...directlyPassedOptions\n };\n const {\n memoize,\n memoizeOptions = [],\n argsMemoize = reselect_weakMapMemoize,\n argsMemoizeOptions = [],\n devModeChecks = {}\n } = combinedOptions;\n const finalMemoizeOptions = ensureIsArray(memoizeOptions);\n const finalArgsMemoizeOptions = ensureIsArray(argsMemoizeOptions);\n const dependencies = getDependencies(createSelectorArgs);\n const memoizedResultFunc = memoize(function recomputationWrapper() {\n recomputations++;\n return resultFunc.apply(\n null,\n arguments\n );\n }, ...finalMemoizeOptions);\n let firstRun = true;\n const selector = argsMemoize(function dependenciesChecker() {\n dependencyRecomputations++;\n const inputSelectorResults = collectInputSelectorResults(\n dependencies,\n arguments\n );\n lastResult = memoizedResultFunc.apply(null, inputSelectorResults);\n if (false) // removed by dead control flow\n{}\n return lastResult;\n }, ...finalArgsMemoizeOptions);\n return Object.assign(selector, {\n resultFunc,\n memoizedResultFunc,\n dependencies,\n dependencyRecomputations: () => dependencyRecomputations,\n resetDependencyRecomputations: () => {\n dependencyRecomputations = 0;\n },\n lastResult: () => lastResult,\n recomputations: () => recomputations,\n resetRecomputations: () => {\n recomputations = 0;\n },\n memoize,\n argsMemoize\n });\n };\n Object.assign(createSelector2, {\n withTypes: () => createSelector2\n });\n return createSelector2;\n}\nvar createSelector = /* @__PURE__ */ reselect_createSelectorCreator(reselect_weakMapMemoize);\n\n// src/createStructuredSelector.ts\nvar createStructuredSelector = Object.assign(\n (inputSelectorsObject, selectorCreator = createSelector) => {\n assertIsObject(\n inputSelectorsObject,\n `createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ${typeof inputSelectorsObject}`\n );\n const inputSelectorKeys = Object.keys(inputSelectorsObject);\n const dependencies = inputSelectorKeys.map(\n (key) => inputSelectorsObject[key]\n );\n const structuredSelector = selectorCreator(\n dependencies,\n (...inputSelectorResults) => {\n return inputSelectorResults.reduce((composition, value, index) => {\n composition[inputSelectorKeys[index]] = value;\n return composition;\n }, {});\n }\n );\n return structuredSelector;\n },\n { withTypes: () => createStructuredSelector }\n);\n\n//# sourceMappingURL=reselect.mjs.map\n;// ./node_modules/@standard-schema/utils/dist/index.js\n// src/getDotPath/getDotPath.ts\nfunction getDotPath(issue) {\n if (issue.path?.length) {\n let dotPath = "";\n for (const item of issue.path) {\n const key = typeof item === "object" ? item.key : item;\n if (typeof key === "string" || typeof key === "number") {\n if (dotPath) {\n dotPath += `.${key}`;\n } else {\n dotPath += key;\n }\n } else {\n return null;\n }\n }\n return dotPath;\n }\n return null;\n}\n\n// src/SchemaError/SchemaError.ts\nvar SchemaError = class extends Error {\n /**\n * The schema issues.\n */\n issues;\n /**\n * Creates a schema error with useful information.\n *\n * @param issues The schema issues.\n */\n constructor(issues) {\n super(issues[0].message);\n this.name = "SchemaError";\n this.issues = issues;\n }\n};\n\n\n;// ./node_modules/@forgerock/javascript-sdk/node_modules/@reduxjs/toolkit/dist/query/rtk-query.modern.mjs\n// src/query/core/apiState.ts\nvar QueryStatus = /* @__PURE__ */ ((QueryStatus2) => {\n QueryStatus2["uninitialized"] = "uninitialized";\n QueryStatus2["pending"] = "pending";\n QueryStatus2["fulfilled"] = "fulfilled";\n QueryStatus2["rejected"] = "rejected";\n return QueryStatus2;\n})(QueryStatus || {});\nfunction getRequestStatusFlags(status) {\n return {\n status,\n isUninitialized: status === "uninitialized" /* uninitialized */,\n isLoading: status === "pending" /* pending */,\n isSuccess: status === "fulfilled" /* fulfilled */,\n isError: status === "rejected" /* rejected */\n };\n}\n\n// src/query/core/rtkImports.ts\n\n\n// src/query/utils/copyWithStructuralSharing.ts\nvar isPlainObject2 = redux_isPlainObject;\nfunction copyWithStructuralSharing(oldObj, newObj) {\n if (oldObj === newObj || !(isPlainObject2(oldObj) && isPlainObject2(newObj) || Array.isArray(oldObj) && Array.isArray(newObj))) {\n return newObj;\n }\n const newKeys = Object.keys(newObj);\n const oldKeys = Object.keys(oldObj);\n let isSameObject = newKeys.length === oldKeys.length;\n const mergeObj = Array.isArray(newObj) ? [] : {};\n for (const key of newKeys) {\n mergeObj[key] = copyWithStructuralSharing(oldObj[key], newObj[key]);\n if (isSameObject) isSameObject = oldObj[key] === mergeObj[key];\n }\n return isSameObject ? oldObj : mergeObj;\n}\n\n// src/query/utils/countObjectKeys.ts\nfunction countObjectKeys(obj) {\n let count = 0;\n for (const _key in obj) {\n count++;\n }\n return count;\n}\n\n// src/query/utils/flatten.ts\nvar flatten = (arr) => [].concat(...arr);\n\n// src/query/utils/isAbsoluteUrl.ts\nfunction isAbsoluteUrl(url) {\n return new RegExp(`(^|:)//`).test(url);\n}\n\n// src/query/utils/isDocumentVisible.ts\nfunction isDocumentVisible() {\n if (typeof document === "undefined") {\n return true;\n }\n return document.visibilityState !== "hidden";\n}\n\n// src/query/utils/isNotNullish.ts\nfunction isNotNullish(v) {\n return v != null;\n}\n\n// src/query/utils/isOnline.ts\nfunction isOnline() {\n return typeof navigator === "undefined" ? true : navigator.onLine === void 0 ? true : navigator.onLine;\n}\n\n// src/query/utils/joinUrls.ts\nvar withoutTrailingSlash = (url) => url.replace(/\\/$/, "");\nvar withoutLeadingSlash = (url) => url.replace(/^\\//, "");\nfunction joinUrls(base, url) {\n if (!base) {\n return url;\n }\n if (!url) {\n return base;\n }\n if (isAbsoluteUrl(url)) {\n return url;\n }\n const delimiter = base.endsWith("/") || !url.startsWith("?") ? "/" : "";\n base = withoutTrailingSlash(base);\n url = withoutLeadingSlash(url);\n return `${base}${delimiter}${url}`;\n}\n\n// src/query/utils/getOrInsert.ts\nfunction getOrInsert(map, key, value) {\n if (map.has(key)) return map.get(key);\n return map.set(key, value).get(key);\n}\n\n// src/query/fetchBaseQuery.ts\nvar defaultFetchFn = (...args) => fetch(...args);\nvar defaultValidateStatus = (response) => response.status >= 200 && response.status <= 299;\nvar defaultIsJsonContentType = (headers) => (\n /*applicat*/\n /ion\\/(vnd\\.api\\+)?json/.test(headers.get("content-type") || "")\n);\nfunction stripUndefined(obj) {\n if (!redux_isPlainObject(obj)) {\n return obj;\n }\n const copy = {\n ...obj\n };\n for (const [k, v] of Object.entries(copy)) {\n if (v === void 0) delete copy[k];\n }\n return copy;\n}\nfunction fetchBaseQuery({\n baseUrl,\n prepareHeaders = (x) => x,\n fetchFn = defaultFetchFn,\n paramsSerializer,\n isJsonContentType = defaultIsJsonContentType,\n jsonContentType = "application/json",\n jsonReplacer,\n timeout: defaultTimeout,\n responseHandler: globalResponseHandler,\n validateStatus: globalValidateStatus,\n ...baseFetchOptions\n} = {}) {\n if (typeof fetch === "undefined" && fetchFn === defaultFetchFn) {\n console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments.");\n }\n return async (arg, api, extraOptions) => {\n const {\n getState,\n extra,\n endpoint,\n forced,\n type\n } = api;\n let meta;\n let {\n url,\n headers = new Headers(baseFetchOptions.headers),\n params = void 0,\n responseHandler = globalResponseHandler ?? "json",\n validateStatus = globalValidateStatus ?? defaultValidateStatus,\n timeout = defaultTimeout,\n ...rest\n } = typeof arg == "string" ? {\n url: arg\n } : arg;\n let abortController, signal = api.signal;\n if (timeout) {\n abortController = new AbortController();\n api.signal.addEventListener("abort", abortController.abort);\n signal = abortController.signal;\n }\n let config = {\n ...baseFetchOptions,\n signal,\n ...rest\n };\n headers = new Headers(stripUndefined(headers));\n config.headers = await prepareHeaders(headers, {\n getState,\n arg,\n extra,\n endpoint,\n forced,\n type,\n extraOptions\n }) || headers;\n const isJsonifiable = (body) => typeof body === "object" && (redux_isPlainObject(body) || Array.isArray(body) || typeof body.toJSON === "function");\n if (!config.headers.has("content-type") && isJsonifiable(config.body)) {\n config.headers.set("content-type", jsonContentType);\n }\n if (isJsonifiable(config.body) && isJsonContentType(config.headers)) {\n config.body = JSON.stringify(config.body, jsonReplacer);\n }\n if (params) {\n const divider = ~url.indexOf("?") ? "&" : "?";\n const query = paramsSerializer ? paramsSerializer(params) : new URLSearchParams(stripUndefined(params));\n url += divider + query;\n }\n url = joinUrls(baseUrl, url);\n const request = new Request(url, config);\n const requestClone = new Request(url, config);\n meta = {\n request: requestClone\n };\n let response, timedOut = false, timeoutId = abortController && setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeout);\n try {\n response = await fetchFn(request);\n } catch (e) {\n return {\n error: {\n status: timedOut ? "TIMEOUT_ERROR" : "FETCH_ERROR",\n error: String(e)\n },\n meta\n };\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n abortController?.signal.removeEventListener("abort", abortController.abort);\n }\n const responseClone = response.clone();\n meta.response = responseClone;\n let resultData;\n let responseText = "";\n try {\n let handleResponseError;\n await Promise.all([\n handleResponse(response, responseHandler).then((r) => resultData = r, (e) => handleResponseError = e),\n // see https://github.com/node-fetch/node-fetch/issues/665#issuecomment-538995182\n // we *have* to "use up" both streams at the same time or they will stop running in node-fetch scenarios\n responseClone.text().then((r) => responseText = r, () => {\n })\n ]);\n if (handleResponseError) throw handleResponseError;\n } catch (e) {\n return {\n error: {\n status: "PARSING_ERROR",\n originalStatus: response.status,\n data: responseText,\n error: String(e)\n },\n meta\n };\n }\n return validateStatus(response, resultData) ? {\n data: resultData,\n meta\n } : {\n error: {\n status: response.status,\n data: resultData\n },\n meta\n };\n };\n async function handleResponse(response, responseHandler) {\n if (typeof responseHandler === "function") {\n return responseHandler(response);\n }\n if (responseHandler === "content-type") {\n responseHandler = isJsonContentType(response.headers) ? "json" : "text";\n }\n if (responseHandler === "json") {\n const text = await response.text();\n return text.length ? JSON.parse(text) : null;\n }\n return response.text();\n }\n}\n\n// src/query/HandledError.ts\nvar HandledError = class {\n constructor(value, meta = void 0) {\n this.value = value;\n this.meta = meta;\n }\n};\n\n// src/query/retry.ts\nasync function defaultBackoff(attempt = 0, maxRetries = 5) {\n const attempts = Math.min(attempt, maxRetries);\n const timeout = ~~((Math.random() + 0.4) * (300 << attempts));\n await new Promise((resolve) => setTimeout((res) => resolve(res), timeout));\n}\nfunction fail(error, meta) {\n throw Object.assign(new HandledError({\n error,\n meta\n }), {\n throwImmediately: true\n });\n}\nvar EMPTY_OPTIONS = {};\nvar retryWithBackoff = (baseQuery, defaultOptions) => async (args, api, extraOptions) => {\n const possibleMaxRetries = [5, (defaultOptions || EMPTY_OPTIONS).maxRetries, (extraOptions || EMPTY_OPTIONS).maxRetries].filter((x) => x !== void 0);\n const [maxRetries] = possibleMaxRetries.slice(-1);\n const defaultRetryCondition = (_, __, {\n attempt\n }) => attempt <= maxRetries;\n const options = {\n maxRetries,\n backoff: defaultBackoff,\n retryCondition: defaultRetryCondition,\n ...defaultOptions,\n ...extraOptions\n };\n let retry2 = 0;\n while (true) {\n try {\n const result = await baseQuery(args, api, extraOptions);\n if (result.error) {\n throw new HandledError(result);\n }\n return result;\n } catch (e) {\n retry2++;\n if (e.throwImmediately) {\n if (e instanceof HandledError) {\n return e.value;\n }\n throw e;\n }\n if (e instanceof HandledError && !options.retryCondition(e.value.error, args, {\n attempt: retry2,\n baseQueryApi: api,\n extraOptions\n })) {\n return e.value;\n }\n await options.backoff(retry2, options.maxRetries);\n }\n }\n};\nvar retry = /* @__PURE__ */ Object.assign(retryWithBackoff, {\n fail\n});\n\n// src/query/core/setupListeners.ts\nvar onFocus = /* @__PURE__ */ createAction("__rtkq/focused");\nvar onFocusLost = /* @__PURE__ */ createAction("__rtkq/unfocused");\nvar onOnline = /* @__PURE__ */ createAction("__rtkq/online");\nvar onOffline = /* @__PURE__ */ createAction("__rtkq/offline");\nvar initialized = false;\nfunction setupListeners(dispatch, customHandler) {\n function defaultHandler() {\n const handleFocus = () => dispatch(onFocus());\n const handleFocusLost = () => dispatch(onFocusLost());\n const handleOnline = () => dispatch(onOnline());\n const handleOffline = () => dispatch(onOffline());\n const handleVisibilityChange = () => {\n if (window.document.visibilityState === "visible") {\n handleFocus();\n } else {\n handleFocusLost();\n }\n };\n if (!initialized) {\n if (typeof window !== "undefined" && window.addEventListener) {\n window.addEventListener("visibilitychange", handleVisibilityChange, false);\n window.addEventListener("focus", handleFocus, false);\n window.addEventListener("online", handleOnline, false);\n window.addEventListener("offline", handleOffline, false);\n initialized = true;\n }\n }\n const unsubscribe = () => {\n window.removeEventListener("focus", handleFocus);\n window.removeEventListener("visibilitychange", handleVisibilityChange);\n window.removeEventListener("online", handleOnline);\n window.removeEventListener("offline", handleOffline);\n initialized = false;\n };\n return unsubscribe;\n }\n return customHandler ? customHandler(dispatch, {\n onFocus,\n onFocusLost,\n onOffline,\n onOnline\n }) : defaultHandler();\n}\n\n// src/query/endpointDefinitions.ts\nfunction isQueryDefinition(e) {\n return e.type === "query" /* query */;\n}\nfunction isMutationDefinition(e) {\n return e.type === "mutation" /* mutation */;\n}\nfunction isInfiniteQueryDefinition(e) {\n return e.type === "infinitequery" /* infinitequery */;\n}\nfunction isAnyQueryDefinition(e) {\n return isQueryDefinition(e) || isInfiniteQueryDefinition(e);\n}\nfunction calculateProvidedBy(description, result, error, queryArg, meta, assertTagTypes) {\n if (isFunction(description)) {\n return description(result, error, queryArg, meta).filter(isNotNullish).map(expandTagDescription).map(assertTagTypes);\n }\n if (Array.isArray(description)) {\n return description.map(expandTagDescription).map(assertTagTypes);\n }\n return [];\n}\nfunction isFunction(t) {\n return typeof t === "function";\n}\nfunction expandTagDescription(description) {\n return typeof description === "string" ? {\n type: description\n } : description;\n}\n\n// src/query/core/buildThunks.ts\n\n\n// src/query/core/buildInitiate.ts\n\n\n// src/tsHelpers.ts\nfunction asSafePromise(promise, fallback) {\n return promise.catch(fallback);\n}\n\n// src/query/core/buildInitiate.ts\nvar forceQueryFnSymbol = Symbol("forceQueryFn");\nvar isUpsertQuery = (arg) => typeof arg[forceQueryFnSymbol] === "function";\nfunction buildInitiate({\n serializeQueryArgs,\n queryThunk,\n infiniteQueryThunk,\n mutationThunk,\n api,\n context\n}) {\n const runningQueries = /* @__PURE__ */ new Map();\n const runningMutations = /* @__PURE__ */ new Map();\n const {\n unsubscribeQueryResult,\n removeMutationResult,\n updateSubscriptionOptions\n } = api.internalActions;\n return {\n buildInitiateQuery,\n buildInitiateInfiniteQuery,\n buildInitiateMutation,\n getRunningQueryThunk,\n getRunningMutationThunk,\n getRunningQueriesThunk,\n getRunningMutationsThunk\n };\n function getRunningQueryThunk(endpointName, queryArgs) {\n return (dispatch) => {\n const endpointDefinition = context.endpointDefinitions[endpointName];\n const queryCacheKey = serializeQueryArgs({\n queryArgs,\n endpointDefinition,\n endpointName\n });\n return runningQueries.get(dispatch)?.[queryCacheKey];\n };\n }\n function getRunningMutationThunk(_endpointName, fixedCacheKeyOrRequestId) {\n return (dispatch) => {\n return runningMutations.get(dispatch)?.[fixedCacheKeyOrRequestId];\n };\n }\n function getRunningQueriesThunk() {\n return (dispatch) => Object.values(runningQueries.get(dispatch) || {}).filter(isNotNullish);\n }\n function getRunningMutationsThunk() {\n return (dispatch) => Object.values(runningMutations.get(dispatch) || {}).filter(isNotNullish);\n }\n function middlewareWarning(dispatch) {\n if (false) // removed by dead control flow\n{}\n }\n function buildInitiateAnyQuery(endpointName, endpointDefinition) {\n const queryAction = (arg, {\n subscribe = true,\n forceRefetch,\n subscriptionOptions,\n [forceQueryFnSymbol]: forceQueryFn,\n ...rest\n } = {}) => (dispatch, getState) => {\n const queryCacheKey = serializeQueryArgs({\n queryArgs: arg,\n endpointDefinition,\n endpointName\n });\n let thunk;\n const commonThunkArgs = {\n ...rest,\n type: "query",\n subscribe,\n forceRefetch,\n subscriptionOptions,\n endpointName,\n originalArgs: arg,\n queryCacheKey,\n [forceQueryFnSymbol]: forceQueryFn\n };\n if (isQueryDefinition(endpointDefinition)) {\n thunk = queryThunk(commonThunkArgs);\n } else {\n const {\n direction,\n initialPageParam\n } = rest;\n thunk = infiniteQueryThunk({\n ...commonThunkArgs,\n // Supply these even if undefined. This helps with a field existence\n // check over in `buildSlice.ts`\n direction,\n initialPageParam\n });\n }\n const selector = api.endpoints[endpointName].select(arg);\n const thunkResult = dispatch(thunk);\n const stateAfter = selector(getState());\n middlewareWarning(dispatch);\n const {\n requestId,\n abort\n } = thunkResult;\n const skippedSynchronously = stateAfter.requestId !== requestId;\n const runningQuery = runningQueries.get(dispatch)?.[queryCacheKey];\n const selectFromState = () => selector(getState());\n const statePromise = Object.assign(forceQueryFn ? (\n // a query has been forced (upsertQueryData)\n // -> we want to resolve it once data has been written with the data that will be written\n thunkResult.then(selectFromState)\n ) : skippedSynchronously && !runningQuery ? (\n // a query has been skipped due to a condition and we do not have any currently running query\n // -> we want to resolve it immediately with the current data\n Promise.resolve(stateAfter)\n ) : (\n // query just started or one is already in flight\n // -> wait for the running query, then resolve with data from after that\n Promise.all([runningQuery, thunkResult]).then(selectFromState)\n ), {\n arg,\n requestId,\n subscriptionOptions,\n queryCacheKey,\n abort,\n async unwrap() {\n const result = await statePromise;\n if (result.isError) {\n throw result.error;\n }\n return result.data;\n },\n refetch: () => dispatch(queryAction(arg, {\n subscribe: false,\n forceRefetch: true\n })),\n unsubscribe() {\n if (subscribe) dispatch(unsubscribeQueryResult({\n queryCacheKey,\n requestId\n }));\n },\n updateSubscriptionOptions(options) {\n statePromise.subscriptionOptions = options;\n dispatch(updateSubscriptionOptions({\n endpointName,\n requestId,\n queryCacheKey,\n options\n }));\n }\n });\n if (!runningQuery && !skippedSynchronously && !forceQueryFn) {\n const running = getOrInsert(runningQueries, dispatch, {});\n running[queryCacheKey] = statePromise;\n statePromise.then(() => {\n delete running[queryCacheKey];\n if (!countObjectKeys(running)) {\n runningQueries.delete(dispatch);\n }\n });\n }\n return statePromise;\n };\n return queryAction;\n }\n function buildInitiateQuery(endpointName, endpointDefinition) {\n const queryAction = buildInitiateAnyQuery(endpointName, endpointDefinition);\n return queryAction;\n }\n function buildInitiateInfiniteQuery(endpointName, endpointDefinition) {\n const infiniteQueryAction = buildInitiateAnyQuery(endpointName, endpointDefinition);\n return infiniteQueryAction;\n }\n function buildInitiateMutation(endpointName) {\n return (arg, {\n track = true,\n fixedCacheKey\n } = {}) => (dispatch, getState) => {\n const thunk = mutationThunk({\n type: "mutation",\n endpointName,\n originalArgs: arg,\n track,\n fixedCacheKey\n });\n const thunkResult = dispatch(thunk);\n middlewareWarning(dispatch);\n const {\n requestId,\n abort,\n unwrap\n } = thunkResult;\n const returnValuePromise = asSafePromise(thunkResult.unwrap().then((data) => ({\n data\n })), (error) => ({\n error\n }));\n const reset = () => {\n dispatch(removeMutationResult({\n requestId,\n fixedCacheKey\n }));\n };\n const ret = Object.assign(returnValuePromise, {\n arg: thunkResult.arg,\n requestId,\n abort,\n unwrap,\n reset\n });\n const running = runningMutations.get(dispatch) || {};\n runningMutations.set(dispatch, running);\n running[requestId] = ret;\n ret.then(() => {\n delete running[requestId];\n if (!countObjectKeys(running)) {\n runningMutations.delete(dispatch);\n }\n });\n if (fixedCacheKey) {\n running[fixedCacheKey] = ret;\n ret.then(() => {\n if (running[fixedCacheKey] === ret) {\n delete running[fixedCacheKey];\n if (!countObjectKeys(running)) {\n runningMutations.delete(dispatch);\n }\n }\n });\n }\n return ret;\n };\n }\n}\n\n// src/query/standardSchema.ts\n\nvar NamedSchemaError = class extends SchemaError {\n constructor(issues, value, schemaName, _bqMeta) {\n super(issues);\n this.value = value;\n this.schemaName = schemaName;\n this._bqMeta = _bqMeta;\n }\n};\nasync function parseWithSchema(schema, data, schemaName, bqMeta) {\n const result = await schema["~standard"].validate(data);\n if (result.issues) {\n throw new NamedSchemaError(result.issues, data, schemaName, bqMeta);\n }\n return result.value;\n}\n\n// src/query/core/buildThunks.ts\nfunction defaultTransformResponse(baseQueryReturnValue) {\n return baseQueryReturnValue;\n}\nvar addShouldAutoBatch = (arg = {}) => {\n return {\n ...arg,\n [SHOULD_AUTOBATCH]: true\n };\n};\nfunction buildThunks({\n reducerPath,\n baseQuery,\n context: {\n endpointDefinitions\n },\n serializeQueryArgs,\n api,\n assertTagType,\n selectors,\n onSchemaFailure,\n catchSchemaFailure: globalCatchSchemaFailure,\n skipSchemaValidation: globalSkipSchemaValidation\n}) {\n const patchQueryData = (endpointName, arg, patches, updateProvided) => (dispatch, getState) => {\n const endpointDefinition = endpointDefinitions[endpointName];\n const queryCacheKey = serializeQueryArgs({\n queryArgs: arg,\n endpointDefinition,\n endpointName\n });\n dispatch(api.internalActions.queryResultPatched({\n queryCacheKey,\n patches\n }));\n if (!updateProvided) {\n return;\n }\n const newValue = api.endpoints[endpointName].select(arg)(\n // Work around TS 4.1 mismatch\n getState()\n );\n const providedTags = calculateProvidedBy(endpointDefinition.providesTags, newValue.data, void 0, arg, {}, assertTagType);\n dispatch(api.internalActions.updateProvidedBy([{\n queryCacheKey,\n providedTags\n }]));\n };\n function addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n }\n function addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n }\n const updateQueryData = (endpointName, arg, updateRecipe, updateProvided = true) => (dispatch, getState) => {\n const endpointDefinition = api.endpoints[endpointName];\n const currentState = endpointDefinition.select(arg)(\n // Work around TS 4.1 mismatch\n getState()\n );\n const ret = {\n patches: [],\n inversePatches: [],\n undo: () => dispatch(api.util.patchQueryData(endpointName, arg, ret.inversePatches, updateProvided))\n };\n if (currentState.status === "uninitialized" /* uninitialized */) {\n return ret;\n }\n let newValue;\n if ("data" in currentState) {\n if (isDraftable(currentState.data)) {\n const [value, patches, inversePatches] = produceWithPatches(currentState.data, updateRecipe);\n ret.patches.push(...patches);\n ret.inversePatches.push(...inversePatches);\n newValue = value;\n } else {\n newValue = updateRecipe(currentState.data);\n ret.patches.push({\n op: "replace",\n path: [],\n value: newValue\n });\n ret.inversePatches.push({\n op: "replace",\n path: [],\n value: currentState.data\n });\n }\n }\n if (ret.patches.length === 0) {\n return ret;\n }\n dispatch(api.util.patchQueryData(endpointName, arg, ret.patches, updateProvided));\n return ret;\n };\n const upsertQueryData = (endpointName, arg, value) => (dispatch) => {\n const res = dispatch(api.endpoints[endpointName].initiate(arg, {\n subscribe: false,\n forceRefetch: true,\n [forceQueryFnSymbol]: () => ({\n data: value\n })\n }));\n return res;\n };\n const getTransformCallbackForEndpoint = (endpointDefinition, transformFieldName) => {\n return endpointDefinition.query && endpointDefinition[transformFieldName] ? endpointDefinition[transformFieldName] : defaultTransformResponse;\n };\n const executeEndpoint = async (arg, {\n signal,\n abort,\n rejectWithValue,\n fulfillWithValue,\n dispatch,\n getState,\n extra\n }) => {\n const endpointDefinition = endpointDefinitions[arg.endpointName];\n const {\n metaSchema,\n skipSchemaValidation = globalSkipSchemaValidation\n } = endpointDefinition;\n try {\n let transformResponse = getTransformCallbackForEndpoint(endpointDefinition, "transformResponse");\n const baseQueryApi = {\n signal,\n abort,\n dispatch,\n getState,\n extra,\n endpoint: arg.endpointName,\n type: arg.type,\n forced: arg.type === "query" ? isForcedQuery(arg, getState()) : void 0,\n queryCacheKey: arg.type === "query" ? arg.queryCacheKey : void 0\n };\n const forceQueryFn = arg.type === "query" ? arg[forceQueryFnSymbol] : void 0;\n let finalQueryReturnValue;\n const fetchPage = async (data, param, maxPages, previous) => {\n if (param == null && data.pages.length) {\n return Promise.resolve({\n data\n });\n }\n const finalQueryArg = {\n queryArg: arg.originalArgs,\n pageParam: param\n };\n const pageResponse = await executeRequest(finalQueryArg);\n const addTo = previous ? addToStart : addToEnd;\n return {\n data: {\n pages: addTo(data.pages, pageResponse.data, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages)\n },\n meta: pageResponse.meta\n };\n };\n async function executeRequest(finalQueryArg) {\n let result;\n const {\n extraOptions,\n argSchema,\n rawResponseSchema,\n responseSchema\n } = endpointDefinition;\n if (argSchema && !skipSchemaValidation) {\n finalQueryArg = await parseWithSchema(\n argSchema,\n finalQueryArg,\n "argSchema",\n {}\n // we don\'t have a meta yet, so we can\'t pass it\n );\n }\n if (forceQueryFn) {\n result = forceQueryFn();\n } else if (endpointDefinition.query) {\n result = await baseQuery(endpointDefinition.query(finalQueryArg), baseQueryApi, extraOptions);\n } else {\n result = await endpointDefinition.queryFn(finalQueryArg, baseQueryApi, extraOptions, (arg2) => baseQuery(arg2, baseQueryApi, extraOptions));\n }\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n if (result.error) throw new HandledError(result.error, result.meta);\n let {\n data\n } = result;\n if (rawResponseSchema && !skipSchemaValidation) {\n data = await parseWithSchema(rawResponseSchema, result.data, "rawResponseSchema", result.meta);\n }\n let transformedResponse = await transformResponse(data, result.meta, finalQueryArg);\n if (responseSchema && !skipSchemaValidation) {\n transformedResponse = await parseWithSchema(responseSchema, transformedResponse, "responseSchema", result.meta);\n }\n return {\n ...result,\n data: transformedResponse\n };\n }\n if (arg.type === "query" && "infiniteQueryOptions" in endpointDefinition) {\n const {\n infiniteQueryOptions\n } = endpointDefinition;\n const {\n maxPages = Infinity\n } = infiniteQueryOptions;\n let result;\n const blankData = {\n pages: [],\n pageParams: []\n };\n const cachedData = selectors.selectQueryEntry(getState(), arg.queryCacheKey)?.data;\n const isForcedQueryNeedingRefetch = (\n // arg.forceRefetch\n isForcedQuery(arg, getState()) && !arg.direction\n );\n const existingData = isForcedQueryNeedingRefetch || !cachedData ? blankData : cachedData;\n if ("direction" in arg && arg.direction && existingData.pages.length) {\n const previous = arg.direction === "backward";\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n const param = pageParamFn(infiniteQueryOptions, existingData, arg.originalArgs);\n result = await fetchPage(existingData, param, maxPages, previous);\n } else {\n const {\n initialPageParam = infiniteQueryOptions.initialPageParam\n } = arg;\n const cachedPageParams = cachedData?.pageParams ?? [];\n const firstPageParam = cachedPageParams[0] ?? initialPageParam;\n const totalPages = cachedPageParams.length;\n result = await fetchPage(existingData, firstPageParam, maxPages);\n if (forceQueryFn) {\n result = {\n data: result.data.pages[0]\n };\n }\n for (let i = 1; i < totalPages; i++) {\n const param = getNextPageParam(infiniteQueryOptions, result.data, arg.originalArgs);\n result = await fetchPage(result.data, param, maxPages);\n }\n }\n finalQueryReturnValue = result;\n } else {\n finalQueryReturnValue = await executeRequest(arg.originalArgs);\n }\n if (metaSchema && !skipSchemaValidation && finalQueryReturnValue.meta) {\n finalQueryReturnValue.meta = await parseWithSchema(metaSchema, finalQueryReturnValue.meta, "metaSchema", finalQueryReturnValue.meta);\n }\n return fulfillWithValue(finalQueryReturnValue.data, addShouldAutoBatch({\n fulfilledTimeStamp: Date.now(),\n baseQueryMeta: finalQueryReturnValue.meta\n }));\n } catch (error) {\n let caughtError = error;\n if (caughtError instanceof HandledError) {\n let transformErrorResponse = getTransformCallbackForEndpoint(endpointDefinition, "transformErrorResponse");\n const {\n rawErrorResponseSchema,\n errorResponseSchema\n } = endpointDefinition;\n let {\n value,\n meta\n } = caughtError;\n try {\n if (rawErrorResponseSchema && !skipSchemaValidation) {\n value = await parseWithSchema(rawErrorResponseSchema, value, "rawErrorResponseSchema", meta);\n }\n if (metaSchema && !skipSchemaValidation) {\n meta = await parseWithSchema(metaSchema, meta, "metaSchema", meta);\n }\n let transformedErrorResponse = await transformErrorResponse(value, meta, arg.originalArgs);\n if (errorResponseSchema && !skipSchemaValidation) {\n transformedErrorResponse = await parseWithSchema(errorResponseSchema, transformedErrorResponse, "errorResponseSchema", meta);\n }\n return rejectWithValue(transformedErrorResponse, addShouldAutoBatch({\n baseQueryMeta: meta\n }));\n } catch (e) {\n caughtError = e;\n }\n }\n try {\n if (caughtError instanceof NamedSchemaError) {\n const info = {\n endpoint: arg.endpointName,\n arg: arg.originalArgs,\n type: arg.type,\n queryCacheKey: arg.type === "query" ? arg.queryCacheKey : void 0\n };\n endpointDefinition.onSchemaFailure?.(caughtError, info);\n onSchemaFailure?.(caughtError, info);\n const {\n catchSchemaFailure = globalCatchSchemaFailure\n } = endpointDefinition;\n if (catchSchemaFailure) {\n return rejectWithValue(catchSchemaFailure(caughtError, info), addShouldAutoBatch({\n baseQueryMeta: caughtError._bqMeta\n }));\n }\n }\n } catch (e) {\n caughtError = e;\n }\n if (typeof process !== "undefined" && "production" !== "production") // removed by dead control flow\n{} else {\n console.error(caughtError);\n }\n throw caughtError;\n }\n };\n function isForcedQuery(arg, state) {\n const requestState = selectors.selectQueryEntry(state, arg.queryCacheKey);\n const baseFetchOnMountOrArgChange = selectors.selectConfig(state).refetchOnMountOrArgChange;\n const fulfilledVal = requestState?.fulfilledTimeStamp;\n const refetchVal = arg.forceRefetch ?? (arg.subscribe && baseFetchOnMountOrArgChange);\n if (refetchVal) {\n return refetchVal === true || (Number(/* @__PURE__ */ new Date()) - Number(fulfilledVal)) / 1e3 >= refetchVal;\n }\n return false;\n }\n const createQueryThunk = () => {\n const generatedQueryThunk = createAsyncThunk(`${reducerPath}/executeQuery`, executeEndpoint, {\n getPendingMeta({\n arg\n }) {\n const endpointDefinition = endpointDefinitions[arg.endpointName];\n return addShouldAutoBatch({\n startedTimeStamp: Date.now(),\n ...isInfiniteQueryDefinition(endpointDefinition) ? {\n direction: arg.direction\n } : {}\n });\n },\n condition(queryThunkArg, {\n getState\n }) {\n const state = getState();\n const requestState = selectors.selectQueryEntry(state, queryThunkArg.queryCacheKey);\n const fulfilledVal = requestState?.fulfilledTimeStamp;\n const currentArg = queryThunkArg.originalArgs;\n const previousArg = requestState?.originalArgs;\n const endpointDefinition = endpointDefinitions[queryThunkArg.endpointName];\n const direction = queryThunkArg.direction;\n if (isUpsertQuery(queryThunkArg)) {\n return true;\n }\n if (requestState?.status === "pending") {\n return false;\n }\n if (isForcedQuery(queryThunkArg, state)) {\n return true;\n }\n if (isQueryDefinition(endpointDefinition) && endpointDefinition?.forceRefetch?.({\n currentArg,\n previousArg,\n endpointState: requestState,\n state\n })) {\n return true;\n }\n if (fulfilledVal && !direction) {\n return false;\n }\n return true;\n },\n dispatchConditionRejection: true\n });\n return generatedQueryThunk;\n };\n const queryThunk = createQueryThunk();\n const infiniteQueryThunk = createQueryThunk();\n const mutationThunk = createAsyncThunk(`${reducerPath}/executeMutation`, executeEndpoint, {\n getPendingMeta() {\n return addShouldAutoBatch({\n startedTimeStamp: Date.now()\n });\n }\n });\n const hasTheForce = (options) => "force" in options;\n const hasMaxAge = (options) => "ifOlderThan" in options;\n const prefetch = (endpointName, arg, options) => (dispatch, getState) => {\n const force = hasTheForce(options) && options.force;\n const maxAge = hasMaxAge(options) && options.ifOlderThan;\n const queryAction = (force2 = true) => {\n const options2 = {\n forceRefetch: force2,\n isPrefetch: true\n };\n return api.endpoints[endpointName].initiate(arg, options2);\n };\n const latestStateValue = api.endpoints[endpointName].select(arg)(getState());\n if (force) {\n dispatch(queryAction());\n } else if (maxAge) {\n const lastFulfilledTs = latestStateValue?.fulfilledTimeStamp;\n if (!lastFulfilledTs) {\n dispatch(queryAction());\n return;\n }\n const shouldRetrigger = (Number(/* @__PURE__ */ new Date()) - Number(new Date(lastFulfilledTs))) / 1e3 >= maxAge;\n if (shouldRetrigger) {\n dispatch(queryAction());\n }\n } else {\n dispatch(queryAction(false));\n }\n };\n function matchesEndpoint(endpointName) {\n return (action) => action?.meta?.arg?.endpointName === endpointName;\n }\n function buildMatchThunkActions(thunk, endpointName) {\n return {\n matchPending: isAllOf(isPending(thunk), matchesEndpoint(endpointName)),\n matchFulfilled: isAllOf(isFulfilled(thunk), matchesEndpoint(endpointName)),\n matchRejected: isAllOf(isRejected(thunk), matchesEndpoint(endpointName))\n };\n }\n return {\n queryThunk,\n mutationThunk,\n infiniteQueryThunk,\n prefetch,\n updateQueryData,\n upsertQueryData,\n patchQueryData,\n buildMatchThunkActions\n };\n}\nfunction getNextPageParam(options, {\n pages,\n pageParams\n}, queryArg) {\n const lastIndex = pages.length - 1;\n return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams, queryArg);\n}\nfunction getPreviousPageParam(options, {\n pages,\n pageParams\n}, queryArg) {\n return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams, queryArg);\n}\nfunction calculateProvidedByThunk(action, type, endpointDefinitions, assertTagType) {\n return calculateProvidedBy(endpointDefinitions[action.meta.arg.endpointName][type], isFulfilled(action) ? action.payload : void 0, isRejectedWithValue(action) ? action.payload : void 0, action.meta.arg.originalArgs, "baseQueryMeta" in action.meta ? action.meta.baseQueryMeta : void 0, assertTagType);\n}\n\n// src/query/core/buildSlice.ts\n\n\nfunction updateQuerySubstateIfExists(state, queryCacheKey, update) {\n const substate = state[queryCacheKey];\n if (substate) {\n update(substate);\n }\n}\nfunction getMutationCacheKey(id) {\n return ("arg" in id ? id.arg.fixedCacheKey : id.fixedCacheKey) ?? id.requestId;\n}\nfunction updateMutationSubstateIfExists(state, id, update) {\n const substate = state[getMutationCacheKey(id)];\n if (substate) {\n update(substate);\n }\n}\nvar initialState = {};\nfunction buildSlice({\n reducerPath,\n queryThunk,\n mutationThunk,\n serializeQueryArgs,\n context: {\n endpointDefinitions: definitions,\n apiUid,\n extractRehydrationInfo,\n hasRehydrationInfo\n },\n assertTagType,\n config\n}) {\n const resetApiState = createAction(`${reducerPath}/resetApiState`);\n function writePendingCacheEntry(draft, arg, upserting, meta) {\n draft[arg.queryCacheKey] ??= {\n status: "uninitialized" /* uninitialized */,\n endpointName: arg.endpointName\n };\n updateQuerySubstateIfExists(draft, arg.queryCacheKey, (substate) => {\n substate.status = "pending" /* pending */;\n substate.requestId = upserting && substate.requestId ? (\n // for `upsertQuery` **updates**, keep the current `requestId`\n substate.requestId\n ) : (\n // for normal queries or `upsertQuery` **inserts** always update the `requestId`\n meta.requestId\n );\n if (arg.originalArgs !== void 0) {\n substate.originalArgs = arg.originalArgs;\n }\n substate.startedTimeStamp = meta.startedTimeStamp;\n const endpointDefinition = definitions[meta.arg.endpointName];\n if (isInfiniteQueryDefinition(endpointDefinition) && "direction" in arg) {\n ;\n substate.direction = arg.direction;\n }\n });\n }\n function writeFulfilledCacheEntry(draft, meta, payload, upserting) {\n updateQuerySubstateIfExists(draft, meta.arg.queryCacheKey, (substate) => {\n if (substate.requestId !== meta.requestId && !upserting) return;\n const {\n merge\n } = definitions[meta.arg.endpointName];\n substate.status = "fulfilled" /* fulfilled */;\n if (merge) {\n if (substate.data !== void 0) {\n const {\n fulfilledTimeStamp,\n arg,\n baseQueryMeta,\n requestId\n } = meta;\n let newData = produce(substate.data, (draftSubstateData) => {\n return merge(draftSubstateData, payload, {\n arg: arg.originalArgs,\n baseQueryMeta,\n fulfilledTimeStamp,\n requestId\n });\n });\n substate.data = newData;\n } else {\n substate.data = payload;\n }\n } else {\n substate.data = definitions[meta.arg.endpointName].structuralSharing ?? true ? copyWithStructuralSharing(immer_isDraft(substate.data) ? original(substate.data) : substate.data, payload) : payload;\n }\n delete substate.error;\n substate.fulfilledTimeStamp = meta.fulfilledTimeStamp;\n });\n }\n const querySlice = createSlice({\n name: `${reducerPath}/queries`,\n initialState,\n reducers: {\n removeQueryResult: {\n reducer(draft, {\n payload: {\n queryCacheKey\n }\n }) {\n delete draft[queryCacheKey];\n },\n prepare: prepareAutoBatched()\n },\n cacheEntriesUpserted: {\n reducer(draft, action) {\n for (const entry of action.payload) {\n const {\n queryDescription: arg,\n value\n } = entry;\n writePendingCacheEntry(draft, arg, true, {\n arg,\n requestId: action.meta.requestId,\n startedTimeStamp: action.meta.timestamp\n });\n writeFulfilledCacheEntry(\n draft,\n {\n arg,\n requestId: action.meta.requestId,\n fulfilledTimeStamp: action.meta.timestamp,\n baseQueryMeta: {}\n },\n value,\n // We know we\'re upserting here\n true\n );\n }\n },\n prepare: (payload) => {\n const queryDescriptions = payload.map((entry) => {\n const {\n endpointName,\n arg,\n value\n } = entry;\n const endpointDefinition = definitions[endpointName];\n const queryDescription = {\n type: "query",\n endpointName,\n originalArgs: entry.arg,\n queryCacheKey: serializeQueryArgs({\n queryArgs: arg,\n endpointDefinition,\n endpointName\n })\n };\n return {\n queryDescription,\n value\n };\n });\n const result = {\n payload: queryDescriptions,\n meta: {\n [SHOULD_AUTOBATCH]: true,\n requestId: nanoid(),\n timestamp: Date.now()\n }\n };\n return result;\n }\n },\n queryResultPatched: {\n reducer(draft, {\n payload: {\n queryCacheKey,\n patches\n }\n }) {\n updateQuerySubstateIfExists(draft, queryCacheKey, (substate) => {\n substate.data = applyPatches(substate.data, patches.concat());\n });\n },\n prepare: prepareAutoBatched()\n }\n },\n extraReducers(builder) {\n builder.addCase(queryThunk.pending, (draft, {\n meta,\n meta: {\n arg\n }\n }) => {\n const upserting = isUpsertQuery(arg);\n writePendingCacheEntry(draft, arg, upserting, meta);\n }).addCase(queryThunk.fulfilled, (draft, {\n meta,\n payload\n }) => {\n const upserting = isUpsertQuery(meta.arg);\n writeFulfilledCacheEntry(draft, meta, payload, upserting);\n }).addCase(queryThunk.rejected, (draft, {\n meta: {\n condition,\n arg,\n requestId\n },\n error,\n payload\n }) => {\n updateQuerySubstateIfExists(draft, arg.queryCacheKey, (substate) => {\n if (condition) {\n } else {\n if (substate.requestId !== requestId) return;\n substate.status = "rejected" /* rejected */;\n substate.error = payload ?? error;\n }\n });\n }).addMatcher(hasRehydrationInfo, (draft, action) => {\n const {\n queries\n } = extractRehydrationInfo(action);\n for (const [key, entry] of Object.entries(queries)) {\n if (\n // do not rehydrate entries that were currently in flight.\n entry?.status === "fulfilled" /* fulfilled */ || entry?.status === "rejected" /* rejected */\n ) {\n draft[key] = entry;\n }\n }\n });\n }\n });\n const mutationSlice = createSlice({\n name: `${reducerPath}/mutations`,\n initialState,\n reducers: {\n removeMutationResult: {\n reducer(draft, {\n payload\n }) {\n const cacheKey = getMutationCacheKey(payload);\n if (cacheKey in draft) {\n delete draft[cacheKey];\n }\n },\n prepare: prepareAutoBatched()\n }\n },\n extraReducers(builder) {\n builder.addCase(mutationThunk.pending, (draft, {\n meta,\n meta: {\n requestId,\n arg,\n startedTimeStamp\n }\n }) => {\n if (!arg.track) return;\n draft[getMutationCacheKey(meta)] = {\n requestId,\n status: "pending" /* pending */,\n endpointName: arg.endpointName,\n startedTimeStamp\n };\n }).addCase(mutationThunk.fulfilled, (draft, {\n payload,\n meta\n }) => {\n if (!meta.arg.track) return;\n updateMutationSubstateIfExists(draft, meta, (substate) => {\n if (substate.requestId !== meta.requestId) return;\n substate.status = "fulfilled" /* fulfilled */;\n substate.data = payload;\n substate.fulfilledTimeStamp = meta.fulfilledTimeStamp;\n });\n }).addCase(mutationThunk.rejected, (draft, {\n payload,\n error,\n meta\n }) => {\n if (!meta.arg.track) return;\n updateMutationSubstateIfExists(draft, meta, (substate) => {\n if (substate.requestId !== meta.requestId) return;\n substate.status = "rejected" /* rejected */;\n substate.error = payload ?? error;\n });\n }).addMatcher(hasRehydrationInfo, (draft, action) => {\n const {\n mutations\n } = extractRehydrationInfo(action);\n for (const [key, entry] of Object.entries(mutations)) {\n if (\n // do not rehydrate entries that were currently in flight.\n (entry?.status === "fulfilled" /* fulfilled */ || entry?.status === "rejected" /* rejected */) && // only rehydrate endpoints that were persisted using a `fixedCacheKey`\n key !== entry?.requestId\n ) {\n draft[key] = entry;\n }\n }\n });\n }\n });\n const initialInvalidationState = {\n tags: {},\n keys: {}\n };\n const invalidationSlice = createSlice({\n name: `${reducerPath}/invalidation`,\n initialState: initialInvalidationState,\n reducers: {\n updateProvidedBy: {\n reducer(draft, action) {\n for (const {\n queryCacheKey,\n providedTags\n } of action.payload) {\n removeCacheKeyFromTags(draft, queryCacheKey);\n for (const {\n type,\n id\n } of providedTags) {\n const subscribedQueries = (draft.tags[type] ??= {})[id || "__internal_without_id"] ??= [];\n const alreadySubscribed = subscribedQueries.includes(queryCacheKey);\n if (!alreadySubscribed) {\n subscribedQueries.push(queryCacheKey);\n }\n }\n draft.keys[queryCacheKey] = providedTags;\n }\n },\n prepare: prepareAutoBatched()\n }\n },\n extraReducers(builder) {\n builder.addCase(querySlice.actions.removeQueryResult, (draft, {\n payload: {\n queryCacheKey\n }\n }) => {\n removeCacheKeyFromTags(draft, queryCacheKey);\n }).addMatcher(hasRehydrationInfo, (draft, action) => {\n const {\n provided\n } = extractRehydrationInfo(action);\n for (const [type, incomingTags] of Object.entries(provided)) {\n for (const [id, cacheKeys] of Object.entries(incomingTags)) {\n const subscribedQueries = (draft.tags[type] ??= {})[id || "__internal_without_id"] ??= [];\n for (const queryCacheKey of cacheKeys) {\n const alreadySubscribed = subscribedQueries.includes(queryCacheKey);\n if (!alreadySubscribed) {\n subscribedQueries.push(queryCacheKey);\n }\n }\n }\n }\n }).addMatcher(isAnyOf(isFulfilled(queryThunk), isRejectedWithValue(queryThunk)), (draft, action) => {\n writeProvidedTagsForQueries(draft, [action]);\n }).addMatcher(querySlice.actions.cacheEntriesUpserted.match, (draft, action) => {\n const mockActions = action.payload.map(({\n queryDescription,\n value\n }) => {\n return {\n type: "UNKNOWN",\n payload: value,\n meta: {\n requestStatus: "fulfilled",\n requestId: "UNKNOWN",\n arg: queryDescription\n }\n };\n });\n writeProvidedTagsForQueries(draft, mockActions);\n });\n }\n });\n function removeCacheKeyFromTags(draft, queryCacheKey) {\n const existingTags = draft.keys[queryCacheKey] ?? [];\n for (const tag of existingTags) {\n const tagType = tag.type;\n const tagId = tag.id ?? "__internal_without_id";\n const tagSubscriptions = draft.tags[tagType]?.[tagId];\n if (tagSubscriptions) {\n draft.tags[tagType][tagId] = tagSubscriptions.filter((qc) => qc !== queryCacheKey);\n }\n }\n delete draft.keys[queryCacheKey];\n }\n function writeProvidedTagsForQueries(draft, actions2) {\n const providedByEntries = actions2.map((action) => {\n const providedTags = calculateProvidedByThunk(action, "providesTags", definitions, assertTagType);\n const {\n queryCacheKey\n } = action.meta.arg;\n return {\n queryCacheKey,\n providedTags\n };\n });\n invalidationSlice.caseReducers.updateProvidedBy(draft, invalidationSlice.actions.updateProvidedBy(providedByEntries));\n }\n const subscriptionSlice = createSlice({\n name: `${reducerPath}/subscriptions`,\n initialState,\n reducers: {\n updateSubscriptionOptions(d, a) {\n },\n unsubscribeQueryResult(d, a) {\n },\n internal_getRTKQSubscriptions() {\n }\n }\n });\n const internalSubscriptionsSlice = createSlice({\n name: `${reducerPath}/internalSubscriptions`,\n initialState,\n reducers: {\n subscriptionsUpdated: {\n reducer(state, action) {\n return applyPatches(state, action.payload);\n },\n prepare: prepareAutoBatched()\n }\n }\n });\n const configSlice = createSlice({\n name: `${reducerPath}/config`,\n initialState: {\n online: isOnline(),\n focused: isDocumentVisible(),\n middlewareRegistered: false,\n ...config\n },\n reducers: {\n middlewareRegistered(state, {\n payload\n }) {\n state.middlewareRegistered = state.middlewareRegistered === "conflict" || apiUid !== payload ? "conflict" : true;\n }\n },\n extraReducers: (builder) => {\n builder.addCase(onOnline, (state) => {\n state.online = true;\n }).addCase(onOffline, (state) => {\n state.online = false;\n }).addCase(onFocus, (state) => {\n state.focused = true;\n }).addCase(onFocusLost, (state) => {\n state.focused = false;\n }).addMatcher(hasRehydrationInfo, (draft) => ({\n ...draft\n }));\n }\n });\n const combinedReducer = combineReducers({\n queries: querySlice.reducer,\n mutations: mutationSlice.reducer,\n provided: invalidationSlice.reducer,\n subscriptions: internalSubscriptionsSlice.reducer,\n config: configSlice.reducer\n });\n const reducer = (state, action) => combinedReducer(resetApiState.match(action) ? void 0 : state, action);\n const actions = {\n ...configSlice.actions,\n ...querySlice.actions,\n ...subscriptionSlice.actions,\n ...internalSubscriptionsSlice.actions,\n ...mutationSlice.actions,\n ...invalidationSlice.actions,\n resetApiState\n };\n return {\n reducer,\n actions\n };\n}\n\n// src/query/core/buildSelectors.ts\nvar skipToken = /* @__PURE__ */ Symbol.for("RTKQ/skipToken");\nvar initialSubState = {\n status: "uninitialized" /* uninitialized */\n};\nvar defaultQuerySubState = /* @__PURE__ */ produce(initialSubState, () => {\n});\nvar defaultMutationSubState = /* @__PURE__ */ produce(initialSubState, () => {\n});\nfunction buildSelectors({\n serializeQueryArgs,\n reducerPath,\n createSelector: createSelector2\n}) {\n const selectSkippedQuery = (state) => defaultQuerySubState;\n const selectSkippedMutation = (state) => defaultMutationSubState;\n return {\n buildQuerySelector,\n buildInfiniteQuerySelector,\n buildMutationSelector,\n selectInvalidatedBy,\n selectCachedArgsForQuery,\n selectApiState,\n selectQueries,\n selectMutations,\n selectQueryEntry,\n selectConfig\n };\n function withRequestFlags(substate) {\n return {\n ...substate,\n ...getRequestStatusFlags(substate.status)\n };\n }\n function selectApiState(rootState) {\n const state = rootState[reducerPath];\n if (false) // removed by dead control flow\n{}\n return state;\n }\n function selectQueries(rootState) {\n return selectApiState(rootState)?.queries;\n }\n function selectQueryEntry(rootState, cacheKey) {\n return selectQueries(rootState)?.[cacheKey];\n }\n function selectMutations(rootState) {\n return selectApiState(rootState)?.mutations;\n }\n function selectConfig(rootState) {\n return selectApiState(rootState)?.config;\n }\n function buildAnyQuerySelector(endpointName, endpointDefinition, combiner) {\n return (queryArgs) => {\n if (queryArgs === skipToken) {\n return createSelector2(selectSkippedQuery, combiner);\n }\n const serializedArgs = serializeQueryArgs({\n queryArgs,\n endpointDefinition,\n endpointName\n });\n const selectQuerySubstate = (state) => selectQueryEntry(state, serializedArgs) ?? defaultQuerySubState;\n return createSelector2(selectQuerySubstate, combiner);\n };\n }\n function buildQuerySelector(endpointName, endpointDefinition) {\n return buildAnyQuerySelector(endpointName, endpointDefinition, withRequestFlags);\n }\n function buildInfiniteQuerySelector(endpointName, endpointDefinition) {\n const {\n infiniteQueryOptions\n } = endpointDefinition;\n function withInfiniteQueryResultFlags(substate) {\n const stateWithRequestFlags = {\n ...substate,\n ...getRequestStatusFlags(substate.status)\n };\n const {\n isLoading,\n isError,\n direction\n } = stateWithRequestFlags;\n const isForward = direction === "forward";\n const isBackward = direction === "backward";\n return {\n ...stateWithRequestFlags,\n hasNextPage: getHasNextPage(infiniteQueryOptions, stateWithRequestFlags.data, stateWithRequestFlags.originalArgs),\n hasPreviousPage: getHasPreviousPage(infiniteQueryOptions, stateWithRequestFlags.data, stateWithRequestFlags.originalArgs),\n isFetchingNextPage: isLoading && isForward,\n isFetchingPreviousPage: isLoading && isBackward,\n isFetchNextPageError: isError && isForward,\n isFetchPreviousPageError: isError && isBackward\n };\n }\n return buildAnyQuerySelector(endpointName, endpointDefinition, withInfiniteQueryResultFlags);\n }\n function buildMutationSelector() {\n return (id) => {\n let mutationId;\n if (typeof id === "object") {\n mutationId = getMutationCacheKey(id) ?? skipToken;\n } else {\n mutationId = id;\n }\n const selectMutationSubstate = (state) => selectApiState(state)?.mutations?.[mutationId] ?? defaultMutationSubState;\n const finalSelectMutationSubstate = mutationId === skipToken ? selectSkippedMutation : selectMutationSubstate;\n return createSelector2(finalSelectMutationSubstate, withRequestFlags);\n };\n }\n function selectInvalidatedBy(state, tags) {\n const apiState = state[reducerPath];\n const toInvalidate = /* @__PURE__ */ new Set();\n for (const tag of tags.filter(isNotNullish).map(expandTagDescription)) {\n const provided = apiState.provided.tags[tag.type];\n if (!provided) {\n continue;\n }\n let invalidateSubscriptions = (tag.id !== void 0 ? (\n // id given: invalidate all queries that provide this type & id\n provided[tag.id]\n ) : (\n // no id: invalidate all queries that provide this type\n flatten(Object.values(provided))\n )) ?? [];\n for (const invalidate of invalidateSubscriptions) {\n toInvalidate.add(invalidate);\n }\n }\n return flatten(Array.from(toInvalidate.values()).map((queryCacheKey) => {\n const querySubState = apiState.queries[queryCacheKey];\n return querySubState ? [{\n queryCacheKey,\n endpointName: querySubState.endpointName,\n originalArgs: querySubState.originalArgs\n }] : [];\n }));\n }\n function selectCachedArgsForQuery(state, queryName) {\n return Object.values(selectQueries(state)).filter((entry) => entry?.endpointName === queryName && entry.status !== "uninitialized" /* uninitialized */).map((entry) => entry.originalArgs);\n }\n function getHasNextPage(options, data, queryArg) {\n if (!data) return false;\n return getNextPageParam(options, data, queryArg) != null;\n }\n function getHasPreviousPage(options, data, queryArg) {\n if (!data || !options.getPreviousPageParam) return false;\n return getPreviousPageParam(options, data, queryArg) != null;\n }\n}\n\n// src/query/createApi.ts\n\n\n// src/query/defaultSerializeQueryArgs.ts\nvar cache = WeakMap ? /* @__PURE__ */ new WeakMap() : void 0;\nvar defaultSerializeQueryArgs = ({\n endpointName,\n queryArgs\n}) => {\n let serialized = "";\n const cached = cache?.get(queryArgs);\n if (typeof cached === "string") {\n serialized = cached;\n } else {\n const stringified = JSON.stringify(queryArgs, (key, value) => {\n value = typeof value === "bigint" ? {\n $bigint: value.toString()\n } : value;\n value = redux_isPlainObject(value) ? Object.keys(value).sort().reduce((acc, key2) => {\n acc[key2] = value[key2];\n return acc;\n }, {}) : value;\n return value;\n });\n if (redux_isPlainObject(queryArgs)) {\n cache?.set(queryArgs, stringified);\n }\n serialized = stringified;\n }\n return `${endpointName}(${serialized})`;\n};\n\n// src/query/createApi.ts\n\nfunction buildCreateApi(...modules) {\n return function baseCreateApi(options) {\n const extractRehydrationInfo = reselect_weakMapMemoize((action) => options.extractRehydrationInfo?.(action, {\n reducerPath: options.reducerPath ?? "api"\n }));\n const optionsWithDefaults = {\n reducerPath: "api",\n keepUnusedDataFor: 60,\n refetchOnMountOrArgChange: false,\n refetchOnFocus: false,\n refetchOnReconnect: false,\n invalidationBehavior: "delayed",\n ...options,\n extractRehydrationInfo,\n serializeQueryArgs(queryArgsApi) {\n let finalSerializeQueryArgs = defaultSerializeQueryArgs;\n if ("serializeQueryArgs" in queryArgsApi.endpointDefinition) {\n const endpointSQA = queryArgsApi.endpointDefinition.serializeQueryArgs;\n finalSerializeQueryArgs = (queryArgsApi2) => {\n const initialResult = endpointSQA(queryArgsApi2);\n if (typeof initialResult === "string") {\n return initialResult;\n } else {\n return defaultSerializeQueryArgs({\n ...queryArgsApi2,\n queryArgs: initialResult\n });\n }\n };\n } else if (options.serializeQueryArgs) {\n finalSerializeQueryArgs = options.serializeQueryArgs;\n }\n return finalSerializeQueryArgs(queryArgsApi);\n },\n tagTypes: [...options.tagTypes || []]\n };\n const context = {\n endpointDefinitions: {},\n batch(fn) {\n fn();\n },\n apiUid: nanoid(),\n extractRehydrationInfo,\n hasRehydrationInfo: reselect_weakMapMemoize((action) => extractRehydrationInfo(action) != null)\n };\n const api = {\n injectEndpoints,\n enhanceEndpoints({\n addTagTypes,\n endpoints\n }) {\n if (addTagTypes) {\n for (const eT of addTagTypes) {\n if (!optionsWithDefaults.tagTypes.includes(eT)) {\n ;\n optionsWithDefaults.tagTypes.push(eT);\n }\n }\n }\n if (endpoints) {\n for (const [endpointName, partialDefinition] of Object.entries(endpoints)) {\n if (typeof partialDefinition === "function") {\n partialDefinition(context.endpointDefinitions[endpointName]);\n } else {\n Object.assign(context.endpointDefinitions[endpointName] || {}, partialDefinition);\n }\n }\n }\n return api;\n }\n };\n const initializedModules = modules.map((m) => m.init(api, optionsWithDefaults, context));\n function injectEndpoints(inject) {\n const evaluatedEndpoints = inject.endpoints({\n query: (x) => ({\n ...x,\n type: "query" /* query */\n }),\n mutation: (x) => ({\n ...x,\n type: "mutation" /* mutation */\n }),\n infiniteQuery: (x) => ({\n ...x,\n type: "infinitequery" /* infinitequery */\n })\n });\n for (const [endpointName, definition] of Object.entries(evaluatedEndpoints)) {\n if (inject.overrideExisting !== true && endpointName in context.endpointDefinitions) {\n if (inject.overrideExisting === "throw") {\n throw new Error( true ? redux_toolkit_modern_formatProdErrorMessage(39) : 0);\n } else if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n continue;\n }\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n context.endpointDefinitions[endpointName] = definition;\n for (const m of initializedModules) {\n m.injectEndpoint(endpointName, definition);\n }\n }\n return api;\n }\n return api.injectEndpoints({\n endpoints: options.endpoints\n });\n };\n}\n\n// src/query/fakeBaseQuery.ts\n\nvar _NEVER = /* @__PURE__ */ (/* unused pure expression or super */ null && (Symbol()));\nfunction fakeBaseQuery() {\n return function() {\n throw new Error( true ? _formatProdErrorMessage4(33) : 0);\n };\n}\n\n// src/query/core/module.ts\n\n\n// src/query/tsHelpers.ts\nfunction assertCast(v) {\n}\nfunction safeAssign(target, ...args) {\n return Object.assign(target, ...args);\n}\n\n// src/query/core/buildMiddleware/batchActions.ts\n\nvar buildBatchedActionsHandler = ({\n api,\n queryThunk,\n internalState\n}) => {\n const subscriptionsPrefix = `${api.reducerPath}/subscriptions`;\n let previousSubscriptions = null;\n let updateSyncTimer = null;\n const {\n updateSubscriptionOptions,\n unsubscribeQueryResult\n } = api.internalActions;\n const actuallyMutateSubscriptions = (mutableState, action) => {\n if (updateSubscriptionOptions.match(action)) {\n const {\n queryCacheKey,\n requestId,\n options\n } = action.payload;\n if (mutableState?.[queryCacheKey]?.[requestId]) {\n mutableState[queryCacheKey][requestId] = options;\n }\n return true;\n }\n if (unsubscribeQueryResult.match(action)) {\n const {\n queryCacheKey,\n requestId\n } = action.payload;\n if (mutableState[queryCacheKey]) {\n delete mutableState[queryCacheKey][requestId];\n }\n return true;\n }\n if (api.internalActions.removeQueryResult.match(action)) {\n delete mutableState[action.payload.queryCacheKey];\n return true;\n }\n if (queryThunk.pending.match(action)) {\n const {\n meta: {\n arg,\n requestId\n }\n } = action;\n const substate = mutableState[arg.queryCacheKey] ??= {};\n substate[`${requestId}_running`] = {};\n if (arg.subscribe) {\n substate[requestId] = arg.subscriptionOptions ?? substate[requestId] ?? {};\n }\n return true;\n }\n let mutated = false;\n if (queryThunk.fulfilled.match(action) || queryThunk.rejected.match(action)) {\n const state = mutableState[action.meta.arg.queryCacheKey] || {};\n const key = `${action.meta.requestId}_running`;\n mutated ||= !!state[key];\n delete state[key];\n }\n if (queryThunk.rejected.match(action)) {\n const {\n meta: {\n condition,\n arg,\n requestId\n }\n } = action;\n if (condition && arg.subscribe) {\n const substate = mutableState[arg.queryCacheKey] ??= {};\n substate[requestId] = arg.subscriptionOptions ?? substate[requestId] ?? {};\n mutated = true;\n }\n }\n return mutated;\n };\n const getSubscriptions = () => internalState.currentSubscriptions;\n const getSubscriptionCount = (queryCacheKey) => {\n const subscriptions = getSubscriptions();\n const subscriptionsForQueryArg = subscriptions[queryCacheKey] ?? {};\n return countObjectKeys(subscriptionsForQueryArg);\n };\n const isRequestSubscribed = (queryCacheKey, requestId) => {\n const subscriptions = getSubscriptions();\n return !!subscriptions?.[queryCacheKey]?.[requestId];\n };\n const subscriptionSelectors = {\n getSubscriptions,\n getSubscriptionCount,\n isRequestSubscribed\n };\n return (action, mwApi) => {\n if (!previousSubscriptions) {\n previousSubscriptions = JSON.parse(JSON.stringify(internalState.currentSubscriptions));\n }\n if (api.util.resetApiState.match(action)) {\n previousSubscriptions = internalState.currentSubscriptions = {};\n updateSyncTimer = null;\n return [true, false];\n }\n if (api.internalActions.internal_getRTKQSubscriptions.match(action)) {\n return [false, subscriptionSelectors];\n }\n const didMutate = actuallyMutateSubscriptions(internalState.currentSubscriptions, action);\n let actionShouldContinue = true;\n if (didMutate) {\n if (!updateSyncTimer) {\n updateSyncTimer = setTimeout(() => {\n const newSubscriptions = JSON.parse(JSON.stringify(internalState.currentSubscriptions));\n const [, patches] = produceWithPatches(previousSubscriptions, () => newSubscriptions);\n mwApi.next(api.internalActions.subscriptionsUpdated(patches));\n previousSubscriptions = newSubscriptions;\n updateSyncTimer = null;\n }, 500);\n }\n const isSubscriptionSliceAction = typeof action.type == "string" && !!action.type.startsWith(subscriptionsPrefix);\n const isAdditionalSubscriptionAction = queryThunk.rejected.match(action) && action.meta.condition && !!action.meta.arg.subscribe;\n actionShouldContinue = !isSubscriptionSliceAction && !isAdditionalSubscriptionAction;\n }\n return [actionShouldContinue, false];\n };\n};\n\n// src/query/core/buildMiddleware/cacheCollection.ts\nfunction isObjectEmpty(obj) {\n for (const k in obj) {\n return false;\n }\n return true;\n}\nvar THIRTY_TWO_BIT_MAX_TIMER_SECONDS = 2147483647 / 1e3 - 1;\nvar buildCacheCollectionHandler = ({\n reducerPath,\n api,\n queryThunk,\n context,\n internalState,\n selectors: {\n selectQueryEntry,\n selectConfig\n }\n}) => {\n const {\n removeQueryResult,\n unsubscribeQueryResult,\n cacheEntriesUpserted\n } = api.internalActions;\n const canTriggerUnsubscribe = isAnyOf(unsubscribeQueryResult.match, queryThunk.fulfilled, queryThunk.rejected, cacheEntriesUpserted.match);\n function anySubscriptionsRemainingForKey(queryCacheKey) {\n const subscriptions = internalState.currentSubscriptions[queryCacheKey];\n return !!subscriptions && !isObjectEmpty(subscriptions);\n }\n const currentRemovalTimeouts = {};\n const handler = (action, mwApi, internalState2) => {\n const state = mwApi.getState();\n const config = selectConfig(state);\n if (canTriggerUnsubscribe(action)) {\n let queryCacheKeys;\n if (cacheEntriesUpserted.match(action)) {\n queryCacheKeys = action.payload.map((entry) => entry.queryDescription.queryCacheKey);\n } else {\n const {\n queryCacheKey\n } = unsubscribeQueryResult.match(action) ? action.payload : action.meta.arg;\n queryCacheKeys = [queryCacheKey];\n }\n handleUnsubscribeMany(queryCacheKeys, mwApi, config);\n }\n if (api.util.resetApiState.match(action)) {\n for (const [key, timeout] of Object.entries(currentRemovalTimeouts)) {\n if (timeout) clearTimeout(timeout);\n delete currentRemovalTimeouts[key];\n }\n }\n if (context.hasRehydrationInfo(action)) {\n const {\n queries\n } = context.extractRehydrationInfo(action);\n handleUnsubscribeMany(Object.keys(queries), mwApi, config);\n }\n };\n function handleUnsubscribeMany(cacheKeys, api2, config) {\n const state = api2.getState();\n for (const queryCacheKey of cacheKeys) {\n const entry = selectQueryEntry(state, queryCacheKey);\n handleUnsubscribe(queryCacheKey, entry?.endpointName, api2, config);\n }\n }\n function handleUnsubscribe(queryCacheKey, endpointName, api2, config) {\n const endpointDefinition = context.endpointDefinitions[endpointName];\n const keepUnusedDataFor = endpointDefinition?.keepUnusedDataFor ?? config.keepUnusedDataFor;\n if (keepUnusedDataFor === Infinity) {\n return;\n }\n const finalKeepUnusedDataFor = Math.max(0, Math.min(keepUnusedDataFor, THIRTY_TWO_BIT_MAX_TIMER_SECONDS));\n if (!anySubscriptionsRemainingForKey(queryCacheKey)) {\n const currentTimeout = currentRemovalTimeouts[queryCacheKey];\n if (currentTimeout) {\n clearTimeout(currentTimeout);\n }\n currentRemovalTimeouts[queryCacheKey] = setTimeout(() => {\n if (!anySubscriptionsRemainingForKey(queryCacheKey)) {\n api2.dispatch(removeQueryResult({\n queryCacheKey\n }));\n }\n delete currentRemovalTimeouts[queryCacheKey];\n }, finalKeepUnusedDataFor * 1e3);\n }\n }\n return handler;\n};\n\n// src/query/core/buildMiddleware/cacheLifecycle.ts\nvar neverResolvedError = new Error("Promise never resolved before cacheEntryRemoved.");\nvar buildCacheLifecycleHandler = ({\n api,\n reducerPath,\n context,\n queryThunk,\n mutationThunk,\n internalState,\n selectors: {\n selectQueryEntry,\n selectApiState\n }\n}) => {\n const isQueryThunk = isAsyncThunkAction(queryThunk);\n const isMutationThunk = isAsyncThunkAction(mutationThunk);\n const isFulfilledThunk = isFulfilled(queryThunk, mutationThunk);\n const lifecycleMap = {};\n function resolveLifecycleEntry(cacheKey, data, meta) {\n const lifecycle = lifecycleMap[cacheKey];\n if (lifecycle?.valueResolved) {\n lifecycle.valueResolved({\n data,\n meta\n });\n delete lifecycle.valueResolved;\n }\n }\n function removeLifecycleEntry(cacheKey) {\n const lifecycle = lifecycleMap[cacheKey];\n if (lifecycle) {\n delete lifecycleMap[cacheKey];\n lifecycle.cacheEntryRemoved();\n }\n }\n const handler = (action, mwApi, stateBefore) => {\n const cacheKey = getCacheKey(action);\n function checkForNewCacheKey(endpointName, cacheKey2, requestId, originalArgs) {\n const oldEntry = selectQueryEntry(stateBefore, cacheKey2);\n const newEntry = selectQueryEntry(mwApi.getState(), cacheKey2);\n if (!oldEntry && newEntry) {\n handleNewKey(endpointName, originalArgs, cacheKey2, mwApi, requestId);\n }\n }\n if (queryThunk.pending.match(action)) {\n checkForNewCacheKey(action.meta.arg.endpointName, cacheKey, action.meta.requestId, action.meta.arg.originalArgs);\n } else if (api.internalActions.cacheEntriesUpserted.match(action)) {\n for (const {\n queryDescription,\n value\n } of action.payload) {\n const {\n endpointName,\n originalArgs,\n queryCacheKey\n } = queryDescription;\n checkForNewCacheKey(endpointName, queryCacheKey, action.meta.requestId, originalArgs);\n resolveLifecycleEntry(queryCacheKey, value, {});\n }\n } else if (mutationThunk.pending.match(action)) {\n const state = mwApi.getState()[reducerPath].mutations[cacheKey];\n if (state) {\n handleNewKey(action.meta.arg.endpointName, action.meta.arg.originalArgs, cacheKey, mwApi, action.meta.requestId);\n }\n } else if (isFulfilledThunk(action)) {\n resolveLifecycleEntry(cacheKey, action.payload, action.meta.baseQueryMeta);\n } else if (api.internalActions.removeQueryResult.match(action) || api.internalActions.removeMutationResult.match(action)) {\n removeLifecycleEntry(cacheKey);\n } else if (api.util.resetApiState.match(action)) {\n for (const cacheKey2 of Object.keys(lifecycleMap)) {\n removeLifecycleEntry(cacheKey2);\n }\n }\n };\n function getCacheKey(action) {\n if (isQueryThunk(action)) return action.meta.arg.queryCacheKey;\n if (isMutationThunk(action)) {\n return action.meta.arg.fixedCacheKey ?? action.meta.requestId;\n }\n if (api.internalActions.removeQueryResult.match(action)) return action.payload.queryCacheKey;\n if (api.internalActions.removeMutationResult.match(action)) return getMutationCacheKey(action.payload);\n return "";\n }\n function handleNewKey(endpointName, originalArgs, queryCacheKey, mwApi, requestId) {\n const endpointDefinition = context.endpointDefinitions[endpointName];\n const onCacheEntryAdded = endpointDefinition?.onCacheEntryAdded;\n if (!onCacheEntryAdded) return;\n const lifecycle = {};\n const cacheEntryRemoved = new Promise((resolve) => {\n lifecycle.cacheEntryRemoved = resolve;\n });\n const cacheDataLoaded = Promise.race([new Promise((resolve) => {\n lifecycle.valueResolved = resolve;\n }), cacheEntryRemoved.then(() => {\n throw neverResolvedError;\n })]);\n cacheDataLoaded.catch(() => {\n });\n lifecycleMap[queryCacheKey] = lifecycle;\n const selector = api.endpoints[endpointName].select(isAnyQueryDefinition(endpointDefinition) ? originalArgs : queryCacheKey);\n const extra = mwApi.dispatch((_, __, extra2) => extra2);\n const lifecycleApi = {\n ...mwApi,\n getCacheEntry: () => selector(mwApi.getState()),\n requestId,\n extra,\n updateCachedData: isAnyQueryDefinition(endpointDefinition) ? (updateRecipe) => mwApi.dispatch(api.util.updateQueryData(endpointName, originalArgs, updateRecipe)) : void 0,\n cacheDataLoaded,\n cacheEntryRemoved\n };\n const runningHandler = onCacheEntryAdded(originalArgs, lifecycleApi);\n Promise.resolve(runningHandler).catch((e) => {\n if (e === neverResolvedError) return;\n throw e;\n });\n }\n return handler;\n};\n\n// src/query/core/buildMiddleware/devMiddleware.ts\nvar buildDevCheckHandler = ({\n api,\n context: {\n apiUid\n },\n reducerPath\n}) => {\n return (action, mwApi) => {\n if (api.util.resetApiState.match(action)) {\n mwApi.dispatch(api.internalActions.middlewareRegistered(apiUid));\n }\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n };\n};\n\n// src/query/core/buildMiddleware/invalidationByTags.ts\nvar buildInvalidationByTagsHandler = ({\n reducerPath,\n context,\n context: {\n endpointDefinitions\n },\n mutationThunk,\n queryThunk,\n api,\n assertTagType,\n refetchQuery,\n internalState\n}) => {\n const {\n removeQueryResult\n } = api.internalActions;\n const isThunkActionWithTags = isAnyOf(isFulfilled(mutationThunk), isRejectedWithValue(mutationThunk));\n const isQueryEnd = isAnyOf(isFulfilled(mutationThunk, queryThunk), isRejected(mutationThunk, queryThunk));\n let pendingTagInvalidations = [];\n const handler = (action, mwApi) => {\n if (isThunkActionWithTags(action)) {\n invalidateTags(calculateProvidedByThunk(action, "invalidatesTags", endpointDefinitions, assertTagType), mwApi);\n } else if (isQueryEnd(action)) {\n invalidateTags([], mwApi);\n } else if (api.util.invalidateTags.match(action)) {\n invalidateTags(calculateProvidedBy(action.payload, void 0, void 0, void 0, void 0, assertTagType), mwApi);\n }\n };\n function hasPendingRequests(state) {\n const {\n queries,\n mutations\n } = state;\n for (const cacheRecord of [queries, mutations]) {\n for (const key in cacheRecord) {\n if (cacheRecord[key]?.status === "pending" /* pending */) return true;\n }\n }\n return false;\n }\n function invalidateTags(newTags, mwApi) {\n const rootState = mwApi.getState();\n const state = rootState[reducerPath];\n pendingTagInvalidations.push(...newTags);\n if (state.config.invalidationBehavior === "delayed" && hasPendingRequests(state)) {\n return;\n }\n const tags = pendingTagInvalidations;\n pendingTagInvalidations = [];\n if (tags.length === 0) return;\n const toInvalidate = api.util.selectInvalidatedBy(rootState, tags);\n context.batch(() => {\n const valuesArray = Array.from(toInvalidate.values());\n for (const {\n queryCacheKey\n } of valuesArray) {\n const querySubState = state.queries[queryCacheKey];\n const subscriptionSubState = internalState.currentSubscriptions[queryCacheKey] ?? {};\n if (querySubState) {\n if (countObjectKeys(subscriptionSubState) === 0) {\n mwApi.dispatch(removeQueryResult({\n queryCacheKey\n }));\n } else if (querySubState.status !== "uninitialized" /* uninitialized */) {\n mwApi.dispatch(refetchQuery(querySubState));\n }\n }\n }\n });\n }\n return handler;\n};\n\n// src/query/core/buildMiddleware/polling.ts\nvar buildPollingHandler = ({\n reducerPath,\n queryThunk,\n api,\n refetchQuery,\n internalState\n}) => {\n const currentPolls = {};\n const handler = (action, mwApi) => {\n if (api.internalActions.updateSubscriptionOptions.match(action) || api.internalActions.unsubscribeQueryResult.match(action)) {\n updatePollingInterval(action.payload, mwApi);\n }\n if (queryThunk.pending.match(action) || queryThunk.rejected.match(action) && action.meta.condition) {\n updatePollingInterval(action.meta.arg, mwApi);\n }\n if (queryThunk.fulfilled.match(action) || queryThunk.rejected.match(action) && !action.meta.condition) {\n startNextPoll(action.meta.arg, mwApi);\n }\n if (api.util.resetApiState.match(action)) {\n clearPolls();\n }\n };\n function getCacheEntrySubscriptions(queryCacheKey, api2) {\n const state = api2.getState()[reducerPath];\n const querySubState = state.queries[queryCacheKey];\n const subscriptions = internalState.currentSubscriptions[queryCacheKey];\n if (!querySubState || querySubState.status === "uninitialized" /* uninitialized */) return;\n return subscriptions;\n }\n function startNextPoll({\n queryCacheKey\n }, api2) {\n const state = api2.getState()[reducerPath];\n const querySubState = state.queries[queryCacheKey];\n const subscriptions = internalState.currentSubscriptions[queryCacheKey];\n if (!querySubState || querySubState.status === "uninitialized" /* uninitialized */) return;\n const {\n lowestPollingInterval,\n skipPollingIfUnfocused\n } = findLowestPollingInterval(subscriptions);\n if (!Number.isFinite(lowestPollingInterval)) return;\n const currentPoll = currentPolls[queryCacheKey];\n if (currentPoll?.timeout) {\n clearTimeout(currentPoll.timeout);\n currentPoll.timeout = void 0;\n }\n const nextPollTimestamp = Date.now() + lowestPollingInterval;\n currentPolls[queryCacheKey] = {\n nextPollTimestamp,\n pollingInterval: lowestPollingInterval,\n timeout: setTimeout(() => {\n if (state.config.focused || !skipPollingIfUnfocused) {\n api2.dispatch(refetchQuery(querySubState));\n }\n startNextPoll({\n queryCacheKey\n }, api2);\n }, lowestPollingInterval)\n };\n }\n function updatePollingInterval({\n queryCacheKey\n }, api2) {\n const state = api2.getState()[reducerPath];\n const querySubState = state.queries[queryCacheKey];\n const subscriptions = internalState.currentSubscriptions[queryCacheKey];\n if (!querySubState || querySubState.status === "uninitialized" /* uninitialized */) {\n return;\n }\n const {\n lowestPollingInterval\n } = findLowestPollingInterval(subscriptions);\n if (!Number.isFinite(lowestPollingInterval)) {\n cleanupPollForKey(queryCacheKey);\n return;\n }\n const currentPoll = currentPolls[queryCacheKey];\n const nextPollTimestamp = Date.now() + lowestPollingInterval;\n if (!currentPoll || nextPollTimestamp < currentPoll.nextPollTimestamp) {\n startNextPoll({\n queryCacheKey\n }, api2);\n }\n }\n function cleanupPollForKey(key) {\n const existingPoll = currentPolls[key];\n if (existingPoll?.timeout) {\n clearTimeout(existingPoll.timeout);\n }\n delete currentPolls[key];\n }\n function clearPolls() {\n for (const key of Object.keys(currentPolls)) {\n cleanupPollForKey(key);\n }\n }\n function findLowestPollingInterval(subscribers = {}) {\n let skipPollingIfUnfocused = false;\n let lowestPollingInterval = Number.POSITIVE_INFINITY;\n for (let key in subscribers) {\n if (!!subscribers[key].pollingInterval) {\n lowestPollingInterval = Math.min(subscribers[key].pollingInterval, lowestPollingInterval);\n skipPollingIfUnfocused = subscribers[key].skipPollingIfUnfocused || skipPollingIfUnfocused;\n }\n }\n return {\n lowestPollingInterval,\n skipPollingIfUnfocused\n };\n }\n return handler;\n};\n\n// src/query/core/buildMiddleware/queryLifecycle.ts\nvar buildQueryLifecycleHandler = ({\n api,\n context,\n queryThunk,\n mutationThunk\n}) => {\n const isPendingThunk = isPending(queryThunk, mutationThunk);\n const isRejectedThunk = isRejected(queryThunk, mutationThunk);\n const isFullfilledThunk = isFulfilled(queryThunk, mutationThunk);\n const lifecycleMap = {};\n const handler = (action, mwApi) => {\n if (isPendingThunk(action)) {\n const {\n requestId,\n arg: {\n endpointName,\n originalArgs\n }\n } = action.meta;\n const endpointDefinition = context.endpointDefinitions[endpointName];\n const onQueryStarted = endpointDefinition?.onQueryStarted;\n if (onQueryStarted) {\n const lifecycle = {};\n const queryFulfilled = new Promise((resolve, reject) => {\n lifecycle.resolve = resolve;\n lifecycle.reject = reject;\n });\n queryFulfilled.catch(() => {\n });\n lifecycleMap[requestId] = lifecycle;\n const selector = api.endpoints[endpointName].select(isAnyQueryDefinition(endpointDefinition) ? originalArgs : requestId);\n const extra = mwApi.dispatch((_, __, extra2) => extra2);\n const lifecycleApi = {\n ...mwApi,\n getCacheEntry: () => selector(mwApi.getState()),\n requestId,\n extra,\n updateCachedData: isAnyQueryDefinition(endpointDefinition) ? (updateRecipe) => mwApi.dispatch(api.util.updateQueryData(endpointName, originalArgs, updateRecipe)) : void 0,\n queryFulfilled\n };\n onQueryStarted(originalArgs, lifecycleApi);\n }\n } else if (isFullfilledThunk(action)) {\n const {\n requestId,\n baseQueryMeta\n } = action.meta;\n lifecycleMap[requestId]?.resolve({\n data: action.payload,\n meta: baseQueryMeta\n });\n delete lifecycleMap[requestId];\n } else if (isRejectedThunk(action)) {\n const {\n requestId,\n rejectedWithValue,\n baseQueryMeta\n } = action.meta;\n lifecycleMap[requestId]?.reject({\n error: action.payload ?? action.error,\n isUnhandledError: !rejectedWithValue,\n meta: baseQueryMeta\n });\n delete lifecycleMap[requestId];\n }\n };\n return handler;\n};\n\n// src/query/core/buildMiddleware/windowEventHandling.ts\nvar buildWindowEventHandler = ({\n reducerPath,\n context,\n api,\n refetchQuery,\n internalState\n}) => {\n const {\n removeQueryResult\n } = api.internalActions;\n const handler = (action, mwApi) => {\n if (onFocus.match(action)) {\n refetchValidQueries(mwApi, "refetchOnFocus");\n }\n if (onOnline.match(action)) {\n refetchValidQueries(mwApi, "refetchOnReconnect");\n }\n };\n function refetchValidQueries(api2, type) {\n const state = api2.getState()[reducerPath];\n const queries = state.queries;\n const subscriptions = internalState.currentSubscriptions;\n context.batch(() => {\n for (const queryCacheKey of Object.keys(subscriptions)) {\n const querySubState = queries[queryCacheKey];\n const subscriptionSubState = subscriptions[queryCacheKey];\n if (!subscriptionSubState || !querySubState) continue;\n const shouldRefetch = Object.values(subscriptionSubState).some((sub) => sub[type] === true) || Object.values(subscriptionSubState).every((sub) => sub[type] === void 0) && state.config[type];\n if (shouldRefetch) {\n if (countObjectKeys(subscriptionSubState) === 0) {\n api2.dispatch(removeQueryResult({\n queryCacheKey\n }));\n } else if (querySubState.status !== "uninitialized" /* uninitialized */) {\n api2.dispatch(refetchQuery(querySubState));\n }\n }\n }\n });\n }\n return handler;\n};\n\n// src/query/core/buildMiddleware/index.ts\nfunction buildMiddleware(input) {\n const {\n reducerPath,\n queryThunk,\n api,\n context\n } = input;\n const {\n apiUid\n } = context;\n const actions = {\n invalidateTags: createAction(`${reducerPath}/invalidateTags`)\n };\n const isThisApiSliceAction = (action) => action.type.startsWith(`${reducerPath}/`);\n const handlerBuilders = [buildDevCheckHandler, buildCacheCollectionHandler, buildInvalidationByTagsHandler, buildPollingHandler, buildCacheLifecycleHandler, buildQueryLifecycleHandler];\n const middleware = (mwApi) => {\n let initialized2 = false;\n const internalState = {\n currentSubscriptions: {}\n };\n const builderArgs = {\n ...input,\n internalState,\n refetchQuery,\n isThisApiSliceAction\n };\n const handlers = handlerBuilders.map((build) => build(builderArgs));\n const batchedActionsHandler = buildBatchedActionsHandler(builderArgs);\n const windowEventsHandler = buildWindowEventHandler(builderArgs);\n return (next) => {\n return (action) => {\n if (!redux_isAction(action)) {\n return next(action);\n }\n if (!initialized2) {\n initialized2 = true;\n mwApi.dispatch(api.internalActions.middlewareRegistered(apiUid));\n }\n const mwApiWithNext = {\n ...mwApi,\n next\n };\n const stateBefore = mwApi.getState();\n const [actionShouldContinue, internalProbeResult] = batchedActionsHandler(action, mwApiWithNext, stateBefore);\n let res;\n if (actionShouldContinue) {\n res = next(action);\n } else {\n res = internalProbeResult;\n }\n if (!!mwApi.getState()[reducerPath]) {\n windowEventsHandler(action, mwApiWithNext, stateBefore);\n if (isThisApiSliceAction(action) || context.hasRehydrationInfo(action)) {\n for (const handler of handlers) {\n handler(action, mwApiWithNext, stateBefore);\n }\n }\n }\n return res;\n };\n };\n };\n return {\n middleware,\n actions\n };\n function refetchQuery(querySubState) {\n return input.api.endpoints[querySubState.endpointName].initiate(querySubState.originalArgs, {\n subscribe: false,\n forceRefetch: true\n });\n }\n}\n\n// src/query/core/module.ts\nvar coreModuleName = /* @__PURE__ */ Symbol();\nvar coreModule = ({\n createSelector: createSelector2 = createSelector\n} = {}) => ({\n name: coreModuleName,\n init(api, {\n baseQuery,\n tagTypes,\n reducerPath,\n serializeQueryArgs,\n keepUnusedDataFor,\n refetchOnMountOrArgChange,\n refetchOnFocus,\n refetchOnReconnect,\n invalidationBehavior,\n onSchemaFailure,\n catchSchemaFailure,\n skipSchemaValidation\n }, context) {\n enablePatches();\n assertCast(serializeQueryArgs);\n const assertTagType = (tag) => {\n if (typeof process !== "undefined" && "production" === "development") // removed by dead control flow\n{}\n return tag;\n };\n Object.assign(api, {\n reducerPath,\n endpoints: {},\n internalActions: {\n onOnline,\n onOffline,\n onFocus,\n onFocusLost\n },\n util: {}\n });\n const selectors = buildSelectors({\n serializeQueryArgs,\n reducerPath,\n createSelector: createSelector2\n });\n const {\n selectInvalidatedBy,\n selectCachedArgsForQuery,\n buildQuerySelector,\n buildInfiniteQuerySelector,\n buildMutationSelector\n } = selectors;\n safeAssign(api.util, {\n selectInvalidatedBy,\n selectCachedArgsForQuery\n });\n const {\n queryThunk,\n infiniteQueryThunk,\n mutationThunk,\n patchQueryData,\n updateQueryData,\n upsertQueryData,\n prefetch,\n buildMatchThunkActions\n } = buildThunks({\n baseQuery,\n reducerPath,\n context,\n api,\n serializeQueryArgs,\n assertTagType,\n selectors,\n onSchemaFailure,\n catchSchemaFailure,\n skipSchemaValidation\n });\n const {\n reducer,\n actions: sliceActions\n } = buildSlice({\n context,\n queryThunk,\n infiniteQueryThunk,\n mutationThunk,\n serializeQueryArgs,\n reducerPath,\n assertTagType,\n config: {\n refetchOnFocus,\n refetchOnReconnect,\n refetchOnMountOrArgChange,\n keepUnusedDataFor,\n reducerPath,\n invalidationBehavior\n }\n });\n safeAssign(api.util, {\n patchQueryData,\n updateQueryData,\n upsertQueryData,\n prefetch,\n resetApiState: sliceActions.resetApiState,\n upsertQueryEntries: sliceActions.cacheEntriesUpserted\n });\n safeAssign(api.internalActions, sliceActions);\n const {\n middleware,\n actions: middlewareActions\n } = buildMiddleware({\n reducerPath,\n context,\n queryThunk,\n mutationThunk,\n infiniteQueryThunk,\n api,\n assertTagType,\n selectors\n });\n safeAssign(api.util, middlewareActions);\n safeAssign(api, {\n reducer,\n middleware\n });\n const {\n buildInitiateQuery,\n buildInitiateInfiniteQuery,\n buildInitiateMutation,\n getRunningMutationThunk,\n getRunningMutationsThunk,\n getRunningQueriesThunk,\n getRunningQueryThunk\n } = buildInitiate({\n queryThunk,\n mutationThunk,\n infiniteQueryThunk,\n api,\n serializeQueryArgs,\n context\n });\n safeAssign(api.util, {\n getRunningMutationThunk,\n getRunningMutationsThunk,\n getRunningQueryThunk,\n getRunningQueriesThunk\n });\n return {\n name: coreModuleName,\n injectEndpoint(endpointName, definition) {\n const anyApi = api;\n const endpoint = anyApi.endpoints[endpointName] ??= {};\n if (isQueryDefinition(definition)) {\n safeAssign(endpoint, {\n name: endpointName,\n select: buildQuerySelector(endpointName, definition),\n initiate: buildInitiateQuery(endpointName, definition)\n }, buildMatchThunkActions(queryThunk, endpointName));\n }\n if (isMutationDefinition(definition)) {\n safeAssign(endpoint, {\n name: endpointName,\n select: buildMutationSelector(),\n initiate: buildInitiateMutation(endpointName)\n }, buildMatchThunkActions(mutationThunk, endpointName));\n }\n if (isInfiniteQueryDefinition(definition)) {\n safeAssign(endpoint, {\n name: endpointName,\n select: buildInfiniteQuerySelector(endpointName, definition),\n initiate: buildInitiateInfiniteQuery(endpointName, definition)\n }, buildMatchThunkActions(queryThunk, endpointName));\n }\n }\n };\n }\n});\n\n// src/query/core/index.ts\nvar createApi = /* @__PURE__ */ buildCreateApi(coreModule());\n\n//# sourceMappingURL=rtk-query.modern.mjs.map\n;// ./node_modules/@forgerock/javascript-sdk/dist/device-client/services/index.js\n\nconst services_c = ({ baseUrl: o, realmPath: r }) => createApi({\n reducerPath: "deviceClient",\n baseQuery: fetchBaseQuery({\n credentials: "include",\n prepareHeaders: (t) => (t.set("Content-Type", "application/json"), t.set("Accept", "application/json"), t.set("x-requested-with", "forgerock-sdk"), t.set("x-requested-platform", "javascript"), t),\n baseUrl: o\n }),\n endpoints: (t) => ({\n // oath endpoints\n getOAthDevices: t.query({\n query: ({ realm: e = r, userId: s }) => `json/realms/${e}/users/${s}/devices/2fa/oath?_queryFilter=true`\n }),\n deleteOathDevice: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n method: "DELETE",\n url: `json/realms/${e}/users/${s}/devices/2fa/oath/${u.uuid}`,\n body: u\n })\n }),\n // push device\n getPushDevices: t.query({\n query: ({ realm: e = r, userId: s }) => `/json/realms/${e}/users/${s}/devices/2fa/push?_queryFilter=true`\n }),\n deletePushDevice: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `/json/realms/${e}/users/${s}/devices/2fa/push/${u.uuid}`,\n method: "DELETE",\n body: {}\n })\n }),\n // webauthn devices\n getWebAuthnDevices: t.query({\n query: ({ realm: e = r, userId: s }) => `/json/realms/${e}/users/${s}/devices/2fa/webauthn?_queryFilter=true`\n }),\n updateWebAuthnDeviceName: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `/json/realms/${e}/users/${s}/devices/2fa/webauthn/${u.uuid}`,\n method: "PUT",\n body: u\n })\n }),\n deleteWebAuthnDeviceName: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `/json/realms/${e}/users/${s}/devices/2fa/webauthn/${u.uuid}`,\n method: "DELETE",\n body: u\n })\n }),\n getBoundDevices: t.mutation({\n query: ({ realm: e = r, userId: s }) => `/json/realms/${e}/users/${s}/devices/2fa/binding?_queryFilter=true`\n }),\n updateBoundDevice: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `/json/realms/root/realms/${e}/users/${s}/devices/2fa/binding/${u.uuid}`,\n method: "PUT",\n body: u\n })\n }),\n deleteBoundDevice: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `/json/realms/root/realms/${e}/users/${s}/devices/2fa/binding/${u.uuid}`,\n method: "DELETE",\n body: u\n })\n }),\n getDeviceProfiles: t.query({\n query: ({ realm: e = r, userId: s }) => `json/realms/${e}/users/${s}/devices/profile?_queryFilter=true`\n }),\n updateDeviceProfile: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `json/realms/${e}/users/${s}/devices/profile/${u.identifier}`,\n method: "PUT",\n body: u\n })\n }),\n deleteDeviceProfile: t.mutation({\n query: ({ realm: e = r, userId: s, device: u }) => ({\n url: `json/realms/${e}/users/${s}/devices/profile/${u.identifier}`,\n method: "DELETE",\n body: u\n })\n })\n })\n});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/device-client/device.store.js\n\n\nconst device_store_p = (n) => {\n const { middleware: i, reducerPath: o, reducer: s, endpoints: r } = services_c({\n baseUrl: n.serverConfig?.baseUrl ?? "",\n realmPath: n?.realmPath ?? ""\n }), a = configureStore({\n reducer: {\n [o]: s\n },\n middleware: (e) => e().concat(i)\n });\n return {\n /**\n * Oath device management methods.\n *\n * @type {OathManagement}\n */\n oath: {\n /**\n * Retrieves Oath devices based on the specified query.\n *\n * @async\n * @function get\n * @param {RetrieveOathQuery} query - The query used to retrieve Oath devices.\n * @returns {Promise} - A promise that resolves to the retrieved data or an error object if the response is not valid.\n */\n get: async function(e) {\n try {\n const t = await a.dispatch(r.getOAthDevices.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Deletes an Oath device based on the provided query and device information.\n *\n * @async\n * @function delete\n * @param {DeleteOathQuery & OathDevice} query - The query and device information used to delete the Oath device.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n delete: async function(e) {\n try {\n const t = await a.dispatch(r.deleteOathDevice.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n }\n },\n /**\n * Push device management methods.\n *\n * @type {PushManagement}\n */\n push: {\n /**\n * Retrieves Push devices based on the specified query.\n *\n * @async\n * @function get\n * @param {PushDeviceQuery} query - The query used to retrieve Push devices.\n * @returns {Promise} - A promise that resolves to the retrieved data or an error object if the response is not valid.\n */\n get: async function(e) {\n try {\n const t = await a.dispatch(r.getPushDevices.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Deletes a Push device based on the provided query.\n *\n * @async\n * @function delete\n * @param {DeleteDeviceQuery} query - The query used to delete the Push device.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n delete: async function(e) {\n try {\n const t = await a.dispatch(r.deletePushDevice.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n }\n },\n /**\n * WebAuthn device management methods.\n *\n * @type {WebAuthnManagement}\n */\n webAuthn: {\n /**\n * Retrieves WebAuthn devices based on the specified query.\n *\n * @async\n * @function get\n * @param {WebAuthnQuery} query - The query used to retrieve WebAuthn devices.\n * @returns {Promise} - A promise that resolves to the retrieved data or an error object if the response is not valid.\n */\n get: async function(e) {\n try {\n const t = await a.dispatch(r.getWebAuthnDevices.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Updates the name of a WebAuthn device based on the provided query and body.\n *\n * @async\n * @function update\n * @param {WebAuthnQueryWithUUID & { device: WebAuthnBody } } query - The query and body used to update the WebAuthn device name.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n update: async function(e) {\n try {\n const t = await a.dispatch(r.updateWebAuthnDeviceName.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Deletes a WebAuthn device based on the provided query and body.\n *\n * @async\n * @function delete\n * @param {WebAuthnQueryWithUUID & { device: WebAuthnBody } } query - The query and body used to delete the WebAuthn device.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n delete: async function(e) {\n try {\n const t = await a.dispatch(r.deleteWebAuthnDeviceName.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n }\n },\n /**\n * Bound devices management methods.\n *\n * @type {BoundDevicesManagement}\n */\n bound: {\n /**\n * Retrieves bound devices based on the specified query.\n *\n * @async\n * @function get\n * @param {BoundDeviceQuery} query - The query used to retrieve bound devices.\n * @returns {Promise} - A promise that resolves to the retrieved data or an error object if the response is not valid.\n */\n get: async function(e) {\n try {\n const t = await a.dispatch(r.getBoundDevices.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Deletes a bound device based on the provided query.\n *\n * @async\n * @function delete\n * @param {BoundDeviceQuery} query - The query used to delete the bound device.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n delete: async function(e) {\n try {\n const t = await a.dispatch(r.deleteBoundDevice.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Updates the name of a bound device based on the provided query.\n *\n * @async\n * @function update\n * @param {BoundDeviceQuery} query - The query used to update the bound device name.\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n update: async function(e) {\n try {\n const t = await a.dispatch(r.updateBoundDevice.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n }\n },\n profile: {\n /**\n * Get profile devices\n *\n * @async\n * @function update\n * @param {GetProfileDevice} query - The query used to get profile devices\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n get: async function(e) {\n try {\n const t = await a.dispatch(r.getDeviceProfiles.initiate(e));\n if (!t || !t.data || !t.data.result)\n throw new Error("response did not contain data");\n return t.data.result;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Get profile devices\n *\n * @async\n * @function update\n * @param {ProfileDevicesQuery} query - The query used to update a profile device\n * @returns {Promise} - A promise that resolves to the response data or or an error object if the response is not valid.\n */\n update: async function(e) {\n try {\n const t = await a.dispatch(r.updateDeviceProfile.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n },\n /**\n * Get profile devices\n *\n * @async\n * @function update\n * @param {ProfileDevicesQuery} query - The query used to update a profile device\n * @returns {Promise} - A promise that resolves to the response data or an error object if the response is not valid.\n */\n delete: async function(e) {\n try {\n const t = await a.dispatch(r.deleteDeviceProfile.initiate(e));\n if (!t || !t.data)\n throw new Error("response did not contain data");\n return t.data;\n } catch (t) {\n return { error: t };\n }\n }\n }\n };\n};\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-device/defaults.js\nconst defaults_o = [\n "userAgent",\n "appName",\n "appCodeName",\n "appVersion",\n "appMinorVersion",\n "buildID",\n "product",\n "productSub",\n "vendor",\n "vendorSub",\n "browserLanguage"\n], defaults_a = [\n "fontNames",\n "displayProps",\n "browserProps",\n "hardwareProps",\n "platformProps"\n], e = 3e4, defaults_r = {\n mac: ["Macintosh", "MacIntel", "MacPPC", "Mac68K"],\n windows: ["Win32", "Win64", "Windows", "WinCE"],\n ios: ["iPhone", "iPad", "iPod"]\n}, n = ["width", "height", "pixelDepth", "orientation.angle"], defaults_s = [\n "cursive",\n "monospace",\n "serif",\n "sans-serif",\n "fantasy",\n "Arial",\n "Arial Black",\n "Arial Narrow",\n "Arial Rounded MT Bold",\n "Bookman Old Style",\n "Bradley Hand ITC",\n "Century",\n "Century Gothic",\n "Comic Sans MS",\n "Courier",\n "Courier New",\n "Georgia",\n "Gentium",\n "Impact",\n "King",\n "Lucida Console",\n "Lalit",\n "Modena",\n "Monotype Corsiva",\n "Papyrus",\n "Tahoma",\n "TeX",\n "Times",\n "Times New Roman",\n "Trebuchet MS",\n "Verdana",\n "Verona"\n], defaults_i = [\n "cpuClass",\n "deviceMemory",\n "hardwareConcurrency",\n "maxTouchPoints",\n "oscpu"\n], defaults_t = ["language", "platform", "userLanguage", "systemLanguage"];\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-device/collector.js\nclass collector_p {\n /**\n * @method reduceToObject - goes one to two levels into source to collect attribute\n * @param props - array of strings; can use dot notation for two level lookup\n * @param src - source of attributes to check\n */\n // eslint-disable-next-line\n reduceToObject(n, t) {\n return n.reduce((e, o) => {\n if (o.includes(".")) {\n const l = o.split("."), d = l[0], i = l[1], s = t[d] && t[d][i];\n e[i] = s ?? "";\n } else\n e[o] = t[o] != null ? t[o] : null;\n return e;\n }, {});\n }\n /**\n * @method reduceToString - goes one level into source to collect attribute\n * @param props - array of strings\n * @param src - source of attributes to check\n */\n // eslint-disable-next-line\n reduceToString(n, t) {\n return n.reduce((e, o) => (e = `${e}${t[o].filename};`, e), "");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/logger.js\n\nclass logger_t {\n static enabled() {\n const { logLevel: o } = config_c.get();\n return {\n none: 0,\n error: 25,\n warn: 50,\n info: 75,\n debug: 100\n }[o];\n }\n static info(...o) {\n const { logger: e } = config_c.get();\n this.enabled() >= 50 && (e && e.info ? e.info(...o) : console.info(...o));\n }\n static warn(...o) {\n const { logger: e } = config_c.get();\n this.enabled() >= 50 && (e && e.warn ? e.warn(...o) : console.warn(...o));\n }\n static error(...o) {\n const { logger: e } = config_c.get();\n this.enabled() >= 25 && (e && e.error ? e.error(...o) : console.error(...o));\n }\n static log(...o) {\n const { logger: e } = config_c.get();\n this.enabled() >= 75 && (e && e.log ? e.log(...o) : console.log(...o));\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-device/index.js\n\n\n\n\nclass O extends collector_p {\n constructor(t) {\n super(), this.config = {\n fontNames: defaults_s,\n devicePlatforms: defaults_r,\n displayProps: n,\n browserProps: defaults_o,\n hardwareProps: defaults_i,\n platformProps: defaults_t\n }, t && Object.keys(t).forEach((e) => {\n if (!defaults_a.includes(e))\n throw new Error("Device profile configuration category does not exist.");\n this.config[e] = t[e];\n });\n }\n getBrowserMeta() {\n return typeof navigator > "u" ? (logger_t.warn("Cannot collect browser metadata. navigator is not defined."), {}) : this.reduceToObject(this.config.browserProps, navigator);\n }\n getBrowserPluginsNames() {\n return typeof navigator < "u" && navigator.plugins ? this.reduceToString(Object.keys(navigator.plugins), navigator.plugins) : (logger_t.warn("Cannot collect browser plugin information. navigator.plugins is not defined."), "");\n }\n getDeviceName() {\n if (typeof navigator > "u")\n return logger_t.warn("Cannot collect device name. navigator is not defined."), "";\n const t = navigator.userAgent, e = navigator.platform;\n switch (!0) {\n case this.config.devicePlatforms.mac.includes(e):\n return "Mac (Browser)";\n case this.config.devicePlatforms.ios.includes(e):\n return `${e} (Browser)`;\n case this.config.devicePlatforms.windows.includes(e):\n return "Windows (Browser)";\n case (/Android/.test(e) || /Android/.test(t)):\n return "Android (Browser)";\n case (/CrOS/.test(t) || /Chromebook/.test(t)):\n return "Chrome OS (Browser)";\n case /Linux/.test(e):\n return "Linux (Browser)";\n default:\n return `${e || "Unknown"} (Browser)`;\n }\n }\n getDisplayMeta() {\n return typeof screen > "u" ? (logger_t.warn("Cannot collect screen information. screen is not defined."), {}) : this.reduceToObject(this.config.displayProps, screen);\n }\n getHardwareMeta() {\n return typeof navigator > "u" ? (logger_t.warn("Cannot collect OS metadata. Navigator is not defined."), {}) : this.reduceToObject(this.config.hardwareProps, navigator);\n }\n getIdentifier() {\n const t = `${config_c.get().prefix}-DeviceID`;\n if (!(typeof globalThis.crypto < "u" && globalThis.crypto.getRandomValues))\n return logger_t.warn("Cannot generate profile ID. Crypto and/or getRandomValues is not supported."), "";\n if (!localStorage)\n return logger_t.warn("Cannot store profile ID. localStorage is not supported."), "";\n let e = localStorage.getItem(t);\n return e || (e = globalThis.crypto.getRandomValues(new Uint32Array(3)).join("-"), localStorage.setItem(t, e)), e;\n }\n getInstalledFonts() {\n if (typeof document > "u")\n return logger_t.warn("Cannot collect font data. Global document object is undefined."), "";\n const t = document.createElement("canvas");\n if (!t)\n return logger_t.warn("Cannot collect font data. Browser does not support canvas element"), "";\n const e = t.getContext && t.getContext("2d");\n if (!e)\n return logger_t.warn("Cannot collect font data. Browser does not support 2d canvas context"), "";\n const o = "abcdefghi0123456789";\n e.font = "72px Comic Sans";\n const i = e.measureText(o).width;\n return this.config.fontNames.reduce((r, a) => (e.font = `72px ${a}, Comic Sans`, e.measureText(o).width !== i && (r = `${r}${a};`), r), "");\n }\n async getLocationCoordinates() {\n return typeof navigator < "u" && navigator.geolocation ? new Promise(async (t) => {\n navigator.geolocation.getCurrentPosition(\n (e) => t({\n latitude: e.coords.latitude,\n longitude: e.coords.longitude\n }),\n (e) => {\n logger_t.warn(\n "Cannot collect geolocation information. " + e.code + ": " + e.message\n ), t({});\n },\n {\n enableHighAccuracy: !0,\n timeout: e,\n maximumAge: 0\n }\n );\n }) : (logger_t.warn(\n "Cannot collect geolocation information. navigator.geolocation is not defined."\n ), Promise.resolve({}));\n }\n getOSMeta() {\n return typeof navigator > "u" ? (logger_t.warn("Cannot collect OS metadata. navigator is not defined."), {}) : this.reduceToObject(this.config.platformProps, navigator);\n }\n async getProfile({ location: t, metadata: e }) {\n const o = {\n identifier: this.getIdentifier()\n };\n return e && (o.metadata = {\n hardware: {\n ...this.getHardwareMeta(),\n display: this.getDisplayMeta()\n },\n browser: {\n ...this.getBrowserMeta(),\n plugins: this.getBrowserPluginsNames()\n },\n platform: {\n ...this.getOSMeta(),\n deviceName: this.getDeviceName(),\n fonts: this.getInstalledFonts(),\n timezone: this.getTimezoneOffset()\n }\n }), t && (o.location = await this.getLocationCoordinates()), o;\n }\n getTimezoneOffset() {\n try {\n return (/* @__PURE__ */ new Date()).getTimezoneOffset();\n } catch {\n return logger_t.warn("Cannot collect timezone information. getTimezoneOffset is not defined."), null;\n }\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-qr-code/index.js\n\nclass fr_qr_code_i {\n /**\n * @method isQRCodeStep - determines if step contains QR Code callbacks\n * @param {FRStep} step - step object from AM response\n * @returns {boolean}\n */\n static isQRCodeStep(t) {\n const e = t.getCallbacksOfType(enums_l.HiddenValueCallback);\n return e.length === 0 ? !1 : !!this.getQRCodeURICb(e);\n }\n /**\n * @method getQRCodeData - gets the necessary information from the QR Code callbacks\n * @param {FRStep} step - step object from AM response\n * @returns {QRCodeData}\n */\n static getQRCodeData(t) {\n const e = t.getCallbacksOfType(enums_l.HiddenValueCallback);\n if (e.length === 0)\n throw new Error(\n "QR Code step must contain a HiddenValueCallback. Use `FRQRCode.isQRCodeStep` to guard."\n );\n const a = this.getQRCodeURICb(e), s = a ? a.getOutputValue("value") : "", o = typeof s == "string" && s.includes("otpauth://") ? "otp" : "push", l = t.getCallbacksOfType(enums_l.TextOutputCallback).find((n) => n.getMessageType() !== "4");\n return {\n message: l ? l.getMessage() : "",\n use: o,\n uri: typeof s == "string" ? s : ""\n };\n }\n static getQRCodeURICb(t) {\n return t.find((e) => {\n const a = e.getOutputValue("value");\n return typeof a == "string" ? a?.includes("otpauth://") || a?.includes("pushauth://") : !1;\n });\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-recovery-codes/script-parser.js\nfunction script_parser_t(e) {\n const r = e.match(/\\s[\\w\\W]"([\\w]*)\\\\/g);\n return Array.isArray(r) && r.map((s) => {\n const a = s.match(/"([\\w]*)\\\\/);\n return Array.isArray(a) ? a[1] : "";\n }) || [];\n}\nfunction script_parser_o(e) {\n return e?.match(/\\s*.*<\\/em>/g)?.[0]?.replace("", "")?.replace("", "") ?? "New Security Key";\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-recovery-codes/index.js\n\n\nclass fr_recovery_codes_p {\n static getDeviceName(e) {\n const t = this.getDisplayCallback(e)?.getOutputByName("message", "") ?? "";\n return script_parser_o(t);\n }\n /**\n * Retrieves the recovery codes by parsing the JavaScript message text in callback.\n *\n * @param step The step to evaluate\n * @return Recovery Code values in array\n */\n static getCodes(e) {\n const t = this.getDisplayCallback(e)?.getOutputByName("message", "");\n return script_parser_t(t || "");\n }\n /**\n * Determines if the given step is a Display Recovery Codes step.\n *\n * @param step The step to evaluate\n * @return Is this step a Display Recovery Codes step\n */\n static isDisplayStep(e) {\n return !!this.getDisplayCallback(e);\n }\n /**\n * Gets the recovery codes step.\n *\n * @param step The step to evaluate\n * @return gets the Display Recovery Codes\' callback\n */\n static getDisplayCallback(e) {\n return e.getCallbacksOfType(enums_l.TextOutputCallback).find((t) => {\n const a = t.getOutputByName("message", void 0);\n return a && (a.includes("Recovery Codes") || a.includes("recovery codes"));\n });\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/token-storage/local-storage.js\n\nclass local_storage_n {\n /**\n * Retrieve tokens.\n */\n static async get(t) {\n const e = localStorage.getItem(`${config_c.get().prefix}-${t}`);\n if (e)\n try {\n return JSON.parse(e || "");\n } catch {\n throw new Error("Could not parse token object from localStorage");\n }\n }\n /**\n * Saves tokens.\n */\n static async set(t, e) {\n const o = JSON.stringify(e);\n localStorage.setItem(`${config_c.get().prefix}-${t}`, o);\n }\n /**\n * Removes stored tokens.\n */\n static async remove(t) {\n localStorage.removeItem(`${config_c.get().prefix}-${t}`);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/token-storage/session-storage.js\n\nclass session_storage_a {\n /**\n * Retrieve tokens.\n */\n static async get(e) {\n const t = sessionStorage.getItem(`${config_c.get().prefix}-${e}`);\n if (t)\n try {\n return JSON.parse(t || "");\n } catch {\n throw new Error("Could not parse token from sessionStorage");\n }\n }\n /**\n * Saves tokens.\n */\n static async set(e, t) {\n const s = JSON.stringify(t);\n sessionStorage.setItem(`${config_c.get().prefix}-${e}`, s);\n }\n /**\n * Removes stored tokens.\n */\n static async remove(e) {\n sessionStorage.removeItem(`${config_c.get().prefix}-${e}`);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/token-storage/index.js\n\n\n\n\nclass token_storage_d {\n /**\n * Gets stored tokens.\n */\n static async get() {\n const { clientId: t, tokenStore: e } = this.getClientConfig();\n if (e === "sessionStorage")\n return await session_storage_a.get(t);\n if (e === "localStorage")\n return await local_storage_n.get(t);\n if (e === "indexedDB")\n logger_t.warn("IndexedDB is not supported in this version.");\n else if (e && e.get)\n return await e.get(t);\n return await local_storage_n.get(t);\n }\n /**\n * Saves tokens.\n */\n static async set(t) {\n const { clientId: e, tokenStore: r } = this.getClientConfig();\n if (r === "sessionStorage")\n return await session_storage_a.set(e, t);\n if (r === "localStorage")\n return await local_storage_n.set(e, t);\n if (r === "indexedDB")\n logger_t.warn("IndexedDB is not supported in this version.");\n else if (r && r.set)\n return await r.set(e, t);\n return await local_storage_n.set(e, t);\n }\n /**\n * Removes stored tokens.\n */\n static async remove() {\n const { clientId: t, tokenStore: e } = this.getClientConfig();\n if (e === "sessionStorage")\n return await session_storage_a.remove(t);\n if (e === "localStorage")\n return await local_storage_n.remove(t);\n if (e === "indexedDB")\n logger_t.warn("IndexedDB is not supported in this version.");\n else if (e && e.remove)\n return await e.remove(t);\n return await local_storage_n.remove(t);\n }\n static getClientConfig() {\n const { clientId: t = "unconfiguredClient", tokenStore: e = "localStorage" } = config_c.get();\n return { clientId: t, tokenStore: e };\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/http.js\nfunction http_o(t) {\n return t.ok || Math.floor(t.status / 100) === 4;\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/pkce.js\nclass pkce_c {\n /**\n * Creates a random state.\n */\n static createState() {\n return this.createRandomString(16);\n }\n /**\n * Creates a random verifier.\n */\n static createVerifier() {\n return this.createRandomString(32);\n }\n /**\n * Creates a SHA-256 hash of the verifier.\n *\n * @param verifier The verifier to hash\n */\n static async createChallenge(e) {\n const t = await this.sha256(e);\n return this.base64UrlEncode(t);\n }\n /**\n * Creates a base64 encoded, URL-friendly version of the specified array.\n *\n * @param array The array of numbers to encode\n */\n static base64UrlEncode(e) {\n const t = Array.prototype.slice.call(e);\n return btoa(String.fromCharCode.apply(null, t)).replace(/\\+/g, "-").replace(/\\//g, "_").replace(/=/g, "");\n }\n /**\n * Creates a SHA-256 hash of the specified string.\n *\n * @param value The string to hash\n */\n static async sha256(e) {\n const t = new TextEncoder().encode(e), a = await crypto.subtle.digest("SHA-256", t);\n return new Uint8Array(a);\n }\n /**\n * Creates a random string.\n *\n * @param size The number for entropy (default: 32)\n */\n static createRandomString(e = 32) {\n const t = new Uint8Array(e);\n return crypto.getRandomValues(t), btoa(t.join("")).replace(/[^a-zA-Z0-9]+/, "");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/oauth2-client/index.js\n\n\n\n\n\n\n\n\nconst U = {\n // AM error for consent requirement\n AuthenticationConsentRequired: "Authentication or consent required",\n // Ping federate consent requirement\n AuthenticationIsRequired: "Authentication is required.",\n // Manual iframe error\n AuthorizationTimeout: "Authorization timed out",\n // Chromium browser error\n FailedToFetch: "Failed to fetch",\n // Mozilla browser error\n NetworkError: "NetworkError when attempting to fetch resource.",\n // Webkit browser error\n CORSError: "Cross-origin redirection",\n // prompt=none errors\n InteractionNotAllowed: "The request requires some interaction that is not allowed.",\n // PingOne login error\n LoginRequired: "User authentication is required",\n RequestRequiresConsent: "The request requires consent."\n};\nclass b {\n static async createAuthorizeUrl(e) {\n const { clientId: o, middleware: s, redirectUri: t, scope: n } = config_c.get(e), r = {\n ...e.query,\n client_id: o,\n redirect_uri: t,\n response_type: e.responseType,\n scope: n,\n state: e.state,\n ...e.prompt ? { prompt: e.prompt } : {}\n };\n if (e.verifier) {\n const a = await pkce_c.createChallenge(e.verifier);\n r.code_challenge = a, r.code_challenge_method = "S256";\n }\n const i = f(\n {\n url: new URL(this.getUrl("authorize", r, e)),\n init: {}\n },\n { type: enums_e.Authorize }\n ), { url: c } = i(s);\n return c.toString();\n }\n /**\n * Calls the authorize URL with an iframe. If successful,\n * it returns the callback URL with authentication code,\n * optionally using PKCE.\n * Method renamed in v3.\n * Original Name: getAuthorizeUrl\n * New Name: getAuthCodeByIframe\n */\n static async getAuthCodeByIframe(e) {\n const o = await this.createAuthorizeUrl({ ...e, prompt: "none" }), { serverConfig: s } = config_c.get(e);\n return new Promise((t, n) => {\n const r = document.createElement("iframe"), i = () => {\n };\n let c = i, a = i, d = 0;\n a = () => {\n clearTimeout(d), r.removeEventListener("load", c), r.remove();\n }, c = () => {\n if (r.contentWindow) {\n const u = r.contentWindow.location.href;\n (this.containsAuthCode(u) || this.containsAuthError(u)) && (a(), t(u));\n }\n }, d = setTimeout(() => {\n a(), n(new Error(U.AuthorizationTimeout));\n }, s.timeout), r.style.display = "none", r.addEventListener("load", c), document.body.appendChild(r), r.src = o;\n });\n }\n /**\n * Exchanges an authorization code for OAuth tokens.\n */\n static async getOAuth2Tokens(e) {\n const { clientId: o, redirectUri: s } = config_c.get(e), t = {\n client_id: o,\n code: e.authorizationCode,\n grant_type: "authorization_code",\n redirect_uri: s\n };\n e.verifier && (t.code_verifier = e.verifier);\n const n = $(t), r = {\n body: n,\n headers: new Headers({\n "Content-Length": n.length.toString(),\n "Content-Type": "application/x-www-form-urlencoded"\n }),\n method: "POST"\n }, i = await this.request("accessToken", void 0, !1, r, e), c = await this.getBody(i);\n if (i.status !== 200) {\n const u = typeof c == "string" ? `Expected 200, received ${i.status}` : this.parseError(c);\n throw new Error(u);\n }\n const a = c;\n if (!a.access_token)\n throw new Error("Access token not found in response");\n let d;\n return a.expires_in && (d = Date.now() + a.expires_in * 1e3), {\n accessToken: a.access_token,\n idToken: a.id_token,\n refreshToken: a.refresh_token,\n tokenExpiry: d\n };\n }\n /**\n * Gets OIDC user information.\n */\n static async getUserInfo(e) {\n const o = await this.request("userInfo", void 0, !0, void 0, e);\n if (o.status !== 200)\n throw new Error(`Failed to get user info; received ${o.status}`);\n return await o.json();\n }\n /**\n * Invokes the OIDC end session endpoint.\n * Can result in a redirect to `/signoff` if using PingOne\n * It\'s best to explicitly provide the logout redirect URL in options\n *\n * @function endSession - call authorization server to end associated session\n * @param options {LogoutOptions} - an extension of ConfigOptions, but with two additional props\n * @param options.logoutRedirectUri {string} - the URL you want the AS to redirect to after signout\n * @param options.redirect {boolean} - to explicitly deactivate redirect, pass `false`\n */\n static async endSession(e) {\n const o = { ...e };\n delete o.redirect, delete o.logoutRedirectUri;\n const s = {}, t = await token_storage_d.get();\n s.id_token_hint = t && t.idToken || (e && "idToken" in e ? e.idToken : "");\n const n = await this.request("endSession", s, !0, void 0, o, {\n redirect: e?.redirect,\n logoutRedirectUri: e?.logoutRedirectUri\n });\n if (!http_o(n))\n throw new Error(`Failed to end session; received ${n.status}`);\n return n;\n }\n /**\n * Immediately revokes the stored access token.\n */\n static async revokeToken(e) {\n const { clientId: o } = config_c.get(e), s = await token_storage_d.get(), t = s && s.accessToken, n = {\n client_id: o\n };\n t && (n.token = t);\n const r = {\n body: $(n),\n credentials: "include",\n headers: new Headers({\n "Content-Type": "application/x-www-form-urlencoded"\n }),\n method: "POST"\n }, i = await this.request("revoke", void 0, !1, r, e);\n if (!http_o(i))\n throw new Error(`Failed to revoke token; received ${i.status}`);\n return i;\n }\n static async request(e, o, s, t, n, r) {\n const { redirectUri: i, middleware: c, serverConfig: a } = config_c.get(n), d = r?.logoutRedirectUri ? r.logoutRedirectUri : i, u = this.getUrl(e, o, n), g = (w) => {\n switch (w) {\n case "accessToken":\n return enums_e.ExchangeToken;\n case "endSession":\n return enums_e.EndSession;\n case "revoke":\n return enums_e.RevokeToken;\n default:\n return enums_e.UserInfo;\n }\n };\n if (t = t || {}, t.headers = t.headers || new Headers(), t.headers.set("Accept", "application/json"), s) {\n const w = await token_storage_d.get(), y = w && w.accessToken;\n t.credentials = "include", t.headers.set("Authorization", `Bearer ${y}`);\n }\n const h = f(\n { url: new URL(u), init: t },\n { type: g(e) }\n )(c);\n return g(e) === enums_e.EndSession && // endSession action only\n r?.redirect === !0 ? (h.url.searchParams.append("post_logout_redirect_uri", d || ""), window.location.assign(h.url.toString()), new Response()) : g(e) === enums_e.EndSession && // endSession action only\n r?.redirect !== !1 && // Only `false` explicitly disables this behavior for rare edge cases\n // If we explicitly get a logout redirect URL, then that\'s enough of a hint to redirect\n // If we don\'t have that, let\'s see if they are calling the typical PingOne `/signoff` endpoint\n (r?.logoutRedirectUri || this.getUrl("endSession").includes("/as/signoff")) ? (h.url.searchParams.append("post_logout_redirect_uri", d || ""), window.location.assign(h.url.toString()), new Response()) : await timeout_T(fetch(h.url.toString(), h.init), a.timeout);\n }\n static containsAuthCode(e) {\n return !!e && /code=([^&]+)/.test(e);\n }\n static containsAuthError(e) {\n return !!e && /error=([^&]+)/.test(e);\n }\n static async getBody(e) {\n const o = e.headers.get("Content-Type");\n return o && o.indexOf("application/json") > -1 ? await e.json() : await e.text();\n }\n static parseError(e) {\n if (e) {\n if (e.error && e.error_description)\n return `${e.error}: ${e.error_description}`;\n if (e.code && e.message)\n return `${e.code}: ${e.message}`;\n }\n }\n static getUrl(e, o, s) {\n const { realmPath: t, serverConfig: n } = config_c.get(s), r = url_h(e, t, n.paths);\n let i = url_f(n.baseUrl, r);\n return o && (i += `?${$(o)}`), i;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/session-manager/index.js\n\n\n\n\n\n\n\nclass M {\n /**\n * Ends the current session.\n */\n static async logout(i) {\n const { middleware: s, platformHeader: a, realmPath: n, serverConfig: r } = config_c.get(i), d = {\n credentials: "include",\n headers: new Headers({\n "Accept-API-Version": "protocol=1.0,resource=2.0",\n "X-Requested-With": constants_E\n }),\n method: "POST"\n }, l = `${url_h("sessions", n, r.paths)}?_action=logout`, m = url_f(r.baseUrl, l), e = f(\n { url: new URL(m), init: d },\n { type: enums_e.Logout }\n )(s);\n a && (e.init.headers instanceof Headers ? e.init.headers.set("X-Requested-Platform", constants_o) : Array.isArray(e.init.headers) ? e.init.headers.push(["X-Requested-Platform", constants_o]) : e.init.headers ? e.init.headers["X-Requested-Platform"] = constants_o : e.init.headers = {\n "X-Requested-Platform": constants_o\n });\n const o = await timeout_T(fetch(e.url.toString(), e.init), r.timeout);\n if (!http_o(o))\n throw new Error(`Failed to log out; received ${o.status}`);\n return o;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/oauth2-client/state-pkce.js\n\nfunction state_pkce_a(e, t) {\n return `${t || "FR-SDK"}-authflow-${e}`;\n}\nfunction state_pkce_c(e) {\n const t = pkce_c.createVerifier(), r = pkce_c.createState(), o = state_pkce_a(e.clientId, e.prefix), s = {\n ...e,\n state: r,\n verifier: t\n };\n return [\n s,\n () => sessionStorage.setItem(o, JSON.stringify(s))\n ];\n}\nfunction state_pkce_u(e, t) {\n const r = state_pkce_a(e, t), o = sessionStorage.getItem(r);\n sessionStorage.removeItem(r);\n try {\n return JSON.parse(o);\n } catch {\n throw new Error("Stored values for Auth URL could not be parsed");\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/token-manager/helpers.js\nfunction helpers_i(e, n) {\n return e && n ? n - e < Date.now() : !1;\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/oauth2-client/enums.js\nvar oauth2_client_enums_r = /* @__PURE__ */ ((o) => (o.Code = "code", o.Token = "token", o))(oauth2_client_enums_r || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/token-manager/index.js\n\n\n\n\n\n\n\n\nclass token_manager_f {\n /**\n * @function getTokens - Retrieves OAuth2 tokens from the server or local storage.\n * @param {Object} options - Options for retrieving tokens.\n * @param {boolean} [options.forceRenew] - If true, forces a new token request even if tokens are already stored.\n * @param {string} [options.login] - Specifies the type of login: \'embedded\' or \'redirect\'.\n * @param {boolean} [options.skipBackgroundRequest] - If true, skips the background request to get tokens without redirect.\n * @param {Object} [options.query] - Query key-value pairs to convert to URL parameters for the /authorize request.\n * @param {string} [options.query.code] - Authorization code from the redirect URL.\n * @param {string} [options.query.state] - State parameter from the redirect URL.\n * @returns {Promise} - Returns a promise that resolves to the retrieved tokens or void.\n * @throws {Error} - Throws an error if the client ID is not provided, if tokens cannot be exchanged, or if there is a state mismatch.\n *\n Example 1:\n \n ```js\n const tokens = forgerock.TokenManager.getTokens({\n forceRenew: true, // If you want to get new tokens, despite existing ones\n login: \'embedded\', // If user authentication is handled in-app\n serverConfig: {\n timeout: 5000,\n },\n });\n ```\n \n Example 2:\n \n ```js\n const tokens = forgerock.TokenManager.getTokens({\n forceRenew: false, // Will immediately return stored tokens, if they exist\n login: \'redirect\', // If user authentication is handled in external Web app\n });\n ```\n \n Example 3:\n \n ```js\n const tokens = forgerock.TokenManager.getTokens({\n query: {\n code: \'lFJQYdoQG1u7nUm8 ... \', // Authorization code from redirect URL\n state: \'MTY2NDkxNTQ2Nde3D ... \', // State from redirect URL\n },\n });\n ```\n \n Example 4:\n \n ```js\n const tokens = forgerock.TokenManager.getTokens({\n skipBackgroundRequest: true, // OPTIONAL; this will skip the iframe request to silently get tokens w/o redirect\n });\n ```\n */\n static async getTokens(r) {\n const { clientId: i, oauthThreshold: h, prefix: u } = config_c.get(r);\n if (!i)\n throw new Error("Client ID is required");\n const s = await token_storage_d.get();\n if (s && !r?.forceRenew && !r?.query?.code && !helpers_i(h, s.tokenExpiry))\n return s;\n if (s)\n try {\n await b.revokeToken(r), await token_manager_f.deleteTokens();\n } catch (e) {\n logger_t.warn("Existing tokens could not be revoked or deleted", e);\n }\n if (r?.query?.code && r?.query?.state) {\n const { state: e, verifier: n } = state_pkce_u(i, u);\n if (e === void 0 || n === void 0)\n throw new Error(\n "`state` and/or `verifier` not found in sessionStorage. Debugging: sessionStorage is not accessible in separate tabs."\n );\n return await this.tokenExchange(r, { state: e, verifier: n });\n }\n const o = Object.assign({}, r);\n delete o.forceRenew;\n const [a, g] = state_pkce_c({\n ...o,\n clientId: i,\n prefix: u,\n responseType: oauth2_client_enums_r.Code\n });\n if (r || (r = {}), r.skipBackgroundRequest !== !0) {\n try {\n const e = new URL(await b.getAuthCodeByIframe(a));\n if (e.searchParams.get("error"))\n throw Error(`${e.searchParams.get("error_description")}`);\n if (!e.searchParams.get("code"))\n throw Error(U.AuthenticationConsentRequired);\n const n = p(e.toString());\n r.query = n;\n } catch (e) {\n if (!(e instanceof Error) || r?.login !== "redirect" || U.AuthenticationIsRequired !== e.message && U.AuthenticationConsentRequired !== e.message && U.AuthorizationTimeout !== e.message && U.FailedToFetch !== e.message && U.NetworkError !== e.message && U.InteractionNotAllowed !== e.message && U.RequestRequiresConsent !== e.message && // Check for Ping Identity Login Required error\n // Long message, so just check substring\n !e.message.includes(U.LoginRequired) && // Safari has a very long error message, so we check for a substring\n !e.message.includes(U.CORSError))\n throw e;\n const n = await b.createAuthorizeUrl(a);\n return g(), location.assign(n);\n }\n return await this.tokenExchange(r, {\n state: a.state,\n verifier: a.verifier\n });\n }\n const m = await b.createAuthorizeUrl(a);\n return g(), location.assign(m);\n }\n static async deleteTokens() {\n await token_storage_d.remove();\n }\n static async tokenExchange(r, i) {\n if (r.query?.state !== i.state)\n throw new Error("State mismatch");\n if (!r.query?.code || Array.isArray(r.query?.code))\n throw new Error("Failed to acquire authorization code");\n const h = r.query?.code, u = i.verifier, s = { ...r, authorizationCode: h, verifier: u }, o = await b.getOAuth2Tokens(s);\n if (!o || !o.accessToken)\n throw new Error("Unable to exchange authorization for tokens");\n try {\n await token_storage_d.set(o);\n } catch (a) {\n logger_t.error("Failed to store tokens", a);\n }\n return o;\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-user/index.js\n\n\n\n\n\n\n\nclass fr_user_O {\n /**\n * Logs the user in with the specified step handler, acquires OAuth tokens, and retrieves\n * user profile. **Currently not implemented.**\n *\n * @typeparam T The type of user object expected\n * @param handler The function to invoke when handling authentication steps\n * @param options Configuration overrides\n */\n static async login(e, r) {\n throw logger_t.info(e, r), new Error("FRUser.login() not implemented");\n }\n /**\n * Ends the user\'s session and revokes OAuth tokens.\n *\n * @param options Configuration overrides\n */\n static async logout(e) {\n const r = { ...e };\n delete r.redirect;\n const { realmPath: n, serverConfig: a } = config_c.get(r);\n if (url_h("sessions", n, a.paths))\n try {\n await M.logout(r);\n } catch {\n logger_t.warn("Session logout was not successful");\n }\n if (e?.redirect === !1)\n try {\n await b.endSession({ ...e });\n } catch {\n logger_t.warn("OAuth endSession was not successful");\n }\n try {\n await b.revokeToken(r);\n } catch {\n logger_t.warn("OAuth revokeToken was not successful");\n }\n const i = await token_storage_d.get(), { idToken: c = "" } = i || {};\n if (await token_manager_f.deleteTokens(), e?.redirect !== !1)\n try {\n await b.endSession({ ...e, idToken: c });\n } catch {\n logger_t.warn("OAuth endSession was not successful");\n }\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-webauthn/enums.js\nvar enums_o = /* @__PURE__ */ ((r) => (r.Error = "ERROR", r.Unsupported = "unsupported", r))(enums_o || {}), enums_E = /* @__PURE__ */ ((r) => (r.AbortError = "AbortError", r.DataError = "DataError", r.ConstraintError = "ConstraintError", r.EncodingError = "EncodingError", r.InvalidError = "InvalidError", r.NetworkError = "NetworkError", r.NotAllowedError = "NotAllowedError", r.NotSupportedError = "NotSupportedError", r.SecurityError = "SecurityError", r.TimeoutError = "TimeoutError", r.UnknownError = "UnknownError", r))(enums_E || {}), enums_i = /* @__PURE__ */ ((r) => (r[r.None = 0] = "None", r[r.Authentication = 1] = "Authentication", r[r.Registration = 2] = "Registration", r))(enums_i || {});\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-webauthn/helpers.js\n\nfunction helpers_s(r) {\n return r || [];\n}\nfunction helpers_u(r) {\n const n = new Uint8Array(r);\n return new TextDecoder().decode(n);\n}\nfunction helpers_f(r) {\n return r ? r[1] : "";\n}\nfunction helpers_a(r) {\n try {\n return r.split("}").filter((e) => !!e && e !== "]").map((e) => {\n const t = helpers_c(e);\n return {\n id: new Int8Array(t).buffer,\n type: "public-key"\n };\n });\n } catch {\n const e = new Error("Transforming credential object to string failed");\n throw e.name = enums_E.EncodingError, e;\n }\n}\nfunction helpers_c(r) {\n const n = /new Int8Array\\((.+)\\)/.exec(r);\n return n === null || n.length < 2 ? [] : JSON.parse(n[1]);\n}\nfunction helpers_p(r) {\n if (Array.isArray(r))\n return r;\n if (typeof r == "string")\n return r && r[0] === "[" ? JSON.parse(r) : (r = r.replace(/(\\w+):/g, \'"$1":\'), JSON.parse(`[${r}]`));\n}\nfunction helpers_d(r) {\n return r.includes("rpId") ? r.replace(/rpId: "(.+)",/, "$1") : r.replace(/id: "(.+)",/, "$1");\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-webauthn/script-parser.js\n\n\nfunction script_parser_T(t) {\n const s = new TextEncoder(), r = helpers_f(t.match(/attestation"{0,}:\\s{0,}"(\\w+)"/)), c = Number(helpers_f(t.match(/timeout"{0,}:\\s{0,}(\\d+)/))), l = helpers_f(\n t.match(/userVerification"{0,}:\\s{0,}"(\\w+)"/)\n ), i = helpers_f(\n t.match(/requireResidentKey"{0,}:\\s{0,}(\\w+)/)\n ), o = helpers_f(\n t.match(/authenticatorAttachment"{0,}:\\s{0,}"([\\w-]+)/)\n ), m = helpers_f(t.match(/rp"{0,}:\\s{0,}{([^}]+)}/)).trim(), a = helpers_f(m.match(/id"{0,}:\\s{0,}"([^"]*)"/)), w = helpers_f(m.match(/name"{0,}:\\s{0,}"([^"]*)"/)), n = helpers_f(t.match(/user"{0,}:\\s{0,}{([^]{0,})},/)).trim(), u = helpers_f(n.match(/id"{0,}:\\s{0,}Uint8Array.from\\("([^"]+)"/)), d = helpers_f(n.match(/name"{0,}:\\s{0,}"([\\d\\w._-]+)"/)), h = helpers_f(n.match(/displayName"{0,}:\\s{0,}"([\\d\\w\\s.@_-]+)"/)), p = helpers_f(\n // Capture the `pubKeyCredParams` without also matching `excludeCredentials` as well.\n // `excludeCredentials` values are very similar to this property, so we need to make sure\n // our last value doesn\'t end with "buffer", so we are only capturing objects that\n // end in a digit and possibly a space.\n t.match(/pubKeyCredParams"*:\\s*\\[([^]+\\d\\s*})\\s*]/)\n ).trim(), A = helpers_p(p);\n if (!A) {\n const b = new Error("Missing pubKeyCredParams property from registration options");\n throw b.name = enums_E.DataError, b;\n }\n const g = helpers_f(\n t.match(/excludeCredentials"{0,}:\\s{0,}\\[([^]+)\\s{0,}]/)\n ).trim(), f = helpers_a(g), C = helpers_s(\n t.match(/challenge"{0,}:\\s{0,}new\\s{0,}(Uint|Int)8Array\\(([^\\)]+)/)\n ), N = JSON.parse(C[2]), I = new Int8Array(N).buffer;\n return {\n attestation: r,\n authenticatorSelection: {\n userVerification: l,\n // Only include authenticatorAttachment prop if the value is truthy\n ...o && { authenticatorAttachment: o },\n // Only include requireResidentKey prop if the value is of string "true"\n ...i === "true" && {\n requireResidentKey: !!i\n }\n },\n challenge: I,\n ...f.length && { excludeCredentials: f },\n pubKeyCredParams: A,\n rp: {\n name: w,\n // only add key-value pair if truthy value is provided\n ...a && { id: a }\n },\n timeout: c,\n user: {\n displayName: h,\n id: s.encode(u),\n name: d\n }\n };\n}\nfunction script_parser_E(t) {\n let s, r;\n t.includes("acceptableCredentials") ? r = helpers_f(\n t.match(/acceptableCredentials"*\\s*=\\s*\\[([^]+)\\s*]/)\n ).trim() : r = helpers_f(\n t.match(/allowCredentials"{0,}:\\s{0,}\\[([^]+)\\s{0,}]/)\n ).trim();\n const c = helpers_f(\n t.match(/userVerification"{0,}:\\s{0,}"(\\w+)"/)\n );\n r && (s = (r.split("},") || [r]).map((n) => {\n const u = helpers_f(n.match(/type"{0,}:\\s{0,}"([\\w-]+)"/)), d = helpers_s(n.match(/id"{0,}:\\s{0,}new\\s{0,}(Uint|Int)8Array\\(([^\\)]+)/)), h = JSON.parse(d[2]), p = new Int8Array(h).buffer;\n return {\n type: u,\n id: p\n };\n }));\n const l = Number(helpers_f(t.match(/timeout"{0,}:\\s{0,}(\\d+)/))), i = helpers_s(\n t.match(/challenge"{0,}:\\s{0,}new\\s{0,}(Uint|Int)8Array\\(([^\\)]+)/)\n ), o = JSON.parse(i[2]), m = new Int8Array(o).buffer, a = helpers_f(t.match(/rpId"{0,}:\\s{0,}\\\\{0,}"([^"\\\\]*)/));\n return {\n challenge: m,\n timeout: l,\n // only add key-value pairs if the truthy values are provided\n ...s && { allowCredentials: s },\n ...c && { userVerification: c },\n ...a && { rpId: a }\n };\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/fr-webauthn/index.js\n\n\n\n\nclass V {\n /**\n * Determines if the given step is a WebAuthn step.\n *\n * @param step The step to evaluate\n * @return A WebAuthnStepType value\n */\n static getWebAuthnStepType(e) {\n const a = this.getOutcomeCallback(e), t = this.getMetadataCallback(e), i = this.getTextOutputCallback(e);\n return a && t ? t.getOutputValue("data")?.pubKeyCredParams ? enums_i.Registration : enums_i.Authentication : a && i ? i.getMessage().includes("pubKeyCredParams") ? enums_i.Registration : enums_i.Authentication : enums_i.None;\n }\n /**\n * Populates the step with the necessary authentication outcome.\n *\n * @param step The step that contains WebAuthn authentication data\n * @return The populated step\n */\n static async authenticate(e) {\n const { hiddenCallback: a, metadataCallback: t, textOutputCallback: i } = this.getCallbacks(e);\n if (a && (t || i)) {\n let o, n = null;\n try {\n let r;\n if (t) {\n const s = t.getOutputValue("data");\n r = this.createAuthenticationPublicKey(s), n = await this.getAuthenticationCredential(\n r\n ), o = this.getAuthenticationOutcome(n);\n } else if (i)\n r = script_parser_E(i.getMessage()), n = await this.getAuthenticationCredential(\n r\n ), o = this.getAuthenticationOutcome(n);\n else\n throw new Error("No Credential found from Public Key");\n } catch (r) {\n throw r instanceof Error ? r.name === enums_E.NotSupportedError ? (a.setInputValue(enums_o.Unsupported), r) : (a.setInputValue(`${enums_o.Error}::${r.name}:${r.message}`), r) : r;\n }\n return t && t.getOutputValue("data")?.supportsJsonResponse && n && "authenticatorAttachment" in n ? (a.setInputValue(\n JSON.stringify({\n authenticatorAttachment: n.authenticatorAttachment,\n legacyData: o\n })\n ), e) : (a.setInputValue(o), e);\n } else {\n const o = new Error("Incorrect callbacks for WebAuthn authentication");\n throw o.name = enums_E.DataError, a?.setInputValue(`${enums_o.Error}::${o.name}:${o.message}`), o;\n }\n }\n /**\n * Populates the step with the necessary registration outcome.\n *\n * @param step The step that contains WebAuthn registration data\n * @return The populated step\n */\n // Can make this generic const in Typescript 5.0 > and the name itself will\n // be inferred from the type so `typeof deviceName` will not just return string\n // but the actual name of the deviceName passed in as a generic.\n static async register(e, a) {\n const { hiddenCallback: t, metadataCallback: i, textOutputCallback: o } = this.getCallbacks(e);\n if (t && (i || o)) {\n let n, r = null;\n try {\n let s;\n if (i) {\n const l = i.getOutputValue("data");\n s = this.createRegistrationPublicKey(l), r = await this.getRegistrationCredential(\n s\n ), n = this.getRegistrationOutcome(r);\n } else if (o)\n s = script_parser_T(o.getMessage()), r = await this.getRegistrationCredential(\n s\n ), n = this.getRegistrationOutcome(r);\n else\n throw new Error("No Credential found from Public Key");\n } catch (s) {\n throw s instanceof Error ? s.name === enums_E.NotSupportedError ? (t.setInputValue(enums_o.Unsupported), s) : (t.setInputValue(`${enums_o.Error}::${s.name}:${s.message}`), s) : s;\n }\n return i && i.getOutputValue("data")?.supportsJsonResponse && r && "authenticatorAttachment" in r ? (t.setInputValue(\n JSON.stringify({\n authenticatorAttachment: r.authenticatorAttachment,\n legacyData: a && a.length > 0 ? `${n}::${a}` : n\n })\n ), e) : (t.setInputValue(\n a && a.length > 0 ? `${n}::${a}` : n\n ), e);\n } else {\n const n = new Error("Incorrect callbacks for WebAuthn registration");\n throw n.name = enums_E.DataError, t?.setInputValue(`${enums_o.Error}::${n.name}:${n.message}`), n;\n }\n }\n /**\n * Returns an object containing the two WebAuthn callbacks.\n *\n * @param step The step that contains WebAuthn callbacks\n * @return The WebAuthn callbacks\n */\n static getCallbacks(e) {\n const a = this.getOutcomeCallback(e), t = this.getMetadataCallback(e), i = this.getTextOutputCallback(e), o = {\n hiddenCallback: a\n };\n return t ? o.metadataCallback = t : i && (o.textOutputCallback = i), o;\n }\n /**\n * Returns the WebAuthn metadata callback containing data to pass to the browser\n * Web Authentication API.\n *\n * @param step The step that contains WebAuthn callbacks\n * @return The metadata callback\n */\n static getMetadataCallback(e) {\n return e.getCallbacksOfType(enums_l.MetadataCallback).find((a) => {\n const t = a.getOutputByName("data", void 0);\n return t && t.hasOwnProperty("relyingPartyId");\n });\n }\n /**\n * Returns the WebAuthn hidden value callback where the outcome should be populated.\n *\n * @param step The step that contains WebAuthn callbacks\n * @return The hidden value callback\n */\n static getOutcomeCallback(e) {\n return e.getCallbacksOfType(enums_l.HiddenValueCallback).find((a) => a.getOutputByName("id", "") === "webAuthnOutcome");\n }\n /**\n * Returns the WebAuthn metadata callback containing data to pass to the browser\n * Web Authentication API.\n *\n * @param step The step that contains WebAuthn callbacks\n * @return The metadata callback\n */\n static getTextOutputCallback(e) {\n return e.getCallbacksOfType(enums_l.TextOutputCallback).find((a) => {\n const t = a.getOutputByName("message", void 0);\n return t && t.includes("webAuthnOutcome");\n });\n }\n /**\n * Retrieves the credential from the browser Web Authentication API.\n *\n * @param options The public key options associated with the request\n * @return The credential\n */\n static async getAuthenticationCredential(e) {\n if (!window.PublicKeyCredential) {\n const t = new Error("PublicKeyCredential not supported by this browser");\n throw t.name = enums_E.NotSupportedError, t;\n }\n return await navigator.credentials.get({ publicKey: e });\n }\n /**\n * Converts an authentication credential into the outcome expected by OpenAM.\n *\n * @param credential The credential to convert\n * @return The outcome string\n */\n static getAuthenticationOutcome(e) {\n if (e === null) {\n const a = new Error("No credential generated from authentication");\n throw a.name = enums_E.UnknownError, a;\n }\n try {\n const a = helpers_u(e.response.clientDataJSON), t = e.response, i = new Int8Array(\n t.authenticatorData\n ).toString(), o = new Int8Array(t.signature).toString(), n = helpers_u(e.response.userHandle);\n let r = `${a}::${i}::${o}::${e.id}`;\n return n && (r = `${r}::${n}`), r;\n } catch {\n const t = new Error("Transforming credential object to string failed");\n throw t.name = enums_E.EncodingError, t;\n }\n }\n /**\n * Retrieves the credential from the browser Web Authentication API.\n *\n * @param options The public key options associated with the request\n * @return The credential\n */\n static async getRegistrationCredential(e) {\n if (!window.PublicKeyCredential) {\n const t = new Error("PublicKeyCredential not supported by this browser");\n throw t.name = enums_E.NotSupportedError, t;\n }\n return await navigator.credentials.create({\n publicKey: e\n });\n }\n /**\n * Converts a registration credential into the outcome expected by OpenAM.\n *\n * @param credential The credential to convert\n * @return The outcome string\n */\n static getRegistrationOutcome(e) {\n if (e === null) {\n const a = new Error("No credential generated from registration");\n throw a.name = enums_E.UnknownError, a;\n }\n try {\n const a = helpers_u(e.response.clientDataJSON), t = e.response, i = new Int8Array(\n t.attestationObject\n ).toString();\n return `${a}::${i}::${e.id}`;\n } catch {\n const t = new Error("Transforming credential object to string failed");\n throw t.name = enums_E.EncodingError, t;\n }\n }\n /**\n * Converts authentication tree metadata into options required by the browser\n * Web Authentication API.\n *\n * @param metadata The metadata provided in the authentication tree MetadataCallback\n * @return The Web Authentication API request options\n */\n static createAuthenticationPublicKey(e) {\n const {\n acceptableCredentials: a,\n allowCredentials: t,\n challenge: i,\n relyingPartyId: o,\n timeout: n,\n userVerification: r\n } = e, s = helpers_d(o), l = helpers_a(t || a || "");\n return {\n challenge: Uint8Array.from(atob(i), (d) => d.charCodeAt(0)).buffer,\n timeout: n,\n // only add key-value pair if proper value is provided\n ...l && { allowCredentials: l },\n ...r && { userVerification: r },\n ...s && { rpId: s }\n };\n }\n /**\n * Converts authentication tree metadata into options required by the browser\n * Web Authentication API.\n *\n * @param metadata The metadata provided in the authentication tree MetadataCallback\n * @return The Web Authentication API request options\n */\n static createRegistrationPublicKey(e) {\n const { pubKeyCredParams: a } = e, t = helpers_p(a);\n if (!t) {\n const u = new Error("Missing pubKeyCredParams property from registration options");\n throw u.name = enums_E.DataError, u;\n }\n const i = helpers_a(e.excludeCredentials), {\n attestationPreference: o,\n authenticatorSelection: n,\n challenge: r,\n relyingPartyId: s,\n relyingPartyName: l,\n timeout: d,\n userId: O,\n userName: b,\n displayName: y\n } = e, f = helpers_d(s), A = {\n name: l,\n ...f && { id: f }\n };\n return {\n attestation: o,\n authenticatorSelection: JSON.parse(n),\n challenge: Uint8Array.from(atob(r), (u) => u.charCodeAt(0)).buffer,\n ...i.length && { excludeCredentials: i },\n pubKeyCredParams: t,\n rp: A,\n timeout: d,\n user: {\n displayName: y || b,\n id: Int8Array.from(O.split("").map((u) => u.charCodeAt(0))),\n name: y || b\n }\n };\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/http-client/helpers.js\n\n\nfunction P(e, t, n) {\n const i = new Headers(e.headers);\n return t.AuthenticateToServiceConditionAdvice ? i.set("X-Tree", t.AuthenticateToServiceConditionAdvice[0]) : t.TransactionConditionAdvice && i.set("X-TxID", t.TransactionConditionAdvice[0]), n && n.idToken && i.set("X-IdToken", n.idToken), i;\n}\nfunction W(e, t, n) {\n const i = new URL(e);\n if (t.TransactionConditionAdvice) {\n const c = t.TransactionConditionAdvice[0];\n i.searchParams.append("_txid", c);\n }\n return n && n.idToken && i.searchParams.append("_idtoken", n.idToken), i.toString();\n}\nfunction helpers_b(e, t, n, i, c) {\n const r = e.advices && e.advices.AuthenticateToServiceConditionAdvice, a = e.advices && e.advices.TransactionConditionAdvice;\n let d = "", s = "";\n r ? (d = r.reduce((o, u) => {\n const l = o && ` ${o}`;\n return o = `${u}${l}`, o;\n }, ""), s = "AuthenticateToServiceConditionAdvice") : a && (d = a.reduce((o, u) => {\n const l = o && ` ${o}`;\n return o = `${u}${l}`, o;\n }, ""), s = "TransactionConditionAdvice");\n const v = "", h = ``, T = `${d}`, f = `${v}${h}${T}`, p = url_h("authenticate", i, c), m = {\n authIndexType: "composite_advice",\n authIndexValue: f\n };\n return {\n init: {\n method: "POST",\n credentials: "include",\n headers: new Headers({\n "Accept-API-Version": "resource=2.0, protocol=1.0"\n })\n },\n timeout: n,\n url: url_f(t, `${p}?${$(m)}`)\n };\n}\nfunction H(e) {\n return (e.headers.get("Content-Type") || "").includes("html") && e.url.includes("composite_advice");\n}\nfunction L(e) {\n return (e.get("WWW-Authenticate") || "").includes("advices");\n}\nasync function helpers_w(e) {\n return !!(await e.clone().json()).advices;\n}\nfunction A(e) {\n const n = new URL(e).searchParams.get("authIndexValue") || "", i = new DOMParser(), c = decodeURIComponent(n), a = i.parseFromString(c, "application/xml").querySelector("Value");\n return a ? a.innerHTML : "";\n}\nfunction helpers_V(e) {\n const n = (e.split(",") || []).find((c) => c.includes("advices")) || "";\n let i;\n try {\n const c = n.match(/"(\\S+)"/), r = c ? c[1] : "", a = atob(r);\n return i = JSON.parse(a), i;\n } catch {\n logger_t.error("Could not parse advices value from WWW-Authenticate header");\n }\n return {};\n}\nfunction z(e) {\n return e.advices && e.advices.AuthenticateToServiceConditionAdvice ? Array.isArray(e.advices.AuthenticateToServiceConditionAdvice) && e.advices.AuthenticateToServiceConditionAdvice.length > 0 : e.advices && e.advices.TransactionConditionAdvice ? Array.isArray(e.advices.TransactionConditionAdvice) && e.advices.TransactionConditionAdvice.length > 0 : !1;\n}\nasync function F(e) {\n return !!(await e.clone().json()).callbacks;\n}\nfunction helpers_O(e, t) {\n return typeof t == "function" ? t(e) : e.status === 401;\n}\nfunction helpers_U(e) {\n const t = {};\n return e.url.includes("AuthenticateToServiceConditionAdvice") ? t.AuthenticateToServiceConditionAdvice = [A(e.url)] : t.TransactionConditionAdvice = [A(e.url)], {\n resource: "",\n actions: {},\n attributes: {},\n advices: t,\n ttl: 0\n };\n}\nfunction helpers_J(e) {\n const t = e.headers.get("WWW-Authenticate") || "", n = helpers_V(t);\n return {\n resource: "",\n actions: {},\n attributes: {},\n advices: n,\n ttl: 0\n };\n}\nasync function N(e) {\n return await e.json();\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/http-client/index.js\n\n\n\n\n\n\n\n\n\n\nclass D {\n /**\n * Makes a request using the specified options.\n *\n * @param options The options to use when making the request\n */\n static async request(e) {\n let r = await this._request(e, !1), t, a = !1;\n if (helpers_O(r, e.requiresNewToken) && (r = await this._request(e, !0)), e.authorization && e.authorization.handleStep)\n if (r.status === 401 && L(r.headers) ? (a = !0, t = helpers_J(r)) : r.redirected && H(r) ? (a = !0, t = helpers_U(r)) : await helpers_w(r) && (t = await N(r)), t && t.advices) {\n const { middleware: n, realmPath: i, serverConfig: o } = config_c.get(e.authorization.config), s = helpers_b(\n t,\n o.baseUrl,\n e.timeout,\n i,\n o.paths\n ), c = new URL(s.url), u = c.searchParams.get("authIndexType"), m = c.searchParams.get("authIndexValue"), w = f(\n {\n url: new URL(s.url),\n init: s.init\n },\n {\n type: enums_e.StartAuthenticate,\n payload: { type: u, tree: m }\n }\n ), { url: p, init: A } = w(n);\n s.url = p.toString(), s.init = A;\n const h = await this._request(s, !1);\n if (!await F(h))\n throw new Error(\'Error: Initial response from auth server not a "step".\');\n if (!z(t))\n throw new Error("Error: Transactional or Service Advice is empty.");\n await this.stepIterator(h, e.authorization.handleStep);\n const l = await token_storage_d.get();\n a ? e.url = W(e.url, t.advices, l) : e.init.headers = P(\n e.init,\n t.advices,\n l\n ), r = await this._request(e, !1);\n } else\n throw new Error("Error: Unable to process advice");\n return r;\n }\n static async setAuthHeaders(e, r) {\n let t = await token_storage_d.get();\n return t && t.accessToken && (t = await token_manager_f.getTokens({ forceRenew: r }), t && t.accessToken && e.set("Authorization", `Bearer ${t.accessToken}`)), e;\n }\n static async stepIterator(e, r) {\n const t = await e.json(), a = new fr_step_i(t);\n return new Promise(async (n, i) => {\n async function o(s) {\n const c = await r(s), u = await fr_auth_f.next(c, { tree: "", type: "" });\n u.type === enums_r.LoginSuccess ? n() : u.type === enums_r.LoginFailure ? i("Authentication tree failure.") : o(u);\n }\n o(a);\n });\n }\n static async _request(e, r) {\n const { url: t, init: a, timeout: n } = e;\n let i = new Headers(a.headers || {});\n return e.authorization && i.set("x-authenticate-response", "header"), e.bypassAuthentication || (i = await this.setAuthHeaders(i, r)), a.headers = i, timeout_T(fetch(t, a), n);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/user-manager/index.js\n\nclass user_manager_a {\n /**\n * Gets the current user\'s profile.\n */\n static getCurrentUser(e) {\n return b.getUserInfo(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/deferred.js\nclass deferred_t {\n constructor() {\n this.promise = new Promise((e, s) => {\n this.reject = s, this.resolve = e;\n });\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/util/storage.js\nclass storage_r {\n constructor(e = !1) {\n this.storage = e ? localStorage : sessionStorage;\n }\n get(e) {\n const t = this.storage.getItem(e);\n if (t)\n return JSON.parse(t);\n }\n set(e, t) {\n this.storage.setItem(e, JSON.stringify(t));\n }\n remove(e) {\n this.storage.removeItem(e);\n }\n}\n\n\n;// ./node_modules/@forgerock/javascript-sdk/dist/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2MjQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBS0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ1RBO0FBR0E7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDaEVBO0FBSUE7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7OztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQzFEQTtBQUlBOzs7QUNKQTtBQUdBOzs7QUNIQTtBQUNBO0FBQ0E7QUFHQTs7O0FDTEE7QUFDQTtBQUNBO0FBR0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7OztBQ3ZEQTtBQUdBOzs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBV0E7QUFDQTs7QUM1WUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBK0JBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcUJBO0FBQ0E7O0FDOXNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFHQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBb0RBO0FBQ0E7O0FDN3VFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVUE7QUFDQTs7QUN0dUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWdCQTtBQUNBOztBQ3AwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUN6UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVVBOzs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ3pEQTtBQUNBO0FBQ0E7QUFHQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOzs7QUMxTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7OztBQzNCQTtBQUNBO0FBQ0E7QUFHQTs7O0FDTEE7QUFHQTs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7OztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDeERBO0FBS0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFTQTs7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOzs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTs7O0FDNVJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWVBOzs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2NvbmZpZy9jb25zdGFudHMuanM/NTZlNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvdXRpbC9taWRkbGV3YXJlLmpzPzgxNmMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3V0aWwvdGltZW91dC5qcz8zYzZiIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9jb25maWcvZW51bXMuanM/YzlkMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvY29uZmlnL2hlbHBlcnMuanM/NDhmMyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvY29uZmlnL2luZGV4LmpzPzYwNGMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3NoYXJlZC9jb25zdGFudHMuanM/NjhiNCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvdXRpbC9yZWFsbS5qcz9hN2ZmIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC91dGlsL3VybC5qcz8yNWI2Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9hdXRoL2luZGV4LmpzP2U2OTYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2F1dGgvZW51bXMuanM/Njk1ZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItcG9saWN5L2VudW1zLmpzP2U0ODkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3V0aWwvc3RyaW5ncy5qcz9hMWUxIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1wb2xpY3kvaGVscGVycy5qcz8wMjllIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1wb2xpY3kvbWVzc2FnZS1jcmVhdG9yLmpzPzEzNmYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLXBvbGljeS9pbmRleC5qcz8xZWVlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2VudW1zLmpzP2VjYWMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvZnItbG9naW4tZmFpbHVyZS5qcz83NmFhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2ZyLWxvZ2luLXN1Y2Nlc3MuanM/M2FkOCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvaW5kZXguanM/NTdlYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvYXR0cmlidXRlLWlucHV0LWNhbGxiYWNrLmpzPzM0MGQiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL2Nob2ljZS1jYWxsYmFjay5qcz82YzhhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy9jb25maXJtYXRpb24tY2FsbGJhY2suanM/NTFiYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvZGV2aWNlLXByb2ZpbGUtY2FsbGJhY2suanM/OTYxYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvaGlkZGVuLXZhbHVlLWNhbGxiYWNrLmpzP2E4YmMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL2tiYS1jcmVhdGUtY2FsbGJhY2suanM/MTJjYiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvbWV0YWRhdGEtY2FsbGJhY2suanM/MDBiMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvbmFtZS1jYWxsYmFjay5qcz9lZGZhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy9wYXNzd29yZC1jYWxsYmFjay5qcz85ZjMwIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy9waW5nLXByb3RlY3QtZXZhbHVhdGlvbi1jYWxsYmFjay5qcz9lNTVlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy9waW5nLXByb3RlY3QtaW5pdGlhbGl6ZS1jYWxsYmFjay5qcz80ZjJhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy9wb2xsaW5nLXdhaXQtY2FsbGJhY2suanM/NWE0OCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvcmVjYXB0Y2hhLWNhbGxiYWNrLmpzP2NjYWEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL3JlY2FwdGNoYS1lbnRlcnByaXNlLWNhbGxiYWNrLmpzPzllYzkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL3JlZGlyZWN0LWNhbGxiYWNrLmpzP2ZlYmUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL3NlbGVjdC1pZHAtY2FsbGJhY2suanM/MmNiYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvdGV4dC1vdXRwdXQtY2FsbGJhY2suanM/NzgzMyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3Mvc3VzcGVuZGVkLXRleHQtb3V0cHV0LWNhbGxiYWNrLmpzP2QwM2UiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL3Rlcm1zLWFuZC1jb25kaXRpb25zLWNhbGxiYWNrLmpzP2I1NjIiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL3RleHQtaW5wdXQtY2FsbGJhY2suanM/ZGY5MyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9jYWxsYmFja3MvdmFsaWRhdGVkLWNyZWF0ZS1wYXNzd29yZC1jYWxsYmFjay5qcz82MjM0Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1hdXRoL2NhbGxiYWNrcy92YWxpZGF0ZWQtY3JlYXRlLXVzZXJuYW1lLWNhbGxiYWNrLmpzPzcyMjEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvY2FsbGJhY2tzL2ZhY3RvcnkuanM/ZjIwZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItYXV0aC9mci1zdGVwLmpzPzA5NmUiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLWF1dGgvaW5kZXguanM/NWMwYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL25vZGVfbW9kdWxlcy9yZWR1eC9kaXN0L3JlZHV4Lm1qcz9jYmYzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2Rpc3QvcmVkdXgtdGh1bmsubWpzPzM0NDciLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5tanM/NDc3MSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzPzRiNjkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVzZWxlY3QvZGlzdC9yZXNlbGVjdC5tanM/Mjc1OSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9Ac3RhbmRhcmQtc2NoZW1hL3V0aWxzL2Rpc3QvaW5kZXguanM/NDBlYyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcXVlcnkvcnRrLXF1ZXJ5Lm1vZGVybi5tanM/ODQ1MyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZGV2aWNlLWNsaWVudC9zZXJ2aWNlcy9pbmRleC5qcz9lODhiIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9kZXZpY2UtY2xpZW50L2RldmljZS5zdG9yZS5qcz84ZjMzIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1kZXZpY2UvZGVmYXVsdHMuanM/YTA1OCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItZGV2aWNlL2NvbGxlY3Rvci5qcz83ZTNhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC91dGlsL2xvZ2dlci5qcz9lN2M5Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1kZXZpY2UvaW5kZXguanM/Y2VhYSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItcXItY29kZS9pbmRleC5qcz9iMWVhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci1yZWNvdmVyeS1jb2Rlcy9zY3JpcHQtcGFyc2VyLmpzPzkyODgiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLXJlY292ZXJ5LWNvZGVzL2luZGV4LmpzPzk0N2QiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3Rva2VuLXN0b3JhZ2UvbG9jYWwtc3RvcmFnZS5qcz85ZmIxIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC90b2tlbi1zdG9yYWdlL3Nlc3Npb24tc3RvcmFnZS5qcz85YjczIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC90b2tlbi1zdG9yYWdlL2luZGV4LmpzP2UzYjEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3V0aWwvaHR0cC5qcz81OTEyIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC91dGlsL3BrY2UuanM/MDEyMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3Qvb2F1dGgyLWNsaWVudC9pbmRleC5qcz9iMjZlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9zZXNzaW9uLW1hbmFnZXIvaW5kZXguanM/YTM2OSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3Qvb2F1dGgyLWNsaWVudC9zdGF0ZS1wa2NlLmpzPzQ1OGQiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3Rva2VuLW1hbmFnZXIvaGVscGVycy5qcz82YjE3Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9vYXV0aDItY2xpZW50L2VudW1zLmpzP2JjYmEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L3Rva2VuLW1hbmFnZXIvaW5kZXguanM/ZDg2YiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItdXNlci9pbmRleC5qcz9kNzM5Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci13ZWJhdXRobi9lbnVtcy5qcz8yMzFlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9mci13ZWJhdXRobi9oZWxwZXJzLmpzPzY3MjAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGZvcmdlcm9jay9qYXZhc2NyaXB0LXNkay9kaXN0L2ZyLXdlYmF1dGhuL3NjcmlwdC1wYXJzZXIuanM/M2I5MyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvZnItd2ViYXV0aG4vaW5kZXguanM/NGU1ZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvaHR0cC1jbGllbnQvaGVscGVycy5qcz8wNWRkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC9odHRwLWNsaWVudC9pbmRleC5qcz9jOWVmIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC91c2VyLW1hbmFnZXIvaW5kZXguanM/YmIyZiIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvdXRpbC9kZWZlcnJlZC5qcz8zODcwIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0Bmb3JnZXJvY2svamF2YXNjcmlwdC1zZGsvZGlzdC91dGlsL3N0b3JhZ2UuanM/YzM5NCIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrL2Rpc3QvaW5kZXguanM/MzkyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBUID0gNWUzLCBFID0gM2U0LCBvID0gXCJGUi1TREtcIjtcbmV4cG9ydCB7XG4gIEUgYXMgREVGQVVMVF9PQVVUSF9USFJFU0hPTEQsXG4gIFQgYXMgREVGQVVMVF9USU1FT1VULFxuICBvIGFzIFBSRUZJWFxufTtcbiIsImZ1bmN0aW9uIGYodCwgeyB0eXBlOiBhLCBwYXlsb2FkOiBvIH0pIHtcbiAgY29uc3QgaSA9IE9iamVjdC5mcmVlemUoeyB0eXBlOiBhLCBwYXlsb2FkOiBvIH0pO1xuICByZXR1cm4gKGUpID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpXG4gICAgICByZXR1cm4gdDtcbiAgICBjb25zdCBjID0gZS5tYXAoKHIpID0+IHIpO1xuICAgIGZ1bmN0aW9uIG4oKSB7XG4gICAgICBjb25zdCByID0gYy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHIgJiYgcih0LCBpLCBuKSwgdDtcbiAgICB9XG4gICAgcmV0dXJuIG4oKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGYgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB7IERFRkFVTFRfVElNRU9VVCBhcyBlIH0gZnJvbSBcIi4uL2NvbmZpZy9jb25zdGFudHMuanNcIjtcbmZ1bmN0aW9uIFQodCwgbyA9IGUpIHtcbiAgY29uc3QgaSA9IG8gfHwgZSwgciA9IG5ldyBQcm9taXNlKFxuICAgIChuLCBtKSA9PiBzZXRUaW1lb3V0KCgpID0+IG0obmV3IEVycm9yKFwiVGltZW91dFwiKSksIGkpXG4gICk7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3QsIHJdKTtcbn1cbmV4cG9ydCB7XG4gIFQgYXMgd2l0aFRpbWVvdXRcbn07XG4iLCJ2YXIgZSA9IC8qIEBfX1BVUkVfXyAqLyAoKEUpID0+IChFLkF1dGhlbnRpY2F0ZSA9IFwiQVVUSEVOVElDQVRFXCIsIEUuQXV0aG9yaXplID0gXCJBVVRIT1JJWkVcIiwgRS5FbmRTZXNzaW9uID0gXCJFTkRfU0VTU0lPTlwiLCBFLkxvZ291dCA9IFwiTE9HT1VUXCIsIEUuRXhjaGFuZ2VUb2tlbiA9IFwiRVhDSEFOR0VfVE9LRU5cIiwgRS5SZWZyZXNoVG9rZW4gPSBcIlJFRlJFU0hfVE9LRU5cIiwgRS5SZXN1bWVBdXRoZW50aWNhdGUgPSBcIlJFU1VNRV9BVVRIRU5USUNBVEVcIiwgRS5SZXZva2VUb2tlbiA9IFwiUkVWT0tFX1RPS0VOXCIsIEUuU3RhcnRBdXRoZW50aWNhdGUgPSBcIlNUQVJUX0FVVEhFTlRJQ0FURVwiLCBFLlVzZXJJbmZvID0gXCJVU0VSX0lORk9cIiwgRS5XZWxsS25vd24gPSBcIldFTExfS05PV05cIiwgRSkpKGUgfHwge30pO1xuZXhwb3J0IHtcbiAgZSBhcyBBY3Rpb25UeXBlc1xufTtcbiIsImltcG9ydCBsIGZyb20gXCIuLi91dGlsL21pZGRsZXdhcmUuanNcIjtcbmltcG9ydCB7IHdpdGhUaW1lb3V0IGFzIHUgfSBmcm9tIFwiLi4vdXRpbC90aW1lb3V0LmpzXCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlcyBhcyBwIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmZ1bmN0aW9uIGgobiwgcikge1xuICBpZiAoIW4uYXV0aG9yaXphdGlvbl9lbmRwb2ludClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWxsa25vd24gZW5kcG9pbnQgZGlkIG5vdCByZXR1cm4gYGF1dGhvcml6YXRpb25fZW5kcG9pbnRgXCIpO1xuICBjb25zdCB0ID0gbmV3IFVSTChuLmF1dGhvcml6YXRpb25fZW5kcG9pbnQpLm9yaWdpbjtcbiAgbGV0IGUsIGk7XG4gIG4uaXNzdWVyLmluY2x1ZGVzKFwiL2FtL1wiKSA/IChlID0gYCR7bi5pc3N1ZXIucmVwbGFjZShcIm9hdXRoMlwiLCBcImpzb25cIil9L2F1dGhlbnRpY2F0ZWAsIGkgPSBgJHtuLmlzc3Vlci5yZXBsYWNlKFwib2F1dGgyXCIsIFwianNvblwiKX0vc2Vzc2lvbnNgKSA6IG4uaXNzdWVyLmluY2x1ZGVzKFwiL2FzL1wiKTtcbiAgY29uc3QgcyA9IHtcbiAgICAuLi5lID8geyBhdXRoZW50aWNhdGU6IG5ldyBVUkwoZSkucGF0aG5hbWUgfSA6IHt9LFxuICAgIGF1dGhvcml6ZTogbmV3IFVSTChuLmF1dGhvcml6YXRpb25fZW5kcG9pbnQpLnBhdGhuYW1lLFxuICAgIGFjY2Vzc1Rva2VuOiBuZXcgVVJMKG4udG9rZW5fZW5kcG9pbnQpLnBhdGhuYW1lLFxuICAgIGVuZFNlc3Npb246IG5ldyBVUkwobi5waW5nX2VuZF9pZHBfc2Vzc2lvbl9lbmRwb2ludCB8fCBuLmVuZF9zZXNzaW9uX2VuZHBvaW50KS5wYXRobmFtZSxcbiAgICB1c2VySW5mbzogbmV3IFVSTChuLnVzZXJpbmZvX2VuZHBvaW50KS5wYXRobmFtZSxcbiAgICByZXZva2U6IG5ldyBVUkwobi5yZXZvY2F0aW9uX2VuZHBvaW50KS5wYXRobmFtZSxcbiAgICAuLi5pID8geyBzZXNzaW9uczogbmV3IFVSTChpKS5wYXRobmFtZSB9IDoge31cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiB0LFxuICAgIHBhdGhzOiBzXG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBtKG4pIHtcbiAgaWYgKCFuLnNlcnZlckNvbmZpZy53ZWxsa25vd24pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwid2VsbGtub3duIFVSTCBpcyBtaXNzaW5nIGluIG9wdGlvbnNcIik7XG4gIGNvbnN0IG8gPSBsKFxuICAgIHtcbiAgICAgIHVybDogbmV3IFVSTChuLnNlcnZlckNvbmZpZz8ud2VsbGtub3duKSxcbiAgICAgIGluaXQ6IHsgbWV0aG9kOiBcIkdFVFwiIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6IHAuV2VsbEtub3duLFxuICAgICAgcGF5bG9hZDoge31cbiAgICB9XG4gICkobi5taWRkbGV3YXJlKTtcbiAgcmV0dXJuIGF3YWl0IChhd2FpdCB1KGZldGNoKG8udXJsLnRvU3RyaW5nKCksIG8uaW5pdCksIG4uc2VydmVyQ29uZmlnLnRpbWVvdXQpKS5qc29uKCk7XG59XG5leHBvcnQge1xuICBoIGFzIGNvbnZlcnRXZWxsS25vd24sXG4gIG0gYXMgZmV0Y2hXZWxsS25vd25cbn07XG4iLCJpbXBvcnQgeyBERUZBVUxUX1RJTUVPVVQgYXMgbywgREVGQVVMVF9PQVVUSF9USFJFU0hPTEQgYXMgcywgUFJFRklYIGFzIGwgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IGZldGNoV2VsbEtub3duIGFzIGEsIGNvbnZlcnRXZWxsS25vd24gYXMgZiB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmZ1bmN0aW9uIHcobikge1xuICByZXR1cm4ge1xuICAgIC4uLm4sXG4gICAgb2F1dGhUaHJlc2hvbGQ6IG4ub2F1dGhUaHJlc2hvbGQgfHwgcyxcbiAgICBsb2dMZXZlbDogbi5sb2dMZXZlbCB8fCBcIm5vbmVcIixcbiAgICBwbGF0Zm9ybUhlYWRlcjogbi5wbGF0Zm9ybUhlYWRlciB8fCAhMSxcbiAgICBwcmVmaXg6IG4ucHJlZml4IHx8IGxcbiAgfTtcbn1cbmNsYXNzIGMge1xuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byB1c2UgYXMgZGVmYXVsdHNcbiAgICovXG4gIHN0YXRpYyBzZXQoZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBpcyBpbnZhbGlkXCIpO1xuICAgIGUuc2VydmVyQ29uZmlnICYmIHRoaXMudmFsaWRhdGVTZXJ2ZXJDb25maWcoZS5zZXJ2ZXJDb25maWcpLCB0aGlzLm9wdGlvbnMgPSB7IC4uLncoZSkgfTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBc3luYyAtIEFzeW5jaHJvbm91c2x5IGNhbGxzIHRoZSBXZWxsS25vd24gZW5kcG9pbnQgdG8gY29sbGVjdCB0aGUgQVBJcyBmb3IgT0F1dGhcbiAgICogQHBhcmFtIHtBc3luY0NvbmZpZ09wdGlvbnN9IG9wdGlvbnMgLSBjb25maWcgb3B0aW9ucyB3aXRoIHdlbGxrbm93biBlbmRwb2ludCBVUkxcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmV0dXJucyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBtZXNzYWdlIG9iamVjdFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNldEFzeW5jKGUpIHtcbiAgICBpZiAoIWUuc2VydmVyQ29uZmlnLndlbGxrbm93bilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNaXNzaW5nIHdlbGwta25vd24gcHJvcGVydHkuIFVzZSBgQ29uZmlnLnNldGAgbWV0aG9kIGlmIG5vdCB1c2luZyB3ZWxsLWtub3duIGVuZHBvaW50LlwiXG4gICAgICApO1xuICAgIGUuc2VydmVyQ29uZmlnLmJhc2VVcmwgJiYgY29uc29sZS53YXJuKFxuICAgICAgXCJUaGUgYmFzZVVybCBwcm9wZXJ0eSBwYXNzZWQgaW4gd2lsbCBiZSBpZ25vcmVkLCBhbmQgcmVwbGFjZWQgd2l0aCB3ZWxsLWtub3duIG9yaWdpbi5cIlxuICAgICk7XG4gICAgY29uc3QgciA9IGF3YWl0IGEoZSksIGkgPSBmKHIpO1xuICAgIGRlbGV0ZSBlLnNlcnZlckNvbmZpZy53ZWxsa25vd247XG4gICAgY29uc3QgdCA9IGU7XG4gICAgdC5zZXJ2ZXJDb25maWcgPSBpLCB0aGlzLnNldCh0KTtcbiAgfVxuICAvKipcbiAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBvcHRpb25zIHdpdGggdGhlIGRlZmF1bHQgb3B0aW9ucy4gIEVuc3VyZXMgYSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIG1lcmdlIHdpdGggZGVmYXVsdHNcbiAgICovXG4gIHN0YXRpYyBnZXQoZSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zICYmICFlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlndXJhdGlvbiBoYXMgbm90IGJlZW4gc2V0XCIpO1xuICAgIGNvbnN0IHIgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4uZSB9O1xuICAgIGlmICghci5zZXJ2ZXJDb25maWcgfHwgIXIuc2VydmVyQ29uZmlnLmJhc2VVcmwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXJ2ZXIgY29uZmlndXJhdGlvbiBoYXMgbm90IGJlZW4gc2V0XCIpO1xuICAgIHJldHVybiByO1xuICB9XG4gIHN0YXRpYyBpc1ZhbGlkKGUpIHtcbiAgICByZXR1cm4gISEoZSAmJiBlLnNlcnZlckNvbmZpZyk7XG4gIH1cbiAgc3RhdGljIHZhbGlkYXRlU2VydmVyQ29uZmlnKGUpIHtcbiAgICBlLnRpbWVvdXQgfHwgKGUudGltZW91dCA9IG8pO1xuICAgIGNvbnN0IHIgPSBlLmJhc2VVcmw7XG4gICAgciAmJiByLmNoYXJBdChyLmxlbmd0aCAtIDEpICE9PSBcIi9cIiAmJiAoZS5iYXNlVXJsID0gciArIFwiL1wiKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgYyBhcyBkZWZhdWx0XG59O1xuIiwiY29uc3QgRSA9IFwiZm9yZ2Vyb2NrLXNka1wiLCBvID0gXCJqYXZhc2NyaXB0XCI7XG5leHBvcnQge1xuICBFIGFzIFJFUVVFU1RFRF9XSVRILFxuICBvIGFzIFhfUkVRVUVTVEVEX1BMQVRGT1JNXG59O1xuIiwiZnVuY3Rpb24gbihvKSB7XG4gIGNvbnN0IHIgPSAobyB8fCBcIlwiKS5zcGxpdChcIi9cIikubWFwKCh0KSA9PiB0LnRyaW0oKSkuZmlsdGVyKCh0KSA9PiB0ICE9PSBcIlwiKTtcbiAgcmV0dXJuIHJbMF0gIT09IFwicm9vdFwiICYmIHIudW5zaGlmdChcInJvb3RcIiksIHIubWFwKCh0KSA9PiBgcmVhbG1zLyR7dH1gKS5qb2luKFwiL1wiKTtcbn1cbmV4cG9ydCB7XG4gIG4gYXMgZ2V0UmVhbG1VcmxQYXRoXG59O1xuIiwiaW1wb3J0IHsgZ2V0UmVhbG1VcmxQYXRoIGFzIGMgfSBmcm9tIFwiLi9yZWFsbS5qc1wiO1xuZnVuY3Rpb24gcih0KSB7XG4gIGNvbnN0IG8gPSB0LnByb3RvY29sID09PSBcImh0dHA6XCIgJiYgW1wiXCIsIFwiODBcIl0uaW5kZXhPZih0LnBvcnQpID09PSAtMSB8fCB0LnByb3RvY29sID09PSBcImh0dHBzOlwiICYmIFtcIlwiLCBcIjQ0M1wiXS5pbmRleE9mKHQucG9ydCkgPT09IC0xID8gYDoke3QucG9ydH1gIDogXCJcIjtcbiAgcmV0dXJuIGAke3QucHJvdG9jb2x9Ly8ke3QuaG9zdG5hbWV9JHtvfWA7XG59XG5mdW5jdGlvbiBoKHQsIGUsIG8pIHtcbiAgY29uc3QgbiA9IGMoZSksIHMgPSB7XG4gICAgYXV0aGVudGljYXRlOiBganNvbi8ke259L2F1dGhlbnRpY2F0ZWAsXG4gICAgYXV0aG9yaXplOiBgb2F1dGgyLyR7bn0vYXV0aG9yaXplYCxcbiAgICBhY2Nlc3NUb2tlbjogYG9hdXRoMi8ke259L2FjY2Vzc190b2tlbmAsXG4gICAgZW5kU2Vzc2lvbjogYG9hdXRoMi8ke259L2Nvbm5lY3QvZW5kU2Vzc2lvbmAsXG4gICAgdXNlckluZm86IGBvYXV0aDIvJHtufS91c2VyaW5mb2AsXG4gICAgcmV2b2tlOiBgb2F1dGgyLyR7bn0vdG9rZW4vcmV2b2tlYCxcbiAgICBzZXNzaW9uczogYGpzb24vJHtufS9zZXNzaW9ucy9gXG4gIH07XG4gIHJldHVybiBvICYmIG9bdF0gPyBvW3RdIDogc1t0XTtcbn1cbmZ1bmN0aW9uIGYodCwgZSkge1xuICBjb25zdCBvID0gbmV3IFVSTCh0KTtcbiAgaWYgKGUuc3RhcnRzV2l0aChcIi9cIikpXG4gICAgcmV0dXJuIGAke3Iobyl9JHtlfWA7XG4gIGNvbnN0IG4gPSBvLnBhdGhuYW1lLnNwbGl0KFwiL1wiKSwgcyA9IGUuc3BsaXQoXCIvXCIpLmZpbHRlcigoaSkgPT4gISFpKSwgYSA9IFsuLi5uLnNsaWNlKDAsIC0xKSwgLi4uc10uam9pbihcIi9cIik7XG4gIHJldHVybiBgJHtyKG8pfSR7YX1gO1xufVxuZnVuY3Rpb24gcCh0KSB7XG4gIGNvbnN0IGUgPSBuZXcgVVJMKHQpLCBvID0ge307XG4gIHJldHVybiBlLnNlYXJjaFBhcmFtcy5mb3JFYWNoKChuLCBzKSA9PiBvW3NdID0gbiksIG87XG59XG5mdW5jdGlvbiAkKHQpIHtcbiAgY29uc3QgZSA9IFtdO1xuICBmb3IgKGNvbnN0IG8gaW4gdClcbiAgICB0W29dICYmIGUucHVzaChvICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodFtvXSkpO1xuICByZXR1cm4gZS5qb2luKFwiJlwiKTtcbn1cbmV4cG9ydCB7XG4gIHIgYXMgZ2V0QmFzZVVybCxcbiAgaCBhcyBnZXRFbmRwb2ludFBhdGgsXG4gIHAgYXMgcGFyc2VRdWVyeSxcbiAgZiBhcyByZXNvbHZlLFxuICAkIGFzIHN0cmluZ2lmeVxufTtcbiIsImltcG9ydCBtIGZyb20gXCIuLi9jb25maWcvaW5kZXguanNcIjtcbmltcG9ydCB7IEFjdGlvblR5cGVzIGFzIGwgfSBmcm9tIFwiLi4vY29uZmlnL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBYX1JFUVVFU1RFRF9QTEFURk9STSBhcyBjLCBSRVFVRVNURURfV0lUSCBhcyBmIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IHdpdGhUaW1lb3V0IGFzIHkgfSBmcm9tIFwiLi4vdXRpbC90aW1lb3V0LmpzXCI7XG5pbXBvcnQgeyBzdHJpbmdpZnkgYXMgZywgZ2V0RW5kcG9pbnRQYXRoIGFzIFIsIHJlc29sdmUgYXMgcSB9IGZyb20gXCIuLi91dGlsL3VybC5qc1wiO1xuaW1wb3J0IFAgZnJvbSBcIi4uL3V0aWwvbWlkZGxld2FyZS5qc1wiO1xuY2xhc3MgSiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RlcH0gcHJldmlvdXNTdGVwIFRoZSBwcmV2aW91cyBzdGVwLCBpbmNsdWRpbmcgYW55IHJlcXVpcmVkIGlucHV0LlxuICAgKiBAcGFyYW0ge1N0ZXBPcHRpb25zfSBvcHRpb25zIENvbmZpZ3VyYXRpb24gZGVmYXVsdCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm4ge1N0ZXB9IFRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWUuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbmV4dCh0LCBlKSB7XG4gICAgY29uc3QgeyBtaWRkbGV3YXJlOiByLCBwbGF0Zm9ybUhlYWRlcjogbiwgcmVhbG1QYXRoOiB1LCBzZXJ2ZXJDb25maWc6IGksIHRyZWU6IG8sIHR5cGU6IGEgfSA9IG0uZ2V0KGUpLCBkID0gZSA/IGUucXVlcnkgOiB7fSwgcCA9IHRoaXMuY29uc3RydWN0VXJsKGksIHUsIG8sIGQpLCBzID0gUChcbiAgICAgIHtcbiAgICAgICAgdXJsOiBuZXcgVVJMKHApLFxuICAgICAgICBpbml0OiB0aGlzLmNvbmZpZ3VyZVJlcXVlc3QodClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IHQgPyBsLkF1dGhlbnRpY2F0ZSA6IGwuU3RhcnRBdXRoZW50aWNhdGUsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICB0cmVlOiBvLFxuICAgICAgICAgIHR5cGU6IGEgfHwgXCJzZXJ2aWNlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICkocik7XG4gICAgbiAmJiAocy5pbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzID8gcy5pbml0LmhlYWRlcnMuc2V0KFwiWC1SZXF1ZXN0ZWQtUGxhdGZvcm1cIiwgYykgOiBBcnJheS5pc0FycmF5KHMuaW5pdC5oZWFkZXJzKSA/IHMuaW5pdC5oZWFkZXJzLnB1c2goW1wiWC1SZXF1ZXN0ZWQtUGxhdGZvcm1cIiwgY10pIDogcy5pbml0LmhlYWRlcnMgPyBzLmluaXQuaGVhZGVyc1tcIlgtUmVxdWVzdGVkLVBsYXRmb3JtXCJdID0gYyA6IHMuaW5pdC5oZWFkZXJzID0ge1xuICAgICAgXCJYLVJlcXVlc3RlZC1QbGF0Zm9ybVwiOiBjXG4gICAgfSk7XG4gICAgY29uc3QgaCA9IGF3YWl0IHkoZmV0Y2gocy51cmwudG9TdHJpbmcoKSwgcy5pbml0KSwgaS50aW1lb3V0KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSZXNwb25zZUpzb24oaCk7XG4gIH1cbiAgc3RhdGljIGNvbnN0cnVjdFVybCh0LCBlLCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHsgLi4ubiwgLi4uciA/IHsgYXV0aEluZGV4VHlwZTogXCJzZXJ2aWNlXCIsIGF1dGhJbmRleFZhbHVlOiByIH0gOiB2b2lkIDAgfSwgbyA9IE9iamVjdC5rZXlzKGkpLmxlbmd0aCA+IDAgPyBgPyR7ZyhpKX1gIDogXCJcIiwgYSA9IFIoXCJhdXRoZW50aWNhdGVcIiwgZSwgdC5wYXRocyk7XG4gICAgcmV0dXJuIHEodC5iYXNlVXJsLCBgJHthfSR7b31gKTtcbiAgfVxuICBzdGF0aWMgY29uZmlndXJlUmVxdWVzdCh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHQgPyBKU09OLnN0cmluZ2lmeSh0KSA6IHZvaWQgMCxcbiAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJBY2NlcHQtQVBJLVZlcnNpb25cIjogXCJwcm90b2NvbD0xLjAscmVzb3VyY2U9Mi4xXCIsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogZlxuICAgICAgfSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXN5bmMgZ2V0UmVzcG9uc2VKc29uKHQpIHtcbiAgICBjb25zdCBlID0gdC5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSwgbiA9IGUgJiYgZS5pbmRleE9mKFwiYXBwbGljYXRpb24vanNvblwiKSA+IC0xID8gYXdhaXQgdC5qc29uKCkgOiB7fTtcbiAgICByZXR1cm4gbi5zdGF0dXMgPSB0LnN0YXR1cywgbi5vayA9IHQub2ssIG47XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEogYXMgZGVmYXVsdFxufTtcbiIsInZhciB0ID0gLyogQF9fUFVSRV9fICovICgoYSkgPT4gKGEuQmFkUmVxdWVzdCA9IFwiQkFEX1JFUVVFU1RcIiwgYS5UaW1lb3V0ID0gXCJUSU1FT1VUXCIsIGEuVW5hdXRob3JpemVkID0gXCJVTkFVVEhPUklaRURcIiwgYS5Vbmtub3duID0gXCJVTktOT1dOXCIsIGEpKSh0IHx8IHt9KSwgbCA9IC8qIEBfX1BVUkVfXyAqLyAoKGEpID0+IChhLkJvb2xlYW5BdHRyaWJ1dGVJbnB1dENhbGxiYWNrID0gXCJCb29sZWFuQXR0cmlidXRlSW5wdXRDYWxsYmFja1wiLCBhLkNob2ljZUNhbGxiYWNrID0gXCJDaG9pY2VDYWxsYmFja1wiLCBhLkNvbmZpcm1hdGlvbkNhbGxiYWNrID0gXCJDb25maXJtYXRpb25DYWxsYmFja1wiLCBhLkRldmljZVByb2ZpbGVDYWxsYmFjayA9IFwiRGV2aWNlUHJvZmlsZUNhbGxiYWNrXCIsIGEuSGlkZGVuVmFsdWVDYWxsYmFjayA9IFwiSGlkZGVuVmFsdWVDYWxsYmFja1wiLCBhLktiYUNyZWF0ZUNhbGxiYWNrID0gXCJLYmFDcmVhdGVDYWxsYmFja1wiLCBhLk1ldGFkYXRhQ2FsbGJhY2sgPSBcIk1ldGFkYXRhQ2FsbGJhY2tcIiwgYS5OYW1lQ2FsbGJhY2sgPSBcIk5hbWVDYWxsYmFja1wiLCBhLk51bWJlckF0dHJpYnV0ZUlucHV0Q2FsbGJhY2sgPSBcIk51bWJlckF0dHJpYnV0ZUlucHV0Q2FsbGJhY2tcIiwgYS5QYXNzd29yZENhbGxiYWNrID0gXCJQYXNzd29yZENhbGxiYWNrXCIsIGEuUGluZ09uZVByb3RlY3RFdmFsdWF0aW9uQ2FsbGJhY2sgPSBcIlBpbmdPbmVQcm90ZWN0RXZhbHVhdGlvbkNhbGxiYWNrXCIsIGEuUGluZ09uZVByb3RlY3RJbml0aWFsaXplQ2FsbGJhY2sgPSBcIlBpbmdPbmVQcm90ZWN0SW5pdGlhbGl6ZUNhbGxiYWNrXCIsIGEuUG9sbGluZ1dhaXRDYWxsYmFjayA9IFwiUG9sbGluZ1dhaXRDYWxsYmFja1wiLCBhLlJlQ2FwdGNoYUNhbGxiYWNrID0gXCJSZUNhcHRjaGFDYWxsYmFja1wiLCBhLlJlQ2FwdGNoYUVudGVycHJpc2VDYWxsYmFjayA9IFwiUmVDYXB0Y2hhRW50ZXJwcmlzZUNhbGxiYWNrXCIsIGEuUmVkaXJlY3RDYWxsYmFjayA9IFwiUmVkaXJlY3RDYWxsYmFja1wiLCBhLlNlbGVjdElkUENhbGxiYWNrID0gXCJTZWxlY3RJZFBDYWxsYmFja1wiLCBhLlN0cmluZ0F0dHJpYnV0ZUlucHV0Q2FsbGJhY2sgPSBcIlN0cmluZ0F0dHJpYnV0ZUlucHV0Q2FsbGJhY2tcIiwgYS5TdXNwZW5kZWRUZXh0T3V0cHV0Q2FsbGJhY2sgPSBcIlN1c3BlbmRlZFRleHRPdXRwdXRDYWxsYmFja1wiLCBhLlRlcm1zQW5kQ29uZGl0aW9uc0NhbGxiYWNrID0gXCJUZXJtc0FuZENvbmRpdGlvbnNDYWxsYmFja1wiLCBhLlRleHRJbnB1dENhbGxiYWNrID0gXCJUZXh0SW5wdXRDYWxsYmFja1wiLCBhLlRleHRPdXRwdXRDYWxsYmFjayA9IFwiVGV4dE91dHB1dENhbGxiYWNrXCIsIGEuVmFsaWRhdGVkQ3JlYXRlUGFzc3dvcmRDYWxsYmFjayA9IFwiVmFsaWRhdGVkQ3JlYXRlUGFzc3dvcmRDYWxsYmFja1wiLCBhLlZhbGlkYXRlZENyZWF0ZVVzZXJuYW1lQ2FsbGJhY2sgPSBcIlZhbGlkYXRlZENyZWF0ZVVzZXJuYW1lQ2FsbGJhY2tcIiwgYSkpKGwgfHwge30pO1xuZXhwb3J0IHtcbiAgbCBhcyBDYWxsYmFja1R5cGUsXG4gIHQgYXMgRXJyb3JDb2RlXG59O1xuIiwidmFyIF8gPSAvKiBAX19QVVJFX18gKi8gKChBKSA9PiAoQS5DYW5ub3RDb250YWluQ2hhcmFjdGVycyA9IFwiQ0FOTk9UX0NPTlRBSU5fQ0hBUkFDVEVSU1wiLCBBLkNhbm5vdENvbnRhaW5EdXBsaWNhdGVzID0gXCJDQU5OT1RfQ09OVEFJTl9EVVBMSUNBVEVTXCIsIEEuQ2Fubm90Q29udGFpbk90aGVycyA9IFwiQ0FOTk9UX0NPTlRBSU5fT1RIRVJTXCIsIEEuTGVhc3RDYXBpdGFsTGV0dGVycyA9IFwiQVRfTEVBU1RfWF9DQVBJVEFMX0xFVFRFUlNcIiwgQS5MZWFzdE51bWJlcnMgPSBcIkFUX0xFQVNUX1hfTlVNQkVSU1wiLCBBLk1hdGNoUmVnZXhwID0gXCJNQVRDSF9SRUdFWFBcIiwgQS5NYXhpbXVtTGVuZ3RoID0gXCJNQVhfTEVOR1RIXCIsIEEuTWF4aW11bU51bWJlciA9IFwiTUFYSU1VTV9OVU1CRVJfVkFMVUVcIiwgQS5NaW5pbXVtTGVuZ3RoID0gXCJNSU5fTEVOR1RIXCIsIEEuTWluaW11bU51bWJlciA9IFwiTUlOSU1VTV9OVU1CRVJfVkFMVUVcIiwgQS5SZXF1aXJlZCA9IFwiUkVRVUlSRURcIiwgQS5VbmlxdWUgPSBcIlVOSVFVRVwiLCBBLlVua25vd25Qb2xpY3kgPSBcIlVOS05PV05fUE9MSUNZXCIsIEEuVmFsaWRBcnJheUl0ZW1zID0gXCJWQUxJRF9BUlJBWV9JVEVNU1wiLCBBLlZhbGlkRGF0ZSA9IFwiVkFMSURfREFURVwiLCBBLlZhbGlkRW1haWxBZGRyZXNzID0gXCJWQUxJRF9FTUFJTF9BRERSRVNTX0ZPUk1BVFwiLCBBLlZhbGlkTmFtZUZvcm1hdCA9IFwiVkFMSURfTkFNRV9GT1JNQVRcIiwgQS5WYWxpZE51bWJlciA9IFwiVkFMSURfTlVNQkVSXCIsIEEuVmFsaWRQaG9uZUZvcm1hdCA9IFwiVkFMSURfUEhPTkVfRk9STUFUXCIsIEEuVmFsaWRRdWVyeUZpbHRlciA9IFwiVkFMSURfUVVFUllfRklMVEVSXCIsIEEuVmFsaWRUeXBlID0gXCJWQUxJRF9UWVBFXCIsIEEpKShfIHx8IHt9KTtcbmV4cG9ydCB7XG4gIF8gYXMgUG9saWN5S2V5XG59O1xuIiwiZnVuY3Rpb24gZihvLCByLCBuKSB7XG4gIHJldHVybiBvID09PSAxID8gciA6IG4gIT09IHZvaWQgMCA/IG4gOiByICsgXCJzXCI7XG59XG5leHBvcnQge1xuICBmIGFzIHBsdXJhbFxufTtcbiIsImZ1bmN0aW9uIG4ociwgdCwgZSkge1xuICByZXR1cm4gIXIgfHwgclt0XSA9PT0gdm9pZCAwID8gZSA6IHJbdF07XG59XG5leHBvcnQge1xuICBuIGFzIGdldFByb3Bcbn07XG4iLCJpbXBvcnQgeyBwbHVyYWwgYXMgciB9IGZyb20gXCIuLi91dGlsL3N0cmluZ3MuanNcIjtcbmltcG9ydCB7IFBvbGljeUtleSBhcyBlIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGdldFByb3AgYXMgaSB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmNvbnN0IHUgPSB7XG4gIFtlLkNhbm5vdENvbnRhaW5DaGFyYWN0ZXJzXTogKGEsIG4pID0+IHtcbiAgICBjb25zdCB0ID0gaShuLCBcImZvcmJpZGRlbkNoYXJzXCIsIFwiXCIpO1xuICAgIHJldHVybiBgJHthfSBtdXN0IG5vdCBjb250YWluIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBcIiR7dH1cImA7XG4gIH0sXG4gIFtlLkNhbm5vdENvbnRhaW5EdXBsaWNhdGVzXTogKGEsIG4pID0+IHtcbiAgICBjb25zdCB0ID0gaShuLCBcImR1cGxpY2F0ZVZhbHVlXCIsIFwiXCIpO1xuICAgIHJldHVybiBgJHthfSAgbXVzdCBub3QgY29udGFpbiBkdXBsaWNhdGVzOiBcIiR7dH1cImA7XG4gIH0sXG4gIFtlLkNhbm5vdENvbnRhaW5PdGhlcnNdOiAoYSwgbikgPT4ge1xuICAgIGNvbnN0IHQgPSBpKG4sIFwiZGlzYWxsb3dlZEZpZWxkc1wiLCBcIlwiKTtcbiAgICByZXR1cm4gYCR7YX0gbXVzdCBub3QgY29udGFpbjogXCIke3R9XCJgO1xuICB9LFxuICBbZS5MZWFzdENhcGl0YWxMZXR0ZXJzXTogKGEsIG4pID0+IHtcbiAgICBjb25zdCB0ID0gaShuLCBcIm51bUNhcHNcIiwgMCk7XG4gICAgcmV0dXJuIGAke2F9IG11c3QgY29udGFpbiBhdCBsZWFzdCAke3R9IGNhcGl0YWwgJHtyKHQsIFwibGV0dGVyXCIpfWA7XG4gIH0sXG4gIFtlLkxlYXN0TnVtYmVyc106IChhLCBuKSA9PiB7XG4gICAgY29uc3QgdCA9IGkobiwgXCJudW1OdW1zXCIsIDApO1xuICAgIHJldHVybiBgJHthfSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHt0fSBudW1lcmljICR7cih0LCBcInZhbHVlXCIpfWA7XG4gIH0sXG4gIFtlLk1hdGNoUmVnZXhwXTogKGEpID0+IGAke2F9IGhhcyBmYWlsZWQgdGhlIFwiTUFUQ0hfUkVHRVhQXCIgcG9saWN5YCxcbiAgW2UuTWF4aW11bUxlbmd0aF06IChhLCBuKSA9PiB7XG4gICAgY29uc3QgdCA9IGkobiwgXCJtYXhMZW5ndGhcIiwgMCk7XG4gICAgcmV0dXJuIGAke2F9IG11c3QgYmUgYXQgbW9zdCAke3R9ICR7cih0LCBcImNoYXJhY3RlclwiKX1gO1xuICB9LFxuICBbZS5NYXhpbXVtTnVtYmVyXTogKGEpID0+IGAke2F9IGhhcyBmYWlsZWQgdGhlIFwiTUFYSU1VTV9OVU1CRVJfVkFMVUVcIiBwb2xpY3lgLFxuICBbZS5NaW5pbXVtTGVuZ3RoXTogKGEsIG4pID0+IHtcbiAgICBjb25zdCB0ID0gaShuLCBcIm1pbkxlbmd0aFwiLCAwKTtcbiAgICByZXR1cm4gYCR7YX0gbXVzdCBiZSBhdCBsZWFzdCAke3R9ICR7cih0LCBcImNoYXJhY3RlclwiKX1gO1xuICB9LFxuICBbZS5NaW5pbXVtTnVtYmVyXTogKGEpID0+IGAke2F9IGhhcyBmYWlsZWQgdGhlIFwiTUlOSU1VTV9OVU1CRVJfVkFMVUVcIiBwb2xpY3lgLFxuICBbZS5SZXF1aXJlZF06IChhKSA9PiBgJHthfSBpcyByZXF1aXJlZGAsXG4gIFtlLlVuaXF1ZV06IChhKSA9PiBgJHthfSBtdXN0IGJlIHVuaXF1ZWAsXG4gIFtlLlVua25vd25Qb2xpY3ldOiAoYSwgbikgPT4ge1xuICAgIGNvbnN0IHQgPSBpKG4sIFwicG9saWN5UmVxdWlyZW1lbnRcIiwgXCJVbmtub3duXCIpO1xuICAgIHJldHVybiBgJHthfTogVW5rbm93biBwb2xpY3kgcmVxdWlyZW1lbnQgXCIke3R9XCJgO1xuICB9LFxuICBbZS5WYWxpZEFycmF5SXRlbXNdOiAoYSkgPT4gYCR7YX0gaGFzIGZhaWxlZCB0aGUgXCJWQUxJRF9BUlJBWV9JVEVNU1wiIHBvbGljeWAsXG4gIFtlLlZhbGlkRGF0ZV06IChhKSA9PiBgJHthfSBoYXMgYW4gaW52YWxpZCBkYXRlYCxcbiAgW2UuVmFsaWRFbWFpbEFkZHJlc3NdOiAoYSkgPT4gYCR7YX0gaGFzIGFuIGludmFsaWQgZW1haWwgYWRkcmVzc2AsXG4gIFtlLlZhbGlkTmFtZUZvcm1hdF06IChhKSA9PiBgJHthfSBoYXMgYW4gaW52YWxpZCBuYW1lIGZvcm1hdGAsXG4gIFtlLlZhbGlkTnVtYmVyXTogKGEpID0+IGAke2F9IGhhcyBhbiBpbnZhbGlkIG51bWJlcmAsXG4gIFtlLlZhbGlkUGhvbmVGb3JtYXRdOiAoYSkgPT4gYCR7YX0gaGFzIGFuIGludmFsaWQgcGhvbmUgbnVtYmVyYCxcbiAgW2UuVmFsaWRRdWVyeUZpbHRlcl06IChhKSA9PiBgJHthfSBoYXMgZmFpbGVkIHRoZSBcIlZBTElEX1FVRVJZX0ZJTFRFUlwiIHBvbGljeWAsXG4gIFtlLlZhbGlkVHlwZV06IChhKSA9PiBgJHthfSBoYXMgZmFpbGVkIHRoZSBcIlZBTElEX1RZUEVcIiBwb2xpY3lgXG59O1xuZXhwb3J0IHtcbiAgdSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgUG9saWN5S2V5IGFzIG4gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGkgZnJvbSBcIi4vbWVzc2FnZS1jcmVhdG9yLmpzXCI7XG5jbGFzcyB5IHtcbiAgLyoqXG4gICAqIFBhcnNlcyBwb2xpY3kgZXJyb3JzIGFuZCBnZW5lcmF0ZXMgaHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RlcH0gZXJyIFRoZSBzdGVwIGNvbnRhaW5pbmcgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0ge01lc3NhZ2VDcmVhdG9yfSBtZXNzYWdlQ3JlYXRvclxuICAgKiBFeHRlbnNpYmxlIGFuZCBvdmVycmlkYWJsZSBjdXN0b20gZXJyb3IgbWVzc2FnZXMgZm9yIHBvbGljeSBmYWlsdXJlcy5cbiAgICogQHJldHVybiB7UHJvY2Vzc2VkUHJvcGVydHlFcnJvcltdfSBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxsIHByb2Nlc3NlZCBwb2xpY3kgZXJyb3JzLlxuICAgKi9cbiAgc3RhdGljIHBhcnNlRXJyb3JzKGUsIHIpIHtcbiAgICBjb25zdCBzID0gW107XG4gICAgcmV0dXJuIGUuZGV0YWlsICYmIGUuZGV0YWlsLmZhaWxlZFBvbGljeVJlcXVpcmVtZW50cyAmJiBlLmRldGFpbC5mYWlsZWRQb2xpY3lSZXF1aXJlbWVudHMubWFwKCh0KSA9PiB7XG4gICAgICBzLnB1c2guYXBwbHkocywgW1xuICAgICAgICB7XG4gICAgICAgICAgZGV0YWlsOiB0LFxuICAgICAgICAgIG1lc3NhZ2VzOiB0aGlzLnBhcnNlRmFpbGVkUG9saWN5UmVxdWlyZW1lbnQodCwgcilcbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSksIHM7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBhIGZhaWxlZCBwb2xpY3kgYW5kIHJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RmFpbGVkUG9saWN5UmVxdWlyZW1lbnR9IGZhaWxlZFBvbGljeSBUaGUgZGV0YWlsIGRhdGEgb2YgdGhlIGZhaWxlZCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7TWVzc2FnZUNyZWF0b3J9IGN1c3RvbU1lc3NhZ2VcbiAgICogRXh0ZW5zaWJsZSBhbmQgb3ZlcnJpZGFibGUgY3VzdG9tIGVycm9yIG1lc3NhZ2VzIGZvciBwb2xpY3kgZmFpbHVyZXMuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBzdHJpbmdzIHdpdGggYWxsIHByb2Nlc3NlZCBwb2xpY3kgZXJyb3JzLlxuICAgKi9cbiAgc3RhdGljIHBhcnNlRmFpbGVkUG9saWN5UmVxdWlyZW1lbnQoZSwgcikge1xuICAgIGNvbnN0IHMgPSBbXTtcbiAgICByZXR1cm4gZS5wb2xpY3lSZXF1aXJlbWVudHMubWFwKCh0KSA9PiB7XG4gICAgICBzLnB1c2goXG4gICAgICAgIHRoaXMucGFyc2VQb2xpY3lSZXF1aXJlbWVudChlLnByb3BlcnR5LCB0LCByKVxuICAgICAgKTtcbiAgICB9KSwgcztcbiAgfVxuICAvKipcbiAgICogUGFyc2VzIGEgcG9saWN5IGVycm9yIGludG8gYSBodW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIHByb3BlcnR5IHdpdGggdGhlIHBvbGljeSBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1BvbGljeVJlcXVpcmVtZW50fSBwb2xpY3kgVGhlIHBvbGljeSBmYWlsdXJlIGRhdGEuXG4gICAqIEBwYXJhbSB7TWVzc2FnZUNyZWF0b3J9IGN1c3RvbU1lc3NhZ2VcbiAgICogRXh0ZW5zaWJsZSBhbmQgb3ZlcnJpZGFibGUgY3VzdG9tIGVycm9yIG1lc3NhZ2VzIGZvciBwb2xpY3kgZmFpbHVyZXMuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gSHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHN0YXRpYyBwYXJzZVBvbGljeVJlcXVpcmVtZW50KGUsIHIsIHMgPSB7fSkge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgciA9PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShyKSA6IHsgLi4uciB9LCBhID0gdC5wb2xpY3lSZXF1aXJlbWVudCwgbyA9IHNbYV0gfHwgaVthXSB8fCBpW24uVW5rbm93blBvbGljeV0sIGMgPSB0LnBhcmFtcyA/IHsgLi4udC5wYXJhbXMsIHBvbGljeVJlcXVpcmVtZW50OiBhIH0gOiB7IHBvbGljeVJlcXVpcmVtZW50OiBhIH07XG4gICAgcmV0dXJuIG8oZSwgYyk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIG4gYXMgUG9saWN5S2V5LFxuICB5IGFzIGRlZmF1bHRcbn07XG4iLCJ2YXIgciA9IC8qIEBfX1BVUkVfXyAqLyAoKGkpID0+IChpLkxvZ2luRmFpbHVyZSA9IFwiTG9naW5GYWlsdXJlXCIsIGkuTG9naW5TdWNjZXNzID0gXCJMb2dpblN1Y2Nlc3NcIiwgaS5TdGVwID0gXCJTdGVwXCIsIGkpKShyIHx8IHt9KTtcbmV4cG9ydCB7XG4gIHIgYXMgU3RlcFR5cGVcbn07XG4iLCJpbXBvcnQgdCBmcm9tIFwiLi4vZnItcG9saWN5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTdGVwVHlwZSBhcyByIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmNsYXNzIGkge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMucGF5bG9hZCA9IGUsIHRoaXMudHlwZSA9IHIuTG9naW5GYWlsdXJlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlcnJvciBjb2RlLlxuICAgKi9cbiAgZ2V0Q29kZSgpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMucGF5bG9hZC5jb2RlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgZmFpbHVyZSBkZXRhaWxzLlxuICAgKi9cbiAgZ2V0RGV0YWlsKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQuZGV0YWlsO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gICAqL1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQubWVzc2FnZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBwcm9jZXNzZWQgZmFpbHVyZSBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0UHJvY2Vzc2VkTWVzc2FnZShlKSB7XG4gICAgcmV0dXJuIHQucGFyc2VFcnJvcnModGhpcy5wYXlsb2FkLCBlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgZmFpbHVyZSByZWFzb24uXG4gICAqL1xuICBnZXRSZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF5bG9hZC5yZWFzb247XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGkgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB7IFN0ZXBUeXBlIGFzIHMgfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuY2xhc3MgciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gZSwgdGhpcy50eXBlID0gcy5Mb2dpblN1Y2Nlc3M7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0ZXAncyByZWFsbS5cbiAgICovXG4gIGdldFJlYWxtKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQucmVhbG07XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0ZXAncyBzZXNzaW9uIHRva2VuLlxuICAgKi9cbiAgZ2V0U2Vzc2lvblRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQudG9rZW5JZDtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgc3RlcCdzIHN1Y2Nlc3MgVVJMLlxuICAgKi9cbiAgZ2V0U3VjY2Vzc1VybCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkLnN1Y2Nlc3NVcmw7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHIgYXMgZGVmYXVsdFxufTtcbiIsImNsYXNzIHIge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMucGF5bG9hZCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBjYWxsYmFjayB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXlsb2FkLnR5cGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgZWxlbWVudCwgb3IgdGhlIGZpcnN0IGVsZW1lbnQgaWYgYHNlbGVjdG9yYCBpcyBub3RcbiAgICogcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgaW5kZXggcG9zaXRpb24gb3IgbmFtZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG4gICAqL1xuICBnZXRJbnB1dFZhbHVlKGUgPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXJyYXlFbGVtZW50KHRoaXMucGF5bG9hZC5pbnB1dCwgZSkudmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgZWxlbWVudCwgb3IgdGhlIGZpcnN0IGVsZW1lbnQgaWYgYHNlbGVjdG9yYCBpcyBub3RcbiAgICogcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgaW5kZXggcG9zaXRpb24gb3IgbmFtZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG4gICAqL1xuICBzZXRJbnB1dFZhbHVlKGUsIHQgPSAwKSB7XG4gICAgdGhpcy5nZXRBcnJheUVsZW1lbnQodGhpcy5wYXlsb2FkLmlucHV0LCB0KS52YWx1ZSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGVsZW1lbnQsIG9yIHRoZSBmaXJzdCBlbGVtZW50IGlmIGBzZWxlY3RvcmBcbiAgICogaXMgbm90IHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIGluZGV4IHBvc2l0aW9uIG9yIG5hbWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuICAgKi9cbiAgZ2V0T3V0cHV0VmFsdWUoZSA9IDApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBcnJheUVsZW1lbnQodGhpcy5wYXlsb2FkLm91dHB1dCwgZSkudmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBvdXRwdXQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvciB0aGVcbiAgICogc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcbiAgICovXG4gIGdldE91dHB1dEJ5TmFtZShlLCB0KSB7XG4gICAgY29uc3QgbiA9IHRoaXMucGF5bG9hZC5vdXRwdXQuZmluZCgoYSkgPT4gYS5uYW1lID09PSBlKTtcbiAgICByZXR1cm4gbiA/IG4udmFsdWUgOiB0O1xuICB9XG4gIGdldEFycmF5RWxlbWVudChlLCB0ID0gMCkge1xuICAgIGlmIChlID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIE5hbWVWYWx1ZSBhcnJheSB3YXMgcHJvdmlkZWQgdG8gc2VhcmNoIChzZWxlY3RvciAke3R9KWApO1xuICAgIGlmICh0eXBlb2YgdCA9PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAodCA8IDAgfHwgdCA+IGUubGVuZ3RoIC0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWxlY3RvciBpbmRleCAke3R9IGlzIG91dCBvZiByYW5nZWApO1xuICAgICAgcmV0dXJuIGVbdF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBuID0gZS5maW5kKChhKSA9PiBhLm5hbWUgPT09IHQpO1xuICAgICAgaWYgKCFuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY2FsbGJhY2sgaW5wdXQgZW50cnkgXCIke3R9XCJgKTtcbiAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHQgPT0gXCJvYmplY3RcIiAmJiB0LnRlc3QgJiYgdC5leGVjKSB7XG4gICAgICBjb25zdCBuID0gZS5maW5kKChhKSA9PiB0LnRlc3QoYS5uYW1lKSk7XG4gICAgICBpZiAoIW4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjYWxsYmFjayBpbnB1dCBlbnRyeSBcIiR7dH1cImApO1xuICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2VsZWN0b3IgdmFsdWUgdHlwZVwiKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgciBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHIgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHMgZXh0ZW5kcyByIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBzdXBlcihlKSwgdGhpcy5wYXlsb2FkID0gZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGF0dHJpYnV0ZSBwcm9tcHQuXG4gICAqL1xuICBnZXRQcm9tcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicHJvbXB0XCIsIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicmVxdWlyZWRcIiwgITEpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIGZhaWxlZCBwb2xpY2llcy5cbiAgICovXG4gIGdldEZhaWxlZFBvbGljaWVzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmdldE91dHB1dEJ5TmFtZShcbiAgICAgIFwiZmFpbGVkUG9saWNpZXNcIixcbiAgICAgIFtdXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGUubWFwKCh0KSA9PiBKU09OLnBhcnNlKHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1VuYWJsZSB0byBwYXJzZSBcImZhaWxlZCBwb2xpY2llc1wiIGZyb20gdGhlIEZvcmdlUm9jayBzZXJ2ZXIuIFRoZSBKU09OIHdpdGhpbiBgQXR0cmlidXRlSW5wdXRDYWxsYmFja2Agd2FzIGVpdGhlciBtYWxmb3JtZWQgb3IgbWlzc2luZy4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBhcHBsaWNhYmxlIHBvbGljaWVzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2V0UG9saWNpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicG9saWNpZXNcIiwge30pO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaWYgdmFsaWRhdGluZyB2YWx1ZSBvbmx5LlxuICAgKi9cbiAgc2V0VmFsaWRhdGVPbmx5KGUpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSwgL3ZhbGlkYXRlT25seS8pO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAgICovXG4gIHNldFZhbHVlKGUpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHMgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBvIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBoIGV4dGVuZHMgbyB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNob2ljZSdzIHByb21wdC5cbiAgICovXG4gIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJwcm9tcHRcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNob2ljZSdzIGRlZmF1bHQgYW5zd2VyLlxuICAgKi9cbiAgZ2V0RGVmYXVsdENob2ljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJkZWZhdWx0Q2hvaWNlXCIsIDApO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjaG9pY2UncyBwb3NzaWJsZSBhbnN3ZXJzLlxuICAgKi9cbiAgZ2V0Q2hvaWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJjaG9pY2VzXCIsIFtdKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgY2hvaWNlJ3MgYW5zd2VyIGJ5IGluZGV4IHBvc2l0aW9uLlxuICAgKi9cbiAgc2V0Q2hvaWNlSW5kZXgodCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmdldENob2ljZXMoKS5sZW5ndGg7XG4gICAgaWYgKHQgPCAwIHx8IHQgPiBlIC0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0fSBpcyBvdXQgb2YgYm91bmRzYCk7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjaG9pY2UncyBhbnN3ZXIgYnkgdmFsdWUuXG4gICAqL1xuICBzZXRDaG9pY2VWYWx1ZSh0KSB7XG4gICAgY29uc3QgZSA9IHRoaXMuZ2V0Q2hvaWNlcygpLmluZGV4T2YodCk7XG4gICAgaWYgKGUgPT09IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dH1cIiBpcyBub3QgYSB2YWxpZCBjaG9pY2VgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGggYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCByIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBpIGV4dGVuZHMgciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBjb25maXJtYXRpb24ncyBkZWZhdWx0IGFuc3dlci5cbiAgICovXG4gIGdldERlZmF1bHRPcHRpb24oKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmdldE91dHB1dEJ5TmFtZShcImRlZmF1bHRPcHRpb25cIiwgMCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb25maXJtYXRpb24ncyBtZXNzYWdlIHR5cGUuXG4gICAqL1xuICBnZXRNZXNzYWdlVHlwZSgpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibWVzc2FnZVR5cGVcIiwgMCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb25maXJtYXRpb24ncyBwb3NzaWJsZSBhbnN3ZXJzLlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJvcHRpb25zXCIsIFtdKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY29uZmlybWF0aW9uJ3Mgb3B0aW9uIHR5cGUuXG4gICAqL1xuICBnZXRPcHRpb25UeXBlKCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJvcHRpb25UeXBlXCIsIDApKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY29uZmlybWF0aW9uJ3MgcHJvbXB0LlxuICAgKi9cbiAgZ2V0UHJvbXB0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInByb21wdFwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogU2V0IG9wdGlvbiBpbmRleC5cbiAgICovXG4gIHNldE9wdGlvbkluZGV4KHQpIHtcbiAgICBpZiAodCAhPT0gMCAmJiB0ICE9PSAxKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dH1cIiBpcyBub3QgYSB2YWxpZCBjaG9pY2VgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBvcHRpb24gdmFsdWUuXG4gICAqL1xuICBzZXRPcHRpb25WYWx1ZSh0KSB7XG4gICAgY29uc3QgZSA9IHRoaXMuZ2V0T3B0aW9ucygpLmluZGV4T2YodCk7XG4gICAgaWYgKGUgPT09IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dH1cIiBpcyBub3QgYSB2YWxpZCBjaG9pY2VgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGkgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB0IGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBpIGV4dGVuZHMgdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoZSksIHRoaXMucGF5bG9hZCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNhbGxiYWNrJ3MgZGF0YS5cbiAgICovXG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibWVzc2FnZVwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogRG9lcyBjYWxsYmFjayByZXF1aXJlIG1ldGFkYXRhP1xuICAgKi9cbiAgaXNNZXRhZGF0YVJlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcIm1ldGFkYXRhXCIsICExKTtcbiAgfVxuICAvKipcbiAgICogRG9lcyBjYWxsYmFjayByZXF1aXJlIGxvY2F0aW9uIGRhdGE/XG4gICAqL1xuICBpc0xvY2F0aW9uUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibG9jYXRpb25cIiwgITEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9maWxlLlxuICAgKi9cbiAgc2V0UHJvZmlsZShlKSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKEpTT04uc3RyaW5naWZ5KGUpKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgaSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGUgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHQgZXh0ZW5kcyBlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGEpIHtcbiAgICBzdXBlcihhKSwgdGhpcy5wYXlsb2FkID0gYTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgdCBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IG4gZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHUgZXh0ZW5kcyBuIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBzdXBlcih0KSwgdGhpcy5wYXlsb2FkID0gdDtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sgcHJvbXB0LlxuICAgKi9cbiAgZ2V0UHJvbXB0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInByb21wdFwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBsaXN0IG9mIHByZS1kZWZpbmVkIHNlY3VyaXR5IHF1ZXN0aW9ucy5cbiAgICovXG4gIGdldFByZWRlZmluZWRRdWVzdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicHJlZGVmaW5lZFF1ZXN0aW9uc1wiLCBbXSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNhbGxiYWNrJ3Mgc2VjdXJpdHkgcXVlc3Rpb24uXG4gICAqL1xuICBzZXRRdWVzdGlvbih0KSB7XG4gICAgdGhpcy5zZXRWYWx1ZShcInF1ZXN0aW9uXCIsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjaydzIHNlY3VyaXR5IHF1ZXN0aW9uIGFuc3dlci5cbiAgICovXG4gIHNldEFuc3dlcih0KSB7XG4gICAgdGhpcy5zZXRWYWx1ZShcImFuc3dlclwiLCB0KTtcbiAgfVxuICBzZXRWYWx1ZSh0LCBzKSB7XG4gICAgaWYgKCF0aGlzLnBheWxvYWQuaW5wdXQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJLQkEgcGF5bG9hZCBpcyBtaXNzaW5nIGlucHV0XCIpO1xuICAgIGNvbnN0IGUgPSB0aGlzLnBheWxvYWQuaW5wdXQuZmluZCgoaSkgPT4gaS5uYW1lLmVuZHNXaXRoKHQpKTtcbiAgICBpZiAoIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGlucHV0IGhhcyBuYW1lIGVuZGluZyBpbiBcIiR7dH1cImApO1xuICAgIGUudmFsdWUgPSBzO1xuICB9XG59XG5leHBvcnQge1xuICB1IGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgYSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgcyBleHRlbmRzIGEge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IodCkge1xuICAgIHN1cGVyKHQpLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIGRhdGEuXG4gICAqL1xuICBnZXREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcImRhdGFcIiwge30pO1xuICB9XG59XG5leHBvcnQge1xuICBzIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgciBleHRlbmRzIGUge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IodCkge1xuICAgIHN1cGVyKHQpLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIHByb21wdC5cbiAgICovXG4gIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJwcm9tcHRcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHVzZXJuYW1lLlxuICAgKi9cbiAgc2V0TmFtZSh0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQpO1xuICB9XG59XG5leHBvcnQge1xuICByIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgciBleHRlbmRzIGUge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IodCkge1xuICAgIHN1cGVyKHQpLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIGZhaWxlZCBwb2xpY2llcy5cbiAgICovXG4gIGdldEZhaWxlZFBvbGljaWVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcImZhaWxlZFBvbGljaWVzXCIsIFtdKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBhcHBsaWNhYmxlIHBvbGljaWVzLlxuICAgKi9cbiAgZ2V0UG9saWNpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicG9saWNpZXNcIiwgW10pO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIHByb21wdC5cbiAgICovXG4gIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJwcm9tcHRcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBhc3N3b3JkLlxuICAgKi9cbiAgc2V0UGFzc3dvcmQodCkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgciBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGEgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHIgZXh0ZW5kcyBhIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBzdXBlcih0KSwgdGhpcy5wYXlsb2FkID0gdDtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBwYXVzZUJlaGF2aW9yYWxEYXRhIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFBhdXNlQmVoYXZpb3JhbERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicGF1c2VCZWhhdmlvcmFsRGF0YVwiLCAhMSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0RGF0YSAtIFNldCB0aGUgcmVzdWx0IG9mIGRhdGEgY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YSAtIERhdGEgZnJvbSBjYWxsaW5nIHBpbmdQcm90ZWN0LmdldCgpXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0RGF0YSh0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQsIC9zaWduYWxzLyk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0Q2xpZW50RXJyb3IgLSBTZXQgdGhlIGNsaWVudCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q2xpZW50RXJyb3IodCkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0LCAvY2xpZW50RXJyb3IvKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgciBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGUgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIGkgZXh0ZW5kcyBlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBzdXBlcih0KSwgdGhpcy5wYXlsb2FkID0gdDtcbiAgfVxuICAvKipcbiAgICogR2V0IGNhbGxiYWNrJ3MgaW5pdGlhbGl6YXRpb24gY29uZmlnIHNldHRpbmdzXG4gICAqL1xuICBnZXRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudklkOiB0aGlzLmdldE91dHB1dEJ5TmFtZShcImVudklkXCIsIFwiXCIpLFxuICAgICAgY29uc29sZUxvZ0VuYWJsZWQ6IHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiY29uc29sZUxvZ0VuYWJsZWRcIiwgITEpLFxuICAgICAgZGV2aWNlQXR0cmlidXRlc1RvSWdub3JlOiB0aGlzLmdldE91dHB1dEJ5TmFtZShcImRldmljZUF0dHJpYnV0ZXNUb0lnbm9yZVwiLCBbXSksXG4gICAgICBjdXN0b21Ib3N0OiB0aGlzLmdldE91dHB1dEJ5TmFtZShcImN1c3RvbUhvc3RcIiwgXCJcIiksXG4gICAgICBsYXp5TWV0YWRhdGE6IHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibGF6eU1ldGFkYXRhXCIsICExKSxcbiAgICAgIGJlaGF2aW9yYWxEYXRhQ29sbGVjdGlvbjogdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJiZWhhdmlvcmFsRGF0YUNvbGxlY3Rpb25cIiwgITApLFxuICAgICAgZGV2aWNlS2V5UnN5bmNJbnRlcnZhbHM6IHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiZGV2aWNlS2V5UnN5bmNJbnRlcnZhbHNcIiwgMTQpLFxuICAgICAgZW5hYmxlVHJ1c3Q6IHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiZW5hYmxlVHJ1c3RcIiwgITEpLFxuICAgICAgZGlzYWJsZVRhZ3M6IHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiZGlzYWJsZVRhZ3NcIiwgITEpLFxuICAgICAgZGlzYWJsZUh1YjogdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJkaXNhYmxlSHViXCIsICExKVxuICAgIH07XG4gIH1cbiAgc2V0Q2xpZW50RXJyb3IodCkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0LCAvY2xpZW50RXJyb3IvKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgaSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGUgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHIgZXh0ZW5kcyBlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBzdXBlcih0KSwgdGhpcy5wYXlsb2FkID0gdDtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IHdoaWxlIHBvbGxpbmcuXG4gICAqL1xuICBnZXRNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcIm1lc3NhZ2VcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZ2V0V2FpdFRpbWUoKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmdldE91dHB1dEJ5TmFtZShcIndhaXRUaW1lXCIsIDApKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgciBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGUgZnJvbSBcIi4vaW5kZXguanNcIjtcbmNsYXNzIHIgZXh0ZW5kcyBlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXlsb2FkIFRoZSByYXcgcGF5bG9hZCByZXR1cm5lZCBieSBPcGVuQU1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHQpIHtcbiAgICBzdXBlcih0KSwgdGhpcy5wYXlsb2FkID0gdDtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcmVDQVBUQ0hBIHNpdGUga2V5LlxuICAgKi9cbiAgZ2V0U2l0ZUtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJyZWNhcHRjaGFTaXRlS2V5XCIsIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZUNBUFRDSEEgcmVzdWx0LlxuICAgKi9cbiAgc2V0UmVzdWx0KHQpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHIgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBlIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyByIGV4dGVuZHMgZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlQ0FQVENIQSBzaXRlIGtleS5cbiAgICovXG4gIGdldFNpdGVLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicmVjYXB0Y2hhU2l0ZUtleVwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBhcGkgdXJsXG4gICAqL1xuICBnZXRBcGlVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiY2FwdGNoYUFwaVVyaVwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBjbGFzcyBuYW1lXG4gICAqL1xuICBnZXRFbGVtZW50Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwiY2FwdGNoYURpdkNsYXNzXCIsIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZUNBUFRDSEEgcmVzdWx0LlxuICAgKi9cbiAgc2V0UmVzdWx0KHQpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBjbGllbnQgY2xpZW50IGVycm9yXG4gICAqL1xuICBzZXRDbGllbnRFcnJvcih0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQsIFwiSURUb2tlbjFjbGllbnRFcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSByZWNhcHRjaGEgcGF5bG9hZFxuICAgKi9cbiAgc2V0UGF5bG9hZCh0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQsIFwiSURUb2tlbjFwYXlsb2FkXCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHJlY2FwdGNoYSBhY3Rpb25cbiAgICovXG4gIHNldEFjdGlvbih0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQsIFwiSURUb2tlbjFhY3Rpb25cIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHIgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBlIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBjIGV4dGVuZHMgZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlZGlyZWN0IFVSTC5cbiAgICovXG4gIGdldFJlZGlyZWN0VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInJlZGlyZWN0VXJsXCIsIFwiXCIpO1xuICB9XG59XG5leHBvcnQge1xuICBjIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgaSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgZCBleHRlbmRzIGkge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3Iocikge1xuICAgIHN1cGVyKHIpLCB0aGlzLnBheWxvYWQgPSByO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzLlxuICAgKi9cbiAgZ2V0UHJvdmlkZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInByb3ZpZGVyc1wiLCBbXSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByb3ZpZGVyIGJ5IG5hbWUuXG4gICAqL1xuICBzZXRQcm92aWRlcihyKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuZ2V0UHJvdmlkZXJzKCkuZmluZCgoZSkgPT4gZS5wcm92aWRlciA9PT0gcik7XG4gICAgaWYgKCF0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7cn1cIiBpcyBub3QgYSB2YWxpZCBjaG9pY2VgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodC5wcm92aWRlcik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGQgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB0IGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyB1IGV4dGVuZHMgdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoZSksIHRoaXMucGF5bG9hZCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1lc3NhZ2UgY29udGVudC5cbiAgICovXG4gIGdldE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibWVzc2FnZVwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgbWVzc2FnZSB0eXBlLlxuICAgKi9cbiAgZ2V0TWVzc2FnZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwibWVzc2FnZVR5cGVcIiwgXCJcIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHUgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBlIGZyb20gXCIuL3RleHQtb3V0cHV0LWNhbGxiYWNrLmpzXCI7XG5jbGFzcyBhIGV4dGVuZHMgZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGEgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBlIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBhIGV4dGVuZHMgZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIodCksIHRoaXMucGF5bG9hZCA9IHQ7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGNvbnRlbnQuXG4gICAqL1xuICBnZXRUZXJtcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJ0ZXJtc1wiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMuXG4gICAqL1xuICBnZXRWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInZlcnNpb25cIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRhdGUgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zLlxuICAgKi9cbiAgZ2V0Q3JlYXRlRGF0ZSgpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJjcmVhdGVEYXRlXCIsIFwiXCIpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh0KTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgY2FsbGJhY2sncyBhY2NlcHRhbmNlLlxuICAgKi9cbiAgc2V0QWNjZXB0ZWQodCA9ICEwKSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQpO1xuICB9XG59XG5leHBvcnQge1xuICBhIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgZSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgciBleHRlbmRzIGUge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IodCkge1xuICAgIHN1cGVyKHQpLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIHByb21wdC5cbiAgICovXG4gIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJwcm9tcHRcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNhbGxiYWNrJ3MgaW5wdXQgdmFsdWUuXG4gICAqL1xuICBzZXRJbnB1dCh0KSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKHQpO1xuICB9XG59XG5leHBvcnQge1xuICByIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgYSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuY2xhc3MgaSBleHRlbmRzIGEge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKi9cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUpLCB0aGlzLnBheWxvYWQgPSBlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIGZhaWxlZCBwb2xpY2llcy5cbiAgICovXG4gIGdldEZhaWxlZFBvbGljaWVzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmdldE91dHB1dEJ5TmFtZShcbiAgICAgIFwiZmFpbGVkUG9saWNpZXNcIixcbiAgICAgIFtdXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGUubWFwKCh0KSA9PiBKU09OLnBhcnNlKHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1VuYWJsZSB0byBwYXJzZSBcImZhaWxlZCBwb2xpY2llc1wiIGZyb20gdGhlIEZvcmdlUm9jayBzZXJ2ZXIuIFRoZSBKU09OIHdpdGhpbiBgVmFsaWRhdGVkQ3JlYXRlUGFzc3dvcmRDYWxsYmFja2Agd2FzIGVpdGhlciBtYWxmb3JtZWQgb3IgbWlzc2luZy4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBhcHBsaWNhYmxlIHBvbGljaWVzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2V0UG9saWNpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicG9saWNpZXNcIiwge30pO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjYWxsYmFjaydzIHByb21wdC5cbiAgICovXG4gIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXCJwcm9tcHRcIiwgXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcGFzc3dvcmQgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBpc1JlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInJlcXVpcmVkXCIsICExKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgY2FsbGJhY2sncyBwYXNzd29yZC5cbiAgICovXG4gIHNldFBhc3N3b3JkKGUpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpZiB2YWxpZGF0aW5nIHZhbHVlIG9ubHkuXG4gICAqL1xuICBzZXRWYWxpZGF0ZU9ubHkoZSkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShlLCAvdmFsaWRhdGVPbmx5Lyk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGkgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBhIGZyb20gXCIuL2luZGV4LmpzXCI7XG5jbGFzcyBzIGV4dGVuZHMgYSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgcmF3IHBheWxvYWQgcmV0dXJuZWQgYnkgT3BlbkFNXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoZSksIHRoaXMucGF5bG9hZCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNhbGxiYWNrJ3MgcHJvbXB0LlxuICAgKi9cbiAgZ2V0UHJvbXB0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInByb21wdFwiLCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY2FsbGJhY2sncyBmYWlsZWQgcG9saWNpZXMuXG4gICAqL1xuICBnZXRGYWlsZWRQb2xpY2llcygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5nZXRPdXRwdXRCeU5hbWUoXG4gICAgICBcImZhaWxlZFBvbGljaWVzXCIsXG4gICAgICBbXVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlLm1hcCgodCkgPT4gSlNPTi5wYXJzZSh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdVbmFibGUgdG8gcGFyc2UgXCJmYWlsZWQgcG9saWNpZXNcIiBmcm9tIHRoZSBGb3JnZVJvY2sgc2VydmVyLiBUaGUgSlNPTiB3aXRoaW4gYFZhbGlkYXRlZENyZWF0ZVVzZXJuYW1lQ2FsbGJhY2tgIHdhcyBlaXRoZXIgbWFsZm9ybWVkIG9yIG1pc3NpbmcuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNhbGxiYWNrJ3MgYXBwbGljYWJsZSBwb2xpY2llcy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGdldFBvbGljaWVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldE91dHB1dEJ5TmFtZShcInBvbGljaWVzXCIsIHt9KTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB1c2VybmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0QnlOYW1lKFwicmVxdWlyZWRcIiwgITEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjaydzIHVzZXJuYW1lLlxuICAgKi9cbiAgc2V0TmFtZShlKSB7XG4gICAgdGhpcy5zZXRJbnB1dFZhbHVlKGUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaWYgdmFsaWRhdGluZyB2YWx1ZSBvbmx5LlxuICAgKi9cbiAgc2V0VmFsaWRhdGVPbmx5KGUpIHtcbiAgICB0aGlzLnNldElucHV0VmFsdWUoZSwgL3ZhbGlkYXRlT25seS8pO1xuICB9XG59XG5leHBvcnQge1xuICBzIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgYSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQ2FsbGJhY2tUeXBlIGFzIHIgfSBmcm9tIFwiLi4vLi4vYXV0aC9lbnVtcy5qc1wiO1xuaW1wb3J0IHQgZnJvbSBcIi4vYXR0cmlidXRlLWlucHV0LWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgbiBmcm9tIFwiLi9jaG9pY2UtY2FsbGJhY2suanNcIjtcbmltcG9ydCBvIGZyb20gXCIuL2NvbmZpcm1hdGlvbi1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IGkgZnJvbSBcIi4vZGV2aWNlLXByb2ZpbGUtY2FsbGJhY2suanNcIjtcbmltcG9ydCBsIGZyb20gXCIuL2hpZGRlbi12YWx1ZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IEMgZnJvbSBcIi4va2JhLWNyZWF0ZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IG0gZnJvbSBcIi4vbWV0YWRhdGEtY2FsbGJhY2suanNcIjtcbmltcG9ydCB1IGZyb20gXCIuL25hbWUtY2FsbGJhY2suanNcIjtcbmltcG9ydCBwIGZyb20gXCIuL3Bhc3N3b3JkLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgcyBmcm9tIFwiLi9waW5nLXByb3RlY3QtZXZhbHVhdGlvbi1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IGMgZnJvbSBcIi4vcGluZy1wcm90ZWN0LWluaXRpYWxpemUtY2FsbGJhY2suanNcIjtcbmltcG9ydCBkIGZyb20gXCIuL3BvbGxpbmctd2FpdC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IGIgZnJvbSBcIi4vcmVjYXB0Y2hhLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgZiBmcm9tIFwiLi9yZWNhcHRjaGEtZW50ZXJwcmlzZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHcgZnJvbSBcIi4vcmVkaXJlY3QtY2FsbGJhY2suanNcIjtcbmltcG9ydCBrIGZyb20gXCIuL3NlbGVjdC1pZHAtY2FsbGJhY2suanNcIjtcbmltcG9ydCBQIGZyb20gXCIuL3N1c3BlbmRlZC10ZXh0LW91dHB1dC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IEkgZnJvbSBcIi4vdGVybXMtYW5kLWNvbmRpdGlvbnMtY2FsbGJhY2suanNcIjtcbmltcG9ydCBUIGZyb20gXCIuL3RleHQtaW5wdXQtY2FsbGJhY2suanNcIjtcbmltcG9ydCBPIGZyb20gXCIuL3RleHQtb3V0cHV0LWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgZyBmcm9tIFwiLi92YWxpZGF0ZWQtY3JlYXRlLXBhc3N3b3JkLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgaCBmcm9tIFwiLi92YWxpZGF0ZWQtY3JlYXRlLXVzZXJuYW1lLWNhbGxiYWNrLmpzXCI7XG5mdW5jdGlvbiBYKGUpIHtcbiAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICBjYXNlIHIuQm9vbGVhbkF0dHJpYnV0ZUlucHV0Q2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IHQoZSk7XG4gICAgY2FzZSByLkNob2ljZUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBuKGUpO1xuICAgIGNhc2Ugci5Db25maXJtYXRpb25DYWxsYmFjazpcbiAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICBjYXNlIHIuRGV2aWNlUHJvZmlsZUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBpKGUpO1xuICAgIGNhc2Ugci5IaWRkZW5WYWx1ZUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBsKGUpO1xuICAgIGNhc2Ugci5LYmFDcmVhdGVDYWxsYmFjazpcbiAgICAgIHJldHVybiBuZXcgQyhlKTtcbiAgICBjYXNlIHIuTWV0YWRhdGFDYWxsYmFjazpcbiAgICAgIHJldHVybiBuZXcgbShlKTtcbiAgICBjYXNlIHIuTmFtZUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyB1KGUpO1xuICAgIGNhc2Ugci5OdW1iZXJBdHRyaWJ1dGVJbnB1dENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyB0KGUpO1xuICAgIGNhc2Ugci5QYXNzd29yZENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBwKGUpO1xuICAgIGNhc2Ugci5QaW5nT25lUHJvdGVjdEV2YWx1YXRpb25DYWxsYmFjazpcbiAgICAgIHJldHVybiBuZXcgcyhlKTtcbiAgICBjYXNlIHIuUGluZ09uZVByb3RlY3RJbml0aWFsaXplQ2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IGMoZSk7XG4gICAgY2FzZSByLlBvbGxpbmdXYWl0Q2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IGQoZSk7XG4gICAgY2FzZSByLlJlQ2FwdGNoYUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBiKGUpO1xuICAgIGNhc2Ugci5SZUNhcHRjaGFFbnRlcnByaXNlQ2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IGYoZSk7XG4gICAgY2FzZSByLlJlZGlyZWN0Q2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IHcoZSk7XG4gICAgY2FzZSByLlNlbGVjdElkUENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBrKGUpO1xuICAgIGNhc2Ugci5TdHJpbmdBdHRyaWJ1dGVJbnB1dENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyB0KGUpO1xuICAgIGNhc2Ugci5TdXNwZW5kZWRUZXh0T3V0cHV0Q2FsbGJhY2s6XG4gICAgICByZXR1cm4gbmV3IFAoZSk7XG4gICAgY2FzZSByLlRlcm1zQW5kQ29uZGl0aW9uc0NhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBJKGUpO1xuICAgIGNhc2Ugci5UZXh0SW5wdXRDYWxsYmFjazpcbiAgICAgIHJldHVybiBuZXcgVChlKTtcbiAgICBjYXNlIHIuVGV4dE91dHB1dENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBPKGUpO1xuICAgIGNhc2Ugci5WYWxpZGF0ZWRDcmVhdGVQYXNzd29yZENhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBnKGUpO1xuICAgIGNhc2Ugci5WYWxpZGF0ZWRDcmVhdGVVc2VybmFtZUNhbGxiYWNrOlxuICAgICAgcmV0dXJuIG5ldyBoKGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IGEoZSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFggYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBjIGZyb20gXCIuL2NhbGxiYWNrcy9mYWN0b3J5LmpzXCI7XG5pbXBvcnQgeyBTdGVwVHlwZSBhcyByIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmNsYXNzIGkge1xuICAvKipcbiAgICogQHBhcmFtIHBheWxvYWQgVGhlIHJhdyBwYXlsb2FkIHJldHVybmVkIGJ5IE9wZW5BTVxuICAgKiBAcGFyYW0gY2FsbGJhY2tGYWN0b3J5IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFtIGltcGxlbWVudGF0aW9uIG9mIEZSQ2FsbGJhY2tcbiAgICovXG4gIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICB0aGlzLnBheWxvYWQgPSB0LCB0aGlzLnR5cGUgPSByLlN0ZXAsIHRoaXMuY2FsbGJhY2tzID0gW10sIHQuY2FsbGJhY2tzICYmICh0aGlzLmNhbGxiYWNrcyA9IHRoaXMuY29udmVydENhbGxiYWNrcyh0LmNhbGxiYWNrcywgZSkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBjYWxsYmFjayBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gdGhpcyBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBjYWxsYmFjayB0byBmaW5kLlxuICAgKi9cbiAgZ2V0Q2FsbGJhY2tPZlR5cGUodCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmdldENhbGxiYWNrc09mVHlwZSh0KTtcbiAgICBpZiAoZS5sZW5ndGggIT09IDEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIDEgY2FsbGJhY2sgb2YgdHlwZSBcIiR7dH1cIiwgYnV0IGZvdW5kICR7ZS5sZW5ndGh9YCk7XG4gICAgcmV0dXJuIGVbMF07XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgYWxsIGNhbGxiYWNrcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gdGhpcyBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBjYWxsYmFjayB0byBmaW5kLlxuICAgKi9cbiAgZ2V0Q2FsbGJhY2tzT2ZUeXBlKHQpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MuZmlsdGVyKChlKSA9PiBlLmdldFR5cGUoKSA9PT0gdCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjYWxsYmFjayBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gdGhpcyBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBjYWxsYmFjayB0byBmaW5kLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgc2V0Q2FsbGJhY2tWYWx1ZSh0LCBlKSB7XG4gICAgY29uc3QgYSA9IHRoaXMuZ2V0Q2FsbGJhY2tzT2ZUeXBlKHQpO1xuICAgIGlmIChhLmxlbmd0aCAhPT0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgMSBjYWxsYmFjayBvZiB0eXBlIFwiJHt0fVwiLCBidXQgZm91bmQgJHthLmxlbmd0aH1gKTtcbiAgICBhWzBdLnNldElucHV0VmFsdWUoZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0ZXAncyBkZXNjcmlwdGlvbi5cbiAgICovXG4gIGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQuZGVzY3JpcHRpb247XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0ZXAncyBoZWFkZXIuXG4gICAqL1xuICBnZXRIZWFkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF5bG9hZC5oZWFkZXI7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0ZXAncyBzdGFnZS5cbiAgICovXG4gIGdldFN0YWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQuc3RhZ2U7XG4gIH1cbiAgY29udmVydENhbGxiYWNrcyh0LCBlKSB7XG4gICAgcmV0dXJuIHQubWFwKChsKSA9PiAoZSB8fCBjKShsKSB8fCBjKGwpKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgaSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHYgZnJvbSBcIi4uL2NvbmZpZy9pbmRleC5qc1wiO1xuaW1wb3J0IHcgZnJvbSBcIi4uL2F1dGgvaW5kZXguanNcIjtcbmltcG9ydCB7IENhbGxiYWNrVHlwZSBhcyB4IH0gZnJvbSBcIi4uL2F1dGgvZW51bXMuanNcIjtcbmltcG9ydCBJIGZyb20gXCIuL2ZyLWxvZ2luLWZhaWx1cmUuanNcIjtcbmltcG9ydCBrIGZyb20gXCIuL2ZyLWxvZ2luLXN1Y2Nlc3MuanNcIjtcbmltcG9ydCBSIGZyb20gXCIuL2ZyLXN0ZXAuanNcIjtcbmNsYXNzIGYge1xuICBzdGF0aWMgZ2V0IHByZXZpb3VzU3RlcEtleSgpIHtcbiAgICByZXR1cm4gYCR7di5nZXQoKS5wcmVmaXh9LVByZXZpb3VzU3RlcGA7XG4gIH1cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWUuXG4gICAqXG4gICAqIENhbGwgYEZSQXV0aC5uZXh0KClgIHJlY3Vyc2l2ZWx5LiAgQXQgZWFjaCBzdGVwLCBjaGVjayBmb3Igc2Vzc2lvbiB0b2tlbiBvciBlcnJvciwgb3RoZXJ3aXNlXG4gICAqIHBvcHVsYXRlIHRoZSBzdGVwJ3MgY2FsbGJhY2tzIGFuZCBjYWxsIGBuZXh0KClgIGFnYWluLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBhc3luYyBmdW5jdGlvbiBuZXh0U3RlcChwcmV2aW91c1N0ZXApIHtcbiAgICogICBjb25zdCB0aGlzU3RlcCA9IGF3YWl0IEZSQXV0aC5uZXh0KHByZXZpb3VzU3RlcCk7XG4gICAqXG4gICAqICAgc3dpdGNoICh0aGlzU3RlcC50eXBlKSB7XG4gICAqICAgICBjYXNlIFN0ZXBUeXBlLkxvZ2luU3VjY2VzczpcbiAgICogICAgICAgY29uc3QgdG9rZW4gPSB0aGlzU3RlcC5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICogICAgICAgYnJlYWs7XG4gICAqICAgICBjYXNlIFN0ZXBUeXBlLkxvZ2luRmFpbHVyZTpcbiAgICogICAgICAgY29uc3QgZGV0YWlsID0gdGhpc1N0ZXAuZ2V0RGV0YWlsKCk7XG4gICAqICAgICAgIGJyZWFrO1xuICAgKiAgICAgY2FzZSBTdGVwVHlwZS5TdGVwOlxuICAgKiAgICAgICAvLyBQb3B1bGF0ZSBgdGhpc1N0ZXBgIGNhbGxiYWNrcyBoZXJlLCBhbmQgdGhlbiBjb250aW51ZVxuICAgKiAgICAgICB0aGlzU3RlcC5zZXRJbnB1dFZhbHVlKCdmb28nKTtcbiAgICogICAgICAgbmV4dFN0ZXAodGhpc1N0ZXApO1xuICAgKiAgICAgICBicmVhaztcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwcmV2aW91c1N0ZXAgVGhlIHByZXZpb3VzIHN0ZXAgd2l0aCBpdHMgY2FsbGJhY2sgdmFsdWVzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJuIFRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBuZXh0KHQsIHIpIHtcbiAgICBjb25zdCBlID0gYXdhaXQgdy5uZXh0KHQgPyB0LnBheWxvYWQgOiB2b2lkIDAsIHIpO1xuICAgIGlmIChlLmF1dGhJZCkge1xuICAgICAgY29uc3QgYSA9IHIgPyByLmNhbGxiYWNrRmFjdG9yeSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBuZXcgUihlLCBhKTtcbiAgICB9XG4gICAgcmV0dXJuICFlLmF1dGhJZCAmJiBlLm9rID8gbmV3IGsoZSkgOiBuZXcgSShlKTtcbiAgfVxuICAvKipcbiAgICogUmVkaXJlY3RzIHRvIHRoZSBVUkwgaWRlbnRpZmllZCBpbiB0aGUgUmVkaXJlY3RDYWxsYmFjayBhbmQgc2F2ZXMgdGhlIGZ1bGxcbiAgICogc3RlcCBpbmZvcm1hdGlvbiB0byBsb2NhbFN0b3JhZ2UgZm9yIHJldHJpZXZhbCB3aGVuIHVzZXIgcmV0dXJucyBmcm9tIGxvZ2luLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBqc1xuICAgKiBmb3JnZXJvY2suRlJBdXRoLnJlZGlyZWN0KHN0ZXApO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyByZWRpcmVjdCh0KSB7XG4gICAgY29uc3QgZSA9IHQuZ2V0Q2FsbGJhY2tPZlR5cGUoeC5SZWRpcmVjdENhbGxiYWNrKS5nZXRSZWRpcmVjdFVybCgpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMucHJldmlvdXNTdGVwS2V5LCBKU09OLnN0cmluZ2lmeSh0KSksIGxvY2F0aW9uLmFzc2lnbihlKTtcbiAgfVxuICAvKipcbiAgICogUmVzdW1lcyBhIHRyZWUgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gYW4gZXh0ZXJuYWwgY2xpZW50IG9yIHByb3ZpZGVyLlxuICAgKiBSZXF1aXJlcyB0aGUgZnVsbCBVUkwgb2YgdGhlIGN1cnJlbnQgd2luZG93LiBJdCB3aWxsIHBhcnNlIFVSTCBmb3JcbiAgICoga2V5LXZhbHVlIHBhaXJzIGFzIHdlbGwgYXMsIGlmIHJlcXVpcmVkLCByZXRyaWV2ZXMgcHJldmlvdXMgc3RlcC5cbiAgICpcbiAgICogRXhhbXBsZTtcbiAgICogYGBganNcbiAgICogZm9yZ2Vyb2NrLkZSQXV0aC5yZXN1bWUod2luZG93LmxvY2F0aW9uLmhyZWYpXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlc3VtZSh0LCByKSB7XG4gICAgY29uc3QgZSA9IG5ldyBVUkwodCksIGEgPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJjb2RlXCIpLCBuID0gZS5zZWFyY2hQYXJhbXMuZ2V0KFwiZXJyb3JcIiksIGkgPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJlcnJvckNvZGVcIiksIG0gPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJlcnJvck1lc3NhZ2VcIiksIHMgPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJmb3JtX3Bvc3RfZW50cnlcIiksIGwgPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJub25jZVwiKSwgdSA9IGUuc2VhcmNoUGFyYW1zLmdldChcIlJlbGF5U3RhdGVcIiksIG8gPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJyZXNwb25zZWtleVwiKSwgZCA9IGUuc2VhcmNoUGFyYW1zLmdldChcInNjb3BlXCIpLCBjID0gZS5zZWFyY2hQYXJhbXMuZ2V0KFwic3RhdGVcIiksIHAgPSBlLnNlYXJjaFBhcmFtcy5nZXQoXCJzdXNwZW5kZWRJZFwiKSwgZyA9IGUuc2VhcmNoUGFyYW1zLmdldChcImF1dGhJbmRleFZhbHVlXCIpID8/IHZvaWQgMDtcbiAgICBsZXQgaDtcbiAgICBmdW5jdGlvbiBTKCkge1xuICAgICAgcmV0dXJuIGEgJiYgYyB8fCBzIHx8IG87XG4gICAgfVxuICAgIGlmIChTKCkpIHtcbiAgICAgIGNvbnN0IHkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnByZXZpb3VzU3RlcEtleSk7XG4gICAgICBpZiAoIXkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yOiBjb3VsZCBub3QgcmV0cmlldmUgb3JpZ2luYWwgcmVkaXJlY3QgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaCA9IEpTT04ucGFyc2UoeSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3I6IGNvdWxkIG5vdCBwYXJzZSByZWRpcmVjdCBwYXJhbXMgb3Igc3RlcCBpbmZvcm1hdGlvblwiKTtcbiAgICAgIH1cbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMucHJldmlvdXNTdGVwS2V5KTtcbiAgICB9XG4gICAgY29uc3QgUCA9IHtcbiAgICAgIC4uLnIsXG4gICAgICBxdWVyeToge1xuICAgICAgICAvLyBDb25kaXRpb25hbGx5IHNwcmVhZCBwcm9wZXJ0aWVzIGludG8gb2JqZWN0LiBEb24ndCBzcHJlYWQgcHJvcHMgd2l0aCB1bmRlZmluZWQvbnVsbC5cbiAgICAgICAgLi4uYSAmJiB7IGNvZGU6IGEgfSxcbiAgICAgICAgLi4ubiAmJiB7IGVycm9yOiBuIH0sXG4gICAgICAgIC4uLmkgJiYgeyBlcnJvckNvZGU6IGkgfSxcbiAgICAgICAgLi4ubSAmJiB7IGVycm9yTWVzc2FnZTogbSB9LFxuICAgICAgICAuLi5zICYmIHsgZm9ybV9wb3N0X2VudHJ5OiBzIH0sXG4gICAgICAgIC4uLmwgJiYgeyBub25jZTogbCB9LFxuICAgICAgICAuLi51ICYmIHsgUmVsYXlTdGF0ZTogdSB9LFxuICAgICAgICAuLi5vICYmIHsgcmVzcG9uc2VrZXk6IG8gfSxcbiAgICAgICAgLi4uZCAmJiB7IHNjb3BlOiBkIH0sXG4gICAgICAgIC4uLmMgJiYgeyBzdGF0ZTogYyB9LFxuICAgICAgICAuLi5wICYmIHsgc3VzcGVuZGVkSWQ6IHAgfSxcbiAgICAgICAgLy8gQWxsb3cgZGV2ZWxvcGVyIHRvIGFkZCBvciBvdmVycmlkZSBwYXJhbXMgd2l0aCB0aGVpciBvd24uXG4gICAgICAgIC4uLnIgJiYgci5xdWVyeVxuICAgICAgfSxcbiAgICAgIC4uLihyPy50cmVlID8/IGcpICYmIHtcbiAgICAgICAgdHJlZTogcj8udHJlZSA/PyBnXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5uZXh0KGgsIFApO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgYXV0aGVudGljYXRpb24gdHJlZS5cbiAgICogVGhpcyBpcyBlc3NlbnRpYWxseSBhbiBhbGlhcyB0byBjYWxsaW5nIEZSQXV0aC5uZXh0IHdpdGhvdXQgYSBwcmV2aW91cyBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJuIFRoZSBuZXh0IHN0ZXAgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHRyZWVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydCh0KSB7XG4gICAgcmV0dXJuIGF3YWl0IGYubmV4dCh2b2lkIDAsIHQpO1xuICB9XG59XG5leHBvcnQge1xuICBmIGFzIGRlZmF1bHRcbn07XG4iLCIvLyBzcmMvdXRpbHMvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS50c1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBgTWluaWZpZWQgUmVkdXggZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXguanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cblxuLy8gc3JjL3V0aWxzL3N5bWJvbC1vYnNlcnZhYmxlLnRzXG52YXIgJCRvYnNlcnZhYmxlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIikoKTtcbnZhciBzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0ID0gJCRvYnNlcnZhYmxlO1xuXG4vLyBzcmMvdXRpbHMvYWN0aW9uVHlwZXMudHNcbnZhciByYW5kb21TdHJpbmcgPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoXCJcIikuam9pbihcIi5cIik7XG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IGBAQHJlZHV4L0lOSVQkey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBSRVBMQUNFOiBgQEByZWR1eC9SRVBMQUNFJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046ICgpID0+IGBAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OJHtyYW5kb21TdHJpbmcoKX1gXG59O1xudmFyIGFjdGlvblR5cGVzX2RlZmF1bHQgPSBBY3Rpb25UeXBlcztcblxuLy8gc3JjL3V0aWxzL2lzUGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90byB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gbnVsbDtcbn1cblxuLy8gc3JjL3V0aWxzL2tpbmRPZi50c1xuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAodmFsID09PSBudWxsKVxuICAgIHJldHVybiBcIm51bGxcIjtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgIHJldHVybiBcImFycmF5XCI7XG4gIGlmIChpc0RhdGUodmFsKSlcbiAgICByZXR1cm4gXCJkYXRlXCI7XG4gIGlmIChpc0Vycm9yKHZhbCkpXG4gICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gY3Rvck5hbWUodmFsKTtcbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlIFwiU3ltYm9sXCI6XG4gICAgY2FzZSBcIlByb21pc2VcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiID8gdmFsLmNvbnN0cnVjdG9yLm5hbWUgOiBudWxsO1xufVxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsLnNldERhdGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgbGV0IHR5cGVPZlZhbCA9IHR5cGVvZiB2YWw7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB0eXBlT2ZWYWwgPSBtaW5pS2luZE9mKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLy8gc3JjL2NyZWF0ZVN0b3JlLnRzXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IGBFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YocmVkdWNlcil9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgZW5oYW5jZXIgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwiSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gdG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLlwiKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IGBFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihlbmhhbmNlcil9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuICBsZXQgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICBsZXQgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIGxldCBjdXJyZW50TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICBsZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuICBsZXQgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIsIGtleSkgPT4ge1xuICAgICAgICBuZXh0TGlzdGVuZXJzLnNldChrZXksIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFRoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IGBFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihsaXN0ZW5lcil9J2ApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcIllvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSBjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIGNvbnN0IGxpc3RlbmVySWQgPSBsaXN0ZW5lcklkQ291bnRlcisrO1xuICAgIG5leHRMaXN0ZW5lcnMuc2V0KGxpc3RlbmVySWQsIGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6IFwiWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLlwiKTtcbiAgICAgIH1cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgbmV4dExpc3RlbmVycy5kZWxldGUobGlzdGVuZXJJZCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IGBBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbil9Jy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBgQWN0aW9uIFwidHlwZVwiIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24udHlwZSl9Jy4gVmFsdWUgd2FzOiAnJHthY3Rpb24udHlwZX0nIChzdHJpbmdpZmllZClgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IGBFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihuZXh0UmVkdWNlcil9YCk7XG4gICAgfVxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSBcIm9iamVjdFwiIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogYEV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2Yob2JzZXJ2ZXIpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgY29uc3Qgb2JzZXJ2ZXJBc09ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgICAgICAgaWYgKG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gIH0pO1xuICBjb25zdCBzdG9yZSA9IHtcbiAgICBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXIsXG4gICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdOiBvYnNlcnZhYmxlXG4gIH07XG4gIHJldHVybiBzdG9yZTtcbn1cbmZ1bmN0aW9uIGxlZ2FjeV9jcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcik7XG59XG5cbi8vIHNyYy91dGlscy93YXJuaW5nLnRzXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxuLy8gc3JjL2NvbWJpbmVSZWR1Y2Vycy50c1xuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUID8gXCJwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmVcIiA6IFwicHJldmlvdXMgc3RhdGUgcmVjZWl2ZWQgYnkgdGhlIHJlZHVjZXJcIjtcbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlN0b3JlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByZWR1Y2VyLiBNYWtlIHN1cmUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuXCI7XG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0U3RhdGUpKSB7XG4gICAgcmV0dXJuIGBUaGUgJHthcmd1bWVudE5hbWV9IGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCIke2tpbmRPZihpbnB1dFN0YXRlKX1cIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCJgO1xuICB9XG4gIGNvbnN0IHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKChrZXkpID0+ICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSk7XG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRSlcbiAgICByZXR1cm47XG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGBVbmV4cGVjdGVkICR7dW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/IFwia2V5c1wiIDogXCJrZXlcIn0gXCIke3VuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpfVwiIGZvdW5kIGluICR7YXJndW1lbnROYW1lfS4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiR7cmVkdWNlcktleXMuam9pbignXCIsIFwiJyl9XCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuYDtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgeW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgdHlwZTogYWN0aW9uVHlwZXNfZGVmYXVsdC5QUk9CRV9VTktOT1dOX0FDVElPTigpXG4gICAgfSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gRG9uJ3QgdHJ5IHRvIGhhbmRsZSAnJHthY3Rpb25UeXBlc19kZWZhdWx0LklOSVR9JyBvciBvdGhlciBhY3Rpb25zIGluIFwicmVkdXgvKlwiIG5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5gKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBmaW5hbFJlZHVjZXJzID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgd2FybmluZyhgTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcbiAgbGV0IHVuZXhwZWN0ZWRLZXlDYWNoZTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG4gIGxldCBzaGFwZUFzc2VydGlvbkVycm9yO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgbmV4dFN0YXRlID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldO1xuICAgICAgY29uc3QgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNba2V5XTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgY29uc3QgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogYFdoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgJHthY3Rpb25UeXBlID8gYFwiJHtTdHJpbmcoYWN0aW9uVHlwZSl9XCJgIDogXCIodW5rbm93biB0eXBlKVwifSwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG4vLyBzcmMvYmluZEFjdGlvbkNyZWF0b3JzLnRzXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gXCJvYmplY3RcIiB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IGBiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnJHtraW5kT2YoYWN0aW9uQ3JlYXRvcnMpfScuIERpZCB5b3Ugd3JpdGUgXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiIGluc3RlYWQgb2YgXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXCI/YCk7XG4gIH1cbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vLyBzcmMvY29tcG9zZS50c1xuZnVuY3Rpb24gY29tcG9zZSguLi5mdW5jcykge1xuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhcmcpID0+IGFyZztcbiAgfVxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoKGEsIGIpID0+ICguLi5hcmdzKSA9PiBhKGIoLi4uYXJncykpKTtcbn1cblxuLy8gc3JjL2FwcGx5TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKC4uLm1pZGRsZXdhcmVzKSB7XG4gIHJldHVybiAoY3JlYXRlU3RvcmUyKSA9PiAocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlMihyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gICAgbGV0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiBPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guXCIpO1xuICAgIH07XG4gICAgY29uc3QgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIGRpc3BhdGNoOiAoYWN0aW9uLCAuLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb24sIC4uLmFyZ3MpXG4gICAgfTtcbiAgICBjb25zdCBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcCgobWlkZGxld2FyZSkgPT4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKSk7XG4gICAgZGlzcGF0Y2ggPSBjb21wb3NlKC4uLmNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0b3JlLFxuICAgICAgZGlzcGF0Y2hcbiAgICB9O1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMvaXNBY3Rpb24udHNcbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdChhY3Rpb24pICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCI7XG59XG5leHBvcnQge1xuICBhY3Rpb25UeXBlc19kZWZhdWx0IGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsXG4gIGFwcGx5TWlkZGxld2FyZSxcbiAgYmluZEFjdGlvbkNyZWF0b3JzLFxuICBjb21iaW5lUmVkdWNlcnMsXG4gIGNvbXBvc2UsXG4gIGNyZWF0ZVN0b3JlLFxuICBpc0FjdGlvbixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbGVnYWN5X2NyZWF0ZVN0b3JlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgubWpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKGV4dHJhQXJndW1lbnQpIHtcbiAgY29uc3QgbWlkZGxld2FyZSA9ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIG1pZGRsZXdhcmU7XG59XG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTtcbnZhciB3aXRoRXh0cmFBcmd1bWVudCA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZTtcbmV4cG9ydCB7XG4gIHRodW5rLFxuICB3aXRoRXh0cmFBcmd1bWVudFxufTtcbiIsIi8vIHNyYy91dGlscy9lbnYudHNcbnZhciBOT1RISU5HID0gU3ltYm9sLmZvcihcImltbWVyLW5vdGhpbmdcIik7XG52YXIgRFJBRlRBQkxFID0gU3ltYm9sLmZvcihcImltbWVyLWRyYWZ0YWJsZVwiKTtcbnZhciBEUkFGVF9TVEFURSA9IFN5bWJvbC5mb3IoXCJpbW1lci1zdGF0ZVwiKTtcblxuLy8gc3JjL3V0aWxzL2Vycm9ycy50c1xudmFyIGVycm9ycyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFtcbiAgLy8gQWxsIGVycm9yIGNvZGVzLCBzdGFydGluZyBieSAwOlxuICBmdW5jdGlvbihwbHVnaW4pIHtcbiAgICByZXR1cm4gYFRoZSBwbHVnaW4gZm9yICcke3BsdWdpbn0nIGhhcyBub3QgYmVlbiBsb2FkZWQgaW50byBJbW1lci4gVG8gZW5hYmxlIHRoZSBwbHVnaW4sIGltcG9ydCBhbmQgY2FsbCBcXGBlbmFibGUke3BsdWdpbn0oKVxcYCB3aGVuIGluaXRpYWxpemluZyB5b3VyIGFwcGxpY2F0aW9uLmA7XG4gIH0sXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGBwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICcke3RoaW5nfSdgO1xuICB9LFxuICBcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyb3plbiBhbmQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkXCIsXG4gIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gXCJDYW5ub3QgdXNlIGEgcHJveHkgdGhhdCBoYXMgYmVlbiByZXZva2VkLiBEaWQgeW91IHBhc3MgYW4gb2JqZWN0IGZyb20gaW5zaWRlIGFuIGltbWVyIGZ1bmN0aW9uIHRvIGFuIGFzeW5jIHByb2Nlc3M/IFwiICsgZGF0YTtcbiAgfSxcbiAgXCJBbiBpbW1lciBwcm9kdWNlciByZXR1cm5lZCBhIG5ldyB2YWx1ZSAqYW5kKiBtb2RpZmllZCBpdHMgZHJhZnQuIEVpdGhlciByZXR1cm4gYSBuZXcgdmFsdWUgKm9yKiBtb2RpZnkgdGhlIGRyYWZ0LlwiLFxuICBcIkltbWVyIGZvcmJpZHMgY2lyY3VsYXIgcmVmZXJlbmNlc1wiLFxuICBcIlRoZSBmaXJzdCBvciBzZWNvbmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvblwiLFxuICBcIlRoZSB0aGlyZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBjcmVhdGVEcmFmdGAgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgYW4gYXJyYXksIG9yIGFuIGltbWVyYWJsZSBvYmplY3RcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgZmluaXNoRHJhZnRgIG11c3QgYmUgYSBkcmFmdCByZXR1cm5lZCBieSBgY3JlYXRlRHJhZnRgXCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnY3VycmVudCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfSxcbiAgXCJPYmplY3QuZGVmaW5lUHJvcGVydHkoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIk9iamVjdC5zZXRQcm90b3R5cGVPZigpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBkZWxldGluZyBhcnJheSBpbmRpY2VzXCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eVwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ29yaWdpbmFsJyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9XG4gIC8vIE5vdGU6IGlmIG1vcmUgZXJyb3JzIGFyZSBhZGRlZCwgdGhlIGVycm9yT2Zmc2V0IGluIFBhdGNoZXMudHMgc2hvdWxkIGJlIGluY3JlYXNlZFxuICAvLyBTZWUgUGF0Y2hlcy50cyBmb3IgYWRkaXRpb25hbCBlcnJvcnNcbl0gOiBbXTtcbmZ1bmN0aW9uIGRpZShlcnJvciwgLi4uYXJncykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3QgZSA9IGVycm9yc1tlcnJvcl07XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIGUgPT09IFwiZnVuY3Rpb25cIiA/IGUuYXBwbHkobnVsbCwgYXJncykgOiBlO1xuICAgIHRocm93IG5ldyBFcnJvcihgW0ltbWVyXSAke21zZ31gKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFtJbW1lcl0gbWluaWZpZWQgZXJyb3IgbnI6ICR7ZXJyb3J9LiBGdWxsIGVycm9yIGF0OiBodHRwczovL2JpdC5seS8zY1hFS1dmYFxuICApO1xufVxuXG4vLyBzcmMvdXRpbHMvY29tbW9uLnRzXG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5mdW5jdGlvbiBpc0RyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICEhdmFsdWVbRFJBRlRfU1RBVEVdO1xufVxuZnVuY3Rpb24gaXNEcmFmdGFibGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAhIXZhbHVlW0RSQUZUQUJMRV0gfHwgISF2YWx1ZS5jb25zdHJ1Y3Rvcj8uW0RSQUZUQUJMRV0gfHwgaXNNYXAodmFsdWUpIHx8IGlzU2V0KHZhbHVlKTtcbn1cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpO1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBDdG9yID0gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIGlmIChDdG9yID09PSBPYmplY3QpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSBcImZ1bmN0aW9uXCIgJiYgRnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKSA9PT0gb2JqZWN0Q3RvclN0cmluZztcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDE1LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZVtEUkFGVF9TVEFURV0uYmFzZV87XG59XG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcikge1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA9PT0gMCAvKiBPYmplY3QgKi8pIHtcbiAgICBSZWZsZWN0Lm93bktleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGl0ZXIoa2V5LCBvYmpba2V5XSwgb2JqKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmouZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiBpdGVyKGluZGV4LCBlbnRyeSwgb2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEFyY2h0eXBlKHRoaW5nKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpbmdbRFJBRlRfU1RBVEVdO1xuICByZXR1cm4gc3RhdGUgPyBzdGF0ZS50eXBlXyA6IEFycmF5LmlzQXJyYXkodGhpbmcpID8gMSAvKiBBcnJheSAqLyA6IGlzTWFwKHRoaW5nKSA/IDIgLyogTWFwICovIDogaXNTZXQodGhpbmcpID8gMyAvKiBTZXQgKi8gOiAwIC8qIE9iamVjdCAqLztcbn1cbmZ1bmN0aW9uIGhhcyh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmhhcyhwcm9wKSA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGluZywgcHJvcCk7XG59XG5mdW5jdGlvbiBnZXQodGhpbmcsIHByb3ApIHtcbiAgcmV0dXJuIGdldEFyY2h0eXBlKHRoaW5nKSA9PT0gMiAvKiBNYXAgKi8gPyB0aGluZy5nZXQocHJvcCkgOiB0aGluZ1twcm9wXTtcbn1cbmZ1bmN0aW9uIHNldCh0aGluZywgcHJvcE9yT2xkVmFsdWUsIHZhbHVlKSB7XG4gIGNvbnN0IHQgPSBnZXRBcmNodHlwZSh0aGluZyk7XG4gIGlmICh0ID09PSAyIC8qIE1hcCAqLylcbiAgICB0aGluZy5zZXQocHJvcE9yT2xkVmFsdWUsIHZhbHVlKTtcbiAgZWxzZSBpZiAodCA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICB0aGluZy5hZGQodmFsdWUpO1xuICB9IGVsc2VcbiAgICB0aGluZ1twcm9wT3JPbGRWYWx1ZV0gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuZnVuY3Rpb24gaXNNYXAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNYXA7XG59XG5mdW5jdGlvbiBpc1NldCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFNldDtcbn1cbmZ1bmN0aW9uIGxhdGVzdChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuY29weV8gfHwgc3RhdGUuYmFzZV87XG59XG5mdW5jdGlvbiBzaGFsbG93Q29weShiYXNlLCBzdHJpY3QpIHtcbiAgaWYgKGlzTWFwKGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoYmFzZSk7XG4gIH1cbiAgaWYgKGlzU2V0KGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoYmFzZSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZSkpXG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJhc2UpO1xuICBjb25zdCBpc1BsYWluID0gaXNQbGFpbk9iamVjdChiYXNlKTtcbiAgaWYgKHN0cmljdCA9PT0gdHJ1ZSB8fCBzdHJpY3QgPT09IFwiY2xhc3Nfb25seVwiICYmICFpc1BsYWluKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhiYXNlKTtcbiAgICBkZWxldGUgZGVzY3JpcHRvcnNbRFJBRlRfU1RBVEVdO1xuICAgIGxldCBrZXlzID0gUmVmbGVjdC5vd25LZXlzKGRlc2NyaXB0b3JzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCBkZXNjID0gZGVzY3JpcHRvcnNba2V5XTtcbiAgICAgIGlmIChkZXNjLndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgICBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KVxuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0ge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAvLyBjb3VsZCBsaXZlIHdpdGggISFkZXNjLnNldCBhcyB3ZWxsIGhlcmUuLi5cbiAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICAgICAgdmFsdWU6IGJhc2Vba2V5XVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihiYXNlKSwgZGVzY3JpcHRvcnMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoYmFzZSk7XG4gICAgaWYgKHByb3RvICE9PSBudWxsICYmIGlzUGxhaW4pIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UgfTtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCBiYXNlKTtcbiAgfVxufVxuZnVuY3Rpb24gZnJlZXplKG9iaiwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmIChpc0Zyb3plbihvYmopIHx8IGlzRHJhZnQob2JqKSB8fCAhaXNEcmFmdGFibGUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA+IDEpIHtcbiAgICBvYmouc2V0ID0gb2JqLmFkZCA9IG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnM7XG4gIH1cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuICBpZiAoZGVlcClcbiAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gZnJlZXplKHZhbHVlLCB0cnVlKSk7XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnMoKSB7XG4gIGRpZSgyKTtcbn1cbmZ1bmN0aW9uIGlzRnJvemVuKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmlzRnJvemVuKG9iaik7XG59XG5cbi8vIHNyYy91dGlscy9wbHVnaW5zLnRzXG52YXIgcGx1Z2lucyA9IHt9O1xuZnVuY3Rpb24gZ2V0UGx1Z2luKHBsdWdpbktleSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbktleV07XG4gIGlmICghcGx1Z2luKSB7XG4gICAgZGllKDAsIHBsdWdpbktleSk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbjtcbn1cbmZ1bmN0aW9uIGxvYWRQbHVnaW4ocGx1Z2luS2V5LCBpbXBsZW1lbnRhdGlvbikge1xuICBpZiAoIXBsdWdpbnNbcGx1Z2luS2V5XSlcbiAgICBwbHVnaW5zW3BsdWdpbktleV0gPSBpbXBsZW1lbnRhdGlvbjtcbn1cblxuLy8gc3JjL2NvcmUvc2NvcGUudHNcbnZhciBjdXJyZW50U2NvcGU7XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGU7XG59XG5mdW5jdGlvbiBjcmVhdGVTY29wZShwYXJlbnRfLCBpbW1lcl8pIHtcbiAgcmV0dXJuIHtcbiAgICBkcmFmdHNfOiBbXSxcbiAgICBwYXJlbnRfLFxuICAgIGltbWVyXyxcbiAgICAvLyBXaGVuZXZlciB0aGUgbW9kaWZpZWQgZHJhZnQgY29udGFpbnMgYSBkcmFmdCBmcm9tIGFub3RoZXIgc2NvcGUsIHdlXG4gICAgLy8gbmVlZCB0byBwcmV2ZW50IGF1dG8tZnJlZXppbmcgc28gdGhlIHVub3duZWQgZHJhZnQgY2FuIGJlIGZpbmFsaXplZC5cbiAgICBjYW5BdXRvRnJlZXplXzogdHJ1ZSxcbiAgICB1bmZpbmFsaXplZERyYWZ0c186IDBcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKSB7XG4gIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKTtcbiAgICBzY29wZS5wYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLmludmVyc2VQYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfID0gcGF0Y2hMaXN0ZW5lcjtcbiAgfVxufVxuZnVuY3Rpb24gcmV2b2tlU2NvcGUoc2NvcGUpIHtcbiAgbGVhdmVTY29wZShzY29wZSk7XG4gIHNjb3BlLmRyYWZ0c18uZm9yRWFjaChyZXZva2VEcmFmdCk7XG4gIHNjb3BlLmRyYWZ0c18gPSBudWxsO1xufVxuZnVuY3Rpb24gbGVhdmVTY29wZShzY29wZSkge1xuICBpZiAoc2NvcGUgPT09IGN1cnJlbnRTY29wZSkge1xuICAgIGN1cnJlbnRTY29wZSA9IHNjb3BlLnBhcmVudF87XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyU2NvcGUoaW1tZXIyKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGUgPSBjcmVhdGVTY29wZShjdXJyZW50U2NvcGUsIGltbWVyMik7XG59XG5mdW5jdGlvbiByZXZva2VEcmFmdChkcmFmdCkge1xuICBjb25zdCBzdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgaWYgKHN0YXRlLnR5cGVfID09PSAwIC8qIE9iamVjdCAqLyB8fCBzdGF0ZS50eXBlXyA9PT0gMSAvKiBBcnJheSAqLylcbiAgICBzdGF0ZS5yZXZva2VfKCk7XG4gIGVsc2VcbiAgICBzdGF0ZS5yZXZva2VkXyA9IHRydWU7XG59XG5cbi8vIHNyYy9jb3JlL2ZpbmFsaXplLnRzXG5mdW5jdGlvbiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpIHtcbiAgc2NvcGUudW5maW5hbGl6ZWREcmFmdHNfID0gc2NvcGUuZHJhZnRzXy5sZW5ndGg7XG4gIGNvbnN0IGJhc2VEcmFmdCA9IHNjb3BlLmRyYWZ0c19bMF07XG4gIGNvbnN0IGlzUmVwbGFjZWQgPSByZXN1bHQgIT09IHZvaWQgMCAmJiByZXN1bHQgIT09IGJhc2VEcmFmdDtcbiAgaWYgKGlzUmVwbGFjZWQpIHtcbiAgICBpZiAoYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5tb2RpZmllZF8pIHtcbiAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgIGRpZSg0KTtcbiAgICB9XG4gICAgaWYgKGlzRHJhZnRhYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCByZXN1bHQpO1xuICAgICAgaWYgKCFzY29wZS5wYXJlbnRfKVxuICAgICAgICBtYXliZUZyZWV6ZShzY29wZSwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKHNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhcbiAgICAgICAgYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5iYXNlXyxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBzY29wZS5wYXRjaGVzXyxcbiAgICAgICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgYmFzZURyYWZ0LCBbXSk7XG4gIH1cbiAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyhzY29wZS5wYXRjaGVzXywgc2NvcGUuaW52ZXJzZVBhdGNoZXNfKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICE9PSBOT1RISU5HID8gcmVzdWx0IDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZmluYWxpemUocm9vdFNjb3BlLCB2YWx1ZSwgcGF0aCkge1xuICBpZiAoaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGlmICghc3RhdGUpIHtcbiAgICBlYWNoKFxuICAgICAgdmFsdWUsXG4gICAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgc3RhdGUsIHZhbHVlLCBrZXksIGNoaWxkVmFsdWUsIHBhdGgpXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHN0YXRlLnNjb3BlXyAhPT0gcm9vdFNjb3BlKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIHN0YXRlLmJhc2VfLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gIH1cbiAgaWYgKCFzdGF0ZS5maW5hbGl6ZWRfKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgc3RhdGUuc2NvcGVfLnVuZmluYWxpemVkRHJhZnRzXy0tO1xuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmNvcHlfO1xuICAgIGxldCByZXN1bHRFYWNoID0gcmVzdWx0O1xuICAgIGxldCBpc1NldDIgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUudHlwZV8gPT09IDMgLyogU2V0ICovKSB7XG4gICAgICByZXN1bHRFYWNoID0gbmV3IFNldChyZXN1bHQpO1xuICAgICAgcmVzdWx0LmNsZWFyKCk7XG4gICAgICBpc1NldDIgPSB0cnVlO1xuICAgIH1cbiAgICBlYWNoKFxuICAgICAgcmVzdWx0RWFjaCxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgcmVzdWx0LCBrZXksIGNoaWxkVmFsdWUsIHBhdGgsIGlzU2V0MilcbiAgICApO1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgcmVzdWx0LCBmYWxzZSk7XG4gICAgaWYgKHBhdGggJiYgcm9vdFNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUGF0Y2hlc18oXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwYXRoLFxuICAgICAgICByb290U2NvcGUucGF0Y2hlc18sXG4gICAgICAgIHJvb3RTY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGF0ZS5jb3B5Xztcbn1cbmZ1bmN0aW9uIGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBwYXJlbnRTdGF0ZSwgdGFyZ2V0T2JqZWN0LCBwcm9wLCBjaGlsZFZhbHVlLCByb290UGF0aCwgdGFyZ2V0SXNTZXQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBjaGlsZFZhbHVlID09PSB0YXJnZXRPYmplY3QpXG4gICAgZGllKDUpO1xuICBpZiAoaXNEcmFmdChjaGlsZFZhbHVlKSkge1xuICAgIGNvbnN0IHBhdGggPSByb290UGF0aCAmJiBwYXJlbnRTdGF0ZSAmJiBwYXJlbnRTdGF0ZS50eXBlXyAhPT0gMyAvKiBTZXQgKi8gJiYgLy8gU2V0IG9iamVjdHMgYXJlIGF0b21pYyBzaW5jZSB0aGV5IGhhdmUgbm8ga2V5cy5cbiAgICAhaGFzKHBhcmVudFN0YXRlLmFzc2lnbmVkXywgcHJvcCkgPyByb290UGF0aC5jb25jYXQocHJvcCkgOiB2b2lkIDA7XG4gICAgY29uc3QgcmVzID0gZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlLCBwYXRoKTtcbiAgICBzZXQodGFyZ2V0T2JqZWN0LCBwcm9wLCByZXMpO1xuICAgIGlmIChpc0RyYWZ0KHJlcykpIHtcbiAgICAgIHJvb3RTY29wZS5jYW5BdXRvRnJlZXplXyA9IGZhbHNlO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHRhcmdldElzU2V0KSB7XG4gICAgdGFyZ2V0T2JqZWN0LmFkZChjaGlsZFZhbHVlKTtcbiAgfVxuICBpZiAoaXNEcmFmdGFibGUoY2hpbGRWYWx1ZSkgJiYgIWlzRnJvemVuKGNoaWxkVmFsdWUpKSB7XG4gICAgaWYgKCFyb290U2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHJvb3RTY29wZS51bmZpbmFsaXplZERyYWZ0c18gPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbmFsaXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gICAgaWYgKCghcGFyZW50U3RhdGUgfHwgIXBhcmVudFN0YXRlLnNjb3BlXy5wYXJlbnRfKSAmJiB0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0T2JqZWN0LCBwcm9wKSlcbiAgICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1heWJlRnJlZXplKHNjb3BlLCB2YWx1ZSwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmICghc2NvcGUucGFyZW50XyAmJiBzY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgc2NvcGUuY2FuQXV0b0ZyZWV6ZV8pIHtcbiAgICBmcmVlemUodmFsdWUsIGRlZXApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL3Byb3h5LnRzXG5mdW5jdGlvbiBjcmVhdGVQcm94eVByb3h5KGJhc2UsIHBhcmVudCkge1xuICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKTtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgdHlwZV86IGlzQXJyYXkgPyAxIC8qIEFycmF5ICovIDogMCAvKiBPYmplY3QgKi8sXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvZHVjZSBjYWxsIHRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgIC8vIFRydWUgZm9yIGJvdGggc2hhbGxvdyBhbmQgZGVlcCBjaGFuZ2VzLlxuICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgLy8gVXNlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGFzc2lnbmVkICh0cnVlKSBvciBkZWxldGVkIChmYWxzZSkuXG4gICAgYXNzaWduZWRfOiB7fSxcbiAgICAvLyBUaGUgcGFyZW50IGRyYWZ0IHN0YXRlLlxuICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAvLyBUaGUgYmFzZSBzdGF0ZS5cbiAgICBiYXNlXzogYmFzZSxcbiAgICAvLyBUaGUgYmFzZSBwcm94eS5cbiAgICBkcmFmdF86IG51bGwsXG4gICAgLy8gc2V0IGJlbG93XG4gICAgLy8gVGhlIGJhc2UgY29weSB3aXRoIGFueSB1cGRhdGVkIHZhbHVlcy5cbiAgICBjb3B5XzogbnVsbCxcbiAgICAvLyBDYWxsZWQgYnkgdGhlIGBwcm9kdWNlYCBmdW5jdGlvbi5cbiAgICByZXZva2VfOiBudWxsLFxuICAgIGlzTWFudWFsXzogZmFsc2VcbiAgfTtcbiAgbGV0IHRhcmdldCA9IHN0YXRlO1xuICBsZXQgdHJhcHMgPSBvYmplY3RUcmFwcztcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICB0YXJnZXQgPSBbc3RhdGVdO1xuICAgIHRyYXBzID0gYXJyYXlUcmFwcztcbiAgfVxuICBjb25zdCB7IHJldm9rZSwgcHJveHkgfSA9IFByb3h5LnJldm9jYWJsZSh0YXJnZXQsIHRyYXBzKTtcbiAgc3RhdGUuZHJhZnRfID0gcHJveHk7XG4gIHN0YXRlLnJldm9rZV8gPSByZXZva2U7XG4gIHJldHVybiBwcm94eTtcbn1cbnZhciBvYmplY3RUcmFwcyA9IHtcbiAgZ2V0KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IERSQUZUX1NUQVRFKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKCFoYXMoc291cmNlLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcbiAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gcGVlayhzdGF0ZS5iYXNlXywgcHJvcCkpIHtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5X1twcm9wXSA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgaGFzKHN0YXRlLCBwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gbGF0ZXN0KHN0YXRlKTtcbiAgfSxcbiAgb3duS2V5cyhzdGF0ZSkge1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobGF0ZXN0KHN0YXRlKSk7XG4gIH0sXG4gIHNldChzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICBpZiAoZGVzYz8uc2V0KSB7XG4gICAgICBkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgICBjb25zdCBjdXJyZW50MiA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjdXJyZW50Mj8uW0RSQUZUX1NUQVRFXTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLmJhc2VfID09PSB2YWx1ZSkge1xuICAgICAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXModmFsdWUsIGN1cnJlbnQyKSAmJiAodmFsdWUgIT09IHZvaWQgMCB8fCBoYXMoc3RhdGUuYmFzZV8sIHByb3ApKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5X1twcm9wXSA9PT0gdmFsdWUgJiYgLy8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgbmV3IHByb3BzIHdpdGggdmFsdWUgJ3VuZGVmaW5lZCdcbiAgICAodmFsdWUgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmNvcHlfKSB8fCAvLyBzcGVjaWFsIGNhc2U6IE5hTlxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgJiYgTnVtYmVyLmlzTmFOKHN0YXRlLmNvcHlfW3Byb3BdKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocGVlayhzdGF0ZS5iYXNlXywgcHJvcCkgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmJhc2VfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHN0YXRlLmFzc2lnbmVkX1twcm9wXTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfKSB7XG4gICAgICBkZWxldGUgc3RhdGUuY29weV9bcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBOb3RlOiBXZSBuZXZlciBjb2VyY2UgYGRlc2MudmFsdWVgIGludG8gYW4gSW1tZXIgZHJhZnQsIGJlY2F1c2Ugd2UgY2FuJ3QgbWFrZVxuICAvLyB0aGUgc2FtZSBndWFyYW50ZWUgaW4gRVM1IG1vZGUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdGF0ZSwgcHJvcCkge1xuICAgIGNvbnN0IG93bmVyID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBjb25zdCBkZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApO1xuICAgIGlmICghZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHJldHVybiB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogc3RhdGUudHlwZV8gIT09IDEgLyogQXJyYXkgKi8gfHwgcHJvcCAhPT0gXCJsZW5ndGhcIixcbiAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgIHZhbHVlOiBvd25lcltwcm9wXVxuICAgIH07XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KCkge1xuICAgIGRpZSgxMSk7XG4gIH0sXG4gIGdldFByb3RvdHlwZU9mKHN0YXRlKSB7XG4gICAgcmV0dXJuIGdldFByb3RvdHlwZU9mKHN0YXRlLmJhc2VfKTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoKSB7XG4gICAgZGllKDEyKTtcbiAgfVxufTtcbnZhciBhcnJheVRyYXBzID0ge307XG5lYWNoKG9iamVjdFRyYXBzLCAoa2V5LCBmbikgPT4ge1xuICBhcnJheVRyYXBzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF1bMF07XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KTtcbmFycmF5VHJhcHMuZGVsZXRlUHJvcGVydHkgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTMpO1xuICByZXR1cm4gYXJyYXlUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZSwgcHJvcCwgdm9pZCAwKTtcbn07XG5hcnJheVRyYXBzLnNldCA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHByb3AgIT09IFwibGVuZ3RoXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxNCk7XG4gIHJldHVybiBvYmplY3RUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZVswXSwgcHJvcCwgdmFsdWUsIHN0YXRlWzBdKTtcbn07XG5mdW5jdGlvbiBwZWVrKGRyYWZ0LCBwcm9wKSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBjb25zdCBzb3VyY2UgPSBzdGF0ZSA/IGxhdGVzdChzdGF0ZSkgOiBkcmFmdDtcbiAgcmV0dXJuIHNvdXJjZVtwcm9wXTtcbn1cbmZ1bmN0aW9uIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApIHtcbiAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKTtcbiAgcmV0dXJuIGRlc2MgPyBgdmFsdWVgIGluIGRlc2MgPyBkZXNjLnZhbHVlIDogKFxuICAgIC8vIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgaWYgdGhlIHByb3AgaXMgYSBnZXR0ZXIgZGVmaW5lZCBieSB0aGVcbiAgICAvLyBwcm90b3R5cGUsIHdlIHNob3VsZCBpbnZva2UgaXQgd2l0aCB0aGUgZHJhZnQgYXMgY29udGV4dCFcbiAgICBkZXNjLmdldD8uY2FsbChzdGF0ZS5kcmFmdF8pXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCkge1xuICBpZiAoIShwcm9wIGluIHNvdXJjZSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcbiAgd2hpbGUgKHByb3RvKSB7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3ApO1xuICAgIGlmIChkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHN0YXRlKSB7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgc3RhdGUubW9kaWZpZWRfID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUucGFyZW50Xykge1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUucGFyZW50Xyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlQ29weShzdGF0ZSkge1xuICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShcbiAgICAgIHN0YXRlLmJhc2VfLFxuICAgICAgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV9cbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL2ltbWVyQ2xhc3MudHNcbnZhciBJbW1lcjIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB0cnVlO1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWNlYCBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIGFuZCBhIFwicmVjaXBlIGZ1bmN0aW9uXCIgKHdob3NlXG4gICAgICogcmV0dXJuIHZhbHVlIG9mdGVuIGRlcGVuZHMgb24gdGhlIGJhc2Ugc3RhdGUpLiBUaGUgcmVjaXBlIGZ1bmN0aW9uIGlzXG4gICAgICogZnJlZSB0byBtdXRhdGUgaXRzIGZpcnN0IGFyZ3VtZW50IGhvd2V2ZXIgaXQgd2FudHMuIEFsbCBtdXRhdGlvbnMgYXJlXG4gICAgICogb25seSBldmVyIGFwcGxpZWQgdG8gYSBfX2NvcHlfXyBvZiB0aGUgYmFzZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBhc3Mgb25seSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFwiY3VycmllZCBwcm9kdWNlclwiIHdoaWNoIHJlbGlldmVzIHlvdVxuICAgICAqIGZyb20gcGFzc2luZyB0aGUgcmVjaXBlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUuXG4gICAgICpcbiAgICAgKiBPbmx5IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcmUgbWFkZSBtdXRhYmxlLiBBbGwgb3RoZXIgb2JqZWN0cyBhcmVcbiAgICAgKiBjb25zaWRlcmVkIHVuY29weWFibGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIF9fYm91bmRfXyB0byBpdHMgYEltbWVyYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSBiYXNlIC0gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWNpcGUgLSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgcHJveHkgb2YgdGhlIGJhc2Ugc3RhdGUgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHdoaWNoIGNhbiBiZSBmcmVlbHkgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXRjaExpc3RlbmVyIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB0aGUgcGF0Y2hlcyBwcm9kdWNlZCBoZXJlXG4gICAgICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG4gICAgICovXG4gICAgdGhpcy5wcm9kdWNlID0gKGJhc2UsIHJlY2lwZSwgcGF0Y2hMaXN0ZW5lcikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRCYXNlID0gcmVjaXBlO1xuICAgICAgICByZWNpcGUgPSBiYXNlO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWRQcm9kdWNlKGJhc2UyID0gZGVmYXVsdEJhc2UsIC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5wcm9kdWNlKGJhc2UyLCAoZHJhZnQpID0+IHJlY2lwZS5jYWxsKHRoaXMsIGRyYWZ0LCAuLi5hcmdzKSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBkaWUoNik7XG4gICAgICBpZiAocGF0Y2hMaXN0ZW5lciAhPT0gdm9pZCAwICYmIHR5cGVvZiBwYXRjaExpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg3KTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoaXNEcmFmdGFibGUoYmFzZSkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgICAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVjaXBlKHByb3h5KTtcbiAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChoYXNFcnJvcilcbiAgICAgICAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpO1xuICAgICAgfSBlbHNlIGlmICghYmFzZSB8fCB0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXN1bHQgPSByZWNpcGUoYmFzZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMClcbiAgICAgICAgICByZXN1bHQgPSBiYXNlO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBOT1RISU5HKVxuICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZyZWV6ZV8pXG4gICAgICAgICAgZnJlZXplKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgICAgICAgY29uc3QgcCA9IFtdO1xuICAgICAgICAgIGNvbnN0IGlwID0gW107XG4gICAgICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZSwgcmVzdWx0LCBwLCBpcCk7XG4gICAgICAgICAgcGF0Y2hMaXN0ZW5lcihwLCBpcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkaWUoMSwgYmFzZSk7XG4gICAgfTtcbiAgICB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyA9IChiYXNlLCByZWNpcGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUsIC4uLmFyZ3MpID0+IHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzKHN0YXRlLCAoZHJhZnQpID0+IGJhc2UoZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvZHVjZShiYXNlLCByZWNpcGUsIChwLCBpcCkgPT4ge1xuICAgICAgICBwYXRjaGVzID0gcDtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMgPSBpcDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtyZXN1bHQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzXTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy5hdXRvRnJlZXplID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0QXV0b0ZyZWV6ZShjb25maWcuYXV0b0ZyZWV6ZSk7XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LnVzZVN0cmljdFNoYWxsb3dDb3B5ID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkoY29uZmlnLnVzZVN0cmljdFNoYWxsb3dDb3B5KTtcbiAgfVxuICBjcmVhdGVEcmFmdChiYXNlKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShiYXNlKSlcbiAgICAgIGRpZSg4KTtcbiAgICBpZiAoaXNEcmFmdChiYXNlKSlcbiAgICAgIGJhc2UgPSBjdXJyZW50KGJhc2UpO1xuICAgIGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKTtcbiAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgcHJveHlbRFJBRlRfU1RBVEVdLmlzTWFudWFsXyA9IHRydWU7XG4gICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG4gIGZpbmlzaERyYWZ0KGRyYWZ0LCBwYXRjaExpc3RlbmVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBkcmFmdCAmJiBkcmFmdFtEUkFGVF9TVEFURV07XG4gICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuaXNNYW51YWxfKVxuICAgICAgZGllKDkpO1xuICAgIGNvbnN0IHsgc2NvcGVfOiBzY29wZSB9ID0gc3RhdGU7XG4gICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHZvaWQgMCwgc2NvcGUpO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gYXV0b21hdGljYWxseSBmcmVlemUgYWxsIGNvcGllcyBjcmVhdGVkIGJ5IEltbWVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhdXRvLWZyZWV6aW5nIGlzIGVuYWJsZWQuXG4gICAqL1xuICBzZXRBdXRvRnJlZXplKHZhbHVlKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gZW5hYmxlIHN0cmljdCBzaGFsbG93IGNvcHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGltbWVyIGRvZXMgbm90IGNvcHkgdGhlIG9iamVjdCBkZXNjcmlwdG9ycyBzdWNoIGFzIGdldHRlciwgc2V0dGVyIGFuZCBub24tZW51bXJhYmxlIHByb3BlcnRpZXMuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSh2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gdmFsdWU7XG4gIH1cbiAgYXBwbHlQYXRjaGVzKGJhc2UsIHBhdGNoZXMpIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSBwYXRjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDAgJiYgcGF0Y2gub3AgPT09IFwicmVwbGFjZVwiKSB7XG4gICAgICAgIGJhc2UgPSBwYXRjaC52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHBhdGNoZXMgPSBwYXRjaGVzLnNsaWNlKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3QgYXBwbHlQYXRjaGVzSW1wbCA9IGdldFBsdWdpbihcIlBhdGNoZXNcIikuYXBwbHlQYXRjaGVzXztcbiAgICBpZiAoaXNEcmFmdChiYXNlKSkge1xuICAgICAgcmV0dXJuIGFwcGx5UGF0Y2hlc0ltcGwoYmFzZSwgcGF0Y2hlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb2R1Y2UoXG4gICAgICBiYXNlLFxuICAgICAgKGRyYWZ0KSA9PiBhcHBseVBhdGNoZXNJbXBsKGRyYWZ0LCBwYXRjaGVzKVxuICAgICk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQcm94eSh2YWx1ZSwgcGFyZW50KSB7XG4gIGNvbnN0IGRyYWZ0ID0gaXNNYXAodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5TWFwXyh2YWx1ZSwgcGFyZW50KSA6IGlzU2V0KHZhbHVlKSA/IGdldFBsdWdpbihcIk1hcFNldFwiKS5wcm94eVNldF8odmFsdWUsIHBhcmVudCkgOiBjcmVhdGVQcm94eVByb3h5KHZhbHVlLCBwYXJlbnQpO1xuICBjb25zdCBzY29wZSA9IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKTtcbiAgc2NvcGUuZHJhZnRzXy5wdXNoKGRyYWZ0KTtcbiAgcmV0dXJuIGRyYWZ0O1xufVxuXG4vLyBzcmMvY29yZS9jdXJyZW50LnRzXG5mdW5jdGlvbiBjdXJyZW50KHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDEwLCB2YWx1ZSk7XG4gIHJldHVybiBjdXJyZW50SW1wbCh2YWx1ZSk7XG59XG5mdW5jdGlvbiBjdXJyZW50SW1wbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnRhYmxlKHZhbHVlKSB8fCBpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgbGV0IGNvcHk7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKVxuICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV8pO1xuICB9IGVsc2Uge1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgdHJ1ZSk7XG4gIH1cbiAgZWFjaChjb3B5LCAoa2V5LCBjaGlsZFZhbHVlKSA9PiB7XG4gICAgc2V0KGNvcHksIGtleSwgY3VycmVudEltcGwoY2hpbGRWYWx1ZSkpO1xuICB9KTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBzcmMvcGx1Z2lucy9wYXRjaGVzLnRzXG5mdW5jdGlvbiBlbmFibGVQYXRjaGVzKCkge1xuICBjb25zdCBlcnJvck9mZnNldCA9IDE2O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAnU2V0cyBjYW5ub3QgaGF2ZSBcInJlcGxhY2VcIiBwYXRjaGVzLicsXG4gICAgICBmdW5jdGlvbihvcCkge1xuICAgICAgICByZXR1cm4gXCJVbnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246IFwiICsgb3A7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gXCJDYW5ub3QgYXBwbHkgcGF0Y2gsIHBhdGggZG9lc24ndCByZXNvbHZlOiBcIiArIHBhdGg7XG4gICAgICB9LFxuICAgICAgXCJQYXRjaGluZyByZXNlcnZlZCBhdHRyaWJ1dGVzIGxpa2UgX19wcm90b19fLCBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIGlzIG5vdCBhbGxvd2VkXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IFJFUExBQ0UgPSBcInJlcGxhY2VcIjtcbiAgY29uc3QgQUREID0gXCJhZGRcIjtcbiAgY29uc3QgUkVNT1ZFID0gXCJyZW1vdmVcIjtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzXyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgc3dpdGNoIChzdGF0ZS50eXBlXykge1xuICAgICAgY2FzZSAwIC8qIE9iamVjdCAqLzpcbiAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcyk7XG4gICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXRQYXRjaGVzKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBhc3NpZ25lZF8gfSA9IHN0YXRlO1xuICAgIGxldCBjb3B5XyA9IHN0YXRlLmNvcHlfO1xuICAgIGlmIChjb3B5Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcbiAgICAgIDtcbiAgICAgIFtiYXNlXywgY29weV9dID0gW2NvcHlfLCBiYXNlX107XG4gICAgICBbcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gW2ludmVyc2VQYXRjaGVzLCBwYXRjaGVzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXNlXy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFzc2lnbmVkX1tpXSAmJiBjb3B5X1tpXSAhPT0gYmFzZV9baV0pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoYmFzZV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYmFzZV8ubGVuZ3RoOyBpIDwgY29weV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBBREQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBjb3B5Xy5sZW5ndGggLSAxOyBiYXNlXy5sZW5ndGggPD0gaTsgLS1pKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgY29uc3QgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGVhY2goc3RhdGUuYXNzaWduZWRfLCAoa2V5LCBhc3NpZ25lZFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcmlnVmFsdWUgPSBnZXQoYmFzZV8sIGtleSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldChjb3B5Xywga2V5KTtcbiAgICAgIGNvbnN0IG9wID0gIWFzc2lnbmVkVmFsdWUgPyBSRU1PVkUgOiBoYXMoYmFzZV8sIGtleSkgPyBSRVBMQUNFIDogQUREO1xuICAgICAgaWYgKG9yaWdWYWx1ZSA9PT0gdmFsdWUgJiYgb3AgPT09IFJFUExBQ0UpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoa2V5KTtcbiAgICAgIHBhdGNoZXMucHVzaChvcCA9PT0gUkVNT1ZFID8geyBvcCwgcGF0aCB9IDogeyBvcCwgcGF0aCwgdmFsdWUgfSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKFxuICAgICAgICBvcCA9PT0gQUREID8geyBvcDogUkVNT1ZFLCBwYXRoIH0gOiBvcCA9PT0gUkVNT1ZFID8geyBvcDogQURELCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9IDogeyBvcDogUkVQTEFDRSwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVNldFBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgbGV0IGkgPSAwO1xuICAgIGJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWNvcHlfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICAgIGkgPSAwO1xuICAgIGNvcHlfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWJhc2VfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlVmFsdWUsIHJlcGxhY2VtZW50LCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IHJlcGxhY2VtZW50ID09PSBOT1RISU5HID8gdm9pZCAwIDogcmVwbGFjZW1lbnRcbiAgICB9KTtcbiAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogYmFzZVZhbHVlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gYXBwbHlQYXRjaGVzXyhkcmFmdCwgcGF0Y2hlcykge1xuICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHsgcGF0aCwgb3AgfSA9IHBhdGNoO1xuICAgICAgbGV0IGJhc2UgPSBkcmFmdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFyZW50VHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgICBsZXQgcCA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgcCAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgcCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHAgPSBcIlwiICsgcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmVudFR5cGUgPT09IDAgLyogT2JqZWN0ICovIHx8IHBhcmVudFR5cGUgPT09IDEgLyogQXJyYXkgKi8pICYmIChwID09PSBcIl9fcHJvdG9fX1wiIHx8IHAgPT09IFwiY29uc3RydWN0b3JcIikpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHAgPT09IFwicHJvdG90eXBlXCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGJhc2UgPSBnZXQoYmFzZSwgcCk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAyLCBwYXRoLmpvaW4oXCIvXCIpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVlcENsb25lUGF0Y2hWYWx1ZShwYXRjaC52YWx1ZSk7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2UgUkVQTEFDRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIGRpZShlcnJvck9mZnNldCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEFERDpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGtleSA9PT0gXCItXCIgPyBiYXNlLnB1c2godmFsdWUpIDogYmFzZS5zcGxpY2Uoa2V5LCAwLCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5hZGQodmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRU1PVkU6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNwbGljZShrZXksIDEpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUocGF0Y2gudmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBiYXNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDEsIG9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZHJhZnQ7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgICByZXR1cm4gb2JqO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpXG4gICAgICByZXR1cm4gb2JqLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKTtcbiAgICBpZiAoaXNNYXAob2JqKSlcbiAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICBBcnJheS5mcm9tKG9iai5lbnRyaWVzKCkpLm1hcCgoW2ssIHZdKSA9PiBbaywgZGVlcENsb25lUGF0Y2hWYWx1ZSh2KV0pXG4gICAgICApO1xuICAgIGlmIChpc1NldChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShvYmopLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKSk7XG4gICAgY29uc3QgY2xvbmVkID0gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihvYmopKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopXG4gICAgICBjbG9uZWRba2V5XSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqW2tleV0pO1xuICAgIGlmIChoYXMob2JqLCBEUkFGVEFCTEUpKVxuICAgICAgY2xvbmVkW0RSQUZUQUJMRV0gPSBvYmpbRFJBRlRBQkxFXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9iaikge1xuICAgIGlmIChpc0RyYWZ0KG9iaikpIHtcbiAgICAgIHJldHVybiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaik7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gb2JqO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJQYXRjaGVzXCIsIHtcbiAgICBhcHBseVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfXG4gIH0pO1xufVxuXG4vLyBzcmMvcGx1Z2lucy9tYXBzZXQudHNcbmZ1bmN0aW9uIGVuYWJsZU1hcFNldCgpIHtcbiAgY2xhc3MgRHJhZnRNYXAgZXh0ZW5kcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAyIC8qIE1hcCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGFzc2lnbmVkXzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2UsXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5oYXMoa2V5KTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFsYXRlc3Qoc3RhdGUpLmhhcyhrZXkpIHx8IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSkgIT09IHZhbHVlKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5iYXNlXy5oYXMoa2V5KSkge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAgc3RhdGUuY29weV8uZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIGVhY2goc3RhdGUuYmFzZV8sIChrZXkpID0+IHtcbiAgICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGxhdGVzdChzdGF0ZSkuZm9yRWFjaCgoX3ZhbHVlLCBrZXksIF9tYXApID0+IHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCB0aGlzLmdldChrZXkpLCBrZXksIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgY29uc3QgdmFsdWUgPSBsYXRlc3Qoc3RhdGUpLmdldChrZXkpO1xuICAgICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT09IHN0YXRlLmJhc2VfLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIGRyYWZ0KTtcbiAgICAgIHJldHVybiBkcmFmdDtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmtleXMoKTtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLnZhbHVlcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMuZW50cmllcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogW3IudmFsdWUsIHZhbHVlXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eU1hcF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0TWFwKHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlTWFwQ29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBzdGF0ZS5jb3B5XyA9IG5ldyBNYXAoc3RhdGUuYmFzZV8pO1xuICAgIH1cbiAgfVxuICBjbGFzcyBEcmFmdFNldCBleHRlbmRzIFNldCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDMgLyogU2V0ICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBkcmFmdHNfOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgICByZXZva2VkXzogZmFsc2UsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfLmhhcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuY29weV8uaGFzKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpICYmIHN0YXRlLmNvcHlfLmhhcyhzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZGVsZXRlKHZhbHVlKSB8fCAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpID8gc3RhdGUuY29weV8uZGVsZXRlKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkgOiAoXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGZhbHNlXG4gICAgICApKTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLnZhbHVlcygpO1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZW50cmllcygpO1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCByZXN1bHQudmFsdWUsIHRoaXMpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5U2V0Xyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRTZXQodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVTZXRDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuY29weV8gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgc3RhdGUuYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZS5kcmFmdHNfLnNldCh2YWx1ZSwgZHJhZnQpO1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZChkcmFmdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFzc2VydFVucmV2b2tlZChzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5yZXZva2VkXylcbiAgICAgIGRpZSgzLCBKU09OLnN0cmluZ2lmeShsYXRlc3Qoc3RhdGUpKSk7XG4gIH1cbiAgbG9hZFBsdWdpbihcIk1hcFNldFwiLCB7IHByb3h5TWFwXywgcHJveHlTZXRfIH0pO1xufVxuXG4vLyBzcmMvaW1tZXIudHNcbnZhciBpbW1lciA9IG5ldyBJbW1lcjIoKTtcbnZhciBwcm9kdWNlID0gaW1tZXIucHJvZHVjZTtcbnZhciBwcm9kdWNlV2l0aFBhdGNoZXMgPSBpbW1lci5wcm9kdWNlV2l0aFBhdGNoZXMuYmluZChcbiAgaW1tZXJcbik7XG52YXIgc2V0QXV0b0ZyZWV6ZSA9IGltbWVyLnNldEF1dG9GcmVlemUuYmluZChpbW1lcik7XG52YXIgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkgPSBpbW1lci5zZXRVc2VTdHJpY3RTaGFsbG93Q29weS5iaW5kKGltbWVyKTtcbnZhciBhcHBseVBhdGNoZXMgPSBpbW1lci5hcHBseVBhdGNoZXMuYmluZChpbW1lcik7XG52YXIgY3JlYXRlRHJhZnQgPSBpbW1lci5jcmVhdGVEcmFmdC5iaW5kKGltbWVyKTtcbnZhciBmaW5pc2hEcmFmdCA9IGltbWVyLmZpbmlzaERyYWZ0LmJpbmQoaW1tZXIpO1xuZnVuY3Rpb24gY2FzdERyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNhc3RJbW11dGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IHtcbiAgSW1tZXIyIGFzIEltbWVyLFxuICBhcHBseVBhdGNoZXMsXG4gIGNhc3REcmFmdCxcbiAgY2FzdEltbXV0YWJsZSxcbiAgY3JlYXRlRHJhZnQsXG4gIGN1cnJlbnQsXG4gIGVuYWJsZU1hcFNldCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZmluaXNoRHJhZnQsXG4gIGZyZWV6ZSxcbiAgRFJBRlRBQkxFIGFzIGltbWVyYWJsZSxcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIE5PVEhJTkcgYXMgbm90aGluZyxcbiAgb3JpZ2luYWwsXG4gIHByb2R1Y2UsXG4gIHByb2R1Y2VXaXRoUGF0Y2hlcyxcbiAgc2V0QXV0b0ZyZWV6ZSxcbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbW1lci5tanMubWFwIiwiLy8gc3JjL2luZGV4LnRzXG5leHBvcnQgKiBmcm9tIFwicmVkdXhcIjtcbmltcG9ydCB7IHByb2R1Y2UsIGN1cnJlbnQgYXMgY3VycmVudDMsIGZyZWV6ZSwgb3JpZ2luYWwgYXMgb3JpZ2luYWwyLCBpc0RyYWZ0IGFzIGlzRHJhZnQ1IH0gZnJvbSBcImltbWVyXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JDcmVhdG9yIGFzIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcjIsIGxydU1lbW9pemUsIHdlYWtNYXBNZW1vaXplIGFzIHdlYWtNYXBNZW1vaXplMiB9IGZyb20gXCJyZXNlbGVjdFwiO1xuXG4vLyBzcmMvY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IudHNcbmltcG9ydCB7IGN1cnJlbnQsIGlzRHJhZnQgfSBmcm9tIFwiaW1tZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciwgd2Vha01hcE1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcbnZhciBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3IgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVTZWxlY3RvckNyZWF0b3IoLi4uYXJncyk7XG4gIGNvbnN0IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMiA9IE9iamVjdC5hc3NpZ24oKC4uLmFyZ3MyKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcjIoLi4uYXJnczIpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9ICh2YWx1ZSwgLi4ucmVzdCkgPT4gc2VsZWN0b3IoaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlLCAuLi5yZXN0KTtcbiAgICBPYmplY3QuYXNzaWduKHdyYXBwZWRTZWxlY3Rvciwgc2VsZWN0b3IpO1xuICAgIHJldHVybiB3cmFwcGVkU2VsZWN0b3I7XG4gIH0sIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMjtcbn07XG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yKHdlYWtNYXBNZW1vaXplKTtcblxuLy8gc3JjL2NvbmZpZ3VyZVN0b3JlLnRzXG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIGNyZWF0ZVN0b3JlLCBjb21wb3NlIGFzIGNvbXBvc2UyLCBjb21iaW5lUmVkdWNlcnMsIGlzUGxhaW5PYmplY3QgYXMgaXNQbGFpbk9iamVjdDIgfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgY29tcG9zZVdpdGhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gOiBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB2b2lkIDA7XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSByZXR1cm4gY29tcG9zZTtcbiAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG52YXIgZGV2VG9vbHNFbmhhbmNlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA6IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obm9vcDMpIHtcbiAgICByZXR1cm4gbm9vcDM7XG4gIH07XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmltcG9ydCB7IHRodW5rIGFzIHRodW5rTWlkZGxld2FyZSwgd2l0aEV4dHJhQXJndW1lbnQgfSBmcm9tIFwicmVkdXgtdGh1bmtcIjtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuaW1wb3J0IHsgaXNBY3Rpb24gfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL3RzSGVscGVycy50c1xudmFyIGhhc01hdGNoRnVuY3Rpb24gPSAodikgPT4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2Ygdi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVBY3Rpb24pIHtcbiAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvciguLi5hcmdzKSB7XG4gICAgaWYgKHByZXBhcmVBY3Rpb24pIHtcbiAgICAgIGxldCBwcmVwYXJlZCA9IHByZXBhcmVBY3Rpb24oLi4uYXJncyk7XG4gICAgICBpZiAoIXByZXBhcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJwcmVwYXJlQWN0aW9uIGRpZCBub3QgcmV0dXJuIGFuIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHBheWxvYWQ6IHByZXBhcmVkLnBheWxvYWQsXG4gICAgICAgIC4uLlwibWV0YVwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBtZXRhOiBwcmVwYXJlZC5tZXRhXG4gICAgICAgIH0sXG4gICAgICAgIC4uLlwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgZXJyb3I6IHByZXBhcmVkLmVycm9yXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlLFxuICAgICAgcGF5bG9hZDogYXJnc1swXVxuICAgIH07XG4gIH1cbiAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9ICgpID0+IGAke3R5cGV9YDtcbiAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcbiAgYWN0aW9uQ3JlYXRvci5tYXRjaCA9IChhY3Rpb24pID0+IGlzQWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLnR5cGUgPT09IHR5cGU7XG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufVxuZnVuY3Rpb24gaXNBY3Rpb25DcmVhdG9yKGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiAvLyBoYXNNYXRjaEZ1bmN0aW9uIG9ubHkgd2FudHMgTWF0Y2hlcnMgYnV0IEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCBpbiByZXdyaXRpbmcgaXRcbiAgaGFzTWF0Y2hGdW5jdGlvbihhY3Rpb24pO1xufVxuZnVuY3Rpb24gaXNGU0EoYWN0aW9uKSB7XG4gIHJldHVybiBpc0FjdGlvbihhY3Rpb24pICYmIE9iamVjdC5rZXlzKGFjdGlvbikuZXZlcnkoaXNWYWxpZEtleSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xuICByZXR1cm4gW1widHlwZVwiLCBcInBheWxvYWRcIiwgXCJlcnJvclwiLCBcIm1ldGFcIl0uaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbi8vIHNyYy9hY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZ2V0TWVzc2FnZSh0eXBlKSB7XG4gIGNvbnN0IHNwbGl0VHlwZSA9IHR5cGUgPyBgJHt0eXBlfWAuc3BsaXQoXCIvXCIpIDogW107XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBzcGxpdFR5cGVbc3BsaXRUeXBlLmxlbmd0aCAtIDFdIHx8IFwiYWN0aW9uQ3JlYXRvclwiO1xuICByZXR1cm4gYERldGVjdGVkIGFuIGFjdGlvbiBjcmVhdG9yIHdpdGggdHlwZSBcIiR7dHlwZSB8fCBcInVua25vd25cIn1cIiBiZWluZyBkaXNwYXRjaGVkLiBcbk1ha2Ugc3VyZSB5b3UncmUgY2FsbGluZyB0aGUgYWN0aW9uIGNyZWF0b3IgYmVmb3JlIGRpc3BhdGNoaW5nLCBpLmUuIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0oKSlcXGAgaW5zdGVhZCBvZiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KVxcYC4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiBpZiB0aGUgYWN0aW9uIGhhcyBubyBwYXlsb2FkLmA7XG59XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpc0FjdGlvbkNyZWF0b3I6IGlzQWN0aW9uQ3JlYXRvcjIgPSBpc0FjdGlvbkNyZWF0b3JcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc0FjdGlvbkNyZWF0b3IyKGFjdGlvbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihnZXRNZXNzYWdlKGFjdGlvbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy50c1xuaW1wb3J0IHsgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUsIGlzRHJhZnRhYmxlIH0gZnJvbSBcImltbWVyXCI7XG5mdW5jdGlvbiBnZXRUaW1lTWVhc3VyZVV0aWxzKG1heERlbGF5LCBmbk5hbWUpIHtcbiAgbGV0IGVsYXBzZWQgPSAwO1xuICByZXR1cm4ge1xuICAgIG1lYXN1cmVUaW1lKGZuKSB7XG4gICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSBEYXRlLm5vdygpO1xuICAgICAgICBlbGFwc2VkICs9IGZpbmlzaGVkIC0gc3RhcnRlZDtcbiAgICAgIH1cbiAgICB9LFxuICAgIHdhcm5JZkV4Y2VlZGVkKCkge1xuICAgICAgaWYgKGVsYXBzZWQgPiBtYXhEZWxheSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7Zm5OYW1lfSB0b29rICR7ZWxhcHNlZH1tcywgd2hpY2ggaXMgbW9yZSB0aGFuIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAke21heERlbGF5fW1zLiBcbklmIHlvdXIgc3RhdGUgb3IgYWN0aW9ucyBhcmUgdmVyeSBsYXJnZSwgeW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIG1pZGRsZXdhcmUgYXMgaXQgbWlnaHQgY2F1c2UgdG9vIG11Y2ggb2YgYSBzbG93ZG93biBpbiBkZXZlbG9wbWVudCBtb2RlLiBTZWUgaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvZ2V0RGVmYXVsdE1pZGRsZXdhcmUgZm9yIGluc3RydWN0aW9ucy5cbkl0IGlzIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LmApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbnZhciBUdXBsZSA9IGNsYXNzIF9UdXBsZSBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoLi4uaXRlbXMpIHtcbiAgICBzdXBlciguLi5pdGVtcyk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIF9UdXBsZS5wcm90b3R5cGUpO1xuICB9XG4gIHN0YXRpYyBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gX1R1cGxlO1xuICB9XG4gIGNvbmNhdCguLi5hcnIpIHtcbiAgICByZXR1cm4gc3VwZXIuY29uY2F0LmFwcGx5KHRoaXMsIGFycik7XG4gIH1cbiAgcHJlcGVuZCguLi5hcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyclswXSkpIHtcbiAgICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyclswXS5jb25jYXQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnIuY29uY2F0KHRoaXMpKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZyZWV6ZURyYWZ0YWJsZSh2YWwpIHtcbiAgcmV0dXJuIGlzRHJhZnRhYmxlKHZhbCkgPyBjcmVhdGVOZXh0U3RhdGUodmFsLCAoKSA9PiB7XG4gIH0pIDogdmFsO1xufVxuZnVuY3Rpb24gZ2V0T3JJbnNlcnRDb21wdXRlZChtYXAsIGtleSwgY29tcHV0ZSkge1xuICBpZiAobWFwLmhhcyhrZXkpKSByZXR1cm4gbWFwLmdldChrZXkpO1xuICByZXR1cm4gbWFwLnNldChrZXksIGNvbXB1dGUoa2V5KSkuZ2V0KGtleSk7XG59XG5cbi8vIHNyYy9pbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGVmYXVsdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09IG51bGwgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRyYWNrRm9yTXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKSB7XG4gIGNvbnN0IHRyYWNrZWRQcm9wZXJ0aWVzID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKTtcbiAgcmV0dXJuIHtcbiAgICBkZXRlY3RNdXRhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgdHJhY2tlZFByb3BlcnRpZXMsIG9iaik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocyA9IFtdLCBvYmosIHBhdGggPSBcIlwiLCBjaGVja2VkT2JqZWN0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcbiAgY29uc3QgdHJhY2tlZCA9IHtcbiAgICB2YWx1ZTogb2JqXG4gIH07XG4gIGlmICghaXNJbW11dGFibGUob2JqKSAmJiAhY2hlY2tlZE9iamVjdHMuaGFzKG9iaikpIHtcbiAgICBjaGVja2VkT2JqZWN0cy5hZGQob2JqKTtcbiAgICB0cmFja2VkLmNoaWxkcmVuID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgICAgaWYgKGlnbm9yZVBhdGhzLmxlbmd0aCAmJiBpZ25vcmVQYXRocy5pbmRleE9mKGNoaWxkUGF0aCkgIT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJhY2tlZC5jaGlsZHJlbltrZXldID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqW2tleV0sIGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cmFja2VkO1xufVxuZnVuY3Rpb24gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMgPSBbXSwgdHJhY2tlZFByb3BlcnR5LCBvYmosIHNhbWVQYXJlbnRSZWYgPSBmYWxzZSwgcGF0aCA9IFwiXCIpIHtcbiAgY29uc3QgcHJldk9iaiA9IHRyYWNrZWRQcm9wZXJ0eSA/IHRyYWNrZWRQcm9wZXJ0eS52YWx1ZSA6IHZvaWQgMDtcbiAgY29uc3Qgc2FtZVJlZiA9IHByZXZPYmogPT09IG9iajtcbiAgaWYgKHNhbWVQYXJlbnRSZWYgJiYgIXNhbWVSZWYgJiYgIU51bWJlci5pc05hTihvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IHRydWUsXG4gICAgICBwYXRoXG4gICAgfTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUocHJldk9iaikgfHwgaXNJbW11dGFibGUob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY29uc3Qga2V5c1RvRGV0ZWN0ID0ge307XG4gIGZvciAobGV0IGtleSBpbiB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW4pIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChsZXQga2V5IGluIGtleXNUb0RldGVjdCkge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocywgdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuW2tleV0sIG9ialtrZXldLCBzYW1lUmVmLCBuZXN0ZWRQYXRoKTtcbiAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIGxldCBzdHJpbmdpZnkyID0gZnVuY3Rpb24ob2JqLCBzZXJpYWxpemVyLCBpbmRlbnQsIGRlY3ljbGVyKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBnZXRTZXJpYWxpemUyKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSwgaW5kZW50KTtcbiAgICB9LCBnZXRTZXJpYWxpemUyID0gZnVuY3Rpb24oc2VyaWFsaXplciwgZGVjeWNsZXIpIHtcbiAgICAgIGxldCBzdGFjayA9IFtdLCBrZXlzID0gW107XG4gICAgICBpZiAoIWRlY3ljbGVyKSBkZWN5Y2xlciA9IGZ1bmN0aW9uKF8sIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFja1swXSA9PT0gdmFsdWUpIHJldHVybiBcIltDaXJjdWxhciB+XVwiO1xuICAgICAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfi5cIiArIGtleXMuc2xpY2UoMCwgc3RhY2suaW5kZXhPZih2YWx1ZSkpLmpvaW4oXCIuXCIpICsgXCJdXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgdGhpc1BvcyA9IHN0YWNrLmluZGV4T2YodGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBzdGFjay5zcGxpY2UodGhpc1BvcyArIDEpIDogc3RhY2sucHVzaCh0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IGtleXMuc3BsaWNlKHRoaXNQb3MsIEluZmluaXR5LCBrZXkpIDoga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSkgdmFsdWUgPSBkZWN5Y2xlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Ugc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyID09IG51bGwgPyB2YWx1ZSA6IHNlcmlhbGl6ZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgc3RyaW5naWZ5ID0gc3RyaW5naWZ5MiwgZ2V0U2VyaWFsaXplID0gZ2V0U2VyaWFsaXplMjtcbiAgICBsZXQge1xuICAgICAgaXNJbW11dGFibGUgPSBpc0ltbXV0YWJsZURlZmF1bHQsXG4gICAgICBpZ25vcmVkUGF0aHMsXG4gICAgICB3YXJuQWZ0ZXIgPSAzMlxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHRyYWNrID0gdHJhY2tGb3JNdXRhdGlvbnMuYmluZChudWxsLCBpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzKTtcbiAgICByZXR1cm4gKHtcbiAgICAgIGdldFN0YXRlXG4gICAgfSkgPT4ge1xuICAgICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgIGxldCB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHJldHVybiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE5KSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuIGRpc3BhdGNoZXMsIGluIHRoZSBwYXRoICcke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9Jy4gIFRoaXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvci4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlZEFjdGlvbiA9IG5leHQoYWN0aW9uKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjApIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGluc2lkZSBhIGRpc3BhdGNoLCBpbiB0aGUgcGF0aDogJHtyZXN1bHQucGF0aCB8fCBcIlwifS4gVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhlIGFjdGlvbiAke3N0cmluZ2lmeTIoYWN0aW9uKX0uIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hlZEFjdGlvbjtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvc2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5pbXBvcnQgeyBpc0FjdGlvbiBhcyBpc0FjdGlvbjIsIGlzUGxhaW5PYmplY3QgfSBmcm9tIFwicmVkdXhcIjtcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICByZXR1cm4gdmFsID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XG59XG5mdW5jdGlvbiBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUodmFsdWUsIHBhdGggPSBcIlwiLCBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyA9IFtdLCBjYWNoZSkge1xuICBsZXQgZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gIGlmICghaXNTZXJpYWxpemFibGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleVBhdGg6IHBhdGggfHwgXCI8cm9vdD5cIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjYWNoZT8uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlbnRyaWVzID0gZ2V0RW50cmllcyAhPSBudWxsID8gZ2V0RW50cmllcyh2YWx1ZSkgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGNvbnN0IFtrZXksIG5lc3RlZFZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTZXJpYWxpemFibGUobmVzdGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlQYXRoOiBuZXN0ZWRQYXRoLFxuICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKG5lc3RlZFZhbHVlLCBuZXN0ZWRQYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICBpZiAoZm91bmROZXN0ZWRTZXJpYWxpemFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2FjaGUgJiYgaXNOZXN0ZWRGcm96ZW4odmFsdWUpKSBjYWNoZS5hZGQodmFsdWUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05lc3RlZEZyb3plbih2YWx1ZSkge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBuZXN0ZWRWYWx1ZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgbmVzdGVkVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGlmICghaXNOZXN0ZWRGcm96ZW4obmVzdGVkVmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7XG4gICAgICBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgaWdub3JlZEFjdGlvbnMgPSBbXSxcbiAgICAgIGlnbm9yZWRBY3Rpb25QYXRocyA9IFtcIm1ldGEuYXJnXCIsIFwibWV0YS5iYXNlUXVlcnlNZXRhXCJdLFxuICAgICAgaWdub3JlZFBhdGhzID0gW10sXG4gICAgICB3YXJuQWZ0ZXIgPSAzMixcbiAgICAgIGlnbm9yZVN0YXRlID0gZmFsc2UsXG4gICAgICBpZ25vcmVBY3Rpb25zID0gZmFsc2UsXG4gICAgICBkaXNhYmxlQ2FjaGUgPSBmYWxzZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhY2hlID0gIWRpc2FibGVDYWNoZSAmJiBXZWFrU2V0ID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIChzdG9yZUFQSSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgIGlmICghaXNBY3Rpb24yKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIlNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgIGlmICghaWdub3JlQWN0aW9ucyAmJiAhKGlnbm9yZWRBY3Rpb25zLmxlbmd0aCAmJiBpZ25vcmVkQWN0aW9ucy5pbmRleE9mKGFjdGlvbi50eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShhY3Rpb24sIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkQWN0aW9uUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIGFuIGFjdGlvbiwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBcIlxcblRha2UgYSBsb29rIGF0IHRoZSBsb2dpYyB0aGF0IGRpc3BhdGNoZWQgdGhpcyBhY3Rpb246IFwiLCBhY3Rpb24sIFwiXFxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvYWN0aW9ucyN3aHktc2hvdWxkLXR5cGUtYmUtYS1zdHJpbmctb3ItYXQtbGVhc3Qtc2VyaWFsaXphYmxlLXdoeS1zaG91bGQtbXktYWN0aW9uLXR5cGVzLWJlLWNvbnN0YW50cylcIiwgXCJcXG4oVG8gYWxsb3cgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgc2VlOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL3VzYWdlL3VzYWdlLWd1aWRlI3dvcmtpbmctd2l0aC1ub24tc2VyaWFsaXphYmxlLWRhdGEpXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlnbm9yZVN0YXRlKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZUFQSS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShzdGF0ZSwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIHRoZSBzdGF0ZSwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBgXG5UYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGlzIGFjdGlvbiB0eXBlOiAke2FjdGlvbi50eXBlfS5cbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL29yZ2FuaXppbmctc3RhdGUjY2FuLWktcHV0LWZ1bmN0aW9ucy1wcm9taXNlcy1vci1vdGhlci1ub24tc2VyaWFsaXphYmxlLWl0ZW1zLWluLW15LXN0b3JlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNCb29sZWFuKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImJvb2xlYW5cIjtcbn1cbnZhciBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlID0gKCkgPT4gZnVuY3Rpb24gZ2V0RGVmYXVsdE1pZGRsZXdhcmUob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgdGh1bmsgPSB0cnVlLFxuICAgIGltbXV0YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBzZXJpYWxpemFibGVDaGVjayA9IHRydWUsXG4gICAgYWN0aW9uQ3JlYXRvckNoZWNrID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IG1pZGRsZXdhcmVBcnJheSA9IG5ldyBUdXBsZSgpO1xuICBpZiAodGh1bmspIHtcbiAgICBpZiAoaXNCb29sZWFuKHRodW5rKSkge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2godGh1bmtNaWRkbGV3YXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2god2l0aEV4dHJhQXJndW1lbnQodGh1bmsuZXh0cmFBcmd1bWVudCkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGltbXV0YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgaW1tdXRhYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oaW1tdXRhYmxlQ2hlY2spKSB7XG4gICAgICAgIGltbXV0YWJsZU9wdGlvbnMgPSBpbW11dGFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShpbW11dGFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChzZXJpYWxpemFibGVDaGVjaykge1xuICAgICAgbGV0IHNlcmlhbGl6YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKHNlcmlhbGl6YWJsZUNoZWNrKSkge1xuICAgICAgICBzZXJpYWxpemFibGVPcHRpb25zID0gc2VyaWFsaXphYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaChjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoc2VyaWFsaXphYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uQ3JlYXRvckNoZWNrKSB7XG4gICAgICBsZXQgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGFjdGlvbkNyZWF0b3JDaGVjaykpIHtcbiAgICAgICAgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSBhY3Rpb25DcmVhdG9yQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShhY3Rpb25DcmVhdG9yT3B0aW9ucykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWlkZGxld2FyZUFycmF5O1xufTtcblxuLy8gc3JjL2F1dG9CYXRjaEVuaGFuY2VyLnRzXG52YXIgU0hPVUxEX0FVVE9CQVRDSCA9IFwiUlRLX2F1dG9CYXRjaFwiO1xudmFyIHByZXBhcmVBdXRvQmF0Y2hlZCA9ICgpID0+IChwYXlsb2FkKSA9PiAoe1xuICBwYXlsb2FkLFxuICBtZXRhOiB7XG4gICAgW1NIT1VMRF9BVVRPQkFUQ0hdOiB0cnVlXG4gIH1cbn0pO1xudmFyIGNyZWF0ZVF1ZXVlV2l0aFRpbWVyID0gKHRpbWVvdXQpID0+IHtcbiAgcmV0dXJuIChub3RpZnkpID0+IHtcbiAgICBzZXRUaW1lb3V0KG5vdGlmeSwgdGltZW91dCk7XG4gIH07XG59O1xudmFyIGF1dG9CYXRjaEVuaGFuY2VyID0gKG9wdGlvbnMgPSB7XG4gIHR5cGU6IFwicmFmXCJcbn0pID0+IChuZXh0KSA9PiAoLi4uYXJncykgPT4ge1xuICBjb25zdCBzdG9yZSA9IG5leHQoLi4uYXJncyk7XG4gIGxldCBub3RpZnlpbmcgPSB0cnVlO1xuICBsZXQgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgbGV0IG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBxdWV1ZUNhbGxiYWNrID0gb3B0aW9ucy50eXBlID09PSBcInRpY2tcIiA/IHF1ZXVlTWljcm90YXNrIDogb3B0aW9ucy50eXBlID09PSBcInJhZlwiID8gKFxuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSB3b24ndCBleGlzdCBpbiBTU1IgZW52aXJvbm1lbnRzLiBGYWxsIGJhY2sgdG8gYSB2YWd1ZSBhcHByb3hpbWF0aW9uIGp1c3QgdG8ga2VlcCBmcm9tIGVycm9yaW5nLlxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiBjcmVhdGVRdWV1ZVdpdGhUaW1lcigxMClcbiAgKSA6IG9wdGlvbnMudHlwZSA9PT0gXCJjYWxsYmFja1wiID8gb3B0aW9ucy5xdWV1ZU5vdGlmaWNhdGlvbiA6IGNyZWF0ZVF1ZXVlV2l0aFRpbWVyKG9wdGlvbnMudGltZW91dCk7XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVycyA9ICgpID0+IHtcbiAgICBub3RpZmljYXRpb25RdWV1ZWQgPSBmYWxzZTtcbiAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobCkgPT4gbCgpKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdG9yZSwge1xuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5zdWJzY3JpYmVgIG1ldGhvZCB0byBrZWVwIG9yaWdpbmFsIGxpc3RlbmVyc1xuICAgIC8vIGZyb20gcnVubmluZyBpZiB3ZSdyZSBkZWxheWluZyBub3RpZmljYXRpb25zXG4gICAgc3Vic2NyaWJlKGxpc3RlbmVyMikge1xuICAgICAgY29uc3Qgd3JhcHBlZExpc3RlbmVyID0gKCkgPT4gbm90aWZ5aW5nICYmIGxpc3RlbmVyMigpO1xuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUod3JhcHBlZExpc3RlbmVyKTtcbiAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIyKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIyKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBgc3RvcmUuZGlzcGF0Y2hgIG1ldGhvZCBzbyB0aGF0IHdlIGNhbiBjaGVjayBhY3Rpb25zXG4gICAgLy8gZm9yIHRoZSBgc2hvdWxkQXV0b0JhdGNoYCBmbGFnIGFuZCBkZXRlcm1pbmUgaWYgYmF0Y2hpbmcgaXMgYWN0aXZlXG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBub3RpZnlpbmcgPSAhYWN0aW9uPy5tZXRhPy5bU0hPVUxEX0FVVE9CQVRDSF07XG4gICAgICAgIHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrID0gIW5vdGlmeWluZztcbiAgICAgICAgaWYgKHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrKSB7XG4gICAgICAgICAgaWYgKCFub3RpZmljYXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICBxdWV1ZUNhbGxiYWNrKG5vdGlmeUxpc3RlbmVycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbm90aWZ5aW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRFbmhhbmNlcnMudHNcbnZhciBidWlsZEdldERlZmF1bHRFbmhhbmNlcnMgPSAobWlkZGxld2FyZUVuaGFuY2VyKSA9PiBmdW5jdGlvbiBnZXREZWZhdWx0RW5oYW5jZXJzKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGF1dG9CYXRjaCA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBlbmhhbmNlckFycmF5ID0gbmV3IFR1cGxlKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChhdXRvQmF0Y2gpIHtcbiAgICBlbmhhbmNlckFycmF5LnB1c2goYXV0b0JhdGNoRW5oYW5jZXIodHlwZW9mIGF1dG9CYXRjaCA9PT0gXCJvYmplY3RcIiA/IGF1dG9CYXRjaCA6IHZvaWQgMCkpO1xuICB9XG4gIHJldHVybiBlbmhhbmNlckFycmF5O1xufTtcblxuLy8gc3JjL2NvbmZpZ3VyZVN0b3JlLnRzXG5mdW5jdGlvbiBjb25maWd1cmVTdG9yZShvcHRpb25zKSB7XG4gIGNvbnN0IGdldERlZmF1bHRNaWRkbGV3YXJlID0gYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSgpO1xuICBjb25zdCB7XG4gICAgcmVkdWNlciA9IHZvaWQgMCxcbiAgICBtaWRkbGV3YXJlLFxuICAgIGRldlRvb2xzID0gdHJ1ZSxcbiAgICBkdXBsaWNhdGVNaWRkbGV3YXJlQ2hlY2sgPSB0cnVlLFxuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwLFxuICAgIGVuaGFuY2VycyA9IHZvaWQgMFxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IHJvb3RSZWR1Y2VyO1xuICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0MihyZWR1Y2VyKSkge1xuICAgIHJvb3RSZWR1Y2VyID0gY29tYmluZVJlZHVjZXJzKHJlZHVjZXIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJgcmVkdWNlcmAgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnNcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBtaWRkbGV3YXJlICYmIHR5cGVvZiBtaWRkbGV3YXJlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiYG1pZGRsZXdhcmVgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgZmluYWxNaWRkbGV3YXJlO1xuICBpZiAodHlwZW9mIG1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUoZ2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoZmluYWxNaWRkbGV3YXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gZ2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJlYWNoIG1pZGRsZXdhcmUgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZHVwbGljYXRlTWlkZGxld2FyZUNoZWNrKSB7XG4gICAgbGV0IG1pZGRsZXdhcmVSZWZlcmVuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBmaW5hbE1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxld2FyZTIpID0+IHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVmZXJlbmNlcy5oYXMobWlkZGxld2FyZTIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQyKSA6IFwiRHVwbGljYXRlIG1pZGRsZXdhcmUgcmVmZXJlbmNlcyBmb3VuZCB3aGVuIGNyZWF0aW5nIHRoZSBzdG9yZS4gRW5zdXJlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIGlzIG9ubHkgaW5jbHVkZWQgb25jZS5cIik7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlUmVmZXJlbmNlcy5hZGQobWlkZGxld2FyZTIpO1xuICAgIH0pO1xuICB9XG4gIGxldCBmaW5hbENvbXBvc2UgPSBjb21wb3NlMjtcbiAgaWYgKGRldlRvb2xzKSB7XG4gICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyh7XG4gICAgICAvLyBFbmFibGUgY2FwdHVyZSBvZiBzdGFjayB0cmFjZXMgZm9yIGRpc3BhdGNoZWQgUmVkdXggYWN0aW9uc1xuICAgICAgdHJhY2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgICAgIC4uLnR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29sc1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1pZGRsZXdhcmVFbmhhbmNlciA9IGFwcGx5TWlkZGxld2FyZSguLi5maW5hbE1pZGRsZXdhcmUpO1xuICBjb25zdCBnZXREZWZhdWx0RW5oYW5jZXJzID0gYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZW5oYW5jZXJzICYmIHR5cGVvZiBlbmhhbmNlcnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJgZW5oYW5jZXJzYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IHN0b3JlRW5oYW5jZXJzID0gdHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiID8gZW5oYW5jZXJzKGdldERlZmF1bHRFbmhhbmNlcnMpIDogZ2V0RGVmYXVsdEVuaGFuY2VycygpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KHN0b3JlRW5oYW5jZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJgZW5oYW5jZXJzYCBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHN0b3JlRW5oYW5jZXJzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcImVhY2ggZW5oYW5jZXIgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLmxlbmd0aCAmJiAhc3RvcmVFbmhhbmNlcnMuaW5jbHVkZXMobWlkZGxld2FyZUVuaGFuY2VyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJtaWRkbGV3YXJlcyB3ZXJlIHByb3ZpZGVkLCBidXQgbWlkZGxld2FyZSBlbmhhbmNlciB3YXMgbm90IGluY2x1ZGVkIGluIGZpbmFsIGVuaGFuY2VycyAtIG1ha2Ugc3VyZSB0byBjYWxsIGBnZXREZWZhdWx0RW5oYW5jZXJzYFwiKTtcbiAgfVxuICBjb25zdCBjb21wb3NlZEVuaGFuY2VyID0gZmluYWxDb21wb3NlKC4uLnN0b3JlRW5oYW5jZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJvb3RSZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgY29tcG9zZWRFbmhhbmNlcik7XG59XG5cbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZTIsIGlzRHJhZnQgYXMgaXNEcmFmdDIsIGlzRHJhZnRhYmxlIGFzIGlzRHJhZnRhYmxlMiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvbWFwQnVpbGRlcnMudHNcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xuICBjb25zdCBhY3Rpb25zTWFwID0ge307XG4gIGNvbnN0IGFjdGlvbk1hdGNoZXJzID0gW107XG4gIGxldCBkZWZhdWx0Q2FzZVJlZHVjZXI7XG4gIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjYpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkTWF0Y2hlcmBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI3KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOCkgOiBcImBidWlsZGVyLmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjkpIDogYFxcYGJ1aWxkZXIuYWRkQ2FzZVxcYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZSAnJHt0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNNYXBbdHlwZV0gPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwKSA6IFwiYGJ1aWxkZXIuYWRkTWF0Y2hlcmAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXIsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGREZWZhdWx0Q2FzZShyZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMSkgOiBcImBidWlsZGVyLmFkZERlZmF1bHRDYXNlYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbiAgfTtcbiAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICByZXR1cm4gW2FjdGlvbnNNYXAsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgbWFwT3JCdWlsZGVyQ2FsbGJhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgbWFwT3JCdWlsZGVyQ2FsbGJhY2sgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlUmVkdWNlcmAgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVJlZHVjZXJcIik7XG4gICAgfVxuICB9XG4gIGxldCBbYWN0aW9uc01hcCwgZmluYWxBY3Rpb25NYXRjaGVycywgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdID0gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sobWFwT3JCdWlsZGVyQ2FsbGJhY2spO1xuICBsZXQgZ2V0SW5pdGlhbFN0YXRlO1xuICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZyb3plbkluaXRpYWxTdGF0ZSA9IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUpO1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyb3plbkluaXRpYWxTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCksIGFjdGlvbikge1xuICAgIGxldCBjYXNlUmVkdWNlcnMgPSBbYWN0aW9uc01hcFthY3Rpb24udHlwZV0sIC4uLmZpbmFsQWN0aW9uTWF0Y2hlcnMuZmlsdGVyKCh7XG4gICAgICBtYXRjaGVyXG4gICAgfSkgPT4gbWF0Y2hlcihhY3Rpb24pKS5tYXAoKHtcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgfSkgPT4gcmVkdWNlcjIpXTtcbiAgICBpZiAoY2FzZVJlZHVjZXJzLmZpbHRlcigoY3IpID0+ICEhY3IpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSA9PiB7XG4gICAgICBpZiAoY2FzZVJlZHVjZXIpIHtcbiAgICAgICAgaWYgKGlzRHJhZnQyKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRHJhZnRhYmxlMihwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKHByZXZpb3VzU3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiQSBjYXNlIHJlZHVjZXIgb24gYSBub24tZHJhZnRhYmxlIHZhbHVlIG11c3Qgbm90IHJldHVybiB1bmRlZmluZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZU5leHRTdGF0ZTIocHJldmlvdXNTdGF0ZSwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgIH0sIHN0YXRlKTtcbiAgfVxuICByZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcbiAgcmV0dXJuIHJlZHVjZXI7XG59XG5cbi8vIHNyYy9tYXRjaGVycy50c1xudmFyIG1hdGNoZXMgPSAobWF0Y2hlciwgYWN0aW9uKSA9PiB7XG4gIGlmIChoYXNNYXRjaEZ1bmN0aW9uKG1hdGNoZXIpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXIubWF0Y2goYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWF0Y2hlcihhY3Rpb24pO1xuICB9XG59O1xuZnVuY3Rpb24gaXNBbnlPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5zb21lKChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaXNBbGxPZiguLi5tYXRjaGVycykge1xuICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBtYXRjaGVycy5ldmVyeSgobWF0Y2hlcikgPT4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgdmFsaWRTdGF0dXMpIHtcbiAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi5tZXRhKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGhhc1ZhbGlkUmVxdWVzdElkID0gdHlwZW9mIGFjdGlvbi5tZXRhLnJlcXVlc3RJZCA9PT0gXCJzdHJpbmdcIjtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzID0gdmFsaWRTdGF0dXMuaW5kZXhPZihhY3Rpb24ubWV0YS5yZXF1ZXN0U3RhdHVzKSA+IC0xO1xuICByZXR1cm4gaGFzVmFsaWRSZXF1ZXN0SWQgJiYgaGFzVmFsaWRSZXF1ZXN0U3RhdHVzO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQXJyYXkoYSkge1xuICByZXR1cm4gdHlwZW9mIGFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJiBcInBlbmRpbmdcIiBpbiBhWzBdICYmIFwiZnVsZmlsbGVkXCIgaW4gYVswXSAmJiBcInJlamVjdGVkXCIgaW4gYVswXTtcbn1cbmZ1bmN0aW9uIGlzUGVuZGluZyguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNQZW5kaW5nKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5wZW5kaW5nKSk7XG59XG5mdW5jdGlvbiBpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsucmVqZWN0ZWQpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWRXaXRoVmFsdWUoLi4uYXN5bmNUaHVua3MpIHtcbiAgY29uc3QgaGFzRmxhZyA9IChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gYWN0aW9uICYmIGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlO1xuICB9O1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUmVqZWN0ZWRXaXRoVmFsdWUoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQWxsT2YoaXNSZWplY3RlZCguLi5hc3luY1RodW5rcyksIGhhc0ZsYWcpO1xufVxuZnVuY3Rpb24gaXNGdWxmaWxsZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcImZ1bGZpbGxlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNGdWxmaWxsZWQoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLmZ1bGZpbGxlZCkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rQWN0aW9uKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCIsIFwiZnVsZmlsbGVkXCIsIFwicmVqZWN0ZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzQXN5bmNUaHVua0FjdGlvbigpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5mbGF0TWFwKChhc3luY1RodW5rKSA9PiBbYXN5bmNUaHVuay5wZW5kaW5nLCBhc3luY1RodW5rLnJlamVjdGVkLCBhc3luY1RodW5rLmZ1bGZpbGxlZF0pKTtcbn1cblxuLy8gc3JjL25hbm9pZC50c1xudmFyIHVybEFscGhhYmV0ID0gXCJNb2R1bGVTeW1iaGFzT3duUHItMDEyMzQ1Njc4OUFCQ0RFRkdITlJWZmdjdGlVdnpfS3FZVEprTHhwWlhJalFXXCI7XG52YXIgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSBcIlwiO1xuICBsZXQgaSA9IHNpemU7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZCArPSB1cmxBbHBoYWJldFtNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcbiAgfVxuICByZXR1cm4gaWQ7XG59O1xuXG4vLyBzcmMvY3JlYXRlQXN5bmNUaHVuay50c1xudmFyIGNvbW1vblByb3BlcnRpZXMgPSBbXCJuYW1lXCIsIFwibWVzc2FnZVwiLCBcInN0YWNrXCIsIFwiY29kZVwiXTtcbnZhciBSZWplY3RXaXRoVmFsdWUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgRnVsZmlsbFdpdGhNZXRhID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihwYXlsb2FkLCBtZXRhKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG4gIC8qXG4gIHR5cGUtb25seSBwcm9wZXJ0eSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFJlamVjdFdpdGhWYWx1ZSBhbmQgRnVsZmlsbFdpdGhNZXRhXG4gIGRvZXMgbm90IGV4aXN0IGF0IHJ1bnRpbWVcbiAgKi9cbiAgX3R5cGU7XG59O1xudmFyIG1pbmlTZXJpYWxpemVFcnJvciA9ICh2YWx1ZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc2ltcGxlRXJyb3IgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGNvbW1vblByb3BlcnRpZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVbcHJvcGVydHldID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHNpbXBsZUVycm9yW3Byb3BlcnR5XSA9IHZhbHVlW3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpbXBsZUVycm9yO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogU3RyaW5nKHZhbHVlKVxuICB9O1xufTtcbnZhciBleHRlcm5hbEFib3J0TWVzc2FnZSA9IFwiRXh0ZXJuYWwgc2lnbmFsIHdhcyBhYm9ydGVkXCI7XG52YXIgY3JlYXRlQXN5bmNUaHVuayA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICBmdW5jdGlvbiBjcmVhdGVBc3luY1RodW5rMih0eXBlUHJlZml4LCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bGZpbGxlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvZnVsZmlsbGVkXCIsIChwYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcImZ1bGZpbGxlZFwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3BlbmRpbmdcIiwgKHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZDogdm9pZCAwLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJwZW5kaW5nXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3JlamVjdGVkXCIsIChlcnJvciwgcmVxdWVzdElkLCBhcmcsIHBheWxvYWQsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgZXJyb3I6IChvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplRXJyb3IgfHwgbWluaVNlcmlhbGl6ZUVycm9yKShlcnJvciB8fCBcIlJlamVjdGVkXCIpLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWU6ICEhcGF5bG9hZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJyZWplY3RlZFwiLFxuICAgICAgICBhYm9ydGVkOiBlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIsXG4gICAgICAgIGNvbmRpdGlvbjogZXJyb3I/Lm5hbWUgPT09IFwiQ29uZGl0aW9uRXJyb3JcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKGFyZywge1xuICAgICAgc2lnbmFsXG4gICAgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmEpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gb3B0aW9ucz8uaWRHZW5lcmF0b3IgPyBvcHRpb25zLmlkR2VuZXJhdG9yKGFyZykgOiBuYW5vaWQoKTtcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBsZXQgYWJvcnRIYW5kbGVyO1xuICAgICAgICBsZXQgYWJvcnRSZWFzb247XG4gICAgICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xuICAgICAgICAgIGFib3J0UmVhc29uID0gcmVhc29uO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KGV4dGVybmFsQWJvcnRNZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiBhYm9ydChleHRlcm5hbEFib3J0TWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgZmluYWxBY3Rpb247XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBvcHRpb25zPy5jb25kaXRpb24/LihhcmcsIHtcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKGNvbmRpdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvblJlc3VsdCA9PT0gZmFsc2UgfHwgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbmRpdGlvbkVycm9yXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJBYm9ydGVkIGR1ZSB0byBjb25kaXRpb24gY2FsbGJhY2sgcmV0dXJuaW5nIGZhbHNlLlwiXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhYm9ydGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIkFib3J0RXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGFib3J0UmVhc29uIHx8IFwiQWJvcnRlZFwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHBlbmRpbmcocmVxdWVzdElkLCBhcmcsIG9wdGlvbnM/LmdldFBlbmRpbmdNZXRhPy4oe1xuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGF3YWl0IFByb21pc2UucmFjZShbYWJvcnRlZFByb21pc2UsIFByb21pc2UucmVzb2x2ZShwYXlsb2FkQ3JlYXRvcihhcmcsIHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYSxcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgIGFib3J0LFxuICAgICAgICAgICAgICByZWplY3RXaXRoVmFsdWU6ICh2YWx1ZSwgbWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVqZWN0V2l0aFZhbHVlKHZhbHVlLCBtZXRhKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVsZmlsbFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxmaWxsV2l0aE1ldGEodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bGZpbGxXaXRoTWV0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdWxmaWxsZWQocmVzdWx0LnBheWxvYWQsIHJlcXVlc3RJZCwgYXJnLCByZXN1bHQubWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICAgIH0pXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBmaW5hbEFjdGlvbiA9IGVyciBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSA/IHJlamVjdGVkKG51bGwsIHJlcXVlc3RJZCwgYXJnLCBlcnIucGF5bG9hZCwgZXJyLm1ldGEpIDogcmVqZWN0ZWQoZXJyLCByZXF1ZXN0SWQsIGFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChhYm9ydEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2tpcERpc3BhdGNoID0gb3B0aW9ucyAmJiAhb3B0aW9ucy5kaXNwYXRjaENvbmRpdGlvblJlamVjdGlvbiAmJiByZWplY3RlZC5tYXRjaChmaW5hbEFjdGlvbikgJiYgZmluYWxBY3Rpb24ubWV0YS5jb25kaXRpb247XG4gICAgICAgICAgaWYgKCFza2lwRGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGZpbmFsQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbmFsQWN0aW9uO1xuICAgICAgICB9KCk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHByb21pc2UsIHtcbiAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgYXJnLFxuICAgICAgICAgIHVud3JhcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odW53cmFwUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uQ3JlYXRvciwge1xuICAgICAgcGVuZGluZyxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgZnVsZmlsbGVkLFxuICAgICAgc2V0dGxlZDogaXNBbnlPZihyZWplY3RlZCwgZnVsZmlsbGVkKSxcbiAgICAgIHR5cGVQcmVmaXhcbiAgICB9KTtcbiAgfVxuICBjcmVhdGVBc3luY1RodW5rMi53aXRoVHlwZXMgPSAoKSA9PiBjcmVhdGVBc3luY1RodW5rMjtcbiAgcmV0dXJuIGNyZWF0ZUFzeW5jVGh1bmsyO1xufSkoKTtcbmZ1bmN0aW9uIHVud3JhcFJlc3VsdChhY3Rpb24pIHtcbiAgaWYgKGFjdGlvbi5tZXRhICYmIGFjdGlvbi5tZXRhLnJlamVjdGVkV2l0aFZhbHVlKSB7XG4gICAgdGhyb3cgYWN0aW9uLnBheWxvYWQ7XG4gIH1cbiAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgIHRocm93IGFjdGlvbi5lcnJvcjtcbiAgfVxuICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG59XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gc3JjL2NyZWF0ZVNsaWNlLnRzXG52YXIgYXN5bmNUaHVua1N5bWJvbCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwicnRrLXNsaWNlLWNyZWF0ZWFzeW5jdGh1bmtcIik7XG52YXIgYXN5bmNUaHVua0NyZWF0b3IgPSB7XG4gIFthc3luY1RodW5rU3ltYm9sXTogY3JlYXRlQXN5bmNUaHVua1xufTtcbnZhciBSZWR1Y2VyVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFJlZHVjZXJUeXBlMikgPT4ge1xuICBSZWR1Y2VyVHlwZTJbXCJyZWR1Y2VyXCJdID0gXCJyZWR1Y2VyXCI7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJXaXRoUHJlcGFyZVwiXSA9IFwicmVkdWNlcldpdGhQcmVwYXJlXCI7XG4gIFJlZHVjZXJUeXBlMltcImFzeW5jVGh1bmtcIl0gPSBcImFzeW5jVGh1bmtcIjtcbiAgcmV0dXJuIFJlZHVjZXJUeXBlMjtcbn0pKFJlZHVjZXJUeXBlIHx8IHt9KTtcbmZ1bmN0aW9uIGdldFR5cGUoc2xpY2UsIGFjdGlvbktleSkge1xuICByZXR1cm4gYCR7c2xpY2V9LyR7YWN0aW9uS2V5fWA7XG59XG5mdW5jdGlvbiBidWlsZENyZWF0ZVNsaWNlKHtcbiAgY3JlYXRvcnNcbn0gPSB7fSkge1xuICBjb25zdCBjQVQgPSBjcmVhdG9ycz8uYXN5bmNUaHVuaz8uW2FzeW5jVGh1bmtTeW1ib2xdO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlU2xpY2UyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlclBhdGggPSBuYW1lXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBcImBuYW1lYCBpcyBhIHJlcXVpcmVkIG9wdGlvbiBmb3IgY3JlYXRlU2xpY2VcIik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsU3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhbiBgaW5pdGlhbFN0YXRlYCB2YWx1ZSB0aGF0IGlzIG5vdCBgdW5kZWZpbmVkYC4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYGluaXRpYWxTdGF0ZWBcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZXJzID0gKHR5cGVvZiBvcHRpb25zLnJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnJlZHVjZXJzKGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkpIDogb3B0aW9ucy5yZWR1Y2VycykgfHwge307XG4gICAgY29uc3QgcmVkdWNlck5hbWVzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZToge30sXG4gICAgICBzbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZToge30sXG4gICAgICBhY3Rpb25DcmVhdG9yczoge30sXG4gICAgICBzbGljZU1hdGNoZXJzOiBbXVxuICAgIH07XG4gICAgY29uc3QgY29udGV4dE1ldGhvZHMgPSB7XG4gICAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlIGluIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBcImBjb250ZXh0LmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVbdHlwZV0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGFkZE1hdGNoZXIobWF0Y2hlciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZU1hdGNoZXJzLnB1c2goe1xuICAgICAgICAgIG1hdGNoZXIsXG4gICAgICAgICAgcmVkdWNlcjogcmVkdWNlcjJcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VBY3Rpb24obmFtZTIsIGFjdGlvbkNyZWF0b3IpIHtcbiAgICAgICAgY29udGV4dC5hY3Rpb25DcmVhdG9yc1tuYW1lMl0gPSBhY3Rpb25DcmVhdG9yO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgZXhwb3NlQ2FzZVJlZHVjZXIobmFtZTIsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWVbbmFtZTJdID0gcmVkdWNlcjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlZHVjZXJOYW1lcy5mb3JFYWNoKChyZWR1Y2VyTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVkdWNlckRlZmluaXRpb24gPSByZWR1Y2Vyc1tyZWR1Y2VyTmFtZV07XG4gICAgICBjb25zdCByZWR1Y2VyRGV0YWlscyA9IHtcbiAgICAgICAgcmVkdWNlck5hbWUsXG4gICAgICAgIHR5cGU6IGdldFR5cGUobmFtZSwgcmVkdWNlck5hbWUpLFxuICAgICAgICBjcmVhdGVOb3RhdGlvbjogdHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgfTtcbiAgICAgIGlmIChpc0FzeW5jVGh1bmtTbGljZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSkge1xuICAgICAgICBoYW5kbGVUaHVua0Nhc2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzLCBjQVQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRldGFpbHMsIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0TWV0aG9kcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gYnVpbGRSZWR1Y2VyKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IFwiVGhlIG9iamVjdCBub3RhdGlvbiBmb3IgYGNyZWF0ZVNsaWNlLmV4dHJhUmVkdWNlcnNgIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlICdidWlsZGVyIGNhbGxiYWNrJyBub3RhdGlvbiBpbnN0ZWFkOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9jcmVhdGVTbGljZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW2V4dHJhUmVkdWNlcnMgPSB7fSwgYWN0aW9uTWF0Y2hlcnMgPSBbXSwgZGVmYXVsdENhc2VSZWR1Y2VyID0gdm9pZCAwXSA9IHR5cGVvZiBvcHRpb25zLmV4dHJhUmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKG9wdGlvbnMuZXh0cmFSZWR1Y2VycykgOiBbb3B0aW9ucy5leHRyYVJlZHVjZXJzXTtcbiAgICAgIGNvbnN0IGZpbmFsQ2FzZVJlZHVjZXJzID0ge1xuICAgICAgICAuLi5leHRyYVJlZHVjZXJzLFxuICAgICAgICAuLi5jb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlZHVjZXIob3B0aW9ucy5pbml0aWFsU3RhdGUsIChidWlsZGVyKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBmaW5hbENhc2VSZWR1Y2Vycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkQ2FzZShrZXksIGZpbmFsQ2FzZVJlZHVjZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHNNIG9mIGNvbnRleHQuc2xpY2VNYXRjaGVycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkTWF0Y2hlcihzTS5tYXRjaGVyLCBzTS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBtIG9mIGFjdGlvbk1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKG0ubWF0Y2hlciwgbS5yZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGREZWZhdWx0Q2FzZShkZWZhdWx0Q2FzZVJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0U2VsZiA9IChzdGF0ZSkgPT4gc3RhdGU7XG4gICAgY29uc3QgaW5qZWN0ZWRTZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBjb25zdCBpbmplY3RlZFN0YXRlQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgICBsZXQgX3JlZHVjZXI7XG4gICAgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgICBpZiAoIV9yZWR1Y2VyKSBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xuICAgICAgcmV0dXJuIF9yZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aDIsIGluamVjdGVkID0gZmFsc2UpIHtcbiAgICAgIGZ1bmN0aW9uIHNlbGVjdFNsaWNlKHN0YXRlKSB7XG4gICAgICAgIGxldCBzbGljZVN0YXRlID0gc3RhdGVbcmVkdWNlclBhdGgyXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgICAgICBzbGljZVN0YXRlID0gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFN0YXRlQ2FjaGUsIHNlbGVjdFNsaWNlLCBnZXRJbml0aWFsU3RhdGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcInNlbGVjdFNsaWNlIHJldHVybmVkIHVuZGVmaW5lZCBmb3IgYW4gdW5pbmplY3RlZCBzbGljZSByZWR1Y2VyXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xpY2VTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSA9IHNlbGVjdFNlbGYpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JDYWNoZSA9IGdldE9ySW5zZXJ0Q29tcHV0ZWQoaW5qZWN0ZWRTZWxlY3RvckNhY2hlLCBpbmplY3RlZCwgKCkgPT4gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCkpO1xuICAgICAgICByZXR1cm4gZ2V0T3JJbnNlcnRDb21wdXRlZChzZWxlY3RvckNhY2hlLCBzZWxlY3RTdGF0ZSwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hcCA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgW25hbWUyLCBzZWxlY3Rvcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zZWxlY3RvcnMgPz8ge30pKSB7XG4gICAgICAgICAgICBtYXBbbmFtZTJdID0gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgKCkgPT4gZ2V0T3JJbnNlcnRDb21wdXRlZChpbmplY3RlZFN0YXRlQ2FjaGUsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUpLCBpbmplY3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHJlZHVjZXJQYXRoMixcbiAgICAgICAgZ2V0U2VsZWN0b3JzLFxuICAgICAgICBnZXQgc2VsZWN0b3JzKCkge1xuICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcnMoc2VsZWN0U2xpY2UpO1xuICAgICAgICB9LFxuICAgICAgICBzZWxlY3RTbGljZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2xpY2UgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcmVkdWNlcixcbiAgICAgIGFjdGlvbnM6IGNvbnRleHQuYWN0aW9uQ3JlYXRvcnMsXG4gICAgICBjYXNlUmVkdWNlcnM6IGNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWUsXG4gICAgICBnZXRJbml0aWFsU3RhdGUsXG4gICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhyZWR1Y2VyUGF0aCksXG4gICAgICBpbmplY3RJbnRvKGluamVjdGFibGUsIHtcbiAgICAgICAgcmVkdWNlclBhdGg6IHBhdGhPcHQsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG5ld1JlZHVjZXJQYXRoID0gcGF0aE9wdCA/PyByZWR1Y2VyUGF0aDtcbiAgICAgICAgaW5qZWN0YWJsZS5pbmplY3Qoe1xuICAgICAgICAgIHJlZHVjZXJQYXRoOiBuZXdSZWR1Y2VyUGF0aCxcbiAgICAgICAgICByZWR1Y2VyXG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2xpY2UsXG4gICAgICAgICAgLi4ubWFrZVNlbGVjdG9yUHJvcHMobmV3UmVkdWNlclBhdGgsIHRydWUpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gc2xpY2U7XG4gIH07XG59XG5mdW5jdGlvbiB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIGluamVjdGVkKSB7XG4gIGZ1bmN0aW9uIHdyYXBwZXIocm9vdFN0YXRlLCAuLi5hcmdzKSB7XG4gICAgbGV0IHNsaWNlU3RhdGUgPSBzZWxlY3RTdGF0ZShyb290U3RhdGUpO1xuICAgIGlmICh0eXBlb2Ygc2xpY2VTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKGluamVjdGVkKSB7XG4gICAgICAgIHNsaWNlU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwic2VsZWN0U3RhdGUgcmV0dXJuZWQgdW5kZWZpbmVkIGZvciBhbiB1bmluamVjdGVkIHNsaWNlIHJlZHVjZXJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcihzbGljZVN0YXRlLCAuLi5hcmdzKTtcbiAgfVxuICB3cmFwcGVyLnVud3JhcHBlZCA9IHNlbGVjdG9yO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbnZhciBjcmVhdGVTbGljZSA9IC8qIEBfX1BVUkVfXyAqLyBidWlsZENyZWF0ZVNsaWNlKCk7XG5mdW5jdGlvbiBidWlsZFJlZHVjZXJDcmVhdG9ycygpIHtcbiAgZnVuY3Rpb24gYXN5bmNUaHVuayhwYXlsb2FkQ3JlYXRvciwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi8sXG4gICAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG4gIH1cbiAgYXN5bmNUaHVuay53aXRoVHlwZXMgPSAoKSA9PiBhc3luY1RodW5rO1xuICByZXR1cm4ge1xuICAgIHJlZHVjZXIoY2FzZVJlZHVjZXIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgLy8gaGFjayBzbyB0aGUgd3JhcHBpbmcgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlciBzbyB0aGUgYHJlZHVjZXJEZWZpbml0aW9uVHlwZWAgaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICBbY2FzZVJlZHVjZXIubmFtZV0oLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVtjYXNlUmVkdWNlci5uYW1lXSwge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJcIiAvKiByZWR1Y2VyICovXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZXBhcmVkUmVkdWNlcihwcmVwYXJlLCByZWR1Y2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLyxcbiAgICAgICAgcHJlcGFyZSxcbiAgICAgICAgcmVkdWNlclxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jVGh1bmtcbiAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU5vcm1hbFJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWUsXG4gIGNyZWF0ZU5vdGF0aW9uXG59LCBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSwgY29udGV4dCkge1xuICBsZXQgY2FzZVJlZHVjZXI7XG4gIGxldCBwcmVwYXJlQ2FsbGJhY2s7XG4gIGlmIChcInJlZHVjZXJcIiBpbiBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkge1xuICAgIGlmIChjcmVhdGVOb3RhdGlvbiAmJiAhaXNDYXNlUmVkdWNlcldpdGhQcmVwYXJlRGVmaW5pdGlvbihtYXliZVJlZHVjZXJXaXRoUHJlcGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IFwiUGxlYXNlIHVzZSB0aGUgYGNyZWF0ZS5wcmVwYXJlZFJlZHVjZXJgIG5vdGF0aW9uIGZvciBwcmVwYXJlZCBhY3Rpb24gY3JlYXRvcnMgd2l0aCB0aGUgYGNyZWF0ZWAgbm90YXRpb24uXCIpO1xuICAgIH1cbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLnJlZHVjZXI7XG4gICAgcHJlcGFyZUNhbGxiYWNrID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucHJlcGFyZTtcbiAgfSBlbHNlIHtcbiAgICBjYXNlUmVkdWNlciA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlO1xuICB9XG4gIGNvbnRleHQuYWRkQ2FzZSh0eXBlLCBjYXNlUmVkdWNlcikuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIGNhc2VSZWR1Y2VyKS5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHByZXBhcmVDYWxsYmFjayA/IGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQ2FsbGJhY2spIDogY3JlYXRlQWN0aW9uKHR5cGUpKTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwiYXN5bmNUaHVua1wiIC8qIGFzeW5jVGh1bmsgKi87XG59XG5mdW5jdGlvbiBpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSB7XG4gIHJldHVybiByZWR1Y2VyRGVmaW5pdGlvbi5fcmVkdWNlckRlZmluaXRpb25UeXBlID09PSBcInJlZHVjZXJXaXRoUHJlcGFyZVwiIC8qIHJlZHVjZXJXaXRoUHJlcGFyZSAqLztcbn1cbmZ1bmN0aW9uIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHtcbiAgdHlwZSxcbiAgcmVkdWNlck5hbWVcbn0sIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0LCBjQVQpIHtcbiAgaWYgKCFjQVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOCkgOiBcIkNhbm5vdCB1c2UgYGNyZWF0ZS5hc3luY1RodW5rYCBpbiB0aGUgYnVpbHQtaW4gYGNyZWF0ZVNsaWNlYC4gVXNlIGBidWlsZENyZWF0ZVNsaWNlKHsgY3JlYXRvcnM6IHsgYXN5bmNUaHVuazogYXN5bmNUaHVua0NyZWF0b3IgfSB9KWAgdG8gY3JlYXRlIGEgY3VzdG9taXNlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTbGljZWAuXCIpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkQ3JlYXRvcixcbiAgICBmdWxmaWxsZWQsXG4gICAgcGVuZGluZyxcbiAgICByZWplY3RlZCxcbiAgICBzZXR0bGVkLFxuICAgIG9wdGlvbnNcbiAgfSA9IHJlZHVjZXJEZWZpbml0aW9uO1xuICBjb25zdCB0aHVuayA9IGNBVCh0eXBlLCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucyk7XG4gIGNvbnRleHQuZXhwb3NlQWN0aW9uKHJlZHVjZXJOYW1lLCB0aHVuayk7XG4gIGlmIChmdWxmaWxsZWQpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsuZnVsZmlsbGVkLCBmdWxmaWxsZWQpO1xuICB9XG4gIGlmIChwZW5kaW5nKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnBlbmRpbmcsIHBlbmRpbmcpO1xuICB9XG4gIGlmIChyZWplY3RlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5yZWplY3RlZCwgcmVqZWN0ZWQpO1xuICB9XG4gIGlmIChzZXR0bGVkKSB7XG4gICAgY29udGV4dC5hZGRNYXRjaGVyKHRodW5rLnNldHRsZWQsIHNldHRsZWQpO1xuICB9XG4gIGNvbnRleHQuZXhwb3NlQ2FzZVJlZHVjZXIocmVkdWNlck5hbWUsIHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCB8fCBub29wLFxuICAgIHBlbmRpbmc6IHBlbmRpbmcgfHwgbm9vcCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWQgfHwgbm9vcCxcbiAgICBzZXR0bGVkOiBzZXR0bGVkIHx8IG5vb3BcbiAgfSk7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG4vLyBzcmMvZW50aXRpZXMvZW50aXR5X3N0YXRlLnRzXG5mdW5jdGlvbiBnZXRJbml0aWFsRW50aXR5U3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgaWRzOiBbXSxcbiAgICBlbnRpdGllczoge31cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKSB7XG4gIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZShhZGRpdGlvbmFsU3RhdGUgPSB7fSwgZW50aXRpZXMpIHtcbiAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCksIGFkZGl0aW9uYWxTdGF0ZSk7XG4gICAgcmV0dXJuIGVudGl0aWVzID8gc3RhdGVBZGFwdGVyLnNldEFsbChzdGF0ZSwgZW50aXRpZXMpIDogc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRJbml0aWFsU3RhdGVcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3N0YXRlX3NlbGVjdG9ycy50c1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpIHtcbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKHNlbGVjdFN0YXRlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjcmVhdGVTZWxlY3RvcjogY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZWxlY3RJZHMgPSAoc3RhdGUpID0+IHN0YXRlLmlkcztcbiAgICBjb25zdCBzZWxlY3RFbnRpdGllcyA9IChzdGF0ZSkgPT4gc3RhdGUuZW50aXRpZXM7XG4gICAgY29uc3Qgc2VsZWN0QWxsID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdElkcywgc2VsZWN0RW50aXRpZXMsIChpZHMsIGVudGl0aWVzKSA9PiBpZHMubWFwKChpZCkgPT4gZW50aXRpZXNbaWRdKSk7XG4gICAgY29uc3Qgc2VsZWN0SWQgPSAoXywgaWQpID0+IGlkO1xuICAgIGNvbnN0IHNlbGVjdEJ5SWQgPSAoZW50aXRpZXMsIGlkKSA9PiBlbnRpdGllc1tpZF07XG4gICAgY29uc3Qgc2VsZWN0VG90YWwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCAoaWRzKSA9PiBpZHMubGVuZ3RoKTtcbiAgICBpZiAoIXNlbGVjdFN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWxlY3RJZHMsXG4gICAgICAgIHNlbGVjdEVudGl0aWVzLFxuICAgICAgICBzZWxlY3RBbGwsXG4gICAgICAgIHNlbGVjdFRvdGFsLFxuICAgICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0RW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RFbnRpdGllcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdElkczogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RJZHMpLFxuICAgICAgc2VsZWN0RW50aXRpZXM6IHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcyxcbiAgICAgIHNlbGVjdEFsbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RBbGwpLFxuICAgICAgc2VsZWN0VG90YWw6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0VG90YWwpLFxuICAgICAgc2VsZWN0QnlJZDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFNlbGVjdG9yc1xuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfYWRhcHRlci50c1xuaW1wb3J0IHsgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUzLCBpc0RyYWZ0IGFzIGlzRHJhZnQzIH0gZnJvbSBcImltbWVyXCI7XG52YXIgaXNEcmFmdFR5cGVkID0gaXNEcmFmdDM7XG5mdW5jdGlvbiBjcmVhdGVTaW5nbGVBcmd1bWVudFN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICBjb25zdCBvcGVyYXRvciA9IGNyZWF0ZVN0YXRlT3BlcmF0b3IoKF8sIHN0YXRlKSA9PiBtdXRhdG9yKHN0YXRlKSk7XG4gIHJldHVybiBmdW5jdGlvbiBvcGVyYXRpb24oc3RhdGUpIHtcbiAgICByZXR1cm4gb3BlcmF0b3Ioc3RhdGUsIHZvaWQgMCk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0ZU9wZXJhdG9yKG11dGF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSwgYXJnKSB7XG4gICAgZnVuY3Rpb24gaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnMikge1xuICAgICAgcmV0dXJuIGlzRlNBKGFyZzIpO1xuICAgIH1cbiAgICBjb25zdCBydW5NdXRhdG9yID0gKGRyYWZ0KSA9PiB7XG4gICAgICBpZiAoaXNQYXlsb2FkQWN0aW9uQXJndW1lbnQoYXJnKSkge1xuICAgICAgICBtdXRhdG9yKGFyZy5wYXlsb2FkLCBkcmFmdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdG9yKGFyZywgZHJhZnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGlzRHJhZnRUeXBlZChzdGF0ZSkpIHtcbiAgICAgIHJ1bk11dGF0b3Ioc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTmV4dFN0YXRlMyhzdGF0ZSwgcnVuTXV0YXRvcik7XG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91dGlscy50c1xuaW1wb3J0IHsgY3VycmVudCBhcyBjdXJyZW50MiwgaXNEcmFmdCBhcyBpc0RyYWZ0NCB9IGZyb20gXCJpbW1lclwiO1xuZnVuY3Rpb24gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKSB7XG4gIGNvbnN0IGtleSA9IHNlbGVjdElkKGVudGl0eSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYga2V5ID09PSB2b2lkIDApIHtcbiAgICBjb25zb2xlLndhcm4oXCJUaGUgZW50aXR5IHBhc3NlZCB0byB0aGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCB1bmRlZmluZWQuXCIsIFwiWW91IHNob3VsZCBwcm9iYWJseSBwcm92aWRlIHlvdXIgb3duIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb24uXCIsIFwiVGhlIGVudGl0eSB0aGF0IHdhcyBwYXNzZWQ6XCIsIGVudGl0eSwgXCJUaGUgYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbjpcIiwgc2VsZWN0SWQudG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUVudGl0aWVzQXJyYXkoZW50aXRpZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xuICAgIGVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhlbnRpdGllcyk7XG4gIH1cbiAgcmV0dXJuIGVudGl0aWVzO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNEcmFmdDQodmFsdWUpID8gY3VycmVudDIodmFsdWUpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpIHtcbiAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHNBcnJheSA9IGdldEN1cnJlbnQoc3RhdGUuaWRzKTtcbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KGV4aXN0aW5nSWRzQXJyYXkpO1xuICBjb25zdCBhZGRlZCA9IFtdO1xuICBjb25zdCBhZGRlZElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtdKTtcbiAgY29uc3QgdXBkYXRlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKGlkKSB8fCBhZGRlZElkcy5oYXMoaWQpKSB7XG4gICAgICB1cGRhdGVkLnB1c2goe1xuICAgICAgICBpZCxcbiAgICAgICAgY2hhbmdlczogZW50aXR5XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkZWRJZHMuYWRkKGlkKTtcbiAgICAgIGFkZGVkLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91bnNvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCkge1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKCEoa2V5IGluIHN0YXRlLmVudGl0aWVzKSkge1xuICAgICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVPbmVNdXRhYmx5KGtleSwgc3RhdGUpIHtcbiAgICByZXR1cm4gcmVtb3ZlTWFueU11dGFibHkoW2tleV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xuICAgIGxldCBkaWRNdXRhdGUgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcbiAgICAgICAgZGlkTXV0YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGlkTXV0YXRlKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBzdGF0ZS5pZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW1vdmVBbGxNdXRhYmx5KHN0YXRlKSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgaWRzOiBbXSxcbiAgICAgIGVudGl0aWVzOiB7fVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHRha2VOZXdLZXkoa2V5cywgdXBkYXRlLCBzdGF0ZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsMyA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgaWYgKG9yaWdpbmFsMyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbDMsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICBjb25zdCBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcbiAgICBjb25zdCBoYXNOZXdLZXkgPSBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcbiAgICBpZiAoaGFzTmV3S2V5KSB7XG4gICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XG4gICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW25ld0tleV0gPSB1cGRhdGVkO1xuICAgIHJldHVybiBoYXNOZXdLZXk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBjb25zdCBuZXdLZXlzID0ge307XG4gICAgY29uc3QgdXBkYXRlc1BlckVudGl0eSA9IHt9O1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIHVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXSA9IHtcbiAgICAgICAgICBpZDogdXBkYXRlLmlkLFxuICAgICAgICAgIC8vIFNwcmVhZHMgaWdub3JlIGZhbHN5IHZhbHVlcywgc28gdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlIGlzbid0XG4gICAgICAgICAgLy8gYW4gZXhpc3RpbmcgdXBkYXRlIGFscmVhZHkgYXQgdGhpcyBrZXlcbiAgICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICAuLi51cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0/LmNoYW5nZXMsXG4gICAgICAgICAgICAuLi51cGRhdGUuY2hhbmdlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1cGRhdGVzID0gT2JqZWN0LnZhbHVlcyh1cGRhdGVzUGVyRW50aXR5KTtcbiAgICBjb25zdCBkaWRNdXRhdGVFbnRpdGllcyA9IHVwZGF0ZXMubGVuZ3RoID4gMDtcbiAgICBpZiAoZGlkTXV0YXRlRW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IGRpZE11dGF0ZUlkcyA9IHVwZGF0ZXMuZmlsdGVyKCh1cGRhdGUpID0+IHRha2VOZXdLZXkobmV3S2V5cywgdXBkYXRlLCBzdGF0ZSkpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoZGlkTXV0YXRlSWRzKSB7XG4gICAgICAgIHN0YXRlLmlkcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZW50aXRpZXMpLm1hcCgoZSkgPT4gc2VsZWN0SWRWYWx1ZShlLCBzZWxlY3RJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWRdID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xuICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZUFsbDogY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKHJlbW92ZUFsbE11dGFibHkpLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSksXG4gICAgcmVtb3ZlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU9uZU11dGFibHkpLFxuICAgIHJlbW92ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlTWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgbGV0IGxvd0luZGV4ID0gMDtcbiAgbGV0IGhpZ2hJbmRleCA9IHNvcnRlZEl0ZW1zLmxlbmd0aDtcbiAgd2hpbGUgKGxvd0luZGV4IDwgaGlnaEluZGV4KSB7XG4gICAgbGV0IG1pZGRsZUluZGV4ID0gbG93SW5kZXggKyBoaWdoSW5kZXggPj4+IDE7XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSBzb3J0ZWRJdGVtc1ttaWRkbGVJbmRleF07XG4gICAgY29uc3QgcmVzID0gY29tcGFyaXNvbkZ1bmN0aW9uKGl0ZW0sIGN1cnJlbnRJdGVtKTtcbiAgICBpZiAocmVzID49IDApIHtcbiAgICAgIGxvd0luZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoSW5kZXggPSBtaWRkbGVJbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvd0luZGV4O1xufVxuZnVuY3Rpb24gaW5zZXJ0KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgY29uc3QgaW5zZXJ0QXRJbmRleCA9IGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKTtcbiAgc29ydGVkSXRlbXMuc3BsaWNlKGluc2VydEF0SW5kZXgsIDAsIGl0ZW0pO1xuICByZXR1cm4gc29ydGVkSXRlbXM7XG59XG5mdW5jdGlvbiBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIGNvbXBhcmVyKSB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGxcbiAgfSA9IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIGFkZE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBleGlzdGluZ0lkcykge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChleGlzdGluZ0lkcyA/PyBnZXRDdXJyZW50KHN0YXRlLmlkcykpO1xuICAgIGNvbnN0IG1vZGVscyA9IG5ld0VudGl0aWVzLmZpbHRlcigobW9kZWwpID0+ICFleGlzdGluZ0tleXMuaGFzKHNlbGVjdElkVmFsdWUobW9kZWwsIHNlbGVjdElkKSkpO1xuICAgIGlmIChtb2RlbHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBtb2RlbHMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gc2V0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbc2VsZWN0SWQoaXRlbSldO1xuICAgICAgfVxuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbmV3RW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIFtdKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGxldCBhcHBsaWVkVXBkYXRlcyA9IGZhbHNlO1xuICAgIGxldCByZXBsYWNlZElkcyA9IGZhbHNlO1xuICAgIGZvciAobGV0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhcHBsaWVkVXBkYXRlcyA9IHRydWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgY29uc3QgbmV3SWQgPSBzZWxlY3RJZChlbnRpdHkpO1xuICAgICAgaWYgKHVwZGF0ZS5pZCAhPT0gbmV3SWQpIHtcbiAgICAgICAgcmVwbGFjZWRJZHMgPSB0cnVlO1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBzdGF0ZS5pZHMuaW5kZXhPZih1cGRhdGUuaWQpO1xuICAgICAgICBzdGF0ZS5pZHNbb2xkSW5kZXhdID0gbmV3SWQ7XG4gICAgICAgIHN0YXRlLmVudGl0aWVzW25ld0lkXSA9IGVudGl0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBbXSwgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgaWYgKGFkZGVkLmxlbmd0aCkge1xuICAgICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlLCBleGlzdGluZ0lkc0FycmF5KTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoKSB7XG4gICAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gPT09IGJbaV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG1lcmdlRnVuY3Rpb24gPSAoc3RhdGUsIGFkZGVkSXRlbXMsIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcykgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGdldEN1cnJlbnQoc3RhdGUuZW50aXRpZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gICAgY29uc3Qgc3RhdGVFbnRpdGllcyA9IHN0YXRlLmVudGl0aWVzO1xuICAgIGxldCBpZHMgPSBjdXJyZW50SWRzO1xuICAgIGlmIChyZXBsYWNlZElkcykge1xuICAgICAgaWRzID0gbmV3IFNldChjdXJyZW50SWRzKTtcbiAgICB9XG4gICAgbGV0IHNvcnRlZEVudGl0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGN1cnJlbnRFbnRpdGllc1tpZF07XG4gICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgIHNvcnRlZEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2FzUHJldmlvdXNseUVtcHR5ID0gc29ydGVkRW50aXRpZXMubGVuZ3RoID09PSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhZGRlZEl0ZW1zKSB7XG4gICAgICBzdGF0ZUVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXSA9IGl0ZW07XG4gICAgICBpZiAoIXdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgICBpbnNlcnQoc29ydGVkRW50aXRpZXMsIGl0ZW0sIGNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgc29ydGVkRW50aXRpZXMgPSBhZGRlZEl0ZW1zLnNsaWNlKCkuc29ydChjb21wYXJlcik7XG4gICAgfSBlbHNlIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgc29ydGVkRW50aXRpZXMuc29ydChjb21wYXJlcik7XG4gICAgfVxuICAgIGNvbnN0IG5ld1NvcnRlZElkcyA9IHNvcnRlZEVudGl0aWVzLm1hcChzZWxlY3RJZCk7XG4gICAgaWYgKCFhcmVBcnJheXNFcXVhbChjdXJyZW50SWRzLCBuZXdTb3J0ZWRJZHMpKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBuZXdTb3J0ZWRJZHM7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbCxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9jcmVhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlclxuICB9ID0ge1xuICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXG4gICAgc2VsZWN0SWQ6IChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuaWQsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBzdGF0ZUFkYXB0ZXIgPSBzb3J0Q29tcGFyZXIgPyBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIHNvcnRDb21wYXJlcikgOiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGNvbnN0IHN0YXRlRmFjdG9yeSA9IGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKTtcbiAgY29uc3Qgc2VsZWN0b3JzRmFjdG9yeSA9IGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKTtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXIsXG4gICAgLi4uc3RhdGVGYWN0b3J5LFxuICAgIC4uLnNlbGVjdG9yc0ZhY3RvcnksXG4gICAgLi4uc3RhdGVBZGFwdGVyXG4gIH07XG59XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbmltcG9ydCB7IGlzQWN0aW9uIGFzIGlzQWN0aW9uMyB9IGZyb20gXCJyZWR1eFwiO1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2V4Y2VwdGlvbnMudHNcbnZhciB0YXNrID0gXCJ0YXNrXCI7XG52YXIgbGlzdGVuZXIgPSBcImxpc3RlbmVyXCI7XG52YXIgY29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcbnZhciBjYW5jZWxsZWQgPSBcImNhbmNlbGxlZFwiO1xudmFyIHRhc2tDYW5jZWxsZWQgPSBgdGFzay0ke2NhbmNlbGxlZH1gO1xudmFyIHRhc2tDb21wbGV0ZWQgPSBgdGFzay0ke2NvbXBsZXRlZH1gO1xudmFyIGxpc3RlbmVyQ2FuY2VsbGVkID0gYCR7bGlzdGVuZXJ9LSR7Y2FuY2VsbGVkfWA7XG52YXIgbGlzdGVuZXJDb21wbGV0ZWQgPSBgJHtsaXN0ZW5lcn0tJHtjb21wbGV0ZWR9YDtcbnZhciBUYXNrQWJvcnRFcnJvciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29kZSkge1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5tZXNzYWdlID0gYCR7dGFza30gJHtjYW5jZWxsZWR9IChyZWFzb246ICR7Y29kZX0pYDtcbiAgfVxuICBuYW1lID0gXCJUYXNrQWJvcnRFcnJvclwiO1xuICBtZXNzYWdlO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS91dGlscy50c1xudmFyIGFzc2VydEZ1bmN0aW9uID0gKGZ1bmMsIGV4cGVjdGVkKSA9PiB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMyKSA6IGAke2V4cGVjdGVkfSBpcyBub3QgYSBmdW5jdGlvbmApO1xuICB9XG59O1xudmFyIG5vb3AyID0gKCkgPT4ge1xufTtcbnZhciBjYXRjaFJlamVjdGlvbiA9IChwcm9taXNlLCBvbkVycm9yID0gbm9vcDIpID0+IHtcbiAgcHJvbWlzZS5jYXRjaChvbkVycm9yKTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xudmFyIGFkZEFib3J0U2lnbmFsTGlzdGVuZXIgPSAoYWJvcnRTaWduYWwsIGNhbGxiYWNrKSA9PiB7XG4gIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjaywge1xuICAgIG9uY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiAoKSA9PiBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2spO1xufTtcbnZhciBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uID0gKGFib3J0Q29udHJvbGxlciwgcmVhc29uKSA9PiB7XG4gIGNvbnN0IHNpZ25hbCA9IGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIShcInJlYXNvblwiIGluIHNpZ25hbCkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2lnbmFsLCBcInJlYXNvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHJlYXNvbixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdGFzay50c1xudmFyIHZhbGlkYXRlQWN0aXZlID0gKHNpZ25hbCkgPT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICByZWFzb25cbiAgICB9ID0gc2lnbmFsO1xuICAgIHRocm93IG5ldyBUYXNrQWJvcnRFcnJvcihyZWFzb24pO1xuICB9XG59O1xuZnVuY3Rpb24gcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKSB7XG4gIGxldCBjbGVhbnVwID0gbm9vcDI7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgbm90aWZ5UmVqZWN0aW9uID0gKCkgPT4gcmVqZWN0KG5ldyBUYXNrQWJvcnRFcnJvcihzaWduYWwucmVhc29uKSk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBub3RpZnlSZWplY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYW51cCA9IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIoc2lnbmFsLCBub3RpZnlSZWplY3Rpb24pO1xuICAgIHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhbnVwKCkpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYW51cCA9IG5vb3AyO1xuICB9KTtcbn1cbnZhciBydW5UYXNrID0gYXN5bmMgKHRhc2syLCBjbGVhblVwKSA9PiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0YXNrMigpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yID8gXCJjYW5jZWxsZWRcIiA6IFwicmVqZWN0ZWRcIixcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhblVwPy4oKTtcbiAgfVxufTtcbnZhciBjcmVhdGVQYXVzZSA9IChzaWduYWwpID0+IHtcbiAgcmV0dXJuIChwcm9taXNlKSA9PiB7XG4gICAgcmV0dXJuIGNhdGNoUmVqZWN0aW9uKHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkudGhlbigob3V0cHV0KSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KSk7XG4gIH07XG59O1xudmFyIGNyZWF0ZURlbGF5ID0gKHNpZ25hbCkgPT4ge1xuICBjb25zdCBwYXVzZSA9IGNyZWF0ZVBhdXNlKHNpZ25hbCk7XG4gIHJldHVybiAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIHBhdXNlKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcykpKTtcbiAgfTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbnZhciB7XG4gIGFzc2lnblxufSA9IE9iamVjdDtcbnZhciBJTlRFUk5BTF9OSUxfVE9LRU4gPSB7fTtcbnZhciBhbG0gPSBcImxpc3RlbmVyTWlkZGxld2FyZVwiO1xudmFyIGNyZWF0ZUZvcmsgPSAocGFyZW50QWJvcnRTaWduYWwsIHBhcmVudEJsb2NraW5nUHJvbWlzZXMpID0+IHtcbiAgY29uc3QgbGlua0NvbnRyb2xsZXJzID0gKGNvbnRyb2xsZXIpID0+IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIocGFyZW50QWJvcnRTaWduYWwsICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgcGFyZW50QWJvcnRTaWduYWwucmVhc29uKSk7XG4gIHJldHVybiAodGFza0V4ZWN1dG9yLCBvcHRzKSA9PiB7XG4gICAgYXNzZXJ0RnVuY3Rpb24odGFza0V4ZWN1dG9yLCBcInRhc2tFeGVjdXRvclwiKTtcbiAgICBjb25zdCBjaGlsZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsaW5rQ29udHJvbGxlcnMoY2hpbGRBYm9ydENvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1blRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUocGFyZW50QWJvcnRTaWduYWwpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IHJlc3VsdDIgPSBhd2FpdCB0YXNrRXhlY3V0b3Ioe1xuICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIHNpZ25hbDogY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ29tcGxldGVkKSk7XG4gICAgaWYgKG9wdHM/LmF1dG9Kb2luKSB7XG4gICAgICBwYXJlbnRCbG9ja2luZ1Byb21pc2VzLnB1c2gocmVzdWx0LmNhdGNoKG5vb3AyKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGNyZWF0ZVBhdXNlKHBhcmVudEFib3J0U2lnbmFsKShyZXN1bHQpLFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ2FuY2VsbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufTtcbnZhciBjcmVhdGVUYWtlUGF0dGVybiA9IChzdGFydExpc3RlbmluZywgc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHRha2UgPSBhc3luYyAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB7XG4gICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICBsZXQgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBjb25zdCB0dXBsZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc3RvcExpc3RlbmluZyA9IHN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgcHJlZGljYXRlLFxuICAgICAgICBlZmZlY3Q6IChhY3Rpb24sIGxpc3RlbmVyQXBpKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJBcGkudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKFthY3Rpb24sIGxpc3RlbmVyQXBpLmdldFN0YXRlKCksIGxpc3RlbmVyQXBpLmdldE9yaWdpbmFsU3RhdGUoKV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBzdG9wTGlzdGVuaW5nKCk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFt0dXBsZVByb21pc2VdO1xuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCwgbnVsbCkpKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgUHJvbWlzZS5yYWNlKHByb21pc2VzKSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiBjYXRjaFJlamVjdGlvbih0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkpO1xufTtcbnZhciBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tID0gKG9wdGlvbnMpID0+IHtcbiAgbGV0IHtcbiAgICB0eXBlLFxuICAgIGFjdGlvbkNyZWF0b3IsXG4gICAgbWF0Y2hlcixcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBvcHRpb25zO1xuICBpZiAodHlwZSkge1xuICAgIHByZWRpY2F0ZSA9IGNyZWF0ZUFjdGlvbih0eXBlKS5tYXRjaDtcbiAgfSBlbHNlIGlmIChhY3Rpb25DcmVhdG9yKSB7XG4gICAgdHlwZSA9IGFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICBwcmVkaWNhdGUgPSBhY3Rpb25DcmVhdG9yLm1hdGNoO1xuICB9IGVsc2UgaWYgKG1hdGNoZXIpIHtcbiAgICBwcmVkaWNhdGUgPSBtYXRjaGVyO1xuICB9IGVsc2UgaWYgKHByZWRpY2F0ZSkge1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIxKSA6IFwiQ3JlYXRpbmcgb3IgcmVtb3ZpbmcgYSBsaXN0ZW5lciByZXF1aXJlcyBvbmUgb2YgdGhlIGtub3duIGZpZWxkcyBmb3IgbWF0Y2hpbmcgYW4gYWN0aW9uXCIpO1xuICB9XG4gIGFzc2VydEZ1bmN0aW9uKGVmZmVjdCwgXCJvcHRpb25zLmxpc3RlbmVyXCIpO1xuICByZXR1cm4ge1xuICAgIHByZWRpY2F0ZSxcbiAgICB0eXBlLFxuICAgIGVmZmVjdFxuICB9O1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lckVudHJ5ID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigob3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZDogbmFub2lkKCksXG4gICAgZWZmZWN0LFxuICAgIHR5cGUsXG4gICAgcHJlZGljYXRlLFxuICAgIHBlbmRpbmc6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIyKSA6IFwiVW5zdWJzY3JpYmUgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGVudHJ5O1xufSwge1xuICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZUxpc3RlbmVyRW50cnlcbn0pO1xudmFyIGZpbmRMaXN0ZW5lckVudHJ5ID0gKGxpc3RlbmVyTWFwLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGVmZmVjdCxcbiAgICBwcmVkaWNhdGVcbiAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKS5maW5kKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUHJlZGljYXRlT3JUeXBlID0gdHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgPyBlbnRyeS50eXBlID09PSB0eXBlIDogZW50cnkucHJlZGljYXRlID09PSBwcmVkaWNhdGU7XG4gICAgcmV0dXJuIG1hdGNoUHJlZGljYXRlT3JUeXBlICYmIGVudHJ5LmVmZmVjdCA9PT0gZWZmZWN0O1xuICB9KTtcbn07XG52YXIgY2FuY2VsQWN0aXZlTGlzdGVuZXJzID0gKGVudHJ5KSA9PiB7XG4gIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICB9KTtcbn07XG52YXIgY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSAobGlzdGVuZXJNYXApID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lck1hcC5mb3JFYWNoKGNhbmNlbEFjdGl2ZUxpc3RlbmVycyk7XG4gICAgbGlzdGVuZXJNYXAuY2xlYXIoKTtcbiAgfTtcbn07XG52YXIgc2FmZWx5Tm90aWZ5RXJyb3IgPSAoZXJyb3JIYW5kbGVyLCBlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pID0+IHtcbiAgdHJ5IHtcbiAgICBlcnJvckhhbmRsZXIoZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKTtcbiAgfSBjYXRjaCAoZXJyb3JIYW5kbGVyRXJyb3IpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGVycm9ySGFuZGxlckVycm9yO1xuICAgIH0sIDApO1xuICB9XG59O1xudmFyIGFkZExpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vYWRkYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBhZGRMaXN0ZW5lclxufSk7XG52YXIgY2xlYXJBbGxMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlQWxsYCk7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IHJlbW92ZUxpc3RlbmVyXG59KTtcbnZhciBkZWZhdWx0RXJyb3JIYW5kbGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc29sZS5lcnJvcihgJHthbG19L2Vycm9yYCwgLi4uYXJncyk7XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSA9IChtaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGxpc3RlbmVyTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qge1xuICAgIGV4dHJhLFxuICAgIG9uRXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyXG4gIH0gPSBtaWRkbGV3YXJlT3B0aW9ucztcbiAgYXNzZXJ0RnVuY3Rpb24ob25FcnJvciwgXCJvbkVycm9yXCIpO1xuICBjb25zdCBpbnNlcnRFbnRyeSA9IChlbnRyeSkgPT4ge1xuICAgIGVudHJ5LnVuc3Vic2NyaWJlID0gKCkgPT4gbGlzdGVuZXJNYXAuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gKGNhbmNlbE9wdGlvbnMpID0+IHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoY2FuY2VsT3B0aW9ucz8uY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZExpc3RlbmVyRW50cnkobGlzdGVuZXJNYXAsIG9wdGlvbnMpID8/IGNyZWF0ZUxpc3RlbmVyRW50cnkob3B0aW9ucyk7XG4gICAgcmV0dXJuIGluc2VydEVudHJ5KGVudHJ5KTtcbiAgfTtcbiAgYXNzaWduKHN0YXJ0TGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdGFydExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgc3RvcExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBmaW5kTGlzdGVuZXJFbnRyeShsaXN0ZW5lck1hcCwgb3B0aW9ucyk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBlbnRyeS51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKG9wdGlvbnMuY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIWVudHJ5O1xuICB9O1xuICBhc3NpZ24oc3RvcExpc3RlbmluZywge1xuICAgIHdpdGhUeXBlczogKCkgPT4gc3RvcExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXIgPSBhc3luYyAoZW50cnksIGFjdGlvbiwgYXBpLCBnZXRPcmlnaW5hbFN0YXRlKSA9PiB7XG4gICAgY29uc3QgaW50ZXJuYWxUYXNrQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB0YWtlID0gY3JlYXRlVGFrZVBhdHRlcm4oc3RhcnRMaXN0ZW5pbmcsIGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICBjb25zdCBhdXRvSm9pblByb21pc2VzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGVudHJ5LnBlbmRpbmcuYWRkKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGVudHJ5LmVmZmVjdChcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICAvLyBVc2UgYXNzaWduKCkgcmF0aGVyIHRoYW4gLi4uIHRvIGF2b2lkIGV4dHJhIGhlbHBlciBmdW5jdGlvbnMgYWRkZWQgdG8gYnVuZGxlXG4gICAgICAgIGFzc2lnbih7fSwgYXBpLCB7XG4gICAgICAgICAgZ2V0T3JpZ2luYWxTdGF0ZSxcbiAgICAgICAgICBjb25kaXRpb246IChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHRha2UocHJlZGljYXRlLCB0aW1lb3V0KS50aGVuKEJvb2xlYW4pLFxuICAgICAgICAgIHRha2UsXG4gICAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgIHNpZ25hbDogaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgZm9yazogY3JlYXRlRm9yayhpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCwgYXV0b0pvaW5Qcm9taXNlcyksXG4gICAgICAgICAgdW5zdWJzY3JpYmU6IGVudHJ5LnVuc3Vic2NyaWJlLFxuICAgICAgICAgIHN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXJNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnM6ICgpID0+IHtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlciwgXywgc2V0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9PSBpbnRlcm5hbFRhc2tDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5kZWxldGUoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aHJvd0lmQ2FuY2VsbGVkOiAoKSA9PiB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFjdGl2ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSk7XG4gICAgfSBjYXRjaCAobGlzdGVuZXJFcnJvcikge1xuICAgICAgaWYgKCEobGlzdGVuZXJFcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yKSkge1xuICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBsaXN0ZW5lckVycm9yLCB7XG4gICAgICAgICAgcmFpc2VkQnk6IFwiZWZmZWN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGF1dG9Kb2luUHJvbWlzZXMpO1xuICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNvbXBsZXRlZCk7XG4gICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlID0gY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUobGlzdGVuZXJNYXApO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoIWlzQWN0aW9uMyhhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgIH1cbiAgICBpZiAoYWRkTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXJ0TGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKGNsZWFyQWxsTGlzdGVuZXJzLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZW1vdmVMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RvcExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGxldCBvcmlnaW5hbFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2V0T3JpZ2luYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmIChvcmlnaW5hbFN0YXRlID09PSBJTlRFUk5BTF9OSUxfVE9LRU4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjMpIDogYCR7YWxtfTogZ2V0T3JpZ2luYWxTdGF0ZSBjYW4gb25seSBiZSBjYWxsZWQgc3luY2hyb25vdXNseWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbmFsU3RhdGU7XG4gICAgfTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBpZiAobGlzdGVuZXJNYXAuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gYXBpLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyRW50cmllcyA9IEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RlbmVyRW50cmllcykge1xuICAgICAgICAgIGxldCBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGVudHJ5LnByZWRpY2F0ZShhY3Rpb24sIGN1cnJlbnRTdGF0ZSwgb3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAocHJlZGljYXRlRXJyb3IpIHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBzYWZlbHlOb3RpZnlFcnJvcihvbkVycm9yLCBwcmVkaWNhdGVFcnJvciwge1xuICAgICAgICAgICAgICByYWlzZWRCeTogXCJwcmVkaWNhdGVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcnVuTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub3RpZnlMaXN0ZW5lcihlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9yaWdpbmFsU3RhdGUgPSBJTlRFUk5BTF9OSUxfVE9LRU47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBzdGFydExpc3RlbmluZyxcbiAgICBzdG9wTGlzdGVuaW5nLFxuICAgIGNsZWFyTGlzdGVuZXJzOiBjbGVhckxpc3RlbmVyTWlkZGxld2FyZVxuICB9O1xufTtcblxuLy8gc3JjL2R5bmFtaWNNaWRkbGV3YXJlL2luZGV4LnRzXG5pbXBvcnQgeyBjb21wb3NlIGFzIGNvbXBvc2UzIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgY3JlYXRlTWlkZGxld2FyZUVudHJ5ID0gKG1pZGRsZXdhcmUpID0+ICh7XG4gIG1pZGRsZXdhcmUsXG4gIGFwcGxpZWQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbn0pO1xudmFyIG1hdGNoSW5zdGFuY2UgPSAoaW5zdGFuY2VJZCkgPT4gKGFjdGlvbikgPT4gYWN0aW9uPy5tZXRhPy5pbnN0YW5jZUlkID09PSBpbnN0YW5jZUlkO1xudmFyIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlID0gKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZUlkID0gbmFub2lkKCk7XG4gIGNvbnN0IG1pZGRsZXdhcmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB3aXRoTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oY3JlYXRlQWN0aW9uKFwiZHluYW1pY01pZGRsZXdhcmUvYWRkXCIsICguLi5taWRkbGV3YXJlcykgPT4gKHtcbiAgICBwYXlsb2FkOiBtaWRkbGV3YXJlcyxcbiAgICBtZXRhOiB7XG4gICAgICBpbnN0YW5jZUlkXG4gICAgfVxuICB9KSksIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHdpdGhNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBhZGRNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBhZGRNaWRkbGV3YXJlMiguLi5taWRkbGV3YXJlcykge1xuICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBnZXRPckluc2VydENvbXB1dGVkKG1pZGRsZXdhcmVNYXAsIG1pZGRsZXdhcmUyLCBjcmVhdGVNaWRkbGV3YXJlRW50cnkpO1xuICAgIH0pO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBhZGRNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBnZXRGaW5hbE1pZGRsZXdhcmUgPSAoYXBpKSA9PiB7XG4gICAgY29uc3QgYXBwbGllZE1pZGRsZXdhcmUgPSBBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoZW50cnkuYXBwbGllZCwgYXBpLCBlbnRyeS5taWRkbGV3YXJlKSk7XG4gICAgcmV0dXJuIGNvbXBvc2UzKC4uLmFwcGxpZWRNaWRkbGV3YXJlKTtcbiAgfTtcbiAgY29uc3QgaXNXaXRoTWlkZGxld2FyZSA9IGlzQWxsT2Yod2l0aE1pZGRsZXdhcmUsIG1hdGNoSW5zdGFuY2UoaW5zdGFuY2VJZCkpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKGFwaSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNXaXRoTWlkZGxld2FyZShhY3Rpb24pKSB7XG4gICAgICBhZGRNaWRkbGV3YXJlKC4uLmFjdGlvbi5wYXlsb2FkKTtcbiAgICAgIHJldHVybiBhcGkuZGlzcGF0Y2g7XG4gICAgfVxuICAgIHJldHVybiBnZXRGaW5hbE1pZGRsZXdhcmUoYXBpKShuZXh0KShhY3Rpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgYWRkTWlkZGxld2FyZSxcbiAgICB3aXRoTWlkZGxld2FyZSxcbiAgICBpbnN0YW5jZUlkXG4gIH07XG59O1xuXG4vLyBzcmMvY29tYmluZVNsaWNlcy50c1xuaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIGFzIGNvbWJpbmVSZWR1Y2VyczIgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBpc1NsaWNlTGlrZSA9IChtYXliZVNsaWNlTGlrZSkgPT4gXCJyZWR1Y2VyUGF0aFwiIGluIG1heWJlU2xpY2VMaWtlICYmIHR5cGVvZiBtYXliZVNsaWNlTGlrZS5yZWR1Y2VyUGF0aCA9PT0gXCJzdHJpbmdcIjtcbnZhciBnZXRSZWR1Y2VycyA9IChzbGljZXMpID0+IHNsaWNlcy5mbGF0TWFwKChzbGljZU9yTWFwKSA9PiBpc1NsaWNlTGlrZShzbGljZU9yTWFwKSA/IFtbc2xpY2VPck1hcC5yZWR1Y2VyUGF0aCwgc2xpY2VPck1hcC5yZWR1Y2VyXV0gOiBPYmplY3QuZW50cmllcyhzbGljZU9yTWFwKSk7XG52YXIgT1JJR0lOQUxfU1RBVEUgPSBTeW1ib2wuZm9yKFwicnRrLXN0YXRlLXByb3h5LW9yaWdpbmFsXCIpO1xudmFyIGlzU3RhdGVQcm94eSA9ICh2YWx1ZSkgPT4gISF2YWx1ZSAmJiAhIXZhbHVlW09SSUdJTkFMX1NUQVRFXTtcbnZhciBzdGF0ZVByb3h5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG52YXIgY3JlYXRlU3RhdGVQcm94eSA9IChzdGF0ZSwgcmVkdWNlck1hcCwgaW5pdGlhbFN0YXRlQ2FjaGUpID0+IGdldE9ySW5zZXJ0Q29tcHV0ZWQoc3RhdGVQcm94eU1hcCwgc3RhdGUsICgpID0+IG5ldyBQcm94eShzdGF0ZSwge1xuICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKHByb3AgPT09IE9SSUdJTkFMX1NUQVRFKSByZXR1cm4gdGFyZ2V0O1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBpbml0aWFsU3RhdGVDYWNoZVtwcm9wXTtcbiAgICAgIGlmICh0eXBlb2YgY2FjaGVkICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY2FjaGVkO1xuICAgICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJNYXBbcHJvcF07XG4gICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICBjb25zdCByZWR1Y2VyUmVzdWx0ID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgICAgICB0eXBlOiBuYW5vaWQoKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZWR1Y2VyUmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjQpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke3Byb3AudG9TdHJpbmcoKX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBjYWxsZWQgZm9yIHNlbGVjdG9yKCkuIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbFN0YXRlQ2FjaGVbcHJvcF0gPSByZWR1Y2VyUmVzdWx0O1xuICAgICAgICByZXR1cm4gcmVkdWNlclJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSkpO1xudmFyIG9yaWdpbmFsID0gKHN0YXRlKSA9PiB7XG4gIGlmICghaXNTdGF0ZVByb3h5KHN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI1KSA6IFwib3JpZ2luYWwgbXVzdCBiZSB1c2VkIG9uIHN0YXRlIFByb3h5XCIpO1xuICB9XG4gIHJldHVybiBzdGF0ZVtPUklHSU5BTF9TVEFURV07XG59O1xudmFyIGVtcHR5T2JqZWN0ID0ge307XG52YXIgbm9vcFJlZHVjZXIgPSAoc3RhdGUgPSBlbXB0eU9iamVjdCkgPT4gc3RhdGU7XG5mdW5jdGlvbiBjb21iaW5lU2xpY2VzKC4uLnNsaWNlcykge1xuICBjb25zdCByZWR1Y2VyTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKGdldFJlZHVjZXJzKHNsaWNlcykpO1xuICBjb25zdCBnZXRSZWR1Y2VyID0gKCkgPT4gT2JqZWN0LmtleXMocmVkdWNlck1hcCkubGVuZ3RoID8gY29tYmluZVJlZHVjZXJzMihyZWR1Y2VyTWFwKSA6IG5vb3BSZWR1Y2VyO1xuICBsZXQgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgZnVuY3Rpb24gY29tYmluZWRSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgfVxuICBjb21iaW5lZFJlZHVjZXIud2l0aExhenlMb2FkZWRTbGljZXMgPSAoKSA9PiBjb21iaW5lZFJlZHVjZXI7XG4gIGNvbnN0IGluaXRpYWxTdGF0ZUNhY2hlID0ge307XG4gIGNvbnN0IGluamVjdCA9IChzbGljZSwgY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXJUb0luamVjdFxuICAgIH0gPSBzbGljZTtcbiAgICBjb25zdCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXJNYXBbcmVkdWNlclBhdGhdO1xuICAgIGlmICghY29uZmlnLm92ZXJyaWRlRXhpc3RpbmcgJiYgY3VycmVudFJlZHVjZXIgJiYgY3VycmVudFJlZHVjZXIgIT09IHJlZHVjZXJUb0luamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgY2FsbGVkIFxcYGluamVjdFxcYCB0byBvdmVycmlkZSBhbHJlYWR5LWV4aXN0aW5nIHJlZHVjZXIgJHtyZWR1Y2VyUGF0aH0gd2l0aG91dCBzcGVjaWZ5aW5nIFxcYG92ZXJyaWRlRXhpc3Rpbmc6IHRydWVcXGBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gICAgfVxuICAgIGlmIChjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBkZWxldGUgaW5pdGlhbFN0YXRlQ2FjaGVbcmVkdWNlclBhdGhdO1xuICAgIH1cbiAgICByZWR1Y2VyTWFwW3JlZHVjZXJQYXRoXSA9IHJlZHVjZXJUb0luamVjdDtcbiAgICByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gIH07XG4gIGNvbnN0IHNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBtYWtlU2VsZWN0b3Ioc2VsZWN0b3JGbiwgc2VsZWN0U3RhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2VsZWN0b3IyKHN0YXRlLCAuLi5hcmdzKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JGbihjcmVhdGVTdGF0ZVByb3h5KHNlbGVjdFN0YXRlID8gc2VsZWN0U3RhdGUoc3RhdGUsIC4uLmFyZ3MpIDogc3RhdGUsIHJlZHVjZXJNYXAsIGluaXRpYWxTdGF0ZUNhY2hlKSwgLi4uYXJncyk7XG4gICAgfTtcbiAgfSwge1xuICAgIG9yaWdpbmFsXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb21iaW5lZFJlZHVjZXIsIHtcbiAgICBpbmplY3QsXG4gICAgc2VsZWN0b3JcbiAgfSk7XG59XG5cbi8vIHNyYy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBUb29sa2l0IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cbmV4cG9ydCB7XG4gIFJlZHVjZXJUeXBlLFxuICBTSE9VTERfQVVUT0JBVENILFxuICBUYXNrQWJvcnRFcnJvcixcbiAgVHVwbGUsXG4gIGFkZExpc3RlbmVyLFxuICBhc3luY1RodW5rQ3JlYXRvcixcbiAgYXV0b0JhdGNoRW5oYW5jZXIsXG4gIGJ1aWxkQ3JlYXRlU2xpY2UsXG4gIGNsZWFyQWxsTGlzdGVuZXJzLFxuICBjb21iaW5lU2xpY2VzLFxuICBjb25maWd1cmVTdG9yZSxcbiAgY3JlYXRlQWN0aW9uLFxuICBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IsXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUsXG4gIGNyZWF0ZUVudGl0eUFkYXB0ZXIsXG4gIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlLFxuICBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZSxcbiAgY3JlYXRlUmVkdWNlcixcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcjIgYXMgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVNsaWNlLFxuICBjdXJyZW50MyBhcyBjdXJyZW50LFxuICBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UsXG4gIGZyZWV6ZSxcbiAgaXNBY3Rpb25DcmVhdG9yLFxuICBpc0FsbE9mLFxuICBpc0FueU9mLFxuICBpc0FzeW5jVGh1bmtBY3Rpb24sXG4gIGlzRHJhZnQ1IGFzIGlzRHJhZnQsXG4gIGlzRlNBIGFzIGlzRmx1eFN0YW5kYXJkQWN0aW9uLFxuICBpc0Z1bGZpbGxlZCxcbiAgaXNJbW11dGFibGVEZWZhdWx0LFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW4sXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIGxydU1lbW9pemUsXG4gIG1pbmlTZXJpYWxpemVFcnJvcixcbiAgbmFub2lkLFxuICBvcmlnaW5hbDIgYXMgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcmVtb3ZlTGlzdGVuZXIsXG4gIHVud3JhcFJlc3VsdCxcbiAgd2Vha01hcE1lbW9pemUyIGFzIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzLm1hcCIsIi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lkZW50aXR5RnVuY3Rpb25DaGVjay50c1xudmFyIHJ1bklkZW50aXR5RnVuY3Rpb25DaGVjayA9IChyZXN1bHRGdW5jLCBpbnB1dFNlbGVjdG9yc1Jlc3VsdHMsIG91dHB1dFNlbGVjdG9yUmVzdWx0KSA9PiB7XG4gIGlmIChpbnB1dFNlbGVjdG9yc1Jlc3VsdHMubGVuZ3RoID09PSAxICYmIGlucHV0U2VsZWN0b3JzUmVzdWx0c1swXSA9PT0gb3V0cHV0U2VsZWN0b3JSZXN1bHQpIHtcbiAgICBsZXQgaXNJbnB1dFNhbWVBc091dHB1dCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbXB0eU9iamVjdCA9IHt9O1xuICAgICAgaWYgKHJlc3VsdEZ1bmMoZW1wdHlPYmplY3QpID09PSBlbXB0eU9iamVjdClcbiAgICAgICAgaXNJbnB1dFNhbWVBc091dHB1dCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGlmIChpc0lucHV0U2FtZUFzT3V0cHV0KSB7XG4gICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgO1xuICAgICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiVGhlIHJlc3VsdCBmdW5jdGlvbiByZXR1cm5lZCBpdHMgb3duIGlucHV0cyB3aXRob3V0IG1vZGlmaWNhdGlvbi4gZS5nXFxuYGNyZWF0ZVNlbGVjdG9yKFtzdGF0ZSA9PiBzdGF0ZS50b2Rvc10sIHRvZG9zID0+IHRvZG9zKWBcXG5UaGlzIGNvdWxkIGxlYWQgdG8gaW5lZmZpY2llbnQgbWVtb2l6YXRpb24gYW5kIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMuXFxuRW5zdXJlIHRyYW5zZm9ybWF0aW9uIGxvZ2ljIGlzIGluIHRoZSByZXN1bHQgZnVuY3Rpb24sIGFuZCBleHRyYWN0aW9uIGxvZ2ljIGlzIGluIHRoZSBpbnB1dCBzZWxlY3RvcnMuXCIsXG4gICAgICAgIHsgc3RhY2sgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9kZXZNb2RlQ2hlY2tzL2lucHV0U3RhYmlsaXR5Q2hlY2sudHNcbnZhciBydW5JbnB1dFN0YWJpbGl0eUNoZWNrID0gKGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0LCBvcHRpb25zLCBpbnB1dFNlbGVjdG9yQXJncykgPT4ge1xuICBjb25zdCB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IGlucHV0U2VsZWN0b3JSZXN1bHRzLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgfSA9IGlucHV0U2VsZWN0b3JSZXN1bHRzT2JqZWN0O1xuICBjb25zdCBjcmVhdGVBbkVtcHR5T2JqZWN0ID0gbWVtb2l6ZSgoKSA9PiAoe30pLCAuLi5tZW1vaXplT3B0aW9ucyk7XG4gIGNvbnN0IGFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwgPSBjcmVhdGVBbkVtcHR5T2JqZWN0LmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JSZXN1bHRzKSA9PT0gY3JlYXRlQW5FbXB0eU9iamVjdC5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkpO1xuICBpZiAoIWFyZUlucHV0U2VsZWN0b3JSZXN1bHRzRXF1YWwpIHtcbiAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIDtcbiAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBbiBpbnB1dCBzZWxlY3RvciByZXR1cm5lZCBhIGRpZmZlcmVudCByZXN1bHQgd2hlbiBwYXNzZWQgc2FtZSBhcmd1bWVudHMuXFxuVGhpcyBtZWFucyB5b3VyIG91dHB1dCBzZWxlY3RvciB3aWxsIGxpa2VseSBydW4gbW9yZSBmcmVxdWVudGx5IHRoYW4gaW50ZW5kZWQuXFxuQXZvaWQgcmV0dXJuaW5nIGEgbmV3IHJlZmVyZW5jZSBpbnNpZGUgeW91ciBpbnB1dCBzZWxlY3RvciwgZS5nLlxcbmBjcmVhdGVTZWxlY3Rvcihbc3RhdGUgPT4gc3RhdGUudG9kb3MubWFwKHRvZG8gPT4gdG9kby5pZCldLCB0b2RvSWRzID0+IHRvZG9JZHMubGVuZ3RoKWBcIixcbiAgICAgIHtcbiAgICAgICAgYXJndW1lbnRzOiBpbnB1dFNlbGVjdG9yQXJncyxcbiAgICAgICAgZmlyc3RJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzLFxuICAgICAgICBzZWNvbmRJbnB1dHM6IGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSxcbiAgICAgICAgc3RhY2tcbiAgICAgIH1cbiAgICApO1xuICB9XG59O1xuXG4vLyBzcmMvZGV2TW9kZUNoZWNrcy9zZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLnRzXG52YXIgZ2xvYmFsRGV2TW9kZUNoZWNrcyA9IHtcbiAgaW5wdXRTdGFiaWxpdHlDaGVjazogXCJvbmNlXCIsXG4gIGlkZW50aXR5RnVuY3Rpb25DaGVjazogXCJvbmNlXCJcbn07XG52YXIgc2V0R2xvYmFsRGV2TW9kZUNoZWNrcyA9IChkZXZNb2RlQ2hlY2tzKSA9PiB7XG4gIE9iamVjdC5hc3NpZ24oZ2xvYmFsRGV2TW9kZUNoZWNrcywgZGV2TW9kZUNoZWNrcyk7XG59O1xuXG4vLyBzcmMvdXRpbHMudHNcbnZhciBOT1RfRk9VTkQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKFwiTk9UX0ZPVU5EXCIpO1xuZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbihmdW5jLCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBmdW5jfWApIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KG9iamVjdCwgZXJyb3JNZXNzYWdlID0gYGV4cGVjdGVkIGFuIG9iamVjdCwgaW5zdGVhZCByZWNlaXZlZCAke3R5cGVvZiBvYmplY3R9YCkge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKGFycmF5LCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYWxsIGl0ZW1zIHRvIGJlIGZ1bmN0aW9ucywgaW5zdGVhZCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiBgKSB7XG4gIGlmICghYXJyYXkuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgY29uc3QgaXRlbVR5cGVzID0gYXJyYXkubWFwKFxuICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIgPyBgZnVuY3Rpb24gJHtpdGVtLm5hbWUgfHwgXCJ1bm5hbWVkXCJ9KClgIDogdHlwZW9mIGl0ZW1cbiAgICApLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2Vycm9yTWVzc2FnZX1bJHtpdGVtVHlwZXN9XWApO1xuICB9XG59XG52YXIgZW5zdXJlSXNBcnJheSA9IChpdGVtKSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtpdGVtXTtcbn07XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoY3JlYXRlU2VsZWN0b3JBcmdzWzBdKSA/IGNyZWF0ZVNlbGVjdG9yQXJnc1swXSA6IGNyZWF0ZVNlbGVjdG9yQXJncztcbiAgYXNzZXJ0SXNBcnJheU9mRnVuY3Rpb25zKFxuICAgIGRlcGVuZGVuY2llcyxcbiAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgYnV0IHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IGBcbiAgKTtcbiAgcmV0dXJuIGRlcGVuZGVuY2llcztcbn1cbmZ1bmN0aW9uIGNvbGxlY3RJbnB1dFNlbGVjdG9yUmVzdWx0cyhkZXBlbmRlbmNpZXMsIGlucHV0U2VsZWN0b3JBcmdzKSB7XG4gIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gW107XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBkZXBlbmRlbmNpZXM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpbnB1dFNlbGVjdG9yUmVzdWx0cy5wdXNoKGRlcGVuZGVuY2llc1tpXS5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yQXJncykpO1xuICB9XG4gIHJldHVybiBpbnB1dFNlbGVjdG9yUmVzdWx0cztcbn1cbnZhciBnZXREZXZNb2RlQ2hlY2tzRXhlY3V0aW9uSW5mbyA9IChmaXJzdFJ1biwgZGV2TW9kZUNoZWNrcykgPT4ge1xuICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0ge1xuICAgIC4uLmdsb2JhbERldk1vZGVDaGVja3MsXG4gICAgLi4uZGV2TW9kZUNoZWNrc1xuICB9O1xuICByZXR1cm4ge1xuICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjazoge1xuICAgICAgc2hvdWxkUnVuOiBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bixcbiAgICAgIHJ1bjogcnVuSWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfSxcbiAgICBpbnB1dFN0YWJpbGl0eUNoZWNrOiB7XG4gICAgICBzaG91bGRSdW46IGlucHV0U3RhYmlsaXR5Q2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgaW5wdXRTdGFiaWxpdHlDaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4sXG4gICAgICBydW46IHJ1bklucHV0U3RhYmlsaXR5Q2hlY2tcbiAgICB9XG4gIH07XG59O1xuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS9hdXRvdHJhY2tpbmcudHNcbnZhciAkUkVWSVNJT04gPSAwO1xudmFyIENVUlJFTlRfVFJBQ0tFUiA9IG51bGw7XG52YXIgQ2VsbCA9IGNsYXNzIHtcbiAgcmV2aXNpb24gPSAkUkVWSVNJT047XG4gIF92YWx1ZTtcbiAgX2xhc3RWYWx1ZTtcbiAgX2lzRXF1YWwgPSB0cmlwbGVFcTtcbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlLCBpc0VxdWFsID0gdHJpcGxlRXEpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2xhc3RWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl9pc0VxdWFsID0gaXNFcXVhbDtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgcmVhZCwgaXQnbGwgYWRkIGl0c2VsZiB0byB0aGUgY3VycmVudCB0cmFja2VyIGlmXG4gIC8vIG9uZSBleGlzdHMsIGVudGFuZ2xpbmcgaXRzIHN0YXRlIHdpdGggdGhhdCBjYWNoZS5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIENVUlJFTlRfVFJBQ0tFUj8uYWRkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICAvLyBXaGVuZXZlciBhIHN0b3JhZ2UgdmFsdWUgaXMgdXBkYXRlZCwgd2UgYnVtcCB0aGUgZ2xvYmFsIHJldmlzaW9uIGNsb2NrLFxuICAvLyBhc3NpZ24gdGhlIHJldmlzaW9uIGZvciB0aGlzIHN0b3JhZ2UgdG8gdGhlIG5ldyB2YWx1ZSwgX2FuZF8gd2Ugc2NoZWR1bGUgYVxuICAvLyByZXJlbmRlci4gVGhpcyBpcyBpbXBvcnRhbnQsIGFuZCBpdCdzIHdoYXQgbWFrZXMgYXV0b3RyYWNraW5nICBfcHVsbF9cbiAgLy8gYmFzZWQuIFdlIGRvbid0IGFjdGl2ZWx5IHRlbGwgdGhlIGNhY2hlcyB3aGljaCBkZXBlbmQgb24gdGhlIHN0b3JhZ2UgdGhhdFxuICAvLyBhbnl0aGluZyBoYXMgaGFwcGVuZWQuIEluc3RlYWQsIHdlIHJlY29tcHV0ZSB0aGUgY2FjaGVzIHdoZW4gbmVlZGVkLlxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gbmV3VmFsdWUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnJldmlzaW9uID0gKyskUkVWSVNJT047XG4gIH1cbn07XG5mdW5jdGlvbiB0cmlwbGVFcShhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxudmFyIFRyYWNraW5nQ2FjaGUgPSBjbGFzcyB7XG4gIF9jYWNoZWRWYWx1ZTtcbiAgX2NhY2hlZFJldmlzaW9uID0gLTE7XG4gIF9kZXBzID0gW107XG4gIGhpdHMgPSAwO1xuICBmbjtcbiAgY29uc3RydWN0b3IoZm4pIHtcbiAgICB0aGlzLmZuID0gZm47XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fY2FjaGVkVmFsdWUgPSB2b2lkIDA7XG4gICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSAtMTtcbiAgICB0aGlzLl9kZXBzID0gW107XG4gICAgdGhpcy5oaXRzID0gMDtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgaWYgKHRoaXMucmV2aXNpb24gPiB0aGlzLl9jYWNoZWRSZXZpc2lvbikge1xuICAgICAgY29uc3QgeyBmbiB9ID0gdGhpcztcbiAgICAgIGNvbnN0IGN1cnJlbnRUcmFja2VyID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IHByZXZUcmFja2VyID0gQ1VSUkVOVF9UUkFDS0VSO1xuICAgICAgQ1VSUkVOVF9UUkFDS0VSID0gY3VycmVudFRyYWNrZXI7XG4gICAgICB0aGlzLl9jYWNoZWRWYWx1ZSA9IGZuKCk7XG4gICAgICBDVVJSRU5UX1RSQUNLRVIgPSBwcmV2VHJhY2tlcjtcbiAgICAgIHRoaXMuaGl0cysrO1xuICAgICAgdGhpcy5fZGVwcyA9IEFycmF5LmZyb20oY3VycmVudFRyYWNrZXIpO1xuICAgICAgdGhpcy5fY2FjaGVkUmV2aXNpb24gPSB0aGlzLnJldmlzaW9uO1xuICAgIH1cbiAgICBDVVJSRU5UX1RSQUNLRVI/LmFkZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkVmFsdWU7XG4gIH1cbiAgZ2V0IHJldmlzaW9uKCkge1xuICAgIHJldHVybiBNYXRoLm1heCguLi50aGlzLl9kZXBzLm1hcCgoZCkgPT4gZC5yZXZpc2lvbiksIDApO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0VmFsdWUoY2VsbCkge1xuICBpZiAoIShjZWxsIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICBjb25zb2xlLndhcm4oXCJOb3QgYSB2YWxpZCBjZWxsISBcIiwgY2VsbCk7XG4gIH1cbiAgcmV0dXJuIGNlbGwudmFsdWU7XG59XG5mdW5jdGlvbiBzZXRWYWx1ZShzdG9yYWdlLCB2YWx1ZSkge1xuICBpZiAoIShzdG9yYWdlIGluc3RhbmNlb2YgQ2VsbCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJzZXRWYWx1ZSBtdXN0IGJlIHBhc3NlZCBhIHRyYWNrZWQgc3RvcmUgY3JlYXRlZCB3aXRoIGBjcmVhdGVTdG9yYWdlYC5cIlxuICAgICk7XG4gIH1cbiAgc3RvcmFnZS52YWx1ZSA9IHN0b3JhZ2UuX2xhc3RWYWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2VsbChpbml0aWFsVmFsdWUsIGlzRXF1YWwgPSB0cmlwbGVFcSkge1xuICByZXR1cm4gbmV3IENlbGwoaW5pdGlhbFZhbHVlLCBpc0VxdWFsKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKGZuKSB7XG4gIGFzc2VydElzRnVuY3Rpb24oXG4gICAgZm4sXG4gICAgXCJ0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIGBjcmVhdGVDYWNoZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCJcbiAgKTtcbiAgcmV0dXJuIG5ldyBUcmFja2luZ0NhY2hlKGZuKTtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvdHJhY2tpbmcudHNcbnZhciBuZXZlckVxID0gKGEsIGIpID0+IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlVGFnKCkge1xuICByZXR1cm4gY3JlYXRlQ2VsbChudWxsLCBuZXZlckVxKTtcbn1cbmZ1bmN0aW9uIGRpcnR5VGFnKHRhZywgdmFsdWUpIHtcbiAgc2V0VmFsdWUodGFnLCB2YWx1ZSk7XG59XG52YXIgY29uc3VtZUNvbGxlY3Rpb24gPSAobm9kZSkgPT4ge1xuICBsZXQgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnID09PSBudWxsKSB7XG4gICAgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnID0gY3JlYXRlVGFnKCk7XG4gIH1cbiAgZ2V0VmFsdWUodGFnKTtcbn07XG52YXIgZGlydHlDb2xsZWN0aW9uID0gKG5vZGUpID0+IHtcbiAgY29uc3QgdGFnID0gbm9kZS5jb2xsZWN0aW9uVGFnO1xuICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgZGlydHlUYWcodGFnLCBudWxsKTtcbiAgfVxufTtcblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvcHJveHkudHNcbnZhciBSRURVWF9QUk9YWV9MQUJFTCA9IFN5bWJvbCgpO1xudmFyIG5leHRJZCA9IDA7XG52YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pO1xudmFyIE9iamVjdFRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eSh0aGlzLCBvYmplY3RQcm94eUhhbmRsZXIpO1xuICB0YWcgPSBjcmVhdGVUYWcoKTtcbiAgdGFncyA9IHt9O1xuICBjaGlsZHJlbiA9IHt9O1xuICBjb2xsZWN0aW9uVGFnID0gbnVsbDtcbiAgaWQgPSBuZXh0SWQrKztcbn07XG52YXIgb2JqZWN0UHJveHlIYW5kbGVyID0ge1xuICBnZXQobm9kZSwga2V5KSB7XG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlUmVzdWx0KCkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSBSZWZsZWN0LmdldCh2YWx1ZSwga2V5KTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleSBpbiBwcm90bykge1xuICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBjaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSBub2RlLmNoaWxkcmVuW2tleV07XG4gICAgICAgIGlmIChjaGlsZE5vZGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNoaWxkTm9kZSA9IG5vZGUuY2hpbGRyZW5ba2V5XSA9IGNyZWF0ZU5vZGUoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkTm9kZS50YWcpIHtcbiAgICAgICAgICBnZXRWYWx1ZShjaGlsZE5vZGUudGFnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGROb2RlLnByb3h5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHRhZyA9IG5vZGUudGFnc1trZXldO1xuICAgICAgICBpZiAodGFnID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0YWcgPSBub2RlLnRhZ3Nba2V5XSA9IGNyZWF0ZVRhZygpO1xuICAgICAgICAgIHRhZy52YWx1ZSA9IGNoaWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0VmFsdWUodGFnKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGNhbGN1bGF0ZVJlc3VsdCgpO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG4gIG93bktleXMobm9kZSkge1xuICAgIGNvbnN1bWVDb2xsZWN0aW9uKG5vZGUpO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobm9kZS52YWx1ZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUudmFsdWUsIHByb3ApO1xuICB9LFxuICBoYXMobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBSZWZsZWN0Lmhhcyhub2RlLnZhbHVlLCBwcm9wKTtcbiAgfVxufTtcbnZhciBBcnJheVRyZWVOb2RlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50YWcudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm94eSA9IG5ldyBQcm94eShbdGhpc10sIGFycmF5UHJveHlIYW5kbGVyKTtcbiAgdGFnID0gY3JlYXRlVGFnKCk7XG4gIHRhZ3MgPSB7fTtcbiAgY2hpbGRyZW4gPSB7fTtcbiAgY29sbGVjdGlvblRhZyA9IG51bGw7XG4gIGlkID0gbmV4dElkKys7XG59O1xudmFyIGFycmF5UHJveHlIYW5kbGVyID0ge1xuICBnZXQoW25vZGVdLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICBjb25zdW1lQ29sbGVjdGlvbihub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5nZXQobm9kZSwga2V5KTtcbiAgfSxcbiAgb3duS2V5cyhbbm9kZV0pIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLm93bktleXMobm9kZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihbbm9kZV0sIHByb3ApIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLCBwcm9wKTtcbiAgfSxcbiAgaGFzKFtub2RlXSwgcHJvcCkge1xuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIuaGFzKG5vZGUsIHByb3ApO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlTm9kZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5VHJlZU5vZGUodmFsdWUpO1xuICB9XG4gIHJldHVybiBuZXcgT2JqZWN0VHJlZU5vZGUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlLCBuZXdWYWx1ZSkge1xuICBjb25zdCB7IHZhbHVlLCB0YWdzLCBjaGlsZHJlbiB9ID0gbm9kZTtcbiAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgdmFsdWUubGVuZ3RoICE9PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbGV0IG9sZEtleXNTaXplID0gMDtcbiAgICAgIGxldCBuZXdLZXlzU2l6ZSA9IDA7XG4gICAgICBsZXQgYW55S2V5c0FkZGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IF9rZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgb2xkS2V5c1NpemUrKztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld0tleXNTaXplKys7XG4gICAgICAgIGlmICghKGtleSBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICBhbnlLZXlzQWRkZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpc0RpZmZlcmVudCA9IGFueUtleXNBZGRlZCB8fCBvbGRLZXlzU2l6ZSAhPT0gbmV3S2V5c1NpemU7XG4gICAgICBpZiAoaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiB0YWdzKSB7XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgaWYgKGNoaWxkVmFsdWUgIT09IG5ld0NoaWxkVmFsdWUpIHtcbiAgICAgIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgICAgIGRpcnR5VGFnKHRhZ3Nba2V5XSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGFnc1trZXldO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZHJlbikge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuW2tleV07XG4gICAgY29uc3QgbmV3Q2hpbGRWYWx1ZSA9IG5ld1ZhbHVlW2tleV07XG4gICAgY29uc3QgY2hpbGRWYWx1ZSA9IGNoaWxkTm9kZS52YWx1ZTtcbiAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gbmV3Q2hpbGRWYWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV3Q2hpbGRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBuZXdDaGlsZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB1cGRhdGVOb2RlKGNoaWxkTm9kZSwgbmV3Q2hpbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZU5vZGUoY2hpbGROb2RlKTtcbiAgICAgIGRlbGV0ZSBjaGlsZHJlbltrZXldO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlTm9kZShub2RlKSB7XG4gIGlmIChub2RlLnRhZykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnLCBudWxsKTtcbiAgfVxuICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gIGZvciAoY29uc3Qga2V5IGluIG5vZGUudGFncykge1xuICAgIGRpcnR5VGFnKG5vZGUudGFnc1trZXldLCBudWxsKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgZGVsZXRlTm9kZShub2RlLmNoaWxkcmVuW2tleV0pO1xuICB9XG59XG5cbi8vIHNyYy9scnVNZW1vaXplLnRzXG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25DYWNoZShlcXVhbHMpIHtcbiAgbGV0IGVudHJ5O1xuICByZXR1cm4ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIGlmIChlbnRyeSAmJiBlcXVhbHMoZW50cnkua2V5LCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOT1RfRk9VTkQ7XG4gICAgfSxcbiAgICBwdXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZW50cnkgPSB7IGtleSwgdmFsdWUgfTtcbiAgICB9LFxuICAgIGdldEVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gZW50cnkgPyBbZW50cnldIDogW107XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGVudHJ5ID0gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGVxdWFscykge1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgY29uc3QgY2FjaGVJbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZXF1YWxzKGtleSwgZW50cnkua2V5KSk7XG4gICAgaWYgKGNhY2hlSW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2NhY2hlSW5kZXhdO1xuICAgICAgaWYgKGNhY2hlSW5kZXggPiAwKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGNhY2hlSW5kZXgsIDEpO1xuICAgICAgICBlbnRyaWVzLnVuc2hpZnQoZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICB9XG4gIGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGdldChrZXkpID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIGVudHJpZXMudW5zaGlmdCh7IGtleSwgdmFsdWUgfSk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICAgIGVudHJpZXMucG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZW50cmllcyA9IFtdO1xuICB9XG4gIHJldHVybiB7IGdldCwgcHV0LCBnZXRFbnRyaWVzLCBjbGVhciB9O1xufVxudmFyIHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2sgPSAoYSwgYikgPT4gYSA9PT0gYjtcbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihlcXVhbGl0eUNoZWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhcmVBcmd1bWVudHNTaGFsbG93bHlFcXVhbChwcmV2LCBuZXh0KSB7XG4gICAgaWYgKHByZXYgPT09IG51bGwgfHwgbmV4dCA9PT0gbnVsbCB8fCBwcmV2Lmxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHByZXY7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbGl0eUNoZWNrKHByZXZbaV0sIG5leHRbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5mdW5jdGlvbiBscnVNZW1vaXplKGZ1bmMsIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMpIHtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gdHlwZW9mIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgPyBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIDogeyBlcXVhbGl0eUNoZWNrOiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zIH07XG4gIGNvbnN0IHtcbiAgICBlcXVhbGl0eUNoZWNrID0gcmVmZXJlbmNlRXF1YWxpdHlDaGVjayxcbiAgICBtYXhTaXplID0gMSxcbiAgICByZXN1bHRFcXVhbGl0eUNoZWNrXG4gIH0gPSBwcm92aWRlZE9wdGlvbnM7XG4gIGNvbnN0IGNvbXBhcmF0b3IgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjayk7XG4gIGxldCByZXN1bHRzQ291bnQgPSAwO1xuICBjb25zdCBjYWNoZSA9IG1heFNpemUgPD0gMSA/IGNyZWF0ZVNpbmdsZXRvbkNhY2hlKGNvbXBhcmF0b3IpIDogY3JlYXRlTHJ1Q2FjaGUobWF4U2l6ZSwgY29tcGFyYXRvcik7XG4gIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgIGxldCB2YWx1ZSA9IGNhY2hlLmdldChhcmd1bWVudHMpO1xuICAgIGlmICh2YWx1ZSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICB2YWx1ZSA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIHJlc3VsdHNDb3VudCsrO1xuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGNhY2hlLmdldEVudHJpZXMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdFbnRyeSA9IGVudHJpZXMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+IHJlc3VsdEVxdWFsaXR5Q2hlY2soZW50cnkudmFsdWUsIHZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeSkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hpbmdFbnRyeS52YWx1ZTtcbiAgICAgICAgICByZXN1bHRzQ291bnQgIT09IDAgJiYgcmVzdWx0c0NvdW50LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhY2hlLnB1dChhcmd1bWVudHMsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1lbW9pemVkLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgY2FjaGUuY2xlYXIoKTtcbiAgICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCgpO1xuICB9O1xuICBtZW1vaXplZC5yZXN1bHRzQ291bnQgPSAoKSA9PiByZXN1bHRzQ291bnQ7XG4gIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50ID0gKCkgPT4ge1xuICAgIHJlc3VsdHNDb3VudCA9IDA7XG4gIH07XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvYXV0b3RyYWNrTWVtb2l6ZS50c1xuZnVuY3Rpb24gYXV0b3RyYWNrTWVtb2l6ZShmdW5jKSB7XG4gIGNvbnN0IG5vZGUgPSBjcmVhdGVOb2RlKFxuICAgIFtdXG4gICk7XG4gIGxldCBsYXN0QXJncyA9IG51bGw7XG4gIGNvbnN0IHNoYWxsb3dFcXVhbCA9IGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihyZWZlcmVuY2VFcXVhbGl0eUNoZWNrKTtcbiAgY29uc3QgY2FjaGUgPSBjcmVhdGVDYWNoZSgoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gZnVuYy5hcHBseShudWxsLCBub2RlLnByb3h5KTtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgaWYgKCFzaGFsbG93RXF1YWwobGFzdEFyZ3MsIGFyZ3VtZW50cykpIHtcbiAgICAgIHVwZGF0ZU5vZGUobm9kZSwgYXJndW1lbnRzKTtcbiAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGUudmFsdWU7XG4gIH1cbiAgbWVtb2l6ZWQuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICByZXR1cm4gY2FjaGUuY2xlYXIoKTtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvd2Vha01hcE1lbW9pemUudHNcbnZhciBTdHJvbmdSZWYgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGRlcmVmKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59O1xudmFyIFJlZiA9IHR5cGVvZiBXZWFrUmVmICE9PSBcInVuZGVmaW5lZFwiID8gV2Vha1JlZiA6IFN0cm9uZ1JlZjtcbnZhciBVTlRFUk1JTkFURUQgPSAwO1xudmFyIFRFUk1JTkFURUQgPSAxO1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGVOb2RlKCkge1xuICByZXR1cm4ge1xuICAgIHM6IFVOVEVSTUlOQVRFRCxcbiAgICB2OiB2b2lkIDAsXG4gICAgbzogbnVsbCxcbiAgICBwOiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiB3ZWFrTWFwTWVtb2l6ZShmdW5jLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICBjb25zdCB7IHJlc3VsdEVxdWFsaXR5Q2hlY2sgfSA9IG9wdGlvbnM7XG4gIGxldCBsYXN0UmVzdWx0O1xuICBsZXQgcmVzdWx0c0NvdW50ID0gMDtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgbGV0IGNhY2hlTm9kZSA9IGZuTm9kZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gYXJndW1lbnRzO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgYXJnICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBvYmplY3RDYWNoZSA9IGNhY2hlTm9kZS5vO1xuICAgICAgICBpZiAob2JqZWN0Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjYWNoZU5vZGUubyA9IG9iamVjdENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JqZWN0Tm9kZSA9IG9iamVjdENhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAob2JqZWN0Tm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgb2JqZWN0Q2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBvYmplY3ROb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpbWl0aXZlQ2FjaGUgPSBjYWNoZU5vZGUucDtcbiAgICAgICAgaWYgKHByaW1pdGl2ZUNhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY2FjaGVOb2RlLnAgPSBwcmltaXRpdmVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTm9kZSA9IHByaW1pdGl2ZUNhY2hlLmdldChhcmcpO1xuICAgICAgICBpZiAocHJpbWl0aXZlTm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgICAgICAgcHJpbWl0aXZlQ2FjaGUuc2V0KGFyZywgY2FjaGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBwcmltaXRpdmVOb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlcm1pbmF0ZWROb2RlID0gY2FjaGVOb2RlO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGNhY2hlTm9kZS5zID09PSBURVJNSU5BVEVEKSB7XG4gICAgICByZXN1bHQgPSBjYWNoZU5vZGUudjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgcmVzdWx0c0NvdW50Kys7XG4gICAgICBpZiAocmVzdWx0RXF1YWxpdHlDaGVjaykge1xuICAgICAgICBjb25zdCBsYXN0UmVzdWx0VmFsdWUgPSBsYXN0UmVzdWx0Py5kZXJlZj8uKCkgPz8gbGFzdFJlc3VsdDtcbiAgICAgICAgaWYgKGxhc3RSZXN1bHRWYWx1ZSAhPSBudWxsICYmIHJlc3VsdEVxdWFsaXR5Q2hlY2sobGFzdFJlc3VsdFZhbHVlLCByZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGFzdFJlc3VsdFZhbHVlO1xuICAgICAgICAgIHJlc3VsdHNDb3VudCAhPT0gMCAmJiByZXN1bHRzQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkc1dlYWtSZWYgPSB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCAhPT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIGxhc3RSZXN1bHQgPSBuZWVkc1dlYWtSZWYgPyBuZXcgUmVmKHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRlcm1pbmF0ZWROb2RlLnMgPSBURVJNSU5BVEVEO1xuICAgIHRlcm1pbmF0ZWROb2RlLnYgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGZuTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICAgIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50KCk7XG4gIH07XG4gIG1lbW9pemVkLnJlc3VsdHNDb3VudCA9ICgpID0+IHJlc3VsdHNDb3VudDtcbiAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQgPSAoKSA9PiB7XG4gICAgcmVzdWx0c0NvdW50ID0gMDtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvY3JlYXRlU2VsZWN0b3JDcmVhdG9yLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvckNyZWF0b3IobWVtb2l6ZU9yT3B0aW9ucywgLi4ubWVtb2l6ZU9wdGlvbnNGcm9tQXJncykge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvckNyZWF0b3JPcHRpb25zID0gdHlwZW9mIG1lbW9pemVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHtcbiAgICBtZW1vaXplOiBtZW1vaXplT3JPcHRpb25zLFxuICAgIG1lbW9pemVPcHRpb25zOiBtZW1vaXplT3B0aW9uc0Zyb21BcmdzXG4gIH0gOiBtZW1vaXplT3JPcHRpb25zO1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSAoLi4uY3JlYXRlU2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgbGV0IHJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zID0gMDtcbiAgICBsZXQgbGFzdFJlc3VsdDtcbiAgICBsZXQgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0ge307XG4gICAgbGV0IHJlc3VsdEZ1bmMgPSBjcmVhdGVTZWxlY3RvckFyZ3MucG9wKCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRGdW5jID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBkaXJlY3RseVBhc3NlZE9wdGlvbnMgPSByZXN1bHRGdW5jO1xuICAgICAgcmVzdWx0RnVuYyA9IGNyZWF0ZVNlbGVjdG9yQXJncy5wb3AoKTtcbiAgICB9XG4gICAgYXNzZXJ0SXNGdW5jdGlvbihcbiAgICAgIHJlc3VsdEZ1bmMsXG4gICAgICBgY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbiBvdXRwdXQgZnVuY3Rpb24gYWZ0ZXIgdGhlIGlucHV0cywgYnV0IHJlY2VpdmVkOiBbJHt0eXBlb2YgcmVzdWx0RnVuY31dYFxuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRPcHRpb25zID0ge1xuICAgICAgLi4uY3JlYXRlU2VsZWN0b3JDcmVhdG9yT3B0aW9ucyxcbiAgICAgIC4uLmRpcmVjdGx5UGFzc2VkT3B0aW9uc1xuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgbWVtb2l6ZSxcbiAgICAgIG1lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBhcmdzTWVtb2l6ZSA9IHdlYWtNYXBNZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVPcHRpb25zID0gW10sXG4gICAgICBkZXZNb2RlQ2hlY2tzID0ge31cbiAgICB9ID0gY29tYmluZWRPcHRpb25zO1xuICAgIGNvbnN0IGZpbmFsTWVtb2l6ZU9wdGlvbnMgPSBlbnN1cmVJc0FycmF5KG1lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBmaW5hbEFyZ3NNZW1vaXplT3B0aW9ucyA9IGVuc3VyZUlzQXJyYXkoYXJnc01lbW9pemVPcHRpb25zKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXREZXBlbmRlbmNpZXMoY3JlYXRlU2VsZWN0b3JBcmdzKTtcbiAgICBjb25zdCBtZW1vaXplZFJlc3VsdEZ1bmMgPSBtZW1vaXplKGZ1bmN0aW9uIHJlY29tcHV0YXRpb25XcmFwcGVyKCkge1xuICAgICAgcmVjb21wdXRhdGlvbnMrKztcbiAgICAgIHJldHVybiByZXN1bHRGdW5jLmFwcGx5KFxuICAgICAgICBudWxsLFxuICAgICAgICBhcmd1bWVudHNcbiAgICAgICk7XG4gICAgfSwgLi4uZmluYWxNZW1vaXplT3B0aW9ucyk7XG4gICAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RvciA9IGFyZ3NNZW1vaXplKGZ1bmN0aW9uIGRlcGVuZGVuY2llc0NoZWNrZXIoKSB7XG4gICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMrKztcbiAgICAgIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzID0gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIGFyZ3VtZW50c1xuICAgICAgKTtcbiAgICAgIGxhc3RSZXN1bHQgPSBtZW1vaXplZFJlc3VsdEZ1bmMuYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvclJlc3VsdHMpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zdCB7IGlkZW50aXR5RnVuY3Rpb25DaGVjaywgaW5wdXRTdGFiaWxpdHlDaGVjayB9ID0gZ2V0RGV2TW9kZUNoZWNrc0V4ZWN1dGlvbkluZm8oZmlyc3RSdW4sIGRldk1vZGVDaGVja3MpO1xuICAgICAgICBpZiAoaWRlbnRpdHlGdW5jdGlvbkNoZWNrLnNob3VsZFJ1bikge1xuICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjay5ydW4oXG4gICAgICAgICAgICByZXN1bHRGdW5jLFxuICAgICAgICAgICAgaW5wdXRTZWxlY3RvclJlc3VsdHMsXG4gICAgICAgICAgICBsYXN0UmVzdWx0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRTdGFiaWxpdHlDaGVjay5zaG91bGRSdW4pIHtcbiAgICAgICAgICBjb25zdCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgPSBjb2xsZWN0SW5wdXRTZWxlY3RvclJlc3VsdHMoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlucHV0U3RhYmlsaXR5Q2hlY2sucnVuKFxuICAgICAgICAgICAgeyBpbnB1dFNlbGVjdG9yUmVzdWx0cywgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5IH0sXG4gICAgICAgICAgICB7IG1lbW9pemUsIG1lbW9pemVPcHRpb25zOiBmaW5hbE1lbW9pemVPcHRpb25zIH0sXG4gICAgICAgICAgICBhcmd1bWVudHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdFJ1bilcbiAgICAgICAgICBmaXJzdFJ1biA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfSwgLi4uZmluYWxBcmdzTWVtb2l6ZU9wdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHNlbGVjdG9yLCB7XG4gICAgICByZXN1bHRGdW5jLFxuICAgICAgbWVtb2l6ZWRSZXN1bHRGdW5jLFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zOiAoKSA9PiBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldERlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczogKCkgPT4ge1xuICAgICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMgPSAwO1xuICAgICAgfSxcbiAgICAgIGxhc3RSZXN1bHQ6ICgpID0+IGxhc3RSZXN1bHQsXG4gICAgICByZWNvbXB1dGF0aW9uczogKCkgPT4gcmVjb21wdXRhdGlvbnMsXG4gICAgICByZXNldFJlY29tcHV0YXRpb25zOiAoKSA9PiB7XG4gICAgICAgIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH0sXG4gICAgICBtZW1vaXplLFxuICAgICAgYXJnc01lbW9pemVcbiAgICB9KTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihjcmVhdGVTZWxlY3RvcjIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yMjtcbn1cbnZhciBjcmVhdGVTZWxlY3RvciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpO1xuXG4vLyBzcmMvY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLnRzXG52YXIgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgKGlucHV0U2VsZWN0b3JzT2JqZWN0LCBzZWxlY3RvckNyZWF0b3IgPSBjcmVhdGVTZWxlY3RvcikgPT4ge1xuICAgIGFzc2VydElzT2JqZWN0KFxuICAgICAgaW5wdXRTZWxlY3RvcnNPYmplY3QsXG4gICAgICBgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIGV4cGVjdHMgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdoZXJlIGVhY2ggcHJvcGVydHkgaXMgYSBzZWxlY3RvciwgaW5zdGVhZCByZWNlaXZlZCBhICR7dHlwZW9mIGlucHV0U2VsZWN0b3JzT2JqZWN0fWBcbiAgICApO1xuICAgIGNvbnN0IGlucHV0U2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTZWxlY3RvcnNPYmplY3QpO1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlucHV0U2VsZWN0b3JLZXlzLm1hcChcbiAgICAgIChrZXkpID0+IGlucHV0U2VsZWN0b3JzT2JqZWN0W2tleV1cbiAgICApO1xuICAgIGNvbnN0IHN0cnVjdHVyZWRTZWxlY3RvciA9IHNlbGVjdG9yQ3JlYXRvcihcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICguLi5pbnB1dFNlbGVjdG9yUmVzdWx0cykgPT4ge1xuICAgICAgICByZXR1cm4gaW5wdXRTZWxlY3RvclJlc3VsdHMucmVkdWNlKChjb21wb3NpdGlvbiwgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29tcG9zaXRpb25baW5wdXRTZWxlY3RvcktleXNbaW5kZXhdXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiBjb21wb3NpdGlvbjtcbiAgICAgICAgfSwge30pO1xuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3RvcjtcbiAgfSxcbiAgeyB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciB9XG4pO1xuZXhwb3J0IHtcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yLFxuICBscnVNZW1vaXplLFxuICByZWZlcmVuY2VFcXVhbGl0eUNoZWNrLFxuICBzZXRHbG9iYWxEZXZNb2RlQ2hlY2tzLFxuICBhdXRvdHJhY2tNZW1vaXplIGFzIHVuc3RhYmxlX2F1dG90cmFja01lbW9pemUsXG4gIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzZWxlY3QubWpzLm1hcCIsIi8vIHNyYy9nZXREb3RQYXRoL2dldERvdFBhdGgudHNcbmZ1bmN0aW9uIGdldERvdFBhdGgoaXNzdWUpIHtcbiAgaWYgKGlzc3VlLnBhdGg/Lmxlbmd0aCkge1xuICAgIGxldCBkb3RQYXRoID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXNzdWUucGF0aCkge1xuICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgPyBpdGVtLmtleSA6IGl0ZW07XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGlmIChkb3RQYXRoKSB7XG4gICAgICAgICAgZG90UGF0aCArPSBgLiR7a2V5fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG90UGF0aCArPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZG90UGF0aDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gc3JjL1NjaGVtYUVycm9yL1NjaGVtYUVycm9yLnRzXG52YXIgU2NoZW1hRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlbWEgaXNzdWVzLlxuICAgKi9cbiAgaXNzdWVzO1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHNjaGVtYSBlcnJvciB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlzc3VlcyBUaGUgc2NoZW1hIGlzc3Vlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGlzc3Vlcykge1xuICAgIHN1cGVyKGlzc3Vlc1swXS5tZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIlNjaGVtYUVycm9yXCI7XG4gICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gIH1cbn07XG5leHBvcnQge1xuICBTY2hlbWFFcnJvcixcbiAgZ2V0RG90UGF0aFxufTtcbiIsIi8vIHNyYy9xdWVyeS9jb3JlL2FwaVN0YXRlLnRzXG52YXIgUXVlcnlTdGF0dXMgPSAvKiBAX19QVVJFX18gKi8gKChRdWVyeVN0YXR1czIpID0+IHtcbiAgUXVlcnlTdGF0dXMyW1widW5pbml0aWFsaXplZFwiXSA9IFwidW5pbml0aWFsaXplZFwiO1xuICBRdWVyeVN0YXR1czJbXCJwZW5kaW5nXCJdID0gXCJwZW5kaW5nXCI7XG4gIFF1ZXJ5U3RhdHVzMltcImZ1bGZpbGxlZFwiXSA9IFwiZnVsZmlsbGVkXCI7XG4gIFF1ZXJ5U3RhdHVzMltcInJlamVjdGVkXCJdID0gXCJyZWplY3RlZFwiO1xuICByZXR1cm4gUXVlcnlTdGF0dXMyO1xufSkoUXVlcnlTdGF0dXMgfHwge30pO1xuZnVuY3Rpb24gZ2V0UmVxdWVzdFN0YXR1c0ZsYWdzKHN0YXR1cykge1xuICByZXR1cm4ge1xuICAgIHN0YXR1cyxcbiAgICBpc1VuaW5pdGlhbGl6ZWQ6IHN0YXR1cyA9PT0gXCJ1bmluaXRpYWxpemVkXCIgLyogdW5pbml0aWFsaXplZCAqLyxcbiAgICBpc0xvYWRpbmc6IHN0YXR1cyA9PT0gXCJwZW5kaW5nXCIgLyogcGVuZGluZyAqLyxcbiAgICBpc1N1Y2Nlc3M6IHN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAvKiBmdWxmaWxsZWQgKi8sXG4gICAgaXNFcnJvcjogc3RhdHVzID09PSBcInJlamVjdGVkXCIgLyogcmVqZWN0ZWQgKi9cbiAgfTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvcnRrSW1wb3J0cy50c1xuaW1wb3J0IHsgY3JlYXRlQWN0aW9uLCBjcmVhdGVTbGljZSwgY3JlYXRlU2VsZWN0b3IsIGNyZWF0ZUFzeW5jVGh1bmssIGNvbWJpbmVSZWR1Y2VycywgY3JlYXRlTmV4dFN0YXRlLCBpc0FueU9mLCBpc0FsbE9mLCBpc0FjdGlvbiwgaXNQZW5kaW5nLCBpc1JlamVjdGVkLCBpc0Z1bGZpbGxlZCwgaXNSZWplY3RlZFdpdGhWYWx1ZSwgaXNBc3luY1RodW5rQWN0aW9uLCBwcmVwYXJlQXV0b0JhdGNoZWQsIFNIT1VMRF9BVVRPQkFUQ0gsIGlzUGxhaW5PYmplY3QsIG5hbm9pZCB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XG5cbi8vIHNyYy9xdWVyeS91dGlscy9jb3B5V2l0aFN0cnVjdHVyYWxTaGFyaW5nLnRzXG52YXIgaXNQbGFpbk9iamVjdDIgPSBpc1BsYWluT2JqZWN0O1xuZnVuY3Rpb24gY29weVdpdGhTdHJ1Y3R1cmFsU2hhcmluZyhvbGRPYmosIG5ld09iaikge1xuICBpZiAob2xkT2JqID09PSBuZXdPYmogfHwgIShpc1BsYWluT2JqZWN0MihvbGRPYmopICYmIGlzUGxhaW5PYmplY3QyKG5ld09iaikgfHwgQXJyYXkuaXNBcnJheShvbGRPYmopICYmIEFycmF5LmlzQXJyYXkobmV3T2JqKSkpIHtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG4gIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhuZXdPYmopO1xuICBjb25zdCBvbGRLZXlzID0gT2JqZWN0LmtleXMob2xkT2JqKTtcbiAgbGV0IGlzU2FtZU9iamVjdCA9IG5ld0tleXMubGVuZ3RoID09PSBvbGRLZXlzLmxlbmd0aDtcbiAgY29uc3QgbWVyZ2VPYmogPSBBcnJheS5pc0FycmF5KG5ld09iaikgPyBbXSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBuZXdLZXlzKSB7XG4gICAgbWVyZ2VPYmpba2V5XSA9IGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcob2xkT2JqW2tleV0sIG5ld09ialtrZXldKTtcbiAgICBpZiAoaXNTYW1lT2JqZWN0KSBpc1NhbWVPYmplY3QgPSBvbGRPYmpba2V5XSA9PT0gbWVyZ2VPYmpba2V5XTtcbiAgfVxuICByZXR1cm4gaXNTYW1lT2JqZWN0ID8gb2xkT2JqIDogbWVyZ2VPYmo7XG59XG5cbi8vIHNyYy9xdWVyeS91dGlscy9jb3VudE9iamVjdEtleXMudHNcbmZ1bmN0aW9uIGNvdW50T2JqZWN0S2V5cyhvYmopIHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBfa2V5IGluIG9iaikge1xuICAgIGNvdW50Kys7XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG4vLyBzcmMvcXVlcnkvdXRpbHMvZmxhdHRlbi50c1xudmFyIGZsYXR0ZW4gPSAoYXJyKSA9PiBbXS5jb25jYXQoLi4uYXJyKTtcblxuLy8gc3JjL3F1ZXJ5L3V0aWxzL2lzQWJzb2x1dGVVcmwudHNcbmZ1bmN0aW9uIGlzQWJzb2x1dGVVcmwodXJsKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGAoXnw6KS8vYCkudGVzdCh1cmwpO1xufVxuXG4vLyBzcmMvcXVlcnkvdXRpbHMvaXNEb2N1bWVudFZpc2libGUudHNcbmZ1bmN0aW9uIGlzRG9jdW1lbnRWaXNpYmxlKCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gXCJoaWRkZW5cIjtcbn1cblxuLy8gc3JjL3F1ZXJ5L3V0aWxzL2lzTm90TnVsbGlzaC50c1xuZnVuY3Rpb24gaXNOb3ROdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cblxuLy8gc3JjL3F1ZXJ5L3V0aWxzL2lzT25saW5lLnRzXG5mdW5jdGlvbiBpc09ubGluZSgpIHtcbiAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyB0cnVlIDogbmF2aWdhdG9yLm9uTGluZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IG5hdmlnYXRvci5vbkxpbmU7XG59XG5cbi8vIHNyYy9xdWVyeS91dGlscy9qb2luVXJscy50c1xudmFyIHdpdGhvdXRUcmFpbGluZ1NsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcbnZhciB3aXRob3V0TGVhZGluZ1NsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcbmZ1bmN0aW9uIGpvaW5VcmxzKGJhc2UsIHVybCkge1xuICBpZiAoIWJhc2UpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbiAgaWYgKGlzQWJzb2x1dGVVcmwodXJsKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgY29uc3QgZGVsaW1pdGVyID0gYmFzZS5lbmRzV2l0aChcIi9cIikgfHwgIXVybC5zdGFydHNXaXRoKFwiP1wiKSA/IFwiL1wiIDogXCJcIjtcbiAgYmFzZSA9IHdpdGhvdXRUcmFpbGluZ1NsYXNoKGJhc2UpO1xuICB1cmwgPSB3aXRob3V0TGVhZGluZ1NsYXNoKHVybCk7XG4gIHJldHVybiBgJHtiYXNlfSR7ZGVsaW1pdGVyfSR7dXJsfWA7XG59XG5cbi8vIHNyYy9xdWVyeS91dGlscy9nZXRPckluc2VydC50c1xuZnVuY3Rpb24gZ2V0T3JJbnNlcnQobWFwLCBrZXksIHZhbHVlKSB7XG4gIGlmIChtYXAuaGFzKGtleSkpIHJldHVybiBtYXAuZ2V0KGtleSk7XG4gIHJldHVybiBtYXAuc2V0KGtleSwgdmFsdWUpLmdldChrZXkpO1xufVxuXG4vLyBzcmMvcXVlcnkvZmV0Y2hCYXNlUXVlcnkudHNcbnZhciBkZWZhdWx0RmV0Y2hGbiA9ICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbnZhciBkZWZhdWx0VmFsaWRhdGVTdGF0dXMgPSAocmVzcG9uc2UpID0+IHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDw9IDI5OTtcbnZhciBkZWZhdWx0SXNKc29uQ29udGVudFR5cGUgPSAoaGVhZGVycykgPT4gKFxuICAvKmFwcGxpY2F0Ki9cbiAgL2lvblxcLyh2bmRcXC5hcGlcXCspP2pzb24vLnRlc3QoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIilcbik7XG5mdW5jdGlvbiBzdHJpcFVuZGVmaW5lZChvYmopIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IGNvcHkgPSB7XG4gICAgLi4ub2JqXG4gIH07XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGNvcHkpKSB7XG4gICAgaWYgKHYgPT09IHZvaWQgMCkgZGVsZXRlIGNvcHlba107XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5mdW5jdGlvbiBmZXRjaEJhc2VRdWVyeSh7XG4gIGJhc2VVcmwsXG4gIHByZXBhcmVIZWFkZXJzID0gKHgpID0+IHgsXG4gIGZldGNoRm4gPSBkZWZhdWx0RmV0Y2hGbixcbiAgcGFyYW1zU2VyaWFsaXplcixcbiAgaXNKc29uQ29udGVudFR5cGUgPSBkZWZhdWx0SXNKc29uQ29udGVudFR5cGUsXG4gIGpzb25Db250ZW50VHlwZSA9IFwiYXBwbGljYXRpb24vanNvblwiLFxuICBqc29uUmVwbGFjZXIsXG4gIHRpbWVvdXQ6IGRlZmF1bHRUaW1lb3V0LFxuICByZXNwb25zZUhhbmRsZXI6IGdsb2JhbFJlc3BvbnNlSGFuZGxlcixcbiAgdmFsaWRhdGVTdGF0dXM6IGdsb2JhbFZhbGlkYXRlU3RhdHVzLFxuICAuLi5iYXNlRmV0Y2hPcHRpb25zXG59ID0ge30pIHtcbiAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBmZXRjaEZuID09PSBkZWZhdWx0RmV0Y2hGbikge1xuICAgIGNvbnNvbGUud2FybihcIldhcm5pbmc6IGBmZXRjaGAgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIHN1cHBseSBhIGN1c3RvbSBgZmV0Y2hGbmAgcHJvcGVydHkgdG8gdXNlIGBmZXRjaEJhc2VRdWVyeWAgb24gU1NSIGVudmlyb25tZW50cy5cIik7XG4gIH1cbiAgcmV0dXJuIGFzeW5jIChhcmcsIGFwaSwgZXh0cmFPcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZ2V0U3RhdGUsXG4gICAgICBleHRyYSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgZm9yY2VkLFxuICAgICAgdHlwZVxuICAgIH0gPSBhcGk7XG4gICAgbGV0IG1ldGE7XG4gICAgbGV0IHtcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyhiYXNlRmV0Y2hPcHRpb25zLmhlYWRlcnMpLFxuICAgICAgcGFyYW1zID0gdm9pZCAwLFxuICAgICAgcmVzcG9uc2VIYW5kbGVyID0gZ2xvYmFsUmVzcG9uc2VIYW5kbGVyID8/IFwianNvblwiLFxuICAgICAgdmFsaWRhdGVTdGF0dXMgPSBnbG9iYWxWYWxpZGF0ZVN0YXR1cyA/PyBkZWZhdWx0VmFsaWRhdGVTdGF0dXMsXG4gICAgICB0aW1lb3V0ID0gZGVmYXVsdFRpbWVvdXQsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IHR5cGVvZiBhcmcgPT0gXCJzdHJpbmdcIiA/IHtcbiAgICAgIHVybDogYXJnXG4gICAgfSA6IGFyZztcbiAgICBsZXQgYWJvcnRDb250cm9sbGVyLCBzaWduYWwgPSBhcGkuc2lnbmFsO1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhcGkuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydENvbnRyb2xsZXIuYWJvcnQpO1xuICAgICAgc2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIC4uLmJhc2VGZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWwsXG4gICAgICAuLi5yZXN0XG4gICAgfTtcbiAgICBoZWFkZXJzID0gbmV3IEhlYWRlcnMoc3RyaXBVbmRlZmluZWQoaGVhZGVycykpO1xuICAgIGNvbmZpZy5oZWFkZXJzID0gYXdhaXQgcHJlcGFyZUhlYWRlcnMoaGVhZGVycywge1xuICAgICAgZ2V0U3RhdGUsXG4gICAgICBhcmcsXG4gICAgICBleHRyYSxcbiAgICAgIGVuZHBvaW50LFxuICAgICAgZm9yY2VkLFxuICAgICAgdHlwZSxcbiAgICAgIGV4dHJhT3B0aW9uc1xuICAgIH0pIHx8IGhlYWRlcnM7XG4gICAgY29uc3QgaXNKc29uaWZpYWJsZSA9IChib2R5KSA9PiB0eXBlb2YgYm9keSA9PT0gXCJvYmplY3RcIiAmJiAoaXNQbGFpbk9iamVjdChib2R5KSB8fCBBcnJheS5pc0FycmF5KGJvZHkpIHx8IHR5cGVvZiBib2R5LnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKTtcbiAgICBpZiAoIWNvbmZpZy5oZWFkZXJzLmhhcyhcImNvbnRlbnQtdHlwZVwiKSAmJiBpc0pzb25pZmlhYmxlKGNvbmZpZy5ib2R5KSkge1xuICAgICAgY29uZmlnLmhlYWRlcnMuc2V0KFwiY29udGVudC10eXBlXCIsIGpzb25Db250ZW50VHlwZSk7XG4gICAgfVxuICAgIGlmIChpc0pzb25pZmlhYmxlKGNvbmZpZy5ib2R5KSAmJiBpc0pzb25Db250ZW50VHlwZShjb25maWcuaGVhZGVycykpIHtcbiAgICAgIGNvbmZpZy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnLmJvZHksIGpzb25SZXBsYWNlcik7XG4gICAgfVxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGRpdmlkZXIgPSB+dXJsLmluZGV4T2YoXCI/XCIpID8gXCImXCIgOiBcIj9cIjtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zU2VyaWFsaXplciA/IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKSA6IG5ldyBVUkxTZWFyY2hQYXJhbXMoc3RyaXBVbmRlZmluZWQocGFyYW1zKSk7XG4gICAgICB1cmwgKz0gZGl2aWRlciArIHF1ZXJ5O1xuICAgIH1cbiAgICB1cmwgPSBqb2luVXJscyhiYXNlVXJsLCB1cmwpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIGNvbmZpZyk7XG4gICAgY29uc3QgcmVxdWVzdENsb25lID0gbmV3IFJlcXVlc3QodXJsLCBjb25maWcpO1xuICAgIG1ldGEgPSB7XG4gICAgICByZXF1ZXN0OiByZXF1ZXN0Q2xvbmVcbiAgICB9O1xuICAgIGxldCByZXNwb25zZSwgdGltZWRPdXQgPSBmYWxzZSwgdGltZW91dElkID0gYWJvcnRDb250cm9sbGVyICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfSwgdGltZW91dCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGbihyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN0YXR1czogdGltZWRPdXQgPyBcIlRJTUVPVVRfRVJST1JcIiA6IFwiRkVUQ0hfRVJST1JcIixcbiAgICAgICAgICBlcnJvcjogU3RyaW5nKGUpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgYWJvcnRDb250cm9sbGVyPy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0Q29udHJvbGxlci5hYm9ydCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlQ2xvbmUgPSByZXNwb25zZS5jbG9uZSgpO1xuICAgIG1ldGEucmVzcG9uc2UgPSByZXNwb25zZUNsb25lO1xuICAgIGxldCByZXN1bHREYXRhO1xuICAgIGxldCByZXNwb25zZVRleHQgPSBcIlwiO1xuICAgIHRyeSB7XG4gICAgICBsZXQgaGFuZGxlUmVzcG9uc2VFcnJvcjtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UsIHJlc3BvbnNlSGFuZGxlcikudGhlbigocikgPT4gcmVzdWx0RGF0YSA9IHIsIChlKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yID0gZSksXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1mZXRjaC9ub2RlLWZldGNoL2lzc3Vlcy82NjUjaXNzdWVjb21tZW50LTUzODk5NTE4MlxuICAgICAgICAvLyB3ZSAqaGF2ZSogdG8gXCJ1c2UgdXBcIiBib3RoIHN0cmVhbXMgYXQgdGhlIHNhbWUgdGltZSBvciB0aGV5IHdpbGwgc3RvcCBydW5uaW5nIGluIG5vZGUtZmV0Y2ggc2NlbmFyaW9zXG4gICAgICAgIHJlc3BvbnNlQ2xvbmUudGV4dCgpLnRoZW4oKHIpID0+IHJlc3BvbnNlVGV4dCA9IHIsICgpID0+IHtcbiAgICAgICAgfSlcbiAgICAgIF0pO1xuICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRXJyb3IpIHRocm93IGhhbmRsZVJlc3BvbnNlRXJyb3I7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdGF0dXM6IFwiUEFSU0lOR19FUlJPUlwiLFxuICAgICAgICAgIG9yaWdpbmFsU3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgZGF0YTogcmVzcG9uc2VUZXh0LFxuICAgICAgICAgIGVycm9yOiBTdHJpbmcoZSlcbiAgICAgICAgfSxcbiAgICAgICAgbWV0YVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLCByZXN1bHREYXRhKSA/IHtcbiAgICAgIGRhdGE6IHJlc3VsdERhdGEsXG4gICAgICBtZXRhXG4gICAgfSA6IHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBkYXRhOiByZXN1bHREYXRhXG4gICAgICB9LFxuICAgICAgbWV0YVxuICAgIH07XG4gIH07XG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlLCByZXNwb25zZUhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlSGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGVyKHJlc3BvbnNlKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxlciA9PT0gXCJjb250ZW50LXR5cGVcIikge1xuICAgICAgcmVzcG9uc2VIYW5kbGVyID0gaXNKc29uQ29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycykgPyBcImpzb25cIiA6IFwidGV4dFwiO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VIYW5kbGVyID09PSBcImpzb25cIikge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG59XG5cbi8vIHNyYy9xdWVyeS9IYW5kbGVkRXJyb3IudHNcbnZhciBIYW5kbGVkRXJyb3IgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBtZXRhID0gdm9pZCAwKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbn07XG5cbi8vIHNyYy9xdWVyeS9yZXRyeS50c1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdEJhY2tvZmYoYXR0ZW1wdCA9IDAsIG1heFJldHJpZXMgPSA1KSB7XG4gIGNvbnN0IGF0dGVtcHRzID0gTWF0aC5taW4oYXR0ZW1wdCwgbWF4UmV0cmllcyk7XG4gIGNvbnN0IHRpbWVvdXQgPSB+figoTWF0aC5yYW5kb20oKSArIDAuNCkgKiAoMzAwIDw8IGF0dGVtcHRzKSk7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KChyZXMpID0+IHJlc29sdmUocmVzKSwgdGltZW91dCkpO1xufVxuZnVuY3Rpb24gZmFpbChlcnJvciwgbWV0YSkge1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBIYW5kbGVkRXJyb3Ioe1xuICAgIGVycm9yLFxuICAgIG1ldGFcbiAgfSksIHtcbiAgICB0aHJvd0ltbWVkaWF0ZWx5OiB0cnVlXG4gIH0pO1xufVxudmFyIEVNUFRZX09QVElPTlMgPSB7fTtcbnZhciByZXRyeVdpdGhCYWNrb2ZmID0gKGJhc2VRdWVyeSwgZGVmYXVsdE9wdGlvbnMpID0+IGFzeW5jIChhcmdzLCBhcGksIGV4dHJhT3B0aW9ucykgPT4ge1xuICBjb25zdCBwb3NzaWJsZU1heFJldHJpZXMgPSBbNSwgKGRlZmF1bHRPcHRpb25zIHx8IEVNUFRZX09QVElPTlMpLm1heFJldHJpZXMsIChleHRyYU9wdGlvbnMgfHwgRU1QVFlfT1BUSU9OUykubWF4UmV0cmllc10uZmlsdGVyKCh4KSA9PiB4ICE9PSB2b2lkIDApO1xuICBjb25zdCBbbWF4UmV0cmllc10gPSBwb3NzaWJsZU1heFJldHJpZXMuc2xpY2UoLTEpO1xuICBjb25zdCBkZWZhdWx0UmV0cnlDb25kaXRpb24gPSAoXywgX18sIHtcbiAgICBhdHRlbXB0XG4gIH0pID0+IGF0dGVtcHQgPD0gbWF4UmV0cmllcztcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBtYXhSZXRyaWVzLFxuICAgIGJhY2tvZmY6IGRlZmF1bHRCYWNrb2ZmLFxuICAgIHJldHJ5Q29uZGl0aW9uOiBkZWZhdWx0UmV0cnlDb25kaXRpb24sXG4gICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgLi4uZXh0cmFPcHRpb25zXG4gIH07XG4gIGxldCByZXRyeTIgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlUXVlcnkoYXJncywgYXBpLCBleHRyYU9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgSGFuZGxlZEVycm9yKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHJ5MisrO1xuICAgICAgaWYgKGUudGhyb3dJbW1lZGlhdGVseSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEhhbmRsZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEhhbmRsZWRFcnJvciAmJiAhb3B0aW9ucy5yZXRyeUNvbmRpdGlvbihlLnZhbHVlLmVycm9yLCBhcmdzLCB7XG4gICAgICAgIGF0dGVtcHQ6IHJldHJ5MixcbiAgICAgICAgYmFzZVF1ZXJ5QXBpOiBhcGksXG4gICAgICAgIGV4dHJhT3B0aW9uc1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBvcHRpb25zLmJhY2tvZmYocmV0cnkyLCBvcHRpb25zLm1heFJldHJpZXMpO1xuICAgIH1cbiAgfVxufTtcbnZhciByZXRyeSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuYXNzaWduKHJldHJ5V2l0aEJhY2tvZmYsIHtcbiAgZmFpbFxufSk7XG5cbi8vIHNyYy9xdWVyeS9jb3JlL3NldHVwTGlzdGVuZXJzLnRzXG52YXIgb25Gb2N1cyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oXCJfX3J0a3EvZm9jdXNlZFwiKTtcbnZhciBvbkZvY3VzTG9zdCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oXCJfX3J0a3EvdW5mb2N1c2VkXCIpO1xudmFyIG9uT25saW5lID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihcIl9fcnRrcS9vbmxpbmVcIik7XG52YXIgb25PZmZsaW5lID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihcIl9fcnRrcS9vZmZsaW5lXCIpO1xudmFyIGluaXRpYWxpemVkID0gZmFsc2U7XG5mdW5jdGlvbiBzZXR1cExpc3RlbmVycyhkaXNwYXRjaCwgY3VzdG9tSGFuZGxlcikge1xuICBmdW5jdGlvbiBkZWZhdWx0SGFuZGxlcigpIHtcbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9ICgpID0+IGRpc3BhdGNoKG9uRm9jdXMoKSk7XG4gICAgY29uc3QgaGFuZGxlRm9jdXNMb3N0ID0gKCkgPT4gZGlzcGF0Y2gob25Gb2N1c0xvc3QoKSk7XG4gICAgY29uc3QgaGFuZGxlT25saW5lID0gKCkgPT4gZGlzcGF0Y2gob25PbmxpbmUoKSk7XG4gICAgY29uc3QgaGFuZGxlT2ZmbGluZSA9ICgpID0+IGRpc3BhdGNoKG9uT2ZmbGluZSgpKTtcbiAgICBjb25zdCBoYW5kbGVWaXNpYmlsaXR5Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSB7XG4gICAgICAgIGhhbmRsZUZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVGb2N1c0xvc3QoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCBoYW5kbGVWaXNpYmlsaXR5Q2hhbmdlLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgaGFuZGxlT25saW5lLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCBoYW5kbGVPZmZsaW5lLCBmYWxzZSk7XG4gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCBoYW5kbGVWaXNpYmlsaXR5Q2hhbmdlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIGhhbmRsZU9ubGluZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgaGFuZGxlT2ZmbGluZSk7XG4gICAgICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICB9XG4gIHJldHVybiBjdXN0b21IYW5kbGVyID8gY3VzdG9tSGFuZGxlcihkaXNwYXRjaCwge1xuICAgIG9uRm9jdXMsXG4gICAgb25Gb2N1c0xvc3QsXG4gICAgb25PZmZsaW5lLFxuICAgIG9uT25saW5lXG4gIH0pIDogZGVmYXVsdEhhbmRsZXIoKTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2VuZHBvaW50RGVmaW5pdGlvbnMudHNcbmZ1bmN0aW9uIGlzUXVlcnlEZWZpbml0aW9uKGUpIHtcbiAgcmV0dXJuIGUudHlwZSA9PT0gXCJxdWVyeVwiIC8qIHF1ZXJ5ICovO1xufVxuZnVuY3Rpb24gaXNNdXRhdGlvbkRlZmluaXRpb24oZSkge1xuICByZXR1cm4gZS50eXBlID09PSBcIm11dGF0aW9uXCIgLyogbXV0YXRpb24gKi87XG59XG5mdW5jdGlvbiBpc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGUpIHtcbiAgcmV0dXJuIGUudHlwZSA9PT0gXCJpbmZpbml0ZXF1ZXJ5XCIgLyogaW5maW5pdGVxdWVyeSAqLztcbn1cbmZ1bmN0aW9uIGlzQW55UXVlcnlEZWZpbml0aW9uKGUpIHtcbiAgcmV0dXJuIGlzUXVlcnlEZWZpbml0aW9uKGUpIHx8IGlzSW5maW5pdGVRdWVyeURlZmluaXRpb24oZSk7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVQcm92aWRlZEJ5KGRlc2NyaXB0aW9uLCByZXN1bHQsIGVycm9yLCBxdWVyeUFyZywgbWV0YSwgYXNzZXJ0VGFnVHlwZXMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZGVzY3JpcHRpb24pKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uKHJlc3VsdCwgZXJyb3IsIHF1ZXJ5QXJnLCBtZXRhKS5maWx0ZXIoaXNOb3ROdWxsaXNoKS5tYXAoZXhwYW5kVGFnRGVzY3JpcHRpb24pLm1hcChhc3NlcnRUYWdUeXBlcyk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGVzY3JpcHRpb24pKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uLm1hcChleHBhbmRUYWdEZXNjcmlwdGlvbikubWFwKGFzc2VydFRhZ1R5cGVzKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHQpIHtcbiAgcmV0dXJuIHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBleHBhbmRUYWdEZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiID8ge1xuICAgIHR5cGU6IGRlc2NyaXB0aW9uXG4gIH0gOiBkZXNjcmlwdGlvbjtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRUaHVua3MudHNcbmltcG9ydCB7IGlzRHJhZnRhYmxlLCBwcm9kdWNlV2l0aFBhdGNoZXMgfSBmcm9tIFwiaW1tZXJcIjtcblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRJbml0aWF0ZS50c1xuaW1wb3J0IHsgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSBhcyBfZm9ybWF0UHJvZEVycm9yTWVzc2FnZSB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XG5cbi8vIHNyYy90c0hlbHBlcnMudHNcbmZ1bmN0aW9uIGFzU2FmZVByb21pc2UocHJvbWlzZSwgZmFsbGJhY2spIHtcbiAgcmV0dXJuIHByb21pc2UuY2F0Y2goZmFsbGJhY2spO1xufVxuXG4vLyBzcmMvcXVlcnkvY29yZS9idWlsZEluaXRpYXRlLnRzXG52YXIgZm9yY2VRdWVyeUZuU3ltYm9sID0gU3ltYm9sKFwiZm9yY2VRdWVyeUZuXCIpO1xudmFyIGlzVXBzZXJ0UXVlcnkgPSAoYXJnKSA9PiB0eXBlb2YgYXJnW2ZvcmNlUXVlcnlGblN5bWJvbF0gPT09IFwiZnVuY3Rpb25cIjtcbmZ1bmN0aW9uIGJ1aWxkSW5pdGlhdGUoe1xuICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gIHF1ZXJ5VGh1bmssXG4gIGluZmluaXRlUXVlcnlUaHVuayxcbiAgbXV0YXRpb25UaHVuayxcbiAgYXBpLFxuICBjb250ZXh0XG59KSB7XG4gIGNvbnN0IHJ1bm5pbmdRdWVyaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3QgcnVubmluZ011dGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IHtcbiAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0LFxuICAgIHJlbW92ZU11dGF0aW9uUmVzdWx0LFxuICAgIHVwZGF0ZVN1YnNjcmlwdGlvbk9wdGlvbnNcbiAgfSA9IGFwaS5pbnRlcm5hbEFjdGlvbnM7XG4gIHJldHVybiB7XG4gICAgYnVpbGRJbml0aWF0ZVF1ZXJ5LFxuICAgIGJ1aWxkSW5pdGlhdGVJbmZpbml0ZVF1ZXJ5LFxuICAgIGJ1aWxkSW5pdGlhdGVNdXRhdGlvbixcbiAgICBnZXRSdW5uaW5nUXVlcnlUaHVuayxcbiAgICBnZXRSdW5uaW5nTXV0YXRpb25UaHVuayxcbiAgICBnZXRSdW5uaW5nUXVlcmllc1RodW5rLFxuICAgIGdldFJ1bm5pbmdNdXRhdGlvbnNUaHVua1xuICB9O1xuICBmdW5jdGlvbiBnZXRSdW5uaW5nUXVlcnlUaHVuayhlbmRwb2ludE5hbWUsIHF1ZXJ5QXJncykge1xuICAgIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGNvbnRleHQuZW5kcG9pbnREZWZpbml0aW9uc1tlbmRwb2ludE5hbWVdO1xuICAgICAgY29uc3QgcXVlcnlDYWNoZUtleSA9IHNlcmlhbGl6ZVF1ZXJ5QXJncyh7XG4gICAgICAgIHF1ZXJ5QXJncyxcbiAgICAgICAgZW5kcG9pbnREZWZpbml0aW9uLFxuICAgICAgICBlbmRwb2ludE5hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJ1bm5pbmdRdWVyaWVzLmdldChkaXNwYXRjaCk/LltxdWVyeUNhY2hlS2V5XTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGdldFJ1bm5pbmdNdXRhdGlvblRodW5rKF9lbmRwb2ludE5hbWUsIGZpeGVkQ2FjaGVLZXlPclJlcXVlc3RJZCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICAgIHJldHVybiBydW5uaW5nTXV0YXRpb25zLmdldChkaXNwYXRjaCk/LltmaXhlZENhY2hlS2V5T3JSZXF1ZXN0SWRdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0UnVubmluZ1F1ZXJpZXNUaHVuaygpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoKSA9PiBPYmplY3QudmFsdWVzKHJ1bm5pbmdRdWVyaWVzLmdldChkaXNwYXRjaCkgfHwge30pLmZpbHRlcihpc05vdE51bGxpc2gpO1xuICB9XG4gIGZ1bmN0aW9uIGdldFJ1bm5pbmdNdXRhdGlvbnNUaHVuaygpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoKSA9PiBPYmplY3QudmFsdWVzKHJ1bm5pbmdNdXRhdGlvbnMuZ2V0KGRpc3BhdGNoKSB8fCB7fSkuZmlsdGVyKGlzTm90TnVsbGlzaCk7XG4gIH1cbiAgZnVuY3Rpb24gbWlkZGxld2FyZVdhcm5pbmcoZGlzcGF0Y2gpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAobWlkZGxld2FyZVdhcm5pbmcudHJpZ2dlcmVkKSByZXR1cm47XG4gICAgICBjb25zdCByZXR1cm5lZFZhbHVlID0gZGlzcGF0Y2goYXBpLmludGVybmFsQWN0aW9ucy5pbnRlcm5hbF9nZXRSVEtRU3Vic2NyaXB0aW9ucygpKTtcbiAgICAgIG1pZGRsZXdhcmVXYXJuaW5nLnRyaWdnZXJlZCA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIHJldHVybmVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHJldHVybmVkVmFsdWU/LnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IF9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDM0KSA6IGBXYXJuaW5nOiBNaWRkbGV3YXJlIGZvciBSVEstUXVlcnkgQVBJIGF0IHJlZHVjZXJQYXRoIFwiJHthcGkucmVkdWNlclBhdGh9XCIgaGFzIG5vdCBiZWVuIGFkZGVkIHRvIHRoZSBzdG9yZS5cbllvdSBtdXN0IGFkZCB0aGUgbWlkZGxld2FyZSBmb3IgUlRLLVF1ZXJ5IHRvIGZ1bmN0aW9uIGNvcnJlY3RseSFgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRJbml0aWF0ZUFueVF1ZXJ5KGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgcXVlcnlBY3Rpb24gPSAoYXJnLCB7XG4gICAgICBzdWJzY3JpYmUgPSB0cnVlLFxuICAgICAgZm9yY2VSZWZldGNoLFxuICAgICAgc3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgICAgIFtmb3JjZVF1ZXJ5Rm5TeW1ib2xdOiBmb3JjZVF1ZXJ5Rm4sXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IHt9KSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeUNhY2hlS2V5ID0gc2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgcXVlcnlBcmdzOiBhcmcsXG4gICAgICAgIGVuZHBvaW50RGVmaW5pdGlvbixcbiAgICAgICAgZW5kcG9pbnROYW1lXG4gICAgICB9KTtcbiAgICAgIGxldCB0aHVuaztcbiAgICAgIGNvbnN0IGNvbW1vblRodW5rQXJncyA9IHtcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgdHlwZTogXCJxdWVyeVwiLFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGZvcmNlUmVmZXRjaCxcbiAgICAgICAgc3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgICAgICAgZW5kcG9pbnROYW1lLFxuICAgICAgICBvcmlnaW5hbEFyZ3M6IGFyZyxcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgW2ZvcmNlUXVlcnlGblN5bWJvbF06IGZvcmNlUXVlcnlGblxuICAgICAgfTtcbiAgICAgIGlmIChpc1F1ZXJ5RGVmaW5pdGlvbihlbmRwb2ludERlZmluaXRpb24pKSB7XG4gICAgICAgIHRodW5rID0gcXVlcnlUaHVuayhjb21tb25UaHVua0FyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBpbml0aWFsUGFnZVBhcmFtXG4gICAgICAgIH0gPSByZXN0O1xuICAgICAgICB0aHVuayA9IGluZmluaXRlUXVlcnlUaHVuayh7XG4gICAgICAgICAgLi4uY29tbW9uVGh1bmtBcmdzLFxuICAgICAgICAgIC8vIFN1cHBseSB0aGVzZSBldmVuIGlmIHVuZGVmaW5lZC4gVGhpcyBoZWxwcyB3aXRoIGEgZmllbGQgZXhpc3RlbmNlXG4gICAgICAgICAgLy8gY2hlY2sgb3ZlciBpbiBgYnVpbGRTbGljZS50c2BcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaW5pdGlhbFBhZ2VQYXJhbVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gYXBpLmVuZHBvaW50c1tlbmRwb2ludE5hbWVdLnNlbGVjdChhcmcpO1xuICAgICAgY29uc3QgdGh1bmtSZXN1bHQgPSBkaXNwYXRjaCh0aHVuayk7XG4gICAgICBjb25zdCBzdGF0ZUFmdGVyID0gc2VsZWN0b3IoZ2V0U3RhdGUoKSk7XG4gICAgICBtaWRkbGV3YXJlV2FybmluZyhkaXNwYXRjaCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWJvcnRcbiAgICAgIH0gPSB0aHVua1Jlc3VsdDtcbiAgICAgIGNvbnN0IHNraXBwZWRTeW5jaHJvbm91c2x5ID0gc3RhdGVBZnRlci5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZDtcbiAgICAgIGNvbnN0IHJ1bm5pbmdRdWVyeSA9IHJ1bm5pbmdRdWVyaWVzLmdldChkaXNwYXRjaCk/LltxdWVyeUNhY2hlS2V5XTtcbiAgICAgIGNvbnN0IHNlbGVjdEZyb21TdGF0ZSA9ICgpID0+IHNlbGVjdG9yKGdldFN0YXRlKCkpO1xuICAgICAgY29uc3Qgc3RhdGVQcm9taXNlID0gT2JqZWN0LmFzc2lnbihmb3JjZVF1ZXJ5Rm4gPyAoXG4gICAgICAgIC8vIGEgcXVlcnkgaGFzIGJlZW4gZm9yY2VkICh1cHNlcnRRdWVyeURhdGEpXG4gICAgICAgIC8vIC0+IHdlIHdhbnQgdG8gcmVzb2x2ZSBpdCBvbmNlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB3aXRoIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSB3cml0dGVuXG4gICAgICAgIHRodW5rUmVzdWx0LnRoZW4oc2VsZWN0RnJvbVN0YXRlKVxuICAgICAgKSA6IHNraXBwZWRTeW5jaHJvbm91c2x5ICYmICFydW5uaW5nUXVlcnkgPyAoXG4gICAgICAgIC8vIGEgcXVlcnkgaGFzIGJlZW4gc2tpcHBlZCBkdWUgdG8gYSBjb25kaXRpb24gYW5kIHdlIGRvIG5vdCBoYXZlIGFueSBjdXJyZW50bHkgcnVubmluZyBxdWVyeVxuICAgICAgICAvLyAtPiB3ZSB3YW50IHRvIHJlc29sdmUgaXQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgY3VycmVudCBkYXRhXG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzdGF0ZUFmdGVyKVxuICAgICAgKSA6IChcbiAgICAgICAgLy8gcXVlcnkganVzdCBzdGFydGVkIG9yIG9uZSBpcyBhbHJlYWR5IGluIGZsaWdodFxuICAgICAgICAvLyAtPiB3YWl0IGZvciB0aGUgcnVubmluZyBxdWVyeSwgdGhlbiByZXNvbHZlIHdpdGggZGF0YSBmcm9tIGFmdGVyIHRoYXRcbiAgICAgICAgUHJvbWlzZS5hbGwoW3J1bm5pbmdRdWVyeSwgdGh1bmtSZXN1bHRdKS50aGVuKHNlbGVjdEZyb21TdGF0ZSlcbiAgICAgICksIHtcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgIGFib3J0LFxuICAgICAgICBhc3luYyB1bndyYXAoKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RhdGVQcm9taXNlO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZmV0Y2g6ICgpID0+IGRpc3BhdGNoKHF1ZXJ5QWN0aW9uKGFyZywge1xuICAgICAgICAgIHN1YnNjcmliZTogZmFsc2UsXG4gICAgICAgICAgZm9yY2VSZWZldGNoOiB0cnVlXG4gICAgICAgIH0pKSxcbiAgICAgICAgdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZSkgZGlzcGF0Y2godW5zdWJzY3JpYmVRdWVyeVJlc3VsdCh7XG4gICAgICAgICAgICBxdWVyeUNhY2hlS2V5LFxuICAgICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVTdWJzY3JpcHRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgICBzdGF0ZVByb21pc2Uuc3Vic2NyaXB0aW9uT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgZGlzcGF0Y2godXBkYXRlU3Vic2NyaXB0aW9uT3B0aW9ucyh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICBxdWVyeUNhY2hlS2V5LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXJ1bm5pbmdRdWVyeSAmJiAhc2tpcHBlZFN5bmNocm9ub3VzbHkgJiYgIWZvcmNlUXVlcnlGbikge1xuICAgICAgICBjb25zdCBydW5uaW5nID0gZ2V0T3JJbnNlcnQocnVubmluZ1F1ZXJpZXMsIGRpc3BhdGNoLCB7fSk7XG4gICAgICAgIHJ1bm5pbmdbcXVlcnlDYWNoZUtleV0gPSBzdGF0ZVByb21pc2U7XG4gICAgICAgIHN0YXRlUHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBkZWxldGUgcnVubmluZ1txdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgICBpZiAoIWNvdW50T2JqZWN0S2V5cyhydW5uaW5nKSkge1xuICAgICAgICAgICAgcnVubmluZ1F1ZXJpZXMuZGVsZXRlKGRpc3BhdGNoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlUHJvbWlzZTtcbiAgICB9O1xuICAgIHJldHVybiBxdWVyeUFjdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBidWlsZEluaXRpYXRlUXVlcnkoZW5kcG9pbnROYW1lLCBlbmRwb2ludERlZmluaXRpb24pIHtcbiAgICBjb25zdCBxdWVyeUFjdGlvbiA9IGJ1aWxkSW5pdGlhdGVBbnlRdWVyeShlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbik7XG4gICAgcmV0dXJuIHF1ZXJ5QWN0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkSW5pdGlhdGVJbmZpbml0ZVF1ZXJ5KGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgaW5maW5pdGVRdWVyeUFjdGlvbiA9IGJ1aWxkSW5pdGlhdGVBbnlRdWVyeShlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbik7XG4gICAgcmV0dXJuIGluZmluaXRlUXVlcnlBY3Rpb247XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRJbml0aWF0ZU11dGF0aW9uKGVuZHBvaW50TmFtZSkge1xuICAgIHJldHVybiAoYXJnLCB7XG4gICAgICB0cmFjayA9IHRydWUsXG4gICAgICBmaXhlZENhY2hlS2V5XG4gICAgfSA9IHt9KSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICBjb25zdCB0aHVuayA9IG11dGF0aW9uVGh1bmsoe1xuICAgICAgICB0eXBlOiBcIm11dGF0aW9uXCIsXG4gICAgICAgIGVuZHBvaW50TmFtZSxcbiAgICAgICAgb3JpZ2luYWxBcmdzOiBhcmcsXG4gICAgICAgIHRyYWNrLFxuICAgICAgICBmaXhlZENhY2hlS2V5XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRodW5rUmVzdWx0ID0gZGlzcGF0Y2godGh1bmspO1xuICAgICAgbWlkZGxld2FyZVdhcm5pbmcoZGlzcGF0Y2gpO1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFib3J0LFxuICAgICAgICB1bndyYXBcbiAgICAgIH0gPSB0aHVua1Jlc3VsdDtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlUHJvbWlzZSA9IGFzU2FmZVByb21pc2UodGh1bmtSZXN1bHQudW53cmFwKCkudGhlbigoZGF0YSkgPT4gKHtcbiAgICAgICAgZGF0YVxuICAgICAgfSkpLCAoZXJyb3IpID0+ICh7XG4gICAgICAgIGVycm9yXG4gICAgICB9KSk7XG4gICAgICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICAgICAgZGlzcGF0Y2gocmVtb3ZlTXV0YXRpb25SZXN1bHQoe1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBmaXhlZENhY2hlS2V5XG4gICAgICAgIH0pKTtcbiAgICAgIH07XG4gICAgICBjb25zdCByZXQgPSBPYmplY3QuYXNzaWduKHJldHVyblZhbHVlUHJvbWlzZSwge1xuICAgICAgICBhcmc6IHRodW5rUmVzdWx0LmFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhYm9ydCxcbiAgICAgICAgdW53cmFwLFxuICAgICAgICByZXNldFxuICAgICAgfSk7XG4gICAgICBjb25zdCBydW5uaW5nID0gcnVubmluZ011dGF0aW9ucy5nZXQoZGlzcGF0Y2gpIHx8IHt9O1xuICAgICAgcnVubmluZ011dGF0aW9ucy5zZXQoZGlzcGF0Y2gsIHJ1bm5pbmcpO1xuICAgICAgcnVubmluZ1tyZXF1ZXN0SWRdID0gcmV0O1xuICAgICAgcmV0LnRoZW4oKCkgPT4ge1xuICAgICAgICBkZWxldGUgcnVubmluZ1tyZXF1ZXN0SWRdO1xuICAgICAgICBpZiAoIWNvdW50T2JqZWN0S2V5cyhydW5uaW5nKSkge1xuICAgICAgICAgIHJ1bm5pbmdNdXRhdGlvbnMuZGVsZXRlKGRpc3BhdGNoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZml4ZWRDYWNoZUtleSkge1xuICAgICAgICBydW5uaW5nW2ZpeGVkQ2FjaGVLZXldID0gcmV0O1xuICAgICAgICByZXQudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKHJ1bm5pbmdbZml4ZWRDYWNoZUtleV0gPT09IHJldCkge1xuICAgICAgICAgICAgZGVsZXRlIHJ1bm5pbmdbZml4ZWRDYWNoZUtleV07XG4gICAgICAgICAgICBpZiAoIWNvdW50T2JqZWN0S2V5cyhydW5uaW5nKSkge1xuICAgICAgICAgICAgICBydW5uaW5nTXV0YXRpb25zLmRlbGV0ZShkaXNwYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvcXVlcnkvc3RhbmRhcmRTY2hlbWEudHNcbmltcG9ydCB7IFNjaGVtYUVycm9yIH0gZnJvbSBcIkBzdGFuZGFyZC1zY2hlbWEvdXRpbHNcIjtcbnZhciBOYW1lZFNjaGVtYUVycm9yID0gY2xhc3MgZXh0ZW5kcyBTY2hlbWFFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGlzc3VlcywgdmFsdWUsIHNjaGVtYU5hbWUsIF9icU1ldGEpIHtcbiAgICBzdXBlcihpc3N1ZXMpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVtYU5hbWUgPSBzY2hlbWFOYW1lO1xuICAgIHRoaXMuX2JxTWV0YSA9IF9icU1ldGE7XG4gIH1cbn07XG5hc3luYyBmdW5jdGlvbiBwYXJzZVdpdGhTY2hlbWEoc2NoZW1hLCBkYXRhLCBzY2hlbWFOYW1lLCBicU1ldGEpIHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NoZW1hW1wifnN0YW5kYXJkXCJdLnZhbGlkYXRlKGRhdGEpO1xuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBOYW1lZFNjaGVtYUVycm9yKHJlc3VsdC5pc3N1ZXMsIGRhdGEsIHNjaGVtYU5hbWUsIGJxTWV0YSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRUaHVua3MudHNcbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm1SZXNwb25zZShiYXNlUXVlcnlSZXR1cm5WYWx1ZSkge1xuICByZXR1cm4gYmFzZVF1ZXJ5UmV0dXJuVmFsdWU7XG59XG52YXIgYWRkU2hvdWxkQXV0b0JhdGNoID0gKGFyZyA9IHt9KSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uYXJnLFxuICAgIFtTSE9VTERfQVVUT0JBVENIXTogdHJ1ZVxuICB9O1xufTtcbmZ1bmN0aW9uIGJ1aWxkVGh1bmtzKHtcbiAgcmVkdWNlclBhdGgsXG4gIGJhc2VRdWVyeSxcbiAgY29udGV4dDoge1xuICAgIGVuZHBvaW50RGVmaW5pdGlvbnNcbiAgfSxcbiAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICBhcGksXG4gIGFzc2VydFRhZ1R5cGUsXG4gIHNlbGVjdG9ycyxcbiAgb25TY2hlbWFGYWlsdXJlLFxuICBjYXRjaFNjaGVtYUZhaWx1cmU6IGdsb2JhbENhdGNoU2NoZW1hRmFpbHVyZSxcbiAgc2tpcFNjaGVtYVZhbGlkYXRpb246IGdsb2JhbFNraXBTY2hlbWFWYWxpZGF0aW9uXG59KSB7XG4gIGNvbnN0IHBhdGNoUXVlcnlEYXRhID0gKGVuZHBvaW50TmFtZSwgYXJnLCBwYXRjaGVzLCB1cGRhdGVQcm92aWRlZCkgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGVuZHBvaW50RGVmaW5pdGlvbnNbZW5kcG9pbnROYW1lXTtcbiAgICBjb25zdCBxdWVyeUNhY2hlS2V5ID0gc2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgIHF1ZXJ5QXJnczogYXJnLFxuICAgICAgZW5kcG9pbnREZWZpbml0aW9uLFxuICAgICAgZW5kcG9pbnROYW1lXG4gICAgfSk7XG4gICAgZGlzcGF0Y2goYXBpLmludGVybmFsQWN0aW9ucy5xdWVyeVJlc3VsdFBhdGNoZWQoe1xuICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgIHBhdGNoZXNcbiAgICB9KSk7XG4gICAgaWYgKCF1cGRhdGVQcm92aWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5zZWxlY3QoYXJnKShcbiAgICAgIC8vIFdvcmsgYXJvdW5kIFRTIDQuMSBtaXNtYXRjaFxuICAgICAgZ2V0U3RhdGUoKVxuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZWRUYWdzID0gY2FsY3VsYXRlUHJvdmlkZWRCeShlbmRwb2ludERlZmluaXRpb24ucHJvdmlkZXNUYWdzLCBuZXdWYWx1ZS5kYXRhLCB2b2lkIDAsIGFyZywge30sIGFzc2VydFRhZ1R5cGUpO1xuICAgIGRpc3BhdGNoKGFwaS5pbnRlcm5hbEFjdGlvbnMudXBkYXRlUHJvdmlkZWRCeShbe1xuICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgIHByb3ZpZGVkVGFnc1xuICAgIH1dKSk7XG4gIH07XG4gIGZ1bmN0aW9uIGFkZFRvU3RhcnQoaXRlbXMsIGl0ZW0sIG1heCA9IDApIHtcbiAgICBjb25zdCBuZXdJdGVtcyA9IFtpdGVtLCAuLi5pdGVtc107XG4gICAgcmV0dXJuIG1heCAmJiBuZXdJdGVtcy5sZW5ndGggPiBtYXggPyBuZXdJdGVtcy5zbGljZSgwLCAtMSkgOiBuZXdJdGVtcztcbiAgfVxuICBmdW5jdGlvbiBhZGRUb0VuZChpdGVtcywgaXRlbSwgbWF4ID0gMCkge1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gWy4uLml0ZW1zLCBpdGVtXTtcbiAgICByZXR1cm4gbWF4ICYmIG5ld0l0ZW1zLmxlbmd0aCA+IG1heCA/IG5ld0l0ZW1zLnNsaWNlKDEpIDogbmV3SXRlbXM7XG4gIH1cbiAgY29uc3QgdXBkYXRlUXVlcnlEYXRhID0gKGVuZHBvaW50TmFtZSwgYXJnLCB1cGRhdGVSZWNpcGUsIHVwZGF0ZVByb3ZpZGVkID0gdHJ1ZSkgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXTtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBlbmRwb2ludERlZmluaXRpb24uc2VsZWN0KGFyZykoXG4gICAgICAvLyBXb3JrIGFyb3VuZCBUUyA0LjEgbWlzbWF0Y2hcbiAgICAgIGdldFN0YXRlKClcbiAgICApO1xuICAgIGNvbnN0IHJldCA9IHtcbiAgICAgIHBhdGNoZXM6IFtdLFxuICAgICAgaW52ZXJzZVBhdGNoZXM6IFtdLFxuICAgICAgdW5kbzogKCkgPT4gZGlzcGF0Y2goYXBpLnV0aWwucGF0Y2hRdWVyeURhdGEoZW5kcG9pbnROYW1lLCBhcmcsIHJldC5pbnZlcnNlUGF0Y2hlcywgdXBkYXRlUHJvdmlkZWQpKVxuICAgIH07XG4gICAgaWYgKGN1cnJlbnRTdGF0ZS5zdGF0dXMgPT09IFwidW5pbml0aWFsaXplZFwiIC8qIHVuaW5pdGlhbGl6ZWQgKi8pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGxldCBuZXdWYWx1ZTtcbiAgICBpZiAoXCJkYXRhXCIgaW4gY3VycmVudFN0YXRlKSB7XG4gICAgICBpZiAoaXNEcmFmdGFibGUoY3VycmVudFN0YXRlLmRhdGEpKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZSwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gcHJvZHVjZVdpdGhQYXRjaGVzKGN1cnJlbnRTdGF0ZS5kYXRhLCB1cGRhdGVSZWNpcGUpO1xuICAgICAgICByZXQucGF0Y2hlcy5wdXNoKC4uLnBhdGNoZXMpO1xuICAgICAgICByZXQuaW52ZXJzZVBhdGNoZXMucHVzaCguLi5pbnZlcnNlUGF0Y2hlcyk7XG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IHVwZGF0ZVJlY2lwZShjdXJyZW50U3RhdGUuZGF0YSk7XG4gICAgICAgIHJldC5wYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldC5pbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgdmFsdWU6IGN1cnJlbnRTdGF0ZS5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmV0LnBhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBkaXNwYXRjaChhcGkudXRpbC5wYXRjaFF1ZXJ5RGF0YShlbmRwb2ludE5hbWUsIGFyZywgcmV0LnBhdGNoZXMsIHVwZGF0ZVByb3ZpZGVkKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgY29uc3QgdXBzZXJ0UXVlcnlEYXRhID0gKGVuZHBvaW50TmFtZSwgYXJnLCB2YWx1ZSkgPT4gKGRpc3BhdGNoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gZGlzcGF0Y2goYXBpLmVuZHBvaW50c1tlbmRwb2ludE5hbWVdLmluaXRpYXRlKGFyZywge1xuICAgICAgc3Vic2NyaWJlOiBmYWxzZSxcbiAgICAgIGZvcmNlUmVmZXRjaDogdHJ1ZSxcbiAgICAgIFtmb3JjZVF1ZXJ5Rm5TeW1ib2xdOiAoKSA9PiAoe1xuICAgICAgICBkYXRhOiB2YWx1ZVxuICAgICAgfSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgY29uc3QgZ2V0VHJhbnNmb3JtQ2FsbGJhY2tGb3JFbmRwb2ludCA9IChlbmRwb2ludERlZmluaXRpb24sIHRyYW5zZm9ybUZpZWxkTmFtZSkgPT4ge1xuICAgIHJldHVybiBlbmRwb2ludERlZmluaXRpb24ucXVlcnkgJiYgZW5kcG9pbnREZWZpbml0aW9uW3RyYW5zZm9ybUZpZWxkTmFtZV0gPyBlbmRwb2ludERlZmluaXRpb25bdHJhbnNmb3JtRmllbGROYW1lXSA6IGRlZmF1bHRUcmFuc2Zvcm1SZXNwb25zZTtcbiAgfTtcbiAgY29uc3QgZXhlY3V0ZUVuZHBvaW50ID0gYXN5bmMgKGFyZywge1xuICAgIHNpZ25hbCxcbiAgICBhYm9ydCxcbiAgICByZWplY3RXaXRoVmFsdWUsXG4gICAgZnVsZmlsbFdpdGhWYWx1ZSxcbiAgICBkaXNwYXRjaCxcbiAgICBnZXRTdGF0ZSxcbiAgICBleHRyYVxuICB9KSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZW5kcG9pbnREZWZpbml0aW9uc1thcmcuZW5kcG9pbnROYW1lXTtcbiAgICBjb25zdCB7XG4gICAgICBtZXRhU2NoZW1hLFxuICAgICAgc2tpcFNjaGVtYVZhbGlkYXRpb24gPSBnbG9iYWxTa2lwU2NoZW1hVmFsaWRhdGlvblxuICAgIH0gPSBlbmRwb2ludERlZmluaXRpb247XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0cmFuc2Zvcm1SZXNwb25zZSA9IGdldFRyYW5zZm9ybUNhbGxiYWNrRm9yRW5kcG9pbnQoZW5kcG9pbnREZWZpbml0aW9uLCBcInRyYW5zZm9ybVJlc3BvbnNlXCIpO1xuICAgICAgY29uc3QgYmFzZVF1ZXJ5QXBpID0ge1xuICAgICAgICBzaWduYWwsXG4gICAgICAgIGFib3J0LFxuICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgIGV4dHJhLFxuICAgICAgICBlbmRwb2ludDogYXJnLmVuZHBvaW50TmFtZSxcbiAgICAgICAgdHlwZTogYXJnLnR5cGUsXG4gICAgICAgIGZvcmNlZDogYXJnLnR5cGUgPT09IFwicXVlcnlcIiA/IGlzRm9yY2VkUXVlcnkoYXJnLCBnZXRTdGF0ZSgpKSA6IHZvaWQgMCxcbiAgICAgICAgcXVlcnlDYWNoZUtleTogYXJnLnR5cGUgPT09IFwicXVlcnlcIiA/IGFyZy5xdWVyeUNhY2hlS2V5IDogdm9pZCAwXG4gICAgICB9O1xuICAgICAgY29uc3QgZm9yY2VRdWVyeUZuID0gYXJnLnR5cGUgPT09IFwicXVlcnlcIiA/IGFyZ1tmb3JjZVF1ZXJ5Rm5TeW1ib2xdIDogdm9pZCAwO1xuICAgICAgbGV0IGZpbmFsUXVlcnlSZXR1cm5WYWx1ZTtcbiAgICAgIGNvbnN0IGZldGNoUGFnZSA9IGFzeW5jIChkYXRhLCBwYXJhbSwgbWF4UGFnZXMsIHByZXZpb3VzKSA9PiB7XG4gICAgICAgIGlmIChwYXJhbSA9PSBudWxsICYmIGRhdGEucGFnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluYWxRdWVyeUFyZyA9IHtcbiAgICAgICAgICBxdWVyeUFyZzogYXJnLm9yaWdpbmFsQXJncyxcbiAgICAgICAgICBwYWdlUGFyYW06IHBhcmFtXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBhZ2VSZXNwb25zZSA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGZpbmFsUXVlcnlBcmcpO1xuICAgICAgICBjb25zdCBhZGRUbyA9IHByZXZpb3VzID8gYWRkVG9TdGFydCA6IGFkZFRvRW5kO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHBhZ2VzOiBhZGRUbyhkYXRhLnBhZ2VzLCBwYWdlUmVzcG9uc2UuZGF0YSwgbWF4UGFnZXMpLFxuICAgICAgICAgICAgcGFnZVBhcmFtczogYWRkVG8oZGF0YS5wYWdlUGFyYW1zLCBwYXJhbSwgbWF4UGFnZXMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXRhOiBwYWdlUmVzcG9uc2UubWV0YVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVSZXF1ZXN0KGZpbmFsUXVlcnlBcmcpIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGV4dHJhT3B0aW9ucyxcbiAgICAgICAgICBhcmdTY2hlbWEsXG4gICAgICAgICAgcmF3UmVzcG9uc2VTY2hlbWEsXG4gICAgICAgICAgcmVzcG9uc2VTY2hlbWFcbiAgICAgICAgfSA9IGVuZHBvaW50RGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKGFyZ1NjaGVtYSAmJiAhc2tpcFNjaGVtYVZhbGlkYXRpb24pIHtcbiAgICAgICAgICBmaW5hbFF1ZXJ5QXJnID0gYXdhaXQgcGFyc2VXaXRoU2NoZW1hKFxuICAgICAgICAgICAgYXJnU2NoZW1hLFxuICAgICAgICAgICAgZmluYWxRdWVyeUFyZyxcbiAgICAgICAgICAgIFwiYXJnU2NoZW1hXCIsXG4gICAgICAgICAgICB7fVxuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIG1ldGEgeWV0LCBzbyB3ZSBjYW4ndCBwYXNzIGl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2VRdWVyeUZuKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZm9yY2VRdWVyeUZuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kcG9pbnREZWZpbml0aW9uLnF1ZXJ5KSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYmFzZVF1ZXJ5KGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeShmaW5hbFF1ZXJ5QXJnKSwgYmFzZVF1ZXJ5QXBpLCBleHRyYU9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVuZHBvaW50RGVmaW5pdGlvbi5xdWVyeUZuKGZpbmFsUXVlcnlBcmcsIGJhc2VRdWVyeUFwaSwgZXh0cmFPcHRpb25zLCAoYXJnMikgPT4gYmFzZVF1ZXJ5KGFyZzIsIGJhc2VRdWVyeUFwaSwgZXh0cmFPcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgICBjb25zdCB3aGF0ID0gZW5kcG9pbnREZWZpbml0aW9uLnF1ZXJ5ID8gXCJgYmFzZVF1ZXJ5YFwiIDogXCJgcXVlcnlGbmBcIjtcbiAgICAgICAgICBsZXQgZXJyO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICBlcnIgPSBgJHt3aGF0fSBkaWQgbm90IHJldHVybiBhbnl0aGluZy5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgZXJyID0gYCR7d2hhdH0gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0LmA7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZXJyb3IgJiYgcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgIGVyciA9IGAke3doYXR9IHJldHVybmVkIGFuIG9iamVjdCBjb250YWluaW5nIGJvdGggXFxgZXJyb3JcXGAgYW5kIFxcYHJlc3VsdFxcYC5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmVycm9yID09PSB2b2lkIDAgJiYgcmVzdWx0LmRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZXJyID0gYCR7d2hhdH0gcmV0dXJuZWQgYW4gb2JqZWN0IGNvbnRhaW5pbmcgbmVpdGhlciBhIHZhbGlkIFxcYGVycm9yXFxgIGFuZCBcXGByZXN1bHRcXGAuIEF0IGxlYXN0IG9uZSBvZiB0aGVtIHNob3VsZCBub3QgYmUgXFxgdW5kZWZpbmVkXFxgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0KSkge1xuICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBcImVycm9yXCIgJiYga2V5ICE9PSBcImRhdGFcIiAmJiBrZXkgIT09IFwibWV0YVwiKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gYFRoZSBvYmplY3QgcmV0dXJuZWQgYnkgJHt3aGF0fSBoYXMgdGhlIHVua25vd24gcHJvcGVydHkgJHtrZXl9LmA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZW5jb3VudGVyZWQgaGFuZGxpbmcgdGhlIGVuZHBvaW50ICR7YXJnLmVuZHBvaW50TmFtZX0uXG4gICAgICAgICAgICAgICAgICAke2Vycn1cbiAgICAgICAgICAgICAgICAgIEl0IG5lZWRzIHRvIHJldHVybiBhbiBvYmplY3Qgd2l0aCBlaXRoZXIgdGhlIHNoYXBlIFxcYHsgZGF0YTogPHZhbHVlPiB9XFxgIG9yIFxcYHsgZXJyb3I6IDx2YWx1ZT4gfVxcYCB0aGF0IG1heSBjb250YWluIGFuIG9wdGlvbmFsIFxcYG1ldGFcXGAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuZWQgd2FzOmAsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IG5ldyBIYW5kbGVkRXJyb3IocmVzdWx0LmVycm9yLCByZXN1bHQubWV0YSk7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZGF0YVxuICAgICAgICB9ID0gcmVzdWx0O1xuICAgICAgICBpZiAocmF3UmVzcG9uc2VTY2hlbWEgJiYgIXNraXBTY2hlbWFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgZGF0YSA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShyYXdSZXNwb25zZVNjaGVtYSwgcmVzdWx0LmRhdGEsIFwicmF3UmVzcG9uc2VTY2hlbWFcIiwgcmVzdWx0Lm1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0cmFuc2Zvcm1lZFJlc3BvbnNlID0gYXdhaXQgdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSwgcmVzdWx0Lm1ldGEsIGZpbmFsUXVlcnlBcmcpO1xuICAgICAgICBpZiAocmVzcG9uc2VTY2hlbWEgJiYgIXNraXBTY2hlbWFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRSZXNwb25zZSA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShyZXNwb25zZVNjaGVtYSwgdHJhbnNmb3JtZWRSZXNwb25zZSwgXCJyZXNwb25zZVNjaGVtYVwiLCByZXN1bHQubWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgZGF0YTogdHJhbnNmb3JtZWRSZXNwb25zZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGFyZy50eXBlID09PSBcInF1ZXJ5XCIgJiYgXCJpbmZpbml0ZVF1ZXJ5T3B0aW9uc1wiIGluIGVuZHBvaW50RGVmaW5pdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaW5maW5pdGVRdWVyeU9wdGlvbnNcbiAgICAgICAgfSA9IGVuZHBvaW50RGVmaW5pdGlvbjtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1heFBhZ2VzID0gSW5maW5pdHlcbiAgICAgICAgfSA9IGluZmluaXRlUXVlcnlPcHRpb25zO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBibGFua0RhdGEgPSB7XG4gICAgICAgICAgcGFnZXM6IFtdLFxuICAgICAgICAgIHBhZ2VQYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhY2hlZERhdGEgPSBzZWxlY3RvcnMuc2VsZWN0UXVlcnlFbnRyeShnZXRTdGF0ZSgpLCBhcmcucXVlcnlDYWNoZUtleSk/LmRhdGE7XG4gICAgICAgIGNvbnN0IGlzRm9yY2VkUXVlcnlOZWVkaW5nUmVmZXRjaCA9IChcbiAgICAgICAgICAvLyBhcmcuZm9yY2VSZWZldGNoXG4gICAgICAgICAgaXNGb3JjZWRRdWVyeShhcmcsIGdldFN0YXRlKCkpICYmICFhcmcuZGlyZWN0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IGlzRm9yY2VkUXVlcnlOZWVkaW5nUmVmZXRjaCB8fCAhY2FjaGVkRGF0YSA/IGJsYW5rRGF0YSA6IGNhY2hlZERhdGE7XG4gICAgICAgIGlmIChcImRpcmVjdGlvblwiIGluIGFyZyAmJiBhcmcuZGlyZWN0aW9uICYmIGV4aXN0aW5nRGF0YS5wYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGFyZy5kaXJlY3Rpb24gPT09IFwiYmFja3dhcmRcIjtcbiAgICAgICAgICBjb25zdCBwYWdlUGFyYW1GbiA9IHByZXZpb3VzID8gZ2V0UHJldmlvdXNQYWdlUGFyYW0gOiBnZXROZXh0UGFnZVBhcmFtO1xuICAgICAgICAgIGNvbnN0IHBhcmFtID0gcGFnZVBhcmFtRm4oaW5maW5pdGVRdWVyeU9wdGlvbnMsIGV4aXN0aW5nRGF0YSwgYXJnLm9yaWdpbmFsQXJncyk7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hQYWdlKGV4aXN0aW5nRGF0YSwgcGFyYW0sIG1heFBhZ2VzLCBwcmV2aW91cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW5pdGlhbFBhZ2VQYXJhbSA9IGluZmluaXRlUXVlcnlPcHRpb25zLmluaXRpYWxQYWdlUGFyYW1cbiAgICAgICAgICB9ID0gYXJnO1xuICAgICAgICAgIGNvbnN0IGNhY2hlZFBhZ2VQYXJhbXMgPSBjYWNoZWREYXRhPy5wYWdlUGFyYW1zID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGZpcnN0UGFnZVBhcmFtID0gY2FjaGVkUGFnZVBhcmFtc1swXSA/PyBpbml0aWFsUGFnZVBhcmFtO1xuICAgICAgICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBjYWNoZWRQYWdlUGFyYW1zLmxlbmd0aDtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmZXRjaFBhZ2UoZXhpc3RpbmdEYXRhLCBmaXJzdFBhZ2VQYXJhbSwgbWF4UGFnZXMpO1xuICAgICAgICAgIGlmIChmb3JjZVF1ZXJ5Rm4pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEucGFnZXNbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWxQYWdlczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IGdldE5leHRQYWdlUGFyYW0oaW5maW5pdGVRdWVyeU9wdGlvbnMsIHJlc3VsdC5kYXRhLCBhcmcub3JpZ2luYWxBcmdzKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGZldGNoUGFnZShyZXN1bHQuZGF0YSwgcGFyYW0sIG1heFBhZ2VzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxRdWVyeVJldHVyblZhbHVlID0gcmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWxRdWVyeVJldHVyblZhbHVlID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoYXJnLm9yaWdpbmFsQXJncyk7XG4gICAgICB9XG4gICAgICBpZiAobWV0YVNjaGVtYSAmJiAhc2tpcFNjaGVtYVZhbGlkYXRpb24gJiYgZmluYWxRdWVyeVJldHVyblZhbHVlLm1ldGEpIHtcbiAgICAgICAgZmluYWxRdWVyeVJldHVyblZhbHVlLm1ldGEgPSBhd2FpdCBwYXJzZVdpdGhTY2hlbWEobWV0YVNjaGVtYSwgZmluYWxRdWVyeVJldHVyblZhbHVlLm1ldGEsIFwibWV0YVNjaGVtYVwiLCBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUubWV0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVsZmlsbFdpdGhWYWx1ZShmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUuZGF0YSwgYWRkU2hvdWxkQXV0b0JhdGNoKHtcbiAgICAgICAgZnVsZmlsbGVkVGltZVN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBiYXNlUXVlcnlNZXRhOiBmaW5hbFF1ZXJ5UmV0dXJuVmFsdWUubWV0YVxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIGlmIChjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEhhbmRsZWRFcnJvcikge1xuICAgICAgICBsZXQgdHJhbnNmb3JtRXJyb3JSZXNwb25zZSA9IGdldFRyYW5zZm9ybUNhbGxiYWNrRm9yRW5kcG9pbnQoZW5kcG9pbnREZWZpbml0aW9uLCBcInRyYW5zZm9ybUVycm9yUmVzcG9uc2VcIik7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByYXdFcnJvclJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIGVycm9yUmVzcG9uc2VTY2hlbWFcbiAgICAgICAgfSA9IGVuZHBvaW50RGVmaW5pdGlvbjtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtZXRhXG4gICAgICAgIH0gPSBjYXVnaHRFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmF3RXJyb3JSZXNwb25zZVNjaGVtYSAmJiAhc2tpcFNjaGVtYVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgcGFyc2VXaXRoU2NoZW1hKHJhd0Vycm9yUmVzcG9uc2VTY2hlbWEsIHZhbHVlLCBcInJhd0Vycm9yUmVzcG9uc2VTY2hlbWFcIiwgbWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZXRhU2NoZW1hICYmICFza2lwU2NoZW1hVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgbWV0YSA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShtZXRhU2NoZW1hLCBtZXRhLCBcIm1ldGFTY2hlbWFcIiwgbWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZEVycm9yUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2Zvcm1FcnJvclJlc3BvbnNlKHZhbHVlLCBtZXRhLCBhcmcub3JpZ2luYWxBcmdzKTtcbiAgICAgICAgICBpZiAoZXJyb3JSZXNwb25zZVNjaGVtYSAmJiAhc2tpcFNjaGVtYVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkRXJyb3JSZXNwb25zZSA9IGF3YWl0IHBhcnNlV2l0aFNjaGVtYShlcnJvclJlc3BvbnNlU2NoZW1hLCB0cmFuc2Zvcm1lZEVycm9yUmVzcG9uc2UsIFwiZXJyb3JSZXNwb25zZVNjaGVtYVwiLCBtZXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlamVjdFdpdGhWYWx1ZSh0cmFuc2Zvcm1lZEVycm9yUmVzcG9uc2UsIGFkZFNob3VsZEF1dG9CYXRjaCh7XG4gICAgICAgICAgICBiYXNlUXVlcnlNZXRhOiBtZXRhXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBOYW1lZFNjaGVtYUVycm9yKSB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgIGVuZHBvaW50OiBhcmcuZW5kcG9pbnROYW1lLFxuICAgICAgICAgICAgYXJnOiBhcmcub3JpZ2luYWxBcmdzLFxuICAgICAgICAgICAgdHlwZTogYXJnLnR5cGUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlS2V5OiBhcmcudHlwZSA9PT0gXCJxdWVyeVwiID8gYXJnLnF1ZXJ5Q2FjaGVLZXkgOiB2b2lkIDBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGVuZHBvaW50RGVmaW5pdGlvbi5vblNjaGVtYUZhaWx1cmU/LihjYXVnaHRFcnJvciwgaW5mbyk7XG4gICAgICAgICAgb25TY2hlbWFGYWlsdXJlPy4oY2F1Z2h0RXJyb3IsIGluZm8pO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhdGNoU2NoZW1hRmFpbHVyZSA9IGdsb2JhbENhdGNoU2NoZW1hRmFpbHVyZVxuICAgICAgICAgIH0gPSBlbmRwb2ludERlZmluaXRpb247XG4gICAgICAgICAgaWYgKGNhdGNoU2NoZW1hRmFpbHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdFdpdGhWYWx1ZShjYXRjaFNjaGVtYUZhaWx1cmUoY2F1Z2h0RXJyb3IsIGluZm8pLCBhZGRTaG91bGRBdXRvQmF0Y2goe1xuICAgICAgICAgICAgICBiYXNlUXVlcnlNZXRhOiBjYXVnaHRFcnJvci5fYnFNZXRhXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhdWdodEVycm9yID0gZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkIHByb2Nlc3NpbmcgYSByZXF1ZXN0IGZvciB0aGUgZW5kcG9pbnQgXCIke2FyZy5lbmRwb2ludE5hbWV9XCIuXG5JbiB0aGUgY2FzZSBvZiBhbiB1bmhhbmRsZWQgZXJyb3IsIG5vIHRhZ3Mgd2lsbCBiZSBcInByb3ZpZGVkXCIgb3IgXCJpbnZhbGlkYXRlZFwiLmAsIGNhdWdodEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2F1Z2h0RXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBpc0ZvcmNlZFF1ZXJ5KGFyZywgc3RhdGUpIHtcbiAgICBjb25zdCByZXF1ZXN0U3RhdGUgPSBzZWxlY3RvcnMuc2VsZWN0UXVlcnlFbnRyeShzdGF0ZSwgYXJnLnF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGNvbnN0IGJhc2VGZXRjaE9uTW91bnRPckFyZ0NoYW5nZSA9IHNlbGVjdG9ycy5zZWxlY3RDb25maWcoc3RhdGUpLnJlZmV0Y2hPbk1vdW50T3JBcmdDaGFuZ2U7XG4gICAgY29uc3QgZnVsZmlsbGVkVmFsID0gcmVxdWVzdFN0YXRlPy5mdWxmaWxsZWRUaW1lU3RhbXA7XG4gICAgY29uc3QgcmVmZXRjaFZhbCA9IGFyZy5mb3JjZVJlZmV0Y2ggPz8gKGFyZy5zdWJzY3JpYmUgJiYgYmFzZUZldGNoT25Nb3VudE9yQXJnQ2hhbmdlKTtcbiAgICBpZiAocmVmZXRjaFZhbCkge1xuICAgICAgcmV0dXJuIHJlZmV0Y2hWYWwgPT09IHRydWUgfHwgKE51bWJlcigvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkgLSBOdW1iZXIoZnVsZmlsbGVkVmFsKSkgLyAxZTMgPj0gcmVmZXRjaFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGNyZWF0ZVF1ZXJ5VGh1bmsgPSAoKSA9PiB7XG4gICAgY29uc3QgZ2VuZXJhdGVkUXVlcnlUaHVuayA9IGNyZWF0ZUFzeW5jVGh1bmsoYCR7cmVkdWNlclBhdGh9L2V4ZWN1dGVRdWVyeWAsIGV4ZWN1dGVFbmRwb2ludCwge1xuICAgICAgZ2V0UGVuZGluZ01ldGEoe1xuICAgICAgICBhcmdcbiAgICAgIH0pIHtcbiAgICAgICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZW5kcG9pbnREZWZpbml0aW9uc1thcmcuZW5kcG9pbnROYW1lXTtcbiAgICAgICAgcmV0dXJuIGFkZFNob3VsZEF1dG9CYXRjaCh7XG4gICAgICAgICAgc3RhcnRlZFRpbWVTdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAuLi5pc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgPyB7XG4gICAgICAgICAgICBkaXJlY3Rpb246IGFyZy5kaXJlY3Rpb25cbiAgICAgICAgICB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgY29uZGl0aW9uKHF1ZXJ5VGh1bmtBcmcsIHtcbiAgICAgICAgZ2V0U3RhdGVcbiAgICAgIH0pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0U3RhdGUgPSBzZWxlY3RvcnMuc2VsZWN0UXVlcnlFbnRyeShzdGF0ZSwgcXVlcnlUaHVua0FyZy5xdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgY29uc3QgZnVsZmlsbGVkVmFsID0gcmVxdWVzdFN0YXRlPy5mdWxmaWxsZWRUaW1lU3RhbXA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBcmcgPSBxdWVyeVRodW5rQXJnLm9yaWdpbmFsQXJncztcbiAgICAgICAgY29uc3QgcHJldmlvdXNBcmcgPSByZXF1ZXN0U3RhdGU/Lm9yaWdpbmFsQXJncztcbiAgICAgICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZW5kcG9pbnREZWZpbml0aW9uc1txdWVyeVRodW5rQXJnLmVuZHBvaW50TmFtZV07XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHF1ZXJ5VGh1bmtBcmcuZGlyZWN0aW9uO1xuICAgICAgICBpZiAoaXNVcHNlcnRRdWVyeShxdWVyeVRodW5rQXJnKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0U3RhdGU/LnN0YXR1cyA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRm9yY2VkUXVlcnkocXVlcnlUaHVua0FyZywgc3RhdGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgJiYgZW5kcG9pbnREZWZpbml0aW9uPy5mb3JjZVJlZmV0Y2g/Lih7XG4gICAgICAgICAgY3VycmVudEFyZyxcbiAgICAgICAgICBwcmV2aW91c0FyZyxcbiAgICAgICAgICBlbmRwb2ludFN0YXRlOiByZXF1ZXN0U3RhdGUsXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnVsZmlsbGVkVmFsICYmICFkaXJlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb246IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZ2VuZXJhdGVkUXVlcnlUaHVuaztcbiAgfTtcbiAgY29uc3QgcXVlcnlUaHVuayA9IGNyZWF0ZVF1ZXJ5VGh1bmsoKTtcbiAgY29uc3QgaW5maW5pdGVRdWVyeVRodW5rID0gY3JlYXRlUXVlcnlUaHVuaygpO1xuICBjb25zdCBtdXRhdGlvblRodW5rID0gY3JlYXRlQXN5bmNUaHVuayhgJHtyZWR1Y2VyUGF0aH0vZXhlY3V0ZU11dGF0aW9uYCwgZXhlY3V0ZUVuZHBvaW50LCB7XG4gICAgZ2V0UGVuZGluZ01ldGEoKSB7XG4gICAgICByZXR1cm4gYWRkU2hvdWxkQXV0b0JhdGNoKHtcbiAgICAgICAgc3RhcnRlZFRpbWVTdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFzVGhlRm9yY2UgPSAob3B0aW9ucykgPT4gXCJmb3JjZVwiIGluIG9wdGlvbnM7XG4gIGNvbnN0IGhhc01heEFnZSA9IChvcHRpb25zKSA9PiBcImlmT2xkZXJUaGFuXCIgaW4gb3B0aW9ucztcbiAgY29uc3QgcHJlZmV0Y2ggPSAoZW5kcG9pbnROYW1lLCBhcmcsIG9wdGlvbnMpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBmb3JjZSA9IGhhc1RoZUZvcmNlKG9wdGlvbnMpICYmIG9wdGlvbnMuZm9yY2U7XG4gICAgY29uc3QgbWF4QWdlID0gaGFzTWF4QWdlKG9wdGlvbnMpICYmIG9wdGlvbnMuaWZPbGRlclRoYW47XG4gICAgY29uc3QgcXVlcnlBY3Rpb24gPSAoZm9yY2UyID0gdHJ1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uczIgPSB7XG4gICAgICAgIGZvcmNlUmVmZXRjaDogZm9yY2UyLFxuICAgICAgICBpc1ByZWZldGNoOiB0cnVlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5pbml0aWF0ZShhcmcsIG9wdGlvbnMyKTtcbiAgICB9O1xuICAgIGNvbnN0IGxhdGVzdFN0YXRlVmFsdWUgPSBhcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0uc2VsZWN0KGFyZykoZ2V0U3RhdGUoKSk7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICBkaXNwYXRjaChxdWVyeUFjdGlvbigpKTtcbiAgICB9IGVsc2UgaWYgKG1heEFnZSkge1xuICAgICAgY29uc3QgbGFzdEZ1bGZpbGxlZFRzID0gbGF0ZXN0U3RhdGVWYWx1ZT8uZnVsZmlsbGVkVGltZVN0YW1wO1xuICAgICAgaWYgKCFsYXN0RnVsZmlsbGVkVHMpIHtcbiAgICAgICAgZGlzcGF0Y2gocXVlcnlBY3Rpb24oKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3VsZFJldHJpZ2dlciA9IChOdW1iZXIoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpIC0gTnVtYmVyKG5ldyBEYXRlKGxhc3RGdWxmaWxsZWRUcykpKSAvIDFlMyA+PSBtYXhBZ2U7XG4gICAgICBpZiAoc2hvdWxkUmV0cmlnZ2VyKSB7XG4gICAgICAgIGRpc3BhdGNoKHF1ZXJ5QWN0aW9uKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwYXRjaChxdWVyeUFjdGlvbihmYWxzZSkpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gbWF0Y2hlc0VuZHBvaW50KGVuZHBvaW50TmFtZSkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBhY3Rpb24/Lm1ldGE/LmFyZz8uZW5kcG9pbnROYW1lID09PSBlbmRwb2ludE5hbWU7XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRNYXRjaFRodW5rQWN0aW9ucyh0aHVuaywgZW5kcG9pbnROYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hdGNoUGVuZGluZzogaXNBbGxPZihpc1BlbmRpbmcodGh1bmspLCBtYXRjaGVzRW5kcG9pbnQoZW5kcG9pbnROYW1lKSksXG4gICAgICBtYXRjaEZ1bGZpbGxlZDogaXNBbGxPZihpc0Z1bGZpbGxlZCh0aHVuayksIG1hdGNoZXNFbmRwb2ludChlbmRwb2ludE5hbWUpKSxcbiAgICAgIG1hdGNoUmVqZWN0ZWQ6IGlzQWxsT2YoaXNSZWplY3RlZCh0aHVuayksIG1hdGNoZXNFbmRwb2ludChlbmRwb2ludE5hbWUpKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBxdWVyeVRodW5rLFxuICAgIG11dGF0aW9uVGh1bmssXG4gICAgaW5maW5pdGVRdWVyeVRodW5rLFxuICAgIHByZWZldGNoLFxuICAgIHVwZGF0ZVF1ZXJ5RGF0YSxcbiAgICB1cHNlcnRRdWVyeURhdGEsXG4gICAgcGF0Y2hRdWVyeURhdGEsXG4gICAgYnVpbGRNYXRjaFRodW5rQWN0aW9uc1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0TmV4dFBhZ2VQYXJhbShvcHRpb25zLCB7XG4gIHBhZ2VzLFxuICBwYWdlUGFyYW1zXG59LCBxdWVyeUFyZykge1xuICBjb25zdCBsYXN0SW5kZXggPSBwYWdlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gb3B0aW9ucy5nZXROZXh0UGFnZVBhcmFtKHBhZ2VzW2xhc3RJbmRleF0sIHBhZ2VzLCBwYWdlUGFyYW1zW2xhc3RJbmRleF0sIHBhZ2VQYXJhbXMsIHF1ZXJ5QXJnKTtcbn1cbmZ1bmN0aW9uIGdldFByZXZpb3VzUGFnZVBhcmFtKG9wdGlvbnMsIHtcbiAgcGFnZXMsXG4gIHBhZ2VQYXJhbXNcbn0sIHF1ZXJ5QXJnKSB7XG4gIHJldHVybiBvcHRpb25zLmdldFByZXZpb3VzUGFnZVBhcmFtPy4ocGFnZXNbMF0sIHBhZ2VzLCBwYWdlUGFyYW1zWzBdLCBwYWdlUGFyYW1zLCBxdWVyeUFyZyk7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVQcm92aWRlZEJ5VGh1bmsoYWN0aW9uLCB0eXBlLCBlbmRwb2ludERlZmluaXRpb25zLCBhc3NlcnRUYWdUeXBlKSB7XG4gIHJldHVybiBjYWxjdWxhdGVQcm92aWRlZEJ5KGVuZHBvaW50RGVmaW5pdGlvbnNbYWN0aW9uLm1ldGEuYXJnLmVuZHBvaW50TmFtZV1bdHlwZV0sIGlzRnVsZmlsbGVkKGFjdGlvbikgPyBhY3Rpb24ucGF5bG9hZCA6IHZvaWQgMCwgaXNSZWplY3RlZFdpdGhWYWx1ZShhY3Rpb24pID8gYWN0aW9uLnBheWxvYWQgOiB2b2lkIDAsIGFjdGlvbi5tZXRhLmFyZy5vcmlnaW5hbEFyZ3MsIFwiYmFzZVF1ZXJ5TWV0YVwiIGluIGFjdGlvbi5tZXRhID8gYWN0aW9uLm1ldGEuYmFzZVF1ZXJ5TWV0YSA6IHZvaWQgMCwgYXNzZXJ0VGFnVHlwZSk7XG59XG5cbi8vIHNyYy9xdWVyeS9jb3JlL2J1aWxkU2xpY2UudHNcbmltcG9ydCB7IGlzRHJhZnQgfSBmcm9tIFwiaW1tZXJcIjtcbmltcG9ydCB7IGFwcGx5UGF0Y2hlcywgb3JpZ2luYWwgfSBmcm9tIFwiaW1tZXJcIjtcbmZ1bmN0aW9uIHVwZGF0ZVF1ZXJ5U3Vic3RhdGVJZkV4aXN0cyhzdGF0ZSwgcXVlcnlDYWNoZUtleSwgdXBkYXRlKSB7XG4gIGNvbnN0IHN1YnN0YXRlID0gc3RhdGVbcXVlcnlDYWNoZUtleV07XG4gIGlmIChzdWJzdGF0ZSkge1xuICAgIHVwZGF0ZShzdWJzdGF0ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE11dGF0aW9uQ2FjaGVLZXkoaWQpIHtcbiAgcmV0dXJuIChcImFyZ1wiIGluIGlkID8gaWQuYXJnLmZpeGVkQ2FjaGVLZXkgOiBpZC5maXhlZENhY2hlS2V5KSA/PyBpZC5yZXF1ZXN0SWQ7XG59XG5mdW5jdGlvbiB1cGRhdGVNdXRhdGlvblN1YnN0YXRlSWZFeGlzdHMoc3RhdGUsIGlkLCB1cGRhdGUpIHtcbiAgY29uc3Qgc3Vic3RhdGUgPSBzdGF0ZVtnZXRNdXRhdGlvbkNhY2hlS2V5KGlkKV07XG4gIGlmIChzdWJzdGF0ZSkge1xuICAgIHVwZGF0ZShzdWJzdGF0ZSk7XG4gIH1cbn1cbnZhciBpbml0aWFsU3RhdGUgPSB7fTtcbmZ1bmN0aW9uIGJ1aWxkU2xpY2Uoe1xuICByZWR1Y2VyUGF0aCxcbiAgcXVlcnlUaHVuayxcbiAgbXV0YXRpb25UaHVuayxcbiAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICBjb250ZXh0OiB7XG4gICAgZW5kcG9pbnREZWZpbml0aW9uczogZGVmaW5pdGlvbnMsXG4gICAgYXBpVWlkLFxuICAgIGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8sXG4gICAgaGFzUmVoeWRyYXRpb25JbmZvXG4gIH0sXG4gIGFzc2VydFRhZ1R5cGUsXG4gIGNvbmZpZ1xufSkge1xuICBjb25zdCByZXNldEFwaVN0YXRlID0gY3JlYXRlQWN0aW9uKGAke3JlZHVjZXJQYXRofS9yZXNldEFwaVN0YXRlYCk7XG4gIGZ1bmN0aW9uIHdyaXRlUGVuZGluZ0NhY2hlRW50cnkoZHJhZnQsIGFyZywgdXBzZXJ0aW5nLCBtZXRhKSB7XG4gICAgZHJhZnRbYXJnLnF1ZXJ5Q2FjaGVLZXldID8/PSB7XG4gICAgICBzdGF0dXM6IFwidW5pbml0aWFsaXplZFwiIC8qIHVuaW5pdGlhbGl6ZWQgKi8sXG4gICAgICBlbmRwb2ludE5hbWU6IGFyZy5lbmRwb2ludE5hbWVcbiAgICB9O1xuICAgIHVwZGF0ZVF1ZXJ5U3Vic3RhdGVJZkV4aXN0cyhkcmFmdCwgYXJnLnF1ZXJ5Q2FjaGVLZXksIChzdWJzdGF0ZSkgPT4ge1xuICAgICAgc3Vic3RhdGUuc3RhdHVzID0gXCJwZW5kaW5nXCIgLyogcGVuZGluZyAqLztcbiAgICAgIHN1YnN0YXRlLnJlcXVlc3RJZCA9IHVwc2VydGluZyAmJiBzdWJzdGF0ZS5yZXF1ZXN0SWQgPyAoXG4gICAgICAgIC8vIGZvciBgdXBzZXJ0UXVlcnlgICoqdXBkYXRlcyoqLCBrZWVwIHRoZSBjdXJyZW50IGByZXF1ZXN0SWRgXG4gICAgICAgIHN1YnN0YXRlLnJlcXVlc3RJZFxuICAgICAgKSA6IChcbiAgICAgICAgLy8gZm9yIG5vcm1hbCBxdWVyaWVzIG9yIGB1cHNlcnRRdWVyeWAgKippbnNlcnRzKiogYWx3YXlzIHVwZGF0ZSB0aGUgYHJlcXVlc3RJZGBcbiAgICAgICAgbWV0YS5yZXF1ZXN0SWRcbiAgICAgICk7XG4gICAgICBpZiAoYXJnLm9yaWdpbmFsQXJncyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN1YnN0YXRlLm9yaWdpbmFsQXJncyA9IGFyZy5vcmlnaW5hbEFyZ3M7XG4gICAgICB9XG4gICAgICBzdWJzdGF0ZS5zdGFydGVkVGltZVN0YW1wID0gbWV0YS5zdGFydGVkVGltZVN0YW1wO1xuICAgICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbbWV0YS5hcmcuZW5kcG9pbnROYW1lXTtcbiAgICAgIGlmIChpc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGVuZHBvaW50RGVmaW5pdGlvbikgJiYgXCJkaXJlY3Rpb25cIiBpbiBhcmcpIHtcbiAgICAgICAgO1xuICAgICAgICBzdWJzdGF0ZS5kaXJlY3Rpb24gPSBhcmcuZGlyZWN0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHdyaXRlRnVsZmlsbGVkQ2FjaGVFbnRyeShkcmFmdCwgbWV0YSwgcGF5bG9hZCwgdXBzZXJ0aW5nKSB7XG4gICAgdXBkYXRlUXVlcnlTdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBtZXRhLmFyZy5xdWVyeUNhY2hlS2V5LCAoc3Vic3RhdGUpID0+IHtcbiAgICAgIGlmIChzdWJzdGF0ZS5yZXF1ZXN0SWQgIT09IG1ldGEucmVxdWVzdElkICYmICF1cHNlcnRpbmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVyZ2VcbiAgICAgIH0gPSBkZWZpbml0aW9uc1ttZXRhLmFyZy5lbmRwb2ludE5hbWVdO1xuICAgICAgc3Vic3RhdGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIiAvKiBmdWxmaWxsZWQgKi87XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgaWYgKHN1YnN0YXRlLmRhdGEgIT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZ1bGZpbGxlZFRpbWVTdGFtcCxcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgIGJhc2VRdWVyeU1ldGEsXG4gICAgICAgICAgICByZXF1ZXN0SWRcbiAgICAgICAgICB9ID0gbWV0YTtcbiAgICAgICAgICBsZXQgbmV3RGF0YSA9IGNyZWF0ZU5leHRTdGF0ZShzdWJzdGF0ZS5kYXRhLCAoZHJhZnRTdWJzdGF0ZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZShkcmFmdFN1YnN0YXRlRGF0YSwgcGF5bG9hZCwge1xuICAgICAgICAgICAgICBhcmc6IGFyZy5vcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgICAgIGJhc2VRdWVyeU1ldGEsXG4gICAgICAgICAgICAgIGZ1bGZpbGxlZFRpbWVTdGFtcCxcbiAgICAgICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzdGF0ZS5kYXRhID0gbmV3RGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzdGF0ZS5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic3RhdGUuZGF0YSA9IGRlZmluaXRpb25zW21ldGEuYXJnLmVuZHBvaW50TmFtZV0uc3RydWN0dXJhbFNoYXJpbmcgPz8gdHJ1ZSA/IGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcoaXNEcmFmdChzdWJzdGF0ZS5kYXRhKSA/IG9yaWdpbmFsKHN1YnN0YXRlLmRhdGEpIDogc3Vic3RhdGUuZGF0YSwgcGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHN1YnN0YXRlLmVycm9yO1xuICAgICAgc3Vic3RhdGUuZnVsZmlsbGVkVGltZVN0YW1wID0gbWV0YS5mdWxmaWxsZWRUaW1lU3RhbXA7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcXVlcnlTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vcXVlcmllc2AsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICByZW1vdmVRdWVyeVJlc3VsdDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCB7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICAgIH1cbiAgICAgICAgfSkge1xuICAgICAgICAgIGRlbGV0ZSBkcmFmdFtxdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH0sXG4gICAgICBjYWNoZUVudHJpZXNVcHNlcnRlZDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHF1ZXJ5RGVzY3JpcHRpb246IGFyZyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBlbnRyeTtcbiAgICAgICAgICAgIHdyaXRlUGVuZGluZ0NhY2hlRW50cnkoZHJhZnQsIGFyZywgdHJ1ZSwge1xuICAgICAgICAgICAgICBhcmcsXG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogYWN0aW9uLm1ldGEucmVxdWVzdElkLFxuICAgICAgICAgICAgICBzdGFydGVkVGltZVN0YW1wOiBhY3Rpb24ubWV0YS50aW1lc3RhbXBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3JpdGVGdWxmaWxsZWRDYWNoZUVudHJ5KFxuICAgICAgICAgICAgICBkcmFmdCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGFjdGlvbi5tZXRhLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICBmdWxmaWxsZWRUaW1lU3RhbXA6IGFjdGlvbi5tZXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICBiYXNlUXVlcnlNZXRhOiB7fVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgLy8gV2Uga25vdyB3ZSdyZSB1cHNlcnRpbmcgaGVyZVxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogKHBheWxvYWQpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyeURlc2NyaXB0aW9ucyA9IHBheWxvYWQubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBlbnRyeTtcbiAgICAgICAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG4gICAgICAgICAgICBjb25zdCBxdWVyeURlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICAgIGVuZHBvaW50TmFtZSxcbiAgICAgICAgICAgICAgb3JpZ2luYWxBcmdzOiBlbnRyeS5hcmcsXG4gICAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXk6IHNlcmlhbGl6ZVF1ZXJ5QXJncyh7XG4gICAgICAgICAgICAgICAgcXVlcnlBcmdzOiBhcmcsXG4gICAgICAgICAgICAgICAgZW5kcG9pbnREZWZpbml0aW9uLFxuICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHF1ZXJ5RGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBheWxvYWQ6IHF1ZXJ5RGVzY3JpcHRpb25zLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBbU0hPVUxEX0FVVE9CQVRDSF06IHRydWUsXG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogbmFub2lkKCksXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHF1ZXJ5UmVzdWx0UGF0Y2hlZDoge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCB7XG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgICAgIHBhdGNoZXNcbiAgICAgICAgICB9XG4gICAgICAgIH0pIHtcbiAgICAgICAgICB1cGRhdGVRdWVyeVN1YnN0YXRlSWZFeGlzdHMoZHJhZnQsIHF1ZXJ5Q2FjaGVLZXksIChzdWJzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgc3Vic3RhdGUuZGF0YSA9IGFwcGx5UGF0Y2hlcyhzdWJzdGF0ZS5kYXRhLCBwYXRjaGVzLmNvbmNhdCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhUmVkdWNlcnMoYnVpbGRlcikge1xuICAgICAgYnVpbGRlci5hZGRDYXNlKHF1ZXJ5VGh1bmsucGVuZGluZywgKGRyYWZ0LCB7XG4gICAgICAgIG1ldGEsXG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICBhcmdcbiAgICAgICAgfVxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cHNlcnRpbmcgPSBpc1Vwc2VydFF1ZXJ5KGFyZyk7XG4gICAgICAgIHdyaXRlUGVuZGluZ0NhY2hlRW50cnkoZHJhZnQsIGFyZywgdXBzZXJ0aW5nLCBtZXRhKTtcbiAgICAgIH0pLmFkZENhc2UocXVlcnlUaHVuay5mdWxmaWxsZWQsIChkcmFmdCwge1xuICAgICAgICBtZXRhLFxuICAgICAgICBwYXlsb2FkXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc2VydGluZyA9IGlzVXBzZXJ0UXVlcnkobWV0YS5hcmcpO1xuICAgICAgICB3cml0ZUZ1bGZpbGxlZENhY2hlRW50cnkoZHJhZnQsIG1ldGEsIHBheWxvYWQsIHVwc2VydGluZyk7XG4gICAgICB9KS5hZGRDYXNlKHF1ZXJ5VGh1bmsucmVqZWN0ZWQsIChkcmFmdCwge1xuICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgIGFyZyxcbiAgICAgICAgICByZXF1ZXN0SWRcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHBheWxvYWRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgdXBkYXRlUXVlcnlTdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBhcmcucXVlcnlDYWNoZUtleSwgKHN1YnN0YXRlKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3Vic3RhdGUucmVxdWVzdElkICE9PSByZXF1ZXN0SWQpIHJldHVybjtcbiAgICAgICAgICAgIHN1YnN0YXRlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIiAvKiByZWplY3RlZCAqLztcbiAgICAgICAgICAgIHN1YnN0YXRlLmVycm9yID0gcGF5bG9hZCA/PyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSkuYWRkTWF0Y2hlcihoYXNSZWh5ZHJhdGlvbkluZm8sIChkcmFmdCwgYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBxdWVyaWVzXG4gICAgICAgIH0gPSBleHRyYWN0UmVoeWRyYXRpb25JbmZvKGFjdGlvbik7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJpZXMpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZG8gbm90IHJlaHlkcmF0ZSBlbnRyaWVzIHRoYXQgd2VyZSBjdXJyZW50bHkgaW4gZmxpZ2h0LlxuICAgICAgICAgICAgZW50cnk/LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIiAvKiBmdWxmaWxsZWQgKi8gfHwgZW50cnk/LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiIC8qIHJlamVjdGVkICovXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkcmFmdFtrZXldID0gZW50cnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBtdXRhdGlvblNsaWNlID0gY3JlYXRlU2xpY2Uoe1xuICAgIG5hbWU6IGAke3JlZHVjZXJQYXRofS9tdXRhdGlvbnNgLFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgcmVtb3ZlTXV0YXRpb25SZXN1bHQ6IHtcbiAgICAgICAgcmVkdWNlcihkcmFmdCwge1xuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgfSkge1xuICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2V0TXV0YXRpb25DYWNoZUtleShwYXlsb2FkKTtcbiAgICAgICAgICBpZiAoY2FjaGVLZXkgaW4gZHJhZnQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkcmFmdFtjYWNoZUtleV07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJlOiBwcmVwYXJlQXV0b0JhdGNoZWQoKVxuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmFSZWR1Y2VycyhidWlsZGVyKSB7XG4gICAgICBidWlsZGVyLmFkZENhc2UobXV0YXRpb25UaHVuay5wZW5kaW5nLCAoZHJhZnQsIHtcbiAgICAgICAgbWV0YSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgc3RhcnRlZFRpbWVTdGFtcFxuICAgICAgICB9XG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmICghYXJnLnRyYWNrKSByZXR1cm47XG4gICAgICAgIGRyYWZ0W2dldE11dGF0aW9uQ2FjaGVLZXkobWV0YSldID0ge1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiIC8qIHBlbmRpbmcgKi8sXG4gICAgICAgICAgZW5kcG9pbnROYW1lOiBhcmcuZW5kcG9pbnROYW1lLFxuICAgICAgICAgIHN0YXJ0ZWRUaW1lU3RhbXBcbiAgICAgICAgfTtcbiAgICAgIH0pLmFkZENhc2UobXV0YXRpb25UaHVuay5mdWxmaWxsZWQsIChkcmFmdCwge1xuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBtZXRhXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmICghbWV0YS5hcmcudHJhY2spIHJldHVybjtcbiAgICAgICAgdXBkYXRlTXV0YXRpb25TdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBtZXRhLCAoc3Vic3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoc3Vic3RhdGUucmVxdWVzdElkICE9PSBtZXRhLnJlcXVlc3RJZCkgcmV0dXJuO1xuICAgICAgICAgIHN1YnN0YXRlLnN0YXR1cyA9IFwiZnVsZmlsbGVkXCIgLyogZnVsZmlsbGVkICovO1xuICAgICAgICAgIHN1YnN0YXRlLmRhdGEgPSBwYXlsb2FkO1xuICAgICAgICAgIHN1YnN0YXRlLmZ1bGZpbGxlZFRpbWVTdGFtcCA9IG1ldGEuZnVsZmlsbGVkVGltZVN0YW1wO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmFkZENhc2UobXV0YXRpb25UaHVuay5yZWplY3RlZCwgKGRyYWZ0LCB7XG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBtZXRhXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmICghbWV0YS5hcmcudHJhY2spIHJldHVybjtcbiAgICAgICAgdXBkYXRlTXV0YXRpb25TdWJzdGF0ZUlmRXhpc3RzKGRyYWZ0LCBtZXRhLCAoc3Vic3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoc3Vic3RhdGUucmVxdWVzdElkICE9PSBtZXRhLnJlcXVlc3RJZCkgcmV0dXJuO1xuICAgICAgICAgIHN1YnN0YXRlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIiAvKiByZWplY3RlZCAqLztcbiAgICAgICAgICBzdWJzdGF0ZS5lcnJvciA9IHBheWxvYWQgPz8gZXJyb3I7XG4gICAgICAgIH0pO1xuICAgICAgfSkuYWRkTWF0Y2hlcihoYXNSZWh5ZHJhdGlvbkluZm8sIChkcmFmdCwgYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtdXRhdGlvbnNcbiAgICAgICAgfSA9IGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8oYWN0aW9uKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIGRvIG5vdCByZWh5ZHJhdGUgZW50cmllcyB0aGF0IHdlcmUgY3VycmVudGx5IGluIGZsaWdodC5cbiAgICAgICAgICAgIChlbnRyeT8uc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiIC8qIGZ1bGZpbGxlZCAqLyB8fCBlbnRyeT8uc3RhdHVzID09PSBcInJlamVjdGVkXCIgLyogcmVqZWN0ZWQgKi8pICYmIC8vIG9ubHkgcmVoeWRyYXRlIGVuZHBvaW50cyB0aGF0IHdlcmUgcGVyc2lzdGVkIHVzaW5nIGEgYGZpeGVkQ2FjaGVLZXlgXG4gICAgICAgICAgICBrZXkgIT09IGVudHJ5Py5yZXF1ZXN0SWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGRyYWZ0W2tleV0gPSBlbnRyeTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGluaXRpYWxJbnZhbGlkYXRpb25TdGF0ZSA9IHtcbiAgICB0YWdzOiB7fSxcbiAgICBrZXlzOiB7fVxuICB9O1xuICBjb25zdCBpbnZhbGlkYXRpb25TbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vaW52YWxpZGF0aW9uYCxcbiAgICBpbml0aWFsU3RhdGU6IGluaXRpYWxJbnZhbGlkYXRpb25TdGF0ZSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgdXBkYXRlUHJvdmlkZWRCeToge1xuICAgICAgICByZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgICAgICBwcm92aWRlZFRhZ3NcbiAgICAgICAgICB9IG9mIGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgICAgICByZW1vdmVDYWNoZUtleUZyb21UYWdzKGRyYWZ0LCBxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgfSBvZiBwcm92aWRlZFRhZ3MpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlZFF1ZXJpZXMgPSAoZHJhZnQudGFnc1t0eXBlXSA/Pz0ge30pW2lkIHx8IFwiX19pbnRlcm5hbF93aXRob3V0X2lkXCJdID8/PSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVN1YnNjcmliZWQgPSBzdWJzY3JpYmVkUXVlcmllcy5pbmNsdWRlcyhxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZWRRdWVyaWVzLnB1c2gocXVlcnlDYWNoZUtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRyYWZ0LmtleXNbcXVlcnlDYWNoZUtleV0gPSBwcm92aWRlZFRhZ3M7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJlOiBwcmVwYXJlQXV0b0JhdGNoZWQoKVxuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmFSZWR1Y2VycyhidWlsZGVyKSB7XG4gICAgICBidWlsZGVyLmFkZENhc2UocXVlcnlTbGljZS5hY3Rpb25zLnJlbW92ZVF1ZXJ5UmVzdWx0LCAoZHJhZnQsIHtcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgfVxuICAgICAgfSkgPT4ge1xuICAgICAgICByZW1vdmVDYWNoZUtleUZyb21UYWdzKGRyYWZ0LCBxdWVyeUNhY2hlS2V5KTtcbiAgICAgIH0pLmFkZE1hdGNoZXIoaGFzUmVoeWRyYXRpb25JbmZvLCAoZHJhZnQsIGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcHJvdmlkZWRcbiAgICAgICAgfSA9IGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8oYWN0aW9uKTtcbiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgaW5jb21pbmdUYWdzXSBvZiBPYmplY3QuZW50cmllcyhwcm92aWRlZCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgY2FjaGVLZXlzXSBvZiBPYmplY3QuZW50cmllcyhpbmNvbWluZ1RhZ3MpKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpYmVkUXVlcmllcyA9IChkcmFmdC50YWdzW3R5cGVdID8/PSB7fSlbaWQgfHwgXCJfX2ludGVybmFsX3dpdGhvdXRfaWRcIl0gPz89IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeUNhY2hlS2V5IG9mIGNhY2hlS2V5cykge1xuICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5U3Vic2NyaWJlZCA9IHN1YnNjcmliZWRRdWVyaWVzLmluY2x1ZGVzKHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgICAgICAgICBpZiAoIWFscmVhZHlTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlZFF1ZXJpZXMucHVzaChxdWVyeUNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkuYWRkTWF0Y2hlcihpc0FueU9mKGlzRnVsZmlsbGVkKHF1ZXJ5VGh1bmspLCBpc1JlamVjdGVkV2l0aFZhbHVlKHF1ZXJ5VGh1bmspKSwgKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAgICAgICAgd3JpdGVQcm92aWRlZFRhZ3NGb3JRdWVyaWVzKGRyYWZ0LCBbYWN0aW9uXSk7XG4gICAgICB9KS5hZGRNYXRjaGVyKHF1ZXJ5U2xpY2UuYWN0aW9ucy5jYWNoZUVudHJpZXNVcHNlcnRlZC5tYXRjaCwgKGRyYWZ0LCBhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbW9ja0FjdGlvbnMgPSBhY3Rpb24ucGF5bG9hZC5tYXAoKHtcbiAgICAgICAgICBxdWVyeURlc2NyaXB0aW9uLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJVTktOT1dOXCIsXG4gICAgICAgICAgICBwYXlsb2FkOiB2YWx1ZSxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIixcbiAgICAgICAgICAgICAgcmVxdWVzdElkOiBcIlVOS05PV05cIixcbiAgICAgICAgICAgICAgYXJnOiBxdWVyeURlc2NyaXB0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdyaXRlUHJvdmlkZWRUYWdzRm9yUXVlcmllcyhkcmFmdCwgbW9ja0FjdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgZnVuY3Rpb24gcmVtb3ZlQ2FjaGVLZXlGcm9tVGFncyhkcmFmdCwgcXVlcnlDYWNoZUtleSkge1xuICAgIGNvbnN0IGV4aXN0aW5nVGFncyA9IGRyYWZ0LmtleXNbcXVlcnlDYWNoZUtleV0gPz8gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZXhpc3RpbmdUYWdzKSB7XG4gICAgICBjb25zdCB0YWdUeXBlID0gdGFnLnR5cGU7XG4gICAgICBjb25zdCB0YWdJZCA9IHRhZy5pZCA/PyBcIl9faW50ZXJuYWxfd2l0aG91dF9pZFwiO1xuICAgICAgY29uc3QgdGFnU3Vic2NyaXB0aW9ucyA9IGRyYWZ0LnRhZ3NbdGFnVHlwZV0/Llt0YWdJZF07XG4gICAgICBpZiAodGFnU3Vic2NyaXB0aW9ucykge1xuICAgICAgICBkcmFmdC50YWdzW3RhZ1R5cGVdW3RhZ0lkXSA9IHRhZ1N1YnNjcmlwdGlvbnMuZmlsdGVyKChxYykgPT4gcWMgIT09IHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUgZHJhZnQua2V5c1txdWVyeUNhY2hlS2V5XTtcbiAgfVxuICBmdW5jdGlvbiB3cml0ZVByb3ZpZGVkVGFnc0ZvclF1ZXJpZXMoZHJhZnQsIGFjdGlvbnMyKSB7XG4gICAgY29uc3QgcHJvdmlkZWRCeUVudHJpZXMgPSBhY3Rpb25zMi5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcHJvdmlkZWRUYWdzID0gY2FsY3VsYXRlUHJvdmlkZWRCeVRodW5rKGFjdGlvbiwgXCJwcm92aWRlc1RhZ3NcIiwgZGVmaW5pdGlvbnMsIGFzc2VydFRhZ1R5cGUpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBxdWVyeUNhY2hlS2V5XG4gICAgICB9ID0gYWN0aW9uLm1ldGEuYXJnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgcHJvdmlkZWRUYWdzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGludmFsaWRhdGlvblNsaWNlLmNhc2VSZWR1Y2Vycy51cGRhdGVQcm92aWRlZEJ5KGRyYWZ0LCBpbnZhbGlkYXRpb25TbGljZS5hY3Rpb25zLnVwZGF0ZVByb3ZpZGVkQnkocHJvdmlkZWRCeUVudHJpZXMpKTtcbiAgfVxuICBjb25zdCBzdWJzY3JpcHRpb25TbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vc3Vic2NyaXB0aW9uc2AsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICB1cGRhdGVTdWJzY3JpcHRpb25PcHRpb25zKGQsIGEpIHtcbiAgICAgIH0sXG4gICAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0KGQsIGEpIHtcbiAgICAgIH0sXG4gICAgICBpbnRlcm5hbF9nZXRSVEtRU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBpbnRlcm5hbFN1YnNjcmlwdGlvbnNTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vaW50ZXJuYWxTdWJzY3JpcHRpb25zYCxcbiAgICBpbml0aWFsU3RhdGUsXG4gICAgcmVkdWNlcnM6IHtcbiAgICAgIHN1YnNjcmlwdGlvbnNVcGRhdGVkOiB7XG4gICAgICAgIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICAgIHJldHVybiBhcHBseVBhdGNoZXMoc3RhdGUsIGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZTogcHJlcGFyZUF1dG9CYXRjaGVkKClcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBjb25maWdTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiBgJHtyZWR1Y2VyUGF0aH0vY29uZmlnYCxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgIG9ubGluZTogaXNPbmxpbmUoKSxcbiAgICAgIGZvY3VzZWQ6IGlzRG9jdW1lbnRWaXNpYmxlKCksXG4gICAgICBtaWRkbGV3YXJlUmVnaXN0ZXJlZDogZmFsc2UsXG4gICAgICAuLi5jb25maWdcbiAgICB9LFxuICAgIHJlZHVjZXJzOiB7XG4gICAgICBtaWRkbGV3YXJlUmVnaXN0ZXJlZChzdGF0ZSwge1xuICAgICAgICBwYXlsb2FkXG4gICAgICB9KSB7XG4gICAgICAgIHN0YXRlLm1pZGRsZXdhcmVSZWdpc3RlcmVkID0gc3RhdGUubWlkZGxld2FyZVJlZ2lzdGVyZWQgPT09IFwiY29uZmxpY3RcIiB8fCBhcGlVaWQgIT09IHBheWxvYWQgPyBcImNvbmZsaWN0XCIgOiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmFSZWR1Y2VyczogKGJ1aWxkZXIpID0+IHtcbiAgICAgIGJ1aWxkZXIuYWRkQ2FzZShvbk9ubGluZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgIHN0YXRlLm9ubGluZSA9IHRydWU7XG4gICAgICB9KS5hZGRDYXNlKG9uT2ZmbGluZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgIHN0YXRlLm9ubGluZSA9IGZhbHNlO1xuICAgICAgfSkuYWRkQ2FzZShvbkZvY3VzLCAoc3RhdGUpID0+IHtcbiAgICAgICAgc3RhdGUuZm9jdXNlZCA9IHRydWU7XG4gICAgICB9KS5hZGRDYXNlKG9uRm9jdXNMb3N0LCAoc3RhdGUpID0+IHtcbiAgICAgICAgc3RhdGUuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgfSkuYWRkTWF0Y2hlcihoYXNSZWh5ZHJhdGlvbkluZm8sIChkcmFmdCkgPT4gKHtcbiAgICAgICAgLi4uZHJhZnRcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBjb21iaW5lZFJlZHVjZXIgPSBjb21iaW5lUmVkdWNlcnMoe1xuICAgIHF1ZXJpZXM6IHF1ZXJ5U2xpY2UucmVkdWNlcixcbiAgICBtdXRhdGlvbnM6IG11dGF0aW9uU2xpY2UucmVkdWNlcixcbiAgICBwcm92aWRlZDogaW52YWxpZGF0aW9uU2xpY2UucmVkdWNlcixcbiAgICBzdWJzY3JpcHRpb25zOiBpbnRlcm5hbFN1YnNjcmlwdGlvbnNTbGljZS5yZWR1Y2VyLFxuICAgIGNvbmZpZzogY29uZmlnU2xpY2UucmVkdWNlclxuICB9KTtcbiAgY29uc3QgcmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiBjb21iaW5lZFJlZHVjZXIocmVzZXRBcGlTdGF0ZS5tYXRjaChhY3Rpb24pID8gdm9pZCAwIDogc3RhdGUsIGFjdGlvbik7XG4gIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnU2xpY2UuYWN0aW9ucyxcbiAgICAuLi5xdWVyeVNsaWNlLmFjdGlvbnMsXG4gICAgLi4uc3Vic2NyaXB0aW9uU2xpY2UuYWN0aW9ucyxcbiAgICAuLi5pbnRlcm5hbFN1YnNjcmlwdGlvbnNTbGljZS5hY3Rpb25zLFxuICAgIC4uLm11dGF0aW9uU2xpY2UuYWN0aW9ucyxcbiAgICAuLi5pbnZhbGlkYXRpb25TbGljZS5hY3Rpb25zLFxuICAgIHJlc2V0QXBpU3RhdGVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICByZWR1Y2VyLFxuICAgIGFjdGlvbnNcbiAgfTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRTZWxlY3RvcnMudHNcbnZhciBza2lwVG9rZW4gPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcIlJUS1Evc2tpcFRva2VuXCIpO1xudmFyIGluaXRpYWxTdWJTdGF0ZSA9IHtcbiAgc3RhdHVzOiBcInVuaW5pdGlhbGl6ZWRcIiAvKiB1bmluaXRpYWxpemVkICovXG59O1xudmFyIGRlZmF1bHRRdWVyeVN1YlN0YXRlID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZU5leHRTdGF0ZShpbml0aWFsU3ViU3RhdGUsICgpID0+IHtcbn0pO1xudmFyIGRlZmF1bHRNdXRhdGlvblN1YlN0YXRlID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZU5leHRTdGF0ZShpbml0aWFsU3ViU3RhdGUsICgpID0+IHtcbn0pO1xuZnVuY3Rpb24gYnVpbGRTZWxlY3RvcnMoe1xuICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gIHJlZHVjZXJQYXRoLFxuICBjcmVhdGVTZWxlY3RvcjogY3JlYXRlU2VsZWN0b3IyXG59KSB7XG4gIGNvbnN0IHNlbGVjdFNraXBwZWRRdWVyeSA9IChzdGF0ZSkgPT4gZGVmYXVsdFF1ZXJ5U3ViU3RhdGU7XG4gIGNvbnN0IHNlbGVjdFNraXBwZWRNdXRhdGlvbiA9IChzdGF0ZSkgPT4gZGVmYXVsdE11dGF0aW9uU3ViU3RhdGU7XG4gIHJldHVybiB7XG4gICAgYnVpbGRRdWVyeVNlbGVjdG9yLFxuICAgIGJ1aWxkSW5maW5pdGVRdWVyeVNlbGVjdG9yLFxuICAgIGJ1aWxkTXV0YXRpb25TZWxlY3RvcixcbiAgICBzZWxlY3RJbnZhbGlkYXRlZEJ5LFxuICAgIHNlbGVjdENhY2hlZEFyZ3NGb3JRdWVyeSxcbiAgICBzZWxlY3RBcGlTdGF0ZSxcbiAgICBzZWxlY3RRdWVyaWVzLFxuICAgIHNlbGVjdE11dGF0aW9ucyxcbiAgICBzZWxlY3RRdWVyeUVudHJ5LFxuICAgIHNlbGVjdENvbmZpZ1xuICB9O1xuICBmdW5jdGlvbiB3aXRoUmVxdWVzdEZsYWdzKHN1YnN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1YnN0YXRlLFxuICAgICAgLi4uZ2V0UmVxdWVzdFN0YXR1c0ZsYWdzKHN1YnN0YXRlLnN0YXR1cylcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdEFwaVN0YXRlKHJvb3RTdGF0ZSkge1xuICAgIGNvbnN0IHN0YXRlID0gcm9vdFN0YXRlW3JlZHVjZXJQYXRoXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIGlmIChzZWxlY3RBcGlTdGF0ZS50cmlnZ2VyZWQpIHJldHVybiBzdGF0ZTtcbiAgICAgICAgc2VsZWN0QXBpU3RhdGUudHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IE5vIGRhdGEgZm91bmQgYXQgXFxgc3RhdGUuJHtyZWR1Y2VyUGF0aH1cXGAuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgcmVkdWNlciB0byB0aGUgc3RvcmU/YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RRdWVyaWVzKHJvb3RTdGF0ZSkge1xuICAgIHJldHVybiBzZWxlY3RBcGlTdGF0ZShyb290U3RhdGUpPy5xdWVyaWVzO1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdFF1ZXJ5RW50cnkocm9vdFN0YXRlLCBjYWNoZUtleSkge1xuICAgIHJldHVybiBzZWxlY3RRdWVyaWVzKHJvb3RTdGF0ZSk/LltjYWNoZUtleV07XG4gIH1cbiAgZnVuY3Rpb24gc2VsZWN0TXV0YXRpb25zKHJvb3RTdGF0ZSkge1xuICAgIHJldHVybiBzZWxlY3RBcGlTdGF0ZShyb290U3RhdGUpPy5tdXRhdGlvbnM7XG4gIH1cbiAgZnVuY3Rpb24gc2VsZWN0Q29uZmlnKHJvb3RTdGF0ZSkge1xuICAgIHJldHVybiBzZWxlY3RBcGlTdGF0ZShyb290U3RhdGUpPy5jb25maWc7XG4gIH1cbiAgZnVuY3Rpb24gYnVpbGRBbnlRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uLCBjb21iaW5lcikge1xuICAgIHJldHVybiAocXVlcnlBcmdzKSA9PiB7XG4gICAgICBpZiAocXVlcnlBcmdzID09PSBza2lwVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTa2lwcGVkUXVlcnksIGNvbWJpbmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRBcmdzID0gc2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgcXVlcnlBcmdzLFxuICAgICAgICBlbmRwb2ludERlZmluaXRpb24sXG4gICAgICAgIGVuZHBvaW50TmFtZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzZWxlY3RRdWVyeVN1YnN0YXRlID0gKHN0YXRlKSA9PiBzZWxlY3RRdWVyeUVudHJ5KHN0YXRlLCBzZXJpYWxpemVkQXJncykgPz8gZGVmYXVsdFF1ZXJ5U3ViU3RhdGU7XG4gICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFF1ZXJ5U3Vic3RhdGUsIGNvbWJpbmVyKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnlTZWxlY3RvcihlbmRwb2ludE5hbWUsIGVuZHBvaW50RGVmaW5pdGlvbikge1xuICAgIHJldHVybiBidWlsZEFueVF1ZXJ5U2VsZWN0b3IoZW5kcG9pbnROYW1lLCBlbmRwb2ludERlZmluaXRpb24sIHdpdGhSZXF1ZXN0RmxhZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkSW5maW5pdGVRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5maW5pdGVRdWVyeU9wdGlvbnNcbiAgICB9ID0gZW5kcG9pbnREZWZpbml0aW9uO1xuICAgIGZ1bmN0aW9uIHdpdGhJbmZpbml0ZVF1ZXJ5UmVzdWx0RmxhZ3Moc3Vic3RhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRlV2l0aFJlcXVlc3RGbGFncyA9IHtcbiAgICAgICAgLi4uc3Vic3RhdGUsXG4gICAgICAgIC4uLmdldFJlcXVlc3RTdGF0dXNGbGFncyhzdWJzdGF0ZS5zdGF0dXMpXG4gICAgICB9O1xuICAgICAgY29uc3Qge1xuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIGlzRXJyb3IsXG4gICAgICAgIGRpcmVjdGlvblxuICAgICAgfSA9IHN0YXRlV2l0aFJlcXVlc3RGbGFncztcbiAgICAgIGNvbnN0IGlzRm9yd2FyZCA9IGRpcmVjdGlvbiA9PT0gXCJmb3J3YXJkXCI7XG4gICAgICBjb25zdCBpc0JhY2t3YXJkID0gZGlyZWN0aW9uID09PSBcImJhY2t3YXJkXCI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZVdpdGhSZXF1ZXN0RmxhZ3MsXG4gICAgICAgIGhhc05leHRQYWdlOiBnZXRIYXNOZXh0UGFnZShpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgc3RhdGVXaXRoUmVxdWVzdEZsYWdzLmRhdGEsIHN0YXRlV2l0aFJlcXVlc3RGbGFncy5vcmlnaW5hbEFyZ3MpLFxuICAgICAgICBoYXNQcmV2aW91c1BhZ2U6IGdldEhhc1ByZXZpb3VzUGFnZShpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgc3RhdGVXaXRoUmVxdWVzdEZsYWdzLmRhdGEsIHN0YXRlV2l0aFJlcXVlc3RGbGFncy5vcmlnaW5hbEFyZ3MpLFxuICAgICAgICBpc0ZldGNoaW5nTmV4dFBhZ2U6IGlzTG9hZGluZyAmJiBpc0ZvcndhcmQsXG4gICAgICAgIGlzRmV0Y2hpbmdQcmV2aW91c1BhZ2U6IGlzTG9hZGluZyAmJiBpc0JhY2t3YXJkLFxuICAgICAgICBpc0ZldGNoTmV4dFBhZ2VFcnJvcjogaXNFcnJvciAmJiBpc0ZvcndhcmQsXG4gICAgICAgIGlzRmV0Y2hQcmV2aW91c1BhZ2VFcnJvcjogaXNFcnJvciAmJiBpc0JhY2t3YXJkXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRBbnlRdWVyeVNlbGVjdG9yKGVuZHBvaW50TmFtZSwgZW5kcG9pbnREZWZpbml0aW9uLCB3aXRoSW5maW5pdGVRdWVyeVJlc3VsdEZsYWdzKTtcbiAgfVxuICBmdW5jdGlvbiBidWlsZE11dGF0aW9uU2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIChpZCkgPT4ge1xuICAgICAgbGV0IG11dGF0aW9uSWQ7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG11dGF0aW9uSWQgPSBnZXRNdXRhdGlvbkNhY2hlS2V5KGlkKSA/PyBza2lwVG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGlvbklkID0gaWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3RNdXRhdGlvblN1YnN0YXRlID0gKHN0YXRlKSA9PiBzZWxlY3RBcGlTdGF0ZShzdGF0ZSk/Lm11dGF0aW9ucz8uW211dGF0aW9uSWRdID8/IGRlZmF1bHRNdXRhdGlvblN1YlN0YXRlO1xuICAgICAgY29uc3QgZmluYWxTZWxlY3RNdXRhdGlvblN1YnN0YXRlID0gbXV0YXRpb25JZCA9PT0gc2tpcFRva2VuID8gc2VsZWN0U2tpcHBlZE11dGF0aW9uIDogc2VsZWN0TXV0YXRpb25TdWJzdGF0ZTtcbiAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RvcjIoZmluYWxTZWxlY3RNdXRhdGlvblN1YnN0YXRlLCB3aXRoUmVxdWVzdEZsYWdzKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdEludmFsaWRhdGVkQnkoc3RhdGUsIHRhZ3MpIHtcbiAgICBjb25zdCBhcGlTdGF0ZSA9IHN0YXRlW3JlZHVjZXJQYXRoXTtcbiAgICBjb25zdCB0b0ludmFsaWRhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MuZmlsdGVyKGlzTm90TnVsbGlzaCkubWFwKGV4cGFuZFRhZ0Rlc2NyaXB0aW9uKSkge1xuICAgICAgY29uc3QgcHJvdmlkZWQgPSBhcGlTdGF0ZS5wcm92aWRlZC50YWdzW3RhZy50eXBlXTtcbiAgICAgIGlmICghcHJvdmlkZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgaW52YWxpZGF0ZVN1YnNjcmlwdGlvbnMgPSAodGFnLmlkICE9PSB2b2lkIDAgPyAoXG4gICAgICAgIC8vIGlkIGdpdmVuOiBpbnZhbGlkYXRlIGFsbCBxdWVyaWVzIHRoYXQgcHJvdmlkZSB0aGlzIHR5cGUgJiBpZFxuICAgICAgICBwcm92aWRlZFt0YWcuaWRdXG4gICAgICApIDogKFxuICAgICAgICAvLyBubyBpZDogaW52YWxpZGF0ZSBhbGwgcXVlcmllcyB0aGF0IHByb3ZpZGUgdGhpcyB0eXBlXG4gICAgICAgIGZsYXR0ZW4oT2JqZWN0LnZhbHVlcyhwcm92aWRlZCkpXG4gICAgICApKSA/PyBbXTtcbiAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZSBvZiBpbnZhbGlkYXRlU3Vic2NyaXB0aW9ucykge1xuICAgICAgICB0b0ludmFsaWRhdGUuYWRkKGludmFsaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbihBcnJheS5mcm9tKHRvSW52YWxpZGF0ZS52YWx1ZXMoKSkubWFwKChxdWVyeUNhY2hlS2V5KSA9PiB7XG4gICAgICBjb25zdCBxdWVyeVN1YlN0YXRlID0gYXBpU3RhdGUucXVlcmllc1txdWVyeUNhY2hlS2V5XTtcbiAgICAgIHJldHVybiBxdWVyeVN1YlN0YXRlID8gW3tcbiAgICAgICAgcXVlcnlDYWNoZUtleSxcbiAgICAgICAgZW5kcG9pbnROYW1lOiBxdWVyeVN1YlN0YXRlLmVuZHBvaW50TmFtZSxcbiAgICAgICAgb3JpZ2luYWxBcmdzOiBxdWVyeVN1YlN0YXRlLm9yaWdpbmFsQXJnc1xuICAgICAgfV0gOiBbXTtcbiAgICB9KSk7XG4gIH1cbiAgZnVuY3Rpb24gc2VsZWN0Q2FjaGVkQXJnc0ZvclF1ZXJ5KHN0YXRlLCBxdWVyeU5hbWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhzZWxlY3RRdWVyaWVzKHN0YXRlKSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnk/LmVuZHBvaW50TmFtZSA9PT0gcXVlcnlOYW1lICYmIGVudHJ5LnN0YXR1cyAhPT0gXCJ1bmluaXRpYWxpemVkXCIgLyogdW5pbml0aWFsaXplZCAqLykubWFwKChlbnRyeSkgPT4gZW50cnkub3JpZ2luYWxBcmdzKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRIYXNOZXh0UGFnZShvcHRpb25zLCBkYXRhLCBxdWVyeUFyZykge1xuICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBnZXROZXh0UGFnZVBhcmFtKG9wdGlvbnMsIGRhdGEsIHF1ZXJ5QXJnKSAhPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGdldEhhc1ByZXZpb3VzUGFnZShvcHRpb25zLCBkYXRhLCBxdWVyeUFyZykge1xuICAgIGlmICghZGF0YSB8fCAhb3B0aW9ucy5nZXRQcmV2aW91c1BhZ2VQYXJhbSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBnZXRQcmV2aW91c1BhZ2VQYXJhbShvcHRpb25zLCBkYXRhLCBxdWVyeUFyZykgIT0gbnVsbDtcbiAgfVxufVxuXG4vLyBzcmMvcXVlcnkvY3JlYXRlQXBpLnRzXG5pbXBvcnQgeyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlIGFzIF9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlMiwgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSBhcyBfZm9ybWF0UHJvZEVycm9yTWVzc2FnZTIyLCBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlIGFzIF9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlMyB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XG5cbi8vIHNyYy9xdWVyeS9kZWZhdWx0U2VyaWFsaXplUXVlcnlBcmdzLnRzXG52YXIgY2FjaGUgPSBXZWFrTWFwID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCkgOiB2b2lkIDA7XG52YXIgZGVmYXVsdFNlcmlhbGl6ZVF1ZXJ5QXJncyA9ICh7XG4gIGVuZHBvaW50TmFtZSxcbiAgcXVlcnlBcmdzXG59KSA9PiB7XG4gIGxldCBzZXJpYWxpemVkID0gXCJcIjtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGU/LmdldChxdWVyeUFyZ3MpO1xuICBpZiAodHlwZW9mIGNhY2hlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHNlcmlhbGl6ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShxdWVyeUFyZ3MsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIiA/IHtcbiAgICAgICAgJGJpZ2ludDogdmFsdWUudG9TdHJpbmcoKVxuICAgICAgfSA6IHZhbHVlO1xuICAgICAgdmFsdWUgPSBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkucmVkdWNlKChhY2MsIGtleTIpID0+IHtcbiAgICAgICAgYWNjW2tleTJdID0gdmFsdWVba2V5Ml07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSkgOiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChxdWVyeUFyZ3MpKSB7XG4gICAgICBjYWNoZT8uc2V0KHF1ZXJ5QXJncywgc3RyaW5naWZpZWQpO1xuICAgIH1cbiAgICBzZXJpYWxpemVkID0gc3RyaW5naWZpZWQ7XG4gIH1cbiAgcmV0dXJuIGAke2VuZHBvaW50TmFtZX0oJHtzZXJpYWxpemVkfSlgO1xufTtcblxuLy8gc3JjL3F1ZXJ5L2NyZWF0ZUFwaS50c1xuaW1wb3J0IHsgd2Vha01hcE1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlQXBpKC4uLm1vZHVsZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJhc2VDcmVhdGVBcGkob3B0aW9ucykge1xuICAgIGNvbnN0IGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8gPSB3ZWFrTWFwTWVtb2l6ZSgoYWN0aW9uKSA9PiBvcHRpb25zLmV4dHJhY3RSZWh5ZHJhdGlvbkluZm8/LihhY3Rpb24sIHtcbiAgICAgIHJlZHVjZXJQYXRoOiBvcHRpb25zLnJlZHVjZXJQYXRoID8/IFwiYXBpXCJcbiAgICB9KSk7XG4gICAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IHtcbiAgICAgIHJlZHVjZXJQYXRoOiBcImFwaVwiLFxuICAgICAga2VlcFVudXNlZERhdGFGb3I6IDYwLFxuICAgICAgcmVmZXRjaE9uTW91bnRPckFyZ0NoYW5nZTogZmFsc2UsXG4gICAgICByZWZldGNoT25Gb2N1czogZmFsc2UsXG4gICAgICByZWZldGNoT25SZWNvbm5lY3Q6IGZhbHNlLFxuICAgICAgaW52YWxpZGF0aW9uQmVoYXZpb3I6IFwiZGVsYXllZFwiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGV4dHJhY3RSZWh5ZHJhdGlvbkluZm8sXG4gICAgICBzZXJpYWxpemVRdWVyeUFyZ3MocXVlcnlBcmdzQXBpKSB7XG4gICAgICAgIGxldCBmaW5hbFNlcmlhbGl6ZVF1ZXJ5QXJncyA9IGRlZmF1bHRTZXJpYWxpemVRdWVyeUFyZ3M7XG4gICAgICAgIGlmIChcInNlcmlhbGl6ZVF1ZXJ5QXJnc1wiIGluIHF1ZXJ5QXJnc0FwaS5lbmRwb2ludERlZmluaXRpb24pIHtcbiAgICAgICAgICBjb25zdCBlbmRwb2ludFNRQSA9IHF1ZXJ5QXJnc0FwaS5lbmRwb2ludERlZmluaXRpb24uc2VyaWFsaXplUXVlcnlBcmdzO1xuICAgICAgICAgIGZpbmFsU2VyaWFsaXplUXVlcnlBcmdzID0gKHF1ZXJ5QXJnc0FwaTIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxSZXN1bHQgPSBlbmRwb2ludFNRQShxdWVyeUFyZ3NBcGkyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICByZXR1cm4gaW5pdGlhbFJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U2VyaWFsaXplUXVlcnlBcmdzKHtcbiAgICAgICAgICAgICAgICAuLi5xdWVyeUFyZ3NBcGkyLFxuICAgICAgICAgICAgICAgIHF1ZXJ5QXJnczogaW5pdGlhbFJlc3VsdFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VyaWFsaXplUXVlcnlBcmdzKSB7XG4gICAgICAgICAgZmluYWxTZXJpYWxpemVRdWVyeUFyZ3MgPSBvcHRpb25zLnNlcmlhbGl6ZVF1ZXJ5QXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxTZXJpYWxpemVRdWVyeUFyZ3MocXVlcnlBcmdzQXBpKTtcbiAgICAgIH0sXG4gICAgICB0YWdUeXBlczogWy4uLm9wdGlvbnMudGFnVHlwZXMgfHwgW11dXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgZW5kcG9pbnREZWZpbml0aW9uczoge30sXG4gICAgICBiYXRjaChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfSxcbiAgICAgIGFwaVVpZDogbmFub2lkKCksXG4gICAgICBleHRyYWN0UmVoeWRyYXRpb25JbmZvLFxuICAgICAgaGFzUmVoeWRyYXRpb25JbmZvOiB3ZWFrTWFwTWVtb2l6ZSgoYWN0aW9uKSA9PiBleHRyYWN0UmVoeWRyYXRpb25JbmZvKGFjdGlvbikgIT0gbnVsbClcbiAgICB9O1xuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgIGluamVjdEVuZHBvaW50cyxcbiAgICAgIGVuaGFuY2VFbmRwb2ludHMoe1xuICAgICAgICBhZGRUYWdUeXBlcyxcbiAgICAgICAgZW5kcG9pbnRzXG4gICAgICB9KSB7XG4gICAgICAgIGlmIChhZGRUYWdUeXBlcykge1xuICAgICAgICAgIGZvciAoY29uc3QgZVQgb2YgYWRkVGFnVHlwZXMpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9uc1dpdGhEZWZhdWx0cy50YWdUeXBlcy5pbmNsdWRlcyhlVCkpIHtcbiAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLnRhZ1R5cGVzLnB1c2goZVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kcG9pbnRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZW5kcG9pbnROYW1lLCBwYXJ0aWFsRGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsRGVmaW5pdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIHBhcnRpYWxEZWZpbml0aW9uKGNvbnRleHQuZW5kcG9pbnREZWZpbml0aW9uc1tlbmRwb2ludE5hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udGV4dC5lbmRwb2ludERlZmluaXRpb25zW2VuZHBvaW50TmFtZV0gfHwge30sIHBhcnRpYWxEZWZpbml0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluaXRpYWxpemVkTW9kdWxlcyA9IG1vZHVsZXMubWFwKChtKSA9PiBtLmluaXQoYXBpLCBvcHRpb25zV2l0aERlZmF1bHRzLCBjb250ZXh0KSk7XG4gICAgZnVuY3Rpb24gaW5qZWN0RW5kcG9pbnRzKGluamVjdCkge1xuICAgICAgY29uc3QgZXZhbHVhdGVkRW5kcG9pbnRzID0gaW5qZWN0LmVuZHBvaW50cyh7XG4gICAgICAgIHF1ZXJ5OiAoeCkgPT4gKHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIHR5cGU6IFwicXVlcnlcIiAvKiBxdWVyeSAqL1xuICAgICAgICB9KSxcbiAgICAgICAgbXV0YXRpb246ICh4KSA9PiAoe1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgdHlwZTogXCJtdXRhdGlvblwiIC8qIG11dGF0aW9uICovXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZpbml0ZVF1ZXJ5OiAoeCkgPT4gKHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIHR5cGU6IFwiaW5maW5pdGVxdWVyeVwiIC8qIGluZmluaXRlcXVlcnkgKi9cbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBbZW5kcG9pbnROYW1lLCBkZWZpbml0aW9uXSBvZiBPYmplY3QuZW50cmllcyhldmFsdWF0ZWRFbmRwb2ludHMpKSB7XG4gICAgICAgIGlmIChpbmplY3Qub3ZlcnJpZGVFeGlzdGluZyAhPT0gdHJ1ZSAmJiBlbmRwb2ludE5hbWUgaW4gY29udGV4dC5lbmRwb2ludERlZmluaXRpb25zKSB7XG4gICAgICAgICAgaWYgKGluamVjdC5vdmVycmlkZUV4aXN0aW5nID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBfZm9ybWF0UHJvZEVycm9yTWVzc2FnZTIoMzkpIDogYGNhbGxlZCBcXGBpbmplY3RFbmRwb2ludHNcXGAgdG8gb3ZlcnJpZGUgYWxyZWFkeS1leGlzdGluZyBlbmRwb2ludE5hbWUgJHtlbmRwb2ludE5hbWV9IHdpdGhvdXQgc3BlY2lmeWluZyBcXGBvdmVycmlkZUV4aXN0aW5nOiB0cnVlXFxgYCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBjYWxsZWQgXFxgaW5qZWN0RW5kcG9pbnRzXFxgIHRvIG92ZXJyaWRlIGFscmVhZHktZXhpc3RpbmcgZW5kcG9pbnROYW1lICR7ZW5kcG9pbnROYW1lfSB3aXRob3V0IHNwZWNpZnlpbmcgXFxgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZVxcYGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICAgIGlmIChpc0luZmluaXRlUXVlcnlEZWZpbml0aW9uKGRlZmluaXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGluZmluaXRlUXVlcnlPcHRpb25zXG4gICAgICAgICAgICB9ID0gZGVmaW5pdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbWF4UGFnZXMsXG4gICAgICAgICAgICAgIGdldFByZXZpb3VzUGFnZVBhcmFtOiBnZXRQcmV2aW91c1BhZ2VQYXJhbTJcbiAgICAgICAgICAgIH0gPSBpbmZpbml0ZVF1ZXJ5T3B0aW9ucztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWF4UGFnZXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG1heFBhZ2VzIDwgMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBfZm9ybWF0UHJvZEVycm9yTWVzc2FnZTIyKDQwKSA6IGBtYXhQYWdlcyBmb3IgZW5kcG9pbnQgJyR7ZW5kcG9pbnROYW1lfScgbXVzdCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMGApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZ2V0UHJldmlvdXNQYWdlUGFyYW0yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gX2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UzKDQxKSA6IGBnZXRQcmV2aW91c1BhZ2VQYXJhbSBmb3IgZW5kcG9pbnQgJyR7ZW5kcG9pbnROYW1lfScgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIG1heFBhZ2VzIGlzIHVzZWRgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVuZHBvaW50RGVmaW5pdGlvbnNbZW5kcG9pbnROYW1lXSA9IGRlZmluaXRpb247XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBpbml0aWFsaXplZE1vZHVsZXMpIHtcbiAgICAgICAgICBtLmluamVjdEVuZHBvaW50KGVuZHBvaW50TmFtZSwgZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfVxuICAgIHJldHVybiBhcGkuaW5qZWN0RW5kcG9pbnRzKHtcbiAgICAgIGVuZHBvaW50czogb3B0aW9ucy5lbmRwb2ludHNcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2Zha2VCYXNlUXVlcnkudHNcbmltcG9ydCB7IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UgYXMgX2Zvcm1hdFByb2RFcnJvck1lc3NhZ2U0IH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcbnZhciBfTkVWRVIgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7XG5mdW5jdGlvbiBmYWtlQmFzZVF1ZXJ5KCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IF9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlNCgzMykgOiBcIldoZW4gdXNpbmcgYGZha2VCYXNlUXVlcnlgLCBhbGwgcXVlcmllcyAmIG11dGF0aW9ucyBtdXN0IHVzZSB0aGUgYHF1ZXJ5Rm5gIGRlZmluaXRpb24gc3ludGF4LlwiKTtcbiAgfTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvbW9kdWxlLnRzXG5pbXBvcnQgeyBlbmFibGVQYXRjaGVzIH0gZnJvbSBcImltbWVyXCI7XG5cbi8vIHNyYy9xdWVyeS90c0hlbHBlcnMudHNcbmZ1bmN0aW9uIGFzc2VydENhc3Qodikge1xufVxuZnVuY3Rpb24gc2FmZUFzc2lnbih0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCAuLi5hcmdzKTtcbn1cblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRNaWRkbGV3YXJlL2JhdGNoQWN0aW9ucy50c1xuaW1wb3J0IHsgcHJvZHVjZVdpdGhQYXRjaGVzIGFzIHByb2R1Y2VXaXRoUGF0Y2hlczIgfSBmcm9tIFwiaW1tZXJcIjtcbnZhciBidWlsZEJhdGNoZWRBY3Rpb25zSGFuZGxlciA9ICh7XG4gIGFwaSxcbiAgcXVlcnlUaHVuayxcbiAgaW50ZXJuYWxTdGF0ZVxufSkgPT4ge1xuICBjb25zdCBzdWJzY3JpcHRpb25zUHJlZml4ID0gYCR7YXBpLnJlZHVjZXJQYXRofS9zdWJzY3JpcHRpb25zYDtcbiAgbGV0IHByZXZpb3VzU3Vic2NyaXB0aW9ucyA9IG51bGw7XG4gIGxldCB1cGRhdGVTeW5jVGltZXIgPSBudWxsO1xuICBjb25zdCB7XG4gICAgdXBkYXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0XG4gIH0gPSBhcGkuaW50ZXJuYWxBY3Rpb25zO1xuICBjb25zdCBhY3R1YWxseU11dGF0ZVN1YnNjcmlwdGlvbnMgPSAobXV0YWJsZVN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBpZiAodXBkYXRlU3Vic2NyaXB0aW9uT3B0aW9ucy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXksXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgaWYgKG11dGFibGVTdGF0ZT8uW3F1ZXJ5Q2FjaGVLZXldPy5bcmVxdWVzdElkXSkge1xuICAgICAgICBtdXRhYmxlU3RhdGVbcXVlcnlDYWNoZUtleV1bcmVxdWVzdElkXSA9IG9wdGlvbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHVuc3Vic2NyaWJlUXVlcnlSZXN1bHQubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBxdWVyeUNhY2hlS2V5LFxuICAgICAgICByZXF1ZXN0SWRcbiAgICAgIH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgIGlmIChtdXRhYmxlU3RhdGVbcXVlcnlDYWNoZUtleV0pIHtcbiAgICAgICAgZGVsZXRlIG11dGFibGVTdGF0ZVtxdWVyeUNhY2hlS2V5XVtyZXF1ZXN0SWRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChhcGkuaW50ZXJuYWxBY3Rpb25zLnJlbW92ZVF1ZXJ5UmVzdWx0Lm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGRlbGV0ZSBtdXRhYmxlU3RhdGVbYWN0aW9uLnBheWxvYWQucXVlcnlDYWNoZUtleV07XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5VGh1bmsucGVuZGluZy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgIH1cbiAgICAgIH0gPSBhY3Rpb247XG4gICAgICBjb25zdCBzdWJzdGF0ZSA9IG11dGFibGVTdGF0ZVthcmcucXVlcnlDYWNoZUtleV0gPz89IHt9O1xuICAgICAgc3Vic3RhdGVbYCR7cmVxdWVzdElkfV9ydW5uaW5nYF0gPSB7fTtcbiAgICAgIGlmIChhcmcuc3Vic2NyaWJlKSB7XG4gICAgICAgIHN1YnN0YXRlW3JlcXVlc3RJZF0gPSBhcmcuc3Vic2NyaXB0aW9uT3B0aW9ucyA/PyBzdWJzdGF0ZVtyZXF1ZXN0SWRdID8/IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBtdXRhdGVkID0gZmFsc2U7XG4gICAgaWYgKHF1ZXJ5VGh1bmsuZnVsZmlsbGVkLm1hdGNoKGFjdGlvbikgfHwgcXVlcnlUaHVuay5yZWplY3RlZC5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IG11dGFibGVTdGF0ZVthY3Rpb24ubWV0YS5hcmcucXVlcnlDYWNoZUtleV0gfHwge307XG4gICAgICBjb25zdCBrZXkgPSBgJHthY3Rpb24ubWV0YS5yZXF1ZXN0SWR9X3J1bm5pbmdgO1xuICAgICAgbXV0YXRlZCB8fD0gISFzdGF0ZVtrZXldO1xuICAgICAgZGVsZXRlIHN0YXRlW2tleV07XG4gICAgfVxuICAgIGlmIChxdWVyeVRodW5rLnJlamVjdGVkLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgIH1cbiAgICAgIH0gPSBhY3Rpb247XG4gICAgICBpZiAoY29uZGl0aW9uICYmIGFyZy5zdWJzY3JpYmUpIHtcbiAgICAgICAgY29uc3Qgc3Vic3RhdGUgPSBtdXRhYmxlU3RhdGVbYXJnLnF1ZXJ5Q2FjaGVLZXldID8/PSB7fTtcbiAgICAgICAgc3Vic3RhdGVbcmVxdWVzdElkXSA9IGFyZy5zdWJzY3JpcHRpb25PcHRpb25zID8/IHN1YnN0YXRlW3JlcXVlc3RJZF0gPz8ge307XG4gICAgICAgIG11dGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbXV0YXRlZDtcbiAgfTtcbiAgY29uc3QgZ2V0U3Vic2NyaXB0aW9ucyA9ICgpID0+IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnM7XG4gIGNvbnN0IGdldFN1YnNjcmlwdGlvbkNvdW50ID0gKHF1ZXJ5Q2FjaGVLZXkpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gZ2V0U3Vic2NyaXB0aW9ucygpO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnNGb3JRdWVyeUFyZyA9IHN1YnNjcmlwdGlvbnNbcXVlcnlDYWNoZUtleV0gPz8ge307XG4gICAgcmV0dXJuIGNvdW50T2JqZWN0S2V5cyhzdWJzY3JpcHRpb25zRm9yUXVlcnlBcmcpO1xuICB9O1xuICBjb25zdCBpc1JlcXVlc3RTdWJzY3JpYmVkID0gKHF1ZXJ5Q2FjaGVLZXksIHJlcXVlc3RJZCkgPT4ge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBnZXRTdWJzY3JpcHRpb25zKCk7XG4gICAgcmV0dXJuICEhc3Vic2NyaXB0aW9ucz8uW3F1ZXJ5Q2FjaGVLZXldPy5bcmVxdWVzdElkXTtcbiAgfTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uU2VsZWN0b3JzID0ge1xuICAgIGdldFN1YnNjcmlwdGlvbnMsXG4gICAgZ2V0U3Vic2NyaXB0aW9uQ291bnQsXG4gICAgaXNSZXF1ZXN0U3Vic2NyaWJlZFxuICB9O1xuICByZXR1cm4gKGFjdGlvbiwgbXdBcGkpID0+IHtcbiAgICBpZiAoIXByZXZpb3VzU3Vic2NyaXB0aW9ucykge1xuICAgICAgcHJldmlvdXNTdWJzY3JpcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChhcGkudXRpbC5yZXNldEFwaVN0YXRlLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHByZXZpb3VzU3Vic2NyaXB0aW9ucyA9IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnMgPSB7fTtcbiAgICAgIHVwZGF0ZVN5bmNUaW1lciA9IG51bGw7XG4gICAgICByZXR1cm4gW3RydWUsIGZhbHNlXTtcbiAgICB9XG4gICAgaWYgKGFwaS5pbnRlcm5hbEFjdGlvbnMuaW50ZXJuYWxfZ2V0UlRLUVN1YnNjcmlwdGlvbnMubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgc3Vic2NyaXB0aW9uU2VsZWN0b3JzXTtcbiAgICB9XG4gICAgY29uc3QgZGlkTXV0YXRlID0gYWN0dWFsbHlNdXRhdGVTdWJzY3JpcHRpb25zKGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnMsIGFjdGlvbik7XG4gICAgbGV0IGFjdGlvblNob3VsZENvbnRpbnVlID0gdHJ1ZTtcbiAgICBpZiAoZGlkTXV0YXRlKSB7XG4gICAgICBpZiAoIXVwZGF0ZVN5bmNUaW1lcikge1xuICAgICAgICB1cGRhdGVTeW5jVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTdWJzY3JpcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zKSk7XG4gICAgICAgICAgY29uc3QgWywgcGF0Y2hlc10gPSBwcm9kdWNlV2l0aFBhdGNoZXMyKHByZXZpb3VzU3Vic2NyaXB0aW9ucywgKCkgPT4gbmV3U3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgbXdBcGkubmV4dChhcGkuaW50ZXJuYWxBY3Rpb25zLnN1YnNjcmlwdGlvbnNVcGRhdGVkKHBhdGNoZXMpKTtcbiAgICAgICAgICBwcmV2aW91c1N1YnNjcmlwdGlvbnMgPSBuZXdTdWJzY3JpcHRpb25zO1xuICAgICAgICAgIHVwZGF0ZVN5bmNUaW1lciA9IG51bGw7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1N1YnNjcmlwdGlvblNsaWNlQWN0aW9uID0gdHlwZW9mIGFjdGlvbi50eXBlID09IFwic3RyaW5nXCIgJiYgISFhY3Rpb24udHlwZS5zdGFydHNXaXRoKHN1YnNjcmlwdGlvbnNQcmVmaXgpO1xuICAgICAgY29uc3QgaXNBZGRpdGlvbmFsU3Vic2NyaXB0aW9uQWN0aW9uID0gcXVlcnlUaHVuay5yZWplY3RlZC5tYXRjaChhY3Rpb24pICYmIGFjdGlvbi5tZXRhLmNvbmRpdGlvbiAmJiAhIWFjdGlvbi5tZXRhLmFyZy5zdWJzY3JpYmU7XG4gICAgICBhY3Rpb25TaG91bGRDb250aW51ZSA9ICFpc1N1YnNjcmlwdGlvblNsaWNlQWN0aW9uICYmICFpc0FkZGl0aW9uYWxTdWJzY3JpcHRpb25BY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBbYWN0aW9uU2hvdWxkQ29udGludWUsIGZhbHNlXTtcbiAgfTtcbn07XG5cbi8vIHNyYy9xdWVyeS9jb3JlL2J1aWxkTWlkZGxld2FyZS9jYWNoZUNvbGxlY3Rpb24udHNcbmZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG52YXIgVEhJUlRZX1RXT19CSVRfTUFYX1RJTUVSX1NFQ09ORFMgPSAyMTQ3NDgzNjQ3IC8gMWUzIC0gMTtcbnZhciBidWlsZENhY2hlQ29sbGVjdGlvbkhhbmRsZXIgPSAoe1xuICByZWR1Y2VyUGF0aCxcbiAgYXBpLFxuICBxdWVyeVRodW5rLFxuICBjb250ZXh0LFxuICBpbnRlcm5hbFN0YXRlLFxuICBzZWxlY3RvcnM6IHtcbiAgICBzZWxlY3RRdWVyeUVudHJ5LFxuICAgIHNlbGVjdENvbmZpZ1xuICB9XG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVRdWVyeVJlc3VsdCxcbiAgICB1bnN1YnNjcmliZVF1ZXJ5UmVzdWx0LFxuICAgIGNhY2hlRW50cmllc1Vwc2VydGVkXG4gIH0gPSBhcGkuaW50ZXJuYWxBY3Rpb25zO1xuICBjb25zdCBjYW5UcmlnZ2VyVW5zdWJzY3JpYmUgPSBpc0FueU9mKHVuc3Vic2NyaWJlUXVlcnlSZXN1bHQubWF0Y2gsIHF1ZXJ5VGh1bmsuZnVsZmlsbGVkLCBxdWVyeVRodW5rLnJlamVjdGVkLCBjYWNoZUVudHJpZXNVcHNlcnRlZC5tYXRjaCk7XG4gIGZ1bmN0aW9uIGFueVN1YnNjcmlwdGlvbnNSZW1haW5pbmdGb3JLZXkocXVlcnlDYWNoZUtleSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zW3F1ZXJ5Q2FjaGVLZXldO1xuICAgIHJldHVybiAhIXN1YnNjcmlwdGlvbnMgJiYgIWlzT2JqZWN0RW1wdHkoc3Vic2NyaXB0aW9ucyk7XG4gIH1cbiAgY29uc3QgY3VycmVudFJlbW92YWxUaW1lb3V0cyA9IHt9O1xuICBjb25zdCBoYW5kbGVyID0gKGFjdGlvbiwgbXdBcGksIGludGVybmFsU3RhdGUyKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBtd0FwaS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNlbGVjdENvbmZpZyhzdGF0ZSk7XG4gICAgaWYgKGNhblRyaWdnZXJVbnN1YnNjcmliZShhY3Rpb24pKSB7XG4gICAgICBsZXQgcXVlcnlDYWNoZUtleXM7XG4gICAgICBpZiAoY2FjaGVFbnRyaWVzVXBzZXJ0ZWQubWF0Y2goYWN0aW9uKSkge1xuICAgICAgICBxdWVyeUNhY2hlS2V5cyA9IGFjdGlvbi5wYXlsb2FkLm1hcCgoZW50cnkpID0+IGVudHJ5LnF1ZXJ5RGVzY3JpcHRpb24ucXVlcnlDYWNoZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgICB9ID0gdW5zdWJzY3JpYmVRdWVyeVJlc3VsdC5tYXRjaChhY3Rpb24pID8gYWN0aW9uLnBheWxvYWQgOiBhY3Rpb24ubWV0YS5hcmc7XG4gICAgICAgIHF1ZXJ5Q2FjaGVLZXlzID0gW3F1ZXJ5Q2FjaGVLZXldO1xuICAgICAgfVxuICAgICAgaGFuZGxlVW5zdWJzY3JpYmVNYW55KHF1ZXJ5Q2FjaGVLZXlzLCBtd0FwaSwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB0aW1lb3V0XSBvZiBPYmplY3QuZW50cmllcyhjdXJyZW50UmVtb3ZhbFRpbWVvdXRzKSkge1xuICAgICAgICBpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBkZWxldGUgY3VycmVudFJlbW92YWxUaW1lb3V0c1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udGV4dC5oYXNSZWh5ZHJhdGlvbkluZm8oYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBxdWVyaWVzXG4gICAgICB9ID0gY29udGV4dC5leHRyYWN0UmVoeWRyYXRpb25JbmZvKGFjdGlvbik7XG4gICAgICBoYW5kbGVVbnN1YnNjcmliZU1hbnkoT2JqZWN0LmtleXMocXVlcmllcyksIG13QXBpLCBjb25maWcpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gaGFuZGxlVW5zdWJzY3JpYmVNYW55KGNhY2hlS2V5cywgYXBpMiwgY29uZmlnKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBhcGkyLmdldFN0YXRlKCk7XG4gICAgZm9yIChjb25zdCBxdWVyeUNhY2hlS2V5IG9mIGNhY2hlS2V5cykge1xuICAgICAgY29uc3QgZW50cnkgPSBzZWxlY3RRdWVyeUVudHJ5KHN0YXRlLCBxdWVyeUNhY2hlS2V5KTtcbiAgICAgIGhhbmRsZVVuc3Vic2NyaWJlKHF1ZXJ5Q2FjaGVLZXksIGVudHJ5Py5lbmRwb2ludE5hbWUsIGFwaTIsIGNvbmZpZyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVVuc3Vic2NyaWJlKHF1ZXJ5Q2FjaGVLZXksIGVuZHBvaW50TmFtZSwgYXBpMiwgY29uZmlnKSB7XG4gICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gY29udGV4dC5lbmRwb2ludERlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG4gICAgY29uc3Qga2VlcFVudXNlZERhdGFGb3IgPSBlbmRwb2ludERlZmluaXRpb24/LmtlZXBVbnVzZWREYXRhRm9yID8/IGNvbmZpZy5rZWVwVW51c2VkRGF0YUZvcjtcbiAgICBpZiAoa2VlcFVudXNlZERhdGFGb3IgPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbmFsS2VlcFVudXNlZERhdGFGb3IgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihrZWVwVW51c2VkRGF0YUZvciwgVEhJUlRZX1RXT19CSVRfTUFYX1RJTUVSX1NFQ09ORFMpKTtcbiAgICBpZiAoIWFueVN1YnNjcmlwdGlvbnNSZW1haW5pbmdGb3JLZXkocXVlcnlDYWNoZUtleSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lb3V0ID0gY3VycmVudFJlbW92YWxUaW1lb3V0c1txdWVyeUNhY2hlS2V5XTtcbiAgICAgIGlmIChjdXJyZW50VGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgY3VycmVudFJlbW92YWxUaW1lb3V0c1txdWVyeUNhY2hlS2V5XSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIWFueVN1YnNjcmlwdGlvbnNSZW1haW5pbmdGb3JLZXkocXVlcnlDYWNoZUtleSkpIHtcbiAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlbW92ZVF1ZXJ5UmVzdWx0KHtcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGN1cnJlbnRSZW1vdmFsVGltZW91dHNbcXVlcnlDYWNoZUtleV07XG4gICAgICB9LCBmaW5hbEtlZXBVbnVzZWREYXRhRm9yICogMWUzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xuXG4vLyBzcmMvcXVlcnkvY29yZS9idWlsZE1pZGRsZXdhcmUvY2FjaGVMaWZlY3ljbGUudHNcbnZhciBuZXZlclJlc29sdmVkRXJyb3IgPSBuZXcgRXJyb3IoXCJQcm9taXNlIG5ldmVyIHJlc29sdmVkIGJlZm9yZSBjYWNoZUVudHJ5UmVtb3ZlZC5cIik7XG52YXIgYnVpbGRDYWNoZUxpZmVjeWNsZUhhbmRsZXIgPSAoe1xuICBhcGksXG4gIHJlZHVjZXJQYXRoLFxuICBjb250ZXh0LFxuICBxdWVyeVRodW5rLFxuICBtdXRhdGlvblRodW5rLFxuICBpbnRlcm5hbFN0YXRlLFxuICBzZWxlY3RvcnM6IHtcbiAgICBzZWxlY3RRdWVyeUVudHJ5LFxuICAgIHNlbGVjdEFwaVN0YXRlXG4gIH1cbn0pID0+IHtcbiAgY29uc3QgaXNRdWVyeVRodW5rID0gaXNBc3luY1RodW5rQWN0aW9uKHF1ZXJ5VGh1bmspO1xuICBjb25zdCBpc011dGF0aW9uVGh1bmsgPSBpc0FzeW5jVGh1bmtBY3Rpb24obXV0YXRpb25UaHVuayk7XG4gIGNvbnN0IGlzRnVsZmlsbGVkVGh1bmsgPSBpc0Z1bGZpbGxlZChxdWVyeVRodW5rLCBtdXRhdGlvblRodW5rKTtcbiAgY29uc3QgbGlmZWN5Y2xlTWFwID0ge307XG4gIGZ1bmN0aW9uIHJlc29sdmVMaWZlY3ljbGVFbnRyeShjYWNoZUtleSwgZGF0YSwgbWV0YSkge1xuICAgIGNvbnN0IGxpZmVjeWNsZSA9IGxpZmVjeWNsZU1hcFtjYWNoZUtleV07XG4gICAgaWYgKGxpZmVjeWNsZT8udmFsdWVSZXNvbHZlZCkge1xuICAgICAgbGlmZWN5Y2xlLnZhbHVlUmVzb2x2ZWQoe1xuICAgICAgICBkYXRhLFxuICAgICAgICBtZXRhXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBsaWZlY3ljbGUudmFsdWVSZXNvbHZlZDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlTGlmZWN5Y2xlRW50cnkoY2FjaGVLZXkpIHtcbiAgICBjb25zdCBsaWZlY3ljbGUgPSBsaWZlY3ljbGVNYXBbY2FjaGVLZXldO1xuICAgIGlmIChsaWZlY3ljbGUpIHtcbiAgICAgIGRlbGV0ZSBsaWZlY3ljbGVNYXBbY2FjaGVLZXldO1xuICAgICAgbGlmZWN5Y2xlLmNhY2hlRW50cnlSZW1vdmVkKCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGhhbmRsZXIgPSAoYWN0aW9uLCBtd0FwaSwgc3RhdGVCZWZvcmUpID0+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGdldENhY2hlS2V5KGFjdGlvbik7XG4gICAgZnVuY3Rpb24gY2hlY2tGb3JOZXdDYWNoZUtleShlbmRwb2ludE5hbWUsIGNhY2hlS2V5MiwgcmVxdWVzdElkLCBvcmlnaW5hbEFyZ3MpIHtcbiAgICAgIGNvbnN0IG9sZEVudHJ5ID0gc2VsZWN0UXVlcnlFbnRyeShzdGF0ZUJlZm9yZSwgY2FjaGVLZXkyKTtcbiAgICAgIGNvbnN0IG5ld0VudHJ5ID0gc2VsZWN0UXVlcnlFbnRyeShtd0FwaS5nZXRTdGF0ZSgpLCBjYWNoZUtleTIpO1xuICAgICAgaWYgKCFvbGRFbnRyeSAmJiBuZXdFbnRyeSkge1xuICAgICAgICBoYW5kbGVOZXdLZXkoZW5kcG9pbnROYW1lLCBvcmlnaW5hbEFyZ3MsIGNhY2hlS2V5MiwgbXdBcGksIHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxdWVyeVRodW5rLnBlbmRpbmcubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY2hlY2tGb3JOZXdDYWNoZUtleShhY3Rpb24ubWV0YS5hcmcuZW5kcG9pbnROYW1lLCBjYWNoZUtleSwgYWN0aW9uLm1ldGEucmVxdWVzdElkLCBhY3Rpb24ubWV0YS5hcmcub3JpZ2luYWxBcmdzKTtcbiAgICB9IGVsc2UgaWYgKGFwaS5pbnRlcm5hbEFjdGlvbnMuY2FjaGVFbnRyaWVzVXBzZXJ0ZWQubWF0Y2goYWN0aW9uKSkge1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHF1ZXJ5RGVzY3JpcHRpb24sXG4gICAgICAgIHZhbHVlXG4gICAgICB9IG9mIGFjdGlvbi5wYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgb3JpZ2luYWxBcmdzLFxuICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgfSA9IHF1ZXJ5RGVzY3JpcHRpb247XG4gICAgICAgIGNoZWNrRm9yTmV3Q2FjaGVLZXkoZW5kcG9pbnROYW1lLCBxdWVyeUNhY2hlS2V5LCBhY3Rpb24ubWV0YS5yZXF1ZXN0SWQsIG9yaWdpbmFsQXJncyk7XG4gICAgICAgIHJlc29sdmVMaWZlY3ljbGVFbnRyeShxdWVyeUNhY2hlS2V5LCB2YWx1ZSwge30pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobXV0YXRpb25UaHVuay5wZW5kaW5nLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gbXdBcGkuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF0ubXV0YXRpb25zW2NhY2hlS2V5XTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBoYW5kbGVOZXdLZXkoYWN0aW9uLm1ldGEuYXJnLmVuZHBvaW50TmFtZSwgYWN0aW9uLm1ldGEuYXJnLm9yaWdpbmFsQXJncywgY2FjaGVLZXksIG13QXBpLCBhY3Rpb24ubWV0YS5yZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGdWxmaWxsZWRUaHVuayhhY3Rpb24pKSB7XG4gICAgICByZXNvbHZlTGlmZWN5Y2xlRW50cnkoY2FjaGVLZXksIGFjdGlvbi5wYXlsb2FkLCBhY3Rpb24ubWV0YS5iYXNlUXVlcnlNZXRhKTtcbiAgICB9IGVsc2UgaWYgKGFwaS5pbnRlcm5hbEFjdGlvbnMucmVtb3ZlUXVlcnlSZXN1bHQubWF0Y2goYWN0aW9uKSB8fCBhcGkuaW50ZXJuYWxBY3Rpb25zLnJlbW92ZU11dGF0aW9uUmVzdWx0Lm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJlbW92ZUxpZmVjeWNsZUVudHJ5KGNhY2hlS2V5KTtcbiAgICB9IGVsc2UgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgZm9yIChjb25zdCBjYWNoZUtleTIgb2YgT2JqZWN0LmtleXMobGlmZWN5Y2xlTWFwKSkge1xuICAgICAgICByZW1vdmVMaWZlY3ljbGVFbnRyeShjYWNoZUtleTIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZ2V0Q2FjaGVLZXkoYWN0aW9uKSB7XG4gICAgaWYgKGlzUXVlcnlUaHVuayhhY3Rpb24pKSByZXR1cm4gYWN0aW9uLm1ldGEuYXJnLnF1ZXJ5Q2FjaGVLZXk7XG4gICAgaWYgKGlzTXV0YXRpb25UaHVuayhhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gYWN0aW9uLm1ldGEuYXJnLmZpeGVkQ2FjaGVLZXkgPz8gYWN0aW9uLm1ldGEucmVxdWVzdElkO1xuICAgIH1cbiAgICBpZiAoYXBpLmludGVybmFsQWN0aW9ucy5yZW1vdmVRdWVyeVJlc3VsdC5tYXRjaChhY3Rpb24pKSByZXR1cm4gYWN0aW9uLnBheWxvYWQucXVlcnlDYWNoZUtleTtcbiAgICBpZiAoYXBpLmludGVybmFsQWN0aW9ucy5yZW1vdmVNdXRhdGlvblJlc3VsdC5tYXRjaChhY3Rpb24pKSByZXR1cm4gZ2V0TXV0YXRpb25DYWNoZUtleShhY3Rpb24ucGF5bG9hZCk7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTmV3S2V5KGVuZHBvaW50TmFtZSwgb3JpZ2luYWxBcmdzLCBxdWVyeUNhY2hlS2V5LCBtd0FwaSwgcmVxdWVzdElkKSB7XG4gICAgY29uc3QgZW5kcG9pbnREZWZpbml0aW9uID0gY29udGV4dC5lbmRwb2ludERlZmluaXRpb25zW2VuZHBvaW50TmFtZV07XG4gICAgY29uc3Qgb25DYWNoZUVudHJ5QWRkZWQgPSBlbmRwb2ludERlZmluaXRpb24/Lm9uQ2FjaGVFbnRyeUFkZGVkO1xuICAgIGlmICghb25DYWNoZUVudHJ5QWRkZWQpIHJldHVybjtcbiAgICBjb25zdCBsaWZlY3ljbGUgPSB7fTtcbiAgICBjb25zdCBjYWNoZUVudHJ5UmVtb3ZlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsaWZlY3ljbGUuY2FjaGVFbnRyeVJlbW92ZWQgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIGNvbnN0IGNhY2hlRGF0YUxvYWRlZCA9IFByb21pc2UucmFjZShbbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGxpZmVjeWNsZS52YWx1ZVJlc29sdmVkID0gcmVzb2x2ZTtcbiAgICB9KSwgY2FjaGVFbnRyeVJlbW92ZWQudGhlbigoKSA9PiB7XG4gICAgICB0aHJvdyBuZXZlclJlc29sdmVkRXJyb3I7XG4gICAgfSldKTtcbiAgICBjYWNoZURhdGFMb2FkZWQuY2F0Y2goKCkgPT4ge1xuICAgIH0pO1xuICAgIGxpZmVjeWNsZU1hcFtxdWVyeUNhY2hlS2V5XSA9IGxpZmVjeWNsZTtcbiAgICBjb25zdCBzZWxlY3RvciA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5zZWxlY3QoaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/IG9yaWdpbmFsQXJncyA6IHF1ZXJ5Q2FjaGVLZXkpO1xuICAgIGNvbnN0IGV4dHJhID0gbXdBcGkuZGlzcGF0Y2goKF8sIF9fLCBleHRyYTIpID0+IGV4dHJhMik7XG4gICAgY29uc3QgbGlmZWN5Y2xlQXBpID0ge1xuICAgICAgLi4ubXdBcGksXG4gICAgICBnZXRDYWNoZUVudHJ5OiAoKSA9PiBzZWxlY3Rvcihtd0FwaS5nZXRTdGF0ZSgpKSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgdXBkYXRlQ2FjaGVkRGF0YTogaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/ICh1cGRhdGVSZWNpcGUpID0+IG13QXBpLmRpc3BhdGNoKGFwaS51dGlsLnVwZGF0ZVF1ZXJ5RGF0YShlbmRwb2ludE5hbWUsIG9yaWdpbmFsQXJncywgdXBkYXRlUmVjaXBlKSkgOiB2b2lkIDAsXG4gICAgICBjYWNoZURhdGFMb2FkZWQsXG4gICAgICBjYWNoZUVudHJ5UmVtb3ZlZFxuICAgIH07XG4gICAgY29uc3QgcnVubmluZ0hhbmRsZXIgPSBvbkNhY2hlRW50cnlBZGRlZChvcmlnaW5hbEFyZ3MsIGxpZmVjeWNsZUFwaSk7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHJ1bm5pbmdIYW5kbGVyKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgaWYgKGUgPT09IG5ldmVyUmVzb2x2ZWRFcnJvcikgcmV0dXJuO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFuZGxlcjtcbn07XG5cbi8vIHNyYy9xdWVyeS9jb3JlL2J1aWxkTWlkZGxld2FyZS9kZXZNaWRkbGV3YXJlLnRzXG52YXIgYnVpbGREZXZDaGVja0hhbmRsZXIgPSAoe1xuICBhcGksXG4gIGNvbnRleHQ6IHtcbiAgICBhcGlVaWRcbiAgfSxcbiAgcmVkdWNlclBhdGhcbn0pID0+IHtcbiAgcmV0dXJuIChhY3Rpb24sIG13QXBpKSA9PiB7XG4gICAgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgbXdBcGkuZGlzcGF0Y2goYXBpLmludGVybmFsQWN0aW9ucy5taWRkbGV3YXJlUmVnaXN0ZXJlZChhcGlVaWQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChhcGkuaW50ZXJuYWxBY3Rpb25zLm1pZGRsZXdhcmVSZWdpc3RlcmVkLm1hdGNoKGFjdGlvbikgJiYgYWN0aW9uLnBheWxvYWQgPT09IGFwaVVpZCAmJiBtd0FwaS5nZXRTdGF0ZSgpW3JlZHVjZXJQYXRoXT8uY29uZmlnPy5taWRkbGV3YXJlUmVnaXN0ZXJlZCA9PT0gXCJjb25mbGljdFwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlcmUgaXMgYSBtaXNtYXRjaCBiZXR3ZWVuIHNsaWNlIGFuZCBtaWRkbGV3YXJlIGZvciB0aGUgcmVkdWNlclBhdGggXCIke3JlZHVjZXJQYXRofVwiLlxuWW91IGNhbiBvbmx5IGhhdmUgb25lIGFwaSBwZXIgcmVkdWNlciBwYXRoLCB0aGlzIHdpbGwgbGVhZCB0byBjcmFzaGVzIGluIHZhcmlvdXMgc2l0dWF0aW9ucyEke3JlZHVjZXJQYXRoID09PSBcImFwaVwiID8gYFxuSWYgeW91IGhhdmUgbXVsdGlwbGUgYXBpcywgeW91ICpoYXZlKiB0byBzcGVjaWZ5IHRoZSByZWR1Y2VyUGF0aCBvcHRpb24gd2hlbiB1c2luZyBjcmVhdGVBcGkhYCA6IFwiXCJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRNaWRkbGV3YXJlL2ludmFsaWRhdGlvbkJ5VGFncy50c1xudmFyIGJ1aWxkSW52YWxpZGF0aW9uQnlUYWdzSGFuZGxlciA9ICh7XG4gIHJlZHVjZXJQYXRoLFxuICBjb250ZXh0LFxuICBjb250ZXh0OiB7XG4gICAgZW5kcG9pbnREZWZpbml0aW9uc1xuICB9LFxuICBtdXRhdGlvblRodW5rLFxuICBxdWVyeVRodW5rLFxuICBhcGksXG4gIGFzc2VydFRhZ1R5cGUsXG4gIHJlZmV0Y2hRdWVyeSxcbiAgaW50ZXJuYWxTdGF0ZVxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgcmVtb3ZlUXVlcnlSZXN1bHRcbiAgfSA9IGFwaS5pbnRlcm5hbEFjdGlvbnM7XG4gIGNvbnN0IGlzVGh1bmtBY3Rpb25XaXRoVGFncyA9IGlzQW55T2YoaXNGdWxmaWxsZWQobXV0YXRpb25UaHVuayksIGlzUmVqZWN0ZWRXaXRoVmFsdWUobXV0YXRpb25UaHVuaykpO1xuICBjb25zdCBpc1F1ZXJ5RW5kID0gaXNBbnlPZihpc0Z1bGZpbGxlZChtdXRhdGlvblRodW5rLCBxdWVyeVRodW5rKSwgaXNSZWplY3RlZChtdXRhdGlvblRodW5rLCBxdWVyeVRodW5rKSk7XG4gIGxldCBwZW5kaW5nVGFnSW52YWxpZGF0aW9ucyA9IFtdO1xuICBjb25zdCBoYW5kbGVyID0gKGFjdGlvbiwgbXdBcGkpID0+IHtcbiAgICBpZiAoaXNUaHVua0FjdGlvbldpdGhUYWdzKGFjdGlvbikpIHtcbiAgICAgIGludmFsaWRhdGVUYWdzKGNhbGN1bGF0ZVByb3ZpZGVkQnlUaHVuayhhY3Rpb24sIFwiaW52YWxpZGF0ZXNUYWdzXCIsIGVuZHBvaW50RGVmaW5pdGlvbnMsIGFzc2VydFRhZ1R5cGUpLCBtd0FwaSk7XG4gICAgfSBlbHNlIGlmIChpc1F1ZXJ5RW5kKGFjdGlvbikpIHtcbiAgICAgIGludmFsaWRhdGVUYWdzKFtdLCBtd0FwaSk7XG4gICAgfSBlbHNlIGlmIChhcGkudXRpbC5pbnZhbGlkYXRlVGFncy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBpbnZhbGlkYXRlVGFncyhjYWxjdWxhdGVQcm92aWRlZEJ5KGFjdGlvbi5wYXlsb2FkLCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGFzc2VydFRhZ1R5cGUpLCBtd0FwaSk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBoYXNQZW5kaW5nUmVxdWVzdHMoc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBxdWVyaWVzLFxuICAgICAgbXV0YXRpb25zXG4gICAgfSA9IHN0YXRlO1xuICAgIGZvciAoY29uc3QgY2FjaGVSZWNvcmQgb2YgW3F1ZXJpZXMsIG11dGF0aW9uc10pIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNhY2hlUmVjb3JkKSB7XG4gICAgICAgIGlmIChjYWNoZVJlY29yZFtrZXldPy5zdGF0dXMgPT09IFwicGVuZGluZ1wiIC8qIHBlbmRpbmcgKi8pIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZnVuY3Rpb24gaW52YWxpZGF0ZVRhZ3MobmV3VGFncywgbXdBcGkpIHtcbiAgICBjb25zdCByb290U3RhdGUgPSBtd0FwaS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gcm9vdFN0YXRlW3JlZHVjZXJQYXRoXTtcbiAgICBwZW5kaW5nVGFnSW52YWxpZGF0aW9ucy5wdXNoKC4uLm5ld1RhZ3MpO1xuICAgIGlmIChzdGF0ZS5jb25maWcuaW52YWxpZGF0aW9uQmVoYXZpb3IgPT09IFwiZGVsYXllZFwiICYmIGhhc1BlbmRpbmdSZXF1ZXN0cyhzdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFncyA9IHBlbmRpbmdUYWdJbnZhbGlkYXRpb25zO1xuICAgIHBlbmRpbmdUYWdJbnZhbGlkYXRpb25zID0gW107XG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgdG9JbnZhbGlkYXRlID0gYXBpLnV0aWwuc2VsZWN0SW52YWxpZGF0ZWRCeShyb290U3RhdGUsIHRhZ3MpO1xuICAgIGNvbnRleHQuYmF0Y2goKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzQXJyYXkgPSBBcnJheS5mcm9tKHRvSW52YWxpZGF0ZS52YWx1ZXMoKSk7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgfSBvZiB2YWx1ZXNBcnJheSkge1xuICAgICAgICBjb25zdCBxdWVyeVN1YlN0YXRlID0gc3RhdGUucXVlcmllc1txdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU3ViU3RhdGUgPSBpbnRlcm5hbFN0YXRlLmN1cnJlbnRTdWJzY3JpcHRpb25zW3F1ZXJ5Q2FjaGVLZXldID8/IHt9O1xuICAgICAgICBpZiAocXVlcnlTdWJTdGF0ZSkge1xuICAgICAgICAgIGlmIChjb3VudE9iamVjdEtleXMoc3Vic2NyaXB0aW9uU3ViU3RhdGUpID09PSAwKSB7XG4gICAgICAgICAgICBtd0FwaS5kaXNwYXRjaChyZW1vdmVRdWVyeVJlc3VsdCh7XG4gICAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5U3ViU3RhdGUuc3RhdHVzICE9PSBcInVuaW5pdGlhbGl6ZWRcIiAvKiB1bmluaXRpYWxpemVkICovKSB7XG4gICAgICAgICAgICBtd0FwaS5kaXNwYXRjaChyZWZldGNoUXVlcnkocXVlcnlTdWJTdGF0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBoYW5kbGVyO1xufTtcblxuLy8gc3JjL3F1ZXJ5L2NvcmUvYnVpbGRNaWRkbGV3YXJlL3BvbGxpbmcudHNcbnZhciBidWlsZFBvbGxpbmdIYW5kbGVyID0gKHtcbiAgcmVkdWNlclBhdGgsXG4gIHF1ZXJ5VGh1bmssXG4gIGFwaSxcbiAgcmVmZXRjaFF1ZXJ5LFxuICBpbnRlcm5hbFN0YXRlXG59KSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRQb2xscyA9IHt9O1xuICBjb25zdCBoYW5kbGVyID0gKGFjdGlvbiwgbXdBcGkpID0+IHtcbiAgICBpZiAoYXBpLmludGVybmFsQWN0aW9ucy51cGRhdGVTdWJzY3JpcHRpb25PcHRpb25zLm1hdGNoKGFjdGlvbikgfHwgYXBpLmludGVybmFsQWN0aW9ucy51bnN1YnNjcmliZVF1ZXJ5UmVzdWx0Lm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHVwZGF0ZVBvbGxpbmdJbnRlcnZhbChhY3Rpb24ucGF5bG9hZCwgbXdBcGkpO1xuICAgIH1cbiAgICBpZiAocXVlcnlUaHVuay5wZW5kaW5nLm1hdGNoKGFjdGlvbikgfHwgcXVlcnlUaHVuay5yZWplY3RlZC5tYXRjaChhY3Rpb24pICYmIGFjdGlvbi5tZXRhLmNvbmRpdGlvbikge1xuICAgICAgdXBkYXRlUG9sbGluZ0ludGVydmFsKGFjdGlvbi5tZXRhLmFyZywgbXdBcGkpO1xuICAgIH1cbiAgICBpZiAocXVlcnlUaHVuay5mdWxmaWxsZWQubWF0Y2goYWN0aW9uKSB8fCBxdWVyeVRodW5rLnJlamVjdGVkLm1hdGNoKGFjdGlvbikgJiYgIWFjdGlvbi5tZXRhLmNvbmRpdGlvbikge1xuICAgICAgc3RhcnROZXh0UG9sbChhY3Rpb24ubWV0YS5hcmcsIG13QXBpKTtcbiAgICB9XG4gICAgaWYgKGFwaS51dGlsLnJlc2V0QXBpU3RhdGUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY2xlYXJQb2xscygpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZ2V0Q2FjaGVFbnRyeVN1YnNjcmlwdGlvbnMocXVlcnlDYWNoZUtleSwgYXBpMikge1xuICAgIGNvbnN0IHN0YXRlID0gYXBpMi5nZXRTdGF0ZSgpW3JlZHVjZXJQYXRoXTtcbiAgICBjb25zdCBxdWVyeVN1YlN0YXRlID0gc3RhdGUucXVlcmllc1txdWVyeUNhY2hlS2V5XTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gaW50ZXJuYWxTdGF0ZS5jdXJyZW50U3Vic2NyaXB0aW9uc1txdWVyeUNhY2hlS2V5XTtcbiAgICBpZiAoIXF1ZXJ5U3ViU3RhdGUgfHwgcXVlcnlTdWJTdGF0ZS5zdGF0dXMgPT09IFwidW5pbml0aWFsaXplZFwiIC8qIHVuaW5pdGlhbGl6ZWQgKi8pIHJldHVybjtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9ucztcbiAgfVxuICBmdW5jdGlvbiBzdGFydE5leHRQb2xsKHtcbiAgICBxdWVyeUNhY2hlS2V5XG4gIH0sIGFwaTIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGFwaTIuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF07XG4gICAgY29uc3QgcXVlcnlTdWJTdGF0ZSA9IHN0YXRlLnF1ZXJpZXNbcXVlcnlDYWNoZUtleV07XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnNbcXVlcnlDYWNoZUtleV07XG4gICAgaWYgKCFxdWVyeVN1YlN0YXRlIHx8IHF1ZXJ5U3ViU3RhdGUuc3RhdHVzID09PSBcInVuaW5pdGlhbGl6ZWRcIiAvKiB1bmluaXRpYWxpemVkICovKSByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgbG93ZXN0UG9sbGluZ0ludGVydmFsLFxuICAgICAgc2tpcFBvbGxpbmdJZlVuZm9jdXNlZFxuICAgIH0gPSBmaW5kTG93ZXN0UG9sbGluZ0ludGVydmFsKHN1YnNjcmlwdGlvbnMpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGxvd2VzdFBvbGxpbmdJbnRlcnZhbCkpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50UG9sbCA9IGN1cnJlbnRQb2xsc1txdWVyeUNhY2hlS2V5XTtcbiAgICBpZiAoY3VycmVudFBvbGw/LnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChjdXJyZW50UG9sbC50aW1lb3V0KTtcbiAgICAgIGN1cnJlbnRQb2xsLnRpbWVvdXQgPSB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IG5leHRQb2xsVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIGxvd2VzdFBvbGxpbmdJbnRlcnZhbDtcbiAgICBjdXJyZW50UG9sbHNbcXVlcnlDYWNoZUtleV0gPSB7XG4gICAgICBuZXh0UG9sbFRpbWVzdGFtcCxcbiAgICAgIHBvbGxpbmdJbnRlcnZhbDogbG93ZXN0UG9sbGluZ0ludGVydmFsLFxuICAgICAgdGltZW91dDogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5jb25maWcuZm9jdXNlZCB8fCAhc2tpcFBvbGxpbmdJZlVuZm9jdXNlZCkge1xuICAgICAgICAgIGFwaTIuZGlzcGF0Y2gocmVmZXRjaFF1ZXJ5KHF1ZXJ5U3ViU3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydE5leHRQb2xsKHtcbiAgICAgICAgICBxdWVyeUNhY2hlS2V5XG4gICAgICAgIH0sIGFwaTIpO1xuICAgICAgfSwgbG93ZXN0UG9sbGluZ0ludGVydmFsKVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlUG9sbGluZ0ludGVydmFsKHtcbiAgICBxdWVyeUNhY2hlS2V5XG4gIH0sIGFwaTIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGFwaTIuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF07XG4gICAgY29uc3QgcXVlcnlTdWJTdGF0ZSA9IHN0YXRlLnF1ZXJpZXNbcXVlcnlDYWNoZUtleV07XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnNbcXVlcnlDYWNoZUtleV07XG4gICAgaWYgKCFxdWVyeVN1YlN0YXRlIHx8IHF1ZXJ5U3ViU3RhdGUuc3RhdHVzID09PSBcInVuaW5pdGlhbGl6ZWRcIiAvKiB1bmluaXRpYWxpemVkICovKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxvd2VzdFBvbGxpbmdJbnRlcnZhbFxuICAgIH0gPSBmaW5kTG93ZXN0UG9sbGluZ0ludGVydmFsKHN1YnNjcmlwdGlvbnMpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGxvd2VzdFBvbGxpbmdJbnRlcnZhbCkpIHtcbiAgICAgIGNsZWFudXBQb2xsRm9yS2V5KHF1ZXJ5Q2FjaGVLZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UG9sbCA9IGN1cnJlbnRQb2xsc1txdWVyeUNhY2hlS2V5XTtcbiAgICBjb25zdCBuZXh0UG9sbFRpbWVzdGFtcCA9IERhdGUubm93KCkgKyBsb3dlc3RQb2xsaW5nSW50ZXJ2YWw7XG4gICAgaWYgKCFjdXJyZW50UG9sbCB8fCBuZXh0UG9sbFRpbWVzdGFtcCA8IGN1cnJlbnRQb2xsLm5leHRQb2xsVGltZXN0YW1wKSB7XG4gICAgICBzdGFydE5leHRQb2xsKHtcbiAgICAgICAgcXVlcnlDYWNoZUtleVxuICAgICAgfSwgYXBpMik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNsZWFudXBQb2xsRm9yS2V5KGtleSkge1xuICAgIGNvbnN0IGV4aXN0aW5nUG9sbCA9IGN1cnJlbnRQb2xsc1trZXldO1xuICAgIGlmIChleGlzdGluZ1BvbGw/LnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChleGlzdGluZ1BvbGwudGltZW91dCk7XG4gICAgfVxuICAgIGRlbGV0ZSBjdXJyZW50UG9sbHNba2V5XTtcbiAgfVxuICBmdW5jdGlvbiBjbGVhclBvbGxzKCkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnRQb2xscykpIHtcbiAgICAgIGNsZWFudXBQb2xsRm9yS2V5KGtleSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGZpbmRMb3dlc3RQb2xsaW5nSW50ZXJ2YWwoc3Vic2NyaWJlcnMgPSB7fSkge1xuICAgIGxldCBza2lwUG9sbGluZ0lmVW5mb2N1c2VkID0gZmFsc2U7XG4gICAgbGV0IGxvd2VzdFBvbGxpbmdJbnRlcnZhbCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBmb3IgKGxldCBrZXkgaW4gc3Vic2NyaWJlcnMpIHtcbiAgICAgIGlmICghIXN1YnNjcmliZXJzW2tleV0ucG9sbGluZ0ludGVydmFsKSB7XG4gICAgICAgIGxvd2VzdFBvbGxpbmdJbnRlcnZhbCA9IE1hdGgubWluKHN1YnNjcmliZXJzW2tleV0ucG9sbGluZ0ludGVydmFsLCBsb3dlc3RQb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICBza2lwUG9sbGluZ0lmVW5mb2N1c2VkID0gc3Vic2NyaWJlcnNba2V5XS5za2lwUG9sbGluZ0lmVW5mb2N1c2VkIHx8IHNraXBQb2xsaW5nSWZVbmZvY3VzZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsb3dlc3RQb2xsaW5nSW50ZXJ2YWwsXG4gICAgICBza2lwUG9sbGluZ0lmVW5mb2N1c2VkXG4gICAgfTtcbiAgfVxuICByZXR1cm4gaGFuZGxlcjtcbn07XG5cbi8vIHNyYy9xdWVyeS9jb3JlL2J1aWxkTWlkZGxld2FyZS9xdWVyeUxpZmVjeWNsZS50c1xudmFyIGJ1aWxkUXVlcnlMaWZlY3ljbGVIYW5kbGVyID0gKHtcbiAgYXBpLFxuICBjb250ZXh0LFxuICBxdWVyeVRodW5rLFxuICBtdXRhdGlvblRodW5rXG59KSA9PiB7XG4gIGNvbnN0IGlzUGVuZGluZ1RodW5rID0gaXNQZW5kaW5nKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBpc1JlamVjdGVkVGh1bmsgPSBpc1JlamVjdGVkKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBpc0Z1bGxmaWxsZWRUaHVuayA9IGlzRnVsZmlsbGVkKHF1ZXJ5VGh1bmssIG11dGF0aW9uVGh1bmspO1xuICBjb25zdCBsaWZlY3ljbGVNYXAgPSB7fTtcbiAgY29uc3QgaGFuZGxlciA9IChhY3Rpb24sIG13QXBpKSA9PiB7XG4gICAgaWYgKGlzUGVuZGluZ1RodW5rKGFjdGlvbikpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhcmc6IHtcbiAgICAgICAgICBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgb3JpZ2luYWxBcmdzXG4gICAgICAgIH1cbiAgICAgIH0gPSBhY3Rpb24ubWV0YTtcbiAgICAgIGNvbnN0IGVuZHBvaW50RGVmaW5pdGlvbiA9IGNvbnRleHQuZW5kcG9pbnREZWZpbml0aW9uc1tlbmRwb2ludE5hbWVdO1xuICAgICAgY29uc3Qgb25RdWVyeVN0YXJ0ZWQgPSBlbmRwb2ludERlZmluaXRpb24/Lm9uUXVlcnlTdGFydGVkO1xuICAgICAgaWYgKG9uUXVlcnlTdGFydGVkKSB7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9O1xuICAgICAgICBjb25zdCBxdWVyeUZ1bGZpbGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsaWZlY3ljbGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgbGlmZWN5Y2xlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXJ5RnVsZmlsbGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgfSk7XG4gICAgICAgIGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdID0gbGlmZWN5Y2xlO1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGFwaS5lbmRwb2ludHNbZW5kcG9pbnROYW1lXS5zZWxlY3QoaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/IG9yaWdpbmFsQXJncyA6IHJlcXVlc3RJZCk7XG4gICAgICAgIGNvbnN0IGV4dHJhID0gbXdBcGkuZGlzcGF0Y2goKF8sIF9fLCBleHRyYTIpID0+IGV4dHJhMik7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZUFwaSA9IHtcbiAgICAgICAgICAuLi5td0FwaSxcbiAgICAgICAgICBnZXRDYWNoZUVudHJ5OiAoKSA9PiBzZWxlY3Rvcihtd0FwaS5nZXRTdGF0ZSgpKSxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgdXBkYXRlQ2FjaGVkRGF0YTogaXNBbnlRdWVyeURlZmluaXRpb24oZW5kcG9pbnREZWZpbml0aW9uKSA/ICh1cGRhdGVSZWNpcGUpID0+IG13QXBpLmRpc3BhdGNoKGFwaS51dGlsLnVwZGF0ZVF1ZXJ5RGF0YShlbmRwb2ludE5hbWUsIG9yaWdpbmFsQXJncywgdXBkYXRlUmVjaXBlKSkgOiB2b2lkIDAsXG4gICAgICAgICAgcXVlcnlGdWxmaWxsZWRcbiAgICAgICAgfTtcbiAgICAgICAgb25RdWVyeVN0YXJ0ZWQob3JpZ2luYWxBcmdzLCBsaWZlY3ljbGVBcGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNGdWxsZmlsbGVkVGh1bmsoYWN0aW9uKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGJhc2VRdWVyeU1ldGFcbiAgICAgIH0gPSBhY3Rpb24ubWV0YTtcbiAgICAgIGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdPy5yZXNvbHZlKHtcbiAgICAgICAgZGF0YTogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIG1ldGE6IGJhc2VRdWVyeU1ldGFcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGxpZmVjeWNsZU1hcFtyZXF1ZXN0SWRdO1xuICAgIH0gZWxzZSBpZiAoaXNSZWplY3RlZFRodW5rKGFjdGlvbikpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZWplY3RlZFdpdGhWYWx1ZSxcbiAgICAgICAgYmFzZVF1ZXJ5TWV0YVxuICAgICAgfSA9IGFjdGlvbi5tZXRhO1xuICAgICAgbGlmZWN5Y2xlTWFwW3JlcXVlc3RJZF0/LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiBhY3Rpb24ucGF5bG9hZCA/PyBhY3Rpb24uZXJyb3IsXG4gICAgICAgIGlzVW5oYW5kbGVkRXJyb3I6ICFyZWplY3RlZFdpdGhWYWx1ZSxcbiAgICAgICAgbWV0YTogYmFzZVF1ZXJ5TWV0YVxuICAgICAgfSk7XG4gICAgICBkZWxldGUgbGlmZWN5Y2xlTWFwW3JlcXVlc3RJZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFuZGxlcjtcbn07XG5cbi8vIHNyYy9xdWVyeS9jb3JlL2J1aWxkTWlkZGxld2FyZS93aW5kb3dFdmVudEhhbmRsaW5nLnRzXG52YXIgYnVpbGRXaW5kb3dFdmVudEhhbmRsZXIgPSAoe1xuICByZWR1Y2VyUGF0aCxcbiAgY29udGV4dCxcbiAgYXBpLFxuICByZWZldGNoUXVlcnksXG4gIGludGVybmFsU3RhdGVcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlbW92ZVF1ZXJ5UmVzdWx0XG4gIH0gPSBhcGkuaW50ZXJuYWxBY3Rpb25zO1xuICBjb25zdCBoYW5kbGVyID0gKGFjdGlvbiwgbXdBcGkpID0+IHtcbiAgICBpZiAob25Gb2N1cy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZWZldGNoVmFsaWRRdWVyaWVzKG13QXBpLCBcInJlZmV0Y2hPbkZvY3VzXCIpO1xuICAgIH1cbiAgICBpZiAob25PbmxpbmUubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmVmZXRjaFZhbGlkUXVlcmllcyhtd0FwaSwgXCJyZWZldGNoT25SZWNvbm5lY3RcIik7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiByZWZldGNoVmFsaWRRdWVyaWVzKGFwaTIsIHR5cGUpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGFwaTIuZ2V0U3RhdGUoKVtyZWR1Y2VyUGF0aF07XG4gICAgY29uc3QgcXVlcmllcyA9IHN0YXRlLnF1ZXJpZXM7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGludGVybmFsU3RhdGUuY3VycmVudFN1YnNjcmlwdGlvbnM7XG4gICAgY29udGV4dC5iYXRjaCgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHF1ZXJ5Q2FjaGVLZXkgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgY29uc3QgcXVlcnlTdWJTdGF0ZSA9IHF1ZXJpZXNbcXVlcnlDYWNoZUtleV07XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblN1YlN0YXRlID0gc3Vic2NyaXB0aW9uc1txdWVyeUNhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFzdWJzY3JpcHRpb25TdWJTdGF0ZSB8fCAhcXVlcnlTdWJTdGF0ZSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNob3VsZFJlZmV0Y2ggPSBPYmplY3QudmFsdWVzKHN1YnNjcmlwdGlvblN1YlN0YXRlKS5zb21lKChzdWIpID0+IHN1Ylt0eXBlXSA9PT0gdHJ1ZSkgfHwgT2JqZWN0LnZhbHVlcyhzdWJzY3JpcHRpb25TdWJTdGF0ZSkuZXZlcnkoKHN1YikgPT4gc3ViW3R5cGVdID09PSB2b2lkIDApICYmIHN0YXRlLmNvbmZpZ1t0eXBlXTtcbiAgICAgICAgaWYgKHNob3VsZFJlZmV0Y2gpIHtcbiAgICAgICAgICBpZiAoY291bnRPYmplY3RLZXlzKHN1YnNjcmlwdGlvblN1YlN0YXRlKSA9PT0gMCkge1xuICAgICAgICAgICAgYXBpMi5kaXNwYXRjaChyZW1vdmVRdWVyeVJlc3VsdCh7XG4gICAgICAgICAgICAgIHF1ZXJ5Q2FjaGVLZXlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5U3ViU3RhdGUuc3RhdHVzICE9PSBcInVuaW5pdGlhbGl6ZWRcIiAvKiB1bmluaXRpYWxpemVkICovKSB7XG4gICAgICAgICAgICBhcGkyLmRpc3BhdGNoKHJlZmV0Y2hRdWVyeShxdWVyeVN1YlN0YXRlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXI7XG59O1xuXG4vLyBzcmMvcXVlcnkvY29yZS9idWlsZE1pZGRsZXdhcmUvaW5kZXgudHNcbmZ1bmN0aW9uIGJ1aWxkTWlkZGxld2FyZShpbnB1dCkge1xuICBjb25zdCB7XG4gICAgcmVkdWNlclBhdGgsXG4gICAgcXVlcnlUaHVuayxcbiAgICBhcGksXG4gICAgY29udGV4dFxuICB9ID0gaW5wdXQ7XG4gIGNvbnN0IHtcbiAgICBhcGlVaWRcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgaW52YWxpZGF0ZVRhZ3M6IGNyZWF0ZUFjdGlvbihgJHtyZWR1Y2VyUGF0aH0vaW52YWxpZGF0ZVRhZ3NgKVxuICB9O1xuICBjb25zdCBpc1RoaXNBcGlTbGljZUFjdGlvbiA9IChhY3Rpb24pID0+IGFjdGlvbi50eXBlLnN0YXJ0c1dpdGgoYCR7cmVkdWNlclBhdGh9L2ApO1xuICBjb25zdCBoYW5kbGVyQnVpbGRlcnMgPSBbYnVpbGREZXZDaGVja0hhbmRsZXIsIGJ1aWxkQ2FjaGVDb2xsZWN0aW9uSGFuZGxlciwgYnVpbGRJbnZhbGlkYXRpb25CeVRhZ3NIYW5kbGVyLCBidWlsZFBvbGxpbmdIYW5kbGVyLCBidWlsZENhY2hlTGlmZWN5Y2xlSGFuZGxlciwgYnVpbGRRdWVyeUxpZmVjeWNsZUhhbmRsZXJdO1xuICBjb25zdCBtaWRkbGV3YXJlID0gKG13QXBpKSA9PiB7XG4gICAgbGV0IGluaXRpYWxpemVkMiA9IGZhbHNlO1xuICAgIGNvbnN0IGludGVybmFsU3RhdGUgPSB7XG4gICAgICBjdXJyZW50U3Vic2NyaXB0aW9uczoge31cbiAgICB9O1xuICAgIGNvbnN0IGJ1aWxkZXJBcmdzID0ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICBpbnRlcm5hbFN0YXRlLFxuICAgICAgcmVmZXRjaFF1ZXJ5LFxuICAgICAgaXNUaGlzQXBpU2xpY2VBY3Rpb25cbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZXJzID0gaGFuZGxlckJ1aWxkZXJzLm1hcCgoYnVpbGQpID0+IGJ1aWxkKGJ1aWxkZXJBcmdzKSk7XG4gICAgY29uc3QgYmF0Y2hlZEFjdGlvbnNIYW5kbGVyID0gYnVpbGRCYXRjaGVkQWN0aW9uc0hhbmRsZXIoYnVpbGRlckFyZ3MpO1xuICAgIGNvbnN0IHdpbmRvd0V2ZW50c0hhbmRsZXIgPSBidWlsZFdpbmRvd0V2ZW50SGFuZGxlcihidWlsZGVyQXJncyk7XG4gICAgcmV0dXJuIChuZXh0KSA9PiB7XG4gICAgICByZXR1cm4gKGFjdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWlzQWN0aW9uKGFjdGlvbikpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5pdGlhbGl6ZWQyKSB7XG4gICAgICAgICAgaW5pdGlhbGl6ZWQyID0gdHJ1ZTtcbiAgICAgICAgICBtd0FwaS5kaXNwYXRjaChhcGkuaW50ZXJuYWxBY3Rpb25zLm1pZGRsZXdhcmVSZWdpc3RlcmVkKGFwaVVpZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG13QXBpV2l0aE5leHQgPSB7XG4gICAgICAgICAgLi4ubXdBcGksXG4gICAgICAgICAgbmV4dFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGF0ZUJlZm9yZSA9IG13QXBpLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFthY3Rpb25TaG91bGRDb250aW51ZSwgaW50ZXJuYWxQcm9iZVJlc3VsdF0gPSBiYXRjaGVkQWN0aW9uc0hhbmRsZXIoYWN0aW9uLCBtd0FwaVdpdGhOZXh0LCBzdGF0ZUJlZm9yZSk7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGlmIChhY3Rpb25TaG91bGRDb250aW51ZSkge1xuICAgICAgICAgIHJlcyA9IG5leHQoYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMgPSBpbnRlcm5hbFByb2JlUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghIW13QXBpLmdldFN0YXRlKClbcmVkdWNlclBhdGhdKSB7XG4gICAgICAgICAgd2luZG93RXZlbnRzSGFuZGxlcihhY3Rpb24sIG13QXBpV2l0aE5leHQsIHN0YXRlQmVmb3JlKTtcbiAgICAgICAgICBpZiAoaXNUaGlzQXBpU2xpY2VBY3Rpb24oYWN0aW9uKSB8fCBjb250ZXh0Lmhhc1JlaHlkcmF0aW9uSW5mbyhhY3Rpb24pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgaGFuZGxlcihhY3Rpb24sIG13QXBpV2l0aE5leHQsIHN0YXRlQmVmb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIGFjdGlvbnNcbiAgfTtcbiAgZnVuY3Rpb24gcmVmZXRjaFF1ZXJ5KHF1ZXJ5U3ViU3RhdGUpIHtcbiAgICByZXR1cm4gaW5wdXQuYXBpLmVuZHBvaW50c1txdWVyeVN1YlN0YXRlLmVuZHBvaW50TmFtZV0uaW5pdGlhdGUocXVlcnlTdWJTdGF0ZS5vcmlnaW5hbEFyZ3MsIHtcbiAgICAgIHN1YnNjcmliZTogZmFsc2UsXG4gICAgICBmb3JjZVJlZmV0Y2g6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBzcmMvcXVlcnkvY29yZS9tb2R1bGUudHNcbnZhciBjb3JlTW9kdWxlTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTtcbnZhciBjb3JlTW9kdWxlID0gKHtcbiAgY3JlYXRlU2VsZWN0b3I6IGNyZWF0ZVNlbGVjdG9yMiA9IGNyZWF0ZVNlbGVjdG9yXG59ID0ge30pID0+ICh7XG4gIG5hbWU6IGNvcmVNb2R1bGVOYW1lLFxuICBpbml0KGFwaSwge1xuICAgIGJhc2VRdWVyeSxcbiAgICB0YWdUeXBlcyxcbiAgICByZWR1Y2VyUGF0aCxcbiAgICBzZXJpYWxpemVRdWVyeUFyZ3MsXG4gICAga2VlcFVudXNlZERhdGFGb3IsXG4gICAgcmVmZXRjaE9uTW91bnRPckFyZ0NoYW5nZSxcbiAgICByZWZldGNoT25Gb2N1cyxcbiAgICByZWZldGNoT25SZWNvbm5lY3QsXG4gICAgaW52YWxpZGF0aW9uQmVoYXZpb3IsXG4gICAgb25TY2hlbWFGYWlsdXJlLFxuICAgIGNhdGNoU2NoZW1hRmFpbHVyZSxcbiAgICBza2lwU2NoZW1hVmFsaWRhdGlvblxuICB9LCBjb250ZXh0KSB7XG4gICAgZW5hYmxlUGF0Y2hlcygpO1xuICAgIGFzc2VydENhc3Qoc2VyaWFsaXplUXVlcnlBcmdzKTtcbiAgICBjb25zdCBhc3NlcnRUYWdUeXBlID0gKHRhZykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgaWYgKCF0YWdUeXBlcy5pbmNsdWRlcyh0YWcudHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBUYWcgdHlwZSAnJHt0YWcudHlwZX0nIHdhcyB1c2VkLCBidXQgbm90IHNwZWNpZmllZCBpbiBcXGB0YWdUeXBlc1xcYCFgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhZztcbiAgICB9O1xuICAgIE9iamVjdC5hc3NpZ24oYXBpLCB7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIGVuZHBvaW50czoge30sXG4gICAgICBpbnRlcm5hbEFjdGlvbnM6IHtcbiAgICAgICAgb25PbmxpbmUsXG4gICAgICAgIG9uT2ZmbGluZSxcbiAgICAgICAgb25Gb2N1cyxcbiAgICAgICAgb25Gb2N1c0xvc3RcbiAgICAgIH0sXG4gICAgICB1dGlsOiB7fVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IGJ1aWxkU2VsZWN0b3JzKHtcbiAgICAgIHNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgY3JlYXRlU2VsZWN0b3I6IGNyZWF0ZVNlbGVjdG9yMlxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdEludmFsaWRhdGVkQnksXG4gICAgICBzZWxlY3RDYWNoZWRBcmdzRm9yUXVlcnksXG4gICAgICBidWlsZFF1ZXJ5U2VsZWN0b3IsXG4gICAgICBidWlsZEluZmluaXRlUXVlcnlTZWxlY3RvcixcbiAgICAgIGJ1aWxkTXV0YXRpb25TZWxlY3RvclxuICAgIH0gPSBzZWxlY3RvcnM7XG4gICAgc2FmZUFzc2lnbihhcGkudXRpbCwge1xuICAgICAgc2VsZWN0SW52YWxpZGF0ZWRCeSxcbiAgICAgIHNlbGVjdENhY2hlZEFyZ3NGb3JRdWVyeVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIHF1ZXJ5VGh1bmssXG4gICAgICBpbmZpbml0ZVF1ZXJ5VGh1bmssXG4gICAgICBtdXRhdGlvblRodW5rLFxuICAgICAgcGF0Y2hRdWVyeURhdGEsXG4gICAgICB1cGRhdGVRdWVyeURhdGEsXG4gICAgICB1cHNlcnRRdWVyeURhdGEsXG4gICAgICBwcmVmZXRjaCxcbiAgICAgIGJ1aWxkTWF0Y2hUaHVua0FjdGlvbnNcbiAgICB9ID0gYnVpbGRUaHVua3Moe1xuICAgICAgYmFzZVF1ZXJ5LFxuICAgICAgcmVkdWNlclBhdGgsXG4gICAgICBjb250ZXh0LFxuICAgICAgYXBpLFxuICAgICAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICAgICAgYXNzZXJ0VGFnVHlwZSxcbiAgICAgIHNlbGVjdG9ycyxcbiAgICAgIG9uU2NoZW1hRmFpbHVyZSxcbiAgICAgIGNhdGNoU2NoZW1hRmFpbHVyZSxcbiAgICAgIHNraXBTY2hlbWFWYWxpZGF0aW9uXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgcmVkdWNlcixcbiAgICAgIGFjdGlvbnM6IHNsaWNlQWN0aW9uc1xuICAgIH0gPSBidWlsZFNsaWNlKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBxdWVyeVRodW5rLFxuICAgICAgaW5maW5pdGVRdWVyeVRodW5rLFxuICAgICAgbXV0YXRpb25UaHVuayxcbiAgICAgIHNlcmlhbGl6ZVF1ZXJ5QXJncyxcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgYXNzZXJ0VGFnVHlwZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWZldGNoT25Gb2N1cyxcbiAgICAgICAgcmVmZXRjaE9uUmVjb25uZWN0LFxuICAgICAgICByZWZldGNoT25Nb3VudE9yQXJnQ2hhbmdlLFxuICAgICAgICBrZWVwVW51c2VkRGF0YUZvcixcbiAgICAgICAgcmVkdWNlclBhdGgsXG4gICAgICAgIGludmFsaWRhdGlvbkJlaGF2aW9yXG4gICAgICB9XG4gICAgfSk7XG4gICAgc2FmZUFzc2lnbihhcGkudXRpbCwge1xuICAgICAgcGF0Y2hRdWVyeURhdGEsXG4gICAgICB1cGRhdGVRdWVyeURhdGEsXG4gICAgICB1cHNlcnRRdWVyeURhdGEsXG4gICAgICBwcmVmZXRjaCxcbiAgICAgIHJlc2V0QXBpU3RhdGU6IHNsaWNlQWN0aW9ucy5yZXNldEFwaVN0YXRlLFxuICAgICAgdXBzZXJ0UXVlcnlFbnRyaWVzOiBzbGljZUFjdGlvbnMuY2FjaGVFbnRyaWVzVXBzZXJ0ZWRcbiAgICB9KTtcbiAgICBzYWZlQXNzaWduKGFwaS5pbnRlcm5hbEFjdGlvbnMsIHNsaWNlQWN0aW9ucyk7XG4gICAgY29uc3Qge1xuICAgICAgbWlkZGxld2FyZSxcbiAgICAgIGFjdGlvbnM6IG1pZGRsZXdhcmVBY3Rpb25zXG4gICAgfSA9IGJ1aWxkTWlkZGxld2FyZSh7XG4gICAgICByZWR1Y2VyUGF0aCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBxdWVyeVRodW5rLFxuICAgICAgbXV0YXRpb25UaHVuayxcbiAgICAgIGluZmluaXRlUXVlcnlUaHVuayxcbiAgICAgIGFwaSxcbiAgICAgIGFzc2VydFRhZ1R5cGUsXG4gICAgICBzZWxlY3RvcnNcbiAgICB9KTtcbiAgICBzYWZlQXNzaWduKGFwaS51dGlsLCBtaWRkbGV3YXJlQWN0aW9ucyk7XG4gICAgc2FmZUFzc2lnbihhcGksIHtcbiAgICAgIHJlZHVjZXIsXG4gICAgICBtaWRkbGV3YXJlXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgYnVpbGRJbml0aWF0ZVF1ZXJ5LFxuICAgICAgYnVpbGRJbml0aWF0ZUluZmluaXRlUXVlcnksXG4gICAgICBidWlsZEluaXRpYXRlTXV0YXRpb24sXG4gICAgICBnZXRSdW5uaW5nTXV0YXRpb25UaHVuayxcbiAgICAgIGdldFJ1bm5pbmdNdXRhdGlvbnNUaHVuayxcbiAgICAgIGdldFJ1bm5pbmdRdWVyaWVzVGh1bmssXG4gICAgICBnZXRSdW5uaW5nUXVlcnlUaHVua1xuICAgIH0gPSBidWlsZEluaXRpYXRlKHtcbiAgICAgIHF1ZXJ5VGh1bmssXG4gICAgICBtdXRhdGlvblRodW5rLFxuICAgICAgaW5maW5pdGVRdWVyeVRodW5rLFxuICAgICAgYXBpLFxuICAgICAgc2VyaWFsaXplUXVlcnlBcmdzLFxuICAgICAgY29udGV4dFxuICAgIH0pO1xuICAgIHNhZmVBc3NpZ24oYXBpLnV0aWwsIHtcbiAgICAgIGdldFJ1bm5pbmdNdXRhdGlvblRodW5rLFxuICAgICAgZ2V0UnVubmluZ011dGF0aW9uc1RodW5rLFxuICAgICAgZ2V0UnVubmluZ1F1ZXJ5VGh1bmssXG4gICAgICBnZXRSdW5uaW5nUXVlcmllc1RodW5rXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNvcmVNb2R1bGVOYW1lLFxuICAgICAgaW5qZWN0RW5kcG9pbnQoZW5kcG9pbnROYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFueUFwaSA9IGFwaTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBhbnlBcGkuZW5kcG9pbnRzW2VuZHBvaW50TmFtZV0gPz89IHt9O1xuICAgICAgICBpZiAoaXNRdWVyeURlZmluaXRpb24oZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBzYWZlQXNzaWduKGVuZHBvaW50LCB7XG4gICAgICAgICAgICBuYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgICBzZWxlY3Q6IGJ1aWxkUXVlcnlTZWxlY3RvcihlbmRwb2ludE5hbWUsIGRlZmluaXRpb24pLFxuICAgICAgICAgICAgaW5pdGlhdGU6IGJ1aWxkSW5pdGlhdGVRdWVyeShlbmRwb2ludE5hbWUsIGRlZmluaXRpb24pXG4gICAgICAgICAgfSwgYnVpbGRNYXRjaFRodW5rQWN0aW9ucyhxdWVyeVRodW5rLCBlbmRwb2ludE5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNdXRhdGlvbkRlZmluaXRpb24oZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBzYWZlQXNzaWduKGVuZHBvaW50LCB7XG4gICAgICAgICAgICBuYW1lOiBlbmRwb2ludE5hbWUsXG4gICAgICAgICAgICBzZWxlY3Q6IGJ1aWxkTXV0YXRpb25TZWxlY3RvcigpLFxuICAgICAgICAgICAgaW5pdGlhdGU6IGJ1aWxkSW5pdGlhdGVNdXRhdGlvbihlbmRwb2ludE5hbWUpXG4gICAgICAgICAgfSwgYnVpbGRNYXRjaFRodW5rQWN0aW9ucyhtdXRhdGlvblRodW5rLCBlbmRwb2ludE5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJbmZpbml0ZVF1ZXJ5RGVmaW5pdGlvbihkZWZpbml0aW9uKSkge1xuICAgICAgICAgIHNhZmVBc3NpZ24oZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG5hbWU6IGVuZHBvaW50TmFtZSxcbiAgICAgICAgICAgIHNlbGVjdDogYnVpbGRJbmZpbml0ZVF1ZXJ5U2VsZWN0b3IoZW5kcG9pbnROYW1lLCBkZWZpbml0aW9uKSxcbiAgICAgICAgICAgIGluaXRpYXRlOiBidWlsZEluaXRpYXRlSW5maW5pdGVRdWVyeShlbmRwb2ludE5hbWUsIGRlZmluaXRpb24pXG4gICAgICAgICAgfSwgYnVpbGRNYXRjaFRodW5rQWN0aW9ucyhxdWVyeVRodW5rLCBlbmRwb2ludE5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn0pO1xuXG4vLyBzcmMvcXVlcnkvY29yZS9pbmRleC50c1xudmFyIGNyZWF0ZUFwaSA9IC8qIEBfX1BVUkVfXyAqLyBidWlsZENyZWF0ZUFwaShjb3JlTW9kdWxlKCkpO1xuZXhwb3J0IHtcbiAgTmFtZWRTY2hlbWFFcnJvcixcbiAgUXVlcnlTdGF0dXMsXG4gIF9ORVZFUixcbiAgYnVpbGRDcmVhdGVBcGksXG4gIGNvcHlXaXRoU3RydWN0dXJhbFNoYXJpbmcsXG4gIGNvcmVNb2R1bGUsXG4gIGNvcmVNb2R1bGVOYW1lLFxuICBjcmVhdGVBcGksXG4gIGRlZmF1bHRTZXJpYWxpemVRdWVyeUFyZ3MsXG4gIGZha2VCYXNlUXVlcnksXG4gIGZldGNoQmFzZVF1ZXJ5LFxuICByZXRyeSxcbiAgc2V0dXBMaXN0ZW5lcnMsXG4gIHNraXBUb2tlblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ0ay1xdWVyeS5tb2Rlcm4ubWpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZUFwaSBhcyBpLCBmZXRjaEJhc2VRdWVyeSBhcyBuIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXQvcXVlcnlcIjtcbmNvbnN0IGMgPSAoeyBiYXNlVXJsOiBvLCByZWFsbVBhdGg6IHIgfSkgPT4gaSh7XG4gIHJlZHVjZXJQYXRoOiBcImRldmljZUNsaWVudFwiLFxuICBiYXNlUXVlcnk6IG4oe1xuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICBwcmVwYXJlSGVhZGVyczogKHQpID0+ICh0LnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiksIHQuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKSwgdC5zZXQoXCJ4LXJlcXVlc3RlZC13aXRoXCIsIFwiZm9yZ2Vyb2NrLXNka1wiKSwgdC5zZXQoXCJ4LXJlcXVlc3RlZC1wbGF0Zm9ybVwiLCBcImphdmFzY3JpcHRcIiksIHQpLFxuICAgIGJhc2VVcmw6IG9cbiAgfSksXG4gIGVuZHBvaW50czogKHQpID0+ICh7XG4gICAgLy8gb2F0aCBlbmRwb2ludHNcbiAgICBnZXRPQXRoRGV2aWNlczogdC5xdWVyeSh7XG4gICAgICBxdWVyeTogKHsgcmVhbG06IGUgPSByLCB1c2VySWQ6IHMgfSkgPT4gYGpzb24vcmVhbG1zLyR7ZX0vdXNlcnMvJHtzfS9kZXZpY2VzLzJmYS9vYXRoP19xdWVyeUZpbHRlcj10cnVlYFxuICAgIH0pLFxuICAgIGRlbGV0ZU9hdGhEZXZpY2U6IHQubXV0YXRpb24oe1xuICAgICAgcXVlcnk6ICh7IHJlYWxtOiBlID0gciwgdXNlcklkOiBzLCBkZXZpY2U6IHUgfSkgPT4gKHtcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICB1cmw6IGBqc29uL3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy8yZmEvb2F0aC8ke3UudXVpZH1gLFxuICAgICAgICBib2R5OiB1XG4gICAgICB9KVxuICAgIH0pLFxuICAgIC8vIHB1c2ggZGV2aWNlXG4gICAgZ2V0UHVzaERldmljZXM6IHQucXVlcnkoe1xuICAgICAgcXVlcnk6ICh7IHJlYWxtOiBlID0gciwgdXNlcklkOiBzIH0pID0+IGAvanNvbi9yZWFsbXMvJHtlfS91c2Vycy8ke3N9L2RldmljZXMvMmZhL3B1c2g/X3F1ZXJ5RmlsdGVyPXRydWVgXG4gICAgfSksXG4gICAgZGVsZXRlUHVzaERldmljZTogdC5tdXRhdGlvbih7XG4gICAgICBxdWVyeTogKHsgcmVhbG06IGUgPSByLCB1c2VySWQ6IHMsIGRldmljZTogdSB9KSA9PiAoe1xuICAgICAgICB1cmw6IGAvanNvbi9yZWFsbXMvJHtlfS91c2Vycy8ke3N9L2RldmljZXMvMmZhL3B1c2gvJHt1LnV1aWR9YCxcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBib2R5OiB7fVxuICAgICAgfSlcbiAgICB9KSxcbiAgICAvLyB3ZWJhdXRobiBkZXZpY2VzXG4gICAgZ2V0V2ViQXV0aG5EZXZpY2VzOiB0LnF1ZXJ5KHtcbiAgICAgIHF1ZXJ5OiAoeyByZWFsbTogZSA9IHIsIHVzZXJJZDogcyB9KSA9PiBgL2pzb24vcmVhbG1zLyR7ZX0vdXNlcnMvJHtzfS9kZXZpY2VzLzJmYS93ZWJhdXRobj9fcXVlcnlGaWx0ZXI9dHJ1ZWBcbiAgICB9KSxcbiAgICB1cGRhdGVXZWJBdXRobkRldmljZU5hbWU6IHQubXV0YXRpb24oe1xuICAgICAgcXVlcnk6ICh7IHJlYWxtOiBlID0gciwgdXNlcklkOiBzLCBkZXZpY2U6IHUgfSkgPT4gKHtcbiAgICAgICAgdXJsOiBgL2pzb24vcmVhbG1zLyR7ZX0vdXNlcnMvJHtzfS9kZXZpY2VzLzJmYS93ZWJhdXRobi8ke3UudXVpZH1gLFxuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGJvZHk6IHVcbiAgICAgIH0pXG4gICAgfSksXG4gICAgZGVsZXRlV2ViQXV0aG5EZXZpY2VOYW1lOiB0Lm11dGF0aW9uKHtcbiAgICAgIHF1ZXJ5OiAoeyByZWFsbTogZSA9IHIsIHVzZXJJZDogcywgZGV2aWNlOiB1IH0pID0+ICh7XG4gICAgICAgIHVybDogYC9qc29uL3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy8yZmEvd2ViYXV0aG4vJHt1LnV1aWR9YCxcbiAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICBib2R5OiB1XG4gICAgICB9KVxuICAgIH0pLFxuICAgIGdldEJvdW5kRGV2aWNlczogdC5tdXRhdGlvbih7XG4gICAgICBxdWVyeTogKHsgcmVhbG06IGUgPSByLCB1c2VySWQ6IHMgfSkgPT4gYC9qc29uL3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy8yZmEvYmluZGluZz9fcXVlcnlGaWx0ZXI9dHJ1ZWBcbiAgICB9KSxcbiAgICB1cGRhdGVCb3VuZERldmljZTogdC5tdXRhdGlvbih7XG4gICAgICBxdWVyeTogKHsgcmVhbG06IGUgPSByLCB1c2VySWQ6IHMsIGRldmljZTogdSB9KSA9PiAoe1xuICAgICAgICB1cmw6IGAvanNvbi9yZWFsbXMvcm9vdC9yZWFsbXMvJHtlfS91c2Vycy8ke3N9L2RldmljZXMvMmZhL2JpbmRpbmcvJHt1LnV1aWR9YCxcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBib2R5OiB1XG4gICAgICB9KVxuICAgIH0pLFxuICAgIGRlbGV0ZUJvdW5kRGV2aWNlOiB0Lm11dGF0aW9uKHtcbiAgICAgIHF1ZXJ5OiAoeyByZWFsbTogZSA9IHIsIHVzZXJJZDogcywgZGV2aWNlOiB1IH0pID0+ICh7XG4gICAgICAgIHVybDogYC9qc29uL3JlYWxtcy9yb290L3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy8yZmEvYmluZGluZy8ke3UudXVpZH1gLFxuICAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAgIGJvZHk6IHVcbiAgICAgIH0pXG4gICAgfSksXG4gICAgZ2V0RGV2aWNlUHJvZmlsZXM6IHQucXVlcnkoe1xuICAgICAgcXVlcnk6ICh7IHJlYWxtOiBlID0gciwgdXNlcklkOiBzIH0pID0+IGBqc29uL3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy9wcm9maWxlP19xdWVyeUZpbHRlcj10cnVlYFxuICAgIH0pLFxuICAgIHVwZGF0ZURldmljZVByb2ZpbGU6IHQubXV0YXRpb24oe1xuICAgICAgcXVlcnk6ICh7IHJlYWxtOiBlID0gciwgdXNlcklkOiBzLCBkZXZpY2U6IHUgfSkgPT4gKHtcbiAgICAgICAgdXJsOiBganNvbi9yZWFsbXMvJHtlfS91c2Vycy8ke3N9L2RldmljZXMvcHJvZmlsZS8ke3UuaWRlbnRpZmllcn1gLFxuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGJvZHk6IHVcbiAgICAgIH0pXG4gICAgfSksXG4gICAgZGVsZXRlRGV2aWNlUHJvZmlsZTogdC5tdXRhdGlvbih7XG4gICAgICBxdWVyeTogKHsgcmVhbG06IGUgPSByLCB1c2VySWQ6IHMsIGRldmljZTogdSB9KSA9PiAoe1xuICAgICAgICB1cmw6IGBqc29uL3JlYWxtcy8ke2V9L3VzZXJzLyR7c30vZGV2aWNlcy9wcm9maWxlLyR7dS5pZGVudGlmaWVyfWAsXG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgYm9keTogdVxuICAgICAgfSlcbiAgICB9KVxuICB9KVxufSk7XG5leHBvcnQge1xuICBjIGFzIGRldmljZVNlcnZpY2Vcbn07XG4iLCJpbXBvcnQgeyBjb25maWd1cmVTdG9yZSBhcyBjIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcbmltcG9ydCB7IGRldmljZVNlcnZpY2UgYXMgZCB9IGZyb20gXCIuL3NlcnZpY2VzL2luZGV4LmpzXCI7XG5jb25zdCBwID0gKG4pID0+IHtcbiAgY29uc3QgeyBtaWRkbGV3YXJlOiBpLCByZWR1Y2VyUGF0aDogbywgcmVkdWNlcjogcywgZW5kcG9pbnRzOiByIH0gPSBkKHtcbiAgICBiYXNlVXJsOiBuLnNlcnZlckNvbmZpZz8uYmFzZVVybCA/PyBcIlwiLFxuICAgIHJlYWxtUGF0aDogbj8ucmVhbG1QYXRoID8/IFwiXCJcbiAgfSksIGEgPSBjKHtcbiAgICByZWR1Y2VyOiB7XG4gICAgICBbb106IHNcbiAgICB9LFxuICAgIG1pZGRsZXdhcmU6IChlKSA9PiBlKCkuY29uY2F0KGkpXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIE9hdGggZGV2aWNlIG1hbmFnZW1lbnQgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtPYXRoTWFuYWdlbWVudH1cbiAgICAgKi9cbiAgICBvYXRoOiB7XG4gICAgICAvKipcbiAgICAgICAqIFJldHJpZXZlcyBPYXRoIGRldmljZXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBxdWVyeS5cbiAgICAgICAqXG4gICAgICAgKiBAYXN5bmNcbiAgICAgICAqIEBmdW5jdGlvbiBnZXRcbiAgICAgICAqIEBwYXJhbSB7UmV0cmlldmVPYXRoUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHVzZWQgdG8gcmV0cmlldmUgT2F0aCBkZXZpY2VzLlxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8T0F0aFJlc3BvbnNlIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRhdGEgb3IgYW4gZXJyb3Igb2JqZWN0IGlmIHRoZSByZXNwb25zZSBpcyBub3QgdmFsaWQuXG4gICAgICAgKi9cbiAgICAgIGdldDogYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCBhLmRpc3BhdGNoKHIuZ2V0T0F0aERldmljZXMuaW5pdGlhdGUoZSkpO1xuICAgICAgICAgIGlmICghdCB8fCAhdC5kYXRhIHx8ICF0LmRhdGEucmVzdWx0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGRhdGFcIik7XG4gICAgICAgICAgcmV0dXJuIHQuZGF0YS5yZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogdCB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGFuIE9hdGggZGV2aWNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBhbmQgZGV2aWNlIGluZm9ybWF0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEBhc3luY1xuICAgICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxuICAgICAgICogQHBhcmFtIHtEZWxldGVPYXRoUXVlcnkgJiBPYXRoRGV2aWNlfSBxdWVyeSAtIFRoZSBxdWVyeSBhbmQgZGV2aWNlIGluZm9ybWF0aW9uIHVzZWQgdG8gZGVsZXRlIHRoZSBPYXRoIGRldmljZS5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERlbGV0ZWRPYXRoRGV2aWNlIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzcG9uc2UgZGF0YSBvciBhbiBlcnJvciBvYmplY3QgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCB2YWxpZC5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF3YWl0IGEuZGlzcGF0Y2goci5kZWxldGVPYXRoRGV2aWNlLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogdCB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQdXNoIGRldmljZSBtYW5hZ2VtZW50IG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7UHVzaE1hbmFnZW1lbnR9XG4gICAgICovXG4gICAgcHVzaDoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXRyaWV2ZXMgUHVzaCBkZXZpY2VzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gZ2V0XG4gICAgICAgKiBAcGFyYW0ge1B1c2hEZXZpY2VRdWVyeX0gcXVlcnkgLSBUaGUgcXVlcnkgdXNlZCB0byByZXRyaWV2ZSBQdXNoIGRldmljZXMuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQdXNoRGV2aWNlW10gfCB7IGVycm9yOiB1bmtub3duIH0+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZGF0YSBvciBhbiBlcnJvciBvYmplY3QgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCB2YWxpZC5cbiAgICAgICAqL1xuICAgICAgZ2V0OiBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF3YWl0IGEuZGlzcGF0Y2goci5nZXRQdXNoRGV2aWNlcy5pbml0aWF0ZShlKSk7XG4gICAgICAgICAgaWYgKCF0IHx8ICF0LmRhdGEgfHwgIXQuZGF0YS5yZXN1bHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gZGF0YVwiKTtcbiAgICAgICAgICByZXR1cm4gdC5kYXRhLnJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0IH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSBQdXNoIGRldmljZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXG4gICAgICAgKiBAcGFyYW0ge0RlbGV0ZURldmljZVF1ZXJ5fSBxdWVyeSAtIFRoZSBxdWVyeSB1c2VkIHRvIGRlbGV0ZSB0aGUgUHVzaCBkZXZpY2UuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQdXNoRGV2aWNlIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzcG9uc2UgZGF0YSBvciBhbiBlcnJvciBvYmplY3QgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCB2YWxpZC5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF3YWl0IGEuZGlzcGF0Y2goci5kZWxldGVQdXNoRGV2aWNlLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogdCB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBXZWJBdXRobiBkZXZpY2UgbWFuYWdlbWVudCBtZXRob2RzLlxuICAgICAqXG4gICAgICogQHR5cGUge1dlYkF1dGhuTWFuYWdlbWVudH1cbiAgICAgKi9cbiAgICB3ZWJBdXRobjoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXRyaWV2ZXMgV2ViQXV0aG4gZGV2aWNlcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHF1ZXJ5LlxuICAgICAgICpcbiAgICAgICAqIEBhc3luY1xuICAgICAgICogQGZ1bmN0aW9uIGdldFxuICAgICAgICogQHBhcmFtIHtXZWJBdXRoblF1ZXJ5fSBxdWVyeSAtIFRoZSBxdWVyeSB1c2VkIHRvIHJldHJpZXZlIFdlYkF1dGhuIGRldmljZXMuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXZWJBdXRobkRldmljZXNSZXNwb25zZSB8IHsgZXJyb3I6IHVua25vd24gfT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkYXRhIG9yIGFuIGVycm9yIG9iamVjdCBpZiB0aGUgcmVzcG9uc2UgaXMgbm90IHZhbGlkLlxuICAgICAgICovXG4gICAgICBnZXQ6IGFzeW5jIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgYS5kaXNwYXRjaChyLmdldFdlYkF1dGhuRGV2aWNlcy5pbml0aWF0ZShlKSk7XG4gICAgICAgICAgaWYgKCF0IHx8ICF0LmRhdGEgfHwgIXQuZGF0YS5yZXN1bHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gZGF0YVwiKTtcbiAgICAgICAgICByZXR1cm4gdC5kYXRhLnJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0IH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZXMgdGhlIG5hbWUgb2YgYSBXZWJBdXRobiBkZXZpY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IGFuZCBib2R5LlxuICAgICAgICpcbiAgICAgICAqIEBhc3luY1xuICAgICAgICogQGZ1bmN0aW9uIHVwZGF0ZVxuICAgICAgICogQHBhcmFtIHtXZWJBdXRoblF1ZXJ5V2l0aFVVSUQgJiB7IGRldmljZTogV2ViQXV0aG5Cb2R5IH0gfSBxdWVyeSAtIFRoZSBxdWVyeSBhbmQgYm9keSB1c2VkIHRvIHVwZGF0ZSB0aGUgV2ViQXV0aG4gZGV2aWNlIG5hbWUuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVkV2ViQXV0aG5EZXZpY2UgfCB7IGVycm9yOiB1bmtub3duIH0+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBkYXRhIG9yIGFuIGVycm9yIG9iamVjdCBpZiB0aGUgcmVzcG9uc2UgaXMgbm90IHZhbGlkLlxuICAgICAgICovXG4gICAgICB1cGRhdGU6IGFzeW5jIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgYS5kaXNwYXRjaChyLnVwZGF0ZVdlYkF1dGhuRGV2aWNlTmFtZS5pbml0aWF0ZShlKSk7XG4gICAgICAgICAgaWYgKCF0IHx8ICF0LmRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gZGF0YVwiKTtcbiAgICAgICAgICByZXR1cm4gdC5kYXRhO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHQgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIFdlYkF1dGhuIGRldmljZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgYW5kIGJvZHkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXG4gICAgICAgKiBAcGFyYW0ge1dlYkF1dGhuUXVlcnlXaXRoVVVJRCAmIHsgZGV2aWNlOiBXZWJBdXRobkJvZHkgfSB9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IGFuZCBib2R5IHVzZWQgdG8gZGVsZXRlIHRoZSBXZWJBdXRobiBkZXZpY2UuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXZWJBdXRobkRldmljZSB8IHsgZXJyb3I6IHVua25vd24gfT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIGRhdGEgb3IgYW4gZXJyb3Igb2JqZWN0IGlmIHRoZSByZXNwb25zZSBpcyBub3QgdmFsaWQuXG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCBhLmRpc3BhdGNoKHIuZGVsZXRlV2ViQXV0aG5EZXZpY2VOYW1lLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogdCB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBCb3VuZCBkZXZpY2VzIG1hbmFnZW1lbnQgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtCb3VuZERldmljZXNNYW5hZ2VtZW50fVxuICAgICAqL1xuICAgIGJvdW5kOiB7XG4gICAgICAvKipcbiAgICAgICAqIFJldHJpZXZlcyBib3VuZCBkZXZpY2VzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gZ2V0XG4gICAgICAgKiBAcGFyYW0ge0JvdW5kRGV2aWNlUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHVzZWQgdG8gcmV0cmlldmUgYm91bmQgZGV2aWNlcy5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZVtdIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIGRhdGEgb3IgYW4gZXJyb3Igb2JqZWN0IGlmIHRoZSByZXNwb25zZSBpcyBub3QgdmFsaWQuXG4gICAgICAgKi9cbiAgICAgIGdldDogYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCBhLmRpc3BhdGNoKHIuZ2V0Qm91bmREZXZpY2VzLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSB8fCAhdC5kYXRhLnJlc3VsdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGEucmVzdWx0O1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHQgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIGJvdW5kIGRldmljZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXG4gICAgICAgKiBAcGFyYW0ge0JvdW5kRGV2aWNlUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHVzZWQgdG8gZGVsZXRlIHRoZSBib3VuZCBkZXZpY2UuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEZXZpY2UgfCB7IGVycm9yOiB1bmtub3duIH0+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXNwb25zZSBkYXRhIG9yIGFuIGVycm9yIG9iamVjdCBpZiB0aGUgcmVzcG9uc2UgaXMgbm90IHZhbGlkLlxuICAgICAgICovXG4gICAgICBkZWxldGU6IGFzeW5jIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgYS5kaXNwYXRjaChyLmRlbGV0ZUJvdW5kRGV2aWNlLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSB8fCAhdC5kYXRhLnJlc3VsdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGEucmVzdWx0O1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHQgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlcyB0aGUgbmFtZSBvZiBhIGJvdW5kIGRldmljZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkuXG4gICAgICAgKlxuICAgICAgICogQGFzeW5jXG4gICAgICAgKiBAZnVuY3Rpb24gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0ge0JvdW5kRGV2aWNlUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHVzZWQgdG8gdXBkYXRlIHRoZSBib3VuZCBkZXZpY2UgbmFtZS5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZSB8IHsgZXJyb3I6IHVua25vd24gfT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIGRhdGEgb3IgYW4gZXJyb3Igb2JqZWN0IGlmIHRoZSByZXNwb25zZSBpcyBub3QgdmFsaWQuXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZTogYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCBhLmRpc3BhdGNoKHIudXBkYXRlQm91bmREZXZpY2UuaW5pdGlhdGUoZSkpO1xuICAgICAgICAgIGlmICghdCB8fCAhdC5kYXRhKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGRhdGFcIik7XG4gICAgICAgICAgcmV0dXJuIHQuZGF0YTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHByb2ZpbGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogR2V0IHByb2ZpbGUgZGV2aWNlc1xuICAgICAgICpcbiAgICAgICAqIEBhc3luY1xuICAgICAgICogQGZ1bmN0aW9uIHVwZGF0ZVxuICAgICAgICogQHBhcmFtIHtHZXRQcm9maWxlRGV2aWNlfSBxdWVyeSAtIFRoZSBxdWVyeSB1c2VkIHRvIGdldCBwcm9maWxlIGRldmljZXNcbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZVtdIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzcG9uc2UgZGF0YSBvciBhbiBlcnJvciBvYmplY3QgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCB2YWxpZC5cbiAgICAgICAqL1xuICAgICAgZ2V0OiBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF3YWl0IGEuZGlzcGF0Y2goci5nZXREZXZpY2VQcm9maWxlcy5pbml0aWF0ZShlKSk7XG4gICAgICAgICAgaWYgKCF0IHx8ICF0LmRhdGEgfHwgIXQuZGF0YS5yZXN1bHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gZGF0YVwiKTtcbiAgICAgICAgICByZXR1cm4gdC5kYXRhLnJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0IH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEdldCBwcm9maWxlIGRldmljZXNcbiAgICAgICAqXG4gICAgICAgKiBAYXN5bmNcbiAgICAgICAqIEBmdW5jdGlvbiB1cGRhdGVcbiAgICAgICAqIEBwYXJhbSB7UHJvZmlsZURldmljZXNRdWVyeX0gcXVlcnkgLSBUaGUgcXVlcnkgdXNlZCB0byB1cGRhdGUgYSBwcm9maWxlIGRldmljZVxuICAgICAgICogQHJldHVybnMge1Byb21pc2U8UHJvZmlsZURldmljZSB8IHsgZXJyb3I6IHVua25vd24gfT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlc3BvbnNlIGRhdGEgb3Igb3IgYW4gZXJyb3Igb2JqZWN0IGlmIHRoZSByZXNwb25zZSBpcyBub3QgdmFsaWQuXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZTogYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCBhLmRpc3BhdGNoKHIudXBkYXRlRGV2aWNlUHJvZmlsZS5pbml0aWF0ZShlKSk7XG4gICAgICAgICAgaWYgKCF0IHx8ICF0LmRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gZGF0YVwiKTtcbiAgICAgICAgICByZXR1cm4gdC5kYXRhO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHQgfTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogR2V0IHByb2ZpbGUgZGV2aWNlc1xuICAgICAgICpcbiAgICAgICAqIEBhc3luY1xuICAgICAgICogQGZ1bmN0aW9uIHVwZGF0ZVxuICAgICAgICogQHBhcmFtIHtQcm9maWxlRGV2aWNlc1F1ZXJ5fSBxdWVyeSAtIFRoZSBxdWVyeSB1c2VkIHRvIHVwZGF0ZSBhIHByb2ZpbGUgZGV2aWNlXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcm9maWxlRGV2aWNlIHwgeyBlcnJvcjogdW5rbm93biB9Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzcG9uc2UgZGF0YSBvciBhbiBlcnJvciBvYmplY3QgaWYgdGhlIHJlc3BvbnNlIGlzIG5vdCB2YWxpZC5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiBhc3luYyBmdW5jdGlvbihlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF3YWl0IGEuZGlzcGF0Y2goci5kZWxldGVEZXZpY2VQcm9maWxlLmluaXRpYXRlKGUpKTtcbiAgICAgICAgICBpZiAoIXQgfHwgIXQuZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBkYXRhXCIpO1xuICAgICAgICAgIHJldHVybiB0LmRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogdCB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB7XG4gIHAgYXMgZGV2aWNlQ2xpZW50XG59O1xuIiwiY29uc3QgbyA9IFtcbiAgXCJ1c2VyQWdlbnRcIixcbiAgXCJhcHBOYW1lXCIsXG4gIFwiYXBwQ29kZU5hbWVcIixcbiAgXCJhcHBWZXJzaW9uXCIsXG4gIFwiYXBwTWlub3JWZXJzaW9uXCIsXG4gIFwiYnVpbGRJRFwiLFxuICBcInByb2R1Y3RcIixcbiAgXCJwcm9kdWN0U3ViXCIsXG4gIFwidmVuZG9yXCIsXG4gIFwidmVuZG9yU3ViXCIsXG4gIFwiYnJvd3Nlckxhbmd1YWdlXCJcbl0sIGEgPSBbXG4gIFwiZm9udE5hbWVzXCIsXG4gIFwiZGlzcGxheVByb3BzXCIsXG4gIFwiYnJvd3NlclByb3BzXCIsXG4gIFwiaGFyZHdhcmVQcm9wc1wiLFxuICBcInBsYXRmb3JtUHJvcHNcIlxuXSwgZSA9IDNlNCwgciA9IHtcbiAgbWFjOiBbXCJNYWNpbnRvc2hcIiwgXCJNYWNJbnRlbFwiLCBcIk1hY1BQQ1wiLCBcIk1hYzY4S1wiXSxcbiAgd2luZG93czogW1wiV2luMzJcIiwgXCJXaW42NFwiLCBcIldpbmRvd3NcIiwgXCJXaW5DRVwiXSxcbiAgaW9zOiBbXCJpUGhvbmVcIiwgXCJpUGFkXCIsIFwiaVBvZFwiXVxufSwgbiA9IFtcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwicGl4ZWxEZXB0aFwiLCBcIm9yaWVudGF0aW9uLmFuZ2xlXCJdLCBzID0gW1xuICBcImN1cnNpdmVcIixcbiAgXCJtb25vc3BhY2VcIixcbiAgXCJzZXJpZlwiLFxuICBcInNhbnMtc2VyaWZcIixcbiAgXCJmYW50YXN5XCIsXG4gIFwiQXJpYWxcIixcbiAgXCJBcmlhbCBCbGFja1wiLFxuICBcIkFyaWFsIE5hcnJvd1wiLFxuICBcIkFyaWFsIFJvdW5kZWQgTVQgQm9sZFwiLFxuICBcIkJvb2ttYW4gT2xkIFN0eWxlXCIsXG4gIFwiQnJhZGxleSBIYW5kIElUQ1wiLFxuICBcIkNlbnR1cnlcIixcbiAgXCJDZW50dXJ5IEdvdGhpY1wiLFxuICBcIkNvbWljIFNhbnMgTVNcIixcbiAgXCJDb3VyaWVyXCIsXG4gIFwiQ291cmllciBOZXdcIixcbiAgXCJHZW9yZ2lhXCIsXG4gIFwiR2VudGl1bVwiLFxuICBcIkltcGFjdFwiLFxuICBcIktpbmdcIixcbiAgXCJMdWNpZGEgQ29uc29sZVwiLFxuICBcIkxhbGl0XCIsXG4gIFwiTW9kZW5hXCIsXG4gIFwiTW9ub3R5cGUgQ29yc2l2YVwiLFxuICBcIlBhcHlydXNcIixcbiAgXCJUYWhvbWFcIixcbiAgXCJUZVhcIixcbiAgXCJUaW1lc1wiLFxuICBcIlRpbWVzIE5ldyBSb21hblwiLFxuICBcIlRyZWJ1Y2hldCBNU1wiLFxuICBcIlZlcmRhbmFcIixcbiAgXCJWZXJvbmFcIlxuXSwgaSA9IFtcbiAgXCJjcHVDbGFzc1wiLFxuICBcImRldmljZU1lbW9yeVwiLFxuICBcImhhcmR3YXJlQ29uY3VycmVuY3lcIixcbiAgXCJtYXhUb3VjaFBvaW50c1wiLFxuICBcIm9zY3B1XCJcbl0sIHQgPSBbXCJsYW5ndWFnZVwiLCBcInBsYXRmb3JtXCIsIFwidXNlckxhbmd1YWdlXCIsIFwic3lzdGVtTGFuZ3VhZ2VcIl07XG5leHBvcnQge1xuICBvIGFzIGJyb3dzZXJQcm9wcyxcbiAgYSBhcyBjb25maWd1cmFibGVDYXRlZ29yaWVzLFxuICBlIGFzIGRlbGF5LFxuICByIGFzIGRldmljZVBsYXRmb3JtcyxcbiAgbiBhcyBkaXNwbGF5UHJvcHMsXG4gIHMgYXMgZm9udE5hbWVzLFxuICBpIGFzIGhhcmR3YXJlUHJvcHMsXG4gIHQgYXMgcGxhdGZvcm1Qcm9wc1xufTtcbiIsImNsYXNzIHAge1xuICAvKipcbiAgICogQG1ldGhvZCByZWR1Y2VUb09iamVjdCAtIGdvZXMgb25lIHRvIHR3byBsZXZlbHMgaW50byBzb3VyY2UgdG8gY29sbGVjdCBhdHRyaWJ1dGVcbiAgICogQHBhcmFtIHByb3BzIC0gYXJyYXkgb2Ygc3RyaW5nczsgY2FuIHVzZSBkb3Qgbm90YXRpb24gZm9yIHR3byBsZXZlbCBsb29rdXBcbiAgICogQHBhcmFtIHNyYyAtIHNvdXJjZSBvZiBhdHRyaWJ1dGVzIHRvIGNoZWNrXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmVkdWNlVG9PYmplY3QobiwgdCkge1xuICAgIHJldHVybiBuLnJlZHVjZSgoZSwgbykgPT4ge1xuICAgICAgaWYgKG8uaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IGwgPSBvLnNwbGl0KFwiLlwiKSwgZCA9IGxbMF0sIGkgPSBsWzFdLCBzID0gdFtkXSAmJiB0W2RdW2ldO1xuICAgICAgICBlW2ldID0gcyA/PyBcIlwiO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGVbb10gPSB0W29dICE9IG51bGwgPyB0W29dIDogbnVsbDtcbiAgICAgIHJldHVybiBlO1xuICAgIH0sIHt9KTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCByZWR1Y2VUb1N0cmluZyAtIGdvZXMgb25lIGxldmVsIGludG8gc291cmNlIHRvIGNvbGxlY3QgYXR0cmlidXRlXG4gICAqIEBwYXJhbSBwcm9wcyAtIGFycmF5IG9mIHN0cmluZ3NcbiAgICogQHBhcmFtIHNyYyAtIHNvdXJjZSBvZiBhdHRyaWJ1dGVzIHRvIGNoZWNrXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmVkdWNlVG9TdHJpbmcobiwgdCkge1xuICAgIHJldHVybiBuLnJlZHVjZSgoZSwgbykgPT4gKGUgPSBgJHtlfSR7dFtvXS5maWxlbmFtZX07YCwgZSksIFwiXCIpO1xuICB9XG59XG5leHBvcnQge1xuICBwIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgciBmcm9tIFwiLi4vY29uZmlnL2luZGV4LmpzXCI7XG5jbGFzcyB0IHtcbiAgc3RhdGljIGVuYWJsZWQoKSB7XG4gICAgY29uc3QgeyBsb2dMZXZlbDogbyB9ID0gci5nZXQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9uZTogMCxcbiAgICAgIGVycm9yOiAyNSxcbiAgICAgIHdhcm46IDUwLFxuICAgICAgaW5mbzogNzUsXG4gICAgICBkZWJ1ZzogMTAwXG4gICAgfVtvXTtcbiAgfVxuICBzdGF0aWMgaW5mbyguLi5vKSB7XG4gICAgY29uc3QgeyBsb2dnZXI6IGUgfSA9IHIuZ2V0KCk7XG4gICAgdGhpcy5lbmFibGVkKCkgPj0gNTAgJiYgKGUgJiYgZS5pbmZvID8gZS5pbmZvKC4uLm8pIDogY29uc29sZS5pbmZvKC4uLm8pKTtcbiAgfVxuICBzdGF0aWMgd2FybiguLi5vKSB7XG4gICAgY29uc3QgeyBsb2dnZXI6IGUgfSA9IHIuZ2V0KCk7XG4gICAgdGhpcy5lbmFibGVkKCkgPj0gNTAgJiYgKGUgJiYgZS53YXJuID8gZS53YXJuKC4uLm8pIDogY29uc29sZS53YXJuKC4uLm8pKTtcbiAgfVxuICBzdGF0aWMgZXJyb3IoLi4ubykge1xuICAgIGNvbnN0IHsgbG9nZ2VyOiBlIH0gPSByLmdldCgpO1xuICAgIHRoaXMuZW5hYmxlZCgpID49IDI1ICYmIChlICYmIGUuZXJyb3IgPyBlLmVycm9yKC4uLm8pIDogY29uc29sZS5lcnJvciguLi5vKSk7XG4gIH1cbiAgc3RhdGljIGxvZyguLi5vKSB7XG4gICAgY29uc3QgeyBsb2dnZXI6IGUgfSA9IHIuZ2V0KCk7XG4gICAgdGhpcy5lbmFibGVkKCkgPj0gNzUgJiYgKGUgJiYgZS5sb2cgPyBlLmxvZyguLi5vKSA6IGNvbnNvbGUubG9nKC4uLm8pKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgdCBhcyBGUkxvZ2dlclxufTtcbiIsImltcG9ydCB7IGZvbnROYW1lcyBhcyBzLCBkZXZpY2VQbGF0Zm9ybXMgYXMgYywgZGlzcGxheVByb3BzIGFzIGQsIGJyb3dzZXJQcm9wcyBhcyBsLCBoYXJkd2FyZVByb3BzIGFzIGYsIHBsYXRmb3JtUHJvcHMgYXMgZywgY29uZmlndXJhYmxlQ2F0ZWdvcmllcyBhcyB1LCBkZWxheSBhcyBtIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCBwIGZyb20gXCIuL2NvbGxlY3Rvci5qc1wiO1xuaW1wb3J0IHsgRlJMb2dnZXIgYXMgbiB9IGZyb20gXCIuLi91dGlsL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHcgZnJvbSBcIi4uL2NvbmZpZy9pbmRleC5qc1wiO1xuY2xhc3MgTyBleHRlbmRzIHAge1xuICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgc3VwZXIoKSwgdGhpcy5jb25maWcgPSB7XG4gICAgICBmb250TmFtZXM6IHMsXG4gICAgICBkZXZpY2VQbGF0Zm9ybXM6IGMsXG4gICAgICBkaXNwbGF5UHJvcHM6IGQsXG4gICAgICBicm93c2VyUHJvcHM6IGwsXG4gICAgICBoYXJkd2FyZVByb3BzOiBmLFxuICAgICAgcGxhdGZvcm1Qcm9wczogZ1xuICAgIH0sIHQgJiYgT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgaWYgKCF1LmluY2x1ZGVzKGUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZXZpY2UgcHJvZmlsZSBjb25maWd1cmF0aW9uIGNhdGVnb3J5IGRvZXMgbm90IGV4aXN0LlwiKTtcbiAgICAgIHRoaXMuY29uZmlnW2VdID0gdFtlXTtcbiAgICB9KTtcbiAgfVxuICBnZXRCcm93c2VyTWV0YSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciA+IFwidVwiID8gKG4ud2FybihcIkNhbm5vdCBjb2xsZWN0IGJyb3dzZXIgbWV0YWRhdGEuIG5hdmlnYXRvciBpcyBub3QgZGVmaW5lZC5cIiksIHt9KSA6IHRoaXMucmVkdWNlVG9PYmplY3QodGhpcy5jb25maWcuYnJvd3NlclByb3BzLCBuYXZpZ2F0b3IpO1xuICB9XG4gIGdldEJyb3dzZXJQbHVnaW5zTmFtZXMoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgPCBcInVcIiAmJiBuYXZpZ2F0b3IucGx1Z2lucyA/IHRoaXMucmVkdWNlVG9TdHJpbmcoT2JqZWN0LmtleXMobmF2aWdhdG9yLnBsdWdpbnMpLCBuYXZpZ2F0b3IucGx1Z2lucykgOiAobi53YXJuKFwiQ2Fubm90IGNvbGxlY3QgYnJvd3NlciBwbHVnaW4gaW5mb3JtYXRpb24uIG5hdmlnYXRvci5wbHVnaW5zIGlzIG5vdCBkZWZpbmVkLlwiKSwgXCJcIik7XG4gIH1cbiAgZ2V0RGV2aWNlTmFtZSgpIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA+IFwidVwiKVxuICAgICAgcmV0dXJuIG4ud2FybihcIkNhbm5vdCBjb2xsZWN0IGRldmljZSBuYW1lLiBuYXZpZ2F0b3IgaXMgbm90IGRlZmluZWQuXCIpLCBcIlwiO1xuICAgIGNvbnN0IHQgPSBuYXZpZ2F0b3IudXNlckFnZW50LCBlID0gbmF2aWdhdG9yLnBsYXRmb3JtO1xuICAgIHN3aXRjaCAoITApIHtcbiAgICAgIGNhc2UgdGhpcy5jb25maWcuZGV2aWNlUGxhdGZvcm1zLm1hYy5pbmNsdWRlcyhlKTpcbiAgICAgICAgcmV0dXJuIFwiTWFjIChCcm93c2VyKVwiO1xuICAgICAgY2FzZSB0aGlzLmNvbmZpZy5kZXZpY2VQbGF0Zm9ybXMuaW9zLmluY2x1ZGVzKGUpOlxuICAgICAgICByZXR1cm4gYCR7ZX0gKEJyb3dzZXIpYDtcbiAgICAgIGNhc2UgdGhpcy5jb25maWcuZGV2aWNlUGxhdGZvcm1zLndpbmRvd3MuaW5jbHVkZXMoZSk6XG4gICAgICAgIHJldHVybiBcIldpbmRvd3MgKEJyb3dzZXIpXCI7XG4gICAgICBjYXNlICgvQW5kcm9pZC8udGVzdChlKSB8fCAvQW5kcm9pZC8udGVzdCh0KSk6XG4gICAgICAgIHJldHVybiBcIkFuZHJvaWQgKEJyb3dzZXIpXCI7XG4gICAgICBjYXNlICgvQ3JPUy8udGVzdCh0KSB8fCAvQ2hyb21lYm9vay8udGVzdCh0KSk6XG4gICAgICAgIHJldHVybiBcIkNocm9tZSBPUyAoQnJvd3NlcilcIjtcbiAgICAgIGNhc2UgL0xpbnV4Ly50ZXN0KGUpOlxuICAgICAgICByZXR1cm4gXCJMaW51eCAoQnJvd3NlcilcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtlIHx8IFwiVW5rbm93blwifSAoQnJvd3NlcilgO1xuICAgIH1cbiAgfVxuICBnZXREaXNwbGF5TWV0YSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNjcmVlbiA+IFwidVwiID8gKG4ud2FybihcIkNhbm5vdCBjb2xsZWN0IHNjcmVlbiBpbmZvcm1hdGlvbi4gc2NyZWVuIGlzIG5vdCBkZWZpbmVkLlwiKSwge30pIDogdGhpcy5yZWR1Y2VUb09iamVjdCh0aGlzLmNvbmZpZy5kaXNwbGF5UHJvcHMsIHNjcmVlbik7XG4gIH1cbiAgZ2V0SGFyZHdhcmVNZXRhKCkge1xuICAgIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yID4gXCJ1XCIgPyAobi53YXJuKFwiQ2Fubm90IGNvbGxlY3QgT1MgbWV0YWRhdGEuIE5hdmlnYXRvciBpcyBub3QgZGVmaW5lZC5cIiksIHt9KSA6IHRoaXMucmVkdWNlVG9PYmplY3QodGhpcy5jb25maWcuaGFyZHdhcmVQcm9wcywgbmF2aWdhdG9yKTtcbiAgfVxuICBnZXRJZGVudGlmaWVyKCkge1xuICAgIGNvbnN0IHQgPSBgJHt3LmdldCgpLnByZWZpeH0tRGV2aWNlSURgO1xuICAgIGlmICghKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0byA8IFwidVwiICYmIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykpXG4gICAgICByZXR1cm4gbi53YXJuKFwiQ2Fubm90IGdlbmVyYXRlIHByb2ZpbGUgSUQuIENyeXB0byBhbmQvb3IgZ2V0UmFuZG9tVmFsdWVzIGlzIG5vdCBzdXBwb3J0ZWQuXCIpLCBcIlwiO1xuICAgIGlmICghbG9jYWxTdG9yYWdlKVxuICAgICAgcmV0dXJuIG4ud2FybihcIkNhbm5vdCBzdG9yZSBwcm9maWxlIElELiBsb2NhbFN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZC5cIiksIFwiXCI7XG4gICAgbGV0IGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0KTtcbiAgICByZXR1cm4gZSB8fCAoZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMykpLmpvaW4oXCItXCIpLCBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0LCBlKSksIGU7XG4gIH1cbiAgZ2V0SW5zdGFsbGVkRm9udHMoKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA+IFwidVwiKVxuICAgICAgcmV0dXJuIG4ud2FybihcIkNhbm5vdCBjb2xsZWN0IGZvbnQgZGF0YS4gR2xvYmFsIGRvY3VtZW50IG9iamVjdCBpcyB1bmRlZmluZWQuXCIpLCBcIlwiO1xuICAgIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybiBuLndhcm4oXCJDYW5ub3QgY29sbGVjdCBmb250IGRhdGEuIEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjYW52YXMgZWxlbWVudFwiKSwgXCJcIjtcbiAgICBjb25zdCBlID0gdC5nZXRDb250ZXh0ICYmIHQuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybiBuLndhcm4oXCJDYW5ub3QgY29sbGVjdCBmb250IGRhdGEuIEJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCAyZCBjYW52YXMgY29udGV4dFwiKSwgXCJcIjtcbiAgICBjb25zdCBvID0gXCJhYmNkZWZnaGkwMTIzNDU2Nzg5XCI7XG4gICAgZS5mb250ID0gXCI3MnB4IENvbWljIFNhbnNcIjtcbiAgICBjb25zdCBpID0gZS5tZWFzdXJlVGV4dChvKS53aWR0aDtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZm9udE5hbWVzLnJlZHVjZSgociwgYSkgPT4gKGUuZm9udCA9IGA3MnB4ICR7YX0sIENvbWljIFNhbnNgLCBlLm1lYXN1cmVUZXh0KG8pLndpZHRoICE9PSBpICYmIChyID0gYCR7cn0ke2F9O2ApLCByKSwgXCJcIik7XG4gIH1cbiAgYXN5bmMgZ2V0TG9jYXRpb25Db29yZGluYXRlcygpIHtcbiAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciA8IFwidVwiICYmIG5hdmlnYXRvci5nZW9sb2NhdGlvbiA/IG5ldyBQcm9taXNlKGFzeW5jICh0KSA9PiB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAoZSkgPT4gdCh7XG4gICAgICAgICAgbGF0aXR1ZGU6IGUuY29vcmRzLmxhdGl0dWRlLFxuICAgICAgICAgIGxvbmdpdHVkZTogZS5jb29yZHMubG9uZ2l0dWRlXG4gICAgICAgIH0pLFxuICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgIG4ud2FybihcbiAgICAgICAgICAgIFwiQ2Fubm90IGNvbGxlY3QgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24uIFwiICsgZS5jb2RlICsgXCI6IFwiICsgZS5tZXNzYWdlXG4gICAgICAgICAgKSwgdCh7fSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6ICEwLFxuICAgICAgICAgIHRpbWVvdXQ6IG0sXG4gICAgICAgICAgbWF4aW11bUFnZTogMFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pIDogKG4ud2FybihcbiAgICAgIFwiQ2Fubm90IGNvbGxlY3QgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24uIG5hdmlnYXRvci5nZW9sb2NhdGlvbiBpcyBub3QgZGVmaW5lZC5cIlxuICAgICksIFByb21pc2UucmVzb2x2ZSh7fSkpO1xuICB9XG4gIGdldE9TTWV0YSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciA+IFwidVwiID8gKG4ud2FybihcIkNhbm5vdCBjb2xsZWN0IE9TIG1ldGFkYXRhLiBuYXZpZ2F0b3IgaXMgbm90IGRlZmluZWQuXCIpLCB7fSkgOiB0aGlzLnJlZHVjZVRvT2JqZWN0KHRoaXMuY29uZmlnLnBsYXRmb3JtUHJvcHMsIG5hdmlnYXRvcik7XG4gIH1cbiAgYXN5bmMgZ2V0UHJvZmlsZSh7IGxvY2F0aW9uOiB0LCBtZXRhZGF0YTogZSB9KSB7XG4gICAgY29uc3QgbyA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0SWRlbnRpZmllcigpXG4gICAgfTtcbiAgICByZXR1cm4gZSAmJiAoby5tZXRhZGF0YSA9IHtcbiAgICAgIGhhcmR3YXJlOiB7XG4gICAgICAgIC4uLnRoaXMuZ2V0SGFyZHdhcmVNZXRhKCksXG4gICAgICAgIGRpc3BsYXk6IHRoaXMuZ2V0RGlzcGxheU1ldGEoKVxuICAgICAgfSxcbiAgICAgIGJyb3dzZXI6IHtcbiAgICAgICAgLi4udGhpcy5nZXRCcm93c2VyTWV0YSgpLFxuICAgICAgICBwbHVnaW5zOiB0aGlzLmdldEJyb3dzZXJQbHVnaW5zTmFtZXMoKVxuICAgICAgfSxcbiAgICAgIHBsYXRmb3JtOiB7XG4gICAgICAgIC4uLnRoaXMuZ2V0T1NNZXRhKCksXG4gICAgICAgIGRldmljZU5hbWU6IHRoaXMuZ2V0RGV2aWNlTmFtZSgpLFxuICAgICAgICBmb250czogdGhpcy5nZXRJbnN0YWxsZWRGb250cygpLFxuICAgICAgICB0aW1lem9uZTogdGhpcy5nZXRUaW1lem9uZU9mZnNldCgpXG4gICAgICB9XG4gICAgfSksIHQgJiYgKG8ubG9jYXRpb24gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uQ29vcmRpbmF0ZXMoKSksIG87XG4gIH1cbiAgZ2V0VGltZXpvbmVPZmZzZXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbi53YXJuKFwiQ2Fubm90IGNvbGxlY3QgdGltZXpvbmUgaW5mb3JtYXRpb24uIGdldFRpbWV6b25lT2Zmc2V0IGlzIG5vdCBkZWZpbmVkLlwiKSwgbnVsbDtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIE8gYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB7IENhbGxiYWNrVHlwZSBhcyB1IH0gZnJvbSBcIi4uL2F1dGgvZW51bXMuanNcIjtcbmNsYXNzIGkge1xuICAvKipcbiAgICogQG1ldGhvZCBpc1FSQ29kZVN0ZXAgLSBkZXRlcm1pbmVzIGlmIHN0ZXAgY29udGFpbnMgUVIgQ29kZSBjYWxsYmFja3NcbiAgICogQHBhcmFtIHtGUlN0ZXB9IHN0ZXAgLSBzdGVwIG9iamVjdCBmcm9tIEFNIHJlc3BvbnNlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzUVJDb2RlU3RlcCh0KSB7XG4gICAgY29uc3QgZSA9IHQuZ2V0Q2FsbGJhY2tzT2ZUeXBlKHUuSGlkZGVuVmFsdWVDYWxsYmFjayk7XG4gICAgcmV0dXJuIGUubGVuZ3RoID09PSAwID8gITEgOiAhIXRoaXMuZ2V0UVJDb2RlVVJJQ2IoZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0UVJDb2RlRGF0YSAtIGdldHMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBRUiBDb2RlIGNhbGxiYWNrc1xuICAgKiBAcGFyYW0ge0ZSU3RlcH0gc3RlcCAtIHN0ZXAgb2JqZWN0IGZyb20gQU0gcmVzcG9uc2VcbiAgICogQHJldHVybnMge1FSQ29kZURhdGF9XG4gICAqL1xuICBzdGF0aWMgZ2V0UVJDb2RlRGF0YSh0KSB7XG4gICAgY29uc3QgZSA9IHQuZ2V0Q2FsbGJhY2tzT2ZUeXBlKHUuSGlkZGVuVmFsdWVDYWxsYmFjayk7XG4gICAgaWYgKGUubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlFSIENvZGUgc3RlcCBtdXN0IGNvbnRhaW4gYSBIaWRkZW5WYWx1ZUNhbGxiYWNrLiBVc2UgYEZSUVJDb2RlLmlzUVJDb2RlU3RlcGAgdG8gZ3VhcmQuXCJcbiAgICAgICk7XG4gICAgY29uc3QgYSA9IHRoaXMuZ2V0UVJDb2RlVVJJQ2IoZSksIHMgPSBhID8gYS5nZXRPdXRwdXRWYWx1ZShcInZhbHVlXCIpIDogXCJcIiwgbyA9IHR5cGVvZiBzID09IFwic3RyaW5nXCIgJiYgcy5pbmNsdWRlcyhcIm90cGF1dGg6Ly9cIikgPyBcIm90cFwiIDogXCJwdXNoXCIsIGwgPSB0LmdldENhbGxiYWNrc09mVHlwZSh1LlRleHRPdXRwdXRDYWxsYmFjaykuZmluZCgobikgPT4gbi5nZXRNZXNzYWdlVHlwZSgpICE9PSBcIjRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGwgPyBsLmdldE1lc3NhZ2UoKSA6IFwiXCIsXG4gICAgICB1c2U6IG8sXG4gICAgICB1cmk6IHR5cGVvZiBzID09IFwic3RyaW5nXCIgPyBzIDogXCJcIlxuICAgIH07XG4gIH1cbiAgc3RhdGljIGdldFFSQ29kZVVSSUNiKHQpIHtcbiAgICByZXR1cm4gdC5maW5kKChlKSA9PiB7XG4gICAgICBjb25zdCBhID0gZS5nZXRPdXRwdXRWYWx1ZShcInZhbHVlXCIpO1xuICAgICAgcmV0dXJuIHR5cGVvZiBhID09IFwic3RyaW5nXCIgPyBhPy5pbmNsdWRlcyhcIm90cGF1dGg6Ly9cIikgfHwgYT8uaW5jbHVkZXMoXCJwdXNoYXV0aDovL1wiKSA6ICExO1xuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBpIGFzIGRlZmF1bHRcbn07XG4iLCJmdW5jdGlvbiB0KGUpIHtcbiAgY29uc3QgciA9IGUubWF0Y2goL1xcc1tcXHdcXFddXCIoW1xcd10qKVxcXFwvZyk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHIpICYmIHIubWFwKChzKSA9PiB7XG4gICAgY29uc3QgYSA9IHMubWF0Y2goL1wiKFtcXHddKilcXFxcLyk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSkgPyBhWzFdIDogXCJcIjtcbiAgfSkgfHwgW107XG59XG5mdW5jdGlvbiBvKGUpIHtcbiAgcmV0dXJuIGU/Lm1hdGNoKC88ZW1cXHMqLio+XFxzKi4qPFxcL2VtPi9nKT8uWzBdPy5yZXBsYWNlKFwiPGVtPlwiLCBcIlwiKT8ucmVwbGFjZShcIjwvZW0+XCIsIFwiXCIpID8/IFwiTmV3IFNlY3VyaXR5IEtleVwiO1xufVxuZXhwb3J0IHtcbiAgbyBhcyBwYXJzZURldmljZU5hbWVUZXh0LFxuICB0IGFzIHBhcnNlRGlzcGxheVJlY292ZXJ5Q29kZXNUZXh0XG59O1xuIiwiaW1wb3J0IHsgQ2FsbGJhY2tUeXBlIGFzIHMgfSBmcm9tIFwiLi4vYXV0aC9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgcGFyc2VEZXZpY2VOYW1lVGV4dCBhcyBjLCBwYXJzZURpc3BsYXlSZWNvdmVyeUNvZGVzVGV4dCBhcyBsIH0gZnJvbSBcIi4vc2NyaXB0LXBhcnNlci5qc1wiO1xuY2xhc3MgcCB7XG4gIHN0YXRpYyBnZXREZXZpY2VOYW1lKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXREaXNwbGF5Q2FsbGJhY2soZSk/LmdldE91dHB1dEJ5TmFtZShcIm1lc3NhZ2VcIiwgXCJcIikgPz8gXCJcIjtcbiAgICByZXR1cm4gYyh0KTtcbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByZWNvdmVyeSBjb2RlcyBieSBwYXJzaW5nIHRoZSBKYXZhU2NyaXB0IG1lc3NhZ2UgdGV4dCBpbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybiBSZWNvdmVyeSBDb2RlIHZhbHVlcyBpbiBhcnJheVxuICAgKi9cbiAgc3RhdGljIGdldENvZGVzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXREaXNwbGF5Q2FsbGJhY2soZSk/LmdldE91dHB1dEJ5TmFtZShcIm1lc3NhZ2VcIiwgXCJcIik7XG4gICAgcmV0dXJuIGwodCB8fCBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gc3RlcCBpcyBhIERpc3BsYXkgUmVjb3ZlcnkgQ29kZXMgc3RlcC5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybiBJcyB0aGlzIHN0ZXAgYSBEaXNwbGF5IFJlY292ZXJ5IENvZGVzIHN0ZXBcbiAgICovXG4gIHN0YXRpYyBpc0Rpc3BsYXlTdGVwKGUpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldERpc3BsYXlDYWxsYmFjayhlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcmVjb3ZlcnkgY29kZXMgc3RlcC5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybiBnZXRzIHRoZSBEaXNwbGF5IFJlY292ZXJ5IENvZGVzJyBjYWxsYmFja1xuICAgKi9cbiAgc3RhdGljIGdldERpc3BsYXlDYWxsYmFjayhlKSB7XG4gICAgcmV0dXJuIGUuZ2V0Q2FsbGJhY2tzT2ZUeXBlKHMuVGV4dE91dHB1dENhbGxiYWNrKS5maW5kKCh0KSA9PiB7XG4gICAgICBjb25zdCBhID0gdC5nZXRPdXRwdXRCeU5hbWUoXCJtZXNzYWdlXCIsIHZvaWQgMCk7XG4gICAgICByZXR1cm4gYSAmJiAoYS5pbmNsdWRlcyhcIlJlY292ZXJ5IENvZGVzXCIpIHx8IGEuaW5jbHVkZXMoXCJyZWNvdmVyeSBjb2Rlc1wiKSk7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHAgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCByIGZyb20gXCIuLi9jb25maWcvaW5kZXguanNcIjtcbmNsYXNzIG4ge1xuICAvKipcbiAgICogUmV0cmlldmUgdG9rZW5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldCh0KSB7XG4gICAgY29uc3QgZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGAke3IuZ2V0KCkucHJlZml4fS0ke3R9YCk7XG4gICAgaWYgKGUpXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlIHx8IFwiXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB0b2tlbiBvYmplY3QgZnJvbSBsb2NhbFN0b3JhZ2VcIik7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNhdmVzIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzZXQodCwgZSkge1xuICAgIGNvbnN0IG8gPSBKU09OLnN0cmluZ2lmeShlKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtyLmdldCgpLnByZWZpeH0tJHt0fWAsIG8pO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIHN0b3JlZCB0b2tlbnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVtb3ZlKHQpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtyLmdldCgpLnByZWZpeH0tJHt0fWApO1xuICB9XG59XG5leHBvcnQge1xuICBuIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgciBmcm9tIFwiLi4vY29uZmlnL2luZGV4LmpzXCI7XG5jbGFzcyBhIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXQoZSkge1xuICAgIGNvbnN0IHQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGAke3IuZ2V0KCkucHJlZml4fS0ke2V9YCk7XG4gICAgaWYgKHQpXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0IHx8IFwiXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBwYXJzZSB0b2tlbiBmcm9tIHNlc3Npb25TdG9yYWdlXCIpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBTYXZlcyB0b2tlbnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2V0KGUsIHQpIHtcbiAgICBjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkodCk7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgJHtyLmdldCgpLnByZWZpeH0tJHtlfWAsIHMpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIHN0b3JlZCB0b2tlbnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVtb3ZlKGUpIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGAke3IuZ2V0KCkucHJlZml4fS0ke2V9YCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGEgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCBhIGZyb20gXCIuLi9jb25maWcvaW5kZXguanNcIjtcbmltcG9ydCB7IEZSTG9nZ2VyIGFzIG4gfSBmcm9tIFwiLi4vdXRpbC9sb2dnZXIuanNcIjtcbmltcG9ydCBpIGZyb20gXCIuL2xvY2FsLXN0b3JhZ2UuanNcIjtcbmltcG9ydCBvIGZyb20gXCIuL3Nlc3Npb24tc3RvcmFnZS5qc1wiO1xuY2xhc3MgZCB7XG4gIC8qKlxuICAgKiBHZXRzIHN0b3JlZCB0b2tlbnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0KCkge1xuICAgIGNvbnN0IHsgY2xpZW50SWQ6IHQsIHRva2VuU3RvcmU6IGUgfSA9IHRoaXMuZ2V0Q2xpZW50Q29uZmlnKCk7XG4gICAgaWYgKGUgPT09IFwic2Vzc2lvblN0b3JhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBvLmdldCh0KTtcbiAgICBpZiAoZSA9PT0gXCJsb2NhbFN0b3JhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBpLmdldCh0KTtcbiAgICBpZiAoZSA9PT0gXCJpbmRleGVkREJcIilcbiAgICAgIG4ud2FybihcIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbi5cIik7XG4gICAgZWxzZSBpZiAoZSAmJiBlLmdldClcbiAgICAgIHJldHVybiBhd2FpdCBlLmdldCh0KTtcbiAgICByZXR1cm4gYXdhaXQgaS5nZXQodCk7XG4gIH1cbiAgLyoqXG4gICAqIFNhdmVzIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzZXQodCkge1xuICAgIGNvbnN0IHsgY2xpZW50SWQ6IGUsIHRva2VuU3RvcmU6IHIgfSA9IHRoaXMuZ2V0Q2xpZW50Q29uZmlnKCk7XG4gICAgaWYgKHIgPT09IFwic2Vzc2lvblN0b3JhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBvLnNldChlLCB0KTtcbiAgICBpZiAociA9PT0gXCJsb2NhbFN0b3JhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBpLnNldChlLCB0KTtcbiAgICBpZiAociA9PT0gXCJpbmRleGVkREJcIilcbiAgICAgIG4ud2FybihcIkluZGV4ZWREQiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbi5cIik7XG4gICAgZWxzZSBpZiAociAmJiByLnNldClcbiAgICAgIHJldHVybiBhd2FpdCByLnNldChlLCB0KTtcbiAgICByZXR1cm4gYXdhaXQgaS5zZXQoZSwgdCk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgc3RvcmVkIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZW1vdmUoKSB7XG4gICAgY29uc3QgeyBjbGllbnRJZDogdCwgdG9rZW5TdG9yZTogZSB9ID0gdGhpcy5nZXRDbGllbnRDb25maWcoKTtcbiAgICBpZiAoZSA9PT0gXCJzZXNzaW9uU3RvcmFnZVwiKVxuICAgICAgcmV0dXJuIGF3YWl0IG8ucmVtb3ZlKHQpO1xuICAgIGlmIChlID09PSBcImxvY2FsU3RvcmFnZVwiKVxuICAgICAgcmV0dXJuIGF3YWl0IGkucmVtb3ZlKHQpO1xuICAgIGlmIChlID09PSBcImluZGV4ZWREQlwiKVxuICAgICAgbi53YXJuKFwiSW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uLlwiKTtcbiAgICBlbHNlIGlmIChlICYmIGUucmVtb3ZlKVxuICAgICAgcmV0dXJuIGF3YWl0IGUucmVtb3ZlKHQpO1xuICAgIHJldHVybiBhd2FpdCBpLnJlbW92ZSh0KTtcbiAgfVxuICBzdGF0aWMgZ2V0Q2xpZW50Q29uZmlnKCkge1xuICAgIGNvbnN0IHsgY2xpZW50SWQ6IHQgPSBcInVuY29uZmlndXJlZENsaWVudFwiLCB0b2tlblN0b3JlOiBlID0gXCJsb2NhbFN0b3JhZ2VcIiB9ID0gYS5nZXQoKTtcbiAgICByZXR1cm4geyBjbGllbnRJZDogdCwgdG9rZW5TdG9yZTogZSB9O1xuICB9XG59XG5leHBvcnQge1xuICBkIGFzIGRlZmF1bHRcbn07XG4iLCJmdW5jdGlvbiBvKHQpIHtcbiAgcmV0dXJuIHQub2sgfHwgTWF0aC5mbG9vcih0LnN0YXR1cyAvIDEwMCkgPT09IDQ7XG59XG5leHBvcnQge1xuICBvIGFzIGlzT2tPcjR4eFxufTtcbiIsImNsYXNzIGMge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHJhbmRvbSBzdGF0ZS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVSYW5kb21TdHJpbmcoMTYpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcmFuZG9tIHZlcmlmaWVyLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVZlcmlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVJhbmRvbVN0cmluZygzMik7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTSEEtMjU2IGhhc2ggb2YgdGhlIHZlcmlmaWVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyaWZpZXIgVGhlIHZlcmlmaWVyIHRvIGhhc2hcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVDaGFsbGVuZ2UoZSkge1xuICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnNoYTI1NihlKTtcbiAgICByZXR1cm4gdGhpcy5iYXNlNjRVcmxFbmNvZGUodCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBiYXNlNjQgZW5jb2RlZCwgVVJMLWZyaWVuZGx5IHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSBvZiBudW1iZXJzIHRvIGVuY29kZVxuICAgKi9cbiAgc3RhdGljIGJhc2U2NFVybEVuY29kZShlKSB7XG4gICAgY29uc3QgdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpO1xuICAgIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdCkpLnJlcGxhY2UoL1xcKy9nLCBcIi1cIikucmVwbGFjZSgvXFwvL2csIFwiX1wiKS5yZXBsYWNlKC89L2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgU0hBLTI1NiBoYXNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBoYXNoXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2hhMjU2KGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpLCBhID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXCJTSEEtMjU2XCIsIHQpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShhKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJhbmRvbSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgZm9yIGVudHJvcHkgKGRlZmF1bHQ6IDMyKVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVJhbmRvbVN0cmluZyhlID0gMzIpIHtcbiAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModCksIGJ0b2EodC5qb2luKFwiXCIpKS5yZXBsYWNlKC9bXmEtekEtWjAtOV0rLywgXCJcIik7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGMgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB7IEFjdGlvblR5cGVzIGFzIGwgfSBmcm9tIFwiLi4vY29uZmlnL2VudW1zLmpzXCI7XG5pbXBvcnQgZiBmcm9tIFwiLi4vY29uZmlnL2luZGV4LmpzXCI7XG5pbXBvcnQgbSBmcm9tIFwiLi4vdG9rZW4tc3RvcmFnZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaXNPa09yNHh4IGFzIGsgfSBmcm9tIFwiLi4vdXRpbC9odHRwLmpzXCI7XG5pbXBvcnQgdiBmcm9tIFwiLi4vdXRpbC9wa2NlLmpzXCI7XG5pbXBvcnQgeyB3aXRoVGltZW91dCBhcyBfIH0gZnJvbSBcIi4uL3V0aWwvdGltZW91dC5qc1wiO1xuaW1wb3J0IHsgc3RyaW5naWZ5IGFzIHAsIGdldEVuZHBvaW50UGF0aCBhcyBFLCByZXNvbHZlIGFzIEEgfSBmcm9tIFwiLi4vdXRpbC91cmwuanNcIjtcbmltcG9ydCBUIGZyb20gXCIuLi91dGlsL21pZGRsZXdhcmUuanNcIjtcbmNvbnN0IFUgPSB7XG4gIC8vIEFNIGVycm9yIGZvciBjb25zZW50IHJlcXVpcmVtZW50XG4gIEF1dGhlbnRpY2F0aW9uQ29uc2VudFJlcXVpcmVkOiBcIkF1dGhlbnRpY2F0aW9uIG9yIGNvbnNlbnQgcmVxdWlyZWRcIixcbiAgLy8gUGluZyBmZWRlcmF0ZSBjb25zZW50IHJlcXVpcmVtZW50XG4gIEF1dGhlbnRpY2F0aW9uSXNSZXF1aXJlZDogXCJBdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZC5cIixcbiAgLy8gTWFudWFsIGlmcmFtZSBlcnJvclxuICBBdXRob3JpemF0aW9uVGltZW91dDogXCJBdXRob3JpemF0aW9uIHRpbWVkIG91dFwiLFxuICAvLyBDaHJvbWl1bSBicm93c2VyIGVycm9yXG4gIEZhaWxlZFRvRmV0Y2g6IFwiRmFpbGVkIHRvIGZldGNoXCIsXG4gIC8vIE1vemlsbGEgYnJvd3NlciBlcnJvclxuICBOZXR3b3JrRXJyb3I6IFwiTmV0d29ya0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZS5cIixcbiAgLy8gV2Via2l0IGJyb3dzZXIgZXJyb3JcbiAgQ09SU0Vycm9yOiBcIkNyb3NzLW9yaWdpbiByZWRpcmVjdGlvblwiLFxuICAvLyBwcm9tcHQ9bm9uZSBlcnJvcnNcbiAgSW50ZXJhY3Rpb25Ob3RBbGxvd2VkOiBcIlRoZSByZXF1ZXN0IHJlcXVpcmVzIHNvbWUgaW50ZXJhY3Rpb24gdGhhdCBpcyBub3QgYWxsb3dlZC5cIixcbiAgLy8gUGluZ09uZSBsb2dpbiBlcnJvclxuICBMb2dpblJlcXVpcmVkOiBcIlVzZXIgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWRcIixcbiAgUmVxdWVzdFJlcXVpcmVzQ29uc2VudDogXCJUaGUgcmVxdWVzdCByZXF1aXJlcyBjb25zZW50LlwiXG59O1xuY2xhc3MgYiB7XG4gIHN0YXRpYyBhc3luYyBjcmVhdGVBdXRob3JpemVVcmwoZSkge1xuICAgIGNvbnN0IHsgY2xpZW50SWQ6IG8sIG1pZGRsZXdhcmU6IHMsIHJlZGlyZWN0VXJpOiB0LCBzY29wZTogbiB9ID0gZi5nZXQoZSksIHIgPSB7XG4gICAgICAuLi5lLnF1ZXJ5LFxuICAgICAgY2xpZW50X2lkOiBvLFxuICAgICAgcmVkaXJlY3RfdXJpOiB0LFxuICAgICAgcmVzcG9uc2VfdHlwZTogZS5yZXNwb25zZVR5cGUsXG4gICAgICBzY29wZTogbixcbiAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgLi4uZS5wcm9tcHQgPyB7IHByb21wdDogZS5wcm9tcHQgfSA6IHt9XG4gICAgfTtcbiAgICBpZiAoZS52ZXJpZmllcikge1xuICAgICAgY29uc3QgYSA9IGF3YWl0IHYuY3JlYXRlQ2hhbGxlbmdlKGUudmVyaWZpZXIpO1xuICAgICAgci5jb2RlX2NoYWxsZW5nZSA9IGEsIHIuY29kZV9jaGFsbGVuZ2VfbWV0aG9kID0gXCJTMjU2XCI7XG4gICAgfVxuICAgIGNvbnN0IGkgPSBUKFxuICAgICAge1xuICAgICAgICB1cmw6IG5ldyBVUkwodGhpcy5nZXRVcmwoXCJhdXRob3JpemVcIiwgciwgZSkpLFxuICAgICAgICBpbml0OiB7fVxuICAgICAgfSxcbiAgICAgIHsgdHlwZTogbC5BdXRob3JpemUgfVxuICAgICksIHsgdXJsOiBjIH0gPSBpKHMpO1xuICAgIHJldHVybiBjLnRvU3RyaW5nKCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBhdXRob3JpemUgVVJMIHdpdGggYW4gaWZyYW1lLiBJZiBzdWNjZXNzZnVsLFxuICAgKiBpdCByZXR1cm5zIHRoZSBjYWxsYmFjayBVUkwgd2l0aCBhdXRoZW50aWNhdGlvbiBjb2RlLFxuICAgKiBvcHRpb25hbGx5IHVzaW5nIFBLQ0UuXG4gICAqIE1ldGhvZCByZW5hbWVkIGluIHYzLlxuICAgKiBPcmlnaW5hbCBOYW1lOiBnZXRBdXRob3JpemVVcmxcbiAgICogTmV3IE5hbWU6IGdldEF1dGhDb2RlQnlJZnJhbWVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRBdXRoQ29kZUJ5SWZyYW1lKGUpIHtcbiAgICBjb25zdCBvID0gYXdhaXQgdGhpcy5jcmVhdGVBdXRob3JpemVVcmwoeyAuLi5lLCBwcm9tcHQ6IFwibm9uZVwiIH0pLCB7IHNlcnZlckNvbmZpZzogcyB9ID0gZi5nZXQoZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCBuKSA9PiB7XG4gICAgICBjb25zdCByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKSwgaSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICBsZXQgYyA9IGksIGEgPSBpLCBkID0gMDtcbiAgICAgIGEgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChkKSwgci5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCBjKSwgci5yZW1vdmUoKTtcbiAgICAgIH0sIGMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICBjb25zdCB1ID0gci5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgKHRoaXMuY29udGFpbnNBdXRoQ29kZSh1KSB8fCB0aGlzLmNvbnRhaW5zQXV0aEVycm9yKHUpKSAmJiAoYSgpLCB0KHUpKTtcbiAgICAgICAgfVxuICAgICAgfSwgZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBhKCksIG4obmV3IEVycm9yKFUuQXV0aG9yaXphdGlvblRpbWVvdXQpKTtcbiAgICAgIH0sIHMudGltZW91dCksIHIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiLCByLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGMpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHIpLCByLnNyYyA9IG87XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEV4Y2hhbmdlcyBhbiBhdXRob3JpemF0aW9uIGNvZGUgZm9yIE9BdXRoIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZXRPQXV0aDJUb2tlbnMoZSkge1xuICAgIGNvbnN0IHsgY2xpZW50SWQ6IG8sIHJlZGlyZWN0VXJpOiBzIH0gPSBmLmdldChlKSwgdCA9IHtcbiAgICAgIGNsaWVudF9pZDogbyxcbiAgICAgIGNvZGU6IGUuYXV0aG9yaXphdGlvbkNvZGUsXG4gICAgICBncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuICAgICAgcmVkaXJlY3RfdXJpOiBzXG4gICAgfTtcbiAgICBlLnZlcmlmaWVyICYmICh0LmNvZGVfdmVyaWZpZXIgPSBlLnZlcmlmaWVyKTtcbiAgICBjb25zdCBuID0gcCh0KSwgciA9IHtcbiAgICAgIGJvZHk6IG4sXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogbi5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxuICAgICAgfSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgfSwgaSA9IGF3YWl0IHRoaXMucmVxdWVzdChcImFjY2Vzc1Rva2VuXCIsIHZvaWQgMCwgITEsIHIsIGUpLCBjID0gYXdhaXQgdGhpcy5nZXRCb2R5KGkpO1xuICAgIGlmIChpLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCB1ID0gdHlwZW9mIGMgPT0gXCJzdHJpbmdcIiA/IGBFeHBlY3RlZCAyMDAsIHJlY2VpdmVkICR7aS5zdGF0dXN9YCA6IHRoaXMucGFyc2VFcnJvcihjKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcih1KTtcbiAgICB9XG4gICAgY29uc3QgYSA9IGM7XG4gICAgaWYgKCFhLmFjY2Vzc190b2tlbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY2VzcyB0b2tlbiBub3QgZm91bmQgaW4gcmVzcG9uc2VcIik7XG4gICAgbGV0IGQ7XG4gICAgcmV0dXJuIGEuZXhwaXJlc19pbiAmJiAoZCA9IERhdGUubm93KCkgKyBhLmV4cGlyZXNfaW4gKiAxZTMpLCB7XG4gICAgICBhY2Nlc3NUb2tlbjogYS5hY2Nlc3NfdG9rZW4sXG4gICAgICBpZFRva2VuOiBhLmlkX3Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiBhLnJlZnJlc2hfdG9rZW4sXG4gICAgICB0b2tlbkV4cGlyeTogZFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgT0lEQyB1c2VyIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldFVzZXJJbmZvKGUpIHtcbiAgICBjb25zdCBvID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwidXNlckluZm9cIiwgdm9pZCAwLCAhMCwgdm9pZCAwLCBlKTtcbiAgICBpZiAoby5zdGF0dXMgIT09IDIwMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyIGluZm87IHJlY2VpdmVkICR7by5zdGF0dXN9YCk7XG4gICAgcmV0dXJuIGF3YWl0IG8uanNvbigpO1xuICB9XG4gIC8qKlxuICAgKiBJbnZva2VzIHRoZSBPSURDIGVuZCBzZXNzaW9uIGVuZHBvaW50LlxuICAgKiBDYW4gcmVzdWx0IGluIGEgcmVkaXJlY3QgdG8gYC9zaWdub2ZmYCBpZiB1c2luZyBQaW5nT25lXG4gICAqIEl0J3MgYmVzdCB0byBleHBsaWNpdGx5IHByb3ZpZGUgdGhlIGxvZ291dCByZWRpcmVjdCBVUkwgaW4gb3B0aW9uc1xuICAgKlxuICAgKiBAZnVuY3Rpb24gZW5kU2Vzc2lvbiAtIGNhbGwgYXV0aG9yaXphdGlvbiBzZXJ2ZXIgdG8gZW5kIGFzc29jaWF0ZWQgc2Vzc2lvblxuICAgKiBAcGFyYW0gb3B0aW9ucyB7TG9nb3V0T3B0aW9uc30gLSBhbiBleHRlbnNpb24gb2YgQ29uZmlnT3B0aW9ucywgYnV0IHdpdGggdHdvIGFkZGl0aW9uYWwgcHJvcHNcbiAgICogQHBhcmFtIG9wdGlvbnMubG9nb3V0UmVkaXJlY3RVcmkge3N0cmluZ30gLSB0aGUgVVJMIHlvdSB3YW50IHRoZSBBUyB0byByZWRpcmVjdCB0byBhZnRlciBzaWdub3V0XG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGlyZWN0IHtib29sZWFufSAtIHRvIGV4cGxpY2l0bHkgZGVhY3RpdmF0ZSByZWRpcmVjdCwgcGFzcyBgZmFsc2VgXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZW5kU2Vzc2lvbihlKSB7XG4gICAgY29uc3QgbyA9IHsgLi4uZSB9O1xuICAgIGRlbGV0ZSBvLnJlZGlyZWN0LCBkZWxldGUgby5sb2dvdXRSZWRpcmVjdFVyaTtcbiAgICBjb25zdCBzID0ge30sIHQgPSBhd2FpdCBtLmdldCgpO1xuICAgIHMuaWRfdG9rZW5faGludCA9IHQgJiYgdC5pZFRva2VuIHx8IChlICYmIFwiaWRUb2tlblwiIGluIGUgPyBlLmlkVG9rZW4gOiBcIlwiKTtcbiAgICBjb25zdCBuID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiZW5kU2Vzc2lvblwiLCBzLCAhMCwgdm9pZCAwLCBvLCB7XG4gICAgICByZWRpcmVjdDogZT8ucmVkaXJlY3QsXG4gICAgICBsb2dvdXRSZWRpcmVjdFVyaTogZT8ubG9nb3V0UmVkaXJlY3RVcmlcbiAgICB9KTtcbiAgICBpZiAoIWsobikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBlbmQgc2Vzc2lvbjsgcmVjZWl2ZWQgJHtuLnN0YXR1c31gKTtcbiAgICByZXR1cm4gbjtcbiAgfVxuICAvKipcbiAgICogSW1tZWRpYXRlbHkgcmV2b2tlcyB0aGUgc3RvcmVkIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXZva2VUb2tlbihlKSB7XG4gICAgY29uc3QgeyBjbGllbnRJZDogbyB9ID0gZi5nZXQoZSksIHMgPSBhd2FpdCBtLmdldCgpLCB0ID0gcyAmJiBzLmFjY2Vzc1Rva2VuLCBuID0ge1xuICAgICAgY2xpZW50X2lkOiBvXG4gICAgfTtcbiAgICB0ICYmIChuLnRva2VuID0gdCk7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIGJvZHk6IHAobiksXG4gICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIlxuICAgIH0sIGkgPSBhd2FpdCB0aGlzLnJlcXVlc3QoXCJyZXZva2VcIiwgdm9pZCAwLCAhMSwgciwgZSk7XG4gICAgaWYgKCFrKGkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV2b2tlIHRva2VuOyByZWNlaXZlZCAke2kuc3RhdHVzfWApO1xuICAgIHJldHVybiBpO1xuICB9XG4gIHN0YXRpYyBhc3luYyByZXF1ZXN0KGUsIG8sIHMsIHQsIG4sIHIpIHtcbiAgICBjb25zdCB7IHJlZGlyZWN0VXJpOiBpLCBtaWRkbGV3YXJlOiBjLCBzZXJ2ZXJDb25maWc6IGEgfSA9IGYuZ2V0KG4pLCBkID0gcj8ubG9nb3V0UmVkaXJlY3RVcmkgPyByLmxvZ291dFJlZGlyZWN0VXJpIDogaSwgdSA9IHRoaXMuZ2V0VXJsKGUsIG8sIG4pLCBnID0gKHcpID0+IHtcbiAgICAgIHN3aXRjaCAodykge1xuICAgICAgICBjYXNlIFwiYWNjZXNzVG9rZW5cIjpcbiAgICAgICAgICByZXR1cm4gbC5FeGNoYW5nZVRva2VuO1xuICAgICAgICBjYXNlIFwiZW5kU2Vzc2lvblwiOlxuICAgICAgICAgIHJldHVybiBsLkVuZFNlc3Npb247XG4gICAgICAgIGNhc2UgXCJyZXZva2VcIjpcbiAgICAgICAgICByZXR1cm4gbC5SZXZva2VUb2tlbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbC5Vc2VySW5mbztcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0ID0gdCB8fCB7fSwgdC5oZWFkZXJzID0gdC5oZWFkZXJzIHx8IG5ldyBIZWFkZXJzKCksIHQuaGVhZGVycy5zZXQoXCJBY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpLCBzKSB7XG4gICAgICBjb25zdCB3ID0gYXdhaXQgbS5nZXQoKSwgeSA9IHcgJiYgdy5hY2Nlc3NUb2tlbjtcbiAgICAgIHQuY3JlZGVudGlhbHMgPSBcImluY2x1ZGVcIiwgdC5oZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IGggPSBUKFxuICAgICAgeyB1cmw6IG5ldyBVUkwodSksIGluaXQ6IHQgfSxcbiAgICAgIHsgdHlwZTogZyhlKSB9XG4gICAgKShjKTtcbiAgICByZXR1cm4gZyhlKSA9PT0gbC5FbmRTZXNzaW9uICYmIC8vIGVuZFNlc3Npb24gYWN0aW9uIG9ubHlcbiAgICByPy5yZWRpcmVjdCA9PT0gITAgPyAoaC51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiLCBkIHx8IFwiXCIpLCB3aW5kb3cubG9jYXRpb24uYXNzaWduKGgudXJsLnRvU3RyaW5nKCkpLCBuZXcgUmVzcG9uc2UoKSkgOiBnKGUpID09PSBsLkVuZFNlc3Npb24gJiYgLy8gZW5kU2Vzc2lvbiBhY3Rpb24gb25seVxuICAgIHI/LnJlZGlyZWN0ICE9PSAhMSAmJiAvLyBPbmx5IGBmYWxzZWAgZXhwbGljaXRseSBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGZvciByYXJlIGVkZ2UgY2FzZXNcbiAgICAvLyBJZiB3ZSBleHBsaWNpdGx5IGdldCBhIGxvZ291dCByZWRpcmVjdCBVUkwsIHRoZW4gdGhhdCdzIGVub3VnaCBvZiBhIGhpbnQgdG8gcmVkaXJlY3RcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoYXQsIGxldCdzIHNlZSBpZiB0aGV5IGFyZSBjYWxsaW5nIHRoZSB0eXBpY2FsIFBpbmdPbmUgYC9zaWdub2ZmYCBlbmRwb2ludFxuICAgIChyPy5sb2dvdXRSZWRpcmVjdFVyaSB8fCB0aGlzLmdldFVybChcImVuZFNlc3Npb25cIikuaW5jbHVkZXMoXCIvYXMvc2lnbm9mZlwiKSkgPyAoaC51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiLCBkIHx8IFwiXCIpLCB3aW5kb3cubG9jYXRpb24uYXNzaWduKGgudXJsLnRvU3RyaW5nKCkpLCBuZXcgUmVzcG9uc2UoKSkgOiBhd2FpdCBfKGZldGNoKGgudXJsLnRvU3RyaW5nKCksIGguaW5pdCksIGEudGltZW91dCk7XG4gIH1cbiAgc3RhdGljIGNvbnRhaW5zQXV0aENvZGUoZSkge1xuICAgIHJldHVybiAhIWUgJiYgL2NvZGU9KFteJl0rKS8udGVzdChlKTtcbiAgfVxuICBzdGF0aWMgY29udGFpbnNBdXRoRXJyb3IoZSkge1xuICAgIHJldHVybiAhIWUgJiYgL2Vycm9yPShbXiZdKykvLnRlc3QoZSk7XG4gIH1cbiAgc3RhdGljIGFzeW5jIGdldEJvZHkoZSkge1xuICAgIGNvbnN0IG8gPSBlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO1xuICAgIHJldHVybiBvICYmIG8uaW5kZXhPZihcImFwcGxpY2F0aW9uL2pzb25cIikgPiAtMSA/IGF3YWl0IGUuanNvbigpIDogYXdhaXQgZS50ZXh0KCk7XG4gIH1cbiAgc3RhdGljIHBhcnNlRXJyb3IoZSkge1xuICAgIGlmIChlKSB7XG4gICAgICBpZiAoZS5lcnJvciAmJiBlLmVycm9yX2Rlc2NyaXB0aW9uKVxuICAgICAgICByZXR1cm4gYCR7ZS5lcnJvcn06ICR7ZS5lcnJvcl9kZXNjcmlwdGlvbn1gO1xuICAgICAgaWYgKGUuY29kZSAmJiBlLm1lc3NhZ2UpXG4gICAgICAgIHJldHVybiBgJHtlLmNvZGV9OiAke2UubWVzc2FnZX1gO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0VXJsKGUsIG8sIHMpIHtcbiAgICBjb25zdCB7IHJlYWxtUGF0aDogdCwgc2VydmVyQ29uZmlnOiBuIH0gPSBmLmdldChzKSwgciA9IEUoZSwgdCwgbi5wYXRocyk7XG4gICAgbGV0IGkgPSBBKG4uYmFzZVVybCwgcik7XG4gICAgcmV0dXJuIG8gJiYgKGkgKz0gYD8ke3Aobyl9YCksIGk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFUgYXMgYWxsb3dlZEVycm9ycyxcbiAgYiBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IGYgZnJvbSBcIi4uL2NvbmZpZy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUkVRVUVTVEVEX1dJVEggYXMgdSwgWF9SRVFVRVNURURfUExBVEZPUk0gYXMgdCB9IGZyb20gXCIuLi9zaGFyZWQvY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBpc09rT3I0eHggYXMgYyB9IGZyb20gXCIuLi91dGlsL2h0dHAuanNcIjtcbmltcG9ydCB7IHdpdGhUaW1lb3V0IGFzIHAgfSBmcm9tIFwiLi4vdXRpbC90aW1lb3V0LmpzXCI7XG5pbXBvcnQgeyBBY3Rpb25UeXBlcyBhcyBoIH0gZnJvbSBcIi4uL2NvbmZpZy9lbnVtcy5qc1wiO1xuaW1wb3J0IGcgZnJvbSBcIi4uL3V0aWwvbWlkZGxld2FyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RW5kcG9pbnRQYXRoIGFzIHcsIHJlc29sdmUgYXMgUCB9IGZyb20gXCIuLi91dGlsL3VybC5qc1wiO1xuY2xhc3MgTSB7XG4gIC8qKlxuICAgKiBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9nb3V0KGkpIHtcbiAgICBjb25zdCB7IG1pZGRsZXdhcmU6IHMsIHBsYXRmb3JtSGVhZGVyOiBhLCByZWFsbVBhdGg6IG4sIHNlcnZlckNvbmZpZzogciB9ID0gZi5nZXQoaSksIGQgPSB7XG4gICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIFwiQWNjZXB0LUFQSS1WZXJzaW9uXCI6IFwicHJvdG9jb2w9MS4wLHJlc291cmNlPTIuMFwiLFxuICAgICAgICBcIlgtUmVxdWVzdGVkLVdpdGhcIjogdVxuICAgICAgfSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgfSwgbCA9IGAke3coXCJzZXNzaW9uc1wiLCBuLCByLnBhdGhzKX0/X2FjdGlvbj1sb2dvdXRgLCBtID0gUChyLmJhc2VVcmwsIGwpLCBlID0gZyhcbiAgICAgIHsgdXJsOiBuZXcgVVJMKG0pLCBpbml0OiBkIH0sXG4gICAgICB7IHR5cGU6IGguTG9nb3V0IH1cbiAgICApKHMpO1xuICAgIGEgJiYgKGUuaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycyA/IGUuaW5pdC5oZWFkZXJzLnNldChcIlgtUmVxdWVzdGVkLVBsYXRmb3JtXCIsIHQpIDogQXJyYXkuaXNBcnJheShlLmluaXQuaGVhZGVycykgPyBlLmluaXQuaGVhZGVycy5wdXNoKFtcIlgtUmVxdWVzdGVkLVBsYXRmb3JtXCIsIHRdKSA6IGUuaW5pdC5oZWFkZXJzID8gZS5pbml0LmhlYWRlcnNbXCJYLVJlcXVlc3RlZC1QbGF0Zm9ybVwiXSA9IHQgOiBlLmluaXQuaGVhZGVycyA9IHtcbiAgICAgIFwiWC1SZXF1ZXN0ZWQtUGxhdGZvcm1cIjogdFxuICAgIH0pO1xuICAgIGNvbnN0IG8gPSBhd2FpdCBwKGZldGNoKGUudXJsLnRvU3RyaW5nKCksIGUuaW5pdCksIHIudGltZW91dCk7XG4gICAgaWYgKCFjKG8pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9nIG91dDsgcmVjZWl2ZWQgJHtvLnN0YXR1c31gKTtcbiAgICByZXR1cm4gbztcbiAgfVxufVxuZXhwb3J0IHtcbiAgTSBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IG4gZnJvbSBcIi4uL3V0aWwvcGtjZS5qc1wiO1xuZnVuY3Rpb24gYShlLCB0KSB7XG4gIHJldHVybiBgJHt0IHx8IFwiRlItU0RLXCJ9LWF1dGhmbG93LSR7ZX1gO1xufVxuZnVuY3Rpb24gYyhlKSB7XG4gIGNvbnN0IHQgPSBuLmNyZWF0ZVZlcmlmaWVyKCksIHIgPSBuLmNyZWF0ZVN0YXRlKCksIG8gPSBhKGUuY2xpZW50SWQsIGUucHJlZml4KSwgcyA9IHtcbiAgICAuLi5lLFxuICAgIHN0YXRlOiByLFxuICAgIHZlcmlmaWVyOiB0XG4gIH07XG4gIHJldHVybiBbXG4gICAgcyxcbiAgICAoKSA9PiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG8sIEpTT04uc3RyaW5naWZ5KHMpKVxuICBdO1xufVxuZnVuY3Rpb24gdShlLCB0KSB7XG4gIGNvbnN0IHIgPSBhKGUsIHQpLCBvID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShyKTtcbiAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShyKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3RvcmVkIHZhbHVlcyBmb3IgQXV0aCBVUkwgY291bGQgbm90IGJlIHBhcnNlZFwiKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgYyBhcyBnZW5lcmF0ZUFuZFN0b3JlQXV0aFVybFZhbHVlcyxcbiAgdSBhcyBnZXRTdG9yZWRBdXRoVXJsVmFsdWVzXG59O1xuIiwiZnVuY3Rpb24gaShlLCBuKSB7XG4gIHJldHVybiBlICYmIG4gPyBuIC0gZSA8IERhdGUubm93KCkgOiAhMTtcbn1cbmV4cG9ydCB7XG4gIGkgYXMgdG9rZW5zV2lsbEV4cGlyZVdpdGhpblRocmVzaG9sZFxufTtcbiIsInZhciByID0gLyogQF9fUFVSRV9fICovICgobykgPT4gKG8uQ29kZSA9IFwiY29kZVwiLCBvLlRva2VuID0gXCJ0b2tlblwiLCBvKSkociB8fCB7fSk7XG5leHBvcnQge1xuICByIGFzIFJlc3BvbnNlVHlwZVxufTtcbiIsImltcG9ydCB3IGZyb20gXCIuLi9jb25maWcvaW5kZXguanNcIjtcbmltcG9ydCB7IEZSTG9nZ2VyIGFzIGwgfSBmcm9tIFwiLi4vdXRpbC9sb2dnZXIuanNcIjtcbmltcG9ydCBjLCB7IGFsbG93ZWRFcnJvcnMgYXMgdCB9IGZyb20gXCIuLi9vYXV0aDItY2xpZW50L2luZGV4LmpzXCI7XG5pbXBvcnQgZCBmcm9tIFwiLi4vdG9rZW4tc3RvcmFnZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0U3RvcmVkQXV0aFVybFZhbHVlcyBhcyBrLCBnZW5lcmF0ZUFuZFN0b3JlQXV0aFVybFZhbHVlcyBhcyB5IH0gZnJvbSBcIi4uL29hdXRoMi1jbGllbnQvc3RhdGUtcGtjZS5qc1wiO1xuaW1wb3J0IHsgcGFyc2VRdWVyeSBhcyBxIH0gZnJvbSBcIi4uL3V0aWwvdXJsLmpzXCI7XG5pbXBvcnQgeyB0b2tlbnNXaWxsRXhwaXJlV2l0aGluVGhyZXNob2xkIGFzIEUgfSBmcm9tIFwiLi9oZWxwZXJzLmpzXCI7XG5pbXBvcnQgeyBSZXNwb25zZVR5cGUgYXMgQSB9IGZyb20gXCIuLi9vYXV0aDItY2xpZW50L2VudW1zLmpzXCI7XG5jbGFzcyBmIHtcbiAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGdldFRva2VucyAtIFJldHJpZXZlcyBPQXV0aDIgdG9rZW5zIGZyb20gdGhlIHNlcnZlciBvciBsb2NhbCBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgcmV0cmlldmluZyB0b2tlbnMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZVJlbmV3XSAtIElmIHRydWUsIGZvcmNlcyBhIG5ldyB0b2tlbiByZXF1ZXN0IGV2ZW4gaWYgdG9rZW5zIGFyZSBhbHJlYWR5IHN0b3JlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9naW5dIC0gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGxvZ2luOiAnZW1iZWRkZWQnIG9yICdyZWRpcmVjdCcuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5za2lwQmFja2dyb3VuZFJlcXVlc3RdIC0gSWYgdHJ1ZSwgc2tpcHMgdGhlIGJhY2tncm91bmQgcmVxdWVzdCB0byBnZXQgdG9rZW5zIHdpdGhvdXQgcmVkaXJlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnF1ZXJ5XSAtIFF1ZXJ5IGtleS12YWx1ZSBwYWlycyB0byBjb252ZXJ0IHRvIFVSTCBwYXJhbWV0ZXJzIGZvciB0aGUgL2F1dGhvcml6ZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5xdWVyeS5jb2RlXSAtIEF1dGhvcml6YXRpb24gY29kZSBmcm9tIHRoZSByZWRpcmVjdCBVUkwuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnF1ZXJ5LnN0YXRlXSAtIFN0YXRlIHBhcmFtZXRlciBmcm9tIHRoZSByZWRpcmVjdCBVUkwuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8T0F1dGgyVG9rZW5zIHwgdm9pZD59IC0gUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHRva2VucyBvciB2b2lkLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY2xpZW50IElEIGlzIG5vdCBwcm92aWRlZCwgaWYgdG9rZW5zIGNhbm5vdCBiZSBleGNoYW5nZWQsIG9yIGlmIHRoZXJlIGlzIGEgc3RhdGUgbWlzbWF0Y2guXG4gICAgICpcbiAgICAgRXhhbXBsZSAxOlxuICBcbiAgICAgYGBganNcbiAgICAgY29uc3QgdG9rZW5zID0gZm9yZ2Vyb2NrLlRva2VuTWFuYWdlci5nZXRUb2tlbnMoe1xuICAgICAgIGZvcmNlUmVuZXc6IHRydWUsIC8vIElmIHlvdSB3YW50IHRvIGdldCBuZXcgdG9rZW5zLCBkZXNwaXRlIGV4aXN0aW5nIG9uZXNcbiAgICAgICBsb2dpbjogJ2VtYmVkZGVkJywgLy8gSWYgdXNlciBhdXRoZW50aWNhdGlvbiBpcyBoYW5kbGVkIGluLWFwcFxuICAgICAgIHNlcnZlckNvbmZpZzoge1xuICAgICAgICAgdGltZW91dDogNTAwMCxcbiAgICAgICB9LFxuICAgICB9KTtcbiAgICAgYGBgXG4gIFxuICAgICBFeGFtcGxlIDI6XG4gIFxuICAgICBgYGBqc1xuICAgICBjb25zdCB0b2tlbnMgPSBmb3JnZXJvY2suVG9rZW5NYW5hZ2VyLmdldFRva2Vucyh7XG4gICAgICAgZm9yY2VSZW5ldzogZmFsc2UsIC8vIFdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIHN0b3JlZCB0b2tlbnMsIGlmIHRoZXkgZXhpc3RcbiAgICAgICBsb2dpbjogJ3JlZGlyZWN0JywgLy8gSWYgdXNlciBhdXRoZW50aWNhdGlvbiBpcyBoYW5kbGVkIGluIGV4dGVybmFsIFdlYiBhcHBcbiAgICAgfSk7XG4gICAgIGBgYFxuICBcbiAgICAgRXhhbXBsZSAzOlxuICBcbiAgICAgYGBganNcbiAgICAgY29uc3QgdG9rZW5zID0gZm9yZ2Vyb2NrLlRva2VuTWFuYWdlci5nZXRUb2tlbnMoe1xuICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICBjb2RlOiAnbEZKUVlkb1FHMXU3blVtOCAuLi4gJywgLy8gQXV0aG9yaXphdGlvbiBjb2RlIGZyb20gcmVkaXJlY3QgVVJMXG4gICAgICAgICBzdGF0ZTogJ01UWTJORGt4TlRRMk5kZTNEIC4uLiAnLCAvLyBTdGF0ZSBmcm9tIHJlZGlyZWN0IFVSTFxuICAgICAgIH0sXG4gICAgIH0pO1xuICAgICBgYGBcbiAgXG4gICAgIEV4YW1wbGUgNDpcbiAgXG4gICAgIGBgYGpzXG4gICAgIGNvbnN0IHRva2VucyA9IGZvcmdlcm9jay5Ub2tlbk1hbmFnZXIuZ2V0VG9rZW5zKHtcbiAgICAgICBza2lwQmFja2dyb3VuZFJlcXVlc3Q6IHRydWUsIC8vIE9QVElPTkFMOyB0aGlzIHdpbGwgc2tpcCB0aGUgaWZyYW1lIHJlcXVlc3QgdG8gc2lsZW50bHkgZ2V0IHRva2VucyB3L28gcmVkaXJlY3RcbiAgICAgfSk7XG4gICAgIGBgYFxuICAgICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0VG9rZW5zKHIpIHtcbiAgICBjb25zdCB7IGNsaWVudElkOiBpLCBvYXV0aFRocmVzaG9sZDogaCwgcHJlZml4OiB1IH0gPSB3LmdldChyKTtcbiAgICBpZiAoIWkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGllbnQgSUQgaXMgcmVxdWlyZWRcIik7XG4gICAgY29uc3QgcyA9IGF3YWl0IGQuZ2V0KCk7XG4gICAgaWYgKHMgJiYgIXI/LmZvcmNlUmVuZXcgJiYgIXI/LnF1ZXJ5Py5jb2RlICYmICFFKGgsIHMudG9rZW5FeHBpcnkpKVxuICAgICAgcmV0dXJuIHM7XG4gICAgaWYgKHMpXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjLnJldm9rZVRva2VuKHIpLCBhd2FpdCBmLmRlbGV0ZVRva2VucygpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsLndhcm4oXCJFeGlzdGluZyB0b2tlbnMgY291bGQgbm90IGJlIHJldm9rZWQgb3IgZGVsZXRlZFwiLCBlKTtcbiAgICAgIH1cbiAgICBpZiAocj8ucXVlcnk/LmNvZGUgJiYgcj8ucXVlcnk/LnN0YXRlKSB7XG4gICAgICBjb25zdCB7IHN0YXRlOiBlLCB2ZXJpZmllcjogbiB9ID0gayhpLCB1KTtcbiAgICAgIGlmIChlID09PSB2b2lkIDAgfHwgbiA9PT0gdm9pZCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJgc3RhdGVgIGFuZC9vciBgdmVyaWZpZXJgIG5vdCBmb3VuZCBpbiBzZXNzaW9uU3RvcmFnZS4gRGVidWdnaW5nOiBzZXNzaW9uU3RvcmFnZSBpcyBub3QgYWNjZXNzaWJsZSBpbiBzZXBhcmF0ZSB0YWJzLlwiXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50b2tlbkV4Y2hhbmdlKHIsIHsgc3RhdGU6IGUsIHZlcmlmaWVyOiBuIH0pO1xuICAgIH1cbiAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgcik7XG4gICAgZGVsZXRlIG8uZm9yY2VSZW5ldztcbiAgICBjb25zdCBbYSwgZ10gPSB5KHtcbiAgICAgIC4uLm8sXG4gICAgICBjbGllbnRJZDogaSxcbiAgICAgIHByZWZpeDogdSxcbiAgICAgIHJlc3BvbnNlVHlwZTogQS5Db2RlXG4gICAgfSk7XG4gICAgaWYgKHIgfHwgKHIgPSB7fSksIHIuc2tpcEJhY2tncm91bmRSZXF1ZXN0ICE9PSAhMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBVUkwoYXdhaXQgYy5nZXRBdXRoQ29kZUJ5SWZyYW1lKGEpKTtcbiAgICAgICAgaWYgKGUuc2VhcmNoUGFyYW1zLmdldChcImVycm9yXCIpKVxuICAgICAgICAgIHRocm93IEVycm9yKGAke2Uuc2VhcmNoUGFyYW1zLmdldChcImVycm9yX2Rlc2NyaXB0aW9uXCIpfWApO1xuICAgICAgICBpZiAoIWUuc2VhcmNoUGFyYW1zLmdldChcImNvZGVcIikpXG4gICAgICAgICAgdGhyb3cgRXJyb3IodC5BdXRoZW50aWNhdGlvbkNvbnNlbnRSZXF1aXJlZCk7XG4gICAgICAgIGNvbnN0IG4gPSBxKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIHIucXVlcnkgPSBuO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpIHx8IHI/LmxvZ2luICE9PSBcInJlZGlyZWN0XCIgfHwgdC5BdXRoZW50aWNhdGlvbklzUmVxdWlyZWQgIT09IGUubWVzc2FnZSAmJiB0LkF1dGhlbnRpY2F0aW9uQ29uc2VudFJlcXVpcmVkICE9PSBlLm1lc3NhZ2UgJiYgdC5BdXRob3JpemF0aW9uVGltZW91dCAhPT0gZS5tZXNzYWdlICYmIHQuRmFpbGVkVG9GZXRjaCAhPT0gZS5tZXNzYWdlICYmIHQuTmV0d29ya0Vycm9yICE9PSBlLm1lc3NhZ2UgJiYgdC5JbnRlcmFjdGlvbk5vdEFsbG93ZWQgIT09IGUubWVzc2FnZSAmJiB0LlJlcXVlc3RSZXF1aXJlc0NvbnNlbnQgIT09IGUubWVzc2FnZSAmJiAvLyBDaGVjayBmb3IgUGluZyBJZGVudGl0eSBMb2dpbiBSZXF1aXJlZCBlcnJvclxuICAgICAgICAvLyBMb25nIG1lc3NhZ2UsIHNvIGp1c3QgY2hlY2sgc3Vic3RyaW5nXG4gICAgICAgICFlLm1lc3NhZ2UuaW5jbHVkZXModC5Mb2dpblJlcXVpcmVkKSAmJiAvLyBTYWZhcmkgaGFzIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UsIHNvIHdlIGNoZWNrIGZvciBhIHN1YnN0cmluZ1xuICAgICAgICAhZS5tZXNzYWdlLmluY2x1ZGVzKHQuQ09SU0Vycm9yKSlcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICBjb25zdCBuID0gYXdhaXQgYy5jcmVhdGVBdXRob3JpemVVcmwoYSk7XG4gICAgICAgIHJldHVybiBnKCksIGxvY2F0aW9uLmFzc2lnbihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuRXhjaGFuZ2Uociwge1xuICAgICAgICBzdGF0ZTogYS5zdGF0ZSxcbiAgICAgICAgdmVyaWZpZXI6IGEudmVyaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtID0gYXdhaXQgYy5jcmVhdGVBdXRob3JpemVVcmwoYSk7XG4gICAgcmV0dXJuIGcoKSwgbG9jYXRpb24uYXNzaWduKG0pO1xuICB9XG4gIHN0YXRpYyBhc3luYyBkZWxldGVUb2tlbnMoKSB7XG4gICAgYXdhaXQgZC5yZW1vdmUoKTtcbiAgfVxuICBzdGF0aWMgYXN5bmMgdG9rZW5FeGNoYW5nZShyLCBpKSB7XG4gICAgaWYgKHIucXVlcnk/LnN0YXRlICE9PSBpLnN0YXRlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdGUgbWlzbWF0Y2hcIik7XG4gICAgaWYgKCFyLnF1ZXJ5Py5jb2RlIHx8IEFycmF5LmlzQXJyYXkoci5xdWVyeT8uY29kZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gYWNxdWlyZSBhdXRob3JpemF0aW9uIGNvZGVcIik7XG4gICAgY29uc3QgaCA9IHIucXVlcnk/LmNvZGUsIHUgPSBpLnZlcmlmaWVyLCBzID0geyAuLi5yLCBhdXRob3JpemF0aW9uQ29kZTogaCwgdmVyaWZpZXI6IHUgfSwgbyA9IGF3YWl0IGMuZ2V0T0F1dGgyVG9rZW5zKHMpO1xuICAgIGlmICghbyB8fCAhby5hY2Nlc3NUb2tlbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleGNoYW5nZSBhdXRob3JpemF0aW9uIGZvciB0b2tlbnNcIik7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGQuc2V0KG8pO1xuICAgIH0gY2F0Y2ggKGEpIHtcbiAgICAgIGwuZXJyb3IoXCJGYWlsZWQgdG8gc3RvcmUgdG9rZW5zXCIsIGEpO1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxufVxuZXhwb3J0IHtcbiAgZiBhcyBkZWZhdWx0XG59O1xuIiwiaW1wb3J0IHsgRlJMb2dnZXIgYXMgdCB9IGZyb20gXCIuLi91dGlsL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHMgZnJvbSBcIi4uL29hdXRoMi1jbGllbnQvaW5kZXguanNcIjtcbmltcG9ydCBmIGZyb20gXCIuLi9zZXNzaW9uLW1hbmFnZXIvaW5kZXguanNcIjtcbmltcG9ydCBsIGZyb20gXCIuLi90b2tlbi1tYW5hZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgbSBmcm9tIFwiLi4vY29uZmlnL2luZGV4LmpzXCI7XG5pbXBvcnQgZyBmcm9tIFwiLi4vdG9rZW4tc3RvcmFnZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0RW5kcG9pbnRQYXRoIGFzIHUgfSBmcm9tIFwiLi4vdXRpbC91cmwuanNcIjtcbmNsYXNzIE8ge1xuICAvKipcbiAgICogTG9ncyB0aGUgdXNlciBpbiB3aXRoIHRoZSBzcGVjaWZpZWQgc3RlcCBoYW5kbGVyLCBhY3F1aXJlcyBPQXV0aCB0b2tlbnMsIGFuZCByZXRyaWV2ZXNcbiAgICogdXNlciBwcm9maWxlLiAgKipDdXJyZW50bHkgbm90IGltcGxlbWVudGVkLioqXG4gICAqXG4gICAqIEB0eXBlcGFyYW0gVCBUaGUgdHlwZSBvZiB1c2VyIG9iamVjdCBleHBlY3RlZFxuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gaGFuZGxpbmcgYXV0aGVudGljYXRpb24gc3RlcHNcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvdmVycmlkZXNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2dpbihlLCByKSB7XG4gICAgdGhyb3cgdC5pbmZvKGUsIHIpLCBuZXcgRXJyb3IoXCJGUlVzZXIubG9naW4oKSBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEVuZHMgdGhlIHVzZXIncyBzZXNzaW9uIGFuZCByZXZva2VzIE9BdXRoIHRva2Vucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvdmVycmlkZXNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2dvdXQoZSkge1xuICAgIGNvbnN0IHIgPSB7IC4uLmUgfTtcbiAgICBkZWxldGUgci5yZWRpcmVjdDtcbiAgICBjb25zdCB7IHJlYWxtUGF0aDogbiwgc2VydmVyQ29uZmlnOiBhIH0gPSBtLmdldChyKTtcbiAgICBpZiAodShcInNlc3Npb25zXCIsIG4sIGEucGF0aHMpKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZi5sb2dvdXQocik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdC53YXJuKFwiU2Vzc2lvbiBsb2dvdXQgd2FzIG5vdCBzdWNjZXNzZnVsXCIpO1xuICAgICAgfVxuICAgIGlmIChlPy5yZWRpcmVjdCA9PT0gITEpXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzLmVuZFNlc3Npb24oeyAuLi5lIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHQud2FybihcIk9BdXRoIGVuZFNlc3Npb24gd2FzIG5vdCBzdWNjZXNzZnVsXCIpO1xuICAgICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzLnJldm9rZVRva2VuKHIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdC53YXJuKFwiT0F1dGggcmV2b2tlVG9rZW4gd2FzIG5vdCBzdWNjZXNzZnVsXCIpO1xuICAgIH1cbiAgICBjb25zdCBpID0gYXdhaXQgZy5nZXQoKSwgeyBpZFRva2VuOiBjID0gXCJcIiB9ID0gaSB8fCB7fTtcbiAgICBpZiAoYXdhaXQgbC5kZWxldGVUb2tlbnMoKSwgZT8ucmVkaXJlY3QgIT09ICExKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcy5lbmRTZXNzaW9uKHsgLi4uZSwgaWRUb2tlbjogYyB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0Lndhcm4oXCJPQXV0aCBlbmRTZXNzaW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bFwiKTtcbiAgICAgIH1cbiAgfVxufVxuZXhwb3J0IHtcbiAgTyBhcyBkZWZhdWx0XG59O1xuIiwidmFyIG8gPSAvKiBAX19QVVJFX18gKi8gKChyKSA9PiAoci5FcnJvciA9IFwiRVJST1JcIiwgci5VbnN1cHBvcnRlZCA9IFwidW5zdXBwb3J0ZWRcIiwgcikpKG8gfHwge30pLCBFID0gLyogQF9fUFVSRV9fICovICgocikgPT4gKHIuQWJvcnRFcnJvciA9IFwiQWJvcnRFcnJvclwiLCByLkRhdGFFcnJvciA9IFwiRGF0YUVycm9yXCIsIHIuQ29uc3RyYWludEVycm9yID0gXCJDb25zdHJhaW50RXJyb3JcIiwgci5FbmNvZGluZ0Vycm9yID0gXCJFbmNvZGluZ0Vycm9yXCIsIHIuSW52YWxpZEVycm9yID0gXCJJbnZhbGlkRXJyb3JcIiwgci5OZXR3b3JrRXJyb3IgPSBcIk5ldHdvcmtFcnJvclwiLCByLk5vdEFsbG93ZWRFcnJvciA9IFwiTm90QWxsb3dlZEVycm9yXCIsIHIuTm90U3VwcG9ydGVkRXJyb3IgPSBcIk5vdFN1cHBvcnRlZEVycm9yXCIsIHIuU2VjdXJpdHlFcnJvciA9IFwiU2VjdXJpdHlFcnJvclwiLCByLlRpbWVvdXRFcnJvciA9IFwiVGltZW91dEVycm9yXCIsIHIuVW5rbm93bkVycm9yID0gXCJVbmtub3duRXJyb3JcIiwgcikpKEUgfHwge30pLCBpID0gLyogQF9fUFVSRV9fICovICgocikgPT4gKHJbci5Ob25lID0gMF0gPSBcIk5vbmVcIiwgcltyLkF1dGhlbnRpY2F0aW9uID0gMV0gPSBcIkF1dGhlbnRpY2F0aW9uXCIsIHJbci5SZWdpc3RyYXRpb24gPSAyXSA9IFwiUmVnaXN0cmF0aW9uXCIsIHIpKShpIHx8IHt9KTtcbmV4cG9ydCB7XG4gIG8gYXMgV2ViQXV0aG5PdXRjb21lLFxuICBFIGFzIFdlYkF1dGhuT3V0Y29tZVR5cGUsXG4gIGkgYXMgV2ViQXV0aG5TdGVwVHlwZVxufTtcbiIsImltcG9ydCB7IFdlYkF1dGhuT3V0Y29tZVR5cGUgYXMgbyB9IGZyb20gXCIuL2VudW1zLmpzXCI7XG5mdW5jdGlvbiBzKHIpIHtcbiAgcmV0dXJuIHIgfHwgW107XG59XG5mdW5jdGlvbiB1KHIpIHtcbiAgY29uc3QgbiA9IG5ldyBVaW50OEFycmF5KHIpO1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG4pO1xufVxuZnVuY3Rpb24gZihyKSB7XG4gIHJldHVybiByID8gclsxXSA6IFwiXCI7XG59XG5mdW5jdGlvbiBhKHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gci5zcGxpdChcIn1cIikuZmlsdGVyKChlKSA9PiAhIWUgJiYgZSAhPT0gXCJdXCIpLm1hcCgoZSkgPT4ge1xuICAgICAgY29uc3QgdCA9IGMoZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbmV3IEludDhBcnJheSh0KS5idWZmZXIsXG4gICAgICAgIHR5cGU6IFwicHVibGljLWtleVwiXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBjb25zdCBlID0gbmV3IEVycm9yKFwiVHJhbnNmb3JtaW5nIGNyZWRlbnRpYWwgb2JqZWN0IHRvIHN0cmluZyBmYWlsZWRcIik7XG4gICAgdGhyb3cgZS5uYW1lID0gby5FbmNvZGluZ0Vycm9yLCBlO1xuICB9XG59XG5mdW5jdGlvbiBjKHIpIHtcbiAgY29uc3QgbiA9IC9uZXcgSW50OEFycmF5XFwoKC4rKVxcKS8uZXhlYyhyKTtcbiAgcmV0dXJuIG4gPT09IG51bGwgfHwgbi5sZW5ndGggPCAyID8gW10gOiBKU09OLnBhcnNlKG5bMV0pO1xufVxuZnVuY3Rpb24gcChyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKVxuICAgIHJldHVybiByO1xuICBpZiAodHlwZW9mIHIgPT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gciAmJiByWzBdID09PSBcIltcIiA/IEpTT04ucGFyc2UocikgOiAociA9IHIucmVwbGFjZSgvKFxcdyspOi9nLCAnXCIkMVwiOicpLCBKU09OLnBhcnNlKGBbJHtyfV1gKSk7XG59XG5mdW5jdGlvbiBkKHIpIHtcbiAgcmV0dXJuIHIuaW5jbHVkZXMoXCJycElkXCIpID8gci5yZXBsYWNlKC9ycElkOiBcIiguKylcIiwvLCBcIiQxXCIpIDogci5yZXBsYWNlKC9pZDogXCIoLispXCIsLywgXCIkMVwiKTtcbn1cbmV4cG9ydCB7XG4gIHUgYXMgYXJyYXlCdWZmZXJUb1N0cmluZyxcbiAgcyBhcyBlbnN1cmVBcnJheSxcbiAgZiBhcyBnZXRJbmRleE9uZSxcbiAgYSBhcyBwYXJzZUNyZWRlbnRpYWxzLFxuICBjIGFzIHBhcnNlTnVtYmVyQXJyYXksXG4gIHAgYXMgcGFyc2VQdWJLZXlBcnJheSxcbiAgZCBhcyBwYXJzZVJlbHlpbmdQYXJ0eUlkXG59O1xuIiwiaW1wb3J0IHsgV2ViQXV0aG5PdXRjb21lVHlwZSBhcyBTIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGdldEluZGV4T25lIGFzIGUsIHBhcnNlUHViS2V5QXJyYXkgYXMgSywgcGFyc2VDcmVkZW50aWFscyBhcyBPLCBlbnN1cmVBcnJheSBhcyB5IH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuZnVuY3Rpb24gVCh0KSB7XG4gIGNvbnN0IHMgPSBuZXcgVGV4dEVuY29kZXIoKSwgciA9IGUodC5tYXRjaCgvYXR0ZXN0YXRpb25cInswLH06XFxzezAsfVwiKFxcdyspXCIvKSksIGMgPSBOdW1iZXIoZSh0Lm1hdGNoKC90aW1lb3V0XCJ7MCx9Olxcc3swLH0oXFxkKykvKSkpLCBsID0gZShcbiAgICB0Lm1hdGNoKC91c2VyVmVyaWZpY2F0aW9uXCJ7MCx9Olxcc3swLH1cIihcXHcrKVwiLylcbiAgKSwgaSA9IGUoXG4gICAgdC5tYXRjaCgvcmVxdWlyZVJlc2lkZW50S2V5XCJ7MCx9Olxcc3swLH0oXFx3KykvKVxuICApLCBvID0gZShcbiAgICB0Lm1hdGNoKC9hdXRoZW50aWNhdG9yQXR0YWNobWVudFwiezAsfTpcXHN7MCx9XCIoW1xcdy1dKykvKVxuICApLCBtID0gZSh0Lm1hdGNoKC9ycFwiezAsfTpcXHN7MCx9eyhbXn1dKyl9LykpLnRyaW0oKSwgYSA9IGUobS5tYXRjaCgvaWRcInswLH06XFxzezAsfVwiKFteXCJdKilcIi8pKSwgdyA9IGUobS5tYXRjaCgvbmFtZVwiezAsfTpcXHN7MCx9XCIoW15cIl0qKVwiLykpLCBuID0gZSh0Lm1hdGNoKC91c2VyXCJ7MCx9Olxcc3swLH17KFteXXswLH0pfSwvKSkudHJpbSgpLCB1ID0gZShuLm1hdGNoKC9pZFwiezAsfTpcXHN7MCx9VWludDhBcnJheS5mcm9tXFwoXCIoW15cIl0rKVwiLykpLCBkID0gZShuLm1hdGNoKC9uYW1lXCJ7MCx9Olxcc3swLH1cIihbXFxkXFx3Ll8tXSspXCIvKSksIGggPSBlKG4ubWF0Y2goL2Rpc3BsYXlOYW1lXCJ7MCx9Olxcc3swLH1cIihbXFxkXFx3XFxzLkBfLV0rKVwiLykpLCBwID0gZShcbiAgICAvLyBDYXB0dXJlIHRoZSBgcHViS2V5Q3JlZFBhcmFtc2Agd2l0aG91dCBhbHNvIG1hdGNoaW5nIGBleGNsdWRlQ3JlZGVudGlhbHNgIGFzIHdlbGwuXG4gICAgLy8gYGV4Y2x1ZGVDcmVkZW50aWFsc2AgdmFsdWVzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhpcyBwcm9wZXJ0eSwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmVcbiAgICAvLyBvdXIgbGFzdCB2YWx1ZSBkb2Vzbid0IGVuZCB3aXRoIFwiYnVmZmVyXCIsIHNvIHdlIGFyZSBvbmx5IGNhcHR1cmluZyBvYmplY3RzIHRoYXRcbiAgICAvLyBlbmQgaW4gYSBkaWdpdCBhbmQgcG9zc2libHkgYSBzcGFjZS5cbiAgICB0Lm1hdGNoKC9wdWJLZXlDcmVkUGFyYW1zXCIqOlxccypcXFsoW15dK1xcZFxccyp9KVxccypdLylcbiAgKS50cmltKCksIEEgPSBLKHApO1xuICBpZiAoIUEpIHtcbiAgICBjb25zdCBiID0gbmV3IEVycm9yKFwiTWlzc2luZyBwdWJLZXlDcmVkUGFyYW1zIHByb3BlcnR5IGZyb20gcmVnaXN0cmF0aW9uIG9wdGlvbnNcIik7XG4gICAgdGhyb3cgYi5uYW1lID0gUy5EYXRhRXJyb3IsIGI7XG4gIH1cbiAgY29uc3QgZyA9IGUoXG4gICAgdC5tYXRjaCgvZXhjbHVkZUNyZWRlbnRpYWxzXCJ7MCx9Olxcc3swLH1cXFsoW15dKylcXHN7MCx9XS8pXG4gICkudHJpbSgpLCBmID0gTyhnKSwgQyA9IHkoXG4gICAgdC5tYXRjaCgvY2hhbGxlbmdlXCJ7MCx9Olxcc3swLH1uZXdcXHN7MCx9KFVpbnR8SW50KThBcnJheVxcKChbXlxcKV0rKS8pXG4gICksIE4gPSBKU09OLnBhcnNlKENbMl0pLCBJID0gbmV3IEludDhBcnJheShOKS5idWZmZXI7XG4gIHJldHVybiB7XG4gICAgYXR0ZXN0YXRpb246IHIsXG4gICAgYXV0aGVudGljYXRvclNlbGVjdGlvbjoge1xuICAgICAgdXNlclZlcmlmaWNhdGlvbjogbCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBhdXRoZW50aWNhdG9yQXR0YWNobWVudCBwcm9wIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgIC4uLm8gJiYgeyBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogbyB9LFxuICAgICAgLy8gT25seSBpbmNsdWRlIHJlcXVpcmVSZXNpZGVudEtleSBwcm9wIGlmIHRoZSB2YWx1ZSBpcyBvZiBzdHJpbmcgXCJ0cnVlXCJcbiAgICAgIC4uLmkgPT09IFwidHJ1ZVwiICYmIHtcbiAgICAgICAgcmVxdWlyZVJlc2lkZW50S2V5OiAhIWlcbiAgICAgIH1cbiAgICB9LFxuICAgIGNoYWxsZW5nZTogSSxcbiAgICAuLi5mLmxlbmd0aCAmJiB7IGV4Y2x1ZGVDcmVkZW50aWFsczogZiB9LFxuICAgIHB1YktleUNyZWRQYXJhbXM6IEEsXG4gICAgcnA6IHtcbiAgICAgIG5hbWU6IHcsXG4gICAgICAvLyBvbmx5IGFkZCBrZXktdmFsdWUgcGFpciBpZiB0cnV0aHkgdmFsdWUgaXMgcHJvdmlkZWRcbiAgICAgIC4uLmEgJiYgeyBpZDogYSB9XG4gICAgfSxcbiAgICB0aW1lb3V0OiBjLFxuICAgIHVzZXI6IHtcbiAgICAgIGRpc3BsYXlOYW1lOiBoLFxuICAgICAgaWQ6IHMuZW5jb2RlKHUpLFxuICAgICAgbmFtZTogZFxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIEUodCkge1xuICBsZXQgcywgcjtcbiAgdC5pbmNsdWRlcyhcImFjY2VwdGFibGVDcmVkZW50aWFsc1wiKSA/IHIgPSBlKFxuICAgIHQubWF0Y2goL2FjY2VwdGFibGVDcmVkZW50aWFsc1wiKlxccyo9XFxzKlxcWyhbXl0rKVxccypdLylcbiAgKS50cmltKCkgOiByID0gZShcbiAgICB0Lm1hdGNoKC9hbGxvd0NyZWRlbnRpYWxzXCJ7MCx9Olxcc3swLH1cXFsoW15dKylcXHN7MCx9XS8pXG4gICkudHJpbSgpO1xuICBjb25zdCBjID0gZShcbiAgICB0Lm1hdGNoKC91c2VyVmVyaWZpY2F0aW9uXCJ7MCx9Olxcc3swLH1cIihcXHcrKVwiLylcbiAgKTtcbiAgciAmJiAocyA9IChyLnNwbGl0KFwifSxcIikgfHwgW3JdKS5tYXAoKG4pID0+IHtcbiAgICBjb25zdCB1ID0gZShuLm1hdGNoKC90eXBlXCJ7MCx9Olxcc3swLH1cIihbXFx3LV0rKVwiLykpLCBkID0geShuLm1hdGNoKC9pZFwiezAsfTpcXHN7MCx9bmV3XFxzezAsfShVaW50fEludCk4QXJyYXlcXCgoW15cXCldKykvKSksIGggPSBKU09OLnBhcnNlKGRbMl0pLCBwID0gbmV3IEludDhBcnJheShoKS5idWZmZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHUsXG4gICAgICBpZDogcFxuICAgIH07XG4gIH0pKTtcbiAgY29uc3QgbCA9IE51bWJlcihlKHQubWF0Y2goL3RpbWVvdXRcInswLH06XFxzezAsfShcXGQrKS8pKSksIGkgPSB5KFxuICAgIHQubWF0Y2goL2NoYWxsZW5nZVwiezAsfTpcXHN7MCx9bmV3XFxzezAsfShVaW50fEludCk4QXJyYXlcXCgoW15cXCldKykvKVxuICApLCBvID0gSlNPTi5wYXJzZShpWzJdKSwgbSA9IG5ldyBJbnQ4QXJyYXkobykuYnVmZmVyLCBhID0gZSh0Lm1hdGNoKC9ycElkXCJ7MCx9Olxcc3swLH1cXFxcezAsfVwiKFteXCJcXFxcXSopLykpO1xuICByZXR1cm4ge1xuICAgIGNoYWxsZW5nZTogbSxcbiAgICB0aW1lb3V0OiBsLFxuICAgIC8vIG9ubHkgYWRkIGtleS12YWx1ZSBwYWlycyBpZiB0aGUgdHJ1dGh5IHZhbHVlcyBhcmUgcHJvdmlkZWRcbiAgICAuLi5zICYmIHsgYWxsb3dDcmVkZW50aWFsczogcyB9LFxuICAgIC4uLmMgJiYgeyB1c2VyVmVyaWZpY2F0aW9uOiBjIH0sXG4gICAgLi4uYSAmJiB7IHJwSWQ6IGEgfVxuICB9O1xufVxuZXhwb3J0IHtcbiAgRSBhcyBwYXJzZVdlYkF1dGhuQXV0aGVudGljYXRlVGV4dCxcbiAgVCBhcyBwYXJzZVdlYkF1dGhuUmVnaXN0ZXJUZXh0XG59O1xuIiwiaW1wb3J0IHsgQ2FsbGJhY2tUeXBlIGFzIHAgfSBmcm9tIFwiLi4vYXV0aC9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgV2ViQXV0aG5TdGVwVHlwZSBhcyBoLCBXZWJBdXRobk91dGNvbWVUeXBlIGFzIGMsIFdlYkF1dGhuT3V0Y29tZSBhcyBnIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9TdHJpbmcgYXMgbSwgcGFyc2VSZWx5aW5nUGFydHlJZCBhcyBDLCBwYXJzZUNyZWRlbnRpYWxzIGFzIHcsIHBhcnNlUHViS2V5QXJyYXkgYXMgayB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmltcG9ydCB7IHBhcnNlV2ViQXV0aG5BdXRoZW50aWNhdGVUZXh0IGFzIEUsIHBhcnNlV2ViQXV0aG5SZWdpc3RlclRleHQgYXMgJCB9IGZyb20gXCIuL3NjcmlwdC1wYXJzZXIuanNcIjtcbmNsYXNzIFYge1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gc3RlcCBpcyBhIFdlYkF1dGhuIHN0ZXAuXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwIFRoZSBzdGVwIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm4gQSBXZWJBdXRoblN0ZXBUeXBlIHZhbHVlXG4gICAqL1xuICBzdGF0aWMgZ2V0V2ViQXV0aG5TdGVwVHlwZShlKSB7XG4gICAgY29uc3QgYSA9IHRoaXMuZ2V0T3V0Y29tZUNhbGxiYWNrKGUpLCB0ID0gdGhpcy5nZXRNZXRhZGF0YUNhbGxiYWNrKGUpLCBpID0gdGhpcy5nZXRUZXh0T3V0cHV0Q2FsbGJhY2soZSk7XG4gICAgcmV0dXJuIGEgJiYgdCA/IHQuZ2V0T3V0cHV0VmFsdWUoXCJkYXRhXCIpPy5wdWJLZXlDcmVkUGFyYW1zID8gaC5SZWdpc3RyYXRpb24gOiBoLkF1dGhlbnRpY2F0aW9uIDogYSAmJiBpID8gaS5nZXRNZXNzYWdlKCkuaW5jbHVkZXMoXCJwdWJLZXlDcmVkUGFyYW1zXCIpID8gaC5SZWdpc3RyYXRpb24gOiBoLkF1dGhlbnRpY2F0aW9uIDogaC5Ob25lO1xuICB9XG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgdGhlIHN0ZXAgd2l0aCB0aGUgbmVjZXNzYXJ5IGF1dGhlbnRpY2F0aW9uIG91dGNvbWUuXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwIFRoZSBzdGVwIHRoYXQgY29udGFpbnMgV2ViQXV0aG4gYXV0aGVudGljYXRpb24gZGF0YVxuICAgKiBAcmV0dXJuIFRoZSBwb3B1bGF0ZWQgc3RlcFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGF1dGhlbnRpY2F0ZShlKSB7XG4gICAgY29uc3QgeyBoaWRkZW5DYWxsYmFjazogYSwgbWV0YWRhdGFDYWxsYmFjazogdCwgdGV4dE91dHB1dENhbGxiYWNrOiBpIH0gPSB0aGlzLmdldENhbGxiYWNrcyhlKTtcbiAgICBpZiAoYSAmJiAodCB8fCBpKSkge1xuICAgICAgbGV0IG8sIG4gPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgY29uc3QgcyA9IHQuZ2V0T3V0cHV0VmFsdWUoXCJkYXRhXCIpO1xuICAgICAgICAgIHIgPSB0aGlzLmNyZWF0ZUF1dGhlbnRpY2F0aW9uUHVibGljS2V5KHMpLCBuID0gYXdhaXQgdGhpcy5nZXRBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWwoXG4gICAgICAgICAgICByXG4gICAgICAgICAgKSwgbyA9IHRoaXMuZ2V0QXV0aGVudGljYXRpb25PdXRjb21lKG4pO1xuICAgICAgICB9IGVsc2UgaWYgKGkpXG4gICAgICAgICAgciA9IEUoaS5nZXRNZXNzYWdlKCkpLCBuID0gYXdhaXQgdGhpcy5nZXRBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWwoXG4gICAgICAgICAgICByXG4gICAgICAgICAgKSwgbyA9IHRoaXMuZ2V0QXV0aGVudGljYXRpb25PdXRjb21lKG4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ3JlZGVudGlhbCBmb3VuZCBmcm9tIFB1YmxpYyBLZXlcIik7XG4gICAgICB9IGNhdGNoIChyKSB7XG4gICAgICAgIHRocm93IHIgaW5zdGFuY2VvZiBFcnJvciA/IHIubmFtZSA9PT0gYy5Ob3RTdXBwb3J0ZWRFcnJvciA/IChhLnNldElucHV0VmFsdWUoZy5VbnN1cHBvcnRlZCksIHIpIDogKGEuc2V0SW5wdXRWYWx1ZShgJHtnLkVycm9yfTo6JHtyLm5hbWV9OiR7ci5tZXNzYWdlfWApLCByKSA6IHI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdCAmJiB0LmdldE91dHB1dFZhbHVlKFwiZGF0YVwiKT8uc3VwcG9ydHNKc29uUmVzcG9uc2UgJiYgbiAmJiBcImF1dGhlbnRpY2F0b3JBdHRhY2htZW50XCIgaW4gbiA/IChhLnNldElucHV0VmFsdWUoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogbi5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxcbiAgICAgICAgICBsZWdhY3lEYXRhOiBvXG4gICAgICAgIH0pXG4gICAgICApLCBlKSA6IChhLnNldElucHV0VmFsdWUobyksIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvID0gbmV3IEVycm9yKFwiSW5jb3JyZWN0IGNhbGxiYWNrcyBmb3IgV2ViQXV0aG4gYXV0aGVudGljYXRpb25cIik7XG4gICAgICB0aHJvdyBvLm5hbWUgPSBjLkRhdGFFcnJvciwgYT8uc2V0SW5wdXRWYWx1ZShgJHtnLkVycm9yfTo6JHtvLm5hbWV9OiR7by5tZXNzYWdlfWApLCBvO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUG9wdWxhdGVzIHRoZSBzdGVwIHdpdGggdGhlIG5lY2Vzc2FyeSByZWdpc3RyYXRpb24gb3V0Y29tZS5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdGhhdCBjb250YWlucyBXZWJBdXRobiByZWdpc3RyYXRpb24gZGF0YVxuICAgKiBAcmV0dXJuIFRoZSBwb3B1bGF0ZWQgc3RlcFxuICAgKi9cbiAgLy8gQ2FuIG1ha2UgdGhpcyBnZW5lcmljIGNvbnN0IGluIFR5cGVzY3JpcHQgNS4wID4gYW5kIHRoZSBuYW1lIGl0c2VsZiB3aWxsXG4gIC8vIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgc28gYHR5cGVvZiBkZXZpY2VOYW1lYCB3aWxsIG5vdCBqdXN0IHJldHVybiBzdHJpbmdcbiAgLy8gYnV0IHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgZGV2aWNlTmFtZSBwYXNzZWQgaW4gYXMgYSBnZW5lcmljLlxuICBzdGF0aWMgYXN5bmMgcmVnaXN0ZXIoZSwgYSkge1xuICAgIGNvbnN0IHsgaGlkZGVuQ2FsbGJhY2s6IHQsIG1ldGFkYXRhQ2FsbGJhY2s6IGksIHRleHRPdXRwdXRDYWxsYmFjazogbyB9ID0gdGhpcy5nZXRDYWxsYmFja3MoZSk7XG4gICAgaWYgKHQgJiYgKGkgfHwgbykpIHtcbiAgICAgIGxldCBuLCByID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBzO1xuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgIGNvbnN0IGwgPSBpLmdldE91dHB1dFZhbHVlKFwiZGF0YVwiKTtcbiAgICAgICAgICBzID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25QdWJsaWNLZXkobCksIHIgPSBhd2FpdCB0aGlzLmdldFJlZ2lzdHJhdGlvbkNyZWRlbnRpYWwoXG4gICAgICAgICAgICBzXG4gICAgICAgICAgKSwgbiA9IHRoaXMuZ2V0UmVnaXN0cmF0aW9uT3V0Y29tZShyKTtcbiAgICAgICAgfSBlbHNlIGlmIChvKVxuICAgICAgICAgIHMgPSAkKG8uZ2V0TWVzc2FnZSgpKSwgciA9IGF3YWl0IHRoaXMuZ2V0UmVnaXN0cmF0aW9uQ3JlZGVudGlhbChcbiAgICAgICAgICAgIHNcbiAgICAgICAgICApLCBuID0gdGhpcy5nZXRSZWdpc3RyYXRpb25PdXRjb21lKHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ3JlZGVudGlhbCBmb3VuZCBmcm9tIFB1YmxpYyBLZXlcIik7XG4gICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgIHRocm93IHMgaW5zdGFuY2VvZiBFcnJvciA/IHMubmFtZSA9PT0gYy5Ob3RTdXBwb3J0ZWRFcnJvciA/ICh0LnNldElucHV0VmFsdWUoZy5VbnN1cHBvcnRlZCksIHMpIDogKHQuc2V0SW5wdXRWYWx1ZShgJHtnLkVycm9yfTo6JHtzLm5hbWV9OiR7cy5tZXNzYWdlfWApLCBzKSA6IHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaSAmJiBpLmdldE91dHB1dFZhbHVlKFwiZGF0YVwiKT8uc3VwcG9ydHNKc29uUmVzcG9uc2UgJiYgciAmJiBcImF1dGhlbnRpY2F0b3JBdHRhY2htZW50XCIgaW4gciA/ICh0LnNldElucHV0VmFsdWUoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogci5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxcbiAgICAgICAgICBsZWdhY3lEYXRhOiBhICYmIGEubGVuZ3RoID4gMCA/IGAke259Ojoke2F9YCA6IG5cbiAgICAgICAgfSlcbiAgICAgICksIGUpIDogKHQuc2V0SW5wdXRWYWx1ZShcbiAgICAgICAgYSAmJiBhLmxlbmd0aCA+IDAgPyBgJHtufTo6JHthfWAgOiBuXG4gICAgICApLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbiA9IG5ldyBFcnJvcihcIkluY29ycmVjdCBjYWxsYmFja3MgZm9yIFdlYkF1dGhuIHJlZ2lzdHJhdGlvblwiKTtcbiAgICAgIHRocm93IG4ubmFtZSA9IGMuRGF0YUVycm9yLCB0Py5zZXRJbnB1dFZhbHVlKGAke2cuRXJyb3J9Ojoke24ubmFtZX06JHtuLm1lc3NhZ2V9YCksIG47XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0d28gV2ViQXV0aG4gY2FsbGJhY2tzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcCBUaGUgc3RlcCB0aGF0IGNvbnRhaW5zIFdlYkF1dGhuIGNhbGxiYWNrc1xuICAgKiBAcmV0dXJuIFRoZSBXZWJBdXRobiBjYWxsYmFja3NcbiAgICovXG4gIHN0YXRpYyBnZXRDYWxsYmFja3MoZSkge1xuICAgIGNvbnN0IGEgPSB0aGlzLmdldE91dGNvbWVDYWxsYmFjayhlKSwgdCA9IHRoaXMuZ2V0TWV0YWRhdGFDYWxsYmFjayhlKSwgaSA9IHRoaXMuZ2V0VGV4dE91dHB1dENhbGxiYWNrKGUpLCBvID0ge1xuICAgICAgaGlkZGVuQ2FsbGJhY2s6IGFcbiAgICB9O1xuICAgIHJldHVybiB0ID8gby5tZXRhZGF0YUNhbGxiYWNrID0gdCA6IGkgJiYgKG8udGV4dE91dHB1dENhbGxiYWNrID0gaSksIG87XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFdlYkF1dGhuIG1ldGFkYXRhIGNhbGxiYWNrIGNvbnRhaW5pbmcgZGF0YSB0byBwYXNzIHRvIHRoZSBicm93c2VyXG4gICAqIFdlYiBBdXRoZW50aWNhdGlvbiBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwIFRoZSBzdGVwIHRoYXQgY29udGFpbnMgV2ViQXV0aG4gY2FsbGJhY2tzXG4gICAqIEByZXR1cm4gVGhlIG1ldGFkYXRhIGNhbGxiYWNrXG4gICAqL1xuICBzdGF0aWMgZ2V0TWV0YWRhdGFDYWxsYmFjayhlKSB7XG4gICAgcmV0dXJuIGUuZ2V0Q2FsbGJhY2tzT2ZUeXBlKHAuTWV0YWRhdGFDYWxsYmFjaykuZmluZCgoYSkgPT4ge1xuICAgICAgY29uc3QgdCA9IGEuZ2V0T3V0cHV0QnlOYW1lKFwiZGF0YVwiLCB2b2lkIDApO1xuICAgICAgcmV0dXJuIHQgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInJlbHlpbmdQYXJ0eUlkXCIpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBXZWJBdXRobiBoaWRkZW4gdmFsdWUgY2FsbGJhY2sgd2hlcmUgdGhlIG91dGNvbWUgc2hvdWxkIGJlIHBvcHVsYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdGhhdCBjb250YWlucyBXZWJBdXRobiBjYWxsYmFja3NcbiAgICogQHJldHVybiBUaGUgaGlkZGVuIHZhbHVlIGNhbGxiYWNrXG4gICAqL1xuICBzdGF0aWMgZ2V0T3V0Y29tZUNhbGxiYWNrKGUpIHtcbiAgICByZXR1cm4gZS5nZXRDYWxsYmFja3NPZlR5cGUocC5IaWRkZW5WYWx1ZUNhbGxiYWNrKS5maW5kKChhKSA9PiBhLmdldE91dHB1dEJ5TmFtZShcImlkXCIsIFwiXCIpID09PSBcIndlYkF1dGhuT3V0Y29tZVwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgV2ViQXV0aG4gbWV0YWRhdGEgY2FsbGJhY2sgY29udGFpbmluZyBkYXRhIHRvIHBhc3MgdG8gdGhlIGJyb3dzZXJcbiAgICogV2ViIEF1dGhlbnRpY2F0aW9uIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXAgVGhlIHN0ZXAgdGhhdCBjb250YWlucyBXZWJBdXRobiBjYWxsYmFja3NcbiAgICogQHJldHVybiBUaGUgbWV0YWRhdGEgY2FsbGJhY2tcbiAgICovXG4gIHN0YXRpYyBnZXRUZXh0T3V0cHV0Q2FsbGJhY2soZSkge1xuICAgIHJldHVybiBlLmdldENhbGxiYWNrc09mVHlwZShwLlRleHRPdXRwdXRDYWxsYmFjaykuZmluZCgoYSkgPT4ge1xuICAgICAgY29uc3QgdCA9IGEuZ2V0T3V0cHV0QnlOYW1lKFwibWVzc2FnZVwiLCB2b2lkIDApO1xuICAgICAgcmV0dXJuIHQgJiYgdC5pbmNsdWRlcyhcIndlYkF1dGhuT3V0Y29tZVwiKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjcmVkZW50aWFsIGZyb20gdGhlIGJyb3dzZXIgV2ViIEF1dGhlbnRpY2F0aW9uIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHB1YmxpYyBrZXkgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICogQHJldHVybiBUaGUgY3JlZGVudGlhbFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEF1dGhlbnRpY2F0aW9uQ3JlZGVudGlhbChlKSB7XG4gICAgaWYgKCF3aW5kb3cuUHVibGljS2V5Q3JlZGVudGlhbCkge1xuICAgICAgY29uc3QgdCA9IG5ldyBFcnJvcihcIlB1YmxpY0tleUNyZWRlbnRpYWwgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXJcIik7XG4gICAgICB0aHJvdyB0Lm5hbWUgPSBjLk5vdFN1cHBvcnRlZEVycm9yLCB0O1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCh7IHB1YmxpY0tleTogZSB9KTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgYW4gYXV0aGVudGljYXRpb24gY3JlZGVudGlhbCBpbnRvIHRoZSBvdXRjb21lIGV4cGVjdGVkIGJ5IE9wZW5BTS5cbiAgICpcbiAgICogQHBhcmFtIGNyZWRlbnRpYWwgVGhlIGNyZWRlbnRpYWwgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIFRoZSBvdXRjb21lIHN0cmluZ1xuICAgKi9cbiAgc3RhdGljIGdldEF1dGhlbnRpY2F0aW9uT3V0Y29tZShlKSB7XG4gICAgaWYgKGUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGEgPSBuZXcgRXJyb3IoXCJObyBjcmVkZW50aWFsIGdlbmVyYXRlZCBmcm9tIGF1dGhlbnRpY2F0aW9uXCIpO1xuICAgICAgdGhyb3cgYS5uYW1lID0gYy5Vbmtub3duRXJyb3IsIGE7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gbShlLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSwgdCA9IGUucmVzcG9uc2UsIGkgPSBuZXcgSW50OEFycmF5KFxuICAgICAgICB0LmF1dGhlbnRpY2F0b3JEYXRhXG4gICAgICApLnRvU3RyaW5nKCksIG8gPSBuZXcgSW50OEFycmF5KHQuc2lnbmF0dXJlKS50b1N0cmluZygpLCBuID0gbShlLnJlc3BvbnNlLnVzZXJIYW5kbGUpO1xuICAgICAgbGV0IHIgPSBgJHthfTo6JHtpfTo6JHtvfTo6JHtlLmlkfWA7XG4gICAgICByZXR1cm4gbiAmJiAociA9IGAke3J9Ojoke259YCksIHI7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCB0ID0gbmV3IEVycm9yKFwiVHJhbnNmb3JtaW5nIGNyZWRlbnRpYWwgb2JqZWN0IHRvIHN0cmluZyBmYWlsZWRcIik7XG4gICAgICB0aHJvdyB0Lm5hbWUgPSBjLkVuY29kaW5nRXJyb3IsIHQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGNyZWRlbnRpYWwgZnJvbSB0aGUgYnJvd3NlciBXZWIgQXV0aGVudGljYXRpb24gQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgcHVibGljIGtleSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJuIFRoZSBjcmVkZW50aWFsXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0UmVnaXN0cmF0aW9uQ3JlZGVudGlhbChlKSB7XG4gICAgaWYgKCF3aW5kb3cuUHVibGljS2V5Q3JlZGVudGlhbCkge1xuICAgICAgY29uc3QgdCA9IG5ldyBFcnJvcihcIlB1YmxpY0tleUNyZWRlbnRpYWwgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXJcIik7XG4gICAgICB0aHJvdyB0Lm5hbWUgPSBjLk5vdFN1cHBvcnRlZEVycm9yLCB0O1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSh7XG4gICAgICBwdWJsaWNLZXk6IGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgYSByZWdpc3RyYXRpb24gY3JlZGVudGlhbCBpbnRvIHRoZSBvdXRjb21lIGV4cGVjdGVkIGJ5IE9wZW5BTS5cbiAgICpcbiAgICogQHBhcmFtIGNyZWRlbnRpYWwgVGhlIGNyZWRlbnRpYWwgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIFRoZSBvdXRjb21lIHN0cmluZ1xuICAgKi9cbiAgc3RhdGljIGdldFJlZ2lzdHJhdGlvbk91dGNvbWUoZSkge1xuICAgIGlmIChlID09PSBudWxsKSB7XG4gICAgICBjb25zdCBhID0gbmV3IEVycm9yKFwiTm8gY3JlZGVudGlhbCBnZW5lcmF0ZWQgZnJvbSByZWdpc3RyYXRpb25cIik7XG4gICAgICB0aHJvdyBhLm5hbWUgPSBjLlVua25vd25FcnJvciwgYTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBtKGUucmVzcG9uc2UuY2xpZW50RGF0YUpTT04pLCB0ID0gZS5yZXNwb25zZSwgaSA9IG5ldyBJbnQ4QXJyYXkoXG4gICAgICAgIHQuYXR0ZXN0YXRpb25PYmplY3RcbiAgICAgICkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBgJHthfTo6JHtpfTo6JHtlLmlkfWA7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCB0ID0gbmV3IEVycm9yKFwiVHJhbnNmb3JtaW5nIGNyZWRlbnRpYWwgb2JqZWN0IHRvIHN0cmluZyBmYWlsZWRcIik7XG4gICAgICB0aHJvdyB0Lm5hbWUgPSBjLkVuY29kaW5nRXJyb3IsIHQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhdXRoZW50aWNhdGlvbiB0cmVlIG1ldGFkYXRhIGludG8gb3B0aW9ucyByZXF1aXJlZCBieSB0aGUgYnJvd3NlclxuICAgKiBXZWIgQXV0aGVudGljYXRpb24gQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1ldGFkYXRhIHByb3ZpZGVkIGluIHRoZSBhdXRoZW50aWNhdGlvbiB0cmVlIE1ldGFkYXRhQ2FsbGJhY2tcbiAgICogQHJldHVybiBUaGUgV2ViIEF1dGhlbnRpY2F0aW9uIEFQSSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBdXRoZW50aWNhdGlvblB1YmxpY0tleShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWNjZXB0YWJsZUNyZWRlbnRpYWxzOiBhLFxuICAgICAgYWxsb3dDcmVkZW50aWFsczogdCxcbiAgICAgIGNoYWxsZW5nZTogaSxcbiAgICAgIHJlbHlpbmdQYXJ0eUlkOiBvLFxuICAgICAgdGltZW91dDogbixcbiAgICAgIHVzZXJWZXJpZmljYXRpb246IHJcbiAgICB9ID0gZSwgcyA9IEMobyksIGwgPSB3KHQgfHwgYSB8fCBcIlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2hhbGxlbmdlOiBVaW50OEFycmF5LmZyb20oYXRvYihpKSwgKGQpID0+IGQuY2hhckNvZGVBdCgwKSkuYnVmZmVyLFxuICAgICAgdGltZW91dDogbixcbiAgICAgIC8vIG9ubHkgYWRkIGtleS12YWx1ZSBwYWlyIGlmIHByb3BlciB2YWx1ZSBpcyBwcm92aWRlZFxuICAgICAgLi4ubCAmJiB7IGFsbG93Q3JlZGVudGlhbHM6IGwgfSxcbiAgICAgIC4uLnIgJiYgeyB1c2VyVmVyaWZpY2F0aW9uOiByIH0sXG4gICAgICAuLi5zICYmIHsgcnBJZDogcyB9XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgYXV0aGVudGljYXRpb24gdHJlZSBtZXRhZGF0YSBpbnRvIG9wdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGJyb3dzZXJcbiAgICogV2ViIEF1dGhlbnRpY2F0aW9uIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBwcm92aWRlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gdHJlZSBNZXRhZGF0YUNhbGxiYWNrXG4gICAqIEByZXR1cm4gVGhlIFdlYiBBdXRoZW50aWNhdGlvbiBBUEkgcmVxdWVzdCBvcHRpb25zXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUmVnaXN0cmF0aW9uUHVibGljS2V5KGUpIHtcbiAgICBjb25zdCB7IHB1YktleUNyZWRQYXJhbXM6IGEgfSA9IGUsIHQgPSBrKGEpO1xuICAgIGlmICghdCkge1xuICAgICAgY29uc3QgdSA9IG5ldyBFcnJvcihcIk1pc3NpbmcgcHViS2V5Q3JlZFBhcmFtcyBwcm9wZXJ0eSBmcm9tIHJlZ2lzdHJhdGlvbiBvcHRpb25zXCIpO1xuICAgICAgdGhyb3cgdS5uYW1lID0gYy5EYXRhRXJyb3IsIHU7XG4gICAgfVxuICAgIGNvbnN0IGkgPSB3KGUuZXhjbHVkZUNyZWRlbnRpYWxzKSwge1xuICAgICAgYXR0ZXN0YXRpb25QcmVmZXJlbmNlOiBvLFxuICAgICAgYXV0aGVudGljYXRvclNlbGVjdGlvbjogbixcbiAgICAgIGNoYWxsZW5nZTogcixcbiAgICAgIHJlbHlpbmdQYXJ0eUlkOiBzLFxuICAgICAgcmVseWluZ1BhcnR5TmFtZTogbCxcbiAgICAgIHRpbWVvdXQ6IGQsXG4gICAgICB1c2VySWQ6IE8sXG4gICAgICB1c2VyTmFtZTogYixcbiAgICAgIGRpc3BsYXlOYW1lOiB5XG4gICAgfSA9IGUsIGYgPSBDKHMpLCBBID0ge1xuICAgICAgbmFtZTogbCxcbiAgICAgIC4uLmYgJiYgeyBpZDogZiB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0ZXN0YXRpb246IG8sXG4gICAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiBKU09OLnBhcnNlKG4pLFxuICAgICAgY2hhbGxlbmdlOiBVaW50OEFycmF5LmZyb20oYXRvYihyKSwgKHUpID0+IHUuY2hhckNvZGVBdCgwKSkuYnVmZmVyLFxuICAgICAgLi4uaS5sZW5ndGggJiYgeyBleGNsdWRlQ3JlZGVudGlhbHM6IGkgfSxcbiAgICAgIHB1YktleUNyZWRQYXJhbXM6IHQsXG4gICAgICBycDogQSxcbiAgICAgIHRpbWVvdXQ6IGQsXG4gICAgICB1c2VyOiB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiB5IHx8IGIsXG4gICAgICAgIGlkOiBJbnQ4QXJyYXkuZnJvbShPLnNwbGl0KFwiXCIpLm1hcCgodSkgPT4gdS5jaGFyQ29kZUF0KDApKSksXG4gICAgICAgIG5hbWU6IHkgfHwgYlxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCB7XG4gIGcgYXMgV2ViQXV0aG5PdXRjb21lLFxuICBoIGFzIFdlYkF1dGhuU3RlcFR5cGUsXG4gIFYgYXMgZGVmYXVsdFxufTtcbiIsImltcG9ydCB7IGdldEVuZHBvaW50UGF0aCBhcyBTLCByZXNvbHZlIGFzIEMsIHN0cmluZ2lmeSBhcyBnIH0gZnJvbSBcIi4uL3V0aWwvdXJsLmpzXCI7XG5pbXBvcnQgeyBGUkxvZ2dlciBhcyB5IH0gZnJvbSBcIi4uL3V0aWwvbG9nZ2VyLmpzXCI7XG5mdW5jdGlvbiBQKGUsIHQsIG4pIHtcbiAgY29uc3QgaSA9IG5ldyBIZWFkZXJzKGUuaGVhZGVycyk7XG4gIHJldHVybiB0LkF1dGhlbnRpY2F0ZVRvU2VydmljZUNvbmRpdGlvbkFkdmljZSA/IGkuc2V0KFwiWC1UcmVlXCIsIHQuQXV0aGVudGljYXRlVG9TZXJ2aWNlQ29uZGl0aW9uQWR2aWNlWzBdKSA6IHQuVHJhbnNhY3Rpb25Db25kaXRpb25BZHZpY2UgJiYgaS5zZXQoXCJYLVR4SURcIiwgdC5UcmFuc2FjdGlvbkNvbmRpdGlvbkFkdmljZVswXSksIG4gJiYgbi5pZFRva2VuICYmIGkuc2V0KFwiWC1JZFRva2VuXCIsIG4uaWRUb2tlbiksIGk7XG59XG5mdW5jdGlvbiBXKGUsIHQsIG4pIHtcbiAgY29uc3QgaSA9IG5ldyBVUkwoZSk7XG4gIGlmICh0LlRyYW5zYWN0aW9uQ29uZGl0aW9uQWR2aWNlKSB7XG4gICAgY29uc3QgYyA9IHQuVHJhbnNhY3Rpb25Db25kaXRpb25BZHZpY2VbMF07XG4gICAgaS5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiX3R4aWRcIiwgYyk7XG4gIH1cbiAgcmV0dXJuIG4gJiYgbi5pZFRva2VuICYmIGkuc2VhcmNoUGFyYW1zLmFwcGVuZChcIl9pZHRva2VuXCIsIG4uaWRUb2tlbiksIGkudG9TdHJpbmcoKTtcbn1cbmZ1bmN0aW9uIGIoZSwgdCwgbiwgaSwgYykge1xuICBjb25zdCByID0gZS5hZHZpY2VzICYmIGUuYWR2aWNlcy5BdXRoZW50aWNhdGVUb1NlcnZpY2VDb25kaXRpb25BZHZpY2UsIGEgPSBlLmFkdmljZXMgJiYgZS5hZHZpY2VzLlRyYW5zYWN0aW9uQ29uZGl0aW9uQWR2aWNlO1xuICBsZXQgZCA9IFwiXCIsIHMgPSBcIlwiO1xuICByID8gKGQgPSByLnJlZHVjZSgobywgdSkgPT4ge1xuICAgIGNvbnN0IGwgPSBvICYmIGAgJHtvfWA7XG4gICAgcmV0dXJuIG8gPSBgJHt1fSR7bH1gLCBvO1xuICB9LCBcIlwiKSwgcyA9IFwiQXV0aGVudGljYXRlVG9TZXJ2aWNlQ29uZGl0aW9uQWR2aWNlXCIpIDogYSAmJiAoZCA9IGEucmVkdWNlKChvLCB1KSA9PiB7XG4gICAgY29uc3QgbCA9IG8gJiYgYCAke299YDtcbiAgICByZXR1cm4gbyA9IGAke3V9JHtsfWAsIG87XG4gIH0sIFwiXCIpLCBzID0gXCJUcmFuc2FjdGlvbkNvbmRpdGlvbkFkdmljZVwiKTtcbiAgY29uc3QgdiA9IFwiPEFkdmljZXM+PEF0dHJpYnV0ZVZhbHVlUGFpcj5cIiwgaCA9IGA8QXR0cmlidXRlIG5hbWU9XCIke3N9XCIvPmAsIFQgPSBgPFZhbHVlPiR7ZH08L1ZhbHVlPmAsIGYgPSBgJHt2fSR7aH0ke1R9PC9BdHRyaWJ1dGVWYWx1ZVBhaXI+PC9BZHZpY2VzPmAsIHAgPSBTKFwiYXV0aGVudGljYXRlXCIsIGksIGMpLCBtID0ge1xuICAgIGF1dGhJbmRleFR5cGU6IFwiY29tcG9zaXRlX2FkdmljZVwiLFxuICAgIGF1dGhJbmRleFZhbHVlOiBmXG4gIH07XG4gIHJldHVybiB7XG4gICAgaW5pdDoge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgXCJBY2NlcHQtQVBJLVZlcnNpb25cIjogXCJyZXNvdXJjZT0yLjAsIHByb3RvY29sPTEuMFwiXG4gICAgICB9KVxuICAgIH0sXG4gICAgdGltZW91dDogbixcbiAgICB1cmw6IEModCwgYCR7cH0/JHtnKG0pfWApXG4gIH07XG59XG5mdW5jdGlvbiBIKGUpIHtcbiAgcmV0dXJuIChlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCIpLmluY2x1ZGVzKFwiaHRtbFwiKSAmJiBlLnVybC5pbmNsdWRlcyhcImNvbXBvc2l0ZV9hZHZpY2VcIik7XG59XG5mdW5jdGlvbiBMKGUpIHtcbiAgcmV0dXJuIChlLmdldChcIldXVy1BdXRoZW50aWNhdGVcIikgfHwgXCJcIikuaW5jbHVkZXMoXCJhZHZpY2VzXCIpO1xufVxuYXN5bmMgZnVuY3Rpb24gdyhlKSB7XG4gIHJldHVybiAhIShhd2FpdCBlLmNsb25lKCkuanNvbigpKS5hZHZpY2VzO1xufVxuZnVuY3Rpb24gQShlKSB7XG4gIGNvbnN0IG4gPSBuZXcgVVJMKGUpLnNlYXJjaFBhcmFtcy5nZXQoXCJhdXRoSW5kZXhWYWx1ZVwiKSB8fCBcIlwiLCBpID0gbmV3IERPTVBhcnNlcigpLCBjID0gZGVjb2RlVVJJQ29tcG9uZW50KG4pLCBhID0gaS5wYXJzZUZyb21TdHJpbmcoYywgXCJhcHBsaWNhdGlvbi94bWxcIikucXVlcnlTZWxlY3RvcihcIlZhbHVlXCIpO1xuICByZXR1cm4gYSA/IGEuaW5uZXJIVE1MIDogXCJcIjtcbn1cbmZ1bmN0aW9uIFYoZSkge1xuICBjb25zdCBuID0gKGUuc3BsaXQoXCIsXCIpIHx8IFtdKS5maW5kKChjKSA9PiBjLmluY2x1ZGVzKFwiYWR2aWNlc1wiKSkgfHwgXCJcIjtcbiAgbGV0IGk7XG4gIHRyeSB7XG4gICAgY29uc3QgYyA9IG4ubWF0Y2goL1wiKFxcUyspXCIvKSwgciA9IGMgPyBjWzFdIDogXCJcIiwgYSA9IGF0b2Iocik7XG4gICAgcmV0dXJuIGkgPSBKU09OLnBhcnNlKGEpLCBpO1xuICB9IGNhdGNoIHtcbiAgICB5LmVycm9yKFwiQ291bGQgbm90IHBhcnNlIGFkdmljZXMgdmFsdWUgZnJvbSBXV1ctQXV0aGVudGljYXRlIGhlYWRlclwiKTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiB6KGUpIHtcbiAgcmV0dXJuIGUuYWR2aWNlcyAmJiBlLmFkdmljZXMuQXV0aGVudGljYXRlVG9TZXJ2aWNlQ29uZGl0aW9uQWR2aWNlID8gQXJyYXkuaXNBcnJheShlLmFkdmljZXMuQXV0aGVudGljYXRlVG9TZXJ2aWNlQ29uZGl0aW9uQWR2aWNlKSAmJiBlLmFkdmljZXMuQXV0aGVudGljYXRlVG9TZXJ2aWNlQ29uZGl0aW9uQWR2aWNlLmxlbmd0aCA+IDAgOiBlLmFkdmljZXMgJiYgZS5hZHZpY2VzLlRyYW5zYWN0aW9uQ29uZGl0aW9uQWR2aWNlID8gQXJyYXkuaXNBcnJheShlLmFkdmljZXMuVHJhbnNhY3Rpb25Db25kaXRpb25BZHZpY2UpICYmIGUuYWR2aWNlcy5UcmFuc2FjdGlvbkNvbmRpdGlvbkFkdmljZS5sZW5ndGggPiAwIDogITE7XG59XG5hc3luYyBmdW5jdGlvbiBGKGUpIHtcbiAgcmV0dXJuICEhKGF3YWl0IGUuY2xvbmUoKS5qc29uKCkpLmNhbGxiYWNrcztcbn1cbmZ1bmN0aW9uIE8oZSwgdCkge1xuICByZXR1cm4gdHlwZW9mIHQgPT0gXCJmdW5jdGlvblwiID8gdChlKSA6IGUuc3RhdHVzID09PSA0MDE7XG59XG5mdW5jdGlvbiBVKGUpIHtcbiAgY29uc3QgdCA9IHt9O1xuICByZXR1cm4gZS51cmwuaW5jbHVkZXMoXCJBdXRoZW50aWNhdGVUb1NlcnZpY2VDb25kaXRpb25BZHZpY2VcIikgPyB0LkF1dGhlbnRpY2F0ZVRvU2VydmljZUNvbmRpdGlvbkFkdmljZSA9IFtBKGUudXJsKV0gOiB0LlRyYW5zYWN0aW9uQ29uZGl0aW9uQWR2aWNlID0gW0EoZS51cmwpXSwge1xuICAgIHJlc291cmNlOiBcIlwiLFxuICAgIGFjdGlvbnM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGFkdmljZXM6IHQsXG4gICAgdHRsOiAwXG4gIH07XG59XG5mdW5jdGlvbiBKKGUpIHtcbiAgY29uc3QgdCA9IGUuaGVhZGVycy5nZXQoXCJXV1ctQXV0aGVudGljYXRlXCIpIHx8IFwiXCIsIG4gPSBWKHQpO1xuICByZXR1cm4ge1xuICAgIHJlc291cmNlOiBcIlwiLFxuICAgIGFjdGlvbnM6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGFkdmljZXM6IG4sXG4gICAgdHRsOiAwXG4gIH07XG59XG5hc3luYyBmdW5jdGlvbiBOKGUpIHtcbiAgcmV0dXJuIGF3YWl0IGUuanNvbigpO1xufVxuZXhwb3J0IHtcbiAgUCBhcyBhZGRBdXRoekluZm9Ub0hlYWRlcnMsXG4gIFcgYXMgYWRkQXV0aHpJbmZvVG9VUkwsXG4gIGIgYXMgYnVpbGRBdXRoek9wdGlvbnMsXG4gIEggYXMgZXhhbWluZUZvcklHQXV0aHosXG4gIEwgYXMgZXhhbWluZUZvcklHQXV0aHpIZWFkZXIsXG4gIHcgYXMgZXhhbWluZUZvclJFU1RBdXRoeixcbiAgViBhcyBnZXRBZHZpY2VzRnJvbUhlYWRlcixcbiAgeiBhcyBoYXNBdXRoekFkdmljZSxcbiAgRiBhcyBpc0F1dGh6U3RlcCxcbiAgTyBhcyBuZXdUb2tlblJlcXVpcmVkLFxuICBKIGFzIG5vcm1hbGl6ZUlHSlNPTlJlc3BvbnNlVG9BZHZpY2VKU09OLFxuICBVIGFzIG5vcm1hbGl6ZUlHUmVkaXJlY3RSZXNwb25zZVRvQWR2aWNlSlNPTixcbiAgTiBhcyBub3JtYWxpemVSRVNUSlNPTlxufTtcbiIsImltcG9ydCB6IGZyb20gXCIuLi9jb25maWcvaW5kZXguanNcIjtcbmltcG9ydCB7IEFjdGlvblR5cGVzIGFzIFMgfSBmcm9tIFwiLi4vY29uZmlnL2VudW1zLmpzXCI7XG5pbXBvcnQgVCBmcm9tIFwiLi4vZnItYXV0aC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU3RlcFR5cGUgYXMgZCB9IGZyb20gXCIuLi9mci1hdXRoL2VudW1zLmpzXCI7XG5pbXBvcnQgeSBmcm9tIFwiLi4vZnItYXV0aC9mci1zdGVwLmpzXCI7XG5pbXBvcnQgZyBmcm9tIFwiLi4vdG9rZW4tbWFuYWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IGYgZnJvbSBcIi4uL3Rva2VuLXN0b3JhZ2UvaW5kZXguanNcIjtcbmltcG9ydCB7IHdpdGhUaW1lb3V0IGFzIEkgfSBmcm9tIFwiLi4vdXRpbC90aW1lb3V0LmpzXCI7XG5pbXBvcnQgeyBuZXdUb2tlblJlcXVpcmVkIGFzIFIsIGV4YW1pbmVGb3JJR0F1dGh6SGVhZGVyIGFzIHYsIG5vcm1hbGl6ZUlHSlNPTlJlc3BvbnNlVG9BZHZpY2VKU09OIGFzIGssIGV4YW1pbmVGb3JJR0F1dGh6IGFzIHgsIG5vcm1hbGl6ZUlHUmVkaXJlY3RSZXNwb25zZVRvQWR2aWNlSlNPTiBhcyBxLCBleGFtaW5lRm9yUkVTVEF1dGh6IGFzIEUsIG5vcm1hbGl6ZVJFU1RKU09OIGFzIE4sIGJ1aWxkQXV0aHpPcHRpb25zIGFzIE8sIGlzQXV0aHpTdGVwIGFzIEYsIGhhc0F1dGh6QWR2aWNlIGFzIEgsIGFkZEF1dGh6SW5mb1RvVVJMIGFzIFUsIGFkZEF1dGh6SW5mb1RvSGVhZGVycyBhcyBHIH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IEogZnJvbSBcIi4uL3V0aWwvbWlkZGxld2FyZS5qc1wiO1xuY2xhc3MgRCB7XG4gIC8qKlxuICAgKiBNYWtlcyBhIHJlcXVlc3QgdXNpbmcgdGhlIHNwZWNpZmllZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBtYWtpbmcgdGhlIHJlcXVlc3RcbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXF1ZXN0KGUpIHtcbiAgICBsZXQgciA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoZSwgITEpLCB0LCBhID0gITE7XG4gICAgaWYgKFIociwgZS5yZXF1aXJlc05ld1Rva2VuKSAmJiAociA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoZSwgITApKSwgZS5hdXRob3JpemF0aW9uICYmIGUuYXV0aG9yaXphdGlvbi5oYW5kbGVTdGVwKVxuICAgICAgaWYgKHIuc3RhdHVzID09PSA0MDEgJiYgdihyLmhlYWRlcnMpID8gKGEgPSAhMCwgdCA9IGsocikpIDogci5yZWRpcmVjdGVkICYmIHgocikgPyAoYSA9ICEwLCB0ID0gcShyKSkgOiBhd2FpdCBFKHIpICYmICh0ID0gYXdhaXQgTihyKSksIHQgJiYgdC5hZHZpY2VzKSB7XG4gICAgICAgIGNvbnN0IHsgbWlkZGxld2FyZTogbiwgcmVhbG1QYXRoOiBpLCBzZXJ2ZXJDb25maWc6IG8gfSA9IHouZ2V0KGUuYXV0aG9yaXphdGlvbi5jb25maWcpLCBzID0gTyhcbiAgICAgICAgICB0LFxuICAgICAgICAgIG8uYmFzZVVybCxcbiAgICAgICAgICBlLnRpbWVvdXQsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBvLnBhdGhzXG4gICAgICAgICksIGMgPSBuZXcgVVJMKHMudXJsKSwgdSA9IGMuc2VhcmNoUGFyYW1zLmdldChcImF1dGhJbmRleFR5cGVcIiksIG0gPSBjLnNlYXJjaFBhcmFtcy5nZXQoXCJhdXRoSW5kZXhWYWx1ZVwiKSwgdyA9IEooXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXJsOiBuZXcgVVJMKHMudXJsKSxcbiAgICAgICAgICAgIGluaXQ6IHMuaW5pdFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogUy5TdGFydEF1dGhlbnRpY2F0ZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHsgdHlwZTogdSwgdHJlZTogbSB9XG4gICAgICAgICAgfVxuICAgICAgICApLCB7IHVybDogcCwgaW5pdDogQSB9ID0gdyhuKTtcbiAgICAgICAgcy51cmwgPSBwLnRvU3RyaW5nKCksIHMuaW5pdCA9IEE7XG4gICAgICAgIGNvbnN0IGggPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KHMsICExKTtcbiAgICAgICAgaWYgKCFhd2FpdCBGKGgpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3I6IEluaXRpYWwgcmVzcG9uc2UgZnJvbSBhdXRoIHNlcnZlciBub3QgYSBcInN0ZXBcIi4nKTtcbiAgICAgICAgaWYgKCFIKHQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yOiBUcmFuc2FjdGlvbmFsIG9yIFNlcnZpY2UgQWR2aWNlIGlzIGVtcHR5LlwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGVwSXRlcmF0b3IoaCwgZS5hdXRob3JpemF0aW9uLmhhbmRsZVN0ZXApO1xuICAgICAgICBjb25zdCBsID0gYXdhaXQgZi5nZXQoKTtcbiAgICAgICAgYSA/IGUudXJsID0gVShlLnVybCwgdC5hZHZpY2VzLCBsKSA6IGUuaW5pdC5oZWFkZXJzID0gRyhcbiAgICAgICAgICBlLmluaXQsXG4gICAgICAgICAgdC5hZHZpY2VzLFxuICAgICAgICAgIGxcbiAgICAgICAgKSwgciA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoZSwgITEpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yOiBVbmFibGUgdG8gcHJvY2VzcyBhZHZpY2VcIik7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgc3RhdGljIGFzeW5jIHNldEF1dGhIZWFkZXJzKGUsIHIpIHtcbiAgICBsZXQgdCA9IGF3YWl0IGYuZ2V0KCk7XG4gICAgcmV0dXJuIHQgJiYgdC5hY2Nlc3NUb2tlbiAmJiAodCA9IGF3YWl0IGcuZ2V0VG9rZW5zKHsgZm9yY2VSZW5ldzogciB9KSwgdCAmJiB0LmFjY2Vzc1Rva2VuICYmIGUuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7dC5hY2Nlc3NUb2tlbn1gKSksIGU7XG4gIH1cbiAgc3RhdGljIGFzeW5jIHN0ZXBJdGVyYXRvcihlLCByKSB7XG4gICAgY29uc3QgdCA9IGF3YWl0IGUuanNvbigpLCBhID0gbmV3IHkodCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChuLCBpKSA9PiB7XG4gICAgICBhc3luYyBmdW5jdGlvbiBvKHMpIHtcbiAgICAgICAgY29uc3QgYyA9IGF3YWl0IHIocyksIHUgPSBhd2FpdCBULm5leHQoYywgeyB0cmVlOiBcIlwiLCB0eXBlOiBcIlwiIH0pO1xuICAgICAgICB1LnR5cGUgPT09IGQuTG9naW5TdWNjZXNzID8gbigpIDogdS50eXBlID09PSBkLkxvZ2luRmFpbHVyZSA/IGkoXCJBdXRoZW50aWNhdGlvbiB0cmVlIGZhaWx1cmUuXCIpIDogbyh1KTtcbiAgICAgIH1cbiAgICAgIG8oYSk7XG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGFzeW5jIF9yZXF1ZXN0KGUsIHIpIHtcbiAgICBjb25zdCB7IHVybDogdCwgaW5pdDogYSwgdGltZW91dDogbiB9ID0gZTtcbiAgICBsZXQgaSA9IG5ldyBIZWFkZXJzKGEuaGVhZGVycyB8fCB7fSk7XG4gICAgcmV0dXJuIGUuYXV0aG9yaXphdGlvbiAmJiBpLnNldChcIngtYXV0aGVudGljYXRlLXJlc3BvbnNlXCIsIFwiaGVhZGVyXCIpLCBlLmJ5cGFzc0F1dGhlbnRpY2F0aW9uIHx8IChpID0gYXdhaXQgdGhpcy5zZXRBdXRoSGVhZGVycyhpLCByKSksIGEuaGVhZGVycyA9IGksIEkoZmV0Y2godCwgYSksIG4pO1xuICB9XG59XG5leHBvcnQge1xuICBEIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgciBmcm9tIFwiLi4vb2F1dGgyLWNsaWVudC9pbmRleC5qc1wiO1xuY2xhc3MgYSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHVzZXIncyBwcm9maWxlLlxuICAgKi9cbiAgc3RhdGljIGdldEN1cnJlbnRVc2VyKGUpIHtcbiAgICByZXR1cm4gci5nZXRVc2VySW5mbyhlKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgYSBhcyBkZWZhdWx0XG59O1xuIiwiY2xhc3MgdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChlLCBzKSA9PiB7XG4gICAgICB0aGlzLnJlamVjdCA9IHMsIHRoaXMucmVzb2x2ZSA9IGU7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHQgYXMgZGVmYXVsdFxufTtcbiIsImNsYXNzIHIge1xuICBjb25zdHJ1Y3RvcihlID0gITEpIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSBlID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XG4gIH1cbiAgZ2V0KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oZSk7XG4gICAgaWYgKHQpXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0KTtcbiAgfVxuICBzZXQoZSwgdCkge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGUsIEpTT04uc3RyaW5naWZ5KHQpKTtcbiAgfVxuICByZW1vdmUoZSkge1xuICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGUpO1xuICB9XG59XG5leHBvcnQge1xuICByIGFzIGRlZmF1bHRcbn07XG4iLCJpbXBvcnQgeyBkZWZhdWx0IGFzIHQgfSBmcm9tIFwiLi9hdXRoL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBDYWxsYmFja1R5cGUgYXMgciwgRXJyb3JDb2RlIGFzIGwgfSBmcm9tIFwiLi9hdXRoL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHAgfSBmcm9tIFwiLi9jb25maWcvaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgcyB9IGZyb20gXCIuL2ZyLWF1dGgvaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgbSB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIGMgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9hdHRyaWJ1dGUtaW5wdXQtY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgbiB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL2Nob2ljZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBiIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvY29uZmlybWF0aW9uLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFIgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9kZXZpY2UtcHJvZmlsZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGV2aWNlQ2xpZW50IGFzIEYgfSBmcm9tIFwiLi9kZXZpY2UtY2xpZW50L2RldmljZS5zdG9yZS5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBUIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvaGlkZGVuLXZhbHVlLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFMgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9rYmEtY3JlYXRlLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEEgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9tZXRhZGF0YS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB2IH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvbmFtZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvcGFzc3dvcmQtY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgVyB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL3BvbGxpbmctd2FpdC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBLIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvcmVjYXB0Y2hhLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFUgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9yZWRpcmVjdC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB3IH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3Mvc2VsZWN0LWlkcC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB6IH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3Mvc3VzcGVuZGVkLXRleHQtb3V0cHV0LWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFEgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy90ZXJtcy1hbmQtY29uZGl0aW9ucy1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBxIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvdGV4dC1pbnB1dC1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBHIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvdGV4dC1vdXRwdXQtY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgWCB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL3ZhbGlkYXRlZC1jcmVhdGUtcGFzc3dvcmQtY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgWiB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL3ZhbGlkYXRlZC1jcmVhdGUtdXNlcm5hbWUtY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IFN0ZXBUeXBlIGFzICQgfSBmcm9tIFwiLi9mci1hdXRoL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIGFlIH0gZnJvbSBcIi4vZnItYXV0aC9mci1sb2dpbi1mYWlsdXJlLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIG9lIH0gZnJvbSBcIi4vZnItYXV0aC9jYWxsYmFja3MvcGluZy1wcm90ZWN0LWV2YWx1YXRpb24tY2FsbGJhY2suanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgbGUgfSBmcm9tIFwiLi9mci1hdXRoL2NhbGxiYWNrcy9waW5nLXByb3RlY3QtaW5pdGlhbGl6ZS1jYWxsYmFjay5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBwZSB9IGZyb20gXCIuL2ZyLWF1dGgvY2FsbGJhY2tzL3JlY2FwdGNoYS1lbnRlcnByaXNlLWNhbGxiYWNrLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNlIH0gZnJvbSBcIi4vZnItYXV0aC9mci1sb2dpbi1zdWNjZXNzLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIG1lIH0gZnJvbSBcIi4vZnItYXV0aC9mci1zdGVwLmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIGNlIH0gZnJvbSBcIi4vZnItZGV2aWNlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIG5lIH0gZnJvbSBcIi4vZnItcG9saWN5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIGJlIH0gZnJvbSBcIi4vZnItcXItY29kZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBSZSB9IGZyb20gXCIuL2ZyLXBvbGljeS9tZXNzYWdlLWNyZWF0b3IuanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgRmUgfSBmcm9tIFwiLi9mci1yZWNvdmVyeS1jb2Rlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBUZSB9IGZyb20gXCIuL2ZyLXVzZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgU2UgfSBmcm9tIFwiLi9mci13ZWJhdXRobi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBBZSB9IGZyb20gXCIuL2h0dHAtY2xpZW50L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHZlIH0gZnJvbSBcIi4vb2F1dGgyLWNsaWVudC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFZSB9IGZyb20gXCIuL3Nlc3Npb24tbWFuYWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBXZSB9IGZyb20gXCIuL3Rva2VuLW1hbmFnZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgS2UgfSBmcm9tIFwiLi90b2tlbi1zdG9yYWdlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIFVlIH0gZnJvbSBcIi4vdXNlci1tYW5hZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHdlIH0gZnJvbSBcIi4vdXRpbC9kZWZlcnJlZC5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB6ZSB9IGZyb20gXCIuL3V0aWwvcGtjZS5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBRZSB9IGZyb20gXCIuL3V0aWwvc3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgUG9saWN5S2V5IGFzIHFlIH0gZnJvbSBcIi4vZnItcG9saWN5L2VudW1zLmpzXCI7XG5pbXBvcnQgeyBSZXNwb25zZVR5cGUgYXMgR2UgfSBmcm9tIFwiLi9vYXV0aDItY2xpZW50L2VudW1zLmpzXCI7XG5pbXBvcnQgeyBXZWJBdXRobk91dGNvbWUgYXMgWGUsIFdlYkF1dGhuU3RlcFR5cGUgYXMgWWUgfSBmcm9tIFwiLi9mci13ZWJhdXRobi9lbnVtcy5qc1wiO1xuZXhwb3J0IHtcbiAgYyBhcyBBdHRyaWJ1dGVJbnB1dENhbGxiYWNrLFxuICB0IGFzIEF1dGgsXG4gIHIgYXMgQ2FsbGJhY2tUeXBlLFxuICBuIGFzIENob2ljZUNhbGxiYWNrLFxuICBwIGFzIENvbmZpZyxcbiAgYiBhcyBDb25maXJtYXRpb25DYWxsYmFjayxcbiAgd2UgYXMgRGVmZXJyZWQsXG4gIFIgYXMgRGV2aWNlUHJvZmlsZUNhbGxiYWNrLFxuICBsIGFzIEVycm9yQ29kZSxcbiAgcyBhcyBGUkF1dGgsXG4gIG0gYXMgRlJDYWxsYmFjayxcbiAgY2UgYXMgRlJEZXZpY2UsXG4gIGFlIGFzIEZSTG9naW5GYWlsdXJlLFxuICBzZSBhcyBGUkxvZ2luU3VjY2VzcyxcbiAgbmUgYXMgRlJQb2xpY3ksXG4gIGJlIGFzIEZSUVJDb2RlLFxuICBGZSBhcyBGUlJlY292ZXJ5Q29kZXMsXG4gIG1lIGFzIEZSU3RlcCxcbiAgVGUgYXMgRlJVc2VyLFxuICBTZSBhcyBGUldlYkF1dGhuLFxuICBUIGFzIEhpZGRlblZhbHVlQ2FsbGJhY2ssXG4gIEFlIGFzIEh0dHBDbGllbnQsXG4gIFMgYXMgS2JhQ3JlYXRlQ2FsbGJhY2ssXG4gIFFlIGFzIExvY2FsU3RvcmFnZSxcbiAgQSBhcyBNZXRhZGF0YUNhbGxiYWNrLFxuICB2IGFzIE5hbWVDYWxsYmFjayxcbiAgdmUgYXMgT0F1dGgyQ2xpZW50LFxuICB6ZSBhcyBQS0NFLFxuICBFIGFzIFBhc3N3b3JkQ2FsbGJhY2ssXG4gIG9lIGFzIFBpbmdPbmVQcm90ZWN0RXZhbHVhdGlvbkNhbGxiYWNrLFxuICBsZSBhcyBQaW5nT25lUHJvdGVjdEluaXRpYWxpemVDYWxsYmFjayxcbiAgcWUgYXMgUG9saWN5S2V5LFxuICBXIGFzIFBvbGxpbmdXYWl0Q2FsbGJhY2ssXG4gIEsgYXMgUmVDYXB0Y2hhQ2FsbGJhY2ssXG4gIHBlIGFzIFJlQ2FwdGNoYUVudGVycHJpc2VDYWxsYmFjayxcbiAgVSBhcyBSZWRpcmVjdENhbGxiYWNrLFxuICBHZSBhcyBSZXNwb25zZVR5cGUsXG4gIHcgYXMgU2VsZWN0SWRQQ2FsbGJhY2ssXG4gIEVlIGFzIFNlc3Npb25NYW5hZ2VyLFxuICAkIGFzIFN0ZXBUeXBlLFxuICB6IGFzIFN1c3BlbmRlZFRleHRPdXRwdXRDYWxsYmFjayxcbiAgUSBhcyBUZXJtc0FuZENvbmRpdGlvbnNDYWxsYmFjayxcbiAgcSBhcyBUZXh0SW5wdXRDYWxsYmFjayxcbiAgRyBhcyBUZXh0T3V0cHV0Q2FsbGJhY2ssXG4gIFdlIGFzIFRva2VuTWFuYWdlcixcbiAgS2UgYXMgVG9rZW5TdG9yYWdlLFxuICBVZSBhcyBVc2VyTWFuYWdlcixcbiAgWCBhcyBWYWxpZGF0ZWRDcmVhdGVQYXNzd29yZENhbGxiYWNrLFxuICBaIGFzIFZhbGlkYXRlZENyZWF0ZVVzZXJuYW1lQ2FsbGJhY2ssXG4gIFhlIGFzIFdlYkF1dGhuT3V0Y29tZSxcbiAgWWUgYXMgV2ViQXV0aG5TdGVwVHlwZSxcbiAgUmUgYXMgZGVmYXVsdE1lc3NhZ2VDcmVhdG9yLFxuICBGIGFzIGRldmljZUNsaWVudFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///19624\n')},19679:(module,exports,__webpack_require__)=>{eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*!\nCopyright (c) The Cytoscape Consortium\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n;(function(){ 'use strict';\n\n // registers the extension on a cytoscape lib ref\n var register = function( cytoscape, $ ){\n if( !cytoscape || !$ ){ return; } // can't register if cytoscape or jquery unspecified\n\n $.fn.cyPanzoom = $.fn.cytoscapePanzoom = function( options ){\n panzoom.apply( this, [ options, cytoscape, $ ] );\n\n return this; // chainability\n };\n\n // if you want a core extension\n cytoscape('core', 'panzoom', function( options ){ // could use options object, but args are up to you\n panzoom.apply( this, [ options, cytoscape, $ ] );\n\n return this; // chainability\n });\n\n };\n\n var defaults = {\n zoomFactor: 0.05, // zoom factor per zoom tick\n zoomDelay: 45, // how many ms between zoom ticks\n minZoom: 0.1, // min zoom level\n maxZoom: 10, // max zoom level\n fitPadding: 50, // padding when fitting\n panSpeed: 10, // how many ms in between pan ticks\n panDistance: 10, // max pan distance per tick\n panDragAreaSize: 75, // the length of the pan drag box in which the vector for panning is calculated (bigger = finer control of pan speed and direction)\n panMinPercentSpeed: 0.25, // the slowest speed we can pan by (as a percent of panSpeed)\n panInactiveArea: 8, // radius of inactive area in pan drag box\n panIndicatorMinOpacity: 0.5, // min opacity of pan indicator (the draggable nib); scales from this to 1.0\n zoomOnly: false, // a minimal version of the ui only with zooming (useful on systems with bad mousewheel resolution)\n fitSelector: undefined, // selector of elements to fit\n animateOnFit: function(){ // whether to animate on fit\n return false;\n },\n fitAnimationDuration: 1000, // duration of animation on fit\n\n // icon class names\n sliderHandleIcon: 'fa fa-minus',\n zoomInIcon: 'fa fa-plus',\n zoomOutIcon: 'fa fa-minus',\n resetIcon: 'fa fa-expand'\n };\n\n var panzoom = function( params, cytoscape, $ ){\n var cyRef = this;\n var options = $.extend(true, {}, defaults, params);\n var fn = params;\n\n var functions = {\n destroy: function(){\n var $this = $(cyRef.container());\n var $pz = $this.find(\".cy-panzoom\");\n\n $pz.data('winbdgs').forEach(function( l ){\n $(window).unbind( l.evt, l.fn );\n });\n\n $pz.data('cybdgs').forEach(function( l ){\n cyRef.off( l.evt, l.fn );\n });\n\n $pz.remove();\n },\n\n init: function(){\n var browserIsMobile = 'ontouchstart' in window;\n\n return $(cyRef.container()).each(function(){\n var $container = $(this);\n $container.cytoscape = cytoscape;\n\n var winbdgs = [];\n var $win = $(window);\n\n var windowBind = function( evt, fn ){\n winbdgs.push({ evt: evt, fn: fn });\n\n $win.bind( evt, fn );\n };\n\n var windowUnbind = function( evt, fn ){\n for( var i = 0; i < winbdgs.length; i++ ){\n var l = winbdgs[i];\n\n if( l.evt === evt && l.fn === fn ){\n winbdgs.splice( i, 1 );\n break;\n }\n }\n\n $win.unbind( evt, fn );\n };\n\n var cybdgs = [];\n\n var cyOn = function( evt, fn ){\n cybdgs.push({ evt: evt, fn: fn });\n\n cyRef.on( evt, fn );\n };\n\n var cyOff = function( evt, fn ){\n for( var i = 0; i < cybdgs.length; i++ ){\n var l = cybdgs[i];\n\n if( l.evt === evt && l.fn === fn ){\n cybdgs.splice( i, 1 );\n break;\n }\n }\n\n cyRef.off( evt, fn );\n };\n\n var $panzoom = $('
');\n $container.prepend( $panzoom );\n\n $panzoom.css('position', 'absolute'); // must be absolute regardless of stylesheet\n\n $panzoom.data('winbdgs', winbdgs);\n $panzoom.data('cybdgs', cybdgs);\n\n if( options.zoomOnly ){\n $panzoom.addClass(\"cy-panzoom-zoom-only\");\n }\n\n // add base html elements\n /////////////////////////\n\n var $zoomIn = $('
');\n $panzoom.append( $zoomIn );\n\n var $zoomOut = $('
');\n $panzoom.append( $zoomOut );\n\n var $reset = $('
');\n $panzoom.append( $reset );\n\n var $slider = $('
');\n $panzoom.append( $slider );\n\n $slider.append('
');\n\n var $sliderHandle = $('
');\n $slider.append( $sliderHandle );\n\n var $noZoomTick = $('
');\n $slider.append( $noZoomTick );\n\n var $panner = $('
');\n $panzoom.append( $panner );\n\n var $pHandle = $('
');\n $panner.append( $pHandle );\n\n var $pUp = $('
');\n var $pDown = $('
');\n var $pLeft = $('
');\n var $pRight = $('
');\n $panner.append( $pUp ).append( $pDown ).append( $pLeft ).append( $pRight );\n\n var $pIndicator = $('
');\n $panner.append( $pIndicator );\n\n // functions for calculating panning\n ////////////////////////////////////\n\n function handle2pan(e){\n var v = {\n x: e.originalEvent.pageX - $panner.offset().left - $panner.width()/2,\n y: e.originalEvent.pageY - $panner.offset().top - $panner.height()/2\n }\n\n var r = options.panDragAreaSize;\n var d = Math.sqrt( v.x*v.x + v.y*v.y );\n var percent = Math.min( d/r, 1 );\n\n if( d < options.panInactiveArea ){\n return {\n x: NaN,\n y: NaN\n };\n }\n\n v = {\n x: v.x/d,\n y: v.y/d\n };\n\n percent = Math.max( options.panMinPercentSpeed, percent );\n\n var vnorm = {\n x: -1 * v.x * (percent * options.panDistance),\n y: -1 * v.y * (percent * options.panDistance)\n };\n\n return vnorm;\n }\n\n function donePanning(){\n clearInterval(panInterval);\n windowUnbind(\"mousemove\", handler);\n\n $pIndicator.hide();\n }\n\n function positionIndicator(pan){\n var v = pan;\n var d = Math.sqrt( v.x*v.x + v.y*v.y );\n var vnorm = {\n x: -1 * v.x/d,\n y: -1 * v.y/d\n };\n\n var w = $panner.width();\n var h = $panner.height();\n var percent = d/options.panDistance;\n var opacity = Math.max( options.panIndicatorMinOpacity, percent );\n var color = 255 - Math.round( opacity * 255 );\n\n $pIndicator.show().css({\n left: w/2 * vnorm.x + w/2,\n top: h/2 * vnorm.y + h/2,\n background: \"rgb(\" + color + \", \" + color + \", \" + color + \")\"\n });\n }\n\n function calculateZoomCenterPoint(){\n var pan = cyRef.pan();\n var zoom = cyRef.zoom();\n\n zx = $container.width()/2;\n zy = $container.height()/2;\n }\n\n var zooming = false;\n function startZooming(){\n zooming = true;\n\n calculateZoomCenterPoint();\n }\n\n\n function endZooming(){\n zooming = false;\n }\n\n var zx, zy;\n function zoomTo(level){\n if( !zooming ){ // for non-continuous zooming (e.g. click slider at pt)\n calculateZoomCenterPoint();\n }\n\n cyRef.zoom({\n level: level,\n renderedPosition: { x: zx, y: zy }\n });\n }\n\n var panInterval;\n\n var handler = function(e){\n e.stopPropagation(); // don't trigger dragging of panzoom\n e.preventDefault(); // don't cause text selection\n clearInterval(panInterval);\n\n var pan = handle2pan(e);\n\n if( isNaN(pan.x) || isNaN(pan.y) ){\n $pIndicator.hide();\n return;\n }\n\n positionIndicator(pan);\n panInterval = setInterval(function(){\n cyRef.panBy(pan);\n }, options.panSpeed);\n };\n\n $pHandle.bind(\"mousedown\", function(e){\n // handle click of icon\n handler(e);\n\n // update on mousemove\n windowBind(\"mousemove\", handler);\n });\n\n $pHandle.bind(\"mouseup\", function(){\n donePanning();\n });\n\n windowBind(\"mouseup blur\", function(){\n donePanning();\n });\n\n\n\n // set up slider behaviour\n //////////////////////////\n\n $slider.bind('mousedown', function(){\n return false; // so we don't pan close to the slider handle\n });\n\n var sliderVal;\n var sliding = false;\n var sliderPadding = 2;\n\n function setSliderFromMouse(evt, handleOffset){\n if( handleOffset === undefined ){\n handleOffset = 0;\n }\n\n var padding = sliderPadding;\n var min = 0 + padding;\n var max = $slider.height() - $sliderHandle.height() - 2*padding;\n var top = evt.pageY - $slider.offset().top - handleOffset;\n\n // constrain to slider bounds\n if( top < min ){ top = min }\n if( top > max ){ top = max }\n\n var percent = 1 - (top - min) / ( max - min );\n\n // move the handle\n $sliderHandle.css('top', top);\n\n var zmin = options.minZoom;\n var zmax = options.maxZoom;\n\n // assume (zoom = zmax ^ p) where p ranges on (x, 1) with x negative\n var x = Math.log(zmin) / Math.log(zmax);\n var p = (1 - x)*percent + x;\n\n // change the zoom level\n var z = Math.pow( zmax, p );\n\n // bound the zoom value in case of floating pt rounding error\n if( z < zmin ){\n z = zmin;\n } else if( z > zmax ){\n z = zmax;\n }\n\n zoomTo( z );\n }\n\n var sliderMdownHandler, sliderMmoveHandler;\n $sliderHandle.bind('mousedown', sliderMdownHandler = function( mdEvt ){\n var handleOffset = mdEvt.target === $sliderHandle[0] ? mdEvt.offsetY : 0;\n sliding = true;\n\n startZooming();\n $sliderHandle.addClass(\"active\");\n\n var lastMove = 0;\n windowBind('mousemove', sliderMmoveHandler = function( mmEvt ){\n var now = +new Date;\n\n // throttle the zooms every 10 ms so we don't call zoom too often and cause lag\n if( now > lastMove + 10 ){\n lastMove = now;\n } else {\n return false;\n }\n\n setSliderFromMouse(mmEvt, handleOffset);\n\n return false;\n });\n\n // unbind when\n windowBind('mouseup', function(){\n windowUnbind('mousemove', sliderMmoveHandler);\n sliding = false;\n\n $sliderHandle.removeClass(\"active\");\n endZooming();\n });\n\n return false;\n });\n\n $slider.bind('mousedown', function(e){\n if( e.target !== $sliderHandle[0] ){\n sliderMdownHandler(e);\n setSliderFromMouse(e);\n }\n });\n\n function positionSliderFromZoom(){\n var z = cyRef.zoom();\n var zmin = options.minZoom;\n var zmax = options.maxZoom;\n\n // assume (zoom = zmax ^ p) where p ranges on (x, 1) with x negative\n var x = Math.log(zmin) / Math.log(zmax);\n var p = Math.log(z) / Math.log(zmax);\n var percent = 1 - (p - x) / (1 - x); // the 1- bit at the front b/c up is in the -ve y direction\n\n var min = sliderPadding;\n var max = $slider.height() - $sliderHandle.height() - 2*sliderPadding;\n var top = percent * ( max - min );\n\n // constrain to slider bounds\n if( top < min ){ top = min }\n if( top > max ){ top = max }\n\n // move the handle\n $sliderHandle.css('top', top);\n }\n\n positionSliderFromZoom();\n\n cyOn('zoom', function(){\n if( !sliding ){\n positionSliderFromZoom();\n }\n });\n\n // set the position of the zoom=1 tick\n (function(){\n var z = 1;\n var zmin = options.minZoom;\n var zmax = options.maxZoom;\n\n // assume (zoom = zmax ^ p) where p ranges on (x, 1) with x negative\n var x = Math.log(zmin) / Math.log(zmax);\n var p = Math.log(z) / Math.log(zmax);\n var percent = 1 - (p - x) / (1 - x); // the 1- bit at the front b/c up is in the -ve y direction\n\n if( percent > 1 || percent < 0 ){\n $noZoomTick.hide();\n return;\n }\n\n var min = sliderPadding;\n var max = $slider.height() - $sliderHandle.height() - 2*sliderPadding;\n var top = percent * ( max - min );\n\n // constrain to slider bounds\n if( top < min ){ top = min }\n if( top > max ){ top = max }\n\n $noZoomTick.css('top', top);\n })();\n\n // set up zoom in/out buttons\n /////////////////////////////\n\n function bindButton($button, factor){\n var zoomInterval;\n\n $button.bind(\"mousedown\", function(e){\n e.preventDefault();\n e.stopPropagation();\n\n if( e.button != 0 ){\n return;\n }\n\n var doZoom = function(){\n var zoom = cyRef.zoom();\n var lvl = cyRef.zoom() * factor;\n\n if( lvl < options.minZoom ){\n lvl = options.minZoom;\n }\n\n if( lvl > options.maxZoom ){\n lvl = options.maxZoom;\n }\n\n if( (lvl == options.maxZoom && zoom == options.maxZoom) ||\n (lvl == options.minZoom && zoom == options.minZoom)\n ){\n return;\n }\n\n zoomTo(lvl);\n };\n\n startZooming();\n doZoom();\n zoomInterval = setInterval(doZoom, options.zoomDelay);\n\n return false;\n });\n\n windowBind(\"mouseup blur\", function(){\n clearInterval(zoomInterval);\n endZooming();\n });\n }\n\n bindButton( $zoomIn, (1 + options.zoomFactor) );\n bindButton( $zoomOut, (1 - options.zoomFactor) );\n\n $reset.bind(\"mousedown\", function(e){\n if( e.button != 0 ){\n return;\n }\n\n var elesToFit = options.fitSelector?cyRef.elements(options.fitSelector):cyRef.elements();\n\n if( elesToFit.size() === 0 ){\n cyRef.reset();\n } else {\n var animateOnFit = typeof options.animateOnFit === 'function' ? options.animateOnFit.call() : options.animateOnFit;\n if(animateOnFit){\n cyRef.animate({\n fit: {\n eles: elesToFit,\n padding: options.fitPadding\n }\n }, {\n duration: options.fitAnimationDuration\n });\n }\n else{\n cyRef.fit( elesToFit, options.fitPadding );\n }\n\n }\n\n return false;\n });\n\n\n\n });\n }\n };\n\n if( functions[fn] ){\n return functions[fn].apply(this, Array.prototype.slice.call( arguments, 1 ));\n } else if( typeof fn == 'object' || !fn ) {\n return functions.init.apply( this, arguments );\n } else {\n $.error(\"No such function `\"+ fn +\"` for jquery.cytoscapePanzoom\");\n }\n\n return $(this);\n };\n\n\n if( true && module.exports ){ // expose as a commonjs module\n module.exports = function( cytoscape, jquery ){\n register( cytoscape, jquery || __webpack_require__(74692) );\n }\n } else if( true ){ // expose as an amd/requirejs module\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){\n return register;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n\n if( typeof cytoscape !== 'undefined' && typeof jQuery !== 'undefined' ){ // expose to global cytoscape (i.e. window.cytoscape)\n register( cytoscape, jQuery );\n }\n\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2NzkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLXBhbnpvb20vY3l0b3NjYXBlLXBhbnpvb20uanM/MWUxNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbkNvcHlyaWdodCAoYykgVGhlIEN5dG9zY2FwZSBDb25zb3J0aXVtXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2ZcbnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIOKAnFNvZnR3YXJl4oCdKSwgdG8gZGVhbCBpblxudGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xudXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXNcbm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkb1xuc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCDigJxBUyBJU+KAnSwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG4qL1xuXG47KGZ1bmN0aW9uKCl7ICd1c2Ugc3RyaWN0JztcblxuICAvLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG4gIHZhciByZWdpc3RlciA9IGZ1bmN0aW9uKCBjeXRvc2NhcGUsICQgKXtcbiAgICBpZiggIWN5dG9zY2FwZSB8fCAhJCApeyByZXR1cm47IH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIG9yIGpxdWVyeSB1bnNwZWNpZmllZFxuXG4gICAgJC5mbi5jeVBhbnpvb20gPSAkLmZuLmN5dG9zY2FwZVBhbnpvb20gPSBmdW5jdGlvbiggb3B0aW9ucyApe1xuICAgICAgcGFuem9vbS5hcHBseSggdGhpcywgWyBvcHRpb25zLCBjeXRvc2NhcGUsICQgXSApO1xuXG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5hYmlsaXR5XG4gICAgfTtcblxuICAgIC8vIGlmIHlvdSB3YW50IGEgY29yZSBleHRlbnNpb25cbiAgICBjeXRvc2NhcGUoJ2NvcmUnLCAncGFuem9vbScsIGZ1bmN0aW9uKCBvcHRpb25zICl7IC8vIGNvdWxkIHVzZSBvcHRpb25zIG9iamVjdCwgYnV0IGFyZ3MgYXJlIHVwIHRvIHlvdVxuICAgICAgcGFuem9vbS5hcHBseSggdGhpcywgWyBvcHRpb25zLCBjeXRvc2NhcGUsICQgXSApO1xuXG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5hYmlsaXR5XG4gICAgfSk7XG5cbiAgfTtcblxuICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgem9vbUZhY3RvcjogMC4wNSwgLy8gem9vbSBmYWN0b3IgcGVyIHpvb20gdGlja1xuICAgIHpvb21EZWxheTogNDUsIC8vIGhvdyBtYW55IG1zIGJldHdlZW4gem9vbSB0aWNrc1xuICAgIG1pblpvb206IDAuMSwgLy8gbWluIHpvb20gbGV2ZWxcbiAgICBtYXhab29tOiAxMCwgLy8gbWF4IHpvb20gbGV2ZWxcbiAgICBmaXRQYWRkaW5nOiA1MCwgLy8gcGFkZGluZyB3aGVuIGZpdHRpbmdcbiAgICBwYW5TcGVlZDogMTAsIC8vIGhvdyBtYW55IG1zIGluIGJldHdlZW4gcGFuIHRpY2tzXG4gICAgcGFuRGlzdGFuY2U6IDEwLCAvLyBtYXggcGFuIGRpc3RhbmNlIHBlciB0aWNrXG4gICAgcGFuRHJhZ0FyZWFTaXplOiA3NSwgLy8gdGhlIGxlbmd0aCBvZiB0aGUgcGFuIGRyYWcgYm94IGluIHdoaWNoIHRoZSB2ZWN0b3IgZm9yIHBhbm5pbmcgaXMgY2FsY3VsYXRlZCAoYmlnZ2VyID0gZmluZXIgY29udHJvbCBvZiBwYW4gc3BlZWQgYW5kIGRpcmVjdGlvbilcbiAgICBwYW5NaW5QZXJjZW50U3BlZWQ6IDAuMjUsIC8vIHRoZSBzbG93ZXN0IHNwZWVkIHdlIGNhbiBwYW4gYnkgKGFzIGEgcGVyY2VudCBvZiBwYW5TcGVlZClcbiAgICBwYW5JbmFjdGl2ZUFyZWE6IDgsIC8vIHJhZGl1cyBvZiBpbmFjdGl2ZSBhcmVhIGluIHBhbiBkcmFnIGJveFxuICAgIHBhbkluZGljYXRvck1pbk9wYWNpdHk6IDAuNSwgLy8gbWluIG9wYWNpdHkgb2YgcGFuIGluZGljYXRvciAodGhlIGRyYWdnYWJsZSBuaWIpOyBzY2FsZXMgZnJvbSB0aGlzIHRvIDEuMFxuICAgIHpvb21Pbmx5OiBmYWxzZSwgLy8gYSBtaW5pbWFsIHZlcnNpb24gb2YgdGhlIHVpIG9ubHkgd2l0aCB6b29taW5nICh1c2VmdWwgb24gc3lzdGVtcyB3aXRoIGJhZCBtb3VzZXdoZWVsIHJlc29sdXRpb24pXG4gICAgZml0U2VsZWN0b3I6IHVuZGVmaW5lZCwgLy8gc2VsZWN0b3Igb2YgZWxlbWVudHMgdG8gZml0XG4gICAgYW5pbWF0ZU9uRml0OiBmdW5jdGlvbigpeyAvLyB3aGV0aGVyIHRvIGFuaW1hdGUgb24gZml0XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBmaXRBbmltYXRpb25EdXJhdGlvbjogMTAwMCwgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIG9uIGZpdFxuXG4gICAgLy8gaWNvbiBjbGFzcyBuYW1lc1xuICAgIHNsaWRlckhhbmRsZUljb246ICdmYSBmYS1taW51cycsXG4gICAgem9vbUluSWNvbjogJ2ZhIGZhLXBsdXMnLFxuICAgIHpvb21PdXRJY29uOiAnZmEgZmEtbWludXMnLFxuICAgIHJlc2V0SWNvbjogJ2ZhIGZhLWV4cGFuZCdcbiAgfTtcblxuICB2YXIgcGFuem9vbSA9IGZ1bmN0aW9uKCBwYXJhbXMsIGN5dG9zY2FwZSwgJCApe1xuICAgIHZhciBjeVJlZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgdmFyIGZuID0gcGFyYW1zO1xuXG4gICAgdmFyIGZ1bmN0aW9ucyA9IHtcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciAkdGhpcyA9ICQoY3lSZWYuY29udGFpbmVyKCkpO1xuICAgICAgICB2YXIgJHB6ID0gJHRoaXMuZmluZChcIi5jeS1wYW56b29tXCIpO1xuXG4gICAgICAgICRwei5kYXRhKCd3aW5iZGdzJykuZm9yRWFjaChmdW5jdGlvbiggbCApe1xuICAgICAgICAgICQod2luZG93KS51bmJpbmQoIGwuZXZ0LCBsLmZuICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRwei5kYXRhKCdjeWJkZ3MnKS5mb3JFYWNoKGZ1bmN0aW9uKCBsICl7XG4gICAgICAgICAgY3lSZWYub2ZmKCBsLmV2dCwgbC5mbiApO1xuICAgICAgICB9KTtcblxuICAgICAgICAkcHoucmVtb3ZlKCk7XG4gICAgICB9LFxuXG4gICAgICBpbml0OiBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgYnJvd3NlcklzTW9iaWxlID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93O1xuXG4gICAgICAgIHJldHVybiAkKGN5UmVmLmNvbnRhaW5lcigpKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgdmFyICRjb250YWluZXIgPSAkKHRoaXMpO1xuICAgICAgICAgICRjb250YWluZXIuY3l0b3NjYXBlID0gY3l0b3NjYXBlO1xuXG4gICAgICAgICAgdmFyIHdpbmJkZ3MgPSBbXTtcbiAgICAgICAgICB2YXIgJHdpbiA9ICQod2luZG93KTtcblxuICAgICAgICAgIHZhciB3aW5kb3dCaW5kID0gZnVuY3Rpb24oIGV2dCwgZm4gKXtcbiAgICAgICAgICAgIHdpbmJkZ3MucHVzaCh7IGV2dDogZXZ0LCBmbjogZm4gfSk7XG5cbiAgICAgICAgICAgICR3aW4uYmluZCggZXZ0LCBmbiApO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2YXIgd2luZG93VW5iaW5kID0gZnVuY3Rpb24oIGV2dCwgZm4gKXtcbiAgICAgICAgICAgIGZvciggdmFyIGkgPSAwOyBpIDwgd2luYmRncy5sZW5ndGg7IGkrKyApe1xuICAgICAgICAgICAgICB2YXIgbCA9IHdpbmJkZ3NbaV07XG5cbiAgICAgICAgICAgICAgaWYoIGwuZXZ0ID09PSBldnQgJiYgbC5mbiA9PT0gZm4gKXtcbiAgICAgICAgICAgICAgICB3aW5iZGdzLnNwbGljZSggaSwgMSApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICR3aW4udW5iaW5kKCBldnQsIGZuICk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHZhciBjeWJkZ3MgPSBbXTtcblxuICAgICAgICAgIHZhciBjeU9uID0gZnVuY3Rpb24oIGV2dCwgZm4gKXtcbiAgICAgICAgICAgIGN5YmRncy5wdXNoKHsgZXZ0OiBldnQsIGZuOiBmbiB9KTtcblxuICAgICAgICAgICAgY3lSZWYub24oIGV2dCwgZm4gKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdmFyIGN5T2ZmID0gZnVuY3Rpb24oIGV2dCwgZm4gKXtcbiAgICAgICAgICAgIGZvciggdmFyIGkgPSAwOyBpIDwgY3liZGdzLmxlbmd0aDsgaSsrICl7XG4gICAgICAgICAgICAgIHZhciBsID0gY3liZGdzW2ldO1xuXG4gICAgICAgICAgICAgIGlmKCBsLmV2dCA9PT0gZXZ0ICYmIGwuZm4gPT09IGZuICl7XG4gICAgICAgICAgICAgICAgY3liZGdzLnNwbGljZSggaSwgMSApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN5UmVmLm9mZiggZXZ0LCBmbiApO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB2YXIgJHBhbnpvb20gPSAkKCc8ZGl2IGNsYXNzPVwiY3ktcGFuem9vbVwiPjwvZGl2PicpO1xuICAgICAgICAgICRjb250YWluZXIucHJlcGVuZCggJHBhbnpvb20gKTtcblxuICAgICAgICAgICRwYW56b29tLmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTsgLy8gbXVzdCBiZSBhYnNvbHV0ZSByZWdhcmRsZXNzIG9mIHN0eWxlc2hlZXRcblxuICAgICAgICAgICRwYW56b29tLmRhdGEoJ3dpbmJkZ3MnLCB3aW5iZGdzKTtcbiAgICAgICAgICAkcGFuem9vbS5kYXRhKCdjeWJkZ3MnLCBjeWJkZ3MpO1xuXG4gICAgICAgICAgaWYoIG9wdGlvbnMuem9vbU9ubHkgKXtcbiAgICAgICAgICAgICRwYW56b29tLmFkZENsYXNzKFwiY3ktcGFuem9vbS16b29tLW9ubHlcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gYWRkIGJhc2UgaHRtbCBlbGVtZW50c1xuICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAgIHZhciAkem9vbUluID0gJCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tem9vbS1pbiBjeS1wYW56b29tLXpvb20tYnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJpY29uICcrIG9wdGlvbnMuem9vbUluSWNvbiArJ1wiPjwvc3Bhbj48L2Rpdj4nKTtcbiAgICAgICAgICAkcGFuem9vbS5hcHBlbmQoICR6b29tSW4gKTtcblxuICAgICAgICAgIHZhciAkem9vbU91dCA9ICQoJzxkaXYgY2xhc3M9XCJjeS1wYW56b29tLXpvb20tb3V0IGN5LXBhbnpvb20tem9vbS1idXR0b25cIj48c3BhbiBjbGFzcz1cImljb24gJyArIG9wdGlvbnMuem9vbU91dEljb24gKyAnXCI+PC9zcGFuPjwvZGl2PicpO1xuICAgICAgICAgICRwYW56b29tLmFwcGVuZCggJHpvb21PdXQgKTtcblxuICAgICAgICAgIHZhciAkcmVzZXQgPSAkKCc8ZGl2IGNsYXNzPVwiY3ktcGFuem9vbS1yZXNldCBjeS1wYW56b29tLXpvb20tYnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJpY29uICcgKyBvcHRpb25zLnJlc2V0SWNvbiArICdcIj48L3NwYW4+PC9kaXY+Jyk7XG4gICAgICAgICAgJHBhbnpvb20uYXBwZW5kKCAkcmVzZXQgKTtcblxuICAgICAgICAgIHZhciAkc2xpZGVyID0gJCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tc2xpZGVyXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgJHBhbnpvb20uYXBwZW5kKCAkc2xpZGVyICk7XG5cbiAgICAgICAgICAkc2xpZGVyLmFwcGVuZCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tc2xpZGVyLWJhY2tncm91bmRcIj48L2Rpdj4nKTtcblxuICAgICAgICAgIHZhciAkc2xpZGVySGFuZGxlID0gJCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tc2xpZGVyLWhhbmRsZVwiPjxzcGFuIGNsYXNzPVwiaWNvbiAnICsgb3B0aW9ucy5zbGlkZXJIYW5kbGVJY29uICsgJ1wiPjwvc3Bhbj48L2Rpdj4nKTtcbiAgICAgICAgICAkc2xpZGVyLmFwcGVuZCggJHNsaWRlckhhbmRsZSApO1xuXG4gICAgICAgICAgdmFyICRub1pvb21UaWNrID0gJCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tbm8tem9vbS10aWNrXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgJHNsaWRlci5hcHBlbmQoICRub1pvb21UaWNrICk7XG5cbiAgICAgICAgICB2YXIgJHBhbm5lciA9ICQoJzxkaXYgY2xhc3M9XCJjeS1wYW56b29tLXBhbm5lclwiPjwvZGl2PicpO1xuICAgICAgICAgICRwYW56b29tLmFwcGVuZCggJHBhbm5lciApO1xuXG4gICAgICAgICAgdmFyICRwSGFuZGxlID0gJCgnPGRpdiBjbGFzcz1cImN5LXBhbnpvb20tcGFubmVyLWhhbmRsZVwiPjwvZGl2PicpO1xuICAgICAgICAgICRwYW5uZXIuYXBwZW5kKCAkcEhhbmRsZSApO1xuXG4gICAgICAgICAgdmFyICRwVXAgPSAkKCc8ZGl2IGNsYXNzPVwiY3ktcGFuem9vbS1wYW4tdXAgY3ktcGFuem9vbS1wYW4tYnV0dG9uXCI+PC9kaXY+Jyk7XG4gICAgICAgICAgdmFyICRwRG93biA9ICQoJzxkaXYgY2xhc3M9XCJjeS1wYW56b29tLXBhbi1kb3duIGN5LXBhbnpvb20tcGFuLWJ1dHRvblwiPjwvZGl2PicpO1xuICAgICAgICAgIHZhciAkcExlZnQgPSAkKCc8ZGl2IGNsYXNzPVwiY3ktcGFuem9vbS1wYW4tbGVmdCBjeS1wYW56b29tLXBhbi1idXR0b25cIj48L2Rpdj4nKTtcbiAgICAgICAgICB2YXIgJHBSaWdodCA9ICQoJzxkaXYgY2xhc3M9XCJjeS1wYW56b29tLXBhbi1yaWdodCBjeS1wYW56b29tLXBhbi1idXR0b25cIj48L2Rpdj4nKTtcbiAgICAgICAgICAkcGFubmVyLmFwcGVuZCggJHBVcCApLmFwcGVuZCggJHBEb3duICkuYXBwZW5kKCAkcExlZnQgKS5hcHBlbmQoICRwUmlnaHQgKTtcblxuICAgICAgICAgIHZhciAkcEluZGljYXRvciA9ICQoJzxkaXYgY2xhc3M9XCJjeS1wYW56b29tLXBhbi1pbmRpY2F0b3JcIj48L2Rpdj4nKTtcbiAgICAgICAgICAkcGFubmVyLmFwcGVuZCggJHBJbmRpY2F0b3IgKTtcblxuICAgICAgICAgIC8vIGZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgcGFubmluZ1xuICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlMnBhbihlKXtcbiAgICAgICAgICAgIHZhciB2ID0ge1xuICAgICAgICAgICAgICB4OiBlLm9yaWdpbmFsRXZlbnQucGFnZVggLSAkcGFubmVyLm9mZnNldCgpLmxlZnQgLSAkcGFubmVyLndpZHRoKCkvMixcbiAgICAgICAgICAgICAgeTogZS5vcmlnaW5hbEV2ZW50LnBhZ2VZIC0gJHBhbm5lci5vZmZzZXQoKS50b3AgLSAkcGFubmVyLmhlaWdodCgpLzJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHIgPSBvcHRpb25zLnBhbkRyYWdBcmVhU2l6ZTtcbiAgICAgICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KCB2Lngqdi54ICsgdi55KnYueSApO1xuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSBNYXRoLm1pbiggZC9yLCAxICk7XG5cbiAgICAgICAgICAgIGlmKCBkIDwgb3B0aW9ucy5wYW5JbmFjdGl2ZUFyZWEgKXtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBOYU4sXG4gICAgICAgICAgICAgICAgeTogTmFOXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHYgPSB7XG4gICAgICAgICAgICAgIHg6IHYueC9kLFxuICAgICAgICAgICAgICB5OiB2LnkvZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGVyY2VudCA9IE1hdGgubWF4KCBvcHRpb25zLnBhbk1pblBlcmNlbnRTcGVlZCwgcGVyY2VudCApO1xuXG4gICAgICAgICAgICB2YXIgdm5vcm0gPSB7XG4gICAgICAgICAgICAgIHg6IC0xICogdi54ICogKHBlcmNlbnQgKiBvcHRpb25zLnBhbkRpc3RhbmNlKSxcbiAgICAgICAgICAgICAgeTogLTEgKiB2LnkgKiAocGVyY2VudCAqIG9wdGlvbnMucGFuRGlzdGFuY2UpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdm5vcm07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gZG9uZVBhbm5pbmcoKXtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocGFuSW50ZXJ2YWwpO1xuICAgICAgICAgICAgd2luZG93VW5iaW5kKFwibW91c2Vtb3ZlXCIsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICAkcEluZGljYXRvci5oaWRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gcG9zaXRpb25JbmRpY2F0b3IocGFuKXtcbiAgICAgICAgICAgIHZhciB2ID0gcGFuO1xuICAgICAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoIHYueCp2LnggKyB2Lnkqdi55ICk7XG4gICAgICAgICAgICB2YXIgdm5vcm0gPSB7XG4gICAgICAgICAgICAgIHg6IC0xICogdi54L2QsXG4gICAgICAgICAgICAgIHk6IC0xICogdi55L2RcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciB3ID0gJHBhbm5lci53aWR0aCgpO1xuICAgICAgICAgICAgdmFyIGggPSAkcGFubmVyLmhlaWdodCgpO1xuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSBkL29wdGlvbnMucGFuRGlzdGFuY2U7XG4gICAgICAgICAgICB2YXIgb3BhY2l0eSA9IE1hdGgubWF4KCBvcHRpb25zLnBhbkluZGljYXRvck1pbk9wYWNpdHksIHBlcmNlbnQgKTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IDI1NSAtIE1hdGgucm91bmQoIG9wYWNpdHkgKiAyNTUgKTtcblxuICAgICAgICAgICAgJHBJbmRpY2F0b3Iuc2hvdygpLmNzcyh7XG4gICAgICAgICAgICAgIGxlZnQ6IHcvMiAqIHZub3JtLnggKyB3LzIsXG4gICAgICAgICAgICAgIHRvcDogaC8yICogdm5vcm0ueSArIGgvMixcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJyZ2IoXCIgKyBjb2xvciArIFwiLCBcIiArIGNvbG9yICsgXCIsIFwiICsgY29sb3IgKyBcIilcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlWm9vbUNlbnRlclBvaW50KCl7XG4gICAgICAgICAgICB2YXIgcGFuID0gY3lSZWYucGFuKCk7XG4gICAgICAgICAgICB2YXIgem9vbSA9IGN5UmVmLnpvb20oKTtcblxuICAgICAgICAgICAgenggPSAkY29udGFpbmVyLndpZHRoKCkvMjtcbiAgICAgICAgICAgIHp5ID0gJGNvbnRhaW5lci5oZWlnaHQoKS8yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB6b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgZnVuY3Rpb24gc3RhcnRab29taW5nKCl7XG4gICAgICAgICAgICB6b29taW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgY2FsY3VsYXRlWm9vbUNlbnRlclBvaW50KCk7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICBmdW5jdGlvbiBlbmRab29taW5nKCl7XG4gICAgICAgICAgICB6b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHp4LCB6eTtcbiAgICAgICAgICBmdW5jdGlvbiB6b29tVG8obGV2ZWwpe1xuICAgICAgICAgICAgaWYoICF6b29taW5nICl7IC8vIGZvciBub24tY29udGludW91cyB6b29taW5nIChlLmcuIGNsaWNrIHNsaWRlciBhdCBwdClcbiAgICAgICAgICAgICAgY2FsY3VsYXRlWm9vbUNlbnRlclBvaW50KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN5UmVmLnpvb20oe1xuICAgICAgICAgICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICAgIHJlbmRlcmVkUG9zaXRpb246IHsgeDogengsIHk6IHp5IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBwYW5JbnRlcnZhbDtcblxuICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oZSl7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBkb24ndCB0cmlnZ2VyIGRyYWdnaW5nIG9mIHBhbnpvb21cbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gZG9uJ3QgY2F1c2UgdGV4dCBzZWxlY3Rpb25cbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocGFuSW50ZXJ2YWwpO1xuXG4gICAgICAgICAgICB2YXIgcGFuID0gaGFuZGxlMnBhbihlKTtcblxuICAgICAgICAgICAgaWYoIGlzTmFOKHBhbi54KSB8fCBpc05hTihwYW4ueSkgKXtcbiAgICAgICAgICAgICAgJHBJbmRpY2F0b3IuaGlkZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvc2l0aW9uSW5kaWNhdG9yKHBhbik7XG4gICAgICAgICAgICBwYW5JbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIGN5UmVmLnBhbkJ5KHBhbik7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnBhblNwZWVkKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgJHBIYW5kbGUuYmluZChcIm1vdXNlZG93blwiLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBjbGljayBvZiBpY29uXG4gICAgICAgICAgICBoYW5kbGVyKGUpO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgb24gbW91c2Vtb3ZlXG4gICAgICAgICAgICB3aW5kb3dCaW5kKFwibW91c2Vtb3ZlXCIsIGhhbmRsZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgJHBIYW5kbGUuYmluZChcIm1vdXNldXBcIiwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGRvbmVQYW5uaW5nKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB3aW5kb3dCaW5kKFwibW91c2V1cCBibHVyXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBkb25lUGFubmluZygpO1xuICAgICAgICAgIH0pO1xuXG5cblxuICAgICAgICAgIC8vIHNldCB1cCBzbGlkZXIgYmVoYXZpb3VyXG4gICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAgICRzbGlkZXIuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc28gd2UgZG9uJ3QgcGFuIGNsb3NlIHRvIHRoZSBzbGlkZXIgaGFuZGxlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgc2xpZGVyVmFsO1xuICAgICAgICAgIHZhciBzbGlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdmFyIHNsaWRlclBhZGRpbmcgPSAyO1xuXG4gICAgICAgICAgZnVuY3Rpb24gc2V0U2xpZGVyRnJvbU1vdXNlKGV2dCwgaGFuZGxlT2Zmc2V0KXtcbiAgICAgICAgICAgIGlmKCBoYW5kbGVPZmZzZXQgPT09IHVuZGVmaW5lZCApe1xuICAgICAgICAgICAgICBoYW5kbGVPZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFkZGluZyA9IHNsaWRlclBhZGRpbmc7XG4gICAgICAgICAgICB2YXIgbWluID0gMCArIHBhZGRpbmc7XG4gICAgICAgICAgICB2YXIgbWF4ID0gJHNsaWRlci5oZWlnaHQoKSAtICRzbGlkZXJIYW5kbGUuaGVpZ2h0KCkgLSAyKnBhZGRpbmc7XG4gICAgICAgICAgICB2YXIgdG9wID0gZXZ0LnBhZ2VZIC0gJHNsaWRlci5vZmZzZXQoKS50b3AgLSBoYW5kbGVPZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIGNvbnN0cmFpbiB0byBzbGlkZXIgYm91bmRzXG4gICAgICAgICAgICBpZiggdG9wIDwgbWluICl7IHRvcCA9IG1pbiB9XG4gICAgICAgICAgICBpZiggdG9wID4gbWF4ICl7IHRvcCA9IG1heCB9XG5cbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gMSAtICh0b3AgLSBtaW4pIC8gKCBtYXggLSBtaW4gKTtcblxuICAgICAgICAgICAgLy8gbW92ZSB0aGUgaGFuZGxlXG4gICAgICAgICAgICAkc2xpZGVySGFuZGxlLmNzcygndG9wJywgdG9wKTtcblxuICAgICAgICAgICAgdmFyIHptaW4gPSBvcHRpb25zLm1pblpvb207XG4gICAgICAgICAgICB2YXIgem1heCA9IG9wdGlvbnMubWF4Wm9vbTtcblxuICAgICAgICAgICAgLy8gYXNzdW1lICh6b29tID0gem1heCBeIHApIHdoZXJlIHAgcmFuZ2VzIG9uICh4LCAxKSB3aXRoIHggbmVnYXRpdmVcbiAgICAgICAgICAgIHZhciB4ID0gTWF0aC5sb2coem1pbikgLyBNYXRoLmxvZyh6bWF4KTtcbiAgICAgICAgICAgIHZhciBwID0gKDEgLSB4KSpwZXJjZW50ICsgeDtcblxuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB6b29tIGxldmVsXG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgucG93KCB6bWF4LCBwICk7XG5cbiAgICAgICAgICAgIC8vIGJvdW5kIHRoZSB6b29tIHZhbHVlIGluIGNhc2Ugb2YgZmxvYXRpbmcgcHQgcm91bmRpbmcgZXJyb3JcbiAgICAgICAgICAgIGlmKCB6IDwgem1pbiApe1xuICAgICAgICAgICAgICB6ID0gem1pbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiggeiA+IHptYXggKXtcbiAgICAgICAgICAgICAgeiA9IHptYXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHpvb21UbyggeiApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzbGlkZXJNZG93bkhhbmRsZXIsIHNsaWRlck1tb3ZlSGFuZGxlcjtcbiAgICAgICAgICAkc2xpZGVySGFuZGxlLmJpbmQoJ21vdXNlZG93bicsIHNsaWRlck1kb3duSGFuZGxlciA9IGZ1bmN0aW9uKCBtZEV2dCApe1xuICAgICAgICAgICAgdmFyIGhhbmRsZU9mZnNldCA9IG1kRXZ0LnRhcmdldCA9PT0gJHNsaWRlckhhbmRsZVswXSA/IG1kRXZ0Lm9mZnNldFkgOiAwO1xuICAgICAgICAgICAgc2xpZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHN0YXJ0Wm9vbWluZygpO1xuICAgICAgICAgICAgJHNsaWRlckhhbmRsZS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgdmFyIGxhc3RNb3ZlID0gMDtcbiAgICAgICAgICAgIHdpbmRvd0JpbmQoJ21vdXNlbW92ZScsIHNsaWRlck1tb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCBtbUV2dCApe1xuICAgICAgICAgICAgICB2YXIgbm93ID0gK25ldyBEYXRlO1xuXG4gICAgICAgICAgICAgIC8vIHRocm90dGxlIHRoZSB6b29tcyBldmVyeSAxMCBtcyBzbyB3ZSBkb24ndCBjYWxsIHpvb20gdG9vIG9mdGVuIGFuZCBjYXVzZSBsYWdcbiAgICAgICAgICAgICAgaWYoIG5vdyA+IGxhc3RNb3ZlICsgMTAgKXtcbiAgICAgICAgICAgICAgICBsYXN0TW92ZSA9IG5vdztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZXRTbGlkZXJGcm9tTW91c2UobW1FdnQsIGhhbmRsZU9mZnNldCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHVuYmluZCB3aGVuXG4gICAgICAgICAgICB3aW5kb3dCaW5kKCdtb3VzZXVwJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgd2luZG93VW5iaW5kKCdtb3VzZW1vdmUnLCBzbGlkZXJNbW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgICBzbGlkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgJHNsaWRlckhhbmRsZS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgZW5kWm9vbWluZygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICRzbGlkZXIuYmluZCgnbW91c2Vkb3duJywgZnVuY3Rpb24oZSl7XG4gICAgICAgICAgICBpZiggZS50YXJnZXQgIT09ICRzbGlkZXJIYW5kbGVbMF0gKXtcbiAgICAgICAgICAgICAgc2xpZGVyTWRvd25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgICBzZXRTbGlkZXJGcm9tTW91c2UoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBmdW5jdGlvbiBwb3NpdGlvblNsaWRlckZyb21ab29tKCl7XG4gICAgICAgICAgICB2YXIgeiA9IGN5UmVmLnpvb20oKTtcbiAgICAgICAgICAgIHZhciB6bWluID0gb3B0aW9ucy5taW5ab29tO1xuICAgICAgICAgICAgdmFyIHptYXggPSBvcHRpb25zLm1heFpvb207XG5cbiAgICAgICAgICAgIC8vIGFzc3VtZSAoem9vbSA9IHptYXggXiBwKSB3aGVyZSBwIHJhbmdlcyBvbiAoeCwgMSkgd2l0aCB4IG5lZ2F0aXZlXG4gICAgICAgICAgICB2YXIgeCA9IE1hdGgubG9nKHptaW4pIC8gTWF0aC5sb2coem1heCk7XG4gICAgICAgICAgICB2YXIgcCA9IE1hdGgubG9nKHopIC8gTWF0aC5sb2coem1heCk7XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IDEgLSAocCAtIHgpIC8gKDEgLSB4KTsgLy8gdGhlIDEtIGJpdCBhdCB0aGUgZnJvbnQgYi9jIHVwIGlzIGluIHRoZSAtdmUgeSBkaXJlY3Rpb25cblxuICAgICAgICAgICAgdmFyIG1pbiA9IHNsaWRlclBhZGRpbmc7XG4gICAgICAgICAgICB2YXIgbWF4ID0gJHNsaWRlci5oZWlnaHQoKSAtICRzbGlkZXJIYW5kbGUuaGVpZ2h0KCkgLSAyKnNsaWRlclBhZGRpbmc7XG4gICAgICAgICAgICB2YXIgdG9wID0gcGVyY2VudCAqICggbWF4IC0gbWluICk7XG5cbiAgICAgICAgICAgIC8vIGNvbnN0cmFpbiB0byBzbGlkZXIgYm91bmRzXG4gICAgICAgICAgICBpZiggdG9wIDwgbWluICl7IHRvcCA9IG1pbiB9XG4gICAgICAgICAgICBpZiggdG9wID4gbWF4ICl7IHRvcCA9IG1heCB9XG5cbiAgICAgICAgICAgIC8vIG1vdmUgdGhlIGhhbmRsZVxuICAgICAgICAgICAgJHNsaWRlckhhbmRsZS5jc3MoJ3RvcCcsIHRvcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcG9zaXRpb25TbGlkZXJGcm9tWm9vbSgpO1xuXG4gICAgICAgICAgY3lPbignem9vbScsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZiggIXNsaWRpbmcgKXtcbiAgICAgICAgICAgICAgcG9zaXRpb25TbGlkZXJGcm9tWm9vbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgem9vbT0xIHRpY2tcbiAgICAgICAgICAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciB6ID0gMTtcbiAgICAgICAgICAgIHZhciB6bWluID0gb3B0aW9ucy5taW5ab29tO1xuICAgICAgICAgICAgdmFyIHptYXggPSBvcHRpb25zLm1heFpvb207XG5cbiAgICAgICAgICAgIC8vIGFzc3VtZSAoem9vbSA9IHptYXggXiBwKSB3aGVyZSBwIHJhbmdlcyBvbiAoeCwgMSkgd2l0aCB4IG5lZ2F0aXZlXG4gICAgICAgICAgICB2YXIgeCA9IE1hdGgubG9nKHptaW4pIC8gTWF0aC5sb2coem1heCk7XG4gICAgICAgICAgICB2YXIgcCA9IE1hdGgubG9nKHopIC8gTWF0aC5sb2coem1heCk7XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IDEgLSAocCAtIHgpIC8gKDEgLSB4KTsgLy8gdGhlIDEtIGJpdCBhdCB0aGUgZnJvbnQgYi9jIHVwIGlzIGluIHRoZSAtdmUgeSBkaXJlY3Rpb25cblxuICAgICAgICAgICAgaWYoIHBlcmNlbnQgPiAxIHx8IHBlcmNlbnQgPCAwICl7XG4gICAgICAgICAgICAgICRub1pvb21UaWNrLmhpZGUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWluID0gc2xpZGVyUGFkZGluZztcbiAgICAgICAgICAgIHZhciBtYXggPSAkc2xpZGVyLmhlaWdodCgpIC0gJHNsaWRlckhhbmRsZS5oZWlnaHQoKSAtIDIqc2xpZGVyUGFkZGluZztcbiAgICAgICAgICAgIHZhciB0b3AgPSBwZXJjZW50ICogKCBtYXggLSBtaW4gKTtcblxuICAgICAgICAgICAgLy8gY29uc3RyYWluIHRvIHNsaWRlciBib3VuZHNcbiAgICAgICAgICAgIGlmKCB0b3AgPCBtaW4gKXsgdG9wID0gbWluIH1cbiAgICAgICAgICAgIGlmKCB0b3AgPiBtYXggKXsgdG9wID0gbWF4IH1cblxuICAgICAgICAgICAgJG5vWm9vbVRpY2suY3NzKCd0b3AnLCB0b3ApO1xuICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAvLyBzZXQgdXAgem9vbSBpbi9vdXQgYnV0dG9uc1xuICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICBmdW5jdGlvbiBiaW5kQnV0dG9uKCRidXR0b24sIGZhY3Rvcil7XG4gICAgICAgICAgICB2YXIgem9vbUludGVydmFsO1xuXG4gICAgICAgICAgICAkYnV0dG9uLmJpbmQoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24oZSl7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgICBpZiggZS5idXR0b24gIT0gMCApe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBkb1pvb20gPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHZhciB6b29tID0gY3lSZWYuem9vbSgpO1xuICAgICAgICAgICAgICAgIHZhciBsdmwgPSBjeVJlZi56b29tKCkgKiBmYWN0b3I7XG5cbiAgICAgICAgICAgICAgICBpZiggbHZsIDwgb3B0aW9ucy5taW5ab29tICl7XG4gICAgICAgICAgICAgICAgICBsdmwgPSBvcHRpb25zLm1pblpvb207XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoIGx2bCA+IG9wdGlvbnMubWF4Wm9vbSApe1xuICAgICAgICAgICAgICAgICAgbHZsID0gb3B0aW9ucy5tYXhab29tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKCAobHZsID09IG9wdGlvbnMubWF4Wm9vbSAmJiB6b29tID09IG9wdGlvbnMubWF4Wm9vbSkgfHxcbiAgICAgICAgICAgICAgICAgIChsdmwgPT0gb3B0aW9ucy5taW5ab29tICYmIHpvb20gPT0gb3B0aW9ucy5taW5ab29tKVxuICAgICAgICAgICAgICAgICl7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgem9vbVRvKGx2bCk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgc3RhcnRab29taW5nKCk7XG4gICAgICAgICAgICAgIGRvWm9vbSgpO1xuICAgICAgICAgICAgICB6b29tSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChkb1pvb20sIG9wdGlvbnMuem9vbURlbGF5KTtcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2luZG93QmluZChcIm1vdXNldXAgYmx1clwiLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICBjbGVhckludGVydmFsKHpvb21JbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGVuZFpvb21pbmcoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJpbmRCdXR0b24oICR6b29tSW4sICgxICsgb3B0aW9ucy56b29tRmFjdG9yKSApO1xuICAgICAgICAgIGJpbmRCdXR0b24oICR6b29tT3V0LCAoMSAtIG9wdGlvbnMuem9vbUZhY3RvcikgKTtcblxuICAgICAgICAgICRyZXNldC5iaW5kKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgaWYoIGUuYnV0dG9uICE9IDAgKXtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZWxlc1RvRml0ID0gb3B0aW9ucy5maXRTZWxlY3Rvcj9jeVJlZi5lbGVtZW50cyhvcHRpb25zLmZpdFNlbGVjdG9yKTpjeVJlZi5lbGVtZW50cygpO1xuXG4gICAgICAgICAgICBpZiggZWxlc1RvRml0LnNpemUoKSA9PT0gMCApe1xuICAgICAgICAgICAgICBjeVJlZi5yZXNldCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGFuaW1hdGVPbkZpdCA9IHR5cGVvZiBvcHRpb25zLmFuaW1hdGVPbkZpdCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuYW5pbWF0ZU9uRml0LmNhbGwoKSA6IG9wdGlvbnMuYW5pbWF0ZU9uRml0O1xuICAgICAgICAgICAgICBpZihhbmltYXRlT25GaXQpe1xuICAgICAgICAgICAgICAgIGN5UmVmLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgZml0OiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZXM6IGVsZXNUb0ZpdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5maXRQYWRkaW5nXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuZml0QW5pbWF0aW9uRHVyYXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGN5UmVmLmZpdCggZWxlc1RvRml0LCBvcHRpb25zLmZpdFBhZGRpbmcgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmKCBmdW5jdGlvbnNbZm5dICl7XG4gICAgICByZXR1cm4gZnVuY3Rpb25zW2ZuXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICkpO1xuICAgIH0gZWxzZSBpZiggdHlwZW9mIGZuID09ICdvYmplY3QnIHx8ICFmbiApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbnMuaW5pdC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQuZXJyb3IoXCJObyBzdWNoIGZ1bmN0aW9uIGBcIisgZm4gK1wiYCBmb3IganF1ZXJ5LmN5dG9zY2FwZVBhbnpvb21cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuICQodGhpcyk7XG4gIH07XG5cblxuICBpZiggdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgKXsgLy8gZXhwb3NlIGFzIGEgY29tbW9uanMgbW9kdWxlXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggY3l0b3NjYXBlLCBqcXVlcnkgKXtcbiAgICAgIHJlZ2lzdGVyKCBjeXRvc2NhcGUsIGpxdWVyeSB8fCByZXF1aXJlKCdqcXVlcnknKSApO1xuICAgIH1cbiAgfSBlbHNlIGlmKCB0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJyAmJiBkZWZpbmUuYW1kICl7IC8vIGV4cG9zZSBhcyBhbiBhbWQvcmVxdWlyZWpzIG1vZHVsZVxuICAgIGRlZmluZSgnY3l0b3NjYXBlLXBhbnpvb20nLCBmdW5jdGlvbigpe1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoIHR5cGVvZiBjeXRvc2NhcGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBqUXVlcnkgIT09ICd1bmRlZmluZWQnICl7IC8vIGV4cG9zZSB0byBnbG9iYWwgY3l0b3NjYXBlIChpLmUuIHdpbmRvdy5jeXRvc2NhcGUpXG4gICAgcmVnaXN0ZXIoIGN5dG9zY2FwZSwgalF1ZXJ5ICk7XG4gIH1cblxufSkoKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///19679\n")},20181:(module,__unused_webpack_exports,__webpack_require__)=>{eval("/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxODEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC5kZWJvdW5jZS9pbmRleC5qcz9mN2ZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20181\n")},20838:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Spanish (Dominican Republic) [es-do]\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var monthsShortDot =\n 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n '_'\n ),\n monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n monthsParse = [\n /^ene/i,\n /^feb/i,\n /^mar/i,\n /^abr/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^ago/i,\n /^sep/i,\n /^oct/i,\n /^nov/i,\n /^dic/i,\n ],\n monthsRegex =\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n var esDo = moment.defineLocale('es-do', {\n months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n '_'\n ),\n monthsShort: function (m, format) {\n if (!m) {\n return monthsShortDot;\n } else if (/-MMM-/.test(format)) {\n return monthsShort[m.month()];\n } else {\n return monthsShortDot[m.month()];\n }\n },\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n monthsStrictRegex:\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n monthsShortStrictRegex:\n /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'DD/MM/YYYY',\n LL: 'D [de] MMMM [de] YYYY',\n LLL: 'D [de] MMMM [de] YYYY h:mm A',\n LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n },\n calendar: {\n sameDay: function () {\n return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextDay: function () {\n return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextWeek: function () {\n return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastDay: function () {\n return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastWeek: function () {\n return (\n '[el] dddd [pasado a la' +\n (this.hours() !== 1 ? 's' : '') +\n '] LT'\n );\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'en %s',\n past: 'hace %s',\n s: 'unos segundos',\n ss: '%d segundos',\n m: 'un minuto',\n mm: '%d minutos',\n h: 'una hora',\n hh: '%d horas',\n d: 'un día',\n dd: '%d días',\n w: 'una semana',\n ww: '%d semanas',\n M: 'un mes',\n MM: '%d meses',\n y: 'un año',\n yy: '%d años',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return esDo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4MzguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qcz8wYTNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIFtlcy1kb11cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9XG4gICAgICAgICAgICAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15lbmUvaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15hYnIvaSxcbiAgICAgICAgICAgIC9ebWF5L2ksXG4gICAgICAgICAgICAvXmp1bi9pLFxuICAgICAgICAgICAgL15qdWwvaSxcbiAgICAgICAgICAgIC9eYWdvL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRpYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzRG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcy1kbycsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXNEbztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20838\n")},20923:(I,g,n)=>{"use strict";I.exports=n.p+"32b034e0e3427aa90968.png"},20934:(I,g,n)=>{"use strict";I.exports=n.p+"6fd3d41afe16c6dba57b.png"},21106:(I,g,n)=>{"use strict";I.exports=n.p+"7cbad61015d7c1ecdf2e.png"},21135:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Vietnamese [vi]\n//! author : Bang Nguyen : https://github.com/bangnk\n//! author : Chien Kira : https://github.com/chienkira\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var vi = moment.defineLocale('vi', {\n months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(\n '_'\n ),\n monthsShort:\n 'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(\n '_'\n ),\n weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),\n weekdaysParseExact: true,\n meridiemParse: /sa|ch/i,\n isPM: function (input) {\n return /^ch$/i.test(input);\n },\n meridiem: function (hours, minutes, isLower) {\n if (hours < 12) {\n return isLower ? 'sa' : 'SA';\n } else {\n return isLower ? 'ch' : 'CH';\n }\n },\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM [năm] YYYY',\n LLL: 'D MMMM [năm] YYYY HH:mm',\n LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',\n l: 'DD/M/YYYY',\n ll: 'D MMM YYYY',\n lll: 'D MMM YYYY HH:mm',\n llll: 'ddd, D MMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Hôm nay lúc] LT',\n nextDay: '[Ngày mai lúc] LT',\n nextWeek: 'dddd [tuần tới lúc] LT',\n lastDay: '[Hôm qua lúc] LT',\n lastWeek: 'dddd [tuần trước lúc] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s tới',\n past: '%s trước',\n s: 'vài giây',\n ss: '%d giây',\n m: 'một phút',\n mm: '%d phút',\n h: 'một giờ',\n hh: '%d giờ',\n d: 'một ngày',\n dd: '%d ngày',\n w: 'một tuần',\n ww: '%d tuần',\n M: 'một tháng',\n MM: '%d tháng',\n y: 'một năm',\n yy: '%d năm',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}/,\n ordinal: function (number) {\n return number;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return vi;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExMzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanM/MjkyMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVmlldG5hbWVzZSBbdmldXG4vLyEgYXV0aG9yIDogQmFuZyBOZ3V5ZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmFuZ25rXG4vLyEgYXV0aG9yIDogQ2hpZW4gS2lyYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGllbmtpcmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB2aSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3ZpJywge1xuICAgICAgICBtb250aHM6ICd0aMOhbmcgMV90aMOhbmcgMl90aMOhbmcgM190aMOhbmcgNF90aMOhbmcgNV90aMOhbmcgNl90aMOhbmcgN190aMOhbmcgOF90aMOhbmcgOV90aMOhbmcgMTBfdGjDoW5nIDExX3Row6FuZyAxMicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnVGhnIDAxX1RoZyAwMl9UaGcgMDNfVGhnIDA0X1RoZyAwNV9UaGcgMDZfVGhnIDA3X1RoZyAwOF9UaGcgMDlfVGhnIDEwX1RoZyAxMV9UaGcgMTInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdjaOG7pyBuaOG6rXRfdGjhu6kgaGFpX3Ro4bupIGJhX3Ro4bupIHTGsF90aOG7qSBuxINtX3Ro4bupIHPDoXVfdGjhu6kgYuG6o3knLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvc2F8Y2gvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL15jaCQvaS50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdzYScgOiAnU0EnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdjaCcgOiAnQ0gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbbsSDbV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW27Eg21dIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsOiAnREQvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIw7RtIG5heSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW05nw6B5IG1haSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3R14bqnbiB04bubaSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0jDtG0gcXVhIGzDumNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdHXhuqduIHRyxrDhu5tjIGzDumNdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgdOG7m2knLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRyxrDhu5tjJyxcbiAgICAgICAgICAgIHM6ICd2w6BpIGdpw6J5JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZ2nDonknLFxuICAgICAgICAgICAgbTogJ23hu5l0IHBow7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgcGjDunQnLFxuICAgICAgICAgICAgaDogJ23hu5l0IGdp4budJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZ2nhu50nLFxuICAgICAgICAgICAgZDogJ23hu5l0IG5nw6B5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgbmfDoHknLFxuICAgICAgICAgICAgdzogJ23hu5l0IHR14bqnbicsXG4gICAgICAgICAgICB3dzogJyVkIHR14bqnbicsXG4gICAgICAgICAgICBNOiAnbeG7mXQgdGjDoW5nJyxcbiAgICAgICAgICAgIE1NOiAnJWQgdGjDoW5nJyxcbiAgICAgICAgICAgIHk6ICdt4buZdCBuxINtJyxcbiAgICAgICAgICAgIHl5OiAnJWQgbsSDbScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2aTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21135\n")},21396:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(43240), __webpack_require__(6440), __webpack_require__(45503), __webpack_require__(80754), __webpack_require__(87106), __webpack_require__(84636), __webpack_require__(45471), __webpack_require__(63009), __webpack_require__(36308), __webpack_require__(81380), __webpack_require__(89557), __webpack_require__(45953), __webpack_require__(78056), __webpack_require__(51025), __webpack_require__(70019), __webpack_require__(39506), __webpack_require__(57165), __webpack_require__(82169), __webpack_require__(96939), __webpack_require__(6372), __webpack_require__(73797), __webpack_require__(38454), __webpack_require__(42073), __webpack_require__(54905), __webpack_require__(10482), __webpack_require__(52155), __webpack_require__(58124), __webpack_require__(70025), __webpack_require__(40955), __webpack_require__(7628), __webpack_require__(77193), __webpack_require__(96298), __webpack_require__(22696), __webpack_require__(43128));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzOTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2luZGV4LmpzPzM0NTIiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL3g2NC1jb3JlXCIpLCByZXF1aXJlKFwiLi9saWItdHlwZWRhcnJheXNcIiksIHJlcXVpcmUoXCIuL2VuYy11dGYxNlwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NHVybFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9zaGExXCIpLCByZXF1aXJlKFwiLi9zaGEyNTZcIiksIHJlcXVpcmUoXCIuL3NoYTIyNFwiKSwgcmVxdWlyZShcIi4vc2hhNTEyXCIpLCByZXF1aXJlKFwiLi9zaGEzODRcIiksIHJlcXVpcmUoXCIuL3NoYTNcIiksIHJlcXVpcmUoXCIuL3JpcGVtZDE2MFwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSwgcmVxdWlyZShcIi4vcGJrZGYyXCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpLCByZXF1aXJlKFwiLi9tb2RlLWNmYlwiKSwgcmVxdWlyZShcIi4vbW9kZS1jdHJcIiksIHJlcXVpcmUoXCIuL21vZGUtY3RyLWdsYWRtYW5cIiksIHJlcXVpcmUoXCIuL21vZGUtb2ZiXCIpLCByZXF1aXJlKFwiLi9tb2RlLWVjYlwiKSwgcmVxdWlyZShcIi4vcGFkLWFuc2l4OTIzXCIpLCByZXF1aXJlKFwiLi9wYWQtaXNvMTAxMjZcIiksIHJlcXVpcmUoXCIuL3BhZC1pc285Nzk3MVwiKSwgcmVxdWlyZShcIi4vcGFkLXplcm9wYWRkaW5nXCIpLCByZXF1aXJlKFwiLi9wYWQtbm9wYWRkaW5nXCIpLCByZXF1aXJlKFwiLi9mb3JtYXQtaGV4XCIpLCByZXF1aXJlKFwiLi9hZXNcIiksIHJlcXVpcmUoXCIuL3RyaXBsZWRlc1wiKSwgcmVxdWlyZShcIi4vcmM0XCIpLCByZXF1aXJlKFwiLi9yYWJiaXRcIiksIHJlcXVpcmUoXCIuL3JhYmJpdC1sZWdhY3lcIiksIHJlcXVpcmUoXCIuL2Jsb3dmaXNoXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3g2NC1jb3JlXCIsIFwiLi9saWItdHlwZWRhcnJheXNcIiwgXCIuL2VuYy11dGYxNlwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vZW5jLWJhc2U2NHVybFwiLCBcIi4vbWQ1XCIsIFwiLi9zaGExXCIsIFwiLi9zaGEyNTZcIiwgXCIuL3NoYTIyNFwiLCBcIi4vc2hhNTEyXCIsIFwiLi9zaGEzODRcIiwgXCIuL3NoYTNcIiwgXCIuL3JpcGVtZDE2MFwiLCBcIi4vaG1hY1wiLCBcIi4vcGJrZGYyXCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCIsIFwiLi9tb2RlLWNmYlwiLCBcIi4vbW9kZS1jdHJcIiwgXCIuL21vZGUtY3RyLWdsYWRtYW5cIiwgXCIuL21vZGUtb2ZiXCIsIFwiLi9tb2RlLWVjYlwiLCBcIi4vcGFkLWFuc2l4OTIzXCIsIFwiLi9wYWQtaXNvMTAxMjZcIiwgXCIuL3BhZC1pc285Nzk3MVwiLCBcIi4vcGFkLXplcm9wYWRkaW5nXCIsIFwiLi9wYWQtbm9wYWRkaW5nXCIsIFwiLi9mb3JtYXQtaGV4XCIsIFwiLi9hZXNcIiwgXCIuL3RyaXBsZWRlc1wiLCBcIi4vcmM0XCIsIFwiLi9yYWJiaXRcIiwgXCIuL3JhYmJpdC1sZWdhY3lcIiwgXCIuL2Jsb3dmaXNoXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0cm9vdC5DcnlwdG9KUyA9IGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0cmV0dXJuIENyeXB0b0pTO1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///21396\n")},21428:(I,g,n)=>{"use strict";I.exports=n.p+"baffd199be0518e647c8.png"},21827:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Italian (Switzerland) [it-ch]\n//! author : xfh : https://github.com/xfh\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var itCh = moment.defineLocale('it-ch', {\n months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(\n '_'\n ),\n monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\n weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(\n '_'\n ),\n weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\n weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Oggi alle] LT',\n nextDay: '[Domani alle] LT',\n nextWeek: 'dddd [alle] LT',\n lastDay: '[Ieri alle] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n return '[la scorsa] dddd [alle] LT';\n default:\n return '[lo scorso] dddd [alle] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: function (s) {\n return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;\n },\n past: '%s fa',\n s: 'alcuni secondi',\n ss: '%d secondi',\n m: 'un minuto',\n mm: '%d minuti',\n h: \"un'ora\",\n hh: '%d ore',\n d: 'un giorno',\n dd: '%d giorni',\n M: 'un mese',\n MM: '%d mesi',\n y: 'un anno',\n yy: '%d anni',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return itCh;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4MjcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LWNoLmpzPzZmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEl0YWxpYW4gKFN3aXR6ZXJsYW5kKSBbaXQtY2hdXG4vLyEgYXV0aG9yIDogeGZoIDogaHR0cHM6Ly9naXRodWIuY29tL3hmaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGl0Q2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdC1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnZ2VubmFpb19mZWJicmFpb19tYXJ6b19hcHJpbGVfbWFnZ2lvX2dpdWdub19sdWdsaW9fYWdvc3RvX3NldHRlbWJyZV9vdHRvYnJlX25vdmVtYnJlX2RpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2dlbl9mZWJfbWFyX2Fwcl9tYWdfZ2l1X2x1Z19hZ29fc2V0X290dF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWVuaWNhX2x1bmVkw6xfbWFydGVkw6xfbWVyY29sZWTDrF9naW92ZWTDrF92ZW5lcmTDrF9zYWJhdG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb21fbHVuX21hcl9tZXJfZ2lvX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWVfZ2lfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPZ2dpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRG9tYW5pIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJZXJpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW2xhIHNjb3JzYV0gZGRkZCBbYWxsZV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbG8gc2NvcnNvXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoL15bMC05XS4rJC8udGVzdChzKSA/ICd0cmEnIDogJ2luJykgKyAnICcgKyBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBmYScsXG4gICAgICAgICAgICBzOiAnYWxjdW5pIHNlY29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRpJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogXCJ1bidvcmFcIixcbiAgICAgICAgICAgIGhoOiAnJWQgb3JlJyxcbiAgICAgICAgICAgIGQ6ICd1biBnaW9ybm8nLFxuICAgICAgICAgICAgZGQ6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgTTogJ3VuIG1lc2UnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNpJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5uaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRDaDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21827\n")},21832:(I,g,n)=>{"use strict";I.exports=n.p+"edfd7169742280a5b11c.png"},22274:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Norwegian Bokmål [nb]\n//! authors : Espen Hovlandsdal : https://github.com/rexxars\n//! Sigurd Gartmann : https://github.com/sigurdga\n//! Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var nb = moment.defineLocale('nb', {\n months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n monthsParseExact: true,\n weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),\n weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),\n weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY [kl.] HH:mm',\n LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n },\n calendar: {\n sameDay: '[i dag kl.] LT',\n nextDay: '[i morgen kl.] LT',\n nextWeek: 'dddd [kl.] LT',\n lastDay: '[i går kl.] LT',\n lastWeek: '[forrige] dddd [kl.] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'om %s',\n past: '%s siden',\n s: 'noen sekunder',\n ss: '%d sekunder',\n m: 'ett minutt',\n mm: '%d minutter',\n h: 'én time',\n hh: '%d timer',\n d: 'én dag',\n dd: '%d dager',\n w: 'én uke',\n ww: '%d uker',\n M: 'én måned',\n MM: '%d måneder',\n y: 'ett år',\n yy: '%d år',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return nb;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyNzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qcz82Y2UzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J3ZWdpYW4gQm9rbcOlbCBbbmJdXG4vLyEgYXV0aG9ycyA6IEVzcGVuIEhvdmxhbmRzZGFsIDogaHR0cHM6Ly9naXRodWIuY29tL3JleHhhcnNcbi8vISAgICAgICAgICAgU2lndXJkIEdhcnRtYW5uIDogaHR0cHM6Ly9naXRodWIuY29tL3NpZ3VyZGdhXG4vLyEgICAgICAgICAgIFN0ZXBoZW4gUmFtdGh1biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVwaGVucmFtdGh1blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG5iID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByaWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXJzX2Fwci5fbWFpX2p1bmlfanVsaV9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3PDuC5fbWEuX3RpLl9vbi5fdG8uX2ZyLl9sw7guJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDuF9tYV90aV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tpIG1vcmdlbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2kgZ8OlciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2ZvcnJpZ2VdIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgczogJ25vZW4gc2VrdW5kZXInLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtOiAnZXR0IG1pbnV0dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGg6ICfDqW4gdGltZScsXG4gICAgICAgICAgICBoaDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQ6ICfDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZXInLFxuICAgICAgICAgICAgdzogJ8OpbiB1a2UnLFxuICAgICAgICAgICAgd3c6ICclZCB1a2VyJyxcbiAgICAgICAgICAgIE06ICfDqW4gbcOlbmVkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmVkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5iO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///22274\n")},22551:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval('/** @license React v17.0.2\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\nvar aa=__webpack_require__(24002),m=__webpack_require__(45228),r=__webpack_require__(69982);function y(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cb}return!1}function B(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var D={};\n"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1,!1)});\n["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1,!1)});\n["checked","multiple","muted","selected"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1,!1)});["capture","download"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1,!1)});["cols","rows","size","span"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1,!1)});["rowSpan","start"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1,!1)});var oa=/[\\-:]([a-z])/g;function pa(a){return a[1].toUpperCase()}\n"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(oa,\npa);D[b]=new B(b,1,!1,a,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(oa,pa);D[b]=new B(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1,!1)});\nD.xlinkHref=new B("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction qa(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2h||e[g]!==f[h])return"\\n"+e[g].replace(" at new "," at ");while(1<=g&&0<=h)}break}}}finally{Oa=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:"")?Na(a):""}\nfunction Qa(a){switch(a.tag){case 5:return Na(a.type);case 16:return Na("Lazy");case 13:return Na("Suspense");case 19:return Na("SuspenseList");case 0:case 2:case 15:return a=Pa(a.type,!1),a;case 11:return a=Pa(a.type.render,!1),a;case 22:return a=Pa(a.type._render,!1),a;case 1:return a=Pa(a.type,!0),a;default:return""}}\nfunction Ra(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case ua:return"Fragment";case ta:return"Portal";case xa:return"Profiler";case wa:return"StrictMode";case Ba:return"Suspense";case Ca:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case za:return(a.displayName||"Context")+".Consumer";case ya:return(a._context.displayName||"Context")+".Provider";case Aa:var b=a.render;b=b.displayName||b.name||"";\nreturn a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Da:return Ra(a.type);case Fa:return Ra(a._render);case Ea:b=a._payload;a=a._init;try{return Ra(a(b))}catch(c){}}return null}function Sa(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function Ta(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}\nfunction Ua(a){var b=Ta(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ta(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return m({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function $a(a,b){b=b.checked;null!=b&&qa(a,"checked",b,!1)}\nfunction ab(a,b){$a(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?bb(a,b.type,c):b.hasOwnProperty("defaultValue")&&bb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction cb(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}\nfunction bb(a,b,c){if("number"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function db(a){var b="";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function eb(a,b){a=m({children:void 0},b);if(b=db(b.children))a.children=b;return a}\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e=c.length))throw Error(y(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}var kb={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};\nfunction lb(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function mb(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?lb(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}\nvar nb,ob=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==kb.svg||"innerHTML"in a)a.innerHTML=b;else{nb=nb||document.createElement("div");nb.innerHTML=""+b.valueOf().toString()+"";for(b=nb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction pb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar qb={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rb=["Webkit","ms","Moz","O"];Object.keys(qb).forEach(function(a){rb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);qb[b]=qb[a]})});function sb(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||qb.hasOwnProperty(a)&&qb[a]?(""+b).trim():b+"px"}\nfunction tb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=sb(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}var ub=m({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction vb(a,b){if(b){if(ub[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(y(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(y(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(y(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(y(62));}}\nfunction wb(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}}function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if("function"!==typeof yb)throw Error(y(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;ad?0:1<c;c++)b.push(a);return b}\nfunction $c(a,b,c){a.pendingLanes|=b;var d=b-1;a.suspendedLanes&=d;a.pingedLanes&=d;a=a.eventTimes;b=31-Vc(b);a[b]=c}var Vc=Math.clz32?Math.clz32:ad,bd=Math.log,cd=Math.LN2;function ad(a){return 0===a?32:31-(bd(a)/cd|0)|0}var dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function gd(a,b,c,d){Kb||Ib();var e=hd,f=Kb;Kb=!0;try{Hb(e,a,b,c,d)}finally{(Kb=f)||Mb()}}function id(a,b,c,d){ed(dd,hd.bind(null,a,b,c,d))}\nfunction hd(a,b,c,d){if(fd){var e;if((e=0===(b&4))&&0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case "keyup":return-1!==$d.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "focusout":return!0;default:return!1}}function he(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case "compositionend":return he(b);case "keypress":if(32!==b.which)return null;fe=!0;return ee;case "textInput":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return"compositionend"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Ke(c)}}function Me(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Me(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Ne(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Oe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}\nvar Pe=fa&&"documentMode"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,"selectionStart"in d&&Oe(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Je(Se,d)||(Se=d,d=oe(Re,"onSelect"),0Af||(a.current=zf[Af],zf[Af]=null,Af--)}function I(a,b){Af++;zf[Af]=a.current;a.current=b}var Cf={},M=Bf(Cf),N=Bf(!1),Df=Cf;\nfunction Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function Ff(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Gf(){H(N);H(M)}function Hf(a,b,c){if(M.current!==Cf)throw Error(y(168));I(M,b);I(N,c)}\nfunction If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(y(108,Ra(b)||"Unknown",e));return m({},c,d)}function Jf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Cf;Df=M.current;I(M,a);I(N,N.current);return!0}function Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(y(169));c?(a=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=a,H(N),H(M),I(M,a)):H(N);I(N,c)}\nvar Lf=null,Mf=null,Nf=r.unstable_runWithPriority,Of=r.unstable_scheduleCallback,Pf=r.unstable_cancelCallback,Qf=r.unstable_shouldYield,Rf=r.unstable_requestPaint,Sf=r.unstable_now,Tf=r.unstable_getCurrentPriorityLevel,Uf=r.unstable_ImmediatePriority,Vf=r.unstable_UserBlockingPriority,Wf=r.unstable_NormalPriority,Xf=r.unstable_LowPriority,Yf=r.unstable_IdlePriority,Zf={},$f=void 0!==Rf?Rf:function(){},ag=null,bg=null,cg=!1,dg=Sf(),O=1E4>dg?Sf:function(){return Sf()-dg};\nfunction eg(){switch(Tf()){case Uf:return 99;case Vf:return 98;case Wf:return 97;case Xf:return 96;case Yf:return 95;default:throw Error(y(332));}}function fg(a){switch(a){case 99:return Uf;case 98:return Vf;case 97:return Wf;case 96:return Xf;case 95:return Yf;default:throw Error(y(332));}}function gg(a,b){a=fg(a);return Nf(a,b)}function hg(a,b,c){a=fg(a);return Of(a,b,c)}function ig(){if(null!==bg){var a=bg;bg=null;Pf(a)}jg()}\nfunction jg(){if(!cg&&null!==ag){cg=!0;var a=0;try{var b=ag;gg(99,function(){for(;az?(q=u,u=null):q=u.sibling;var n=p(e,u,h[z],k);if(null===n){null===u&&(u=q);break}a&&u&&null===\nn.alternate&&b(e,u);g=f(n,g,z);null===t?l=n:t.sibling=n;t=n;u=q}if(z===h.length)return c(e,u),l;if(null===u){for(;zz?(q=u,u=null):q=u.sibling;var w=p(e,u,n.value,k);if(null===w){null===u&&(u=q);break}a&&u&&null===w.alternate&&b(e,u);g=f(w,g,z);null===t?l=w:t.sibling=w;t=w;u=q}if(n.done)return c(e,u),l;if(null===u){for(;!n.done;z++,n=h.next())n=A(e,n.value,k),null!==n&&(g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);return l}for(u=d(e,u);!n.done;z++,n=h.next())n=C(u,e,z,n.value,k),null!==n&&(a&&null!==n.alternate&&\nu.delete(null===n.key?z:n.key),g=f(n,g,z),null===t?l=n:t.sibling=n,t=n);a&&u.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!==f&&f.type===ua&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case sa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ua){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,k.sibling);\nd=e(k,f.props);d.ref=Qg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ua?(d=Xg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Vg(f.type,f.key,f.props,null,a.mode,h),h.ref=Qg(a,d,f),h.return=a,a=h)}return g(a);case ta:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=\nWg(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Ug(f,a.mode,h),d.return=a,a=d),g(a);if(Pg(f))return x(a,d,f,h);if(La(f))return w(a,d,f,h);l&&Rg(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 22:case 0:case 11:case 15:throw Error(y(152,Ra(a.type)||"Component"));}return c(a,d)}}var Yg=Sg(!0),Zg=Sg(!1),$g={},ah=Bf($g),bh=Bf($g),ch=Bf($g);\nfunction dh(a){if(a===$g)throw Error(y(174));return a}function eh(a,b){I(ch,b);I(bh,a);I(ah,$g);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:mb(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=mb(b,a)}H(ah);I(ah,b)}function fh(){H(ah);H(bh);H(ch)}function gh(a){dh(ch.current);var b=dh(ah.current);var c=mb(b,a.type);b!==c&&(I(bh,a),I(ah,c))}function hh(a){bh.current===a&&(H(ah),H(bh))}var P=Bf(0);\nfunction ih(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||"$?"===c.data||"$!"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var jh=null,kh=null,lh=!1;\nfunction mh(a,b){var c=nh(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.flags=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function oh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ph(a){if(lh){var b=kh;if(b){var c=b;if(!oh(a,b)){b=rf(c.nextSibling);if(!b||!oh(a,b)){a.flags=a.flags&-1025|2;lh=!1;jh=a;return}mh(jh,c)}jh=a;kh=rf(b.firstChild)}else a.flags=a.flags&-1025|2,lh=!1,jh=a}}function qh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;jh=a}\nfunction rh(a){if(a!==jh)return!1;if(!lh)return qh(a),lh=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!nf(b,a.memoizedProps))for(b=kh;b;)mh(a,b),b=rf(b.nextSibling);qh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(y(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if("/$"===c){if(0===b){kh=rf(a.nextSibling);break a}b--}else"$"!==c&&"$!"!==c&&"$?"!==c||b++}a=a.nextSibling}kh=null}}else kh=jh?rf(a.stateNode.nextSibling):null;return!0}\nfunction sh(){kh=jh=null;lh=!1}var th=[];function uh(){for(var a=0;af))throw Error(y(301));f+=1;T=S=null;b.updateQueue=null;vh.current=Fh;a=c(d,e)}while(zh)}vh.current=Gh;b=null!==S&&null!==S.next;xh=0;T=S=R=null;yh=!1;if(b)throw Error(y(300));return a}function Hh(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===T?R.memoizedState=T=a:T=T.next=a;return T}\nfunction Ih(){if(null===S){var a=R.alternate;a=null!==a?a.memoizedState:null}else a=S.next;var b=null===T?R.memoizedState:T.next;if(null!==b)T=b,S=a;else{if(null===a)throw Error(y(310));S=a;a={memoizedState:S.memoizedState,baseState:S.baseState,baseQueue:S.baseQueue,queue:S.queue,next:null};null===T?R.memoizedState=T=a:T=T.next=a}return T}function Jh(a,b){return"function"===typeof b?b(a):b}\nfunction Kh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=S,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.lane;if((xh&l)===l)null!==h&&(h=h.next={lane:0,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),d=k.eagerReducer===a?k.eagerState:a(d,k.action);else{var n={lane:l,action:k.action,eagerReducer:k.eagerReducer,\neagerState:k.eagerState,next:null};null===h?(g=h=n,f=d):h=h.next=n;R.lanes|=l;Dg|=l}k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;He(d,b.memoizedState)||(ug=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction Lh(a){var b=Ih(),c=b.queue;if(null===c)throw Error(y(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction Mh(a,b,c){var d=b._getVersion;d=d(b._source);var e=b._workInProgressVersionPrimary;if(null!==e)a=e===d;else if(a=a.mutableReadLanes,a=(xh&a)===a)b._workInProgressVersionPrimary=d,th.push(b);if(a)return c(b._source);th.push(b);throw Error(y(350));}\nfunction Nh(a,b,c,d){var e=U;if(null===e)throw Error(y(349));var f=b._getVersion,g=f(b._source),h=vh.current,k=h.useState(function(){return Mh(e,b,c)}),l=k[1],n=k[0];k=T;var A=a.memoizedState,p=A.refs,C=p.getSnapshot,x=A.source;A=A.subscribe;var w=R;a.memoizedState={refs:p,source:b,subscribe:d};h.useEffect(function(){p.getSnapshot=c;p.setSnapshot=l;var a=f(b._source);if(!He(g,a)){a=c(b._source);He(n,a)||(l(a),a=Ig(w),e.mutableReadLanes|=a&e.pendingLanes);a=e.mutableReadLanes;e.entangledLanes|=a;for(var d=\ne.entanglements,h=a;0c?98:c,function(){a(!0)});gg(97\\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),"select"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[wf]=b;a[xf]=d;Bi(a,b,!1,!1);b.stateNode=a;g=wb(c,d);switch(c){case "dialog":G("cancel",a);G("close",a);\ne=d;break;case "iframe":case "object":case "embed":G("load",a);e=d;break;case "video":case "audio":for(e=0;eJi&&(b.flags|=64,f=!0,Fi(d,!1),b.lanes=33554432)}else{if(!f)if(a=ih(g),null!==a){if(b.flags|=64,f=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Fi(d,!0),null===d.tail&&"hidden"===d.tailMode&&!g.alternate&&!lh)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*O()-d.renderingStartTime>Ji&&1073741824!==c&&(b.flags|=\n64,f=!0,Fi(d,!1),b.lanes=33554432);d.isBackwards?(g.sibling=b.child,b.child=g):(c=d.last,null!==c?c.sibling=g:b.child=g,d.last=g)}return null!==d.tail?(c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=O(),c.sibling=null,b=P.current,I(P,f?b&1|2:b&1),c):null;case 23:case 24:return Ki(),null!==a&&null!==a.memoizedState!==(null!==b.memoizedState)&&"unstable-defer-without-hiding"!==d.mode&&(b.flags|=4),null}throw Error(y(156,b.tag));}\nfunction Li(a){switch(a.tag){case 1:Ff(a.type)&&Gf();var b=a.flags;return b&4096?(a.flags=b&-4097|64,a):null;case 3:fh();H(N);H(M);uh();b=a.flags;if(0!==(b&64))throw Error(y(285));a.flags=b&-4097|64;return a;case 5:return hh(a),null;case 13:return H(P),b=a.flags,b&4096?(a.flags=b&-4097|64,a):null;case 19:return H(P),null;case 4:return fh(),null;case 10:return rg(a),null;case 23:case 24:return Ki(),null;default:return null}}\nfunction Mi(a,b){try{var c="",d=b;do c+=Qa(d),d=d.return;while(d);var e=c}catch(f){e="\\nError generating stack: "+f.message+"\\n"+f.stack}return{value:a,source:b,stack:e}}function Ni(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Oi="function"===typeof WeakMap?WeakMap:Map;function Pi(a,b,c){c=zg(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Qi||(Qi=!0,Ri=d);Ni(a,b)};return c}\nfunction Si(a,b,c){c=zg(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Ni(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&(null===Ti?Ti=new Set([this]):Ti.add(this),Ni(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}var Ui="function"===typeof WeakSet?WeakSet:Set;\nfunction Vi(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Wi(a,c)}else b.current=null}function Xi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.flags&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:lg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:b.flags&256&&qf(b.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(y(163));}\nfunction Yi(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{if(3===(a.tag&3)){var d=a.create;a.destroy=d()}a=a.next}while(a!==b)}b=c.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){a=b=b.next;do{var e=a;d=e.next;e=e.tag;0!==(e&4)&&0!==(e&1)&&(Zi(c,a),$i(c,a));a=d}while(a!==b)}return;case 1:a=c.stateNode;c.flags&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:lg(c.type,b.memoizedProps),a.componentDidUpdate(d,\nb.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Eg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Eg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.flags&4&&mf(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Cc(c))));\nreturn;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(y(163));}\nfunction aj(a,b){for(var c=a;;){if(5===c.tag){var d=c.stateNode;if(b)d=d.style,"function"===typeof d.setProperty?d.setProperty("display","none","important"):d.display="none";else{d=c.stateNode;var e=c.memoizedProps.style;e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null;d.style.display=sb("display",e)}}else if(6===c.tag)c.stateNode.nodeValue=b?"":c.memoizedProps;else if((23!==c.tag&&24!==c.tag||null===c.memoizedState||c===a)&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===\na)break;for(;null===c.sibling;){if(null===c.return||c.return===a)return;c=c.return}c.sibling.return=c.return;c=c.sibling}}\nfunction bj(a,b){if(Mf&&"function"===typeof Mf.onCommitFiberUnmount)try{Mf.onCommitFiberUnmount(Lf,b)}catch(f){}switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var c=a=a.next;do{var d=c,e=d.destroy;d=d.tag;if(void 0!==e)if(0!==(d&4))Zi(b,c);else{d=b;try{e()}catch(f){Wi(d,f)}}c=c.next}while(c!==a)}break;case 1:Vi(b);a=b.stateNode;if("function"===typeof a.componentWillUnmount)try{a.props=b.memoizedProps,a.state=b.memoizedState,a.componentWillUnmount()}catch(f){Wi(b,\nf)}break;case 5:Vi(b);break;case 4:cj(a,b)}}function dj(a){a.alternate=null;a.child=null;a.dependencies=null;a.firstEffect=null;a.lastEffect=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.return=null;a.updateQueue=null}function ej(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction fj(a){a:{for(var b=a.return;null!==b;){if(ej(b))break a;b=b.return}throw Error(y(160));}var c=b;b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(y(161));}c.flags&16&&(pb(b,""),c.flags&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||ej(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.flags&2)continue b;if(null===\nc.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.flags&2)){c=c.stateNode;break a}}d?gj(a,c,b):hj(a,c,b)}\nfunction gj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=jf));else if(4!==d&&(a=a.child,null!==a))for(gj(a,b,c),a=a.sibling;null!==a;)gj(a,b,c),a=a.sibling}\nfunction hj(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(hj(a,b,c),a=a.sibling;null!==a;)hj(a,b,c),a=a.sibling}\nfunction cj(a,b){for(var c=b,d=!1,e,f;;){if(!d){d=c.return;a:for(;;){if(null===d)throw Error(y(160));e=d.stateNode;switch(d.tag){case 5:f=!1;break a;case 3:e=e.containerInfo;f=!0;break a;case 4:e=e.containerInfo;f=!0;break a}d=d.return}d=!0}if(5===c.tag||6===c.tag){a:for(var g=a,h=c,k=h;;)if(bj(g,k),null!==k.child&&4!==k.tag)k.child.return=k,k=k.child;else{if(k===h)break a;for(;null===k.sibling;){if(null===k.return||k.return===h)break a;k=k.return}k.sibling.return=k.return;k=k.sibling}f?(g=e,h=c.stateNode,\n8===g.nodeType?g.parentNode.removeChild(h):g.removeChild(h)):e.removeChild(c.stateNode)}else if(4===c.tag){if(null!==c.child){e=c.stateNode.containerInfo;f=!0;c.child.return=c;c=c.child;continue}}else if(bj(a,c),null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return;4===c.tag&&(d=!1)}c.sibling.return=c.return;c=c.sibling}}\nfunction ij(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:var c=b.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do 3===(d.tag&3)&&(a=d.destroy,d.destroy=void 0,void 0!==a&&a()),d=d.next;while(d!==c)}return;case 1:return;case 5:c=b.stateNode;if(null!=c){d=b.memoizedProps;var e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[xf]=d;"input"===a&&"radio"===d.type&&null!=d.name&&$a(c,d);wb(a,e);b=wb(a,d);for(e=0;ee&&(e=g);c&=~f}c=e;c=O()-c;c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3E3>c?3E3:4320>\nc?4320:1960*nj(c/1960))-c;if(10 component higher in the tree to provide a loading indicator or placeholder to display.")}5!==V&&(V=2);k=Mi(k,h);p=\ng;do{switch(p.tag){case 3:f=k;p.flags|=4096;b&=-b;p.lanes|=b;var J=Pi(p,f,b);Bg(p,J);break a;case 1:f=k;var K=p.type,Q=p.stateNode;if(0===(p.flags&64)&&("function"===typeof K.getDerivedStateFromError||null!==Q&&"function"===typeof Q.componentDidCatch&&(null===Ti||!Ti.has(Q)))){p.flags|=4096;b&=-b;p.lanes|=b;var L=Si(p,f,b);Bg(p,L);break a}}p=p.return}while(null!==p)}Zj(c)}catch(va){b=va;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}\nfunction Pj(){var a=oj.current;oj.current=Gh;return null===a?Gh:a}function Tj(a,b){var c=X;X|=16;var d=Pj();U===a&&W===b||Qj(a,b);do try{ak();break}catch(e){Sj(a,e)}while(1);qg();X=c;oj.current=d;if(null!==Y)throw Error(y(261));U=null;W=0;return V}function ak(){for(;null!==Y;)bk(Y)}function Rj(){for(;null!==Y&&!Qf();)bk(Y)}function bk(a){var b=ck(a.alternate,a,qj);a.memoizedProps=a.pendingProps;null===b?Zj(a):Y=b;pj.current=null}\nfunction Zj(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&2048)){c=Gi(c,b,qj);if(null!==c){Y=c;return}c=b;if(24!==c.tag&&23!==c.tag||null===c.memoizedState||0!==(qj&1073741824)||0===(c.mode&4)){for(var d=0,e=c.child;null!==e;)d|=e.lanes|e.childLanes,e=e.sibling;c.childLanes=d}null!==a&&0===(a.flags&2048)&&(null===a.firstEffect&&(a.firstEffect=b.firstEffect),null!==b.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=b.firstEffect),a.lastEffect=b.lastEffect),1g&&(h=g,g=J,J=h),h=Le(t,J),f=Le(t,g),h&&f&&(1!==v.rangeCount||v.anchorNode!==h.node||v.anchorOffset!==h.offset||v.focusNode!==f.node||v.focusOffset!==f.offset)&&(q=q.createRange(),q.setStart(h.node,h.offset),v.removeAllRanges(),J>g?(v.addRange(q),v.extend(f.node,f.offset)):(q.setEnd(f.node,f.offset),v.addRange(q))))));q=[];for(v=t;v=v.parentNode;)1===v.nodeType&&q.push({element:v,left:v.scrollLeft,top:v.scrollTop});"function"===typeof t.focus&&t.focus();for(t=\n0;tO()-jj?Qj(a,0):uj|=c);Mj(a,b)}function lj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=a.mode,0===(b&2)?b=1:0===(b&4)?b=99===eg()?1:2:(0===Gj&&(Gj=tj),b=Yc(62914560&~Gj),0===b&&(b=4194304)));c=Hg();a=Kj(a,b);null!==a&&($c(a,b,c),Mj(a,c))}var ck;\nck=function(a,b,c){var d=b.lanes;if(null!==a)if(a.memoizedProps!==b.pendingProps||N.current)ug=!0;else if(0!==(c&d))ug=0!==(a.flags&16384)?!0:!1;else{ug=!1;switch(b.tag){case 3:ri(b);sh();break;case 5:gh(b);break;case 1:Ff(b.type)&&Jf(b);break;case 4:eh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;var e=b.type._context;I(mg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){if(0!==(c&b.child.childLanes))return ti(a,b,c);I(P,P.current&1);b=hi(a,b,c);return null!==\nb?b.sibling:null}I(P,P.current&1);break;case 19:d=0!==(c&b.childLanes);if(0!==(a.flags&64)){if(d)return Ai(a,b,c);b.flags|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);I(P,P.current);if(d)break;else return null;case 23:case 24:return b.lanes=0,mi(a,b,c)}return hi(a,b,c)}else ug=!1;b.lanes=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);a=b.pendingProps;e=Ef(b,M.current);tg(b,c);e=Ch(null,b,d,a,e,c);b.flags|=1;if("object"===\ntypeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(Ff(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;xg(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Gg(b,d,g,a);e.updater=Kg;b.stateNode=e;e._reactInternals=b;Og(b,d,a,c);b=qi(null,b,d,!0,f,c)}else b.tag=0,fi(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;a:{null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2);\na=b.pendingProps;f=e._init;e=f(e._payload);b.type=e;f=b.tag=hk(e);a=lg(e,a);switch(f){case 0:b=li(null,b,e,a,c);break a;case 1:b=pi(null,b,e,a,c);break a;case 11:b=gi(null,b,e,a,c);break a;case 14:b=ii(null,b,e,lg(e.type,a),d,c);break a}throw Error(y(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),li(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:lg(d,e),pi(a,b,d,e,c);case 3:ri(b);d=b.updateQueue;if(null===a||null===d)throw Error(y(282));\nd=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;yg(a,b);Cg(b,d,null,c);d=b.memoizedState.element;if(d===e)sh(),b=hi(a,b,c);else{e=b.stateNode;if(f=e.hydrate)kh=rf(b.stateNode.containerInfo.firstChild),jh=b,f=lh=!0;if(f){a=e.mutableSourceEagerHydrationData;if(null!=a)for(e=0;e>> 16),\n\t K[1], (K[0] << 16) | (K[3] >>> 16),\n\t K[2], (K[1] << 16) | (K[0] >>> 16),\n\t K[3], (K[2] << 16) | (K[1] >>> 16)\n\t ];\n\n\t // Generate initial counter values\n\t var C = this._C = [\n\t (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t ];\n\n\t // Carry bit\n\t this._b = 0;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\n\t // Modify the counters\n\t for (var i = 0; i < 8; i++) {\n\t C[i] ^= X[(i + 4) & 7];\n\t }\n\n\t // IV setup\n\t if (iv) {\n\t // Shortcuts\n\t var IV = iv.words;\n\t var IV_0 = IV[0];\n\t var IV_1 = IV[1];\n\n\t // Generate four subvectors\n\t var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t var i3 = (i2 << 16) | (i0 & 0x0000ffff);\n\n\t // Modify counter values\n\t C[0] ^= i0;\n\t C[1] ^= i1;\n\t C[2] ^= i2;\n\t C[3] ^= i3;\n\t C[4] ^= i0;\n\t C[5] ^= i1;\n\t C[6] ^= i2;\n\t C[7] ^= i3;\n\n\t // Iterate the system four times\n\t for (var i = 0; i < 4; i++) {\n\t nextState.call(this);\n\t }\n\t }\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var X = this._X;\n\n\t // Iterate the system\n\t nextState.call(this);\n\n\t // Generate four keystream words\n\t S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t for (var i = 0; i < 4; i++) {\n\t // Swap endian\n\t S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\n\t (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\n\n\t // Encrypt\n\t M[offset + i] ^= S[i];\n\t }\n\t },\n\n\t blockSize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t function nextState() {\n\t // Shortcuts\n\t var X = this._X;\n\t var C = this._C;\n\n\t // Save old counter values\n\t for (var i = 0; i < 8; i++) {\n\t C_[i] = C[i];\n\t }\n\n\t // Calculate new counter values\n\t C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t // Calculate the g-values\n\t for (var i = 0; i < 8; i++) {\n\t var gx = X[i] + C[i];\n\n\t // Construct high and low argument for squaring\n\t var ga = gx & 0xffff;\n\t var gb = gx >>> 16;\n\n\t // Calculate high and low result of squaring\n\t var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t // High XOR low\n\t G[i] = gh ^ gl;\n\t }\n\n\t // Calculate new state values\n\t X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\n\t X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\n\t X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\n\t X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\n\t }\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t */\n\t C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\treturn CryptoJS.RabbitLegacy;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2OTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvcmFiYml0LWxlZ2FjeS5qcz8zZDVhIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9lbmMtYmFzZTY0XCIpLCByZXF1aXJlKFwiLi9tZDVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vbWQ1XCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0c1xuXHQgICAgdmFyIFMgID0gW107XG5cdCAgICB2YXIgQ18gPSBbXTtcblx0ICAgIHZhciBHICA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFJhYmJpdCBzdHJlYW0gY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGlzIGlzIGEgbGVnYWN5IHZlcnNpb24gdGhhdCBuZWdsZWN0ZWQgdG8gY29udmVydCB0aGUga2V5IHRvIGxpdHRsZS1lbmRpYW4uXG5cdCAgICAgKiBUaGlzIGVycm9yIGRvZXNuJ3QgYWZmZWN0IHRoZSBjaXBoZXIncyBzZWN1cml0eSxcblx0ICAgICAqIGJ1dCBpdCBkb2VzIGFmZmVjdCBpdHMgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucy5cblx0ICAgICAqL1xuXHQgICAgdmFyIFJhYmJpdExlZ2FjeSA9IENfYWxnby5SYWJiaXRMZWdhY3kgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEsgPSB0aGlzLl9rZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBpdiA9IHRoaXMuY2ZnLml2O1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGluaXRpYWwgc3RhdGUgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBYID0gdGhpcy5fWCA9IFtcblx0ICAgICAgICAgICAgICAgIEtbMF0sIChLWzNdIDw8IDE2KSB8IChLWzJdID4+PiAxNiksXG5cdCAgICAgICAgICAgICAgICBLWzFdLCAoS1swXSA8PCAxNikgfCAoS1szXSA+Pj4gMTYpLFxuXHQgICAgICAgICAgICAgICAgS1syXSwgKEtbMV0gPDwgMTYpIHwgKEtbMF0gPj4+IDE2KSxcblx0ICAgICAgICAgICAgICAgIEtbM10sIChLWzJdIDw8IDE2KSB8IChLWzFdID4+PiAxNilcblx0ICAgICAgICAgICAgXTtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBDID0gdGhpcy5fQyA9IFtcblx0ICAgICAgICAgICAgICAgIChLWzJdIDw8IDE2KSB8IChLWzJdID4+PiAxNiksIChLWzBdICYgMHhmZmZmMDAwMCkgfCAoS1sxXSAmIDB4MDAwMGZmZmYpLFxuXHQgICAgICAgICAgICAgICAgKEtbM10gPDwgMTYpIHwgKEtbM10gPj4+IDE2KSwgKEtbMV0gJiAweGZmZmYwMDAwKSB8IChLWzJdICYgMHgwMDAwZmZmZiksXG5cdCAgICAgICAgICAgICAgICAoS1swXSA8PCAxNikgfCAoS1swXSA+Pj4gMTYpLCAoS1syXSAmIDB4ZmZmZjAwMDApIHwgKEtbM10gJiAweDAwMDBmZmZmKSxcblx0ICAgICAgICAgICAgICAgIChLWzFdIDw8IDE2KSB8IChLWzFdID4+PiAxNiksIChLWzNdICYgMHhmZmZmMDAwMCkgfCAoS1swXSAmIDB4MDAwMGZmZmYpXG5cdCAgICAgICAgICAgIF07XG5cblx0ICAgICAgICAgICAgLy8gQ2FycnkgYml0XG5cdCAgICAgICAgICAgIHRoaXMuX2IgPSAwO1xuXG5cdCAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbSBmb3VyIHRpbWVzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgY291bnRlcnNcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIENbaV0gXj0gWFsoaSArIDQpICYgN107XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJViBzZXR1cFxuXHQgICAgICAgICAgICBpZiAoaXYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIElWID0gaXYud29yZHM7XG5cdCAgICAgICAgICAgICAgICB2YXIgSVZfMCA9IElWWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIElWXzEgPSBJVlsxXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBzdWJ2ZWN0b3JzXG5cdCAgICAgICAgICAgICAgICB2YXIgaTAgPSAoKChJVl8wIDw8IDgpIHwgKElWXzAgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8ICgoKElWXzAgPDwgMjQpIHwgKElWXzAgPj4+IDgpKSAmIDB4ZmYwMGZmMDApO1xuXHQgICAgICAgICAgICAgICAgdmFyIGkyID0gKCgoSVZfMSA8PCA4KSB8IChJVl8xID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfCAoKChJVl8xIDw8IDI0KSB8IChJVl8xID4+PiA4KSkgJiAweGZmMDBmZjAwKTtcblx0ICAgICAgICAgICAgICAgIHZhciBpMSA9IChpMCA+Pj4gMTYpIHwgKGkyICYgMHhmZmZmMDAwMCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgaTMgPSAoaTIgPDwgMTYpICB8IChpMCAmIDB4MDAwMGZmZmYpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBNb2RpZnkgY291bnRlciB2YWx1ZXNcblx0ICAgICAgICAgICAgICAgIENbMF0gXj0gaTA7XG5cdCAgICAgICAgICAgICAgICBDWzFdIF49IGkxO1xuXHQgICAgICAgICAgICAgICAgQ1syXSBePSBpMjtcblx0ICAgICAgICAgICAgICAgIENbM10gXj0gaTM7XG5cdCAgICAgICAgICAgICAgICBDWzRdIF49IGkwO1xuXHQgICAgICAgICAgICAgICAgQ1s1XSBePSBpMTtcblx0ICAgICAgICAgICAgICAgIENbNl0gXj0gaTI7XG5cdCAgICAgICAgICAgICAgICBDWzddIF49IGkzO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lc1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIFggPSB0aGlzLl9YO1xuXG5cdCAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbVxuXHQgICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBHZW5lcmF0ZSBmb3VyIGtleXN0cmVhbSB3b3Jkc1xuXHQgICAgICAgICAgICBTWzBdID0gWFswXSBeIChYWzVdID4+PiAxNikgXiAoWFszXSA8PCAxNik7XG5cdCAgICAgICAgICAgIFNbMV0gPSBYWzJdIF4gKFhbN10gPj4+IDE2KSBeIChYWzVdIDw8IDE2KTtcblx0ICAgICAgICAgICAgU1syXSA9IFhbNF0gXiAoWFsxXSA+Pj4gMTYpIF4gKFhbN10gPDwgMTYpO1xuXHQgICAgICAgICAgICBTWzNdID0gWFs2XSBeIChYWzNdID4+PiAxNikgXiAoWFsxXSA8PCAxNik7XG5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgICAgICBTW2ldID0gKCgoU1tpXSA8PCA4KSAgfCAoU1tpXSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChTW2ldIDw8IDI0KSB8IChTW2ldID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgICAgIE1bb2Zmc2V0ICsgaV0gXj0gU1tpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDEyOC8zMixcblxuXHQgICAgICAgIGl2U2l6ZTogNjQvMzJcblx0ICAgIH0pO1xuXG5cdCAgICBmdW5jdGlvbiBuZXh0U3RhdGUoKSB7XG5cdCAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgdmFyIFggPSB0aGlzLl9YO1xuXHQgICAgICAgIHZhciBDID0gdGhpcy5fQztcblxuXHQgICAgICAgIC8vIFNhdmUgb2xkIGNvdW50ZXIgdmFsdWVzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgQ19baV0gPSBDW2ldO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgY291bnRlciB2YWx1ZXNcblx0ICAgICAgICBDWzBdID0gKENbMF0gKyAweDRkMzRkMzRkICsgdGhpcy5fYikgfCAwO1xuXHQgICAgICAgIENbMV0gPSAoQ1sxXSArIDB4ZDM0ZDM0ZDMgKyAoKENbMF0gPj4+IDApIDwgKENfWzBdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbMl0gPSAoQ1syXSArIDB4MzRkMzRkMzQgKyAoKENbMV0gPj4+IDApIDwgKENfWzFdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbM10gPSAoQ1szXSArIDB4NGQzNGQzNGQgKyAoKENbMl0gPj4+IDApIDwgKENfWzJdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNF0gPSAoQ1s0XSArIDB4ZDM0ZDM0ZDMgKyAoKENbM10gPj4+IDApIDwgKENfWzNdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNV0gPSAoQ1s1XSArIDB4MzRkMzRkMzQgKyAoKENbNF0gPj4+IDApIDwgKENfWzRdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbNl0gPSAoQ1s2XSArIDB4NGQzNGQzNGQgKyAoKENbNV0gPj4+IDApIDwgKENfWzVdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIENbN10gPSAoQ1s3XSArIDB4ZDM0ZDM0ZDMgKyAoKENbNl0gPj4+IDApIDwgKENfWzZdID4+PiAwKSA/IDEgOiAwKSkgfCAwO1xuXHQgICAgICAgIHRoaXMuX2IgPSAoQ1s3XSA+Pj4gMCkgPCAoQ19bN10gPj4+IDApID8gMSA6IDA7XG5cblx0ICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGctdmFsdWVzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGd4ID0gWFtpXSArIENbaV07XG5cblx0ICAgICAgICAgICAgLy8gQ29uc3RydWN0IGhpZ2ggYW5kIGxvdyBhcmd1bWVudCBmb3Igc3F1YXJpbmdcblx0ICAgICAgICAgICAgdmFyIGdhID0gZ3ggJiAweGZmZmY7XG5cdCAgICAgICAgICAgIHZhciBnYiA9IGd4ID4+PiAxNjtcblxuXHQgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaGlnaCBhbmQgbG93IHJlc3VsdCBvZiBzcXVhcmluZ1xuXHQgICAgICAgICAgICB2YXIgZ2ggPSAoKCgoZ2EgKiBnYSkgPj4+IDE3KSArIGdhICogZ2IpID4+PiAxNSkgKyBnYiAqIGdiO1xuXHQgICAgICAgICAgICB2YXIgZ2wgPSAoKChneCAmIDB4ZmZmZjAwMDApICogZ3gpIHwgMCkgKyAoKChneCAmIDB4MDAwMGZmZmYpICogZ3gpIHwgMCk7XG5cblx0ICAgICAgICAgICAgLy8gSGlnaCBYT1IgbG93XG5cdCAgICAgICAgICAgIEdbaV0gPSBnaCBeIGdsO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc3RhdGUgdmFsdWVzXG5cdCAgICAgICAgWFswXSA9IChHWzBdICsgKChHWzddIDw8IDE2KSB8IChHWzddID4+PiAxNikpICsgKChHWzZdIDw8IDE2KSB8IChHWzZdID4+PiAxNikpKSB8IDA7XG5cdCAgICAgICAgWFsxXSA9IChHWzFdICsgKChHWzBdIDw8IDgpICB8IChHWzBdID4+PiAyNCkpICsgR1s3XSkgfCAwO1xuXHQgICAgICAgIFhbMl0gPSAoR1syXSArICgoR1sxXSA8PCAxNikgfCAoR1sxXSA+Pj4gMTYpKSArICgoR1swXSA8PCAxNikgfCAoR1swXSA+Pj4gMTYpKSkgfCAwO1xuXHQgICAgICAgIFhbM10gPSAoR1szXSArICgoR1syXSA8PCA4KSAgfCAoR1syXSA+Pj4gMjQpKSArIEdbMV0pIHwgMDtcblx0ICAgICAgICBYWzRdID0gKEdbNF0gKyAoKEdbM10gPDwgMTYpIHwgKEdbM10gPj4+IDE2KSkgKyAoKEdbMl0gPDwgMTYpIHwgKEdbMl0gPj4+IDE2KSkpIHwgMDtcblx0ICAgICAgICBYWzVdID0gKEdbNV0gKyAoKEdbNF0gPDwgOCkgIHwgKEdbNF0gPj4+IDI0KSkgKyBHWzNdKSB8IDA7XG5cdCAgICAgICAgWFs2XSA9IChHWzZdICsgKChHWzVdIDw8IDE2KSB8IChHWzVdID4+PiAxNikpICsgKChHWzRdIDw8IDE2KSB8IChHWzRdID4+PiAxNikpKSB8IDA7XG5cdCAgICAgICAgWFs3XSA9IChHWzddICsgKChHWzZdIDw8IDgpICB8IChHWzZdID4+PiAyNCkpICsgR1s1XSkgfCAwO1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJhYmJpdExlZ2FjeS5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLlJhYmJpdExlZ2FjeS5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5SYWJiaXRMZWdhY3kgPSBTdHJlYW1DaXBoZXIuX2NyZWF0ZUhlbHBlcihSYWJiaXRMZWdhY3kpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlJhYmJpdExlZ2FjeTtcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22696\n")},22794:(I,g,n)=>{"use strict";I.exports=n.p+"26356e88a338b7466920.png"},22835:(I,g,n)=>{"use strict";I.exports=n.p+"12fabc43618de99fcf04.png"},23082:(I,g,n)=>{"use strict";I.exports=n.p+"8d9c6046b4972b83c4dc.png"},23096:(I,g,n)=>{"use strict";I.exports=n.p+"6b6f7ed6fa57632dda3d.png"},23100:(I,g,n)=>{"use strict";I.exports=n.p+"b26f7e81545d742f54a3.png"},23214:(I,g,n)=>{"use strict";I.exports=n.p+"f55f9b6cc2422e7e8eb1.png"},23827:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Japanese [ja]\n//! author : LI Long : https://github.com/baryon\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ja = moment.defineLocale('ja', {\n eras: [\n {\n since: '2019-05-01',\n offset: 1,\n name: '令和',\n narrow: '㋿',\n abbr: 'R',\n },\n {\n since: '1989-01-08',\n until: '2019-04-30',\n offset: 1,\n name: '平成',\n narrow: '㍻',\n abbr: 'H',\n },\n {\n since: '1926-12-25',\n until: '1989-01-07',\n offset: 1,\n name: '昭和',\n narrow: '㍼',\n abbr: 'S',\n },\n {\n since: '1912-07-30',\n until: '1926-12-24',\n offset: 1,\n name: '大正',\n narrow: '㍽',\n abbr: 'T',\n },\n {\n since: '1873-01-01',\n until: '1912-07-29',\n offset: 6,\n name: '明治',\n narrow: '㍾',\n abbr: 'M',\n },\n {\n since: '0001-01-01',\n until: '1873-12-31',\n offset: 1,\n name: '西暦',\n narrow: 'AD',\n abbr: 'AD',\n },\n {\n since: '0000-12-31',\n until: -Infinity,\n offset: 1,\n name: '紀元前',\n narrow: 'BC',\n abbr: 'BC',\n },\n ],\n eraYearOrdinalRegex: /(元|\\d+)年/,\n eraYearOrdinalParse: function (input, match) {\n return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);\n },\n months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),\n monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n '_'\n ),\n weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),\n weekdaysShort: '日_月_火_水_木_金_土'.split('_'),\n weekdaysMin: '日_月_火_水_木_金_土'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY/MM/DD',\n LL: 'YYYY年M月D日',\n LLL: 'YYYY年M月D日 HH:mm',\n LLLL: 'YYYY年M月D日 dddd HH:mm',\n l: 'YYYY/MM/DD',\n ll: 'YYYY年M月D日',\n lll: 'YYYY年M月D日 HH:mm',\n llll: 'YYYY年M月D日(ddd) HH:mm',\n },\n meridiemParse: /午前|午後/i,\n isPM: function (input) {\n return input === '午後';\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return '午前';\n } else {\n return '午後';\n }\n },\n calendar: {\n sameDay: '[今日] LT',\n nextDay: '[明日] LT',\n nextWeek: function (now) {\n if (now.week() !== this.week()) {\n return '[来週]dddd LT';\n } else {\n return 'dddd LT';\n }\n },\n lastDay: '[昨日] LT',\n lastWeek: function (now) {\n if (this.week() !== now.week()) {\n return '[先週]dddd LT';\n } else {\n return 'dddd LT';\n }\n },\n sameElse: 'L',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}日/,\n ordinal: function (number, period) {\n switch (period) {\n case 'y':\n return number === 1 ? '元年' : number + '年';\n case 'd':\n case 'D':\n case 'DDD':\n return number + '日';\n default:\n return number;\n }\n },\n relativeTime: {\n future: '%s後',\n past: '%s前',\n s: '数秒',\n ss: '%d秒',\n m: '1分',\n mm: '%d分',\n h: '1時間',\n hh: '%d時間',\n d: '1日',\n dd: '%d日',\n M: '1ヶ月',\n MM: '%dヶ月',\n y: '1年',\n yy: '%d年',\n },\n });\n\n return ja;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4MjcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzPzA3OWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEphcGFuZXNlIFtqYV1cbi8vISBhdXRob3IgOiBMSSBMb25nIDogaHR0cHM6Ly9naXRodWIuY29tL2JhcnlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGphID0gbW9tZW50LmRlZmluZUxvY2FsZSgnamEnLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzIwMTktMDUtMDEnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5Luk5ZKMJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfji78nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdSJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTg5LTAxLTA4JyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzIwMTktMDQtMzAnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5bmz5oiQJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjbsnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdIJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTI2LTEyLTI1JyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5ODktMDEtMDcnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5pit5ZKMJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjbwnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdTJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTEyLTA3LTMwJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5MjYtMTItMjQnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5aSn5q2jJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjb0nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdUJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxODczLTAxLTAxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5MTItMDctMjknLFxuICAgICAgICAgICAgICAgIG9mZnNldDogNixcbiAgICAgICAgICAgICAgICBuYW1lOiAn5piO5rK7JyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjb4nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdNJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAxLTAxLTAxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE4NzMtMTItMzEnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn6KW/5pqmJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdBRCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ0FEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAwLTEyLTMxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn57SA5YWD5YmNJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdCQycsXG4gICAgICAgICAgICAgICAgYWJicjogJ0JDJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGVyYVllYXJPcmRpbmFsUmVnZXg6IC8o5YWDfFxcZCsp5bm0LyxcbiAgICAgICAgZXJhWWVhck9yZGluYWxQYXJzZTogZnVuY3Rpb24gKGlucHV0LCBtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdID09PSAn5YWDJyA/IDEgOiBwYXJzZUludChtYXRjaFsxXSB8fCBpbnB1dCwgMTApO1xuICAgICAgICB9LFxuICAgICAgICBtb250aHM6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfml6Xmm5zml6Vf5pyI5puc5pelX+eBq+abnOaXpV/msLTmm5zml6Vf5pyo5puc5pelX+mHkeabnOaXpV/lnJ/mm5zml6UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpSBkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelKGRkZCkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5Y2I5YmNfOWNiOW+jC9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+WNiOW+jCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfljYjliY0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOW+jCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7ml6VdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+adpemAsV1kZGRkIExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOaXpV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWVrKCkgIT09IG5vdy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5YWI6YCxXWRkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeaXpS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/ICflhYPlubQnIDogbnVtYmVyICsgJ+W5tCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICfmlbDnp5InLFxuICAgICAgICAgICAgc3M6ICclZOenkicsXG4gICAgICAgICAgICBtOiAnMeWIhicsXG4gICAgICAgICAgICBtbTogJyVk5YiGJyxcbiAgICAgICAgICAgIGg6ICcx5pmC6ZaTJyxcbiAgICAgICAgICAgIGhoOiAnJWTmmYLplpMnLFxuICAgICAgICAgICAgZDogJzHml6UnLFxuICAgICAgICAgICAgZGQ6ICclZOaXpScsXG4gICAgICAgICAgICBNOiAnMeODtuaciCcsXG4gICAgICAgICAgICBNTTogJyVk44O25pyIJyxcbiAgICAgICAgICAgIHk6ICcx5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWTlubQnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGphO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///23827\n")},23844:(I,g,n)=>{"use strict";I.exports=n.p+"a49218e1ba991a2fc921.png"},24457:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Romanian [ro]\n//! author : Vlad Gurdiga : https://github.com/gurdiga\n//! author : Valentin Agachi : https://github.com/avaly\n//! author : Emanuel Cepoi : https://github.com/cepem\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function relativeTimeWithPlural(number, withoutSuffix, key) {\n var format = {\n ss: 'secunde',\n mm: 'minute',\n hh: 'ore',\n dd: 'zile',\n ww: 'săptămâni',\n MM: 'luni',\n yy: 'ani',\n },\n separator = ' ';\n if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {\n separator = ' de ';\n }\n return number + separator + format[key];\n }\n\n var ro = moment.defineLocale('ro', {\n months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(\n '_'\n ),\n monthsShort:\n 'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),\n weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),\n weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY H:mm',\n LLLL: 'dddd, D MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[azi la] LT',\n nextDay: '[mâine la] LT',\n nextWeek: 'dddd [la] LT',\n lastDay: '[ieri la] LT',\n lastWeek: '[fosta] dddd [la] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'peste %s',\n past: '%s în urmă',\n s: 'câteva secunde',\n ss: relativeTimeWithPlural,\n m: 'un minut',\n mm: relativeTimeWithPlural,\n h: 'o oră',\n hh: relativeTimeWithPlural,\n d: 'o zi',\n dd: relativeTimeWithPlural,\n w: 'o săptămână',\n ww: relativeTimeWithPlural,\n M: 'o lună',\n MM: relativeTimeWithPlural,\n y: 'un an',\n yy: relativeTimeWithPlural,\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return ro;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0NTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzPzk3MmMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFJvbWFuaWFuIFtyb11cbi8vISBhdXRob3IgOiBWbGFkIEd1cmRpZ2EgOiBodHRwczovL2dpdGh1Yi5jb20vZ3VyZGlnYVxuLy8hIGF1dGhvciA6IFZhbGVudGluIEFnYWNoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdmFseVxuLy8hIGF1dGhvciA6IEVtYW51ZWwgQ2Vwb2kgOiBodHRwczovL2dpdGh1Yi5jb20vY2VwZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICAgICBzczogJ3NlY3VuZGUnLFxuICAgICAgICAgICAgICAgIG1tOiAnbWludXRlJyxcbiAgICAgICAgICAgICAgICBoaDogJ29yZScsXG4gICAgICAgICAgICAgICAgZGQ6ICd6aWxlJyxcbiAgICAgICAgICAgICAgICB3dzogJ3PEg3B0xINtw6JuaScsXG4gICAgICAgICAgICAgICAgTU06ICdsdW5pJyxcbiAgICAgICAgICAgICAgICB5eTogJ2FuaScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VwYXJhdG9yID0gJyAnO1xuICAgICAgICBpZiAobnVtYmVyICUgMTAwID49IDIwIHx8IChudW1iZXIgPj0gMTAwICYmIG51bWJlciAlIDEwMCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgZGUgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyICsgc2VwYXJhdG9yICsgZm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIHJvID0gbW9tZW50LmRlZmluZUxvY2FsZSgncm8nLCB7XG4gICAgICAgIG1vbnRoczogJ2lhbnVhcmllX2ZlYnJ1YXJpZV9tYXJ0aWVfYXByaWxpZV9tYWlfaXVuaWVfaXVsaWVfYXVndXN0X3NlcHRlbWJyaWVfb2N0b21icmllX25vaWVtYnJpZV9kZWNlbWJyaWUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2lhbi5fZmViLl9tYXJ0Ll9hcHIuX21haV9pdW4uX2l1bC5fYXVnLl9zZXB0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2R1bWluaWPEg19sdW5pX21hcsibaV9taWVyY3VyaV9qb2lfdmluZXJpX3PDom1ixIN0xIMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEdW1fTHVuX01hcl9NaWVfSm9pX1Zpbl9Tw6JtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0R1X0x1X01hX01pX0pvX1ZpX1PDoicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2F6aSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttw6JpbmUgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVyaSBsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9zdGFdIGRkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Blc3RlICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDrm4gdXJtxIMnLFxuICAgICAgICAgICAgczogJ2PDonRldmEgc2VjdW5kZScsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06ICd1biBtaW51dCcsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICdvIG9yxIMnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAnbyB6aScsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHc6ICdvIHPEg3B0xINtw6JuxIMnLFxuICAgICAgICAgICAgd3c6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAnbyBsdW7EgycsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24457\n")},24496:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic (Morocco) [ar-ma]\n//! author : ElFadili Yassine : https://github.com/ElFadiliY\n//! author : Abdel Said : https://github.com/abdelsaid\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var arMa = moment.defineLocale('ar-ma', {\n months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n '_'\n ),\n monthsShort:\n 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n '_'\n ),\n weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[اليوم على الساعة] LT',\n nextDay: '[غدا على الساعة] LT',\n nextWeek: 'dddd [على الساعة] LT',\n lastDay: '[أمس على الساعة] LT',\n lastWeek: 'dddd [على الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'في %s',\n past: 'منذ %s',\n s: 'ثوان',\n ss: '%d ثانية',\n m: 'دقيقة',\n mm: '%d دقائق',\n h: 'ساعة',\n hh: '%d ساعات',\n d: 'يوم',\n dd: '%d أيام',\n M: 'شهر',\n MM: '%d أشهر',\n y: 'سنة',\n yy: '%d سنوات',\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return arMa;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0OTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanM/MGE4NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChNb3JvY2NvKSBbYXItbWFdXG4vLyEgYXV0aG9yIDogRWxGYWRpbGkgWWFzc2luZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbEZhZGlsaVlcbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyTWEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1tYScsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9in2K3Yr1/Yp9ir2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJNYTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///24496\n")},25177:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Afrikaans [af]\n//! author : Werner Mollentze : https://github.com/wernerm\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var af = moment.defineLocale('af', {\n months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),\n weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(\n '_'\n ),\n weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),\n weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),\n meridiemParse: /vm|nm/i,\n isPM: function (input) {\n return /^nm$/i.test(input);\n },\n meridiem: function (hours, minutes, isLower) {\n if (hours < 12) {\n return isLower ? 'vm' : 'VM';\n } else {\n return isLower ? 'nm' : 'NM';\n }\n },\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Vandag om] LT',\n nextDay: '[Môre om] LT',\n nextWeek: 'dddd [om] LT',\n lastDay: '[Gister om] LT',\n lastWeek: '[Laas] dddd [om] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'oor %s',\n past: '%s gelede',\n s: \"'n paar sekondes\",\n ss: '%d sekondes',\n m: \"'n minuut\",\n mm: '%d minute',\n h: \"'n uur\",\n hh: '%d ure',\n d: \"'n dag\",\n dd: '%d dae',\n M: \"'n maand\",\n MM: '%d maande',\n y: \"'n jaar\",\n yy: '%d jaar',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n ordinal: function (number) {\n return (\n number +\n (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n ); // Thanks to Joris Röling : https://github.com/jjupiter\n },\n week: {\n dow: 1, // Maandag is die eerste dag van die week.\n doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.\n },\n });\n\n return af;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxNzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYWYuanM/MmJmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQWZyaWthYW5zIFthZl1cbi8vISBhdXRob3IgOiBXZXJuZXIgTW9sbGVudHplIDogaHR0cHM6Ly9naXRodWIuY29tL3dlcm5lcm1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhZiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FmJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpZV9GZWJydWFyaWVfTWFhcnRfQXByaWxfTWVpX0p1bmllX0p1bGllX0F1Z3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTXJ0X0Fwcl9NZWlfSnVuX0p1bF9BdWdfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1NvbmRhZ19NYWFuZGFnX0RpbnNkYWdfV29lbnNkYWdfRG9uZGVyZGFnX1ZyeWRhZ19TYXRlcmRhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nvbl9NYWFfRGluX1dvZV9Eb25fVnJ5X1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19NYV9EaV9Xb19Eb19Wcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3ZtfG5tL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9ebm0kL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAndm0nIDogJ1ZNJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnbm0nIDogJ05NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tWYW5kYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTcO0cmUgb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbR2lzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYWFzXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvb3IgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZScsXG4gICAgICAgICAgICBzOiBcIiduIHBhYXIgc2Vrb25kZXNcIixcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kZXMnLFxuICAgICAgICAgICAgbTogXCInbiBtaW51dXRcIixcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlJyxcbiAgICAgICAgICAgIGg6IFwiJ24gdXVyXCIsXG4gICAgICAgICAgICBoaDogJyVkIHVyZScsXG4gICAgICAgICAgICBkOiBcIiduIGRhZ1wiLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWUnLFxuICAgICAgICAgICAgTTogXCInbiBtYWFuZFwiLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGUnLFxuICAgICAgICAgICAgeTogXCInbiBqYWFyXCIsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApOyAvLyBUaGFua3MgdG8gSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qanVwaXRlclxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1hYW5kYWcgaXMgZGllIGVlcnN0ZSBkYWcgdmFuIGRpZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBEaWUgd2VlayB3YXQgZGllIDRkZSBKYW51YXJpZSBiZXZhdCBpcyBkaWUgZWVyc3RlIHdlZWsgdmFuIGRpZSBqYWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFmO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///25177\n")},25382:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/**/\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) keys.push(key);\n return keys;\n};\n/**/\n\nmodule.exports = Duplex;\nvar Readable = __webpack_require__(45412);\nvar Writable = __webpack_require__(16708);\n__webpack_require__(56698)(Duplex, Readable);\n{\n // Allow the keys array to be GC'ed.\n var keys = objectKeys(Writable.prototype);\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n Readable.call(this, options);\n Writable.call(this, options);\n this.allowHalfOpen = true;\n if (options) {\n if (options.readable === false) this.readable = false;\n if (options.writable === false) this.writable = false;\n if (options.allowHalfOpen === false) {\n this.allowHalfOpen = false;\n this.once('end', onend);\n }\n }\n}\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n // If the writable side ended, then we're ok.\n if (this._writableState.ended) return;\n\n // no more data can be written.\n // But allow more writes to happen in this tick.\n process.nextTick(onEndNT, this);\n}\nfunction onEndNT(self) {\n self.end();\n}\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUzODIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcz9iMTlhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikga2V5cy5wdXNoKGtleSk7XG4gIHJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKER1cGxleCwgUmVhZGFibGUpO1xue1xuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG4gIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbiAgfVxufVxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xuICAgIH1cbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlTGVuZ3RoJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gSWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzcy5uZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25382\n")},25540:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n A: () => (/* binding */ _inheritsLoose)\n});\n\n;// ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js\nfunction _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\n\n;// ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\n\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU1NDAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanM/NGZiMSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzP2UwYzAiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSh0LCBvKSB7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgc2V0UHJvdG90eXBlT2YodCwgbyk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHNMb29zZSBhcyBkZWZhdWx0IH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///25540\n")},25765:(I,g,n)=>{"use strict";I.exports=n.p+"c6302cbc175a850d08fb.png"},26111:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : German (Austria) [de-at]\n//! author : lluchs : https://github.com/lluchs\n//! author: Menelion Elensúle: https://github.com/Oire\n//! author : Martin Groller : https://github.com/MadMG\n//! author : Mikolaj Dadela : https://github.com/mik01aj\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n var format = {\n m: ['eine Minute', 'einer Minute'],\n h: ['eine Stunde', 'einer Stunde'],\n d: ['ein Tag', 'einem Tag'],\n dd: [number + ' Tage', number + ' Tagen'],\n w: ['eine Woche', 'einer Woche'],\n M: ['ein Monat', 'einem Monat'],\n MM: [number + ' Monate', number + ' Monaten'],\n y: ['ein Jahr', 'einem Jahr'],\n yy: [number + ' Jahre', number + ' Jahren'],\n };\n return withoutSuffix ? format[key][0] : format[key][1];\n }\n\n var deAt = moment.defineLocale('de-at', {\n months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n '_'\n ),\n monthsShort:\n 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n monthsParseExact: true,\n weekdays:\n 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n '_'\n ),\n weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),\n weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY HH:mm',\n LLLL: 'dddd, D. MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[heute um] LT [Uhr]',\n sameElse: 'L',\n nextDay: '[morgen um] LT [Uhr]',\n nextWeek: 'dddd [um] LT [Uhr]',\n lastDay: '[gestern um] LT [Uhr]',\n lastWeek: '[letzten] dddd [um] LT [Uhr]',\n },\n relativeTime: {\n future: 'in %s',\n past: 'vor %s',\n s: 'ein paar Sekunden',\n ss: '%d Sekunden',\n m: processRelativeTime,\n mm: '%d Minuten',\n h: processRelativeTime,\n hh: '%d Stunden',\n d: processRelativeTime,\n dd: processRelativeTime,\n w: processRelativeTime,\n ww: '%d Wochen',\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return deAt;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxMTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzP2IzZWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoQXVzdHJpYSkgW2RlLWF0XVxuLy8hIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vISBhdXRob3I6IE1lbmVsaW9uIEVsZW5zw7psZTogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBNYXJ0aW4gR3JvbGxlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NYWRNR1xuLy8hIGF1dGhvciA6IE1pa29sYWogRGFkZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL21pazAxYWpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1hdCcsIHtcbiAgICAgICAgbW9udGhzOiAnSsOkbm5lcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKw6RuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUF0O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///26111\n")},26308:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Croatian [hr]\n//! author : Bojan Marković : https://github.com/bmarkovic\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function translate(number, withoutSuffix, key) {\n var result = number + ' ';\n switch (key) {\n case 'ss':\n if (number === 1) {\n result += 'sekunda';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'sekunde';\n } else {\n result += 'sekundi';\n }\n return result;\n case 'm':\n return withoutSuffix ? 'jedna minuta' : 'jedne minute';\n case 'mm':\n if (number === 1) {\n result += 'minuta';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'minute';\n } else {\n result += 'minuta';\n }\n return result;\n case 'h':\n return withoutSuffix ? 'jedan sat' : 'jednog sata';\n case 'hh':\n if (number === 1) {\n result += 'sat';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'sata';\n } else {\n result += 'sati';\n }\n return result;\n case 'dd':\n if (number === 1) {\n result += 'dan';\n } else {\n result += 'dana';\n }\n return result;\n case 'MM':\n if (number === 1) {\n result += 'mjesec';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'mjeseca';\n } else {\n result += 'mjeseci';\n }\n return result;\n case 'yy':\n if (number === 1) {\n result += 'godina';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'godine';\n } else {\n result += 'godina';\n }\n return result;\n }\n }\n\n var hr = moment.defineLocale('hr', {\n months: {\n format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(\n '_'\n ),\n standalone:\n 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(\n '_'\n ),\n },\n monthsShort:\n 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n '_'\n ),\n weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'Do MMMM YYYY',\n LLL: 'Do MMMM YYYY H:mm',\n LLLL: 'dddd, Do MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[danas u] LT',\n nextDay: '[sutra u] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[u] [nedjelju] [u] LT';\n case 3:\n return '[u] [srijedu] [u] LT';\n case 6:\n return '[u] [subotu] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[u] dddd [u] LT';\n }\n },\n lastDay: '[jučer u] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n return '[prošlu] [nedjelju] [u] LT';\n case 3:\n return '[prošlu] [srijedu] [u] LT';\n case 6:\n return '[prošle] [subote] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[prošli] dddd [u] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'prije %s',\n s: 'par sekundi',\n ss: translate,\n m: translate,\n mm: translate,\n h: translate,\n hh: translate,\n d: 'dan',\n dd: translate,\n M: 'mjesec',\n MM: translate,\n y: 'godinu',\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return hr;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzMDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qcz80YmE5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDcm9hdGlhbiBbaHJdXG4vLyEgYXV0aG9yIDogQm9qYW4gTWFya292acSHIDogaHR0cHM6Ly9naXRodWIuY29tL2JtYXJrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkbmEgbWludXRhJyA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkbm9nIHNhdGEnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2EnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHInLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2lqZcSNbmphX3ZlbGphxI1lX2/FvnVqa2FfdHJhdm5qYV9zdmlibmphX2xpcG5qYV9zcnBuamFfa29sb3ZvemFfcnVqbmFfbGlzdG9wYWRhX3N0dWRlbm9nYV9wcm9zaW5jYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2lqZcSNYW5qX3ZlbGphxI1hX2/FvnVqYWtfdHJhdmFual9zdmliYW5qX2xpcGFual9zcnBhbmpfa29sb3Zvel9ydWphbl9saXN0b3BhZF9zdHVkZW5pX3Byb3NpbmFjJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnc2lqLl92ZWxqLl9vxb51Ll90cmEuX3N2aS5fbGlwLl9zcnAuX2tvbC5fcnVqLl9saXMuX3N0dS5fcHJvLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxpXSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHM6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHI7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26308\n")},26435:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : French (Canada) [fr-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var frCa = moment.defineLocale('fr-ca', {\n months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n '_'\n ),\n monthsShort:\n 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Aujourd’hui à] LT',\n nextDay: '[Demain à] LT',\n nextWeek: 'dddd [à] LT',\n lastDay: '[Hier à] LT',\n lastWeek: 'dddd [dernier à] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'dans %s',\n past: 'il y a %s',\n s: 'quelques secondes',\n ss: '%d secondes',\n m: 'une minute',\n mm: '%d minutes',\n h: 'une heure',\n hh: '%d heures',\n d: 'un jour',\n dd: '%d jours',\n M: 'un mois',\n MM: '%d mois',\n y: 'un an',\n yy: '%d ans',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n ordinal: function (number, period) {\n switch (period) {\n // Words with masculine grammatical gender: mois, trimestre, jour\n default:\n case 'M':\n case 'Q':\n case 'D':\n case 'DDD':\n case 'd':\n return number + (number === 1 ? 'er' : 'e');\n\n // Words with feminine grammatical gender: semaine\n case 'w':\n case 'W':\n return number + (number === 1 ? 're' : 'e');\n }\n },\n });\n\n return frCa;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY0MzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzP2Q5ZjgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyZW5jaCAoQ2FuYWRhKSBbZnItY2FdXG4vLyEgYXV0aG9yIDogSm9uYXRoYW4gQWJvdXJiaWggOiBodHRwczovL2dpdGh1Yi5jb20vam9uYmNhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZnJDYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyLWNhJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8ZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyQ2E7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26435\n")},27088:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Kazakh [kk]\n//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var suffixes = {\n 0: '-ші',\n 1: '-ші',\n 2: '-ші',\n 3: '-ші',\n 4: '-ші',\n 5: '-ші',\n 6: '-шы',\n 7: '-ші',\n 8: '-ші',\n 9: '-шы',\n 10: '-шы',\n 20: '-шы',\n 30: '-шы',\n 40: '-шы',\n 50: '-ші',\n 60: '-шы',\n 70: '-ші',\n 80: '-ші',\n 90: '-шы',\n 100: '-ші',\n };\n\n var kk = moment.defineLocale('kk', {\n months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(\n '_'\n ),\n monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),\n weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(\n '_'\n ),\n weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),\n weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Бүгін сағат] LT',\n nextDay: '[Ертең сағат] LT',\n nextWeek: 'dddd [сағат] LT',\n lastDay: '[Кеше сағат] LT',\n lastWeek: '[Өткен аптаның] dddd [сағат] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s ішінде',\n past: '%s бұрын',\n s: 'бірнеше секунд',\n ss: '%d секунд',\n m: 'бір минут',\n mm: '%d минут',\n h: 'бір сағат',\n hh: '%d сағат',\n d: 'бір күн',\n dd: '%d күн',\n M: 'бір ай',\n MM: '%d ай',\n y: 'бір жыл',\n yy: '%d жыл',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-(ші|шы)/,\n ordinal: function (number) {\n var a = number % 10,\n b = number >= 100 ? 100 : null;\n return number + (suffixes[number] || suffixes[a] || suffixes[b]);\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return kk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwODguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzPzZkNzkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEthemFraCBba2tdXG4vLyEgYXV0aG9ycyA6IE51cmxhbiBSYWtoaW16aGFub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbnVybGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YjRlicsXG4gICAgICAgIDE6ICct0YjRlicsXG4gICAgICAgIDI6ICct0YjRlicsXG4gICAgICAgIDM6ICct0YjRlicsXG4gICAgICAgIDQ6ICct0YjRlicsXG4gICAgICAgIDU6ICct0YjRlicsXG4gICAgICAgIDY6ICct0YjRiycsXG4gICAgICAgIDc6ICct0YjRlicsXG4gICAgICAgIDg6ICct0YjRlicsXG4gICAgICAgIDk6ICct0YjRiycsXG4gICAgICAgIDEwOiAnLdGI0YsnLFxuICAgICAgICAyMDogJy3RiNGLJyxcbiAgICAgICAgMzA6ICct0YjRiycsXG4gICAgICAgIDQwOiAnLdGI0YsnLFxuICAgICAgICA1MDogJy3RiNGWJyxcbiAgICAgICAgNjA6ICct0YjRiycsXG4gICAgICAgIDcwOiAnLdGI0ZYnLFxuICAgICAgICA4MDogJy3RiNGWJyxcbiAgICAgICAgOTA6ICct0YjRiycsXG4gICAgICAgIDEwMDogJy3RiNGWJyxcbiAgICB9O1xuXG4gICAgdmFyIGtrID0gbW9tZW50LmRlZmluZUxvY2FsZSgna2snLCB7XG4gICAgICAgIG1vbnRoczogJ9Kb0LDSo9GC0LDRgF/QsNKb0L/QsNC9X9C90LDRg9GA0YvQt1/RgdOZ0YPRltGAX9C80LDQvNGL0YBf0LzQsNGD0YHRi9C8X9GI0ZbQu9C00LVf0YLQsNC80YvQt1/Sm9GL0YDQutKv0LnQtdC6X9Kb0LDQt9Cw0L1f0pvQsNGA0LDRiNCwX9C20LXQu9GC0L7Sm9GB0LDQvScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfSm9Cw0qNf0LDSm9C/X9C90LDRg1/RgdOZ0YNf0LzQsNC8X9C80LDRg1/RiNGW0Ltf0YLQsNC8X9Kb0YvRgF/Sm9Cw0Ldf0pvQsNGAX9C20LXQuycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQttC10LrRgdC10L3QsdGWX9C00q/QudGB0LXQvdCx0ZZf0YHQtdC50YHQtdC90LHRll/RgdOZ0YDRgdC10L3QsdGWX9Cx0LXQudGB0LXQvdCx0ZZf0LbSsdC80LBf0YHQtdC90LHRlicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C20LXQul/QtNKv0Llf0YHQtdC5X9GB05nRgF/QsdC10Llf0LbSsdC8X9GB0LXQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQttC6X9C00Llf0YHQuV/RgdGAX9Cx0Llf0LbQvF/RgdC9Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0q/Qs9GW0L0g0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQldGA0YLQtdKjINGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YjQtSDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNGC0LrQtdC9INCw0L/RgtCw0L3Ri9KjXSBkZGRkIFvRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINGW0YjRltC90LTQtScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LHSsdGA0YvQvScsXG4gICAgICAgICAgICBzOiAn0LHRltGA0L3QtdGI0LUg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06ICfQsdGW0YAg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaDogJ9Cx0ZbRgCDRgdCw0pPQsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQsNKT0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHRltGAINC60q/QvScsXG4gICAgICAgICAgICBkZDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNOiAn0LHRltGAINCw0LknLFxuICAgICAgICAgICAgTU06ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHk6ICfQsdGW0YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LbRi9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRiNGWfNGI0YspLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2s7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///27088\n")},27213:(I,g,n)=>{"use strict";I.exports=n.p+"b98aa226493aabf2efd0.png"},27292:(I,g,n)=>{"use strict";I.exports=n.p+"52407e3727b3a7e2c275.png"},27720:(I,g,n)=>{"use strict";I.exports=n.p+"6c2b58f0aa9538938cd7.png"},27779:(I,g,n)=>{"use strict";I.exports=n.p+"65813c1f494504807a5b.png"},28036:(I,g,n)=>{"use strict";I.exports=n.p+"8006172a7f4c87cec6f5.png"},28089:(I,g,n)=>{"use strict";I.exports=n.p+"d4ce16ccc21409ed14a7.png"},28293:(I,g,n)=>{"use strict";I.exports=n.p+"d61afd7a4b4c6674495f.png"},28298:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (Canada) [en-ca]\n//! author : Jonathan Abourbih : https://github.com/jonbca\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enCa = moment.defineLocale('en-ca', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'YYYY-MM-DD',\n LL: 'MMMM D, YYYY',\n LLL: 'MMMM D, YYYY h:mm A',\n LLLL: 'dddd, MMMM D, YYYY h:mm A',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n });\n\n return enCa;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgyOTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzPzM4ODYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKENhbmFkYSkgW2VuLWNhXVxuLy8hIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1jYScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuQ2E7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///28298\n")},28328:(I,g,n)=>{"use strict";I.exports=n.p+"38e0051eca6ee94d05f3.png"},28633:(I,g,n)=>{"use strict";I.exports=n.p+"8c6c1458f9c6b07d7ae8.png"},28959:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Belarusian [be]\n//! author : Dmitry Demidov : https://github.com/demidov91\n//! author: Praleska: http://praleska.pro/\n//! Author : Menelion Elensúle : https://github.com/Oire\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function plural(word, num) {\n var forms = word.split('_');\n return num % 10 === 1 && num % 100 !== 11\n ? forms[0]\n : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)\n ? forms[1]\n : forms[2];\n }\n function relativeTimeWithPlural(number, withoutSuffix, key) {\n var format = {\n ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',\n mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',\n hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',\n dd: 'дзень_дні_дзён',\n MM: 'месяц_месяцы_месяцаў',\n yy: 'год_гады_гадоў',\n };\n if (key === 'm') {\n return withoutSuffix ? 'хвіліна' : 'хвіліну';\n } else if (key === 'h') {\n return withoutSuffix ? 'гадзіна' : 'гадзіну';\n } else {\n return number + ' ' + plural(format[key], +number);\n }\n }\n\n var be = moment.defineLocale('be', {\n months: {\n format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(\n '_'\n ),\n standalone:\n 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(\n '_'\n ),\n },\n monthsShort:\n 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),\n weekdays: {\n format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(\n '_'\n ),\n standalone:\n 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(\n '_'\n ),\n isFormat: /\\[ ?[Ууў] ?(?:мінулую|наступную)? ?\\] ?dddd/,\n },\n weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY г.',\n LLL: 'D MMMM YYYY г., HH:mm',\n LLLL: 'dddd, D MMMM YYYY г., HH:mm',\n },\n calendar: {\n sameDay: '[Сёння ў] LT',\n nextDay: '[Заўтра ў] LT',\n lastDay: '[Учора ў] LT',\n nextWeek: function () {\n return '[У] dddd [ў] LT';\n },\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n case 3:\n case 5:\n case 6:\n return '[У мінулую] dddd [ў] LT';\n case 1:\n case 2:\n case 4:\n return '[У мінулы] dddd [ў] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'праз %s',\n past: '%s таму',\n s: 'некалькі секунд',\n m: relativeTimeWithPlural,\n mm: relativeTimeWithPlural,\n h: relativeTimeWithPlural,\n hh: relativeTimeWithPlural,\n d: 'дзень',\n dd: relativeTimeWithPlural,\n M: 'месяц',\n MM: relativeTimeWithPlural,\n y: 'год',\n yy: relativeTimeWithPlural,\n },\n meridiemParse: /ночы|раніцы|дня|вечара/,\n isPM: function (input) {\n return /^(дня|вечара)$/.test(input);\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'ночы';\n } else if (hour < 12) {\n return 'раніцы';\n } else if (hour < 17) {\n return 'дня';\n } else {\n return 'вечара';\n }\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-(і|ы|га)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'M':\n case 'd':\n case 'DDD':\n case 'w':\n case 'W':\n return (number % 10 === 2 || number % 10 === 3) &&\n number % 100 !== 12 &&\n number % 100 !== 13\n ? number + '-і'\n : number + '-ы';\n case 'D':\n return number + '-га';\n default:\n return number;\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return be;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg5NTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzPzFmYzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbGFydXNpYW4gW2JlXVxuLy8hIGF1dGhvciA6IERtaXRyeSBEZW1pZG92IDogaHR0cHM6Ly9naXRodWIuY29tL2RlbWlkb3Y5MVxuLy8hIGF1dGhvcjogUHJhbGVza2E6IGh0dHA6Ly9wcmFsZXNrYS5wcm8vXG4vLyEgQXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsF/RhdCy0ZbQu9GW0L3Ri1/RhdCy0ZbQu9GW0L0nIDogJ9GF0LLRltC70ZbQvdGDX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScsXG4gICAgICAgICAgICBoaDogd2l0aG91dFN1ZmZpeCA/ICfQs9Cw0LTQt9GW0L3QsF/Qs9Cw0LTQt9GW0L3Ri1/Qs9Cw0LTQt9GW0L0nIDogJ9Cz0LDQtNC30ZbQvdGDX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScsXG4gICAgICAgICAgICBkZDogJ9C00LfQtdC90Yxf0LTQvdGWX9C00LfRkdC9JyxcbiAgICAgICAgICAgIE1NOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0Ytf0LzQtdGB0Y/RhtCw0Z4nLFxuICAgICAgICAgICAgeXk6ICfQs9C+0LRf0LPQsNC00Ytf0LPQsNC00L7RnicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstGW0LvRltC90LAnIDogJ9GF0LLRltC70ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LAnIDogJ9Cz0LDQtNC30ZbQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmUnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRgtGD0LTQt9C10L3Rj1/Qu9GO0YLQsNCz0LBf0YHQsNC60LDQstGW0LrQsF/QutGA0LDRgdCw0LLRltC60LBf0YLRgNCw0Z7QvdGPX9GH0Y3RgNCy0LXQvdGPX9C70ZbQv9C10L3Rj1/QttC90ZbRntC90Y9f0LLQtdGA0LDRgdC90Y9f0LrQsNGB0YLRgNGL0YfQvdGW0LrQsF/Qu9GW0YHRgtCw0L/QsNC00LBf0YHQvdC10LbQvdGPJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRgdGC0YPQtNC30LXQvdGMX9C70Y7RgtGLX9GB0LDQutCw0LLRltC6X9C60YDQsNGB0LDQstGW0Lpf0YLRgNCw0LLQtdC90Yxf0YfRjdGA0LLQtdC90Yxf0LvRltC/0LXQvdGMX9C20L3RltCy0LXQvdGMX9Cy0LXRgNCw0YHQtdC90Yxf0LrQsNGB0YLRgNGL0YfQvdGW0Lpf0LvRltGB0YLQsNC/0LDQtF/RgdC90LXQttCw0L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9GB0YLRg9C0X9C70Y7Rgl/RgdCw0Lpf0LrRgNCw0YFf0YLRgNCw0LJf0YfRjdGA0LJf0LvRltC/X9C20L3RltCyX9Cy0LXRgF/QutCw0YHRgl/Qu9GW0YHRgl/RgdC90LXQticuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9C90Y/QtNC30LXQu9GOX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTRg1/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0YNf0YHRg9Cx0L7RgtGDJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfQvdGP0LTQt9C10LvRj1/Qv9Cw0L3Rj9C00LfQtdC70LDQul/QsNGe0YLQvtGA0LDQul/RgdC10YDQsNC00LBf0YfQsNGG0LLQtdGAX9C/0Y/RgtC90ZbRhtCwX9GB0YPQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9Cj0YPRnl0gPyg/OtC80ZbQvdGD0LvRg9GOfNC90LDRgdGC0YPQv9C90YPRjik/ID9cXF0gP2RkZGQvLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LDRgl/RgdGAX9GH0YZf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSDQsy4sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHRkdC90L3RjyDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0Z7RgtGA0LAg0Z5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0KPRh9C+0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vQo10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQoyDQvNGW0L3Rg9C70YPRjl0gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRi10gZGRkZCBb0Z5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQv9GA0LDQtyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQsNC80YMnLFxuICAgICAgICAgICAgczogJ9C90LXQutCw0LvRjNC60ZYg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC30LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ9C80LXRgdGP0YYnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0Yt80YDQsNC90ZbRhtGLfNC00L3Rj3zQstC10YfQsNGA0LAvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LDRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRiyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90ZbRhtGLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9Cw0YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0ZZ80Yt80LPQsCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudW1iZXIgJSAxMCA9PT0gMiB8fCBudW1iZXIgJSAxMCA9PT0gMykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciAlIDEwMCAhPT0gMTNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbnVtYmVyICsgJy3RlidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyICsgJy3Riyc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0LAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBiZTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///28959\n")},29137:module=>{"use strict";eval('\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkxMzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/ZDkyNSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///29137\n')},29231:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Tagalog (Philippines) [tl-ph]\n//! author : Dan Hagman : https://github.com/hagmandan\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var tlPh = moment.defineLocale('tl-ph', {\n months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(\n '_'\n ),\n monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),\n weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(\n '_'\n ),\n weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),\n weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'MM/D/YYYY',\n LL: 'MMMM D, YYYY',\n LLL: 'MMMM D, YYYY HH:mm',\n LLLL: 'dddd, MMMM DD, YYYY HH:mm',\n },\n calendar: {\n sameDay: 'LT [ngayong araw]',\n nextDay: '[Bukas ng] LT',\n nextWeek: 'LT [sa susunod na] dddd',\n lastDay: 'LT [kahapon]',\n lastWeek: 'LT [noong nakaraang] dddd',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'sa loob ng %s',\n past: '%s ang nakalipas',\n s: 'ilang segundo',\n ss: '%d segundo',\n m: 'isang minuto',\n mm: '%d minuto',\n h: 'isang oras',\n hh: '%d oras',\n d: 'isang araw',\n dd: '%d araw',\n M: 'isang buwan',\n MM: '%d buwan',\n y: 'isang taon',\n yy: '%d taon',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}/,\n ordinal: function (number) {\n return number;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return tlPh;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkyMzEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qcz8wZjM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYWdhbG9nIChQaGlsaXBwaW5lcykgW3RsLXBoXVxuLy8hIGF1dGhvciA6IERhbiBIYWdtYW4gOiBodHRwczovL2dpdGh1Yi5jb20vaGFnbWFuZGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGxQaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RsLXBoJywge1xuICAgICAgICBtb250aHM6ICdFbmVyb19QZWJyZXJvX01hcnNvX0FicmlsX01heW9fSHVueW9fSHVseW9fQWdvc3RvX1NldHllbWJyZV9Pa3R1YnJlX05vYnllbWJyZV9EaXN5ZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnRW5lX1BlYl9NYXJfQWJyX01heV9IdW5fSHVsX0Fnb19TZXRfT2t0X05vYl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTGluZ2dvX0x1bmVzX01hcnRlc19NaXllcmt1bGVzX0h1d2ViZXNfQml5ZXJuZXNfU2FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGluX0x1bl9NYXJfTWl5X0h1d19CaXlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX0x1X01hX01pX0h1X0JpX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ01NL0QvWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gREQsIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ0xUIFtuZ2F5b25nIGFyYXddJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQnVrYXMgbmddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTFQgW3NhIHN1c3Vub2QgbmFdIGRkZGQnLFxuICAgICAgICAgICAgbGFzdERheTogJ0xUIFtrYWhhcG9uXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ0xUIFtub29uZyBuYWthcmFhbmddIGRkZGQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdzYSBsb29iIG5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhbmcgbmFrYWxpcGFzJyxcbiAgICAgICAgICAgIHM6ICdpbGFuZyBzZWd1bmRvJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnaXNhbmcgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvJyxcbiAgICAgICAgICAgIGg6ICdpc2FuZyBvcmFzJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAnaXNhbmcgYXJhdycsXG4gICAgICAgICAgICBkZDogJyVkIGFyYXcnLFxuICAgICAgICAgICAgTTogJ2lzYW5nIGJ1d2FuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnV3YW4nLFxuICAgICAgICAgICAgeTogJ2lzYW5nIHRhb24nLFxuICAgICAgICAgICAgeXk6ICclZCB0YW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRsUGg7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29231\n")},29347:(I,g,n)=>{"use strict";I.exports=n.p+"20bdec0003717470bf4d.png"},29849:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Punjabi (India) [pa-in]\n//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '੧',\n 2: '੨',\n 3: '੩',\n 4: '੪',\n 5: '੫',\n 6: '੬',\n 7: '੭',\n 8: '੮',\n 9: '੯',\n 0: '੦',\n },\n numberMap = {\n '੧': '1',\n '੨': '2',\n '੩': '3',\n '੪': '4',\n '੫': '5',\n '੬': '6',\n '੭': '7',\n '੮': '8',\n '੯': '9',\n '੦': '0',\n };\n\n var paIn = moment.defineLocale('pa-in', {\n // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.\n months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n '_'\n ),\n monthsShort:\n 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(\n '_'\n ),\n weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(\n '_'\n ),\n weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),\n longDateFormat: {\n LT: 'A h:mm ਵਜੇ',\n LTS: 'A h:mm:ss ਵਜੇ',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',\n LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',\n },\n calendar: {\n sameDay: '[ਅਜ] LT',\n nextDay: '[ਕਲ] LT',\n nextWeek: '[ਅਗਲਾ] dddd, LT',\n lastDay: '[ਕਲ] LT',\n lastWeek: '[ਪਿਛਲੇ] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s ਵਿੱਚ',\n past: '%s ਪਿਛਲੇ',\n s: 'ਕੁਝ ਸਕਿੰਟ',\n ss: '%d ਸਕਿੰਟ',\n m: 'ਇਕ ਮਿੰਟ',\n mm: '%d ਮਿੰਟ',\n h: 'ਇੱਕ ਘੰਟਾ',\n hh: '%d ਘੰਟੇ',\n d: 'ਇੱਕ ਦਿਨ',\n dd: '%d ਦਿਨ',\n M: 'ਇੱਕ ਮਹੀਨਾ',\n MM: '%d ਮਹੀਨੇ',\n y: 'ਇੱਕ ਸਾਲ',\n yy: '%d ਸਾਲ',\n },\n preparse: function (string) {\n return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n // Punjabi notation for meridiems are quite fuzzy in practice. While there exists\n // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.\n meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'ਰਾਤ') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'ਸਵੇਰ') {\n return hour;\n } else if (meridiem === 'ਦੁਪਹਿਰ') {\n return hour >= 10 ? hour : hour + 12;\n } else if (meridiem === 'ਸ਼ਾਮ') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'ਰਾਤ';\n } else if (hour < 10) {\n return 'ਸਵੇਰ';\n } else if (hour < 17) {\n return 'ਦੁਪਹਿਰ';\n } else if (hour < 20) {\n return 'ਸ਼ਾਮ';\n } else {\n return 'ਰਾਤ';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return paIn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk4NDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanM/ZjNmZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUHVuamFiaSAoSW5kaWEpIFtwYS1pbl1cbi8vISBhdXRob3IgOiBIYXJwcmVldCBTaW5naCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJwcmVldGtoYWxzYWd0Yml0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CppycsXG4gICAgICAgICAgICAyOiAn4KmoJyxcbiAgICAgICAgICAgIDM6ICfgqaknLFxuICAgICAgICAgICAgNDogJ+CpqicsXG4gICAgICAgICAgICA1OiAn4KmrJyxcbiAgICAgICAgICAgIDY6ICfgqawnLFxuICAgICAgICAgICAgNzogJ+CprScsXG4gICAgICAgICAgICA4OiAn4KmuJyxcbiAgICAgICAgICAgIDk6ICfgqa8nLFxuICAgICAgICAgICAgMDogJ+CppicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgqacnOiAnMScsXG4gICAgICAgICAgICAn4KmoJzogJzInLFxuICAgICAgICAgICAgJ+CpqSc6ICczJyxcbiAgICAgICAgICAgICfgqaonOiAnNCcsXG4gICAgICAgICAgICAn4KmrJzogJzUnLFxuICAgICAgICAgICAgJ+CprCc6ICc2JyxcbiAgICAgICAgICAgICfgqa0nOiAnNycsXG4gICAgICAgICAgICAn4KmuJzogJzgnLFxuICAgICAgICAgICAgJ+Cpryc6ICc5JyxcbiAgICAgICAgICAgICfgqaYnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgcGFJbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3BhLWluJywge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbW9udGhzIG5hbWUgYXMgcGVyIE5hbmFrc2hhaGkgQ2FsZW5kYXIgYnV0IHRoZXkgYXJlIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIFB1bmphYmkuXG4gICAgICAgIG1vbnRoczogJ+ConOCoqOCoteCosOCpgF/gqKvgqLzgqLDgqLXgqLDgqYBf4Kiu4Ki+4Kiw4KiaX+CoheCoquCpjeCosOCpiOCosl/gqK7gqIhf4Kic4KmC4KioX+ConOCpgeCosuCovuCoiF/gqIXgqJfgqLjgqKRf4Ki44Kik4Kmw4Kis4KiwX+CoheColeCopOCpguCorOCosF/gqKjgqLXgqbDgqKzgqLBf4Kim4Ki44Kmw4Kis4KiwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgqJzgqKjgqLXgqLDgqYBf4Kir4Ki84Kiw4Ki14Kiw4KmAX+CoruCovuCosOComl/gqIXgqKrgqY3gqLDgqYjgqLJf4Kiu4KiIX+ConOCpguCoqF/gqJzgqYHgqLLgqL7gqIhf4KiF4KiX4Ki44KikX+CouOCopOCpsOCorOCosF/gqIXgqJXgqKTgqYLgqKzgqLBf4Kio4Ki14Kmw4Kis4KiwX+CopuCouOCpsOCorOCosCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CokOCopOCoteCovuCosF/gqLjgqYvgqK7gqLXgqL7gqLBf4Kiu4Kmw4KiX4Kiy4Ki14Ki+4KiwX+CorOCpgeCop+CoteCovuCosF/gqLXgqYDgqLDgqLXgqL7gqLBf4Ki44Ki84KmB4Kmx4KiV4Kiw4Ki14Ki+4KiwX+CouOCovOCoqOCpgOComuCosOCoteCovuCosCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CokOCopF/gqLjgqYvgqK5f4Kiu4Kmw4KiX4KiyX+CorOCpgeCop1/gqLXgqYDgqLBf4Ki44Ki84KmB4KiV4KiwX+CouOCovOCoqOCpgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgqJDgqKRf4Ki44KmL4KiuX+CoruCpsOCol+Cosl/gqKzgqYHgqKdf4Ki14KmA4KiwX+CouOCovOCpgeColeCosF/gqLjgqLzgqKjgqYAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCoteConOCphycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCoteConOCphycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CoheConF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgqJXgqLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+CoheCol+CosuCovl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgqJXgqLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CoquCov+Com+CosuCph10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgqLXgqL/gqbHgqJonLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCoquCov+Com+CosuCphycsXG4gICAgICAgICAgICBzOiAn4KiV4KmB4KidIOCouOColeCov+CpsOConycsXG4gICAgICAgICAgICBzczogJyVkIOCouOColeCov+CpsOConycsXG4gICAgICAgICAgICBtOiAn4KiH4KiVIOCoruCov+CpsOConycsXG4gICAgICAgICAgICBtbTogJyVkIOCoruCov+CpsOConycsXG4gICAgICAgICAgICBoOiAn4KiH4Kmx4KiVIOComOCpsOCon+CovicsXG4gICAgICAgICAgICBoaDogJyVkIOComOCpsOCon+CphycsXG4gICAgICAgICAgICBkOiAn4KiH4Kmx4KiVIOCopuCov+CoqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCopuCov+CoqCcsXG4gICAgICAgICAgICBNOiAn4KiH4Kmx4KiVIOCoruCoueCpgOCoqOCovicsXG4gICAgICAgICAgICBNTTogJyVkIOCoruCoueCpgOCoqOCphycsXG4gICAgICAgICAgICB5OiAn4KiH4Kmx4KiVIOCouOCovuCosicsXG4gICAgICAgICAgICB5eTogJyVkIOCouOCovuCosicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgqafgqajgqangqargqavgqazgqa3gqa7gqa/gqaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFB1bmphYmkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CosOCovuCopHzgqLjgqLXgqYfgqLB84Kim4KmB4Kiq4Ki54Ki/4KiwfOCouOCovOCovuCori8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CosOCovuCopCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CouOCoteCph+CosCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqKbgqYHgqKrgqLngqL/gqLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CouOCovOCovuCoricpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLDgqL7gqKQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CouOCoteCph+CosCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kim4KmB4Kiq4Ki54Ki/4KiwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLjgqLzgqL7gqK4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CosOCovuCopCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwYUluO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///29849\n")},30117:(I,g,n)=>{"use strict";I.exports=n.p+"41a066cd6f823dddff87.png"},30306:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Macedonian [mk]\n//! author : Borislav Mickov : https://github.com/B0k0\n//! author : Sashko Todorov : https://github.com/bkyceh\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var mk = moment.defineLocale('mk', {\n months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(\n '_'\n ),\n monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),\n weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(\n '_'\n ),\n weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),\n weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'D.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY H:mm',\n LLLL: 'dddd, D MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[Денес во] LT',\n nextDay: '[Утре во] LT',\n nextWeek: '[Во] dddd [во] LT',\n lastDay: '[Вчера во] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n case 3:\n case 6:\n return '[Изминатата] dddd [во] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[Изминатиот] dddd [во] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'за %s',\n past: 'пред %s',\n s: 'неколку секунди',\n ss: '%d секунди',\n m: 'една минута',\n mm: '%d минути',\n h: 'еден час',\n hh: '%d часа',\n d: 'еден ден',\n dd: '%d дена',\n M: 'еден месец',\n MM: '%d месеци',\n y: 'една година',\n yy: '%d години',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n ordinal: function (number) {\n var lastDigit = number % 10,\n last2Digits = number % 100;\n if (number === 0) {\n return number + '-ев';\n } else if (last2Digits === 0) {\n return number + '-ен';\n } else if (last2Digits > 10 && last2Digits < 20) {\n return number + '-ти';\n } else if (lastDigit === 1) {\n return number + '-ви';\n } else if (lastDigit === 2) {\n return number + '-ри';\n } else if (lastDigit === 7 || lastDigit === 8) {\n return number + '-ми';\n } else {\n return number + '-ти';\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return mk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAzMDYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanM/NjkwOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFjZWRvbmlhbiBbbWtdXG4vLyEgYXV0aG9yIDogQm9yaXNsYXYgTWlja292IDogaHR0cHM6Ly9naXRodWIuY29tL0IwazBcbi8vISBhdXRob3IgOiBTYXNoa28gVG9kb3JvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ia3ljZWhcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21rJywge1xuICAgICAgICBtb250aHM6ICfRmNCw0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNGYX9GY0YPQvdC4X9GY0YPQu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GY0LDQvV/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvQsF/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtC+0Lpf0L/QtdGC0L7Qul/RgdCw0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LRf0L/QvtC9X9Cy0YLQvl/RgdGA0LVf0YfQtdGCX9C/0LXRgl/RgdCw0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L1lX9C/b1/QstGCX9GB0YBf0YfQtV/Qv9C1X9GBYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JTQtdC90LXRgSDQstC+XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cj0YLRgNC1INCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9CS0L5dIGRkZGQgW9Cy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JLRh9C10YDQsCDQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQsNGC0LBdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQuNC+0YJdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LXQtCAlcycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60L7Qu9C60YMg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtOiAn0LXQtNC90LAg0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGg6ICfQtdC00LXQvSDRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkOiAn0LXQtNC10L0g0LTQtdC9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LTQtdC90LAnLFxuICAgICAgICAgICAgTTogJ9C10LTQtdC9INC80LXRgdC10YYnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC10YHQtdGG0LgnLFxuICAgICAgICAgICAgeTogJ9C10LTQvdCwINCz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eTogJyVkINCz0L7QtNC40L3QuCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWs7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30306\n")},30448:(I,g,n)=>{"use strict";I.exports=n.p+"a1201a1462fed15d2375.png"},30753:(I,g,n)=>{"use strict";I.exports=n.p+"0cd7e0af2d6d9d57613a.png"},30876:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n BrowserRouter: () => (/* binding */ BrowserRouter),\n HashRouter: () => (/* binding */ HashRouter),\n Link: () => (/* binding */ Link),\n MemoryRouter: () => (/* reexport */ MemoryRouter),\n NavLink: () => (/* binding */ NavLink),\n Prompt: () => (/* reexport */ Prompt),\n Redirect: () => (/* reexport */ Redirect),\n Route: () => (/* reexport */ Route),\n Router: () => (/* reexport */ Router),\n StaticRouter: () => (/* reexport */ StaticRouter),\n Switch: () => (/* reexport */ Switch),\n generatePath: () => (/* reexport */ generatePath),\n matchPath: () => (/* reexport */ matchPath),\n useHistory: () => (/* reexport */ useHistory),\n useLocation: () => (/* reexport */ useLocation),\n useParams: () => (/* reexport */ useParams),\n useRouteMatch: () => (/* reexport */ useRouteMatch),\n withRouter: () => (/* reexport */ withRouter)\n});\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js + 1 modules\nvar inheritsLoose = __webpack_require__(25540);\n// EXTERNAL MODULE: consume shared module (default) react@^17.0.2 (singleton) (fallback: ./node_modules/react/index.js) (eager)\nvar index_js_eager_ = __webpack_require__(24002);\nvar index_js_eager_default = /*#__PURE__*/__webpack_require__.n(index_js_eager_);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5556);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\nvar esm_extends = __webpack_require__(58168);\n;// ./node_modules/resolve-pathname/esm/resolve-pathname.js\nfunction isAbsolute(pathname) {\n return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n list[i] = list[k];\n }\n\n list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n if (from === undefined) from = '';\n\n var toParts = (to && to.split('/')) || [];\n var fromParts = (from && from.split('/')) || [];\n\n var isToAbs = to && isAbsolute(to);\n var isFromAbs = from && isAbsolute(from);\n var mustEndAbs = isToAbs || isFromAbs;\n\n if (to && isAbsolute(to)) {\n // to is absolute\n fromParts = toParts;\n } else if (toParts.length) {\n // to is relative, drop the filename\n fromParts.pop();\n fromParts = fromParts.concat(toParts);\n }\n\n if (!fromParts.length) return '/';\n\n var hasTrailingSlash;\n if (fromParts.length) {\n var last = fromParts[fromParts.length - 1];\n hasTrailingSlash = last === '.' || last === '..' || last === '';\n } else {\n hasTrailingSlash = false;\n }\n\n var up = 0;\n for (var i = fromParts.length; i >= 0; i--) {\n var part = fromParts[i];\n\n if (part === '.') {\n spliceOne(fromParts, i);\n } else if (part === '..') {\n spliceOne(fromParts, i);\n up++;\n } else if (up) {\n spliceOne(fromParts, i);\n up--;\n }\n }\n\n if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n if (\n mustEndAbs &&\n fromParts[0] !== '' &&\n (!fromParts[0] || !isAbsolute(fromParts[0]))\n )\n fromParts.unshift('');\n\n var result = fromParts.join('/');\n\n if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n return result;\n}\n\n/* harmony default export */ const resolve_pathname = (resolvePathname);\n\n;// ./node_modules/value-equal/esm/value-equal.js\nfunction value_equal_valueOf(obj) {\n return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n // Test for strict equality first.\n if (a === b) return true;\n\n // Otherwise, if either of them == null they are not equal.\n if (a == null || b == null) return false;\n\n if (Array.isArray(a)) {\n return (\n Array.isArray(b) &&\n a.length === b.length &&\n a.every(function(item, index) {\n return valueEqual(item, b[index]);\n })\n );\n }\n\n if (typeof a === 'object' || typeof b === 'object') {\n var aValue = value_equal_valueOf(a);\n var bValue = value_equal_valueOf(b);\n\n if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n return Object.keys(Object.assign({}, a, b)).every(function(key) {\n return valueEqual(a[key], b[key]);\n });\n }\n\n return false;\n}\n\n/* harmony default export */ const value_equal = (valueEqual);\n\n;// ./node_modules/tiny-invariant/dist/esm/tiny-invariant.js\nvar isProduction = \"production\" === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\n\n\n;// ./node_modules/history/esm/history.js\n\n\n\n\n\n\nfunction addLeadingSlash(path) {\n return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n var pathname = path || '/';\n var search = '';\n var hash = '';\n var hashIndex = pathname.indexOf('#');\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf('?');\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === '?' ? '' : search,\n hash: hash === '#' ? '' : hash\n };\n}\nfunction createPath(location) {\n var pathname = location.pathname,\n search = location.search,\n hash = location.hash;\n var path = pathname || '/';\n if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n var location;\n\n if (typeof path === 'string') {\n // Two-arg form: push(path, state)\n location = parsePath(path);\n location.state = state;\n } else {\n // One-arg form: push(location)\n location = (0,esm_extends/* default */.A)({}, path);\n if (location.pathname === undefined) location.pathname = '';\n\n if (location.search) {\n if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n } else {\n location.search = '';\n }\n\n if (location.hash) {\n if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n } else {\n location.hash = '';\n }\n\n if (state !== undefined && location.state === undefined) location.state = state;\n }\n\n try {\n location.pathname = decodeURI(location.pathname);\n } catch (e) {\n if (e instanceof URIError) {\n throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n } else {\n throw e;\n }\n }\n\n if (key) location.key = key;\n\n if (currentLocation) {\n // Resolve incomplete/relative pathname relative to current location.\n if (!location.pathname) {\n location.pathname = currentLocation.pathname;\n } else if (location.pathname.charAt(0) !== '/') {\n location.pathname = resolve_pathname(location.pathname, currentLocation.pathname);\n }\n } else {\n // When there is no prior location and pathname is empty, set it to /\n if (!location.pathname) {\n location.pathname = '/';\n }\n }\n\n return location;\n}\nfunction locationsAreEqual(a, b) {\n return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && value_equal(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n var prompt = null;\n\n function setPrompt(nextPrompt) {\n false ? 0 : void 0;\n prompt = nextPrompt;\n return function () {\n if (prompt === nextPrompt) prompt = null;\n };\n }\n\n function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n // TODO: If another transition starts while we're still confirming\n // the previous one, we may end up in a weird state. Figure out the\n // best way to handle this.\n if (prompt != null) {\n var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n if (typeof result === 'string') {\n if (typeof getUserConfirmation === 'function') {\n getUserConfirmation(result, callback);\n } else {\n false ? 0 : void 0;\n callback(true);\n }\n } else {\n // Return false from a transition hook to cancel the transition.\n callback(result !== false);\n }\n } else {\n callback(true);\n }\n }\n\n var listeners = [];\n\n function appendListener(fn) {\n var isActive = true;\n\n function listener() {\n if (isActive) fn.apply(void 0, arguments);\n }\n\n listeners.push(listener);\n return function () {\n isActive = false;\n listeners = listeners.filter(function (item) {\n return item !== listener;\n });\n };\n }\n\n function notifyListeners() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n listeners.forEach(function (listener) {\n return listener.apply(void 0, args);\n });\n }\n\n return {\n setPrompt: setPrompt,\n confirmTransitionTo: confirmTransitionTo,\n appendListener: appendListener,\n notifyListeners: notifyListeners\n };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n var ua = window.navigator.userAgent;\n if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n try {\n return window.history.state || {};\n } catch (e) {\n // IE 11 sometimes throws when accessing window.history.state\n // See https://github.com/ReactTraining/history/pull/289\n return {};\n }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n !canUseDOM ? false ? 0 : invariant(false) : void 0;\n var globalHistory = window.history;\n var canUseHistory = supportsHistory();\n var needsHashChangeListener = !supportsPopStateOnHashChange();\n var _props = props,\n _props$forceRefresh = _props.forceRefresh,\n forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n _props$getUserConfirm = _props.getUserConfirmation,\n getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n _props$keyLength = _props.keyLength,\n keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n function getDOMLocation(historyState) {\n var _ref = historyState || {},\n key = _ref.key,\n state = _ref.state;\n\n var _window$location = window.location,\n pathname = _window$location.pathname,\n search = _window$location.search,\n hash = _window$location.hash;\n var path = pathname + search + hash;\n false ? 0 : void 0;\n if (basename) path = stripBasename(path, basename);\n return createLocation(path, state, key);\n }\n\n function createKey() {\n return Math.random().toString(36).substr(2, keyLength);\n }\n\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n (0,esm_extends/* default */.A)(history, nextState);\n\n history.length = globalHistory.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n function handlePopState(event) {\n // Ignore extraneous popstate events in WebKit.\n if (isExtraneousPopstateEvent(event)) return;\n handlePop(getDOMLocation(event.state));\n }\n\n function handleHashChange() {\n handlePop(getDOMLocation(getHistoryState()));\n }\n\n var forceNextPop = false;\n\n function handlePop(location) {\n if (forceNextPop) {\n forceNextPop = false;\n setState();\n } else {\n var action = 'POP';\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location\n });\n } else {\n revertPop(location);\n }\n });\n }\n }\n\n function revertPop(fromLocation) {\n var toLocation = history.location; // TODO: We could probably make this more reliable by\n // keeping a list of keys we've seen in sessionStorage.\n // Instead, we just default to 0 for keys we don't know.\n\n var toIndex = allKeys.indexOf(toLocation.key);\n if (toIndex === -1) toIndex = 0;\n var fromIndex = allKeys.indexOf(fromLocation.key);\n if (fromIndex === -1) fromIndex = 0;\n var delta = toIndex - fromIndex;\n\n if (delta) {\n forceNextPop = true;\n go(delta);\n }\n }\n\n var initialLocation = getDOMLocation(getHistoryState());\n var allKeys = [initialLocation.key]; // Public interface\n\n function createHref(location) {\n return basename + createPath(location);\n }\n\n function push(path, state) {\n false ? 0 : void 0;\n var action = 'PUSH';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var href = createHref(location);\n var key = location.key,\n state = location.state;\n\n if (canUseHistory) {\n globalHistory.pushState({\n key: key,\n state: state\n }, null, href);\n\n if (forceRefresh) {\n window.location.href = href;\n } else {\n var prevIndex = allKeys.indexOf(history.location.key);\n var nextKeys = allKeys.slice(0, prevIndex + 1);\n nextKeys.push(location.key);\n allKeys = nextKeys;\n setState({\n action: action,\n location: location\n });\n }\n } else {\n false ? 0 : void 0;\n window.location.href = href;\n }\n });\n }\n\n function replace(path, state) {\n false ? 0 : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var href = createHref(location);\n var key = location.key,\n state = location.state;\n\n if (canUseHistory) {\n globalHistory.replaceState({\n key: key,\n state: state\n }, null, href);\n\n if (forceRefresh) {\n window.location.replace(href);\n } else {\n var prevIndex = allKeys.indexOf(history.location.key);\n if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n setState({\n action: action,\n location: location\n });\n }\n } else {\n false ? 0 : void 0;\n window.location.replace(href);\n }\n });\n }\n\n function go(n) {\n globalHistory.go(n);\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n var listenerCount = 0;\n\n function checkDOMListeners(delta) {\n listenerCount += delta;\n\n if (listenerCount === 1 && delta === 1) {\n window.addEventListener(PopStateEvent, handlePopState);\n if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n } else if (listenerCount === 0) {\n window.removeEventListener(PopStateEvent, handlePopState);\n if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n }\n }\n\n var isBlocked = false;\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n var unblock = transitionManager.setPrompt(prompt);\n\n if (!isBlocked) {\n checkDOMListeners(1);\n isBlocked = true;\n }\n\n return function () {\n if (isBlocked) {\n isBlocked = false;\n checkDOMListeners(-1);\n }\n\n return unblock();\n };\n }\n\n function listen(listener) {\n var unlisten = transitionManager.appendListener(listener);\n checkDOMListeners(1);\n return function () {\n checkDOMListeners(-1);\n unlisten();\n };\n }\n\n var history = {\n length: globalHistory.length,\n action: 'POP',\n location: initialLocation,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n block: block,\n listen: listen\n };\n return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n hashbang: {\n encodePath: function encodePath(path) {\n return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n },\n decodePath: function decodePath(path) {\n return path.charAt(0) === '!' ? path.substr(1) : path;\n }\n },\n noslash: {\n encodePath: stripLeadingSlash,\n decodePath: addLeadingSlash\n },\n slash: {\n encodePath: addLeadingSlash,\n decodePath: addLeadingSlash\n }\n};\n\nfunction stripHash(url) {\n var hashIndex = url.indexOf('#');\n return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n // We can't use window.location.hash here because it's not\n // consistent across browsers - Firefox will pre-decode it!\n var href = window.location.href;\n var hashIndex = href.indexOf('#');\n return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n !canUseDOM ? false ? 0 : invariant(false) : void 0;\n var globalHistory = window.history;\n var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n var _props = props,\n _props$getUserConfirm = _props.getUserConfirmation,\n getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n _props$hashType = _props.hashType,\n hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n var _HashPathCoders$hashT = HashPathCoders[hashType],\n encodePath = _HashPathCoders$hashT.encodePath,\n decodePath = _HashPathCoders$hashT.decodePath;\n\n function getDOMLocation() {\n var path = decodePath(getHashPath());\n false ? 0 : void 0;\n if (basename) path = stripBasename(path, basename);\n return createLocation(path);\n }\n\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n (0,esm_extends/* default */.A)(history, nextState);\n\n history.length = globalHistory.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n var forceNextPop = false;\n var ignorePath = null;\n\n function locationsAreEqual$$1(a, b) {\n return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n }\n\n function handleHashChange() {\n var path = getHashPath();\n var encodedPath = encodePath(path);\n\n if (path !== encodedPath) {\n // Ensure we always have a properly-encoded hash.\n replaceHashPath(encodedPath);\n } else {\n var location = getDOMLocation();\n var prevLocation = history.location;\n if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n ignorePath = null;\n handlePop(location);\n }\n }\n\n function handlePop(location) {\n if (forceNextPop) {\n forceNextPop = false;\n setState();\n } else {\n var action = 'POP';\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location\n });\n } else {\n revertPop(location);\n }\n });\n }\n }\n\n function revertPop(fromLocation) {\n var toLocation = history.location; // TODO: We could probably make this more reliable by\n // keeping a list of paths we've seen in sessionStorage.\n // Instead, we just default to 0 for paths we don't know.\n\n var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n if (toIndex === -1) toIndex = 0;\n var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n if (fromIndex === -1) fromIndex = 0;\n var delta = toIndex - fromIndex;\n\n if (delta) {\n forceNextPop = true;\n go(delta);\n }\n } // Ensure the hash is encoded properly before doing anything else.\n\n\n var path = getHashPath();\n var encodedPath = encodePath(path);\n if (path !== encodedPath) replaceHashPath(encodedPath);\n var initialLocation = getDOMLocation();\n var allPaths = [createPath(initialLocation)]; // Public interface\n\n function createHref(location) {\n var baseTag = document.querySelector('base');\n var href = '';\n\n if (baseTag && baseTag.getAttribute('href')) {\n href = stripHash(window.location.href);\n }\n\n return href + '#' + encodePath(basename + createPath(location));\n }\n\n function push(path, state) {\n false ? 0 : void 0;\n var action = 'PUSH';\n var location = createLocation(path, undefined, undefined, history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var path = createPath(location);\n var encodedPath = encodePath(basename + path);\n var hashChanged = getHashPath() !== encodedPath;\n\n if (hashChanged) {\n // We cannot tell if a hashchange was caused by a PUSH, so we'd\n // rather setState here and ignore the hashchange. The caveat here\n // is that other hash histories in the page will consider it a POP.\n ignorePath = path;\n pushHashPath(encodedPath);\n var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n var nextPaths = allPaths.slice(0, prevIndex + 1);\n nextPaths.push(path);\n allPaths = nextPaths;\n setState({\n action: action,\n location: location\n });\n } else {\n false ? 0 : void 0;\n setState();\n }\n });\n }\n\n function replace(path, state) {\n false ? 0 : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, undefined, undefined, history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var path = createPath(location);\n var encodedPath = encodePath(basename + path);\n var hashChanged = getHashPath() !== encodedPath;\n\n if (hashChanged) {\n // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n // rather setState here and ignore the hashchange. The caveat here\n // is that other hash histories in the page will consider it a POP.\n ignorePath = path;\n replaceHashPath(encodedPath);\n }\n\n var prevIndex = allPaths.indexOf(createPath(history.location));\n if (prevIndex !== -1) allPaths[prevIndex] = path;\n setState({\n action: action,\n location: location\n });\n });\n }\n\n function go(n) {\n false ? 0 : void 0;\n globalHistory.go(n);\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n var listenerCount = 0;\n\n function checkDOMListeners(delta) {\n listenerCount += delta;\n\n if (listenerCount === 1 && delta === 1) {\n window.addEventListener(HashChangeEvent$1, handleHashChange);\n } else if (listenerCount === 0) {\n window.removeEventListener(HashChangeEvent$1, handleHashChange);\n }\n }\n\n var isBlocked = false;\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n var unblock = transitionManager.setPrompt(prompt);\n\n if (!isBlocked) {\n checkDOMListeners(1);\n isBlocked = true;\n }\n\n return function () {\n if (isBlocked) {\n isBlocked = false;\n checkDOMListeners(-1);\n }\n\n return unblock();\n };\n }\n\n function listen(listener) {\n var unlisten = transitionManager.appendListener(listener);\n checkDOMListeners(1);\n return function () {\n checkDOMListeners(-1);\n unlisten();\n };\n }\n\n var history = {\n length: globalHistory.length,\n action: 'POP',\n location: initialLocation,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n block: block,\n listen: listen\n };\n return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n if (props === void 0) {\n props = {};\n }\n\n var _props = props,\n getUserConfirmation = _props.getUserConfirmation,\n _props$initialEntries = _props.initialEntries,\n initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n _props$initialIndex = _props.initialIndex,\n initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n _props$keyLength = _props.keyLength,\n keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n var transitionManager = createTransitionManager();\n\n function setState(nextState) {\n (0,esm_extends/* default */.A)(history, nextState);\n\n history.length = history.entries.length;\n transitionManager.notifyListeners(history.location, history.action);\n }\n\n function createKey() {\n return Math.random().toString(36).substr(2, keyLength);\n }\n\n var index = clamp(initialIndex, 0, initialEntries.length - 1);\n var entries = initialEntries.map(function (entry) {\n return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n }); // Public interface\n\n var createHref = createPath;\n\n function push(path, state) {\n false ? 0 : void 0;\n var action = 'PUSH';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n var prevIndex = history.index;\n var nextIndex = prevIndex + 1;\n var nextEntries = history.entries.slice(0);\n\n if (nextEntries.length > nextIndex) {\n nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n } else {\n nextEntries.push(location);\n }\n\n setState({\n action: action,\n location: location,\n index: nextIndex,\n entries: nextEntries\n });\n });\n }\n\n function replace(path, state) {\n false ? 0 : void 0;\n var action = 'REPLACE';\n var location = createLocation(path, state, createKey(), history.location);\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (!ok) return;\n history.entries[history.index] = location;\n setState({\n action: action,\n location: location\n });\n });\n }\n\n function go(n) {\n var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n var action = 'POP';\n var location = history.entries[nextIndex];\n transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n if (ok) {\n setState({\n action: action,\n location: location,\n index: nextIndex\n });\n } else {\n // Mimic the behavior of DOM histories by\n // causing a render after a cancelled POP.\n setState();\n }\n });\n }\n\n function goBack() {\n go(-1);\n }\n\n function goForward() {\n go(1);\n }\n\n function canGo(n) {\n var nextIndex = history.index + n;\n return nextIndex >= 0 && nextIndex < history.entries.length;\n }\n\n function block(prompt) {\n if (prompt === void 0) {\n prompt = false;\n }\n\n return transitionManager.setPrompt(prompt);\n }\n\n function listen(listener) {\n return transitionManager.appendListener(listener);\n }\n\n var history = {\n length: entries.length,\n action: 'POP',\n location: entries[index],\n index: index,\n entries: entries,\n createHref: createHref,\n push: push,\n replace: replace,\n go: go,\n goBack: goBack,\n goForward: goForward,\n canGo: canGo,\n block: block,\n listen: listen\n };\n return history;\n}\n\n\n\n// EXTERNAL MODULE: ./node_modules/path-to-regexp/index.js\nvar path_to_regexp = __webpack_require__(35302);\nvar path_to_regexp_default = /*#__PURE__*/__webpack_require__.n(path_to_regexp);\n// EXTERNAL MODULE: ./node_modules/react-router/node_modules/react-is/index.js\nvar react_is = __webpack_require__(37564);\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\nvar objectWithoutPropertiesLoose = __webpack_require__(98587);\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(4146);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n;// ./node_modules/react-router/esm/react-router.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\nvar commonjsGlobal = typeof globalThis !== \"undefined\" // 'global proper'\n? // eslint-disable-next-line no-undef\nglobalThis : typeof window !== \"undefined\" ? window // Browser\n: typeof __webpack_require__.g !== \"undefined\" ? __webpack_require__.g // node.js\n: {};\n\nfunction getUniqueId() {\n var key = \"__global_unique_id__\";\n return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;\n} // Inlined Object.is polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n\n\nfunction objectIs(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // eslint-disable-next-line no-self-compare\n return x !== x && y !== y;\n }\n}\n\nfunction createEventEmitter(value) {\n var handlers = [];\n return {\n on: function on(handler) {\n handlers.push(handler);\n },\n off: function off(handler) {\n handlers = handlers.filter(function (h) {\n return h !== handler;\n });\n },\n get: function get() {\n return value;\n },\n set: function set(newValue, changedBits) {\n value = newValue;\n handlers.forEach(function (handler) {\n return handler(value, changedBits);\n });\n }\n };\n}\n\nfunction onlyChild(children) {\n return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n var _Provider$childContex, _Consumer$contextType;\n\n var contextProp = \"__create-react-context-\" + getUniqueId() + \"__\";\n\n var Provider = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(Provider, _React$Component);\n\n function Provider() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.emitter = createEventEmitter(_this.props.value);\n return _this;\n }\n\n var _proto = Provider.prototype;\n\n _proto.getChildContext = function getChildContext() {\n var _ref;\n\n return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n };\n\n _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n if (this.props.value !== nextProps.value) {\n var oldValue = this.props.value;\n var newValue = nextProps.value;\n var changedBits;\n\n if (objectIs(oldValue, newValue)) {\n changedBits = 0; // No change\n } else {\n changedBits = typeof calculateChangedBits === \"function\" ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n if (false) // removed by dead control flow\n{}\n\n changedBits |= 0;\n\n if (changedBits !== 0) {\n this.emitter.set(nextProps.value, changedBits);\n }\n }\n }\n };\n\n _proto.render = function render() {\n return this.props.children;\n };\n\n return Provider;\n }((index_js_eager_default()).Component);\n\n Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = (prop_types_default()).object.isRequired, _Provider$childContex);\n\n var Consumer = /*#__PURE__*/function (_React$Component2) {\n (0,inheritsLoose/* default */.A)(Consumer, _React$Component2);\n\n function Consumer() {\n var _this2;\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n _this2 = _React$Component2.call.apply(_React$Component2, [this].concat(args)) || this;\n _this2.observedBits = void 0;\n _this2.state = {\n value: _this2.getValue()\n };\n\n _this2.onUpdate = function (newValue, changedBits) {\n var observedBits = _this2.observedBits | 0;\n\n if ((observedBits & changedBits) !== 0) {\n _this2.setState({\n value: _this2.getValue()\n });\n }\n };\n\n return _this2;\n }\n\n var _proto2 = Consumer.prototype;\n\n _proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n var observedBits = nextProps.observedBits;\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n _proto2.componentDidMount = function componentDidMount() {\n if (this.context[contextProp]) {\n this.context[contextProp].on(this.onUpdate);\n }\n\n var observedBits = this.props.observedBits;\n this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n };\n\n _proto2.componentWillUnmount = function componentWillUnmount() {\n if (this.context[contextProp]) {\n this.context[contextProp].off(this.onUpdate);\n }\n };\n\n _proto2.getValue = function getValue() {\n if (this.context[contextProp]) {\n return this.context[contextProp].get();\n } else {\n return defaultValue;\n }\n };\n\n _proto2.render = function render() {\n return onlyChild(this.props.children)(this.state.value);\n };\n\n return Consumer;\n }((index_js_eager_default()).Component);\n\n Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = (prop_types_default()).object, _Consumer$contextType);\n return {\n Provider: Provider,\n Consumer: Consumer\n };\n}\n\n// MIT License\nvar createContext = (index_js_eager_default()).createContext || createReactContext;\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext = function createNamedContext(name) {\n var context = createContext();\n context.displayName = name;\n return context;\n};\n\nvar historyContext = /*#__PURE__*/createNamedContext(\"Router-History\");\n\nvar context = /*#__PURE__*/createNamedContext(\"Router\");\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(Router, _React$Component);\n\n Router.computeRootMatch = function computeRootMatch(pathname) {\n return {\n path: \"/\",\n url: \"/\",\n params: {},\n isExact: pathname === \"/\"\n };\n };\n\n function Router(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this;\n _this.state = {\n location: props.history.location\n }; // This is a bit of a hack. We have to start listening for location\n // changes here in the constructor in case there are any s\n // on the initial render. If there are, they will replace/push when\n // they mount and since cDM fires in children before parents, we may\n // get a new location before the is mounted.\n\n _this._isMounted = false;\n _this._pendingLocation = null;\n\n if (!props.staticContext) {\n _this.unlisten = props.history.listen(function (location) {\n _this._pendingLocation = location;\n });\n }\n\n return _this;\n }\n\n var _proto = Router.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n this._isMounted = true;\n\n if (this.unlisten) {\n // Any pre-mount location changes have been captured at\n // this point, so unregister the listener.\n this.unlisten();\n }\n\n if (!this.props.staticContext) {\n this.unlisten = this.props.history.listen(function (location) {\n if (_this2._isMounted) {\n _this2.setState({\n location: location\n });\n }\n });\n }\n\n if (this._pendingLocation) {\n this.setState({\n location: this._pendingLocation\n });\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.unlisten) {\n this.unlisten();\n this._isMounted = false;\n this._pendingLocation = null;\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/index_js_eager_default().createElement(context.Provider, {\n value: {\n history: this.props.history,\n location: this.state.location,\n match: Router.computeRootMatch(this.state.location.pathname),\n staticContext: this.props.staticContext\n }\n }, /*#__PURE__*/index_js_eager_default().createElement(historyContext.Provider, {\n children: this.props.children || null,\n value: this.props.history\n }));\n };\n\n return Router;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\n/**\n * The public API for a that stores location in memory.\n */\n\nvar MemoryRouter = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(MemoryRouter, _React$Component);\n\n function MemoryRouter() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.history = createMemoryHistory(_this.props);\n return _this;\n }\n\n var _proto = MemoryRouter.prototype;\n\n _proto.render = function render() {\n return /*#__PURE__*/index_js_eager_default().createElement(Router, {\n history: this.history,\n children: this.props.children\n });\n };\n\n return MemoryRouter;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\nvar Lifecycle = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(Lifecycle, _React$Component);\n\n function Lifecycle() {\n return _React$Component.apply(this, arguments) || this;\n }\n\n var _proto = Lifecycle.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n if (this.props.onMount) this.props.onMount.call(this, this);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n };\n\n _proto.render = function render() {\n return null;\n };\n\n return Lifecycle;\n}((index_js_eager_default()).Component);\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\n\nfunction Prompt(_ref) {\n var message = _ref.message,\n _ref$when = _ref.when,\n when = _ref$when === void 0 ? true : _ref$when;\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n if (!when || context.staticContext) return null;\n var method = context.history.block;\n return /*#__PURE__*/index_js_eager_default().createElement(Lifecycle, {\n onMount: function onMount(self) {\n self.release = method(message);\n },\n onUpdate: function onUpdate(self, prevProps) {\n if (prevProps.message !== message) {\n self.release();\n self.release = method(message);\n }\n },\n onUnmount: function onUnmount(self) {\n self.release();\n },\n message: message\n });\n });\n}\n\nif (false) // removed by dead control flow\n{ var messageType; }\n\nvar cache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nfunction compilePath(path) {\n if (cache[path]) return cache[path];\n var generator = path_to_regexp_default().compile(path);\n\n if (cacheCount < cacheLimit) {\n cache[path] = generator;\n cacheCount++;\n }\n\n return generator;\n}\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\n\n\nfunction generatePath(path, params) {\n if (path === void 0) {\n path = \"/\";\n }\n\n if (params === void 0) {\n params = {};\n }\n\n return path === \"/\" ? path : compilePath(path)(params, {\n pretty: true\n });\n}\n\n/**\n * The public API for navigating programmatically with a component.\n */\n\nfunction Redirect(_ref) {\n var computedMatch = _ref.computedMatch,\n to = _ref.to,\n _ref$push = _ref.push,\n push = _ref$push === void 0 ? false : _ref$push;\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n var history = context.history,\n staticContext = context.staticContext;\n var method = push ? history.push : history.replace;\n var location = createLocation(computedMatch ? typeof to === \"string\" ? generatePath(to, computedMatch.params) : (0,esm_extends/* default */.A)({}, to, {\n pathname: generatePath(to.pathname, computedMatch.params)\n }) : to); // When rendering in a static context,\n // set the new location immediately.\n\n if (staticContext) {\n method(location);\n return null;\n }\n\n return /*#__PURE__*/index_js_eager_default().createElement(Lifecycle, {\n onMount: function onMount() {\n method(location);\n },\n onUpdate: function onUpdate(self, prevProps) {\n var prevLocation = createLocation(prevProps.to);\n\n if (!locationsAreEqual(prevLocation, (0,esm_extends/* default */.A)({}, location, {\n key: prevLocation.key\n }))) {\n method(location);\n }\n },\n to: to\n });\n });\n}\n\nif (false) // removed by dead control flow\n{}\n\nvar cache$1 = {};\nvar cacheLimit$1 = 10000;\nvar cacheCount$1 = 0;\n\nfunction compilePath$1(path, options) {\n var cacheKey = \"\" + options.end + options.strict + options.sensitive;\n var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});\n if (pathCache[path]) return pathCache[path];\n var keys = [];\n var regexp = path_to_regexp_default()(path, keys, options);\n var result = {\n regexp: regexp,\n keys: keys\n };\n\n if (cacheCount$1 < cacheLimit$1) {\n pathCache[path] = result;\n cacheCount$1++;\n }\n\n return result;\n}\n/**\n * Public API for matching a URL pathname to a path.\n */\n\n\nfunction matchPath(pathname, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (typeof options === \"string\" || Array.isArray(options)) {\n options = {\n path: options\n };\n }\n\n var _options = options,\n path = _options.path,\n _options$exact = _options.exact,\n exact = _options$exact === void 0 ? false : _options$exact,\n _options$strict = _options.strict,\n strict = _options$strict === void 0 ? false : _options$strict,\n _options$sensitive = _options.sensitive,\n sensitive = _options$sensitive === void 0 ? false : _options$sensitive;\n var paths = [].concat(path);\n return paths.reduce(function (matched, path) {\n if (!path && path !== \"\") return null;\n if (matched) return matched;\n\n var _compilePath = compilePath$1(path, {\n end: exact,\n strict: strict,\n sensitive: sensitive\n }),\n regexp = _compilePath.regexp,\n keys = _compilePath.keys;\n\n var match = regexp.exec(pathname);\n if (!match) return null;\n var url = match[0],\n values = match.slice(1);\n var isExact = pathname === url;\n if (exact && !isExact) return null;\n return {\n path: path,\n // the path used to match\n url: path === \"/\" && url === \"\" ? \"/\" : url,\n // the matched portion of the URL\n isExact: isExact,\n // whether or not we matched exactly\n params: keys.reduce(function (memo, key, index) {\n memo[key.name] = values[index];\n return memo;\n }, {})\n };\n }, null);\n}\n\nfunction isEmptyChildren(children) {\n return index_js_eager_default().Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n var value = children(props);\n false ? 0 : void 0;\n return value || null;\n}\n/**\n * The public API for matching a single path and rendering.\n */\n\n\nvar Route = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(Route, _React$Component);\n\n function Route() {\n return _React$Component.apply(this, arguments) || this;\n }\n\n var _proto = Route.prototype;\n\n _proto.render = function render() {\n var _this = this;\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context$1) {\n !context$1 ? false ? 0 : invariant(false) : void 0;\n var location = _this.props.location || context$1.location;\n var match = _this.props.computedMatch ? _this.props.computedMatch // already computed the match for us\n : _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;\n\n var props = (0,esm_extends/* default */.A)({}, context$1, {\n location: location,\n match: match\n });\n\n var _this$props = _this.props,\n children = _this$props.children,\n component = _this$props.component,\n render = _this$props.render; // Preact uses an empty array as children by\n // default, so use null if that's the case.\n\n if (Array.isArray(children) && isEmptyChildren(children)) {\n children = null;\n }\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Provider, {\n value: props\n }, props.match ? children ? typeof children === \"function\" ? false ? 0 : children(props) : children : component ? /*#__PURE__*/index_js_eager_default().createElement(component, props) : render ? render(props) : null : typeof children === \"function\" ? false ? 0 : children(props) : null);\n });\n };\n\n return Route;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\nfunction react_router_addLeadingSlash(path) {\n return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n if (!basename) return location;\n return (0,esm_extends/* default */.A)({}, location, {\n pathname: react_router_addLeadingSlash(basename) + location.pathname\n });\n}\n\nfunction react_router_stripBasename(basename, location) {\n if (!basename) return location;\n var base = react_router_addLeadingSlash(basename);\n if (location.pathname.indexOf(base) !== 0) return location;\n return (0,esm_extends/* default */.A)({}, location, {\n pathname: location.pathname.substr(base.length)\n });\n}\n\nfunction createURL(location) {\n return typeof location === \"string\" ? location : createPath(location);\n}\n\nfunction staticHandler(methodName) {\n return function () {\n false ? 0 : invariant(false) ;\n };\n}\n\nfunction noop() {}\n/**\n * The public top-level API for a \"static\" , so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\n\n\nvar StaticRouter = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(StaticRouter, _React$Component);\n\n function StaticRouter() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n _this.handlePush = function (location) {\n return _this.navigateTo(location, \"PUSH\");\n };\n\n _this.handleReplace = function (location) {\n return _this.navigateTo(location, \"REPLACE\");\n };\n\n _this.handleListen = function () {\n return noop;\n };\n\n _this.handleBlock = function () {\n return noop;\n };\n\n return _this;\n }\n\n var _proto = StaticRouter.prototype;\n\n _proto.navigateTo = function navigateTo(location, action) {\n var _this$props = this.props,\n _this$props$basename = _this$props.basename,\n basename = _this$props$basename === void 0 ? \"\" : _this$props$basename,\n _this$props$context = _this$props.context,\n context = _this$props$context === void 0 ? {} : _this$props$context;\n context.action = action;\n context.location = addBasename(basename, createLocation(location));\n context.url = createURL(context.location);\n };\n\n _proto.render = function render() {\n var _this$props2 = this.props,\n _this$props2$basename = _this$props2.basename,\n basename = _this$props2$basename === void 0 ? \"\" : _this$props2$basename,\n _this$props2$context = _this$props2.context,\n context = _this$props2$context === void 0 ? {} : _this$props2$context,\n _this$props2$location = _this$props2.location,\n location = _this$props2$location === void 0 ? \"/\" : _this$props2$location,\n rest = (0,objectWithoutPropertiesLoose/* default */.A)(_this$props2, [\"basename\", \"context\", \"location\"]);\n\n var history = {\n createHref: function createHref(path) {\n return react_router_addLeadingSlash(basename + createURL(path));\n },\n action: \"POP\",\n location: react_router_stripBasename(basename, createLocation(location)),\n push: this.handlePush,\n replace: this.handleReplace,\n go: staticHandler(\"go\"),\n goBack: staticHandler(\"goBack\"),\n goForward: staticHandler(\"goForward\"),\n listen: this.handleListen,\n block: this.handleBlock\n };\n return /*#__PURE__*/index_js_eager_default().createElement(Router, (0,esm_extends/* default */.A)({}, rest, {\n history: history,\n staticContext: context\n }));\n };\n\n return StaticRouter;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\n/**\n * The public API for rendering the first that matches.\n */\n\nvar Switch = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(Switch, _React$Component);\n\n function Switch() {\n return _React$Component.apply(this, arguments) || this;\n }\n\n var _proto = Switch.prototype;\n\n _proto.render = function render() {\n var _this = this;\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n var location = _this.props.location || context.location;\n var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()\n // here because toArray adds keys to all child elements and we do not want\n // to trigger an unmount/remount for two s that render the same\n // component at different URLs.\n\n index_js_eager_default().Children.forEach(_this.props.children, function (child) {\n if (match == null && /*#__PURE__*/index_js_eager_default().isValidElement(child)) {\n element = child;\n var path = child.props.path || child.props.from;\n match = path ? matchPath(location.pathname, (0,esm_extends/* default */.A)({}, child.props, {\n path: path\n })) : context.match;\n }\n });\n return match ? /*#__PURE__*/index_js_eager_default().cloneElement(element, {\n location: location,\n computedMatch: match\n }) : null;\n });\n };\n\n return Switch;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\n/**\n * A public higher-order component to access the imperative API\n */\n\nfunction withRouter(Component) {\n var displayName = \"withRouter(\" + (Component.displayName || Component.name) + \")\";\n\n var C = function C(props) {\n var wrappedComponentRef = props.wrappedComponentRef,\n remainingProps = (0,objectWithoutPropertiesLoose/* default */.A)(props, [\"wrappedComponentRef\"]);\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n return /*#__PURE__*/index_js_eager_default().createElement(Component, (0,esm_extends/* default */.A)({}, remainingProps, context, {\n ref: wrappedComponentRef\n }));\n });\n };\n\n C.displayName = displayName;\n C.WrappedComponent = Component;\n\n if (false) // removed by dead control flow\n{}\n\n return hoist_non_react_statics_cjs_default()(C, Component);\n}\n\nvar useContext = (index_js_eager_default()).useContext;\nfunction useHistory() {\n if (false) // removed by dead control flow\n{}\n\n return useContext(historyContext);\n}\nfunction useLocation() {\n if (false) // removed by dead control flow\n{}\n\n return useContext(context).location;\n}\nfunction useParams() {\n if (false) // removed by dead control flow\n{}\n\n var match = useContext(context).match;\n return match ? match.params : {};\n}\nfunction useRouteMatch(path) {\n if (false) // removed by dead control flow\n{}\n\n var location = useLocation();\n var match = useContext(context).match;\n return path ? matchPath(location.pathname, path) : match;\n}\n\nif (false) // removed by dead control flow\n{ var secondaryBuildName, initialBuildName, buildNames, key, global$1; }\n\n\n//# sourceMappingURL=react-router.js.map\n\n;// ./node_modules/react-router-dom/esm/react-router-dom.js\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The public API for a that uses HTML5 history.\n */\n\nvar BrowserRouter = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(BrowserRouter, _React$Component);\n\n function BrowserRouter() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.history = createBrowserHistory(_this.props);\n return _this;\n }\n\n var _proto = BrowserRouter.prototype;\n\n _proto.render = function render() {\n return /*#__PURE__*/index_js_eager_default().createElement(Router, {\n history: this.history,\n children: this.props.children\n });\n };\n\n return BrowserRouter;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\n/**\n * The public API for a that uses window.location.hash.\n */\n\nvar HashRouter = /*#__PURE__*/function (_React$Component) {\n (0,inheritsLoose/* default */.A)(HashRouter, _React$Component);\n\n function HashRouter() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.history = createHashHistory(_this.props);\n return _this;\n }\n\n var _proto = HashRouter.prototype;\n\n _proto.render = function render() {\n return /*#__PURE__*/index_js_eager_default().createElement(Router, {\n history: this.history,\n children: this.props.children\n });\n };\n\n return HashRouter;\n}((index_js_eager_default()).Component);\n\nif (false) // removed by dead control flow\n{}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n return typeof to === \"string\" ? createLocation(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n return C;\n};\n\nvar forwardRef = (index_js_eager_default()).forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n var innerRef = _ref.innerRef,\n navigate = _ref.navigate,\n _onClick = _ref.onClick,\n rest = (0,objectWithoutPropertiesLoose/* default */.A)(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n var target = rest.target;\n\n var props = (0,esm_extends/* default */.A)({}, rest, {\n onClick: function onClick(event) {\n try {\n if (_onClick) _onClick(event);\n } catch (ex) {\n event.preventDefault();\n throw ex;\n }\n\n if (!event.defaultPrevented && // onClick prevented default\n event.button === 0 && ( // ignore everything but left clicks\n !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // ignore clicks with modifier keys\n ) {\n event.preventDefault();\n navigate();\n }\n }\n }); // React 15 compat\n\n\n if (forwardRefShim !== forwardRef) {\n props.ref = forwardedRef || innerRef;\n } else {\n props.ref = innerRef;\n }\n /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n return /*#__PURE__*/index_js_eager_default().createElement(\"a\", props);\n});\n\nif (false) // removed by dead control flow\n{}\n/**\n * The public API for rendering a history-aware .\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n var _ref2$component = _ref2.component,\n component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n replace = _ref2.replace,\n to = _ref2.to,\n innerRef = _ref2.innerRef,\n rest = (0,objectWithoutPropertiesLoose/* default */.A)(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n var history = context.history;\n var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n var href = location ? history.createHref(location) : \"\";\n\n var props = (0,esm_extends/* default */.A)({}, rest, {\n href: href,\n navigate: function navigate() {\n var location = resolveToLocation(to, context.location);\n var isDuplicateNavigation = createPath(context.location) === createPath(normalizeToLocation(location));\n var method = replace || isDuplicateNavigation ? history.replace : history.push;\n method(location);\n }\n }); // React 15 compat\n\n\n if (forwardRefShim !== forwardRef) {\n props.ref = forwardedRef || innerRef;\n } else {\n props.innerRef = innerRef;\n }\n\n return /*#__PURE__*/index_js_eager_default().createElement(component, props);\n });\n});\n\nif (false) // removed by dead control flow\n{ var refType, toType; }\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n return C;\n};\n\nvar forwardRef$1 = (index_js_eager_default()).forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n classnames[_key] = arguments[_key];\n }\n\n return classnames.filter(function (i) {\n return i;\n }).join(\" \");\n}\n/**\n * A wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n var _ref$ariaCurrent = _ref[\"aria-current\"],\n ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n _ref$activeClassName = _ref.activeClassName,\n activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n activeStyle = _ref.activeStyle,\n classNameProp = _ref.className,\n exact = _ref.exact,\n isActiveProp = _ref.isActive,\n locationProp = _ref.location,\n sensitive = _ref.sensitive,\n strict = _ref.strict,\n styleProp = _ref.style,\n to = _ref.to,\n innerRef = _ref.innerRef,\n rest = (0,objectWithoutPropertiesLoose/* default */.A)(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n return /*#__PURE__*/index_js_eager_default().createElement(context.Consumer, null, function (context) {\n !context ? false ? 0 : invariant(false) : void 0;\n var currentLocation = locationProp || context.location;\n var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n var match = escapedPath ? matchPath(currentLocation.pathname, {\n path: escapedPath,\n exact: exact,\n sensitive: sensitive,\n strict: strict\n }) : null;\n var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n var className = typeof classNameProp === \"function\" ? classNameProp(isActive) : classNameProp;\n var style = typeof styleProp === \"function\" ? styleProp(isActive) : styleProp;\n\n if (isActive) {\n className = joinClassnames(className, activeClassName);\n style = (0,esm_extends/* default */.A)({}, style, activeStyle);\n }\n\n var props = (0,esm_extends/* default */.A)({\n \"aria-current\": isActive && ariaCurrent || null,\n className: className,\n style: style,\n to: toLocation\n }, rest); // React 15 compat\n\n\n if (forwardRefShim$1 !== forwardRef$1) {\n props.ref = forwardedRef || innerRef;\n } else {\n props.innerRef = innerRef;\n }\n\n return /*#__PURE__*/index_js_eager_default().createElement(Link, props);\n });\n});\n\nif (false) // removed by dead control flow\n{ var ariaCurrentType; }\n\n\n//# sourceMappingURL=react-router-dom.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA4NzYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3Q1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBcUJBO0FBQ0E7QUFDQTs7O0FDcjdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQWdCQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZXNvbHZlLXBhdGhuYW1lL2VzbS9yZXNvbHZlLXBhdGhuYW1lLmpzPzk0MjEiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvdmFsdWUtZXF1YWwvZXNtL3ZhbHVlLWVxdWFsLmpzP2M2MTkiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvdGlueS1pbnZhcmlhbnQvZGlzdC9lc20vdGlueS1pbnZhcmlhbnQuanM/NTQxZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9oaXN0b3J5L2VzbS9oaXN0b3J5LmpzPzJlMTAiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL2VzbS9yZWFjdC1yb3V0ZXIuanM/NGYyZSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFjdC1yb3V0ZXItZG9tL2VzbS9yZWFjdC1yb3V0ZXItZG9tLmpzP2U3OTIiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRobmFtZSkge1xuICByZXR1cm4gcGF0aG5hbWUuY2hhckF0KDApID09PSAnLyc7XG59XG5cbi8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKVxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAodmFyIGkgPSBpbmRleCwgayA9IGkgKyAxLCBuID0gbGlzdC5sZW5ndGg7IGsgPCBuOyBpICs9IDEsIGsgKz0gMSkge1xuICAgIGxpc3RbaV0gPSBsaXN0W2tdO1xuICB9XG5cbiAgbGlzdC5wb3AoKTtcbn1cblxuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBoZWF2aWx5IG9uIG5vZGUncyB1cmwucGFyc2VcbmZ1bmN0aW9uIHJlc29sdmVQYXRobmFtZSh0bywgZnJvbSkge1xuICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkKSBmcm9tID0gJyc7XG5cbiAgdmFyIHRvUGFydHMgPSAodG8gJiYgdG8uc3BsaXQoJy8nKSkgfHwgW107XG4gIHZhciBmcm9tUGFydHMgPSAoZnJvbSAmJiBmcm9tLnNwbGl0KCcvJykpIHx8IFtdO1xuXG4gIHZhciBpc1RvQWJzID0gdG8gJiYgaXNBYnNvbHV0ZSh0byk7XG4gIHZhciBpc0Zyb21BYnMgPSBmcm9tICYmIGlzQWJzb2x1dGUoZnJvbSk7XG4gIHZhciBtdXN0RW5kQWJzID0gaXNUb0FicyB8fCBpc0Zyb21BYnM7XG5cbiAgaWYgKHRvICYmIGlzQWJzb2x1dGUodG8pKSB7XG4gICAgLy8gdG8gaXMgYWJzb2x1dGVcbiAgICBmcm9tUGFydHMgPSB0b1BhcnRzO1xuICB9IGVsc2UgaWYgKHRvUGFydHMubGVuZ3RoKSB7XG4gICAgLy8gdG8gaXMgcmVsYXRpdmUsIGRyb3AgdGhlIGZpbGVuYW1lXG4gICAgZnJvbVBhcnRzLnBvcCgpO1xuICAgIGZyb21QYXJ0cyA9IGZyb21QYXJ0cy5jb25jYXQodG9QYXJ0cyk7XG4gIH1cblxuICBpZiAoIWZyb21QYXJ0cy5sZW5ndGgpIHJldHVybiAnLyc7XG5cbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2g7XG4gIGlmIChmcm9tUGFydHMubGVuZ3RoKSB7XG4gICAgdmFyIGxhc3QgPSBmcm9tUGFydHNbZnJvbVBhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGhhc1RyYWlsaW5nU2xhc2ggPSBsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJyB8fCBsYXN0ID09PSAnJztcbiAgfSBlbHNlIHtcbiAgICBoYXNUcmFpbGluZ1NsYXNoID0gZmFsc2U7XG4gIH1cblxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gZnJvbVBhcnRzLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgcGFydCA9IGZyb21QYXJ0c1tpXTtcblxuICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgIHNwbGljZU9uZShmcm9tUGFydHMsIGkpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgc3BsaWNlT25lKGZyb21QYXJ0cywgaSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNwbGljZU9uZShmcm9tUGFydHMsIGkpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICBpZiAoIW11c3RFbmRBYnMpIGZvciAoOyB1cC0tOyB1cCkgZnJvbVBhcnRzLnVuc2hpZnQoJy4uJyk7XG5cbiAgaWYgKFxuICAgIG11c3RFbmRBYnMgJiZcbiAgICBmcm9tUGFydHNbMF0gIT09ICcnICYmXG4gICAgKCFmcm9tUGFydHNbMF0gfHwgIWlzQWJzb2x1dGUoZnJvbVBhcnRzWzBdKSlcbiAgKVxuICAgIGZyb21QYXJ0cy51bnNoaWZ0KCcnKTtcblxuICB2YXIgcmVzdWx0ID0gZnJvbVBhcnRzLmpvaW4oJy8nKTtcblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiByZXN1bHQuc3Vic3RyKC0xKSAhPT0gJy8nKSByZXN1bHQgKz0gJy8nO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlc29sdmVQYXRobmFtZTtcbiIsImZ1bmN0aW9uIHZhbHVlT2Yob2JqKSB7XG4gIHJldHVybiBvYmoudmFsdWVPZiA/IG9iai52YWx1ZU9mKCkgOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUVxdWFsKGEsIGIpIHtcbiAgLy8gVGVzdCBmb3Igc3RyaWN0IGVxdWFsaXR5IGZpcnN0LlxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gT3RoZXJ3aXNlLCBpZiBlaXRoZXIgb2YgdGhlbSA9PSBudWxsIHRoZXkgYXJlIG5vdCBlcXVhbC5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIHJldHVybiAoXG4gICAgICBBcnJheS5pc0FycmF5KGIpICYmXG4gICAgICBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiZcbiAgICAgIGEuZXZlcnkoZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWwoaXRlbSwgYltpbmRleF0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgYVZhbHVlID0gdmFsdWVPZihhKTtcbiAgICB2YXIgYlZhbHVlID0gdmFsdWVPZihiKTtcblxuICAgIGlmIChhVmFsdWUgIT09IGEgfHwgYlZhbHVlICE9PSBiKSByZXR1cm4gdmFsdWVFcXVhbChhVmFsdWUsIGJWYWx1ZSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgYSwgYikpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIHZhbHVlRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWx1ZUVxdWFsO1xuIiwidmFyIGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG52YXIgcHJlZml4ID0gJ0ludmFyaWFudCBmYWlsZWQnO1xuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNQcm9kdWN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcmVmaXgpO1xuICAgIH1cbiAgICB2YXIgcHJvdmlkZWQgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IG1lc3NhZ2UoKSA6IG1lc3NhZ2U7XG4gICAgdmFyIHZhbHVlID0gcHJvdmlkZWQgPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiOiBcIikuY29uY2F0KHByb3ZpZGVkKSA6IHByZWZpeDtcbiAgICB0aHJvdyBuZXcgRXJyb3IodmFsdWUpO1xufVxuXG5leHBvcnQgeyBpbnZhcmlhbnQgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IHJlc29sdmVQYXRobmFtZSBmcm9tICdyZXNvbHZlLXBhdGhuYW1lJztcbmltcG9ydCB2YWx1ZUVxdWFsIGZyb20gJ3ZhbHVlLWVxdWFsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3Rpbnktd2FybmluZyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcblxuZnVuY3Rpb24gYWRkTGVhZGluZ1NsYXNoKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoIDogJy8nICsgcGF0aDtcbn1cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ1NsYXNoKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLycgPyBwYXRoLnN1YnN0cigxKSA6IHBhdGg7XG59XG5mdW5jdGlvbiBoYXNCYXNlbmFtZShwYXRoLCBwcmVmaXgpIHtcbiAgcmV0dXJuIHBhdGgudG9Mb3dlckNhc2UoKS5pbmRleE9mKHByZWZpeC50b0xvd2VyQ2FzZSgpKSA9PT0gMCAmJiAnLz8jJy5pbmRleE9mKHBhdGguY2hhckF0KHByZWZpeC5sZW5ndGgpKSAhPT0gLTE7XG59XG5mdW5jdGlvbiBzdHJpcEJhc2VuYW1lKHBhdGgsIHByZWZpeCkge1xuICByZXR1cm4gaGFzQmFzZW5hbWUocGF0aCwgcHJlZml4KSA/IHBhdGguc3Vic3RyKHByZWZpeC5sZW5ndGgpIDogcGF0aDtcbn1cbmZ1bmN0aW9uIHN0cmlwVHJhaWxpbmdTbGFzaChwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdChwYXRoLmxlbmd0aCAtIDEpID09PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGg7XG59XG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aCkge1xuICB2YXIgcGF0aG5hbWUgPSBwYXRoIHx8ICcvJztcbiAgdmFyIHNlYXJjaCA9ICcnO1xuICB2YXIgaGFzaCA9ICcnO1xuICB2YXIgaGFzaEluZGV4ID0gcGF0aG5hbWUuaW5kZXhPZignIycpO1xuXG4gIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgaGFzaCA9IHBhdGhuYW1lLnN1YnN0cihoYXNoSW5kZXgpO1xuICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyKDAsIGhhc2hJbmRleCk7XG4gIH1cblxuICB2YXIgc2VhcmNoSW5kZXggPSBwYXRobmFtZS5pbmRleE9mKCc/Jyk7XG5cbiAgaWYgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgIHNlYXJjaCA9IHBhdGhuYW1lLnN1YnN0cihzZWFyY2hJbmRleCk7XG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHIoMCwgc2VhcmNoSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZTogcGF0aG5hbWUsXG4gICAgc2VhcmNoOiBzZWFyY2ggPT09ICc/JyA/ICcnIDogc2VhcmNoLFxuICAgIGhhc2g6IGhhc2ggPT09ICcjJyA/ICcnIDogaGFzaFxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aChsb2NhdGlvbikge1xuICB2YXIgcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuICB2YXIgcGF0aCA9IHBhdGhuYW1lIHx8ICcvJztcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2ggIT09ICc/JykgcGF0aCArPSBzZWFyY2guY2hhckF0KDApID09PSAnPycgPyBzZWFyY2ggOiBcIj9cIiArIHNlYXJjaDtcbiAgaWYgKGhhc2ggJiYgaGFzaCAhPT0gJyMnKSBwYXRoICs9IGhhc2guY2hhckF0KDApID09PSAnIycgPyBoYXNoIDogXCIjXCIgKyBoYXNoO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24ocGF0aCwgc3RhdGUsIGtleSwgY3VycmVudExvY2F0aW9uKSB7XG4gIHZhciBsb2NhdGlvbjtcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gVHdvLWFyZyBmb3JtOiBwdXNoKHBhdGgsIHN0YXRlKVxuICAgIGxvY2F0aW9uID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxvY2F0aW9uLnN0YXRlID0gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gT25lLWFyZyBmb3JtOiBwdXNoKGxvY2F0aW9uKVxuICAgIGxvY2F0aW9uID0gX2V4dGVuZHMoe30sIHBhdGgpO1xuICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZSA9PT0gdW5kZWZpbmVkKSBsb2NhdGlvbi5wYXRobmFtZSA9ICcnO1xuXG4gICAgaWYgKGxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgaWYgKGxvY2F0aW9uLnNlYXJjaC5jaGFyQXQoMCkgIT09ICc/JykgbG9jYXRpb24uc2VhcmNoID0gJz8nICsgbG9jYXRpb24uc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhdGlvbi5zZWFyY2ggPSAnJztcbiAgICB9XG5cbiAgICBpZiAobG9jYXRpb24uaGFzaCkge1xuICAgICAgaWYgKGxvY2F0aW9uLmhhc2guY2hhckF0KDApICE9PSAnIycpIGxvY2F0aW9uLmhhc2ggPSAnIycgKyBsb2NhdGlvbi5oYXNoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhdGlvbi5oYXNoID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlICE9PSB1bmRlZmluZWQgJiYgbG9jYXRpb24uc3RhdGUgPT09IHVuZGVmaW5lZCkgbG9jYXRpb24uc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9jYXRpb24ucGF0aG5hbWUgPSBkZWNvZGVVUkkobG9jYXRpb24ucGF0aG5hbWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBVUklFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFVSSUVycm9yKCdQYXRobmFtZSBcIicgKyBsb2NhdGlvbi5wYXRobmFtZSArICdcIiBjb3VsZCBub3QgYmUgZGVjb2RlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgYW4gaW52YWxpZCBwZXJjZW50LWVuY29kaW5nLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChrZXkpIGxvY2F0aW9uLmtleSA9IGtleTtcblxuICBpZiAoY3VycmVudExvY2F0aW9uKSB7XG4gICAgLy8gUmVzb2x2ZSBpbmNvbXBsZXRlL3JlbGF0aXZlIHBhdGhuYW1lIHJlbGF0aXZlIHRvIGN1cnJlbnQgbG9jYXRpb24uXG4gICAgaWYgKCFsb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPSBjdXJyZW50TG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfSBlbHNlIGlmIChsb2NhdGlvbi5wYXRobmFtZS5jaGFyQXQoMCkgIT09ICcvJykge1xuICAgICAgbG9jYXRpb24ucGF0aG5hbWUgPSByZXNvbHZlUGF0aG5hbWUobG9jYXRpb24ucGF0aG5hbWUsIGN1cnJlbnRMb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gcHJpb3IgbG9jYXRpb24gYW5kIHBhdGhuYW1lIGlzIGVtcHR5LCBzZXQgaXQgdG8gL1xuICAgIGlmICghbG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIGxvY2F0aW9uLnBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIGxvY2F0aW9uc0FyZUVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEucGF0aG5hbWUgPT09IGIucGF0aG5hbWUgJiYgYS5zZWFyY2ggPT09IGIuc2VhcmNoICYmIGEuaGFzaCA9PT0gYi5oYXNoICYmIGEua2V5ID09PSBiLmtleSAmJiB2YWx1ZUVxdWFsKGEuc3RhdGUsIGIuc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2l0aW9uTWFuYWdlcigpIHtcbiAgdmFyIHByb21wdCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc2V0UHJvbXB0KG5leHRQcm9tcHQpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHByb21wdCA9PSBudWxsLCAnQSBoaXN0b3J5IHN1cHBvcnRzIG9ubHkgb25lIHByb21wdCBhdCBhIHRpbWUnKSA6IHZvaWQgMDtcbiAgICBwcm9tcHQgPSBuZXh0UHJvbXB0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocHJvbXB0ID09PSBuZXh0UHJvbXB0KSBwcm9tcHQgPSBudWxsO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgLy8gVE9ETzogSWYgYW5vdGhlciB0cmFuc2l0aW9uIHN0YXJ0cyB3aGlsZSB3ZSdyZSBzdGlsbCBjb25maXJtaW5nXG4gICAgLy8gdGhlIHByZXZpb3VzIG9uZSwgd2UgbWF5IGVuZCB1cCBpbiBhIHdlaXJkIHN0YXRlLiBGaWd1cmUgb3V0IHRoZVxuICAgIC8vIGJlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzLlxuICAgIGlmIChwcm9tcHQgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHR5cGVvZiBwcm9tcHQgPT09ICdmdW5jdGlvbicgPyBwcm9tcHQobG9jYXRpb24sIGFjdGlvbikgOiBwcm9tcHQ7XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGdldFVzZXJDb25maXJtYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRVc2VyQ29uZmlybWF0aW9uKHJlc3VsdCwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdBIGhpc3RvcnkgbmVlZHMgYSBnZXRVc2VyQ29uZmlybWF0aW9uIGZ1bmN0aW9uIGluIG9yZGVyIHRvIHVzZSBhIHByb21wdCBtZXNzYWdlJykgOiB2b2lkIDA7XG4gICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldHVybiBmYWxzZSBmcm9tIGEgdHJhbnNpdGlvbiBob29rIHRvIGNhbmNlbCB0aGUgdHJhbnNpdGlvbi5cbiAgICAgICAgY2FsbGJhY2socmVzdWx0ICE9PSBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcblxuICBmdW5jdGlvbiBhcHBlbmRMaXN0ZW5lcihmbikge1xuICAgIHZhciBpc0FjdGl2ZSA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBsaXN0ZW5lcigpIHtcbiAgICAgIGlmIChpc0FjdGl2ZSkgZm4uYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGxpc3RlbmVyO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeUxpc3RlbmVycygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2V0UHJvbXB0OiBzZXRQcm9tcHQsXG4gICAgY29uZmlybVRyYW5zaXRpb25UbzogY29uZmlybVRyYW5zaXRpb25UbyxcbiAgICBhcHBlbmRMaXN0ZW5lcjogYXBwZW5kTGlzdGVuZXIsXG4gICAgbm90aWZ5TGlzdGVuZXJzOiBub3RpZnlMaXN0ZW5lcnNcbiAgfTtcbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5mdW5jdGlvbiBnZXRDb25maXJtYXRpb24obWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sod2luZG93LmNvbmZpcm0obWVzc2FnZSkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWFsZXJ0XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSFRNTDUgaGlzdG9yeSBBUEkgaXMgc3VwcG9ydGVkLiBUYWtlbiBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvaGlzdG9yeS5qc1xuICogY2hhbmdlZCB0byBhdm9pZCBmYWxzZSBuZWdhdGl2ZXMgZm9yIFdpbmRvd3MgUGhvbmVzOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1yb3V0ZXIvaXNzdWVzLzU4NlxuICovXG5cbmZ1bmN0aW9uIHN1cHBvcnRzSGlzdG9yeSgpIHtcbiAgdmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIGlmICgodWEuaW5kZXhPZignQW5kcm9pZCAyLicpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdBbmRyb2lkIDQuMCcpICE9PSAtMSkgJiYgdWEuaW5kZXhPZignTW9iaWxlIFNhZmFyaScpICE9PSAtMSAmJiB1YS5pbmRleE9mKCdDaHJvbWUnKSA9PT0gLTEgJiYgdWEuaW5kZXhPZignV2luZG93cyBQaG9uZScpID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gd2luZG93Lmhpc3RvcnkgJiYgJ3B1c2hTdGF0ZScgaW4gd2luZG93Lmhpc3Rvcnk7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBicm93c2VyIGZpcmVzIHBvcHN0YXRlIG9uIGhhc2ggY2hhbmdlLlxuICogSUUxMCBhbmQgSUUxMSBkbyBub3QuXG4gKi9cblxuZnVuY3Rpb24gc3VwcG9ydHNQb3BTdGF0ZU9uSGFzaENoYW5nZSgpIHtcbiAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSA9PT0gLTE7XG59XG4vKipcbiAqIFJldHVybnMgZmFsc2UgaWYgdXNpbmcgZ28obikgd2l0aCBoYXNoIGhpc3RvcnkgY2F1c2VzIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAqL1xuXG5mdW5jdGlvbiBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaCgpIHtcbiAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA9PT0gLTE7XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIHBvcHN0YXRlIGV2ZW50IGlzIGFuIGV4dHJhbmVvdXMgV2ViS2l0IGV2ZW50LlxuICogQWNjb3VudHMgZm9yIHRoZSBmYWN0IHRoYXQgQ2hyb21lIG9uIGlPUyBmaXJlcyByZWFsIHBvcHN0YXRlIGV2ZW50c1xuICogY29udGFpbmluZyB1bmRlZmluZWQgc3RhdGUgd2hlbiBwcmVzc2luZyB0aGUgYmFjayBidXR0b24uXG4gKi9cblxuZnVuY3Rpb24gaXNFeHRyYW5lb3VzUG9wc3RhdGVFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQuc3RhdGUgPT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0NyaU9TJykgPT09IC0xO1xufVxuXG52YXIgUG9wU3RhdGVFdmVudCA9ICdwb3BzdGF0ZSc7XG52YXIgSGFzaENoYW5nZUV2ZW50ID0gJ2hhc2hjaGFuZ2UnO1xuXG5mdW5jdGlvbiBnZXRIaXN0b3J5U3RhdGUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5oaXN0b3J5LnN0YXRlIHx8IHt9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUgMTEgc29tZXRpbWVzIHRocm93cyB3aGVuIGFjY2Vzc2luZyB3aW5kb3cuaGlzdG9yeS5zdGF0ZVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RUcmFpbmluZy9oaXN0b3J5L3B1bGwvMjg5XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBoaXN0b3J5IG9iamVjdCB0aGF0IHVzZXMgdGhlIEhUTUw1IGhpc3RvcnkgQVBJIGluY2x1ZGluZ1xuICogcHVzaFN0YXRlLCByZXBsYWNlU3RhdGUsIGFuZCB0aGUgcG9wc3RhdGUgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VySGlzdG9yeShwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cblxuICAhY2FuVXNlRE9NID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnQnJvd3NlciBoaXN0b3J5IG5lZWRzIGEgRE9NJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB2YXIgZ2xvYmFsSGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5O1xuICB2YXIgY2FuVXNlSGlzdG9yeSA9IHN1cHBvcnRzSGlzdG9yeSgpO1xuICB2YXIgbmVlZHNIYXNoQ2hhbmdlTGlzdGVuZXIgPSAhc3VwcG9ydHNQb3BTdGF0ZU9uSGFzaENoYW5nZSgpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBfcHJvcHMkZm9yY2VSZWZyZXNoID0gX3Byb3BzLmZvcmNlUmVmcmVzaCxcbiAgICAgIGZvcmNlUmVmcmVzaCA9IF9wcm9wcyRmb3JjZVJlZnJlc2ggPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGZvcmNlUmVmcmVzaCxcbiAgICAgIF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9IF9wcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxuICAgICAgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IF9wcm9wcyRnZXRVc2VyQ29uZmlybSA9PT0gdm9pZCAwID8gZ2V0Q29uZmlybWF0aW9uIDogX3Byb3BzJGdldFVzZXJDb25maXJtLFxuICAgICAgX3Byb3BzJGtleUxlbmd0aCA9IF9wcm9wcy5rZXlMZW5ndGgsXG4gICAgICBrZXlMZW5ndGggPSBfcHJvcHMka2V5TGVuZ3RoID09PSB2b2lkIDAgPyA2IDogX3Byb3BzJGtleUxlbmd0aDtcbiAgdmFyIGJhc2VuYW1lID0gcHJvcHMuYmFzZW5hbWUgPyBzdHJpcFRyYWlsaW5nU2xhc2goYWRkTGVhZGluZ1NsYXNoKHByb3BzLmJhc2VuYW1lKSkgOiAnJztcblxuICBmdW5jdGlvbiBnZXRET01Mb2NhdGlvbihoaXN0b3J5U3RhdGUpIHtcbiAgICB2YXIgX3JlZiA9IGhpc3RvcnlTdGF0ZSB8fCB7fSxcbiAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTtcblxuICAgIHZhciBfd2luZG93JGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSA9IF93aW5kb3ckbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaCA9IF93aW5kb3ckbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBoYXNoID0gX3dpbmRvdyRsb2NhdGlvbi5oYXNoO1xuICAgIHZhciBwYXRoID0gcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWJhc2VuYW1lIHx8IGhhc0Jhc2VuYW1lKHBhdGgsIGJhc2VuYW1lKSwgJ1lvdSBhcmUgYXR0ZW1wdGluZyB0byB1c2UgYSBiYXNlbmFtZSBvbiBhIHBhZ2Ugd2hvc2UgVVJMIHBhdGggZG9lcyBub3QgYmVnaW4gJyArICd3aXRoIHRoZSBiYXNlbmFtZS4gRXhwZWN0ZWQgcGF0aCBcIicgKyBwYXRoICsgJ1wiIHRvIGJlZ2luIHdpdGggXCInICsgYmFzZW5hbWUgKyAnXCIuJykgOiB2b2lkIDA7XG4gICAgaWYgKGJhc2VuYW1lKSBwYXRoID0gc3RyaXBCYXNlbmFtZShwYXRoLCBiYXNlbmFtZSk7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHN0YXRlLCBrZXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwga2V5TGVuZ3RoKTtcbiAgfVxuXG4gIHZhciB0cmFuc2l0aW9uTWFuYWdlciA9IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyKCk7XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV4dFN0YXRlKSB7XG4gICAgX2V4dGVuZHMoaGlzdG9yeSwgbmV4dFN0YXRlKTtcblxuICAgIGhpc3RvcnkubGVuZ3RoID0gZ2xvYmFsSGlzdG9yeS5sZW5ndGg7XG4gICAgdHJhbnNpdGlvbk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKGhpc3RvcnkubG9jYXRpb24sIGhpc3RvcnkuYWN0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcFN0YXRlKGV2ZW50KSB7XG4gICAgLy8gSWdub3JlIGV4dHJhbmVvdXMgcG9wc3RhdGUgZXZlbnRzIGluIFdlYktpdC5cbiAgICBpZiAoaXNFeHRyYW5lb3VzUG9wc3RhdGVFdmVudChldmVudCkpIHJldHVybjtcbiAgICBoYW5kbGVQb3AoZ2V0RE9NTG9jYXRpb24oZXZlbnQuc3RhdGUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUhhc2hDaGFuZ2UoKSB7XG4gICAgaGFuZGxlUG9wKGdldERPTUxvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKSk7XG4gIH1cblxuICB2YXIgZm9yY2VOZXh0UG9wID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gaGFuZGxlUG9wKGxvY2F0aW9uKSB7XG4gICAgaWYgKGZvcmNlTmV4dFBvcCkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gZmFsc2U7XG4gICAgICBzZXRTdGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWN0aW9uID0gJ1BPUCc7XG4gICAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldmVydFBvcChsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJldmVydFBvcChmcm9tTG9jYXRpb24pIHtcbiAgICB2YXIgdG9Mb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247IC8vIFRPRE86IFdlIGNvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyBtb3JlIHJlbGlhYmxlIGJ5XG4gICAgLy8ga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyB3ZSd2ZSBzZWVuIGluIHNlc3Npb25TdG9yYWdlLlxuICAgIC8vIEluc3RlYWQsIHdlIGp1c3QgZGVmYXVsdCB0byAwIGZvciBrZXlzIHdlIGRvbid0IGtub3cuXG5cbiAgICB2YXIgdG9JbmRleCA9IGFsbEtleXMuaW5kZXhPZih0b0xvY2F0aW9uLmtleSk7XG4gICAgaWYgKHRvSW5kZXggPT09IC0xKSB0b0luZGV4ID0gMDtcbiAgICB2YXIgZnJvbUluZGV4ID0gYWxsS2V5cy5pbmRleE9mKGZyb21Mb2NhdGlvbi5rZXkpO1xuICAgIGlmIChmcm9tSW5kZXggPT09IC0xKSBmcm9tSW5kZXggPSAwO1xuICAgIHZhciBkZWx0YSA9IHRvSW5kZXggLSBmcm9tSW5kZXg7XG5cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIGZvcmNlTmV4dFBvcCA9IHRydWU7XG4gICAgICBnbyhkZWx0YSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IGdldERPTUxvY2F0aW9uKGdldEhpc3RvcnlTdGF0ZSgpKTtcbiAgdmFyIGFsbEtleXMgPSBbaW5pdGlhbExvY2F0aW9uLmtleV07IC8vIFB1YmxpYyBpbnRlcmZhY2VcblxuICBmdW5jdGlvbiBjcmVhdGVIcmVmKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIGJhc2VuYW1lICsgY3JlYXRlUGF0aChsb2NhdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBwdXNoKHBhdGgsIHN0YXRlKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byBwdXNoIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpIDogdm9pZCAwO1xuICAgIHZhciBhY3Rpb24gPSAnUFVTSCc7XG4gICAgdmFyIGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24ocGF0aCwgc3RhdGUsIGNyZWF0ZUtleSgpLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuICAgICAgdmFyIGhyZWYgPSBjcmVhdGVIcmVmKGxvY2F0aW9uKTtcbiAgICAgIHZhciBrZXkgPSBsb2NhdGlvbi5rZXksXG4gICAgICAgICAgc3RhdGUgPSBsb2NhdGlvbi5zdGF0ZTtcblxuICAgICAgaWYgKGNhblVzZUhpc3RvcnkpIHtcbiAgICAgICAgZ2xvYmFsSGlzdG9yeS5wdXNoU3RhdGUoe1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZVxuICAgICAgICB9LCBudWxsLCBocmVmKTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2SW5kZXggPSBhbGxLZXlzLmluZGV4T2YoaGlzdG9yeS5sb2NhdGlvbi5rZXkpO1xuICAgICAgICAgIHZhciBuZXh0S2V5cyA9IGFsbEtleXMuc2xpY2UoMCwgcHJldkluZGV4ICsgMSk7XG4gICAgICAgICAgbmV4dEtleXMucHVzaChsb2NhdGlvbi5rZXkpO1xuICAgICAgICAgIGFsbEtleXMgPSBuZXh0S2V5cztcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHN0YXRlID09PSB1bmRlZmluZWQsICdCcm93c2VyIGhpc3RvcnkgY2Fubm90IHB1c2ggc3RhdGUgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVE1MNSBoaXN0b3J5JykgOiB2b2lkIDA7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2UocGF0aCwgc3RhdGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodHlwZW9mIHBhdGggPT09ICdvYmplY3QnICYmIHBhdGguc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gdW5kZWZpbmVkKSwgJ1lvdSBzaG91bGQgYXZvaWQgcHJvdmlkaW5nIGEgMm5kIHN0YXRlIGFyZ3VtZW50IHRvIHJlcGxhY2Ugd2hlbiB0aGUgMXN0ICcgKyAnYXJndW1lbnQgaXMgYSBsb2NhdGlvbi1saWtlIG9iamVjdCB0aGF0IGFscmVhZHkgaGFzIHN0YXRlOyBpdCBpcyBpZ25vcmVkJykgOiB2b2lkIDA7XG4gICAgdmFyIGFjdGlvbiA9ICdSRVBMQUNFJztcbiAgICB2YXIgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihwYXRoLCBzdGF0ZSwgY3JlYXRlS2V5KCksIGhpc3RvcnkubG9jYXRpb24pO1xuICAgIHRyYW5zaXRpb25NYW5hZ2VyLmNvbmZpcm1UcmFuc2l0aW9uVG8obG9jYXRpb24sIGFjdGlvbiwgZ2V0VXNlckNvbmZpcm1hdGlvbiwgZnVuY3Rpb24gKG9rKSB7XG4gICAgICBpZiAoIW9rKSByZXR1cm47XG4gICAgICB2YXIgaHJlZiA9IGNyZWF0ZUhyZWYobG9jYXRpb24pO1xuICAgICAgdmFyIGtleSA9IGxvY2F0aW9uLmtleSxcbiAgICAgICAgICBzdGF0ZSA9IGxvY2F0aW9uLnN0YXRlO1xuXG4gICAgICBpZiAoY2FuVXNlSGlzdG9yeSkge1xuICAgICAgICBnbG9iYWxIaXN0b3J5LnJlcGxhY2VTdGF0ZSh7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0sIG51bGwsIGhyZWYpO1xuXG4gICAgICAgIGlmIChmb3JjZVJlZnJlc2gpIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShocmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJldkluZGV4ID0gYWxsS2V5cy5pbmRleE9mKGhpc3RvcnkubG9jYXRpb24ua2V5KTtcbiAgICAgICAgICBpZiAocHJldkluZGV4ICE9PSAtMSkgYWxsS2V5c1twcmV2SW5kZXhdID0gbG9jYXRpb24ua2V5O1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoc3RhdGUgPT09IHVuZGVmaW5lZCwgJ0Jyb3dzZXIgaGlzdG9yeSBjYW5ub3QgcmVwbGFjZSBzdGF0ZSBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IEhUTUw1IGhpc3RvcnknKSA6IHZvaWQgMDtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoaHJlZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnbyhuKSB7XG4gICAgZ2xvYmFsSGlzdG9yeS5nbyhuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvQmFjaygpIHtcbiAgICBnbygtMSk7XG4gIH1cblxuICBmdW5jdGlvbiBnb0ZvcndhcmQoKSB7XG4gICAgZ28oMSk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJDb3VudCA9IDA7XG5cbiAgZnVuY3Rpb24gY2hlY2tET01MaXN0ZW5lcnMoZGVsdGEpIHtcbiAgICBsaXN0ZW5lckNvdW50ICs9IGRlbHRhO1xuXG4gICAgaWYgKGxpc3RlbmVyQ291bnQgPT09IDEgJiYgZGVsdGEgPT09IDEpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFBvcFN0YXRlRXZlbnQsIGhhbmRsZVBvcFN0YXRlKTtcbiAgICAgIGlmIChuZWVkc0hhc2hDaGFuZ2VMaXN0ZW5lcikgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSGFzaENoYW5nZUV2ZW50LCBoYW5kbGVIYXNoQ2hhbmdlKTtcbiAgICB9IGVsc2UgaWYgKGxpc3RlbmVyQ291bnQgPT09IDApIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFBvcFN0YXRlRXZlbnQsIGhhbmRsZVBvcFN0YXRlKTtcbiAgICAgIGlmIChuZWVkc0hhc2hDaGFuZ2VMaXN0ZW5lcikgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoSGFzaENoYW5nZUV2ZW50LCBoYW5kbGVIYXNoQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNCbG9ja2VkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gYmxvY2socHJvbXB0KSB7XG4gICAgaWYgKHByb21wdCA9PT0gdm9pZCAwKSB7XG4gICAgICBwcm9tcHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdW5ibG9jayA9IHRyYW5zaXRpb25NYW5hZ2VyLnNldFByb21wdChwcm9tcHQpO1xuXG4gICAgaWYgKCFpc0Jsb2NrZWQpIHtcbiAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKDEpO1xuICAgICAgaXNCbG9ja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGlzQmxvY2tlZCkge1xuICAgICAgICBpc0Jsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgY2hlY2tET01MaXN0ZW5lcnMoLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5ibG9jaygpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0ZW4obGlzdGVuZXIpIHtcbiAgICB2YXIgdW5saXN0ZW4gPSB0cmFuc2l0aW9uTWFuYWdlci5hcHBlbmRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrRE9NTGlzdGVuZXJzKC0xKTtcbiAgICAgIHVubGlzdGVuKCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBoaXN0b3J5ID0ge1xuICAgIGxlbmd0aDogZ2xvYmFsSGlzdG9yeS5sZW5ndGgsXG4gICAgYWN0aW9uOiAnUE9QJyxcbiAgICBsb2NhdGlvbjogaW5pdGlhbExvY2F0aW9uLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBibG9jazogYmxvY2ssXG4gICAgbGlzdGVuOiBsaXN0ZW5cbiAgfTtcbiAgcmV0dXJuIGhpc3Rvcnk7XG59XG5cbnZhciBIYXNoQ2hhbmdlRXZlbnQkMSA9ICdoYXNoY2hhbmdlJztcbnZhciBIYXNoUGF0aENvZGVycyA9IHtcbiAgaGFzaGJhbmc6IHtcbiAgICBlbmNvZGVQYXRoOiBmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJyEnID8gcGF0aCA6ICchLycgKyBzdHJpcExlYWRpbmdTbGFzaChwYXRoKTtcbiAgICB9LFxuICAgIGRlY29kZVBhdGg6IGZ1bmN0aW9uIGRlY29kZVBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnIScgPyBwYXRoLnN1YnN0cigxKSA6IHBhdGg7XG4gICAgfVxuICB9LFxuICBub3NsYXNoOiB7XG4gICAgZW5jb2RlUGF0aDogc3RyaXBMZWFkaW5nU2xhc2gsXG4gICAgZGVjb2RlUGF0aDogYWRkTGVhZGluZ1NsYXNoXG4gIH0sXG4gIHNsYXNoOiB7XG4gICAgZW5jb2RlUGF0aDogYWRkTGVhZGluZ1NsYXNoLFxuICAgIGRlY29kZVBhdGg6IGFkZExlYWRpbmdTbGFzaFxuICB9XG59O1xuXG5mdW5jdGlvbiBzdHJpcEhhc2godXJsKSB7XG4gIHZhciBoYXNoSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICByZXR1cm4gaGFzaEluZGV4ID09PSAtMSA/IHVybCA6IHVybC5zbGljZSgwLCBoYXNoSW5kZXgpO1xufVxuXG5mdW5jdGlvbiBnZXRIYXNoUGF0aCgpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGhlcmUgYmVjYXVzZSBpdCdzIG5vdFxuICAvLyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyAtIEZpcmVmb3ggd2lsbCBwcmUtZGVjb2RlIGl0IVxuICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB2YXIgaGFzaEluZGV4ID0gaHJlZi5pbmRleE9mKCcjJyk7XG4gIHJldHVybiBoYXNoSW5kZXggPT09IC0xID8gJycgOiBocmVmLnN1YnN0cmluZyhoYXNoSW5kZXggKyAxKTtcbn1cblxuZnVuY3Rpb24gcHVzaEhhc2hQYXRoKHBhdGgpIHtcbiAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBwYXRoO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzaFBhdGgocGF0aCkge1xuICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShzdHJpcEhhc2god2luZG93LmxvY2F0aW9uLmhyZWYpICsgJyMnICsgcGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhhc2hIaXN0b3J5KHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuXG4gICFjYW5Vc2VET00gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdIYXNoIGhpc3RvcnkgbmVlZHMgYSBET00nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHZhciBnbG9iYWxIaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gIHZhciBjYW5Hb1dpdGhvdXRSZWxvYWQgPSBzdXBwb3J0c0dvV2l0aG91dFJlbG9hZFVzaW5nSGFzaCgpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBfcHJvcHMkZ2V0VXNlckNvbmZpcm0gPSBfcHJvcHMuZ2V0VXNlckNvbmZpcm1hdGlvbixcbiAgICAgIGdldFVzZXJDb25maXJtYXRpb24gPSBfcHJvcHMkZ2V0VXNlckNvbmZpcm0gPT09IHZvaWQgMCA/IGdldENvbmZpcm1hdGlvbiA6IF9wcm9wcyRnZXRVc2VyQ29uZmlybSxcbiAgICAgIF9wcm9wcyRoYXNoVHlwZSA9IF9wcm9wcy5oYXNoVHlwZSxcbiAgICAgIGhhc2hUeXBlID0gX3Byb3BzJGhhc2hUeXBlID09PSB2b2lkIDAgPyAnc2xhc2gnIDogX3Byb3BzJGhhc2hUeXBlO1xuICB2YXIgYmFzZW5hbWUgPSBwcm9wcy5iYXNlbmFtZSA/IHN0cmlwVHJhaWxpbmdTbGFzaChhZGRMZWFkaW5nU2xhc2gocHJvcHMuYmFzZW5hbWUpKSA6ICcnO1xuICB2YXIgX0hhc2hQYXRoQ29kZXJzJGhhc2hUID0gSGFzaFBhdGhDb2RlcnNbaGFzaFR5cGVdLFxuICAgICAgZW5jb2RlUGF0aCA9IF9IYXNoUGF0aENvZGVycyRoYXNoVC5lbmNvZGVQYXRoLFxuICAgICAgZGVjb2RlUGF0aCA9IF9IYXNoUGF0aENvZGVycyRoYXNoVC5kZWNvZGVQYXRoO1xuXG4gIGZ1bmN0aW9uIGdldERPTUxvY2F0aW9uKCkge1xuICAgIHZhciBwYXRoID0gZGVjb2RlUGF0aChnZXRIYXNoUGF0aCgpKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFiYXNlbmFtZSB8fCBoYXNCYXNlbmFtZShwYXRoLCBiYXNlbmFtZSksICdZb3UgYXJlIGF0dGVtcHRpbmcgdG8gdXNlIGEgYmFzZW5hbWUgb24gYSBwYWdlIHdob3NlIFVSTCBwYXRoIGRvZXMgbm90IGJlZ2luICcgKyAnd2l0aCB0aGUgYmFzZW5hbWUuIEV4cGVjdGVkIHBhdGggXCInICsgcGF0aCArICdcIiB0byBiZWdpbiB3aXRoIFwiJyArIGJhc2VuYW1lICsgJ1wiLicpIDogdm9pZCAwO1xuICAgIGlmIChiYXNlbmFtZSkgcGF0aCA9IHN0cmlwQmFzZW5hbWUocGF0aCwgYmFzZW5hbWUpO1xuICAgIHJldHVybiBjcmVhdGVMb2NhdGlvbihwYXRoKTtcbiAgfVxuXG4gIHZhciB0cmFuc2l0aW9uTWFuYWdlciA9IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyKCk7XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV4dFN0YXRlKSB7XG4gICAgX2V4dGVuZHMoaGlzdG9yeSwgbmV4dFN0YXRlKTtcblxuICAgIGhpc3RvcnkubGVuZ3RoID0gZ2xvYmFsSGlzdG9yeS5sZW5ndGg7XG4gICAgdHJhbnNpdGlvbk1hbmFnZXIubm90aWZ5TGlzdGVuZXJzKGhpc3RvcnkubG9jYXRpb24sIGhpc3RvcnkuYWN0aW9uKTtcbiAgfVxuXG4gIHZhciBmb3JjZU5leHRQb3AgPSBmYWxzZTtcbiAgdmFyIGlnbm9yZVBhdGggPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGxvY2F0aW9uc0FyZUVxdWFsJCQxKGEsIGIpIHtcbiAgICByZXR1cm4gYS5wYXRobmFtZSA9PT0gYi5wYXRobmFtZSAmJiBhLnNlYXJjaCA9PT0gYi5zZWFyY2ggJiYgYS5oYXNoID09PSBiLmhhc2g7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVIYXNoQ2hhbmdlKCkge1xuICAgIHZhciBwYXRoID0gZ2V0SGFzaFBhdGgoKTtcbiAgICB2YXIgZW5jb2RlZFBhdGggPSBlbmNvZGVQYXRoKHBhdGgpO1xuXG4gICAgaWYgKHBhdGggIT09IGVuY29kZWRQYXRoKSB7XG4gICAgICAvLyBFbnN1cmUgd2UgYWx3YXlzIGhhdmUgYSBwcm9wZXJseS1lbmNvZGVkIGhhc2guXG4gICAgICByZXBsYWNlSGFzaFBhdGgoZW5jb2RlZFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbG9jYXRpb24gPSBnZXRET01Mb2NhdGlvbigpO1xuICAgICAgdmFyIHByZXZMb2NhdGlvbiA9IGhpc3RvcnkubG9jYXRpb247XG4gICAgICBpZiAoIWZvcmNlTmV4dFBvcCAmJiBsb2NhdGlvbnNBcmVFcXVhbCQkMShwcmV2TG9jYXRpb24sIGxvY2F0aW9uKSkgcmV0dXJuOyAvLyBBIGhhc2hjaGFuZ2UgZG9lc24ndCBhbHdheXMgPT0gbG9jYXRpb24gY2hhbmdlLlxuXG4gICAgICBpZiAoaWdub3JlUGF0aCA9PT0gY3JlYXRlUGF0aChsb2NhdGlvbikpIHJldHVybjsgLy8gSWdub3JlIHRoaXMgY2hhbmdlOyB3ZSBhbHJlYWR5IHNldFN0YXRlIGluIHB1c2gvcmVwbGFjZS5cblxuICAgICAgaWdub3JlUGF0aCA9IG51bGw7XG4gICAgICBoYW5kbGVQb3AobG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVBvcChsb2NhdGlvbikge1xuICAgIGlmIChmb3JjZU5leHRQb3ApIHtcbiAgICAgIGZvcmNlTmV4dFBvcCA9IGZhbHNlO1xuICAgICAgc2V0U3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFjdGlvbiA9ICdQT1AnO1xuICAgICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXZlcnRQb3AobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXZlcnRQb3AoZnJvbUxvY2F0aW9uKSB7XG4gICAgdmFyIHRvTG9jYXRpb24gPSBoaXN0b3J5LmxvY2F0aW9uOyAvLyBUT0RPOiBXZSBjb3VsZCBwcm9iYWJseSBtYWtlIHRoaXMgbW9yZSByZWxpYWJsZSBieVxuICAgIC8vIGtlZXBpbmcgYSBsaXN0IG9mIHBhdGhzIHdlJ3ZlIHNlZW4gaW4gc2Vzc2lvblN0b3JhZ2UuXG4gICAgLy8gSW5zdGVhZCwgd2UganVzdCBkZWZhdWx0IHRvIDAgZm9yIHBhdGhzIHdlIGRvbid0IGtub3cuXG5cbiAgICB2YXIgdG9JbmRleCA9IGFsbFBhdGhzLmxhc3RJbmRleE9mKGNyZWF0ZVBhdGgodG9Mb2NhdGlvbikpO1xuICAgIGlmICh0b0luZGV4ID09PSAtMSkgdG9JbmRleCA9IDA7XG4gICAgdmFyIGZyb21JbmRleCA9IGFsbFBhdGhzLmxhc3RJbmRleE9mKGNyZWF0ZVBhdGgoZnJvbUxvY2F0aW9uKSk7XG4gICAgaWYgKGZyb21JbmRleCA9PT0gLTEpIGZyb21JbmRleCA9IDA7XG4gICAgdmFyIGRlbHRhID0gdG9JbmRleCAtIGZyb21JbmRleDtcblxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZm9yY2VOZXh0UG9wID0gdHJ1ZTtcbiAgICAgIGdvKGRlbHRhKTtcbiAgICB9XG4gIH0gLy8gRW5zdXJlIHRoZSBoYXNoIGlzIGVuY29kZWQgcHJvcGVybHkgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuXG5cblxuICB2YXIgcGF0aCA9IGdldEhhc2hQYXRoKCk7XG4gIHZhciBlbmNvZGVkUGF0aCA9IGVuY29kZVBhdGgocGF0aCk7XG4gIGlmIChwYXRoICE9PSBlbmNvZGVkUGF0aCkgcmVwbGFjZUhhc2hQYXRoKGVuY29kZWRQYXRoKTtcbiAgdmFyIGluaXRpYWxMb2NhdGlvbiA9IGdldERPTUxvY2F0aW9uKCk7XG4gIHZhciBhbGxQYXRocyA9IFtjcmVhdGVQYXRoKGluaXRpYWxMb2NhdGlvbildOyAvLyBQdWJsaWMgaW50ZXJmYWNlXG5cbiAgZnVuY3Rpb24gY3JlYXRlSHJlZihsb2NhdGlvbikge1xuICAgIHZhciBiYXNlVGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xuICAgIHZhciBocmVmID0gJyc7XG5cbiAgICBpZiAoYmFzZVRhZyAmJiBiYXNlVGFnLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBocmVmID0gc3RyaXBIYXNoKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHJlZiArICcjJyArIGVuY29kZVBhdGgoYmFzZW5hbWUgKyBjcmVhdGVQYXRoKGxvY2F0aW9uKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwdXNoKHBhdGgsIHN0YXRlKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhzdGF0ZSA9PT0gdW5kZWZpbmVkLCAnSGFzaCBoaXN0b3J5IGNhbm5vdCBwdXNoIHN0YXRlOyBpdCBpcyBpZ25vcmVkJykgOiB2b2lkIDA7XG4gICAgdmFyIGFjdGlvbiA9ICdQVVNIJztcbiAgICB2YXIgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihwYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICAgIHZhciBwYXRoID0gY3JlYXRlUGF0aChsb2NhdGlvbik7XG4gICAgICB2YXIgZW5jb2RlZFBhdGggPSBlbmNvZGVQYXRoKGJhc2VuYW1lICsgcGF0aCk7XG4gICAgICB2YXIgaGFzaENoYW5nZWQgPSBnZXRIYXNoUGF0aCgpICE9PSBlbmNvZGVkUGF0aDtcblxuICAgICAgaWYgKGhhc2hDaGFuZ2VkKSB7XG4gICAgICAgIC8vIFdlIGNhbm5vdCB0ZWxsIGlmIGEgaGFzaGNoYW5nZSB3YXMgY2F1c2VkIGJ5IGEgUFVTSCwgc28gd2UnZFxuICAgICAgICAvLyByYXRoZXIgc2V0U3RhdGUgaGVyZSBhbmQgaWdub3JlIHRoZSBoYXNoY2hhbmdlLiBUaGUgY2F2ZWF0IGhlcmVcbiAgICAgICAgLy8gaXMgdGhhdCBvdGhlciBoYXNoIGhpc3RvcmllcyBpbiB0aGUgcGFnZSB3aWxsIGNvbnNpZGVyIGl0IGEgUE9QLlxuICAgICAgICBpZ25vcmVQYXRoID0gcGF0aDtcbiAgICAgICAgcHVzaEhhc2hQYXRoKGVuY29kZWRQYXRoKTtcbiAgICAgICAgdmFyIHByZXZJbmRleCA9IGFsbFBhdGhzLmxhc3RJbmRleE9mKGNyZWF0ZVBhdGgoaGlzdG9yeS5sb2NhdGlvbikpO1xuICAgICAgICB2YXIgbmV4dFBhdGhzID0gYWxsUGF0aHMuc2xpY2UoMCwgcHJldkluZGV4ICsgMSk7XG4gICAgICAgIG5leHRQYXRocy5wdXNoKHBhdGgpO1xuICAgICAgICBhbGxQYXRocyA9IG5leHRQYXRocztcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdIYXNoIGhpc3RvcnkgY2Fubm90IFBVU0ggdGhlIHNhbWUgcGF0aDsgYSBuZXcgZW50cnkgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIGhpc3Rvcnkgc3RhY2snKSA6IHZvaWQgMDtcbiAgICAgICAgc2V0U3RhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2UocGF0aCwgc3RhdGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHN0YXRlID09PSB1bmRlZmluZWQsICdIYXNoIGhpc3RvcnkgY2Fubm90IHJlcGxhY2Ugc3RhdGU7IGl0IGlzIGlnbm9yZWQnKSA6IHZvaWQgMDtcbiAgICB2YXIgYWN0aW9uID0gJ1JFUExBQ0UnO1xuICAgIHZhciBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuICAgICAgdmFyIHBhdGggPSBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcbiAgICAgIHZhciBlbmNvZGVkUGF0aCA9IGVuY29kZVBhdGgoYmFzZW5hbWUgKyBwYXRoKTtcbiAgICAgIHZhciBoYXNoQ2hhbmdlZCA9IGdldEhhc2hQYXRoKCkgIT09IGVuY29kZWRQYXRoO1xuXG4gICAgICBpZiAoaGFzaENoYW5nZWQpIHtcbiAgICAgICAgLy8gV2UgY2Fubm90IHRlbGwgaWYgYSBoYXNoY2hhbmdlIHdhcyBjYXVzZWQgYnkgYSBSRVBMQUNFLCBzbyB3ZSdkXG4gICAgICAgIC8vIHJhdGhlciBzZXRTdGF0ZSBoZXJlIGFuZCBpZ25vcmUgdGhlIGhhc2hjaGFuZ2UuIFRoZSBjYXZlYXQgaGVyZVxuICAgICAgICAvLyBpcyB0aGF0IG90aGVyIGhhc2ggaGlzdG9yaWVzIGluIHRoZSBwYWdlIHdpbGwgY29uc2lkZXIgaXQgYSBQT1AuXG4gICAgICAgIGlnbm9yZVBhdGggPSBwYXRoO1xuICAgICAgICByZXBsYWNlSGFzaFBhdGgoZW5jb2RlZFBhdGgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldkluZGV4ID0gYWxsUGF0aHMuaW5kZXhPZihjcmVhdGVQYXRoKGhpc3RvcnkubG9jYXRpb24pKTtcbiAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xKSBhbGxQYXRoc1twcmV2SW5kZXhdID0gcGF0aDtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnbyhuKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjYW5Hb1dpdGhvdXRSZWxvYWQsICdIYXNoIGhpc3RvcnkgZ28obikgY2F1c2VzIGEgZnVsbCBwYWdlIHJlbG9hZCBpbiB0aGlzIGJyb3dzZXInKSA6IHZvaWQgMDtcbiAgICBnbG9iYWxIaXN0b3J5LmdvKG4pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xuICAgIGdvKC0xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvRm9yd2FyZCgpIHtcbiAgICBnbygxKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lckNvdW50ID0gMDtcblxuICBmdW5jdGlvbiBjaGVja0RPTUxpc3RlbmVycyhkZWx0YSkge1xuICAgIGxpc3RlbmVyQ291bnQgKz0gZGVsdGE7XG5cbiAgICBpZiAobGlzdGVuZXJDb3VudCA9PT0gMSAmJiBkZWx0YSA9PT0gMSkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSGFzaENoYW5nZUV2ZW50JDEsIGhhbmRsZUhhc2hDaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAobGlzdGVuZXJDb3VudCA9PT0gMCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoSGFzaENoYW5nZUV2ZW50JDEsIGhhbmRsZUhhc2hDaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0Jsb2NrZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBibG9jayhwcm9tcHQpIHtcbiAgICBpZiAocHJvbXB0ID09PSB2b2lkIDApIHtcbiAgICAgIHByb21wdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB1bmJsb2NrID0gdHJhbnNpdGlvbk1hbmFnZXIuc2V0UHJvbXB0KHByb21wdCk7XG5cbiAgICBpZiAoIWlzQmxvY2tlZCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoMSk7XG4gICAgICBpc0Jsb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNCbG9ja2VkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICBjaGVja0RPTUxpc3RlbmVycygtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmJsb2NrKCk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgIHZhciB1bmxpc3RlbiA9IHRyYW5zaXRpb25NYW5hZ2VyLmFwcGVuZExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICBjaGVja0RPTUxpc3RlbmVycygxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2hlY2tET01MaXN0ZW5lcnMoLTEpO1xuICAgICAgdW5saXN0ZW4oKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGhpc3RvcnkgPSB7XG4gICAgbGVuZ3RoOiBnbG9iYWxIaXN0b3J5Lmxlbmd0aCxcbiAgICBhY3Rpb246ICdQT1AnLFxuICAgIGxvY2F0aW9uOiBpbml0aWFsTG9jYXRpb24sXG4gICAgY3JlYXRlSHJlZjogY3JlYXRlSHJlZixcbiAgICBwdXNoOiBwdXNoLFxuICAgIHJlcGxhY2U6IHJlcGxhY2UsXG4gICAgZ286IGdvLFxuICAgIGdvQmFjazogZ29CYWNrLFxuICAgIGdvRm9yd2FyZDogZ29Gb3J3YXJkLFxuICAgIGJsb2NrOiBibG9jayxcbiAgICBsaXN0ZW46IGxpc3RlblxuICB9O1xuICByZXR1cm4gaGlzdG9yeTtcbn1cblxuZnVuY3Rpb24gY2xhbXAobiwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZCkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobiwgbG93ZXJCb3VuZCksIHVwcGVyQm91bmQpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgaGlzdG9yeSBvYmplY3QgdGhhdCBzdG9yZXMgbG9jYXRpb25zIGluIG1lbW9yeS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUhpc3RvcnkocHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG5cbiAgdmFyIF9wcm9wcyA9IHByb3BzLFxuICAgICAgZ2V0VXNlckNvbmZpcm1hdGlvbiA9IF9wcm9wcy5nZXRVc2VyQ29uZmlybWF0aW9uLFxuICAgICAgX3Byb3BzJGluaXRpYWxFbnRyaWVzID0gX3Byb3BzLmluaXRpYWxFbnRyaWVzLFxuICAgICAgaW5pdGlhbEVudHJpZXMgPSBfcHJvcHMkaW5pdGlhbEVudHJpZXMgPT09IHZvaWQgMCA/IFsnLyddIDogX3Byb3BzJGluaXRpYWxFbnRyaWVzLFxuICAgICAgX3Byb3BzJGluaXRpYWxJbmRleCA9IF9wcm9wcy5pbml0aWFsSW5kZXgsXG4gICAgICBpbml0aWFsSW5kZXggPSBfcHJvcHMkaW5pdGlhbEluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJGluaXRpYWxJbmRleCxcbiAgICAgIF9wcm9wcyRrZXlMZW5ndGggPSBfcHJvcHMua2V5TGVuZ3RoLFxuICAgICAga2V5TGVuZ3RoID0gX3Byb3BzJGtleUxlbmd0aCA9PT0gdm9pZCAwID8gNiA6IF9wcm9wcyRrZXlMZW5ndGg7XG4gIHZhciB0cmFuc2l0aW9uTWFuYWdlciA9IGNyZWF0ZVRyYW5zaXRpb25NYW5hZ2VyKCk7XG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV4dFN0YXRlKSB7XG4gICAgX2V4dGVuZHMoaGlzdG9yeSwgbmV4dFN0YXRlKTtcblxuICAgIGhpc3RvcnkubGVuZ3RoID0gaGlzdG9yeS5lbnRyaWVzLmxlbmd0aDtcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5ub3RpZnlMaXN0ZW5lcnMoaGlzdG9yeS5sb2NhdGlvbiwgaGlzdG9yeS5hY3Rpb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlS2V5KCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwga2V5TGVuZ3RoKTtcbiAgfVxuXG4gIHZhciBpbmRleCA9IGNsYW1wKGluaXRpYWxJbmRleCwgMCwgaW5pdGlhbEVudHJpZXMubGVuZ3RoIC0gMSk7XG4gIHZhciBlbnRyaWVzID0gaW5pdGlhbEVudHJpZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gY3JlYXRlTG9jYXRpb24oZW50cnksIHVuZGVmaW5lZCwgY3JlYXRlS2V5KCkpIDogY3JlYXRlTG9jYXRpb24oZW50cnksIHVuZGVmaW5lZCwgZW50cnkua2V5IHx8IGNyZWF0ZUtleSgpKTtcbiAgfSk7IC8vIFB1YmxpYyBpbnRlcmZhY2VcblxuICB2YXIgY3JlYXRlSHJlZiA9IGNyZWF0ZVBhdGg7XG5cbiAgZnVuY3Rpb24gcHVzaChwYXRoLCBzdGF0ZSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISh0eXBlb2YgcGF0aCA9PT0gJ29iamVjdCcgJiYgcGF0aC5zdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXRlICE9PSB1bmRlZmluZWQpLCAnWW91IHNob3VsZCBhdm9pZCBwcm92aWRpbmcgYSAybmQgc3RhdGUgYXJndW1lbnQgdG8gcHVzaCB3aGVuIHRoZSAxc3QgJyArICdhcmd1bWVudCBpcyBhIGxvY2F0aW9uLWxpa2Ugb2JqZWN0IHRoYXQgYWxyZWFkeSBoYXMgc3RhdGU7IGl0IGlzIGlnbm9yZWQnKSA6IHZvaWQgMDtcbiAgICB2YXIgYWN0aW9uID0gJ1BVU0gnO1xuICAgIHZhciBsb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHBhdGgsIHN0YXRlLCBjcmVhdGVLZXkoKSwgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgdHJhbnNpdGlvbk1hbmFnZXIuY29uZmlybVRyYW5zaXRpb25Ubyhsb2NhdGlvbiwgYWN0aW9uLCBnZXRVc2VyQ29uZmlybWF0aW9uLCBmdW5jdGlvbiAob2spIHtcbiAgICAgIGlmICghb2spIHJldHVybjtcbiAgICAgIHZhciBwcmV2SW5kZXggPSBoaXN0b3J5LmluZGV4O1xuICAgICAgdmFyIG5leHRJbmRleCA9IHByZXZJbmRleCArIDE7XG4gICAgICB2YXIgbmV4dEVudHJpZXMgPSBoaXN0b3J5LmVudHJpZXMuc2xpY2UoMCk7XG5cbiAgICAgIGlmIChuZXh0RW50cmllcy5sZW5ndGggPiBuZXh0SW5kZXgpIHtcbiAgICAgICAgbmV4dEVudHJpZXMuc3BsaWNlKG5leHRJbmRleCwgbmV4dEVudHJpZXMubGVuZ3RoIC0gbmV4dEluZGV4LCBsb2NhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0RW50cmllcy5wdXNoKGxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBpbmRleDogbmV4dEluZGV4LFxuICAgICAgICBlbnRyaWVzOiBuZXh0RW50cmllc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXBsYWNlKHBhdGgsIHN0YXRlKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiBwYXRoID09PSAnb2JqZWN0JyAmJiBwYXRoLnN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IHVuZGVmaW5lZCksICdZb3Ugc2hvdWxkIGF2b2lkIHByb3ZpZGluZyBhIDJuZCBzdGF0ZSBhcmd1bWVudCB0byByZXBsYWNlIHdoZW4gdGhlIDFzdCAnICsgJ2FyZ3VtZW50IGlzIGEgbG9jYXRpb24tbGlrZSBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBzdGF0ZTsgaXQgaXMgaWdub3JlZCcpIDogdm9pZCAwO1xuICAgIHZhciBhY3Rpb24gPSAnUkVQTEFDRSc7XG4gICAgdmFyIGxvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24ocGF0aCwgc3RhdGUsIGNyZWF0ZUtleSgpLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKCFvaykgcmV0dXJuO1xuICAgICAgaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuaW5kZXhdID0gbG9jYXRpb247XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ28obikge1xuICAgIHZhciBuZXh0SW5kZXggPSBjbGFtcChoaXN0b3J5LmluZGV4ICsgbiwgMCwgaGlzdG9yeS5lbnRyaWVzLmxlbmd0aCAtIDEpO1xuICAgIHZhciBhY3Rpb24gPSAnUE9QJztcbiAgICB2YXIgbG9jYXRpb24gPSBoaXN0b3J5LmVudHJpZXNbbmV4dEluZGV4XTtcbiAgICB0cmFuc2l0aW9uTWFuYWdlci5jb25maXJtVHJhbnNpdGlvblRvKGxvY2F0aW9uLCBhY3Rpb24sIGdldFVzZXJDb25maXJtYXRpb24sIGZ1bmN0aW9uIChvaykge1xuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAgICAgaW5kZXg6IG5leHRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1pbWljIHRoZSBiZWhhdmlvciBvZiBET00gaGlzdG9yaWVzIGJ5XG4gICAgICAgIC8vIGNhdXNpbmcgYSByZW5kZXIgYWZ0ZXIgYSBjYW5jZWxsZWQgUE9QLlxuICAgICAgICBzZXRTdGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ29CYWNrKCkge1xuICAgIGdvKC0xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvRm9yd2FyZCgpIHtcbiAgICBnbygxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbkdvKG4pIHtcbiAgICB2YXIgbmV4dEluZGV4ID0gaGlzdG9yeS5pbmRleCArIG47XG4gICAgcmV0dXJuIG5leHRJbmRleCA+PSAwICYmIG5leHRJbmRleCA8IGhpc3RvcnkuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBibG9jayhwcm9tcHQpIHtcbiAgICBpZiAocHJvbXB0ID09PSB2b2lkIDApIHtcbiAgICAgIHByb21wdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2l0aW9uTWFuYWdlci5zZXRQcm9tcHQocHJvbXB0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbihsaXN0ZW5lcikge1xuICAgIHJldHVybiB0cmFuc2l0aW9uTWFuYWdlci5hcHBlbmRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIH1cblxuICB2YXIgaGlzdG9yeSA9IHtcbiAgICBsZW5ndGg6IGVudHJpZXMubGVuZ3RoLFxuICAgIGFjdGlvbjogJ1BPUCcsXG4gICAgbG9jYXRpb246IGVudHJpZXNbaW5kZXhdLFxuICAgIGluZGV4OiBpbmRleCxcbiAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgIGNyZWF0ZUhyZWY6IGNyZWF0ZUhyZWYsXG4gICAgcHVzaDogcHVzaCxcbiAgICByZXBsYWNlOiByZXBsYWNlLFxuICAgIGdvOiBnbyxcbiAgICBnb0JhY2s6IGdvQmFjayxcbiAgICBnb0ZvcndhcmQ6IGdvRm9yd2FyZCxcbiAgICBjYW5HbzogY2FuR28sXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIGxpc3RlbjogbGlzdGVuXG4gIH07XG4gIHJldHVybiBoaXN0b3J5O1xufVxuXG5leHBvcnQgeyBjcmVhdGVCcm93c2VySGlzdG9yeSwgY3JlYXRlSGFzaEhpc3RvcnksIGNyZWF0ZU1lbW9yeUhpc3RvcnksIGNyZWF0ZUxvY2F0aW9uLCBsb2NhdGlvbnNBcmVFcXVhbCwgcGFyc2VQYXRoLCBjcmVhdGVQYXRoIH07XG4iLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeUhpc3RvcnksIGNyZWF0ZUxvY2F0aW9uLCBsb2NhdGlvbnNBcmVFcXVhbCwgY3JlYXRlUGF0aCB9IGZyb20gJ2hpc3RvcnknO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAndGlueS13YXJuaW5nJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IHBhdGhUb1JlZ2V4cCBmcm9tICdwYXRoLXRvLXJlZ2V4cCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudFR5cGUgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSc7XG5pbXBvcnQgaG9pc3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcblxudmFyIE1BWF9TSUdORURfMzFfQklUX0lOVCA9IDEwNzM3NDE4MjM7XG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiAvLyAnZ2xvYmFsIHByb3Blcidcbj8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5nbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyAvLyBCcm93c2VyXG46IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgLy8gbm9kZS5qc1xuOiB7fTtcblxuZnVuY3Rpb24gZ2V0VW5pcXVlSWQoKSB7XG4gIHZhciBrZXkgPSBcIl9fZ2xvYmFsX3VuaXF1ZV9pZF9fXCI7XG4gIHJldHVybiBjb21tb25qc0dsb2JhbFtrZXldID0gKGNvbW1vbmpzR2xvYmFsW2tleV0gfHwgMCkgKyAxO1xufSAvLyBJbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbC5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuXG5cbmZ1bmN0aW9uIG9iamVjdElzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXZlbnRFbWl0dGVyKHZhbHVlKSB7XG4gIHZhciBoYW5kbGVycyA9IFtdO1xuICByZXR1cm4ge1xuICAgIG9uOiBmdW5jdGlvbiBvbihoYW5kbGVyKSB7XG4gICAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgIH0sXG4gICAgb2ZmOiBmdW5jdGlvbiBvZmYoaGFuZGxlcikge1xuICAgICAgaGFuZGxlcnMgPSBoYW5kbGVycy5maWx0ZXIoZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgcmV0dXJuIGggIT09IGhhbmRsZXI7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobmV3VmFsdWUsIGNoYW5nZWRCaXRzKSB7XG4gICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlcih2YWx1ZSwgY2hhbmdlZEJpdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBvbmx5Q2hpbGQoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW5bMF0gOiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUmVhY3RDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgdmFyIF9Qcm92aWRlciRjaGlsZENvbnRleCwgX0NvbnN1bWVyJGNvbnRleHRUeXBlO1xuXG4gIHZhciBjb250ZXh0UHJvcCA9IFwiX19jcmVhdGUtcmVhY3QtY29udGV4dC1cIiArIGdldFVuaXF1ZUlkKCkgKyBcIl9fXCI7XG5cbiAgdmFyIFByb3ZpZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2UoUHJvdmlkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gUHJvdmlkZXIoKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgICAgX3RoaXMuZW1pdHRlciA9IGNyZWF0ZUV2ZW50RW1pdHRlcihfdGhpcy5wcm9wcy52YWx1ZSk7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IFByb3ZpZGVyLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltjb250ZXh0UHJvcF0gPSB0aGlzLmVtaXR0ZXIsIF9yZWY7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlICE9PSBuZXh0UHJvcHMudmFsdWUpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5wcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gbmV4dFByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgY2hhbmdlZEJpdHM7XG5cbiAgICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgICBjaGFuZ2VkQml0cyA9IDA7IC8vIE5vIGNoYW5nZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5nZWRCaXRzID0gdHlwZW9mIGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSBcImZ1bmN0aW9uXCIgPyBjYWxjdWxhdGVDaGFuZ2VkQml0cyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogTUFYX1NJR05FRF8zMV9CSVRfSU5UO1xuXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygoY2hhbmdlZEJpdHMgJiBNQVhfU0lHTkVEXzMxX0JJVF9JTlQpID09PSBjaGFuZ2VkQml0cywgXCJjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhIFwiICsgXCIzMS1iaXQgaW50ZWdlci4gSW5zdGVhZCByZWNlaXZlZDogXCIgKyBjaGFuZ2VkQml0cykgOiB2b2lkIDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hhbmdlZEJpdHMgfD0gMDtcblxuICAgICAgICAgIGlmIChjaGFuZ2VkQml0cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnNldChuZXh0UHJvcHMudmFsdWUsIGNoYW5nZWRCaXRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH07XG5cbiAgICByZXR1cm4gUHJvdmlkZXI7XG4gIH0oUmVhY3QuQ29tcG9uZW50KTtcblxuICBQcm92aWRlci5jaGlsZENvbnRleHRUeXBlcyA9IChfUHJvdmlkZXIkY2hpbGRDb250ZXggPSB7fSwgX1Byb3ZpZGVyJGNoaWxkQ29udGV4W2NvbnRleHRQcm9wXSA9IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCwgX1Byb3ZpZGVyJGNoaWxkQ29udGV4KTtcblxuICB2YXIgQ29uc3VtZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gICAgX2luaGVyaXRzTG9vc2UoQ29uc3VtZXIsIF9SZWFjdCRDb21wb25lbnQyKTtcblxuICAgIGZ1bmN0aW9uIENvbnN1bWVyKCkge1xuICAgICAgdmFyIF90aGlzMjtcblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyID0gX1JlYWN0JENvbXBvbmVudDIuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50MiwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICAgIF90aGlzMi5vYnNlcnZlZEJpdHMgPSB2b2lkIDA7XG4gICAgICBfdGhpczIuc3RhdGUgPSB7XG4gICAgICAgIHZhbHVlOiBfdGhpczIuZ2V0VmFsdWUoKVxuICAgICAgfTtcblxuICAgICAgX3RoaXMyLm9uVXBkYXRlID0gZnVuY3Rpb24gKG5ld1ZhbHVlLCBjaGFuZ2VkQml0cykge1xuICAgICAgICB2YXIgb2JzZXJ2ZWRCaXRzID0gX3RoaXMyLm9ic2VydmVkQml0cyB8IDA7XG5cbiAgICAgICAgaWYgKChvYnNlcnZlZEJpdHMgJiBjaGFuZ2VkQml0cykgIT09IDApIHtcbiAgICAgICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdmFsdWU6IF90aGlzMi5nZXRWYWx1ZSgpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBfdGhpczI7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90bzIgPSBDb25zdW1lci5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8yLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG9ic2VydmVkQml0cyA9IG5leHRQcm9wcy5vYnNlcnZlZEJpdHM7XG4gICAgICB0aGlzLm9ic2VydmVkQml0cyA9IG9ic2VydmVkQml0cyA9PT0gdW5kZWZpbmVkIHx8IG9ic2VydmVkQml0cyA9PT0gbnVsbCA/IE1BWF9TSUdORURfMzFfQklUX0lOVCAvLyBTdWJzY3JpYmUgdG8gYWxsIGNoYW5nZXMgYnkgZGVmYXVsdFxuICAgICAgOiBvYnNlcnZlZEJpdHM7XG4gICAgfTtcblxuICAgIF9wcm90bzIuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHRbY29udGV4dFByb3BdKSB7XG4gICAgICAgIHRoaXMuY29udGV4dFtjb250ZXh0UHJvcF0ub24odGhpcy5vblVwZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvYnNlcnZlZEJpdHMgPSB0aGlzLnByb3BzLm9ic2VydmVkQml0cztcbiAgICAgIHRoaXMub2JzZXJ2ZWRCaXRzID0gb2JzZXJ2ZWRCaXRzID09PSB1bmRlZmluZWQgfHwgb2JzZXJ2ZWRCaXRzID09PSBudWxsID8gTUFYX1NJR05FRF8zMV9CSVRfSU5UIC8vIFN1YnNjcmliZSB0byBhbGwgY2hhbmdlcyBieSBkZWZhdWx0XG4gICAgICA6IG9ic2VydmVkQml0cztcbiAgICB9O1xuXG4gICAgX3Byb3RvMi5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuY29udGV4dFtjb250ZXh0UHJvcF0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0W2NvbnRleHRQcm9wXS5vZmYodGhpcy5vblVwZGF0ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90bzIuZ2V0VmFsdWUgPSBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHRbY29udGV4dFByb3BdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRbY29udGV4dFByb3BdLmdldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvMi5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gb25seUNoaWxkKHRoaXMucHJvcHMuY2hpbGRyZW4pKHRoaXMuc3RhdGUudmFsdWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ29uc3VtZXI7XG4gIH0oUmVhY3QuQ29tcG9uZW50KTtcblxuICBDb25zdW1lci5jb250ZXh0VHlwZXMgPSAoX0NvbnN1bWVyJGNvbnRleHRUeXBlID0ge30sIF9Db25zdW1lciRjb250ZXh0VHlwZVtjb250ZXh0UHJvcF0gPSBQcm9wVHlwZXMub2JqZWN0LCBfQ29uc3VtZXIkY29udGV4dFR5cGUpO1xuICByZXR1cm4ge1xuICAgIFByb3ZpZGVyOiBQcm92aWRlcixcbiAgICBDb25zdW1lcjogQ29uc3VtZXJcbiAgfTtcbn1cblxuLy8gTUlUIExpY2Vuc2VcbnZhciBjcmVhdGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCB8fCBjcmVhdGVSZWFjdENvbnRleHQ7XG5cbi8vIFRPRE86IFJlcGxhY2Ugd2l0aCBSZWFjdC5jcmVhdGVDb250ZXh0IG9uY2Ugd2UgY2FuIGFzc3VtZSBSZWFjdCAxNitcblxudmFyIGNyZWF0ZU5hbWVkQ29udGV4dCA9IGZ1bmN0aW9uIGNyZWF0ZU5hbWVkQ29udGV4dChuYW1lKSB7XG4gIHZhciBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICBjb250ZXh0LmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG52YXIgaGlzdG9yeUNvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlTmFtZWRDb250ZXh0KFwiUm91dGVyLUhpc3RvcnlcIik7XG5cbnZhciBjb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZU5hbWVkQ29udGV4dChcIlJvdXRlclwiKTtcblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcHV0dGluZyBoaXN0b3J5IG9uIGNvbnRleHQuXG4gKi9cblxudmFyIFJvdXRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIFJvdXRlci5jb21wdXRlUm9vdE1hdGNoID0gZnVuY3Rpb24gY29tcHV0ZVJvb3RNYXRjaChwYXRobmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBcIi9cIixcbiAgICAgIHVybDogXCIvXCIsXG4gICAgICBwYXJhbXM6IHt9LFxuICAgICAgaXNFeGFjdDogcGF0aG5hbWUgPT09IFwiL1wiXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBSb3V0ZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxvY2F0aW9uOiBwcm9wcy5oaXN0b3J5LmxvY2F0aW9uXG4gICAgfTsgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suIFdlIGhhdmUgdG8gc3RhcnQgbGlzdGVuaW5nIGZvciBsb2NhdGlvblxuICAgIC8vIGNoYW5nZXMgaGVyZSBpbiB0aGUgY29uc3RydWN0b3IgaW4gY2FzZSB0aGVyZSBhcmUgYW55IDxSZWRpcmVjdD5zXG4gICAgLy8gb24gdGhlIGluaXRpYWwgcmVuZGVyLiBJZiB0aGVyZSBhcmUsIHRoZXkgd2lsbCByZXBsYWNlL3B1c2ggd2hlblxuICAgIC8vIHRoZXkgbW91bnQgYW5kIHNpbmNlIGNETSBmaXJlcyBpbiBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cywgd2UgbWF5XG4gICAgLy8gZ2V0IGEgbmV3IGxvY2F0aW9uIGJlZm9yZSB0aGUgPFJvdXRlcj4gaXMgbW91bnRlZC5cblxuICAgIF90aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICBfdGhpcy5fcGVuZGluZ0xvY2F0aW9uID0gbnVsbDtcblxuICAgIGlmICghcHJvcHMuc3RhdGljQ29udGV4dCkge1xuICAgICAgX3RoaXMudW5saXN0ZW4gPSBwcm9wcy5oaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICAgICAgX3RoaXMuX3BlbmRpbmdMb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFJvdXRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLl9pc01vdW50ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMudW5saXN0ZW4pIHtcbiAgICAgIC8vIEFueSBwcmUtbW91bnQgbG9jYXRpb24gY2hhbmdlcyBoYXZlIGJlZW4gY2FwdHVyZWQgYXRcbiAgICAgIC8vIHRoaXMgcG9pbnQsIHNvIHVucmVnaXN0ZXIgdGhlIGxpc3RlbmVyLlxuICAgICAgdGhpcy51bmxpc3RlbigpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcm9wcy5zdGF0aWNDb250ZXh0KSB7XG4gICAgICB0aGlzLnVubGlzdGVuID0gdGhpcy5wcm9wcy5oaXN0b3J5Lmxpc3RlbihmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgICAgICAgaWYgKF90aGlzMi5faXNNb3VudGVkKSB7XG4gICAgICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ0xvY2F0aW9uKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbG9jYXRpb246IHRoaXMuX3BlbmRpbmdMb2NhdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLnVubGlzdGVuKSB7XG4gICAgICB0aGlzLnVubGlzdGVuKCk7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3BlbmRpbmdMb2NhdGlvbiA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIGhpc3Rvcnk6IHRoaXMucHJvcHMuaGlzdG9yeSxcbiAgICAgICAgbG9jYXRpb246IHRoaXMuc3RhdGUubG9jYXRpb24sXG4gICAgICAgIG1hdGNoOiBSb3V0ZXIuY29tcHV0ZVJvb3RNYXRjaCh0aGlzLnN0YXRlLmxvY2F0aW9uLnBhdGhuYW1lKSxcbiAgICAgICAgc3RhdGljQ29udGV4dDogdGhpcy5wcm9wcy5zdGF0aWNDb250ZXh0XG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoaGlzdG9yeUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnByb3BzLmNoaWxkcmVuIHx8IG51bGwsXG4gICAgICB2YWx1ZTogdGhpcy5wcm9wcy5oaXN0b3J5XG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgUm91dGVyLnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIHN0YXRpY0NvbnRleHQ6IFByb3BUeXBlcy5vYmplY3RcbiAgfTtcblxuICBSb3V0ZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHByZXZQcm9wcy5oaXN0b3J5ID09PSB0aGlzLnByb3BzLmhpc3RvcnksIFwiWW91IGNhbm5vdCBjaGFuZ2UgPFJvdXRlciBoaXN0b3J5PlwiKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgYSA8Um91dGVyPiB0aGF0IHN0b3JlcyBsb2NhdGlvbiBpbiBtZW1vcnkuXG4gKi9cblxudmFyIE1lbW9yeVJvdXRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShNZW1vcnlSb3V0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lbW9yeVJvdXRlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlTWVtb3J5SGlzdG9yeShfdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE1lbW9yeVJvdXRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCB7XG4gICAgICBoaXN0b3J5OiB0aGlzLmhpc3RvcnksXG4gICAgICBjaGlsZHJlbjogdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBNZW1vcnlSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTWVtb3J5Um91dGVyLnByb3BUeXBlcyA9IHtcbiAgICBpbml0aWFsRW50cmllczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGluaXRpYWxJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBnZXRVc2VyQ29uZmlybWF0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBrZXlMZW5ndGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG4gIH07XG5cbiAgTWVtb3J5Um91dGVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCF0aGlzLnByb3BzLmhpc3RvcnksIFwiPE1lbW9yeVJvdXRlcj4gaWdub3JlcyB0aGUgaGlzdG9yeSBwcm9wLiBUbyB1c2UgYSBjdXN0b20gaGlzdG9yeSwgXCIgKyBcInVzZSBgaW1wb3J0IHsgUm91dGVyIH1gIGluc3RlYWQgb2YgYGltcG9ydCB7IE1lbW9yeVJvdXRlciBhcyBSb3V0ZXIgfWAuXCIpIDogdm9pZCAwO1xuICB9O1xufVxuXG52YXIgTGlmZWN5Y2xlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKExpZmVjeWNsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTGlmZWN5Y2xlKCkge1xuICAgIHJldHVybiBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMaWZlY3ljbGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uTW91bnQpIHRoaXMucHJvcHMub25Nb3VudC5jYWxsKHRoaXMsIHRoaXMpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25VcGRhdGUpIHRoaXMucHJvcHMub25VcGRhdGUuY2FsbCh0aGlzLCB0aGlzLCBwcmV2UHJvcHMpO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uVW5tb3VudCkgdGhpcy5wcm9wcy5vblVubW91bnQuY2FsbCh0aGlzLCB0aGlzKTtcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBMaWZlY3ljbGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIHByb21wdGluZyB0aGUgdXNlciBiZWZvcmUgbmF2aWdhdGluZyBhd2F5IGZyb20gYSBzY3JlZW4uXG4gKi9cblxuZnVuY3Rpb24gUHJvbXB0KF9yZWYpIHtcbiAgdmFyIG1lc3NhZ2UgPSBfcmVmLm1lc3NhZ2UsXG4gICAgICBfcmVmJHdoZW4gPSBfcmVmLndoZW4sXG4gICAgICB3aGVuID0gX3JlZiR3aGVuID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiR3aGVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAhY29udGV4dCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJZb3Ugc2hvdWxkIG5vdCB1c2UgPFByb21wdD4gb3V0c2lkZSBhIDxSb3V0ZXI+XCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBpZiAoIXdoZW4gfHwgY29udGV4dC5zdGF0aWNDb250ZXh0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbWV0aG9kID0gY29udGV4dC5oaXN0b3J5LmJsb2NrO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaWZlY3ljbGUsIHtcbiAgICAgIG9uTW91bnQ6IGZ1bmN0aW9uIG9uTW91bnQoc2VsZikge1xuICAgICAgICBzZWxmLnJlbGVhc2UgPSBtZXRob2QobWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IGZ1bmN0aW9uIG9uVXBkYXRlKHNlbGYsIHByZXZQcm9wcykge1xuICAgICAgICBpZiAocHJldlByb3BzLm1lc3NhZ2UgIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICBzZWxmLnJlbGVhc2UoKTtcbiAgICAgICAgICBzZWxmLnJlbGVhc2UgPSBtZXRob2QobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblVubW91bnQ6IGZ1bmN0aW9uIG9uVW5tb3VudChzZWxmKSB7XG4gICAgICAgIHNlbGYucmVsZWFzZSgpO1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICB9KTtcbiAgfSk7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgdmFyIG1lc3NhZ2VUeXBlID0gUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5zdHJpbmddKTtcbiAgUHJvbXB0LnByb3BUeXBlcyA9IHtcbiAgICB3aGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBtZXNzYWdlOiBtZXNzYWdlVHlwZS5pc1JlcXVpcmVkXG4gIH07XG59XG5cbnZhciBjYWNoZSA9IHt9O1xudmFyIGNhY2hlTGltaXQgPSAxMDAwMDtcbnZhciBjYWNoZUNvdW50ID0gMDtcblxuZnVuY3Rpb24gY29tcGlsZVBhdGgocGF0aCkge1xuICBpZiAoY2FjaGVbcGF0aF0pIHJldHVybiBjYWNoZVtwYXRoXTtcbiAgdmFyIGdlbmVyYXRvciA9IHBhdGhUb1JlZ2V4cC5jb21waWxlKHBhdGgpO1xuXG4gIGlmIChjYWNoZUNvdW50IDwgY2FjaGVMaW1pdCkge1xuICAgIGNhY2hlW3BhdGhdID0gZ2VuZXJhdG9yO1xuICAgIGNhY2hlQ291bnQrKztcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0b3I7XG59XG4vKipcbiAqIFB1YmxpYyBBUEkgZm9yIGdlbmVyYXRpbmcgYSBVUkwgcGF0aG5hbWUgZnJvbSBhIHBhdGggYW5kIHBhcmFtZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBhdGgocGF0aCwgcGFyYW1zKSB7XG4gIGlmIChwYXRoID09PSB2b2lkIDApIHtcbiAgICBwYXRoID0gXCIvXCI7XG4gIH1cblxuICBpZiAocGFyYW1zID09PSB2b2lkIDApIHtcbiAgICBwYXJhbXMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBwYXRoID09PSBcIi9cIiA/IHBhdGggOiBjb21waWxlUGF0aChwYXRoKShwYXJhbXMsIHtcbiAgICBwcmV0dHk6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIG5hdmlnYXRpbmcgcHJvZ3JhbW1hdGljYWxseSB3aXRoIGEgY29tcG9uZW50LlxuICovXG5cbmZ1bmN0aW9uIFJlZGlyZWN0KF9yZWYpIHtcbiAgdmFyIGNvbXB1dGVkTWF0Y2ggPSBfcmVmLmNvbXB1dGVkTWF0Y2gsXG4gICAgICB0byA9IF9yZWYudG8sXG4gICAgICBfcmVmJHB1c2ggPSBfcmVmLnB1c2gsXG4gICAgICBwdXNoID0gX3JlZiRwdXNoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkcHVzaDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgIWNvbnRleHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgdXNlIDxSZWRpcmVjdD4gb3V0c2lkZSBhIDxSb3V0ZXI+XCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICB2YXIgaGlzdG9yeSA9IGNvbnRleHQuaGlzdG9yeSxcbiAgICAgICAgc3RhdGljQ29udGV4dCA9IGNvbnRleHQuc3RhdGljQ29udGV4dDtcbiAgICB2YXIgbWV0aG9kID0gcHVzaCA/IGhpc3RvcnkucHVzaCA6IGhpc3RvcnkucmVwbGFjZTtcbiAgICB2YXIgbG9jYXRpb24gPSBjcmVhdGVMb2NhdGlvbihjb21wdXRlZE1hdGNoID8gdHlwZW9mIHRvID09PSBcInN0cmluZ1wiID8gZ2VuZXJhdGVQYXRoKHRvLCBjb21wdXRlZE1hdGNoLnBhcmFtcykgOiBfZXh0ZW5kcyh7fSwgdG8sIHtcbiAgICAgIHBhdGhuYW1lOiBnZW5lcmF0ZVBhdGgodG8ucGF0aG5hbWUsIGNvbXB1dGVkTWF0Y2gucGFyYW1zKVxuICAgIH0pIDogdG8pOyAvLyBXaGVuIHJlbmRlcmluZyBpbiBhIHN0YXRpYyBjb250ZXh0LFxuICAgIC8vIHNldCB0aGUgbmV3IGxvY2F0aW9uIGltbWVkaWF0ZWx5LlxuXG4gICAgaWYgKHN0YXRpY0NvbnRleHQpIHtcbiAgICAgIG1ldGhvZChsb2NhdGlvbik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGlmZWN5Y2xlLCB7XG4gICAgICBvbk1vdW50OiBmdW5jdGlvbiBvbk1vdW50KCkge1xuICAgICAgICBtZXRob2QobG9jYXRpb24pO1xuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZShzZWxmLCBwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIHByZXZMb2NhdGlvbiA9IGNyZWF0ZUxvY2F0aW9uKHByZXZQcm9wcy50byk7XG5cbiAgICAgICAgaWYgKCFsb2NhdGlvbnNBcmVFcXVhbChwcmV2TG9jYXRpb24sIF9leHRlbmRzKHt9LCBsb2NhdGlvbiwge1xuICAgICAgICAgIGtleTogcHJldkxvY2F0aW9uLmtleVxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBtZXRob2QobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG86IHRvXG4gICAgfSk7XG4gIH0pO1xufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIFJlZGlyZWN0LnByb3BUeXBlcyA9IHtcbiAgICBwdXNoOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBmcm9tOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRvOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSkuaXNSZXF1aXJlZFxuICB9O1xufVxuXG52YXIgY2FjaGUkMSA9IHt9O1xudmFyIGNhY2hlTGltaXQkMSA9IDEwMDAwO1xudmFyIGNhY2hlQ291bnQkMSA9IDA7XG5cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoJDEocGF0aCwgb3B0aW9ucykge1xuICB2YXIgY2FjaGVLZXkgPSBcIlwiICsgb3B0aW9ucy5lbmQgKyBvcHRpb25zLnN0cmljdCArIG9wdGlvbnMuc2Vuc2l0aXZlO1xuICB2YXIgcGF0aENhY2hlID0gY2FjaGUkMVtjYWNoZUtleV0gfHwgKGNhY2hlJDFbY2FjaGVLZXldID0ge30pO1xuICBpZiAocGF0aENhY2hlW3BhdGhdKSByZXR1cm4gcGF0aENhY2hlW3BhdGhdO1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgcmVnZXhwID0gcGF0aFRvUmVnZXhwKHBhdGgsIGtleXMsIG9wdGlvbnMpO1xuICB2YXIgcmVzdWx0ID0ge1xuICAgIHJlZ2V4cDogcmVnZXhwLFxuICAgIGtleXM6IGtleXNcbiAgfTtcblxuICBpZiAoY2FjaGVDb3VudCQxIDwgY2FjaGVMaW1pdCQxKSB7XG4gICAgcGF0aENhY2hlW3BhdGhdID0gcmVzdWx0O1xuICAgIGNhY2hlQ291bnQkMSsrO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogUHVibGljIEFQSSBmb3IgbWF0Y2hpbmcgYSBVUkwgcGF0aG5hbWUgdG8gYSBwYXRoLlxuICovXG5cblxuZnVuY3Rpb24gbWF0Y2hQYXRoKHBhdGhuYW1lLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBwYXRoOiBvcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwYXRoID0gX29wdGlvbnMucGF0aCxcbiAgICAgIF9vcHRpb25zJGV4YWN0ID0gX29wdGlvbnMuZXhhY3QsXG4gICAgICBleGFjdCA9IF9vcHRpb25zJGV4YWN0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGV4YWN0LFxuICAgICAgX29wdGlvbnMkc3RyaWN0ID0gX29wdGlvbnMuc3RyaWN0LFxuICAgICAgc3RyaWN0ID0gX29wdGlvbnMkc3RyaWN0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJHN0cmljdCxcbiAgICAgIF9vcHRpb25zJHNlbnNpdGl2ZSA9IF9vcHRpb25zLnNlbnNpdGl2ZSxcbiAgICAgIHNlbnNpdGl2ZSA9IF9vcHRpb25zJHNlbnNpdGl2ZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRzZW5zaXRpdmU7XG4gIHZhciBwYXRocyA9IFtdLmNvbmNhdChwYXRoKTtcbiAgcmV0dXJuIHBhdGhzLnJlZHVjZShmdW5jdGlvbiAobWF0Y2hlZCwgcGF0aCkge1xuICAgIGlmICghcGF0aCAmJiBwYXRoICE9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobWF0Y2hlZCkgcmV0dXJuIG1hdGNoZWQ7XG5cbiAgICB2YXIgX2NvbXBpbGVQYXRoID0gY29tcGlsZVBhdGgkMShwYXRoLCB7XG4gICAgICBlbmQ6IGV4YWN0LFxuICAgICAgc3RyaWN0OiBzdHJpY3QsXG4gICAgICBzZW5zaXRpdmU6IHNlbnNpdGl2ZVxuICAgIH0pLFxuICAgICAgICByZWdleHAgPSBfY29tcGlsZVBhdGgucmVnZXhwLFxuICAgICAgICBrZXlzID0gX2NvbXBpbGVQYXRoLmtleXM7XG5cbiAgICB2YXIgbWF0Y2ggPSByZWdleHAuZXhlYyhwYXRobmFtZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHVybCA9IG1hdGNoWzBdLFxuICAgICAgICB2YWx1ZXMgPSBtYXRjaC5zbGljZSgxKTtcbiAgICB2YXIgaXNFeGFjdCA9IHBhdGhuYW1lID09PSB1cmw7XG4gICAgaWYgKGV4YWN0ICYmICFpc0V4YWN0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIC8vIHRoZSBwYXRoIHVzZWQgdG8gbWF0Y2hcbiAgICAgIHVybDogcGF0aCA9PT0gXCIvXCIgJiYgdXJsID09PSBcIlwiID8gXCIvXCIgOiB1cmwsXG4gICAgICAvLyB0aGUgbWF0Y2hlZCBwb3J0aW9uIG9mIHRoZSBVUkxcbiAgICAgIGlzRXhhY3Q6IGlzRXhhY3QsXG4gICAgICAvLyB3aGV0aGVyIG9yIG5vdCB3ZSBtYXRjaGVkIGV4YWN0bHlcbiAgICAgIHBhcmFtczoga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGtleSwgaW5kZXgpIHtcbiAgICAgICAgbWVtb1trZXkubmFtZV0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIHt9KVxuICAgIH07XG4gIH0sIG51bGwpO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gZXZhbENoaWxkcmVuRGV2KGNoaWxkcmVuLCBwcm9wcywgcGF0aCkge1xuICB2YXIgdmFsdWUgPSBjaGlsZHJlbihwcm9wcyk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcodmFsdWUgIT09IHVuZGVmaW5lZCwgXCJZb3UgcmV0dXJuZWQgYHVuZGVmaW5lZGAgZnJvbSB0aGUgYGNoaWxkcmVuYCBmdW5jdGlvbiBvZiBcIiArIChcIjxSb3V0ZVwiICsgKHBhdGggPyBcIiBwYXRoPVxcXCJcIiArIHBhdGggKyBcIlxcXCJcIiA6IFwiXCIpICsgXCI+LCBidXQgeW91IFwiKSArIFwic2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBSZWFjdCBlbGVtZW50IG9yIGBudWxsYFwiKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHZhbHVlIHx8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBtYXRjaGluZyBhIHNpbmdsZSBwYXRoIGFuZCByZW5kZXJpbmcuXG4gKi9cblxuXG52YXIgUm91dGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUm91dGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdXRlKCkge1xuICAgIHJldHVybiBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBSb3V0ZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0JDEpIHtcbiAgICAgICFjb250ZXh0JDEgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgdXNlIDxSb3V0ZT4gb3V0c2lkZSBhIDxSb3V0ZXI+XCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICAgIHZhciBsb2NhdGlvbiA9IF90aGlzLnByb3BzLmxvY2F0aW9uIHx8IGNvbnRleHQkMS5sb2NhdGlvbjtcbiAgICAgIHZhciBtYXRjaCA9IF90aGlzLnByb3BzLmNvbXB1dGVkTWF0Y2ggPyBfdGhpcy5wcm9wcy5jb21wdXRlZE1hdGNoIC8vIDxTd2l0Y2g+IGFscmVhZHkgY29tcHV0ZWQgdGhlIG1hdGNoIGZvciB1c1xuICAgICAgOiBfdGhpcy5wcm9wcy5wYXRoID8gbWF0Y2hQYXRoKGxvY2F0aW9uLnBhdGhuYW1lLCBfdGhpcy5wcm9wcykgOiBjb250ZXh0JDEubWF0Y2g7XG5cbiAgICAgIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBjb250ZXh0JDEsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBtYXRjaDogbWF0Y2hcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGNvbXBvbmVudCA9IF90aGlzJHByb3BzLmNvbXBvbmVudCxcbiAgICAgICAgICByZW5kZXIgPSBfdGhpcyRwcm9wcy5yZW5kZXI7IC8vIFByZWFjdCB1c2VzIGFuIGVtcHR5IGFycmF5IGFzIGNoaWxkcmVuIGJ5XG4gICAgICAvLyBkZWZhdWx0LCBzbyB1c2UgbnVsbCBpZiB0aGF0J3MgdGhlIGNhc2UuXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBpc0VtcHR5Q2hpbGRyZW4oY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHByb3BzXG4gICAgICB9LCBwcm9wcy5tYXRjaCA/IGNoaWxkcmVuID8gdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBldmFsQ2hpbGRyZW5EZXYoY2hpbGRyZW4sIHByb3BzLCBfdGhpcy5wcm9wcy5wYXRoKSA6IGNoaWxkcmVuKHByb3BzKSA6IGNoaWxkcmVuIDogY29tcG9uZW50ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBwcm9wcykgOiByZW5kZXIgPyByZW5kZXIocHJvcHMpIDogbnVsbCA6IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gZXZhbENoaWxkcmVuRGV2KGNoaWxkcmVuLCBwcm9wcywgX3RoaXMucHJvcHMucGF0aCkgOiBjaGlsZHJlbihwcm9wcykgOiBudWxsKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUm91dGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgUm91dGUucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICBjb21wb25lbnQ6IGZ1bmN0aW9uIGNvbXBvbmVudChwcm9wcywgcHJvcE5hbWUpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gJiYgIWlzVmFsaWRFbGVtZW50VHlwZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXCJJbnZhbGlkIHByb3AgJ2NvbXBvbmVudCcgc3VwcGxpZWQgdG8gJ1JvdXRlJzogdGhlIHByb3AgaXMgbm90IGEgdmFsaWQgUmVhY3QgY29tcG9uZW50XCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXhhY3Q6IFByb3BUeXBlcy5ib29sLFxuICAgIGxvY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHBhdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXSksXG4gICAgcmVuZGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzZW5zaXRpdmU6IFByb3BUeXBlcy5ib29sLFxuICAgIHN0cmljdDogUHJvcFR5cGVzLmJvb2xcbiAgfTtcblxuICBSb3V0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHRoaXMucHJvcHMuY2hpbGRyZW4gJiYgIWlzRW1wdHlDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuKSAmJiB0aGlzLnByb3BzLmNvbXBvbmVudCksIFwiWW91IHNob3VsZCBub3QgdXNlIDxSb3V0ZSBjb21wb25lbnQ+IGFuZCA8Um91dGUgY2hpbGRyZW4+IGluIHRoZSBzYW1lIHJvdXRlOyA8Um91dGUgY29tcG9uZW50PiB3aWxsIGJlIGlnbm9yZWRcIikgOiB2b2lkIDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHRoaXMucHJvcHMuY2hpbGRyZW4gJiYgIWlzRW1wdHlDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuKSAmJiB0aGlzLnByb3BzLnJlbmRlciksIFwiWW91IHNob3VsZCBub3QgdXNlIDxSb3V0ZSByZW5kZXI+IGFuZCA8Um91dGUgY2hpbGRyZW4+IGluIHRoZSBzYW1lIHJvdXRlOyA8Um91dGUgcmVuZGVyPiB3aWxsIGJlIGlnbm9yZWRcIikgOiB2b2lkIDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHRoaXMucHJvcHMuY29tcG9uZW50ICYmIHRoaXMucHJvcHMucmVuZGVyKSwgXCJZb3Ugc2hvdWxkIG5vdCB1c2UgPFJvdXRlIGNvbXBvbmVudD4gYW5kIDxSb3V0ZSByZW5kZXI+IGluIHRoZSBzYW1lIHJvdXRlOyA8Um91dGUgcmVuZGVyPiB3aWxsIGJlIGlnbm9yZWRcIikgOiB2b2lkIDA7XG4gIH07XG5cbiAgUm91dGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodGhpcy5wcm9wcy5sb2NhdGlvbiAmJiAhcHJldlByb3BzLmxvY2F0aW9uKSwgJzxSb3V0ZT4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBpbml0aWFsbHkgdXNlZCBubyBcImxvY2F0aW9uXCIgcHJvcCBhbmQgdGhlbiBwcm92aWRlZCBvbmUgb24gYSBzdWJzZXF1ZW50IHJlbmRlci4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoIXRoaXMucHJvcHMubG9jYXRpb24gJiYgcHJldlByb3BzLmxvY2F0aW9uKSwgJzxSb3V0ZT4gZWxlbWVudHMgc2hvdWxkIG5vdCBjaGFuZ2UgZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuIFlvdSBwcm92aWRlZCBhIFwibG9jYXRpb25cIiBwcm9wIGluaXRpYWxseSBidXQgb21pdHRlZCBpdCBvbiBhIHN1YnNlcXVlbnQgcmVuZGVyLicpIDogdm9pZCAwO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhZGRMZWFkaW5nU2xhc2gocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09IFwiL1wiID8gcGF0aCA6IFwiL1wiICsgcGF0aDtcbn1cblxuZnVuY3Rpb24gYWRkQmFzZW5hbWUoYmFzZW5hbWUsIGxvY2F0aW9uKSB7XG4gIGlmICghYmFzZW5hbWUpIHJldHVybiBsb2NhdGlvbjtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBsb2NhdGlvbiwge1xuICAgIHBhdGhuYW1lOiBhZGRMZWFkaW5nU2xhc2goYmFzZW5hbWUpICsgbG9jYXRpb24ucGF0aG5hbWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQmFzZW5hbWUoYmFzZW5hbWUsIGxvY2F0aW9uKSB7XG4gIGlmICghYmFzZW5hbWUpIHJldHVybiBsb2NhdGlvbjtcbiAgdmFyIGJhc2UgPSBhZGRMZWFkaW5nU2xhc2goYmFzZW5hbWUpO1xuICBpZiAobG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZihiYXNlKSAhPT0gMCkgcmV0dXJuIGxvY2F0aW9uO1xuICByZXR1cm4gX2V4dGVuZHMoe30sIGxvY2F0aW9uLCB7XG4gICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cihiYXNlLmxlbmd0aClcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVSTChsb2NhdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGxvY2F0aW9uID09PSBcInN0cmluZ1wiID8gbG9jYXRpb24gOiBjcmVhdGVQYXRoKGxvY2F0aW9uKTtcbn1cblxuZnVuY3Rpb24gc3RhdGljSGFuZGxlcihtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJZb3UgY2Fubm90ICVzIHdpdGggPFN0YXRpY1JvdXRlcj5cIiwgbWV0aG9kTmFtZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4vKipcbiAqIFRoZSBwdWJsaWMgdG9wLWxldmVsIEFQSSBmb3IgYSBcInN0YXRpY1wiIDxSb3V0ZXI+LCBzby1jYWxsZWQgYmVjYXVzZSBpdFxuICogY2FuJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHNcbiAqIGxvY2F0aW9uIGNoYW5nZXMgaW4gYSBjb250ZXh0IG9iamVjdC4gVXNlZnVsIG1haW5seSBpbiB0ZXN0aW5nIGFuZFxuICogc2VydmVyLXJlbmRlcmluZyBzY2VuYXJpb3MuXG4gKi9cblxuXG52YXIgU3RhdGljUm91dGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFN0YXRpY1JvdXRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3RhdGljUm91dGVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlUHVzaCA9IGZ1bmN0aW9uIChsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIF90aGlzLm5hdmlnYXRlVG8obG9jYXRpb24sIFwiUFVTSFwiKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUmVwbGFjZSA9IGZ1bmN0aW9uIChsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIF90aGlzLm5hdmlnYXRlVG8obG9jYXRpb24sIFwiUkVQTEFDRVwiKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTGlzdGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTdGF0aWNSb3V0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5uYXZpZ2F0ZVRvID0gZnVuY3Rpb24gbmF2aWdhdGVUbyhsb2NhdGlvbiwgYWN0aW9uKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMkYmFzZW5hbWUgPSBfdGhpcyRwcm9wcy5iYXNlbmFtZSxcbiAgICAgICAgYmFzZW5hbWUgPSBfdGhpcyRwcm9wcyRiYXNlbmFtZSA9PT0gdm9pZCAwID8gXCJcIiA6IF90aGlzJHByb3BzJGJhc2VuYW1lLFxuICAgICAgICBfdGhpcyRwcm9wcyRjb250ZXh0ID0gX3RoaXMkcHJvcHMuY29udGV4dCxcbiAgICAgICAgY29udGV4dCA9IF90aGlzJHByb3BzJGNvbnRleHQgPT09IHZvaWQgMCA/IHt9IDogX3RoaXMkcHJvcHMkY29udGV4dDtcbiAgICBjb250ZXh0LmFjdGlvbiA9IGFjdGlvbjtcbiAgICBjb250ZXh0LmxvY2F0aW9uID0gYWRkQmFzZW5hbWUoYmFzZW5hbWUsIGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uKSk7XG4gICAgY29udGV4dC51cmwgPSBjcmVhdGVVUkwoY29udGV4dC5sb2NhdGlvbik7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMyJGJhc2VuYW1lID0gX3RoaXMkcHJvcHMyLmJhc2VuYW1lLFxuICAgICAgICBiYXNlbmFtZSA9IF90aGlzJHByb3BzMiRiYXNlbmFtZSA9PT0gdm9pZCAwID8gXCJcIiA6IF90aGlzJHByb3BzMiRiYXNlbmFtZSxcbiAgICAgICAgX3RoaXMkcHJvcHMyJGNvbnRleHQgPSBfdGhpcyRwcm9wczIuY29udGV4dCxcbiAgICAgICAgY29udGV4dCA9IF90aGlzJHByb3BzMiRjb250ZXh0ID09PSB2b2lkIDAgPyB7fSA6IF90aGlzJHByb3BzMiRjb250ZXh0LFxuICAgICAgICBfdGhpcyRwcm9wczIkbG9jYXRpb24gPSBfdGhpcyRwcm9wczIubG9jYXRpb24sXG4gICAgICAgIGxvY2F0aW9uID0gX3RoaXMkcHJvcHMyJGxvY2F0aW9uID09PSB2b2lkIDAgPyBcIi9cIiA6IF90aGlzJHByb3BzMiRsb2NhdGlvbixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzMiwgW1wiYmFzZW5hbWVcIiwgXCJjb250ZXh0XCIsIFwibG9jYXRpb25cIl0pO1xuXG4gICAgdmFyIGhpc3RvcnkgPSB7XG4gICAgICBjcmVhdGVIcmVmOiBmdW5jdGlvbiBjcmVhdGVIcmVmKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdTbGFzaChiYXNlbmFtZSArIGNyZWF0ZVVSTChwYXRoKSk7XG4gICAgICB9LFxuICAgICAgYWN0aW9uOiBcIlBPUFwiLFxuICAgICAgbG9jYXRpb246IHN0cmlwQmFzZW5hbWUoYmFzZW5hbWUsIGNyZWF0ZUxvY2F0aW9uKGxvY2F0aW9uKSksXG4gICAgICBwdXNoOiB0aGlzLmhhbmRsZVB1c2gsXG4gICAgICByZXBsYWNlOiB0aGlzLmhhbmRsZVJlcGxhY2UsXG4gICAgICBnbzogc3RhdGljSGFuZGxlcihcImdvXCIpLFxuICAgICAgZ29CYWNrOiBzdGF0aWNIYW5kbGVyKFwiZ29CYWNrXCIpLFxuICAgICAgZ29Gb3J3YXJkOiBzdGF0aWNIYW5kbGVyKFwiZ29Gb3J3YXJkXCIpLFxuICAgICAgbGlzdGVuOiB0aGlzLmhhbmRsZUxpc3RlbixcbiAgICAgIGJsb2NrOiB0aGlzLmhhbmRsZUJsb2NrXG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgaGlzdG9yeTogaGlzdG9yeSxcbiAgICAgIHN0YXRpY0NvbnRleHQ6IGNvbnRleHRcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIFN0YXRpY1JvdXRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBTdGF0aWNSb3V0ZXIucHJvcFR5cGVzID0ge1xuICAgIGJhc2VuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbnRleHQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbG9jYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKVxuICB9O1xuXG4gIFN0YXRpY1JvdXRlci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghdGhpcy5wcm9wcy5oaXN0b3J5LCBcIjxTdGF0aWNSb3V0ZXI+IGlnbm9yZXMgdGhlIGhpc3RvcnkgcHJvcC4gVG8gdXNlIGEgY3VzdG9tIGhpc3RvcnksIFwiICsgXCJ1c2UgYGltcG9ydCB7IFJvdXRlciB9YCBpbnN0ZWFkIG9mIGBpbXBvcnQgeyBTdGF0aWNSb3V0ZXIgYXMgUm91dGVyIH1gLlwiKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcmVuZGVyaW5nIHRoZSBmaXJzdCA8Um91dGU+IHRoYXQgbWF0Y2hlcy5cbiAqL1xuXG52YXIgU3dpdGNoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFN3aXRjaCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3dpdGNoKCkge1xuICAgIHJldHVybiBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTd2l0Y2gucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChjb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgIWNvbnRleHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgdXNlIDxTd2l0Y2g+IG91dHNpZGUgYSA8Um91dGVyPlwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgICB2YXIgbG9jYXRpb24gPSBfdGhpcy5wcm9wcy5sb2NhdGlvbiB8fCBjb250ZXh0LmxvY2F0aW9uO1xuICAgICAgdmFyIGVsZW1lbnQsIG1hdGNoOyAvLyBXZSB1c2UgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaCBpbnN0ZWFkIG9mIFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoKS5maW5kKClcbiAgICAgIC8vIGhlcmUgYmVjYXVzZSB0b0FycmF5IGFkZHMga2V5cyB0byBhbGwgY2hpbGQgZWxlbWVudHMgYW5kIHdlIGRvIG5vdCB3YW50XG4gICAgICAvLyB0byB0cmlnZ2VyIGFuIHVubW91bnQvcmVtb3VudCBmb3IgdHdvIDxSb3V0ZT5zIHRoYXQgcmVuZGVyIHRoZSBzYW1lXG4gICAgICAvLyBjb21wb25lbnQgYXQgZGlmZmVyZW50IFVSTHMuXG5cbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goX3RoaXMucHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAobWF0Y2ggPT0gbnVsbCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgZWxlbWVudCA9IGNoaWxkO1xuICAgICAgICAgIHZhciBwYXRoID0gY2hpbGQucHJvcHMucGF0aCB8fCBjaGlsZC5wcm9wcy5mcm9tO1xuICAgICAgICAgIG1hdGNoID0gcGF0aCA/IG1hdGNoUGF0aChsb2NhdGlvbi5wYXRobmFtZSwgX2V4dGVuZHMoe30sIGNoaWxkLnByb3BzLCB7XG4gICAgICAgICAgICBwYXRoOiBwYXRoXG4gICAgICAgICAgfSkpIDogY29udGV4dC5tYXRjaDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2ggPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICBjb21wdXRlZE1hdGNoOiBtYXRjaFxuICAgICAgfSkgOiBudWxsO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBTd2l0Y2g7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgU3dpdGNoLnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgbG9jYXRpb246IFByb3BUeXBlcy5vYmplY3RcbiAgfTtcblxuICBTd2l0Y2gucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEodGhpcy5wcm9wcy5sb2NhdGlvbiAmJiAhcHJldlByb3BzLmxvY2F0aW9uKSwgJzxTd2l0Y2g+IGVsZW1lbnRzIHNob3VsZCBub3QgY2hhbmdlIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiBZb3UgaW5pdGlhbGx5IHVzZWQgbm8gXCJsb2NhdGlvblwiIHByb3AgYW5kIHRoZW4gcHJvdmlkZWQgb25lIG9uIGEgc3Vic2VxdWVudCByZW5kZXIuJykgOiB2b2lkIDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCF0aGlzLnByb3BzLmxvY2F0aW9uICYmIHByZXZQcm9wcy5sb2NhdGlvbiksICc8U3dpdGNoPiBlbGVtZW50cyBzaG91bGQgbm90IGNoYW5nZSBmcm9tIGNvbnRyb2xsZWQgdG8gdW5jb250cm9sbGVkIChvciB2aWNlIHZlcnNhKS4gWW91IHByb3ZpZGVkIGEgXCJsb2NhdGlvblwiIHByb3AgaW5pdGlhbGx5IGJ1dCBvbWl0dGVkIGl0IG9uIGEgc3Vic2VxdWVudCByZW5kZXIuJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbi8qKlxuICogQSBwdWJsaWMgaGlnaGVyLW9yZGVyIGNvbXBvbmVudCB0byBhY2Nlc3MgdGhlIGltcGVyYXRpdmUgQVBJXG4gKi9cblxuZnVuY3Rpb24gd2l0aFJvdXRlcihDb21wb25lbnQpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gXCJ3aXRoUm91dGVyKFwiICsgKENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSkgKyBcIilcIjtcblxuICB2YXIgQyA9IGZ1bmN0aW9uIEMocHJvcHMpIHtcbiAgICB2YXIgd3JhcHBlZENvbXBvbmVudFJlZiA9IHByb3BzLndyYXBwZWRDb21wb25lbnRSZWYsXG4gICAgICAgIHJlbWFpbmluZ1Byb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIFtcIndyYXBwZWRDb21wb25lbnRSZWZcIl0pO1xuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAhY29udGV4dCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJZb3Ugc2hvdWxkIG5vdCB1c2UgPFwiICsgZGlzcGxheU5hbWUgKyBcIiAvPiBvdXRzaWRlIGEgPFJvdXRlcj5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIHJlbWFpbmluZ1Byb3BzLCBjb250ZXh0LCB7XG4gICAgICAgIHJlZjogd3JhcHBlZENvbXBvbmVudFJlZlxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9O1xuXG4gIEMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgQy5XcmFwcGVkQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBDLnByb3BUeXBlcyA9IHtcbiAgICAgIHdyYXBwZWRDb21wb25lbnRSZWY6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMub2JqZWN0XSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGhvaXN0U3RhdGljcyhDLCBDb21wb25lbnQpO1xufVxuXG52YXIgdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQ7XG5mdW5jdGlvbiB1c2VIaXN0b3J5KCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgISh0eXBlb2YgdXNlQ29udGV4dCA9PT0gXCJmdW5jdGlvblwiKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJZb3UgbXVzdCB1c2UgUmVhY3QgPj0gMTYuOCBpbiBvcmRlciB0byB1c2UgdXNlSGlzdG9yeSgpXCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiB1c2VDb250ZXh0KGhpc3RvcnlDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZUxvY2F0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgISh0eXBlb2YgdXNlQ29udGV4dCA9PT0gXCJmdW5jdGlvblwiKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgXCJZb3UgbXVzdCB1c2UgUmVhY3QgPj0gMTYuOCBpbiBvcmRlciB0byB1c2UgdXNlTG9jYXRpb24oKVwiKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gdXNlQ29udGV4dChjb250ZXh0KS5sb2NhdGlvbjtcbn1cbmZ1bmN0aW9uIHVzZVBhcmFtcygpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICEodHlwZW9mIHVzZUNvbnRleHQgPT09IFwiZnVuY3Rpb25cIikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IG11c3QgdXNlIFJlYWN0ID49IDE2LjggaW4gb3JkZXIgdG8gdXNlIHVzZVBhcmFtcygpXCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHZhciBtYXRjaCA9IHVzZUNvbnRleHQoY29udGV4dCkubWF0Y2g7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoLnBhcmFtcyA6IHt9O1xufVxuZnVuY3Rpb24gdXNlUm91dGVNYXRjaChwYXRoKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAhKHR5cGVvZiB1c2VDb250ZXh0ID09PSBcImZ1bmN0aW9uXCIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIllvdSBtdXN0IHVzZSBSZWFjdCA+PSAxNi44IGluIG9yZGVyIHRvIHVzZSB1c2VSb3V0ZU1hdGNoKClcIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB9XG5cbiAgdmFyIGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgdmFyIG1hdGNoID0gdXNlQ29udGV4dChjb250ZXh0KS5tYXRjaDtcbiAgcmV0dXJuIHBhdGggPyBtYXRjaFBhdGgobG9jYXRpb24ucGF0aG5hbWUsIHBhdGgpIDogbWF0Y2g7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgZ2xvYmFsJDEgPSB3aW5kb3c7XG4gICAgdmFyIGtleSA9IFwiX19yZWFjdF9yb3V0ZXJfYnVpbGRfX1wiO1xuICAgIHZhciBidWlsZE5hbWVzID0ge1xuICAgICAgY2pzOiBcIkNvbW1vbkpTXCIsXG4gICAgICBlc206IFwiRVMgbW9kdWxlc1wiLFxuICAgICAgdW1kOiBcIlVNRFwiXG4gICAgfTtcblxuICAgIGlmIChnbG9iYWwkMVtrZXldICYmIGdsb2JhbCQxW2tleV0gIT09IFwiZXNtXCIpIHtcbiAgICAgIHZhciBpbml0aWFsQnVpbGROYW1lID0gYnVpbGROYW1lc1tnbG9iYWwkMVtrZXldXTtcbiAgICAgIHZhciBzZWNvbmRhcnlCdWlsZE5hbWUgPSBidWlsZE5hbWVzW1wiZXNtXCJdOyAvLyBUT0RPOiBBZGQgbGluayB0byBhcnRpY2xlIHRoYXQgZXhwbGFpbnMgaW4gZGV0YWlsIGhvdyB0byBhdm9pZFxuICAgICAgLy8gbG9hZGluZyAyIGRpZmZlcmVudCBidWlsZHMuXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBhcmUgbG9hZGluZyB0aGUgXCIgKyBzZWNvbmRhcnlCdWlsZE5hbWUgKyBcIiBidWlsZCBvZiBSZWFjdCBSb3V0ZXIgXCIgKyAoXCJvbiBhIHBhZ2UgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcgdGhlIFwiICsgaW5pdGlhbEJ1aWxkTmFtZSArIFwiIFwiKSArIFwiYnVpbGQsIHNvIHRoaW5ncyB3b24ndCB3b3JrIHJpZ2h0LlwiKTtcbiAgICB9XG5cbiAgICBnbG9iYWwkMVtrZXldID0gXCJlc21cIjtcbiAgfVxufVxuXG5leHBvcnQgeyBNZW1vcnlSb3V0ZXIsIFByb21wdCwgUmVkaXJlY3QsIFJvdXRlLCBSb3V0ZXIsIFN0YXRpY1JvdXRlciwgU3dpdGNoLCBoaXN0b3J5Q29udGV4dCBhcyBfX0hpc3RvcnlDb250ZXh0LCBjb250ZXh0IGFzIF9fUm91dGVyQ29udGV4dCwgZ2VuZXJhdGVQYXRoLCBtYXRjaFBhdGgsIHVzZUhpc3RvcnksIHVzZUxvY2F0aW9uLCB1c2VQYXJhbXMsIHVzZVJvdXRlTWF0Y2gsIHdpdGhSb3V0ZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LXJvdXRlci5qcy5tYXBcbiIsImltcG9ydCB7IFJvdXRlciwgX19Sb3V0ZXJDb250ZXh0LCBtYXRjaFBhdGggfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuZXhwb3J0IHsgTWVtb3J5Um91dGVyLCBQcm9tcHQsIFJlZGlyZWN0LCBSb3V0ZSwgUm91dGVyLCBTdGF0aWNSb3V0ZXIsIFN3aXRjaCwgZ2VuZXJhdGVQYXRoLCBtYXRjaFBhdGgsIHVzZUhpc3RvcnksIHVzZUxvY2F0aW9uLCB1c2VQYXJhbXMsIHVzZVJvdXRlTWF0Y2gsIHdpdGhSb3V0ZXIgfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJIaXN0b3J5LCBjcmVhdGVIYXNoSGlzdG9yeSwgY3JlYXRlTG9jYXRpb24sIGNyZWF0ZVBhdGggfSBmcm9tICdoaXN0b3J5JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd0aW55LXdhcm5pbmcnO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5cbi8qKlxuICogVGhlIHB1YmxpYyBBUEkgZm9yIGEgPFJvdXRlcj4gdGhhdCB1c2VzIEhUTUw1IGhpc3RvcnkuXG4gKi9cblxudmFyIEJyb3dzZXJSb3V0ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoQnJvd3NlclJvdXRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnJvd3NlclJvdXRlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5oaXN0b3J5ID0gY3JlYXRlQnJvd3Nlckhpc3RvcnkoX3RoaXMucHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBCcm93c2VyUm91dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3V0ZXIsIHtcbiAgICAgIGhpc3Rvcnk6IHRoaXMuaGlzdG9yeSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEJyb3dzZXJSb3V0ZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgQnJvd3NlclJvdXRlci5wcm9wVHlwZXMgPSB7XG4gICAgYmFzZW5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAgIGZvcmNlUmVmcmVzaDogUHJvcFR5cGVzLmJvb2wsXG4gICAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAga2V5TGVuZ3RoOiBQcm9wVHlwZXMubnVtYmVyXG4gIH07XG5cbiAgQnJvd3NlclJvdXRlci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghdGhpcy5wcm9wcy5oaXN0b3J5LCBcIjxCcm93c2VyUm91dGVyPiBpZ25vcmVzIHRoZSBoaXN0b3J5IHByb3AuIFRvIHVzZSBhIGN1c3RvbSBoaXN0b3J5LCBcIiArIFwidXNlIGBpbXBvcnQgeyBSb3V0ZXIgfWAgaW5zdGVhZCBvZiBgaW1wb3J0IHsgQnJvd3NlclJvdXRlciBhcyBSb3V0ZXIgfWAuXCIpIDogdm9pZCAwO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwdWJsaWMgQVBJIGZvciBhIDxSb3V0ZXI+IHRoYXQgdXNlcyB3aW5kb3cubG9jYXRpb24uaGFzaC5cbiAqL1xuXG52YXIgSGFzaFJvdXRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShIYXNoUm91dGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBIYXNoUm91dGVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLmhpc3RvcnkgPSBjcmVhdGVIYXNoSGlzdG9yeShfdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEhhc2hSb3V0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvdXRlciwge1xuICAgICAgaGlzdG9yeTogdGhpcy5oaXN0b3J5LFxuICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gSGFzaFJvdXRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBIYXNoUm91dGVyLnByb3BUeXBlcyA9IHtcbiAgICBiYXNlbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgZ2V0VXNlckNvbmZpcm1hdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaGFzaFR5cGU6IFByb3BUeXBlcy5vbmVPZihbXCJoYXNoYmFuZ1wiLCBcIm5vc2xhc2hcIiwgXCJzbGFzaFwiXSlcbiAgfTtcblxuICBIYXNoUm91dGVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCF0aGlzLnByb3BzLmhpc3RvcnksIFwiPEhhc2hSb3V0ZXI+IGlnbm9yZXMgdGhlIGhpc3RvcnkgcHJvcC4gVG8gdXNlIGEgY3VzdG9tIGhpc3RvcnksIFwiICsgXCJ1c2UgYGltcG9ydCB7IFJvdXRlciB9YCBpbnN0ZWFkIG9mIGBpbXBvcnQgeyBIYXNoUm91dGVyIGFzIFJvdXRlciB9YC5cIikgOiB2b2lkIDA7XG4gIH07XG59XG5cbnZhciByZXNvbHZlVG9Mb2NhdGlvbiA9IGZ1bmN0aW9uIHJlc29sdmVUb0xvY2F0aW9uKHRvLCBjdXJyZW50TG9jYXRpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiB0byA9PT0gXCJmdW5jdGlvblwiID8gdG8oY3VycmVudExvY2F0aW9uKSA6IHRvO1xufTtcbnZhciBub3JtYWxpemVUb0xvY2F0aW9uID0gZnVuY3Rpb24gbm9ybWFsaXplVG9Mb2NhdGlvbih0bywgY3VycmVudExvY2F0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgdG8gPT09IFwic3RyaW5nXCIgPyBjcmVhdGVMb2NhdGlvbih0bywgbnVsbCwgbnVsbCwgY3VycmVudExvY2F0aW9uKSA6IHRvO1xufTtcblxudmFyIGZvcndhcmRSZWZTaGltID0gZnVuY3Rpb24gZm9yd2FyZFJlZlNoaW0oQykge1xuICByZXR1cm4gQztcbn07XG5cbnZhciBmb3J3YXJkUmVmID0gUmVhY3QuZm9yd2FyZFJlZjtcblxuaWYgKHR5cGVvZiBmb3J3YXJkUmVmID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGZvcndhcmRSZWYgPSBmb3J3YXJkUmVmU2hpbTtcbn1cblxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cblxudmFyIExpbmtBbmNob3IgPSBmb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCBmb3J3YXJkZWRSZWYpIHtcbiAgdmFyIGlubmVyUmVmID0gX3JlZi5pbm5lclJlZixcbiAgICAgIG5hdmlnYXRlID0gX3JlZi5uYXZpZ2F0ZSxcbiAgICAgIF9vbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIFtcImlubmVyUmVmXCIsIFwibmF2aWdhdGVcIiwgXCJvbkNsaWNrXCJdKTtcblxuICB2YXIgdGFyZ2V0ID0gcmVzdC50YXJnZXQ7XG5cbiAgdmFyIHByb3BzID0gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX29uQ2xpY2spIF9vbkNsaWNrKGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgLy8gb25DbGljayBwcmV2ZW50ZWQgZGVmYXVsdFxuICAgICAgZXZlbnQuYnV0dG9uID09PSAwICYmICggLy8gaWdub3JlIGV2ZXJ5dGhpbmcgYnV0IGxlZnQgY2xpY2tzXG4gICAgICAhdGFyZ2V0IHx8IHRhcmdldCA9PT0gXCJfc2VsZlwiKSAmJiAvLyBsZXQgYnJvd3NlciBoYW5kbGUgXCJ0YXJnZXQ9X2JsYW5rXCIgZXRjLlxuICAgICAgIWlzTW9kaWZpZWRFdmVudChldmVudCkgLy8gaWdub3JlIGNsaWNrcyB3aXRoIG1vZGlmaWVyIGtleXNcbiAgICAgICkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgbmF2aWdhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfSk7IC8vIFJlYWN0IDE1IGNvbXBhdFxuXG5cbiAgaWYgKGZvcndhcmRSZWZTaGltICE9PSBmb3J3YXJkUmVmKSB7XG4gICAgcHJvcHMucmVmID0gZm9yd2FyZGVkUmVmIHx8IGlubmVyUmVmO1xuICB9IGVsc2Uge1xuICAgIHByb3BzLnJlZiA9IGlubmVyUmVmO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc3gtYTExeS9hbmNob3ItaGFzLWNvbnRlbnQgKi9cblxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMpO1xufSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTGlua0FuY2hvci5kaXNwbGF5TmFtZSA9IFwiTGlua0FuY2hvclwiO1xufVxuLyoqXG4gKiBUaGUgcHVibGljIEFQSSBmb3IgcmVuZGVyaW5nIGEgaGlzdG9yeS1hd2FyZSA8YT4uXG4gKi9cblxuXG52YXIgTGluayA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYyLCBmb3J3YXJkZWRSZWYpIHtcbiAgdmFyIF9yZWYyJGNvbXBvbmVudCA9IF9yZWYyLmNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudCA9IF9yZWYyJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gTGlua0FuY2hvciA6IF9yZWYyJGNvbXBvbmVudCxcbiAgICAgIHJlcGxhY2UgPSBfcmVmMi5yZXBsYWNlLFxuICAgICAgdG8gPSBfcmVmMi50byxcbiAgICAgIGlubmVyUmVmID0gX3JlZjIuaW5uZXJSZWYsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjIsIFtcImNvbXBvbmVudFwiLCBcInJlcGxhY2VcIiwgXCJ0b1wiLCBcImlubmVyUmVmXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX19Sb3V0ZXJDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICFjb250ZXh0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIllvdSBzaG91bGQgbm90IHVzZSA8TGluaz4gb3V0c2lkZSBhIDxSb3V0ZXI+XCIpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICB2YXIgaGlzdG9yeSA9IGNvbnRleHQuaGlzdG9yeTtcbiAgICB2YXIgbG9jYXRpb24gPSBub3JtYWxpemVUb0xvY2F0aW9uKHJlc29sdmVUb0xvY2F0aW9uKHRvLCBjb250ZXh0LmxvY2F0aW9uKSwgY29udGV4dC5sb2NhdGlvbik7XG4gICAgdmFyIGhyZWYgPSBsb2NhdGlvbiA/IGhpc3RvcnkuY3JlYXRlSHJlZihsb2NhdGlvbikgOiBcIlwiO1xuXG4gICAgdmFyIHByb3BzID0gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGhyZWY6IGhyZWYsXG4gICAgICBuYXZpZ2F0ZTogZnVuY3Rpb24gbmF2aWdhdGUoKSB7XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IHJlc29sdmVUb0xvY2F0aW9uKHRvLCBjb250ZXh0LmxvY2F0aW9uKTtcbiAgICAgICAgdmFyIGlzRHVwbGljYXRlTmF2aWdhdGlvbiA9IGNyZWF0ZVBhdGgoY29udGV4dC5sb2NhdGlvbikgPT09IGNyZWF0ZVBhdGgobm9ybWFsaXplVG9Mb2NhdGlvbihsb2NhdGlvbikpO1xuICAgICAgICB2YXIgbWV0aG9kID0gcmVwbGFjZSB8fCBpc0R1cGxpY2F0ZU5hdmlnYXRpb24gPyBoaXN0b3J5LnJlcGxhY2UgOiBoaXN0b3J5LnB1c2g7XG4gICAgICAgIG1ldGhvZChsb2NhdGlvbik7XG4gICAgICB9XG4gICAgfSk7IC8vIFJlYWN0IDE1IGNvbXBhdFxuXG5cbiAgICBpZiAoZm9yd2FyZFJlZlNoaW0gIT09IGZvcndhcmRSZWYpIHtcbiAgICAgIHByb3BzLnJlZiA9IGZvcndhcmRlZFJlZiB8fCBpbm5lclJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMuaW5uZXJSZWYgPSBpbm5lclJlZjtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBwcm9wcyk7XG4gIH0pO1xufSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgdmFyIHRvVHlwZSA9IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSk7XG4gIHZhciByZWZUeXBlID0gUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogUHJvcFR5cGVzLmFueVxuICB9KV0pO1xuICBMaW5rLmRpc3BsYXlOYW1lID0gXCJMaW5rXCI7XG4gIExpbmsucHJvcFR5cGVzID0ge1xuICAgIGlubmVyUmVmOiByZWZUeXBlLFxuICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAgIHJlcGxhY2U6IFByb3BUeXBlcy5ib29sLFxuICAgIHRhcmdldDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0bzogdG9UeXBlLmlzUmVxdWlyZWRcbiAgfTtcbn1cblxudmFyIGZvcndhcmRSZWZTaGltJDEgPSBmdW5jdGlvbiBmb3J3YXJkUmVmU2hpbShDKSB7XG4gIHJldHVybiBDO1xufTtcblxudmFyIGZvcndhcmRSZWYkMSA9IFJlYWN0LmZvcndhcmRSZWY7XG5cbmlmICh0eXBlb2YgZm9yd2FyZFJlZiQxID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGZvcndhcmRSZWYkMSA9IGZvcndhcmRSZWZTaGltJDE7XG59XG5cbmZ1bmN0aW9uIGpvaW5DbGFzc25hbWVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgY2xhc3NuYW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBjbGFzc25hbWVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGNsYXNzbmFtZXMuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH0pLmpvaW4oXCIgXCIpO1xufVxuLyoqXG4gKiBBIDxMaW5rPiB3cmFwcGVyIHRoYXQga25vd3MgaWYgaXQncyBcImFjdGl2ZVwiIG9yIG5vdC5cbiAqL1xuXG5cbnZhciBOYXZMaW5rID0gZm9yd2FyZFJlZiQxKGZ1bmN0aW9uIChfcmVmLCBmb3J3YXJkZWRSZWYpIHtcbiAgdmFyIF9yZWYkYXJpYUN1cnJlbnQgPSBfcmVmW1wiYXJpYS1jdXJyZW50XCJdLFxuICAgICAgYXJpYUN1cnJlbnQgPSBfcmVmJGFyaWFDdXJyZW50ID09PSB2b2lkIDAgPyBcInBhZ2VcIiA6IF9yZWYkYXJpYUN1cnJlbnQsXG4gICAgICBfcmVmJGFjdGl2ZUNsYXNzTmFtZSA9IF9yZWYuYWN0aXZlQ2xhc3NOYW1lLFxuICAgICAgYWN0aXZlQ2xhc3NOYW1lID0gX3JlZiRhY3RpdmVDbGFzc05hbWUgPT09IHZvaWQgMCA/IFwiYWN0aXZlXCIgOiBfcmVmJGFjdGl2ZUNsYXNzTmFtZSxcbiAgICAgIGFjdGl2ZVN0eWxlID0gX3JlZi5hY3RpdmVTdHlsZSxcbiAgICAgIGNsYXNzTmFtZVByb3AgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGV4YWN0ID0gX3JlZi5leGFjdCxcbiAgICAgIGlzQWN0aXZlUHJvcCA9IF9yZWYuaXNBY3RpdmUsXG4gICAgICBsb2NhdGlvblByb3AgPSBfcmVmLmxvY2F0aW9uLFxuICAgICAgc2Vuc2l0aXZlID0gX3JlZi5zZW5zaXRpdmUsXG4gICAgICBzdHJpY3QgPSBfcmVmLnN0cmljdCxcbiAgICAgIHN0eWxlUHJvcCA9IF9yZWYuc3R5bGUsXG4gICAgICB0byA9IF9yZWYudG8sXG4gICAgICBpbm5lclJlZiA9IF9yZWYuaW5uZXJSZWYsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgW1wiYXJpYS1jdXJyZW50XCIsIFwiYWN0aXZlQ2xhc3NOYW1lXCIsIFwiYWN0aXZlU3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJleGFjdFwiLCBcImlzQWN0aXZlXCIsIFwibG9jYXRpb25cIiwgXCJzZW5zaXRpdmVcIiwgXCJzdHJpY3RcIiwgXCJzdHlsZVwiLCBcInRvXCIsIFwiaW5uZXJSZWZcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfX1JvdXRlckNvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgIWNvbnRleHQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiWW91IHNob3VsZCBub3QgdXNlIDxOYXZMaW5rPiBvdXRzaWRlIGEgPFJvdXRlcj5cIikgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIHZhciBjdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvblByb3AgfHwgY29udGV4dC5sb2NhdGlvbjtcbiAgICB2YXIgdG9Mb2NhdGlvbiA9IG5vcm1hbGl6ZVRvTG9jYXRpb24ocmVzb2x2ZVRvTG9jYXRpb24odG8sIGN1cnJlbnRMb2NhdGlvbiksIGN1cnJlbnRMb2NhdGlvbik7XG4gICAgdmFyIHBhdGggPSB0b0xvY2F0aW9uLnBhdGhuYW1lOyAvLyBSZWdleCB0YWtlbiBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vcGlsbGFyanMvcGF0aC10by1yZWdleHAvYmxvYi9tYXN0ZXIvaW5kZXguanMjTDIwMlxuXG4gICAgdmFyIGVzY2FwZWRQYXRoID0gcGF0aCAmJiBwYXRoLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18L1xcXFxdKS9nLCBcIlxcXFwkMVwiKTtcbiAgICB2YXIgbWF0Y2ggPSBlc2NhcGVkUGF0aCA/IG1hdGNoUGF0aChjdXJyZW50TG9jYXRpb24ucGF0aG5hbWUsIHtcbiAgICAgIHBhdGg6IGVzY2FwZWRQYXRoLFxuICAgICAgZXhhY3Q6IGV4YWN0LFxuICAgICAgc2Vuc2l0aXZlOiBzZW5zaXRpdmUsXG4gICAgICBzdHJpY3Q6IHN0cmljdFxuICAgIH0pIDogbnVsbDtcbiAgICB2YXIgaXNBY3RpdmUgPSAhIShpc0FjdGl2ZVByb3AgPyBpc0FjdGl2ZVByb3AobWF0Y2gsIGN1cnJlbnRMb2NhdGlvbikgOiBtYXRjaCk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHR5cGVvZiBjbGFzc05hbWVQcm9wID09PSBcImZ1bmN0aW9uXCIgPyBjbGFzc05hbWVQcm9wKGlzQWN0aXZlKSA6IGNsYXNzTmFtZVByb3A7XG4gICAgdmFyIHN0eWxlID0gdHlwZW9mIHN0eWxlUHJvcCA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVQcm9wKGlzQWN0aXZlKSA6IHN0eWxlUHJvcDtcblxuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgY2xhc3NOYW1lID0gam9pbkNsYXNzbmFtZXMoY2xhc3NOYW1lLCBhY3RpdmVDbGFzc05hbWUpO1xuICAgICAgc3R5bGUgPSBfZXh0ZW5kcyh7fSwgc3R5bGUsIGFjdGl2ZVN0eWxlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7XG4gICAgICBcImFyaWEtY3VycmVudFwiOiBpc0FjdGl2ZSAmJiBhcmlhQ3VycmVudCB8fCBudWxsLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB0bzogdG9Mb2NhdGlvblxuICAgIH0sIHJlc3QpOyAvLyBSZWFjdCAxNSBjb21wYXRcblxuXG4gICAgaWYgKGZvcndhcmRSZWZTaGltJDEgIT09IGZvcndhcmRSZWYkMSkge1xuICAgICAgcHJvcHMucmVmID0gZm9yd2FyZGVkUmVmIHx8IGlubmVyUmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcy5pbm5lclJlZiA9IGlubmVyUmVmO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaW5rLCBwcm9wcyk7XG4gIH0pO1xufSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgTmF2TGluay5kaXNwbGF5TmFtZSA9IFwiTmF2TGlua1wiO1xuICB2YXIgYXJpYUN1cnJlbnRUeXBlID0gUHJvcFR5cGVzLm9uZU9mKFtcInBhZ2VcIiwgXCJzdGVwXCIsIFwibG9jYXRpb25cIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcInRydWVcIiwgXCJmYWxzZVwiXSk7XG4gIE5hdkxpbmsucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIExpbmsucHJvcFR5cGVzLCB7XG4gICAgXCJhcmlhLWN1cnJlbnRcIjogYXJpYUN1cnJlbnRUeXBlLFxuICAgIGFjdGl2ZUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBhY3RpdmVTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZXhhY3Q6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzQWN0aXZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBsb2NhdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzZW5zaXRpdmU6IFByb3BUeXBlcy5ib29sLFxuICAgIHN0cmljdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5mdW5jXSlcbiAgfSk7XG59XG5cbmV4cG9ydCB7IEJyb3dzZXJSb3V0ZXIsIEhhc2hSb3V0ZXIsIExpbmssIE5hdkxpbmsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LXJvdXRlci1kb20uanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30876\n")},31052:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Klingon [tlh]\n//! author : Dominika Kruk : https://github.com/amaranthrose\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');\n\n function translateFuture(output) {\n var time = output;\n time =\n output.indexOf('jaj') !== -1\n ? time.slice(0, -3) + 'leS'\n : output.indexOf('jar') !== -1\n ? time.slice(0, -3) + 'waQ'\n : output.indexOf('DIS') !== -1\n ? time.slice(0, -3) + 'nem'\n : time + ' pIq';\n return time;\n }\n\n function translatePast(output) {\n var time = output;\n time =\n output.indexOf('jaj') !== -1\n ? time.slice(0, -3) + 'Hu’'\n : output.indexOf('jar') !== -1\n ? time.slice(0, -3) + 'wen'\n : output.indexOf('DIS') !== -1\n ? time.slice(0, -3) + 'ben'\n : time + ' ret';\n return time;\n }\n\n function translate(number, withoutSuffix, string, isFuture) {\n var numberNoun = numberAsNoun(number);\n switch (string) {\n case 'ss':\n return numberNoun + ' lup';\n case 'mm':\n return numberNoun + ' tup';\n case 'hh':\n return numberNoun + ' rep';\n case 'dd':\n return numberNoun + ' jaj';\n case 'MM':\n return numberNoun + ' jar';\n case 'yy':\n return numberNoun + ' DIS';\n }\n }\n\n function numberAsNoun(number) {\n var hundred = Math.floor((number % 1000) / 100),\n ten = Math.floor((number % 100) / 10),\n one = number % 10,\n word = '';\n if (hundred > 0) {\n word += numbersNouns[hundred] + 'vatlh';\n }\n if (ten > 0) {\n word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';\n }\n if (one > 0) {\n word += (word !== '' ? ' ' : '') + numbersNouns[one];\n }\n return word === '' ? 'pagh' : word;\n }\n\n var tlh = moment.defineLocale('tlh', {\n months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(\n '_'\n ),\n monthsShort:\n 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(\n '_'\n ),\n weekdaysShort:\n 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n weekdaysMin:\n 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[DaHjaj] LT',\n nextDay: '[wa’leS] LT',\n nextWeek: 'LLL',\n lastDay: '[wa’Hu’] LT',\n lastWeek: 'LLL',\n sameElse: 'L',\n },\n relativeTime: {\n future: translateFuture,\n past: translatePast,\n s: 'puS lup',\n ss: translate,\n m: 'wa’ tup',\n mm: translate,\n h: 'wa’ rep',\n hh: translate,\n d: 'wa’ jaj',\n dd: translate,\n M: 'wa’ jar',\n MM: translate,\n y: 'wa’ DIS',\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return tlh;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEwNTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qcz9jZjc1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLbGluZ29uIFt0bGhdXG4vLyEgYXV0aG9yIDogRG9taW5pa2EgS3J1ayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbWFyYW50aHJvc2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBudW1iZXJzTm91bnMgPSAncGFnaF93YeKAmV9jaGHigJlfd2VqX2xvU192YWdoX2phdl9Tb2NoX2Nob3JnaF9IdXQnLnNwbGl0KCdfJyk7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVGdXR1cmUob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ2xlUydcbiAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdqYXInKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnd2FRJ1xuICAgICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignRElTJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnbmVtJ1xuICAgICAgICAgICAgICAgICAgICA6IHRpbWUgKyAnIHBJcSc7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVBhc3Qob3V0cHV0KSB7XG4gICAgICAgIHZhciB0aW1lID0gb3V0cHV0O1xuICAgICAgICB0aW1lID1cbiAgICAgICAgICAgIG91dHB1dC5pbmRleE9mKCdqYWonKSAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ0h14oCZJ1xuICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ2phcicpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICd3ZW4nXG4gICAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdESVMnKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICdiZW4nXG4gICAgICAgICAgICAgICAgICAgIDogdGltZSArICcgcmV0JztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtYmVyTm91biA9IG51bWJlckFzTm91bihudW1iZXIpO1xuICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBsdXAnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyB0dXAnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyByZXAnO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYWonO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYXInO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBESVMnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVtYmVyQXNOb3VuKG51bWJlcikge1xuICAgICAgICB2YXIgaHVuZHJlZCA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMDApIC8gMTAwKSxcbiAgICAgICAgICAgIHRlbiA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMCkgLyAxMCksXG4gICAgICAgICAgICBvbmUgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgIHdvcmQgPSAnJztcbiAgICAgICAgaWYgKGh1bmRyZWQgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9IG51bWJlcnNOb3Vuc1todW5kcmVkXSArICd2YXRsaCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlbiA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gKHdvcmQgIT09ICcnID8gJyAnIDogJycpICsgbnVtYmVyc05vdW5zW3Rlbl0gKyAnbWFIJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob25lID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSAod29yZCAhPT0gJycgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbb25lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29yZCA9PT0gJycgPyAncGFnaCcgOiB3b3JkO1xuICAgIH1cblxuICAgIHZhciB0bGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bGgnLCB7XG4gICAgICAgIG1vbnRoczogJ3RlcmHigJkgamFyIHdh4oCZX3RlcmHigJkgamFyIGNoYeKAmV90ZXJh4oCZIGphciB3ZWpfdGVyYeKAmSBqYXIgbG9TX3RlcmHigJkgamFyIHZhZ2hfdGVyYeKAmSBqYXIgamF2X3RlcmHigJkgamFyIFNvY2hfdGVyYeKAmSBqYXIgY2hvcmdoX3RlcmHigJkgamFyIEh1dF90ZXJh4oCZIGphciB3YeKAmW1hSF90ZXJh4oCZIGphciB3YeKAmW1hSCB3YeKAmV90ZXJh4oCZIGphciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phciB3YeKAmV9qYXIgY2hh4oCZX2phciB3ZWpfamFyIGxvU19qYXIgdmFnaF9qYXIgamF2X2phciBTb2NoX2phciBjaG9yZ2hfamFyIEh1dF9qYXIgd2HigJltYUhfamFyIHdh4oCZbWFIIHdh4oCZX2phciB3YeKAmW1hSCBjaGHigJknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46XG4gICAgICAgICAgICAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRGFIamFqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3dh4oCZbGVTXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xMTCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3dh4oCZSHXigJldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiB0cmFuc2xhdGVGdXR1cmUsXG4gICAgICAgICAgICBwYXN0OiB0cmFuc2xhdGVQYXN0LFxuICAgICAgICAgICAgczogJ3B1UyBsdXAnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06ICd3YeKAmSB0dXAnLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6ICd3YeKAmSByZXAnLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICd3YeKAmSBqYWonLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICd3YeKAmSBqYXInLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICd3YeKAmSBESVMnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0bGg7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31052\n")},31067:(I,g,n)=>{"use strict";I.exports=n.p+"39fd5179a9c43d00f56a.png"},31081:(I,g,n)=>{"use strict";I.exports=n.p+"74b674c0bb1fd8a972cd.png"},31415:(I,g,n)=>{"use strict";I.exports=n.p+"9dd9d8787cda429aa9f2.png"},31541:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Chinese (Macau) [zh-mo]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n//! author : Tan Yuanhong : https://github.com/le0tan\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var zhMo = moment.defineLocale('zh-mo', {\n months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n '_'\n ),\n monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n '_'\n ),\n weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'YYYY年M月D日',\n LLL: 'YYYY年M月D日 HH:mm',\n LLLL: 'YYYY年M月D日dddd HH:mm',\n l: 'D/M/YYYY',\n ll: 'YYYY年M月D日',\n lll: 'YYYY年M月D日 HH:mm',\n llll: 'YYYY年M月D日dddd HH:mm',\n },\n meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n return hour;\n } else if (meridiem === '中午') {\n return hour >= 11 ? hour : hour + 12;\n } else if (meridiem === '下午' || meridiem === '晚上') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n var hm = hour * 100 + minute;\n if (hm < 600) {\n return '凌晨';\n } else if (hm < 900) {\n return '早上';\n } else if (hm < 1130) {\n return '上午';\n } else if (hm < 1230) {\n return '中午';\n } else if (hm < 1800) {\n return '下午';\n } else {\n return '晚上';\n }\n },\n calendar: {\n sameDay: '[今天] LT',\n nextDay: '[明天] LT',\n nextWeek: '[下]dddd LT',\n lastDay: '[昨天] LT',\n lastWeek: '[上]dddd LT',\n sameElse: 'L',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '日';\n case 'M':\n return number + '月';\n case 'w':\n case 'W':\n return number + '週';\n default:\n return number;\n }\n },\n relativeTime: {\n future: '%s內',\n past: '%s前',\n s: '幾秒',\n ss: '%d 秒',\n m: '1 分鐘',\n mm: '%d 分鐘',\n h: '1 小時',\n hh: '%d 小時',\n d: '1 天',\n dd: '%d 天',\n M: '1 個月',\n MM: '%d 個月',\n y: '1 年',\n yy: '%d 年',\n },\n });\n\n return zhMo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE1NDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzPzNhNmMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKE1hY2F1KSBbemgtbW9dXG4vLyEgYXV0aG9yIDogQmVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jlbi1saW5cbi8vISBhdXRob3IgOiBDaHJpcyBMYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaGVoYWNocmlzXG4vLyEgYXV0aG9yIDogVGFuIFl1YW5ob25nIDogaHR0cHM6Ly9naXRodWIuY29tL2xlMHRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoTW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1tbycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+WFpycsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aE1vO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///31541\n")},31545:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Tibetan [bo]\n//! author : Thupten N. Chakrishar : https://github.com/vajradog\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '༡',\n 2: '༢',\n 3: '༣',\n 4: '༤',\n 5: '༥',\n 6: '༦',\n 7: '༧',\n 8: '༨',\n 9: '༩',\n 0: '༠',\n },\n numberMap = {\n '༡': '1',\n '༢': '2',\n '༣': '3',\n '༤': '4',\n '༥': '5',\n '༦': '6',\n '༧': '7',\n '༨': '8',\n '༩': '9',\n '༠': '0',\n };\n\n var bo = moment.defineLocale('bo', {\n months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(\n '_'\n ),\n monthsShort:\n 'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(\n '_'\n ),\n monthsShortRegex: /^(ཟླ་\\d{1,2})/,\n monthsParseExact: true,\n weekdays:\n 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(\n '_'\n ),\n weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(\n '_'\n ),\n weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),\n longDateFormat: {\n LT: 'A h:mm',\n LTS: 'A h:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm',\n LLLL: 'dddd, D MMMM YYYY, A h:mm',\n },\n calendar: {\n sameDay: '[དི་རིང] LT',\n nextDay: '[སང་ཉིན] LT',\n nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',\n lastDay: '[ཁ་སང] LT',\n lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s ལ་',\n past: '%s སྔན་ལ',\n s: 'ལམ་སང',\n ss: '%d སྐར་ཆ།',\n m: 'སྐར་མ་གཅིག',\n mm: '%d སྐར་མ',\n h: 'ཆུ་ཚོད་གཅིག',\n hh: '%d ཆུ་ཚོད',\n d: 'ཉིན་གཅིག',\n dd: '%d ཉིན་',\n M: 'ཟླ་བ་གཅིག',\n MM: '%d ཟླ་བ',\n y: 'ལོ་གཅིག',\n yy: '%d ལོ',\n },\n preparse: function (string) {\n return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (\n (meridiem === 'མཚན་མོ' && hour >= 4) ||\n (meridiem === 'ཉིན་གུང' && hour < 5) ||\n meridiem === 'དགོང་དག'\n ) {\n return hour + 12;\n } else {\n return hour;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'མཚན་མོ';\n } else if (hour < 10) {\n return 'ཞོགས་ཀས';\n } else if (hour < 17) {\n return 'ཉིན་གུང';\n } else if (hour < 20) {\n return 'དགོང་དག';\n } else {\n return 'མཚན་མོ';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return bo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE1NDUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JvLmpzP2QyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRpYmV0YW4gW2JvXVxuLy8hIGF1dGhvciA6IFRodXB0ZW4gTi4gQ2hha3Jpc2hhciA6IGh0dHBzOi8vZ2l0aHViLmNvbS92YWpyYWRvZ1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgvKEnLFxuICAgICAgICAgICAgMjogJ+C8oicsXG4gICAgICAgICAgICAzOiAn4LyjJyxcbiAgICAgICAgICAgIDQ6ICfgvKQnLFxuICAgICAgICAgICAgNTogJ+C8pScsXG4gICAgICAgICAgICA2OiAn4LymJyxcbiAgICAgICAgICAgIDc6ICfgvKcnLFxuICAgICAgICAgICAgODogJ+C8qCcsXG4gICAgICAgICAgICA5OiAn4LypJyxcbiAgICAgICAgICAgIDA6ICfgvKAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4LyhJzogJzEnLFxuICAgICAgICAgICAgJ+C8oic6ICcyJyxcbiAgICAgICAgICAgICfgvKMnOiAnMycsXG4gICAgICAgICAgICAn4LykJzogJzQnLFxuICAgICAgICAgICAgJ+C8pSc6ICc1JyxcbiAgICAgICAgICAgICfgvKYnOiAnNicsXG4gICAgICAgICAgICAn4LynJzogJzcnLFxuICAgICAgICAgICAgJ+C8qCc6ICc4JyxcbiAgICAgICAgICAgICfgvKknOiAnOScsXG4gICAgICAgICAgICAn4LygJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm8nLCB7XG4gICAgICAgIG1vbnRoczogJ+C9n+C+s+C8i+C9luC8i+C9keC9hOC8i+C9lOC9vF/gvZ/gvrPgvIvgvZbgvIvgvYLgvYngvbLgvabgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2C4L2m4L204L2Y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9nuC9suC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvaPgvpTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L6y4L204L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9keC9tOC9k+C8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvaLgvpLgvrHgvZHgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L2C4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYXgvbLgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2J4L2y4L2m4LyL4L2UJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgvZ/gvrPgvIsxX+C9n+C+s+C8izJf4L2f4L6z4LyLM1/gvZ/gvrPgvIs0X+C9n+C+s+C8izVf4L2f4L6z4LyLNl/gvZ/gvrPgvIs3X+C9n+C+s+C8izhf4L2f4L6z4LyLOV/gvZ/gvrPgvIsxMF/gvZ/gvrPgvIsxMV/gvZ/gvrPgvIsxMicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiAvXijgvZ/gvrPgvItcXGR7MSwyfSkvLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgvYLgvZ/gvaDgvIvgvYngvbLgvIvgvZjgvItf4L2C4L2f4L2g4LyL4L2f4L6z4LyL4L2W4LyLX+C9guC9n+C9oOC8i+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvYLgvZ/gvaDgvIvgvaPgvrfgvYLgvIvgvZTgvItf4L2C4L2f4L2g4LyL4L2V4L204L2i4LyL4L2W4L20X+C9guC9n+C9oOC8i+C9lOC8i+C9puC9hOC9puC8i1/gvYLgvZ/gvaDgvIvgvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C9ieC9suC8i+C9mOC8i1/gvZ/gvrPgvIvgvZbgvItf4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9o+C+t+C9guC8i+C9lOC8i1/gvZXgvbTgvaLgvIvgvZbgvbRf4L2U4LyL4L2m4L2E4L2m4LyLX+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgvYngvbJf4L2f4L6zX+C9mOC9suC9gl/gvaPgvrfgvYJf4L2V4L204L2iX+C9puC9hOC9pl/gvabgvqTgvbrgvZMnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4L2R4L2y4LyL4L2i4L2y4L2EXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C9puC9hOC8i+C9ieC9suC9k10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2i4L6X4L264L2m4LyL4L2YXSwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgvYHgvIvgvabgvYRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9mOC9kOC9oOC8i+C9mF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgvaPgvIsnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOC9puC+lOC9k+C8i+C9oycsXG4gICAgICAgICAgICBzOiAn4L2j4L2Y4LyL4L2m4L2EJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4L2m4L6Q4L2i4LyL4L2G4LyNJyxcbiAgICAgICAgICAgIG06ICfgvabgvpDgvaLgvIvgvZjgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgbW06ICclZCDgvabgvpDgvaLgvIvgvZgnLFxuICAgICAgICAgICAgaDogJ+C9huC9tOC8i+C9muC9vOC9keC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBoaDogJyVkIOC9huC9tOC8i+C9muC9vOC9kScsXG4gICAgICAgICAgICBkOiAn4L2J4L2y4L2T4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4L2J4L2y4L2T4LyLJyxcbiAgICAgICAgICAgIE06ICfgvZ/gvrPgvIvgvZbgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgTU06ICclZCDgvZ/gvrPgvIvgvZYnLFxuICAgICAgICAgICAgeTogJ+C9o+C9vOC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICB5eTogJyVkIOC9o+C9vCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKngvKBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gvZjgvZrgvZPgvIvgvZjgvbx84L2e4L284L2C4L2m4LyL4L2A4L2mfOC9ieC9suC9k+C8i+C9guC9tOC9hHzgvZHgvYLgvbzgvYTgvIvgvZHgvYJ84L2Y4L2a4L2T4LyL4L2Y4L28LyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C9mOC9muC9k+C8i+C9mOC9vCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C9ieC9suC9k+C8i+C9guC9tOC9hCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgvZHgvYLgvbzgvYTgvIvgvZHgvYInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2Y4L2a4L2T4LyL4L2Y4L28JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZ7gvbzgvYLgvabgvIvgvYDgvaYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9ieC9suC9k+C8i+C9guC9tOC9hCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2R4L2C4L284L2E4LyL4L2R4L2CJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZjgvZrgvZPgvIvgvZjgvbwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm87XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31545\n")},31928:module=>{"use strict";eval("\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE5MjguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbC5qcz83YTc3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIGBDYW5jZWxgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbn1cblxuQ2FuY2VsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ0NhbmNlbCcgKyAodGhpcy5tZXNzYWdlID8gJzogJyArIHRoaXMubWVzc2FnZSA6ICcnKTtcbn07XG5cbkNhbmNlbC5wcm90b3R5cGUuX19DQU5DRUxfXyA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///31928\n")},32124:(I,g,n)=>{"use strict";I.exports=n.p+"d19ed8d866caa5f82471.png"},32591:(I,g,n)=>{"use strict";I.exports=n.p+"29383785ea58842c83f9.png"},32934:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Esperanto [eo]\n//! author : Colin Dean : https://github.com/colindean\n//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia\n//! comment : miestasmia corrected the translation by colindean\n//! comment : Vivakvo corrected the translation by colindean and miestasmia\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var eo = moment.defineLocale('eo', {\n months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(\n '_'\n ),\n monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),\n weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),\n weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),\n weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: '[la] D[-an de] MMMM, YYYY',\n LLL: '[la] D[-an de] MMMM, YYYY HH:mm',\n LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',\n llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',\n },\n meridiemParse: /[ap]\\.t\\.m/i,\n isPM: function (input) {\n return input.charAt(0).toLowerCase() === 'p';\n },\n meridiem: function (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'p.t.m.' : 'P.T.M.';\n } else {\n return isLower ? 'a.t.m.' : 'A.T.M.';\n }\n },\n calendar: {\n sameDay: '[Hodiaŭ je] LT',\n nextDay: '[Morgaŭ je] LT',\n nextWeek: 'dddd[n je] LT',\n lastDay: '[Hieraŭ je] LT',\n lastWeek: '[pasintan] dddd[n je] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'post %s',\n past: 'antaŭ %s',\n s: 'kelkaj sekundoj',\n ss: '%d sekundoj',\n m: 'unu minuto',\n mm: '%d minutoj',\n h: 'unu horo',\n hh: '%d horoj',\n d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo\n dd: '%d tagoj',\n M: 'unu monato',\n MM: '%d monatoj',\n y: 'unu jaro',\n yy: '%d jaroj',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}a/,\n ordinal: '%da',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return eo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI5MzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW8uanM/NjVkYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRXNwZXJhbnRvIFtlb11cbi8vISBhdXRob3IgOiBDb2xpbiBEZWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2NvbGluZGVhblxuLy8hIGF1dGhvciA6IE1pYSBOb3JkZW50b2Z0IEltcGVyYXRvcmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWllc3Rhc21pYVxuLy8hIGNvbW1lbnQgOiBtaWVzdGFzbWlhIGNvcnJlY3RlZCB0aGUgdHJhbnNsYXRpb24gYnkgY29saW5kZWFuXG4vLyEgY29tbWVudCA6IFZpdmFrdm8gY29ycmVjdGVkIHRoZSB0cmFuc2xhdGlvbiBieSBjb2xpbmRlYW4gYW5kIG1pZXN0YXNtaWFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJvX2ZlYnJ1YXJvX21hcnRvX2Fwcmlsb19tYWpvX2p1bmlvX2p1bGlvX2HFrWd1c3RvX3NlcHRlbWJyb19va3RvYnJvX25vdmVtYnJvX2RlY2VtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFydF9hcHJfbWFqX2p1bl9qdWxfYcWtZ19zZXB0X29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuxIlvX2x1bmRvX21hcmRvX21lcmtyZWRvX8S1YcWtZG9fdmVuZHJlZG9fc2FiYXRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltX2x1bl9tYXJkX21lcmtfxLVhxa1fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV/EtWFfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkW25dLCBbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIFtsYV0gRFstYW4gZGVdIE1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9bYXBdXFwudFxcLm0vaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgPT09ICdwJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwLnQubS4nIDogJ1AuVC5NLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2EudC5tLicgOiAnQS5ULk0uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9kaWHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNb3JnYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGRbbiBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1twYXNpbnRhbl0gZGRkZFtuIGplXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Bvc3QgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2FudGHFrSAlcycsXG4gICAgICAgICAgICBzOiAna2Vsa2FqIHNla3VuZG9qJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kb2onLFxuICAgICAgICAgICAgbTogJ3VudSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9qJyxcbiAgICAgICAgICAgIGg6ICd1bnUgaG9ybycsXG4gICAgICAgICAgICBoaDogJyVkIGhvcm9qJyxcbiAgICAgICAgICAgIGQ6ICd1bnUgdGFnbycsIC8vbmUgJ2RpdXJubycsIMSJYXIgZXN0YXMgdXppdGEgcG9yIHByb2tzaW11bW9cbiAgICAgICAgICAgIGRkOiAnJWQgdGFnb2onLFxuICAgICAgICAgICAgTTogJ3VudSBtb25hdG8nLFxuICAgICAgICAgICAgTU06ICclZCBtb25hdG9qJyxcbiAgICAgICAgICAgIHk6ICd1bnUgamFybycsXG4gICAgICAgICAgICB5eTogJyVkIGphcm9qJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9YS8sXG4gICAgICAgIG9yZGluYWw6ICclZGEnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW87XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///32934\n")},33478:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Northern Sami [se]\n//! authors : Bård Rolstad Henriksen : https://github.com/karamell\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var se = moment.defineLocale('se', {\n months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(\n '_'\n ),\n monthsShort:\n 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),\n weekdays:\n 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(\n '_'\n ),\n weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),\n weekdaysMin: 's_v_m_g_d_b_L'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'MMMM D. [b.] YYYY',\n LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',\n LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',\n },\n calendar: {\n sameDay: '[otne ti] LT',\n nextDay: '[ihttin ti] LT',\n nextWeek: 'dddd [ti] LT',\n lastDay: '[ikte ti] LT',\n lastWeek: '[ovddit] dddd [ti] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s geažes',\n past: 'maŋit %s',\n s: 'moadde sekunddat',\n ss: '%d sekunddat',\n m: 'okta minuhta',\n mm: '%d minuhtat',\n h: 'okta diimmu',\n hh: '%d diimmut',\n d: 'okta beaivi',\n dd: '%d beaivvit',\n M: 'okta mánnu',\n MM: '%d mánut',\n y: 'okta jahki',\n yy: '%d jagit',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return se;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM0NzguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qcz9mZmZmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J0aGVybiBTYW1pIFtzZV1cbi8vISBhdXRob3JzIDogQsOlcmQgUm9sc3RhZCBIZW5yaWtzZW4gOiBodHRwczovL2dpdGh1Yi5jb20va2FyYW1lbGxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NlJywge1xuICAgICAgICBtb250aHM6ICdvxJHEkWFqYWdlbcOhbm51X2d1b3Z2YW3DoW5udV9uanVrxI1hbcOhbm51X2N1b8WLb23DoW5udV9taWVzc2Vtw6FubnVfZ2Vhc3NlbcOhbm51X3N1b2lkbmVtw6FubnVfYm9yZ2Vtw6FubnVfxI1ha8SNYW3DoW5udV9nb2xnZ290bcOhbm51X3Nrw6FibWFtw6FubnVfanVvdmxhbcOhbm51Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdvxJHEkWpfZ3Vvdl9uanVrX2N1b19taWVzX2dlYXNfc3VvaV9ib3JnX8SNYWvEjV9nb2xnX3Nrw6FiX2p1b3YnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3NvdG5hYmVhaXZpX3Z1b3Nzw6FyZ2FfbWHFi8WLZWLDoXJnYV9nYXNrYXZhaGtrdV9kdW9yYXN0YXRfYmVhcmphZGF0X2zDoXZ2YXJkYXQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3NvdG5fdnVvc19tYcWLX2dhc2tfZHVvcl9iZWFyX2zDoXYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc192X21fZ19kX2JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQuIFtiLl0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELiBbYi5dIFlZWVkgW3RpLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tvdG5lIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2lodHRpbiB0aV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0aV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpa3RlIHRpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tvdmRkaXRdIGRkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGdlYcW+ZXMnLFxuICAgICAgICAgICAgcGFzdDogJ21hxYtpdCAlcycsXG4gICAgICAgICAgICBzOiAnbW9hZGRlIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGRhdCcsXG4gICAgICAgICAgICBtOiAnb2t0YSBtaW51aHRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludWh0YXQnLFxuICAgICAgICAgICAgaDogJ29rdGEgZGlpbW11JyxcbiAgICAgICAgICAgIGhoOiAnJWQgZGlpbW11dCcsXG4gICAgICAgICAgICBkOiAnb2t0YSBiZWFpdmknLFxuICAgICAgICAgICAgZGQ6ICclZCBiZWFpdnZpdCcsXG4gICAgICAgICAgICBNOiAnb2t0YSBtw6FubnUnLFxuICAgICAgICAgICAgTU06ICclZCBtw6FudXQnLFxuICAgICAgICAgICAgeTogJ29rdGEgamFoa2knLFxuICAgICAgICAgICAgeXk6ICclZCBqYWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2U7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33478\n")},33499:(I,g,n)=>{"use strict";I.exports=n.p+"885b2e75e13943d608fc.png"},33948:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM5NDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanM/N2FhYyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICAgICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgICAgICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgICAgICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobmFtZSkge1xuICAgICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///33948\n")},34297:function(module,exports){eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Generated by CoffeeScript 1.8.0\n(function() {\n var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup;\n\n floor = Math.floor, min = Math.min;\n\n\n /*\n Default comparison function to be used\n */\n\n defaultCmp = function(x, y) {\n if (x < y) {\n return -1;\n }\n if (x > y) {\n return 1;\n }\n return 0;\n };\n\n\n /*\n Insert item x in list a, and keep it sorted assuming a is sorted.\n \n If x is already in a, insert it to the right of the rightmost x.\n \n Optional args lo (default 0) and hi (default a.length) bound the slice\n of a to be searched.\n */\n\n insort = function(a, x, lo, hi, cmp) {\n var mid;\n if (lo == null) {\n lo = 0;\n }\n if (cmp == null) {\n cmp = defaultCmp;\n }\n if (lo < 0) {\n throw new Error('lo must be non-negative');\n }\n if (hi == null) {\n hi = a.length;\n }\n while (lo < hi) {\n mid = floor((lo + hi) / 2);\n if (cmp(x, a[mid]) < 0) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n return ([].splice.apply(a, [lo, lo - lo].concat(x)), x);\n };\n\n\n /*\n Push item onto heap, maintaining the heap invariant.\n */\n\n heappush = function(array, item, cmp) {\n if (cmp == null) {\n cmp = defaultCmp;\n }\n array.push(item);\n return _siftdown(array, 0, array.length - 1, cmp);\n };\n\n\n /*\n Pop the smallest item off the heap, maintaining the heap invariant.\n */\n\n heappop = function(array, cmp) {\n var lastelt, returnitem;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n lastelt = array.pop();\n if (array.length) {\n returnitem = array[0];\n array[0] = lastelt;\n _siftup(array, 0, cmp);\n } else {\n returnitem = lastelt;\n }\n return returnitem;\n };\n\n\n /*\n Pop and return the current smallest value, and add the new item.\n \n This is more efficient than heappop() followed by heappush(), and can be\n more appropriate when using a fixed size heap. Note that the value\n returned may be larger than item! That constrains reasonable use of\n this routine unless written as part of a conditional replacement:\n if item > array[0]\n item = heapreplace(array, item)\n */\n\n heapreplace = function(array, item, cmp) {\n var returnitem;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n returnitem = array[0];\n array[0] = item;\n _siftup(array, 0, cmp);\n return returnitem;\n };\n\n\n /*\n Fast version of a heappush followed by a heappop.\n */\n\n heappushpop = function(array, item, cmp) {\n var _ref;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n if (array.length && cmp(array[0], item) < 0) {\n _ref = [array[0], item], item = _ref[0], array[0] = _ref[1];\n _siftup(array, 0, cmp);\n }\n return item;\n };\n\n\n /*\n Transform list into a heap, in-place, in O(array.length) time.\n */\n\n heapify = function(array, cmp) {\n var i, _i, _j, _len, _ref, _ref1, _results, _results1;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n _ref1 = (function() {\n _results1 = [];\n for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); }\n return _results1;\n }).apply(this).reverse();\n _results = [];\n for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n i = _ref1[_i];\n _results.push(_siftup(array, i, cmp));\n }\n return _results;\n };\n\n\n /*\n Update the position of the given item in the heap.\n This function should be called every time the item is being modified.\n */\n\n updateItem = function(array, item, cmp) {\n var pos;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n pos = array.indexOf(item);\n if (pos === -1) {\n return;\n }\n _siftdown(array, 0, pos, cmp);\n return _siftup(array, pos, cmp);\n };\n\n\n /*\n Find the n largest elements in a dataset.\n */\n\n nlargest = function(array, n, cmp) {\n var elem, result, _i, _len, _ref;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n result = array.slice(0, n);\n if (!result.length) {\n return result;\n }\n heapify(result, cmp);\n _ref = array.slice(n);\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n elem = _ref[_i];\n heappushpop(result, elem, cmp);\n }\n return result.sort(cmp).reverse();\n };\n\n\n /*\n Find the n smallest elements in a dataset.\n */\n\n nsmallest = function(array, n, cmp) {\n var elem, i, los, result, _i, _j, _len, _ref, _ref1, _results;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n if (n * 10 <= array.length) {\n result = array.slice(0, n).sort(cmp);\n if (!result.length) {\n return result;\n }\n los = result[result.length - 1];\n _ref = array.slice(n);\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n elem = _ref[_i];\n if (cmp(elem, los) < 0) {\n insort(result, elem, 0, null, cmp);\n result.pop();\n los = result[result.length - 1];\n }\n }\n return result;\n }\n heapify(array, cmp);\n _results = [];\n for (i = _j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {\n _results.push(heappop(array, cmp));\n }\n return _results;\n };\n\n _siftdown = function(array, startpos, pos, cmp) {\n var newitem, parent, parentpos;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n newitem = array[pos];\n while (pos > startpos) {\n parentpos = (pos - 1) >> 1;\n parent = array[parentpos];\n if (cmp(newitem, parent) < 0) {\n array[pos] = parent;\n pos = parentpos;\n continue;\n }\n break;\n }\n return array[pos] = newitem;\n };\n\n _siftup = function(array, pos, cmp) {\n var childpos, endpos, newitem, rightpos, startpos;\n if (cmp == null) {\n cmp = defaultCmp;\n }\n endpos = array.length;\n startpos = pos;\n newitem = array[pos];\n childpos = 2 * pos + 1;\n while (childpos < endpos) {\n rightpos = childpos + 1;\n if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) {\n childpos = rightpos;\n }\n array[pos] = array[childpos];\n pos = childpos;\n childpos = 2 * pos + 1;\n }\n array[pos] = newitem;\n return _siftdown(array, startpos, pos, cmp);\n };\n\n Heap = (function() {\n Heap.push = heappush;\n\n Heap.pop = heappop;\n\n Heap.replace = heapreplace;\n\n Heap.pushpop = heappushpop;\n\n Heap.heapify = heapify;\n\n Heap.updateItem = updateItem;\n\n Heap.nlargest = nlargest;\n\n Heap.nsmallest = nsmallest;\n\n function Heap(cmp) {\n this.cmp = cmp != null ? cmp : defaultCmp;\n this.nodes = [];\n }\n\n Heap.prototype.push = function(x) {\n return heappush(this.nodes, x, this.cmp);\n };\n\n Heap.prototype.pop = function() {\n return heappop(this.nodes, this.cmp);\n };\n\n Heap.prototype.peek = function() {\n return this.nodes[0];\n };\n\n Heap.prototype.contains = function(x) {\n return this.nodes.indexOf(x) !== -1;\n };\n\n Heap.prototype.replace = function(x) {\n return heapreplace(this.nodes, x, this.cmp);\n };\n\n Heap.prototype.pushpop = function(x) {\n return heappushpop(this.nodes, x, this.cmp);\n };\n\n Heap.prototype.heapify = function() {\n return heapify(this.nodes, this.cmp);\n };\n\n Heap.prototype.updateItem = function(x) {\n return updateItem(this.nodes, x, this.cmp);\n };\n\n Heap.prototype.clear = function() {\n return this.nodes = [];\n };\n\n Heap.prototype.empty = function() {\n return this.nodes.length === 0;\n };\n\n Heap.prototype.size = function() {\n return this.nodes.length;\n };\n\n Heap.prototype.clone = function() {\n var heap;\n heap = new Heap();\n heap.nodes = this.nodes.slice(0);\n return heap;\n };\n\n Heap.prototype.toArray = function() {\n return this.nodes.slice(0);\n };\n\n Heap.prototype.insert = Heap.prototype.push;\n\n Heap.prototype.top = Heap.prototype.peek;\n\n Heap.prototype.front = Heap.prototype.peek;\n\n Heap.prototype.has = Heap.prototype.contains;\n\n Heap.prototype.copy = Heap.prototype.clone;\n\n return Heap;\n\n })();\n\n (function(root, factory) {\n if (true) {\n return !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else // removed by dead control flow\n{}\n })(this, function() {\n return Heap;\n });\n\n}).call(this);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQyOTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvaGVhcC9saWIvaGVhcC5qcz8xMjQ4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbihmdW5jdGlvbigpIHtcbiAgdmFyIEhlYXAsIGRlZmF1bHRDbXAsIGZsb29yLCBoZWFwaWZ5LCBoZWFwcG9wLCBoZWFwcHVzaCwgaGVhcHB1c2hwb3AsIGhlYXByZXBsYWNlLCBpbnNvcnQsIG1pbiwgbmxhcmdlc3QsIG5zbWFsbGVzdCwgdXBkYXRlSXRlbSwgX3NpZnRkb3duLCBfc2lmdHVwO1xuXG4gIGZsb29yID0gTWF0aC5mbG9vciwgbWluID0gTWF0aC5taW47XG5cblxuICAvKlxuICBEZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gYmUgdXNlZFxuICAgKi9cblxuICBkZWZhdWx0Q21wID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIGlmICh4IDwgeSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoeCA+IHkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuXG4gIC8qXG4gIEluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXG4gIFxuICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXG4gIFxuICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBhLmxlbmd0aCkgYm91bmQgdGhlIHNsaWNlXG4gIG9mIGEgdG8gYmUgc2VhcmNoZWQuXG4gICAqL1xuXG4gIGluc29ydCA9IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSwgY21wKSB7XG4gICAgdmFyIG1pZDtcbiAgICBpZiAobG8gPT0gbnVsbCkge1xuICAgICAgbG8gPSAwO1xuICAgIH1cbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGlmIChsbyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKTtcbiAgICB9XG4gICAgaWYgKGhpID09IG51bGwpIHtcbiAgICAgIGhpID0gYS5sZW5ndGg7XG4gICAgfVxuICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICBtaWQgPSBmbG9vcigobG8gKyBoaSkgLyAyKTtcbiAgICAgIGlmIChjbXAoeCwgYVttaWRdKSA8IDApIHtcbiAgICAgICAgaGkgPSBtaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoW10uc3BsaWNlLmFwcGx5KGEsIFtsbywgbG8gLSBsb10uY29uY2F0KHgpKSwgeCk7XG4gIH07XG5cblxuICAvKlxuICBQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG4gICAqL1xuXG4gIGhlYXBwdXNoID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgYXJyYXkucHVzaChpdGVtKTtcbiAgICByZXR1cm4gX3NpZnRkb3duKGFycmF5LCAwLCBhcnJheS5sZW5ndGggLSAxLCBjbXApO1xuICB9O1xuXG5cbiAgLypcbiAgUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxuICAgKi9cblxuICBoZWFwcG9wID0gZnVuY3Rpb24oYXJyYXksIGNtcCkge1xuICAgIHZhciBsYXN0ZWx0LCByZXR1cm5pdGVtO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgbGFzdGVsdCA9IGFycmF5LnBvcCgpO1xuICAgIGlmIChhcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybml0ZW0gPSBhcnJheVswXTtcbiAgICAgIGFycmF5WzBdID0gbGFzdGVsdDtcbiAgICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIFBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cbiAgXG4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxuICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZCBzaXplIGhlYXAuIE5vdGUgdGhhdCB0aGUgdmFsdWVcbiAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZSBvZlxuICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuICAgICAgaWYgaXRlbSA+IGFycmF5WzBdXG4gICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShhcnJheSwgaXRlbSlcbiAgICovXG5cbiAgaGVhcHJlcGxhY2UgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgdmFyIHJldHVybml0ZW07XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICByZXR1cm5pdGVtID0gYXJyYXlbMF07XG4gICAgYXJyYXlbMF0gPSBpdGVtO1xuICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgcmV0dXJuIHJldHVybml0ZW07XG4gIH07XG5cblxuICAvKlxuICBGYXN0IHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuXG4gICAqL1xuXG4gIGhlYXBwdXNocG9wID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciBfcmVmO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKGFycmF5Lmxlbmd0aCAmJiBjbXAoYXJyYXlbMF0sIGl0ZW0pIDwgMCkge1xuICAgICAgX3JlZiA9IFthcnJheVswXSwgaXRlbV0sIGl0ZW0gPSBfcmVmWzBdLCBhcnJheVswXSA9IF9yZWZbMV07XG4gICAgICBfc2lmdHVwKGFycmF5LCAwLCBjbXApO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIFRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhhcnJheS5sZW5ndGgpIHRpbWUuXG4gICAqL1xuXG4gIGhlYXBpZnkgPSBmdW5jdGlvbihhcnJheSwgY21wKSB7XG4gICAgdmFyIGksIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzLCBfcmVzdWx0czE7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBfcmVmMSA9IChmdW5jdGlvbigpIHtcbiAgICAgIF9yZXN1bHRzMSA9IFtdO1xuICAgICAgZm9yICh2YXIgX2ogPSAwLCBfcmVmID0gZmxvb3IoYXJyYXkubGVuZ3RoIC8gMik7IDAgPD0gX3JlZiA/IF9qIDwgX3JlZiA6IF9qID4gX3JlZjsgMCA8PSBfcmVmID8gX2orKyA6IF9qLS0peyBfcmVzdWx0czEucHVzaChfaik7IH1cbiAgICAgIHJldHVybiBfcmVzdWx0czE7XG4gICAgfSkuYXBwbHkodGhpcykucmV2ZXJzZSgpO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmMS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgaSA9IF9yZWYxW19pXTtcbiAgICAgIF9yZXN1bHRzLnB1c2goX3NpZnR1cChhcnJheSwgaSwgY21wKSk7XG4gICAgfVxuICAgIHJldHVybiBfcmVzdWx0cztcbiAgfTtcblxuXG4gIC8qXG4gIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIGhlYXAuXG4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cblxuICB1cGRhdGVJdGVtID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNtcCkge1xuICAgIHZhciBwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBwb3MgPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIF9zaWZ0ZG93bihhcnJheSwgMCwgcG9zLCBjbXApO1xuICAgIHJldHVybiBfc2lmdHVwKGFycmF5LCBwb3MsIGNtcCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuICAgKi9cblxuICBubGFyZ2VzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgcmVzdWx0LCBfaSwgX2xlbiwgX3JlZjtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pO1xuICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaGVhcGlmeShyZXN1bHQsIGNtcCk7XG4gICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgZWxlbSA9IF9yZWZbX2ldO1xuICAgICAgaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtLCBjbXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoY21wKS5yZXZlcnNlKCk7XG4gIH07XG5cblxuICAvKlxuICBGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbnNtYWxsZXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGNtcCkge1xuICAgIHZhciBlbGVtLCBpLCBsb3MsIHJlc3VsdCwgX2ksIF9qLCBfbGVuLCBfcmVmLCBfcmVmMSwgX3Jlc3VsdHM7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAobiAqIDEwIDw9IGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gYXJyYXkuc2xpY2UoMCwgbikuc29ydChjbXApO1xuICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgX3JlZiA9IGFycmF5LnNsaWNlKG4pO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgICAgaWYgKGNtcChlbGVtLCBsb3MpIDwgMCkge1xuICAgICAgICAgIGluc29ydChyZXN1bHQsIGVsZW0sIDAsIG51bGwsIGNtcCk7XG4gICAgICAgICAgcmVzdWx0LnBvcCgpO1xuICAgICAgICAgIGxvcyA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkoYXJyYXksIGNtcCk7XG4gICAgX3Jlc3VsdHMgPSBbXTtcbiAgICBmb3IgKGkgPSBfaiA9IDAsIF9yZWYxID0gbWluKG4sIGFycmF5Lmxlbmd0aCk7IDAgPD0gX3JlZjEgPyBfaiA8IF9yZWYxIDogX2ogPiBfcmVmMTsgaSA9IDAgPD0gX3JlZjEgPyArK19qIDogLS1faikge1xuICAgICAgX3Jlc3VsdHMucHVzaChoZWFwcG9wKGFycmF5LCBjbXApKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXN1bHRzO1xuICB9O1xuXG4gIF9zaWZ0ZG93biA9IGZ1bmN0aW9uKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApIHtcbiAgICB2YXIgbmV3aXRlbSwgcGFyZW50LCBwYXJlbnRwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBuZXdpdGVtID0gYXJyYXlbcG9zXTtcbiAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpIHtcbiAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxO1xuICAgICAgcGFyZW50ID0gYXJyYXlbcGFyZW50cG9zXTtcbiAgICAgIGlmIChjbXAobmV3aXRlbSwgcGFyZW50KSA8IDApIHtcbiAgICAgICAgYXJyYXlbcG9zXSA9IHBhcmVudDtcbiAgICAgICAgcG9zID0gcGFyZW50cG9zO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlbcG9zXSA9IG5ld2l0ZW07XG4gIH07XG5cbiAgX3NpZnR1cCA9IGZ1bmN0aW9uKGFycmF5LCBwb3MsIGNtcCkge1xuICAgIHZhciBjaGlsZHBvcywgZW5kcG9zLCBuZXdpdGVtLCByaWdodHBvcywgc3RhcnRwb3M7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBlbmRwb3MgPSBhcnJheS5sZW5ndGg7XG4gICAgc3RhcnRwb3MgPSBwb3M7XG4gICAgbmV3aXRlbSA9IGFycmF5W3Bvc107XG4gICAgY2hpbGRwb3MgPSAyICogcG9zICsgMTtcbiAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHtcbiAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxO1xuICAgICAgaWYgKHJpZ2h0cG9zIDwgZW5kcG9zICYmICEoY21wKGFycmF5W2NoaWxkcG9zXSwgYXJyYXlbcmlnaHRwb3NdKSA8IDApKSB7XG4gICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3M7XG4gICAgICB9XG4gICAgICBhcnJheVtwb3NdID0gYXJyYXlbY2hpbGRwb3NdO1xuICAgICAgcG9zID0gY2hpbGRwb3M7XG4gICAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuICAgIH1cbiAgICBhcnJheVtwb3NdID0gbmV3aXRlbTtcbiAgICByZXR1cm4gX3NpZnRkb3duKGFycmF5LCBzdGFydHBvcywgcG9zLCBjbXApO1xuICB9O1xuXG4gIEhlYXAgPSAoZnVuY3Rpb24oKSB7XG4gICAgSGVhcC5wdXNoID0gaGVhcHB1c2g7XG5cbiAgICBIZWFwLnBvcCA9IGhlYXBwb3A7XG5cbiAgICBIZWFwLnJlcGxhY2UgPSBoZWFwcmVwbGFjZTtcblxuICAgIEhlYXAucHVzaHBvcCA9IGhlYXBwdXNocG9wO1xuXG4gICAgSGVhcC5oZWFwaWZ5ID0gaGVhcGlmeTtcblxuICAgIEhlYXAudXBkYXRlSXRlbSA9IHVwZGF0ZUl0ZW07XG5cbiAgICBIZWFwLm5sYXJnZXN0ID0gbmxhcmdlc3Q7XG5cbiAgICBIZWFwLm5zbWFsbGVzdCA9IG5zbWFsbGVzdDtcblxuICAgIGZ1bmN0aW9uIEhlYXAoY21wKSB7XG4gICAgICB0aGlzLmNtcCA9IGNtcCAhPSBudWxsID8gY21wIDogZGVmYXVsdENtcDtcbiAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICB9XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXBwdXNoKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaGVhcHBvcCh0aGlzLm5vZGVzLCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmluZGV4T2YoeCkgIT09IC0xO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXByZXBsYWNlKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucHVzaHBvcCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBoZWFwcHVzaHBvcCh0aGlzLm5vZGVzLCB4LCB0aGlzLmNtcCk7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmhlYXBpZnkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBoZWFwaWZ5KHRoaXMubm9kZXMsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB1cGRhdGVJdGVtKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzID0gW107XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGggPT09IDA7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBoZWFwO1xuICAgICAgaGVhcCA9IG5ldyBIZWFwKCk7XG4gICAgICBoZWFwLm5vZGVzID0gdGhpcy5ub2Rlcy5zbGljZSgwKTtcbiAgICAgIHJldHVybiBoZWFwO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaW5zZXJ0ID0gSGVhcC5wcm90b3R5cGUucHVzaDtcblxuICAgIEhlYXAucHJvdG90eXBlLnRvcCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5mcm9udCA9IEhlYXAucHJvdG90eXBlLnBlZWs7XG5cbiAgICBIZWFwLnByb3RvdHlwZS5oYXMgPSBIZWFwLnByb3RvdHlwZS5jb250YWlucztcblxuICAgIEhlYXAucHJvdG90eXBlLmNvcHkgPSBIZWFwLnByb3RvdHlwZS5jbG9uZTtcblxuICAgIHJldHVybiBIZWFwO1xuXG4gIH0pKCk7XG5cbiAgKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICByZXR1cm4gZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcm9vdC5IZWFwID0gZmFjdG9yeSgpO1xuICAgIH1cbiAgfSkodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEhlYXA7XG4gIH0pO1xuXG59KS5jYWxsKHRoaXMpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34297\n")},34841:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar VERSION = (__webpack_require__(49641).version);\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ4NDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy92YWxpZGF0b3IuanM/ODQ4YiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBWRVJTSU9OID0gcmVxdWlyZSgnLi4vZW52L2RhdGEnKS52ZXJzaW9uO1xuXG52YXIgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goZnVuY3Rpb24odHlwZSwgaSkge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxudmFyIGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xudmFsaWRhdG9ycy50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3B0LCBvcHRzKSB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSkpO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICB2YXIgb3B0ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3NlcnRPcHRpb25zOiBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34841\n")},34864:(I,g,n)=>{"use strict";I.exports=n.p+"ce007454d9fd9c22c813.png"},34932:(I,g,n)=>{"use strict";I.exports=n.p+"6a8e2494d8bc8627a6c2.png"},35094:(I,g,n)=>{"use strict";I.exports=n.p+"959160e2d09860a7eb84.png"},35155:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\nvar buildURL = __webpack_require__(79106);\nvar InterceptorManager = __webpack_require__(83471);\nvar dispatchRequest = __webpack_require__(64490);\nvar mergeConfig = __webpack_require__(85343);\nvar validator = __webpack_require__(34841);\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUxNTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcz8wYTA2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IHJlcXVpcmUoJy4vSW50ZXJjZXB0b3JNYW5hZ2VyJyk7XG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9kaXNwYXRjaFJlcXVlc3QnKTtcbnZhciBtZXJnZUNvbmZpZyA9IHJlcXVpcmUoJy4vbWVyZ2VDb25maWcnKTtcbnZhciB2YWxpZGF0b3IgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3ZhbGlkYXRvcicpO1xuXG52YXIgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gQXhpb3MoaW5zdGFuY2VDb25maWcpIHtcbiAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICB9O1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICovXG5BeGlvcy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICBjb25maWcudXJsID0gY29uZmlnT3JVcmw7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gIH1cblxuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gIC8vIFNldCBjb25maWcubWV0aG9kXG4gIGlmIChjb25maWcubWV0aG9kKSB7XG4gICAgY29uZmlnLm1ldGhvZCA9IGNvbmZpZy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRzLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSB0aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5tZXRob2QgPSAnZ2V0JztcbiAgfVxuXG4gIHZhciB0cmFuc2l0aW9uYWwgPSBjb25maWcudHJhbnNpdGlvbmFsO1xuXG4gIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gIHZhciByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICB2YXIgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHZhciBwcm9taXNlO1xuXG4gIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcblxuICAgIEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgY2hhaW4gPSBjaGFpbi5jb25jYXQocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcblxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluLnNoaWZ0KCksIGNoYWluLnNoaWZ0KCkpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cblxuICB2YXIgbmV3Q29uZmlnID0gY29uZmlnO1xuICB3aGlsZSAocmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgdmFyIG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKTtcbiAgICB2YXIgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIG9uUmVqZWN0ZWQoZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0KG5ld0NvbmZpZyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgfVxuXG4gIHdoaWxlIChyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCkpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5BeGlvcy5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gZ2V0VXJpKGNvbmZpZykge1xuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICByZXR1cm4gYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cXD8vLCAnJyk7XG59O1xuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35155\n")},35302:(module,__unused_webpack_exports,__webpack_require__)=>{eval("var isarray = __webpack_require__(64634)\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = options && options.delimiter || '/'\n var res\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n continue\n }\n\n var next = str[index]\n var prefix = res[2]\n var name = res[3]\n var capture = res[4]\n var group = res[5]\n var modifier = res[6]\n var asterisk = res[7]\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n }\n\n var partial = prefix != null && next != null && next !== prefix\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = prefix || defaultDelimiter\n var pattern = capture || group\n var prevText = prefix || (typeof tokens[tokens.length - 1] === 'string' ? tokens[tokens.length - 1] : '')\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : restrictBacktrack(delimiter, prevText))\n })\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index)\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path)\n }\n\n return tokens\n}\n\nfunction restrictBacktrack(delimiter, prevText) {\n if (!prevText || prevText.indexOf(delimiter) > -1) {\n return '[^' + escapeString(delimiter) + ']+?'\n }\n\n return escapeString(prevText) + '|(?:(?!' + escapeString(prevText) + ')[^' + escapeString(delimiter) + '])+?'\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n }\n }\n\n return function (obj, opts) {\n var path = ''\n var data = obj || {}\n var options = opts || {}\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n\n continue\n }\n\n var value = data[token.name]\n var segment\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j])\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {!Array} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n asterisk: false,\n pattern: null\n })\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {!Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var route = ''\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n } else {\n var prefix = escapeString(token.prefix)\n var capture = '(?:' + token.pattern + ')'\n\n keys.push(token)\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*'\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?'\n } else {\n capture = prefix + '(' + capture + ')?'\n }\n } else {\n capture = prefix + '(' + capture + ')'\n }\n\n route += capture\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/')\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n }\n\n if (end) {\n route += '$'\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options)\n keys = []\n }\n\n options = options || {}\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUzMDIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvaW5kZXguanM/YmQxMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNhcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG4vKipcbiAqIEV4cG9zZSBgcGF0aFRvUmVnZXhwYC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBwYXRoVG9SZWdleHBcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2Vcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlXG5tb2R1bGUuZXhwb3J0cy50b2tlbnNUb0Z1bmN0aW9uID0gdG9rZW5zVG9GdW5jdGlvblxubW9kdWxlLmV4cG9ydHMudG9rZW5zVG9SZWdFeHAgPSB0b2tlbnNUb1JlZ0V4cFxuXG4vKipcbiAqIFRoZSBtYWluIHBhdGggbWF0Y2hpbmcgcmVnZXhwIHV0aWxpdHkuXG4gKlxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xudmFyIFBBVEhfUkVHRVhQID0gbmV3IFJlZ0V4cChbXG4gIC8vIE1hdGNoIGVzY2FwZWQgY2hhcmFjdGVycyB0aGF0IHdvdWxkIG90aGVyd2lzZSBhcHBlYXIgaW4gZnV0dXJlIG1hdGNoZXMuXG4gIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCB3b24ndCB0cmFuc2Zvcm0uXG4gICcoXFxcXFxcXFwuKScsXG4gIC8vIE1hdGNoIEV4cHJlc3Mtc3R5bGUgcGFyYW1ldGVycyBhbmQgdW4tbmFtZWQgcGFyYW1ldGVycyB3aXRoIGEgcHJlZml4XG4gIC8vIGFuZCBvcHRpb25hbCBzdWZmaXhlcy4gTWF0Y2hlcyBhcHBlYXIgYXM6XG4gIC8vXG4gIC8vIFwiLzp0ZXN0KFxcXFxkKyk/XCIgPT4gW1wiL1wiLCBcInRlc3RcIiwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgXCI/XCIsIHVuZGVmaW5lZF1cbiAgLy8gXCIvcm91dGUoXFxcXGQrKVwiICA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAvLyBcIi8qXCIgICAgICAgICAgICA9PiBbXCIvXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCIqXCJdXG4gICcoW1xcXFwvLl0pPyg/Oig/OlxcXFw6KFxcXFx3KykoPzpcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKT98XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSkoWysqP10pP3woXFxcXCopKSdcbl0uam9pbignfCcpLCAnZycpXG5cbi8qKlxuICogUGFyc2UgYSBzdHJpbmcgZm9yIHRoZSByYXcgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gb3B0aW9uc1xuICogQHJldHVybiB7IUFycmF5fVxuICovXG5mdW5jdGlvbiBwYXJzZSAoc3RyLCBvcHRpb25zKSB7XG4gIHZhciB0b2tlbnMgPSBbXVxuICB2YXIga2V5ID0gMFxuICB2YXIgaW5kZXggPSAwXG4gIHZhciBwYXRoID0gJydcbiAgdmFyIGRlZmF1bHREZWxpbWl0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJ1xuICB2YXIgcmVzXG5cbiAgd2hpbGUgKChyZXMgPSBQQVRIX1JFR0VYUC5leGVjKHN0cikpICE9IG51bGwpIHtcbiAgICB2YXIgbSA9IHJlc1swXVxuICAgIHZhciBlc2NhcGVkID0gcmVzWzFdXG4gICAgdmFyIG9mZnNldCA9IHJlcy5pbmRleFxuICAgIHBhdGggKz0gc3RyLnNsaWNlKGluZGV4LCBvZmZzZXQpXG4gICAgaW5kZXggPSBvZmZzZXQgKyBtLmxlbmd0aFxuXG4gICAgLy8gSWdub3JlIGFscmVhZHkgZXNjYXBlZCBzZXF1ZW5jZXMuXG4gICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgIHBhdGggKz0gZXNjYXBlZFsxXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB2YXIgbmV4dCA9IHN0cltpbmRleF1cbiAgICB2YXIgcHJlZml4ID0gcmVzWzJdXG4gICAgdmFyIG5hbWUgPSByZXNbM11cbiAgICB2YXIgY2FwdHVyZSA9IHJlc1s0XVxuICAgIHZhciBncm91cCA9IHJlc1s1XVxuICAgIHZhciBtb2RpZmllciA9IHJlc1s2XVxuICAgIHZhciBhc3RlcmlzayA9IHJlc1s3XVxuXG4gICAgLy8gUHVzaCB0aGUgY3VycmVudCBwYXRoIG9udG8gdGhlIHRva2Vucy5cbiAgICBpZiAocGF0aCkge1xuICAgICAgdG9rZW5zLnB1c2gocGF0aClcbiAgICAgIHBhdGggPSAnJ1xuICAgIH1cblxuICAgIHZhciBwYXJ0aWFsID0gcHJlZml4ICE9IG51bGwgJiYgbmV4dCAhPSBudWxsICYmIG5leHQgIT09IHByZWZpeFxuICAgIHZhciByZXBlYXQgPSBtb2RpZmllciA9PT0gJysnIHx8IG1vZGlmaWVyID09PSAnKidcbiAgICB2YXIgb3B0aW9uYWwgPSBtb2RpZmllciA9PT0gJz8nIHx8IG1vZGlmaWVyID09PSAnKidcbiAgICB2YXIgZGVsaW1pdGVyID0gcHJlZml4IHx8IGRlZmF1bHREZWxpbWl0ZXJcbiAgICB2YXIgcGF0dGVybiA9IGNhcHR1cmUgfHwgZ3JvdXBcbiAgICB2YXIgcHJldlRleHQgPSBwcmVmaXggfHwgKHR5cGVvZiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID09PSAnc3RyaW5nJyA/IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gOiAnJylcblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUgfHwga2V5KyssXG4gICAgICBwcmVmaXg6IHByZWZpeCB8fCAnJyxcbiAgICAgIGRlbGltaXRlcjogZGVsaW1pdGVyLFxuICAgICAgb3B0aW9uYWw6IG9wdGlvbmFsLFxuICAgICAgcmVwZWF0OiByZXBlYXQsXG4gICAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgICAgYXN0ZXJpc2s6ICEhYXN0ZXJpc2ssXG4gICAgICBwYXR0ZXJuOiBwYXR0ZXJuID8gZXNjYXBlR3JvdXAocGF0dGVybikgOiAoYXN0ZXJpc2sgPyAnLionIDogcmVzdHJpY3RCYWNrdHJhY2soZGVsaW1pdGVyLCBwcmV2VGV4dCkpXG4gICAgfSlcbiAgfVxuXG4gIC8vIE1hdGNoIGFueSBjaGFyYWN0ZXJzIHN0aWxsIHJlbWFpbmluZy5cbiAgaWYgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIHBhdGggKz0gc3RyLnN1YnN0cihpbmRleClcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGV4aXN0cywgcHVzaCBpdCBvbnRvIHRoZSBlbmQuXG4gIGlmIChwYXRoKSB7XG4gICAgdG9rZW5zLnB1c2gocGF0aClcbiAgfVxuXG4gIHJldHVybiB0b2tlbnNcbn1cblxuZnVuY3Rpb24gcmVzdHJpY3RCYWNrdHJhY2soZGVsaW1pdGVyLCBwcmV2VGV4dCkge1xuICBpZiAoIXByZXZUZXh0IHx8IHByZXZUZXh0LmluZGV4T2YoZGVsaW1pdGVyKSA+IC0xKSB7XG4gICAgcmV0dXJuICdbXicgKyBlc2NhcGVTdHJpbmcoZGVsaW1pdGVyKSArICddKz8nXG4gIH1cblxuICByZXR1cm4gZXNjYXBlU3RyaW5nKHByZXZUZXh0KSArICd8KD86KD8hJyArIGVzY2FwZVN0cmluZyhwcmV2VGV4dCkgKyAnKVteJyArIGVzY2FwZVN0cmluZyhkZWxpbWl0ZXIpICsgJ10pKz8nXG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHN0cmluZyB0byBhIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciB0aGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshZnVuY3Rpb24oT2JqZWN0PSwgT2JqZWN0PSl9XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUgKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9GdW5jdGlvbihwYXJzZShzdHIsIG9wdGlvbnMpLCBvcHRpb25zKVxufVxuXG4vKipcbiAqIFByZXR0aWVyIGVuY29kaW5nIG9mIFVSSSBwYXRoIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1tcXC8/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBhc3RlcmlzayBwYXJhbWV0ZXIuIFNpbWlsYXIgdG8gYHByZXR0eWAsIGJ1dCBhbGxvd3Mgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFzdGVyaXNrIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRXhwb3NlIGEgbWV0aG9kIGZvciB0cmFuc2Zvcm1pbmcgdG9rZW5zIGludG8gdGhlIHBhdGggZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucykge1xuICAvLyBDb21waWxlIGFsbCB0aGUgdG9rZW5zIGludG8gcmVnZXhwcy5cbiAgdmFyIG1hdGNoZXMgPSBuZXcgQXJyYXkodG9rZW5zLmxlbmd0aClcblxuICAvLyBDb21waWxlIGFsbCB0aGUgcGF0dGVybnMgYmVmb3JlIGNvbXBpbGF0aW9uLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgdG9rZW5zW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgbWF0Y2hlc1tpXSA9IG5ldyBSZWdFeHAoJ14oPzonICsgdG9rZW5zW2ldLnBhdHRlcm4gKyAnKSQnLCBmbGFncyhvcHRpb25zKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIHZhciBwYXRoID0gJydcbiAgICB2YXIgZGF0YSA9IG9iaiB8fCB7fVxuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fVxuICAgIHZhciBlbmNvZGUgPSBvcHRpb25zLnByZXR0eSA/IGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSA6IGVuY29kZVVSSUNvbXBvbmVudFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRoICs9IHRva2VuXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZGF0YVt0b2tlbi5uYW1lXVxuICAgICAgdmFyIHNlZ21lbnRcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gUHJlcGVuZCBwYXJ0aWFsIHNlZ21lbnQgcHJlZml4ZXMuXG4gICAgICAgICAgaWYgKHRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIGJlIGRlZmluZWQnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc2FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAoIXRva2VuLnJlcGVhdCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzZWdtZW50ID0gZW5jb2RlKHZhbHVlW2pdKVxuXG4gICAgICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGFsbCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHNlZ21lbnQpICsgJ2AnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGggKz0gKGogPT09IDAgPyB0b2tlbi5wcmVmaXggOiB0b2tlbi5kZWxpbWl0ZXIpICsgc2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc2VnbWVudCA9IHRva2VuLmFzdGVyaXNrID8gZW5jb2RlQXN0ZXJpc2sodmFsdWUpIDogZW5jb2RlKHZhbHVlKVxuXG4gICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBcIicgKyBzZWdtZW50ICsgJ1wiJylcbiAgICAgIH1cblxuICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXggKyBzZWdtZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxufVxuXG4vKipcbiAqIEVzY2FwZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4rKj89XiE6JHt9KClbXFxdfFxcL1xcXFxdKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGhlIGNhcHR1cmluZyBncm91cCBieSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBncm91cFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVHcm91cCAoZ3JvdXApIHtcbiAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoLyhbPSE6JFxcLygpXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogQXR0YWNoIHRoZSBrZXlzIGFzIGEgcHJvcGVydHkgb2YgdGhlIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshUmVnRXhwfSByZVxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXR0YWNoS2V5cyAocmUsIGtleXMpIHtcbiAgcmUua2V5cyA9IGtleXNcbiAgcmV0dXJuIHJlXG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyBmb3IgYSByZWdleHAgZnJvbSB0aGUgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmxhZ3MgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5zZW5zaXRpdmUgPyAnJyA6ICdpJ1xufVxuXG4vKipcbiAqIFB1bGwgb3V0IGtleXMgZnJvbSBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshUmVnRXhwfSBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiByZWdleHBUb1JlZ2V4cCAocGF0aCwga2V5cykge1xuICAvLyBVc2UgYSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gbWF0Y2ggb25seSBjYXB0dXJpbmcgZ3JvdXBzLlxuICB2YXIgZ3JvdXBzID0gcGF0aC5zb3VyY2UubWF0Y2goL1xcKCg/IVxcPykvZylcblxuICBpZiAoZ3JvdXBzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGksXG4gICAgICAgIHByZWZpeDogbnVsbCxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgIHJlcGVhdDogZmFsc2UsXG4gICAgICAgIHBhcnRpYWw6IGZhbHNlLFxuICAgICAgICBhc3RlcmlzazogZmFsc2UsXG4gICAgICAgIHBhdHRlcm46IG51bGxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMocGF0aCwga2V5cylcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXkgaW50byBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhcnJheVRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBwYXJ0cyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFydHMucHVzaChwYXRoVG9SZWdleHAocGF0aFtpXSwga2V5cywgb3B0aW9ucykuc291cmNlKVxuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJyg/OicgKyBwYXJ0cy5qb2luKCd8JykgKyAnKScsIGZsYWdzKG9wdGlvbnMpKVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHJlZ2V4cCwga2V5cylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwYXRoIHJlZ2V4cCBmcm9tIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9SZWdFeHAocGFyc2UocGF0aCwgb3B0aW9ucyksIGtleXMsIG9wdGlvbnMpXG59XG5cbi8qKlxuICogRXhwb3NlIGEgZnVuY3Rpb24gZm9yIHRha2luZyB0b2tlbnMgYW5kIHJldHVybmluZyBhIFJlZ0V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICAgICAgICAgIHRva2Vuc1xuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvUmVnRXhwICh0b2tlbnMsIGtleXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc2FycmF5KGtleXMpKSB7XG4gICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGtleXMgfHwgb3B0aW9ucylcbiAgICBrZXlzID0gW11cbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2VcbiAgdmFyIHJvdXRlID0gJydcblxuICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRva2VucyBhbmQgY3JlYXRlIG91ciByZWdleHAgc3RyaW5nLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJvdXRlICs9IGVzY2FwZVN0cmluZyh0b2tlbilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZWZpeCA9IGVzY2FwZVN0cmluZyh0b2tlbi5wcmVmaXgpXG4gICAgICB2YXIgY2FwdHVyZSA9ICcoPzonICsgdG9rZW4ucGF0dGVybiArICcpJ1xuXG4gICAgICBrZXlzLnB1c2godG9rZW4pXG5cbiAgICAgIGlmICh0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgY2FwdHVyZSArPSAnKD86JyArIHByZWZpeCArIGNhcHR1cmUgKyAnKSonXG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICBpZiAoIXRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICBjYXB0dXJlID0gJyg/OicgKyBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJykpPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXB0dXJlID0gcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpPydcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKSdcbiAgICAgIH1cblxuICAgICAgcm91dGUgKz0gY2FwdHVyZVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZWxpbWl0ZXIgPSBlc2NhcGVTdHJpbmcob3B0aW9ucy5kZWxpbWl0ZXIgfHwgJy8nKVxuICB2YXIgZW5kc1dpdGhEZWxpbWl0ZXIgPSByb3V0ZS5zbGljZSgtZGVsaW1pdGVyLmxlbmd0aCkgPT09IGRlbGltaXRlclxuXG4gIC8vIEluIG5vbi1zdHJpY3QgbW9kZSB3ZSBhbGxvdyBhIHNsYXNoIGF0IHRoZSBlbmQgb2YgbWF0Y2guIElmIHRoZSBwYXRoIHRvXG4gIC8vIG1hdGNoIGFscmVhZHkgZW5kcyB3aXRoIGEgc2xhc2gsIHdlIHJlbW92ZSBpdCBmb3IgY29uc2lzdGVuY3kuIFRoZSBzbGFzaFxuICAvLyBpcyB2YWxpZCBhdCB0aGUgZW5kIG9mIGEgcGF0aCBtYXRjaCwgbm90IGluIHRoZSBtaWRkbGUuIFRoaXMgaXMgaW1wb3J0YW50XG4gIC8vIGluIG5vbi1lbmRpbmcgbW9kZSwgd2hlcmUgXCIvdGVzdC9cIiBzaG91bGRuJ3QgbWF0Y2ggXCIvdGVzdC8vcm91dGVcIi5cbiAgaWYgKCFzdHJpY3QpIHtcbiAgICByb3V0ZSA9IChlbmRzV2l0aERlbGltaXRlciA/IHJvdXRlLnNsaWNlKDAsIC1kZWxpbWl0ZXIubGVuZ3RoKSA6IHJvdXRlKSArICcoPzonICsgZGVsaW1pdGVyICsgJyg/PSQpKT8nXG4gIH1cblxuICBpZiAoZW5kKSB7XG4gICAgcm91dGUgKz0gJyQnXG4gIH0gZWxzZSB7XG4gICAgLy8gSW4gbm9uLWVuZGluZyBtb2RlLCB3ZSBuZWVkIHRoZSBjYXB0dXJpbmcgZ3JvdXBzIHRvIG1hdGNoIGFzIG11Y2ggYXNcbiAgICAvLyBwb3NzaWJsZSBieSB1c2luZyBhIHBvc2l0aXZlIGxvb2thaGVhZCB0byB0aGUgZW5kIG9yIG5leHQgcGF0aCBzZWdtZW50LlxuICAgIHJvdXRlICs9IHN0cmljdCAmJiBlbmRzV2l0aERlbGltaXRlciA/ICcnIDogJyg/PScgKyBkZWxpbWl0ZXIgKyAnfCQpJ1xuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMobmV3IFJlZ0V4cCgnXicgKyByb3V0ZSwgZmxhZ3Mob3B0aW9ucykpLCBrZXlzKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gcGF0aCBzdHJpbmcsIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBjYW4gYmUgcGFzc2VkIGluIGZvciB0aGUga2V5cywgd2hpY2ggd2lsbCBob2xkIHRoZVxuICogcGxhY2Vob2xkZXIga2V5IGRlc2NyaXB0aW9ucy4gRm9yIGV4YW1wbGUsIHVzaW5nIGAvdXNlci86aWRgLCBga2V5c2Agd2lsbFxuICogY29udGFpbiBgW3sgbmFtZTogJ2lkJywgZGVsaW1pdGVyOiAnLycsIG9wdGlvbmFsOiBmYWxzZSwgcmVwZWF0OiBmYWxzZSB9XWAuXG4gKlxuICogQHBhcmFtICB7KHN0cmluZ3xSZWdFeHB8QXJyYXkpfSBwYXRoXG4gKiBAcGFyYW0gIHsoQXJyYXl8T2JqZWN0KT19ICAgICAgIGtleXNcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcGF0aFRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpXG4gICAga2V5cyA9IFtdXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cFRvUmVnZXhwKHBhdGgsIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cykpXG4gIH1cblxuICBpZiAoaXNhcnJheShwYXRoKSkge1xuICAgIHJldHVybiBhcnJheVRvUmVnZXhwKC8qKiBAdHlwZSB7IUFycmF5fSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gc3RyaW5nVG9SZWdleHAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRoKSwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSwgb3B0aW9ucylcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35302\n")},35592:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\nvar settle = __webpack_require__(7522);\nvar cookies = __webpack_require__(33948);\nvar buildURL = __webpack_require__(79106);\nvar buildFullPath = __webpack_require__(99615);\nvar parseHeaders = __webpack_require__(62012);\nvar isURLSameOrigin = __webpack_require__(64202);\nvar createError = __webpack_require__(47763);\nvar transitionalDefaults = __webpack_require__(94896);\nvar Cancel = __webpack_require__(31928);\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n var transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU1OTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanM/YjUwZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBzZXR0bGUgPSByZXF1aXJlKCcuLy4uL2NvcmUvc2V0dGxlJyk7XG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBidWlsZEZ1bGxQYXRoID0gcmVxdWlyZSgnLi4vY29yZS9idWlsZEZ1bGxQYXRoJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvY3JlYXRlRXJyb3InKTtcbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbCcpO1xudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIHZhciBvbkNhbmNlbGVkO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5hdXRoLnBhc3N3b3JkKSkgOiAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgdmFyIGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCAgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgdmFyIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBjb25maWcudGltZW91dCA/ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICB2YXIgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChjb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoXG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyAnRVRJTUVET1VUJyA6ICdFQ09OTkFCT1JURUQnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICAgIGlmICh1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIHZhciB4c3JmVmFsdWUgPSAoY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oZnVsbFBhdGgpKSAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgP1xuICAgICAgICBjb29raWVzLnJlYWQoY29uZmlnLnhzcmZDb29raWVOYW1lKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdERhdGEgPT09ICd1bmRlZmluZWQnICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4gfHwgY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBmdW5jdGlvbihjYW5jZWwpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCghY2FuY2VsIHx8IChjYW5jZWwgJiYgY2FuY2VsLnR5cGUpID8gbmV3IENhbmNlbCgnY2FuY2VsZWQnKSA6IGNhbmNlbCk7XG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4gJiYgY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChjb25maWcuc2lnbmFsKSB7XG4gICAgICAgIGNvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IGNvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3REYXRhKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35592\n")},36014:(I,g,n)=>{"use strict";I.exports=n.p+"963a701bf4f989ca6a9e.png"},36029:(I,g,n)=>{"use strict";I.exports=n.p+"af2f3c76218ba85f34ac.png"},36308:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(63009));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA256 = C_algo.SHA256;\n\n\t /**\n\t * SHA-224 hash algorithm.\n\t */\n\t var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t ]);\n\t },\n\n\t _doFinalize: function () {\n\t var hash = SHA256._doFinalize.call(this);\n\n\t hash.sigBytes -= 4;\n\n\t return hash;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA224('message');\n\t * var hash = CryptoJS.SHA224(wordArray);\n\t */\n\t C.SHA224 = SHA256._createHelper(SHA224);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA224(message, key);\n\t */\n\t C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\treturn CryptoJS.SHA224;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYzMDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGEyMjQuanM/MTkxYiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMjU2XCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3NoYTI1NlwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cdCAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NjtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMjI0IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMjI0ID0gQ19hbGdvLlNIQTIyNCA9IFNIQTI1Ni5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcblx0ICAgICAgICAgICAgICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTRcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gU0hBMjU2Ll9kb0ZpbmFsaXplLmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgaGFzaC5zaWdCeXRlcyAtPSA0O1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjI0KCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyMjQod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhlbHBlcihTSEEyMjQpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTIyNChtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjI0KTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEEyMjQ7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///36308\n")},36425:(I,g,n)=>{"use strict";I.exports=n.p+"d65f8d8bf480a650667e.png"},36648:(I,g,n)=>{"use strict";I.exports=n.p+"b57b2d038520f947c0bd.png"},36658:(I,g,n)=>{"use strict";I.exports=n.p+"7d9167b3c3c550a8c3d0.png"},36669:(I,g,n)=>{"use strict";I.exports=n.p+"53e34ca71cfa08b9bebd.png"},36810:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n AuthenticatedTemplate: () => (/* reexport */ AuthenticatedTemplate),\n MsalAuthenticationTemplate: () => (/* reexport */ MsalAuthenticationTemplate),\n MsalConsumer: () => (/* reexport */ MsalConsumer),\n MsalContext: () => (/* reexport */ MsalContext),\n MsalProvider: () => (/* reexport */ MsalProvider),\n UnauthenticatedTemplate: () => (/* reexport */ UnauthenticatedTemplate),\n useAccount: () => (/* reexport */ useAccount),\n useIsAuthenticated: () => (/* reexport */ useIsAuthenticated),\n useMsal: () => (/* reexport */ useMsal),\n useMsalAuthentication: () => (/* reexport */ useMsalAuthentication),\n version: () => (/* reexport */ version),\n withMsal: () => (/* reexport */ withMsal)\n});\n\n// EXTERNAL MODULE: consume shared module (default) react@^17.0.2 (singleton) (fallback: ./node_modules/react/index.js) (eager)\nvar index_js_eager_ = __webpack_require__(24002);\n// EXTERNAL MODULE: consume shared module (default) @azure/msal-browser@^3.23.0 (strict) (fallback: ./node_modules/@azure/msal-browser/dist/index.mjs)\nvar index_mjs_ = __webpack_require__(149);\n;// ./node_modules/@azure/msal-react/dist/MsalContext.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/*\r\n * Stubbed context implementation\r\n * Only used when there is no provider, which is an unsupported scenario\r\n */\r\nconst defaultMsalContext = {\r\n instance: index_mjs_.stubbedPublicClientApplication,\r\n inProgress: index_mjs_.InteractionStatus.None,\r\n accounts: [],\r\n logger: new index_mjs_.Logger({}),\r\n};\r\nconst MsalContext = index_js_eager_.createContext(defaultMsalContext);\r\nconst MsalConsumer = MsalContext.Consumer;\n\n\n//# sourceMappingURL=MsalContext.js.map\n\n;// ./node_modules/@azure/msal-react/dist/utils/utilities.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction getChildrenOrFunction(children, args) {\r\n if (typeof children === "function") {\r\n return children(args);\r\n }\r\n return children;\r\n}\r\n/**\r\n * Helper function to determine whether 2 arrays are equal\r\n * Used to avoid unnecessary state updates\r\n * @param arrayA\r\n * @param arrayB\r\n */\r\nfunction accountArraysAreEqual(arrayA, arrayB) {\r\n if (arrayA.length !== arrayB.length) {\r\n return false;\r\n }\r\n const comparisonArray = [...arrayB];\r\n return arrayA.every((elementA) => {\r\n const elementB = comparisonArray.shift();\r\n if (!elementA || !elementB) {\r\n return false;\r\n }\r\n return (elementA.homeAccountId === elementB.homeAccountId &&\r\n elementA.localAccountId === elementB.localAccountId &&\r\n elementA.username === elementB.username);\r\n });\r\n}\r\nfunction getAccountByIdentifiers(allAccounts, accountIdentifiers) {\r\n if (allAccounts.length > 0 &&\r\n (accountIdentifiers.homeAccountId ||\r\n accountIdentifiers.localAccountId ||\r\n accountIdentifiers.username)) {\r\n const matchedAccounts = allAccounts.filter((accountObj) => {\r\n if (accountIdentifiers.username &&\r\n accountIdentifiers.username.toLowerCase() !==\r\n accountObj.username.toLowerCase()) {\r\n return false;\r\n }\r\n if (accountIdentifiers.homeAccountId &&\r\n accountIdentifiers.homeAccountId.toLowerCase() !==\r\n accountObj.homeAccountId.toLowerCase()) {\r\n return false;\r\n }\r\n if (accountIdentifiers.localAccountId &&\r\n accountIdentifiers.localAccountId.toLowerCase() !==\r\n accountObj.localAccountId.toLowerCase()) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n return matchedAccounts[0] || null;\r\n }\r\n else {\r\n return null;\r\n }\r\n}\n\n\n//# sourceMappingURL=utilities.js.map\n\n;// ./node_modules/@azure/msal-react/dist/packageMetadata.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n/* eslint-disable header/header */\r\nconst packageMetadata_name = "@azure/msal-react";\r\nconst version = "2.2.0";\n\n\n//# sourceMappingURL=packageMetadata.js.map\n\n;// ./node_modules/@azure/msal-react/dist/MsalProvider.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst MsalProviderActionType = {\r\n UNBLOCK_INPROGRESS: "UNBLOCK_INPROGRESS",\r\n EVENT: "EVENT",\r\n};\r\n/**\r\n * Returns the next inProgress and accounts state based on event message\r\n * @param previousState\r\n * @param action\r\n */\r\nconst reducer = (previousState, action) => {\r\n const { type, payload } = action;\r\n let newInProgress = previousState.inProgress;\r\n switch (type) {\r\n case MsalProviderActionType.UNBLOCK_INPROGRESS:\r\n if (previousState.inProgress === index_mjs_.InteractionStatus.Startup) {\r\n newInProgress = index_mjs_.InteractionStatus.None;\r\n payload.logger.info("MsalProvider - handleRedirectPromise resolved, setting inProgress to \'none\'");\r\n }\r\n break;\r\n case MsalProviderActionType.EVENT:\r\n const message = payload.message;\r\n const status = index_mjs_.EventMessageUtils.getInteractionStatusFromEvent(message, previousState.inProgress);\r\n if (status) {\r\n payload.logger.info(`MsalProvider - ${message.eventType} results in setting inProgress from ${previousState.inProgress} to ${status}`);\r\n newInProgress = status;\r\n }\r\n break;\r\n default:\r\n throw new Error(`Unknown action type: ${type}`);\r\n }\r\n const currentAccounts = payload.instance.getAllAccounts();\r\n if (newInProgress !== previousState.inProgress &&\r\n !accountArraysAreEqual(currentAccounts, previousState.accounts)) {\r\n // Both inProgress and accounts changed\r\n return {\r\n ...previousState,\r\n inProgress: newInProgress,\r\n accounts: currentAccounts,\r\n };\r\n }\r\n else if (newInProgress !== previousState.inProgress) {\r\n // Only only inProgress changed\r\n return {\r\n ...previousState,\r\n inProgress: newInProgress,\r\n };\r\n }\r\n else if (!accountArraysAreEqual(currentAccounts, previousState.accounts)) {\r\n // Only accounts changed\r\n return {\r\n ...previousState,\r\n accounts: currentAccounts,\r\n };\r\n }\r\n else {\r\n // Nothing changed\r\n return previousState;\r\n }\r\n};\r\n/**\r\n * MSAL context provider component. This must be rendered above any other components that use MSAL.\r\n */\r\nfunction MsalProvider({ instance, children, }) {\r\n (0,index_js_eager_.useEffect)(() => {\r\n instance.initializeWrapperLibrary(index_mjs_.WrapperSKU.React, version);\r\n }, [instance]);\r\n // Create a logger instance for msal-react with the same options as PublicClientApplication\r\n const logger = (0,index_js_eager_.useMemo)(() => {\r\n return instance.getLogger().clone(packageMetadata_name, version);\r\n }, [instance]);\r\n const [state, updateState] = (0,index_js_eager_.useReducer)(reducer, undefined, () => {\r\n // Lazy initialization of the initial state\r\n return {\r\n inProgress: index_mjs_.InteractionStatus.Startup,\r\n accounts: instance.getAllAccounts(),\r\n };\r\n });\r\n (0,index_js_eager_.useEffect)(() => {\r\n const callbackId = instance.addEventCallback((message) => {\r\n updateState({\r\n payload: {\r\n instance,\r\n logger,\r\n message,\r\n },\r\n type: MsalProviderActionType.EVENT,\r\n });\r\n });\r\n logger.verbose(`MsalProvider - Registered event callback with id: ${callbackId}`);\r\n instance\r\n .initialize()\r\n .then(() => {\r\n instance\r\n .handleRedirectPromise()\r\n .catch(() => {\r\n // Errors should be handled by listening to the LOGIN_FAILURE event\r\n return;\r\n })\r\n .finally(() => {\r\n /*\r\n * If handleRedirectPromise returns a cached promise the necessary events may not be fired\r\n * This is a fallback to prevent inProgress from getting stuck in \'startup\'\r\n */\r\n updateState({\r\n payload: {\r\n instance,\r\n logger,\r\n },\r\n type: MsalProviderActionType.UNBLOCK_INPROGRESS,\r\n });\r\n });\r\n })\r\n .catch(() => {\r\n // Errors should be handled by listening to the LOGIN_FAILURE event\r\n return;\r\n });\r\n return () => {\r\n // Remove callback when component unmounts or accounts change\r\n if (callbackId) {\r\n logger.verbose(`MsalProvider - Removing event callback ${callbackId}`);\r\n instance.removeEventCallback(callbackId);\r\n }\r\n };\r\n }, [instance, logger]);\r\n const contextValue = {\r\n instance,\r\n inProgress: state.inProgress,\r\n accounts: state.accounts,\r\n logger,\r\n };\r\n return (index_js_eager_.createElement(MsalContext.Provider, { value: contextValue }, children));\r\n}\n\n\n//# sourceMappingURL=MsalProvider.js.map\n\n;// ./node_modules/@azure/msal-react/dist/hooks/useMsal.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Returns Msal Context values\r\n */\r\nconst useMsal = () => (0,index_js_eager_.useContext)(MsalContext);\n\n\n//# sourceMappingURL=useMsal.js.map\n\n;// ./node_modules/@azure/msal-react/dist/hooks/useIsAuthenticated.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction isAuthenticated(allAccounts, matchAccount) {\r\n if (matchAccount &&\r\n (matchAccount.username ||\r\n matchAccount.homeAccountId ||\r\n matchAccount.localAccountId)) {\r\n return !!getAccountByIdentifiers(allAccounts, matchAccount);\r\n }\r\n return allAccounts.length > 0;\r\n}\r\n/**\r\n * Returns whether or not a user is currently signed-in. Optionally provide 1 or more accountIdentifiers to determine if a specific user is signed-in\r\n * @param matchAccount\r\n */\r\nfunction useIsAuthenticated(matchAccount) {\r\n const { accounts: allAccounts, inProgress } = useMsal();\r\n const isUserAuthenticated = (0,index_js_eager_.useMemo)(() => {\r\n if (inProgress === index_mjs_.InteractionStatus.Startup) {\r\n return false;\r\n }\r\n return isAuthenticated(allAccounts, matchAccount);\r\n }, [allAccounts, inProgress, matchAccount]);\r\n return isUserAuthenticated;\r\n}\n\n\n//# sourceMappingURL=useIsAuthenticated.js.map\n\n;// ./node_modules/@azure/msal-react/dist/components/AuthenticatedTemplate.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Renders child components if user is authenticated\r\n * @param props\r\n */\r\nfunction AuthenticatedTemplate({ username, homeAccountId, localAccountId, children, }) {\r\n const context = useMsal();\r\n const accountIdentifier = (0,index_js_eager_.useMemo)(() => {\r\n return {\r\n username,\r\n homeAccountId,\r\n localAccountId,\r\n };\r\n }, [username, homeAccountId, localAccountId]);\r\n const isAuthenticated = useIsAuthenticated(accountIdentifier);\r\n if (isAuthenticated && context.inProgress !== index_mjs_.InteractionStatus.Startup) {\r\n return (index_js_eager_.createElement(index_js_eager_.Fragment, null, getChildrenOrFunction(children, context)));\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=AuthenticatedTemplate.js.map\n\n;// ./node_modules/@azure/msal-react/dist/components/UnauthenticatedTemplate.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Renders child components if user is unauthenticated\r\n * @param props\r\n */\r\nfunction UnauthenticatedTemplate({ username, homeAccountId, localAccountId, children, }) {\r\n const context = useMsal();\r\n const accountIdentifier = (0,index_js_eager_.useMemo)(() => {\r\n return {\r\n username,\r\n homeAccountId,\r\n localAccountId,\r\n };\r\n }, [username, homeAccountId, localAccountId]);\r\n const isAuthenticated = useIsAuthenticated(accountIdentifier);\r\n if (!isAuthenticated &&\r\n context.inProgress !== index_mjs_.InteractionStatus.Startup &&\r\n context.inProgress !== index_mjs_.InteractionStatus.HandleRedirect) {\r\n return (index_js_eager_.createElement(index_js_eager_.Fragment, null, getChildrenOrFunction(children, context)));\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=UnauthenticatedTemplate.js.map\n\n;// ./node_modules/@azure/msal-react/dist/hooks/useAccount.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nfunction getAccount(instance, accountIdentifiers) {\r\n if (!accountIdentifiers ||\r\n (!accountIdentifiers.homeAccountId &&\r\n !accountIdentifiers.localAccountId &&\r\n !accountIdentifiers.username)) {\r\n // If no account identifiers are provided, return active account\r\n return instance.getActiveAccount();\r\n }\r\n return getAccountByIdentifiers(instance.getAllAccounts(), accountIdentifiers);\r\n}\r\n/**\r\n * Given 1 or more accountIdentifiers, returns the Account object if the user is signed-in\r\n * @param accountIdentifiers\r\n */\r\nfunction useAccount(accountIdentifiers) {\r\n const { instance, inProgress, logger } = useMsal();\r\n const [account, setAccount] = (0,index_js_eager_.useState)(() => getAccount(instance, accountIdentifiers));\r\n (0,index_js_eager_.useEffect)(() => {\r\n setAccount((currentAccount) => {\r\n const nextAccount = getAccount(instance, accountIdentifiers);\r\n if (!index_mjs_.AccountEntity.accountInfoIsEqual(currentAccount, nextAccount, true)) {\r\n logger.info("useAccount - Updating account");\r\n return nextAccount;\r\n }\r\n return currentAccount;\r\n });\r\n }, [inProgress, accountIdentifiers, instance, logger]);\r\n return account;\r\n}\n\n\n//# sourceMappingURL=useAccount.js.map\n\n;// ./node_modules/@azure/msal-react/dist/error/ReactAuthError.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\nconst ReactAuthErrorMessage = {\r\n invalidInteractionType: {\r\n code: "invalid_interaction_type",\r\n desc: "The provided interaction type is invalid.",\r\n },\r\n unableToFallbackToInteraction: {\r\n code: "unable_to_fallback_to_interaction",\r\n desc: "Interaction is required but another interaction is already in progress. Please try again when the current interaction is complete.",\r\n },\r\n};\r\nclass ReactAuthError extends index_mjs_.AuthError {\r\n constructor(errorCode, errorMessage) {\r\n super(errorCode, errorMessage);\r\n Object.setPrototypeOf(this, ReactAuthError.prototype);\r\n this.name = "ReactAuthError";\r\n }\r\n static createInvalidInteractionTypeError() {\r\n return new ReactAuthError(ReactAuthErrorMessage.invalidInteractionType.code, ReactAuthErrorMessage.invalidInteractionType.desc);\r\n }\r\n static createUnableToFallbackToInteractionError() {\r\n return new ReactAuthError(ReactAuthErrorMessage.unableToFallbackToInteraction.code, ReactAuthErrorMessage.unableToFallbackToInteraction.desc);\r\n }\r\n}\n\n\n//# sourceMappingURL=ReactAuthError.js.map\n\n;// ./node_modules/@azure/msal-react/dist/hooks/useMsalAuthentication.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * If a user is not currently signed in this hook invokes a login. Failed logins can be retried using the login callback returned.\r\n * If a user is currently signed in this hook attempts to acquire a token. Subsequent token requests can use the acquireToken callback returned.\r\n * Optionally provide a request object to be used in the login/acquireToken call.\r\n * Optionally provide a specific user that should be logged in.\r\n * @param interactionType\r\n * @param authenticationRequest\r\n * @param accountIdentifiers\r\n */\r\nfunction useMsalAuthentication(interactionType, authenticationRequest, accountIdentifiers) {\r\n const { instance, inProgress, logger } = useMsal();\r\n const isAuthenticated = useIsAuthenticated(accountIdentifiers);\r\n const account = useAccount(accountIdentifiers);\r\n const [[result, error], setResponse] = (0,index_js_eager_.useState)([null, null]);\r\n // Used to prevent state updates after unmount\r\n const mounted = (0,index_js_eager_.useRef)(true);\r\n (0,index_js_eager_.useEffect)(() => {\r\n return () => {\r\n mounted.current = false;\r\n };\r\n }, []);\r\n // Boolean used to check if interaction is in progress in acquireTokenSilent fallback. Use Ref instead of state to prevent acquireToken function from being regenerated on each change to interactionInProgress value\r\n const interactionInProgress = (0,index_js_eager_.useRef)(inProgress !== index_mjs_.InteractionStatus.None);\r\n (0,index_js_eager_.useEffect)(() => {\r\n interactionInProgress.current = inProgress !== index_mjs_.InteractionStatus.None;\r\n }, [inProgress]);\r\n // Flag used to control when the hook calls login/acquireToken\r\n const shouldAcquireToken = (0,index_js_eager_.useRef)(true);\r\n (0,index_js_eager_.useEffect)(() => {\r\n if (!!error) {\r\n // Errors should be handled by consuming component\r\n shouldAcquireToken.current = false;\r\n return;\r\n }\r\n if (!!result) {\r\n // Token has already been acquired, consuming component/application is responsible for renewing\r\n shouldAcquireToken.current = false;\r\n return;\r\n }\r\n }, [error, result]);\r\n const login = (0,index_js_eager_.useCallback)(async (callbackInteractionType, callbackRequest) => {\r\n const loginType = callbackInteractionType || interactionType;\r\n const loginRequest = callbackRequest || authenticationRequest;\r\n switch (loginType) {\r\n case index_mjs_.InteractionType.Popup:\r\n logger.verbose("useMsalAuthentication - Calling loginPopup");\r\n return instance.loginPopup(loginRequest);\r\n case index_mjs_.InteractionType.Redirect:\r\n // This promise is not expected to resolve due to full frame redirect\r\n logger.verbose("useMsalAuthentication - Calling loginRedirect");\r\n return instance\r\n .loginRedirect(loginRequest)\r\n .then(null);\r\n case index_mjs_.InteractionType.Silent:\r\n logger.verbose("useMsalAuthentication - Calling ssoSilent");\r\n return instance.ssoSilent(loginRequest);\r\n default:\r\n throw ReactAuthError.createInvalidInteractionTypeError();\r\n }\r\n }, [instance, interactionType, authenticationRequest, logger]);\r\n const acquireToken = (0,index_js_eager_.useCallback)(async (callbackInteractionType, callbackRequest) => {\r\n const fallbackInteractionType = callbackInteractionType || interactionType;\r\n let tokenRequest;\r\n if (callbackRequest) {\r\n logger.trace("useMsalAuthentication - acquireToken - Using request provided in the callback");\r\n tokenRequest = {\r\n ...callbackRequest,\r\n };\r\n }\r\n else if (authenticationRequest) {\r\n logger.trace("useMsalAuthentication - acquireToken - Using request provided in the hook");\r\n tokenRequest = {\r\n ...authenticationRequest,\r\n scopes: authenticationRequest.scopes || index_mjs_.OIDC_DEFAULT_SCOPES,\r\n };\r\n }\r\n else {\r\n logger.trace("useMsalAuthentication - acquireToken - No request object provided, using default request.");\r\n tokenRequest = {\r\n scopes: index_mjs_.OIDC_DEFAULT_SCOPES,\r\n };\r\n }\r\n if (!tokenRequest.account && account) {\r\n logger.trace("useMsalAuthentication - acquireToken - Attaching account to request");\r\n tokenRequest.account = account;\r\n }\r\n const getToken = async () => {\r\n logger.verbose("useMsalAuthentication - Calling acquireTokenSilent");\r\n return instance\r\n .acquireTokenSilent(tokenRequest)\r\n .catch(async (e) => {\r\n if (e instanceof index_mjs_.InteractionRequiredAuthError) {\r\n if (!interactionInProgress.current) {\r\n logger.error("useMsalAuthentication - Interaction required, falling back to interaction");\r\n return login(fallbackInteractionType, tokenRequest);\r\n }\r\n else {\r\n logger.error("useMsalAuthentication - Interaction required but is already in progress. Please try again, if needed, after interaction completes.");\r\n throw ReactAuthError.createUnableToFallbackToInteractionError();\r\n }\r\n }\r\n throw e;\r\n });\r\n };\r\n return getToken()\r\n .then((response) => {\r\n if (mounted.current) {\r\n setResponse([response, null]);\r\n }\r\n return response;\r\n })\r\n .catch((e) => {\r\n if (mounted.current) {\r\n setResponse([null, e]);\r\n }\r\n throw e;\r\n });\r\n }, [\r\n instance,\r\n interactionType,\r\n authenticationRequest,\r\n logger,\r\n account,\r\n login,\r\n ]);\r\n (0,index_js_eager_.useEffect)(() => {\r\n const callbackId = instance.addEventCallback((message) => {\r\n switch (message.eventType) {\r\n case index_mjs_.EventType.LOGIN_SUCCESS:\r\n case index_mjs_.EventType.SSO_SILENT_SUCCESS:\r\n if (message.payload) {\r\n setResponse([\r\n message.payload,\r\n null,\r\n ]);\r\n }\r\n break;\r\n case index_mjs_.EventType.LOGIN_FAILURE:\r\n case index_mjs_.EventType.SSO_SILENT_FAILURE:\r\n if (message.error) {\r\n setResponse([null, message.error]);\r\n }\r\n break;\r\n }\r\n });\r\n logger.verbose(`useMsalAuthentication - Registered event callback with id: ${callbackId}`);\r\n return () => {\r\n if (callbackId) {\r\n logger.verbose(`useMsalAuthentication - Removing event callback ${callbackId}`);\r\n instance.removeEventCallback(callbackId);\r\n }\r\n };\r\n }, [instance, logger]);\r\n (0,index_js_eager_.useEffect)(() => {\r\n if (shouldAcquireToken.current &&\r\n inProgress === index_mjs_.InteractionStatus.None) {\r\n shouldAcquireToken.current = false;\r\n if (!isAuthenticated) {\r\n logger.info("useMsalAuthentication - No user is authenticated, attempting to login");\r\n login().catch(() => {\r\n // Errors are saved in state above\r\n return;\r\n });\r\n }\r\n else if (account) {\r\n logger.info("useMsalAuthentication - User is authenticated, attempting to acquire token");\r\n acquireToken().catch(() => {\r\n // Errors are saved in state above\r\n return;\r\n });\r\n }\r\n }\r\n }, [isAuthenticated, account, inProgress, login, acquireToken, logger]);\r\n return {\r\n login,\r\n acquireToken,\r\n result,\r\n error,\r\n };\r\n}\n\n\n//# sourceMappingURL=useMsalAuthentication.js.map\n\n;// ./node_modules/@azure/msal-react/dist/components/MsalAuthenticationTemplate.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Attempts to authenticate user if not already authenticated, then renders child components\r\n * @param props\r\n */\r\nfunction MsalAuthenticationTemplate({ interactionType, username, homeAccountId, localAccountId, authenticationRequest, loadingComponent: LoadingComponent, errorComponent: ErrorComponent, children, }) {\r\n const accountIdentifier = (0,index_js_eager_.useMemo)(() => {\r\n return {\r\n username,\r\n homeAccountId,\r\n localAccountId,\r\n };\r\n }, [username, homeAccountId, localAccountId]);\r\n const context = useMsal();\r\n const msalAuthResult = useMsalAuthentication(interactionType, authenticationRequest, accountIdentifier);\r\n const isAuthenticated = useIsAuthenticated(accountIdentifier);\r\n if (msalAuthResult.error && context.inProgress === index_mjs_.InteractionStatus.None) {\r\n if (!!ErrorComponent) {\r\n return index_js_eager_.createElement(ErrorComponent, { ...msalAuthResult });\r\n }\r\n throw msalAuthResult.error;\r\n }\r\n if (isAuthenticated) {\r\n return (index_js_eager_.createElement(index_js_eager_.Fragment, null, getChildrenOrFunction(children, msalAuthResult)));\r\n }\r\n if (!!LoadingComponent && context.inProgress !== index_mjs_.InteractionStatus.None) {\r\n return index_js_eager_.createElement(LoadingComponent, { ...context });\r\n }\r\n return null;\r\n}\n\n\n//# sourceMappingURL=MsalAuthenticationTemplate.js.map\n\n;// ./node_modules/@azure/msal-react/dist/components/withMsal.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n/**\r\n * Higher order component wraps provided component with msal by injecting msal context values into the component\'s props\r\n * @param Component\r\n */\r\nconst withMsal = (Component) => {\r\n const ComponentWithMsal = (props) => {\r\n const msal = useMsal();\r\n return index_js_eager_.createElement(Component, { ...props, msalContext: msal });\r\n };\r\n const componentName = Component.displayName || Component.name || "Component";\r\n ComponentWithMsal.displayName = `withMsal(${componentName})`;\r\n return ComponentWithMsal;\r\n};\n\n\n//# sourceMappingURL=withMsal.js.map\n\n;// ./node_modules/@azure/msal-react/dist/index.js\n/*! @azure/msal-react v2.2.0 2024-11-05 */\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY4MTAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtcmVhY3QvZGlzdC9Nc2FsQ29udGV4dC5qcz84ZmVkIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvdXRpbHMvdXRpbGl0aWVzLmpzPzdiNzYiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtcmVhY3QvZGlzdC9wYWNrYWdlTWV0YWRhdGEuanM/NmFiYyIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1yZWFjdC9kaXN0L01zYWxQcm92aWRlci5qcz8xYzMxIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvaG9va3MvdXNlTXNhbC5qcz9mMzVlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvaG9va3MvdXNlSXNBdXRoZW50aWNhdGVkLmpzP2M3ZjMiLCJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGF6dXJlL21zYWwtcmVhY3QvZGlzdC9jb21wb25lbnRzL0F1dGhlbnRpY2F0ZWRUZW1wbGF0ZS5qcz9kMDdlIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvY29tcG9uZW50cy9VbmF1dGhlbnRpY2F0ZWRUZW1wbGF0ZS5qcz9mYjdjIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvaG9va3MvdXNlQWNjb3VudC5qcz9iNjFhIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvZXJyb3IvUmVhY3RBdXRoRXJyb3IuanM/NTE2YSIsIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9AYXp1cmUvbXNhbC1yZWFjdC9kaXN0L2hvb2tzL3VzZU1zYWxBdXRoZW50aWNhdGlvbi5qcz8wOTk1Iiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvY29tcG9uZW50cy9Nc2FsQXV0aGVudGljYXRpb25UZW1wbGF0ZS5qcz9mMjcyIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvY29tcG9uZW50cy93aXRoTXNhbC5qcz9lMTEwIiwid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL0BhenVyZS9tc2FsLXJlYWN0L2Rpc3QvaW5kZXguanM/YWNlMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQGF6dXJlL21zYWwtcmVhY3QgdjIuMi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiwgSW50ZXJhY3Rpb25TdGF0dXMsIExvZ2dlciB9IGZyb20gJ0BhenVyZS9tc2FsLWJyb3dzZXInO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLypcclxuICogU3R1YmJlZCBjb250ZXh0IGltcGxlbWVudGF0aW9uXHJcbiAqIE9ubHkgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHByb3ZpZGVyLCB3aGljaCBpcyBhbiB1bnN1cHBvcnRlZCBzY2VuYXJpb1xyXG4gKi9cclxuY29uc3QgZGVmYXVsdE1zYWxDb250ZXh0ID0ge1xyXG4gICAgaW5zdGFuY2U6IHN0dWJiZWRQdWJsaWNDbGllbnRBcHBsaWNhdGlvbixcclxuICAgIGluUHJvZ3Jlc3M6IEludGVyYWN0aW9uU3RhdHVzLk5vbmUsXHJcbiAgICBhY2NvdW50czogW10sXHJcbiAgICBsb2dnZXI6IG5ldyBMb2dnZXIoe30pLFxyXG59O1xyXG5jb25zdCBNc2FsQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdE1zYWxDb250ZXh0KTtcclxuY29uc3QgTXNhbENvbnN1bWVyID0gTXNhbENvbnRleHQuQ29uc3VtZXI7XG5cbmV4cG9ydCB7IE1zYWxDb25zdW1lciwgTXNhbENvbnRleHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1zYWxDb250ZXh0LmpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLXJlYWN0IHYyLjIuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW5PckZ1bmN0aW9uKGNoaWxkcmVuLCBhcmdzKSB7XHJcbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICByZXR1cm4gY2hpbGRyZW4oYXJncyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbn1cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciAyIGFycmF5cyBhcmUgZXF1YWxcclxuICogVXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzdGF0ZSB1cGRhdGVzXHJcbiAqIEBwYXJhbSBhcnJheUFcclxuICogQHBhcmFtIGFycmF5QlxyXG4gKi9cclxuZnVuY3Rpb24gYWNjb3VudEFycmF5c0FyZUVxdWFsKGFycmF5QSwgYXJyYXlCKSB7XHJcbiAgICBpZiAoYXJyYXlBLmxlbmd0aCAhPT0gYXJyYXlCLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXBhcmlzb25BcnJheSA9IFsuLi5hcnJheUJdO1xyXG4gICAgcmV0dXJuIGFycmF5QS5ldmVyeSgoZWxlbWVudEEpID0+IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50QiA9IGNvbXBhcmlzb25BcnJheS5zaGlmdCgpO1xyXG4gICAgICAgIGlmICghZWxlbWVudEEgfHwgIWVsZW1lbnRCKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChlbGVtZW50QS5ob21lQWNjb3VudElkID09PSBlbGVtZW50Qi5ob21lQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgIGVsZW1lbnRBLmxvY2FsQWNjb3VudElkID09PSBlbGVtZW50Qi5sb2NhbEFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICBlbGVtZW50QS51c2VybmFtZSA9PT0gZWxlbWVudEIudXNlcm5hbWUpO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gZ2V0QWNjb3VudEJ5SWRlbnRpZmllcnMoYWxsQWNjb3VudHMsIGFjY291bnRJZGVudGlmaWVycykge1xyXG4gICAgaWYgKGFsbEFjY291bnRzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAoYWNjb3VudElkZW50aWZpZXJzLmhvbWVBY2NvdW50SWQgfHxcclxuICAgICAgICAgICAgYWNjb3VudElkZW50aWZpZXJzLmxvY2FsQWNjb3VudElkIHx8XHJcbiAgICAgICAgICAgIGFjY291bnRJZGVudGlmaWVycy51c2VybmFtZSkpIHtcclxuICAgICAgICBjb25zdCBtYXRjaGVkQWNjb3VudHMgPSBhbGxBY2NvdW50cy5maWx0ZXIoKGFjY291bnRPYmopID0+IHtcclxuICAgICAgICAgICAgaWYgKGFjY291bnRJZGVudGlmaWVycy51c2VybmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgYWNjb3VudElkZW50aWZpZXJzLnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgIT09XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudE9iai51c2VybmFtZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjY291bnRJZGVudGlmaWVycy5ob21lQWNjb3VudElkICYmXHJcbiAgICAgICAgICAgICAgICBhY2NvdW50SWRlbnRpZmllcnMuaG9tZUFjY291bnRJZC50b0xvd2VyQ2FzZSgpICE9PVxyXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRPYmouaG9tZUFjY291bnRJZC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjY291bnRJZGVudGlmaWVycy5sb2NhbEFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAgICAgYWNjb3VudElkZW50aWZpZXJzLmxvY2FsQWNjb3VudElkLnRvTG93ZXJDYXNlKCkgIT09XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudE9iai5sb2NhbEFjY291bnRJZC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZWRBY2NvdW50c1swXSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgYWNjb3VudEFycmF5c0FyZUVxdWFsLCBnZXRBY2NvdW50QnlJZGVudGlmaWVycywgZ2V0Q2hpbGRyZW5PckZ1bmN0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsaXRpZXMuanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtcmVhY3QgdjIuMi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGhlYWRlci9oZWFkZXIgKi9cclxuY29uc3QgbmFtZSA9IFwiQGF6dXJlL21zYWwtcmVhY3RcIjtcclxuY29uc3QgdmVyc2lvbiA9IFwiMi4yLjBcIjtcblxuZXhwb3J0IHsgbmFtZSwgdmVyc2lvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFja2FnZU1ldGFkYXRhLmpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLXJlYWN0IHYyLjIuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgUmVhY3RfX2RlZmF1bHQsIHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWR1Y2VyIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgV3JhcHBlclNLVSwgSW50ZXJhY3Rpb25TdGF0dXMsIEV2ZW50TWVzc2FnZVV0aWxzIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5pbXBvcnQgeyBNc2FsQ29udGV4dCB9IGZyb20gJy4vTXNhbENvbnRleHQuanMnO1xuaW1wb3J0IHsgYWNjb3VudEFycmF5c0FyZUVxdWFsIH0gZnJvbSAnLi91dGlscy91dGlsaXRpZXMuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiwgbmFtZSB9IGZyb20gJy4vcGFja2FnZU1ldGFkYXRhLmpzJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IE1zYWxQcm92aWRlckFjdGlvblR5cGUgPSB7XHJcbiAgICBVTkJMT0NLX0lOUFJPR1JFU1M6IFwiVU5CTE9DS19JTlBST0dSRVNTXCIsXHJcbiAgICBFVkVOVDogXCJFVkVOVFwiLFxyXG59O1xyXG4vKipcclxuICogUmV0dXJucyB0aGUgbmV4dCBpblByb2dyZXNzIGFuZCBhY2NvdW50cyBzdGF0ZSBiYXNlZCBvbiBldmVudCBtZXNzYWdlXHJcbiAqIEBwYXJhbSBwcmV2aW91c1N0YXRlXHJcbiAqIEBwYXJhbSBhY3Rpb25cclxuICovXHJcbmNvbnN0IHJlZHVjZXIgPSAocHJldmlvdXNTdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICBjb25zdCB7IHR5cGUsIHBheWxvYWQgfSA9IGFjdGlvbjtcclxuICAgIGxldCBuZXdJblByb2dyZXNzID0gcHJldmlvdXNTdGF0ZS5pblByb2dyZXNzO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSBNc2FsUHJvdmlkZXJBY3Rpb25UeXBlLlVOQkxPQ0tfSU5QUk9HUkVTUzpcclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUuaW5Qcm9ncmVzcyA9PT0gSW50ZXJhY3Rpb25TdGF0dXMuU3RhcnR1cCkge1xyXG4gICAgICAgICAgICAgICAgbmV3SW5Qcm9ncmVzcyA9IEludGVyYWN0aW9uU3RhdHVzLk5vbmU7XHJcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmxvZ2dlci5pbmZvKFwiTXNhbFByb3ZpZGVyIC0gaGFuZGxlUmVkaXJlY3RQcm9taXNlIHJlc29sdmVkLCBzZXR0aW5nIGluUHJvZ3Jlc3MgdG8gJ25vbmUnXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgTXNhbFByb3ZpZGVyQWN0aW9uVHlwZS5FVkVOVDpcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHBheWxvYWQubWVzc2FnZTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gRXZlbnRNZXNzYWdlVXRpbHMuZ2V0SW50ZXJhY3Rpb25TdGF0dXNGcm9tRXZlbnQobWVzc2FnZSwgcHJldmlvdXNTdGF0ZS5pblByb2dyZXNzKTtcclxuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZC5sb2dnZXIuaW5mbyhgTXNhbFByb3ZpZGVyIC0gJHttZXNzYWdlLmV2ZW50VHlwZX0gcmVzdWx0cyBpbiBzZXR0aW5nIGluUHJvZ3Jlc3MgZnJvbSAke3ByZXZpb3VzU3RhdGUuaW5Qcm9ncmVzc30gdG8gJHtzdGF0dXN9YCk7XHJcbiAgICAgICAgICAgICAgICBuZXdJblByb2dyZXNzID0gc3RhdHVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gdHlwZTogJHt0eXBlfWApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudEFjY291bnRzID0gcGF5bG9hZC5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpO1xyXG4gICAgaWYgKG5ld0luUHJvZ3Jlc3MgIT09IHByZXZpb3VzU3RhdGUuaW5Qcm9ncmVzcyAmJlxyXG4gICAgICAgICFhY2NvdW50QXJyYXlzQXJlRXF1YWwoY3VycmVudEFjY291bnRzLCBwcmV2aW91c1N0YXRlLmFjY291bnRzKSkge1xyXG4gICAgICAgIC8vIEJvdGggaW5Qcm9ncmVzcyBhbmQgYWNjb3VudHMgY2hhbmdlZFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnByZXZpb3VzU3RhdGUsXHJcbiAgICAgICAgICAgIGluUHJvZ3Jlc3M6IG5ld0luUHJvZ3Jlc3MsXHJcbiAgICAgICAgICAgIGFjY291bnRzOiBjdXJyZW50QWNjb3VudHMsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG5ld0luUHJvZ3Jlc3MgIT09IHByZXZpb3VzU3RhdGUuaW5Qcm9ncmVzcykge1xyXG4gICAgICAgIC8vIE9ubHkgb25seSBpblByb2dyZXNzIGNoYW5nZWRcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5wcmV2aW91c1N0YXRlLFxyXG4gICAgICAgICAgICBpblByb2dyZXNzOiBuZXdJblByb2dyZXNzLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghYWNjb3VudEFycmF5c0FyZUVxdWFsKGN1cnJlbnRBY2NvdW50cywgcHJldmlvdXNTdGF0ZS5hY2NvdW50cykpIHtcclxuICAgICAgICAvLyBPbmx5IGFjY291bnRzIGNoYW5nZWRcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5wcmV2aW91c1N0YXRlLFxyXG4gICAgICAgICAgICBhY2NvdW50czogY3VycmVudEFjY291bnRzLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBOb3RoaW5nIGNoYW5nZWRcclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIE1TQUwgY29udGV4dCBwcm92aWRlciBjb21wb25lbnQuIFRoaXMgbXVzdCBiZSByZW5kZXJlZCBhYm92ZSBhbnkgb3RoZXIgY29tcG9uZW50cyB0aGF0IHVzZSBNU0FMLlxyXG4gKi9cclxuZnVuY3Rpb24gTXNhbFByb3ZpZGVyKHsgaW5zdGFuY2UsIGNoaWxkcmVuLCB9KSB7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluc3RhbmNlLmluaXRpYWxpemVXcmFwcGVyTGlicmFyeShXcmFwcGVyU0tVLlJlYWN0LCB2ZXJzaW9uKTtcclxuICAgIH0sIFtpbnN0YW5jZV0pO1xyXG4gICAgLy8gQ3JlYXRlIGEgbG9nZ2VyIGluc3RhbmNlIGZvciBtc2FsLXJlYWN0IHdpdGggdGhlIHNhbWUgb3B0aW9ucyBhcyBQdWJsaWNDbGllbnRBcHBsaWNhdGlvblxyXG4gICAgY29uc3QgbG9nZ2VyID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmdldExvZ2dlcigpLmNsb25lKG5hbWUsIHZlcnNpb24pO1xyXG4gICAgfSwgW2luc3RhbmNlXSk7XHJcbiAgICBjb25zdCBbc3RhdGUsIHVwZGF0ZVN0YXRlXSA9IHVzZVJlZHVjZXIocmVkdWNlciwgdW5kZWZpbmVkLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gTGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5pdGlhbCBzdGF0ZVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGluUHJvZ3Jlc3M6IEludGVyYWN0aW9uU3RhdHVzLlN0YXJ0dXAsXHJcbiAgICAgICAgICAgIGFjY291bnRzOiBpbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLFxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGluc3RhbmNlLmFkZEV2ZW50Q2FsbGJhY2soKG1lc3NhZ2UpID0+IHtcclxuICAgICAgICAgICAgdXBkYXRlU3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcixcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IE1zYWxQcm92aWRlckFjdGlvblR5cGUuRVZFTlQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBNc2FsUHJvdmlkZXIgLSBSZWdpc3RlcmVkIGV2ZW50IGNhbGxiYWNrIHdpdGggaWQ6ICR7Y2FsbGJhY2tJZH1gKTtcclxuICAgICAgICBpbnN0YW5jZVxyXG4gICAgICAgICAgICAuaW5pdGlhbGl6ZSgpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIC5oYW5kbGVSZWRpcmVjdFByb21pc2UoKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSBsaXN0ZW5pbmcgdG8gdGhlIExPR0lOX0ZBSUxVUkUgZXZlbnRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgKiBJZiBoYW5kbGVSZWRpcmVjdFByb21pc2UgcmV0dXJucyBhIGNhY2hlZCBwcm9taXNlIHRoZSBuZWNlc3NhcnkgZXZlbnRzIG1heSBub3QgYmUgZmlyZWRcclxuICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgYSBmYWxsYmFjayB0byBwcmV2ZW50IGluUHJvZ3Jlc3MgZnJvbSBnZXR0aW5nIHN0dWNrIGluICdzdGFydHVwJ1xyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTXNhbFByb3ZpZGVyQWN0aW9uVHlwZS5VTkJMT0NLX0lOUFJPR1JFU1MsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgLy8gRXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGxpc3RlbmluZyB0byB0aGUgTE9HSU5fRkFJTFVSRSBldmVudFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGNhbGxiYWNrIHdoZW4gY29tcG9uZW50IHVubW91bnRzIG9yIGFjY291bnRzIGNoYW5nZVxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tJZCkge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYE1zYWxQcm92aWRlciAtIFJlbW92aW5nIGV2ZW50IGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlLnJlbW92ZUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfSwgW2luc3RhbmNlLCBsb2dnZXJdKTtcclxuICAgIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHtcclxuICAgICAgICBpbnN0YW5jZSxcclxuICAgICAgICBpblByb2dyZXNzOiBzdGF0ZS5pblByb2dyZXNzLFxyXG4gICAgICAgIGFjY291bnRzOiBzdGF0ZS5hY2NvdW50cyxcclxuICAgICAgICBsb2dnZXIsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KE1zYWxDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjb250ZXh0VmFsdWUgfSwgY2hpbGRyZW4pKTtcclxufVxuXG5leHBvcnQgeyBNc2FsUHJvdmlkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1zYWxQcm92aWRlci5qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1yZWFjdCB2Mi4yLjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1zYWxDb250ZXh0IH0gZnJvbSAnLi4vTXNhbENvbnRleHQuanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgTXNhbCBDb250ZXh0IHZhbHVlc1xyXG4gKi9cclxuY29uc3QgdXNlTXNhbCA9ICgpID0+IHVzZUNvbnRleHQoTXNhbENvbnRleHQpO1xuXG5leHBvcnQgeyB1c2VNc2FsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VNc2FsLmpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLXJlYWN0IHYyLjIuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTXNhbCB9IGZyb20gJy4vdXNlTXNhbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvblN0YXR1cyB9IGZyb20gJ0BhenVyZS9tc2FsLWJyb3dzZXInO1xuaW1wb3J0IHsgZ2V0QWNjb3VudEJ5SWRlbnRpZmllcnMgfSBmcm9tICcuLi91dGlscy91dGlsaXRpZXMuanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNBdXRoZW50aWNhdGVkKGFsbEFjY291bnRzLCBtYXRjaEFjY291bnQpIHtcclxuICAgIGlmIChtYXRjaEFjY291bnQgJiZcclxuICAgICAgICAobWF0Y2hBY2NvdW50LnVzZXJuYW1lIHx8XHJcbiAgICAgICAgICAgIG1hdGNoQWNjb3VudC5ob21lQWNjb3VudElkIHx8XHJcbiAgICAgICAgICAgIG1hdGNoQWNjb3VudC5sb2NhbEFjY291bnRJZCkpIHtcclxuICAgICAgICByZXR1cm4gISFnZXRBY2NvdW50QnlJZGVudGlmaWVycyhhbGxBY2NvdW50cywgbWF0Y2hBY2NvdW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiBhbGxBY2NvdW50cy5sZW5ndGggPiAwO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgdXNlciBpcyBjdXJyZW50bHkgc2lnbmVkLWluLiBPcHRpb25hbGx5IHByb3ZpZGUgMSBvciBtb3JlIGFjY291bnRJZGVudGlmaWVycyB0byBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyB1c2VyIGlzIHNpZ25lZC1pblxyXG4gKiBAcGFyYW0gbWF0Y2hBY2NvdW50XHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VJc0F1dGhlbnRpY2F0ZWQobWF0Y2hBY2NvdW50KSB7XHJcbiAgICBjb25zdCB7IGFjY291bnRzOiBhbGxBY2NvdW50cywgaW5Qcm9ncmVzcyB9ID0gdXNlTXNhbCgpO1xyXG4gICAgY29uc3QgaXNVc2VyQXV0aGVudGljYXRlZCA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChpblByb2dyZXNzID09PSBJbnRlcmFjdGlvblN0YXR1cy5TdGFydHVwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzQXV0aGVudGljYXRlZChhbGxBY2NvdW50cywgbWF0Y2hBY2NvdW50KTtcclxuICAgIH0sIFthbGxBY2NvdW50cywgaW5Qcm9ncmVzcywgbWF0Y2hBY2NvdW50XSk7XHJcbiAgICByZXR1cm4gaXNVc2VyQXV0aGVudGljYXRlZDtcclxufVxuXG5leHBvcnQgeyB1c2VJc0F1dGhlbnRpY2F0ZWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZUlzQXV0aGVudGljYXRlZC5qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1yZWFjdCB2Mi4yLjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IFJlYWN0X19kZWZhdWx0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRDaGlsZHJlbk9yRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscy91dGlsaXRpZXMuanMnO1xuaW1wb3J0IHsgdXNlTXNhbCB9IGZyb20gJy4uL2hvb2tzL3VzZU1zYWwuanMnO1xuaW1wb3J0IHsgdXNlSXNBdXRoZW50aWNhdGVkIH0gZnJvbSAnLi4vaG9va3MvdXNlSXNBdXRoZW50aWNhdGVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uU3RhdHVzIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmVuZGVycyBjaGlsZCBjb21wb25lbnRzIGlmIHVzZXIgaXMgYXV0aGVudGljYXRlZFxyXG4gKiBAcGFyYW0gcHJvcHNcclxuICovXHJcbmZ1bmN0aW9uIEF1dGhlbnRpY2F0ZWRUZW1wbGF0ZSh7IHVzZXJuYW1lLCBob21lQWNjb3VudElkLCBsb2NhbEFjY291bnRJZCwgY2hpbGRyZW4sIH0pIHtcclxuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNc2FsKCk7XHJcbiAgICBjb25zdCBhY2NvdW50SWRlbnRpZmllciA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHVzZXJuYW1lLFxyXG4gICAgICAgICAgICBob21lQWNjb3VudElkLFxyXG4gICAgICAgICAgICBsb2NhbEFjY291bnRJZCxcclxuICAgICAgICB9O1xyXG4gICAgfSwgW3VzZXJuYW1lLCBob21lQWNjb3VudElkLCBsb2NhbEFjY291bnRJZF0pO1xyXG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gdXNlSXNBdXRoZW50aWNhdGVkKGFjY291bnRJZGVudGlmaWVyKTtcclxuICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgY29udGV4dC5pblByb2dyZXNzICE9PSBJbnRlcmFjdGlvblN0YXR1cy5TdGFydHVwKSB7XHJcbiAgICAgICAgcmV0dXJuIChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0X19kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBnZXRDaGlsZHJlbk9yRnVuY3Rpb24oY2hpbGRyZW4sIGNvbnRleHQpKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxuXG5leHBvcnQgeyBBdXRoZW50aWNhdGVkVGVtcGxhdGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF1dGhlbnRpY2F0ZWRUZW1wbGF0ZS5qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1yZWFjdCB2Mi4yLjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IFJlYWN0X19kZWZhdWx0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNc2FsIH0gZnJvbSAnLi4vaG9va3MvdXNlTXNhbC5qcyc7XG5pbXBvcnQgeyB1c2VJc0F1dGhlbnRpY2F0ZWQgfSBmcm9tICcuLi9ob29rcy91c2VJc0F1dGhlbnRpY2F0ZWQuanMnO1xuaW1wb3J0IHsgZ2V0Q2hpbGRyZW5PckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uU3RhdHVzIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmVuZGVycyBjaGlsZCBjb21wb25lbnRzIGlmIHVzZXIgaXMgdW5hdXRoZW50aWNhdGVkXHJcbiAqIEBwYXJhbSBwcm9wc1xyXG4gKi9cclxuZnVuY3Rpb24gVW5hdXRoZW50aWNhdGVkVGVtcGxhdGUoeyB1c2VybmFtZSwgaG9tZUFjY291bnRJZCwgbG9jYWxBY2NvdW50SWQsIGNoaWxkcmVuLCB9KSB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTXNhbCgpO1xyXG4gICAgY29uc3QgYWNjb3VudElkZW50aWZpZXIgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQsXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFt1c2VybmFtZSwgaG9tZUFjY291bnRJZCwgbG9jYWxBY2NvdW50SWRdKTtcclxuICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IHVzZUlzQXV0aGVudGljYXRlZChhY2NvdW50SWRlbnRpZmllcik7XHJcbiAgICBpZiAoIWlzQXV0aGVudGljYXRlZCAmJlxyXG4gICAgICAgIGNvbnRleHQuaW5Qcm9ncmVzcyAhPT0gSW50ZXJhY3Rpb25TdGF0dXMuU3RhcnR1cCAmJlxyXG4gICAgICAgIGNvbnRleHQuaW5Qcm9ncmVzcyAhPT0gSW50ZXJhY3Rpb25TdGF0dXMuSGFuZGxlUmVkaXJlY3QpIHtcclxuICAgICAgICByZXR1cm4gKFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoUmVhY3RfX2RlZmF1bHQuRnJhZ21lbnQsIG51bGwsIGdldENoaWxkcmVuT3JGdW5jdGlvbihjaGlsZHJlbiwgY29udGV4dCkpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XG5cbmV4cG9ydCB7IFVuYXV0aGVudGljYXRlZFRlbXBsYXRlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbmF1dGhlbnRpY2F0ZWRUZW1wbGF0ZS5qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1yZWFjdCB2Mi4yLjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEFjY291bnRFbnRpdHkgfSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcbmltcG9ydCB7IHVzZU1zYWwgfSBmcm9tICcuL3VzZU1zYWwuanMnO1xuaW1wb3J0IHsgZ2V0QWNjb3VudEJ5SWRlbnRpZmllcnMgfSBmcm9tICcuLi91dGlscy91dGlsaXRpZXMuanMnO1xuXG4vKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QWNjb3VudChpbnN0YW5jZSwgYWNjb3VudElkZW50aWZpZXJzKSB7XHJcbiAgICBpZiAoIWFjY291bnRJZGVudGlmaWVycyB8fFxyXG4gICAgICAgICghYWNjb3VudElkZW50aWZpZXJzLmhvbWVBY2NvdW50SWQgJiZcclxuICAgICAgICAgICAgIWFjY291bnRJZGVudGlmaWVycy5sb2NhbEFjY291bnRJZCAmJlxyXG4gICAgICAgICAgICAhYWNjb3VudElkZW50aWZpZXJzLnVzZXJuYW1lKSkge1xyXG4gICAgICAgIC8vIElmIG5vIGFjY291bnQgaWRlbnRpZmllcnMgYXJlIHByb3ZpZGVkLCByZXR1cm4gYWN0aXZlIGFjY291bnRcclxuICAgICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdldEFjY291bnRCeUlkZW50aWZpZXJzKGluc3RhbmNlLmdldEFsbEFjY291bnRzKCksIGFjY291bnRJZGVudGlmaWVycyk7XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIDEgb3IgbW9yZSBhY2NvdW50SWRlbnRpZmllcnMsIHJldHVybnMgdGhlIEFjY291bnQgb2JqZWN0IGlmIHRoZSB1c2VyIGlzIHNpZ25lZC1pblxyXG4gKiBAcGFyYW0gYWNjb3VudElkZW50aWZpZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VBY2NvdW50KGFjY291bnRJZGVudGlmaWVycykge1xyXG4gICAgY29uc3QgeyBpbnN0YW5jZSwgaW5Qcm9ncmVzcywgbG9nZ2VyIH0gPSB1c2VNc2FsKCk7XHJcbiAgICBjb25zdCBbYWNjb3VudCwgc2V0QWNjb3VudF0gPSB1c2VTdGF0ZSgoKSA9PiBnZXRBY2NvdW50KGluc3RhbmNlLCBhY2NvdW50SWRlbnRpZmllcnMpKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgc2V0QWNjb3VudCgoY3VycmVudEFjY291bnQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV4dEFjY291bnQgPSBnZXRBY2NvdW50KGluc3RhbmNlLCBhY2NvdW50SWRlbnRpZmllcnMpO1xyXG4gICAgICAgICAgICBpZiAoIUFjY291bnRFbnRpdHkuYWNjb3VudEluZm9Jc0VxdWFsKGN1cnJlbnRBY2NvdW50LCBuZXh0QWNjb3VudCwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwidXNlQWNjb3VudCAtIFVwZGF0aW5nIGFjY291bnRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEFjY291bnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW2luUHJvZ3Jlc3MsIGFjY291bnRJZGVudGlmaWVycywgaW5zdGFuY2UsIGxvZ2dlcl0pO1xyXG4gICAgcmV0dXJuIGFjY291bnQ7XHJcbn1cblxuZXhwb3J0IHsgdXNlQWNjb3VudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlQWNjb3VudC5qcy5tYXBcbiIsIi8qISBAYXp1cmUvbXNhbC1yZWFjdCB2Mi4yLjAgMjAyNC0xMS0wNSAqL1xuJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBSZWFjdEF1dGhFcnJvck1lc3NhZ2UgPSB7XHJcbiAgICBpbnZhbGlkSW50ZXJhY3Rpb25UeXBlOiB7XHJcbiAgICAgICAgY29kZTogXCJpbnZhbGlkX2ludGVyYWN0aW9uX3R5cGVcIixcclxuICAgICAgICBkZXNjOiBcIlRoZSBwcm92aWRlZCBpbnRlcmFjdGlvbiB0eXBlIGlzIGludmFsaWQuXCIsXHJcbiAgICB9LFxyXG4gICAgdW5hYmxlVG9GYWxsYmFja1RvSW50ZXJhY3Rpb246IHtcclxuICAgICAgICBjb2RlOiBcInVuYWJsZV90b19mYWxsYmFja190b19pbnRlcmFjdGlvblwiLFxyXG4gICAgICAgIGRlc2M6IFwiSW50ZXJhY3Rpb24gaXMgcmVxdWlyZWQgYnV0IGFub3RoZXIgaW50ZXJhY3Rpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4gUGxlYXNlIHRyeSBhZ2FpbiB3aGVuIHRoZSBjdXJyZW50IGludGVyYWN0aW9uIGlzIGNvbXBsZXRlLlwiLFxyXG4gICAgfSxcclxufTtcclxuY2xhc3MgUmVhY3RBdXRoRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihlcnJvckNvZGUsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFJlYWN0QXV0aEVycm9yLnByb3RvdHlwZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSZWFjdEF1dGhFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWF0ZUludmFsaWRJbnRlcmFjdGlvblR5cGVFcnJvcigpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlYWN0QXV0aEVycm9yKFJlYWN0QXV0aEVycm9yTWVzc2FnZS5pbnZhbGlkSW50ZXJhY3Rpb25UeXBlLmNvZGUsIFJlYWN0QXV0aEVycm9yTWVzc2FnZS5pbnZhbGlkSW50ZXJhY3Rpb25UeXBlLmRlc2MpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWF0ZVVuYWJsZVRvRmFsbGJhY2tUb0ludGVyYWN0aW9uRXJyb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZWFjdEF1dGhFcnJvcihSZWFjdEF1dGhFcnJvck1lc3NhZ2UudW5hYmxlVG9GYWxsYmFja1RvSW50ZXJhY3Rpb24uY29kZSwgUmVhY3RBdXRoRXJyb3JNZXNzYWdlLnVuYWJsZVRvRmFsbGJhY2tUb0ludGVyYWN0aW9uLmRlc2MpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IFJlYWN0QXV0aEVycm9yLCBSZWFjdEF1dGhFcnJvck1lc3NhZ2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWN0QXV0aEVycm9yLmpzLm1hcFxuIiwiLyohIEBhenVyZS9tc2FsLXJlYWN0IHYyLjIuMCAyMDI0LTExLTA1ICovXG4ndXNlIHN0cmljdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25TdGF0dXMsIEludGVyYWN0aW9uVHlwZSwgRXZlbnRUeXBlLCBPSURDX0RFRkFVTFRfU0NPUEVTLCBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5pbXBvcnQgeyB1c2VJc0F1dGhlbnRpY2F0ZWQgfSBmcm9tICcuL3VzZUlzQXV0aGVudGljYXRlZC5qcyc7XG5pbXBvcnQgeyB1c2VNc2FsIH0gZnJvbSAnLi91c2VNc2FsLmpzJztcbmltcG9ydCB7IHVzZUFjY291bnQgfSBmcm9tICcuL3VzZUFjY291bnQuanMnO1xuaW1wb3J0IHsgUmVhY3RBdXRoRXJyb3IgfSBmcm9tICcuLi9lcnJvci9SZWFjdEF1dGhFcnJvci5qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSWYgYSB1c2VyIGlzIG5vdCBjdXJyZW50bHkgc2lnbmVkIGluIHRoaXMgaG9vayBpbnZva2VzIGEgbG9naW4uIEZhaWxlZCBsb2dpbnMgY2FuIGJlIHJldHJpZWQgdXNpbmcgdGhlIGxvZ2luIGNhbGxiYWNrIHJldHVybmVkLlxyXG4gKiBJZiBhIHVzZXIgaXMgY3VycmVudGx5IHNpZ25lZCBpbiB0aGlzIGhvb2sgYXR0ZW1wdHMgdG8gYWNxdWlyZSBhIHRva2VuLiBTdWJzZXF1ZW50IHRva2VuIHJlcXVlc3RzIGNhbiB1c2UgdGhlIGFjcXVpcmVUb2tlbiBjYWxsYmFjayByZXR1cm5lZC5cclxuICogT3B0aW9uYWxseSBwcm92aWRlIGEgcmVxdWVzdCBvYmplY3QgdG8gYmUgdXNlZCBpbiB0aGUgbG9naW4vYWNxdWlyZVRva2VuIGNhbGwuXHJcbiAqIE9wdGlvbmFsbHkgcHJvdmlkZSBhIHNwZWNpZmljIHVzZXIgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIGluLlxyXG4gKiBAcGFyYW0gaW50ZXJhY3Rpb25UeXBlXHJcbiAqIEBwYXJhbSBhdXRoZW50aWNhdGlvblJlcXVlc3RcclxuICogQHBhcmFtIGFjY291bnRJZGVudGlmaWVyc1xyXG4gKi9cclxuZnVuY3Rpb24gdXNlTXNhbEF1dGhlbnRpY2F0aW9uKGludGVyYWN0aW9uVHlwZSwgYXV0aGVudGljYXRpb25SZXF1ZXN0LCBhY2NvdW50SWRlbnRpZmllcnMpIHtcclxuICAgIGNvbnN0IHsgaW5zdGFuY2UsIGluUHJvZ3Jlc3MsIGxvZ2dlciB9ID0gdXNlTXNhbCgpO1xyXG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gdXNlSXNBdXRoZW50aWNhdGVkKGFjY291bnRJZGVudGlmaWVycyk7XHJcbiAgICBjb25zdCBhY2NvdW50ID0gdXNlQWNjb3VudChhY2NvdW50SWRlbnRpZmllcnMpO1xyXG4gICAgY29uc3QgW1tyZXN1bHQsIGVycm9yXSwgc2V0UmVzcG9uc2VdID0gdXNlU3RhdGUoW251bGwsIG51bGxdKTtcclxuICAgIC8vIFVzZWQgdG8gcHJldmVudCBzdGF0ZSB1cGRhdGVzIGFmdGVyIHVubW91bnRcclxuICAgIGNvbnN0IG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIG1vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICAvLyBCb29sZWFuIHVzZWQgdG8gY2hlY2sgaWYgaW50ZXJhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgaW4gYWNxdWlyZVRva2VuU2lsZW50IGZhbGxiYWNrLiBVc2UgUmVmIGluc3RlYWQgb2Ygc3RhdGUgdG8gcHJldmVudCBhY3F1aXJlVG9rZW4gZnVuY3Rpb24gZnJvbSBiZWluZyByZWdlbmVyYXRlZCBvbiBlYWNoIGNoYW5nZSB0byBpbnRlcmFjdGlvbkluUHJvZ3Jlc3MgdmFsdWVcclxuICAgIGNvbnN0IGludGVyYWN0aW9uSW5Qcm9ncmVzcyA9IHVzZVJlZihpblByb2dyZXNzICE9PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW50ZXJhY3Rpb25JblByb2dyZXNzLmN1cnJlbnQgPSBpblByb2dyZXNzICE9PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lO1xyXG4gICAgfSwgW2luUHJvZ3Jlc3NdKTtcclxuICAgIC8vIEZsYWcgdXNlZCB0byBjb250cm9sIHdoZW4gdGhlIGhvb2sgY2FsbHMgbG9naW4vYWNxdWlyZVRva2VuXHJcbiAgICBjb25zdCBzaG91bGRBY3F1aXJlVG9rZW4gPSB1c2VSZWYodHJ1ZSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghIWVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIEVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSBjb25zdW1pbmcgY29tcG9uZW50XHJcbiAgICAgICAgICAgIHNob3VsZEFjcXVpcmVUb2tlbi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEhcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIC8vIFRva2VuIGhhcyBhbHJlYWR5IGJlZW4gYWNxdWlyZWQsIGNvbnN1bWluZyBjb21wb25lbnQvYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlbmV3aW5nXHJcbiAgICAgICAgICAgIHNob3VsZEFjcXVpcmVUb2tlbi5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9LCBbZXJyb3IsIHJlc3VsdF0pO1xyXG4gICAgY29uc3QgbG9naW4gPSB1c2VDYWxsYmFjayhhc3luYyAoY2FsbGJhY2tJbnRlcmFjdGlvblR5cGUsIGNhbGxiYWNrUmVxdWVzdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxvZ2luVHlwZSA9IGNhbGxiYWNrSW50ZXJhY3Rpb25UeXBlIHx8IGludGVyYWN0aW9uVHlwZTtcclxuICAgICAgICBjb25zdCBsb2dpblJlcXVlc3QgPSBjYWxsYmFja1JlcXVlc3QgfHwgYXV0aGVudGljYXRpb25SZXF1ZXN0O1xyXG4gICAgICAgIHN3aXRjaCAobG9naW5UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSW50ZXJhY3Rpb25UeXBlLlBvcHVwOlxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBDYWxsaW5nIGxvZ2luUG9wdXBcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UubG9naW5Qb3B1cChsb2dpblJlcXVlc3QpO1xyXG4gICAgICAgICAgICBjYXNlIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDpcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgcHJvbWlzZSBpcyBub3QgZXhwZWN0ZWQgdG8gcmVzb2x2ZSBkdWUgdG8gZnVsbCBmcmFtZSByZWRpcmVjdFxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBDYWxsaW5nIGxvZ2luUmVkaXJlY3RcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgICAgICAubG9naW5SZWRpcmVjdChsb2dpblJlcXVlc3QpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4obnVsbCk7XHJcbiAgICAgICAgICAgIGNhc2UgSW50ZXJhY3Rpb25UeXBlLlNpbGVudDpcclxuICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKFwidXNlTXNhbEF1dGhlbnRpY2F0aW9uIC0gQ2FsbGluZyBzc29TaWxlbnRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc3NvU2lsZW50KGxvZ2luUmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBSZWFjdEF1dGhFcnJvci5jcmVhdGVJbnZhbGlkSW50ZXJhY3Rpb25UeXBlRXJyb3IoKTtcclxuICAgICAgICB9XHJcbiAgICB9LCBbaW5zdGFuY2UsIGludGVyYWN0aW9uVHlwZSwgYXV0aGVudGljYXRpb25SZXF1ZXN0LCBsb2dnZXJdKTtcclxuICAgIGNvbnN0IGFjcXVpcmVUb2tlbiA9IHVzZUNhbGxiYWNrKGFzeW5jIChjYWxsYmFja0ludGVyYWN0aW9uVHlwZSwgY2FsbGJhY2tSZXF1ZXN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmFsbGJhY2tJbnRlcmFjdGlvblR5cGUgPSBjYWxsYmFja0ludGVyYWN0aW9uVHlwZSB8fCBpbnRlcmFjdGlvblR5cGU7XHJcbiAgICAgICAgbGV0IHRva2VuUmVxdWVzdDtcclxuICAgICAgICBpZiAoY2FsbGJhY2tSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIGFjcXVpcmVUb2tlbiAtIFVzaW5nIHJlcXVlc3QgcHJvdmlkZWQgaW4gdGhlIGNhbGxiYWNrXCIpO1xyXG4gICAgICAgICAgICB0b2tlblJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5jYWxsYmFja1JlcXVlc3QsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0aW9uUmVxdWVzdCkge1xyXG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBhY3F1aXJlVG9rZW4gLSBVc2luZyByZXF1ZXN0IHByb3ZpZGVkIGluIHRoZSBob29rXCIpO1xyXG4gICAgICAgICAgICB0b2tlblJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5hdXRoZW50aWNhdGlvblJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICBzY29wZXM6IGF1dGhlbnRpY2F0aW9uUmVxdWVzdC5zY29wZXMgfHwgT0lEQ19ERUZBVUxUX1NDT1BFUyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci50cmFjZShcInVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIGFjcXVpcmVUb2tlbiAtIE5vIHJlcXVlc3Qgb2JqZWN0IHByb3ZpZGVkLCB1c2luZyBkZWZhdWx0IHJlcXVlc3QuXCIpO1xyXG4gICAgICAgICAgICB0b2tlblJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgICAgICBzY29wZXM6IE9JRENfREVGQVVMVF9TQ09QRVMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdG9rZW5SZXF1ZXN0LmFjY291bnQgJiYgYWNjb3VudCkge1xyXG4gICAgICAgICAgICBsb2dnZXIudHJhY2UoXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBhY3F1aXJlVG9rZW4gLSBBdHRhY2hpbmcgYWNjb3VudCB0byByZXF1ZXN0XCIpO1xyXG4gICAgICAgICAgICB0b2tlblJlcXVlc3QuYWNjb3VudCA9IGFjY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdldFRva2VuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShcInVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIENhbGxpbmcgYWNxdWlyZVRva2VuU2lsZW50XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIC5hY3F1aXJlVG9rZW5TaWxlbnQodG9rZW5SZXF1ZXN0KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVyYWN0aW9uSW5Qcm9ncmVzcy5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcInVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIEludGVyYWN0aW9uIHJlcXVpcmVkLCBmYWxsaW5nIGJhY2sgdG8gaW50ZXJhY3Rpb25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dpbihmYWxsYmFja0ludGVyYWN0aW9uVHlwZSwgdG9rZW5SZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcInVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIEludGVyYWN0aW9uIHJlcXVpcmVkIGJ1dCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiBQbGVhc2UgdHJ5IGFnYWluLCBpZiBuZWVkZWQsIGFmdGVyIGludGVyYWN0aW9uIGNvbXBsZXRlcy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFJlYWN0QXV0aEVycm9yLmNyZWF0ZVVuYWJsZVRvRmFsbGJhY2tUb0ludGVyYWN0aW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBnZXRUb2tlbigpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobW91bnRlZC5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zZShbcmVzcG9uc2UsIG51bGxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChtb3VudGVkLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlKFtudWxsLCBlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBpbnN0YW5jZSxcclxuICAgICAgICBpbnRlcmFjdGlvblR5cGUsXHJcbiAgICAgICAgYXV0aGVudGljYXRpb25SZXF1ZXN0LFxyXG4gICAgICAgIGxvZ2dlcixcclxuICAgICAgICBhY2NvdW50LFxyXG4gICAgICAgIGxvZ2luLFxyXG4gICAgXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBpbnN0YW5jZS5hZGRFdmVudENhbGxiYWNrKChtZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5ldmVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR0lOX1NVQ0NFU1M6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5TU09fU0lMRU5UX1NVQ0NFU1M6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGF5bG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBheWxvYWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5MT0dJTl9GQUlMVVJFOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudFR5cGUuU1NPX1NJTEVOVF9GQUlMVVJFOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlKFtudWxsLCBtZXNzYWdlLmVycm9yXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYHVzZU1zYWxBdXRoZW50aWNhdGlvbiAtIFJlZ2lzdGVyZWQgZXZlbnQgY2FsbGJhY2sgd2l0aCBpZDogJHtjYWxsYmFja0lkfWApO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFja0lkKSB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgdXNlTXNhbEF1dGhlbnRpY2F0aW9uIC0gUmVtb3ZpbmcgZXZlbnQgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApO1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UucmVtb3ZlRXZlbnRDYWxsYmFjayhjYWxsYmFja0lkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbaW5zdGFuY2UsIGxvZ2dlcl0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoc2hvdWxkQWNxdWlyZVRva2VuLmN1cnJlbnQgJiZcclxuICAgICAgICAgICAgaW5Qcm9ncmVzcyA9PT0gSW50ZXJhY3Rpb25TdGF0dXMuTm9uZSkge1xyXG4gICAgICAgICAgICBzaG91bGRBY3F1aXJlVG9rZW4uY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBObyB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIGF0dGVtcHRpbmcgdG8gbG9naW5cIik7XHJcbiAgICAgICAgICAgICAgICBsb2dpbigpLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcnMgYXJlIHNhdmVkIGluIHN0YXRlIGFib3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYWNjb3VudCkge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJ1c2VNc2FsQXV0aGVudGljYXRpb24gLSBVc2VyIGlzIGF1dGhlbnRpY2F0ZWQsIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSB0b2tlblwiKTtcclxuICAgICAgICAgICAgICAgIGFjcXVpcmVUb2tlbigpLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcnMgYXJlIHNhdmVkIGluIHN0YXRlIGFib3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LCBbaXNBdXRoZW50aWNhdGVkLCBhY2NvdW50LCBpblByb2dyZXNzLCBsb2dpbiwgYWNxdWlyZVRva2VuLCBsb2dnZXJdKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9naW4sXHJcbiAgICAgICAgYWNxdWlyZVRva2VuLFxyXG4gICAgICAgIHJlc3VsdCxcclxuICAgICAgICBlcnJvcixcclxuICAgIH07XHJcbn1cblxuZXhwb3J0IHsgdXNlTXNhbEF1dGhlbnRpY2F0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VNc2FsQXV0aGVudGljYXRpb24uanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtcmVhY3QgdjIuMi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCBSZWFjdF9fZGVmYXVsdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Q2hpbGRyZW5PckZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdXRpbGl0aWVzLmpzJztcbmltcG9ydCB7IHVzZU1zYWwgfSBmcm9tICcuLi9ob29rcy91c2VNc2FsLmpzJztcbmltcG9ydCB7IHVzZU1zYWxBdXRoZW50aWNhdGlvbiB9IGZyb20gJy4uL2hvb2tzL3VzZU1zYWxBdXRoZW50aWNhdGlvbi5qcyc7XG5pbXBvcnQgeyB1c2VJc0F1dGhlbnRpY2F0ZWQgfSBmcm9tICcuLi9ob29rcy91c2VJc0F1dGhlbnRpY2F0ZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25TdGF0dXMgfSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcblxuLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdHRlbXB0cyB0byBhdXRoZW50aWNhdGUgdXNlciBpZiBub3QgYWxyZWFkeSBhdXRoZW50aWNhdGVkLCB0aGVuIHJlbmRlcnMgY2hpbGQgY29tcG9uZW50c1xyXG4gKiBAcGFyYW0gcHJvcHNcclxuICovXHJcbmZ1bmN0aW9uIE1zYWxBdXRoZW50aWNhdGlvblRlbXBsYXRlKHsgaW50ZXJhY3Rpb25UeXBlLCB1c2VybmFtZSwgaG9tZUFjY291bnRJZCwgbG9jYWxBY2NvdW50SWQsIGF1dGhlbnRpY2F0aW9uUmVxdWVzdCwgbG9hZGluZ0NvbXBvbmVudDogTG9hZGluZ0NvbXBvbmVudCwgZXJyb3JDb21wb25lbnQ6IEVycm9yQ29tcG9uZW50LCBjaGlsZHJlbiwgfSkge1xyXG4gICAgY29uc3QgYWNjb3VudElkZW50aWZpZXIgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgaG9tZUFjY291bnRJZCxcclxuICAgICAgICAgICAgbG9jYWxBY2NvdW50SWQsXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFt1c2VybmFtZSwgaG9tZUFjY291bnRJZCwgbG9jYWxBY2NvdW50SWRdKTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNc2FsKCk7XHJcbiAgICBjb25zdCBtc2FsQXV0aFJlc3VsdCA9IHVzZU1zYWxBdXRoZW50aWNhdGlvbihpbnRlcmFjdGlvblR5cGUsIGF1dGhlbnRpY2F0aW9uUmVxdWVzdCwgYWNjb3VudElkZW50aWZpZXIpO1xyXG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gdXNlSXNBdXRoZW50aWNhdGVkKGFjY291bnRJZGVudGlmaWVyKTtcclxuICAgIGlmIChtc2FsQXV0aFJlc3VsdC5lcnJvciAmJiBjb250ZXh0LmluUHJvZ3Jlc3MgPT09IEludGVyYWN0aW9uU3RhdHVzLk5vbmUpIHtcclxuICAgICAgICBpZiAoISFFcnJvckNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChFcnJvckNvbXBvbmVudCwgeyAuLi5tc2FsQXV0aFJlc3VsdCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbXNhbEF1dGhSZXN1bHQuZXJyb3I7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0X19kZWZhdWx0LkZyYWdtZW50LCBudWxsLCBnZXRDaGlsZHJlbk9yRnVuY3Rpb24oY2hpbGRyZW4sIG1zYWxBdXRoUmVzdWx0KSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKCEhTG9hZGluZ0NvbXBvbmVudCAmJiBjb250ZXh0LmluUHJvZ3Jlc3MgIT09IEludGVyYWN0aW9uU3RhdHVzLk5vbmUpIHtcclxuICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChMb2FkaW5nQ29tcG9uZW50LCB7IC4uLmNvbnRleHQgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxuXG5leHBvcnQgeyBNc2FsQXV0aGVudGljYXRpb25UZW1wbGF0ZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXNhbEF1dGhlbnRpY2F0aW9uVGVtcGxhdGUuanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtcmVhY3QgdjIuMi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmltcG9ydCBSZWFjdF9fZGVmYXVsdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNc2FsIH0gZnJvbSAnLi4vaG9va3MvdXNlTXNhbC5qcyc7XG5cbi8qXHJcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSGlnaGVyIG9yZGVyIGNvbXBvbmVudCB3cmFwcyBwcm92aWRlZCBjb21wb25lbnQgd2l0aCBtc2FsIGJ5IGluamVjdGluZyBtc2FsIGNvbnRleHQgdmFsdWVzIGludG8gdGhlIGNvbXBvbmVudCdzIHByb3BzXHJcbiAqIEBwYXJhbSBDb21wb25lbnRcclxuICovXHJcbmNvbnN0IHdpdGhNc2FsID0gKENvbXBvbmVudCkgPT4ge1xyXG4gICAgY29uc3QgQ29tcG9uZW50V2l0aE1zYWwgPSAocHJvcHMpID0+IHtcclxuICAgICAgICBjb25zdCBtc2FsID0gdXNlTXNhbCgpO1xyXG4gICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgeyAuLi5wcm9wcywgbXNhbENvbnRleHQ6IG1zYWwgfSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCBcIkNvbXBvbmVudFwiO1xyXG4gICAgQ29tcG9uZW50V2l0aE1zYWwuZGlzcGxheU5hbWUgPSBgd2l0aE1zYWwoJHtjb21wb25lbnROYW1lfSlgO1xyXG4gICAgcmV0dXJuIENvbXBvbmVudFdpdGhNc2FsO1xyXG59O1xuXG5leHBvcnQgeyB3aXRoTXNhbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2l0aE1zYWwuanMubWFwXG4iLCIvKiEgQGF6dXJlL21zYWwtcmVhY3QgdjIuMi4wIDIwMjQtMTEtMDUgKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB7IE1zYWxDb25zdW1lciwgTXNhbENvbnRleHQgfSBmcm9tICcuL01zYWxDb250ZXh0LmpzJztcbmV4cG9ydCB7IE1zYWxQcm92aWRlciB9IGZyb20gJy4vTXNhbFByb3ZpZGVyLmpzJztcbmV4cG9ydCB7IEF1dGhlbnRpY2F0ZWRUZW1wbGF0ZSB9IGZyb20gJy4vY29tcG9uZW50cy9BdXRoZW50aWNhdGVkVGVtcGxhdGUuanMnO1xuZXhwb3J0IHsgVW5hdXRoZW50aWNhdGVkVGVtcGxhdGUgfSBmcm9tICcuL2NvbXBvbmVudHMvVW5hdXRoZW50aWNhdGVkVGVtcGxhdGUuanMnO1xuZXhwb3J0IHsgTXNhbEF1dGhlbnRpY2F0aW9uVGVtcGxhdGUgfSBmcm9tICcuL2NvbXBvbmVudHMvTXNhbEF1dGhlbnRpY2F0aW9uVGVtcGxhdGUuanMnO1xuZXhwb3J0IHsgd2l0aE1zYWwgfSBmcm9tICcuL2NvbXBvbmVudHMvd2l0aE1zYWwuanMnO1xuZXhwb3J0IHsgdXNlTXNhbCB9IGZyb20gJy4vaG9va3MvdXNlTXNhbC5qcyc7XG5leHBvcnQgeyB1c2VBY2NvdW50IH0gZnJvbSAnLi9ob29rcy91c2VBY2NvdW50LmpzJztcbmV4cG9ydCB7IHVzZUlzQXV0aGVudGljYXRlZCB9IGZyb20gJy4vaG9va3MvdXNlSXNBdXRoZW50aWNhdGVkLmpzJztcbmV4cG9ydCB7IHVzZU1zYWxBdXRoZW50aWNhdGlvbiB9IGZyb20gJy4vaG9va3MvdXNlTXNhbEF1dGhlbnRpY2F0aW9uLmpzJztcbmV4cG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL3BhY2thZ2VNZXRhZGF0YS5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36810\n')},36941:(I,g,n)=>{"use strict";I.exports=n.p+"72feda9cae2ac729ba3a.png"},37007:module=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcwMDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanM/ZmFhMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37007\n")},37071:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Frisian [fy]\n//! author : Robin van der Vliet : https://github.com/robin0van0der0v\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var monthsShortWithDots =\n 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),\n monthsShortWithoutDots =\n 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');\n\n var fy = moment.defineLocale('fy', {\n months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(\n '_'\n ),\n monthsShort: function (m, format) {\n if (!m) {\n return monthsShortWithDots;\n } else if (/-MMM-/.test(format)) {\n return monthsShortWithoutDots[m.month()];\n } else {\n return monthsShortWithDots[m.month()];\n }\n },\n monthsParseExact: true,\n weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(\n '_'\n ),\n weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),\n weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD-MM-YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[hjoed om] LT',\n nextDay: '[moarn om] LT',\n nextWeek: 'dddd [om] LT',\n lastDay: '[juster om] LT',\n lastWeek: '[ôfrûne] dddd [om] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'oer %s',\n past: '%s lyn',\n s: 'in pear sekonden',\n ss: '%d sekonden',\n m: 'ien minút',\n mm: '%d minuten',\n h: 'ien oere',\n hh: '%d oeren',\n d: 'ien dei',\n dd: '%d dagen',\n M: 'ien moanne',\n MM: '%d moannen',\n y: 'ien jier',\n yy: '%d jierren',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n ordinal: function (number) {\n return (\n number +\n (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n );\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return fy;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcwNzEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qcz83MTE4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmlzaWFuIFtmeV1cbi8vISBhdXRob3IgOiBSb2JpbiB2YW4gZGVyIFZsaWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmluMHZhbjBkZXIwdlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWFpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIGZ5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnknLCB7XG4gICAgICAgIG1vbnRoczogJ2phbm5ld2FyaXNfZmVicmV3YXJpc19tYWFydF9hcHJpbF9tYWFpZV9qdW55X2p1bHlfYXVndXN0dXNfc2VwdGltYmVyX29rdG9iZXJfbm92aW1iZXJfZGVzaW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3NuZWluX21vYW5kZWlfdGlpc2RlaV93b2Fuc2RlaV90b25nZXJzZGVpX2ZyZWVkX3NuZW9uJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc2kuX21vLl90aS5fd28uX3RvLl9mci5fc28uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NpX01vX1RpX1dvX1RvX0ZyX1NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toam9lZCBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb2FybiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdXN0ZXIgb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW8O0ZnLDu25lXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGx5bicsXG4gICAgICAgICAgICBzOiAnaW4gcGVhciBzZWtvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGVuJyxcbiAgICAgICAgICAgIG06ICdpZW4gbWluw7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnaWVuIG9lcmUnLFxuICAgICAgICAgICAgaGg6ICclZCBvZXJlbicsXG4gICAgICAgICAgICBkOiAnaWVuIGRlaScsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE06ICdpZW4gbW9hbm5lJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9hbm5lbicsXG4gICAgICAgICAgICB5OiAnaWVuIGppZXInLFxuICAgICAgICAgICAgeXk6ICclZCBqaWVycmVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ5O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37071\n")},37412:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\nvar normalizeHeaderName = __webpack_require__(7018);\nvar enhanceError = __webpack_require__(5449);\nvar transitionalDefaults = __webpack_require__(94896);\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(35592);\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = __webpack_require__(35592);\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc0MTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy9pbmRleC5qcz80YzNkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi4vaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lJyk7XG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi4vY29yZS9lbmhhbmNlRXJyb3InKTtcbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHJlcXVpcmUoJy4vdHJhbnNpdGlvbmFsJyk7XG5cbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4uL2FkYXB0ZXJzL3hocicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi4vYWRhcHRlcnMvaHR0cCcpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSB8fCAoaGVhZGVycyAmJiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgdmFyIHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICB2YXIgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgIHZhciBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgdmFyIHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcgfHwgKGZvcmNlZEpTT05QYXJzaW5nICYmIHV0aWxzLmlzU3RyaW5nKGRhdGEpICYmIGRhdGEubGVuZ3RoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IGVuaGFuY2VFcnJvcihlLCB0aGlzLCAnRV9KU09OX1BBUlNFJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37412\n")},37564:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n /* unused reexport */ __webpack_require__(14912);\n} else // removed by dead control flow\n{}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc1NjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhY3Qtcm91dGVyL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcz85OTI1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37564\n")},37588:(I,g,n)=>{"use strict";I.exports=n.p+"c538621c2adefda47041.png"},37810:(I,g,n)=>{"use strict";I.exports=n.p+"6ed587e476998e3224ea.png"},37892:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : French (Switzerland) [fr-ch]\n//! author : Gaspard Bucher : https://github.com/gaspard\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var frCh = moment.defineLocale('fr-ch', {\n months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(\n '_'\n ),\n monthsShort:\n 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Aujourd’hui à] LT',\n nextDay: '[Demain à] LT',\n nextWeek: 'dddd [à] LT',\n lastDay: '[Hier à] LT',\n lastWeek: 'dddd [dernier à] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'dans %s',\n past: 'il y a %s',\n s: 'quelques secondes',\n ss: '%d secondes',\n m: 'une minute',\n mm: '%d minutes',\n h: 'une heure',\n hh: '%d heures',\n d: 'un jour',\n dd: '%d jours',\n M: 'un mois',\n MM: '%d mois',\n y: 'un an',\n yy: '%d ans',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(er|e)/,\n ordinal: function (number, period) {\n switch (period) {\n // Words with masculine grammatical gender: mois, trimestre, jour\n default:\n case 'M':\n case 'Q':\n case 'D':\n case 'DDD':\n case 'd':\n return number + (number === 1 ? 'er' : 'e');\n\n // Words with feminine grammatical gender: semaine\n case 'w':\n case 'W':\n return number + (number === 1 ? 're' : 'e');\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return frCh;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4OTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanM/MGU0OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIChTd2l0emVybGFuZCkgW2ZyLWNoXVxuLy8hIGF1dGhvciA6IEdhc3BhcmQgQnVjaGVyIDogaHR0cHM6Ly9naXRodWIuY29tL2dhc3BhcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmckNoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnItY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnxlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmckNoO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37892\n")},38291:(I,g,n)=>{"use strict";I.exports=n.p+"c7e3a85760a272778619.png"},38454:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t ECB.Encryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.encryptBlock(words, offset);\n\t }\n\t });\n\n\t ECB.Decryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.decryptBlock(words, offset);\n\t }\n\t });\n\n\t return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg0NTQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvbW9kZS1lY2IuanM/ODFiZiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBFbGVjdHJvbmljIENvZGVib29rIGJsb2NrIG1vZGUuXG5cdCAqL1xuXHRDcnlwdG9KUy5tb2RlLkVDQiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICB2YXIgRUNCID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgRUNCLkVuY3J5cHRvciA9IEVDQi5leHRlbmQoe1xuXHQgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgRUNCLkRlY3J5cHRvciA9IEVDQi5leHRlbmQoe1xuXHQgICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2lwaGVyLmRlY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgcmV0dXJuIEVDQjtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5tb2RlLkVDQjtcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///38454\n")},38664:(I,g,n)=>{"use strict";I.exports=n.p+"fbb9097de10183985ab4.png"},38841:(I,g,n)=>{"use strict";I.exports=n.p+"4839c038ccda00a02184.png"},39149:(I,g,n)=>{"use strict";I.exports=n.p+"b6772b535d0d2e8d48b8.png"},39506:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(45471), __webpack_require__(51025));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t var block;\n\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk1MDYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9ldnBrZGYuanM/MmI3OSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMVwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGExXCIsIFwiLi9obWFjXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoaXMga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaXMgbWVhbnQgdG8gY29uZm9ybSB3aXRoIEVWUF9CeXRlc1RvS2V5LlxuXHQgICAgICogd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWxcblx0ICAgICAqL1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREYgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhlIGtleSBzaXplIGluIHdvcmRzIHRvIGdlbmVyYXRlLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuIERlZmF1bHQ6IE1ENVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGtleVNpemU6IDEyOC8zMixcblx0ICAgICAgICAgICAgaGFzaGVyOiBNRDUsXG5cdCAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDFcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGRlcml2YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXJcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IGNmZy5oYXNoZXIuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXkgPSBXb3JkQXJyYXkuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGNmZy5rZXlTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXRlcmF0aW9ucyA9IGNmZy5pdGVyYXRpb25zO1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleVxuXHQgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhc2hlci51cGRhdGUoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBoYXNoZXIudXBkYXRlKHBhc3N3b3JkKS5maW5hbGl6ZShzYWx0KTtcblx0ICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb25zXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLmZpbmFsaXplKGJsb2NrKTtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlcml2ZWRLZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDtcblxuXHQgICAgICAgICAgICByZXR1cm4gZGVyaXZlZEtleTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgKi9cblx0ICAgIEMuRXZwS0RGID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHtcblx0ICAgICAgICByZXR1cm4gRXZwS0RGLmNyZWF0ZShjZmcpLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgfTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5FdnBLREY7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39506\n")},39606:(__unused_webpack_module,exports)=>{"use strict";eval("var __webpack_unused_export__;\n\n\n__webpack_unused_export__ = ({\n value: true\n});\nvar createChangeEmitter = exports.F = function createChangeEmitter() {\n var currentListeners = [];\n var nextListeners = currentListeners;\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n\n function listen(listener) {\n if (typeof listener !== 'function') {\n throw new Error('Expected listener to be a function.');\n }\n\n var isSubscribed = true;\n\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n\n return function () {\n if (!isSubscribed) {\n return;\n }\n\n isSubscribed = false;\n\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n };\n }\n\n function emit() {\n currentListeners = nextListeners;\n var listeners = currentListeners;\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].apply(listeners, arguments);\n }\n }\n\n return {\n listen: listen,\n emit: emit\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk2MDYuanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NoYW5nZS1lbWl0dGVyL2xpYi9pbmRleC5qcz9jNjY5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBjcmVhdGVDaGFuZ2VFbWl0dGVyID0gZXhwb3J0cy5jcmVhdGVDaGFuZ2VFbWl0dGVyID0gZnVuY3Rpb24gY3JlYXRlQ2hhbmdlRW1pdHRlcigpIHtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbGlzdGVuKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZW1pdCgpIHtcbiAgICBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxpc3RlbjogbGlzdGVuLFxuICAgIGVtaXQ6IGVtaXRcbiAgfTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///39606\n")},40343:(I,g,n)=>{"use strict";I.exports=n.p+"19fd7fdeca30fed02748.png"},40345:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(37007).EventEmitter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAzNDUuanMiLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanM/NDI5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40345\n")},40748:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Swahili [sw]\n//! author : Fahad Kassim : https://github.com/fadsel\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var sw = moment.defineLocale('sw', {\n months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),\n weekdays:\n 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(\n '_'\n ),\n weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),\n weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'hh:mm A',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[leo saa] LT',\n nextDay: '[kesho saa] LT',\n nextWeek: '[wiki ijayo] dddd [saat] LT',\n lastDay: '[jana] LT',\n lastWeek: '[wiki iliyopita] dddd [saat] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s baadaye',\n past: 'tokea %s',\n s: 'hivi punde',\n ss: 'sekunde %d',\n m: 'dakika moja',\n mm: 'dakika %d',\n h: 'saa limoja',\n hh: 'masaa %d',\n d: 'siku moja',\n dd: 'siku %d',\n M: 'mwezi mmoja',\n MM: 'miezi %d',\n y: 'mwaka mmoja',\n yy: 'miaka %d',\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return sw;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA3NDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzPzc0ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFN3YWhpbGkgW3N3XVxuLy8hIGF1dGhvciA6IEZhaGFkIEthc3NpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWRzZWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N3Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY2hpX0FwcmlsaV9NZWlfSnVuaV9KdWxhaV9BZ29zdGlfU2VwdGVtYmFfT2t0b2JhX05vdmVtYmFfRGVzZW1iYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfQWdvX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnSnVtYXBpbGlfSnVtYXRhdHVfSnVtYW5uZV9KdW1hdGFub19BbGhhbWlzaV9JanVtYWFfSnVtYW1vc2knLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0pwbF9KdGF0X0pubmVfSnRhbl9BbGhfSWptX0ptb3MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnSjJfSjNfSjRfSjVfQWxfSWpfSjEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaGg6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2xlbyBzYWFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdba2VzaG8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1t3aWtpIGlqYXlvXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2phbmFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3dpa2kgaWxpeW9waXRhXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGJhYWRheWUnLFxuICAgICAgICAgICAgcGFzdDogJ3Rva2VhICVzJyxcbiAgICAgICAgICAgIHM6ICdoaXZpIHB1bmRlJyxcbiAgICAgICAgICAgIHNzOiAnc2VrdW5kZSAlZCcsXG4gICAgICAgICAgICBtOiAnZGFraWthIG1vamEnLFxuICAgICAgICAgICAgbW06ICdkYWtpa2EgJWQnLFxuICAgICAgICAgICAgaDogJ3NhYSBsaW1vamEnLFxuICAgICAgICAgICAgaGg6ICdtYXNhYSAlZCcsXG4gICAgICAgICAgICBkOiAnc2lrdSBtb2phJyxcbiAgICAgICAgICAgIGRkOiAnc2lrdSAlZCcsXG4gICAgICAgICAgICBNOiAnbXdlemkgbW1vamEnLFxuICAgICAgICAgICAgTU06ICdtaWV6aSAlZCcsXG4gICAgICAgICAgICB5OiAnbXdha2EgbW1vamEnLFxuICAgICAgICAgICAgeXk6ICdtaWFrYSAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40748\n")},40867:(I,g,n)=>{"use strict";I.exports=n.p+"57407c85fe0c8a9758b3.png"},40955:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(80754), __webpack_require__(84636), __webpack_require__(39506), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t var t;\n\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5NTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2Flcy5qcz9jMTk4Il0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9lbmMtYmFzZTY0XCIpLCByZXF1aXJlKFwiLi9tZDVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vZW5jLWJhc2U2NFwiLCBcIi4vbWQ1XCIsIFwiLi9ldnBrZGZcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIExvb2t1cCB0YWJsZXNcblx0ICAgIHZhciBTQk9YID0gW107XG5cdCAgICB2YXIgSU5WX1NCT1ggPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzAgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzEgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzIgPSBbXTtcblx0ICAgIHZhciBTVUJfTUlYXzMgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8wID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMSA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzIgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8zID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgbG9va3VwIHRhYmxlc1xuXHQgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBDb21wdXRlIGRvdWJsZSB0YWJsZVxuXHQgICAgICAgIHZhciBkID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHQgICAgICAgICAgICBpZiAoaSA8IDEyOCkge1xuXHQgICAgICAgICAgICAgICAgZFtpXSA9IGkgPDwgMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGRbaV0gPSAoaSA8PCAxKSBeIDB4MTFiO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgLy8gV2FsayBHRigyXjgpXG5cdCAgICAgICAgdmFyIHggPSAwO1xuXHQgICAgICAgIHZhciB4aSA9IDA7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHQgICAgICAgICAgICAvLyBDb21wdXRlIHNib3hcblx0ICAgICAgICAgICAgdmFyIHN4ID0geGkgXiAoeGkgPDwgMSkgXiAoeGkgPDwgMikgXiAoeGkgPDwgMykgXiAoeGkgPDwgNCk7XG5cdCAgICAgICAgICAgIHN4ID0gKHN4ID4+PiA4KSBeIChzeCAmIDB4ZmYpIF4gMHg2Mztcblx0ICAgICAgICAgICAgU0JPWFt4XSA9IHN4O1xuXHQgICAgICAgICAgICBJTlZfU0JPWFtzeF0gPSB4O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbXVsdGlwbGljYXRpb25cblx0ICAgICAgICAgICAgdmFyIHgyID0gZFt4XTtcblx0ICAgICAgICAgICAgdmFyIHg0ID0gZFt4Ml07XG5cdCAgICAgICAgICAgIHZhciB4OCA9IGRbeDRdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgc3ViIGJ5dGVzLCBtaXggY29sdW1ucyB0YWJsZXNcblx0ICAgICAgICAgICAgdmFyIHQgPSAoZFtzeF0gKiAweDEwMSkgXiAoc3ggKiAweDEwMTAxMDApO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzBbeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMVt4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMlt4XSA9ICh0IDw8IDgpICB8ICh0ID4+PiAyNCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfM1t4XSA9IHQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnYgc3ViIGJ5dGVzLCBpbnYgbWl4IGNvbHVtbnMgdGFibGVzXG5cdCAgICAgICAgICAgIHZhciB0ID0gKHg4ICogMHgxMDEwMTAxKSBeICh4NCAqIDB4MTAwMDEpIF4gKHgyICogMHgxMDEpIF4gKHggKiAweDEwMTAxMDApO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8wW3N4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMVtzeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8yW3N4XSA9ICh0IDw8IDgpICB8ICh0ID4+PiAyNCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzNbc3hdID0gdDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgY291bnRlclxuXHQgICAgICAgICAgICBpZiAoIXgpIHtcblx0ICAgICAgICAgICAgICAgIHggPSB4aSA9IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB4ID0geDIgXiBkW2RbZFt4OCBeIHgyXV1dO1xuXHQgICAgICAgICAgICAgICAgeGkgXj0gZFtkW3hpXV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvLyBQcmVjb21wdXRlZCBSY29uIGxvb2t1cFxuXHQgICAgdmFyIFJDT04gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNl07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQUVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBBRVMgPSBDX2FsZ28uQUVTID0gQmxvY2tDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgdDtcblxuXHQgICAgICAgICAgICAvLyBTa2lwIHJlc2V0IG9mIG5Sb3VuZHMgaGFzIGJlZW4gc2V0IGJlZm9yZSBhbmQga2V5IGRpZCBub3QgY2hhbmdlXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9uUm91bmRzICYmIHRoaXMuX2tleVByaW9yUmVzZXQgPT09IHRoaXMuX2tleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXlQcmlvclJlc2V0ID0gdGhpcy5fa2V5O1xuXHQgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0ga2V5LnNpZ0J5dGVzIC8gNDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiByb3VuZHNcblx0ICAgICAgICAgICAgdmFyIG5Sb3VuZHMgPSB0aGlzLl9uUm91bmRzID0ga2V5U2l6ZSArIDY7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Yga2V5IHNjaGVkdWxlIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIGtzUm93cyA9IChuUm91bmRzICsgMSkgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUga2V5IHNjaGVkdWxlXG5cdCAgICAgICAgICAgIHZhciBrZXlTY2hlZHVsZSA9IHRoaXMuX2tleVNjaGVkdWxlID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGtzUm93ID0gMDsga3NSb3cgPCBrc1Jvd3M7IGtzUm93KyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChrc1JvdyA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlXb3Jkc1trc1Jvd107XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDFdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCEoa3NSb3cgJSBrZXlTaXplKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3Qgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPDwgOCkgfCAodCA+Pj4gMjQpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFt0ICYgMHhmZl07XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWl4IFJjb25cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCBePSBSQ09OWyhrc1JvdyAvIGtleVNpemUpIHwgMF0gPDwgMjQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlTaXplID4gNiAmJiBrc1JvdyAlIGtleVNpemUgPT0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbdCAmIDB4ZmZdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgICAgIGtleVNjaGVkdWxlW2tzUm93XSA9IGtleVNjaGVkdWxlW2tzUm93IC0ga2V5U2l6ZV0gXiB0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBpbnYga2V5IHNjaGVkdWxlXG5cdCAgICAgICAgICAgIHZhciBpbnZLZXlTY2hlZHVsZSA9IHRoaXMuX2ludktleVNjaGVkdWxlID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGludktzUm93ID0gMDsgaW52S3NSb3cgPCBrc1Jvd3M7IGludktzUm93KyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBrc1JvdyA9IGtzUm93cyAtIGludktzUm93O1xuXG5cdCAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1Jvd107XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3cgLSA0XTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgaWYgKGludktzUm93IDwgNCB8fCBrc1JvdyA8PSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW52S2V5U2NoZWR1bGVbaW52S3NSb3ddID0gdDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW52S2V5U2NoZWR1bGVbaW52S3NSb3ddID0gSU5WX1NVQl9NSVhfMFtTQk9YW3QgPj4+IDI0XV0gXiBJTlZfU1VCX01JWF8xW1NCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdXSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WX1NVQl9NSVhfMltTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdXSBeIElOVl9TVUJfTUlYXzNbU0JPWFt0ICYgMHhmZl1dO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9rZXlTY2hlZHVsZSwgU1VCX01JWF8wLCBTVUJfTUlYXzEsIFNVQl9NSVhfMiwgU1VCX01JWF8zLCBTQk9YKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFN3YXAgMm5kIGFuZCA0dGggcm93c1xuXHQgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDtcblxuXHQgICAgICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9pbnZLZXlTY2hlZHVsZSwgSU5WX1NVQl9NSVhfMCwgSU5WX1NVQl9NSVhfMSwgSU5WX1NVQl9NSVhfMiwgSU5WX1NVQl9NSVhfMywgSU5WX1NCT1gpO1xuXG5cdCAgICAgICAgICAgIC8vIEludiBzd2FwIDJuZCBhbmQgNHRoIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIHQgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0NyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQsIGtleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIG5Sb3VuZHMgPSB0aGlzLl9uUm91bmRzO1xuXG5cdCAgICAgICAgICAgIC8vIEdldCBpbnB1dCwgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICB2YXIgczAgPSBNW29mZnNldF0gICAgIF4ga2V5U2NoZWR1bGVbMF07XG5cdCAgICAgICAgICAgIHZhciBzMSA9IE1bb2Zmc2V0ICsgMV0gXiBrZXlTY2hlZHVsZVsxXTtcblx0ICAgICAgICAgICAgdmFyIHMyID0gTVtvZmZzZXQgKyAyXSBeIGtleVNjaGVkdWxlWzJdO1xuXHQgICAgICAgICAgICB2YXIgczMgPSBNW29mZnNldCArIDNdIF4ga2V5U2NoZWR1bGVbM107XG5cblx0ICAgICAgICAgICAgLy8gS2V5IHNjaGVkdWxlIHJvdyBjb3VudGVyXG5cdCAgICAgICAgICAgIHZhciBrc1JvdyA9IDQ7XG5cblx0ICAgICAgICAgICAgLy8gUm91bmRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIHJvdW5kID0gMTsgcm91bmQgPCBuUm91bmRzOyByb3VuZCsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaGlmdCByb3dzLCBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zLCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgICAgICB2YXIgdDAgPSBTVUJfTUlYXzBbczAgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczEgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMiA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMyAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDEgPSBTVUJfTUlYXzBbczEgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczIgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMyA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMCAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDIgPSBTVUJfTUlYXzBbczIgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczMgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMCA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMSAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgICAgICB2YXIgdDMgPSBTVUJfTUlYXzBbczMgPj4+IDI0XSBeIFNVQl9NSVhfMVsoczAgPj4+IDE2KSAmIDB4ZmZdIF4gU1VCX01JWF8yWyhzMSA+Pj4gOCkgJiAweGZmXSBeIFNVQl9NSVhfM1tzMiAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cblx0ICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZVxuXHQgICAgICAgICAgICAgICAgczAgPSB0MDtcblx0ICAgICAgICAgICAgICAgIHMxID0gdDE7XG5cdCAgICAgICAgICAgICAgICBzMiA9IHQyO1xuXHQgICAgICAgICAgICAgICAgczMgPSB0Mztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICB2YXIgdDAgPSAoKFNCT1hbczAgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczEgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMiA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczMgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQxID0gKChTQk9YW3MxID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMyID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczMgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MwICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MiA9ICgoU0JPWFtzMiA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMyA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMwID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMSAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDMgPSAoKFNCT1hbczMgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczAgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMSA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczIgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgb3V0cHV0XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0XSAgICAgPSB0MDtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IHQxO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDJdID0gdDI7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0Mztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAga2V5U2l6ZTogMjU2LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7XG5cdCAgICAgKi9cblx0ICAgIEMuQUVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihBRVMpO1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLkFFUztcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40955\n")},40961:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (false) // removed by dead control flow\n{}\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (true) {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = __webpack_require__(22551);\n} else // removed by dead control flow\n{}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5NjEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcz84YmM4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40961\n")},41011:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Swedish [sv]\n//! author : Jens Alm : https://github.com/ulmus\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var sv = moment.defineLocale('sv', {\n months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(\n '_'\n ),\n monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),\n weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),\n weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY [kl.] HH:mm',\n LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',\n lll: 'D MMM YYYY HH:mm',\n llll: 'ddd D MMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Idag] LT',\n nextDay: '[Imorgon] LT',\n lastDay: '[Igår] LT',\n nextWeek: '[På] dddd LT',\n lastWeek: '[I] dddd[s] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'om %s',\n past: 'för %s sedan',\n s: 'några sekunder',\n ss: '%d sekunder',\n m: 'en minut',\n mm: '%d minuter',\n h: 'en timme',\n hh: '%d timmar',\n d: 'en dag',\n dd: '%d dagar',\n M: 'en månad',\n MM: '%d månader',\n y: 'ett år',\n yy: '%d år',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(\\:e|\\:a)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? ':e'\n : b === 1\n ? ':a'\n : b === 2\n ? ':a'\n : b === 3\n ? ':e'\n : ':e';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return sv;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEwMTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3YuanM/NWZiZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3dlZGlzaCBbc3ZdXG4vLyEgYXV0aG9yIDogSmVucyBBbG0gOiBodHRwczovL2dpdGh1Yi5jb20vdWxtdXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N2Jywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hcnNfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3RpX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ3PDtm5kYWdfbcOlbmRhZ190aXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDtnJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7ZuX23DpW5fdGlzX29uc190b3JfZnJlX2zDtnInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O2X23DpV90aV9vbl90b19mcl9sw7YnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJZGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ltb3Jnb25dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWfDpXJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW1DDpV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tJXSBkZGRkW3NdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2bDtnIgJXMgc2VkYW4nLFxuICAgICAgICAgICAgczogJ27DpWdyYSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdlbiBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXInLFxuICAgICAgICAgICAgaDogJ2VuIHRpbW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNOiAnZW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oXFw6ZXxcXDphKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJzphJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnOmUnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN2O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41011\n")},41488:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic (Algeria) [ar-dz]\n//! author : Amine Roukh: https://github.com/Amine27\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var pluralForm = function (n) {\n return n === 0\n ? 0\n : n === 1\n ? 1\n : n === 2\n ? 2\n : n % 100 >= 3 && n % 100 <= 10\n ? 3\n : n % 100 >= 11\n ? 4\n : 5;\n },\n plurals = {\n s: [\n 'أقل من ثانية',\n 'ثانية واحدة',\n ['ثانيتان', 'ثانيتين'],\n '%d ثوان',\n '%d ثانية',\n '%d ثانية',\n ],\n m: [\n 'أقل من دقيقة',\n 'دقيقة واحدة',\n ['دقيقتان', 'دقيقتين'],\n '%d دقائق',\n '%d دقيقة',\n '%d دقيقة',\n ],\n h: [\n 'أقل من ساعة',\n 'ساعة واحدة',\n ['ساعتان', 'ساعتين'],\n '%d ساعات',\n '%d ساعة',\n '%d ساعة',\n ],\n d: [\n 'أقل من يوم',\n 'يوم واحد',\n ['يومان', 'يومين'],\n '%d أيام',\n '%d يومًا',\n '%d يوم',\n ],\n M: [\n 'أقل من شهر',\n 'شهر واحد',\n ['شهران', 'شهرين'],\n '%d أشهر',\n '%d شهرا',\n '%d شهر',\n ],\n y: [\n 'أقل من عام',\n 'عام واحد',\n ['عامان', 'عامين'],\n '%d أعوام',\n '%d عامًا',\n '%d عام',\n ],\n },\n pluralize = function (u) {\n return function (number, withoutSuffix, string, isFuture) {\n var f = pluralForm(number),\n str = plurals[u][pluralForm(number)];\n if (f === 2) {\n str = str[withoutSuffix ? 0 : 1];\n }\n return str.replace(/%d/i, number);\n };\n },\n months = [\n 'جانفي',\n 'فيفري',\n 'مارس',\n 'أفريل',\n 'ماي',\n 'جوان',\n 'جويلية',\n 'أوت',\n 'سبتمبر',\n 'أكتوبر',\n 'نوفمبر',\n 'ديسمبر',\n ];\n\n var arDz = moment.defineLocale('ar-dz', {\n months: months,\n monthsShort: months,\n weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'D/\\u200FM/\\u200FYYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /ص|م/,\n isPM: function (input) {\n return 'م' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ص';\n } else {\n return 'م';\n }\n },\n calendar: {\n sameDay: '[اليوم عند الساعة] LT',\n nextDay: '[غدًا عند الساعة] LT',\n nextWeek: 'dddd [عند الساعة] LT',\n lastDay: '[أمس عند الساعة] LT',\n lastWeek: 'dddd [عند الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'بعد %s',\n past: 'منذ %s',\n s: pluralize('s'),\n ss: pluralize('s'),\n m: pluralize('m'),\n mm: pluralize('m'),\n h: pluralize('h'),\n hh: pluralize('h'),\n d: pluralize('d'),\n dd: pluralize('d'),\n M: pluralize('M'),\n MM: pluralize('M'),\n y: pluralize('y'),\n yy: pluralize('y'),\n },\n postformat: function (string) {\n return string.replace(/,/g, '،');\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return arDz;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0ODguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qcz9hMzU2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKEFsZ2VyaWEpIFthci1kel1cbi8vISBhdXRob3IgOiBBbWluZSBSb3VraDogaHR0cHM6Ly9naXRodWIuY29tL0FtaW5lMjdcbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG4vLyEgYXV0aG9yIDogQWhtZWQgRWxraGF0aWJcbi8vISBhdXRob3IgOiBmb3JhYmkgaHR0cHM6Ly9naXRodWIuY29tL2ZvcmFiaVxuLy8hIGF1dGhvciA6IE5vdXJlZGRpbmUgTE9VQUhFREogOiBodHRwczovL2dpdGh1Yi5jb20vbm91cmVkZGluZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzYp9mG2YHZiicsXG4gICAgICAgICAgICAn2YHZitmB2LHZiicsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2YHYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZiicsXG4gICAgICAgICAgICAn2KzZiNin2YYnLFxuICAgICAgICAgICAgJ9is2YjZitmE2YrYqScsXG4gICAgICAgICAgICAn2KPZiNiqJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyRHogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1keicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJEejtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///41488\n")},41683:(I,g,n)=>{"use strict";I.exports=n.p+"06528db53c95240f3c51.png"},41734:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Irish or Irish Gaelic [ga]\n//! author : André Silva : https://github.com/askpt\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = [\n 'Eanáir',\n 'Feabhra',\n 'Márta',\n 'Aibreán',\n 'Bealtaine',\n 'Meitheamh',\n 'Iúil',\n 'Lúnasa',\n 'Meán Fómhair',\n 'Deireadh Fómhair',\n 'Samhain',\n 'Nollaig',\n ],\n monthsShort = [\n 'Ean',\n 'Feabh',\n 'Márt',\n 'Aib',\n 'Beal',\n 'Meith',\n 'Iúil',\n 'Lún',\n 'M.F.',\n 'D.F.',\n 'Samh',\n 'Noll',\n ],\n weekdays = [\n 'Dé Domhnaigh',\n 'Dé Luain',\n 'Dé Máirt',\n 'Dé Céadaoin',\n 'Déardaoin',\n 'Dé hAoine',\n 'Dé Sathairn',\n ],\n weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];\n\n var ga = moment.defineLocale('ga', {\n months: months,\n monthsShort: monthsShort,\n monthsParseExact: true,\n weekdays: weekdays,\n weekdaysShort: weekdaysShort,\n weekdaysMin: weekdaysMin,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Inniu ag] LT',\n nextDay: '[Amárach ag] LT',\n nextWeek: 'dddd [ag] LT',\n lastDay: '[Inné ag] LT',\n lastWeek: 'dddd [seo caite] [ag] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'i %s',\n past: '%s ó shin',\n s: 'cúpla soicind',\n ss: '%d soicind',\n m: 'nóiméad',\n mm: '%d nóiméad',\n h: 'uair an chloig',\n hh: '%d uair an chloig',\n d: 'lá',\n dd: '%d lá',\n M: 'mí',\n MM: '%d míonna',\n y: 'bliain',\n yy: '%d bliain',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n ordinal: function (number) {\n var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return ga;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE3MzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanM/NTEyMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXJpc2ggb3IgSXJpc2ggR2FlbGljIFtnYV1cbi8vISBhdXRob3IgOiBBbmRyw6kgU2lsdmEgOiBodHRwczovL2dpdGh1Yi5jb20vYXNrcHRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAnRWFuw6FpcicsXG4gICAgICAgICAgICAnRmVhYmhyYScsXG4gICAgICAgICAgICAnTcOhcnRhJyxcbiAgICAgICAgICAgICdBaWJyZcOhbicsXG4gICAgICAgICAgICAnQmVhbHRhaW5lJyxcbiAgICAgICAgICAgICdNZWl0aGVhbWgnLFxuICAgICAgICAgICAgJ0nDumlsJyxcbiAgICAgICAgICAgICdMw7puYXNhJyxcbiAgICAgICAgICAgICdNZcOhbiBGw7NtaGFpcicsXG4gICAgICAgICAgICAnRGVpcmVhZGggRsOzbWhhaXInLFxuICAgICAgICAgICAgJ1NhbWhhaW4nLFxuICAgICAgICAgICAgJ05vbGxhaWcnLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNTaG9ydCA9IFtcbiAgICAgICAgICAgICdFYW4nLFxuICAgICAgICAgICAgJ0ZlYWJoJyxcbiAgICAgICAgICAgICdNw6FydCcsXG4gICAgICAgICAgICAnQWliJyxcbiAgICAgICAgICAgICdCZWFsJyxcbiAgICAgICAgICAgICdNZWl0aCcsXG4gICAgICAgICAgICAnScO6aWwnLFxuICAgICAgICAgICAgJ0zDum4nLFxuICAgICAgICAgICAgJ00uRi4nLFxuICAgICAgICAgICAgJ0QuRi4nLFxuICAgICAgICAgICAgJ1NhbWgnLFxuICAgICAgICAgICAgJ05vbGwnLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5cyA9IFtcbiAgICAgICAgICAgICdEw6kgRG9taG5haWdoJyxcbiAgICAgICAgICAgICdEw6kgTHVhaW4nLFxuICAgICAgICAgICAgJ0TDqSBNw6FpcnQnLFxuICAgICAgICAgICAgJ0TDqSBDw6lhZGFvaW4nLFxuICAgICAgICAgICAgJ0TDqWFyZGFvaW4nLFxuICAgICAgICAgICAgJ0TDqSBoQW9pbmUnLFxuICAgICAgICAgICAgJ0TDqSBTYXRoYWlybicsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgPSBbJ0RvbWgnLCAnTHVhbicsICdNw6FpcnQnLCAnQ8OpYWQnLCAnRMOpYXInLCAnQW9pbmUnLCAnU2F0aCddLFxuICAgICAgICB3ZWVrZGF5c01pbiA9IFsnRG8nLCAnTHUnLCAnTcOhJywgJ0PDqScsICdEw6knLCAnQScsICdTYSddO1xuXG4gICAgdmFyIGdhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2EnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXNTaG9ydCxcbiAgICAgICAgd2Vla2RheXNNaW46IHdlZWtkYXlzTWluLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0lubml1IGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Ftw6FyYWNoIGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lubsOpIGFnXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3NlbyBjYWl0ZV0gW2FnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2kgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOzIHNoaW4nLFxuICAgICAgICAgICAgczogJ2PDunBsYSBzb2ljaW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc29pY2luZCcsXG4gICAgICAgICAgICBtOiAnbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIGg6ICd1YWlyIGFuIGNobG9pZycsXG4gICAgICAgICAgICBoaDogJyVkIHVhaXIgYW4gY2hsb2lnJyxcbiAgICAgICAgICAgIGQ6ICdsw6EnLFxuICAgICAgICAgICAgZGQ6ICclZCBsw6EnLFxuICAgICAgICAgICAgTTogJ23DrScsXG4gICAgICAgICAgICBNTTogJyVkIG3DrW9ubmEnLFxuICAgICAgICAgICAgeTogJ2JsaWFpbicsXG4gICAgICAgICAgICB5eTogJyVkIGJsaWFpbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShkfG5hfG1oKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnZCcgOiBudW1iZXIgJSAxMCA9PT0gMiA/ICduYScgOiAnbWgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdhO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41734\n")},41794:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Georgian [ka]\n//! author : Irakli Janiashvili : https://github.com/IrakliJani\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ka = moment.defineLocale('ka', {\n months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(\n '_'\n ),\n monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),\n weekdays: {\n standalone:\n 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(\n '_'\n ),\n format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(\n '_'\n ),\n isFormat: /(წინა|შემდეგ)/,\n },\n weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),\n weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[დღეს] LT[-ზე]',\n nextDay: '[ხვალ] LT[-ზე]',\n lastDay: '[გუშინ] LT[-ზე]',\n nextWeek: '[შემდეგ] dddd LT[-ზე]',\n lastWeek: '[წინა] dddd LT-ზე',\n sameElse: 'L',\n },\n relativeTime: {\n future: function (s) {\n return s.replace(\n /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,\n function ($0, $1, $2) {\n return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';\n }\n );\n },\n past: function (s) {\n if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {\n return s.replace(/(ი|ე)$/, 'ის წინ');\n }\n if (/წელი/.test(s)) {\n return s.replace(/წელი$/, 'წლის წინ');\n }\n return s;\n },\n s: 'რამდენიმე წამი',\n ss: '%d წამი',\n m: 'წუთი',\n mm: '%d წუთი',\n h: 'საათი',\n hh: '%d საათი',\n d: 'დღე',\n dd: '%d დღე',\n M: 'თვე',\n MM: '%d თვე',\n y: 'წელი',\n yy: '%d წელი',\n },\n dayOfMonthOrdinalParse: /0|1-ლი|მე-\\d{1,2}|\\d{1,2}-ე/,\n ordinal: function (number) {\n if (number === 0) {\n return number;\n }\n if (number === 1) {\n return number + '-ლი';\n }\n if (\n number < 20 ||\n (number <= 100 && number % 20 === 0) ||\n number % 100 === 0\n ) {\n return 'მე-' + number;\n }\n return number + '-ე';\n },\n week: {\n dow: 1,\n doy: 7,\n },\n });\n\n return ka;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE3OTQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2EuanM/MjAxYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VvcmdpYW4gW2thXVxuLy8hIGF1dGhvciA6IElyYWtsaSBKYW5pYXNodmlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmFrbGlKYW5pXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrYScsIHtcbiAgICAgICAgbW9udGhzOiAn4YOY4YOQ4YOc4YOV4YOQ4YOg4YOYX+GDl+GDlOGDkeGDlOGDoOGDleGDkOGDmuGDmF/hg5vhg5Dhg6Dhg6Lhg5hf4YOQ4YOe4YOg4YOY4YOa4YOYX+GDm+GDkOGDmOGDoeGDmF/hg5jhg5Xhg5zhg5jhg6Hhg5hf4YOY4YOV4YOa4YOY4YOh4YOYX+GDkOGDkuGDleGDmOGDoeGDouGDnV/hg6Hhg5Thg6Xhg6Lhg5Thg5vhg5Hhg5Thg6Dhg5hf4YOd4YOl4YOi4YOd4YOb4YOR4YOU4YOg4YOYX+GDnOGDneGDlOGDm+GDkeGDlOGDoOGDmF/hg5Phg5Thg5nhg5Thg5vhg5Hhg5Thg6Dhg5gnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4YOY4YOQ4YOcX+GDl+GDlOGDkV/hg5vhg5Dhg6Bf4YOQ4YOe4YOgX+GDm+GDkOGDmF/hg5jhg5Xhg5xf4YOY4YOV4YOaX+GDkOGDkuGDlV/hg6Hhg5Thg6Vf4YOd4YOl4YOiX+GDnOGDneGDlF/hg5Phg5Thg5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfhg5nhg5Xhg5jhg6Dhg5Bf4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDmF/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDmF/hg6jhg5Dhg5Hhg5Dhg5fhg5gnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn4YOZ4YOV4YOY4YOg4YOQ4YOhX+GDneGDoOGDqOGDkOGDkeGDkOGDl+GDoV/hg6Hhg5Dhg5vhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOd4YOX4YOu4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDruGDo+GDl+GDqOGDkOGDkeGDkOGDl+GDoV/hg57hg5Dhg6Dhg5Dhg6Hhg5nhg5Thg5Xhg6Ff4YOo4YOQ4YOR4YOQ4YOX4YOhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogLyjhg6zhg5jhg5zhg5B84YOo4YOU4YOb4YOT4YOU4YOSKS8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhg5nhg5Xhg5hf4YOd4YOg4YOoX+GDoeGDkOGDm1/hg53hg5fhg65f4YOu4YOj4YOXX+GDnuGDkOGDoF/hg6jhg5Dhg5EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4YOZ4YOVX+GDneGDoF/hg6Hhg5Bf4YOd4YOXX+GDruGDo1/hg57hg5Bf4YOo4YOQJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GDk+GDpuGDlOGDoV0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhg67hg5Xhg5Dhg5pdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4YOS4YOj4YOo4YOY4YOcXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vhg6jhg5Thg5vhg5Phg5Thg5JdIGRkZGQgTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4YOs4YOY4YOc4YOQXSBkZGRkIExULeGDluGDlCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKOGDrOGDkOGDm3zhg6zhg6Phg5d84YOh4YOQ4YOQ4YOXfOGDrOGDlOGDmnzhg5Phg6Z84YOX4YOVKSjhg5h84YOUKS8sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJDIgPT09ICfhg5gnID8gJDEgKyAn4YOo4YOYJyA6ICQxICsgJDIgKyAn4YOo4YOYJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoLyjhg6zhg5Dhg5vhg5h84YOs4YOj4YOX4YOYfOGDoeGDkOGDkOGDl+GDmHzhg5Phg6bhg5R84YOX4YOV4YOUKS8udGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC8o4YOYfOGDlCkkLywgJ+GDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKC/hg6zhg5Thg5rhg5gvLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgv4YOs4YOU4YOa4YOYJC8sICfhg6zhg5rhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHM6ICfhg6Dhg5Dhg5vhg5Phg5Thg5zhg5jhg5vhg5Qg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIG06ICfhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgbW06ICclZCDhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgaDogJ+GDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBoaDogJyVkIOGDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBkOiAn4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIE06ICfhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgTU06ICclZCDhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgeTogJ+GDrOGDlOGDmuGDmCcsXG4gICAgICAgICAgICB5eTogJyVkIOGDrOGDlOGDmuGDmCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8wfDEt4YOa4YOYfOGDm+GDlC1cXGR7MSwyfXxcXGR7MSwyfS3hg5QvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5rhg5gnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciA8IDIwIHx8XG4gICAgICAgICAgICAgICAgKG51bWJlciA8PSAxMDAgJiYgbnVtYmVyICUgMjAgPT09IDApIHx8XG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+GDm+GDlC0nICsgbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct4YOUJztcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLFxuICAgICAgICAgICAgZG95OiA3LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGthO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41794\n")},41848:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Maori [mi]\n//! author : John Corrigan : https://github.com/johnideal\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var mi = moment.defineLocale('mi', {\n months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(\n '_'\n ),\n monthsShort:\n 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(\n '_'\n ),\n monthsRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n monthsStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n monthsShortRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,3}/i,\n monthsShortStrictRegex: /(?:['a-z\\u0101\\u014D\\u016B]+\\-?){1,2}/i,\n weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),\n weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY [i] HH:mm',\n LLLL: 'dddd, D MMMM YYYY [i] HH:mm',\n },\n calendar: {\n sameDay: '[i teie mahana, i] LT',\n nextDay: '[apopo i] LT',\n nextWeek: 'dddd [i] LT',\n lastDay: '[inanahi i] LT',\n lastWeek: 'dddd [whakamutunga i] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'i roto i %s',\n past: '%s i mua',\n s: 'te hēkona ruarua',\n ss: '%d hēkona',\n m: 'he meneti',\n mm: '%d meneti',\n h: 'te haora',\n hh: '%d haora',\n d: 'he ra',\n dd: '%d ra',\n M: 'he marama',\n MM: '%d marama',\n y: 'he tau',\n yy: '%d tau',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return mi;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE4NDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qcz82ODhiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYW9yaSBbbWldXG4vLyEgYXV0aG9yIDogSm9obiBDb3JyaWdhbiA8cm9iYmllY2xvc2V0QGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vam9obmlkZWFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtaScsIHtcbiAgICAgICAgbW9udGhzOiAnS29oaS10xIF0ZV9IdWktdGFuZ3VydV9Qb3V0xastdGUtcmFuZ2lfUGFlbmdhLXdoxIF3aMSBX0hhcmF0dWFfUGlwaXJpX0jFjW5nb2luZ29pX0hlcmUtdHVyaS1rxY1rxIFfTWFodXJ1X1doaXJpbmdhLcSBLW51a3VfV2hpcmluZ2EtxIEtcmFuZ2lfSGFraWhlYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnS29oaV9IdWlfUG91X1BhZV9IYXJhX1BpcGlfSMWNbmdvaV9IZXJlX01haHVfV2hpLW51X1doaS1yYV9IYWtpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1JlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDJ9L2ksXG4gICAgICAgIHdlZWtkYXlzOiAnUsSBdGFwdV9NYW5lX1TFq3JlaV9XZW5lcmVpX1TEgWl0ZV9QYXJhaXJlX0jEgXRhcmVpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1RhX01hX1TFq19XZV9UxIFpX1BhX0jEgScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbaV0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgdGVpZSBtYWhhbmEsIGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbYXBvcG8gaV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2luYW5haGkgaV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt3aGFrYW11dHVuZ2EgaV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpIHJvdG8gaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaSBtdWEnLFxuICAgICAgICAgICAgczogJ3RlIGjEk2tvbmEgcnVhcnVhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaMSTa29uYScsXG4gICAgICAgICAgICBtOiAnaGUgbWVuZXRpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuZXRpJyxcbiAgICAgICAgICAgIGg6ICd0ZSBoYW9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhhb3JhJyxcbiAgICAgICAgICAgIGQ6ICdoZSByYScsXG4gICAgICAgICAgICBkZDogJyVkIHJhJyxcbiAgICAgICAgICAgIE06ICdoZSBtYXJhbWEnLFxuICAgICAgICAgICAgTU06ICclZCBtYXJhbWEnLFxuICAgICAgICAgICAgeTogJ2hlIHRhdScsXG4gICAgICAgICAgICB5eTogJyVkIHRhdScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWk7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///41848\n")},42030:(I,g,n)=>{"use strict";I.exports=n.p+"8a79397df054f6fa0a2f.png"},42073:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t pad: function (data, blockSize) {\n\t // Shortcuts\n\t var dataSigBytes = data.sigBytes;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t // Compute last byte position\n\t var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t // Pad\n\t data.clamp();\n\t data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t data.sigBytes += nPaddingBytes;\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIwNzMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvcGFkLWFuc2l4OTIzLmpzP2E4MTciXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2NpcGhlci1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQvKipcblx0ICogQU5TSSBYLjkyMyBwYWRkaW5nIHN0cmF0ZWd5LlxuXHQgKi9cblx0Q3J5cHRvSlMucGFkLkFuc2lYOTIzID0ge1xuXHQgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgdmFyIGRhdGFTaWdCeXRlcyA9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXNcblx0ICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YVNpZ0J5dGVzICUgYmxvY2tTaXplQnl0ZXM7XG5cblx0ICAgICAgICAvLyBDb21wdXRlIGxhc3QgYnl0ZSBwb3NpdGlvblxuXHQgICAgICAgIHZhciBsYXN0Qnl0ZVBvcyA9IGRhdGFTaWdCeXRlcyArIG5QYWRkaW5nQnl0ZXMgLSAxO1xuXG5cdCAgICAgICAgLy8gUGFkXG5cdCAgICAgICAgZGF0YS5jbGFtcCgpO1xuXHQgICAgICAgIGRhdGEud29yZHNbbGFzdEJ5dGVQb3MgPj4+IDJdIHw9IG5QYWRkaW5nQnl0ZXMgPDwgKDI0IC0gKGxhc3RCeXRlUG9zICUgNCkgKiA4KTtcblx0ICAgICAgICBkYXRhLnNpZ0J5dGVzICs9IG5QYWRkaW5nQnl0ZXM7XG5cdCAgICB9LFxuXG5cdCAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZnJvbSBsYXN0IGJ5dGVcblx0ICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGRhdGEud29yZHNbKGRhdGEuc2lnQnl0ZXMgLSAxKSA+Pj4gMl0gJiAweGZmO1xuXG5cdCAgICAgICAgLy8gUmVtb3ZlIHBhZGRpbmdcblx0ICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5QYWRkaW5nQnl0ZXM7XG5cdCAgICB9XG5cdH07XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMucGFkLkFuc2l4OTIzO1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///42073\n")},42353:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic (Libya) [ar-ly]\n//! author : Ali Hmer: https://github.com/kikoanis\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '1',\n 2: '2',\n 3: '3',\n 4: '4',\n 5: '5',\n 6: '6',\n 7: '7',\n 8: '8',\n 9: '9',\n 0: '0',\n },\n pluralForm = function (n) {\n return n === 0\n ? 0\n : n === 1\n ? 1\n : n === 2\n ? 2\n : n % 100 >= 3 && n % 100 <= 10\n ? 3\n : n % 100 >= 11\n ? 4\n : 5;\n },\n plurals = {\n s: [\n 'أقل من ثانية',\n 'ثانية واحدة',\n ['ثانيتان', 'ثانيتين'],\n '%d ثوان',\n '%d ثانية',\n '%d ثانية',\n ],\n m: [\n 'أقل من دقيقة',\n 'دقيقة واحدة',\n ['دقيقتان', 'دقيقتين'],\n '%d دقائق',\n '%d دقيقة',\n '%d دقيقة',\n ],\n h: [\n 'أقل من ساعة',\n 'ساعة واحدة',\n ['ساعتان', 'ساعتين'],\n '%d ساعات',\n '%d ساعة',\n '%d ساعة',\n ],\n d: [\n 'أقل من يوم',\n 'يوم واحد',\n ['يومان', 'يومين'],\n '%d أيام',\n '%d يومًا',\n '%d يوم',\n ],\n M: [\n 'أقل من شهر',\n 'شهر واحد',\n ['شهران', 'شهرين'],\n '%d أشهر',\n '%d شهرا',\n '%d شهر',\n ],\n y: [\n 'أقل من عام',\n 'عام واحد',\n ['عامان', 'عامين'],\n '%d أعوام',\n '%d عامًا',\n '%d عام',\n ],\n },\n pluralize = function (u) {\n return function (number, withoutSuffix, string, isFuture) {\n var f = pluralForm(number),\n str = plurals[u][pluralForm(number)];\n if (f === 2) {\n str = str[withoutSuffix ? 0 : 1];\n }\n return str.replace(/%d/i, number);\n };\n },\n months = [\n 'يناير',\n 'فبراير',\n 'مارس',\n 'أبريل',\n 'مايو',\n 'يونيو',\n 'يوليو',\n 'أغسطس',\n 'سبتمبر',\n 'أكتوبر',\n 'نوفمبر',\n 'ديسمبر',\n ];\n\n var arLy = moment.defineLocale('ar-ly', {\n months: months,\n monthsShort: months,\n weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'D/\\u200FM/\\u200FYYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /ص|م/,\n isPM: function (input) {\n return 'م' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ص';\n } else {\n return 'م';\n }\n },\n calendar: {\n sameDay: '[اليوم عند الساعة] LT',\n nextDay: '[غدًا عند الساعة] LT',\n nextWeek: 'dddd [عند الساعة] LT',\n lastDay: '[أمس عند الساعة] LT',\n lastWeek: 'dddd [عند الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'بعد %s',\n past: 'منذ %s',\n s: pluralize('s'),\n ss: pluralize('s'),\n m: pluralize('m'),\n mm: pluralize('m'),\n h: pluralize('h'),\n hh: pluralize('h'),\n d: pluralize('d'),\n dd: pluralize('d'),\n M: pluralize('M'),\n MM: pluralize('M'),\n y: pluralize('y'),\n yy: pluralize('y'),\n },\n preparse: function (string) {\n return string.replace(/،/g, ',');\n },\n postformat: function (string) {\n return string\n .replace(/\\d/g, function (match) {\n return symbolMap[match];\n })\n .replace(/,/g, '،');\n },\n week: {\n dow: 6, // Saturday is the first day of the week.\n doy: 12, // The week that contains Jan 12th is the first week of the year.\n },\n });\n\n return arLy;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIzNTMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qcz8xY2ZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKExpYnlhKSBbYXItbHldXG4vLyEgYXV0aG9yIDogQWxpIEhtZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9raWtvYW5pc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAgIDI6ICcyJyxcbiAgICAgICAgICAgIDM6ICczJyxcbiAgICAgICAgICAgIDQ6ICc0JyxcbiAgICAgICAgICAgIDU6ICc1JyxcbiAgICAgICAgICAgIDY6ICc2JyxcbiAgICAgICAgICAgIDc6ICc3JyxcbiAgICAgICAgICAgIDg6ICc4JyxcbiAgICAgICAgICAgIDk6ICc5JyxcbiAgICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAgICAgJ9mB2KjYsdin2YrYsScsXG4gICAgICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KfZitmIJyxcbiAgICAgICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgICAgICfYo9i62LPYt9izJyxcbiAgICAgICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICAgICAn2YbZiNmB2YXYqNixJyxcbiAgICAgICAgICAgICfYr9mK2LPZhdio2LEnLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGFyTHkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1seScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJMeTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///42353\n")},42547:(I,g,n)=>{"use strict";I.exports=n.p+"d2f36cffe0f8bb32174c.png"},42767:(I,g,n)=>{"use strict";I.exports=n.p+"5ebb0e2637af665e59a8.png"},43004:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (Singapore) [en-sg]\n//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enSg = moment.defineLocale('en-sg', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return enSg;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMwMDQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanM/YjdlOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoU2luZ2Fwb3JlKSBbZW4tc2ddXG4vLyEgYXV0aG9yIDogTWF0dGhldyBDYXN0cmlsbG9uLU1hZHJpZ2FsIDogaHR0cHM6Ly9naXRodWIuY29tL3RlY2hkaW1lbnNpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlblNnID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tc2cnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5TZztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///43004\n")},43012:(I,g,n)=>{"use strict";I.exports=n.p+"727f12ef9ef1ad616928.png"},43128:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(80754), __webpack_require__(84636), __webpack_require__(39506), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t const N = 16;\n\n\t //Origin pbox and sbox, derived from PI\n\t const ORIG_P = [\n\t 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,\n\t 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,\n\t 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,\n\t 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,\n\t 0x9216D5D9, 0x8979FB1B\n\t ];\n\n\t const ORIG_S = [\n\t [ 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,\n\t 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,\n\t 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,\n\t 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,\n\t 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,\n\t 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,\n\t 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,\n\t 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,\n\t 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,\n\t 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,\n\t 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,\n\t 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,\n\t 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,\n\t 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,\n\t 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,\n\t 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,\n\t 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,\n\t 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,\n\t 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,\n\t 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,\n\t 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,\n\t 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,\n\t 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,\n\t 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,\n\t 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,\n\t 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,\n\t 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,\n\t 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,\n\t 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,\n\t 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,\n\t 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,\n\t 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,\n\t 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,\n\t 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,\n\t 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,\n\t 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,\n\t 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,\n\t 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,\n\t 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,\n\t 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,\n\t 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,\n\t 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,\n\t 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,\n\t 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,\n\t 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,\n\t 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,\n\t 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,\n\t 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,\n\t 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,\n\t 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,\n\t 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,\n\t 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,\n\t 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,\n\t 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,\n\t 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,\n\t 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,\n\t 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,\n\t 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,\n\t 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,\n\t 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,\n\t 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,\n\t 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,\n\t 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,\n\t 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ],\n\t [ 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,\n\t 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,\n\t 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,\n\t 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,\n\t 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,\n\t 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,\n\t 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,\n\t 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,\n\t 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,\n\t 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,\n\t 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,\n\t 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,\n\t 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,\n\t 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,\n\t 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,\n\t 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,\n\t 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,\n\t 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,\n\t 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,\n\t 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,\n\t 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,\n\t 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,\n\t 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,\n\t 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,\n\t 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,\n\t 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,\n\t 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,\n\t 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,\n\t 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,\n\t 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,\n\t 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,\n\t 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,\n\t 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,\n\t 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,\n\t 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,\n\t 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,\n\t 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,\n\t 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,\n\t 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,\n\t 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,\n\t 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,\n\t 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,\n\t 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,\n\t 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,\n\t 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,\n\t 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,\n\t 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,\n\t 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,\n\t 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,\n\t 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,\n\t 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,\n\t 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,\n\t 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,\n\t 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,\n\t 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,\n\t 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,\n\t 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,\n\t 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,\n\t 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,\n\t 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,\n\t 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,\n\t 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,\n\t 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,\n\t 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ],\n\t [ 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,\n\t 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,\n\t 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,\n\t 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,\n\t 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,\n\t 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,\n\t 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,\n\t 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,\n\t 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,\n\t 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,\n\t 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,\n\t 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,\n\t 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,\n\t 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,\n\t 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,\n\t 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,\n\t 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,\n\t 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,\n\t 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,\n\t 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,\n\t 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,\n\t 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,\n\t 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,\n\t 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,\n\t 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,\n\t 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,\n\t 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,\n\t 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,\n\t 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,\n\t 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,\n\t 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,\n\t 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,\n\t 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,\n\t 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,\n\t 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,\n\t 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,\n\t 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,\n\t 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,\n\t 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,\n\t 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,\n\t 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,\n\t 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,\n\t 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,\n\t 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,\n\t 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,\n\t 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,\n\t 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,\n\t 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,\n\t 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,\n\t 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,\n\t 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,\n\t 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,\n\t 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,\n\t 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,\n\t 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,\n\t 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,\n\t 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,\n\t 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,\n\t 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,\n\t 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,\n\t 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,\n\t 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,\n\t 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,\n\t 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ],\n\t [ 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,\n\t 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,\n\t 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,\n\t 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,\n\t 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,\n\t 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,\n\t 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,\n\t 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,\n\t 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,\n\t 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,\n\t 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,\n\t 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,\n\t 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,\n\t 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,\n\t 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,\n\t 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,\n\t 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,\n\t 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,\n\t 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,\n\t 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,\n\t 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,\n\t 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,\n\t 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,\n\t 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,\n\t 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,\n\t 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,\n\t 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,\n\t 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,\n\t 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,\n\t 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,\n\t 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,\n\t 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,\n\t 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,\n\t 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,\n\t 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,\n\t 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,\n\t 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,\n\t 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,\n\t 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,\n\t 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,\n\t 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,\n\t 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,\n\t 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,\n\t 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,\n\t 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,\n\t 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,\n\t 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,\n\t 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,\n\t 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,\n\t 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,\n\t 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,\n\t 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,\n\t 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,\n\t 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,\n\t 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,\n\t 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,\n\t 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,\n\t 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,\n\t 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,\n\t 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,\n\t 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,\n\t 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,\n\t 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,\n\t 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 ]\n\t ];\n\n\t var BLOWFISH_CTX = {\n\t pbox: [],\n\t sbox: []\n\t }\n\n\t function F(ctx, x){\n\t let a = (x >> 24) & 0xFF;\n\t let b = (x >> 16) & 0xFF;\n\t let c = (x >> 8) & 0xFF;\n\t let d = x & 0xFF;\n\n\t let y = ctx.sbox[0][a] + ctx.sbox[1][b];\n\t y = y ^ ctx.sbox[2][c];\n\t y = y + ctx.sbox[3][d];\n\n\t return y;\n\t }\n\n\t function BlowFish_Encrypt(ctx, left, right){\n\t let Xl = left;\n\t let Xr = right;\n\t let temp;\n\n\t for(let i = 0; i < N; ++i){\n\t Xl = Xl ^ ctx.pbox[i];\n\t Xr = F(ctx, Xl) ^ Xr;\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\t }\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\n\t Xr = Xr ^ ctx.pbox[N];\n\t Xl = Xl ^ ctx.pbox[N + 1];\n\n\t return {left: Xl, right: Xr};\n\t }\n\n\t function BlowFish_Decrypt(ctx, left, right){\n\t let Xl = left;\n\t let Xr = right;\n\t let temp;\n\n\t for(let i = N + 1; i > 1; --i){\n\t Xl = Xl ^ ctx.pbox[i];\n\t Xr = F(ctx, Xl) ^ Xr;\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\t }\n\n\t temp = Xl;\n\t Xl = Xr;\n\t Xr = temp;\n\n\t Xr = Xr ^ ctx.pbox[1];\n\t Xl = Xl ^ ctx.pbox[0];\n\n\t return {left: Xl, right: Xr};\n\t }\n\n\t /**\n\t * Initialization ctx's pbox and sbox.\n\t *\n\t * @param {Object} ctx The object has pbox and sbox.\n\t * @param {Array} key An array of 32-bit words.\n\t * @param {int} keysize The length of the key.\n\t *\n\t * @example\n\t *\n\t * BlowFishInit(BLOWFISH_CTX, key, 128/32);\n\t */\n\t function BlowFishInit(ctx, key, keysize)\n\t {\n\t for(let Row = 0; Row < 4; Row++)\n\t {\n\t ctx.sbox[Row] = [];\n\t for(let Col = 0; Col < 256; Col++)\n\t {\n\t ctx.sbox[Row][Col] = ORIG_S[Row][Col];\n\t }\n\t }\n\n\t let keyIndex = 0;\n\t for(let index = 0; index < N + 2; index++)\n\t {\n\t ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];\n\t keyIndex++;\n\t if(keyIndex >= keysize)\n\t {\n\t keyIndex = 0;\n\t }\n\t }\n\n\t let Data1 = 0;\n\t let Data2 = 0;\n\t let res = 0;\n\t for(let i = 0; i < N + 2; i += 2)\n\t {\n\t res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t Data1 = res.left;\n\t Data2 = res.right;\n\t ctx.pbox[i] = Data1;\n\t ctx.pbox[i + 1] = Data2;\n\t }\n\n\t for(let i = 0; i < 4; i++)\n\t {\n\t for(let j = 0; j < 256; j += 2)\n\t {\n\t res = BlowFish_Encrypt(ctx, Data1, Data2);\n\t Data1 = res.left;\n\t Data2 = res.right;\n\t ctx.sbox[i][j] = Data1;\n\t ctx.sbox[i][j + 1] = Data2;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t /**\n\t * Blowfish block cipher algorithm.\n\t */\n\t var Blowfish = C_algo.Blowfish = BlockCipher.extend({\n\t _doReset: function () {\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t //Initialization pbox and sbox\n\t BlowFishInit(BLOWFISH_CTX, keyWords, keySize);\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t M[offset] = res.left;\n\t M[offset + 1] = res.right;\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);\n\t M[offset] = res.left;\n\t M[offset + 1] = res.right;\n\t },\n\n\t blockSize: 64/32,\n\n\t keySize: 128/32,\n\n\t ivSize: 64/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);\n\t */\n\t C.Blowfish = BlockCipher._createHelper(Blowfish);\n\t}());\n\n\n\treturn CryptoJS.Blowfish;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMxMjguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2Jsb3dmaXNoLmpzP2FmNWIiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2VuYy1iYXNlNjRcIiksIHJlcXVpcmUoXCIuL21kNVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9lbmMtYmFzZTY0XCIsIFwiLi9tZDVcIiwgXCIuL2V2cGtkZlwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgY29uc3QgTiA9IDE2O1xuXG5cdCAgICAvL09yaWdpbiBwYm94IGFuZCBzYm94LCBkZXJpdmVkIGZyb20gUElcblx0ICAgIGNvbnN0IE9SSUdfUCA9IFtcblx0ICAgICAgICAweDI0M0Y2QTg4LCAweDg1QTMwOEQzLCAweDEzMTk4QTJFLCAweDAzNzA3MzQ0LFxuXHQgICAgICAgIDB4QTQwOTM4MjIsIDB4Mjk5RjMxRDAsIDB4MDgyRUZBOTgsIDB4RUM0RTZDODksXG5cdCAgICAgICAgMHg0NTI4MjFFNiwgMHgzOEQwMTM3NywgMHhCRTU0NjZDRiwgMHgzNEU5MEM2Qyxcblx0ICAgICAgICAweEMwQUMyOUI3LCAweEM5N0M1MERELCAweDNGODRENUI1LCAweEI1NDcwOTE3LFxuXHQgICAgICAgIDB4OTIxNkQ1RDksIDB4ODk3OUZCMUJcblx0ICAgIF07XG5cblx0ICAgIGNvbnN0IE9SSUdfUyA9IFtcblx0ICAgICAgICBbICAgMHhEMTMxMEJBNiwgMHg5OERGQjVBQywgMHgyRkZENzJEQiwgMHhEMDFBREZCNyxcblx0ICAgICAgICAgICAgMHhCOEUxQUZFRCwgMHg2QTI2N0U5NiwgMHhCQTdDOTA0NSwgMHhGMTJDN0Y5OSxcblx0ICAgICAgICAgICAgMHgyNEExOTk0NywgMHhCMzkxNkNGNywgMHgwODAxRjJFMiwgMHg4NThFRkMxNixcblx0ICAgICAgICAgICAgMHg2MzY5MjBEOCwgMHg3MTU3NEU2OSwgMHhBNDU4RkVBMywgMHhGNDkzM0Q3RSxcblx0ICAgICAgICAgICAgMHgwRDk1NzQ4RiwgMHg3MjhFQjY1OCwgMHg3MThCQ0Q1OCwgMHg4MjE1NEFFRSxcblx0ICAgICAgICAgICAgMHg3QjU0QTQxRCwgMHhDMjVBNTlCNSwgMHg5QzMwRDUzOSwgMHgyQUYyNjAxMyxcblx0ICAgICAgICAgICAgMHhDNUQxQjAyMywgMHgyODYwODVGMCwgMHhDQTQxNzkxOCwgMHhCOERCMzhFRixcblx0ICAgICAgICAgICAgMHg4RTc5RENCMCwgMHg2MDNBMTgwRSwgMHg2QzlFMEU4QiwgMHhCMDFFOEEzRSxcblx0ICAgICAgICAgICAgMHhENzE1NzdDMSwgMHhCRDMxNEIyNywgMHg3OEFGMkZEQSwgMHg1NTYwNUM2MCxcblx0ICAgICAgICAgICAgMHhFNjU1MjVGMywgMHhBQTU1QUI5NCwgMHg1NzQ4OTg2MiwgMHg2M0U4MTQ0MCxcblx0ICAgICAgICAgICAgMHg1NUNBMzk2QSwgMHgyQUFCMTBCNiwgMHhCNENDNUMzNCwgMHgxMTQxRThDRSxcblx0ICAgICAgICAgICAgMHhBMTU0ODZBRiwgMHg3QzcyRTk5MywgMHhCM0VFMTQxMSwgMHg2MzZGQkMyQSxcblx0ICAgICAgICAgICAgMHgyQkE5QzU1RCwgMHg3NDE4MzFGNiwgMHhDRTVDM0UxNiwgMHg5Qjg3OTMxRSxcblx0ICAgICAgICAgICAgMHhBRkQ2QkEzMywgMHg2QzI0Q0Y1QywgMHg3QTMyNTM4MSwgMHgyODk1ODY3Nyxcblx0ICAgICAgICAgICAgMHgzQjhGNDg5OCwgMHg2QjRCQjlBRiwgMHhDNEJGRTgxQiwgMHg2NjI4MjE5Myxcblx0ICAgICAgICAgICAgMHg2MUQ4MDlDQywgMHhGQjIxQTk5MSwgMHg0ODdDQUM2MCwgMHg1REVDODAzMixcblx0ICAgICAgICAgICAgMHhFRjg0NUQ1RCwgMHhFOTg1NzVCMSwgMHhEQzI2MjMwMiwgMHhFQjY1MUI4OCxcblx0ICAgICAgICAgICAgMHgyMzg5M0U4MSwgMHhEMzk2QUNDNSwgMHgwRjZENkZGMywgMHg4M0Y0NDIzOSxcblx0ICAgICAgICAgICAgMHgyRTBCNDQ4MiwgMHhBNDg0MjAwNCwgMHg2OUM4RjA0QSwgMHg5RTFGOUI1RSxcblx0ICAgICAgICAgICAgMHgyMUM2Njg0MiwgMHhGNkU5NkM5QSwgMHg2NzBDOUM2MSwgMHhBQkQzODhGMCxcblx0ICAgICAgICAgICAgMHg2QTUxQTBEMiwgMHhEODU0MkY2OCwgMHg5NjBGQTcyOCwgMHhBQjUxMzNBMyxcblx0ICAgICAgICAgICAgMHg2RUVGMEI2QywgMHgxMzdBM0JFNCwgMHhCQTNCRjA1MCwgMHg3RUZCMkE5OCxcblx0ICAgICAgICAgICAgMHhBMUYxNjUxRCwgMHgzOUFGMDE3NiwgMHg2NkNBNTkzRSwgMHg4MjQzMEU4OCxcblx0ICAgICAgICAgICAgMHg4Q0VFODYxOSwgMHg0NTZGOUZCNCwgMHg3RDg0QTVDMywgMHgzQjhCNUVCRSxcblx0ICAgICAgICAgICAgMHhFMDZGNzVEOCwgMHg4NUMxMjA3MywgMHg0MDFBNDQ5RiwgMHg1NkMxNkFBNixcblx0ICAgICAgICAgICAgMHg0RUQzQUE2MiwgMHgzNjNGNzcwNiwgMHgxQkZFREY3MiwgMHg0MjlCMDIzRCxcblx0ICAgICAgICAgICAgMHgzN0QwRDcyNCwgMHhEMDBBMTI0OCwgMHhEQjBGRUFEMywgMHg0OUYxQzA5Qixcblx0ICAgICAgICAgICAgMHgwNzUzNzJDOSwgMHg4MDk5MUI3QiwgMHgyNUQ0NzlEOCwgMHhGNkU4REVGNyxcblx0ICAgICAgICAgICAgMHhFM0ZFNTAxQSwgMHhCNjc5NEMzQiwgMHg5NzZDRTBCRCwgMHgwNEMwMDZCQSxcblx0ICAgICAgICAgICAgMHhDMUE5NEZCNiwgMHg0MDlGNjBDNCwgMHg1RTVDOUVDMiwgMHgxOTZBMjQ2Myxcblx0ICAgICAgICAgICAgMHg2OEZCNkZBRiwgMHgzRTZDNTNCNSwgMHgxMzM5QjJFQiwgMHgzQjUyRUM2Rixcblx0ICAgICAgICAgICAgMHg2REZDNTExRiwgMHg5QjMwOTUyQywgMHhDQzgxNDU0NCwgMHhBRjVFQkQwOSxcblx0ICAgICAgICAgICAgMHhCRUUzRDAwNCwgMHhERTMzNEFGRCwgMHg2NjBGMjgwNywgMHgxOTJFNEJCMyxcblx0ICAgICAgICAgICAgMHhDMENCQTg1NywgMHg0NUM4NzQwRiwgMHhEMjBCNUYzOSwgMHhCOUQzRkJEQixcblx0ICAgICAgICAgICAgMHg1NTc5QzBCRCwgMHgxQTYwMzIwQSwgMHhENkExMDBDNiwgMHg0MDJDNzI3OSxcblx0ICAgICAgICAgICAgMHg2NzlGMjVGRSwgMHhGQjFGQTNDQywgMHg4RUE1RTlGOCwgMHhEQjMyMjJGOCxcblx0ICAgICAgICAgICAgMHgzQzc1MTZERiwgMHhGRDYxNkIxNSwgMHgyRjUwMUVDOCwgMHhBRDA1NTJBQixcblx0ICAgICAgICAgICAgMHgzMjNEQjVGQSwgMHhGRDIzODc2MCwgMHg1MzMxN0I0OCwgMHgzRTAwREY4Mixcblx0ICAgICAgICAgICAgMHg5RTVDNTdCQiwgMHhDQTZGOENBMCwgMHgxQTg3NTYyRSwgMHhERjE3NjlEQixcblx0ICAgICAgICAgICAgMHhENTQyQThGNiwgMHgyODdFRkZDMywgMHhBQzY3MzJDNiwgMHg4QzRGNTU3Myxcblx0ICAgICAgICAgICAgMHg2OTVCMjdCMCwgMHhCQkNBNThDOCwgMHhFMUZGQTM1RCwgMHhCOEYwMTFBMCxcblx0ICAgICAgICAgICAgMHgxMEZBM0Q5OCwgMHhGRDIxODNCOCwgMHg0QUZDQjU2QywgMHgyREQxRDM1Qixcblx0ICAgICAgICAgICAgMHg5QTUzRTQ3OSwgMHhCNkY4NDU2NSwgMHhEMjhFNDlCQywgMHg0QkZCOTc5MCxcblx0ICAgICAgICAgICAgMHhFMURERjJEQSwgMHhBNENCN0UzMywgMHg2MkZCMTM0MSwgMHhDRUU0QzZFOCxcblx0ICAgICAgICAgICAgMHhFRjIwQ0FEQSwgMHgzNjc3NEMwMSwgMHhEMDdFOUVGRSwgMHgyQkYxMUZCNCxcblx0ICAgICAgICAgICAgMHg5NURCREE0RCwgMHhBRTkwOTE5OCwgMHhFQUFEOEU3MSwgMHg2QjkzRDVBMCxcblx0ICAgICAgICAgICAgMHhEMDhFRDFEMCwgMHhBRkM3MjVFMCwgMHg4RTNDNUIyRiwgMHg4RTc1OTRCNyxcblx0ICAgICAgICAgICAgMHg4RkY2RTJGQiwgMHhGMjEyMkI2NCwgMHg4ODg4QjgxMiwgMHg5MDBERjAxQyxcblx0ICAgICAgICAgICAgMHg0RkFENUVBMCwgMHg2ODhGQzMxQywgMHhEMUNGRjE5MSwgMHhCM0E4QzFBRCxcblx0ICAgICAgICAgICAgMHgyRjJGMjIxOCwgMHhCRTBFMTc3NywgMHhFQTc1MkRGRSwgMHg4QjAyMUZBMSxcblx0ICAgICAgICAgICAgMHhFNUEwQ0MwRiwgMHhCNTZGNzRFOCwgMHgxOEFDRjNENiwgMHhDRTg5RTI5OSxcblx0ICAgICAgICAgICAgMHhCNEE4NEZFMCwgMHhGRDEzRTBCNywgMHg3Q0M0M0I4MSwgMHhEMkFEQThEOSxcblx0ICAgICAgICAgICAgMHgxNjVGQTI2NiwgMHg4MDk1NzcwNSwgMHg5M0NDNzMxNCwgMHgyMTFBMTQ3Nyxcblx0ICAgICAgICAgICAgMHhFNkFEMjA2NSwgMHg3N0I1RkE4NiwgMHhDNzU0NDJGNSwgMHhGQjlEMzVDRixcblx0ICAgICAgICAgICAgMHhFQkNEQUYwQywgMHg3QjNFODlBMCwgMHhENjQxMUJEMywgMHhBRTFFN0U0OSxcblx0ICAgICAgICAgICAgMHgwMDI1MEUyRCwgMHgyMDcxQjM1RSwgMHgyMjY4MDBCQiwgMHg1N0I4RTBBRixcblx0ICAgICAgICAgICAgMHgyNDY0MzY5QiwgMHhGMDA5QjkxRSwgMHg1NTYzOTExRCwgMHg1OURGQTZBQSxcblx0ICAgICAgICAgICAgMHg3OEMxNDM4OSwgMHhEOTVBNTM3RiwgMHgyMDdENUJBMiwgMHgwMkU1QjlDNSxcblx0ICAgICAgICAgICAgMHg4MzI2MDM3NiwgMHg2Mjk1Q0ZBOSwgMHgxMUM4MTk2OCwgMHg0RTczNEE0MSxcblx0ICAgICAgICAgICAgMHhCMzQ3MkRDQSwgMHg3QjE0QTk0QSwgMHgxQjUxMDA1MiwgMHg5QTUzMjkxNSxcblx0ICAgICAgICAgICAgMHhENjBGNTczRiwgMHhCQzlCQzZFNCwgMHgyQjYwQTQ3NiwgMHg4MUU2NzQwMCxcblx0ICAgICAgICAgICAgMHgwOEJBNkZCNSwgMHg1NzFCRTkxRiwgMHhGMjk2RUM2QiwgMHgyQTBERDkxNSxcblx0ICAgICAgICAgICAgMHhCNjYzNjUyMSwgMHhFN0I5RjlCNiwgMHhGRjM0MDUyRSwgMHhDNTg1NTY2NCxcblx0ICAgICAgICAgICAgMHg1M0IwMkQ1RCwgMHhBOTlGOEZBMSwgMHgwOEJBNDc5OSwgMHg2RTg1MDc2QSAgIF0sXG5cdCAgICAgICAgWyAgIDB4NEI3QTcwRTksIDB4QjVCMzI5NDQsIDB4REI3NTA5MkUsIDB4QzQxOTI2MjMsXG5cdCAgICAgICAgICAgIDB4QUQ2RUE2QjAsIDB4NDlBN0RGN0QsIDB4OUNFRTYwQjgsIDB4OEZFREIyNjYsXG5cdCAgICAgICAgICAgIDB4RUNBQThDNzEsIDB4Njk5QTE3RkYsIDB4NTY2NDUyNkMsIDB4QzJCMTlFRTEsXG5cdCAgICAgICAgICAgIDB4MTkzNjAyQTUsIDB4NzUwOTRDMjksIDB4QTA1OTEzNDAsIDB4RTQxODNBM0UsXG5cdCAgICAgICAgICAgIDB4M0Y1NDk4OUEsIDB4NUI0MjlENjUsIDB4NkI4RkU0RDYsIDB4OTlGNzNGRDYsXG5cdCAgICAgICAgICAgIDB4QTFEMjlDMDcsIDB4RUZFODMwRjUsIDB4NEQyRDM4RTYsIDB4RjAyNTVEQzEsXG5cdCAgICAgICAgICAgIDB4NENERDIwODYsIDB4ODQ3MEVCMjYsIDB4NjM4MkU5QzYsIDB4MDIxRUNDNUUsXG5cdCAgICAgICAgICAgIDB4MDk2ODZCM0YsIDB4M0VCQUVGQzksIDB4M0M5NzE4MTQsIDB4NkI2QTcwQTEsXG5cdCAgICAgICAgICAgIDB4Njg3RjM1ODQsIDB4NTJBMEUyODYsIDB4Qjc5QzUzMDUsIDB4QUE1MDA3MzcsXG5cdCAgICAgICAgICAgIDB4M0UwNzg0MUMsIDB4N0ZERUFFNUMsIDB4OEU3RDQ0RUMsIDB4NTcxNkYyQjgsXG5cdCAgICAgICAgICAgIDB4QjAzQURBMzcsIDB4RjA1MDBDMEQsIDB4RjAxQzFGMDQsIDB4MDIwMEIzRkYsXG5cdCAgICAgICAgICAgIDB4QUUwQ0Y1MUEsIDB4M0NCNTc0QjIsIDB4MjU4MzdBNTgsIDB4REMwOTIxQkQsXG5cdCAgICAgICAgICAgIDB4RDE5MTEzRjksIDB4N0NBOTJGRjYsIDB4OTQzMjQ3NzMsIDB4MjJGNTQ3MDEsXG5cdCAgICAgICAgICAgIDB4M0FFNUU1ODEsIDB4MzdDMkRBREMsIDB4QzhCNTc2MzQsIDB4OUFGM0REQTcsXG5cdCAgICAgICAgICAgIDB4QTk0NDYxNDYsIDB4MEZEMDAzMEUsIDB4RUNDOEM3M0UsIDB4QTQ3NTFFNDEsXG5cdCAgICAgICAgICAgIDB4RTIzOENEOTksIDB4M0JFQTBFMkYsIDB4MzI4MEJCQTEsIDB4MTgzRUIzMzEsXG5cdCAgICAgICAgICAgIDB4NEU1NDhCMzgsIDB4NEY2REI5MDgsIDB4NkY0MjBEMDMsIDB4RjYwQTA0QkYsXG5cdCAgICAgICAgICAgIDB4MkNCODEyOTAsIDB4MjQ5NzdDNzksIDB4NTY3OUIwNzIsIDB4QkNBRjg5QUYsXG5cdCAgICAgICAgICAgIDB4REU5QTc3MUYsIDB4RDk5MzA4MTAsIDB4QjM4QkFFMTIsIDB4RENDRjNGMkUsXG5cdCAgICAgICAgICAgIDB4NTUxMjcyMUYsIDB4MkU2QjcxMjQsIDB4NTAxQURERTYsIDB4OUY4NENEODcsXG5cdCAgICAgICAgICAgIDB4N0E1ODQ3MTgsIDB4NzQwOERBMTcsIDB4QkM5RjlBQkMsIDB4RTk0QjdEOEMsXG5cdCAgICAgICAgICAgIDB4RUM3QUVDM0EsIDB4REI4NTFERkEsIDB4NjMwOTQzNjYsIDB4QzQ2NEMzRDIsXG5cdCAgICAgICAgICAgIDB4RUYxQzE4NDcsIDB4MzIxNUQ5MDgsIDB4REQ0MzNCMzcsIDB4MjRDMkJBMTYsXG5cdCAgICAgICAgICAgIDB4MTJBMTRENDMsIDB4MkE2NUM0NTEsIDB4NTA5NDAwMDIsIDB4MTMzQUU0REQsXG5cdCAgICAgICAgICAgIDB4NzFERkY4OUUsIDB4MTAzMTRFNTUsIDB4ODFBQzc3RDYsIDB4NUYxMTE5OUIsXG5cdCAgICAgICAgICAgIDB4MDQzNTU2RjEsIDB4RDdBM0M3NkIsIDB4M0MxMTE4M0IsIDB4NTkyNEE1MDksXG5cdCAgICAgICAgICAgIDB4RjI4RkU2RUQsIDB4OTdGMUZCRkEsIDB4OUVCQUJGMkMsIDB4MUUxNTNDNkUsXG5cdCAgICAgICAgICAgIDB4ODZFMzQ1NzAsIDB4RUFFOTZGQjEsIDB4ODYwRTVFMEEsIDB4NUEzRTJBQjMsXG5cdCAgICAgICAgICAgIDB4NzcxRkU3MUMsIDB4NEUzRDA2RkEsIDB4Mjk2NURDQjksIDB4OTlFNzFEMEYsXG5cdCAgICAgICAgICAgIDB4ODAzRTg5RDYsIDB4NTI2NkM4MjUsIDB4MkU0Q0M5NzgsIDB4OUMxMEIzNkEsXG5cdCAgICAgICAgICAgIDB4QzYxNTBFQkEsIDB4OTRFMkVBNzgsIDB4QTVGQzNDNTMsIDB4MUUwQTJERjQsXG5cdCAgICAgICAgICAgIDB4RjJGNzRFQTcsIDB4MzYxRDJCM0QsIDB4MTkzOTI2MEYsIDB4MTlDMjc5NjAsXG5cdCAgICAgICAgICAgIDB4NTIyM0E3MDgsIDB4RjcxMzEyQjYsIDB4RUJBREZFNkUsIDB4RUFDMzFGNjYsXG5cdCAgICAgICAgICAgIDB4RTNCQzQ1OTUsIDB4QTY3QkM4ODMsIDB4QjE3RjM3RDEsIDB4MDE4Q0ZGMjgsXG5cdCAgICAgICAgICAgIDB4QzMzMkRERUYsIDB4QkU2QzVBQTUsIDB4NjU1ODIxODUsIDB4NjhBQjk4MDIsXG5cdCAgICAgICAgICAgIDB4RUVDRUE1MEYsIDB4REIyRjk1M0IsIDB4MkFFRjdEQUQsIDB4NUI2RTJGODQsXG5cdCAgICAgICAgICAgIDB4MTUyMUI2MjgsIDB4MjkwNzYxNzAsIDB4RUNERDQ3NzUsIDB4NjE5RjE1MTAsXG5cdCAgICAgICAgICAgIDB4MTNDQ0E4MzAsIDB4RUI2MUJEOTYsIDB4MDMzNEZFMUUsIDB4QUEwMzYzQ0YsXG5cdCAgICAgICAgICAgIDB4QjU3MzVDOTAsIDB4NEM3MEEyMzksIDB4RDU5RTlFMEIsIDB4Q0JBQURFMTQsXG5cdCAgICAgICAgICAgIDB4RUVDQzg2QkMsIDB4NjA2MjJDQTcsIDB4OUNBQjVDQUIsIDB4QjJGMzg0NkUsXG5cdCAgICAgICAgICAgIDB4NjQ4QjFFQUYsIDB4MTlCREYwQ0EsIDB4QTAyMzY5QjksIDB4NjU1QUJCNTAsXG5cdCAgICAgICAgICAgIDB4NDA2ODVBMzIsIDB4M0MyQUI0QjMsIDB4MzE5RUU5RDUsIDB4QzAyMUI4RjcsXG5cdCAgICAgICAgICAgIDB4OUI1NDBCMTksIDB4ODc1RkEwOTksIDB4OTVGNzk5N0UsIDB4NjIzRDdEQTgsXG5cdCAgICAgICAgICAgIDB4RjgzNzg4OUEsIDB4OTdFMzJENzcsIDB4MTFFRDkzNUYsIDB4MTY2ODEyODEsXG5cdCAgICAgICAgICAgIDB4MEUzNTg4MjksIDB4QzdFNjFGRDYsIDB4OTZERURGQTEsIDB4Nzg1OEJBOTksXG5cdCAgICAgICAgICAgIDB4NTdGNTg0QTUsIDB4MUIyMjcyNjMsIDB4OUI4M0MzRkYsIDB4MUFDMjQ2OTYsXG5cdCAgICAgICAgICAgIDB4Q0RCMzBBRUIsIDB4NTMyRTMwNTQsIDB4OEZEOTQ4RTQsIDB4NkRCQzMxMjgsXG5cdCAgICAgICAgICAgIDB4NThFQkYyRUYsIDB4MzRDNkZGRUEsIDB4RkUyOEVENjEsIDB4RUU3QzNDNzMsXG5cdCAgICAgICAgICAgIDB4NUQ0QTE0RDksIDB4RTg2NEI3RTMsIDB4NDIxMDVEMTQsIDB4MjAzRTEzRTAsXG5cdCAgICAgICAgICAgIDB4NDVFRUUyQjYsIDB4QTNBQUFCRUEsIDB4REI2QzRGMTUsIDB4RkFDQjRGRDAsXG5cdCAgICAgICAgICAgIDB4Qzc0MkY0NDIsIDB4RUY2QUJCQjUsIDB4NjU0RjNCMUQsIDB4NDFDRDIxMDUsXG5cdCAgICAgICAgICAgIDB4RDgxRTc5OUUsIDB4ODY4NTREQzcsIDB4RTQ0QjQ3NkEsIDB4M0Q4MTYyNTAsXG5cdCAgICAgICAgICAgIDB4Q0Y2MkExRjIsIDB4NUI4RDI2NDYsIDB4RkM4ODgzQTAsIDB4QzFDN0I2QTMsXG5cdCAgICAgICAgICAgIDB4N0YxNTI0QzMsIDB4NjlDQjc0OTIsIDB4NDc4NDhBMEIsIDB4NTY5MkIyODUsXG5cdCAgICAgICAgICAgIDB4MDk1QkJGMDAsIDB4QUQxOTQ4OUQsIDB4MTQ2MkIxNzQsIDB4MjM4MjBFMDAsXG5cdCAgICAgICAgICAgIDB4NTg0MjhEMkEsIDB4MEM1NUY1RUEsIDB4MURBREY0M0UsIDB4MjMzRjcwNjEsXG5cdCAgICAgICAgICAgIDB4MzM3MkYwOTIsIDB4OEQ5MzdFNDEsIDB4RDY1RkVDRjEsIDB4NkMyMjNCREIsXG5cdCAgICAgICAgICAgIDB4N0NERTM3NTksIDB4Q0JFRTc0NjAsIDB4NDA4NUYyQTcsIDB4Q0U3NzMyNkUsXG5cdCAgICAgICAgICAgIDB4QTYwNzgwODQsIDB4MTlGODUwOUUsIDB4RThFRkQ4NTUsIDB4NjFEOTk3MzUsXG5cdCAgICAgICAgICAgIDB4QTk2OUE3QUEsIDB4QzUwQzA2QzIsIDB4NUEwNEFCRkMsIDB4ODAwQkNBREMsXG5cdCAgICAgICAgICAgIDB4OUU0NDdBMkUsIDB4QzM0NTM0ODQsIDB4RkRENTY3MDUsIDB4MEUxRTlFQzksXG5cdCAgICAgICAgICAgIDB4REI3M0RCRDMsIDB4MTA1NTg4Q0QsIDB4Njc1RkRBNzksIDB4RTM2NzQzNDAsXG5cdCAgICAgICAgICAgIDB4QzVDNDM0NjUsIDB4NzEzRTM4RDgsIDB4M0QyOEY4OUUsIDB4RjE2REZGMjAsXG5cdCAgICAgICAgICAgIDB4MTUzRTIxRTcsIDB4OEZCMDNENEEsIDB4RTZFMzlGMkIsIDB4REI4M0FERjcgICBdLFxuXHQgICAgICAgIFsgICAweEU5M0Q1QTY4LCAweDk0ODE0MEY3LCAweEY2NEMyNjFDLCAweDk0NjkyOTM0LFxuXHQgICAgICAgICAgICAweDQxMTUyMEY3LCAweDc2MDJENEY3LCAweEJDRjQ2QjJFLCAweEQ0QTIwMDY4LFxuXHQgICAgICAgICAgICAweEQ0MDgyNDcxLCAweDMzMjBGNDZBLCAweDQzQjdENEI3LCAweDUwMDA2MUFGLFxuXHQgICAgICAgICAgICAweDFFMzlGNjJFLCAweDk3MjQ0NTQ2LCAweDE0MjE0Rjc0LCAweEJGOEI4ODQwLFxuXHQgICAgICAgICAgICAweDREOTVGQzFELCAweDk2QjU5MUFGLCAweDcwRjREREQzLCAweDY2QTAyRjQ1LFxuXHQgICAgICAgICAgICAweEJGQkMwOUVDLCAweDAzQkQ5Nzg1LCAweDdGQUM2REQwLCAweDMxQ0I4NTA0LFxuXHQgICAgICAgICAgICAweDk2RUIyN0IzLCAweDU1RkQzOTQxLCAweERBMjU0N0U2LCAweEFCQ0EwQTlBLFxuXHQgICAgICAgICAgICAweDI4NTA3ODI1LCAweDUzMDQyOUY0LCAweDBBMkM4NkRBLCAweEU5QjY2REZCLFxuXHQgICAgICAgICAgICAweDY4REMxNDYyLCAweEQ3NDg2OTAwLCAweDY4MEVDMEE0LCAweDI3QTE4REVFLFxuXHQgICAgICAgICAgICAweDRGM0ZGRUEyLCAweEU4ODdBRDhDLCAweEI1OENFMDA2LCAweDdBRjRENkI2LFxuXHQgICAgICAgICAgICAweEFBQ0UxRTdDLCAweEQzMzc1RkVDLCAweENFNzhBMzk5LCAweDQwNkIyQTQyLFxuXHQgICAgICAgICAgICAweDIwRkU5RTM1LCAweEQ5RjM4NUI5LCAweEVFMzlEN0FCLCAweDNCMTI0RThCLFxuXHQgICAgICAgICAgICAweDFEQzlGQUY3LCAweDRCNkQxODU2LCAweDI2QTM2NjMxLCAweEVBRTM5N0IyLFxuXHQgICAgICAgICAgICAweDNBNkVGQTc0LCAweERENUI0MzMyLCAweDY4NDFFN0Y3LCAweENBNzgyMEZCLFxuXHQgICAgICAgICAgICAweEZCMEFGNTRFLCAweEQ4RkVCMzk3LCAweDQ1NDA1NkFDLCAweEJBNDg5NTI3LFxuXHQgICAgICAgICAgICAweDU1NTMzQTNBLCAweDIwODM4RDg3LCAweEZFNkJBOUI3LCAweEQwOTY5NTRCLFxuXHQgICAgICAgICAgICAweDU1QTg2N0JDLCAweEExMTU5QTU4LCAweENDQTkyOTYzLCAweDk5RTFEQjMzLFxuXHQgICAgICAgICAgICAweEE2MkE0QTU2LCAweDNGMzEyNUY5LCAweDVFRjQ3RTFDLCAweDkwMjkzMTdDLFxuXHQgICAgICAgICAgICAweEZERjhFODAyLCAweDA0MjcyRjcwLCAweDgwQkIxNTVDLCAweDA1MjgyQ0UzLFxuXHQgICAgICAgICAgICAweDk1QzExNTQ4LCAweEU0QzY2RDIyLCAweDQ4QzExMzNGLCAweEM3MEY4NkRDLFxuXHQgICAgICAgICAgICAweDA3RjlDOUVFLCAweDQxMDQxRjBGLCAweDQwNDc3OUE0LCAweDVEODg2RTE3LFxuXHQgICAgICAgICAgICAweDMyNUY1MUVCLCAweEQ1OUJDMEQxLCAweEYyQkNDMThGLCAweDQxMTEzNTY0LFxuXHQgICAgICAgICAgICAweDI1N0I3ODM0LCAweDYwMkE5QzYwLCAweERGRjhFOEEzLCAweDFGNjM2QzFCLFxuXHQgICAgICAgICAgICAweDBFMTJCNEMyLCAweDAyRTEzMjlFLCAweEFGNjY0RkQxLCAweENBRDE4MTE1LFxuXHQgICAgICAgICAgICAweDZCMjM5NUUwLCAweDMzM0U5MkUxLCAweDNCMjQwQjYyLCAweEVFQkVCOTIyLFxuXHQgICAgICAgICAgICAweDg1QjJBMjBFLCAweEU2QkEwRDk5LCAweERFNzIwQzhDLCAweDJEQTJGNzI4LFxuXHQgICAgICAgICAgICAweEQwMTI3ODQ1LCAweDk1Qjc5NEZELCAweDY0N0QwODYyLCAweEU3Q0NGNUYwLFxuXHQgICAgICAgICAgICAweDU0NDlBMzZGLCAweDg3N0Q0OEZBLCAweEMzOURGRDI3LCAweEYzM0U4RDFFLFxuXHQgICAgICAgICAgICAweDBBNDc2MzQxLCAweDk5MkVGRjc0LCAweDNBNkY2RUFCLCAweEY0RjhGRDM3LFxuXHQgICAgICAgICAgICAweEE4MTJEQzYwLCAweEExRUJEREY4LCAweDk5MUJFMTRDLCAweERCNkU2QjBELFxuXHQgICAgICAgICAgICAweEM2N0I1NTEwLCAweDZENjcyQzM3LCAweDI3NjVENDNCLCAweERDRDBFODA0LFxuXHQgICAgICAgICAgICAweEYxMjkwREM3LCAweENDMDBGRkEzLCAweEI1MzkwRjkyLCAweDY5MEZFRDBCLFxuXHQgICAgICAgICAgICAweDY2N0I5RkZCLCAweENFREI3RDlDLCAweEEwOTFDRjBCLCAweEQ5MTU1RUEzLFxuXHQgICAgICAgICAgICAweEJCMTMyRjg4LCAweDUxNUJBRDI0LCAweDdCOTQ3OUJGLCAweDc2M0JENkVCLFxuXHQgICAgICAgICAgICAweDM3MzkyRUIzLCAweENDMTE1OTc5LCAweDgwMjZFMjk3LCAweEY0MkUzMTJELFxuXHQgICAgICAgICAgICAweDY4NDJBREE3LCAweEM2NkEyQjNCLCAweDEyNzU0Q0NDLCAweDc4MkVGMTFDLFxuXHQgICAgICAgICAgICAweDZBMTI0MjM3LCAweEI3OTI1MUU3LCAweDA2QTFCQkU2LCAweDRCRkI2MzUwLFxuXHQgICAgICAgICAgICAweDFBNkIxMDE4LCAweDExQ0FFREZBLCAweDNEMjVCREQ4LCAweEUyRTFDM0M5LFxuXHQgICAgICAgICAgICAweDQ0NDIxNjU5LCAweDBBMTIxMzg2LCAweEQ5MENFQzZFLCAweEQ1QUJFQTJBLFxuXHQgICAgICAgICAgICAweDY0QUY2NzRFLCAweERBODZBODVGLCAweEJFQkZFOTg4LCAweDY0RTRDM0ZFLFxuXHQgICAgICAgICAgICAweDlEQkM4MDU3LCAweEYwRjdDMDg2LCAweDYwNzg3QkY4LCAweDYwMDM2MDRELFxuXHQgICAgICAgICAgICAweEQxRkQ4MzQ2LCAweEY2MzgxRkIwLCAweDc3NDVBRTA0LCAweEQ3MzZGQ0NDLFxuXHQgICAgICAgICAgICAweDgzNDI2QjMzLCAweEYwMUVBQjcxLCAweEIwODA0MTg3LCAweDNDMDA1RTVGLFxuXHQgICAgICAgICAgICAweDc3QTA1N0JFLCAweEJERThBRTI0LCAweDU1NDY0Mjk5LCAweEJGNTgyRTYxLFxuXHQgICAgICAgICAgICAweDRFNThGNDhGLCAweEYyRERGREEyLCAweEY0NzRFRjM4LCAweDg3ODlCREMyLFxuXHQgICAgICAgICAgICAweDUzNjZGOUMzLCAweEM4QjM4RTc0LCAweEI0NzVGMjU1LCAweDQ2RkNEOUI5LFxuXHQgICAgICAgICAgICAweDdBRUIyNjYxLCAweDhCMURERjg0LCAweDg0NkEwRTc5LCAweDkxNUY5NUUyLFxuXHQgICAgICAgICAgICAweDQ2NkU1OThFLCAweDIwQjQ1NzcwLCAweDhDRDU1NTkxLCAweEM5MDJERTRDLFxuXHQgICAgICAgICAgICAweEI5MEJBQ0UxLCAweEJCODIwNUQwLCAweDExQTg2MjQ4LCAweDc1NzRBOTlFLFxuXHQgICAgICAgICAgICAweEI3N0YxOUI2LCAweEUwQTlEQzA5LCAweDY2MkQwOUExLCAweEM0MzI0NjMzLFxuXHQgICAgICAgICAgICAweEU4NUExRjAyLCAweDA5RjBCRThDLCAweDRBOTlBMDI1LCAweDFENkVGRTEwLFxuXHQgICAgICAgICAgICAweDFBQjkzRDFELCAweDBCQTVBNERGLCAweEExODZGMjBGLCAweDI4NjhGMTY5LFxuXHQgICAgICAgICAgICAweERDQjdEQTgzLCAweDU3MzkwNkZFLCAweEExRTJDRTlCLCAweDRGQ0Q3RjUyLFxuXHQgICAgICAgICAgICAweDUwMTE1RTAxLCAweEE3MDY4M0ZBLCAweEEwMDJCNUM0LCAweDBERTZEMDI3LFxuXHQgICAgICAgICAgICAweDlBRjg4QzI3LCAweDc3M0Y4NjQxLCAweEMzNjA0QzA2LCAweDYxQTgwNkI1LFxuXHQgICAgICAgICAgICAweEYwMTc3QTI4LCAweEMwRjU4NkUwLCAweDAwNjA1OEFBLCAweDMwREM3RDYyLFxuXHQgICAgICAgICAgICAweDExRTY5RUQ3LCAweDIzMzhFQTYzLCAweDUzQzJERDk0LCAweEMyQzIxNjM0LFxuXHQgICAgICAgICAgICAweEJCQ0JFRTU2LCAweDkwQkNCNkRFLCAweEVCRkM3REExLCAweENFNTkxRDc2LFxuXHQgICAgICAgICAgICAweDZGMDVFNDA5LCAweDRCN0MwMTg4LCAweDM5NzIwQTNELCAweDdDOTI3QzI0LFxuXHQgICAgICAgICAgICAweDg2RTM3MjVGLCAweDcyNEQ5REI5LCAweDFBQzE1QkI0LCAweEQzOUVCOEZDLFxuXHQgICAgICAgICAgICAweEVENTQ1NTc4LCAweDA4RkNBNUI1LCAweEQ4M0Q3Q0QzLCAweDREQUQwRkM0LFxuXHQgICAgICAgICAgICAweDFFNTBFRjVFLCAweEIxNjFFNkY4LCAweEEyODUxNEQ5LCAweDZDNTExMzNDLFxuXHQgICAgICAgICAgICAweDZGRDVDN0U3LCAweDU2RTE0RUM0LCAweDM2MkFCRkNFLCAweEREQzZDODM3LFxuXHQgICAgICAgICAgICAweEQ3OUEzMjM0LCAweDkyNjM4MjEyLCAweDY3MEVGQThFLCAweDQwNjAwMEUwICBdLFxuXHQgICAgICAgIFsgICAweDNBMzlDRTM3LCAweEQzRkFGNUNGLCAweEFCQzI3NzM3LCAweDVBQzUyRDFCLFxuXHQgICAgICAgICAgICAweDVDQjA2NzlFLCAweDRGQTMzNzQyLCAweEQzODIyNzQwLCAweDk5QkM5QkJFLFxuXHQgICAgICAgICAgICAweEQ1MTE4RTlELCAweEJGMEY3MzE1LCAweEQ2MkQxQzdFLCAweEM3MDBDNDdCLFxuXHQgICAgICAgICAgICAweEI3OEMxQjZCLCAweDIxQTE5MDQ1LCAweEIyNkVCMUJFLCAweDZBMzY2RUI0LFxuXHQgICAgICAgICAgICAweDU3NDhBQjJGLCAweEJDOTQ2RTc5LCAweEM2QTM3NkQyLCAweDY1NDlDMkM4LFxuXHQgICAgICAgICAgICAweDUzMEZGOEVFLCAweDQ2OERERTdELCAweEQ1NzMwQTFELCAweDRDRDA0REM2LFxuXHQgICAgICAgICAgICAweDI5MzlCQkRCLCAweEE5QkE0NjUwLCAweEFDOTUyNkU4LCAweEJFNUVFMzA0LFxuXHQgICAgICAgICAgICAweEExRkFENUYwLCAweDZBMkQ1MTlBLCAweDYzRUY4Q0UyLCAweDlBODZFRTIyLFxuXHQgICAgICAgICAgICAweEMwODlDMkI4LCAweDQzMjQyRUY2LCAweEE1MUUwM0FBLCAweDlDRjJEMEE0LFxuXHQgICAgICAgICAgICAweDgzQzA2MUJBLCAweDlCRTk2QTRELCAweDhGRTUxNTUwLCAweEJBNjQ1QkQ2LFxuXHQgICAgICAgICAgICAweDI4MjZBMkY5LCAweEE3M0EzQUUxLCAweDRCQTk5NTg2LCAweEVGNTU2MkU5LFxuXHQgICAgICAgICAgICAweEM3MkZFRkQzLCAweEY3NTJGN0RBLCAweDNGMDQ2RjY5LCAweDc3RkEwQTU5LFxuXHQgICAgICAgICAgICAweDgwRTRBOTE1LCAweDg3QjA4NjAxLCAweDlCMDlFNkFELCAweDNCM0VFNTkzLFxuXHQgICAgICAgICAgICAweEU5OTBGRDVBLCAweDlFMzRENzk3LCAweDJDRjBCN0Q5LCAweDAyMkI4QjUxLFxuXHQgICAgICAgICAgICAweDk2RDVBQzNBLCAweDAxN0RBNjdELCAweEQxQ0YzRUQ2LCAweDdDN0QyRDI4LFxuXHQgICAgICAgICAgICAweDFGOUYyNUNGLCAweEFERjJCODlCLCAweDVBRDZCNDcyLCAweDVBODhGNTRDLFxuXHQgICAgICAgICAgICAweEUwMjlBQzcxLCAweEUwMTlBNUU2LCAweDQ3QjBBQ0ZELCAweEVEOTNGQTlCLFxuXHQgICAgICAgICAgICAweEU4RDNDNDhELCAweDI4M0I1N0NDLCAweEY4RDU2NjI5LCAweDc5MTMyRTI4LFxuXHQgICAgICAgICAgICAweDc4NUYwMTkxLCAweEVENzU2MDU1LCAweEY3OTYwRTQ0LCAweEUzRDM1RThDLFxuXHQgICAgICAgICAgICAweDE1MDU2REQ0LCAweDg4RjQ2REJBLCAweDAzQTE2MTI1LCAweDA1NjRGMEJELFxuXHQgICAgICAgICAgICAweEMzRUI5RTE1LCAweDNDOTA1N0EyLCAweDk3MjcxQUVDLCAweEE5M0EwNzJBLFxuXHQgICAgICAgICAgICAweDFCM0Y2RDlCLCAweDFFNjMyMUY1LCAweEY1OUM2NkZCLCAweDI2RENGMzE5LFxuXHQgICAgICAgICAgICAweDc1MzNEOTI4LCAweEIxNTVGREY1LCAweDAzNTYzNDgyLCAweDhBQkEzQ0JCLFxuXHQgICAgICAgICAgICAweDI4NTE3NzExLCAweEMyMEFEOUY4LCAweEFCQ0M1MTY3LCAweENDQUQ5MjVGLFxuXHQgICAgICAgICAgICAweDRERTgxNzUxLCAweDM4MzBEQzhFLCAweDM3OUQ1ODYyLCAweDkzMjBGOTkxLFxuXHQgICAgICAgICAgICAweEVBN0E5MEMyLCAweEZCM0U3QkNFLCAweDUxMjFDRTY0LCAweDc3NEZCRTMyLFxuXHQgICAgICAgICAgICAweEE4QjZFMzdFLCAweEMzMjkzRDQ2LCAweDQ4REU1MzY5LCAweDY0MTNFNjgwLFxuXHQgICAgICAgICAgICAweEEyQUUwODEwLCAweERENkRCMjI0LCAweDY5ODUyREZELCAweDA5MDcyMTY2LFxuXHQgICAgICAgICAgICAweEIzOUE0NjBBLCAweDY0NDVDMERELCAweDU4NkNERUNGLCAweDFDMjBDOEFFLFxuXHQgICAgICAgICAgICAweDVCQkVGN0RELCAweDFCNTg4RDQwLCAweENDRDIwMTdGLCAweDZCQjRFM0JCLFxuXHQgICAgICAgICAgICAweEREQTI2QTdFLCAweDNBNTlGRjQ1LCAweDNFMzUwQTQ0LCAweEJDQjRDREQ1LFxuXHQgICAgICAgICAgICAweDcyRUFDRUE4LCAweEZBNjQ4NEJCLCAweDhENjYxMkFFLCAweEJGM0M2RjQ3LFxuXHQgICAgICAgICAgICAweEQyOUJFNDYzLCAweDU0MkY1RDlFLCAweEFFQzI3NzFCLCAweEY2NEU2MzcwLFxuXHQgICAgICAgICAgICAweDc0MEUwRDhELCAweEU3NUIxMzU3LCAweEY4NzIxNjcxLCAweEFGNTM3RDVELFxuXHQgICAgICAgICAgICAweDQwNDBDQjA4LCAweDRFQjRFMkNDLCAweDM0RDI0NjZBLCAweDAxMTVBRjg0LFxuXHQgICAgICAgICAgICAweEUxQjAwNDI4LCAweDk1OTgzQTFELCAweDA2Qjg5RkI0LCAweENFNkVBMDQ4LFxuXHQgICAgICAgICAgICAweDZGM0YzQjgyLCAweDM1MjBBQjgyLCAweDAxMUExRDRCLCAweDI3NzIyN0Y4LFxuXHQgICAgICAgICAgICAweDYxMTU2MEIxLCAweEU3OTMzRkRDLCAweEJCM0E3OTJCLCAweDM0NDUyNUJELFxuXHQgICAgICAgICAgICAweEEwODgzOUUxLCAweDUxQ0U3OTRCLCAweDJGMzJDOUI3LCAweEEwMUZCQUM5LFxuXHQgICAgICAgICAgICAweEUwMUNDODdFLCAweEJDQzdEMUY2LCAweENGMDExMUMzLCAweEExRThBQUM3LFxuXHQgICAgICAgICAgICAweDFBOTA4NzQ5LCAweEQ0NEZCRDlBLCAweEQwREFERUNCLCAweEQ1MEFEQTM4LFxuXHQgICAgICAgICAgICAweDAzMzlDMzJBLCAweEM2OTEzNjY3LCAweDhERjkzMTdDLCAweEUwQjEyQjRGLFxuXHQgICAgICAgICAgICAweEY3OUU1OUI3LCAweDQzRjVCQjNBLCAweEYyRDUxOUZGLCAweDI3RDk0NTlDLFxuXHQgICAgICAgICAgICAweEJGOTcyMjJDLCAweDE1RTZGQzJBLCAweDBGOTFGQzcxLCAweDlCOTQxNTI1LFxuXHQgICAgICAgICAgICAweEZBRTU5MzYxLCAweENFQjY5Q0VCLCAweEMyQTg2NDU5LCAweDEyQkFBOEQxLFxuXHQgICAgICAgICAgICAweEI2QzEwNzVFLCAweEUzMDU2QTBDLCAweDEwRDI1MDY1LCAweENCMDNBNDQyLFxuXHQgICAgICAgICAgICAweEUwRUM2RTBFLCAweDE2OThEQjNCLCAweDRDOThBMEJFLCAweDMyNzhFOTY0LFxuXHQgICAgICAgICAgICAweDlGMUY5NTMyLCAweEUwRDM5MkRGLCAweEQzQTAzNDJCLCAweDg5NzFGMjFFLFxuXHQgICAgICAgICAgICAweDFCMEE3NDQxLCAweDRCQTMzNDhDLCAweEM1QkU3MTIwLCAweEMzNzYzMkQ4LFxuXHQgICAgICAgICAgICAweERGMzU5RjhELCAweDlCOTkyRjJFLCAweEU2MEI2RjQ3LCAweDBGRTNGMTFELFxuXHQgICAgICAgICAgICAweEU1NENEQTU0LCAweDFFREFEODkxLCAweENFNjI3OUNGLCAweENEM0U3RTZGLFxuXHQgICAgICAgICAgICAweDE2MThCMTY2LCAweEZEMkMxRDA1LCAweDg0OEZEMkM1LCAweEY2RkIyMjk5LFxuXHQgICAgICAgICAgICAweEY1MjNGMzU3LCAweEE2MzI3NjIzLCAweDkzQTgzNTMxLCAweDU2Q0NDRDAyLFxuXHQgICAgICAgICAgICAweEFDRjA4MTYyLCAweDVBNzVFQkI1LCAweDZFMTYzNjk3LCAweDg4RDI3M0NDLFxuXHQgICAgICAgICAgICAweERFOTY2MjkyLCAweDgxQjk0OUQwLCAweDRDNTA5MDFCLCAweDcxQzY1NjE0LFxuXHQgICAgICAgICAgICAweEU2QzZDN0JELCAweDMyN0ExNDBBLCAweDQ1RTFEMDA2LCAweEMzRjI3QjlBLFxuXHQgICAgICAgICAgICAweEM5QUE1M0ZELCAweDYyQTgwRjAwLCAweEJCMjVCRkUyLCAweDM1QkREMkY2LFxuXHQgICAgICAgICAgICAweDcxMTI2OTA1LCAweEIyMDQwMjIyLCAweEI2Q0JDRjdDLCAweENENzY5QzJCLFxuXHQgICAgICAgICAgICAweDUzMTEzRUMwLCAweDE2NDBFM0QzLCAweDM4QUJCRDYwLCAweDI1NDdBREYwLFxuXHQgICAgICAgICAgICAweEJBMzgyMDlDLCAweEY3NDZDRTc2LCAweDc3QUZBMUM1LCAweDIwNzU2MDYwLFxuXHQgICAgICAgICAgICAweDg1Q0JGRTRFLCAweDhBRTg4REQ4LCAweDdBQUFGOUIwLCAweDRDRjlBQTdFLFxuXHQgICAgICAgICAgICAweDE5NDhDMjVDLCAweDAyRkI4QThDLCAweDAxQzM2QUU0LCAweEQ2RUJFMUY5LFxuXHQgICAgICAgICAgICAweDkwRDRGODY5LCAweEE2NUNERUEwLCAweDNGMDkyNTJELCAweEMyMDhFNjlGLFxuXHQgICAgICAgICAgICAweEI3NEU2MTMyLCAweENFNzdFMjVCLCAweDU3OEZERkUzLCAweDNBQzM3MkU2ICBdXG5cdCAgICBdO1xuXG5cdCAgICB2YXIgQkxPV0ZJU0hfQ1RYID0ge1xuXHQgICAgICAgIHBib3g6IFtdLFxuXHQgICAgICAgIHNib3g6IFtdXG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEYoY3R4LCB4KXtcblx0ICAgICAgICBsZXQgYSA9ICh4ID4+IDI0KSAmIDB4RkY7XG5cdCAgICAgICAgbGV0IGIgPSAoeCA+PiAxNikgJiAweEZGO1xuXHQgICAgICAgIGxldCBjID0gKHggPj4gOCkgJiAweEZGO1xuXHQgICAgICAgIGxldCBkID0geCAmIDB4RkY7XG5cblx0ICAgICAgICBsZXQgeSA9IGN0eC5zYm94WzBdW2FdICsgY3R4LnNib3hbMV1bYl07XG5cdCAgICAgICAgeSA9IHkgXiBjdHguc2JveFsyXVtjXTtcblx0ICAgICAgICB5ID0geSArIGN0eC5zYm94WzNdW2RdO1xuXG5cdCAgICAgICAgcmV0dXJuIHk7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEJsb3dGaXNoX0VuY3J5cHQoY3R4LCBsZWZ0LCByaWdodCl7XG5cdCAgICAgICAgbGV0IFhsID0gbGVmdDtcblx0ICAgICAgICBsZXQgWHIgPSByaWdodDtcblx0ICAgICAgICBsZXQgdGVtcDtcblxuXHQgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBOOyArK2kpe1xuXHQgICAgICAgICAgICBYbCA9IFhsIF4gY3R4LnBib3hbaV07XG5cdCAgICAgICAgICAgIFhyID0gRihjdHgsIFhsKSBeIFhyO1xuXG5cdCAgICAgICAgICAgIHRlbXAgPSBYbDtcblx0ICAgICAgICAgICAgWGwgPSBYcjtcblx0ICAgICAgICAgICAgWHIgPSB0ZW1wO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRlbXAgPSBYbDtcblx0ICAgICAgICBYbCA9IFhyO1xuXHQgICAgICAgIFhyID0gdGVtcDtcblxuXHQgICAgICAgIFhyID0gWHIgXiBjdHgucGJveFtOXTtcblx0ICAgICAgICBYbCA9IFhsIF4gY3R4LnBib3hbTiArIDFdO1xuXG5cdCAgICAgICAgcmV0dXJuIHtsZWZ0OiBYbCwgcmlnaHQ6IFhyfTtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gQmxvd0Zpc2hfRGVjcnlwdChjdHgsIGxlZnQsIHJpZ2h0KXtcblx0ICAgICAgICBsZXQgWGwgPSBsZWZ0O1xuXHQgICAgICAgIGxldCBYciA9IHJpZ2h0O1xuXHQgICAgICAgIGxldCB0ZW1wO1xuXG5cdCAgICAgICAgZm9yKGxldCBpID0gTiArIDE7IGkgPiAxOyAtLWkpe1xuXHQgICAgICAgICAgICBYbCA9IFhsIF4gY3R4LnBib3hbaV07XG5cdCAgICAgICAgICAgIFhyID0gRihjdHgsIFhsKSBeIFhyO1xuXG5cdCAgICAgICAgICAgIHRlbXAgPSBYbDtcblx0ICAgICAgICAgICAgWGwgPSBYcjtcblx0ICAgICAgICAgICAgWHIgPSB0ZW1wO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRlbXAgPSBYbDtcblx0ICAgICAgICBYbCA9IFhyO1xuXHQgICAgICAgIFhyID0gdGVtcDtcblxuXHQgICAgICAgIFhyID0gWHIgXiBjdHgucGJveFsxXTtcblx0ICAgICAgICBYbCA9IFhsIF4gY3R4LnBib3hbMF07XG5cblx0ICAgICAgICByZXR1cm4ge2xlZnQ6IFhsLCByaWdodDogWHJ9O1xuXHQgICAgfVxuXG5cdCAgICAvKipcblx0ICAgICAqIEluaXRpYWxpemF0aW9uIGN0eCdzIHBib3ggYW5kIHNib3guXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGN0eCBUaGUgb2JqZWN0IGhhcyBwYm94IGFuZCBzYm94LlxuXHQgICAgICogQHBhcmFtIHtBcnJheX0ga2V5IEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqIEBwYXJhbSB7aW50fSBrZXlzaXplIFRoZSBsZW5ndGggb2YgdGhlIGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICBCbG93RmlzaEluaXQoQkxPV0ZJU0hfQ1RYLCBrZXksIDEyOC8zMik7XG5cdCAgICAgKi9cblx0ICAgIGZ1bmN0aW9uIEJsb3dGaXNoSW5pdChjdHgsIGtleSwga2V5c2l6ZSlcblx0ICAgIHtcblx0ICAgICAgICBmb3IobGV0IFJvdyA9IDA7IFJvdyA8IDQ7IFJvdysrKVxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgY3R4LnNib3hbUm93XSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IobGV0IENvbCA9IDA7IENvbCA8IDI1NjsgQ29sKyspXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGN0eC5zYm94W1Jvd11bQ29sXSA9IE9SSUdfU1tSb3ddW0NvbF07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICBsZXQga2V5SW5kZXggPSAwO1xuXHQgICAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IE4gKyAyOyBpbmRleCsrKVxuXHQgICAgICAgIHtcblx0ICAgICAgICAgICAgY3R4LnBib3hbaW5kZXhdID0gT1JJR19QW2luZGV4XSBeIGtleVtrZXlJbmRleF07XG5cdCAgICAgICAgICAgIGtleUluZGV4Kys7XG5cdCAgICAgICAgICAgIGlmKGtleUluZGV4ID49IGtleXNpemUpXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGtleUluZGV4ID0gMDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGxldCBEYXRhMSA9IDA7XG5cdCAgICAgICAgbGV0IERhdGEyID0gMDtcblx0ICAgICAgICBsZXQgcmVzID0gMDtcblx0ICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgTiArIDI7IGkgKz0gMilcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIHJlcyA9IEJsb3dGaXNoX0VuY3J5cHQoY3R4LCBEYXRhMSwgRGF0YTIpO1xuXHQgICAgICAgICAgICBEYXRhMSA9IHJlcy5sZWZ0O1xuXHQgICAgICAgICAgICBEYXRhMiA9IHJlcy5yaWdodDtcblx0ICAgICAgICAgICAgY3R4LnBib3hbaV0gPSBEYXRhMTtcblx0ICAgICAgICAgICAgY3R4LnBib3hbaSArIDFdID0gRGF0YTI7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IDQ7IGkrKylcblx0ICAgICAgICB7XG5cdCAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogPCAyNTY7IGogKz0gMilcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgcmVzID0gQmxvd0Zpc2hfRW5jcnlwdChjdHgsIERhdGExLCBEYXRhMik7XG5cdCAgICAgICAgICAgICAgICBEYXRhMSA9IHJlcy5sZWZ0O1xuXHQgICAgICAgICAgICAgICAgRGF0YTIgPSByZXMucmlnaHQ7XG5cdCAgICAgICAgICAgICAgICBjdHguc2JveFtpXVtqXSA9IERhdGExO1xuXHQgICAgICAgICAgICAgICAgY3R4LnNib3hbaV1baiArIDFdID0gRGF0YTI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBCbG93ZmlzaCBibG9jayBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvd2Zpc2ggPSBDX2FsZ28uQmxvd2Zpc2ggPSBCbG9ja0NpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNraXAgcmVzZXQgb2YgblJvdW5kcyBoYXMgYmVlbiBzZXQgYmVmb3JlIGFuZCBrZXkgZGlkIG5vdCBjaGFuZ2Vcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2tleVByaW9yUmVzZXQgPT09IHRoaXMuX2tleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXlQcmlvclJlc2V0ID0gdGhpcy5fa2V5O1xuXHQgICAgICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0ga2V5LnNpZ0J5dGVzIC8gNDtcblxuXHQgICAgICAgICAgICAvL0luaXRpYWxpemF0aW9uIHBib3ggYW5kIHNib3hcblx0ICAgICAgICAgICAgQmxvd0Zpc2hJbml0KEJMT1dGSVNIX0NUWCwga2V5V29yZHMsIGtleVNpemUpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdmFyIHJlcyA9IEJsb3dGaXNoX0VuY3J5cHQoQkxPV0ZJU0hfQ1RYLCBNW29mZnNldF0sIE1bb2Zmc2V0ICsgMV0pO1xuXHQgICAgICAgICAgICBNW29mZnNldF0gPSByZXMubGVmdDtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IHJlcy5yaWdodDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZGVjcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHZhciByZXMgPSBCbG93RmlzaF9EZWNyeXB0KEJMT1dGSVNIX0NUWCwgTVtvZmZzZXRdLCBNW29mZnNldCArIDFdKTtcblx0ICAgICAgICAgICAgTVtvZmZzZXRdID0gcmVzLmxlZnQ7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSByZXMucmlnaHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogNjQvMzIsXG5cblx0ICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDY0LzMyXG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5CbG93ZmlzaC5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkJsb3dmaXNoLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLkJsb3dmaXNoID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihCbG93ZmlzaCk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuQmxvd2Zpc2g7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///43128\n")},43168:(I,g,n)=>{"use strict";I.exports=n.p+"d60a9ad0bc3b8df46324.png"},43240:function(module,exports,__webpack_require__){eval(';(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array\'s data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone "words" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMyNDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMveDY0LWNvcmUuanM/MzI1MiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBYMzJXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogeDY0IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfeDY0ID0gQy54NjQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIDY0LWJpdCB3b3JkLlxuXHQgICAgICovXG5cdCAgICB2YXIgWDY0V29yZCA9IENfeDY0LldvcmQgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIDY0LWJpdCB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggVGhlIGhpZ2ggMzIgYml0cy5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93IFRoZSBsb3cgMzIgYml0cy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHg2NFdvcmQgPSBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgwMDAxMDIwMywgMHgwNDA1MDYwNyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGhpZ2gsIGxvdykge1xuXHQgICAgICAgICAgICB0aGlzLmhpZ2ggPSBoaWdoO1xuXHQgICAgICAgICAgICB0aGlzLmxvdyA9IGxvdztcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBCaXR3aXNlIE5PVHMgdGhpcyB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIG5lZ2F0aW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbmVnYXRlZCA9IHg2NFdvcmQubm90KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgLy8gbm90OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIHZhciBoaWdoID0gfnRoaXMuaGlnaDtcblx0ICAgICAgICAgICAgLy8gdmFyIGxvdyA9IH50aGlzLmxvdztcblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQml0d2lzZSBBTkRzIHRoaXMgd29yZCB3aXRoIHRoZSBwYXNzZWQgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7WDY0V29yZH0gd29yZCBUaGUgeDY0LVdvcmQgdG8gQU5EIHdpdGggdGhpcyB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIEFORGluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGFuZGVkID0geDY0V29yZC5hbmQoYW5vdGhlclg2NFdvcmQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIGFuZDogZnVuY3Rpb24gKHdvcmQpIHtcblx0ICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmhpZ2ggJiB3b3JkLmhpZ2g7XG5cdCAgICAgICAgICAgIC8vIHZhciBsb3cgPSB0aGlzLmxvdyAmIHdvcmQubG93O1xuXG5cdCAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBCaXR3aXNlIE9ScyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1g2NFdvcmR9IHdvcmQgVGhlIHg2NC1Xb3JkIHRvIE9SIHdpdGggdGhpcyB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIE9SaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgb3JlZCA9IHg2NFdvcmQub3IoYW5vdGhlclg2NFdvcmQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIG9yOiBmdW5jdGlvbiAod29yZCkge1xuXHQgICAgICAgICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCB8IHdvcmQuaGlnaDtcblx0ICAgICAgICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93IHwgd29yZC5sb3c7XG5cblx0ICAgICAgICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7XG5cdCAgICAgICAgLy8gfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEJpdHdpc2UgWE9ScyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1g2NFdvcmR9IHdvcmQgVGhlIHg2NC1Xb3JkIHRvIFhPUiB3aXRoIHRoaXMgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBYT1JpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB4b3JlZCA9IHg2NFdvcmQueG9yKGFub3RoZXJYNjRXb3JkKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICAvLyB4b3I6IGZ1bmN0aW9uICh3b3JkKSB7XG5cdCAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5oaWdoIF4gd29yZC5oaWdoO1xuXHQgICAgICAgICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgXiB3b3JkLmxvdztcblxuXHQgICAgICAgICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTtcblx0ICAgICAgICAvLyB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogU2hpZnRzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIGxlZnQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgc2hpZnRpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzaGlmdGVkID0geDY0V29yZC5zaGlmdEwoMjUpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIHNoaWZ0TDogZnVuY3Rpb24gKG4pIHtcblx0ICAgICAgICAgICAgLy8gaWYgKG4gPCAzMikge1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSAodGhpcy5oaWdoIDw8IG4pIHwgKHRoaXMubG93ID4+PiAoMzIgLSBuKSk7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgPDwgbjtcblx0ICAgICAgICAgICAgLy8gfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5sb3cgPDwgKG4gLSAzMik7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgbG93ID0gMDtcblx0ICAgICAgICAgICAgLy8gfVxuXG5cdCAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBTaGlmdHMgdGhpcyB3b3JkIG4gYml0cyB0byB0aGUgcmlnaHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgc2hpZnRpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzaGlmdGVkID0geDY0V29yZC5zaGlmdFIoNyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgLy8gc2hpZnRSOiBmdW5jdGlvbiAobikge1xuXHQgICAgICAgICAgICAvLyBpZiAobiA8IDMyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgbG93ID0gKHRoaXMubG93ID4+PiBuKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbikpO1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmhpZ2ggPj4+IG47XG5cdCAgICAgICAgICAgIC8vIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgbG93ID0gdGhpcy5oaWdoID4+PiAobiAtIDMyKTtcblx0ICAgICAgICAgICAgICAgIC8vIHZhciBoaWdoID0gMDtcblx0ICAgICAgICAgICAgLy8gfVxuXG5cdCAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSb3RhdGVzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIGxlZnQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHJvdGF0aW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcm90YXRlZCA9IHg2NFdvcmQucm90TCgyNSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgLy8gcm90TDogZnVuY3Rpb24gKG4pIHtcblx0ICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuc2hpZnRMKG4pLm9yKHRoaXMuc2hpZnRSKDY0IC0gbikpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSb3RhdGVzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIHJpZ2h0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHJvdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciByb3RhdGluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHJvdGF0ZWQgPSB4NjRXb3JkLnJvdFIoNyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgLy8gcm90UjogZnVuY3Rpb24gKG4pIHtcblx0ICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuc2hpZnRSKG4pLm9yKHRoaXMuc2hpZnRMKDY0IC0gbikpO1xuXHQgICAgICAgIC8vIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIHRoaXMgd29yZCB3aXRoIHRoZSBwYXNzZWQgd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7WDY0V29yZH0gd29yZCBUaGUgeDY0LVdvcmQgdG8gYWRkIHdpdGggdGhpcyB3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIGFkZGluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGFkZGVkID0geDY0V29yZC5hZGQoYW5vdGhlclg2NFdvcmQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIC8vIGFkZDogZnVuY3Rpb24gKHdvcmQpIHtcblx0ICAgICAgICAgICAgLy8gdmFyIGxvdyA9ICh0aGlzLmxvdyArIHdvcmQubG93KSB8IDA7XG5cdCAgICAgICAgICAgIC8vIHZhciBjYXJyeSA9IChsb3cgPj4+IDApIDwgKHRoaXMubG93ID4+PiAwKSA/IDEgOiAwO1xuXHQgICAgICAgICAgICAvLyB2YXIgaGlnaCA9ICh0aGlzLmhpZ2ggKyB3b3JkLmhpZ2ggKyBjYXJyeSkgfCAwO1xuXG5cdCAgICAgICAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpO1xuXHQgICAgICAgIC8vIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDY0LWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgQ3J5cHRvSlMueDY0LldvcmQgb2JqZWN0cy5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaWdCeXRlcyBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFg2NFdvcmRBcnJheSA9IENfeDY0LldvcmRBcnJheSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIChPcHRpb25hbCkgQW4gYXJyYXkgb2YgQ3J5cHRvSlMueDY0LldvcmQgb2JqZWN0cy5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKCk7XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKFtcblx0ICAgICAgICAgKiAgICAgICAgIENyeXB0b0pTLng2NC5Xb3JkLmNyZWF0ZSgweDAwMDEwMjAzLCAweDA0MDUwNjA3KSxcblx0ICAgICAgICAgKiAgICAgICAgIENyeXB0b0pTLng2NC5Xb3JkLmNyZWF0ZSgweDE4MTkxYTFiLCAweDFjMWQxZTFmKVxuXHQgICAgICAgICAqICAgICBdKTtcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMueDY0LldvcmRBcnJheS5jcmVhdGUoW1xuXHQgICAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpLFxuXHQgICAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MTgxOTFhMWIsIDB4MWMxZDFlMWYpXG5cdCAgICAgICAgICogICAgIF0sIDEwKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAod29yZHMsIHNpZ0J5dGVzKSB7XG5cdCAgICAgICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlcztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSB3b3Jkcy5sZW5ndGggKiA4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgNjQtYml0IHdvcmQgYXJyYXkgdG8gYSAzMi1iaXQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NyeXB0b0pTLmxpYi5Xb3JkQXJyYXl9IFRoaXMgd29yZCBhcnJheSdzIGRhdGEgYXMgYSAzMi1iaXQgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHgzMldvcmRBcnJheSA9IHg2NFdvcmRBcnJheS50b1gzMigpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvWDMyOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgeDY0V29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgeDY0V29yZHNMZW5ndGggPSB4NjRXb3Jkcy5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgeDMyV29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4NjRXb3Jkc0xlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgeDY0V29yZCA9IHg2NFdvcmRzW2ldO1xuXHQgICAgICAgICAgICAgICAgeDMyV29yZHMucHVzaCh4NjRXb3JkLmhpZ2gpO1xuXHQgICAgICAgICAgICAgICAgeDMyV29yZHMucHVzaCh4NjRXb3JkLmxvdyk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gWDMyV29yZEFycmF5LmNyZWF0ZSh4MzJXb3JkcywgdGhpcy5zaWdCeXRlcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1g2NFdvcmRBcnJheX0gVGhlIGNsb25lLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSB4NjRXb3JkQXJyYXkuY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gQ2xvbmUgXCJ3b3Jkc1wiIGFycmF5XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IGNsb25lLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTtcblxuXHQgICAgICAgICAgICAvLyBDbG9uZSBlYWNoIFg2NFdvcmQgb2JqZWN0XG5cdCAgICAgICAgICAgIHZhciB3b3Jkc0xlbmd0aCA9IHdvcmRzLmxlbmd0aDtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkc0xlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpXSA9IHdvcmRzW2ldLmNsb25lKCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///43240\n')},43308:(I,g,n)=>{"use strict";I.exports=n.p+"652fffb7c45105afedf7.png"},43386:(I,g,n)=>{"use strict";I.exports=n.p+"53da4667fa5b1e7e9184.png"},43401:(I,g,n)=>{"use strict";I.exports=n.p+"8c0ad5462c0ad3ca81e1.png"},43557:(I,g,n)=>{"use strict";I.exports=n.p+"f23e7d62d3e6ff5d9879.png"},43574:(I,g,n)=>{"use strict";I.exports=n.p+"35b5444ece180cf020d3.png"},43678:(I,g,n)=>{"use strict";I.exports=n.p+"f19ec5dde84ecdbe1832.png"},43714:(I,g,n)=>{"use strict";I.exports=n.p+"624b824da5d8a2835d97.png"},43739:(I,g,n)=>{"use strict";I.exports=n.p+"481e825809dbc55ffebf.png"},43784:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Dutch (Belgium) [nl-be]\n//! author : Joris Röling : https://github.com/jorisroling\n//! author : Jacob Middag : https://github.com/middagj\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var monthsShortWithDots =\n 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),\n monthsShortWithoutDots =\n 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),\n monthsParse = [\n /^jan/i,\n /^feb/i,\n /^(maart|mrt\\.?)$/i,\n /^apr/i,\n /^mei$/i,\n /^jun[i.]?$/i,\n /^jul[i.]?$/i,\n /^aug/i,\n /^sep/i,\n /^okt/i,\n /^nov/i,\n /^dec/i,\n ],\n monthsRegex =\n /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\\.?|feb\\.?|mrt\\.?|apr\\.?|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i;\n\n var nlBe = moment.defineLocale('nl-be', {\n months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(\n '_'\n ),\n monthsShort: function (m, format) {\n if (!m) {\n return monthsShortWithDots;\n } else if (/-MMM-/.test(format)) {\n return monthsShortWithoutDots[m.month()];\n } else {\n return monthsShortWithDots[m.month()];\n }\n },\n\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n monthsStrictRegex:\n /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,\n monthsShortStrictRegex:\n /^(jan\\.?|feb\\.?|mrt\\.?|apr\\.?|mei|ju[nl]\\.?|aug\\.?|sep\\.?|okt\\.?|nov\\.?|dec\\.?)/i,\n\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n\n weekdays:\n 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),\n weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),\n weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[vandaag om] LT',\n nextDay: '[morgen om] LT',\n nextWeek: 'dddd [om] LT',\n lastDay: '[gisteren om] LT',\n lastWeek: '[afgelopen] dddd [om] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'over %s',\n past: '%s geleden',\n s: 'een paar seconden',\n ss: '%d seconden',\n m: 'één minuut',\n mm: '%d minuten',\n h: 'één uur',\n hh: '%d uur',\n d: 'één dag',\n dd: '%d dagen',\n M: 'één maand',\n MM: '%d maanden',\n y: 'één jaar',\n yy: '%d jaar',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(ste|de)/,\n ordinal: function (number) {\n return (\n number +\n (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')\n );\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return nlBe;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM3ODQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qcz9kYjI5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEdXRjaCAoQmVsZ2l1bSkgW25sLWJlXVxuLy8hIGF1dGhvciA6IEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vam9yaXNyb2xpbmdcbi8vISBhdXRob3IgOiBKYWNvYiBNaWRkYWcgOiBodHRwczovL2dpdGh1Yi5jb20vbWlkZGFnalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWVpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tZWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFuL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL14obWFhcnR8bXJ0XFwuPykkL2ksXG4gICAgICAgICAgICAvXmFwci9pLFxuICAgICAgICAgICAgL15tZWkkL2ksXG4gICAgICAgICAgICAvXmp1bltpLl0/JC9pLFxuICAgICAgICAgICAgL15qdWxbaS5dPyQvaSxcbiAgICAgICAgICAgIC9eYXVnL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15va3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRlYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyfGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2k7XG5cbiAgICB2YXIgbmxCZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sLWJlJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd6b19tYV9kaV93b19kb192cl96YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3ZlciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlbicsXG4gICAgICAgICAgICBtOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnw6nDqW4gdXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQ6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGVuJyxcbiAgICAgICAgICAgIHk6ICfDqcOpbiBqYWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubEJlO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43784\n")},43861:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Hindi [hi]\n//! author : Mayank Singhal : https://github.com/mayanksinghal\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '१',\n 2: '२',\n 3: '३',\n 4: '४',\n 5: '५',\n 6: '६',\n 7: '७',\n 8: '८',\n 9: '९',\n 0: '०',\n },\n numberMap = {\n '१': '1',\n '२': '2',\n '३': '3',\n '४': '4',\n '५': '5',\n '६': '6',\n '७': '7',\n '८': '8',\n '९': '9',\n '०': '0',\n },\n monthsParse = [\n /^जन/i,\n /^फ़र|फर/i,\n /^मार्च/i,\n /^अप्रै/i,\n /^मई/i,\n /^जून/i,\n /^जुल/i,\n /^अग/i,\n /^सितं|सित/i,\n /^अक्टू/i,\n /^नव|नवं/i,\n /^दिसं|दिस/i,\n ],\n shortMonthsParse = [\n /^जन/i,\n /^फ़र/i,\n /^मार्च/i,\n /^अप्रै/i,\n /^मई/i,\n /^जून/i,\n /^जुल/i,\n /^अग/i,\n /^सित/i,\n /^अक्टू/i,\n /^नव/i,\n /^दिस/i,\n ];\n\n var hi = moment.defineLocale('hi', {\n months: {\n format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(\n '_'\n ),\n standalone:\n 'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(\n '_'\n ),\n },\n monthsShort:\n 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),\n weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),\n weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),\n weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),\n longDateFormat: {\n LT: 'A h:mm बजे',\n LTS: 'A h:mm:ss बजे',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm बजे',\n LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',\n },\n\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: shortMonthsParse,\n\n monthsRegex:\n /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n monthsShortRegex:\n /^(जनवरी|जन\\.?|फ़रवरी|फरवरी|फ़र\\.?|मार्च?|अप्रैल|अप्रै\\.?|मई?|जून?|जुलाई|जुल\\.?|अगस्त|अग\\.?|सितम्बर|सितंबर|सित\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर|नव\\.?|दिसम्बर|दिसंबर|दिस\\.?)/i,\n\n monthsStrictRegex:\n /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\\.?|अक्टूबर|अक्टू\\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,\n\n monthsShortStrictRegex:\n /^(जन\\.?|फ़र\\.?|मार्च?|अप्रै\\.?|मई?|जून?|जुल\\.?|अग\\.?|सित\\.?|अक्टू\\.?|नव\\.?|दिस\\.?)/i,\n\n calendar: {\n sameDay: '[आज] LT',\n nextDay: '[कल] LT',\n nextWeek: 'dddd, LT',\n lastDay: '[कल] LT',\n lastWeek: '[पिछले] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s में',\n past: '%s पहले',\n s: 'कुछ ही क्षण',\n ss: '%d सेकंड',\n m: 'एक मिनट',\n mm: '%d मिनट',\n h: 'एक घंटा',\n hh: '%d घंटे',\n d: 'एक दिन',\n dd: '%d दिन',\n M: 'एक महीने',\n MM: '%d महीने',\n y: 'एक वर्ष',\n yy: '%d वर्ष',\n },\n preparse: function (string) {\n return string.replace(/[१२३४५६७८९०]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n meridiemParse: /रात|सुबह|दोपहर|शाम/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'रात') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'सुबह') {\n return hour;\n } else if (meridiem === 'दोपहर') {\n return hour >= 10 ? hour : hour + 12;\n } else if (meridiem === 'शाम') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'रात';\n } else if (hour < 10) {\n return 'सुबह';\n } else if (hour < 17) {\n return 'दोपहर';\n } else if (hour < 20) {\n return 'शाम';\n } else {\n return 'रात';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return hi;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM4NjEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qcz9kYzRkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBIaW5kaSBbaGldXG4vLyEgYXV0aG9yIDogTWF5YW5rIFNpbmdoYWwgOiBodHRwczovL2dpdGh1Yi5jb20vbWF5YW5rc2luZ2hhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9e4KSc4KSoL2ksXG4gICAgICAgICAgICAvXuCkq+CkvOCksHzgpKvgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSk4KSCfOCkuOCkv+CkpC9pLFxuICAgICAgICAgICAgL17gpIXgpJXgpY3gpJ/gpYIvaSxcbiAgICAgICAgICAgIC9e4KSo4KS1fOCkqOCkteCkgi9pLFxuICAgICAgICAgICAgL17gpKbgpL/gpLjgpIJ84KSm4KS/4KS4L2ksXG4gICAgICAgIF0sXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXuCknOCkqC9pLFxuICAgICAgICAgICAgL17gpKvgpLzgpLAvaSxcbiAgICAgICAgICAgIC9e4KSu4KS+4KSw4KWN4KSaL2ksXG4gICAgICAgICAgICAvXuCkheCkquCljeCksOCliC9pLFxuICAgICAgICAgICAgL17gpK7gpIgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWC4KSoL2ksXG4gICAgICAgICAgICAvXuCknOClgeCksi9pLFxuICAgICAgICAgICAgL17gpIXgpJcvaSxcbiAgICAgICAgICAgIC9e4KS44KS/4KSkL2ksXG4gICAgICAgICAgICAvXuCkheCkleCljeCkn+Clgi9pLFxuICAgICAgICAgICAgL17gpKjgpLUvaSxcbiAgICAgICAgICAgIC9e4KSm4KS/4KS4L2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgaGkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoaScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KS84KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSu4KWN4KSs4KSwX+CkpuCkv+CkuOCkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4KSc4KSo4KS14KSw4KWAX+Ckq+CksOCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWI4KSyX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+CkuOCljeCkpF/gpLjgpL/gpKTgpILgpKzgpLBf4KSF4KSV4KWN4KSf4KWC4KSs4KSwX+CkqOCkteCkguCkrOCksF/gpKbgpL/gpLjgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpKguX+Ckq+CkvOCksC5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliC5f4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLIuX+CkheCkly5f4KS44KS/4KSkLl/gpIXgpJXgpY3gpJ/gpYIuX+CkqOCktS5f4KSm4KS/4KS4Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfgpLDgpLXgpL/gpLXgpL7gpLBf4KS44KWL4KSu4KS14KS+4KSwX+CkruCkguCkl+CksuCkteCkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSX4KWB4KSw4KWC4KS14KS+4KSwX+CktuClgeCkleCljeCksOCkteCkvuCksF/gpLbgpKjgpL/gpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cksl/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogc2hvcnRNb250aHNQYXJzZSxcblxuICAgICAgICBtb250aHNSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqOCkteCksOClgHzgpJzgpKhcXC4/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYB84KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksnzgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLLgpL7gpIh84KSc4KWB4KSyXFwuP3zgpIXgpJfgpLjgpY3gpKR84KSF4KSXXFwuP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpFxcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksHzgpKjgpLVcXC4/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLB84KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAfOCknOCkqFxcLj984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgHzgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyfOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiHzgpJzgpYHgpLJcXC4/fOCkheCkl+CkuOCljeCkpHzgpIXgpJdcXC4/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwfOCkqOCktVxcLj984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksHzgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiD984KSF4KSX4KS44KWN4KSkP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpD9cXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLA/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLA/KS9pLFxuXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKhcXC4/fOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLJcXC4/fOCkheCkl1xcLj984KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCktVxcLj984KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpKrgpL/gpJvgpLLgpYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4KSu4KWH4KSCJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpKrgpLngpLLgpYcnLFxuICAgICAgICAgICAgczogJ+CkleClgeCkmyDgpLngpYAg4KSV4KWN4KS34KSjJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4KS44KWH4KSV4KSC4KShJyxcbiAgICAgICAgICAgIG06ICfgpI/gpJUg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIGg6ICfgpI/gpJUg4KSY4KSC4KSf4KS+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KSY4KSC4KSf4KWHJyxcbiAgICAgICAgICAgIGQ6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIE06ICfgpI/gpJUg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIHk6ICfgpI/gpJUg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4KS14KSw4KWN4KS3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gSGluZGkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gSGluZGkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKR84KS44KWB4KSs4KS5fOCkpuCli+CkquCkueCksHzgpLbgpL7gpK4vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpYHgpKzgpLknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KWL4KSq4KS54KSwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLbgpL7gpK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpYHgpKzgpLknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCli+CkquCkueCksCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS24KS+4KSuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGk7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///43861\n")},44008:(I,g,n)=>{"use strict";I.exports=n.p+"044eefff5a7a0705a80d.png"},44067:(I,g,n)=>{"use strict";I.exports=n.p+"f6899ecaf9c259abe2a3.png"},44152:(I,g,n)=>{"use strict";I.exports=n.p+"004664a44c4e073f91ca.png"},44184:(I,g,n)=>{"use strict";I.exports=n.p+"614cb4d9c2144d50d98c.png"},44209:(I,g,n)=>{"use strict";I.exports=n.p+"43eba89e503500a257dd.png"},44429:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Bosnian [bs]\n//! author : Nedim Cholich : https://github.com/frontyard\n//! author : Rasid Redzic : https://github.com/rasidre\n//! based on (hr) translation by Bojan Marković\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n switch (key) {\n case 'm':\n return withoutSuffix\n ? 'jedna minuta'\n : isFuture\n ? 'jednu minutu'\n : 'jedne minute';\n }\n }\n\n function translate(number, withoutSuffix, key) {\n var result = number + ' ';\n switch (key) {\n case 'ss':\n if (number === 1) {\n result += 'sekunda';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'sekunde';\n } else {\n result += 'sekundi';\n }\n return result;\n case 'mm':\n if (number === 1) {\n result += 'minuta';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'minute';\n } else {\n result += 'minuta';\n }\n return result;\n case 'h':\n return withoutSuffix ? 'jedan sat' : 'jedan sat';\n case 'hh':\n if (number === 1) {\n result += 'sat';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'sata';\n } else {\n result += 'sati';\n }\n return result;\n case 'dd':\n if (number === 1) {\n result += 'dan';\n } else {\n result += 'dana';\n }\n return result;\n case 'MM':\n if (number === 1) {\n result += 'mjesec';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'mjeseca';\n } else {\n result += 'mjeseci';\n }\n return result;\n case 'yy':\n if (number === 1) {\n result += 'godina';\n } else if (number === 2 || number === 3 || number === 4) {\n result += 'godine';\n } else {\n result += 'godina';\n }\n return result;\n }\n }\n\n var bs = moment.defineLocale('bs', {\n months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n '_'\n ),\n weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd, D. MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[danas u] LT',\n nextDay: '[sutra u] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[u] [nedjelju] [u] LT';\n case 3:\n return '[u] [srijedu] [u] LT';\n case 6:\n return '[u] [subotu] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[u] dddd [u] LT';\n }\n },\n lastDay: '[jučer u] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n case 3:\n return '[prošlu] dddd [u] LT';\n case 6:\n return '[prošle] [subote] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[prošli] dddd [u] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'prije %s',\n s: 'par sekundi',\n ss: translate,\n m: processRelativeTime,\n mm: translate,\n h: translate,\n hh: translate,\n d: 'dan',\n dd: translate,\n M: 'mjesec',\n MM: translate,\n y: 'godinu',\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return bs;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ0MjkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzPzI1NTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJvc25pYW4gW2JzXVxuLy8hIGF1dGhvciA6IE5lZGltIENob2xpY2ggOiBodHRwczovL2dpdGh1Yi5jb20vZnJvbnR5YXJkXG4vLyEgYXV0aG9yIDogUmFzaWQgUmVkemljIDogaHR0cHM6Ly9naXRodWIuY29tL3Jhc2lkcmVcbi8vISBiYXNlZCBvbiAoaHIpIHRyYW5zbGF0aW9uIGJ5IEJvamFuIE1hcmtvdmnEh1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgICAgICAgID8gJ2plZG5hIG1pbnV0YSdcbiAgICAgICAgICAgICAgICAgICAgOiBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2plZG51IG1pbnV0dSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkYW4gc2F0JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBicyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JzJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtamVzZWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///44429\n")},44726:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("/**\n * Copyright (c) 2016-2021, The Cytoscape Consortium.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the “Software”), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar util = _interopDefault(__webpack_require__(20181));\nvar Heap = _interopDefault(__webpack_require__(65731));\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar window$1 = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef\n\nvar navigator = window$1 ? window$1.navigator : null;\nvar document$1 = window$1 ? window$1.document : null;\n\nvar typeofstr = _typeof('');\n\nvar typeofobj = _typeof({});\n\nvar typeoffn = _typeof(function () {});\n\nvar typeofhtmlele = typeof HTMLElement === \"undefined\" ? \"undefined\" : _typeof(HTMLElement);\n\nvar instanceStr = function instanceStr(obj) {\n return obj && obj.instanceString && fn(obj.instanceString) ? obj.instanceString() : null;\n};\n\nvar string = function string(obj) {\n return obj != null && _typeof(obj) == typeofstr;\n};\nvar fn = function fn(obj) {\n return obj != null && _typeof(obj) === typeoffn;\n};\nvar array = function array(obj) {\n return !elementOrCollection(obj) && (Array.isArray ? Array.isArray(obj) : obj != null && obj instanceof Array);\n};\nvar plainObject = function plainObject(obj) {\n return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object;\n};\nvar object = function object(obj) {\n return obj != null && _typeof(obj) === typeofobj;\n};\nvar number = function number(obj) {\n return obj != null && _typeof(obj) === _typeof(1) && !isNaN(obj);\n};\nvar integer = function integer(obj) {\n return number(obj) && Math.floor(obj) === obj;\n};\nvar htmlElement = function htmlElement(obj) {\n if ('undefined' === typeofhtmlele) {\n return undefined;\n } else {\n return null != obj && obj instanceof HTMLElement;\n }\n};\nvar elementOrCollection = function elementOrCollection(obj) {\n return element(obj) || collection(obj);\n};\nvar element = function element(obj) {\n return instanceStr(obj) === 'collection' && obj._private.single;\n};\nvar collection = function collection(obj) {\n return instanceStr(obj) === 'collection' && !obj._private.single;\n};\nvar core = function core(obj) {\n return instanceStr(obj) === 'core';\n};\nvar stylesheet = function stylesheet(obj) {\n return instanceStr(obj) === 'stylesheet';\n};\nvar event = function event(obj) {\n return instanceStr(obj) === 'event';\n};\nvar emptyString = function emptyString(obj) {\n if (obj === undefined || obj === null) {\n // null is empty\n return true;\n } else if (obj === '' || obj.match(/^\\s+$/)) {\n return true; // empty string is empty\n }\n\n return false; // otherwise, we don't know what we've got\n};\nvar domElement = function domElement(obj) {\n if (typeof HTMLElement === 'undefined') {\n return false; // we're not in a browser so it doesn't matter\n } else {\n return obj instanceof HTMLElement;\n }\n};\nvar boundingBox = function boundingBox(obj) {\n return plainObject(obj) && number(obj.x1) && number(obj.x2) && number(obj.y1) && number(obj.y2);\n};\nvar promise = function promise(obj) {\n return object(obj) && fn(obj.then);\n};\nvar ms = function ms() {\n return navigator && navigator.userAgent.match(/msie|trident|edge/i);\n}; // probably a better way to detect this...\n\nvar memoize = function memoize(fn, keyFn) {\n if (!keyFn) {\n keyFn = function keyFn() {\n if (arguments.length === 1) {\n return arguments[0];\n } else if (arguments.length === 0) {\n return 'undefined';\n }\n\n var args = [];\n\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n return args.join('$');\n };\n }\n\n var memoizedFn = function memoizedFn() {\n var self = this;\n var args = arguments;\n var ret;\n var k = keyFn.apply(self, args);\n var cache = memoizedFn.cache;\n\n if (!(ret = cache[k])) {\n ret = cache[k] = fn.apply(self, args);\n }\n\n return ret;\n };\n\n memoizedFn.cache = {};\n return memoizedFn;\n};\n\nvar camel2dash = memoize(function (str) {\n return str.replace(/([A-Z])/g, function (v) {\n return '-' + v.toLowerCase();\n });\n});\nvar dash2camel = memoize(function (str) {\n return str.replace(/(-\\w)/g, function (v) {\n return v[1].toUpperCase();\n });\n});\nvar prependCamel = memoize(function (prefix, str) {\n return prefix + str[0].toUpperCase() + str.substring(1);\n}, function (prefix, str) {\n return prefix + '$' + str;\n});\nvar capitalize = function capitalize(str) {\n if (emptyString(str)) {\n return str;\n }\n\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\nvar number$1 = '(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))';\nvar rgba = 'rgb[a]?\\\\((' + number$1 + '[%]?)\\\\s*,\\\\s*(' + number$1 + '[%]?)\\\\s*,\\\\s*(' + number$1 + '[%]?)(?:\\\\s*,\\\\s*(' + number$1 + '))?\\\\)';\nvar rgbaNoBackRefs = 'rgb[a]?\\\\((?:' + number$1 + '[%]?)\\\\s*,\\\\s*(?:' + number$1 + '[%]?)\\\\s*,\\\\s*(?:' + number$1 + '[%]?)(?:\\\\s*,\\\\s*(?:' + number$1 + '))?\\\\)';\nvar hsla = 'hsl[a]?\\\\((' + number$1 + ')\\\\s*,\\\\s*(' + number$1 + '[%])\\\\s*,\\\\s*(' + number$1 + '[%])(?:\\\\s*,\\\\s*(' + number$1 + '))?\\\\)';\nvar hslaNoBackRefs = 'hsl[a]?\\\\((?:' + number$1 + ')\\\\s*,\\\\s*(?:' + number$1 + '[%])\\\\s*,\\\\s*(?:' + number$1 + '[%])(?:\\\\s*,\\\\s*(?:' + number$1 + '))?\\\\)';\nvar hex3 = '\\\\#[0-9a-fA-F]{3}';\nvar hex6 = '\\\\#[0-9a-fA-F]{6}';\n\nvar ascending = function ascending(a, b) {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n } else {\n return 0;\n }\n};\nvar descending = function descending(a, b) {\n return -1 * ascending(a, b);\n};\n\nvar extend = Object.assign != null ? Object.assign.bind(Object) : function (tgt) {\n var args = arguments;\n\n for (var i = 1; i < args.length; i++) {\n var obj = args[i];\n\n if (obj == null) {\n continue;\n }\n\n var keys = Object.keys(obj);\n\n for (var j = 0; j < keys.length; j++) {\n var k = keys[j];\n tgt[k] = obj[k];\n }\n }\n\n return tgt;\n};\n\nvar hex2tuple = function hex2tuple(hex) {\n if (!(hex.length === 4 || hex.length === 7) || hex[0] !== '#') {\n return;\n }\n\n var shortHex = hex.length === 4;\n var r, g, b;\n var base = 16;\n\n if (shortHex) {\n r = parseInt(hex[1] + hex[1], base);\n g = parseInt(hex[2] + hex[2], base);\n b = parseInt(hex[3] + hex[3], base);\n } else {\n r = parseInt(hex[1] + hex[2], base);\n g = parseInt(hex[3] + hex[4], base);\n b = parseInt(hex[5] + hex[6], base);\n }\n\n return [r, g, b];\n}; // get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0)\n\nvar hsl2tuple = function hsl2tuple(hsl) {\n var ret;\n var h, s, l, a, r, g, b;\n\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n var m = new RegExp('^' + hsla + '$').exec(hsl);\n\n if (m) {\n // get hue\n h = parseInt(m[1]);\n\n if (h < 0) {\n h = (360 - -1 * h % 360) % 360;\n } else if (h > 360) {\n h = h % 360;\n }\n\n h /= 360; // normalise on [0, 1]\n\n s = parseFloat(m[2]);\n\n if (s < 0 || s > 100) {\n return;\n } // saturation is [0, 100]\n\n\n s = s / 100; // normalise on [0, 1]\n\n l = parseFloat(m[3]);\n\n if (l < 0 || l > 100) {\n return;\n } // lightness is [0, 100]\n\n\n l = l / 100; // normalise on [0, 1]\n\n a = m[4];\n\n if (a !== undefined) {\n a = parseFloat(a);\n\n if (a < 0 || a > 1) {\n return;\n } // alpha is [0, 1]\n\n } // now, convert to rgb\n // code from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n\n\n if (s === 0) {\n r = g = b = Math.round(l * 255); // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = Math.round(255 * hue2rgb(p, q, h + 1 / 3));\n g = Math.round(255 * hue2rgb(p, q, h));\n b = Math.round(255 * hue2rgb(p, q, h - 1 / 3));\n }\n\n ret = [r, g, b, a];\n }\n\n return ret;\n}; // get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0)\n\nvar rgb2tuple = function rgb2tuple(rgb) {\n var ret;\n var m = new RegExp('^' + rgba + '$').exec(rgb);\n\n if (m) {\n ret = [];\n var isPct = [];\n\n for (var i = 1; i <= 3; i++) {\n var channel = m[i];\n\n if (channel[channel.length - 1] === '%') {\n isPct[i] = true;\n }\n\n channel = parseFloat(channel);\n\n if (isPct[i]) {\n channel = channel / 100 * 255; // normalise to [0, 255]\n }\n\n if (channel < 0 || channel > 255) {\n return;\n } // invalid channel value\n\n\n ret.push(Math.floor(channel));\n }\n\n var atLeastOneIsPct = isPct[1] || isPct[2] || isPct[3];\n var allArePct = isPct[1] && isPct[2] && isPct[3];\n\n if (atLeastOneIsPct && !allArePct) {\n return;\n } // must all be percent values if one is\n\n\n var alpha = m[4];\n\n if (alpha !== undefined) {\n alpha = parseFloat(alpha);\n\n if (alpha < 0 || alpha > 1) {\n return;\n } // invalid alpha value\n\n\n ret.push(alpha);\n }\n }\n\n return ret;\n};\nvar colorname2tuple = function colorname2tuple(color) {\n return colors[color.toLowerCase()];\n};\nvar color2tuple = function color2tuple(color) {\n return (array(color) ? color : null) || colorname2tuple(color) || hex2tuple(color) || rgb2tuple(color) || hsl2tuple(color);\n};\nvar colors = {\n // special colour names\n transparent: [0, 0, 0, 0],\n // NB alpha === 0\n // regular colours\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n grey: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50]\n};\n\nvar setMap = function setMap(options) {\n var obj = options.map;\n var keys = options.keys;\n var l = keys.length;\n\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n\n if (plainObject(key)) {\n throw Error('Tried to set map with object key');\n }\n\n if (i < keys.length - 1) {\n // extend the map if necessary\n if (obj[key] == null) {\n obj[key] = {};\n }\n\n obj = obj[key];\n } else {\n // set the value\n obj[key] = options.value;\n }\n }\n}; // gets the value in a map even if it's not built in places\n\nvar getMap = function getMap(options) {\n var obj = options.map;\n var keys = options.keys;\n var l = keys.length;\n\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n\n if (plainObject(key)) {\n throw Error('Tried to get map with object key');\n }\n\n obj = obj[key];\n\n if (obj == null) {\n return obj;\n }\n }\n\n return obj;\n}; // deletes the entry in the map\n\nvar performance = window$1 ? window$1.performance : null;\nvar pnow = performance && performance.now ? function () {\n return performance.now();\n} : function () {\n return Date.now();\n};\n\nvar raf = function () {\n if (window$1) {\n if (window$1.requestAnimationFrame) {\n return function (fn) {\n window$1.requestAnimationFrame(fn);\n };\n } else if (window$1.mozRequestAnimationFrame) {\n return function (fn) {\n window$1.mozRequestAnimationFrame(fn);\n };\n } else if (window$1.webkitRequestAnimationFrame) {\n return function (fn) {\n window$1.webkitRequestAnimationFrame(fn);\n };\n } else if (window$1.msRequestAnimationFrame) {\n return function (fn) {\n window$1.msRequestAnimationFrame(fn);\n };\n }\n }\n\n return function (fn) {\n if (fn) {\n setTimeout(function () {\n fn(pnow());\n }, 1000 / 60);\n }\n };\n}();\n\nvar requestAnimationFrame = function requestAnimationFrame(fn) {\n return raf(fn);\n};\nvar performanceNow = pnow;\n\nvar DEFAULT_HASH_SEED = 9261;\nvar K = 65599; // 37 also works pretty well\n\nvar DEFAULT_HASH_SEED_ALT = 5381;\nvar hashIterableInts = function hashIterableInts(iterator) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED;\n // sdbm/string-hash\n var hash = seed;\n var entry;\n\n for (;;) {\n entry = iterator.next();\n\n if (entry.done) {\n break;\n }\n\n hash = hash * K + entry.value | 0;\n }\n\n return hash;\n};\nvar hashInt = function hashInt(num) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED;\n // sdbm/string-hash\n return seed * K + num | 0;\n};\nvar hashIntAlt = function hashIntAlt(num) {\n var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED_ALT;\n // djb2/string-hash\n return (seed << 5) + seed + num | 0;\n};\nvar combineHashes = function combineHashes(hash1, hash2) {\n return hash1 * 0x200000 + hash2;\n};\nvar combineHashesArray = function combineHashesArray(hashes) {\n return hashes[0] * 0x200000 + hashes[1];\n};\nvar hashArrays = function hashArrays(hashes1, hashes2) {\n return [hashInt(hashes1[0], hashes2[0]), hashIntAlt(hashes1[1], hashes2[1])];\n};\nvar hashIntsArray = function hashIntsArray(ints, seed) {\n var entry = {\n value: 0,\n done: false\n };\n var i = 0;\n var length = ints.length;\n var iterator = {\n next: function next() {\n if (i < length) {\n entry.value = ints[i++];\n } else {\n entry.done = true;\n }\n\n return entry;\n }\n };\n return hashIterableInts(iterator, seed);\n};\nvar hashString = function hashString(str, seed) {\n var entry = {\n value: 0,\n done: false\n };\n var i = 0;\n var length = str.length;\n var iterator = {\n next: function next() {\n if (i < length) {\n entry.value = str.charCodeAt(i++);\n } else {\n entry.done = true;\n }\n\n return entry;\n }\n };\n return hashIterableInts(iterator, seed);\n};\nvar hashStrings = function hashStrings() {\n return hashStringsArray(arguments);\n};\nvar hashStringsArray = function hashStringsArray(strs) {\n var hash;\n\n for (var i = 0; i < strs.length; i++) {\n var str = strs[i];\n\n if (i === 0) {\n hash = hashString(str);\n } else {\n hash = hashString(str, hash);\n }\n }\n\n return hash;\n};\n\n/*global console */\nvar warningsEnabled = true;\nvar warnSupported = console.warn != null; // eslint-disable-line no-console\n\nvar traceSupported = console.trace != null; // eslint-disable-line no-console\n\nvar MAX_INT = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar trueify = function trueify() {\n return true;\n};\nvar falsify = function falsify() {\n return false;\n};\nvar zeroify = function zeroify() {\n return 0;\n};\nvar noop = function noop() {};\nvar error = function error(msg) {\n throw new Error(msg);\n};\nvar warnings = function warnings(enabled) {\n if (enabled !== undefined) {\n warningsEnabled = !!enabled;\n } else {\n return warningsEnabled;\n }\n};\nvar warn = function warn(msg) {\n /* eslint-disable no-console */\n if (!warnings()) {\n return;\n }\n\n if (warnSupported) {\n console.warn(msg);\n } else {\n console.log(msg);\n\n if (traceSupported) {\n console.trace();\n }\n }\n};\n/* eslint-enable */\n\nvar clone = function clone(obj) {\n return extend({}, obj);\n}; // gets a shallow copy of the argument\n\nvar copy = function copy(obj) {\n if (obj == null) {\n return obj;\n }\n\n if (array(obj)) {\n return obj.slice();\n } else if (plainObject(obj)) {\n return clone(obj);\n } else {\n return obj;\n }\n};\nvar copyArray = function copyArray(arr) {\n return arr.slice();\n};\nvar uuid = function uuid(a, b\n/* placeholders */\n) {\n for ( // loop :)\n b = a = ''; // b - result , a - numeric letiable\n a++ < 36; //\n b += a * 51 & 52 // if \"a\" is not 9 or 14 or 19 or 24\n ? // return a random number or 4\n (a ^ 15 // if \"a\" is not 15\n ? // genetate a random number from 0 to 15\n 8 ^ Math.random() * (a ^ 20 ? 16 : 4) // unless \"a\" is 20, in which case a random number from 8 to 11\n : 4 // otherwise 4\n ).toString(16) : '-' // in other cases (if \"a\" is 9,14,19,24) insert \"-\"\n ) {\n }\n\n return b;\n};\nvar _staticEmptyObject = {};\nvar staticEmptyObject = function staticEmptyObject() {\n return _staticEmptyObject;\n};\nvar defaults = function defaults(_defaults) {\n var keys = Object.keys(_defaults);\n return function (opts) {\n var filledOpts = {};\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var optVal = opts == null ? undefined : opts[key];\n filledOpts[key] = optVal === undefined ? _defaults[key] : optVal;\n }\n\n return filledOpts;\n };\n};\nvar removeFromArray = function removeFromArray(arr, ele, oneCopy) {\n for (var i = arr.length - 1; i >= 0; i--) {\n if (arr[i] === ele) {\n arr.splice(i, 1);\n\n if (oneCopy) {\n break;\n }\n }\n }\n};\nvar clearArray = function clearArray(arr) {\n arr.splice(0, arr.length);\n};\nvar push = function push(arr, otherArr) {\n for (var i = 0; i < otherArr.length; i++) {\n var el = otherArr[i];\n arr.push(el);\n }\n};\nvar getPrefixedProperty = function getPrefixedProperty(obj, propName, prefix) {\n if (prefix) {\n propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth\n }\n\n return obj[propName];\n};\nvar setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, value) {\n if (prefix) {\n propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth\n }\n\n obj[propName] = value;\n};\n\n/* global Map */\nvar ObjectMap =\n/*#__PURE__*/\nfunction () {\n function ObjectMap() {\n _classCallCheck(this, ObjectMap);\n\n this._obj = {};\n }\n\n _createClass(ObjectMap, [{\n key: \"set\",\n value: function set(key, val) {\n this._obj[key] = val;\n return this;\n }\n }, {\n key: \"delete\",\n value: function _delete(key) {\n this._obj[key] = undefined;\n return this;\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this._obj = {};\n }\n }, {\n key: \"has\",\n value: function has(key) {\n return this._obj[key] !== undefined;\n }\n }, {\n key: \"get\",\n value: function get(key) {\n return this._obj[key];\n }\n }]);\n\n return ObjectMap;\n}();\n\nvar Map$1 = typeof Map !== 'undefined' ? Map : ObjectMap;\n\n/* global Set */\nvar undef = \"undefined\" ;\n\nvar ObjectSet =\n/*#__PURE__*/\nfunction () {\n function ObjectSet(arrayOrObjectSet) {\n _classCallCheck(this, ObjectSet);\n\n this._obj = Object.create(null);\n this.size = 0;\n\n if (arrayOrObjectSet != null) {\n var arr;\n\n if (arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString()) {\n arr = arrayOrObjectSet.toArray();\n } else {\n arr = arrayOrObjectSet;\n }\n\n for (var i = 0; i < arr.length; i++) {\n this.add(arr[i]);\n }\n }\n }\n\n _createClass(ObjectSet, [{\n key: \"instanceString\",\n value: function instanceString() {\n return 'set';\n }\n }, {\n key: \"add\",\n value: function add(val) {\n var o = this._obj;\n\n if (o[val] !== 1) {\n o[val] = 1;\n this.size++;\n }\n }\n }, {\n key: \"delete\",\n value: function _delete(val) {\n var o = this._obj;\n\n if (o[val] === 1) {\n o[val] = 0;\n this.size--;\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this._obj = Object.create(null);\n }\n }, {\n key: \"has\",\n value: function has(val) {\n return this._obj[val] === 1;\n }\n }, {\n key: \"toArray\",\n value: function toArray() {\n var _this = this;\n\n return Object.keys(this._obj).filter(function (key) {\n return _this.has(key);\n });\n }\n }, {\n key: \"forEach\",\n value: function forEach(callback, thisArg) {\n return this.toArray().forEach(callback, thisArg);\n }\n }]);\n\n return ObjectSet;\n}();\n\nvar Set$1 = (typeof Set === \"undefined\" ? \"undefined\" : _typeof(Set)) !== undef ? Set : ObjectSet;\n\nvar Element = function Element(cy, params) {\n var restore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n if (cy === undefined || params === undefined || !core(cy)) {\n error('An element must have a core reference and parameters set');\n return;\n }\n\n var group = params.group; // try to automatically infer the group if unspecified\n\n if (group == null) {\n if (params.data && params.data.source != null && params.data.target != null) {\n group = 'edges';\n } else {\n group = 'nodes';\n }\n } // validate group\n\n\n if (group !== 'nodes' && group !== 'edges') {\n error('An element must be of type `nodes` or `edges`; you specified `' + group + '`');\n return;\n } // make the element array-like, just like a collection\n\n\n this.length = 1;\n this[0] = this; // NOTE: when something is added here, add also to ele.json()\n\n var _p = this._private = {\n cy: cy,\n single: true,\n // indicates this is an element\n data: params.data || {},\n // data object\n position: params.position || {\n x: 0,\n y: 0\n },\n // (x, y) position pair\n autoWidth: undefined,\n // width and height of nodes calculated by the renderer when set to special 'auto' value\n autoHeight: undefined,\n autoPadding: undefined,\n compoundBoundsClean: false,\n // whether the compound dimensions need to be recalculated the next time dimensions are read\n listeners: [],\n // array of bound listeners\n group: group,\n // string; 'nodes' or 'edges'\n style: {},\n // properties as set by the style\n rstyle: {},\n // properties for style sent from the renderer to the core\n styleCxts: [],\n // applied style contexts from the styler\n styleKeys: {},\n // per-group keys of style property values\n removed: true,\n // whether it's inside the vis; true if removed (set true here since we call restore)\n selected: params.selected ? true : false,\n // whether it's selected\n selectable: params.selectable === undefined ? true : params.selectable ? true : false,\n // whether it's selectable\n locked: params.locked ? true : false,\n // whether the element is locked (cannot be moved)\n grabbed: false,\n // whether the element is grabbed by the mouse; renderer sets this privately\n grabbable: params.grabbable === undefined ? true : params.grabbable ? true : false,\n // whether the element can be grabbed\n pannable: params.pannable === undefined ? group === 'edges' ? true : false : params.pannable ? true : false,\n // whether the element has passthrough panning enabled\n active: false,\n // whether the element is active from user interaction\n classes: new Set$1(),\n // map ( className => true )\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n rscratch: {},\n // object in which the renderer can store information\n scratch: params.scratch || {},\n // scratch objects\n edges: [],\n // array of connected edges\n children: [],\n // array of children\n parent: null,\n // parent ref\n traversalCache: {},\n // cache of output of traversal functions\n backgrounding: false,\n // whether background images are loading\n bbCache: null,\n // cache of the current bounding box\n bbCacheShift: {\n x: 0,\n y: 0\n },\n // shift applied to cached bb to be applied on next get\n bodyBounds: null,\n // bounds cache of element body, w/o overlay\n overlayBounds: null,\n // bounds cache of element body, including overlay\n labelBounds: {\n // bounds cache of labels\n all: null,\n source: null,\n target: null,\n main: null\n },\n arrowBounds: {\n // bounds cache of edge arrows\n source: null,\n target: null,\n 'mid-source': null,\n 'mid-target': null\n }\n };\n\n if (_p.position.x == null) {\n _p.position.x = 0;\n }\n\n if (_p.position.y == null) {\n _p.position.y = 0;\n } // renderedPosition overrides if specified\n\n\n if (params.renderedPosition) {\n var rpos = params.renderedPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n _p.position = {\n x: (rpos.x - pan.x) / zoom,\n y: (rpos.y - pan.y) / zoom\n };\n }\n\n var classes = [];\n\n if (array(params.classes)) {\n classes = params.classes;\n } else if (string(params.classes)) {\n classes = params.classes.split(/\\s+/);\n }\n\n for (var i = 0, l = classes.length; i < l; i++) {\n var cls = classes[i];\n\n if (!cls || cls === '') {\n continue;\n }\n\n _p.classes.add(cls);\n }\n\n this.createEmitter();\n var bypass = params.style || params.css;\n\n if (bypass) {\n warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.');\n this.style(bypass);\n }\n\n if (restore === undefined || restore) {\n this.restore();\n }\n};\n\nvar defineSearch = function defineSearch(params) {\n params = {\n bfs: params.bfs || !params.dfs,\n dfs: params.dfs || !params.bfs\n }; // from pseudocode on wikipedia\n\n return function searchFn(roots, fn$1, directed) {\n var options;\n\n if (plainObject(roots) && !elementOrCollection(roots)) {\n options = roots;\n roots = options.roots || options.root;\n fn$1 = options.visit;\n directed = options.directed;\n }\n\n directed = arguments.length === 2 && !fn(fn$1) ? fn$1 : directed;\n fn$1 = fn(fn$1) ? fn$1 : function () {};\n var cy = this._private.cy;\n var v = roots = string(roots) ? this.filter(roots) : roots;\n var Q = [];\n var connectedNodes = [];\n var connectedBy = {};\n var id2depth = {};\n var V = {};\n var j = 0;\n var found;\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges; // enqueue v\n\n\n for (var i = 0; i < v.length; i++) {\n var vi = v[i];\n var viId = vi.id();\n\n if (vi.isNode()) {\n Q.unshift(vi);\n\n if (params.bfs) {\n V[viId] = true;\n connectedNodes.push(vi);\n }\n\n id2depth[viId] = 0;\n }\n }\n\n var _loop2 = function _loop2() {\n var v = params.bfs ? Q.shift() : Q.pop();\n var vId = v.id();\n\n if (params.dfs) {\n if (V[vId]) {\n return \"continue\";\n }\n\n V[vId] = true;\n connectedNodes.push(v);\n }\n\n var depth = id2depth[vId];\n var prevEdge = connectedBy[vId];\n var src = prevEdge != null ? prevEdge.source() : null;\n var tgt = prevEdge != null ? prevEdge.target() : null;\n var prevNode = prevEdge == null ? undefined : v.same(src) ? tgt[0] : src[0];\n var ret = void 0;\n ret = fn$1(v, prevEdge, prevNode, j++, depth);\n\n if (ret === true) {\n found = v;\n return \"break\";\n }\n\n if (ret === false) {\n return \"break\";\n }\n\n var vwEdges = v.connectedEdges().filter(function (e) {\n return (!directed || e.source().same(v)) && edges.has(e);\n });\n\n for (var _i2 = 0; _i2 < vwEdges.length; _i2++) {\n var e = vwEdges[_i2];\n var w = e.connectedNodes().filter(function (n) {\n return !n.same(v) && nodes.has(n);\n });\n var wId = w.id();\n\n if (w.length !== 0 && !V[wId]) {\n w = w[0];\n Q.push(w);\n\n if (params.bfs) {\n V[wId] = true;\n connectedNodes.push(w);\n }\n\n connectedBy[wId] = e;\n id2depth[wId] = id2depth[vId] + 1;\n }\n }\n };\n\n _loop: while (Q.length !== 0) {\n var _ret = _loop2();\n\n switch (_ret) {\n case \"continue\":\n continue;\n\n case \"break\":\n break _loop;\n }\n }\n\n var connectedEles = cy.collection();\n\n for (var _i = 0; _i < connectedNodes.length; _i++) {\n var node = connectedNodes[_i];\n var edge = connectedBy[node.id()];\n\n if (edge != null) {\n connectedEles.push(edge);\n }\n\n connectedEles.push(node);\n }\n\n return {\n path: cy.collection(connectedEles),\n found: cy.collection(found)\n };\n };\n}; // search, spanning trees, etc\n\n\nvar elesfn = {\n breadthFirstSearch: defineSearch({\n bfs: true\n }),\n depthFirstSearch: defineSearch({\n dfs: true\n })\n}; // nice, short mathemathical alias\n\nelesfn.bfs = elesfn.breadthFirstSearch;\nelesfn.dfs = elesfn.depthFirstSearch;\n\nvar dijkstraDefaults = defaults({\n root: null,\n weight: function weight(edge) {\n return 1;\n },\n directed: false\n});\nvar elesfn$1 = {\n dijkstra: function dijkstra(options) {\n if (!plainObject(options)) {\n var args = arguments;\n options = {\n root: args[0],\n weight: args[1],\n directed: args[2]\n };\n }\n\n var _dijkstraDefaults = dijkstraDefaults(options),\n root = _dijkstraDefaults.root,\n weight = _dijkstraDefaults.weight,\n directed = _dijkstraDefaults.directed;\n\n var eles = this;\n var weightFn = weight;\n var source = string(root) ? this.filter(root)[0] : root[0];\n var dist = {};\n var prev = {};\n var knownDist = {};\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n edges.unmergeBy(function (ele) {\n return ele.isLoop();\n });\n\n var getDist = function getDist(node) {\n return dist[node.id()];\n };\n\n var setDist = function setDist(node, d) {\n dist[node.id()] = d;\n Q.updateItem(node);\n };\n\n var Q = new Heap(function (a, b) {\n return getDist(a) - getDist(b);\n });\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n dist[node.id()] = node.same(source) ? 0 : Infinity;\n Q.push(node);\n }\n\n var distBetween = function distBetween(u, v) {\n var uvs = (directed ? u.edgesTo(v) : u.edgesWith(v)).intersect(edges);\n var smallestDistance = Infinity;\n var smallestEdge;\n\n for (var _i = 0; _i < uvs.length; _i++) {\n var edge = uvs[_i];\n\n var _weight = weightFn(edge);\n\n if (_weight < smallestDistance || !smallestEdge) {\n smallestDistance = _weight;\n smallestEdge = edge;\n }\n }\n\n return {\n edge: smallestEdge,\n dist: smallestDistance\n };\n };\n\n while (Q.size() > 0) {\n var u = Q.pop();\n var smalletsDist = getDist(u);\n var uid = u.id();\n knownDist[uid] = smalletsDist;\n\n if (smalletsDist === Infinity) {\n continue;\n }\n\n var neighbors = u.neighborhood().intersect(nodes);\n\n for (var _i2 = 0; _i2 < neighbors.length; _i2++) {\n var v = neighbors[_i2];\n var vid = v.id();\n var vDist = distBetween(u, v);\n var alt = smalletsDist + vDist.dist;\n\n if (alt < getDist(v)) {\n setDist(v, alt);\n prev[vid] = {\n node: u,\n edge: vDist.edge\n };\n }\n } // for\n\n } // while\n\n\n return {\n distanceTo: function distanceTo(node) {\n var target = string(node) ? nodes.filter(node)[0] : node[0];\n return knownDist[target.id()];\n },\n pathTo: function pathTo(node) {\n var target = string(node) ? nodes.filter(node)[0] : node[0];\n var S = [];\n var u = target;\n var uid = u.id();\n\n if (target.length > 0) {\n S.unshift(target);\n\n while (prev[uid]) {\n var p = prev[uid];\n S.unshift(p.edge);\n S.unshift(p.node);\n u = p.node;\n uid = u.id();\n }\n }\n\n return eles.spawn(S);\n }\n };\n }\n};\n\nvar elesfn$2 = {\n // kruskal's algorithm (finds min spanning tree, assuming undirected graph)\n // implemented from pseudocode from wikipedia\n kruskal: function kruskal(weightFn) {\n weightFn = weightFn || function (edge) {\n return 1;\n };\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n var numNodes = nodes.length;\n var forest = new Array(numNodes);\n var A = nodes; // assumes byGroup() creates new collections that can be safely mutated\n\n var findSetIndex = function findSetIndex(ele) {\n for (var i = 0; i < forest.length; i++) {\n var eles = forest[i];\n\n if (eles.has(ele)) {\n return i;\n }\n }\n }; // start with one forest per node\n\n\n for (var i = 0; i < numNodes; i++) {\n forest[i] = this.spawn(nodes[i]);\n }\n\n var S = edges.sort(function (a, b) {\n return weightFn(a) - weightFn(b);\n });\n\n for (var _i = 0; _i < S.length; _i++) {\n var edge = S[_i];\n var u = edge.source()[0];\n var v = edge.target()[0];\n var setUIndex = findSetIndex(u);\n var setVIndex = findSetIndex(v);\n var setU = forest[setUIndex];\n var setV = forest[setVIndex];\n\n if (setUIndex !== setVIndex) {\n A.merge(edge); // combine forests for u and v\n\n setU.merge(setV);\n forest.splice(setVIndex, 1);\n }\n }\n\n return A;\n }\n};\n\nvar aStarDefaults = defaults({\n root: null,\n goal: null,\n weight: function weight(edge) {\n return 1;\n },\n heuristic: function heuristic(edge) {\n return 0;\n },\n directed: false\n});\nvar elesfn$3 = {\n // Implemented from pseudocode from wikipedia\n aStar: function aStar(options) {\n var cy = this.cy();\n\n var _aStarDefaults = aStarDefaults(options),\n root = _aStarDefaults.root,\n goal = _aStarDefaults.goal,\n heuristic = _aStarDefaults.heuristic,\n directed = _aStarDefaults.directed,\n weight = _aStarDefaults.weight;\n\n root = cy.collection(root)[0];\n goal = cy.collection(goal)[0];\n var sid = root.id();\n var tid = goal.id();\n var gScore = {};\n var fScore = {};\n var closedSetIds = {};\n var openSet = new Heap(function (a, b) {\n return fScore[a.id()] - fScore[b.id()];\n });\n var openSetIds = new Set$1();\n var cameFrom = {};\n var cameFromEdge = {};\n\n var addToOpenSet = function addToOpenSet(ele, id) {\n openSet.push(ele);\n openSetIds.add(id);\n };\n\n var cMin, cMinId;\n\n var popFromOpenSet = function popFromOpenSet() {\n cMin = openSet.pop();\n cMinId = cMin.id();\n openSetIds[\"delete\"](cMinId);\n };\n\n var isInOpenSet = function isInOpenSet(id) {\n return openSetIds.has(id);\n };\n\n addToOpenSet(root, sid);\n gScore[sid] = 0;\n fScore[sid] = heuristic(root); // Counter\n\n var steps = 0; // Main loop\n\n while (openSet.size() > 0) {\n popFromOpenSet();\n steps++; // If we've found our goal, then we are done\n\n if (cMinId === tid) {\n var path = [];\n var pathNode = goal;\n var pathNodeId = tid;\n var pathEdge = cameFromEdge[pathNodeId];\n\n for (;;) {\n path.unshift(pathNode);\n\n if (pathEdge != null) {\n path.unshift(pathEdge);\n }\n\n pathNode = cameFrom[pathNodeId];\n\n if (pathNode == null) {\n break;\n }\n\n pathNodeId = pathNode.id();\n pathEdge = cameFromEdge[pathNodeId];\n }\n\n return {\n found: true,\n distance: gScore[cMinId],\n path: this.spawn(path),\n steps: steps\n };\n } // Add cMin to processed nodes\n\n\n closedSetIds[cMinId] = true; // Update scores for neighbors of cMin\n // Take into account if graph is directed or not\n\n var vwEdges = cMin._private.edges;\n\n for (var i = 0; i < vwEdges.length; i++) {\n var e = vwEdges[i]; // edge must be in set of calling eles\n\n if (!this.hasElementWithId(e.id())) {\n continue;\n } // cMin must be the source of edge if directed\n\n\n if (directed && e.data('source') !== cMinId) {\n continue;\n }\n\n var wSrc = e.source();\n var wTgt = e.target();\n var w = wSrc.id() !== cMinId ? wSrc : wTgt;\n var wid = w.id(); // node must be in set of calling eles\n\n if (!this.hasElementWithId(wid)) {\n continue;\n } // if node is in closedSet, ignore it\n\n\n if (closedSetIds[wid]) {\n continue;\n } // New tentative score for node w\n\n\n var tempScore = gScore[cMinId] + weight(e); // Update gScore for node w if:\n // w not present in openSet\n // OR\n // tentative gScore is less than previous value\n // w not in openSet\n\n if (!isInOpenSet(wid)) {\n gScore[wid] = tempScore;\n fScore[wid] = tempScore + heuristic(w);\n addToOpenSet(w, wid);\n cameFrom[wid] = cMin;\n cameFromEdge[wid] = e;\n continue;\n } // w already in openSet, but with greater gScore\n\n\n if (tempScore < gScore[wid]) {\n gScore[wid] = tempScore;\n fScore[wid] = tempScore + heuristic(w);\n cameFrom[wid] = cMin;\n cameFromEdge[wid] = e;\n }\n } // End of neighbors update\n\n } // End of main loop\n // If we've reached here, then we've not reached our goal\n\n\n return {\n found: false,\n distance: undefined,\n path: undefined,\n steps: steps\n };\n }\n}; // elesfn\n\nvar floydWarshallDefaults = defaults({\n weight: function weight(edge) {\n return 1;\n },\n directed: false\n});\nvar elesfn$4 = {\n // Implemented from pseudocode from wikipedia\n floydWarshall: function floydWarshall(options) {\n var cy = this.cy();\n\n var _floydWarshallDefault = floydWarshallDefaults(options),\n weight = _floydWarshallDefault.weight,\n directed = _floydWarshallDefault.directed;\n\n var weightFn = weight;\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n var N = nodes.length;\n var Nsq = N * N;\n\n var indexOf = function indexOf(node) {\n return nodes.indexOf(node);\n };\n\n var atIndex = function atIndex(i) {\n return nodes[i];\n }; // Initialize distance matrix\n\n\n var dist = new Array(Nsq);\n\n for (var n = 0; n < Nsq; n++) {\n var j = n % N;\n var i = (n - j) / N;\n\n if (i === j) {\n dist[n] = 0;\n } else {\n dist[n] = Infinity;\n }\n } // Initialize matrix used for path reconstruction\n // Initialize distance matrix\n\n\n var next = new Array(Nsq);\n var edgeNext = new Array(Nsq); // Process edges\n\n for (var _i = 0; _i < edges.length; _i++) {\n var edge = edges[_i];\n var src = edge.source()[0];\n var tgt = edge.target()[0];\n\n if (src === tgt) {\n continue;\n } // exclude loops\n\n\n var s = indexOf(src);\n var t = indexOf(tgt);\n var st = s * N + t; // source to target index\n\n var _weight = weightFn(edge); // Check if already process another edge between same 2 nodes\n\n\n if (dist[st] > _weight) {\n dist[st] = _weight;\n next[st] = t;\n edgeNext[st] = edge;\n } // If undirected graph, process 'reversed' edge\n\n\n if (!directed) {\n var ts = t * N + s; // target to source index\n\n if (!directed && dist[ts] > _weight) {\n dist[ts] = _weight;\n next[ts] = s;\n edgeNext[ts] = edge;\n }\n }\n } // Main loop\n\n\n for (var k = 0; k < N; k++) {\n for (var _i2 = 0; _i2 < N; _i2++) {\n var ik = _i2 * N + k;\n\n for (var _j = 0; _j < N; _j++) {\n var ij = _i2 * N + _j;\n var kj = k * N + _j;\n\n if (dist[ik] + dist[kj] < dist[ij]) {\n dist[ij] = dist[ik] + dist[kj];\n next[ij] = next[ik];\n }\n }\n }\n }\n\n var getArgEle = function getArgEle(ele) {\n return (string(ele) ? cy.filter(ele) : ele)[0];\n };\n\n var indexOfArgEle = function indexOfArgEle(ele) {\n return indexOf(getArgEle(ele));\n };\n\n var res = {\n distance: function distance(from, to) {\n var i = indexOfArgEle(from);\n var j = indexOfArgEle(to);\n return dist[i * N + j];\n },\n path: function path(from, to) {\n var i = indexOfArgEle(from);\n var j = indexOfArgEle(to);\n var fromNode = atIndex(i);\n\n if (i === j) {\n return fromNode.collection();\n }\n\n if (next[i * N + j] == null) {\n return cy.collection();\n }\n\n var path = cy.collection();\n var prev = i;\n var edge;\n path.merge(fromNode);\n\n while (i !== j) {\n prev = i;\n i = next[i * N + j];\n edge = edgeNext[prev * N + i];\n path.merge(edge);\n path.merge(atIndex(i));\n }\n\n return path;\n }\n };\n return res;\n } // floydWarshall\n\n}; // elesfn\n\nvar bellmanFordDefaults = defaults({\n weight: function weight(edge) {\n return 1;\n },\n directed: false,\n root: null\n});\nvar elesfn$5 = {\n // Implemented from pseudocode from wikipedia\n bellmanFord: function bellmanFord(options) {\n var _this = this;\n\n var _bellmanFordDefaults = bellmanFordDefaults(options),\n weight = _bellmanFordDefaults.weight,\n directed = _bellmanFordDefaults.directed,\n root = _bellmanFordDefaults.root;\n\n var weightFn = weight;\n var eles = this;\n var cy = this.cy();\n\n var _this$byGroup = this.byGroup(),\n edges = _this$byGroup.edges,\n nodes = _this$byGroup.nodes;\n\n var numNodes = nodes.length;\n var infoMap = new Map$1();\n var hasNegativeWeightCycle = false;\n var negativeWeightCycles = [];\n root = cy.collection(root)[0]; // in case selector passed\n\n edges.unmergeBy(function (edge) {\n return edge.isLoop();\n });\n var numEdges = edges.length;\n\n var getInfo = function getInfo(node) {\n var obj = infoMap.get(node.id());\n\n if (!obj) {\n obj = {};\n infoMap.set(node.id(), obj);\n }\n\n return obj;\n };\n\n var getNodeFromTo = function getNodeFromTo(to) {\n return (string(to) ? cy.$(to) : to)[0];\n };\n\n var distanceTo = function distanceTo(to) {\n return getInfo(getNodeFromTo(to)).dist;\n };\n\n var pathTo = function pathTo(to) {\n var thisStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root;\n var end = getNodeFromTo(to);\n var path = [];\n var node = end;\n\n for (;;) {\n if (node == null) {\n return _this.spawn();\n }\n\n var _getInfo = getInfo(node),\n edge = _getInfo.edge,\n pred = _getInfo.pred;\n\n path.unshift(node[0]);\n\n if (node.same(thisStart) && path.length > 0) {\n break;\n }\n\n if (edge != null) {\n path.unshift(edge);\n }\n\n node = pred;\n }\n\n return eles.spawn(path);\n }; // Initializations { dist, pred, edge }\n\n\n for (var i = 0; i < numNodes; i++) {\n var node = nodes[i];\n var info = getInfo(node);\n\n if (node.same(root)) {\n info.dist = 0;\n } else {\n info.dist = Infinity;\n }\n\n info.pred = null;\n info.edge = null;\n } // Edges relaxation\n\n\n var replacedEdge = false;\n\n var checkForEdgeReplacement = function checkForEdgeReplacement(node1, node2, edge, info1, info2, weight) {\n var dist = info1.dist + weight;\n\n if (dist < info2.dist && !edge.same(info1.edge)) {\n info2.dist = dist;\n info2.pred = node1;\n info2.edge = edge;\n replacedEdge = true;\n }\n };\n\n for (var _i = 1; _i < numNodes; _i++) {\n replacedEdge = false;\n\n for (var e = 0; e < numEdges; e++) {\n var edge = edges[e];\n var src = edge.source();\n var tgt = edge.target();\n\n var _weight = weightFn(edge);\n\n var srcInfo = getInfo(src);\n var tgtInfo = getInfo(tgt);\n checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight); // If undirected graph, we need to take into account the 'reverse' edge\n\n if (!directed) {\n checkForEdgeReplacement(tgt, src, edge, tgtInfo, srcInfo, _weight);\n }\n }\n\n if (!replacedEdge) {\n break;\n }\n }\n\n if (replacedEdge) {\n // Check for negative weight cycles\n for (var _e = 0; _e < numEdges; _e++) {\n var _edge = edges[_e];\n\n var _src = _edge.source();\n\n var _tgt = _edge.target();\n\n var _weight2 = weightFn(_edge);\n\n var srcDist = getInfo(_src).dist;\n var tgtDist = getInfo(_tgt).dist;\n\n if (srcDist + _weight2 < tgtDist || !directed && tgtDist + _weight2 < srcDist) {\n warn('Graph contains a negative weight cycle for Bellman-Ford');\n hasNegativeWeightCycle = true;\n break;\n }\n }\n }\n\n return {\n distanceTo: distanceTo,\n pathTo: pathTo,\n hasNegativeWeightCycle: hasNegativeWeightCycle,\n negativeWeightCycles: negativeWeightCycles\n };\n } // bellmanFord\n\n}; // elesfn\n\nvar sqrt2 = Math.sqrt(2); // Function which colapses 2 (meta) nodes into one\n// Updates the remaining edge lists\n// Receives as a paramater the edge which causes the collapse\n\nvar collapse = function collapse(edgeIndex, nodeMap, remainingEdges) {\n if (remainingEdges.length === 0) {\n error(\"Karger-Stein must be run on a connected (sub)graph\");\n }\n\n var edgeInfo = remainingEdges[edgeIndex];\n var sourceIn = edgeInfo[1];\n var targetIn = edgeInfo[2];\n var partition1 = nodeMap[sourceIn];\n var partition2 = nodeMap[targetIn];\n var newEdges = remainingEdges; // re-use array\n // Delete all edges between partition1 and partition2\n\n for (var i = newEdges.length - 1; i >= 0; i--) {\n var edge = newEdges[i];\n var src = edge[1];\n var tgt = edge[2];\n\n if (nodeMap[src] === partition1 && nodeMap[tgt] === partition2 || nodeMap[src] === partition2 && nodeMap[tgt] === partition1) {\n newEdges.splice(i, 1);\n }\n } // All edges pointing to partition2 should now point to partition1\n\n\n for (var _i = 0; _i < newEdges.length; _i++) {\n var _edge = newEdges[_i];\n\n if (_edge[1] === partition2) {\n // Check source\n newEdges[_i] = _edge.slice(); // copy\n\n newEdges[_i][1] = partition1;\n } else if (_edge[2] === partition2) {\n // Check target\n newEdges[_i] = _edge.slice(); // copy\n\n newEdges[_i][2] = partition1;\n }\n } // Move all nodes from partition2 to partition1\n\n\n for (var _i2 = 0; _i2 < nodeMap.length; _i2++) {\n if (nodeMap[_i2] === partition2) {\n nodeMap[_i2] = partition1;\n }\n }\n\n return newEdges;\n}; // Contracts a graph until we reach a certain number of meta nodes\n\n\nvar contractUntil = function contractUntil(metaNodeMap, remainingEdges, size, sizeLimit) {\n while (size > sizeLimit) {\n // Choose an edge randomly\n var edgeIndex = Math.floor(Math.random() * remainingEdges.length); // Collapse graph based on edge\n\n remainingEdges = collapse(edgeIndex, metaNodeMap, remainingEdges);\n size--;\n }\n\n return remainingEdges;\n};\n\nvar elesfn$6 = {\n // Computes the minimum cut of an undirected graph\n // Returns the correct answer with high probability\n kargerStein: function kargerStein() {\n var _this = this;\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n edges.unmergeBy(function (edge) {\n return edge.isLoop();\n });\n var numNodes = nodes.length;\n var numEdges = edges.length;\n var numIter = Math.ceil(Math.pow(Math.log(numNodes) / Math.LN2, 2));\n var stopSize = Math.floor(numNodes / sqrt2);\n\n if (numNodes < 2) {\n error('At least 2 nodes are required for Karger-Stein algorithm');\n return undefined;\n } // Now store edge destination as indexes\n // Format for each edge (edge index, source node index, target node index)\n\n\n var edgeIndexes = [];\n\n for (var i = 0; i < numEdges; i++) {\n var e = edges[i];\n edgeIndexes.push([i, nodes.indexOf(e.source()), nodes.indexOf(e.target())]);\n } // We will store the best cut found here\n\n\n var minCutSize = Infinity;\n var minCutEdgeIndexes = [];\n var minCutNodeMap = new Array(numNodes); // Initial meta node partition\n\n var metaNodeMap = new Array(numNodes);\n var metaNodeMap2 = new Array(numNodes);\n\n var copyNodesMap = function copyNodesMap(from, to) {\n for (var _i3 = 0; _i3 < numNodes; _i3++) {\n to[_i3] = from[_i3];\n }\n }; // Main loop\n\n\n for (var iter = 0; iter <= numIter; iter++) {\n // Reset meta node partition\n for (var _i4 = 0; _i4 < numNodes; _i4++) {\n metaNodeMap[_i4] = _i4;\n } // Contract until stop point (stopSize nodes)\n\n\n var edgesState = contractUntil(metaNodeMap, edgeIndexes.slice(), numNodes, stopSize);\n var edgesState2 = edgesState.slice(); // copy\n // Create a copy of the colapsed nodes state\n\n copyNodesMap(metaNodeMap, metaNodeMap2); // Run 2 iterations starting in the stop state\n\n var res1 = contractUntil(metaNodeMap, edgesState, stopSize, 2);\n var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2); // Is any of the 2 results the best cut so far?\n\n if (res1.length <= res2.length && res1.length < minCutSize) {\n minCutSize = res1.length;\n minCutEdgeIndexes = res1;\n copyNodesMap(metaNodeMap, minCutNodeMap);\n } else if (res2.length <= res1.length && res2.length < minCutSize) {\n minCutSize = res2.length;\n minCutEdgeIndexes = res2;\n copyNodesMap(metaNodeMap2, minCutNodeMap);\n }\n } // end of main loop\n // Construct result\n\n\n var cut = this.spawn(minCutEdgeIndexes.map(function (e) {\n return edges[e[0]];\n }));\n var partition1 = this.spawn();\n var partition2 = this.spawn(); // traverse metaNodeMap for best cut\n\n var witnessNodePartition = minCutNodeMap[0];\n\n for (var _i5 = 0; _i5 < minCutNodeMap.length; _i5++) {\n var partitionId = minCutNodeMap[_i5];\n var node = nodes[_i5];\n\n if (partitionId === witnessNodePartition) {\n partition1.merge(node);\n } else {\n partition2.merge(node);\n }\n } // construct components corresponding to each disjoint subset of nodes\n\n\n var constructComponent = function constructComponent(subset) {\n var component = _this.spawn();\n\n subset.forEach(function (node) {\n component.merge(node);\n node.connectedEdges().forEach(function (edge) {\n // ensure edge is within calling collection and edge is not in cut\n if (_this.contains(edge) && !cut.contains(edge)) {\n component.merge(edge);\n }\n });\n });\n return component;\n };\n\n var components = [constructComponent(partition1), constructComponent(partition2)];\n var ret = {\n cut: cut,\n components: components,\n // n.b. partitions are included to be compatible with the old api spec\n // (could be removed in a future major version)\n partition1: partition1,\n partition2: partition2\n };\n return ret;\n }\n}; // elesfn\n\nvar copyPosition = function copyPosition(p) {\n return {\n x: p.x,\n y: p.y\n };\n};\nvar modelToRenderedPosition = function modelToRenderedPosition(p, zoom, pan) {\n return {\n x: p.x * zoom + pan.x,\n y: p.y * zoom + pan.y\n };\n};\nvar renderedToModelPosition = function renderedToModelPosition(p, zoom, pan) {\n return {\n x: (p.x - pan.x) / zoom,\n y: (p.y - pan.y) / zoom\n };\n};\nvar array2point = function array2point(arr) {\n return {\n x: arr[0],\n y: arr[1]\n };\n};\nvar min = function min(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var min = Infinity;\n\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n\n if (isFinite(val)) {\n min = Math.min(val, min);\n }\n }\n\n return min;\n};\nvar max = function max(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var max = -Infinity;\n\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n\n if (isFinite(val)) {\n max = Math.max(val, max);\n }\n }\n\n return max;\n};\nvar mean = function mean(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var total = 0;\n var n = 0;\n\n for (var i = begin; i < end; i++) {\n var val = arr[i];\n\n if (isFinite(val)) {\n total += val;\n n++;\n }\n }\n\n return total / n;\n};\nvar median = function median(arr) {\n var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length;\n var copy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var sort = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var includeHoles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n if (copy) {\n arr = arr.slice(begin, end);\n } else {\n if (end < arr.length) {\n arr.splice(end, arr.length - end);\n }\n\n if (begin > 0) {\n arr.splice(0, begin);\n }\n } // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start\n\n\n var off = 0; // offset from non-finite values\n\n for (var i = arr.length - 1; i >= 0; i--) {\n var v = arr[i];\n\n if (includeHoles) {\n if (!isFinite(v)) {\n arr[i] = -Infinity;\n off++;\n }\n } else {\n // just remove it if we don't want to consider holes\n arr.splice(i, 1);\n }\n }\n\n if (sort) {\n arr.sort(function (a, b) {\n return a - b;\n }); // requires copy = true if you don't want to change the orig\n }\n\n var len = arr.length;\n var mid = Math.floor(len / 2);\n\n if (len % 2 !== 0) {\n return arr[mid + 1 + off];\n } else {\n return (arr[mid - 1 + off] + arr[mid + off]) / 2;\n }\n};\nvar deg2rad = function deg2rad(deg) {\n return Math.PI * deg / 180;\n};\nvar getAngleFromDisp = function getAngleFromDisp(dispX, dispY) {\n return Math.atan2(dispY, dispX) - Math.PI / 2;\n};\nvar log2 = Math.log2 || function (n) {\n return Math.log(n) / Math.log(2);\n};\nvar signum = function signum(x) {\n if (x > 0) {\n return 1;\n } else if (x < 0) {\n return -1;\n } else {\n return 0;\n }\n};\nvar dist = function dist(p1, p2) {\n return Math.sqrt(sqdist(p1, p2));\n};\nvar sqdist = function sqdist(p1, p2) {\n var dx = p2.x - p1.x;\n var dy = p2.y - p1.y;\n return dx * dx + dy * dy;\n};\nvar inPlaceSumNormalize = function inPlaceSumNormalize(v) {\n var length = v.length; // First, get sum of all elements\n\n var total = 0;\n\n for (var i = 0; i < length; i++) {\n total += v[i];\n } // Now, divide each by the sum of all elements\n\n\n for (var _i = 0; _i < length; _i++) {\n v[_i] = v[_i] / total;\n }\n\n return v;\n};\n\nvar qbezierAt = function qbezierAt(p0, p1, p2, t) {\n return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2;\n};\nvar qbezierPtAt = function qbezierPtAt(p0, p1, p2, t) {\n return {\n x: qbezierAt(p0.x, p1.x, p2.x, t),\n y: qbezierAt(p0.y, p1.y, p2.y, t)\n };\n};\nvar lineAt = function lineAt(p0, p1, t, d) {\n var vec = {\n x: p1.x - p0.x,\n y: p1.y - p0.y\n };\n var vecDist = dist(p0, p1);\n var normVec = {\n x: vec.x / vecDist,\n y: vec.y / vecDist\n };\n t = t == null ? 0 : t;\n d = d != null ? d : t * vecDist;\n return {\n x: p0.x + normVec.x * d,\n y: p0.y + normVec.y * d\n };\n};\nvar bound = function bound(min, val, max) {\n return Math.max(min, Math.min(max, val));\n}; // makes a full bb (x1, y1, x2, y2, w, h) from implicit params\n\nvar makeBoundingBox = function makeBoundingBox(bb) {\n if (bb == null) {\n return {\n x1: Infinity,\n y1: Infinity,\n x2: -Infinity,\n y2: -Infinity,\n w: 0,\n h: 0\n };\n } else if (bb.x1 != null && bb.y1 != null) {\n if (bb.x2 != null && bb.y2 != null && bb.x2 >= bb.x1 && bb.y2 >= bb.y1) {\n return {\n x1: bb.x1,\n y1: bb.y1,\n x2: bb.x2,\n y2: bb.y2,\n w: bb.x2 - bb.x1,\n h: bb.y2 - bb.y1\n };\n } else if (bb.w != null && bb.h != null && bb.w >= 0 && bb.h >= 0) {\n return {\n x1: bb.x1,\n y1: bb.y1,\n x2: bb.x1 + bb.w,\n y2: bb.y1 + bb.h,\n w: bb.w,\n h: bb.h\n };\n }\n }\n};\nvar copyBoundingBox = function copyBoundingBox(bb) {\n return {\n x1: bb.x1,\n x2: bb.x2,\n w: bb.w,\n y1: bb.y1,\n y2: bb.y2,\n h: bb.h\n };\n};\nvar clearBoundingBox = function clearBoundingBox(bb) {\n bb.x1 = Infinity;\n bb.y1 = Infinity;\n bb.x2 = -Infinity;\n bb.y2 = -Infinity;\n bb.w = 0;\n bb.h = 0;\n};\nvar updateBoundingBox = function updateBoundingBox(bb1, bb2) {\n // update bb1 with bb2 bounds\n bb1.x1 = Math.min(bb1.x1, bb2.x1);\n bb1.x2 = Math.max(bb1.x2, bb2.x2);\n bb1.w = bb1.x2 - bb1.x1;\n bb1.y1 = Math.min(bb1.y1, bb2.y1);\n bb1.y2 = Math.max(bb1.y2, bb2.y2);\n bb1.h = bb1.y2 - bb1.y1;\n};\nvar expandBoundingBoxByPoint = function expandBoundingBoxByPoint(bb, x, y) {\n bb.x1 = Math.min(bb.x1, x);\n bb.x2 = Math.max(bb.x2, x);\n bb.w = bb.x2 - bb.x1;\n bb.y1 = Math.min(bb.y1, y);\n bb.y2 = Math.max(bb.y2, y);\n bb.h = bb.y2 - bb.y1;\n};\nvar expandBoundingBox = function expandBoundingBox(bb) {\n var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n bb.x1 -= padding;\n bb.x2 += padding;\n bb.y1 -= padding;\n bb.y2 += padding;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n return bb;\n};\nvar expandBoundingBoxSides = function expandBoundingBoxSides(bb) {\n var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0];\n var top, right, bottom, left;\n\n if (padding.length === 1) {\n top = right = bottom = left = padding[0];\n } else if (padding.length === 2) {\n top = bottom = padding[0];\n left = right = padding[1];\n } else if (padding.length === 4) {\n var _padding = _slicedToArray(padding, 4);\n\n top = _padding[0];\n right = _padding[1];\n bottom = _padding[2];\n left = _padding[3];\n }\n\n bb.x1 -= left;\n bb.x2 += right;\n bb.y1 -= top;\n bb.y2 += bottom;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n return bb;\n};\n\nvar assignBoundingBox = function assignBoundingBox(bb1, bb2) {\n bb1.x1 = bb2.x1;\n bb1.y1 = bb2.y1;\n bb1.x2 = bb2.x2;\n bb1.y2 = bb2.y2;\n bb1.w = bb1.x2 - bb1.x1;\n bb1.h = bb1.y2 - bb1.y1;\n};\nvar boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) {\n // case: one bb to right of other\n if (bb1.x1 > bb2.x2) {\n return false;\n }\n\n if (bb2.x1 > bb1.x2) {\n return false;\n } // case: one bb to left of other\n\n\n if (bb1.x2 < bb2.x1) {\n return false;\n }\n\n if (bb2.x2 < bb1.x1) {\n return false;\n } // case: one bb above other\n\n\n if (bb1.y2 < bb2.y1) {\n return false;\n }\n\n if (bb2.y2 < bb1.y1) {\n return false;\n } // case: one bb below other\n\n\n if (bb1.y1 > bb2.y2) {\n return false;\n }\n\n if (bb2.y1 > bb1.y2) {\n return false;\n } // otherwise, must have some overlap\n\n\n return true;\n};\nvar inBoundingBox = function inBoundingBox(bb, x, y) {\n return bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2;\n};\nvar pointInBoundingBox = function pointInBoundingBox(bb, pt) {\n return inBoundingBox(bb, pt.x, pt.y);\n};\nvar boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) {\n return inBoundingBox(bb1, bb2.x1, bb2.y1) && inBoundingBox(bb1, bb2.x2, bb2.y2);\n};\nvar roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) {\n var cornerRadius = getRoundRectangleRadius(width, height);\n var halfWidth = width / 2;\n var halfHeight = height / 2; // Check intersections with straight line segments\n\n var straightLineIntersections; // Top segment, left to right\n\n {\n var topStartX = nodeX - halfWidth + cornerRadius - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth - cornerRadius + padding;\n var topEndY = topStartY;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n } // Right segment, top to bottom\n\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight + cornerRadius - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false);\n\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n } // Bottom segment, left to right\n\n {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n } // Left segment, top to bottom\n\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight + cornerRadius - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false);\n\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n } // Check intersections with arc segments\n\n var arcIntersections; // Top Left\n\n {\n var topLeftCenterX = nodeX - halfWidth + cornerRadius;\n var topLeftCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle\n\n if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n } // Top Right\n\n {\n var topRightCenterX = nodeX + halfWidth - cornerRadius;\n var topRightCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle\n\n if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n } // Bottom Right\n\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle\n\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n } // Bottom Left\n\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle\n\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n return []; // if nothing\n};\nvar inLineVicinity = function inLineVicinity(x, y, lx1, ly1, lx2, ly2, tolerance) {\n var t = tolerance;\n var x1 = Math.min(lx1, lx2);\n var x2 = Math.max(lx1, lx2);\n var y1 = Math.min(ly1, ly2);\n var y2 = Math.max(ly1, ly2);\n return x1 - t <= x && x <= x2 + t && y1 - t <= y && y <= y2 + t;\n};\nvar inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, tolerance) {\n var bb = {\n x1: Math.min(x1, x3, x2) - tolerance,\n x2: Math.max(x1, x3, x2) + tolerance,\n y1: Math.min(y1, y3, y2) - tolerance,\n y2: Math.max(y1, y3, y2) + tolerance\n }; // if outside the rough bounding box for the bezier, then it can't be a hit\n\n if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) {\n // console.log('bezier out of rough bb')\n return false;\n } else {\n // console.log('do more expensive check');\n return true;\n }\n};\nvar solveQuadratic = function solveQuadratic(a, b, c, val) {\n c -= val;\n var r = b * b - 4 * a * c;\n\n if (r < 0) {\n return [];\n }\n\n var sqrtR = Math.sqrt(r);\n var denom = 2 * a;\n var root1 = (-b + sqrtR) / denom;\n var root2 = (-b - sqrtR) / denom;\n return [root1, root2];\n};\nvar solveCubic = function solveCubic(a, b, c, d, result) {\n // Solves a cubic function, returns root in form [r1, i1, r2, i2, r3, i3], where\n // r is the real component, i is the imaginary component\n // An implementation of the Cardano method from the year 1545\n // http://en.wikipedia.org/wiki/Cubic_function#The_nature_of_the_roots\n var epsilon = 0.00001; // avoid division by zero while keeping the overall expression close in value\n\n if (a === 0) {\n a = epsilon;\n }\n\n b /= a;\n c /= a;\n d /= a;\n var discriminant, q, r, dum1, s, t, term1, r13;\n q = (3.0 * c - b * b) / 9.0;\n r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b));\n r /= 54.0;\n discriminant = q * q * q + r * r;\n result[1] = 0;\n term1 = b / 3.0;\n\n if (discriminant > 0) {\n s = r + Math.sqrt(discriminant);\n s = s < 0 ? -Math.pow(-s, 1.0 / 3.0) : Math.pow(s, 1.0 / 3.0);\n t = r - Math.sqrt(discriminant);\n t = t < 0 ? -Math.pow(-t, 1.0 / 3.0) : Math.pow(t, 1.0 / 3.0);\n result[0] = -term1 + s + t;\n term1 += (s + t) / 2.0;\n result[4] = result[2] = -term1;\n term1 = Math.sqrt(3.0) * (-t + s) / 2;\n result[3] = term1;\n result[5] = -term1;\n return;\n }\n\n result[5] = result[3] = 0;\n\n if (discriminant === 0) {\n r13 = r < 0 ? -Math.pow(-r, 1.0 / 3.0) : Math.pow(r, 1.0 / 3.0);\n result[0] = -term1 + 2.0 * r13;\n result[4] = result[2] = -(r13 + term1);\n return;\n }\n\n q = -q;\n dum1 = q * q * q;\n dum1 = Math.acos(r / Math.sqrt(dum1));\n r13 = 2.0 * Math.sqrt(q);\n result[0] = -term1 + r13 * Math.cos(dum1 / 3.0);\n result[2] = -term1 + r13 * Math.cos((dum1 + 2.0 * Math.PI) / 3.0);\n result[4] = -term1 + r13 * Math.cos((dum1 + 4.0 * Math.PI) / 3.0);\n return;\n};\nvar sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, y2, x3, y3) {\n // Find minimum distance by using the minimum of the distance\n // function between the given point and the curve\n // This gives the coefficients of the resulting cubic equation\n // whose roots tell us where a possible minimum is\n // (Coefficients are divided by 4)\n var a = 1.0 * x1 * x1 - 4 * x1 * x2 + 2 * x1 * x3 + 4 * x2 * x2 - 4 * x2 * x3 + x3 * x3 + y1 * y1 - 4 * y1 * y2 + 2 * y1 * y3 + 4 * y2 * y2 - 4 * y2 * y3 + y3 * y3;\n var b = 1.0 * 9 * x1 * x2 - 3 * x1 * x1 - 3 * x1 * x3 - 6 * x2 * x2 + 3 * x2 * x3 + 9 * y1 * y2 - 3 * y1 * y1 - 3 * y1 * y3 - 6 * y2 * y2 + 3 * y2 * y3;\n var c = 1.0 * 3 * x1 * x1 - 6 * x1 * x2 + x1 * x3 - x1 * x + 2 * x2 * x2 + 2 * x2 * x - x3 * x + 3 * y1 * y1 - 6 * y1 * y2 + y1 * y3 - y1 * y + 2 * y2 * y2 + 2 * y2 * y - y3 * y;\n var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y; // debug(\"coefficients: \" + a / a + \", \" + b / a + \", \" + c / a + \", \" + d / a);\n\n var roots = []; // Use the cubic solving algorithm\n\n solveCubic(a, b, c, d, roots);\n var zeroThreshold = 0.0000001;\n var params = [];\n\n for (var index = 0; index < 6; index += 2) {\n if (Math.abs(roots[index + 1]) < zeroThreshold && roots[index] >= 0 && roots[index] <= 1.0) {\n params.push(roots[index]);\n }\n }\n\n params.push(1.0);\n params.push(0.0);\n var minDistanceSquared = -1;\n var curX, curY, distSquared;\n\n for (var i = 0; i < params.length; i++) {\n curX = Math.pow(1.0 - params[i], 2.0) * x1 + 2.0 * (1 - params[i]) * params[i] * x2 + params[i] * params[i] * x3;\n curY = Math.pow(1 - params[i], 2.0) * y1 + 2 * (1.0 - params[i]) * params[i] * y2 + params[i] * params[i] * y3;\n distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2); // debug('distance for param ' + params[i] + \": \" + Math.sqrt(distSquared));\n\n if (minDistanceSquared >= 0) {\n if (distSquared < minDistanceSquared) {\n minDistanceSquared = distSquared;\n }\n } else {\n minDistanceSquared = distSquared;\n }\n }\n\n return minDistanceSquared;\n};\nvar sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) {\n var offset = [x - x1, y - y1];\n var line = [x2 - x1, y2 - y1];\n var lineSq = line[0] * line[0] + line[1] * line[1];\n var hypSq = offset[0] * offset[0] + offset[1] * offset[1];\n var dotProduct = offset[0] * line[0] + offset[1] * line[1];\n var adjSq = dotProduct * dotProduct / lineSq;\n\n if (dotProduct < 0) {\n return hypSq;\n }\n\n if (adjSq > lineSq) {\n return (x - x2) * (x - x2) + (y - y2) * (y - y2);\n }\n\n return hypSq - adjSq;\n};\nvar pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) {\n var x1, y1, x2, y2;\n var y3; // Intersect with vertical line through (x, y)\n\n var up = 0; // let down = 0;\n\n for (var i = 0; i < points.length / 2; i++) {\n x1 = points[i * 2];\n y1 = points[i * 2 + 1];\n\n if (i + 1 < points.length / 2) {\n x2 = points[(i + 1) * 2];\n y2 = points[(i + 1) * 2 + 1];\n } else {\n x2 = points[(i + 1 - points.length / 2) * 2];\n y2 = points[(i + 1 - points.length / 2) * 2 + 1];\n }\n\n if (x1 == x && x2 == x) ; else if (x1 >= x && x >= x2 || x1 <= x && x <= x2) {\n y3 = (x - x1) / (x2 - x1) * (y2 - y1) + y1;\n\n if (y3 > y) {\n up++;\n } // if( y3 < y ){\n // down++;\n // }\n\n } else {\n continue;\n }\n }\n\n if (up % 2 === 0) {\n return false;\n } else {\n return true;\n }\n};\nvar pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) {\n var transformedPoints = new Array(basePoints.length); // Gives negative angle\n\n var angle;\n\n if (direction[0] != null) {\n angle = Math.atan(direction[1] / direction[0]);\n\n if (direction[0] < 0) {\n angle = angle + Math.PI / 2;\n } else {\n angle = -angle - Math.PI / 2;\n }\n } else {\n angle = direction;\n }\n\n var cos = Math.cos(-angle);\n var sin = Math.sin(-angle); // console.log(\"base: \" + basePoints);\n\n for (var i = 0; i < transformedPoints.length / 2; i++) {\n transformedPoints[i * 2] = width / 2 * (basePoints[i * 2] * cos - basePoints[i * 2 + 1] * sin);\n transformedPoints[i * 2 + 1] = height / 2 * (basePoints[i * 2 + 1] * cos + basePoints[i * 2] * sin);\n transformedPoints[i * 2] += centerX;\n transformedPoints[i * 2 + 1] += centerY;\n }\n\n var points;\n\n if (padding > 0) {\n var expandedLineSet = expandPolygon(transformedPoints, -padding);\n points = joinLines(expandedLineSet);\n } else {\n points = transformedPoints;\n }\n\n return pointInsidePolygonPoints(x, y, points);\n};\nvar pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, centerX, centerY, width, height) {\n var cutPolygonPoints = new Array(basePoints.length);\n var halfW = width / 2;\n var halfH = height / 2;\n var cornerRadius = getRoundPolygonRadius(width, height);\n var squaredCornerRadius = cornerRadius * cornerRadius;\n\n for (var i = 0; i < basePoints.length / 4; i++) {\n var sourceUv = void 0,\n destUv = void 0;\n\n if (i === 0) {\n sourceUv = basePoints.length - 2;\n } else {\n sourceUv = i * 4 - 2;\n }\n\n destUv = i * 4 + 2;\n var px = centerX + halfW * basePoints[i * 4];\n var py = centerY + halfH * basePoints[i * 4 + 1];\n var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1];\n var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2);\n var cp0x = px - offset * basePoints[sourceUv];\n var cp0y = py - offset * basePoints[sourceUv + 1];\n var cp1x = px + offset * basePoints[destUv];\n var cp1y = py + offset * basePoints[destUv + 1];\n cutPolygonPoints[i * 4] = cp0x;\n cutPolygonPoints[i * 4 + 1] = cp0y;\n cutPolygonPoints[i * 4 + 2] = cp1x;\n cutPolygonPoints[i * 4 + 3] = cp1y;\n var orthx = basePoints[sourceUv + 1];\n var orthy = -basePoints[sourceUv];\n var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1];\n\n if (cosAlpha < 0) {\n orthx *= -1;\n orthy *= -1;\n }\n\n var cx = cp0x + orthx * cornerRadius;\n var cy = cp0y + orthy * cornerRadius;\n var squaredDistance = Math.pow(cx - x, 2) + Math.pow(cy - y, 2);\n\n if (squaredDistance <= squaredCornerRadius) {\n return true;\n }\n }\n\n return pointInsidePolygonPoints(x, y, cutPolygonPoints);\n};\nvar joinLines = function joinLines(lineSet) {\n var vertices = new Array(lineSet.length / 2);\n var currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY;\n var nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY;\n\n for (var i = 0; i < lineSet.length / 4; i++) {\n currentLineStartX = lineSet[i * 4];\n currentLineStartY = lineSet[i * 4 + 1];\n currentLineEndX = lineSet[i * 4 + 2];\n currentLineEndY = lineSet[i * 4 + 3];\n\n if (i < lineSet.length / 4 - 1) {\n nextLineStartX = lineSet[(i + 1) * 4];\n nextLineStartY = lineSet[(i + 1) * 4 + 1];\n nextLineEndX = lineSet[(i + 1) * 4 + 2];\n nextLineEndY = lineSet[(i + 1) * 4 + 3];\n } else {\n nextLineStartX = lineSet[0];\n nextLineStartY = lineSet[1];\n nextLineEndX = lineSet[2];\n nextLineEndY = lineSet[3];\n }\n\n var intersection = finiteLinesIntersect(currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY, nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY, true);\n vertices[i * 2] = intersection[0];\n vertices[i * 2 + 1] = intersection[1];\n }\n\n return vertices;\n};\nvar expandPolygon = function expandPolygon(points, pad) {\n var expandedLineSet = new Array(points.length * 2);\n var currentPointX, currentPointY, nextPointX, nextPointY;\n\n for (var i = 0; i < points.length / 2; i++) {\n currentPointX = points[i * 2];\n currentPointY = points[i * 2 + 1];\n\n if (i < points.length / 2 - 1) {\n nextPointX = points[(i + 1) * 2];\n nextPointY = points[(i + 1) * 2 + 1];\n } else {\n nextPointX = points[0];\n nextPointY = points[1];\n } // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY]\n // Assume CCW polygon winding\n\n\n var offsetX = nextPointY - currentPointY;\n var offsetY = -(nextPointX - currentPointX); // Normalize\n\n var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY);\n var normalizedOffsetX = offsetX / offsetLength;\n var normalizedOffsetY = offsetY / offsetLength;\n expandedLineSet[i * 4] = currentPointX + normalizedOffsetX * pad;\n expandedLineSet[i * 4 + 1] = currentPointY + normalizedOffsetY * pad;\n expandedLineSet[i * 4 + 2] = nextPointX + normalizedOffsetX * pad;\n expandedLineSet[i * 4 + 3] = nextPointY + normalizedOffsetY * pad;\n }\n\n return expandedLineSet;\n};\nvar intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, ellipseWradius, ellipseHradius) {\n var dispX = centerX - x;\n var dispY = centerY - y;\n dispX /= ellipseWradius;\n dispY /= ellipseHradius;\n var len = Math.sqrt(dispX * dispX + dispY * dispY);\n var newLength = len - 1;\n\n if (newLength < 0) {\n return [];\n }\n\n var lenProportion = newLength / len;\n return [(centerX - x) * lenProportion + x, (centerY - y) * lenProportion + y];\n};\nvar checkInEllipse = function checkInEllipse(x, y, width, height, centerX, centerY, padding) {\n x -= centerX;\n y -= centerY;\n x /= width / 2 + padding;\n y /= height / 2 + padding;\n return x * x + y * y <= 1;\n}; // Returns intersections of increasing distance from line's start point\n\nvar intersectLineCircle = function intersectLineCircle(x1, y1, x2, y2, centerX, centerY, radius) {\n // Calculate d, direction vector of line\n var d = [x2 - x1, y2 - y1]; // Direction vector of line\n\n var f = [x1 - centerX, y1 - centerY];\n var a = d[0] * d[0] + d[1] * d[1];\n var b = 2 * (f[0] * d[0] + f[1] * d[1]);\n var c = f[0] * f[0] + f[1] * f[1] - radius * radius;\n var discriminant = b * b - 4 * a * c;\n\n if (discriminant < 0) {\n return [];\n }\n\n var t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n var t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n var tMin = Math.min(t1, t2);\n var tMax = Math.max(t1, t2);\n var inRangeParams = [];\n\n if (tMin >= 0 && tMin <= 1) {\n inRangeParams.push(tMin);\n }\n\n if (tMax >= 0 && tMax <= 1) {\n inRangeParams.push(tMax);\n }\n\n if (inRangeParams.length === 0) {\n return [];\n }\n\n var nearIntersectionX = inRangeParams[0] * d[0] + x1;\n var nearIntersectionY = inRangeParams[0] * d[1] + y1;\n\n if (inRangeParams.length > 1) {\n if (inRangeParams[0] == inRangeParams[1]) {\n return [nearIntersectionX, nearIntersectionY];\n } else {\n var farIntersectionX = inRangeParams[1] * d[0] + x1;\n var farIntersectionY = inRangeParams[1] * d[1] + y1;\n return [nearIntersectionX, nearIntersectionY, farIntersectionX, farIntersectionY];\n }\n } else {\n return [nearIntersectionX, nearIntersectionY];\n }\n};\nvar midOfThree = function midOfThree(a, b, c) {\n if (b <= a && a <= c || c <= a && a <= b) {\n return a;\n } else if (a <= b && b <= c || c <= b && b <= a) {\n return b;\n } else {\n return c;\n }\n}; // (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4)\n\nvar finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4, infiniteLines) {\n var dx13 = x1 - x3;\n var dx21 = x2 - x1;\n var dx43 = x4 - x3;\n var dy13 = y1 - y3;\n var dy21 = y2 - y1;\n var dy43 = y4 - y3;\n var ua_t = dx43 * dy13 - dy43 * dx13;\n var ub_t = dx21 * dy13 - dy21 * dx13;\n var u_b = dy43 * dx21 - dx43 * dy21;\n\n if (u_b !== 0) {\n var ua = ua_t / u_b;\n var ub = ub_t / u_b;\n var flptThreshold = 0.001;\n\n var _min = 0 - flptThreshold;\n\n var _max = 1 + flptThreshold;\n\n if (_min <= ua && ua <= _max && _min <= ub && ub <= _max) {\n return [x1 + ua * dx21, y1 + ua * dy21];\n } else {\n if (!infiniteLines) {\n return [];\n } else {\n return [x1 + ua * dx21, y1 + ua * dy21];\n }\n }\n } else {\n if (ua_t === 0 || ub_t === 0) {\n // Parallel, coincident lines. Check if overlap\n // Check endpoint of second line\n if (midOfThree(x1, x2, x4) === x4) {\n return [x4, y4];\n } // Check start point of second line\n\n\n if (midOfThree(x1, x2, x3) === x3) {\n return [x3, y3];\n } // Endpoint of first line\n\n\n if (midOfThree(x3, x4, x2) === x2) {\n return [x2, y2];\n }\n\n return [];\n } else {\n // Parallel, non-coincident\n return [];\n }\n }\n}; // math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding )\n// intersect a node polygon (pts transformed)\n//\n// math.polygonIntersectLine( x, y, basePoints, centerX, centerY )\n// intersect the points (no transform)\n\nvar polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) {\n var intersections = [];\n var intersection;\n var transformedPoints = new Array(basePoints.length);\n var doTransform = true;\n\n if (width == null) {\n doTransform = false;\n }\n\n var points;\n\n if (doTransform) {\n for (var i = 0; i < transformedPoints.length / 2; i++) {\n transformedPoints[i * 2] = basePoints[i * 2] * width + centerX;\n transformedPoints[i * 2 + 1] = basePoints[i * 2 + 1] * height + centerY;\n }\n\n if (padding > 0) {\n var expandedLineSet = expandPolygon(transformedPoints, -padding);\n points = joinLines(expandedLineSet);\n } else {\n points = transformedPoints;\n }\n } else {\n points = basePoints;\n }\n\n var currentX, currentY, nextX, nextY;\n\n for (var _i2 = 0; _i2 < points.length / 2; _i2++) {\n currentX = points[_i2 * 2];\n currentY = points[_i2 * 2 + 1];\n\n if (_i2 < points.length / 2 - 1) {\n nextX = points[(_i2 + 1) * 2];\n nextY = points[(_i2 + 1) * 2 + 1];\n } else {\n nextX = points[0];\n nextY = points[1];\n }\n\n intersection = finiteLinesIntersect(x, y, centerX, centerY, currentX, currentY, nextX, nextY);\n\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n }\n\n return intersections;\n};\nvar roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) {\n var intersections = [];\n var intersection;\n var lines = new Array(basePoints.length);\n var halfW = width / 2;\n var halfH = height / 2;\n var cornerRadius = getRoundPolygonRadius(width, height);\n\n for (var i = 0; i < basePoints.length / 4; i++) {\n var sourceUv = void 0,\n destUv = void 0;\n\n if (i === 0) {\n sourceUv = basePoints.length - 2;\n } else {\n sourceUv = i * 4 - 2;\n }\n\n destUv = i * 4 + 2;\n var px = centerX + halfW * basePoints[i * 4];\n var py = centerY + halfH * basePoints[i * 4 + 1];\n var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1];\n var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2);\n var cp0x = px - offset * basePoints[sourceUv];\n var cp0y = py - offset * basePoints[sourceUv + 1];\n var cp1x = px + offset * basePoints[destUv];\n var cp1y = py + offset * basePoints[destUv + 1];\n\n if (i === 0) {\n lines[basePoints.length - 2] = cp0x;\n lines[basePoints.length - 1] = cp0y;\n } else {\n lines[i * 4 - 2] = cp0x;\n lines[i * 4 - 1] = cp0y;\n }\n\n lines[i * 4] = cp1x;\n lines[i * 4 + 1] = cp1y;\n var orthx = basePoints[sourceUv + 1];\n var orthy = -basePoints[sourceUv];\n var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1];\n\n if (cosAlpha < 0) {\n orthx *= -1;\n orthy *= -1;\n }\n\n var cx = cp0x + orthx * cornerRadius;\n var cy = cp0y + orthy * cornerRadius;\n intersection = intersectLineCircle(x, y, centerX, centerY, cx, cy, cornerRadius);\n\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n }\n\n for (var _i3 = 0; _i3 < lines.length / 4; _i3++) {\n intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[_i3 * 4], lines[_i3 * 4 + 1], lines[_i3 * 4 + 2], lines[_i3 * 4 + 3], false);\n\n if (intersection.length !== 0) {\n intersections.push(intersection[0], intersection[1]);\n }\n }\n\n if (intersections.length > 2) {\n var lowestIntersection = [intersections[0], intersections[1]];\n var lowestSquaredDistance = Math.pow(lowestIntersection[0] - x, 2) + Math.pow(lowestIntersection[1] - y, 2);\n\n for (var _i4 = 1; _i4 < intersections.length / 2; _i4++) {\n var squaredDistance = Math.pow(intersections[_i4 * 2] - x, 2) + Math.pow(intersections[_i4 * 2 + 1] - y, 2);\n\n if (squaredDistance <= lowestSquaredDistance) {\n lowestIntersection[0] = intersections[_i4 * 2];\n lowestIntersection[1] = intersections[_i4 * 2 + 1];\n lowestSquaredDistance = squaredDistance;\n }\n }\n\n return lowestIntersection;\n }\n\n return intersections;\n};\nvar shortenIntersection = function shortenIntersection(intersection, offset, amount) {\n var disp = [intersection[0] - offset[0], intersection[1] - offset[1]];\n var length = Math.sqrt(disp[0] * disp[0] + disp[1] * disp[1]);\n var lenRatio = (length - amount) / length;\n\n if (lenRatio < 0) {\n lenRatio = 0.00001;\n }\n\n return [offset[0] + lenRatio * disp[0], offset[1] + lenRatio * disp[1]];\n};\nvar generateUnitNgonPointsFitToSquare = function generateUnitNgonPointsFitToSquare(sides, rotationRadians) {\n var points = generateUnitNgonPoints(sides, rotationRadians);\n points = fitPolygonToSquare(points);\n return points;\n};\nvar fitPolygonToSquare = function fitPolygonToSquare(points) {\n var x, y;\n var sides = points.length / 2;\n var minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n\n for (var i = 0; i < sides; i++) {\n x = points[2 * i];\n y = points[2 * i + 1];\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n } // stretch factors\n\n\n var sx = 2 / (maxX - minX);\n var sy = 2 / (maxY - minY);\n\n for (var _i5 = 0; _i5 < sides; _i5++) {\n x = points[2 * _i5] = points[2 * _i5] * sx;\n y = points[2 * _i5 + 1] = points[2 * _i5 + 1] * sy;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n if (minY < -1) {\n for (var _i6 = 0; _i6 < sides; _i6++) {\n y = points[2 * _i6 + 1] = points[2 * _i6 + 1] + (-1 - minY);\n }\n }\n\n return points;\n};\nvar generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) {\n var increment = 1.0 / sides * 2 * Math.PI;\n var startAngle = sides % 2 === 0 ? Math.PI / 2.0 + increment / 2.0 : Math.PI / 2.0;\n startAngle += rotationRadians;\n var points = new Array(sides * 2);\n var currentAngle;\n\n for (var i = 0; i < sides; i++) {\n currentAngle = i * increment + startAngle;\n points[2 * i] = Math.cos(currentAngle); // x\n\n points[2 * i + 1] = Math.sin(-currentAngle); // y\n }\n\n return points;\n}; // Set the default radius, unless half of width or height is smaller than default\n\nvar getRoundRectangleRadius = function getRoundRectangleRadius(width, height) {\n return Math.min(width / 4, height / 4, 8);\n}; // Set the default radius\n\nvar getRoundPolygonRadius = function getRoundPolygonRadius(width, height) {\n return Math.min(width / 10, height / 10, 8);\n};\nvar getCutRectangleCornerLength = function getCutRectangleCornerLength() {\n return 8;\n};\nvar bezierPtsToQuadCoeff = function bezierPtsToQuadCoeff(p0, p1, p2) {\n return [p0 - 2 * p1 + p2, 2 * (p1 - p0), p0];\n}; // get curve width, height, and control point position offsets as a percentage of node height / width\n\nvar getBarrelCurveConstants = function getBarrelCurveConstants(width, height) {\n return {\n heightOffset: Math.min(15, 0.05 * height),\n widthOffset: Math.min(100, 0.25 * width),\n ctrlPtOffsetPct: 0.05\n };\n};\n\nvar pageRankDefaults = defaults({\n dampingFactor: 0.8,\n precision: 0.000001,\n iterations: 200,\n weight: function weight(edge) {\n return 1;\n }\n});\nvar elesfn$7 = {\n pageRank: function pageRank(options) {\n var _pageRankDefaults = pageRankDefaults(options),\n dampingFactor = _pageRankDefaults.dampingFactor,\n precision = _pageRankDefaults.precision,\n iterations = _pageRankDefaults.iterations,\n weight = _pageRankDefaults.weight;\n\n var cy = this._private.cy;\n\n var _this$byGroup = this.byGroup(),\n nodes = _this$byGroup.nodes,\n edges = _this$byGroup.edges;\n\n var numNodes = nodes.length;\n var numNodesSqd = numNodes * numNodes;\n var numEdges = edges.length; // Construct transposed adjacency matrix\n // First lets have a zeroed matrix of the right size\n // We'll also keep track of the sum of each column\n\n var matrix = new Array(numNodesSqd);\n var columnSum = new Array(numNodes);\n var additionalProb = (1 - dampingFactor) / numNodes; // Create null matrix\n\n for (var i = 0; i < numNodes; i++) {\n for (var j = 0; j < numNodes; j++) {\n var n = i * numNodes + j;\n matrix[n] = 0;\n }\n\n columnSum[i] = 0;\n } // Now, process edges\n\n\n for (var _i = 0; _i < numEdges; _i++) {\n var edge = edges[_i];\n var srcId = edge.data('source');\n var tgtId = edge.data('target'); // Don't include loops in the matrix\n\n if (srcId === tgtId) {\n continue;\n }\n\n var s = nodes.indexOfId(srcId);\n var t = nodes.indexOfId(tgtId);\n var w = weight(edge);\n\n var _n = t * numNodes + s; // Update matrix\n\n\n matrix[_n] += w; // Update column sum\n\n columnSum[s] += w;\n } // Add additional probability based on damping factor\n // Also, take into account columns that have sum = 0\n\n\n var p = 1.0 / numNodes + additionalProb; // Shorthand\n // Traverse matrix, column by column\n\n for (var _j = 0; _j < numNodes; _j++) {\n if (columnSum[_j] === 0) {\n // No 'links' out from node jth, assume equal probability for each possible node\n for (var _i2 = 0; _i2 < numNodes; _i2++) {\n var _n2 = _i2 * numNodes + _j;\n\n matrix[_n2] = p;\n }\n } else {\n // Node jth has outgoing link, compute normalized probabilities\n for (var _i3 = 0; _i3 < numNodes; _i3++) {\n var _n3 = _i3 * numNodes + _j;\n\n matrix[_n3] = matrix[_n3] / columnSum[_j] + additionalProb;\n }\n }\n } // Compute dominant eigenvector using power method\n\n\n var eigenvector = new Array(numNodes);\n var temp = new Array(numNodes);\n var previous; // Start with a vector of all 1's\n // Also, initialize a null vector which will be used as shorthand\n\n for (var _i4 = 0; _i4 < numNodes; _i4++) {\n eigenvector[_i4] = 1;\n }\n\n for (var iter = 0; iter < iterations; iter++) {\n // Temp array with all 0's\n for (var _i5 = 0; _i5 < numNodes; _i5++) {\n temp[_i5] = 0;\n } // Multiply matrix with previous result\n\n\n for (var _i6 = 0; _i6 < numNodes; _i6++) {\n for (var _j2 = 0; _j2 < numNodes; _j2++) {\n var _n4 = _i6 * numNodes + _j2;\n\n temp[_i6] += matrix[_n4] * eigenvector[_j2];\n }\n }\n\n inPlaceSumNormalize(temp);\n previous = eigenvector;\n eigenvector = temp;\n temp = previous;\n var diff = 0; // Compute difference (squared module) of both vectors\n\n for (var _i7 = 0; _i7 < numNodes; _i7++) {\n var delta = previous[_i7] - eigenvector[_i7];\n diff += delta * delta;\n } // If difference is less than the desired threshold, stop iterating\n\n\n if (diff < precision) {\n break;\n }\n } // Construct result\n\n\n var res = {\n rank: function rank(node) {\n node = cy.collection(node)[0];\n return eigenvector[nodes.indexOf(node)];\n }\n };\n return res;\n } // pageRank\n\n}; // elesfn\n\nvar defaults$1 = defaults({\n root: null,\n weight: function weight(edge) {\n return 1;\n },\n directed: false,\n alpha: 0\n});\nvar elesfn$8 = {\n degreeCentralityNormalized: function degreeCentralityNormalized(options) {\n options = defaults$1(options);\n var cy = this.cy();\n var nodes = this.nodes();\n var numNodes = nodes.length;\n\n if (!options.directed) {\n var degrees = {};\n var maxDegree = 0;\n\n for (var i = 0; i < numNodes; i++) {\n var node = nodes[i]; // add current node to the current options object and call degreeCentrality\n\n options.root = node;\n var currDegree = this.degreeCentrality(options);\n\n if (maxDegree < currDegree.degree) {\n maxDegree = currDegree.degree;\n }\n\n degrees[node.id()] = currDegree.degree;\n }\n\n return {\n degree: function degree(node) {\n if (maxDegree === 0) {\n return 0;\n }\n\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n\n return degrees[node.id()] / maxDegree;\n }\n };\n } else {\n var indegrees = {};\n var outdegrees = {};\n var maxIndegree = 0;\n var maxOutdegree = 0;\n\n for (var _i = 0; _i < numNodes; _i++) {\n var _node = nodes[_i];\n\n var id = _node.id(); // add current node to the current options object and call degreeCentrality\n\n\n options.root = _node;\n\n var _currDegree = this.degreeCentrality(options);\n\n if (maxIndegree < _currDegree.indegree) maxIndegree = _currDegree.indegree;\n if (maxOutdegree < _currDegree.outdegree) maxOutdegree = _currDegree.outdegree;\n indegrees[id] = _currDegree.indegree;\n outdegrees[id] = _currDegree.outdegree;\n }\n\n return {\n indegree: function indegree(node) {\n if (maxIndegree == 0) {\n return 0;\n }\n\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n\n return indegrees[node.id()] / maxIndegree;\n },\n outdegree: function outdegree(node) {\n if (maxOutdegree === 0) {\n return 0;\n }\n\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node);\n }\n\n return outdegrees[node.id()] / maxOutdegree;\n }\n };\n }\n },\n // degreeCentralityNormalized\n // Implemented from the algorithm in Opsahl's paper\n // \"Node centrality in weighted networks: Generalizing degree and shortest paths\"\n // check the heading 2 \"Degree\"\n degreeCentrality: function degreeCentrality(options) {\n options = defaults$1(options);\n var cy = this.cy();\n var callingEles = this;\n var _options = options,\n root = _options.root,\n weight = _options.weight,\n directed = _options.directed,\n alpha = _options.alpha;\n root = cy.collection(root)[0];\n\n if (!directed) {\n var connEdges = root.connectedEdges().intersection(callingEles);\n var k = connEdges.length;\n var s = 0; // Now, sum edge weights\n\n for (var i = 0; i < connEdges.length; i++) {\n s += weight(connEdges[i]);\n }\n\n return {\n degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha)\n };\n } else {\n var edges = root.connectedEdges();\n var incoming = edges.filter(function (edge) {\n return edge.target().same(root) && callingEles.has(edge);\n });\n var outgoing = edges.filter(function (edge) {\n return edge.source().same(root) && callingEles.has(edge);\n });\n var k_in = incoming.length;\n var k_out = outgoing.length;\n var s_in = 0;\n var s_out = 0; // Now, sum incoming edge weights\n\n for (var _i2 = 0; _i2 < incoming.length; _i2++) {\n s_in += weight(incoming[_i2]);\n } // Now, sum outgoing edge weights\n\n\n for (var _i3 = 0; _i3 < outgoing.length; _i3++) {\n s_out += weight(outgoing[_i3]);\n }\n\n return {\n indegree: Math.pow(k_in, 1 - alpha) * Math.pow(s_in, alpha),\n outdegree: Math.pow(k_out, 1 - alpha) * Math.pow(s_out, alpha)\n };\n }\n } // degreeCentrality\n\n}; // elesfn\n// nice, short mathemathical alias\n\nelesfn$8.dc = elesfn$8.degreeCentrality;\nelesfn$8.dcn = elesfn$8.degreeCentralityNormalised = elesfn$8.degreeCentralityNormalized;\n\nvar defaults$2 = defaults({\n harmonic: true,\n weight: function weight() {\n return 1;\n },\n directed: false,\n root: null\n});\nvar elesfn$9 = {\n closenessCentralityNormalized: function closenessCentralityNormalized(options) {\n var _defaults = defaults$2(options),\n harmonic = _defaults.harmonic,\n weight = _defaults.weight,\n directed = _defaults.directed;\n\n var cy = this.cy();\n var closenesses = {};\n var maxCloseness = 0;\n var nodes = this.nodes();\n var fw = this.floydWarshall({\n weight: weight,\n directed: directed\n }); // Compute closeness for every node and find the maximum closeness\n\n for (var i = 0; i < nodes.length; i++) {\n var currCloseness = 0;\n var node_i = nodes[i];\n\n for (var j = 0; j < nodes.length; j++) {\n if (i !== j) {\n var d = fw.distance(node_i, nodes[j]);\n\n if (harmonic) {\n currCloseness += 1 / d;\n } else {\n currCloseness += d;\n }\n }\n }\n\n if (!harmonic) {\n currCloseness = 1 / currCloseness;\n }\n\n if (maxCloseness < currCloseness) {\n maxCloseness = currCloseness;\n }\n\n closenesses[node_i.id()] = currCloseness;\n }\n\n return {\n closeness: function closeness(node) {\n if (maxCloseness == 0) {\n return 0;\n }\n\n if (string(node)) {\n // from is a selector string\n node = cy.filter(node)[0].id();\n } else {\n // from is a node\n node = node.id();\n }\n\n return closenesses[node] / maxCloseness;\n }\n };\n },\n // Implemented from pseudocode from wikipedia\n closenessCentrality: function closenessCentrality(options) {\n var _defaults2 = defaults$2(options),\n root = _defaults2.root,\n weight = _defaults2.weight,\n directed = _defaults2.directed,\n harmonic = _defaults2.harmonic;\n\n root = this.filter(root)[0]; // we need distance from this node to every other node\n\n var dijkstra = this.dijkstra({\n root: root,\n weight: weight,\n directed: directed\n });\n var totalDistance = 0;\n var nodes = this.nodes();\n\n for (var i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n\n if (!n.same(root)) {\n var d = dijkstra.distanceTo(n);\n\n if (harmonic) {\n totalDistance += 1 / d;\n } else {\n totalDistance += d;\n }\n }\n }\n\n return harmonic ? totalDistance : 1 / totalDistance;\n } // closenessCentrality\n\n}; // elesfn\n// nice, short mathemathical alias\n\nelesfn$9.cc = elesfn$9.closenessCentrality;\nelesfn$9.ccn = elesfn$9.closenessCentralityNormalised = elesfn$9.closenessCentralityNormalized;\n\nvar defaults$3 = defaults({\n weight: null,\n directed: false\n});\nvar elesfn$a = {\n // Implemented from the algorithm in the paper \"On Variants of Shortest-Path Betweenness Centrality and their Generic Computation\" by Ulrik Brandes\n betweennessCentrality: function betweennessCentrality(options) {\n var _defaults = defaults$3(options),\n directed = _defaults.directed,\n weight = _defaults.weight;\n\n var weighted = weight != null;\n var cy = this.cy(); // starting\n\n var V = this.nodes();\n var A = {};\n var _C = {};\n var max = 0;\n var C = {\n set: function set(key, val) {\n _C[key] = val;\n\n if (val > max) {\n max = val;\n }\n },\n get: function get(key) {\n return _C[key];\n }\n }; // A contains the neighborhoods of every node\n\n for (var i = 0; i < V.length; i++) {\n var v = V[i];\n var vid = v.id();\n\n if (directed) {\n A[vid] = v.outgoers().nodes(); // get outgoers of every node\n } else {\n A[vid] = v.openNeighborhood().nodes(); // get neighbors of every node\n }\n\n C.set(vid, 0);\n }\n\n var _loop = function _loop(s) {\n var sid = V[s].id();\n var S = []; // stack\n\n var P = {};\n var g = {};\n var d = {};\n var Q = new Heap(function (a, b) {\n return d[a] - d[b];\n }); // queue\n // init dictionaries\n\n for (var _i = 0; _i < V.length; _i++) {\n var _vid = V[_i].id();\n\n P[_vid] = [];\n g[_vid] = 0;\n d[_vid] = Infinity;\n }\n\n g[sid] = 1; // sigma\n\n d[sid] = 0; // distance to s\n\n Q.push(sid);\n\n while (!Q.empty()) {\n var _v = Q.pop();\n\n S.push(_v);\n\n if (weighted) {\n for (var j = 0; j < A[_v].length; j++) {\n var w = A[_v][j];\n var vEle = cy.getElementById(_v);\n var edge = void 0;\n\n if (vEle.edgesTo(w).length > 0) {\n edge = vEle.edgesTo(w)[0];\n } else {\n edge = w.edgesTo(vEle)[0];\n }\n\n var edgeWeight = weight(edge);\n w = w.id();\n\n if (d[w] > d[_v] + edgeWeight) {\n d[w] = d[_v] + edgeWeight;\n\n if (Q.nodes.indexOf(w) < 0) {\n //if w is not in Q\n Q.push(w);\n } else {\n // update position if w is in Q\n Q.updateItem(w);\n }\n\n g[w] = 0;\n P[w] = [];\n }\n\n if (d[w] == d[_v] + edgeWeight) {\n g[w] = g[w] + g[_v];\n P[w].push(_v);\n }\n }\n } else {\n for (var _j = 0; _j < A[_v].length; _j++) {\n var _w = A[_v][_j].id();\n\n if (d[_w] == Infinity) {\n Q.push(_w);\n d[_w] = d[_v] + 1;\n }\n\n if (d[_w] == d[_v] + 1) {\n g[_w] = g[_w] + g[_v];\n\n P[_w].push(_v);\n }\n }\n }\n }\n\n var e = {};\n\n for (var _i2 = 0; _i2 < V.length; _i2++) {\n e[V[_i2].id()] = 0;\n }\n\n while (S.length > 0) {\n var _w2 = S.pop();\n\n for (var _j2 = 0; _j2 < P[_w2].length; _j2++) {\n var _v2 = P[_w2][_j2];\n e[_v2] = e[_v2] + g[_v2] / g[_w2] * (1 + e[_w2]);\n }\n\n if (_w2 != V[s].id()) {\n C.set(_w2, C.get(_w2) + e[_w2]);\n }\n }\n };\n\n for (var s = 0; s < V.length; s++) {\n _loop(s);\n }\n\n var ret = {\n betweenness: function betweenness(node) {\n var id = cy.collection(node).id();\n return C.get(id);\n },\n betweennessNormalized: function betweennessNormalized(node) {\n if (max == 0) {\n return 0;\n }\n\n var id = cy.collection(node).id();\n return C.get(id) / max;\n }\n }; // alias\n\n ret.betweennessNormalised = ret.betweennessNormalized;\n return ret;\n } // betweennessCentrality\n\n}; // elesfn\n// nice, short mathemathical alias\n\nelesfn$a.bc = elesfn$a.betweennessCentrality;\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\n/* eslint-disable no-unused-vars */\n\nvar defaults$4 = defaults({\n expandFactor: 2,\n // affects time of computation and cluster granularity to some extent: M * M\n inflateFactor: 2,\n // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j)\n multFactor: 1,\n // optional self loops for each node. Use a neutral value to improve cluster computations.\n maxIterations: 20,\n // maximum number of iterations of the MCL algorithm in a single run\n attributes: [// attributes/features used to group nodes, ie. similarity values between nodes\n function (edge) {\n return 1;\n }]\n});\n/* eslint-enable */\n\nvar setOptions = function setOptions(options) {\n return defaults$4(options);\n};\n/* eslint-enable */\n\n\nvar getSimilarity = function getSimilarity(edge, attributes) {\n var total = 0;\n\n for (var i = 0; i < attributes.length; i++) {\n total += attributes[i](edge);\n }\n\n return total;\n};\n\nvar addLoops = function addLoops(M, n, val) {\n for (var i = 0; i < n; i++) {\n M[i * n + i] = val;\n }\n};\n\nvar normalize = function normalize(M, n) {\n var sum;\n\n for (var col = 0; col < n; col++) {\n sum = 0;\n\n for (var row = 0; row < n; row++) {\n sum += M[row * n + col];\n }\n\n for (var _row = 0; _row < n; _row++) {\n M[_row * n + col] = M[_row * n + col] / sum;\n }\n }\n}; // TODO: blocked matrix multiplication?\n\n\nvar mmult = function mmult(A, B, n) {\n var C = new Array(n * n);\n\n for (var i = 0; i < n; i++) {\n for (var j = 0; j < n; j++) {\n C[i * n + j] = 0;\n }\n\n for (var k = 0; k < n; k++) {\n for (var _j = 0; _j < n; _j++) {\n C[i * n + _j] += A[i * n + k] * B[k * n + _j];\n }\n }\n }\n\n return C;\n};\n\nvar expand = function expand(M, n, expandFactor\n/** power **/\n) {\n var _M = M.slice(0);\n\n for (var p = 1; p < expandFactor; p++) {\n M = mmult(M, _M, n);\n }\n\n return M;\n};\n\nvar inflate = function inflate(M, n, inflateFactor\n/** r **/\n) {\n var _M = new Array(n * n); // M(i,j) ^ inflatePower\n\n\n for (var i = 0; i < n * n; i++) {\n _M[i] = Math.pow(M[i], inflateFactor);\n }\n\n normalize(_M, n);\n return _M;\n};\n\nvar hasConverged = function hasConverged(M, _M, n2, roundFactor) {\n // Check that both matrices have the same elements (i,j)\n for (var i = 0; i < n2; i++) {\n var v1 = Math.round(M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); // truncate to 'roundFactor' decimal places\n\n var v2 = Math.round(_M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor);\n\n if (v1 !== v2) {\n return false;\n }\n }\n\n return true;\n};\n\nvar assign = function assign(M, n, nodes, cy) {\n var clusters = [];\n\n for (var i = 0; i < n; i++) {\n var cluster = [];\n\n for (var j = 0; j < n; j++) {\n // Row-wise attractors and elements that they attract belong in same cluster\n if (Math.round(M[i * n + j] * 1000) / 1000 > 0) {\n cluster.push(nodes[j]);\n }\n }\n\n if (cluster.length !== 0) {\n clusters.push(cy.collection(cluster));\n }\n }\n\n return clusters;\n};\n\nvar isDuplicate = function isDuplicate(c1, c2) {\n for (var i = 0; i < c1.length; i++) {\n if (!c2[i] || c1[i].id() !== c2[i].id()) {\n return false;\n }\n }\n\n return true;\n};\n\nvar removeDuplicates = function removeDuplicates(clusters) {\n for (var i = 0; i < clusters.length; i++) {\n for (var j = 0; j < clusters.length; j++) {\n if (i != j && isDuplicate(clusters[i], clusters[j])) {\n clusters.splice(j, 1);\n }\n }\n }\n\n return clusters;\n};\n\nvar markovClustering = function markovClustering(options) {\n var nodes = this.nodes();\n var edges = this.edges();\n var cy = this.cy(); // Set parameters of algorithm:\n\n var opts = setOptions(options); // Map each node to its position in node array\n\n var id2position = {};\n\n for (var i = 0; i < nodes.length; i++) {\n id2position[nodes[i].id()] = i;\n } // Generate stochastic matrix M from input graph G (should be symmetric/undirected)\n\n\n var n = nodes.length,\n n2 = n * n;\n\n var M = new Array(n2),\n _M;\n\n for (var _i = 0; _i < n2; _i++) {\n M[_i] = 0;\n }\n\n for (var e = 0; e < edges.length; e++) {\n var edge = edges[e];\n var _i2 = id2position[edge.source().id()];\n var j = id2position[edge.target().id()];\n var sim = getSimilarity(edge, opts.attributes);\n M[_i2 * n + j] += sim; // G should be symmetric and undirected\n\n M[j * n + _i2] += sim;\n } // Begin Markov cluster algorithm\n // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal\n\n\n addLoops(M, n, opts.multFactor); // Step 2: M = normalize( M );\n\n normalize(M, n);\n var isStillMoving = true;\n var iterations = 0;\n\n while (isStillMoving && iterations < opts.maxIterations) {\n isStillMoving = false; // Step 3:\n\n _M = expand(M, n, opts.expandFactor); // Step 4:\n\n M = inflate(_M, n, opts.inflateFactor); // Step 5: check to see if ~steady state has been reached\n\n if (!hasConverged(M, _M, n2, 4)) {\n isStillMoving = true;\n }\n\n iterations++;\n } // Build clusters from matrix\n\n\n var clusters = assign(M, n, nodes, cy); // Remove duplicate clusters due to symmetry of graph and M matrix\n\n clusters = removeDuplicates(clusters);\n return clusters;\n};\n\nvar markovClustering$1 = {\n markovClustering: markovClustering,\n mcl: markovClustering\n};\n\n// Common distance metrics for clustering algorithms\n\nvar identity = function identity(x) {\n return x;\n};\n\nvar absDiff = function absDiff(p, q) {\n return Math.abs(q - p);\n};\n\nvar addAbsDiff = function addAbsDiff(total, p, q) {\n return total + absDiff(p, q);\n};\n\nvar addSquaredDiff = function addSquaredDiff(total, p, q) {\n return total + Math.pow(q - p, 2);\n};\n\nvar sqrt = function sqrt(x) {\n return Math.sqrt(x);\n};\n\nvar maxAbsDiff = function maxAbsDiff(currentMax, p, q) {\n return Math.max(currentMax, absDiff(p, q));\n};\n\nvar getDistance = function getDistance(length, getP, getQ, init, visit) {\n var post = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : identity;\n var ret = init;\n var p, q;\n\n for (var dim = 0; dim < length; dim++) {\n p = getP(dim);\n q = getQ(dim);\n ret = visit(ret, p, q);\n }\n\n return post(ret);\n};\n\nvar distances = {\n euclidean: function euclidean(length, getP, getQ) {\n if (length >= 2) {\n return getDistance(length, getP, getQ, 0, addSquaredDiff, sqrt);\n } else {\n // for single attr case, more efficient to avoid sqrt\n return getDistance(length, getP, getQ, 0, addAbsDiff);\n }\n },\n squaredEuclidean: function squaredEuclidean(length, getP, getQ) {\n return getDistance(length, getP, getQ, 0, addSquaredDiff);\n },\n manhattan: function manhattan(length, getP, getQ) {\n return getDistance(length, getP, getQ, 0, addAbsDiff);\n },\n max: function max(length, getP, getQ) {\n return getDistance(length, getP, getQ, -Infinity, maxAbsDiff);\n }\n}; // in case the user accidentally doesn't use camel case\n\ndistances['squared-euclidean'] = distances['squaredEuclidean'];\ndistances['squaredeuclidean'] = distances['squaredEuclidean'];\nfunction clusteringDistance (method, length, getP, getQ, nodeP, nodeQ) {\n var impl;\n\n if (fn(method)) {\n impl = method;\n } else {\n impl = distances[method] || distances.euclidean;\n }\n\n if (length === 0 && fn(method)) {\n return impl(nodeP, nodeQ);\n } else {\n return impl(length, getP, getQ, nodeP, nodeQ);\n }\n}\n\nvar defaults$5 = defaults({\n k: 2,\n m: 2,\n sensitivityThreshold: 0.0001,\n distance: 'euclidean',\n maxIterations: 10,\n attributes: [],\n testMode: false,\n testCentroids: null\n});\n\nvar setOptions$1 = function setOptions(options) {\n return defaults$5(options);\n};\n/* eslint-enable */\n\n\nvar getDist = function getDist(type, node, centroid, attributes, mode) {\n var noNodeP = mode !== 'kMedoids';\n var getP = noNodeP ? function (i) {\n return centroid[i];\n } : function (i) {\n return attributes[i](centroid);\n };\n\n var getQ = function getQ(i) {\n return attributes[i](node);\n };\n\n var nodeP = centroid;\n var nodeQ = node;\n return clusteringDistance(type, attributes.length, getP, getQ, nodeP, nodeQ);\n};\n\nvar randomCentroids = function randomCentroids(nodes, k, attributes) {\n var ndim = attributes.length;\n var min = new Array(ndim);\n var max = new Array(ndim);\n var centroids = new Array(k);\n var centroid = null; // Find min, max values for each attribute dimension\n\n for (var i = 0; i < ndim; i++) {\n min[i] = nodes.min(attributes[i]).value;\n max[i] = nodes.max(attributes[i]).value;\n } // Build k centroids, each represented as an n-dim feature vector\n\n\n for (var c = 0; c < k; c++) {\n centroid = [];\n\n for (var _i = 0; _i < ndim; _i++) {\n centroid[_i] = Math.random() * (max[_i] - min[_i]) + min[_i]; // random initial value\n }\n\n centroids[c] = centroid;\n }\n\n return centroids;\n};\n\nvar classify = function classify(node, centroids, distance, attributes, type) {\n var min = Infinity;\n var index = 0;\n\n for (var i = 0; i < centroids.length; i++) {\n var dist = getDist(distance, node, centroids[i], attributes, type);\n\n if (dist < min) {\n min = dist;\n index = i;\n }\n }\n\n return index;\n};\n\nvar buildCluster = function buildCluster(centroid, nodes, assignment) {\n var cluster = [];\n var node = null;\n\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n];\n\n if (assignment[node.id()] === centroid) {\n //console.log(\"Node \" + node.id() + \" is associated with medoid #: \" + m);\n cluster.push(node);\n }\n }\n\n return cluster;\n};\n\nvar haveValuesConverged = function haveValuesConverged(v1, v2, sensitivityThreshold) {\n return Math.abs(v2 - v1) <= sensitivityThreshold;\n};\n\nvar haveMatricesConverged = function haveMatricesConverged(v1, v2, sensitivityThreshold) {\n for (var i = 0; i < v1.length; i++) {\n for (var j = 0; j < v1[i].length; j++) {\n var diff = Math.abs(v1[i][j] - v2[i][j]);\n\n if (diff > sensitivityThreshold) {\n return false;\n }\n }\n }\n\n return true;\n};\n\nvar seenBefore = function seenBefore(node, medoids, n) {\n for (var i = 0; i < n; i++) {\n if (node === medoids[i]) return true;\n }\n\n return false;\n};\n\nvar randomMedoids = function randomMedoids(nodes, k) {\n var medoids = new Array(k); // For small data sets, the probability of medoid conflict is greater,\n // so we need to check to see if we've already seen or chose this node before.\n\n if (nodes.length < 50) {\n // Randomly select k medoids from the n nodes\n for (var i = 0; i < k; i++) {\n var node = nodes[Math.floor(Math.random() * nodes.length)]; // If we've already chosen this node to be a medoid, don't choose it again (for small data sets).\n // Instead choose a different random node.\n\n while (seenBefore(node, medoids, i)) {\n node = nodes[Math.floor(Math.random() * nodes.length)];\n }\n\n medoids[i] = node;\n }\n } else {\n // Relatively large data set, so pretty safe to not check and just select random nodes\n for (var _i2 = 0; _i2 < k; _i2++) {\n medoids[_i2] = nodes[Math.floor(Math.random() * nodes.length)];\n }\n }\n\n return medoids;\n};\n\nvar findCost = function findCost(potentialNewMedoid, cluster, attributes) {\n var cost = 0;\n\n for (var n = 0; n < cluster.length; n++) {\n cost += getDist('manhattan', cluster[n], potentialNewMedoid, attributes, 'kMedoids');\n }\n\n return cost;\n};\n\nvar kMeans = function kMeans(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var node = null; // Set parameters of algorithm: # of clusters, distance metric, etc.\n\n var opts = setOptions$1(options); // Begin k-means algorithm\n\n var clusters = new Array(opts.k);\n var assignment = {};\n var centroids; // Step 1: Initialize centroid positions\n\n if (opts.testMode) {\n if (typeof opts.testCentroids === 'number') {\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n } else if (_typeof(opts.testCentroids) === 'object') {\n centroids = opts.testCentroids;\n } else {\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n }\n } else {\n centroids = randomCentroids(nodes, opts.k, opts.attributes);\n }\n\n var isStillMoving = true;\n var iterations = 0;\n\n while (isStillMoving && iterations < opts.maxIterations) {\n // Step 2: Assign nodes to the nearest centroid\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster #\n\n assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans');\n } // Step 3: For each of the k clusters, update its centroid\n\n\n isStillMoving = false;\n\n for (var c = 0; c < opts.k; c++) {\n // Get all nodes that belong to this cluster\n var cluster = buildCluster(c, nodes, assignment);\n\n if (cluster.length === 0) {\n // If cluster is empty, break out early & move to next cluster\n continue;\n } // Update centroids by calculating avg of all nodes within the cluster.\n\n\n var ndim = opts.attributes.length;\n var centroid = centroids[c]; // [ dim_1, dim_2, dim_3, ... , dim_n ]\n\n var newCentroid = new Array(ndim);\n var sum = new Array(ndim);\n\n for (var d = 0; d < ndim; d++) {\n sum[d] = 0.0;\n\n for (var i = 0; i < cluster.length; i++) {\n node = cluster[i];\n sum[d] += opts.attributes[d](node);\n }\n\n newCentroid[d] = sum[d] / cluster.length; // Check to see if algorithm has converged, i.e. when centroids no longer change\n\n if (!haveValuesConverged(newCentroid[d], centroid[d], opts.sensitivityThreshold)) {\n isStillMoving = true;\n }\n }\n\n centroids[c] = newCentroid;\n clusters[c] = cy.collection(cluster);\n }\n\n iterations++;\n }\n\n return clusters;\n};\n\nvar kMedoids = function kMedoids(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var node = null;\n var opts = setOptions$1(options); // Begin k-medoids algorithm\n\n var clusters = new Array(opts.k);\n var medoids;\n var assignment = {};\n var curCost;\n var minCosts = new Array(opts.k); // minimum cost configuration for each cluster\n // Step 1: Initialize k medoids\n\n if (opts.testMode) {\n if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') {\n medoids = opts.testCentroids;\n } else {\n medoids = randomMedoids(nodes, opts.k);\n }\n } else {\n medoids = randomMedoids(nodes, opts.k);\n }\n\n var isStillMoving = true;\n var iterations = 0;\n\n while (isStillMoving && iterations < opts.maxIterations) {\n // Step 2: Assign nodes to the nearest medoid\n for (var n = 0; n < nodes.length; n++) {\n node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster #\n\n assignment[node.id()] = classify(node, medoids, opts.distance, opts.attributes, 'kMedoids');\n }\n\n isStillMoving = false; // Step 3: For each medoid m, and for each node assciated with mediod m,\n // select the node with the lowest configuration cost as new medoid.\n\n for (var m = 0; m < medoids.length; m++) {\n // Get all nodes that belong to this medoid\n var cluster = buildCluster(m, nodes, assignment);\n\n if (cluster.length === 0) {\n // If cluster is empty, break out early & move to next cluster\n continue;\n }\n\n minCosts[m] = findCost(medoids[m], cluster, opts.attributes); // original cost\n // Select different medoid if its configuration has the lowest cost\n\n for (var _n = 0; _n < cluster.length; _n++) {\n curCost = findCost(cluster[_n], cluster, opts.attributes);\n\n if (curCost < minCosts[m]) {\n minCosts[m] = curCost;\n medoids[m] = cluster[_n];\n isStillMoving = true;\n }\n }\n\n clusters[m] = cy.collection(cluster);\n }\n\n iterations++;\n }\n\n return clusters;\n};\n\nvar updateCentroids = function updateCentroids(centroids, nodes, U, weight, opts) {\n var numerator, denominator;\n\n for (var n = 0; n < nodes.length; n++) {\n for (var c = 0; c < centroids.length; c++) {\n weight[n][c] = Math.pow(U[n][c], opts.m);\n }\n }\n\n for (var _c = 0; _c < centroids.length; _c++) {\n for (var dim = 0; dim < opts.attributes.length; dim++) {\n numerator = 0;\n denominator = 0;\n\n for (var _n2 = 0; _n2 < nodes.length; _n2++) {\n numerator += weight[_n2][_c] * opts.attributes[dim](nodes[_n2]);\n denominator += weight[_n2][_c];\n }\n\n centroids[_c][dim] = numerator / denominator;\n }\n }\n};\n\nvar updateMembership = function updateMembership(U, _U, centroids, nodes, opts) {\n // Save previous step\n for (var i = 0; i < U.length; i++) {\n _U[i] = U[i].slice();\n }\n\n var sum, numerator, denominator;\n var pow = 2 / (opts.m - 1);\n\n for (var c = 0; c < centroids.length; c++) {\n for (var n = 0; n < nodes.length; n++) {\n sum = 0;\n\n for (var k = 0; k < centroids.length; k++) {\n // against all other centroids\n numerator = getDist(opts.distance, nodes[n], centroids[c], opts.attributes, 'cmeans');\n denominator = getDist(opts.distance, nodes[n], centroids[k], opts.attributes, 'cmeans');\n sum += Math.pow(numerator / denominator, pow);\n }\n\n U[n][c] = 1 / sum;\n }\n }\n};\n\nvar assign$1 = function assign(nodes, U, opts, cy) {\n var clusters = new Array(opts.k);\n\n for (var c = 0; c < clusters.length; c++) {\n clusters[c] = [];\n }\n\n var max;\n var index;\n\n for (var n = 0; n < U.length; n++) {\n // for each node (U is N x C matrix)\n max = -Infinity;\n index = -1; // Determine which cluster the node is most likely to belong in\n\n for (var _c2 = 0; _c2 < U[0].length; _c2++) {\n if (U[n][_c2] > max) {\n max = U[n][_c2];\n index = _c2;\n }\n }\n\n clusters[index].push(nodes[n]);\n } // Turn every array into a collection of nodes\n\n\n for (var _c3 = 0; _c3 < clusters.length; _c3++) {\n clusters[_c3] = cy.collection(clusters[_c3]);\n }\n\n return clusters;\n};\n\nvar fuzzyCMeans = function fuzzyCMeans(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var opts = setOptions$1(options); // Begin fuzzy c-means algorithm\n\n var clusters;\n var centroids;\n var U;\n\n var _U;\n\n var weight; // Step 1: Initialize letiables.\n\n _U = new Array(nodes.length);\n\n for (var i = 0; i < nodes.length; i++) {\n // N x C matrix\n _U[i] = new Array(opts.k);\n }\n\n U = new Array(nodes.length);\n\n for (var _i3 = 0; _i3 < nodes.length; _i3++) {\n // N x C matrix\n U[_i3] = new Array(opts.k);\n }\n\n for (var _i4 = 0; _i4 < nodes.length; _i4++) {\n var total = 0;\n\n for (var j = 0; j < opts.k; j++) {\n U[_i4][j] = Math.random();\n total += U[_i4][j];\n }\n\n for (var _j = 0; _j < opts.k; _j++) {\n U[_i4][_j] = U[_i4][_j] / total;\n }\n }\n\n centroids = new Array(opts.k);\n\n for (var _i5 = 0; _i5 < opts.k; _i5++) {\n centroids[_i5] = new Array(opts.attributes.length);\n }\n\n weight = new Array(nodes.length);\n\n for (var _i6 = 0; _i6 < nodes.length; _i6++) {\n // N x C matrix\n weight[_i6] = new Array(opts.k);\n } // end init FCM\n\n\n var isStillMoving = true;\n var iterations = 0;\n\n while (isStillMoving && iterations < opts.maxIterations) {\n isStillMoving = false; // Step 2: Calculate the centroids for each step.\n\n updateCentroids(centroids, nodes, U, weight, opts); // Step 3: Update the partition matrix U.\n\n updateMembership(U, _U, centroids, nodes, opts); // Step 4: Check for convergence.\n\n if (!haveMatricesConverged(U, _U, opts.sensitivityThreshold)) {\n isStillMoving = true;\n }\n\n iterations++;\n } // Assign nodes to clusters with highest probability.\n\n\n clusters = assign$1(nodes, U, opts, cy);\n return {\n clusters: clusters,\n degreeOfMembership: U\n };\n};\n\nvar kClustering = {\n kMeans: kMeans,\n kMedoids: kMedoids,\n fuzzyCMeans: fuzzyCMeans,\n fcm: fuzzyCMeans\n};\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\nvar defaults$6 = defaults({\n distance: 'euclidean',\n // distance metric to compare nodes\n linkage: 'min',\n // linkage criterion : how to determine the distance between clusters of nodes\n mode: 'threshold',\n // mode:'threshold' => clusters must be threshold distance apart\n threshold: Infinity,\n // the distance threshold\n // mode:'dendrogram' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters\n addDendrogram: false,\n // whether to add the dendrogram to the graph for viz\n dendrogramDepth: 0,\n // depth at which dendrogram branches are merged into the returned clusters\n attributes: [] // array of attr functions\n\n});\nvar linkageAliases = {\n 'single': 'min',\n 'complete': 'max'\n};\n\nvar setOptions$2 = function setOptions(options) {\n var opts = defaults$6(options);\n var preferredAlias = linkageAliases[opts.linkage];\n\n if (preferredAlias != null) {\n opts.linkage = preferredAlias;\n }\n\n return opts;\n};\n\nvar mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) {\n // Find two closest clusters from cached mins\n var minKey = 0;\n var min = Infinity;\n var dist;\n var attrs = opts.attributes;\n\n var getDist = function getDist(n1, n2) {\n return clusteringDistance(opts.distance, attrs.length, function (i) {\n return attrs[i](n1);\n }, function (i) {\n return attrs[i](n2);\n }, n1, n2);\n };\n\n for (var i = 0; i < clusters.length; i++) {\n var key = clusters[i].key;\n var _dist = dists[key][mins[key]];\n\n if (_dist < min) {\n minKey = key;\n min = _dist;\n }\n }\n\n if (opts.mode === 'threshold' && min >= opts.threshold || opts.mode === 'dendrogram' && clusters.length === 1) {\n return false;\n }\n\n var c1 = index[minKey];\n var c2 = index[mins[minKey]];\n var merged; // Merge two closest clusters\n\n if (opts.mode === 'dendrogram') {\n merged = {\n left: c1,\n right: c2,\n key: c1.key\n };\n } else {\n merged = {\n value: c1.value.concat(c2.value),\n key: c1.key\n };\n }\n\n clusters[c1.index] = merged;\n clusters.splice(c2.index, 1);\n index[c1.key] = merged; // Update distances with new merged cluster\n\n for (var _i = 0; _i < clusters.length; _i++) {\n var cur = clusters[_i];\n\n if (c1.key === cur.key) {\n dist = Infinity;\n } else if (opts.linkage === 'min') {\n dist = dists[c1.key][cur.key];\n\n if (dists[c1.key][cur.key] > dists[c2.key][cur.key]) {\n dist = dists[c2.key][cur.key];\n }\n } else if (opts.linkage === 'max') {\n dist = dists[c1.key][cur.key];\n\n if (dists[c1.key][cur.key] < dists[c2.key][cur.key]) {\n dist = dists[c2.key][cur.key];\n }\n } else if (opts.linkage === 'mean') {\n dist = (dists[c1.key][cur.key] * c1.size + dists[c2.key][cur.key] * c2.size) / (c1.size + c2.size);\n } else {\n if (opts.mode === 'dendrogram') dist = getDist(cur.value, c1.value);else dist = getDist(cur.value[0], c1.value[0]);\n }\n\n dists[c1.key][cur.key] = dists[cur.key][c1.key] = dist; // distance matrix is symmetric\n } // Update cached mins\n\n\n for (var _i2 = 0; _i2 < clusters.length; _i2++) {\n var key1 = clusters[_i2].key;\n\n if (mins[key1] === c1.key || mins[key1] === c2.key) {\n var _min = key1;\n\n for (var j = 0; j < clusters.length; j++) {\n var key2 = clusters[j].key;\n\n if (dists[key1][key2] < dists[key1][_min]) {\n _min = key2;\n }\n }\n\n mins[key1] = _min;\n }\n\n clusters[_i2].index = _i2;\n } // Clean up meta data used for clustering\n\n\n c1.key = c2.key = c1.index = c2.index = null;\n return true;\n};\n\nvar getAllChildren = function getAllChildren(root, arr, cy) {\n if (!root) return;\n\n if (root.value) {\n arr.push(root.value);\n } else {\n if (root.left) getAllChildren(root.left, arr);\n if (root.right) getAllChildren(root.right, arr);\n }\n};\n\nvar buildDendrogram = function buildDendrogram(root, cy) {\n if (!root) return '';\n\n if (root.left && root.right) {\n var leftStr = buildDendrogram(root.left, cy);\n var rightStr = buildDendrogram(root.right, cy);\n var node = cy.add({\n group: 'nodes',\n data: {\n id: leftStr + ',' + rightStr\n }\n });\n cy.add({\n group: 'edges',\n data: {\n source: leftStr,\n target: node.id()\n }\n });\n cy.add({\n group: 'edges',\n data: {\n source: rightStr,\n target: node.id()\n }\n });\n return node.id();\n } else if (root.value) {\n return root.value.id();\n }\n};\n\nvar buildClustersFromTree = function buildClustersFromTree(root, k, cy) {\n if (!root) return [];\n var left = [],\n right = [],\n leaves = [];\n\n if (k === 0) {\n // don't cut tree, simply return all nodes as 1 single cluster\n if (root.left) getAllChildren(root.left, left);\n if (root.right) getAllChildren(root.right, right);\n leaves = left.concat(right);\n return [cy.collection(leaves)];\n } else if (k === 1) {\n // cut at root\n if (root.value) {\n // leaf node\n return [cy.collection(root.value)];\n } else {\n if (root.left) getAllChildren(root.left, left);\n if (root.right) getAllChildren(root.right, right);\n return [cy.collection(left), cy.collection(right)];\n }\n } else {\n if (root.value) {\n return [cy.collection(root.value)];\n } else {\n if (root.left) left = buildClustersFromTree(root.left, k - 1, cy);\n if (root.right) right = buildClustersFromTree(root.right, k - 1, cy);\n return left.concat(right);\n }\n }\n};\n/* eslint-enable */\n\n\nvar hierarchicalClustering = function hierarchicalClustering(options) {\n var cy = this.cy();\n var nodes = this.nodes(); // Set parameters of algorithm: linkage type, distance metric, etc.\n\n var opts = setOptions$2(options);\n var attrs = opts.attributes;\n\n var getDist = function getDist(n1, n2) {\n return clusteringDistance(opts.distance, attrs.length, function (i) {\n return attrs[i](n1);\n }, function (i) {\n return attrs[i](n2);\n }, n1, n2);\n }; // Begin hierarchical algorithm\n\n\n var clusters = [];\n var dists = []; // distances between each pair of clusters\n\n var mins = []; // closest cluster for each cluster\n\n var index = []; // hash of all clusters by key\n // In agglomerative (bottom-up) clustering, each node starts as its own cluster\n\n for (var n = 0; n < nodes.length; n++) {\n var cluster = {\n value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]],\n key: n,\n index: n\n };\n clusters[n] = cluster;\n index[n] = cluster;\n dists[n] = [];\n mins[n] = 0;\n } // Calculate the distance between each pair of clusters\n\n\n for (var i = 0; i < clusters.length; i++) {\n for (var j = 0; j <= i; j++) {\n var dist = void 0;\n\n if (opts.mode === 'dendrogram') {\n // modes store cluster values differently\n dist = i === j ? Infinity : getDist(clusters[i].value, clusters[j].value);\n } else {\n dist = i === j ? Infinity : getDist(clusters[i].value[0], clusters[j].value[0]);\n }\n\n dists[i][j] = dist;\n dists[j][i] = dist;\n\n if (dist < dists[i][mins[i]]) {\n mins[i] = j; // Cache mins: closest cluster to cluster i is cluster j\n }\n }\n } // Find the closest pair of clusters and merge them into a single cluster.\n // Update distances between new cluster and each of the old clusters, and loop until threshold reached.\n\n\n var merged = mergeClosest(clusters, index, dists, mins, opts);\n\n while (merged) {\n merged = mergeClosest(clusters, index, dists, mins, opts);\n }\n\n var retClusters; // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges\n // in addition to returning the clusters.\n\n if (opts.mode === 'dendrogram') {\n retClusters = buildClustersFromTree(clusters[0], opts.dendrogramDepth, cy);\n if (opts.addDendrogram) buildDendrogram(clusters[0], cy);\n } else {\n // Regular mode simply returns the clusters\n retClusters = new Array(clusters.length);\n clusters.forEach(function (cluster, i) {\n // Clean up meta data used for clustering\n cluster.key = cluster.index = null;\n retClusters[i] = cy.collection(cluster.value);\n });\n }\n\n return retClusters;\n};\n\nvar hierarchicalClustering$1 = {\n hierarchicalClustering: hierarchicalClustering,\n hca: hierarchicalClustering\n};\n\n// Implemented by Zoe Xi @zoexi for GSOC 2016\nvar defaults$7 = defaults({\n distance: 'euclidean',\n // distance metric to compare attributes between two nodes\n preference: 'median',\n // suitability of a data point to serve as an exemplar\n damping: 0.8,\n // damping factor between [0.5, 1)\n maxIterations: 1000,\n // max number of iterations to run\n minIterations: 100,\n // min number of iterations to run in order for clustering to stop\n attributes: [// functions to quantify the similarity between any two points\n // e.g. node => node.data('weight')\n ]\n});\n\nvar setOptions$3 = function setOptions(options) {\n var dmp = options.damping;\n var pref = options.preference;\n\n if (!(0.5 <= dmp && dmp < 1)) {\n error(\"Damping must range on [0.5, 1). Got: \".concat(dmp));\n }\n\n var validPrefs = ['median', 'mean', 'min', 'max'];\n\n if (!(validPrefs.some(function (v) {\n return v === pref;\n }) || number(pref))) {\n error(\"Preference must be one of [\".concat(validPrefs.map(function (p) {\n return \"'\".concat(p, \"'\");\n }).join(', '), \"] or a number. Got: \").concat(pref));\n }\n\n return defaults$7(options);\n};\n/* eslint-enable */\n\n\nvar getSimilarity$1 = function getSimilarity(type, n1, n2, attributes) {\n var attr = function attr(n, i) {\n return attributes[i](n);\n }; // nb negative because similarity should have an inverse relationship to distance\n\n\n return -clusteringDistance(type, attributes.length, function (i) {\n return attr(n1, i);\n }, function (i) {\n return attr(n2, i);\n }, n1, n2);\n};\n\nvar getPreference = function getPreference(S, preference) {\n // larger preference = greater # of clusters\n var p = null;\n\n if (preference === 'median') {\n p = median(S);\n } else if (preference === 'mean') {\n p = mean(S);\n } else if (preference === 'min') {\n p = min(S);\n } else if (preference === 'max') {\n p = max(S);\n } else {\n // Custom preference number, as set by user\n p = preference;\n }\n\n return p;\n};\n\nvar findExemplars = function findExemplars(n, R, A) {\n var indices = [];\n\n for (var i = 0; i < n; i++) {\n if (R[i * n + i] + A[i * n + i] > 0) {\n indices.push(i);\n }\n }\n\n return indices;\n};\n\nvar assignClusters = function assignClusters(n, S, exemplars) {\n var clusters = [];\n\n for (var i = 0; i < n; i++) {\n var index = -1;\n var max = -Infinity;\n\n for (var ei = 0; ei < exemplars.length; ei++) {\n var e = exemplars[ei];\n\n if (S[i * n + e] > max) {\n index = e;\n max = S[i * n + e];\n }\n }\n\n if (index > 0) {\n clusters.push(index);\n }\n }\n\n for (var _ei = 0; _ei < exemplars.length; _ei++) {\n clusters[exemplars[_ei]] = exemplars[_ei];\n }\n\n return clusters;\n};\n\nvar assign$2 = function assign(n, S, exemplars) {\n var clusters = assignClusters(n, S, exemplars);\n\n for (var ei = 0; ei < exemplars.length; ei++) {\n var ii = [];\n\n for (var c = 0; c < clusters.length; c++) {\n if (clusters[c] === exemplars[ei]) {\n ii.push(c);\n }\n }\n\n var maxI = -1;\n var maxSum = -Infinity;\n\n for (var i = 0; i < ii.length; i++) {\n var sum = 0;\n\n for (var j = 0; j < ii.length; j++) {\n sum += S[ii[j] * n + ii[i]];\n }\n\n if (sum > maxSum) {\n maxI = i;\n maxSum = sum;\n }\n }\n\n exemplars[ei] = ii[maxI];\n }\n\n clusters = assignClusters(n, S, exemplars);\n return clusters;\n};\n\nvar affinityPropagation = function affinityPropagation(options) {\n var cy = this.cy();\n var nodes = this.nodes();\n var opts = setOptions$3(options); // Map each node to its position in node array\n\n var id2position = {};\n\n for (var i = 0; i < nodes.length; i++) {\n id2position[nodes[i].id()] = i;\n } // Begin affinity propagation algorithm\n\n\n var n; // number of data points\n\n var n2; // size of matrices\n\n var S; // similarity matrix (1D array)\n\n var p; // preference/suitability of a data point to serve as an exemplar\n\n var R; // responsibility matrix (1D array)\n\n var A; // availability matrix (1D array)\n\n n = nodes.length;\n n2 = n * n; // Initialize and build S similarity matrix\n\n S = new Array(n2);\n\n for (var _i = 0; _i < n2; _i++) {\n S[_i] = -Infinity; // for cases where two data points shouldn't be linked together\n }\n\n for (var _i2 = 0; _i2 < n; _i2++) {\n for (var j = 0; j < n; j++) {\n if (_i2 !== j) {\n S[_i2 * n + j] = getSimilarity$1(opts.distance, nodes[_i2], nodes[j], opts.attributes);\n }\n }\n } // Place preferences on the diagonal of S\n\n\n p = getPreference(S, opts.preference);\n\n for (var _i3 = 0; _i3 < n; _i3++) {\n S[_i3 * n + _i3] = p;\n } // Initialize R responsibility matrix\n\n\n R = new Array(n2);\n\n for (var _i4 = 0; _i4 < n2; _i4++) {\n R[_i4] = 0.0;\n } // Initialize A availability matrix\n\n\n A = new Array(n2);\n\n for (var _i5 = 0; _i5 < n2; _i5++) {\n A[_i5] = 0.0;\n }\n\n var old = new Array(n);\n var Rp = new Array(n);\n var se = new Array(n);\n\n for (var _i6 = 0; _i6 < n; _i6++) {\n old[_i6] = 0.0;\n Rp[_i6] = 0.0;\n se[_i6] = 0;\n }\n\n var e = new Array(n * opts.minIterations);\n\n for (var _i7 = 0; _i7 < e.length; _i7++) {\n e[_i7] = 0;\n }\n\n var iter;\n\n for (iter = 0; iter < opts.maxIterations; iter++) {\n // main algorithmic loop\n // Update R responsibility matrix\n for (var _i8 = 0; _i8 < n; _i8++) {\n var max = -Infinity,\n max2 = -Infinity,\n maxI = -1,\n AS = 0.0;\n\n for (var _j = 0; _j < n; _j++) {\n old[_j] = R[_i8 * n + _j];\n AS = A[_i8 * n + _j] + S[_i8 * n + _j];\n\n if (AS >= max) {\n max2 = max;\n max = AS;\n maxI = _j;\n } else if (AS > max2) {\n max2 = AS;\n }\n }\n\n for (var _j2 = 0; _j2 < n; _j2++) {\n R[_i8 * n + _j2] = (1 - opts.damping) * (S[_i8 * n + _j2] - max) + opts.damping * old[_j2];\n }\n\n R[_i8 * n + maxI] = (1 - opts.damping) * (S[_i8 * n + maxI] - max2) + opts.damping * old[maxI];\n } // Update A availability matrix\n\n\n for (var _i9 = 0; _i9 < n; _i9++) {\n var sum = 0;\n\n for (var _j3 = 0; _j3 < n; _j3++) {\n old[_j3] = A[_j3 * n + _i9];\n Rp[_j3] = Math.max(0, R[_j3 * n + _i9]);\n sum += Rp[_j3];\n }\n\n sum -= Rp[_i9];\n Rp[_i9] = R[_i9 * n + _i9];\n sum += Rp[_i9];\n\n for (var _j4 = 0; _j4 < n; _j4++) {\n A[_j4 * n + _i9] = (1 - opts.damping) * Math.min(0, sum - Rp[_j4]) + opts.damping * old[_j4];\n }\n\n A[_i9 * n + _i9] = (1 - opts.damping) * (sum - Rp[_i9]) + opts.damping * old[_i9];\n } // Check for convergence\n\n\n var K = 0;\n\n for (var _i10 = 0; _i10 < n; _i10++) {\n var E = A[_i10 * n + _i10] + R[_i10 * n + _i10] > 0 ? 1 : 0;\n e[iter % opts.minIterations * n + _i10] = E;\n K += E;\n }\n\n if (K > 0 && (iter >= opts.minIterations - 1 || iter == opts.maxIterations - 1)) {\n var _sum = 0;\n\n for (var _i11 = 0; _i11 < n; _i11++) {\n se[_i11] = 0;\n\n for (var _j5 = 0; _j5 < opts.minIterations; _j5++) {\n se[_i11] += e[_j5 * n + _i11];\n }\n\n if (se[_i11] === 0 || se[_i11] === opts.minIterations) {\n _sum++;\n }\n }\n\n if (_sum === n) {\n // then we have convergence\n break;\n }\n }\n } // Identify exemplars (cluster centers)\n\n\n var exemplarsIndices = findExemplars(n, R, A); // Assign nodes to clusters\n\n var clusterIndices = assign$2(n, S, exemplarsIndices);\n var clusters = {};\n\n for (var c = 0; c < exemplarsIndices.length; c++) {\n clusters[exemplarsIndices[c]] = [];\n }\n\n for (var _i12 = 0; _i12 < nodes.length; _i12++) {\n var pos = id2position[nodes[_i12].id()];\n\n var clusterIndex = clusterIndices[pos];\n\n if (clusterIndex != null) {\n // the node may have not been assigned a cluster if no valid attributes were specified\n clusters[clusterIndex].push(nodes[_i12]);\n }\n }\n\n var retClusters = new Array(exemplarsIndices.length);\n\n for (var _c = 0; _c < exemplarsIndices.length; _c++) {\n retClusters[_c] = cy.collection(clusters[exemplarsIndices[_c]]);\n }\n\n return retClusters;\n};\n\nvar affinityPropagation$1 = {\n affinityPropagation: affinityPropagation,\n ap: affinityPropagation\n};\n\nvar hierholzerDefaults = defaults({\n root: undefined,\n directed: false\n});\nvar elesfn$b = {\n hierholzer: function hierholzer(options) {\n if (!plainObject(options)) {\n var args = arguments;\n options = {\n root: args[0],\n directed: args[1]\n };\n }\n\n var _hierholzerDefaults = hierholzerDefaults(options),\n root = _hierholzerDefaults.root,\n directed = _hierholzerDefaults.directed;\n\n var eles = this;\n var dflag = false;\n var oddIn;\n var oddOut;\n var startVertex;\n if (root) startVertex = string(root) ? this.filter(root)[0].id() : root[0].id();\n var nodes = {};\n var edges = {};\n\n if (directed) {\n eles.forEach(function (ele) {\n var id = ele.id();\n\n if (ele.isNode()) {\n var ind = ele.indegree(true);\n var outd = ele.outdegree(true);\n var d1 = ind - outd;\n var d2 = outd - ind;\n\n if (d1 == 1) {\n if (oddIn) dflag = true;else oddIn = id;\n } else if (d2 == 1) {\n if (oddOut) dflag = true;else oddOut = id;\n } else if (d2 > 1 || d1 > 1) {\n dflag = true;\n }\n\n nodes[id] = [];\n ele.outgoers().forEach(function (e) {\n if (e.isEdge()) nodes[id].push(e.id());\n });\n } else {\n edges[id] = [undefined, ele.target().id()];\n }\n });\n } else {\n eles.forEach(function (ele) {\n var id = ele.id();\n\n if (ele.isNode()) {\n var d = ele.degree(true);\n\n if (d % 2) {\n if (!oddIn) oddIn = id;else if (!oddOut) oddOut = id;else dflag = true;\n }\n\n nodes[id] = [];\n ele.connectedEdges().forEach(function (e) {\n return nodes[id].push(e.id());\n });\n } else {\n edges[id] = [ele.source().id(), ele.target().id()];\n }\n });\n }\n\n var result = {\n found: false,\n trail: undefined\n };\n if (dflag) return result;else if (oddOut && oddIn) {\n if (directed) {\n if (startVertex && oddOut != startVertex) {\n return result;\n }\n\n startVertex = oddOut;\n } else {\n if (startVertex && oddOut != startVertex && oddIn != startVertex) {\n return result;\n } else if (!startVertex) {\n startVertex = oddOut;\n }\n }\n } else {\n if (!startVertex) startVertex = eles[0].id();\n }\n\n var walk = function walk(v) {\n var currentNode = v;\n var subtour = [v];\n var adj, adjTail, adjHead;\n\n while (nodes[currentNode].length) {\n adj = nodes[currentNode].shift();\n adjTail = edges[adj][0];\n adjHead = edges[adj][1];\n\n if (currentNode != adjHead) {\n nodes[adjHead] = nodes[adjHead].filter(function (e) {\n return e != adj;\n });\n currentNode = adjHead;\n } else if (!directed && currentNode != adjTail) {\n nodes[adjTail] = nodes[adjTail].filter(function (e) {\n return e != adj;\n });\n currentNode = adjTail;\n }\n\n subtour.unshift(adj);\n subtour.unshift(currentNode);\n }\n\n return subtour;\n };\n\n var trail = [];\n var subtour = [];\n subtour = walk(startVertex);\n\n while (subtour.length != 1) {\n if (nodes[subtour[0]].length == 0) {\n trail.unshift(eles.getElementById(subtour.shift()));\n trail.unshift(eles.getElementById(subtour.shift()));\n } else {\n subtour = walk(subtour.shift()).concat(subtour);\n }\n }\n\n trail.unshift(eles.getElementById(subtour.shift())); // final node\n\n for (var d in nodes) {\n if (nodes[d].length) {\n return result;\n }\n }\n\n result.found = true;\n result.trail = this.spawn(trail, true);\n return result;\n }\n};\n\nvar hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() {\n var eles = this;\n var nodes = {};\n var id = 0;\n var edgeCount = 0;\n var components = [];\n var stack = [];\n var visitedEdges = {};\n\n var buildComponent = function buildComponent(x, y) {\n var i = stack.length - 1;\n var cutset = [];\n var component = eles.spawn();\n\n while (stack[i].x != x || stack[i].y != y) {\n cutset.push(stack.pop().edge);\n i--;\n }\n\n cutset.push(stack.pop().edge);\n cutset.forEach(function (edge) {\n var connectedNodes = edge.connectedNodes().intersection(eles);\n component.merge(edge);\n connectedNodes.forEach(function (node) {\n var nodeId = node.id();\n var connectedEdges = node.connectedEdges().intersection(eles);\n component.merge(node);\n\n if (!nodes[nodeId].cutVertex) {\n component.merge(connectedEdges);\n } else {\n component.merge(connectedEdges.filter(function (edge) {\n return edge.isLoop();\n }));\n }\n });\n });\n components.push(component);\n };\n\n var biconnectedSearch = function biconnectedSearch(root, currentNode, parent) {\n if (root === parent) edgeCount += 1;\n nodes[currentNode] = {\n id: id,\n low: id++,\n cutVertex: false\n };\n var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles);\n\n if (edges.size() === 0) {\n components.push(eles.spawn(eles.getElementById(currentNode)));\n } else {\n var sourceId, targetId, otherNodeId, edgeId;\n edges.forEach(function (edge) {\n sourceId = edge.source().id();\n targetId = edge.target().id();\n otherNodeId = sourceId === currentNode ? targetId : sourceId;\n\n if (otherNodeId !== parent) {\n edgeId = edge.id();\n\n if (!visitedEdges[edgeId]) {\n visitedEdges[edgeId] = true;\n stack.push({\n x: currentNode,\n y: otherNodeId,\n edge: edge\n });\n }\n\n if (!(otherNodeId in nodes)) {\n biconnectedSearch(root, otherNodeId, currentNode);\n nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].low);\n\n if (nodes[currentNode].id <= nodes[otherNodeId].low) {\n nodes[currentNode].cutVertex = true;\n buildComponent(currentNode, otherNodeId);\n }\n } else {\n nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].id);\n }\n }\n });\n }\n };\n\n eles.forEach(function (ele) {\n if (ele.isNode()) {\n var nodeId = ele.id();\n\n if (!(nodeId in nodes)) {\n edgeCount = 0;\n biconnectedSearch(nodeId, nodeId);\n nodes[nodeId].cutVertex = edgeCount > 1;\n }\n }\n });\n var cutVertices = Object.keys(nodes).filter(function (id) {\n return nodes[id].cutVertex;\n }).map(function (id) {\n return eles.getElementById(id);\n });\n return {\n cut: eles.spawn(cutVertices),\n components: components\n };\n};\n\nvar hopcroftTarjanBiconnected$1 = {\n hopcroftTarjanBiconnected: hopcroftTarjanBiconnected,\n htbc: hopcroftTarjanBiconnected,\n htb: hopcroftTarjanBiconnected,\n hopcroftTarjanBiconnectedComponents: hopcroftTarjanBiconnected\n};\n\nvar tarjanStronglyConnected = function tarjanStronglyConnected() {\n var eles = this;\n var nodes = {};\n var index = 0;\n var components = [];\n var stack = [];\n var cut = eles.spawn(eles);\n\n var stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) {\n stack.push(sourceNodeId);\n nodes[sourceNodeId] = {\n index: index,\n low: index++,\n explored: false\n };\n var connectedEdges = eles.getElementById(sourceNodeId).connectedEdges().intersection(eles);\n connectedEdges.forEach(function (edge) {\n var targetNodeId = edge.target().id();\n\n if (targetNodeId !== sourceNodeId) {\n if (!(targetNodeId in nodes)) {\n stronglyConnectedSearch(targetNodeId);\n }\n\n if (!nodes[targetNodeId].explored) {\n nodes[sourceNodeId].low = Math.min(nodes[sourceNodeId].low, nodes[targetNodeId].low);\n }\n }\n });\n\n if (nodes[sourceNodeId].index === nodes[sourceNodeId].low) {\n var componentNodes = eles.spawn();\n\n for (;;) {\n var nodeId = stack.pop();\n componentNodes.merge(eles.getElementById(nodeId));\n nodes[nodeId].low = nodes[sourceNodeId].index;\n nodes[nodeId].explored = true;\n\n if (nodeId === sourceNodeId) {\n break;\n }\n }\n\n var componentEdges = componentNodes.edgesWith(componentNodes);\n var component = componentNodes.merge(componentEdges);\n components.push(component);\n cut = cut.difference(component);\n }\n };\n\n eles.forEach(function (ele) {\n if (ele.isNode()) {\n var nodeId = ele.id();\n\n if (!(nodeId in nodes)) {\n stronglyConnectedSearch(nodeId);\n }\n }\n });\n return {\n cut: cut,\n components: components\n };\n};\n\nvar tarjanStronglyConnected$1 = {\n tarjanStronglyConnected: tarjanStronglyConnected,\n tsc: tarjanStronglyConnected,\n tscc: tarjanStronglyConnected,\n tarjanStronglyConnectedComponents: tarjanStronglyConnected\n};\n\nvar elesfn$c = {};\n[elesfn, elesfn$1, elesfn$2, elesfn$3, elesfn$4, elesfn$5, elesfn$6, elesfn$7, elesfn$8, elesfn$9, elesfn$a, markovClustering$1, kClustering, hierarchicalClustering$1, affinityPropagation$1, elesfn$b, hopcroftTarjanBiconnected$1, tarjanStronglyConnected$1].forEach(function (props) {\n extend(elesfn$c, props);\n});\n\n/*!\nEmbeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable\nCopyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)\nLicensed under The MIT License (http://opensource.org/licenses/MIT)\n*/\n\n/* promise states [Promises/A+ 2.1] */\nvar STATE_PENDING = 0;\n/* [Promises/A+ 2.1.1] */\n\nvar STATE_FULFILLED = 1;\n/* [Promises/A+ 2.1.2] */\n\nvar STATE_REJECTED = 2;\n/* [Promises/A+ 2.1.3] */\n\n/* promise object constructor */\n\nvar api = function api(executor) {\n /* optionally support non-constructor/plain-function call */\n if (!(this instanceof api)) return new api(executor);\n /* initialize object */\n\n this.id = 'Thenable/1.0.7';\n this.state = STATE_PENDING;\n /* initial state */\n\n this.fulfillValue = undefined;\n /* initial value */\n\n /* [Promises/A+ 1.3, 2.1.2.2] */\n\n this.rejectReason = undefined;\n /* initial reason */\n\n /* [Promises/A+ 1.5, 2.1.3.2] */\n\n this.onFulfilled = [];\n /* initial handlers */\n\n this.onRejected = [];\n /* initial handlers */\n\n /* provide optional information-hiding proxy */\n\n this.proxy = {\n then: this.then.bind(this)\n };\n /* support optional executor function */\n\n if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this));\n};\n/* promise API methods */\n\n\napi.prototype = {\n /* promise resolving methods */\n fulfill: function fulfill(value) {\n return deliver(this, STATE_FULFILLED, 'fulfillValue', value);\n },\n reject: function reject(value) {\n return deliver(this, STATE_REJECTED, 'rejectReason', value);\n },\n\n /* \"The then Method\" [Promises/A+ 1.1, 1.2, 2.2] */\n then: function then(onFulfilled, onRejected) {\n var curr = this;\n var next = new api();\n /* [Promises/A+ 2.2.7] */\n\n curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill'));\n /* [Promises/A+ 2.2.2/2.2.6] */\n\n curr.onRejected.push(resolver(onRejected, next, 'reject'));\n /* [Promises/A+ 2.2.3/2.2.6] */\n\n execute(curr);\n return next.proxy;\n /* [Promises/A+ 2.2.7, 3.3] */\n }\n};\n/* deliver an action */\n\nvar deliver = function deliver(curr, state, name, value) {\n if (curr.state === STATE_PENDING) {\n curr.state = state;\n /* [Promises/A+ 2.1.2.1, 2.1.3.1] */\n\n curr[name] = value;\n /* [Promises/A+ 2.1.2.2, 2.1.3.2] */\n\n execute(curr);\n }\n\n return curr;\n};\n/* execute all handlers */\n\n\nvar execute = function execute(curr) {\n if (curr.state === STATE_FULFILLED) execute_handlers(curr, 'onFulfilled', curr.fulfillValue);else if (curr.state === STATE_REJECTED) execute_handlers(curr, 'onRejected', curr.rejectReason);\n};\n/* execute particular set of handlers */\n\n\nvar execute_handlers = function execute_handlers(curr, name, value) {\n /* global setImmediate: true */\n\n /* global setTimeout: true */\n\n /* short-circuit processing */\n if (curr[name].length === 0) return;\n /* iterate over all handlers, exactly once */\n\n var handlers = curr[name];\n curr[name] = [];\n /* [Promises/A+ 2.2.2.3, 2.2.3.3] */\n\n var func = function func() {\n for (var i = 0; i < handlers.length; i++) {\n handlers[i](value);\n }\n /* [Promises/A+ 2.2.5] */\n\n };\n /* execute procedure asynchronously */\n\n /* [Promises/A+ 2.2.4, 3.1] */\n\n\n if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0);\n};\n/* generate a resolver function */\n\n\nvar resolver = function resolver(cb, next, method) {\n return function (value) {\n if (typeof cb !== 'function')\n /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */\n next[method].call(next, value);\n /* [Promises/A+ 2.2.7.3, 2.2.7.4] */\n else {\n var result;\n\n try {\n result = cb(value);\n }\n /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */\n catch (e) {\n next.reject(e);\n /* [Promises/A+ 2.2.7.2] */\n\n return;\n }\n\n resolve(next, result);\n /* [Promises/A+ 2.2.7.1] */\n }\n };\n};\n/* \"Promise Resolution Procedure\" */\n\n/* [Promises/A+ 2.3] */\n\n\nvar resolve = function resolve(promise, x) {\n /* sanity check arguments */\n\n /* [Promises/A+ 2.3.1] */\n if (promise === x || promise.proxy === x) {\n promise.reject(new TypeError('cannot resolve promise with itself'));\n return;\n }\n /* surgically check for a \"then\" method\n (mainly to just call the \"getter\" of \"then\" only once) */\n\n\n var then;\n\n if (_typeof(x) === 'object' && x !== null || typeof x === 'function') {\n try {\n then = x.then;\n }\n /* [Promises/A+ 2.3.3.1, 3.5] */\n catch (e) {\n promise.reject(e);\n /* [Promises/A+ 2.3.3.2] */\n\n return;\n }\n }\n /* handle own Thenables [Promises/A+ 2.3.2]\n and similar \"thenables\" [Promises/A+ 2.3.3] */\n\n\n if (typeof then === 'function') {\n var resolved = false;\n\n try {\n /* call retrieved \"then\" method */\n\n /* [Promises/A+ 2.3.3.3] */\n then.call(x,\n /* resolvePromise */\n\n /* [Promises/A+ 2.3.3.3.1] */\n function (y) {\n if (resolved) return;\n resolved = true;\n /* [Promises/A+ 2.3.3.3.3] */\n\n if (y === x)\n /* [Promises/A+ 3.6] */\n promise.reject(new TypeError('circular thenable chain'));else resolve(promise, y);\n },\n /* rejectPromise */\n\n /* [Promises/A+ 2.3.3.3.2] */\n function (r) {\n if (resolved) return;\n resolved = true;\n /* [Promises/A+ 2.3.3.3.3] */\n\n promise.reject(r);\n });\n } catch (e) {\n if (!resolved)\n /* [Promises/A+ 2.3.3.3.3] */\n promise.reject(e);\n /* [Promises/A+ 2.3.3.3.4] */\n }\n\n return;\n }\n /* handle other values */\n\n\n promise.fulfill(x);\n /* [Promises/A+ 2.3.4, 2.3.3.4] */\n}; // so we always have Promise.all()\n\n\napi.all = function (ps) {\n return new api(function (resolveAll, rejectAll) {\n var vals = new Array(ps.length);\n var doneCount = 0;\n\n var fulfill = function fulfill(i, val) {\n vals[i] = val;\n doneCount++;\n\n if (doneCount === ps.length) {\n resolveAll(vals);\n }\n };\n\n for (var i = 0; i < ps.length; i++) {\n (function (i) {\n var p = ps[i];\n var isPromise = p != null && p.then != null;\n\n if (isPromise) {\n p.then(function (val) {\n fulfill(i, val);\n }, function (err) {\n rejectAll(err);\n });\n } else {\n var val = p;\n fulfill(i, val);\n }\n })(i);\n }\n });\n};\n\napi.resolve = function (val) {\n return new api(function (resolve, reject) {\n resolve(val);\n });\n};\n\napi.reject = function (val) {\n return new api(function (resolve, reject) {\n reject(val);\n });\n};\n\nvar Promise$1 = typeof Promise !== 'undefined' ? Promise : api; // eslint-disable-line no-undef\n\nvar Animation = function Animation(target, opts, opts2) {\n var isCore = core(target);\n var isEle = !isCore;\n\n var _p = this._private = extend({\n duration: 1000\n }, opts, opts2);\n\n _p.target = target;\n _p.style = _p.style || _p.css;\n _p.started = false;\n _p.playing = false;\n _p.hooked = false;\n _p.applying = false;\n _p.progress = 0;\n _p.completes = [];\n _p.frames = [];\n\n if (_p.complete && fn(_p.complete)) {\n _p.completes.push(_p.complete);\n }\n\n if (isEle) {\n var pos = target.position();\n _p.startPosition = _p.startPosition || {\n x: pos.x,\n y: pos.y\n };\n _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style);\n }\n\n if (isCore) {\n var pan = target.pan();\n _p.startPan = {\n x: pan.x,\n y: pan.y\n };\n _p.startZoom = target.zoom();\n } // for future timeline/animations impl\n\n\n this.length = 1;\n this[0] = this;\n};\n\nvar anifn = Animation.prototype;\nextend(anifn, {\n instanceString: function instanceString() {\n return 'animation';\n },\n hook: function hook() {\n var _p = this._private;\n\n if (!_p.hooked) {\n // add to target's animation queue\n var q;\n var tAni = _p.target._private.animation;\n\n if (_p.queue) {\n q = tAni.queue;\n } else {\n q = tAni.current;\n }\n\n q.push(this); // add to the animation loop pool\n\n if (elementOrCollection(_p.target)) {\n _p.target.cy().addToAnimationPool(_p.target);\n }\n\n _p.hooked = true;\n }\n\n return this;\n },\n play: function play() {\n var _p = this._private; // autorewind\n\n if (_p.progress === 1) {\n _p.progress = 0;\n }\n\n _p.playing = true;\n _p.started = false; // needs to be started by animation loop\n\n _p.stopped = false;\n this.hook(); // the animation loop will start the animation...\n\n return this;\n },\n playing: function playing() {\n return this._private.playing;\n },\n apply: function apply() {\n var _p = this._private;\n _p.applying = true;\n _p.started = false; // needs to be started by animation loop\n\n _p.stopped = false;\n this.hook(); // the animation loop will apply the animation at this progress\n\n return this;\n },\n applying: function applying() {\n return this._private.applying;\n },\n pause: function pause() {\n var _p = this._private;\n _p.playing = false;\n _p.started = false;\n return this;\n },\n stop: function stop() {\n var _p = this._private;\n _p.playing = false;\n _p.started = false;\n _p.stopped = true; // to be removed from animation queues\n\n return this;\n },\n rewind: function rewind() {\n return this.progress(0);\n },\n fastforward: function fastforward() {\n return this.progress(1);\n },\n time: function time(t) {\n var _p = this._private;\n\n if (t === undefined) {\n return _p.progress * _p.duration;\n } else {\n return this.progress(t / _p.duration);\n }\n },\n progress: function progress(p) {\n var _p = this._private;\n var wasPlaying = _p.playing;\n\n if (p === undefined) {\n return _p.progress;\n } else {\n if (wasPlaying) {\n this.pause();\n }\n\n _p.progress = p;\n _p.started = false;\n\n if (wasPlaying) {\n this.play();\n }\n }\n\n return this;\n },\n completed: function completed() {\n return this._private.progress === 1;\n },\n reverse: function reverse() {\n var _p = this._private;\n var wasPlaying = _p.playing;\n\n if (wasPlaying) {\n this.pause();\n }\n\n _p.progress = 1 - _p.progress;\n _p.started = false;\n\n var swap = function swap(a, b) {\n var _pa = _p[a];\n\n if (_pa == null) {\n return;\n }\n\n _p[a] = _p[b];\n _p[b] = _pa;\n };\n\n swap('zoom', 'startZoom');\n swap('pan', 'startPan');\n swap('position', 'startPosition'); // swap styles\n\n if (_p.style) {\n for (var i = 0; i < _p.style.length; i++) {\n var prop = _p.style[i];\n var name = prop.name;\n var startStyleProp = _p.startStyle[name];\n _p.startStyle[name] = prop;\n _p.style[i] = startStyleProp;\n }\n }\n\n if (wasPlaying) {\n this.play();\n }\n\n return this;\n },\n promise: function promise(type) {\n var _p = this._private;\n var arr;\n\n switch (type) {\n case 'frame':\n arr = _p.frames;\n break;\n\n default:\n case 'complete':\n case 'completed':\n arr = _p.completes;\n }\n\n return new Promise$1(function (resolve, reject) {\n arr.push(function () {\n resolve();\n });\n });\n }\n});\nanifn.complete = anifn.completed;\nanifn.run = anifn.play;\nanifn.running = anifn.playing;\n\nvar define = {\n animated: function animated() {\n return function animatedImpl() {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return false;\n }\n\n var ele = all[0];\n\n if (ele) {\n return ele._private.animation.current.length > 0;\n }\n };\n },\n // animated\n clearQueue: function clearQueue() {\n return function clearQueueImpl() {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n ele._private.animation.queue = [];\n }\n\n return this;\n };\n },\n // clearQueue\n delay: function delay() {\n return function delayImpl(time, complete) {\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n return this.animate({\n delay: time,\n duration: time,\n complete: complete\n });\n };\n },\n // delay\n delayAnimation: function delayAnimation() {\n return function delayAnimationImpl(time, complete) {\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n return this.animation({\n delay: time,\n duration: time,\n complete: complete\n });\n };\n },\n // delay\n animation: function animation() {\n return function animationImpl(properties, params) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var cy = this._private.cy || this;\n var isCore = !selfIsArrayLike;\n var isEles = !isCore;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n var style = cy.style();\n properties = extend({}, properties, params);\n var propertiesEmpty = Object.keys(properties).length === 0;\n\n if (propertiesEmpty) {\n return new Animation(all[0], properties); // nothing to animate\n }\n\n if (properties.duration === undefined) {\n properties.duration = 400;\n }\n\n switch (properties.duration) {\n case 'slow':\n properties.duration = 600;\n break;\n\n case 'fast':\n properties.duration = 200;\n break;\n }\n\n if (isEles) {\n properties.style = style.getPropsList(properties.style || properties.css);\n properties.css = undefined;\n }\n\n if (isEles && properties.renderedPosition != null) {\n var rpos = properties.renderedPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n properties.position = renderedToModelPosition(rpos, zoom, pan);\n } // override pan w/ panBy if set\n\n\n if (isCore && properties.panBy != null) {\n var panBy = properties.panBy;\n var cyPan = cy.pan();\n properties.pan = {\n x: cyPan.x + panBy.x,\n y: cyPan.y + panBy.y\n };\n } // override pan w/ center if set\n\n\n var center = properties.center || properties.centre;\n\n if (isCore && center != null) {\n var centerPan = cy.getCenterPan(center.eles, properties.zoom);\n\n if (centerPan != null) {\n properties.pan = centerPan;\n }\n } // override pan & zoom w/ fit if set\n\n\n if (isCore && properties.fit != null) {\n var fit = properties.fit;\n var fitVp = cy.getFitViewport(fit.eles || fit.boundingBox, fit.padding);\n\n if (fitVp != null) {\n properties.pan = fitVp.pan;\n properties.zoom = fitVp.zoom;\n }\n } // override zoom (& potentially pan) w/ zoom obj if set\n\n\n if (isCore && plainObject(properties.zoom)) {\n var vp = cy.getZoomedViewport(properties.zoom);\n\n if (vp != null) {\n if (vp.zoomed) {\n properties.zoom = vp.zoom;\n }\n\n if (vp.panned) {\n properties.pan = vp.pan;\n }\n } else {\n properties.zoom = null; // an inavalid zoom (e.g. no delta) gets automatically destroyed\n }\n }\n\n return new Animation(all[0], properties);\n };\n },\n // animate\n animate: function animate() {\n return function animateImpl(properties, params) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n if (params) {\n properties = extend({}, properties, params);\n } // manually hook and run the animation\n\n\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n var queue = ele.animated() && (properties.queue === undefined || properties.queue);\n var ani = ele.animation(properties, queue ? {\n queue: true\n } : undefined);\n ani.play();\n }\n\n return this; // chaining\n };\n },\n // animate\n stop: function stop() {\n return function stopImpl(clearQueue, jumpToEnd) {\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var cy = this._private.cy || this;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n for (var i = 0; i < all.length; i++) {\n var ele = all[i];\n var _p = ele._private;\n var anis = _p.animation.current;\n\n for (var j = 0; j < anis.length; j++) {\n var ani = anis[j];\n var ani_p = ani._private;\n\n if (jumpToEnd) {\n // next iteration of the animation loop, the animation\n // will go straight to the end and be removed\n ani_p.duration = 0;\n }\n } // clear the queue of future animations\n\n\n if (clearQueue) {\n _p.animation.queue = [];\n }\n\n if (!jumpToEnd) {\n _p.animation.current = [];\n }\n } // we have to notify (the animation loop doesn't do it for us on `stop`)\n\n\n cy.notify('draw');\n return this;\n };\n } // stop\n\n}; // define\n\nvar define$1 = {\n // access data field\n data: function data(params) {\n var defaults = {\n field: 'data',\n bindingEvent: 'data',\n allowBinding: false,\n allowSetting: false,\n allowGetting: false,\n settingEvent: 'data',\n settingTriggersEvent: false,\n triggerFnName: 'trigger',\n immutableKeys: {},\n // key => true if immutable\n updateStyle: false,\n beforeGet: function beforeGet(self) {},\n beforeSet: function beforeSet(self, obj) {},\n onSet: function onSet(self) {},\n canSet: function canSet(self) {\n return true;\n }\n };\n params = extend({}, defaults, params);\n return function dataImpl(name, value) {\n var p = params;\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n\n var single = selfIsArrayLike ? self[0] : self; // .data('foo', ...)\n\n if (string(name)) {\n // set or get property\n // .data('foo')\n if (p.allowGetting && value === undefined) {\n // get\n var ret;\n\n if (single) {\n p.beforeGet(single);\n ret = single._private[p.field][name];\n }\n\n return ret; // .data('foo', 'bar')\n } else if (p.allowSetting && value !== undefined) {\n // set\n var valid = !p.immutableKeys[name];\n\n if (valid) {\n var change = _defineProperty({}, name, value);\n\n p.beforeSet(self, change);\n\n for (var i = 0, l = all.length; i < l; i++) {\n var ele = all[i];\n\n if (p.canSet(ele)) {\n ele._private[p.field][name] = value;\n }\n } // update mappers if asked\n\n\n if (p.updateStyle) {\n self.updateStyle();\n } // call onSet callback\n\n\n p.onSet(self);\n\n if (p.settingTriggersEvent) {\n self[p.triggerFnName](p.settingEvent);\n }\n }\n } // .data({ 'foo': 'bar' })\n\n } else if (p.allowSetting && plainObject(name)) {\n // extend\n var obj = name;\n var k, v;\n var keys = Object.keys(obj);\n p.beforeSet(self, obj);\n\n for (var _i = 0; _i < keys.length; _i++) {\n k = keys[_i];\n v = obj[k];\n\n var _valid = !p.immutableKeys[k];\n\n if (_valid) {\n for (var j = 0; j < all.length; j++) {\n var _ele = all[j];\n\n if (p.canSet(_ele)) {\n _ele._private[p.field][k] = v;\n }\n }\n }\n } // update mappers if asked\n\n\n if (p.updateStyle) {\n self.updateStyle();\n } // call onSet callback\n\n\n p.onSet(self);\n\n if (p.settingTriggersEvent) {\n self[p.triggerFnName](p.settingEvent);\n } // .data(function(){ ... })\n\n } else if (p.allowBinding && fn(name)) {\n // bind to event\n var fn$1 = name;\n self.on(p.bindingEvent, fn$1); // .data()\n } else if (p.allowGetting && name === undefined) {\n // get whole object\n var _ret;\n\n if (single) {\n p.beforeGet(single);\n _ret = single._private[p.field];\n }\n\n return _ret;\n }\n\n return self; // maintain chainability\n }; // function\n },\n // data\n // remove data field\n removeData: function removeData(params) {\n var defaults = {\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: false,\n immutableKeys: {} // key => true if immutable\n\n };\n params = extend({}, defaults, params);\n return function removeDataImpl(names) {\n var p = params;\n var self = this;\n var selfIsArrayLike = self.length !== undefined;\n var all = selfIsArrayLike ? self : [self]; // put in array if not array-like\n // .removeData('foo bar')\n\n if (string(names)) {\n // then get the list of keys, and delete them\n var keys = names.split(/\\s+/);\n var l = keys.length;\n\n for (var i = 0; i < l; i++) {\n // delete each non-empty key\n var key = keys[i];\n\n if (emptyString(key)) {\n continue;\n }\n\n var valid = !p.immutableKeys[key]; // not valid if immutable\n\n if (valid) {\n for (var i_a = 0, l_a = all.length; i_a < l_a; i_a++) {\n all[i_a]._private[p.field][key] = undefined;\n }\n }\n }\n\n if (p.triggerEvent) {\n self[p.triggerFnName](p.event);\n } // .removeData()\n\n } else if (names === undefined) {\n // then delete all keys\n for (var _i_a = 0, _l_a = all.length; _i_a < _l_a; _i_a++) {\n var _privateFields = all[_i_a]._private[p.field];\n\n var _keys = Object.keys(_privateFields);\n\n for (var _i2 = 0; _i2 < _keys.length; _i2++) {\n var _key = _keys[_i2];\n var validKeyToDelete = !p.immutableKeys[_key];\n\n if (validKeyToDelete) {\n _privateFields[_key] = undefined;\n }\n }\n }\n\n if (p.triggerEvent) {\n self[p.triggerFnName](p.event);\n }\n }\n\n return self; // maintain chaining\n }; // function\n } // removeData\n\n}; // define\n\nvar define$2 = {\n eventAliasesOn: function eventAliasesOn(proto) {\n var p = proto;\n p.addListener = p.listen = p.bind = p.on;\n p.unlisten = p.unbind = p.off = p.removeListener;\n p.trigger = p.emit; // this is just a wrapper alias of .on()\n\n p.pon = p.promiseOn = function (events, selector) {\n var self = this;\n var args = Array.prototype.slice.call(arguments, 0);\n return new Promise$1(function (resolve, reject) {\n var callback = function callback(e) {\n self.off.apply(self, offArgs);\n resolve(e);\n };\n\n var onArgs = args.concat([callback]);\n var offArgs = onArgs.concat([]);\n self.on.apply(self, onArgs);\n });\n };\n }\n}; // define\n\n// use this module to cherry pick functions into your prototype\nvar define$3 = {};\n[define, define$1, define$2].forEach(function (m) {\n extend(define$3, m);\n});\n\nvar elesfn$d = {\n animate: define$3.animate(),\n animation: define$3.animation(),\n animated: define$3.animated(),\n clearQueue: define$3.clearQueue(),\n delay: define$3.delay(),\n delayAnimation: define$3.delayAnimation(),\n stop: define$3.stop()\n};\n\nvar elesfn$e = {\n classes: function classes(_classes) {\n var self = this;\n\n if (_classes === undefined) {\n var ret = [];\n\n self[0]._private.classes.forEach(function (cls) {\n return ret.push(cls);\n });\n\n return ret;\n } else if (!array(_classes)) {\n // extract classes from string\n _classes = (_classes || '').match(/\\S+/g) || [];\n }\n\n var changed = [];\n var classesSet = new Set$1(_classes); // check and update each ele\n\n for (var j = 0; j < self.length; j++) {\n var ele = self[j];\n var _p = ele._private;\n var eleClasses = _p.classes;\n var changedEle = false; // check if ele has all of the passed classes\n\n for (var i = 0; i < _classes.length; i++) {\n var cls = _classes[i];\n var eleHasClass = eleClasses.has(cls);\n\n if (!eleHasClass) {\n changedEle = true;\n break;\n }\n } // check if ele has classes outside of those passed\n\n\n if (!changedEle) {\n changedEle = eleClasses.size !== _classes.length;\n }\n\n if (changedEle) {\n _p.classes = classesSet;\n changed.push(ele);\n }\n } // trigger update style on those eles that had class changes\n\n\n if (changed.length > 0) {\n this.spawn(changed).updateStyle().emit('class');\n }\n\n return self;\n },\n addClass: function addClass(classes) {\n return this.toggleClass(classes, true);\n },\n hasClass: function hasClass(className) {\n var ele = this[0];\n return ele != null && ele._private.classes.has(className);\n },\n toggleClass: function toggleClass(classes, toggle) {\n if (!array(classes)) {\n // extract classes from string\n classes = classes.match(/\\S+/g) || [];\n }\n\n var self = this;\n var toggleUndefd = toggle === undefined;\n var changed = []; // eles who had classes changed\n\n for (var i = 0, il = self.length; i < il; i++) {\n var ele = self[i];\n var eleClasses = ele._private.classes;\n var changedEle = false;\n\n for (var j = 0; j < classes.length; j++) {\n var cls = classes[j];\n var hasClass = eleClasses.has(cls);\n var changedNow = false;\n\n if (toggle || toggleUndefd && !hasClass) {\n eleClasses.add(cls);\n changedNow = true;\n } else if (!toggle || toggleUndefd && hasClass) {\n eleClasses[\"delete\"](cls);\n changedNow = true;\n }\n\n if (!changedEle && changedNow) {\n changed.push(ele);\n changedEle = true;\n }\n } // for j classes\n\n } // for i eles\n // trigger update style on those eles that had class changes\n\n\n if (changed.length > 0) {\n this.spawn(changed).updateStyle().emit('class');\n }\n\n return self;\n },\n removeClass: function removeClass(classes) {\n return this.toggleClass(classes, false);\n },\n flashClass: function flashClass(classes, duration) {\n var self = this;\n\n if (duration == null) {\n duration = 250;\n } else if (duration === 0) {\n return self; // nothing to do really\n }\n\n self.addClass(classes);\n setTimeout(function () {\n self.removeClass(classes);\n }, duration);\n return self;\n }\n};\nelesfn$e.className = elesfn$e.classNames = elesfn$e.classes;\n\nvar tokens = {\n metaChar: '[\\\\!\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\]\\\\^\\\\`\\\\{\\\\|\\\\}\\\\~]',\n // chars we need to escape in let names, etc\n comparatorOp: '=|\\\\!=|>|>=|<|<=|\\\\$=|\\\\^=|\\\\*=',\n // binary comparison op (used in data selectors)\n boolOp: '\\\\?|\\\\!|\\\\^',\n // boolean (unary) operators (used in data selectors)\n string: '\"(?:\\\\\\\\\"|[^\"])*\"' + '|' + \"'(?:\\\\\\\\'|[^'])*'\",\n // string literals (used in data selectors) -- doublequotes | singlequotes\n number: number$1,\n // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123\n meta: 'degree|indegree|outdegree',\n // allowed metadata fields (i.e. allowed functions to use from Collection)\n separator: '\\\\s*,\\\\s*',\n // queries are separated by commas, e.g. edge[foo = 'bar'], node.someClass\n descendant: '\\\\s+',\n child: '\\\\s+>\\\\s+',\n subject: '\\\\$',\n group: 'node|edge|\\\\*',\n directedEdge: '\\\\s+->\\\\s+',\n undirectedEdge: '\\\\s+<->\\\\s+'\n};\ntokens.variable = '(?:[\\\\w-]|(?:\\\\\\\\' + tokens.metaChar + '))+'; // a variable name\n\ntokens.value = tokens.string + '|' + tokens.number; // a value literal, either a string or number\n\ntokens.className = tokens.variable; // a class name (follows variable conventions)\n\ntokens.id = tokens.variable; // an element id (follows variable conventions)\n\n(function () {\n var ops, op, i; // add @ variants to comparatorOp\n\n ops = tokens.comparatorOp.split('|');\n\n for (i = 0; i < ops.length; i++) {\n op = ops[i];\n tokens.comparatorOp += '|@' + op;\n } // add ! variants to comparatorOp\n\n\n ops = tokens.comparatorOp.split('|');\n\n for (i = 0; i < ops.length; i++) {\n op = ops[i];\n\n if (op.indexOf('!') >= 0) {\n continue;\n } // skip ops that explicitly contain !\n\n\n if (op === '=') {\n continue;\n } // skip = b/c != is explicitly defined\n\n\n tokens.comparatorOp += '|\\\\!' + op;\n }\n})();\n\n/**\n * Make a new query object\n *\n * @prop type {Type} The type enum (int) of the query\n * @prop checks List of checks to make against an ele to test for a match\n */\nvar newQuery = function newQuery() {\n return {\n checks: []\n };\n};\n\n/**\n * A check type enum-like object. Uses integer values for fast match() lookup.\n * The ordering does not matter as long as the ints are unique.\n */\nvar Type = {\n /** E.g. node */\n GROUP: 0,\n\n /** A collection of elements */\n COLLECTION: 1,\n\n /** A filter(ele) function */\n FILTER: 2,\n\n /** E.g. [foo > 1] */\n DATA_COMPARE: 3,\n\n /** E.g. [foo] */\n DATA_EXIST: 4,\n\n /** E.g. [?foo] */\n DATA_BOOL: 5,\n\n /** E.g. [[degree > 2]] */\n META_COMPARE: 6,\n\n /** E.g. :selected */\n STATE: 7,\n\n /** E.g. #foo */\n ID: 8,\n\n /** E.g. .foo */\n CLASS: 9,\n\n /** E.g. #foo <-> #bar */\n UNDIRECTED_EDGE: 10,\n\n /** E.g. #foo -> #bar */\n DIRECTED_EDGE: 11,\n\n /** E.g. $#foo -> #bar */\n NODE_SOURCE: 12,\n\n /** E.g. #foo -> $#bar */\n NODE_TARGET: 13,\n\n /** E.g. $#foo <-> #bar */\n NODE_NEIGHBOR: 14,\n\n /** E.g. #foo > #bar */\n CHILD: 15,\n\n /** E.g. #foo #bar */\n DESCENDANT: 16,\n\n /** E.g. $#foo > #bar */\n PARENT: 17,\n\n /** E.g. $#foo #bar */\n ANCESTOR: 18,\n\n /** E.g. #foo > $bar > #baz */\n COMPOUND_SPLIT: 19,\n\n /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */\n TRUE: 20\n};\n\nvar stateSelectors = [{\n selector: ':selected',\n matches: function matches(ele) {\n return ele.selected();\n }\n}, {\n selector: ':unselected',\n matches: function matches(ele) {\n return !ele.selected();\n }\n}, {\n selector: ':selectable',\n matches: function matches(ele) {\n return ele.selectable();\n }\n}, {\n selector: ':unselectable',\n matches: function matches(ele) {\n return !ele.selectable();\n }\n}, {\n selector: ':locked',\n matches: function matches(ele) {\n return ele.locked();\n }\n}, {\n selector: ':unlocked',\n matches: function matches(ele) {\n return !ele.locked();\n }\n}, {\n selector: ':visible',\n matches: function matches(ele) {\n return ele.visible();\n }\n}, {\n selector: ':hidden',\n matches: function matches(ele) {\n return !ele.visible();\n }\n}, {\n selector: ':transparent',\n matches: function matches(ele) {\n return ele.transparent();\n }\n}, {\n selector: ':grabbed',\n matches: function matches(ele) {\n return ele.grabbed();\n }\n}, {\n selector: ':free',\n matches: function matches(ele) {\n return !ele.grabbed();\n }\n}, {\n selector: ':removed',\n matches: function matches(ele) {\n return ele.removed();\n }\n}, {\n selector: ':inside',\n matches: function matches(ele) {\n return !ele.removed();\n }\n}, {\n selector: ':grabbable',\n matches: function matches(ele) {\n return ele.grabbable();\n }\n}, {\n selector: ':ungrabbable',\n matches: function matches(ele) {\n return !ele.grabbable();\n }\n}, {\n selector: ':animated',\n matches: function matches(ele) {\n return ele.animated();\n }\n}, {\n selector: ':unanimated',\n matches: function matches(ele) {\n return !ele.animated();\n }\n}, {\n selector: ':parent',\n matches: function matches(ele) {\n return ele.isParent();\n }\n}, {\n selector: ':childless',\n matches: function matches(ele) {\n return ele.isChildless();\n }\n}, {\n selector: ':child',\n matches: function matches(ele) {\n return ele.isChild();\n }\n}, {\n selector: ':orphan',\n matches: function matches(ele) {\n return ele.isOrphan();\n }\n}, {\n selector: ':nonorphan',\n matches: function matches(ele) {\n return ele.isChild();\n }\n}, {\n selector: ':compound',\n matches: function matches(ele) {\n if (ele.isNode()) {\n return ele.isParent();\n } else {\n return ele.source().isParent() || ele.target().isParent();\n }\n }\n}, {\n selector: ':loop',\n matches: function matches(ele) {\n return ele.isLoop();\n }\n}, {\n selector: ':simple',\n matches: function matches(ele) {\n return ele.isSimple();\n }\n}, {\n selector: ':active',\n matches: function matches(ele) {\n return ele.active();\n }\n}, {\n selector: ':inactive',\n matches: function matches(ele) {\n return !ele.active();\n }\n}, {\n selector: ':backgrounding',\n matches: function matches(ele) {\n return ele.backgrounding();\n }\n}, {\n selector: ':nonbackgrounding',\n matches: function matches(ele) {\n return !ele.backgrounding();\n }\n}].sort(function (a, b) {\n // n.b. selectors that are starting substrings of others must have the longer ones first\n return descending(a.selector, b.selector);\n});\n\nvar lookup = function () {\n var selToFn = {};\n var s;\n\n for (var i = 0; i < stateSelectors.length; i++) {\n s = stateSelectors[i];\n selToFn[s.selector] = s.matches;\n }\n\n return selToFn;\n}();\n\nvar stateSelectorMatches = function stateSelectorMatches(sel, ele) {\n return lookup[sel](ele);\n};\nvar stateSelectorRegex = '(' + stateSelectors.map(function (s) {\n return s.selector;\n}).join('|') + ')';\n\n// so that values get compared properly in Selector.filter()\n\nvar cleanMetaChars = function cleanMetaChars(str) {\n return str.replace(new RegExp('\\\\\\\\(' + tokens.metaChar + ')', 'g'), function (match, $1) {\n return $1;\n });\n};\n\nvar replaceLastQuery = function replaceLastQuery(selector, examiningQuery, replacementQuery) {\n selector[selector.length - 1] = replacementQuery;\n}; // NOTE: add new expression syntax here to have it recognised by the parser;\n// - a query contains all adjacent (i.e. no separator in between) expressions;\n// - the current query is stored in selector[i]\n// - you need to check the query objects in match() for it actually filter properly, but that's pretty straight forward\n\n\nvar exprs = [{\n name: 'group',\n // just used for identifying when debugging\n query: true,\n regex: '(' + tokens.group + ')',\n populate: function populate(selector, query, _ref) {\n var _ref2 = _slicedToArray(_ref, 1),\n group = _ref2[0];\n\n query.checks.push({\n type: Type.GROUP,\n value: group === '*' ? group : group + 's'\n });\n }\n}, {\n name: 'state',\n query: true,\n regex: stateSelectorRegex,\n populate: function populate(selector, query, _ref3) {\n var _ref4 = _slicedToArray(_ref3, 1),\n state = _ref4[0];\n\n query.checks.push({\n type: Type.STATE,\n value: state\n });\n }\n}, {\n name: 'id',\n query: true,\n regex: '\\\\#(' + tokens.id + ')',\n populate: function populate(selector, query, _ref5) {\n var _ref6 = _slicedToArray(_ref5, 1),\n id = _ref6[0];\n\n query.checks.push({\n type: Type.ID,\n value: cleanMetaChars(id)\n });\n }\n}, {\n name: 'className',\n query: true,\n regex: '\\\\.(' + tokens.className + ')',\n populate: function populate(selector, query, _ref7) {\n var _ref8 = _slicedToArray(_ref7, 1),\n className = _ref8[0];\n\n query.checks.push({\n type: Type.CLASS,\n value: cleanMetaChars(className)\n });\n }\n}, {\n name: 'dataExists',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.variable + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref9) {\n var _ref10 = _slicedToArray(_ref9, 1),\n variable = _ref10[0];\n\n query.checks.push({\n type: Type.DATA_EXIST,\n field: cleanMetaChars(variable)\n });\n }\n}, {\n name: 'dataCompare',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.variable + ')\\\\s*(' + tokens.comparatorOp + ')\\\\s*(' + tokens.value + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref11) {\n var _ref12 = _slicedToArray(_ref11, 3),\n variable = _ref12[0],\n comparatorOp = _ref12[1],\n value = _ref12[2];\n\n var valueIsString = new RegExp('^' + tokens.string + '$').exec(value) != null;\n\n if (valueIsString) {\n value = value.substring(1, value.length - 1);\n } else {\n value = parseFloat(value);\n }\n\n query.checks.push({\n type: Type.DATA_COMPARE,\n field: cleanMetaChars(variable),\n operator: comparatorOp,\n value: value\n });\n }\n}, {\n name: 'dataBool',\n query: true,\n regex: '\\\\[\\\\s*(' + tokens.boolOp + ')\\\\s*(' + tokens.variable + ')\\\\s*\\\\]',\n populate: function populate(selector, query, _ref13) {\n var _ref14 = _slicedToArray(_ref13, 2),\n boolOp = _ref14[0],\n variable = _ref14[1];\n\n query.checks.push({\n type: Type.DATA_BOOL,\n field: cleanMetaChars(variable),\n operator: boolOp\n });\n }\n}, {\n name: 'metaCompare',\n query: true,\n regex: '\\\\[\\\\[\\\\s*(' + tokens.meta + ')\\\\s*(' + tokens.comparatorOp + ')\\\\s*(' + tokens.number + ')\\\\s*\\\\]\\\\]',\n populate: function populate(selector, query, _ref15) {\n var _ref16 = _slicedToArray(_ref15, 3),\n meta = _ref16[0],\n comparatorOp = _ref16[1],\n number = _ref16[2];\n\n query.checks.push({\n type: Type.META_COMPARE,\n field: cleanMetaChars(meta),\n operator: comparatorOp,\n value: parseFloat(number)\n });\n }\n}, {\n name: 'nextQuery',\n separator: true,\n regex: tokens.separator,\n populate: function populate(selector, query) {\n var currentSubject = selector.currentSubject;\n var edgeCount = selector.edgeCount;\n var compoundCount = selector.compoundCount;\n var lastQ = selector[selector.length - 1];\n\n if (currentSubject != null) {\n lastQ.subject = currentSubject;\n selector.currentSubject = null;\n }\n\n lastQ.edgeCount = edgeCount;\n lastQ.compoundCount = compoundCount;\n selector.edgeCount = 0;\n selector.compoundCount = 0; // go on to next query\n\n var nextQuery = selector[selector.length++] = newQuery();\n return nextQuery; // this is the new query to be filled by the following exprs\n }\n}, {\n name: 'directedEdge',\n separator: true,\n regex: tokens.directedEdge,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // undirected edge\n var edgeQuery = newQuery();\n var source = query;\n var target = newQuery();\n edgeQuery.checks.push({\n type: Type.DIRECTED_EDGE,\n source: source,\n target: target\n }); // the query in the selector should be the edge rather than the source\n\n replaceLastQuery(selector, query, edgeQuery);\n selector.edgeCount++; // we're now populating the target query with expressions that follow\n\n return target;\n } else {\n // source/target\n var srcTgtQ = newQuery();\n var _source = query;\n\n var _target = newQuery();\n\n srcTgtQ.checks.push({\n type: Type.NODE_SOURCE,\n source: _source,\n target: _target\n }); // the query in the selector should be the neighbourhood rather than the node\n\n replaceLastQuery(selector, query, srcTgtQ);\n selector.edgeCount++;\n return _target; // now populating the target with the following expressions\n }\n }\n}, {\n name: 'undirectedEdge',\n separator: true,\n regex: tokens.undirectedEdge,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // undirected edge\n var edgeQuery = newQuery();\n var source = query;\n var target = newQuery();\n edgeQuery.checks.push({\n type: Type.UNDIRECTED_EDGE,\n nodes: [source, target]\n }); // the query in the selector should be the edge rather than the source\n\n replaceLastQuery(selector, query, edgeQuery);\n selector.edgeCount++; // we're now populating the target query with expressions that follow\n\n return target;\n } else {\n // neighbourhood\n var nhoodQ = newQuery();\n var node = query;\n var neighbor = newQuery();\n nhoodQ.checks.push({\n type: Type.NODE_NEIGHBOR,\n node: node,\n neighbor: neighbor\n }); // the query in the selector should be the neighbourhood rather than the node\n\n replaceLastQuery(selector, query, nhoodQ);\n return neighbor; // now populating the neighbor with following expressions\n }\n }\n}, {\n name: 'child',\n separator: true,\n regex: tokens.child,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // default: child query\n var parentChildQuery = newQuery();\n var child = newQuery();\n var parent = selector[selector.length - 1];\n parentChildQuery.checks.push({\n type: Type.CHILD,\n parent: parent,\n child: child\n }); // the query in the selector should be the '>' itself\n\n replaceLastQuery(selector, query, parentChildQuery);\n selector.compoundCount++; // we're now populating the child query with expressions that follow\n\n return child;\n } else if (selector.currentSubject === query) {\n // compound split query\n var compound = newQuery();\n var left = selector[selector.length - 1];\n var right = newQuery();\n var subject = newQuery();\n\n var _child = newQuery();\n\n var _parent = newQuery(); // set up the root compound q\n\n\n compound.checks.push({\n type: Type.COMPOUND_SPLIT,\n left: left,\n right: right,\n subject: subject\n }); // populate the subject and replace the q at the old spot (within left) with TRUE\n\n subject.checks = query.checks; // take the checks from the left\n\n query.checks = [{\n type: Type.TRUE\n }]; // checks under left refs the subject implicitly\n // set up the right q\n\n _parent.checks.push({\n type: Type.TRUE\n }); // parent implicitly refs the subject\n\n\n right.checks.push({\n type: Type.PARENT,\n // type is swapped on right side queries\n parent: _parent,\n child: _child // empty for now\n\n });\n replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query`\n\n selector.currentSubject = subject;\n selector.compoundCount++;\n return _child; // now populating the right side's child\n } else {\n // parent query\n // info for parent query\n var _parent2 = newQuery();\n\n var _child2 = newQuery();\n\n var pcQChecks = [{\n type: Type.PARENT,\n parent: _parent2,\n child: _child2\n }]; // the parent-child query takes the place of the query previously being populated\n\n _parent2.checks = query.checks; // the previous query contains the checks for the parent\n\n query.checks = pcQChecks; // pc query takes over\n\n selector.compoundCount++;\n return _child2; // we're now populating the child\n }\n }\n}, {\n name: 'descendant',\n separator: true,\n regex: tokens.descendant,\n populate: function populate(selector, query) {\n if (selector.currentSubject == null) {\n // default: descendant query\n var ancChQuery = newQuery();\n var descendant = newQuery();\n var ancestor = selector[selector.length - 1];\n ancChQuery.checks.push({\n type: Type.DESCENDANT,\n ancestor: ancestor,\n descendant: descendant\n }); // the query in the selector should be the '>' itself\n\n replaceLastQuery(selector, query, ancChQuery);\n selector.compoundCount++; // we're now populating the descendant query with expressions that follow\n\n return descendant;\n } else if (selector.currentSubject === query) {\n // compound split query\n var compound = newQuery();\n var left = selector[selector.length - 1];\n var right = newQuery();\n var subject = newQuery();\n\n var _descendant = newQuery();\n\n var _ancestor = newQuery(); // set up the root compound q\n\n\n compound.checks.push({\n type: Type.COMPOUND_SPLIT,\n left: left,\n right: right,\n subject: subject\n }); // populate the subject and replace the q at the old spot (within left) with TRUE\n\n subject.checks = query.checks; // take the checks from the left\n\n query.checks = [{\n type: Type.TRUE\n }]; // checks under left refs the subject implicitly\n // set up the right q\n\n _ancestor.checks.push({\n type: Type.TRUE\n }); // ancestor implicitly refs the subject\n\n\n right.checks.push({\n type: Type.ANCESTOR,\n // type is swapped on right side queries\n ancestor: _ancestor,\n descendant: _descendant // empty for now\n\n });\n replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query`\n\n selector.currentSubject = subject;\n selector.compoundCount++;\n return _descendant; // now populating the right side's descendant\n } else {\n // ancestor query\n // info for parent query\n var _ancestor2 = newQuery();\n\n var _descendant2 = newQuery();\n\n var adQChecks = [{\n type: Type.ANCESTOR,\n ancestor: _ancestor2,\n descendant: _descendant2\n }]; // the parent-child query takes the place of the query previously being populated\n\n _ancestor2.checks = query.checks; // the previous query contains the checks for the parent\n\n query.checks = adQChecks; // pc query takes over\n\n selector.compoundCount++;\n return _descendant2; // we're now populating the child\n }\n }\n}, {\n name: 'subject',\n modifier: true,\n regex: tokens.subject,\n populate: function populate(selector, query) {\n if (selector.currentSubject != null && selector.currentSubject !== query) {\n warn('Redefinition of subject in selector `' + selector.toString() + '`');\n return false;\n }\n\n selector.currentSubject = query;\n var topQ = selector[selector.length - 1];\n var topChk = topQ.checks[0];\n var topType = topChk == null ? null : topChk.type;\n\n if (topType === Type.DIRECTED_EDGE) {\n // directed edge with subject on the target\n // change to target node check\n topChk.type = Type.NODE_TARGET;\n } else if (topType === Type.UNDIRECTED_EDGE) {\n // undirected edge with subject on the second node\n // change to neighbor check\n topChk.type = Type.NODE_NEIGHBOR;\n topChk.node = topChk.nodes[1]; // second node is subject\n\n topChk.neighbor = topChk.nodes[0]; // clean up unused fields for new type\n\n topChk.nodes = null;\n }\n }\n}];\nexprs.forEach(function (e) {\n return e.regexObj = new RegExp('^' + e.regex);\n});\n\n/**\n * Of all the expressions, find the first match in the remaining text.\n * @param {string} remaining The remaining text to parse\n * @returns The matched expression and the newly remaining text `{ expr, match, name, remaining }`\n */\n\nvar consumeExpr = function consumeExpr(remaining) {\n var expr;\n var match;\n var name;\n\n for (var j = 0; j < exprs.length; j++) {\n var e = exprs[j];\n var n = e.name;\n var m = remaining.match(e.regexObj);\n\n if (m != null) {\n match = m;\n expr = e;\n name = n;\n var consumed = m[0];\n remaining = remaining.substring(consumed.length);\n break; // we've consumed one expr, so we can return now\n }\n }\n\n return {\n expr: expr,\n match: match,\n name: name,\n remaining: remaining\n };\n};\n/**\n * Consume all the leading whitespace\n * @param {string} remaining The text to consume\n * @returns The text with the leading whitespace removed\n */\n\n\nvar consumeWhitespace = function consumeWhitespace(remaining) {\n var match = remaining.match(/^\\s+/);\n\n if (match) {\n var consumed = match[0];\n remaining = remaining.substring(consumed.length);\n }\n\n return remaining;\n};\n/**\n * Parse the string and store the parsed representation in the Selector.\n * @param {string} selector The selector string\n * @returns `true` if the selector was successfully parsed, `false` otherwise\n */\n\n\nvar parse = function parse(selector) {\n var self = this;\n var remaining = self.inputText = selector;\n var currentQuery = self[0] = newQuery();\n self.length = 1;\n remaining = consumeWhitespace(remaining); // get rid of leading whitespace\n\n for (;;) {\n var exprInfo = consumeExpr(remaining);\n\n if (exprInfo.expr == null) {\n warn('The selector `' + selector + '`is invalid');\n return false;\n } else {\n var args = exprInfo.match.slice(1); // let the token populate the selector object in currentQuery\n\n var ret = exprInfo.expr.populate(self, currentQuery, args);\n\n if (ret === false) {\n return false; // exit if population failed\n } else if (ret != null) {\n currentQuery = ret; // change the current query to be filled if the expr specifies\n }\n }\n\n remaining = exprInfo.remaining; // we're done when there's nothing left to parse\n\n if (remaining.match(/^\\s*$/)) {\n break;\n }\n }\n\n var lastQ = self[self.length - 1];\n\n if (self.currentSubject != null) {\n lastQ.subject = self.currentSubject;\n }\n\n lastQ.edgeCount = self.edgeCount;\n lastQ.compoundCount = self.compoundCount;\n\n for (var i = 0; i < self.length; i++) {\n var q = self[i]; // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations\n\n if (q.compoundCount > 0 && q.edgeCount > 0) {\n warn('The selector `' + selector + '` is invalid because it uses both a compound selector and an edge selector');\n return false;\n }\n\n if (q.edgeCount > 1) {\n warn('The selector `' + selector + '` is invalid because it uses multiple edge selectors');\n return false;\n } else if (q.edgeCount === 1) {\n warn('The selector `' + selector + '` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.');\n }\n }\n\n return true; // success\n};\n/**\n * Get the selector represented as a string. This value uses default formatting,\n * so things like spacing may differ from the input text passed to the constructor.\n * @returns {string} The selector string\n */\n\n\nvar toString = function toString() {\n if (this.toStringCache != null) {\n return this.toStringCache;\n }\n\n var clean = function clean(obj) {\n if (obj == null) {\n return '';\n } else {\n return obj;\n }\n };\n\n var cleanVal = function cleanVal(val) {\n if (string(val)) {\n return '\"' + val + '\"';\n } else {\n return clean(val);\n }\n };\n\n var space = function space(val) {\n return ' ' + val + ' ';\n };\n\n var checkToString = function checkToString(check, subject) {\n var type = check.type,\n value = check.value;\n\n switch (type) {\n case Type.GROUP:\n {\n var group = clean(value);\n return group.substring(0, group.length - 1);\n }\n\n case Type.DATA_COMPARE:\n {\n var field = check.field,\n operator = check.operator;\n return '[' + field + space(clean(operator)) + cleanVal(value) + ']';\n }\n\n case Type.DATA_BOOL:\n {\n var _operator = check.operator,\n _field = check.field;\n return '[' + clean(_operator) + _field + ']';\n }\n\n case Type.DATA_EXIST:\n {\n var _field2 = check.field;\n return '[' + _field2 + ']';\n }\n\n case Type.META_COMPARE:\n {\n var _operator2 = check.operator,\n _field3 = check.field;\n return '[[' + _field3 + space(clean(_operator2)) + cleanVal(value) + ']]';\n }\n\n case Type.STATE:\n {\n return value;\n }\n\n case Type.ID:\n {\n return '#' + value;\n }\n\n case Type.CLASS:\n {\n return '.' + value;\n }\n\n case Type.PARENT:\n case Type.CHILD:\n {\n return queryToString(check.parent, subject) + space('>') + queryToString(check.child, subject);\n }\n\n case Type.ANCESTOR:\n case Type.DESCENDANT:\n {\n return queryToString(check.ancestor, subject) + ' ' + queryToString(check.descendant, subject);\n }\n\n case Type.COMPOUND_SPLIT:\n {\n var lhs = queryToString(check.left, subject);\n var sub = queryToString(check.subject, subject);\n var rhs = queryToString(check.right, subject);\n return lhs + (lhs.length > 0 ? ' ' : '') + sub + rhs;\n }\n\n case Type.TRUE:\n {\n return '';\n }\n }\n };\n\n var queryToString = function queryToString(query, subject) {\n return query.checks.reduce(function (str, chk, i) {\n return str + (subject === query && i === 0 ? '$' : '') + checkToString(chk, subject);\n }, '');\n };\n\n var str = '';\n\n for (var i = 0; i < this.length; i++) {\n var query = this[i];\n str += queryToString(query, query.subject);\n\n if (this.length > 1 && i < this.length - 1) {\n str += ', ';\n }\n }\n\n this.toStringCache = str;\n return str;\n};\nvar parse$1 = {\n parse: parse,\n toString: toString\n};\n\nvar valCmp = function valCmp(fieldVal, operator, value) {\n var matches;\n var isFieldStr = string(fieldVal);\n var isFieldNum = number(fieldVal);\n var isValStr = string(value);\n var fieldStr, valStr;\n var caseInsensitive = false;\n var notExpr = false;\n var isIneqCmp = false;\n\n if (operator.indexOf('!') >= 0) {\n operator = operator.replace('!', '');\n notExpr = true;\n }\n\n if (operator.indexOf('@') >= 0) {\n operator = operator.replace('@', '');\n caseInsensitive = true;\n }\n\n if (isFieldStr || isValStr || caseInsensitive) {\n fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal;\n valStr = '' + value;\n } // if we're doing a case insensitive comparison, then we're using a STRING comparison\n // even if we're comparing numbers\n\n\n if (caseInsensitive) {\n fieldVal = fieldStr = fieldStr.toLowerCase();\n value = valStr = valStr.toLowerCase();\n }\n\n switch (operator) {\n case '*=':\n matches = fieldStr.indexOf(valStr) >= 0;\n break;\n\n case '$=':\n matches = fieldStr.indexOf(valStr, fieldStr.length - valStr.length) >= 0;\n break;\n\n case '^=':\n matches = fieldStr.indexOf(valStr) === 0;\n break;\n\n case '=':\n matches = fieldVal === value;\n break;\n\n case '>':\n isIneqCmp = true;\n matches = fieldVal > value;\n break;\n\n case '>=':\n isIneqCmp = true;\n matches = fieldVal >= value;\n break;\n\n case '<':\n isIneqCmp = true;\n matches = fieldVal < value;\n break;\n\n case '<=':\n isIneqCmp = true;\n matches = fieldVal <= value;\n break;\n\n default:\n matches = false;\n break;\n } // apply the not op, but null vals for inequalities should always stay non-matching\n\n\n if (notExpr && (fieldVal != null || !isIneqCmp)) {\n matches = !matches;\n }\n\n return matches;\n};\nvar boolCmp = function boolCmp(fieldVal, operator) {\n switch (operator) {\n case '?':\n return fieldVal ? true : false;\n\n case '!':\n return fieldVal ? false : true;\n\n case '^':\n return fieldVal === undefined;\n }\n};\nvar existCmp = function existCmp(fieldVal) {\n return fieldVal !== undefined;\n};\nvar data = function data(ele, field) {\n return ele.data(field);\n};\nvar meta = function meta(ele, field) {\n return ele[field]();\n};\n\n/** A lookup of `match(check, ele)` functions by `Type` int */\n\nvar match = [];\n/**\n * Returns whether the query matches for the element\n * @param query The `{ type, value, ... }` query object\n * @param ele The element to compare against\n*/\n\nvar matches = function matches(query, ele) {\n return query.checks.every(function (chk) {\n return match[chk.type](chk, ele);\n });\n};\n\nmatch[Type.GROUP] = function (check, ele) {\n var group = check.value;\n return group === '*' || group === ele.group();\n};\n\nmatch[Type.STATE] = function (check, ele) {\n var stateSelector = check.value;\n return stateSelectorMatches(stateSelector, ele);\n};\n\nmatch[Type.ID] = function (check, ele) {\n var id = check.value;\n return ele.id() === id;\n};\n\nmatch[Type.CLASS] = function (check, ele) {\n var cls = check.value;\n return ele.hasClass(cls);\n};\n\nmatch[Type.META_COMPARE] = function (check, ele) {\n var field = check.field,\n operator = check.operator,\n value = check.value;\n return valCmp(meta(ele, field), operator, value);\n};\n\nmatch[Type.DATA_COMPARE] = function (check, ele) {\n var field = check.field,\n operator = check.operator,\n value = check.value;\n return valCmp(data(ele, field), operator, value);\n};\n\nmatch[Type.DATA_BOOL] = function (check, ele) {\n var field = check.field,\n operator = check.operator;\n return boolCmp(data(ele, field), operator);\n};\n\nmatch[Type.DATA_EXIST] = function (check, ele) {\n var field = check.field,\n operator = check.operator;\n return existCmp(data(ele, field));\n};\n\nmatch[Type.UNDIRECTED_EDGE] = function (check, ele) {\n var qA = check.nodes[0];\n var qB = check.nodes[1];\n var src = ele.source();\n var tgt = ele.target();\n return matches(qA, src) && matches(qB, tgt) || matches(qB, src) && matches(qA, tgt);\n};\n\nmatch[Type.NODE_NEIGHBOR] = function (check, ele) {\n return matches(check.node, ele) && ele.neighborhood().some(function (n) {\n return n.isNode() && matches(check.neighbor, n);\n });\n};\n\nmatch[Type.DIRECTED_EDGE] = function (check, ele) {\n return matches(check.source, ele.source()) && matches(check.target, ele.target());\n};\n\nmatch[Type.NODE_SOURCE] = function (check, ele) {\n return matches(check.source, ele) && ele.outgoers().some(function (n) {\n return n.isNode() && matches(check.target, n);\n });\n};\n\nmatch[Type.NODE_TARGET] = function (check, ele) {\n return matches(check.target, ele) && ele.incomers().some(function (n) {\n return n.isNode() && matches(check.source, n);\n });\n};\n\nmatch[Type.CHILD] = function (check, ele) {\n return matches(check.child, ele) && matches(check.parent, ele.parent());\n};\n\nmatch[Type.PARENT] = function (check, ele) {\n return matches(check.parent, ele) && ele.children().some(function (c) {\n return matches(check.child, c);\n });\n};\n\nmatch[Type.DESCENDANT] = function (check, ele) {\n return matches(check.descendant, ele) && ele.ancestors().some(function (a) {\n return matches(check.ancestor, a);\n });\n};\n\nmatch[Type.ANCESTOR] = function (check, ele) {\n return matches(check.ancestor, ele) && ele.descendants().some(function (d) {\n return matches(check.descendant, d);\n });\n};\n\nmatch[Type.COMPOUND_SPLIT] = function (check, ele) {\n return matches(check.subject, ele) && matches(check.left, ele) && matches(check.right, ele);\n};\n\nmatch[Type.TRUE] = function () {\n return true;\n};\n\nmatch[Type.COLLECTION] = function (check, ele) {\n var collection = check.value;\n return collection.has(ele);\n};\n\nmatch[Type.FILTER] = function (check, ele) {\n var filter = check.value;\n return filter(ele);\n};\n\nvar filter = function filter(collection) {\n var self = this; // for 1 id #foo queries, just get the element\n\n if (self.length === 1 && self[0].checks.length === 1 && self[0].checks[0].type === Type.ID) {\n return collection.getElementById(self[0].checks[0].value).collection();\n }\n\n var selectorFunction = function selectorFunction(element) {\n for (var j = 0; j < self.length; j++) {\n var query = self[j];\n\n if (matches(query, element)) {\n return true;\n }\n }\n\n return false;\n };\n\n if (self.text() == null) {\n selectorFunction = function selectorFunction() {\n return true;\n };\n }\n\n return collection.filter(selectorFunction);\n}; // filter\n// does selector match a single element?\n\n\nvar matches$1 = function matches$1(ele) {\n var self = this;\n\n for (var j = 0; j < self.length; j++) {\n var query = self[j];\n\n if (matches(query, ele)) {\n return true;\n }\n }\n\n return false;\n}; // matches\n\n\nvar matching = {\n matches: matches$1,\n filter: filter\n};\n\nvar Selector = function Selector(selector) {\n this.inputText = selector;\n this.currentSubject = null;\n this.compoundCount = 0;\n this.edgeCount = 0;\n this.length = 0;\n\n if (selector == null || string(selector) && selector.match(/^\\s*$/)) ; else if (elementOrCollection(selector)) {\n this.addQuery({\n checks: [{\n type: Type.COLLECTION,\n value: selector.collection()\n }]\n });\n } else if (fn(selector)) {\n this.addQuery({\n checks: [{\n type: Type.FILTER,\n value: selector\n }]\n });\n } else if (string(selector)) {\n if (!this.parse(selector)) {\n this.invalid = true;\n }\n } else {\n error('A selector must be created from a string; found ');\n }\n};\n\nvar selfn = Selector.prototype;\n[parse$1, matching].forEach(function (p) {\n return extend(selfn, p);\n});\n\nselfn.text = function () {\n return this.inputText;\n};\n\nselfn.size = function () {\n return this.length;\n};\n\nselfn.eq = function (i) {\n return this[i];\n};\n\nselfn.sameText = function (otherSel) {\n return !this.invalid && !otherSel.invalid && this.text() === otherSel.text();\n};\n\nselfn.addQuery = function (q) {\n this[this.length++] = q;\n};\n\nselfn.selector = selfn.toString;\n\nvar elesfn$f = {\n allAre: function allAre(selector) {\n var selObj = new Selector(selector);\n return this.every(function (ele) {\n return selObj.matches(ele);\n });\n },\n is: function is(selector) {\n var selObj = new Selector(selector);\n return this.some(function (ele) {\n return selObj.matches(ele);\n });\n },\n some: function some(fn, thisArg) {\n for (var i = 0; i < this.length; i++) {\n var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]);\n\n if (ret) {\n return true;\n }\n }\n\n return false;\n },\n every: function every(fn, thisArg) {\n for (var i = 0; i < this.length; i++) {\n var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]);\n\n if (!ret) {\n return false;\n }\n }\n\n return true;\n },\n same: function same(collection) {\n // cheap collection ref check\n if (this === collection) {\n return true;\n }\n\n collection = this.cy().collection(collection);\n var thisLength = this.length;\n var collectionLength = collection.length; // cheap length check\n\n if (thisLength !== collectionLength) {\n return false;\n } // cheap element ref check\n\n\n if (thisLength === 1) {\n return this[0] === collection[0];\n }\n\n return this.every(function (ele) {\n return collection.hasElementWithId(ele.id());\n });\n },\n anySame: function anySame(collection) {\n collection = this.cy().collection(collection);\n return this.some(function (ele) {\n return collection.hasElementWithId(ele.id());\n });\n },\n allAreNeighbors: function allAreNeighbors(collection) {\n collection = this.cy().collection(collection);\n var nhood = this.neighborhood();\n return collection.every(function (ele) {\n return nhood.hasElementWithId(ele.id());\n });\n },\n contains: function contains(collection) {\n collection = this.cy().collection(collection);\n var self = this;\n return collection.every(function (ele) {\n return self.hasElementWithId(ele.id());\n });\n }\n};\nelesfn$f.allAreNeighbours = elesfn$f.allAreNeighbors;\nelesfn$f.has = elesfn$f.contains;\nelesfn$f.equal = elesfn$f.equals = elesfn$f.same;\n\nvar cache = function cache(fn, name) {\n return function traversalCache(arg1, arg2, arg3, arg4) {\n var selectorOrEles = arg1;\n var eles = this;\n var key;\n\n if (selectorOrEles == null) {\n key = '';\n } else if (elementOrCollection(selectorOrEles) && selectorOrEles.length === 1) {\n key = selectorOrEles.id();\n }\n\n if (eles.length === 1 && key) {\n var _p = eles[0]._private;\n var tch = _p.traversalCache = _p.traversalCache || {};\n var ch = tch[name] = tch[name] || [];\n var hash = hashString(key);\n var cacheHit = ch[hash];\n\n if (cacheHit) {\n return cacheHit;\n } else {\n return ch[hash] = fn.call(eles, arg1, arg2, arg3, arg4);\n }\n } else {\n return fn.call(eles, arg1, arg2, arg3, arg4);\n }\n };\n};\n\nvar elesfn$g = {\n parent: function parent(selector) {\n var parents = []; // optimisation for single ele call\n\n if (this.length === 1) {\n var parent = this[0]._private.parent;\n\n if (parent) {\n return parent;\n }\n }\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _parent = ele._private.parent;\n\n if (_parent) {\n parents.push(_parent);\n }\n }\n\n return this.spawn(parents, true).filter(selector);\n },\n parents: function parents(selector) {\n var parents = [];\n var eles = this.parent();\n\n while (eles.nonempty()) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n parents.push(ele);\n }\n\n eles = eles.parent();\n }\n\n return this.spawn(parents, true).filter(selector);\n },\n commonAncestors: function commonAncestors(selector) {\n var ancestors;\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var parents = ele.parents();\n ancestors = ancestors || parents;\n ancestors = ancestors.intersect(parents); // current list must be common with current ele parents set\n }\n\n return ancestors.filter(selector);\n },\n orphans: function orphans(selector) {\n return this.stdFilter(function (ele) {\n return ele.isOrphan();\n }).filter(selector);\n },\n nonorphans: function nonorphans(selector) {\n return this.stdFilter(function (ele) {\n return ele.isChild();\n }).filter(selector);\n },\n children: cache(function (selector) {\n var children = [];\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var eleChildren = ele._private.children;\n\n for (var j = 0; j < eleChildren.length; j++) {\n children.push(eleChildren[j]);\n }\n }\n\n return this.spawn(children, true).filter(selector);\n }, 'children'),\n siblings: function siblings(selector) {\n return this.parent().children().not(this).filter(selector);\n },\n isParent: function isParent() {\n var ele = this[0];\n\n if (ele) {\n return ele.isNode() && ele._private.children.length !== 0;\n }\n },\n isChildless: function isChildless() {\n var ele = this[0];\n\n if (ele) {\n return ele.isNode() && ele._private.children.length === 0;\n }\n },\n isChild: function isChild() {\n var ele = this[0];\n\n if (ele) {\n return ele.isNode() && ele._private.parent != null;\n }\n },\n isOrphan: function isOrphan() {\n var ele = this[0];\n\n if (ele) {\n return ele.isNode() && ele._private.parent == null;\n }\n },\n descendants: function descendants(selector) {\n var elements = [];\n\n function add(eles) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n elements.push(ele);\n\n if (ele.children().nonempty()) {\n add(ele.children());\n }\n }\n }\n\n add(this.children());\n return this.spawn(elements, true).filter(selector);\n }\n};\n\nfunction forEachCompound(eles, fn, includeSelf, recursiveStep) {\n var q = [];\n var did = new Set$1();\n var cy = eles.cy();\n var hasCompounds = cy.hasCompoundNodes();\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n\n if (includeSelf) {\n q.push(ele);\n } else if (hasCompounds) {\n recursiveStep(q, did, ele);\n }\n }\n\n while (q.length > 0) {\n var _ele = q.shift();\n\n fn(_ele);\n did.add(_ele.id());\n\n if (hasCompounds) {\n recursiveStep(q, did, _ele);\n }\n }\n\n return eles;\n}\n\nfunction addChildren(q, did, ele) {\n if (ele.isParent()) {\n var children = ele._private.children;\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n\n if (!did.has(child.id())) {\n q.push(child);\n }\n }\n }\n} // very efficient version of eles.add( eles.descendants() ).forEach()\n// for internal use\n\n\nelesfn$g.forEachDown = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addChildren);\n};\n\nfunction addParent(q, did, ele) {\n if (ele.isChild()) {\n var parent = ele._private.parent;\n\n if (!did.has(parent.id())) {\n q.push(parent);\n }\n }\n}\n\nelesfn$g.forEachUp = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addParent);\n};\n\nfunction addParentAndChildren(q, did, ele) {\n addParent(q, did, ele);\n addChildren(q, did, ele);\n}\n\nelesfn$g.forEachUpAndDown = function (fn) {\n var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return forEachCompound(this, fn, includeSelf, addParentAndChildren);\n}; // aliases\n\n\nelesfn$g.ancestors = elesfn$g.parents;\n\nvar fn$1, elesfn$h;\nfn$1 = elesfn$h = {\n data: define$3.data({\n field: 'data',\n bindingEvent: 'data',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'data',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n immutableKeys: {\n 'id': true,\n 'source': true,\n 'target': true,\n 'parent': true\n },\n updateStyle: true\n }),\n removeData: define$3.removeData({\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: true,\n immutableKeys: {\n 'id': true,\n 'source': true,\n 'target': true,\n 'parent': true\n },\n updateStyle: true\n }),\n scratch: define$3.data({\n field: 'scratch',\n bindingEvent: 'scratch',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'scratch',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true,\n updateStyle: true\n }),\n removeScratch: define$3.removeData({\n field: 'scratch',\n event: 'scratch',\n triggerFnName: 'trigger',\n triggerEvent: true,\n updateStyle: true\n }),\n rscratch: define$3.data({\n field: 'rscratch',\n allowBinding: false,\n allowSetting: true,\n settingTriggersEvent: false,\n allowGetting: true\n }),\n removeRscratch: define$3.removeData({\n field: 'rscratch',\n triggerEvent: false\n }),\n id: function id() {\n var ele = this[0];\n\n if (ele) {\n return ele._private.data.id;\n }\n }\n}; // aliases\n\nfn$1.attr = fn$1.data;\nfn$1.removeAttr = fn$1.removeData;\nvar data$1 = elesfn$h;\n\nvar elesfn$i = {};\n\nfunction defineDegreeFunction(callback) {\n return function (includeLoops) {\n var self = this;\n\n if (includeLoops === undefined) {\n includeLoops = true;\n }\n\n if (self.length === 0) {\n return;\n }\n\n if (self.isNode() && !self.removed()) {\n var degree = 0;\n var node = self[0];\n var connectedEdges = node._private.edges;\n\n for (var i = 0; i < connectedEdges.length; i++) {\n var edge = connectedEdges[i];\n\n if (!includeLoops && edge.isLoop()) {\n continue;\n }\n\n degree += callback(node, edge);\n }\n\n return degree;\n } else {\n return;\n }\n };\n}\n\nextend(elesfn$i, {\n degree: defineDegreeFunction(function (node, edge) {\n if (edge.source().same(edge.target())) {\n return 2;\n } else {\n return 1;\n }\n }),\n indegree: defineDegreeFunction(function (node, edge) {\n if (edge.target().same(node)) {\n return 1;\n } else {\n return 0;\n }\n }),\n outdegree: defineDegreeFunction(function (node, edge) {\n if (edge.source().same(node)) {\n return 1;\n } else {\n return 0;\n }\n })\n});\n\nfunction defineDegreeBoundsFunction(degreeFn, callback) {\n return function (includeLoops) {\n var ret;\n var nodes = this.nodes();\n\n for (var i = 0; i < nodes.length; i++) {\n var ele = nodes[i];\n var degree = ele[degreeFn](includeLoops);\n\n if (degree !== undefined && (ret === undefined || callback(degree, ret))) {\n ret = degree;\n }\n }\n\n return ret;\n };\n}\n\nextend(elesfn$i, {\n minDegree: defineDegreeBoundsFunction('degree', function (degree, min) {\n return degree < min;\n }),\n maxDegree: defineDegreeBoundsFunction('degree', function (degree, max) {\n return degree > max;\n }),\n minIndegree: defineDegreeBoundsFunction('indegree', function (degree, min) {\n return degree < min;\n }),\n maxIndegree: defineDegreeBoundsFunction('indegree', function (degree, max) {\n return degree > max;\n }),\n minOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, min) {\n return degree < min;\n }),\n maxOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, max) {\n return degree > max;\n })\n});\nextend(elesfn$i, {\n totalDegree: function totalDegree(includeLoops) {\n var total = 0;\n var nodes = this.nodes();\n\n for (var i = 0; i < nodes.length; i++) {\n total += nodes[i].degree(includeLoops);\n }\n\n return total;\n }\n});\n\nvar fn$2, elesfn$j;\n\nvar beforePositionSet = function beforePositionSet(eles, newPos, silent) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n\n if (!ele.locked()) {\n var oldPos = ele._private.position;\n var delta = {\n x: newPos.x != null ? newPos.x - oldPos.x : 0,\n y: newPos.y != null ? newPos.y - oldPos.y : 0\n };\n\n if (ele.isParent() && !(delta.x === 0 && delta.y === 0)) {\n ele.children().shift(delta, silent);\n }\n\n ele.dirtyBoundingBoxCache();\n }\n }\n};\n\nvar positionDef = {\n field: 'position',\n bindingEvent: 'position',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'position',\n settingTriggersEvent: true,\n triggerFnName: 'emitAndNotify',\n allowGetting: true,\n validKeys: ['x', 'y'],\n beforeGet: function beforeGet(ele) {\n ele.updateCompoundBounds();\n },\n beforeSet: function beforeSet(eles, newPos) {\n beforePositionSet(eles, newPos, false);\n },\n onSet: function onSet(eles) {\n eles.dirtyCompoundBoundsCache();\n },\n canSet: function canSet(ele) {\n return !ele.locked();\n }\n};\nfn$2 = elesfn$j = {\n position: define$3.data(positionDef),\n // position but no notification to renderer\n silentPosition: define$3.data(extend({}, positionDef, {\n allowBinding: false,\n allowSetting: true,\n settingTriggersEvent: false,\n allowGetting: false,\n beforeSet: function beforeSet(eles, newPos) {\n beforePositionSet(eles, newPos, true);\n },\n onSet: function onSet(eles) {\n eles.dirtyCompoundBoundsCache();\n }\n })),\n positions: function positions(pos, silent) {\n if (plainObject(pos)) {\n if (silent) {\n this.silentPosition(pos);\n } else {\n this.position(pos);\n }\n } else if (fn(pos)) {\n var _fn = pos;\n var cy = this.cy();\n cy.startBatch();\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n\n var _pos = void 0;\n\n if (_pos = _fn(ele, i)) {\n if (silent) {\n ele.silentPosition(_pos);\n } else {\n ele.position(_pos);\n }\n }\n }\n\n cy.endBatch();\n }\n\n return this; // chaining\n },\n silentPositions: function silentPositions(pos) {\n return this.positions(pos, true);\n },\n shift: function shift(dim, val, silent) {\n var delta;\n\n if (plainObject(dim)) {\n delta = {\n x: number(dim.x) ? dim.x : 0,\n y: number(dim.y) ? dim.y : 0\n };\n silent = val;\n } else if (string(dim) && number(val)) {\n delta = {\n x: 0,\n y: 0\n };\n delta[dim] = val;\n }\n\n if (delta != null) {\n var cy = this.cy();\n cy.startBatch();\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var pos = ele.position();\n var newPos = {\n x: pos.x + delta.x,\n y: pos.y + delta.y\n };\n\n if (silent) {\n ele.silentPosition(newPos);\n } else {\n ele.position(newPos);\n }\n }\n\n cy.endBatch();\n }\n\n return this;\n },\n silentShift: function silentShift(dim, val) {\n if (plainObject(dim)) {\n this.shift(dim, true);\n } else if (string(dim) && number(val)) {\n this.shift(dim, val, true);\n }\n\n return this;\n },\n // get/set the rendered (i.e. on screen) positon of the element\n renderedPosition: function renderedPosition(dim, val) {\n var ele = this[0];\n var cy = this.cy();\n var zoom = cy.zoom();\n var pan = cy.pan();\n var rpos = plainObject(dim) ? dim : undefined;\n var setting = rpos !== undefined || val !== undefined && string(dim);\n\n if (ele && ele.isNode()) {\n // must have an element and must be a node to return position\n if (setting) {\n for (var i = 0; i < this.length; i++) {\n var _ele = this[i];\n\n if (val !== undefined) {\n // set one dimension\n _ele.position(dim, (val - pan[dim]) / zoom);\n } else if (rpos !== undefined) {\n // set whole position\n _ele.position(renderedToModelPosition(rpos, zoom, pan));\n }\n }\n } else {\n // getting\n var pos = ele.position();\n rpos = modelToRenderedPosition(pos, zoom, pan);\n\n if (dim === undefined) {\n // then return the whole rendered position\n return rpos;\n } else {\n // then return the specified dimension\n return rpos[dim];\n }\n }\n } else if (!setting) {\n return undefined; // for empty collection case\n }\n\n return this; // chaining\n },\n // get/set the position relative to the parent\n relativePosition: function relativePosition(dim, val) {\n var ele = this[0];\n var cy = this.cy();\n var ppos = plainObject(dim) ? dim : undefined;\n var setting = ppos !== undefined || val !== undefined && string(dim);\n var hasCompoundNodes = cy.hasCompoundNodes();\n\n if (ele && ele.isNode()) {\n // must have an element and must be a node to return position\n if (setting) {\n for (var i = 0; i < this.length; i++) {\n var _ele2 = this[i];\n var parent = hasCompoundNodes ? _ele2.parent() : null;\n var hasParent = parent && parent.length > 0;\n var relativeToParent = hasParent;\n\n if (hasParent) {\n parent = parent[0];\n }\n\n var origin = relativeToParent ? parent.position() : {\n x: 0,\n y: 0\n };\n\n if (val !== undefined) {\n // set one dimension\n _ele2.position(dim, val + origin[dim]);\n } else if (ppos !== undefined) {\n // set whole position\n _ele2.position({\n x: ppos.x + origin.x,\n y: ppos.y + origin.y\n });\n }\n }\n } else {\n // getting\n var pos = ele.position();\n\n var _parent = hasCompoundNodes ? ele.parent() : null;\n\n var _hasParent = _parent && _parent.length > 0;\n\n var _relativeToParent = _hasParent;\n\n if (_hasParent) {\n _parent = _parent[0];\n }\n\n var _origin = _relativeToParent ? _parent.position() : {\n x: 0,\n y: 0\n };\n\n ppos = {\n x: pos.x - _origin.x,\n y: pos.y - _origin.y\n };\n\n if (dim === undefined) {\n // then return the whole rendered position\n return ppos;\n } else {\n // then return the specified dimension\n return ppos[dim];\n }\n }\n } else if (!setting) {\n return undefined; // for empty collection case\n }\n\n return this; // chaining\n }\n}; // aliases\n\nfn$2.modelPosition = fn$2.point = fn$2.position;\nfn$2.modelPositions = fn$2.points = fn$2.positions;\nfn$2.renderedPoint = fn$2.renderedPosition;\nfn$2.relativePoint = fn$2.relativePosition;\nvar position = elesfn$j;\n\nvar fn$3, elesfn$k;\nfn$3 = elesfn$k = {};\n\nelesfn$k.renderedBoundingBox = function (options) {\n var bb = this.boundingBox(options);\n var cy = this.cy();\n var zoom = cy.zoom();\n var pan = cy.pan();\n var x1 = bb.x1 * zoom + pan.x;\n var x2 = bb.x2 * zoom + pan.x;\n var y1 = bb.y1 * zoom + pan.y;\n var y2 = bb.y2 * zoom + pan.y;\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2,\n w: x2 - x1,\n h: y2 - y1\n };\n};\n\nelesfn$k.dirtyCompoundBoundsCache = function () {\n var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var cy = this.cy();\n\n if (!cy.styleEnabled() || !cy.hasCompoundNodes()) {\n return this;\n }\n\n this.forEachUp(function (ele) {\n if (ele.isParent()) {\n var _p = ele._private;\n _p.compoundBoundsClean = false;\n _p.bbCache = null;\n\n if (!silent) {\n ele.emitAndNotify('bounds');\n }\n }\n });\n return this;\n};\n\nelesfn$k.updateCompoundBounds = function () {\n var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var cy = this.cy(); // not possible to do on non-compound graphs or with the style disabled\n\n if (!cy.styleEnabled() || !cy.hasCompoundNodes()) {\n return this;\n } // save cycles when batching -- but bounds will be stale (or not exist yet)\n\n\n if (!force && cy.batching()) {\n return this;\n }\n\n function update(parent) {\n if (!parent.isParent()) {\n return;\n }\n\n var _p = parent._private;\n var children = parent.children();\n var includeLabels = parent.pstyle('compound-sizing-wrt-labels').value === 'include';\n var min = {\n width: {\n val: parent.pstyle('min-width').pfValue,\n left: parent.pstyle('min-width-bias-left'),\n right: parent.pstyle('min-width-bias-right')\n },\n height: {\n val: parent.pstyle('min-height').pfValue,\n top: parent.pstyle('min-height-bias-top'),\n bottom: parent.pstyle('min-height-bias-bottom')\n }\n };\n var bb = children.boundingBox({\n includeLabels: includeLabels,\n includeOverlays: false,\n // updating the compound bounds happens outside of the regular\n // cache cycle (i.e. before fired events)\n useCache: false\n });\n var pos = _p.position; // if children take up zero area then keep position and fall back on stylesheet w/h\n\n if (bb.w === 0 || bb.h === 0) {\n bb = {\n w: parent.pstyle('width').pfValue,\n h: parent.pstyle('height').pfValue\n };\n bb.x1 = pos.x - bb.w / 2;\n bb.x2 = pos.x + bb.w / 2;\n bb.y1 = pos.y - bb.h / 2;\n bb.y2 = pos.y + bb.h / 2;\n }\n\n function computeBiasValues(propDiff, propBias, propBiasComplement) {\n var biasDiff = 0;\n var biasComplementDiff = 0;\n var biasTotal = propBias + propBiasComplement;\n\n if (propDiff > 0 && biasTotal > 0) {\n biasDiff = propBias / biasTotal * propDiff;\n biasComplementDiff = propBiasComplement / biasTotal * propDiff;\n }\n\n return {\n biasDiff: biasDiff,\n biasComplementDiff: biasComplementDiff\n };\n }\n\n function computePaddingValues(width, height, paddingObject, relativeTo) {\n // Assuming percentage is number from 0 to 1\n if (paddingObject.units === '%') {\n switch (relativeTo) {\n case 'width':\n return width > 0 ? paddingObject.pfValue * width : 0;\n\n case 'height':\n return height > 0 ? paddingObject.pfValue * height : 0;\n\n case 'average':\n return width > 0 && height > 0 ? paddingObject.pfValue * (width + height) / 2 : 0;\n\n case 'min':\n return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * height : paddingObject.pfValue * width : 0;\n\n case 'max':\n return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * width : paddingObject.pfValue * height : 0;\n\n default:\n return 0;\n }\n } else if (paddingObject.units === 'px') {\n return paddingObject.pfValue;\n } else {\n return 0;\n }\n }\n\n var leftVal = min.width.left.value;\n\n if (min.width.left.units === 'px' && min.width.val > 0) {\n leftVal = leftVal * 100 / min.width.val;\n }\n\n var rightVal = min.width.right.value;\n\n if (min.width.right.units === 'px' && min.width.val > 0) {\n rightVal = rightVal * 100 / min.width.val;\n }\n\n var topVal = min.height.top.value;\n\n if (min.height.top.units === 'px' && min.height.val > 0) {\n topVal = topVal * 100 / min.height.val;\n }\n\n var bottomVal = min.height.bottom.value;\n\n if (min.height.bottom.units === 'px' && min.height.val > 0) {\n bottomVal = bottomVal * 100 / min.height.val;\n }\n\n var widthBiasDiffs = computeBiasValues(min.width.val - bb.w, leftVal, rightVal);\n var diffLeft = widthBiasDiffs.biasDiff;\n var diffRight = widthBiasDiffs.biasComplementDiff;\n var heightBiasDiffs = computeBiasValues(min.height.val - bb.h, topVal, bottomVal);\n var diffTop = heightBiasDiffs.biasDiff;\n var diffBottom = heightBiasDiffs.biasComplementDiff;\n _p.autoPadding = computePaddingValues(bb.w, bb.h, parent.pstyle('padding'), parent.pstyle('padding-relative-to').value);\n _p.autoWidth = Math.max(bb.w, min.width.val);\n pos.x = (-diffLeft + bb.x1 + bb.x2 + diffRight) / 2;\n _p.autoHeight = Math.max(bb.h, min.height.val);\n pos.y = (-diffTop + bb.y1 + bb.y2 + diffBottom) / 2;\n }\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _p = ele._private;\n\n if (!_p.compoundBoundsClean || force) {\n update(ele);\n\n if (!cy.batching()) {\n _p.compoundBoundsClean = true;\n }\n }\n }\n\n return this;\n};\n\nvar noninf = function noninf(x) {\n if (x === Infinity || x === -Infinity) {\n return 0;\n }\n\n return x;\n};\n\nvar updateBounds = function updateBounds(b, x1, y1, x2, y2) {\n // don't update with zero area boxes\n if (x2 - x1 === 0 || y2 - y1 === 0) {\n return;\n } // don't update with null dim\n\n\n if (x1 == null || y1 == null || x2 == null || y2 == null) {\n return;\n }\n\n b.x1 = x1 < b.x1 ? x1 : b.x1;\n b.x2 = x2 > b.x2 ? x2 : b.x2;\n b.y1 = y1 < b.y1 ? y1 : b.y1;\n b.y2 = y2 > b.y2 ? y2 : b.y2;\n b.w = b.x2 - b.x1;\n b.h = b.y2 - b.y1;\n};\n\nvar updateBoundsFromBox = function updateBoundsFromBox(b, b2) {\n if (b2 == null) {\n return b;\n }\n\n return updateBounds(b, b2.x1, b2.y1, b2.x2, b2.y2);\n};\n\nvar prefixedProperty = function prefixedProperty(obj, field, prefix) {\n return getPrefixedProperty(obj, field, prefix);\n};\n\nvar updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) {\n if (ele.cy().headless()) {\n return;\n }\n\n var _p = ele._private;\n var rstyle = _p.rstyle;\n var halfArW = rstyle.arrowWidth / 2;\n var arrowType = ele.pstyle(prefix + '-arrow-shape').value;\n var x;\n var y;\n\n if (arrowType !== 'none') {\n if (prefix === 'source') {\n x = rstyle.srcX;\n y = rstyle.srcY;\n } else if (prefix === 'target') {\n x = rstyle.tgtX;\n y = rstyle.tgtY;\n } else {\n x = rstyle.midX;\n y = rstyle.midY;\n } // always store the individual arrow bounds\n\n\n var bbs = _p.arrowBounds = _p.arrowBounds || {};\n var bb = bbs[prefix] = bbs[prefix] || {};\n bb.x1 = x - halfArW;\n bb.y1 = y - halfArW;\n bb.x2 = x + halfArW;\n bb.y2 = y + halfArW;\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n expandBoundingBox(bb, 1);\n updateBounds(bounds, bb.x1, bb.y1, bb.x2, bb.y2);\n }\n};\n\nvar updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) {\n if (ele.cy().headless()) {\n return;\n }\n\n var prefixDash;\n\n if (prefix) {\n prefixDash = prefix + '-';\n } else {\n prefixDash = '';\n }\n\n var _p = ele._private;\n var rstyle = _p.rstyle;\n var label = ele.pstyle(prefixDash + 'label').strValue;\n\n if (label) {\n var halign = ele.pstyle('text-halign');\n var valign = ele.pstyle('text-valign');\n var labelWidth = prefixedProperty(rstyle, 'labelWidth', prefix);\n var labelHeight = prefixedProperty(rstyle, 'labelHeight', prefix);\n var labelX = prefixedProperty(rstyle, 'labelX', prefix);\n var labelY = prefixedProperty(rstyle, 'labelY', prefix);\n var marginX = ele.pstyle(prefixDash + 'text-margin-x').pfValue;\n var marginY = ele.pstyle(prefixDash + 'text-margin-y').pfValue;\n var isEdge = ele.isEdge();\n var rotation = ele.pstyle(prefixDash + 'text-rotation');\n var outlineWidth = ele.pstyle('text-outline-width').pfValue;\n var borderWidth = ele.pstyle('text-border-width').pfValue;\n var halfBorderWidth = borderWidth / 2;\n var padding = ele.pstyle('text-background-padding').pfValue;\n var marginOfError = 2; // expand to work around browser dimension inaccuracies\n\n var lh = labelHeight;\n var lw = labelWidth;\n var lw_2 = lw / 2;\n var lh_2 = lh / 2;\n var lx1, lx2, ly1, ly2;\n\n if (isEdge) {\n lx1 = labelX - lw_2;\n lx2 = labelX + lw_2;\n ly1 = labelY - lh_2;\n ly2 = labelY + lh_2;\n } else {\n switch (halign.value) {\n case 'left':\n lx1 = labelX - lw;\n lx2 = labelX;\n break;\n\n case 'center':\n lx1 = labelX - lw_2;\n lx2 = labelX + lw_2;\n break;\n\n case 'right':\n lx1 = labelX;\n lx2 = labelX + lw;\n break;\n }\n\n switch (valign.value) {\n case 'top':\n ly1 = labelY - lh;\n ly2 = labelY;\n break;\n\n case 'center':\n ly1 = labelY - lh_2;\n ly2 = labelY + lh_2;\n break;\n\n case 'bottom':\n ly1 = labelY;\n ly2 = labelY + lh;\n break;\n }\n } // shift by margin and expand by outline and border\n\n\n lx1 += marginX - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError;\n lx2 += marginX + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError;\n ly1 += marginY - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError;\n ly2 += marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; // always store the unrotated label bounds separately\n\n var bbPrefix = prefix || 'main';\n var bbs = _p.labelBounds;\n var bb = bbs[bbPrefix] = bbs[bbPrefix] || {};\n bb.x1 = lx1;\n bb.y1 = ly1;\n bb.x2 = lx2;\n bb.y2 = ly2;\n bb.w = lx2 - lx1;\n bb.h = ly2 - ly1;\n var isAutorotate = isEdge && rotation.strValue === 'autorotate';\n var isPfValue = rotation.pfValue != null && rotation.pfValue !== 0;\n\n if (isAutorotate || isPfValue) {\n var theta = isAutorotate ? prefixedProperty(_p.rstyle, 'labelAngle', prefix) : rotation.pfValue;\n var cos = Math.cos(theta);\n var sin = Math.sin(theta); // rotation point (default value for center-center)\n\n var xo = (lx1 + lx2) / 2;\n var yo = (ly1 + ly2) / 2;\n\n if (!isEdge) {\n switch (halign.value) {\n case 'left':\n xo = lx2;\n break;\n\n case 'right':\n xo = lx1;\n break;\n }\n\n switch (valign.value) {\n case 'top':\n yo = ly2;\n break;\n\n case 'bottom':\n yo = ly1;\n break;\n }\n }\n\n var rotate = function rotate(x, y) {\n x = x - xo;\n y = y - yo;\n return {\n x: x * cos - y * sin + xo,\n y: x * sin + y * cos + yo\n };\n };\n\n var px1y1 = rotate(lx1, ly1);\n var px1y2 = rotate(lx1, ly2);\n var px2y1 = rotate(lx2, ly1);\n var px2y2 = rotate(lx2, ly2);\n lx1 = Math.min(px1y1.x, px1y2.x, px2y1.x, px2y2.x);\n lx2 = Math.max(px1y1.x, px1y2.x, px2y1.x, px2y2.x);\n ly1 = Math.min(px1y1.y, px1y2.y, px2y1.y, px2y2.y);\n ly2 = Math.max(px1y1.y, px1y2.y, px2y1.y, px2y2.y);\n }\n\n var bbPrefixRot = bbPrefix + 'Rot';\n var bbRot = bbs[bbPrefixRot] = bbs[bbPrefixRot] || {};\n bbRot.x1 = lx1;\n bbRot.y1 = ly1;\n bbRot.x2 = lx2;\n bbRot.y2 = ly2;\n bbRot.w = lx2 - lx1;\n bbRot.h = ly2 - ly1;\n updateBounds(bounds, lx1, ly1, lx2, ly2);\n updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2);\n }\n\n return bounds;\n}; // get the bounding box of the elements (in raw model position)\n\n\nvar boundingBoxImpl = function boundingBoxImpl(ele, options) {\n var cy = ele._private.cy;\n var styleEnabled = cy.styleEnabled();\n var headless = cy.headless();\n var bounds = makeBoundingBox();\n var _p = ele._private;\n var isNode = ele.isNode();\n var isEdge = ele.isEdge();\n var ex1, ex2, ey1, ey2; // extrema of body / lines\n\n var x, y; // node pos\n\n var rstyle = _p.rstyle;\n var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0]; // must use `display` prop only, as reading `compound.width()` causes recursion\n // (other factors like width values will be considered later in this function anyway)\n\n var isDisplayed = function isDisplayed(ele) {\n return ele.pstyle('display').value !== 'none';\n };\n\n var displayed = !styleEnabled || isDisplayed(ele) // must take into account connected nodes b/c of implicit edge hiding on display:none node\n && (!isEdge || isDisplayed(ele.source()) && isDisplayed(ele.target()));\n\n if (displayed) {\n // displayed suffices, since we will find zero area eles anyway\n var overlayOpacity = 0;\n var overlayPadding = 0;\n\n if (styleEnabled && options.includeOverlays) {\n overlayOpacity = ele.pstyle('overlay-opacity').value;\n\n if (overlayOpacity !== 0) {\n overlayPadding = ele.pstyle('overlay-padding').value;\n }\n }\n\n var w = 0;\n var wHalf = 0;\n\n if (styleEnabled) {\n w = ele.pstyle('width').pfValue;\n wHalf = w / 2;\n }\n\n if (isNode && options.includeNodes) {\n var pos = ele.position();\n x = pos.x;\n y = pos.y;\n\n var _w = ele.outerWidth();\n\n var halfW = _w / 2;\n var h = ele.outerHeight();\n var halfH = h / 2; // handle node dimensions\n /////////////////////////\n\n ex1 = x - halfW;\n ex2 = x + halfW;\n ey1 = y - halfH;\n ey2 = y + halfH;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n } else if (isEdge && options.includeEdges) {\n if (styleEnabled && !headless) {\n var curveStyle = ele.pstyle('curve-style').strValue; // handle edge dimensions (rough box estimate)\n //////////////////////////////////////////////\n\n ex1 = Math.min(rstyle.srcX, rstyle.midX, rstyle.tgtX);\n ex2 = Math.max(rstyle.srcX, rstyle.midX, rstyle.tgtX);\n ey1 = Math.min(rstyle.srcY, rstyle.midY, rstyle.tgtY);\n ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY); // take into account edge width\n\n ex1 -= wHalf;\n ex2 += wHalf;\n ey1 -= wHalf;\n ey2 += wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2); // precise edges\n ////////////////\n\n if (curveStyle === 'haystack') {\n var hpts = rstyle.haystackPts;\n\n if (hpts && hpts.length === 2) {\n ex1 = hpts[0].x;\n ey1 = hpts[0].y;\n ex2 = hpts[1].x;\n ey2 = hpts[1].y;\n\n if (ex1 > ex2) {\n var temp = ex1;\n ex1 = ex2;\n ex2 = temp;\n }\n\n if (ey1 > ey2) {\n var _temp = ey1;\n ey1 = ey2;\n ey2 = _temp;\n }\n\n updateBounds(bounds, ex1 - wHalf, ey1 - wHalf, ex2 + wHalf, ey2 + wHalf);\n }\n } else if (curveStyle === 'bezier' || curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'taxi') {\n var pts;\n\n switch (curveStyle) {\n case 'bezier':\n case 'unbundled-bezier':\n pts = rstyle.bezierPts;\n break;\n\n case 'segments':\n case 'taxi':\n pts = rstyle.linePts;\n break;\n }\n\n if (pts != null) {\n for (var j = 0; j < pts.length; j++) {\n var pt = pts[j];\n ex1 = pt.x - wHalf;\n ex2 = pt.x + wHalf;\n ey1 = pt.y - wHalf;\n ey2 = pt.y + wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n }\n }\n } // bezier-like or segment-like edge\n\n } else {\n // headless or style disabled\n // fallback on source and target positions\n //////////////////////////////////////////\n var n1 = ele.source();\n var n1pos = n1.position();\n var n2 = ele.target();\n var n2pos = n2.position();\n ex1 = n1pos.x;\n ex2 = n2pos.x;\n ey1 = n1pos.y;\n ey2 = n2pos.y;\n\n if (ex1 > ex2) {\n var _temp2 = ex1;\n ex1 = ex2;\n ex2 = _temp2;\n }\n\n if (ey1 > ey2) {\n var _temp3 = ey1;\n ey1 = ey2;\n ey2 = _temp3;\n } // take into account edge width\n\n\n ex1 -= wHalf;\n ex2 += wHalf;\n ey1 -= wHalf;\n ey2 += wHalf;\n updateBounds(bounds, ex1, ey1, ex2, ey2);\n } // headless or style disabled\n\n } // edges\n // handle edge arrow size\n /////////////////////////\n\n\n if (styleEnabled && options.includeEdges && isEdge) {\n updateBoundsFromArrow(bounds, ele, 'mid-source');\n updateBoundsFromArrow(bounds, ele, 'mid-target');\n updateBoundsFromArrow(bounds, ele, 'source');\n updateBoundsFromArrow(bounds, ele, 'target');\n } // ghost\n ////////\n\n\n if (styleEnabled) {\n var ghost = ele.pstyle('ghost').value === 'yes';\n\n if (ghost) {\n var gx = ele.pstyle('ghost-offset-x').pfValue;\n var gy = ele.pstyle('ghost-offset-y').pfValue;\n updateBounds(bounds, bounds.x1 + gx, bounds.y1 + gy, bounds.x2 + gx, bounds.y2 + gy);\n }\n } // always store the body bounds separately from the labels\n\n\n var bbBody = _p.bodyBounds = _p.bodyBounds || {};\n assignBoundingBox(bbBody, bounds);\n expandBoundingBoxSides(bbBody, manualExpansion);\n expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies\n // overlay\n //////////\n\n if (styleEnabled) {\n ex1 = bounds.x1;\n ex2 = bounds.x2;\n ey1 = bounds.y1;\n ey2 = bounds.y2;\n updateBounds(bounds, ex1 - overlayPadding, ey1 - overlayPadding, ex2 + overlayPadding, ey2 + overlayPadding);\n } // always store the body bounds separately from the labels\n\n\n var bbOverlay = _p.overlayBounds = _p.overlayBounds || {};\n assignBoundingBox(bbOverlay, bounds);\n expandBoundingBoxSides(bbOverlay, manualExpansion);\n expandBoundingBox(bbOverlay, 1); // expand to work around browser dimension inaccuracies\n // handle label dimensions\n //////////////////////////\n\n var bbLabels = _p.labelBounds = _p.labelBounds || {};\n\n if (bbLabels.all != null) {\n clearBoundingBox(bbLabels.all);\n } else {\n bbLabels.all = makeBoundingBox();\n }\n\n if (styleEnabled && options.includeLabels) {\n if (options.includeMainLabels) {\n updateBoundsFromLabel(bounds, ele, null);\n }\n\n if (isEdge) {\n if (options.includeSourceLabels) {\n updateBoundsFromLabel(bounds, ele, 'source');\n }\n\n if (options.includeTargetLabels) {\n updateBoundsFromLabel(bounds, ele, 'target');\n }\n }\n } // style enabled for labels\n\n } // if displayed\n\n\n bounds.x1 = noninf(bounds.x1);\n bounds.y1 = noninf(bounds.y1);\n bounds.x2 = noninf(bounds.x2);\n bounds.y2 = noninf(bounds.y2);\n bounds.w = noninf(bounds.x2 - bounds.x1);\n bounds.h = noninf(bounds.y2 - bounds.y1);\n\n if (bounds.w > 0 && bounds.h > 0 && displayed) {\n expandBoundingBoxSides(bounds, manualExpansion); // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides\n\n expandBoundingBox(bounds, 1);\n }\n\n return bounds;\n};\n\nvar getKey = function getKey(opts) {\n var i = 0;\n\n var tf = function tf(val) {\n return (val ? 1 : 0) << i++;\n };\n\n var key = 0;\n key += tf(opts.incudeNodes);\n key += tf(opts.includeEdges);\n key += tf(opts.includeLabels);\n key += tf(opts.includeMainLabels);\n key += tf(opts.includeSourceLabels);\n key += tf(opts.includeTargetLabels);\n key += tf(opts.includeOverlays);\n return key;\n};\n\nvar getBoundingBoxPosKey = function getBoundingBoxPosKey(ele) {\n if (ele.isEdge()) {\n var p1 = ele.source().position();\n var p2 = ele.target().position();\n\n var r = function r(x) {\n return Math.round(x);\n };\n\n return hashIntsArray([r(p1.x), r(p1.y), r(p2.x), r(p2.y)]);\n } else {\n return 0;\n }\n};\n\nvar cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) {\n var _p = ele._private;\n var bb;\n var isEdge = ele.isEdge();\n var key = opts == null ? defBbOptsKey : getKey(opts);\n var usingDefOpts = key === defBbOptsKey;\n var currPosKey = getBoundingBoxPosKey(ele);\n var isPosKeySame = _p.bbCachePosKey === currPosKey;\n var useCache = opts.useCache && isPosKeySame;\n\n var isDirty = function isDirty(ele) {\n return ele._private.bbCache == null || ele._private.styleDirty;\n };\n\n var needRecalc = !useCache || isDirty(ele) || isEdge && isDirty(ele.source()) || isDirty(ele.target());\n\n if (needRecalc) {\n if (!isPosKeySame) {\n ele.recalculateRenderedStyle(useCache);\n }\n\n bb = boundingBoxImpl(ele, defBbOpts);\n _p.bbCache = bb;\n _p.bbCachePosKey = currPosKey;\n } else {\n bb = _p.bbCache;\n } // not using def opts => need to build up bb from combination of sub bbs\n\n\n if (!usingDefOpts) {\n var isNode = ele.isNode();\n bb = makeBoundingBox();\n\n if (opts.includeNodes && isNode || opts.includeEdges && !isNode) {\n if (opts.includeOverlays) {\n updateBoundsFromBox(bb, _p.overlayBounds);\n } else {\n updateBoundsFromBox(bb, _p.bodyBounds);\n }\n }\n\n if (opts.includeLabels) {\n if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) {\n updateBoundsFromBox(bb, _p.labelBounds.all);\n } else {\n if (opts.includeMainLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.mainRot);\n }\n\n if (opts.includeSourceLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.sourceRot);\n }\n\n if (opts.includeTargetLabels) {\n updateBoundsFromBox(bb, _p.labelBounds.targetRot);\n }\n }\n }\n\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n }\n\n return bb;\n};\n\nvar defBbOpts = {\n includeNodes: true,\n includeEdges: true,\n includeLabels: true,\n includeMainLabels: true,\n includeSourceLabels: true,\n includeTargetLabels: true,\n includeOverlays: true,\n useCache: true\n};\nvar defBbOptsKey = getKey(defBbOpts);\nvar filledBbOpts = defaults(defBbOpts);\n\nelesfn$k.boundingBox = function (options) {\n var bounds; // the main usecase is ele.boundingBox() for a single element with no/def options\n // specified s.t. the cache is used, so check for this case to make it faster by\n // avoiding the overhead of the rest of the function\n\n if (this.length === 1 && this[0]._private.bbCache != null && !this[0]._private.styleDirty && (options === undefined || options.useCache === undefined || options.useCache === true)) {\n if (options === undefined) {\n options = defBbOpts;\n } else {\n options = filledBbOpts(options);\n }\n\n bounds = cachedBoundingBoxImpl(this[0], options);\n } else {\n bounds = makeBoundingBox();\n options = options || defBbOpts;\n var opts = filledBbOpts(options);\n var eles = this;\n var cy = eles.cy();\n var styleEnabled = cy.styleEnabled();\n\n if (styleEnabled) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _p = ele._private;\n var currPosKey = getBoundingBoxPosKey(ele);\n var isPosKeySame = _p.bbCachePosKey === currPosKey;\n var useCache = opts.useCache && isPosKeySame && !_p.styleDirty;\n ele.recalculateRenderedStyle(useCache);\n }\n }\n\n this.updateCompoundBounds(!options.useCache);\n\n for (var _i = 0; _i < eles.length; _i++) {\n var _ele = eles[_i];\n updateBoundsFromBox(bounds, cachedBoundingBoxImpl(_ele, opts));\n }\n }\n\n bounds.x1 = noninf(bounds.x1);\n bounds.y1 = noninf(bounds.y1);\n bounds.x2 = noninf(bounds.x2);\n bounds.y2 = noninf(bounds.y2);\n bounds.w = noninf(bounds.x2 - bounds.x1);\n bounds.h = noninf(bounds.y2 - bounds.y1);\n return bounds;\n};\n\nelesfn$k.dirtyBoundingBoxCache = function () {\n for (var i = 0; i < this.length; i++) {\n var _p = this[i]._private;\n _p.bbCache = null;\n _p.bbCachePosKey = null;\n _p.bodyBounds = null;\n _p.overlayBounds = null;\n _p.labelBounds.all = null;\n _p.labelBounds.source = null;\n _p.labelBounds.target = null;\n _p.labelBounds.main = null;\n _p.labelBounds.sourceRot = null;\n _p.labelBounds.targetRot = null;\n _p.labelBounds.mainRot = null;\n _p.arrowBounds.source = null;\n _p.arrowBounds.target = null;\n _p.arrowBounds['mid-source'] = null;\n _p.arrowBounds['mid-target'] = null;\n }\n\n this.emitAndNotify('bounds');\n return this;\n}; // private helper to get bounding box for custom node positions\n// - good for perf in certain cases but currently requires dirtying the rendered style\n// - would be better to not modify the nodes but the nodes are read directly everywhere in the renderer...\n// - try to use for only things like discrete layouts where the node position would change anyway\n\n\nelesfn$k.boundingBoxAt = function (fn) {\n var nodes = this.nodes();\n var cy = this.cy();\n var hasCompoundNodes = cy.hasCompoundNodes();\n var parents = cy.collection();\n\n if (hasCompoundNodes) {\n parents = nodes.filter(function (node) {\n return node.isParent();\n });\n nodes = nodes.not(parents);\n }\n\n if (plainObject(fn)) {\n var obj = fn;\n\n fn = function fn() {\n return obj;\n };\n }\n\n var storeOldPos = function storeOldPos(node, i) {\n return node._private.bbAtOldPos = fn(node, i);\n };\n\n var getOldPos = function getOldPos(node) {\n return node._private.bbAtOldPos;\n };\n\n cy.startBatch();\n nodes.forEach(storeOldPos).silentPositions(fn);\n\n if (hasCompoundNodes) {\n parents.dirtyCompoundBoundsCache();\n parents.dirtyBoundingBoxCache();\n parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle\n }\n\n var bb = copyBoundingBox(this.boundingBox({\n useCache: false\n }));\n nodes.silentPositions(getOldPos);\n\n if (hasCompoundNodes) {\n parents.dirtyCompoundBoundsCache();\n parents.dirtyBoundingBoxCache();\n parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle\n }\n\n cy.endBatch();\n return bb;\n};\n\nfn$3.boundingbox = fn$3.bb = fn$3.boundingBox;\nfn$3.renderedBoundingbox = fn$3.renderedBoundingBox;\nvar bounds = elesfn$k;\n\nvar fn$4, elesfn$l;\nfn$4 = elesfn$l = {};\n\nvar defineDimFns = function defineDimFns(opts) {\n opts.uppercaseName = capitalize(opts.name);\n opts.autoName = 'auto' + opts.uppercaseName;\n opts.labelName = 'label' + opts.uppercaseName;\n opts.outerName = 'outer' + opts.uppercaseName;\n opts.uppercaseOuterName = capitalize(opts.outerName);\n\n fn$4[opts.name] = function dimImpl() {\n var ele = this[0];\n var _p = ele._private;\n var cy = _p.cy;\n var styleEnabled = cy._private.styleEnabled;\n\n if (ele) {\n if (styleEnabled) {\n if (ele.isParent()) {\n ele.updateCompoundBounds();\n return _p[opts.autoName] || 0;\n }\n\n var d = ele.pstyle(opts.name);\n\n switch (d.strValue) {\n case 'label':\n ele.recalculateRenderedStyle();\n return _p.rstyle[opts.labelName] || 0;\n\n default:\n return d.pfValue;\n }\n } else {\n return 1;\n }\n }\n };\n\n fn$4['outer' + opts.uppercaseName] = function outerDimImpl() {\n var ele = this[0];\n var _p = ele._private;\n var cy = _p.cy;\n var styleEnabled = cy._private.styleEnabled;\n\n if (ele) {\n if (styleEnabled) {\n var dim = ele[opts.name]();\n var border = ele.pstyle('border-width').pfValue; // n.b. 1/2 each side\n\n var padding = 2 * ele.padding();\n return dim + border + padding;\n } else {\n return 1;\n }\n }\n };\n\n fn$4['rendered' + opts.uppercaseName] = function renderedDimImpl() {\n var ele = this[0];\n\n if (ele) {\n var d = ele[opts.name]();\n return d * this.cy().zoom();\n }\n };\n\n fn$4['rendered' + opts.uppercaseOuterName] = function renderedOuterDimImpl() {\n var ele = this[0];\n\n if (ele) {\n var od = ele[opts.outerName]();\n return od * this.cy().zoom();\n }\n };\n};\n\ndefineDimFns({\n name: 'width'\n});\ndefineDimFns({\n name: 'height'\n});\n\nelesfn$l.padding = function () {\n var ele = this[0];\n var _p = ele._private;\n\n if (ele.isParent()) {\n ele.updateCompoundBounds();\n\n if (_p.autoPadding !== undefined) {\n return _p.autoPadding;\n } else {\n return ele.pstyle('padding').pfValue;\n }\n } else {\n return ele.pstyle('padding').pfValue;\n }\n};\n\nelesfn$l.paddedHeight = function () {\n var ele = this[0];\n return ele.height() + 2 * ele.padding();\n};\n\nelesfn$l.paddedWidth = function () {\n var ele = this[0];\n return ele.width() + 2 * ele.padding();\n};\n\nvar widthHeight = elesfn$l;\n\nvar ifEdge = function ifEdge(ele, getValue) {\n if (ele.isEdge()) {\n return getValue(ele);\n }\n};\n\nvar ifEdgeRenderedPosition = function ifEdgeRenderedPosition(ele, getPoint) {\n if (ele.isEdge()) {\n var cy = ele.cy();\n return modelToRenderedPosition(getPoint(ele), cy.zoom(), cy.pan());\n }\n};\n\nvar ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) {\n if (ele.isEdge()) {\n var cy = ele.cy();\n var pan = cy.pan();\n var zoom = cy.zoom();\n return getPoints(ele).map(function (p) {\n return modelToRenderedPosition(p, zoom, pan);\n });\n }\n};\n\nvar controlPoints = function controlPoints(ele) {\n return ele.renderer().getControlPoints(ele);\n};\n\nvar segmentPoints = function segmentPoints(ele) {\n return ele.renderer().getSegmentPoints(ele);\n};\n\nvar sourceEndpoint = function sourceEndpoint(ele) {\n return ele.renderer().getSourceEndpoint(ele);\n};\n\nvar targetEndpoint = function targetEndpoint(ele) {\n return ele.renderer().getTargetEndpoint(ele);\n};\n\nvar midpoint = function midpoint(ele) {\n return ele.renderer().getEdgeMidpoint(ele);\n};\n\nvar pts = {\n controlPoints: {\n get: controlPoints,\n mult: true\n },\n segmentPoints: {\n get: segmentPoints,\n mult: true\n },\n sourceEndpoint: {\n get: sourceEndpoint\n },\n targetEndpoint: {\n get: targetEndpoint\n },\n midpoint: {\n get: midpoint\n }\n};\n\nvar renderedName = function renderedName(name) {\n return 'rendered' + name[0].toUpperCase() + name.substr(1);\n};\n\nvar edgePoints = Object.keys(pts).reduce(function (obj, name) {\n var spec = pts[name];\n var rName = renderedName(name);\n\n obj[name] = function () {\n return ifEdge(this, spec.get);\n };\n\n if (spec.mult) {\n obj[rName] = function () {\n return ifEdgeRenderedPositions(this, spec.get);\n };\n } else {\n obj[rName] = function () {\n return ifEdgeRenderedPosition(this, spec.get);\n };\n }\n\n return obj;\n}, {});\n\nvar dimensions = extend({}, position, bounds, widthHeight, edgePoints);\n\n/*!\nEvent object based on jQuery events, MIT license\n\nhttps://jquery.org/license/\nhttps://tldrlegal.com/license/mit-license\nhttps://github.com/jquery/jquery/blob/master/src/event.js\n*/\nvar Event = function Event(src, props) {\n this.recycle(src, props);\n};\n\nfunction returnFalse() {\n return false;\n}\n\nfunction returnTrue() {\n return true;\n} // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n\n\nEvent.prototype = {\n instanceString: function instanceString() {\n return 'event';\n },\n recycle: function recycle(src, props) {\n this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = returnFalse;\n\n if (src != null && src.preventDefault) {\n // Browser Event object\n this.type = src.type; // Events bubbling up the document may have been marked as prevented\n // by a handler lower down the tree; reflect the correct value.\n\n this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse;\n } else if (src != null && src.type) {\n // Plain object containing all event details\n props = src;\n } else {\n // Event string\n this.type = src;\n } // Put explicitly provided properties onto the event object\n\n\n if (props != null) {\n // more efficient to manually copy fields we use\n this.originalEvent = props.originalEvent;\n this.type = props.type != null ? props.type : this.type;\n this.cy = props.cy;\n this.target = props.target;\n this.position = props.position;\n this.renderedPosition = props.renderedPosition;\n this.namespace = props.namespace;\n this.layout = props.layout;\n }\n\n if (this.cy != null && this.position != null && this.renderedPosition == null) {\n // create a rendered position based on the passed position\n var pos = this.position;\n var zoom = this.cy.zoom();\n var pan = this.cy.pan();\n this.renderedPosition = {\n x: pos.x * zoom + pan.x,\n y: pos.y * zoom + pan.y\n };\n } // Create a timestamp if incoming event doesn't have one\n\n\n this.timeStamp = src && src.timeStamp || Date.now();\n },\n preventDefault: function preventDefault() {\n this.isDefaultPrevented = returnTrue;\n var e = this.originalEvent;\n\n if (!e) {\n return;\n } // if preventDefault exists run it on the original event\n\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n },\n stopPropagation: function stopPropagation() {\n this.isPropagationStopped = returnTrue;\n var e = this.originalEvent;\n\n if (!e) {\n return;\n } // if stopPropagation exists run it on the original event\n\n\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n },\n stopImmediatePropagation: function stopImmediatePropagation() {\n this.isImmediatePropagationStopped = returnTrue;\n this.stopPropagation();\n },\n isDefaultPrevented: returnFalse,\n isPropagationStopped: returnFalse,\n isImmediatePropagationStopped: returnFalse\n};\n\nvar eventRegex = /^([^.]+)(\\.(?:[^.]+))?$/; // regex for matching event strings (e.g. \"click.namespace\")\n\nvar universalNamespace = '.*'; // matches as if no namespace specified and prevents users from unbinding accidentally\n\nvar defaults$8 = {\n qualifierCompare: function qualifierCompare(q1, q2) {\n return q1 === q2;\n },\n eventMatches: function eventMatches()\n /*context, listener, eventObj*/\n {\n return true;\n },\n addEventFields: function addEventFields()\n /*context, evt*/\n {},\n callbackContext: function callbackContext(context\n /*, listener, eventObj*/\n ) {\n return context;\n },\n beforeEmit: function beforeEmit()\n /* context, listener, eventObj */\n {},\n afterEmit: function afterEmit()\n /* context, listener, eventObj */\n {},\n bubble: function bubble()\n /*context*/\n {\n return false;\n },\n parent: function parent()\n /*context*/\n {\n return null;\n },\n context: null\n};\nvar defaultsKeys = Object.keys(defaults$8);\nvar emptyOpts = {};\n\nfunction Emitter() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : emptyOpts;\n var context = arguments.length > 1 ? arguments[1] : undefined;\n\n // micro-optimisation vs Object.assign() -- reduces Element instantiation time\n for (var i = 0; i < defaultsKeys.length; i++) {\n var key = defaultsKeys[i];\n this[key] = opts[key] || defaults$8[key];\n }\n\n this.context = context || this.context;\n this.listeners = [];\n this.emitting = 0;\n}\n\nvar p = Emitter.prototype;\n\nvar forEachEvent = function forEachEvent(self, handler, events, qualifier, callback, conf, confOverrides) {\n if (fn(qualifier)) {\n callback = qualifier;\n qualifier = null;\n }\n\n if (confOverrides) {\n if (conf == null) {\n conf = confOverrides;\n } else {\n conf = extend({}, conf, confOverrides);\n }\n }\n\n var eventList = array(events) ? events : events.split(/\\s+/);\n\n for (var i = 0; i < eventList.length; i++) {\n var evt = eventList[i];\n\n if (emptyString(evt)) {\n continue;\n }\n\n var match = evt.match(eventRegex); // type[.namespace]\n\n if (match) {\n var type = match[1];\n var namespace = match[2] ? match[2] : null;\n var ret = handler(self, evt, type, namespace, qualifier, callback, conf);\n\n if (ret === false) {\n break;\n } // allow exiting early\n\n }\n }\n};\n\nvar makeEventObj = function makeEventObj(self, obj) {\n self.addEventFields(self.context, obj);\n return new Event(obj.type, obj);\n};\n\nvar forEachEventObj = function forEachEventObj(self, handler, events) {\n if (event(events)) {\n handler(self, events);\n return;\n } else if (plainObject(events)) {\n handler(self, makeEventObj(self, events));\n return;\n }\n\n var eventList = array(events) ? events : events.split(/\\s+/);\n\n for (var i = 0; i < eventList.length; i++) {\n var evt = eventList[i];\n\n if (emptyString(evt)) {\n continue;\n }\n\n var match = evt.match(eventRegex); // type[.namespace]\n\n if (match) {\n var type = match[1];\n var namespace = match[2] ? match[2] : null;\n var eventObj = makeEventObj(self, {\n type: type,\n namespace: namespace,\n target: self.context\n });\n handler(self, eventObj);\n }\n }\n};\n\np.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) {\n forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) {\n if (fn(callback)) {\n self.listeners.push({\n event: event,\n // full event string\n callback: callback,\n // callback to run\n type: type,\n // the event type (e.g. 'click')\n namespace: namespace,\n // the event namespace (e.g. \".foo\")\n qualifier: qualifier,\n // a restriction on whether to match this emitter\n conf: conf // additional configuration\n\n });\n }\n }, events, qualifier, callback, conf, confOverrides);\n return this;\n};\n\np.one = function (events, qualifier, callback, conf) {\n return this.on(events, qualifier, callback, conf, {\n one: true\n });\n};\n\np.removeListener = p.off = function (events, qualifier, callback, conf) {\n var _this = this;\n\n if (this.emitting !== 0) {\n this.listeners = copyArray(this.listeners);\n }\n\n var listeners = this.listeners;\n\n var _loop = function _loop(i) {\n var listener = listeners[i];\n forEachEvent(_this, function (self, event, type, namespace, qualifier, callback\n /*, conf*/\n ) {\n if ((listener.type === type || events === '*') && (!namespace && listener.namespace !== '.*' || listener.namespace === namespace) && (!qualifier || self.qualifierCompare(listener.qualifier, qualifier)) && (!callback || listener.callback === callback)) {\n listeners.splice(i, 1);\n return false;\n }\n }, events, qualifier, callback, conf);\n };\n\n for (var i = listeners.length - 1; i >= 0; i--) {\n _loop(i);\n }\n\n return this;\n};\n\np.removeAllListeners = function () {\n return this.removeListener('*');\n};\n\np.emit = p.trigger = function (events, extraParams, manualCallback) {\n var listeners = this.listeners;\n var numListenersBeforeEmit = listeners.length;\n this.emitting++;\n\n if (!array(extraParams)) {\n extraParams = [extraParams];\n }\n\n forEachEventObj(this, function (self, eventObj) {\n if (manualCallback != null) {\n listeners = [{\n event: eventObj.event,\n type: eventObj.type,\n namespace: eventObj.namespace,\n callback: manualCallback\n }];\n numListenersBeforeEmit = listeners.length;\n }\n\n var _loop2 = function _loop2(i) {\n var listener = listeners[i];\n\n if (listener.type === eventObj.type && (!listener.namespace || listener.namespace === eventObj.namespace || listener.namespace === universalNamespace) && self.eventMatches(self.context, listener, eventObj)) {\n var args = [eventObj];\n\n if (extraParams != null) {\n push(args, extraParams);\n }\n\n self.beforeEmit(self.context, listener, eventObj);\n\n if (listener.conf && listener.conf.one) {\n self.listeners = self.listeners.filter(function (l) {\n return l !== listener;\n });\n }\n\n var context = self.callbackContext(self.context, listener, eventObj);\n var ret = listener.callback.apply(context, args);\n self.afterEmit(self.context, listener, eventObj);\n\n if (ret === false) {\n eventObj.stopPropagation();\n eventObj.preventDefault();\n }\n } // if listener matches\n\n };\n\n for (var i = 0; i < numListenersBeforeEmit; i++) {\n _loop2(i);\n } // for listener\n\n\n if (self.bubble(self.context) && !eventObj.isPropagationStopped()) {\n self.parent(self.context).emit(eventObj, extraParams);\n }\n }, events);\n this.emitting--;\n return this;\n};\n\nvar emitterOptions = {\n qualifierCompare: function qualifierCompare(selector1, selector2) {\n if (selector1 == null || selector2 == null) {\n return selector1 == null && selector2 == null;\n } else {\n return selector1.sameText(selector2);\n }\n },\n eventMatches: function eventMatches(ele, listener, eventObj) {\n var selector = listener.qualifier;\n\n if (selector != null) {\n return ele !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target);\n }\n\n return true;\n },\n addEventFields: function addEventFields(ele, evt) {\n evt.cy = ele.cy();\n evt.target = ele;\n },\n callbackContext: function callbackContext(ele, listener, eventObj) {\n return listener.qualifier != null ? eventObj.target : ele;\n },\n beforeEmit: function beforeEmit(context, listener\n /*, eventObj*/\n ) {\n if (listener.conf && listener.conf.once) {\n listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback);\n }\n },\n bubble: function bubble() {\n return true;\n },\n parent: function parent(ele) {\n return ele.isChild() ? ele.parent() : ele.cy();\n }\n};\n\nvar argSelector = function argSelector(arg) {\n if (string(arg)) {\n return new Selector(arg);\n } else {\n return arg;\n }\n};\n\nvar elesfn$m = {\n createEmitter: function createEmitter() {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var _p = ele._private;\n\n if (!_p.emitter) {\n _p.emitter = new Emitter(emitterOptions, ele);\n }\n }\n\n return this;\n },\n emitter: function emitter() {\n return this._private.emitter;\n },\n on: function on(events, selector, callback) {\n var argSel = argSelector(selector);\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().on(events, argSel, callback);\n }\n\n return this;\n },\n removeListener: function removeListener(events, selector, callback) {\n var argSel = argSelector(selector);\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().removeListener(events, argSel, callback);\n }\n\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().removeAllListeners();\n }\n\n return this;\n },\n one: function one(events, selector, callback) {\n var argSel = argSelector(selector);\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().one(events, argSel, callback);\n }\n\n return this;\n },\n once: function once(events, selector, callback) {\n var argSel = argSelector(selector);\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().on(events, argSel, callback, {\n once: true,\n onceCollection: this\n });\n }\n },\n emit: function emit(events, extraParams) {\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n ele.emitter().emit(events, extraParams);\n }\n\n return this;\n },\n emitAndNotify: function emitAndNotify(event, extraParams) {\n // for internal use only\n if (this.length === 0) {\n return;\n } // empty collections don't need to notify anything\n // notify renderer\n\n\n this.cy().notify(event, this);\n this.emit(event, extraParams);\n return this;\n }\n};\ndefine$3.eventAliasesOn(elesfn$m);\n\nvar elesfn$n = {\n nodes: function nodes(selector) {\n return this.filter(function (ele) {\n return ele.isNode();\n }).filter(selector);\n },\n edges: function edges(selector) {\n return this.filter(function (ele) {\n return ele.isEdge();\n }).filter(selector);\n },\n // internal helper to get nodes and edges as separate collections with single iteration over elements\n byGroup: function byGroup() {\n var nodes = this.spawn();\n var edges = this.spawn();\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n\n if (ele.isNode()) {\n nodes.push(ele);\n } else {\n edges.push(ele);\n }\n }\n\n return {\n nodes: nodes,\n edges: edges\n };\n },\n filter: function filter(_filter, thisArg) {\n if (_filter === undefined) {\n // check this first b/c it's the most common/performant case\n return this;\n } else if (string(_filter) || elementOrCollection(_filter)) {\n return new Selector(_filter).filter(this);\n } else if (fn(_filter)) {\n var filterEles = this.spawn();\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var include = thisArg ? _filter.apply(thisArg, [ele, i, eles]) : _filter(ele, i, eles);\n\n if (include) {\n filterEles.push(ele);\n }\n }\n\n return filterEles;\n }\n\n return this.spawn(); // if not handled by above, give 'em an empty collection\n },\n not: function not(toRemove) {\n if (!toRemove) {\n return this;\n } else {\n if (string(toRemove)) {\n toRemove = this.filter(toRemove);\n }\n\n var elements = this.spawn();\n\n for (var i = 0; i < this.length; i++) {\n var element = this[i];\n var remove = toRemove.has(element);\n\n if (!remove) {\n elements.push(element);\n }\n }\n\n return elements;\n }\n },\n absoluteComplement: function absoluteComplement() {\n var cy = this.cy();\n return cy.mutableElements().not(this);\n },\n intersect: function intersect(other) {\n // if a selector is specified, then filter by it instead\n if (string(other)) {\n var selector = other;\n return this.filter(selector);\n }\n\n var elements = this.spawn();\n var col1 = this;\n var col2 = other;\n var col1Smaller = this.length < other.length;\n var colS = col1Smaller ? col1 : col2;\n var colL = col1Smaller ? col2 : col1;\n\n for (var i = 0; i < colS.length; i++) {\n var ele = colS[i];\n\n if (colL.has(ele)) {\n elements.push(ele);\n }\n }\n\n return elements;\n },\n xor: function xor(other) {\n var cy = this._private.cy;\n\n if (string(other)) {\n other = cy.$(other);\n }\n\n var elements = this.spawn();\n var col1 = this;\n var col2 = other;\n\n var add = function add(col, other) {\n for (var i = 0; i < col.length; i++) {\n var ele = col[i];\n var id = ele._private.data.id;\n var inOther = other.hasElementWithId(id);\n\n if (!inOther) {\n elements.push(ele);\n }\n }\n };\n\n add(col1, col2);\n add(col2, col1);\n return elements;\n },\n diff: function diff(other) {\n var cy = this._private.cy;\n\n if (string(other)) {\n other = cy.$(other);\n }\n\n var left = this.spawn();\n var right = this.spawn();\n var both = this.spawn();\n var col1 = this;\n var col2 = other;\n\n var add = function add(col, other, retEles) {\n for (var i = 0; i < col.length; i++) {\n var ele = col[i];\n var id = ele._private.data.id;\n var inOther = other.hasElementWithId(id);\n\n if (inOther) {\n both.merge(ele);\n } else {\n retEles.push(ele);\n }\n }\n };\n\n add(col1, col2, left);\n add(col2, col1, right);\n return {\n left: left,\n right: right,\n both: both\n };\n },\n add: function add(toAdd) {\n var cy = this._private.cy;\n\n if (!toAdd) {\n return this;\n }\n\n if (string(toAdd)) {\n var selector = toAdd;\n toAdd = cy.mutableElements().filter(selector);\n }\n\n var elements = this.spawnSelf();\n\n for (var i = 0; i < toAdd.length; i++) {\n var ele = toAdd[i];\n var add = !this.has(ele);\n\n if (add) {\n elements.push(ele);\n }\n }\n\n return elements;\n },\n // in place merge on calling collection\n merge: function merge(toAdd) {\n var _p = this._private;\n var cy = _p.cy;\n\n if (!toAdd) {\n return this;\n }\n\n if (toAdd && string(toAdd)) {\n var selector = toAdd;\n toAdd = cy.mutableElements().filter(selector);\n }\n\n var map = _p.map;\n\n for (var i = 0; i < toAdd.length; i++) {\n var toAddEle = toAdd[i];\n var id = toAddEle._private.data.id;\n var add = !map.has(id);\n\n if (add) {\n var index = this.length++;\n this[index] = toAddEle;\n map.set(id, {\n ele: toAddEle,\n index: index\n });\n }\n }\n\n return this; // chaining\n },\n unmergeAt: function unmergeAt(i) {\n var ele = this[i];\n var id = ele.id();\n var _p = this._private;\n var map = _p.map; // remove ele\n\n this[i] = undefined;\n map[\"delete\"](id);\n var unmergedLastEle = i === this.length - 1; // replace empty spot with last ele in collection\n\n if (this.length > 1 && !unmergedLastEle) {\n var lastEleI = this.length - 1;\n var lastEle = this[lastEleI];\n var lastEleId = lastEle._private.data.id;\n this[lastEleI] = undefined;\n this[i] = lastEle;\n map.set(lastEleId, {\n ele: lastEle,\n index: i\n });\n } // the collection is now 1 ele smaller\n\n\n this.length--;\n return this;\n },\n // remove single ele in place in calling collection\n unmergeOne: function unmergeOne(ele) {\n ele = ele[0];\n var _p = this._private;\n var id = ele._private.data.id;\n var map = _p.map;\n var entry = map.get(id);\n\n if (!entry) {\n return this; // no need to remove\n }\n\n var i = entry.index;\n this.unmergeAt(i);\n return this;\n },\n // remove eles in place on calling collection\n unmerge: function unmerge(toRemove) {\n var cy = this._private.cy;\n\n if (!toRemove) {\n return this;\n }\n\n if (toRemove && string(toRemove)) {\n var selector = toRemove;\n toRemove = cy.mutableElements().filter(selector);\n }\n\n for (var i = 0; i < toRemove.length; i++) {\n this.unmergeOne(toRemove[i]);\n }\n\n return this; // chaining\n },\n unmergeBy: function unmergeBy(toRmFn) {\n for (var i = this.length - 1; i >= 0; i--) {\n var ele = this[i];\n\n if (toRmFn(ele)) {\n this.unmergeAt(i);\n }\n }\n\n return this;\n },\n map: function map(mapFn, thisArg) {\n var arr = [];\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var ret = thisArg ? mapFn.apply(thisArg, [ele, i, eles]) : mapFn(ele, i, eles);\n arr.push(ret);\n }\n\n return arr;\n },\n reduce: function reduce(fn, initialValue) {\n var val = initialValue;\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n val = fn(val, eles[i], i, eles);\n }\n\n return val;\n },\n max: function max(valFn, thisArg) {\n var max = -Infinity;\n var maxEle;\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles);\n\n if (val > max) {\n max = val;\n maxEle = ele;\n }\n }\n\n return {\n value: max,\n ele: maxEle\n };\n },\n min: function min(valFn, thisArg) {\n var min = Infinity;\n var minEle;\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles);\n\n if (val < min) {\n min = val;\n minEle = ele;\n }\n }\n\n return {\n value: min,\n ele: minEle\n };\n }\n}; // aliases\n\nvar fn$5 = elesfn$n;\nfn$5['u'] = fn$5['|'] = fn$5['+'] = fn$5.union = fn$5.or = fn$5.add;\nfn$5['\\\\'] = fn$5['!'] = fn$5['-'] = fn$5.difference = fn$5.relativeComplement = fn$5.subtract = fn$5.not;\nfn$5['n'] = fn$5['&'] = fn$5['.'] = fn$5.and = fn$5.intersection = fn$5.intersect;\nfn$5['^'] = fn$5['(+)'] = fn$5['(-)'] = fn$5.symmetricDifference = fn$5.symdiff = fn$5.xor;\nfn$5.fnFilter = fn$5.filterFn = fn$5.stdFilter = fn$5.filter;\nfn$5.complement = fn$5.abscomp = fn$5.absoluteComplement;\n\nvar elesfn$o = {\n isNode: function isNode() {\n return this.group() === 'nodes';\n },\n isEdge: function isEdge() {\n return this.group() === 'edges';\n },\n isLoop: function isLoop() {\n return this.isEdge() && this.source()[0] === this.target()[0];\n },\n isSimple: function isSimple() {\n return this.isEdge() && this.source()[0] !== this.target()[0];\n },\n group: function group() {\n var ele = this[0];\n\n if (ele) {\n return ele._private.group;\n }\n }\n};\n\n/**\n * Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges),\n * and z-index (low to high). These styles affect how this applies:\n *\n * z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the\n * same depth as the root of the compound graph, followed by the default value `auto` which draws in order from\n * root to leaves of the compound graph. The last drawn is `top`.\n * z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes.\n * `manual` ignores this convention and draws based on the `z-index` value setting.\n * z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher\n * `z-index` will be drawn on top of an element with a lower `z-index`.\n */\n\nvar zIndexSort = function zIndexSort(a, b) {\n var cy = a.cy();\n var hasCompoundNodes = cy.hasCompoundNodes();\n\n function getDepth(ele) {\n var style = ele.pstyle('z-compound-depth');\n\n if (style.value === 'auto') {\n return hasCompoundNodes ? ele.zDepth() : 0;\n } else if (style.value === 'bottom') {\n return -1;\n } else if (style.value === 'top') {\n return MAX_INT;\n } // 'orphan'\n\n\n return 0;\n }\n\n var depthDiff = getDepth(a) - getDepth(b);\n\n if (depthDiff !== 0) {\n return depthDiff;\n }\n\n function getEleDepth(ele) {\n var style = ele.pstyle('z-index-compare');\n\n if (style.value === 'auto') {\n return ele.isNode() ? 1 : 0;\n } // 'manual'\n\n\n return 0;\n }\n\n var eleDiff = getEleDepth(a) - getEleDepth(b);\n\n if (eleDiff !== 0) {\n return eleDiff;\n }\n\n var zDiff = a.pstyle('z-index').value - b.pstyle('z-index').value;\n\n if (zDiff !== 0) {\n return zDiff;\n } // compare indices in the core (order added to graph w/ last on top)\n\n\n return a.poolIndex() - b.poolIndex();\n};\n\nvar elesfn$p = {\n forEach: function forEach(fn$1, thisArg) {\n if (fn(fn$1)) {\n var N = this.length;\n\n for (var i = 0; i < N; i++) {\n var ele = this[i];\n var ret = thisArg ? fn$1.apply(thisArg, [ele, i, this]) : fn$1(ele, i, this);\n\n if (ret === false) {\n break;\n } // exit each early on return false\n\n }\n }\n\n return this;\n },\n toArray: function toArray() {\n var array = [];\n\n for (var i = 0; i < this.length; i++) {\n array.push(this[i]);\n }\n\n return array;\n },\n slice: function slice(start, end) {\n var array = [];\n var thisSize = this.length;\n\n if (end == null) {\n end = thisSize;\n }\n\n if (start == null) {\n start = 0;\n }\n\n if (start < 0) {\n start = thisSize + start;\n }\n\n if (end < 0) {\n end = thisSize + end;\n }\n\n for (var i = start; i >= 0 && i < end && i < thisSize; i++) {\n array.push(this[i]);\n }\n\n return this.spawn(array);\n },\n size: function size() {\n return this.length;\n },\n eq: function eq(i) {\n return this[i] || this.spawn();\n },\n first: function first() {\n return this[0] || this.spawn();\n },\n last: function last() {\n return this[this.length - 1] || this.spawn();\n },\n empty: function empty() {\n return this.length === 0;\n },\n nonempty: function nonempty() {\n return !this.empty();\n },\n sort: function sort(sortFn) {\n if (!fn(sortFn)) {\n return this;\n }\n\n var sorted = this.toArray().sort(sortFn);\n return this.spawn(sorted);\n },\n sortByZIndex: function sortByZIndex() {\n return this.sort(zIndexSort);\n },\n zDepth: function zDepth() {\n var ele = this[0];\n\n if (!ele) {\n return undefined;\n } // let cy = ele.cy();\n\n\n var _p = ele._private;\n var group = _p.group;\n\n if (group === 'nodes') {\n var depth = _p.data.parent ? ele.parents().size() : 0;\n\n if (!ele.isParent()) {\n return MAX_INT - 1; // childless nodes always on top\n }\n\n return depth;\n } else {\n var src = _p.source;\n var tgt = _p.target;\n var srcDepth = src.zDepth();\n var tgtDepth = tgt.zDepth();\n return Math.max(srcDepth, tgtDepth, 0); // depth of deepest parent\n }\n }\n};\nelesfn$p.each = elesfn$p.forEach;\n\nvar defineSymbolIterator = function defineSymbolIterator() {\n var typeofUndef = \"undefined\" ;\n var isIteratorSupported = (typeof Symbol === \"undefined\" ? \"undefined\" : _typeof(Symbol)) != typeofUndef && _typeof(Symbol.iterator) != typeofUndef; // eslint-disable-line no-undef\n\n if (isIteratorSupported) {\n elesfn$p[Symbol.iterator] = function () {\n var _this = this;\n\n // eslint-disable-line no-undef\n var entry = {\n value: undefined,\n done: false\n };\n var i = 0;\n var length = this.length;\n return _defineProperty({\n next: function next() {\n if (i < length) {\n entry.value = _this[i++];\n } else {\n entry.value = undefined;\n entry.done = true;\n }\n\n return entry;\n }\n }, Symbol.iterator, function () {\n // eslint-disable-line no-undef\n return this;\n });\n };\n }\n};\n\ndefineSymbolIterator();\n\nvar getLayoutDimensionOptions = defaults({\n nodeDimensionsIncludeLabels: false\n});\nvar elesfn$q = {\n // Calculates and returns node dimensions { x, y } based on options given\n layoutDimensions: function layoutDimensions(options) {\n options = getLayoutDimensionOptions(options);\n var dims;\n\n if (!this.takesUpSpace()) {\n dims = {\n w: 0,\n h: 0\n };\n } else if (options.nodeDimensionsIncludeLabels) {\n var bbDim = this.boundingBox();\n dims = {\n w: bbDim.w,\n h: bbDim.h\n };\n } else {\n dims = {\n w: this.outerWidth(),\n h: this.outerHeight()\n };\n } // sanitise the dimensions for external layouts (avoid division by zero)\n\n\n if (dims.w === 0 || dims.h === 0) {\n dims.w = dims.h = 1;\n }\n\n return dims;\n },\n // using standard layout options, apply position function (w/ or w/o animation)\n layoutPositions: function layoutPositions(layout, options, fn) {\n var nodes = this.nodes().filter(function (n) {\n return !n.isParent();\n });\n var cy = this.cy();\n var layoutEles = options.eles; // nodes & edges\n\n var getMemoizeKey = function getMemoizeKey(node) {\n return node.id();\n };\n\n var fnMem = memoize(fn, getMemoizeKey); // memoized version of position function\n\n layout.emit({\n type: 'layoutstart',\n layout: layout\n });\n layout.animations = [];\n\n var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) {\n var center = {\n x: nodesBb.x1 + nodesBb.w / 2,\n y: nodesBb.y1 + nodesBb.h / 2\n };\n var spacingVector = {\n // scale from center of bounding box (not necessarily 0,0)\n x: (pos.x - center.x) * spacing,\n y: (pos.y - center.y) * spacing\n };\n return {\n x: center.x + spacingVector.x,\n y: center.y + spacingVector.y\n };\n };\n\n var useSpacingFactor = options.spacingFactor && options.spacingFactor !== 1;\n\n var spacingBb = function spacingBb() {\n if (!useSpacingFactor) {\n return null;\n }\n\n var bb = makeBoundingBox();\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var pos = fnMem(node, i);\n expandBoundingBoxByPoint(bb, pos.x, pos.y);\n }\n\n return bb;\n };\n\n var bb = spacingBb();\n var getFinalPos = memoize(function (node, i) {\n var newPos = fnMem(node, i);\n\n if (useSpacingFactor) {\n var spacing = Math.abs(options.spacingFactor);\n newPos = calculateSpacing(spacing, bb, newPos);\n }\n\n if (options.transform != null) {\n newPos = options.transform(node, newPos);\n }\n\n return newPos;\n }, getMemoizeKey);\n\n if (options.animate) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var newPos = getFinalPos(node, i);\n var animateNode = options.animateFilter == null || options.animateFilter(node, i);\n\n if (animateNode) {\n var ani = node.animation({\n position: newPos,\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(ani);\n } else {\n node.position(newPos);\n }\n }\n\n if (options.fit) {\n var fitAni = cy.animation({\n fit: {\n boundingBox: layoutEles.boundingBoxAt(getFinalPos),\n padding: options.padding\n },\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(fitAni);\n } else if (options.zoom !== undefined && options.pan !== undefined) {\n var zoomPanAni = cy.animation({\n zoom: options.zoom,\n pan: options.pan,\n duration: options.animationDuration,\n easing: options.animationEasing\n });\n layout.animations.push(zoomPanAni);\n }\n\n layout.animations.forEach(function (ani) {\n return ani.play();\n });\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: layout\n });\n Promise$1.all(layout.animations.map(function (ani) {\n return ani.promise();\n })).then(function () {\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n });\n } else {\n nodes.positions(getFinalPos);\n\n if (options.fit) {\n cy.fit(options.eles, options.padding);\n }\n\n if (options.zoom != null) {\n cy.zoom(options.zoom);\n }\n\n if (options.pan) {\n cy.pan(options.pan);\n }\n\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: layout\n });\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n }\n\n return this; // chaining\n },\n layout: function layout(options) {\n var cy = this.cy();\n return cy.makeLayout(extend({}, options, {\n eles: this\n }));\n }\n}; // aliases:\n\nelesfn$q.createLayout = elesfn$q.makeLayout = elesfn$q.layout;\n\nfunction styleCache(key, fn, ele) {\n var _p = ele._private;\n var cache = _p.styleCache = _p.styleCache || [];\n var val;\n\n if ((val = cache[key]) != null) {\n return val;\n } else {\n val = cache[key] = fn(ele);\n return val;\n }\n}\n\nfunction cacheStyleFunction(key, fn) {\n key = hashString(key);\n return function cachedStyleFunction(ele) {\n return styleCache(key, fn, ele);\n };\n}\n\nfunction cachePrototypeStyleFunction(key, fn) {\n key = hashString(key);\n\n var selfFn = function selfFn(ele) {\n return fn.call(ele);\n };\n\n return function cachedPrototypeStyleFunction() {\n var ele = this[0];\n\n if (ele) {\n return styleCache(key, selfFn, ele);\n }\n };\n}\n\nvar elesfn$r = {\n recalculateRenderedStyle: function recalculateRenderedStyle(useCache) {\n var cy = this.cy();\n var renderer = cy.renderer();\n var styleEnabled = cy.styleEnabled();\n\n if (renderer && styleEnabled) {\n renderer.recalculateRenderedStyle(this, useCache);\n }\n\n return this;\n },\n dirtyStyleCache: function dirtyStyleCache() {\n var cy = this.cy();\n\n var dirty = function dirty(ele) {\n return ele._private.styleCache = null;\n };\n\n if (cy.hasCompoundNodes()) {\n var eles;\n eles = this.spawnSelf().merge(this.descendants()).merge(this.parents());\n eles.merge(eles.connectedEdges());\n eles.forEach(dirty);\n } else {\n this.forEach(function (ele) {\n dirty(ele);\n ele.connectedEdges().forEach(dirty);\n });\n }\n\n return this;\n },\n // fully updates (recalculates) the style for the elements\n updateStyle: function updateStyle(notifyRenderer) {\n var cy = this._private.cy;\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n if (cy.batching()) {\n var bEles = cy._private.batchStyleEles;\n bEles.merge(this);\n return this; // chaining and exit early when batching\n }\n\n var hasCompounds = cy.hasCompoundNodes();\n var updatedEles = this;\n notifyRenderer = notifyRenderer || notifyRenderer === undefined ? true : false;\n\n if (hasCompounds) {\n // then add everything up and down for compound selector checks\n updatedEles = this.spawnSelf().merge(this.descendants()).merge(this.parents());\n } // let changedEles = style.apply( updatedEles );\n\n\n var changedEles = updatedEles;\n\n if (notifyRenderer) {\n changedEles.emitAndNotify('style'); // let renderer know we changed style\n } else {\n changedEles.emit('style'); // just fire the event\n }\n\n updatedEles.forEach(function (ele) {\n return ele._private.styleDirty = true;\n });\n return this; // chaining\n },\n // private: clears dirty flag and recalculates style\n cleanStyle: function cleanStyle() {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return;\n }\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n\n if (ele._private.styleDirty) {\n // n.b. this flag should be set before apply() to avoid potential infinite recursion\n ele._private.styleDirty = false;\n cy.style().apply(ele);\n }\n }\n },\n // get the internal parsed style object for the specified property\n parsedStyle: function parsedStyle(property) {\n var includeNonDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var ele = this[0];\n var cy = ele.cy();\n\n if (!cy.styleEnabled()) {\n return;\n }\n\n if (ele) {\n this.cleanStyle();\n var overriddenStyle = ele._private.style[property];\n\n if (overriddenStyle != null) {\n return overriddenStyle;\n } else if (includeNonDefault) {\n return cy.style().getDefaultProperty(property);\n } else {\n return null;\n }\n }\n },\n numericStyle: function numericStyle(property) {\n var ele = this[0];\n\n if (!ele.cy().styleEnabled()) {\n return;\n }\n\n if (ele) {\n var pstyle = ele.pstyle(property);\n return pstyle.pfValue !== undefined ? pstyle.pfValue : pstyle.value;\n }\n },\n numericStyleUnits: function numericStyleUnits(property) {\n var ele = this[0];\n\n if (!ele.cy().styleEnabled()) {\n return;\n }\n\n if (ele) {\n return ele.pstyle(property).units;\n }\n },\n // get the specified css property as a rendered value (i.e. on-screen value)\n // or get the whole rendered style if no property specified (NB doesn't allow setting)\n renderedStyle: function renderedStyle(property) {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n var ele = this[0];\n\n if (ele) {\n return cy.style().getRenderedStyle(ele, property);\n }\n },\n // read the calculated css style of the element or override the style (via a bypass)\n style: function style(name, value) {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n var updateTransitions = false;\n var style = cy.style();\n\n if (plainObject(name)) {\n // then extend the bypass\n var props = name;\n style.applyBypass(this, props, updateTransitions);\n this.emitAndNotify('style'); // let the renderer know we've updated style\n } else if (string(name)) {\n if (value === undefined) {\n // then get the property from the style\n var ele = this[0];\n\n if (ele) {\n return style.getStylePropertyValue(ele, name);\n } else {\n // empty collection => can't get any value\n return;\n }\n } else {\n // then set the bypass with the property value\n style.applyBypass(this, name, value, updateTransitions);\n this.emitAndNotify('style'); // let the renderer know we've updated style\n }\n } else if (name === undefined) {\n var _ele = this[0];\n\n if (_ele) {\n return style.getRawStyle(_ele);\n } else {\n // empty collection => can't get any value\n return;\n }\n }\n\n return this; // chaining\n },\n removeStyle: function removeStyle(names) {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return this;\n }\n\n var updateTransitions = false;\n var style = cy.style();\n var eles = this;\n\n if (names === undefined) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n style.removeAllBypasses(ele, updateTransitions);\n }\n } else {\n names = names.split(/\\s+/);\n\n for (var _i = 0; _i < eles.length; _i++) {\n var _ele2 = eles[_i];\n style.removeBypasses(_ele2, names, updateTransitions);\n }\n }\n\n this.emitAndNotify('style'); // let the renderer know we've updated style\n\n return this; // chaining\n },\n show: function show() {\n this.css('display', 'element');\n return this; // chaining\n },\n hide: function hide() {\n this.css('display', 'none');\n return this; // chaining\n },\n effectiveOpacity: function effectiveOpacity() {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return 1;\n }\n\n var hasCompoundNodes = cy.hasCompoundNodes();\n var ele = this[0];\n\n if (ele) {\n var _p = ele._private;\n var parentOpacity = ele.pstyle('opacity').value;\n\n if (!hasCompoundNodes) {\n return parentOpacity;\n }\n\n var parents = !_p.data.parent ? null : ele.parents();\n\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n var parent = parents[i];\n var opacity = parent.pstyle('opacity').value;\n parentOpacity = opacity * parentOpacity;\n }\n }\n\n return parentOpacity;\n }\n },\n transparent: function transparent() {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return false;\n }\n\n var ele = this[0];\n var hasCompoundNodes = ele.cy().hasCompoundNodes();\n\n if (ele) {\n if (!hasCompoundNodes) {\n return ele.pstyle('opacity').value === 0;\n } else {\n return ele.effectiveOpacity() === 0;\n }\n }\n },\n backgrounding: function backgrounding() {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return false;\n }\n\n var ele = this[0];\n return ele._private.backgrounding ? true : false;\n }\n};\n\nfunction checkCompound(ele, parentOk) {\n var _p = ele._private;\n var parents = _p.data.parent ? ele.parents() : null;\n\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n var parent = parents[i];\n\n if (!parentOk(parent)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nfunction defineDerivedStateFunction(specs) {\n var ok = specs.ok;\n var edgeOkViaNode = specs.edgeOkViaNode || specs.ok;\n var parentOk = specs.parentOk || specs.ok;\n return function () {\n var cy = this.cy();\n\n if (!cy.styleEnabled()) {\n return true;\n }\n\n var ele = this[0];\n var hasCompoundNodes = cy.hasCompoundNodes();\n\n if (ele) {\n var _p = ele._private;\n\n if (!ok(ele)) {\n return false;\n }\n\n if (ele.isNode()) {\n return !hasCompoundNodes || checkCompound(ele, parentOk);\n } else {\n var src = _p.source;\n var tgt = _p.target;\n return edgeOkViaNode(src) && (!hasCompoundNodes || checkCompound(src, edgeOkViaNode)) && (src === tgt || edgeOkViaNode(tgt) && (!hasCompoundNodes || checkCompound(tgt, edgeOkViaNode)));\n }\n }\n };\n}\n\nvar eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) {\n return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true);\n});\nelesfn$r.takesUpSpace = cachePrototypeStyleFunction('takesUpSpace', defineDerivedStateFunction({\n ok: eleTakesUpSpace\n}));\nvar eleInteractive = cacheStyleFunction('eleInteractive', function (ele) {\n return ele.pstyle('events').value === 'yes' && ele.pstyle('visibility').value === 'visible' && eleTakesUpSpace(ele);\n});\nvar parentInteractive = cacheStyleFunction('parentInteractive', function (parent) {\n return parent.pstyle('visibility').value === 'visible' && eleTakesUpSpace(parent);\n});\nelesfn$r.interactive = cachePrototypeStyleFunction('interactive', defineDerivedStateFunction({\n ok: eleInteractive,\n parentOk: parentInteractive,\n edgeOkViaNode: eleTakesUpSpace\n}));\n\nelesfn$r.noninteractive = function () {\n var ele = this[0];\n\n if (ele) {\n return !ele.interactive();\n }\n};\n\nvar eleVisible = cacheStyleFunction('eleVisible', function (ele) {\n return ele.pstyle('visibility').value === 'visible' && ele.pstyle('opacity').pfValue !== 0 && eleTakesUpSpace(ele);\n});\nvar edgeVisibleViaNode = eleTakesUpSpace;\nelesfn$r.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunction({\n ok: eleVisible,\n edgeOkViaNode: edgeVisibleViaNode\n}));\n\nelesfn$r.hidden = function () {\n var ele = this[0];\n\n if (ele) {\n return !ele.visible();\n }\n};\n\nelesfn$r.isBundledBezier = cachePrototypeStyleFunction('isBundledBezier', function () {\n if (!this.cy().styleEnabled()) {\n return false;\n }\n\n return !this.removed() && this.pstyle('curve-style').value === 'bezier' && this.takesUpSpace();\n});\nelesfn$r.bypass = elesfn$r.css = elesfn$r.style;\nelesfn$r.renderedCss = elesfn$r.renderedStyle;\nelesfn$r.removeBypass = elesfn$r.removeCss = elesfn$r.removeStyle;\nelesfn$r.pstyle = elesfn$r.parsedStyle;\n\nvar elesfn$s = {};\n\nfunction defineSwitchFunction(params) {\n return function () {\n var args = arguments;\n var changedEles = []; // e.g. cy.nodes().select( data, handler )\n\n if (args.length === 2) {\n var data = args[0];\n var handler = args[1];\n this.on(params.event, data, handler);\n } // e.g. cy.nodes().select( handler )\n else if (args.length === 1 && fn(args[0])) {\n var _handler = args[0];\n this.on(params.event, _handler);\n } // e.g. cy.nodes().select()\n // e.g. (private) cy.nodes().select(['tapselect'])\n else if (args.length === 0 || args.length === 1 && array(args[0])) {\n var addlEvents = args.length === 1 ? args[0] : null;\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var able = !params.ableField || ele._private[params.ableField];\n var changed = ele._private[params.field] != params.value;\n\n if (params.overrideAble) {\n var overrideAble = params.overrideAble(ele);\n\n if (overrideAble !== undefined) {\n able = overrideAble;\n\n if (!overrideAble) {\n return this;\n } // to save cycles assume not able for all on override\n\n }\n }\n\n if (able) {\n ele._private[params.field] = params.value;\n\n if (changed) {\n changedEles.push(ele);\n }\n }\n }\n\n var changedColl = this.spawn(changedEles);\n changedColl.updateStyle(); // change of state => possible change of style\n\n changedColl.emit(params.event);\n\n if (addlEvents) {\n changedColl.emit(addlEvents);\n }\n }\n\n return this;\n };\n}\n\nfunction defineSwitchSet(params) {\n elesfn$s[params.field] = function () {\n var ele = this[0];\n\n if (ele) {\n if (params.overrideField) {\n var val = params.overrideField(ele);\n\n if (val !== undefined) {\n return val;\n }\n }\n\n return ele._private[params.field];\n }\n };\n\n elesfn$s[params.on] = defineSwitchFunction({\n event: params.on,\n field: params.field,\n ableField: params.ableField,\n overrideAble: params.overrideAble,\n value: true\n });\n elesfn$s[params.off] = defineSwitchFunction({\n event: params.off,\n field: params.field,\n ableField: params.ableField,\n overrideAble: params.overrideAble,\n value: false\n });\n}\n\ndefineSwitchSet({\n field: 'locked',\n overrideField: function overrideField(ele) {\n return ele.cy().autolock() ? true : undefined;\n },\n on: 'lock',\n off: 'unlock'\n});\ndefineSwitchSet({\n field: 'grabbable',\n overrideField: function overrideField(ele) {\n return ele.cy().autoungrabify() || ele.pannable() ? false : undefined;\n },\n on: 'grabify',\n off: 'ungrabify'\n});\ndefineSwitchSet({\n field: 'selected',\n ableField: 'selectable',\n overrideAble: function overrideAble(ele) {\n return ele.cy().autounselectify() ? false : undefined;\n },\n on: 'select',\n off: 'unselect'\n});\ndefineSwitchSet({\n field: 'selectable',\n overrideField: function overrideField(ele) {\n return ele.cy().autounselectify() ? false : undefined;\n },\n on: 'selectify',\n off: 'unselectify'\n});\nelesfn$s.deselect = elesfn$s.unselect;\n\nelesfn$s.grabbed = function () {\n var ele = this[0];\n\n if (ele) {\n return ele._private.grabbed;\n }\n};\n\ndefineSwitchSet({\n field: 'active',\n on: 'activate',\n off: 'unactivate'\n});\ndefineSwitchSet({\n field: 'pannable',\n on: 'panify',\n off: 'unpanify'\n});\n\nelesfn$s.inactive = function () {\n var ele = this[0];\n\n if (ele) {\n return !ele._private.active;\n }\n};\n\nvar elesfn$t = {}; // DAG functions\n////////////////\n\nvar defineDagExtremity = function defineDagExtremity(params) {\n return function dagExtremityImpl(selector) {\n var eles = this;\n var ret = [];\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n\n if (!ele.isNode()) {\n continue;\n }\n\n var disqualified = false;\n var edges = ele.connectedEdges();\n\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n var src = edge.source();\n var tgt = edge.target();\n\n if (params.noIncomingEdges && tgt === ele && src !== ele || params.noOutgoingEdges && src === ele && tgt !== ele) {\n disqualified = true;\n break;\n }\n }\n\n if (!disqualified) {\n ret.push(ele);\n }\n }\n\n return this.spawn(ret, true).filter(selector);\n };\n};\n\nvar defineDagOneHop = function defineDagOneHop(params) {\n return function (selector) {\n var eles = this;\n var oEles = [];\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n\n if (!ele.isNode()) {\n continue;\n }\n\n var edges = ele.connectedEdges();\n\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n var src = edge.source();\n var tgt = edge.target();\n\n if (params.outgoing && src === ele) {\n oEles.push(edge);\n oEles.push(tgt);\n } else if (params.incoming && tgt === ele) {\n oEles.push(edge);\n oEles.push(src);\n }\n }\n }\n\n return this.spawn(oEles, true).filter(selector);\n };\n};\n\nvar defineDagAllHops = function defineDagAllHops(params) {\n return function (selector) {\n var eles = this;\n var sEles = [];\n var sElesIds = {};\n\n for (;;) {\n var next = params.outgoing ? eles.outgoers() : eles.incomers();\n\n if (next.length === 0) {\n break;\n } // done if none left\n\n\n var newNext = false;\n\n for (var i = 0; i < next.length; i++) {\n var n = next[i];\n var nid = n.id();\n\n if (!sElesIds[nid]) {\n sElesIds[nid] = true;\n sEles.push(n);\n newNext = true;\n }\n }\n\n if (!newNext) {\n break;\n } // done if touched all outgoers already\n\n\n eles = next;\n }\n\n return this.spawn(sEles, true).filter(selector);\n };\n};\n\nelesfn$t.clearTraversalCache = function () {\n for (var i = 0; i < this.length; i++) {\n this[i]._private.traversalCache = null;\n }\n};\n\nextend(elesfn$t, {\n // get the root nodes in the DAG\n roots: defineDagExtremity({\n noIncomingEdges: true\n }),\n // get the leaf nodes in the DAG\n leaves: defineDagExtremity({\n noOutgoingEdges: true\n }),\n // normally called children in graph theory\n // these nodes =edges=> outgoing nodes\n outgoers: cache(defineDagOneHop({\n outgoing: true\n }), 'outgoers'),\n // aka DAG descendants\n successors: defineDagAllHops({\n outgoing: true\n }),\n // normally called parents in graph theory\n // these nodes <=edges= incoming nodes\n incomers: cache(defineDagOneHop({\n incoming: true\n }), 'incomers'),\n // aka DAG ancestors\n predecessors: defineDagAllHops({\n incoming: true\n })\n}); // Neighbourhood functions\n//////////////////////////\n\nextend(elesfn$t, {\n neighborhood: cache(function (selector) {\n var elements = [];\n var nodes = this.nodes();\n\n for (var i = 0; i < nodes.length; i++) {\n // for all nodes\n var node = nodes[i];\n var connectedEdges = node.connectedEdges(); // for each connected edge, add the edge and the other node\n\n for (var j = 0; j < connectedEdges.length; j++) {\n var edge = connectedEdges[j];\n var src = edge.source();\n var tgt = edge.target();\n var otherNode = node === src ? tgt : src; // need check in case of loop\n\n if (otherNode.length > 0) {\n elements.push(otherNode[0]); // add node 1 hop away\n } // add connected edge\n\n\n elements.push(edge[0]);\n }\n }\n\n return this.spawn(elements, true).filter(selector);\n }, 'neighborhood'),\n closedNeighborhood: function closedNeighborhood(selector) {\n return this.neighborhood().add(this).filter(selector);\n },\n openNeighborhood: function openNeighborhood(selector) {\n return this.neighborhood(selector);\n }\n}); // aliases\n\nelesfn$t.neighbourhood = elesfn$t.neighborhood;\nelesfn$t.closedNeighbourhood = elesfn$t.closedNeighborhood;\nelesfn$t.openNeighbourhood = elesfn$t.openNeighborhood; // Edge functions\n/////////////////\n\nextend(elesfn$t, {\n source: cache(function sourceImpl(selector) {\n var ele = this[0];\n var src;\n\n if (ele) {\n src = ele._private.source || ele.cy().collection();\n }\n\n return src && selector ? src.filter(selector) : src;\n }, 'source'),\n target: cache(function targetImpl(selector) {\n var ele = this[0];\n var tgt;\n\n if (ele) {\n tgt = ele._private.target || ele.cy().collection();\n }\n\n return tgt && selector ? tgt.filter(selector) : tgt;\n }, 'target'),\n sources: defineSourceFunction({\n attr: 'source'\n }),\n targets: defineSourceFunction({\n attr: 'target'\n })\n});\n\nfunction defineSourceFunction(params) {\n return function sourceImpl(selector) {\n var sources = [];\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var src = ele._private[params.attr];\n\n if (src) {\n sources.push(src);\n }\n }\n\n return this.spawn(sources, true).filter(selector);\n };\n}\n\nextend(elesfn$t, {\n edgesWith: cache(defineEdgesWithFunction(), 'edgesWith'),\n edgesTo: cache(defineEdgesWithFunction({\n thisIsSrc: true\n }), 'edgesTo')\n});\n\nfunction defineEdgesWithFunction(params) {\n return function edgesWithImpl(otherNodes) {\n var elements = [];\n var cy = this._private.cy;\n var p = params || {}; // get elements if a selector is specified\n\n if (string(otherNodes)) {\n otherNodes = cy.$(otherNodes);\n }\n\n for (var h = 0; h < otherNodes.length; h++) {\n var edges = otherNodes[h]._private.edges;\n\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var edgeData = edge._private.data;\n var thisToOther = this.hasElementWithId(edgeData.source) && otherNodes.hasElementWithId(edgeData.target);\n var otherToThis = otherNodes.hasElementWithId(edgeData.source) && this.hasElementWithId(edgeData.target);\n var edgeConnectsThisAndOther = thisToOther || otherToThis;\n\n if (!edgeConnectsThisAndOther) {\n continue;\n }\n\n if (p.thisIsSrc || p.thisIsTgt) {\n if (p.thisIsSrc && !thisToOther) {\n continue;\n }\n\n if (p.thisIsTgt && !otherToThis) {\n continue;\n }\n }\n\n elements.push(edge);\n }\n }\n\n return this.spawn(elements, true);\n };\n}\n\nextend(elesfn$t, {\n connectedEdges: cache(function (selector) {\n var retEles = [];\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var node = eles[i];\n\n if (!node.isNode()) {\n continue;\n }\n\n var edges = node._private.edges;\n\n for (var j = 0; j < edges.length; j++) {\n var edge = edges[j];\n retEles.push(edge);\n }\n }\n\n return this.spawn(retEles, true).filter(selector);\n }, 'connectedEdges'),\n connectedNodes: cache(function (selector) {\n var retEles = [];\n var eles = this;\n\n for (var i = 0; i < eles.length; i++) {\n var edge = eles[i];\n\n if (!edge.isEdge()) {\n continue;\n }\n\n retEles.push(edge.source()[0]);\n retEles.push(edge.target()[0]);\n }\n\n return this.spawn(retEles, true).filter(selector);\n }, 'connectedNodes'),\n parallelEdges: cache(defineParallelEdgesFunction(), 'parallelEdges'),\n codirectedEdges: cache(defineParallelEdgesFunction({\n codirected: true\n }), 'codirectedEdges')\n});\n\nfunction defineParallelEdgesFunction(params) {\n var defaults = {\n codirected: false\n };\n params = extend({}, defaults, params);\n return function parallelEdgesImpl(selector) {\n // micro-optimised for renderer\n var elements = [];\n var edges = this.edges();\n var p = params; // look at all the edges in the collection\n\n for (var i = 0; i < edges.length; i++) {\n var edge1 = edges[i];\n var edge1_p = edge1._private;\n var src1 = edge1_p.source;\n var srcid1 = src1._private.data.id;\n var tgtid1 = edge1_p.data.target;\n var srcEdges1 = src1._private.edges; // look at edges connected to the src node of this edge\n\n for (var j = 0; j < srcEdges1.length; j++) {\n var edge2 = srcEdges1[j];\n var edge2data = edge2._private.data;\n var tgtid2 = edge2data.target;\n var srcid2 = edge2data.source;\n var codirected = tgtid2 === tgtid1 && srcid2 === srcid1;\n var oppdirected = srcid1 === tgtid2 && tgtid1 === srcid2;\n\n if (p.codirected && codirected || !p.codirected && (codirected || oppdirected)) {\n elements.push(edge2);\n }\n }\n }\n\n return this.spawn(elements, true).filter(selector);\n };\n} // Misc functions\n/////////////////\n\n\nextend(elesfn$t, {\n components: function components(root) {\n var self = this;\n var cy = self.cy();\n var visited = cy.collection();\n var unvisited = root == null ? self.nodes() : root.nodes();\n var components = [];\n\n if (root != null && unvisited.empty()) {\n // root may contain only edges\n unvisited = root.sources(); // doesn't matter which node to use (undirected), so just use the source sides\n }\n\n var visitInComponent = function visitInComponent(node, component) {\n visited.merge(node);\n unvisited.unmerge(node);\n component.merge(node);\n };\n\n if (unvisited.empty()) {\n return self.spawn();\n }\n\n var _loop = function _loop() {\n // each iteration yields a component\n var cmpt = cy.collection();\n components.push(cmpt);\n var root = unvisited[0];\n visitInComponent(root, cmpt);\n self.bfs({\n directed: false,\n roots: root,\n visit: function visit(v) {\n return visitInComponent(v, cmpt);\n }\n });\n cmpt.forEach(function (node) {\n node.connectedEdges().forEach(function (e) {\n // connectedEdges() usually cached\n if (self.has(e) && cmpt.has(e.source()) && cmpt.has(e.target())) {\n // has() is cheap\n cmpt.merge(e); // forEach() only considers nodes -- sets N at call time\n }\n });\n });\n };\n\n do {\n _loop();\n } while (unvisited.length > 0);\n\n return components;\n },\n component: function component() {\n var ele = this[0];\n return ele.cy().mutableElements().components(ele)[0];\n }\n});\nelesfn$t.componentsOf = elesfn$t.components;\n\nvar Collection = function Collection(cy, elements) {\n var unique = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (cy === undefined) {\n error('A collection must have a reference to the core');\n return;\n }\n\n var map = new Map$1();\n var createdElements = false;\n\n if (!elements) {\n elements = [];\n } else if (elements.length > 0 && plainObject(elements[0]) && !element(elements[0])) {\n createdElements = true; // make elements from json and restore all at once later\n\n var eles = [];\n var elesIds = new Set$1();\n\n for (var i = 0, l = elements.length; i < l; i++) {\n var json = elements[i];\n\n if (json.data == null) {\n json.data = {};\n }\n\n var _data = json.data; // make sure newly created elements have valid ids\n\n if (_data.id == null) {\n _data.id = uuid();\n } else if (cy.hasElementWithId(_data.id) || elesIds.has(_data.id)) {\n continue; // can't create element if prior id already exists\n }\n\n var ele = new Element(cy, json, false);\n eles.push(ele);\n elesIds.add(_data.id);\n }\n\n elements = eles;\n }\n\n this.length = 0;\n\n for (var _i = 0, _l = elements.length; _i < _l; _i++) {\n var element$1 = elements[_i][0]; // [0] in case elements is an array of collections, rather than array of elements\n\n if (element$1 == null) {\n continue;\n }\n\n var id = element$1._private.data.id;\n\n if (!unique || !map.has(id)) {\n if (unique) {\n map.set(id, {\n index: this.length,\n ele: element$1\n });\n }\n\n this[this.length] = element$1;\n this.length++;\n }\n }\n\n this._private = {\n eles: this,\n cy: cy,\n\n get map() {\n if (this.lazyMap == null) {\n this.rebuildMap();\n }\n\n return this.lazyMap;\n },\n\n set map(m) {\n this.lazyMap = m;\n },\n\n rebuildMap: function rebuildMap() {\n var m = this.lazyMap = new Map$1();\n var eles = this.eles;\n\n for (var _i2 = 0; _i2 < eles.length; _i2++) {\n var _ele = eles[_i2];\n m.set(_ele.id(), {\n index: _i2,\n ele: _ele\n });\n }\n }\n };\n\n if (unique) {\n this._private.map = map;\n } // restore the elements if we created them from json\n\n\n if (createdElements) {\n this.restore();\n }\n}; // Functions\n////////////////////////////////////////////////////////////////////////////////////////////////////\n// keep the prototypes in sync (an element has the same functions as a collection)\n// and use elefn and elesfn as shorthands to the prototypes\n\n\nvar elesfn$u = Element.prototype = Collection.prototype = Object.create(Array.prototype);\n\nelesfn$u.instanceString = function () {\n return 'collection';\n};\n\nelesfn$u.spawn = function (eles, unique) {\n return new Collection(this.cy(), eles, unique);\n};\n\nelesfn$u.spawnSelf = function () {\n return this.spawn(this);\n};\n\nelesfn$u.cy = function () {\n return this._private.cy;\n};\n\nelesfn$u.renderer = function () {\n return this._private.cy.renderer();\n};\n\nelesfn$u.element = function () {\n return this[0];\n};\n\nelesfn$u.collection = function () {\n if (collection(this)) {\n return this;\n } else {\n // an element\n return new Collection(this._private.cy, [this]);\n }\n};\n\nelesfn$u.unique = function () {\n return new Collection(this._private.cy, this, true);\n};\n\nelesfn$u.hasElementWithId = function (id) {\n id = '' + id; // id must be string\n\n return this._private.map.has(id);\n};\n\nelesfn$u.getElementById = function (id) {\n id = '' + id; // id must be string\n\n var cy = this._private.cy;\n\n var entry = this._private.map.get(id);\n\n return entry ? entry.ele : new Collection(cy); // get ele or empty collection\n};\n\nelesfn$u.$id = elesfn$u.getElementById;\n\nelesfn$u.poolIndex = function () {\n var cy = this._private.cy;\n var eles = cy._private.elements;\n var id = this[0]._private.data.id;\n return eles._private.map.get(id).index;\n};\n\nelesfn$u.indexOf = function (ele) {\n var id = ele[0]._private.data.id;\n return this._private.map.get(id).index;\n};\n\nelesfn$u.indexOfId = function (id) {\n id = '' + id; // id must be string\n\n return this._private.map.get(id).index;\n};\n\nelesfn$u.json = function (obj) {\n var ele = this.element();\n var cy = this.cy();\n\n if (ele == null && obj) {\n return this;\n } // can't set to no eles\n\n\n if (ele == null) {\n return undefined;\n } // can't get from no eles\n\n\n var p = ele._private;\n\n if (plainObject(obj)) {\n // set\n cy.startBatch();\n\n if (obj.data) {\n ele.data(obj.data);\n var _data2 = p.data;\n\n if (ele.isEdge()) {\n // source and target are immutable via data()\n var move = false;\n var spec = {};\n var src = obj.data.source;\n var tgt = obj.data.target;\n\n if (src != null && src != _data2.source) {\n spec.source = '' + src; // id must be string\n\n move = true;\n }\n\n if (tgt != null && tgt != _data2.target) {\n spec.target = '' + tgt; // id must be string\n\n move = true;\n }\n\n if (move) {\n ele = ele.move(spec);\n }\n } else {\n // parent is immutable via data()\n var newParentValSpecd = 'parent' in obj.data;\n var parent = obj.data.parent;\n\n if (newParentValSpecd && (parent != null || _data2.parent != null) && parent != _data2.parent) {\n if (parent === undefined) {\n // can't set undefined imperatively, so use null\n parent = null;\n }\n\n if (parent != null) {\n parent = '' + parent; // id must be string\n }\n\n ele = ele.move({\n parent: parent\n });\n }\n }\n }\n\n if (obj.position) {\n ele.position(obj.position);\n } // ignore group -- immutable\n\n\n var checkSwitch = function checkSwitch(k, trueFnName, falseFnName) {\n var obj_k = obj[k];\n\n if (obj_k != null && obj_k !== p[k]) {\n if (obj_k) {\n ele[trueFnName]();\n } else {\n ele[falseFnName]();\n }\n }\n };\n\n checkSwitch('removed', 'remove', 'restore');\n checkSwitch('selected', 'select', 'unselect');\n checkSwitch('selectable', 'selectify', 'unselectify');\n checkSwitch('locked', 'lock', 'unlock');\n checkSwitch('grabbable', 'grabify', 'ungrabify');\n checkSwitch('pannable', 'panify', 'unpanify');\n\n if (obj.classes != null) {\n ele.classes(obj.classes);\n }\n\n cy.endBatch();\n return this;\n } else if (obj === undefined) {\n // get\n var json = {\n data: copy(p.data),\n position: copy(p.position),\n group: p.group,\n removed: p.removed,\n selected: p.selected,\n selectable: p.selectable,\n locked: p.locked,\n grabbable: p.grabbable,\n pannable: p.pannable,\n classes: null\n };\n json.classes = '';\n var i = 0;\n p.classes.forEach(function (cls) {\n return json.classes += i++ === 0 ? cls : ' ' + cls;\n });\n return json;\n }\n};\n\nelesfn$u.jsons = function () {\n var jsons = [];\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var json = ele.json();\n jsons.push(json);\n }\n\n return jsons;\n};\n\nelesfn$u.clone = function () {\n var cy = this.cy();\n var elesArr = [];\n\n for (var i = 0; i < this.length; i++) {\n var ele = this[i];\n var json = ele.json();\n var clone = new Element(cy, json, false); // NB no restore\n\n elesArr.push(clone);\n }\n\n return new Collection(cy, elesArr);\n};\n\nelesfn$u.copy = elesfn$u.clone;\n\nelesfn$u.restore = function () {\n var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var addToPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var self = this;\n var cy = self.cy();\n var cy_p = cy._private; // create arrays of nodes and edges, since we need to\n // restore the nodes first\n\n var nodes = [];\n var edges = [];\n var elements;\n\n for (var _i3 = 0, l = self.length; _i3 < l; _i3++) {\n var ele = self[_i3];\n\n if (addToPool && !ele.removed()) {\n // don't need to handle this ele\n continue;\n } // keep nodes first in the array and edges after\n\n\n if (ele.isNode()) {\n // put to front of array if node\n nodes.push(ele);\n } else {\n // put to end of array if edge\n edges.push(ele);\n }\n }\n\n elements = nodes.concat(edges);\n var i;\n\n var removeFromElements = function removeFromElements() {\n elements.splice(i, 1);\n i--;\n }; // now, restore each element\n\n\n for (i = 0; i < elements.length; i++) {\n var _ele2 = elements[i];\n var _private = _ele2._private;\n var _data3 = _private.data; // the traversal cache should start fresh when ele is added\n\n _ele2.clearTraversalCache(); // set id and validate\n\n\n if (!addToPool && !_private.removed) ; else if (_data3.id === undefined) {\n _data3.id = uuid();\n } else if (number(_data3.id)) {\n _data3.id = '' + _data3.id; // now it's a string\n } else if (emptyString(_data3.id) || !string(_data3.id)) {\n error('Can not create element with invalid string ID `' + _data3.id + '`'); // can't create element if it has empty string as id or non-string id\n\n removeFromElements();\n continue;\n } else if (cy.hasElementWithId(_data3.id)) {\n error('Can not create second element with ID `' + _data3.id + '`'); // can't create element if one already has that id\n\n removeFromElements();\n continue;\n }\n\n var id = _data3.id; // id is finalised, now let's keep a ref\n\n if (_ele2.isNode()) {\n // extra checks for nodes\n var pos = _private.position; // make sure the nodes have a defined position\n\n if (pos.x == null) {\n pos.x = 0;\n }\n\n if (pos.y == null) {\n pos.y = 0;\n }\n }\n\n if (_ele2.isEdge()) {\n // extra checks for edges\n var edge = _ele2;\n var fields = ['source', 'target'];\n var fieldsLength = fields.length;\n var badSourceOrTarget = false;\n\n for (var j = 0; j < fieldsLength; j++) {\n var field = fields[j];\n var val = _data3[field];\n\n if (number(val)) {\n val = _data3[field] = '' + _data3[field]; // now string\n }\n\n if (val == null || val === '') {\n // can't create if source or target is not defined properly\n error('Can not create edge `' + id + '` with unspecified ' + field);\n badSourceOrTarget = true;\n } else if (!cy.hasElementWithId(val)) {\n // can't create edge if one of its nodes doesn't exist\n error('Can not create edge `' + id + '` with nonexistant ' + field + ' `' + val + '`');\n badSourceOrTarget = true;\n }\n }\n\n if (badSourceOrTarget) {\n removeFromElements();\n continue;\n } // can't create this\n\n\n var src = cy.getElementById(_data3.source);\n var tgt = cy.getElementById(_data3.target); // only one edge in node if loop\n\n if (src.same(tgt)) {\n src._private.edges.push(edge);\n } else {\n src._private.edges.push(edge);\n\n tgt._private.edges.push(edge);\n }\n\n edge._private.source = src;\n edge._private.target = tgt;\n } // if is edge\n // create mock ids / indexes maps for element so it can be used like collections\n\n\n _private.map = new Map$1();\n\n _private.map.set(id, {\n ele: _ele2,\n index: 0\n });\n\n _private.removed = false;\n\n if (addToPool) {\n cy.addToPool(_ele2);\n }\n } // for each element\n // do compound node sanity checks\n\n\n for (var _i4 = 0; _i4 < nodes.length; _i4++) {\n // each node\n var node = nodes[_i4];\n var _data4 = node._private.data;\n\n if (number(_data4.parent)) {\n // then automake string\n _data4.parent = '' + _data4.parent;\n }\n\n var parentId = _data4.parent;\n var specifiedParent = parentId != null;\n\n if (specifiedParent) {\n var parent = cy.getElementById(parentId);\n\n if (parent.empty()) {\n // non-existant parent; just remove it\n _data4.parent = undefined;\n } else {\n var selfAsParent = false;\n var ancestor = parent;\n\n while (!ancestor.empty()) {\n if (node.same(ancestor)) {\n // mark self as parent and remove from data\n selfAsParent = true;\n _data4.parent = undefined; // remove parent reference\n // exit or we loop forever\n\n break;\n }\n\n ancestor = ancestor.parent();\n }\n\n if (!selfAsParent) {\n // connect with children\n parent[0]._private.children.push(node);\n\n node._private.parent = parent[0]; // let the core know we have a compound graph\n\n cy_p.hasCompoundNodes = true;\n }\n } // else\n\n } // if specified parent\n\n } // for each node\n\n\n if (elements.length > 0) {\n var restored = elements.length === self.length ? self : new Collection(cy, elements);\n\n for (var _i5 = 0; _i5 < restored.length; _i5++) {\n var _ele3 = restored[_i5];\n\n if (_ele3.isNode()) {\n continue;\n } // adding an edge invalidates the traversal caches for the parallel edges\n\n\n _ele3.parallelEdges().clearTraversalCache(); // adding an edge invalidates the traversal cache for the connected nodes\n\n\n _ele3.source().clearTraversalCache();\n\n _ele3.target().clearTraversalCache();\n }\n\n var toUpdateStyle;\n\n if (cy_p.hasCompoundNodes) {\n toUpdateStyle = cy.collection().merge(restored).merge(restored.connectedNodes()).merge(restored.parent());\n } else {\n toUpdateStyle = restored;\n }\n\n toUpdateStyle.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(notifyRenderer);\n\n if (notifyRenderer) {\n restored.emitAndNotify('add');\n } else if (addToPool) {\n restored.emit('add');\n }\n }\n\n return self; // chainability\n};\n\nelesfn$u.removed = function () {\n var ele = this[0];\n return ele && ele._private.removed;\n};\n\nelesfn$u.inside = function () {\n var ele = this[0];\n return ele && !ele._private.removed;\n};\n\nelesfn$u.remove = function () {\n var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var removeFromPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var self = this;\n var elesToRemove = [];\n var elesToRemoveIds = {};\n var cy = self._private.cy; // add connected edges\n\n function addConnectedEdges(node) {\n var edges = node._private.edges;\n\n for (var i = 0; i < edges.length; i++) {\n add(edges[i]);\n }\n } // add descendant nodes\n\n\n function addChildren(node) {\n var children = node._private.children;\n\n for (var i = 0; i < children.length; i++) {\n add(children[i]);\n }\n }\n\n function add(ele) {\n var alreadyAdded = elesToRemoveIds[ele.id()];\n\n if (removeFromPool && ele.removed() || alreadyAdded) {\n return;\n } else {\n elesToRemoveIds[ele.id()] = true;\n }\n\n if (ele.isNode()) {\n elesToRemove.push(ele); // nodes are removed last\n\n addConnectedEdges(ele);\n addChildren(ele);\n } else {\n elesToRemove.unshift(ele); // edges are removed first\n }\n } // make the list of elements to remove\n // (may be removing more than specified due to connected edges etc)\n\n\n for (var i = 0, l = self.length; i < l; i++) {\n var ele = self[i];\n add(ele);\n }\n\n function removeEdgeRef(node, edge) {\n var connectedEdges = node._private.edges;\n removeFromArray(connectedEdges, edge); // removing an edges invalidates the traversal cache for its nodes\n\n node.clearTraversalCache();\n }\n\n function removeParallelRef(pllEdge) {\n // removing an edge invalidates the traversal caches for the parallel edges\n pllEdge.clearTraversalCache();\n }\n\n var alteredParents = [];\n alteredParents.ids = {};\n\n function removeChildRef(parent, ele) {\n ele = ele[0];\n parent = parent[0];\n var children = parent._private.children;\n var pid = parent.id();\n removeFromArray(children, ele); // remove parent => child ref\n\n ele._private.parent = null; // remove child => parent ref\n\n if (!alteredParents.ids[pid]) {\n alteredParents.ids[pid] = true;\n alteredParents.push(parent);\n }\n }\n\n self.dirtyCompoundBoundsCache();\n\n if (removeFromPool) {\n cy.removeFromPool(elesToRemove); // remove from core pool\n }\n\n for (var _i6 = 0; _i6 < elesToRemove.length; _i6++) {\n var _ele4 = elesToRemove[_i6];\n\n if (_ele4.isEdge()) {\n // remove references to this edge in its connected nodes\n var src = _ele4.source()[0];\n\n var tgt = _ele4.target()[0];\n\n removeEdgeRef(src, _ele4);\n removeEdgeRef(tgt, _ele4);\n\n var pllEdges = _ele4.parallelEdges();\n\n for (var j = 0; j < pllEdges.length; j++) {\n var pllEdge = pllEdges[j];\n removeParallelRef(pllEdge);\n\n if (pllEdge.isBundledBezier()) {\n pllEdge.dirtyBoundingBoxCache();\n }\n }\n } else {\n // remove reference to parent\n var parent = _ele4.parent();\n\n if (parent.length !== 0) {\n removeChildRef(parent, _ele4);\n }\n }\n\n if (removeFromPool) {\n // mark as removed\n _ele4._private.removed = true;\n }\n } // check to see if we have a compound graph or not\n\n\n var elesStillInside = cy._private.elements;\n cy._private.hasCompoundNodes = false;\n\n for (var _i7 = 0; _i7 < elesStillInside.length; _i7++) {\n var _ele5 = elesStillInside[_i7];\n\n if (_ele5.isParent()) {\n cy._private.hasCompoundNodes = true;\n break;\n }\n }\n\n var removedElements = new Collection(this.cy(), elesToRemove);\n\n if (removedElements.size() > 0) {\n // must manually notify since trigger won't do this automatically once removed\n if (notifyRenderer) {\n removedElements.emitAndNotify('remove');\n } else if (removeFromPool) {\n removedElements.emit('remove');\n }\n } // the parents who were modified by the removal need their style updated\n\n\n for (var _i8 = 0; _i8 < alteredParents.length; _i8++) {\n var _ele6 = alteredParents[_i8];\n\n if (!removeFromPool || !_ele6.removed()) {\n _ele6.updateStyle();\n }\n }\n\n return removedElements;\n};\n\nelesfn$u.move = function (struct) {\n var cy = this._private.cy;\n var eles = this; // just clean up refs, caches, etc. in the same way as when removing and then restoring\n // (our calls to remove/restore do not remove from the graph or make events)\n\n var notifyRenderer = false;\n var modifyPool = false;\n\n var toString = function toString(id) {\n return id == null ? id : '' + id;\n }; // id must be string\n\n\n if (struct.source !== undefined || struct.target !== undefined) {\n var srcId = toString(struct.source);\n var tgtId = toString(struct.target);\n var srcExists = srcId != null && cy.hasElementWithId(srcId);\n var tgtExists = tgtId != null && cy.hasElementWithId(tgtId);\n\n if (srcExists || tgtExists) {\n cy.batch(function () {\n // avoid duplicate style updates\n eles.remove(notifyRenderer, modifyPool); // clean up refs etc.\n\n eles.emitAndNotify('moveout');\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _data5 = ele._private.data;\n\n if (ele.isEdge()) {\n if (srcExists) {\n _data5.source = srcId;\n }\n\n if (tgtExists) {\n _data5.target = tgtId;\n }\n }\n }\n\n eles.restore(notifyRenderer, modifyPool); // make new refs, style, etc.\n });\n eles.emitAndNotify('move');\n }\n } else if (struct.parent !== undefined) {\n // move node to new parent\n var parentId = toString(struct.parent);\n var parentExists = parentId === null || cy.hasElementWithId(parentId);\n\n if (parentExists) {\n var pidToAssign = parentId === null ? undefined : parentId;\n cy.batch(function () {\n // avoid duplicate style updates\n var updated = eles.remove(notifyRenderer, modifyPool); // clean up refs etc.\n\n updated.emitAndNotify('moveout');\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _data6 = ele._private.data;\n\n if (ele.isNode()) {\n _data6.parent = pidToAssign;\n }\n }\n\n updated.restore(notifyRenderer, modifyPool); // make new refs, style, etc.\n });\n eles.emitAndNotify('move');\n }\n }\n\n return this;\n};\n\n[elesfn$c, elesfn$d, elesfn$e, elesfn$f, elesfn$g, data$1, elesfn$i, dimensions, elesfn$m, elesfn$n, elesfn$o, elesfn$p, elesfn$q, elesfn$r, elesfn$s, elesfn$t].forEach(function (props) {\n extend(elesfn$u, props);\n});\n\nvar corefn = {\n add: function add(opts) {\n var elements;\n var cy = this; // add the elements\n\n if (elementOrCollection(opts)) {\n var eles = opts;\n\n if (eles._private.cy === cy) {\n // same instance => just restore\n elements = eles.restore();\n } else {\n // otherwise, copy from json\n var jsons = [];\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n jsons.push(ele.json());\n }\n\n elements = new Collection(cy, jsons);\n }\n } // specify an array of options\n else if (array(opts)) {\n var _jsons = opts;\n elements = new Collection(cy, _jsons);\n } // specify via opts.nodes and opts.edges\n else if (plainObject(opts) && (array(opts.nodes) || array(opts.edges))) {\n var elesByGroup = opts;\n var _jsons2 = [];\n var grs = ['nodes', 'edges'];\n\n for (var _i = 0, il = grs.length; _i < il; _i++) {\n var group = grs[_i];\n var elesArray = elesByGroup[group];\n\n if (array(elesArray)) {\n for (var j = 0, jl = elesArray.length; j < jl; j++) {\n var json = extend({\n group: group\n }, elesArray[j]);\n\n _jsons2.push(json);\n }\n }\n }\n\n elements = new Collection(cy, _jsons2);\n } // specify options for one element\n else {\n var _json = opts;\n elements = new Element(cy, _json).collection();\n }\n\n return elements;\n },\n remove: function remove(collection) {\n if (elementOrCollection(collection)) ; else if (string(collection)) {\n var selector = collection;\n collection = this.$(selector);\n }\n\n return collection.remove();\n }\n};\n\n/* global Float32Array */\n\n/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */\nfunction generateCubicBezier(mX1, mY1, mX2, mY2) {\n var NEWTON_ITERATIONS = 4,\n NEWTON_MIN_SLOPE = 0.001,\n SUBDIVISION_PRECISION = 0.0000001,\n SUBDIVISION_MAX_ITERATIONS = 10,\n kSplineTableSize = 11,\n kSampleStepSize = 1.0 / (kSplineTableSize - 1.0),\n float32ArraySupported = typeof Float32Array !== 'undefined';\n /* Must contain four arguments. */\n\n if (arguments.length !== 4) {\n return false;\n }\n /* Arguments must be numbers. */\n\n\n for (var i = 0; i < 4; ++i) {\n if (typeof arguments[i] !== \"number\" || isNaN(arguments[i]) || !isFinite(arguments[i])) {\n return false;\n }\n }\n /* X values must be in the [0, 1] range. */\n\n\n mX1 = Math.min(mX1, 1);\n mX2 = Math.min(mX2, 1);\n mX1 = Math.max(mX1, 0);\n mX2 = Math.max(mX2, 0);\n var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n\n function A(aA1, aA2) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n }\n\n function B(aA1, aA2) {\n return 3.0 * aA2 - 6.0 * aA1;\n }\n\n function C(aA1) {\n return 3.0 * aA1;\n }\n\n function calcBezier(aT, aA1, aA2) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n }\n\n function getSlope(aT, aA1, aA2) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n }\n\n function newtonRaphsonIterate(aX, aGuessT) {\n for (var _i = 0; _i < NEWTON_ITERATIONS; ++_i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n\n return aGuessT;\n }\n\n function calcSampleValues() {\n for (var _i2 = 0; _i2 < kSplineTableSize; ++_i2) {\n mSampleValues[_i2] = calcBezier(_i2 * kSampleStepSize, mX1, mX2);\n }\n }\n\n function binarySubdivide(aX, aA, aB) {\n var currentX,\n currentT,\n i = 0;\n\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n\n return currentT;\n }\n\n function getTForX(aX) {\n var intervalStart = 0.0,\n currentSample = 1,\n lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n\n --currentSample;\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]),\n guessForT = intervalStart + dist * kSampleStepSize,\n initialSlope = getSlope(guessForT, mX1, mX2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize);\n }\n }\n\n var _precomputed = false;\n\n function precompute() {\n _precomputed = true;\n\n if (mX1 !== mY1 || mX2 !== mY2) {\n calcSampleValues();\n }\n }\n\n var f = function f(aX) {\n if (!_precomputed) {\n precompute();\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return aX;\n }\n\n if (aX === 0) {\n return 0;\n }\n\n if (aX === 1) {\n return 1;\n }\n\n return calcBezier(getTForX(aX), mY1, mY2);\n };\n\n f.getControlPoints = function () {\n return [{\n x: mX1,\n y: mY1\n }, {\n x: mX2,\n y: mY2\n }];\n };\n\n var str = \"generateBezier(\" + [mX1, mY1, mX2, mY2] + \")\";\n\n f.toString = function () {\n return str;\n };\n\n return f;\n}\n\n/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */\n\n/* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass\n then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */\nvar generateSpringRK4 = function () {\n function springAccelerationForState(state) {\n return -state.tension * state.x - state.friction * state.v;\n }\n\n function springEvaluateStateWithDerivative(initialState, dt, derivative) {\n var state = {\n x: initialState.x + derivative.dx * dt,\n v: initialState.v + derivative.dv * dt,\n tension: initialState.tension,\n friction: initialState.friction\n };\n return {\n dx: state.v,\n dv: springAccelerationForState(state)\n };\n }\n\n function springIntegrateState(state, dt) {\n var a = {\n dx: state.v,\n dv: springAccelerationForState(state)\n },\n b = springEvaluateStateWithDerivative(state, dt * 0.5, a),\n c = springEvaluateStateWithDerivative(state, dt * 0.5, b),\n d = springEvaluateStateWithDerivative(state, dt, c),\n dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx),\n dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv);\n state.x = state.x + dxdt * dt;\n state.v = state.v + dvdt * dt;\n return state;\n }\n\n return function springRK4Factory(tension, friction, duration) {\n var initState = {\n x: -1,\n v: 0,\n tension: null,\n friction: null\n },\n path = [0],\n time_lapsed = 0,\n tolerance = 1 / 10000,\n DT = 16 / 1000,\n have_duration,\n dt,\n last_state;\n tension = parseFloat(tension) || 500;\n friction = parseFloat(friction) || 20;\n duration = duration || null;\n initState.tension = tension;\n initState.friction = friction;\n have_duration = duration !== null;\n /* Calculate the actual time it takes for this animation to complete with the provided conditions. */\n\n if (have_duration) {\n /* Run the simulation without a duration. */\n time_lapsed = springRK4Factory(tension, friction);\n /* Compute the adjusted time delta. */\n\n dt = time_lapsed / duration * DT;\n } else {\n dt = DT;\n }\n\n for (;;) {\n /* Next/step function .*/\n last_state = springIntegrateState(last_state || initState, dt);\n /* Store the position. */\n\n path.push(1 + last_state.x);\n time_lapsed += 16;\n /* If the change threshold is reached, break. */\n\n if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) {\n break;\n }\n }\n /* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the\n computed path and returns a snapshot of the position according to a given percentComplete. */\n\n\n return !have_duration ? time_lapsed : function (percentComplete) {\n return path[percentComplete * (path.length - 1) | 0];\n };\n };\n}();\n\nvar cubicBezier = function cubicBezier(t1, p1, t2, p2) {\n var bezier = generateCubicBezier(t1, p1, t2, p2);\n return function (start, end, percent) {\n return start + (end - start) * bezier(percent);\n };\n};\n\nvar easings = {\n 'linear': function linear(start, end, percent) {\n return start + (end - start) * percent;\n },\n // default easings\n 'ease': cubicBezier(0.25, 0.1, 0.25, 1),\n 'ease-in': cubicBezier(0.42, 0, 1, 1),\n 'ease-out': cubicBezier(0, 0, 0.58, 1),\n 'ease-in-out': cubicBezier(0.42, 0, 0.58, 1),\n // sine\n 'ease-in-sine': cubicBezier(0.47, 0, 0.745, 0.715),\n 'ease-out-sine': cubicBezier(0.39, 0.575, 0.565, 1),\n 'ease-in-out-sine': cubicBezier(0.445, 0.05, 0.55, 0.95),\n // quad\n 'ease-in-quad': cubicBezier(0.55, 0.085, 0.68, 0.53),\n 'ease-out-quad': cubicBezier(0.25, 0.46, 0.45, 0.94),\n 'ease-in-out-quad': cubicBezier(0.455, 0.03, 0.515, 0.955),\n // cubic\n 'ease-in-cubic': cubicBezier(0.55, 0.055, 0.675, 0.19),\n 'ease-out-cubic': cubicBezier(0.215, 0.61, 0.355, 1),\n 'ease-in-out-cubic': cubicBezier(0.645, 0.045, 0.355, 1),\n // quart\n 'ease-in-quart': cubicBezier(0.895, 0.03, 0.685, 0.22),\n 'ease-out-quart': cubicBezier(0.165, 0.84, 0.44, 1),\n 'ease-in-out-quart': cubicBezier(0.77, 0, 0.175, 1),\n // quint\n 'ease-in-quint': cubicBezier(0.755, 0.05, 0.855, 0.06),\n 'ease-out-quint': cubicBezier(0.23, 1, 0.32, 1),\n 'ease-in-out-quint': cubicBezier(0.86, 0, 0.07, 1),\n // expo\n 'ease-in-expo': cubicBezier(0.95, 0.05, 0.795, 0.035),\n 'ease-out-expo': cubicBezier(0.19, 1, 0.22, 1),\n 'ease-in-out-expo': cubicBezier(1, 0, 0, 1),\n // circ\n 'ease-in-circ': cubicBezier(0.6, 0.04, 0.98, 0.335),\n 'ease-out-circ': cubicBezier(0.075, 0.82, 0.165, 1),\n 'ease-in-out-circ': cubicBezier(0.785, 0.135, 0.15, 0.86),\n // user param easings...\n 'spring': function spring(tension, friction, duration) {\n if (duration === 0) {\n // can't get a spring w/ duration 0\n return easings.linear; // duration 0 => jump to end so impl doesn't matter\n }\n\n var spring = generateSpringRK4(tension, friction, duration);\n return function (start, end, percent) {\n return start + (end - start) * spring(percent);\n };\n },\n 'cubic-bezier': cubicBezier\n};\n\nfunction getEasedValue(type, start, end, percent, easingFn) {\n if (percent === 1) {\n return end;\n }\n\n if (start === end) {\n return end;\n }\n\n var val = easingFn(start, end, percent);\n\n if (type == null) {\n return val;\n }\n\n if (type.roundValue || type.color) {\n val = Math.round(val);\n }\n\n if (type.min !== undefined) {\n val = Math.max(val, type.min);\n }\n\n if (type.max !== undefined) {\n val = Math.min(val, type.max);\n }\n\n return val;\n}\n\nfunction getValue(prop, spec) {\n if (prop.pfValue != null || prop.value != null) {\n if (prop.pfValue != null && (spec == null || spec.type.units !== '%')) {\n return prop.pfValue;\n } else {\n return prop.value;\n }\n } else {\n return prop;\n }\n}\n\nfunction ease(startProp, endProp, percent, easingFn, propSpec) {\n var type = propSpec != null ? propSpec.type : null;\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n\n var start = getValue(startProp, propSpec);\n var end = getValue(endProp, propSpec);\n\n if (number(start) && number(end)) {\n return getEasedValue(type, start, end, percent, easingFn);\n } else if (array(start) && array(end)) {\n var easedArr = [];\n\n for (var i = 0; i < end.length; i++) {\n var si = start[i];\n var ei = end[i];\n\n if (si != null && ei != null) {\n var val = getEasedValue(type, si, ei, percent, easingFn);\n easedArr.push(val);\n } else {\n easedArr.push(ei);\n }\n }\n\n return easedArr;\n }\n\n return undefined;\n}\n\nfunction step(self, ani, now, isCore) {\n var isEles = !isCore;\n var _p = self._private;\n var ani_p = ani._private;\n var pEasing = ani_p.easing;\n var startTime = ani_p.startTime;\n var cy = isCore ? self : self.cy();\n var style = cy.style();\n\n if (!ani_p.easingImpl) {\n if (pEasing == null) {\n // use default\n ani_p.easingImpl = easings['linear'];\n } else {\n // then define w/ name\n var easingVals;\n\n if (string(pEasing)) {\n var easingProp = style.parse('transition-timing-function', pEasing);\n easingVals = easingProp.value;\n } else {\n // then assume preparsed array\n easingVals = pEasing;\n }\n\n var name, args;\n\n if (string(easingVals)) {\n name = easingVals;\n args = [];\n } else {\n name = easingVals[1];\n args = easingVals.slice(2).map(function (n) {\n return +n;\n });\n }\n\n if (args.length > 0) {\n // create with args\n if (name === 'spring') {\n args.push(ani_p.duration); // need duration to generate spring\n }\n\n ani_p.easingImpl = easings[name].apply(null, args);\n } else {\n // static impl by name\n ani_p.easingImpl = easings[name];\n }\n }\n }\n\n var easing = ani_p.easingImpl;\n var percent;\n\n if (ani_p.duration === 0) {\n percent = 1;\n } else {\n percent = (now - startTime) / ani_p.duration;\n }\n\n if (ani_p.applying) {\n percent = ani_p.progress;\n }\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n\n if (ani_p.delay == null) {\n // then update\n var startPos = ani_p.startPosition;\n var endPos = ani_p.position;\n\n if (endPos && isEles && !self.locked()) {\n var newPos = {};\n\n if (valid(startPos.x, endPos.x)) {\n newPos.x = ease(startPos.x, endPos.x, percent, easing);\n }\n\n if (valid(startPos.y, endPos.y)) {\n newPos.y = ease(startPos.y, endPos.y, percent, easing);\n }\n\n self.position(newPos);\n }\n\n var startPan = ani_p.startPan;\n var endPan = ani_p.pan;\n var pan = _p.pan;\n var animatingPan = endPan != null && isCore;\n\n if (animatingPan) {\n if (valid(startPan.x, endPan.x)) {\n pan.x = ease(startPan.x, endPan.x, percent, easing);\n }\n\n if (valid(startPan.y, endPan.y)) {\n pan.y = ease(startPan.y, endPan.y, percent, easing);\n }\n\n self.emit('pan');\n }\n\n var startZoom = ani_p.startZoom;\n var endZoom = ani_p.zoom;\n var animatingZoom = endZoom != null && isCore;\n\n if (animatingZoom) {\n if (valid(startZoom, endZoom)) {\n _p.zoom = bound(_p.minZoom, ease(startZoom, endZoom, percent, easing), _p.maxZoom);\n }\n\n self.emit('zoom');\n }\n\n if (animatingPan || animatingZoom) {\n self.emit('viewport');\n }\n\n var props = ani_p.style;\n\n if (props && props.length > 0 && isEles) {\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var _name = prop.name;\n var end = prop;\n var start = ani_p.startStyle[_name];\n var propSpec = style.properties[start.name];\n var easedVal = ease(start, end, percent, easing, propSpec);\n style.overrideBypass(self, _name, easedVal);\n } // for props\n\n\n self.emit('style');\n } // if\n\n }\n\n ani_p.progress = percent;\n return percent;\n}\n\nfunction valid(start, end) {\n if (start == null || end == null) {\n return false;\n }\n\n if (number(start) && number(end)) {\n return true;\n } else if (start && end) {\n return true;\n }\n\n return false;\n}\n\nfunction startAnimation(self, ani, now, isCore) {\n var ani_p = ani._private;\n ani_p.started = true;\n ani_p.startTime = now - ani_p.progress * ani_p.duration;\n}\n\nfunction stepAll(now, cy) {\n var eles = cy._private.aniEles;\n var doneEles = [];\n\n function stepOne(ele, isCore) {\n var _p = ele._private;\n var current = _p.animation.current;\n var queue = _p.animation.queue;\n var ranAnis = false; // if nothing currently animating, get something from the queue\n\n if (current.length === 0) {\n var next = queue.shift();\n\n if (next) {\n current.push(next);\n }\n }\n\n var callbacks = function callbacks(_callbacks) {\n for (var j = _callbacks.length - 1; j >= 0; j--) {\n var cb = _callbacks[j];\n cb();\n }\n\n _callbacks.splice(0, _callbacks.length);\n }; // step and remove if done\n\n\n for (var i = current.length - 1; i >= 0; i--) {\n var ani = current[i];\n var ani_p = ani._private;\n\n if (ani_p.stopped) {\n current.splice(i, 1);\n ani_p.hooked = false;\n ani_p.playing = false;\n ani_p.started = false;\n callbacks(ani_p.frames);\n continue;\n }\n\n if (!ani_p.playing && !ani_p.applying) {\n continue;\n } // an apply() while playing shouldn't do anything\n\n\n if (ani_p.playing && ani_p.applying) {\n ani_p.applying = false;\n }\n\n if (!ani_p.started) {\n startAnimation(ele, ani, now);\n }\n\n step(ele, ani, now, isCore);\n\n if (ani_p.applying) {\n ani_p.applying = false;\n }\n\n callbacks(ani_p.frames);\n\n if (ani_p.step != null) {\n ani_p.step(now);\n }\n\n if (ani.completed()) {\n current.splice(i, 1);\n ani_p.hooked = false;\n ani_p.playing = false;\n ani_p.started = false;\n callbacks(ani_p.completes);\n }\n\n ranAnis = true;\n }\n\n if (!isCore && current.length === 0 && queue.length === 0) {\n doneEles.push(ele);\n }\n\n return ranAnis;\n } // stepElement\n // handle all eles\n\n\n var ranEleAni = false;\n\n for (var e = 0; e < eles.length; e++) {\n var ele = eles[e];\n var handledThisEle = stepOne(ele);\n ranEleAni = ranEleAni || handledThisEle;\n } // each element\n\n\n var ranCoreAni = stepOne(cy, true); // notify renderer\n\n if (ranEleAni || ranCoreAni) {\n if (eles.length > 0) {\n cy.notify('draw', eles);\n } else {\n cy.notify('draw');\n }\n } // remove elements from list of currently animating if its queues are empty\n\n\n eles.unmerge(doneEles);\n cy.emit('step');\n} // stepAll\n\nvar corefn$1 = {\n // pull in animation functions\n animate: define$3.animate(),\n animation: define$3.animation(),\n animated: define$3.animated(),\n clearQueue: define$3.clearQueue(),\n delay: define$3.delay(),\n delayAnimation: define$3.delayAnimation(),\n stop: define$3.stop(),\n addToAnimationPool: function addToAnimationPool(eles) {\n var cy = this;\n\n if (!cy.styleEnabled()) {\n return;\n } // save cycles when no style used\n\n\n cy._private.aniEles.merge(eles);\n },\n stopAnimationLoop: function stopAnimationLoop() {\n this._private.animationsRunning = false;\n },\n startAnimationLoop: function startAnimationLoop() {\n var cy = this;\n cy._private.animationsRunning = true;\n\n if (!cy.styleEnabled()) {\n return;\n } // save cycles when no style used\n // NB the animation loop will exec in headless environments if style enabled\n // and explicit cy.destroy() is necessary to stop the loop\n\n\n function headlessStep() {\n if (!cy._private.animationsRunning) {\n return;\n }\n\n requestAnimationFrame(function animationStep(now) {\n stepAll(now, cy);\n headlessStep();\n });\n }\n\n var renderer = cy.renderer();\n\n if (renderer && renderer.beforeRender) {\n // let the renderer schedule animations\n renderer.beforeRender(function rendererAnimationStep(willDraw, now) {\n stepAll(now, cy);\n }, renderer.beforeRenderPriorities.animations);\n } else {\n // manage the animation loop ourselves\n headlessStep(); // first call\n }\n }\n};\n\nvar emitterOptions$1 = {\n qualifierCompare: function qualifierCompare(selector1, selector2) {\n if (selector1 == null || selector2 == null) {\n return selector1 == null && selector2 == null;\n } else {\n return selector1.sameText(selector2);\n }\n },\n eventMatches: function eventMatches(cy, listener, eventObj) {\n var selector = listener.qualifier;\n\n if (selector != null) {\n return cy !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target);\n }\n\n return true;\n },\n addEventFields: function addEventFields(cy, evt) {\n evt.cy = cy;\n evt.target = cy;\n },\n callbackContext: function callbackContext(cy, listener, eventObj) {\n return listener.qualifier != null ? eventObj.target : cy;\n }\n};\n\nvar argSelector$1 = function argSelector(arg) {\n if (string(arg)) {\n return new Selector(arg);\n } else {\n return arg;\n }\n};\n\nvar elesfn$v = {\n createEmitter: function createEmitter() {\n var _p = this._private;\n\n if (!_p.emitter) {\n _p.emitter = new Emitter(emitterOptions$1, this);\n }\n\n return this;\n },\n emitter: function emitter() {\n return this._private.emitter;\n },\n on: function on(events, selector, callback) {\n this.emitter().on(events, argSelector$1(selector), callback);\n return this;\n },\n removeListener: function removeListener(events, selector, callback) {\n this.emitter().removeListener(events, argSelector$1(selector), callback);\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n this.emitter().removeAllListeners();\n return this;\n },\n one: function one(events, selector, callback) {\n this.emitter().one(events, argSelector$1(selector), callback);\n return this;\n },\n once: function once(events, selector, callback) {\n this.emitter().one(events, argSelector$1(selector), callback);\n return this;\n },\n emit: function emit(events, extraParams) {\n this.emitter().emit(events, extraParams);\n return this;\n },\n emitAndNotify: function emitAndNotify(event, eles) {\n this.emit(event);\n this.notify(event, eles);\n return this;\n }\n};\ndefine$3.eventAliasesOn(elesfn$v);\n\nvar corefn$2 = {\n png: function png(options) {\n var renderer = this._private.renderer;\n options = options || {};\n return renderer.png(options);\n },\n jpg: function jpg(options) {\n var renderer = this._private.renderer;\n options = options || {};\n options.bg = options.bg || '#fff';\n return renderer.jpg(options);\n }\n};\ncorefn$2.jpeg = corefn$2.jpg;\n\nvar corefn$3 = {\n layout: function layout(options) {\n var cy = this;\n\n if (options == null) {\n error('Layout options must be specified to make a layout');\n return;\n }\n\n if (options.name == null) {\n error('A `name` must be specified to make a layout');\n return;\n }\n\n var name = options.name;\n var Layout = cy.extension('layout', name);\n\n if (Layout == null) {\n error('No such layout `' + name + '` found. Did you forget to import it and `cytoscape.use()` it?');\n return;\n }\n\n var eles;\n\n if (string(options.eles)) {\n eles = cy.$(options.eles);\n } else {\n eles = options.eles != null ? options.eles : cy.$();\n }\n\n var layout = new Layout(extend({}, options, {\n cy: cy,\n eles: eles\n }));\n return layout;\n }\n};\ncorefn$3.createLayout = corefn$3.makeLayout = corefn$3.layout;\n\nvar corefn$4 = {\n notify: function notify(eventName, eventEles) {\n var _p = this._private;\n\n if (this.batching()) {\n _p.batchNotifications = _p.batchNotifications || {};\n var eles = _p.batchNotifications[eventName] = _p.batchNotifications[eventName] || this.collection();\n\n if (eventEles != null) {\n eles.merge(eventEles);\n }\n\n return; // notifications are disabled during batching\n }\n\n if (!_p.notificationsEnabled) {\n return;\n } // exit on disabled\n\n\n var renderer = this.renderer(); // exit if destroy() called on core or renderer in between frames #1499 #1528\n\n if (this.destroyed() || !renderer) {\n return;\n }\n\n renderer.notify(eventName, eventEles);\n },\n notifications: function notifications(bool) {\n var p = this._private;\n\n if (bool === undefined) {\n return p.notificationsEnabled;\n } else {\n p.notificationsEnabled = bool ? true : false;\n }\n\n return this;\n },\n noNotifications: function noNotifications(callback) {\n this.notifications(false);\n callback();\n this.notifications(true);\n },\n batching: function batching() {\n return this._private.batchCount > 0;\n },\n startBatch: function startBatch() {\n var _p = this._private;\n\n if (_p.batchCount == null) {\n _p.batchCount = 0;\n }\n\n if (_p.batchCount === 0) {\n _p.batchStyleEles = this.collection();\n _p.batchNotifications = {};\n }\n\n _p.batchCount++;\n return this;\n },\n endBatch: function endBatch() {\n var _p = this._private;\n\n if (_p.batchCount === 0) {\n return this;\n }\n\n _p.batchCount--;\n\n if (_p.batchCount === 0) {\n // update style for dirty eles\n _p.batchStyleEles.updateStyle();\n\n var renderer = this.renderer(); // notify the renderer of queued eles and event types\n\n Object.keys(_p.batchNotifications).forEach(function (eventName) {\n var eles = _p.batchNotifications[eventName];\n\n if (eles.empty()) {\n renderer.notify(eventName);\n } else {\n renderer.notify(eventName, eles);\n }\n });\n }\n\n return this;\n },\n batch: function batch(callback) {\n this.startBatch();\n callback();\n this.endBatch();\n return this;\n },\n // for backwards compatibility\n batchData: function batchData(map) {\n var cy = this;\n return this.batch(function () {\n var ids = Object.keys(map);\n\n for (var i = 0; i < ids.length; i++) {\n var id = ids[i];\n var data = map[id];\n var ele = cy.getElementById(id);\n ele.data(data);\n }\n });\n }\n};\n\nvar rendererDefaults = defaults({\n hideEdgesOnViewport: false,\n textureOnViewport: false,\n motionBlur: false,\n motionBlurOpacity: 0.05,\n pixelRatio: undefined,\n desktopTapThreshold: 4,\n touchTapThreshold: 8,\n wheelSensitivity: 1,\n debug: false,\n showFps: false\n});\nvar corefn$5 = {\n renderTo: function renderTo(context, zoom, pan, pxRatio) {\n var r = this._private.renderer;\n r.renderTo(context, zoom, pan, pxRatio);\n return this;\n },\n renderer: function renderer() {\n return this._private.renderer;\n },\n forceRender: function forceRender() {\n this.notify('draw');\n return this;\n },\n resize: function resize() {\n this.invalidateSize();\n this.emitAndNotify('resize');\n return this;\n },\n initRenderer: function initRenderer(options) {\n var cy = this;\n var RendererProto = cy.extension('renderer', options.name);\n\n if (RendererProto == null) {\n error(\"Can not initialise: No such renderer `\".concat(options.name, \"` found. Did you forget to import it and `cytoscape.use()` it?\"));\n return;\n }\n\n if (options.wheelSensitivity !== undefined) {\n warn(\"You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine.\");\n }\n\n var rOpts = rendererDefaults(options);\n rOpts.cy = cy;\n cy._private.renderer = new RendererProto(rOpts);\n this.notify('init');\n },\n destroyRenderer: function destroyRenderer() {\n var cy = this;\n cy.notify('destroy'); // destroy the renderer\n\n var domEle = cy.container();\n\n if (domEle) {\n domEle._cyreg = null;\n\n while (domEle.childNodes.length > 0) {\n domEle.removeChild(domEle.childNodes[0]);\n }\n }\n\n cy._private.renderer = null; // to be extra safe, remove the ref\n\n cy.mutableElements().forEach(function (ele) {\n var _p = ele._private;\n _p.rscratch = {};\n _p.rstyle = {};\n _p.animation.current = [];\n _p.animation.queue = [];\n });\n },\n onRender: function onRender(fn) {\n return this.on('render', fn);\n },\n offRender: function offRender(fn) {\n return this.off('render', fn);\n }\n};\ncorefn$5.invalidateDimensions = corefn$5.resize;\n\nvar corefn$6 = {\n // get a collection\n // - empty collection on no args\n // - collection of elements in the graph on selector arg\n // - guarantee a returned collection when elements or collection specified\n collection: function collection(eles, opts) {\n if (string(eles)) {\n return this.$(eles);\n } else if (elementOrCollection(eles)) {\n return eles.collection();\n } else if (array(eles)) {\n return new Collection(this, eles, opts);\n }\n\n return new Collection(this);\n },\n nodes: function nodes(selector) {\n var nodes = this.$(function (ele) {\n return ele.isNode();\n });\n\n if (selector) {\n return nodes.filter(selector);\n }\n\n return nodes;\n },\n edges: function edges(selector) {\n var edges = this.$(function (ele) {\n return ele.isEdge();\n });\n\n if (selector) {\n return edges.filter(selector);\n }\n\n return edges;\n },\n // search the graph like jQuery\n $: function $(selector) {\n var eles = this._private.elements;\n\n if (selector) {\n return eles.filter(selector);\n } else {\n return eles.spawnSelf();\n }\n },\n mutableElements: function mutableElements() {\n return this._private.elements;\n }\n}; // aliases\n\ncorefn$6.elements = corefn$6.filter = corefn$6.$;\n\nvar styfn = {}; // keys for style blocks, e.g. ttfftt\n\nvar TRUE = 't';\nvar FALSE = 'f'; // (potentially expensive calculation)\n// apply the style to the element based on\n// - its bypass\n// - what selectors match it\n\nstyfn.apply = function (eles) {\n var self = this;\n var _p = self._private;\n var cy = _p.cy;\n var updatedEles = cy.collection();\n\n for (var ie = 0; ie < eles.length; ie++) {\n var ele = eles[ie];\n var cxtMeta = self.getContextMeta(ele);\n\n if (cxtMeta.empty) {\n continue;\n }\n\n var cxtStyle = self.getContextStyle(cxtMeta);\n var app = self.applyContextStyle(cxtMeta, cxtStyle, ele);\n\n if (ele._private.appliedInitStyle) {\n self.updateTransitions(ele, app.diffProps);\n } else {\n ele._private.appliedInitStyle = true;\n }\n\n var hintsDiff = self.updateStyleHints(ele);\n\n if (hintsDiff) {\n updatedEles.push(ele);\n }\n } // for elements\n\n\n return updatedEles;\n};\n\nstyfn.getPropertiesDiff = function (oldCxtKey, newCxtKey) {\n var self = this;\n var cache = self._private.propDiffs = self._private.propDiffs || {};\n var dualCxtKey = oldCxtKey + '-' + newCxtKey;\n var cachedVal = cache[dualCxtKey];\n\n if (cachedVal) {\n return cachedVal;\n }\n\n var diffProps = [];\n var addedProp = {};\n\n for (var i = 0; i < self.length; i++) {\n var cxt = self[i];\n var oldHasCxt = oldCxtKey[i] === TRUE;\n var newHasCxt = newCxtKey[i] === TRUE;\n var cxtHasDiffed = oldHasCxt !== newHasCxt;\n var cxtHasMappedProps = cxt.mappedProperties.length > 0;\n\n if (cxtHasDiffed || newHasCxt && cxtHasMappedProps) {\n var props = void 0;\n\n if (cxtHasDiffed && cxtHasMappedProps) {\n props = cxt.properties; // suffices b/c mappedProperties is a subset of properties\n } else if (cxtHasDiffed) {\n props = cxt.properties; // need to check them all\n } else if (cxtHasMappedProps) {\n props = cxt.mappedProperties; // only need to check mapped\n }\n\n for (var j = 0; j < props.length; j++) {\n var prop = props[j];\n var name = prop.name; // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter\n // (semi expensive check since it makes this function O(n^2) on context length, but worth it since overall result\n // is cached)\n\n var laterCxtOverrides = false;\n\n for (var k = i + 1; k < self.length; k++) {\n var laterCxt = self[k];\n var hasLaterCxt = newCxtKey[k] === TRUE;\n\n if (!hasLaterCxt) {\n continue;\n } // can't override unless the context is active\n\n\n laterCxtOverrides = laterCxt.properties[prop.name] != null;\n\n if (laterCxtOverrides) {\n break;\n } // exit early as long as one later context overrides\n\n }\n\n if (!addedProp[name] && !laterCxtOverrides) {\n addedProp[name] = true;\n diffProps.push(name);\n }\n } // for props\n\n } // if\n\n } // for contexts\n\n\n cache[dualCxtKey] = diffProps;\n return diffProps;\n};\n\nstyfn.getContextMeta = function (ele) {\n var self = this;\n var cxtKey = '';\n var diffProps;\n var prevKey = ele._private.styleCxtKey || ''; // get the cxt key\n\n for (var i = 0; i < self.length; i++) {\n var context = self[i];\n var contextSelectorMatches = context.selector && context.selector.matches(ele); // NB: context.selector may be null for 'core'\n\n if (contextSelectorMatches) {\n cxtKey += TRUE;\n } else {\n cxtKey += FALSE;\n }\n } // for context\n\n\n diffProps = self.getPropertiesDiff(prevKey, cxtKey);\n ele._private.styleCxtKey = cxtKey;\n return {\n key: cxtKey,\n diffPropNames: diffProps,\n empty: diffProps.length === 0\n };\n}; // gets a computed ele style object based on matched contexts\n\n\nstyfn.getContextStyle = function (cxtMeta) {\n var cxtKey = cxtMeta.key;\n var self = this;\n var cxtStyles = this._private.contextStyles = this._private.contextStyles || {}; // if already computed style, returned cached copy\n\n if (cxtStyles[cxtKey]) {\n return cxtStyles[cxtKey];\n }\n\n var style = {\n _private: {\n key: cxtKey\n }\n };\n\n for (var i = 0; i < self.length; i++) {\n var cxt = self[i];\n var hasCxt = cxtKey[i] === TRUE;\n\n if (!hasCxt) {\n continue;\n }\n\n for (var j = 0; j < cxt.properties.length; j++) {\n var prop = cxt.properties[j];\n style[prop.name] = prop;\n }\n }\n\n cxtStyles[cxtKey] = style;\n return style;\n};\n\nstyfn.applyContextStyle = function (cxtMeta, cxtStyle, ele) {\n var self = this;\n var diffProps = cxtMeta.diffPropNames;\n var retDiffProps = {};\n var types = self.types;\n\n for (var i = 0; i < diffProps.length; i++) {\n var diffPropName = diffProps[i];\n var cxtProp = cxtStyle[diffPropName];\n var eleProp = ele.pstyle(diffPropName);\n\n if (!cxtProp) {\n // no context prop means delete\n if (!eleProp) {\n continue; // no existing prop means nothing needs to be removed\n // nb affects initial application on mapped values like control-point-distances\n } else if (eleProp.bypass) {\n cxtProp = {\n name: diffPropName,\n deleteBypassed: true\n };\n } else {\n cxtProp = {\n name: diffPropName,\n \"delete\": true\n };\n }\n } // save cycles when the context prop doesn't need to be applied\n\n\n if (eleProp === cxtProp) {\n continue;\n } // save cycles when a mapped context prop doesn't need to be applied\n\n\n if (cxtProp.mapped === types.fn // context prop is function mapper\n && eleProp != null // some props can be null even by default (e.g. a prop that overrides another one)\n && eleProp.mapping != null // ele prop is a concrete value from from a mapper\n && eleProp.mapping.value === cxtProp.value // the current prop on the ele is a flat prop value for the function mapper\n ) {\n // NB don't write to cxtProp, as it's shared among eles (stored in stylesheet)\n var mapping = eleProp.mapping; // can write to mapping, as it's a per-ele copy\n\n var fnValue = mapping.fnValue = cxtProp.value(ele); // temporarily cache the value in case of a miss\n\n if (fnValue === mapping.prevFnValue) {\n continue;\n }\n }\n\n var retDiffProp = retDiffProps[diffPropName] = {\n prev: eleProp\n };\n self.applyParsedProperty(ele, cxtProp);\n retDiffProp.next = ele.pstyle(diffPropName);\n\n if (retDiffProp.next && retDiffProp.next.bypass) {\n retDiffProp.next = retDiffProp.next.bypassed;\n }\n }\n\n return {\n diffProps: retDiffProps\n };\n};\n\nstyfn.updateStyleHints = function (ele) {\n var _p = ele._private;\n var self = this;\n var propNames = self.propertyGroupNames;\n var propGrKeys = self.propertyGroupKeys;\n\n var propHash = function propHash(ele, propNames, seedKey) {\n return self.getPropertiesHash(ele, propNames, seedKey);\n };\n\n var oldStyleKey = _p.styleKey;\n\n if (ele.removed()) {\n return false;\n }\n\n var isNode = _p.group === 'nodes'; // get the style key hashes per prop group\n // but lazily -- only use non-default prop values to reduce the number of hashes\n //\n\n var overriddenStyles = ele._private.style;\n propNames = Object.keys(overriddenStyles);\n\n for (var i = 0; i < propGrKeys.length; i++) {\n var grKey = propGrKeys[i];\n _p.styleKeys[grKey] = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT];\n }\n\n var updateGrKey1 = function updateGrKey1(val, grKey) {\n return _p.styleKeys[grKey][0] = hashInt(val, _p.styleKeys[grKey][0]);\n };\n\n var updateGrKey2 = function updateGrKey2(val, grKey) {\n return _p.styleKeys[grKey][1] = hashIntAlt(val, _p.styleKeys[grKey][1]);\n };\n\n var updateGrKey = function updateGrKey(val, grKey) {\n updateGrKey1(val, grKey);\n updateGrKey2(val, grKey);\n };\n\n var updateGrKeyWStr = function updateGrKeyWStr(strVal, grKey) {\n for (var j = 0; j < strVal.length; j++) {\n var ch = strVal.charCodeAt(j);\n updateGrKey1(ch, grKey);\n updateGrKey2(ch, grKey);\n }\n }; // - hashing works on 32 bit ints b/c we use bitwise ops\n // - small numbers get cut off (e.g. 0.123 is seen as 0 by the hashing function)\n // - raise up small numbers so more significant digits are seen by hashing\n // - make small numbers larger than a normal value to avoid collisions\n // - works in practice and it's relatively cheap\n\n\n var N = 2000000000;\n\n var cleanNum = function cleanNum(val) {\n return -128 < val && val < 128 && Math.floor(val) !== val ? N - (val * 1024 | 0) : val;\n };\n\n for (var _i = 0; _i < propNames.length; _i++) {\n var name = propNames[_i];\n var parsedProp = overriddenStyles[name];\n\n if (parsedProp == null) {\n continue;\n }\n\n var propInfo = this.properties[name];\n var type = propInfo.type;\n var _grKey = propInfo.groupKey;\n var normalizedNumberVal = void 0;\n\n if (propInfo.hashOverride != null) {\n normalizedNumberVal = propInfo.hashOverride(ele, parsedProp);\n } else if (parsedProp.pfValue != null) {\n normalizedNumberVal = parsedProp.pfValue;\n } // might not be a number if it allows enums\n\n\n var numberVal = propInfo.enums == null ? parsedProp.value : null;\n var haveNormNum = normalizedNumberVal != null;\n var haveUnitedNum = numberVal != null;\n var haveNum = haveNormNum || haveUnitedNum;\n var units = parsedProp.units; // numbers are cheaper to hash than strings\n // 1 hash op vs n hash ops (for length n string)\n\n if (type.number && haveNum && !type.multiple) {\n var v = haveNormNum ? normalizedNumberVal : numberVal;\n updateGrKey(cleanNum(v), _grKey);\n\n if (!haveNormNum && units != null) {\n updateGrKeyWStr(units, _grKey);\n }\n } else {\n updateGrKeyWStr(parsedProp.strValue, _grKey);\n }\n } // overall style key\n //\n\n\n var hash = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT];\n\n for (var _i2 = 0; _i2 < propGrKeys.length; _i2++) {\n var _grKey2 = propGrKeys[_i2];\n var grHash = _p.styleKeys[_grKey2];\n hash[0] = hashInt(grHash[0], hash[0]);\n hash[1] = hashIntAlt(grHash[1], hash[1]);\n }\n\n _p.styleKey = combineHashes(hash[0], hash[1]); // label dims\n //\n\n var sk = _p.styleKeys;\n _p.labelDimsKey = combineHashesArray(sk.labelDimensions);\n var labelKeys = propHash(ele, ['label'], sk.labelDimensions);\n _p.labelKey = combineHashesArray(labelKeys);\n _p.labelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, labelKeys));\n\n if (!isNode) {\n var sourceLabelKeys = propHash(ele, ['source-label'], sk.labelDimensions);\n _p.sourceLabelKey = combineHashesArray(sourceLabelKeys);\n _p.sourceLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, sourceLabelKeys));\n var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions);\n _p.targetLabelKey = combineHashesArray(targetLabelKeys);\n _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys));\n } // node\n //\n\n\n if (isNode) {\n var _p$styleKeys = _p.styleKeys,\n nodeBody = _p$styleKeys.nodeBody,\n nodeBorder = _p$styleKeys.nodeBorder,\n backgroundImage = _p$styleKeys.backgroundImage,\n compound = _p$styleKeys.compound,\n pie = _p$styleKeys.pie;\n var nodeKeys = [nodeBody, nodeBorder, backgroundImage, compound, pie].filter(function (k) {\n return k != null;\n }).reduce(hashArrays, [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]);\n _p.nodeKey = combineHashesArray(nodeKeys);\n _p.hasPie = pie != null && pie[0] !== DEFAULT_HASH_SEED && pie[1] !== DEFAULT_HASH_SEED_ALT;\n }\n\n return oldStyleKey !== _p.styleKey;\n};\n\nstyfn.clearStyleHints = function (ele) {\n var _p = ele._private;\n _p.styleCxtKey = '';\n _p.styleKeys = {};\n _p.styleKey = null;\n _p.labelKey = null;\n _p.labelStyleKey = null;\n _p.sourceLabelKey = null;\n _p.sourceLabelStyleKey = null;\n _p.targetLabelKey = null;\n _p.targetLabelStyleKey = null;\n _p.nodeKey = null;\n _p.hasPie = null;\n}; // apply a property to the style (for internal use)\n// returns whether application was successful\n//\n// now, this function flattens the property, and here's how:\n//\n// for parsedProp:{ bypass: true, deleteBypass: true }\n// no property is generated, instead the bypass property in the\n// element's style is replaced by what's pointed to by the `bypassed`\n// field in the bypass property (i.e. restoring the property the\n// bypass was overriding)\n//\n// for parsedProp:{ mapped: truthy }\n// the generated flattenedProp:{ mapping: prop }\n//\n// for parsedProp:{ bypass: true }\n// the generated flattenedProp:{ bypassed: parsedProp }\n\n\nstyfn.applyParsedProperty = function (ele, parsedProp) {\n var self = this;\n var prop = parsedProp;\n var style = ele._private.style;\n var flatProp;\n var types = self.types;\n var type = self.properties[prop.name].type;\n var propIsBypass = prop.bypass;\n var origProp = style[prop.name];\n var origPropIsBypass = origProp && origProp.bypass;\n var _p = ele._private;\n var flatPropMapping = 'mapping';\n\n var getVal = function getVal(p) {\n if (p == null) {\n return null;\n } else if (p.pfValue != null) {\n return p.pfValue;\n } else {\n return p.value;\n }\n };\n\n var checkTriggers = function checkTriggers() {\n var fromVal = getVal(origProp);\n var toVal = getVal(prop);\n self.checkTriggers(ele, prop.name, fromVal, toVal);\n }; // edge sanity checks to prevent the client from making serious mistakes\n\n\n if (parsedProp.name === 'curve-style' && ele.isEdge() && ( // loops must be bundled beziers\n parsedProp.value !== 'bezier' && ele.isLoop() || // edges connected to compound nodes can not be haystacks\n parsedProp.value === 'haystack' && (ele.source().isParent() || ele.target().isParent()))) {\n prop = parsedProp = this.parse(parsedProp.name, 'bezier', propIsBypass);\n }\n\n if (prop[\"delete\"]) {\n // delete the property and use the default value on falsey value\n style[prop.name] = undefined;\n checkTriggers();\n return true;\n }\n\n if (prop.deleteBypassed) {\n // delete the property that the\n if (!origProp) {\n checkTriggers();\n return true; // can't delete if no prop\n } else if (origProp.bypass) {\n // delete bypassed\n origProp.bypassed = undefined;\n checkTriggers();\n return true;\n } else {\n return false; // we're unsuccessful deleting the bypassed\n }\n } // check if we need to delete the current bypass\n\n\n if (prop.deleteBypass) {\n // then this property is just here to indicate we need to delete\n if (!origProp) {\n checkTriggers();\n return true; // property is already not defined\n } else if (origProp.bypass) {\n // then replace the bypass property with the original\n // because the bypassed property was already applied (and therefore parsed), we can just replace it (no reapplying necessary)\n style[prop.name] = origProp.bypassed;\n checkTriggers();\n return true;\n } else {\n return false; // we're unsuccessful deleting the bypass\n }\n }\n\n var printMappingErr = function printMappingErr() {\n warn('Do not assign mappings to elements without corresponding data (i.e. ele `' + ele.id() + '` has no mapping for property `' + prop.name + '` with data field `' + prop.field + '`); try a `[' + prop.field + ']` selector to limit scope to elements with `' + prop.field + '` defined');\n }; // put the property in the style objects\n\n\n switch (prop.mapped) {\n // flatten the property if mapped\n case types.mapData:\n {\n // flatten the field (e.g. data.foo.bar)\n var fields = prop.field.split('.');\n var fieldVal = _p.data;\n\n for (var i = 0; i < fields.length && fieldVal; i++) {\n var field = fields[i];\n fieldVal = fieldVal[field];\n }\n\n if (fieldVal == null) {\n printMappingErr();\n return false;\n }\n\n var percent;\n\n if (!number(fieldVal)) {\n // then don't apply and fall back on the existing style\n warn('Do not use continuous mappers without specifying numeric data (i.e. `' + prop.field + ': ' + fieldVal + '` for `' + ele.id() + '` is non-numeric)');\n return false;\n } else {\n var fieldWidth = prop.fieldMax - prop.fieldMin;\n\n if (fieldWidth === 0) {\n // safety check -- not strictly necessary as no props of zero range should be passed here\n percent = 0;\n } else {\n percent = (fieldVal - prop.fieldMin) / fieldWidth;\n }\n } // make sure to bound percent value\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 1) {\n percent = 1;\n }\n\n if (type.color) {\n var r1 = prop.valueMin[0];\n var r2 = prop.valueMax[0];\n var g1 = prop.valueMin[1];\n var g2 = prop.valueMax[1];\n var b1 = prop.valueMin[2];\n var b2 = prop.valueMax[2];\n var a1 = prop.valueMin[3] == null ? 1 : prop.valueMin[3];\n var a2 = prop.valueMax[3] == null ? 1 : prop.valueMax[3];\n var clr = [Math.round(r1 + (r2 - r1) * percent), Math.round(g1 + (g2 - g1) * percent), Math.round(b1 + (b2 - b1) * percent), Math.round(a1 + (a2 - a1) * percent)];\n flatProp = {\n // colours are simple, so just create the flat property instead of expensive string parsing\n bypass: prop.bypass,\n // we're a bypass if the mapping property is a bypass\n name: prop.name,\n value: clr,\n strValue: 'rgb(' + clr[0] + ', ' + clr[1] + ', ' + clr[2] + ')'\n };\n } else if (type.number) {\n var calcValue = prop.valueMin + (prop.valueMax - prop.valueMin) * percent;\n flatProp = this.parse(prop.name, calcValue, prop.bypass, flatPropMapping);\n } else {\n return false; // can only map to colours and numbers\n }\n\n if (!flatProp) {\n // if we can't flatten the property, then don't apply the property and fall back on the existing style\n printMappingErr();\n return false;\n }\n\n flatProp.mapping = prop; // keep a reference to the mapping\n\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n // direct mapping\n\n case types.data:\n {\n // flatten the field (e.g. data.foo.bar)\n var _fields = prop.field.split('.');\n\n var _fieldVal = _p.data;\n\n for (var _i3 = 0; _i3 < _fields.length && _fieldVal; _i3++) {\n var _field = _fields[_i3];\n _fieldVal = _fieldVal[_field];\n }\n\n if (_fieldVal != null) {\n flatProp = this.parse(prop.name, _fieldVal, prop.bypass, flatPropMapping);\n }\n\n if (!flatProp) {\n // if we can't flatten the property, then don't apply and fall back on the existing style\n printMappingErr();\n return false;\n }\n\n flatProp.mapping = prop; // keep a reference to the mapping\n\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n\n case types.fn:\n {\n var fn = prop.value;\n var fnRetVal = prop.fnValue != null ? prop.fnValue : fn(ele); // check for cached value before calling function\n\n prop.prevFnValue = fnRetVal;\n\n if (fnRetVal == null) {\n warn('Custom function mappers may not return null (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is null)');\n return false;\n }\n\n flatProp = this.parse(prop.name, fnRetVal, prop.bypass, flatPropMapping);\n\n if (!flatProp) {\n warn('Custom function mappers may not return invalid values for the property type (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is invalid)');\n return false;\n }\n\n flatProp.mapping = copy(prop); // keep a reference to the mapping\n\n prop = flatProp; // the flattened (mapped) property is the one we want\n\n break;\n }\n\n case undefined:\n break;\n // just set the property\n\n default:\n return false;\n // not a valid mapping\n } // if the property is a bypass property, then link the resultant property to the original one\n\n\n if (propIsBypass) {\n if (origPropIsBypass) {\n // then this bypass overrides the existing one\n prop.bypassed = origProp.bypassed; // steal bypassed prop from old bypass\n } else {\n // then link the orig prop to the new bypass\n prop.bypassed = origProp;\n }\n\n style[prop.name] = prop; // and set\n } else {\n // prop is not bypass\n if (origPropIsBypass) {\n // then keep the orig prop (since it's a bypass) and link to the new prop\n origProp.bypassed = prop;\n } else {\n // then just replace the old prop with the new one\n style[prop.name] = prop;\n }\n }\n\n checkTriggers();\n return true;\n};\n\nstyfn.cleanElements = function (eles, keepBypasses) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n this.clearStyleHints(ele);\n ele.dirtyCompoundBoundsCache();\n ele.dirtyBoundingBoxCache();\n\n if (!keepBypasses) {\n ele._private.style = {};\n } else {\n var style = ele._private.style;\n var propNames = Object.keys(style);\n\n for (var j = 0; j < propNames.length; j++) {\n var propName = propNames[j];\n var eleProp = style[propName];\n\n if (eleProp != null) {\n if (eleProp.bypass) {\n eleProp.bypassed = null;\n } else {\n style[propName] = null;\n }\n }\n }\n }\n }\n}; // updates the visual style for all elements (useful for manual style modification after init)\n\n\nstyfn.update = function () {\n var cy = this._private.cy;\n var eles = cy.mutableElements();\n eles.updateStyle();\n}; // diffProps : { name => { prev, next } }\n\n\nstyfn.updateTransitions = function (ele, diffProps) {\n var self = this;\n var _p = ele._private;\n var props = ele.pstyle('transition-property').value;\n var duration = ele.pstyle('transition-duration').pfValue;\n var delay = ele.pstyle('transition-delay').pfValue;\n\n if (props.length > 0 && duration > 0) {\n var style = {}; // build up the style to animate towards\n\n var anyPrev = false;\n\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var styProp = ele.pstyle(prop);\n var diffProp = diffProps[prop];\n\n if (!diffProp) {\n continue;\n }\n\n var prevProp = diffProp.prev;\n var fromProp = prevProp;\n var toProp = diffProp.next != null ? diffProp.next : styProp;\n var diff = false;\n var initVal = void 0;\n var initDt = 0.000001; // delta time % value for initVal (allows animating out of init zero opacity)\n\n if (!fromProp) {\n continue;\n } // consider px values\n\n\n if (number(fromProp.pfValue) && number(toProp.pfValue)) {\n diff = toProp.pfValue - fromProp.pfValue; // nonzero is truthy\n\n initVal = fromProp.pfValue + initDt * diff; // consider numerical values\n } else if (number(fromProp.value) && number(toProp.value)) {\n diff = toProp.value - fromProp.value; // nonzero is truthy\n\n initVal = fromProp.value + initDt * diff; // consider colour values\n } else if (array(fromProp.value) && array(toProp.value)) {\n diff = fromProp.value[0] !== toProp.value[0] || fromProp.value[1] !== toProp.value[1] || fromProp.value[2] !== toProp.value[2];\n initVal = fromProp.strValue;\n } // the previous value is good for an animation only if it's different\n\n\n if (diff) {\n style[prop] = toProp.strValue; // to val\n\n this.applyBypass(ele, prop, initVal); // from val\n\n anyPrev = true;\n }\n } // end if props allow ani\n // can't transition if there's nothing previous to transition from\n\n\n if (!anyPrev) {\n return;\n }\n\n _p.transitioning = true;\n new Promise$1(function (resolve) {\n if (delay > 0) {\n ele.delayAnimation(delay).play().promise().then(resolve);\n } else {\n resolve();\n }\n }).then(function () {\n return ele.animation({\n style: style,\n duration: duration,\n easing: ele.pstyle('transition-timing-function').value,\n queue: false\n }).play().promise();\n }).then(function () {\n // if( !isBypass ){\n self.removeBypasses(ele, props);\n ele.emitAndNotify('style'); // }\n\n _p.transitioning = false;\n });\n } else if (_p.transitioning) {\n this.removeBypasses(ele, props);\n ele.emitAndNotify('style');\n _p.transitioning = false;\n }\n};\n\nstyfn.checkTrigger = function (ele, name, fromValue, toValue, getTrigger, onTrigger) {\n var prop = this.properties[name];\n var triggerCheck = getTrigger(prop);\n\n if (triggerCheck != null && triggerCheck(fromValue, toValue)) {\n onTrigger(prop);\n }\n};\n\nstyfn.checkZOrderTrigger = function (ele, name, fromValue, toValue) {\n var _this = this;\n\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersZOrder;\n }, function () {\n _this._private.cy.notify('zorder', ele);\n });\n};\n\nstyfn.checkBoundsTrigger = function (ele, name, fromValue, toValue) {\n this.checkTrigger(ele, name, fromValue, toValue, function (prop) {\n return prop.triggersBounds;\n }, function (prop) {\n ele.dirtyCompoundBoundsCache();\n ele.dirtyBoundingBoxCache(); // if the prop change makes the bb of pll bezier edges invalid,\n // then dirty the pll edge bb cache as well\n\n if ( // only for beziers -- so performance of other edges isn't affected\n name === 'curve-style' && (fromValue === 'bezier' || toValue === 'bezier') && prop.triggersBoundsOfParallelBeziers) {\n ele.parallelEdges().forEach(function (pllEdge) {\n if (pllEdge.isBundledBezier()) {\n pllEdge.dirtyBoundingBoxCache();\n }\n });\n }\n });\n};\n\nstyfn.checkTriggers = function (ele, name, fromValue, toValue) {\n ele.dirtyStyleCache();\n this.checkZOrderTrigger(ele, name, fromValue, toValue);\n this.checkBoundsTrigger(ele, name, fromValue, toValue);\n};\n\nvar styfn$1 = {}; // bypasses are applied to an existing style on an element, and just tacked on temporarily\n// returns true iff application was successful for at least 1 specified property\n\nstyfn$1.applyBypass = function (eles, name, value, updateTransitions) {\n var self = this;\n var props = [];\n var isBypass = true; // put all the properties (can specify one or many) in an array after parsing them\n\n if (name === '*' || name === '**') {\n // apply to all property names\n if (value !== undefined) {\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var _name = prop.name;\n var parsedProp = this.parse(_name, value, true);\n\n if (parsedProp) {\n props.push(parsedProp);\n }\n }\n }\n } else if (string(name)) {\n // then parse the single property\n var _parsedProp = this.parse(name, value, true);\n\n if (_parsedProp) {\n props.push(_parsedProp);\n }\n } else if (plainObject(name)) {\n // then parse each property\n var specifiedProps = name;\n updateTransitions = value;\n var names = Object.keys(specifiedProps);\n\n for (var _i = 0; _i < names.length; _i++) {\n var _name2 = names[_i];\n var _value = specifiedProps[_name2];\n\n if (_value === undefined) {\n // try camel case name too\n _value = specifiedProps[dash2camel(_name2)];\n }\n\n if (_value !== undefined) {\n var _parsedProp2 = this.parse(_name2, _value, true);\n\n if (_parsedProp2) {\n props.push(_parsedProp2);\n }\n }\n }\n } else {\n // can't do anything without well defined properties\n return false;\n } // we've failed if there are no valid properties\n\n\n if (props.length === 0) {\n return false;\n } // now, apply the bypass properties on the elements\n\n\n var ret = false; // return true if at least one succesful bypass applied\n\n for (var _i2 = 0; _i2 < eles.length; _i2++) {\n // for each ele\n var ele = eles[_i2];\n var diffProps = {};\n var diffProp = void 0;\n\n for (var j = 0; j < props.length; j++) {\n // for each prop\n var _prop = props[j];\n\n if (updateTransitions) {\n var prevProp = ele.pstyle(_prop.name);\n diffProp = diffProps[_prop.name] = {\n prev: prevProp\n };\n }\n\n ret = this.applyParsedProperty(ele, copy(_prop)) || ret;\n\n if (updateTransitions) {\n diffProp.next = ele.pstyle(_prop.name);\n }\n } // for props\n\n\n if (ret) {\n this.updateStyleHints(ele);\n }\n\n if (updateTransitions) {\n this.updateTransitions(ele, diffProps, isBypass);\n }\n } // for eles\n\n\n return ret;\n}; // only useful in specific cases like animation\n\n\nstyfn$1.overrideBypass = function (eles, name, value) {\n name = camel2dash(name);\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var prop = ele._private.style[name];\n var type = this.properties[name].type;\n var isColor = type.color;\n var isMulti = type.mutiple;\n var oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value;\n\n if (!prop || !prop.bypass) {\n // need a bypass if one doesn't exist\n this.applyBypass(ele, name, value);\n } else {\n prop.value = value;\n\n if (prop.pfValue != null) {\n prop.pfValue = value;\n }\n\n if (isColor) {\n prop.strValue = 'rgb(' + value.join(',') + ')';\n } else if (isMulti) {\n prop.strValue = value.join(' ');\n } else {\n prop.strValue = '' + value;\n }\n\n this.updateStyleHints(ele);\n }\n\n this.checkTriggers(ele, name, oldValue, value);\n }\n};\n\nstyfn$1.removeAllBypasses = function (eles, updateTransitions) {\n return this.removeBypasses(eles, this.propertyNames, updateTransitions);\n};\n\nstyfn$1.removeBypasses = function (eles, props, updateTransitions) {\n var isBypass = true;\n\n for (var j = 0; j < eles.length; j++) {\n var ele = eles[j];\n var diffProps = {};\n\n for (var i = 0; i < props.length; i++) {\n var name = props[i];\n var prop = this.properties[name];\n var prevProp = ele.pstyle(prop.name);\n\n if (!prevProp || !prevProp.bypass) {\n // if a bypass doesn't exist for the prop, nothing needs to be removed\n continue;\n }\n\n var value = ''; // empty => remove bypass\n\n var parsedProp = this.parse(name, value, true);\n var diffProp = diffProps[prop.name] = {\n prev: prevProp\n };\n this.applyParsedProperty(ele, parsedProp);\n diffProp.next = ele.pstyle(prop.name);\n } // for props\n\n\n this.updateStyleHints(ele);\n\n if (updateTransitions) {\n this.updateTransitions(ele, diffProps, isBypass);\n }\n } // for eles\n\n};\n\nvar styfn$2 = {}; // gets what an em size corresponds to in pixels relative to a dom element\n\nstyfn$2.getEmSizeInPixels = function () {\n var px = this.containerCss('font-size');\n\n if (px != null) {\n return parseFloat(px);\n } else {\n return 1; // for headless\n }\n}; // gets css property from the core container\n\n\nstyfn$2.containerCss = function (propName) {\n var cy = this._private.cy;\n var domElement = cy.container();\n\n if (window$1 && domElement && window$1.getComputedStyle) {\n return window$1.getComputedStyle(domElement).getPropertyValue(propName);\n }\n};\n\nvar styfn$3 = {}; // gets the rendered style for an element\n\nstyfn$3.getRenderedStyle = function (ele, prop) {\n if (prop) {\n return this.getStylePropertyValue(ele, prop, true);\n } else {\n return this.getRawStyle(ele, true);\n }\n}; // gets the raw style for an element\n\n\nstyfn$3.getRawStyle = function (ele, isRenderedVal) {\n var self = this;\n ele = ele[0]; // insure it's an element\n\n if (ele) {\n var rstyle = {};\n\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var val = self.getStylePropertyValue(ele, prop.name, isRenderedVal);\n\n if (val != null) {\n rstyle[prop.name] = val;\n rstyle[dash2camel(prop.name)] = val;\n }\n }\n\n return rstyle;\n }\n};\n\nstyfn$3.getIndexedStyle = function (ele, property, subproperty, index) {\n var pstyle = ele.pstyle(property)[subproperty][index];\n return pstyle != null ? pstyle : ele.cy().style().getDefaultProperty(property)[subproperty][0];\n};\n\nstyfn$3.getStylePropertyValue = function (ele, propName, isRenderedVal) {\n var self = this;\n ele = ele[0]; // insure it's an element\n\n if (ele) {\n var prop = self.properties[propName];\n\n if (prop.alias) {\n prop = prop.pointsTo;\n }\n\n var type = prop.type;\n var styleProp = ele.pstyle(prop.name);\n\n if (styleProp) {\n var value = styleProp.value,\n units = styleProp.units,\n strValue = styleProp.strValue;\n\n if (isRenderedVal && type.number && value != null && number(value)) {\n var zoom = ele.cy().zoom();\n\n var getRenderedValue = function getRenderedValue(val) {\n return val * zoom;\n };\n\n var getValueStringWithUnits = function getValueStringWithUnits(val, units) {\n return getRenderedValue(val) + units;\n };\n\n var isArrayValue = array(value);\n var haveUnits = isArrayValue ? units.every(function (u) {\n return u != null;\n }) : units != null;\n\n if (haveUnits) {\n if (isArrayValue) {\n return value.map(function (v, i) {\n return getValueStringWithUnits(v, units[i]);\n }).join(' ');\n } else {\n return getValueStringWithUnits(value, units);\n }\n } else {\n if (isArrayValue) {\n return value.map(function (v) {\n return string(v) ? v : '' + getRenderedValue(v);\n }).join(' ');\n } else {\n return '' + getRenderedValue(value);\n }\n }\n } else if (strValue != null) {\n return strValue;\n }\n }\n\n return null;\n }\n};\n\nstyfn$3.getAnimationStartStyle = function (ele, aniProps) {\n var rstyle = {};\n\n for (var i = 0; i < aniProps.length; i++) {\n var aniProp = aniProps[i];\n var name = aniProp.name;\n var styleProp = ele.pstyle(name);\n\n if (styleProp !== undefined) {\n // then make a prop of it\n if (plainObject(styleProp)) {\n styleProp = this.parse(name, styleProp.strValue);\n } else {\n styleProp = this.parse(name, styleProp);\n }\n }\n\n if (styleProp) {\n rstyle[name] = styleProp;\n }\n }\n\n return rstyle;\n};\n\nstyfn$3.getPropsList = function (propsObj) {\n var self = this;\n var rstyle = [];\n var style = propsObj;\n var props = self.properties;\n\n if (style) {\n var names = Object.keys(style);\n\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n var val = style[name];\n var prop = props[name] || props[camel2dash(name)];\n var styleProp = this.parse(prop.name, val);\n\n if (styleProp) {\n rstyle.push(styleProp);\n }\n }\n }\n\n return rstyle;\n};\n\nstyfn$3.getNonDefaultPropertiesHash = function (ele, propNames, seed) {\n var hash = seed.slice();\n var name, val, strVal, chVal;\n var i, j;\n\n for (i = 0; i < propNames.length; i++) {\n name = propNames[i];\n val = ele.pstyle(name, false);\n\n if (val == null) {\n continue;\n } else if (val.pfValue != null) {\n hash[0] = hashInt(chVal, hash[0]);\n hash[1] = hashIntAlt(chVal, hash[1]);\n } else {\n strVal = val.strValue;\n\n for (j = 0; j < strVal.length; j++) {\n chVal = strVal.charCodeAt(j);\n hash[0] = hashInt(chVal, hash[0]);\n hash[1] = hashIntAlt(chVal, hash[1]);\n }\n }\n }\n\n return hash;\n};\n\nstyfn$3.getPropertiesHash = styfn$3.getNonDefaultPropertiesHash;\n\nvar styfn$4 = {};\n\nstyfn$4.appendFromJson = function (json) {\n var style = this;\n\n for (var i = 0; i < json.length; i++) {\n var context = json[i];\n var selector = context.selector;\n var props = context.style || context.css;\n var names = Object.keys(props);\n style.selector(selector); // apply selector\n\n for (var j = 0; j < names.length; j++) {\n var name = names[j];\n var value = props[name];\n style.css(name, value); // apply property\n }\n }\n\n return style;\n}; // accessible cy.style() function\n\n\nstyfn$4.fromJson = function (json) {\n var style = this;\n style.resetToDefault();\n style.appendFromJson(json);\n return style;\n}; // get json from cy.style() api\n\n\nstyfn$4.json = function () {\n var json = [];\n\n for (var i = this.defaultLength; i < this.length; i++) {\n var cxt = this[i];\n var selector = cxt.selector;\n var props = cxt.properties;\n var css = {};\n\n for (var j = 0; j < props.length; j++) {\n var prop = props[j];\n css[prop.name] = prop.strValue;\n }\n\n json.push({\n selector: !selector ? 'core' : selector.toString(),\n style: css\n });\n }\n\n return json;\n};\n\nvar styfn$5 = {};\n\nstyfn$5.appendFromString = function (string) {\n var self = this;\n var style = this;\n var remaining = '' + string;\n var selAndBlockStr;\n var blockRem;\n var propAndValStr; // remove comments from the style string\n\n remaining = remaining.replace(/[/][*](\\s|.)+?[*][/]/g, '');\n\n function removeSelAndBlockFromRemaining() {\n // remove the parsed selector and block from the remaining text to parse\n if (remaining.length > selAndBlockStr.length) {\n remaining = remaining.substr(selAndBlockStr.length);\n } else {\n remaining = '';\n }\n }\n\n function removePropAndValFromRem() {\n // remove the parsed property and value from the remaining block text to parse\n if (blockRem.length > propAndValStr.length) {\n blockRem = blockRem.substr(propAndValStr.length);\n } else {\n blockRem = '';\n }\n }\n\n for (;;) {\n var nothingLeftToParse = remaining.match(/^\\s*$/);\n\n if (nothingLeftToParse) {\n break;\n }\n\n var selAndBlock = remaining.match(/^\\s*((?:.|\\s)+?)\\s*\\{((?:.|\\s)+?)\\}/);\n\n if (!selAndBlock) {\n warn('Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: ' + remaining);\n break;\n }\n\n selAndBlockStr = selAndBlock[0]; // parse the selector\n\n var selectorStr = selAndBlock[1];\n\n if (selectorStr !== 'core') {\n var selector = new Selector(selectorStr);\n\n if (selector.invalid) {\n warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr); // skip this selector and block\n\n removeSelAndBlockFromRemaining();\n continue;\n }\n } // parse the block of properties and values\n\n\n var blockStr = selAndBlock[2];\n var invalidBlock = false;\n blockRem = blockStr;\n var props = [];\n\n for (;;) {\n var _nothingLeftToParse = blockRem.match(/^\\s*$/);\n\n if (_nothingLeftToParse) {\n break;\n }\n\n var propAndVal = blockRem.match(/^\\s*(.+?)\\s*:\\s*(.+?)\\s*;/);\n\n if (!propAndVal) {\n warn('Skipping parsing of block: Invalid formatting of style property and value definitions found in:' + blockStr);\n invalidBlock = true;\n break;\n }\n\n propAndValStr = propAndVal[0];\n var propStr = propAndVal[1];\n var valStr = propAndVal[2];\n var prop = self.properties[propStr];\n\n if (!prop) {\n warn('Skipping property: Invalid property name in: ' + propAndValStr); // skip this property in the block\n\n removePropAndValFromRem();\n continue;\n }\n\n var parsedProp = style.parse(propStr, valStr);\n\n if (!parsedProp) {\n warn('Skipping property: Invalid property definition in: ' + propAndValStr); // skip this property in the block\n\n removePropAndValFromRem();\n continue;\n }\n\n props.push({\n name: propStr,\n val: valStr\n });\n removePropAndValFromRem();\n }\n\n if (invalidBlock) {\n removeSelAndBlockFromRemaining();\n break;\n } // put the parsed block in the style\n\n\n style.selector(selectorStr);\n\n for (var i = 0; i < props.length; i++) {\n var _prop = props[i];\n style.css(_prop.name, _prop.val);\n }\n\n removeSelAndBlockFromRemaining();\n }\n\n return style;\n};\n\nstyfn$5.fromString = function (string) {\n var style = this;\n style.resetToDefault();\n style.appendFromString(string);\n return style;\n};\n\nvar styfn$6 = {};\n\n(function () {\n var number = number$1;\n var rgba = rgbaNoBackRefs;\n var hsla = hslaNoBackRefs;\n var hex3$1 = hex3;\n var hex6$1 = hex6;\n\n var data = function data(prefix) {\n return '^' + prefix + '\\\\s*\\\\(\\\\s*([\\\\w\\\\.]+)\\\\s*\\\\)$';\n };\n\n var mapData = function mapData(prefix) {\n var mapArg = number + '|\\\\w+|' + rgba + '|' + hsla + '|' + hex3$1 + '|' + hex6$1;\n return '^' + prefix + '\\\\s*\\\\(([\\\\w\\\\.]+)\\\\s*\\\\,\\\\s*(' + number + ')\\\\s*\\\\,\\\\s*(' + number + ')\\\\s*,\\\\s*(' + mapArg + ')\\\\s*\\\\,\\\\s*(' + mapArg + ')\\\\)$';\n };\n\n var urlRegexes = ['^url\\\\s*\\\\(\\\\s*[\\'\"]?(.+?)[\\'\"]?\\\\s*\\\\)$', '^(none)$', '^(.+)$']; // each visual style property has a type and needs to be validated according to it\n\n styfn$6.types = {\n time: {\n number: true,\n min: 0,\n units: 's|ms',\n implicitUnits: 'ms'\n },\n percent: {\n number: true,\n min: 0,\n max: 100,\n units: '%',\n implicitUnits: '%'\n },\n percentages: {\n number: true,\n min: 0,\n max: 100,\n units: '%',\n implicitUnits: '%',\n multiple: true\n },\n zeroOneNumber: {\n number: true,\n min: 0,\n max: 1,\n unitless: true\n },\n zeroOneNumbers: {\n number: true,\n min: 0,\n max: 1,\n unitless: true,\n multiple: true\n },\n nOneOneNumber: {\n number: true,\n min: -1,\n max: 1,\n unitless: true\n },\n nonNegativeInt: {\n number: true,\n min: 0,\n integer: true,\n unitless: true\n },\n position: {\n enums: ['parent', 'origin']\n },\n nodeSize: {\n number: true,\n min: 0,\n enums: ['label']\n },\n number: {\n number: true,\n unitless: true\n },\n numbers: {\n number: true,\n unitless: true,\n multiple: true\n },\n positiveNumber: {\n number: true,\n unitless: true,\n min: 0,\n strictMin: true\n },\n size: {\n number: true,\n min: 0\n },\n bidirectionalSize: {\n number: true\n },\n // allows negative\n bidirectionalSizeMaybePercent: {\n number: true,\n allowPercent: true\n },\n // allows negative\n bidirectionalSizes: {\n number: true,\n multiple: true\n },\n // allows negative\n sizeMaybePercent: {\n number: true,\n min: 0,\n allowPercent: true\n },\n axisDirection: {\n enums: ['horizontal', 'leftward', 'rightward', 'vertical', 'upward', 'downward', 'auto']\n },\n paddingRelativeTo: {\n enums: ['width', 'height', 'average', 'min', 'max']\n },\n bgWH: {\n number: true,\n min: 0,\n allowPercent: true,\n enums: ['auto'],\n multiple: true\n },\n bgPos: {\n number: true,\n allowPercent: true,\n multiple: true\n },\n bgRelativeTo: {\n enums: ['inner', 'include-padding'],\n multiple: true\n },\n bgRepeat: {\n enums: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'],\n multiple: true\n },\n bgFit: {\n enums: ['none', 'contain', 'cover'],\n multiple: true\n },\n bgCrossOrigin: {\n enums: ['anonymous', 'use-credentials'],\n multiple: true\n },\n bgClip: {\n enums: ['none', 'node'],\n multiple: true\n },\n color: {\n color: true\n },\n colors: {\n color: true,\n multiple: true\n },\n fill: {\n enums: ['solid', 'linear-gradient', 'radial-gradient']\n },\n bool: {\n enums: ['yes', 'no']\n },\n lineStyle: {\n enums: ['solid', 'dotted', 'dashed']\n },\n lineCap: {\n enums: ['butt', 'round', 'square']\n },\n borderStyle: {\n enums: ['solid', 'dotted', 'dashed', 'double']\n },\n curveStyle: {\n enums: ['bezier', 'unbundled-bezier', 'haystack', 'segments', 'straight', 'taxi']\n },\n fontFamily: {\n regex: '^([\\\\w- \\\\\"]+(?:\\\\s*,\\\\s*[\\\\w- \\\\\"]+)*)$'\n },\n fontStyle: {\n enums: ['italic', 'normal', 'oblique']\n },\n fontWeight: {\n enums: ['normal', 'bold', 'bolder', 'lighter', '100', '200', '300', '400', '500', '600', '800', '900', 100, 200, 300, 400, 500, 600, 700, 800, 900]\n },\n textDecoration: {\n enums: ['none', 'underline', 'overline', 'line-through']\n },\n textTransform: {\n enums: ['none', 'uppercase', 'lowercase']\n },\n textWrap: {\n enums: ['none', 'wrap', 'ellipsis']\n },\n textOverflowWrap: {\n enums: ['whitespace', 'anywhere']\n },\n textBackgroundShape: {\n enums: ['rectangle', 'roundrectangle', 'round-rectangle']\n },\n nodeShape: {\n enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'cutrectangle', 'cut-rectangle', 'bottomroundrectangle', 'bottom-round-rectangle', 'barrel', 'ellipse', 'triangle', 'round-triangle', 'square', 'pentagon', 'round-pentagon', 'hexagon', 'round-hexagon', 'concavehexagon', 'concave-hexagon', 'heptagon', 'round-heptagon', 'octagon', 'round-octagon', 'tag', 'round-tag', 'star', 'diamond', 'round-diamond', 'vee', 'rhomboid', 'polygon']\n },\n compoundIncludeLabels: {\n enums: ['include', 'exclude']\n },\n arrowShape: {\n enums: ['tee', 'triangle', 'triangle-tee', 'circle-triangle', 'triangle-cross', 'triangle-backcurve', 'vee', 'square', 'circle', 'diamond', 'chevron', 'none']\n },\n arrowFill: {\n enums: ['filled', 'hollow']\n },\n display: {\n enums: ['element', 'none']\n },\n visibility: {\n enums: ['hidden', 'visible']\n },\n zCompoundDepth: {\n enums: ['bottom', 'orphan', 'auto', 'top']\n },\n zIndexCompare: {\n enums: ['auto', 'manual']\n },\n valign: {\n enums: ['top', 'center', 'bottom']\n },\n halign: {\n enums: ['left', 'center', 'right']\n },\n justification: {\n enums: ['left', 'center', 'right', 'auto']\n },\n text: {\n string: true\n },\n data: {\n mapping: true,\n regex: data('data')\n },\n layoutData: {\n mapping: true,\n regex: data('layoutData')\n },\n scratch: {\n mapping: true,\n regex: data('scratch')\n },\n mapData: {\n mapping: true,\n regex: mapData('mapData')\n },\n mapLayoutData: {\n mapping: true,\n regex: mapData('mapLayoutData')\n },\n mapScratch: {\n mapping: true,\n regex: mapData('mapScratch')\n },\n fn: {\n mapping: true,\n fn: true\n },\n url: {\n regexes: urlRegexes,\n singleRegexMatchValue: true\n },\n urls: {\n regexes: urlRegexes,\n singleRegexMatchValue: true,\n multiple: true\n },\n propList: {\n propList: true\n },\n angle: {\n number: true,\n units: 'deg|rad',\n implicitUnits: 'rad'\n },\n textRotation: {\n number: true,\n units: 'deg|rad',\n implicitUnits: 'rad',\n enums: ['none', 'autorotate']\n },\n polygonPointList: {\n number: true,\n multiple: true,\n evenMultiple: true,\n min: -1,\n max: 1,\n unitless: true\n },\n edgeDistances: {\n enums: ['intersection', 'node-position']\n },\n edgeEndpoint: {\n number: true,\n multiple: true,\n units: '%|px|em|deg|rad',\n implicitUnits: 'px',\n enums: ['inside-to-node', 'outside-to-node', 'outside-to-node-or-label', 'outside-to-line', 'outside-to-line-or-label'],\n singleEnum: true,\n validate: function validate(valArr, unitsArr) {\n switch (valArr.length) {\n case 2:\n // can be % or px only\n return unitsArr[0] !== 'deg' && unitsArr[0] !== 'rad' && unitsArr[1] !== 'deg' && unitsArr[1] !== 'rad';\n\n case 1:\n // can be enum, deg, or rad only\n return string(valArr[0]) || unitsArr[0] === 'deg' || unitsArr[0] === 'rad';\n\n default:\n return false;\n }\n }\n },\n easing: {\n regexes: ['^(spring)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*,\\\\s*(' + number + ')\\\\s*\\\\)$', '^(cubic-bezier)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*,\\\\s*(' + number + ')\\\\s*,\\\\s*(' + number + ')\\\\s*,\\\\s*(' + number + ')\\\\s*\\\\)$'],\n enums: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine', 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad', 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic', 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart', 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint', 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo', 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ']\n },\n gradientDirection: {\n enums: ['to-bottom', 'to-top', 'to-left', 'to-right', 'to-bottom-right', 'to-bottom-left', 'to-top-right', 'to-top-left', 'to-right-bottom', 'to-left-bottom', 'to-right-top', 'to-left-top']\n },\n boundsExpansion: {\n number: true,\n multiple: true,\n min: 0,\n validate: function validate(valArr) {\n var length = valArr.length;\n return length === 1 || length === 2 || length === 4;\n }\n }\n };\n var diff = {\n zeroNonZero: function zeroNonZero(val1, val2) {\n if ((val1 == null || val2 == null) && val1 !== val2) {\n return true; // null cases could represent any value\n }\n\n if (val1 == 0 && val2 != 0) {\n return true;\n } else if (val1 != 0 && val2 == 0) {\n return true;\n } else {\n return false;\n }\n },\n any: function any(val1, val2) {\n return val1 != val2;\n },\n emptyNonEmpty: function emptyNonEmpty(str1, str2) {\n var empty1 = emptyString(str1);\n var empty2 = emptyString(str2);\n return empty1 && !empty2 || !empty1 && empty2;\n }\n }; // define visual style properties\n //\n // - n.b. adding a new group of props may require updates to updateStyleHints()\n // - adding new props to an existing group gets handled automatically\n\n var t = styfn$6.types;\n var mainLabel = [{\n name: 'label',\n type: t.text,\n triggersBounds: diff.any,\n triggersZOrder: diff.emptyNonEmpty\n }, {\n name: 'text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }];\n var sourceLabel = [{\n name: 'source-label',\n type: t.text,\n triggersBounds: diff.any\n }, {\n name: 'source-text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'source-text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'source-text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'source-text-offset',\n type: t.size,\n triggersBounds: diff.any\n }];\n var targetLabel = [{\n name: 'target-label',\n type: t.text,\n triggersBounds: diff.any\n }, {\n name: 'target-text-rotation',\n type: t.textRotation,\n triggersBounds: diff.any\n }, {\n name: 'target-text-margin-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'target-text-margin-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'target-text-offset',\n type: t.size,\n triggersBounds: diff.any\n }];\n var labelDimensions = [{\n name: 'font-family',\n type: t.fontFamily,\n triggersBounds: diff.any\n }, {\n name: 'font-style',\n type: t.fontStyle,\n triggersBounds: diff.any\n }, {\n name: 'font-weight',\n type: t.fontWeight,\n triggersBounds: diff.any\n }, {\n name: 'font-size',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-transform',\n type: t.textTransform,\n triggersBounds: diff.any\n }, {\n name: 'text-wrap',\n type: t.textWrap,\n triggersBounds: diff.any\n }, {\n name: 'text-overflow-wrap',\n type: t.textOverflowWrap,\n triggersBounds: diff.any\n }, {\n name: 'text-max-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-outline-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'line-height',\n type: t.positiveNumber,\n triggersBounds: diff.any\n }];\n var commonLabel = [{\n name: 'text-valign',\n type: t.valign,\n triggersBounds: diff.any\n }, {\n name: 'text-halign',\n type: t.halign,\n triggersBounds: diff.any\n }, {\n name: 'color',\n type: t.color\n }, {\n name: 'text-outline-color',\n type: t.color\n }, {\n name: 'text-outline-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-background-color',\n type: t.color\n }, {\n name: 'text-background-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-background-padding',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-border-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'text-border-color',\n type: t.color\n }, {\n name: 'text-border-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'text-border-style',\n type: t.borderStyle,\n triggersBounds: diff.any\n }, {\n name: 'text-background-shape',\n type: t.textBackgroundShape,\n triggersBounds: diff.any\n }, {\n name: 'text-justification',\n type: t.justification\n }];\n var behavior = [{\n name: 'events',\n type: t.bool\n }, {\n name: 'text-events',\n type: t.bool\n }];\n var visibility = [{\n name: 'display',\n type: t.display,\n triggersZOrder: diff.any,\n triggersBounds: diff.any,\n triggersBoundsOfParallelBeziers: true\n }, {\n name: 'visibility',\n type: t.visibility,\n triggersZOrder: diff.any\n }, {\n name: 'opacity',\n type: t.zeroOneNumber,\n triggersZOrder: diff.zeroNonZero\n }, {\n name: 'text-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'min-zoomed-font-size',\n type: t.size\n }, {\n name: 'z-compound-depth',\n type: t.zCompoundDepth,\n triggersZOrder: diff.any\n }, {\n name: 'z-index-compare',\n type: t.zIndexCompare,\n triggersZOrder: diff.any\n }, {\n name: 'z-index',\n type: t.nonNegativeInt,\n triggersZOrder: diff.any\n }];\n var overlay = [{\n name: 'overlay-padding',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'overlay-color',\n type: t.color\n }, {\n name: 'overlay-opacity',\n type: t.zeroOneNumber,\n triggersBounds: diff.zeroNonZero\n }];\n var transition = [{\n name: 'transition-property',\n type: t.propList\n }, {\n name: 'transition-duration',\n type: t.time\n }, {\n name: 'transition-delay',\n type: t.time\n }, {\n name: 'transition-timing-function',\n type: t.easing\n }];\n\n var nodeSizeHashOverride = function nodeSizeHashOverride(ele, parsedProp) {\n if (parsedProp.value === 'label') {\n return -ele.poolIndex(); // no hash key hits is using label size (hitrate for perf probably low anyway)\n } else {\n return parsedProp.pfValue;\n }\n };\n\n var nodeBody = [{\n name: 'height',\n type: t.nodeSize,\n triggersBounds: diff.any,\n hashOverride: nodeSizeHashOverride\n }, {\n name: 'width',\n type: t.nodeSize,\n triggersBounds: diff.any,\n hashOverride: nodeSizeHashOverride\n }, {\n name: 'shape',\n type: t.nodeShape,\n triggersBounds: diff.any\n }, {\n name: 'shape-polygon-points',\n type: t.polygonPointList,\n triggersBounds: diff.any\n }, {\n name: 'background-color',\n type: t.color\n }, {\n name: 'background-fill',\n type: t.fill\n }, {\n name: 'background-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'background-blacken',\n type: t.nOneOneNumber\n }, {\n name: 'background-gradient-stop-colors',\n type: t.colors\n }, {\n name: 'background-gradient-stop-positions',\n type: t.percentages\n }, {\n name: 'background-gradient-direction',\n type: t.gradientDirection\n }, {\n name: 'padding',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'padding-relative-to',\n type: t.paddingRelativeTo,\n triggersBounds: diff.any\n }, {\n name: 'bounds-expansion',\n type: t.boundsExpansion,\n triggersBounds: diff.any\n }];\n var nodeBorder = [{\n name: 'border-color',\n type: t.color\n }, {\n name: 'border-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'border-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'border-style',\n type: t.borderStyle\n }];\n var backgroundImage = [{\n name: 'background-image',\n type: t.urls\n }, {\n name: 'background-image-crossorigin',\n type: t.bgCrossOrigin\n }, {\n name: 'background-image-opacity',\n type: t.zeroOneNumbers\n }, {\n name: 'background-position-x',\n type: t.bgPos\n }, {\n name: 'background-position-y',\n type: t.bgPos\n }, {\n name: 'background-width-relative-to',\n type: t.bgRelativeTo\n }, {\n name: 'background-height-relative-to',\n type: t.bgRelativeTo\n }, {\n name: 'background-repeat',\n type: t.bgRepeat\n }, {\n name: 'background-fit',\n type: t.bgFit\n }, {\n name: 'background-clip',\n type: t.bgClip\n }, {\n name: 'background-width',\n type: t.bgWH\n }, {\n name: 'background-height',\n type: t.bgWH\n }, {\n name: 'background-offset-x',\n type: t.bgPos\n }, {\n name: 'background-offset-y',\n type: t.bgPos\n }];\n var compound = [{\n name: 'position',\n type: t.position,\n triggersBounds: diff.any\n }, {\n name: 'compound-sizing-wrt-labels',\n type: t.compoundIncludeLabels,\n triggersBounds: diff.any\n }, {\n name: 'min-width',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'min-width-bias-left',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-width-bias-right',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-height',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'min-height-bias-top',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'min-height-bias-bottom',\n type: t.sizeMaybePercent,\n triggersBounds: diff.any\n }];\n var edgeLine = [{\n name: 'line-style',\n type: t.lineStyle\n }, {\n name: 'line-color',\n type: t.color\n }, {\n name: 'line-fill',\n type: t.fill\n }, {\n name: 'line-cap',\n type: t.lineCap\n }, {\n name: 'line-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'line-dash-pattern',\n type: t.numbers\n }, {\n name: 'line-dash-offset',\n type: t.number\n }, {\n name: 'line-gradient-stop-colors',\n type: t.colors\n }, {\n name: 'line-gradient-stop-positions',\n type: t.percentages\n }, {\n name: 'curve-style',\n type: t.curveStyle,\n triggersBounds: diff.any,\n triggersBoundsOfParallelBeziers: true\n }, {\n name: 'haystack-radius',\n type: t.zeroOneNumber,\n triggersBounds: diff.any\n }, {\n name: 'source-endpoint',\n type: t.edgeEndpoint,\n triggersBounds: diff.any\n }, {\n name: 'target-endpoint',\n type: t.edgeEndpoint,\n triggersBounds: diff.any\n }, {\n name: 'control-point-step-size',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'control-point-distances',\n type: t.bidirectionalSizes,\n triggersBounds: diff.any\n }, {\n name: 'control-point-weights',\n type: t.numbers,\n triggersBounds: diff.any\n }, {\n name: 'segment-distances',\n type: t.bidirectionalSizes,\n triggersBounds: diff.any\n }, {\n name: 'segment-weights',\n type: t.numbers,\n triggersBounds: diff.any\n }, {\n name: 'taxi-turn',\n type: t.bidirectionalSizeMaybePercent,\n triggersBounds: diff.any\n }, {\n name: 'taxi-turn-min-distance',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'taxi-direction',\n type: t.axisDirection,\n triggersBounds: diff.any\n }, {\n name: 'edge-distances',\n type: t.edgeDistances,\n triggersBounds: diff.any\n }, {\n name: 'arrow-scale',\n type: t.positiveNumber,\n triggersBounds: diff.any\n }, {\n name: 'loop-direction',\n type: t.angle,\n triggersBounds: diff.any\n }, {\n name: 'loop-sweep',\n type: t.angle,\n triggersBounds: diff.any\n }, {\n name: 'source-distance-from-node',\n type: t.size,\n triggersBounds: diff.any\n }, {\n name: 'target-distance-from-node',\n type: t.size,\n triggersBounds: diff.any\n }];\n var ghost = [{\n name: 'ghost',\n type: t.bool,\n triggersBounds: diff.any\n }, {\n name: 'ghost-offset-x',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'ghost-offset-y',\n type: t.bidirectionalSize,\n triggersBounds: diff.any\n }, {\n name: 'ghost-opacity',\n type: t.zeroOneNumber\n }];\n var core = [{\n name: 'selection-box-color',\n type: t.color\n }, {\n name: 'selection-box-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'selection-box-border-color',\n type: t.color\n }, {\n name: 'selection-box-border-width',\n type: t.size\n }, {\n name: 'active-bg-color',\n type: t.color\n }, {\n name: 'active-bg-opacity',\n type: t.zeroOneNumber\n }, {\n name: 'active-bg-size',\n type: t.size\n }, {\n name: 'outside-texture-bg-color',\n type: t.color\n }, {\n name: 'outside-texture-bg-opacity',\n type: t.zeroOneNumber\n }]; // pie backgrounds for nodes\n\n var pie = [];\n styfn$6.pieBackgroundN = 16; // because the pie properties are numbered, give access to a constant N (for renderer use)\n\n pie.push({\n name: 'pie-size',\n type: t.sizeMaybePercent\n });\n\n for (var i = 1; i <= styfn$6.pieBackgroundN; i++) {\n pie.push({\n name: 'pie-' + i + '-background-color',\n type: t.color\n });\n pie.push({\n name: 'pie-' + i + '-background-size',\n type: t.percent\n });\n pie.push({\n name: 'pie-' + i + '-background-opacity',\n type: t.zeroOneNumber\n });\n } // edge arrows\n\n\n var edgeArrow = [];\n var arrowPrefixes = styfn$6.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target'];\n [{\n name: 'arrow-shape',\n type: t.arrowShape,\n triggersBounds: diff.any\n }, {\n name: 'arrow-color',\n type: t.color\n }, {\n name: 'arrow-fill',\n type: t.arrowFill\n }].forEach(function (prop) {\n arrowPrefixes.forEach(function (prefix) {\n var name = prefix + '-' + prop.name;\n var type = prop.type,\n triggersBounds = prop.triggersBounds;\n edgeArrow.push({\n name: name,\n type: type,\n triggersBounds: triggersBounds\n });\n });\n }, {});\n var props = styfn$6.properties = [].concat(behavior, transition, visibility, overlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, backgroundImage, pie, compound, edgeLine, edgeArrow, core);\n var propGroups = styfn$6.propertyGroups = {\n // common to all eles\n behavior: behavior,\n transition: transition,\n visibility: visibility,\n overlay: overlay,\n ghost: ghost,\n // labels\n commonLabel: commonLabel,\n labelDimensions: labelDimensions,\n mainLabel: mainLabel,\n sourceLabel: sourceLabel,\n targetLabel: targetLabel,\n // node props\n nodeBody: nodeBody,\n nodeBorder: nodeBorder,\n backgroundImage: backgroundImage,\n pie: pie,\n compound: compound,\n // edge props\n edgeLine: edgeLine,\n edgeArrow: edgeArrow,\n core: core\n };\n var propGroupNames = styfn$6.propertyGroupNames = {};\n var propGroupKeys = styfn$6.propertyGroupKeys = Object.keys(propGroups);\n propGroupKeys.forEach(function (key) {\n propGroupNames[key] = propGroups[key].map(function (prop) {\n return prop.name;\n });\n propGroups[key].forEach(function (prop) {\n return prop.groupKey = key;\n });\n }); // define aliases\n\n var aliases = styfn$6.aliases = [{\n name: 'content',\n pointsTo: 'label'\n }, {\n name: 'control-point-distance',\n pointsTo: 'control-point-distances'\n }, {\n name: 'control-point-weight',\n pointsTo: 'control-point-weights'\n }, {\n name: 'edge-text-rotation',\n pointsTo: 'text-rotation'\n }, {\n name: 'padding-left',\n pointsTo: 'padding'\n }, {\n name: 'padding-right',\n pointsTo: 'padding'\n }, {\n name: 'padding-top',\n pointsTo: 'padding'\n }, {\n name: 'padding-bottom',\n pointsTo: 'padding'\n }]; // list of property names\n\n styfn$6.propertyNames = props.map(function (p) {\n return p.name;\n }); // allow access of properties by name ( e.g. style.properties.height )\n\n for (var _i = 0; _i < props.length; _i++) {\n var prop = props[_i];\n props[prop.name] = prop; // allow lookup by name\n } // map aliases\n\n\n for (var _i2 = 0; _i2 < aliases.length; _i2++) {\n var alias = aliases[_i2];\n var pointsToProp = props[alias.pointsTo];\n var aliasProp = {\n name: alias.name,\n alias: true,\n pointsTo: pointsToProp\n }; // add alias prop for parsing\n\n props.push(aliasProp);\n props[alias.name] = aliasProp; // allow lookup by name\n }\n})();\n\nstyfn$6.getDefaultProperty = function (name) {\n return this.getDefaultProperties()[name];\n};\n\nstyfn$6.getDefaultProperties = function () {\n var _p = this._private;\n\n if (_p.defaultProperties != null) {\n return _p.defaultProperties;\n }\n\n var rawProps = extend({\n // core props\n 'selection-box-color': '#ddd',\n 'selection-box-opacity': 0.65,\n 'selection-box-border-color': '#aaa',\n 'selection-box-border-width': 1,\n 'active-bg-color': 'black',\n 'active-bg-opacity': 0.15,\n 'active-bg-size': 30,\n 'outside-texture-bg-color': '#000',\n 'outside-texture-bg-opacity': 0.125,\n // common node/edge props\n 'events': 'yes',\n 'text-events': 'no',\n 'text-valign': 'top',\n 'text-halign': 'center',\n 'text-justification': 'auto',\n 'line-height': 1,\n 'color': '#000',\n 'text-outline-color': '#000',\n 'text-outline-width': 0,\n 'text-outline-opacity': 1,\n 'text-opacity': 1,\n 'text-decoration': 'none',\n 'text-transform': 'none',\n 'text-wrap': 'none',\n 'text-overflow-wrap': 'whitespace',\n 'text-max-width': 9999,\n 'text-background-color': '#000',\n 'text-background-opacity': 0,\n 'text-background-shape': 'rectangle',\n 'text-background-padding': 0,\n 'text-border-opacity': 0,\n 'text-border-width': 0,\n 'text-border-style': 'solid',\n 'text-border-color': '#000',\n 'font-family': 'Helvetica Neue, Helvetica, sans-serif',\n 'font-style': 'normal',\n 'font-weight': 'normal',\n 'font-size': 16,\n 'min-zoomed-font-size': 0,\n 'text-rotation': 'none',\n 'source-text-rotation': 'none',\n 'target-text-rotation': 'none',\n 'visibility': 'visible',\n 'display': 'element',\n 'opacity': 1,\n 'z-compound-depth': 'auto',\n 'z-index-compare': 'auto',\n 'z-index': 0,\n 'label': '',\n 'text-margin-x': 0,\n 'text-margin-y': 0,\n 'source-label': '',\n 'source-text-offset': 0,\n 'source-text-margin-x': 0,\n 'source-text-margin-y': 0,\n 'target-label': '',\n 'target-text-offset': 0,\n 'target-text-margin-x': 0,\n 'target-text-margin-y': 0,\n 'overlay-opacity': 0,\n 'overlay-color': '#000',\n 'overlay-padding': 10,\n 'transition-property': 'none',\n 'transition-duration': 0,\n 'transition-delay': 0,\n 'transition-timing-function': 'linear',\n // node props\n 'background-blacken': 0,\n 'background-color': '#999',\n 'background-fill': 'solid',\n 'background-opacity': 1,\n 'background-image': 'none',\n 'background-image-crossorigin': 'anonymous',\n 'background-image-opacity': 1,\n 'background-position-x': '50%',\n 'background-position-y': '50%',\n 'background-offset-x': 0,\n 'background-offset-y': 0,\n 'background-width-relative-to': 'include-padding',\n 'background-height-relative-to': 'include-padding',\n 'background-repeat': 'no-repeat',\n 'background-fit': 'none',\n 'background-clip': 'node',\n 'background-width': 'auto',\n 'background-height': 'auto',\n 'border-color': '#000',\n 'border-opacity': 1,\n 'border-width': 0,\n 'border-style': 'solid',\n 'height': 30,\n 'width': 30,\n 'shape': 'ellipse',\n 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1',\n 'bounds-expansion': 0,\n // node gradient\n 'background-gradient-direction': 'to-bottom',\n 'background-gradient-stop-colors': '#999',\n 'background-gradient-stop-positions': '0%',\n // ghost props\n 'ghost': 'no',\n 'ghost-offset-y': 0,\n 'ghost-offset-x': 0,\n 'ghost-opacity': 0,\n // compound props\n 'padding': 0,\n 'padding-relative-to': 'width',\n 'position': 'origin',\n 'compound-sizing-wrt-labels': 'include',\n 'min-width': 0,\n 'min-width-bias-left': 0,\n 'min-width-bias-right': 0,\n 'min-height': 0,\n 'min-height-bias-top': 0,\n 'min-height-bias-bottom': 0\n }, {\n // node pie bg\n 'pie-size': '100%'\n }, [{\n name: 'pie-{{i}}-background-color',\n value: 'black'\n }, {\n name: 'pie-{{i}}-background-size',\n value: '0%'\n }, {\n name: 'pie-{{i}}-background-opacity',\n value: 1\n }].reduce(function (css, prop) {\n for (var i = 1; i <= styfn$6.pieBackgroundN; i++) {\n var name = prop.name.replace('{{i}}', i);\n var val = prop.value;\n css[name] = val;\n }\n\n return css;\n }, {}), {\n // edge props\n 'line-style': 'solid',\n 'line-color': '#999',\n 'line-fill': 'solid',\n 'line-cap': 'butt',\n 'line-opacity': 1,\n 'line-gradient-stop-colors': '#999',\n 'line-gradient-stop-positions': '0%',\n 'control-point-step-size': 40,\n 'control-point-weights': 0.5,\n 'segment-weights': 0.5,\n 'segment-distances': 20,\n 'taxi-turn': '50%',\n 'taxi-turn-min-distance': 10,\n 'taxi-direction': 'auto',\n 'edge-distances': 'intersection',\n 'curve-style': 'haystack',\n 'haystack-radius': 0,\n 'arrow-scale': 1,\n 'loop-direction': '-45deg',\n 'loop-sweep': '-90deg',\n 'source-distance-from-node': 0,\n 'target-distance-from-node': 0,\n 'source-endpoint': 'outside-to-node',\n 'target-endpoint': 'outside-to-node',\n 'line-dash-pattern': [6, 3],\n 'line-dash-offset': 0\n }, [{\n name: 'arrow-shape',\n value: 'none'\n }, {\n name: 'arrow-color',\n value: '#999'\n }, {\n name: 'arrow-fill',\n value: 'filled'\n }].reduce(function (css, prop) {\n styfn$6.arrowPrefixes.forEach(function (prefix) {\n var name = prefix + '-' + prop.name;\n var val = prop.value;\n css[name] = val;\n });\n return css;\n }, {}));\n var parsedProps = {};\n\n for (var i = 0; i < this.properties.length; i++) {\n var prop = this.properties[i];\n\n if (prop.pointsTo) {\n continue;\n }\n\n var name = prop.name;\n var val = rawProps[name];\n var parsedProp = this.parse(name, val);\n parsedProps[name] = parsedProp;\n }\n\n _p.defaultProperties = parsedProps;\n return _p.defaultProperties;\n};\n\nstyfn$6.addDefaultStylesheet = function () {\n this.selector(':parent').css({\n 'shape': 'rectangle',\n 'padding': 10,\n 'background-color': '#eee',\n 'border-color': '#ccc',\n 'border-width': 1\n }).selector('edge').css({\n 'width': 3\n }).selector(':loop').css({\n 'curve-style': 'bezier'\n }).selector('edge:compound').css({\n 'curve-style': 'bezier',\n 'source-endpoint': 'outside-to-line',\n 'target-endpoint': 'outside-to-line'\n }).selector(':selected').css({\n 'background-color': '#0169D9',\n 'line-color': '#0169D9',\n 'source-arrow-color': '#0169D9',\n 'target-arrow-color': '#0169D9',\n 'mid-source-arrow-color': '#0169D9',\n 'mid-target-arrow-color': '#0169D9'\n }).selector(':parent:selected').css({\n 'background-color': '#CCE1F9',\n 'border-color': '#aec8e5'\n }).selector(':active').css({\n 'overlay-color': 'black',\n 'overlay-padding': 10,\n 'overlay-opacity': 0.25\n });\n this.defaultLength = this.length;\n};\n\nvar styfn$7 = {}; // a caching layer for property parsing\n\nstyfn$7.parse = function (name, value, propIsBypass, propIsFlat) {\n var self = this; // function values can't be cached in all cases, and there isn't much benefit of caching them anyway\n\n if (fn(value)) {\n return self.parseImplWarn(name, value, propIsBypass, propIsFlat);\n }\n\n var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat;\n var bypassKey = propIsBypass ? 't' : 'f';\n var valueKey = '' + value;\n var argHash = hashStrings(name, valueKey, bypassKey, flatKey);\n var propCache = self.propCache = self.propCache || [];\n var ret;\n\n if (!(ret = propCache[argHash])) {\n ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat);\n } // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden\n // - mappings can't be shared b/c mappings are per-element\n\n\n if (propIsBypass || propIsFlat === 'mapping') {\n // need a copy since props are mutated later in their lifecycles\n ret = copy(ret);\n\n if (ret) {\n ret.value = copy(ret.value); // because it could be an array, e.g. colour\n }\n }\n\n return ret;\n};\n\nstyfn$7.parseImplWarn = function (name, value, propIsBypass, propIsFlat) {\n var prop = this.parseImpl(name, value, propIsBypass, propIsFlat);\n\n if (!prop && value != null) {\n warn(\"The style property `\".concat(name, \": \").concat(value, \"` is invalid\"));\n }\n\n if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') {\n warn('The style value of `label` is deprecated for `' + prop.name + '`');\n }\n\n return prop;\n}; // parse a property; return null on invalid; return parsed property otherwise\n// fields :\n// - name : the name of the property\n// - value : the parsed, native-typed value of the property\n// - strValue : a string value that represents the property value in valid css\n// - bypass : true iff the property is a bypass property\n\n\nstyfn$7.parseImpl = function (name, value, propIsBypass, propIsFlat) {\n var self = this;\n name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName')\n\n var property = self.properties[name];\n var passedValue = value;\n var types = self.types;\n\n if (!property) {\n return null;\n } // return null on property of unknown name\n\n\n if (value === undefined) {\n return null;\n } // can't assign undefined\n // the property may be an alias\n\n\n if (property.alias) {\n property = property.pointsTo;\n name = property.name;\n }\n\n var valueIsString = string(value);\n\n if (valueIsString) {\n // trim the value to make parsing easier\n value = value.trim();\n }\n\n var type = property.type;\n\n if (!type) {\n return null;\n } // no type, no luck\n // check if bypass is null or empty string (i.e. indication to delete bypass property)\n\n\n if (propIsBypass && (value === '' || value === null)) {\n return {\n name: name,\n value: value,\n bypass: true,\n deleteBypass: true\n };\n } // check if value is a function used as a mapper\n\n\n if (fn(value)) {\n return {\n name: name,\n value: value,\n strValue: 'fn',\n mapped: types.fn,\n bypass: propIsBypass\n };\n } // check if value is mapped\n\n\n var data, mapData;\n\n if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) {\n if (propIsBypass) {\n return false;\n } // mappers not allowed in bypass\n\n\n var mapped = types.data;\n return {\n name: name,\n value: data,\n strValue: '' + value,\n mapped: mapped,\n field: data[1],\n bypass: propIsBypass\n };\n } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) {\n if (propIsBypass) {\n return false;\n } // mappers not allowed in bypass\n\n\n if (type.multiple) {\n return false;\n } // impossible to map to num\n\n\n var _mapped = types.mapData; // we can map only if the type is a colour or a number\n\n if (!(type.color || type.number)) {\n return false;\n }\n\n var valueMin = this.parse(name, mapData[4]); // parse to validate\n\n if (!valueMin || valueMin.mapped) {\n return false;\n } // can't be invalid or mapped\n\n\n var valueMax = this.parse(name, mapData[5]); // parse to validate\n\n if (!valueMax || valueMax.mapped) {\n return false;\n } // can't be invalid or mapped\n // check if valueMin and valueMax are the same\n\n\n if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) {\n warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`');\n return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range\n } else if (type.color) {\n var c1 = valueMin.value;\n var c2 = valueMax.value;\n var same = c1[0] === c2[0] // red\n && c1[1] === c2[1] // green\n && c1[2] === c2[2] // blue\n && ( // optional alpha\n c1[3] === c2[3] // same alpha outright\n || (c1[3] == null || c1[3] === 1) && ( // full opacity for colour 1?\n c2[3] == null || c2[3] === 1) // full opacity for colour 2?\n );\n\n if (same) {\n return false;\n } // can't make a mapper without a range\n\n }\n\n return {\n name: name,\n value: mapData,\n strValue: '' + value,\n mapped: _mapped,\n field: mapData[1],\n fieldMin: parseFloat(mapData[2]),\n // min & max are numeric\n fieldMax: parseFloat(mapData[3]),\n valueMin: valueMin.value,\n valueMax: valueMax.value,\n bypass: propIsBypass\n };\n }\n\n if (type.multiple && propIsFlat !== 'multiple') {\n var vals;\n\n if (valueIsString) {\n vals = value.split(/\\s+/);\n } else if (array(value)) {\n vals = value;\n } else {\n vals = [value];\n }\n\n if (type.evenMultiple && vals.length % 2 !== 0) {\n return null;\n }\n\n var valArr = [];\n var unitsArr = [];\n var pfValArr = [];\n var strVal = '';\n var hasEnum = false;\n\n for (var i = 0; i < vals.length; i++) {\n var p = self.parse(name, vals[i], propIsBypass, 'multiple');\n hasEnum = hasEnum || string(p.value);\n valArr.push(p.value);\n pfValArr.push(p.pfValue != null ? p.pfValue : p.value);\n unitsArr.push(p.units);\n strVal += (i > 0 ? ' ' : '') + p.strValue;\n }\n\n if (type.validate && !type.validate(valArr, unitsArr)) {\n return null;\n }\n\n if (type.singleEnum && hasEnum) {\n if (valArr.length === 1 && string(valArr[0])) {\n return {\n name: name,\n value: valArr[0],\n strValue: valArr[0],\n bypass: propIsBypass\n };\n } else {\n return null;\n }\n }\n\n return {\n name: name,\n value: valArr,\n pfValue: pfValArr,\n strValue: strVal,\n bypass: propIsBypass,\n units: unitsArr\n };\n } // several types also allow enums\n\n\n var checkEnums = function checkEnums() {\n for (var _i = 0; _i < type.enums.length; _i++) {\n var en = type.enums[_i];\n\n if (en === value) {\n return {\n name: name,\n value: value,\n strValue: '' + value,\n bypass: propIsBypass\n };\n }\n }\n\n return null;\n }; // check the type and return the appropriate object\n\n\n if (type.number) {\n var units;\n var implicitUnits = 'px'; // not set => px\n\n if (type.units) {\n // use specified units if set\n units = type.units;\n }\n\n if (type.implicitUnits) {\n implicitUnits = type.implicitUnits;\n }\n\n if (!type.unitless) {\n if (valueIsString) {\n var unitsRegex = 'px|em' + (type.allowPercent ? '|\\\\%' : '');\n\n if (units) {\n unitsRegex = units;\n } // only allow explicit units if so set\n\n\n var match = value.match('^(' + number$1 + ')(' + unitsRegex + ')?' + '$');\n\n if (match) {\n value = match[1];\n units = match[2] || implicitUnits;\n }\n } else if (!units || type.implicitUnits) {\n units = implicitUnits; // implicitly px if unspecified\n }\n }\n\n value = parseFloat(value); // if not a number and enums not allowed, then the value is invalid\n\n if (isNaN(value) && type.enums === undefined) {\n return null;\n } // check if this number type also accepts special keywords in place of numbers\n // (i.e. `left`, `auto`, etc)\n\n\n if (isNaN(value) && type.enums !== undefined) {\n value = passedValue;\n return checkEnums();\n } // check if value must be an integer\n\n\n if (type.integer && !integer(value)) {\n return null;\n } // check value is within range\n\n\n if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) {\n return null;\n }\n\n var ret = {\n name: name,\n value: value,\n strValue: '' + value + (units ? units : ''),\n units: units,\n bypass: propIsBypass\n }; // normalise value in pixels\n\n if (type.unitless || units !== 'px' && units !== 'em') {\n ret.pfValue = value;\n } else {\n ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value;\n } // normalise value in ms\n\n\n if (units === 'ms' || units === 's') {\n ret.pfValue = units === 'ms' ? value : 1000 * value;\n } // normalise value in rad\n\n\n if (units === 'deg' || units === 'rad') {\n ret.pfValue = units === 'rad' ? value : deg2rad(value);\n } // normalize value in %\n\n\n if (units === '%') {\n ret.pfValue = value / 100;\n }\n\n return ret;\n } else if (type.propList) {\n var props = [];\n var propsStr = '' + value;\n\n if (propsStr === 'none') ; else {\n // go over each prop\n var propsSplit = propsStr.split(/\\s*,\\s*|\\s+/);\n\n for (var _i2 = 0; _i2 < propsSplit.length; _i2++) {\n var propName = propsSplit[_i2].trim();\n\n if (self.properties[propName]) {\n props.push(propName);\n } else {\n warn('`' + propName + '` is not a valid property name');\n }\n }\n\n if (props.length === 0) {\n return null;\n }\n }\n\n return {\n name: name,\n value: props,\n strValue: props.length === 0 ? 'none' : props.join(' '),\n bypass: propIsBypass\n };\n } else if (type.color) {\n var tuple = color2tuple(value);\n\n if (!tuple) {\n return null;\n }\n\n return {\n name: name,\n value: tuple,\n pfValue: tuple,\n strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')',\n // n.b. no spaces b/c of multiple support\n bypass: propIsBypass\n };\n } else if (type.regex || type.regexes) {\n // first check enums\n if (type.enums) {\n var enumProp = checkEnums();\n\n if (enumProp) {\n return enumProp;\n }\n }\n\n var regexes = type.regexes ? type.regexes : [type.regex];\n\n for (var _i3 = 0; _i3 < regexes.length; _i3++) {\n var regex = new RegExp(regexes[_i3]); // make a regex from the type string\n\n var m = regex.exec(value);\n\n if (m) {\n // regex matches\n return {\n name: name,\n value: type.singleRegexMatchValue ? m[1] : m,\n strValue: '' + value,\n bypass: propIsBypass\n };\n }\n }\n\n return null; // didn't match any\n } else if (type.string) {\n // just return\n return {\n name: name,\n value: '' + value,\n strValue: '' + value,\n bypass: propIsBypass\n };\n } else if (type.enums) {\n // check enums last because it's a combo type in others\n return checkEnums();\n } else {\n return null; // not a type we can handle\n }\n};\n\nvar Style = function Style(cy) {\n if (!(this instanceof Style)) {\n return new Style(cy);\n }\n\n if (!core(cy)) {\n error('A style must have a core reference');\n return;\n }\n\n this._private = {\n cy: cy,\n coreStyle: {}\n };\n this.length = 0;\n this.resetToDefault();\n};\n\nvar styfn$8 = Style.prototype;\n\nstyfn$8.instanceString = function () {\n return 'style';\n}; // remove all contexts\n\n\nstyfn$8.clear = function () {\n var _p = this._private;\n var cy = _p.cy;\n var eles = cy.elements();\n\n for (var i = 0; i < this.length; i++) {\n this[i] = undefined;\n }\n\n this.length = 0;\n _p.contextStyles = {};\n _p.propDiffs = {};\n this.cleanElements(eles, true);\n eles.forEach(function (ele) {\n var ele_p = ele[0]._private;\n ele_p.styleDirty = true;\n ele_p.appliedInitStyle = false;\n });\n return this; // chaining\n};\n\nstyfn$8.resetToDefault = function () {\n this.clear();\n this.addDefaultStylesheet();\n return this;\n}; // builds a style object for the 'core' selector\n\n\nstyfn$8.core = function (propName) {\n return this._private.coreStyle[propName] || this.getDefaultProperty(propName);\n}; // create a new context from the specified selector string and switch to that context\n\n\nstyfn$8.selector = function (selectorStr) {\n // 'core' is a special case and does not need a selector\n var selector = selectorStr === 'core' ? null : new Selector(selectorStr);\n var i = this.length++; // new context means new index\n\n this[i] = {\n selector: selector,\n properties: [],\n mappedProperties: [],\n index: i\n };\n return this; // chaining\n}; // add one or many css rules to the current context\n\n\nstyfn$8.css = function () {\n var self = this;\n var args = arguments;\n\n if (args.length === 1) {\n var map = args[0];\n\n for (var i = 0; i < self.properties.length; i++) {\n var prop = self.properties[i];\n var mapVal = map[prop.name];\n\n if (mapVal === undefined) {\n mapVal = map[dash2camel(prop.name)];\n }\n\n if (mapVal !== undefined) {\n this.cssRule(prop.name, mapVal);\n }\n }\n } else if (args.length === 2) {\n this.cssRule(args[0], args[1]);\n } // do nothing if args are invalid\n\n\n return this; // chaining\n};\n\nstyfn$8.style = styfn$8.css; // add a single css rule to the current context\n\nstyfn$8.cssRule = function (name, value) {\n // name-value pair\n var property = this.parse(name, value); // add property to current context if valid\n\n if (property) {\n var i = this.length - 1;\n this[i].properties.push(property);\n this[i].properties[property.name] = property; // allow access by name as well\n\n if (property.name.match(/pie-(\\d+)-background-size/) && property.value) {\n this._private.hasPie = true;\n }\n\n if (property.mapped) {\n this[i].mappedProperties.push(property);\n } // add to core style if necessary\n\n\n var currentSelectorIsCore = !this[i].selector;\n\n if (currentSelectorIsCore) {\n this._private.coreStyle[property.name] = property;\n }\n }\n\n return this; // chaining\n};\n\nstyfn$8.append = function (style) {\n if (stylesheet(style)) {\n style.appendToStyle(this);\n } else if (array(style)) {\n this.appendFromJson(style);\n } else if (string(style)) {\n this.appendFromString(style);\n } // you probably wouldn't want to append a Style, since you'd duplicate the default parts\n\n\n return this;\n}; // static function\n\n\nStyle.fromJson = function (cy, json) {\n var style = new Style(cy);\n style.fromJson(json);\n return style;\n};\n\nStyle.fromString = function (cy, string) {\n return new Style(cy).fromString(string);\n};\n\n[styfn, styfn$1, styfn$2, styfn$3, styfn$4, styfn$5, styfn$6, styfn$7].forEach(function (props) {\n extend(styfn$8, props);\n});\nStyle.types = styfn$8.types;\nStyle.properties = styfn$8.properties;\nStyle.propertyGroups = styfn$8.propertyGroups;\nStyle.propertyGroupNames = styfn$8.propertyGroupNames;\nStyle.propertyGroupKeys = styfn$8.propertyGroupKeys;\n\nvar corefn$7 = {\n style: function style(newStyle) {\n if (newStyle) {\n var s = this.setStyle(newStyle);\n s.update();\n }\n\n return this._private.style;\n },\n setStyle: function setStyle(style) {\n var _p = this._private;\n\n if (stylesheet(style)) {\n _p.style = style.generateStyle(this);\n } else if (array(style)) {\n _p.style = Style.fromJson(this, style);\n } else if (string(style)) {\n _p.style = Style.fromString(this, style);\n } else {\n _p.style = Style(this);\n }\n\n return _p.style;\n }\n};\n\nvar defaultSelectionType = 'single';\nvar corefn$8 = {\n autolock: function autolock(bool) {\n if (bool !== undefined) {\n this._private.autolock = bool ? true : false;\n } else {\n return this._private.autolock;\n }\n\n return this; // chaining\n },\n autoungrabify: function autoungrabify(bool) {\n if (bool !== undefined) {\n this._private.autoungrabify = bool ? true : false;\n } else {\n return this._private.autoungrabify;\n }\n\n return this; // chaining\n },\n autounselectify: function autounselectify(bool) {\n if (bool !== undefined) {\n this._private.autounselectify = bool ? true : false;\n } else {\n return this._private.autounselectify;\n }\n\n return this; // chaining\n },\n selectionType: function selectionType(selType) {\n var _p = this._private;\n\n if (_p.selectionType == null) {\n _p.selectionType = defaultSelectionType;\n }\n\n if (selType !== undefined) {\n if (selType === 'additive' || selType === 'single') {\n _p.selectionType = selType;\n }\n } else {\n return _p.selectionType;\n }\n\n return this;\n },\n panningEnabled: function panningEnabled(bool) {\n if (bool !== undefined) {\n this._private.panningEnabled = bool ? true : false;\n } else {\n return this._private.panningEnabled;\n }\n\n return this; // chaining\n },\n userPanningEnabled: function userPanningEnabled(bool) {\n if (bool !== undefined) {\n this._private.userPanningEnabled = bool ? true : false;\n } else {\n return this._private.userPanningEnabled;\n }\n\n return this; // chaining\n },\n zoomingEnabled: function zoomingEnabled(bool) {\n if (bool !== undefined) {\n this._private.zoomingEnabled = bool ? true : false;\n } else {\n return this._private.zoomingEnabled;\n }\n\n return this; // chaining\n },\n userZoomingEnabled: function userZoomingEnabled(bool) {\n if (bool !== undefined) {\n this._private.userZoomingEnabled = bool ? true : false;\n } else {\n return this._private.userZoomingEnabled;\n }\n\n return this; // chaining\n },\n boxSelectionEnabled: function boxSelectionEnabled(bool) {\n if (bool !== undefined) {\n this._private.boxSelectionEnabled = bool ? true : false;\n } else {\n return this._private.boxSelectionEnabled;\n }\n\n return this; // chaining\n },\n pan: function pan() {\n var args = arguments;\n var pan = this._private.pan;\n var dim, val, dims, x, y;\n\n switch (args.length) {\n case 0:\n // .pan()\n return pan;\n\n case 1:\n if (string(args[0])) {\n // .pan('x')\n dim = args[0];\n return pan[dim];\n } else if (plainObject(args[0])) {\n // .pan({ x: 0, y: 100 })\n if (!this._private.panningEnabled) {\n return this;\n }\n\n dims = args[0];\n x = dims.x;\n y = dims.y;\n\n if (number(x)) {\n pan.x = x;\n }\n\n if (number(y)) {\n pan.y = y;\n }\n\n this.emit('pan viewport');\n }\n\n break;\n\n case 2:\n // .pan('x', 100)\n if (!this._private.panningEnabled) {\n return this;\n }\n\n dim = args[0];\n val = args[1];\n\n if ((dim === 'x' || dim === 'y') && number(val)) {\n pan[dim] = val;\n }\n\n this.emit('pan viewport');\n break;\n // invalid\n }\n\n this.notify('viewport');\n return this; // chaining\n },\n panBy: function panBy(arg0, arg1) {\n var args = arguments;\n var pan = this._private.pan;\n var dim, val, dims, x, y;\n\n if (!this._private.panningEnabled) {\n return this;\n }\n\n switch (args.length) {\n case 1:\n if (plainObject(arg0)) {\n // .panBy({ x: 0, y: 100 })\n dims = args[0];\n x = dims.x;\n y = dims.y;\n\n if (number(x)) {\n pan.x += x;\n }\n\n if (number(y)) {\n pan.y += y;\n }\n\n this.emit('pan viewport');\n }\n\n break;\n\n case 2:\n // .panBy('x', 100)\n dim = arg0;\n val = arg1;\n\n if ((dim === 'x' || dim === 'y') && number(val)) {\n pan[dim] += val;\n }\n\n this.emit('pan viewport');\n break;\n // invalid\n }\n\n this.notify('viewport');\n return this; // chaining\n },\n fit: function fit(elements, padding) {\n var viewportState = this.getFitViewport(elements, padding);\n\n if (viewportState) {\n var _p = this._private;\n _p.zoom = viewportState.zoom;\n _p.pan = viewportState.pan;\n this.emit('pan zoom viewport');\n this.notify('viewport');\n }\n\n return this; // chaining\n },\n getFitViewport: function getFitViewport(elements, padding) {\n if (number(elements) && padding === undefined) {\n // elements is optional\n padding = elements;\n elements = undefined;\n }\n\n if (!this._private.panningEnabled || !this._private.zoomingEnabled) {\n return;\n }\n\n var bb;\n\n if (string(elements)) {\n var sel = elements;\n elements = this.$(sel);\n } else if (boundingBox(elements)) {\n // assume bb\n var bbe = elements;\n bb = {\n x1: bbe.x1,\n y1: bbe.y1,\n x2: bbe.x2,\n y2: bbe.y2\n };\n bb.w = bb.x2 - bb.x1;\n bb.h = bb.y2 - bb.y1;\n } else if (!elementOrCollection(elements)) {\n elements = this.mutableElements();\n }\n\n if (elementOrCollection(elements) && elements.empty()) {\n return;\n } // can't fit to nothing\n\n\n bb = bb || elements.boundingBox();\n var w = this.width();\n var h = this.height();\n var zoom;\n padding = number(padding) ? padding : 0;\n\n if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) {\n zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h); // crop zoom\n\n zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom;\n zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom;\n var pan = {\n // now pan to middle\n x: (w - zoom * (bb.x1 + bb.x2)) / 2,\n y: (h - zoom * (bb.y1 + bb.y2)) / 2\n };\n return {\n zoom: zoom,\n pan: pan\n };\n }\n\n return;\n },\n zoomRange: function zoomRange(min, max) {\n var _p = this._private;\n\n if (max == null) {\n var opts = min;\n min = opts.min;\n max = opts.max;\n }\n\n if (number(min) && number(max) && min <= max) {\n _p.minZoom = min;\n _p.maxZoom = max;\n } else if (number(min) && max === undefined && min <= _p.maxZoom) {\n _p.minZoom = min;\n } else if (number(max) && min === undefined && max >= _p.minZoom) {\n _p.maxZoom = max;\n }\n\n return this;\n },\n minZoom: function minZoom(zoom) {\n if (zoom === undefined) {\n return this._private.minZoom;\n } else {\n return this.zoomRange({\n min: zoom\n });\n }\n },\n maxZoom: function maxZoom(zoom) {\n if (zoom === undefined) {\n return this._private.maxZoom;\n } else {\n return this.zoomRange({\n max: zoom\n });\n }\n },\n getZoomedViewport: function getZoomedViewport(params) {\n var _p = this._private;\n var currentPan = _p.pan;\n var currentZoom = _p.zoom;\n var pos; // in rendered px\n\n var zoom;\n var bail = false;\n\n if (!_p.zoomingEnabled) {\n // zooming disabled\n bail = true;\n }\n\n if (number(params)) {\n // then set the zoom\n zoom = params;\n } else if (plainObject(params)) {\n // then zoom about a point\n zoom = params.level;\n\n if (params.position != null) {\n pos = modelToRenderedPosition(params.position, currentZoom, currentPan);\n } else if (params.renderedPosition != null) {\n pos = params.renderedPosition;\n }\n\n if (pos != null && !_p.panningEnabled) {\n // panning disabled\n bail = true;\n }\n } // crop zoom\n\n\n zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom;\n zoom = zoom < _p.minZoom ? _p.minZoom : zoom; // can't zoom with invalid params\n\n if (bail || !number(zoom) || zoom === currentZoom || pos != null && (!number(pos.x) || !number(pos.y))) {\n return null;\n }\n\n if (pos != null) {\n // set zoom about position\n var pan1 = currentPan;\n var zoom1 = currentZoom;\n var zoom2 = zoom;\n var pan2 = {\n x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x,\n y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y\n };\n return {\n zoomed: true,\n panned: true,\n zoom: zoom2,\n pan: pan2\n };\n } else {\n // just set the zoom\n return {\n zoomed: true,\n panned: false,\n zoom: zoom,\n pan: currentPan\n };\n }\n },\n zoom: function zoom(params) {\n if (params === undefined) {\n // get\n return this._private.zoom;\n } else {\n // set\n var vp = this.getZoomedViewport(params);\n var _p = this._private;\n\n if (vp == null || !vp.zoomed) {\n return this;\n }\n\n _p.zoom = vp.zoom;\n\n if (vp.panned) {\n _p.pan.x = vp.pan.x;\n _p.pan.y = vp.pan.y;\n }\n\n this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport');\n this.notify('viewport');\n return this; // chaining\n }\n },\n viewport: function viewport(opts) {\n var _p = this._private;\n var zoomDefd = true;\n var panDefd = true;\n var events = []; // to trigger\n\n var zoomFailed = false;\n var panFailed = false;\n\n if (!opts) {\n return this;\n }\n\n if (!number(opts.zoom)) {\n zoomDefd = false;\n }\n\n if (!plainObject(opts.pan)) {\n panDefd = false;\n }\n\n if (!zoomDefd && !panDefd) {\n return this;\n }\n\n if (zoomDefd) {\n var z = opts.zoom;\n\n if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) {\n zoomFailed = true;\n } else {\n _p.zoom = z;\n events.push('zoom');\n }\n }\n\n if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) {\n var p = opts.pan;\n\n if (number(p.x)) {\n _p.pan.x = p.x;\n panFailed = false;\n }\n\n if (number(p.y)) {\n _p.pan.y = p.y;\n panFailed = false;\n }\n\n if (!panFailed) {\n events.push('pan');\n }\n }\n\n if (events.length > 0) {\n events.push('viewport');\n this.emit(events.join(' '));\n this.notify('viewport');\n }\n\n return this; // chaining\n },\n center: function center(elements) {\n var pan = this.getCenterPan(elements);\n\n if (pan) {\n this._private.pan = pan;\n this.emit('pan viewport');\n this.notify('viewport');\n }\n\n return this; // chaining\n },\n getCenterPan: function getCenterPan(elements, zoom) {\n if (!this._private.panningEnabled) {\n return;\n }\n\n if (string(elements)) {\n var selector = elements;\n elements = this.mutableElements().filter(selector);\n } else if (!elementOrCollection(elements)) {\n elements = this.mutableElements();\n }\n\n if (elements.length === 0) {\n return;\n } // can't centre pan to nothing\n\n\n var bb = elements.boundingBox();\n var w = this.width();\n var h = this.height();\n zoom = zoom === undefined ? this._private.zoom : zoom;\n var pan = {\n // middle\n x: (w - zoom * (bb.x1 + bb.x2)) / 2,\n y: (h - zoom * (bb.y1 + bb.y2)) / 2\n };\n return pan;\n },\n reset: function reset() {\n if (!this._private.panningEnabled || !this._private.zoomingEnabled) {\n return this;\n }\n\n this.viewport({\n pan: {\n x: 0,\n y: 0\n },\n zoom: 1\n });\n return this; // chaining\n },\n invalidateSize: function invalidateSize() {\n this._private.sizeCache = null;\n },\n size: function size() {\n var _p = this._private;\n var container = _p.container;\n return _p.sizeCache = _p.sizeCache || (container ? function () {\n var style = window$1.getComputedStyle(container);\n\n var val = function val(name) {\n return parseFloat(style.getPropertyValue(name));\n };\n\n return {\n width: container.clientWidth - val('padding-left') - val('padding-right'),\n height: container.clientHeight - val('padding-top') - val('padding-bottom')\n };\n }() : {\n // fallback if no container (not 0 b/c can be used for dividing etc)\n width: 1,\n height: 1\n });\n },\n width: function width() {\n return this.size().width;\n },\n height: function height() {\n return this.size().height;\n },\n extent: function extent() {\n var pan = this._private.pan;\n var zoom = this._private.zoom;\n var rb = this.renderedExtent();\n var b = {\n x1: (rb.x1 - pan.x) / zoom,\n x2: (rb.x2 - pan.x) / zoom,\n y1: (rb.y1 - pan.y) / zoom,\n y2: (rb.y2 - pan.y) / zoom\n };\n b.w = b.x2 - b.x1;\n b.h = b.y2 - b.y1;\n return b;\n },\n renderedExtent: function renderedExtent() {\n var width = this.width();\n var height = this.height();\n return {\n x1: 0,\n y1: 0,\n x2: width,\n y2: height,\n w: width,\n h: height\n };\n }\n}; // aliases\n\ncorefn$8.centre = corefn$8.center; // backwards compatibility\n\ncorefn$8.autolockNodes = corefn$8.autolock;\ncorefn$8.autoungrabifyNodes = corefn$8.autoungrabify;\n\nvar fn$6 = {\n data: define$3.data({\n field: 'data',\n bindingEvent: 'data',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'data',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true\n }),\n removeData: define$3.removeData({\n field: 'data',\n event: 'data',\n triggerFnName: 'trigger',\n triggerEvent: true\n }),\n scratch: define$3.data({\n field: 'scratch',\n bindingEvent: 'scratch',\n allowBinding: true,\n allowSetting: true,\n settingEvent: 'scratch',\n settingTriggersEvent: true,\n triggerFnName: 'trigger',\n allowGetting: true\n }),\n removeScratch: define$3.removeData({\n field: 'scratch',\n event: 'scratch',\n triggerFnName: 'trigger',\n triggerEvent: true\n })\n}; // aliases\n\nfn$6.attr = fn$6.data;\nfn$6.removeAttr = fn$6.removeData;\n\nvar Core = function Core(opts) {\n var cy = this;\n opts = extend({}, opts);\n var container = opts.container; // allow for passing a wrapped jquery object\n // e.g. cytoscape({ container: $('#cy') })\n\n if (container && !htmlElement(container) && htmlElement(container[0])) {\n container = container[0];\n }\n\n var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery\n\n reg = reg || {};\n\n if (reg && reg.cy) {\n reg.cy.destroy();\n reg = {}; // old instance => replace reg completely\n }\n\n var readies = reg.readies = reg.readies || [];\n\n if (container) {\n container._cyreg = reg;\n } // make sure container assoc'd reg points to this cy\n\n\n reg.cy = cy;\n var head = window$1 !== undefined && container !== undefined && !opts.headless;\n var options = opts;\n options.layout = extend({\n name: head ? 'grid' : 'null'\n }, options.layout);\n options.renderer = extend({\n name: head ? 'canvas' : 'null'\n }, options.renderer);\n\n var defVal = function defVal(def, val, altVal) {\n if (val !== undefined) {\n return val;\n } else if (altVal !== undefined) {\n return altVal;\n } else {\n return def;\n }\n };\n\n var _p = this._private = {\n container: container,\n // html dom ele container\n ready: false,\n // whether ready has been triggered\n options: options,\n // cached options\n elements: new Collection(this),\n // elements in the graph\n listeners: [],\n // list of listeners\n aniEles: new Collection(this),\n // elements being animated\n data: {},\n // data for the core\n scratch: {},\n // scratch object for core\n layout: null,\n renderer: null,\n destroyed: false,\n // whether destroy was called\n notificationsEnabled: true,\n // whether notifications are sent to the renderer\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: defVal(true, options.zoomingEnabled),\n userZoomingEnabled: defVal(true, options.userZoomingEnabled),\n panningEnabled: defVal(true, options.panningEnabled),\n userPanningEnabled: defVal(true, options.userPanningEnabled),\n boxSelectionEnabled: defVal(true, options.boxSelectionEnabled),\n autolock: defVal(false, options.autolock, options.autolockNodes),\n autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes),\n autounselectify: defVal(false, options.autounselectify),\n styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled,\n zoom: number(options.zoom) ? options.zoom : 1,\n pan: {\n x: plainObject(options.pan) && number(options.pan.x) ? options.pan.x : 0,\n y: plainObject(options.pan) && number(options.pan.y) ? options.pan.y : 0\n },\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n hasCompoundNodes: false\n };\n\n this.createEmitter(); // set selection type\n\n this.selectionType(options.selectionType); // init zoom bounds\n\n this.zoomRange({\n min: options.minZoom,\n max: options.maxZoom\n });\n\n var loadExtData = function loadExtData(extData, next) {\n var anyIsPromise = extData.some(promise);\n\n if (anyIsPromise) {\n return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init\n } else {\n next(extData); // exec synchronously for convenience\n }\n }; // start with the default stylesheet so we have something before loading an external stylesheet\n\n\n if (_p.styleEnabled) {\n cy.setStyle([]);\n } // create the renderer\n\n\n var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options\n\n cy.initRenderer(rendererOptions);\n\n var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) {\n cy.notifications(false); // remove old elements\n\n var oldEles = cy.mutableElements();\n\n if (oldEles.length > 0) {\n oldEles.remove();\n }\n\n if (elements != null) {\n if (plainObject(elements) || array(elements)) {\n cy.add(elements);\n }\n }\n\n cy.one('layoutready', function (e) {\n cy.notifications(true);\n cy.emit(e); // we missed this event by turning notifications off, so pass it on\n\n cy.one('load', onload);\n cy.emitAndNotify('load');\n }).one('layoutstop', function () {\n cy.one('done', ondone);\n cy.emit('done');\n });\n var layoutOpts = extend({}, cy._private.options.layout);\n layoutOpts.eles = cy.elements();\n cy.layout(layoutOpts).run();\n };\n\n loadExtData([options.style, options.elements], function (thens) {\n var initStyle = thens[0];\n var initEles = thens[1]; // init style\n\n if (_p.styleEnabled) {\n cy.style().append(initStyle);\n } // initial load\n\n\n setElesAndLayout(initEles, function () {\n // onready\n cy.startAnimationLoop();\n _p.ready = true; // if a ready callback is specified as an option, the bind it\n\n if (fn(options.ready)) {\n cy.on('ready', options.ready);\n } // bind all the ready handlers registered before creating this instance\n\n\n for (var i = 0; i < readies.length; i++) {\n var fn$1 = readies[i];\n cy.on('ready', fn$1);\n }\n\n if (reg) {\n reg.readies = [];\n } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc\n\n\n cy.emit('ready');\n }, options.done);\n });\n};\n\nvar corefn$9 = Core.prototype; // short alias\n\nextend(corefn$9, {\n instanceString: function instanceString() {\n return 'core';\n },\n isReady: function isReady() {\n return this._private.ready;\n },\n destroyed: function destroyed() {\n return this._private.destroyed;\n },\n ready: function ready(fn) {\n if (this.isReady()) {\n this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event\n } else {\n this.on('ready', fn);\n }\n\n return this;\n },\n destroy: function destroy() {\n var cy = this;\n if (cy.destroyed()) return;\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n this.emit('destroy');\n cy._private.destroyed = true;\n return cy;\n },\n hasElementWithId: function hasElementWithId(id) {\n return this._private.elements.hasElementWithId(id);\n },\n getElementById: function getElementById(id) {\n return this._private.elements.getElementById(id);\n },\n hasCompoundNodes: function hasCompoundNodes() {\n return this._private.hasCompoundNodes;\n },\n headless: function headless() {\n return this._private.renderer.isHeadless();\n },\n styleEnabled: function styleEnabled() {\n return this._private.styleEnabled;\n },\n addToPool: function addToPool(eles) {\n this._private.elements.merge(eles);\n\n return this; // chaining\n },\n removeFromPool: function removeFromPool(eles) {\n this._private.elements.unmerge(eles);\n\n return this;\n },\n container: function container() {\n return this._private.container || null;\n },\n mount: function mount(container) {\n if (container == null) {\n return;\n }\n\n var cy = this;\n var _p = cy._private;\n var options = _p.options;\n\n if (!htmlElement(container) && htmlElement(container[0])) {\n container = container[0];\n }\n\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n _p.container = container;\n _p.styleEnabled = true;\n cy.invalidateSize();\n cy.initRenderer(extend({}, options, options.renderer, {\n // allow custom renderer name to be re-used, otherwise use canvas\n name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name\n }));\n cy.startAnimationLoop();\n cy.style(options.style);\n cy.emit('mount');\n return cy;\n },\n unmount: function unmount() {\n var cy = this;\n cy.stopAnimationLoop();\n cy.destroyRenderer();\n cy.initRenderer({\n name: 'null'\n });\n cy.emit('unmount');\n return cy;\n },\n options: function options() {\n return copy(this._private.options);\n },\n json: function json(obj) {\n var cy = this;\n var _p = cy._private;\n var eles = cy.mutableElements();\n\n var getFreshRef = function getFreshRef(ele) {\n return cy.getElementById(ele.id());\n };\n\n if (plainObject(obj)) {\n // set\n cy.startBatch();\n\n if (obj.elements) {\n var idInJson = {};\n\n var updateEles = function updateEles(jsons, gr) {\n var toAdd = [];\n var toMod = [];\n\n for (var i = 0; i < jsons.length; i++) {\n var json = jsons[i];\n var id = '' + json.data.id; // id must be string\n\n var ele = cy.getElementById(id);\n idInJson[id] = true;\n\n if (ele.length !== 0) {\n // existing element should be updated\n toMod.push({\n ele: ele,\n json: json\n });\n } else {\n // otherwise should be added\n if (gr) {\n json.group = gr;\n toAdd.push(json);\n } else {\n toAdd.push(json);\n }\n }\n }\n\n cy.add(toAdd);\n\n for (var _i = 0; _i < toMod.length; _i++) {\n var _toMod$_i = toMod[_i],\n _ele = _toMod$_i.ele,\n _json = _toMod$_i.json;\n\n _ele.json(_json);\n }\n };\n\n if (array(obj.elements)) {\n // elements: []\n updateEles(obj.elements);\n } else {\n // elements: { nodes: [], edges: [] }\n var grs = ['nodes', 'edges'];\n\n for (var i = 0; i < grs.length; i++) {\n var gr = grs[i];\n var elements = obj.elements[gr];\n\n if (array(elements)) {\n updateEles(elements, gr);\n }\n }\n }\n\n var parentsToRemove = cy.collection();\n eles.filter(function (ele) {\n return !idInJson[ele.id()];\n }).forEach(function (ele) {\n if (ele.isParent()) {\n parentsToRemove.merge(ele);\n } else {\n ele.remove();\n }\n }); // so that children are not removed w/parent\n\n parentsToRemove.forEach(function (ele) {\n return ele.children().move({\n parent: null\n });\n }); // intermediate parents may be moved by prior line, so make sure we remove by fresh refs\n\n parentsToRemove.forEach(function (ele) {\n return getFreshRef(ele).remove();\n });\n }\n\n if (obj.style) {\n cy.style(obj.style);\n }\n\n if (obj.zoom != null && obj.zoom !== _p.zoom) {\n cy.zoom(obj.zoom);\n }\n\n if (obj.pan) {\n if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) {\n cy.pan(obj.pan);\n }\n }\n\n if (obj.data) {\n cy.data(obj.data);\n }\n\n var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify'];\n\n for (var _i2 = 0; _i2 < fields.length; _i2++) {\n var f = fields[_i2];\n\n if (obj[f] != null) {\n cy[f](obj[f]);\n }\n }\n\n cy.endBatch();\n return this; // chaining\n } else {\n // get\n var flat = !!obj;\n var json = {};\n\n if (flat) {\n json.elements = this.elements().map(function (ele) {\n return ele.json();\n });\n } else {\n json.elements = {};\n eles.forEach(function (ele) {\n var group = ele.group();\n\n if (!json.elements[group]) {\n json.elements[group] = [];\n }\n\n json.elements[group].push(ele.json());\n });\n }\n\n if (this._private.styleEnabled) {\n json.style = cy.style().json();\n }\n\n json.data = copy(cy.data());\n var options = _p.options;\n json.zoomingEnabled = _p.zoomingEnabled;\n json.userZoomingEnabled = _p.userZoomingEnabled;\n json.zoom = _p.zoom;\n json.minZoom = _p.minZoom;\n json.maxZoom = _p.maxZoom;\n json.panningEnabled = _p.panningEnabled;\n json.userPanningEnabled = _p.userPanningEnabled;\n json.pan = copy(_p.pan);\n json.boxSelectionEnabled = _p.boxSelectionEnabled;\n json.renderer = copy(options.renderer);\n json.hideEdgesOnViewport = options.hideEdgesOnViewport;\n json.textureOnViewport = options.textureOnViewport;\n json.wheelSensitivity = options.wheelSensitivity;\n json.motionBlur = options.motionBlur;\n return json;\n }\n }\n});\ncorefn$9.$id = corefn$9.getElementById;\n[corefn, corefn$1, elesfn$v, corefn$2, corefn$3, corefn$4, corefn$5, corefn$6, corefn$7, corefn$8, fn$6].forEach(function (props) {\n extend(corefn$9, props);\n});\n\n/* eslint-disable no-unused-vars */\n\nvar defaults$9 = {\n fit: true,\n // whether to fit the viewport to the graph\n directed: false,\n // whether the tree is directed downwards (or edges can point in any direction if false)\n padding: 30,\n // padding on fit\n circle: false,\n // put depths in concentric circles if true, put depths top down if false\n grid: false,\n // whether to create an even grid into which the DAG is placed (circle:false only)\n spacingFactor: 1.75,\n // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap)\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n roots: undefined,\n // the roots of the trees\n maximal: false,\n // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled,\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n\n};\n/* eslint-enable */\n\nvar getInfo = function getInfo(ele) {\n return ele.scratch('breadthfirst');\n};\n\nvar setInfo = function setInfo(ele, obj) {\n return ele.scratch('breadthfirst', obj);\n};\n\nfunction BreadthFirstLayout(options) {\n this.options = extend({}, defaults$9, options);\n}\n\nBreadthFirstLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var cy = params.cy;\n var eles = options.eles;\n var nodes = eles.nodes().filter(function (n) {\n return !n.isParent();\n });\n var graph = eles;\n var directed = options.directed;\n var maximal = options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code\n\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var roots;\n\n if (elementOrCollection(options.roots)) {\n roots = options.roots;\n } else if (array(options.roots)) {\n var rootsArray = [];\n\n for (var i = 0; i < options.roots.length; i++) {\n var id = options.roots[i];\n var ele = cy.getElementById(id);\n rootsArray.push(ele);\n }\n\n roots = cy.collection(rootsArray);\n } else if (string(options.roots)) {\n roots = cy.$(options.roots);\n } else {\n if (directed) {\n roots = nodes.roots();\n } else {\n var components = eles.components();\n roots = cy.collection();\n\n var _loop = function _loop(_i) {\n var comp = components[_i];\n var maxDegree = comp.maxDegree(false);\n var compRoots = comp.filter(function (ele) {\n return ele.degree(false) === maxDegree;\n });\n roots = roots.add(compRoots);\n };\n\n for (var _i = 0; _i < components.length; _i++) {\n _loop(_i);\n }\n }\n }\n\n var depths = [];\n var foundByBfs = {};\n\n var addToDepth = function addToDepth(ele, d) {\n if (depths[d] == null) {\n depths[d] = [];\n }\n\n var i = depths[d].length;\n depths[d].push(ele);\n setInfo(ele, {\n index: i,\n depth: d\n });\n };\n\n var changeDepth = function changeDepth(ele, newDepth) {\n var _getInfo = getInfo(ele),\n depth = _getInfo.depth,\n index = _getInfo.index;\n\n depths[depth][index] = null;\n addToDepth(ele, newDepth);\n }; // find the depths of the nodes\n\n\n graph.bfs({\n roots: roots,\n directed: options.directed,\n visit: function visit(node, edge, pNode, i, depth) {\n var ele = node[0];\n var id = ele.id();\n addToDepth(ele, depth);\n foundByBfs[id] = true;\n }\n }); // check for nodes not found by bfs\n\n var orphanNodes = [];\n\n for (var _i2 = 0; _i2 < nodes.length; _i2++) {\n var _ele = nodes[_i2];\n\n if (foundByBfs[_ele.id()]) {\n continue;\n } else {\n orphanNodes.push(_ele);\n }\n } // assign the nodes a depth and index\n\n\n var assignDepthsAt = function assignDepthsAt(i) {\n var eles = depths[i];\n\n for (var j = 0; j < eles.length; j++) {\n var _ele2 = eles[j];\n\n if (_ele2 == null) {\n eles.splice(j, 1);\n j--;\n continue;\n }\n\n setInfo(_ele2, {\n depth: i,\n index: j\n });\n }\n };\n\n var assignDepths = function assignDepths() {\n for (var _i3 = 0; _i3 < depths.length; _i3++) {\n assignDepthsAt(_i3);\n }\n };\n\n var adjustMaximally = function adjustMaximally(ele, shifted) {\n var eInfo = getInfo(ele);\n var incomers = ele.incomers().filter(function (el) {\n return el.isNode() && eles.has(el);\n });\n var maxDepth = -1;\n var id = ele.id();\n\n for (var k = 0; k < incomers.length; k++) {\n var incmr = incomers[k];\n var iInfo = getInfo(incmr);\n maxDepth = Math.max(maxDepth, iInfo.depth);\n }\n\n if (eInfo.depth <= maxDepth) {\n if (shifted[id]) {\n return null;\n }\n\n changeDepth(ele, maxDepth + 1);\n shifted[id] = true;\n return true;\n }\n\n return false;\n }; // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1)\n\n\n if (directed && maximal) {\n var Q = [];\n var shifted = {};\n\n var enqueue = function enqueue(n) {\n return Q.push(n);\n };\n\n var dequeue = function dequeue() {\n return Q.shift();\n };\n\n nodes.forEach(function (n) {\n return Q.push(n);\n });\n\n while (Q.length > 0) {\n var _ele3 = dequeue();\n\n var didShift = adjustMaximally(_ele3, shifted);\n\n if (didShift) {\n _ele3.outgoers().filter(function (el) {\n return el.isNode() && eles.has(el);\n }).forEach(enqueue);\n } else if (didShift === null) {\n warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.');\n break; // exit on failure\n }\n }\n }\n\n assignDepths(); // clear holes\n // find min distance we need to leave between nodes\n\n var minDistance = 0;\n\n if (options.avoidOverlap) {\n for (var _i4 = 0; _i4 < nodes.length; _i4++) {\n var n = nodes[_i4];\n var nbb = n.layoutDimensions(options);\n var w = nbb.w;\n var h = nbb.h;\n minDistance = Math.max(minDistance, w, h);\n }\n } // get the weighted percent for an element based on its connectivity to other levels\n\n\n var cachedWeightedPercent = {};\n\n var getWeightedPercent = function getWeightedPercent(ele) {\n if (cachedWeightedPercent[ele.id()]) {\n return cachedWeightedPercent[ele.id()];\n }\n\n var eleDepth = getInfo(ele).depth;\n var neighbors = ele.neighborhood();\n var percent = 0;\n var samples = 0;\n\n for (var _i5 = 0; _i5 < neighbors.length; _i5++) {\n var neighbor = neighbors[_i5];\n\n if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) {\n continue;\n }\n\n var bf = getInfo(neighbor);\n\n if (bf == null) {\n continue;\n }\n\n var index = bf.index;\n var depth = bf.depth; // unassigned neighbours shouldn't affect the ordering\n\n if (index == null || depth == null) {\n continue;\n }\n\n var nDepth = depths[depth].length;\n\n if (depth < eleDepth) {\n // only get influenced by elements above\n percent += index / nDepth;\n samples++;\n }\n }\n\n samples = Math.max(1, samples);\n percent = percent / samples;\n\n if (samples === 0) {\n // put lone nodes at the start\n percent = 0;\n }\n\n cachedWeightedPercent[ele.id()] = percent;\n return percent;\n }; // rearrange the indices in each depth level based on connectivity\n\n\n var sortFn = function sortFn(a, b) {\n var apct = getWeightedPercent(a);\n var bpct = getWeightedPercent(b);\n var diff = apct - bpct;\n\n if (diff === 0) {\n return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons\n } else {\n return diff;\n }\n }; // sort each level to make connected nodes closer\n\n\n for (var _i6 = 0; _i6 < depths.length; _i6++) {\n depths[_i6].sort(sortFn);\n\n assignDepthsAt(_i6);\n } // assign orphan nodes to a new top-level depth\n\n\n var orphanDepth = [];\n\n for (var _i7 = 0; _i7 < orphanNodes.length; _i7++) {\n orphanDepth.push(orphanNodes[_i7]);\n }\n\n depths.unshift(orphanDepth);\n assignDepths();\n var biggestDepthSize = 0;\n\n for (var _i8 = 0; _i8 < depths.length; _i8++) {\n biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize);\n }\n\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.x1 + bb.h / 2\n };\n var maxDepthSize = depths.reduce(function (max, eles) {\n return Math.max(max, eles.length);\n }, 0);\n\n var getPosition = function getPosition(ele) {\n var _getInfo2 = getInfo(ele),\n depth = _getInfo2.depth,\n index = _getInfo2.index;\n\n var depthSize = depths[depth].length;\n var distanceX = Math.max(bb.w / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance);\n var distanceY = Math.max(bb.h / (depths.length + 1), minDistance);\n var radiusStepSize = Math.min(bb.w / 2 / depths.length, bb.h / 2 / depths.length);\n radiusStepSize = Math.max(radiusStepSize, minDistance);\n\n if (!options.circle) {\n var epos = {\n x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX,\n y: (depth + 1) * distanceY\n };\n return epos;\n } else {\n var radius = radiusStepSize * depth + radiusStepSize - (depths.length > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0);\n var theta = 2 * Math.PI / depths[depth].length * index;\n\n if (depth === 0 && depths[0].length === 1) {\n radius = 1;\n }\n\n return {\n x: center.x + radius * Math.cos(theta),\n y: center.y + radius * Math.sin(theta)\n };\n }\n };\n\n eles.nodes().layoutPositions(this, options, getPosition);\n return this; // chaining\n};\n\nvar defaults$a = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox and radius if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n radius: undefined,\n // the radius of the circle\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: undefined,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: true,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n sort: undefined,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n\n};\n\nfunction CircleLayout(options) {\n this.options = extend({}, defaults$a, options);\n}\n\nCircleLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var cy = params.cy;\n var eles = options.eles;\n var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise;\n var nodes = eles.nodes().not(':parent');\n\n if (options.sort) {\n nodes = nodes.sort(options.sort);\n }\n\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.y1 + bb.h / 2\n };\n var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep;\n var dTheta = sweep / Math.max(1, nodes.length - 1);\n var r;\n var minDistance = 0;\n\n for (var i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n var nbb = n.layoutDimensions(options);\n var w = nbb.w;\n var h = nbb.h;\n minDistance = Math.max(minDistance, w, h);\n }\n\n if (number(options.radius)) {\n r = options.radius;\n } else if (nodes.length <= 1) {\n r = 0;\n } else {\n r = Math.min(bb.h, bb.w) / 2 - minDistance;\n } // calculate the radius\n\n\n if (nodes.length > 1 && options.avoidOverlap) {\n // but only if more than one node (can't overlap)\n minDistance *= 1.75; // just to have some nice spacing\n\n var dcos = Math.cos(dTheta) - Math.cos(0);\n var dsin = Math.sin(dTheta) - Math.sin(0);\n var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping\n\n r = Math.max(rMin, r);\n }\n\n var getPos = function getPos(ele, i) {\n var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1);\n var rx = r * Math.cos(theta);\n var ry = r * Math.sin(theta);\n var pos = {\n x: center.x + rx,\n y: center.y + ry\n };\n return pos;\n };\n\n eles.nodes().layoutPositions(this, options, getPos);\n return this; // chaining\n};\n\nvar defaults$b = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: undefined,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: true,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n equidistant: false,\n // whether levels have an equal radial distance betwen them, may cause bounding box overflow\n minNodeSpacing: 10,\n // min spacing between outside of nodes (used for radius adjustment)\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n height: undefined,\n // height of layout area (overrides container height)\n width: undefined,\n // width of layout area (overrides container width)\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n concentric: function concentric(node) {\n // returns numeric value for each node, placing higher nodes in levels towards the centre\n return node.degree();\n },\n levelWidth: function levelWidth(nodes) {\n // the variation of concentric values in each level\n return nodes.maxDegree() / 4;\n },\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n\n};\n\nfunction ConcentricLayout(options) {\n this.options = extend({}, defaults$b, options);\n}\n\nConcentricLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise;\n var cy = params.cy;\n var eles = options.eles;\n var nodes = eles.nodes().not(':parent');\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n var center = {\n x: bb.x1 + bb.w / 2,\n y: bb.y1 + bb.h / 2\n };\n var nodeValues = []; // { node, value }\n\n var maxNodeSize = 0;\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var value = void 0; // calculate the node value\n\n value = options.concentric(node);\n nodeValues.push({\n value: value,\n node: node\n }); // for style mapping\n\n node._private.scratch.concentric = value;\n } // in case we used the `concentric` in style\n\n\n nodes.updateStyle(); // calculate max size now based on potentially updated mappers\n\n for (var _i = 0; _i < nodes.length; _i++) {\n var _node = nodes[_i];\n\n var nbb = _node.layoutDimensions(options);\n\n maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h);\n } // sort node values in descreasing order\n\n\n nodeValues.sort(function (a, b) {\n return b.value - a.value;\n });\n var levelWidth = options.levelWidth(nodes); // put the values into levels\n\n var levels = [[]];\n var currentLevel = levels[0];\n\n for (var _i2 = 0; _i2 < nodeValues.length; _i2++) {\n var val = nodeValues[_i2];\n\n if (currentLevel.length > 0) {\n var diff = Math.abs(currentLevel[0].value - val.value);\n\n if (diff >= levelWidth) {\n currentLevel = [];\n levels.push(currentLevel);\n }\n }\n\n currentLevel.push(val);\n } // create positions from levels\n\n\n var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes\n\n if (!options.avoidOverlap) {\n // then strictly constrain to bb\n var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1;\n var maxR = Math.min(bb.w, bb.h) / 2 - minDist;\n var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0);\n minDist = Math.min(minDist, rStep);\n } // find the metrics for each level\n\n\n var r = 0;\n\n for (var _i3 = 0; _i3 < levels.length; _i3++) {\n var level = levels[_i3];\n var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep;\n var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1); // calculate the radius\n\n if (level.length > 1 && options.avoidOverlap) {\n // but only if more than one node (can't overlap)\n var dcos = Math.cos(dTheta) - Math.cos(0);\n var dsin = Math.sin(dTheta) - Math.sin(0);\n var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping\n\n r = Math.max(rMin, r);\n }\n\n level.r = r;\n r += minDist;\n }\n\n if (options.equidistant) {\n var rDeltaMax = 0;\n var _r = 0;\n\n for (var _i4 = 0; _i4 < levels.length; _i4++) {\n var _level = levels[_i4];\n var rDelta = _level.r - _r;\n rDeltaMax = Math.max(rDeltaMax, rDelta);\n }\n\n _r = 0;\n\n for (var _i5 = 0; _i5 < levels.length; _i5++) {\n var _level2 = levels[_i5];\n\n if (_i5 === 0) {\n _r = _level2.r;\n }\n\n _level2.r = _r;\n _r += rDeltaMax;\n }\n } // calculate the node positions\n\n\n var pos = {}; // id => position\n\n for (var _i6 = 0; _i6 < levels.length; _i6++) {\n var _level3 = levels[_i6];\n var _dTheta = _level3.dTheta;\n var _r2 = _level3.r;\n\n for (var j = 0; j < _level3.length; j++) {\n var _val = _level3[j];\n var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j;\n var p = {\n x: center.x + _r2 * Math.cos(theta),\n y: center.y + _r2 * Math.sin(theta)\n };\n pos[_val.node.id()] = p;\n }\n } // position the nodes\n\n\n eles.nodes().layoutPositions(this, options, function (ele) {\n var id = ele.id();\n return pos[id];\n });\n return this; // chaining\n};\n\n/*\nThe CoSE layout was written by Gerardo Huck.\nhttps://www.linkedin.com/in/gerardohuck/\n\nBased on the following article:\nhttp://dl.acm.org/citation.cfm?id=1498047\n\nModifications tracked on Github.\n*/\nvar DEBUG;\n/**\n * @brief : default layout options\n */\n\nvar defaults$c = {\n // Called on `layoutready`\n ready: function ready() {},\n // Called on `layoutstop`\n stop: function stop() {},\n // Whether to animate while running the layout\n // true : Animate continuously as the layout is running\n // false : Just show the end result\n // 'end' : Animate with the end result, from the initial positions to the end positions\n animate: true,\n // Easing of the animation for animate:'end'\n animationEasing: undefined,\n // The duration of the animation for animate:'end'\n animationDuration: undefined,\n // A function that determines whether the node should be animated\n // All nodes animated by default on animate enabled\n // Non-animated nodes are positioned immediately when the layout starts\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // The layout animates only after this many milliseconds for animate:true\n // (prevents flashing on fast runs)\n animationThreshold: 250,\n // Number of iterations between consecutive screen positions update\n refresh: 20,\n // Whether to fit the network view after when done\n fit: true,\n // Padding on fit\n padding: 30,\n // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n boundingBox: undefined,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n nodeDimensionsIncludeLabels: false,\n // Randomize the initial positions of the nodes (true) or use existing positions (false)\n randomize: false,\n // Extra spacing between components in non-compound graphs\n componentSpacing: 40,\n // Node repulsion (non overlapping) multiplier\n nodeRepulsion: function nodeRepulsion(node) {\n return 2048;\n },\n // Node repulsion (overlapping) multiplier\n nodeOverlap: 4,\n // Ideal edge (non nested) length\n idealEdgeLength: function idealEdgeLength(edge) {\n return 32;\n },\n // Divisor to compute edge forces\n edgeElasticity: function edgeElasticity(edge) {\n return 32;\n },\n // Nesting factor (multiplier) to compute ideal edge length for nested edges\n nestingFactor: 1.2,\n // Gravity force (constant)\n gravity: 1,\n // Maximum number of iterations to perform\n numIter: 1000,\n // Initial temperature (maximum node displacement)\n initialTemp: 1000,\n // Cooling factor (how the temperature is reduced between consecutive iterations\n coolingFactor: 0.99,\n // Lower temperature threshold (below this point the layout will end)\n minTemp: 1.0\n};\n/**\n * @brief : constructor\n * @arg options : object containing layout options\n */\n\nfunction CoseLayout(options) {\n this.options = extend({}, defaults$c, options);\n this.options.layout = this;\n}\n/**\n * @brief : runs the layout\n */\n\n\nCoseLayout.prototype.run = function () {\n var options = this.options;\n var cy = options.cy;\n var layout = this;\n layout.stopped = false;\n\n if (options.animate === true || options.animate === false) {\n layout.emit({\n type: 'layoutstart',\n layout: layout\n });\n } // Set DEBUG - Global variable\n\n\n if (true === options.debug) {\n DEBUG = true;\n } else {\n DEBUG = false;\n } // Initialize layout info\n\n\n var layoutInfo = createLayoutInfo(cy, layout, options); // Show LayoutInfo contents if debugging\n\n if (DEBUG) {\n printLayoutInfo(layoutInfo);\n } // If required, randomize node positions\n\n\n if (options.randomize) {\n randomizePositions(layoutInfo);\n }\n\n var startTime = performanceNow();\n\n var refresh = function refresh() {\n refreshPositions(layoutInfo, cy, options); // Fit the graph if necessary\n\n if (true === options.fit) {\n cy.fit(options.padding);\n }\n };\n\n var mainLoop = function mainLoop(i) {\n if (layout.stopped || i >= options.numIter) {\n // logDebug(\"Layout manually stopped. Stopping computation in step \" + i);\n return false;\n } // Do one step in the phisical simulation\n\n\n step$1(layoutInfo, options); // Update temperature\n\n layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor; // logDebug(\"New temperature: \" + layoutInfo.temperature);\n\n if (layoutInfo.temperature < options.minTemp) {\n // logDebug(\"Temperature drop below minimum threshold. Stopping computation in step \" + i);\n return false;\n }\n\n return true;\n };\n\n var done = function done() {\n if (options.animate === true || options.animate === false) {\n refresh(); // Layout has finished\n\n layout.one('layoutstop', options.stop);\n layout.emit({\n type: 'layoutstop',\n layout: layout\n });\n } else {\n var nodes = options.eles.nodes();\n var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes);\n nodes.layoutPositions(layout, options, getScaledPos);\n }\n };\n\n var i = 0;\n var loopRet = true;\n\n if (options.animate === true) {\n var frame = function frame() {\n var f = 0;\n\n while (loopRet && f < options.refresh) {\n loopRet = mainLoop(i);\n i++;\n f++;\n }\n\n if (!loopRet) {\n // it's done\n separateComponents(layoutInfo, options);\n done();\n } else {\n var now = performanceNow();\n\n if (now - startTime >= options.animationThreshold) {\n refresh();\n }\n\n requestAnimationFrame(frame);\n }\n };\n\n frame();\n } else {\n while (loopRet) {\n loopRet = mainLoop(i);\n i++;\n }\n\n separateComponents(layoutInfo, options);\n done();\n }\n\n return this; // chaining\n};\n/**\n * @brief : called on continuous layouts to stop them before they finish\n */\n\n\nCoseLayout.prototype.stop = function () {\n this.stopped = true;\n\n if (this.thread) {\n this.thread.stop();\n }\n\n this.emit('layoutstop');\n return this; // chaining\n};\n\nCoseLayout.prototype.destroy = function () {\n if (this.thread) {\n this.thread.stop();\n }\n\n return this; // chaining\n};\n/**\n * @brief : Creates an object which is contains all the data\n * used in the layout process\n * @arg cy : cytoscape.js object\n * @return : layoutInfo object initialized\n */\n\n\nvar createLayoutInfo = function createLayoutInfo(cy, layout, options) {\n // Shortcut\n var edges = options.eles.edges();\n var nodes = options.eles.nodes();\n var layoutInfo = {\n isCompound: cy.hasCompoundNodes(),\n layoutNodes: [],\n idToIndex: {},\n nodeSize: nodes.size(),\n graphSet: [],\n indexToGraph: [],\n layoutEdges: [],\n edgeSize: edges.size(),\n temperature: options.initialTemp,\n clientWidth: cy.width(),\n clientHeight: cy.width(),\n boundingBox: makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n })\n };\n var components = options.eles.components();\n var id2cmptId = {};\n\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n\n for (var j = 0; j < component.length; j++) {\n var node = component[j];\n id2cmptId[node.id()] = i;\n }\n } // Iterate over all nodes, creating layout nodes\n\n\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = nodes[i];\n var nbb = n.layoutDimensions(options);\n var tempNode = {};\n tempNode.isLocked = n.locked();\n tempNode.id = n.data('id');\n tempNode.parentId = n.data('parent');\n tempNode.cmptId = id2cmptId[n.id()];\n tempNode.children = [];\n tempNode.positionX = n.position('x');\n tempNode.positionY = n.position('y');\n tempNode.offsetX = 0;\n tempNode.offsetY = 0;\n tempNode.height = nbb.w;\n tempNode.width = nbb.h;\n tempNode.maxX = tempNode.positionX + tempNode.width / 2;\n tempNode.minX = tempNode.positionX - tempNode.width / 2;\n tempNode.maxY = tempNode.positionY + tempNode.height / 2;\n tempNode.minY = tempNode.positionY - tempNode.height / 2;\n tempNode.padLeft = parseFloat(n.style('padding'));\n tempNode.padRight = parseFloat(n.style('padding'));\n tempNode.padTop = parseFloat(n.style('padding'));\n tempNode.padBottom = parseFloat(n.style('padding')); // forces\n\n tempNode.nodeRepulsion = fn(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion; // Add new node\n\n layoutInfo.layoutNodes.push(tempNode); // Add entry to id-index map\n\n layoutInfo.idToIndex[tempNode.id] = i;\n } // Inline implementation of a queue, used for traversing the graph in BFS order\n\n\n var queue = [];\n var start = 0; // Points to the start the queue\n\n var end = -1; // Points to the end of the queue\n\n var tempGraph = []; // Second pass to add child information and\n // initialize queue for hierarchical traversal\n\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n var p_id = n.parentId; // Check if node n has a parent node\n\n if (null != p_id) {\n // Add node Id to parent's list of children\n layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id);\n } else {\n // If a node doesn't have a parent, then it's in the root graph\n queue[++end] = n.id;\n tempGraph.push(n.id);\n }\n } // Add root graph to graphSet\n\n\n layoutInfo.graphSet.push(tempGraph); // Traverse the graph, level by level,\n\n while (start <= end) {\n // Get the node to visit and remove it from queue\n var node_id = queue[start++];\n var node_ix = layoutInfo.idToIndex[node_id];\n var node = layoutInfo.layoutNodes[node_ix];\n var children = node.children;\n\n if (children.length > 0) {\n // Add children nodes as a new graph to graph set\n layoutInfo.graphSet.push(children); // Add children to que queue to be visited\n\n for (var i = 0; i < children.length; i++) {\n queue[++end] = children[i];\n }\n }\n } // Create indexToGraph map\n\n\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n\n for (var j = 0; j < graph.length; j++) {\n var index = layoutInfo.idToIndex[graph[j]];\n layoutInfo.indexToGraph[index] = i;\n }\n } // Iterate over all edges, creating Layout Edges\n\n\n for (var i = 0; i < layoutInfo.edgeSize; i++) {\n var e = edges[i];\n var tempEdge = {};\n tempEdge.id = e.data('id');\n tempEdge.sourceId = e.data('source');\n tempEdge.targetId = e.data('target'); // Compute ideal length\n\n var idealLength = fn(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength;\n var elasticity = fn(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity; // Check if it's an inter graph edge\n\n var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId];\n var targetIx = layoutInfo.idToIndex[tempEdge.targetId];\n var sourceGraph = layoutInfo.indexToGraph[sourceIx];\n var targetGraph = layoutInfo.indexToGraph[targetIx];\n\n if (sourceGraph != targetGraph) {\n // Find lowest common graph ancestor\n var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo); // Compute sum of node depths, relative to lca graph\n\n var lcaGraph = layoutInfo.graphSet[lca];\n var depth = 0; // Source depth\n\n var tempNode = layoutInfo.layoutNodes[sourceIx];\n\n while (-1 === lcaGraph.indexOf(tempNode.id)) {\n tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]];\n depth++;\n } // Target depth\n\n\n tempNode = layoutInfo.layoutNodes[targetIx];\n\n while (-1 === lcaGraph.indexOf(tempNode.id)) {\n tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]];\n depth++;\n } // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId +\n // \". Index: \" + lca + \" Contents: \" + lcaGraph.toString() +\n // \". Depth: \" + depth);\n // Update idealLength\n\n\n idealLength *= depth * options.nestingFactor;\n }\n\n tempEdge.idealLength = idealLength;\n tempEdge.elasticity = elasticity;\n layoutInfo.layoutEdges.push(tempEdge);\n } // Finally, return layoutInfo object\n\n\n return layoutInfo;\n};\n/**\n * @brief : This function finds the index of the lowest common\n * graph ancestor between 2 nodes in the subtree\n * (from the graph hierarchy induced tree) whose\n * root is graphIx\n *\n * @arg node1: node1's ID\n * @arg node2: node2's ID\n * @arg layoutInfo: layoutInfo object\n *\n */\n\n\nvar findLCA = function findLCA(node1, node2, layoutInfo) {\n // Find their common ancester, starting from the root graph\n var res = findLCA_aux(node1, node2, 0, layoutInfo);\n\n if (2 > res.count) {\n // If aux function couldn't find the common ancester,\n // then it is the root graph\n return 0;\n } else {\n return res.graph;\n }\n};\n/**\n * @brief : Auxiliary function used for LCA computation\n *\n * @arg node1 : node1's ID\n * @arg node2 : node2's ID\n * @arg graphIx : subgraph index\n * @arg layoutInfo : layoutInfo object\n *\n * @return : object of the form {count: X, graph: Y}, where:\n * X is the number of ancesters (max: 2) found in\n * graphIx (and it's subgraphs),\n * Y is the graph index of the lowest graph containing\n * all X nodes\n */\n\n\nvar findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) {\n var graph = layoutInfo.graphSet[graphIx]; // If both nodes belongs to graphIx\n\n if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) {\n return {\n count: 2,\n graph: graphIx\n };\n } // Make recursive calls for all subgraphs\n\n\n var c = 0;\n\n for (var i = 0; i < graph.length; i++) {\n var nodeId = graph[i];\n var nodeIx = layoutInfo.idToIndex[nodeId];\n var children = layoutInfo.layoutNodes[nodeIx].children; // If the node has no child, skip it\n\n if (0 === children.length) {\n continue;\n }\n\n var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]];\n var result = findLCA_aux(node1, node2, childGraphIx, layoutInfo);\n\n if (0 === result.count) {\n // Neither node1 nor node2 are present in this subgraph\n continue;\n } else if (1 === result.count) {\n // One of (node1, node2) is present in this subgraph\n c++;\n\n if (2 === c) {\n // We've already found both nodes, no need to keep searching\n break;\n }\n } else {\n // Both nodes are present in this subgraph\n return result;\n }\n }\n\n return {\n count: c,\n graph: graphIx\n };\n};\n/**\n * @brief: printsLayoutInfo into js console\n * Only used for debbuging\n */\n\n\nif (false) // removed by dead control flow\n{ var printLayoutInfo; }\n/**\n * @brief : Randomizes the position of all nodes\n */\n\n\nvar randomizePositions = function randomizePositions(layoutInfo, cy) {\n var width = layoutInfo.clientWidth;\n var height = layoutInfo.clientHeight;\n\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i]; // No need to randomize compound nodes or locked nodes\n\n if (0 === n.children.length && !n.isLocked) {\n n.positionX = Math.random() * width;\n n.positionY = Math.random() * height;\n }\n }\n};\n\nvar getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) {\n var bb = layoutInfo.boundingBox;\n var coseBB = {\n x1: Infinity,\n x2: -Infinity,\n y1: Infinity,\n y2: -Infinity\n };\n\n if (options.boundingBox) {\n nodes.forEach(function (node) {\n var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]];\n coseBB.x1 = Math.min(coseBB.x1, lnode.positionX);\n coseBB.x2 = Math.max(coseBB.x2, lnode.positionX);\n coseBB.y1 = Math.min(coseBB.y1, lnode.positionY);\n coseBB.y2 = Math.max(coseBB.y2, lnode.positionY);\n });\n coseBB.w = coseBB.x2 - coseBB.x1;\n coseBB.h = coseBB.y2 - coseBB.y1;\n }\n\n return function (ele, i) {\n var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]];\n\n if (options.boundingBox) {\n // then add extra bounding box constraint\n var pctX = (lnode.positionX - coseBB.x1) / coseBB.w;\n var pctY = (lnode.positionY - coseBB.y1) / coseBB.h;\n return {\n x: bb.x1 + pctX * bb.w,\n y: bb.y1 + pctY * bb.h\n };\n } else {\n return {\n x: lnode.positionX,\n y: lnode.positionY\n };\n }\n };\n};\n/**\n * @brief : Updates the positions of nodes in the network\n * @arg layoutInfo : LayoutInfo object\n * @arg cy : Cytoscape object\n * @arg options : Layout options\n */\n\n\nvar refreshPositions = function refreshPositions(layoutInfo, cy, options) {\n // var s = 'Refreshing positions';\n // logDebug(s);\n var layout = options.layout;\n var nodes = options.eles.nodes();\n var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes);\n nodes.positions(getScaledPos); // Trigger layoutReady only on first call\n\n if (true !== layoutInfo.ready) {\n // s = 'Triggering layoutready';\n // logDebug(s);\n layoutInfo.ready = true;\n layout.one('layoutready', options.ready);\n layout.emit({\n type: 'layoutready',\n layout: this\n });\n }\n};\n/**\n * @brief : Logs a debug message in JS console, if DEBUG is ON\n */\n// var logDebug = function(text) {\n// if (DEBUG) {\n// console.debug(text);\n// }\n// };\n\n/**\n * @brief : Performs one iteration of the physical simulation\n * @arg layoutInfo : LayoutInfo object already initialized\n * @arg cy : Cytoscape object\n * @arg options : Layout options\n */\n\n\nvar step$1 = function step(layoutInfo, options, _step) {\n // var s = \"\\n\\n###############################\";\n // s += \"\\nSTEP: \" + step;\n // s += \"\\n###############################\\n\";\n // logDebug(s);\n // Calculate node repulsions\n calculateNodeForces(layoutInfo, options); // Calculate edge forces\n\n calculateEdgeForces(layoutInfo); // Calculate gravity forces\n\n calculateGravityForces(layoutInfo, options); // Propagate forces from parent to child\n\n propagateForces(layoutInfo); // Update positions based on calculated forces\n\n updatePositions(layoutInfo);\n};\n/**\n * @brief : Computes the node repulsion forces\n */\n\n\nvar calculateNodeForces = function calculateNodeForces(layoutInfo, options) {\n // Go through each of the graphs in graphSet\n // Nodes only repel each other if they belong to the same graph\n // var s = 'calculateNodeForces';\n // logDebug(s);\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n var numNodes = graph.length; // s = \"Set: \" + graph.toString();\n // logDebug(s);\n // Now get all the pairs of nodes\n // Only get each pair once, (A, B) = (B, A)\n\n for (var j = 0; j < numNodes; j++) {\n var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]];\n\n for (var k = j + 1; k < numNodes; k++) {\n var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]];\n nodeRepulsion(node1, node2, layoutInfo, options);\n }\n }\n }\n};\n\nvar randomDistance = function randomDistance(max) {\n return -max + 2 * max * Math.random();\n};\n/**\n * @brief : Compute the node repulsion forces between a pair of nodes\n */\n\n\nvar nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) {\n // var s = \"Node repulsion. Node1: \" + node1.id + \" Node2: \" + node2.id;\n var cmptId1 = node1.cmptId;\n var cmptId2 = node2.cmptId;\n\n if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) {\n return;\n } // Get direction of line connecting both node centers\n\n\n var directionX = node2.positionX - node1.positionX;\n var directionY = node2.positionY - node1.positionY;\n var maxRandDist = 1; // s += \"\\ndirectionX: \" + directionX + \", directionY: \" + directionY;\n // If both centers are the same, apply a random force\n\n if (0 === directionX && 0 === directionY) {\n directionX = randomDistance(maxRandDist);\n directionY = randomDistance(maxRandDist);\n }\n\n var overlap = nodesOverlap(node1, node2, directionX, directionY);\n\n if (overlap > 0) {\n // s += \"\\nNodes DO overlap.\";\n // s += \"\\nOverlap: \" + overlap;\n // If nodes overlap, repulsion force is proportional\n // to the overlap\n var force = options.nodeOverlap * overlap; // Compute the module and components of the force vector\n\n var distance = Math.sqrt(directionX * directionX + directionY * directionY); // s += \"\\nDistance: \" + distance;\n\n var forceX = force * directionX / distance;\n var forceY = force * directionY / distance;\n } else {\n // s += \"\\nNodes do NOT overlap.\";\n // If there's no overlap, force is inversely proportional\n // to squared distance\n // Get clipping points for both nodes\n var point1 = findClippingPoint(node1, directionX, directionY);\n var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY); // Use clipping points to compute distance\n\n var distanceX = point2.x - point1.x;\n var distanceY = point2.y - point1.y;\n var distanceSqr = distanceX * distanceX + distanceY * distanceY;\n var distance = Math.sqrt(distanceSqr); // s += \"\\nDistance: \" + distance;\n // Compute the module and components of the force vector\n\n var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr;\n var forceX = force * distanceX / distance;\n var forceY = force * distanceY / distance;\n } // Apply force\n\n\n if (!node1.isLocked) {\n node1.offsetX -= forceX;\n node1.offsetY -= forceY;\n }\n\n if (!node2.isLocked) {\n node2.offsetX += forceX;\n node2.offsetY += forceY;\n } // s += \"\\nForceX: \" + forceX + \" ForceY: \" + forceY;\n // logDebug(s);\n\n\n return;\n};\n/**\n * @brief : Determines whether two nodes overlap or not\n * @return : Amount of overlapping (0 => no overlap)\n */\n\n\nvar nodesOverlap = function nodesOverlap(node1, node2, dX, dY) {\n if (dX > 0) {\n var overlapX = node1.maxX - node2.minX;\n } else {\n var overlapX = node2.maxX - node1.minX;\n }\n\n if (dY > 0) {\n var overlapY = node1.maxY - node2.minY;\n } else {\n var overlapY = node2.maxY - node1.minY;\n }\n\n if (overlapX >= 0 && overlapY >= 0) {\n return Math.sqrt(overlapX * overlapX + overlapY * overlapY);\n } else {\n return 0;\n }\n};\n/**\n * @brief : Finds the point in which an edge (direction dX, dY) intersects\n * the rectangular bounding box of it's source/target node\n */\n\n\nvar findClippingPoint = function findClippingPoint(node, dX, dY) {\n // Shorcuts\n var X = node.positionX;\n var Y = node.positionY;\n var H = node.height || 1;\n var W = node.width || 1;\n var dirSlope = dY / dX;\n var nodeSlope = H / W; // var s = 'Computing clipping point of node ' + node.id +\n // \" . Height: \" + H + \", Width: \" + W +\n // \"\\nDirection \" + dX + \", \" + dY;\n //\n // Compute intersection\n\n var res = {}; // Case: Vertical direction (up)\n\n if (0 === dX && 0 < dY) {\n res.x = X; // s += \"\\nUp direction\";\n\n res.y = Y + H / 2;\n return res;\n } // Case: Vertical direction (down)\n\n\n if (0 === dX && 0 > dY) {\n res.x = X;\n res.y = Y + H / 2; // s += \"\\nDown direction\";\n\n return res;\n } // Case: Intersects the right border\n\n\n if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) {\n res.x = X + W / 2;\n res.y = Y + W * dY / 2 / dX; // s += \"\\nRightborder\";\n\n return res;\n } // Case: Intersects the left border\n\n\n if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) {\n res.x = X - W / 2;\n res.y = Y - W * dY / 2 / dX; // s += \"\\nLeftborder\";\n\n return res;\n } // Case: Intersects the top border\n\n\n if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) {\n res.x = X + H * dX / 2 / dY;\n res.y = Y + H / 2; // s += \"\\nTop border\";\n\n return res;\n } // Case: Intersects the bottom border\n\n\n if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) {\n res.x = X - H * dX / 2 / dY;\n res.y = Y - H / 2; // s += \"\\nBottom border\";\n\n return res;\n } // s += \"\\nClipping point found at \" + res.x + \", \" + res.y;\n // logDebug(s);\n\n\n return res;\n};\n/**\n * @brief : Calculates all edge forces\n */\n\n\nvar calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) {\n // Iterate over all edges\n for (var i = 0; i < layoutInfo.edgeSize; i++) {\n // Get edge, source & target nodes\n var edge = layoutInfo.layoutEdges[i];\n var sourceIx = layoutInfo.idToIndex[edge.sourceId];\n var source = layoutInfo.layoutNodes[sourceIx];\n var targetIx = layoutInfo.idToIndex[edge.targetId];\n var target = layoutInfo.layoutNodes[targetIx]; // Get direction of line connecting both node centers\n\n var directionX = target.positionX - source.positionX;\n var directionY = target.positionY - source.positionY; // If both centers are the same, do nothing.\n // A random force has already been applied as node repulsion\n\n if (0 === directionX && 0 === directionY) {\n continue;\n } // Get clipping points for both nodes\n\n\n var point1 = findClippingPoint(source, directionX, directionY);\n var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY);\n var lx = point2.x - point1.x;\n var ly = point2.y - point1.y;\n var l = Math.sqrt(lx * lx + ly * ly);\n var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity;\n\n if (0 !== l) {\n var forceX = force * lx / l;\n var forceY = force * ly / l;\n } else {\n var forceX = 0;\n var forceY = 0;\n } // Add this force to target and source nodes\n\n\n if (!source.isLocked) {\n source.offsetX += forceX;\n source.offsetY += forceY;\n }\n\n if (!target.isLocked) {\n target.offsetX -= forceX;\n target.offsetY -= forceY;\n } // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id;\n // s += \"\\nDistance: \" + l + \" Force: (\" + forceX + \", \" + forceY + \")\";\n // logDebug(s);\n\n }\n};\n/**\n * @brief : Computes gravity forces for all nodes\n */\n\n\nvar calculateGravityForces = function calculateGravityForces(layoutInfo, options) {\n var distThreshold = 1; // var s = 'calculateGravityForces';\n // logDebug(s);\n\n for (var i = 0; i < layoutInfo.graphSet.length; i++) {\n var graph = layoutInfo.graphSet[i];\n var numNodes = graph.length; // s = \"Set: \" + graph.toString();\n // logDebug(s);\n // Compute graph center\n\n if (0 === i) {\n var centerX = layoutInfo.clientHeight / 2;\n var centerY = layoutInfo.clientWidth / 2;\n } else {\n // Get Parent node for this graph, and use its position as center\n var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]];\n var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]];\n var centerX = parent.positionX;\n var centerY = parent.positionY;\n } // s = \"Center found at: \" + centerX + \", \" + centerY;\n // logDebug(s);\n // Apply force to all nodes in graph\n\n\n for (var j = 0; j < numNodes; j++) {\n var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; // s = \"Node: \" + node.id;\n\n if (node.isLocked) {\n continue;\n }\n\n var dx = centerX - node.positionX;\n var dy = centerY - node.positionY;\n var d = Math.sqrt(dx * dx + dy * dy);\n\n if (d > distThreshold) {\n var fx = options.gravity * dx / d;\n var fy = options.gravity * dy / d;\n node.offsetX += fx;\n node.offsetY += fy; // s += \": Applied force: \" + fx + \", \" + fy;\n } // s += \": skypped since it's too close to center\";\n // logDebug(s);\n\n }\n }\n};\n/**\n * @brief : This function propagates the existing offsets from\n * parent nodes to its descendents.\n * @arg layoutInfo : layoutInfo Object\n * @arg cy : cytoscape Object\n * @arg options : Layout options\n */\n\n\nvar propagateForces = function propagateForces(layoutInfo, options) {\n // Inline implementation of a queue, used for traversing the graph in BFS order\n var queue = [];\n var start = 0; // Points to the start the queue\n\n var end = -1; // Points to the end of the queue\n // logDebug('propagateForces');\n // Start by visiting the nodes in the root graph\n\n queue.push.apply(queue, layoutInfo.graphSet[0]);\n end += layoutInfo.graphSet[0].length; // Traverse the graph, level by level,\n\n while (start <= end) {\n // Get the node to visit and remove it from queue\n var nodeId = queue[start++];\n var nodeIndex = layoutInfo.idToIndex[nodeId];\n var node = layoutInfo.layoutNodes[nodeIndex];\n var children = node.children; // We only need to process the node if it's compound\n\n if (0 < children.length && !node.isLocked) {\n var offX = node.offsetX;\n var offY = node.offsetY; // var s = \"Propagating offset from parent node : \" + node.id +\n // \". OffsetX: \" + offX + \". OffsetY: \" + offY;\n // s += \"\\n Children: \" + children.toString();\n // logDebug(s);\n\n for (var i = 0; i < children.length; i++) {\n var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]]; // Propagate offset\n\n childNode.offsetX += offX;\n childNode.offsetY += offY; // Add children to queue to be visited\n\n queue[++end] = children[i];\n } // Reset parent offsets\n\n\n node.offsetX = 0;\n node.offsetY = 0;\n }\n }\n};\n/**\n * @brief : Updates the layout model positions, based on\n * the accumulated forces\n */\n\n\nvar updatePositions = function updatePositions(layoutInfo, options) {\n // var s = 'Updating positions';\n // logDebug(s);\n // Reset boundaries for compound nodes\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n\n if (0 < n.children.length) {\n // logDebug(\"Resetting boundaries of compound node: \" + n.id);\n n.maxX = undefined;\n n.minX = undefined;\n n.maxY = undefined;\n n.minY = undefined;\n }\n }\n\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n\n if (0 < n.children.length || n.isLocked) {\n // No need to set compound or locked node position\n // logDebug(\"Skipping position update of node: \" + n.id);\n continue;\n } // s = \"Node: \" + n.id + \" Previous position: (\" +\n // n.positionX + \", \" + n.positionY + \").\";\n // Limit displacement in order to improve stability\n\n\n var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature);\n n.positionX += tempForce.x;\n n.positionY += tempForce.y;\n n.offsetX = 0;\n n.offsetY = 0;\n n.minX = n.positionX - n.width;\n n.maxX = n.positionX + n.width;\n n.minY = n.positionY - n.height;\n n.maxY = n.positionY + n.height; // s += \" New Position: (\" + n.positionX + \", \" + n.positionY + \").\";\n // logDebug(s);\n // Update ancestry boudaries\n\n updateAncestryBoundaries(n, layoutInfo);\n } // Update size, position of compund nodes\n\n\n for (var i = 0; i < layoutInfo.nodeSize; i++) {\n var n = layoutInfo.layoutNodes[i];\n\n if (0 < n.children.length && !n.isLocked) {\n n.positionX = (n.maxX + n.minX) / 2;\n n.positionY = (n.maxY + n.minY) / 2;\n n.width = n.maxX - n.minX;\n n.height = n.maxY - n.minY; // s = \"Updating position, size of compound node \" + n.id;\n // s += \"\\nPositionX: \" + n.positionX + \", PositionY: \" + n.positionY;\n // s += \"\\nWidth: \" + n.width + \", Height: \" + n.height;\n // logDebug(s);\n }\n }\n};\n/**\n * @brief : Limits a force (forceX, forceY) to be not\n * greater (in modulo) than max.\n 8 Preserves force direction.\n */\n\n\nvar limitForce = function limitForce(forceX, forceY, max) {\n // var s = \"Limiting force: (\" + forceX + \", \" + forceY + \"). Max: \" + max;\n var force = Math.sqrt(forceX * forceX + forceY * forceY);\n\n if (force > max) {\n var res = {\n x: max * forceX / force,\n y: max * forceY / force\n };\n } else {\n var res = {\n x: forceX,\n y: forceY\n };\n } // s += \".\\nResult: (\" + res.x + \", \" + res.y + \")\";\n // logDebug(s);\n\n\n return res;\n};\n/**\n * @brief : Function used for keeping track of compound node\n * sizes, since they should bound all their subnodes.\n */\n\n\nvar updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) {\n // var s = \"Propagating new position/size of node \" + node.id;\n var parentId = node.parentId;\n\n if (null == parentId) {\n // If there's no parent, we are done\n // s += \". No parent node.\";\n // logDebug(s);\n return;\n } // Get Parent Node\n\n\n var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]];\n var flag = false; // MaxX\n\n if (null == p.maxX || node.maxX + p.padRight > p.maxX) {\n p.maxX = node.maxX + p.padRight;\n flag = true; // s += \"\\nNew maxX for parent node \" + p.id + \": \" + p.maxX;\n } // MinX\n\n\n if (null == p.minX || node.minX - p.padLeft < p.minX) {\n p.minX = node.minX - p.padLeft;\n flag = true; // s += \"\\nNew minX for parent node \" + p.id + \": \" + p.minX;\n } // MaxY\n\n\n if (null == p.maxY || node.maxY + p.padBottom > p.maxY) {\n p.maxY = node.maxY + p.padBottom;\n flag = true; // s += \"\\nNew maxY for parent node \" + p.id + \": \" + p.maxY;\n } // MinY\n\n\n if (null == p.minY || node.minY - p.padTop < p.minY) {\n p.minY = node.minY - p.padTop;\n flag = true; // s += \"\\nNew minY for parent node \" + p.id + \": \" + p.minY;\n } // If updated boundaries, propagate changes upward\n\n\n if (flag) {\n // logDebug(s);\n return updateAncestryBoundaries(p, layoutInfo);\n } // s += \". No changes in boundaries/position of parent node \" + p.id;\n // logDebug(s);\n\n\n return;\n};\n\nvar separateComponents = function separateComponents(layoutInfo, options) {\n var nodes = layoutInfo.layoutNodes;\n var components = [];\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var cid = node.cmptId;\n var component = components[cid] = components[cid] || [];\n component.push(node);\n }\n\n var totalA = 0;\n\n for (var i = 0; i < components.length; i++) {\n var c = components[i];\n\n if (!c) {\n continue;\n }\n\n c.x1 = Infinity;\n c.x2 = -Infinity;\n c.y1 = Infinity;\n c.y2 = -Infinity;\n\n for (var j = 0; j < c.length; j++) {\n var n = c[j];\n c.x1 = Math.min(c.x1, n.positionX - n.width / 2);\n c.x2 = Math.max(c.x2, n.positionX + n.width / 2);\n c.y1 = Math.min(c.y1, n.positionY - n.height / 2);\n c.y2 = Math.max(c.y2, n.positionY + n.height / 2);\n }\n\n c.w = c.x2 - c.x1;\n c.h = c.y2 - c.y1;\n totalA += c.w * c.h;\n }\n\n components.sort(function (c1, c2) {\n return c2.w * c2.h - c1.w * c1.h;\n });\n var x = 0;\n var y = 0;\n var usedW = 0;\n var rowH = 0;\n var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight;\n\n for (var i = 0; i < components.length; i++) {\n var c = components[i];\n\n if (!c) {\n continue;\n }\n\n for (var j = 0; j < c.length; j++) {\n var n = c[j];\n\n if (!n.isLocked) {\n n.positionX += x - c.x1;\n n.positionY += y - c.y1;\n }\n }\n\n x += c.w + options.componentSpacing;\n usedW += c.w + options.componentSpacing;\n rowH = Math.max(rowH, c.h);\n\n if (usedW > maxRowW) {\n y += rowH + options.componentSpacing;\n x = 0;\n usedW = 0;\n rowH = 0;\n }\n }\n};\n\nvar defaults$d = {\n fit: true,\n // whether to fit the viewport to the graph\n padding: 30,\n // padding used on fit\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: true,\n // prevents node overlap, may overflow boundingBox if not enough space\n avoidOverlapPadding: 10,\n // extra spacing around nodes when avoidOverlap: true\n nodeDimensionsIncludeLabels: false,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: undefined,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n condense: false,\n // uses all available space on false, uses minimal space on true\n rows: undefined,\n // force num of rows in the grid\n cols: undefined,\n // force num of columns in the grid\n position: function position(node) {},\n // returns { row, col } for element\n sort: undefined,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n\n};\n\nfunction GridLayout(options) {\n this.options = extend({}, defaults$d, options);\n}\n\nGridLayout.prototype.run = function () {\n var params = this.options;\n var options = params;\n var cy = params.cy;\n var eles = options.eles;\n var nodes = eles.nodes().not(':parent');\n\n if (options.sort) {\n nodes = nodes.sort(options.sort);\n }\n\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n\n if (bb.h === 0 || bb.w === 0) {\n eles.nodes().layoutPositions(this, options, function (ele) {\n return {\n x: bb.x1,\n y: bb.y1\n };\n });\n } else {\n // width/height * splits^2 = cells where splits is number of times to split width\n var cells = nodes.size();\n var splits = Math.sqrt(cells * bb.h / bb.w);\n var rows = Math.round(splits);\n var cols = Math.round(bb.w / bb.h * splits);\n\n var small = function small(val) {\n if (val == null) {\n return Math.min(rows, cols);\n } else {\n var min = Math.min(rows, cols);\n\n if (min == rows) {\n rows = val;\n } else {\n cols = val;\n }\n }\n };\n\n var large = function large(val) {\n if (val == null) {\n return Math.max(rows, cols);\n } else {\n var max = Math.max(rows, cols);\n\n if (max == rows) {\n rows = val;\n } else {\n cols = val;\n }\n }\n };\n\n var oRows = options.rows;\n var oCols = options.cols != null ? options.cols : options.columns; // if rows or columns were set in options, use those values\n\n if (oRows != null && oCols != null) {\n rows = oRows;\n cols = oCols;\n } else if (oRows != null && oCols == null) {\n rows = oRows;\n cols = Math.ceil(cells / rows);\n } else if (oRows == null && oCols != null) {\n cols = oCols;\n rows = Math.ceil(cells / cols);\n } // otherwise use the automatic values and adjust accordingly\n // if rounding was up, see if we can reduce rows or columns\n else if (cols * rows > cells) {\n var sm = small();\n var lg = large(); // reducing the small side takes away the most cells, so try it first\n\n if ((sm - 1) * lg >= cells) {\n small(sm - 1);\n } else if ((lg - 1) * sm >= cells) {\n large(lg - 1);\n }\n } else {\n // if rounding was too low, add rows or columns\n while (cols * rows < cells) {\n var _sm = small();\n\n var _lg = large(); // try to add to larger side first (adds less in multiplication)\n\n\n if ((_lg + 1) * _sm >= cells) {\n large(_lg + 1);\n } else {\n small(_sm + 1);\n }\n }\n }\n\n var cellWidth = bb.w / cols;\n var cellHeight = bb.h / rows;\n\n if (options.condense) {\n cellWidth = 0;\n cellHeight = 0;\n }\n\n if (options.avoidOverlap) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n var pos = node._private.position;\n\n if (pos.x == null || pos.y == null) {\n // for bb\n pos.x = 0;\n pos.y = 0;\n }\n\n var nbb = node.layoutDimensions(options);\n var p = options.avoidOverlapPadding;\n var w = nbb.w + p;\n var h = nbb.h + p;\n cellWidth = Math.max(cellWidth, w);\n cellHeight = Math.max(cellHeight, h);\n }\n }\n\n var cellUsed = {}; // e.g. 'c-0-2' => true\n\n var used = function used(row, col) {\n return cellUsed['c-' + row + '-' + col] ? true : false;\n };\n\n var use = function use(row, col) {\n cellUsed['c-' + row + '-' + col] = true;\n }; // to keep track of current cell position\n\n\n var row = 0;\n var col = 0;\n\n var moveToNextCell = function moveToNextCell() {\n col++;\n\n if (col >= cols) {\n col = 0;\n row++;\n }\n }; // get a cache of all the manual positions\n\n\n var id2manPos = {};\n\n for (var _i = 0; _i < nodes.length; _i++) {\n var _node = nodes[_i];\n var rcPos = options.position(_node);\n\n if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) {\n // must have at least row or col def'd\n var _pos = {\n row: rcPos.row,\n col: rcPos.col\n };\n\n if (_pos.col === undefined) {\n // find unused col\n _pos.col = 0;\n\n while (used(_pos.row, _pos.col)) {\n _pos.col++;\n }\n } else if (_pos.row === undefined) {\n // find unused row\n _pos.row = 0;\n\n while (used(_pos.row, _pos.col)) {\n _pos.row++;\n }\n }\n\n id2manPos[_node.id()] = _pos;\n use(_pos.row, _pos.col);\n }\n }\n\n var getPos = function getPos(element, i) {\n var x, y;\n\n if (element.locked() || element.isParent()) {\n return false;\n } // see if we have a manual position set\n\n\n var rcPos = id2manPos[element.id()];\n\n if (rcPos) {\n x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1;\n y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1;\n } else {\n // otherwise set automatically\n while (used(row, col)) {\n moveToNextCell();\n }\n\n x = col * cellWidth + cellWidth / 2 + bb.x1;\n y = row * cellHeight + cellHeight / 2 + bb.y1;\n use(row, col);\n moveToNextCell();\n }\n\n return {\n x: x,\n y: y\n };\n };\n\n nodes.layoutPositions(this, options, getPos);\n }\n\n return this; // chaining\n};\n\nvar defaults$e = {\n ready: function ready() {},\n // on layoutready\n stop: function stop() {} // on layoutstop\n\n}; // constructor\n// options : object containing layout options\n\nfunction NullLayout(options) {\n this.options = extend({}, defaults$e, options);\n} // runs the layout\n\n\nNullLayout.prototype.run = function () {\n var options = this.options;\n var eles = options.eles; // elements to consider in the layout\n\n var layout = this; // cy is automatically populated for us in the constructor\n // (disable eslint for next line as this serves as example layout code to external developers)\n // eslint-disable-next-line no-unused-vars\n\n var cy = options.cy;\n layout.emit('layoutstart'); // puts all nodes at (0, 0)\n // n.b. most layouts would use layoutPositions(), instead of positions() and manual events\n\n eles.nodes().positions(function () {\n return {\n x: 0,\n y: 0\n };\n }); // trigger layoutready when each node has had its position set at least once\n\n layout.one('layoutready', options.ready);\n layout.emit('layoutready'); // trigger layoutstop when the layout stops (e.g. finishes)\n\n layout.one('layoutstop', options.stop);\n layout.emit('layoutstop');\n return this; // chaining\n}; // called on continuous layouts to stop them before they finish\n\n\nNullLayout.prototype.stop = function () {\n return this; // chaining\n};\n\nvar defaults$f = {\n positions: undefined,\n // map of (node id) => (position obj); or function(node){ return somPos; }\n zoom: undefined,\n // the zoom level to set (prob want fit = false if set)\n pan: undefined,\n // the pan level to set (prob want fit = false if set)\n fit: true,\n // whether to fit to viewport\n padding: 30,\n // padding on fit\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts\n\n};\n\nfunction PresetLayout(options) {\n this.options = extend({}, defaults$f, options);\n}\n\nPresetLayout.prototype.run = function () {\n var options = this.options;\n var eles = options.eles;\n var nodes = eles.nodes();\n var posIsFn = fn(options.positions);\n\n function getPosition(node) {\n if (options.positions == null) {\n return copyPosition(node.position());\n }\n\n if (posIsFn) {\n return options.positions(node);\n }\n\n var pos = options.positions[node._private.data.id];\n\n if (pos == null) {\n return null;\n }\n\n return pos;\n }\n\n nodes.layoutPositions(this, options, function (node, i) {\n var position = getPosition(node);\n\n if (node.locked() || position == null) {\n return false;\n }\n\n return position;\n });\n return this; // chaining\n};\n\nvar defaults$g = {\n fit: true,\n // whether to fit to viewport\n padding: 30,\n // fit padding\n boundingBox: undefined,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n animate: false,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: undefined,\n // easing of animation if enabled\n animateFilter: function animateFilter(node, i) {\n return true;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: undefined,\n // callback on layoutready\n stop: undefined,\n // callback on layoutstop\n transform: function transform(node, position) {\n return position;\n } // transform a given node position. Useful for changing flow direction in discrete layouts \n\n};\n\nfunction RandomLayout(options) {\n this.options = extend({}, defaults$g, options);\n}\n\nRandomLayout.prototype.run = function () {\n var options = this.options;\n var cy = options.cy;\n var eles = options.eles;\n var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : {\n x1: 0,\n y1: 0,\n w: cy.width(),\n h: cy.height()\n });\n\n var getPos = function getPos(node, i) {\n return {\n x: bb.x1 + Math.round(Math.random() * bb.w),\n y: bb.y1 + Math.round(Math.random() * bb.h)\n };\n };\n\n eles.nodes().layoutPositions(this, options, getPos);\n return this; // chaining\n};\n\nvar layout = [{\n name: 'breadthfirst',\n impl: BreadthFirstLayout\n}, {\n name: 'circle',\n impl: CircleLayout\n}, {\n name: 'concentric',\n impl: ConcentricLayout\n}, {\n name: 'cose',\n impl: CoseLayout\n}, {\n name: 'grid',\n impl: GridLayout\n}, {\n name: 'null',\n impl: NullLayout\n}, {\n name: 'preset',\n impl: PresetLayout\n}, {\n name: 'random',\n impl: RandomLayout\n}];\n\nfunction NullRenderer(options) {\n this.options = options;\n this.notifications = 0; // for testing\n}\n\nvar noop$1 = function noop() {};\n\nvar throwImgErr = function throwImgErr() {\n throw new Error('A headless instance can not render images');\n};\n\nNullRenderer.prototype = {\n recalculateRenderedStyle: noop$1,\n notify: function notify() {\n this.notifications++;\n },\n init: noop$1,\n isHeadless: function isHeadless() {\n return true;\n },\n png: throwImgErr,\n jpg: throwImgErr\n};\n\nvar BRp = {};\nBRp.arrowShapeWidth = 0.3;\n\nBRp.registerArrowShapes = function () {\n var arrowShapes = this.arrowShapes = {};\n var renderer = this; // Contract for arrow shapes:\n // 0, 0 is arrow tip\n // (0, 1) is direction towards node\n // (1, 0) is right\n //\n // functional api:\n // collide: check x, y in shape\n // roughCollide: called before collide, no false negatives\n // draw: draw\n // spacing: dist(arrowTip, nodeBoundary)\n // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip\n\n var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) {\n var x1 = translation.x - size / 2 - padding;\n var x2 = translation.x + size / 2 + padding;\n var y1 = translation.y - size / 2 - padding;\n var y2 = translation.y + size / 2 + padding;\n var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2;\n return inside;\n };\n\n var transform = function transform(x, y, size, angle, translation) {\n var xRotated = x * Math.cos(angle) - y * Math.sin(angle);\n var yRotated = x * Math.sin(angle) + y * Math.cos(angle);\n var xScaled = xRotated * size;\n var yScaled = yRotated * size;\n var xTranslated = xScaled + translation.x;\n var yTranslated = yScaled + translation.y;\n return {\n x: xTranslated,\n y: yTranslated\n };\n };\n\n var transformPoints = function transformPoints(pts, size, angle, translation) {\n var retPts = [];\n\n for (var i = 0; i < pts.length; i += 2) {\n var x = pts[i];\n var y = pts[i + 1];\n retPts.push(transform(x, y, size, angle, translation));\n }\n\n return retPts;\n };\n\n var pointsToArr = function pointsToArr(pts) {\n var ret = [];\n\n for (var i = 0; i < pts.length; i++) {\n var p = pts[i];\n ret.push(p.x, p.y);\n }\n\n return ret;\n };\n\n var standardGap = function standardGap(edge) {\n return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2;\n };\n\n var defineArrowShape = function defineArrowShape(name, defn) {\n if (string(defn)) {\n defn = arrowShapes[defn];\n }\n\n arrowShapes[name] = extend({\n name: name,\n points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3],\n collide: function collide(x, y, size, angle, translation, padding) {\n var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, points);\n return inside;\n },\n roughCollide: bbCollide,\n draw: function draw(context, size, angle, translation) {\n var points = transformPoints(this.points, size, angle, translation);\n renderer.arrowShapeImpl('polygon')(context, points);\n },\n spacing: function spacing(edge) {\n return 0;\n },\n gap: standardGap\n }, defn);\n };\n\n defineArrowShape('none', {\n collide: falsify,\n roughCollide: falsify,\n draw: noop,\n spacing: zeroify,\n gap: zeroify\n });\n defineArrowShape('triangle', {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3]\n });\n defineArrowShape('arrow', 'triangle');\n defineArrowShape('triangle-backcurve', {\n points: arrowShapes['triangle'].points,\n controlPoint: [0, -0.15],\n roughCollide: bbCollide,\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var ptsTrans = transformPoints(this.points, size, angle, translation);\n var ctrlPt = this.controlPoint;\n var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans);\n },\n gap: function gap(edge) {\n return standardGap(edge) * 0.8;\n }\n });\n defineArrowShape('triangle-tee', {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4],\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.points, size, angle, translation);\n var teePts = transformPoints(this.pointsTee, size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, teePts);\n }\n });\n defineArrowShape('circle-triangle', {\n radius: 0.15,\n pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15],\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var t = translation;\n var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2);\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n return pointInsidePolygonPoints(x, y, triPts) || circleInside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.pointsTr, size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size);\n },\n spacing: function spacing(edge) {\n return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius;\n }\n });\n defineArrowShape('triangle-cross', {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n baseCrossLinePts: [-0.15, -0.4, // first half of the rectangle\n -0.15, -0.4, 0.15, -0.4, // second half of the rectangle\n 0.15, -0.4],\n crossLinePts: function crossLinePts(size, edgeWidth) {\n // shift points so that the distance between the cross points matches edge width\n var p = this.baseCrossLinePts.slice();\n var shiftFactor = edgeWidth / size;\n var y0 = 3;\n var y1 = 5;\n p[y0] = p[y0] - shiftFactor;\n p[y1] = p[y1] - shiftFactor;\n return p;\n },\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation));\n var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation));\n var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n var triPts = transformPoints(this.points, size, angle, translation);\n var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation);\n renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts);\n }\n });\n defineArrowShape('vee', {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15],\n gap: function gap(edge) {\n return standardGap(edge) * 0.525;\n }\n });\n defineArrowShape('circle', {\n radius: 0.15,\n collide: function collide(x, y, size, angle, translation, edgeWidth, padding) {\n var t = translation;\n var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2);\n return inside;\n },\n draw: function draw(context, size, angle, translation, edgeWidth) {\n renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size);\n },\n spacing: function spacing(edge) {\n return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius;\n }\n });\n defineArrowShape('tee', {\n points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0],\n spacing: function spacing(edge) {\n return 1;\n },\n gap: function gap(edge) {\n return 1;\n }\n });\n defineArrowShape('square', {\n points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3]\n });\n defineArrowShape('diamond', {\n points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0],\n gap: function gap(edge) {\n return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value;\n }\n });\n defineArrowShape('chevron', {\n points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15],\n gap: function gap(edge) {\n return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value;\n }\n });\n};\n\nvar BRp$1 = {}; // Project mouse\n\nBRp$1.projectIntoViewport = function (clientX, clientY) {\n var cy = this.cy;\n var offsets = this.findContainerClientCoords();\n var offsetLeft = offsets[0];\n var offsetTop = offsets[1];\n var scale = offsets[4];\n var pan = cy.pan();\n var zoom = cy.zoom();\n var x = ((clientX - offsetLeft) / scale - pan.x) / zoom;\n var y = ((clientY - offsetTop) / scale - pan.y) / zoom;\n return [x, y];\n};\n\nBRp$1.findContainerClientCoords = function () {\n if (this.containerBB) {\n return this.containerBB;\n }\n\n var container = this.container;\n var rect = container.getBoundingClientRect();\n var style = window$1.getComputedStyle(container);\n\n var styleValue = function styleValue(name) {\n return parseFloat(style.getPropertyValue(name));\n };\n\n var padding = {\n left: styleValue('padding-left'),\n right: styleValue('padding-right'),\n top: styleValue('padding-top'),\n bottom: styleValue('padding-bottom')\n };\n var border = {\n left: styleValue('border-left-width'),\n right: styleValue('border-right-width'),\n top: styleValue('border-top-width'),\n bottom: styleValue('border-bottom-width')\n };\n var clientWidth = container.clientWidth;\n var clientHeight = container.clientHeight;\n var paddingHor = padding.left + padding.right;\n var paddingVer = padding.top + padding.bottom;\n var borderHor = border.left + border.right;\n var scale = rect.width / (clientWidth + borderHor);\n var unscaledW = clientWidth - paddingHor;\n var unscaledH = clientHeight - paddingVer;\n var left = rect.left + padding.left + border.left;\n var top = rect.top + padding.top + border.top;\n return this.containerBB = [left, top, unscaledW, unscaledH, scale];\n};\n\nBRp$1.invalidateContainerClientCoordsCache = function () {\n this.containerBB = null;\n};\n\nBRp$1.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) {\n return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0];\n};\n\nBRp$1.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) {\n var self = this;\n var r = this;\n var eles = r.getCachedZSortedEles();\n var near = []; // 1 node max, 1 edge max\n\n var zoom = r.cy.zoom();\n var hasCompounds = r.cy.hasCompoundNodes();\n var edgeThreshold = (isTouch ? 24 : 8) / zoom;\n var nodeThreshold = (isTouch ? 8 : 2) / zoom;\n var labelThreshold = (isTouch ? 8 : 2) / zoom;\n var minSqDist = Infinity;\n var nearEdge;\n var nearNode;\n\n if (interactiveElementsOnly) {\n eles = eles.interactive;\n }\n\n function addEle(ele, sqDist) {\n if (ele.isNode()) {\n if (nearNode) {\n return; // can't replace node\n } else {\n nearNode = ele;\n near.push(ele);\n }\n }\n\n if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) {\n if (nearEdge) {\n // then replace existing edge\n // can replace only if same z-index\n if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) {\n for (var i = 0; i < near.length; i++) {\n if (near[i].isEdge()) {\n near[i] = ele;\n nearEdge = ele;\n minSqDist = sqDist != null ? sqDist : minSqDist;\n break;\n }\n }\n }\n } else {\n near.push(ele);\n nearEdge = ele;\n minSqDist = sqDist != null ? sqDist : minSqDist;\n }\n }\n }\n\n function checkNode(node) {\n var width = node.outerWidth() + 2 * nodeThreshold;\n var height = node.outerHeight() + 2 * nodeThreshold;\n var hw = width / 2;\n var hh = height / 2;\n var pos = node.position();\n\n if (pos.x - hw <= x && x <= pos.x + hw // bb check x\n && pos.y - hh <= y && y <= pos.y + hh // bb check y\n ) {\n var shape = r.nodeShapes[self.getNodeShape(node)];\n\n if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y)) {\n addEle(node, 0);\n return true;\n }\n }\n }\n\n function checkEdge(edge) {\n var _p = edge._private;\n var rs = _p.rscratch;\n var styleWidth = edge.pstyle('width').pfValue;\n var scale = edge.pstyle('arrow-scale').value;\n var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre\n\n var widthSq = width * width;\n var width2 = width * 2;\n var src = _p.source;\n var tgt = _p.target;\n var sqDist;\n\n if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') {\n var pts = rs.allpts;\n\n for (var i = 0; i + 3 < pts.length; i += 2) {\n if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) {\n addEle(edge, sqDist);\n return true;\n }\n }\n } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') {\n var pts = rs.allpts;\n\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) {\n addEle(edge, sqDist);\n return true;\n }\n }\n } // if we're close to the edge but didn't hit it, maybe we hit its arrows\n\n\n var src = src || _p.source;\n var tgt = tgt || _p.target;\n var arSize = self.getArrowWidth(styleWidth, scale);\n var arrows = [{\n name: 'source',\n x: rs.arrowStartX,\n y: rs.arrowStartY,\n angle: rs.srcArrowAngle\n }, {\n name: 'target',\n x: rs.arrowEndX,\n y: rs.arrowEndY,\n angle: rs.tgtArrowAngle\n }, {\n name: 'mid-source',\n x: rs.midX,\n y: rs.midY,\n angle: rs.midsrcArrowAngle\n }, {\n name: 'mid-target',\n x: rs.midX,\n y: rs.midY,\n angle: rs.midtgtArrowAngle\n }];\n\n for (var i = 0; i < arrows.length; i++) {\n var ar = arrows[i];\n var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value];\n var edgeWidth = edge.pstyle('width').pfValue;\n\n if (shape.roughCollide(x, y, arSize, ar.angle, {\n x: ar.x,\n y: ar.y\n }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, {\n x: ar.x,\n y: ar.y\n }, edgeWidth, edgeThreshold)) {\n addEle(edge);\n return true;\n }\n } // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence)\n\n\n if (hasCompounds && near.length > 0) {\n checkNode(src);\n checkNode(tgt);\n }\n }\n\n function preprop(obj, name, pre) {\n return getPrefixedProperty(obj, name, pre);\n }\n\n function checkLabel(ele, prefix) {\n var _p = ele._private;\n var th = labelThreshold;\n var prefixDash;\n\n if (prefix) {\n prefixDash = prefix + '-';\n } else {\n prefixDash = '';\n }\n\n ele.boundingBox();\n var bb = _p.labelBounds[prefix || 'main'];\n var text = ele.pstyle(prefixDash + 'label').value;\n var eventsEnabled = ele.pstyle('text-events').strValue === 'yes';\n\n if (!eventsEnabled || !text) {\n return;\n }\n\n var lx = preprop(_p.rscratch, 'labelX', prefix);\n var ly = preprop(_p.rscratch, 'labelY', prefix);\n var theta = preprop(_p.rscratch, 'labelAngle', prefix);\n var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue;\n var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue;\n var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin\n\n var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly)\n\n var ly1 = bb.y1 - th - oy;\n var ly2 = bb.y2 + th - oy;\n\n if (theta) {\n var cos = Math.cos(theta);\n var sin = Math.sin(theta);\n\n var rotate = function rotate(x, y) {\n x = x - lx;\n y = y - ly;\n return {\n x: x * cos - y * sin + lx,\n y: x * sin + y * cos + ly\n };\n };\n\n var px1y1 = rotate(lx1, ly1);\n var px1y2 = rotate(lx1, ly2);\n var px2y1 = rotate(lx2, ly1);\n var px2y2 = rotate(lx2, ly2);\n var points = [// with the margin added after the rotation is applied\n px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy];\n\n if (pointInsidePolygonPoints(x, y, points)) {\n addEle(ele);\n return true;\n }\n } else {\n // do a cheaper bb check\n if (inBoundingBox(bb, x, y)) {\n addEle(ele);\n return true;\n }\n }\n }\n\n for (var i = eles.length - 1; i >= 0; i--) {\n // reverse order for precedence\n var ele = eles[i];\n\n if (ele.isNode()) {\n checkNode(ele) || checkLabel(ele);\n } else {\n // then edge\n checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target');\n }\n }\n\n return near;\n}; // 'Give me everything from this box'\n\n\nBRp$1.getAllInBox = function (x1, y1, x2, y2) {\n var eles = this.getCachedZSortedEles().interactive;\n var box = [];\n var x1c = Math.min(x1, x2);\n var x2c = Math.max(x1, x2);\n var y1c = Math.min(y1, y2);\n var y2c = Math.max(y1, y2);\n x1 = x1c;\n x2 = x2c;\n y1 = y1c;\n y2 = y2c;\n var boxBb = makeBoundingBox({\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n\n for (var e = 0; e < eles.length; e++) {\n var ele = eles[e];\n\n if (ele.isNode()) {\n var node = ele;\n var nodeBb = node.boundingBox({\n includeNodes: true,\n includeEdges: false,\n includeLabels: false\n });\n\n if (boundingBoxesIntersect(boxBb, nodeBb) && !boundingBoxInBoundingBox(nodeBb, boxBb)) {\n box.push(node);\n }\n } else {\n var edge = ele;\n var _p = edge._private;\n var rs = _p.rscratch;\n\n if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) {\n continue;\n }\n\n if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) {\n continue;\n }\n\n if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') {\n var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts;\n var allInside = true;\n\n for (var i = 0; i < pts.length; i++) {\n if (!pointInBoundingBox(boxBb, pts[i])) {\n allInside = false;\n break;\n }\n }\n\n if (allInside) {\n box.push(edge);\n }\n } else if (rs.edgeType === 'haystack' || rs.edgeType === 'straight') {\n box.push(edge);\n }\n }\n }\n\n return box;\n};\n\nvar BRp$2 = {};\n\nBRp$2.calculateArrowAngles = function (edge) {\n var rs = edge._private.rscratch;\n var isHaystack = rs.edgeType === 'haystack';\n var isBezier = rs.edgeType === 'bezier';\n var isMultibezier = rs.edgeType === 'multibezier';\n var isSegments = rs.edgeType === 'segments';\n var isCompound = rs.edgeType === 'compound';\n var isSelf = rs.edgeType === 'self'; // Displacement gives direction for arrowhead orientation\n\n var dispX, dispY;\n var startX, startY, endX, endY, midX, midY;\n\n if (isHaystack) {\n startX = rs.haystackPts[0];\n startY = rs.haystackPts[1];\n endX = rs.haystackPts[2];\n endY = rs.haystackPts[3];\n } else {\n startX = rs.arrowStartX;\n startY = rs.arrowStartY;\n endX = rs.arrowEndX;\n endY = rs.arrowEndY;\n }\n\n midX = rs.midX;\n midY = rs.midY; // source\n //\n\n if (isSegments) {\n dispX = startX - rs.segpts[0];\n dispY = startY - rs.segpts[1];\n } else if (isMultibezier || isCompound || isSelf || isBezier) {\n var pts = rs.allpts;\n var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1);\n var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1);\n dispX = startX - bX;\n dispY = startY - bY;\n } else {\n dispX = startX - midX;\n dispY = startY - midY;\n }\n\n rs.srcArrowAngle = getAngleFromDisp(dispX, dispY); // mid target\n //\n\n var midX = rs.midX;\n var midY = rs.midY;\n\n if (isHaystack) {\n midX = (startX + endX) / 2;\n midY = (startY + endY) / 2;\n }\n\n dispX = endX - startX;\n dispY = endY - startY;\n\n if (isSegments) {\n var pts = rs.allpts;\n\n if (pts.length / 2 % 2 === 0) {\n var i2 = pts.length / 2;\n var i1 = i2 - 2;\n dispX = pts[i2] - pts[i1];\n dispY = pts[i2 + 1] - pts[i1 + 1];\n } else {\n var i2 = pts.length / 2 - 1;\n var i1 = i2 - 2;\n var i3 = i2 + 2;\n dispX = pts[i2] - pts[i1];\n dispY = pts[i2 + 1] - pts[i1 + 1];\n }\n } else if (isMultibezier || isCompound || isSelf) {\n var pts = rs.allpts;\n var cpts = rs.ctrlpts;\n var bp0x, bp0y;\n var bp1x, bp1y;\n\n if (cpts.length / 2 % 2 === 0) {\n var p0 = pts.length / 2 - 1; // startpt\n\n var ic = p0 + 2;\n var p1 = ic + 2;\n bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0);\n bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0);\n bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001);\n bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001);\n } else {\n var ic = pts.length / 2 - 1; // ctrpt\n\n var p0 = ic - 2; // startpt\n\n var p1 = ic + 2; // endpt\n\n bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999);\n bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999);\n bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5);\n bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5);\n }\n\n dispX = bp1x - bp0x;\n dispY = bp1y - bp0y;\n }\n\n rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY);\n rs.midDispX = dispX;\n rs.midDispY = dispY; // mid source\n //\n\n dispX *= -1;\n dispY *= -1;\n\n if (isSegments) {\n var pts = rs.allpts;\n\n if (pts.length / 2 % 2 === 0) ; else {\n var i2 = pts.length / 2 - 1;\n var i3 = i2 + 2;\n dispX = -(pts[i3] - pts[i2]);\n dispY = -(pts[i3 + 1] - pts[i2 + 1]);\n }\n }\n\n rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY); // target\n //\n\n if (isSegments) {\n dispX = endX - rs.segpts[rs.segpts.length - 2];\n dispY = endY - rs.segpts[rs.segpts.length - 1];\n } else if (isMultibezier || isCompound || isSelf || isBezier) {\n var pts = rs.allpts;\n var l = pts.length;\n var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9);\n var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9);\n dispX = endX - bX;\n dispY = endY - bY;\n } else {\n dispX = endX - midX;\n dispY = endY - midY;\n }\n\n rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY);\n};\n\nBRp$2.getArrowWidth = BRp$2.getArrowHeight = function (edgeWidth, scale) {\n var cache = this.arrowWidthCache = this.arrowWidthCache || {};\n var cachedVal = cache[edgeWidth + ', ' + scale];\n\n if (cachedVal) {\n return cachedVal;\n }\n\n cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale;\n cache[edgeWidth + ', ' + scale] = cachedVal;\n return cachedVal;\n};\n\nvar BRp$3 = {};\n\nBRp$3.findHaystackPoints = function (edges) {\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var _p = edge._private;\n var rs = _p.rscratch;\n\n if (!rs.haystack) {\n var angle = Math.random() * 2 * Math.PI;\n rs.source = {\n x: Math.cos(angle),\n y: Math.sin(angle)\n };\n angle = Math.random() * 2 * Math.PI;\n rs.target = {\n x: Math.cos(angle),\n y: Math.sin(angle)\n };\n }\n\n var src = _p.source;\n var tgt = _p.target;\n var srcPos = src.position();\n var tgtPos = tgt.position();\n var srcW = src.width();\n var tgtW = tgt.width();\n var srcH = src.height();\n var tgtH = tgt.height();\n var radius = edge.pstyle('haystack-radius').value;\n var halfRadius = radius / 2; // b/c have to half width/height\n\n rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y];\n rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2;\n rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2; // always override as haystack in case set to different type previously\n\n rs.edgeType = 'haystack';\n rs.haystack = true;\n this.storeEdgeProjections(edge);\n this.calculateArrowAngles(edge);\n this.recalculateEdgeLabelProjections(edge);\n this.calculateLabelAngles(edge);\n }\n};\n\nBRp$3.findSegmentsPoints = function (edge, pairInfo) {\n // Segments (multiple straight lines)\n var rs = edge._private.rscratch;\n var posPts = pairInfo.posPts,\n intersectionPts = pairInfo.intersectionPts,\n vectorNormInverse = pairInfo.vectorNormInverse;\n var edgeDistances = edge.pstyle('edge-distances').value;\n var segmentWs = edge.pstyle('segment-weights');\n var segmentDs = edge.pstyle('segment-distances');\n var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length);\n rs.edgeType = 'segments';\n rs.segpts = [];\n\n for (var s = 0; s < segmentsN; s++) {\n var w = segmentWs.pfValue[s];\n var d = segmentDs.pfValue[s];\n var w1 = 1 - w;\n var w2 = w;\n var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts;\n var adjustedMidpt = {\n x: midptPts.x1 * w1 + midptPts.x2 * w2,\n y: midptPts.y1 * w1 + midptPts.y2 * w2\n };\n rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d);\n }\n};\n\nBRp$3.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) {\n // Self-edge\n var rs = edge._private.rscratch;\n var dirCounts = pairInfo.dirCounts,\n srcPos = pairInfo.srcPos;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var loopDir = edge.pstyle('loop-direction').pfValue;\n var loopSwp = edge.pstyle('loop-sweep').pfValue;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n rs.edgeType = 'self';\n var j = i;\n var loopDist = stepSize;\n\n if (edgeIsUnbundled) {\n j = 0;\n loopDist = ctrlptDist;\n }\n\n var loopAngle = loopDir - Math.PI / 2;\n var outAngle = loopAngle - loopSwp / 2;\n var inAngle = loopAngle + loopSwp / 2; // increase by step size for overlapping loops, keyed on direction and sweep values\n\n var dc = String(loopDir + '_' + loopSwp);\n j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc];\n rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)];\n};\n\nBRp$3.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) {\n // Compound edge\n var rs = edge._private.rscratch;\n rs.edgeType = 'compound';\n var srcPos = pairInfo.srcPos,\n tgtPos = pairInfo.tgtPos,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var j = i;\n var loopDist = stepSize;\n\n if (edgeIsUnbundled) {\n j = 0;\n loopDist = ctrlptDist;\n }\n\n var loopW = 50;\n var loopaPos = {\n x: srcPos.x - srcW / 2,\n y: srcPos.y - srcH / 2\n };\n var loopbPos = {\n x: tgtPos.x - tgtW / 2,\n y: tgtPos.y - tgtH / 2\n };\n var loopPos = {\n x: Math.min(loopaPos.x, loopbPos.x),\n y: Math.min(loopaPos.y, loopbPos.y)\n }; // avoids cases with impossible beziers\n\n var minCompoundStretch = 0.5;\n var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * 0.01));\n var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * 0.01));\n rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y];\n};\n\nBRp$3.findStraightEdgePoints = function (edge) {\n // Straight edge within bundle\n edge._private.rscratch.edgeType = 'straight';\n};\n\nBRp$3.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) {\n var rs = edge._private.rscratch;\n var vectorNormInverse = pairInfo.vectorNormInverse,\n posPts = pairInfo.posPts,\n intersectionPts = pairInfo.intersectionPts;\n var edgeDistances = edge.pstyle('edge-distances').value;\n var stepSize = edge.pstyle('control-point-step-size').pfValue;\n var ctrlptDists = edge.pstyle('control-point-distances');\n var ctrlptWs = edge.pstyle('control-point-weights');\n var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1;\n var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined;\n var ctrlptWeight = ctrlptWs.value[0]; // (Multi)bezier\n\n var multi = edgeIsUnbundled;\n rs.edgeType = multi ? 'multibezier' : 'bezier';\n rs.ctrlpts = [];\n\n for (var b = 0; b < bezierN; b++) {\n var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1);\n var manctrlptDist = void 0;\n var sign = signum(normctrlptDist);\n\n if (multi) {\n ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size\n\n ctrlptWeight = ctrlptWs.value[b];\n }\n\n if (edgeIsUnbundled) {\n // multi or single unbundled\n manctrlptDist = ctrlptDist;\n } else {\n manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined;\n }\n\n var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist;\n var w1 = 1 - ctrlptWeight;\n var w2 = ctrlptWeight;\n var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts;\n var adjustedMidpt = {\n x: midptPts.x1 * w1 + midptPts.x2 * w2,\n y: midptPts.y1 * w1 + midptPts.y2 * w2\n };\n rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint);\n }\n};\n\nBRp$3.findTaxiPoints = function (edge, pairInfo) {\n // Taxicab geometry with two turns maximum\n var rs = edge._private.rscratch;\n rs.edgeType = 'segments';\n var VERTICAL = 'vertical';\n var HORIZONTAL = 'horizontal';\n var LEFTWARD = 'leftward';\n var RIGHTWARD = 'rightward';\n var DOWNWARD = 'downward';\n var UPWARD = 'upward';\n var AUTO = 'auto';\n var posPts = pairInfo.posPts,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH;\n var edgeDistances = edge.pstyle('edge-distances').value;\n var dIncludesNodeBody = edgeDistances !== 'node-position';\n var taxiDir = edge.pstyle('taxi-direction').value;\n var rawTaxiDir = taxiDir; // unprocessed value\n\n var taxiTurn = edge.pstyle('taxi-turn');\n var turnIsPercent = taxiTurn.units === '%';\n var taxiTurnPfVal = taxiTurn.pfValue;\n var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side\n\n var minD = edge.pstyle('taxi-turn-min-distance').pfValue;\n var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0;\n var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0;\n var pdx = posPts.x2 - posPts.x1;\n var pdy = posPts.y2 - posPts.y1; // take away the effective w/h from the magnitude of the delta value\n\n var subDWH = function subDWH(dxy, dwh) {\n if (dxy > 0) {\n return Math.max(dxy - dwh, 0);\n } else {\n return Math.min(dxy + dwh, 0);\n }\n };\n\n var dx = subDWH(pdx, dw);\n var dy = subDWH(pdy, dh);\n var isExplicitDir = false;\n\n if (rawTaxiDir === AUTO) {\n taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL;\n } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) {\n taxiDir = VERTICAL;\n isExplicitDir = true;\n } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) {\n taxiDir = HORIZONTAL;\n isExplicitDir = true;\n }\n\n var isVert = taxiDir === VERTICAL;\n var l = isVert ? dy : dx;\n var pl = isVert ? pdy : pdx;\n var sgnL = signum(pl);\n var forcedDir = false;\n\n if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction\n && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) {\n sgnL *= -1;\n l = sgnL * Math.abs(l);\n forcedDir = true;\n }\n\n var d;\n\n if (turnIsPercent) {\n var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal;\n d = p * l;\n } else {\n var k = taxiTurnPfVal < 0 ? l : 0;\n d = k + taxiTurnPfVal * sgnL;\n }\n\n var getIsTooClose = function getIsTooClose(d) {\n return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l);\n };\n\n var isTooCloseSrc = getIsTooClose(d);\n var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d));\n var isTooClose = isTooCloseSrc || isTooCloseTgt;\n\n if (isTooClose && !forcedDir) {\n // non-ideal routing\n if (isVert) {\n // vertical fallbacks\n var lShapeInsideSrc = Math.abs(pl) <= srcH / 2;\n var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2;\n\n if (lShapeInsideSrc) {\n // horizontal Z-shape (direction not respected)\n var x = (posPts.x1 + posPts.x2) / 2;\n var y1 = posPts.y1,\n y2 = posPts.y2;\n rs.segpts = [x, y1, x, y2];\n } else if (lShapeInsideTgt) {\n // vertical Z-shape (distance not respected)\n var y = (posPts.y1 + posPts.y2) / 2;\n var x1 = posPts.x1,\n x2 = posPts.x2;\n rs.segpts = [x1, y, x2, y];\n } else {\n // L-shape fallback (turn distance not respected, but works well with tree siblings)\n rs.segpts = [posPts.x1, posPts.y2];\n }\n } else {\n // horizontal fallbacks\n var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2;\n\n var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2;\n\n if (_lShapeInsideSrc) {\n // vertical Z-shape (direction not respected)\n var _y = (posPts.y1 + posPts.y2) / 2;\n\n var _x = posPts.x1,\n _x2 = posPts.x2;\n rs.segpts = [_x, _y, _x2, _y];\n } else if (_lShapeInsideTgt) {\n // horizontal Z-shape (turn distance not respected)\n var _x3 = (posPts.x1 + posPts.x2) / 2;\n\n var _y2 = posPts.y1,\n _y3 = posPts.y2;\n rs.segpts = [_x3, _y2, _x3, _y3];\n } else {\n // L-shape (turn distance not respected, but works well for tree siblings)\n rs.segpts = [posPts.x2, posPts.y1];\n }\n }\n } else {\n // ideal routing\n if (isVert) {\n var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0);\n\n var _x4 = posPts.x1,\n _x5 = posPts.x2;\n rs.segpts = [_x4, _y4, _x5, _y4];\n } else {\n // horizontal\n var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0);\n\n var _y5 = posPts.y1,\n _y6 = posPts.y2;\n rs.segpts = [_x6, _y5, _x6, _y6];\n }\n }\n};\n\nBRp$3.tryToCorrectInvalidPoints = function (edge, pairInfo) {\n var rs = edge._private.rscratch; // can only correct beziers for now...\n\n if (rs.edgeType === 'bezier') {\n var srcPos = pairInfo.srcPos,\n tgtPos = pairInfo.tgtPos,\n srcW = pairInfo.srcW,\n srcH = pairInfo.srcH,\n tgtW = pairInfo.tgtW,\n tgtH = pairInfo.tgtH,\n srcShape = pairInfo.srcShape,\n tgtShape = pairInfo.tgtShape;\n var badStart = !number(rs.startX) || !number(rs.startY);\n var badAStart = !number(rs.arrowStartX) || !number(rs.arrowStartY);\n var badEnd = !number(rs.endX) || !number(rs.endY);\n var badAEnd = !number(rs.arrowEndX) || !number(rs.arrowEndY);\n var minCpADistFactor = 3;\n var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth;\n var minCpADist = minCpADistFactor * arrowW;\n var startACpDist = dist({\n x: rs.ctrlpts[0],\n y: rs.ctrlpts[1]\n }, {\n x: rs.startX,\n y: rs.startY\n });\n var closeStartACp = startACpDist < minCpADist;\n var endACpDist = dist({\n x: rs.ctrlpts[0],\n y: rs.ctrlpts[1]\n }, {\n x: rs.endX,\n y: rs.endY\n });\n var closeEndACp = endACpDist < minCpADist;\n var overlapping = false;\n\n if (badStart || badAStart || closeStartACp) {\n overlapping = true; // project control point along line from src centre to outside the src shape\n // (otherwise intersection will yield nothing)\n\n var cpD = {\n // delta\n x: rs.ctrlpts[0] - srcPos.x,\n y: rs.ctrlpts[1] - srcPos.y\n };\n var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line\n\n var cpM = {\n // normalised delta\n x: cpD.x / cpL,\n y: cpD.y / cpL\n };\n var radius = Math.max(srcW, srcH);\n var cpProj = {\n // *2 radius guarantees outside shape\n x: rs.ctrlpts[0] + cpM.x * 2 * radius,\n y: rs.ctrlpts[1] + cpM.y * 2 * radius\n };\n var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0);\n\n if (closeStartACp) {\n rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist);\n rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist);\n } else {\n rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist;\n rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist;\n }\n }\n\n if (badEnd || badAEnd || closeEndACp) {\n overlapping = true; // project control point along line from tgt centre to outside the tgt shape\n // (otherwise intersection will yield nothing)\n\n var _cpD = {\n // delta\n x: rs.ctrlpts[0] - tgtPos.x,\n y: rs.ctrlpts[1] - tgtPos.y\n };\n\n var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line\n\n\n var _cpM = {\n // normalised delta\n x: _cpD.x / _cpL,\n y: _cpD.y / _cpL\n };\n\n var _radius = Math.max(srcW, srcH);\n\n var _cpProj = {\n // *2 radius guarantees outside shape\n x: rs.ctrlpts[0] + _cpM.x * 2 * _radius,\n y: rs.ctrlpts[1] + _cpM.y * 2 * _radius\n };\n var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0);\n\n if (closeEndACp) {\n rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist);\n rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist);\n } else {\n rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist;\n rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist;\n }\n }\n\n if (overlapping) {\n // recalc endpts\n this.findEndpoints(edge);\n }\n }\n};\n\nBRp$3.storeAllpts = function (edge) {\n var rs = edge._private.rscratch;\n\n if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') {\n rs.allpts = [];\n rs.allpts.push(rs.startX, rs.startY);\n\n for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) {\n // ctrl pt itself\n rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]); // the midpt between ctrlpts as intermediate destination pts\n\n if (b + 3 < rs.ctrlpts.length) {\n rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2);\n }\n }\n\n rs.allpts.push(rs.endX, rs.endY);\n var m, mt;\n\n if (rs.ctrlpts.length / 2 % 2 === 0) {\n m = rs.allpts.length / 2 - 1;\n rs.midX = rs.allpts[m];\n rs.midY = rs.allpts[m + 1];\n } else {\n m = rs.allpts.length / 2 - 3;\n mt = 0.5;\n rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt);\n rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt);\n }\n } else if (rs.edgeType === 'straight') {\n // need to calc these after endpts\n rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY]; // default midpt for labels etc\n\n rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4;\n rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4;\n } else if (rs.edgeType === 'segments') {\n rs.allpts = [];\n rs.allpts.push(rs.startX, rs.startY);\n rs.allpts.push.apply(rs.allpts, rs.segpts);\n rs.allpts.push(rs.endX, rs.endY);\n\n if (rs.segpts.length % 4 === 0) {\n var i2 = rs.segpts.length / 2;\n var i1 = i2 - 2;\n rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2;\n rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2;\n } else {\n var _i = rs.segpts.length / 2 - 1;\n\n rs.midX = rs.segpts[_i];\n rs.midY = rs.segpts[_i + 1];\n }\n }\n};\n\nBRp$3.checkForInvalidEdgeWarning = function (edge) {\n var rs = edge[0]._private.rscratch;\n\n if (rs.nodesOverlap || number(rs.startX) && number(rs.startY) && number(rs.endX) && number(rs.endY)) {\n rs.loggedErr = false;\n } else {\n if (!rs.loggedErr) {\n rs.loggedErr = true;\n warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.');\n }\n }\n};\n\nBRp$3.findEdgeControlPoints = function (edges) {\n var _this = this;\n\n if (!edges || edges.length === 0) {\n return;\n }\n\n var r = this;\n var cy = r.cy;\n var hasCompounds = cy.hasCompoundNodes();\n var hashTable = {\n map: new Map$1(),\n get: function get(pairId) {\n var map2 = this.map.get(pairId[0]);\n\n if (map2 != null) {\n return map2.get(pairId[1]);\n } else {\n return null;\n }\n },\n set: function set(pairId, val) {\n var map2 = this.map.get(pairId[0]);\n\n if (map2 == null) {\n map2 = new Map$1();\n this.map.set(pairId[0], map2);\n }\n\n map2.set(pairId[1], val);\n }\n };\n var pairIds = [];\n var haystackEdges = []; // create a table of edge (src, tgt) => list of edges between them\n\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var _p = edge._private;\n var curveStyle = edge.pstyle('curve-style').value; // ignore edges who are not to be displayed\n // they shouldn't take up space\n\n if (edge.removed() || !edge.takesUpSpace()) {\n continue;\n }\n\n if (curveStyle === 'haystack') {\n haystackEdges.push(edge);\n continue;\n }\n\n var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'straight' || curveStyle === 'taxi';\n var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier';\n var src = _p.source;\n var tgt = _p.target;\n var srcIndex = src.poolIndex();\n var tgtIndex = tgt.poolIndex();\n var pairId = [srcIndex, tgtIndex].sort();\n var tableEntry = hashTable.get(pairId);\n\n if (tableEntry == null) {\n tableEntry = {\n eles: []\n };\n hashTable.set(pairId, tableEntry);\n pairIds.push(pairId);\n }\n\n tableEntry.eles.push(edge);\n\n if (edgeIsUnbundled) {\n tableEntry.hasUnbundled = true;\n }\n\n if (edgeIsBezier) {\n tableEntry.hasBezier = true;\n }\n } // for each pair (src, tgt), create the ctrl pts\n // Nested for loop is OK; total number of iterations for both loops = edgeCount\n\n\n var _loop = function _loop(p) {\n var pairId = pairIds[p];\n var pairInfo = hashTable.get(pairId);\n var swappedpairInfo = void 0;\n\n if (!pairInfo.hasUnbundled) {\n var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) {\n return e.isBundledBezier();\n });\n clearArray(pairInfo.eles);\n pllEdges.forEach(function (edge) {\n return pairInfo.eles.push(edge);\n }); // for each pair id, the edges should be sorted by index\n\n pairInfo.eles.sort(function (edge1, edge2) {\n return edge1.poolIndex() - edge2.poolIndex();\n });\n }\n\n var firstEdge = pairInfo.eles[0];\n var src = firstEdge.source();\n var tgt = firstEdge.target(); // make sure src/tgt distinction is consistent w.r.t. pairId\n\n if (src.poolIndex() > tgt.poolIndex()) {\n var temp = src;\n src = tgt;\n tgt = temp;\n }\n\n var srcPos = pairInfo.srcPos = src.position();\n var tgtPos = pairInfo.tgtPos = tgt.position();\n var srcW = pairInfo.srcW = src.outerWidth();\n var srcH = pairInfo.srcH = src.outerHeight();\n var tgtW = pairInfo.tgtW = tgt.outerWidth();\n var tgtH = pairInfo.tgtH = tgt.outerHeight();\n\n var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)];\n\n var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)];\n\n pairInfo.dirCounts = {\n 'north': 0,\n 'west': 0,\n 'south': 0,\n 'east': 0,\n 'northwest': 0,\n 'southwest': 0,\n 'northeast': 0,\n 'southeast': 0\n };\n\n for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) {\n var _edge = pairInfo.eles[_i2];\n var rs = _edge[0]._private.rscratch;\n\n var _curveStyle = _edge.pstyle('curve-style').value;\n\n var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || _curveStyle === 'segments' || _curveStyle === 'taxi'; // whether the normalised pair order is the reverse of the edge's src-tgt order\n\n\n var edgeIsSwapped = !src.same(_edge.source());\n\n if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) {\n pairInfo.calculatedIntersection = true; // pt outside src shape to calc distance/displacement from src to tgt\n\n var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0);\n var srcIntn = pairInfo.srcIntn = srcOutside; // pt outside tgt shape to calc distance/displacement from src to tgt\n\n var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0);\n var tgtIntn = pairInfo.tgtIntn = tgtOutside;\n var intersectionPts = pairInfo.intersectionPts = {\n x1: srcOutside[0],\n x2: tgtOutside[0],\n y1: srcOutside[1],\n y2: tgtOutside[1]\n };\n var posPts = pairInfo.posPts = {\n x1: srcPos.x,\n x2: tgtPos.x,\n y1: srcPos.y,\n y2: tgtPos.y\n };\n var dy = tgtOutside[1] - srcOutside[1];\n var dx = tgtOutside[0] - srcOutside[0];\n var l = Math.sqrt(dx * dx + dy * dy);\n var vector = pairInfo.vector = {\n x: dx,\n y: dy\n };\n var vectorNorm = pairInfo.vectorNorm = {\n x: vector.x / l,\n y: vector.y / l\n };\n var vectorNormInverse = {\n x: -vectorNorm.y,\n y: vectorNorm.x\n }; // if node shapes overlap, then no ctrl pts to draw\n\n pairInfo.nodesOverlap = !number(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y);\n pairInfo.vectorNormInverse = vectorNormInverse;\n swappedpairInfo = {\n nodesOverlap: pairInfo.nodesOverlap,\n dirCounts: pairInfo.dirCounts,\n calculatedIntersection: true,\n hasBezier: pairInfo.hasBezier,\n hasUnbundled: pairInfo.hasUnbundled,\n eles: pairInfo.eles,\n srcPos: tgtPos,\n tgtPos: srcPos,\n srcW: tgtW,\n srcH: tgtH,\n tgtW: srcW,\n tgtH: srcH,\n srcIntn: tgtIntn,\n tgtIntn: srcIntn,\n srcShape: tgtShape,\n tgtShape: srcShape,\n posPts: {\n x1: posPts.x2,\n y1: posPts.y2,\n x2: posPts.x1,\n y2: posPts.y1\n },\n intersectionPts: {\n x1: intersectionPts.x2,\n y1: intersectionPts.y2,\n x2: intersectionPts.x1,\n y2: intersectionPts.y1\n },\n vector: {\n x: -vector.x,\n y: -vector.y\n },\n vectorNorm: {\n x: -vectorNorm.x,\n y: -vectorNorm.y\n },\n vectorNormInverse: {\n x: -vectorNormInverse.x,\n y: -vectorNormInverse.y\n }\n };\n }\n\n var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo;\n rs.nodesOverlap = passedPairInfo.nodesOverlap;\n rs.srcIntn = passedPairInfo.srcIntn;\n rs.tgtIntn = passedPairInfo.tgtIntn;\n\n if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) {\n _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled);\n } else if (src === tgt) {\n _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled);\n } else if (_curveStyle === 'segments') {\n _this.findSegmentsPoints(_edge, passedPairInfo);\n } else if (_curveStyle === 'taxi') {\n _this.findTaxiPoints(_edge, passedPairInfo);\n } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) {\n _this.findStraightEdgePoints(_edge);\n } else {\n _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped);\n }\n\n _this.findEndpoints(_edge);\n\n _this.tryToCorrectInvalidPoints(_edge, passedPairInfo);\n\n _this.checkForInvalidEdgeWarning(_edge);\n\n _this.storeAllpts(_edge);\n\n _this.storeEdgeProjections(_edge);\n\n _this.calculateArrowAngles(_edge);\n\n _this.recalculateEdgeLabelProjections(_edge);\n\n _this.calculateLabelAngles(_edge);\n } // for pair edges\n\n };\n\n for (var p = 0; p < pairIds.length; p++) {\n _loop(p);\n } // for pair ids\n // haystacks avoid the expense of pairInfo stuff (intersections etc.)\n\n\n this.findHaystackPoints(haystackEdges);\n};\n\nfunction getPts(pts) {\n var retPts = [];\n\n if (pts == null) {\n return;\n }\n\n for (var i = 0; i < pts.length; i += 2) {\n var x = pts[i];\n var y = pts[i + 1];\n retPts.push({\n x: x,\n y: y\n });\n }\n\n return retPts;\n}\n\nBRp$3.getSegmentPoints = function (edge) {\n var rs = edge[0]._private.rscratch;\n var type = rs.edgeType;\n\n if (type === 'segments') {\n this.recalculateRenderedStyle(edge);\n return getPts(rs.segpts);\n }\n};\n\nBRp$3.getControlPoints = function (edge) {\n var rs = edge[0]._private.rscratch;\n var type = rs.edgeType;\n\n if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') {\n this.recalculateRenderedStyle(edge);\n return getPts(rs.ctrlpts);\n }\n};\n\nBRp$3.getEdgeMidpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n return {\n x: rs.midX,\n y: rs.midY\n };\n};\n\nvar BRp$4 = {};\n\nBRp$4.manualEndptToPx = function (node, prop) {\n var r = this;\n var npos = node.position();\n var w = node.outerWidth();\n var h = node.outerHeight();\n\n if (prop.value.length === 2) {\n var p = [prop.pfValue[0], prop.pfValue[1]];\n\n if (prop.units[0] === '%') {\n p[0] = p[0] * w;\n }\n\n if (prop.units[1] === '%') {\n p[1] = p[1] * h;\n }\n\n p[0] += npos.x;\n p[1] += npos.y;\n return p;\n } else {\n var angle = prop.pfValue[0];\n angle = -Math.PI / 2 + angle; // start at 12 o'clock\n\n var l = 2 * Math.max(w, h);\n var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l];\n return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0);\n }\n};\n\nBRp$4.findEndpoints = function (edge) {\n var r = this;\n var intersect;\n var source = edge.source()[0];\n var target = edge.target()[0];\n var srcPos = source.position();\n var tgtPos = target.position();\n var tgtArShape = edge.pstyle('target-arrow-shape').value;\n var srcArShape = edge.pstyle('source-arrow-shape').value;\n var tgtDist = edge.pstyle('target-distance-from-node').pfValue;\n var srcDist = edge.pstyle('source-distance-from-node').pfValue;\n var curveStyle = edge.pstyle('curve-style').value;\n var rs = edge._private.rscratch;\n var et = rs.edgeType;\n var taxi = curveStyle === 'taxi';\n var self = et === 'self' || et === 'compound';\n var bezier = et === 'bezier' || et === 'multibezier' || self;\n var multi = et !== 'bezier';\n var lines = et === 'straight' || et === 'segments';\n var segments = et === 'segments';\n var hasEndpts = bezier || multi || lines;\n var overrideEndpts = self || taxi;\n var srcManEndpt = edge.pstyle('source-endpoint');\n var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value;\n var tgtManEndpt = edge.pstyle('target-endpoint');\n var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value;\n rs.srcManEndpt = srcManEndpt;\n rs.tgtManEndpt = tgtManEndpt;\n var p1; // last known point of edge on target side\n\n var p2; // last known point of edge on source side\n\n var p1_i; // point to intersect with target shape\n\n var p2_i; // point to intersect with source shape\n\n if (bezier) {\n var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]];\n var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart;\n p1 = cpEnd;\n p2 = cpStart;\n } else if (lines) {\n var srcArrowFromPt = !segments ? [tgtPos.x, tgtPos.y] : rs.segpts.slice(0, 2);\n var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : rs.segpts.slice(rs.segpts.length - 2);\n p1 = tgtArrowFromPt;\n p2 = srcArrowFromPt;\n }\n\n if (tgtManEndptVal === 'inside-to-node') {\n intersect = [tgtPos.x, tgtPos.y];\n } else if (tgtManEndpt.units) {\n intersect = this.manualEndptToPx(target, tgtManEndpt);\n } else if (tgtManEndptVal === 'outside-to-line') {\n intersect = rs.tgtIntn; // use cached value from ctrlpt calc\n } else {\n if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') {\n p1_i = p1;\n } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') {\n p1_i = [srcPos.x, srcPos.y];\n }\n\n intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0);\n\n if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') {\n var trs = target._private.rscratch;\n var lw = trs.labelWidth;\n var lh = trs.labelHeight;\n var lx = trs.labelX;\n var ly = trs.labelY;\n var lw2 = lw / 2;\n var lh2 = lh / 2;\n var va = target.pstyle('text-valign').value;\n\n if (va === 'top') {\n ly -= lh2;\n } else if (va === 'bottom') {\n ly += lh2;\n }\n\n var ha = target.pstyle('text-halign').value;\n\n if (ha === 'left') {\n lx -= lw2;\n } else if (ha === 'right') {\n lx += lw2;\n }\n\n var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y);\n\n if (labelIntersect.length > 0) {\n var refPt = srcPos;\n var intSqdist = sqdist(refPt, array2point(intersect));\n var labIntSqdist = sqdist(refPt, array2point(labelIntersect));\n var minSqDist = intSqdist;\n\n if (labIntSqdist < intSqdist) {\n intersect = labelIntersect;\n minSqDist = labIntSqdist;\n }\n\n if (labelIntersect.length > 2) {\n var labInt2SqDist = sqdist(refPt, {\n x: labelIntersect[2],\n y: labelIntersect[3]\n });\n\n if (labInt2SqDist < minSqDist) {\n intersect = [labelIntersect[2], labelIntersect[3]];\n }\n }\n }\n }\n }\n\n var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist);\n var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist);\n rs.endX = edgeEnd[0];\n rs.endY = edgeEnd[1];\n rs.arrowEndX = arrowEnd[0];\n rs.arrowEndY = arrowEnd[1];\n\n if (srcManEndptVal === 'inside-to-node') {\n intersect = [srcPos.x, srcPos.y];\n } else if (srcManEndpt.units) {\n intersect = this.manualEndptToPx(source, srcManEndpt);\n } else if (srcManEndptVal === 'outside-to-line') {\n intersect = rs.srcIntn; // use cached value from ctrlpt calc\n } else {\n if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') {\n p2_i = p2;\n } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') {\n p2_i = [tgtPos.x, tgtPos.y];\n }\n\n intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0);\n\n if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') {\n var srs = source._private.rscratch;\n var _lw = srs.labelWidth;\n var _lh = srs.labelHeight;\n var _lx = srs.labelX;\n var _ly = srs.labelY;\n\n var _lw2 = _lw / 2;\n\n var _lh2 = _lh / 2;\n\n var _va = source.pstyle('text-valign').value;\n\n if (_va === 'top') {\n _ly -= _lh2;\n } else if (_va === 'bottom') {\n _ly += _lh2;\n }\n\n var _ha = source.pstyle('text-halign').value;\n\n if (_ha === 'left') {\n _lx -= _lw2;\n } else if (_ha === 'right') {\n _lx += _lw2;\n }\n\n var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y);\n\n if (_labelIntersect.length > 0) {\n var _refPt = tgtPos;\n\n var _intSqdist = sqdist(_refPt, array2point(intersect));\n\n var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect));\n\n var _minSqDist = _intSqdist;\n\n if (_labIntSqdist < _intSqdist) {\n intersect = [_labelIntersect[0], _labelIntersect[1]];\n _minSqDist = _labIntSqdist;\n }\n\n if (_labelIntersect.length > 2) {\n var _labInt2SqDist = sqdist(_refPt, {\n x: _labelIntersect[2],\n y: _labelIntersect[3]\n });\n\n if (_labInt2SqDist < _minSqDist) {\n intersect = [_labelIntersect[2], _labelIntersect[3]];\n }\n }\n }\n }\n }\n\n var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist);\n var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist);\n rs.startX = edgeStart[0];\n rs.startY = edgeStart[1];\n rs.arrowStartX = arrowStart[0];\n rs.arrowStartY = arrowStart[1];\n\n if (hasEndpts) {\n if (!number(rs.startX) || !number(rs.startY) || !number(rs.endX) || !number(rs.endY)) {\n rs.badLine = true;\n } else {\n rs.badLine = false;\n }\n }\n};\n\nBRp$4.getSourceEndpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n\n switch (rs.edgeType) {\n case 'haystack':\n return {\n x: rs.haystackPts[0],\n y: rs.haystackPts[1]\n };\n\n default:\n return {\n x: rs.arrowStartX,\n y: rs.arrowStartY\n };\n }\n};\n\nBRp$4.getTargetEndpoint = function (edge) {\n var rs = edge[0]._private.rscratch;\n this.recalculateRenderedStyle(edge);\n\n switch (rs.edgeType) {\n case 'haystack':\n return {\n x: rs.haystackPts[2],\n y: rs.haystackPts[3]\n };\n\n default:\n return {\n x: rs.arrowEndX,\n y: rs.arrowEndY\n };\n }\n};\n\nvar BRp$5 = {};\n\nfunction pushBezierPts(r, edge, pts) {\n var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) {\n return qbezierAt(p1, p2, p3, t);\n };\n\n var _p = edge._private;\n var bpts = _p.rstyle.bezierPts;\n\n for (var i = 0; i < r.bezierProjPcts.length; i++) {\n var p = r.bezierProjPcts[i];\n bpts.push({\n x: qbezierAt$1(pts[0], pts[2], pts[4], p),\n y: qbezierAt$1(pts[1], pts[3], pts[5], p)\n });\n }\n}\n\nBRp$5.storeEdgeProjections = function (edge) {\n var _p = edge._private;\n var rs = _p.rscratch;\n var et = rs.edgeType; // clear the cached points state\n\n _p.rstyle.bezierPts = null;\n _p.rstyle.linePts = null;\n _p.rstyle.haystackPts = null;\n\n if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') {\n _p.rstyle.bezierPts = [];\n\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n pushBezierPts(this, edge, rs.allpts.slice(i, i + 6));\n }\n } else if (et === 'segments') {\n var lpts = _p.rstyle.linePts = [];\n\n for (var i = 0; i + 1 < rs.allpts.length; i += 2) {\n lpts.push({\n x: rs.allpts[i],\n y: rs.allpts[i + 1]\n });\n }\n } else if (et === 'haystack') {\n var hpts = rs.haystackPts;\n _p.rstyle.haystackPts = [{\n x: hpts[0],\n y: hpts[1]\n }, {\n x: hpts[2],\n y: hpts[3]\n }];\n }\n\n _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth;\n};\n\nBRp$5.recalculateEdgeProjections = function (edges) {\n this.findEdgeControlPoints(edges);\n};\n\n/* global document */\n\nvar BRp$6 = {};\n\nBRp$6.recalculateNodeLabelProjection = function (node) {\n var content = node.pstyle('label').strValue;\n\n if (emptyString(content)) {\n return;\n }\n\n var textX, textY;\n var _p = node._private;\n var nodeWidth = node.width();\n var nodeHeight = node.height();\n var padding = node.padding();\n var nodePos = node.position();\n var textHalign = node.pstyle('text-halign').strValue;\n var textValign = node.pstyle('text-valign').strValue;\n var rs = _p.rscratch;\n var rstyle = _p.rstyle;\n\n switch (textHalign) {\n case 'left':\n textX = nodePos.x - nodeWidth / 2 - padding;\n break;\n\n case 'right':\n textX = nodePos.x + nodeWidth / 2 + padding;\n break;\n\n default:\n // e.g. center\n textX = nodePos.x;\n }\n\n switch (textValign) {\n case 'top':\n textY = nodePos.y - nodeHeight / 2 - padding;\n break;\n\n case 'bottom':\n textY = nodePos.y + nodeHeight / 2 + padding;\n break;\n\n default:\n // e.g. middle\n textY = nodePos.y;\n }\n\n rs.labelX = textX;\n rs.labelY = textY;\n rstyle.labelX = textX;\n rstyle.labelY = textY;\n this.calculateLabelAngles(node);\n this.applyLabelDimensions(node);\n};\n\nvar lineAngleFromDelta = function lineAngleFromDelta(dx, dy) {\n var angle = Math.atan(dy / dx);\n\n if (dx === 0 && angle < 0) {\n angle = angle * -1;\n }\n\n return angle;\n};\n\nvar lineAngle = function lineAngle(p0, p1) {\n var dx = p1.x - p0.x;\n var dy = p1.y - p0.y;\n return lineAngleFromDelta(dx, dy);\n};\n\nvar bezierAngle = function bezierAngle(p0, p1, p2, t) {\n var t0 = bound(0, t - 0.001, 1);\n var t1 = bound(0, t + 0.001, 1);\n var lp0 = qbezierPtAt(p0, p1, p2, t0);\n var lp1 = qbezierPtAt(p0, p1, p2, t1);\n return lineAngle(lp0, lp1);\n};\n\nBRp$6.recalculateEdgeLabelProjections = function (edge) {\n var p;\n var _p = edge._private;\n var rs = _p.rscratch;\n var r = this;\n var content = {\n mid: edge.pstyle('label').strValue,\n source: edge.pstyle('source-label').strValue,\n target: edge.pstyle('target-label').strValue\n };\n\n if (content.mid || content.source || content.target) ; else {\n return; // no labels => no calcs\n } // add center point to style so bounding box calculations can use it\n //\n\n\n p = {\n x: rs.midX,\n y: rs.midY\n };\n\n var setRs = function setRs(propName, prefix, value) {\n setPrefixedProperty(_p.rscratch, propName, prefix, value);\n setPrefixedProperty(_p.rstyle, propName, prefix, value);\n };\n\n setRs('labelX', null, p.x);\n setRs('labelY', null, p.y);\n var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY);\n setRs('labelAutoAngle', null, midAngle);\n\n var createControlPointInfo = function createControlPointInfo() {\n if (createControlPointInfo.cache) {\n return createControlPointInfo.cache;\n } // use cache so only 1x per edge\n\n\n var ctrlpts = []; // store each ctrlpt info init\n\n for (var i = 0; i + 5 < rs.allpts.length; i += 4) {\n var p0 = {\n x: rs.allpts[i],\n y: rs.allpts[i + 1]\n };\n var p1 = {\n x: rs.allpts[i + 2],\n y: rs.allpts[i + 3]\n }; // ctrlpt\n\n var p2 = {\n x: rs.allpts[i + 4],\n y: rs.allpts[i + 5]\n };\n ctrlpts.push({\n p0: p0,\n p1: p1,\n p2: p2,\n startDist: 0,\n length: 0,\n segments: []\n });\n }\n\n var bpts = _p.rstyle.bezierPts;\n var nProjs = r.bezierProjPcts.length;\n\n function addSegment(cp, p0, p1, t0, t1) {\n var length = dist(p0, p1);\n var prevSegment = cp.segments[cp.segments.length - 1];\n var segment = {\n p0: p0,\n p1: p1,\n t0: t0,\n t1: t1,\n startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0,\n length: length\n };\n cp.segments.push(segment);\n cp.length += length;\n } // update each ctrlpt with segment info\n\n\n for (var _i = 0; _i < ctrlpts.length; _i++) {\n var cp = ctrlpts[_i];\n var prevCp = ctrlpts[_i - 1];\n\n if (prevCp) {\n cp.startDist = prevCp.startDist + prevCp.length;\n }\n\n addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first\n\n for (var j = 0; j < nProjs - 1; j++) {\n addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]);\n }\n\n addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last\n }\n\n return createControlPointInfo.cache = ctrlpts;\n };\n\n var calculateEndProjection = function calculateEndProjection(prefix) {\n var angle;\n var isSrc = prefix === 'source';\n\n if (!content[prefix]) {\n return;\n }\n\n var offset = edge.pstyle(prefix + '-text-offset').pfValue;\n\n switch (rs.edgeType) {\n case 'self':\n case 'compound':\n case 'bezier':\n case 'multibezier':\n {\n var cps = createControlPointInfo();\n var selected;\n var startDist = 0;\n var totalDist = 0; // find the segment we're on\n\n for (var i = 0; i < cps.length; i++) {\n var _cp = cps[isSrc ? i : cps.length - 1 - i];\n\n for (var j = 0; j < _cp.segments.length; j++) {\n var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j];\n var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1;\n startDist = totalDist;\n totalDist += _seg.length;\n\n if (totalDist >= offset || lastSeg) {\n selected = {\n cp: _cp,\n segment: _seg\n };\n break;\n }\n }\n\n if (selected) {\n break;\n }\n }\n\n var cp = selected.cp;\n var seg = selected.segment;\n var tSegment = (offset - startDist) / seg.length;\n var segDt = seg.t1 - seg.t0;\n var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment;\n t = bound(0, t, 1);\n p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t);\n angle = bezierAngle(cp.p0, cp.p1, cp.p2, t);\n break;\n }\n\n case 'straight':\n case 'segments':\n case 'haystack':\n {\n var d = 0,\n di,\n d0;\n var p0, p1;\n var l = rs.allpts.length;\n\n for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) {\n if (isSrc) {\n p0 = {\n x: rs.allpts[_i2],\n y: rs.allpts[_i2 + 1]\n };\n p1 = {\n x: rs.allpts[_i2 + 2],\n y: rs.allpts[_i2 + 3]\n };\n } else {\n p0 = {\n x: rs.allpts[l - 2 - _i2],\n y: rs.allpts[l - 1 - _i2]\n };\n p1 = {\n x: rs.allpts[l - 4 - _i2],\n y: rs.allpts[l - 3 - _i2]\n };\n }\n\n di = dist(p0, p1);\n d0 = d;\n d += di;\n\n if (d >= offset) {\n break;\n }\n }\n\n var pD = offset - d0;\n\n var _t = pD / di;\n\n _t = bound(0, _t, 1);\n p = lineAt(p0, p1, _t);\n angle = lineAngle(p0, p1);\n break;\n }\n }\n\n setRs('labelX', prefix, p.x);\n setRs('labelY', prefix, p.y);\n setRs('labelAutoAngle', prefix, angle);\n };\n\n calculateEndProjection('source');\n calculateEndProjection('target');\n this.applyLabelDimensions(edge);\n};\n\nBRp$6.applyLabelDimensions = function (ele) {\n this.applyPrefixedLabelDimensions(ele);\n\n if (ele.isEdge()) {\n this.applyPrefixedLabelDimensions(ele, 'source');\n this.applyPrefixedLabelDimensions(ele, 'target');\n }\n};\n\nBRp$6.applyPrefixedLabelDimensions = function (ele, prefix) {\n var _p = ele._private;\n var text = this.getLabelText(ele, prefix);\n var labelDims = this.calculateLabelDimensions(ele, text);\n var lineHeight = ele.pstyle('line-height').pfValue;\n var textWrap = ele.pstyle('text-wrap').strValue;\n var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || [];\n var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1);\n var normPerLineHeight = labelDims.height / numLines;\n var labelLineHeight = normPerLineHeight * lineHeight;\n var width = labelDims.width;\n var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight;\n setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width);\n setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width);\n setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height);\n setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height);\n setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight);\n};\n\nBRp$6.getLabelText = function (ele, prefix) {\n var _p = ele._private;\n var pfd = prefix ? prefix + '-' : '';\n var text = ele.pstyle(pfd + 'label').strValue;\n var textTransform = ele.pstyle('text-transform').value;\n\n var rscratch = function rscratch(propName, value) {\n if (value) {\n setPrefixedProperty(_p.rscratch, propName, prefix, value);\n return value;\n } else {\n return getPrefixedProperty(_p.rscratch, propName, prefix);\n }\n }; // for empty text, skip all processing\n\n\n if (!text) {\n return '';\n }\n\n if (textTransform == 'none') ; else if (textTransform == 'uppercase') {\n text = text.toUpperCase();\n } else if (textTransform == 'lowercase') {\n text = text.toLowerCase();\n }\n\n var wrapStyle = ele.pstyle('text-wrap').value;\n\n if (wrapStyle === 'wrap') {\n var labelKey = rscratch('labelKey'); // save recalc if the label is the same as before\n\n if (labelKey != null && rscratch('labelWrapKey') === labelKey) {\n return rscratch('labelWrapCachedText');\n }\n\n var zwsp = \"\\u200B\";\n var lines = text.split('\\n');\n var maxW = ele.pstyle('text-max-width').pfValue;\n var overflow = ele.pstyle('text-overflow-wrap').value;\n var overflowAny = overflow === 'anywhere';\n var wrappedLines = [];\n var wordsRegex = /[\\s\\u200b]+/;\n var wordSeparator = overflowAny ? '' : ' ';\n\n for (var l = 0; l < lines.length; l++) {\n var line = lines[l];\n var lineDims = this.calculateLabelDimensions(ele, line);\n var lineW = lineDims.width;\n\n if (overflowAny) {\n var processedLine = line.split('').join(zwsp);\n line = processedLine;\n }\n\n if (lineW > maxW) {\n // line is too long\n var words = line.split(wordsRegex);\n var subline = '';\n\n for (var w = 0; w < words.length; w++) {\n var word = words[w];\n var testLine = subline.length === 0 ? word : subline + wordSeparator + word;\n var testDims = this.calculateLabelDimensions(ele, testLine);\n var testW = testDims.width;\n\n if (testW <= maxW) {\n // word fits on current line\n subline += word + wordSeparator;\n } else {\n // word starts new line\n if (subline) {\n wrappedLines.push(subline);\n }\n\n subline = word + wordSeparator;\n }\n } // if there's remaining text, put it in a wrapped line\n\n\n if (!subline.match(/^[\\s\\u200b]+$/)) {\n wrappedLines.push(subline);\n }\n } else {\n // line is already short enough\n wrappedLines.push(line);\n }\n } // for\n\n\n rscratch('labelWrapCachedLines', wrappedLines);\n text = rscratch('labelWrapCachedText', wrappedLines.join('\\n'));\n rscratch('labelWrapKey', labelKey);\n } else if (wrapStyle === 'ellipsis') {\n var _maxW = ele.pstyle('text-max-width').pfValue;\n var ellipsized = '';\n var ellipsis = \"\\u2026\";\n var incLastCh = false;\n\n if (this.calculateLabelDimensions(ele, text).width < _maxW) {\n // the label already fits\n return text;\n }\n\n for (var i = 0; i < text.length; i++) {\n var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width;\n\n if (widthWithNextCh > _maxW) {\n break;\n }\n\n ellipsized += text[i];\n\n if (i === text.length - 1) {\n incLastCh = true;\n }\n }\n\n if (!incLastCh) {\n ellipsized += ellipsis;\n }\n\n return ellipsized;\n } // if ellipsize\n\n\n return text;\n};\n\nBRp$6.getLabelJustification = function (ele) {\n var justification = ele.pstyle('text-justification').strValue;\n var textHalign = ele.pstyle('text-halign').strValue;\n\n if (justification === 'auto') {\n if (ele.isNode()) {\n switch (textHalign) {\n case 'left':\n return 'right';\n\n case 'right':\n return 'left';\n\n default:\n return 'center';\n }\n } else {\n return 'center';\n }\n } else {\n return justification;\n }\n};\n\nBRp$6.calculateLabelDimensions = function (ele, text) {\n var r = this;\n var cacheKey = hashString(text, ele._private.labelDimsKey);\n var cache = r.labelDimCache || (r.labelDimCache = []);\n var existingVal = cache[cacheKey];\n\n if (existingVal != null) {\n return existingVal;\n }\n\n var padding = 0; // add padding around text dims, as the measurement isn't that accurate\n\n var fStyle = ele.pstyle('font-style').strValue;\n var size = ele.pstyle('font-size').pfValue;\n var family = ele.pstyle('font-family').strValue;\n var weight = ele.pstyle('font-weight').strValue;\n var canvas = this.labelCalcCanvas;\n var c2d = this.labelCalcCanvasContext;\n\n if (!canvas) {\n canvas = this.labelCalcCanvas = document.createElement('canvas');\n c2d = this.labelCalcCanvasContext = canvas.getContext('2d');\n var ds = canvas.style;\n ds.position = 'absolute';\n ds.left = '-9999px';\n ds.top = '-9999px';\n ds.zIndex = '-1';\n ds.visibility = 'hidden';\n ds.pointerEvents = 'none';\n }\n\n c2d.font = \"\".concat(fStyle, \" \").concat(weight, \" \").concat(size, \"px \").concat(family);\n var width = 0;\n var height = 0;\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i];\n var metrics = c2d.measureText(line);\n var w = Math.ceil(metrics.width);\n var h = size;\n width = Math.max(w, width);\n height += h;\n }\n\n width += padding;\n height += padding;\n return cache[cacheKey] = {\n width: width,\n height: height\n };\n};\n\nBRp$6.calculateLabelAngle = function (ele, prefix) {\n var _p = ele._private;\n var rs = _p.rscratch;\n var isEdge = ele.isEdge();\n var prefixDash = prefix ? prefix + '-' : '';\n var rot = ele.pstyle(prefixDash + 'text-rotation');\n var rotStr = rot.strValue;\n\n if (rotStr === 'none') {\n return 0;\n } else if (isEdge && rotStr === 'autorotate') {\n return rs.labelAutoAngle;\n } else if (rotStr === 'autorotate') {\n return 0;\n } else {\n return rot.pfValue;\n }\n};\n\nBRp$6.calculateLabelAngles = function (ele) {\n var r = this;\n var isEdge = ele.isEdge();\n var _p = ele._private;\n var rs = _p.rscratch;\n rs.labelAngle = r.calculateLabelAngle(ele);\n\n if (isEdge) {\n rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source');\n rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target');\n }\n};\n\nvar BRp$7 = {};\nvar TOO_SMALL_CUT_RECT = 28;\nvar warnedCutRect = false;\n\nBRp$7.getNodeShape = function (node) {\n var r = this;\n var shape = node.pstyle('shape').value;\n\n if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) {\n if (!warnedCutRect) {\n warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead');\n warnedCutRect = true;\n }\n\n return 'rectangle';\n }\n\n if (node.isParent()) {\n if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') {\n return shape;\n } else {\n return 'rectangle';\n }\n }\n\n if (shape === 'polygon') {\n var points = node.pstyle('shape-polygon-points').value;\n return r.nodeShapes.makePolygon(points).name;\n }\n\n return shape;\n};\n\nvar BRp$8 = {};\n\nBRp$8.registerCalculationListeners = function () {\n var cy = this.cy;\n var elesToUpdate = cy.collection();\n var r = this;\n\n var enqueue = function enqueue(eles) {\n var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n elesToUpdate.merge(eles);\n\n if (dirtyStyleCaches) {\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _p = ele._private;\n var rstyle = _p.rstyle;\n rstyle.clean = false;\n rstyle.cleanConnected = false;\n }\n }\n };\n\n r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) {\n var ele = e.target;\n enqueue(ele);\n }).on('style.* background.*', function onDirtyStyle(e) {\n var ele = e.target;\n enqueue(ele, false);\n });\n\n var updateEleCalcs = function updateEleCalcs(willDraw) {\n if (willDraw) {\n var fns = r.onUpdateEleCalcsFns; // because we need to have up-to-date style (e.g. stylesheet mappers)\n // before calculating rendered style (and pstyle might not be called yet)\n\n elesToUpdate.cleanStyle();\n\n for (var i = 0; i < elesToUpdate.length; i++) {\n var ele = elesToUpdate[i];\n var rstyle = ele._private.rstyle;\n\n if (ele.isNode() && !rstyle.cleanConnected) {\n enqueue(ele.connectedEdges());\n rstyle.cleanConnected = true;\n }\n }\n\n if (fns) {\n for (var _i = 0; _i < fns.length; _i++) {\n var fn = fns[_i];\n fn(willDraw, elesToUpdate);\n }\n }\n\n r.recalculateRenderedStyle(elesToUpdate);\n elesToUpdate = cy.collection();\n }\n };\n\n r.flushRenderedStyleQueue = function () {\n updateEleCalcs(true);\n };\n\n r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs);\n};\n\nBRp$8.onUpdateEleCalcs = function (fn) {\n var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || [];\n fns.push(fn);\n};\n\nBRp$8.recalculateRenderedStyle = function (eles, useCache) {\n var isCleanConnected = function isCleanConnected(ele) {\n return ele._private.rstyle.cleanConnected;\n };\n\n var edges = [];\n var nodes = []; // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox()\n\n if (this.destroyed) {\n return;\n } // use cache by default for perf\n\n\n if (useCache === undefined) {\n useCache = true;\n }\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var _p = ele._private;\n var rstyle = _p.rstyle; // an edge may be implicitly dirty b/c of one of its connected nodes\n // (and a request for recalc may come in between frames)\n\n if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) {\n rstyle.clean = false;\n } // only update if dirty and in graph\n\n\n if (useCache && rstyle.clean || ele.removed()) {\n continue;\n } // only update if not display: none\n\n\n if (ele.pstyle('display').value === 'none') {\n continue;\n }\n\n if (_p.group === 'nodes') {\n nodes.push(ele);\n } else {\n // edges\n edges.push(ele);\n }\n\n rstyle.clean = true;\n } // update node data from projections\n\n\n for (var _i2 = 0; _i2 < nodes.length; _i2++) {\n var _ele = nodes[_i2];\n var _p2 = _ele._private;\n var _rstyle = _p2.rstyle;\n\n var pos = _ele.position();\n\n this.recalculateNodeLabelProjection(_ele);\n _rstyle.nodeX = pos.x;\n _rstyle.nodeY = pos.y;\n _rstyle.nodeW = _ele.pstyle('width').pfValue;\n _rstyle.nodeH = _ele.pstyle('height').pfValue;\n }\n\n this.recalculateEdgeProjections(edges); // update edge data from projections\n\n for (var _i3 = 0; _i3 < edges.length; _i3++) {\n var _ele2 = edges[_i3];\n var _p3 = _ele2._private;\n var _rstyle2 = _p3.rstyle;\n var rs = _p3.rscratch; // update rstyle positions\n\n _rstyle2.srcX = rs.arrowStartX;\n _rstyle2.srcY = rs.arrowStartY;\n _rstyle2.tgtX = rs.arrowEndX;\n _rstyle2.tgtY = rs.arrowEndY;\n _rstyle2.midX = rs.midX;\n _rstyle2.midY = rs.midY;\n _rstyle2.labelAngle = rs.labelAngle;\n _rstyle2.sourceLabelAngle = rs.sourceLabelAngle;\n _rstyle2.targetLabelAngle = rs.targetLabelAngle;\n }\n};\n\nvar BRp$9 = {};\n\nBRp$9.updateCachedGrabbedEles = function () {\n var eles = this.cachedZSortedEles;\n\n if (!eles) {\n // just let this be recalculated on the next z sort tick\n return;\n }\n\n eles.drag = [];\n eles.nondrag = [];\n var grabTargets = [];\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var rs = ele._private.rscratch;\n\n if (ele.grabbed() && !ele.isParent()) {\n grabTargets.push(ele);\n } else if (rs.inDragLayer) {\n eles.drag.push(ele);\n } else {\n eles.nondrag.push(ele);\n }\n } // put the grab target nodes last so it's on top of its neighbourhood\n\n\n for (var i = 0; i < grabTargets.length; i++) {\n var ele = grabTargets[i];\n eles.drag.push(ele);\n }\n};\n\nBRp$9.invalidateCachedZSortedEles = function () {\n this.cachedZSortedEles = null;\n};\n\nBRp$9.getCachedZSortedEles = function (forceRecalc) {\n if (forceRecalc || !this.cachedZSortedEles) {\n var eles = this.cy.mutableElements().toArray();\n eles.sort(zIndexSort);\n eles.interactive = eles.filter(function (ele) {\n return ele.interactive();\n });\n this.cachedZSortedEles = eles;\n this.updateCachedGrabbedEles();\n } else {\n eles = this.cachedZSortedEles;\n }\n\n return eles;\n};\n\nvar BRp$a = {};\n[BRp$1, BRp$2, BRp$3, BRp$4, BRp$5, BRp$6, BRp$7, BRp$8, BRp$9].forEach(function (props) {\n extend(BRp$a, props);\n});\n\nvar BRp$b = {};\n\nBRp$b.getCachedImage = function (url, crossOrigin, onLoad) {\n var r = this;\n var imageCache = r.imageCache = r.imageCache || {};\n var cache = imageCache[url];\n\n if (cache) {\n if (!cache.image.complete) {\n cache.image.addEventListener('load', onLoad);\n }\n\n return cache.image;\n } else {\n cache = imageCache[url] = imageCache[url] || {};\n var image = cache.image = new Image(); // eslint-disable-line no-undef\n\n image.addEventListener('load', onLoad);\n image.addEventListener('error', function () {\n image.error = true;\n }); // #1582 safari doesn't load data uris with crossOrigin properly\n // https://bugs.webkit.org/show_bug.cgi?id=123978\n\n var dataUriPrefix = 'data:';\n var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix;\n\n if (!isDataUri) {\n image.crossOrigin = crossOrigin; // prevent tainted canvas\n }\n\n image.src = url;\n return image;\n }\n};\n\nvar BRp$c = {};\n/* global document, window, ResizeObserver, MutationObserver */\n\nBRp$c.registerBinding = function (target, event, handler, useCapture) {\n // eslint-disable-line no-unused-vars\n var args = Array.prototype.slice.apply(arguments, [1]); // copy\n\n var b = this.binder(target);\n return b.on.apply(b, args);\n};\n\nBRp$c.binder = function (tgt) {\n var r = this;\n var tgtIsDom = tgt === window || tgt === document || tgt === document.body || domElement(tgt);\n\n if (r.supportsPassiveEvents == null) {\n // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n var supportsPassive = false;\n\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n return true;\n }\n });\n window.addEventListener('test', null, opts);\n } catch (err) {// not supported\n }\n\n r.supportsPassiveEvents = supportsPassive;\n }\n\n var on = function on(event, handler, useCapture) {\n var args = Array.prototype.slice.call(arguments);\n\n if (tgtIsDom && r.supportsPassiveEvents) {\n // replace useCapture w/ opts obj\n args[2] = {\n capture: useCapture != null ? useCapture : false,\n passive: false,\n once: false\n };\n }\n\n r.bindings.push({\n target: tgt,\n args: args\n });\n (tgt.addEventListener || tgt.on).apply(tgt, args);\n return this;\n };\n\n return {\n on: on,\n addEventListener: on,\n addListener: on,\n bind: on\n };\n};\n\nBRp$c.nodeIsDraggable = function (node) {\n return node && node.isNode() && !node.locked() && node.grabbable();\n};\n\nBRp$c.nodeIsGrabbable = function (node) {\n return this.nodeIsDraggable(node) && node.interactive();\n};\n\nBRp$c.load = function () {\n var r = this;\n\n var isSelected = function isSelected(ele) {\n return ele.selected();\n };\n\n var triggerEvents = function triggerEvents(target, names, e, position) {\n if (target == null) {\n target = r.cy;\n }\n\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n target.emit({\n originalEvent: e,\n type: name,\n position: position\n });\n }\n };\n\n var isMultSelKeyDown = function isMultSelKeyDown(e) {\n return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey\n };\n\n var allowPanningPassthrough = function allowPanningPassthrough(down, downs) {\n var allowPassthrough = true;\n\n if (r.cy.hasCompoundNodes() && down && down.pannable()) {\n // a grabbable compound node below the ele => no passthrough panning\n for (var i = 0; downs && i < downs.length; i++) {\n var down = downs[i]; //if any parent node in event hierarchy isn't pannable, reject passthrough\n\n if (down.isNode() && down.isParent() && !down.pannable()) {\n allowPassthrough = false;\n break;\n }\n }\n } else {\n allowPassthrough = true;\n }\n\n return allowPassthrough;\n };\n\n var setGrabbed = function setGrabbed(ele) {\n ele[0]._private.grabbed = true;\n };\n\n var setFreed = function setFreed(ele) {\n ele[0]._private.grabbed = false;\n };\n\n var setInDragLayer = function setInDragLayer(ele) {\n ele[0]._private.rscratch.inDragLayer = true;\n };\n\n var setOutDragLayer = function setOutDragLayer(ele) {\n ele[0]._private.rscratch.inDragLayer = false;\n };\n\n var setGrabTarget = function setGrabTarget(ele) {\n ele[0]._private.rscratch.isGrabTarget = true;\n };\n\n var removeGrabTarget = function removeGrabTarget(ele) {\n ele[0]._private.rscratch.isGrabTarget = false;\n };\n\n var addToDragList = function addToDragList(ele, opts) {\n var list = opts.addToList;\n var listHasEle = list.has(ele);\n\n if (!listHasEle) {\n list.merge(ele);\n setGrabbed(ele);\n }\n }; // helper function to determine which child nodes and inner edges\n // of a compound node to be dragged as well as the grabbed and selected nodes\n\n\n var addDescendantsToDrag = function addDescendantsToDrag(node, opts) {\n if (!node.cy().hasCompoundNodes()) {\n return;\n }\n\n if (opts.inDragLayer == null && opts.addToList == null) {\n return;\n } // nothing to do\n\n\n var innerNodes = node.descendants();\n\n if (opts.inDragLayer) {\n innerNodes.forEach(setInDragLayer);\n innerNodes.connectedEdges().forEach(setInDragLayer);\n }\n\n if (opts.addToList) {\n opts.addToList.unmerge(innerNodes);\n }\n }; // adds the given nodes and its neighbourhood to the drag layer\n\n\n var addNodesToDrag = function addNodesToDrag(nodes, opts) {\n opts = opts || {};\n var hasCompoundNodes = nodes.cy().hasCompoundNodes();\n\n if (opts.inDragLayer) {\n nodes.forEach(setInDragLayer);\n nodes.neighborhood().stdFilter(function (ele) {\n return !hasCompoundNodes || ele.isEdge();\n }).forEach(setInDragLayer);\n }\n\n if (opts.addToList) {\n nodes.forEach(function (ele) {\n addToDragList(ele, opts);\n });\n }\n\n addDescendantsToDrag(nodes, opts); // always add to drag\n // also add nodes and edges related to the topmost ancestor\n\n updateAncestorsInDragLayer(nodes, {\n inDragLayer: opts.inDragLayer\n });\n r.updateCachedGrabbedEles();\n };\n\n var addNodeToDrag = addNodesToDrag;\n\n var freeDraggedElements = function freeDraggedElements(grabbedEles) {\n if (!grabbedEles) {\n return;\n } // just go over all elements rather than doing a bunch of (possibly expensive) traversals\n\n\n r.getCachedZSortedEles().forEach(function (ele) {\n setFreed(ele);\n setOutDragLayer(ele);\n removeGrabTarget(ele);\n });\n r.updateCachedGrabbedEles();\n }; // helper function to determine which ancestor nodes and edges should go\n // to the drag layer (or should be removed from drag layer).\n\n\n var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) {\n if (opts.inDragLayer == null && opts.addToList == null) {\n return;\n } // nothing to do\n\n\n if (!node.cy().hasCompoundNodes()) {\n return;\n } // find top-level parent\n\n\n var parent = node.ancestors().orphans(); // no parent node: no nodes to add to the drag layer\n\n if (parent.same(node)) {\n return;\n }\n\n var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants());\n var edges = nodes.connectedEdges();\n\n if (opts.inDragLayer) {\n edges.forEach(setInDragLayer);\n nodes.forEach(setInDragLayer);\n }\n\n if (opts.addToList) {\n nodes.forEach(function (ele) {\n addToDragList(ele, opts);\n });\n }\n };\n\n var blurActiveDomElement = function blurActiveDomElement() {\n if (document.activeElement != null && document.activeElement.blur != null) {\n document.activeElement.blur();\n }\n };\n\n var haveMutationsApi = typeof MutationObserver !== 'undefined';\n var haveResizeObserverApi = typeof ResizeObserver !== 'undefined'; // watch for when the cy container is removed from the dom\n\n if (haveMutationsApi) {\n r.removeObserver = new MutationObserver(function (mutns) {\n // eslint-disable-line no-undef\n for (var i = 0; i < mutns.length; i++) {\n var mutn = mutns[i];\n var rNodes = mutn.removedNodes;\n\n if (rNodes) {\n for (var j = 0; j < rNodes.length; j++) {\n var rNode = rNodes[j];\n\n if (rNode === r.container) {\n r.destroy();\n break;\n }\n }\n }\n }\n });\n\n if (r.container.parentNode) {\n r.removeObserver.observe(r.container.parentNode, {\n childList: true\n });\n }\n } else {\n r.registerBinding(r.container, 'DOMNodeRemoved', function (e) {\n // eslint-disable-line no-unused-vars\n r.destroy();\n });\n }\n\n var onResize = util(function () {\n r.cy.resize();\n }, 100);\n\n if (haveMutationsApi) {\n r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef\n\n r.styleObserver.observe(r.container, {\n attributes: true\n });\n } // auto resize\n\n\n r.registerBinding(window, 'resize', onResize); // eslint-disable-line no-undef\n\n if (haveResizeObserverApi) {\n r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef\n\n r.resizeObserver.observe(r.container);\n }\n\n var forEachUp = function forEachUp(domEle, fn) {\n while (domEle != null) {\n fn(domEle);\n domEle = domEle.parentNode;\n }\n };\n\n var invalidateCoords = function invalidateCoords() {\n r.invalidateContainerClientCoordsCache();\n };\n\n forEachUp(r.container, function (domEle) {\n r.registerBinding(domEle, 'transitionend', invalidateCoords);\n r.registerBinding(domEle, 'animationend', invalidateCoords);\n r.registerBinding(domEle, 'scroll', invalidateCoords);\n }); // stop right click menu from appearing on cy\n\n r.registerBinding(r.container, 'contextmenu', function (e) {\n e.preventDefault();\n });\n\n var inBoxSelection = function inBoxSelection() {\n return r.selection[4] !== 0;\n };\n\n var eventInContainer = function eventInContainer(e) {\n // save cycles if mouse events aren't to be captured\n var containerPageCoords = r.findContainerClientCoords();\n var x = containerPageCoords[0];\n var y = containerPageCoords[1];\n var width = containerPageCoords[2];\n var height = containerPageCoords[3];\n var positions = e.touches ? e.touches : [e];\n var atLeastOnePosInside = false;\n\n for (var i = 0; i < positions.length; i++) {\n var p = positions[i];\n\n if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) {\n atLeastOnePosInside = true;\n break;\n }\n }\n\n if (!atLeastOnePosInside) {\n return false;\n }\n\n var container = r.container;\n var target = e.target;\n var tParent = target.parentNode;\n var containerIsTarget = false;\n\n while (tParent) {\n if (tParent === container) {\n containerIsTarget = true;\n break;\n }\n\n tParent = tParent.parentNode;\n }\n\n if (!containerIsTarget) {\n return false;\n } // if target is outisde cy container, then this event is not for us\n\n\n return true;\n }; // Primary key\n\n\n r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) {\n if (!eventInContainer(e)) {\n return;\n }\n\n e.preventDefault();\n blurActiveDomElement();\n r.hoverData.capture = true;\n r.hoverData.which = e.which;\n var cy = r.cy;\n var gpos = [e.clientX, e.clientY];\n var pos = r.projectIntoViewport(gpos[0], gpos[1]);\n var select = r.selection;\n var nears = r.findNearestElements(pos[0], pos[1], true, false);\n var near = nears[0];\n var draggedElements = r.dragData.possibleDragElements;\n r.hoverData.mdownPos = pos;\n r.hoverData.mdownGPos = gpos;\n\n var checkForTaphold = function checkForTaphold() {\n r.hoverData.tapholdCancelled = false;\n clearTimeout(r.hoverData.tapholdTimeout);\n r.hoverData.tapholdTimeout = setTimeout(function () {\n if (r.hoverData.tapholdCancelled) {\n return;\n } else {\n var ele = r.hoverData.down;\n\n if (ele) {\n ele.emit({\n originalEvent: e,\n type: 'taphold',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n } else {\n cy.emit({\n originalEvent: e,\n type: 'taphold',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n }\n }, r.tapholdDuration);\n }; // Right click button\n\n\n if (e.which == 3) {\n r.hoverData.cxtStarted = true;\n var cxtEvt = {\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n\n if (near) {\n near.activate();\n near.emit(cxtEvt);\n r.hoverData.down = near;\n } else {\n cy.emit(cxtEvt);\n }\n\n r.hoverData.downTime = new Date().getTime();\n r.hoverData.cxtDragged = false; // Primary button\n } else if (e.which == 1) {\n if (near) {\n near.activate();\n } // Element dragging\n\n\n {\n // If something is under the cursor and it is draggable, prepare to grab it\n if (near != null) {\n if (r.nodeIsGrabbable(near)) {\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n };\n\n var triggerGrab = function triggerGrab(ele) {\n ele.emit(makeEvent('grab'));\n };\n\n setGrabTarget(near);\n\n if (!near.selected()) {\n draggedElements = r.dragData.possibleDragElements = cy.collection();\n addNodeToDrag(near, {\n addToList: draggedElements\n });\n near.emit(makeEvent('grabon')).emit(makeEvent('grab'));\n } else {\n draggedElements = r.dragData.possibleDragElements = cy.collection();\n var selectedNodes = cy.$(function (ele) {\n return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele);\n });\n addNodesToDrag(selectedNodes, {\n addToList: draggedElements\n });\n near.emit(makeEvent('grabon'));\n selectedNodes.forEach(triggerGrab);\n }\n\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n }\n }\n\n r.hoverData.down = near;\n r.hoverData.downs = nears;\n r.hoverData.downTime = new Date().getTime();\n }\n triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, {\n x: pos[0],\n y: pos[1]\n });\n\n if (near == null) {\n select[4] = 1;\n r.data.bgActivePosistion = {\n x: pos[0],\n y: pos[1]\n };\n r.redrawHint('select', true);\n r.redraw();\n } else if (near.pannable()) {\n select[4] = 1; // for future pan\n }\n\n checkForTaphold();\n } // Initialize selection box coordinates\n\n\n select[0] = select[2] = pos[0];\n select[1] = select[3] = pos[1];\n }, false);\n r.registerBinding(window, 'mousemove', function mousemoveHandler(e) {\n // eslint-disable-line no-undef\n var capture = r.hoverData.capture;\n\n if (!capture && !eventInContainer(e)) {\n return;\n }\n\n var preventDefault = false;\n var cy = r.cy;\n var zoom = cy.zoom();\n var gpos = [e.clientX, e.clientY];\n var pos = r.projectIntoViewport(gpos[0], gpos[1]);\n var mdownPos = r.hoverData.mdownPos;\n var mdownGPos = r.hoverData.mdownGPos;\n var select = r.selection;\n var near = null;\n\n if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) {\n near = r.findNearestElement(pos[0], pos[1], true, false);\n }\n\n var last = r.hoverData.last;\n var down = r.hoverData.down;\n var disp = [pos[0] - select[2], pos[1] - select[3]];\n var draggedElements = r.dragData.possibleDragElements;\n var isOverThresholdDrag;\n\n if (mdownGPos) {\n var dx = gpos[0] - mdownGPos[0];\n var dx2 = dx * dx;\n var dy = gpos[1] - mdownGPos[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2;\n }\n\n var multSelKeyDown = isMultSelKeyDown(e);\n\n if (isOverThresholdDrag) {\n r.hoverData.tapholdCancelled = true;\n }\n\n var updateDragDelta = function updateDragDelta() {\n var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || [];\n\n if (dragDelta.length === 0) {\n dragDelta.push(disp[0]);\n dragDelta.push(disp[1]);\n } else {\n dragDelta[0] += disp[0];\n dragDelta[1] += disp[1];\n }\n };\n\n preventDefault = true;\n triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, {\n x: pos[0],\n y: pos[1]\n });\n\n var goIntoBoxMode = function goIntoBoxMode() {\n r.data.bgActivePosistion = undefined;\n\n if (!r.hoverData.selecting) {\n cy.emit({\n originalEvent: e,\n type: 'boxstart',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n\n select[4] = 1;\n r.hoverData.selecting = true;\n r.redrawHint('select', true);\n r.redraw();\n }; // trigger context drag if rmouse down\n\n\n if (r.hoverData.which === 3) {\n // but only if over threshold\n if (isOverThresholdDrag) {\n var cxtEvt = {\n originalEvent: e,\n type: 'cxtdrag',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n\n if (down) {\n down.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n\n r.hoverData.cxtDragged = true;\n\n if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) {\n if (r.hoverData.cxtOver) {\n r.hoverData.cxtOver.emit({\n originalEvent: e,\n type: 'cxtdragout',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n\n r.hoverData.cxtOver = near;\n\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'cxtdragover',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n }\n } // Check if we are drag panning the entire graph\n\n } else if (r.hoverData.dragging) {\n preventDefault = true;\n\n if (cy.panningEnabled() && cy.userPanningEnabled()) {\n var deltaP;\n\n if (r.hoverData.justStartedPan) {\n var mdPos = r.hoverData.mdownPos;\n deltaP = {\n x: (pos[0] - mdPos[0]) * zoom,\n y: (pos[1] - mdPos[1]) * zoom\n };\n r.hoverData.justStartedPan = false;\n } else {\n deltaP = {\n x: disp[0] * zoom,\n y: disp[1] * zoom\n };\n }\n\n cy.panBy(deltaP);\n r.hoverData.dragged = true;\n } // Needs reproject due to pan changing viewport\n\n\n pos = r.projectIntoViewport(e.clientX, e.clientY); // Checks primary button down & out of time & mouse not moved much\n } else if (select[4] == 1 && (down == null || down.pannable())) {\n if (isOverThresholdDrag) {\n if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) {\n goIntoBoxMode();\n } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) {\n var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs);\n\n if (allowPassthrough) {\n r.hoverData.dragging = true;\n r.hoverData.justStartedPan = true;\n select[4] = 0;\n r.data.bgActivePosistion = array2point(mdownPos);\n r.redrawHint('select', true);\n r.redraw();\n }\n }\n\n if (down && down.pannable() && down.active()) {\n down.unactivate();\n }\n }\n } else {\n if (down && down.pannable() && down.active()) {\n down.unactivate();\n }\n\n if ((!down || !down.grabbed()) && near != last) {\n if (last) {\n triggerEvents(last, ['mouseout', 'tapdragout'], e, {\n x: pos[0],\n y: pos[1]\n });\n }\n\n if (near) {\n triggerEvents(near, ['mouseover', 'tapdragover'], e, {\n x: pos[0],\n y: pos[1]\n });\n }\n\n r.hoverData.last = near;\n }\n\n if (down) {\n if (isOverThresholdDrag) {\n // then we can take action\n if (cy.boxSelectionEnabled() && multSelKeyDown) {\n // then selection overrides\n if (down && down.grabbed()) {\n freeDraggedElements(draggedElements);\n down.emit('freeon');\n draggedElements.emit('free');\n\n if (r.dragData.didDrag) {\n down.emit('dragfreeon');\n draggedElements.emit('dragfree');\n }\n }\n\n goIntoBoxMode();\n } else if (down && down.grabbed() && r.nodeIsDraggable(down)) {\n // drag node\n var justStartedDrag = !r.dragData.didDrag;\n\n if (justStartedDrag) {\n r.redrawHint('eles', true);\n }\n\n r.dragData.didDrag = true; // indicate that we actually did drag the node\n\n var toTrigger = cy.collection(); // now, add the elements to the drag layer if not done already\n\n if (!r.hoverData.draggingEles) {\n addNodesToDrag(draggedElements, {\n inDragLayer: true\n });\n }\n\n var totalShift = {\n x: 0,\n y: 0\n };\n\n if (number(disp[0]) && number(disp[1])) {\n totalShift.x += disp[0];\n totalShift.y += disp[1];\n\n if (justStartedDrag) {\n var dragDelta = r.hoverData.dragDelta;\n\n if (dragDelta && number(dragDelta[0]) && number(dragDelta[1])) {\n totalShift.x += dragDelta[0];\n totalShift.y += dragDelta[1];\n }\n }\n }\n\n for (var i = 0; i < draggedElements.length; i++) {\n var dEle = draggedElements[i];\n\n if (r.nodeIsDraggable(dEle) && dEle.grabbed()) {\n toTrigger.push(dEle);\n }\n }\n\n r.hoverData.draggingEles = true;\n toTrigger.silentShift(totalShift).emit('position drag');\n r.redrawHint('drag', true);\n r.redraw();\n }\n } else {\n // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant\n updateDragDelta();\n }\n } // prevent the dragging from triggering text selection on the page\n\n\n preventDefault = true;\n }\n\n select[2] = pos[0];\n select[3] = pos[1];\n\n if (preventDefault) {\n if (e.stopPropagation) e.stopPropagation();\n if (e.preventDefault) e.preventDefault();\n return false;\n }\n }, false);\n r.registerBinding(window, 'mouseup', function mouseupHandler(e) {\n // eslint-disable-line no-undef\n var capture = r.hoverData.capture;\n\n if (!capture) {\n return;\n }\n\n r.hoverData.capture = false;\n var cy = r.cy;\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n var select = r.selection;\n var near = r.findNearestElement(pos[0], pos[1], true, false);\n var draggedElements = r.dragData.possibleDragElements;\n var down = r.hoverData.down;\n var multSelKeyDown = isMultSelKeyDown(e);\n\n if (r.data.bgActivePosistion) {\n r.redrawHint('select', true);\n r.redraw();\n }\n\n r.hoverData.tapholdCancelled = true;\n r.data.bgActivePosistion = undefined; // not active bg now\n\n if (down) {\n down.unactivate();\n }\n\n if (r.hoverData.which === 3) {\n var cxtEvt = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n\n if (down) {\n down.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n\n if (!r.hoverData.cxtDragged) {\n var cxtTap = {\n originalEvent: e,\n type: 'cxttap',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n\n if (down) {\n down.emit(cxtTap);\n } else {\n cy.emit(cxtTap);\n }\n }\n\n r.hoverData.cxtDragged = false;\n r.hoverData.which = null;\n } else if (r.hoverData.which === 1) {\n triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, {\n x: pos[0],\n y: pos[1]\n });\n\n if (!r.dragData.didDrag // didn't move a node around\n && !r.hoverData.dragged // didn't pan\n && !r.hoverData.selecting // not box selection\n && !r.hoverData.isOverThresholdDrag // didn't move too much\n ) {\n triggerEvents(down, ['click', 'tap', 'vclick'], e, {\n x: pos[0],\n y: pos[1]\n });\n } // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something\n\n\n if (down == null && // not mousedown on node\n !r.dragData.didDrag // didn't move the node around\n && !r.hoverData.selecting // not box selection\n && !r.hoverData.dragged // didn't pan\n && !isMultSelKeyDown(e)) {\n cy.$(isSelected).unselect(['tapunselect']);\n\n if (draggedElements.length > 0) {\n r.redrawHint('eles', true);\n }\n\n r.dragData.possibleDragElements = draggedElements = cy.collection();\n } // Single selection\n\n\n if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) {\n if (near != null && near._private.selectable) {\n if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) {\n if (near.selected()) {\n near.unselect(['tapunselect']);\n } else {\n near.select(['tapselect']);\n }\n } else {\n if (!multSelKeyDown) {\n cy.$(isSelected).unmerge(near).unselect(['tapunselect']);\n near.select(['tapselect']);\n }\n }\n\n r.redrawHint('eles', true);\n }\n }\n\n if (r.hoverData.selecting) {\n var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3]));\n r.redrawHint('select', true);\n\n if (box.length > 0) {\n r.redrawHint('eles', true);\n }\n\n cy.emit({\n type: 'boxend',\n originalEvent: e,\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n\n if (cy.selectionType() === 'additive') {\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect');\n } else {\n if (!multSelKeyDown) {\n cy.$(isSelected).unmerge(box).unselect();\n }\n\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect');\n } // always need redraw in case eles unselectable\n\n\n r.redraw();\n } // Cancel drag pan\n\n\n if (r.hoverData.dragging) {\n r.hoverData.dragging = false;\n r.redrawHint('select', true);\n r.redrawHint('eles', true);\n r.redraw();\n }\n\n if (!select[4]) {\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n var downWasGrabbed = down && down.grabbed();\n freeDraggedElements(draggedElements);\n\n if (downWasGrabbed) {\n down.emit('freeon');\n draggedElements.emit('free');\n\n if (r.dragData.didDrag) {\n down.emit('dragfreeon');\n draggedElements.emit('dragfree');\n }\n }\n }\n } // else not right mouse\n\n\n select[4] = 0;\n r.hoverData.down = null;\n r.hoverData.cxtStarted = false;\n r.hoverData.draggingEles = false;\n r.hoverData.selecting = false;\n r.hoverData.isOverThresholdDrag = false;\n r.dragData.didDrag = false;\n r.hoverData.dragged = false;\n r.hoverData.dragDelta = [];\n r.hoverData.mdownPos = null;\n r.hoverData.mdownGPos = null;\n }, false);\n\n var wheelHandler = function wheelHandler(e) {\n if (r.scrollingPage) {\n return;\n } // while scrolling, ignore wheel-to-zoom\n\n\n var cy = r.cy;\n var zoom = cy.zoom();\n var pan = cy.pan();\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y];\n\n if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) {\n // if pan dragging or cxt dragging, wheel movements make no zoom\n e.preventDefault();\n return;\n }\n\n if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) {\n e.preventDefault();\n r.data.wheelZooming = true;\n clearTimeout(r.data.wheelTimeout);\n r.data.wheelTimeout = setTimeout(function () {\n r.data.wheelZooming = false;\n r.redrawHint('eles', true);\n r.redraw();\n }, 150);\n var diff;\n\n if (e.deltaY != null) {\n diff = e.deltaY / -250;\n } else if (e.wheelDeltaY != null) {\n diff = e.wheelDeltaY / 1000;\n } else {\n diff = e.wheelDelta / 1000;\n }\n\n diff = diff * r.wheelSensitivity;\n var needsWheelFix = e.deltaMode === 1;\n\n if (needsWheelFix) {\n // fixes slow wheel events on ff/linux and ff/windows\n diff *= 33;\n }\n\n var newZoom = cy.zoom() * Math.pow(10, diff);\n\n if (e.type === 'gesturechange') {\n newZoom = r.gestureStartZoom * e.scale;\n }\n\n cy.zoom({\n level: newZoom,\n renderedPosition: {\n x: rpos[0],\n y: rpos[1]\n }\n });\n }\n }; // Functions to help with whether mouse wheel should trigger zooming\n // --\n\n\n r.registerBinding(r.container, 'wheel', wheelHandler, true); // disable nonstandard wheel events\n // r.registerBinding(r.container, 'mousewheel', wheelHandler, true);\n // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true);\n // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox\n\n r.registerBinding(window, 'scroll', function scrollHandler(e) {\n // eslint-disable-line no-unused-vars\n r.scrollingPage = true;\n clearTimeout(r.scrollingPageTimeout);\n r.scrollingPageTimeout = setTimeout(function () {\n r.scrollingPage = false;\n }, 250);\n }, true); // desktop safari pinch to zoom start\n\n r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) {\n r.gestureStartZoom = r.cy.zoom();\n\n if (!r.hasTouchStarted) {\n // don't affect touch devices like iphone\n e.preventDefault();\n }\n }, true);\n r.registerBinding(r.container, 'gesturechange', function (e) {\n if (!r.hasTouchStarted) {\n // don't affect touch devices like iphone\n wheelHandler(e);\n }\n }, true); // Functions to help with handling mouseout/mouseover on the Cytoscape container\n // Handle mouseout on Cytoscape container\n\n r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) {\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n r.cy.emit({\n originalEvent: e,\n type: 'mouseout',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }, false);\n r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) {\n var pos = r.projectIntoViewport(e.clientX, e.clientY);\n r.cy.emit({\n originalEvent: e,\n type: 'mouseover',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }, false);\n var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom\n\n var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom\n\n var center1, modelCenter1; // center point on start pinch to zoom\n\n var offsetLeft, offsetTop;\n var containerWidth, containerHeight;\n var twoFingersStartInside;\n\n var distance = function distance(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n };\n\n var distanceSq = function distanceSq(x1, y1, x2, y2) {\n return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);\n };\n\n var touchstartHandler;\n r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) {\n r.hasTouchStarted = true;\n\n if (!eventInContainer(e)) {\n return;\n }\n\n blurActiveDomElement();\n r.touchData.capture = true;\n r.data.bgActivePosistion = undefined;\n var cy = r.cy;\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n } // record starting points for pinch-to-zoom\n\n\n if (e.touches[1]) {\n r.touchData.singleTouchMoved = true;\n freeDraggedElements(r.dragData.touchDragEles);\n var offsets = r.findContainerClientCoords();\n offsetLeft = offsets[0];\n offsetTop = offsets[1];\n containerWidth = offsets[2];\n containerHeight = offsets[3];\n f1x1 = e.touches[0].clientX - offsetLeft;\n f1y1 = e.touches[0].clientY - offsetTop;\n f2x1 = e.touches[1].clientX - offsetLeft;\n f2y1 = e.touches[1].clientY - offsetTop;\n twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight;\n var pan = cy.pan();\n var zoom = cy.zoom();\n distance1 = distance(f1x1, f1y1, f2x1, f2y1);\n distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1);\n center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2];\n modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom]; // consider context tap\n\n var cxtDistThreshold = 200;\n var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold;\n\n if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) {\n var near1 = r.findNearestElement(now[0], now[1], true, true);\n var near2 = r.findNearestElement(now[2], now[3], true, true);\n\n if (near1 && near1.isNode()) {\n near1.activate().emit({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n r.touchData.start = near1;\n } else if (near2 && near2.isNode()) {\n near2.activate().emit({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n r.touchData.start = near2;\n } else {\n cy.emit({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n\n r.touchData.cxt = true;\n r.touchData.cxtDragged = false;\n r.data.bgActivePosistion = undefined;\n r.redraw();\n return;\n }\n }\n\n if (e.touches[2]) {\n // ignore\n // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...)\n if (cy.boxSelectionEnabled()) {\n e.preventDefault();\n }\n } else if (e.touches[1]) ; else if (e.touches[0]) {\n var nears = r.findNearestElements(now[0], now[1], true, true);\n var near = nears[0];\n\n if (near != null) {\n near.activate();\n r.touchData.start = near;\n r.touchData.starts = nears;\n\n if (r.nodeIsGrabbable(near)) {\n var draggedEles = r.dragData.touchDragEles = cy.collection();\n var selectedNodes = null;\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n\n if (near.selected()) {\n // reset drag elements, since near will be added again\n selectedNodes = cy.$(function (ele) {\n return ele.selected() && r.nodeIsGrabbable(ele);\n });\n addNodesToDrag(selectedNodes, {\n addToList: draggedEles\n });\n } else {\n addNodeToDrag(near, {\n addToList: draggedEles\n });\n }\n\n setGrabTarget(near);\n\n var makeEvent = function makeEvent(type) {\n return {\n originalEvent: e,\n type: type,\n position: {\n x: now[0],\n y: now[1]\n }\n };\n };\n\n near.emit(makeEvent('grabon'));\n\n if (selectedNodes) {\n selectedNodes.forEach(function (n) {\n n.emit(makeEvent('grab'));\n });\n } else {\n near.emit(makeEvent('grab'));\n }\n }\n }\n\n triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, {\n x: now[0],\n y: now[1]\n });\n\n if (near == null) {\n r.data.bgActivePosistion = {\n x: pos[0],\n y: pos[1]\n };\n r.redrawHint('select', true);\n r.redraw();\n } // Tap, taphold\n // -----\n\n\n r.touchData.singleTouchMoved = false;\n r.touchData.singleTouchStartTime = +new Date();\n clearTimeout(r.touchData.tapholdTimeout);\n r.touchData.tapholdTimeout = setTimeout(function () {\n if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect\n && !r.touchData.selecting // box selection shouldn't allow taphold through\n ) {\n triggerEvents(r.touchData.start, ['taphold'], e, {\n x: now[0],\n y: now[1]\n });\n }\n }, r.tapholdDuration);\n }\n\n if (e.touches.length >= 1) {\n var sPos = r.touchData.startPosition = [];\n\n for (var i = 0; i < now.length; i++) {\n sPos[i] = earlier[i] = now[i];\n }\n\n var touch0 = e.touches[0];\n r.touchData.startGPosition = [touch0.clientX, touch0.clientY];\n }\n }, false);\n var touchmoveHandler;\n r.registerBinding(window, 'touchmove', touchmoveHandler = function touchmoveHandler(e) {\n // eslint-disable-line no-undef\n var capture = r.touchData.capture;\n\n if (!capture && !eventInContainer(e)) {\n return;\n }\n\n var select = r.selection;\n var cy = r.cy;\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n var zoom = cy.zoom();\n\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n\n var startGPos = r.touchData.startGPosition;\n var isOverThresholdDrag;\n\n if (capture && e.touches[0] && startGPos) {\n var disp = [];\n\n for (var j = 0; j < now.length; j++) {\n disp[j] = now[j] - earlier[j];\n }\n\n var dx = e.touches[0].clientX - startGPos[0];\n var dx2 = dx * dx;\n var dy = e.touches[0].clientY - startGPos[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n isOverThresholdDrag = dist2 >= r.touchTapThreshold2;\n } // context swipe cancelling\n\n\n if (capture && r.touchData.cxt) {\n e.preventDefault();\n var f1x2 = e.touches[0].clientX - offsetLeft,\n f1y2 = e.touches[0].clientY - offsetTop;\n var f2x2 = e.touches[1].clientX - offsetLeft,\n f2y2 = e.touches[1].clientY - offsetTop; // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 );\n\n var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2);\n var factorSq = distance2Sq / distance1Sq;\n var distThreshold = 150;\n var distThresholdSq = distThreshold * distThreshold;\n var factorThreshold = 1.5;\n var factorThresholdSq = factorThreshold * factorThreshold; // cancel ctx gestures if the distance b/t the fingers increases\n\n if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) {\n r.touchData.cxt = false;\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var cxtEvt = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: now[0],\n y: now[1]\n }\n };\n\n if (r.touchData.start) {\n r.touchData.start.unactivate().emit(cxtEvt);\n r.touchData.start = null;\n } else {\n cy.emit(cxtEvt);\n }\n }\n } // context swipe\n\n\n if (capture && r.touchData.cxt) {\n var cxtEvt = {\n originalEvent: e,\n type: 'cxtdrag',\n position: {\n x: now[0],\n y: now[1]\n }\n };\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n\n if (r.touchData.start) {\n r.touchData.start.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n\n r.touchData.cxtDragged = true;\n var near = r.findNearestElement(now[0], now[1], true, true);\n\n if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) {\n if (r.touchData.cxtOver) {\n r.touchData.cxtOver.emit({\n originalEvent: e,\n type: 'cxtdragout',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n\n r.touchData.cxtOver = near;\n\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'cxtdragover',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n } // box selection\n\n } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) {\n e.preventDefault();\n r.data.bgActivePosistion = undefined;\n this.lastThreeTouch = +new Date();\n\n if (!r.touchData.selecting) {\n cy.emit({\n originalEvent: e,\n type: 'boxstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n\n r.touchData.selecting = true;\n r.touchData.didSelect = true;\n select[4] = 1;\n\n if (!select || select.length === 0 || select[0] === undefined) {\n select[0] = (now[0] + now[2] + now[4]) / 3;\n select[1] = (now[1] + now[3] + now[5]) / 3;\n select[2] = (now[0] + now[2] + now[4]) / 3 + 1;\n select[3] = (now[1] + now[3] + now[5]) / 3 + 1;\n } else {\n select[2] = (now[0] + now[2] + now[4]) / 3;\n select[3] = (now[1] + now[3] + now[5]) / 3;\n }\n\n r.redrawHint('select', true);\n r.redraw(); // pinch to zoom\n } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom\n && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) {\n // two fingers => pinch to zoom\n e.preventDefault();\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var draggedEles = r.dragData.touchDragEles;\n\n if (draggedEles) {\n r.redrawHint('drag', true);\n\n for (var i = 0; i < draggedEles.length; i++) {\n var de_p = draggedEles[i]._private;\n de_p.grabbed = false;\n de_p.rscratch.inDragLayer = false;\n }\n }\n\n var _start = r.touchData.start; // (x2, y2) for fingers 1 and 2\n\n var f1x2 = e.touches[0].clientX - offsetLeft,\n f1y2 = e.touches[0].clientY - offsetTop;\n var f2x2 = e.touches[1].clientX - offsetLeft,\n f2y2 = e.touches[1].clientY - offsetTop;\n var distance2 = distance(f1x2, f1y2, f2x2, f2y2); // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 );\n // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq );\n\n var factor = distance2 / distance1;\n\n if (twoFingersStartInside) {\n // delta finger1\n var df1x = f1x2 - f1x1;\n var df1y = f1y2 - f1y1; // delta finger 2\n\n var df2x = f2x2 - f2x1;\n var df2y = f2y2 - f2y1; // translation is the normalised vector of the two fingers movement\n // i.e. so pinching cancels out and moving together pans\n\n var tx = (df1x + df2x) / 2;\n var ty = (df1y + df2y) / 2; // now calculate the zoom\n\n var zoom1 = cy.zoom();\n var zoom2 = zoom1 * factor;\n var pan1 = cy.pan(); // the model center point converted to the current rendered pos\n\n var ctrx = modelCenter1[0] * zoom1 + pan1.x;\n var ctry = modelCenter1[1] * zoom1 + pan1.y;\n var pan2 = {\n x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx,\n y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry\n }; // remove dragged eles\n\n if (_start && _start.active()) {\n var draggedEles = r.dragData.touchDragEles;\n freeDraggedElements(draggedEles);\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n\n _start.unactivate().emit('freeon');\n\n draggedEles.emit('free');\n\n if (r.dragData.didDrag) {\n _start.emit('dragfreeon');\n\n draggedEles.emit('dragfree');\n }\n }\n\n cy.viewport({\n zoom: zoom2,\n pan: pan2,\n cancelOnFailedZoom: true\n });\n distance1 = distance2;\n f1x1 = f1x2;\n f1y1 = f1y2;\n f2x1 = f2x2;\n f2y1 = f2y2;\n r.pinching = true;\n } // Re-project\n\n\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning\n ) {\n var start = r.touchData.start;\n var last = r.touchData.last;\n var near;\n\n if (!r.hoverData.draggingEles && !r.swipePanning) {\n near = r.findNearestElement(now[0], now[1], true, true);\n }\n\n if (capture && start != null) {\n e.preventDefault();\n } // dragging nodes\n\n\n if (capture && start != null && r.nodeIsDraggable(start)) {\n if (isOverThresholdDrag) {\n // then dragging can happen\n var draggedEles = r.dragData.touchDragEles;\n var justStartedDrag = !r.dragData.didDrag;\n\n if (justStartedDrag) {\n addNodesToDrag(draggedEles, {\n inDragLayer: true\n });\n }\n\n r.dragData.didDrag = true;\n var totalShift = {\n x: 0,\n y: 0\n };\n\n if (number(disp[0]) && number(disp[1])) {\n totalShift.x += disp[0];\n totalShift.y += disp[1];\n\n if (justStartedDrag) {\n r.redrawHint('eles', true);\n var dragDelta = r.touchData.dragDelta;\n\n if (dragDelta && number(dragDelta[0]) && number(dragDelta[1])) {\n totalShift.x += dragDelta[0];\n totalShift.y += dragDelta[1];\n }\n }\n }\n\n r.hoverData.draggingEles = true;\n draggedEles.silentShift(totalShift).emit('position drag');\n r.redrawHint('drag', true);\n\n if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) {\n r.redrawHint('eles', true);\n }\n\n r.redraw();\n } else {\n // otherise keep track of drag delta for later\n var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || [];\n\n if (dragDelta.length === 0) {\n dragDelta.push(disp[0]);\n dragDelta.push(disp[1]);\n } else {\n dragDelta[0] += disp[0];\n dragDelta[1] += disp[1];\n }\n }\n } // touchmove\n\n\n {\n triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, {\n x: now[0],\n y: now[1]\n });\n\n if ((!start || !start.grabbed()) && near != last) {\n if (last) {\n last.emit({\n originalEvent: e,\n type: 'tapdragout',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'tapdragover',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n }\n\n r.touchData.last = near;\n } // check to cancel taphold\n\n if (capture) {\n for (var i = 0; i < now.length; i++) {\n if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) {\n r.touchData.singleTouchMoved = true;\n }\n }\n } // panning\n\n\n if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) {\n var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts);\n\n if (allowPassthrough) {\n e.preventDefault();\n\n if (!r.data.bgActivePosistion) {\n r.data.bgActivePosistion = array2point(r.touchData.startPosition);\n }\n\n if (r.swipePanning) {\n cy.panBy({\n x: disp[0] * zoom,\n y: disp[1] * zoom\n });\n } else if (isOverThresholdDrag) {\n r.swipePanning = true;\n cy.panBy({\n x: dx * zoom,\n y: dy * zoom\n });\n\n if (start) {\n start.unactivate();\n r.redrawHint('select', true);\n r.touchData.start = null;\n }\n }\n } // Re-project\n\n\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n }\n\n for (var j = 0; j < now.length; j++) {\n earlier[j] = now[j];\n } // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning\n\n\n if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n r.redraw();\n }\n }, false);\n var touchcancelHandler;\n r.registerBinding(window, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) {\n // eslint-disable-line no-unused-vars\n var start = r.touchData.start;\n r.touchData.capture = false;\n\n if (start) {\n start.unactivate();\n }\n });\n var touchendHandler;\n r.registerBinding(window, 'touchend', touchendHandler = function touchendHandler(e) {\n // eslint-disable-line no-unused-vars\n var start = r.touchData.start;\n var capture = r.touchData.capture;\n\n if (capture) {\n if (e.touches.length === 0) {\n r.touchData.capture = false;\n }\n\n e.preventDefault();\n } else {\n return;\n }\n\n var select = r.selection;\n r.swipePanning = false;\n r.hoverData.draggingEles = false;\n var cy = r.cy;\n var zoom = cy.zoom();\n var now = r.touchData.now;\n var earlier = r.touchData.earlier;\n\n if (e.touches[0]) {\n var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY);\n now[0] = pos[0];\n now[1] = pos[1];\n }\n\n if (e.touches[1]) {\n var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY);\n now[2] = pos[0];\n now[3] = pos[1];\n }\n\n if (e.touches[2]) {\n var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY);\n now[4] = pos[0];\n now[5] = pos[1];\n }\n\n if (start) {\n start.unactivate();\n }\n\n var ctxTapend;\n\n if (r.touchData.cxt) {\n ctxTapend = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: now[0],\n y: now[1]\n }\n };\n\n if (start) {\n start.emit(ctxTapend);\n } else {\n cy.emit(ctxTapend);\n }\n\n if (!r.touchData.cxtDragged) {\n var ctxTap = {\n originalEvent: e,\n type: 'cxttap',\n position: {\n x: now[0],\n y: now[1]\n }\n };\n\n if (start) {\n start.emit(ctxTap);\n } else {\n cy.emit(ctxTap);\n }\n }\n\n if (r.touchData.start) {\n r.touchData.start._private.grabbed = false;\n }\n\n r.touchData.cxt = false;\n r.touchData.start = null;\n r.redraw();\n return;\n } // no more box selection if we don't have three fingers\n\n\n if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) {\n r.touchData.selecting = false;\n var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3]));\n select[0] = undefined;\n select[1] = undefined;\n select[2] = undefined;\n select[3] = undefined;\n select[4] = 0;\n r.redrawHint('select', true);\n cy.emit({\n type: 'boxend',\n originalEvent: e,\n position: {\n x: now[0],\n y: now[1]\n }\n });\n\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect');\n\n if (box.nonempty()) {\n r.redrawHint('eles', true);\n }\n\n r.redraw();\n }\n\n if (start != null) {\n start.unactivate();\n }\n\n if (e.touches[2]) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) {\n r.data.bgActivePosistion = undefined;\n r.redrawHint('select', true);\n var draggedEles = r.dragData.touchDragEles;\n\n if (start != null) {\n var startWasGrabbed = start._private.grabbed;\n freeDraggedElements(draggedEles);\n r.redrawHint('drag', true);\n r.redrawHint('eles', true);\n\n if (startWasGrabbed) {\n start.emit('freeon');\n draggedEles.emit('free');\n\n if (r.dragData.didDrag) {\n start.emit('dragfreeon');\n draggedEles.emit('dragfree');\n }\n }\n\n triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, {\n x: now[0],\n y: now[1]\n });\n start.unactivate();\n r.touchData.start = null;\n } else {\n var near = r.findNearestElement(now[0], now[1], true, true);\n triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, {\n x: now[0],\n y: now[1]\n });\n }\n\n var dx = r.touchData.startPosition[0] - now[0];\n var dx2 = dx * dx;\n var dy = r.touchData.startPosition[1] - now[1];\n var dy2 = dy * dy;\n var dist2 = dx2 + dy2;\n var rdist2 = dist2 * zoom * zoom; // Tap event, roughly same as mouse click event for touch\n\n if (!r.touchData.singleTouchMoved) {\n if (!start) {\n cy.$(':selected').unselect(['tapunselect']);\n }\n\n triggerEvents(start, ['tap', 'vclick'], e, {\n x: now[0],\n y: now[1]\n });\n } // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance\n\n\n if (start != null && !r.dragData.didDrag // didn't drag nodes around\n && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection\n ) {\n if (cy.selectionType() === 'single') {\n cy.$(isSelected).unmerge(start).unselect(['tapunselect']);\n start.select(['tapselect']);\n } else {\n if (start.selected()) {\n start.unselect(['tapunselect']);\n } else {\n start.select(['tapselect']);\n }\n }\n\n r.redrawHint('eles', true);\n }\n\n r.touchData.singleTouchMoved = true;\n }\n\n for (var j = 0; j < now.length; j++) {\n earlier[j] = now[j];\n }\n\n r.dragData.didDrag = false; // reset for next touchstart\n\n if (e.touches.length === 0) {\n r.touchData.dragDelta = [];\n r.touchData.startPosition = null;\n r.touchData.startGPosition = null;\n r.touchData.didSelect = false;\n }\n\n if (e.touches.length < 2) {\n if (e.touches.length === 1) {\n // the old start global pos'n may not be the same finger that remains\n r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY];\n }\n\n r.pinching = false;\n r.redrawHint('eles', true);\n r.redraw();\n } //r.redraw();\n\n }, false); // fallback compatibility layer for ms pointer events\n\n if (typeof TouchEvent === 'undefined') {\n var pointers = [];\n\n var makeTouch = function makeTouch(e) {\n return {\n clientX: e.clientX,\n clientY: e.clientY,\n force: 1,\n identifier: e.pointerId,\n pageX: e.pageX,\n pageY: e.pageY,\n radiusX: e.width / 2,\n radiusY: e.height / 2,\n screenX: e.screenX,\n screenY: e.screenY,\n target: e.target\n };\n };\n\n var makePointer = function makePointer(e) {\n return {\n event: e,\n touch: makeTouch(e)\n };\n };\n\n var addPointer = function addPointer(e) {\n pointers.push(makePointer(e));\n };\n\n var removePointer = function removePointer(e) {\n for (var i = 0; i < pointers.length; i++) {\n var p = pointers[i];\n\n if (p.event.pointerId === e.pointerId) {\n pointers.splice(i, 1);\n return;\n }\n }\n };\n\n var updatePointer = function updatePointer(e) {\n var p = pointers.filter(function (p) {\n return p.event.pointerId === e.pointerId;\n })[0];\n p.event = e;\n p.touch = makeTouch(e);\n };\n\n var addTouchesToEvent = function addTouchesToEvent(e) {\n e.touches = pointers.map(function (p) {\n return p.touch;\n });\n };\n\n var pointerIsMouse = function pointerIsMouse(e) {\n return e.pointerType === 'mouse' || e.pointerType === 4;\n };\n\n r.registerBinding(r.container, 'pointerdown', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n\n e.preventDefault();\n addPointer(e);\n addTouchesToEvent(e);\n touchstartHandler(e);\n });\n r.registerBinding(r.container, 'pointerup', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n\n removePointer(e);\n addTouchesToEvent(e);\n touchendHandler(e);\n });\n r.registerBinding(r.container, 'pointercancel', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n\n removePointer(e);\n addTouchesToEvent(e);\n touchcancelHandler(e);\n });\n r.registerBinding(r.container, 'pointermove', function (e) {\n if (pointerIsMouse(e)) {\n return;\n } // mouse already handled\n\n\n e.preventDefault();\n updatePointer(e);\n addTouchesToEvent(e);\n touchmoveHandler(e);\n });\n }\n};\n\nvar BRp$d = {};\n\nBRp$d.generatePolygon = function (name, points) {\n return this.nodeShapes[name] = {\n renderer: this,\n name: name,\n points: points,\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding);\n }\n };\n};\n\nBRp$d.generateEllipse = function () {\n return this.nodeShapes['ellipse'] = {\n renderer: this,\n name: 'ellipse',\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n return checkInEllipse(x, y, width, height, centerX, centerY, padding);\n }\n };\n};\n\nBRp$d.generateRoundPolygon = function (name, points) {\n // Pre-compute control points\n // Since these points depend on the radius length (which in turns depend on the width/height of the node) we will only pre-compute\n // the unit vectors.\n // For simplicity the layout will be:\n // [ p0, UnitVectorP0P1, p1, UniVectorP1P2, ..., pn, UnitVectorPnP0 ]\n var allPoints = new Array(points.length * 2);\n\n for (var i = 0; i < points.length / 2; i++) {\n var sourceIndex = i * 2;\n var destIndex = void 0;\n\n if (i < points.length / 2 - 1) {\n destIndex = (i + 1) * 2;\n } else {\n destIndex = 0;\n }\n\n allPoints[i * 4] = points[sourceIndex];\n allPoints[i * 4 + 1] = points[sourceIndex + 1];\n var xDest = points[destIndex] - points[sourceIndex];\n var yDest = points[destIndex + 1] - points[sourceIndex + 1];\n var norm = Math.sqrt(xDest * xDest + yDest * yDest);\n allPoints[i * 4 + 2] = xDest / norm;\n allPoints[i * 4 + 3] = yDest / norm;\n }\n\n return this.nodeShapes[name] = {\n renderer: this,\n name: name,\n points: allPoints,\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height);\n }\n };\n};\n\nBRp$d.generateRoundRectangle = function () {\n return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = {\n renderer: this,\n name: 'round-rectangle',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n var cornerRadius = getRoundRectangleRadius(width, height);\n var diam = cornerRadius * 2; // Check hBox\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n } // Check vBox\n\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n } // Check top left quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n } // Check top right quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n } // Check bottom right quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n } // Check bottom left quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n\n return false;\n }\n };\n};\n\nBRp$d.generateCutRectangle = function () {\n return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = {\n renderer: this,\n name: 'cut-rectangle',\n cornerLength: getCutRectangleCornerLength(),\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY) {\n var cl = this.cornerLength;\n var hh = height / 2;\n var hw = width / 2;\n var xBegin = centerX - hw;\n var xEnd = centerX + hw;\n var yBegin = centerY - hh;\n var yEnd = centerY + hh; // points are in clockwise order, inner (imaginary) triangle pt on [4, 5]\n\n return {\n topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl],\n topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl],\n bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl],\n bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl]\n };\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY);\n var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]);\n return polygonIntersectLine(x, y, pts, nodeX, nodeY);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n // Check hBox\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * this.cornerLength, [0, -1], padding)) {\n return true;\n } // Check vBox\n\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * this.cornerLength, height, [0, -1], padding)) {\n return true;\n }\n\n var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY);\n return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft);\n }\n };\n};\n\nBRp$d.generateBarrel = function () {\n return this.nodeShapes['barrel'] = {\n renderer: this,\n name: 'barrel',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n // use two fixed t values for the bezier curve approximation\n var t0 = 0.15;\n var t1 = 0.5;\n var t2 = 0.85;\n var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY);\n\n var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) {\n // approximate curve pts based on the two t values\n var m0 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t0);\n var m1 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t1);\n var m2 = qbezierPtAt({\n x: pts[0],\n y: pts[1]\n }, {\n x: pts[2],\n y: pts[3]\n }, {\n x: pts[4],\n y: pts[5]\n }, t2);\n return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]];\n };\n\n var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft));\n return polygonIntersectLine(x, y, pts, nodeX, nodeY);\n },\n generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) {\n var hh = height / 2;\n var hw = width / 2;\n var xBegin = centerX - hw;\n var xEnd = centerX + hw;\n var yBegin = centerY - hh;\n var yEnd = centerY + hh;\n var curveConstants = getBarrelCurveConstants(width, height);\n var hOffset = curveConstants.heightOffset;\n var wOffset = curveConstants.widthOffset;\n var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width; // points are in clockwise order, inner (imaginary) control pt on [4, 5]\n\n var pts = {\n topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin],\n topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset],\n bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd],\n bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset]\n };\n pts.topLeft.isTop = true;\n pts.topRight.isTop = true;\n pts.bottomLeft.isBottom = true;\n pts.bottomRight.isBottom = true;\n return pts;\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n var curveConstants = getBarrelCurveConstants(width, height);\n var hOffset = curveConstants.heightOffset;\n var wOffset = curveConstants.widthOffset; // Check hBox\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) {\n return true;\n } // Check vBox\n\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) {\n return true;\n }\n\n var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY);\n\n var getCurveT = function getCurveT(x, y, curvePts) {\n var x0 = curvePts[4];\n var x1 = curvePts[2];\n var x2 = curvePts[0];\n var y0 = curvePts[5]; // var y1 = curvePts[ 3 ];\n\n var y2 = curvePts[1];\n var xMin = Math.min(x0, x2);\n var xMax = Math.max(x0, x2);\n var yMin = Math.min(y0, y2);\n var yMax = Math.max(y0, y2);\n\n if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) {\n var coeff = bezierPtsToQuadCoeff(x0, x1, x2);\n var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x);\n var validRoots = roots.filter(function (r) {\n return 0 <= r && r <= 1;\n });\n\n if (validRoots.length > 0) {\n return validRoots[0];\n }\n }\n\n return null;\n };\n\n var curveRegions = Object.keys(barrelCurvePts);\n\n for (var i = 0; i < curveRegions.length; i++) {\n var corner = curveRegions[i];\n var cornerPts = barrelCurvePts[corner];\n var t = getCurveT(x, y, cornerPts);\n\n if (t == null) {\n continue;\n }\n\n var y0 = cornerPts[5];\n var y1 = cornerPts[3];\n var y2 = cornerPts[1];\n var bezY = qbezierAt(y0, y1, y2, t);\n\n if (cornerPts.isTop && bezY <= y) {\n return true;\n }\n\n if (cornerPts.isBottom && y <= bezY) {\n return true;\n }\n }\n\n return false;\n }\n };\n};\n\nBRp$d.generateBottomRoundrectangle = function () {\n return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = {\n renderer: this,\n name: 'bottom-round-rectangle',\n points: generateUnitNgonPointsFitToSquare(4, 0),\n draw: function draw(context, centerX, centerY, width, height) {\n this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height);\n },\n intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) {\n var topStartX = nodeX - (width / 2 + padding);\n var topStartY = nodeY - (height / 2 + padding);\n var topEndY = topStartY;\n var topEndX = nodeX + (width / 2 + padding);\n var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n\n if (topIntersections.length > 0) {\n return topIntersections;\n }\n\n return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding);\n },\n checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) {\n var cornerRadius = getRoundRectangleRadius(width, height);\n var diam = 2 * cornerRadius; // Check hBox\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n } // Check vBox\n\n\n if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n } // check non-rounded top side\n\n\n var outerWidth = width / 2 + 2 * padding;\n var outerHeight = height / 2 + 2 * padding;\n var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight];\n\n if (pointInsidePolygonPoints(x, y, points)) {\n return true;\n } // Check bottom right quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n } // Check bottom left quarter circle\n\n\n if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n\n return false;\n }\n };\n};\n\nBRp$d.registerNodeShapes = function () {\n var nodeShapes = this.nodeShapes = {};\n var renderer = this;\n this.generateEllipse();\n this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0));\n this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0));\n this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0));\n nodeShapes['square'] = nodeShapes['rectangle'];\n this.generateRoundRectangle();\n this.generateCutRectangle();\n this.generateBarrel();\n this.generateBottomRoundrectangle();\n {\n var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0];\n this.generatePolygon('diamond', diamondPoints);\n this.generateRoundPolygon('round-diamond', diamondPoints);\n }\n this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0));\n this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0));\n this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0));\n this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0));\n this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0));\n this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0));\n this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0));\n this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0));\n var star5Points = new Array(20);\n {\n var outerPoints = generateUnitNgonPoints(5, 0);\n var innerPoints = generateUnitNgonPoints(5, Math.PI / 5); // Outer radius is 1; inner radius of star is smaller\n\n var innerRadius = 0.5 * (3 - Math.sqrt(5));\n innerRadius *= 1.57;\n\n for (var i = 0; i < innerPoints.length / 2; i++) {\n innerPoints[i * 2] *= innerRadius;\n innerPoints[i * 2 + 1] *= innerRadius;\n }\n\n for (var i = 0; i < 20 / 4; i++) {\n star5Points[i * 4] = outerPoints[i * 2];\n star5Points[i * 4 + 1] = outerPoints[i * 2 + 1];\n star5Points[i * 4 + 2] = innerPoints[i * 2];\n star5Points[i * 4 + 3] = innerPoints[i * 2 + 1];\n }\n }\n star5Points = fitPolygonToSquare(star5Points);\n this.generatePolygon('star', star5Points);\n this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]);\n this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]);\n this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]);\n {\n var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1];\n this.generatePolygon('tag', tagPoints);\n this.generateRoundPolygon('round-tag', tagPoints);\n }\n\n nodeShapes.makePolygon = function (points) {\n // use caching on user-specified polygons so they are as fast as native shapes\n var key = points.join('$');\n var name = 'polygon-' + key;\n var shape;\n\n if (shape = this[name]) {\n // got cached shape\n return shape;\n } // create and cache new shape\n\n\n return renderer.generatePolygon(name, points);\n };\n};\n\nvar BRp$e = {};\n\nBRp$e.timeToRender = function () {\n return this.redrawTotalTime / this.redrawCount;\n};\n\nBRp$e.redraw = function (options) {\n options = options || staticEmptyObject();\n var r = this;\n\n if (r.averageRedrawTime === undefined) {\n r.averageRedrawTime = 0;\n }\n\n if (r.lastRedrawTime === undefined) {\n r.lastRedrawTime = 0;\n }\n\n if (r.lastDrawTime === undefined) {\n r.lastDrawTime = 0;\n }\n\n r.requestedFrame = true;\n r.renderOptions = options;\n};\n\nBRp$e.beforeRender = function (fn, priority) {\n // the renderer can't add tick callbacks when destroyed\n if (this.destroyed) {\n return;\n }\n\n if (priority == null) {\n error('Priority is not optional for beforeRender');\n }\n\n var cbs = this.beforeRenderCallbacks;\n cbs.push({\n fn: fn,\n priority: priority\n }); // higher priority callbacks executed first\n\n cbs.sort(function (a, b) {\n return b.priority - a.priority;\n });\n};\n\nvar beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) {\n var cbs = r.beforeRenderCallbacks;\n\n for (var i = 0; i < cbs.length; i++) {\n cbs[i].fn(willDraw, startTime);\n }\n};\n\nBRp$e.startRenderLoop = function () {\n var r = this;\n var cy = r.cy;\n\n if (r.renderLoopStarted) {\n return;\n } else {\n r.renderLoopStarted = true;\n }\n\n var renderFn = function renderFn(requestTime) {\n if (r.destroyed) {\n return;\n }\n\n if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) {\n beforeRenderCallbacks(r, true, requestTime);\n var startTime = performanceNow();\n r.render(r.renderOptions);\n var endTime = r.lastDrawTime = performanceNow();\n\n if (r.averageRedrawTime === undefined) {\n r.averageRedrawTime = endTime - startTime;\n }\n\n if (r.redrawCount === undefined) {\n r.redrawCount = 0;\n }\n\n r.redrawCount++;\n\n if (r.redrawTotalTime === undefined) {\n r.redrawTotalTime = 0;\n }\n\n var duration = endTime - startTime;\n r.redrawTotalTime += duration;\n r.lastRedrawTime = duration; // use a weighted average with a bias from the previous average so we don't spike so easily\n\n r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2;\n r.requestedFrame = false;\n } else {\n beforeRenderCallbacks(r, false, requestTime);\n }\n\n r.skipFrame = false;\n requestAnimationFrame(renderFn);\n };\n\n requestAnimationFrame(renderFn);\n};\n\nvar BaseRenderer = function BaseRenderer(options) {\n this.init(options);\n};\n\nvar BR = BaseRenderer;\nvar BRp$f = BR.prototype;\nBRp$f.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl'];\n\nBRp$f.init = function (options) {\n var r = this;\n r.options = options;\n r.cy = options.cy;\n var ctr = r.container = options.cy.container(); // prepend a stylesheet in the head such that\n\n if (window$1) {\n var document = window$1.document;\n var head = document.head;\n var stylesheetId = '__________cytoscape_stylesheet';\n var className = '__________cytoscape_container';\n var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null;\n\n if (ctr.className.indexOf(className) < 0) {\n ctr.className = (ctr.className || '') + ' ' + className;\n }\n\n if (!stylesheetAlreadyExists) {\n var stylesheet = document.createElement('style');\n stylesheet.id = stylesheetId;\n stylesheet.innerHTML = '.' + className + ' { position: relative; }';\n head.insertBefore(stylesheet, head.children[0]); // first so lowest priority\n }\n\n var computedStyle = window$1.getComputedStyle(ctr);\n var position = computedStyle.getPropertyValue('position');\n\n if (position === 'static') {\n warn('A Cytoscape container has style position:static and so can not use UI extensions properly');\n }\n }\n\n r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag\n\n r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95]; //--Pointer-related data\n\n r.hoverData = {\n down: null,\n last: null,\n downTime: null,\n triggerMode: null,\n dragging: false,\n initialPan: [null, null],\n capture: false\n };\n r.dragData = {\n possibleDragElements: []\n };\n r.touchData = {\n start: null,\n capture: false,\n // These 3 fields related to tap, taphold events\n startPosition: [null, null, null, null, null, null],\n singleTouchStartTime: null,\n singleTouchMoved: true,\n now: [null, null, null, null, null, null],\n earlier: [null, null, null, null, null, null]\n };\n r.redraws = 0;\n r.showFps = options.showFps;\n r.debug = options.debug;\n r.hideEdgesOnViewport = options.hideEdgesOnViewport;\n r.textureOnViewport = options.textureOnViewport;\n r.wheelSensitivity = options.wheelSensitivity;\n r.motionBlurEnabled = options.motionBlur; // on by default\n\n r.forcedPixelRatio = number(options.pixelRatio) ? options.pixelRatio : null;\n r.motionBlur = options.motionBlur; // for initial kick off\n\n r.motionBlurOpacity = options.motionBlurOpacity;\n r.motionBlurTransparency = 1 - r.motionBlurOpacity;\n r.motionBlurPxRatio = 1;\n r.mbPxRBlurry = 1; //0.8;\n\n r.minMbLowQualFrames = 4;\n r.fullQualityMb = false;\n r.clearedForMotionBlur = [];\n r.desktopTapThreshold = options.desktopTapThreshold;\n r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold;\n r.touchTapThreshold = options.touchTapThreshold;\n r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold;\n r.tapholdDuration = 500;\n r.bindings = [];\n r.beforeRenderCallbacks = [];\n r.beforeRenderPriorities = {\n // higher priority execs before lower one\n animations: 400,\n eleCalcs: 300,\n eleTxrDeq: 200,\n lyrTxrDeq: 150,\n lyrTxrSkip: 100\n };\n r.registerNodeShapes();\n r.registerArrowShapes();\n r.registerCalculationListeners();\n};\n\nBRp$f.notify = function (eventName, eles) {\n var r = this;\n var cy = r.cy; // the renderer can't be notified after it's destroyed\n\n if (this.destroyed) {\n return;\n }\n\n if (eventName === 'init') {\n r.load();\n return;\n }\n\n if (eventName === 'destroy') {\n r.destroy();\n return;\n }\n\n if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') {\n r.invalidateCachedZSortedEles();\n }\n\n if (eventName === 'viewport') {\n r.redrawHint('select', true);\n }\n\n if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') {\n r.invalidateContainerClientCoordsCache();\n r.matchCanvasSize(r.container);\n }\n\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n this.startRenderLoop();\n this.redraw();\n};\n\nBRp$f.destroy = function () {\n var r = this;\n r.destroyed = true;\n r.cy.stopAnimationLoop();\n\n for (var i = 0; i < r.bindings.length; i++) {\n var binding = r.bindings[i];\n var b = binding;\n var tgt = b.target;\n (tgt.off || tgt.removeEventListener).apply(tgt, b.args);\n }\n\n r.bindings = [];\n r.beforeRenderCallbacks = [];\n r.onUpdateEleCalcsFns = [];\n\n if (r.removeObserver) {\n r.removeObserver.disconnect();\n }\n\n if (r.styleObserver) {\n r.styleObserver.disconnect();\n }\n\n if (r.resizeObserver) {\n r.resizeObserver.disconnect();\n }\n\n if (r.labelCalcDiv) {\n try {\n document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef\n } catch (e) {// ie10 issue #1014\n }\n }\n};\n\nBRp$f.isHeadless = function () {\n return false;\n};\n\n[BRp, BRp$a, BRp$b, BRp$c, BRp$d, BRp$e].forEach(function (props) {\n extend(BRp$f, props);\n});\n\nvar fullFpsTime = 1000 / 60; // assume 60 frames per second\n\nvar defs = {\n setupDequeueing: function setupDequeueing(opts) {\n return function setupDequeueingImpl() {\n var self = this;\n var r = this.renderer;\n\n if (self.dequeueingSetup) {\n return;\n } else {\n self.dequeueingSetup = true;\n }\n\n var queueRedraw = util(function () {\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n r.redraw();\n }, opts.deqRedrawThreshold);\n\n var dequeue = function dequeue(willDraw, frameStartTime) {\n var startTime = performanceNow();\n var avgRenderTime = r.averageRedrawTime;\n var renderTime = r.lastRedrawTime;\n var deqd = [];\n var extent = r.cy.extent();\n var pixelRatio = r.getPixelRatio(); // if we aren't in a tick that causes a draw, then the rendered style\n // queue won't automatically be flushed before dequeueing starts\n\n if (!willDraw) {\n r.flushRenderedStyleQueue();\n }\n\n while (true) {\n // eslint-disable-line no-constant-condition\n var now = performanceNow();\n var duration = now - startTime;\n var frameDuration = now - frameStartTime;\n\n if (renderTime < fullFpsTime) {\n // if we're rendering faster than the ideal fps, then do dequeueing\n // during all of the remaining frame time\n var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0);\n\n if (frameDuration >= opts.deqFastCost * timeAvailable) {\n break;\n }\n } else {\n if (willDraw) {\n if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) {\n break;\n }\n } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) {\n break;\n }\n }\n\n var thisDeqd = opts.deq(self, pixelRatio, extent);\n\n if (thisDeqd.length > 0) {\n for (var i = 0; i < thisDeqd.length; i++) {\n deqd.push(thisDeqd[i]);\n }\n } else {\n break;\n }\n } // callbacks on dequeue\n\n\n if (deqd.length > 0) {\n opts.onDeqd(self, deqd);\n\n if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) {\n queueRedraw();\n }\n }\n };\n\n var priority = opts.priority || noop;\n r.beforeRender(dequeue, priority(self));\n };\n }\n};\n\n// Uses keys so elements may share the same cache.\n\nvar ElementTextureCacheLookup =\n/*#__PURE__*/\nfunction () {\n function ElementTextureCacheLookup(getKey) {\n var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify;\n\n _classCallCheck(this, ElementTextureCacheLookup);\n\n this.idsByKey = new Map$1();\n this.keyForId = new Map$1();\n this.cachesByLvl = new Map$1();\n this.lvls = [];\n this.getKey = getKey;\n this.doesEleInvalidateKey = doesEleInvalidateKey;\n }\n\n _createClass(ElementTextureCacheLookup, [{\n key: \"getIdsFor\",\n value: function getIdsFor(key) {\n if (key == null) {\n error(\"Can not get id list for null key\");\n }\n\n var idsByKey = this.idsByKey;\n var ids = this.idsByKey.get(key);\n\n if (!ids) {\n ids = new Set$1();\n idsByKey.set(key, ids);\n }\n\n return ids;\n }\n }, {\n key: \"addIdForKey\",\n value: function addIdForKey(key, id) {\n if (key != null) {\n this.getIdsFor(key).add(id);\n }\n }\n }, {\n key: \"deleteIdForKey\",\n value: function deleteIdForKey(key, id) {\n if (key != null) {\n this.getIdsFor(key)[\"delete\"](id);\n }\n }\n }, {\n key: \"getNumberOfIdsForKey\",\n value: function getNumberOfIdsForKey(key) {\n if (key == null) {\n return 0;\n } else {\n return this.getIdsFor(key).size;\n }\n }\n }, {\n key: \"updateKeyMappingFor\",\n value: function updateKeyMappingFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n var currKey = this.getKey(ele);\n this.deleteIdForKey(prevKey, id);\n this.addIdForKey(currKey, id);\n this.keyForId.set(id, currKey);\n }\n }, {\n key: \"deleteKeyMappingFor\",\n value: function deleteKeyMappingFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n this.deleteIdForKey(prevKey, id);\n this.keyForId[\"delete\"](id);\n }\n }, {\n key: \"keyHasChangedFor\",\n value: function keyHasChangedFor(ele) {\n var id = ele.id();\n var prevKey = this.keyForId.get(id);\n var newKey = this.getKey(ele);\n return prevKey !== newKey;\n }\n }, {\n key: \"isInvalid\",\n value: function isInvalid(ele) {\n return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele);\n }\n }, {\n key: \"getCachesAt\",\n value: function getCachesAt(lvl) {\n var cachesByLvl = this.cachesByLvl,\n lvls = this.lvls;\n var caches = cachesByLvl.get(lvl);\n\n if (!caches) {\n caches = new Map$1();\n cachesByLvl.set(lvl, caches);\n lvls.push(lvl);\n }\n\n return caches;\n }\n }, {\n key: \"getCache\",\n value: function getCache(key, lvl) {\n return this.getCachesAt(lvl).get(key);\n }\n }, {\n key: \"get\",\n value: function get(ele, lvl) {\n var key = this.getKey(ele);\n var cache = this.getCache(key, lvl); // getting for an element may need to add to the id list b/c eles can share keys\n\n if (cache != null) {\n this.updateKeyMappingFor(ele);\n }\n\n return cache;\n }\n }, {\n key: \"getForCachedKey\",\n value: function getForCachedKey(ele, lvl) {\n var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key\n\n var cache = this.getCache(key, lvl);\n return cache;\n }\n }, {\n key: \"hasCache\",\n value: function hasCache(key, lvl) {\n return this.getCachesAt(lvl).has(key);\n }\n }, {\n key: \"has\",\n value: function has(ele, lvl) {\n var key = this.getKey(ele);\n return this.hasCache(key, lvl);\n }\n }, {\n key: \"setCache\",\n value: function setCache(key, lvl, cache) {\n cache.key = key;\n this.getCachesAt(lvl).set(key, cache);\n }\n }, {\n key: \"set\",\n value: function set(ele, lvl, cache) {\n var key = this.getKey(ele);\n this.setCache(key, lvl, cache);\n this.updateKeyMappingFor(ele);\n }\n }, {\n key: \"deleteCache\",\n value: function deleteCache(key, lvl) {\n this.getCachesAt(lvl)[\"delete\"](key);\n }\n }, {\n key: \"delete\",\n value: function _delete(ele, lvl) {\n var key = this.getKey(ele);\n this.deleteCache(key, lvl);\n }\n }, {\n key: \"invalidateKey\",\n value: function invalidateKey(key) {\n var _this = this;\n\n this.lvls.forEach(function (lvl) {\n return _this.deleteCache(key, lvl);\n });\n } // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key)\n\n }, {\n key: \"invalidate\",\n value: function invalidate(ele) {\n var id = ele.id();\n var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key)\n\n this.deleteKeyMappingFor(ele);\n var entireKeyInvalidated = this.doesEleInvalidateKey(ele);\n\n if (entireKeyInvalidated) {\n // clear mapping for current key\n this.invalidateKey(key);\n }\n\n return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0;\n }\n }]);\n\n return ElementTextureCacheLookup;\n}();\n\nvar minTxrH = 25; // the size of the texture cache for small height eles (special case)\n\nvar txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up\n\nvar minLvl = -4; // when scaling smaller than that we don't need to re-render\n\nvar maxLvl = 3; // when larger than this scale just render directly (caching is not helpful)\n\nvar maxZoom = 7.99; // beyond this zoom level, layered textures are not used\n\nvar eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps\n\nvar defTxrWidth = 1024; // default/minimum texture width\n\nvar maxTxrW = 1024; // the maximum width of a texture\n\nvar maxTxrH = 1024; // the maximum height of a texture\n\nvar minUtility = 0.2; // if usage of texture is less than this, it is retired\n\nvar maxFullness = 0.8; // fullness of texture after which queue removal is checked\n\nvar maxFullnessChecks = 10; // dequeued after this many checks\n\nvar deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame\n\nvar deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time\n\nvar deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing\n\nvar deqFastCost = 0.9; // % of frame time to be used when >60fps\n\nvar deqRedrawThreshold = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile\n\nvar maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch\n\nvar getTxrReasons = {\n dequeue: 'dequeue',\n downscale: 'downscale',\n highQuality: 'highQuality'\n};\nvar initDefaults = defaults({\n getKey: null,\n doesEleInvalidateKey: falsify,\n drawElement: null,\n getBoundingBox: null,\n getRotationPoint: null,\n getRotationOffset: null,\n isVisible: trueify,\n allowEdgeTxrCaching: true,\n allowParentTxrCaching: true\n});\n\nvar ElementTextureCache = function ElementTextureCache(renderer, initOptions) {\n var self = this;\n self.renderer = renderer;\n self.onDequeues = [];\n var opts = initDefaults(initOptions);\n extend(self, opts);\n self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey);\n self.setupDequeueing();\n};\n\nvar ETCp = ElementTextureCache.prototype;\nETCp.reasons = getTxrReasons; // the list of textures in which new subtextures for elements can be placed\n\nETCp.getTextureQueue = function (txrH) {\n var self = this;\n self.eleImgCaches = self.eleImgCaches || {};\n return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || [];\n}; // the list of usused textures which can be recycled (in use in texture queue)\n\n\nETCp.getRetiredTextureQueue = function (txrH) {\n var self = this;\n var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {};\n var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || [];\n return rtxtrQ;\n}; // queue of element draw requests at different scale levels\n\n\nETCp.getElementQueue = function () {\n var self = this;\n var q = self.eleCacheQueue = self.eleCacheQueue || new Heap(function (a, b) {\n return b.reqs - a.reqs;\n });\n return q;\n}; // queue of element draw requests at different scale levels (element id lookup)\n\n\nETCp.getElementKeyToQueue = function () {\n var self = this;\n var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {};\n return k2q;\n};\n\nETCp.getElement = function (ele, bb, pxRatio, lvl, reason) {\n var self = this;\n var r = this.renderer;\n var zoom = r.cy.zoom();\n var lookup = this.lookup;\n\n if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) {\n return null;\n }\n\n if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) {\n return null;\n }\n\n if (lvl == null) {\n lvl = Math.ceil(log2(zoom * pxRatio));\n }\n\n if (lvl < minLvl) {\n lvl = minLvl;\n } else if (zoom >= maxZoom || lvl > maxLvl) {\n return null;\n }\n\n var scale = Math.pow(2, lvl);\n var eleScaledH = bb.h * scale;\n var eleScaledW = bb.w * scale;\n var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale);\n\n if (!this.isVisible(ele, scaledLabelShown)) {\n return null;\n }\n\n var eleCache = lookup.get(ele, lvl); // if this get was on an unused/invalidated cache, then restore the texture usage metric\n\n if (eleCache && eleCache.invalidated) {\n eleCache.invalidated = false;\n eleCache.texture.invalidatedWidth -= eleCache.width;\n }\n\n if (eleCache) {\n return eleCache;\n }\n\n var txrH; // which texture height this ele belongs to\n\n if (eleScaledH <= minTxrH) {\n txrH = minTxrH;\n } else if (eleScaledH <= txrStepH) {\n txrH = txrStepH;\n } else {\n txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH;\n }\n\n if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) {\n return null; // caching large elements is not efficient\n }\n\n var txrQ = self.getTextureQueue(txrH); // first try the second last one in case it has space at the end\n\n var txr = txrQ[txrQ.length - 2];\n\n var addNewTxr = function addNewTxr() {\n return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW);\n }; // try the last one if there is no second last one\n\n\n if (!txr) {\n txr = txrQ[txrQ.length - 1];\n } // if the last one doesn't exist, we need a first one\n\n\n if (!txr) {\n txr = addNewTxr();\n } // if there's no room in the current texture, we need a new one\n\n\n if (txr.width - txr.usedWidth < eleScaledW) {\n txr = addNewTxr();\n }\n\n var scalableFrom = function scalableFrom(otherCache) {\n return otherCache && otherCache.scaledLabelShown === scaledLabelShown;\n };\n\n var deqing = reason && reason === getTxrReasons.dequeue;\n var highQualityReq = reason && reason === getTxrReasons.highQuality;\n var downscaleReq = reason && reason === getTxrReasons.downscale;\n var higherCache; // the nearest cache with a higher level\n\n for (var l = lvl + 1; l <= maxLvl; l++) {\n var c = lookup.get(ele, l);\n\n if (c) {\n higherCache = c;\n break;\n }\n }\n\n var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null;\n\n var downscale = function downscale() {\n txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH);\n }; // reset ele area in texture\n\n\n txr.context.setTransform(1, 0, 0, 1, 0, 0);\n txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH);\n\n if (scalableFrom(oneUpCache)) {\n // then we can relatively cheaply rescale the existing image w/o rerendering\n downscale();\n } else if (scalableFrom(higherCache)) {\n // then use the higher cache for now and queue the next level down\n // to cheaply scale towards the smaller level\n if (highQualityReq) {\n for (var _l = higherCache.level; _l > lvl; _l--) {\n oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale);\n }\n\n downscale();\n } else {\n self.queueElement(ele, higherCache.level - 1);\n return higherCache;\n }\n } else {\n var lowerCache; // the nearest cache with a lower level\n\n if (!deqing && !highQualityReq && !downscaleReq) {\n for (var _l2 = lvl - 1; _l2 >= minLvl; _l2--) {\n var _c = lookup.get(ele, _l2);\n\n if (_c) {\n lowerCache = _c;\n break;\n }\n }\n }\n\n if (scalableFrom(lowerCache)) {\n // then use the lower quality cache for now and queue the better one for later\n self.queueElement(ele, lvl);\n return lowerCache;\n }\n\n txr.context.translate(txr.usedWidth, 0);\n txr.context.scale(scale, scale);\n this.drawElement(txr.context, ele, bb, scaledLabelShown, false);\n txr.context.scale(1 / scale, 1 / scale);\n txr.context.translate(-txr.usedWidth, 0);\n }\n\n eleCache = {\n x: txr.usedWidth,\n texture: txr,\n level: lvl,\n scale: scale,\n width: eleScaledW,\n height: eleScaledH,\n scaledLabelShown: scaledLabelShown\n };\n txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing);\n txr.eleCaches.push(eleCache);\n lookup.set(ele, lvl, eleCache);\n self.checkTextureFullness(txr);\n return eleCache;\n};\n\nETCp.invalidateElements = function (eles) {\n for (var i = 0; i < eles.length; i++) {\n this.invalidateElement(eles[i]);\n }\n};\n\nETCp.invalidateElement = function (ele) {\n var self = this;\n var lookup = self.lookup;\n var caches = [];\n var invalid = lookup.isInvalid(ele);\n\n if (!invalid) {\n return; // override the invalidation request if the element key has not changed\n }\n\n for (var lvl = minLvl; lvl <= maxLvl; lvl++) {\n var cache = lookup.getForCachedKey(ele, lvl);\n\n if (cache) {\n caches.push(cache);\n }\n }\n\n var noOtherElesUseCache = lookup.invalidate(ele);\n\n if (noOtherElesUseCache) {\n for (var i = 0; i < caches.length; i++) {\n var _cache = caches[i];\n var txr = _cache.texture; // remove space from the texture it belongs to\n\n txr.invalidatedWidth += _cache.width; // mark the cache as invalidated\n\n _cache.invalidated = true; // retire the texture if its utility is low\n\n self.checkTextureUtility(txr);\n }\n } // remove from queue since the old req was for the old state\n\n\n self.removeFromQueue(ele);\n};\n\nETCp.checkTextureUtility = function (txr) {\n // invalidate all entries in the cache if the cache size is small\n if (txr.invalidatedWidth >= minUtility * txr.width) {\n this.retireTexture(txr);\n }\n};\n\nETCp.checkTextureFullness = function (txr) {\n // if texture has been mostly filled and passed over several times, remove\n // it from the queue so we don't need to waste time looking at it to put new things\n var self = this;\n var txrQ = self.getTextureQueue(txr.height);\n\n if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) {\n removeFromArray(txrQ, txr);\n } else {\n txr.fullnessChecks++;\n }\n};\n\nETCp.retireTexture = function (txr) {\n var self = this;\n var txrH = txr.height;\n var txrQ = self.getTextureQueue(txrH);\n var lookup = this.lookup; // retire the texture from the active / searchable queue:\n\n removeFromArray(txrQ, txr);\n txr.retired = true; // remove the refs from the eles to the caches:\n\n var eleCaches = txr.eleCaches;\n\n for (var i = 0; i < eleCaches.length; i++) {\n var eleCache = eleCaches[i];\n lookup.deleteCache(eleCache.key, eleCache.level);\n }\n\n clearArray(eleCaches); // add the texture to a retired queue so it can be recycled in future:\n\n var rtxtrQ = self.getRetiredTextureQueue(txrH);\n rtxtrQ.push(txr);\n};\n\nETCp.addTexture = function (txrH, minW) {\n var self = this;\n var txrQ = self.getTextureQueue(txrH);\n var txr = {};\n txrQ.push(txr);\n txr.eleCaches = [];\n txr.height = txrH;\n txr.width = Math.max(defTxrWidth, minW);\n txr.usedWidth = 0;\n txr.invalidatedWidth = 0;\n txr.fullnessChecks = 0;\n txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height);\n txr.context = txr.canvas.getContext('2d');\n return txr;\n};\n\nETCp.recycleTexture = function (txrH, minW) {\n var self = this;\n var txrQ = self.getTextureQueue(txrH);\n var rtxtrQ = self.getRetiredTextureQueue(txrH);\n\n for (var i = 0; i < rtxtrQ.length; i++) {\n var txr = rtxtrQ[i];\n\n if (txr.width >= minW) {\n txr.retired = false;\n txr.usedWidth = 0;\n txr.invalidatedWidth = 0;\n txr.fullnessChecks = 0;\n clearArray(txr.eleCaches);\n txr.context.setTransform(1, 0, 0, 1, 0, 0);\n txr.context.clearRect(0, 0, txr.width, txr.height);\n removeFromArray(rtxtrQ, txr);\n txrQ.push(txr);\n return txr;\n }\n }\n};\n\nETCp.queueElement = function (ele, lvl) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var key = this.getKey(ele);\n var existingReq = k2q[key];\n\n if (existingReq) {\n // use the max lvl b/c in between lvls are cheap to make\n existingReq.level = Math.max(existingReq.level, lvl);\n existingReq.eles.merge(ele);\n existingReq.reqs++;\n q.updateItem(existingReq);\n } else {\n var req = {\n eles: ele.spawn().merge(ele),\n level: lvl,\n reqs: 1,\n key: key\n };\n q.push(req);\n k2q[key] = req;\n }\n};\n\nETCp.dequeue = function (pxRatio\n/*, extent*/\n) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var dequeued = [];\n var lookup = self.lookup;\n\n for (var i = 0; i < maxDeqSize; i++) {\n if (q.size() > 0) {\n var req = q.pop();\n var key = req.key;\n var ele = req.eles[0]; // all eles have the same key\n\n var cacheExists = lookup.hasCache(ele, req.level); // clear out the key to req lookup\n\n k2q[key] = null; // dequeueing isn't necessary with an existing cache\n\n if (cacheExists) {\n continue;\n }\n\n dequeued.push(req);\n var bb = self.getBoundingBox(ele);\n self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue);\n } else {\n break;\n }\n }\n\n return dequeued;\n};\n\nETCp.removeFromQueue = function (ele) {\n var self = this;\n var q = self.getElementQueue();\n var k2q = self.getElementKeyToQueue();\n var key = this.getKey(ele);\n var req = k2q[key];\n\n if (req != null) {\n if (req.eles.length === 1) {\n // remove if last ele in the req\n // bring to front of queue\n req.reqs = MAX_INT;\n q.updateItem(req);\n q.pop(); // remove from queue\n\n k2q[key] = null; // remove from lookup map\n } else {\n // otherwise just remove ele from req\n req.eles.unmerge(ele);\n }\n }\n};\n\nETCp.onDequeue = function (fn) {\n this.onDequeues.push(fn);\n};\n\nETCp.offDequeue = function (fn) {\n removeFromArray(this.onDequeues, fn);\n};\n\nETCp.setupDequeueing = defs.setupDequeueing({\n deqRedrawThreshold: deqRedrawThreshold,\n deqCost: deqCost,\n deqAvgCost: deqAvgCost,\n deqNoDrawCost: deqNoDrawCost,\n deqFastCost: deqFastCost,\n deq: function deq(self, pxRatio, extent) {\n return self.dequeue(pxRatio, extent);\n },\n onDeqd: function onDeqd(self, deqd) {\n for (var i = 0; i < self.onDequeues.length; i++) {\n var fn = self.onDequeues[i];\n fn(deqd);\n }\n },\n shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) {\n for (var i = 0; i < deqd.length; i++) {\n var eles = deqd[i].eles;\n\n for (var j = 0; j < eles.length; j++) {\n var bb = eles[j].boundingBox();\n\n if (boundingBoxesIntersect(bb, extent)) {\n return true;\n }\n }\n }\n\n return false;\n },\n priority: function priority(self) {\n return self.renderer.beforeRenderPriorities.eleTxrDeq;\n }\n});\n\nvar defNumLayers = 1; // default number of layers to use\n\nvar minLvl$1 = -4; // when scaling smaller than that we don't need to re-render\n\nvar maxLvl$1 = 2; // when larger than this scale just render directly (caching is not helpful)\n\nvar maxZoom$1 = 3.99; // beyond this zoom level, layered textures are not used\n\nvar deqRedrawThreshold$1 = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile\n\nvar refineEleDebounceTime = 50; // time to debounce sharper ele texture updates\n\nvar deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame\n\nvar deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time\n\nvar deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing\n\nvar deqFastCost$1 = 0.9; // % of frame time to be used when >60fps\n\nvar maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch\n\nvar invalidThreshold = 250; // time threshold for disabling b/c of invalidations\n\nvar maxLayerArea = 4000 * 4000; // layers can't be bigger than this\n\nvar useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm)\n// var log = function(){ console.log.apply( console, arguments ); };\n\nvar LayeredTextureCache = function LayeredTextureCache(renderer) {\n var self = this;\n var r = self.renderer = renderer;\n var cy = r.cy;\n self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ]\n\n self.firstGet = true;\n self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold;\n self.skipping = false;\n self.eleTxrDeqs = cy.collection();\n self.scheduleElementRefinement = util(function () {\n self.refineElementTextures(self.eleTxrDeqs);\n self.eleTxrDeqs.unmerge(self.eleTxrDeqs);\n }, refineEleDebounceTime);\n r.beforeRender(function (willDraw, now) {\n if (now - self.lastInvalidationTime <= invalidThreshold) {\n self.skipping = true;\n } else {\n self.skipping = false;\n }\n }, r.beforeRenderPriorities.lyrTxrSkip);\n\n var qSort = function qSort(a, b) {\n return b.reqs - a.reqs;\n };\n\n self.layersQueue = new Heap(qSort);\n self.setupDequeueing();\n};\n\nvar LTCp = LayeredTextureCache.prototype;\nvar layerIdPool = 0;\nvar MAX_INT$1 = Math.pow(2, 53) - 1;\n\nLTCp.makeLayer = function (bb, lvl) {\n var scale = Math.pow(2, lvl);\n var w = Math.ceil(bb.w * scale);\n var h = Math.ceil(bb.h * scale);\n var canvas = this.renderer.makeOffscreenCanvas(w, h);\n var layer = {\n id: layerIdPool = ++layerIdPool % MAX_INT$1,\n bb: bb,\n level: lvl,\n width: w,\n height: h,\n canvas: canvas,\n context: canvas.getContext('2d'),\n eles: [],\n elesQueue: [],\n reqs: 0\n }; // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level);\n\n var cxt = layer.context;\n var dx = -layer.bb.x1;\n var dy = -layer.bb.y1; // do the transform on creation to save cycles (it's the same for all eles)\n\n cxt.scale(scale, scale);\n cxt.translate(dx, dy);\n return layer;\n};\n\nLTCp.getLayers = function (eles, pxRatio, lvl) {\n var self = this;\n var r = self.renderer;\n var cy = r.cy;\n var zoom = cy.zoom();\n var firstGet = self.firstGet;\n self.firstGet = false; // log('--\\nget layers with %s eles', eles.length);\n //log eles.map(function(ele){ return ele.id() }) );\n\n if (lvl == null) {\n lvl = Math.ceil(log2(zoom * pxRatio));\n\n if (lvl < minLvl$1) {\n lvl = minLvl$1;\n } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) {\n return null;\n }\n }\n\n self.validateLayersElesOrdering(lvl, eles);\n var layersByLvl = self.layersByLevel;\n var scale = Math.pow(2, lvl);\n var layers = layersByLvl[lvl] = layersByLvl[lvl] || [];\n var bb;\n var lvlComplete = self.levelIsComplete(lvl, eles);\n var tmpLayers;\n\n var checkTempLevels = function checkTempLevels() {\n var canUseAsTmpLvl = function canUseAsTmpLvl(l) {\n self.validateLayersElesOrdering(l, eles);\n\n if (self.levelIsComplete(l, eles)) {\n tmpLayers = layersByLvl[l];\n return true;\n }\n };\n\n var checkLvls = function checkLvls(dir) {\n if (tmpLayers) {\n return;\n }\n\n for (var l = lvl + dir; minLvl$1 <= l && l <= maxLvl$1; l += dir) {\n if (canUseAsTmpLvl(l)) {\n break;\n }\n }\n };\n\n checkLvls(+1);\n checkLvls(-1); // remove the invalid layers; they will be replaced as needed later in this function\n\n for (var i = layers.length - 1; i >= 0; i--) {\n var layer = layers[i];\n\n if (layer.invalid) {\n removeFromArray(layers, layer);\n }\n }\n };\n\n if (!lvlComplete) {\n // if the current level is incomplete, then use the closest, best quality layerset temporarily\n // and later queue the current layerset so we can get the proper quality level soon\n checkTempLevels();\n } else {\n // log('level complete, using existing layers\\n--');\n return layers;\n }\n\n var getBb = function getBb() {\n if (!bb) {\n bb = makeBoundingBox();\n\n for (var i = 0; i < eles.length; i++) {\n updateBoundingBox(bb, eles[i].boundingBox());\n }\n }\n\n return bb;\n };\n\n var makeLayer = function makeLayer(opts) {\n opts = opts || {};\n var after = opts.after;\n getBb();\n var area = bb.w * scale * (bb.h * scale);\n\n if (area > maxLayerArea) {\n return null;\n }\n\n var layer = self.makeLayer(bb, lvl);\n\n if (after != null) {\n var index = layers.indexOf(after) + 1;\n layers.splice(index, 0, layer);\n } else if (opts.insert === undefined || opts.insert) {\n // no after specified => first layer made so put at start\n layers.unshift(layer);\n } // if( tmpLayers ){\n //self.queueLayer( layer );\n // }\n\n\n return layer;\n };\n\n if (self.skipping && !firstGet) {\n // log('skip layers');\n return null;\n } // log('do layers');\n\n\n var layer = null;\n var maxElesPerLayer = eles.length / defNumLayers;\n var allowLazyQueueing = !firstGet;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n var rs = ele._private.rscratch;\n var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; // log('look at ele', ele.id());\n\n var existingLayer = caches[lvl];\n\n if (existingLayer) {\n // reuse layer for later eles\n // log('reuse layer for', ele.id());\n layer = existingLayer;\n continue;\n }\n\n if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) {\n // log('make new layer for ele %s', ele.id());\n layer = makeLayer({\n insert: true,\n after: layer\n }); // if now layer can be built then we can't use layers at this level\n\n if (!layer) {\n return null;\n } // log('new layer with id %s', layer.id);\n\n }\n\n if (tmpLayers || allowLazyQueueing) {\n // log('queue ele %s in layer %s', ele.id(), layer.id);\n self.queueLayer(layer, ele);\n } else {\n // log('draw ele %s in layer %s', ele.id(), layer.id);\n self.drawEleInLayer(layer, ele, lvl, pxRatio);\n }\n\n layer.eles.push(ele);\n caches[lvl] = layer;\n } // log('--');\n\n\n if (tmpLayers) {\n // then we only queued the current layerset and can't draw it yet\n return tmpLayers;\n }\n\n if (allowLazyQueueing) {\n // log('lazy queue level', lvl);\n return null;\n }\n\n return layers;\n}; // a layer may want to use an ele cache of a higher level to avoid blurriness\n// so the layer level might not equal the ele level\n\n\nLTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) {\n return lvl;\n};\n\nLTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) {\n var self = this;\n var r = this.renderer;\n var context = layer.context;\n var bb = ele.boundingBox();\n\n if (bb.w === 0 || bb.h === 0 || !ele.visible()) {\n return;\n }\n\n lvl = self.getEleLevelForLayerLevel(lvl, pxRatio);\n\n {\n r.setImgSmoothing(context, false);\n }\n\n {\n r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs);\n }\n\n {\n r.setImgSmoothing(context, true);\n }\n};\n\nLTCp.levelIsComplete = function (lvl, eles) {\n var self = this;\n var layers = self.layersByLevel[lvl];\n\n if (!layers || layers.length === 0) {\n return false;\n }\n\n var numElesInLayers = 0;\n\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i]; // if there are any eles needed to be drawn yet, the level is not complete\n\n if (layer.reqs > 0) {\n return false;\n } // if the layer is invalid, the level is not complete\n\n\n if (layer.invalid) {\n return false;\n }\n\n numElesInLayers += layer.eles.length;\n } // we should have exactly the number of eles passed in to be complete\n\n\n if (numElesInLayers !== eles.length) {\n return false;\n }\n\n return true;\n};\n\nLTCp.validateLayersElesOrdering = function (lvl, eles) {\n var layers = this.layersByLevel[lvl];\n\n if (!layers) {\n return;\n } // if in a layer the eles are not in the same order, then the layer is invalid\n // (i.e. there is an ele in between the eles in the layer)\n\n\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i];\n var offset = -1; // find the offset\n\n for (var j = 0; j < eles.length; j++) {\n if (layer.eles[0] === eles[j]) {\n offset = j;\n break;\n }\n }\n\n if (offset < 0) {\n // then the layer has nonexistant elements and is invalid\n this.invalidateLayer(layer);\n continue;\n } // the eles in the layer must be in the same continuous order, else the layer is invalid\n\n\n var o = offset;\n\n for (var j = 0; j < layer.eles.length; j++) {\n if (layer.eles[j] !== eles[o + j]) {\n // log('invalidate based on ordering', layer.id);\n this.invalidateLayer(layer);\n break;\n }\n }\n }\n};\n\nLTCp.updateElementsInLayers = function (eles, update) {\n var self = this;\n var isEles = element(eles[0]); // collect udpated elements (cascaded from the layers) and update each\n // layer itself along the way\n\n for (var i = 0; i < eles.length; i++) {\n var req = isEles ? null : eles[i];\n var ele = isEles ? eles[i] : eles[i].ele;\n var rs = ele._private.rscratch;\n var caches = rs.imgLayerCaches = rs.imgLayerCaches || {};\n\n for (var l = minLvl$1; l <= maxLvl$1; l++) {\n var layer = caches[l];\n\n if (!layer) {\n continue;\n } // if update is a request from the ele cache, then it affects only\n // the matching level\n\n\n if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) {\n continue;\n }\n\n update(layer, ele, req);\n }\n }\n};\n\nLTCp.haveLayers = function () {\n var self = this;\n var haveLayers = false;\n\n for (var l = minLvl$1; l <= maxLvl$1; l++) {\n var layers = self.layersByLevel[l];\n\n if (layers && layers.length > 0) {\n haveLayers = true;\n break;\n }\n }\n\n return haveLayers;\n};\n\nLTCp.invalidateElements = function (eles) {\n var self = this;\n\n if (eles.length === 0) {\n return;\n }\n\n self.lastInvalidationTime = performanceNow(); // log('update invalidate layer time from eles');\n\n if (eles.length === 0 || !self.haveLayers()) {\n return;\n }\n\n self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) {\n self.invalidateLayer(layer);\n });\n};\n\nLTCp.invalidateLayer = function (layer) {\n // log('update invalidate layer time');\n this.lastInvalidationTime = performanceNow();\n\n if (layer.invalid) {\n return;\n } // save cycles\n\n\n var lvl = layer.level;\n var eles = layer.eles;\n var layers = this.layersByLevel[lvl]; // log('invalidate layer', layer.id );\n\n removeFromArray(layers, layer); // layer.eles = [];\n\n layer.elesQueue = [];\n layer.invalid = true;\n\n if (layer.replacement) {\n layer.replacement.invalid = true;\n }\n\n for (var i = 0; i < eles.length; i++) {\n var caches = eles[i]._private.rscratch.imgLayerCaches;\n\n if (caches) {\n caches[lvl] = null;\n }\n }\n};\n\nLTCp.refineElementTextures = function (eles) {\n var self = this; // log('refine', eles.length);\n\n self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) {\n var rLyr = layer.replacement;\n\n if (!rLyr) {\n rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level);\n rLyr.replaces = layer;\n rLyr.eles = layer.eles; // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level);\n }\n\n if (!rLyr.reqs) {\n for (var i = 0; i < rLyr.eles.length; i++) {\n self.queueLayer(rLyr, rLyr.eles[i]);\n } // log('queue replacement layer refinement', rLyr.id);\n\n }\n });\n};\n\nLTCp.enqueueElementRefinement = function (ele) {\n\n this.eleTxrDeqs.merge(ele);\n this.scheduleElementRefinement();\n};\n\nLTCp.queueLayer = function (layer, ele) {\n var self = this;\n var q = self.layersQueue;\n var elesQ = layer.elesQueue;\n var hasId = elesQ.hasId = elesQ.hasId || {}; // if a layer is going to be replaced, queuing is a waste of time\n\n if (layer.replacement) {\n return;\n }\n\n if (ele) {\n if (hasId[ele.id()]) {\n return;\n }\n\n elesQ.push(ele);\n hasId[ele.id()] = true;\n }\n\n if (layer.reqs) {\n layer.reqs++;\n q.updateItem(layer);\n } else {\n layer.reqs = 1;\n q.push(layer);\n }\n};\n\nLTCp.dequeue = function (pxRatio) {\n var self = this;\n var q = self.layersQueue;\n var deqd = [];\n var eleDeqs = 0;\n\n while (eleDeqs < maxDeqSize$1) {\n if (q.size() === 0) {\n break;\n }\n\n var layer = q.peek(); // if a layer has been or will be replaced, then don't waste time with it\n\n if (layer.replacement) {\n // log('layer %s in queue skipped b/c it already has a replacement', layer.id);\n q.pop();\n continue;\n } // if this is a replacement layer that has been superceded, then forget it\n\n\n if (layer.replaces && layer !== layer.replaces.replacement) {\n // log('layer is no longer the most uptodate replacement; dequeued', layer.id)\n q.pop();\n continue;\n }\n\n if (layer.invalid) {\n // log('replacement layer %s is invalid; dequeued', layer.id);\n q.pop();\n continue;\n }\n\n var ele = layer.elesQueue.shift();\n\n if (ele) {\n // log('dequeue layer %s', layer.id);\n self.drawEleInLayer(layer, ele, layer.level, pxRatio);\n eleDeqs++;\n }\n\n if (deqd.length === 0) {\n // we need only one entry in deqd to queue redrawing etc\n deqd.push(true);\n } // if the layer has all its eles done, then remove from the queue\n\n\n if (layer.elesQueue.length === 0) {\n q.pop();\n layer.reqs = 0; // log('dequeue of layer %s complete', layer.id);\n // when a replacement layer is dequeued, it replaces the old layer in the level\n\n if (layer.replaces) {\n self.applyLayerReplacement(layer);\n }\n\n self.requestRedraw();\n }\n }\n\n return deqd;\n};\n\nLTCp.applyLayerReplacement = function (layer) {\n var self = this;\n var layersInLevel = self.layersByLevel[layer.level];\n var replaced = layer.replaces;\n var index = layersInLevel.indexOf(replaced); // if the replaced layer is not in the active list for the level, then replacing\n // refs would be a mistake (i.e. overwriting the true active layer)\n\n if (index < 0 || replaced.invalid) {\n // log('replacement layer would have no effect', layer.id);\n return;\n }\n\n layersInLevel[index] = layer; // replace level ref\n // replace refs in eles\n\n for (var i = 0; i < layer.eles.length; i++) {\n var _p = layer.eles[i]._private;\n var cache = _p.imgLayerCaches = _p.imgLayerCaches || {};\n\n if (cache) {\n cache[layer.level] = layer;\n }\n } // log('apply replacement layer %s over %s', layer.id, replaced.id);\n\n\n self.requestRedraw();\n};\n\nLTCp.requestRedraw = util(function () {\n var r = this.renderer;\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n r.redraw();\n}, 100);\nLTCp.setupDequeueing = defs.setupDequeueing({\n deqRedrawThreshold: deqRedrawThreshold$1,\n deqCost: deqCost$1,\n deqAvgCost: deqAvgCost$1,\n deqNoDrawCost: deqNoDrawCost$1,\n deqFastCost: deqFastCost$1,\n deq: function deq(self, pxRatio) {\n return self.dequeue(pxRatio);\n },\n onDeqd: noop,\n shouldRedraw: trueify,\n priority: function priority(self) {\n return self.renderer.beforeRenderPriorities.lyrTxrDeq;\n }\n});\n\nvar CRp = {};\nvar impl;\n\nfunction polygon(context, points) {\n for (var i = 0; i < points.length; i++) {\n var pt = points[i];\n context.lineTo(pt.x, pt.y);\n }\n}\n\nfunction triangleBackcurve(context, points, controlPoint) {\n var firstPt;\n\n for (var i = 0; i < points.length; i++) {\n var pt = points[i];\n\n if (i === 0) {\n firstPt = pt;\n }\n\n context.lineTo(pt.x, pt.y);\n }\n\n context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y);\n}\n\nfunction triangleTee(context, trianglePoints, teePoints) {\n if (context.beginPath) {\n context.beginPath();\n }\n\n var triPts = trianglePoints;\n\n for (var i = 0; i < triPts.length; i++) {\n var pt = triPts[i];\n context.lineTo(pt.x, pt.y);\n }\n\n var teePts = teePoints;\n var firstTeePt = teePoints[0];\n context.moveTo(firstTeePt.x, firstTeePt.y);\n\n for (var i = 1; i < teePts.length; i++) {\n var pt = teePts[i];\n context.lineTo(pt.x, pt.y);\n }\n\n if (context.closePath) {\n context.closePath();\n }\n}\n\nfunction circleTriangle(context, trianglePoints, rx, ry, r) {\n if (context.beginPath) {\n context.beginPath();\n }\n\n context.arc(rx, ry, r, 0, Math.PI * 2, false);\n var triPts = trianglePoints;\n var firstTrPt = triPts[0];\n context.moveTo(firstTrPt.x, firstTrPt.y);\n\n for (var i = 0; i < triPts.length; i++) {\n var pt = triPts[i];\n context.lineTo(pt.x, pt.y);\n }\n\n if (context.closePath) {\n context.closePath();\n }\n}\n\nfunction circle(context, rx, ry, r) {\n context.arc(rx, ry, r, 0, Math.PI * 2, false);\n}\n\nCRp.arrowShapeImpl = function (name) {\n return (impl || (impl = {\n 'polygon': polygon,\n 'triangle-backcurve': triangleBackcurve,\n 'triangle-tee': triangleTee,\n 'circle-triangle': circleTriangle,\n 'triangle-cross': triangleTee,\n 'circle': circle\n }))[name];\n};\n\nvar CRp$1 = {};\n\nCRp$1.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) {\n var r = this;\n\n if (ele.isNode()) {\n r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity);\n } else {\n r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity);\n }\n};\n\nCRp$1.drawElementOverlay = function (context, ele) {\n var r = this;\n\n if (ele.isNode()) {\n r.drawNodeOverlay(context, ele);\n } else {\n r.drawEdgeOverlay(context, ele);\n }\n};\n\nCRp$1.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) {\n var r = this;\n var bb = eleTxrCache.getBoundingBox(ele);\n\n if (bb.w === 0 || bb.h === 0) {\n return;\n } // ignore zero size case\n\n\n var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason);\n\n if (eleCache != null) {\n var opacity = getOpacity(r, ele);\n\n if (opacity === 0) {\n return;\n }\n\n var theta = getRotation(r, ele);\n var x1 = bb.x1,\n y1 = bb.y1,\n w = bb.w,\n h = bb.h;\n var x, y, sx, sy, smooth;\n\n if (theta !== 0) {\n var rotPt = eleTxrCache.getRotationPoint(ele);\n sx = rotPt.x;\n sy = rotPt.y;\n context.translate(sx, sy);\n context.rotate(theta);\n smooth = r.getImgSmoothing(context);\n\n if (!smooth) {\n r.setImgSmoothing(context, true);\n }\n\n var off = eleTxrCache.getRotationOffset(ele);\n x = off.x;\n y = off.y;\n } else {\n x = x1;\n y = y1;\n }\n\n var oldGlobalAlpha;\n\n if (opacity !== 1) {\n oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = oldGlobalAlpha * opacity;\n }\n\n context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h);\n\n if (opacity !== 1) {\n context.globalAlpha = oldGlobalAlpha;\n }\n\n if (theta !== 0) {\n context.rotate(-theta);\n context.translate(-sx, -sy);\n\n if (!smooth) {\n r.setImgSmoothing(context, false);\n }\n }\n } else {\n eleTxrCache.drawElement(context, ele); // direct draw fallback\n }\n};\n\nvar getZeroRotation = function getZeroRotation() {\n return 0;\n};\n\nvar getLabelRotation = function getLabelRotation(r, ele) {\n return r.getTextAngle(ele, null);\n};\n\nvar getSourceLabelRotation = function getSourceLabelRotation(r, ele) {\n return r.getTextAngle(ele, 'source');\n};\n\nvar getTargetLabelRotation = function getTargetLabelRotation(r, ele) {\n return r.getTextAngle(ele, 'target');\n};\n\nvar getOpacity = function getOpacity(r, ele) {\n return ele.effectiveOpacity();\n};\n\nvar getTextOpacity = function getTextOpacity(e, ele) {\n return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity();\n};\n\nCRp$1.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) {\n var r = this;\n var _r$data = r.data,\n eleTxrCache = _r$data.eleTxrCache,\n lblTxrCache = _r$data.lblTxrCache,\n slbTxrCache = _r$data.slbTxrCache,\n tlbTxrCache = _r$data.tlbTxrCache;\n var bb = ele.boundingBox();\n var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null;\n\n if (bb.w === 0 || bb.h === 0 || !ele.visible()) {\n return;\n }\n\n if (!extent || boundingBoxesIntersect(bb, extent)) {\n var isEdge = ele.isEdge();\n\n var badLine = ele.element()._private.rscratch.badLine;\n\n r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity);\n\n if (!isEdge || !badLine) {\n r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity);\n }\n\n if (isEdge && !badLine) {\n r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity);\n r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity);\n }\n\n r.drawElementOverlay(context, ele);\n }\n};\n\nCRp$1.drawElements = function (context, eles) {\n var r = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n r.drawElement(context, ele);\n }\n};\n\nCRp$1.drawCachedElements = function (context, eles, pxRatio, extent) {\n var r = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n r.drawCachedElement(context, ele, pxRatio, extent);\n }\n};\n\nCRp$1.drawCachedNodes = function (context, eles, pxRatio, extent) {\n var r = this;\n\n for (var i = 0; i < eles.length; i++) {\n var ele = eles[i];\n\n if (!ele.isNode()) {\n continue;\n }\n\n r.drawCachedElement(context, ele, pxRatio, extent);\n }\n};\n\nCRp$1.drawLayeredElements = function (context, eles, pxRatio, extent) {\n var r = this;\n var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio);\n\n if (layers) {\n for (var i = 0; i < layers.length; i++) {\n var layer = layers[i];\n var bb = layer.bb;\n\n if (bb.w === 0 || bb.h === 0) {\n continue;\n }\n\n context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h);\n }\n } else {\n // fall back on plain caching if no layers\n r.drawCachedElements(context, eles, pxRatio, extent);\n }\n};\n\n/* global Path2D */\nvar CRp$2 = {};\n\nCRp$2.drawEdge = function (context, edge, shiftToOriginWithBb) {\n var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n var rs = edge._private.rscratch;\n\n if (shouldDrawOpacity && !edge.visible()) {\n return;\n } // if bezier ctrl pts can not be calculated, then die\n\n\n if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) {\n // isNaN in case edge is impossible and browser bugs (e.g. safari)\n return;\n }\n\n var bb;\n\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n }\n\n var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1;\n var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1;\n var lineStyle = edge.pstyle('line-style').value;\n var edgeWidth = edge.pstyle('width').pfValue;\n var lineCap = edge.pstyle('line-cap').value;\n var effectiveLineOpacity = opacity * lineOpacity; // separate arrow opacity would require arrow-opacity property\n\n var effectiveArrowOpacity = opacity * lineOpacity;\n\n var drawLine = function drawLine() {\n var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity;\n context.lineWidth = edgeWidth;\n context.lineCap = lineCap;\n r.eleStrokeStyle(context, edge, strokeOpacity);\n r.drawEdgePath(edge, context, rs.allpts, lineStyle);\n context.lineCap = 'butt'; // reset for other drawing functions\n };\n\n var drawOverlay = function drawOverlay() {\n if (!shouldDrawOverlay) {\n return;\n }\n\n r.drawEdgeOverlay(context, edge);\n };\n\n var drawArrows = function drawArrows() {\n var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity;\n r.drawArrowheads(context, edge, arrowOpacity);\n };\n\n var drawText = function drawText() {\n r.drawElementText(context, edge, null, drawLabel);\n };\n\n context.lineJoin = 'round';\n var ghost = edge.pstyle('ghost').value === 'yes';\n\n if (ghost) {\n var gx = edge.pstyle('ghost-offset-x').pfValue;\n var gy = edge.pstyle('ghost-offset-y').pfValue;\n var ghostOpacity = edge.pstyle('ghost-opacity').value;\n var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity;\n context.translate(gx, gy);\n drawLine(effectiveGhostOpacity);\n drawArrows(effectiveGhostOpacity);\n context.translate(-gx, -gy);\n }\n\n drawLine();\n drawArrows();\n drawOverlay();\n drawText();\n\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\n\nCRp$2.drawEdgeOverlay = function (context, edge) {\n if (!edge.visible()) {\n return;\n }\n\n var overlayOpacity = edge.pstyle('overlay-opacity').value;\n\n if (overlayOpacity === 0) {\n return;\n }\n\n var r = this;\n var usePaths = r.usePaths();\n var rs = edge._private.rscratch;\n var overlayPadding = edge.pstyle('overlay-padding').pfValue;\n var overlayWidth = 2 * overlayPadding;\n var overlayColor = edge.pstyle('overlay-color').value;\n context.lineWidth = overlayWidth;\n\n if (rs.edgeType === 'self' && !usePaths) {\n context.lineCap = 'butt';\n } else {\n context.lineCap = 'round';\n }\n\n r.colorStrokeStyle(context, overlayColor[0], overlayColor[1], overlayColor[2], overlayOpacity);\n r.drawEdgePath(edge, context, rs.allpts, 'solid');\n};\n\nCRp$2.drawEdgePath = function (edge, context, pts, type) {\n var rs = edge._private.rscratch;\n var canvasCxt = context;\n var path;\n var pathCacheHit = false;\n var usePaths = this.usePaths();\n var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue;\n var lineDashOffset = edge.pstyle('line-dash-offset').pfValue;\n\n if (usePaths) {\n var pathCacheKey = pts.join('$');\n var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey;\n\n if (keyMatches) {\n path = context = rs.pathCache;\n pathCacheHit = true;\n } else {\n path = context = new Path2D();\n rs.pathCacheKey = pathCacheKey;\n rs.pathCache = path;\n }\n }\n\n if (canvasCxt.setLineDash) {\n // for very outofdate browsers\n switch (type) {\n case 'dotted':\n canvasCxt.setLineDash([1, 1]);\n break;\n\n case 'dashed':\n canvasCxt.setLineDash(lineDashPattern);\n canvasCxt.lineDashOffset = lineDashOffset;\n break;\n\n case 'solid':\n canvasCxt.setLineDash([]);\n break;\n }\n }\n\n if (!pathCacheHit && !rs.badLine) {\n if (context.beginPath) {\n context.beginPath();\n }\n\n context.moveTo(pts[0], pts[1]);\n\n switch (rs.edgeType) {\n case 'bezier':\n case 'self':\n case 'compound':\n case 'multibezier':\n for (var i = 2; i + 3 < pts.length; i += 4) {\n context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]);\n }\n\n break;\n\n case 'straight':\n case 'segments':\n case 'haystack':\n for (var _i = 2; _i + 1 < pts.length; _i += 2) {\n context.lineTo(pts[_i], pts[_i + 1]);\n }\n\n break;\n }\n }\n\n context = canvasCxt;\n\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n } // reset any line dashes\n\n\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n};\n\nCRp$2.drawArrowheads = function (context, edge, opacity) {\n var rs = edge._private.rscratch;\n var isHaystack = rs.edgeType === 'haystack';\n\n if (!isHaystack) {\n this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity);\n }\n\n this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity);\n this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity);\n\n if (!isHaystack) {\n this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity);\n }\n};\n\nCRp$2.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) {\n if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) {\n return;\n }\n\n var self = this;\n var arrowShape = edge.pstyle(prefix + '-arrow-shape').value;\n\n if (arrowShape === 'none') {\n return;\n }\n\n var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled';\n var arrowFill = edge.pstyle(prefix + '-arrow-fill').value;\n var edgeWidth = edge.pstyle('width').pfValue;\n var edgeOpacity = edge.pstyle('opacity').value;\n\n if (opacity === undefined) {\n opacity = edgeOpacity;\n }\n\n var gco = context.globalCompositeOperation;\n\n if (opacity !== 1 || arrowFill === 'hollow') {\n // then extra clear is needed\n context.globalCompositeOperation = 'destination-out';\n self.colorFillStyle(context, 255, 255, 255, 1);\n self.colorStrokeStyle(context, 255, 255, 255, 1);\n self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, x, y, angle);\n context.globalCompositeOperation = gco;\n } // otherwise, the opaque arrow clears it for free :)\n\n\n var color = edge.pstyle(prefix + '-arrow-color').value;\n self.colorFillStyle(context, color[0], color[1], color[2], opacity);\n self.colorStrokeStyle(context, color[0], color[1], color[2], opacity);\n self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, x, y, angle);\n};\n\nCRp$2.drawArrowShape = function (edge, context, fill, edgeWidth, shape, x, y, angle) {\n var r = this;\n var usePaths = this.usePaths() && shape !== 'triangle-cross';\n var pathCacheHit = false;\n var path;\n var canvasContext = context;\n var translation = {\n x: x,\n y: y\n };\n var scale = edge.pstyle('arrow-scale').value;\n var size = this.getArrowWidth(edgeWidth, scale);\n var shapeImpl = r.arrowShapes[shape];\n\n if (usePaths) {\n var cache = r.arrowPathCache = r.arrowPathCache || [];\n var key = hashString(shape);\n var cachedPath = cache[key];\n\n if (cachedPath != null) {\n path = context = cachedPath;\n pathCacheHit = true;\n } else {\n path = context = new Path2D();\n cache[key] = path;\n }\n }\n\n if (!pathCacheHit) {\n if (context.beginPath) {\n context.beginPath();\n }\n\n if (usePaths) {\n // store in the path cache with values easily manipulated later\n shapeImpl.draw(context, 1, 0, {\n x: 0,\n y: 0\n }, 1);\n } else {\n shapeImpl.draw(context, size, angle, translation, edgeWidth);\n }\n\n if (context.closePath) {\n context.closePath();\n }\n }\n\n context = canvasContext;\n\n if (usePaths) {\n // set transform to arrow position/orientation\n context.translate(x, y);\n context.rotate(angle);\n context.scale(size, size);\n }\n\n if (fill === 'filled' || fill === 'both') {\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n }\n\n if (fill === 'hollow' || fill === 'both') {\n context.lineWidth = (shapeImpl.matchEdgeWidth ? edgeWidth : 1) / (usePaths ? size : 1);\n context.lineJoin = 'miter';\n\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n }\n\n if (usePaths) {\n // reset transform by applying inverse\n context.scale(1 / size, 1 / size);\n context.rotate(-angle);\n context.translate(-x, -y);\n }\n};\n\nvar CRp$3 = {};\n\nCRp$3.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) {\n // detect problematic cases for old browsers with bad images (cheaper than try-catch)\n if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) {\n return;\n }\n\n context.drawImage(img, ix, iy, iw, ih, x, y, w, h);\n};\n\nCRp$3.drawInscribedImage = function (context, img, node, index, nodeOpacity) {\n var r = this;\n var pos = node.position();\n var nodeX = pos.x;\n var nodeY = pos.y;\n var styleObj = node.cy().style();\n var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj);\n var fit = getIndexedStyle(node, 'background-fit', 'value', index);\n var repeat = getIndexedStyle(node, 'background-repeat', 'value', index);\n var nodeW = node.width();\n var nodeH = node.height();\n var paddingX2 = node.padding() * 2;\n var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2);\n var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2);\n var rs = node._private.rscratch;\n var clip = getIndexedStyle(node, 'background-clip', 'value', index);\n var shouldClip = clip === 'node';\n var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity;\n var imgW = img.width || img.cachedW;\n var imgH = img.height || img.cachedH; // workaround for broken browsers like ie\n\n if (null == imgW || null == imgH) {\n document.body.appendChild(img); // eslint-disable-line no-undef\n\n imgW = img.cachedW = img.width || img.offsetWidth;\n imgH = img.cachedH = img.height || img.offsetHeight;\n document.body.removeChild(img); // eslint-disable-line no-undef\n }\n\n var w = imgW;\n var h = imgH;\n\n if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') {\n if (getIndexedStyle(node, 'background-width', 'units', index) === '%') {\n w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW;\n } else {\n w = getIndexedStyle(node, 'background-width', 'pfValue', index);\n }\n }\n\n if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') {\n if (getIndexedStyle(node, 'background-height', 'units', index) === '%') {\n h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH;\n } else {\n h = getIndexedStyle(node, 'background-height', 'pfValue', index);\n }\n }\n\n if (w === 0 || h === 0) {\n return; // no point in drawing empty image (and chrome is broken in this case)\n }\n\n if (fit === 'contain') {\n var scale = Math.min(nodeTW / w, nodeTH / h);\n w *= scale;\n h *= scale;\n } else if (fit === 'cover') {\n var scale = Math.max(nodeTW / w, nodeTH / h);\n w *= scale;\n h *= scale;\n }\n\n var x = nodeX - nodeTW / 2; // left\n\n var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index);\n var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index);\n\n if (posXUnits === '%') {\n x += (nodeTW - w) * posXPfVal;\n } else {\n x += posXPfVal;\n }\n\n var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index);\n var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index);\n\n if (offXUnits === '%') {\n x += (nodeTW - w) * offXPfVal;\n } else {\n x += offXPfVal;\n }\n\n var y = nodeY - nodeTH / 2; // top\n\n var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index);\n var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index);\n\n if (posYUnits === '%') {\n y += (nodeTH - h) * posYPfVal;\n } else {\n y += posYPfVal;\n }\n\n var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index);\n var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index);\n\n if (offYUnits === '%') {\n y += (nodeTH - h) * offYPfVal;\n } else {\n y += offYPfVal;\n }\n\n if (rs.pathCache) {\n x -= nodeX;\n y -= nodeY;\n nodeX = 0;\n nodeY = 0;\n }\n\n var gAlpha = context.globalAlpha;\n context.globalAlpha = imgOpacity;\n\n if (repeat === 'no-repeat') {\n if (shouldClip) {\n context.save();\n\n if (rs.pathCache) {\n context.clip(rs.pathCache);\n } else {\n r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH);\n context.clip();\n }\n }\n\n r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h);\n\n if (shouldClip) {\n context.restore();\n }\n } else {\n var pattern = context.createPattern(img, repeat);\n context.fillStyle = pattern;\n r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH);\n context.translate(x, y);\n context.fill();\n context.translate(-x, -y);\n }\n\n context.globalAlpha = gAlpha;\n};\n\nvar CRp$4 = {};\n\nCRp$4.eleTextBiggerThanMin = function (ele, scale) {\n if (!scale) {\n var zoom = ele.cy().zoom();\n var pxRatio = this.getPixelRatio();\n var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level\n\n scale = Math.pow(2, lvl);\n }\n\n var computedSize = ele.pstyle('font-size').pfValue * scale;\n var minSize = ele.pstyle('min-zoomed-font-size').pfValue;\n\n if (computedSize < minSize) {\n return false;\n }\n\n return true;\n};\n\nCRp$4.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) {\n var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n\n if (force == null) {\n if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) {\n return;\n }\n } else if (force === false) {\n return;\n }\n\n if (ele.isNode()) {\n var label = ele.pstyle('label');\n\n if (!label || !label.value) {\n return;\n }\n\n var justification = r.getLabelJustification(ele);\n context.textAlign = justification;\n context.textBaseline = 'bottom';\n } else {\n var badLine = ele.element()._private.rscratch.badLine;\n\n var _label = ele.pstyle('label');\n\n var srcLabel = ele.pstyle('source-label');\n var tgtLabel = ele.pstyle('target-label');\n\n if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) {\n return;\n }\n\n context.textAlign = 'center';\n context.textBaseline = 'bottom';\n }\n\n var applyRotation = !shiftToOriginWithBb;\n var bb;\n\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n }\n\n if (prefix == null) {\n r.drawText(context, ele, null, applyRotation, useEleOpacity);\n\n if (ele.isEdge()) {\n r.drawText(context, ele, 'source', applyRotation, useEleOpacity);\n r.drawText(context, ele, 'target', applyRotation, useEleOpacity);\n }\n } else {\n r.drawText(context, ele, prefix, applyRotation, useEleOpacity);\n }\n\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\n\nCRp$4.getFontCache = function (context) {\n var cache;\n this.fontCaches = this.fontCaches || [];\n\n for (var i = 0; i < this.fontCaches.length; i++) {\n cache = this.fontCaches[i];\n\n if (cache.context === context) {\n return cache;\n }\n }\n\n cache = {\n context: context\n };\n this.fontCaches.push(cache);\n return cache;\n}; // set up canvas context with font\n// returns transformed text string\n\n\nCRp$4.setupTextStyle = function (context, ele) {\n var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // Font style\n var labelStyle = ele.pstyle('font-style').strValue;\n var labelSize = ele.pstyle('font-size').pfValue + 'px';\n var labelFamily = ele.pstyle('font-family').strValue;\n var labelWeight = ele.pstyle('font-weight').strValue;\n var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1;\n var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity;\n var color = ele.pstyle('color').value;\n var outlineColor = ele.pstyle('text-outline-color').value;\n context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily;\n context.lineJoin = 'round'; // so text outlines aren't jagged\n\n this.colorFillStyle(context, color[0], color[1], color[2], opacity);\n this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity);\n}; // TODO ensure re-used\n\n\nfunction roundRect(ctx, x, y, width, height) {\n var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n}\n\nCRp$4.getTextAngle = function (ele, prefix) {\n var theta;\n var _p = ele._private;\n var rscratch = _p.rscratch;\n var pdash = prefix ? prefix + '-' : '';\n var rotation = ele.pstyle(pdash + 'text-rotation');\n var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix);\n\n if (rotation.strValue === 'autorotate') {\n theta = ele.isEdge() ? textAngle : 0;\n } else if (rotation.strValue === 'none') {\n theta = 0;\n } else {\n theta = rotation.pfValue;\n }\n\n return theta;\n};\n\nCRp$4.drawText = function (context, ele, prefix) {\n var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var _p = ele._private;\n var rscratch = _p.rscratch;\n var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1;\n\n if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) {\n return;\n } // use 'main' as an alias for the main label (i.e. null prefix)\n\n\n if (prefix === 'main') {\n prefix = null;\n }\n\n var textX = getPrefixedProperty(rscratch, 'labelX', prefix);\n var textY = getPrefixedProperty(rscratch, 'labelY', prefix);\n var orgTextX, orgTextY; // used for rotation\n\n var text = this.getLabelText(ele, prefix);\n\n if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) {\n this.setupTextStyle(context, ele, useEleOpacity);\n var pdash = prefix ? prefix + '-' : '';\n var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix);\n var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix);\n var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue;\n var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue;\n var isEdge = ele.isEdge();\n var halign = ele.pstyle('text-halign').value;\n var valign = ele.pstyle('text-valign').value;\n\n if (isEdge) {\n halign = 'center';\n valign = 'center';\n }\n\n textX += marginX;\n textY += marginY;\n var theta;\n\n if (!applyRotation) {\n theta = 0;\n } else {\n theta = this.getTextAngle(ele, prefix);\n }\n\n if (theta !== 0) {\n orgTextX = textX;\n orgTextY = textY;\n context.translate(orgTextX, orgTextY);\n context.rotate(theta);\n textX = 0;\n textY = 0;\n }\n\n switch (valign) {\n case 'top':\n break;\n\n case 'center':\n textY += textH / 2;\n break;\n\n case 'bottom':\n textY += textH;\n break;\n }\n\n var backgroundOpacity = ele.pstyle('text-background-opacity').value;\n var borderOpacity = ele.pstyle('text-border-opacity').value;\n var textBorderWidth = ele.pstyle('text-border-width').pfValue;\n var backgroundPadding = ele.pstyle('text-background-padding').pfValue;\n\n if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) {\n var bgX = textX - backgroundPadding;\n\n switch (halign) {\n case 'left':\n bgX -= textW;\n break;\n\n case 'center':\n bgX -= textW / 2;\n break;\n }\n\n var bgY = textY - textH - backgroundPadding;\n var bgW = textW + 2 * backgroundPadding;\n var bgH = textH + 2 * backgroundPadding;\n\n if (backgroundOpacity > 0) {\n var textFill = context.fillStyle;\n var textBackgroundColor = ele.pstyle('text-background-color').value;\n context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')';\n var styleShape = ele.pstyle('text-background-shape').strValue;\n\n if (styleShape.indexOf('round') === 0) {\n roundRect(context, bgX, bgY, bgW, bgH, 2);\n } else {\n context.fillRect(bgX, bgY, bgW, bgH);\n }\n\n context.fillStyle = textFill;\n }\n\n if (textBorderWidth > 0 && borderOpacity > 0) {\n var textStroke = context.strokeStyle;\n var textLineWidth = context.lineWidth;\n var textBorderColor = ele.pstyle('text-border-color').value;\n var textBorderStyle = ele.pstyle('text-border-style').value;\n context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')';\n context.lineWidth = textBorderWidth;\n\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (textBorderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n\n case 'double':\n context.lineWidth = textBorderWidth / 4; // 50% reserved for white between the two borders\n\n context.setLineDash([]);\n break;\n\n case 'solid':\n context.setLineDash([]);\n break;\n }\n }\n\n context.strokeRect(bgX, bgY, bgW, bgH);\n\n if (textBorderStyle === 'double') {\n var whiteWidth = textBorderWidth / 2;\n context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2);\n }\n\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n\n context.lineWidth = textLineWidth;\n context.strokeStyle = textStroke;\n }\n }\n\n var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle\n\n if (lineWidth > 0) {\n context.lineWidth = lineWidth;\n }\n\n if (ele.pstyle('text-wrap').value === 'wrap') {\n var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix);\n var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix);\n var halfTextW = textW / 2;\n var justification = this.getLabelJustification(ele);\n\n if (justification === 'auto') ; else if (halign === 'left') {\n // auto justification : right\n if (justification === 'left') {\n textX += -textW;\n } else if (justification === 'center') {\n textX += -halfTextW;\n } // else same as auto\n\n } else if (halign === 'center') {\n // auto justfication : center\n if (justification === 'left') {\n textX += -halfTextW;\n } else if (justification === 'right') {\n textX += halfTextW;\n } // else same as auto\n\n } else if (halign === 'right') {\n // auto justification : left\n if (justification === 'center') {\n textX += halfTextW;\n } else if (justification === 'right') {\n textX += textW;\n } // else same as auto\n\n }\n\n switch (valign) {\n case 'top':\n textY -= (lines.length - 1) * lineHeight;\n break;\n\n case 'center':\n case 'bottom':\n textY -= (lines.length - 1) * lineHeight;\n break;\n }\n\n for (var l = 0; l < lines.length; l++) {\n if (lineWidth > 0) {\n context.strokeText(lines[l], textX, textY);\n }\n\n context.fillText(lines[l], textX, textY);\n textY += lineHeight;\n }\n } else {\n if (lineWidth > 0) {\n context.strokeText(text, textX, textY);\n }\n\n context.fillText(text, textX, textY);\n }\n\n if (theta !== 0) {\n context.rotate(-theta);\n context.translate(-orgTextX, -orgTextY);\n }\n }\n};\n\n/* global Path2D */\nvar CRp$5 = {};\n\nCRp$5.drawNode = function (context, node, shiftToOriginWithBb) {\n var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n var r = this;\n var nodeWidth, nodeHeight;\n var _p = node._private;\n var rs = _p.rscratch;\n var pos = node.position();\n\n if (!number(pos.x) || !number(pos.y)) {\n return; // can't draw node with undefined position\n }\n\n if (shouldDrawOpacity && !node.visible()) {\n return;\n }\n\n var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1;\n var usePaths = r.usePaths();\n var path;\n var pathCacheHit = false;\n var padding = node.padding();\n nodeWidth = node.width() + 2 * padding;\n nodeHeight = node.height() + 2 * padding; //\n // setup shift\n\n var bb;\n\n if (shiftToOriginWithBb) {\n bb = shiftToOriginWithBb;\n context.translate(-bb.x1, -bb.y1);\n } //\n // load bg image\n\n\n var bgImgProp = node.pstyle('background-image');\n var urls = bgImgProp.value;\n var urlDefined = new Array(urls.length);\n var image = new Array(urls.length);\n var numImages = 0;\n\n for (var i = 0; i < urls.length; i++) {\n var url = urls[i];\n var defd = urlDefined[i] = url != null && url !== 'none';\n\n if (defd) {\n var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i);\n numImages++; // get image, and if not loaded then ask to redraw when later loaded\n\n image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () {\n _p.backgroundTimestamp = Date.now();\n node.emitAndNotify('background');\n });\n }\n } //\n // setup styles\n\n\n var darkness = node.pstyle('background-blacken').value;\n var borderWidth = node.pstyle('border-width').pfValue;\n var bgOpacity = node.pstyle('background-opacity').value * eleOpacity;\n var borderColor = node.pstyle('border-color').value;\n var borderStyle = node.pstyle('border-style').value;\n var borderOpacity = node.pstyle('border-opacity').value * eleOpacity;\n context.lineJoin = 'miter'; // so borders are square with the node shape\n\n var setupShapeColor = function setupShapeColor() {\n var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity;\n r.eleFillStyle(context, node, bgOpy);\n };\n\n var setupBorderColor = function setupBorderColor() {\n var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity;\n r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy);\n }; //\n // setup shape\n\n\n var styleShape = node.pstyle('shape').strValue;\n var shapePts = node.pstyle('shape-polygon-points').pfValue;\n\n if (usePaths) {\n context.translate(pos.x, pos.y);\n var pathCache = r.nodePathCache = r.nodePathCache || [];\n var key = hashStrings(styleShape === 'polygon' ? styleShape + ',' + shapePts.join(',') : styleShape, '' + nodeHeight, '' + nodeWidth);\n var cachedPath = pathCache[key];\n\n if (cachedPath != null) {\n path = cachedPath;\n pathCacheHit = true;\n rs.pathCache = path;\n } else {\n path = new Path2D();\n pathCache[key] = rs.pathCache = path;\n }\n }\n\n var drawShape = function drawShape() {\n if (!pathCacheHit) {\n var npos = pos;\n\n if (usePaths) {\n npos = {\n x: 0,\n y: 0\n };\n }\n\n r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight);\n }\n\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n };\n\n var drawImages = function drawImages() {\n var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity;\n var prevBging = _p.backgrounding;\n var totalCompleted = 0;\n\n for (var _i = 0; _i < image.length; _i++) {\n if (urlDefined[_i] && image[_i].complete && !image[_i].error) {\n totalCompleted++;\n r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity);\n }\n }\n\n _p.backgrounding = !(totalCompleted === numImages);\n\n if (prevBging !== _p.backgrounding) {\n // update style b/c :backgrounding state changed\n node.updateStyle(false);\n }\n };\n\n var drawPie = function drawPie() {\n var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity;\n\n if (r.hasPie(node)) {\n r.drawPie(context, node, pieOpacity); // redraw/restore path if steps after pie need it\n\n if (redrawShape) {\n if (!usePaths) {\n r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight);\n }\n }\n }\n };\n\n var darken = function darken() {\n var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity;\n var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity;\n var c = darkness > 0 ? 0 : 255;\n\n if (darkness !== 0) {\n r.colorFillStyle(context, c, c, c, opacity);\n\n if (usePaths) {\n context.fill(path);\n } else {\n context.fill();\n }\n }\n };\n\n var drawBorder = function drawBorder() {\n if (borderWidth > 0) {\n context.lineWidth = borderWidth;\n context.lineCap = 'butt';\n\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (borderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n\n case 'solid':\n case 'double':\n context.setLineDash([]);\n break;\n }\n }\n\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n\n if (borderStyle === 'double') {\n context.lineWidth = borderWidth / 3;\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n\n if (usePaths) {\n context.stroke(path);\n } else {\n context.stroke();\n }\n\n context.globalCompositeOperation = gco;\n } // reset in case we changed the border style\n\n\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n }\n };\n\n var drawOverlay = function drawOverlay() {\n if (shouldDrawOverlay) {\n r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight);\n }\n };\n\n var drawText = function drawText() {\n r.drawElementText(context, node, null, drawLabel);\n };\n\n var ghost = node.pstyle('ghost').value === 'yes';\n\n if (ghost) {\n var gx = node.pstyle('ghost-offset-x').pfValue;\n var gy = node.pstyle('ghost-offset-y').pfValue;\n var ghostOpacity = node.pstyle('ghost-opacity').value;\n var effGhostOpacity = ghostOpacity * eleOpacity;\n context.translate(gx, gy);\n setupShapeColor(ghostOpacity * bgOpacity);\n drawShape();\n drawImages(effGhostOpacity);\n drawPie(darkness !== 0 || borderWidth !== 0);\n darken(effGhostOpacity);\n setupBorderColor(ghostOpacity * borderOpacity);\n drawBorder();\n context.translate(-gx, -gy);\n }\n\n setupShapeColor();\n drawShape();\n drawImages();\n drawPie(darkness !== 0 || borderWidth !== 0);\n darken();\n setupBorderColor();\n drawBorder();\n\n if (usePaths) {\n context.translate(-pos.x, -pos.y);\n }\n\n drawText();\n drawOverlay(); //\n // clean up shift\n\n if (shiftToOriginWithBb) {\n context.translate(bb.x1, bb.y1);\n }\n};\n\nCRp$5.drawNodeOverlay = function (context, node, pos, nodeWidth, nodeHeight) {\n var r = this;\n\n if (!node.visible()) {\n return;\n }\n\n var overlayPadding = node.pstyle('overlay-padding').pfValue;\n var overlayOpacity = node.pstyle('overlay-opacity').value;\n var overlayColor = node.pstyle('overlay-color').value;\n\n if (overlayOpacity > 0) {\n pos = pos || node.position();\n\n if (nodeWidth == null || nodeHeight == null) {\n var padding = node.padding();\n nodeWidth = node.width() + 2 * padding;\n nodeHeight = node.height() + 2 * padding;\n }\n\n r.colorFillStyle(context, overlayColor[0], overlayColor[1], overlayColor[2], overlayOpacity);\n r.nodeShapes['roundrectangle'].draw(context, pos.x, pos.y, nodeWidth + overlayPadding * 2, nodeHeight + overlayPadding * 2);\n context.fill();\n }\n}; // does the node have at least one pie piece?\n\n\nCRp$5.hasPie = function (node) {\n node = node[0]; // ensure ele ref\n\n return node._private.hasPie;\n};\n\nCRp$5.drawPie = function (context, node, nodeOpacity, pos) {\n node = node[0]; // ensure ele ref\n\n pos = pos || node.position();\n var cyStyle = node.cy().style();\n var pieSize = node.pstyle('pie-size');\n var x = pos.x;\n var y = pos.y;\n var nodeW = node.width();\n var nodeH = node.height();\n var radius = Math.min(nodeW, nodeH) / 2; // must fit in node\n\n var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1]\n\n var usePaths = this.usePaths();\n\n if (usePaths) {\n x = 0;\n y = 0;\n }\n\n if (pieSize.units === '%') {\n radius = radius * pieSize.pfValue;\n } else if (pieSize.pfValue !== undefined) {\n radius = pieSize.pfValue / 2;\n }\n\n for (var i = 1; i <= cyStyle.pieBackgroundN; i++) {\n // 1..N\n var size = node.pstyle('pie-' + i + '-background-size').value;\n var color = node.pstyle('pie-' + i + '-background-color').value;\n var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity;\n var percent = size / 100; // map integer range [0, 100] to [0, 1]\n // percent can't push beyond 1\n\n if (percent + lastPercent > 1) {\n percent = 1 - lastPercent;\n }\n\n var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise\n\n var angleDelta = 2 * Math.PI * percent;\n var angleEnd = angleStart + angleDelta; // ignore if\n // - zero size\n // - we're already beyond the full circle\n // - adding the current slice would go beyond the full circle\n\n if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) {\n continue;\n }\n\n context.beginPath();\n context.moveTo(x, y);\n context.arc(x, y, radius, angleStart, angleEnd);\n context.closePath();\n this.colorFillStyle(context, color[0], color[1], color[2], opacity);\n context.fill();\n lastPercent += percent;\n }\n};\n\nvar CRp$6 = {};\nvar motionBlurDelay = 100; // var isFirefox = typeof InstallTrigger !== 'undefined';\n\nCRp$6.getPixelRatio = function () {\n var context = this.data.contexts[0];\n\n if (this.forcedPixelRatio != null) {\n return this.forcedPixelRatio;\n }\n\n var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;\n return (window.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef\n};\n\nCRp$6.paintCache = function (context) {\n var caches = this.paintCaches = this.paintCaches || [];\n var needToCreateCache = true;\n var cache;\n\n for (var i = 0; i < caches.length; i++) {\n cache = caches[i];\n\n if (cache.context === context) {\n needToCreateCache = false;\n break;\n }\n }\n\n if (needToCreateCache) {\n cache = {\n context: context\n };\n caches.push(cache);\n }\n\n return cache;\n};\n\nCRp$6.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) {\n var gradientStyle;\n var usePaths = this.usePaths();\n var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value,\n positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue;\n\n if (fill === 'radial-gradient') {\n if (ele.isEdge()) {\n var start = ele.sourceEndpoint(),\n end = ele.targetEndpoint(),\n mid = ele.midpoint();\n var d1 = dist(start, mid);\n var d2 = dist(end, mid);\n gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2));\n } else {\n var pos = usePaths ? {\n x: 0,\n y: 0\n } : ele.position(),\n width = ele.paddedWidth(),\n height = ele.paddedHeight();\n gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height));\n }\n } else {\n if (ele.isEdge()) {\n var _start = ele.sourceEndpoint(),\n _end = ele.targetEndpoint();\n\n gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y);\n } else {\n var _pos = usePaths ? {\n x: 0,\n y: 0\n } : ele.position(),\n _width = ele.paddedWidth(),\n _height = ele.paddedHeight(),\n halfWidth = _width / 2,\n halfHeight = _height / 2;\n\n var direction = ele.pstyle('background-gradient-direction').value;\n\n switch (direction) {\n case 'to-bottom':\n gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight);\n break;\n\n case 'to-top':\n gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight);\n break;\n\n case 'to-left':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y);\n break;\n\n case 'to-right':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y);\n break;\n\n case 'to-bottom-right':\n case 'to-right-bottom':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight);\n break;\n\n case 'to-top-right':\n case 'to-right-top':\n gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight);\n break;\n\n case 'to-bottom-left':\n case 'to-left-bottom':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight);\n break;\n\n case 'to-top-left':\n case 'to-left-top':\n gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight);\n break;\n }\n }\n }\n\n if (!gradientStyle) return null; // invalid gradient style\n\n var hasPositions = positions.length === colors.length;\n var length = colors.length;\n\n for (var i = 0; i < length; i++) {\n gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')');\n }\n\n return gradientStyle;\n};\n\nCRp$6.gradientFillStyle = function (context, ele, fill, opacity) {\n var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity);\n if (!gradientStyle) return null; // error\n\n context.fillStyle = gradientStyle;\n};\n\nCRp$6.colorFillStyle = function (context, r, g, b, a) {\n context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching\n // var cache = this.paintCache(context);\n // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n // if( cache.fillStyle !== fillStyle ){\n // context.fillStyle = cache.fillStyle = fillStyle;\n // }\n};\n\nCRp$6.eleFillStyle = function (context, ele, opacity) {\n var backgroundFill = ele.pstyle('background-fill').value;\n\n if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') {\n this.gradientFillStyle(context, ele, backgroundFill, opacity);\n } else {\n var backgroundColor = ele.pstyle('background-color').value;\n this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity);\n }\n};\n\nCRp$6.gradientStrokeStyle = function (context, ele, fill, opacity) {\n var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity);\n if (!gradientStyle) return null; // error\n\n context.strokeStyle = gradientStyle;\n};\n\nCRp$6.colorStrokeStyle = function (context, r, g, b, a) {\n context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching\n // var cache = this.paintCache(context);\n // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n // if( cache.strokeStyle !== strokeStyle ){\n // context.strokeStyle = cache.strokeStyle = strokeStyle;\n // }\n};\n\nCRp$6.eleStrokeStyle = function (context, ele, opacity) {\n var lineFill = ele.pstyle('line-fill').value;\n\n if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') {\n this.gradientStrokeStyle(context, ele, lineFill, opacity);\n } else {\n var lineColor = ele.pstyle('line-color').value;\n this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity);\n }\n}; // Resize canvas\n\n\nCRp$6.matchCanvasSize = function (container) {\n var r = this;\n var data = r.data;\n var bb = r.findContainerClientCoords();\n var width = bb[2];\n var height = bb[3];\n var pixelRatio = r.getPixelRatio();\n var mbPxRatio = r.motionBlurPxRatio;\n\n if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) {\n pixelRatio = mbPxRatio;\n }\n\n var canvasWidth = width * pixelRatio;\n var canvasHeight = height * pixelRatio;\n var canvas;\n\n if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) {\n return; // save cycles if same\n }\n\n r.fontCaches = null; // resizing resets the style\n\n var canvasContainer = data.canvasContainer;\n canvasContainer.style.width = width + 'px';\n canvasContainer.style.height = height + 'px';\n\n for (var i = 0; i < r.CANVAS_LAYERS; i++) {\n canvas = data.canvases[i];\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n\n for (var i = 0; i < r.BUFFER_COUNT; i++) {\n canvas = data.bufferCanvases[i];\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n }\n\n r.textureMult = 1;\n\n if (pixelRatio <= 1) {\n canvas = data.bufferCanvases[r.TEXTURE_BUFFER];\n r.textureMult = 2;\n canvas.width = canvasWidth * r.textureMult;\n canvas.height = canvasHeight * r.textureMult;\n }\n\n r.canvasWidth = canvasWidth;\n r.canvasHeight = canvasHeight;\n};\n\nCRp$6.renderTo = function (cxt, zoom, pan, pxRatio) {\n this.render({\n forcedContext: cxt,\n forcedZoom: zoom,\n forcedPan: pan,\n drawAllLayers: true,\n forcedPxRatio: pxRatio\n });\n};\n\nCRp$6.render = function (options) {\n options = options || staticEmptyObject();\n var forcedContext = options.forcedContext;\n var drawAllLayers = options.drawAllLayers;\n var drawOnlyNodeLayer = options.drawOnlyNodeLayer;\n var forcedZoom = options.forcedZoom;\n var forcedPan = options.forcedPan;\n var r = this;\n var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio;\n var cy = r.cy;\n var data = r.data;\n var needDraw = data.canvasNeedsRedraw;\n var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming);\n var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur;\n var mbPxRatio = r.motionBlurPxRatio;\n var hasCompoundNodes = cy.hasCompoundNodes();\n var inNodeDragGesture = r.hoverData.draggingEles;\n var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false;\n motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection;\n var motionBlurFadeEffect = motionBlur;\n\n if (!forcedContext) {\n if (r.prevPxRatio !== pixelRatio) {\n r.invalidateContainerClientCoordsCache();\n r.matchCanvasSize(r.container);\n r.redrawHint('eles', true);\n r.redrawHint('drag', true);\n }\n\n r.prevPxRatio = pixelRatio;\n }\n\n if (!forcedContext && r.motionBlurTimeout) {\n clearTimeout(r.motionBlurTimeout);\n }\n\n if (motionBlur) {\n if (r.mbFrames == null) {\n r.mbFrames = 0;\n }\n\n r.mbFrames++;\n\n if (r.mbFrames < 3) {\n // need several frames before even high quality motionblur\n motionBlurFadeEffect = false;\n } // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing)\n\n\n if (r.mbFrames > r.minMbLowQualFrames) {\n //r.fullQualityMb = false;\n r.motionBlurPxRatio = r.mbPxRBlurry;\n }\n }\n\n if (r.clearingMotionBlur) {\n r.motionBlurPxRatio = 1;\n } // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame\n // because a rogue async texture frame would clear needDraw\n\n\n if (r.textureDrawLastFrame && !textureDraw) {\n needDraw[r.NODE] = true;\n needDraw[r.SELECT_BOX] = true;\n }\n\n var style = cy.style();\n var zoom = cy.zoom();\n var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom;\n var pan = cy.pan();\n var effectivePan = {\n x: pan.x,\n y: pan.y\n };\n var vp = {\n zoom: zoom,\n pan: {\n x: pan.x,\n y: pan.y\n }\n };\n var prevVp = r.prevViewport;\n var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y; // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed)\n\n if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) {\n r.motionBlurPxRatio = 1;\n }\n\n if (forcedPan) {\n effectivePan = forcedPan;\n } // apply pixel ratio\n\n\n effectiveZoom *= pixelRatio;\n effectivePan.x *= pixelRatio;\n effectivePan.y *= pixelRatio;\n var eles = r.getCachedZSortedEles();\n\n function mbclear(context, x, y, w, h) {\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency);\n context.fillRect(x, y, w, h);\n context.globalCompositeOperation = gco;\n }\n\n function setContextTransform(context, clear) {\n var ePan, eZoom, w, h;\n\n if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) {\n ePan = {\n x: pan.x * mbPxRatio,\n y: pan.y * mbPxRatio\n };\n eZoom = zoom * mbPxRatio;\n w = r.canvasWidth * mbPxRatio;\n h = r.canvasHeight * mbPxRatio;\n } else {\n ePan = effectivePan;\n eZoom = effectiveZoom;\n w = r.canvasWidth;\n h = r.canvasHeight;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n if (clear === 'motionBlur') {\n mbclear(context, 0, 0, w, h);\n } else if (!forcedContext && (clear === undefined || clear)) {\n context.clearRect(0, 0, w, h);\n }\n\n if (!drawAllLayers) {\n context.translate(ePan.x, ePan.y);\n context.scale(eZoom, eZoom);\n }\n\n if (forcedPan) {\n context.translate(forcedPan.x, forcedPan.y);\n }\n\n if (forcedZoom) {\n context.scale(forcedZoom, forcedZoom);\n }\n }\n\n if (!textureDraw) {\n r.textureDrawLastFrame = false;\n }\n\n if (textureDraw) {\n r.textureDrawLastFrame = true;\n\n if (!r.textureCache) {\n r.textureCache = {};\n r.textureCache.bb = cy.mutableElements().boundingBox();\n r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER];\n var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER];\n cxt.setTransform(1, 0, 0, 1, 0, 0);\n cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult);\n r.render({\n forcedContext: cxt,\n drawOnlyNodeLayer: true,\n forcedPxRatio: pixelRatio * r.textureMult\n });\n var vp = r.textureCache.viewport = {\n zoom: cy.zoom(),\n pan: cy.pan(),\n width: r.canvasWidth,\n height: r.canvasHeight\n };\n vp.mpan = {\n x: (0 - vp.pan.x) / vp.zoom,\n y: (0 - vp.pan.y) / vp.zoom\n };\n }\n\n needDraw[r.DRAG] = false;\n needDraw[r.NODE] = false;\n var context = data.contexts[r.NODE];\n var texture = r.textureCache.texture;\n var vp = r.textureCache.viewport;\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n if (motionBlur) {\n mbclear(context, 0, 0, vp.width, vp.height);\n } else {\n context.clearRect(0, 0, vp.width, vp.height);\n }\n\n var outsideBgColor = style.core('outside-texture-bg-color').value;\n var outsideBgOpacity = style.core('outside-texture-bg-opacity').value;\n r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity);\n context.fillRect(0, 0, vp.width, vp.height);\n var zoom = cy.zoom();\n setContextTransform(context, false);\n context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio);\n context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio);\n } else if (r.textureOnViewport && !forcedContext) {\n // clear the cache since we don't need it\n r.textureCache = null;\n }\n\n var extent = cy.extent();\n var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated();\n var hideEdges = r.hideEdgesOnViewport && vpManip;\n var needMbClear = [];\n needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur;\n\n if (needMbClear[r.NODE]) {\n r.clearedForMotionBlur[r.NODE] = true;\n }\n\n needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur;\n\n if (needMbClear[r.DRAG]) {\n r.clearedForMotionBlur[r.DRAG] = true;\n }\n\n if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) {\n var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1;\n var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]);\n var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined;\n setContextTransform(context, clear);\n\n if (hideEdges) {\n r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent);\n } else {\n r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent);\n }\n\n if (r.debug) {\n r.drawDebugPoints(context, eles.nondrag);\n }\n\n if (!drawAllLayers && !motionBlur) {\n needDraw[r.NODE] = false;\n }\n }\n\n if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) {\n var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1;\n var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]);\n setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined);\n\n if (hideEdges) {\n r.drawCachedNodes(context, eles.drag, pixelRatio, extent);\n } else {\n r.drawCachedElements(context, eles.drag, pixelRatio, extent);\n }\n\n if (r.debug) {\n r.drawDebugPoints(context, eles.drag);\n }\n\n if (!drawAllLayers && !motionBlur) {\n needDraw[r.DRAG] = false;\n }\n }\n\n if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) {\n var context = forcedContext || data.contexts[r.SELECT_BOX];\n setContextTransform(context);\n\n if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) {\n var zoom = r.cy.zoom();\n var borderWidth = style.core('selection-box-border-width').value / zoom;\n context.lineWidth = borderWidth;\n context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')';\n context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]);\n\n if (borderWidth > 0) {\n context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')';\n context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]);\n }\n }\n\n if (data.bgActivePosistion && !r.hoverData.selecting) {\n var zoom = r.cy.zoom();\n var pos = data.bgActivePosistion;\n context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')';\n context.beginPath();\n context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI);\n context.fill();\n }\n\n var timeToRender = r.lastRedrawTime;\n\n if (r.showFps && timeToRender) {\n timeToRender = Math.round(timeToRender);\n var fps = Math.round(1000 / timeToRender);\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.fillStyle = 'rgba(255, 0, 0, 0.75)';\n context.strokeStyle = 'rgba(255, 0, 0, 0.75)';\n context.lineWidth = 1;\n context.fillText('1 frame = ' + timeToRender + ' ms = ' + fps + ' fps', 0, 20);\n var maxFps = 60;\n context.strokeRect(0, 30, 250, 20);\n context.fillRect(0, 30, 250 * Math.min(fps / maxFps, 1), 20);\n }\n\n if (!drawAllLayers) {\n needDraw[r.SELECT_BOX] = false;\n }\n } // motionblur: blit rendered blurry frames\n\n\n if (motionBlur && mbPxRatio !== 1) {\n var cxtNode = data.contexts[r.NODE];\n var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE];\n var cxtDrag = data.contexts[r.DRAG];\n var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG];\n\n var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) {\n cxt.setTransform(1, 0, 0, 1, 0, 0);\n\n if (needClear || !motionBlurFadeEffect) {\n cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight);\n } else {\n mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight);\n }\n\n var pxr = mbPxRatio;\n cxt.drawImage(txt, // img\n 0, 0, // sx, sy\n r.canvasWidth * pxr, r.canvasHeight * pxr, // sw, sh\n 0, 0, // x, y\n r.canvasWidth, r.canvasHeight // w, h\n );\n };\n\n if (needDraw[r.NODE] || needMbClear[r.NODE]) {\n drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]);\n needDraw[r.NODE] = false;\n }\n\n if (needDraw[r.DRAG] || needMbClear[r.DRAG]) {\n drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]);\n needDraw[r.DRAG] = false;\n }\n }\n\n r.prevViewport = vp;\n\n if (r.clearingMotionBlur) {\n r.clearingMotionBlur = false;\n r.motionBlurCleared = true;\n r.motionBlur = true;\n }\n\n if (motionBlur) {\n r.motionBlurTimeout = setTimeout(function () {\n r.motionBlurTimeout = null;\n r.clearedForMotionBlur[r.NODE] = false;\n r.clearedForMotionBlur[r.DRAG] = false;\n r.motionBlur = false;\n r.clearingMotionBlur = !textureDraw;\n r.mbFrames = 0;\n needDraw[r.NODE] = true;\n needDraw[r.DRAG] = true;\n r.redraw();\n }, motionBlurDelay);\n }\n\n if (!forcedContext) {\n cy.emit('render');\n }\n};\n\nvar CRp$7 = {}; // @O Polygon drawing\n\nCRp$7.drawPolygonPath = function (context, x, y, width, height, points) {\n var halfW = width / 2;\n var halfH = height / 2;\n\n if (context.beginPath) {\n context.beginPath();\n }\n\n context.moveTo(x + halfW * points[0], y + halfH * points[1]);\n\n for (var i = 1; i < points.length / 2; i++) {\n context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]);\n }\n\n context.closePath();\n};\n\nCRp$7.drawRoundPolygonPath = function (context, x, y, width, height, points) {\n var halfW = width / 2;\n var halfH = height / 2;\n var cornerRadius = getRoundPolygonRadius(width, height);\n\n if (context.beginPath) {\n context.beginPath();\n }\n\n for (var _i = 0; _i < points.length / 4; _i++) {\n var sourceUv = void 0,\n destUv = void 0;\n\n if (_i === 0) {\n sourceUv = points.length - 2;\n } else {\n sourceUv = _i * 4 - 2;\n }\n\n destUv = _i * 4 + 2;\n var px = x + halfW * points[_i * 4];\n var py = y + halfH * points[_i * 4 + 1];\n var cosTheta = -points[sourceUv] * points[destUv] - points[sourceUv + 1] * points[destUv + 1];\n var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2);\n var cp0x = px - offset * points[sourceUv];\n var cp0y = py - offset * points[sourceUv + 1];\n var cp1x = px + offset * points[destUv];\n var cp1y = py + offset * points[destUv + 1];\n\n if (_i === 0) {\n context.moveTo(cp0x, cp0y);\n } else {\n context.lineTo(cp0x, cp0y);\n }\n\n context.arcTo(px, py, cp1x, cp1y, cornerRadius);\n }\n\n context.closePath();\n}; // Round rectangle drawing\n\n\nCRp$7.drawRoundRectanglePath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = getRoundRectangleRadius(width, height);\n\n if (context.beginPath) {\n context.beginPath();\n } // Start at top middle\n\n\n context.moveTo(x, y - halfHeight); // Arc from middle top to right side\n\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius); // Arc from right side to bottom\n\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); // Arc from bottom to left side\n\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); // Arc from left side to topBorder\n\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius); // Join line\n\n context.lineTo(x, y - halfHeight);\n context.closePath();\n};\n\nCRp$7.drawBottomRoundRectanglePath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = getRoundRectangleRadius(width, height);\n\n if (context.beginPath) {\n context.beginPath();\n } // Start at top middle\n\n\n context.moveTo(x, y - halfHeight);\n context.lineTo(x + halfWidth, y - halfHeight);\n context.lineTo(x + halfWidth, y);\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n context.lineTo(x - halfWidth, y - halfHeight);\n context.lineTo(x, y - halfHeight);\n context.closePath();\n};\n\nCRp$7.drawCutRectanglePath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerLength = getCutRectangleCornerLength();\n\n if (context.beginPath) {\n context.beginPath();\n }\n\n context.moveTo(x - halfWidth + cornerLength, y - halfHeight);\n context.lineTo(x + halfWidth - cornerLength, y - halfHeight);\n context.lineTo(x + halfWidth, y - halfHeight + cornerLength);\n context.lineTo(x + halfWidth, y + halfHeight - cornerLength);\n context.lineTo(x + halfWidth - cornerLength, y + halfHeight);\n context.lineTo(x - halfWidth + cornerLength, y + halfHeight);\n context.lineTo(x - halfWidth, y + halfHeight - cornerLength);\n context.lineTo(x - halfWidth, y - halfHeight + cornerLength);\n context.closePath();\n};\n\nCRp$7.drawBarrelPath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var xBegin = x - halfWidth;\n var xEnd = x + halfWidth;\n var yBegin = y - halfHeight;\n var yEnd = y + halfHeight;\n var barrelCurveConstants = getBarrelCurveConstants(width, height);\n var wOffset = barrelCurveConstants.widthOffset;\n var hOffset = barrelCurveConstants.heightOffset;\n var ctrlPtXOffset = barrelCurveConstants.ctrlPtOffsetPct * wOffset;\n\n if (context.beginPath) {\n context.beginPath();\n }\n\n context.moveTo(xBegin, yBegin + hOffset);\n context.lineTo(xBegin, yEnd - hOffset);\n context.quadraticCurveTo(xBegin + ctrlPtXOffset, yEnd, xBegin + wOffset, yEnd);\n context.lineTo(xEnd - wOffset, yEnd);\n context.quadraticCurveTo(xEnd - ctrlPtXOffset, yEnd, xEnd, yEnd - hOffset);\n context.lineTo(xEnd, yBegin + hOffset);\n context.quadraticCurveTo(xEnd - ctrlPtXOffset, yBegin, xEnd - wOffset, yBegin);\n context.lineTo(xBegin + wOffset, yBegin);\n context.quadraticCurveTo(xBegin + ctrlPtXOffset, yBegin, xBegin, yBegin + hOffset);\n context.closePath();\n};\n\nvar sin0 = Math.sin(0);\nvar cos0 = Math.cos(0);\nvar sin = {};\nvar cos = {};\nvar ellipseStepSize = Math.PI / 40;\n\nfor (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) {\n sin[i] = Math.sin(i);\n cos[i] = Math.cos(i);\n}\n\nCRp$7.drawEllipsePath = function (context, centerX, centerY, width, height) {\n if (context.beginPath) {\n context.beginPath();\n }\n\n if (context.ellipse) {\n context.ellipse(centerX, centerY, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n var xPos, yPos;\n var rw = width / 2;\n var rh = height / 2;\n\n for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) {\n xPos = centerX - rw * sin[i] * sin0 + rw * cos[i] * cos0;\n yPos = centerY + rh * cos[i] * sin0 + rh * sin[i] * cos0;\n\n if (i === 0) {\n context.moveTo(xPos, yPos);\n } else {\n context.lineTo(xPos, yPos);\n }\n }\n }\n\n context.closePath();\n};\n\n/* global atob, ArrayBuffer, Uint8Array, Blob */\nvar CRp$8 = {};\n\nCRp$8.createBuffer = function (w, h) {\n var buffer = document.createElement('canvas'); // eslint-disable-line no-undef\n\n buffer.width = w;\n buffer.height = h;\n return [buffer, buffer.getContext('2d')];\n};\n\nCRp$8.bufferCanvasImage = function (options) {\n var cy = this.cy;\n var eles = cy.mutableElements();\n var bb = eles.boundingBox();\n var ctrRect = this.findContainerClientCoords();\n var width = options.full ? Math.ceil(bb.w) : ctrRect[2];\n var height = options.full ? Math.ceil(bb.h) : ctrRect[3];\n var specdMaxDims = number(options.maxWidth) || number(options.maxHeight);\n var pxRatio = this.getPixelRatio();\n var scale = 1;\n\n if (options.scale !== undefined) {\n width *= options.scale;\n height *= options.scale;\n scale = options.scale;\n } else if (specdMaxDims) {\n var maxScaleW = Infinity;\n var maxScaleH = Infinity;\n\n if (number(options.maxWidth)) {\n maxScaleW = scale * options.maxWidth / width;\n }\n\n if (number(options.maxHeight)) {\n maxScaleH = scale * options.maxHeight / height;\n }\n\n scale = Math.min(maxScaleW, maxScaleH);\n width *= scale;\n height *= scale;\n }\n\n if (!specdMaxDims) {\n width *= pxRatio;\n height *= pxRatio;\n scale *= pxRatio;\n }\n\n var buffCanvas = document.createElement('canvas'); // eslint-disable-line no-undef\n\n buffCanvas.width = width;\n buffCanvas.height = height;\n buffCanvas.style.width = width + 'px';\n buffCanvas.style.height = height + 'px';\n var buffCxt = buffCanvas.getContext('2d'); // Rasterize the layers, but only if container has nonzero size\n\n if (width > 0 && height > 0) {\n buffCxt.clearRect(0, 0, width, height);\n buffCxt.globalCompositeOperation = 'source-over';\n var zsortedEles = this.getCachedZSortedEles();\n\n if (options.full) {\n // draw the full bounds of the graph\n buffCxt.translate(-bb.x1 * scale, -bb.y1 * scale);\n buffCxt.scale(scale, scale);\n this.drawElements(buffCxt, zsortedEles);\n buffCxt.scale(1 / scale, 1 / scale);\n buffCxt.translate(bb.x1 * scale, bb.y1 * scale);\n } else {\n // draw the current view\n var pan = cy.pan();\n var translation = {\n x: pan.x * scale,\n y: pan.y * scale\n };\n scale *= cy.zoom();\n buffCxt.translate(translation.x, translation.y);\n buffCxt.scale(scale, scale);\n this.drawElements(buffCxt, zsortedEles);\n buffCxt.scale(1 / scale, 1 / scale);\n buffCxt.translate(-translation.x, -translation.y);\n } // need to fill bg at end like this in order to fill cleared transparent pixels in jpgs\n\n\n if (options.bg) {\n buffCxt.globalCompositeOperation = 'destination-over';\n buffCxt.fillStyle = options.bg;\n buffCxt.rect(0, 0, width, height);\n buffCxt.fill();\n }\n }\n\n return buffCanvas;\n};\n\nfunction b64ToBlob(b64, mimeType) {\n var bytes = atob(b64);\n var buff = new ArrayBuffer(bytes.length);\n var buffUint8 = new Uint8Array(buff);\n\n for (var i = 0; i < bytes.length; i++) {\n buffUint8[i] = bytes.charCodeAt(i);\n }\n\n return new Blob([buff], {\n type: mimeType\n });\n}\n\nfunction b64UriToB64(b64uri) {\n var i = b64uri.indexOf(',');\n return b64uri.substr(i + 1);\n}\n\nfunction output(options, canvas, mimeType) {\n var getB64Uri = function getB64Uri() {\n return canvas.toDataURL(mimeType, options.quality);\n };\n\n switch (options.output) {\n case 'blob-promise':\n return new Promise$1(function (resolve, reject) {\n try {\n canvas.toBlob(function (blob) {\n if (blob != null) {\n resolve(blob);\n } else {\n reject(new Error('`canvas.toBlob()` sent a null value in its callback'));\n }\n }, mimeType, options.quality);\n } catch (err) {\n reject(err);\n }\n });\n\n case 'blob':\n return b64ToBlob(b64UriToB64(getB64Uri()), mimeType);\n\n case 'base64':\n return b64UriToB64(getB64Uri());\n\n case 'base64uri':\n default:\n return getB64Uri();\n }\n}\n\nCRp$8.png = function (options) {\n return output(options, this.bufferCanvasImage(options), 'image/png');\n};\n\nCRp$8.jpg = function (options) {\n return output(options, this.bufferCanvasImage(options), 'image/jpeg');\n};\n\nvar CRp$9 = {};\n\nCRp$9.nodeShapeImpl = function (name, context, centerX, centerY, width, height, points) {\n switch (name) {\n case 'ellipse':\n return this.drawEllipsePath(context, centerX, centerY, width, height);\n\n case 'polygon':\n return this.drawPolygonPath(context, centerX, centerY, width, height, points);\n\n case 'round-polygon':\n return this.drawRoundPolygonPath(context, centerX, centerY, width, height, points);\n\n case 'roundrectangle':\n case 'round-rectangle':\n return this.drawRoundRectanglePath(context, centerX, centerY, width, height);\n\n case 'cutrectangle':\n case 'cut-rectangle':\n return this.drawCutRectanglePath(context, centerX, centerY, width, height);\n\n case 'bottomroundrectangle':\n case 'bottom-round-rectangle':\n return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height);\n\n case 'barrel':\n return this.drawBarrelPath(context, centerX, centerY, width, height);\n }\n};\n\nvar CR = CanvasRenderer;\nvar CRp$a = CanvasRenderer.prototype;\nCRp$a.CANVAS_LAYERS = 3; //\n\nCRp$a.SELECT_BOX = 0;\nCRp$a.DRAG = 1;\nCRp$a.NODE = 2;\nCRp$a.BUFFER_COUNT = 3; //\n\nCRp$a.TEXTURE_BUFFER = 0;\nCRp$a.MOTIONBLUR_BUFFER_NODE = 1;\nCRp$a.MOTIONBLUR_BUFFER_DRAG = 2;\n\nfunction CanvasRenderer(options) {\n var r = this;\n r.data = {\n canvases: new Array(CRp$a.CANVAS_LAYERS),\n contexts: new Array(CRp$a.CANVAS_LAYERS),\n canvasNeedsRedraw: new Array(CRp$a.CANVAS_LAYERS),\n bufferCanvases: new Array(CRp$a.BUFFER_COUNT),\n bufferContexts: new Array(CRp$a.CANVAS_LAYERS)\n };\n var tapHlOffAttr = '-webkit-tap-highlight-color';\n var tapHlOffStyle = 'rgba(0,0,0,0)';\n r.data.canvasContainer = document.createElement('div'); // eslint-disable-line no-undef\n\n var containerStyle = r.data.canvasContainer.style;\n r.data.canvasContainer.style[tapHlOffAttr] = tapHlOffStyle;\n containerStyle.position = 'relative';\n containerStyle.zIndex = '0';\n containerStyle.overflow = 'hidden';\n var container = options.cy.container();\n container.appendChild(r.data.canvasContainer);\n container.style[tapHlOffAttr] = tapHlOffStyle;\n var styleMap = {\n '-webkit-user-select': 'none',\n '-moz-user-select': '-moz-none',\n 'user-select': 'none',\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)',\n 'outline-style': 'none'\n };\n\n if (ms()) {\n styleMap['-ms-touch-action'] = 'none';\n styleMap['touch-action'] = 'none';\n }\n\n for (var i = 0; i < CRp$a.CANVAS_LAYERS; i++) {\n var canvas = r.data.canvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef\n\n r.data.contexts[i] = canvas.getContext('2d');\n Object.keys(styleMap).forEach(function (k) {\n canvas.style[k] = styleMap[k];\n });\n canvas.style.position = 'absolute';\n canvas.setAttribute('data-id', 'layer' + i);\n canvas.style.zIndex = String(CRp$a.CANVAS_LAYERS - i);\n r.data.canvasContainer.appendChild(canvas);\n r.data.canvasNeedsRedraw[i] = false;\n }\n\n r.data.topCanvas = r.data.canvases[0];\n r.data.canvases[CRp$a.NODE].setAttribute('data-id', 'layer' + CRp$a.NODE + '-node');\n r.data.canvases[CRp$a.SELECT_BOX].setAttribute('data-id', 'layer' + CRp$a.SELECT_BOX + '-selectbox');\n r.data.canvases[CRp$a.DRAG].setAttribute('data-id', 'layer' + CRp$a.DRAG + '-drag');\n\n for (var i = 0; i < CRp$a.BUFFER_COUNT; i++) {\n r.data.bufferCanvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef\n\n r.data.bufferContexts[i] = r.data.bufferCanvases[i].getContext('2d');\n r.data.bufferCanvases[i].style.position = 'absolute';\n r.data.bufferCanvases[i].setAttribute('data-id', 'buffer' + i);\n r.data.bufferCanvases[i].style.zIndex = String(-i - 1);\n r.data.bufferCanvases[i].style.visibility = 'hidden'; //r.data.canvasContainer.appendChild(r.data.bufferCanvases[i]);\n }\n\n r.pathsEnabled = true;\n var emptyBb = makeBoundingBox();\n\n var getBoxCenter = function getBoxCenter(bb) {\n return {\n x: (bb.x1 + bb.x2) / 2,\n y: (bb.y1 + bb.y2) / 2\n };\n };\n\n var getCenterOffset = function getCenterOffset(bb) {\n return {\n x: -bb.w / 2,\n y: -bb.h / 2\n };\n };\n\n var backgroundTimestampHasChanged = function backgroundTimestampHasChanged(ele) {\n var _p = ele[0]._private;\n var same = _p.oldBackgroundTimestamp === _p.backgroundTimestamp;\n return !same;\n };\n\n var getStyleKey = function getStyleKey(ele) {\n return ele[0]._private.nodeKey;\n };\n\n var getLabelKey = function getLabelKey(ele) {\n return ele[0]._private.labelStyleKey;\n };\n\n var getSourceLabelKey = function getSourceLabelKey(ele) {\n return ele[0]._private.sourceLabelStyleKey;\n };\n\n var getTargetLabelKey = function getTargetLabelKey(ele) {\n return ele[0]._private.targetLabelStyleKey;\n };\n\n var drawElement = function drawElement(context, ele, bb, scaledLabelShown, useEleOpacity) {\n return r.drawElement(context, ele, bb, false, false, useEleOpacity);\n };\n\n var drawLabel = function drawLabel(context, ele, bb, scaledLabelShown, useEleOpacity) {\n return r.drawElementText(context, ele, bb, scaledLabelShown, 'main', useEleOpacity);\n };\n\n var drawSourceLabel = function drawSourceLabel(context, ele, bb, scaledLabelShown, useEleOpacity) {\n return r.drawElementText(context, ele, bb, scaledLabelShown, 'source', useEleOpacity);\n };\n\n var drawTargetLabel = function drawTargetLabel(context, ele, bb, scaledLabelShown, useEleOpacity) {\n return r.drawElementText(context, ele, bb, scaledLabelShown, 'target', useEleOpacity);\n };\n\n var getElementBox = function getElementBox(ele) {\n ele.boundingBox();\n return ele[0]._private.bodyBounds;\n };\n\n var getLabelBox = function getLabelBox(ele) {\n ele.boundingBox();\n return ele[0]._private.labelBounds.main || emptyBb;\n };\n\n var getSourceLabelBox = function getSourceLabelBox(ele) {\n ele.boundingBox();\n return ele[0]._private.labelBounds.source || emptyBb;\n };\n\n var getTargetLabelBox = function getTargetLabelBox(ele) {\n ele.boundingBox();\n return ele[0]._private.labelBounds.target || emptyBb;\n };\n\n var isLabelVisibleAtScale = function isLabelVisibleAtScale(ele, scaledLabelShown) {\n return scaledLabelShown;\n };\n\n var getElementRotationPoint = function getElementRotationPoint(ele) {\n return getBoxCenter(getElementBox(ele));\n };\n\n var addTextMargin = function addTextMargin(prefix, pt, ele) {\n var pre = prefix ? prefix + '-' : '';\n return {\n x: pt.x + ele.pstyle(pre + 'text-margin-x').pfValue,\n y: pt.y + ele.pstyle(pre + 'text-margin-y').pfValue\n };\n };\n\n var getRsPt = function getRsPt(ele, x, y) {\n var rs = ele[0]._private.rscratch;\n return {\n x: rs[x],\n y: rs[y]\n };\n };\n\n var getLabelRotationPoint = function getLabelRotationPoint(ele) {\n return addTextMargin('', getRsPt(ele, 'labelX', 'labelY'), ele);\n };\n\n var getSourceLabelRotationPoint = function getSourceLabelRotationPoint(ele) {\n return addTextMargin('source', getRsPt(ele, 'sourceLabelX', 'sourceLabelY'), ele);\n };\n\n var getTargetLabelRotationPoint = function getTargetLabelRotationPoint(ele) {\n return addTextMargin('target', getRsPt(ele, 'targetLabelX', 'targetLabelY'), ele);\n };\n\n var getElementRotationOffset = function getElementRotationOffset(ele) {\n return getCenterOffset(getElementBox(ele));\n };\n\n var getSourceLabelRotationOffset = function getSourceLabelRotationOffset(ele) {\n return getCenterOffset(getSourceLabelBox(ele));\n };\n\n var getTargetLabelRotationOffset = function getTargetLabelRotationOffset(ele) {\n return getCenterOffset(getTargetLabelBox(ele));\n };\n\n var getLabelRotationOffset = function getLabelRotationOffset(ele) {\n var bb = getLabelBox(ele);\n var p = getCenterOffset(getLabelBox(ele));\n\n if (ele.isNode()) {\n switch (ele.pstyle('text-halign').value) {\n case 'left':\n p.x = -bb.w;\n break;\n\n case 'right':\n p.x = 0;\n break;\n }\n\n switch (ele.pstyle('text-valign').value) {\n case 'top':\n p.y = -bb.h;\n break;\n\n case 'bottom':\n p.y = 0;\n break;\n }\n }\n\n return p;\n };\n\n var eleTxrCache = r.data.eleTxrCache = new ElementTextureCache(r, {\n getKey: getStyleKey,\n doesEleInvalidateKey: backgroundTimestampHasChanged,\n drawElement: drawElement,\n getBoundingBox: getElementBox,\n getRotationPoint: getElementRotationPoint,\n getRotationOffset: getElementRotationOffset,\n allowEdgeTxrCaching: false,\n allowParentTxrCaching: false\n });\n var lblTxrCache = r.data.lblTxrCache = new ElementTextureCache(r, {\n getKey: getLabelKey,\n drawElement: drawLabel,\n getBoundingBox: getLabelBox,\n getRotationPoint: getLabelRotationPoint,\n getRotationOffset: getLabelRotationOffset,\n isVisible: isLabelVisibleAtScale\n });\n var slbTxrCache = r.data.slbTxrCache = new ElementTextureCache(r, {\n getKey: getSourceLabelKey,\n drawElement: drawSourceLabel,\n getBoundingBox: getSourceLabelBox,\n getRotationPoint: getSourceLabelRotationPoint,\n getRotationOffset: getSourceLabelRotationOffset,\n isVisible: isLabelVisibleAtScale\n });\n var tlbTxrCache = r.data.tlbTxrCache = new ElementTextureCache(r, {\n getKey: getTargetLabelKey,\n drawElement: drawTargetLabel,\n getBoundingBox: getTargetLabelBox,\n getRotationPoint: getTargetLabelRotationPoint,\n getRotationOffset: getTargetLabelRotationOffset,\n isVisible: isLabelVisibleAtScale\n });\n var lyrTxrCache = r.data.lyrTxrCache = new LayeredTextureCache(r);\n r.onUpdateEleCalcs(function invalidateTextureCaches(willDraw, eles) {\n // each cache should check for sub-key diff to see that the update affects that cache particularly\n eleTxrCache.invalidateElements(eles);\n lblTxrCache.invalidateElements(eles);\n slbTxrCache.invalidateElements(eles);\n tlbTxrCache.invalidateElements(eles); // any change invalidates the layers\n\n lyrTxrCache.invalidateElements(eles); // update the old bg timestamp so diffs can be done in the ele txr caches\n\n for (var _i = 0; _i < eles.length; _i++) {\n var _p = eles[_i]._private;\n _p.oldBackgroundTimestamp = _p.backgroundTimestamp;\n }\n });\n\n var refineInLayers = function refineInLayers(reqs) {\n for (var i = 0; i < reqs.length; i++) {\n lyrTxrCache.enqueueElementRefinement(reqs[i].ele);\n }\n };\n\n eleTxrCache.onDequeue(refineInLayers);\n lblTxrCache.onDequeue(refineInLayers);\n slbTxrCache.onDequeue(refineInLayers);\n tlbTxrCache.onDequeue(refineInLayers);\n}\n\nCRp$a.redrawHint = function (group, bool) {\n var r = this;\n\n switch (group) {\n case 'eles':\n r.data.canvasNeedsRedraw[CRp$a.NODE] = bool;\n break;\n\n case 'drag':\n r.data.canvasNeedsRedraw[CRp$a.DRAG] = bool;\n break;\n\n case 'select':\n r.data.canvasNeedsRedraw[CRp$a.SELECT_BOX] = bool;\n break;\n }\n}; // whether to use Path2D caching for drawing\n\n\nvar pathsImpld = typeof Path2D !== 'undefined';\n\nCRp$a.path2dEnabled = function (on) {\n if (on === undefined) {\n return this.pathsEnabled;\n }\n\n this.pathsEnabled = on ? true : false;\n};\n\nCRp$a.usePaths = function () {\n return pathsImpld && this.pathsEnabled;\n};\n\nCRp$a.setImgSmoothing = function (context, bool) {\n if (context.imageSmoothingEnabled != null) {\n context.imageSmoothingEnabled = bool;\n } else {\n context.webkitImageSmoothingEnabled = bool;\n context.mozImageSmoothingEnabled = bool;\n context.msImageSmoothingEnabled = bool;\n }\n};\n\nCRp$a.getImgSmoothing = function (context) {\n if (context.imageSmoothingEnabled != null) {\n return context.imageSmoothingEnabled;\n } else {\n return context.webkitImageSmoothingEnabled || context.mozImageSmoothingEnabled || context.msImageSmoothingEnabled;\n }\n};\n\nCRp$a.makeOffscreenCanvas = function (width, height) {\n var canvas;\n\n if ((typeof OffscreenCanvas === \"undefined\" ? \"undefined\" : _typeof(OffscreenCanvas)) !== ( \"undefined\" )) {\n canvas = new OffscreenCanvas(width, height);\n } else {\n canvas = document.createElement('canvas'); // eslint-disable-line no-undef\n\n canvas.width = width;\n canvas.height = height;\n }\n\n return canvas;\n};\n\n[CRp, CRp$1, CRp$2, CRp$3, CRp$4, CRp$5, CRp$6, CRp$7, CRp$8, CRp$9].forEach(function (props) {\n extend(CRp$a, props);\n});\n\nvar renderer = [{\n name: 'null',\n impl: NullRenderer\n}, {\n name: 'base',\n impl: BR\n}, {\n name: 'canvas',\n impl: CR\n}];\n\nvar incExts = [{\n type: 'layout',\n extensions: layout\n}, {\n type: 'renderer',\n extensions: renderer\n}];\n\nvar extensions = {}; // registered modules for extensions, indexed by name\n\nvar modules = {};\n\nfunction setExtension(type, name, registrant) {\n var ext = registrant;\n\n var overrideErr = function overrideErr(field) {\n error('Can not register `' + name + '` for `' + type + '` since `' + field + '` already exists in the prototype and can not be overridden');\n };\n\n if (type === 'core') {\n if (Core.prototype[name]) {\n return overrideErr(name);\n } else {\n Core.prototype[name] = registrant;\n }\n } else if (type === 'collection') {\n if (Collection.prototype[name]) {\n return overrideErr(name);\n } else {\n Collection.prototype[name] = registrant;\n }\n } else if (type === 'layout') {\n // fill in missing layout functions in the prototype\n var Layout = function Layout(options) {\n this.options = options;\n registrant.call(this, options); // make sure layout has _private for use w/ std apis like .on()\n\n if (!plainObject(this._private)) {\n this._private = {};\n }\n\n this._private.cy = options.cy;\n this._private.listeners = [];\n this.createEmitter();\n };\n\n var layoutProto = Layout.prototype = Object.create(registrant.prototype);\n var optLayoutFns = [];\n\n for (var i = 0; i < optLayoutFns.length; i++) {\n var fnName = optLayoutFns[i];\n\n layoutProto[fnName] = layoutProto[fnName] || function () {\n return this;\n };\n } // either .start() or .run() is defined, so autogen the other\n\n\n if (layoutProto.start && !layoutProto.run) {\n layoutProto.run = function () {\n this.start();\n return this;\n };\n } else if (!layoutProto.start && layoutProto.run) {\n layoutProto.start = function () {\n this.run();\n return this;\n };\n }\n\n var regStop = registrant.prototype.stop;\n\n layoutProto.stop = function () {\n var opts = this.options;\n\n if (opts && opts.animate) {\n var anis = this.animations;\n\n if (anis) {\n for (var _i = 0; _i < anis.length; _i++) {\n anis[_i].stop();\n }\n }\n }\n\n if (regStop) {\n regStop.call(this);\n } else {\n this.emit('layoutstop');\n }\n\n return this;\n };\n\n if (!layoutProto.destroy) {\n layoutProto.destroy = function () {\n return this;\n };\n }\n\n layoutProto.cy = function () {\n return this._private.cy;\n };\n\n var getCy = function getCy(layout) {\n return layout._private.cy;\n };\n\n var emitterOpts = {\n addEventFields: function addEventFields(layout, evt) {\n evt.layout = layout;\n evt.cy = getCy(layout);\n evt.target = layout;\n },\n bubble: function bubble() {\n return true;\n },\n parent: function parent(layout) {\n return getCy(layout);\n }\n };\n extend(layoutProto, {\n createEmitter: function createEmitter() {\n this._private.emitter = new Emitter(emitterOpts, this);\n return this;\n },\n emitter: function emitter() {\n return this._private.emitter;\n },\n on: function on(evt, cb) {\n this.emitter().on(evt, cb);\n return this;\n },\n one: function one(evt, cb) {\n this.emitter().one(evt, cb);\n return this;\n },\n once: function once(evt, cb) {\n this.emitter().one(evt, cb);\n return this;\n },\n removeListener: function removeListener(evt, cb) {\n this.emitter().removeListener(evt, cb);\n return this;\n },\n removeAllListeners: function removeAllListeners() {\n this.emitter().removeAllListeners();\n return this;\n },\n emit: function emit(evt, params) {\n this.emitter().emit(evt, params);\n return this;\n }\n });\n define$3.eventAliasesOn(layoutProto);\n ext = Layout; // replace with our wrapped layout\n } else if (type === 'renderer' && name !== 'null' && name !== 'base') {\n // user registered renderers inherit from base\n var BaseRenderer = getExtension('renderer', 'base');\n var bProto = BaseRenderer.prototype;\n var RegistrantRenderer = registrant;\n var rProto = registrant.prototype;\n\n var Renderer = function Renderer() {\n BaseRenderer.apply(this, arguments);\n RegistrantRenderer.apply(this, arguments);\n };\n\n var proto = Renderer.prototype;\n\n for (var pName in bProto) {\n var pVal = bProto[pName];\n var existsInR = rProto[pName] != null;\n\n if (existsInR) {\n return overrideErr(pName);\n }\n\n proto[pName] = pVal; // take impl from base\n }\n\n for (var _pName in rProto) {\n proto[_pName] = rProto[_pName]; // take impl from registrant\n }\n\n bProto.clientFunctions.forEach(function (name) {\n proto[name] = proto[name] || function () {\n error('Renderer does not implement `renderer.' + name + '()` on its prototype');\n };\n });\n ext = Renderer;\n }\n\n return setMap({\n map: extensions,\n keys: [type, name],\n value: ext\n });\n}\n\nfunction getExtension(type, name) {\n return getMap({\n map: extensions,\n keys: [type, name]\n });\n}\n\nfunction setModule(type, name, moduleType, moduleName, registrant) {\n return setMap({\n map: modules,\n keys: [type, name, moduleType, moduleName],\n value: registrant\n });\n}\n\nfunction getModule(type, name, moduleType, moduleName) {\n return getMap({\n map: modules,\n keys: [type, name, moduleType, moduleName]\n });\n}\n\nvar extension = function extension() {\n // e.g. extension('renderer', 'svg')\n if (arguments.length === 2) {\n return getExtension.apply(null, arguments);\n } // e.g. extension('renderer', 'svg', { ... })\n else if (arguments.length === 3) {\n return setExtension.apply(null, arguments);\n } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse')\n else if (arguments.length === 4) {\n return getModule.apply(null, arguments);\n } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse', { ... })\n else if (arguments.length === 5) {\n return setModule.apply(null, arguments);\n } else {\n error('Invalid extension access syntax');\n }\n}; // allows a core instance to access extensions internally\n\n\nCore.prototype.extension = extension; // included extensions\n\nincExts.forEach(function (group) {\n group.extensions.forEach(function (ext) {\n setExtension(group.type, ext.name, ext.impl);\n });\n});\n\n// (useful for init)\n\nvar Stylesheet = function Stylesheet() {\n if (!(this instanceof Stylesheet)) {\n return new Stylesheet();\n }\n\n this.length = 0;\n};\n\nvar sheetfn = Stylesheet.prototype;\n\nsheetfn.instanceString = function () {\n return 'stylesheet';\n}; // just store the selector to be parsed later\n\n\nsheetfn.selector = function (selector) {\n var i = this.length++;\n this[i] = {\n selector: selector,\n properties: []\n };\n return this; // chaining\n}; // just store the property to be parsed later\n\n\nsheetfn.css = function (name, value) {\n var i = this.length - 1;\n\n if (string(name)) {\n this[i].properties.push({\n name: name,\n value: value\n });\n } else if (plainObject(name)) {\n var map = name;\n var propNames = Object.keys(map);\n\n for (var j = 0; j < propNames.length; j++) {\n var key = propNames[j];\n var mapVal = map[key];\n\n if (mapVal == null) {\n continue;\n }\n\n var prop = Style.properties[key] || Style.properties[dash2camel(key)];\n\n if (prop == null) {\n continue;\n }\n\n var _name = prop.name;\n var _value = mapVal;\n this[i].properties.push({\n name: _name,\n value: _value\n });\n }\n }\n\n return this; // chaining\n};\n\nsheetfn.style = sheetfn.css; // generate a real style object from the dummy stylesheet\n\nsheetfn.generateStyle = function (cy) {\n var style = new Style(cy);\n return this.appendToStyle(style);\n}; // append a dummy stylesheet object on a real style object\n\n\nsheetfn.appendToStyle = function (style) {\n for (var i = 0; i < this.length; i++) {\n var context = this[i];\n var selector = context.selector;\n var props = context.properties;\n style.selector(selector); // apply selector\n\n for (var j = 0; j < props.length; j++) {\n var prop = props[j];\n style.css(prop.name, prop.value); // apply property\n }\n }\n\n return style;\n};\n\nvar version = \"3.17.4\";\n\nvar cytoscape = function cytoscape(options) {\n // if no options specified, use default\n if (options === undefined) {\n options = {};\n } // create instance\n\n\n if (plainObject(options)) {\n return new Core(options);\n } // allow for registration of extensions\n else if (string(options)) {\n return extension.apply(extension, arguments);\n }\n}; // e.g. cytoscape.use( require('cytoscape-foo'), bar )\n\n\ncytoscape.use = function (ext) {\n var args = Array.prototype.slice.call(arguments, 1); // args to pass to ext\n\n args.unshift(cytoscape); // cytoscape is first arg to ext\n\n ext.apply(null, args);\n return this;\n};\n\ncytoscape.warnings = function (bool) {\n return warnings(bool);\n}; // replaced by build system\n\n\ncytoscape.version = version; // expose public apis (mostly for extensions)\n\ncytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet;\n\nmodule.exports = cytoscape;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ3MjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlL2Rpc3QvY3l0b3NjYXBlLmNqcy5qcz80NGUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjEsIFRoZSBDeXRvc2NhcGUgQ29uc29ydGl1bS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW5cbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzXG4gKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG9cbiAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZXgpIHsgcmV0dXJuIChleCAmJiAodHlwZW9mIGV4ID09PSAnb2JqZWN0JykgJiYgJ2RlZmF1bHQnIGluIGV4KSA/IGV4WydkZWZhdWx0J10gOiBleDsgfVxuXG52YXIgdXRpbCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdsb2Rhc2guZGVib3VuY2UnKSk7XG52YXIgSGVhcCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdoZWFwJykpO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxudmFyIHdpbmRvdyQxID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbnZhciBuYXZpZ2F0b3IgPSB3aW5kb3ckMSA/IHdpbmRvdyQxLm5hdmlnYXRvciA6IG51bGw7XG52YXIgZG9jdW1lbnQkMSA9IHdpbmRvdyQxID8gd2luZG93JDEuZG9jdW1lbnQgOiBudWxsO1xuXG52YXIgdHlwZW9mc3RyID0gX3R5cGVvZignJyk7XG5cbnZhciB0eXBlb2ZvYmogPSBfdHlwZW9mKHt9KTtcblxudmFyIHR5cGVvZmZuID0gX3R5cGVvZihmdW5jdGlvbiAoKSB7fSk7XG5cbnZhciB0eXBlb2ZodG1sZWxlID0gdHlwZW9mIEhUTUxFbGVtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoSFRNTEVsZW1lbnQpO1xuXG52YXIgaW5zdGFuY2VTdHIgPSBmdW5jdGlvbiBpbnN0YW5jZVN0cihvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouaW5zdGFuY2VTdHJpbmcgJiYgZm4ob2JqLmluc3RhbmNlU3RyaW5nKSA/IG9iai5pbnN0YW5jZVN0cmluZygpIDogbnVsbDtcbn07XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT0gdHlwZW9mc3RyO1xufTtcbnZhciBmbiA9IGZ1bmN0aW9uIGZuKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2Zmbjtcbn07XG52YXIgYXJyYXkgPSBmdW5jdGlvbiBhcnJheShvYmopIHtcbiAgcmV0dXJuICFlbGVtZW50T3JDb2xsZWN0aW9uKG9iaikgJiYgKEFycmF5LmlzQXJyYXkgPyBBcnJheS5pc0FycmF5KG9iaikgOiBvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBBcnJheSk7XG59O1xudmFyIHBsYWluT2JqZWN0ID0gZnVuY3Rpb24gcGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IHR5cGVvZm9iaiAmJiAhYXJyYXkob2JqKSAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn07XG52YXIgb2JqZWN0ID0gZnVuY3Rpb24gb2JqZWN0KG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgX3R5cGVvZihvYmopID09PSB0eXBlb2ZvYmo7XG59O1xudmFyIG51bWJlciA9IGZ1bmN0aW9uIG51bWJlcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gX3R5cGVvZigxKSAmJiAhaXNOYU4ob2JqKTtcbn07XG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIob2JqKSB7XG4gIHJldHVybiBudW1iZXIob2JqKSAmJiBNYXRoLmZsb29yKG9iaikgPT09IG9iajtcbn07XG52YXIgaHRtbEVsZW1lbnQgPSBmdW5jdGlvbiBodG1sRWxlbWVudChvYmopIHtcbiAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2ZodG1sZWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbCAhPSBvYmogJiYgb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgZWxlbWVudE9yQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIGVsZW1lbnRPckNvbGxlY3Rpb24ob2JqKSB7XG4gIHJldHVybiBlbGVtZW50KG9iaikgfHwgY29sbGVjdGlvbihvYmopO1xufTtcbnZhciBlbGVtZW50ID0gZnVuY3Rpb24gZWxlbWVudChvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiBvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb2xsZWN0aW9uID0gZnVuY3Rpb24gY29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiAhb2JqLl9wcml2YXRlLnNpbmdsZTtcbn07XG52YXIgY29yZSA9IGZ1bmN0aW9uIGNvcmUob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnY29yZSc7XG59O1xudmFyIHN0eWxlc2hlZXQgPSBmdW5jdGlvbiBzdHlsZXNoZWV0KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ3N0eWxlc2hlZXQnO1xufTtcbnZhciBldmVudCA9IGZ1bmN0aW9uIGV2ZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2V2ZW50Jztcbn07XG52YXIgZW1wdHlTdHJpbmcgPSBmdW5jdGlvbiBlbXB0eVN0cmluZyhvYmopIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIC8vIG51bGwgaXMgZW1wdHlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChvYmogPT09ICcnIHx8IG9iai5tYXRjaCgvXlxccyskLykpIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gZW1wdHkgc3RyaW5nIGlzIGVtcHR5XG4gIH1cblxuICByZXR1cm4gZmFsc2U7IC8vIG90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdFxufTtcbnZhciBkb21FbGVtZW50ID0gZnVuY3Rpb24gZG9tRWxlbWVudChvYmopIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIG5vdCBpbiBhIGJyb3dzZXIgc28gaXQgZG9lc24ndCBtYXR0ZXJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgYm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveChvYmopIHtcbiAgcmV0dXJuIHBsYWluT2JqZWN0KG9iaikgJiYgbnVtYmVyKG9iai54MSkgJiYgbnVtYmVyKG9iai54MikgJiYgbnVtYmVyKG9iai55MSkgJiYgbnVtYmVyKG9iai55Mik7XG59O1xudmFyIHByb21pc2UgPSBmdW5jdGlvbiBwcm9taXNlKG9iaikge1xuICByZXR1cm4gb2JqZWN0KG9iaikgJiYgZm4ob2JqLnRoZW4pO1xufTtcbnZhciBtcyA9IGZ1bmN0aW9uIG1zKCkge1xuICByZXR1cm4gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL21zaWV8dHJpZGVudHxlZGdlL2kpO1xufTsgLy8gcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRldGVjdCB0aGlzLi4uXG5cbnZhciBtZW1vaXplID0gZnVuY3Rpb24gbWVtb2l6ZShmbiwga2V5Rm4pIHtcbiAgaWYgKCFrZXlGbikge1xuICAgIGtleUZuID0gZnVuY3Rpb24ga2V5Rm4oKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcmdzLmpvaW4oJyQnKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1lbW9pemVkRm4gPSBmdW5jdGlvbiBtZW1vaXplZEZuKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmV0O1xuICAgIHZhciBrID0ga2V5Rm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgdmFyIGNhY2hlID0gbWVtb2l6ZWRGbi5jYWNoZTtcblxuICAgIGlmICghKHJldCA9IGNhY2hlW2tdKSkge1xuICAgICAgcmV0ID0gY2FjaGVba10gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIG1lbW9pemVkRm4uY2FjaGUgPSB7fTtcbiAgcmV0dXJuIG1lbW9pemVkRm47XG59O1xuXG52YXIgY2FtZWwyZGFzaCA9IG1lbW9pemUoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oLVxcdykvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdlsxXS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIHByZXBlbmRDYW1lbCA9IG1lbW9pemUoZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59LCBmdW5jdGlvbiAocHJlZml4LCBzdHIpIHtcbiAgcmV0dXJuIHByZWZpeCArICckJyArIHN0cjtcbn0pO1xudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAoZW1wdHlTdHJpbmcoc3RyKSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKTtcbn07XG5cbnZhciBudW1iZXIkMSA9ICcoPzpbLStdPyg/Oig/OlxcXFxkK3xcXFxcZCpcXFxcLlxcXFxkKykoPzpbRWVdWystXT9cXFxcZCspPykpJztcbnZhciByZ2JhID0gJ3JnYlthXT9cXFxcKCgnICsgbnVtYmVyJDEgKyAnWyVdPylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICdbJV0/KVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKSk/XFxcXCknO1xudmFyIHJnYmFOb0JhY2tSZWZzID0gJ3JnYlthXT9cXFxcKCg/OicgKyBudW1iZXIkMSArICdbJV0/KVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyJDEgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciQxICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIkMSArICcpKT9cXFxcKSc7XG52YXIgaHNsYSA9ICdoc2xbYV0/XFxcXCgoJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICdbJV0pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJykpP1xcXFwpJztcbnZhciBoc2xhTm9CYWNrUmVmcyA9ICdoc2xbYV0/XFxcXCgoPzonICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyJDEgKyAnWyVdKVxcXFxzKixcXFxccyooPzonICsgbnVtYmVyJDEgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyJDEgKyAnKSk/XFxcXCknO1xudmFyIGhleDMgPSAnXFxcXCNbMC05YS1mQS1GXXszfSc7XG52YXIgaGV4NiA9ICdcXFxcI1swLTlhLWZBLUZdezZ9JztcblxudmFyIGFzY2VuZGluZyA9IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmIChhID4gYikge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xudmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbiBkZXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIC0xICogYXNjZW5kaW5nKGEsIGIpO1xufTtcblxudmFyIGV4dGVuZCA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2JqID0gYXJnc1tpXTtcblxuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgayA9IGtleXNbal07XG4gICAgICB0Z3Rba10gPSBvYmpba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRndDtcbn07XG5cbnZhciBoZXgydHVwbGUgPSBmdW5jdGlvbiBoZXgydHVwbGUoaGV4KSB7XG4gIGlmICghKGhleC5sZW5ndGggPT09IDQgfHwgaGV4Lmxlbmd0aCA9PT0gNykgfHwgaGV4WzBdICE9PSAnIycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hvcnRIZXggPSBoZXgubGVuZ3RoID09PSA0O1xuICB2YXIgciwgZywgYjtcbiAgdmFyIGJhc2UgPSAxNjtcblxuICBpZiAoc2hvcnRIZXgpIHtcbiAgICByID0gcGFyc2VJbnQoaGV4WzFdICsgaGV4WzFdLCBiYXNlKTtcbiAgICBnID0gcGFyc2VJbnQoaGV4WzJdICsgaGV4WzJdLCBiYXNlKTtcbiAgICBiID0gcGFyc2VJbnQoaGV4WzNdICsgaGV4WzNdLCBiYXNlKTtcbiAgfSBlbHNlIHtcbiAgICByID0gcGFyc2VJbnQoaGV4WzFdICsgaGV4WzJdLCBiYXNlKTtcbiAgICBnID0gcGFyc2VJbnQoaGV4WzNdICsgaGV4WzRdLCBiYXNlKTtcbiAgICBiID0gcGFyc2VJbnQoaGV4WzVdICsgaGV4WzZdLCBiYXNlKTtcbiAgfVxuXG4gIHJldHVybiBbciwgZywgYl07XG59OyAvLyBnZXQgW3IsIGcsIGIsIGFdIGZyb20gaHNsKDAsIDAsIDApIG9yIGhzbGEoMCwgMCwgMCwgMClcblxudmFyIGhzbDJ0dXBsZSA9IGZ1bmN0aW9uIGhzbDJ0dXBsZShoc2wpIHtcbiAgdmFyIHJldDtcbiAgdmFyIGgsIHMsIGwsIGEsIHIsIGcsIGI7XG5cbiAgZnVuY3Rpb24gaHVlMnJnYihwLCBxLCB0KSB7XG4gICAgaWYgKHQgPCAwKSB0ICs9IDE7XG4gICAgaWYgKHQgPiAxKSB0IC09IDE7XG4gICAgaWYgKHQgPCAxIC8gNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7XG4gICAgaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7XG4gICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICAgIHJldHVybiBwO1xuICB9XG5cbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIGhzbGEgKyAnJCcpLmV4ZWMoaHNsKTtcblxuICBpZiAobSkge1xuICAgIC8vIGdldCBodWVcbiAgICBoID0gcGFyc2VJbnQobVsxXSk7XG5cbiAgICBpZiAoaCA8IDApIHtcbiAgICAgIGggPSAoMzYwIC0gLTEgKiBoICUgMzYwKSAlIDM2MDtcbiAgICB9IGVsc2UgaWYgKGggPiAzNjApIHtcbiAgICAgIGggPSBoICUgMzYwO1xuICAgIH1cblxuICAgIGggLz0gMzYwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBzID0gcGFyc2VGbG9hdChtWzJdKTtcblxuICAgIGlmIChzIDwgMCB8fCBzID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzYXR1cmF0aW9uIGlzIFswLCAxMDBdXG5cblxuICAgIHMgPSBzIC8gMTAwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBsID0gcGFyc2VGbG9hdChtWzNdKTtcblxuICAgIGlmIChsIDwgMCB8fCBsID4gMTAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBsaWdodG5lc3MgaXMgWzAsIDEwMF1cblxuXG4gICAgbCA9IGwgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGEgPSBtWzRdO1xuXG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYSA9IHBhcnNlRmxvYXQoYSk7XG5cbiAgICAgIGlmIChhIDwgMCB8fCBhID4gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGFscGhhIGlzIFswLCAxXVxuXG4gICAgfSAvLyBub3csIGNvbnZlcnQgdG8gcmdiXG4gICAgLy8gY29kZSBmcm9tIGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHRcblxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IE1hdGgucm91bmQobCAqIDI1NSk7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICByID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggKyAxIC8gMykpO1xuICAgICAgZyA9IE1hdGgucm91bmQoMjU1ICogaHVlMnJnYihwLCBxLCBoKSk7XG4gICAgICBiID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggLSAxIC8gMykpO1xuICAgIH1cblxuICAgIHJldCA9IFtyLCBnLCBiLCBhXTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59OyAvLyBnZXQgW3IsIGcsIGIsIGFdIGZyb20gcmdiKDAsIDAsIDApIG9yIHJnYmEoMCwgMCwgMCwgMClcblxudmFyIHJnYjJ0dXBsZSA9IGZ1bmN0aW9uIHJnYjJ0dXBsZShyZ2IpIHtcbiAgdmFyIHJldDtcbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIHJnYmEgKyAnJCcpLmV4ZWMocmdiKTtcblxuICBpZiAobSkge1xuICAgIHJldCA9IFtdO1xuICAgIHZhciBpc1BjdCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gMzsgaSsrKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG1baV07XG5cbiAgICAgIGlmIChjaGFubmVsW2NoYW5uZWwubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgICBpc1BjdFtpXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNoYW5uZWwgPSBwYXJzZUZsb2F0KGNoYW5uZWwpO1xuXG4gICAgICBpZiAoaXNQY3RbaV0pIHtcbiAgICAgICAgY2hhbm5lbCA9IGNoYW5uZWwgLyAxMDAgKiAyNTU7IC8vIG5vcm1hbGlzZSB0byBbMCwgMjU1XVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDI1NSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGludmFsaWQgY2hhbm5lbCB2YWx1ZVxuXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cblxuICAgIHZhciBhdExlYXN0T25lSXNQY3QgPSBpc1BjdFsxXSB8fCBpc1BjdFsyXSB8fCBpc1BjdFszXTtcbiAgICB2YXIgYWxsQXJlUGN0ID0gaXNQY3RbMV0gJiYgaXNQY3RbMl0gJiYgaXNQY3RbM107XG5cbiAgICBpZiAoYXRMZWFzdE9uZUlzUGN0ICYmICFhbGxBcmVQY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG11c3QgYWxsIGJlIHBlcmNlbnQgdmFsdWVzIGlmIG9uZSBpc1xuXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuXG4gICAgaWYgKGFscGhhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFscGhhID0gcGFyc2VGbG9hdChhbHBoYSk7XG5cbiAgICAgIGlmIChhbHBoYSA8IDAgfHwgYWxwaGEgPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBhbHBoYSB2YWx1ZVxuXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcbnZhciBjb2xvcm5hbWUydHVwbGUgPSBmdW5jdGlvbiBjb2xvcm5hbWUydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yc1tjb2xvci50b0xvd2VyQ2FzZSgpXTtcbn07XG52YXIgY29sb3IydHVwbGUgPSBmdW5jdGlvbiBjb2xvcjJ0dXBsZShjb2xvcikge1xuICByZXR1cm4gKGFycmF5KGNvbG9yKSA/IGNvbG9yIDogbnVsbCkgfHwgY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB8fCBoZXgydHVwbGUoY29sb3IpIHx8IHJnYjJ0dXBsZShjb2xvcikgfHwgaHNsMnR1cGxlKGNvbG9yKTtcbn07XG52YXIgY29sb3JzID0ge1xuICAvLyBzcGVjaWFsIGNvbG91ciBuYW1lc1xuICB0cmFuc3BhcmVudDogWzAsIDAsIDAsIDBdLFxuICAvLyBOQiBhbHBoYSA9PT0gMFxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICBpZiAocGxhaW5PYmplY3Qoa2V5KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIHNldCBtYXAgd2l0aCBvYmplY3Qga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cblxuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNldCB0aGUgdmFsdWVcbiAgICAgIG9ialtrZXldID0gb3B0aW9ucy52YWx1ZTtcbiAgICB9XG4gIH1cbn07IC8vIGdldHMgdGhlIHZhbHVlIGluIGEgbWFwIGV2ZW4gaWYgaXQncyBub3QgYnVpbHQgaW4gcGxhY2VzXG5cbnZhciBnZXRNYXAgPSBmdW5jdGlvbiBnZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICBpZiAocGxhaW5PYmplY3Qoa2V5KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIGdldCBtYXAgd2l0aCBvYmplY3Qga2V5Jyk7XG4gICAgfVxuXG4gICAgb2JqID0gb2JqW2tleV07XG5cbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07IC8vIGRlbGV0ZXMgdGhlIGVudHJ5IGluIHRoZSBtYXBcblxudmFyIHBlcmZvcm1hbmNlID0gd2luZG93JDEgPyB3aW5kb3ckMS5wZXJmb3JtYW5jZSA6IG51bGw7XG52YXIgcG5vdyA9IHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59O1xuXG52YXIgcmFmID0gZnVuY3Rpb24gKCkge1xuICBpZiAod2luZG93JDEpIHtcbiAgICBpZiAod2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHdpbmRvdyQxLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAod2luZG93JDEubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHdpbmRvdyQxLm1velJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAod2luZG93JDEud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHdpbmRvdyQxLndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAod2luZG93JDEubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgd2luZG93JDEubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm4ocG5vdygpKTtcbiAgICAgIH0sIDEwMDAgLyA2MCk7XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKSB7XG4gIHJldHVybiByYWYoZm4pO1xufTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9IHBub3c7XG5cbnZhciBERUZBVUxUX0hBU0hfU0VFRCA9IDkyNjE7XG52YXIgSyA9IDY1NTk5OyAvLyAzNyBhbHNvIHdvcmtzIHByZXR0eSB3ZWxsXG5cbnZhciBERUZBVUxUX0hBU0hfU0VFRF9BTFQgPSA1MzgxO1xudmFyIGhhc2hJdGVyYWJsZUludHMgPSBmdW5jdGlvbiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICB2YXIgaGFzaCA9IHNlZWQ7XG4gIHZhciBlbnRyeTtcblxuICBmb3IgKDs7KSB7XG4gICAgZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAoZW50cnkuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzaCA9IGhhc2ggKiBLICsgZW50cnkudmFsdWUgfCAwO1xuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59O1xudmFyIGhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KG51bSkge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgcmV0dXJuIHNlZWQgKiBLICsgbnVtIHwgMDtcbn07XG52YXIgaGFzaEludEFsdCA9IGZ1bmN0aW9uIGhhc2hJbnRBbHQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRF9BTFQ7XG4gIC8vIGRqYjIvc3RyaW5nLWhhc2hcbiAgcmV0dXJuIChzZWVkIDw8IDUpICsgc2VlZCArIG51bSB8IDA7XG59O1xudmFyIGNvbWJpbmVIYXNoZXMgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzKGhhc2gxLCBoYXNoMikge1xuICByZXR1cm4gaGFzaDEgKiAweDIwMDAwMCArIGhhc2gyO1xufTtcbnZhciBjb21iaW5lSGFzaGVzQXJyYXkgPSBmdW5jdGlvbiBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaGVzKSB7XG4gIHJldHVybiBoYXNoZXNbMF0gKiAweDIwMDAwMCArIGhhc2hlc1sxXTtcbn07XG52YXIgaGFzaEFycmF5cyA9IGZ1bmN0aW9uIGhhc2hBcnJheXMoaGFzaGVzMSwgaGFzaGVzMikge1xuICByZXR1cm4gW2hhc2hJbnQoaGFzaGVzMVswXSwgaGFzaGVzMlswXSksIGhhc2hJbnRBbHQoaGFzaGVzMVsxXSwgaGFzaGVzMlsxXSldO1xufTtcbnZhciBoYXNoSW50c0FycmF5ID0gZnVuY3Rpb24gaGFzaEludHNBcnJheShpbnRzLCBzZWVkKSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICB2YWx1ZTogMCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBpbnRzLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IGludHNbaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJ5LmRvbmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmcgPSBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0ciwgc2VlZCkge1xuICB2YXIgZW50cnkgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhc2hJdGVyYWJsZUludHMoaXRlcmF0b3IsIHNlZWQpO1xufTtcbnZhciBoYXNoU3RyaW5ncyA9IGZ1bmN0aW9uIGhhc2hTdHJpbmdzKCkge1xuICByZXR1cm4gaGFzaFN0cmluZ3NBcnJheShhcmd1bWVudHMpO1xufTtcbnZhciBoYXNoU3RyaW5nc0FycmF5ID0gZnVuY3Rpb24gaGFzaFN0cmluZ3NBcnJheShzdHJzKSB7XG4gIHZhciBoYXNoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdHIgPSBzdHJzW2ldO1xuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0ciwgaGFzaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc2g7XG59O1xuXG4vKmdsb2JhbCBjb25zb2xlICovXG52YXIgd2FybmluZ3NFbmFibGVkID0gdHJ1ZTtcbnZhciB3YXJuU3VwcG9ydGVkID0gY29uc29sZS53YXJuICE9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXG52YXIgdHJhY2VTdXBwb3J0ZWQgPSBjb25zb2xlLnRyYWNlICE9IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXG52YXIgTUFYX0lOVCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTE7XG52YXIgdHJ1ZWlmeSA9IGZ1bmN0aW9uIHRydWVpZnkoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBmYWxzaWZ5ID0gZnVuY3Rpb24gZmFsc2lmeSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciB6ZXJvaWZ5ID0gZnVuY3Rpb24gemVyb2lmeSgpIHtcbiAgcmV0dXJuIDA7XG59O1xudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG52YXIgZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xudmFyIHdhcm5pbmdzID0gZnVuY3Rpb24gd2FybmluZ3MoZW5hYmxlZCkge1xuICBpZiAoZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3NFbmFibGVkID0gISFlbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YXJuaW5nc0VuYWJsZWQ7XG4gIH1cbn07XG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKCF3YXJuaW5ncygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHdhcm5TdXBwb3J0ZWQpIHtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhtc2cpO1xuXG4gICAgaWYgKHRyYWNlU3VwcG9ydGVkKSB7XG4gICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuICB9XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgcmV0dXJuIGV4dGVuZCh7fSwgb2JqKTtcbn07IC8vIGdldHMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFyZ3VtZW50XG5cbnZhciBjb3B5ID0gZnVuY3Rpb24gY29weShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChhcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5zbGljZSgpO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59O1xudmFyIGNvcHlBcnJheSA9IGZ1bmN0aW9uIGNvcHlBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFyci5zbGljZSgpO1xufTtcbnZhciB1dWlkID0gZnVuY3Rpb24gdXVpZChhLCBiXG4vKiBwbGFjZWhvbGRlcnMgKi9cbikge1xuICBmb3IgKCAvLyBsb29wIDopXG4gIGIgPSBhID0gJyc7IC8vIGIgLSByZXN1bHQgLCBhIC0gbnVtZXJpYyBsZXRpYWJsZVxuICBhKysgPCAzNjsgLy9cbiAgYiArPSBhICogNTEgJiA1MiAvLyBpZiBcImFcIiBpcyBub3QgOSBvciAxNCBvciAxOSBvciAyNFxuICA/IC8vICByZXR1cm4gYSByYW5kb20gbnVtYmVyIG9yIDRcbiAgKGEgXiAxNSAvLyBpZiBcImFcIiBpcyBub3QgMTVcbiAgPyAvLyBnZW5ldGF0ZSBhIHJhbmRvbSBudW1iZXIgZnJvbSAwIHRvIDE1XG4gIDggXiBNYXRoLnJhbmRvbSgpICogKGEgXiAyMCA/IDE2IDogNCkgLy8gdW5sZXNzIFwiYVwiIGlzIDIwLCBpbiB3aGljaCBjYXNlIGEgcmFuZG9tIG51bWJlciBmcm9tIDggdG8gMTFcbiAgOiA0IC8vICBvdGhlcndpc2UgNFxuICApLnRvU3RyaW5nKDE2KSA6ICctJyAvLyAgaW4gb3RoZXIgY2FzZXMgKGlmIFwiYVwiIGlzIDksMTQsMTksMjQpIGluc2VydCBcIi1cIlxuICApIHtcbiAgfVxuXG4gIHJldHVybiBiO1xufTtcbnZhciBfc3RhdGljRW1wdHlPYmplY3QgPSB7fTtcbnZhciBzdGF0aWNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uIHN0YXRpY0VtcHR5T2JqZWN0KCkge1xuICByZXR1cm4gX3N0YXRpY0VtcHR5T2JqZWN0O1xufTtcbnZhciBkZWZhdWx0cyA9IGZ1bmN0aW9uIGRlZmF1bHRzKF9kZWZhdWx0cykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKF9kZWZhdWx0cyk7XG4gIHJldHVybiBmdW5jdGlvbiAob3B0cykge1xuICAgIHZhciBmaWxsZWRPcHRzID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIG9wdFZhbCA9IG9wdHMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9wdHNba2V5XTtcbiAgICAgIGZpbGxlZE9wdHNba2V5XSA9IG9wdFZhbCA9PT0gdW5kZWZpbmVkID8gX2RlZmF1bHRzW2tleV0gOiBvcHRWYWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGxlZE9wdHM7XG4gIH07XG59O1xudmFyIHJlbW92ZUZyb21BcnJheSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIGVsZSwgb25lQ29weSkge1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGFycltpXSA9PT0gZWxlKSB7XG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuXG4gICAgICBpZiAob25lQ29weSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgY2xlYXJBcnJheSA9IGZ1bmN0aW9uIGNsZWFyQXJyYXkoYXJyKSB7XG4gIGFyci5zcGxpY2UoMCwgYXJyLmxlbmd0aCk7XG59O1xudmFyIHB1c2ggPSBmdW5jdGlvbiBwdXNoKGFyciwgb3RoZXJBcnIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlckFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbCA9IG90aGVyQXJyW2ldO1xuICAgIGFyci5wdXNoKGVsKTtcbiAgfVxufTtcbnZhciBnZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByb3BOYW1lID0gcHJlcGVuZENhbWVsKHByZWZpeCwgcHJvcE5hbWUpOyAvLyBlLmcuIChsYWJlbFdpZHRoLCBzb3VyY2UpID0+IHNvdXJjZUxhYmVsV2lkdGhcbiAgfVxuXG4gIHJldHVybiBvYmpbcHJvcE5hbWVdO1xufTtcbnZhciBzZXRQcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJlZml4ZWRQcm9wZXJ0eShvYmosIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcm9wTmFtZSA9IHByZXBlbmRDYW1lbChwcmVmaXgsIHByb3BOYW1lKTsgLy8gZS5nLiAobGFiZWxXaWR0aCwgc291cmNlKSA9PiBzb3VyY2VMYWJlbFdpZHRoXG4gIH1cblxuICBvYmpbcHJvcE5hbWVdID0gdmFsdWU7XG59O1xuXG4vKiBnbG9iYWwgTWFwICovXG52YXIgT2JqZWN0TWFwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JqZWN0TWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RNYXApO1xuXG4gICAgdGhpcy5fb2JqID0ge307XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoT2JqZWN0TWFwLCBbe1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsKSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShrZXkpIHtcbiAgICAgIHRoaXMuX29ialtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fb2JqID0ge307XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpba2V5XTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gT2JqZWN0TWFwO1xufSgpO1xuXG52YXIgTWFwJDEgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyA/IE1hcCA6IE9iamVjdE1hcDtcblxuLyogZ2xvYmFsIFNldCAqL1xudmFyIHVuZGVmID0gIFwidW5kZWZpbmVkXCIgO1xuXG52YXIgT2JqZWN0U2V0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JqZWN0U2V0KGFycmF5T3JPYmplY3RTZXQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT2JqZWN0U2V0KTtcblxuICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zaXplID0gMDtcblxuICAgIGlmIChhcnJheU9yT2JqZWN0U2V0ICE9IG51bGwpIHtcbiAgICAgIHZhciBhcnI7XG5cbiAgICAgIGlmIChhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nICE9IG51bGwgJiYgYXJyYXlPck9iamVjdFNldC5pbnN0YW5jZVN0cmluZygpID09PSB0aGlzLmluc3RhbmNlU3RyaW5nKCkpIHtcbiAgICAgICAgYXJyID0gYXJyYXlPck9iamVjdFNldC50b0FycmF5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZChhcnJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhPYmplY3RTZXQsIFt7XG4gICAga2V5OiBcImluc3RhbmNlU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc3RhbmNlU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICdzZXQnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG5cbiAgICAgIGlmIChvW3ZhbF0gIT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMTtcbiAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKHZhbCkge1xuICAgICAgdmFyIG8gPSB0aGlzLl9vYmo7XG5cbiAgICAgIGlmIChvW3ZhbF0gPT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMDtcbiAgICAgICAgdGhpcy5zaXplLS07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpbdmFsXSA9PT0gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9BcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX29iaikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmhhcyhrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBPYmplY3RTZXQ7XG59KCk7XG5cbnZhciBTZXQkMSA9ICh0eXBlb2YgU2V0ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoU2V0KSkgIT09IHVuZGVmID8gU2V0IDogT2JqZWN0U2V0O1xuXG52YXIgRWxlbWVudCA9IGZ1bmN0aW9uIEVsZW1lbnQoY3ksIHBhcmFtcykge1xuICB2YXIgcmVzdG9yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICBpZiAoY3kgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXMgPT09IHVuZGVmaW5lZCB8fCAhY29yZShjeSkpIHtcbiAgICBlcnJvcignQW4gZWxlbWVudCBtdXN0IGhhdmUgYSBjb3JlIHJlZmVyZW5jZSBhbmQgcGFyYW1ldGVycyBzZXQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZ3JvdXAgPSBwYXJhbXMuZ3JvdXA7IC8vIHRyeSB0byBhdXRvbWF0aWNhbGx5IGluZmVyIHRoZSBncm91cCBpZiB1bnNwZWNpZmllZFxuXG4gIGlmIChncm91cCA9PSBudWxsKSB7XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIHBhcmFtcy5kYXRhLnNvdXJjZSAhPSBudWxsICYmIHBhcmFtcy5kYXRhLnRhcmdldCAhPSBudWxsKSB7XG4gICAgICBncm91cCA9ICdlZGdlcyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwID0gJ25vZGVzJztcbiAgICB9XG4gIH0gLy8gdmFsaWRhdGUgZ3JvdXBcblxuXG4gIGlmIChncm91cCAhPT0gJ25vZGVzJyAmJiBncm91cCAhPT0gJ2VkZ2VzJykge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgYmUgb2YgdHlwZSBgbm9kZXNgIG9yIGBlZGdlc2A7IHlvdSBzcGVjaWZpZWQgYCcgKyBncm91cCArICdgJyk7XG4gICAgcmV0dXJuO1xuICB9IC8vIG1ha2UgdGhlIGVsZW1lbnQgYXJyYXktbGlrZSwganVzdCBsaWtlIGEgY29sbGVjdGlvblxuXG5cbiAgdGhpcy5sZW5ndGggPSAxO1xuICB0aGlzWzBdID0gdGhpczsgLy8gTk9URTogd2hlbiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZSwgYWRkIGFsc28gdG8gZWxlLmpzb24oKVxuXG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY3k6IGN5LFxuICAgIHNpbmdsZTogdHJ1ZSxcbiAgICAvLyBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBlbGVtZW50XG4gICAgZGF0YTogcGFyYW1zLmRhdGEgfHwge30sXG4gICAgLy8gZGF0YSBvYmplY3RcbiAgICBwb3NpdGlvbjogcGFyYW1zLnBvc2l0aW9uIHx8IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICAvLyAoeCwgeSkgcG9zaXRpb24gcGFpclxuICAgIGF1dG9XaWR0aDogdW5kZWZpbmVkLFxuICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgb2Ygbm9kZXMgY2FsY3VsYXRlZCBieSB0aGUgcmVuZGVyZXIgd2hlbiBzZXQgdG8gc3BlY2lhbCAnYXV0bycgdmFsdWVcbiAgICBhdXRvSGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgYXV0b1BhZGRpbmc6IHVuZGVmaW5lZCxcbiAgICBjb21wb3VuZEJvdW5kc0NsZWFuOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBjb21wb3VuZCBkaW1lbnNpb25zIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIHRoZSBuZXh0IHRpbWUgZGltZW5zaW9ucyBhcmUgcmVhZFxuICAgIGxpc3RlbmVyczogW10sXG4gICAgLy8gYXJyYXkgb2YgYm91bmQgbGlzdGVuZXJzXG4gICAgZ3JvdXA6IGdyb3VwLFxuICAgIC8vIHN0cmluZzsgJ25vZGVzJyBvciAnZWRnZXMnXG4gICAgc3R5bGU6IHt9LFxuICAgIC8vIHByb3BlcnRpZXMgYXMgc2V0IGJ5IHRoZSBzdHlsZVxuICAgIHJzdHlsZToge30sXG4gICAgLy8gcHJvcGVydGllcyBmb3Igc3R5bGUgc2VudCBmcm9tIHRoZSByZW5kZXJlciB0byB0aGUgY29yZVxuICAgIHN0eWxlQ3h0czogW10sXG4gICAgLy8gYXBwbGllZCBzdHlsZSBjb250ZXh0cyBmcm9tIHRoZSBzdHlsZXJcbiAgICBzdHlsZUtleXM6IHt9LFxuICAgIC8vIHBlci1ncm91cCBrZXlzIG9mIHN0eWxlIHByb3BlcnR5IHZhbHVlc1xuICAgIHJlbW92ZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBpdCdzIGluc2lkZSB0aGUgdmlzOyB0cnVlIGlmIHJlbW92ZWQgKHNldCB0cnVlIGhlcmUgc2luY2Ugd2UgY2FsbCByZXN0b3JlKVxuICAgIHNlbGVjdGVkOiBwYXJhbXMuc2VsZWN0ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciBpdCdzIHNlbGVjdGVkXG4gICAgc2VsZWN0YWJsZTogcGFyYW1zLnNlbGVjdGFibGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMuc2VsZWN0YWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGl0J3Mgc2VsZWN0YWJsZVxuICAgIGxvY2tlZDogcGFyYW1zLmxvY2tlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGxvY2tlZCAoY2Fubm90IGJlIG1vdmVkKVxuICAgIGdyYWJiZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZ3JhYmJlZCBieSB0aGUgbW91c2U7IHJlbmRlcmVyIHNldHMgdGhpcyBwcml2YXRlbHlcbiAgICBncmFiYmFibGU6IHBhcmFtcy5ncmFiYmFibGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMuZ3JhYmJhYmxlID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgY2FuIGJlIGdyYWJiZWRcbiAgICBwYW5uYWJsZTogcGFyYW1zLnBhbm5hYmxlID09PSB1bmRlZmluZWQgPyBncm91cCA9PT0gJ2VkZ2VzJyA/IHRydWUgOiBmYWxzZSA6IHBhcmFtcy5wYW5uYWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGhhcyBwYXNzdGhyb3VnaCBwYW5uaW5nIGVuYWJsZWRcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWN0aXZlIGZyb20gdXNlciBpbnRlcmFjdGlvblxuICAgIGNsYXNzZXM6IG5ldyBTZXQkMSgpLFxuICAgIC8vIG1hcCAoIGNsYXNzTmFtZSA9PiB0cnVlIClcbiAgICBhbmltYXRpb246IHtcbiAgICAgIC8vIG9iamVjdCBmb3IgY3VycmVudGx5LXJ1bm5pbmcgYW5pbWF0aW9uc1xuICAgICAgY3VycmVudDogW10sXG4gICAgICBxdWV1ZTogW11cbiAgICB9LFxuICAgIHJzY3JhdGNoOiB7fSxcbiAgICAvLyBvYmplY3QgaW4gd2hpY2ggdGhlIHJlbmRlcmVyIGNhbiBzdG9yZSBpbmZvcm1hdGlvblxuICAgIHNjcmF0Y2g6IHBhcmFtcy5zY3JhdGNoIHx8IHt9LFxuICAgIC8vIHNjcmF0Y2ggb2JqZWN0c1xuICAgIGVkZ2VzOiBbXSxcbiAgICAvLyBhcnJheSBvZiBjb25uZWN0ZWQgZWRnZXNcbiAgICBjaGlsZHJlbjogW10sXG4gICAgLy8gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBwYXJlbnQ6IG51bGwsXG4gICAgLy8gcGFyZW50IHJlZlxuICAgIHRyYXZlcnNhbENhY2hlOiB7fSxcbiAgICAvLyBjYWNoZSBvZiBvdXRwdXQgb2YgdHJhdmVyc2FsIGZ1bmN0aW9uc1xuICAgIGJhY2tncm91bmRpbmc6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgYmFja2dyb3VuZCBpbWFnZXMgYXJlIGxvYWRpbmdcbiAgICBiYkNhY2hlOiBudWxsLFxuICAgIC8vIGNhY2hlIG9mIHRoZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgIGJiQ2FjaGVTaGlmdDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIC8vIHNoaWZ0IGFwcGxpZWQgdG8gY2FjaGVkIGJiIHRvIGJlIGFwcGxpZWQgb24gbmV4dCBnZXRcbiAgICBib2R5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIHcvbyBvdmVybGF5XG4gICAgb3ZlcmxheUJvdW5kczogbnVsbCxcbiAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWxlbWVudCBib2R5LCBpbmNsdWRpbmcgb3ZlcmxheVxuICAgIGxhYmVsQm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgbGFiZWxzXG4gICAgICBhbGw6IG51bGwsXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICBtYWluOiBudWxsXG4gICAgfSxcbiAgICBhcnJvd0JvdW5kczoge1xuICAgICAgLy8gYm91bmRzIGNhY2hlIG9mIGVkZ2UgYXJyb3dzXG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAnbWlkLXNvdXJjZSc6IG51bGwsXG4gICAgICAnbWlkLXRhcmdldCc6IG51bGxcbiAgICB9XG4gIH07XG5cbiAgaWYgKF9wLnBvc2l0aW9uLnggPT0gbnVsbCkge1xuICAgIF9wLnBvc2l0aW9uLnggPSAwO1xuICB9XG5cbiAgaWYgKF9wLnBvc2l0aW9uLnkgPT0gbnVsbCkge1xuICAgIF9wLnBvc2l0aW9uLnkgPSAwO1xuICB9IC8vIHJlbmRlcmVkUG9zaXRpb24gb3ZlcnJpZGVzIGlmIHNwZWNpZmllZFxuXG5cbiAgaWYgKHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgdmFyIHJwb3MgPSBwYXJhbXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgX3AucG9zaXRpb24gPSB7XG4gICAgICB4OiAocnBvcy54IC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHk6IChycG9zLnkgLSBwYW4ueSkgLyB6b29tXG4gICAgfTtcbiAgfVxuXG4gIHZhciBjbGFzc2VzID0gW107XG5cbiAgaWYgKGFycmF5KHBhcmFtcy5jbGFzc2VzKSkge1xuICAgIGNsYXNzZXMgPSBwYXJhbXMuY2xhc3NlcztcbiAgfSBlbHNlIGlmIChzdHJpbmcocGFyYW1zLmNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IHBhcmFtcy5jbGFzc2VzLnNwbGl0KC9cXHMrLyk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGNscyA9IGNsYXNzZXNbaV07XG5cbiAgICBpZiAoIWNscyB8fCBjbHMgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBfcC5jbGFzc2VzLmFkZChjbHMpO1xuICB9XG5cbiAgdGhpcy5jcmVhdGVFbWl0dGVyKCk7XG4gIHZhciBieXBhc3MgPSBwYXJhbXMuc3R5bGUgfHwgcGFyYW1zLmNzcztcblxuICBpZiAoYnlwYXNzKSB7XG4gICAgd2FybignU2V0dGluZyBhIGBzdHlsZWAgYnlwYXNzIGF0IGVsZW1lbnQgY3JlYXRpb24gc2hvdWxkIGJlIGRvbmUgb25seSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LiAgVHJ5IHRvIHVzZSB0aGUgc3R5bGVzaGVldCBpbnN0ZWFkLicpO1xuICAgIHRoaXMuc3R5bGUoYnlwYXNzKTtcbiAgfVxuXG4gIGlmIChyZXN0b3JlID09PSB1bmRlZmluZWQgfHwgcmVzdG9yZSkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG59O1xuXG52YXIgZGVmaW5lU2VhcmNoID0gZnVuY3Rpb24gZGVmaW5lU2VhcmNoKHBhcmFtcykge1xuICBwYXJhbXMgPSB7XG4gICAgYmZzOiBwYXJhbXMuYmZzIHx8ICFwYXJhbXMuZGZzLFxuICAgIGRmczogcGFyYW1zLmRmcyB8fCAhcGFyYW1zLmJmc1xuICB9OyAvLyBmcm9tIHBzZXVkb2NvZGUgb24gd2lraXBlZGlhXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYXJjaEZuKHJvb3RzLCBmbiQxLCBkaXJlY3RlZCkge1xuICAgIHZhciBvcHRpb25zO1xuXG4gICAgaWYgKHBsYWluT2JqZWN0KHJvb3RzKSAmJiAhZWxlbWVudE9yQ29sbGVjdGlvbihyb290cykpIHtcbiAgICAgIG9wdGlvbnMgPSByb290cztcbiAgICAgIHJvb3RzID0gb3B0aW9ucy5yb290cyB8fCBvcHRpb25zLnJvb3Q7XG4gICAgICBmbiQxID0gb3B0aW9ucy52aXNpdDtcbiAgICAgIGRpcmVjdGVkID0gb3B0aW9ucy5kaXJlY3RlZDtcbiAgICB9XG5cbiAgICBkaXJlY3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgIWZuKGZuJDEpID8gZm4kMSA6IGRpcmVjdGVkO1xuICAgIGZuJDEgPSBmbihmbiQxKSA/IGZuJDEgOiBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciB2ID0gcm9vdHMgPSBzdHJpbmcocm9vdHMpID8gdGhpcy5maWx0ZXIocm9vdHMpIDogcm9vdHM7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBbXTtcbiAgICB2YXIgY29ubmVjdGVkQnkgPSB7fTtcbiAgICB2YXIgaWQyZGVwdGggPSB7fTtcbiAgICB2YXIgViA9IHt9O1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIgZm91bmQ7XG5cbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlczsgLy8gZW5xdWV1ZSB2XG5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZpID0gdltpXTtcbiAgICAgIHZhciB2aUlkID0gdmkuaWQoKTtcblxuICAgICAgaWYgKHZpLmlzTm9kZSgpKSB7XG4gICAgICAgIFEudW5zaGlmdCh2aSk7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5iZnMpIHtcbiAgICAgICAgICBWW3ZpSWRdID0gdHJ1ZTtcbiAgICAgICAgICBjb25uZWN0ZWROb2Rlcy5wdXNoKHZpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkMmRlcHRoW3ZpSWRdID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkge1xuICAgICAgdmFyIHYgPSBwYXJhbXMuYmZzID8gUS5zaGlmdCgpIDogUS5wb3AoKTtcbiAgICAgIHZhciB2SWQgPSB2LmlkKCk7XG5cbiAgICAgIGlmIChwYXJhbXMuZGZzKSB7XG4gICAgICAgIGlmIChWW3ZJZF0pIHtcbiAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgVlt2SWRdID0gdHJ1ZTtcbiAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlcHRoID0gaWQyZGVwdGhbdklkXTtcbiAgICAgIHZhciBwcmV2RWRnZSA9IGNvbm5lY3RlZEJ5W3ZJZF07XG4gICAgICB2YXIgc3JjID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnNvdXJjZSgpIDogbnVsbDtcbiAgICAgIHZhciB0Z3QgPSBwcmV2RWRnZSAhPSBudWxsID8gcHJldkVkZ2UudGFyZ2V0KCkgOiBudWxsO1xuICAgICAgdmFyIHByZXZOb2RlID0gcHJldkVkZ2UgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHYuc2FtZShzcmMpID8gdGd0WzBdIDogc3JjWzBdO1xuICAgICAgdmFyIHJldCA9IHZvaWQgMDtcbiAgICAgIHJldCA9IGZuJDEodiwgcHJldkVkZ2UsIHByZXZOb2RlLCBqKyssIGRlcHRoKTtcblxuICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZCA9IHY7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciB2d0VkZ2VzID0gdi5jb25uZWN0ZWRFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gKCFkaXJlY3RlZCB8fCBlLnNvdXJjZSgpLnNhbWUodikpICYmIGVkZ2VzLmhhcyhlKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCB2d0VkZ2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgIHZhciB3ID0gZS5jb25uZWN0ZWROb2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbi5zYW1lKHYpICYmIG5vZGVzLmhhcyhuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3SWQgPSB3LmlkKCk7XG5cbiAgICAgICAgaWYgKHcubGVuZ3RoICE9PSAwICYmICFWW3dJZF0pIHtcbiAgICAgICAgICB3ID0gd1swXTtcbiAgICAgICAgICBRLnB1c2godyk7XG5cbiAgICAgICAgICBpZiAocGFyYW1zLmJmcykge1xuICAgICAgICAgICAgVlt3SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbm5lY3RlZE5vZGVzLnB1c2godyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgaWQyZGVwdGhbd0lkXSA9IGlkMmRlcHRoW3ZJZF0gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9sb29wOiB3aGlsZSAoUS5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AyKCk7XG5cbiAgICAgIHN3aXRjaCAoX3JldCkge1xuICAgICAgICBjYXNlIFwiY29udGludWVcIjpcbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIFwiYnJlYWtcIjpcbiAgICAgICAgICBicmVhayBfbG9vcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY29ubmVjdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb25uZWN0ZWROb2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBub2RlID0gY29ubmVjdGVkTm9kZXNbX2ldO1xuICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRCeVtub2RlLmlkKCldO1xuXG4gICAgICBpZiAoZWRnZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbm5lY3RlZEVsZXMucHVzaChlZGdlKTtcbiAgICAgIH1cblxuICAgICAgY29ubmVjdGVkRWxlcy5wdXNoKG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBjeS5jb2xsZWN0aW9uKGNvbm5lY3RlZEVsZXMpLFxuICAgICAgZm91bmQ6IGN5LmNvbGxlY3Rpb24oZm91bmQpXG4gICAgfTtcbiAgfTtcbn07IC8vIHNlYXJjaCwgc3Bhbm5pbmcgdHJlZXMsIGV0Y1xuXG5cbnZhciBlbGVzZm4gPSB7XG4gIGJyZWFkdGhGaXJzdFNlYXJjaDogZGVmaW5lU2VhcmNoKHtcbiAgICBiZnM6IHRydWVcbiAgfSksXG4gIGRlcHRoRmlyc3RTZWFyY2g6IGRlZmluZVNlYXJjaCh7XG4gICAgZGZzOiB0cnVlXG4gIH0pXG59OyAvLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGhpY2FsIGFsaWFzXG5cbmVsZXNmbi5iZnMgPSBlbGVzZm4uYnJlYWR0aEZpcnN0U2VhcmNoO1xuZWxlc2ZuLmRmcyA9IGVsZXNmbi5kZXB0aEZpcnN0U2VhcmNoO1xuXG52YXIgZGlqa3N0cmFEZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiQxID0ge1xuICBkaWprc3RyYTogZnVuY3Rpb24gZGlqa3N0cmEob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgd2VpZ2h0OiBhcmdzWzFdLFxuICAgICAgICBkaXJlY3RlZDogYXJnc1syXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX2RpamtzdHJhRGVmYXVsdHMgPSBkaWprc3RyYURlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgICByb290ID0gX2RpamtzdHJhRGVmYXVsdHMucm9vdCxcbiAgICAgICAgd2VpZ2h0ID0gX2RpamtzdHJhRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9kaWprc3RyYURlZmF1bHRzLmRpcmVjdGVkO1xuXG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgc291cmNlID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0gOiByb290WzBdO1xuICAgIHZhciBkaXN0ID0ge307XG4gICAgdmFyIHByZXYgPSB7fTtcbiAgICB2YXIga25vd25EaXN0ID0ge307XG5cbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTG9vcCgpO1xuICAgIH0pO1xuXG4gICAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG5vZGUpIHtcbiAgICAgIHJldHVybiBkaXN0W25vZGUuaWQoKV07XG4gICAgfTtcblxuICAgIHZhciBzZXREaXN0ID0gZnVuY3Rpb24gc2V0RGlzdChub2RlLCBkKSB7XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBkO1xuICAgICAgUS51cGRhdGVJdGVtKG5vZGUpO1xuICAgIH07XG5cbiAgICB2YXIgUSA9IG5ldyBIZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZ2V0RGlzdChhKSAtIGdldERpc3QoYik7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgZGlzdFtub2RlLmlkKCldID0gbm9kZS5zYW1lKHNvdXJjZSkgPyAwIDogSW5maW5pdHk7XG4gICAgICBRLnB1c2gobm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB1dnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gdXZzW19pXTtcblxuICAgICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuXG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlZGdlOiBzbWFsbGVzdEVkZ2UsXG4gICAgICAgIGRpc3Q6IHNtYWxsZXN0RGlzdGFuY2VcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHdoaWxlIChRLnNpemUoKSA+IDApIHtcbiAgICAgIHZhciB1ID0gUS5wb3AoKTtcbiAgICAgIHZhciBzbWFsbGV0c0Rpc3QgPSBnZXREaXN0KHUpO1xuICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgIGtub3duRGlzdFt1aWRdID0gc21hbGxldHNEaXN0O1xuXG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5laWdoYm9ycyA9IHUubmVpZ2hib3Job29kKCkuaW50ZXJzZWN0KG5vZGVzKTtcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbmVpZ2hib3JzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIHYgPSBuZWlnaGJvcnNbX2kyXTtcbiAgICAgICAgdmFyIHZpZCA9IHYuaWQoKTtcbiAgICAgICAgdmFyIHZEaXN0ID0gZGlzdEJldHdlZW4odSwgdik7XG4gICAgICAgIHZhciBhbHQgPSBzbWFsbGV0c0Rpc3QgKyB2RGlzdC5kaXN0O1xuXG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcblxuICAgIH0gLy8gd2hpbGVcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3RhbmNlVG86IGZ1bmN0aW9uIGRpc3RhbmNlVG8obm9kZSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gc3RyaW5nKG5vZGUpID8gbm9kZXMuZmlsdGVyKG5vZGUpWzBdIDogbm9kZVswXTtcbiAgICAgICAgcmV0dXJuIGtub3duRGlzdFt0YXJnZXQuaWQoKV07XG4gICAgICB9LFxuICAgICAgcGF0aFRvOiBmdW5jdGlvbiBwYXRoVG8obm9kZSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gc3RyaW5nKG5vZGUpID8gbm9kZXMuZmlsdGVyKG5vZGUpWzBdIDogbm9kZVswXTtcbiAgICAgICAgdmFyIFMgPSBbXTtcbiAgICAgICAgdmFyIHUgPSB0YXJnZXQ7XG4gICAgICAgIHZhciB1aWQgPSB1LmlkKCk7XG5cbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG5cbiAgICAgICAgICB3aGlsZSAocHJldlt1aWRdKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHByZXZbdWlkXTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLmVkZ2UpO1xuICAgICAgICAgICAgUy51bnNoaWZ0KHAubm9kZSk7XG4gICAgICAgICAgICB1ID0gcC5ub2RlO1xuICAgICAgICAgICAgdWlkID0gdS5pZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVzLnNwYXduKFMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kMiA9IHtcbiAgLy8ga3J1c2thbCdzIGFsZ29yaXRobSAoZmluZHMgbWluIHNwYW5uaW5nIHRyZWUsIGFzc3VtaW5nIHVuZGlyZWN0ZWQgZ3JhcGgpXG4gIC8vIGltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBrcnVza2FsOiBmdW5jdGlvbiBrcnVza2FsKHdlaWdodEZuKSB7XG4gICAgd2VpZ2h0Rm4gPSB3ZWlnaHRGbiB8fCBmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfTtcblxuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuXG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG5cbiAgICAgICAgaWYgKGVsZXMuaGFzKGVsZSkpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07IC8vIHN0YXJ0IHdpdGggb25lIGZvcmVzdCBwZXIgbm9kZVxuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIGZvcmVzdFtpXSA9IHRoaXMuc3Bhd24obm9kZXNbaV0pO1xuICAgIH1cblxuICAgIHZhciBTID0gZWRnZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIHdlaWdodEZuKGEpIC0gd2VpZ2h0Rm4oYik7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuXG4gICAgICBpZiAoc2V0VUluZGV4ICE9PSBzZXRWSW5kZXgpIHtcbiAgICAgICAgQS5tZXJnZShlZGdlKTsgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG5cbiAgICAgICAgc2V0VS5tZXJnZShzZXRWKTtcbiAgICAgICAgZm9yZXN0LnNwbGljZShzZXRWSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBO1xuICB9XG59O1xuXG52YXIgYVN0YXJEZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgcm9vdDogbnVsbCxcbiAgZ29hbDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBoZXVyaXN0aWM6IGZ1bmN0aW9uIGhldXJpc3RpYyhlZGdlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJDMgPSB7XG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBhU3RhcjogZnVuY3Rpb24gYVN0YXIob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIHZhciBfYVN0YXJEZWZhdWx0cyA9IGFTdGFyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgICBnb2FsID0gX2FTdGFyRGVmYXVsdHMuZ29hbCxcbiAgICAgICAgaGV1cmlzdGljID0gX2FTdGFyRGVmYXVsdHMuaGV1cmlzdGljLFxuICAgICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgICB3ZWlnaHQgPSBfYVN0YXJEZWZhdWx0cy53ZWlnaHQ7XG5cbiAgICByb290ID0gY3kuY29sbGVjdGlvbihyb290KVswXTtcbiAgICBnb2FsID0gY3kuY29sbGVjdGlvbihnb2FsKVswXTtcbiAgICB2YXIgc2lkID0gcm9vdC5pZCgpO1xuICAgIHZhciB0aWQgPSBnb2FsLmlkKCk7XG4gICAgdmFyIGdTY29yZSA9IHt9O1xuICAgIHZhciBmU2NvcmUgPSB7fTtcbiAgICB2YXIgY2xvc2VkU2V0SWRzID0ge307XG4gICAgdmFyIG9wZW5TZXQgPSBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZTY29yZVthLmlkKCldIC0gZlNjb3JlW2IuaWQoKV07XG4gICAgfSk7XG4gICAgdmFyIG9wZW5TZXRJZHMgPSBuZXcgU2V0JDEoKTtcbiAgICB2YXIgY2FtZUZyb20gPSB7fTtcbiAgICB2YXIgY2FtZUZyb21FZGdlID0ge307XG5cbiAgICB2YXIgYWRkVG9PcGVuU2V0ID0gZnVuY3Rpb24gYWRkVG9PcGVuU2V0KGVsZSwgaWQpIHtcbiAgICAgIG9wZW5TZXQucHVzaChlbGUpO1xuICAgICAgb3BlblNldElkcy5hZGQoaWQpO1xuICAgIH07XG5cbiAgICB2YXIgY01pbiwgY01pbklkO1xuXG4gICAgdmFyIHBvcEZyb21PcGVuU2V0ID0gZnVuY3Rpb24gcG9wRnJvbU9wZW5TZXQoKSB7XG4gICAgICBjTWluID0gb3BlblNldC5wb3AoKTtcbiAgICAgIGNNaW5JZCA9IGNNaW4uaWQoKTtcbiAgICAgIG9wZW5TZXRJZHNbXCJkZWxldGVcIl0oY01pbklkKTtcbiAgICB9O1xuXG4gICAgdmFyIGlzSW5PcGVuU2V0ID0gZnVuY3Rpb24gaXNJbk9wZW5TZXQoaWQpIHtcbiAgICAgIHJldHVybiBvcGVuU2V0SWRzLmhhcyhpZCk7XG4gICAgfTtcblxuICAgIGFkZFRvT3BlblNldChyb290LCBzaWQpO1xuICAgIGdTY29yZVtzaWRdID0gMDtcbiAgICBmU2NvcmVbc2lkXSA9IGhldXJpc3RpYyhyb290KTsgLy8gQ291bnRlclxuXG4gICAgdmFyIHN0ZXBzID0gMDsgLy8gTWFpbiBsb29wXG5cbiAgICB3aGlsZSAob3BlblNldC5zaXplKCkgPiAwKSB7XG4gICAgICBwb3BGcm9tT3BlblNldCgpO1xuICAgICAgc3RlcHMrKzsgLy8gSWYgd2UndmUgZm91bmQgb3VyIGdvYWwsIHRoZW4gd2UgYXJlIGRvbmVcblxuICAgICAgaWYgKGNNaW5JZCA9PT0gdGlkKSB7XG4gICAgICAgIHZhciBwYXRoID0gW107XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IGdvYWw7XG4gICAgICAgIHZhciBwYXRoTm9kZUlkID0gdGlkO1xuICAgICAgICB2YXIgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIHBhdGgudW5zaGlmdChwYXRoTm9kZSk7XG5cbiAgICAgICAgICBpZiAocGF0aEVkZ2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGF0aC51bnNoaWZ0KHBhdGhFZGdlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoTm9kZSA9IGNhbWVGcm9tW3BhdGhOb2RlSWRdO1xuXG4gICAgICAgICAgaWYgKHBhdGhOb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGhOb2RlSWQgPSBwYXRoTm9kZS5pZCgpO1xuICAgICAgICAgIHBhdGhFZGdlID0gY2FtZUZyb21FZGdlW3BhdGhOb2RlSWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogZ1Njb3JlW2NNaW5JZF0sXG4gICAgICAgICAgcGF0aDogdGhpcy5zcGF3bihwYXRoKSxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gQWRkIGNNaW4gdG8gcHJvY2Vzc2VkIG5vZGVzXG5cblxuICAgICAgY2xvc2VkU2V0SWRzW2NNaW5JZF0gPSB0cnVlOyAvLyBVcGRhdGUgc2NvcmVzIGZvciBuZWlnaGJvcnMgb2YgY01pblxuICAgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgaWYgZ3JhcGggaXMgZGlyZWN0ZWQgb3Igbm90XG5cbiAgICAgIHZhciB2d0VkZ2VzID0gY01pbi5fcHJpdmF0ZS5lZGdlcztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2d0VkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlID0gdndFZGdlc1tpXTsgLy8gZWRnZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcblxuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZChlLmlkKCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gY01pbiBtdXN0IGJlIHRoZSBzb3VyY2Ugb2YgZWRnZSBpZiBkaXJlY3RlZFxuXG5cbiAgICAgICAgaWYgKGRpcmVjdGVkICYmIGUuZGF0YSgnc291cmNlJykgIT09IGNNaW5JZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdTcmMgPSBlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgd1RndCA9IGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciB3ID0gd1NyYy5pZCgpICE9PSBjTWluSWQgPyB3U3JjIDogd1RndDtcbiAgICAgICAgdmFyIHdpZCA9IHcuaWQoKTsgLy8gbm9kZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcblxuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZCh3aWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gaWYgbm9kZSBpcyBpbiBjbG9zZWRTZXQsIGlnbm9yZSBpdFxuXG5cbiAgICAgICAgaWYgKGNsb3NlZFNldElkc1t3aWRdKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gTmV3IHRlbnRhdGl2ZSBzY29yZSBmb3Igbm9kZSB3XG5cblxuICAgICAgICB2YXIgdGVtcFNjb3JlID0gZ1Njb3JlW2NNaW5JZF0gKyB3ZWlnaHQoZSk7IC8vIFVwZGF0ZSBnU2NvcmUgZm9yIG5vZGUgdyBpZjpcbiAgICAgICAgLy8gICB3IG5vdCBwcmVzZW50IGluIG9wZW5TZXRcbiAgICAgICAgLy8gT1JcbiAgICAgICAgLy8gICB0ZW50YXRpdmUgZ1Njb3JlIGlzIGxlc3MgdGhhbiBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAvLyB3IG5vdCBpbiBvcGVuU2V0XG5cbiAgICAgICAgaWYgKCFpc0luT3BlblNldCh3aWQpKSB7XG4gICAgICAgICAgZ1Njb3JlW3dpZF0gPSB0ZW1wU2NvcmU7XG4gICAgICAgICAgZlNjb3JlW3dpZF0gPSB0ZW1wU2NvcmUgKyBoZXVyaXN0aWModyk7XG4gICAgICAgICAgYWRkVG9PcGVuU2V0KHcsIHdpZCk7XG4gICAgICAgICAgY2FtZUZyb21bd2lkXSA9IGNNaW47XG4gICAgICAgICAgY2FtZUZyb21FZGdlW3dpZF0gPSBlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIHcgYWxyZWFkeSBpbiBvcGVuU2V0LCBidXQgd2l0aCBncmVhdGVyIGdTY29yZVxuXG5cbiAgICAgICAgaWYgKHRlbXBTY29yZSA8IGdTY29yZVt3aWRdKSB7XG4gICAgICAgICAgZ1Njb3JlW3dpZF0gPSB0ZW1wU2NvcmU7XG4gICAgICAgICAgZlNjb3JlW3dpZF0gPSB0ZW1wU2NvcmUgKyBoZXVyaXN0aWModyk7XG4gICAgICAgICAgY2FtZUZyb21bd2lkXSA9IGNNaW47XG4gICAgICAgICAgY2FtZUZyb21FZGdlW3dpZF0gPSBlO1xuICAgICAgICB9XG4gICAgICB9IC8vIEVuZCBvZiBuZWlnaGJvcnMgdXBkYXRlXG5cbiAgICB9IC8vIEVuZCBvZiBtYWluIGxvb3BcbiAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIGhlcmUsIHRoZW4gd2UndmUgbm90IHJlYWNoZWQgb3VyIGdvYWxcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgIGRpc3RhbmNlOiB1bmRlZmluZWQsXG4gICAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgICBzdGVwczogc3RlcHNcbiAgICB9O1xuICB9XG59OyAvLyBlbGVzZm5cblxudmFyIGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiQ0ID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgZmxveWRXYXJzaGFsbDogZnVuY3Rpb24gZmxveWRXYXJzaGFsbChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgdmFyIF9mbG95ZFdhcnNoYWxsRGVmYXVsdCA9IGZsb3lkV2Fyc2hhbGxEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgd2VpZ2h0ID0gX2Zsb3lkV2Fyc2hhbGxEZWZhdWx0LndlaWdodCxcbiAgICAgICAgZGlyZWN0ZWQgPSBfZmxveWRXYXJzaGFsbERlZmF1bHQuZGlyZWN0ZWQ7XG5cbiAgICB2YXIgd2VpZ2h0Rm4gPSB3ZWlnaHQ7XG5cbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIHZhciBOID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBOc3EgPSBOICogTjtcblxuICAgIHZhciBpbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICB9O1xuXG4gICAgdmFyIGF0SW5kZXggPSBmdW5jdGlvbiBhdEluZGV4KGkpIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9OyAvLyBJbml0aWFsaXplIGRpc3RhbmNlIG1hdHJpeFxuXG5cbiAgICB2YXIgZGlzdCA9IG5ldyBBcnJheShOc3EpO1xuXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBOc3E7IG4rKykge1xuICAgICAgdmFyIGogPSBuICUgTjtcbiAgICAgIHZhciBpID0gKG4gLSBqKSAvIE47XG5cbiAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgIGRpc3Rbbl0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdFtuXSA9IEluZmluaXR5O1xuICAgICAgfVxuICAgIH0gLy8gSW5pdGlhbGl6ZSBtYXRyaXggdXNlZCBmb3IgcGF0aCByZWNvbnN0cnVjdGlvblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG5cblxuICAgIHZhciBuZXh0ID0gbmV3IEFycmF5KE5zcSk7XG4gICAgdmFyIGVkZ2VOZXh0ID0gbmV3IEFycmF5KE5zcSk7IC8vIFByb2Nlc3MgZWRnZXNcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlZGdlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKVswXTtcblxuICAgICAgaWYgKHNyYyA9PT0gdGd0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBleGNsdWRlIGxvb3BzXG5cblxuICAgICAgdmFyIHMgPSBpbmRleE9mKHNyYyk7XG4gICAgICB2YXIgdCA9IGluZGV4T2YodGd0KTtcbiAgICAgIHZhciBzdCA9IHMgKiBOICsgdDsgLy8gc291cmNlIHRvIHRhcmdldCBpbmRleFxuXG4gICAgICB2YXIgX3dlaWdodCA9IHdlaWdodEZuKGVkZ2UpOyAvLyBDaGVjayBpZiBhbHJlYWR5IHByb2Nlc3MgYW5vdGhlciBlZGdlIGJldHdlZW4gc2FtZSAyIG5vZGVzXG5cblxuICAgICAgaWYgKGRpc3Rbc3RdID4gX3dlaWdodCkge1xuICAgICAgICBkaXN0W3N0XSA9IF93ZWlnaHQ7XG4gICAgICAgIG5leHRbc3RdID0gdDtcbiAgICAgICAgZWRnZU5leHRbc3RdID0gZWRnZTtcbiAgICAgIH0gLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgcHJvY2VzcyAncmV2ZXJzZWQnIGVkZ2VcblxuXG4gICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgIHZhciB0cyA9IHQgKiBOICsgczsgLy8gdGFyZ2V0IHRvIHNvdXJjZSBpbmRleFxuXG4gICAgICAgIGlmICghZGlyZWN0ZWQgJiYgZGlzdFt0c10gPiBfd2VpZ2h0KSB7XG4gICAgICAgICAgZGlzdFt0c10gPSBfd2VpZ2h0O1xuICAgICAgICAgIG5leHRbdHNdID0gcztcbiAgICAgICAgICBlZGdlTmV4dFt0c10gPSBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBNYWluIGxvb3BcblxuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBOOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47IF9pMisrKSB7XG4gICAgICAgIHZhciBpayA9IF9pMiAqIE4gKyBrO1xuXG4gICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBOOyBfaisrKSB7XG4gICAgICAgICAgdmFyIGlqID0gX2kyICogTiArIF9qO1xuICAgICAgICAgIHZhciBraiA9IGsgKiBOICsgX2o7XG5cbiAgICAgICAgICBpZiAoZGlzdFtpa10gKyBkaXN0W2tqXSA8IGRpc3RbaWpdKSB7XG4gICAgICAgICAgICBkaXN0W2lqXSA9IGRpc3RbaWtdICsgZGlzdFtral07XG4gICAgICAgICAgICBuZXh0W2lqXSA9IG5leHRbaWtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBnZXRBcmdFbGUgPSBmdW5jdGlvbiBnZXRBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gKHN0cmluZyhlbGUpID8gY3kuZmlsdGVyKGVsZSkgOiBlbGUpWzBdO1xuICAgIH07XG5cbiAgICB2YXIgaW5kZXhPZkFyZ0VsZSA9IGZ1bmN0aW9uIGluZGV4T2ZBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gaW5kZXhPZihnZXRBcmdFbGUoZWxlKSk7XG4gICAgfTtcblxuICAgIHZhciByZXMgPSB7XG4gICAgICBkaXN0YW5jZTogZnVuY3Rpb24gZGlzdGFuY2UoZnJvbSwgdG8pIHtcbiAgICAgICAgdmFyIGkgPSBpbmRleE9mQXJnRWxlKGZyb20pO1xuICAgICAgICB2YXIgaiA9IGluZGV4T2ZBcmdFbGUodG8pO1xuICAgICAgICByZXR1cm4gZGlzdFtpICogTiArIGpdO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IGZ1bmN0aW9uIHBhdGgoZnJvbSwgdG8pIHtcbiAgICAgICAgdmFyIGkgPSBpbmRleE9mQXJnRWxlKGZyb20pO1xuICAgICAgICB2YXIgaiA9IGluZGV4T2ZBcmdFbGUodG8pO1xuICAgICAgICB2YXIgZnJvbU5vZGUgPSBhdEluZGV4KGkpO1xuXG4gICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21Ob2RlLmNvbGxlY3Rpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0W2kgKiBOICsgal0gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGF0aCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgdmFyIHByZXYgPSBpO1xuICAgICAgICB2YXIgZWRnZTtcbiAgICAgICAgcGF0aC5tZXJnZShmcm9tTm9kZSk7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGopIHtcbiAgICAgICAgICBwcmV2ID0gaTtcbiAgICAgICAgICBpID0gbmV4dFtpICogTiArIGpdO1xuICAgICAgICAgIGVkZ2UgPSBlZGdlTmV4dFtwcmV2ICogTiArIGldO1xuICAgICAgICAgIHBhdGgubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgcGF0aC5tZXJnZShhdEluZGV4KGkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBmbG95ZFdhcnNoYWxsXG5cbn07IC8vIGVsZXNmblxuXG52YXIgYmVsbG1hbkZvcmREZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiQ1ID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYmVsbG1hbkZvcmQ6IGZ1bmN0aW9uIGJlbGxtYW5Gb3JkKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9iZWxsbWFuRm9yZERlZmF1bHRzID0gYmVsbG1hbkZvcmREZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgd2VpZ2h0ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9iZWxsbWFuRm9yZERlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgICByb290ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMucm9vdDtcblxuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXM7XG5cbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIGluZm9NYXAgPSBuZXcgTWFwJDEoKTtcbiAgICB2YXIgaGFzTmVnYXRpdmVXZWlnaHRDeWNsZSA9IGZhbHNlO1xuICAgIHZhciBuZWdhdGl2ZVdlaWdodEN5Y2xlcyA9IFtdO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdOyAvLyBpbiBjYXNlIHNlbGVjdG9yIHBhc3NlZFxuXG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG5cbiAgICB2YXIgZ2V0SW5mbyA9IGZ1bmN0aW9uIGdldEluZm8obm9kZSkge1xuICAgICAgdmFyIG9iaiA9IGluZm9NYXAuZ2V0KG5vZGUuaWQoKSk7XG5cbiAgICAgIGlmICghb2JqKSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBpbmZvTWFwLnNldChub2RlLmlkKCksIG9iaik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIHZhciBnZXROb2RlRnJvbVRvID0gZnVuY3Rpb24gZ2V0Tm9kZUZyb21Ubyh0bykge1xuICAgICAgcmV0dXJuIChzdHJpbmcodG8pID8gY3kuJCh0bykgOiB0bylbMF07XG4gICAgfTtcblxuICAgIHZhciBkaXN0YW5jZVRvID0gZnVuY3Rpb24gZGlzdGFuY2VUbyh0bykge1xuICAgICAgcmV0dXJuIGdldEluZm8oZ2V0Tm9kZUZyb21Ubyh0bykpLmRpc3Q7XG4gICAgfTtcblxuICAgIHZhciBwYXRoVG8gPSBmdW5jdGlvbiBwYXRoVG8odG8pIHtcbiAgICAgIHZhciB0aGlzU3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHJvb3Q7XG4gICAgICB2YXIgZW5kID0gZ2V0Tm9kZUZyb21Ubyh0byk7XG4gICAgICB2YXIgcGF0aCA9IFtdO1xuICAgICAgdmFyIG5vZGUgPSBlbmQ7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zcGF3bigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhub2RlKSxcbiAgICAgICAgICAgIGVkZ2UgPSBfZ2V0SW5mby5lZGdlLFxuICAgICAgICAgICAgcHJlZCA9IF9nZXRJbmZvLnByZWQ7XG5cbiAgICAgICAgcGF0aC51bnNoaWZ0KG5vZGVbMF0pO1xuXG4gICAgICAgIGlmIChub2RlLnNhbWUodGhpc1N0YXJ0KSAmJiBwYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlZGdlICE9IG51bGwpIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQoZWRnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gcHJlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZXMuc3Bhd24ocGF0aCk7XG4gICAgfTsgLy8gSW5pdGlhbGl6YXRpb25zIHsgZGlzdCwgcHJlZCwgZWRnZSB9XG5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBpbmZvID0gZ2V0SW5mbyhub2RlKTtcblxuICAgICAgaWYgKG5vZGUuc2FtZShyb290KSkge1xuICAgICAgICBpbmZvLmRpc3QgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mby5kaXN0ID0gSW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGluZm8ucHJlZCA9IG51bGw7XG4gICAgICBpbmZvLmVkZ2UgPSBudWxsO1xuICAgIH0gLy8gRWRnZXMgcmVsYXhhdGlvblxuXG5cbiAgICB2YXIgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG5cbiAgICB2YXIgY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbiBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChub2RlMSwgbm9kZTIsIGVkZ2UsIGluZm8xLCBpbmZvMiwgd2VpZ2h0KSB7XG4gICAgICB2YXIgZGlzdCA9IGluZm8xLmRpc3QgKyB3ZWlnaHQ7XG5cbiAgICAgIGlmIChkaXN0IDwgaW5mbzIuZGlzdCAmJiAhZWRnZS5zYW1lKGluZm8xLmVkZ2UpKSB7XG4gICAgICAgIGluZm8yLmRpc3QgPSBkaXN0O1xuICAgICAgICBpbmZvMi5wcmVkID0gbm9kZTE7XG4gICAgICAgIGluZm8yLmVkZ2UgPSBlZGdlO1xuICAgICAgICByZXBsYWNlZEVkZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgIHJlcGxhY2VkRWRnZSA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBlID0gMDsgZSA8IG51bUVkZ2VzOyBlKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuXG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG5cbiAgICAgICAgdmFyIHNyY0luZm8gPSBnZXRJbmZvKHNyYyk7XG4gICAgICAgIHZhciB0Z3RJbmZvID0gZ2V0SW5mbyh0Z3QpO1xuICAgICAgICBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChzcmMsIHRndCwgZWRnZSwgc3JjSW5mbywgdGd0SW5mbywgX3dlaWdodCk7IC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlICdyZXZlcnNlJyBlZGdlXG5cbiAgICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHRndCwgc3JjLCBlZGdlLCB0Z3RJbmZvLCBzcmNJbmZvLCBfd2VpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlcGxhY2VkRWRnZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVwbGFjZWRFZGdlKSB7XG4gICAgICAvLyBDaGVjayBmb3IgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlc1xuICAgICAgZm9yICh2YXIgX2UgPSAwOyBfZSA8IG51bUVkZ2VzOyBfZSsrKSB7XG4gICAgICAgIHZhciBfZWRnZSA9IGVkZ2VzW19lXTtcblxuICAgICAgICB2YXIgX3NyYyA9IF9lZGdlLnNvdXJjZSgpO1xuXG4gICAgICAgIHZhciBfdGd0ID0gX2VkZ2UudGFyZ2V0KCk7XG5cbiAgICAgICAgdmFyIF93ZWlnaHQyID0gd2VpZ2h0Rm4oX2VkZ2UpO1xuXG4gICAgICAgIHZhciBzcmNEaXN0ID0gZ2V0SW5mbyhfc3JjKS5kaXN0O1xuICAgICAgICB2YXIgdGd0RGlzdCA9IGdldEluZm8oX3RndCkuZGlzdDtcblxuICAgICAgICBpZiAoc3JjRGlzdCArIF93ZWlnaHQyIDwgdGd0RGlzdCB8fCAhZGlyZWN0ZWQgJiYgdGd0RGlzdCArIF93ZWlnaHQyIDwgc3JjRGlzdCkge1xuICAgICAgICAgIHdhcm4oJ0dyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUgd2VpZ2h0IGN5Y2xlIGZvciBCZWxsbWFuLUZvcmQnKTtcbiAgICAgICAgICBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXN0YW5jZVRvOiBkaXN0YW5jZVRvLFxuICAgICAgcGF0aFRvOiBwYXRoVG8sXG4gICAgICBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlOiBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlLFxuICAgICAgbmVnYXRpdmVXZWlnaHRDeWNsZXM6IG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzXG4gICAgfTtcbiAgfSAvLyBiZWxsbWFuRm9yZFxuXG59OyAvLyBlbGVzZm5cblxudmFyIHNxcnQyID0gTWF0aC5zcXJ0KDIpOyAvLyBGdW5jdGlvbiB3aGljaCBjb2xhcHNlcyAyIChtZXRhKSBub2RlcyBpbnRvIG9uZVxuLy8gVXBkYXRlcyB0aGUgcmVtYWluaW5nIGVkZ2UgbGlzdHNcbi8vIFJlY2VpdmVzIGFzIGEgcGFyYW1hdGVyIHRoZSBlZGdlIHdoaWNoIGNhdXNlcyB0aGUgY29sbGFwc2VcblxudmFyIGNvbGxhcHNlID0gZnVuY3Rpb24gY29sbGFwc2UoZWRnZUluZGV4LCBub2RlTWFwLCByZW1haW5pbmdFZGdlcykge1xuICBpZiAocmVtYWluaW5nRWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZXJyb3IoXCJLYXJnZXItU3RlaW4gbXVzdCBiZSBydW4gb24gYSBjb25uZWN0ZWQgKHN1YilncmFwaFwiKTtcbiAgfVxuXG4gIHZhciBlZGdlSW5mbyA9IHJlbWFpbmluZ0VkZ2VzW2VkZ2VJbmRleF07XG4gIHZhciBzb3VyY2VJbiA9IGVkZ2VJbmZvWzFdO1xuICB2YXIgdGFyZ2V0SW4gPSBlZGdlSW5mb1syXTtcbiAgdmFyIHBhcnRpdGlvbjEgPSBub2RlTWFwW3NvdXJjZUluXTtcbiAgdmFyIHBhcnRpdGlvbjIgPSBub2RlTWFwW3RhcmdldEluXTtcbiAgdmFyIG5ld0VkZ2VzID0gcmVtYWluaW5nRWRnZXM7IC8vIHJlLXVzZSBhcnJheVxuICAvLyBEZWxldGUgYWxsIGVkZ2VzIGJldHdlZW4gcGFydGl0aW9uMSBhbmQgcGFydGl0aW9uMlxuXG4gIGZvciAodmFyIGkgPSBuZXdFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBlZGdlID0gbmV3RWRnZXNbaV07XG4gICAgdmFyIHNyYyA9IGVkZ2VbMV07XG4gICAgdmFyIHRndCA9IGVkZ2VbMl07XG5cbiAgICBpZiAobm9kZU1hcFtzcmNdID09PSBwYXJ0aXRpb24xICYmIG5vZGVNYXBbdGd0XSA9PT0gcGFydGl0aW9uMiB8fCBub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjIgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24xKSB7XG4gICAgICBuZXdFZGdlcy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9IC8vIEFsbCBlZGdlcyBwb2ludGluZyB0byBwYXJ0aXRpb24yIHNob3VsZCBub3cgcG9pbnQgdG8gcGFydGl0aW9uMVxuXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5ld0VkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfZWRnZSA9IG5ld0VkZ2VzW19pXTtcblxuICAgIGlmIChfZWRnZVsxXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgLy8gQ2hlY2sgc291cmNlXG4gICAgICBuZXdFZGdlc1tfaV0gPSBfZWRnZS5zbGljZSgpOyAvLyBjb3B5XG5cbiAgICAgIG5ld0VkZ2VzW19pXVsxXSA9IHBhcnRpdGlvbjE7XG4gICAgfSBlbHNlIGlmIChfZWRnZVsyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgLy8gQ2hlY2sgdGFyZ2V0XG4gICAgICBuZXdFZGdlc1tfaV0gPSBfZWRnZS5zbGljZSgpOyAvLyBjb3B5XG5cbiAgICAgIG5ld0VkZ2VzW19pXVsyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9IC8vIE1vdmUgYWxsIG5vZGVzIGZyb20gcGFydGl0aW9uMiB0byBwYXJ0aXRpb24xXG5cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlTWFwLmxlbmd0aDsgX2kyKyspIHtcbiAgICBpZiAobm9kZU1hcFtfaTJdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICBub2RlTWFwW19pMl0gPSBwYXJ0aXRpb24xO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFZGdlcztcbn07IC8vIENvbnRyYWN0cyBhIGdyYXBoIHVudGlsIHdlIHJlYWNoIGEgY2VydGFpbiBudW1iZXIgb2YgbWV0YSBub2Rlc1xuXG5cbnZhciBjb250cmFjdFVudGlsID0gZnVuY3Rpb24gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMsIHNpemUsIHNpemVMaW1pdCkge1xuICB3aGlsZSAoc2l6ZSA+IHNpemVMaW1pdCkge1xuICAgIC8vIENob29zZSBhbiBlZGdlIHJhbmRvbWx5XG4gICAgdmFyIGVkZ2VJbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJlbWFpbmluZ0VkZ2VzLmxlbmd0aCk7IC8vIENvbGxhcHNlIGdyYXBoIGJhc2VkIG9uIGVkZ2VcblxuICAgIHJlbWFpbmluZ0VkZ2VzID0gY29sbGFwc2UoZWRnZUluZGV4LCBtZXRhTm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpO1xuICAgIHNpemUtLTtcbiAgfVxuXG4gIHJldHVybiByZW1haW5pbmdFZGdlcztcbn07XG5cbnZhciBlbGVzZm4kNiA9IHtcbiAgLy8gQ29tcHV0ZXMgdGhlIG1pbmltdW0gY3V0IG9mIGFuIHVuZGlyZWN0ZWQgZ3JhcGhcbiAgLy8gUmV0dXJucyB0aGUgY29ycmVjdCBhbnN3ZXIgd2l0aCBoaWdoIHByb2JhYmlsaXR5XG4gIGthcmdlclN0ZWluOiBmdW5jdGlvbiBrYXJnZXJTdGVpbigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG5cbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmlzTG9vcCgpO1xuICAgIH0pO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtRWRnZXMgPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIG51bUl0ZXIgPSBNYXRoLmNlaWwoTWF0aC5wb3coTWF0aC5sb2cobnVtTm9kZXMpIC8gTWF0aC5MTjIsIDIpKTtcbiAgICB2YXIgc3RvcFNpemUgPSBNYXRoLmZsb29yKG51bU5vZGVzIC8gc3FydDIpO1xuXG4gICAgaWYgKG51bU5vZGVzIDwgMikge1xuICAgICAgZXJyb3IoJ0F0IGxlYXN0IDIgbm9kZXMgYXJlIHJlcXVpcmVkIGZvciBLYXJnZXItU3RlaW4gYWxnb3JpdGhtJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gLy8gTm93IHN0b3JlIGVkZ2UgZGVzdGluYXRpb24gYXMgaW5kZXhlc1xuICAgIC8vIEZvcm1hdCBmb3IgZWFjaCBlZGdlIChlZGdlIGluZGV4LCBzb3VyY2Ugbm9kZSBpbmRleCwgdGFyZ2V0IG5vZGUgaW5kZXgpXG5cblxuICAgIHZhciBlZGdlSW5kZXhlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1FZGdlczsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgICAgZWRnZUluZGV4ZXMucHVzaChbaSwgbm9kZXMuaW5kZXhPZihlLnNvdXJjZSgpKSwgbm9kZXMuaW5kZXhPZihlLnRhcmdldCgpKV0pO1xuICAgIH0gLy8gV2Ugd2lsbCBzdG9yZSB0aGUgYmVzdCBjdXQgZm91bmQgaGVyZVxuXG5cbiAgICB2YXIgbWluQ3V0U2l6ZSA9IEluZmluaXR5O1xuICAgIHZhciBtaW5DdXRFZGdlSW5kZXhlcyA9IFtdO1xuICAgIHZhciBtaW5DdXROb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTsgLy8gSW5pdGlhbCBtZXRhIG5vZGUgcGFydGl0aW9uXG5cbiAgICB2YXIgbWV0YU5vZGVNYXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBtZXRhTm9kZU1hcDIgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuXG4gICAgdmFyIGNvcHlOb2Rlc01hcCA9IGZ1bmN0aW9uIGNvcHlOb2Rlc01hcChmcm9tLCB0bykge1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtTm9kZXM7IF9pMysrKSB7XG4gICAgICAgIHRvW19pM10gPSBmcm9tW19pM107XG4gICAgICB9XG4gICAgfTsgLy8gTWFpbiBsb29wXG5cblxuICAgIGZvciAodmFyIGl0ZXIgPSAwOyBpdGVyIDw9IG51bUl0ZXI7IGl0ZXIrKykge1xuICAgICAgLy8gUmVzZXQgbWV0YSBub2RlIHBhcnRpdGlvblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbnVtTm9kZXM7IF9pNCsrKSB7XG4gICAgICAgIG1ldGFOb2RlTWFwW19pNF0gPSBfaTQ7XG4gICAgICB9IC8vIENvbnRyYWN0IHVudGlsIHN0b3AgcG9pbnQgKHN0b3BTaXplIG5vZGVzKVxuXG5cbiAgICAgIHZhciBlZGdlc1N0YXRlID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgZWRnZUluZGV4ZXMuc2xpY2UoKSwgbnVtTm9kZXMsIHN0b3BTaXplKTtcbiAgICAgIHZhciBlZGdlc1N0YXRlMiA9IGVkZ2VzU3RhdGUuc2xpY2UoKTsgLy8gY29weVxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgY29sYXBzZWQgbm9kZXMgc3RhdGVcblxuICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtZXRhTm9kZU1hcDIpOyAvLyBSdW4gMiBpdGVyYXRpb25zIHN0YXJ0aW5nIGluIHRoZSBzdG9wIHN0YXRlXG5cbiAgICAgIHZhciByZXMxID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgZWRnZXNTdGF0ZSwgc3RvcFNpemUsIDIpO1xuICAgICAgdmFyIHJlczIgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwMiwgZWRnZXNTdGF0ZTIsIHN0b3BTaXplLCAyKTsgLy8gSXMgYW55IG9mIHRoZSAyIHJlc3VsdHMgdGhlIGJlc3QgY3V0IHNvIGZhcj9cblxuICAgICAgaWYgKHJlczEubGVuZ3RoIDw9IHJlczIubGVuZ3RoICYmIHJlczEubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMS5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMTtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzMi5sZW5ndGggPD0gcmVzMS5sZW5ndGggJiYgcmVzMi5sZW5ndGggPCBtaW5DdXRTaXplKSB7XG4gICAgICAgIG1pbkN1dFNpemUgPSByZXMyLmxlbmd0aDtcbiAgICAgICAgbWluQ3V0RWRnZUluZGV4ZXMgPSByZXMyO1xuICAgICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAyLCBtaW5DdXROb2RlTWFwKTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBvZiBtYWluIGxvb3BcbiAgICAvLyBDb25zdHJ1Y3QgcmVzdWx0XG5cblxuICAgIHZhciBjdXQgPSB0aGlzLnNwYXduKG1pbkN1dEVkZ2VJbmRleGVzLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGVkZ2VzW2VbMF1dO1xuICAgIH0pKTtcbiAgICB2YXIgcGFydGl0aW9uMSA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgcGFydGl0aW9uMiA9IHRoaXMuc3Bhd24oKTsgLy8gdHJhdmVyc2UgbWV0YU5vZGVNYXAgZm9yIGJlc3QgY3V0XG5cbiAgICB2YXIgd2l0bmVzc05vZGVQYXJ0aXRpb24gPSBtaW5DdXROb2RlTWFwWzBdO1xuXG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbWluQ3V0Tm9kZU1hcC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgcGFydGl0aW9uSWQgPSBtaW5DdXROb2RlTWFwW19pNV07XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW19pNV07XG5cbiAgICAgIGlmIChwYXJ0aXRpb25JZCA9PT0gd2l0bmVzc05vZGVQYXJ0aXRpb24pIHtcbiAgICAgICAgcGFydGl0aW9uMS5tZXJnZShub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRpdGlvbjIubWVyZ2Uobm9kZSk7XG4gICAgICB9XG4gICAgfSAvLyBjb25zdHJ1Y3QgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGlzam9pbnQgc3Vic2V0IG9mIG5vZGVzXG5cblxuICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnQgPSBmdW5jdGlvbiBjb25zdHJ1Y3RDb21wb25lbnQoc3Vic2V0KSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuc3Bhd24oKTtcblxuICAgICAgc3Vic2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIC8vIGVuc3VyZSBlZGdlIGlzIHdpdGhpbiBjYWxsaW5nIGNvbGxlY3Rpb24gYW5kIGVkZ2UgaXMgbm90IGluIGN1dFxuICAgICAgICAgIGlmIChfdGhpcy5jb250YWlucyhlZGdlKSAmJiAhY3V0LmNvbnRhaW5zKGVkZ2UpKSB7XG4gICAgICAgICAgICBjb21wb25lbnQubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9O1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbY29uc3RydWN0Q29tcG9uZW50KHBhcnRpdGlvbjEpLCBjb25zdHJ1Y3RDb21wb25lbnQocGFydGl0aW9uMildO1xuICAgIHZhciByZXQgPSB7XG4gICAgICBjdXQ6IGN1dCxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICAvLyBuLmIuIHBhcnRpdGlvbnMgYXJlIGluY2x1ZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIGFwaSBzcGVjXG4gICAgICAvLyAoY291bGQgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciB2ZXJzaW9uKVxuICAgICAgcGFydGl0aW9uMTogcGFydGl0aW9uMSxcbiAgICAgIHBhcnRpdGlvbjI6IHBhcnRpdGlvbjJcbiAgICB9O1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn07IC8vIGVsZXNmblxuXG52YXIgY29weVBvc2l0aW9uID0gZnVuY3Rpb24gY29weVBvc2l0aW9uKHApIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBwLngsXG4gICAgeTogcC55XG4gIH07XG59O1xudmFyIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uID0gZnVuY3Rpb24gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcC54ICogem9vbSArIHBhbi54LFxuICAgIHk6IHAueSAqIHpvb20gKyBwYW4ueVxuICB9O1xufTtcbnZhciByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHAsIHpvb20sIHBhbikge1xuICByZXR1cm4ge1xuICAgIHg6IChwLnggLSBwYW4ueCkgLyB6b29tLFxuICAgIHk6IChwLnkgLSBwYW4ueSkgLyB6b29tXG4gIH07XG59O1xudmFyIGFycmF5MnBvaW50ID0gZnVuY3Rpb24gYXJyYXkycG9pbnQoYXJyKSB7XG4gIHJldHVybiB7XG4gICAgeDogYXJyWzBdLFxuICAgIHk6IGFyclsxXVxuICB9O1xufTtcbnZhciBtaW4gPSBmdW5jdGlvbiBtaW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuXG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcblxuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICBtaW4gPSBNYXRoLm1pbih2YWwsIG1pbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbjtcbn07XG52YXIgbWF4ID0gZnVuY3Rpb24gbWF4KGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciBtYXggPSAtSW5maW5pdHk7XG5cbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuXG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KHZhbCwgbWF4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4O1xufTtcbnZhciBtZWFuID0gZnVuY3Rpb24gbWVhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbiA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuXG4gICAgaWYgKGlzRmluaXRlKHZhbCkpIHtcbiAgICAgIHRvdGFsICs9IHZhbDtcbiAgICAgIG4rKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWwgLyBuO1xufTtcbnZhciBtZWRpYW4gPSBmdW5jdGlvbiBtZWRpYW4oYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIGNvcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzb3J0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgaW5jbHVkZUhvbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuXG4gIGlmIChjb3B5KSB7XG4gICAgYXJyID0gYXJyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChlbmQgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBhcnIuc3BsaWNlKGVuZCwgYXJyLmxlbmd0aCAtIGVuZCk7XG4gICAgfVxuXG4gICAgaWYgKGJlZ2luID4gMCkge1xuICAgICAgYXJyLnNwbGljZSgwLCBiZWdpbik7XG4gICAgfVxuICB9IC8vIGFsbCBub24gZmluaXRlIChlLmcuIEluZmluaXR5LCBOYU4pIGVsZW1lbnRzIG11c3QgYmUgLUluZmluaXR5IHNvIHRoZXkgZ28gdG8gdGhlIHN0YXJ0XG5cblxuICB2YXIgb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gbm9uLWZpbml0ZSB2YWx1ZXNcblxuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHYgPSBhcnJbaV07XG5cbiAgICBpZiAoaW5jbHVkZUhvbGVzKSB7XG4gICAgICBpZiAoIWlzRmluaXRlKHYpKSB7XG4gICAgICAgIGFycltpXSA9IC1JbmZpbml0eTtcbiAgICAgICAgb2ZmKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3QgcmVtb3ZlIGl0IGlmIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgaG9sZXNcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNvcnQpIHtcbiAgICBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pOyAvLyByZXF1aXJlcyBjb3B5ID0gdHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIG9yaWdcbiAgfVxuXG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgbWlkID0gTWF0aC5mbG9vcihsZW4gLyAyKTtcblxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHJldHVybiBhcnJbbWlkICsgMSArIG9mZl07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChhcnJbbWlkIC0gMSArIG9mZl0gKyBhcnJbbWlkICsgb2ZmXSkgLyAyO1xuICB9XG59O1xudmFyIGRlZzJyYWQgPSBmdW5jdGlvbiBkZWcycmFkKGRlZykge1xuICByZXR1cm4gTWF0aC5QSSAqIGRlZyAvIDE4MDtcbn07XG52YXIgZ2V0QW5nbGVGcm9tRGlzcCA9IGZ1bmN0aW9uIGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKSB7XG4gIHJldHVybiBNYXRoLmF0YW4yKGRpc3BZLCBkaXNwWCkgLSBNYXRoLlBJIC8gMjtcbn07XG52YXIgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbiAobikge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyBNYXRoLmxvZygyKTtcbn07XG52YXIgc2lnbnVtID0gZnVuY3Rpb24gc2lnbnVtKHgpIHtcbiAgaWYgKHggPiAwKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoeCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZGlzdCA9IGZ1bmN0aW9uIGRpc3QocDEsIHAyKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaXN0KHAxLCBwMikpO1xufTtcbnZhciBzcWRpc3QgPSBmdW5jdGlvbiBzcWRpc3QocDEsIHAyKSB7XG4gIHZhciBkeCA9IHAyLnggLSBwMS54O1xuICB2YXIgZHkgPSBwMi55IC0gcDEueTtcbiAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufTtcbnZhciBpblBsYWNlU3VtTm9ybWFsaXplID0gZnVuY3Rpb24gaW5QbGFjZVN1bU5vcm1hbGl6ZSh2KSB7XG4gIHZhciBsZW5ndGggPSB2Lmxlbmd0aDsgLy8gRmlyc3QsIGdldCBzdW0gb2YgYWxsIGVsZW1lbnRzXG5cbiAgdmFyIHRvdGFsID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gdltpXTtcbiAgfSAvLyBOb3csIGRpdmlkZSBlYWNoIGJ5IHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzXG5cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuZ3RoOyBfaSsrKSB7XG4gICAgdltfaV0gPSB2W19pXSAvIHRvdGFsO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59O1xuXG52YXIgcWJlemllckF0ID0gZnVuY3Rpb24gcWJlemllckF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpICogcDAgKyAyICogKDEgLSB0KSAqIHQgKiBwMSArIHQgKiB0ICogcDI7XG59O1xudmFyIHFiZXppZXJQdEF0ID0gZnVuY3Rpb24gcWJlemllclB0QXQocDAsIHAxLCBwMiwgdCkge1xuICByZXR1cm4ge1xuICAgIHg6IHFiZXppZXJBdChwMC54LCBwMS54LCBwMi54LCB0KSxcbiAgICB5OiBxYmV6aWVyQXQocDAueSwgcDEueSwgcDIueSwgdClcbiAgfTtcbn07XG52YXIgbGluZUF0ID0gZnVuY3Rpb24gbGluZUF0KHAwLCBwMSwgdCwgZCkge1xuICB2YXIgdmVjID0ge1xuICAgIHg6IHAxLnggLSBwMC54LFxuICAgIHk6IHAxLnkgLSBwMC55XG4gIH07XG4gIHZhciB2ZWNEaXN0ID0gZGlzdChwMCwgcDEpO1xuICB2YXIgbm9ybVZlYyA9IHtcbiAgICB4OiB2ZWMueCAvIHZlY0Rpc3QsXG4gICAgeTogdmVjLnkgLyB2ZWNEaXN0XG4gIH07XG4gIHQgPSB0ID09IG51bGwgPyAwIDogdDtcbiAgZCA9IGQgIT0gbnVsbCA/IGQgOiB0ICogdmVjRGlzdDtcbiAgcmV0dXJuIHtcbiAgICB4OiBwMC54ICsgbm9ybVZlYy54ICogZCxcbiAgICB5OiBwMC55ICsgbm9ybVZlYy55ICogZFxuICB9O1xufTtcbnZhciBib3VuZCA9IGZ1bmN0aW9uIGJvdW5kKG1pbiwgdmFsLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbn07IC8vIG1ha2VzIGEgZnVsbCBiYiAoeDEsIHkxLCB4MiwgeTIsIHcsIGgpIGZyb20gaW1wbGljaXQgcGFyYW1zXG5cbnZhciBtYWtlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBtYWtlQm91bmRpbmdCb3goYmIpIHtcbiAgaWYgKGJiID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IEluZmluaXR5LFxuICAgICAgeTE6IEluZmluaXR5LFxuICAgICAgeDI6IC1JbmZpbml0eSxcbiAgICAgIHkyOiAtSW5maW5pdHksXG4gICAgICB3OiAwLFxuICAgICAgaDogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAoYmIueDEgIT0gbnVsbCAmJiBiYi55MSAhPSBudWxsKSB7XG4gICAgaWYgKGJiLngyICE9IG51bGwgJiYgYmIueTIgIT0gbnVsbCAmJiBiYi54MiA+PSBiYi54MSAmJiBiYi55MiA+PSBiYi55MSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IGJiLngxLFxuICAgICAgICB5MTogYmIueTEsXG4gICAgICAgIHgyOiBiYi54MixcbiAgICAgICAgeTI6IGJiLnkyLFxuICAgICAgICB3OiBiYi54MiAtIGJiLngxLFxuICAgICAgICBoOiBiYi55MiAtIGJiLnkxXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoYmIudyAhPSBudWxsICYmIGJiLmggIT0gbnVsbCAmJiBiYi53ID49IDAgJiYgYmIuaCA+PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4MTogYmIueDEsXG4gICAgICAgIHkxOiBiYi55MSxcbiAgICAgICAgeDI6IGJiLngxICsgYmIudyxcbiAgICAgICAgeTI6IGJiLnkxICsgYmIuaCxcbiAgICAgICAgdzogYmIudyxcbiAgICAgICAgaDogYmIuaFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG52YXIgY29weUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gY29weUJvdW5kaW5nQm94KGJiKSB7XG4gIHJldHVybiB7XG4gICAgeDE6IGJiLngxLFxuICAgIHgyOiBiYi54MixcbiAgICB3OiBiYi53LFxuICAgIHkxOiBiYi55MSxcbiAgICB5MjogYmIueTIsXG4gICAgaDogYmIuaFxuICB9O1xufTtcbnZhciBjbGVhckJvdW5kaW5nQm94ID0gZnVuY3Rpb24gY2xlYXJCb3VuZGluZ0JveChiYikge1xuICBiYi54MSA9IEluZmluaXR5O1xuICBiYi55MSA9IEluZmluaXR5O1xuICBiYi54MiA9IC1JbmZpbml0eTtcbiAgYmIueTIgPSAtSW5maW5pdHk7XG4gIGJiLncgPSAwO1xuICBiYi5oID0gMDtcbn07XG52YXIgdXBkYXRlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZGluZ0JveChiYjEsIGJiMikge1xuICAvLyB1cGRhdGUgYmIxIHdpdGggYmIyIGJvdW5kc1xuICBiYjEueDEgPSBNYXRoLm1pbihiYjEueDEsIGJiMi54MSk7XG4gIGJiMS54MiA9IE1hdGgubWF4KGJiMS54MiwgYmIyLngyKTtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS55MSA9IE1hdGgubWluKGJiMS55MSwgYmIyLnkxKTtcbiAgYmIxLnkyID0gTWF0aC5tYXgoYmIxLnkyLCBiYjIueTIpO1xuICBiYjEuaCA9IGJiMS55MiAtIGJiMS55MTtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3hCeVBvaW50ID0gZnVuY3Rpb24gZXhwYW5kQm91bmRpbmdCb3hCeVBvaW50KGJiLCB4LCB5KSB7XG4gIGJiLngxID0gTWF0aC5taW4oYmIueDEsIHgpO1xuICBiYi54MiA9IE1hdGgubWF4KGJiLngyLCB4KTtcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLnkxID0gTWF0aC5taW4oYmIueTEsIHkpO1xuICBiYi55MiA9IE1hdGgubWF4KGJiLnkyLCB5KTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gZXhwYW5kQm91bmRpbmdCb3goYmIpIHtcbiAgdmFyIHBhZGRpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIGJiLngxIC09IHBhZGRpbmc7XG4gIGJiLngyICs9IHBhZGRpbmc7XG4gIGJiLnkxIC09IHBhZGRpbmc7XG4gIGJiLnkyICs9IHBhZGRpbmc7XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgcmV0dXJuIGJiO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveFNpZGVzID0gZnVuY3Rpb24gZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYikge1xuICB2YXIgcGFkZGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzBdO1xuICB2YXIgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0O1xuXG4gIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMSkge1xuICAgIHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gbGVmdCA9IHBhZGRpbmdbMF07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDIpIHtcbiAgICB0b3AgPSBib3R0b20gPSBwYWRkaW5nWzBdO1xuICAgIGxlZnQgPSByaWdodCA9IHBhZGRpbmdbMV07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDQpIHtcbiAgICB2YXIgX3BhZGRpbmcgPSBfc2xpY2VkVG9BcnJheShwYWRkaW5nLCA0KTtcblxuICAgIHRvcCA9IF9wYWRkaW5nWzBdO1xuICAgIHJpZ2h0ID0gX3BhZGRpbmdbMV07XG4gICAgYm90dG9tID0gX3BhZGRpbmdbMl07XG4gICAgbGVmdCA9IF9wYWRkaW5nWzNdO1xuICB9XG5cbiAgYmIueDEgLT0gbGVmdDtcbiAgYmIueDIgKz0gcmlnaHQ7XG4gIGJiLnkxIC09IHRvcDtcbiAgYmIueTIgKz0gYm90dG9tO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIHJldHVybiBiYjtcbn07XG5cbnZhciBhc3NpZ25Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGFzc2lnbkJvdW5kaW5nQm94KGJiMSwgYmIyKSB7XG4gIGJiMS54MSA9IGJiMi54MTtcbiAgYmIxLnkxID0gYmIyLnkxO1xuICBiYjEueDIgPSBiYjIueDI7XG4gIGJiMS55MiA9IGJiMi55MjtcbiAgYmIxLncgPSBiYjEueDIgLSBiYjEueDE7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBib3VuZGluZ0JveGVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYjEsIGJiMikge1xuICAvLyBjYXNlOiBvbmUgYmIgdG8gcmlnaHQgb2Ygb3RoZXJcbiAgaWYgKGJiMS54MSA+IGJiMi54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChiYjIueDEgPiBiYjEueDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gY2FzZTogb25lIGJiIHRvIGxlZnQgb2Ygb3RoZXJcblxuXG4gIGlmIChiYjEueDIgPCBiYjIueDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYmIyLngyIDwgYmIxLngxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGNhc2U6IG9uZSBiYiBhYm92ZSBvdGhlclxuXG5cbiAgaWYgKGJiMS55MiA8IGJiMi55MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChiYjIueTIgPCBiYjEueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gY2FzZTogb25lIGJiIGJlbG93IG90aGVyXG5cblxuICBpZiAoYmIxLnkxID4gYmIyLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGJiMi55MSA+IGJiMS55Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBvdGhlcndpc2UsIG11c3QgaGF2ZSBzb21lIG92ZXJsYXBcblxuXG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBpbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkge1xuICByZXR1cm4gYmIueDEgPD0geCAmJiB4IDw9IGJiLngyICYmIGJiLnkxIDw9IHkgJiYgeSA8PSBiYi55Mjtcbn07XG52YXIgcG9pbnRJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gcG9pbnRJbkJvdW5kaW5nQm94KGJiLCBwdCkge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYiwgcHQueCwgcHQueSk7XG59O1xudmFyIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYjEsIGJiMi54MSwgYmIyLnkxKSAmJiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngyLCBiYjIueTIpO1xufTtcbnZhciByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyOyAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggc3RyYWlnaHQgbGluZSBzZWdtZW50c1xuXG4gIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zOyAvLyBUb3Agc2VnbWVudCwgbGVmdCB0byByaWdodFxuXG4gIHtcbiAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH0gLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuXG4gIHtcbiAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuXG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgfVxuICB9IC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG5cbiAge1xuICAgIHZhciBib3R0b21TdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFkgPSBib3R0b21TdGFydFk7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcblxuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfSAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cblxuICB7XG4gICAgdmFyIGxlZnRTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFg7XG4gICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzXG5cbiAgdmFyIGFyY0ludGVyc2VjdGlvbnM7IC8vIFRvcCBMZWZ0XG5cbiAge1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciB0b3BMZWZ0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7IC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9IC8vIFRvcCBSaWdodFxuXG4gIHtcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIHRvcFJpZ2h0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTsgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG5cbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPj0gdG9wUmlnaHRDZW50ZXJYICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wUmlnaHRDZW50ZXJZKSB7XG4gICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgIH1cbiAgfSAvLyBCb3R0b20gUmlnaHRcblxuICB7XG4gICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzO1xuICAgIHZhciBib3R0b21SaWdodENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXM7XG4gICAgYXJjSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgbm9kZVgsIG5vZGVZLCBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7IC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWCAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH0gLy8gQm90dG9tIExlZnRcblxuICB7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzO1xuICAgIGFyY0ludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTsgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG5cbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdOyAvLyBpZiBub3RoaW5nXG59O1xudmFyIGluTGluZVZpY2luaXR5ID0gZnVuY3Rpb24gaW5MaW5lVmljaW5pdHkoeCwgeSwgbHgxLCBseTEsIGx4MiwgbHkyLCB0b2xlcmFuY2UpIHtcbiAgdmFyIHQgPSB0b2xlcmFuY2U7XG4gIHZhciB4MSA9IE1hdGgubWluKGx4MSwgbHgyKTtcbiAgdmFyIHgyID0gTWF0aC5tYXgobHgxLCBseDIpO1xuICB2YXIgeTEgPSBNYXRoLm1pbihseTEsIGx5Mik7XG4gIHZhciB5MiA9IE1hdGgubWF4KGx5MSwgbHkyKTtcbiAgcmV0dXJuIHgxIC0gdCA8PSB4ICYmIHggPD0geDIgKyB0ICYmIHkxIC0gdCA8PSB5ICYmIHkgPD0geTIgKyB0O1xufTtcbnZhciBpbkJlemllclZpY2luaXR5ID0gZnVuY3Rpb24gaW5CZXppZXJWaWNpbml0eSh4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB0b2xlcmFuY2UpIHtcbiAgdmFyIGJiID0ge1xuICAgIHgxOiBNYXRoLm1pbih4MSwgeDMsIHgyKSAtIHRvbGVyYW5jZSxcbiAgICB4MjogTWF0aC5tYXgoeDEsIHgzLCB4MikgKyB0b2xlcmFuY2UsXG4gICAgeTE6IE1hdGgubWluKHkxLCB5MywgeTIpIC0gdG9sZXJhbmNlLFxuICAgIHkyOiBNYXRoLm1heCh5MSwgeTMsIHkyKSArIHRvbGVyYW5jZVxuICB9OyAvLyBpZiBvdXRzaWRlIHRoZSByb3VnaCBib3VuZGluZyBib3ggZm9yIHRoZSBiZXppZXIsIHRoZW4gaXQgY2FuJ3QgYmUgYSBoaXRcblxuICBpZiAoeCA8IGJiLngxIHx8IHggPiBiYi54MiB8fCB5IDwgYmIueTEgfHwgeSA+IGJiLnkyKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2JlemllciBvdXQgb2Ygcm91Z2ggYmInKVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBjb25zb2xlLmxvZygnZG8gbW9yZSBleHBlbnNpdmUgY2hlY2snKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbnZhciBzb2x2ZVF1YWRyYXRpYyA9IGZ1bmN0aW9uIHNvbHZlUXVhZHJhdGljKGEsIGIsIGMsIHZhbCkge1xuICBjIC09IHZhbDtcbiAgdmFyIHIgPSBiICogYiAtIDQgKiBhICogYztcblxuICBpZiAociA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgc3FydFIgPSBNYXRoLnNxcnQocik7XG4gIHZhciBkZW5vbSA9IDIgKiBhO1xuICB2YXIgcm9vdDEgPSAoLWIgKyBzcXJ0UikgLyBkZW5vbTtcbiAgdmFyIHJvb3QyID0gKC1iIC0gc3FydFIpIC8gZGVub207XG4gIHJldHVybiBbcm9vdDEsIHJvb3QyXTtcbn07XG52YXIgc29sdmVDdWJpYyA9IGZ1bmN0aW9uIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcmVzdWx0KSB7XG4gIC8vIFNvbHZlcyBhIGN1YmljIGZ1bmN0aW9uLCByZXR1cm5zIHJvb3QgaW4gZm9ybSBbcjEsIGkxLCByMiwgaTIsIHIzLCBpM10sIHdoZXJlXG4gIC8vIHIgaXMgdGhlIHJlYWwgY29tcG9uZW50LCBpIGlzIHRoZSBpbWFnaW5hcnkgY29tcG9uZW50XG4gIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXJkYW5vIG1ldGhvZCBmcm9tIHRoZSB5ZWFyIDE1NDVcbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19mdW5jdGlvbiNUaGVfbmF0dXJlX29mX3RoZV9yb290c1xuICB2YXIgZXBzaWxvbiA9IDAuMDAwMDE7IC8vIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gd2hpbGUga2VlcGluZyB0aGUgb3ZlcmFsbCBleHByZXNzaW9uIGNsb3NlIGluIHZhbHVlXG5cbiAgaWYgKGEgPT09IDApIHtcbiAgICBhID0gZXBzaWxvbjtcbiAgfVxuXG4gIGIgLz0gYTtcbiAgYyAvPSBhO1xuICBkIC89IGE7XG4gIHZhciBkaXNjcmltaW5hbnQsIHEsIHIsIGR1bTEsIHMsIHQsIHRlcm0xLCByMTM7XG4gIHEgPSAoMy4wICogYyAtIGIgKiBiKSAvIDkuMDtcbiAgciA9IC0oMjcuMCAqIGQpICsgYiAqICg5LjAgKiBjIC0gMi4wICogKGIgKiBiKSk7XG4gIHIgLz0gNTQuMDtcbiAgZGlzY3JpbWluYW50ID0gcSAqIHEgKiBxICsgciAqIHI7XG4gIHJlc3VsdFsxXSA9IDA7XG4gIHRlcm0xID0gYiAvIDMuMDtcblxuICBpZiAoZGlzY3JpbWluYW50ID4gMCkge1xuICAgIHMgPSByICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCk7XG4gICAgcyA9IHMgPCAwID8gLU1hdGgucG93KC1zLCAxLjAgLyAzLjApIDogTWF0aC5wb3cocywgMS4wIC8gMy4wKTtcbiAgICB0ID0gciAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHQgPSB0IDwgMCA/IC1NYXRoLnBvdygtdCwgMS4wIC8gMy4wKSA6IE1hdGgucG93KHQsIDEuMCAvIDMuMCk7XG4gICAgcmVzdWx0WzBdID0gLXRlcm0xICsgcyArIHQ7XG4gICAgdGVybTEgKz0gKHMgKyB0KSAvIDIuMDtcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtdGVybTE7XG4gICAgdGVybTEgPSBNYXRoLnNxcnQoMy4wKSAqICgtdCArIHMpIC8gMjtcbiAgICByZXN1bHRbM10gPSB0ZXJtMTtcbiAgICByZXN1bHRbNV0gPSAtdGVybTE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVzdWx0WzVdID0gcmVzdWx0WzNdID0gMDtcblxuICBpZiAoZGlzY3JpbWluYW50ID09PSAwKSB7XG4gICAgcjEzID0gciA8IDAgPyAtTWF0aC5wb3coLXIsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyhyLCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIDIuMCAqIHIxMztcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtKHIxMyArIHRlcm0xKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBxID0gLXE7XG4gIGR1bTEgPSBxICogcSAqIHE7XG4gIGR1bTEgPSBNYXRoLmFjb3MociAvIE1hdGguc3FydChkdW0xKSk7XG4gIHIxMyA9IDIuMCAqIE1hdGguc3FydChxKTtcbiAgcmVzdWx0WzBdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoZHVtMSAvIDMuMCk7XG4gIHJlc3VsdFsyXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKChkdW0xICsgMi4wICogTWF0aC5QSSkgLyAzLjApO1xuICByZXN1bHRbNF0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDQuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmV0dXJuO1xufTtcbnZhciBzcWRpc3RUb1F1YWRyYXRpY0JlemllciA9IGZ1bmN0aW9uIHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgLy8gRmluZCBtaW5pbXVtIGRpc3RhbmNlIGJ5IHVzaW5nIHRoZSBtaW5pbXVtIG9mIHRoZSBkaXN0YW5jZVxuICAvLyBmdW5jdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludCBhbmQgdGhlIGN1cnZlXG4gIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcmVzdWx0aW5nIGN1YmljIGVxdWF0aW9uXG4gIC8vIHdob3NlIHJvb3RzIHRlbGwgdXMgd2hlcmUgYSBwb3NzaWJsZSBtaW5pbXVtIGlzXG4gIC8vIChDb2VmZmljaWVudHMgYXJlIGRpdmlkZWQgYnkgNClcbiAgdmFyIGEgPSAxLjAgKiB4MSAqIHgxIC0gNCAqIHgxICogeDIgKyAyICogeDEgKiB4MyArIDQgKiB4MiAqIHgyIC0gNCAqIHgyICogeDMgKyB4MyAqIHgzICsgeTEgKiB5MSAtIDQgKiB5MSAqIHkyICsgMiAqIHkxICogeTMgKyA0ICogeTIgKiB5MiAtIDQgKiB5MiAqIHkzICsgeTMgKiB5MztcbiAgdmFyIGIgPSAxLjAgKiA5ICogeDEgKiB4MiAtIDMgKiB4MSAqIHgxIC0gMyAqIHgxICogeDMgLSA2ICogeDIgKiB4MiArIDMgKiB4MiAqIHgzICsgOSAqIHkxICogeTIgLSAzICogeTEgKiB5MSAtIDMgKiB5MSAqIHkzIC0gNiAqIHkyICogeTIgKyAzICogeTIgKiB5MztcbiAgdmFyIGMgPSAxLjAgKiAzICogeDEgKiB4MSAtIDYgKiB4MSAqIHgyICsgeDEgKiB4MyAtIHgxICogeCArIDIgKiB4MiAqIHgyICsgMiAqIHgyICogeCAtIHgzICogeCArIDMgKiB5MSAqIHkxIC0gNiAqIHkxICogeTIgKyB5MSAqIHkzIC0geTEgKiB5ICsgMiAqIHkyICogeTIgKyAyICogeTIgKiB5IC0geTMgKiB5O1xuICB2YXIgZCA9IDEuMCAqIHgxICogeDIgLSB4MSAqIHgxICsgeDEgKiB4IC0geDIgKiB4ICsgeTEgKiB5MiAtIHkxICogeTEgKyB5MSAqIHkgLSB5MiAqIHk7IC8vIGRlYnVnKFwiY29lZmZpY2llbnRzOiBcIiArIGEgLyBhICsgXCIsIFwiICsgYiAvIGEgKyBcIiwgXCIgKyBjIC8gYSArIFwiLCBcIiArIGQgLyBhKTtcblxuICB2YXIgcm9vdHMgPSBbXTsgLy8gVXNlIHRoZSBjdWJpYyBzb2x2aW5nIGFsZ29yaXRobVxuXG4gIHNvbHZlQ3ViaWMoYSwgYiwgYywgZCwgcm9vdHMpO1xuICB2YXIgemVyb1RocmVzaG9sZCA9IDAuMDAwMDAwMTtcbiAgdmFyIHBhcmFtcyA9IFtdO1xuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCArPSAyKSB7XG4gICAgaWYgKE1hdGguYWJzKHJvb3RzW2luZGV4ICsgMV0pIDwgemVyb1RocmVzaG9sZCAmJiByb290c1tpbmRleF0gPj0gMCAmJiByb290c1tpbmRleF0gPD0gMS4wKSB7XG4gICAgICBwYXJhbXMucHVzaChyb290c1tpbmRleF0pO1xuICAgIH1cbiAgfVxuXG4gIHBhcmFtcy5wdXNoKDEuMCk7XG4gIHBhcmFtcy5wdXNoKDAuMCk7XG4gIHZhciBtaW5EaXN0YW5jZVNxdWFyZWQgPSAtMTtcbiAgdmFyIGN1clgsIGN1clksIGRpc3RTcXVhcmVkO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VyWCA9IE1hdGgucG93KDEuMCAtIHBhcmFtc1tpXSwgMi4wKSAqIHgxICsgMi4wICogKDEgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeDIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB4MztcbiAgICBjdXJZID0gTWF0aC5wb3coMSAtIHBhcmFtc1tpXSwgMi4wKSAqIHkxICsgMiAqICgxLjAgLSBwYXJhbXNbaV0pICogcGFyYW1zW2ldICogeTIgKyBwYXJhbXNbaV0gKiBwYXJhbXNbaV0gKiB5MztcbiAgICBkaXN0U3F1YXJlZCA9IE1hdGgucG93KGN1clggLSB4LCAyKSArIE1hdGgucG93KGN1clkgLSB5LCAyKTsgLy8gZGVidWcoJ2Rpc3RhbmNlIGZvciBwYXJhbSAnICsgcGFyYW1zW2ldICsgXCI6IFwiICsgTWF0aC5zcXJ0KGRpc3RTcXVhcmVkKSk7XG5cbiAgICBpZiAobWluRGlzdGFuY2VTcXVhcmVkID49IDApIHtcbiAgICAgIGlmIChkaXN0U3F1YXJlZCA8IG1pbkRpc3RhbmNlU3F1YXJlZCkge1xuICAgICAgICBtaW5EaXN0YW5jZVNxdWFyZWQgPSBkaXN0U3F1YXJlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbkRpc3RhbmNlU3F1YXJlZDtcbn07XG52YXIgc3FkaXN0VG9GaW5pdGVMaW5lID0gZnVuY3Rpb24gc3FkaXN0VG9GaW5pdGVMaW5lKHgsIHksIHgxLCB5MSwgeDIsIHkyKSB7XG4gIHZhciBvZmZzZXQgPSBbeCAtIHgxLCB5IC0geTFdO1xuICB2YXIgbGluZSA9IFt4MiAtIHgxLCB5MiAtIHkxXTtcbiAgdmFyIGxpbmVTcSA9IGxpbmVbMF0gKiBsaW5lWzBdICsgbGluZVsxXSAqIGxpbmVbMV07XG4gIHZhciBoeXBTcSA9IG9mZnNldFswXSAqIG9mZnNldFswXSArIG9mZnNldFsxXSAqIG9mZnNldFsxXTtcbiAgdmFyIGRvdFByb2R1Y3QgPSBvZmZzZXRbMF0gKiBsaW5lWzBdICsgb2Zmc2V0WzFdICogbGluZVsxXTtcbiAgdmFyIGFkalNxID0gZG90UHJvZHVjdCAqIGRvdFByb2R1Y3QgLyBsaW5lU3E7XG5cbiAgaWYgKGRvdFByb2R1Y3QgPCAwKSB7XG4gICAgcmV0dXJuIGh5cFNxO1xuICB9XG5cbiAgaWYgKGFkalNxID4gbGluZVNxKSB7XG4gICAgcmV0dXJuICh4IC0geDIpICogKHggLSB4MikgKyAoeSAtIHkyKSAqICh5IC0geTIpO1xuICB9XG5cbiAgcmV0dXJuIGh5cFNxIC0gYWRqU3E7XG59O1xudmFyIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpIHtcbiAgdmFyIHgxLCB5MSwgeDIsIHkyO1xuICB2YXIgeTM7IC8vIEludGVyc2VjdCB3aXRoIHZlcnRpY2FsIGxpbmUgdGhyb3VnaCAoeCwgeSlcblxuICB2YXIgdXAgPSAwOyAvLyBsZXQgZG93biA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgeDEgPSBwb2ludHNbaSAqIDJdO1xuICAgIHkxID0gcG9pbnRzW2kgKiAyICsgMV07XG5cbiAgICBpZiAoaSArIDEgPCBwb2ludHMubGVuZ3RoIC8gMikge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxKSAqIDIgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgeDIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMl07XG4gICAgICB5MiA9IHBvaW50c1soaSArIDEgLSBwb2ludHMubGVuZ3RoIC8gMikgKiAyICsgMV07XG4gICAgfVxuXG4gICAgaWYgKHgxID09IHggJiYgeDIgPT0geCkgOyBlbHNlIGlmICh4MSA+PSB4ICYmIHggPj0geDIgfHwgeDEgPD0geCAmJiB4IDw9IHgyKSB7XG4gICAgICB5MyA9ICh4IC0geDEpIC8gKHgyIC0geDEpICogKHkyIC0geTEpICsgeTE7XG5cbiAgICAgIGlmICh5MyA+IHkpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH0gLy8gaWYoIHkzIDwgeSApe1xuICAgICAgLy8gZG93bisrO1xuICAgICAgLy8gfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1cCAlIDIgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG52YXIgcG9pbnRJbnNpZGVQb2x5Z29uID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGRpcmVjdGlvbiwgcGFkZGluZykge1xuICB2YXIgdHJhbnNmb3JtZWRQb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGgpOyAvLyBHaXZlcyBuZWdhdGl2ZSBhbmdsZVxuXG4gIHZhciBhbmdsZTtcblxuICBpZiAoZGlyZWN0aW9uWzBdICE9IG51bGwpIHtcbiAgICBhbmdsZSA9IE1hdGguYXRhbihkaXJlY3Rpb25bMV0gLyBkaXJlY3Rpb25bMF0pO1xuXG4gICAgaWYgKGRpcmVjdGlvblswXSA8IDApIHtcbiAgICAgIGFuZ2xlID0gYW5nbGUgKyBNYXRoLlBJIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5nbGUgPSAtYW5nbGUgLSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYW5nbGUgPSBkaXJlY3Rpb247XG4gIH1cblxuICB2YXIgY29zID0gTWF0aC5jb3MoLWFuZ2xlKTtcbiAgdmFyIHNpbiA9IE1hdGguc2luKC1hbmdsZSk7IC8vICAgIGNvbnNvbGUubG9nKFwiYmFzZTogXCIgKyBiYXNlUG9pbnRzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybWVkUG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyXSA9IHdpZHRoIC8gMiAqIChiYXNlUG9pbnRzW2kgKiAyXSAqIGNvcyAtIGJhc2VQb2ludHNbaSAqIDIgKyAxXSAqIHNpbik7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSA9IGhlaWdodCAvIDIgKiAoYmFzZVBvaW50c1tpICogMiArIDFdICogY29zICsgYmFzZVBvaW50c1tpICogMl0gKiBzaW4pO1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyXSArPSBjZW50ZXJYO1xuICAgIHRyYW5zZm9ybWVkUG9pbnRzW2kgKiAyICsgMV0gKz0gY2VudGVyWTtcbiAgfVxuXG4gIHZhciBwb2ludHM7XG5cbiAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgdmFyIGV4cGFuZGVkTGluZVNldCA9IGV4cGFuZFBvbHlnb24odHJhbnNmb3JtZWRQb2ludHMsIC1wYWRkaW5nKTtcbiAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSB0cmFuc2Zvcm1lZFBvaW50cztcbiAgfVxuXG4gIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKTtcbn07XG52YXIgcG9pbnRJbnNpZGVSb3VuZFBvbHlnb24gPSBmdW5jdGlvbiBwb2ludEluc2lkZVJvdW5kUG9seWdvbih4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBjdXRQb2x5Z29uUG9pbnRzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgc3F1YXJlZENvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyAqIGNvcm5lclJhZGl1cztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJhc2VQb2ludHMubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZVV2ID0gdm9pZCAwLFxuICAgICAgICBkZXN0VXYgPSB2b2lkIDA7XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgc291cmNlVXYgPSBiYXNlUG9pbnRzLmxlbmd0aCAtIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZVV2ID0gaSAqIDQgLSAyO1xuICAgIH1cblxuICAgIGRlc3RVdiA9IGkgKiA0ICsgMjtcbiAgICB2YXIgcHggPSBjZW50ZXJYICsgaGFsZlcgKiBiYXNlUG9pbnRzW2kgKiA0XTtcbiAgICB2YXIgcHkgPSBjZW50ZXJZICsgaGFsZkggKiBiYXNlUG9pbnRzW2kgKiA0ICsgMV07XG4gICAgdmFyIGNvc1RoZXRhID0gLWJhc2VQb2ludHNbc291cmNlVXZdICogYmFzZVBvaW50c1tkZXN0VXZdIC0gYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcbiAgICB2YXIgb2Zmc2V0ID0gY29ybmVyUmFkaXVzIC8gTWF0aC50YW4oTWF0aC5hY29zKGNvc1RoZXRhKSAvIDIpO1xuICAgIHZhciBjcDB4ID0gcHggLSBvZmZzZXQgKiBiYXNlUG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY3AweSA9IHB5IC0gb2Zmc2V0ICogYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdO1xuICAgIHZhciBjcDF4ID0gcHggKyBvZmZzZXQgKiBiYXNlUG9pbnRzW2Rlc3RVdl07XG4gICAgdmFyIGNwMXkgPSBweSArIG9mZnNldCAqIGJhc2VQb2ludHNbZGVzdFV2ICsgMV07XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNF0gPSBjcDB4O1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAxXSA9IGNwMHk7XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDJdID0gY3AxeDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgM10gPSBjcDF5O1xuICAgIHZhciBvcnRoeCA9IGJhc2VQb2ludHNbc291cmNlVXYgKyAxXTtcbiAgICB2YXIgb3J0aHkgPSAtYmFzZVBvaW50c1tzb3VyY2VVdl07XG4gICAgdmFyIGNvc0FscGhhID0gb3J0aHggKiBiYXNlUG9pbnRzW2Rlc3RVdl0gKyBvcnRoeSAqIGJhc2VQb2ludHNbZGVzdFV2ICsgMV07XG5cbiAgICBpZiAoY29zQWxwaGEgPCAwKSB7XG4gICAgICBvcnRoeCAqPSAtMTtcbiAgICAgIG9ydGh5ICo9IC0xO1xuICAgIH1cblxuICAgIHZhciBjeCA9IGNwMHggKyBvcnRoeCAqIGNvcm5lclJhZGl1cztcbiAgICB2YXIgY3kgPSBjcDB5ICsgb3J0aHkgKiBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGN4IC0geCwgMikgKyBNYXRoLnBvdyhjeSAtIHksIDIpO1xuXG4gICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBzcXVhcmVkQ29ybmVyUmFkaXVzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFBvbHlnb25Qb2ludHMpO1xufTtcbnZhciBqb2luTGluZXMgPSBmdW5jdGlvbiBqb2luTGluZXMobGluZVNldCkge1xuICB2YXIgdmVydGljZXMgPSBuZXcgQXJyYXkobGluZVNldC5sZW5ndGggLyAyKTtcbiAgdmFyIGN1cnJlbnRMaW5lU3RhcnRYLCBjdXJyZW50TGluZVN0YXJ0WSwgY3VycmVudExpbmVFbmRYLCBjdXJyZW50TGluZUVuZFk7XG4gIHZhciBuZXh0TGluZVN0YXJ0WCwgbmV4dExpbmVTdGFydFksIG5leHRMaW5lRW5kWCwgbmV4dExpbmVFbmRZO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVNldC5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBjdXJyZW50TGluZVN0YXJ0WCA9IGxpbmVTZXRbaSAqIDRdO1xuICAgIGN1cnJlbnRMaW5lU3RhcnRZID0gbGluZVNldFtpICogNCArIDFdO1xuICAgIGN1cnJlbnRMaW5lRW5kWCA9IGxpbmVTZXRbaSAqIDQgKyAyXTtcbiAgICBjdXJyZW50TGluZUVuZFkgPSBsaW5lU2V0W2kgKiA0ICsgM107XG5cbiAgICBpZiAoaSA8IGxpbmVTZXQubGVuZ3RoIC8gNCAtIDEpIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFsoaSArIDEpICogNF07XG4gICAgICBuZXh0TGluZVN0YXJ0WSA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAyXTtcbiAgICAgIG5leHRMaW5lRW5kWSA9IGxpbmVTZXRbKGkgKyAxKSAqIDQgKyAzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dExpbmVTdGFydFggPSBsaW5lU2V0WzBdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WzFdO1xuICAgICAgbmV4dExpbmVFbmRYID0gbGluZVNldFsyXTtcbiAgICAgIG5leHRMaW5lRW5kWSA9IGxpbmVTZXRbM107XG4gICAgfVxuXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KGN1cnJlbnRMaW5lU3RhcnRYLCBjdXJyZW50TGluZVN0YXJ0WSwgY3VycmVudExpbmVFbmRYLCBjdXJyZW50TGluZUVuZFksIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFksIHRydWUpO1xuICAgIHZlcnRpY2VzW2kgKiAyXSA9IGludGVyc2VjdGlvblswXTtcbiAgICB2ZXJ0aWNlc1tpICogMiArIDFdID0gaW50ZXJzZWN0aW9uWzFdO1xuICB9XG5cbiAgcmV0dXJuIHZlcnRpY2VzO1xufTtcbnZhciBleHBhbmRQb2x5Z29uID0gZnVuY3Rpb24gZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkge1xuICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcbiAgdmFyIGN1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFksIG5leHRQb2ludFgsIG5leHRQb2ludFk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgY3VycmVudFBvaW50WCA9IHBvaW50c1tpICogMl07XG4gICAgY3VycmVudFBvaW50WSA9IHBvaW50c1tpICogMiArIDFdO1xuXG4gICAgaWYgKGkgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbKGkgKyAxKSAqIDJdO1xuICAgICAgbmV4dFBvaW50WSA9IHBvaW50c1soaSArIDEpICogMiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0UG9pbnRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFBvaW50WSA9IHBvaW50c1sxXTtcbiAgICB9IC8vIEN1cnJlbnQgbGluZTogW2N1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFldIHRvIFtuZXh0UG9pbnRYLCBuZXh0UG9pbnRZXVxuICAgIC8vIEFzc3VtZSBDQ1cgcG9seWdvbiB3aW5kaW5nXG5cblxuICAgIHZhciBvZmZzZXRYID0gbmV4dFBvaW50WSAtIGN1cnJlbnRQb2ludFk7XG4gICAgdmFyIG9mZnNldFkgPSAtKG5leHRQb2ludFggLSBjdXJyZW50UG9pbnRYKTsgLy8gTm9ybWFsaXplXG5cbiAgICB2YXIgb2Zmc2V0TGVuZ3RoID0gTWF0aC5zcXJ0KG9mZnNldFggKiBvZmZzZXRYICsgb2Zmc2V0WSAqIG9mZnNldFkpO1xuICAgIHZhciBub3JtYWxpemVkT2Zmc2V0WCA9IG9mZnNldFggLyBvZmZzZXRMZW5ndGg7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRZID0gb2Zmc2V0WSAvIG9mZnNldExlbmd0aDtcbiAgICBleHBhbmRlZExpbmVTZXRbaSAqIDRdID0gY3VycmVudFBvaW50WCArIG5vcm1hbGl6ZWRPZmZzZXRYICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDFdID0gY3VycmVudFBvaW50WSArIG5vcm1hbGl6ZWRPZmZzZXRZICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDJdID0gbmV4dFBvaW50WCArIG5vcm1hbGl6ZWRPZmZzZXRYICogcGFkO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNCArIDNdID0gbmV4dFBvaW50WSArIG5vcm1hbGl6ZWRPZmZzZXRZICogcGFkO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkTGluZVNldDtcbn07XG52YXIgaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBlbGxpcHNlV3JhZGl1cywgZWxsaXBzZUhyYWRpdXMpIHtcbiAgdmFyIGRpc3BYID0gY2VudGVyWCAtIHg7XG4gIHZhciBkaXNwWSA9IGNlbnRlclkgLSB5O1xuICBkaXNwWCAvPSBlbGxpcHNlV3JhZGl1cztcbiAgZGlzcFkgLz0gZWxsaXBzZUhyYWRpdXM7XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoZGlzcFggKiBkaXNwWCArIGRpc3BZICogZGlzcFkpO1xuICB2YXIgbmV3TGVuZ3RoID0gbGVuIC0gMTtcblxuICBpZiAobmV3TGVuZ3RoIDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5Qcm9wb3J0aW9uID0gbmV3TGVuZ3RoIC8gbGVuO1xuICByZXR1cm4gWyhjZW50ZXJYIC0geCkgKiBsZW5Qcm9wb3J0aW9uICsgeCwgKGNlbnRlclkgLSB5KSAqIGxlblByb3BvcnRpb24gKyB5XTtcbn07XG52YXIgY2hlY2tJbkVsbGlwc2UgPSBmdW5jdGlvbiBjaGVja0luRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwYWRkaW5nKSB7XG4gIHggLT0gY2VudGVyWDtcbiAgeSAtPSBjZW50ZXJZO1xuICB4IC89IHdpZHRoIC8gMiArIHBhZGRpbmc7XG4gIHkgLz0gaGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gIHJldHVybiB4ICogeCArIHkgKiB5IDw9IDE7XG59OyAvLyBSZXR1cm5zIGludGVyc2VjdGlvbnMgb2YgaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIGxpbmUncyBzdGFydCBwb2ludFxuXG52YXIgaW50ZXJzZWN0TGluZUNpcmNsZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVDaXJjbGUoeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cykge1xuICAvLyBDYWxjdWxhdGUgZCwgZGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdOyAvLyBEaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcblxuICB2YXIgZiA9IFt4MSAtIGNlbnRlclgsIHkxIC0gY2VudGVyWV07XG4gIHZhciBhID0gZFswXSAqIGRbMF0gKyBkWzFdICogZFsxXTtcbiAgdmFyIGIgPSAyICogKGZbMF0gKiBkWzBdICsgZlsxXSAqIGRbMV0pO1xuICB2YXIgYyA9IGZbMF0gKiBmWzBdICsgZlsxXSAqIGZbMV0gLSByYWRpdXMgKiByYWRpdXM7XG4gIHZhciBkaXNjcmltaW5hbnQgPSBiICogYiAtIDQgKiBhICogYztcblxuICBpZiAoZGlzY3JpbWluYW50IDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgdmFyIHRNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuICB2YXIgaW5SYW5nZVBhcmFtcyA9IFtdO1xuXG4gIGlmICh0TWluID49IDAgJiYgdE1pbiA8PSAxKSB7XG4gICAgaW5SYW5nZVBhcmFtcy5wdXNoKHRNaW4pO1xuICB9XG5cbiAgaWYgKHRNYXggPj0gMCAmJiB0TWF4IDw9IDEpIHtcbiAgICBpblJhbmdlUGFyYW1zLnB1c2godE1heCk7XG4gIH1cblxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbmVhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzBdICogZFswXSArIHgxO1xuICB2YXIgbmVhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzBdICogZFsxXSArIHkxO1xuXG4gIGlmIChpblJhbmdlUGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoaW5SYW5nZVBhcmFtc1swXSA9PSBpblJhbmdlUGFyYW1zWzFdKSB7XG4gICAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1sxXSAqIGRbMF0gKyB4MTtcbiAgICAgIHZhciBmYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1sxXSAqIGRbMV0gKyB5MTtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZLCBmYXJJbnRlcnNlY3Rpb25YLCBmYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblldO1xuICB9XG59O1xudmFyIG1pZE9mVGhyZWUgPSBmdW5jdGlvbiBtaWRPZlRocmVlKGEsIGIsIGMpIHtcbiAgaWYgKGIgPD0gYSAmJiBhIDw9IGMgfHwgYyA8PSBhICYmIGEgPD0gYikge1xuICAgIHJldHVybiBhO1xuICB9IGVsc2UgaWYgKGEgPD0gYiAmJiBiIDw9IGMgfHwgYyA8PSBiICYmIGIgPD0gYSkge1xuICAgIHJldHVybiBiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjO1xuICB9XG59OyAvLyAoeDEseTEpPT4oeDIseTIpIGludGVyc2VjdCB3aXRoICh4Myx5Myk9Pih4NCx5NClcblxudmFyIGZpbml0ZUxpbmVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gZmluaXRlTGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBpbmZpbml0ZUxpbmVzKSB7XG4gIHZhciBkeDEzID0geDEgLSB4MztcbiAgdmFyIGR4MjEgPSB4MiAtIHgxO1xuICB2YXIgZHg0MyA9IHg0IC0geDM7XG4gIHZhciBkeTEzID0geTEgLSB5MztcbiAgdmFyIGR5MjEgPSB5MiAtIHkxO1xuICB2YXIgZHk0MyA9IHk0IC0geTM7XG4gIHZhciB1YV90ID0gZHg0MyAqIGR5MTMgLSBkeTQzICogZHgxMztcbiAgdmFyIHViX3QgPSBkeDIxICogZHkxMyAtIGR5MjEgKiBkeDEzO1xuICB2YXIgdV9iID0gZHk0MyAqIGR4MjEgLSBkeDQzICogZHkyMTtcblxuICBpZiAodV9iICE9PSAwKSB7XG4gICAgdmFyIHVhID0gdWFfdCAvIHVfYjtcbiAgICB2YXIgdWIgPSB1Yl90IC8gdV9iO1xuICAgIHZhciBmbHB0VGhyZXNob2xkID0gMC4wMDE7XG5cbiAgICB2YXIgX21pbiA9IDAgLSBmbHB0VGhyZXNob2xkO1xuXG4gICAgdmFyIF9tYXggPSAxICsgZmxwdFRocmVzaG9sZDtcblxuICAgIGlmIChfbWluIDw9IHVhICYmIHVhIDw9IF9tYXggJiYgX21pbiA8PSB1YiAmJiB1YiA8PSBfbWF4KSB7XG4gICAgICByZXR1cm4gW3gxICsgdWEgKiBkeDIxLCB5MSArIHVhICogZHkyMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaW5maW5pdGVMaW5lcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3gxICsgdWEgKiBkeDIxLCB5MSArIHVhICogZHkyMV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1YV90ID09PSAwIHx8IHViX3QgPT09IDApIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBjb2luY2lkZW50IGxpbmVzLiBDaGVjayBpZiBvdmVybGFwXG4gICAgICAvLyBDaGVjayBlbmRwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4NCkgPT09IHg0KSB7XG4gICAgICAgIHJldHVybiBbeDQsIHk0XTtcbiAgICAgIH0gLy8gQ2hlY2sgc3RhcnQgcG9pbnQgb2Ygc2Vjb25kIGxpbmVcblxuXG4gICAgICBpZiAobWlkT2ZUaHJlZSh4MSwgeDIsIHgzKSA9PT0geDMpIHtcbiAgICAgICAgcmV0dXJuIFt4MywgeTNdO1xuICAgICAgfSAvLyBFbmRwb2ludCBvZiBmaXJzdCBsaW5lXG5cblxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDMsIHg0LCB4MikgPT09IHgyKSB7XG4gICAgICAgIHJldHVybiBbeDIsIHkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXJhbGxlbCwgbm9uLWNvaW5jaWRlbnRcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn07IC8vIG1hdGgucG9seWdvbkludGVyc2VjdExpbmUoIHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcgKVxuLy8gaW50ZXJzZWN0IGEgbm9kZSBwb2x5Z29uIChwdHMgdHJhbnNmb3JtZWQpXG4vL1xuLy8gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSApXG4vLyBpbnRlcnNlY3QgdGhlIHBvaW50cyAobm8gdHJhbnNmb3JtKVxuXG52YXIgcG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBkb1RyYW5zZm9ybSA9IHRydWU7XG5cbiAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICBkb1RyYW5zZm9ybSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIHBvaW50cztcblxuICBpZiAoZG9UcmFuc2Zvcm0pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybWVkUG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gYmFzZVBvaW50c1tpICogMl0gKiB3aWR0aCArIGNlbnRlclg7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gYmFzZVBvaW50c1tpICogMiArIDFdICogaGVpZ2h0ICsgY2VudGVyWTtcbiAgICB9XG5cbiAgICBpZiAocGFkZGluZyA+IDApIHtcbiAgICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgICBwb2ludHMgPSBqb2luTGluZXMoZXhwYW5kZWRMaW5lU2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IGJhc2VQb2ludHM7XG4gIH1cblxuICB2YXIgY3VycmVudFgsIGN1cnJlbnRZLCBuZXh0WCwgbmV4dFk7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pMisrKSB7XG4gICAgY3VycmVudFggPSBwb2ludHNbX2kyICogMl07XG4gICAgY3VycmVudFkgPSBwb2ludHNbX2kyICogMiArIDFdO1xuXG4gICAgaWYgKF9pMiA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFggPSBwb2ludHNbKF9pMiArIDEpICogMl07XG4gICAgICBuZXh0WSA9IHBvaW50c1soX2kyICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWzBdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbMV07XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgY3VycmVudFgsIGN1cnJlbnRZLCBuZXh0WCwgbmV4dFkpO1xuXG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG59O1xudmFyIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbjtcbiAgdmFyIGxpbmVzID0gbmV3IEFycmF5KGJhc2VQb2ludHMubGVuZ3RoKTtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZVBvaW50cy5sZW5ndGggLyA0OyBpKyspIHtcbiAgICB2YXIgc291cmNlVXYgPSB2b2lkIDAsXG4gICAgICAgIGRlc3RVdiA9IHZvaWQgMDtcblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBzb3VyY2VVdiA9IGJhc2VQb2ludHMubGVuZ3RoIC0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlVXYgPSBpICogNCAtIDI7XG4gICAgfVxuXG4gICAgZGVzdFV2ID0gaSAqIDQgKyAyO1xuICAgIHZhciBweCA9IGNlbnRlclggKyBoYWxmVyAqIGJhc2VQb2ludHNbaSAqIDRdO1xuICAgIHZhciBweSA9IGNlbnRlclkgKyBoYWxmSCAqIGJhc2VQb2ludHNbaSAqIDQgKyAxXTtcbiAgICB2YXIgY29zVGhldGEgPSAtYmFzZVBvaW50c1tzb3VyY2VVdl0gKiBiYXNlUG9pbnRzW2Rlc3RVdl0gLSBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV0gKiBiYXNlUG9pbnRzW2Rlc3RVdiArIDFdO1xuICAgIHZhciBvZmZzZXQgPSBjb3JuZXJSYWRpdXMgLyBNYXRoLnRhbihNYXRoLmFjb3MoY29zVGhldGEpIC8gMik7XG4gICAgdmFyIGNwMHggPSBweCAtIG9mZnNldCAqIGJhc2VQb2ludHNbc291cmNlVXZdO1xuICAgIHZhciBjcDB5ID0gcHkgLSBvZmZzZXQgKiBiYXNlUG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIGNwMXggPSBweCArIG9mZnNldCAqIGJhc2VQb2ludHNbZGVzdFV2XTtcbiAgICB2YXIgY3AxeSA9IHB5ICsgb2Zmc2V0ICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBsaW5lc1tiYXNlUG9pbnRzLmxlbmd0aCAtIDJdID0gY3AweDtcbiAgICAgIGxpbmVzW2Jhc2VQb2ludHMubGVuZ3RoIC0gMV0gPSBjcDB5O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lc1tpICogNCAtIDJdID0gY3AweDtcbiAgICAgIGxpbmVzW2kgKiA0IC0gMV0gPSBjcDB5O1xuICAgIH1cblxuICAgIGxpbmVzW2kgKiA0XSA9IGNwMXg7XG4gICAgbGluZXNbaSAqIDQgKyAxXSA9IGNwMXk7XG4gICAgdmFyIG9ydGh4ID0gYmFzZVBvaW50c1tzb3VyY2VVdiArIDFdO1xuICAgIHZhciBvcnRoeSA9IC1iYXNlUG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY29zQWxwaGEgPSBvcnRoeCAqIGJhc2VQb2ludHNbZGVzdFV2XSArIG9ydGh5ICogYmFzZVBvaW50c1tkZXN0VXYgKyAxXTtcblxuICAgIGlmIChjb3NBbHBoYSA8IDApIHtcbiAgICAgIG9ydGh4ICo9IC0xO1xuICAgICAgb3J0aHkgKj0gLTE7XG4gICAgfVxuXG4gICAgdmFyIGN4ID0gY3AweCArIG9ydGh4ICogY29ybmVyUmFkaXVzO1xuICAgIHZhciBjeSA9IGNwMHkgKyBvcnRoeSAqIGNvcm5lclJhZGl1cztcbiAgICBpbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3RMaW5lQ2lyY2xlKHgsIHksIGNlbnRlclgsIGNlbnRlclksIGN4LCBjeSwgY29ybmVyUmFkaXVzKTtcblxuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxpbmVzLmxlbmd0aCAvIDQ7IF9pMysrKSB7XG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgbGluZXNbX2kzICogNF0sIGxpbmVzW19pMyAqIDQgKyAxXSwgbGluZXNbX2kzICogNCArIDJdLCBsaW5lc1tfaTMgKiA0ICsgM10sIGZhbHNlKTtcblxuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDIpIHtcbiAgICB2YXIgbG93ZXN0SW50ZXJzZWN0aW9uID0gW2ludGVyc2VjdGlvbnNbMF0sIGludGVyc2VjdGlvbnNbMV1dO1xuICAgIHZhciBsb3dlc3RTcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhsb3dlc3RJbnRlcnNlY3Rpb25bMF0gLSB4LCAyKSArIE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblsxXSAtIHksIDIpO1xuXG4gICAgZm9yICh2YXIgX2k0ID0gMTsgX2k0IDwgaW50ZXJzZWN0aW9ucy5sZW5ndGggLyAyOyBfaTQrKykge1xuICAgICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMl0gLSB4LCAyKSArIE1hdGgucG93KGludGVyc2VjdGlvbnNbX2k0ICogMiArIDFdIC0geSwgMik7XG5cbiAgICAgIGlmIChzcXVhcmVkRGlzdGFuY2UgPD0gbG93ZXN0U3F1YXJlZERpc3RhbmNlKSB7XG4gICAgICAgIGxvd2VzdEludGVyc2VjdGlvblswXSA9IGludGVyc2VjdGlvbnNbX2k0ICogMl07XG4gICAgICAgIGxvd2VzdEludGVyc2VjdGlvblsxXSA9IGludGVyc2VjdGlvbnNbX2k0ICogMiArIDFdO1xuICAgICAgICBsb3dlc3RTcXVhcmVkRGlzdGFuY2UgPSBzcXVhcmVkRGlzdGFuY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvd2VzdEludGVyc2VjdGlvbjtcbiAgfVxuXG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciBzaG9ydGVuSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3Rpb24sIG9mZnNldCwgYW1vdW50KSB7XG4gIHZhciBkaXNwID0gW2ludGVyc2VjdGlvblswXSAtIG9mZnNldFswXSwgaW50ZXJzZWN0aW9uWzFdIC0gb2Zmc2V0WzFdXTtcbiAgdmFyIGxlbmd0aCA9IE1hdGguc3FydChkaXNwWzBdICogZGlzcFswXSArIGRpc3BbMV0gKiBkaXNwWzFdKTtcbiAgdmFyIGxlblJhdGlvID0gKGxlbmd0aCAtIGFtb3VudCkgLyBsZW5ndGg7XG5cbiAgaWYgKGxlblJhdGlvIDwgMCkge1xuICAgIGxlblJhdGlvID0gMC4wMDAwMTtcbiAgfVxuXG4gIHJldHVybiBbb2Zmc2V0WzBdICsgbGVuUmF0aW8gKiBkaXNwWzBdLCBvZmZzZXRbMV0gKyBsZW5SYXRpbyAqIGRpc3BbMV1dO1xufTtcbnZhciBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoc2lkZXMsIHJvdGF0aW9uUmFkaWFucykge1xuICB2YXIgcG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyhzaWRlcywgcm90YXRpb25SYWRpYW5zKTtcbiAgcG9pbnRzID0gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cyk7XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGZpdFBvbHlnb25Ub1NxdWFyZSA9IGZ1bmN0aW9uIGZpdFBvbHlnb25Ub1NxdWFyZShwb2ludHMpIHtcbiAgdmFyIHgsIHk7XG4gIHZhciBzaWRlcyA9IHBvaW50cy5sZW5ndGggLyAyO1xuICB2YXIgbWluWCA9IEluZmluaXR5LFxuICAgICAgbWluWSA9IEluZmluaXR5LFxuICAgICAgbWF4WCA9IC1JbmZpbml0eSxcbiAgICAgIG1heFkgPSAtSW5maW5pdHk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSsrKSB7XG4gICAgeCA9IHBvaW50c1syICogaV07XG4gICAgeSA9IHBvaW50c1syICogaSArIDFdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfSAvLyBzdHJldGNoIGZhY3RvcnNcblxuXG4gIHZhciBzeCA9IDIgLyAobWF4WCAtIG1pblgpO1xuICB2YXIgc3kgPSAyIC8gKG1heFkgLSBtaW5ZKTtcblxuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBzaWRlczsgX2k1KyspIHtcbiAgICB4ID0gcG9pbnRzWzIgKiBfaTVdID0gcG9pbnRzWzIgKiBfaTVdICogc3g7XG4gICAgeSA9IHBvaW50c1syICogX2k1ICsgMV0gPSBwb2ludHNbMiAqIF9pNSArIDFdICogc3k7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICB9XG5cbiAgaWYgKG1pblkgPCAtMSkge1xuICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IHNpZGVzOyBfaTYrKykge1xuICAgICAgeSA9IHBvaW50c1syICogX2k2ICsgMV0gPSBwb2ludHNbMiAqIF9pNiArIDFdICsgKC0xIC0gbWluWSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cztcbn07XG52YXIgZ2VuZXJhdGVVbml0TmdvblBvaW50cyA9IGZ1bmN0aW9uIGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoc2lkZXMsIHJvdGF0aW9uUmFkaWFucykge1xuICB2YXIgaW5jcmVtZW50ID0gMS4wIC8gc2lkZXMgKiAyICogTWF0aC5QSTtcbiAgdmFyIHN0YXJ0QW5nbGUgPSBzaWRlcyAlIDIgPT09IDAgPyBNYXRoLlBJIC8gMi4wICsgaW5jcmVtZW50IC8gMi4wIDogTWF0aC5QSSAvIDIuMDtcbiAgc3RhcnRBbmdsZSArPSByb3RhdGlvblJhZGlhbnM7XG4gIHZhciBwb2ludHMgPSBuZXcgQXJyYXkoc2lkZXMgKiAyKTtcbiAgdmFyIGN1cnJlbnRBbmdsZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZGVzOyBpKyspIHtcbiAgICBjdXJyZW50QW5nbGUgPSBpICogaW5jcmVtZW50ICsgc3RhcnRBbmdsZTtcbiAgICBwb2ludHNbMiAqIGldID0gTWF0aC5jb3MoY3VycmVudEFuZ2xlKTsgLy8geFxuXG4gICAgcG9pbnRzWzIgKiBpICsgMV0gPSBNYXRoLnNpbigtY3VycmVudEFuZ2xlKTsgLy8geVxuICB9XG5cbiAgcmV0dXJuIHBvaW50cztcbn07IC8vIFNldCB0aGUgZGVmYXVsdCByYWRpdXMsIHVubGVzcyBoYWxmIG9mIHdpZHRoIG9yIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gZGVmYXVsdFxuXG52YXIgZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMgPSBmdW5jdGlvbiBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiBNYXRoLm1pbih3aWR0aCAvIDQsIGhlaWdodCAvIDQsIDgpO1xufTsgLy8gU2V0IHRoZSBkZWZhdWx0IHJhZGl1c1xuXG52YXIgZ2V0Um91bmRQb2x5Z29uUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gMTAsIGhlaWdodCAvIDEwLCA4KTtcbn07XG52YXIgZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkge1xuICByZXR1cm4gODtcbn07XG52YXIgYmV6aWVyUHRzVG9RdWFkQ29lZmYgPSBmdW5jdGlvbiBiZXppZXJQdHNUb1F1YWRDb2VmZihwMCwgcDEsIHAyKSB7XG4gIHJldHVybiBbcDAgLSAyICogcDEgKyBwMiwgMiAqIChwMSAtIHAwKSwgcDBdO1xufTsgLy8gZ2V0IGN1cnZlIHdpZHRoLCBoZWlnaHQsIGFuZCBjb250cm9sIHBvaW50IHBvc2l0aW9uIG9mZnNldHMgYXMgYSBwZXJjZW50YWdlIG9mIG5vZGUgaGVpZ2h0IC8gd2lkdGhcblxudmFyIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzID0gZnVuY3Rpb24gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCkge1xuICByZXR1cm4ge1xuICAgIGhlaWdodE9mZnNldDogTWF0aC5taW4oMTUsIDAuMDUgKiBoZWlnaHQpLFxuICAgIHdpZHRoT2Zmc2V0OiBNYXRoLm1pbigxMDAsIDAuMjUgKiB3aWR0aCksXG4gICAgY3RybFB0T2Zmc2V0UGN0OiAwLjA1XG4gIH07XG59O1xuXG52YXIgcGFnZVJhbmtEZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgZGFtcGluZ0ZhY3RvcjogMC44LFxuICBwcmVjaXNpb246IDAuMDAwMDAxLFxuICBpdGVyYXRpb25zOiAyMDAsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufSk7XG52YXIgZWxlc2ZuJDcgPSB7XG4gIHBhZ2VSYW5rOiBmdW5jdGlvbiBwYWdlUmFuayhvcHRpb25zKSB7XG4gICAgdmFyIF9wYWdlUmFua0RlZmF1bHRzID0gcGFnZVJhbmtEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgICAgZGFtcGluZ0ZhY3RvciA9IF9wYWdlUmFua0RlZmF1bHRzLmRhbXBpbmdGYWN0b3IsXG4gICAgICAgIHByZWNpc2lvbiA9IF9wYWdlUmFua0RlZmF1bHRzLnByZWNpc2lvbixcbiAgICAgICAgaXRlcmF0aW9ucyA9IF9wYWdlUmFua0RlZmF1bHRzLml0ZXJhdGlvbnMsXG4gICAgICAgIHdlaWdodCA9IF9wYWdlUmFua0RlZmF1bHRzLndlaWdodDtcblxuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcblxuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtTm9kZXNTcWQgPSBudW1Ob2RlcyAqIG51bU5vZGVzO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDsgLy8gQ29uc3RydWN0IHRyYW5zcG9zZWQgYWRqYWNlbmN5IG1hdHJpeFxuICAgIC8vIEZpcnN0IGxldHMgaGF2ZSBhIHplcm9lZCBtYXRyaXggb2YgdGhlIHJpZ2h0IHNpemVcbiAgICAvLyBXZSdsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIHN1bSBvZiBlYWNoIGNvbHVtblxuXG4gICAgdmFyIG1hdHJpeCA9IG5ldyBBcnJheShudW1Ob2Rlc1NxZCk7XG4gICAgdmFyIGNvbHVtblN1bSA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9iID0gKDEgLSBkYW1waW5nRmFjdG9yKSAvIG51bU5vZGVzOyAvLyBDcmVhdGUgbnVsbCBtYXRyaXhcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBudW1Ob2RlczsgaisrKSB7XG4gICAgICAgIHZhciBuID0gaSAqIG51bU5vZGVzICsgajtcbiAgICAgICAgbWF0cml4W25dID0gMDtcbiAgICAgIH1cblxuICAgICAgY29sdW1uU3VtW2ldID0gMDtcbiAgICB9IC8vIE5vdywgcHJvY2VzcyBlZGdlc1xuXG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtRWRnZXM7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbX2ldO1xuICAgICAgdmFyIHNyY0lkID0gZWRnZS5kYXRhKCdzb3VyY2UnKTtcbiAgICAgIHZhciB0Z3RJZCA9IGVkZ2UuZGF0YSgndGFyZ2V0Jyk7IC8vIERvbid0IGluY2x1ZGUgbG9vcHMgaW4gdGhlIG1hdHJpeFxuXG4gICAgICBpZiAoc3JjSWQgPT09IHRndElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcyA9IG5vZGVzLmluZGV4T2ZJZChzcmNJZCk7XG4gICAgICB2YXIgdCA9IG5vZGVzLmluZGV4T2ZJZCh0Z3RJZCk7XG4gICAgICB2YXIgdyA9IHdlaWdodChlZGdlKTtcblxuICAgICAgdmFyIF9uID0gdCAqIG51bU5vZGVzICsgczsgLy8gVXBkYXRlIG1hdHJpeFxuXG5cbiAgICAgIG1hdHJpeFtfbl0gKz0gdzsgLy8gVXBkYXRlIGNvbHVtbiBzdW1cblxuICAgICAgY29sdW1uU3VtW3NdICs9IHc7XG4gICAgfSAvLyBBZGQgYWRkaXRpb25hbCBwcm9iYWJpbGl0eSBiYXNlZCBvbiBkYW1waW5nIGZhY3RvclxuICAgIC8vIEFsc28sIHRha2UgaW50byBhY2NvdW50IGNvbHVtbnMgdGhhdCBoYXZlIHN1bSA9IDBcblxuXG4gICAgdmFyIHAgPSAxLjAgLyBudW1Ob2RlcyArIGFkZGl0aW9uYWxQcm9iOyAvLyBTaG9ydGhhbmRcbiAgICAvLyBUcmF2ZXJzZSBtYXRyaXgsIGNvbHVtbiBieSBjb2x1bW5cblxuICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBudW1Ob2RlczsgX2orKykge1xuICAgICAgaWYgKGNvbHVtblN1bVtfal0gPT09IDApIHtcbiAgICAgICAgLy8gTm8gJ2xpbmtzJyBvdXQgZnJvbSBub2RlIGp0aCwgYXNzdW1lIGVxdWFsIHByb2JhYmlsaXR5IGZvciBlYWNoIHBvc3NpYmxlIG5vZGVcbiAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbnVtTm9kZXM7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIF9uMiA9IF9pMiAqIG51bU5vZGVzICsgX2o7XG5cbiAgICAgICAgICBtYXRyaXhbX24yXSA9IHA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUganRoIGhhcyBvdXRnb2luZyBsaW5rLCBjb21wdXRlIG5vcm1hbGl6ZWQgcHJvYmFiaWxpdGllc1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX24zID0gX2kzICogbnVtTm9kZXMgKyBfajtcblxuICAgICAgICAgIG1hdHJpeFtfbjNdID0gbWF0cml4W19uM10gLyBjb2x1bW5TdW1bX2pdICsgYWRkaXRpb25hbFByb2I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIENvbXB1dGUgZG9taW5hbnQgZWlnZW52ZWN0b3IgdXNpbmcgcG93ZXIgbWV0aG9kXG5cblxuICAgIHZhciBlaWdlbnZlY3RvciA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIHRlbXAgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBwcmV2aW91czsgLy8gU3RhcnQgd2l0aCBhIHZlY3RvciBvZiBhbGwgMSdzXG4gICAgLy8gQWxzbywgaW5pdGlhbGl6ZSBhIG51bGwgdmVjdG9yIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzaG9ydGhhbmRcblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgZWlnZW52ZWN0b3JbX2k0XSA9IDE7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaXRlciA9IDA7IGl0ZXIgPCBpdGVyYXRpb25zOyBpdGVyKyspIHtcbiAgICAgIC8vIFRlbXAgYXJyYXkgd2l0aCBhbGwgMCdzXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBudW1Ob2RlczsgX2k1KyspIHtcbiAgICAgICAgdGVtcFtfaTVdID0gMDtcbiAgICAgIH0gLy8gTXVsdGlwbHkgbWF0cml4IHdpdGggcHJldmlvdXMgcmVzdWx0XG5cblxuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbnVtTm9kZXM7IF9pNisrKSB7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG51bU5vZGVzOyBfajIrKykge1xuICAgICAgICAgIHZhciBfbjQgPSBfaTYgKiBudW1Ob2RlcyArIF9qMjtcblxuICAgICAgICAgIHRlbXBbX2k2XSArPSBtYXRyaXhbX240XSAqIGVpZ2VudmVjdG9yW19qMl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5QbGFjZVN1bU5vcm1hbGl6ZSh0ZW1wKTtcbiAgICAgIHByZXZpb3VzID0gZWlnZW52ZWN0b3I7XG4gICAgICBlaWdlbnZlY3RvciA9IHRlbXA7XG4gICAgICB0ZW1wID0gcHJldmlvdXM7XG4gICAgICB2YXIgZGlmZiA9IDA7IC8vIENvbXB1dGUgZGlmZmVyZW5jZSAoc3F1YXJlZCBtb2R1bGUpIG9mIGJvdGggdmVjdG9yc1xuXG4gICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBudW1Ob2RlczsgX2k3KyspIHtcbiAgICAgICAgdmFyIGRlbHRhID0gcHJldmlvdXNbX2k3XSAtIGVpZ2VudmVjdG9yW19pN107XG4gICAgICAgIGRpZmYgKz0gZGVsdGEgKiBkZWx0YTtcbiAgICAgIH0gLy8gSWYgZGlmZmVyZW5jZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lyZWQgdGhyZXNob2xkLCBzdG9wIGl0ZXJhdGluZ1xuXG5cbiAgICAgIGlmIChkaWZmIDwgcHJlY2lzaW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gLy8gQ29uc3RydWN0IHJlc3VsdFxuXG5cbiAgICB2YXIgcmVzID0ge1xuICAgICAgcmFuazogZnVuY3Rpb24gcmFuayhub2RlKSB7XG4gICAgICAgIG5vZGUgPSBjeS5jb2xsZWN0aW9uKG5vZGUpWzBdO1xuICAgICAgICByZXR1cm4gZWlnZW52ZWN0b3Jbbm9kZXMuaW5kZXhPZihub2RlKV07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIHBhZ2VSYW5rXG5cbn07IC8vIGVsZXNmblxuXG52YXIgZGVmYXVsdHMkMSA9IGRlZmF1bHRzKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIGFscGhhOiAwXG59KTtcbnZhciBlbGVzZm4kOCA9IHtcbiAgZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkMShvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcblxuICAgIGlmICghb3B0aW9ucy5kaXJlY3RlZCkge1xuICAgICAgdmFyIGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhEZWdyZWUgPSAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsgLy8gYWRkIGN1cnJlbnQgbm9kZSB0byB0aGUgY3VycmVudCBvcHRpb25zIG9iamVjdCBhbmQgY2FsbCBkZWdyZWVDZW50cmFsaXR5XG5cbiAgICAgICAgb3B0aW9ucy5yb290ID0gbm9kZTtcbiAgICAgICAgdmFyIGN1cnJEZWdyZWUgPSB0aGlzLmRlZ3JlZUNlbnRyYWxpdHkob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1heERlZ3JlZSA8IGN1cnJEZWdyZWUuZGVncmVlKSB7XG4gICAgICAgICAgbWF4RGVncmVlID0gY3VyckRlZ3JlZS5kZWdyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWdyZWVzW25vZGUuaWQoKV0gPSBjdXJyRGVncmVlLmRlZ3JlZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBmdW5jdGlvbiBkZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhEZWdyZWUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heERlZ3JlZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGVncmVlcyA9IHt9O1xuICAgICAgdmFyIG91dGRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBtYXhJbmRlZ3JlZSA9IDA7XG4gICAgICB2YXIgbWF4T3V0ZGVncmVlID0gMDtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG51bU5vZGVzOyBfaSsrKSB7XG4gICAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcblxuICAgICAgICB2YXIgaWQgPSBfbm9kZS5pZCgpOyAvLyBhZGQgY3VycmVudCBub2RlIHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0IGFuZCBjYWxsIGRlZ3JlZUNlbnRyYWxpdHlcblxuXG4gICAgICAgIG9wdGlvbnMucm9vdCA9IF9ub2RlO1xuXG4gICAgICAgIHZhciBfY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcblxuICAgICAgICBpZiAobWF4SW5kZWdyZWUgPCBfY3VyckRlZ3JlZS5pbmRlZ3JlZSkgbWF4SW5kZWdyZWUgPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA8IF9jdXJyRGVncmVlLm91dGRlZ3JlZSkgbWF4T3V0ZGVncmVlID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgICBpbmRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUuaW5kZWdyZWU7XG4gICAgICAgIG91dGRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRlZ3JlZTogZnVuY3Rpb24gaW5kZWdyZWUobm9kZSkge1xuICAgICAgICAgIGlmIChtYXhJbmRlZ3JlZSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RyaW5nKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIGlzIGEgc2VsZWN0b3Igc3RyaW5nXG4gICAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbmRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heEluZGVncmVlO1xuICAgICAgICB9LFxuICAgICAgICBvdXRkZWdyZWU6IGZ1bmN0aW9uIG91dGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgICAgLy8gZnJvbSBpcyBhIHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgICAgbm9kZSA9IGN5LmZpbHRlcihub2RlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gb3V0ZGVncmVlc1tub2RlLmlkKCldIC8gbWF4T3V0ZGVncmVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbiAgLy8gZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWRcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIE9wc2FobCdzIHBhcGVyXG4gIC8vIFwiTm9kZSBjZW50cmFsaXR5IGluIHdlaWdodGVkIG5ldHdvcmtzOiBHZW5lcmFsaXppbmcgZGVncmVlIGFuZCBzaG9ydGVzdCBwYXRoc1wiXG4gIC8vIGNoZWNrIHRoZSBoZWFkaW5nIDIgXCJEZWdyZWVcIlxuICBkZWdyZWVDZW50cmFsaXR5OiBmdW5jdGlvbiBkZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkMShvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGNhbGxpbmdFbGVzID0gdGhpcztcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICByb290ID0gX29wdGlvbnMucm9vdCxcbiAgICAgICAgd2VpZ2h0ID0gX29wdGlvbnMud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9vcHRpb25zLmRpcmVjdGVkLFxuICAgICAgICBhbHBoYSA9IF9vcHRpb25zLmFscGhhO1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuXG4gICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgdmFyIGNvbm5FZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oY2FsbGluZ0VsZXMpO1xuICAgICAgdmFyIGsgPSBjb25uRWRnZXMubGVuZ3RoO1xuICAgICAgdmFyIHMgPSAwOyAvLyBOb3csIHN1bSBlZGdlIHdlaWdodHNcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcyArPSB3ZWlnaHQoY29ubkVkZ2VzW2ldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVncmVlOiBNYXRoLnBvdyhrLCAxIC0gYWxwaGEpICogTWF0aC5wb3cocywgYWxwaGEpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWRnZXMgPSByb290LmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICB2YXIgaW5jb21pbmcgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UudGFyZ2V0KCkuc2FtZShyb290KSAmJiBjYWxsaW5nRWxlcy5oYXMoZWRnZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBvdXRnb2luZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5zb3VyY2UoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGtfaW4gPSBpbmNvbWluZy5sZW5ndGg7XG4gICAgICB2YXIga19vdXQgPSBvdXRnb2luZy5sZW5ndGg7XG4gICAgICB2YXIgc19pbiA9IDA7XG4gICAgICB2YXIgc19vdXQgPSAwOyAvLyBOb3csIHN1bSBpbmNvbWluZyBlZGdlIHdlaWdodHNcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgaW5jb21pbmcubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBzX2luICs9IHdlaWdodChpbmNvbWluZ1tfaTJdKTtcbiAgICAgIH0gLy8gTm93LCBzdW0gb3V0Z29pbmcgZWRnZSB3ZWlnaHRzXG5cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgb3V0Z29pbmcubGVuZ3RoOyBfaTMrKykge1xuICAgICAgICBzX291dCArPSB3ZWlnaHQob3V0Z29pbmdbX2kzXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBNYXRoLnBvdyhrX2luLCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19pbiwgYWxwaGEpLFxuICAgICAgICBvdXRkZWdyZWU6IE1hdGgucG93KGtfb3V0LCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19vdXQsIGFscGhhKVxuICAgICAgfTtcbiAgICB9XG4gIH0gLy8gZGVncmVlQ2VudHJhbGl0eVxuXG59OyAvLyBlbGVzZm5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aGljYWwgYWxpYXNcblxuZWxlc2ZuJDguZGMgPSBlbGVzZm4kOC5kZWdyZWVDZW50cmFsaXR5O1xuZWxlc2ZuJDguZGNuID0gZWxlc2ZuJDguZGVncmVlQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kOC5kZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJDIgPSBkZWZhdWx0cyh7XG4gIGhhcm1vbmljOiB0cnVlLFxuICB3ZWlnaHQ6IGZ1bmN0aW9uIHdlaWdodCgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kOSA9IHtcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGNsb3NlbmVzc0NlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzID0gZGVmYXVsdHMkMihvcHRpb25zKSxcbiAgICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMuaGFybW9uaWMsXG4gICAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQsXG4gICAgICAgIGRpcmVjdGVkID0gX2RlZmF1bHRzLmRpcmVjdGVkO1xuXG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjbG9zZW5lc3NlcyA9IHt9O1xuICAgIHZhciBtYXhDbG9zZW5lc3MgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgZncgPSB0aGlzLmZsb3lkV2Fyc2hhbGwoe1xuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTsgLy8gQ29tcHV0ZSBjbG9zZW5lc3MgZm9yIGV2ZXJ5IG5vZGUgYW5kIGZpbmQgdGhlIG1heGltdW0gY2xvc2VuZXNzXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY3VyckNsb3NlbmVzcyA9IDA7XG4gICAgICB2YXIgbm9kZV9pID0gbm9kZXNbaV07XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGopIHtcbiAgICAgICAgICB2YXIgZCA9IGZ3LmRpc3RhbmNlKG5vZGVfaSwgbm9kZXNbal0pO1xuXG4gICAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IDEgLyBkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyQ2xvc2VuZXNzICs9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFybW9uaWMpIHtcbiAgICAgICAgY3VyckNsb3NlbmVzcyA9IDEgLyBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4Q2xvc2VuZXNzIDwgY3VyckNsb3NlbmVzcykge1xuICAgICAgICBtYXhDbG9zZW5lc3MgPSBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuXG4gICAgICBjbG9zZW5lc3Nlc1tub2RlX2kuaWQoKV0gPSBjdXJyQ2xvc2VuZXNzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjbG9zZW5lc3M6IGZ1bmN0aW9uIGNsb3NlbmVzcyhub2RlKSB7XG4gICAgICAgIGlmIChtYXhDbG9zZW5lc3MgPT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpWzBdLmlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIG5vZGVcbiAgICAgICAgICBub2RlID0gbm9kZS5pZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb3NlbmVzc2VzW25vZGVdIC8gbWF4Q2xvc2VuZXNzO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG4gIC8vIEltcGxlbWVudGVkIGZyb20gcHNldWRvY29kZSBmcm9tIHdpa2lwZWRpYVxuICBjbG9zZW5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBjbG9zZW5lc3NDZW50cmFsaXR5KG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmF1bHRzMiA9IGRlZmF1bHRzJDIob3B0aW9ucyksXG4gICAgICAgIHJvb3QgPSBfZGVmYXVsdHMyLnJvb3QsXG4gICAgICAgIHdlaWdodCA9IF9kZWZhdWx0czIud2VpZ2h0LFxuICAgICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0czIuZGlyZWN0ZWQsXG4gICAgICAgIGhhcm1vbmljID0gX2RlZmF1bHRzMi5oYXJtb25pYztcblxuICAgIHJvb3QgPSB0aGlzLmZpbHRlcihyb290KVswXTsgLy8gd2UgbmVlZCBkaXN0YW5jZSBmcm9tIHRoaXMgbm9kZSB0byBldmVyeSBvdGhlciBub2RlXG5cbiAgICB2YXIgZGlqa3N0cmEgPSB0aGlzLmRpamtzdHJhKHtcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICAgIH0pO1xuICAgIHZhciB0b3RhbERpc3RhbmNlID0gMDtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW2ldO1xuXG4gICAgICBpZiAoIW4uc2FtZShyb290KSkge1xuICAgICAgICB2YXIgZCA9IGRpamtzdHJhLmRpc3RhbmNlVG8obik7XG5cbiAgICAgICAgaWYgKGhhcm1vbmljKSB7XG4gICAgICAgICAgdG90YWxEaXN0YW5jZSArPSAxIC8gZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGFybW9uaWMgPyB0b3RhbERpc3RhbmNlIDogMSAvIHRvdGFsRGlzdGFuY2U7XG4gIH0gLy8gY2xvc2VuZXNzQ2VudHJhbGl0eVxuXG59OyAvLyBlbGVzZm5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aGljYWwgYWxpYXNcblxuZWxlc2ZuJDkuY2MgPSBlbGVzZm4kOS5jbG9zZW5lc3NDZW50cmFsaXR5O1xuZWxlc2ZuJDkuY2NuID0gZWxlc2ZuJDkuY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kOS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJDMgPSBkZWZhdWx0cyh7XG4gIHdlaWdodDogbnVsbCxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kYSA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSB0aGUgYWxnb3JpdGhtIGluIHRoZSBwYXBlciBcIk9uIFZhcmlhbnRzIG9mIFNob3J0ZXN0LVBhdGggQmV0d2Vlbm5lc3MgQ2VudHJhbGl0eSBhbmQgdGhlaXIgR2VuZXJpYyBDb21wdXRhdGlvblwiIGJ5IFVscmlrIEJyYW5kZXNcbiAgYmV0d2Vlbm5lc3NDZW50cmFsaXR5OiBmdW5jdGlvbiBiZXR3ZWVubmVzc0NlbnRyYWxpdHkob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMgPSBkZWZhdWx0cyQzKG9wdGlvbnMpLFxuICAgICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgICAgd2VpZ2h0ID0gX2RlZmF1bHRzLndlaWdodDtcblxuICAgIHZhciB3ZWlnaHRlZCA9IHdlaWdodCAhPSBudWxsO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTsgLy8gc3RhcnRpbmdcblxuICAgIHZhciBWID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBBID0ge307XG4gICAgdmFyIF9DID0ge307XG4gICAgdmFyIG1heCA9IDA7XG4gICAgdmFyIEMgPSB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgICBfQ1trZXldID0gdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgICBtYXggPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9DW2tleV07XG4gICAgICB9XG4gICAgfTsgLy8gQSBjb250YWlucyB0aGUgbmVpZ2hib3Job29kcyBvZiBldmVyeSBub2RlXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFYubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2ID0gVltpXTtcbiAgICAgIHZhciB2aWQgPSB2LmlkKCk7XG5cbiAgICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICBBW3ZpZF0gPSB2Lm91dGdvZXJzKCkubm9kZXMoKTsgLy8gZ2V0IG91dGdvZXJzIG9mIGV2ZXJ5IG5vZGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEFbdmlkXSA9IHYub3Blbk5laWdoYm9yaG9vZCgpLm5vZGVzKCk7IC8vIGdldCBuZWlnaGJvcnMgb2YgZXZlcnkgbm9kZVxuICAgICAgfVxuXG4gICAgICBDLnNldCh2aWQsIDApO1xuICAgIH1cblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKHMpIHtcbiAgICAgIHZhciBzaWQgPSBWW3NdLmlkKCk7XG4gICAgICB2YXIgUyA9IFtdOyAvLyBzdGFja1xuXG4gICAgICB2YXIgUCA9IHt9O1xuICAgICAgdmFyIGcgPSB7fTtcbiAgICAgIHZhciBkID0ge307XG4gICAgICB2YXIgUSA9IG5ldyBIZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBkW2FdIC0gZFtiXTtcbiAgICAgIH0pOyAvLyBxdWV1ZVxuICAgICAgLy8gaW5pdCBkaWN0aW9uYXJpZXNcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFYubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBfdmlkID0gVltfaV0uaWQoKTtcblxuICAgICAgICBQW192aWRdID0gW107XG4gICAgICAgIGdbX3ZpZF0gPSAwO1xuICAgICAgICBkW192aWRdID0gSW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGdbc2lkXSA9IDE7IC8vIHNpZ21hXG5cbiAgICAgIGRbc2lkXSA9IDA7IC8vIGRpc3RhbmNlIHRvIHNcblxuICAgICAgUS5wdXNoKHNpZCk7XG5cbiAgICAgIHdoaWxlICghUS5lbXB0eSgpKSB7XG4gICAgICAgIHZhciBfdiA9IFEucG9wKCk7XG5cbiAgICAgICAgUy5wdXNoKF92KTtcblxuICAgICAgICBpZiAod2VpZ2h0ZWQpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IEFbX3ZdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgdyA9IEFbX3ZdW2pdO1xuICAgICAgICAgICAgdmFyIHZFbGUgPSBjeS5nZXRFbGVtZW50QnlJZChfdik7XG4gICAgICAgICAgICB2YXIgZWRnZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKHZFbGUuZWRnZXNUbyh3KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB2RWxlLmVkZ2VzVG8odylbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlZGdlID0gdy5lZGdlc1RvKHZFbGUpWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZWRnZVdlaWdodCA9IHdlaWdodChlZGdlKTtcbiAgICAgICAgICAgIHcgPSB3LmlkKCk7XG5cbiAgICAgICAgICAgIGlmIChkW3ddID4gZFtfdl0gKyBlZGdlV2VpZ2h0KSB7XG4gICAgICAgICAgICAgIGRbd10gPSBkW192XSArIGVkZ2VXZWlnaHQ7XG5cbiAgICAgICAgICAgICAgaWYgKFEubm9kZXMuaW5kZXhPZih3KSA8IDApIHtcbiAgICAgICAgICAgICAgICAvL2lmIHcgaXMgbm90IGluIFFcbiAgICAgICAgICAgICAgICBRLnB1c2godyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uIGlmIHcgaXMgaW4gUVxuICAgICAgICAgICAgICAgIFEudXBkYXRlSXRlbSh3KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGdbd10gPSAwO1xuICAgICAgICAgICAgICBQW3ddID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkW3ddID09IGRbX3ZdICsgZWRnZVdlaWdodCkge1xuICAgICAgICAgICAgICBnW3ddID0gZ1t3XSArIGdbX3ZdO1xuICAgICAgICAgICAgICBQW3ddLnB1c2goX3YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgQVtfdl0ubGVuZ3RoOyBfaisrKSB7XG4gICAgICAgICAgICB2YXIgX3cgPSBBW192XVtfal0uaWQoKTtcblxuICAgICAgICAgICAgaWYgKGRbX3ddID09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIFEucHVzaChfdyk7XG4gICAgICAgICAgICAgIGRbX3ddID0gZFtfdl0gKyAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gZFtfdl0gKyAxKSB7XG4gICAgICAgICAgICAgIGdbX3ddID0gZ1tfd10gKyBnW192XTtcblxuICAgICAgICAgICAgICBQW193XS5wdXNoKF92KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGUgPSB7fTtcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgVi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIGVbVltfaTJdLmlkKCldID0gMDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKFMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgX3cyID0gUy5wb3AoKTtcblxuICAgICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBQW193Ml0ubGVuZ3RoOyBfajIrKykge1xuICAgICAgICAgIHZhciBfdjIgPSBQW193Ml1bX2oyXTtcbiAgICAgICAgICBlW192Ml0gPSBlW192Ml0gKyBnW192Ml0gLyBnW193Ml0gKiAoMSArIGVbX3cyXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3cyICE9IFZbc10uaWQoKSkge1xuICAgICAgICAgIEMuc2V0KF93MiwgQy5nZXQoX3cyKSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgcyA9IDA7IHMgPCBWLmxlbmd0aDsgcysrKSB7XG4gICAgICBfbG9vcChzKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0ID0ge1xuICAgICAgYmV0d2Vlbm5lc3M6IGZ1bmN0aW9uIGJldHdlZW5uZXNzKG5vZGUpIHtcbiAgICAgICAgdmFyIGlkID0gY3kuY29sbGVjdGlvbihub2RlKS5pZCgpO1xuICAgICAgICByZXR1cm4gQy5nZXQoaWQpO1xuICAgICAgfSxcbiAgICAgIGJldHdlZW5uZXNzTm9ybWFsaXplZDogZnVuY3Rpb24gYmV0d2Vlbm5lc3NOb3JtYWxpemVkKG5vZGUpIHtcbiAgICAgICAgaWYgKG1heCA9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTsgLy8gYWxpYXNcblxuICAgIHJldC5iZXR3ZWVubmVzc05vcm1hbGlzZWQgPSByZXQuYmV0d2Vlbm5lc3NOb3JtYWxpemVkO1xuICAgIHJldHVybiByZXQ7XG4gIH0gLy8gYmV0d2Vlbm5lc3NDZW50cmFsaXR5XG5cbn07IC8vIGVsZXNmblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRoaWNhbCBhbGlhc1xuXG5lbGVzZm4kYS5iYyA9IGVsZXNmbiRhLmJldHdlZW5uZXNzQ2VudHJhbGl0eTtcblxuLy8gSW1wbGVtZW50ZWQgYnkgWm9lIFhpIEB6b2V4aSBmb3IgR1NPQyAyMDE2XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG52YXIgZGVmYXVsdHMkNCA9IGRlZmF1bHRzKHtcbiAgZXhwYW5kRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIHRpbWUgb2YgY29tcHV0YXRpb24gYW5kIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgdG8gc29tZSBleHRlbnQ6IE0gKiBNXG4gIGluZmxhdGVGYWN0b3I6IDIsXG4gIC8vIGFmZmVjdHMgY2x1c3RlciBncmFudWxhcml0eSAodGhlIGdyZWF0ZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSBjbHVzdGVycyk6IE0oaSxqKSAvIEUoailcbiAgbXVsdEZhY3RvcjogMSxcbiAgLy8gb3B0aW9uYWwgc2VsZiBsb29wcyBmb3IgZWFjaCBub2RlLiBVc2UgYSBuZXV0cmFsIHZhbHVlIHRvIGltcHJvdmUgY2x1c3RlciBjb21wdXRhdGlvbnMuXG4gIG1heEl0ZXJhdGlvbnM6IDIwLFxuICAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBNQ0wgYWxnb3JpdGhtIGluIGEgc2luZ2xlIHJ1blxuICBhdHRyaWJ1dGVzOiBbLy8gYXR0cmlidXRlcy9mZWF0dXJlcyB1c2VkIHRvIGdyb3VwIG5vZGVzLCBpZS4gc2ltaWxhcml0eSB2YWx1ZXMgYmV0d2VlbiBub2Rlc1xuICBmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9XVxufSk7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBzZXRPcHRpb25zID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBkZWZhdWx0cyQ0KG9wdGlvbnMpO1xufTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuXG52YXIgZ2V0U2ltaWxhcml0eSA9IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHkoZWRnZSwgYXR0cmlidXRlcykge1xuICB2YXIgdG90YWwgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgIHRvdGFsICs9IGF0dHJpYnV0ZXNbaV0oZWRnZSk7XG4gIH1cblxuICByZXR1cm4gdG90YWw7XG59O1xuXG52YXIgYWRkTG9vcHMgPSBmdW5jdGlvbiBhZGRMb29wcyhNLCBuLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBNW2kgKiBuICsgaV0gPSB2YWw7XG4gIH1cbn07XG5cbnZhciBub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoTSwgbikge1xuICB2YXIgc3VtO1xuXG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcblxuICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IG47IHJvdysrKSB7XG4gICAgICBzdW0gKz0gTVtyb3cgKiBuICsgY29sXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfcm93ID0gMDsgX3JvdyA8IG47IF9yb3crKykge1xuICAgICAgTVtfcm93ICogbiArIGNvbF0gPSBNW19yb3cgKiBuICsgY29sXSAvIHN1bTtcbiAgICB9XG4gIH1cbn07IC8vIFRPRE86IGJsb2NrZWQgbWF0cml4IG11bHRpcGxpY2F0aW9uP1xuXG5cbnZhciBtbXVsdCA9IGZ1bmN0aW9uIG1tdWx0KEEsIEIsIG4pIHtcbiAgdmFyIEMgPSBuZXcgQXJyYXkobiAqIG4pO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIENbaSAqIG4gKyBqXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gQztcbn07XG5cbnZhciBleHBhbmQgPSBmdW5jdGlvbiBleHBhbmQoTSwgbiwgZXhwYW5kRmFjdG9yXG4vKiogcG93ZXIgKiovXG4pIHtcbiAgdmFyIF9NID0gTS5zbGljZSgwKTtcblxuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuXG4gIHJldHVybiBNO1xufTtcblxudmFyIGluZmxhdGUgPSBmdW5jdGlvbiBpbmZsYXRlKE0sIG4sIGluZmxhdGVGYWN0b3Jcbi8qKiByICoqL1xuKSB7XG4gIHZhciBfTSA9IG5ldyBBcnJheShuICogbik7IC8vIE0oaSxqKSBeIGluZmxhdGVQb3dlclxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZShfTSwgbik7XG4gIHJldHVybiBfTTtcbn07XG5cbnZhciBoYXNDb252ZXJnZWQgPSBmdW5jdGlvbiBoYXNDb252ZXJnZWQoTSwgX00sIG4yLCByb3VuZEZhY3Rvcikge1xuICAvLyBDaGVjayB0aGF0IGJvdGggbWF0cmljZXMgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyAoaSxqKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4yOyBpKyspIHtcbiAgICB2YXIgdjEgPSBNYXRoLnJvdW5kKE1baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7IC8vIHRydW5jYXRlIHRvICdyb3VuZEZhY3RvcicgZGVjaW1hbCBwbGFjZXNcblxuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG5cbiAgICBpZiAodjEgIT09IHYyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKE0sIG4sIG5vZGVzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgLy8gUm93LXdpc2UgYXR0cmFjdG9ycyBhbmQgZWxlbWVudHMgdGhhdCB0aGV5IGF0dHJhY3QgYmVsb25nIGluIHNhbWUgY2x1c3RlclxuICAgICAgaWYgKE1hdGgucm91bmQoTVtpICogbiArIGpdICogMTAwMCkgLyAxMDAwID4gMCkge1xuICAgICAgICBjbHVzdGVyLnB1c2gobm9kZXNbal0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbHVzdGVyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgaXNEdXBsaWNhdGUgPSBmdW5jdGlvbiBpc0R1cGxpY2F0ZShjMSwgYzIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjMS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghYzJbaV0gfHwgYzFbaV0uaWQoKSAhPT0gYzJbaV0uaWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHVzdGVycztcbn07XG5cbnZhciBtYXJrb3ZDbHVzdGVyaW5nID0gZnVuY3Rpb24gbWFya292Q2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTpcblxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMob3B0aW9ucyk7IC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcblxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWQycG9zaXRpb25bbm9kZXNbaV0uaWQoKV0gPSBpO1xuICB9IC8vIEdlbmVyYXRlIHN0b2NoYXN0aWMgbWF0cml4IE0gZnJvbSBpbnB1dCBncmFwaCBHIChzaG91bGQgYmUgc3ltbWV0cmljL3VuZGlyZWN0ZWQpXG5cblxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIG4yID0gbiAqIG47XG5cbiAgdmFyIE0gPSBuZXcgQXJyYXkobjIpLFxuICAgICAgX007XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG4yOyBfaSsrKSB7XG4gICAgTVtfaV0gPSAwO1xuICB9XG5cbiAgZm9yICh2YXIgZSA9IDA7IGUgPCBlZGdlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbZV07XG4gICAgdmFyIF9pMiA9IGlkMnBvc2l0aW9uW2VkZ2Uuc291cmNlKCkuaWQoKV07XG4gICAgdmFyIGogPSBpZDJwb3NpdGlvbltlZGdlLnRhcmdldCgpLmlkKCldO1xuICAgIHZhciBzaW0gPSBnZXRTaW1pbGFyaXR5KGVkZ2UsIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgTVtfaTIgKiBuICsgal0gKz0gc2ltOyAvLyBHIHNob3VsZCBiZSBzeW1tZXRyaWMgYW5kIHVuZGlyZWN0ZWRcblxuICAgIE1baiAqIG4gKyBfaTJdICs9IHNpbTtcbiAgfSAvLyBCZWdpbiBNYXJrb3YgY2x1c3RlciBhbGdvcml0aG1cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcblxuXG4gIGFkZExvb3BzKE0sIG4sIG9wdHMubXVsdEZhY3Rvcik7IC8vIFN0ZXAgMjogTSA9IG5vcm1hbGl6ZSggTSApO1xuXG4gIG5vcm1hbGl6ZShNLCBuKTtcbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG5cbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTsgLy8gU3RlcCAzOlxuXG4gICAgX00gPSBleHBhbmQoTSwgbiwgb3B0cy5leHBhbmRGYWN0b3IpOyAvLyBTdGVwIDQ6XG5cbiAgICBNID0gaW5mbGF0ZShfTSwgbiwgb3B0cy5pbmZsYXRlRmFjdG9yKTsgLy8gU3RlcCA1OiBjaGVjayB0byBzZWUgaWYgfnN0ZWFkeSBzdGF0ZSBoYXMgYmVlbiByZWFjaGVkXG5cbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpdGVyYXRpb25zKys7XG4gIH0gLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcblxuXG4gIHZhciBjbHVzdGVycyA9IGFzc2lnbihNLCBuLCBub2RlcywgY3kpOyAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcblxuICBjbHVzdGVycyA9IHJlbW92ZUR1cGxpY2F0ZXMoY2x1c3RlcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgbWFya292Q2x1c3RlcmluZyQxID0ge1xuICBtYXJrb3ZDbHVzdGVyaW5nOiBtYXJrb3ZDbHVzdGVyaW5nLFxuICBtY2w6IG1hcmtvdkNsdXN0ZXJpbmdcbn07XG5cbi8vIENvbW1vbiBkaXN0YW5jZSBtZXRyaWNzIGZvciBjbHVzdGVyaW5nIGFsZ29yaXRobXNcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG5cbnZhciBhYnNEaWZmID0gZnVuY3Rpb24gYWJzRGlmZihwLCBxKSB7XG4gIHJldHVybiBNYXRoLmFicyhxIC0gcCk7XG59O1xuXG52YXIgYWRkQWJzRGlmZiA9IGZ1bmN0aW9uIGFkZEFic0RpZmYodG90YWwsIHAsIHEpIHtcbiAgcmV0dXJuIHRvdGFsICsgYWJzRGlmZihwLCBxKTtcbn07XG5cbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG5cbnZhciBzcXJ0ID0gZnVuY3Rpb24gc3FydCh4KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoeCk7XG59O1xuXG52YXIgbWF4QWJzRGlmZiA9IGZ1bmN0aW9uIG1heEFic0RpZmYoY3VycmVudE1heCwgcCwgcSkge1xuICByZXR1cm4gTWF0aC5tYXgoY3VycmVudE1heCwgYWJzRGlmZihwLCBxKSk7XG59O1xuXG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eTtcbiAgdmFyIHJldCA9IGluaXQ7XG4gIHZhciBwLCBxO1xuXG4gIGZvciAodmFyIGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICBwID0gZ2V0UChkaW0pO1xuICAgIHEgPSBnZXRRKGRpbSk7XG4gICAgcmV0ID0gdmlzaXQocmV0LCBwLCBxKTtcbiAgfVxuXG4gIHJldHVybiBwb3N0KHJldCk7XG59O1xuXG52YXIgZGlzdGFuY2VzID0ge1xuICBldWNsaWRlYW46IGZ1bmN0aW9uIGV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmLCBzcXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIHNpbmdsZSBhdHRyIGNhc2UsIG1vcmUgZWZmaWNpZW50IHRvIGF2b2lkIHNxcnRcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICAgIH1cbiAgfSxcbiAgc3F1YXJlZEV1Y2xpZGVhbjogZnVuY3Rpb24gc3F1YXJlZEV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAwLCBhZGRTcXVhcmVkRGlmZik7XG4gIH0sXG4gIG1hbmhhdHRhbjogZnVuY3Rpb24gbWFuaGF0dGFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heChsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAtSW5maW5pdHksIG1heEFic0RpZmYpO1xuICB9XG59OyAvLyBpbiBjYXNlIHRoZSB1c2VyIGFjY2lkZW50YWxseSBkb2Vzbid0IHVzZSBjYW1lbCBjYXNlXG5cbmRpc3RhbmNlc1snc3F1YXJlZC1ldWNsaWRlYW4nXSA9IGRpc3RhbmNlc1snc3F1YXJlZEV1Y2xpZGVhbiddO1xuZGlzdGFuY2VzWydzcXVhcmVkZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmZ1bmN0aW9uIGNsdXN0ZXJpbmdEaXN0YW5jZSAobWV0aG9kLCBsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSkge1xuICB2YXIgaW1wbDtcblxuICBpZiAoZm4obWV0aG9kKSkge1xuICAgIGltcGwgPSBtZXRob2Q7XG4gIH0gZWxzZSB7XG4gICAgaW1wbCA9IGRpc3RhbmNlc1ttZXRob2RdIHx8IGRpc3RhbmNlcy5ldWNsaWRlYW47XG4gIH1cblxuICBpZiAobGVuZ3RoID09PSAwICYmIGZuKG1ldGhvZCkpIHtcbiAgICByZXR1cm4gaW1wbChub2RlUCwgbm9kZVEpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbXBsKGxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbiAgfVxufVxuXG52YXIgZGVmYXVsdHMkNSA9IGRlZmF1bHRzKHtcbiAgazogMixcbiAgbTogMixcbiAgc2Vuc2l0aXZpdHlUaHJlc2hvbGQ6IDAuMDAwMSxcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICBtYXhJdGVyYXRpb25zOiAxMCxcbiAgYXR0cmlidXRlczogW10sXG4gIHRlc3RNb2RlOiBmYWxzZSxcbiAgdGVzdENlbnRyb2lkczogbnVsbFxufSk7XG5cbnZhciBzZXRPcHRpb25zJDEgPSBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRlZmF1bHRzJDUob3B0aW9ucyk7XG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbnZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdCh0eXBlLCBub2RlLCBjZW50cm9pZCwgYXR0cmlidXRlcywgbW9kZSkge1xuICB2YXIgbm9Ob2RlUCA9IG1vZGUgIT09ICdrTWVkb2lkcyc7XG4gIHZhciBnZXRQID0gbm9Ob2RlUCA/IGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGNlbnRyb2lkW2ldO1xuICB9IDogZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShjZW50cm9pZCk7XG4gIH07XG5cbiAgdmFyIGdldFEgPSBmdW5jdGlvbiBnZXRRKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShub2RlKTtcbiAgfTtcblxuICB2YXIgbm9kZVAgPSBjZW50cm9pZDtcbiAgdmFyIG5vZGVRID0gbm9kZTtcbiAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZ2V0UCwgZ2V0USwgbm9kZVAsIG5vZGVRKTtcbn07XG5cbnZhciByYW5kb21DZW50cm9pZHMgPSBmdW5jdGlvbiByYW5kb21DZW50cm9pZHMobm9kZXMsIGssIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIG5kaW0gPSBhdHRyaWJ1dGVzLmxlbmd0aDtcbiAgdmFyIG1pbiA9IG5ldyBBcnJheShuZGltKTtcbiAgdmFyIG1heCA9IG5ldyBBcnJheShuZGltKTtcbiAgdmFyIGNlbnRyb2lkcyA9IG5ldyBBcnJheShrKTtcbiAgdmFyIGNlbnRyb2lkID0gbnVsbDsgLy8gRmluZCBtaW4sIG1heCB2YWx1ZXMgZm9yIGVhY2ggYXR0cmlidXRlIGRpbWVuc2lvblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbmRpbTsgaSsrKSB7XG4gICAgbWluW2ldID0gbm9kZXMubWluKGF0dHJpYnV0ZXNbaV0pLnZhbHVlO1xuICAgIG1heFtpXSA9IG5vZGVzLm1heChhdHRyaWJ1dGVzW2ldKS52YWx1ZTtcbiAgfSAvLyBCdWlsZCBrIGNlbnRyb2lkcywgZWFjaCByZXByZXNlbnRlZCBhcyBhbiBuLWRpbSBmZWF0dXJlIHZlY3RvclxuXG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICBjZW50cm9pZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5kaW07IF9pKyspIHtcbiAgICAgIGNlbnRyb2lkW19pXSA9IE1hdGgucmFuZG9tKCkgKiAobWF4W19pXSAtIG1pbltfaV0pICsgbWluW19pXTsgLy8gcmFuZG9tIGluaXRpYWwgdmFsdWVcbiAgICB9XG5cbiAgICBjZW50cm9pZHNbY10gPSBjZW50cm9pZDtcbiAgfVxuXG4gIHJldHVybiBjZW50cm9pZHM7XG59O1xuXG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbnRyb2lkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaXN0ID0gZ2V0RGlzdChkaXN0YW5jZSwgbm9kZSwgY2VudHJvaWRzW2ldLCBhdHRyaWJ1dGVzLCB0eXBlKTtcblxuICAgIGlmIChkaXN0IDwgbWluKSB7XG4gICAgICBtaW4gPSBkaXN0O1xuICAgICAgaW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn07XG5cbnZhciBidWlsZENsdXN0ZXIgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXIoY2VudHJvaWQsIG5vZGVzLCBhc3NpZ25tZW50KSB7XG4gIHZhciBjbHVzdGVyID0gW107XG4gIHZhciBub2RlID0gbnVsbDtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgbm9kZSA9IG5vZGVzW25dO1xuXG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbHVzdGVyO1xufTtcblxudmFyIGhhdmVWYWx1ZXNDb252ZXJnZWQgPSBmdW5jdGlvbiBoYXZlVmFsdWVzQ29udmVyZ2VkKHYxLCB2Miwgc2Vuc2l0aXZpdHlUaHJlc2hvbGQpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHYyIC0gdjEpIDw9IHNlbnNpdGl2aXR5VGhyZXNob2xkO1xufTtcblxudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuXG4gICAgICBpZiAoZGlmZiA+IHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJhbmRvbU1lZG9pZHMgPSBmdW5jdGlvbiByYW5kb21NZWRvaWRzKG5vZGVzLCBrKSB7XG4gIHZhciBtZWRvaWRzID0gbmV3IEFycmF5KGspOyAvLyBGb3Igc21hbGwgZGF0YSBzZXRzLCB0aGUgcHJvYmFiaWxpdHkgb2YgbWVkb2lkIGNvbmZsaWN0IGlzIGdyZWF0ZXIsXG4gIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgc2VlbiBvciBjaG9zZSB0aGlzIG5vZGUgYmVmb3JlLlxuXG4gIGlmIChub2Rlcy5sZW5ndGggPCA1MCkge1xuICAgIC8vIFJhbmRvbWx5IHNlbGVjdCBrIG1lZG9pZHMgZnJvbSB0aGUgbiBub2Rlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldOyAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGNob3NlbiB0aGlzIG5vZGUgdG8gYmUgYSBtZWRvaWQsIGRvbid0IGNob29zZSBpdCBhZ2FpbiAoZm9yIHNtYWxsIGRhdGEgc2V0cykuXG4gICAgICAvLyBJbnN0ZWFkIGNob29zZSBhIGRpZmZlcmVudCByYW5kb20gbm9kZS5cblxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuXG4gICAgICBtZWRvaWRzW2ldID0gbm9kZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVsYXRpdmVseSBsYXJnZSBkYXRhIHNldCwgc28gcHJldHR5IHNhZmUgdG8gbm90IGNoZWNrIGFuZCBqdXN0IHNlbGVjdCByYW5kb20gbm9kZXNcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrOyBfaTIrKykge1xuICAgICAgbWVkb2lkc1tfaTJdID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lZG9pZHM7XG59O1xuXG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgY2x1c3Rlci5sZW5ndGg7IG4rKykge1xuICAgIGNvc3QgKz0gZ2V0RGlzdCgnbWFuaGF0dGFuJywgY2x1c3RlcltuXSwgcG90ZW50aWFsTmV3TWVkb2lkLCBhdHRyaWJ1dGVzLCAna01lZG9pZHMnKTtcbiAgfVxuXG4gIHJldHVybiBjb3N0O1xufTtcblxudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogIyBvZiBjbHVzdGVycywgZGlzdGFuY2UgbWV0cmljLCBldGMuXG5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7IC8vIEJlZ2luIGstbWVhbnMgYWxnb3JpdGhtXG5cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7IC8vIFN0ZXAgMTogSW5pdGlhbGl6ZSBjZW50cm9pZCBwb3NpdGlvbnNcblxuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBjZW50cm9pZFxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tuXTsgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG5cbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIGNlbnRyb2lkcywgb3B0cy5kaXN0YW5jZSwgb3B0cy5hdHRyaWJ1dGVzLCAna01lYW5zJyk7XG4gICAgfSAvLyBTdGVwIDM6IEZvciBlYWNoIG9mIHRoZSBrIGNsdXN0ZXJzLCB1cGRhdGUgaXRzIGNlbnRyb2lkXG5cblxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgb3B0cy5rOyBjKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjbHVzdGVyXG4gICAgICB2YXIgY2x1c3RlciA9IGJ1aWxkQ2x1c3RlcihjLCBub2RlcywgYXNzaWdubWVudCk7XG5cbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cblxuXG4gICAgICB2YXIgbmRpbSA9IG9wdHMuYXR0cmlidXRlcy5sZW5ndGg7XG4gICAgICB2YXIgY2VudHJvaWQgPSBjZW50cm9pZHNbY107IC8vIFsgZGltXzEsIGRpbV8yLCBkaW1fMywgLi4uICwgZGltX24gXVxuXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuXG4gICAgICBmb3IgKHZhciBkID0gMDsgZCA8IG5kaW07IGQrKykge1xuICAgICAgICBzdW1bZF0gPSAwLjA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbm9kZSA9IGNsdXN0ZXJbaV07XG4gICAgICAgICAgc3VtW2RdICs9IG9wdHMuYXR0cmlidXRlc1tkXShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7IC8vIENoZWNrIHRvIHNlZSBpZiBhbGdvcml0aG0gaGFzIGNvbnZlcmdlZCwgaS5lLiB3aGVuIGNlbnRyb2lkcyBubyBsb25nZXIgY2hhbmdlXG5cbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjZW50cm9pZHNbY10gPSBuZXdDZW50cm9pZDtcbiAgICAgIGNsdXN0ZXJzW2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyKTtcbiAgICB9XG5cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIga01lZG9pZHMgPSBmdW5jdGlvbiBrTWVkb2lkcyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQxKG9wdGlvbnMpOyAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG5cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBtZWRvaWRzO1xuICB2YXIgYXNzaWdubWVudCA9IHt9O1xuICB2YXIgY3VyQ29zdDtcbiAgdmFyIG1pbkNvc3RzID0gbmV3IEFycmF5KG9wdHMuayk7IC8vIG1pbmltdW0gY29zdCBjb25maWd1cmF0aW9uIGZvciBlYWNoIGNsdXN0ZXJcbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuXG4gIGlmIChvcHRzLnRlc3RNb2RlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzLnRlc3RDZW50cm9pZHMgPT09ICdudW1iZXInKSA7IGVsc2UgaWYgKF90eXBlb2Yob3B0cy50ZXN0Q2VudHJvaWRzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1lZG9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lZG9pZHMgPSByYW5kb21NZWRvaWRzKG5vZGVzLCBvcHRzLmspO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgfVxuXG4gIHZhciBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuXG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07IC8vIERldGVybWluZSB3aGljaCBjbHVzdGVyIHRoaXMgbm9kZSBiZWxvbmdzIHRvOiBub2RlIGlkID0+IGNsdXN0ZXIgI1xuXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBtZWRvaWRzLCBvcHRzLmRpc3RhbmNlLCBvcHRzLmF0dHJpYnV0ZXMsICdrTWVkb2lkcycpO1xuICAgIH1cblxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTsgLy8gU3RlcCAzOiBGb3IgZWFjaCBtZWRvaWQgbSwgYW5kIGZvciBlYWNoIG5vZGUgYXNzY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cblxuICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbWVkb2lkcy5sZW5ndGg7IG0rKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIG1lZG9pZFxuICAgICAgdmFyIGNsdXN0ZXIgPSBidWlsZENsdXN0ZXIobSwgbm9kZXMsIGFzc2lnbm1lbnQpO1xuXG4gICAgICBpZiAoY2x1c3Rlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gSWYgY2x1c3RlciBpcyBlbXB0eSwgYnJlYWsgb3V0IGVhcmx5ICYgbW92ZSB0byBuZXh0IGNsdXN0ZXJcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuICAgICAgLy8gU2VsZWN0IGRpZmZlcmVudCBtZWRvaWQgaWYgaXRzIGNvbmZpZ3VyYXRpb24gaGFzIHRoZSBsb3dlc3QgY29zdFxuXG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmIChjdXJDb3N0IDwgbWluQ29zdHNbbV0pIHtcbiAgICAgICAgICBtaW5Db3N0c1ttXSA9IGN1ckNvc3Q7XG4gICAgICAgICAgbWVkb2lkc1ttXSA9IGNsdXN0ZXJbX25dO1xuICAgICAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsdXN0ZXJzW21dID0gY3kuY29sbGVjdGlvbihjbHVzdGVyKTtcbiAgICB9XG5cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgdXBkYXRlQ2VudHJvaWRzID0gZnVuY3Rpb24gdXBkYXRlQ2VudHJvaWRzKGNlbnRyb2lkcywgbm9kZXMsIFUsIHdlaWdodCwgb3B0cykge1xuICB2YXIgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2MgPSAwOyBfYyA8IGNlbnRyb2lkcy5sZW5ndGg7IF9jKyspIHtcbiAgICBmb3IgKHZhciBkaW0gPSAwOyBkaW0gPCBvcHRzLmF0dHJpYnV0ZXMubGVuZ3RoOyBkaW0rKykge1xuICAgICAgbnVtZXJhdG9yID0gMDtcbiAgICAgIGRlbm9taW5hdG9yID0gMDtcblxuICAgICAgZm9yICh2YXIgX24yID0gMDsgX24yIDwgbm9kZXMubGVuZ3RoOyBfbjIrKykge1xuICAgICAgICBudW1lcmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdICogb3B0cy5hdHRyaWJ1dGVzW2RpbV0obm9kZXNbX24yXSk7XG4gICAgICAgIGRlbm9taW5hdG9yICs9IHdlaWdodFtfbjJdW19jXTtcbiAgICAgIH1cblxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xuXG52YXIgdXBkYXRlTWVtYmVyc2hpcCA9IGZ1bmN0aW9uIHVwZGF0ZU1lbWJlcnNoaXAoVSwgX1UsIGNlbnRyb2lkcywgbm9kZXMsIG9wdHMpIHtcbiAgLy8gU2F2ZSBwcmV2aW91cyBzdGVwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVS5sZW5ndGg7IGkrKykge1xuICAgIF9VW2ldID0gVVtpXS5zbGljZSgpO1xuICB9XG5cbiAgdmFyIHN1bSwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjtcbiAgdmFyIHBvdyA9IDIgLyAob3B0cy5tIC0gMSk7XG5cbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGNlbnRyb2lkcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAvLyBhZ2FpbnN0IGFsbCBvdGhlciBjZW50cm9pZHNcbiAgICAgICAgbnVtZXJhdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2NdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgZGVub21pbmF0b3IgPSBnZXREaXN0KG9wdHMuZGlzdGFuY2UsIG5vZGVzW25dLCBjZW50cm9pZHNba10sIG9wdHMuYXR0cmlidXRlcywgJ2NtZWFucycpO1xuICAgICAgICBzdW0gKz0gTWF0aC5wb3cobnVtZXJhdG9yIC8gZGVub21pbmF0b3IsIHBvdyk7XG4gICAgICB9XG5cbiAgICAgIFVbbl1bY10gPSAxIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcblxuICBmb3IgKHZhciBjID0gMDsgYyA8IGNsdXN0ZXJzLmxlbmd0aDsgYysrKSB7XG4gICAgY2x1c3RlcnNbY10gPSBbXTtcbiAgfVxuXG4gIHZhciBtYXg7XG4gIHZhciBpbmRleDtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTsgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhlIG5vZGUgaXMgbW9zdCBsaWtlbHkgdG8gYmVsb25nIGluXG5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbHVzdGVyc1tpbmRleF0ucHVzaChub2Rlc1tuXSk7XG4gIH0gLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuXG5cbiAgZm9yICh2YXIgX2MzID0gMDsgX2MzIDwgY2x1c3RlcnMubGVuZ3RoOyBfYzMrKykge1xuICAgIGNsdXN0ZXJzW19jM10gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXJzW19jM10pO1xuICB9XG5cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcblxudmFyIGZ1enp5Q01lYW5zID0gZnVuY3Rpb24gZnV6enlDTWVhbnMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7IC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG5cbiAgdmFyIGNsdXN0ZXJzO1xuICB2YXIgY2VudHJvaWRzO1xuICB2YXIgVTtcblxuICB2YXIgX1U7XG5cbiAgdmFyIHdlaWdodDsgLy8gU3RlcCAxOiBJbml0aWFsaXplIGxldGlhYmxlcy5cblxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBfVVtpXSA9IG5ldyBBcnJheShvcHRzLmspO1xuICB9XG5cbiAgVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICB2YXIgdG90YWwgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBvcHRzLms7IGorKykge1xuICAgICAgVVtfaTRdW2pdID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIHRvdGFsICs9IFVbX2k0XVtqXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuXG4gIGNlbnRyb2lkcyA9IG5ldyBBcnJheShvcHRzLmspO1xuXG4gIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG9wdHMuazsgX2k1KyspIHtcbiAgICBjZW50cm9pZHNbX2k1XSA9IG5ldyBBcnJheShvcHRzLmF0dHJpYnV0ZXMubGVuZ3RoKTtcbiAgfVxuXG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuXG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG5vZGVzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICB3ZWlnaHRbX2k2XSA9IG5ldyBBcnJheShvcHRzLmspO1xuICB9IC8vIGVuZCBpbml0IEZDTVxuXG5cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG5cbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTsgLy8gU3RlcCAyOiBDYWxjdWxhdGUgdGhlIGNlbnRyb2lkcyBmb3IgZWFjaCBzdGVwLlxuXG4gICAgdXBkYXRlQ2VudHJvaWRzKGNlbnRyb2lkcywgbm9kZXMsIFUsIHdlaWdodCwgb3B0cyk7IC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG5cbiAgICB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKTsgLy8gU3RlcCA0OiBDaGVjayBmb3IgY29udmVyZ2VuY2UuXG5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfSAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuXG5cbiAgY2x1c3RlcnMgPSBhc3NpZ24kMShub2RlcywgVSwgb3B0cywgY3kpO1xuICByZXR1cm4ge1xuICAgIGNsdXN0ZXJzOiBjbHVzdGVycyxcbiAgICBkZWdyZWVPZk1lbWJlcnNoaXA6IFVcbiAgfTtcbn07XG5cbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyQ2ID0gZGVmYXVsdHMoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIG5vZGVzXG4gIGxpbmthZ2U6ICdtaW4nLFxuICAvLyBsaW5rYWdlIGNyaXRlcmlvbiA6IGhvdyB0byBkZXRlcm1pbmUgdGhlIGRpc3RhbmNlIGJldHdlZW4gY2x1c3RlcnMgb2Ygbm9kZXNcbiAgbW9kZTogJ3RocmVzaG9sZCcsXG4gIC8vIG1vZGU6J3RocmVzaG9sZCcgPT4gY2x1c3RlcnMgbXVzdCBiZSB0aHJlc2hvbGQgZGlzdGFuY2UgYXBhcnRcbiAgdGhyZXNob2xkOiBJbmZpbml0eSxcbiAgLy8gdGhlIGRpc3RhbmNlIHRocmVzaG9sZFxuICAvLyBtb2RlOidkZW5kcm9ncmFtJyA9PiB0aGUgbm9kZXMgYXJlIG9yZ2FuaXNlZCBhcyBsZWF2ZXMgaW4gYSB0cmVlIChzaWJsaW5ncyBhcmUgY2xvc2UpLCBtZXJnaW5nIG1ha2VzIGNsdXN0ZXJzXG4gIGFkZERlbmRyb2dyYW06IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGFkZCB0aGUgZGVuZHJvZ3JhbSB0byB0aGUgZ3JhcGggZm9yIHZpelxuICBkZW5kcm9ncmFtRGVwdGg6IDAsXG4gIC8vIGRlcHRoIGF0IHdoaWNoIGRlbmRyb2dyYW0gYnJhbmNoZXMgYXJlIG1lcmdlZCBpbnRvIHRoZSByZXR1cm5lZCBjbHVzdGVyc1xuICBhdHRyaWJ1dGVzOiBbXSAvLyBhcnJheSBvZiBhdHRyIGZ1bmN0aW9uc1xuXG59KTtcbnZhciBsaW5rYWdlQWxpYXNlcyA9IHtcbiAgJ3NpbmdsZSc6ICdtaW4nLFxuICAnY29tcGxldGUnOiAnbWF4J1xufTtcblxudmFyIHNldE9wdGlvbnMkMiA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IGRlZmF1bHRzJDYob3B0aW9ucyk7XG4gIHZhciBwcmVmZXJyZWRBbGlhcyA9IGxpbmthZ2VBbGlhc2VzW29wdHMubGlua2FnZV07XG5cbiAgaWYgKHByZWZlcnJlZEFsaWFzICE9IG51bGwpIHtcbiAgICBvcHRzLmxpbmthZ2UgPSBwcmVmZXJyZWRBbGlhcztcbiAgfVxuXG4gIHJldHVybiBvcHRzO1xufTtcblxudmFyIG1lcmdlQ2xvc2VzdCA9IGZ1bmN0aW9uIG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKSB7XG4gIC8vIEZpbmQgdHdvIGNsb3Nlc3QgY2x1c3RlcnMgZnJvbSBjYWNoZWQgbWluc1xuICB2YXIgbWluS2V5ID0gMDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgZGlzdDtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuXG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGNsdXN0ZXJzW2ldLmtleTtcbiAgICB2YXIgX2Rpc3QgPSBkaXN0c1trZXldW21pbnNba2V5XV07XG5cbiAgICBpZiAoX2Rpc3QgPCBtaW4pIHtcbiAgICAgIG1pbktleSA9IGtleTtcbiAgICAgIG1pbiA9IF9kaXN0O1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLm1vZGUgPT09ICd0aHJlc2hvbGQnICYmIG1pbiA+PSBvcHRzLnRocmVzaG9sZCB8fCBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyAmJiBjbHVzdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYzEgPSBpbmRleFttaW5LZXldO1xuICB2YXIgYzIgPSBpbmRleFttaW5zW21pbktleV1dO1xuICB2YXIgbWVyZ2VkOyAvLyBNZXJnZSB0d28gY2xvc2VzdCBjbHVzdGVyc1xuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIG1lcmdlZCA9IHtcbiAgICAgIGxlZnQ6IGMxLFxuICAgICAgcmlnaHQ6IGMyLFxuICAgICAga2V5OiBjMS5rZXlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZCA9IHtcbiAgICAgIHZhbHVlOiBjMS52YWx1ZS5jb25jYXQoYzIudmFsdWUpLFxuICAgICAga2V5OiBjMS5rZXlcbiAgICB9O1xuICB9XG5cbiAgY2x1c3RlcnNbYzEuaW5kZXhdID0gbWVyZ2VkO1xuICBjbHVzdGVycy5zcGxpY2UoYzIuaW5kZXgsIDEpO1xuICBpbmRleFtjMS5rZXldID0gbWVyZ2VkOyAvLyBVcGRhdGUgZGlzdGFuY2VzIHdpdGggbmV3IG1lcmdlZCBjbHVzdGVyXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNsdXN0ZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBjdXIgPSBjbHVzdGVyc1tfaV07XG5cbiAgICBpZiAoYzEua2V5ID09PSBjdXIua2V5KSB7XG4gICAgICBkaXN0ID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtaW4nKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcblxuICAgICAgaWYgKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPiBkaXN0c1tjMi5rZXldW2N1ci5rZXldKSB7XG4gICAgICAgIGRpc3QgPSBkaXN0c1tjMi5rZXldW2N1ci5rZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWF4Jykge1xuICAgICAgZGlzdCA9IGRpc3RzW2MxLmtleV1bY3VyLmtleV07XG5cbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldIDwgZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21lYW4nKSB7XG4gICAgICBkaXN0ID0gKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gKiBjMS5zaXplICsgZGlzdHNbYzIua2V5XVtjdXIua2V5XSAqIGMyLnNpemUpIC8gKGMxLnNpemUgKyBjMi5zaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSBkaXN0ID0gZ2V0RGlzdChjdXIudmFsdWUsIGMxLnZhbHVlKTtlbHNlIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZVswXSwgYzEudmFsdWVbMF0pO1xuICAgIH1cblxuICAgIGRpc3RzW2MxLmtleV1bY3VyLmtleV0gPSBkaXN0c1tjdXIua2V5XVtjMS5rZXldID0gZGlzdDsgLy8gZGlzdGFuY2UgbWF0cml4IGlzIHN5bW1ldHJpY1xuICB9IC8vIFVwZGF0ZSBjYWNoZWQgbWluc1xuXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgY2x1c3RlcnMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBrZXkxID0gY2x1c3RlcnNbX2kyXS5rZXk7XG5cbiAgICBpZiAobWluc1trZXkxXSA9PT0gYzEua2V5IHx8IG1pbnNba2V5MV0gPT09IGMyLmtleSkge1xuICAgICAgdmFyIF9taW4gPSBrZXkxO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrZXkyID0gY2x1c3RlcnNbal0ua2V5O1xuXG4gICAgICAgIGlmIChkaXN0c1trZXkxXVtrZXkyXSA8IGRpc3RzW2tleTFdW19taW5dKSB7XG4gICAgICAgICAgX21pbiA9IGtleTI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWluc1trZXkxXSA9IF9taW47XG4gICAgfVxuXG4gICAgY2x1c3RlcnNbX2kyXS5pbmRleCA9IF9pMjtcbiAgfSAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuXG5cbiAgYzEua2V5ID0gYzIua2V5ID0gYzEuaW5kZXggPSBjMi5pbmRleCA9IG51bGw7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGdldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcblxuICBpZiAocm9vdC52YWx1ZSkge1xuICAgIGFyci5wdXNoKHJvb3QudmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgYXJyKTtcbiAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgYXJyKTtcbiAgfVxufTtcblxudmFyIGJ1aWxkRGVuZHJvZ3JhbSA9IGZ1bmN0aW9uIGJ1aWxkRGVuZHJvZ3JhbShyb290LCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybiAnJztcblxuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LmxlZnQsIGN5KTtcbiAgICB2YXIgcmlnaHRTdHIgPSBidWlsZERlbmRyb2dyYW0ocm9vdC5yaWdodCwgY3kpO1xuICAgIHZhciBub2RlID0gY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogbGVmdFN0ciArICcsJyArIHJpZ2h0U3RyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IGxlZnRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IHJpZ2h0U3RyLFxuICAgICAgICB0YXJnZXQ6IG5vZGUuaWQoKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlLmlkKCk7XG4gIH0gZWxzZSBpZiAocm9vdC52YWx1ZSkge1xuICAgIHJldHVybiByb290LnZhbHVlLmlkKCk7XG4gIH1cbn07XG5cbnZhciBidWlsZENsdXN0ZXJzRnJvbVRyZWUgPSBmdW5jdGlvbiBidWlsZENsdXN0ZXJzRnJvbVRyZWUocm9vdCwgaywgY3kpIHtcbiAgaWYgKCFyb290KSByZXR1cm4gW107XG4gIHZhciBsZWZ0ID0gW10sXG4gICAgICByaWdodCA9IFtdLFxuICAgICAgbGVhdmVzID0gW107XG5cbiAgaWYgKGsgPT09IDApIHtcbiAgICAvLyBkb24ndCBjdXQgdHJlZSwgc2ltcGx5IHJldHVybiBhbGwgbm9kZXMgYXMgMSBzaW5nbGUgY2x1c3RlclxuICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIHJpZ2h0KTtcbiAgICBsZWF2ZXMgPSBsZWZ0LmNvbmNhdChyaWdodCk7XG4gICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlYXZlcyldO1xuICB9IGVsc2UgaWYgKGsgPT09IDEpIHtcbiAgICAvLyBjdXQgYXQgcm9vdFxuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAvLyBsZWFmIG5vZGVcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgcmlnaHQpO1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlZnQpLCBjeS5jb2xsZWN0aW9uKHJpZ2h0KV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24ocm9vdC52YWx1ZSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm9vdC5sZWZ0KSBsZWZ0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QubGVmdCwgayAtIDEsIGN5KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSByaWdodCA9IGJ1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cblxudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcgPSBmdW5jdGlvbiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7IC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cblxuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuXG4gIHZhciBnZXREaXN0ID0gZnVuY3Rpb24gZ2V0RGlzdChuMSwgbjIpIHtcbiAgICByZXR1cm4gY2x1c3RlcmluZ0Rpc3RhbmNlKG9wdHMuZGlzdGFuY2UsIGF0dHJzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMSk7XG4gICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBhdHRyc1tpXShuMik7XG4gICAgfSwgbjEsIG4yKTtcbiAgfTsgLy8gQmVnaW4gaGllcmFyY2hpY2FsIGFsZ29yaXRobVxuXG5cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcblxuICB2YXIgbWlucyA9IFtdOyAvLyBjbG9zZXN0IGNsdXN0ZXIgZm9yIGVhY2ggY2x1c3RlclxuXG4gIHZhciBpbmRleCA9IFtdOyAvLyBoYXNoIG9mIGFsbCBjbHVzdGVycyBieSBrZXlcbiAgLy8gSW4gYWdnbG9tZXJhdGl2ZSAoYm90dG9tLXVwKSBjbHVzdGVyaW5nLCBlYWNoIG5vZGUgc3RhcnRzIGFzIGl0cyBvd24gY2x1c3RlclxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICB2YXIgY2x1c3RlciA9IHtcbiAgICAgIHZhbHVlOiBvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJyA/IG5vZGVzW25dIDogW25vZGVzW25dXSxcbiAgICAgIGtleTogbixcbiAgICAgIGluZGV4OiBuXG4gICAgfTtcbiAgICBjbHVzdGVyc1tuXSA9IGNsdXN0ZXI7XG4gICAgaW5kZXhbbl0gPSBjbHVzdGVyO1xuICAgIGRpc3RzW25dID0gW107XG4gICAgbWluc1tuXSA9IDA7XG4gIH0gLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcGFpciBvZiBjbHVzdGVyc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgICAgICAvLyBtb2RlcyBzdG9yZSBjbHVzdGVyIHZhbHVlcyBkaWZmZXJlbnRseVxuICAgICAgICBkaXN0ID0gaSA9PT0gaiA/IEluZmluaXR5IDogZ2V0RGlzdChjbHVzdGVyc1tpXS52YWx1ZSwgY2x1c3RlcnNbal0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWVbMF0sIGNsdXN0ZXJzW2pdLnZhbHVlWzBdKTtcbiAgICAgIH1cblxuICAgICAgZGlzdHNbaV1bal0gPSBkaXN0O1xuICAgICAgZGlzdHNbal1baV0gPSBkaXN0O1xuXG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBGaW5kIHRoZSBjbG9zZXN0IHBhaXIgb2YgY2x1c3RlcnMgYW5kIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSBjbHVzdGVyLlxuICAvLyBVcGRhdGUgZGlzdGFuY2VzIGJldHdlZW4gbmV3IGNsdXN0ZXIgYW5kIGVhY2ggb2YgdGhlIG9sZCBjbHVzdGVycywgYW5kIGxvb3AgdW50aWwgdGhyZXNob2xkIHJlYWNoZWQuXG5cblxuICB2YXIgbWVyZ2VkID0gbWVyZ2VDbG9zZXN0KGNsdXN0ZXJzLCBpbmRleCwgZGlzdHMsIG1pbnMsIG9wdHMpO1xuXG4gIHdoaWxlIChtZXJnZWQpIHtcbiAgICBtZXJnZWQgPSBtZXJnZUNsb3Nlc3QoY2x1c3RlcnMsIGluZGV4LCBkaXN0cywgbWlucywgb3B0cyk7XG4gIH1cblxuICB2YXIgcmV0Q2x1c3RlcnM7IC8vIERlbmRyb2dyYW0gbW9kZSBidWlsZHMgdGhlIGhpZXJhcmNoeSBhbmQgYWRkcyBpbnRlcm1lZGlhcnkgbm9kZXMgKyBlZGdlc1xuICAvLyBpbiBhZGRpdGlvbiB0byByZXR1cm5pbmcgdGhlIGNsdXN0ZXJzLlxuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKGNsdXN0ZXJzWzBdLCBvcHRzLmRlbmRyb2dyYW1EZXB0aCwgY3kpO1xuICAgIGlmIChvcHRzLmFkZERlbmRyb2dyYW0pIGJ1aWxkRGVuZHJvZ3JhbShjbHVzdGVyc1swXSwgY3kpO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgbW9kZSBzaW1wbHkgcmV0dXJucyB0aGUgY2x1c3RlcnNcbiAgICByZXRDbHVzdGVycyA9IG5ldyBBcnJheShjbHVzdGVycy5sZW5ndGgpO1xuICAgIGNsdXN0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXIsIGkpIHtcbiAgICAgIC8vIENsZWFuIHVwIG1ldGEgZGF0YSB1c2VkIGZvciBjbHVzdGVyaW5nXG4gICAgICBjbHVzdGVyLmtleSA9IGNsdXN0ZXIuaW5kZXggPSBudWxsO1xuICAgICAgcmV0Q2x1c3RlcnNbaV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIudmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcblxudmFyIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSA9IHtcbiAgaGllcmFyY2hpY2FsQ2x1c3RlcmluZzogaGllcmFyY2hpY2FsQ2x1c3RlcmluZyxcbiAgaGNhOiBoaWVyYXJjaGljYWxDbHVzdGVyaW5nXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyQ3ID0gZGVmYXVsdHMoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIGF0dHJpYnV0ZXMgYmV0d2VlbiB0d28gbm9kZXNcbiAgcHJlZmVyZW5jZTogJ21lZGlhbicsXG4gIC8vIHN1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICBkYW1waW5nOiAwLjgsXG4gIC8vIGRhbXBpbmcgZmFjdG9yIGJldHdlZW4gWzAuNSwgMSlcbiAgbWF4SXRlcmF0aW9uczogMTAwMCxcbiAgLy8gbWF4IG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1blxuICBtaW5JdGVyYXRpb25zOiAxMDAsXG4gIC8vIG1pbiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gaW4gb3JkZXIgZm9yIGNsdXN0ZXJpbmcgdG8gc3RvcFxuICBhdHRyaWJ1dGVzOiBbLy8gZnVuY3Rpb25zIHRvIHF1YW50aWZ5IHRoZSBzaW1pbGFyaXR5IGJldHdlZW4gYW55IHR3byBwb2ludHNcbiAgICAvLyBlLmcuIG5vZGUgPT4gbm9kZS5kYXRhKCd3ZWlnaHQnKVxuICBdXG59KTtcblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgZG1wID0gb3B0aW9ucy5kYW1waW5nO1xuICB2YXIgcHJlZiA9IG9wdGlvbnMucHJlZmVyZW5jZTtcblxuICBpZiAoISgwLjUgPD0gZG1wICYmIGRtcCA8IDEpKSB7XG4gICAgZXJyb3IoXCJEYW1waW5nIG11c3QgcmFuZ2Ugb24gWzAuNSwgMSkuICBHb3Q6IFwiLmNvbmNhdChkbXApKTtcbiAgfVxuXG4gIHZhciB2YWxpZFByZWZzID0gWydtZWRpYW4nLCAnbWVhbicsICdtaW4nLCAnbWF4J107XG5cbiAgaWYgKCEodmFsaWRQcmVmcy5zb21lKGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIHYgPT09IHByZWY7XG4gIH0pIHx8IG51bWJlcihwcmVmKSkpIHtcbiAgICBlcnJvcihcIlByZWZlcmVuY2UgbXVzdCBiZSBvbmUgb2YgW1wiLmNvbmNhdCh2YWxpZFByZWZzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIFwiJ1wiLmNvbmNhdChwLCBcIidcIik7XG4gICAgfSkuam9pbignLCAnKSwgXCJdIG9yIGEgbnVtYmVyLiAgR290OiBcIikuY29uY2F0KHByZWYpKTtcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0cyQ3KG9wdGlvbnMpO1xufTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuXG52YXIgZ2V0U2ltaWxhcml0eSQxID0gZnVuY3Rpb24gZ2V0U2ltaWxhcml0eSh0eXBlLCBuMSwgbjIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGF0dHIgPSBmdW5jdGlvbiBhdHRyKG4sIGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShuKTtcbiAgfTsgLy8gbmIgbmVnYXRpdmUgYmVjYXVzZSBzaW1pbGFyaXR5IHNob3VsZCBoYXZlIGFuIGludmVyc2UgcmVsYXRpb25zaGlwIHRvIGRpc3RhbmNlXG5cblxuICByZXR1cm4gLWNsdXN0ZXJpbmdEaXN0YW5jZSh0eXBlLCBhdHRyaWJ1dGVzLmxlbmd0aCwgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cihuMSwgaSk7XG4gIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGF0dHIobjIsIGkpO1xuICB9LCBuMSwgbjIpO1xufTtcblxudmFyIGdldFByZWZlcmVuY2UgPSBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKFMsIHByZWZlcmVuY2UpIHtcbiAgLy8gbGFyZ2VyIHByZWZlcmVuY2UgPSBncmVhdGVyICMgb2YgY2x1c3RlcnNcbiAgdmFyIHAgPSBudWxsO1xuXG4gIGlmIChwcmVmZXJlbmNlID09PSAnbWVkaWFuJykge1xuICAgIHAgPSBtZWRpYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21lYW4nKSB7XG4gICAgcCA9IG1lYW4oUyk7XG4gIH0gZWxzZSBpZiAocHJlZmVyZW5jZSA9PT0gJ21pbicpIHtcbiAgICBwID0gbWluKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtYXgnKSB7XG4gICAgcCA9IG1heChTKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDdXN0b20gcHJlZmVyZW5jZSBudW1iZXIsIGFzIHNldCBieSB1c2VyXG4gICAgcCA9IHByZWZlcmVuY2U7XG4gIH1cblxuICByZXR1cm4gcDtcbn07XG5cbnZhciBmaW5kRXhlbXBsYXJzID0gZnVuY3Rpb24gZmluZEV4ZW1wbGFycyhuLCBSLCBBKSB7XG4gIHZhciBpbmRpY2VzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBpZiAoUltpICogbiArIGldICsgQVtpICogbiArIGldID4gMCkge1xuICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRpY2VzO1xufTtcblxudmFyIGFzc2lnbkNsdXN0ZXJzID0gZnVuY3Rpb24gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcblxuICAgIGZvciAodmFyIGVpID0gMDsgZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBlaSsrKSB7XG4gICAgICB2YXIgZSA9IGV4ZW1wbGFyc1tlaV07XG5cbiAgICAgIGlmIChTW2kgKiBuICsgZV0gPiBtYXgpIHtcbiAgICAgICAgaW5kZXggPSBlO1xuICAgICAgICBtYXggPSBTW2kgKiBuICsgZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2VpID0gMDsgX2VpIDwgZXhlbXBsYXJzLmxlbmd0aDsgX2VpKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNbX2VpXV0gPSBleGVtcGxhcnNbX2VpXTtcbiAgfVxuXG4gIHJldHVybiBjbHVzdGVycztcbn07XG5cbnZhciBhc3NpZ24kMiA9IGZ1bmN0aW9uIGFzc2lnbihuLCBTLCBleGVtcGxhcnMpIHtcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKTtcblxuICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgIHZhciBpaSA9IFtdO1xuXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2NdID09PSBleGVtcGxhcnNbZWldKSB7XG4gICAgICAgIGlpLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1heEkgPSAtMTtcbiAgICB2YXIgbWF4U3VtID0gLUluZmluaXR5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaWkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3VtICs9IFNbaWlbal0gKiBuICsgaWlbaV1dO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VtID4gbWF4U3VtKSB7XG4gICAgICAgIG1heEkgPSBpO1xuICAgICAgICBtYXhTdW0gPSBzdW07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZXhlbXBsYXJzW2VpXSA9IGlpW21heEldO1xuICB9XG5cbiAgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICByZXR1cm4gY2x1c3RlcnM7XG59O1xuXG52YXIgYWZmaW5pdHlQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIGFmZmluaXR5UHJvcGFnYXRpb24ob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDMob3B0aW9ucyk7IC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcblxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWQycG9zaXRpb25bbm9kZXNbaV0uaWQoKV0gPSBpO1xuICB9IC8vIEJlZ2luIGFmZmluaXR5IHByb3BhZ2F0aW9uIGFsZ29yaXRobVxuXG5cbiAgdmFyIG47IC8vIG51bWJlciBvZiBkYXRhIHBvaW50c1xuXG4gIHZhciBuMjsgLy8gc2l6ZSBvZiBtYXRyaWNlc1xuXG4gIHZhciBTOyAvLyBzaW1pbGFyaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgdmFyIHA7IC8vIHByZWZlcmVuY2Uvc3VpdGFiaWxpdHkgb2YgYSBkYXRhIHBvaW50IHRvIHNlcnZlIGFzIGFuIGV4ZW1wbGFyXG5cbiAgdmFyIFI7IC8vIHJlc3BvbnNpYmlsaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG5cbiAgdmFyIEE7IC8vIGF2YWlsYWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuXG4gIG4gPSBub2Rlcy5sZW5ndGg7XG4gIG4yID0gbiAqIG47IC8vIEluaXRpYWxpemUgYW5kIGJ1aWxkIFMgc2ltaWxhcml0eSBtYXRyaXhcblxuICBTID0gbmV3IEFycmF5KG4yKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbjI7IF9pKyspIHtcbiAgICBTW19pXSA9IC1JbmZpbml0eTsgLy8gZm9yIGNhc2VzIHdoZXJlIHR3byBkYXRhIHBvaW50cyBzaG91bGRuJ3QgYmUgbGlua2VkIHRvZ2V0aGVyXG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuOyBfaTIrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICBpZiAoX2kyICE9PSBqKSB7XG4gICAgICAgIFNbX2kyICogbiArIGpdID0gZ2V0U2ltaWxhcml0eSQxKG9wdHMuZGlzdGFuY2UsIG5vZGVzW19pMl0sIG5vZGVzW2pdLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQbGFjZSBwcmVmZXJlbmNlcyBvbiB0aGUgZGlhZ29uYWwgb2YgU1xuXG5cbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBuOyBfaTMrKykge1xuICAgIFNbX2kzICogbiArIF9pM10gPSBwO1xuICB9IC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcblxuXG4gIFIgPSBuZXcgQXJyYXkobjIpO1xuXG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfSAvLyBJbml0aWFsaXplIEEgYXZhaWxhYmlsaXR5IG1hdHJpeFxuXG5cbiAgQSA9IG5ldyBBcnJheShuMik7XG5cbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbjI7IF9pNSsrKSB7XG4gICAgQVtfaTVdID0gMC4wO1xuICB9XG5cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG5cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbjsgX2k2KyspIHtcbiAgICBvbGRbX2k2XSA9IDAuMDtcbiAgICBScFtfaTZdID0gMC4wO1xuICAgIHNlW19pNl0gPSAwO1xuICB9XG5cbiAgdmFyIGUgPSBuZXcgQXJyYXkobiAqIG9wdHMubWluSXRlcmF0aW9ucyk7XG5cbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuXG4gIHZhciBpdGVyO1xuXG4gIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBvcHRzLm1heEl0ZXJhdGlvbnM7IGl0ZXIrKykge1xuICAgIC8vIG1haW4gYWxnb3JpdGhtaWMgbG9vcFxuICAgIC8vIFVwZGF0ZSBSIHJlc3BvbnNpYmlsaXR5IG1hdHJpeFxuICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG47IF9pOCsrKSB7XG4gICAgICB2YXIgbWF4ID0gLUluZmluaXR5LFxuICAgICAgICAgIG1heDIgPSAtSW5maW5pdHksXG4gICAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICAgIEFTID0gMC4wO1xuXG4gICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgbjsgX2orKykge1xuICAgICAgICBvbGRbX2pdID0gUltfaTggKiBuICsgX2pdO1xuICAgICAgICBBUyA9IEFbX2k4ICogbiArIF9qXSArIFNbX2k4ICogbiArIF9qXTtcblxuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG47IF9qMisrKSB7XG4gICAgICAgIFJbX2k4ICogbiArIF9qMl0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoU1tfaTggKiBuICsgX2oyXSAtIG1heCkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2oyXTtcbiAgICAgIH1cblxuICAgICAgUltfaTggKiBuICsgbWF4SV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoU1tfaTggKiBuICsgbWF4SV0gLSBtYXgyKSArIG9wdHMuZGFtcGluZyAqIG9sZFttYXhJXTtcbiAgICB9IC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcblxuXG4gICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbjsgX2k5KyspIHtcbiAgICAgIHZhciBzdW0gPSAwO1xuXG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG5cbiAgICAgIHN1bSAtPSBScFtfaTldO1xuICAgICAgUnBbX2k5XSA9IFJbX2k5ICogbiArIF9pOV07XG4gICAgICBzdW0gKz0gUnBbX2k5XTtcblxuICAgICAgZm9yICh2YXIgX2o0ID0gMDsgX2o0IDwgbjsgX2o0KyspIHtcbiAgICAgICAgQVtfajQgKiBuICsgX2k5XSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIE1hdGgubWluKDAsIHN1bSAtIFJwW19qNF0pICsgb3B0cy5kYW1waW5nICogb2xkW19qNF07XG4gICAgICB9XG5cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9IC8vIENoZWNrIGZvciBjb252ZXJnZW5jZVxuXG5cbiAgICB2YXIgSyA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG47IF9pMTArKykge1xuICAgICAgdmFyIEUgPSBBW19pMTAgKiBuICsgX2kxMF0gKyBSW19pMTAgKiBuICsgX2kxMF0gPiAwID8gMSA6IDA7XG4gICAgICBlW2l0ZXIgJSBvcHRzLm1pbkl0ZXJhdGlvbnMgKiBuICsgX2kxMF0gPSBFO1xuICAgICAgSyArPSBFO1xuICAgIH1cblxuICAgIGlmIChLID4gMCAmJiAoaXRlciA+PSBvcHRzLm1pbkl0ZXJhdGlvbnMgLSAxIHx8IGl0ZXIgPT0gb3B0cy5tYXhJdGVyYXRpb25zIC0gMSkpIHtcbiAgICAgIHZhciBfc3VtID0gMDtcblxuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCBuOyBfaTExKyspIHtcbiAgICAgICAgc2VbX2kxMV0gPSAwO1xuXG4gICAgICAgIGZvciAodmFyIF9qNSA9IDA7IF9qNSA8IG9wdHMubWluSXRlcmF0aW9uczsgX2o1KyspIHtcbiAgICAgICAgICBzZVtfaTExXSArPSBlW19qNSAqIG4gKyBfaTExXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZVtfaTExXSA9PT0gMCB8fCBzZVtfaTExXSA9PT0gb3B0cy5taW5JdGVyYXRpb25zKSB7XG4gICAgICAgICAgX3N1bSsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfc3VtID09PSBuKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBjb252ZXJnZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gSWRlbnRpZnkgZXhlbXBsYXJzIChjbHVzdGVyIGNlbnRlcnMpXG5cblxuICB2YXIgZXhlbXBsYXJzSW5kaWNlcyA9IGZpbmRFeGVtcGxhcnMobiwgUiwgQSk7IC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVyc1xuXG4gIHZhciBjbHVzdGVySW5kaWNlcyA9IGFzc2lnbiQyKG4sIFMsIGV4ZW1wbGFyc0luZGljZXMpO1xuICB2YXIgY2x1c3RlcnMgPSB7fTtcblxuICBmb3IgKHZhciBjID0gMDsgYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBjKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW2NdXSA9IFtdO1xuICB9XG5cbiAgZm9yICh2YXIgX2kxMiA9IDA7IF9pMTIgPCBub2Rlcy5sZW5ndGg7IF9pMTIrKykge1xuICAgIHZhciBwb3MgPSBpZDJwb3NpdGlvbltub2Rlc1tfaTEyXS5pZCgpXTtcblxuICAgIHZhciBjbHVzdGVySW5kZXggPSBjbHVzdGVySW5kaWNlc1twb3NdO1xuXG4gICAgaWYgKGNsdXN0ZXJJbmRleCAhPSBudWxsKSB7XG4gICAgICAvLyB0aGUgbm9kZSBtYXkgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGNsdXN0ZXIgaWYgbm8gdmFsaWQgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZFxuICAgICAgY2x1c3RlcnNbY2x1c3RlckluZGV4XS5wdXNoKG5vZGVzW19pMTJdKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmV0Q2x1c3RlcnMgPSBuZXcgQXJyYXkoZXhlbXBsYXJzSW5kaWNlcy5sZW5ndGgpO1xuXG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBleGVtcGxhcnNJbmRpY2VzLmxlbmd0aDsgX2MrKykge1xuICAgIHJldENsdXN0ZXJzW19jXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbZXhlbXBsYXJzSW5kaWNlc1tfY11dKTtcbiAgfVxuXG4gIHJldHVybiByZXRDbHVzdGVycztcbn07XG5cbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uJDEgPSB7XG4gIGFmZmluaXR5UHJvcGFnYXRpb246IGFmZmluaXR5UHJvcGFnYXRpb24sXG4gIGFwOiBhZmZpbml0eVByb3BhZ2F0aW9uXG59O1xuXG52YXIgaGllcmhvbHplckRlZmF1bHRzID0gZGVmYXVsdHMoe1xuICByb290OiB1bmRlZmluZWQsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGIgPSB7XG4gIGhpZXJob2x6ZXI6IGZ1bmN0aW9uIGhpZXJob2x6ZXIob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9oaWVyaG9semVyRGVmYXVsdHMgPSBoaWVyaG9semVyRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICAgIHJvb3QgPSBfaGllcmhvbHplckRlZmF1bHRzLnJvb3QsXG4gICAgICAgIGRpcmVjdGVkID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5kaXJlY3RlZDtcblxuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgZGZsYWcgPSBmYWxzZTtcbiAgICB2YXIgb2RkSW47XG4gICAgdmFyIG9kZE91dDtcbiAgICB2YXIgc3RhcnRWZXJ0ZXg7XG4gICAgaWYgKHJvb3QpIHN0YXJ0VmVydGV4ID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0uaWQoKSA6IHJvb3RbMF0uaWQoKTtcbiAgICB2YXIgbm9kZXMgPSB7fTtcbiAgICB2YXIgZWRnZXMgPSB7fTtcblxuICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG5cbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgIHZhciBpbmQgPSBlbGUuaW5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIG91dGQgPSBlbGUub3V0ZGVncmVlKHRydWUpO1xuICAgICAgICAgIHZhciBkMSA9IGluZCAtIG91dGQ7XG4gICAgICAgICAgdmFyIGQyID0gb3V0ZCAtIGluZDtcblxuICAgICAgICAgIGlmIChkMSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkSW4pIGRmbGFnID0gdHJ1ZTtlbHNlIG9kZEluID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA9PSAxKSB7XG4gICAgICAgICAgICBpZiAob2RkT3V0KSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRPdXQgPSBpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQyID4gMSB8fCBkMSA+IDEpIHtcbiAgICAgICAgICAgIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2Rlc1tpZF0gPSBbXTtcbiAgICAgICAgICBlbGUub3V0Z29lcnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoZS5pc0VkZ2UoKSkgbm9kZXNbaWRdLnB1c2goZS5pZCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlc1tpZF0gPSBbdW5kZWZpbmVkLCBlbGUudGFyZ2V0KCkuaWQoKV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcblxuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGQgPSBlbGUuZGVncmVlKHRydWUpO1xuXG4gICAgICAgICAgaWYgKGQgJSAyKSB7XG4gICAgICAgICAgICBpZiAoIW9kZEluKSBvZGRJbiA9IGlkO2Vsc2UgaWYgKCFvZGRPdXQpIG9kZE91dCA9IGlkO2Vsc2UgZGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vZGVzW2lkXSA9IFtdO1xuICAgICAgICAgIGVsZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1tpZF0ucHVzaChlLmlkKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkZ2VzW2lkXSA9IFtlbGUuc291cmNlKCkuaWQoKSwgZWxlLnRhcmdldCgpLmlkKCldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgdHJhaWw6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGRmbGFnKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKG9kZE91dCAmJiBvZGRJbikge1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChzdGFydFZlcnRleCAmJiBvZGRPdXQgIT0gc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnRWZXJ0ZXggJiYgb2RkT3V0ICE9IHN0YXJ0VmVydGV4ICYmIG9kZEluICE9IHN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICBzdGFydFZlcnRleCA9IG9kZE91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXN0YXJ0VmVydGV4KSBzdGFydFZlcnRleCA9IGVsZXNbMF0uaWQoKTtcbiAgICB9XG5cbiAgICB2YXIgd2FsayA9IGZ1bmN0aW9uIHdhbGsodikge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdjtcbiAgICAgIHZhciBzdWJ0b3VyID0gW3ZdO1xuICAgICAgdmFyIGFkaiwgYWRqVGFpbCwgYWRqSGVhZDtcblxuICAgICAgd2hpbGUgKG5vZGVzW2N1cnJlbnROb2RlXS5sZW5ndGgpIHtcbiAgICAgICAgYWRqID0gbm9kZXNbY3VycmVudE5vZGVdLnNoaWZ0KCk7XG4gICAgICAgIGFkalRhaWwgPSBlZGdlc1thZGpdWzBdO1xuICAgICAgICBhZGpIZWFkID0gZWRnZXNbYWRqXVsxXTtcblxuICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gYWRqSGVhZCkge1xuICAgICAgICAgIG5vZGVzW2FkakhlYWRdID0gbm9kZXNbYWRqSGVhZF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpIZWFkO1xuICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RlZCAmJiBjdXJyZW50Tm9kZSAhPSBhZGpUYWlsKSB7XG4gICAgICAgICAgbm9kZXNbYWRqVGFpbF0gPSBub2Rlc1thZGpUYWlsXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlICE9IGFkajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGFkalRhaWw7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJ0b3VyLnVuc2hpZnQoYWRqKTtcbiAgICAgICAgc3VidG91ci51bnNoaWZ0KGN1cnJlbnROb2RlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN1YnRvdXI7XG4gICAgfTtcblxuICAgIHZhciB0cmFpbCA9IFtdO1xuICAgIHZhciBzdWJ0b3VyID0gW107XG4gICAgc3VidG91ciA9IHdhbGsoc3RhcnRWZXJ0ZXgpO1xuXG4gICAgd2hpbGUgKHN1YnRvdXIubGVuZ3RoICE9IDEpIHtcbiAgICAgIGlmIChub2Rlc1tzdWJ0b3VyWzBdXS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0cmFpbC51bnNoaWZ0KGVsZXMuZ2V0RWxlbWVudEJ5SWQoc3VidG91ci5zaGlmdCgpKSk7XG4gICAgICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnRvdXIgPSB3YWxrKHN1YnRvdXIuc2hpZnQoKSkuY29uY2F0KHN1YnRvdXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTsgLy8gZmluYWwgbm9kZVxuXG4gICAgZm9yICh2YXIgZCBpbiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVzW2RdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdC5mb3VuZCA9IHRydWU7XG4gICAgcmVzdWx0LnRyYWlsID0gdGhpcy5zcGF3bih0cmFpbCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQgPSBmdW5jdGlvbiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaWQgPSAwO1xuICB2YXIgZWRnZUNvdW50ID0gMDtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkRWRnZXMgPSB7fTtcblxuICB2YXIgYnVpbGRDb21wb25lbnQgPSBmdW5jdGlvbiBidWlsZENvbXBvbmVudCh4LCB5KSB7XG4gICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxO1xuICAgIHZhciBjdXRzZXQgPSBbXTtcbiAgICB2YXIgY29tcG9uZW50ID0gZWxlcy5zcGF3bigpO1xuXG4gICAgd2hpbGUgKHN0YWNrW2ldLnggIT0geCB8fCBzdGFja1tpXS55ICE9IHkpIHtcbiAgICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgICAgaS0tO1xuICAgIH1cblxuICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgIGN1dHNldC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkTm9kZXMgPSBlZGdlLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgY29ubmVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuICAgICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkuaW50ZXJzZWN0aW9uKGVsZXMpO1xuICAgICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG5cbiAgICAgICAgaWYgKCFub2Rlc1tub2RlSWRdLmN1dFZlcnRleCkge1xuICAgICAgICAgIGNvbXBvbmVudC5tZXJnZShjb25uZWN0ZWRFZGdlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGNvbm5lY3RlZEVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVkZ2UuaXNMb29wKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfTtcblxuICB2YXIgYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG5cbiAgICBpZiAoZWRnZXMuc2l6ZSgpID09PSAwKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goZWxlcy5zcGF3bihlbGVzLmdldEVsZW1lbnRCeUlkKGN1cnJlbnROb2RlKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc291cmNlSWQsIHRhcmdldElkLCBvdGhlck5vZGVJZCwgZWRnZUlkO1xuICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBzb3VyY2VJZCA9IGVkZ2Uuc291cmNlKCkuaWQoKTtcbiAgICAgICAgdGFyZ2V0SWQgPSBlZGdlLnRhcmdldCgpLmlkKCk7XG4gICAgICAgIG90aGVyTm9kZUlkID0gc291cmNlSWQgPT09IGN1cnJlbnROb2RlID8gdGFyZ2V0SWQgOiBzb3VyY2VJZDtcblxuICAgICAgICBpZiAob3RoZXJOb2RlSWQgIT09IHBhcmVudCkge1xuICAgICAgICAgIGVkZ2VJZCA9IGVkZ2UuaWQoKTtcblxuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKG90aGVyTm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gocm9vdCwgb3RoZXJOb2RlSWQsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0ubG93KTtcblxuICAgICAgICAgICAgaWYgKG5vZGVzW2N1cnJlbnROb2RlXS5pZCA8PSBub2Rlc1tvdGhlck5vZGVJZF0ubG93KSB7XG4gICAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5jdXRWZXJ0ZXggPSB0cnVlO1xuICAgICAgICAgICAgICBidWlsZENvbXBvbmVudChjdXJyZW50Tm9kZSwgb3RoZXJOb2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcblxuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBlZGdlQ291bnQgPSAwO1xuICAgICAgICBiaWNvbm5lY3RlZFNlYXJjaChub2RlSWQsIG5vZGVJZCk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0uY3V0VmVydGV4ID0gZWRnZUNvdW50ID4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB2YXIgY3V0VmVydGljZXMgPSBPYmplY3Qua2V5cyhub2RlcykuZmlsdGVyKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBub2Rlc1tpZF0uY3V0VmVydGV4O1xuICB9KS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGVsZXMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjdXQ6IGVsZXMuc3Bhd24oY3V0VmVydGljZXMpLFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG5cbnZhciBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkJDEgPSB7XG4gIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQ6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGh0YmM6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQsXG4gIGh0YjogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZENvbXBvbmVudHM6IGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWRcbn07XG5cbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCA9IGZ1bmN0aW9uIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkKCkge1xuICB2YXIgZWxlcyA9IHRoaXM7XG4gIHZhciBub2RlcyA9IHt9O1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGN1dCA9IGVsZXMuc3Bhd24oZWxlcyk7XG5cbiAgdmFyIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuXG4gICAgICBpZiAodGFyZ2V0Tm9kZUlkICE9PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgaWYgKCEodGFyZ2V0Tm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICAgIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoKHRhcmdldE5vZGVJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vZGVzW3RhcmdldE5vZGVJZF0uZXhwbG9yZWQpIHtcbiAgICAgICAgICBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdyA9IE1hdGgubWluKG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93LCBub2Rlc1t0YXJnZXROb2RlSWRdLmxvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4ID09PSBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdykge1xuICAgICAgdmFyIGNvbXBvbmVudE5vZGVzID0gZWxlcy5zcGF3bigpO1xuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBub2RlSWQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29tcG9uZW50Tm9kZXMubWVyZ2UoZWxlcy5nZXRFbGVtZW50QnlJZChub2RlSWQpKTtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5sb3cgPSBub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4O1xuICAgICAgICBub2Rlc1tub2RlSWRdLmV4cGxvcmVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAobm9kZUlkID09PSBzb3VyY2VOb2RlSWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50RWRnZXMgPSBjb21wb25lbnROb2Rlcy5lZGdlc1dpdGgoY29tcG9uZW50Tm9kZXMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudE5vZGVzLm1lcmdlKGNvbXBvbmVudEVkZ2VzKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgY3V0ID0gY3V0LmRpZmZlcmVuY2UoY29tcG9uZW50KTtcbiAgICB9XG4gIH07XG5cbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gZWxlLmlkKCk7XG5cbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2gobm9kZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGN1dDogY3V0LFxuICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNcbiAgfTtcbn07XG5cbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxID0ge1xuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZDogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzY2M6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkLFxuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkXG59O1xuXG52YXIgZWxlc2ZuJGMgPSB7fTtcbltlbGVzZm4sIGVsZXNmbiQxLCBlbGVzZm4kMiwgZWxlc2ZuJDMsIGVsZXNmbiQ0LCBlbGVzZm4kNSwgZWxlc2ZuJDYsIGVsZXNmbiQ3LCBlbGVzZm4kOCwgZWxlc2ZuJDksIGVsZXNmbiRhLCBtYXJrb3ZDbHVzdGVyaW5nJDEsIGtDbHVzdGVyaW5nLCBoaWVyYXJjaGljYWxDbHVzdGVyaW5nJDEsIGFmZmluaXR5UHJvcGFnYXRpb24kMSwgZWxlc2ZuJGIsIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQkMSwgdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQkMV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGVsZXNmbiRjLCBwcm9wcyk7XG59KTtcblxuLyohXG5FbWJlZGRhYmxlIE1pbmltdW0gU3RyaWN0bHktQ29tcGxpYW50IFByb21pc2VzL0ErIDEuMS4xIFRoZW5hYmxlXG5Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBSYWxmIFMuIEVuZ2Vsc2NoYWxsIChodHRwOi8vZW5nZWxzY2hhbGwuY29tKVxuTGljZW5zZWQgdW5kZXIgVGhlIE1JVCBMaWNlbnNlIChodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUKVxuKi9cblxuLyogIHByb21pc2Ugc3RhdGVzIFtQcm9taXNlcy9BKyAyLjFdICAqL1xudmFyIFNUQVRFX1BFTkRJTkcgPSAwO1xuLyogIFtQcm9taXNlcy9BKyAyLjEuMV0gICovXG5cbnZhciBTVEFURV9GVUxGSUxMRUQgPSAxO1xuLyogIFtQcm9taXNlcy9BKyAyLjEuMl0gICovXG5cbnZhciBTVEFURV9SRUpFQ1RFRCA9IDI7XG4vKiAgW1Byb21pc2VzL0ErIDIuMS4zXSAgKi9cblxuLyogIHByb21pc2Ugb2JqZWN0IGNvbnN0cnVjdG9yICAqL1xuXG52YXIgYXBpID0gZnVuY3Rpb24gYXBpKGV4ZWN1dG9yKSB7XG4gIC8qICBvcHRpb25hbGx5IHN1cHBvcnQgbm9uLWNvbnN0cnVjdG9yL3BsYWluLWZ1bmN0aW9uIGNhbGwgICovXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBhcGkpKSByZXR1cm4gbmV3IGFwaShleGVjdXRvcik7XG4gIC8qICBpbml0aWFsaXplIG9iamVjdCAgKi9cblxuICB0aGlzLmlkID0gJ1RoZW5hYmxlLzEuMC43JztcbiAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BFTkRJTkc7XG4gIC8qICBpbml0aWFsIHN0YXRlICAqL1xuXG4gIHRoaXMuZnVsZmlsbFZhbHVlID0gdW5kZWZpbmVkO1xuICAvKiAgaW5pdGlhbCB2YWx1ZSAgKi9cblxuICAvKiAgW1Byb21pc2VzL0ErIDEuMywgMi4xLjIuMl0gICovXG5cbiAgdGhpcy5yZWplY3RSZWFzb24gPSB1bmRlZmluZWQ7XG4gIC8qICBpbml0aWFsIHJlYXNvbiAqL1xuXG4gIC8qICBbUHJvbWlzZXMvQSsgMS41LCAyLjEuMy4yXSAgKi9cblxuICB0aGlzLm9uRnVsZmlsbGVkID0gW107XG4gIC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuXG4gIHRoaXMub25SZWplY3RlZCA9IFtdO1xuICAvKiAgaW5pdGlhbCBoYW5kbGVycyAgKi9cblxuICAvKiAgcHJvdmlkZSBvcHRpb25hbCBpbmZvcm1hdGlvbi1oaWRpbmcgcHJveHkgICovXG5cbiAgdGhpcy5wcm94eSA9IHtcbiAgICB0aGVuOiB0aGlzLnRoZW4uYmluZCh0aGlzKVxuICB9O1xuICAvKiAgc3VwcG9ydCBvcHRpb25hbCBleGVjdXRvciBmdW5jdGlvbiAgKi9cblxuICBpZiAodHlwZW9mIGV4ZWN1dG9yID09PSAnZnVuY3Rpb24nKSBleGVjdXRvci5jYWxsKHRoaXMsIHRoaXMuZnVsZmlsbC5iaW5kKHRoaXMpLCB0aGlzLnJlamVjdC5iaW5kKHRoaXMpKTtcbn07XG4vKiAgcHJvbWlzZSBBUEkgbWV0aG9kcyAgKi9cblxuXG5hcGkucHJvdG90eXBlID0ge1xuICAvKiAgcHJvbWlzZSByZXNvbHZpbmcgbWV0aG9kcyAgKi9cbiAgZnVsZmlsbDogZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJldHVybiBkZWxpdmVyKHRoaXMsIFNUQVRFX0ZVTEZJTExFRCwgJ2Z1bGZpbGxWYWx1ZScsIHZhbHVlKTtcbiAgfSxcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9SRUpFQ1RFRCwgJ3JlamVjdFJlYXNvbicsIHZhbHVlKTtcbiAgfSxcblxuICAvKiAgXCJUaGUgdGhlbiBNZXRob2RcIiBbUHJvbWlzZXMvQSsgMS4xLCAxLjIsIDIuMl0gICovXG4gIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICB2YXIgY3VyciA9IHRoaXM7XG4gICAgdmFyIG5leHQgPSBuZXcgYXBpKCk7XG4gICAgLyogIFtQcm9taXNlcy9BKyAyLjIuN10gICovXG5cbiAgICBjdXJyLm9uRnVsZmlsbGVkLnB1c2gocmVzb2x2ZXIob25GdWxmaWxsZWQsIG5leHQsICdmdWxmaWxsJykpO1xuICAgIC8qICBbUHJvbWlzZXMvQSsgMi4yLjIvMi4yLjZdICAqL1xuXG4gICAgY3Vyci5vblJlamVjdGVkLnB1c2gocmVzb2x2ZXIob25SZWplY3RlZCwgbmV4dCwgJ3JlamVjdCcpKTtcbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi4zLzIuMi42XSAgKi9cblxuICAgIGV4ZWN1dGUoY3Vycik7XG4gICAgcmV0dXJuIG5leHQucHJveHk7XG4gICAgLyogIFtQcm9taXNlcy9BKyAyLjIuNywgMy4zXSAgKi9cbiAgfVxufTtcbi8qICBkZWxpdmVyIGFuIGFjdGlvbiAgKi9cblxudmFyIGRlbGl2ZXIgPSBmdW5jdGlvbiBkZWxpdmVyKGN1cnIsIHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUEVORElORykge1xuICAgIGN1cnIuc3RhdGUgPSBzdGF0ZTtcbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMS4yLjEsIDIuMS4zLjFdICAqL1xuXG4gICAgY3VycltuYW1lXSA9IHZhbHVlO1xuICAgIC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMiwgMi4xLjMuMl0gICovXG5cbiAgICBleGVjdXRlKGN1cnIpO1xuICB9XG5cbiAgcmV0dXJuIGN1cnI7XG59O1xuLyogIGV4ZWN1dGUgYWxsIGhhbmRsZXJzICAqL1xuXG5cbnZhciBleGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZShjdXJyKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9GVUxGSUxMRUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uRnVsZmlsbGVkJywgY3Vyci5mdWxmaWxsVmFsdWUpO2Vsc2UgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1JFSkVDVEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvblJlamVjdGVkJywgY3Vyci5yZWplY3RSZWFzb24pO1xufTtcbi8qICBleGVjdXRlIHBhcnRpY3VsYXIgc2V0IG9mIGhhbmRsZXJzICAqL1xuXG5cbnZhciBleGVjdXRlX2hhbmRsZXJzID0gZnVuY3Rpb24gZXhlY3V0ZV9oYW5kbGVycyhjdXJyLCBuYW1lLCB2YWx1ZSkge1xuICAvKiBnbG9iYWwgc2V0SW1tZWRpYXRlOiB0cnVlICovXG5cbiAgLyogZ2xvYmFsIHNldFRpbWVvdXQ6IHRydWUgKi9cblxuICAvKiAgc2hvcnQtY2lyY3VpdCBwcm9jZXNzaW5nICAqL1xuICBpZiAoY3VycltuYW1lXS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgLyogIGl0ZXJhdGUgb3ZlciBhbGwgaGFuZGxlcnMsIGV4YWN0bHkgb25jZSAgKi9cblxuICB2YXIgaGFuZGxlcnMgPSBjdXJyW25hbWVdO1xuICBjdXJyW25hbWVdID0gW107XG4gIC8qICBbUHJvbWlzZXMvQSsgMi4yLjIuMywgMi4yLjMuM10gICovXG5cbiAgdmFyIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXJzW2ldKHZhbHVlKTtcbiAgICB9XG4gICAgLyogIFtQcm9taXNlcy9BKyAyLjIuNV0gICovXG5cbiAgfTtcbiAgLyogIGV4ZWN1dGUgcHJvY2VkdXJlIGFzeW5jaHJvbm91c2x5ICAqL1xuXG4gIC8qICBbUHJvbWlzZXMvQSsgMi4yLjQsIDMuMV0gICovXG5cblxuICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykgc2V0SW1tZWRpYXRlKGZ1bmMpO2Vsc2Ugc2V0VGltZW91dChmdW5jLCAwKTtcbn07XG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cblxuXG52YXIgcmVzb2x2ZXIgPSBmdW5jdGlvbiByZXNvbHZlcihjYiwgbmV4dCwgbWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKVxuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjIuMSwgMi4yLjcuMywgMi4yLjcuNF0gICovXG4gICAgICBuZXh0W21ldGhvZF0uY2FsbChuZXh0LCB2YWx1ZSk7XG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qICBbUHJvbWlzZXMvQSsgMi4yLjIuMSwgMi4yLjMuMSwgMi4yLjUsIDMuMl0gICovXG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgbmV4dC5yZWplY3QoZSk7XG4gICAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4yXSAgKi9cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUobmV4dCwgcmVzdWx0KTtcbiAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4xXSAgKi9cbiAgICAgIH1cbiAgfTtcbn07XG4vKiAgXCJQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlXCIgICovXG5cbi8qICBbUHJvbWlzZXMvQSsgMi4zXSAgKi9cblxuXG52YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwgeCkge1xuICAvKiAgc2FuaXR5IGNoZWNrIGFyZ3VtZW50cyAgKi9cblxuICAvKiAgW1Byb21pc2VzL0ErIDIuMy4xXSAgKi9cbiAgaWYgKHByb21pc2UgPT09IHggfHwgcHJvbWlzZS5wcm94eSA9PT0geCkge1xuICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qICBzdXJnaWNhbGx5IGNoZWNrIGZvciBhIFwidGhlblwiIG1ldGhvZFxuICAgIChtYWlubHkgdG8ganVzdCBjYWxsIHRoZSBcImdldHRlclwiIG9mIFwidGhlblwiIG9ubHkgb25jZSkgICovXG5cblxuICB2YXIgdGhlbjtcblxuICBpZiAoX3R5cGVvZih4KSA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCB8fCB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB0aGVuID0geC50aGVuO1xuICAgIH1cbiAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjEsIDMuNV0gICovXG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIHByb21pc2UucmVqZWN0KGUpO1xuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4yXSAgKi9cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICAvKiAgaGFuZGxlIG93biBUaGVuYWJsZXMgICAgW1Byb21pc2VzL0ErIDIuMy4yXVxuICAgIGFuZCBzaW1pbGFyIFwidGhlbmFibGVzXCIgW1Byb21pc2VzL0ErIDIuMy4zXSAgKi9cblxuXG4gIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qICBjYWxsIHJldHJpZXZlZCBcInRoZW5cIiBtZXRob2QgKi9cblxuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zXSAgKi9cbiAgICAgIHRoZW4uY2FsbCh4LFxuICAgICAgLyogIHJlc29sdmVQcm9taXNlICAqL1xuXG4gICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuMV0gICovXG4gICAgICBmdW5jdGlvbiAoeSkge1xuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjMuM10gICovXG5cbiAgICAgICAgaWYgKHkgPT09IHgpXG4gICAgICAgICAgLyogIFtQcm9taXNlcy9BKyAzLjZdICAqL1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2NpcmN1bGFyIHRoZW5hYmxlIGNoYWluJykpO2Vsc2UgcmVzb2x2ZShwcm9taXNlLCB5KTtcbiAgICAgIH0sXG4gICAgICAvKiAgcmVqZWN0UHJvbWlzZSAgKi9cblxuICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuXG4gICAgICAgIHByb21pc2UucmVqZWN0KHIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChlKTtcbiAgICAgIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbiAgLyogIGhhbmRsZSBvdGhlciB2YWx1ZXMgICovXG5cblxuICBwcm9taXNlLmZ1bGZpbGwoeCk7XG4gIC8qICBbUHJvbWlzZXMvQSsgMi4zLjQsIDIuMy4zLjRdICAqL1xufTsgLy8gc28gd2UgYWx3YXlzIGhhdmUgUHJvbWlzZS5hbGwoKVxuXG5cbmFwaS5hbGwgPSBmdW5jdGlvbiAocHMpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG5cbiAgICB2YXIgZnVsZmlsbCA9IGZ1bmN0aW9uIGZ1bGZpbGwoaSwgdmFsKSB7XG4gICAgICB2YWxzW2ldID0gdmFsO1xuICAgICAgZG9uZUNvdW50Kys7XG5cbiAgICAgIGlmIChkb25lQ291bnQgPT09IHBzLmxlbmd0aCkge1xuICAgICAgICByZXNvbHZlQWxsKHZhbHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcblxuICAgICAgICBpZiAoaXNQcm9taXNlKSB7XG4gICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGZ1bGZpbGwoaSwgdmFsKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3RBbGwoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdmFsID0gcDtcbiAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pKGkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5hcGkucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlc29sdmUodmFsKTtcbiAgfSk7XG59O1xuXG5hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVqZWN0KHZhbCk7XG4gIH0pO1xufTtcblxudmFyIFByb21pc2UkMSA9IHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IFByb21pc2UgOiBhcGk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIEFuaW1hdGlvbiA9IGZ1bmN0aW9uIEFuaW1hdGlvbih0YXJnZXQsIG9wdHMsIG9wdHMyKSB7XG4gIHZhciBpc0NvcmUgPSBjb3JlKHRhcmdldCk7XG4gIHZhciBpc0VsZSA9ICFpc0NvcmU7XG5cbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZSA9IGV4dGVuZCh7XG4gICAgZHVyYXRpb246IDEwMDBcbiAgfSwgb3B0cywgb3B0czIpO1xuXG4gIF9wLnRhcmdldCA9IHRhcmdldDtcbiAgX3Auc3R5bGUgPSBfcC5zdHlsZSB8fCBfcC5jc3M7XG4gIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgX3AucGxheWluZyA9IGZhbHNlO1xuICBfcC5ob29rZWQgPSBmYWxzZTtcbiAgX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgX3AucHJvZ3Jlc3MgPSAwO1xuICBfcC5jb21wbGV0ZXMgPSBbXTtcbiAgX3AuZnJhbWVzID0gW107XG5cbiAgaWYgKF9wLmNvbXBsZXRlICYmIGZuKF9wLmNvbXBsZXRlKSkge1xuICAgIF9wLmNvbXBsZXRlcy5wdXNoKF9wLmNvbXBsZXRlKTtcbiAgfVxuXG4gIGlmIChpc0VsZSkge1xuICAgIHZhciBwb3MgPSB0YXJnZXQucG9zaXRpb24oKTtcbiAgICBfcC5zdGFydFBvc2l0aW9uID0gX3Auc3RhcnRQb3NpdGlvbiB8fCB7XG4gICAgICB4OiBwb3MueCxcbiAgICAgIHk6IHBvcy55XG4gICAgfTtcbiAgICBfcC5zdGFydFN0eWxlID0gX3Auc3RhcnRTdHlsZSB8fCB0YXJnZXQuY3koKS5zdHlsZSgpLmdldEFuaW1hdGlvblN0YXJ0U3R5bGUodGFyZ2V0LCBfcC5zdHlsZSk7XG4gIH1cblxuICBpZiAoaXNDb3JlKSB7XG4gICAgdmFyIHBhbiA9IHRhcmdldC5wYW4oKTtcbiAgICBfcC5zdGFydFBhbiA9IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9O1xuICAgIF9wLnN0YXJ0Wm9vbSA9IHRhcmdldC56b29tKCk7XG4gIH0gLy8gZm9yIGZ1dHVyZSB0aW1lbGluZS9hbmltYXRpb25zIGltcGxcblxuXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG59O1xuXG52YXIgYW5pZm4gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuZXh0ZW5kKGFuaWZuLCB7XG4gIGluc3RhbmNlU3RyaW5nOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICByZXR1cm4gJ2FuaW1hdGlvbic7XG4gIH0sXG4gIGhvb2s6IGZ1bmN0aW9uIGhvb2soKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIGlmICghX3AuaG9va2VkKSB7XG4gICAgICAvLyBhZGQgdG8gdGFyZ2V0J3MgYW5pbWF0aW9uIHF1ZXVlXG4gICAgICB2YXIgcTtcbiAgICAgIHZhciB0QW5pID0gX3AudGFyZ2V0Ll9wcml2YXRlLmFuaW1hdGlvbjtcblxuICAgICAgaWYgKF9wLnF1ZXVlKSB7XG4gICAgICAgIHEgPSB0QW5pLnF1ZXVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcSA9IHRBbmkuY3VycmVudDtcbiAgICAgIH1cblxuICAgICAgcS5wdXNoKHRoaXMpOyAvLyBhZGQgdG8gdGhlIGFuaW1hdGlvbiBsb29wIHBvb2xcblxuICAgICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oX3AudGFyZ2V0KSkge1xuICAgICAgICBfcC50YXJnZXQuY3koKS5hZGRUb0FuaW1hdGlvblBvb2woX3AudGFyZ2V0KTtcbiAgICAgIH1cblxuICAgICAgX3AuaG9va2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGxheTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlOyAvLyBhdXRvcmV3aW5kXG5cbiAgICBpZiAoX3AucHJvZ3Jlc3MgPT09IDEpIHtcbiAgICAgIF9wLnByb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICBfcC5wbGF5aW5nID0gdHJ1ZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7IC8vIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYnkgYW5pbWF0aW9uIGxvb3BcblxuICAgIF9wLnN0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhvb2soKTsgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgc3RhcnQgdGhlIGFuaW1hdGlvbi4uLlxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXlpbmc6IGZ1bmN0aW9uIHBsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGxheWluZztcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AuYXBwbHlpbmcgPSB0cnVlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTsgLy8gbmVlZHMgdG8gYmUgc3RhcnRlZCBieSBhbmltYXRpb24gbG9vcFxuXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpOyAvLyB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBhcHBseSB0aGUgYW5pbWF0aW9uIGF0IHRoaXMgcHJvZ3Jlc3NcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBhcHBseWluZzogZnVuY3Rpb24gYXBwbHlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXBwbHlpbmc7XG4gIH0sXG4gIHBhdXNlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIF9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBfcC5wbGF5aW5nID0gZmFsc2U7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgIF9wLnN0b3BwZWQgPSB0cnVlOyAvLyB0byBiZSByZW1vdmVkIGZyb20gYW5pbWF0aW9uIHF1ZXVlc1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJld2luZDogZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyZXNzKDApO1xuICB9LFxuICBmYXN0Zm9yd2FyZDogZnVuY3Rpb24gZmFzdGZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MoMSk7XG4gIH0sXG4gIHRpbWU6IGZ1bmN0aW9uIHRpbWUodCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3MgKiBfcC5kdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3ModCAvIF9wLmR1cmF0aW9uKTtcbiAgICB9XG4gIH0sXG4gIHByb2dyZXNzOiBmdW5jdGlvbiBwcm9ncmVzcyhwKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG5cbiAgICBpZiAocCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH1cblxuICAgICAgX3AucHJvZ3Jlc3MgPSBwO1xuICAgICAgX3Auc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29tcGxldGVkOiBmdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucHJvZ3Jlc3MgPT09IDE7XG4gIH0sXG4gIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG5cbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZSgpO1xuICAgIH1cblxuICAgIF9wLnByb2dyZXNzID0gMSAtIF9wLnByb2dyZXNzO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHZhciBzd2FwID0gZnVuY3Rpb24gc3dhcChhLCBiKSB7XG4gICAgICB2YXIgX3BhID0gX3BbYV07XG5cbiAgICAgIGlmIChfcGEgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9wW2FdID0gX3BbYl07XG4gICAgICBfcFtiXSA9IF9wYTtcbiAgICB9O1xuXG4gICAgc3dhcCgnem9vbScsICdzdGFydFpvb20nKTtcbiAgICBzd2FwKCdwYW4nLCAnc3RhcnRQYW4nKTtcbiAgICBzd2FwKCdwb3NpdGlvbicsICdzdGFydFBvc2l0aW9uJyk7IC8vIHN3YXAgc3R5bGVzXG5cbiAgICBpZiAoX3Auc3R5bGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Auc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBfcC5zdHlsZVtpXTtcbiAgICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBzdGFydFN0eWxlUHJvcCA9IF9wLnN0YXJ0U3R5bGVbbmFtZV07XG4gICAgICAgIF9wLnN0YXJ0U3R5bGVbbmFtZV0gPSBwcm9wO1xuICAgICAgICBfcC5zdHlsZVtpXSA9IHN0YXJ0U3R5bGVQcm9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcHJvbWlzZTogZnVuY3Rpb24gcHJvbWlzZSh0eXBlKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgYXJyO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICAgIGFyciA9IF9wLmZyYW1lcztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBhcnIgPSBfcC5jb21wbGV0ZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgYXJyLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5hbmlmbi5jb21wbGV0ZSA9IGFuaWZuLmNvbXBsZXRlZDtcbmFuaWZuLnJ1biA9IGFuaWZuLnBsYXk7XG5hbmlmbi5ydW5uaW5nID0gYW5pZm4ucGxheWluZztcblxudmFyIGRlZmluZSA9IHtcbiAgYW5pbWF0ZWQ6IGZ1bmN0aW9uIGFuaW1hdGVkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlZEltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuXG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVsZSA9IGFsbFswXTtcblxuICAgICAgaWYgKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlLl9wcml2YXRlLmFuaW1hdGlvbi5jdXJyZW50Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgLy8gYW5pbWF0ZWRcbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2xlYXJRdWV1ZUltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuXG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLnF1ZXVlID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH0sXG4gIC8vIGNsZWFyUXVldWVcbiAgZGVsYXk6IGZ1bmN0aW9uIGRlbGF5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWxheUltcGwodGltZSwgY29tcGxldGUpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgIGRlbGF5OiB0aW1lLFxuICAgICAgICBkdXJhdGlvbjogdGltZSxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlXG4gICAgICB9KTtcbiAgICB9O1xuICB9LFxuICAvLyBkZWxheVxuICBkZWxheUFuaW1hdGlvbjogZnVuY3Rpb24gZGVsYXlBbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRlbGF5QW5pbWF0aW9uSW1wbCh0aW1lLCBjb21wbGV0ZSkge1xuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuXG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5hbmltYXRpb24oe1xuICAgICAgICBkZWxheTogdGltZSxcbiAgICAgICAgZHVyYXRpb246IHRpbWUsXG4gICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSxcbiAgLy8gZGVsYXlcbiAgYW5pbWF0aW9uOiBmdW5jdGlvbiBhbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGlvbkltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgdmFyIGlzQ29yZSA9ICFzZWxmSXNBcnJheUxpa2U7XG4gICAgICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcblxuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB2YXIgcHJvcGVydGllc0VtcHR5ID0gT2JqZWN0LmtleXMocHJvcGVydGllcykubGVuZ3RoID09PSAwO1xuXG4gICAgICBpZiAocHJvcGVydGllc0VtcHR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKGFsbFswXSwgcHJvcGVydGllcyk7IC8vIG5vdGhpbmcgdG8gYW5pbWF0ZVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydGllcy5kdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA0MDA7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocHJvcGVydGllcy5kdXJhdGlvbikge1xuICAgICAgICBjYXNlICdzbG93JzpcbiAgICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNjAwO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0VsZXMpIHtcbiAgICAgICAgcHJvcGVydGllcy5zdHlsZSA9IHN0eWxlLmdldFByb3BzTGlzdChwcm9wZXJ0aWVzLnN0eWxlIHx8IHByb3BlcnRpZXMuY3NzKTtcbiAgICAgICAgcHJvcGVydGllcy5jc3MgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0VsZXMgJiYgcHJvcGVydGllcy5yZW5kZXJlZFBvc2l0aW9uICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHJwb3MgPSBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb247XG4gICAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgICAgIHByb3BlcnRpZXMucG9zaXRpb24gPSByZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihycG9zLCB6b29tLCBwYW4pO1xuICAgICAgfSAvLyBvdmVycmlkZSBwYW4gdy8gcGFuQnkgaWYgc2V0XG5cblxuICAgICAgaWYgKGlzQ29yZSAmJiBwcm9wZXJ0aWVzLnBhbkJ5ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHBhbkJ5ID0gcHJvcGVydGllcy5wYW5CeTtcbiAgICAgICAgdmFyIGN5UGFuID0gY3kucGFuKCk7XG4gICAgICAgIHByb3BlcnRpZXMucGFuID0ge1xuICAgICAgICAgIHg6IGN5UGFuLnggKyBwYW5CeS54LFxuICAgICAgICAgIHk6IGN5UGFuLnkgKyBwYW5CeS55XG4gICAgICAgIH07XG4gICAgICB9IC8vIG92ZXJyaWRlIHBhbiB3LyBjZW50ZXIgaWYgc2V0XG5cblxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuXG4gICAgICBpZiAoaXNDb3JlICYmIGNlbnRlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjZW50ZXJQYW4gPSBjeS5nZXRDZW50ZXJQYW4oY2VudGVyLmVsZXMsIHByb3BlcnRpZXMuem9vbSk7XG5cbiAgICAgICAgaWYgKGNlbnRlclBhbiAhPSBudWxsKSB7XG4gICAgICAgICAgcHJvcGVydGllcy5wYW4gPSBjZW50ZXJQYW47XG4gICAgICAgIH1cbiAgICAgIH0gLy8gb3ZlcnJpZGUgcGFuICYgem9vbSB3LyBmaXQgaWYgc2V0XG5cblxuICAgICAgaWYgKGlzQ29yZSAmJiBwcm9wZXJ0aWVzLmZpdCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBmaXQgPSBwcm9wZXJ0aWVzLmZpdDtcbiAgICAgICAgdmFyIGZpdFZwID0gY3kuZ2V0Rml0Vmlld3BvcnQoZml0LmVsZXMgfHwgZml0LmJvdW5kaW5nQm94LCBmaXQucGFkZGluZyk7XG5cbiAgICAgICAgaWYgKGZpdFZwICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGZpdFZwLnBhbjtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnpvb20gPSBmaXRWcC56b29tO1xuICAgICAgICB9XG4gICAgICB9IC8vIG92ZXJyaWRlIHpvb20gKCYgcG90ZW50aWFsbHkgcGFuKSB3LyB6b29tIG9iaiBpZiBzZXRcblxuXG4gICAgICBpZiAoaXNDb3JlICYmIHBsYWluT2JqZWN0KHByb3BlcnRpZXMuem9vbSkpIHtcbiAgICAgICAgdmFyIHZwID0gY3kuZ2V0Wm9vbWVkVmlld3BvcnQocHJvcGVydGllcy56b29tKTtcblxuICAgICAgICBpZiAodnAgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh2cC56b29tZWQpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IHZwLnpvb207XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpO1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcbiAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZUltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuXG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB9IC8vIG1hbnVhbGx5IGhvb2sgYW5kIHJ1biB0aGUgYW5pbWF0aW9uXG5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgdmFyIHF1ZXVlID0gZWxlLmFuaW1hdGVkKCkgJiYgKHByb3BlcnRpZXMucXVldWUgPT09IHVuZGVmaW5lZCB8fCBwcm9wZXJ0aWVzLnF1ZXVlKTtcbiAgICAgICAgdmFyIGFuaSA9IGVsZS5hbmltYXRpb24ocHJvcGVydGllcywgcXVldWUgPyB7XG4gICAgICAgICAgcXVldWU6IHRydWVcbiAgICAgICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGFuaS5wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc3RvcEltcGwoY2xlYXJRdWV1ZSwganVtcFRvRW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcblxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuXG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICAgIHZhciBhbmlzID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbmlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGFuaSA9IGFuaXNbal07XG4gICAgICAgICAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuXG4gICAgICAgICAgaWYgKGp1bXBUb0VuZCkge1xuICAgICAgICAgICAgLy8gbmV4dCBpdGVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBsb29wLCB0aGUgYW5pbWF0aW9uXG4gICAgICAgICAgICAvLyB3aWxsIGdvIHN0cmFpZ2h0IHRvIHRoZSBlbmQgYW5kIGJlIHJlbW92ZWRcbiAgICAgICAgICAgIGFuaV9wLmR1cmF0aW9uID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gY2xlYXIgdGhlIHF1ZXVlIG9mIGZ1dHVyZSBhbmltYXRpb25zXG5cblxuICAgICAgICBpZiAoY2xlYXJRdWV1ZSkge1xuICAgICAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFqdW1wVG9FbmQpIHtcbiAgICAgICAgICBfcC5hbmltYXRpb24uY3VycmVudCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IC8vIHdlIGhhdmUgdG8gbm90aWZ5ICh0aGUgYW5pbWF0aW9uIGxvb3AgZG9lc24ndCBkbyBpdCBmb3IgdXMgb24gYHN0b3BgKVxuXG5cbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSAvLyBzdG9wXG5cbn07IC8vIGRlZmluZVxuXG52YXIgZGVmaW5lJDEgPSB7XG4gIC8vIGFjY2VzcyBkYXRhIGZpZWxkXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEocGFyYW1zKSB7XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgZmllbGQ6ICdkYXRhJyxcbiAgICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICAgIGFsbG93U2V0dGluZzogZmFsc2UsXG4gICAgICBhbGxvd0dldHRpbmc6IGZhbHNlLFxuICAgICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSxcbiAgICAgIC8vIGtleSA9PiB0cnVlIGlmIGltbXV0YWJsZVxuICAgICAgdXBkYXRlU3R5bGU6IGZhbHNlLFxuICAgICAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoc2VsZikge30sXG4gICAgICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChzZWxmLCBvYmopIHt9LFxuICAgICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KHNlbGYpIHt9LFxuICAgICAgY2FuU2V0OiBmdW5jdGlvbiBjYW5TZXQoc2VsZikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRhdGFJbXBsKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuXG4gICAgICB2YXIgc2luZ2xlID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZlswXSA6IHNlbGY7IC8vIC5kYXRhKCdmb28nLCAuLi4pXG5cbiAgICAgIGlmIChzdHJpbmcobmFtZSkpIHtcbiAgICAgICAgLy8gc2V0IG9yIGdldCBwcm9wZXJ0eVxuICAgICAgICAvLyAuZGF0YSgnZm9vJylcbiAgICAgICAgaWYgKHAuYWxsb3dHZXR0aW5nICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBnZXRcbiAgICAgICAgICB2YXIgcmV0O1xuXG4gICAgICAgICAgaWYgKHNpbmdsZSkge1xuICAgICAgICAgICAgcC5iZWZvcmVHZXQoc2luZ2xlKTtcbiAgICAgICAgICAgIHJldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmV0OyAvLyAuZGF0YSgnZm9vJywgJ2JhcicpXG4gICAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHNldFxuICAgICAgICAgIHZhciB2YWxpZCA9ICFwLmltbXV0YWJsZUtleXNbbmFtZV07XG5cbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBfZGVmaW5lUHJvcGVydHkoe30sIG5hbWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgY2hhbmdlKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbGwubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG5cbiAgICAgICAgICAgICAgaWYgKHAuY2FuU2V0KGVsZSkpIHtcbiAgICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcC5maWVsZF1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuXG5cbiAgICAgICAgICAgIGlmIChwLnVwZGF0ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIHNlbGYudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgICAgIH0gLy8gY2FsbCBvblNldCBjYWxsYmFja1xuXG5cbiAgICAgICAgICAgIHAub25TZXQoc2VsZik7XG5cbiAgICAgICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIC5kYXRhKHsgJ2Zvbyc6ICdiYXInIH0pXG5cbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd1NldHRpbmcgJiYgcGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgICAgLy8gZXh0ZW5kXG4gICAgICAgIHZhciBvYmogPSBuYW1lO1xuICAgICAgICB2YXIgaywgdjtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBwLmJlZm9yZVNldChzZWxmLCBvYmopO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBrZXlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIGsgPSBrZXlzW19pXTtcbiAgICAgICAgICB2ID0gb2JqW2tdO1xuXG4gICAgICAgICAgdmFyIF92YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba107XG5cbiAgICAgICAgICBpZiAoX3ZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX2VsZSA9IGFsbFtqXTtcblxuICAgICAgICAgICAgICBpZiAocC5jYW5TZXQoX2VsZSkpIHtcbiAgICAgICAgICAgICAgICBfZWxlLl9wcml2YXRlW3AuZmllbGRdW2tdID0gdjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB1cGRhdGUgbWFwcGVycyBpZiBhc2tlZFxuXG5cbiAgICAgICAgaWYgKHAudXBkYXRlU3R5bGUpIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIH0gLy8gY2FsbCBvblNldCBjYWxsYmFja1xuXG5cbiAgICAgICAgcC5vblNldChzZWxmKTtcblxuICAgICAgICBpZiAocC5zZXR0aW5nVHJpZ2dlcnNFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLnNldHRpbmdFdmVudCk7XG4gICAgICAgIH0gLy8gLmRhdGEoZnVuY3Rpb24oKXsgLi4uIH0pXG5cbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd0JpbmRpbmcgJiYgZm4obmFtZSkpIHtcbiAgICAgICAgLy8gYmluZCB0byBldmVudFxuICAgICAgICB2YXIgZm4kMSA9IG5hbWU7XG4gICAgICAgIHNlbGYub24ocC5iaW5kaW5nRXZlbnQsIGZuJDEpOyAvLyAuZGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dHZXR0aW5nICYmIG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBnZXQgd2hvbGUgb2JqZWN0XG4gICAgICAgIHZhciBfcmV0O1xuXG4gICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICBwLmJlZm9yZUdldChzaW5nbGUpO1xuICAgICAgICAgIF9yZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3JldDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7IC8vIG1haW50YWluIGNoYWluYWJpbGl0eVxuICAgIH07IC8vIGZ1bmN0aW9uXG4gIH0sXG4gIC8vIGRhdGFcbiAgLy8gcmVtb3ZlIGRhdGEgZmllbGRcbiAgcmVtb3ZlRGF0YTogZnVuY3Rpb24gcmVtb3ZlRGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgZXZlbnQ6ICdkYXRhJyxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXJFdmVudDogZmFsc2UsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcblxuICAgIH07XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVtb3ZlRGF0YUltcGwobmFtZXMpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICAvLyAucmVtb3ZlRGF0YSgnZm9vIGJhcicpXG5cbiAgICAgIGlmIChzdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBsaXN0IG9mIGtleXMsIGFuZCBkZWxldGUgdGhlbVxuICAgICAgICB2YXIga2V5cyA9IG5hbWVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIHZhciBsID0ga2V5cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAvLyBkZWxldGUgZWFjaCBub24tZW1wdHkga2V5XG4gICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgICAgICBpZiAoZW1wdHlTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trZXldOyAvLyBub3QgdmFsaWQgaWYgaW1tdXRhYmxlXG5cbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlfYSA9IDAsIGxfYSA9IGFsbC5sZW5ndGg7IGlfYSA8IGxfYTsgaV9hKyspIHtcbiAgICAgICAgICAgICAgYWxsW2lfYV0uX3ByaXZhdGVbcC5maWVsZF1ba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH0gLy8gLnJlbW92ZURhdGEoKVxuXG4gICAgICB9IGVsc2UgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdGhlbiBkZWxldGUgYWxsIGtleXNcbiAgICAgICAgZm9yICh2YXIgX2lfYSA9IDAsIF9sX2EgPSBhbGwubGVuZ3RoOyBfaV9hIDwgX2xfYTsgX2lfYSsrKSB7XG4gICAgICAgICAgdmFyIF9wcml2YXRlRmllbGRzID0gYWxsW19pX2FdLl9wcml2YXRlW3AuZmllbGRdO1xuXG4gICAgICAgICAgdmFyIF9rZXlzID0gT2JqZWN0LmtleXMoX3ByaXZhdGVGaWVsZHMpO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgX2tleXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICAgICAgdmFyIF9rZXkgPSBfa2V5c1tfaTJdO1xuICAgICAgICAgICAgdmFyIHZhbGlkS2V5VG9EZWxldGUgPSAhcC5pbW11dGFibGVLZXlzW19rZXldO1xuXG4gICAgICAgICAgICBpZiAodmFsaWRLZXlUb0RlbGV0ZSkge1xuICAgICAgICAgICAgICBfcHJpdmF0ZUZpZWxkc1tfa2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocC50cmlnZ2VyRXZlbnQpIHtcbiAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5ldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7IC8vIG1haW50YWluIGNoYWluaW5nXG4gICAgfTsgLy8gZnVuY3Rpb25cbiAgfSAvLyByZW1vdmVEYXRhXG5cbn07IC8vIGRlZmluZVxuXG52YXIgZGVmaW5lJDIgPSB7XG4gIGV2ZW50QWxpYXNlc09uOiBmdW5jdGlvbiBldmVudEFsaWFzZXNPbihwcm90bykge1xuICAgIHZhciBwID0gcHJvdG87XG4gICAgcC5hZGRMaXN0ZW5lciA9IHAubGlzdGVuID0gcC5iaW5kID0gcC5vbjtcbiAgICBwLnVubGlzdGVuID0gcC51bmJpbmQgPSBwLm9mZiA9IHAucmVtb3ZlTGlzdGVuZXI7XG4gICAgcC50cmlnZ2VyID0gcC5lbWl0OyAvLyB0aGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFsaWFzIG9mIC5vbigpXG5cbiAgICBwLnBvbiA9IHAucHJvbWlzZU9uID0gZnVuY3Rpb24gKGV2ZW50cywgc2VsZWN0b3IpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soZSkge1xuICAgICAgICAgIHNlbGYub2ZmLmFwcGx5KHNlbGYsIG9mZkFyZ3MpO1xuICAgICAgICAgIHJlc29sdmUoZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG9uQXJncyA9IGFyZ3MuY29uY2F0KFtjYWxsYmFja10pO1xuICAgICAgICB2YXIgb2ZmQXJncyA9IG9uQXJncy5jb25jYXQoW10pO1xuICAgICAgICBzZWxmLm9uLmFwcGx5KHNlbGYsIG9uQXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59OyAvLyBkZWZpbmVcblxuLy8gdXNlIHRoaXMgbW9kdWxlIHRvIGNoZXJyeSBwaWNrIGZ1bmN0aW9ucyBpbnRvIHlvdXIgcHJvdG90eXBlXG52YXIgZGVmaW5lJDMgPSB7fTtcbltkZWZpbmUsIGRlZmluZSQxLCBkZWZpbmUkMl0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICBleHRlbmQoZGVmaW5lJDMsIG0pO1xufSk7XG5cbnZhciBlbGVzZm4kZCA9IHtcbiAgYW5pbWF0ZTogZGVmaW5lJDMuYW5pbWF0ZSgpLFxuICBhbmltYXRpb246IGRlZmluZSQzLmFuaW1hdGlvbigpLFxuICBhbmltYXRlZDogZGVmaW5lJDMuYW5pbWF0ZWQoKSxcbiAgY2xlYXJRdWV1ZTogZGVmaW5lJDMuY2xlYXJRdWV1ZSgpLFxuICBkZWxheTogZGVmaW5lJDMuZGVsYXkoKSxcbiAgZGVsYXlBbmltYXRpb246IGRlZmluZSQzLmRlbGF5QW5pbWF0aW9uKCksXG4gIHN0b3A6IGRlZmluZSQzLnN0b3AoKVxufTtcblxudmFyIGVsZXNmbiRlID0ge1xuICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKF9jbGFzc2VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKF9jbGFzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXQgPSBbXTtcblxuICAgICAgc2VsZlswXS5fcHJpdmF0ZS5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgICByZXR1cm4gcmV0LnB1c2goY2xzKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAoIWFycmF5KF9jbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBfY2xhc3NlcyA9IChfY2xhc3NlcyB8fCAnJykubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuXG4gICAgdmFyIGNoYW5nZWQgPSBbXTtcbiAgICB2YXIgY2xhc3Nlc1NldCA9IG5ldyBTZXQkMShfY2xhc3Nlcyk7IC8vIGNoZWNrIGFuZCB1cGRhdGUgZWFjaCBlbGVcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGVsZSA9IHNlbGZbal07XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgZWxlQ2xhc3NlcyA9IF9wLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlOyAvLyBjaGVjayBpZiBlbGUgaGFzIGFsbCBvZiB0aGUgcGFzc2VkIGNsYXNzZXNcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xzID0gX2NsYXNzZXNbaV07XG4gICAgICAgIHZhciBlbGVIYXNDbGFzcyA9IGVsZUNsYXNzZXMuaGFzKGNscyk7XG5cbiAgICAgICAgaWYgKCFlbGVIYXNDbGFzcykge1xuICAgICAgICAgIGNoYW5nZWRFbGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IC8vIGNoZWNrIGlmIGVsZSBoYXMgY2xhc3NlcyBvdXRzaWRlIG9mIHRob3NlIHBhc3NlZFxuXG5cbiAgICAgIGlmICghY2hhbmdlZEVsZSkge1xuICAgICAgICBjaGFuZ2VkRWxlID0gZWxlQ2xhc3Nlcy5zaXplICE9PSBfY2xhc3Nlcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkRWxlKSB7XG4gICAgICAgIF9wLmNsYXNzZXMgPSBjbGFzc2VzU2V0O1xuICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9IC8vIHRyaWdnZXIgdXBkYXRlIHN0eWxlIG9uIHRob3NlIGVsZXMgdGhhdCBoYWQgY2xhc3MgY2hhbmdlc1xuXG5cbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYXduKGNoYW5nZWQpLnVwZGF0ZVN0eWxlKCkuZW1pdCgnY2xhc3MnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcbiAgfSxcbiAgaGFzQ2xhc3M6IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUgIT0gbnVsbCAmJiBlbGUuX3ByaXZhdGUuY2xhc3Nlcy5oYXMoY2xhc3NOYW1lKTtcbiAgfSxcbiAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRvZ2dsZSkge1xuICAgIGlmICghYXJyYXkoY2xhc3NlcykpIHtcbiAgICAgIC8vIGV4dHJhY3QgY2xhc3NlcyBmcm9tIHN0cmluZ1xuICAgICAgY2xhc3NlcyA9IGNsYXNzZXMubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b2dnbGVVbmRlZmQgPSB0b2dnbGUgPT09IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hhbmdlZCA9IFtdOyAvLyBlbGVzIHdobyBoYWQgY2xhc3NlcyBjaGFuZ2VkXG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBzZWxmLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBzZWxmW2ldO1xuICAgICAgdmFyIGVsZUNsYXNzZXMgPSBlbGUuX3ByaXZhdGUuY2xhc3NlcztcbiAgICAgIHZhciBjaGFuZ2VkRWxlID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3Nlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY2xzID0gY2xhc3Nlc1tqXTtcbiAgICAgICAgdmFyIGhhc0NsYXNzID0gZWxlQ2xhc3Nlcy5oYXMoY2xzKTtcbiAgICAgICAgdmFyIGNoYW5nZWROb3cgPSBmYWxzZTtcblxuICAgICAgICBpZiAodG9nZ2xlIHx8IHRvZ2dsZVVuZGVmZCAmJiAhaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmIGhhc0NsYXNzKSB7XG4gICAgICAgICAgZWxlQ2xhc3Nlc1tcImRlbGV0ZVwiXShjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaGFuZ2VkRWxlICYmIGNoYW5nZWROb3cpIHtcbiAgICAgICAgICBjaGFuZ2VkLnB1c2goZWxlKTtcbiAgICAgICAgICBjaGFuZ2VkRWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgaiBjbGFzc2VzXG5cbiAgICB9IC8vIGZvciBpIGVsZXNcbiAgICAvLyB0cmlnZ2VyIHVwZGF0ZSBzdHlsZSBvbiB0aG9zZSBlbGVzIHRoYXQgaGFkIGNsYXNzIGNoYW5nZXNcblxuXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiByZW1vdmVDbGFzcyhjbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuICB9LFxuICBmbGFzaENsYXNzOiBmdW5jdGlvbiBmbGFzaENsYXNzKGNsYXNzZXMsIGR1cmF0aW9uKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgIGR1cmF0aW9uID0gMjUwO1xuICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIHJldHVybiBzZWxmOyAvLyBub3RoaW5nIHRvIGRvIHJlYWxseVxuICAgIH1cblxuICAgIHNlbGYuYWRkQ2xhc3MoY2xhc3Nlcyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnJlbW92ZUNsYXNzKGNsYXNzZXMpO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxufTtcbmVsZXNmbiRlLmNsYXNzTmFtZSA9IGVsZXNmbiRlLmNsYXNzTmFtZXMgPSBlbGVzZm4kZS5jbGFzc2VzO1xuXG52YXIgdG9rZW5zID0ge1xuICBtZXRhQ2hhcjogJ1tcXFxcIVxcXFxcIlxcXFwjXFxcXCRcXFxcJVxcXFwmXFxcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcLlxcXFwvXFxcXDpcXFxcO1xcXFw8XFxcXD1cXFxcPlxcXFw/XFxcXEBcXFxcW1xcXFxdXFxcXF5cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XScsXG4gIC8vIGNoYXJzIHdlIG5lZWQgdG8gZXNjYXBlIGluIGxldCBuYW1lcywgZXRjXG4gIGNvbXBhcmF0b3JPcDogJz18XFxcXCE9fD58Pj18PHw8PXxcXFxcJD18XFxcXF49fFxcXFwqPScsXG4gIC8vIGJpbmFyeSBjb21wYXJpc29uIG9wICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKVxuICBib29sT3A6ICdcXFxcP3xcXFxcIXxcXFxcXicsXG4gIC8vIGJvb2xlYW4gKHVuYXJ5KSBvcGVyYXRvcnMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIHN0cmluZzogJ1wiKD86XFxcXFxcXFxcInxbXlwiXSkqXCInICsgJ3wnICsgXCInKD86XFxcXFxcXFwnfFteJ10pKidcIixcbiAgLy8gc3RyaW5nIGxpdGVyYWxzICh1c2VkIGluIGRhdGEgc2VsZWN0b3JzKSAtLSBkb3VibGVxdW90ZXMgfCBzaW5nbGVxdW90ZXNcbiAgbnVtYmVyOiBudW1iZXIkMSxcbiAgLy8gbnVtYmVyIGxpdGVyYWwgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tLSBlLmcuIDAuMTIzNCwgMTIzNCwgMTJlMTIzXG4gIG1ldGE6ICdkZWdyZWV8aW5kZWdyZWV8b3V0ZGVncmVlJyxcbiAgLy8gYWxsb3dlZCBtZXRhZGF0YSBmaWVsZHMgKGkuZS4gYWxsb3dlZCBmdW5jdGlvbnMgdG8gdXNlIGZyb20gQ29sbGVjdGlvbilcbiAgc2VwYXJhdG9yOiAnXFxcXHMqLFxcXFxzKicsXG4gIC8vIHF1ZXJpZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4gZWRnZVtmb28gPSAnYmFyJ10sIG5vZGUuc29tZUNsYXNzXG4gIGRlc2NlbmRhbnQ6ICdcXFxccysnLFxuICBjaGlsZDogJ1xcXFxzKz5cXFxccysnLFxuICBzdWJqZWN0OiAnXFxcXCQnLFxuICBncm91cDogJ25vZGV8ZWRnZXxcXFxcKicsXG4gIGRpcmVjdGVkRWRnZTogJ1xcXFxzKy0+XFxcXHMrJyxcbiAgdW5kaXJlY3RlZEVkZ2U6ICdcXFxccys8LT5cXFxccysnXG59O1xudG9rZW5zLnZhcmlhYmxlID0gJyg/OltcXFxcdy1dfCg/OlxcXFxcXFxcJyArIHRva2Vucy5tZXRhQ2hhciArICcpKSsnOyAvLyBhIHZhcmlhYmxlIG5hbWVcblxudG9rZW5zLnZhbHVlID0gdG9rZW5zLnN0cmluZyArICd8JyArIHRva2Vucy5udW1iZXI7IC8vIGEgdmFsdWUgbGl0ZXJhbCwgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlclxuXG50b2tlbnMuY2xhc3NOYW1lID0gdG9rZW5zLnZhcmlhYmxlOyAvLyBhIGNsYXNzIG5hbWUgKGZvbGxvd3MgdmFyaWFibGUgY29udmVudGlvbnMpXG5cbnRva2Vucy5pZCA9IHRva2Vucy52YXJpYWJsZTsgLy8gYW4gZWxlbWVudCBpZCAoZm9sbG93cyB2YXJpYWJsZSBjb252ZW50aW9ucylcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9wcywgb3AsIGk7IC8vIGFkZCBAIHZhcmlhbnRzIHRvIGNvbXBhcmF0b3JPcFxuXG4gIG9wcyA9IHRva2Vucy5jb21wYXJhdG9yT3Auc3BsaXQoJ3wnKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH0gLy8gYWRkICEgdmFyaWFudHMgdG8gY29tcGFyYXRvck9wXG5cblxuICBvcHMgPSB0b2tlbnMuY29tcGFyYXRvck9wLnNwbGl0KCd8Jyk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIG9wID0gb3BzW2ldO1xuXG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcblxuXG4gICAgaWYgKG9wID09PSAnPScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gc2tpcCA9IGIvYyAhPSBpcyBleHBsaWNpdGx5IGRlZmluZWRcblxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG5cbiAgLyoqIEEgY29sbGVjdGlvbiBvZiBlbGVtZW50cyAqL1xuICBDT0xMRUNUSU9OOiAxLFxuXG4gIC8qKiBBIGZpbHRlcihlbGUpIGZ1bmN0aW9uICovXG4gIEZJTFRFUjogMixcblxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuXG4gIC8qKiBFLmcuIFtmb29dICovXG4gIERBVEFfRVhJU1Q6IDQsXG5cbiAgLyoqIEUuZy4gWz9mb29dICovXG4gIERBVEFfQk9PTDogNSxcblxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG5cbiAgLyoqIEUuZy4gOnNlbGVjdGVkICovXG4gIFNUQVRFOiA3LFxuXG4gIC8qKiBFLmcuICNmb28gKi9cbiAgSUQ6IDgsXG5cbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcblxuICAvKiogRS5nLiAjZm9vIDwtPiAjYmFyICovXG4gIFVORElSRUNURURfRURHRTogMTAsXG5cbiAgLyoqIEUuZy4gI2ZvbyAtPiAjYmFyICovXG4gIERJUkVDVEVEX0VER0U6IDExLFxuXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuXG4gIC8qKiBFLmcuICNmb28gLT4gJCNiYXIgKi9cbiAgTk9ERV9UQVJHRVQ6IDEzLFxuXG4gIC8qKiBFLmcuICQjZm9vIDwtPiAjYmFyICovXG4gIE5PREVfTkVJR0hCT1I6IDE0LFxuXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcblxuICAvKiogRS5nLiAjZm9vICNiYXIgKi9cbiAgREVTQ0VOREFOVDogMTYsXG5cbiAgLyoqIEUuZy4gJCNmb28gPiAjYmFyICovXG4gIFBBUkVOVDogMTcsXG5cbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG5cbiAgLyoqIEUuZy4gI2ZvbyA+ICRiYXIgPiAjYmF6ICovXG4gIENPTVBPVU5EX1NQTElUOiAxOSxcblxuICAvKiogQWx3YXlzIG1hdGNoZXMsIHVzZWZ1bCBwbGFjZWhvbGRlciBmb3Igc3ViamVjdCBpbiBgQ09NUE9VTkRfU1BMSVRgICovXG4gIFRSVUU6IDIwXG59O1xuXG52YXIgc3RhdGVTZWxlY3RvcnMgPSBbe1xuICBzZWxlY3RvcjogJzpzZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5zZWxlY3RlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVuc2VsZWN0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6c2VsZWN0YWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5zZWxlY3RhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9ja2VkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnVubG9ja2VkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5sb2NrZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp2aXNpYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnZpc2libGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpoaWRkZW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnZpc2libGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp0cmFuc3BhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS50cmFuc3BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmZyZWUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmdyYWJiZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpyZW1vdmVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnJlbW92ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzppbnNpZGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnJlbW92ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpncmFiYmFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5ncmFiYmFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmdyYWJiYWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmFuaW1hdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5hbmltYXRlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpwYXJlbnQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNQYXJlbnQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjaGlsZGxlc3MnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZGxlc3MoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjaGlsZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6b3JwaGFuJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzT3JwaGFuKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bm9ub3JwaGFuJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpjb21wb3VuZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnNvdXJjZSgpLmlzUGFyZW50KCkgfHwgZWxlLnRhcmdldCgpLmlzUGFyZW50KCk7XG4gICAgfVxuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmxvb3AnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNMb29wKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6c2ltcGxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzU2ltcGxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YWN0aXZlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluYWN0aXZlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hY3RpdmUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpiYWNrZ3JvdW5kaW5nJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25iYWNrZ3JvdW5kaW5nJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5iYWNrZ3JvdW5kaW5nKCk7XG4gIH1cbn1dLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgLy8gbi5iLiBzZWxlY3RvcnMgdGhhdCBhcmUgc3RhcnRpbmcgc3Vic3RyaW5ncyBvZiBvdGhlcnMgbXVzdCBoYXZlIHRoZSBsb25nZXIgb25lcyBmaXJzdFxuICByZXR1cm4gZGVzY2VuZGluZyhhLnNlbGVjdG9yLCBiLnNlbGVjdG9yKTtcbn0pO1xuXG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlU2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgcyA9IHN0YXRlU2VsZWN0b3JzW2ldO1xuICAgIHNlbFRvRm5bcy5zZWxlY3Rvcl0gPSBzLm1hdGNoZXM7XG4gIH1cblxuICByZXR1cm4gc2VsVG9Gbjtcbn0oKTtcblxudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG5cbnZhciBjbGVhbk1ldGFDaGFycyA9IGZ1bmN0aW9uIGNsZWFuTWV0YUNoYXJzKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcXFwoJyArIHRva2Vucy5tZXRhQ2hhciArICcpJywgJ2cnKSwgZnVuY3Rpb24gKG1hdGNoLCAkMSkge1xuICAgIHJldHVybiAkMTtcbiAgfSk7XG59O1xuXG52YXIgcmVwbGFjZUxhc3RRdWVyeSA9IGZ1bmN0aW9uIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGV4YW1pbmluZ1F1ZXJ5LCByZXBsYWNlbWVudFF1ZXJ5KSB7XG4gIHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdID0gcmVwbGFjZW1lbnRRdWVyeTtcbn07IC8vIE5PVEU6IGFkZCBuZXcgZXhwcmVzc2lvbiBzeW50YXggaGVyZSB0byBoYXZlIGl0IHJlY29nbmlzZWQgYnkgdGhlIHBhcnNlcjtcbi8vIC0gYSBxdWVyeSBjb250YWlucyBhbGwgYWRqYWNlbnQgKGkuZS4gbm8gc2VwYXJhdG9yIGluIGJldHdlZW4pIGV4cHJlc3Npb25zO1xuLy8gLSB0aGUgY3VycmVudCBxdWVyeSBpcyBzdG9yZWQgaW4gc2VsZWN0b3JbaV1cbi8vIC0geW91IG5lZWQgdG8gY2hlY2sgdGhlIHF1ZXJ5IG9iamVjdHMgaW4gbWF0Y2goKSBmb3IgaXQgYWN0dWFsbHkgZmlsdGVyIHByb3Blcmx5LCBidXQgdGhhdCdzIHByZXR0eSBzdHJhaWdodCBmb3J3YXJkXG5cblxudmFyIGV4cHJzID0gW3tcbiAgbmFtZTogJ2dyb3VwJyxcbiAgLy8ganVzdCB1c2VkIGZvciBpZGVudGlmeWluZyB3aGVuIGRlYnVnZ2luZ1xuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICcoJyArIHRva2Vucy5ncm91cCArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDEpLFxuICAgICAgICBncm91cCA9IF9yZWYyWzBdO1xuXG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgICAgc3RhdGUgPSBfcmVmNFswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuU1RBVEUsXG4gICAgICB2YWx1ZTogc3RhdGVcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnaWQnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcIygnICsgdG9rZW5zLmlkICsgJyknLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmNSkge1xuICAgIHZhciBfcmVmNiA9IF9zbGljZWRUb0FycmF5KF9yZWY1LCAxKSxcbiAgICAgICAgaWQgPSBfcmVmNlswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuSUQsXG4gICAgICB2YWx1ZTogY2xlYW5NZXRhQ2hhcnMoaWQpXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NsYXNzTmFtZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwuKCcgKyB0b2tlbnMuY2xhc3NOYW1lICsgJyknLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmNykge1xuICAgIHZhciBfcmVmOCA9IF9zbGljZWRUb0FycmF5KF9yZWY3LCAxKSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3JlZjhbMF07XG5cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjEwID0gX3NsaWNlZFRvQXJyYXkoX3JlZjksIDEpLFxuICAgICAgICB2YXJpYWJsZSA9IF9yZWYxMFswXTtcblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9FWElTVCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLnZhcmlhYmxlICsgJylcXFxccyooJyArIHRva2Vucy5jb21wYXJhdG9yT3AgKyAnKVxcXFxzKignICsgdG9rZW5zLnZhbHVlICsgJylcXFxccypcXFxcXScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYxMSkge1xuICAgIHZhciBfcmVmMTIgPSBfc2xpY2VkVG9BcnJheShfcmVmMTEsIDMpLFxuICAgICAgICB2YXJpYWJsZSA9IF9yZWYxMlswXSxcbiAgICAgICAgY29tcGFyYXRvck9wID0gX3JlZjEyWzFdLFxuICAgICAgICB2YWx1ZSA9IF9yZWYxMlsyXTtcblxuICAgIHZhciB2YWx1ZUlzU3RyaW5nID0gbmV3IFJlZ0V4cCgnXicgKyB0b2tlbnMuc3RyaW5nICsgJyQnKS5leGVjKHZhbHVlKSAhPSBudWxsO1xuXG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cblxuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9DT01QQVJFLFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKSxcbiAgICAgIG9wZXJhdG9yOiBjb21wYXJhdG9yT3AsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUJvb2wnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxzKignICsgdG9rZW5zLmJvb2xPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjEzKSB7XG4gICAgdmFyIF9yZWYxNCA9IF9zbGljZWRUb0FycmF5KF9yZWYxMywgMiksXG4gICAgICAgIGJvb2xPcCA9IF9yZWYxNFswXSxcbiAgICAgICAgdmFyaWFibGUgPSBfcmVmMTRbMV07XG5cbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkRBVEFfQk9PTCxcbiAgICAgIGZpZWxkOiBjbGVhbk1ldGFDaGFycyh2YXJpYWJsZSksXG4gICAgICBvcGVyYXRvcjogYm9vbE9wXG4gICAgfSk7XG4gIH1cbn0sIHtcbiAgbmFtZTogJ21ldGFDb21wYXJlJyxcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnXFxcXFtcXFxcW1xcXFxzKignICsgdG9rZW5zLm1ldGEgKyAnKVxcXFxzKignICsgdG9rZW5zLmNvbXBhcmF0b3JPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMubnVtYmVyICsgJylcXFxccypcXFxcXVxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjE1KSB7XG4gICAgdmFyIF9yZWYxNiA9IF9zbGljZWRUb0FycmF5KF9yZWYxNSwgMyksXG4gICAgICAgIG1ldGEgPSBfcmVmMTZbMF0sXG4gICAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxNlsxXSxcbiAgICAgICAgbnVtYmVyID0gX3JlZjE2WzJdO1xuXG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5NRVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnMobWV0YSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICduZXh0UXVlcnknLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuc2VwYXJhdG9yLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgdmFyIGN1cnJlbnRTdWJqZWN0ID0gc2VsZWN0b3IuY3VycmVudFN1YmplY3Q7XG4gICAgdmFyIGVkZ2VDb3VudCA9IHNlbGVjdG9yLmVkZ2VDb3VudDtcbiAgICB2YXIgY29tcG91bmRDb3VudCA9IHNlbGVjdG9yLmNvbXBvdW5kQ291bnQ7XG4gICAgdmFyIGxhc3RRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgICAgbGFzdFEuc3ViamVjdCA9IGN1cnJlbnRTdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICAgIH1cblxuICAgIGxhc3RRLmVkZ2VDb3VudCA9IGVkZ2VDb3VudDtcbiAgICBsYXN0US5jb21wb3VuZENvdW50ID0gY29tcG91bmRDb3VudDtcbiAgICBzZWxlY3Rvci5lZGdlQ291bnQgPSAwO1xuICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQgPSAwOyAvLyBnbyBvbiB0byBuZXh0IHF1ZXJ5XG5cbiAgICB2YXIgbmV4dFF1ZXJ5ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoKytdID0gbmV3UXVlcnkoKTtcbiAgICByZXR1cm4gbmV4dFF1ZXJ5OyAvLyB0aGlzIGlzIHRoZSBuZXcgcXVlcnkgdG8gYmUgZmlsbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXhwcnNcbiAgfVxufSwge1xuICBuYW1lOiAnZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRpcmVjdGVkRWRnZSxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSkge1xuICAgIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PSBudWxsKSB7XG4gICAgICAvLyB1bmRpcmVjdGVkIGVkZ2VcbiAgICAgIHZhciBlZGdlUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHNvdXJjZSA9IHF1ZXJ5O1xuICAgICAgdmFyIHRhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBlZGdlUXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkRJUkVDVEVEX0VER0UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKzsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNvdXJjZS90YXJnZXRcbiAgICAgIHZhciBzcmNUZ3RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfc291cmNlID0gcXVlcnk7XG5cbiAgICAgIHZhciBfdGFyZ2V0ID0gbmV3UXVlcnkoKTtcblxuICAgICAgc3JjVGd0US5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuTk9ERV9TT1VSQ0UsXG4gICAgICAgIHNvdXJjZTogX3NvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiBfdGFyZ2V0XG4gICAgICB9KTsgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIG5laWdoYm91cmhvb2QgcmF0aGVyIHRoYW4gdGhlIG5vZGVcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHNyY1RndFEpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG4gICAgICByZXR1cm4gX3RhcmdldDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3VuZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnVuZGlyZWN0ZWRFZGdlLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZVxuICAgICAgdmFyIGVkZ2VRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIGVkZ2VRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVU5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBub2RlczogW3NvdXJjZSwgdGFyZ2V0XVxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcblxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGVkZ2VRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5lZGdlQ291bnQrKzsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5laWdoYm91cmhvb2RcbiAgICAgIHZhciBuaG9vZFEgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIG5vZGUgPSBxdWVyeTtcbiAgICAgIHZhciBuZWlnaGJvciA9IG5ld1F1ZXJ5KCk7XG4gICAgICBuaG9vZFEuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLk5PREVfTkVJR0hCT1IsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIG5laWdoYm9yOiBuZWlnaGJvclxuICAgICAgfSk7IC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBuZWlnaGJvdXJob29kIHJhdGhlciB0aGFuIHRoZSBub2RlXG5cbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBuaG9vZFEpO1xuICAgICAgcmV0dXJuIG5laWdoYm9yOyAvLyBub3cgcG9wdWxhdGluZyB0aGUgbmVpZ2hib3Igd2l0aCBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NoaWxkJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmNoaWxkLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIGRlZmF1bHQ6IGNoaWxkIHF1ZXJ5XG4gICAgICB2YXIgcGFyZW50Q2hpbGRRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgY2hpbGQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgcGFyZW50Q2hpbGRRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ0hJTEQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBjaGlsZDogY2hpbGRcbiAgICAgIH0pOyAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgcGFyZW50Q2hpbGRRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG5cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcblxuICAgICAgdmFyIF9jaGlsZCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfcGFyZW50ID0gbmV3UXVlcnkoKTsgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcblxuXG4gICAgICBjb21wb3VuZC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ09NUE9VTkRfU1BMSVQsXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgc3ViamVjdDogc3ViamVjdFxuICAgICAgfSk7IC8vIHBvcHVsYXRlIHRoZSBzdWJqZWN0IGFuZCByZXBsYWNlIHRoZSBxIGF0IHRoZSBvbGQgc3BvdCAod2l0aGluIGxlZnQpIHdpdGggVFJVRVxuXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcblxuICAgICAgcXVlcnkuY2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9XTsgLy8gY2hlY2tzIHVuZGVyIGxlZnQgcmVmcyB0aGUgc3ViamVjdCBpbXBsaWNpdGx5XG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcblxuICAgICAgX3BhcmVudC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIHBhcmVudCBpbXBsaWNpdGx5IHJlZnMgdGhlIHN1YmplY3RcblxuXG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIHBhcmVudDogX3BhcmVudCxcbiAgICAgICAgY2hpbGQ6IF9jaGlsZCAvLyBlbXB0eSBmb3Igbm93XG5cbiAgICAgIH0pO1xuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgbGVmdCwgY29tcG91bmQpOyAvLyB1cGRhdGUgdGhlIHJlZiBzaW5jZSB3ZSBtb3ZlZCB0aGluZ3MgYXJvdW5kIGZvciBgcXVlcnlgXG5cbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gc3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfY2hpbGQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgY2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGFyZW50IHF1ZXJ5XG4gICAgICAvLyBpbmZvIGZvciBwYXJlbnQgcXVlcnlcbiAgICAgIHZhciBfcGFyZW50MiA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcblxuICAgICAgdmFyIHBjUUNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuUEFSRU5ULFxuICAgICAgICBwYXJlbnQ6IF9wYXJlbnQyLFxuICAgICAgICBjaGlsZDogX2NoaWxkMlxuICAgICAgfV07IC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuXG4gICAgICBfcGFyZW50Mi5jaGVja3MgPSBxdWVyeS5jaGVja3M7IC8vIHRoZSBwcmV2aW91cyBxdWVyeSBjb250YWlucyB0aGUgY2hlY2tzIGZvciB0aGUgcGFyZW50XG5cbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pOyAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgYW5jQ2hRdWVyeSk7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBkZXNjZW5kYW50IHF1ZXJ5IHdpdGggZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3dcblxuICAgICAgcmV0dXJuIGRlc2NlbmRhbnQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9PT0gcXVlcnkpIHtcbiAgICAgIC8vIGNvbXBvdW5kIHNwbGl0IHF1ZXJ5XG4gICAgICB2YXIgY29tcG91bmQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGxlZnQgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciByaWdodCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc3ViamVjdCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfYW5jZXN0b3IgPSBuZXdRdWVyeSgpOyAvLyBzZXQgdXAgdGhlIHJvb3QgY29tcG91bmQgcVxuXG5cbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTsgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG5cbiAgICAgIHN1YmplY3QuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0YWtlIHRoZSBjaGVja3MgZnJvbSB0aGUgbGVmdFxuXG4gICAgICBxdWVyeS5jaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH1dOyAvLyBjaGVja3MgdW5kZXIgbGVmdCByZWZzIHRoZSBzdWJqZWN0IGltcGxpY2l0bHlcbiAgICAgIC8vIHNldCB1cCB0aGUgcmlnaHQgcVxuXG4gICAgICBfYW5jZXN0b3IuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH0pOyAvLyBhbmNlc3RvciBpbXBsaWNpdGx5IHJlZnMgdGhlIHN1YmplY3RcblxuXG4gICAgICByaWdodC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQU5DRVNUT1IsXG4gICAgICAgIC8vIHR5cGUgaXMgc3dhcHBlZCBvbiByaWdodCBzaWRlIHF1ZXJpZXNcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcixcbiAgICAgICAgZGVzY2VuZGFudDogX2Rlc2NlbmRhbnQgLy8gZW1wdHkgZm9yIG5vd1xuXG4gICAgICB9KTtcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTsgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuXG4gICAgICBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2Rlc2NlbmRhbnQ7IC8vIG5vdyBwb3B1bGF0aW5nIHRoZSByaWdodCBzaWRlJ3MgZGVzY2VuZGFudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbmNlc3RvciBxdWVyeVxuICAgICAgLy8gaW5mbyBmb3IgcGFyZW50IHF1ZXJ5XG4gICAgICB2YXIgX2FuY2VzdG9yMiA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIHZhciBfZGVzY2VuZGFudDIgPSBuZXdRdWVyeSgpO1xuXG4gICAgICB2YXIgYWRRQ2hlY2tzID0gW3tcbiAgICAgICAgdHlwZTogVHlwZS5BTkNFU1RPUixcbiAgICAgICAgYW5jZXN0b3I6IF9hbmNlc3RvcjIsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50MlxuICAgICAgfV07IC8vIHRoZSBwYXJlbnQtY2hpbGQgcXVlcnkgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBxdWVyeSBwcmV2aW91c2x5IGJlaW5nIHBvcHVsYXRlZFxuXG4gICAgICBfYW5jZXN0b3IyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcblxuICAgICAgcXVlcnkuY2hlY2tzID0gYWRRQ2hlY2tzOyAvLyBwYyBxdWVyeSB0YWtlcyBvdmVyXG5cbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDI7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZFxuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnc3ViamVjdCcsXG4gIG1vZGlmaWVyOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnN1YmplY3QsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT0gbnVsbCAmJiBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCAhPT0gcXVlcnkpIHtcbiAgICAgIHdhcm4oJ1JlZGVmaW5pdGlvbiBvZiBzdWJqZWN0IGluIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IudG9TdHJpbmcoKSArICdgJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBxdWVyeTtcbiAgICB2YXIgdG9wUSA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgIHZhciB0b3BDaGsgPSB0b3BRLmNoZWNrc1swXTtcbiAgICB2YXIgdG9wVHlwZSA9IHRvcENoayA9PSBudWxsID8gbnVsbCA6IHRvcENoay50eXBlO1xuXG4gICAgaWYgKHRvcFR5cGUgPT09IFR5cGUuRElSRUNURURfRURHRSkge1xuICAgICAgLy8gZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHRhcmdldFxuICAgICAgLy8gY2hhbmdlIHRvIHRhcmdldCBub2RlIGNoZWNrXG4gICAgICB0b3BDaGsudHlwZSA9IFR5cGUuTk9ERV9UQVJHRVQ7XG4gICAgfSBlbHNlIGlmICh0b3BUeXBlID09PSBUeXBlLlVORElSRUNURURfRURHRSkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlIHdpdGggc3ViamVjdCBvbiB0aGUgc2Vjb25kIG5vZGVcbiAgICAgIC8vIGNoYW5nZSB0byBuZWlnaGJvciBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfTkVJR0hCT1I7XG4gICAgICB0b3BDaGsubm9kZSA9IHRvcENoay5ub2Rlc1sxXTsgLy8gc2Vjb25kIG5vZGUgaXMgc3ViamVjdFxuXG4gICAgICB0b3BDaGsubmVpZ2hib3IgPSB0b3BDaGsubm9kZXNbMF07IC8vIGNsZWFuIHVwIHVudXNlZCBmaWVsZHMgZm9yIG5ldyB0eXBlXG5cbiAgICAgIHRvcENoay5ub2RlcyA9IG51bGw7XG4gICAgfVxuICB9XG59XTtcbmV4cHJzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGUucmVnZXhPYmogPSBuZXcgUmVnRXhwKCdeJyArIGUucmVnZXgpO1xufSk7XG5cbi8qKlxuICogT2YgYWxsIHRoZSBleHByZXNzaW9ucywgZmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIHJlbWFpbmluZyB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgcmVtYWluaW5nIHRleHQgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFRoZSBtYXRjaGVkIGV4cHJlc3Npb24gYW5kIHRoZSBuZXdseSByZW1haW5pbmcgdGV4dCBgeyBleHByLCBtYXRjaCwgbmFtZSwgcmVtYWluaW5nIH1gXG4gKi9cblxudmFyIGNvbnN1bWVFeHByID0gZnVuY3Rpb24gY29uc3VtZUV4cHIocmVtYWluaW5nKSB7XG4gIHZhciBleHByO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBuYW1lO1xuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgZXhwcnMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZSA9IGV4cHJzW2pdO1xuICAgIHZhciBuID0gZS5uYW1lO1xuICAgIHZhciBtID0gcmVtYWluaW5nLm1hdGNoKGUucmVnZXhPYmopO1xuXG4gICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgbWF0Y2ggPSBtO1xuICAgICAgZXhwciA9IGU7XG4gICAgICBuYW1lID0gbjtcbiAgICAgIHZhciBjb25zdW1lZCA9IG1bMF07XG4gICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gICAgICBicmVhazsgLy8gd2UndmUgY29uc3VtZWQgb25lIGV4cHIsIHNvIHdlIGNhbiByZXR1cm4gbm93XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHByOiBleHByLFxuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHJlbWFpbmluZzogcmVtYWluaW5nXG4gIH07XG59O1xuLyoqXG4gKiBDb25zdW1lIGFsbCB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSB0ZXh0IHRvIGNvbnN1bWVcbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkXG4gKi9cblxuXG52YXIgY29uc3VtZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiBjb25zdW1lV2hpdGVzcGFjZShyZW1haW5pbmcpIHtcbiAgdmFyIG1hdGNoID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKy8pO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBjb25zdW1lZCA9IG1hdGNoWzBdO1xuICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiByZW1haW5pbmc7XG59O1xuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIGFuZCBzdG9yZSB0aGUgcGFyc2VkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBTZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBUaGUgc2VsZWN0b3Igc3RyaW5nXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNlbGVjdG9yIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5cblxudmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gc2VsZi5pbnB1dFRleHQgPSBzZWxlY3RvcjtcbiAgdmFyIGN1cnJlbnRRdWVyeSA9IHNlbGZbMF0gPSBuZXdRdWVyeSgpO1xuICBzZWxmLmxlbmd0aCA9IDE7XG4gIHJlbWFpbmluZyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZyk7IC8vIGdldCByaWQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlXG5cbiAgZm9yICg7Oykge1xuICAgIHZhciBleHBySW5mbyA9IGNvbnN1bWVFeHByKHJlbWFpbmluZyk7XG5cbiAgICBpZiAoZXhwckluZm8uZXhwciA9PSBudWxsKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgaXMgaW52YWxpZCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IGV4cHJJbmZvLm1hdGNoLnNsaWNlKDEpOyAvLyBsZXQgdGhlIHRva2VuIHBvcHVsYXRlIHRoZSBzZWxlY3RvciBvYmplY3QgaW4gY3VycmVudFF1ZXJ5XG5cbiAgICAgIHZhciByZXQgPSBleHBySW5mby5leHByLnBvcHVsYXRlKHNlbGYsIGN1cnJlbnRRdWVyeSwgYXJncyk7XG5cbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gZXhpdCBpZiBwb3B1bGF0aW9uIGZhaWxlZFxuICAgICAgfSBlbHNlIGlmIChyZXQgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50UXVlcnkgPSByZXQ7IC8vIGNoYW5nZSB0aGUgY3VycmVudCBxdWVyeSB0byBiZSBmaWxsZWQgaWYgdGhlIGV4cHIgc3BlY2lmaWVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nOyAvLyB3ZSdyZSBkb25lIHdoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gcGFyc2VcblxuICAgIGlmIChyZW1haW5pbmcubWF0Y2goL15cXHMqJC8pKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHNlbGYuY3VycmVudFN1YmplY3QgIT0gbnVsbCkge1xuICAgIGxhc3RRLnN1YmplY3QgPSBzZWxmLmN1cnJlbnRTdWJqZWN0O1xuICB9XG5cbiAgbGFzdFEuZWRnZUNvdW50ID0gc2VsZi5lZGdlQ291bnQ7XG4gIGxhc3RRLmNvbXBvdW5kQ291bnQgPSBzZWxmLmNvbXBvdW5kQ291bnQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldOyAvLyBpbiBmdXR1cmUsIHRoaXMgY291bGQgcG90ZW50aWFsbHkgYmUgYWxsb3dlZCBpZiB0aGVyZSB3ZXJlIG9wZXJhdG9yIHByZWNlZGVuY2UgYW5kIGRldGVjdGlvbiBvZiBpbnZhbGlkIGNvbWJpbmF0aW9uc1xuXG4gICAgaWYgKHEuY29tcG91bmRDb3VudCA+IDAgJiYgcS5lZGdlQ291bnQgPiAwKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGludmFsaWQgYmVjYXVzZSBpdCB1c2VzIGJvdGggYSBjb21wb3VuZCBzZWxlY3RvciBhbmQgYW4gZWRnZSBzZWxlY3RvcicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTsgLy8gc3VjY2Vzc1xufTtcbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG5cblxudmFyIHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIGlmICh0aGlzLnRvU3RyaW5nQ2FjaGUgIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nQ2FjaGU7XG4gIH1cblxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNsZWFuVmFsID0gZnVuY3Rpb24gY2xlYW5WYWwodmFsKSB7XG4gICAgaWYgKHN0cmluZyh2YWwpKSB7XG4gICAgICByZXR1cm4gJ1wiJyArIHZhbCArICdcIic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjbGVhbih2YWwpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3BhY2UgPSBmdW5jdGlvbiBzcGFjZSh2YWwpIHtcbiAgICByZXR1cm4gJyAnICsgdmFsICsgJyAnO1xuICB9O1xuXG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgICAgdmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUeXBlLkdST1VQOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gY2xlYW4odmFsdWUpO1xuICAgICAgICAgIHJldHVybiBncm91cC5zdWJzdHJpbmcoMCwgZ3JvdXAubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICAgICAgICAgIHJldHVybiAnWycgKyBmaWVsZCArIHNwYWNlKGNsZWFuKG9wZXJhdG9yKSkgKyBjbGVhblZhbCh2YWx1ZSkgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfQk9PTDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkRBVEFfRVhJU1Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkMiA9IGNoZWNrLmZpZWxkO1xuICAgICAgICAgIHJldHVybiAnWycgKyBfZmllbGQyICsgJ10nO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgVHlwZS5NRVRBX0NPTVBBUkU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX29wZXJhdG9yMiA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuU1RBVEU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLklEOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcjJyArIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuUEFSRU5UOlxuICAgICAgY2FzZSBUeXBlLkNISUxEOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2sucGFyZW50LCBzdWJqZWN0KSArIHNwYWNlKCc+JykgKyBxdWVyeVRvU3RyaW5nKGNoZWNrLmNoaWxkLCBzdWJqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFR5cGUuQU5DRVNUT1I6XG4gICAgICBjYXNlIFR5cGUuREVTQ0VOREFOVDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLmFuY2VzdG9yLCBzdWJqZWN0KSArICcgJyArIHF1ZXJ5VG9TdHJpbmcoY2hlY2suZGVzY2VuZGFudCwgc3ViamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBUeXBlLlRSVUU6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIHF1ZXJ5VG9TdHJpbmcgPSBmdW5jdGlvbiBxdWVyeVRvU3RyaW5nKHF1ZXJ5LCBzdWJqZWN0KSB7XG4gICAgcmV0dXJuIHF1ZXJ5LmNoZWNrcy5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwgY2hrLCBpKSB7XG4gICAgICByZXR1cm4gc3RyICsgKHN1YmplY3QgPT09IHF1ZXJ5ICYmIGkgPT09IDAgPyAnJCcgOiAnJykgKyBjaGVja1RvU3RyaW5nKGNoaywgc3ViamVjdCk7XG4gICAgfSwgJycpO1xuICB9O1xuXG4gIHZhciBzdHIgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcXVlcnkgPSB0aGlzW2ldO1xuICAgIHN0ciArPSBxdWVyeVRvU3RyaW5nKHF1ZXJ5LCBxdWVyeS5zdWJqZWN0KTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEgJiYgaSA8IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgc3RyICs9ICcsICc7XG4gICAgfVxuICB9XG5cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyKGZpZWxkVmFsKTtcbiAgdmFyIGlzVmFsU3RyID0gc3RyaW5nKHZhbHVlKTtcbiAgdmFyIGZpZWxkU3RyLCB2YWxTdHI7XG4gIHZhciBjYXNlSW5zZW5zaXRpdmUgPSBmYWxzZTtcbiAgdmFyIG5vdEV4cHIgPSBmYWxzZTtcbiAgdmFyIGlzSW5lcUNtcCA9IGZhbHNlO1xuXG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCchJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnIScsICcnKTtcbiAgICBub3RFeHByID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCdAJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnQCcsICcnKTtcbiAgICBjYXNlSW5zZW5zaXRpdmUgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGlzRmllbGRTdHIgfHwgaXNWYWxTdHIgfHwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgZmllbGRTdHIgPSAhaXNGaWVsZFN0ciAmJiAhaXNGaWVsZE51bSA/ICcnIDogJycgKyBmaWVsZFZhbDtcbiAgICB2YWxTdHIgPSAnJyArIHZhbHVlO1xuICB9IC8vIGlmIHdlJ3JlIGRvaW5nIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCB0aGVuIHdlJ3JlIHVzaW5nIGEgU1RSSU5HIGNvbXBhcmlzb25cbiAgLy8gZXZlbiBpZiB3ZSdyZSBjb21wYXJpbmcgbnVtYmVyc1xuXG5cbiAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkVmFsID0gZmllbGRTdHIgPSBmaWVsZFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsU3RyID0gdmFsU3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnKj0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkU3RyLmluZGV4T2YodmFsU3RyKSA+PSAwO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICckPSc6XG4gICAgICBtYXRjaGVzID0gZmllbGRTdHIuaW5kZXhPZih2YWxTdHIsIGZpZWxkU3RyLmxlbmd0aCAtIHZhbFN0ci5sZW5ndGgpID49IDA7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ149JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPT09IDA7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJz0nOlxuICAgICAgbWF0Y2hlcyA9IGZpZWxkVmFsID09PSB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnPic6XG4gICAgICBpc0luZXFDbXAgPSB0cnVlO1xuICAgICAgbWF0Y2hlcyA9IGZpZWxkVmFsID4gdmFsdWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJz49JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPj0gdmFsdWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJzwnOlxuICAgICAgaXNJbmVxQ21wID0gdHJ1ZTtcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA8IHZhbHVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICc8PSc6XG4gICAgICBpc0luZXFDbXAgPSB0cnVlO1xuICAgICAgbWF0Y2hlcyA9IGZpZWxkVmFsIDw9IHZhbHVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gIH0gLy8gYXBwbHkgdGhlIG5vdCBvcCwgYnV0IG51bGwgdmFscyBmb3IgaW5lcXVhbGl0aWVzIHNob3VsZCBhbHdheXMgc3RheSBub24tbWF0Y2hpbmdcblxuXG4gIGlmIChub3RFeHByICYmIChmaWVsZFZhbCAhPSBudWxsIHx8ICFpc0luZXFDbXApKSB7XG4gICAgbWF0Y2hlcyA9ICFtYXRjaGVzO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xudmFyIGJvb2xDbXAgPSBmdW5jdGlvbiBib29sQ21wKGZpZWxkVmFsLCBvcGVyYXRvcikge1xuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnPyc6XG4gICAgICByZXR1cm4gZmllbGRWYWwgPyB0cnVlIDogZmFsc2U7XG5cbiAgICBjYXNlICchJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgIGNhc2UgJ14nOlxuICAgICAgcmV0dXJuIGZpZWxkVmFsID09PSB1bmRlZmluZWQ7XG4gIH1cbn07XG52YXIgZXhpc3RDbXAgPSBmdW5jdGlvbiBleGlzdENtcChmaWVsZFZhbCkge1xuICByZXR1cm4gZmllbGRWYWwgIT09IHVuZGVmaW5lZDtcbn07XG52YXIgZGF0YSA9IGZ1bmN0aW9uIGRhdGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlLmRhdGEoZmllbGQpO1xufTtcbnZhciBtZXRhID0gZnVuY3Rpb24gbWV0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGVbZmllbGRdKCk7XG59O1xuXG4vKiogQSBsb29rdXAgb2YgYG1hdGNoKGNoZWNrLCBlbGUpYCBmdW5jdGlvbnMgYnkgYFR5cGVgIGludCAqL1xuXG52YXIgbWF0Y2ggPSBbXTtcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGZvciB0aGUgZWxlbWVudFxuICogQHBhcmFtIHF1ZXJ5IFRoZSBgeyB0eXBlLCB2YWx1ZSwgLi4uIH1gIHF1ZXJ5IG9iamVjdFxuICogQHBhcmFtIGVsZSBUaGUgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3RcbiovXG5cbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5cbm1hdGNoW1R5cGUuR1JPVVBdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGdyb3VwID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBncm91cCA9PT0gJyonIHx8IGdyb3VwID09PSBlbGUuZ3JvdXAoKTtcbn07XG5cbm1hdGNoW1R5cGUuU1RBVEVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIHN0YXRlU2VsZWN0b3IgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIHN0YXRlU2VsZWN0b3JNYXRjaGVzKHN0YXRlU2VsZWN0b3IsIGVsZSk7XG59O1xuXG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcblxubWF0Y2hbVHlwZS5DTEFTU10gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgY2xzID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBlbGUuaGFzQ2xhc3MoY2xzKTtcbn07XG5cbm1hdGNoW1R5cGUuTUVUQV9DT01QQVJFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAobWV0YShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5cbm1hdGNoW1R5cGUuREFUQV9DT01QQVJFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiB2YWxDbXAoZGF0YShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5cbm1hdGNoW1R5cGUuREFUQV9CT09MXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgcmV0dXJuIGJvb2xDbXAoZGF0YShlbGUsIGZpZWxkKSwgb3BlcmF0b3IpO1xufTtcblxubWF0Y2hbVHlwZS5EQVRBX0VYSVNUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgcmV0dXJuIGV4aXN0Q21wKGRhdGEoZWxlLCBmaWVsZCkpO1xufTtcblxubWF0Y2hbVHlwZS5VTkRJUkVDVEVEX0VER0VdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIHFBID0gY2hlY2subm9kZXNbMF07XG4gIHZhciBxQiA9IGNoZWNrLm5vZGVzWzFdO1xuICB2YXIgc3JjID0gZWxlLnNvdXJjZSgpO1xuICB2YXIgdGd0ID0gZWxlLnRhcmdldCgpO1xuICByZXR1cm4gbWF0Y2hlcyhxQSwgc3JjKSAmJiBtYXRjaGVzKHFCLCB0Z3QpIHx8IG1hdGNoZXMocUIsIHNyYykgJiYgbWF0Y2hlcyhxQSwgdGd0KTtcbn07XG5cbm1hdGNoW1R5cGUuTk9ERV9ORUlHSEJPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyhjaGVjay5ub2RlLCBlbGUpICYmIGVsZS5uZWlnaGJvcmhvb2QoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyhjaGVjay5uZWlnaGJvciwgbik7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzKGNoZWNrLnNvdXJjZSwgZWxlLnNvdXJjZSgpKSAmJiBtYXRjaGVzKGNoZWNrLnRhcmdldCwgZWxlLnRhcmdldCgpKTtcbn07XG5cbm1hdGNoW1R5cGUuTk9ERV9TT1VSQ0VdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMoY2hlY2suc291cmNlLCBlbGUpICYmIGVsZS5vdXRnb2VycygpLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5pc05vZGUoKSAmJiBtYXRjaGVzKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5OT0RFX1RBUkdFVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyhjaGVjay50YXJnZXQsIGVsZSkgJiYgZWxlLmluY29tZXJzKCkuc29tZShmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzTm9kZSgpICYmIG1hdGNoZXMoY2hlY2suc291cmNlLCBuKTtcbiAgfSk7XG59O1xuXG5tYXRjaFtUeXBlLkNISUxEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzKGNoZWNrLmNoaWxkLCBlbGUpICYmIG1hdGNoZXMoY2hlY2sucGFyZW50LCBlbGUucGFyZW50KCkpO1xufTtcblxubWF0Y2hbVHlwZS5QQVJFTlRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMoY2hlY2sucGFyZW50LCBlbGUpICYmIGVsZS5jaGlsZHJlbigpLnNvbWUoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyhjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5ERVNDRU5EQU5UXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzKGNoZWNrLmRlc2NlbmRhbnQsIGVsZSkgJiYgZWxlLmFuY2VzdG9ycygpLnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyhjaGVjay5hbmNlc3RvciwgYSk7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5BTkNFU1RPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyhjaGVjay5hbmNlc3RvciwgZWxlKSAmJiBlbGUuZGVzY2VuZGFudHMoKS5zb21lKGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMoY2hlY2suZGVzY2VuZGFudCwgZCk7XG4gIH0pO1xufTtcblxubWF0Y2hbVHlwZS5DT01QT1VORF9TUExJVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyhjaGVjay5zdWJqZWN0LCBlbGUpICYmIG1hdGNoZXMoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzKGNoZWNrLnJpZ2h0LCBlbGUpO1xufTtcblxubWF0Y2hbVHlwZS5UUlVFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5tYXRjaFtUeXBlLkNPTExFQ1RJT05dID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNvbGxlY3Rpb24gPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzKGVsZSk7XG59O1xuXG5tYXRjaFtUeXBlLkZJTFRFUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmlsdGVyID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBmaWx0ZXIoZWxlKTtcbn07XG5cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7IC8vIGZvciAxIGlkICNmb28gcXVlcmllcywganVzdCBnZXQgdGhlIGVsZW1lbnRcblxuICBpZiAoc2VsZi5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3MubGVuZ3RoID09PSAxICYmIHNlbGZbMF0uY2hlY2tzWzBdLnR5cGUgPT09IFR5cGUuSUQpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRFbGVtZW50QnlJZChzZWxmWzBdLmNoZWNrc1swXS52YWx1ZSkuY29sbGVjdGlvbigpO1xuICB9XG5cbiAgdmFyIHNlbGVjdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiBzZWxlY3RvckZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBxdWVyeSA9IHNlbGZbal07XG5cbiAgICAgIGlmIChtYXRjaGVzKHF1ZXJ5LCBlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgaWYgKHNlbGYudGV4dCgpID09IG51bGwpIHtcbiAgICBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoc2VsZWN0b3JGdW5jdGlvbik7XG59OyAvLyBmaWx0ZXJcbi8vIGRvZXMgc2VsZWN0b3IgbWF0Y2ggYSBzaW5nbGUgZWxlbWVudD9cblxuXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyQxKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gc2VsZltqXTtcblxuICAgIGlmIChtYXRjaGVzKHF1ZXJ5LCBlbGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBtYXRjaGVzXG5cblxudmFyIG1hdGNoaW5nID0ge1xuICBtYXRjaGVzOiBtYXRjaGVzJDEsXG4gIGZpbHRlcjogZmlsdGVyXG59O1xuXG52YXIgU2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB0aGlzLmlucHV0VGV4dCA9IHNlbGVjdG9yO1xuICB0aGlzLmN1cnJlbnRTdWJqZWN0ID0gbnVsbDtcbiAgdGhpcy5jb21wb3VuZENvdW50ID0gMDtcbiAgdGhpcy5lZGdlQ291bnQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuKHNlbGVjdG9yKSkge1xuICAgIHRoaXMuYWRkUXVlcnkoe1xuICAgICAgY2hlY2tzOiBbe1xuICAgICAgICB0eXBlOiBUeXBlLkZJTFRFUixcbiAgICAgICAgdmFsdWU6IHNlbGVjdG9yXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHN0cmluZyhzZWxlY3RvcikpIHtcbiAgICBpZiAoIXRoaXMucGFyc2Uoc2VsZWN0b3IpKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlcnJvcignQSBzZWxlY3RvciBtdXN0IGJlIGNyZWF0ZWQgZnJvbSBhIHN0cmluZzsgZm91bmQgJyk7XG4gIH1cbn07XG5cbnZhciBzZWxmbiA9IFNlbGVjdG9yLnByb3RvdHlwZTtcbltwYXJzZSQxLCBtYXRjaGluZ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICByZXR1cm4gZXh0ZW5kKHNlbGZuLCBwKTtcbn0pO1xuXG5zZWxmbi50ZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5pbnB1dFRleHQ7XG59O1xuXG5zZWxmbi5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5zZWxmbi5lcSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiB0aGlzW2ldO1xufTtcblxuc2VsZm4uc2FtZVRleHQgPSBmdW5jdGlvbiAob3RoZXJTZWwpIHtcbiAgcmV0dXJuICF0aGlzLmludmFsaWQgJiYgIW90aGVyU2VsLmludmFsaWQgJiYgdGhpcy50ZXh0KCkgPT09IG90aGVyU2VsLnRleHQoKTtcbn07XG5cbnNlbGZuLmFkZFF1ZXJ5ID0gZnVuY3Rpb24gKHEpIHtcbiAgdGhpc1t0aGlzLmxlbmd0aCsrXSA9IHE7XG59O1xuXG5zZWxmbi5zZWxlY3RvciA9IHNlbGZuLnRvU3RyaW5nO1xuXG52YXIgZWxlc2ZuJGYgPSB7XG4gIGFsbEFyZTogZnVuY3Rpb24gYWxsQXJlKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIGlzOiBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBzZWxPYmogPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcblxuICAgICAgaWYgKHJldCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShmbiwgdGhpc0FyZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJldCA9ICF0aGlzQXJnID8gZm4odGhpc1tpXSwgaSwgdGhpcykgOiBmbi5hcHBseSh0aGlzQXJnLCBbdGhpc1tpXSwgaSwgdGhpc10pO1xuXG4gICAgICBpZiAoIXJldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHNhbWU6IGZ1bmN0aW9uIHNhbWUoY29sbGVjdGlvbikge1xuICAgIC8vIGNoZWFwIGNvbGxlY3Rpb24gcmVmIGNoZWNrXG4gICAgaWYgKHRoaXMgPT09IGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgdGhpc0xlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciBjb2xsZWN0aW9uTGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7IC8vIGNoZWFwIGxlbmd0aCBjaGVja1xuXG4gICAgaWYgKHRoaXNMZW5ndGggIT09IGNvbGxlY3Rpb25MZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNoZWFwIGVsZW1lbnQgcmVmIGNoZWNrXG5cblxuICAgIGlmICh0aGlzTGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpc1swXSA9PT0gY29sbGVjdGlvblswXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ldmVyeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYW55U2FtZTogZnVuY3Rpb24gYW55U2FtZShjb2xsZWN0aW9uKSB7XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzRWxlbWVudFdpdGhJZChlbGUuaWQoKSk7XG4gICAgfSk7XG4gIH0sXG4gIGFsbEFyZU5laWdoYm9yczogZnVuY3Rpb24gYWxsQXJlTmVpZ2hib3JzKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIG5ob29kID0gdGhpcy5uZWlnaGJvcmhvb2QoKTtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5ldmVyeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gbmhvb2QuaGFzRWxlbWVudFdpdGhJZChlbGUuaWQoKSk7XG4gICAgfSk7XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbiBjb250YWlucyhjb2xsZWN0aW9uKSB7XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gY29sbGVjdGlvbi5ldmVyeShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gc2VsZi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfVxufTtcbmVsZXNmbiRmLmFsbEFyZU5laWdoYm91cnMgPSBlbGVzZm4kZi5hbGxBcmVOZWlnaGJvcnM7XG5lbGVzZm4kZi5oYXMgPSBlbGVzZm4kZi5jb250YWlucztcbmVsZXNmbiRmLmVxdWFsID0gZWxlc2ZuJGYuZXF1YWxzID0gZWxlc2ZuJGYuc2FtZTtcblxudmFyIGNhY2hlID0gZnVuY3Rpb24gY2FjaGUoZm4sIG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyYXZlcnNhbENhY2hlKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpIHtcbiAgICB2YXIgc2VsZWN0b3JPckVsZXMgPSBhcmcxO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIga2V5O1xuXG4gICAgaWYgKHNlbGVjdG9yT3JFbGVzID09IG51bGwpIHtcbiAgICAgIGtleSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3Rvck9yRWxlcykgJiYgc2VsZWN0b3JPckVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBrZXkgPSBzZWxlY3Rvck9yRWxlcy5pZCgpO1xuICAgIH1cblxuICAgIGlmIChlbGVzLmxlbmd0aCA9PT0gMSAmJiBrZXkpIHtcbiAgICAgIHZhciBfcCA9IGVsZXNbMF0uX3ByaXZhdGU7XG4gICAgICB2YXIgdGNoID0gX3AudHJhdmVyc2FsQ2FjaGUgPSBfcC50cmF2ZXJzYWxDYWNoZSB8fCB7fTtcbiAgICAgIHZhciBjaCA9IHRjaFtuYW1lXSA9IHRjaFtuYW1lXSB8fCBbXTtcbiAgICAgIHZhciBoYXNoID0gaGFzaFN0cmluZyhrZXkpO1xuICAgICAgdmFyIGNhY2hlSGl0ID0gY2hbaGFzaF07XG5cbiAgICAgIGlmIChjYWNoZUhpdCkge1xuICAgICAgICByZXR1cm4gY2FjaGVIaXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2hbaGFzaF0gPSBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4uY2FsbChlbGVzLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTtcbiAgICB9XG4gIH07XG59O1xuXG52YXIgZWxlc2ZuJGcgPSB7XG4gIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBbXTsgLy8gb3B0aW1pc2F0aW9uIGZvciBzaW5nbGUgZWxlIGNhbGxcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXNbMF0uX3ByaXZhdGUucGFyZW50O1xuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcblxuICAgICAgaWYgKF9wYXJlbnQpIHtcbiAgICAgICAgcGFyZW50cy5wdXNoKF9wYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKHBhcmVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIHBhcmVudHM6IGZ1bmN0aW9uIHBhcmVudHMoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcy5wYXJlbnQoKTtcblxuICAgIHdoaWxlIChlbGVzLm5vbmVtcHR5KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgcGFyZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG5cbiAgICAgIGVsZXMgPSBlbGVzLnBhcmVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKHBhcmVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGNvbW1vbkFuY2VzdG9yczogZnVuY3Rpb24gY29tbW9uQW5jZXN0b3JzKHNlbGVjdG9yKSB7XG4gICAgdmFyIGFuY2VzdG9ycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgcGFyZW50cyA9IGVsZS5wYXJlbnRzKCk7XG4gICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMgfHwgcGFyZW50cztcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5pbnRlcnNlY3QocGFyZW50cyk7IC8vIGN1cnJlbnQgbGlzdCBtdXN0IGJlIGNvbW1vbiB3aXRoIGN1cnJlbnQgZWxlIHBhcmVudHMgc2V0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ycy5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBvcnBoYW5zOiBmdW5jdGlvbiBvcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBub25vcnBoYW5zOiBmdW5jdGlvbiBub25vcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGNoaWxkcmVuOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgZWxlQ2hpbGRyZW4gPSBlbGUuX3ByaXZhdGUuY2hpbGRyZW47XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVDaGlsZHJlbltqXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oY2hpbGRyZW4sIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjaGlsZHJlbicpLFxuICBzaWJsaW5nczogZnVuY3Rpb24gc2libGluZ3Moc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpLm5vdCh0aGlzKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBpc1BhcmVudDogZnVuY3Rpb24gaXNQYXJlbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5jaGlsZHJlbi5sZW5ndGggIT09IDA7XG4gICAgfVxuICB9LFxuICBpc0NoaWxkbGVzczogZnVuY3Rpb24gaXNDaGlsZGxlc3MoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9LFxuICBpc0NoaWxkOiBmdW5jdGlvbiBpc0NoaWxkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUucGFyZW50ICE9IG51bGw7XG4gICAgfVxuICB9LFxuICBpc09ycGhhbjogZnVuY3Rpb24gaXNPcnBoYW4oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5fcHJpdmF0ZS5wYXJlbnQgPT0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGRlc2NlbmRhbnRzOiBmdW5jdGlvbiBkZXNjZW5kYW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gYWRkKGVsZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuXG4gICAgICAgIGlmIChlbGUuY2hpbGRyZW4oKS5ub25lbXB0eSgpKSB7XG4gICAgICAgICAgYWRkKGVsZS5jaGlsZHJlbigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFkZCh0aGlzLmNoaWxkcmVuKCkpO1xuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmb3JFYWNoQ29tcG91bmQoZWxlcywgZm4sIGluY2x1ZGVTZWxmLCByZWN1cnNpdmVTdGVwKSB7XG4gIHZhciBxID0gW107XG4gIHZhciBkaWQgPSBuZXcgU2V0JDEoKTtcbiAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuXG4gICAgaWYgKGluY2x1ZGVTZWxmKSB7XG4gICAgICBxLnB1c2goZWxlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgcmVjdXJzaXZlU3RlcChxLCBkaWQsIGVsZSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHEubGVuZ3RoID4gMCkge1xuICAgIHZhciBfZWxlID0gcS5zaGlmdCgpO1xuXG4gICAgZm4oX2VsZSk7XG4gICAgZGlkLmFkZChfZWxlLmlkKCkpO1xuXG4gICAgaWYgKGhhc0NvbXBvdW5kcykge1xuICAgICAgcmVjdXJzaXZlU3RlcChxLCBkaWQsIF9lbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVzO1xufVxuXG5mdW5jdGlvbiBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUuX3ByaXZhdGUuY2hpbGRyZW47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKCFkaWQuaGFzKGNoaWxkLmlkKCkpKSB7XG4gICAgICAgIHEucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIHZlcnkgZWZmaWNpZW50IHZlcnNpb24gb2YgZWxlcy5hZGQoIGVsZXMuZGVzY2VuZGFudHMoKSApLmZvckVhY2goKVxuLy8gZm9yIGludGVybmFsIHVzZVxuXG5cbmVsZXNmbiRnLmZvckVhY2hEb3duID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZENoaWxkcmVuKTtcbn07XG5cbmZ1bmN0aW9uIGFkZFBhcmVudChxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzQ2hpbGQoKSkge1xuICAgIHZhciBwYXJlbnQgPSBlbGUuX3ByaXZhdGUucGFyZW50O1xuXG4gICAgaWYgKCFkaWQuaGFzKHBhcmVudC5pZCgpKSkge1xuICAgICAgcS5wdXNoKHBhcmVudCk7XG4gICAgfVxuICB9XG59XG5cbmVsZXNmbiRnLmZvckVhY2hVcCA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRQYXJlbnQpO1xufTtcblxuZnVuY3Rpb24gYWRkUGFyZW50QW5kQ2hpbGRyZW4ocSwgZGlkLCBlbGUpIHtcbiAgYWRkUGFyZW50KHEsIGRpZCwgZWxlKTtcbiAgYWRkQ2hpbGRyZW4ocSwgZGlkLCBlbGUpO1xufVxuXG5lbGVzZm4kZy5mb3JFYWNoVXBBbmREb3duID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudEFuZENoaWxkcmVuKTtcbn07IC8vIGFsaWFzZXNcblxuXG5lbGVzZm4kZy5hbmNlc3RvcnMgPSBlbGVzZm4kZy5wYXJlbnRzO1xuXG52YXIgZm4kMSwgZWxlc2ZuJGg7XG5mbiQxID0gZWxlc2ZuJGggPSB7XG4gIGRhdGE6IGRlZmluZSQzLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUkMy5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGV2ZW50OiAnZGF0YScsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICBpbW11dGFibGVLZXlzOiB7XG4gICAgICAnaWQnOiB0cnVlLFxuICAgICAgJ3NvdXJjZSc6IHRydWUsXG4gICAgICAndGFyZ2V0JzogdHJ1ZSxcbiAgICAgICdwYXJlbnQnOiB0cnVlXG4gICAgfSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgc2NyYXRjaDogZGVmaW5lJDMuZGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZVNjcmF0Y2g6IGRlZmluZSQzLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByc2NyYXRjaDogZGVmaW5lJDMuZGF0YSh7XG4gICAgZmllbGQ6ICdyc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IGZhbHNlLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlUnNjcmF0Y2g6IGRlZmluZSQzLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIHRyaWdnZXJFdmVudDogZmFsc2VcbiAgfSksXG4gIGlkOiBmdW5jdGlvbiBpZCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICB9XG4gIH1cbn07IC8vIGFsaWFzZXNcblxuZm4kMS5hdHRyID0gZm4kMS5kYXRhO1xuZm4kMS5yZW1vdmVBdHRyID0gZm4kMS5yZW1vdmVEYXRhO1xudmFyIGRhdGEkMSA9IGVsZXNmbiRoO1xuXG52YXIgZWxlc2ZuJGkgPSB7fTtcblxuZnVuY3Rpb24gZGVmaW5lRGVncmVlRnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoaW5jbHVkZUxvb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGluY2x1ZGVMb29wcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuaXNOb2RlKCkgJiYgIXNlbGYucmVtb3ZlZCgpKSB7XG4gICAgICB2YXIgZGVncmVlID0gMDtcbiAgICAgIHZhciBub2RlID0gc2VsZlswXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcblxuICAgICAgICBpZiAoIWluY2x1ZGVMb29wcyAmJiBlZGdlLmlzTG9vcCgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBkZWdyZWUgKz0gY2FsbGJhY2sobm9kZSwgZWRnZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWdyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG59XG5cbmV4dGVuZChlbGVzZm4kaSwge1xuICBkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShlZGdlLnRhcmdldCgpKSkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSksXG4gIGluZGVncmVlOiBkZWZpbmVEZWdyZWVGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgZWRnZSkge1xuICAgIGlmIChlZGdlLnRhcmdldCgpLnNhbWUobm9kZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0pLFxuICBvdXRkZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2Uuc291cmNlKCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSlcbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbihkZWdyZWVGbiwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgcmV0O1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBkZWdyZWUgPSBlbGVbZGVncmVlRm5dKGluY2x1ZGVMb29wcyk7XG5cbiAgICAgIGlmIChkZWdyZWUgIT09IHVuZGVmaW5lZCAmJiAocmV0ID09PSB1bmRlZmluZWQgfHwgY2FsbGJhY2soZGVncmVlLCByZXQpKSkge1xuICAgICAgICByZXQgPSBkZWdyZWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbn1cblxuZXh0ZW5kKGVsZXNmbiRpLCB7XG4gIG1pbkRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2RlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhEZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KSxcbiAgbWluSW5kZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdpbmRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhJbmRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ2luZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSksXG4gIG1pbk91dGRlZ3JlZTogZGVmaW5lRGVncmVlQm91bmRzRnVuY3Rpb24oJ291dGRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1pbikge1xuICAgIHJldHVybiBkZWdyZWUgPCBtaW47XG4gIH0pLFxuICBtYXhPdXRkZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdvdXRkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtYXgpIHtcbiAgICByZXR1cm4gZGVncmVlID4gbWF4O1xuICB9KVxufSk7XG5leHRlbmQoZWxlc2ZuJGksIHtcbiAgdG90YWxEZWdyZWU6IGZ1bmN0aW9uIHRvdGFsRGVncmVlKGluY2x1ZGVMb29wcykge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG90YWwgKz0gbm9kZXNbaV0uZGVncmVlKGluY2x1ZGVMb29wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG59KTtcblxudmFyIGZuJDIsIGVsZXNmbiRqO1xuXG52YXIgYmVmb3JlUG9zaXRpb25TZXQgPSBmdW5jdGlvbiBiZWZvcmVQb3NpdGlvblNldChlbGVzLCBuZXdQb3MsIHNpbGVudCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcblxuICAgIGlmICghZWxlLmxvY2tlZCgpKSB7XG4gICAgICB2YXIgb2xkUG9zID0gZWxlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICB4OiBuZXdQb3MueCAhPSBudWxsID8gbmV3UG9zLnggLSBvbGRQb3MueCA6IDAsXG4gICAgICAgIHk6IG5ld1Bvcy55ICE9IG51bGwgPyBuZXdQb3MueSAtIG9sZFBvcy55IDogMFxuICAgICAgfTtcblxuICAgICAgaWYgKGVsZS5pc1BhcmVudCgpICYmICEoZGVsdGEueCA9PT0gMCAmJiBkZWx0YS55ID09PSAwKSkge1xuICAgICAgICBlbGUuY2hpbGRyZW4oKS5zaGlmdChkZWx0YSwgc2lsZW50KTtcbiAgICAgIH1cblxuICAgICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHBvc2l0aW9uRGVmID0ge1xuICBmaWVsZDogJ3Bvc2l0aW9uJyxcbiAgYmluZGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgc2V0dGluZ0V2ZW50OiAncG9zaXRpb24nLFxuICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgdHJpZ2dlckZuTmFtZTogJ2VtaXRBbmROb3RpZnknLFxuICBhbGxvd0dldHRpbmc6IHRydWUsXG4gIHZhbGlkS2V5czogWyd4JywgJ3knXSxcbiAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoZWxlKSB7XG4gICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG4gIH0sXG4gIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgZmFsc2UpO1xuICB9LFxuICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgIGVsZXMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gIH0sXG4gIGNhblNldDogZnVuY3Rpb24gY2FuU2V0KGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59O1xuZm4kMiA9IGVsZXNmbiRqID0ge1xuICBwb3NpdGlvbjogZGVmaW5lJDMuZGF0YShwb3NpdGlvbkRlZiksXG4gIC8vIHBvc2l0aW9uIGJ1dCBubyBub3RpZmljYXRpb24gdG8gcmVuZGVyZXJcbiAgc2lsZW50UG9zaXRpb246IGRlZmluZSQzLmRhdGEoZXh0ZW5kKHt9LCBwb3NpdGlvbkRlZiwge1xuICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICBhbGxvd0dldHRpbmc6IGZhbHNlLFxuICAgIGJlZm9yZVNldDogZnVuY3Rpb24gYmVmb3JlU2V0KGVsZXMsIG5ld1Bvcykge1xuICAgICAgYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCB0cnVlKTtcbiAgICB9LFxuICAgIG9uU2V0OiBmdW5jdGlvbiBvblNldChlbGVzKSB7XG4gICAgICBlbGVzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIH1cbiAgfSkpLFxuICBwb3NpdGlvbnM6IGZ1bmN0aW9uIHBvc2l0aW9ucyhwb3MsIHNpbGVudCkge1xuICAgIGlmIChwbGFpbk9iamVjdChwb3MpKSB7XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHRoaXMuc2lsZW50UG9zaXRpb24ocG9zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24ocG9zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZuKHBvcykpIHtcbiAgICAgIHZhciBfZm4gPSBwb3M7XG4gICAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcblxuICAgICAgICB2YXIgX3BvcyA9IHZvaWQgMDtcblxuICAgICAgICBpZiAoX3BvcyA9IF9mbihlbGUsIGkpKSB7XG4gICAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oX3Bvcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHNpbGVudFBvc2l0aW9uczogZnVuY3Rpb24gc2lsZW50UG9zaXRpb25zKHBvcykge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9ucyhwb3MsIHRydWUpO1xuICB9LFxuICBzaGlmdDogZnVuY3Rpb24gc2hpZnQoZGltLCB2YWwsIHNpbGVudCkge1xuICAgIHZhciBkZWx0YTtcblxuICAgIGlmIChwbGFpbk9iamVjdChkaW0pKSB7XG4gICAgICBkZWx0YSA9IHtcbiAgICAgICAgeDogbnVtYmVyKGRpbS54KSA/IGRpbS54IDogMCxcbiAgICAgICAgeTogbnVtYmVyKGRpbS55KSA/IGRpbS55IDogMFxuICAgICAgfTtcbiAgICAgIHNpbGVudCA9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhkaW0pICYmIG51bWJlcih2YWwpKSB7XG4gICAgICBkZWx0YSA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfTtcbiAgICAgIGRlbHRhW2RpbV0gPSB2YWw7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhICE9IG51bGwpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBuZXdQb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggKyBkZWx0YS54LFxuICAgICAgICAgIHk6IHBvcy55ICsgZGVsdGEueVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICBlbGUuc2lsZW50UG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGUucG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBzaWxlbnRTaGlmdDogZnVuY3Rpb24gc2lsZW50U2hpZnQoZGltLCB2YWwpIHtcbiAgICBpZiAocGxhaW5PYmplY3QoZGltKSkge1xuICAgICAgdGhpcy5zaGlmdChkaW0sIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKGRpbSkgJiYgbnVtYmVyKHZhbCkpIHtcbiAgICAgIHRoaXMuc2hpZnQoZGltLCB2YWwsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBnZXQvc2V0IHRoZSByZW5kZXJlZCAoaS5lLiBvbiBzY3JlZW4pIHBvc2l0b24gb2YgdGhlIGVsZW1lbnRcbiAgcmVuZGVyZWRQb3NpdGlvbjogZnVuY3Rpb24gcmVuZGVyZWRQb3NpdGlvbihkaW0sIHZhbCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHJwb3MgPSBwbGFpbk9iamVjdChkaW0pID8gZGltIDogdW5kZWZpbmVkO1xuICAgIHZhciBzZXR0aW5nID0gcnBvcyAhPT0gdW5kZWZpbmVkIHx8IHZhbCAhPT0gdW5kZWZpbmVkICYmIHN0cmluZyhkaW0pO1xuXG4gICAgaWYgKGVsZSAmJiBlbGUuaXNOb2RlKCkpIHtcbiAgICAgIC8vIG11c3QgaGF2ZSBhbiBlbGVtZW50IGFuZCBtdXN0IGJlIGEgbm9kZSB0byByZXR1cm4gcG9zaXRpb25cbiAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBfZWxlID0gdGhpc1tpXTtcblxuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IG9uZSBkaW1lbnNpb25cbiAgICAgICAgICAgIF9lbGUucG9zaXRpb24oZGltLCAodmFsIC0gcGFuW2RpbV0pIC8gem9vbSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChycG9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCB3aG9sZSBwb3NpdGlvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihyZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihycG9zLCB6b29tLCBwYW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldHRpbmdcbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICBycG9zID0gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocG9zLCB6b29tLCBwYW4pO1xuXG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBycG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHJwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgLy8gZ2V0L3NldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudFxuICByZWxhdGl2ZVBvc2l0aW9uOiBmdW5jdGlvbiByZWxhdGl2ZVBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBwcG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHBwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcblxuICAgIGlmIChlbGUgJiYgZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBtdXN0IGhhdmUgYW4gZWxlbWVudCBhbmQgbXVzdCBiZSBhIG5vZGUgdG8gcmV0dXJuIHBvc2l0aW9uXG4gICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2VsZTIgPSB0aGlzW2ldO1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gX2VsZTIucGFyZW50KCkgOiBudWxsO1xuICAgICAgICAgIHZhciBoYXNQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgdmFyIHJlbGF0aXZlVG9QYXJlbnQgPSBoYXNQYXJlbnQ7XG5cbiAgICAgICAgICBpZiAoaGFzUGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRbMF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG9yaWdpbiA9IHJlbGF0aXZlVG9QYXJlbnQgPyBwYXJlbnQucG9zaXRpb24oKSA6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IG9uZSBkaW1lbnNpb25cbiAgICAgICAgICAgIF9lbGUyLnBvc2l0aW9uKGRpbSwgdmFsICsgb3JpZ2luW2RpbV0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBzZXQgd2hvbGUgcG9zaXRpb25cbiAgICAgICAgICAgIF9lbGUyLnBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgeDogcHBvcy54ICsgb3JpZ2luLngsXG4gICAgICAgICAgICAgIHk6IHBwb3MueSArIG9yaWdpbi55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldHRpbmdcbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuXG4gICAgICAgIHZhciBfcGFyZW50ID0gaGFzQ29tcG91bmROb2RlcyA/IGVsZS5wYXJlbnQoKSA6IG51bGw7XG5cbiAgICAgICAgdmFyIF9oYXNQYXJlbnQgPSBfcGFyZW50ICYmIF9wYXJlbnQubGVuZ3RoID4gMDtcblxuICAgICAgICB2YXIgX3JlbGF0aXZlVG9QYXJlbnQgPSBfaGFzUGFyZW50O1xuXG4gICAgICAgIGlmIChfaGFzUGFyZW50KSB7XG4gICAgICAgICAgX3BhcmVudCA9IF9wYXJlbnRbMF07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX29yaWdpbiA9IF9yZWxhdGl2ZVRvUGFyZW50ID8gX3BhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuXG4gICAgICAgIHBwb3MgPSB7XG4gICAgICAgICAgeDogcG9zLnggLSBfb3JpZ2luLngsXG4gICAgICAgICAgeTogcG9zLnkgLSBfb3JpZ2luLnlcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGltID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgd2hvbGUgcmVuZGVyZWQgcG9zaXRpb25cbiAgICAgICAgICByZXR1cm4gcHBvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvblxuICAgICAgICAgIHJldHVybiBwcG9zW2RpbV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzZXR0aW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBmb3IgZW1wdHkgY29sbGVjdGlvbiBjYXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH1cbn07IC8vIGFsaWFzZXNcblxuZm4kMi5tb2RlbFBvc2l0aW9uID0gZm4kMi5wb2ludCA9IGZuJDIucG9zaXRpb247XG5mbiQyLm1vZGVsUG9zaXRpb25zID0gZm4kMi5wb2ludHMgPSBmbiQyLnBvc2l0aW9ucztcbmZuJDIucmVuZGVyZWRQb2ludCA9IGZuJDIucmVuZGVyZWRQb3NpdGlvbjtcbmZuJDIucmVsYXRpdmVQb2ludCA9IGZuJDIucmVsYXRpdmVQb3NpdGlvbjtcbnZhciBwb3NpdGlvbiA9IGVsZXNmbiRqO1xuXG52YXIgZm4kMywgZWxlc2ZuJGs7XG5mbiQzID0gZWxlc2ZuJGsgPSB7fTtcblxuZWxlc2ZuJGsucmVuZGVyZWRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBiYiA9IHRoaXMuYm91bmRpbmdCb3gob3B0aW9ucyk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIHgxID0gYmIueDEgKiB6b29tICsgcGFuLng7XG4gIHZhciB4MiA9IGJiLngyICogem9vbSArIHBhbi54O1xuICB2YXIgeTEgPSBiYi55MSAqIHpvb20gKyBwYW4ueTtcbiAgdmFyIHkyID0gYmIueTIgKiB6b29tICsgcGFuLnk7XG4gIHJldHVybiB7XG4gICAgeDE6IHgxLFxuICAgIHgyOiB4MixcbiAgICB5MTogeTEsXG4gICAgeTI6IHkyLFxuICAgIHc6IHgyIC0geDEsXG4gICAgaDogeTIgLSB5MVxuICB9O1xufTtcblxuZWxlc2ZuJGsuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2lsZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gIGlmICghY3kuc3R5bGVFbmFibGVkKCkgfHwgIWN5Lmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5mb3JFYWNoVXAoZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AuY29tcG91bmRCb3VuZHNDbGVhbiA9IGZhbHNlO1xuICAgICAgX3AuYmJDYWNoZSA9IG51bGw7XG5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGVsZS5lbWl0QW5kTm90aWZ5KCdib3VuZHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmVsZXNmbiRrLnVwZGF0ZUNvbXBvdW5kQm91bmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7IC8vIG5vdCBwb3NzaWJsZSB0byBkbyBvbiBub24tY29tcG91bmQgZ3JhcGhzIG9yIHdpdGggdGhlIHN0eWxlIGRpc2FibGVkXG5cbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBiYXRjaGluZyAtLSBidXQgYm91bmRzIHdpbGwgYmUgc3RhbGUgKG9yIG5vdCBleGlzdCB5ZXQpXG5cblxuICBpZiAoIWZvcmNlICYmIGN5LmJhdGNoaW5nKCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYXJlbnQpIHtcbiAgICBpZiAoIXBhcmVudC5pc1BhcmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIF9wID0gcGFyZW50Ll9wcml2YXRlO1xuICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbigpO1xuICAgIHZhciBpbmNsdWRlTGFiZWxzID0gcGFyZW50LnBzdHlsZSgnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnKS52YWx1ZSA9PT0gJ2luY2x1ZGUnO1xuICAgIHZhciBtaW4gPSB7XG4gICAgICB3aWR0aDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGxlZnQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLWxlZnQnKSxcbiAgICAgICAgcmlnaHQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLXJpZ2h0JylcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdmFsOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0JykucGZWYWx1ZSxcbiAgICAgICAgdG9wOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtdG9wJyksXG4gICAgICAgIGJvdHRvbTogcGFyZW50LnBzdHlsZSgnbWluLWhlaWdodC1iaWFzLWJvdHRvbScpXG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgYmIgPSBjaGlsZHJlbi5ib3VuZGluZ0JveCh7XG4gICAgICBpbmNsdWRlTGFiZWxzOiBpbmNsdWRlTGFiZWxzLFxuICAgICAgaW5jbHVkZU92ZXJsYXlzOiBmYWxzZSxcbiAgICAgIC8vIHVwZGF0aW5nIHRoZSBjb21wb3VuZCBib3VuZHMgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSByZWd1bGFyXG4gICAgICAvLyBjYWNoZSBjeWNsZSAoaS5lLiBiZWZvcmUgZmlyZWQgZXZlbnRzKVxuICAgICAgdXNlQ2FjaGU6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIHBvcyA9IF9wLnBvc2l0aW9uOyAvLyBpZiBjaGlsZHJlbiB0YWtlIHVwIHplcm8gYXJlYSB0aGVuIGtlZXAgcG9zaXRpb24gYW5kIGZhbGwgYmFjayBvbiBzdHlsZXNoZWV0IHcvaFxuXG4gICAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgICAgYmIgPSB7XG4gICAgICAgIHc6IHBhcmVudC5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSxcbiAgICAgICAgaDogcGFyZW50LnBzdHlsZSgnaGVpZ2h0JykucGZWYWx1ZVxuICAgICAgfTtcbiAgICAgIGJiLngxID0gcG9zLnggLSBiYi53IC8gMjtcbiAgICAgIGJiLngyID0gcG9zLnggKyBiYi53IC8gMjtcbiAgICAgIGJiLnkxID0gcG9zLnkgLSBiYi5oIC8gMjtcbiAgICAgIGJiLnkyID0gcG9zLnkgKyBiYi5oIC8gMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlQmlhc1ZhbHVlcyhwcm9wRGlmZiwgcHJvcEJpYXMsIHByb3BCaWFzQ29tcGxlbWVudCkge1xuICAgICAgdmFyIGJpYXNEaWZmID0gMDtcbiAgICAgIHZhciBiaWFzQ29tcGxlbWVudERpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNUb3RhbCA9IHByb3BCaWFzICsgcHJvcEJpYXNDb21wbGVtZW50O1xuXG4gICAgICBpZiAocHJvcERpZmYgPiAwICYmIGJpYXNUb3RhbCA+IDApIHtcbiAgICAgICAgYmlhc0RpZmYgPSBwcm9wQmlhcyAvIGJpYXNUb3RhbCAqIHByb3BEaWZmO1xuICAgICAgICBiaWFzQ29tcGxlbWVudERpZmYgPSBwcm9wQmlhc0NvbXBsZW1lbnQgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmlhc0RpZmY6IGJpYXNEaWZmLFxuICAgICAgICBiaWFzQ29tcGxlbWVudERpZmY6IGJpYXNDb21wbGVtZW50RGlmZlxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlUGFkZGluZ1ZhbHVlcyh3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nT2JqZWN0LCByZWxhdGl2ZVRvKSB7XG4gICAgICAvLyBBc3N1bWluZyBwZXJjZW50YWdlIGlzIG51bWJlciBmcm9tIDAgdG8gMVxuICAgICAgaWYgKHBhZGRpbmdPYmplY3QudW5pdHMgPT09ICclJykge1xuICAgICAgICBzd2l0Y2ggKHJlbGF0aXZlVG8pIHtcbiAgICAgICAgICBjYXNlICd3aWR0aCc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuXG4gICAgICAgICAgY2FzZSAnaGVpZ2h0JzpcbiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcblxuICAgICAgICAgIGNhc2UgJ2F2ZXJhZ2UnOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogKHdpZHRoICsgaGVpZ2h0KSAvIDIgOiAwO1xuXG4gICAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuXG4gICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiBoZWlnaHQgOiAwO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhZGRpbmdPYmplY3QudW5pdHMgPT09ICdweCcpIHtcbiAgICAgICAgcmV0dXJuIHBhZGRpbmdPYmplY3QucGZWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsZWZ0VmFsID0gbWluLndpZHRoLmxlZnQudmFsdWU7XG5cbiAgICBpZiAobWluLndpZHRoLmxlZnQudW5pdHMgPT09ICdweCcgJiYgbWluLndpZHRoLnZhbCA+IDApIHtcbiAgICAgIGxlZnRWYWwgPSBsZWZ0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG5cbiAgICB2YXIgcmlnaHRWYWwgPSBtaW4ud2lkdGgucmlnaHQudmFsdWU7XG5cbiAgICBpZiAobWluLndpZHRoLnJpZ2h0LnVuaXRzID09PSAncHgnICYmIG1pbi53aWR0aC52YWwgPiAwKSB7XG4gICAgICByaWdodFZhbCA9IHJpZ2h0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG5cbiAgICB2YXIgdG9wVmFsID0gbWluLmhlaWdodC50b3AudmFsdWU7XG5cbiAgICBpZiAobWluLmhlaWdodC50b3AudW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICB0b3BWYWwgPSB0b3BWYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG5cbiAgICB2YXIgYm90dG9tVmFsID0gbWluLmhlaWdodC5ib3R0b20udmFsdWU7XG5cbiAgICBpZiAobWluLmhlaWdodC5ib3R0b20udW5pdHMgPT09ICdweCcgJiYgbWluLmhlaWdodC52YWwgPiAwKSB7XG4gICAgICBib3R0b21WYWwgPSBib3R0b21WYWwgKiAxMDAgLyBtaW4uaGVpZ2h0LnZhbDtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGhCaWFzRGlmZnMgPSBjb21wdXRlQmlhc1ZhbHVlcyhtaW4ud2lkdGgudmFsIC0gYmIudywgbGVmdFZhbCwgcmlnaHRWYWwpO1xuICAgIHZhciBkaWZmTGVmdCA9IHdpZHRoQmlhc0RpZmZzLmJpYXNEaWZmO1xuICAgIHZhciBkaWZmUmlnaHQgPSB3aWR0aEJpYXNEaWZmcy5iaWFzQ29tcGxlbWVudERpZmY7XG4gICAgdmFyIGhlaWdodEJpYXNEaWZmcyA9IGNvbXB1dGVCaWFzVmFsdWVzKG1pbi5oZWlnaHQudmFsIC0gYmIuaCwgdG9wVmFsLCBib3R0b21WYWwpO1xuICAgIHZhciBkaWZmVG9wID0gaGVpZ2h0Qmlhc0RpZmZzLmJpYXNEaWZmO1xuICAgIHZhciBkaWZmQm90dG9tID0gaGVpZ2h0Qmlhc0RpZmZzLmJpYXNDb21wbGVtZW50RGlmZjtcbiAgICBfcC5hdXRvUGFkZGluZyA9IGNvbXB1dGVQYWRkaW5nVmFsdWVzKGJiLncsIGJiLmgsIHBhcmVudC5wc3R5bGUoJ3BhZGRpbmcnKSwgcGFyZW50LnBzdHlsZSgncGFkZGluZy1yZWxhdGl2ZS10bycpLnZhbHVlKTtcbiAgICBfcC5hdXRvV2lkdGggPSBNYXRoLm1heChiYi53LCBtaW4ud2lkdGgudmFsKTtcbiAgICBwb3MueCA9ICgtZGlmZkxlZnQgKyBiYi54MSArIGJiLngyICsgZGlmZlJpZ2h0KSAvIDI7XG4gICAgX3AuYXV0b0hlaWdodCA9IE1hdGgubWF4KGJiLmgsIG1pbi5oZWlnaHQudmFsKTtcbiAgICBwb3MueSA9ICgtZGlmZlRvcCArIGJiLnkxICsgYmIueTIgKyBkaWZmQm90dG9tKSAvIDI7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG5cbiAgICBpZiAoIV9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gfHwgZm9yY2UpIHtcbiAgICAgIHVwZGF0ZShlbGUpO1xuXG4gICAgICBpZiAoIWN5LmJhdGNoaW5nKCkpIHtcbiAgICAgICAgX3AuY29tcG91bmRCb3VuZHNDbGVhbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgbm9uaW5mID0gZnVuY3Rpb24gbm9uaW5mKHgpIHtcbiAgaWYgKHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHg7XG59O1xuXG52YXIgdXBkYXRlQm91bmRzID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzKGIsIHgxLCB5MSwgeDIsIHkyKSB7XG4gIC8vIGRvbid0IHVwZGF0ZSB3aXRoIHplcm8gYXJlYSBib3hlc1xuICBpZiAoeDIgLSB4MSA9PT0gMCB8fCB5MiAtIHkxID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGRvbid0IHVwZGF0ZSB3aXRoIG51bGwgZGltXG5cblxuICBpZiAoeDEgPT0gbnVsbCB8fCB5MSA9PSBudWxsIHx8IHgyID09IG51bGwgfHwgeTIgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGIueDEgPSB4MSA8IGIueDEgPyB4MSA6IGIueDE7XG4gIGIueDIgPSB4MiA+IGIueDIgPyB4MiA6IGIueDI7XG4gIGIueTEgPSB5MSA8IGIueTEgPyB5MSA6IGIueTE7XG4gIGIueTIgPSB5MiA+IGIueTIgPyB5MiA6IGIueTI7XG4gIGIudyA9IGIueDIgLSBiLngxO1xuICBiLmggPSBiLnkyIC0gYi55MTtcbn07XG5cbnZhciB1cGRhdGVCb3VuZHNGcm9tQm94ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUJveChiLCBiMikge1xuICBpZiAoYjIgPT0gbnVsbCkge1xuICAgIHJldHVybiBiO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUJvdW5kcyhiLCBiMi54MSwgYjIueTEsIGIyLngyLCBiMi55Mik7XG59O1xuXG52YXIgcHJlZml4ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIHByZWZpeGVkUHJvcGVydHkob2JqLCBmaWVsZCwgcHJlZml4KSB7XG4gIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgZmllbGQsIHByZWZpeCk7XG59O1xuXG52YXIgdXBkYXRlQm91bmRzRnJvbUFycm93ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBoYWxmQXJXID0gcnN0eWxlLmFycm93V2lkdGggLyAyO1xuICB2YXIgYXJyb3dUeXBlID0gZWxlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB4O1xuICB2YXIgeTtcblxuICBpZiAoYXJyb3dUeXBlICE9PSAnbm9uZScpIHtcbiAgICBpZiAocHJlZml4ID09PSAnc291cmNlJykge1xuICAgICAgeCA9IHJzdHlsZS5zcmNYO1xuICAgICAgeSA9IHJzdHlsZS5zcmNZO1xuICAgIH0gZWxzZSBpZiAocHJlZml4ID09PSAndGFyZ2V0Jykge1xuICAgICAgeCA9IHJzdHlsZS50Z3RYO1xuICAgICAgeSA9IHJzdHlsZS50Z3RZO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gcnN0eWxlLm1pZFg7XG4gICAgICB5ID0gcnN0eWxlLm1pZFk7XG4gICAgfSAvLyBhbHdheXMgc3RvcmUgdGhlIGluZGl2aWR1YWwgYXJyb3cgYm91bmRzXG5cblxuICAgIHZhciBiYnMgPSBfcC5hcnJvd0JvdW5kcyA9IF9wLmFycm93Qm91bmRzIHx8IHt9O1xuICAgIHZhciBiYiA9IGJic1twcmVmaXhdID0gYmJzW3ByZWZpeF0gfHwge307XG4gICAgYmIueDEgPSB4IC0gaGFsZkFyVztcbiAgICBiYi55MSA9IHkgLSBoYWxmQXJXO1xuICAgIGJiLngyID0geCArIGhhbGZBclc7XG4gICAgYmIueTIgPSB5ICsgaGFsZkFyVztcbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYiwgMSk7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgYmIueDEsIGJiLnkxLCBiYi54MiwgYmIueTIpO1xuICB9XG59O1xuXG52YXIgdXBkYXRlQm91bmRzRnJvbUxhYmVsID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcHJlZml4RGFzaDtcblxuICBpZiAocHJlZml4KSB7XG4gICAgcHJlZml4RGFzaCA9IHByZWZpeCArICctJztcbiAgfSBlbHNlIHtcbiAgICBwcmVmaXhEYXNoID0gJyc7XG4gIH1cblxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICdsYWJlbCcpLnN0clZhbHVlO1xuXG4gIGlmIChsYWJlbCkge1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpO1xuICAgIHZhciBsYWJlbFdpZHRoID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxIZWlnaHQgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsSGVpZ2h0JywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxYID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFgnLCBwcmVmaXgpO1xuICAgIHZhciBsYWJlbFkgPSBwcmVmaXhlZFByb3BlcnR5KHJzdHlsZSwgJ2xhYmVsWScsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWU7XG4gICAgdmFyIG1hcmdpblkgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgcm90YXRpb24gPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICAgIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgaGFsZkJvcmRlcldpZHRoID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIHZhciBwYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5PZkVycm9yID0gMjsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuXG4gICAgdmFyIGxoID0gbGFiZWxIZWlnaHQ7XG4gICAgdmFyIGx3ID0gbGFiZWxXaWR0aDtcbiAgICB2YXIgbHdfMiA9IGx3IC8gMjtcbiAgICB2YXIgbGhfMiA9IGxoIC8gMjtcbiAgICB2YXIgbHgxLCBseDIsIGx5MSwgbHkyO1xuXG4gICAgaWYgKGlzRWRnZSkge1xuICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgIGx4MiA9IGxhYmVsWCArIGx3XzI7XG4gICAgICBseTEgPSBsYWJlbFkgLSBsaF8yO1xuICAgICAgbHkyID0gbGFiZWxZICsgbGhfMjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChoYWxpZ24udmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHc7XG4gICAgICAgICAgbHgyID0gbGFiZWxYO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFg7XG4gICAgICAgICAgbHgyID0gbGFiZWxYICsgbHc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodmFsaWduLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGg7XG4gICAgICAgICAgbHkyID0gbGFiZWxZO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgbHkxID0gbGFiZWxZO1xuICAgICAgICAgIGx5MiA9IGxhYmVsWSArIGxoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gLy8gc2hpZnQgYnkgbWFyZ2luIGFuZCBleHBhbmQgYnkgb3V0bGluZSBhbmQgYm9yZGVyXG5cblxuICAgIGx4MSArPSBtYXJnaW5YIC0gTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpIC0gcGFkZGluZyAtIG1hcmdpbk9mRXJyb3I7XG4gICAgbHgyICs9IG1hcmdpblggKyBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgKyBwYWRkaW5nICsgbWFyZ2luT2ZFcnJvcjtcbiAgICBseTEgKz0gbWFyZ2luWSAtIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSAtIHBhZGRpbmcgLSBtYXJnaW5PZkVycm9yO1xuICAgIGx5MiArPSBtYXJnaW5ZICsgTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpICsgcGFkZGluZyArIG1hcmdpbk9mRXJyb3I7IC8vIGFsd2F5cyBzdG9yZSB0aGUgdW5yb3RhdGVkIGxhYmVsIGJvdW5kcyBzZXBhcmF0ZWx5XG5cbiAgICB2YXIgYmJQcmVmaXggPSBwcmVmaXggfHwgJ21haW4nO1xuICAgIHZhciBiYnMgPSBfcC5sYWJlbEJvdW5kcztcbiAgICB2YXIgYmIgPSBiYnNbYmJQcmVmaXhdID0gYmJzW2JiUHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IGx4MTtcbiAgICBiYi55MSA9IGx5MTtcbiAgICBiYi54MiA9IGx4MjtcbiAgICBiYi55MiA9IGx5MjtcbiAgICBiYi53ID0gbHgyIC0gbHgxO1xuICAgIGJiLmggPSBseTIgLSBseTE7XG4gICAgdmFyIGlzQXV0b3JvdGF0ZSA9IGlzRWRnZSAmJiByb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnO1xuICAgIHZhciBpc1BmVmFsdWUgPSByb3RhdGlvbi5wZlZhbHVlICE9IG51bGwgJiYgcm90YXRpb24ucGZWYWx1ZSAhPT0gMDtcblxuICAgIGlmIChpc0F1dG9yb3RhdGUgfHwgaXNQZlZhbHVlKSB7XG4gICAgICB2YXIgdGhldGEgPSBpc0F1dG9yb3RhdGUgPyBwcmVmaXhlZFByb3BlcnR5KF9wLnJzdHlsZSwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpIDogcm90YXRpb24ucGZWYWx1ZTtcbiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICB2YXIgc2luID0gTWF0aC5zaW4odGhldGEpOyAvLyByb3RhdGlvbiBwb2ludCAoZGVmYXVsdCB2YWx1ZSBmb3IgY2VudGVyLWNlbnRlcilcblxuICAgICAgdmFyIHhvID0gKGx4MSArIGx4MikgLyAyO1xuICAgICAgdmFyIHlvID0gKGx5MSArIGx5MikgLyAyO1xuXG4gICAgICBpZiAoIWlzRWRnZSkge1xuICAgICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeG8gPSBseDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHhvID0gbHgxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHZhbGlnbi52YWx1ZSkge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB5byA9IGx5MjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHlvID0gbHkxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSh4LCB5KSB7XG4gICAgICAgIHggPSB4IC0geG87XG4gICAgICAgIHkgPSB5IC0geW87XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4gKyB4byxcbiAgICAgICAgICB5OiB4ICogc2luICsgeSAqIGNvcyArIHlvXG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgbHgxID0gTWF0aC5taW4ocHgxeTEueCwgcHgxeTIueCwgcHgyeTEueCwgcHgyeTIueCk7XG4gICAgICBseDIgPSBNYXRoLm1heChweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx5MSA9IE1hdGgubWluKHB4MXkxLnksIHB4MXkyLnksIHB4MnkxLnksIHB4MnkyLnkpO1xuICAgICAgbHkyID0gTWF0aC5tYXgocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgfVxuXG4gICAgdmFyIGJiUHJlZml4Um90ID0gYmJQcmVmaXggKyAnUm90JztcbiAgICB2YXIgYmJSb3QgPSBiYnNbYmJQcmVmaXhSb3RdID0gYmJzW2JiUHJlZml4Um90XSB8fCB7fTtcbiAgICBiYlJvdC54MSA9IGx4MTtcbiAgICBiYlJvdC55MSA9IGx5MTtcbiAgICBiYlJvdC54MiA9IGx4MjtcbiAgICBiYlJvdC55MiA9IGx5MjtcbiAgICBiYlJvdC53ID0gbHgyIC0gbHgxO1xuICAgIGJiUm90LmggPSBseTIgLSBseTE7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgbHgxLCBseTEsIGx4MiwgbHkyKTtcbiAgICB1cGRhdGVCb3VuZHMoX3AubGFiZWxCb3VuZHMuYWxsLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kcztcbn07IC8vIGdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyAoaW4gcmF3IG1vZGVsIHBvc2l0aW9uKVxuXG5cbnZhciBib3VuZGluZ0JveEltcGwgPSBmdW5jdGlvbiBib3VuZGluZ0JveEltcGwoZWxlLCBvcHRpb25zKSB7XG4gIHZhciBjeSA9IGVsZS5fcHJpdmF0ZS5jeTtcbiAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5LnN0eWxlRW5hYmxlZCgpO1xuICB2YXIgaGVhZGxlc3MgPSBjeS5oZWFkbGVzcygpO1xuICB2YXIgYm91bmRzID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIGlzTm9kZSA9IGVsZS5pc05vZGUoKTtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGV4MSwgZXgyLCBleTEsIGV5MjsgLy8gZXh0cmVtYSBvZiBib2R5IC8gbGluZXNcblxuICB2YXIgeCwgeTsgLy8gbm9kZSBwb3NcblxuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgbWFudWFsRXhwYW5zaW9uID0gaXNOb2RlICYmIHN0eWxlRW5hYmxlZCA/IGVsZS5wc3R5bGUoJ2JvdW5kcy1leHBhbnNpb24nKS5wZlZhbHVlIDogWzBdOyAvLyBtdXN0IHVzZSBgZGlzcGxheWAgcHJvcCBvbmx5LCBhcyByZWFkaW5nIGBjb21wb3VuZC53aWR0aCgpYCBjYXVzZXMgcmVjdXJzaW9uXG4gIC8vIChvdGhlciBmYWN0b3JzIGxpa2Ugd2lkdGggdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uIGFueXdheSlcblxuICB2YXIgaXNEaXNwbGF5ZWQgPSBmdW5jdGlvbiBpc0Rpc3BsYXllZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlICE9PSAnbm9uZSc7XG4gIH07XG5cbiAgdmFyIGRpc3BsYXllZCA9ICFzdHlsZUVuYWJsZWQgfHwgaXNEaXNwbGF5ZWQoZWxlKSAvLyBtdXN0IHRha2UgaW50byBhY2NvdW50IGNvbm5lY3RlZCBub2RlcyBiL2Mgb2YgaW1wbGljaXQgZWRnZSBoaWRpbmcgb24gZGlzcGxheTpub25lIG5vZGVcbiAgJiYgKCFpc0VkZ2UgfHwgaXNEaXNwbGF5ZWQoZWxlLnNvdXJjZSgpKSAmJiBpc0Rpc3BsYXllZChlbGUudGFyZ2V0KCkpKTtcblxuICBpZiAoZGlzcGxheWVkKSB7XG4gICAgLy8gZGlzcGxheWVkIHN1ZmZpY2VzLCBzaW5jZSB3ZSB3aWxsIGZpbmQgemVybyBhcmVhIGVsZXMgYW55d2F5XG4gICAgdmFyIG92ZXJsYXlPcGFjaXR5ID0gMDtcbiAgICB2YXIgb3ZlcmxheVBhZGRpbmcgPSAwO1xuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgb3ZlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCdvdmVybGF5LW9wYWNpdHknKS52YWx1ZTtcblxuICAgICAgaWYgKG92ZXJsYXlPcGFjaXR5ICE9PSAwKSB7XG4gICAgICAgIG92ZXJsYXlQYWRkaW5nID0gZWxlLnBzdHlsZSgnb3ZlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciB3SGFsZiA9IDA7XG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB3ID0gZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgd0hhbGYgPSB3IC8gMjtcbiAgICB9XG5cbiAgICBpZiAoaXNOb2RlICYmIG9wdGlvbnMuaW5jbHVkZU5vZGVzKSB7XG4gICAgICB2YXIgcG9zID0gZWxlLnBvc2l0aW9uKCk7XG4gICAgICB4ID0gcG9zLng7XG4gICAgICB5ID0gcG9zLnk7XG5cbiAgICAgIHZhciBfdyA9IGVsZS5vdXRlcldpZHRoKCk7XG5cbiAgICAgIHZhciBoYWxmVyA9IF93IC8gMjtcbiAgICAgIHZhciBoID0gZWxlLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgaGFsZkggPSBoIC8gMjsgLy8gaGFuZGxlIG5vZGUgZGltZW5zaW9uc1xuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBleDEgPSB4IC0gaGFsZlc7XG4gICAgICBleDIgPSB4ICsgaGFsZlc7XG4gICAgICBleTEgPSB5IC0gaGFsZkg7XG4gICAgICBleTIgPSB5ICsgaGFsZkg7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgIH0gZWxzZSBpZiAoaXNFZGdlICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmICFoZWFkbGVzcykge1xuICAgICAgICB2YXIgY3VydmVTdHlsZSA9IGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykuc3RyVmFsdWU7IC8vIGhhbmRsZSBlZGdlIGRpbWVuc2lvbnMgKHJvdWdoIGJveCBlc3RpbWF0ZSlcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGV4MSA9IE1hdGgubWluKHJzdHlsZS5zcmNYLCByc3R5bGUubWlkWCwgcnN0eWxlLnRndFgpO1xuICAgICAgICBleDIgPSBNYXRoLm1heChyc3R5bGUuc3JjWCwgcnN0eWxlLm1pZFgsIHJzdHlsZS50Z3RYKTtcbiAgICAgICAgZXkxID0gTWF0aC5taW4ocnN0eWxlLnNyY1ksIHJzdHlsZS5taWRZLCByc3R5bGUudGd0WSk7XG4gICAgICAgIGV5MiA9IE1hdGgubWF4KHJzdHlsZS5zcmNZLCByc3R5bGUubWlkWSwgcnN0eWxlLnRndFkpOyAvLyB0YWtlIGludG8gYWNjb3VudCBlZGdlIHdpZHRoXG5cbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpOyAvLyBwcmVjaXNlIGVkZ2VzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgICAgIHZhciBocHRzID0gcnN0eWxlLmhheXN0YWNrUHRzO1xuXG4gICAgICAgICAgaWYgKGhwdHMgJiYgaHB0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGV4MSA9IGhwdHNbMF0ueDtcbiAgICAgICAgICAgIGV5MSA9IGhwdHNbMF0ueTtcbiAgICAgICAgICAgIGV4MiA9IGhwdHNbMV0ueDtcbiAgICAgICAgICAgIGV5MiA9IGhwdHNbMV0ueTtcblxuICAgICAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IGV4MTtcbiAgICAgICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgICAgICBleDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXkxID4gZXkyKSB7XG4gICAgICAgICAgICAgIHZhciBfdGVtcCA9IGV5MTtcbiAgICAgICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgICAgICBleTIgPSBfdGVtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxIC0gd0hhbGYsIGV5MSAtIHdIYWxmLCBleDIgKyB3SGFsZiwgZXkyICsgd0hhbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjdXJ2ZVN0eWxlID09PSAnYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJyB8fCBjdXJ2ZVN0eWxlID09PSAndGF4aScpIHtcbiAgICAgICAgICB2YXIgcHRzO1xuXG4gICAgICAgICAgc3dpdGNoIChjdXJ2ZVN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdiZXppZXInOlxuICAgICAgICAgICAgY2FzZSAndW5idW5kbGVkLWJlemllcic6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5iZXppZXJQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdzZWdtZW50cyc6XG4gICAgICAgICAgICBjYXNlICd0YXhpJzpcbiAgICAgICAgICAgICAgcHRzID0gcnN0eWxlLmxpbmVQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHB0ID0gcHRzW2pdO1xuICAgICAgICAgICAgICBleDEgPSBwdC54IC0gd0hhbGY7XG4gICAgICAgICAgICAgIGV4MiA9IHB0LnggKyB3SGFsZjtcbiAgICAgICAgICAgICAgZXkxID0gcHQueSAtIHdIYWxmO1xuICAgICAgICAgICAgICBleTIgPSBwdC55ICsgd0hhbGY7XG4gICAgICAgICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGJlemllci1saWtlIG9yIHNlZ21lbnQtbGlrZSBlZGdlXG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGhlYWRsZXNzIG9yIHN0eWxlIGRpc2FibGVkXG4gICAgICAgIC8vIGZhbGxiYWNrIG9uIHNvdXJjZSBhbmQgdGFyZ2V0IHBvc2l0aW9uc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgdmFyIG4xID0gZWxlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgbjFwb3MgPSBuMS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbjIgPSBlbGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciBuMnBvcyA9IG4yLnBvc2l0aW9uKCk7XG4gICAgICAgIGV4MSA9IG4xcG9zLng7XG4gICAgICAgIGV4MiA9IG4ycG9zLng7XG4gICAgICAgIGV5MSA9IG4xcG9zLnk7XG4gICAgICAgIGV5MiA9IG4ycG9zLnk7XG5cbiAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgIHZhciBfdGVtcDIgPSBleDE7XG4gICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgIGV4MiA9IF90ZW1wMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleTEgPiBleTIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAzID0gZXkxO1xuICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICBleTIgPSBfdGVtcDM7XG4gICAgICAgIH0gLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuXG5cbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgfSAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuXG4gICAgfSAvLyBlZGdlc1xuICAgIC8vIGhhbmRsZSBlZGdlIGFycm93IHNpemVcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblxuICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlRWRnZXMgJiYgaXNFZGdlKSB7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdtaWQtdGFyZ2V0Jyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgIHVwZGF0ZUJvdW5kc0Zyb21BcnJvdyhib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgIH0gLy8gZ2hvc3RcbiAgICAvLy8vLy8vL1xuXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB2YXIgZ2hvc3QgPSBlbGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcblxuICAgICAgaWYgKGdob3N0KSB7XG4gICAgICAgIHZhciBneCA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICAgICAgdmFyIGd5ID0gZWxlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBib3VuZHMueDEgKyBneCwgYm91bmRzLnkxICsgZ3ksIGJvdW5kcy54MiArIGd4LCBib3VuZHMueTIgKyBneSk7XG4gICAgICB9XG4gICAgfSAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG5cblxuICAgIHZhciBiYkJvZHkgPSBfcC5ib2R5Qm91bmRzID0gX3AuYm9keUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYkJvZHksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYkJvZHksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJCb2R5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuICAgIC8vIG92ZXJsYXlcbiAgICAvLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBleDEgPSBib3VuZHMueDE7XG4gICAgICBleDIgPSBib3VuZHMueDI7XG4gICAgICBleTEgPSBib3VuZHMueTE7XG4gICAgICBleTIgPSBib3VuZHMueTI7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSBvdmVybGF5UGFkZGluZywgZXkxIC0gb3ZlcmxheVBhZGRpbmcsIGV4MiArIG92ZXJsYXlQYWRkaW5nLCBleTIgKyBvdmVybGF5UGFkZGluZyk7XG4gICAgfSAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG5cblxuICAgIHZhciBiYk92ZXJsYXkgPSBfcC5vdmVybGF5Qm91bmRzID0gX3Aub3ZlcmxheUJvdW5kcyB8fCB7fTtcbiAgICBhc3NpZ25Cb3VuZGluZ0JveChiYk92ZXJsYXksIGJvdW5kcyk7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhiYk92ZXJsYXksIG1hbnVhbEV4cGFuc2lvbik7XG4gICAgZXhwYW5kQm91bmRpbmdCb3goYmJPdmVybGF5LCAxKTsgLy8gZXhwYW5kIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgZGltZW5zaW9uIGluYWNjdXJhY2llc1xuICAgIC8vIGhhbmRsZSBsYWJlbCBkaW1lbnNpb25zXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHZhciBiYkxhYmVscyA9IF9wLmxhYmVsQm91bmRzID0gX3AubGFiZWxCb3VuZHMgfHwge307XG5cbiAgICBpZiAoYmJMYWJlbHMuYWxsICE9IG51bGwpIHtcbiAgICAgIGNsZWFyQm91bmRpbmdCb3goYmJMYWJlbHMuYWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmJMYWJlbHMuYWxsID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3NvdXJjZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhcmdldExhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgJ3RhcmdldCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBzdHlsZSBlbmFibGVkIGZvciBsYWJlbHNcblxuICB9IC8vIGlmIGRpc3BsYXllZFxuXG5cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG5cbiAgaWYgKGJvdW5kcy53ID4gMCAmJiBib3VuZHMuaCA+IDAgJiYgZGlzcGxheWVkKSB7XG4gICAgZXhwYW5kQm91bmRpbmdCb3hTaWRlcyhib3VuZHMsIG1hbnVhbEV4cGFuc2lvbik7IC8vIGV4cGFuZCBib3VuZHMgYnkgMSBiZWNhdXNlIGFudGlhbGlhc2luZyBjYW4gaW5jcmVhc2UgdGhlIHZpc3VhbC9lZmZlY3RpdmUgc2l6ZSBieSAxIG9uIGFsbCBzaWRlc1xuXG4gICAgZXhwYW5kQm91bmRpbmdCb3goYm91bmRzLCAxKTtcbiAgfVxuXG4gIHJldHVybiBib3VuZHM7XG59O1xuXG52YXIgZ2V0S2V5ID0gZnVuY3Rpb24gZ2V0S2V5KG9wdHMpIHtcbiAgdmFyIGkgPSAwO1xuXG4gIHZhciB0ZiA9IGZ1bmN0aW9uIHRmKHZhbCkge1xuICAgIHJldHVybiAodmFsID8gMSA6IDApIDw8IGkrKztcbiAgfTtcblxuICB2YXIga2V5ID0gMDtcbiAga2V5ICs9IHRmKG9wdHMuaW5jdWRlTm9kZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlRWRnZXMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZVRhcmdldExhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVPdmVybGF5cyk7XG4gIHJldHVybiBrZXk7XG59O1xuXG52YXIgZ2V0Qm91bmRpbmdCb3hQb3NLZXkgPSBmdW5jdGlvbiBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBwMSA9IGVsZS5zb3VyY2UoKS5wb3NpdGlvbigpO1xuICAgIHZhciBwMiA9IGVsZS50YXJnZXQoKS5wb3NpdGlvbigpO1xuXG4gICAgdmFyIHIgPSBmdW5jdGlvbiByKHgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gaGFzaEludHNBcnJheShbcihwMS54KSwgcihwMS55KSwgcihwMi54KSwgcihwMi55KV0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG52YXIgY2FjaGVkQm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gY2FjaGVkQm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0cykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBiYjtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGtleSA9IG9wdHMgPT0gbnVsbCA/IGRlZkJiT3B0c0tleSA6IGdldEtleShvcHRzKTtcbiAgdmFyIHVzaW5nRGVmT3B0cyA9IGtleSA9PT0gZGVmQmJPcHRzS2V5O1xuICB2YXIgY3VyclBvc0tleSA9IGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSk7XG4gIHZhciBpc1Bvc0tleVNhbWUgPSBfcC5iYkNhY2hlUG9zS2V5ID09PSBjdXJyUG9zS2V5O1xuICB2YXIgdXNlQ2FjaGUgPSBvcHRzLnVzZUNhY2hlICYmIGlzUG9zS2V5U2FtZTtcblxuICB2YXIgaXNEaXJ0eSA9IGZ1bmN0aW9uIGlzRGlydHkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5iYkNhY2hlID09IG51bGwgfHwgZWxlLl9wcml2YXRlLnN0eWxlRGlydHk7XG4gIH07XG5cbiAgdmFyIG5lZWRSZWNhbGMgPSAhdXNlQ2FjaGUgfHwgaXNEaXJ0eShlbGUpIHx8IGlzRWRnZSAmJiBpc0RpcnR5KGVsZS5zb3VyY2UoKSkgfHwgaXNEaXJ0eShlbGUudGFyZ2V0KCkpO1xuXG4gIGlmIChuZWVkUmVjYWxjKSB7XG4gICAgaWYgKCFpc1Bvc0tleVNhbWUpIHtcbiAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgIH1cblxuICAgIGJiID0gYm91bmRpbmdCb3hJbXBsKGVsZSwgZGVmQmJPcHRzKTtcbiAgICBfcC5iYkNhY2hlID0gYmI7XG4gICAgX3AuYmJDYWNoZVBvc0tleSA9IGN1cnJQb3NLZXk7XG4gIH0gZWxzZSB7XG4gICAgYmIgPSBfcC5iYkNhY2hlO1xuICB9IC8vIG5vdCB1c2luZyBkZWYgb3B0cyA9PiBuZWVkIHRvIGJ1aWxkIHVwIGJiIGZyb20gY29tYmluYXRpb24gb2Ygc3ViIGJic1xuXG5cbiAgaWYgKCF1c2luZ0RlZk9wdHMpIHtcbiAgICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlTm9kZXMgJiYgaXNOb2RlIHx8IG9wdHMuaW5jbHVkZUVkZ2VzICYmICFpc05vZGUpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5vdmVybGF5Qm91bmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmJvZHlCb3VuZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRzLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVNYWluTGFiZWxzICYmICghaXNFZGdlIHx8IG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscyAmJiBvcHRzLmluY2x1ZGVUYXJnZXRMYWJlbHMpKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLmFsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0cy5pbmNsdWRlTWFpbkxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLm1haW5Sb3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZVNvdXJjZUxhYmVscykge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICB9XG5cbiAgcmV0dXJuIGJiO1xufTtcblxudmFyIGRlZkJiT3B0cyA9IHtcbiAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICBpbmNsdWRlRWRnZXM6IHRydWUsXG4gIGluY2x1ZGVMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVNYWluTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlU291cmNlTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlVGFyZ2V0TGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlT3ZlcmxheXM6IHRydWUsXG4gIHVzZUNhY2hlOiB0cnVlXG59O1xudmFyIGRlZkJiT3B0c0tleSA9IGdldEtleShkZWZCYk9wdHMpO1xudmFyIGZpbGxlZEJiT3B0cyA9IGRlZmF1bHRzKGRlZkJiT3B0cyk7XG5cbmVsZXNmbiRrLmJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIGJvdW5kczsgLy8gdGhlIG1haW4gdXNlY2FzZSBpcyBlbGUuYm91bmRpbmdCb3goKSBmb3IgYSBzaW5nbGUgZWxlbWVudCB3aXRoIG5vL2RlZiBvcHRpb25zXG4gIC8vIHNwZWNpZmllZCBzLnQuIHRoZSBjYWNoZSBpcyB1c2VkLCBzbyBjaGVjayBmb3IgdGhpcyBjYXNlIHRvIG1ha2UgaXQgZmFzdGVyIGJ5XG4gIC8vIGF2b2lkaW5nIHRoZSBvdmVyaGVhZCBvZiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb25cblxuICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpc1swXS5fcHJpdmF0ZS5iYkNhY2hlICE9IG51bGwgJiYgIXRoaXNbMF0uX3ByaXZhdGUuc3R5bGVEaXJ0eSAmJiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnVzZUNhY2hlID09PSB0cnVlKSkge1xuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZCYk9wdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBmaWxsZWRCYk9wdHMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcblxuICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgICB2YXIgY3VyclBvc0tleSA9IGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSk7XG4gICAgICAgIHZhciBpc1Bvc0tleVNhbWUgPSBfcC5iYkNhY2hlUG9zS2V5ID09PSBjdXJyUG9zS2V5O1xuICAgICAgICB2YXIgdXNlQ2FjaGUgPSBvcHRzLnVzZUNhY2hlICYmIGlzUG9zS2V5U2FtZSAmJiAhX3Auc3R5bGVEaXJ0eTtcbiAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh1c2VDYWNoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVDb21wb3VuZEJvdW5kcyghb3B0aW9ucy51c2VDYWNoZSk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZWxlID0gZWxlc1tfaV07XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgY2FjaGVkQm91bmRpbmdCb3hJbXBsKF9lbGUsIG9wdHMpKTtcbiAgICB9XG4gIH1cblxuICBib3VuZHMueDEgPSBub25pbmYoYm91bmRzLngxKTtcbiAgYm91bmRzLnkxID0gbm9uaW5mKGJvdW5kcy55MSk7XG4gIGJvdW5kcy54MiA9IG5vbmluZihib3VuZHMueDIpO1xuICBib3VuZHMueTIgPSBub25pbmYoYm91bmRzLnkyKTtcbiAgYm91bmRzLncgPSBub25pbmYoYm91bmRzLngyIC0gYm91bmRzLngxKTtcbiAgYm91bmRzLmggPSBub25pbmYoYm91bmRzLnkyIC0gYm91bmRzLnkxKTtcbiAgcmV0dXJuIGJvdW5kcztcbn07XG5cbmVsZXNmbiRrLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9wID0gdGhpc1tpXS5fcHJpdmF0ZTtcbiAgICBfcC5iYkNhY2hlID0gbnVsbDtcbiAgICBfcC5iYkNhY2hlUG9zS2V5ID0gbnVsbDtcbiAgICBfcC5ib2R5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5vdmVybGF5Qm91bmRzID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5hbGwgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZSA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5zb3VyY2VSb3QgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnRhcmdldFJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMubWFpblJvdCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtc291cmNlJ10gPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzWydtaWQtdGFyZ2V0J10gPSBudWxsO1xuICB9XG5cbiAgdGhpcy5lbWl0QW5kTm90aWZ5KCdib3VuZHMnKTtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBwcml2YXRlIGhlbHBlciB0byBnZXQgYm91bmRpbmcgYm94IGZvciBjdXN0b20gbm9kZSBwb3NpdGlvbnNcbi8vIC0gZ29vZCBmb3IgcGVyZiBpbiBjZXJ0YWluIGNhc2VzIGJ1dCBjdXJyZW50bHkgcmVxdWlyZXMgZGlydHlpbmcgdGhlIHJlbmRlcmVkIHN0eWxlXG4vLyAtIHdvdWxkIGJlIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBub2RlcyBidXQgdGhlIG5vZGVzIGFyZSByZWFkIGRpcmVjdGx5IGV2ZXJ5d2hlcmUgaW4gdGhlIHJlbmRlcmVyLi4uXG4vLyAtIHRyeSB0byB1c2UgZm9yIG9ubHkgdGhpbmdzIGxpa2UgZGlzY3JldGUgbGF5b3V0cyB3aGVyZSB0aGUgbm9kZSBwb3NpdGlvbiB3b3VsZCBjaGFuZ2UgYW55d2F5XG5cblxuZWxlc2ZuJGsuYm91bmRpbmdCb3hBdCA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBwYXJlbnRzID0gY3kuY29sbGVjdGlvbigpO1xuXG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICBub2RlcyA9IG5vZGVzLm5vdChwYXJlbnRzKTtcbiAgfVxuXG4gIGlmIChwbGFpbk9iamVjdChmbikpIHtcbiAgICB2YXIgb2JqID0gZm47XG5cbiAgICBmbiA9IGZ1bmN0aW9uIGZuKCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICB9XG5cbiAgdmFyIHN0b3JlT2xkUG9zID0gZnVuY3Rpb24gc3RvcmVPbGRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3MgPSBmbihub2RlLCBpKTtcbiAgfTtcblxuICB2YXIgZ2V0T2xkUG9zID0gZnVuY3Rpb24gZ2V0T2xkUG9zKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5iYkF0T2xkUG9zO1xuICB9O1xuXG4gIGN5LnN0YXJ0QmF0Y2goKTtcbiAgbm9kZXMuZm9yRWFjaChzdG9yZU9sZFBvcykuc2lsZW50UG9zaXRpb25zKGZuKTtcblxuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgcGFyZW50cy5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBwYXJlbnRzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKHRydWUpOyAvLyBmb3JjZSB1cGRhdGUgYi9jIHdlJ3JlIGluc2lkZSBhIGJhdGNoIGN5Y2xlXG4gIH1cblxuICB2YXIgYmIgPSBjb3B5Qm91bmRpbmdCb3godGhpcy5ib3VuZGluZ0JveCh7XG4gICAgdXNlQ2FjaGU6IGZhbHNlXG4gIH0pKTtcbiAgbm9kZXMuc2lsZW50UG9zaXRpb25zKGdldE9sZFBvcyk7XG5cbiAgaWYgKGhhc0NvbXBvdW5kTm9kZXMpIHtcbiAgICBwYXJlbnRzLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIHBhcmVudHMuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgcGFyZW50cy51cGRhdGVDb21wb3VuZEJvdW5kcyh0cnVlKTsgLy8gZm9yY2UgdXBkYXRlIGIvYyB3ZSdyZSBpbnNpZGUgYSBiYXRjaCBjeWNsZVxuICB9XG5cbiAgY3kuZW5kQmF0Y2goKTtcbiAgcmV0dXJuIGJiO1xufTtcblxuZm4kMy5ib3VuZGluZ2JveCA9IGZuJDMuYmIgPSBmbiQzLmJvdW5kaW5nQm94O1xuZm4kMy5yZW5kZXJlZEJvdW5kaW5nYm94ID0gZm4kMy5yZW5kZXJlZEJvdW5kaW5nQm94O1xudmFyIGJvdW5kcyA9IGVsZXNmbiRrO1xuXG52YXIgZm4kNCwgZWxlc2ZuJGw7XG5mbiQ0ID0gZWxlc2ZuJGwgPSB7fTtcblxudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG5cbiAgZm4kNFtvcHRzLm5hbWVdID0gZnVuY3Rpb24gZGltSW1wbCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGN5ID0gX3AuY3k7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5Ll9wcml2YXRlLnN0eWxlRW5hYmxlZDtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgZWxlLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCk7XG4gICAgICAgICAgcmV0dXJuIF9wW29wdHMuYXV0b05hbWVdIHx8IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcblxuICAgICAgICBzd2l0Y2ggKGQuc3RyVmFsdWUpIHtcbiAgICAgICAgICBjYXNlICdsYWJlbCc6XG4gICAgICAgICAgICBlbGUucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKCk7XG4gICAgICAgICAgICByZXR1cm4gX3AucnN0eWxlW29wdHMubGFiZWxOYW1lXSB8fCAwO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBkLnBmVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmbiQ0WydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICB2YXIgZGltID0gZWxlW29wdHMubmFtZV0oKTtcbiAgICAgICAgdmFyIGJvcmRlciA9IGVsZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnBmVmFsdWU7IC8vIG4uYi4gMS8yIGVhY2ggc2lkZVxuXG4gICAgICAgIHZhciBwYWRkaW5nID0gMiAqIGVsZS5wYWRkaW5nKCk7XG4gICAgICAgIHJldHVybiBkaW0gKyBib3JkZXIgKyBwYWRkaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZuJDRbJ3JlbmRlcmVkJyArIG9wdHMudXBwZXJjYXNlTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZERpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgZCA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICByZXR1cm4gZCAqIHRoaXMuY3koKS56b29tKCk7XG4gICAgfVxuICB9O1xuXG4gIGZuJDRbJ3JlbmRlcmVkJyArIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lXSA9IGZ1bmN0aW9uIHJlbmRlcmVkT3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIG9kID0gZWxlW29wdHMub3V0ZXJOYW1lXSgpO1xuICAgICAgcmV0dXJuIG9kICogdGhpcy5jeSgpLnpvb20oKTtcbiAgICB9XG4gIH07XG59O1xuXG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnd2lkdGgnXG59KTtcbmRlZmluZURpbUZucyh7XG4gIG5hbWU6ICdoZWlnaHQnXG59KTtcblxuZWxlc2ZuJGwucGFkZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcblxuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcblxuICAgIGlmIChfcC5hdXRvUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AuYXV0b1BhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ3BhZGRpbmcnKS5wZlZhbHVlO1xuICB9XG59O1xuXG5lbGVzZm4kbC5wYWRkZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlLmhlaWdodCgpICsgMiAqIGVsZS5wYWRkaW5nKCk7XG59O1xuXG5lbGVzZm4kbC5wYWRkZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUud2lkdGgoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcblxudmFyIHdpZHRoSGVpZ2h0ID0gZWxlc2ZuJGw7XG5cbnZhciBpZkVkZ2UgPSBmdW5jdGlvbiBpZkVkZ2UoZWxlLCBnZXRWYWx1ZSkge1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlKGVsZSk7XG4gIH1cbn07XG5cbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uID0gZnVuY3Rpb24gaWZFZGdlUmVuZGVyZWRQb3NpdGlvbihlbGUsIGdldFBvaW50KSB7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICByZXR1cm4gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24oZ2V0UG9pbnQoZWxlKSwgY3kuem9vbSgpLCBjeS5wYW4oKSk7XG4gIH1cbn07XG5cbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgcmV0dXJuIGdldFBvaW50cyhlbGUpLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBjb250cm9sUG9pbnRzID0gZnVuY3Rpb24gY29udHJvbFBvaW50cyhlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldENvbnRyb2xQb2ludHMoZWxlKTtcbn07XG5cbnZhciBzZWdtZW50UG9pbnRzID0gZnVuY3Rpb24gc2VnbWVudFBvaW50cyhlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFNlZ21lbnRQb2ludHMoZWxlKTtcbn07XG5cbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG5cbnZhciB0YXJnZXRFbmRwb2ludCA9IGZ1bmN0aW9uIHRhcmdldEVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0VGFyZ2V0RW5kcG9pbnQoZWxlKTtcbn07XG5cbnZhciBtaWRwb2ludCA9IGZ1bmN0aW9uIG1pZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0RWRnZU1pZHBvaW50KGVsZSk7XG59O1xuXG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG5cbnZhciByZW5kZXJlZE5hbWUgPSBmdW5jdGlvbiByZW5kZXJlZE5hbWUobmFtZSkge1xuICByZXR1cm4gJ3JlbmRlcmVkJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpO1xufTtcblxudmFyIGVkZ2VQb2ludHMgPSBPYmplY3Qua2V5cyhwdHMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBuYW1lKSB7XG4gIHZhciBzcGVjID0gcHRzW25hbWVdO1xuICB2YXIgck5hbWUgPSByZW5kZXJlZE5hbWUobmFtZSk7XG5cbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuXG4gIGlmIChzcGVjLm11bHQpIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKHRoaXMsIHNwZWMuZ2V0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG9ialtyTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaWZFZGdlUmVuZGVyZWRQb3NpdGlvbih0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbnZhciBkaW1lbnNpb25zID0gZXh0ZW5kKHt9LCBwb3NpdGlvbiwgYm91bmRzLCB3aWR0aEhlaWdodCwgZWRnZVBvaW50cyk7XG5cbi8qIVxuRXZlbnQgb2JqZWN0IGJhc2VkIG9uIGpRdWVyeSBldmVudHMsIE1JVCBsaWNlbnNlXG5cbmh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlL1xuaHR0cHM6Ly90bGRybGVnYWwuY29tL2xpY2Vuc2UvbWl0LWxpY2Vuc2Vcbmh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2Jsb2IvbWFzdGVyL3NyYy9ldmVudC5qc1xuKi9cbnZhciBFdmVudCA9IGZ1bmN0aW9uIEV2ZW50KHNyYywgcHJvcHMpIHtcbiAgdGhpcy5yZWN5Y2xlKHNyYywgcHJvcHMpO1xufTtcblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59IC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuXG5cbkV2ZW50LnByb3RvdHlwZSA9IHtcbiAgaW5zdGFuY2VTdHJpbmc6IGZ1bmN0aW9uIGluc3RhbmNlU3RyaW5nKCkge1xuICAgIHJldHVybiAnZXZlbnQnO1xuICB9LFxuICByZWN5Y2xlOiBmdW5jdGlvbiByZWN5Y2xlKHNyYywgcHJvcHMpIHtcbiAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuRmFsc2U7XG5cbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7IC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblxuICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTtcbiAgICB9IGVsc2UgaWYgKHNyYyAhPSBudWxsICYmIHNyYy50eXBlKSB7XG4gICAgICAvLyBQbGFpbiBvYmplY3QgY29udGFpbmluZyBhbGwgZXZlbnQgZGV0YWlsc1xuICAgICAgcHJvcHMgPSBzcmM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW50IHN0cmluZ1xuICAgICAgdGhpcy50eXBlID0gc3JjO1xuICAgIH0gLy8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3RcblxuXG4gICAgaWYgKHByb3BzICE9IG51bGwpIHtcbiAgICAgIC8vIG1vcmUgZWZmaWNpZW50IHRvIG1hbnVhbGx5IGNvcHkgZmllbGRzIHdlIHVzZVxuICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gcHJvcHMub3JpZ2luYWxFdmVudDtcbiAgICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGUgIT0gbnVsbCA/IHByb3BzLnR5cGUgOiB0aGlzLnR5cGU7XG4gICAgICB0aGlzLmN5ID0gcHJvcHMuY3k7XG4gICAgICB0aGlzLnRhcmdldCA9IHByb3BzLnRhcmdldDtcbiAgICAgIHRoaXMucG9zaXRpb24gPSBwcm9wcy5wb3NpdGlvbjtcbiAgICAgIHRoaXMucmVuZGVyZWRQb3NpdGlvbiA9IHByb3BzLnJlbmRlcmVkUG9zaXRpb247XG4gICAgICB0aGlzLm5hbWVzcGFjZSA9IHByb3BzLm5hbWVzcGFjZTtcbiAgICAgIHRoaXMubGF5b3V0ID0gcHJvcHMubGF5b3V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN5ICE9IG51bGwgJiYgdGhpcy5wb3NpdGlvbiAhPSBudWxsICYmIHRoaXMucmVuZGVyZWRQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAvLyBjcmVhdGUgYSByZW5kZXJlZCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgcGFzc2VkIHBvc2l0aW9uXG4gICAgICB2YXIgcG9zID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgIHZhciB6b29tID0gdGhpcy5jeS56b29tKCk7XG4gICAgICB2YXIgcGFuID0gdGhpcy5jeS5wYW4oKTtcbiAgICAgIHRoaXMucmVuZGVyZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogcG9zLnggKiB6b29tICsgcGFuLngsXG4gICAgICAgIHk6IHBvcy55ICogem9vbSArIHBhbi55XG4gICAgICB9O1xuICAgIH0gLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblxuXG4gICAgdGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuICAgIHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuXG5cbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICBpZiAoIWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuXG5cbiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9LFxuICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9LFxuICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuICBpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG4gIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZVxufTtcblxudmFyIGV2ZW50UmVnZXggPSAvXihbXi5dKykoXFwuKD86W14uXSspKT8kLzsgLy8gcmVnZXggZm9yIG1hdGNoaW5nIGV2ZW50IHN0cmluZ3MgKGUuZy4gXCJjbGljay5uYW1lc3BhY2VcIilcblxudmFyIHVuaXZlcnNhbE5hbWVzcGFjZSA9ICcuKic7IC8vIG1hdGNoZXMgYXMgaWYgbm8gbmFtZXNwYWNlIHNwZWNpZmllZCBhbmQgcHJldmVudHMgdXNlcnMgZnJvbSB1bmJpbmRpbmcgYWNjaWRlbnRhbGx5XG5cbnZhciBkZWZhdWx0cyQ4ID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHExLCBxMikge1xuICAgIHJldHVybiBxMSA9PT0gcTI7XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKClcbiAgLypjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmoqL1xuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcygpXG4gIC8qY29udGV4dCwgZXZ0Ki9cbiAge30sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGNvbnRleHRcbiAgLyosIGxpc3RlbmVyLCBldmVudE9iaiovXG4gICkge1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KClcbiAgLyogY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqICovXG4gIHt9LFxuICBhZnRlckVtaXQ6IGZ1bmN0aW9uIGFmdGVyRW1pdCgpXG4gIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICB7fSxcbiAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKVxuICAvKmNvbnRleHQqL1xuICB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCgpXG4gIC8qY29udGV4dCovXG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgY29udGV4dDogbnVsbFxufTtcbnZhciBkZWZhdWx0c0tleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0cyQ4KTtcbnZhciBlbXB0eU9wdHMgPSB7fTtcblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVtcHR5T3B0cztcbiAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cblxuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXMuY29udGV4dDtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy5lbWl0dGluZyA9IDA7XG59XG5cbnZhciBwID0gRW1pdHRlci5wcm90b3R5cGU7XG5cbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbihxdWFsaWZpZXIpKSB7XG4gICAgY2FsbGJhY2sgPSBxdWFsaWZpZXI7XG4gICAgcXVhbGlmaWVyID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudExpc3QgPSBhcnJheShldmVudHMpID8gZXZlbnRzIDogZXZlbnRzLnNwbGl0KC9cXHMrLyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZ0ID0gZXZlbnRMaXN0W2ldO1xuXG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBtYXRjaCA9IGV2dC5tYXRjaChldmVudFJlZ2V4KTsgLy8gdHlwZVsubmFtZXNwYWNlXVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgdHlwZSA9IG1hdGNoWzFdO1xuICAgICAgdmFyIG5hbWVzcGFjZSA9IG1hdGNoWzJdID8gbWF0Y2hbMl0gOiBudWxsO1xuICAgICAgdmFyIHJldCA9IGhhbmRsZXIoc2VsZiwgZXZ0LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpO1xuXG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gYWxsb3cgZXhpdGluZyBlYXJseVxuXG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFrZUV2ZW50T2JqID0gZnVuY3Rpb24gbWFrZUV2ZW50T2JqKHNlbGYsIG9iaikge1xuICBzZWxmLmFkZEV2ZW50RmllbGRzKHNlbGYuY29udGV4dCwgb2JqKTtcbiAgcmV0dXJuIG5ldyBFdmVudChvYmoudHlwZSwgb2JqKTtcbn07XG5cbnZhciBmb3JFYWNoRXZlbnRPYmogPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnRPYmooc2VsZiwgaGFuZGxlciwgZXZlbnRzKSB7XG4gIGlmIChldmVudChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBldmVudHMpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChldmVudHMpKSB7XG4gICAgaGFuZGxlcihzZWxmLCBtYWtlRXZlbnRPYmooc2VsZiwgZXZlbnRzKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50TGlzdCA9IGFycmF5KGV2ZW50cykgPyBldmVudHMgOiBldmVudHMuc3BsaXQoL1xccysvKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG5cbiAgICBpZiAoZW1wdHlTdHJpbmcoZXZ0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoID0gZXZ0Lm1hdGNoKGV2ZW50UmVnZXgpOyAvLyB0eXBlWy5uYW1lc3BhY2VdXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciB0eXBlID0gbWF0Y2hbMV07XG4gICAgICB2YXIgbmFtZXNwYWNlID0gbWF0Y2hbMl0gPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICB2YXIgZXZlbnRPYmogPSBtYWtlRXZlbnRPYmooc2VsZiwge1xuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgdGFyZ2V0OiBzZWxmLmNvbnRleHRcbiAgICAgIH0pO1xuICAgICAgaGFuZGxlcihzZWxmLCBldmVudE9iaik7XG4gICAgfVxuICB9XG59O1xuXG5wLm9uID0gcC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgZm9yRWFjaEV2ZW50KHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gICAgaWYgKGZuKGNhbGxiYWNrKSkge1xuICAgICAgc2VsZi5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgLy8gZnVsbCBldmVudCBzdHJpbmdcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAvLyBjYWxsYmFjayB0byBydW5cbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IHR5cGUgKGUuZy4gJ2NsaWNrJylcbiAgICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICAgIC8vIHRoZSBldmVudCBuYW1lc3BhY2UgKGUuZy4gXCIuZm9vXCIpXG4gICAgICAgIHF1YWxpZmllcjogcXVhbGlmaWVyLFxuICAgICAgICAvLyBhIHJlc3RyaWN0aW9uIG9uIHdoZXRoZXIgdG8gbWF0Y2ggdGhpcyBlbWl0dGVyXG4gICAgICAgIGNvbmY6IGNvbmYgLy8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG5cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wLm9uZSA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYpIHtcbiAgcmV0dXJuIHRoaXMub24oZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCB7XG4gICAgb25lOiB0cnVlXG4gIH0pO1xufTtcblxucC5yZW1vdmVMaXN0ZW5lciA9IHAub2ZmID0gZnVuY3Rpb24gKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIGlmICh0aGlzLmVtaXR0aW5nICE9PSAwKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBjb3B5QXJyYXkodGhpcy5saXN0ZW5lcnMpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgZm9yRWFjaEV2ZW50KF90aGlzLCBmdW5jdGlvbiAoc2VsZiwgZXZlbnQsIHR5cGUsIG5hbWVzcGFjZSwgcXVhbGlmaWVyLCBjYWxsYmFja1xuICAgIC8qLCBjb25mKi9cbiAgICApIHtcbiAgICAgIGlmICgobGlzdGVuZXIudHlwZSA9PT0gdHlwZSB8fCBldmVudHMgPT09ICcqJykgJiYgKCFuYW1lc3BhY2UgJiYgbGlzdGVuZXIubmFtZXNwYWNlICE9PSAnLionIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlKSAmJiAoIXF1YWxpZmllciB8fCBzZWxmLnF1YWxpZmllckNvbXBhcmUobGlzdGVuZXIucXVhbGlmaWVyLCBxdWFsaWZpZXIpKSAmJiAoIWNhbGxiYWNrIHx8IGxpc3RlbmVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sIGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZik7XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIF9sb29wKGkpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoJyonKTtcbn07XG5cbnAuZW1pdCA9IHAudHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudHMsIGV4dHJhUGFyYW1zLCBtYW51YWxDYWxsYmFjaykge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgdGhpcy5lbWl0dGluZysrO1xuXG4gIGlmICghYXJyYXkoZXh0cmFQYXJhbXMpKSB7XG4gICAgZXh0cmFQYXJhbXMgPSBbZXh0cmFQYXJhbXNdO1xuICB9XG5cbiAgZm9yRWFjaEV2ZW50T2JqKHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudE9iaikge1xuICAgIGlmIChtYW51YWxDYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICBsaXN0ZW5lcnMgPSBbe1xuICAgICAgICBldmVudDogZXZlbnRPYmouZXZlbnQsXG4gICAgICAgIHR5cGU6IGV2ZW50T2JqLnR5cGUsXG4gICAgICAgIG5hbWVzcGFjZTogZXZlbnRPYmoubmFtZXNwYWNlLFxuICAgICAgICBjYWxsYmFjazogbWFudWFsQ2FsbGJhY2tcbiAgICAgIH1dO1xuICAgICAgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdCA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihpKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG5cbiAgICAgIGlmIChsaXN0ZW5lci50eXBlID09PSBldmVudE9iai50eXBlICYmICghbGlzdGVuZXIubmFtZXNwYWNlIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gZXZlbnRPYmoubmFtZXNwYWNlIHx8IGxpc3RlbmVyLm5hbWVzcGFjZSA9PT0gdW5pdmVyc2FsTmFtZXNwYWNlKSAmJiBzZWxmLmV2ZW50TWF0Y2hlcyhzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaikpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbZXZlbnRPYmpdO1xuXG4gICAgICAgIGlmIChleHRyYVBhcmFtcyAhPSBudWxsKSB7XG4gICAgICAgICAgcHVzaChhcmdzLCBleHRyYVBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmJlZm9yZUVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5jb25mICYmIGxpc3RlbmVyLmNvbmYub25lKSB7XG4gICAgICAgICAgc2VsZi5saXN0ZW5lcnMgPSBzZWxmLmxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsICE9PSBsaXN0ZW5lcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250ZXh0ID0gc2VsZi5jYWxsYmFja0NvbnRleHQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICB2YXIgcmV0ID0gbGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHNlbGYuYWZ0ZXJFbWl0KHNlbGYuY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKTtcblxuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGV2ZW50T2JqLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50T2JqLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgbGlzdGVuZXIgbWF0Y2hlc1xuXG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzQmVmb3JlRW1pdDsgaSsrKSB7XG4gICAgICBfbG9vcDIoaSk7XG4gICAgfSAvLyBmb3IgbGlzdGVuZXJcblxuXG4gICAgaWYgKHNlbGYuYnViYmxlKHNlbGYuY29udGV4dCkgJiYgIWV2ZW50T2JqLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHNlbGYucGFyZW50KHNlbGYuY29udGV4dCkuZW1pdChldmVudE9iaiwgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgfSwgZXZlbnRzKTtcbiAgdGhpcy5lbWl0dGluZy0tO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyA9IHtcbiAgcXVhbGlmaWVyQ29tcGFyZTogZnVuY3Rpb24gcXVhbGlmaWVyQ29tcGFyZShzZWxlY3RvcjEsIHNlbGVjdG9yMikge1xuICAgIGlmIChzZWxlY3RvcjEgPT0gbnVsbCB8fCBzZWxlY3RvcjIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMSA9PSBudWxsICYmIHNlbGVjdG9yMiA9PSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxLnNhbWVUZXh0KHNlbGVjdG9yMik7XG4gICAgfVxuICB9LFxuICBldmVudE1hdGNoZXM6IGZ1bmN0aW9uIGV2ZW50TWF0Y2hlcyhlbGUsIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcblxuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGVsZSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gZWxlLmN5KCk7XG4gICAgZXZ0LnRhcmdldCA9IGVsZTtcbiAgfSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoZWxlLCBsaXN0ZW5lciwgZXZlbnRPYmopIHtcbiAgICByZXR1cm4gbGlzdGVuZXIucXVhbGlmaWVyICE9IG51bGwgPyBldmVudE9iai50YXJnZXQgOiBlbGU7XG4gIH0sXG4gIGJlZm9yZUVtaXQ6IGZ1bmN0aW9uIGJlZm9yZUVtaXQoY29udGV4dCwgbGlzdGVuZXJcbiAgLyosIGV2ZW50T2JqKi9cbiAgKSB7XG4gICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmNlKSB7XG4gICAgICBsaXN0ZW5lci5jb25mLm9uY2VDb2xsZWN0aW9uLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5xdWFsaWZpZXIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICB9XG4gIH0sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKSA/IGVsZS5wYXJlbnQoKSA6IGVsZS5jeSgpO1xuICB9XG59O1xuXG52YXIgYXJnU2VsZWN0b3IgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG5cbnZhciBlbGVzZm4kbSA9IHtcbiAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuXG4gICAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgICAgX3AuZW1pdHRlciA9IG5ldyBFbWl0dGVyKGVtaXR0ZXJPcHRpb25zLCBlbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVtaXR0ZXI7XG4gIH0sXG4gIG9uOiBmdW5jdGlvbiBvbihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBhcmdTZWwgPSBhcmdTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbCwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjaywge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBvbmNlQ29sbGVjdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBleHRyYVBhcmFtcykge1xuICAgIC8vIGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZW1wdHkgY29sbGVjdGlvbnMgZG9uJ3QgbmVlZCB0byBub3RpZnkgYW55dGhpbmdcbiAgICAvLyBub3RpZnkgcmVuZGVyZXJcblxuXG4gICAgdGhpcy5jeSgpLm5vdGlmeShldmVudCwgdGhpcyk7XG4gICAgdGhpcy5lbWl0KGV2ZW50LCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUkMy5ldmVudEFsaWFzZXNPbihlbGVzZm4kbSk7XG5cbnZhciBlbGVzZm4kbiA9IHtcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgLy8gaW50ZXJuYWwgaGVscGVyIHRvIGdldCBub2RlcyBhbmQgZWRnZXMgYXMgc2VwYXJhdGUgY29sbGVjdGlvbnMgd2l0aCBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgZWxlbWVudHNcbiAgYnlHcm91cDogZnVuY3Rpb24gYnlHcm91cCgpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5zcGF3bigpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcblxuICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlcy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlc1xuICAgIH07XG4gIH0sXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKF9maWx0ZXIsIHRoaXNBcmcpIHtcbiAgICBpZiAoX2ZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjaGVjayB0aGlzIGZpcnN0IGIvYyBpdCdzIHRoZSBtb3N0IGNvbW1vbi9wZXJmb3JtYW50IGNhc2VcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKF9maWx0ZXIpIHx8IGVsZW1lbnRPckNvbGxlY3Rpb24oX2ZpbHRlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoX2ZpbHRlcikuZmlsdGVyKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoZm4oX2ZpbHRlcikpIHtcbiAgICAgIHZhciBmaWx0ZXJFbGVzID0gdGhpcy5zcGF3bigpO1xuICAgICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBpbmNsdWRlID0gdGhpc0FyZyA/IF9maWx0ZXIuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogX2ZpbHRlcihlbGUsIGksIGVsZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlKSB7XG4gICAgICAgICAgZmlsdGVyRWxlcy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlckVsZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oKTsgLy8gaWYgbm90IGhhbmRsZWQgYnkgYWJvdmUsIGdpdmUgJ2VtIGFuIGVtcHR5IGNvbGxlY3Rpb25cbiAgfSxcbiAgbm90OiBmdW5jdGlvbiBub3QodG9SZW1vdmUpIHtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgICAgdG9SZW1vdmUgPSB0aGlzLmZpbHRlcih0b1JlbW92ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpc1tpXTtcbiAgICAgICAgdmFyIHJlbW92ZSA9IHRvUmVtb3ZlLmhhcyhlbGVtZW50KTtcblxuICAgICAgICBpZiAoIXJlbW92ZSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgfSxcbiAgYWJzb2x1dGVDb21wbGVtZW50OiBmdW5jdGlvbiBhYnNvbHV0ZUNvbXBsZW1lbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHJldHVybiBjeS5tdXRhYmxlRWxlbWVudHMoKS5ub3QodGhpcyk7XG4gIH0sXG4gIGludGVyc2VjdDogZnVuY3Rpb24gaW50ZXJzZWN0KG90aGVyKSB7XG4gICAgLy8gaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWQsIHRoZW4gZmlsdGVyIGJ5IGl0IGluc3RlYWRcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gb3RoZXI7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgY29sMSA9IHRoaXM7XG4gICAgdmFyIGNvbDIgPSBvdGhlcjtcbiAgICB2YXIgY29sMVNtYWxsZXIgPSB0aGlzLmxlbmd0aCA8IG90aGVyLmxlbmd0aDtcbiAgICB2YXIgY29sUyA9IGNvbDFTbWFsbGVyID8gY29sMSA6IGNvbDI7XG4gICAgdmFyIGNvbEwgPSBjb2wxU21hbGxlciA/IGNvbDIgOiBjb2wxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gY29sU1tpXTtcblxuICAgICAgaWYgKGNvbEwuaGFzKGVsZSkpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgeG9yOiBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuXG4gICAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChjb2wsIG90aGVyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gY29sW2ldO1xuICAgICAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGluT3RoZXIgPSBvdGhlci5oYXNFbGVtZW50V2l0aElkKGlkKTtcblxuICAgICAgICBpZiAoIWluT3RoZXIpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkKGNvbDEsIGNvbDIpO1xuICAgIGFkZChjb2wyLCBjb2wxKTtcbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIGRpZmY6IGZ1bmN0aW9uIGRpZmYob3RoZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuXG4gICAgaWYgKHN0cmluZyhvdGhlcikpIHtcbiAgICAgIG90aGVyID0gY3kuJChvdGhlcik7XG4gICAgfVxuXG4gICAgdmFyIGxlZnQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBib3RoID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuXG4gICAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChjb2wsIG90aGVyLCByZXRFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gY29sW2ldO1xuICAgICAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGluT3RoZXIgPSBvdGhlci5oYXNFbGVtZW50V2l0aElkKGlkKTtcblxuICAgICAgICBpZiAoaW5PdGhlcikge1xuICAgICAgICAgIGJvdGgubWVyZ2UoZWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBhZGQoY29sMSwgY29sMiwgbGVmdCk7XG4gICAgYWRkKGNvbDIsIGNvbDEsIHJpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogbGVmdCxcbiAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgIGJvdGg6IGJvdGhcbiAgICB9O1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh0b0FkZCkge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoc3RyaW5nKHRvQWRkKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9BZGQ7XG4gICAgICB0b0FkZCA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3blNlbGYoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0b0FkZFtpXTtcbiAgICAgIHZhciBhZGQgPSAhdGhpcy5oYXMoZWxlKTtcblxuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICAvLyBpbiBwbGFjZSBtZXJnZSBvbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHRvQWRkKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcblxuICAgIGlmICghdG9BZGQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0b0FkZCAmJiBzdHJpbmcodG9BZGQpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b0FkZDtcbiAgICAgIHRvQWRkID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICB2YXIgbWFwID0gX3AubWFwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRvQWRkRWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgaWQgPSB0b0FkZEVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdmFyIGFkZCA9ICFtYXAuaGFzKGlkKTtcblxuICAgICAgaWYgKGFkZCkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzW2luZGV4XSA9IHRvQWRkRWxlO1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgZWxlOiB0b0FkZEVsZSxcbiAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHVubWVyZ2VBdDogZnVuY3Rpb24gdW5tZXJnZUF0KGkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBtYXAgPSBfcC5tYXA7IC8vIHJlbW92ZSBlbGVcblxuICAgIHRoaXNbaV0gPSB1bmRlZmluZWQ7XG4gICAgbWFwW1wiZGVsZXRlXCJdKGlkKTtcbiAgICB2YXIgdW5tZXJnZWRMYXN0RWxlID0gaSA9PT0gdGhpcy5sZW5ndGggLSAxOyAvLyByZXBsYWNlIGVtcHR5IHNwb3Qgd2l0aCBsYXN0IGVsZSBpbiBjb2xsZWN0aW9uXG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiAxICYmICF1bm1lcmdlZExhc3RFbGUpIHtcbiAgICAgIHZhciBsYXN0RWxlSSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBsYXN0RWxlID0gdGhpc1tsYXN0RWxlSV07XG4gICAgICB2YXIgbGFzdEVsZUlkID0gbGFzdEVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdGhpc1tsYXN0RWxlSV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzW2ldID0gbGFzdEVsZTtcbiAgICAgIG1hcC5zZXQobGFzdEVsZUlkLCB7XG4gICAgICAgIGVsZTogbGFzdEVsZSxcbiAgICAgICAgaW5kZXg6IGlcbiAgICAgIH0pO1xuICAgIH0gLy8gdGhlIGNvbGxlY3Rpb24gaXMgbm93IDEgZWxlIHNtYWxsZXJcblxuXG4gICAgdGhpcy5sZW5ndGgtLTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gcmVtb3ZlIHNpbmdsZSBlbGUgaW4gcGxhY2UgaW4gY2FsbGluZyBjb2xsZWN0aW9uXG4gIHVubWVyZ2VPbmU6IGZ1bmN0aW9uIHVubWVyZ2VPbmUoZWxlKSB7XG4gICAgZWxlID0gZWxlWzBdO1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgdmFyIG1hcCA9IF9wLm1hcDtcbiAgICB2YXIgZW50cnkgPSBtYXAuZ2V0KGlkKTtcblxuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBubyBuZWVkIHRvIHJlbW92ZVxuICAgIH1cblxuICAgIHZhciBpID0gZW50cnkuaW5kZXg7XG4gICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBlbGVzIGluIHBsYWNlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlOiBmdW5jdGlvbiB1bm1lcmdlKHRvUmVtb3ZlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcblxuICAgIGlmICghdG9SZW1vdmUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0b1JlbW92ZSAmJiBzdHJpbmcodG9SZW1vdmUpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSB0b1JlbW92ZTtcbiAgICAgIHRvUmVtb3ZlID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVubWVyZ2VPbmUodG9SZW1vdmVbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICB1bm1lcmdlQnk6IGZ1bmN0aW9uIHVubWVyZ2VCeSh0b1JtRm4pIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG5cbiAgICAgIGlmICh0b1JtRm4oZWxlKSkge1xuICAgICAgICB0aGlzLnVubWVyZ2VBdChpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgbWFwOiBmdW5jdGlvbiBtYXAobWFwRm4sIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciByZXQgPSB0aGlzQXJnID8gbWFwRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogbWFwRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGFyci5wdXNoKHJldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfSxcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkge1xuICAgIHZhciB2YWwgPSBpbml0aWFsVmFsdWU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWwgPSBmbih2YWwsIGVsZXNbaV0sIGksIGVsZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICB2YXIgbWF4RWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpc0FyZyA/IHZhbEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IHZhbEZuKGVsZSwgaSwgZWxlcyk7XG5cbiAgICAgIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsO1xuICAgICAgICBtYXhFbGUgPSBlbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtYXgsXG4gICAgICBlbGU6IG1heEVsZVxuICAgIH07XG4gIH0sXG4gIG1pbjogZnVuY3Rpb24gbWluKHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1pbiA9IEluZmluaXR5O1xuICAgIHZhciBtaW5FbGU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciB2YWwgPSB0aGlzQXJnID8gdmFsRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogdmFsRm4oZWxlLCBpLCBlbGVzKTtcblxuICAgICAgaWYgKHZhbCA8IG1pbikge1xuICAgICAgICBtaW4gPSB2YWw7XG4gICAgICAgIG1pbkVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG1pbixcbiAgICAgIGVsZTogbWluRWxlXG4gICAgfTtcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG52YXIgZm4kNSA9IGVsZXNmbiRuO1xuZm4kNVsndSddID0gZm4kNVsnfCddID0gZm4kNVsnKyddID0gZm4kNS51bmlvbiA9IGZuJDUub3IgPSBmbiQ1LmFkZDtcbmZuJDVbJ1xcXFwnXSA9IGZuJDVbJyEnXSA9IGZuJDVbJy0nXSA9IGZuJDUuZGlmZmVyZW5jZSA9IGZuJDUucmVsYXRpdmVDb21wbGVtZW50ID0gZm4kNS5zdWJ0cmFjdCA9IGZuJDUubm90O1xuZm4kNVsnbiddID0gZm4kNVsnJiddID0gZm4kNVsnLiddID0gZm4kNS5hbmQgPSBmbiQ1LmludGVyc2VjdGlvbiA9IGZuJDUuaW50ZXJzZWN0O1xuZm4kNVsnXiddID0gZm4kNVsnKCspJ10gPSBmbiQ1WycoLSknXSA9IGZuJDUuc3ltbWV0cmljRGlmZmVyZW5jZSA9IGZuJDUuc3ltZGlmZiA9IGZuJDUueG9yO1xuZm4kNS5mbkZpbHRlciA9IGZuJDUuZmlsdGVyRm4gPSBmbiQ1LnN0ZEZpbHRlciA9IGZuJDUuZmlsdGVyO1xuZm4kNS5jb21wbGVtZW50ID0gZm4kNS5hYnNjb21wID0gZm4kNS5hYnNvbHV0ZUNvbXBsZW1lbnQ7XG5cbnZhciBlbGVzZm4kbyA9IHtcbiAgaXNOb2RlOiBmdW5jdGlvbiBpc05vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA9PT0gJ25vZGVzJztcbiAgfSxcbiAgaXNFZGdlOiBmdW5jdGlvbiBpc0VkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA9PT0gJ2VkZ2VzJztcbiAgfSxcbiAgaXNMb29wOiBmdW5jdGlvbiBpc0xvb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgJiYgdGhpcy5zb3VyY2UoKVswXSA9PT0gdGhpcy50YXJnZXQoKVswXTtcbiAgfSxcbiAgaXNTaW1wbGU6IGZ1bmN0aW9uIGlzU2ltcGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRnZSgpICYmIHRoaXMuc291cmNlKClbMF0gIT09IHRoaXMudGFyZ2V0KClbMF07XG4gIH0sXG4gIGdyb3VwOiBmdW5jdGlvbiBncm91cCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZ3JvdXA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqICBFbGVtZW50cyBhcmUgZHJhd24gaW4gYSBzcGVjaWZpYyBvcmRlciBiYXNlZCBvbiBjb21wb3VuZCBkZXB0aCAobG93IHRvIGhpZ2gpLCB0aGUgZWxlbWVudCB0eXBlIChub2RlcyBhYm92ZSBlZGdlcyksXG4gKiAgYW5kIHotaW5kZXggKGxvdyB0byBoaWdoKS4gIFRoZXNlIHN0eWxlcyBhZmZlY3QgaG93IHRoaXMgYXBwbGllczpcbiAqXG4gKiAgei1jb21wb3VuZC1kZXB0aDogTWF5IGJlIGBib3R0b20gfCBvcnBoYW4gfCBhdXRvIHwgdG9wYC4gIFRoZSBmaXJzdCBkcmF3biBpcyBgYm90dG9tYCwgdGhlbiBgb3JwaGFuYCB3aGljaCBpcyB0aGVcbiAqICAgICAgc2FtZSBkZXB0aCBhcyB0aGUgcm9vdCBvZiB0aGUgY29tcG91bmQgZ3JhcGgsIGZvbGxvd2VkIGJ5IHRoZSBkZWZhdWx0IHZhbHVlIGBhdXRvYCB3aGljaCBkcmF3cyBpbiBvcmRlciBmcm9tXG4gKiAgICAgIHJvb3QgdG8gbGVhdmVzIG9mIHRoZSBjb21wb3VuZCBncmFwaC4gIFRoZSBsYXN0IGRyYXduIGlzIGB0b3BgLlxuICogIHotaW5kZXgtY29tcGFyZTogTWF5IGJlIGBhdXRvIHwgbWFudWFsYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBhdXRvYCB3aGljaCBhbHdheXMgZHJhd3MgZWRnZXMgdW5kZXIgbm9kZXMuXG4gKiAgICAgIGBtYW51YWxgIGlnbm9yZXMgdGhpcyBjb252ZW50aW9uIGFuZCBkcmF3cyBiYXNlZCBvbiB0aGUgYHotaW5kZXhgIHZhbHVlIHNldHRpbmcuXG4gKiAgei1pbmRleDogQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHJlbGF0aXZlIGRyYXcgb3JkZXIgb2YgZWxlbWVudHMuICBJbiBnZW5lcmFsLCBhbiBlbGVtZW50IHdpdGggYSBoaWdoZXJcbiAqICAgICAgYHotaW5kZXhgIHdpbGwgYmUgZHJhd24gb24gdG9wIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGxvd2VyIGB6LWluZGV4YC5cbiAqL1xuXG52YXIgekluZGV4U29ydCA9IGZ1bmN0aW9uIHpJbmRleFNvcnQoYSwgYikge1xuICB2YXIgY3kgPSBhLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gIGZ1bmN0aW9uIGdldERlcHRoKGVsZSkge1xuICAgIHZhciBzdHlsZSA9IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKTtcblxuICAgIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gaGFzQ29tcG91bmROb2RlcyA/IGVsZS56RGVwdGgoKSA6IDA7XG4gICAgfSBlbHNlIGlmIChzdHlsZS52YWx1ZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAndG9wJykge1xuICAgICAgcmV0dXJuIE1BWF9JTlQ7XG4gICAgfSAvLyAnb3JwaGFuJ1xuXG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBkZXB0aERpZmYgPSBnZXREZXB0aChhKSAtIGdldERlcHRoKGIpO1xuXG4gIGlmIChkZXB0aERpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZGVwdGhEaWZmO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxlRGVwdGgoZWxlKSB7XG4gICAgdmFyIHN0eWxlID0gZWxlLnBzdHlsZSgnei1pbmRleC1jb21wYXJlJyk7XG5cbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSA/IDEgOiAwO1xuICAgIH0gLy8gJ21hbnVhbCdcblxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgZWxlRGlmZiA9IGdldEVsZURlcHRoKGEpIC0gZ2V0RWxlRGVwdGgoYik7XG5cbiAgaWYgKGVsZURpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZWxlRGlmZjtcbiAgfVxuXG4gIHZhciB6RGlmZiA9IGEucHN0eWxlKCd6LWluZGV4JykudmFsdWUgLSBiLnBzdHlsZSgnei1pbmRleCcpLnZhbHVlO1xuXG4gIGlmICh6RGlmZiAhPT0gMCkge1xuICAgIHJldHVybiB6RGlmZjtcbiAgfSAvLyBjb21wYXJlIGluZGljZXMgaW4gdGhlIGNvcmUgKG9yZGVyIGFkZGVkIHRvIGdyYXBoIHcvIGxhc3Qgb24gdG9wKVxuXG5cbiAgcmV0dXJuIGEucG9vbEluZGV4KCkgLSBiLnBvb2xJbmRleCgpO1xufTtcblxudmFyIGVsZXNmbiRwID0ge1xuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuJDEsIHRoaXNBcmcpIHtcbiAgICBpZiAoZm4oZm4kMSkpIHtcbiAgICAgIHZhciBOID0gdGhpcy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IGZuJDEuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgdGhpc10pIDogZm4kMShlbGUsIGksIHRoaXMpO1xuXG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gZXhpdCBlYWNoIGVhcmx5IG9uIHJldHVybiBmYWxzZVxuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycmF5LnB1c2godGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciB0aGlzU2l6ZSA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICBlbmQgPSB0aGlzU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPT0gbnVsbCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gdGhpc1NpemUgKyBzdGFydDtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kID0gdGhpc1NpemUgKyBlbmQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpID49IDAgJiYgaSA8IGVuZCAmJiBpIDwgdGhpc1NpemU7IGkrKykge1xuICAgICAgYXJyYXkucHVzaCh0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihhcnJheSk7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICB9LFxuICBlcTogZnVuY3Rpb24gZXEoaSkge1xuICAgIHJldHVybiB0aGlzW2ldIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzWzBdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgbGFzdDogZnVuY3Rpb24gbGFzdCgpIHtcbiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfSxcbiAgbm9uZW1wdHk6IGZ1bmN0aW9uIG5vbmVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lbXB0eSgpO1xuICB9LFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KHNvcnRGbikge1xuICAgIGlmICghZm4oc29ydEZuKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHNvcnRlZCA9IHRoaXMudG9BcnJheSgpLnNvcnQoc29ydEZuKTtcbiAgICByZXR1cm4gdGhpcy5zcGF3bihzb3J0ZWQpO1xuICB9LFxuICBzb3J0QnlaSW5kZXg6IGZ1bmN0aW9uIHNvcnRCeVpJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0KHpJbmRleFNvcnQpO1xuICB9LFxuICB6RGVwdGg6IGZ1bmN0aW9uIHpEZXB0aCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmICghZWxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gLy8gbGV0IGN5ID0gZWxlLmN5KCk7XG5cblxuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgZ3JvdXAgPSBfcC5ncm91cDtcblxuICAgIGlmIChncm91cCA9PT0gJ25vZGVzJykge1xuICAgICAgdmFyIGRlcHRoID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpLnNpemUoKSA6IDA7XG5cbiAgICAgIGlmICghZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIE1BWF9JTlQgLSAxOyAvLyBjaGlsZGxlc3Mgbm9kZXMgYWx3YXlzIG9uIHRvcFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVwdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgICAgdmFyIHNyY0RlcHRoID0gc3JjLnpEZXB0aCgpO1xuICAgICAgdmFyIHRndERlcHRoID0gdGd0LnpEZXB0aCgpO1xuICAgICAgcmV0dXJuIE1hdGgubWF4KHNyY0RlcHRoLCB0Z3REZXB0aCwgMCk7IC8vIGRlcHRoIG9mIGRlZXBlc3QgcGFyZW50XG4gICAgfVxuICB9XG59O1xuZWxlc2ZuJHAuZWFjaCA9IGVsZXNmbiRwLmZvckVhY2g7XG5cbnZhciBkZWZpbmVTeW1ib2xJdGVyYXRvciA9IGZ1bmN0aW9uIGRlZmluZVN5bWJvbEl0ZXJhdG9yKCkge1xuICB2YXIgdHlwZW9mVW5kZWYgPSAgXCJ1bmRlZmluZWRcIiA7XG4gIHZhciBpc0l0ZXJhdG9yU3VwcG9ydGVkID0gKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihTeW1ib2wpKSAhPSB0eXBlb2ZVbmRlZiAmJiBfdHlwZW9mKFN5bWJvbC5pdGVyYXRvcikgIT0gdHlwZW9mVW5kZWY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBpZiAoaXNJdGVyYXRvclN1cHBvcnRlZCkge1xuICAgIGVsZXNmbiRwW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIGkgPSAwO1xuICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gX3RoaXNbaSsrXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgIH0sIFN5bWJvbC5pdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTtcblxuZGVmaW5lU3ltYm9sSXRlcmF0b3IoKTtcblxudmFyIGdldExheW91dERpbWVuc2lvbk9wdGlvbnMgPSBkZWZhdWx0cyh7XG4gIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRxID0ge1xuICAvLyBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIG5vZGUgZGltZW5zaW9ucyB7IHgsIHkgfSBiYXNlZCBvbiBvcHRpb25zIGdpdmVuXG4gIGxheW91dERpbWVuc2lvbnM6IGZ1bmN0aW9uIGxheW91dERpbWVuc2lvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZXRMYXlvdXREaW1lbnNpb25PcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBkaW1zO1xuXG4gICAgaWYgKCF0aGlzLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiAwLFxuICAgICAgICBoOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgIHZhciBiYkRpbSA9IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IGJiRGltLncsXG4gICAgICAgIGg6IGJiRGltLmhcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IHRoaXMub3V0ZXJXaWR0aCgpLFxuICAgICAgICBoOiB0aGlzLm91dGVySGVpZ2h0KClcbiAgICAgIH07XG4gICAgfSAvLyBzYW5pdGlzZSB0aGUgZGltZW5zaW9ucyBmb3IgZXh0ZXJuYWwgbGF5b3V0cyAoYXZvaWQgZGl2aXNpb24gYnkgemVybylcblxuXG4gICAgaWYgKGRpbXMudyA9PT0gMCB8fCBkaW1zLmggPT09IDApIHtcbiAgICAgIGRpbXMudyA9IGRpbXMuaCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpbXM7XG4gIH0sXG4gIC8vIHVzaW5nIHN0YW5kYXJkIGxheW91dCBvcHRpb25zLCBhcHBseSBwb3NpdGlvbiBmdW5jdGlvbiAody8gb3Igdy9vIGFuaW1hdGlvbilcbiAgbGF5b3V0UG9zaXRpb25zOiBmdW5jdGlvbiBsYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBmbikge1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiAhbi5pc1BhcmVudCgpO1xuICAgIH0pO1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICB2YXIgbGF5b3V0RWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gbm9kZXMgJiBlZGdlc1xuXG4gICAgdmFyIGdldE1lbW9pemVLZXkgPSBmdW5jdGlvbiBnZXRNZW1vaXplS2V5KG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmlkKCk7XG4gICAgfTtcblxuICAgIHZhciBmbk1lbSA9IG1lbW9pemUoZm4sIGdldE1lbW9pemVLZXkpOyAvLyBtZW1vaXplZCB2ZXJzaW9uIG9mIHBvc2l0aW9uIGZ1bmN0aW9uXG5cbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0c3RhcnQnLFxuICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICB9KTtcbiAgICBsYXlvdXQuYW5pbWF0aW9ucyA9IFtdO1xuXG4gICAgdmFyIGNhbGN1bGF0ZVNwYWNpbmcgPSBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKHNwYWNpbmcsIG5vZGVzQmIsIHBvcykge1xuICAgICAgdmFyIGNlbnRlciA9IHtcbiAgICAgICAgeDogbm9kZXNCYi54MSArIG5vZGVzQmIudyAvIDIsXG4gICAgICAgIHk6IG5vZGVzQmIueTEgKyBub2Rlc0JiLmggLyAyXG4gICAgICB9O1xuICAgICAgdmFyIHNwYWNpbmdWZWN0b3IgPSB7XG4gICAgICAgIC8vIHNjYWxlIGZyb20gY2VudGVyIG9mIGJvdW5kaW5nIGJveCAobm90IG5lY2Vzc2FyaWx5IDAsMClcbiAgICAgICAgeDogKHBvcy54IC0gY2VudGVyLngpICogc3BhY2luZyxcbiAgICAgICAgeTogKHBvcy55IC0gY2VudGVyLnkpICogc3BhY2luZ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgc3BhY2luZ1ZlY3Rvci54LFxuICAgICAgICB5OiBjZW50ZXIueSArIHNwYWNpbmdWZWN0b3IueVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIHVzZVNwYWNpbmdGYWN0b3IgPSBvcHRpb25zLnNwYWNpbmdGYWN0b3IgJiYgb3B0aW9ucy5zcGFjaW5nRmFjdG9yICE9PSAxO1xuXG4gICAgdmFyIHNwYWNpbmdCYiA9IGZ1bmN0aW9uIHNwYWNpbmdCYigpIHtcbiAgICAgIGlmICghdXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcyA9IGZuTWVtKG5vZGUsIGkpO1xuICAgICAgICBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHBvcy54LCBwb3MueSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYjtcbiAgICB9O1xuXG4gICAgdmFyIGJiID0gc3BhY2luZ0JiKCk7XG4gICAgdmFyIGdldEZpbmFsUG9zID0gbWVtb2l6ZShmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgICAgdmFyIG5ld1BvcyA9IGZuTWVtKG5vZGUsIGkpO1xuXG4gICAgICBpZiAodXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICB2YXIgc3BhY2luZyA9IE1hdGguYWJzKG9wdGlvbnMuc3BhY2luZ0ZhY3Rvcik7XG4gICAgICAgIG5ld1BvcyA9IGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgYmIsIG5ld1Bvcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zZm9ybSAhPSBudWxsKSB7XG4gICAgICAgIG5ld1BvcyA9IG9wdGlvbnMudHJhbnNmb3JtKG5vZGUsIG5ld1Bvcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdQb3M7XG4gICAgfSwgZ2V0TWVtb2l6ZUtleSk7XG5cbiAgICBpZiAob3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBuZXdQb3MgPSBnZXRGaW5hbFBvcyhub2RlLCBpKTtcbiAgICAgICAgdmFyIGFuaW1hdGVOb2RlID0gb3B0aW9ucy5hbmltYXRlRmlsdGVyID09IG51bGwgfHwgb3B0aW9ucy5hbmltYXRlRmlsdGVyKG5vZGUsIGkpO1xuXG4gICAgICAgIGlmIChhbmltYXRlTm9kZSkge1xuICAgICAgICAgIHZhciBhbmkgPSBub2RlLmFuaW1hdGlvbih7XG4gICAgICAgICAgICBwb3NpdGlvbjogbmV3UG9zLFxuICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGF5b3V0LmFuaW1hdGlvbnMucHVzaChhbmkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUucG9zaXRpb24obmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgdmFyIGZpdEFuaSA9IGN5LmFuaW1hdGlvbih7XG4gICAgICAgICAgZml0OiB7XG4gICAgICAgICAgICBib3VuZGluZ0JveDogbGF5b3V0RWxlcy5ib3VuZGluZ0JveEF0KGdldEZpbmFsUG9zKSxcbiAgICAgICAgICAgIHBhZGRpbmc6IG9wdGlvbnMucGFkZGluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICB9KTtcbiAgICAgICAgbGF5b3V0LmFuaW1hdGlvbnMucHVzaChmaXRBbmkpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnpvb20gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnBhbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciB6b29tUGFuQW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20sXG4gICAgICAgICAgcGFuOiBvcHRpb25zLnBhbixcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKHpvb21QYW5BbmkpO1xuICAgICAgfVxuXG4gICAgICBsYXlvdXQuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wbGF5KCk7XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UkMS5hbGwobGF5b3V0LmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wcm9taXNlKCk7XG4gICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzLnBvc2l0aW9ucyhnZXRGaW5hbFBvcyk7XG5cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICBjeS5maXQob3B0aW9ucy5lbGVzLCBvcHRpb25zLnBhZGRpbmcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy56b29tICE9IG51bGwpIHtcbiAgICAgICAgY3kuem9vbShvcHRpb25zLnpvb20pO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5wYW4pIHtcbiAgICAgICAgY3kucGFuKG9wdGlvbnMucGFuKTtcbiAgICAgIH1cblxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgIGxheW91dC5lbWl0KHtcbiAgICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBsYXlvdXQ6IGZ1bmN0aW9uIGxheW91dChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHJldHVybiBjeS5tYWtlTGF5b3V0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgZWxlczogdGhpc1xuICAgIH0pKTtcbiAgfVxufTsgLy8gYWxpYXNlczpcblxuZWxlc2ZuJHEuY3JlYXRlTGF5b3V0ID0gZWxlc2ZuJHEubWFrZUxheW91dCA9IGVsZXNmbiRxLmxheW91dDtcblxuZnVuY3Rpb24gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgY2FjaGUgPSBfcC5zdHlsZUNhY2hlID0gX3Auc3R5bGVDYWNoZSB8fCBbXTtcbiAgdmFyIHZhbDtcblxuICBpZiAoKHZhbCA9IGNhY2hlW2tleV0pICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9IGVsc2Uge1xuICAgIHZhbCA9IGNhY2hlW2tleV0gPSBmbihlbGUpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVTdHlsZUZ1bmN0aW9uKGtleSwgZm4pIHtcbiAga2V5ID0gaGFzaFN0cmluZyhrZXkpO1xuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkU3R5bGVGdW5jdGlvbihlbGUpIHtcbiAgICByZXR1cm4gc3R5bGVDYWNoZShrZXksIGZuLCBlbGUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oa2V5LCBmbikge1xuICBrZXkgPSBoYXNoU3RyaW5nKGtleSk7XG5cbiAgdmFyIHNlbGZGbiA9IGZ1bmN0aW9uIHNlbGZGbihlbGUpIHtcbiAgICByZXR1cm4gZm4uY2FsbChlbGUpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBzZWxmRm4sIGVsZSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZWxlc2ZuJHIgPSB7XG4gIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZTogZnVuY3Rpb24gcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHVzZUNhY2hlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciByZW5kZXJlciA9IGN5LnJlbmRlcmVyKCk7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5LnN0eWxlRW5hYmxlZCgpO1xuXG4gICAgaWYgKHJlbmRlcmVyICYmIHN0eWxlRW5hYmxlZCkge1xuICAgICAgcmVuZGVyZXIucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHRoaXMsIHVzZUNhY2hlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGlydHlTdHlsZUNhY2hlOiBmdW5jdGlvbiBkaXJ0eVN0eWxlQ2FjaGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgdmFyIGRpcnR5ID0gZnVuY3Rpb24gZGlydHkoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlQ2FjaGUgPSBudWxsO1xuICAgIH07XG5cbiAgICBpZiAoY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICB2YXIgZWxlcztcbiAgICAgIGVsZXMgPSB0aGlzLnNwYXduU2VsZigpLm1lcmdlKHRoaXMuZGVzY2VuZGFudHMoKSkubWVyZ2UodGhpcy5wYXJlbnRzKCkpO1xuICAgICAgZWxlcy5tZXJnZShlbGVzLmNvbm5lY3RlZEVkZ2VzKCkpO1xuICAgICAgZWxlcy5mb3JFYWNoKGRpcnR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgZGlydHkoZWxlKTtcbiAgICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChkaXJ0eSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZnVsbHkgdXBkYXRlcyAocmVjYWxjdWxhdGVzKSB0aGUgc3R5bGUgZm9yIHRoZSBlbGVtZW50c1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU3R5bGUobm90aWZ5UmVuZGVyZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGN5LmJhdGNoaW5nKCkpIHtcbiAgICAgIHZhciBiRWxlcyA9IGN5Ll9wcml2YXRlLmJhdGNoU3R5bGVFbGVzO1xuICAgICAgYkVsZXMubWVyZ2UodGhpcyk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmcgYW5kIGV4aXQgZWFybHkgd2hlbiBiYXRjaGluZ1xuICAgIH1cblxuICAgIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgdmFyIHVwZGF0ZWRFbGVzID0gdGhpcztcbiAgICBub3RpZnlSZW5kZXJlciA9IG5vdGlmeVJlbmRlcmVyIHx8IG5vdGlmeVJlbmRlcmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG5cbiAgICBpZiAoaGFzQ29tcG91bmRzKSB7XG4gICAgICAvLyB0aGVuIGFkZCBldmVyeXRoaW5nIHVwIGFuZCBkb3duIGZvciBjb21wb3VuZCBzZWxlY3RvciBjaGVja3NcbiAgICAgIHVwZGF0ZWRFbGVzID0gdGhpcy5zcGF3blNlbGYoKS5tZXJnZSh0aGlzLmRlc2NlbmRhbnRzKCkpLm1lcmdlKHRoaXMucGFyZW50cygpKTtcbiAgICB9IC8vIGxldCBjaGFuZ2VkRWxlcyA9IHN0eWxlLmFwcGx5KCB1cGRhdGVkRWxlcyApO1xuXG5cbiAgICB2YXIgY2hhbmdlZEVsZXMgPSB1cGRhdGVkRWxlcztcblxuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgY2hhbmdlZEVsZXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHJlbmRlcmVyIGtub3cgd2UgY2hhbmdlZCBzdHlsZVxuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0KCdzdHlsZScpOyAvLyBqdXN0IGZpcmUgdGhlIGV2ZW50XG4gICAgfVxuXG4gICAgdXBkYXRlZEVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICAvLyBwcml2YXRlOiBjbGVhcnMgZGlydHkgZmxhZyBhbmQgcmVjYWxjdWxhdGVzIHN0eWxlXG4gIGNsZWFuU3R5bGU6IGZ1bmN0aW9uIGNsZWFuU3R5bGUoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG5cbiAgICAgIGlmIChlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSkge1xuICAgICAgICAvLyBuLmIuIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJlZm9yZSBhcHBseSgpIHRvIGF2b2lkIHBvdGVudGlhbCBpbmZpbml0ZSByZWN1cnNpb25cbiAgICAgICAgZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgY3kuc3R5bGUoKS5hcHBseShlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBpbnRlcm5hbCBwYXJzZWQgc3R5bGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gIHBhcnNlZFN0eWxlOiBmdW5jdGlvbiBwYXJzZWRTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBpbmNsdWRlTm9uRGVmYXVsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB0aGlzLmNsZWFuU3R5bGUoKTtcbiAgICAgIHZhciBvdmVycmlkZGVuU3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGVbcHJvcGVydHldO1xuXG4gICAgICBpZiAob3ZlcnJpZGRlblN0eWxlICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRkZW5TdHlsZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZU5vbkRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIGN5LnN0eWxlKCkuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbnVtZXJpY1N0eWxlOiBmdW5jdGlvbiBudW1lcmljU3R5bGUocHJvcGVydHkpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICB2YXIgcHN0eWxlID0gZWxlLnBzdHlsZShwcm9wZXJ0eSk7XG4gICAgICByZXR1cm4gcHN0eWxlLnBmVmFsdWUgIT09IHVuZGVmaW5lZCA/IHBzdHlsZS5wZlZhbHVlIDogcHN0eWxlLnZhbHVlO1xuICAgIH1cbiAgfSxcbiAgbnVtZXJpY1N0eWxlVW5pdHM6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZVVuaXRzKHByb3BlcnR5KSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoIWVsZS5jeSgpLnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUocHJvcGVydHkpLnVuaXRzO1xuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgY3NzIHByb3BlcnR5IGFzIGEgcmVuZGVyZWQgdmFsdWUgKGkuZS4gb24tc2NyZWVuIHZhbHVlKVxuICAvLyBvciBnZXQgdGhlIHdob2xlIHJlbmRlcmVkIHN0eWxlIGlmIG5vIHByb3BlcnR5IHNwZWNpZmllZCAoTkIgZG9lc24ndCBhbGxvdyBzZXR0aW5nKVxuICByZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZW5kZXJlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXRSZW5kZXJlZFN0eWxlKGVsZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfSxcbiAgLy8gcmVhZCB0aGUgY2FsY3VsYXRlZCBjc3Mgc3R5bGUgb2YgdGhlIGVsZW1lbnQgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlICh2aWEgYSBieXBhc3MpXG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciB1cGRhdGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuICAgIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgICBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgIC8vIHRoZW4gZXh0ZW5kIHRoZSBieXBhc3NcbiAgICAgIHZhciBwcm9wcyA9IG5hbWU7XG4gICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBwcm9wcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc3R5bGVcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbMF07XG5cbiAgICAgICAgaWYgKGVsZSkge1xuICAgICAgICAgIHJldHVybiBzdHlsZS5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9uID0+IGNhbid0IGdldCBhbnkgdmFsdWVcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZW4gc2V0IHRoZSBieXBhc3Mgd2l0aCB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgc3R5bGUuYXBwbHlCeXBhc3ModGhpcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2VsZSA9IHRoaXNbMF07XG5cbiAgICAgIGlmIChfZWxlKSB7XG4gICAgICAgIHJldHVybiBzdHlsZS5nZXRSYXdTdHlsZShfZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb24gPT4gY2FuJ3QgZ2V0IGFueSB2YWx1ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHJlbW92ZVN0eWxlOiBmdW5jdGlvbiByZW1vdmVTdHlsZShuYW1lcykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciB1cGRhdGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuICAgIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgaWYgKG5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgc3R5bGUucmVtb3ZlQWxsQnlwYXNzZXMoZWxlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXMuc3BsaXQoL1xccysvKTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBfZWxlMiA9IGVsZXNbX2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVCeXBhc3NlcyhfZWxlMiwgbmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7IC8vIGxldCB0aGUgcmVuZGVyZXIga25vdyB3ZSd2ZSB1cGRhdGVkIHN0eWxlXG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdlbGVtZW50Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgdGhpcy5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBlZmZlY3RpdmVPcGFjaXR5OiBmdW5jdGlvbiBlZmZlY3RpdmVPcGFjaXR5KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgdmFyIHBhcmVudE9wYWNpdHkgPSBlbGUucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG5cbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gcGFyZW50T3BhY2l0eTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudHMgPSAhX3AuZGF0YS5wYXJlbnQgPyBudWxsIDogZWxlLnBhcmVudHMoKTtcblxuICAgICAgaWYgKHBhcmVudHMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbaV07XG4gICAgICAgICAgdmFyIG9wYWNpdHkgPSBwYXJlbnQucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gICAgICAgICAgcGFyZW50T3BhY2l0eSA9IG9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgIH1cbiAgfSxcbiAgdHJhbnNwYXJlbnQ6IGZ1bmN0aW9uIHRyYW5zcGFyZW50KCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGVsZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmICghaGFzQ29tcG91bmROb2Rlcykge1xuICAgICAgICByZXR1cm4gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlID09PSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBiYWNrZ3JvdW5kaW5nOiBmdW5jdGlvbiBiYWNrZ3JvdW5kaW5nKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmJhY2tncm91bmRpbmcgPyB0cnVlIDogZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPaykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwYXJlbnRzID0gX3AuZGF0YS5wYXJlbnQgPyBlbGUucGFyZW50cygpIDogbnVsbDtcblxuICBpZiAocGFyZW50cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbaV07XG5cbiAgICAgIGlmICghcGFyZW50T2socGFyZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHNwZWNzKSB7XG4gIHZhciBvayA9IHNwZWNzLm9rO1xuICB2YXIgZWRnZU9rVmlhTm9kZSA9IHNwZWNzLmVkZ2VPa1ZpYU5vZGUgfHwgc3BlY3Mub2s7XG4gIHZhciBwYXJlbnRPayA9IHNwZWNzLnBhcmVudE9rIHx8IHNwZWNzLm9rO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuXG4gICAgICBpZiAoIW9rKGVsZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKGVsZSwgcGFyZW50T2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICAgICAgcmV0dXJuIGVkZ2VPa1ZpYU5vZGUoc3JjKSAmJiAoIWhhc0NvbXBvdW5kTm9kZXMgfHwgY2hlY2tDb21wb3VuZChzcmMsIGVkZ2VPa1ZpYU5vZGUpKSAmJiAoc3JjID09PSB0Z3QgfHwgZWRnZU9rVmlhTm9kZSh0Z3QpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHRndCwgZWRnZU9rVmlhTm9kZSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciBlbGVUYWtlc1VwU3BhY2UgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVRha2VzVXBTcGFjZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ2VsZW1lbnQnICYmIGVsZS53aWR0aCgpICE9PSAwICYmIChlbGUuaXNOb2RlKCkgPyBlbGUuaGVpZ2h0KCkgIT09IDAgOiB0cnVlKTtcbn0pO1xuZWxlc2ZuJHIudGFrZXNVcFNwYWNlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd0YWtlc1VwU3BhY2UnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVUYWtlc1VwU3BhY2Vcbn0pKTtcbnZhciBlbGVJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlSW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdldmVudHMnKS52YWx1ZSA9PT0gJ3llcycgJiYgZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBwYXJlbnRJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbigncGFyZW50SW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAocGFyZW50KSB7XG4gIHJldHVybiBwYXJlbnQucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGVUYWtlc1VwU3BhY2UocGFyZW50KTtcbn0pO1xuZWxlc2ZuJHIuaW50ZXJhY3RpdmUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2ludGVyYWN0aXZlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlSW50ZXJhY3RpdmUsXG4gIHBhcmVudE9rOiBwYXJlbnRJbnRlcmFjdGl2ZSxcbiAgZWRnZU9rVmlhTm9kZTogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG5cbmVsZXNmbiRyLm5vbmludGVyYWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcblxuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuaW50ZXJhY3RpdmUoKTtcbiAgfVxufTtcblxudmFyIGVsZVZpc2libGUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVZpc2libGUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGUucHN0eWxlKCdvcGFjaXR5JykucGZWYWx1ZSAhPT0gMCAmJiBlbGVUYWtlc1VwU3BhY2UoZWxlKTtcbn0pO1xudmFyIGVkZ2VWaXNpYmxlVmlhTm9kZSA9IGVsZVRha2VzVXBTcGFjZTtcbmVsZXNmbiRyLnZpc2libGUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ3Zpc2libGUnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVWaXNpYmxlLFxuICBlZGdlT2tWaWFOb2RlOiBlZGdlVmlzaWJsZVZpYU5vZGVcbn0pKTtcblxuZWxlc2ZuJHIuaGlkZGVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcblxuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59O1xuXG5lbGVzZm4kci5pc0J1bmRsZWRCZXppZXIgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2lzQnVuZGxlZEJlemllcicsIGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gIXRoaXMucmVtb3ZlZCgpICYmIHRoaXMucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlID09PSAnYmV6aWVyJyAmJiB0aGlzLnRha2VzVXBTcGFjZSgpO1xufSk7XG5lbGVzZm4kci5ieXBhc3MgPSBlbGVzZm4kci5jc3MgPSBlbGVzZm4kci5zdHlsZTtcbmVsZXNmbiRyLnJlbmRlcmVkQ3NzID0gZWxlc2ZuJHIucmVuZGVyZWRTdHlsZTtcbmVsZXNmbiRyLnJlbW92ZUJ5cGFzcyA9IGVsZXNmbiRyLnJlbW92ZUNzcyA9IGVsZXNmbiRyLnJlbW92ZVN0eWxlO1xuZWxlc2ZuJHIucHN0eWxlID0gZWxlc2ZuJHIucGFyc2VkU3R5bGU7XG5cbnZhciBlbGVzZm4kcyA9IHt9O1xuXG5mdW5jdGlvbiBkZWZpbmVTd2l0Y2hGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY2hhbmdlZEVsZXMgPSBbXTsgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggZGF0YSwgaGFuZGxlciApXG5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhciBkYXRhID0gYXJnc1swXTtcbiAgICAgIHZhciBoYW5kbGVyID0gYXJnc1sxXTtcbiAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBkYXRhLCBoYW5kbGVyKTtcbiAgICB9IC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoIGhhbmRsZXIgKVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGZuKGFyZ3NbMF0pKSB7XG4gICAgICAgIHZhciBfaGFuZGxlciA9IGFyZ3NbMF07XG4gICAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBfaGFuZGxlcik7XG4gICAgICB9IC8vIGUuZy4gY3kubm9kZXMoKS5zZWxlY3QoKVxuICAgICAgLy8gZS5nLiAocHJpdmF0ZSkgY3kubm9kZXMoKS5zZWxlY3QoWyd0YXBzZWxlY3QnXSlcbiAgICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3MubGVuZ3RoID09PSAxICYmIGFycmF5KGFyZ3NbMF0pKSB7XG4gICAgICAgICAgdmFyIGFkZGxFdmVudHMgPSBhcmdzLmxlbmd0aCA9PT0gMSA/IGFyZ3NbMF0gOiBudWxsO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgICAgICAgIHZhciBhYmxlID0gIXBhcmFtcy5hYmxlRmllbGQgfHwgZWxlLl9wcml2YXRlW3BhcmFtcy5hYmxlRmllbGRdO1xuICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXSAhPSBwYXJhbXMudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgICAgIHZhciBvdmVycmlkZUFibGUgPSBwYXJhbXMub3ZlcnJpZGVBYmxlKGVsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlQWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYWJsZSA9IG92ZXJyaWRlQWJsZTtcblxuICAgICAgICAgICAgICAgIGlmICghb3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9IC8vIHRvIHNhdmUgY3ljbGVzIGFzc3VtZSBub3QgYWJsZSBmb3IgYWxsIG9uIG92ZXJyaWRlXG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWJsZSkge1xuICAgICAgICAgICAgICBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXSA9IHBhcmFtcy52YWx1ZTtcblxuICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWRFbGVzLnB1c2goZWxlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjaGFuZ2VkQ29sbCA9IHRoaXMuc3Bhd24oY2hhbmdlZEVsZXMpO1xuICAgICAgICAgIGNoYW5nZWRDb2xsLnVwZGF0ZVN0eWxlKCk7IC8vIGNoYW5nZSBvZiBzdGF0ZSA9PiBwb3NzaWJsZSBjaGFuZ2Ugb2Ygc3R5bGVcblxuICAgICAgICAgIGNoYW5nZWRDb2xsLmVtaXQocGFyYW1zLmV2ZW50KTtcblxuICAgICAgICAgIGlmIChhZGRsRXZlbnRzKSB7XG4gICAgICAgICAgICBjaGFuZ2VkQ29sbC5lbWl0KGFkZGxFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmluZVN3aXRjaFNldChwYXJhbXMpIHtcbiAgZWxlc2ZuJHNbcGFyYW1zLmZpZWxkXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVGaWVsZCkge1xuICAgICAgICB2YXIgdmFsID0gcGFyYW1zLm92ZXJyaWRlRmllbGQoZWxlKTtcblxuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXTtcbiAgICB9XG4gIH07XG5cbiAgZWxlc2ZuJHNbcGFyYW1zLm9uXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9uLFxuICAgIGZpZWxkOiBwYXJhbXMuZmllbGQsXG4gICAgYWJsZUZpZWxkOiBwYXJhbXMuYWJsZUZpZWxkLFxuICAgIG92ZXJyaWRlQWJsZTogcGFyYW1zLm92ZXJyaWRlQWJsZSxcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZWxlc2ZuJHNbcGFyYW1zLm9mZl0gPSBkZWZpbmVTd2l0Y2hGdW5jdGlvbih7XG4gICAgZXZlbnQ6IHBhcmFtcy5vZmYsXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiBmYWxzZVxuICB9KTtcbn1cblxuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdsb2NrZWQnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvbG9jaygpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdsb2NrJyxcbiAgb2ZmOiAndW5sb2NrJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2dyYWJiYWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bmdyYWJpZnkoKSB8fCBlbGUucGFubmFibGUoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ2dyYWJpZnknLFxuICBvZmY6ICd1bmdyYWJpZnknXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0ZWQnLFxuICBhYmxlRmllbGQ6ICdzZWxlY3RhYmxlJyxcbiAgb3ZlcnJpZGVBYmxlOiBmdW5jdGlvbiBvdmVycmlkZUFibGUoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0JyxcbiAgb2ZmOiAndW5zZWxlY3QnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlRmllbGQ6IGZ1bmN0aW9uIG92ZXJyaWRlRmllbGQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5jeSgpLmF1dG91bnNlbGVjdGlmeSgpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnc2VsZWN0aWZ5JyxcbiAgb2ZmOiAndW5zZWxlY3RpZnknXG59KTtcbmVsZXNmbiRzLmRlc2VsZWN0ID0gZWxlc2ZuJHMudW5zZWxlY3Q7XG5cbmVsZXNmbiRzLmdyYWJiZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuXG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmdyYWJiZWQ7XG4gIH1cbn07XG5cbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnYWN0aXZlJyxcbiAgb246ICdhY3RpdmF0ZScsXG4gIG9mZjogJ3VuYWN0aXZhdGUnXG59KTtcbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAncGFubmFibGUnLFxuICBvbjogJ3BhbmlmeScsXG4gIG9mZjogJ3VucGFuaWZ5J1xufSk7XG5cbmVsZXNmbiRzLmluYWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcblxuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuX3ByaXZhdGUuYWN0aXZlO1xuICB9XG59O1xuXG52YXIgZWxlc2ZuJHQgPSB7fTsgLy8gREFHIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgZGVmaW5lRGFnRXh0cmVtaXR5ID0gZnVuY3Rpb24gZGVmaW5lRGFnRXh0cmVtaXR5KHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gZGFnRXh0cmVtaXR5SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgcmV0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuXG4gICAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpc3F1YWxpZmllZCA9IGZhbHNlO1xuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuXG4gICAgICAgIGlmIChwYXJhbXMubm9JbmNvbWluZ0VkZ2VzICYmIHRndCA9PT0gZWxlICYmIHNyYyAhPT0gZWxlIHx8IHBhcmFtcy5ub091dGdvaW5nRWRnZXMgJiYgc3JjID09PSBlbGUgJiYgdGd0ICE9PSBlbGUpIHtcbiAgICAgICAgICBkaXNxdWFsaWZpZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlzcXVhbGlmaWVkKSB7XG4gICAgICAgIHJldC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0LCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcblxudmFyIGRlZmluZURhZ09uZUhvcCA9IGZ1bmN0aW9uIGRlZmluZURhZ09uZUhvcChwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgb0VsZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG5cbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWRnZXMgPSBlbGUuY29ubmVjdGVkRWRnZXMoKTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG5cbiAgICAgICAgaWYgKHBhcmFtcy5vdXRnb2luZyAmJiBzcmMgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaCh0Z3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5pbmNvbWluZyAmJiB0Z3QgPT09IGVsZSkge1xuICAgICAgICAgIG9FbGVzLnB1c2goZWRnZSk7XG4gICAgICAgICAgb0VsZXMucHVzaChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ob0VsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xuXG52YXIgZGVmaW5lRGFnQWxsSG9wcyA9IGZ1bmN0aW9uIGRlZmluZURhZ0FsbEhvcHMocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHNFbGVzID0gW107XG4gICAgdmFyIHNFbGVzSWRzID0ge307XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgbmV4dCA9IHBhcmFtcy5vdXRnb2luZyA/IGVsZXMub3V0Z29lcnMoKSA6IGVsZXMuaW5jb21lcnMoKTtcblxuICAgICAgaWYgKG5leHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBkb25lIGlmIG5vbmUgbGVmdFxuXG5cbiAgICAgIHZhciBuZXdOZXh0ID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbiA9IG5leHRbaV07XG4gICAgICAgIHZhciBuaWQgPSBuLmlkKCk7XG5cbiAgICAgICAgaWYgKCFzRWxlc0lkc1tuaWRdKSB7XG4gICAgICAgICAgc0VsZXNJZHNbbmlkXSA9IHRydWU7XG4gICAgICAgICAgc0VsZXMucHVzaChuKTtcbiAgICAgICAgICBuZXdOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5ld05leHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgdG91Y2hlZCBhbGwgb3V0Z29lcnMgYWxyZWFkeVxuXG5cbiAgICAgIGVsZXMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwYXduKHNFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufTtcblxuZWxlc2ZuJHQuY2xlYXJUcmF2ZXJzYWxDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tpXS5fcHJpdmF0ZS50cmF2ZXJzYWxDYWNoZSA9IG51bGw7XG4gIH1cbn07XG5cbmV4dGVuZChlbGVzZm4kdCwge1xuICAvLyBnZXQgdGhlIHJvb3Qgbm9kZXMgaW4gdGhlIERBR1xuICByb290czogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub0luY29taW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIGdldCB0aGUgbGVhZiBub2RlcyBpbiB0aGUgREFHXG4gIGxlYXZlczogZGVmaW5lRGFnRXh0cmVtaXR5KHtcbiAgICBub091dGdvaW5nRWRnZXM6IHRydWVcbiAgfSksXG4gIC8vIG5vcm1hbGx5IGNhbGxlZCBjaGlsZHJlbiBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPWVkZ2VzPT4gb3V0Z29pbmcgbm9kZXNcbiAgb3V0Z29lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgb3V0Z29pbmc6IHRydWVcbiAgfSksICdvdXRnb2VycycpLFxuICAvLyBha2EgREFHIGRlc2NlbmRhbnRzXG4gIHN1Y2Nlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgcGFyZW50cyBpbiBncmFwaCB0aGVvcnlcbiAgLy8gdGhlc2Ugbm9kZXMgPD1lZGdlcz0gaW5jb21pbmcgbm9kZXNcbiAgaW5jb21lcnM6IGNhY2hlKGRlZmluZURhZ09uZUhvcCh7XG4gICAgaW5jb21pbmc6IHRydWVcbiAgfSksICdpbmNvbWVycycpLFxuICAvLyBha2EgREFHIGFuY2VzdG9yc1xuICBwcmVkZWNlc3NvcnM6IGRlZmluZURhZ0FsbEhvcHMoe1xuICAgIGluY29taW5nOiB0cnVlXG4gIH0pXG59KTsgLy8gTmVpZ2hib3VyaG9vZCBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kdCwge1xuICBuZWlnaGJvcmhvb2Q6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGZvciBhbGwgbm9kZXNcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7IC8vIGZvciBlYWNoIGNvbm5lY3RlZCBlZGdlLCBhZGQgdGhlIGVkZ2UgYW5kIHRoZSBvdGhlciBub2RlXG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgb3RoZXJOb2RlID0gbm9kZSA9PT0gc3JjID8gdGd0IDogc3JjOyAvLyBuZWVkIGNoZWNrIGluIGNhc2Ugb2YgbG9vcFxuXG4gICAgICAgIGlmIChvdGhlck5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2gob3RoZXJOb2RlWzBdKTsgLy8gYWRkIG5vZGUgMSBob3AgYXdheVxuICAgICAgICB9IC8vIGFkZCBjb25uZWN0ZWQgZWRnZVxuXG5cbiAgICAgICAgZWxlbWVudHMucHVzaChlZGdlWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ25laWdoYm9yaG9vZCcpLFxuICBjbG9zZWROZWlnaGJvcmhvb2Q6IGZ1bmN0aW9uIGNsb3NlZE5laWdoYm9yaG9vZChzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm5laWdoYm9yaG9vZCgpLmFkZCh0aGlzKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBvcGVuTmVpZ2hib3Job29kOiBmdW5jdGlvbiBvcGVuTmVpZ2hib3Job29kKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubmVpZ2hib3Job29kKHNlbGVjdG9yKTtcbiAgfVxufSk7IC8vIGFsaWFzZXNcblxuZWxlc2ZuJHQubmVpZ2hib3VyaG9vZCA9IGVsZXNmbiR0Lm5laWdoYm9yaG9vZDtcbmVsZXNmbiR0LmNsb3NlZE5laWdoYm91cmhvb2QgPSBlbGVzZm4kdC5jbG9zZWROZWlnaGJvcmhvb2Q7XG5lbGVzZm4kdC5vcGVuTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiR0Lm9wZW5OZWlnaGJvcmhvb2Q7IC8vIEVkZ2UgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJHQsIHtcbiAgc291cmNlOiBjYWNoZShmdW5jdGlvbiBzb3VyY2VJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHNyYztcblxuICAgIGlmIChlbGUpIHtcbiAgICAgIHNyYyA9IGVsZS5fcHJpdmF0ZS5zb3VyY2UgfHwgZWxlLmN5KCkuY29sbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHJldHVybiBzcmMgJiYgc2VsZWN0b3IgPyBzcmMuZmlsdGVyKHNlbGVjdG9yKSA6IHNyYztcbiAgfSwgJ3NvdXJjZScpLFxuICB0YXJnZXQ6IGNhY2hlKGZ1bmN0aW9uIHRhcmdldEltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgdGd0O1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgdGd0ID0gZWxlLl9wcml2YXRlLnRhcmdldCB8fCBlbGUuY3koKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRndCAmJiBzZWxlY3RvciA/IHRndC5maWx0ZXIoc2VsZWN0b3IpIDogdGd0O1xuICB9LCAndGFyZ2V0JyksXG4gIHNvdXJjZXM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAnc291cmNlJ1xuICB9KSxcbiAgdGFyZ2V0czogZGVmaW5lU291cmNlRnVuY3Rpb24oe1xuICAgIGF0dHI6ICd0YXJnZXQnXG4gIH0pXG59KTtcblxuZnVuY3Rpb24gZGVmaW5lU291cmNlRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzb3VyY2VJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgc3JjID0gZWxlLl9wcml2YXRlW3BhcmFtcy5hdHRyXTtcblxuICAgICAgaWYgKHNyYykge1xuICAgICAgICBzb3VyY2VzLnB1c2goc3JjKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihzb3VyY2VzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9O1xufVxuXG5leHRlbmQoZWxlc2ZuJHQsIHtcbiAgZWRnZXNXaXRoOiBjYWNoZShkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbigpLCAnZWRnZXNXaXRoJyksXG4gIGVkZ2VzVG86IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKHtcbiAgICB0aGlzSXNTcmM6IHRydWVcbiAgfSksICdlZGdlc1RvJylcbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGVkZ2VzV2l0aEltcGwob3RoZXJOb2Rlcykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHAgPSBwYXJhbXMgfHwge307IC8vIGdldCBlbGVtZW50cyBpZiBhIHNlbGVjdG9yIGlzIHNwZWNpZmllZFxuXG4gICAgaWYgKHN0cmluZyhvdGhlck5vZGVzKSkge1xuICAgICAgb3RoZXJOb2RlcyA9IGN5LiQob3RoZXJOb2Rlcyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaCA9IDA7IGggPCBvdGhlck5vZGVzLmxlbmd0aDsgaCsrKSB7XG4gICAgICB2YXIgZWRnZXMgPSBvdGhlck5vZGVzW2hdLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICAgIHZhciBlZGdlRGF0YSA9IGVkZ2UuX3ByaXZhdGUuZGF0YTtcbiAgICAgICAgdmFyIHRoaXNUb090aGVyID0gdGhpcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnNvdXJjZSkgJiYgb3RoZXJOb2Rlcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBvdGhlclRvVGhpcyA9IG90aGVyTm9kZXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS5zb3VyY2UpICYmIHRoaXMuaGFzRWxlbWVudFdpdGhJZChlZGdlRGF0YS50YXJnZXQpO1xuICAgICAgICB2YXIgZWRnZUNvbm5lY3RzVGhpc0FuZE90aGVyID0gdGhpc1RvT3RoZXIgfHwgb3RoZXJUb1RoaXM7XG5cbiAgICAgICAgaWYgKCFlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwLnRoaXNJc1NyYyB8fCBwLnRoaXNJc1RndCkge1xuICAgICAgICAgIGlmIChwLnRoaXNJc1NyYyAmJiAhdGhpc1RvT3RoZXIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwLnRoaXNJc1RndCAmJiAhb3RoZXJUb1RoaXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpO1xuICB9O1xufVxuXG5leHRlbmQoZWxlc2ZuJHQsIHtcbiAgY29ubmVjdGVkRWRnZXM6IGNhY2hlKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHZhciByZXRFbGVzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZXNbaV07XG5cbiAgICAgIGlmICghbm9kZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICByZXRFbGVzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocmV0RWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSwgJ2Nvbm5lY3RlZEVkZ2VzJyksXG4gIGNvbm5lY3RlZE5vZGVzOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmV0RWxlcyA9IFtdO1xuICAgIHZhciBlbGVzID0gdGhpcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlbGVzW2ldO1xuXG4gICAgICBpZiAoIWVkZ2UuaXNFZGdlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnNvdXJjZSgpWzBdKTtcbiAgICAgIHJldEVsZXMucHVzaChlZGdlLnRhcmdldCgpWzBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zcGF3bihyZXRFbGVzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnY29ubmVjdGVkTm9kZXMnKSxcbiAgcGFyYWxsZWxFZGdlczogY2FjaGUoZGVmaW5lUGFyYWxsZWxFZGdlc0Z1bmN0aW9uKCksICdwYXJhbGxlbEVkZ2VzJyksXG4gIGNvZGlyZWN0ZWRFZGdlczogY2FjaGUoZGVmaW5lUGFyYWxsZWxFZGdlc0Z1bmN0aW9uKHtcbiAgICBjb2RpcmVjdGVkOiB0cnVlXG4gIH0pLCAnY29kaXJlY3RlZEVkZ2VzJylcbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBjb2RpcmVjdGVkOiBmYWxzZVxuICB9O1xuICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYWxsZWxFZGdlc0ltcGwoc2VsZWN0b3IpIHtcbiAgICAvLyBtaWNyby1vcHRpbWlzZWQgZm9yIHJlbmRlcmVyXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpO1xuICAgIHZhciBwID0gcGFyYW1zOyAvLyBsb29rIGF0IGFsbCB0aGUgZWRnZXMgaW4gdGhlIGNvbGxlY3Rpb25cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlMSA9IGVkZ2VzW2ldO1xuICAgICAgdmFyIGVkZ2UxX3AgPSBlZGdlMS5fcHJpdmF0ZTtcbiAgICAgIHZhciBzcmMxID0gZWRnZTFfcC5zb3VyY2U7XG4gICAgICB2YXIgc3JjaWQxID0gc3JjMS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdmFyIHRndGlkMSA9IGVkZ2UxX3AuZGF0YS50YXJnZXQ7XG4gICAgICB2YXIgc3JjRWRnZXMxID0gc3JjMS5fcHJpdmF0ZS5lZGdlczsgLy8gbG9vayBhdCBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIHNyYyBub2RlIG9mIHRoaXMgZWRnZVxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNyY0VkZ2VzMS5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZTIgPSBzcmNFZGdlczFbal07XG4gICAgICAgIHZhciBlZGdlMmRhdGEgPSBlZGdlMi5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGd0aWQyID0gZWRnZTJkYXRhLnRhcmdldDtcbiAgICAgICAgdmFyIHNyY2lkMiA9IGVkZ2UyZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciBjb2RpcmVjdGVkID0gdGd0aWQyID09PSB0Z3RpZDEgJiYgc3JjaWQyID09PSBzcmNpZDE7XG4gICAgICAgIHZhciBvcHBkaXJlY3RlZCA9IHNyY2lkMSA9PT0gdGd0aWQyICYmIHRndGlkMSA9PT0gc3JjaWQyO1xuXG4gICAgICAgIGlmIChwLmNvZGlyZWN0ZWQgJiYgY29kaXJlY3RlZCB8fCAhcC5jb2RpcmVjdGVkICYmIChjb2RpcmVjdGVkIHx8IG9wcGRpcmVjdGVkKSkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZTIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oZWxlbWVudHMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59IC8vIE1pc2MgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5cbmV4dGVuZChlbGVzZm4kdCwge1xuICBjb21wb25lbnRzOiBmdW5jdGlvbiBjb21wb25lbnRzKHJvb3QpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICAgIHZhciB2aXNpdGVkID0gY3kuY29sbGVjdGlvbigpO1xuICAgIHZhciB1bnZpc2l0ZWQgPSByb290ID09IG51bGwgPyBzZWxmLm5vZGVzKCkgOiByb290Lm5vZGVzKCk7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICAgIGlmIChyb290ICE9IG51bGwgJiYgdW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIC8vIHJvb3QgbWF5IGNvbnRhaW4gb25seSBlZGdlc1xuICAgICAgdW52aXNpdGVkID0gcm9vdC5zb3VyY2VzKCk7IC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIG5vZGUgdG8gdXNlICh1bmRpcmVjdGVkKSwgc28ganVzdCB1c2UgdGhlIHNvdXJjZSBzaWRlc1xuICAgIH1cblxuICAgIHZhciB2aXNpdEluQ29tcG9uZW50ID0gZnVuY3Rpb24gdmlzaXRJbkNvbXBvbmVudChub2RlLCBjb21wb25lbnQpIHtcbiAgICAgIHZpc2l0ZWQubWVyZ2Uobm9kZSk7XG4gICAgICB1bnZpc2l0ZWQudW5tZXJnZShub2RlKTtcbiAgICAgIGNvbXBvbmVudC5tZXJnZShub2RlKTtcbiAgICB9O1xuXG4gICAgaWYgKHVudmlzaXRlZC5lbXB0eSgpKSB7XG4gICAgICByZXR1cm4gc2VsZi5zcGF3bigpO1xuICAgIH1cblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgLy8gZWFjaCBpdGVyYXRpb24geWllbGRzIGEgY29tcG9uZW50XG4gICAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcbiAgICAgIHZhciByb290ID0gdW52aXNpdGVkWzBdO1xuICAgICAgdmlzaXRJbkNvbXBvbmVudChyb290LCBjbXB0KTtcbiAgICAgIHNlbGYuYmZzKHtcbiAgICAgICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByb290czogcm9vdCxcbiAgICAgICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KHYpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRJbkNvbXBvbmVudCh2LCBjbXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgICAgaWYgKHNlbGYuaGFzKGUpICYmIGNtcHQuaGFzKGUuc291cmNlKCkpICYmIGNtcHQuaGFzKGUudGFyZ2V0KCkpKSB7XG4gICAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgICAgY21wdC5tZXJnZShlKTsgLy8gZm9yRWFjaCgpIG9ubHkgY29uc2lkZXJzIG5vZGVzIC0tIHNldHMgTiBhdCBjYWxsIHRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGRvIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfSB3aGlsZSAodW52aXNpdGVkLmxlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH0sXG4gIGNvbXBvbmVudDogZnVuY3Rpb24gY29tcG9uZW50KCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUuY3koKS5tdXRhYmxlRWxlbWVudHMoKS5jb21wb25lbnRzKGVsZSlbMF07XG4gIH1cbn0pO1xuZWxlc2ZuJHQuY29tcG9uZW50c09mID0gZWxlc2ZuJHQuY29tcG9uZW50cztcblxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cykge1xuICB2YXIgdW5pcXVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICBpZiAoY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9yKCdBIGNvbGxlY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG1hcCA9IG5ldyBNYXAkMSgpO1xuICB2YXIgY3JlYXRlZEVsZW1lbnRzID0gZmFsc2U7XG5cbiAgaWYgKCFlbGVtZW50cykge1xuICAgIGVsZW1lbnRzID0gW107XG4gIH0gZWxzZSBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCAmJiBwbGFpbk9iamVjdChlbGVtZW50c1swXSkgJiYgIWVsZW1lbnQoZWxlbWVudHNbMF0pKSB7XG4gICAgY3JlYXRlZEVsZW1lbnRzID0gdHJ1ZTsgLy8gbWFrZSBlbGVtZW50cyBmcm9tIGpzb24gYW5kIHJlc3RvcmUgYWxsIGF0IG9uY2UgbGF0ZXJcblxuICAgIHZhciBlbGVzID0gW107XG4gICAgdmFyIGVsZXNJZHMgPSBuZXcgU2V0JDEoKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIganNvbiA9IGVsZW1lbnRzW2ldO1xuXG4gICAgICBpZiAoanNvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAganNvbi5kYXRhID0ge307XG4gICAgICB9XG5cbiAgICAgIHZhciBfZGF0YSA9IGpzb24uZGF0YTsgLy8gbWFrZSBzdXJlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudHMgaGF2ZSB2YWxpZCBpZHNcblxuICAgICAgaWYgKF9kYXRhLmlkID09IG51bGwpIHtcbiAgICAgICAgX2RhdGEuaWQgPSB1dWlkKCk7XG4gICAgICB9IGVsc2UgaWYgKGN5Lmhhc0VsZW1lbnRXaXRoSWQoX2RhdGEuaWQpIHx8IGVsZXNJZHMuaGFzKF9kYXRhLmlkKSkge1xuICAgICAgICBjb250aW51ZTsgLy8gY2FuJ3QgY3JlYXRlIGVsZW1lbnQgaWYgcHJpb3IgaWQgYWxyZWFkeSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgdmFyIGVsZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7XG4gICAgICBlbGVzLnB1c2goZWxlKTtcbiAgICAgIGVsZXNJZHMuYWRkKF9kYXRhLmlkKTtcbiAgICB9XG5cbiAgICBlbGVtZW50cyA9IGVsZXM7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBfbCA9IGVsZW1lbnRzLmxlbmd0aDsgX2kgPCBfbDsgX2krKykge1xuICAgIHZhciBlbGVtZW50JDEgPSBlbGVtZW50c1tfaV1bMF07IC8vIFswXSBpbiBjYXNlIGVsZW1lbnRzIGlzIGFuIGFycmF5IG9mIGNvbGxlY3Rpb25zLCByYXRoZXIgdGhhbiBhcnJheSBvZiBlbGVtZW50c1xuXG4gICAgaWYgKGVsZW1lbnQkMSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaWQgPSBlbGVtZW50JDEuX3ByaXZhdGUuZGF0YS5pZDtcblxuICAgIGlmICghdW5pcXVlIHx8ICFtYXAuaGFzKGlkKSkge1xuICAgICAgaWYgKHVuaXF1ZSkge1xuICAgICAgICBtYXAuc2V0KGlkLCB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIGVsZTogZWxlbWVudCQxXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzW3RoaXMubGVuZ3RoXSA9IGVsZW1lbnQkMTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBlbGVzOiB0aGlzLFxuICAgIGN5OiBjeSxcblxuICAgIGdldCBtYXAoKSB7XG4gICAgICBpZiAodGhpcy5sYXp5TWFwID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWJ1aWxkTWFwKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmxhenlNYXA7XG4gICAgfSxcblxuICAgIHNldCBtYXAobSkge1xuICAgICAgdGhpcy5sYXp5TWFwID0gbTtcbiAgICB9LFxuXG4gICAgcmVidWlsZE1hcDogZnVuY3Rpb24gcmVidWlsZE1hcCgpIHtcbiAgICAgIHZhciBtID0gdGhpcy5sYXp5TWFwID0gbmV3IE1hcCQxKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXMuZWxlcztcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBfZWxlID0gZWxlc1tfaTJdO1xuICAgICAgICBtLnNldChfZWxlLmlkKCksIHtcbiAgICAgICAgICBpbmRleDogX2kyLFxuICAgICAgICAgIGVsZTogX2VsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgaWYgKHVuaXF1ZSkge1xuICAgIHRoaXMuX3ByaXZhdGUubWFwID0gbWFwO1xuICB9IC8vIHJlc3RvcmUgdGhlIGVsZW1lbnRzIGlmIHdlIGNyZWF0ZWQgdGhlbSBmcm9tIGpzb25cblxuXG4gIGlmIChjcmVhdGVkRWxlbWVudHMpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTsgLy8gRnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBrZWVwIHRoZSBwcm90b3R5cGVzIGluIHN5bmMgKGFuIGVsZW1lbnQgaGFzIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcyBhIGNvbGxlY3Rpb24pXG4vLyBhbmQgdXNlIGVsZWZuIGFuZCBlbGVzZm4gYXMgc2hvcnRoYW5kcyB0byB0aGUgcHJvdG90eXBlc1xuXG5cbnZhciBlbGVzZm4kdSA9IEVsZW1lbnQucHJvdG90eXBlID0gQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFycmF5LnByb3RvdHlwZSk7XG5cbmVsZXNmbiR1Lmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ2NvbGxlY3Rpb24nO1xufTtcblxuZWxlc2ZuJHUuc3Bhd24gPSBmdW5jdGlvbiAoZWxlcywgdW5pcXVlKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXMsIHVuaXF1ZSk7XG59O1xuXG5lbGVzZm4kdS5zcGF3blNlbGYgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNwYXduKHRoaXMpO1xufTtcblxuZWxlc2ZuJHUuY3kgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xufTtcblxuZWxlc2ZuJHUucmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmN5LnJlbmRlcmVyKCk7XG59O1xuXG5lbGVzZm4kdS5lbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpc1swXTtcbn07XG5cbmVsZXNmbiR1LmNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChjb2xsZWN0aW9uKHRoaXMpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSB7XG4gICAgLy8gYW4gZWxlbWVudFxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCBbdGhpc10pO1xuICB9XG59O1xuXG5lbGVzZm4kdS51bmlxdWUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLl9wcml2YXRlLmN5LCB0aGlzLCB0cnVlKTtcbn07XG5cbmVsZXNmbiR1Lmhhc0VsZW1lbnRXaXRoSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5oYXMoaWQpO1xufTtcblxuZWxlc2ZuJHUuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG5cbiAgdmFyIGVudHJ5ID0gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKTtcblxuICByZXR1cm4gZW50cnkgPyBlbnRyeS5lbGUgOiBuZXcgQ29sbGVjdGlvbihjeSk7IC8vIGdldCBlbGUgb3IgZW1wdHkgY29sbGVjdGlvblxufTtcblxuZWxlc2ZuJHUuJGlkID0gZWxlc2ZuJHUuZ2V0RWxlbWVudEJ5SWQ7XG5cbmVsZXNmbiR1LnBvb2xJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgdmFyIGlkID0gdGhpc1swXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gZWxlcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5cbmVsZXNmbiR1LmluZGV4T2YgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBpZCA9IGVsZVswXS5fcHJpdmF0ZS5kYXRhLmlkO1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXAuZ2V0KGlkKS5pbmRleDtcbn07XG5cbmVsZXNmbiR1LmluZGV4T2ZJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuXG5lbGVzZm4kdS5qc29uID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgZWxlID0gdGhpcy5lbGVtZW50KCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICBpZiAoZWxlID09IG51bGwgJiYgb2JqKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gY2FuJ3Qgc2V0IHRvIG5vIGVsZXNcblxuXG4gIGlmIChlbGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gLy8gY2FuJ3QgZ2V0IGZyb20gbm8gZWxlc1xuXG5cbiAgdmFyIHAgPSBlbGUuX3ByaXZhdGU7XG5cbiAgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICAvLyBzZXRcbiAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgIGVsZS5kYXRhKG9iai5kYXRhKTtcbiAgICAgIHZhciBfZGF0YTIgPSBwLmRhdGE7XG5cbiAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgLy8gc291cmNlIGFuZCB0YXJnZXQgYXJlIGltbXV0YWJsZSB2aWEgZGF0YSgpXG4gICAgICAgIHZhciBtb3ZlID0gZmFsc2U7XG4gICAgICAgIHZhciBzcGVjID0ge307XG4gICAgICAgIHZhciBzcmMgPSBvYmouZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciB0Z3QgPSBvYmouZGF0YS50YXJnZXQ7XG5cbiAgICAgICAgaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSBfZGF0YTIuc291cmNlKSB7XG4gICAgICAgICAgc3BlYy5zb3VyY2UgPSAnJyArIHNyYzsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRndCAhPSBudWxsICYmIHRndCAhPSBfZGF0YTIudGFyZ2V0KSB7XG4gICAgICAgICAgc3BlYy50YXJnZXQgPSAnJyArIHRndDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICAgICAgICAgIG1vdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vdmUpIHtcbiAgICAgICAgICBlbGUgPSBlbGUubW92ZShzcGVjKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGFyZW50IGlzIGltbXV0YWJsZSB2aWEgZGF0YSgpXG4gICAgICAgIHZhciBuZXdQYXJlbnRWYWxTcGVjZCA9ICdwYXJlbnQnIGluIG9iai5kYXRhO1xuICAgICAgICB2YXIgcGFyZW50ID0gb2JqLmRhdGEucGFyZW50O1xuXG4gICAgICAgIGlmIChuZXdQYXJlbnRWYWxTcGVjZCAmJiAocGFyZW50ICE9IG51bGwgfHwgX2RhdGEyLnBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQgIT0gX2RhdGEyLnBhcmVudCkge1xuICAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gY2FuJ3Qgc2V0IHVuZGVmaW5lZCBpbXBlcmF0aXZlbHksIHNvIHVzZSBudWxsXG4gICAgICAgICAgICBwYXJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoe1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvYmoucG9zaXRpb24pIHtcbiAgICAgIGVsZS5wb3NpdGlvbihvYmoucG9zaXRpb24pO1xuICAgIH0gLy8gaWdub3JlIGdyb3VwIC0tIGltbXV0YWJsZVxuXG5cbiAgICB2YXIgY2hlY2tTd2l0Y2ggPSBmdW5jdGlvbiBjaGVja1N3aXRjaChrLCB0cnVlRm5OYW1lLCBmYWxzZUZuTmFtZSkge1xuICAgICAgdmFyIG9ial9rID0gb2JqW2tdO1xuXG4gICAgICBpZiAob2JqX2sgIT0gbnVsbCAmJiBvYmpfayAhPT0gcFtrXSkge1xuICAgICAgICBpZiAob2JqX2spIHtcbiAgICAgICAgICBlbGVbdHJ1ZUZuTmFtZV0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVbZmFsc2VGbk5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hlY2tTd2l0Y2goJ3JlbW92ZWQnLCAncmVtb3ZlJywgJ3Jlc3RvcmUnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0ZWQnLCAnc2VsZWN0JywgJ3Vuc2VsZWN0Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ3NlbGVjdGFibGUnLCAnc2VsZWN0aWZ5JywgJ3Vuc2VsZWN0aWZ5Jyk7XG4gICAgY2hlY2tTd2l0Y2goJ2xvY2tlZCcsICdsb2NrJywgJ3VubG9jaycpO1xuICAgIGNoZWNrU3dpdGNoKCdncmFiYmFibGUnLCAnZ3JhYmlmeScsICd1bmdyYWJpZnknKTtcbiAgICBjaGVja1N3aXRjaCgncGFubmFibGUnLCAncGFuaWZ5JywgJ3VucGFuaWZ5Jyk7XG5cbiAgICBpZiAob2JqLmNsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgZWxlLmNsYXNzZXMob2JqLmNsYXNzZXMpO1xuICAgIH1cblxuICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBnZXRcbiAgICB2YXIganNvbiA9IHtcbiAgICAgIGRhdGE6IGNvcHkocC5kYXRhKSxcbiAgICAgIHBvc2l0aW9uOiBjb3B5KHAucG9zaXRpb24pLFxuICAgICAgZ3JvdXA6IHAuZ3JvdXAsXG4gICAgICByZW1vdmVkOiBwLnJlbW92ZWQsXG4gICAgICBzZWxlY3RlZDogcC5zZWxlY3RlZCxcbiAgICAgIHNlbGVjdGFibGU6IHAuc2VsZWN0YWJsZSxcbiAgICAgIGxvY2tlZDogcC5sb2NrZWQsXG4gICAgICBncmFiYmFibGU6IHAuZ3JhYmJhYmxlLFxuICAgICAgcGFubmFibGU6IHAucGFubmFibGUsXG4gICAgICBjbGFzc2VzOiBudWxsXG4gICAgfTtcbiAgICBqc29uLmNsYXNzZXMgPSAnJztcbiAgICB2YXIgaSA9IDA7XG4gICAgcC5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgcmV0dXJuIGpzb24uY2xhc3NlcyArPSBpKysgPT09IDAgPyBjbHMgOiAnICcgKyBjbHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn07XG5cbmVsZXNmbiR1Lmpzb25zID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAganNvbnMucHVzaChqc29uKTtcbiAgfVxuXG4gIHJldHVybiBqc29ucztcbn07XG5cbmVsZXNmbiR1LmNsb25lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBlbGVzQXJyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGpzb24gPSBlbGUuanNvbigpO1xuICAgIHZhciBjbG9uZSA9IG5ldyBFbGVtZW50KGN5LCBqc29uLCBmYWxzZSk7IC8vIE5CIG5vIHJlc3RvcmVcblxuICAgIGVsZXNBcnIucHVzaChjbG9uZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IENvbGxlY3Rpb24oY3ksIGVsZXNBcnIpO1xufTtcblxuZWxlc2ZuJHUuY29weSA9IGVsZXNmbiR1LmNsb25lO1xuXG5lbGVzZm4kdS5yZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gIHZhciBhZGRUb1Bvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICB2YXIgY3lfcCA9IGN5Ll9wcml2YXRlOyAvLyBjcmVhdGUgYXJyYXlzIG9mIG5vZGVzIGFuZCBlZGdlcywgc2luY2Ugd2UgbmVlZCB0b1xuICAvLyByZXN0b3JlIHRoZSBub2RlcyBmaXJzdFxuXG4gIHZhciBub2RlcyA9IFtdO1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzO1xuXG4gIGZvciAodmFyIF9pMyA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgX2kzIDwgbDsgX2kzKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltfaTNdO1xuXG4gICAgaWYgKGFkZFRvUG9vbCAmJiAhZWxlLnJlbW92ZWQoKSkge1xuICAgICAgLy8gZG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhpcyBlbGVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8ga2VlcCBub2RlcyBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIGVkZ2VzIGFmdGVyXG5cblxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIC8vIHB1dCB0byBmcm9udCBvZiBhcnJheSBpZiBub2RlXG4gICAgICBub2Rlcy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHB1dCB0byBlbmQgb2YgYXJyYXkgaWYgZWRnZVxuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuXG4gIGVsZW1lbnRzID0gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgdmFyIGk7XG5cbiAgdmFyIHJlbW92ZUZyb21FbGVtZW50cyA9IGZ1bmN0aW9uIHJlbW92ZUZyb21FbGVtZW50cygpIHtcbiAgICBlbGVtZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgaS0tO1xuICB9OyAvLyBub3csIHJlc3RvcmUgZWFjaCBlbGVtZW50XG5cblxuICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2VsZTIgPSBlbGVtZW50c1tpXTtcbiAgICB2YXIgX3ByaXZhdGUgPSBfZWxlMi5fcHJpdmF0ZTtcbiAgICB2YXIgX2RhdGEzID0gX3ByaXZhdGUuZGF0YTsgLy8gdGhlIHRyYXZlcnNhbCBjYWNoZSBzaG91bGQgc3RhcnQgZnJlc2ggd2hlbiBlbGUgaXMgYWRkZWRcblxuICAgIF9lbGUyLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTsgLy8gc2V0IGlkIGFuZCB2YWxpZGF0ZVxuXG5cbiAgICBpZiAoIWFkZFRvUG9vbCAmJiAhX3ByaXZhdGUucmVtb3ZlZCkgOyBlbHNlIGlmIChfZGF0YTMuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2RhdGEzLmlkID0gdXVpZCgpO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyKF9kYXRhMy5pZCkpIHtcbiAgICAgIF9kYXRhMy5pZCA9ICcnICsgX2RhdGEzLmlkOyAvLyBub3cgaXQncyBhIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZW1wdHlTdHJpbmcoX2RhdGEzLmlkKSB8fCAhc3RyaW5nKF9kYXRhMy5pZCkpIHtcbiAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlbGVtZW50IHdpdGggaW52YWxpZCBzdHJpbmcgSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBpdCBoYXMgZW1wdHkgc3RyaW5nIGFzIGlkIG9yIG5vbi1zdHJpbmcgaWRcblxuICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGN5Lmhhc0VsZW1lbnRXaXRoSWQoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIHNlY29uZCBlbGVtZW50IHdpdGggSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBvbmUgYWxyZWFkeSBoYXMgdGhhdCBpZFxuXG4gICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpZCA9IF9kYXRhMy5pZDsgLy8gaWQgaXMgZmluYWxpc2VkLCBub3cgbGV0J3Mga2VlcCBhIHJlZlxuXG4gICAgaWYgKF9lbGUyLmlzTm9kZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIG5vZGVzXG4gICAgICB2YXIgcG9zID0gX3ByaXZhdGUucG9zaXRpb247IC8vIG1ha2Ugc3VyZSB0aGUgbm9kZXMgaGF2ZSBhIGRlZmluZWQgcG9zaXRpb25cblxuICAgICAgaWYgKHBvcy54ID09IG51bGwpIHtcbiAgICAgICAgcG9zLnggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zLnkgPT0gbnVsbCkge1xuICAgICAgICBwb3MueSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF9lbGUyLmlzRWRnZSgpKSB7XG4gICAgICAvLyBleHRyYSBjaGVja3MgZm9yIGVkZ2VzXG4gICAgICB2YXIgZWRnZSA9IF9lbGUyO1xuICAgICAgdmFyIGZpZWxkcyA9IFsnc291cmNlJywgJ3RhcmdldCddO1xuICAgICAgdmFyIGZpZWxkc0xlbmd0aCA9IGZpZWxkcy5sZW5ndGg7XG4gICAgICB2YXIgYmFkU291cmNlT3JUYXJnZXQgPSBmYWxzZTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHNMZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbal07XG4gICAgICAgIHZhciB2YWwgPSBfZGF0YTNbZmllbGRdO1xuXG4gICAgICAgIGlmIChudW1iZXIodmFsKSkge1xuICAgICAgICAgIHZhbCA9IF9kYXRhM1tmaWVsZF0gPSAnJyArIF9kYXRhM1tmaWVsZF07IC8vIG5vdyBzdHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGlmIHNvdXJjZSBvciB0YXJnZXQgaXMgbm90IGRlZmluZWQgcHJvcGVybHlcbiAgICAgICAgICBlcnJvcignQ2FuIG5vdCBjcmVhdGUgZWRnZSBgJyArIGlkICsgJ2Agd2l0aCB1bnNwZWNpZmllZCAnICsgZmllbGQpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghY3kuaGFzRWxlbWVudFdpdGhJZCh2YWwpKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY3JlYXRlIGVkZ2UgaWYgb25lIG9mIGl0cyBub2RlcyBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggbm9uZXhpc3RhbnQgJyArIGZpZWxkICsgJyBgJyArIHZhbCArICdgJyk7XG4gICAgICAgICAgYmFkU291cmNlT3JUYXJnZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChiYWRTb3VyY2VPclRhcmdldCkge1xuICAgICAgICByZW1vdmVGcm9tRWxlbWVudHMoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGNhbid0IGNyZWF0ZSB0aGlzXG5cblxuICAgICAgdmFyIHNyYyA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy5zb3VyY2UpO1xuICAgICAgdmFyIHRndCA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy50YXJnZXQpOyAvLyBvbmx5IG9uZSBlZGdlIGluIG5vZGUgaWYgbG9vcFxuXG4gICAgICBpZiAoc3JjLnNhbWUodGd0KSkge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNyYy5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuXG4gICAgICAgIHRndC5fcHJpdmF0ZS5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfVxuXG4gICAgICBlZGdlLl9wcml2YXRlLnNvdXJjZSA9IHNyYztcbiAgICAgIGVkZ2UuX3ByaXZhdGUudGFyZ2V0ID0gdGd0O1xuICAgIH0gLy8gaWYgaXMgZWRnZVxuICAgIC8vIGNyZWF0ZSBtb2NrIGlkcyAvIGluZGV4ZXMgbWFwcyBmb3IgZWxlbWVudCBzbyBpdCBjYW4gYmUgdXNlZCBsaWtlIGNvbGxlY3Rpb25zXG5cblxuICAgIF9wcml2YXRlLm1hcCA9IG5ldyBNYXAkMSgpO1xuXG4gICAgX3ByaXZhdGUubWFwLnNldChpZCwge1xuICAgICAgZWxlOiBfZWxlMixcbiAgICAgIGluZGV4OiAwXG4gICAgfSk7XG5cbiAgICBfcHJpdmF0ZS5yZW1vdmVkID0gZmFsc2U7XG5cbiAgICBpZiAoYWRkVG9Qb29sKSB7XG4gICAgICBjeS5hZGRUb1Bvb2woX2VsZTIpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWFjaCBlbGVtZW50XG4gIC8vIGRvIGNvbXBvdW5kIG5vZGUgc2FuaXR5IGNoZWNrc1xuXG5cbiAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZXMubGVuZ3RoOyBfaTQrKykge1xuICAgIC8vIGVhY2ggbm9kZVxuICAgIHZhciBub2RlID0gbm9kZXNbX2k0XTtcbiAgICB2YXIgX2RhdGE0ID0gbm9kZS5fcHJpdmF0ZS5kYXRhO1xuXG4gICAgaWYgKG51bWJlcihfZGF0YTQucGFyZW50KSkge1xuICAgICAgLy8gdGhlbiBhdXRvbWFrZSBzdHJpbmdcbiAgICAgIF9kYXRhNC5wYXJlbnQgPSAnJyArIF9kYXRhNC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudElkID0gX2RhdGE0LnBhcmVudDtcbiAgICB2YXIgc3BlY2lmaWVkUGFyZW50ID0gcGFyZW50SWQgIT0gbnVsbDtcblxuICAgIGlmIChzcGVjaWZpZWRQYXJlbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBjeS5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7XG5cbiAgICAgIGlmIChwYXJlbnQuZW1wdHkoKSkge1xuICAgICAgICAvLyBub24tZXhpc3RhbnQgcGFyZW50OyBqdXN0IHJlbW92ZSBpdFxuICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNlbGZBc1BhcmVudCA9IGZhbHNlO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG5cbiAgICAgICAgd2hpbGUgKCFhbmNlc3Rvci5lbXB0eSgpKSB7XG4gICAgICAgICAgaWYgKG5vZGUuc2FtZShhbmNlc3RvcikpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgc2VsZiBhcyBwYXJlbnQgYW5kIHJlbW92ZSBmcm9tIGRhdGFcbiAgICAgICAgICAgIHNlbGZBc1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICBfZGF0YTQucGFyZW50ID0gdW5kZWZpbmVkOyAvLyByZW1vdmUgcGFyZW50IHJlZmVyZW5jZVxuICAgICAgICAgICAgLy8gZXhpdCBvciB3ZSBsb29wIGZvcmV2ZXJcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZkFzUGFyZW50KSB7XG4gICAgICAgICAgLy8gY29ubmVjdCB3aXRoIGNoaWxkcmVuXG4gICAgICAgICAgcGFyZW50WzBdLl9wcml2YXRlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG5cbiAgICAgICAgICBub2RlLl9wcml2YXRlLnBhcmVudCA9IHBhcmVudFswXTsgLy8gbGV0IHRoZSBjb3JlIGtub3cgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoXG5cbiAgICAgICAgICBjeV9wLmhhc0NvbXBvdW5kTm9kZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIGVsc2VcblxuICAgIH0gLy8gaWYgc3BlY2lmaWVkIHBhcmVudFxuXG4gIH0gLy8gZm9yIGVhY2ggbm9kZVxuXG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgcmVzdG9yZWQgPSBlbGVtZW50cy5sZW5ndGggPT09IHNlbGYubGVuZ3RoID8gc2VsZiA6IG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cyk7XG5cbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCByZXN0b3JlZC5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2VsZTMgPSByZXN0b3JlZFtfaTVdO1xuXG4gICAgICBpZiAoX2VsZTMuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIGFkZGluZyBhbiBlZGdlIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGVzIGZvciB0aGUgcGFyYWxsZWwgZWRnZXNcblxuXG4gICAgICBfZWxlMy5wYXJhbGxlbEVkZ2VzKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpOyAvLyBhZGRpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciB0aGUgY29ubmVjdGVkIG5vZGVzXG5cblxuICAgICAgX2VsZTMuc291cmNlKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuXG4gICAgICBfZWxlMy50YXJnZXQoKS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gICAgfVxuXG4gICAgdmFyIHRvVXBkYXRlU3R5bGU7XG5cbiAgICBpZiAoY3lfcC5oYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICB0b1VwZGF0ZVN0eWxlID0gY3kuY29sbGVjdGlvbigpLm1lcmdlKHJlc3RvcmVkKS5tZXJnZShyZXN0b3JlZC5jb25uZWN0ZWROb2RlcygpKS5tZXJnZShyZXN0b3JlZC5wYXJlbnQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSByZXN0b3JlZDtcbiAgICB9XG5cbiAgICB0b1VwZGF0ZVN0eWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpLnVwZGF0ZVN0eWxlKG5vdGlmeVJlbmRlcmVyKTtcblxuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgcmVzdG9yZWQuZW1pdEFuZE5vdGlmeSgnYWRkJyk7XG4gICAgfSBlbHNlIGlmIChhZGRUb1Bvb2wpIHtcbiAgICAgIHJlc3RvcmVkLmVtaXQoJ2FkZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZWxmOyAvLyBjaGFpbmFiaWxpdHlcbn07XG5cbmVsZXNmbiR1LnJlbW92ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmIGVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcblxuZWxlc2ZuJHUuaW5zaWRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgcmV0dXJuIGVsZSAmJiAhZWxlLl9wcml2YXRlLnJlbW92ZWQ7XG59O1xuXG5lbGVzZm4kdS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgdmFyIHJlbW92ZUZyb21Qb29sID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBlbGVzVG9SZW1vdmUgPSBbXTtcbiAgdmFyIGVsZXNUb1JlbW92ZUlkcyA9IHt9O1xuICB2YXIgY3kgPSBzZWxmLl9wcml2YXRlLmN5OyAvLyBhZGQgY29ubmVjdGVkIGVkZ2VzXG5cbiAgZnVuY3Rpb24gYWRkQ29ubmVjdGVkRWRnZXMobm9kZSkge1xuICAgIHZhciBlZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoZWRnZXNbaV0pO1xuICAgIH1cbiAgfSAvLyBhZGQgZGVzY2VuZGFudCBub2Rlc1xuXG5cbiAgZnVuY3Rpb24gYWRkQ2hpbGRyZW4obm9kZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuX3ByaXZhdGUuY2hpbGRyZW47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZChlbGUpIHtcbiAgICB2YXIgYWxyZWFkeUFkZGVkID0gZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXTtcblxuICAgIGlmIChyZW1vdmVGcm9tUG9vbCAmJiBlbGUucmVtb3ZlZCgpIHx8IGFscmVhZHlBZGRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzVG9SZW1vdmVJZHNbZWxlLmlkKCldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBlbGVzVG9SZW1vdmUucHVzaChlbGUpOyAvLyBub2RlcyBhcmUgcmVtb3ZlZCBsYXN0XG5cbiAgICAgIGFkZENvbm5lY3RlZEVkZ2VzKGVsZSk7XG4gICAgICBhZGRDaGlsZHJlbihlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzVG9SZW1vdmUudW5zaGlmdChlbGUpOyAvLyBlZGdlcyBhcmUgcmVtb3ZlZCBmaXJzdFxuICAgIH1cbiAgfSAvLyBtYWtlIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHJlbW92ZVxuICAvLyAobWF5IGJlIHJlbW92aW5nIG1vcmUgdGhhbiBzcGVjaWZpZWQgZHVlIHRvIGNvbm5lY3RlZCBlZGdlcyBldGMpXG5cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IHNlbGZbaV07XG4gICAgYWRkKGVsZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVFZGdlUmVmKG5vZGUsIGVkZ2UpIHtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIHJlbW92ZUZyb21BcnJheShjb25uZWN0ZWRFZGdlcywgZWRnZSk7IC8vIHJlbW92aW5nIGFuIGVkZ2VzIGludmFsaWRhdGVzIHRoZSB0cmF2ZXJzYWwgY2FjaGUgZm9yIGl0cyBub2Rlc1xuXG4gICAgbm9kZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKSB7XG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgcGxsRWRnZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cblxuICB2YXIgYWx0ZXJlZFBhcmVudHMgPSBbXTtcbiAgYWx0ZXJlZFBhcmVudHMuaWRzID0ge307XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBlbGUpIHtcbiAgICBlbGUgPSBlbGVbMF07XG4gICAgcGFyZW50ID0gcGFyZW50WzBdO1xuICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5fcHJpdmF0ZS5jaGlsZHJlbjtcbiAgICB2YXIgcGlkID0gcGFyZW50LmlkKCk7XG4gICAgcmVtb3ZlRnJvbUFycmF5KGNoaWxkcmVuLCBlbGUpOyAvLyByZW1vdmUgcGFyZW50ID0+IGNoaWxkIHJlZlxuXG4gICAgZWxlLl9wcml2YXRlLnBhcmVudCA9IG51bGw7IC8vIHJlbW92ZSBjaGlsZCA9PiBwYXJlbnQgcmVmXG5cbiAgICBpZiAoIWFsdGVyZWRQYXJlbnRzLmlkc1twaWRdKSB7XG4gICAgICBhbHRlcmVkUGFyZW50cy5pZHNbcGlkXSA9IHRydWU7XG4gICAgICBhbHRlcmVkUGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcblxuICBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICBjeS5yZW1vdmVGcm9tUG9vbChlbGVzVG9SZW1vdmUpOyAvLyByZW1vdmUgZnJvbSBjb3JlIHBvb2xcbiAgfVxuXG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGVsZXNUb1JlbW92ZS5sZW5ndGg7IF9pNisrKSB7XG4gICAgdmFyIF9lbGU0ID0gZWxlc1RvUmVtb3ZlW19pNl07XG5cbiAgICBpZiAoX2VsZTQuaXNFZGdlKCkpIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoaXMgZWRnZSBpbiBpdHMgY29ubmVjdGVkIG5vZGVzXG4gICAgICB2YXIgc3JjID0gX2VsZTQuc291cmNlKClbMF07XG5cbiAgICAgIHZhciB0Z3QgPSBfZWxlNC50YXJnZXQoKVswXTtcblxuICAgICAgcmVtb3ZlRWRnZVJlZihzcmMsIF9lbGU0KTtcbiAgICAgIHJlbW92ZUVkZ2VSZWYodGd0LCBfZWxlNCk7XG5cbiAgICAgIHZhciBwbGxFZGdlcyA9IF9lbGU0LnBhcmFsbGVsRWRnZXMoKTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwbGxFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcGxsRWRnZSA9IHBsbEVkZ2VzW2pdO1xuICAgICAgICByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKTtcblxuICAgICAgICBpZiAocGxsRWRnZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgICAgIHBsbEVkZ2UuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byBwYXJlbnRcbiAgICAgIHZhciBwYXJlbnQgPSBfZWxlNC5wYXJlbnQoKTtcblxuICAgICAgaWYgKHBhcmVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGRSZWYocGFyZW50LCBfZWxlNCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICAvLyBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIF9lbGU0Ll9wcml2YXRlLnJlbW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBvdW5kIGdyYXBoIG9yIG5vdFxuXG5cbiAgdmFyIGVsZXNTdGlsbEluc2lkZSA9IGN5Ll9wcml2YXRlLmVsZW1lbnRzO1xuICBjeS5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZWxlc1N0aWxsSW5zaWRlLmxlbmd0aDsgX2k3KyspIHtcbiAgICB2YXIgX2VsZTUgPSBlbGVzU3RpbGxJbnNpZGVbX2k3XTtcblxuICAgIGlmIChfZWxlNS5pc1BhcmVudCgpKSB7XG4gICAgICBjeS5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZW1vdmVkRWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbih0aGlzLmN5KCksIGVsZXNUb1JlbW92ZSk7XG5cbiAgaWYgKHJlbW92ZWRFbGVtZW50cy5zaXplKCkgPiAwKSB7XG4gICAgLy8gbXVzdCBtYW51YWxseSBub3RpZnkgc2luY2UgdHJpZ2dlciB3b24ndCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgb25jZSByZW1vdmVkXG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICByZW1vdmVkRWxlbWVudHMuZW1pdEFuZE5vdGlmeSgncmVtb3ZlJyk7XG4gICAgfSBlbHNlIGlmIChyZW1vdmVGcm9tUG9vbCkge1xuICAgICAgcmVtb3ZlZEVsZW1lbnRzLmVtaXQoJ3JlbW92ZScpO1xuICAgIH1cbiAgfSAvLyB0aGUgcGFyZW50cyB3aG8gd2VyZSBtb2RpZmllZCBieSB0aGUgcmVtb3ZhbCBuZWVkIHRoZWlyIHN0eWxlIHVwZGF0ZWRcblxuXG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGFsdGVyZWRQYXJlbnRzLmxlbmd0aDsgX2k4KyspIHtcbiAgICB2YXIgX2VsZTYgPSBhbHRlcmVkUGFyZW50c1tfaThdO1xuXG4gICAgaWYgKCFyZW1vdmVGcm9tUG9vbCB8fCAhX2VsZTYucmVtb3ZlZCgpKSB7XG4gICAgICBfZWxlNi51cGRhdGVTdHlsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZW1vdmVkRWxlbWVudHM7XG59O1xuXG5lbGVzZm4kdS5tb3ZlID0gZnVuY3Rpb24gKHN0cnVjdCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IHRoaXM7IC8vIGp1c3QgY2xlYW4gdXAgcmVmcywgY2FjaGVzLCBldGMuIGluIHRoZSBzYW1lIHdheSBhcyB3aGVuIHJlbW92aW5nIGFuZCB0aGVuIHJlc3RvcmluZ1xuICAvLyAob3VyIGNhbGxzIHRvIHJlbW92ZS9yZXN0b3JlIGRvIG5vdCByZW1vdmUgZnJvbSB0aGUgZ3JhcGggb3IgbWFrZSBldmVudHMpXG5cbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gZmFsc2U7XG4gIHZhciBtb2RpZnlQb29sID0gZmFsc2U7XG5cbiAgdmFyIHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoaWQpIHtcbiAgICByZXR1cm4gaWQgPT0gbnVsbCA/IGlkIDogJycgKyBpZDtcbiAgfTsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuXG4gIGlmIChzdHJ1Y3Quc291cmNlICE9PSB1bmRlZmluZWQgfHwgc3RydWN0LnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHNyY0lkID0gdG9TdHJpbmcoc3RydWN0LnNvdXJjZSk7XG4gICAgdmFyIHRndElkID0gdG9TdHJpbmcoc3RydWN0LnRhcmdldCk7XG4gICAgdmFyIHNyY0V4aXN0cyA9IHNyY0lkICE9IG51bGwgJiYgY3kuaGFzRWxlbWVudFdpdGhJZChzcmNJZCk7XG4gICAgdmFyIHRndEV4aXN0cyA9IHRndElkICE9IG51bGwgJiYgY3kuaGFzRWxlbWVudFdpdGhJZCh0Z3RJZCk7XG5cbiAgICBpZiAoc3JjRXhpc3RzIHx8IHRndEV4aXN0cykge1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuXG4gICAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICAgIHZhciBfZGF0YTUgPSBlbGUuX3ByaXZhdGUuZGF0YTtcblxuICAgICAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgICAgIGlmIChzcmNFeGlzdHMpIHtcbiAgICAgICAgICAgICAgX2RhdGE1LnNvdXJjZSA9IHNyY0lkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGd0RXhpc3RzKSB7XG4gICAgICAgICAgICAgIF9kYXRhNS50YXJnZXQgPSB0Z3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlbGVzLnJlc3RvcmUobm90aWZ5UmVuZGVyZXIsIG1vZGlmeVBvb2wpOyAvLyBtYWtlIG5ldyByZWZzLCBzdHlsZSwgZXRjLlxuICAgICAgfSk7XG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RydWN0LnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbW92ZSBub2RlIHRvIG5ldyBwYXJlbnRcbiAgICB2YXIgcGFyZW50SWQgPSB0b1N0cmluZyhzdHJ1Y3QucGFyZW50KTtcbiAgICB2YXIgcGFyZW50RXhpc3RzID0gcGFyZW50SWQgPT09IG51bGwgfHwgY3kuaGFzRWxlbWVudFdpdGhJZChwYXJlbnRJZCk7XG5cbiAgICBpZiAocGFyZW50RXhpc3RzKSB7XG4gICAgICB2YXIgcGlkVG9Bc3NpZ24gPSBwYXJlbnRJZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHBhcmVudElkO1xuICAgICAgY3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhdm9pZCBkdXBsaWNhdGUgc3R5bGUgdXBkYXRlc1xuICAgICAgICB2YXIgdXBkYXRlZCA9IGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG5cbiAgICAgICAgdXBkYXRlZC5lbWl0QW5kTm90aWZ5KCdtb3Zlb3V0Jyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNiA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuXG4gICAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgICAgX2RhdGE2LnBhcmVudCA9IHBpZFRvQXNzaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZWQucmVzdG9yZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIG1ha2UgbmV3IHJlZnMsIHN0eWxlLCBldGMuXG4gICAgICB9KTtcbiAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuW2VsZXNmbiRjLCBlbGVzZm4kZCwgZWxlc2ZuJGUsIGVsZXNmbiRmLCBlbGVzZm4kZywgZGF0YSQxLCBlbGVzZm4kaSwgZGltZW5zaW9ucywgZWxlc2ZuJG0sIGVsZXNmbiRuLCBlbGVzZm4kbywgZWxlc2ZuJHAsIGVsZXNmbiRxLCBlbGVzZm4kciwgZWxlc2ZuJHMsIGVsZXNmbiR0XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJHUsIHByb3BzKTtcbn0pO1xuXG52YXIgY29yZWZuID0ge1xuICBhZGQ6IGZ1bmN0aW9uIGFkZChvcHRzKSB7XG4gICAgdmFyIGVsZW1lbnRzO1xuICAgIHZhciBjeSA9IHRoaXM7IC8vIGFkZCB0aGUgZWxlbWVudHNcblxuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKG9wdHMpKSB7XG4gICAgICB2YXIgZWxlcyA9IG9wdHM7XG5cbiAgICAgIGlmIChlbGVzLl9wcml2YXRlLmN5ID09PSBjeSkge1xuICAgICAgICAvLyBzYW1lIGluc3RhbmNlID0+IGp1c3QgcmVzdG9yZVxuICAgICAgICBlbGVtZW50cyA9IGVsZXMucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb3B5IGZyb20ganNvblxuICAgICAgICB2YXIganNvbnMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICBqc29ucy5wdXNoKGVsZS5qc29uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwganNvbnMpO1xuICAgICAgfVxuICAgIH0gLy8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zXG4gICAgZWxzZSBpZiAoYXJyYXkob3B0cykpIHtcbiAgICAgICAgdmFyIF9qc29ucyA9IG9wdHM7XG4gICAgICAgIGVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24oY3ksIF9qc29ucyk7XG4gICAgICB9IC8vIHNwZWNpZnkgdmlhIG9wdHMubm9kZXMgYW5kIG9wdHMuZWRnZXNcbiAgICAgIGVsc2UgaWYgKHBsYWluT2JqZWN0KG9wdHMpICYmIChhcnJheShvcHRzLm5vZGVzKSB8fCBhcnJheShvcHRzLmVkZ2VzKSkpIHtcbiAgICAgICAgICB2YXIgZWxlc0J5R3JvdXAgPSBvcHRzO1xuICAgICAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgaWwgPSBncnMubGVuZ3RoOyBfaSA8IGlsOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBncnNbX2ldO1xuICAgICAgICAgICAgdmFyIGVsZXNBcnJheSA9IGVsZXNCeUdyb3VwW2dyb3VwXTtcblxuICAgICAgICAgICAgaWYgKGFycmF5KGVsZXNBcnJheSkpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpsID0gZWxlc0FycmF5Lmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIganNvbiA9IGV4dGVuZCh7XG4gICAgICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgICAgICB9LCBlbGVzQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgX2pzb25zMi5wdXNoKGpzb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zMik7XG4gICAgICAgIH0gLy8gc3BlY2lmeSBvcHRpb25zIGZvciBvbmUgZWxlbWVudFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBfanNvbiA9IG9wdHM7XG4gICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBFbGVtZW50KGN5LCBfanNvbikuY29sbGVjdGlvbigpO1xuICAgICAgICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoY29sbGVjdGlvbikge1xuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGNvbGxlY3Rpb24pKSA7IGVsc2UgaWYgKHN0cmluZyhjb2xsZWN0aW9uKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gY29sbGVjdGlvbjtcbiAgICAgIGNvbGxlY3Rpb24gPSB0aGlzLiQoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgRmxvYXQzMkFycmF5ICovXG5cbi8qISBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViaWNCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXG4gICAgICBORVdUT05fTUlOX1NMT1BFID0gMC4wMDEsXG4gICAgICBTVUJESVZJU0lPTl9QUkVDSVNJT04gPSAwLjAwMDAwMDEsXG4gICAgICBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxuICAgICAga1NwbGluZVRhYmxlU2l6ZSA9IDExLFxuICAgICAga1NhbXBsZVN0ZXBTaXplID0gMS4wIC8gKGtTcGxpbmVUYWJsZVNpemUgLSAxLjApLFxuICAgICAgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG4gIC8qIE11c3QgY29udGFpbiBmb3VyIGFyZ3VtZW50cy4gKi9cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiBBcmd1bWVudHMgbXVzdCBiZSBudW1iZXJzLiAqL1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gXCJudW1iZXJcIiB8fCBpc05hTihhcmd1bWVudHNbaV0pIHx8ICFpc0Zpbml0ZShhcmd1bWVudHNbaV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cblxuXG4gIG1YMSA9IE1hdGgubWluKG1YMSwgMSk7XG4gIG1YMiA9IE1hdGgubWluKG1YMiwgMSk7XG4gIG1YMSA9IE1hdGgubWF4KG1YMSwgMCk7XG4gIG1YMiA9IE1hdGgubWF4KG1YMiwgMCk7XG4gIHZhciBtU2FtcGxlVmFsdWVzID0gZmxvYXQzMkFycmF5U3VwcG9ydGVkID8gbmV3IEZsb2F0MzJBcnJheShrU3BsaW5lVGFibGVTaXplKSA6IG5ldyBBcnJheShrU3BsaW5lVGFibGVTaXplKTtcblxuICBmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEIoYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMy4wICogYUEyIC0gNi4wICogYUExO1xuICB9XG5cbiAgZnVuY3Rpb24gQyhhQTEpIHtcbiAgICByZXR1cm4gMy4wICogYUExO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTbG9wZShhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gMy4wICogQShhQTEsIGFBMikgKiBhVCAqIGFUICsgMi4wICogQihhQTEsIGFBMikgKiBhVCArIEMoYUExKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld3RvblJhcGhzb25JdGVyYXRlKGFYLCBhR3Vlc3NUKSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE5FV1RPTl9JVEVSQVRJT05TOyArK19pKSB7XG4gICAgICB2YXIgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgbVgxLCBtWDIpO1xuXG4gICAgICBpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgbVgxLCBtWDIpIC0gYVg7XG4gICAgICBhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBhR3Vlc3NUO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrU3BsaW5lVGFibGVTaXplOyArK19pMikge1xuICAgICAgbVNhbXBsZVZhbHVlc1tfaTJdID0gY2FsY0JlemllcihfaTIgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiaW5hcnlTdWJkaXZpZGUoYVgsIGFBLCBhQikge1xuICAgIHZhciBjdXJyZW50WCxcbiAgICAgICAgY3VycmVudFQsXG4gICAgICAgIGkgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgY3VycmVudFQgPSBhQSArIChhQiAtIGFBKSAvIDIuMDtcbiAgICAgIGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0gYVg7XG5cbiAgICAgIGlmIChjdXJyZW50WCA+IDAuMCkge1xuICAgICAgICBhQiA9IGN1cnJlbnRUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYUEgPSBjdXJyZW50VDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChNYXRoLmFicyhjdXJyZW50WCkgPiBTVUJESVZJU0lPTl9QUkVDSVNJT04gJiYgKytpIDwgU1VCRElWSVNJT05fTUFYX0lURVJBVElPTlMpO1xuXG4gICAgcmV0dXJuIGN1cnJlbnRUO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VEZvclgoYVgpIHtcbiAgICB2YXIgaW50ZXJ2YWxTdGFydCA9IDAuMCxcbiAgICAgICAgY3VycmVudFNhbXBsZSA9IDEsXG4gICAgICAgIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcblxuICAgIGZvciAoOyBjdXJyZW50U2FtcGxlICE9PSBsYXN0U2FtcGxlICYmIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0gPD0gYVg7ICsrY3VycmVudFNhbXBsZSkge1xuICAgICAgaW50ZXJ2YWxTdGFydCArPSBrU2FtcGxlU3RlcFNpemU7XG4gICAgfVxuXG4gICAgLS1jdXJyZW50U2FtcGxlO1xuICAgIHZhciBkaXN0ID0gKGFYIC0gbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSkgLyAobVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlICsgMV0gLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSxcbiAgICAgICAgZ3Vlc3NGb3JUID0gaW50ZXJ2YWxTdGFydCArIGRpc3QgKiBrU2FtcGxlU3RlcFNpemUsXG4gICAgICAgIGluaXRpYWxTbG9wZSA9IGdldFNsb3BlKGd1ZXNzRm9yVCwgbVgxLCBtWDIpO1xuXG4gICAgaWYgKGluaXRpYWxTbG9wZSA+PSBORVdUT05fTUlOX1NMT1BFKSB7XG4gICAgICByZXR1cm4gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGd1ZXNzRm9yVCk7XG4gICAgfSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xuICAgICAgcmV0dXJuIGd1ZXNzRm9yVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHByZWNvbXB1dGUoKSB7XG4gICAgX3ByZWNvbXB1dGVkID0gdHJ1ZTtcblxuICAgIGlmIChtWDEgIT09IG1ZMSB8fCBtWDIgIT09IG1ZMikge1xuICAgICAgY2FsY1NhbXBsZVZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmID0gZnVuY3Rpb24gZihhWCkge1xuICAgIGlmICghX3ByZWNvbXB1dGVkKSB7XG4gICAgICBwcmVjb21wdXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKG1YMSA9PT0gbVkxICYmIG1YMiA9PT0gbVkyKSB7XG4gICAgICByZXR1cm4gYVg7XG4gICAgfVxuXG4gICAgaWYgKGFYID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoYVggPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiBjYWxjQmV6aWVyKGdldFRGb3JYKGFYKSwgbVkxLCBtWTIpO1xuICB9O1xuXG4gIGYuZ2V0Q29udHJvbFBvaW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHg6IG1YMSxcbiAgICAgIHk6IG1ZMVxuICAgIH0sIHtcbiAgICAgIHg6IG1YMixcbiAgICAgIHk6IG1ZMlxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBzdHIgPSBcImdlbmVyYXRlQmV6aWVyKFwiICsgW21YMSwgbVkxLCBtWDIsIG1ZMl0gKyBcIilcIjtcblxuICBmLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgcmV0dXJuIGY7XG59XG5cbi8qISBSdW5nZS1LdXR0YSBzcHJpbmcgcGh5c2ljcyBmdW5jdGlvbiBnZW5lcmF0b3IuIEFkYXB0ZWQgZnJvbSBGcmFtZXIuanMsIGNvcHlyaWdodCBLb2VuIEJvay4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cblxuLyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcbiAgIHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xudmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiAtc3RhdGUudGVuc2lvbiAqIHN0YXRlLnggLSBzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnY7XG4gIH1cblxuICBmdW5jdGlvbiBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoaW5pdGlhbFN0YXRlLCBkdCwgZGVyaXZhdGl2ZSkge1xuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHg6IGluaXRpYWxTdGF0ZS54ICsgZGVyaXZhdGl2ZS5keCAqIGR0LFxuICAgICAgdjogaW5pdGlhbFN0YXRlLnYgKyBkZXJpdmF0aXZlLmR2ICogZHQsXG4gICAgICB0ZW5zaW9uOiBpbml0aWFsU3RhdGUudGVuc2lvbixcbiAgICAgIGZyaWN0aW9uOiBpbml0aWFsU3RhdGUuZnJpY3Rpb25cbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkeDogc3RhdGUudixcbiAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3ByaW5nSW50ZWdyYXRlU3RhdGUoc3RhdGUsIGR0KSB7XG4gICAgdmFyIGEgPSB7XG4gICAgICBkeDogc3RhdGUudixcbiAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICB9LFxuICAgICAgICBiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXG4gICAgICAgIGMgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0ICogMC41LCBiKSxcbiAgICAgICAgZCA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQsIGMpLFxuICAgICAgICBkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXG4gICAgICAgIGR2ZHQgPSAxLjAgLyA2LjAgKiAoYS5kdiArIDIuMCAqIChiLmR2ICsgYy5kdikgKyBkLmR2KTtcbiAgICBzdGF0ZS54ID0gc3RhdGUueCArIGR4ZHQgKiBkdDtcbiAgICBzdGF0ZS52ID0gc3RhdGUudiArIGR2ZHQgKiBkdDtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gc3ByaW5nUks0RmFjdG9yeSh0ZW5zaW9uLCBmcmljdGlvbiwgZHVyYXRpb24pIHtcbiAgICB2YXIgaW5pdFN0YXRlID0ge1xuICAgICAgeDogLTEsXG4gICAgICB2OiAwLFxuICAgICAgdGVuc2lvbjogbnVsbCxcbiAgICAgIGZyaWN0aW9uOiBudWxsXG4gICAgfSxcbiAgICAgICAgcGF0aCA9IFswXSxcbiAgICAgICAgdGltZV9sYXBzZWQgPSAwLFxuICAgICAgICB0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXG4gICAgICAgIERUID0gMTYgLyAxMDAwLFxuICAgICAgICBoYXZlX2R1cmF0aW9uLFxuICAgICAgICBkdCxcbiAgICAgICAgbGFzdF9zdGF0ZTtcbiAgICB0ZW5zaW9uID0gcGFyc2VGbG9hdCh0ZW5zaW9uKSB8fCA1MDA7XG4gICAgZnJpY3Rpb24gPSBwYXJzZUZsb2F0KGZyaWN0aW9uKSB8fCAyMDtcbiAgICBkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG51bGw7XG4gICAgaW5pdFN0YXRlLnRlbnNpb24gPSB0ZW5zaW9uO1xuICAgIGluaXRTdGF0ZS5mcmljdGlvbiA9IGZyaWN0aW9uO1xuICAgIGhhdmVfZHVyYXRpb24gPSBkdXJhdGlvbiAhPT0gbnVsbDtcbiAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xuXG4gICAgaWYgKGhhdmVfZHVyYXRpb24pIHtcbiAgICAgIC8qIFJ1biB0aGUgc2ltdWxhdGlvbiB3aXRob3V0IGEgZHVyYXRpb24uICovXG4gICAgICB0aW1lX2xhcHNlZCA9IHNwcmluZ1JLNEZhY3RvcnkodGVuc2lvbiwgZnJpY3Rpb24pO1xuICAgICAgLyogQ29tcHV0ZSB0aGUgYWRqdXN0ZWQgdGltZSBkZWx0YS4gKi9cblxuICAgICAgZHQgPSB0aW1lX2xhcHNlZCAvIGR1cmF0aW9uICogRFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR0ID0gRFQ7XG4gICAgfVxuXG4gICAgZm9yICg7Oykge1xuICAgICAgLyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xuICAgICAgbGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XG4gICAgICAvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXG5cbiAgICAgIHBhdGgucHVzaCgxICsgbGFzdF9zdGF0ZS54KTtcbiAgICAgIHRpbWVfbGFwc2VkICs9IDE2O1xuICAgICAgLyogSWYgdGhlIGNoYW5nZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCwgYnJlYWsuICovXG5cbiAgICAgIGlmICghKE1hdGguYWJzKGxhc3Rfc3RhdGUueCkgPiB0b2xlcmFuY2UgJiYgTWF0aC5hYnMobGFzdF9zdGF0ZS52KSA+IHRvbGVyYW5jZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIGR1cmF0aW9uIGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gdGhlIGFjdHVhbCB0aW1lIHJlcXVpcmVkIGZvciBjb21wbGV0aW5nIHRoaXMgYW5pbWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBhIGNsb3N1cmUgdGhhdCBob2xkcyB0aGVcbiAgICAgICBjb21wdXRlZCBwYXRoIGFuZCByZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIHBvc2l0aW9uIGFjY29yZGluZyB0byBhIGdpdmVuIHBlcmNlbnRDb21wbGV0ZS4gKi9cblxuXG4gICAgcmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbiAocGVyY2VudENvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gcGF0aFtwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSB8IDBdO1xuICAgIH07XG4gIH07XG59KCk7XG5cbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKSB7XG4gIHZhciBiZXppZXIgPSBnZW5lcmF0ZUN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGJlemllcihwZXJjZW50KTtcbiAgfTtcbn07XG5cbnZhciBlYXNpbmdzID0ge1xuICAnbGluZWFyJzogZnVuY3Rpb24gbGluZWFyKHN0YXJ0LCBlbmQsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogcGVyY2VudDtcbiAgfSxcbiAgLy8gZGVmYXVsdCBlYXNpbmdzXG4gICdlYXNlJzogY3ViaWNCZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKSxcbiAgJ2Vhc2UtaW4nOiBjdWJpY0JlemllcigwLjQyLCAwLCAxLCAxKSxcbiAgJ2Vhc2Utb3V0JzogY3ViaWNCZXppZXIoMCwgMCwgMC41OCwgMSksXG4gICdlYXNlLWluLW91dCc6IGN1YmljQmV6aWVyKDAuNDIsIDAsIDAuNTgsIDEpLFxuICAvLyBzaW5lXG4gICdlYXNlLWluLXNpbmUnOiBjdWJpY0JlemllcigwLjQ3LCAwLCAwLjc0NSwgMC43MTUpLFxuICAnZWFzZS1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuMzksIDAuNTc1LCAwLjU2NSwgMSksXG4gICdlYXNlLWluLW91dC1zaW5lJzogY3ViaWNCZXppZXIoMC40NDUsIDAuMDUsIDAuNTUsIDAuOTUpLFxuICAvLyBxdWFkXG4gICdlYXNlLWluLXF1YWQnOiBjdWJpY0JlemllcigwLjU1LCAwLjA4NSwgMC42OCwgMC41MyksXG4gICdlYXNlLW91dC1xdWFkJzogY3ViaWNCZXppZXIoMC4yNSwgMC40NiwgMC40NSwgMC45NCksXG4gICdlYXNlLWluLW91dC1xdWFkJzogY3ViaWNCZXppZXIoMC40NTUsIDAuMDMsIDAuNTE1LCAwLjk1NSksXG4gIC8vIGN1YmljXG4gICdlYXNlLWluLWN1YmljJzogY3ViaWNCZXppZXIoMC41NSwgMC4wNTUsIDAuNjc1LCAwLjE5KSxcbiAgJ2Vhc2Utb3V0LWN1YmljJzogY3ViaWNCZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWN1YmljJzogY3ViaWNCZXppZXIoMC42NDUsIDAuMDQ1LCAwLjM1NSwgMSksXG4gIC8vIHF1YXJ0XG4gICdlYXNlLWluLXF1YXJ0JzogY3ViaWNCZXppZXIoMC44OTUsIDAuMDMsIDAuNjg1LCAwLjIyKSxcbiAgJ2Vhc2Utb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC4xNjUsIDAuODQsIDAuNDQsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVhcnQnOiBjdWJpY0JlemllcigwLjc3LCAwLCAwLjE3NSwgMSksXG4gIC8vIHF1aW50XG4gICdlYXNlLWluLXF1aW50JzogY3ViaWNCZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSxcbiAgJ2Vhc2Utb3V0LXF1aW50JzogY3ViaWNCZXppZXIoMC4yMywgMSwgMC4zMiwgMSksXG4gICdlYXNlLWluLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuODYsIDAsIDAuMDcsIDEpLFxuICAvLyBleHBvXG4gICdlYXNlLWluLWV4cG8nOiBjdWJpY0JlemllcigwLjk1LCAwLjA1LCAwLjc5NSwgMC4wMzUpLFxuICAnZWFzZS1vdXQtZXhwbyc6IGN1YmljQmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpLFxuICAnZWFzZS1pbi1vdXQtZXhwbyc6IGN1YmljQmV6aWVyKDEsIDAsIDAsIDEpLFxuICAvLyBjaXJjXG4gICdlYXNlLWluLWNpcmMnOiBjdWJpY0JlemllcigwLjYsIDAuMDQsIDAuOTgsIDAuMzM1KSxcbiAgJ2Vhc2Utb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjA3NSwgMC44MiwgMC4xNjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtY2lyYyc6IGN1YmljQmV6aWVyKDAuNzg1LCAwLjEzNSwgMC4xNSwgMC44NiksXG4gIC8vIHVzZXIgcGFyYW0gZWFzaW5ncy4uLlxuICAnc3ByaW5nJzogZnVuY3Rpb24gc3ByaW5nKHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgLy8gY2FuJ3QgZ2V0IGEgc3ByaW5nIHcvIGR1cmF0aW9uIDBcbiAgICAgIHJldHVybiBlYXNpbmdzLmxpbmVhcjsgLy8gZHVyYXRpb24gMCA9PiBqdW1wIHRvIGVuZCBzbyBpbXBsIGRvZXNuJ3QgbWF0dGVyXG4gICAgfVxuXG4gICAgdmFyIHNwcmluZyA9IGdlbmVyYXRlU3ByaW5nUks0KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogc3ByaW5nKHBlcmNlbnQpO1xuICAgIH07XG4gIH0sXG4gICdjdWJpYy1iZXppZXInOiBjdWJpY0JlemllclxufTtcblxuZnVuY3Rpb24gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbikge1xuICBpZiAocGVyY2VudCA9PT0gMSkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cblxuICB2YXIgdmFsID0gZWFzaW5nRm4oc3RhcnQsIGVuZCwgcGVyY2VudCk7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAodHlwZS5yb3VuZFZhbHVlIHx8IHR5cGUuY29sb3IpIHtcbiAgICB2YWwgPSBNYXRoLnJvdW5kKHZhbCk7XG4gIH1cblxuICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbCA9IE1hdGgubWF4KHZhbCwgdHlwZS5taW4pO1xuICB9XG5cbiAgaWYgKHR5cGUubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBNYXRoLm1pbih2YWwsIHR5cGUubWF4KTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHByb3AsIHNwZWMpIHtcbiAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsIHx8IHByb3AudmFsdWUgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wLnBmVmFsdWUgIT0gbnVsbCAmJiAoc3BlYyA9PSBudWxsIHx8IHNwZWMudHlwZS51bml0cyAhPT0gJyUnKSkge1xuICAgICAgcmV0dXJuIHByb3AucGZWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb3AudmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcm9wO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVhc2Uoc3RhcnRQcm9wLCBlbmRQcm9wLCBwZXJjZW50LCBlYXNpbmdGbiwgcHJvcFNwZWMpIHtcbiAgdmFyIHR5cGUgPSBwcm9wU3BlYyAhPSBudWxsID8gcHJvcFNwZWMudHlwZSA6IG51bGw7XG5cbiAgaWYgKHBlcmNlbnQgPCAwKSB7XG4gICAgcGVyY2VudCA9IDA7XG4gIH0gZWxzZSBpZiAocGVyY2VudCA+IDEpIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfVxuXG4gIHZhciBzdGFydCA9IGdldFZhbHVlKHN0YXJ0UHJvcCwgcHJvcFNwZWMpO1xuICB2YXIgZW5kID0gZ2V0VmFsdWUoZW5kUHJvcCwgcHJvcFNwZWMpO1xuXG4gIGlmIChudW1iZXIoc3RhcnQpICYmIG51bWJlcihlbmQpKSB7XG4gICAgcmV0dXJuIGdldEVhc2VkVmFsdWUodHlwZSwgc3RhcnQsIGVuZCwgcGVyY2VudCwgZWFzaW5nRm4pO1xuICB9IGVsc2UgaWYgKGFycmF5KHN0YXJ0KSAmJiBhcnJheShlbmQpKSB7XG4gICAgdmFyIGVhc2VkQXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNpID0gc3RhcnRbaV07XG4gICAgICB2YXIgZWkgPSBlbmRbaV07XG5cbiAgICAgIGlmIChzaSAhPSBudWxsICYmIGVpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHZhbCA9IGdldEVhc2VkVmFsdWUodHlwZSwgc2ksIGVpLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gICAgICAgIGVhc2VkQXJyLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVhc2VkQXJyLnB1c2goZWkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlYXNlZEFycjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0ZXAoc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgaXNFbGVzID0gIWlzQ29yZTtcbiAgdmFyIF9wID0gc2VsZi5fcHJpdmF0ZTtcbiAgdmFyIGFuaV9wID0gYW5pLl9wcml2YXRlO1xuICB2YXIgcEVhc2luZyA9IGFuaV9wLmVhc2luZztcbiAgdmFyIHN0YXJ0VGltZSA9IGFuaV9wLnN0YXJ0VGltZTtcbiAgdmFyIGN5ID0gaXNDb3JlID8gc2VsZiA6IHNlbGYuY3koKTtcbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcblxuICBpZiAoIWFuaV9wLmVhc2luZ0ltcGwpIHtcbiAgICBpZiAocEVhc2luZyA9PSBudWxsKSB7XG4gICAgICAvLyB1c2UgZGVmYXVsdFxuICAgICAgYW5pX3AuZWFzaW5nSW1wbCA9IGVhc2luZ3NbJ2xpbmVhciddO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGRlZmluZSB3LyBuYW1lXG4gICAgICB2YXIgZWFzaW5nVmFscztcblxuICAgICAgaWYgKHN0cmluZyhwRWFzaW5nKSkge1xuICAgICAgICB2YXIgZWFzaW5nUHJvcCA9IHN0eWxlLnBhcnNlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsIHBFYXNpbmcpO1xuICAgICAgICBlYXNpbmdWYWxzID0gZWFzaW5nUHJvcC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZW4gYXNzdW1lIHByZXBhcnNlZCBhcnJheVxuICAgICAgICBlYXNpbmdWYWxzID0gcEVhc2luZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUsIGFyZ3M7XG5cbiAgICAgIGlmIChzdHJpbmcoZWFzaW5nVmFscykpIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHM7XG4gICAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgPSBlYXNpbmdWYWxzWzFdO1xuICAgICAgICBhcmdzID0gZWFzaW5nVmFscy5zbGljZSgyKS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gK247XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGNyZWF0ZSB3aXRoIGFyZ3NcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzcHJpbmcnKSB7XG4gICAgICAgICAgYXJncy5wdXNoKGFuaV9wLmR1cmF0aW9uKTsgLy8gbmVlZCBkdXJhdGlvbiB0byBnZW5lcmF0ZSBzcHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RhdGljIGltcGwgYnkgbmFtZVxuICAgICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZWFzaW5nID0gYW5pX3AuZWFzaW5nSW1wbDtcbiAgdmFyIHBlcmNlbnQ7XG5cbiAgaWYgKGFuaV9wLmR1cmF0aW9uID09PSAwKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH0gZWxzZSB7XG4gICAgcGVyY2VudCA9IChub3cgLSBzdGFydFRpbWUpIC8gYW5pX3AuZHVyYXRpb247XG4gIH1cblxuICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICBwZXJjZW50ID0gYW5pX3AucHJvZ3Jlc3M7XG4gIH1cblxuICBpZiAocGVyY2VudCA8IDApIHtcbiAgICBwZXJjZW50ID0gMDtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgIHBlcmNlbnQgPSAxO1xuICB9XG5cbiAgaWYgKGFuaV9wLmRlbGF5ID09IG51bGwpIHtcbiAgICAvLyB0aGVuIHVwZGF0ZVxuICAgIHZhciBzdGFydFBvcyA9IGFuaV9wLnN0YXJ0UG9zaXRpb247XG4gICAgdmFyIGVuZFBvcyA9IGFuaV9wLnBvc2l0aW9uO1xuXG4gICAgaWYgKGVuZFBvcyAmJiBpc0VsZXMgJiYgIXNlbGYubG9ja2VkKCkpIHtcbiAgICAgIHZhciBuZXdQb3MgPSB7fTtcblxuICAgICAgaWYgKHZhbGlkKHN0YXJ0UG9zLngsIGVuZFBvcy54KSkge1xuICAgICAgICBuZXdQb3MueCA9IGVhc2Uoc3RhcnRQb3MueCwgZW5kUG9zLngsIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWxpZChzdGFydFBvcy55LCBlbmRQb3MueSkpIHtcbiAgICAgICAgbmV3UG9zLnkgPSBlYXNlKHN0YXJ0UG9zLnksIGVuZFBvcy55LCBwZXJjZW50LCBlYXNpbmcpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0UGFuID0gYW5pX3Auc3RhcnRQYW47XG4gICAgdmFyIGVuZFBhbiA9IGFuaV9wLnBhbjtcbiAgICB2YXIgcGFuID0gX3AucGFuO1xuICAgIHZhciBhbmltYXRpbmdQYW4gPSBlbmRQYW4gIT0gbnVsbCAmJiBpc0NvcmU7XG5cbiAgICBpZiAoYW5pbWF0aW5nUGFuKSB7XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueCwgZW5kUGFuLngpKSB7XG4gICAgICAgIHBhbi54ID0gZWFzZShzdGFydFBhbi54LCBlbmRQYW4ueCwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkKHN0YXJ0UGFuLnksIGVuZFBhbi55KSkge1xuICAgICAgICBwYW4ueSA9IGVhc2Uoc3RhcnRQYW4ueSwgZW5kUGFuLnksIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuZW1pdCgncGFuJyk7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0Wm9vbSA9IGFuaV9wLnN0YXJ0Wm9vbTtcbiAgICB2YXIgZW5kWm9vbSA9IGFuaV9wLnpvb207XG4gICAgdmFyIGFuaW1hdGluZ1pvb20gPSBlbmRab29tICE9IG51bGwgJiYgaXNDb3JlO1xuXG4gICAgaWYgKGFuaW1hdGluZ1pvb20pIHtcbiAgICAgIGlmICh2YWxpZChzdGFydFpvb20sIGVuZFpvb20pKSB7XG4gICAgICAgIF9wLnpvb20gPSBib3VuZChfcC5taW5ab29tLCBlYXNlKHN0YXJ0Wm9vbSwgZW5kWm9vbSwgcGVyY2VudCwgZWFzaW5nKSwgX3AubWF4Wm9vbSk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuZW1pdCgnem9vbScpO1xuICAgIH1cblxuICAgIGlmIChhbmltYXRpbmdQYW4gfHwgYW5pbWF0aW5nWm9vbSkge1xuICAgICAgc2VsZi5lbWl0KCd2aWV3cG9ydCcpO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IGFuaV9wLnN0eWxlO1xuXG4gICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCA+IDAgJiYgaXNFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIGVuZCA9IHByb3A7XG4gICAgICAgIHZhciBzdGFydCA9IGFuaV9wLnN0YXJ0U3R5bGVbX25hbWVdO1xuICAgICAgICB2YXIgcHJvcFNwZWMgPSBzdHlsZS5wcm9wZXJ0aWVzW3N0YXJ0Lm5hbWVdO1xuICAgICAgICB2YXIgZWFzZWRWYWwgPSBlYXNlKHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZywgcHJvcFNwZWMpO1xuICAgICAgICBzdHlsZS5vdmVycmlkZUJ5cGFzcyhzZWxmLCBfbmFtZSwgZWFzZWRWYWwpO1xuICAgICAgfSAvLyBmb3IgcHJvcHNcblxuXG4gICAgICBzZWxmLmVtaXQoJ3N0eWxlJyk7XG4gICAgfSAvLyBpZlxuXG4gIH1cblxuICBhbmlfcC5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gIHJldHVybiBwZXJjZW50O1xufVxuXG5mdW5jdGlvbiB2YWxpZChzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG51bWJlcihzdGFydCkgJiYgbnVtYmVyKGVuZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwT25lKGVsZSwgaXNDb3JlKSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjdXJyZW50ID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgdmFyIHF1ZXVlID0gX3AuYW5pbWF0aW9uLnF1ZXVlO1xuICAgIHZhciByYW5BbmlzID0gZmFsc2U7IC8vIGlmIG5vdGhpbmcgY3VycmVudGx5IGFuaW1hdGluZywgZ2V0IHNvbWV0aGluZyBmcm9tIHRoZSBxdWV1ZVxuXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2tzID0gZnVuY3Rpb24gY2FsbGJhY2tzKF9jYWxsYmFja3MpIHtcbiAgICAgIGZvciAodmFyIGogPSBfY2FsbGJhY2tzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBjYiA9IF9jYWxsYmFja3Nbal07XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG5cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9OyAvLyBzdGVwIGFuZCByZW1vdmUgaWYgZG9uZVxuXG5cbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG5cbiAgICAgIGlmIChhbmlfcC5zdG9wcGVkKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhbmlfcC5wbGF5aW5nICYmICFhbmlfcC5hcHBseWluZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gYW4gYXBwbHkoKSB3aGlsZSBwbGF5aW5nIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuXG5cbiAgICAgIGlmIChhbmlfcC5wbGF5aW5nICYmIGFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGFuaV9wLmFwcGx5aW5nID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghYW5pX3Auc3RhcnRlZCkge1xuICAgICAgICBzdGFydEFuaW1hdGlvbihlbGUsIGFuaSwgbm93KTtcbiAgICAgIH1cblxuICAgICAgc3RlcChlbGUsIGFuaSwgbm93LCBpc0NvcmUpO1xuXG4gICAgICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2tzKGFuaV9wLmZyYW1lcyk7XG5cbiAgICAgIGlmIChhbmlfcC5zdGVwICE9IG51bGwpIHtcbiAgICAgICAgYW5pX3Auc3RlcChub3cpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYW5pLmNvbXBsZXRlZCgpKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5jb21wbGV0ZXMpO1xuICAgICAgfVxuXG4gICAgICByYW5BbmlzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29yZSAmJiBjdXJyZW50Lmxlbmd0aCA9PT0gMCAmJiBxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRvbmVFbGVzLnB1c2goZWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuQW5pcztcbiAgfSAvLyBzdGVwRWxlbWVudFxuICAvLyBoYW5kbGUgYWxsIGVsZXNcblxuXG4gIHZhciByYW5FbGVBbmkgPSBmYWxzZTtcblxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVsZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tlXTtcbiAgICB2YXIgaGFuZGxlZFRoaXNFbGUgPSBzdGVwT25lKGVsZSk7XG4gICAgcmFuRWxlQW5pID0gcmFuRWxlQW5pIHx8IGhhbmRsZWRUaGlzRWxlO1xuICB9IC8vIGVhY2ggZWxlbWVudFxuXG5cbiAgdmFyIHJhbkNvcmVBbmkgPSBzdGVwT25lKGN5LCB0cnVlKTsgLy8gbm90aWZ5IHJlbmRlcmVyXG5cbiAgaWYgKHJhbkVsZUFuaSB8fCByYW5Db3JlQW5pKSB7XG4gICAgaWYgKGVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3kubm90aWZ5KCdkcmF3JywgZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgIH1cbiAgfSAvLyByZW1vdmUgZWxlbWVudHMgZnJvbSBsaXN0IG9mIGN1cnJlbnRseSBhbmltYXRpbmcgaWYgaXRzIHF1ZXVlcyBhcmUgZW1wdHlcblxuXG4gIGVsZXMudW5tZXJnZShkb25lRWxlcyk7XG4gIGN5LmVtaXQoJ3N0ZXAnKTtcbn0gLy8gc3RlcEFsbFxuXG52YXIgY29yZWZuJDEgPSB7XG4gIC8vIHB1bGwgaW4gYW5pbWF0aW9uIGZ1bmN0aW9uc1xuICBhbmltYXRlOiBkZWZpbmUkMy5hbmltYXRlKCksXG4gIGFuaW1hdGlvbjogZGVmaW5lJDMuYW5pbWF0aW9uKCksXG4gIGFuaW1hdGVkOiBkZWZpbmUkMy5hbmltYXRlZCgpLFxuICBjbGVhclF1ZXVlOiBkZWZpbmUkMy5jbGVhclF1ZXVlKCksXG4gIGRlbGF5OiBkZWZpbmUkMy5kZWxheSgpLFxuICBkZWxheUFuaW1hdGlvbjogZGVmaW5lJDMuZGVsYXlBbmltYXRpb24oKSxcbiAgc3RvcDogZGVmaW5lJDMuc3RvcCgpLFxuICBhZGRUb0FuaW1hdGlvblBvb2w6IGZ1bmN0aW9uIGFkZFRvQW5pbWF0aW9uUG9vbChlbGVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG5cbiAgICBjeS5fcHJpdmF0ZS5hbmlFbGVzLm1lcmdlKGVsZXMpO1xuICB9LFxuICBzdG9wQW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gc3RvcEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IGZhbHNlO1xuICB9LFxuICBzdGFydEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uTG9vcCgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5Ll9wcml2YXRlLmFuaW1hdGlvbnNSdW5uaW5nID0gdHJ1ZTtcblxuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuICAgIC8vIE5CIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGV4ZWMgaW4gaGVhZGxlc3MgZW52aXJvbm1lbnRzIGlmIHN0eWxlIGVuYWJsZWRcbiAgICAvLyBhbmQgZXhwbGljaXQgY3kuZGVzdHJveSgpIGlzIG5lY2Vzc2FyeSB0byBzdG9wIHRoZSBsb29wXG5cblxuICAgIGZ1bmN0aW9uIGhlYWRsZXNzU3RlcCgpIHtcbiAgICAgIGlmICghY3kuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgcmVuZGVyZXIgPSBjeS5yZW5kZXJlcigpO1xuXG4gICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLmJlZm9yZVJlbmRlcikge1xuICAgICAgLy8gbGV0IHRoZSByZW5kZXJlciBzY2hlZHVsZSBhbmltYXRpb25zXG4gICAgICByZW5kZXJlci5iZWZvcmVSZW5kZXIoZnVuY3Rpb24gcmVuZGVyZXJBbmltYXRpb25TdGVwKHdpbGxEcmF3LCBub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgIH0sIHJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMuYW5pbWF0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1hbmFnZSB0aGUgYW5pbWF0aW9uIGxvb3Agb3Vyc2VsdmVzXG4gICAgICBoZWFkbGVzc1N0ZXAoKTsgLy8gZmlyc3QgY2FsbFxuICAgIH1cbiAgfVxufTtcblxudmFyIGVtaXR0ZXJPcHRpb25zJDEgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcblxuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gY3kgIT09IGV2ZW50T2JqLnRhcmdldCAmJiBlbGVtZW50KGV2ZW50T2JqLnRhcmdldCkgJiYgc2VsZWN0b3IubWF0Y2hlcyhldmVudE9iai50YXJnZXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBhZGRFdmVudEZpZWxkczogZnVuY3Rpb24gYWRkRXZlbnRGaWVsZHMoY3ksIGV2dCkge1xuICAgIGV2dC5jeSA9IGN5O1xuICAgIGV2dC50YXJnZXQgPSBjeTtcbiAgfSxcbiAgY2FsbGJhY2tDb250ZXh0OiBmdW5jdGlvbiBjYWxsYmFja0NvbnRleHQoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHJldHVybiBsaXN0ZW5lci5xdWFsaWZpZXIgIT0gbnVsbCA/IGV2ZW50T2JqLnRhcmdldCA6IGN5O1xuICB9XG59O1xuXG52YXIgYXJnU2VsZWN0b3IkMSA9IGZ1bmN0aW9uIGFyZ1NlbGVjdG9yKGFyZykge1xuICBpZiAoc3RyaW5nKGFyZykpIHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yKGFyZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfVxufTtcblxudmFyIGVsZXNmbiR2ID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoIV9wLmVtaXR0ZXIpIHtcbiAgICAgIF9wLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcihlbWl0dGVyT3B0aW9ucyQxLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUxpc3RlbmVyKGV2ZW50cywgYXJnU2VsZWN0b3IkMShzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG9uZTogZnVuY3Rpb24gb25lKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsZWN0b3IkMShzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcykge1xuICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoZXZlbnRzLCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXRBbmROb3RpZnk6IGZ1bmN0aW9uIGVtaXRBbmROb3RpZnkoZXZlbnQsIGVsZXMpIHtcbiAgICB0aGlzLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMubm90aWZ5KGV2ZW50LCBlbGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZSQzLmV2ZW50QWxpYXNlc09uKGVsZXNmbiR2KTtcblxudmFyIGNvcmVmbiQyID0ge1xuICBwbmc6IGZ1bmN0aW9uIHBuZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gcmVuZGVyZXIucG5nKG9wdGlvbnMpO1xuICB9LFxuICBqcGc6IGZ1bmN0aW9uIGpwZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmJnID0gb3B0aW9ucy5iZyB8fCAnI2ZmZic7XG4gICAgcmV0dXJuIHJlbmRlcmVyLmpwZyhvcHRpb25zKTtcbiAgfVxufTtcbmNvcmVmbiQyLmpwZWcgPSBjb3JlZm4kMi5qcGc7XG5cbnZhciBjb3JlZm4kMyA9IHtcbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG5cbiAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICBlcnJvcignTGF5b3V0IG9wdGlvbnMgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5hbWUgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgYG5hbWVgIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB2YXIgTGF5b3V0ID0gY3kuZXh0ZW5zaW9uKCdsYXlvdXQnLCBuYW1lKTtcblxuICAgIGlmIChMYXlvdXQgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ05vIHN1Y2ggbGF5b3V0IGAnICsgbmFtZSArICdgIGZvdW5kLiAgRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD8nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZWxlcztcblxuICAgIGlmIChzdHJpbmcob3B0aW9ucy5lbGVzKSkge1xuICAgICAgZWxlcyA9IGN5LiQob3B0aW9ucy5lbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcyA9IG9wdGlvbnMuZWxlcyAhPSBudWxsID8gb3B0aW9ucy5lbGVzIDogY3kuJCgpO1xuICAgIH1cblxuICAgIHZhciBsYXlvdXQgPSBuZXcgTGF5b3V0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgY3k6IGN5LFxuICAgICAgZWxlczogZWxlc1xuICAgIH0pKTtcbiAgICByZXR1cm4gbGF5b3V0O1xuICB9XG59O1xuY29yZWZuJDMuY3JlYXRlTGF5b3V0ID0gY29yZWZuJDMubWFrZUxheW91dCA9IGNvcmVmbiQzLmxheW91dDtcblxudmFyIGNvcmVmbiQ0ID0ge1xuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeShldmVudE5hbWUsIGV2ZW50RWxlcykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAodGhpcy5iYXRjaGluZygpKSB7XG4gICAgICBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnMgfHwge307XG4gICAgICB2YXIgZWxlcyA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gfHwgdGhpcy5jb2xsZWN0aW9uKCk7XG5cbiAgICAgIGlmIChldmVudEVsZXMgIT0gbnVsbCkge1xuICAgICAgICBlbGVzLm1lcmdlKGV2ZW50RWxlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjsgLy8gbm90aWZpY2F0aW9ucyBhcmUgZGlzYWJsZWQgZHVyaW5nIGJhdGNoaW5nXG4gICAgfVxuXG4gICAgaWYgKCFfcC5ub3RpZmljYXRpb25zRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZXhpdCBvbiBkaXNhYmxlZFxuXG5cbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7IC8vIGV4aXQgaWYgZGVzdHJveSgpIGNhbGxlZCBvbiBjb3JlIG9yIHJlbmRlcmVyIGluIGJldHdlZW4gZnJhbWVzICMxNDk5ICMxNTI4XG5cbiAgICBpZiAodGhpcy5kZXN0cm95ZWQoKSB8fCAhcmVuZGVyZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpO1xuICB9LFxuICBub3RpZmljYXRpb25zOiBmdW5jdGlvbiBub3RpZmljYXRpb25zKGJvb2wpIHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoYm9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcC5ub3RpZmljYXRpb25zRW5hYmxlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcC5ub3RpZmljYXRpb25zRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG5vTm90aWZpY2F0aW9uczogZnVuY3Rpb24gbm9Ob3RpZmljYXRpb25zKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25zKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyh0cnVlKTtcbiAgfSxcbiAgYmF0Y2hpbmc6IGZ1bmN0aW9uIGJhdGNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmJhdGNoQ291bnQgPiAwO1xuICB9LFxuICBzdGFydEJhdGNoOiBmdW5jdGlvbiBzdGFydEJhdGNoKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PSBudWxsKSB7XG4gICAgICBfcC5iYXRjaENvdW50ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgX3AuYmF0Y2hTdHlsZUVsZXMgPSB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIF9wLmJhdGNoQ291bnQrKztcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW5kQmF0Y2g6IGZ1bmN0aW9uIGVuZEJhdGNoKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX3AuYmF0Y2hDb3VudC0tO1xuXG4gICAgaWYgKF9wLmJhdGNoQ291bnQgPT09IDApIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBmb3IgZGlydHkgZWxlc1xuICAgICAgX3AuYmF0Y2hTdHlsZUVsZXMudXBkYXRlU3R5bGUoKTtcblxuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcigpOyAvLyBub3RpZnkgdGhlIHJlbmRlcmVyIG9mIHF1ZXVlZCBlbGVzIGFuZCBldmVudCB0eXBlc1xuXG4gICAgICBPYmplY3Qua2V5cyhfcC5iYXRjaE5vdGlmaWNhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICB2YXIgZWxlcyA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdO1xuXG4gICAgICAgIGlmIChlbGVzLmVtcHR5KCkpIHtcbiAgICAgICAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5ub3RpZnkoZXZlbnROYW1lLCBlbGVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGJhdGNoOiBmdW5jdGlvbiBiYXRjaChjYWxsYmFjaykge1xuICAgIHRoaXMuc3RhcnRCYXRjaCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gICAgdGhpcy5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgYmF0Y2hEYXRhOiBmdW5jdGlvbiBiYXRjaERhdGEobWFwKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWFwKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgICB2YXIgZGF0YSA9IG1hcFtpZF07XG4gICAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsZS5kYXRhKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgcmVuZGVyZXJEZWZhdWx0cyA9IGRlZmF1bHRzKHtcbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogZmFsc2UsXG4gIHRleHR1cmVPblZpZXdwb3J0OiBmYWxzZSxcbiAgbW90aW9uQmx1cjogZmFsc2UsXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiAwLjA1LFxuICBwaXhlbFJhdGlvOiB1bmRlZmluZWQsXG4gIGRlc2t0b3BUYXBUaHJlc2hvbGQ6IDQsXG4gIHRvdWNoVGFwVGhyZXNob2xkOiA4LFxuICB3aGVlbFNlbnNpdGl2aXR5OiAxLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHNob3dGcHM6IGZhbHNlXG59KTtcbnZhciBjb3JlZm4kNSA9IHtcbiAgcmVuZGVyVG86IGZ1bmN0aW9uIHJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbykge1xuICAgIHZhciByID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICByLnJlbmRlclRvKGNvbnRleHQsIHpvb20sIHBhbiwgcHhSYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbmRlcmVyOiBmdW5jdGlvbiByZW5kZXJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgfSxcbiAgZm9yY2VSZW5kZXI6IGZ1bmN0aW9uIGZvcmNlUmVuZGVyKCkge1xuICAgIHRoaXMubm90aWZ5KCdkcmF3Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlc2l6ZTogZnVuY3Rpb24gcmVzaXplKCkge1xuICAgIHRoaXMuaW52YWxpZGF0ZVNpemUoKTtcbiAgICB0aGlzLmVtaXRBbmROb3RpZnkoJ3Jlc2l6ZScpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBpbml0UmVuZGVyZXI6IGZ1bmN0aW9uIGluaXRSZW5kZXJlcihvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgUmVuZGVyZXJQcm90byA9IGN5LmV4dGVuc2lvbigncmVuZGVyZXInLCBvcHRpb25zLm5hbWUpO1xuXG4gICAgaWYgKFJlbmRlcmVyUHJvdG8gPT0gbnVsbCkge1xuICAgICAgZXJyb3IoXCJDYW4gbm90IGluaXRpYWxpc2U6IE5vIHN1Y2ggcmVuZGVyZXIgYFwiLmNvbmNhdChvcHRpb25zLm5hbWUsIFwiYCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD9cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcIllvdSBoYXZlIHNldCBhIGN1c3RvbSB3aGVlbCBzZW5zaXRpdml0eS4gIFRoaXMgd2lsbCBtYWtlIHlvdXIgYXBwIHpvb20gdW5uYXR1cmFsbHkgd2hlbiB1c2luZyBtYWluc3RyZWFtIG1pY2UuICBZb3Ugc2hvdWxkIGNoYW5nZSB0aGlzIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgb25seSBpZiB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0IGFsbCB5b3VyIHVzZXJzIHdpbGwgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIGFuZCBPUyBjb25maWd1cmF0aW9uIGFzIHlvdXIgY3VycmVudCBtYWNoaW5lLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgck9wdHMgPSByZW5kZXJlckRlZmF1bHRzKG9wdGlvbnMpO1xuICAgIHJPcHRzLmN5ID0gY3k7XG4gICAgY3kuX3ByaXZhdGUucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXJQcm90byhyT3B0cyk7XG4gICAgdGhpcy5ub3RpZnkoJ2luaXQnKTtcbiAgfSxcbiAgZGVzdHJveVJlbmRlcmVyOiBmdW5jdGlvbiBkZXN0cm95UmVuZGVyZXIoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5ub3RpZnkoJ2Rlc3Ryb3knKTsgLy8gZGVzdHJveSB0aGUgcmVuZGVyZXJcblxuICAgIHZhciBkb21FbGUgPSBjeS5jb250YWluZXIoKTtcblxuICAgIGlmIChkb21FbGUpIHtcbiAgICAgIGRvbUVsZS5fY3lyZWcgPSBudWxsO1xuXG4gICAgICB3aGlsZSAoZG9tRWxlLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBkb21FbGUucmVtb3ZlQ2hpbGQoZG9tRWxlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN5Ll9wcml2YXRlLnJlbmRlcmVyID0gbnVsbDsgLy8gdG8gYmUgZXh0cmEgc2FmZSwgcmVtb3ZlIHRoZSByZWZcblxuICAgIGN5Lm11dGFibGVFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AucnNjcmF0Y2ggPSB7fTtcbiAgICAgIF9wLnJzdHlsZSA9IHt9O1xuICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgIH0pO1xuICB9LFxuICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5vbigncmVuZGVyJywgZm4pO1xuICB9LFxuICBvZmZSZW5kZXI6IGZ1bmN0aW9uIG9mZlJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9mZigncmVuZGVyJywgZm4pO1xuICB9XG59O1xuY29yZWZuJDUuaW52YWxpZGF0ZURpbWVuc2lvbnMgPSBjb3JlZm4kNS5yZXNpemU7XG5cbnZhciBjb3JlZm4kNiA9IHtcbiAgLy8gZ2V0IGEgY29sbGVjdGlvblxuICAvLyAtIGVtcHR5IGNvbGxlY3Rpb24gb24gbm8gYXJnc1xuICAvLyAtIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG9uIHNlbGVjdG9yIGFyZ1xuICAvLyAtIGd1YXJhbnRlZSBhIHJldHVybmVkIGNvbGxlY3Rpb24gd2hlbiBlbGVtZW50cyBvciBjb2xsZWN0aW9uIHNwZWNpZmllZFxuICBjb2xsZWN0aW9uOiBmdW5jdGlvbiBjb2xsZWN0aW9uKGVsZXMsIG9wdHMpIHtcbiAgICBpZiAoc3RyaW5nKGVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kKGVsZXMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVzKSkge1xuICAgICAgcmV0dXJuIGVsZXMuY29sbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoZWxlcykpIHtcbiAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzLCBlbGVzLCBvcHRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcyk7XG4gIH0sXG4gIG5vZGVzOiBmdW5jdGlvbiBub2RlcyhzZWxlY3Rvcikge1xuICAgIHZhciBub2RlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzTm9kZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH0sXG4gIGVkZ2VzOiBmdW5jdGlvbiBlZGdlcyhzZWxlY3Rvcikge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmlzRWRnZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gZWRnZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZXM7XG4gIH0sXG4gIC8vIHNlYXJjaCB0aGUgZ3JhcGggbGlrZSBqUXVlcnlcbiAgJDogZnVuY3Rpb24gJChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIGVsZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZXMuc3Bhd25TZWxmKCk7XG4gICAgfVxuICB9LFxuICBtdXRhYmxlRWxlbWVudHM6IGZ1bmN0aW9uIG11dGFibGVFbGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5jb3JlZm4kNi5lbGVtZW50cyA9IGNvcmVmbiQ2LmZpbHRlciA9IGNvcmVmbiQ2LiQ7XG5cbnZhciBzdHlmbiA9IHt9OyAvLyBrZXlzIGZvciBzdHlsZSBibG9ja3MsIGUuZy4gdHRmZnR0XG5cbnZhciBUUlVFID0gJ3QnO1xudmFyIEZBTFNFID0gJ2YnOyAvLyAocG90ZW50aWFsbHkgZXhwZW5zaXZlIGNhbGN1bGF0aW9uKVxuLy8gYXBwbHkgdGhlIHN0eWxlIHRvIHRoZSBlbGVtZW50IGJhc2VkIG9uXG4vLyAtIGl0cyBieXBhc3Ncbi8vIC0gd2hhdCBzZWxlY3RvcnMgbWF0Y2ggaXRcblxuc3R5Zm4uYXBwbHkgPSBmdW5jdGlvbiAoZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBfcCA9IHNlbGYuX3ByaXZhdGU7XG4gIHZhciBjeSA9IF9wLmN5O1xuICB2YXIgdXBkYXRlZEVsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG5cbiAgZm9yICh2YXIgaWUgPSAwOyBpZSA8IGVsZXMubGVuZ3RoOyBpZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaWVdO1xuICAgIHZhciBjeHRNZXRhID0gc2VsZi5nZXRDb250ZXh0TWV0YShlbGUpO1xuXG4gICAgaWYgKGN4dE1ldGEuZW1wdHkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjeHRTdHlsZSA9IHNlbGYuZ2V0Q29udGV4dFN0eWxlKGN4dE1ldGEpO1xuICAgIHZhciBhcHAgPSBzZWxmLmFwcGx5Q29udGV4dFN0eWxlKGN4dE1ldGEsIGN4dFN0eWxlLCBlbGUpO1xuXG4gICAgaWYgKGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlKSB7XG4gICAgICBzZWxmLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgYXBwLmRpZmZQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaGludHNEaWZmID0gc2VsZi51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG5cbiAgICBpZiAoaGludHNEaWZmKSB7XG4gICAgICB1cGRhdGVkRWxlcy5wdXNoKGVsZSk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVtZW50c1xuXG5cbiAgcmV0dXJuIHVwZGF0ZWRFbGVzO1xufTtcblxuc3R5Zm4uZ2V0UHJvcGVydGllc0RpZmYgPSBmdW5jdGlvbiAob2xkQ3h0S2V5LCBuZXdDeHRLZXkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2FjaGUgPSBzZWxmLl9wcml2YXRlLnByb3BEaWZmcyA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzIHx8IHt9O1xuICB2YXIgZHVhbEN4dEtleSA9IG9sZEN4dEtleSArICctJyArIG5ld0N4dEtleTtcbiAgdmFyIGNhY2hlZFZhbCA9IGNhY2hlW2R1YWxDeHRLZXldO1xuXG4gIGlmIChjYWNoZWRWYWwpIHtcbiAgICByZXR1cm4gY2FjaGVkVmFsO1xuICB9XG5cbiAgdmFyIGRpZmZQcm9wcyA9IFtdO1xuICB2YXIgYWRkZWRQcm9wID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIG9sZEhhc0N4dCA9IG9sZEN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICB2YXIgbmV3SGFzQ3h0ID0gbmV3Q3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBjeHRIYXNEaWZmZWQgPSBvbGRIYXNDeHQgIT09IG5ld0hhc0N4dDtcbiAgICB2YXIgY3h0SGFzTWFwcGVkUHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllcy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKGN4dEhhc0RpZmZlZCB8fCBuZXdIYXNDeHQgJiYgY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgIHZhciBwcm9wcyA9IHZvaWQgMDtcblxuICAgICAgaWYgKGN4dEhhc0RpZmZlZCAmJiBjeHRIYXNNYXBwZWRQcm9wcykge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBzdWZmaWNlcyBiL2MgbWFwcGVkUHJvcGVydGllcyBpcyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc0RpZmZlZCkge1xuICAgICAgICBwcm9wcyA9IGN4dC5wcm9wZXJ0aWVzOyAvLyBuZWVkIHRvIGNoZWNrIHRoZW0gYWxsXG4gICAgICB9IGVsc2UgaWYgKGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICAgIHByb3BzID0gY3h0Lm1hcHBlZFByb3BlcnRpZXM7IC8vIG9ubHkgbmVlZCB0byBjaGVjayBtYXBwZWRcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgICB2YXIgbmFtZSA9IHByb3AubmFtZTsgLy8gaWYgYSBsYXRlciBjb250ZXh0IG92ZXJyaWRlcyB0aGlzIHByb3BlcnR5LCB0aGVuIHRoZSBmYWN0IHRoYXQgdGhpcyBjb250ZXh0IGhhcyBzd2l0Y2hlZC9kaWZmZWQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgLy8gKHNlbWkgZXhwZW5zaXZlIGNoZWNrIHNpbmNlIGl0IG1ha2VzIHRoaXMgZnVuY3Rpb24gTyhuXjIpIG9uIGNvbnRleHQgbGVuZ3RoLCBidXQgd29ydGggaXQgc2luY2Ugb3ZlcmFsbCByZXN1bHRcbiAgICAgICAgLy8gaXMgY2FjaGVkKVxuXG4gICAgICAgIHZhciBsYXRlckN4dE92ZXJyaWRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcblxuICAgICAgICAgIGlmICghaGFzTGF0ZXJDeHQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gLy8gY2FuJ3Qgb3ZlcnJpZGUgdW5sZXNzIHRoZSBjb250ZXh0IGlzIGFjdGl2ZVxuXG5cbiAgICAgICAgICBsYXRlckN4dE92ZXJyaWRlcyA9IGxhdGVyQ3h0LnByb3BlcnRpZXNbcHJvcC5uYW1lXSAhPSBudWxsO1xuXG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhZGRlZFByb3BbbmFtZV0gJiYgIWxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgYWRkZWRQcm9wW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBkaWZmUHJvcHMucHVzaChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3IgcHJvcHNcblxuICAgIH0gLy8gaWZcblxuICB9IC8vIGZvciBjb250ZXh0c1xuXG5cbiAgY2FjaGVbZHVhbEN4dEtleV0gPSBkaWZmUHJvcHM7XG4gIHJldHVybiBkaWZmUHJvcHM7XG59O1xuXG5zdHlmbi5nZXRDb250ZXh0TWV0YSA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3h0S2V5ID0gJyc7XG4gIHZhciBkaWZmUHJvcHM7XG4gIHZhciBwcmV2S2V5ID0gZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5IHx8ICcnOyAvLyBnZXQgdGhlIGN4dCBrZXlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IHNlbGZbaV07XG4gICAgdmFyIGNvbnRleHRTZWxlY3Rvck1hdGNoZXMgPSBjb250ZXh0LnNlbGVjdG9yICYmIGNvbnRleHQuc2VsZWN0b3IubWF0Y2hlcyhlbGUpOyAvLyBOQjogY29udGV4dC5zZWxlY3RvciBtYXkgYmUgbnVsbCBmb3IgJ2NvcmUnXG5cbiAgICBpZiAoY29udGV4dFNlbGVjdG9yTWF0Y2hlcykge1xuICAgICAgY3h0S2V5ICs9IFRSVUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN4dEtleSArPSBGQUxTRTtcbiAgICB9XG4gIH0gLy8gZm9yIGNvbnRleHRcblxuXG4gIGRpZmZQcm9wcyA9IHNlbGYuZ2V0UHJvcGVydGllc0RpZmYocHJldktleSwgY3h0S2V5KTtcbiAgZWxlLl9wcml2YXRlLnN0eWxlQ3h0S2V5ID0gY3h0S2V5O1xuICByZXR1cm4ge1xuICAgIGtleTogY3h0S2V5LFxuICAgIGRpZmZQcm9wTmFtZXM6IGRpZmZQcm9wcyxcbiAgICBlbXB0eTogZGlmZlByb3BzLmxlbmd0aCA9PT0gMFxuICB9O1xufTsgLy8gZ2V0cyBhIGNvbXB1dGVkIGVsZSBzdHlsZSBvYmplY3QgYmFzZWQgb24gbWF0Y2hlZCBjb250ZXh0c1xuXG5cbnN0eWZuLmdldENvbnRleHRTdHlsZSA9IGZ1bmN0aW9uIChjeHRNZXRhKSB7XG4gIHZhciBjeHRLZXkgPSBjeHRNZXRhLmtleTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3h0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzIHx8IHt9OyAvLyBpZiBhbHJlYWR5IGNvbXB1dGVkIHN0eWxlLCByZXR1cm5lZCBjYWNoZWQgY29weVxuXG4gIGlmIChjeHRTdHlsZXNbY3h0S2V5XSkge1xuICAgIHJldHVybiBjeHRTdHlsZXNbY3h0S2V5XTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IHtcbiAgICBfcHJpdmF0ZToge1xuICAgICAga2V5OiBjeHRLZXlcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIGhhc0N4dCA9IGN4dEtleVtpXSA9PT0gVFJVRTtcblxuICAgIGlmICghaGFzQ3h0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGN4dC5wcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IGN4dC5wcm9wZXJ0aWVzW2pdO1xuICAgICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7XG4gICAgfVxuICB9XG5cbiAgY3h0U3R5bGVzW2N4dEtleV0gPSBzdHlsZTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuc3R5Zm4uYXBwbHlDb250ZXh0U3R5bGUgPSBmdW5jdGlvbiAoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBkaWZmUHJvcHMgPSBjeHRNZXRhLmRpZmZQcm9wTmFtZXM7XG4gIHZhciByZXREaWZmUHJvcHMgPSB7fTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmZQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaWZmUHJvcE5hbWUgPSBkaWZmUHJvcHNbaV07XG4gICAgdmFyIGN4dFByb3AgPSBjeHRTdHlsZVtkaWZmUHJvcE5hbWVdO1xuICAgIHZhciBlbGVQcm9wID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuXG4gICAgaWYgKCFjeHRQcm9wKSB7XG4gICAgICAvLyBubyBjb250ZXh0IHByb3AgbWVhbnMgZGVsZXRlXG4gICAgICBpZiAoIWVsZVByb3ApIHtcbiAgICAgICAgY29udGludWU7IC8vIG5vIGV4aXN0aW5nIHByb3AgbWVhbnMgbm90aGluZyBuZWVkcyB0byBiZSByZW1vdmVkXG4gICAgICAgIC8vIG5iIGFmZmVjdHMgaW5pdGlhbCBhcHBsaWNhdGlvbiBvbiBtYXBwZWQgdmFsdWVzIGxpa2UgY29udHJvbC1wb2ludC1kaXN0YW5jZXNcbiAgICAgIH0gZWxzZSBpZiAoZWxlUHJvcC5ieXBhc3MpIHtcbiAgICAgICAgY3h0UHJvcCA9IHtcbiAgICAgICAgICBuYW1lOiBkaWZmUHJvcE5hbWUsXG4gICAgICAgICAgZGVsZXRlQnlwYXNzZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN4dFByb3AgPSB7XG4gICAgICAgICAgbmFtZTogZGlmZlByb3BOYW1lLFxuICAgICAgICAgIFwiZGVsZXRlXCI6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gdGhlIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuXG5cbiAgICBpZiAoZWxlUHJvcCA9PT0gY3h0UHJvcCkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBzYXZlIGN5Y2xlcyB3aGVuIGEgbWFwcGVkIGNvbnRleHQgcHJvcCBkb2Vzbid0IG5lZWQgdG8gYmUgYXBwbGllZFxuXG5cbiAgICBpZiAoY3h0UHJvcC5tYXBwZWQgPT09IHR5cGVzLmZuIC8vIGNvbnRleHQgcHJvcCBpcyBmdW5jdGlvbiBtYXBwZXJcbiAgICAmJiBlbGVQcm9wICE9IG51bGwgLy8gc29tZSBwcm9wcyBjYW4gYmUgbnVsbCBldmVuIGJ5IGRlZmF1bHQgKGUuZy4gYSBwcm9wIHRoYXQgb3ZlcnJpZGVzIGFub3RoZXIgb25lKVxuICAgICYmIGVsZVByb3AubWFwcGluZyAhPSBudWxsIC8vIGVsZSBwcm9wIGlzIGEgY29uY3JldGUgdmFsdWUgZnJvbSBmcm9tIGEgbWFwcGVyXG4gICAgJiYgZWxlUHJvcC5tYXBwaW5nLnZhbHVlID09PSBjeHRQcm9wLnZhbHVlIC8vIHRoZSBjdXJyZW50IHByb3Agb24gdGhlIGVsZSBpcyBhIGZsYXQgcHJvcCB2YWx1ZSBmb3IgdGhlIGZ1bmN0aW9uIG1hcHBlclxuICAgICkge1xuICAgICAgICAvLyBOQiBkb24ndCB3cml0ZSB0byBjeHRQcm9wLCBhcyBpdCdzIHNoYXJlZCBhbW9uZyBlbGVzIChzdG9yZWQgaW4gc3R5bGVzaGVldClcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBlbGVQcm9wLm1hcHBpbmc7IC8vIGNhbiB3cml0ZSB0byBtYXBwaW5nLCBhcyBpdCdzIGEgcGVyLWVsZSBjb3B5XG5cbiAgICAgICAgdmFyIGZuVmFsdWUgPSBtYXBwaW5nLmZuVmFsdWUgPSBjeHRQcm9wLnZhbHVlKGVsZSk7IC8vIHRlbXBvcmFyaWx5IGNhY2hlIHRoZSB2YWx1ZSBpbiBjYXNlIG9mIGEgbWlzc1xuXG4gICAgICAgIGlmIChmblZhbHVlID09PSBtYXBwaW5nLnByZXZGblZhbHVlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIHZhciByZXREaWZmUHJvcCA9IHJldERpZmZQcm9wc1tkaWZmUHJvcE5hbWVdID0ge1xuICAgICAgcHJldjogZWxlUHJvcFxuICAgIH07XG4gICAgc2VsZi5hcHBseVBhcnNlZFByb3BlcnR5KGVsZSwgY3h0UHJvcCk7XG4gICAgcmV0RGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoZGlmZlByb3BOYW1lKTtcblxuICAgIGlmIChyZXREaWZmUHJvcC5uZXh0ICYmIHJldERpZmZQcm9wLm5leHQuYnlwYXNzKSB7XG4gICAgICByZXREaWZmUHJvcC5uZXh0ID0gcmV0RGlmZlByb3AubmV4dC5ieXBhc3NlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRpZmZQcm9wczogcmV0RGlmZlByb3BzXG4gIH07XG59O1xuXG5zdHlmbi51cGRhdGVTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BOYW1lcyA9IHNlbGYucHJvcGVydHlHcm91cE5hbWVzO1xuICB2YXIgcHJvcEdyS2V5cyA9IHNlbGYucHJvcGVydHlHcm91cEtleXM7XG5cbiAgdmFyIHByb3BIYXNoID0gZnVuY3Rpb24gcHJvcEhhc2goZWxlLCBwcm9wTmFtZXMsIHNlZWRLZXkpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRQcm9wZXJ0aWVzSGFzaChlbGUsIHByb3BOYW1lcywgc2VlZEtleSk7XG4gIH07XG5cbiAgdmFyIG9sZFN0eWxlS2V5ID0gX3Auc3R5bGVLZXk7XG5cbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNOb2RlID0gX3AuZ3JvdXAgPT09ICdub2Rlcyc7IC8vIGdldCB0aGUgc3R5bGUga2V5IGhhc2hlcyBwZXIgcHJvcCBncm91cFxuICAvLyBidXQgbGF6aWx5IC0tIG9ubHkgdXNlIG5vbi1kZWZhdWx0IHByb3AgdmFsdWVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGhhc2hlc1xuICAvL1xuXG4gIHZhciBvdmVycmlkZGVuU3R5bGVzID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZGVuU3R5bGVzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BHcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JLZXkgPSBwcm9wR3JLZXlzW2ldO1xuICAgIF9wLnN0eWxlS2V5c1tncktleV0gPSBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF07XG4gIH1cblxuICB2YXIgdXBkYXRlR3JLZXkxID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVswXSA9IGhhc2hJbnQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzBdKTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXkyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSA9IGhhc2hJbnRBbHQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzFdKTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXkgPSBmdW5jdGlvbiB1cGRhdGVHcktleSh2YWwsIGdyS2V5KSB7XG4gICAgdXBkYXRlR3JLZXkxKHZhbCwgZ3JLZXkpO1xuICAgIHVwZGF0ZUdyS2V5Mih2YWwsIGdyS2V5KTtcbiAgfTtcblxuICB2YXIgdXBkYXRlR3JLZXlXU3RyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXlXU3RyKHN0clZhbCwgZ3JLZXkpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0clZhbC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNoID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICB1cGRhdGVHcktleTEoY2gsIGdyS2V5KTtcbiAgICAgIHVwZGF0ZUdyS2V5MihjaCwgZ3JLZXkpO1xuICAgIH1cbiAgfTsgLy8gLSBoYXNoaW5nIHdvcmtzIG9uIDMyIGJpdCBpbnRzIGIvYyB3ZSB1c2UgYml0d2lzZSBvcHNcbiAgLy8gLSBzbWFsbCBudW1iZXJzIGdldCBjdXQgb2ZmIChlLmcuIDAuMTIzIGlzIHNlZW4gYXMgMCBieSB0aGUgaGFzaGluZyBmdW5jdGlvbilcbiAgLy8gLSByYWlzZSB1cCBzbWFsbCBudW1iZXJzIHNvIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzIGFyZSBzZWVuIGJ5IGhhc2hpbmdcbiAgLy8gLSBtYWtlIHNtYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gYSBub3JtYWwgdmFsdWUgdG8gYXZvaWQgY29sbGlzaW9uc1xuICAvLyAtIHdvcmtzIGluIHByYWN0aWNlIGFuZCBpdCdzIHJlbGF0aXZlbHkgY2hlYXBcblxuXG4gIHZhciBOID0gMjAwMDAwMDAwMDtcblxuICB2YXIgY2xlYW5OdW0gPSBmdW5jdGlvbiBjbGVhbk51bSh2YWwpIHtcbiAgICByZXR1cm4gLTEyOCA8IHZhbCAmJiB2YWwgPCAxMjggJiYgTWF0aC5mbG9vcih2YWwpICE9PSB2YWwgPyBOIC0gKHZhbCAqIDEwMjQgfCAwKSA6IHZhbDtcbiAgfTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcE5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWVzW19pXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IG92ZXJyaWRkZW5TdHlsZXNbbmFtZV07XG5cbiAgICBpZiAocGFyc2VkUHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcEluZm8gPSB0aGlzLnByb3BlcnRpZXNbbmFtZV07XG4gICAgdmFyIHR5cGUgPSBwcm9wSW5mby50eXBlO1xuICAgIHZhciBfZ3JLZXkgPSBwcm9wSW5mby5ncm91cEtleTtcbiAgICB2YXIgbm9ybWFsaXplZE51bWJlclZhbCA9IHZvaWQgMDtcblxuICAgIGlmIChwcm9wSW5mby5oYXNoT3ZlcnJpZGUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHByb3BJbmZvLmhhc2hPdmVycmlkZShlbGUsIHBhcnNlZFByb3ApO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkUHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfSAvLyBtaWdodCBub3QgYmUgYSBudW1iZXIgaWYgaXQgYWxsb3dzIGVudW1zXG5cblxuICAgIHZhciBudW1iZXJWYWwgPSBwcm9wSW5mby5lbnVtcyA9PSBudWxsID8gcGFyc2VkUHJvcC52YWx1ZSA6IG51bGw7XG4gICAgdmFyIGhhdmVOb3JtTnVtID0gbm9ybWFsaXplZE51bWJlclZhbCAhPSBudWxsO1xuICAgIHZhciBoYXZlVW5pdGVkTnVtID0gbnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVOdW0gPSBoYXZlTm9ybU51bSB8fCBoYXZlVW5pdGVkTnVtO1xuICAgIHZhciB1bml0cyA9IHBhcnNlZFByb3AudW5pdHM7IC8vIG51bWJlcnMgYXJlIGNoZWFwZXIgdG8gaGFzaCB0aGFuIHN0cmluZ3NcbiAgICAvLyAxIGhhc2ggb3AgdnMgbiBoYXNoIG9wcyAoZm9yIGxlbmd0aCBuIHN0cmluZylcblxuICAgIGlmICh0eXBlLm51bWJlciAmJiBoYXZlTnVtICYmICF0eXBlLm11bHRpcGxlKSB7XG4gICAgICB2YXIgdiA9IGhhdmVOb3JtTnVtID8gbm9ybWFsaXplZE51bWJlclZhbCA6IG51bWJlclZhbDtcbiAgICAgIHVwZGF0ZUdyS2V5KGNsZWFuTnVtKHYpLCBfZ3JLZXkpO1xuXG4gICAgICBpZiAoIWhhdmVOb3JtTnVtICYmIHVuaXRzICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlR3JLZXlXU3RyKHVuaXRzLCBfZ3JLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVHcktleVdTdHIocGFyc2VkUHJvcC5zdHJWYWx1ZSwgX2dyS2V5KTtcbiAgICB9XG4gIH0gLy8gb3ZlcmFsbCBzdHlsZSBrZXlcbiAgLy9cblxuXG4gIHZhciBoYXNoID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BHcktleXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZ3JLZXkyID0gcHJvcEdyS2V5c1tfaTJdO1xuICAgIHZhciBnckhhc2ggPSBfcC5zdHlsZUtleXNbX2dyS2V5Ml07XG4gICAgaGFzaFswXSA9IGhhc2hJbnQoZ3JIYXNoWzBdLCBoYXNoWzBdKTtcbiAgICBoYXNoWzFdID0gaGFzaEludEFsdChnckhhc2hbMV0sIGhhc2hbMV0pO1xuICB9XG5cbiAgX3Auc3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzKGhhc2hbMF0sIGhhc2hbMV0pOyAvLyBsYWJlbCBkaW1zXG4gIC8vXG5cbiAgdmFyIHNrID0gX3Auc3R5bGVLZXlzO1xuICBfcC5sYWJlbERpbXNLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc2subGFiZWxEaW1lbnNpb25zKTtcbiAgdmFyIGxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydsYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICBfcC5sYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShsYWJlbEtleXMpO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIGxhYmVsS2V5cykpO1xuXG4gIGlmICghaXNOb2RlKSB7XG4gICAgdmFyIHNvdXJjZUxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydzb3VyY2UtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC5zb3VyY2VMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShzb3VyY2VMYWJlbEtleXMpO1xuICAgIF9wLnNvdXJjZUxhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgc291cmNlTGFiZWxLZXlzKSk7XG4gICAgdmFyIHRhcmdldExhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWyd0YXJnZXQtbGFiZWwnXSwgc2subGFiZWxEaW1lbnNpb25zKTtcbiAgICBfcC50YXJnZXRMYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheSh0YXJnZXRMYWJlbEtleXMpO1xuICAgIF9wLnRhcmdldExhYmVsU3R5bGVLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoaGFzaEFycmF5cyhzay5jb21tb25MYWJlbCwgdGFyZ2V0TGFiZWxLZXlzKSk7XG4gIH0gLy8gbm9kZVxuICAvL1xuXG5cbiAgaWYgKGlzTm9kZSkge1xuICAgIHZhciBfcCRzdHlsZUtleXMgPSBfcC5zdHlsZUtleXMsXG4gICAgICAgIG5vZGVCb2R5ID0gX3Akc3R5bGVLZXlzLm5vZGVCb2R5LFxuICAgICAgICBub2RlQm9yZGVyID0gX3Akc3R5bGVLZXlzLm5vZGVCb3JkZXIsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZSA9IF9wJHN0eWxlS2V5cy5iYWNrZ3JvdW5kSW1hZ2UsXG4gICAgICAgIGNvbXBvdW5kID0gX3Akc3R5bGVLZXlzLmNvbXBvdW5kLFxuICAgICAgICBwaWUgPSBfcCRzdHlsZUtleXMucGllO1xuICAgIHZhciBub2RlS2V5cyA9IFtub2RlQm9keSwgbm9kZUJvcmRlciwgYmFja2dyb3VuZEltYWdlLCBjb21wb3VuZCwgcGllXS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9IG51bGw7XG4gICAgfSkucmVkdWNlKGhhc2hBcnJheXMsIFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXSk7XG4gICAgX3Aubm9kZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShub2RlS2V5cyk7XG4gICAgX3AuaGFzUGllID0gcGllICE9IG51bGwgJiYgcGllWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBwaWVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuXG4gIHJldHVybiBvbGRTdHlsZUtleSAhPT0gX3Auc3R5bGVLZXk7XG59O1xuXG5zdHlmbi5jbGVhclN0eWxlSGludHMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgX3Auc3R5bGVDeHRLZXkgPSAnJztcbiAgX3Auc3R5bGVLZXlzID0ge307XG4gIF9wLnN0eWxlS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxLZXkgPSBudWxsO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxLZXkgPSBudWxsO1xuICBfcC5zb3VyY2VMYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxLZXkgPSBudWxsO1xuICBfcC50YXJnZXRMYWJlbFN0eWxlS2V5ID0gbnVsbDtcbiAgX3Aubm9kZUtleSA9IG51bGw7XG4gIF9wLmhhc1BpZSA9IG51bGw7XG59OyAvLyBhcHBseSBhIHByb3BlcnR5IHRvIHRoZSBzdHlsZSAoZm9yIGludGVybmFsIHVzZSlcbi8vIHJldHVybnMgd2hldGhlciBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuLy9cbi8vIG5vdywgdGhpcyBmdW5jdGlvbiBmbGF0dGVucyB0aGUgcHJvcGVydHksIGFuZCBoZXJlJ3MgaG93OlxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgYnlwYXNzOiB0cnVlLCBkZWxldGVCeXBhc3M6IHRydWUgfVxuLy8gbm8gcHJvcGVydHkgaXMgZ2VuZXJhdGVkLCBpbnN0ZWFkIHRoZSBieXBhc3MgcHJvcGVydHkgaW4gdGhlXG4vLyBlbGVtZW50J3Mgc3R5bGUgaXMgcmVwbGFjZWQgYnkgd2hhdCdzIHBvaW50ZWQgdG8gYnkgdGhlIGBieXBhc3NlZGBcbi8vIGZpZWxkIGluIHRoZSBieXBhc3MgcHJvcGVydHkgKGkuZS4gcmVzdG9yaW5nIHRoZSBwcm9wZXJ0eSB0aGVcbi8vIGJ5cGFzcyB3YXMgb3ZlcnJpZGluZylcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IG1hcHBlZDogdHJ1dGh5IH1cbi8vIHRoZSBnZW5lcmF0ZWQgZmxhdHRlbmVkUHJvcDp7IG1hcHBpbmc6IHByb3AgfVxuLy9cbi8vIGZvciBwYXJzZWRQcm9wOnsgYnlwYXNzOiB0cnVlIH1cbi8vIHRoZSBnZW5lcmF0ZWQgZmxhdHRlbmVkUHJvcDp7IGJ5cGFzc2VkOiBwYXJzZWRQcm9wIH1cblxuXG5zdHlmbi5hcHBseVBhcnNlZFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsZSwgcGFyc2VkUHJvcCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBwcm9wID0gcGFyc2VkUHJvcDtcbiAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICB2YXIgZmxhdFByb3A7XG4gIHZhciB0eXBlcyA9IHNlbGYudHlwZXM7XG4gIHZhciB0eXBlID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3AubmFtZV0udHlwZTtcbiAgdmFyIHByb3BJc0J5cGFzcyA9IHByb3AuYnlwYXNzO1xuICB2YXIgb3JpZ1Byb3AgPSBzdHlsZVtwcm9wLm5hbWVdO1xuICB2YXIgb3JpZ1Byb3BJc0J5cGFzcyA9IG9yaWdQcm9wICYmIG9yaWdQcm9wLmJ5cGFzcztcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgZmxhdFByb3BNYXBwaW5nID0gJ21hcHBpbmcnO1xuXG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwocCkge1xuICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgY2hlY2tUcmlnZ2VycyA9IGZ1bmN0aW9uIGNoZWNrVHJpZ2dlcnMoKSB7XG4gICAgdmFyIGZyb21WYWwgPSBnZXRWYWwob3JpZ1Byb3ApO1xuICAgIHZhciB0b1ZhbCA9IGdldFZhbChwcm9wKTtcbiAgICBzZWxmLmNoZWNrVHJpZ2dlcnMoZWxlLCBwcm9wLm5hbWUsIGZyb21WYWwsIHRvVmFsKTtcbiAgfTsgLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG5cblxuICBpZiAocGFyc2VkUHJvcC5uYW1lID09PSAnY3VydmUtc3R5bGUnICYmIGVsZS5pc0VkZ2UoKSAmJiAoIC8vIGxvb3BzIG11c3QgYmUgYnVuZGxlZCBiZXppZXJzXG4gIHBhcnNlZFByb3AudmFsdWUgIT09ICdiZXppZXInICYmIGVsZS5pc0xvb3AoKSB8fCAvLyBlZGdlcyBjb25uZWN0ZWQgdG8gY29tcG91bmQgbm9kZXMgY2FuIG5vdCBiZSBoYXlzdGFja3NcbiAgcGFyc2VkUHJvcC52YWx1ZSA9PT0gJ2hheXN0YWNrJyAmJiAoZWxlLnNvdXJjZSgpLmlzUGFyZW50KCkgfHwgZWxlLnRhcmdldCgpLmlzUGFyZW50KCkpKSkge1xuICAgIHByb3AgPSBwYXJzZWRQcm9wID0gdGhpcy5wYXJzZShwYXJzZWRQcm9wLm5hbWUsICdiZXppZXInLCBwcm9wSXNCeXBhc3MpO1xuICB9XG5cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocHJvcC5kZWxldGVCeXBhc3NlZCkge1xuICAgIC8vIGRlbGV0ZSB0aGUgcHJvcGVydHkgdGhhdCB0aGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gY2FuJ3QgZGVsZXRlIGlmIG5vIHByb3BcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gZGVsZXRlIGJ5cGFzc2VkXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzZWRcbiAgICB9XG4gIH0gLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG5cblxuICBpZiAocHJvcC5kZWxldGVCeXBhc3MpIHtcbiAgICAvLyB0aGVuIHRoaXMgcHJvcGVydHkgaXMganVzdCBoZXJlIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gZGVsZXRlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIHByb3BlcnR5IGlzIGFscmVhZHkgbm90IGRlZmluZWRcbiAgICB9IGVsc2UgaWYgKG9yaWdQcm9wLmJ5cGFzcykge1xuICAgICAgLy8gdGhlbiByZXBsYWNlIHRoZSBieXBhc3MgcHJvcGVydHkgd2l0aCB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGJ5cGFzc2VkIHByb3BlcnR5IHdhcyBhbHJlYWR5IGFwcGxpZWQgKGFuZCB0aGVyZWZvcmUgcGFyc2VkKSwgd2UgY2FuIGp1c3QgcmVwbGFjZSBpdCAobm8gcmVhcHBseWluZyBuZWNlc3NhcnkpXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gb3JpZ1Byb3AuYnlwYXNzZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcmludE1hcHBpbmdFcnIgPSBmdW5jdGlvbiBwcmludE1hcHBpbmdFcnIoKSB7XG4gICAgd2FybignRG8gbm90IGFzc2lnbiBtYXBwaW5ncyB0byBlbGVtZW50cyB3aXRob3V0IGNvcnJlc3BvbmRpbmcgZGF0YSAoaS5lLiBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGhhcyBubyBtYXBwaW5nIGZvciBwcm9wZXJ0eSBgJyArIHByb3AubmFtZSArICdgIHdpdGggZGF0YSBmaWVsZCBgJyArIHByb3AuZmllbGQgKyAnYCk7IHRyeSBhIGBbJyArIHByb3AuZmllbGQgKyAnXWAgc2VsZWN0b3IgdG8gbGltaXQgc2NvcGUgdG8gZWxlbWVudHMgd2l0aCBgJyArIHByb3AuZmllbGQgKyAnYCBkZWZpbmVkJyk7XG4gIH07IC8vIHB1dCB0aGUgcHJvcGVydHkgaW4gdGhlIHN0eWxlIG9iamVjdHNcblxuXG4gIHN3aXRjaCAocHJvcC5tYXBwZWQpIHtcbiAgICAvLyBmbGF0dGVuIHRoZSBwcm9wZXJ0eSBpZiBtYXBwZWRcbiAgICBjYXNlIHR5cGVzLm1hcERhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIGZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGZpZWxkVmFsID0gX3AuZGF0YTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggJiYgZmllbGRWYWw7IGkrKykge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICBmaWVsZFZhbCA9IGZpZWxkVmFsW2ZpZWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRNYXBwaW5nRXJyKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBlcmNlbnQ7XG5cbiAgICAgICAgaWYgKCFudW1iZXIoZmllbGRWYWwpKSB7XG4gICAgICAgICAgLy8gdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHdhcm4oJ0RvIG5vdCB1c2UgY29udGludW91cyBtYXBwZXJzIHdpdGhvdXQgc3BlY2lmeWluZyBudW1lcmljIGRhdGEgKGkuZS4gYCcgKyBwcm9wLmZpZWxkICsgJzogJyArIGZpZWxkVmFsICsgJ2AgZm9yIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBub24tbnVtZXJpYyknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGZpZWxkV2lkdGggPSBwcm9wLmZpZWxkTWF4IC0gcHJvcC5maWVsZE1pbjtcblxuICAgICAgICAgIGlmIChmaWVsZFdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBzYWZldHkgY2hlY2sgLS0gbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBhcyBubyBwcm9wcyBvZiB6ZXJvIHJhbmdlIHNob3VsZCBiZSBwYXNzZWQgaGVyZVxuICAgICAgICAgICAgcGVyY2VudCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmNlbnQgPSAoZmllbGRWYWwgLSBwcm9wLmZpZWxkTWluKSAvIGZpZWxkV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIG1ha2Ugc3VyZSB0byBib3VuZCBwZXJjZW50IHZhbHVlXG5cblxuICAgICAgICBpZiAocGVyY2VudCA8IDApIHtcbiAgICAgICAgICBwZXJjZW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSkge1xuICAgICAgICAgIHBlcmNlbnQgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUuY29sb3IpIHtcbiAgICAgICAgICB2YXIgcjEgPSBwcm9wLnZhbHVlTWluWzBdO1xuICAgICAgICAgIHZhciByMiA9IHByb3AudmFsdWVNYXhbMF07XG4gICAgICAgICAgdmFyIGcxID0gcHJvcC52YWx1ZU1pblsxXTtcbiAgICAgICAgICB2YXIgZzIgPSBwcm9wLnZhbHVlTWF4WzFdO1xuICAgICAgICAgIHZhciBiMSA9IHByb3AudmFsdWVNaW5bMl07XG4gICAgICAgICAgdmFyIGIyID0gcHJvcC52YWx1ZU1heFsyXTtcbiAgICAgICAgICB2YXIgYTEgPSBwcm9wLnZhbHVlTWluWzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1pblszXTtcbiAgICAgICAgICB2YXIgYTIgPSBwcm9wLnZhbHVlTWF4WzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1heFszXTtcbiAgICAgICAgICB2YXIgY2xyID0gW01hdGgucm91bmQocjEgKyAocjIgLSByMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChnMSArIChnMiAtIGcxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGIxICsgKGIyIC0gYjEpICogcGVyY2VudCksIE1hdGgucm91bmQoYTEgKyAoYTIgLSBhMSkgKiBwZXJjZW50KV07XG4gICAgICAgICAgZmxhdFByb3AgPSB7XG4gICAgICAgICAgICAvLyBjb2xvdXJzIGFyZSBzaW1wbGUsIHNvIGp1c3QgY3JlYXRlIHRoZSBmbGF0IHByb3BlcnR5IGluc3RlYWQgb2YgZXhwZW5zaXZlIHN0cmluZyBwYXJzaW5nXG4gICAgICAgICAgICBieXBhc3M6IHByb3AuYnlwYXNzLFxuICAgICAgICAgICAgLy8gd2UncmUgYSBieXBhc3MgaWYgdGhlIG1hcHBpbmcgcHJvcGVydHkgaXMgYSBieXBhc3NcbiAgICAgICAgICAgIG5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBjbHIsXG4gICAgICAgICAgICBzdHJWYWx1ZTogJ3JnYignICsgY2xyWzBdICsgJywgJyArIGNsclsxXSArICcsICcgKyBjbHJbMl0gKyAnKSdcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgdmFyIGNhbGNWYWx1ZSA9IHByb3AudmFsdWVNaW4gKyAocHJvcC52YWx1ZU1heCAtIHByb3AudmFsdWVNaW4pICogcGVyY2VudDtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBjYWxjVmFsdWUsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuIG9ubHkgbWFwIHRvIGNvbG91cnMgYW5kIG51bWJlcnNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSB0aGUgcHJvcGVydHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuXG4gICAgICAgIHByb3AgPSBmbGF0UHJvcDsgLy8gdGhlIGZsYXR0ZW5lZCAobWFwcGVkKSBwcm9wZXJ0eSBpcyB0aGUgb25lIHdlIHdhbnRcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBkaXJlY3QgbWFwcGluZ1xuXG4gICAgY2FzZSB0eXBlcy5kYXRhOlxuICAgICAge1xuICAgICAgICAvLyBmbGF0dGVuIHRoZSBmaWVsZCAoZS5nLiBkYXRhLmZvby5iYXIpXG4gICAgICAgIHZhciBfZmllbGRzID0gcHJvcC5maWVsZC5zcGxpdCgnLicpO1xuXG4gICAgICAgIHZhciBfZmllbGRWYWwgPSBfcC5kYXRhO1xuXG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IF9maWVsZHMubGVuZ3RoICYmIF9maWVsZFZhbDsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX2ZpZWxkID0gX2ZpZWxkc1tfaTNdO1xuICAgICAgICAgIF9maWVsZFZhbCA9IF9maWVsZFZhbFtfZmllbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9maWVsZFZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgX2ZpZWxkVmFsLCBwcm9wLmJ5cGFzcywgZmxhdFByb3BNYXBwaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBwcm9wOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG5cbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSB0eXBlcy5mbjpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZuID0gcHJvcC52YWx1ZTtcbiAgICAgICAgdmFyIGZuUmV0VmFsID0gcHJvcC5mblZhbHVlICE9IG51bGwgPyBwcm9wLmZuVmFsdWUgOiBmbihlbGUpOyAvLyBjaGVjayBmb3IgY2FjaGVkIHZhbHVlIGJlZm9yZSBjYWxsaW5nIGZ1bmN0aW9uXG5cbiAgICAgICAgcHJvcC5wcmV2Rm5WYWx1ZSA9IGZuUmV0VmFsO1xuXG4gICAgICAgIGlmIChmblJldFZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgd2FybignQ3VzdG9tIGZ1bmN0aW9uIG1hcHBlcnMgbWF5IG5vdCByZXR1cm4gbnVsbCAoaS5lLiBgJyArIHByb3AubmFtZSArICdgIGZvciBlbGUgYCcgKyBlbGUuaWQoKSArICdgIGlzIG51bGwpJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxhdFByb3AgPSB0aGlzLnBhcnNlKHByb3AubmFtZSwgZm5SZXRWYWwsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuXG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICB3YXJuKCdDdXN0b20gZnVuY3Rpb24gbWFwcGVycyBtYXkgbm90IHJldHVybiBpbnZhbGlkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5IHR5cGUgKGkuZS4gYCcgKyBwcm9wLm5hbWUgKyAnYCBmb3IgZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBpbnZhbGlkKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYXRQcm9wLm1hcHBpbmcgPSBjb3B5KHByb3ApOyAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nXG5cbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBicmVhaztcbiAgICAvLyBqdXN0IHNldCB0aGUgcHJvcGVydHlcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gbm90IGEgdmFsaWQgbWFwcGluZ1xuICB9IC8vIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eSwgdGhlbiBsaW5rIHRoZSByZXN1bHRhbnQgcHJvcGVydHkgdG8gdGhlIG9yaWdpbmFsIG9uZVxuXG5cbiAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHRoaXMgYnlwYXNzIG92ZXJyaWRlcyB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3AuYnlwYXNzZWQ7IC8vIHN0ZWFsIGJ5cGFzc2VkIHByb3AgZnJvbSBvbGQgYnlwYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gbGluayB0aGUgb3JpZyBwcm9wIHRvIHRoZSBuZXcgYnlwYXNzXG4gICAgICBwcm9wLmJ5cGFzc2VkID0gb3JpZ1Byb3A7XG4gICAgfVxuXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFuZCBzZXRcbiAgfSBlbHNlIHtcbiAgICAvLyBwcm9wIGlzIG5vdCBieXBhc3NcbiAgICBpZiAob3JpZ1Byb3BJc0J5cGFzcykge1xuICAgICAgLy8gdGhlbiBrZWVwIHRoZSBvcmlnIHByb3AgKHNpbmNlIGl0J3MgYSBieXBhc3MpIGFuZCBsaW5rIHRvIHRoZSBuZXcgcHJvcFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSBwcm9wO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGp1c3QgcmVwbGFjZSB0aGUgb2xkIHByb3Agd2l0aCB0aGUgbmV3IG9uZVxuICAgICAgc3R5bGVbcHJvcC5uYW1lXSA9IHByb3A7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tUcmlnZ2VycygpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnN0eWZuLmNsZWFuRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcywga2VlcEJ5cGFzc2VzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHRoaXMuY2xlYXJTdHlsZUhpbnRzKGVsZSk7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcblxuICAgIGlmICgha2VlcEJ5cGFzc2VzKSB7XG4gICAgICBlbGUuX3ByaXZhdGUuc3R5bGUgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICAgICAgdmFyIHByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlKTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcE5hbWVzW2pdO1xuICAgICAgICB2YXIgZWxlUHJvcCA9IHN0eWxlW3Byb3BOYW1lXTtcblxuICAgICAgICBpZiAoZWxlUHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGVsZVByb3AuYnlwYXNzKSB7XG4gICAgICAgICAgICBlbGVQcm9wLmJ5cGFzc2VkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGVbcHJvcE5hbWVdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07IC8vIHVwZGF0ZXMgdGhlIHZpc3VhbCBzdHlsZSBmb3IgYWxsIGVsZW1lbnRzICh1c2VmdWwgZm9yIG1hbnVhbCBzdHlsZSBtb2RpZmljYXRpb24gYWZ0ZXIgaW5pdClcblxuXG5zdHlmbi51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIGVsZXMudXBkYXRlU3R5bGUoKTtcbn07IC8vIGRpZmZQcm9wcyA6IHsgbmFtZSA9PiB7IHByZXYsIG5leHQgfSB9XG5cblxuc3R5Zm4udXBkYXRlVHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoZWxlLCBkaWZmUHJvcHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwcm9wcyA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tcHJvcGVydHknKS52YWx1ZTtcbiAgdmFyIGR1cmF0aW9uID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1kdXJhdGlvbicpLnBmVmFsdWU7XG4gIHZhciBkZWxheSA9IGVsZS5wc3R5bGUoJ3RyYW5zaXRpb24tZGVsYXknKS5wZlZhbHVlO1xuXG4gIGlmIChwcm9wcy5sZW5ndGggPiAwICYmIGR1cmF0aW9uID4gMCkge1xuICAgIHZhciBzdHlsZSA9IHt9OyAvLyBidWlsZCB1cCB0aGUgc3R5bGUgdG8gYW5pbWF0ZSB0b3dhcmRzXG5cbiAgICB2YXIgYW55UHJldiA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBzdHlQcm9wID0gZWxlLnBzdHlsZShwcm9wKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wXTtcblxuICAgICAgaWYgKCFkaWZmUHJvcCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByZXZQcm9wID0gZGlmZlByb3AucHJldjtcbiAgICAgIHZhciBmcm9tUHJvcCA9IHByZXZQcm9wO1xuICAgICAgdmFyIHRvUHJvcCA9IGRpZmZQcm9wLm5leHQgIT0gbnVsbCA/IGRpZmZQcm9wLm5leHQgOiBzdHlQcm9wO1xuICAgICAgdmFyIGRpZmYgPSBmYWxzZTtcbiAgICAgIHZhciBpbml0VmFsID0gdm9pZCAwO1xuICAgICAgdmFyIGluaXREdCA9IDAuMDAwMDAxOyAvLyBkZWx0YSB0aW1lICUgdmFsdWUgZm9yIGluaXRWYWwgKGFsbG93cyBhbmltYXRpbmcgb3V0IG9mIGluaXQgemVybyBvcGFjaXR5KVxuXG4gICAgICBpZiAoIWZyb21Qcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBjb25zaWRlciBweCB2YWx1ZXNcblxuXG4gICAgICBpZiAobnVtYmVyKGZyb21Qcm9wLnBmVmFsdWUpICYmIG51bWJlcih0b1Byb3AucGZWYWx1ZSkpIHtcbiAgICAgICAgZGlmZiA9IHRvUHJvcC5wZlZhbHVlIC0gZnJvbVByb3AucGZWYWx1ZTsgLy8gbm9uemVybyBpcyB0cnV0aHlcblxuICAgICAgICBpbml0VmFsID0gZnJvbVByb3AucGZWYWx1ZSArIGluaXREdCAqIGRpZmY7IC8vIGNvbnNpZGVyIG51bWVyaWNhbCB2YWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAobnVtYmVyKGZyb21Qcm9wLnZhbHVlKSAmJiBudW1iZXIodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gdG9Qcm9wLnZhbHVlIC0gZnJvbVByb3AudmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG5cbiAgICAgICAgaW5pdFZhbCA9IGZyb21Qcm9wLnZhbHVlICsgaW5pdER0ICogZGlmZjsgLy8gY29uc2lkZXIgY29sb3VyIHZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChhcnJheShmcm9tUHJvcC52YWx1ZSkgJiYgYXJyYXkodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gZnJvbVByb3AudmFsdWVbMF0gIT09IHRvUHJvcC52YWx1ZVswXSB8fCBmcm9tUHJvcC52YWx1ZVsxXSAhPT0gdG9Qcm9wLnZhbHVlWzFdIHx8IGZyb21Qcm9wLnZhbHVlWzJdICE9PSB0b1Byb3AudmFsdWVbMl07XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5zdHJWYWx1ZTtcbiAgICAgIH0gLy8gdGhlIHByZXZpb3VzIHZhbHVlIGlzIGdvb2QgZm9yIGFuIGFuaW1hdGlvbiBvbmx5IGlmIGl0J3MgZGlmZmVyZW50XG5cblxuICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgc3R5bGVbcHJvcF0gPSB0b1Byb3Auc3RyVmFsdWU7IC8vIHRvIHZhbFxuXG4gICAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBwcm9wLCBpbml0VmFsKTsgLy8gZnJvbSB2YWxcblxuICAgICAgICBhbnlQcmV2ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIGVuZCBpZiBwcm9wcyBhbGxvdyBhbmlcbiAgICAvLyBjYW4ndCB0cmFuc2l0aW9uIGlmIHRoZXJlJ3Mgbm90aGluZyBwcmV2aW91cyB0byB0cmFuc2l0aW9uIGZyb21cblxuXG4gICAgaWYgKCFhbnlQcmV2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3AudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgICBlbGUuZGVsYXlBbmltYXRpb24oZGVsYXkpLnBsYXkoKS5wcm9taXNlKCkudGhlbihyZXNvbHZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBlbGUuYW5pbWF0aW9uKHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGVhc2luZzogZWxlLnBzdHlsZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nKS52YWx1ZSxcbiAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICB9KS5wbGF5KCkucHJvbWlzZSgpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gaWYoICFpc0J5cGFzcyApe1xuICAgICAgc2VsZi5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICAgIGVsZS5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyB9XG5cbiAgICAgIF9wLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChfcC50cmFuc2l0aW9uaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICBlbGUuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTtcbiAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gIH1cbn07XG5cbnN0eWZuLmNoZWNrVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZ2V0VHJpZ2dlciwgb25UcmlnZ2VyKSB7XG4gIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgdHJpZ2dlckNoZWNrID0gZ2V0VHJpZ2dlcihwcm9wKTtcblxuICBpZiAodHJpZ2dlckNoZWNrICE9IG51bGwgJiYgdHJpZ2dlckNoZWNrKGZyb21WYWx1ZSwgdG9WYWx1ZSkpIHtcbiAgICBvblRyaWdnZXIocHJvcCk7XG4gIH1cbn07XG5cbnN0eWZuLmNoZWNrWk9yZGVyVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzWk9yZGVyO1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMuX3ByaXZhdGUuY3kubm90aWZ5KCd6b3JkZXInLCBlbGUpO1xuICB9KTtcbn07XG5cbnN0eWZuLmNoZWNrQm91bmRzVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgfSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpOyAvLyBpZiB0aGUgcHJvcCBjaGFuZ2UgbWFrZXMgdGhlIGJiIG9mIHBsbCBiZXppZXIgZWRnZXMgaW52YWxpZCxcbiAgICAvLyB0aGVuIGRpcnR5IHRoZSBwbGwgZWRnZSBiYiBjYWNoZSBhcyB3ZWxsXG5cbiAgICBpZiAoIC8vIG9ubHkgZm9yIGJlemllcnMgLS0gc28gcGVyZm9ybWFuY2Ugb2Ygb3RoZXIgZWRnZXMgaXNuJ3QgYWZmZWN0ZWRcbiAgICBuYW1lID09PSAnY3VydmUtc3R5bGUnICYmIChmcm9tVmFsdWUgPT09ICdiZXppZXInIHx8IHRvVmFsdWUgPT09ICdiZXppZXInKSAmJiBwcm9wLnRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEJlemllcnMpIHtcbiAgICAgIGVsZS5wYXJhbGxlbEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAocGxsRWRnZSkge1xuICAgICAgICBpZiAocGxsRWRnZS5pc0J1bmRsZWRCZXppZXIoKSkge1xuICAgICAgICAgIHBsbEVkZ2UuZGlydHlCb3VuZGluZ0JveENhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5zdHlmbi5jaGVja1RyaWdnZXJzID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIGVsZS5kaXJ0eVN0eWxlQ2FjaGUoKTtcbiAgdGhpcy5jaGVja1pPcmRlclRyaWdnZXIoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpO1xuICB0aGlzLmNoZWNrQm91bmRzVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG59O1xuXG52YXIgc3R5Zm4kMSA9IHt9OyAvLyBieXBhc3NlcyBhcmUgYXBwbGllZCB0byBhbiBleGlzdGluZyBzdHlsZSBvbiBhbiBlbGVtZW50LCBhbmQganVzdCB0YWNrZWQgb24gdGVtcG9yYXJpbHlcbi8vIHJldHVybnMgdHJ1ZSBpZmYgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIGF0IGxlYXN0IDEgc3BlY2lmaWVkIHByb3BlcnR5XG5cbnN0eWZuJDEuYXBwbHlCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7IC8vIHB1dCBhbGwgdGhlIHByb3BlcnRpZXMgKGNhbiBzcGVjaWZ5IG9uZSBvciBtYW55KSBpbiBhbiBhcnJheSBhZnRlciBwYXJzaW5nIHRoZW1cblxuICBpZiAobmFtZSA9PT0gJyonIHx8IG5hbWUgPT09ICcqKicpIHtcbiAgICAvLyBhcHBseSB0byBhbGwgcHJvcGVydHkgbmFtZXNcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKF9uYW1lLCB2YWx1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFByb3ApIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHBhcnNlZFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIC8vIHRoZW4gcGFyc2UgdGhlIHNpbmdsZSBwcm9wZXJ0eVxuICAgIHZhciBfcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuXG4gICAgaWYgKF9wYXJzZWRQcm9wKSB7XG4gICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAvLyB0aGVuIHBhcnNlIGVhY2ggcHJvcGVydHlcbiAgICB2YXIgc3BlY2lmaWVkUHJvcHMgPSBuYW1lO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25zID0gdmFsdWU7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3BlY2lmaWVkUHJvcHMpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5hbWVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9uYW1lMiA9IG5hbWVzW19pXTtcbiAgICAgIHZhciBfdmFsdWUgPSBzcGVjaWZpZWRQcm9wc1tfbmFtZTJdO1xuXG4gICAgICBpZiAoX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHJ5IGNhbWVsIGNhc2UgbmFtZSB0b29cbiAgICAgICAgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbZGFzaDJjYW1lbChfbmFtZTIpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcGFyc2VkUHJvcDIgPSB0aGlzLnBhcnNlKF9uYW1lMiwgX3ZhbHVlLCB0cnVlKTtcblxuICAgICAgICBpZiAoX3BhcnNlZFByb3AyKSB7XG4gICAgICAgICAgcHJvcHMucHVzaChfcGFyc2VkUHJvcDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGNhbid0IGRvIGFueXRoaW5nIHdpdGhvdXQgd2VsbCBkZWZpbmVkIHByb3BlcnRpZXNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gd2UndmUgZmFpbGVkIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBwcm9wZXJ0aWVzXG5cblxuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIG5vdywgYXBwbHkgdGhlIGJ5cGFzcyBwcm9wZXJ0aWVzIG9uIHRoZSBlbGVtZW50c1xuXG5cbiAgdmFyIHJldCA9IGZhbHNlOyAvLyByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc3VjY2VzZnVsIGJ5cGFzcyBhcHBsaWVkXG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgLy8gZm9yIGVhY2ggZWxlXG4gICAgdmFyIGVsZSA9IGVsZXNbX2kyXTtcbiAgICB2YXIgZGlmZlByb3BzID0ge307XG4gICAgdmFyIGRpZmZQcm9wID0gdm9pZCAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgLy8gZm9yIGVhY2ggcHJvcFxuICAgICAgdmFyIF9wcm9wID0gcHJvcHNbal07XG5cbiAgICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB2YXIgcHJldlByb3AgPSBlbGUucHN0eWxlKF9wcm9wLm5hbWUpO1xuICAgICAgICBkaWZmUHJvcCA9IGRpZmZQcm9wc1tfcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXQgPSB0aGlzLmFwcGx5UGFyc2VkUHJvcGVydHkoZWxlLCBjb3B5KF9wcm9wKSkgfHwgcmV0O1xuXG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoX3Byb3AubmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBmb3IgcHJvcHNcblxuXG4gICAgaWYgKHJldCkge1xuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgZGlmZlByb3BzLCBpc0J5cGFzcyk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVzXG5cblxuICByZXR1cm4gcmV0O1xufTsgLy8gb25seSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMgbGlrZSBhbmltYXRpb25cblxuXG5zdHlmbiQxLm92ZXJyaWRlQnlwYXNzID0gZnVuY3Rpb24gKGVsZXMsIG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBwcm9wID0gZWxlLl9wcml2YXRlLnN0eWxlW25hbWVdO1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdLnR5cGU7XG4gICAgdmFyIGlzQ29sb3IgPSB0eXBlLmNvbG9yO1xuICAgIHZhciBpc011bHRpID0gdHlwZS5tdXRpcGxlO1xuICAgIHZhciBvbGRWYWx1ZSA9ICFwcm9wID8gbnVsbCA6IHByb3AucGZWYWx1ZSAhPSBudWxsID8gcHJvcC5wZlZhbHVlIDogcHJvcC52YWx1ZTtcblxuICAgIGlmICghcHJvcCB8fCAhcHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIG5lZWQgYSBieXBhc3MgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHByb3AucGZWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJ3JnYignICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfSBlbHNlIGlmIChpc011bHRpKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSB2YWx1ZS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKGVsZSwgbmFtZSwgb2xkVmFsdWUsIHZhbHVlKTtcbiAgfVxufTtcblxuc3R5Zm4kMS5yZW1vdmVBbGxCeXBhc3NlcyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICByZXR1cm4gdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGVzLCB0aGlzLnByb3BlcnR5TmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbn07XG5cbnN0eWZuJDEucmVtb3ZlQnlwYXNzZXMgPSBmdW5jdGlvbiAoZWxlcywgcHJvcHMsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbal07XG4gICAgdmFyIGRpZmZQcm9wcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuXG4gICAgICBpZiAoIXByZXZQcm9wIHx8ICFwcmV2UHJvcC5ieXBhc3MpIHtcbiAgICAgICAgLy8gaWYgYSBieXBhc3MgZG9lc24ndCBleGlzdCBmb3IgdGhlIHByb3AsIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gJyc7IC8vIGVtcHR5ID0+IHJlbW92ZSBieXBhc3NcblxuICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wLm5hbWVdID0ge1xuICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIHBhcnNlZFByb3ApO1xuICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICB9IC8vIGZvciBwcm9wc1xuXG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlSGludHMoZWxlKTtcblxuICAgIGlmICh1cGRhdGVUcmFuc2l0aW9ucykge1xuICAgICAgdGhpcy51cGRhdGVUcmFuc2l0aW9ucyhlbGUsIGRpZmZQcm9wcywgaXNCeXBhc3MpO1xuICAgIH1cbiAgfSAvLyBmb3IgZWxlc1xuXG59O1xuXG52YXIgc3R5Zm4kMiA9IHt9OyAvLyBnZXRzIHdoYXQgYW4gZW0gc2l6ZSBjb3JyZXNwb25kcyB0byBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gYSBkb20gZWxlbWVudFxuXG5zdHlmbiQyLmdldEVtU2l6ZUluUGl4ZWxzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHggPSB0aGlzLmNvbnRhaW5lckNzcygnZm9udC1zaXplJyk7XG5cbiAgaWYgKHB4ICE9IG51bGwpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChweCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDE7IC8vIGZvciBoZWFkbGVzc1xuICB9XG59OyAvLyBnZXRzIGNzcyBwcm9wZXJ0eSBmcm9tIHRoZSBjb3JlIGNvbnRhaW5lclxuXG5cbnN0eWZuJDIuY29udGFpbmVyQ3NzID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBkb21FbGVtZW50ID0gY3kuY29udGFpbmVyKCk7XG5cbiAgaWYgKHdpbmRvdyQxICYmIGRvbUVsZW1lbnQgJiYgd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiB3aW5kb3ckMS5nZXRDb21wdXRlZFN0eWxlKGRvbUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcE5hbWUpO1xuICB9XG59O1xuXG52YXIgc3R5Zm4kMyA9IHt9OyAvLyBnZXRzIHRoZSByZW5kZXJlZCBzdHlsZSBmb3IgYW4gZWxlbWVudFxuXG5zdHlmbiQzLmdldFJlbmRlcmVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBwcm9wKSB7XG4gIGlmIChwcm9wKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgcHJvcCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmF3U3R5bGUoZWxlLCB0cnVlKTtcbiAgfVxufTsgLy8gZ2V0cyB0aGUgcmF3IHN0eWxlIGZvciBhbiBlbGVtZW50XG5cblxuc3R5Zm4kMy5nZXRSYXdTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGlzUmVuZGVyZWRWYWwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBlbGUgPSBlbGVbMF07IC8vIGluc3VyZSBpdCdzIGFuIGVsZW1lbnRcblxuICBpZiAoZWxlKSB7XG4gICAgdmFyIHJzdHlsZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHNlbGYuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgcHJvcC5uYW1lLCBpc1JlbmRlcmVkVmFsKTtcblxuICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJzdHlsZVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICByc3R5bGVbZGFzaDJjYW1lbChwcm9wLm5hbWUpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcnN0eWxlO1xuICB9XG59O1xuXG5zdHlmbiQzLmdldEluZGV4ZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BlcnR5LCBzdWJwcm9wZXJ0eSwgaW5kZXgpIHtcbiAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpW3N1YnByb3BlcnR5XVtpbmRleF07XG4gIHJldHVybiBwc3R5bGUgIT0gbnVsbCA/IHBzdHlsZSA6IGVsZS5jeSgpLnN0eWxlKCkuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5KVtzdWJwcm9wZXJ0eV1bMF07XG59O1xuXG5zdHlmbiQzLmdldFN0eWxlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblxuICAgIGlmIChwcm9wLmFsaWFzKSB7XG4gICAgICBwcm9wID0gcHJvcC5wb2ludHNUbztcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IHByb3AudHlwZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuXG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgdmFyIHZhbHVlID0gc3R5bGVQcm9wLnZhbHVlLFxuICAgICAgICAgIHVuaXRzID0gc3R5bGVQcm9wLnVuaXRzLFxuICAgICAgICAgIHN0clZhbHVlID0gc3R5bGVQcm9wLnN0clZhbHVlO1xuXG4gICAgICBpZiAoaXNSZW5kZXJlZFZhbCAmJiB0eXBlLm51bWJlciAmJiB2YWx1ZSAhPSBudWxsICYmIG51bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgdmFyIHpvb20gPSBlbGUuY3koKS56b29tKCk7XG5cbiAgICAgICAgdmFyIGdldFJlbmRlcmVkVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJlZFZhbHVlKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwgKiB6b29tO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyA9IGZ1bmN0aW9uIGdldFZhbHVlU3RyaW5nV2l0aFVuaXRzKHZhbCwgdW5pdHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0UmVuZGVyZWRWYWx1ZSh2YWwpICsgdW5pdHM7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlzQXJyYXlWYWx1ZSA9IGFycmF5KHZhbHVlKTtcbiAgICAgICAgdmFyIGhhdmVVbml0cyA9IGlzQXJyYXlWYWx1ZSA/IHVuaXRzLmV2ZXJ5KGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgcmV0dXJuIHUgIT0gbnVsbDtcbiAgICAgICAgfSkgOiB1bml0cyAhPSBudWxsO1xuXG4gICAgICAgIGlmIChoYXZlVW5pdHMpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2LCB1bml0c1tpXSk7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWx1ZSwgdW5pdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdHJpbmcodikgPyB2IDogJycgKyBnZXRSZW5kZXJlZFZhbHVlKHYpO1xuICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBnZXRSZW5kZXJlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbnN0eWZuJDMuZ2V0QW5pbWF0aW9uU3RhcnRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIGFuaVByb3BzKSB7XG4gIHZhciByc3R5bGUgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaVByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFuaVByb3AgPSBhbmlQcm9wc1tpXTtcbiAgICB2YXIgbmFtZSA9IGFuaVByb3AubmFtZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShuYW1lKTtcblxuICAgIGlmIChzdHlsZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdGhlbiBtYWtlIGEgcHJvcCBvZiBpdFxuICAgICAgaWYgKHBsYWluT2JqZWN0KHN0eWxlUHJvcCkpIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3Auc3RyVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShuYW1lLCBzdHlsZVByb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHlsZVByb3ApIHtcbiAgICAgIHJzdHlsZVtuYW1lXSA9IHN0eWxlUHJvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnN0eWxlO1xufTtcblxuc3R5Zm4kMy5nZXRQcm9wc0xpc3QgPSBmdW5jdGlvbiAocHJvcHNPYmopIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnN0eWxlID0gW107XG4gIHZhciBzdHlsZSA9IHByb3BzT2JqO1xuICB2YXIgcHJvcHMgPSBzZWxmLnByb3BlcnRpZXM7XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgdmFyIG5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzdHlsZVtuYW1lXTtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbbmFtZV0gfHwgcHJvcHNbY2FtZWwyZGFzaChuYW1lKV07XG4gICAgICB2YXIgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIHZhbCk7XG5cbiAgICAgIGlmIChzdHlsZVByb3ApIHtcbiAgICAgICAgcnN0eWxlLnB1c2goc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnN0eWxlO1xufTtcblxuc3R5Zm4kMy5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2ggPSBmdW5jdGlvbiAoZWxlLCBwcm9wTmFtZXMsIHNlZWQpIHtcbiAgdmFyIGhhc2ggPSBzZWVkLnNsaWNlKCk7XG4gIHZhciBuYW1lLCB2YWwsIHN0clZhbCwgY2hWYWw7XG4gIHZhciBpLCBqO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICBuYW1lID0gcHJvcE5hbWVzW2ldO1xuICAgIHZhbCA9IGVsZS5wc3R5bGUobmFtZSwgZmFsc2UpO1xuXG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHZhbC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIGhhc2hbMF0gPSBoYXNoSW50KGNoVmFsLCBoYXNoWzBdKTtcbiAgICAgIGhhc2hbMV0gPSBoYXNoSW50QWx0KGNoVmFsLCBoYXNoWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyVmFsID0gdmFsLnN0clZhbHVlO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoVmFsID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICAgIGhhc2hbMF0gPSBoYXNoSW50KGNoVmFsLCBoYXNoWzBdKTtcbiAgICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoYXNoO1xufTtcblxuc3R5Zm4kMy5nZXRQcm9wZXJ0aWVzSGFzaCA9IHN0eWZuJDMuZ2V0Tm9uRGVmYXVsdFByb3BlcnRpZXNIYXNoO1xuXG52YXIgc3R5Zm4kNCA9IHt9O1xuXG5zdHlmbiQ0LmFwcGVuZEZyb21Kc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgdmFyIHN0eWxlID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29udGV4dCA9IGpzb25baV07XG4gICAgdmFyIHNlbGVjdG9yID0gY29udGV4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjb250ZXh0LnN0eWxlIHx8IGNvbnRleHQuY3NzO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbmFtZSA9IG5hbWVzW2pdO1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBzdHlsZS5jc3MobmFtZSwgdmFsdWUpOyAvLyBhcHBseSBwcm9wZXJ0eVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn07IC8vIGFjY2Vzc2libGUgY3kuc3R5bGUoKSBmdW5jdGlvblxuXG5cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTsgLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuXG5cbnN0eWZuJDQuanNvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGpzb24gPSBbXTtcblxuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgY3NzW3Byb3AubmFtZV0gPSBwcm9wLnN0clZhbHVlO1xuICAgIH1cblxuICAgIGpzb24ucHVzaCh7XG4gICAgICBzZWxlY3RvcjogIXNlbGVjdG9yID8gJ2NvcmUnIDogc2VsZWN0b3IudG9TdHJpbmcoKSxcbiAgICAgIHN0eWxlOiBjc3NcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDUgPSB7fTtcblxuc3R5Zm4kNS5hcHBlbmRGcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdHlsZSA9IHRoaXM7XG4gIHZhciByZW1haW5pbmcgPSAnJyArIHN0cmluZztcbiAgdmFyIHNlbEFuZEJsb2NrU3RyO1xuICB2YXIgYmxvY2tSZW07XG4gIHZhciBwcm9wQW5kVmFsU3RyOyAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG5cbiAgcmVtYWluaW5nID0gcmVtYWluaW5nLnJlcGxhY2UoL1svXVsqXShcXHN8LikrP1sqXVsvXS9nLCAnJyk7XG5cbiAgZnVuY3Rpb24gcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHNlbGVjdG9yIGFuZCBibG9jayBmcm9tIHRoZSByZW1haW5pbmcgdGV4dCB0byBwYXJzZVxuICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID4gc2VsQW5kQmxvY2tTdHIubGVuZ3RoKSB7XG4gICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyKHNlbEFuZEJsb2NrU3RyLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbWFpbmluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOzspIHtcbiAgICB2YXIgbm90aGluZ0xlZnRUb1BhcnNlID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKiQvKTtcblxuICAgIGlmIChub3RoaW5nTGVmdFRvUGFyc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcblxuICAgIGlmICghc2VsQW5kQmxvY2spIHtcbiAgICAgIHdhcm4oJ0hhbHRpbmcgc3R5bGVzaGVldCBwYXJzaW5nOiBTdHJpbmcgc3R5bGVzaGVldCBjb250YWlucyBtb3JlIHRvIHBhcnNlIGJ1dCBubyBzZWxlY3RvciBhbmQgYmxvY2sgZm91bmQgaW46ICcgKyByZW1haW5pbmcpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc2VsQW5kQmxvY2tTdHIgPSBzZWxBbmRCbG9ja1swXTsgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG5cbiAgICB2YXIgc2VsZWN0b3JTdHIgPSBzZWxBbmRCbG9ja1sxXTtcblxuICAgIGlmIChzZWxlY3RvclN0ciAhPT0gJ2NvcmUnKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuXG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpOyAvLyBza2lwIHRoaXMgc2VsZWN0b3IgYW5kIGJsb2NrXG5cbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8gcGFyc2UgdGhlIGJsb2NrIG9mIHByb3BlcnRpZXMgYW5kIHZhbHVlc1xuXG5cbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHZhciBfbm90aGluZ0xlZnRUb1BhcnNlID0gYmxvY2tSZW0ubWF0Y2goL15cXHMqJC8pO1xuXG4gICAgICBpZiAoX25vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pXFxzKjsvKTtcblxuICAgICAgaWYgKCFwcm9wQW5kVmFsKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHBhcnNpbmcgb2YgYmxvY2s6IEludmFsaWQgZm9ybWF0dGluZyBvZiBzdHlsZSBwcm9wZXJ0eSBhbmQgdmFsdWUgZGVmaW5pdGlvbnMgZm91bmQgaW46JyArIGJsb2NrU3RyKTtcbiAgICAgICAgaW52YWxpZEJsb2NrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcblxuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHdhcm4oJ1NraXBwaW5nIHByb3BlcnR5OiBJbnZhbGlkIHByb3BlcnR5IG5hbWUgaW46ICcgKyBwcm9wQW5kVmFsU3RyKTsgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuXG4gICAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyc2VkUHJvcCA9IHN0eWxlLnBhcnNlKHByb3BTdHIsIHZhbFN0cik7XG5cbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7IC8vIHNraXAgdGhpcyBwcm9wZXJ0eSBpbiB0aGUgYmxvY2tcblxuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgIG5hbWU6IHByb3BTdHIsXG4gICAgICAgIHZhbDogdmFsU3RyXG4gICAgICB9KTtcbiAgICAgIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCk7XG4gICAgfVxuXG4gICAgaWYgKGludmFsaWRCbG9jaykge1xuICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICBicmVhaztcbiAgICB9IC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuXG5cbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3RvclN0cik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cblxuICAgIHJlbW92ZVNlbEFuZEJsb2NrRnJvbVJlbWFpbmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuc3R5Zm4kNS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQ2ID0ge307XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBudW1iZXIgPSBudW1iZXIkMTtcbiAgdmFyIHJnYmEgPSByZ2JhTm9CYWNrUmVmcztcbiAgdmFyIGhzbGEgPSBoc2xhTm9CYWNrUmVmcztcbiAgdmFyIGhleDMkMSA9IGhleDM7XG4gIHZhciBoZXg2JDEgPSBoZXg2O1xuXG4gIHZhciBkYXRhID0gZnVuY3Rpb24gZGF0YShwcmVmaXgpIHtcbiAgICByZXR1cm4gJ14nICsgcHJlZml4ICsgJ1xcXFxzKlxcXFwoXFxcXHMqKFtcXFxcd1xcXFwuXSspXFxcXHMqXFxcXCkkJztcbiAgfTtcblxuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciArICd8XFxcXHcrfCcgKyByZ2JhICsgJ3wnICsgaHNsYSArICd8JyArIGhleDMkMSArICd8JyArIGhleDYkMTtcbiAgICByZXR1cm4gJ14nICsgcHJlZml4ICsgJ1xcXFxzKlxcXFwoKFtcXFxcd1xcXFwuXSspXFxcXHMqXFxcXCxcXFxccyooJyArIG51bWJlciArICcpXFxcXHMqXFxcXCxcXFxccyooJyArIG51bWJlciArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuXG4gIHZhciB1cmxSZWdleGVzID0gWydedXJsXFxcXHMqXFxcXChcXFxccypbXFwnXCJdPyguKz8pW1xcJ1wiXT9cXFxccypcXFxcKSQnLCAnXihub25lKSQnLCAnXiguKykkJ107IC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcblxuICBzdHlmbiQ2LnR5cGVzID0ge1xuICAgIHRpbWU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHVuaXRzOiAnc3xtcycsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnbXMnXG4gICAgfSxcbiAgICBwZXJjZW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJSdcbiAgICB9LFxuICAgIHBlcmNlbnRhZ2VzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIHVuaXRzOiAnJScsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAnJScsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgemVyb09uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBuT25lT25lTnVtYmVyOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIG5vbk5lZ2F0aXZlSW50OiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBwYWRkaW5nUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2F2ZXJhZ2UnLCAnbWluJywgJ21heCddXG4gICAgfSxcbiAgICBiZ1dIOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBlbnVtczogWydhdXRvJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdQb3M6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ2lubmVyJywgJ2luY2x1ZGUtcGFkZGluZyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVwZWF0OiB7XG4gICAgICBlbnVtczogWydyZXBlYXQnLCAncmVwZWF0LXgnLCAncmVwZWF0LXknLCAnbm8tcmVwZWF0J10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdGaXQ6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnY29udGFpbicsICdjb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ3Jvc3NPcmlnaW46IHtcbiAgICAgIGVudW1zOiBbJ2Fub255bW91cycsICd1c2UtY3JlZGVudGlhbHMnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ0NsaXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnbm9kZSddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yOiB7XG4gICAgICBjb2xvcjogdHJ1ZVxuICAgIH0sXG4gICAgY29sb3JzOiB7XG4gICAgICBjb2xvcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmaWxsOiB7XG4gICAgICBlbnVtczogWydzb2xpZCcsICdsaW5lYXItZ3JhZGllbnQnLCAncmFkaWFsLWdyYWRpZW50J11cbiAgICB9LFxuICAgIGJvb2w6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddXG4gICAgfSxcbiAgICBsaW5lU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnXVxuICAgIH0sXG4gICAgbGluZUNhcDoge1xuICAgICAgZW51bXM6IFsnYnV0dCcsICdyb3VuZCcsICdzcXVhcmUnXVxuICAgIH0sXG4gICAgYm9yZGVyU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZG91YmxlJ11cbiAgICB9LFxuICAgIGN1cnZlU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2JlemllcicsICd1bmJ1bmRsZWQtYmV6aWVyJywgJ2hheXN0YWNrJywgJ3NlZ21lbnRzJywgJ3N0cmFpZ2h0JywgJ3RheGknXVxuICAgIH0sXG4gICAgZm9udEZhbWlseToge1xuICAgICAgcmVnZXg6ICdeKFtcXFxcdy0gXFxcXFwiXSsoPzpcXFxccyosXFxcXHMqW1xcXFx3LSBcXFxcXCJdKykqKSQnXG4gICAgfSxcbiAgICBmb250U3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2l0YWxpYycsICdub3JtYWwnLCAnb2JsaXF1ZSddXG4gICAgfSxcbiAgICBmb250V2VpZ2h0OiB7XG4gICAgICBlbnVtczogWydub3JtYWwnLCAnYm9sZCcsICdib2xkZXInLCAnbGlnaHRlcicsICcxMDAnLCAnMjAwJywgJzMwMCcsICc0MDAnLCAnNTAwJywgJzYwMCcsICc4MDAnLCAnOTAwJywgMTAwLCAyMDAsIDMwMCwgNDAwLCA1MDAsIDYwMCwgNzAwLCA4MDAsIDkwMF1cbiAgICB9LFxuICAgIHRleHREZWNvcmF0aW9uOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VuZGVybGluZScsICdvdmVybGluZScsICdsaW5lLXRocm91Z2gnXVxuICAgIH0sXG4gICAgdGV4dFRyYW5zZm9ybToge1xuICAgICAgZW51bXM6IFsnbm9uZScsICd1cHBlcmNhc2UnLCAnbG93ZXJjYXNlJ11cbiAgICB9LFxuICAgIHRleHRXcmFwOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3dyYXAnLCAnZWxsaXBzaXMnXVxuICAgIH0sXG4gICAgdGV4dE92ZXJmbG93V3JhcDoge1xuICAgICAgZW51bXM6IFsnd2hpdGVzcGFjZScsICdhbnl3aGVyZSddXG4gICAgfSxcbiAgICB0ZXh0QmFja2dyb3VuZFNoYXBlOiB7XG4gICAgICBlbnVtczogWydyZWN0YW5nbGUnLCAncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJ11cbiAgICB9LFxuICAgIG5vZGVTaGFwZToge1xuICAgICAgZW51bXM6IFsncmVjdGFuZ2xlJywgJ3JvdW5kcmVjdGFuZ2xlJywgJ3JvdW5kLXJlY3RhbmdsZScsICdjdXRyZWN0YW5nbGUnLCAnY3V0LXJlY3RhbmdsZScsICdib3R0b21yb3VuZHJlY3RhbmdsZScsICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJywgJ2JhcnJlbCcsICdlbGxpcHNlJywgJ3RyaWFuZ2xlJywgJ3JvdW5kLXRyaWFuZ2xlJywgJ3NxdWFyZScsICdwZW50YWdvbicsICdyb3VuZC1wZW50YWdvbicsICdoZXhhZ29uJywgJ3JvdW5kLWhleGFnb24nLCAnY29uY2F2ZWhleGFnb24nLCAnY29uY2F2ZS1oZXhhZ29uJywgJ2hlcHRhZ29uJywgJ3JvdW5kLWhlcHRhZ29uJywgJ29jdGFnb24nLCAncm91bmQtb2N0YWdvbicsICd0YWcnLCAncm91bmQtdGFnJywgJ3N0YXInLCAnZGlhbW9uZCcsICdyb3VuZC1kaWFtb25kJywgJ3ZlZScsICdyaG9tYm9pZCcsICdwb2x5Z29uJ11cbiAgICB9LFxuICAgIGNvbXBvdW5kSW5jbHVkZUxhYmVsczoge1xuICAgICAgZW51bXM6IFsnaW5jbHVkZScsICdleGNsdWRlJ11cbiAgICB9LFxuICAgIGFycm93U2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3RlZScsICd0cmlhbmdsZScsICd0cmlhbmdsZS10ZWUnLCAnY2lyY2xlLXRyaWFuZ2xlJywgJ3RyaWFuZ2xlLWNyb3NzJywgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZScsICd2ZWUnLCAnc3F1YXJlJywgJ2NpcmNsZScsICdkaWFtb25kJywgJ2NoZXZyb24nLCAnbm9uZSddXG4gICAgfSxcbiAgICBhcnJvd0ZpbGw6IHtcbiAgICAgIGVudW1zOiBbJ2ZpbGxlZCcsICdob2xsb3cnXVxuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgZW51bXM6IFsnZWxlbWVudCcsICdub25lJ11cbiAgICB9LFxuICAgIHZpc2liaWxpdHk6IHtcbiAgICAgIGVudW1zOiBbJ2hpZGRlbicsICd2aXNpYmxlJ11cbiAgICB9LFxuICAgIHpDb21wb3VuZERlcHRoOiB7XG4gICAgICBlbnVtczogWydib3R0b20nLCAnb3JwaGFuJywgJ2F1dG8nLCAndG9wJ11cbiAgICB9LFxuICAgIHpJbmRleENvbXBhcmU6IHtcbiAgICAgIGVudW1zOiBbJ2F1dG8nLCAnbWFudWFsJ11cbiAgICB9LFxuICAgIHZhbGlnbjoge1xuICAgICAgZW51bXM6IFsndG9wJywgJ2NlbnRlcicsICdib3R0b20nXVxuICAgIH0sXG4gICAgaGFsaWduOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddXG4gICAgfSxcbiAgICBqdXN0aWZpY2F0aW9uOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHN0cmluZzogdHJ1ZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdkYXRhJylcbiAgICB9LFxuICAgIGxheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnbGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBzY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ3NjcmF0Y2gnKVxuICAgIH0sXG4gICAgbWFwRGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBEYXRhJylcbiAgICB9LFxuICAgIG1hcExheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwTGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBtYXBTY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcFNjcmF0Y2gnKVxuICAgIH0sXG4gICAgZm46IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICBmbjogdHJ1ZVxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlXG4gICAgfSxcbiAgICB1cmxzOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHByb3BMaXN0OiB7XG4gICAgICBwcm9wTGlzdDogdHJ1ZVxuICAgIH0sXG4gICAgYW5nbGU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJ1xuICAgIH0sXG4gICAgdGV4dFJvdGF0aW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCcsXG4gICAgICBlbnVtczogWydub25lJywgJ2F1dG9yb3RhdGUnXVxuICAgIH0sXG4gICAgcG9seWdvblBvaW50TGlzdDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBldmVuTXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIGVkZ2VEaXN0YW5jZXM6IHtcbiAgICAgIGVudW1zOiBbJ2ludGVyc2VjdGlvbicsICdub2RlLXBvc2l0aW9uJ11cbiAgICB9LFxuICAgIGVkZ2VFbmRwb2ludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICB1bml0czogJyV8cHh8ZW18ZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncHgnLFxuICAgICAgZW51bXM6IFsnaW5zaWRlLXRvLW5vZGUnLCAnb3V0c2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcsICdvdXRzaWRlLXRvLWxpbmUnLCAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJ10sXG4gICAgICBzaW5nbGVFbnVtOiB0cnVlLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFyciwgdW5pdHNBcnIpIHtcbiAgICAgICAgc3dpdGNoICh2YWxBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgLy8gY2FuIGJlICUgb3IgcHggb25seVxuICAgICAgICAgICAgcmV0dXJuIHVuaXRzQXJyWzBdICE9PSAnZGVnJyAmJiB1bml0c0FyclswXSAhPT0gJ3JhZCcgJiYgdW5pdHNBcnJbMV0gIT09ICdkZWcnICYmIHVuaXRzQXJyWzFdICE9PSAncmFkJztcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIC8vIGNhbiBiZSBlbnVtLCBkZWcsIG9yIHJhZCBvbmx5XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nKHZhbEFyclswXSkgfHwgdW5pdHNBcnJbMF0gPT09ICdkZWcnIHx8IHVuaXRzQXJyWzBdID09PSAncmFkJztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVhc2luZzoge1xuICAgICAgcmVnZXhlczogWydeKHNwcmluZylcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKVxcXFxzKlxcXFwpJCcsICdeKGN1YmljLWJlemllcilcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJylcXFxccypcXFxcKSQnXSxcbiAgICAgIGVudW1zOiBbJ2xpbmVhcicsICdlYXNlJywgJ2Vhc2UtaW4nLCAnZWFzZS1vdXQnLCAnZWFzZS1pbi1vdXQnLCAnZWFzZS1pbi1zaW5lJywgJ2Vhc2Utb3V0LXNpbmUnLCAnZWFzZS1pbi1vdXQtc2luZScsICdlYXNlLWluLXF1YWQnLCAnZWFzZS1vdXQtcXVhZCcsICdlYXNlLWluLW91dC1xdWFkJywgJ2Vhc2UtaW4tY3ViaWMnLCAnZWFzZS1vdXQtY3ViaWMnLCAnZWFzZS1pbi1vdXQtY3ViaWMnLCAnZWFzZS1pbi1xdWFydCcsICdlYXNlLW91dC1xdWFydCcsICdlYXNlLWluLW91dC1xdWFydCcsICdlYXNlLWluLXF1aW50JywgJ2Vhc2Utb3V0LXF1aW50JywgJ2Vhc2UtaW4tb3V0LXF1aW50JywgJ2Vhc2UtaW4tZXhwbycsICdlYXNlLW91dC1leHBvJywgJ2Vhc2UtaW4tb3V0LWV4cG8nLCAnZWFzZS1pbi1jaXJjJywgJ2Vhc2Utb3V0LWNpcmMnLCAnZWFzZS1pbi1vdXQtY2lyYyddXG4gICAgfSxcbiAgICBncmFkaWVudERpcmVjdGlvbjoge1xuICAgICAgZW51bXM6IFsndG8tYm90dG9tJywgJ3RvLXRvcCcsICd0by1sZWZ0JywgJ3RvLXJpZ2h0JywgJ3RvLWJvdHRvbS1yaWdodCcsICd0by1ib3R0b20tbGVmdCcsICd0by10b3AtcmlnaHQnLCAndG8tdG9wLWxlZnQnLCAndG8tcmlnaHQtYm90dG9tJywgJ3RvLWxlZnQtYm90dG9tJywgJ3RvLXJpZ2h0LXRvcCcsICd0by1sZWZ0LXRvcCddXG4gICAgfSxcbiAgICBib3VuZHNFeHBhbnNpb246IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbEFycikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdmFsQXJyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA9PT0gMSB8fCBsZW5ndGggPT09IDIgfHwgbGVuZ3RoID09PSA0O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGRpZmYgPSB7XG4gICAgemVyb05vblplcm86IGZ1bmN0aW9uIHplcm9Ob25aZXJvKHZhbDEsIHZhbDIpIHtcbiAgICAgIGlmICgodmFsMSA9PSBudWxsIHx8IHZhbDIgPT0gbnVsbCkgJiYgdmFsMSAhPT0gdmFsMikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gbnVsbCBjYXNlcyBjb3VsZCByZXByZXNlbnQgYW55IHZhbHVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwxID09IDAgJiYgdmFsMiAhPSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh2YWwxICE9IDAgJiYgdmFsMiA9PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gICAgYW55OiBmdW5jdGlvbiBhbnkodmFsMSwgdmFsMikge1xuICAgICAgcmV0dXJuIHZhbDEgIT0gdmFsMjtcbiAgICB9LFxuICAgIGVtcHR5Tm9uRW1wdHk6IGZ1bmN0aW9uIGVtcHR5Tm9uRW1wdHkoc3RyMSwgc3RyMikge1xuICAgICAgdmFyIGVtcHR5MSA9IGVtcHR5U3RyaW5nKHN0cjEpO1xuICAgICAgdmFyIGVtcHR5MiA9IGVtcHR5U3RyaW5nKHN0cjIpO1xuICAgICAgcmV0dXJuIGVtcHR5MSAmJiAhZW1wdHkyIHx8ICFlbXB0eTEgJiYgZW1wdHkyO1xuICAgIH1cbiAgfTsgLy8gZGVmaW5lIHZpc3VhbCBzdHlsZSBwcm9wZXJ0aWVzXG4gIC8vXG4gIC8vIC0gbi5iLiBhZGRpbmcgYSBuZXcgZ3JvdXAgb2YgcHJvcHMgbWF5IHJlcXVpcmUgdXBkYXRlcyB0byB1cGRhdGVTdHlsZUhpbnRzKClcbiAgLy8gLSBhZGRpbmcgbmV3IHByb3BzIHRvIGFuIGV4aXN0aW5nIGdyb3VwIGdldHMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5XG5cbiAgdmFyIHQgPSBzdHlmbiQ2LnR5cGVzO1xuICB2YXIgbWFpbkxhYmVsID0gW3tcbiAgICBuYW1lOiAnbGFiZWwnLFxuICAgIHR5cGU6IHQudGV4dCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuZW1wdHlOb25FbXB0eVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtbWFyZ2luLXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBzb3VyY2VMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3NvdXJjZS1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciB0YXJnZXRMYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RhcmdldC1sYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LXJvdGF0aW9uJyxcbiAgICB0eXBlOiB0LnRleHRSb3RhdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1tYXJnaW4teScsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXJnZXQtdGV4dC1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBsYWJlbERpbWVuc2lvbnMgPSBbe1xuICAgIG5hbWU6ICdmb250LWZhbWlseScsXG4gICAgdHlwZTogdC5mb250RmFtaWx5LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtc3R5bGUnLFxuICAgIHR5cGU6IHQuZm9udFN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2ZvbnQtd2VpZ2h0JyxcbiAgICB0eXBlOiB0LmZvbnRXZWlnaHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC10cmFuc2Zvcm0nLFxuICAgIHR5cGU6IHQudGV4dFRyYW5zZm9ybSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dFdyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1vdmVyZmxvdy13cmFwJyxcbiAgICB0eXBlOiB0LnRleHRPdmVyZmxvd1dyYXAsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXgtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWhlaWdodCcsXG4gICAgdHlwZTogdC5wb3NpdGl2ZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBjb21tb25MYWJlbCA9IFt7XG4gICAgbmFtZTogJ3RleHQtdmFsaWduJyxcbiAgICB0eXBlOiB0LnZhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWhhbGlnbicsXG4gICAgdHlwZTogdC5oYWxpZ24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW91dGxpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYmFja2dyb3VuZC1zaGFwZScsXG4gICAgdHlwZTogdC50ZXh0QmFja2dyb3VuZFNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtanVzdGlmaWNhdGlvbicsXG4gICAgdHlwZTogdC5qdXN0aWZpY2F0aW9uXG4gIH1dO1xuICB2YXIgYmVoYXZpb3IgPSBbe1xuICAgIG5hbWU6ICdldmVudHMnLFxuICAgIHR5cGU6IHQuYm9vbFxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2xcbiAgfV07XG4gIHZhciB2aXNpYmlsaXR5ID0gW3tcbiAgICBuYW1lOiAnZGlzcGxheScsXG4gICAgdHlwZTogdC5kaXNwbGF5LFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsQmV6aWVyczogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3Zpc2liaWxpdHknLFxuICAgIHR5cGU6IHQudmlzaWJpbGl0eSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ21pbi16b29tZWQtZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVcbiAgfSwge1xuICAgIG5hbWU6ICd6LWNvbXBvdW5kLWRlcHRoJyxcbiAgICB0eXBlOiB0LnpDb21wb3VuZERlcHRoLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgtY29tcGFyZScsXG4gICAgdHlwZTogdC56SW5kZXhDb21wYXJlLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgnLFxuICAgIHR5cGU6IHQubm9uTmVnYXRpdmVJbnQsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgb3ZlcmxheSA9IFt7XG4gICAgbmFtZTogJ292ZXJsYXktcGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ292ZXJsYXktY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi56ZXJvTm9uWmVyb1xuICB9XTtcbiAgdmFyIHRyYW5zaXRpb24gPSBbe1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgICB0eXBlOiB0LnByb3BMaXN0XG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1kZWxheScsXG4gICAgdHlwZTogdC50aW1lXG4gIH0sIHtcbiAgICBuYW1lOiAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLFxuICAgIHR5cGU6IHQuZWFzaW5nXG4gIH1dO1xuXG4gIHZhciBub2RlU2l6ZUhhc2hPdmVycmlkZSA9IGZ1bmN0aW9uIG5vZGVTaXplSGFzaE92ZXJyaWRlKGVsZSwgcGFyc2VkUHJvcCkge1xuICAgIGlmIChwYXJzZWRQcm9wLnZhbHVlID09PSAnbGFiZWwnKSB7XG4gICAgICByZXR1cm4gLWVsZS5wb29sSW5kZXgoKTsgLy8gbm8gaGFzaCBrZXkgaGl0cyBpcyB1c2luZyBsYWJlbCBzaXplIChoaXRyYXRlIGZvciBwZXJmIHByb2JhYmx5IGxvdyBhbnl3YXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZWRQcm9wLnBmVmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBub2RlQm9keSA9IFt7XG4gICAgbmFtZTogJ2hlaWdodCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3dpZHRoJyxcbiAgICB0eXBlOiB0Lm5vZGVTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICBoYXNoT3ZlcnJpZGU6IG5vZGVTaXplSGFzaE92ZXJyaWRlXG4gIH0sIHtcbiAgICBuYW1lOiAnc2hhcGUnLFxuICAgIHR5cGU6IHQubm9kZVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlLXBvbHlnb24tcG9pbnRzJyxcbiAgICB0eXBlOiB0LnBvbHlnb25Qb2ludExpc3QsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZmlsbCcsXG4gICAgdHlwZTogdC5maWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWJsYWNrZW4nLFxuICAgIHR5cGU6IHQubk9uZU9uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtc3RvcC1jb2xvcnMnLFxuICAgIHR5cGU6IHQuY29sb3JzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucycsXG4gICAgdHlwZTogdC5wZXJjZW50YWdlc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtZ3JhZGllbnQtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmdyYWRpZW50RGlyZWN0aW9uXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZycsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQucGFkZGluZ1JlbGF0aXZlVG8sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnYm91bmRzLWV4cGFuc2lvbicsXG4gICAgdHlwZTogdC5ib3VuZHNFeHBhbnNpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgbm9kZUJvcmRlciA9IFt7XG4gICAgbmFtZTogJ2JvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3JkZXItc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGVcbiAgfV07XG4gIHZhciBiYWNrZ3JvdW5kSW1hZ2UgPSBbe1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgICB0eXBlOiB0LnVybHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJyxcbiAgICB0eXBlOiB0LmJnQ3Jvc3NPcmlnaW5cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJyxcbiAgICB0eXBlOiB0LmJnUmVsYXRpdmVUb1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcmVwZWF0JyxcbiAgICB0eXBlOiB0LmJnUmVwZWF0XG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maXQnLFxuICAgIHR5cGU6IHQuYmdGaXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAgIHR5cGU6IHQuYmdDbGlwXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC13aWR0aCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQnLFxuICAgIHR5cGU6IHQuYmdXSFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9mZnNldC15JyxcbiAgICB0eXBlOiB0LmJnUG9zXG4gIH1dO1xuICB2YXIgY29tcG91bmQgPSBbe1xuICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgdHlwZTogdC5wb3NpdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycsXG4gICAgdHlwZTogdC5jb21wb3VuZEluY2x1ZGVMYWJlbHMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtbGVmdCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi13aWR0aC1iaWFzLXJpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy10b3AnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgZWRnZUxpbmUgPSBbe1xuICAgIG5hbWU6ICdsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmxpbmVTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWZpbGwnLFxuICAgIHR5cGU6IHQuZmlsbFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtY2FwJyxcbiAgICB0eXBlOiB0LmxpbmVDYXBcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1wYXR0ZXJuJyxcbiAgICB0eXBlOiB0Lm51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZ3JhZGllbnQtc3RvcC1jb2xvcnMnLFxuICAgIHR5cGU6IHQuY29sb3JzXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucycsXG4gICAgdHlwZTogdC5wZXJjZW50YWdlc1xuICB9LCB7XG4gICAgbmFtZTogJ2N1cnZlLXN0eWxlJyxcbiAgICB0eXBlOiB0LmN1cnZlU3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZQYXJhbGxlbEJlemllcnM6IHRydWVcbiAgfSwge1xuICAgIG5hbWU6ICdoYXlzdGFjay1yYWRpdXMnLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzb3VyY2UtZW5kcG9pbnQnLFxuICAgIHR5cGU6IHQuZWRnZUVuZHBvaW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29udHJvbC1wb2ludC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1kaXN0YW5jZXMnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemVzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtd2VpZ2h0cycsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybicsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuYXhpc0RpcmVjdGlvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTsgLy8gcGllIGJhY2tncm91bmRzIGZvciBub2Rlc1xuXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kNi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcblxuICBwaWUucHVzaCh7XG4gICAgbmFtZTogJ3BpZS1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnRcbiAgfSk7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kNi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICB0eXBlOiB0LmNvbG9yXG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1zaXplJyxcbiAgICAgIHR5cGU6IHQucGVyY2VudFxuICAgIH0pO1xuICAgIHBpZS5wdXNoKHtcbiAgICAgIG5hbWU6ICdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtb3BhY2l0eScsXG4gICAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgICB9KTtcbiAgfSAvLyBlZGdlIGFycm93c1xuXG5cbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDYuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH1dLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBhcnJvd1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnLScgKyBwcm9wLm5hbWU7XG4gICAgICB2YXIgdHlwZSA9IHByb3AudHlwZSxcbiAgICAgICAgICB0cmlnZ2Vyc0JvdW5kcyA9IHByb3AudHJpZ2dlcnNCb3VuZHM7XG4gICAgICBlZGdlQXJyb3cucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzOiB0cmlnZ2Vyc0JvdW5kc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIHt9KTtcbiAgdmFyIHByb3BzID0gc3R5Zm4kNi5wcm9wZXJ0aWVzID0gW10uY29uY2F0KGJlaGF2aW9yLCB0cmFuc2l0aW9uLCB2aXNpYmlsaXR5LCBvdmVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBiYWNrZ3JvdW5kSW1hZ2UsIHBpZSwgY29tcG91bmQsIGVkZ2VMaW5lLCBlZGdlQXJyb3csIGNvcmUpO1xuICB2YXIgcHJvcEdyb3VwcyA9IHN0eWZuJDYucHJvcGVydHlHcm91cHMgPSB7XG4gICAgLy8gY29tbW9uIHRvIGFsbCBlbGVzXG4gICAgYmVoYXZpb3I6IGJlaGF2aW9yLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eSxcbiAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgIGdob3N0OiBnaG9zdCxcbiAgICAvLyBsYWJlbHNcbiAgICBjb21tb25MYWJlbDogY29tbW9uTGFiZWwsXG4gICAgbGFiZWxEaW1lbnNpb25zOiBsYWJlbERpbWVuc2lvbnMsXG4gICAgbWFpbkxhYmVsOiBtYWluTGFiZWwsXG4gICAgc291cmNlTGFiZWw6IHNvdXJjZUxhYmVsLFxuICAgIHRhcmdldExhYmVsOiB0YXJnZXRMYWJlbCxcbiAgICAvLyBub2RlIHByb3BzXG4gICAgbm9kZUJvZHk6IG5vZGVCb2R5LFxuICAgIG5vZGVCb3JkZXI6IG5vZGVCb3JkZXIsXG4gICAgYmFja2dyb3VuZEltYWdlOiBiYWNrZ3JvdW5kSW1hZ2UsXG4gICAgcGllOiBwaWUsXG4gICAgY29tcG91bmQ6IGNvbXBvdW5kLFxuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICBlZGdlTGluZTogZWRnZUxpbmUsXG4gICAgZWRnZUFycm93OiBlZGdlQXJyb3csXG4gICAgY29yZTogY29yZVxuICB9O1xuICB2YXIgcHJvcEdyb3VwTmFtZXMgPSBzdHlmbiQ2LnByb3BlcnR5R3JvdXBOYW1lcyA9IHt9O1xuICB2YXIgcHJvcEdyb3VwS2V5cyA9IHN0eWZuJDYucHJvcGVydHlHcm91cEtleXMgPSBPYmplY3Qua2V5cyhwcm9wR3JvdXBzKTtcbiAgcHJvcEdyb3VwS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBwcm9wR3JvdXBOYW1lc1trZXldID0gcHJvcEdyb3Vwc1trZXldLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubmFtZTtcbiAgICB9KTtcbiAgICBwcm9wR3JvdXBzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AuZ3JvdXBLZXkgPSBrZXk7XG4gICAgfSk7XG4gIH0pOyAvLyBkZWZpbmUgYWxpYXNlc1xuXG4gIHZhciBhbGlhc2VzID0gc3R5Zm4kNi5hbGlhc2VzID0gW3tcbiAgICBuYW1lOiAnY29udGVudCcsXG4gICAgcG9pbnRzVG86ICdsYWJlbCdcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LWRpc3RhbmNlJyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0JyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cydcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLXRleHQtcm90YXRpb24nLFxuICAgIHBvaW50c1RvOiAndGV4dC1yb3RhdGlvbidcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLWxlZnQnLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXJpZ2h0JyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy10b3AnLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLWJvdHRvbScsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9XTsgLy8gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuXG4gIHN0eWZuJDYucHJvcGVydHlOYW1lcyA9IHByb3BzLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwLm5hbWU7XG4gIH0pOyAvLyBhbGxvdyBhY2Nlc3Mgb2YgcHJvcGVydGllcyBieSBuYW1lICggZS5nLiBzdHlsZS5wcm9wZXJ0aWVzLmhlaWdodCApXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHByb3BzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBwcm9wID0gcHJvcHNbX2ldO1xuICAgIHByb3BzW3Byb3AubmFtZV0gPSBwcm9wOyAvLyBhbGxvdyBsb29rdXAgYnkgbmFtZVxuICB9IC8vIG1hcCBhbGlhc2VzXG5cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBhbGlhc2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW19pMl07XG4gICAgdmFyIHBvaW50c1RvUHJvcCA9IHByb3BzW2FsaWFzLnBvaW50c1RvXTtcbiAgICB2YXIgYWxpYXNQcm9wID0ge1xuICAgICAgbmFtZTogYWxpYXMubmFtZSxcbiAgICAgIGFsaWFzOiB0cnVlLFxuICAgICAgcG9pbnRzVG86IHBvaW50c1RvUHJvcFxuICAgIH07IC8vIGFkZCBhbGlhcyBwcm9wIGZvciBwYXJzaW5nXG5cbiAgICBwcm9wcy5wdXNoKGFsaWFzUHJvcCk7XG4gICAgcHJvcHNbYWxpYXMubmFtZV0gPSBhbGlhc1Byb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH1cbn0pKCk7XG5cbnN0eWZuJDYuZ2V0RGVmYXVsdFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFByb3BlcnRpZXMoKVtuYW1lXTtcbn07XG5cbnN0eWZuJDYuZ2V0RGVmYXVsdFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG5cbiAgaWYgKF9wLmRlZmF1bHRQcm9wZXJ0aWVzICE9IG51bGwpIHtcbiAgICByZXR1cm4gX3AuZGVmYXVsdFByb3BlcnRpZXM7XG4gIH1cblxuICB2YXIgcmF3UHJvcHMgPSBleHRlbmQoe1xuICAgIC8vIGNvcmUgcHJvcHNcbiAgICAnc2VsZWN0aW9uLWJveC1jb2xvcic6ICcjZGRkJyxcbiAgICAnc2VsZWN0aW9uLWJveC1vcGFjaXR5JzogMC42NSxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InOiAnI2FhYScsXG4gICAgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLXdpZHRoJzogMSxcbiAgICAnYWN0aXZlLWJnLWNvbG9yJzogJ2JsYWNrJyxcbiAgICAnYWN0aXZlLWJnLW9wYWNpdHknOiAwLjE1LFxuICAgICdhY3RpdmUtYmctc2l6ZSc6IDMwLFxuICAgICdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InOiAnIzAwMCcsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JzogMC4xMjUsXG4gICAgLy8gY29tbW9uIG5vZGUvZWRnZSBwcm9wc1xuICAgICdldmVudHMnOiAneWVzJyxcbiAgICAndGV4dC1ldmVudHMnOiAnbm8nLFxuICAgICd0ZXh0LXZhbGlnbic6ICd0b3AnLFxuICAgICd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnYXV0bycsXG4gICAgJ2xpbmUtaGVpZ2h0JzogMSxcbiAgICAnY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtb3V0bGluZS1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLXdpZHRoJzogMCxcbiAgICAndGV4dC1vdXRsaW5lLW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LW9wYWNpdHknOiAxLFxuICAgICd0ZXh0LWRlY29yYXRpb24nOiAnbm9uZScsXG4gICAgJ3RleHQtdHJhbnNmb3JtJzogJ25vbmUnLFxuICAgICd0ZXh0LXdyYXAnOiAnbm9uZScsXG4gICAgJ3RleHQtb3ZlcmZsb3ctd3JhcCc6ICd3aGl0ZXNwYWNlJyxcbiAgICAndGV4dC1tYXgtd2lkdGgnOiA5OTk5LFxuICAgICd0ZXh0LWJhY2tncm91bmQtY29sb3InOiAnIzAwMCcsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJzogMCxcbiAgICAndGV4dC1ib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgJ3RleHQtYm9yZGVyLXdpZHRoJzogMCxcbiAgICAndGV4dC1ib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICd0ZXh0LWJvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnZm9udC1mYW1pbHknOiAnSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgc2Fucy1zZXJpZicsXG4gICAgJ2ZvbnQtc3R5bGUnOiAnbm9ybWFsJyxcbiAgICAnZm9udC13ZWlnaHQnOiAnbm9ybWFsJyxcbiAgICAnZm9udC1zaXplJzogMTYsXG4gICAgJ21pbi16b29tZWQtZm9udC1zaXplJzogMCxcbiAgICAndGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAnc291cmNlLXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3RhcmdldC10ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICd2aXNpYmlsaXR5JzogJ3Zpc2libGUnLFxuICAgICdkaXNwbGF5JzogJ2VsZW1lbnQnLFxuICAgICdvcGFjaXR5JzogMSxcbiAgICAnei1jb21wb3VuZC1kZXB0aCc6ICdhdXRvJyxcbiAgICAnei1pbmRleC1jb21wYXJlJzogJ2F1dG8nLFxuICAgICd6LWluZGV4JzogMCxcbiAgICAnbGFiZWwnOiAnJyxcbiAgICAndGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RleHQtbWFyZ2luLXknOiAwLFxuICAgICdzb3VyY2UtbGFiZWwnOiAnJyxcbiAgICAnc291cmNlLXRleHQtb2Zmc2V0JzogMCxcbiAgICAnc291cmNlLXRleHQtbWFyZ2luLXgnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3RhcmdldC1sYWJlbCc6ICcnLFxuICAgICd0YXJnZXQtdGV4dC1vZmZzZXQnOiAwLFxuICAgICd0YXJnZXQtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMCxcbiAgICAnb3ZlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3ZlcmxheS1wYWRkaW5nJzogMTAsXG4gICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnbm9uZScsXG4gICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAwLFxuICAgICd0cmFuc2l0aW9uLWRlbGF5JzogMCxcbiAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnbGluZWFyJyxcbiAgICAvLyBub2RlIHByb3BzXG4gICAgJ2JhY2tncm91bmQtYmxhY2tlbic6IDAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzk5OScsXG4gICAgJ2JhY2tncm91bmQtZmlsbCc6ICdzb2xpZCcsXG4gICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nOiAnYW5vbnltb3VzJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JzogMSxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtcG9zaXRpb24teSc6ICc1MCUnLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC14JzogMCxcbiAgICAnYmFja2dyb3VuZC1vZmZzZXQteSc6IDAsXG4gICAgJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcbiAgICAnYmFja2dyb3VuZC1maXQnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtY2xpcCc6ICdub2RlJyxcbiAgICAnYmFja2dyb3VuZC13aWR0aCc6ICdhdXRvJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnYXV0bycsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnYm9yZGVyLW9wYWNpdHknOiAxLFxuICAgICdib3JkZXItd2lkdGgnOiAwLFxuICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICdoZWlnaHQnOiAzMCxcbiAgICAnd2lkdGgnOiAzMCxcbiAgICAnc2hhcGUnOiAnZWxsaXBzZScsXG4gICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAxLCAtMSwgICAxLCAxLCAgIC0xLCAxJyxcbiAgICAnYm91bmRzLWV4cGFuc2lvbic6IDAsXG4gICAgLy8gbm9kZSBncmFkaWVudFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbic6ICd0by1ib3R0b20nLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtY29sb3JzJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJzogJzAlJyxcbiAgICAvLyBnaG9zdCBwcm9wc1xuICAgICdnaG9zdCc6ICdubycsXG4gICAgJ2dob3N0LW9mZnNldC15JzogMCxcbiAgICAnZ2hvc3Qtb2Zmc2V0LXgnOiAwLFxuICAgICdnaG9zdC1vcGFjaXR5JzogMCxcbiAgICAvLyBjb21wb3VuZCBwcm9wc1xuICAgICdwYWRkaW5nJzogMCxcbiAgICAncGFkZGluZy1yZWxhdGl2ZS10byc6ICd3aWR0aCcsXG4gICAgJ3Bvc2l0aW9uJzogJ29yaWdpbicsXG4gICAgJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2luY2x1ZGUnLFxuICAgICdtaW4td2lkdGgnOiAwLFxuICAgICdtaW4td2lkdGgtYmlhcy1sZWZ0JzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiAwLFxuICAgICdtaW4taGVpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodC1iaWFzLXRvcCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiAwXG4gIH0sIHtcbiAgICAvLyBub2RlIHBpZSBiZ1xuICAgICdwaWUtc2l6ZSc6ICcxMDAlJ1xuICB9LCBbe1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1jb2xvcicsXG4gICAgdmFsdWU6ICdibGFjaydcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1zaXplJyxcbiAgICB2YWx1ZTogJzAlJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BpZS17e2l9fS1iYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHZhbHVlOiAxXG4gIH1dLnJlZHVjZShmdW5jdGlvbiAoY3NzLCBwcm9wKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc3R5Zm4kNi5waWVCYWNrZ3JvdW5kTjsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3AubmFtZS5yZXBsYWNlKCd7e2l9fScsIGkpO1xuICAgICAgdmFyIHZhbCA9IHByb3AudmFsdWU7XG4gICAgICBjc3NbbmFtZV0gPSB2YWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNzcztcbiAgfSwge30pLCB7XG4gICAgLy8gZWRnZSBwcm9wc1xuICAgICdsaW5lLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAnbGluZS1jb2xvcic6ICcjOTk5JyxcbiAgICAnbGluZS1maWxsJzogJ3NvbGlkJyxcbiAgICAnbGluZS1jYXAnOiAnYnV0dCcsXG4gICAgJ2xpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ2xpbmUtZ3JhZGllbnQtc3RvcC1jb2xvcnMnOiAnIzk5OScsXG4gICAgJ2xpbmUtZ3JhZGllbnQtc3RvcC1wb3NpdGlvbnMnOiAnMCUnLFxuICAgICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZSc6IDQwLFxuICAgICdjb250cm9sLXBvaW50LXdlaWdodHMnOiAwLjUsXG4gICAgJ3NlZ21lbnQtd2VpZ2h0cyc6IDAuNSxcbiAgICAnc2VnbWVudC1kaXN0YW5jZXMnOiAyMCxcbiAgICAndGF4aS10dXJuJzogJzUwJScsXG4gICAgJ3RheGktdHVybi1taW4tZGlzdGFuY2UnOiAxMCxcbiAgICAndGF4aS1kaXJlY3Rpb24nOiAnYXV0bycsXG4gICAgJ2VkZ2UtZGlzdGFuY2VzJzogJ2ludGVyc2VjdGlvbicsXG4gICAgJ2N1cnZlLXN0eWxlJzogJ2hheXN0YWNrJyxcbiAgICAnaGF5c3RhY2stcmFkaXVzJzogMCxcbiAgICAnYXJyb3ctc2NhbGUnOiAxLFxuICAgICdsb29wLWRpcmVjdGlvbic6ICctNDVkZWcnLFxuICAgICdsb29wLXN3ZWVwJzogJy05MGRlZycsXG4gICAgJ3NvdXJjZS1kaXN0YW5jZS1mcm9tLW5vZGUnOiAwLFxuICAgICd0YXJnZXQtZGlzdGFuY2UtZnJvbS1ub2RlJzogMCxcbiAgICAnc291cmNlLWVuZHBvaW50JzogJ291dHNpZGUtdG8tbm9kZScsXG4gICAgJ3RhcmdldC1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLW5vZGUnLFxuICAgICdsaW5lLWRhc2gtcGF0dGVybic6IFs2LCAzXSxcbiAgICAnbGluZS1kYXNoLW9mZnNldCc6IDBcbiAgfSwgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHZhbHVlOiAnbm9uZSdcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdmFsdWU6ICcjOTk5J1xuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHZhbHVlOiAnZmlsbGVkJ1xuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIHN0eWZuJDYuYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHZhbCA9IHByb3AudmFsdWU7XG4gICAgICBjc3NbbmFtZV0gPSB2YWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzcztcbiAgfSwge30pKTtcbiAgdmFyIHBhcnNlZFByb3BzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcblxuICAgIGlmIChwcm9wLnBvaW50c1RvKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IHByb3AubmFtZTtcbiAgICB2YXIgdmFsID0gcmF3UHJvcHNbbmFtZV07XG4gICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbCk7XG4gICAgcGFyc2VkUHJvcHNbbmFtZV0gPSBwYXJzZWRQcm9wO1xuICB9XG5cbiAgX3AuZGVmYXVsdFByb3BlcnRpZXMgPSBwYXJzZWRQcm9wcztcbiAgcmV0dXJuIF9wLmRlZmF1bHRQcm9wZXJ0aWVzO1xufTtcblxuc3R5Zm4kNi5hZGREZWZhdWx0U3R5bGVzaGVldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zZWxlY3RvcignOnBhcmVudCcpLmNzcyh7XG4gICAgJ3NoYXBlJzogJ3JlY3RhbmdsZScsXG4gICAgJ3BhZGRpbmcnOiAxMCxcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZWVlJyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNjY2MnLFxuICAgICdib3JkZXItd2lkdGgnOiAxXG4gIH0pLnNlbGVjdG9yKCdlZGdlJykuY3NzKHtcbiAgICAnd2lkdGgnOiAzXG4gIH0pLnNlbGVjdG9yKCc6bG9vcCcpLmNzcyh7XG4gICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcidcbiAgfSkuc2VsZWN0b3IoJ2VkZ2U6Y29tcG91bmQnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1saW5lJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZSdcbiAgfSkuc2VsZWN0b3IoJzpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ2xpbmUtY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtc291cmNlLWFycm93LWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdtaWQtdGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMTY5RDknXG4gIH0pLnNlbGVjdG9yKCc6cGFyZW50OnNlbGVjdGVkJykuY3NzKHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjQ0NFMUY5JyxcbiAgICAnYm9yZGVyLWNvbG9yJzogJyNhZWM4ZTUnXG4gIH0pLnNlbGVjdG9yKCc6YWN0aXZlJykuY3NzKHtcbiAgICAnb3ZlcmxheS1jb2xvcic6ICdibGFjaycsXG4gICAgJ292ZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLjI1XG4gIH0pO1xuICB0aGlzLmRlZmF1bHRMZW5ndGggPSB0aGlzLmxlbmd0aDtcbn07XG5cbnZhciBzdHlmbiQ3ID0ge307IC8vIGEgY2FjaGluZyBsYXllciBmb3IgcHJvcGVydHkgcGFyc2luZ1xuXG5zdHlmbiQ3LnBhcnNlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzOyAvLyBmdW5jdGlvbiB2YWx1ZXMgY2FuJ3QgYmUgY2FjaGVkIGluIGFsbCBjYXNlcywgYW5kIHRoZXJlIGlzbid0IG11Y2ggYmVuZWZpdCBvZiBjYWNoaW5nIHRoZW0gYW55d2F5XG5cbiAgaWYgKGZuKHZhbHVlKSkge1xuICAgIHJldHVybiBzZWxmLnBhcnNlSW1wbFdhcm4obmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIH1cblxuICB2YXIgZmxhdEtleSA9IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJyB8fCBwcm9wSXNGbGF0ID09PSB0cnVlIHx8IHByb3BJc0ZsYXQgPT09IGZhbHNlIHx8IHByb3BJc0ZsYXQgPT0gbnVsbCA/ICdkb250Y2FyZScgOiBwcm9wSXNGbGF0O1xuICB2YXIgYnlwYXNzS2V5ID0gcHJvcElzQnlwYXNzID8gJ3QnIDogJ2YnO1xuICB2YXIgdmFsdWVLZXkgPSAnJyArIHZhbHVlO1xuICB2YXIgYXJnSGFzaCA9IGhhc2hTdHJpbmdzKG5hbWUsIHZhbHVlS2V5LCBieXBhc3NLZXksIGZsYXRLZXkpO1xuICB2YXIgcHJvcENhY2hlID0gc2VsZi5wcm9wQ2FjaGUgPSBzZWxmLnByb3BDYWNoZSB8fCBbXTtcbiAgdmFyIHJldDtcblxuICBpZiAoIShyZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0pKSB7XG4gICAgcmV0ID0gcHJvcENhY2hlW2FyZ0hhc2hdID0gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9IC8vIC0gYnlwYXNzZXMgY2FuJ3QgYmUgc2hhcmVkIGIvYyB0aGUgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgYW5pbWF0aW9ucyBvciBvdGhlcndpc2Ugb3ZlcnJpZGRlblxuICAvLyAtIG1hcHBpbmdzIGNhbid0IGJlIHNoYXJlZCBiL2MgbWFwcGluZ3MgYXJlIHBlci1lbGVtZW50XG5cblxuICBpZiAocHJvcElzQnlwYXNzIHx8IHByb3BJc0ZsYXQgPT09ICdtYXBwaW5nJykge1xuICAgIC8vIG5lZWQgYSBjb3B5IHNpbmNlIHByb3BzIGFyZSBtdXRhdGVkIGxhdGVyIGluIHRoZWlyIGxpZmVjeWNsZXNcbiAgICByZXQgPSBjb3B5KHJldCk7XG5cbiAgICBpZiAocmV0KSB7XG4gICAgICByZXQudmFsdWUgPSBjb3B5KHJldC52YWx1ZSk7IC8vIGJlY2F1c2UgaXQgY291bGQgYmUgYW4gYXJyYXksIGUuZy4gY29sb3VyXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbnN0eWZuJDcucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG5cbiAgaWYgKCFwcm9wICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICB3YXJuKFwiVGhlIHN0eWxlIHByb3BlcnR5IGBcIi5jb25jYXQobmFtZSwgXCI6IFwiKS5jb25jYXQodmFsdWUsIFwiYCBpcyBpbnZhbGlkXCIpKTtcbiAgfVxuXG4gIGlmIChwcm9wICYmIChwcm9wLm5hbWUgPT09ICd3aWR0aCcgfHwgcHJvcC5uYW1lID09PSAnaGVpZ2h0JykgJiYgdmFsdWUgPT09ICdsYWJlbCcpIHtcbiAgICB3YXJuKCdUaGUgc3R5bGUgdmFsdWUgb2YgYGxhYmVsYCBpcyBkZXByZWNhdGVkIGZvciBgJyArIHByb3AubmFtZSArICdgJyk7XG4gIH1cblxuICByZXR1cm4gcHJvcDtcbn07IC8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuXG5cbnN0eWZuJDcucGFyc2VJbXBsID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBuYW1lID0gY2FtZWwyZGFzaChuYW1lKTsgLy8gbWFrZSBzdXJlIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIGluIGRhc2ggZm9ybSAoZS5nLiAncHJvcGVydHktbmFtZScgbm90ICdwcm9wZXJ0eU5hbWUnKVxuXG4gIHZhciBwcm9wZXJ0eSA9IHNlbGYucHJvcGVydGllc1tuYW1lXTtcbiAgdmFyIHBhc3NlZFZhbHVlID0gdmFsdWU7XG4gIHZhciB0eXBlcyA9IHNlbGYudHlwZXM7XG5cbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuXG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBjYW4ndCBhc3NpZ24gdW5kZWZpbmVkXG4gIC8vIHRoZSBwcm9wZXJ0eSBtYXkgYmUgYW4gYWxpYXNcblxuXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cblxuICB2YXIgdmFsdWVJc1N0cmluZyA9IHN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAvLyB0cmltIHRoZSB2YWx1ZSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG5cbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gbm8gdHlwZSwgbm8gbHVja1xuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuXG5cbiAgaWYgKHByb3BJc0J5cGFzcyAmJiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgYnlwYXNzOiB0cnVlLFxuICAgICAgZGVsZXRlQnlwYXNzOiB0cnVlXG4gICAgfTtcbiAgfSAvLyBjaGVjayBpZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHVzZWQgYXMgYSBtYXBwZXJcblxuXG4gIGlmIChmbih2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnZm4nLFxuICAgICAgbWFwcGVkOiB0eXBlcy5mbixcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSAvLyBjaGVjayBpZiB2YWx1ZSBpcyBtYXBwZWRcblxuXG4gIHZhciBkYXRhLCBtYXBEYXRhO1xuXG4gIGlmICghdmFsdWVJc1N0cmluZyB8fCBwcm9wSXNGbGF0IHx8IHZhbHVlLmxlbmd0aCA8IDcgfHwgdmFsdWVbMV0gIT09ICdhJykgOyBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPj0gNyAmJiB2YWx1ZVswXSA9PT0gJ2QnICYmIChkYXRhID0gbmV3IFJlZ0V4cCh0eXBlcy5kYXRhLnJlZ2V4KS5leGVjKHZhbHVlKSkpIHtcbiAgICBpZiAocHJvcElzQnlwYXNzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBtYXBwZXJzIG5vdCBhbGxvd2VkIGluIGJ5cGFzc1xuXG5cbiAgICB2YXIgbWFwcGVkID0gdHlwZXMuZGF0YTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICBtYXBwZWQ6IG1hcHBlZCxcbiAgICAgIGZpZWxkOiBkYXRhWzFdLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+PSAxMCAmJiB2YWx1ZVswXSA9PT0gJ20nICYmIChtYXBEYXRhID0gbmV3IFJlZ0V4cCh0eXBlcy5tYXBEYXRhLnJlZ2V4KS5leGVjKHZhbHVlKSkpIHtcbiAgICBpZiAocHJvcElzQnlwYXNzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBtYXBwZXJzIG5vdCBhbGxvd2VkIGluIGJ5cGFzc1xuXG5cbiAgICBpZiAodHlwZS5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaW1wb3NzaWJsZSB0byBtYXAgdG8gbnVtXG5cblxuICAgIHZhciBfbWFwcGVkID0gdHlwZXMubWFwRGF0YTsgLy8gd2UgY2FuIG1hcCBvbmx5IGlmIHRoZSB0eXBlIGlzIGEgY29sb3VyIG9yIGEgbnVtYmVyXG5cbiAgICBpZiAoISh0eXBlLmNvbG9yIHx8IHR5cGUubnVtYmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU1pbiA9IHRoaXMucGFyc2UobmFtZSwgbWFwRGF0YVs0XSk7IC8vIHBhcnNlIHRvIHZhbGlkYXRlXG5cbiAgICBpZiAoIXZhbHVlTWluIHx8IHZhbHVlTWluLm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuXG4gICAgdmFyIHZhbHVlTWF4ID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzVdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcblxuICAgIGlmICghdmFsdWVNYXggfHwgdmFsdWVNYXgubWFwcGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBjYW4ndCBiZSBpbnZhbGlkIG9yIG1hcHBlZFxuICAgIC8vIGNoZWNrIGlmIHZhbHVlTWluIGFuZCB2YWx1ZU1heCBhcmUgdGhlIHNhbWVcblxuXG4gICAgaWYgKHZhbHVlTWluLnBmVmFsdWUgPT09IHZhbHVlTWF4LnBmVmFsdWUgfHwgdmFsdWVNaW4uc3RyVmFsdWUgPT09IHZhbHVlTWF4LnN0clZhbHVlKSB7XG4gICAgICB3YXJuKCdgJyArIG5hbWUgKyAnOiAnICsgdmFsdWUgKyAnYCBpcyBub3QgYSB2YWxpZCBtYXBwZXIgYmVjYXVzZSB0aGUgb3V0cHV0IHJhbmdlIGlzIHplcm87IGNvbnZlcnRpbmcgdG8gYCcgKyBuYW1lICsgJzogJyArIHZhbHVlTWluLnN0clZhbHVlICsgJ2AnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlTWluLnN0clZhbHVlKTsgLy8gY2FuJ3QgbWFrZSBtdWNoIG9mIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH0gZWxzZSBpZiAodHlwZS5jb2xvcikge1xuICAgICAgdmFyIGMxID0gdmFsdWVNaW4udmFsdWU7XG4gICAgICB2YXIgYzIgPSB2YWx1ZU1heC52YWx1ZTtcbiAgICAgIHZhciBzYW1lID0gYzFbMF0gPT09IGMyWzBdIC8vIHJlZFxuICAgICAgJiYgYzFbMV0gPT09IGMyWzFdIC8vIGdyZWVuXG4gICAgICAmJiBjMVsyXSA9PT0gYzJbMl0gLy8gYmx1ZVxuICAgICAgJiYgKCAvLyBvcHRpb25hbCBhbHBoYVxuICAgICAgYzFbM10gPT09IGMyWzNdIC8vIHNhbWUgYWxwaGEgb3V0cmlnaHRcbiAgICAgIHx8IChjMVszXSA9PSBudWxsIHx8IGMxWzNdID09PSAxKSAmJiAoIC8vIGZ1bGwgb3BhY2l0eSBmb3IgY29sb3VyIDE/XG4gICAgICBjMlszXSA9PSBudWxsIHx8IGMyWzNdID09PSAxKSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAyP1xuICAgICAgKTtcblxuICAgICAgaWYgKHNhbWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBjYW4ndCBtYWtlIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogbWFwRGF0YSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgbWFwcGVkOiBfbWFwcGVkLFxuICAgICAgZmllbGQ6IG1hcERhdGFbMV0sXG4gICAgICBmaWVsZE1pbjogcGFyc2VGbG9hdChtYXBEYXRhWzJdKSxcbiAgICAgIC8vIG1pbiAmIG1heCBhcmUgbnVtZXJpY1xuICAgICAgZmllbGRNYXg6IHBhcnNlRmxvYXQobWFwRGF0YVszXSksXG4gICAgICB2YWx1ZU1pbjogdmFsdWVNaW4udmFsdWUsXG4gICAgICB2YWx1ZU1heDogdmFsdWVNYXgudmFsdWUsXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH1cblxuICBpZiAodHlwZS5tdWx0aXBsZSAmJiBwcm9wSXNGbGF0ICE9PSAnbXVsdGlwbGUnKSB7XG4gICAgdmFyIHZhbHM7XG5cbiAgICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgICAgdmFscyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgfSBlbHNlIGlmIChhcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFscyA9IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgaWYgKHR5cGUuZXZlbk11bHRpcGxlICYmIHZhbHMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHZhbEFyciA9IFtdO1xuICAgIHZhciB1bml0c0FyciA9IFtdO1xuICAgIHZhciBwZlZhbEFyciA9IFtdO1xuICAgIHZhciBzdHJWYWwgPSAnJztcbiAgICB2YXIgaGFzRW51bSA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHNlbGYucGFyc2UobmFtZSwgdmFsc1tpXSwgcHJvcElzQnlwYXNzLCAnbXVsdGlwbGUnKTtcbiAgICAgIGhhc0VudW0gPSBoYXNFbnVtIHx8IHN0cmluZyhwLnZhbHVlKTtcbiAgICAgIHZhbEFyci5wdXNoKHAudmFsdWUpO1xuICAgICAgcGZWYWxBcnIucHVzaChwLnBmVmFsdWUgIT0gbnVsbCA/IHAucGZWYWx1ZSA6IHAudmFsdWUpO1xuICAgICAgdW5pdHNBcnIucHVzaChwLnVuaXRzKTtcbiAgICAgIHN0clZhbCArPSAoaSA+IDAgPyAnICcgOiAnJykgKyBwLnN0clZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlLnZhbGlkYXRlICYmICF0eXBlLnZhbGlkYXRlKHZhbEFyciwgdW5pdHNBcnIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZS5zaW5nbGVFbnVtICYmIGhhc0VudW0pIHtcbiAgICAgIGlmICh2YWxBcnIubGVuZ3RoID09PSAxICYmIHN0cmluZyh2YWxBcnJbMF0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsQXJyWzBdLFxuICAgICAgICAgIHN0clZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbEFycixcbiAgICAgIHBmVmFsdWU6IHBmVmFsQXJyLFxuICAgICAgc3RyVmFsdWU6IHN0clZhbCxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzLFxuICAgICAgdW5pdHM6IHVuaXRzQXJyXG4gICAgfTtcbiAgfSAvLyBzZXZlcmFsIHR5cGVzIGFsc28gYWxsb3cgZW51bXNcblxuXG4gIHZhciBjaGVja0VudW1zID0gZnVuY3Rpb24gY2hlY2tFbnVtcygpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdHlwZS5lbnVtcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlbiA9IHR5cGUuZW51bXNbX2ldO1xuXG4gICAgICBpZiAoZW4gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTsgLy8gY2hlY2sgdGhlIHR5cGUgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0XG5cblxuICBpZiAodHlwZS5udW1iZXIpIHtcbiAgICB2YXIgdW5pdHM7XG4gICAgdmFyIGltcGxpY2l0VW5pdHMgPSAncHgnOyAvLyBub3Qgc2V0ID0+IHB4XG5cbiAgICBpZiAodHlwZS51bml0cykge1xuICAgICAgLy8gdXNlIHNwZWNpZmllZCB1bml0cyBpZiBzZXRcbiAgICAgIHVuaXRzID0gdHlwZS51bml0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZS5pbXBsaWNpdFVuaXRzKSB7XG4gICAgICBpbXBsaWNpdFVuaXRzID0gdHlwZS5pbXBsaWNpdFVuaXRzO1xuICAgIH1cblxuICAgIGlmICghdHlwZS51bml0bGVzcykge1xuICAgICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgICAgdmFyIHVuaXRzUmVnZXggPSAncHh8ZW0nICsgKHR5cGUuYWxsb3dQZXJjZW50ID8gJ3xcXFxcJScgOiAnJyk7XG5cbiAgICAgICAgaWYgKHVuaXRzKSB7XG4gICAgICAgICAgdW5pdHNSZWdleCA9IHVuaXRzO1xuICAgICAgICB9IC8vIG9ubHkgYWxsb3cgZXhwbGljaXQgdW5pdHMgaWYgc28gc2V0XG5cblxuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaCgnXignICsgbnVtYmVyJDEgKyAnKSgnICsgdW5pdHNSZWdleCArICcpPycgKyAnJCcpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgICAgdW5pdHMgPSBtYXRjaFsyXSB8fCBpbXBsaWNpdFVuaXRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF1bml0cyB8fCB0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBpbXBsaWNpdFVuaXRzOyAvLyBpbXBsaWNpdGx5IHB4IGlmIHVuc3BlY2lmaWVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsgLy8gaWYgbm90IGEgbnVtYmVyIGFuZCBlbnVtcyBub3QgYWxsb3dlZCwgdGhlbiB0aGUgdmFsdWUgaXMgaW52YWxpZFxuXG4gICAgaWYgKGlzTmFOKHZhbHVlKSAmJiB0eXBlLmVudW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcblxuXG4gICAgaWYgKGlzTmFOKHZhbHVlKSAmJiB0eXBlLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gcGFzc2VkVmFsdWU7XG4gICAgICByZXR1cm4gY2hlY2tFbnVtcygpO1xuICAgIH0gLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG5cblxuICAgIGlmICh0eXBlLmludGVnZXIgJiYgIWludGVnZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuXG5cbiAgICBpZiAodHlwZS5taW4gIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPCB0eXBlLm1pbiB8fCB0eXBlLnN0cmljdE1pbiAmJiB2YWx1ZSA9PT0gdHlwZS5taW4pIHx8IHR5cGUubWF4ICE9PSB1bmRlZmluZWQgJiYgKHZhbHVlID4gdHlwZS5tYXggfHwgdHlwZS5zdHJpY3RNYXggJiYgdmFsdWUgPT09IHR5cGUubWF4KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9OyAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcGl4ZWxzXG5cbiAgICBpZiAodHlwZS51bml0bGVzcyB8fCB1bml0cyAhPT0gJ3B4JyAmJiB1bml0cyAhPT0gJ2VtJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnBmVmFsdWUgPSB1bml0cyA9PT0gJ3B4JyB8fCAhdW5pdHMgPyB2YWx1ZSA6IHRoaXMuZ2V0RW1TaXplSW5QaXhlbHMoKSAqIHZhbHVlO1xuICAgIH0gLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG5cblxuICAgIGlmICh1bml0cyA9PT0gJ21zJyB8fCB1bml0cyA9PT0gJ3MnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAnbXMnID8gdmFsdWUgOiAxMDAwICogdmFsdWU7XG4gICAgfSAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG5cblxuICAgIGlmICh1bml0cyA9PT0gJ2RlZycgfHwgdW5pdHMgPT09ICdyYWQnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncmFkJyA/IHZhbHVlIDogZGVnMnJhZCh2YWx1ZSk7XG4gICAgfSAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuXG5cbiAgICBpZiAodW5pdHMgPT09ICclJykge1xuICAgICAgcmV0LnBmVmFsdWUgPSB2YWx1ZSAvIDEwMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuXG4gICAgaWYgKHByb3BzU3RyID09PSAnbm9uZScpIDsgZWxzZSB7XG4gICAgICAvLyBnbyBvdmVyIGVhY2ggcHJvcFxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcblxuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcHJvcHNTcGxpdC5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BzU3BsaXRbX2kyXS50cmltKCk7XG5cbiAgICAgICAgaWYgKHNlbGYucHJvcGVydGllc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuKCdgJyArIHByb3BOYW1lICsgJ2AgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgbmFtZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogcHJvcHMsXG4gICAgICBzdHJWYWx1ZTogcHJvcHMubGVuZ3RoID09PSAwID8gJ25vbmUnIDogcHJvcHMuam9pbignICcpLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuY29sb3IpIHtcbiAgICB2YXIgdHVwbGUgPSBjb2xvcjJ0dXBsZSh2YWx1ZSk7XG5cbiAgICBpZiAoIXR1cGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG5cbiAgICAgIGlmIChlbnVtUHJvcCkge1xuICAgICAgICByZXR1cm4gZW51bVByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZ2V4ZXMgPSB0eXBlLnJlZ2V4ZXMgPyB0eXBlLnJlZ2V4ZXMgOiBbdHlwZS5yZWdleF07XG5cbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG5cbiAgICAgIHZhciBtID0gcmVnZXguZXhlYyh2YWx1ZSk7XG5cbiAgICAgIGlmIChtKSB7XG4gICAgICAgIC8vIHJlZ2V4IG1hdGNoZXNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB0eXBlLnNpbmdsZVJlZ2V4TWF0Y2hWYWx1ZSA/IG1bMV0gOiBtLFxuICAgICAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBTdHlsZSA9IGZ1bmN0aW9uIFN0eWxlKGN5KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlKGN5KTtcbiAgfVxuXG4gIGlmICghY29yZShjeSkpIHtcbiAgICBlcnJvcignQSBzdHlsZSBtdXN0IGhhdmUgYSBjb3JlIHJlZmVyZW5jZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY3k6IGN5LFxuICAgIGNvcmVTdHlsZToge31cbiAgfTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnJlc2V0VG9EZWZhdWx0KCk7XG59O1xuXG52YXIgc3R5Zm4kOCA9IFN0eWxlLnByb3RvdHlwZTtcblxuc3R5Zm4kOC5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZSc7XG59OyAvLyByZW1vdmUgYWxsIGNvbnRleHRzXG5cblxuc3R5Zm4kOC5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciBlbGVzID0gY3kuZWxlbWVudHMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW2ldID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBfcC5jb250ZXh0U3R5bGVzID0ge307XG4gIF9wLnByb3BEaWZmcyA9IHt9O1xuICB0aGlzLmNsZWFuRWxlbWVudHMoZWxlcywgdHJ1ZSk7XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZV9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIGVsZV9wLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIGVsZV9wLmFwcGxpZWRJbml0U3R5bGUgPSBmYWxzZTtcbiAgfSk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuc3R5Zm4kOC5yZXNldFRvRGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jbGVhcigpO1xuICB0aGlzLmFkZERlZmF1bHRTdHlsZXNoZWV0KCk7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gYnVpbGRzIGEgc3R5bGUgb2JqZWN0IGZvciB0aGUgJ2NvcmUnIHNlbGVjdG9yXG5cblxuc3R5Zm4kOC5jb3JlID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmNvcmVTdHlsZVtwcm9wTmFtZV0gfHwgdGhpcy5nZXREZWZhdWx0UHJvcGVydHkocHJvcE5hbWUpO1xufTsgLy8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZnJvbSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIHN0cmluZyBhbmQgc3dpdGNoIHRvIHRoYXQgY29udGV4dFxuXG5cbnN0eWZuJDguc2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JTdHIpIHtcbiAgLy8gJ2NvcmUnIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkIGEgc2VsZWN0b3JcbiAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JTdHIgPT09ICdjb3JlJyA/IG51bGwgOiBuZXcgU2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7IC8vIG5ldyBjb250ZXh0IG1lYW5zIG5ldyBpbmRleFxuXG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdLFxuICAgIG1hcHBlZFByb3BlcnRpZXM6IFtdLFxuICAgIGluZGV4OiBpXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTsgLy8gYWRkIG9uZSBvciBtYW55IGNzcyBydWxlcyB0byB0aGUgY3VycmVudCBjb250ZXh0XG5cblxuc3R5Zm4kOC5jc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIG1hcCA9IGFyZ3NbMF07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW3Byb3AubmFtZV07XG5cbiAgICAgIGlmIChtYXBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXBWYWwgPSBtYXBbZGFzaDJjYW1lbChwcm9wLm5hbWUpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hcFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3NzUnVsZShwcm9wLm5hbWUsIG1hcFZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgdGhpcy5jc3NSdWxlKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICB9IC8vIGRvIG5vdGhpbmcgaWYgYXJncyBhcmUgaW52YWxpZFxuXG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbiQ4LnN0eWxlID0gc3R5Zm4kOC5jc3M7IC8vIGFkZCBhIHNpbmdsZSBjc3MgcnVsZSB0byB0aGUgY3VycmVudCBjb250ZXh0XG5cbnN0eWZuJDguY3NzUnVsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAvLyBuYW1lLXZhbHVlIHBhaXJcbiAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSk7IC8vIGFkZCBwcm9wZXJ0eSB0byBjdXJyZW50IGNvbnRleHQgaWYgdmFsaWRcblxuICBpZiAocHJvcGVydHkpIHtcbiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7IC8vIGFsbG93IGFjY2VzcyBieSBuYW1lIGFzIHdlbGxcblxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9waWUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1BpZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnR5Lm1hcHBlZCkge1xuICAgICAgdGhpc1tpXS5tYXBwZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgIH0gLy8gYWRkIHRvIGNvcmUgc3R5bGUgaWYgbmVjZXNzYXJ5XG5cblxuICAgIHZhciBjdXJyZW50U2VsZWN0b3JJc0NvcmUgPSAhdGhpc1tpXS5zZWxlY3RvcjtcblxuICAgIGlmIChjdXJyZW50U2VsZWN0b3JJc0NvcmUpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuY29yZVN0eWxlW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbiQ4LmFwcGVuZCA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICBpZiAoc3R5bGVzaGVldChzdHlsZSkpIHtcbiAgICBzdHlsZS5hcHBlbmRUb1N0eWxlKHRoaXMpO1xuICB9IGVsc2UgaWYgKGFycmF5KHN0eWxlKSkge1xuICAgIHRoaXMuYXBwZW5kRnJvbUpzb24oc3R5bGUpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhzdHlsZSkpIHtcbiAgICB0aGlzLmFwcGVuZEZyb21TdHJpbmcoc3R5bGUpO1xuICB9IC8vIHlvdSBwcm9iYWJseSB3b3VsZG4ndCB3YW50IHRvIGFwcGVuZCBhIFN0eWxlLCBzaW5jZSB5b3UnZCBkdXBsaWNhdGUgdGhlIGRlZmF1bHQgcGFydHNcblxuXG4gIHJldHVybiB0aGlzO1xufTsgLy8gc3RhdGljIGZ1bmN0aW9uXG5cblxuU3R5bGUuZnJvbUpzb24gPSBmdW5jdGlvbiAoY3ksIGpzb24pIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgc3R5bGUuZnJvbUpzb24oanNvbik7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cblN0eWxlLmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoY3ksIHN0cmluZykge1xuICByZXR1cm4gbmV3IFN0eWxlKGN5KS5mcm9tU3RyaW5nKHN0cmluZyk7XG59O1xuXG5bc3R5Zm4sIHN0eWZuJDEsIHN0eWZuJDIsIHN0eWZuJDMsIHN0eWZuJDQsIHN0eWZuJDUsIHN0eWZuJDYsIHN0eWZuJDddLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChzdHlmbiQ4LCBwcm9wcyk7XG59KTtcblN0eWxlLnR5cGVzID0gc3R5Zm4kOC50eXBlcztcblN0eWxlLnByb3BlcnRpZXMgPSBzdHlmbiQ4LnByb3BlcnRpZXM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwcyA9IHN0eWZuJDgucHJvcGVydHlHcm91cHM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwTmFtZXMgPSBzdHlmbiQ4LnByb3BlcnR5R3JvdXBOYW1lcztcblN0eWxlLnByb3BlcnR5R3JvdXBLZXlzID0gc3R5Zm4kOC5wcm9wZXJ0eUdyb3VwS2V5cztcblxudmFyIGNvcmVmbiQ3ID0ge1xuICBzdHlsZTogZnVuY3Rpb24gc3R5bGUobmV3U3R5bGUpIHtcbiAgICBpZiAobmV3U3R5bGUpIHtcbiAgICAgIHZhciBzID0gdGhpcy5zZXRTdHlsZShuZXdTdHlsZSk7XG4gICAgICBzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlO1xuICB9LFxuICBzZXRTdHlsZTogZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKHN0eWxlc2hlZXQoc3R5bGUpKSB7XG4gICAgICBfcC5zdHlsZSA9IHN0eWxlLmdlbmVyYXRlU3R5bGUodGhpcyk7XG4gICAgfSBlbHNlIGlmIChhcnJheShzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUuZnJvbUpzb24odGhpcywgc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBTdHlsZS5mcm9tU3RyaW5nKHRoaXMsIHN0eWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3Auc3R5bGUgPSBTdHlsZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3Auc3R5bGU7XG4gIH1cbn07XG5cbnZhciBkZWZhdWx0U2VsZWN0aW9uVHlwZSA9ICdzaW5nbGUnO1xudmFyIGNvcmVmbiQ4ID0ge1xuICBhdXRvbG9jazogZnVuY3Rpb24gYXV0b2xvY2soYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b2xvY2sgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvbG9jaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgYXV0b3VuZ3JhYmlmeTogZnVuY3Rpb24gYXV0b3VuZ3JhYmlmeShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3VuZ3JhYmlmeTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgYXV0b3Vuc2VsZWN0aWZ5OiBmdW5jdGlvbiBhdXRvdW5zZWxlY3RpZnkoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBzZWxlY3Rpb25UeXBlOiBmdW5jdGlvbiBzZWxlY3Rpb25UeXBlKHNlbFR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuXG4gICAgaWYgKF9wLnNlbGVjdGlvblR5cGUgPT0gbnVsbCkge1xuICAgICAgX3Auc2VsZWN0aW9uVHlwZSA9IGRlZmF1bHRTZWxlY3Rpb25UeXBlO1xuICAgIH1cblxuICAgIGlmIChzZWxUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChzZWxUeXBlID09PSAnYWRkaXRpdmUnIHx8IHNlbFR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIF9wLnNlbGVjdGlvblR5cGUgPSBzZWxUeXBlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Auc2VsZWN0aW9uVHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGFubmluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgem9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIHVzZXJab29taW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogZnVuY3Rpb24gYm94U2VsZWN0aW9uRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuOiBmdW5jdGlvbiBwYW4oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcblxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gLnBhbigpXG4gICAgICAgIHJldHVybiBwYW47XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKHN0cmluZyhhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIC5wYW4oJ3gnKVxuICAgICAgICAgIGRpbSA9IGFyZ3NbMF07XG4gICAgICAgICAgcmV0dXJuIHBhbltkaW1dO1xuICAgICAgICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbih7IHg6IDAsIHk6IDEwMCB9KVxuICAgICAgICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuXG4gICAgICAgICAgaWYgKG51bWJlcih4KSkge1xuICAgICAgICAgICAgcGFuLnggPSB4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChudW1iZXIoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBkaW0gPSBhcmdzWzBdO1xuICAgICAgICB2YWwgPSBhcmdzWzFdO1xuXG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlcih2YWwpKSB7XG4gICAgICAgICAgcGFuW2RpbV0gPSB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIGludmFsaWRcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcGFuQnk6IGZ1bmN0aW9uIHBhbkJ5KGFyZzAsIGFyZzEpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIGRpbSwgdmFsLCBkaW1zLCB4LCB5O1xuXG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChwbGFpbk9iamVjdChhcmcwKSkge1xuICAgICAgICAgIC8vIC5wYW5CeSh7IHg6IDAsIHk6IDEwMCB9KVxuICAgICAgICAgIGRpbXMgPSBhcmdzWzBdO1xuICAgICAgICAgIHggPSBkaW1zLng7XG4gICAgICAgICAgeSA9IGRpbXMueTtcblxuICAgICAgICAgIGlmIChudW1iZXIoeCkpIHtcbiAgICAgICAgICAgIHBhbi54ICs9IHg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG51bWJlcih5KSkge1xuICAgICAgICAgICAgcGFuLnkgKz0geTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbkJ5KCd4JywgMTAwKVxuICAgICAgICBkaW0gPSBhcmcwO1xuICAgICAgICB2YWwgPSBhcmcxO1xuXG4gICAgICAgIGlmICgoZGltID09PSAneCcgfHwgZGltID09PSAneScpICYmIG51bWJlcih2YWwpKSB7XG4gICAgICAgICAgcGFuW2RpbV0gKz0gdmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpbnZhbGlkXG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGZpdDogZnVuY3Rpb24gZml0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgdmFyIHZpZXdwb3J0U3RhdGUgPSB0aGlzLmdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKTtcblxuICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgICAgX3Auem9vbSA9IHZpZXdwb3J0U3RhdGUuem9vbTtcbiAgICAgIF9wLnBhbiA9IHZpZXdwb3J0U3RhdGUucGFuO1xuICAgICAgdGhpcy5lbWl0KCdwYW4gem9vbSB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGdldEZpdFZpZXdwb3J0OiBmdW5jdGlvbiBnZXRGaXRWaWV3cG9ydChlbGVtZW50cywgcGFkZGluZykge1xuICAgIGlmIChudW1iZXIoZWxlbWVudHMpICYmIHBhZGRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZWxlbWVudHMgaXMgb3B0aW9uYWxcbiAgICAgIHBhZGRpbmcgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBiYjtcblxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHRoaXMuJChzZWwpO1xuICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3goZWxlbWVudHMpKSB7XG4gICAgICAvLyBhc3N1bWUgYmJcbiAgICAgIHZhciBiYmUgPSBlbGVtZW50cztcbiAgICAgIGJiID0ge1xuICAgICAgICB4MTogYmJlLngxLFxuICAgICAgICB5MTogYmJlLnkxLFxuICAgICAgICB4MjogYmJlLngyLFxuICAgICAgICB5MjogYmJlLnkyXG4gICAgICB9O1xuICAgICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgICB9IGVsc2UgaWYgKCFlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSkge1xuICAgICAgZWxlbWVudHMgPSB0aGlzLm11dGFibGVFbGVtZW50cygpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSAmJiBlbGVtZW50cy5lbXB0eSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBjYW4ndCBmaXQgdG8gbm90aGluZ1xuXG5cbiAgICBiYiA9IGJiIHx8IGVsZW1lbnRzLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIHcgPSB0aGlzLndpZHRoKCk7XG4gICAgdmFyIGggPSB0aGlzLmhlaWdodCgpO1xuICAgIHZhciB6b29tO1xuICAgIHBhZGRpbmcgPSBudW1iZXIocGFkZGluZykgPyBwYWRkaW5nIDogMDtcblxuICAgIGlmICghaXNOYU4odykgJiYgIWlzTmFOKGgpICYmIHcgPiAwICYmIGggPiAwICYmICFpc05hTihiYi53KSAmJiAhaXNOYU4oYmIuaCkgJiYgYmIudyA+IDAgJiYgYmIuaCA+IDApIHtcbiAgICAgIHpvb20gPSBNYXRoLm1pbigodyAtIDIgKiBwYWRkaW5nKSAvIGJiLncsIChoIC0gMiAqIHBhZGRpbmcpIC8gYmIuaCk7IC8vIGNyb3Agem9vbVxuXG4gICAgICB6b29tID0gem9vbSA+IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA/IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA6IHpvb207XG4gICAgICB6b29tID0gem9vbSA8IHRoaXMuX3ByaXZhdGUubWluWm9vbSA/IHRoaXMuX3ByaXZhdGUubWluWm9vbSA6IHpvb207XG4gICAgICB2YXIgcGFuID0ge1xuICAgICAgICAvLyBub3cgcGFuIHRvIG1pZGRsZVxuICAgICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgICAgeTogKGggLSB6b29tICogKGJiLnkxICsgYmIueTIpKSAvIDJcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IHBhblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHpvb21SYW5nZTogZnVuY3Rpb24gem9vbVJhbmdlKG1pbiwgbWF4KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIGlmIChtYXggPT0gbnVsbCkge1xuICAgICAgdmFyIG9wdHMgPSBtaW47XG4gICAgICBtaW4gPSBvcHRzLm1pbjtcbiAgICAgIG1heCA9IG9wdHMubWF4O1xuICAgIH1cblxuICAgIGlmIChudW1iZXIobWluKSAmJiBudW1iZXIobWF4KSAmJiBtaW4gPD0gbWF4KSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgICAgX3AubWF4Wm9vbSA9IG1heDtcbiAgICB9IGVsc2UgaWYgKG51bWJlcihtaW4pICYmIG1heCA9PT0gdW5kZWZpbmVkICYmIG1pbiA8PSBfcC5tYXhab29tKSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyKG1heCkgJiYgbWluID09PSB1bmRlZmluZWQgJiYgbWF4ID49IF9wLm1pblpvb20pIHtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1pblpvb206IGZ1bmN0aW9uIG1pblpvb20oem9vbSkge1xuICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLm1pblpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnpvb21SYW5nZSh7XG4gICAgICAgIG1pbjogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBtYXhab29tOiBmdW5jdGlvbiBtYXhab29tKHpvb20pIHtcbiAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXhab29tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy56b29tUmFuZ2Uoe1xuICAgICAgICBtYXg6IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZ2V0Wm9vbWVkVmlld3BvcnQ6IGZ1bmN0aW9uIGdldFpvb21lZFZpZXdwb3J0KHBhcmFtcykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnJlbnRQYW4gPSBfcC5wYW47XG4gICAgdmFyIGN1cnJlbnRab29tID0gX3Auem9vbTtcbiAgICB2YXIgcG9zOyAvLyBpbiByZW5kZXJlZCBweFxuXG4gICAgdmFyIHpvb207XG4gICAgdmFyIGJhaWwgPSBmYWxzZTtcblxuICAgIGlmICghX3Auem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIC8vIHpvb21pbmcgZGlzYWJsZWRcbiAgICAgIGJhaWwgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChudW1iZXIocGFyYW1zKSkge1xuICAgICAgLy8gdGhlbiBzZXQgdGhlIHpvb21cbiAgICAgIHpvb20gPSBwYXJhbXM7XG4gICAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChwYXJhbXMpKSB7XG4gICAgICAvLyB0aGVuIHpvb20gYWJvdXQgYSBwb2ludFxuICAgICAgem9vbSA9IHBhcmFtcy5sZXZlbDtcblxuICAgICAgaWYgKHBhcmFtcy5wb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHBhcmFtcy5wb3NpdGlvbiwgY3VycmVudFpvb20sIGN1cnJlbnRQYW4pO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zICE9IG51bGwgJiYgIV9wLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgIC8vIHBhbm5pbmcgZGlzYWJsZWRcbiAgICAgICAgYmFpbCA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBjcm9wIHpvb21cblxuXG4gICAgem9vbSA9IHpvb20gPiBfcC5tYXhab29tID8gX3AubWF4Wm9vbSA6IHpvb207XG4gICAgem9vbSA9IHpvb20gPCBfcC5taW5ab29tID8gX3AubWluWm9vbSA6IHpvb207IC8vIGNhbid0IHpvb20gd2l0aCBpbnZhbGlkIHBhcmFtc1xuXG4gICAgaWYgKGJhaWwgfHwgIW51bWJlcih6b29tKSB8fCB6b29tID09PSBjdXJyZW50Wm9vbSB8fCBwb3MgIT0gbnVsbCAmJiAoIW51bWJlcihwb3MueCkgfHwgIW51bWJlcihwb3MueSkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocG9zICE9IG51bGwpIHtcbiAgICAgIC8vIHNldCB6b29tIGFib3V0IHBvc2l0aW9uXG4gICAgICB2YXIgcGFuMSA9IGN1cnJlbnRQYW47XG4gICAgICB2YXIgem9vbTEgPSBjdXJyZW50Wm9vbTtcbiAgICAgIHZhciB6b29tMiA9IHpvb207XG4gICAgICB2YXIgcGFuMiA9IHtcbiAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAocG9zLnggLSBwYW4xLngpICsgcG9zLngsXG4gICAgICAgIHk6IC16b29tMiAvIHpvb20xICogKHBvcy55IC0gcGFuMS55KSArIHBvcy55XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IHRydWUsXG4gICAgICAgIHpvb206IHpvb20yLFxuICAgICAgICBwYW46IHBhbjJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3Qgc2V0IHRoZSB6b29tXG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tZWQ6IHRydWUsXG4gICAgICAgIHBhbm5lZDogZmFsc2UsXG4gICAgICAgIHpvb206IHpvb20sXG4gICAgICAgIHBhbjogY3VycmVudFBhblxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIHpvb206IGZ1bmN0aW9uIHpvb20ocGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBnZXRcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNldFxuICAgICAgdmFyIHZwID0gdGhpcy5nZXRab29tZWRWaWV3cG9ydChwYXJhbXMpO1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgICAgaWYgKHZwID09IG51bGwgfHwgIXZwLnpvb21lZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgX3Auem9vbSA9IHZwLnpvb207XG5cbiAgICAgIGlmICh2cC5wYW5uZWQpIHtcbiAgICAgICAgX3AucGFuLnggPSB2cC5wYW4ueDtcbiAgICAgICAgX3AucGFuLnkgPSB2cC5wYW4ueTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbWl0KCd6b29tJyArICh2cC5wYW5uZWQgPyAnIHBhbicgOiAnJykgKyAnIHZpZXdwb3J0Jyk7XG4gICAgICB0aGlzLm5vdGlmeSgndmlld3BvcnQnKTtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICAgIH1cbiAgfSxcbiAgdmlld3BvcnQ6IGZ1bmN0aW9uIHZpZXdwb3J0KG9wdHMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciB6b29tRGVmZCA9IHRydWU7XG4gICAgdmFyIHBhbkRlZmQgPSB0cnVlO1xuICAgIHZhciBldmVudHMgPSBbXTsgLy8gdG8gdHJpZ2dlclxuXG4gICAgdmFyIHpvb21GYWlsZWQgPSBmYWxzZTtcbiAgICB2YXIgcGFuRmFpbGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICghbnVtYmVyKG9wdHMuem9vbSkpIHtcbiAgICAgIHpvb21EZWZkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFwbGFpbk9iamVjdChvcHRzLnBhbikpIHtcbiAgICAgIHBhbkRlZmQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXpvb21EZWZkICYmICFwYW5EZWZkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoem9vbURlZmQpIHtcbiAgICAgIHZhciB6ID0gb3B0cy56b29tO1xuXG4gICAgICBpZiAoeiA8IF9wLm1pblpvb20gfHwgeiA+IF9wLm1heFpvb20gfHwgIV9wLnpvb21pbmdFbmFibGVkKSB7XG4gICAgICAgIHpvb21GYWlsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Auem9vbSA9IHo7XG4gICAgICAgIGV2ZW50cy5wdXNoKCd6b29tJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhbkRlZmQgJiYgKCF6b29tRmFpbGVkIHx8ICFvcHRzLmNhbmNlbE9uRmFpbGVkWm9vbSkgJiYgX3AucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHZhciBwID0gb3B0cy5wYW47XG5cbiAgICAgIGlmIChudW1iZXIocC54KSkge1xuICAgICAgICBfcC5wYW4ueCA9IHAueDtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChudW1iZXIocC55KSkge1xuICAgICAgICBfcC5wYW4ueSA9IHAueTtcbiAgICAgICAgcGFuRmFpbGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFuRmFpbGVkKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKCdwYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGV2ZW50cy5wdXNoKCd2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5lbWl0KGV2ZW50cy5qb2luKCcgJykpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGNlbnRlcjogZnVuY3Rpb24gY2VudGVyKGVsZW1lbnRzKSB7XG4gICAgdmFyIHBhbiA9IHRoaXMuZ2V0Q2VudGVyUGFuKGVsZW1lbnRzKTtcblxuICAgIGlmIChwYW4pIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUucGFuID0gcGFuO1xuICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuICBnZXRDZW50ZXJQYW46IGZ1bmN0aW9uIGdldENlbnRlclBhbihlbGVtZW50cywgem9vbSkge1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY2FuJ3QgY2VudHJlIHBhbiB0byBub3RoaW5nXG5cblxuICAgIHZhciBiYiA9IGVsZW1lbnRzLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIHcgPSB0aGlzLndpZHRoKCk7XG4gICAgdmFyIGggPSB0aGlzLmhlaWdodCgpO1xuICAgIHpvb20gPSB6b29tID09PSB1bmRlZmluZWQgPyB0aGlzLl9wcml2YXRlLnpvb20gOiB6b29tO1xuICAgIHZhciBwYW4gPSB7XG4gICAgICAvLyBtaWRkbGVcbiAgICAgIHg6ICh3IC0gem9vbSAqIChiYi54MSArIGJiLngyKSkgLyAyLFxuICAgICAgeTogKGggLSB6b29tICogKGJiLnkxICsgYmIueTIpKSAvIDJcbiAgICB9O1xuICAgIHJldHVybiBwYW47XG4gIH0sXG4gIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgfHwgIXRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQoe1xuICAgICAgcGFuOiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB6b29tOiAxXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG4gIGludmFsaWRhdGVTaXplOiBmdW5jdGlvbiBpbnZhbGlkYXRlU2l6ZSgpIHtcbiAgICB0aGlzLl9wcml2YXRlLnNpemVDYWNoZSA9IG51bGw7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgY29udGFpbmVyID0gX3AuY29udGFpbmVyO1xuICAgIHJldHVybiBfcC5zaXplQ2FjaGUgPSBfcC5zaXplQ2FjaGUgfHwgKGNvbnRhaW5lciA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHdpbmRvdyQxLmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcblxuICAgICAgdmFyIHZhbCA9IGZ1bmN0aW9uIHZhbChuYW1lKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHZhbCgncGFkZGluZy1sZWZ0JykgLSB2YWwoJ3BhZGRpbmctcmlnaHQnKSxcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdmFsKCdwYWRkaW5nLXRvcCcpIC0gdmFsKCdwYWRkaW5nLWJvdHRvbScpXG4gICAgICB9O1xuICAgIH0oKSA6IHtcbiAgICAgIC8vIGZhbGxiYWNrIGlmIG5vIGNvbnRhaW5lciAobm90IDAgYi9jIGNhbiBiZSB1c2VkIGZvciBkaXZpZGluZyBldGMpXG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMVxuICAgIH0pO1xuICB9LFxuICB3aWR0aDogZnVuY3Rpb24gd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLndpZHRoO1xuICB9LFxuICBoZWlnaHQ6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplKCkuaGVpZ2h0O1xuICB9LFxuICBleHRlbnQ6IGZ1bmN0aW9uIGV4dGVudCgpIHtcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIHpvb20gPSB0aGlzLl9wcml2YXRlLnpvb207XG4gICAgdmFyIHJiID0gdGhpcy5yZW5kZXJlZEV4dGVudCgpO1xuICAgIHZhciBiID0ge1xuICAgICAgeDE6IChyYi54MSAtIHBhbi54KSAvIHpvb20sXG4gICAgICB4MjogKHJiLngyIC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHkxOiAocmIueTEgLSBwYW4ueSkgLyB6b29tLFxuICAgICAgeTI6IChyYi55MiAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICAgIGIudyA9IGIueDIgLSBiLngxO1xuICAgIGIuaCA9IGIueTIgLSBiLnkxO1xuICAgIHJldHVybiBiO1xuICB9LFxuICByZW5kZXJlZEV4dGVudDogZnVuY3Rpb24gcmVuZGVyZWRFeHRlbnQoKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4MTogMCxcbiAgICAgIHkxOiAwLFxuICAgICAgeDI6IHdpZHRoLFxuICAgICAgeTI6IGhlaWdodCxcbiAgICAgIHc6IHdpZHRoLFxuICAgICAgaDogaGVpZ2h0XG4gICAgfTtcbiAgfVxufTsgLy8gYWxpYXNlc1xuXG5jb3JlZm4kOC5jZW50cmUgPSBjb3JlZm4kOC5jZW50ZXI7IC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbmNvcmVmbiQ4LmF1dG9sb2NrTm9kZXMgPSBjb3JlZm4kOC5hdXRvbG9jaztcbmNvcmVmbiQ4LmF1dG91bmdyYWJpZnlOb2RlcyA9IGNvcmVmbiQ4LmF1dG91bmdyYWJpZnk7XG5cbnZhciBmbiQ2ID0ge1xuICBkYXRhOiBkZWZpbmUkMy5kYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlRGF0YTogZGVmaW5lJDMucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZSQzLmRhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgYmluZGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlXG4gIH0pLFxuICByZW1vdmVTY3JhdGNoOiBkZWZpbmUkMy5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGV2ZW50OiAnc2NyYXRjaCcsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZVxuICB9KVxufTsgLy8gYWxpYXNlc1xuXG5mbiQ2LmF0dHIgPSBmbiQ2LmRhdGE7XG5mbiQ2LnJlbW92ZUF0dHIgPSBmbiQ2LnJlbW92ZURhdGE7XG5cbnZhciBDb3JlID0gZnVuY3Rpb24gQ29yZShvcHRzKSB7XG4gIHZhciBjeSA9IHRoaXM7XG4gIG9wdHMgPSBleHRlbmQoe30sIG9wdHMpO1xuICB2YXIgY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7IC8vIGFsbG93IGZvciBwYXNzaW5nIGEgd3JhcHBlZCBqcXVlcnkgb2JqZWN0XG4gIC8vIGUuZy4gY3l0b3NjYXBlKHsgY29udGFpbmVyOiAkKCcjY3knKSB9KVxuXG4gIGlmIChjb250YWluZXIgJiYgIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgfVxuXG4gIHZhciByZWcgPSBjb250YWluZXIgPyBjb250YWluZXIuX2N5cmVnIDogbnVsbDsgLy8gZS5nLiBhbHJlYWR5IHJlZ2lzdGVyZWQgc29tZSBpbmZvIChlLmcuIHJlYWRpZXMpIHZpYSBqcXVlcnlcblxuICByZWcgPSByZWcgfHwge307XG5cbiAgaWYgKHJlZyAmJiByZWcuY3kpIHtcbiAgICByZWcuY3kuZGVzdHJveSgpO1xuICAgIHJlZyA9IHt9OyAvLyBvbGQgaW5zdGFuY2UgPT4gcmVwbGFjZSByZWcgY29tcGxldGVseVxuICB9XG5cbiAgdmFyIHJlYWRpZXMgPSByZWcucmVhZGllcyA9IHJlZy5yZWFkaWVzIHx8IFtdO1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX2N5cmVnID0gcmVnO1xuICB9IC8vIG1ha2Ugc3VyZSBjb250YWluZXIgYXNzb2MnZCByZWcgcG9pbnRzIHRvIHRoaXMgY3lcblxuXG4gIHJlZy5jeSA9IGN5O1xuICB2YXIgaGVhZCA9IHdpbmRvdyQxICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVyICE9PSB1bmRlZmluZWQgJiYgIW9wdHMuaGVhZGxlc3M7XG4gIHZhciBvcHRpb25zID0gb3B0cztcbiAgb3B0aW9ucy5sYXlvdXQgPSBleHRlbmQoe1xuICAgIG5hbWU6IGhlYWQgPyAnZ3JpZCcgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5sYXlvdXQpO1xuICBvcHRpb25zLnJlbmRlcmVyID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2NhbnZhcycgOiAnbnVsbCdcbiAgfSwgb3B0aW9ucy5yZW5kZXJlcik7XG5cbiAgdmFyIGRlZlZhbCA9IGZ1bmN0aW9uIGRlZlZhbChkZWYsIHZhbCwgYWx0VmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0gZWxzZSBpZiAoYWx0VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBhbHRWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWY7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgLy8gaHRtbCBkb20gZWxlIGNvbnRhaW5lclxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHJlYWR5IGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgLy8gY2FjaGVkIG9wdGlvbnNcbiAgICBlbGVtZW50czogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgaW4gdGhlIGdyYXBoXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIGxpc3RlbmVyc1xuICAgIGFuaUVsZXM6IG5ldyBDb2xsZWN0aW9uKHRoaXMpLFxuICAgIC8vIGVsZW1lbnRzIGJlaW5nIGFuaW1hdGVkXG4gICAgZGF0YToge30sXG4gICAgLy8gZGF0YSBmb3IgdGhlIGNvcmVcbiAgICBzY3JhdGNoOiB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdCBmb3IgY29yZVxuICAgIGxheW91dDogbnVsbCxcbiAgICByZW5kZXJlcjogbnVsbCxcbiAgICBkZXN0cm95ZWQ6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgZGVzdHJveSB3YXMgY2FsbGVkXG4gICAgbm90aWZpY2F0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gd2hldGhlciBub3RpZmljYXRpb25zIGFyZSBzZW50IHRvIHRoZSByZW5kZXJlclxuICAgIG1pblpvb206IDFlLTUwLFxuICAgIG1heFpvb206IDFlNTAsXG4gICAgem9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnpvb21pbmdFbmFibGVkKSxcbiAgICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJab29taW5nRW5hYmxlZCksXG4gICAgcGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnBhbm5pbmdFbmFibGVkKSxcbiAgICB1c2VyUGFubmluZ0VuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLnVzZXJQYW5uaW5nRW5hYmxlZCksXG4gICAgYm94U2VsZWN0aW9uRW5hYmxlZDogZGVmVmFsKHRydWUsIG9wdGlvbnMuYm94U2VsZWN0aW9uRW5hYmxlZCksXG4gICAgYXV0b2xvY2s6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvbG9jaywgb3B0aW9ucy5hdXRvbG9ja05vZGVzKSxcbiAgICBhdXRvdW5ncmFiaWZ5OiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeSwgb3B0aW9ucy5hdXRvdW5ncmFiaWZ5Tm9kZXMpLFxuICAgIGF1dG91bnNlbGVjdGlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bnNlbGVjdGlmeSksXG4gICAgc3R5bGVFbmFibGVkOiBvcHRpb25zLnN0eWxlRW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gaGVhZCA6IG9wdGlvbnMuc3R5bGVFbmFibGVkLFxuICAgIHpvb206IG51bWJlcihvcHRpb25zLnpvb20pID8gb3B0aW9ucy56b29tIDogMSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBsYWluT2JqZWN0KG9wdGlvbnMucGFuKSAmJiBudW1iZXIob3B0aW9ucy5wYW4ueCkgPyBvcHRpb25zLnBhbi54IDogMCxcbiAgICAgIHk6IHBsYWluT2JqZWN0KG9wdGlvbnMucGFuKSAmJiBudW1iZXIob3B0aW9ucy5wYW4ueSkgPyBvcHRpb25zLnBhbi55IDogMFxuICAgIH0sXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICBoYXNDb21wb3VuZE5vZGVzOiBmYWxzZVxuICB9O1xuXG4gIHRoaXMuY3JlYXRlRW1pdHRlcigpOyAvLyBzZXQgc2VsZWN0aW9uIHR5cGVcblxuICB0aGlzLnNlbGVjdGlvblR5cGUob3B0aW9ucy5zZWxlY3Rpb25UeXBlKTsgLy8gaW5pdCB6b29tIGJvdW5kc1xuXG4gIHRoaXMuem9vbVJhbmdlKHtcbiAgICBtaW46IG9wdGlvbnMubWluWm9vbSxcbiAgICBtYXg6IG9wdGlvbnMubWF4Wm9vbVxuICB9KTtcblxuICB2YXIgbG9hZEV4dERhdGEgPSBmdW5jdGlvbiBsb2FkRXh0RGF0YShleHREYXRhLCBuZXh0KSB7XG4gICAgdmFyIGFueUlzUHJvbWlzZSA9IGV4dERhdGEuc29tZShwcm9taXNlKTtcblxuICAgIGlmIChhbnlJc1Byb21pc2UpIHtcbiAgICAgIHJldHVybiBQcm9taXNlJDEuYWxsKGV4dERhdGEpLnRoZW4obmV4dCk7IC8vIGxvYWQgYWxsIGRhdGEgYXN5bmNocm9ub3VzbHksIHRoZW4gZXhlYyByZXN0IG9mIGluaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dChleHREYXRhKTsgLy8gZXhlYyBzeW5jaHJvbm91c2x5IGZvciBjb252ZW5pZW5jZVxuICAgIH1cbiAgfTsgLy8gc3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBzdHlsZXNoZWV0IHNvIHdlIGhhdmUgc29tZXRoaW5nIGJlZm9yZSBsb2FkaW5nIGFuIGV4dGVybmFsIHN0eWxlc2hlZXRcblxuXG4gIGlmIChfcC5zdHlsZUVuYWJsZWQpIHtcbiAgICBjeS5zZXRTdHlsZShbXSk7XG4gIH0gLy8gY3JlYXRlIHRoZSByZW5kZXJlclxuXG5cbiAgdmFyIHJlbmRlcmVyT3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlcik7IC8vIGFsbG93IHJlbmRlcmluZyBoaW50cyBpbiB0b3AgbGV2ZWwgb3B0aW9uc1xuXG4gIGN5LmluaXRSZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuXG4gIHZhciBzZXRFbGVzQW5kTGF5b3V0ID0gZnVuY3Rpb24gc2V0RWxlc0FuZExheW91dChlbGVtZW50cywgb25sb2FkLCBvbmRvbmUpIHtcbiAgICBjeS5ub3RpZmljYXRpb25zKGZhbHNlKTsgLy8gcmVtb3ZlIG9sZCBlbGVtZW50c1xuXG4gICAgdmFyIG9sZEVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcblxuICAgIGlmIChvbGRFbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZEVsZXMucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHtcbiAgICAgIGlmIChwbGFpbk9iamVjdChlbGVtZW50cykgfHwgYXJyYXkoZWxlbWVudHMpKSB7XG4gICAgICAgIGN5LmFkZChlbGVtZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3kub25lKCdsYXlvdXRyZWFkeScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjeS5ub3RpZmljYXRpb25zKHRydWUpO1xuICAgICAgY3kuZW1pdChlKTsgLy8gd2UgbWlzc2VkIHRoaXMgZXZlbnQgYnkgdHVybmluZyBub3RpZmljYXRpb25zIG9mZiwgc28gcGFzcyBpdCBvblxuXG4gICAgICBjeS5vbmUoJ2xvYWQnLCBvbmxvYWQpO1xuICAgICAgY3kuZW1pdEFuZE5vdGlmeSgnbG9hZCcpO1xuICAgIH0pLm9uZSgnbGF5b3V0c3RvcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGN5Lm9uZSgnZG9uZScsIG9uZG9uZSk7XG4gICAgICBjeS5lbWl0KCdkb25lJyk7XG4gICAgfSk7XG4gICAgdmFyIGxheW91dE9wdHMgPSBleHRlbmQoe30sIGN5Ll9wcml2YXRlLm9wdGlvbnMubGF5b3V0KTtcbiAgICBsYXlvdXRPcHRzLmVsZXMgPSBjeS5lbGVtZW50cygpO1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfTtcblxuICBsb2FkRXh0RGF0YShbb3B0aW9ucy5zdHlsZSwgb3B0aW9ucy5lbGVtZW50c10sIGZ1bmN0aW9uICh0aGVucykge1xuICAgIHZhciBpbml0U3R5bGUgPSB0aGVuc1swXTtcbiAgICB2YXIgaW5pdEVsZXMgPSB0aGVuc1sxXTsgLy8gaW5pdCBzdHlsZVxuXG4gICAgaWYgKF9wLnN0eWxlRW5hYmxlZCkge1xuICAgICAgY3kuc3R5bGUoKS5hcHBlbmQoaW5pdFN0eWxlKTtcbiAgICB9IC8vIGluaXRpYWwgbG9hZFxuXG5cbiAgICBzZXRFbGVzQW5kTGF5b3V0KGluaXRFbGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBvbnJlYWR5XG4gICAgICBjeS5zdGFydEFuaW1hdGlvbkxvb3AoKTtcbiAgICAgIF9wLnJlYWR5ID0gdHJ1ZTsgLy8gaWYgYSByZWFkeSBjYWxsYmFjayBpcyBzcGVjaWZpZWQgYXMgYW4gb3B0aW9uLCB0aGUgYmluZCBpdFxuXG4gICAgICBpZiAoZm4ob3B0aW9ucy5yZWFkeSkpIHtcbiAgICAgICAgY3kub24oJ3JlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICB9IC8vIGJpbmQgYWxsIHRoZSByZWFkeSBoYW5kbGVycyByZWdpc3RlcmVkIGJlZm9yZSBjcmVhdGluZyB0aGlzIGluc3RhbmNlXG5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWFkaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmbiQxID0gcmVhZGllc1tpXTtcbiAgICAgICAgY3kub24oJ3JlYWR5JywgZm4kMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWcpIHtcbiAgICAgICAgcmVnLnJlYWRpZXMgPSBbXTtcbiAgICAgIH0gLy8gY2xlYXIgYi9jIHdlJ3ZlIGJvdW5kIHRoZW0gYWxsIGFuZCBkb24ndCB3YW50IHRvIGtlZXAgaXQgYXJvdW5kIGluIGNhc2UgYSBuZXcgY29yZSB1c2VzIHRoZSBzYW1lIGRpdiBldGNcblxuXG4gICAgICBjeS5lbWl0KCdyZWFkeScpO1xuICAgIH0sIG9wdGlvbnMuZG9uZSk7XG4gIH0pO1xufTtcblxudmFyIGNvcmVmbiQ5ID0gQ29yZS5wcm90b3R5cGU7IC8vIHNob3J0IGFsaWFzXG5cbmV4dGVuZChjb3JlZm4kOSwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdjb3JlJztcbiAgfSxcbiAgaXNSZWFkeTogZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZWFkeTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZGVzdHJveWVkO1xuICB9LFxuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoJ3JlYWR5JywgW10sIGZuKTsgLy8ganVzdCBjYWxscyBmbiBhcyB0aG91Z2ggdHJpZ2dlcmVkIHZpYSByZWFkeSBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uKCdyZWFkeScsIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmIChjeS5kZXN0cm95ZWQoKSkgcmV0dXJuO1xuICAgIGN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuZGVzdHJveVJlbmRlcmVyKCk7XG4gICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XG4gICAgY3kuX3ByaXZhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIGhhc0VsZW1lbnRXaXRoSWQ6IGZ1bmN0aW9uIGhhc0VsZW1lbnRXaXRoSWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgfSxcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICB9LFxuICBoYXNDb21wb3VuZE5vZGVzOiBmdW5jdGlvbiBoYXNDb21wb3VuZE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmhhc0NvbXBvdW5kTm9kZXM7XG4gIH0sXG4gIGhlYWRsZXNzOiBmdW5jdGlvbiBoZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlci5pc0hlYWRsZXNzKCk7XG4gIH0sXG4gIHN0eWxlRW5hYmxlZDogZnVuY3Rpb24gc3R5bGVFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlRW5hYmxlZDtcbiAgfSxcbiAgYWRkVG9Qb29sOiBmdW5jdGlvbiBhZGRUb1Bvb2woZWxlcykge1xuICAgIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMubWVyZ2UoZWxlcyk7XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcbiAgcmVtb3ZlRnJvbVBvb2w6IGZ1bmN0aW9uIHJlbW92ZUZyb21Qb29sKGVsZXMpIHtcbiAgICB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLnVubWVyZ2UoZWxlcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29udGFpbmVyOiBmdW5jdGlvbiBjb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY29udGFpbmVyIHx8IG51bGw7XG4gIH0sXG4gIG1vdW50OiBmdW5jdGlvbiBtb3VudChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcblxuICAgIGlmICghaHRtbEVsZW1lbnQoY29udGFpbmVyKSAmJiBodG1sRWxlbWVudChjb250YWluZXJbMF0pKSB7XG4gICAgICBjb250YWluZXIgPSBjb250YWluZXJbMF07XG4gICAgfVxuXG4gICAgY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgICBjeS5kZXN0cm95UmVuZGVyZXIoKTtcbiAgICBfcC5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgX3Auc3R5bGVFbmFibGVkID0gdHJ1ZTtcbiAgICBjeS5pbnZhbGlkYXRlU2l6ZSgpO1xuICAgIGN5LmluaXRSZW5kZXJlcihleHRlbmQoe30sIG9wdGlvbnMsIG9wdGlvbnMucmVuZGVyZXIsIHtcbiAgICAgIC8vIGFsbG93IGN1c3RvbSByZW5kZXJlciBuYW1lIHRvIGJlIHJlLXVzZWQsIG90aGVyd2lzZSB1c2UgY2FudmFzXG4gICAgICBuYW1lOiBvcHRpb25zLnJlbmRlcmVyLm5hbWUgPT09ICdudWxsJyA/ICdjYW52YXMnIDogb3B0aW9ucy5yZW5kZXJlci5uYW1lXG4gICAgfSkpO1xuICAgIGN5LnN0YXJ0QW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LnN0eWxlKG9wdGlvbnMuc3R5bGUpO1xuICAgIGN5LmVtaXQoJ21vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICB1bm1vdW50OiBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgY3kuc3RvcEFuaW1hdGlvbkxvb3AoKTtcbiAgICBjeS5kZXN0cm95UmVuZGVyZXIoKTtcbiAgICBjeS5pbml0UmVuZGVyZXIoe1xuICAgICAgbmFtZTogJ251bGwnXG4gICAgfSk7XG4gICAgY3kuZW1pdCgndW5tb3VudCcpO1xuICAgIHJldHVybiBjeTtcbiAgfSxcbiAgb3B0aW9uczogZnVuY3Rpb24gb3B0aW9ucygpIHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9wcml2YXRlLm9wdGlvbnMpO1xuICB9LFxuICBqc29uOiBmdW5jdGlvbiBqc29uKG9iaikge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgdmFyIF9wID0gY3kuX3ByaXZhdGU7XG4gICAgdmFyIGVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcblxuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuXG4gICAgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICAgIC8vIHNldFxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICBpZiAob2JqLmVsZW1lbnRzKSB7XG4gICAgICAgIHZhciBpZEluSnNvbiA9IHt9O1xuXG4gICAgICAgIHZhciB1cGRhdGVFbGVzID0gZnVuY3Rpb24gdXBkYXRlRWxlcyhqc29ucywgZ3IpIHtcbiAgICAgICAgICB2YXIgdG9BZGQgPSBbXTtcbiAgICAgICAgICB2YXIgdG9Nb2QgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG4gICAgICAgICAgICB2YXIgaWQgPSAnJyArIGpzb24uZGF0YS5pZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChlbGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGVsZW1lbnQgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICAgICAgICAgICAgdG9Nb2QucHVzaCh7XG4gICAgICAgICAgICAgICAgZWxlOiBlbGUsXG4gICAgICAgICAgICAgICAganNvbjoganNvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaG91bGQgYmUgYWRkZWRcbiAgICAgICAgICAgICAgaWYgKGdyKSB7XG4gICAgICAgICAgICAgICAganNvbi5ncm91cCA9IGdyO1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChqc29uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN5LmFkZCh0b0FkZCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICAgIF9lbGUgPSBfdG9Nb2QkX2kuZWxlLFxuICAgICAgICAgICAgICAgIF9qc29uID0gX3RvTW9kJF9pLmpzb247XG5cbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcnJheShvYmouZWxlbWVudHMpKSB7XG4gICAgICAgICAgLy8gZWxlbWVudHM6IFtdXG4gICAgICAgICAgdXBkYXRlRWxlcyhvYmouZWxlbWVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH1cbiAgICAgICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBnciA9IGdyc1tpXTtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG9iai5lbGVtZW50c1tncl07XG5cbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRzVG9SZW1vdmUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gIWlkSW5Kc29uW2VsZS5pZCgpXTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgaWYgKGVsZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICBwYXJlbnRzVG9SZW1vdmUubWVyZ2UoZWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG5cbiAgICAgICAgcGFyZW50c1RvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIHJldHVybiBlbGUuY2hpbGRyZW4oKS5tb3ZlKHtcbiAgICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuXG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RnJlc2hSZWYoZWxlKS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmouc3R5bGUpIHtcbiAgICAgICAgY3kuc3R5bGUob2JqLnN0eWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmoucGFuKSB7XG4gICAgICAgIGlmIChvYmoucGFuLnggIT09IF9wLnBhbi54IHx8IG9iai5wYW4ueSAhPT0gX3AucGFuLnkpIHtcbiAgICAgICAgICBjeS5wYW4ob2JqLnBhbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9iai5kYXRhKSB7XG4gICAgICAgIGN5LmRhdGEob2JqLmRhdGEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5J107XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpZWxkcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBmID0gZmllbGRzW19pMl07XG5cbiAgICAgICAgaWYgKG9ialtmXSAhPSBudWxsKSB7XG4gICAgICAgICAgY3lbZl0ob2JqW2ZdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdldFxuICAgICAgdmFyIGZsYXQgPSAhIW9iajtcbiAgICAgIHZhciBqc29uID0ge307XG5cbiAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmVsZW1lbnRzID0ge307XG4gICAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZWxlLmdyb3VwKCk7XG5cbiAgICAgICAgICBpZiAoIWpzb24uZWxlbWVudHNbZ3JvdXBdKSB7XG4gICAgICAgICAgICBqc29uLmVsZW1lbnRzW2dyb3VwXSA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGpzb24uZWxlbWVudHNbZ3JvdXBdLnB1c2goZWxlLmpzb24oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQpIHtcbiAgICAgICAganNvbi5zdHlsZSA9IGN5LnN0eWxlKCkuanNvbigpO1xuICAgICAgfVxuXG4gICAgICBqc29uLmRhdGEgPSBjb3B5KGN5LmRhdGEoKSk7XG4gICAgICB2YXIgb3B0aW9ucyA9IF9wLm9wdGlvbnM7XG4gICAgICBqc29uLnpvb21pbmdFbmFibGVkID0gX3Auem9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJab29taW5nRW5hYmxlZCA9IF9wLnVzZXJab29taW5nRW5hYmxlZDtcbiAgICAgIGpzb24uem9vbSA9IF9wLnpvb207XG4gICAgICBqc29uLm1pblpvb20gPSBfcC5taW5ab29tO1xuICAgICAganNvbi5tYXhab29tID0gX3AubWF4Wm9vbTtcbiAgICAgIGpzb24ucGFubmluZ0VuYWJsZWQgPSBfcC5wYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24udXNlclBhbm5pbmdFbmFibGVkID0gX3AudXNlclBhbm5pbmdFbmFibGVkO1xuICAgICAganNvbi5wYW4gPSBjb3B5KF9wLnBhbik7XG4gICAgICBqc29uLmJveFNlbGVjdGlvbkVuYWJsZWQgPSBfcC5ib3hTZWxlY3Rpb25FbmFibGVkO1xuICAgICAganNvbi5yZW5kZXJlciA9IGNvcHkob3B0aW9ucy5yZW5kZXJlcik7XG4gICAgICBqc29uLmhpZGVFZGdlc09uVmlld3BvcnQgPSBvcHRpb25zLmhpZGVFZGdlc09uVmlld3BvcnQ7XG4gICAgICBqc29uLnRleHR1cmVPblZpZXdwb3J0ID0gb3B0aW9ucy50ZXh0dXJlT25WaWV3cG9ydDtcbiAgICAgIGpzb24ud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgICAgIGpzb24ubW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1cjtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgfVxufSk7XG5jb3JlZm4kOS4kaWQgPSBjb3JlZm4kOS5nZXRFbGVtZW50QnlJZDtcbltjb3JlZm4sIGNvcmVmbiQxLCBlbGVzZm4kdiwgY29yZWZuJDIsIGNvcmVmbiQzLCBjb3JlZm4kNCwgY29yZWZuJDUsIGNvcmVmbiQ2LCBjb3JlZm4kNywgY29yZWZuJDgsIGZuJDZdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChjb3JlZm4kOSwgcHJvcHMpO1xufSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbnZhciBkZWZhdWx0cyQ5ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBjaXJjbGU6IGZhbHNlLFxuICAvLyBwdXQgZGVwdGhzIGluIGNvbmNlbnRyaWMgY2lyY2xlcyBpZiB0cnVlLCBwdXQgZGVwdGhzIHRvcCBkb3duIGlmIGZhbHNlXG4gIGdyaWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGNyZWF0ZSBhbiBldmVuIGdyaWQgaW50byB3aGljaCB0aGUgREFHIGlzIHBsYWNlZCAoY2lyY2xlOmZhbHNlIG9ubHkpXG4gIHNwYWNpbmdGYWN0b3I6IDEuNzUsXG4gIC8vIHBvc2l0aXZlIHNwYWNpbmcgZmFjdG9yLCBsYXJnZXIgPT4gbW9yZSBzcGFjZSBiZXR3ZWVuIG5vZGVzIChOLkIuIG4vYSBpZiBjYXVzZXMgb3ZlcmxhcClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICByb290czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcm9vdHMgb2YgdGhlIHRyZWVzXG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSlcbiAgYW5pbWF0ZTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZCxcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuXG59O1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG52YXIgZ2V0SW5mbyA9IGZ1bmN0aW9uIGdldEluZm8oZWxlKSB7XG4gIHJldHVybiBlbGUuc2NyYXRjaCgnYnJlYWR0aGZpcnN0Jyk7XG59O1xuXG52YXIgc2V0SW5mbyA9IGZ1bmN0aW9uIHNldEluZm8oZWxlLCBvYmopIHtcbiAgcmV0dXJuIGVsZS5zY3JhdGNoKCdicmVhZHRoZmlyc3QnLCBvYmopO1xufTtcblxuZnVuY3Rpb24gQnJlYWR0aEZpcnN0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ5LCBvcHRpb25zKTtcbn1cblxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMubWF4aW1hbCB8fCBvcHRpb25zLm1heGltYWxBZGp1c3RtZW50cyA+IDA7IC8vIG1heGltYWxBZGp1c3RtZW50cyBmb3IgY29tcGF0LiB3LyBvbGQgY29kZVxuXG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuICB2YXIgcm9vdHM7XG5cbiAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IG9wdGlvbnMucm9vdHM7XG4gIH0gZWxzZSBpZiAoYXJyYXkob3B0aW9ucy5yb290cykpIHtcbiAgICB2YXIgcm9vdHNBcnJheSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLnJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWQgPSBvcHRpb25zLnJvb3RzW2ldO1xuICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIHJvb3RzQXJyYXkucHVzaChlbGUpO1xuICAgIH1cblxuICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbihyb290c0FycmF5KTtcbiAgfSBlbHNlIGlmIChzdHJpbmcob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IGN5LiQob3B0aW9ucy5yb290cyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICByb290cyA9IG5vZGVzLnJvb3RzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb21wb25lbnRzID0gZWxlcy5jb21wb25lbnRzKCk7XG4gICAgICByb290cyA9IGN5LmNvbGxlY3Rpb24oKTtcblxuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBjb21wb25lbnRzW19pXTtcbiAgICAgICAgdmFyIG1heERlZ3JlZSA9IGNvbXAubWF4RGVncmVlKGZhbHNlKTtcbiAgICAgICAgdmFyIGNvbXBSb290cyA9IGNvbXAuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmRlZ3JlZShmYWxzZSkgPT09IG1heERlZ3JlZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3RzID0gcm9vdHMuYWRkKGNvbXBSb290cyk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgY29tcG9uZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgX2xvb3AoX2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZXB0aHMgPSBbXTtcbiAgdmFyIGZvdW5kQnlCZnMgPSB7fTtcblxuICB2YXIgYWRkVG9EZXB0aCA9IGZ1bmN0aW9uIGFkZFRvRGVwdGgoZWxlLCBkKSB7XG4gICAgaWYgKGRlcHRoc1tkXSA9PSBudWxsKSB7XG4gICAgICBkZXB0aHNbZF0gPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IGRlcHRoc1tkXS5sZW5ndGg7XG4gICAgZGVwdGhzW2RdLnB1c2goZWxlKTtcbiAgICBzZXRJbmZvKGVsZSwge1xuICAgICAgaW5kZXg6IGksXG4gICAgICBkZXB0aDogZFxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBjaGFuZ2VEZXB0aCA9IGZ1bmN0aW9uIGNoYW5nZURlcHRoKGVsZSwgbmV3RGVwdGgpIHtcbiAgICB2YXIgX2dldEluZm8gPSBnZXRJbmZvKGVsZSksXG4gICAgICAgIGRlcHRoID0gX2dldEluZm8uZGVwdGgsXG4gICAgICAgIGluZGV4ID0gX2dldEluZm8uaW5kZXg7XG5cbiAgICBkZXB0aHNbZGVwdGhdW2luZGV4XSA9IG51bGw7XG4gICAgYWRkVG9EZXB0aChlbGUsIG5ld0RlcHRoKTtcbiAgfTsgLy8gZmluZCB0aGUgZGVwdGhzIG9mIHRoZSBub2Rlc1xuXG5cbiAgZ3JhcGguYmZzKHtcbiAgICByb290czogcm9vdHMsXG4gICAgZGlyZWN0ZWQ6IG9wdGlvbnMuZGlyZWN0ZWQsXG4gICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KG5vZGUsIGVkZ2UsIHBOb2RlLCBpLCBkZXB0aCkge1xuICAgICAgdmFyIGVsZSA9IG5vZGVbMF07XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIGFkZFRvRGVwdGgoZWxlLCBkZXB0aCk7XG4gICAgICBmb3VuZEJ5QmZzW2lkXSA9IHRydWU7XG4gICAgfVxuICB9KTsgLy8gY2hlY2sgZm9yIG5vZGVzIG5vdCBmb3VuZCBieSBiZnNcblxuICB2YXIgb3JwaGFuTm9kZXMgPSBbXTtcblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2Rlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9lbGUgPSBub2Rlc1tfaTJdO1xuXG4gICAgaWYgKGZvdW5kQnlCZnNbX2VsZS5pZCgpXSkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ycGhhbk5vZGVzLnB1c2goX2VsZSk7XG4gICAgfVxuICB9IC8vIGFzc2lnbiB0aGUgbm9kZXMgYSBkZXB0aCBhbmQgaW5kZXhcblxuXG4gIHZhciBhc3NpZ25EZXB0aHNBdCA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRoc0F0KGkpIHtcbiAgICB2YXIgZWxlcyA9IGRlcHRoc1tpXTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIF9lbGUyID0gZWxlc1tqXTtcblxuICAgICAgaWYgKF9lbGUyID09IG51bGwpIHtcbiAgICAgICAgZWxlcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgIGotLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHNldEluZm8oX2VsZTIsIHtcbiAgICAgICAgZGVwdGg6IGksXG4gICAgICAgIGluZGV4OiBqXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFzc2lnbkRlcHRocyA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRocygpIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBkZXB0aHMubGVuZ3RoOyBfaTMrKykge1xuICAgICAgYXNzaWduRGVwdGhzQXQoX2kzKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFkanVzdE1heGltYWxseSA9IGZ1bmN0aW9uIGFkanVzdE1heGltYWxseShlbGUsIHNoaWZ0ZWQpIHtcbiAgICB2YXIgZUluZm8gPSBnZXRJbmZvKGVsZSk7XG4gICAgdmFyIGluY29tZXJzID0gZWxlLmluY29tZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIGVsLmlzTm9kZSgpICYmIGVsZXMuaGFzKGVsKTtcbiAgICB9KTtcbiAgICB2YXIgbWF4RGVwdGggPSAtMTtcbiAgICB2YXIgaWQgPSBlbGUuaWQoKTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaW5jb21lcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciBpbmNtciA9IGluY29tZXJzW2tdO1xuICAgICAgdmFyIGlJbmZvID0gZ2V0SW5mbyhpbmNtcik7XG4gICAgICBtYXhEZXB0aCA9IE1hdGgubWF4KG1heERlcHRoLCBpSW5mby5kZXB0aCk7XG4gICAgfVxuXG4gICAgaWYgKGVJbmZvLmRlcHRoIDw9IG1heERlcHRoKSB7XG4gICAgICBpZiAoc2hpZnRlZFtpZF0pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZURlcHRoKGVsZSwgbWF4RGVwdGggKyAxKTtcbiAgICAgIHNoaWZ0ZWRbaWRdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTsgLy8gZm9yIHRoZSBkaXJlY3RlZCBjYXNlLCB0cnkgdG8gbWFrZSB0aGUgZWRnZXMgYWxsIGdvIGRvd24gKGkuZS4gZGVwdGggaSA9PiBkZXB0aCBpICsgMSlcblxuXG4gIGlmIChkaXJlY3RlZCAmJiBtYXhpbWFsKSB7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgc2hpZnRlZCA9IHt9O1xuXG4gICAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfTtcblxuICAgIHZhciBkZXF1ZXVlID0gZnVuY3Rpb24gZGVxdWV1ZSgpIHtcbiAgICAgIHJldHVybiBRLnNoaWZ0KCk7XG4gICAgfTtcblxuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfSk7XG5cbiAgICB3aGlsZSAoUS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2VsZTMgPSBkZXF1ZXVlKCk7XG5cbiAgICAgIHZhciBkaWRTaGlmdCA9IGFkanVzdE1heGltYWxseShfZWxlMywgc2hpZnRlZCk7XG5cbiAgICAgIGlmIChkaWRTaGlmdCkge1xuICAgICAgICBfZWxlMy5vdXRnb2VycygpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICByZXR1cm4gZWwuaXNOb2RlKCkgJiYgZWxlcy5oYXMoZWwpO1xuICAgICAgICB9KS5mb3JFYWNoKGVucXVldWUpO1xuICAgICAgfSBlbHNlIGlmIChkaWRTaGlmdCA9PT0gbnVsbCkge1xuICAgICAgICB3YXJuKCdEZXRlY3RlZCBkb3VibGUgbWF4aW1hbCBzaGlmdCBmb3Igbm9kZSBgJyArIF9lbGUzLmlkKCkgKyAnYC4gIEJhaWxpbmcgbWF4aW1hbCBhZGp1c3RtZW50IGR1ZSB0byBjeWNsZS4gIFVzZSBgb3B0aW9ucy5tYXhpbWFsOiB0cnVlYCBvbmx5IG9uIERBR3MuJyk7XG4gICAgICAgIGJyZWFrOyAvLyBleGl0IG9uIGZhaWx1cmVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3NpZ25EZXB0aHMoKTsgLy8gY2xlYXIgaG9sZXNcbiAgLy8gZmluZCBtaW4gZGlzdGFuY2Ugd2UgbmVlZCB0byBsZWF2ZSBiZXR3ZWVuIG5vZGVzXG5cbiAgdmFyIG1pbkRpc3RhbmNlID0gMDtcblxuICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW19pNF07XG4gICAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgdmFyIHcgPSBuYmIudztcbiAgICAgIHZhciBoID0gbmJiLmg7XG4gICAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgICB9XG4gIH0gLy8gZ2V0IHRoZSB3ZWlnaHRlZCBwZXJjZW50IGZvciBhbiBlbGVtZW50IGJhc2VkIG9uIGl0cyBjb25uZWN0aXZpdHkgdG8gb3RoZXIgbGV2ZWxzXG5cblxuICB2YXIgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50ID0ge307XG5cbiAgdmFyIGdldFdlaWdodGVkUGVyY2VudCA9IGZ1bmN0aW9uIGdldFdlaWdodGVkUGVyY2VudChlbGUpIHtcbiAgICBpZiAoY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFdlaWdodGVkUGVyY2VudFtlbGUuaWQoKV07XG4gICAgfVxuXG4gICAgdmFyIGVsZURlcHRoID0gZ2V0SW5mbyhlbGUpLmRlcHRoO1xuICAgIHZhciBuZWlnaGJvcnMgPSBlbGUubmVpZ2hib3Job29kKCk7XG4gICAgdmFyIHBlcmNlbnQgPSAwO1xuICAgIHZhciBzYW1wbGVzID0gMDtcblxuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZWlnaGJvcnNbX2k1XTtcblxuICAgICAgaWYgKG5laWdoYm9yLmlzRWRnZSgpIHx8IG5laWdoYm9yLmlzUGFyZW50KCkgfHwgIW5vZGVzLmhhcyhuZWlnaGJvcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBiZiA9IGdldEluZm8obmVpZ2hib3IpO1xuXG4gICAgICBpZiAoYmYgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gYmYuaW5kZXg7XG4gICAgICB2YXIgZGVwdGggPSBiZi5kZXB0aDsgLy8gdW5hc3NpZ25lZCBuZWlnaGJvdXJzIHNob3VsZG4ndCBhZmZlY3QgdGhlIG9yZGVyaW5nXG5cbiAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IGRlcHRoID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBuRGVwdGggPSBkZXB0aHNbZGVwdGhdLmxlbmd0aDtcblxuICAgICAgaWYgKGRlcHRoIDwgZWxlRGVwdGgpIHtcbiAgICAgICAgLy8gb25seSBnZXQgaW5mbHVlbmNlZCBieSBlbGVtZW50cyBhYm92ZVxuICAgICAgICBwZXJjZW50ICs9IGluZGV4IC8gbkRlcHRoO1xuICAgICAgICBzYW1wbGVzKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2FtcGxlcyA9IE1hdGgubWF4KDEsIHNhbXBsZXMpO1xuICAgIHBlcmNlbnQgPSBwZXJjZW50IC8gc2FtcGxlcztcblxuICAgIGlmIChzYW1wbGVzID09PSAwKSB7XG4gICAgICAvLyBwdXQgbG9uZSBub2RlcyBhdCB0aGUgc3RhcnRcbiAgICAgIHBlcmNlbnQgPSAwO1xuICAgIH1cblxuICAgIGNhY2hlZFdlaWdodGVkUGVyY2VudFtlbGUuaWQoKV0gPSBwZXJjZW50O1xuICAgIHJldHVybiBwZXJjZW50O1xuICB9OyAvLyByZWFycmFuZ2UgdGhlIGluZGljZXMgaW4gZWFjaCBkZXB0aCBsZXZlbCBiYXNlZCBvbiBjb25uZWN0aXZpdHlcblxuXG4gIHZhciBzb3J0Rm4gPSBmdW5jdGlvbiBzb3J0Rm4oYSwgYikge1xuICAgIHZhciBhcGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGEpO1xuICAgIHZhciBicGN0ID0gZ2V0V2VpZ2h0ZWRQZXJjZW50KGIpO1xuICAgIHZhciBkaWZmID0gYXBjdCAtIGJwY3Q7XG5cbiAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGFzY2VuZGluZyhhLmlkKCksIGIuaWQoKSk7IC8vIG1ha2Ugc3VyZSBzb3J0IGRvZXNuJ3QgaGF2ZSBkb24ndC1jYXJlIGNvbXBhcmlzb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH1cbiAgfTsgLy8gc29ydCBlYWNoIGxldmVsIHRvIG1ha2UgY29ubmVjdGVkIG5vZGVzIGNsb3NlclxuXG5cbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZGVwdGhzLmxlbmd0aDsgX2k2KyspIHtcbiAgICBkZXB0aHNbX2k2XS5zb3J0KHNvcnRGbik7XG5cbiAgICBhc3NpZ25EZXB0aHNBdChfaTYpO1xuICB9IC8vIGFzc2lnbiBvcnBoYW4gbm9kZXMgdG8gYSBuZXcgdG9wLWxldmVsIGRlcHRoXG5cblxuICB2YXIgb3JwaGFuRGVwdGggPSBbXTtcblxuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBvcnBoYW5Ob2Rlcy5sZW5ndGg7IF9pNysrKSB7XG4gICAgb3JwaGFuRGVwdGgucHVzaChvcnBoYW5Ob2Rlc1tfaTddKTtcbiAgfVxuXG4gIGRlcHRocy51bnNoaWZ0KG9ycGhhbkRlcHRoKTtcbiAgYXNzaWduRGVwdGhzKCk7XG4gIHZhciBiaWdnZXN0RGVwdGhTaXplID0gMDtcblxuICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBkZXB0aHMubGVuZ3RoOyBfaTgrKykge1xuICAgIGJpZ2dlc3REZXB0aFNpemUgPSBNYXRoLm1heChkZXB0aHNbX2k4XS5sZW5ndGgsIGJpZ2dlc3REZXB0aFNpemUpO1xuICB9XG5cbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLngxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIG1heERlcHRoU2l6ZSA9IGRlcHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgZWxlcykge1xuICAgIHJldHVybiBNYXRoLm1heChtYXgsIGVsZXMubGVuZ3RoKTtcbiAgfSwgMCk7XG5cbiAgdmFyIGdldFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UG9zaXRpb24oZWxlKSB7XG4gICAgdmFyIF9nZXRJbmZvMiA9IGdldEluZm8oZWxlKSxcbiAgICAgICAgZGVwdGggPSBfZ2V0SW5mbzIuZGVwdGgsXG4gICAgICAgIGluZGV4ID0gX2dldEluZm8yLmluZGV4O1xuXG4gICAgdmFyIGRlcHRoU2l6ZSA9IGRlcHRoc1tkZXB0aF0ubGVuZ3RoO1xuICAgIHZhciBkaXN0YW5jZVggPSBNYXRoLm1heChiYi53IC8gKChvcHRpb25zLmdyaWQgPyBtYXhEZXB0aFNpemUgOiBkZXB0aFNpemUpICsgMSksIG1pbkRpc3RhbmNlKTtcbiAgICB2YXIgZGlzdGFuY2VZID0gTWF0aC5tYXgoYmIuaCAvIChkZXB0aHMubGVuZ3RoICsgMSksIG1pbkRpc3RhbmNlKTtcbiAgICB2YXIgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1pbihiYi53IC8gMiAvIGRlcHRocy5sZW5ndGgsIGJiLmggLyAyIC8gZGVwdGhzLmxlbmd0aCk7XG4gICAgcmFkaXVzU3RlcFNpemUgPSBNYXRoLm1heChyYWRpdXNTdGVwU2l6ZSwgbWluRGlzdGFuY2UpO1xuXG4gICAgaWYgKCFvcHRpb25zLmNpcmNsZSkge1xuICAgICAgdmFyIGVwb3MgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgKGluZGV4ICsgMSAtIChkZXB0aFNpemUgKyAxKSAvIDIpICogZGlzdGFuY2VYLFxuICAgICAgICB5OiAoZGVwdGggKyAxKSAqIGRpc3RhbmNlWVxuICAgICAgfTtcbiAgICAgIHJldHVybiBlcG9zO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmFkaXVzID0gcmFkaXVzU3RlcFNpemUgKiBkZXB0aCArIHJhZGl1c1N0ZXBTaXplIC0gKGRlcHRocy5sZW5ndGggPiAwICYmIGRlcHRoc1swXS5sZW5ndGggPD0gMyA/IHJhZGl1c1N0ZXBTaXplIC8gMiA6IDApO1xuICAgICAgdmFyIHRoZXRhID0gMiAqIE1hdGguUEkgLyBkZXB0aHNbZGVwdGhdLmxlbmd0aCAqIGluZGV4O1xuXG4gICAgICBpZiAoZGVwdGggPT09IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByYWRpdXMgPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBjZW50ZXIueCArIHJhZGl1cyAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgeTogY2VudGVyLnkgKyByYWRpdXMgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zaXRpb24pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBkZWZhdWx0cyRhID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgcGFkZGluZzogMzAsXG4gIC8vIHRoZSBwYWRkaW5nIG9uIGZpdFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBhbmQgcmFkaXVzIGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICByYWRpdXM6IHVuZGVmaW5lZCxcbiAgLy8gdGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlXG4gIHN0YXJ0QW5nbGU6IDMgLyAyICogTWF0aC5QSSxcbiAgLy8gd2hlcmUgbm9kZXMgc3RhcnQgaW4gcmFkaWFuc1xuICBzd2VlcDogdW5kZWZpbmVkLFxuICAvLyBob3cgbWFueSByYWRpYW5zIHNob3VsZCBiZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIChkZWZhdWx0cyB0byBmdWxsIGNpcmNsZSlcbiAgY2xvY2t3aXNlOiB0cnVlLFxuICAvLyB3aGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGdvIGNsb2Nrd2lzZSAodHJ1ZSkgb3IgY291bnRlcmNsb2Nrd2lzZS9hbnRpY2xvY2t3aXNlIChmYWxzZSlcbiAgc29ydDogdW5kZWZpbmVkLFxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgdGhlIG5vZGVzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHMgXG5cbn07XG5cbmZ1bmN0aW9uIENpcmNsZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkYSwgb3B0aW9ucyk7XG59XG5cbkNpcmNsZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGNsb2Nrd2lzZSA9IG9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSAhPT0gdW5kZWZpbmVkID8gIW9wdGlvbnMuY291bnRlcmNsb2Nrd2lzZSA6IG9wdGlvbnMuY2xvY2t3aXNlO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG5cbiAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBub2Rlcy5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICB2YXIgZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBub2Rlcy5sZW5ndGggLSAxKTtcbiAgdmFyIHI7XG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG4ubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdyA9IG5iYi53O1xuICAgIHZhciBoID0gbmJiLmg7XG4gICAgbWluRGlzdGFuY2UgPSBNYXRoLm1heChtaW5EaXN0YW5jZSwgdywgaCk7XG4gIH1cblxuICBpZiAobnVtYmVyKG9wdGlvbnMucmFkaXVzKSkge1xuICAgIHIgPSBvcHRpb25zLnJhZGl1cztcbiAgfSBlbHNlIGlmIChub2Rlcy5sZW5ndGggPD0gMSkge1xuICAgIHIgPSAwO1xuICB9IGVsc2Uge1xuICAgIHIgPSBNYXRoLm1pbihiYi5oLCBiYi53KSAvIDIgLSBtaW5EaXN0YW5jZTtcbiAgfSAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuXG5cbiAgaWYgKG5vZGVzLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAvLyBidXQgb25seSBpZiBtb3JlIHRoYW4gb25lIG5vZGUgKGNhbid0IG92ZXJsYXApXG4gICAgbWluRGlzdGFuY2UgKj0gMS43NTsgLy8ganVzdCB0byBoYXZlIHNvbWUgbmljZSBzcGFjaW5nXG5cbiAgICB2YXIgZGNvcyA9IE1hdGguY29zKGRUaGV0YSkgLSBNYXRoLmNvcygwKTtcbiAgICB2YXIgZHNpbiA9IE1hdGguc2luKGRUaGV0YSkgLSBNYXRoLnNpbigwKTtcbiAgICB2YXIgck1pbiA9IE1hdGguc3FydChtaW5EaXN0YW5jZSAqIG1pbkRpc3RhbmNlIC8gKGRjb3MgKiBkY29zICsgZHNpbiAqIGRzaW4pKTsgLy8gcy50LiBubyBub2RlcyBvdmVybGFwcGluZ1xuXG4gICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICB9XG5cbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGUsIGkpIHtcbiAgICB2YXIgdGhldGEgPSBvcHRpb25zLnN0YXJ0QW5nbGUgKyBpICogZFRoZXRhICogKGNsb2Nrd2lzZSA/IDEgOiAtMSk7XG4gICAgdmFyIHJ4ID0gciAqIE1hdGguY29zKHRoZXRhKTtcbiAgICB2YXIgcnkgPSByICogTWF0aC5zaW4odGhldGEpO1xuICAgIHZhciBwb3MgPSB7XG4gICAgICB4OiBjZW50ZXIueCArIHJ4LFxuICAgICAgeTogY2VudGVyLnkgKyByeVxuICAgIH07XG4gICAgcmV0dXJuIHBvcztcbiAgfTtcblxuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJGIgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gdGhlIHBhZGRpbmcgb24gZml0XG4gIHN0YXJ0QW5nbGU6IDMgLyAyICogTWF0aC5QSSxcbiAgLy8gd2hlcmUgbm9kZXMgc3RhcnQgaW4gcmFkaWFuc1xuICBzd2VlcDogdW5kZWZpbmVkLFxuICAvLyBob3cgbWFueSByYWRpYW5zIHNob3VsZCBiZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIChkZWZhdWx0cyB0byBmdWxsIGNpcmNsZSlcbiAgY2xvY2t3aXNlOiB0cnVlLFxuICAvLyB3aGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGdvIGNsb2Nrd2lzZSAodHJ1ZSkgb3IgY291bnRlcmNsb2Nrd2lzZS9hbnRpY2xvY2t3aXNlIChmYWxzZSlcbiAgZXF1aWRpc3RhbnQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIGxldmVscyBoYXZlIGFuIGVxdWFsIHJhZGlhbCBkaXN0YW5jZSBiZXR3ZW4gdGhlbSwgbWF5IGNhdXNlIGJvdW5kaW5nIGJveCBvdmVyZmxvd1xuICBtaW5Ob2RlU3BhY2luZzogMTAsXG4gIC8vIG1pbiBzcGFjaW5nIGJldHdlZW4gb3V0c2lkZSBvZiBub2RlcyAodXNlZCBmb3IgcmFkaXVzIGFkanVzdG1lbnQpXG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2VcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIC8vIGhlaWdodCBvZiBsYXlvdXQgYXJlYSAob3ZlcnJpZGVzIGNvbnRhaW5lciBoZWlnaHQpXG4gIHdpZHRoOiB1bmRlZmluZWQsXG4gIC8vIHdpZHRoIG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIHdpZHRoKVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGNvbmNlbnRyaWM6IGZ1bmN0aW9uIGNvbmNlbnRyaWMobm9kZSkge1xuICAgIC8vIHJldHVybnMgbnVtZXJpYyB2YWx1ZSBmb3IgZWFjaCBub2RlLCBwbGFjaW5nIGhpZ2hlciBub2RlcyBpbiBsZXZlbHMgdG93YXJkcyB0aGUgY2VudHJlXG4gICAgcmV0dXJuIG5vZGUuZGVncmVlKCk7XG4gIH0sXG4gIGxldmVsV2lkdGg6IGZ1bmN0aW9uIGxldmVsV2lkdGgobm9kZXMpIHtcbiAgICAvLyB0aGUgdmFyaWF0aW9uIG9mIGNvbmNlbnRyaWMgdmFsdWVzIGluIGVhY2ggbGV2ZWxcbiAgICByZXR1cm4gbm9kZXMubWF4RGVncmVlKCkgLyA0O1xuICB9LFxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcblxufTtcblxuZnVuY3Rpb24gQ29uY2VudHJpY0xheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkYiwgb3B0aW9ucyk7XG59XG5cbkNvbmNlbnRyaWNMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICB2YXIgYmIgPSBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgeDE6IDAsXG4gICAgeTE6IDAsXG4gICAgdzogY3kud2lkdGgoKSxcbiAgICBoOiBjeS5oZWlnaHQoKVxuICB9KTtcbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLnkxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIG5vZGVWYWx1ZXMgPSBbXTsgLy8geyBub2RlLCB2YWx1ZSB9XG5cbiAgdmFyIG1heE5vZGVTaXplID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgdmFsdWUgPSB2b2lkIDA7IC8vIGNhbGN1bGF0ZSB0aGUgbm9kZSB2YWx1ZVxuXG4gICAgdmFsdWUgPSBvcHRpb25zLmNvbmNlbnRyaWMobm9kZSk7XG4gICAgbm9kZVZhbHVlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG5vZGU6IG5vZGVcbiAgICB9KTsgLy8gZm9yIHN0eWxlIG1hcHBpbmdcblxuICAgIG5vZGUuX3ByaXZhdGUuc2NyYXRjaC5jb25jZW50cmljID0gdmFsdWU7XG4gIH0gLy8gaW4gY2FzZSB3ZSB1c2VkIHRoZSBgY29uY2VudHJpY2AgaW4gc3R5bGVcblxuXG4gIG5vZGVzLnVwZGF0ZVN0eWxlKCk7IC8vIGNhbGN1bGF0ZSBtYXggc2l6ZSBub3cgYmFzZWQgb24gcG90ZW50aWFsbHkgdXBkYXRlZCBtYXBwZXJzXG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcblxuICAgIHZhciBuYmIgPSBfbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuXG4gICAgbWF4Tm9kZVNpemUgPSBNYXRoLm1heChtYXhOb2RlU2l6ZSwgbmJiLncsIG5iYi5oKTtcbiAgfSAvLyBzb3J0IG5vZGUgdmFsdWVzIGluIGRlc2NyZWFzaW5nIG9yZGVyXG5cblxuICBub2RlVmFsdWVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH0pO1xuICB2YXIgbGV2ZWxXaWR0aCA9IG9wdGlvbnMubGV2ZWxXaWR0aChub2Rlcyk7IC8vIHB1dCB0aGUgdmFsdWVzIGludG8gbGV2ZWxzXG5cbiAgdmFyIGxldmVscyA9IFtbXV07XG4gIHZhciBjdXJyZW50TGV2ZWwgPSBsZXZlbHNbMF07XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVZhbHVlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIHZhbCA9IG5vZGVWYWx1ZXNbX2kyXTtcblxuICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhjdXJyZW50TGV2ZWxbMF0udmFsdWUgLSB2YWwudmFsdWUpO1xuXG4gICAgICBpZiAoZGlmZiA+PSBsZXZlbFdpZHRoKSB7XG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IFtdO1xuICAgICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnRMZXZlbC5wdXNoKHZhbCk7XG4gIH0gLy8gY3JlYXRlIHBvc2l0aW9ucyBmcm9tIGxldmVsc1xuXG5cbiAgdmFyIG1pbkRpc3QgPSBtYXhOb2RlU2l6ZSArIG9wdGlvbnMubWluTm9kZVNwYWNpbmc7IC8vIG1pbiBkaXN0IGJldHdlZW4gbm9kZXNcblxuICBpZiAoIW9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgLy8gdGhlbiBzdHJpY3RseSBjb25zdHJhaW4gdG8gYmJcbiAgICB2YXIgZmlyc3RMdmxIYXNNdWx0aSA9IGxldmVscy5sZW5ndGggPiAwICYmIGxldmVsc1swXS5sZW5ndGggPiAxO1xuICAgIHZhciBtYXhSID0gTWF0aC5taW4oYmIudywgYmIuaCkgLyAyIC0gbWluRGlzdDtcbiAgICB2YXIgclN0ZXAgPSBtYXhSIC8gKGxldmVscy5sZW5ndGggKyBmaXJzdEx2bEhhc011bHRpID8gMSA6IDApO1xuICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtaW5EaXN0LCByU3RlcCk7XG4gIH0gLy8gZmluZCB0aGUgbWV0cmljcyBmb3IgZWFjaCBsZXZlbFxuXG5cbiAgdmFyIHIgPSAwO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGxldmVscy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIGxldmVsID0gbGV2ZWxzW19pM107XG4gICAgdmFyIHN3ZWVwID0gb3B0aW9ucy5zd2VlcCA9PT0gdW5kZWZpbmVkID8gMiAqIE1hdGguUEkgLSAyICogTWF0aC5QSSAvIGxldmVsLmxlbmd0aCA6IG9wdGlvbnMuc3dlZXA7XG4gICAgdmFyIGRUaGV0YSA9IGxldmVsLmRUaGV0YSA9IHN3ZWVwIC8gTWF0aC5tYXgoMSwgbGV2ZWwubGVuZ3RoIC0gMSk7IC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzXG5cbiAgICBpZiAobGV2ZWwubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgICAgLy8gYnV0IG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBub2RlIChjYW4ndCBvdmVybGFwKVxuICAgICAgdmFyIGRjb3MgPSBNYXRoLmNvcyhkVGhldGEpIC0gTWF0aC5jb3MoMCk7XG4gICAgICB2YXIgZHNpbiA9IE1hdGguc2luKGRUaGV0YSkgLSBNYXRoLnNpbigwKTtcbiAgICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3QgKiBtaW5EaXN0IC8gKGRjb3MgKiBkY29zICsgZHNpbiAqIGRzaW4pKTsgLy8gcy50LiBubyBub2RlcyBvdmVybGFwcGluZ1xuXG4gICAgICByID0gTWF0aC5tYXgock1pbiwgcik7XG4gICAgfVxuXG4gICAgbGV2ZWwuciA9IHI7XG4gICAgciArPSBtaW5EaXN0O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZXF1aWRpc3RhbnQpIHtcbiAgICB2YXIgckRlbHRhTWF4ID0gMDtcbiAgICB2YXIgX3IgPSAwO1xuXG4gICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbGV2ZWxzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgIHZhciBfbGV2ZWwgPSBsZXZlbHNbX2k0XTtcbiAgICAgIHZhciByRGVsdGEgPSBfbGV2ZWwuciAtIF9yO1xuICAgICAgckRlbHRhTWF4ID0gTWF0aC5tYXgockRlbHRhTWF4LCByRGVsdGEpO1xuICAgIH1cblxuICAgIF9yID0gMDtcblxuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGxldmVscy5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2xldmVsMiA9IGxldmVsc1tfaTVdO1xuXG4gICAgICBpZiAoX2k1ID09PSAwKSB7XG4gICAgICAgIF9yID0gX2xldmVsMi5yO1xuICAgICAgfVxuXG4gICAgICBfbGV2ZWwyLnIgPSBfcjtcbiAgICAgIF9yICs9IHJEZWx0YU1heDtcbiAgICB9XG4gIH0gLy8gY2FsY3VsYXRlIHRoZSBub2RlIHBvc2l0aW9uc1xuXG5cbiAgdmFyIHBvcyA9IHt9OyAvLyBpZCA9PiBwb3NpdGlvblxuXG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGxldmVscy5sZW5ndGg7IF9pNisrKSB7XG4gICAgdmFyIF9sZXZlbDMgPSBsZXZlbHNbX2k2XTtcbiAgICB2YXIgX2RUaGV0YSA9IF9sZXZlbDMuZFRoZXRhO1xuICAgIHZhciBfcjIgPSBfbGV2ZWwzLnI7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9sZXZlbDMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBfdmFsID0gX2xldmVsM1tqXTtcbiAgICAgIHZhciB0aGV0YSA9IG9wdGlvbnMuc3RhcnRBbmdsZSArIChjbG9ja3dpc2UgPyAxIDogLTEpICogX2RUaGV0YSAqIGo7XG4gICAgICB2YXIgcCA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyBfcjIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IGNlbnRlci55ICsgX3IyICogTWF0aC5zaW4odGhldGEpXG4gICAgICB9O1xuICAgICAgcG9zW192YWwubm9kZS5pZCgpXSA9IHA7XG4gICAgfVxuICB9IC8vIHBvc2l0aW9uIHRoZSBub2Rlc1xuXG5cbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgcmV0dXJuIHBvc1tpZF07XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qXG5UaGUgQ29TRSBsYXlvdXQgd2FzIHdyaXR0ZW4gYnkgR2VyYXJkbyBIdWNrLlxuaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2dlcmFyZG9odWNrL1xuXG5CYXNlZCBvbiB0aGUgZm9sbG93aW5nIGFydGljbGU6XG5odHRwOi8vZGwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9MTQ5ODA0N1xuXG5Nb2RpZmljYXRpb25zIHRyYWNrZWQgb24gR2l0aHViLlxuKi9cbnZhciBERUJVRztcbi8qKlxuICogQGJyaWVmIDogIGRlZmF1bHQgbGF5b3V0IG9wdGlvbnNcbiAqL1xuXG52YXIgZGVmYXVsdHMkYyA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyBXaGV0aGVyIHRvIGFuaW1hdGUgd2hpbGUgcnVubmluZyB0aGUgbGF5b3V0XG4gIC8vIHRydWUgOiBBbmltYXRlIGNvbnRpbnVvdXNseSBhcyB0aGUgbGF5b3V0IGlzIHJ1bm5pbmdcbiAgLy8gZmFsc2UgOiBKdXN0IHNob3cgdGhlIGVuZCByZXN1bHRcbiAgLy8gJ2VuZCcgOiBBbmltYXRlIHdpdGggdGhlIGVuZCByZXN1bHQsIGZyb20gdGhlIGluaXRpYWwgcG9zaXRpb25zIHRvIHRoZSBlbmQgcG9zaXRpb25zXG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIEVhc2luZyBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25EdXJhdGlvbjogdW5kZWZpbmVkLFxuICAvLyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZFxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWRcbiAgLy8gTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIFRoZSBsYXlvdXQgYW5pbWF0ZXMgb25seSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBhbmltYXRlOnRydWVcbiAgLy8gKHByZXZlbnRzIGZsYXNoaW5nIG9uIGZhc3QgcnVucylcbiAgYW5pbWF0aW9uVGhyZXNob2xkOiAyNTAsXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaDogMjAsXG4gIC8vIFdoZXRoZXIgdG8gZml0IHRoZSBuZXR3b3JrIHZpZXcgYWZ0ZXIgd2hlbiBkb25lXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBvbiBmaXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIENvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBSYW5kb21pemUgdGhlIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBub2RlcyAodHJ1ZSkgb3IgdXNlIGV4aXN0aW5nIHBvc2l0aW9ucyAoZmFsc2UpXG4gIHJhbmRvbWl6ZTogZmFsc2UsXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZzogNDAsXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDIwNDg7XG4gIH0sXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlT3ZlcmxhcDogNCxcbiAgLy8gSWRlYWwgZWRnZSAobm9uIG5lc3RlZCkgbGVuZ3RoXG4gIGlkZWFsRWRnZUxlbmd0aDogZnVuY3Rpb24gaWRlYWxFZGdlTGVuZ3RoKGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eTogZnVuY3Rpb24gZWRnZUVsYXN0aWNpdHkoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAxLjIsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAxLFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMTAwMCxcbiAgLy8gSW5pdGlhbCB0ZW1wZXJhdHVyZSAobWF4aW11bSBub2RlIGRpc3BsYWNlbWVudClcbiAgaW5pdGlhbFRlbXA6IDEwMDAsXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3I6IDAuOTksXG4gIC8vIExvd2VyIHRlbXBlcmF0dXJlIHRocmVzaG9sZCAoYmVsb3cgdGhpcyBwb2ludCB0aGUgbGF5b3V0IHdpbGwgZW5kKVxuICBtaW5UZW1wOiAxLjBcbn07XG4vKipcbiAqIEBicmllZiAgICAgICA6IGNvbnN0cnVjdG9yXG4gKiBAYXJnIG9wdGlvbnMgOiBvYmplY3QgY29udGFpbmluZyBsYXlvdXQgb3B0aW9uc1xuICovXG5cbmZ1bmN0aW9uIENvc2VMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJGMsIG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMubGF5b3V0ID0gdGhpcztcbn1cbi8qKlxuICogQGJyaWVmIDogcnVucyB0aGUgbGF5b3V0XG4gKi9cblxuXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgbGF5b3V0LnN0b3BwZWQgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0c3RhcnQnLFxuICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICB9KTtcbiAgfSAvLyBTZXQgREVCVUcgLSBHbG9iYWwgdmFyaWFibGVcblxuXG4gIGlmICh0cnVlID09PSBvcHRpb25zLmRlYnVnKSB7XG4gICAgREVCVUcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIERFQlVHID0gZmFsc2U7XG4gIH0gLy8gSW5pdGlhbGl6ZSBsYXlvdXQgaW5mb1xuXG5cbiAgdmFyIGxheW91dEluZm8gPSBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpOyAvLyBTaG93IExheW91dEluZm8gY29udGVudHMgaWYgZGVidWdnaW5nXG5cbiAgaWYgKERFQlVHKSB7XG4gICAgcHJpbnRMYXlvdXRJbmZvKGxheW91dEluZm8pO1xuICB9IC8vIElmIHJlcXVpcmVkLCByYW5kb21pemUgbm9kZSBwb3NpdGlvbnNcblxuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIHJhbmRvbWl6ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbiAgfVxuXG4gIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuXG4gIHZhciByZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKTsgLy8gRml0IHRoZSBncmFwaCBpZiBuZWNlc3NhcnlcblxuICAgIGlmICh0cnVlID09PSBvcHRpb25zLmZpdCkge1xuICAgICAgY3kuZml0KG9wdGlvbnMucGFkZGluZyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBtYWluTG9vcCA9IGZ1bmN0aW9uIG1haW5Mb29wKGkpIHtcbiAgICBpZiAobGF5b3V0LnN0b3BwZWQgfHwgaSA+PSBvcHRpb25zLm51bUl0ZXIpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiTGF5b3V0IG1hbnVhbGx5IHN0b3BwZWQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIERvIG9uZSBzdGVwIGluIHRoZSBwaGlzaWNhbCBzaW11bGF0aW9uXG5cblxuICAgIHN0ZXAkMShsYXlvdXRJbmZvLCBvcHRpb25zKTsgLy8gVXBkYXRlIHRlbXBlcmF0dXJlXG5cbiAgICBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlID0gbGF5b3V0SW5mby50ZW1wZXJhdHVyZSAqIG9wdGlvbnMuY29vbGluZ0ZhY3RvcjsgLy8gbG9nRGVidWcoXCJOZXcgdGVtcGVyYXR1cmU6IFwiICsgbGF5b3V0SW5mby50ZW1wZXJhdHVyZSk7XG5cbiAgICBpZiAobGF5b3V0SW5mby50ZW1wZXJhdHVyZSA8IG9wdGlvbnMubWluVGVtcCkge1xuICAgICAgLy8gbG9nRGVidWcoXCJUZW1wZXJhdHVyZSBkcm9wIGJlbG93IG1pbmltdW0gdGhyZXNob2xkLiBTdG9wcGluZyBjb21wdXRhdGlvbiBpbiBzdGVwIFwiICsgaSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdmFyIGRvbmUgPSBmdW5jdGlvbiBkb25lKCkge1xuICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IHRydWUgfHwgb3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSkge1xuICAgICAgcmVmcmVzaCgpOyAvLyBMYXlvdXQgaGFzIGZpbmlzaGVkXG5cbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gICAgICB2YXIgZ2V0U2NhbGVkUG9zID0gZ2V0U2NhbGVJbkJvdW5kc0ZuKGxheW91dEluZm8sIG9wdGlvbnMsIG5vZGVzKTtcbiAgICAgIG5vZGVzLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFNjYWxlZFBvcyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxvb3BSZXQgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IHRydWUpIHtcbiAgICB2YXIgZnJhbWUgPSBmdW5jdGlvbiBmcmFtZSgpIHtcbiAgICAgIHZhciBmID0gMDtcblxuICAgICAgd2hpbGUgKGxvb3BSZXQgJiYgZiA8IG9wdGlvbnMucmVmcmVzaCkge1xuICAgICAgICBsb29wUmV0ID0gbWFpbkxvb3AoaSk7XG4gICAgICAgIGkrKztcbiAgICAgICAgZisrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxvb3BSZXQpIHtcbiAgICAgICAgLy8gaXQncyBkb25lXG4gICAgICAgIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG5cbiAgICAgICAgaWYgKG5vdyAtIHN0YXJ0VGltZSA+PSBvcHRpb25zLmFuaW1hdGlvblRocmVzaG9sZCkge1xuICAgICAgICAgIHJlZnJlc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZyYW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGxvb3BSZXQpIHtcbiAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gICAgZG9uZSgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuLyoqXG4gKiBAYnJpZWYgOiBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbiAqL1xuXG5cbkNvc2VMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3RvcHBlZCA9IHRydWU7XG5cbiAgaWYgKHRoaXMudGhyZWFkKSB7XG4gICAgdGhpcy50aHJlYWQuc3RvcCgpO1xuICB9XG5cbiAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuQ29zZUxheW91dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudGhyZWFkKSB7XG4gICAgdGhpcy50aHJlYWQuc3RvcCgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuLyoqXG4gKiBAYnJpZWYgICAgIDogQ3JlYXRlcyBhbiBvYmplY3Qgd2hpY2ggaXMgY29udGFpbnMgYWxsIHRoZSBkYXRhXG4gKiAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgbGF5b3V0IHByb2Nlc3NcbiAqIEBhcmcgY3kgICAgOiBjeXRvc2NhcGUuanMgb2JqZWN0XG4gKiBAcmV0dXJuICAgIDogbGF5b3V0SW5mbyBvYmplY3QgaW5pdGlhbGl6ZWRcbiAqL1xuXG5cbnZhciBjcmVhdGVMYXlvdXRJbmZvID0gZnVuY3Rpb24gY3JlYXRlTGF5b3V0SW5mbyhjeSwgbGF5b3V0LCBvcHRpb25zKSB7XG4gIC8vIFNob3J0Y3V0XG4gIHZhciBlZGdlcyA9IG9wdGlvbnMuZWxlcy5lZGdlcygpO1xuICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgdmFyIGxheW91dEluZm8gPSB7XG4gICAgaXNDb21wb3VuZDogY3kuaGFzQ29tcG91bmROb2RlcygpLFxuICAgIGxheW91dE5vZGVzOiBbXSxcbiAgICBpZFRvSW5kZXg6IHt9LFxuICAgIG5vZGVTaXplOiBub2Rlcy5zaXplKCksXG4gICAgZ3JhcGhTZXQ6IFtdLFxuICAgIGluZGV4VG9HcmFwaDogW10sXG4gICAgbGF5b3V0RWRnZXM6IFtdLFxuICAgIGVkZ2VTaXplOiBlZGdlcy5zaXplKCksXG4gICAgdGVtcGVyYXR1cmU6IG9wdGlvbnMuaW5pdGlhbFRlbXAsXG4gICAgY2xpZW50V2lkdGg6IGN5LndpZHRoKCksXG4gICAgY2xpZW50SGVpZ2h0OiBjeS53aWR0aCgpLFxuICAgIGJvdW5kaW5nQm94OiBtYWtlQm91bmRpbmdCb3gob3B0aW9ucy5ib3VuZGluZ0JveCA/IG9wdGlvbnMuYm91bmRpbmdCb3ggOiB7XG4gICAgICB4MTogMCxcbiAgICAgIHkxOiAwLFxuICAgICAgdzogY3kud2lkdGgoKSxcbiAgICAgIGg6IGN5LmhlaWdodCgpXG4gICAgfSlcbiAgfTtcbiAgdmFyIGNvbXBvbmVudHMgPSBvcHRpb25zLmVsZXMuY29tcG9uZW50cygpO1xuICB2YXIgaWQyY21wdElkID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRbal07XG4gICAgICBpZDJjbXB0SWRbbm9kZS5pZCgpXSA9IGk7XG4gICAgfVxuICB9IC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMsIGNyZWF0aW5nIGxheW91dCBub2Rlc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHRlbXBOb2RlID0ge307XG4gICAgdGVtcE5vZGUuaXNMb2NrZWQgPSBuLmxvY2tlZCgpO1xuICAgIHRlbXBOb2RlLmlkID0gbi5kYXRhKCdpZCcpO1xuICAgIHRlbXBOb2RlLnBhcmVudElkID0gbi5kYXRhKCdwYXJlbnQnKTtcbiAgICB0ZW1wTm9kZS5jbXB0SWQgPSBpZDJjbXB0SWRbbi5pZCgpXTtcbiAgICB0ZW1wTm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRlbXBOb2RlLnBvc2l0aW9uWCA9IG4ucG9zaXRpb24oJ3gnKTtcbiAgICB0ZW1wTm9kZS5wb3NpdGlvblkgPSBuLnBvc2l0aW9uKCd5Jyk7XG4gICAgdGVtcE5vZGUub2Zmc2V0WCA9IDA7XG4gICAgdGVtcE5vZGUub2Zmc2V0WSA9IDA7XG4gICAgdGVtcE5vZGUuaGVpZ2h0ID0gbmJiLnc7XG4gICAgdGVtcE5vZGUud2lkdGggPSBuYmIuaDtcbiAgICB0ZW1wTm9kZS5tYXhYID0gdGVtcE5vZGUucG9zaXRpb25YICsgdGVtcE5vZGUud2lkdGggLyAyO1xuICAgIHRlbXBOb2RlLm1pblggPSB0ZW1wTm9kZS5wb3NpdGlvblggLSB0ZW1wTm9kZS53aWR0aCAvIDI7XG4gICAgdGVtcE5vZGUubWF4WSA9IHRlbXBOb2RlLnBvc2l0aW9uWSArIHRlbXBOb2RlLmhlaWdodCAvIDI7XG4gICAgdGVtcE5vZGUubWluWSA9IHRlbXBOb2RlLnBvc2l0aW9uWSAtIHRlbXBOb2RlLmhlaWdodCAvIDI7XG4gICAgdGVtcE5vZGUucGFkTGVmdCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRSaWdodCA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcbiAgICB0ZW1wTm9kZS5wYWRUb3AgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkQm90dG9tID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpOyAvLyBmb3JjZXNcblxuICAgIHRlbXBOb2RlLm5vZGVSZXB1bHNpb24gPSBmbihvcHRpb25zLm5vZGVSZXB1bHNpb24pID8gb3B0aW9ucy5ub2RlUmVwdWxzaW9uKG4pIDogb3B0aW9ucy5ub2RlUmVwdWxzaW9uOyAvLyBBZGQgbmV3IG5vZGVcblxuICAgIGxheW91dEluZm8ubGF5b3V0Tm9kZXMucHVzaCh0ZW1wTm9kZSk7IC8vIEFkZCBlbnRyeSB0byBpZC1pbmRleCBtYXBcblxuICAgIGxheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLmlkXSA9IGk7XG4gIH0gLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuXG5cbiAgdmFyIHF1ZXVlID0gW107XG4gIHZhciBzdGFydCA9IDA7IC8vIFBvaW50cyB0byB0aGUgc3RhcnQgdGhlIHF1ZXVlXG5cbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcblxuICB2YXIgdGVtcEdyYXBoID0gW107IC8vIFNlY29uZCBwYXNzIHRvIGFkZCBjaGlsZCBpbmZvcm1hdGlvbiBhbmRcbiAgLy8gaW5pdGlhbGl6ZSBxdWV1ZSBmb3IgaGllcmFyY2hpY2FsIHRyYXZlcnNhbFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIHZhciBwX2lkID0gbi5wYXJlbnRJZDsgLy8gQ2hlY2sgaWYgbm9kZSBuIGhhcyBhIHBhcmVudCBub2RlXG5cbiAgICBpZiAobnVsbCAhPSBwX2lkKSB7XG4gICAgICAvLyBBZGQgbm9kZSBJZCB0byBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuXG4gICAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3BfaWRdXS5jaGlsZHJlbi5wdXNoKG4uaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBhIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LCB0aGVuIGl0J3MgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgICAgIHF1ZXVlWysrZW5kXSA9IG4uaWQ7XG4gICAgICB0ZW1wR3JhcGgucHVzaChuLmlkKTtcbiAgICB9XG4gIH0gLy8gQWRkIHJvb3QgZ3JhcGggdG8gZ3JhcGhTZXRcblxuXG4gIGxheW91dEluZm8uZ3JhcGhTZXQucHVzaCh0ZW1wR3JhcGgpOyAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuXG4gIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAvLyBHZXQgdGhlIG5vZGUgdG8gdmlzaXQgYW5kIHJlbW92ZSBpdCBmcm9tIHF1ZXVlXG4gICAgdmFyIG5vZGVfaWQgPSBxdWV1ZVtzdGFydCsrXTtcbiAgICB2YXIgbm9kZV9peCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVfaWRdO1xuICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tub2RlX2l4XTtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFkZCBjaGlsZHJlbiBub2RlcyBhcyBhIG5ldyBncmFwaCB0byBncmFwaCBzZXRcbiAgICAgIGxheW91dEluZm8uZ3JhcGhTZXQucHVzaChjaGlsZHJlbik7IC8vIEFkZCBjaGlsZHJlbiB0byBxdWUgcXVldWUgdG8gYmUgdmlzaXRlZFxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHF1ZXVlWysrZW5kXSA9IGNoaWxkcmVuW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDcmVhdGUgaW5kZXhUb0dyYXBoIG1hcFxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmdyYXBoU2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtpXTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JhcGgubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBpbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXTtcbiAgICAgIGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2luZGV4XSA9IGk7XG4gICAgfVxuICB9IC8vIEl0ZXJhdGUgb3ZlciBhbGwgZWRnZXMsIGNyZWF0aW5nIExheW91dCBFZGdlc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmVkZ2VTaXplOyBpKyspIHtcbiAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgIHZhciB0ZW1wRWRnZSA9IHt9O1xuICAgIHRlbXBFZGdlLmlkID0gZS5kYXRhKCdpZCcpO1xuICAgIHRlbXBFZGdlLnNvdXJjZUlkID0gZS5kYXRhKCdzb3VyY2UnKTtcbiAgICB0ZW1wRWRnZS50YXJnZXRJZCA9IGUuZGF0YSgndGFyZ2V0Jyk7IC8vIENvbXB1dGUgaWRlYWwgbGVuZ3RoXG5cbiAgICB2YXIgaWRlYWxMZW5ndGggPSBmbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkgPyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aChlKSA6IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO1xuICAgIHZhciBlbGFzdGljaXR5ID0gZm4ob3B0aW9ucy5lZGdlRWxhc3RpY2l0eSkgPyBvcHRpb25zLmVkZ2VFbGFzdGljaXR5KGUpIDogb3B0aW9ucy5lZGdlRWxhc3RpY2l0eTsgLy8gQ2hlY2sgaWYgaXQncyBhbiBpbnRlciBncmFwaCBlZGdlXG5cbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wRWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcEVkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciBzb3VyY2VHcmFwaCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW3NvdXJjZUl4XTtcbiAgICB2YXIgdGFyZ2V0R3JhcGggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFt0YXJnZXRJeF07XG5cbiAgICBpZiAoc291cmNlR3JhcGggIT0gdGFyZ2V0R3JhcGgpIHtcbiAgICAgIC8vIEZpbmQgbG93ZXN0IGNvbW1vbiBncmFwaCBhbmNlc3RvclxuICAgICAgdmFyIGxjYSA9IGZpbmRMQ0EodGVtcEVkZ2Uuc291cmNlSWQsIHRlbXBFZGdlLnRhcmdldElkLCBsYXlvdXRJbmZvKTsgLy8gQ29tcHV0ZSBzdW0gb2Ygbm9kZSBkZXB0aHMsIHJlbGF0aXZlIHRvIGxjYSBncmFwaFxuXG4gICAgICB2YXIgbGNhR3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2xjYV07XG4gICAgICB2YXIgZGVwdGggPSAwOyAvLyBTb3VyY2UgZGVwdGhcblxuICAgICAgdmFyIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG5cbiAgICAgIHdoaWxlICgtMSA9PT0gbGNhR3JhcGguaW5kZXhPZih0ZW1wTm9kZS5pZCkpIHtcbiAgICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLnBhcmVudElkXV07XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9IC8vIFRhcmdldCBkZXB0aFxuXG5cbiAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1t0YXJnZXRJeF07XG5cbiAgICAgIHdoaWxlICgtMSA9PT0gbGNhR3JhcGguaW5kZXhPZih0ZW1wTm9kZS5pZCkpIHtcbiAgICAgICAgdGVtcE5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3RlbXBOb2RlLnBhcmVudElkXV07XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9IC8vIGxvZ0RlYnVnKCdMQ0Egb2Ygbm9kZXMgJyArIHRlbXBFZGdlLnNvdXJjZUlkICsgJyBhbmQgJyArIHRlbXBFZGdlLnRhcmdldElkICtcbiAgICAgIC8vICBcIi4gSW5kZXg6IFwiICsgbGNhICsgXCIgQ29udGVudHM6IFwiICsgbGNhR3JhcGgudG9TdHJpbmcoKSArXG4gICAgICAvLyAgXCIuIERlcHRoOiBcIiArIGRlcHRoKTtcbiAgICAgIC8vIFVwZGF0ZSBpZGVhbExlbmd0aFxuXG5cbiAgICAgIGlkZWFsTGVuZ3RoICo9IGRlcHRoICogb3B0aW9ucy5uZXN0aW5nRmFjdG9yO1xuICAgIH1cblxuICAgIHRlbXBFZGdlLmlkZWFsTGVuZ3RoID0gaWRlYWxMZW5ndGg7XG4gICAgdGVtcEVkZ2UuZWxhc3RpY2l0eSA9IGVsYXN0aWNpdHk7XG4gICAgbGF5b3V0SW5mby5sYXlvdXRFZGdlcy5wdXNoKHRlbXBFZGdlKTtcbiAgfSAvLyBGaW5hbGx5LCByZXR1cm4gbGF5b3V0SW5mbyBvYmplY3RcblxuXG4gIHJldHVybiBsYXlvdXRJbmZvO1xufTtcbi8qKlxuICogQGJyaWVmIDogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgaW5kZXggb2YgdGhlIGxvd2VzdCBjb21tb25cbiAqICAgICAgICAgIGdyYXBoIGFuY2VzdG9yIGJldHdlZW4gMiBub2RlcyBpbiB0aGUgc3VidHJlZVxuICogICAgICAgICAgKGZyb20gdGhlIGdyYXBoIGhpZXJhcmNoeSBpbmR1Y2VkIHRyZWUpIHdob3NlXG4gKiAgICAgICAgICByb290IGlzIGdyYXBoSXhcbiAqXG4gKiBAYXJnIG5vZGUxOiBub2RlMSdzIElEXG4gKiBAYXJnIG5vZGUyOiBub2RlMidzIElEXG4gKiBAYXJnIGxheW91dEluZm86IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICovXG5cblxudmFyIGZpbmRMQ0EgPSBmdW5jdGlvbiBmaW5kTENBKG5vZGUxLCBub2RlMiwgbGF5b3V0SW5mbykge1xuICAvLyBGaW5kIHRoZWlyIGNvbW1vbiBhbmNlc3Rlciwgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCBncmFwaFxuICB2YXIgcmVzID0gZmluZExDQV9hdXgobm9kZTEsIG5vZGUyLCAwLCBsYXlvdXRJbmZvKTtcblxuICBpZiAoMiA+IHJlcy5jb3VudCkge1xuICAgIC8vIElmIGF1eCBmdW5jdGlvbiBjb3VsZG4ndCBmaW5kIHRoZSBjb21tb24gYW5jZXN0ZXIsXG4gICAgLy8gdGhlbiBpdCBpcyB0aGUgcm9vdCBncmFwaFxuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXMuZ3JhcGg7XG4gIH1cbn07XG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IEF1eGlsaWFyeSBmdW5jdGlvbiB1c2VkIGZvciBMQ0EgY29tcHV0YXRpb25cbiAqXG4gKiBAYXJnIG5vZGUxICAgICAgOiBub2RlMSdzIElEXG4gKiBAYXJnIG5vZGUyICAgICAgOiBub2RlMidzIElEXG4gKiBAYXJnIGdyYXBoSXggICAgOiBzdWJncmFwaCBpbmRleFxuICogQGFyZyBsYXlvdXRJbmZvIDogbGF5b3V0SW5mbyBvYmplY3RcbiAqXG4gKiBAcmV0dXJuICAgICAgICAgOiBvYmplY3Qgb2YgdGhlIGZvcm0ge2NvdW50OiBYLCBncmFwaDogWX0sIHdoZXJlOlxuICogICAgICAgICAgICAgICAgICAgWCBpcyB0aGUgbnVtYmVyIG9mIGFuY2VzdGVycyAobWF4OiAyKSBmb3VuZCBpblxuICogICAgICAgICAgICAgICAgICAgZ3JhcGhJeCAoYW5kIGl0J3Mgc3ViZ3JhcGhzKSxcbiAqICAgICAgICAgICAgICAgICAgIFkgaXMgdGhlIGdyYXBoIGluZGV4IG9mIHRoZSBsb3dlc3QgZ3JhcGggY29udGFpbmluZ1xuICogICAgICAgICAgICAgICAgICAgYWxsIFggbm9kZXNcbiAqL1xuXG5cbnZhciBmaW5kTENBX2F1eCA9IGZ1bmN0aW9uIGZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgZ3JhcGhJeCwgbGF5b3V0SW5mbykge1xuICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2dyYXBoSXhdOyAvLyBJZiBib3RoIG5vZGVzIGJlbG9uZ3MgdG8gZ3JhcGhJeFxuXG4gIGlmICgtMSA8IGdyYXBoLmluZGV4T2Yobm9kZTEpICYmIC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY291bnQ6IDIsXG4gICAgICBncmFwaDogZ3JhcGhJeFxuICAgIH07XG4gIH0gLy8gTWFrZSByZWN1cnNpdmUgY2FsbHMgZm9yIGFsbCBzdWJncmFwaHNcblxuXG4gIHZhciBjID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYXBoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGVJZCA9IGdyYXBoW2ldO1xuICAgIHZhciBub2RlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlSWRdO1xuICAgIHZhciBjaGlsZHJlbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZUl4XS5jaGlsZHJlbjsgLy8gSWYgdGhlIG5vZGUgaGFzIG5vIGNoaWxkLCBza2lwIGl0XG5cbiAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRHcmFwaEl4ID0gbGF5b3V0SW5mby5pbmRleFRvR3JhcGhbbGF5b3V0SW5mby5pZFRvSW5kZXhbY2hpbGRyZW5bMF1dXTtcbiAgICB2YXIgcmVzdWx0ID0gZmluZExDQV9hdXgobm9kZTEsIG5vZGUyLCBjaGlsZEdyYXBoSXgsIGxheW91dEluZm8pO1xuXG4gICAgaWYgKDAgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gTmVpdGhlciBub2RlMSBub3Igbm9kZTIgYXJlIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICgxID09PSByZXN1bHQuY291bnQpIHtcbiAgICAgIC8vIE9uZSBvZiAobm9kZTEsIG5vZGUyKSBpcyBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIGMrKztcblxuICAgICAgaWYgKDIgPT09IGMpIHtcbiAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBmb3VuZCBib3RoIG5vZGVzLCBubyBuZWVkIHRvIGtlZXAgc2VhcmNoaW5nXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIG5vZGVzIGFyZSBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb3VudDogYyxcbiAgICBncmFwaDogZ3JhcGhJeFxuICB9O1xufTtcbi8qKlxuICogQGJyaWVmOiBwcmludHNMYXlvdXRJbmZvIGludG8ganMgY29uc29sZVxuICogICAgICAgICBPbmx5IHVzZWQgZm9yIGRlYmJ1Z2luZ1xuICovXG5cblxuaWYgKGZhbHNlKSB7XG4gIHZhciBwcmludExheW91dEluZm87XG59XG4vKipcbiAqIEBicmllZiA6IFJhbmRvbWl6ZXMgdGhlIHBvc2l0aW9uIG9mIGFsbCBub2Rlc1xuICovXG5cblxudmFyIHJhbmRvbWl6ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJhbmRvbWl6ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSkge1xuICB2YXIgd2lkdGggPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07IC8vIE5vIG5lZWQgdG8gcmFuZG9taXplIGNvbXBvdW5kIG5vZGVzIG9yIGxvY2tlZCBub2Rlc1xuXG4gICAgaWYgKDAgPT09IG4uY2hpbGRyZW4ubGVuZ3RoICYmICFuLmlzTG9ja2VkKSB7XG4gICAgICBuLnBvc2l0aW9uWCA9IE1hdGgucmFuZG9tKCkgKiB3aWR0aDtcbiAgICAgIG4ucG9zaXRpb25ZID0gTWF0aC5yYW5kb20oKSAqIGhlaWdodDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBnZXRTY2FsZUluQm91bmRzRm4gPSBmdW5jdGlvbiBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpIHtcbiAgdmFyIGJiID0gbGF5b3V0SW5mby5ib3VuZGluZ0JveDtcbiAgdmFyIGNvc2VCQiA9IHtcbiAgICB4MTogSW5maW5pdHksXG4gICAgeDI6IC1JbmZpbml0eSxcbiAgICB5MTogSW5maW5pdHksXG4gICAgeTI6IC1JbmZpbml0eVxuICB9O1xuXG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlLmRhdGEoJ2lkJyldXTtcbiAgICAgIGNvc2VCQi54MSA9IE1hdGgubWluKGNvc2VCQi54MSwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi54MiA9IE1hdGgubWF4KGNvc2VCQi54MiwgbG5vZGUucG9zaXRpb25YKTtcbiAgICAgIGNvc2VCQi55MSA9IE1hdGgubWluKGNvc2VCQi55MSwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICAgIGNvc2VCQi55MiA9IE1hdGgubWF4KGNvc2VCQi55MiwgbG5vZGUucG9zaXRpb25ZKTtcbiAgICB9KTtcbiAgICBjb3NlQkIudyA9IGNvc2VCQi54MiAtIGNvc2VCQi54MTtcbiAgICBjb3NlQkIuaCA9IGNvc2VCQi55MiAtIGNvc2VCQi55MTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtlbGUuZGF0YSgnaWQnKV1dO1xuXG4gICAgaWYgKG9wdGlvbnMuYm91bmRpbmdCb3gpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGV4dHJhIGJvdW5kaW5nIGJveCBjb25zdHJhaW50XG4gICAgICB2YXIgcGN0WCA9IChsbm9kZS5wb3NpdGlvblggLSBjb3NlQkIueDEpIC8gY29zZUJCLnc7XG4gICAgICB2YXIgcGN0WSA9IChsbm9kZS5wb3NpdGlvblkgLSBjb3NlQkIueTEpIC8gY29zZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHBjdFggKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHBjdFkgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBsbm9kZS5wb3NpdGlvblgsXG4gICAgICAgIHk6IGxub2RlLnBvc2l0aW9uWVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBVcGRhdGVzIHRoZSBwb3NpdGlvbnMgb2Ygbm9kZXMgaW4gdGhlIG5ldHdvcmtcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG5cblxudmFyIHJlZnJlc2hQb3NpdGlvbnMgPSBmdW5jdGlvbiByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gJ1JlZnJlc2hpbmcgcG9zaXRpb25zJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIHZhciBsYXlvdXQgPSBvcHRpb25zLmxheW91dDtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICBub2Rlcy5wb3NpdGlvbnMoZ2V0U2NhbGVkUG9zKTsgLy8gVHJpZ2dlciBsYXlvdXRSZWFkeSBvbmx5IG9uIGZpcnN0IGNhbGxcblxuICBpZiAodHJ1ZSAhPT0gbGF5b3V0SW5mby5yZWFkeSkge1xuICAgIC8vIHMgPSAnVHJpZ2dlcmluZyBsYXlvdXRyZWFkeSc7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgbGF5b3V0SW5mby5yZWFkeSA9IHRydWU7XG4gICAgbGF5b3V0Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICBsYXlvdXQuZW1pdCh7XG4gICAgICB0eXBlOiAnbGF5b3V0cmVhZHknLFxuICAgICAgbGF5b3V0OiB0aGlzXG4gICAgfSk7XG4gIH1cbn07XG4vKipcbiAqIEBicmllZiA6IExvZ3MgYSBkZWJ1ZyBtZXNzYWdlIGluIEpTIGNvbnNvbGUsIGlmIERFQlVHIGlzIE9OXG4gKi9cbi8vIHZhciBsb2dEZWJ1ZyA9IGZ1bmN0aW9uKHRleHQpIHtcbi8vICAgaWYgKERFQlVHKSB7XG4vLyAgICAgY29uc29sZS5kZWJ1Zyh0ZXh0KTtcbi8vICAgfVxuLy8gfTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBQZXJmb3JtcyBvbmUgaXRlcmF0aW9uIG9mIHRoZSBwaHlzaWNhbCBzaW11bGF0aW9uXG4gKiBAYXJnIGxheW91dEluZm8gOiBMYXlvdXRJbmZvIG9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG5cblxudmFyIHN0ZXAkMSA9IGZ1bmN0aW9uIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucywgX3N0ZXApIHtcbiAgLy8gdmFyIHMgPSBcIlxcblxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcIjtcbiAgLy8gcyArPSBcIlxcblNURVA6IFwiICsgc3RlcDtcbiAgLy8gcyArPSBcIlxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcXG5cIjtcbiAgLy8gbG9nRGVidWcocyk7XG4gIC8vIENhbGN1bGF0ZSBub2RlIHJlcHVsc2lvbnNcbiAgY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTsgLy8gQ2FsY3VsYXRlIGVkZ2UgZm9yY2VzXG5cbiAgY2FsY3VsYXRlRWRnZUZvcmNlcyhsYXlvdXRJbmZvKTsgLy8gQ2FsY3VsYXRlIGdyYXZpdHkgZm9yY2VzXG5cbiAgY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKTsgLy8gUHJvcGFnYXRlIGZvcmNlcyBmcm9tIHBhcmVudCB0byBjaGlsZFxuXG4gIHByb3BhZ2F0ZUZvcmNlcyhsYXlvdXRJbmZvKTsgLy8gVXBkYXRlIHBvc2l0aW9ucyBiYXNlZCBvbiBjYWxjdWxhdGVkIGZvcmNlc1xuXG4gIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbn07XG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIHRoZSBub2RlIHJlcHVsc2lvbiBmb3JjZXNcbiAqL1xuXG5cbnZhciBjYWxjdWxhdGVOb2RlRm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlTm9kZUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZ3JhcGhzIGluIGdyYXBoU2V0XG4gIC8vIE5vZGVzIG9ubHkgcmVwZWwgZWFjaCBvdGhlciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBncmFwaFxuICAvLyB2YXIgcyA9ICdjYWxjdWxhdGVOb2RlRm9yY2VzJztcbiAgLy8gbG9nRGVidWcocyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoOyAvLyBzID0gXCJTZXQ6IFwiICsgZ3JhcGgudG9TdHJpbmcoKTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICAvLyBOb3cgZ2V0IGFsbCB0aGUgcGFpcnMgb2Ygbm9kZXNcbiAgICAvLyBPbmx5IGdldCBlYWNoIHBhaXIgb25jZSwgKEEsIEIpID0gKEIsIEEpXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgIHZhciBub2RlMSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbZ3JhcGhbal1dXTtcblxuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgbnVtTm9kZXM7IGsrKykge1xuICAgICAgICB2YXIgbm9kZTIgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2tdXV07XG4gICAgICAgIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciByYW5kb21EaXN0YW5jZSA9IGZ1bmN0aW9uIHJhbmRvbURpc3RhbmNlKG1heCkge1xuICByZXR1cm4gLW1heCArIDIgKiBtYXggKiBNYXRoLnJhbmRvbSgpO1xufTtcbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZSB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzIGJldHdlZW4gYSBwYWlyIG9mIG5vZGVzXG4gKi9cblxuXG52YXIgbm9kZVJlcHVsc2lvbiA9IGZ1bmN0aW9uIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gXCJOb2RlIHJlcHVsc2lvbi4gTm9kZTE6IFwiICsgbm9kZTEuaWQgKyBcIiBOb2RlMjogXCIgKyBub2RlMi5pZDtcbiAgdmFyIGNtcHRJZDEgPSBub2RlMS5jbXB0SWQ7XG4gIHZhciBjbXB0SWQyID0gbm9kZTIuY21wdElkO1xuXG4gIGlmIChjbXB0SWQxICE9PSBjbXB0SWQyICYmICFsYXlvdXRJbmZvLmlzQ29tcG91bmQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcblxuXG4gIHZhciBkaXJlY3Rpb25YID0gbm9kZTIucG9zaXRpb25YIC0gbm9kZTEucG9zaXRpb25YO1xuICB2YXIgZGlyZWN0aW9uWSA9IG5vZGUyLnBvc2l0aW9uWSAtIG5vZGUxLnBvc2l0aW9uWTtcbiAgdmFyIG1heFJhbmREaXN0ID0gMTsgLy8gcyArPSBcIlxcbmRpcmVjdGlvblg6IFwiICsgZGlyZWN0aW9uWCArIFwiLCBkaXJlY3Rpb25ZOiBcIiArIGRpcmVjdGlvblk7XG4gIC8vIElmIGJvdGggY2VudGVycyBhcmUgdGhlIHNhbWUsIGFwcGx5IGEgcmFuZG9tIGZvcmNlXG5cbiAgaWYgKDAgPT09IGRpcmVjdGlvblggJiYgMCA9PT0gZGlyZWN0aW9uWSkge1xuICAgIGRpcmVjdGlvblggPSByYW5kb21EaXN0YW5jZShtYXhSYW5kRGlzdCk7XG4gICAgZGlyZWN0aW9uWSA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgfVxuXG4gIHZhciBvdmVybGFwID0gbm9kZXNPdmVybGFwKG5vZGUxLCBub2RlMiwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG5cbiAgaWYgKG92ZXJsYXAgPiAwKSB7XG4gICAgLy8gcyArPSBcIlxcbk5vZGVzIERPIG92ZXJsYXAuXCI7XG4gICAgLy8gcyArPSBcIlxcbk92ZXJsYXA6IFwiICsgb3ZlcmxhcDtcbiAgICAvLyBJZiBub2RlcyBvdmVybGFwLCByZXB1bHNpb24gZm9yY2UgaXMgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gdGhlIG92ZXJsYXBcbiAgICB2YXIgZm9yY2UgPSBvcHRpb25zLm5vZGVPdmVybGFwICogb3ZlcmxhcDsgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcblxuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXJlY3Rpb25YICogZGlyZWN0aW9uWCArIGRpcmVjdGlvblkgKiBkaXJlY3Rpb25ZKTsgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuXG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlyZWN0aW9uWCAvIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVkgPSBmb3JjZSAqIGRpcmVjdGlvblkgLyBkaXN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgZG8gTk9UIG92ZXJsYXAuXCI7XG4gICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwLCBmb3JjZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsXG4gICAgLy8gdG8gc3F1YXJlZCBkaXN0YW5jZVxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQobm9kZTEsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICAgIHZhciBwb2ludDIgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMiwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpOyAvLyBVc2UgY2xpcHBpbmcgcG9pbnRzIHRvIGNvbXB1dGUgZGlzdGFuY2VcblxuICAgIHZhciBkaXN0YW5jZVggPSBwb2ludDIueCAtIHBvaW50MS54O1xuICAgIHZhciBkaXN0YW5jZVkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBkaXN0YW5jZVNxciA9IGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWTtcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXIpOyAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgZGlzdGFuY2U7XG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcblxuICAgIHZhciBmb3JjZSA9IChub2RlMS5ub2RlUmVwdWxzaW9uICsgbm9kZTIubm9kZVJlcHVsc2lvbikgLyBkaXN0YW5jZVNxcjtcbiAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBkaXN0YW5jZVggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcbiAgfSAvLyBBcHBseSBmb3JjZVxuXG5cbiAgaWYgKCFub2RlMS5pc0xvY2tlZCkge1xuICAgIG5vZGUxLm9mZnNldFggLT0gZm9yY2VYO1xuICAgIG5vZGUxLm9mZnNldFkgLT0gZm9yY2VZO1xuICB9XG5cbiAgaWYgKCFub2RlMi5pc0xvY2tlZCkge1xuICAgIG5vZGUyLm9mZnNldFggKz0gZm9yY2VYO1xuICAgIG5vZGUyLm9mZnNldFkgKz0gZm9yY2VZO1xuICB9IC8vIHMgKz0gXCJcXG5Gb3JjZVg6IFwiICsgZm9yY2VYICsgXCIgRm9yY2VZOiBcIiArIGZvcmNlWTtcbiAgLy8gbG9nRGVidWcocyk7XG5cblxuICByZXR1cm47XG59O1xuLyoqXG4gKiBAYnJpZWYgIDogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBub2RlcyBvdmVybGFwIG9yIG5vdFxuICogQHJldHVybiA6IEFtb3VudCBvZiBvdmVybGFwcGluZyAoMCA9PiBubyBvdmVybGFwKVxuICovXG5cblxudmFyIG5vZGVzT3ZlcmxhcCA9IGZ1bmN0aW9uIG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRYLCBkWSkge1xuICBpZiAoZFggPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTEubWF4WCAtIG5vZGUyLm1pblg7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBYID0gbm9kZTIubWF4WCAtIG5vZGUxLm1pblg7XG4gIH1cblxuICBpZiAoZFkgPiAwKSB7XG4gICAgdmFyIG92ZXJsYXBZID0gbm9kZTEubWF4WSAtIG5vZGUyLm1pblk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG92ZXJsYXBZID0gbm9kZTIubWF4WSAtIG5vZGUxLm1pblk7XG4gIH1cblxuICBpZiAob3ZlcmxhcFggPj0gMCAmJiBvdmVybGFwWSA+PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChvdmVybGFwWCAqIG92ZXJsYXBYICsgb3ZlcmxhcFkgKiBvdmVybGFwWSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG4vKipcbiAqIEBicmllZiA6IEZpbmRzIHRoZSBwb2ludCBpbiB3aGljaCBhbiBlZGdlIChkaXJlY3Rpb24gZFgsIGRZKSBpbnRlcnNlY3RzXG4gKiAgICAgICAgICB0aGUgcmVjdGFuZ3VsYXIgYm91bmRpbmcgYm94IG9mIGl0J3Mgc291cmNlL3RhcmdldCBub2RlXG4gKi9cblxuXG52YXIgZmluZENsaXBwaW5nUG9pbnQgPSBmdW5jdGlvbiBmaW5kQ2xpcHBpbmdQb2ludChub2RlLCBkWCwgZFkpIHtcbiAgLy8gU2hvcmN1dHNcbiAgdmFyIFggPSBub2RlLnBvc2l0aW9uWDtcbiAgdmFyIFkgPSBub2RlLnBvc2l0aW9uWTtcbiAgdmFyIEggPSBub2RlLmhlaWdodCB8fCAxO1xuICB2YXIgVyA9IG5vZGUud2lkdGggfHwgMTtcbiAgdmFyIGRpclNsb3BlID0gZFkgLyBkWDtcbiAgdmFyIG5vZGVTbG9wZSA9IEggLyBXOyAvLyB2YXIgcyA9ICdDb21wdXRpbmcgY2xpcHBpbmcgcG9pbnQgb2Ygbm9kZSAnICsgbm9kZS5pZCArXG4gIC8vICAgXCIgLiBIZWlnaHQ6ICBcIiArIEggKyBcIiwgV2lkdGg6IFwiICsgVyArXG4gIC8vICAgXCJcXG5EaXJlY3Rpb24gXCIgKyBkWCArIFwiLCBcIiArIGRZO1xuICAvL1xuICAvLyBDb21wdXRlIGludGVyc2VjdGlvblxuXG4gIHZhciByZXMgPSB7fTsgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uICh1cClcblxuICBpZiAoMCA9PT0gZFggJiYgMCA8IGRZKSB7XG4gICAgcmVzLnggPSBYOyAvLyBzICs9IFwiXFxuVXAgZGlyZWN0aW9uXCI7XG5cbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIENhc2U6IFZlcnRpY2FsIGRpcmVjdGlvbiAoZG93bilcblxuXG4gIGlmICgwID09PSBkWCAmJiAwID4gZFkpIHtcbiAgICByZXMueCA9IFg7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7IC8vIHMgKz0gXCJcXG5Eb3duIGRpcmVjdGlvblwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSByaWdodCBib3JkZXJcblxuXG4gIGlmICgwIDwgZFggJiYgLTEgKiBub2RlU2xvcGUgPD0gZGlyU2xvcGUgJiYgZGlyU2xvcGUgPD0gbm9kZVNsb3BlKSB7XG4gICAgcmVzLnggPSBYICsgVyAvIDI7XG4gICAgcmVzLnkgPSBZICsgVyAqIGRZIC8gMiAvIGRYOyAvLyBzICs9IFwiXFxuUmlnaHRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH0gLy8gQ2FzZTogSW50ZXJzZWN0cyB0aGUgbGVmdCBib3JkZXJcblxuXG4gIGlmICgwID4gZFggJiYgLTEgKiBub2RlU2xvcGUgPD0gZGlyU2xvcGUgJiYgZGlyU2xvcGUgPD0gbm9kZVNsb3BlKSB7XG4gICAgcmVzLnggPSBYIC0gVyAvIDI7XG4gICAgcmVzLnkgPSBZIC0gVyAqIGRZIC8gMiAvIGRYOyAvLyBzICs9IFwiXFxuTGVmdGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSB0b3AgYm9yZGVyXG5cblxuICBpZiAoMCA8IGRZICYmIChkaXJTbG9wZSA8PSAtMSAqIG5vZGVTbG9wZSB8fCBkaXJTbG9wZSA+PSBub2RlU2xvcGUpKSB7XG4gICAgcmVzLnggPSBYICsgSCAqIGRYIC8gMiAvIGRZO1xuICAgIHJlcy55ID0gWSArIEggLyAyOyAvLyBzICs9IFwiXFxuVG9wIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBib3R0b20gYm9yZGVyXG5cblxuICBpZiAoMCA+IGRZICYmIChkaXJTbG9wZSA8PSAtMSAqIG5vZGVTbG9wZSB8fCBkaXJTbG9wZSA+PSBub2RlU2xvcGUpKSB7XG4gICAgcmVzLnggPSBYIC0gSCAqIGRYIC8gMiAvIGRZO1xuICAgIHJlcy55ID0gWSAtIEggLyAyOyAvLyBzICs9IFwiXFxuQm90dG9tIGJvcmRlclwiO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSAvLyBzICs9IFwiXFxuQ2xpcHBpbmcgcG9pbnQgZm91bmQgYXQgXCIgKyByZXMueCArIFwiLCBcIiArIHJlcy55O1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuXG4gIHJldHVybiByZXM7XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBDYWxjdWxhdGVzIGFsbCBlZGdlIGZvcmNlc1xuICovXG5cblxudmFyIGNhbGN1bGF0ZUVkZ2VGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIC8vIEdldCBlZGdlLCBzb3VyY2UgJiB0YXJnZXQgbm9kZXNcbiAgICB2YXIgZWRnZSA9IGxheW91dEluZm8ubGF5b3V0RWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHNvdXJjZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W2VkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciB0YXJnZXQgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTsgLy8gR2V0IGRpcmVjdGlvbiBvZiBsaW5lIGNvbm5lY3RpbmcgYm90aCBub2RlIGNlbnRlcnNcblxuICAgIHZhciBkaXJlY3Rpb25YID0gdGFyZ2V0LnBvc2l0aW9uWCAtIHNvdXJjZS5wb3NpdGlvblg7XG4gICAgdmFyIGRpcmVjdGlvblkgPSB0YXJnZXQucG9zaXRpb25ZIC0gc291cmNlLnBvc2l0aW9uWTsgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgZG8gbm90aGluZy5cbiAgICAvLyBBIHJhbmRvbSBmb3JjZSBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYXMgbm9kZSByZXB1bHNpb25cblxuICAgIGlmICgwID09PSBkaXJlY3Rpb25YICYmIDAgPT09IGRpcmVjdGlvblkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gR2V0IGNsaXBwaW5nIHBvaW50cyBmb3IgYm90aCBub2Rlc1xuXG5cbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQoc291cmNlLCBkaXJlY3Rpb25YLCBkaXJlY3Rpb25ZKTtcbiAgICB2YXIgcG9pbnQyID0gZmluZENsaXBwaW5nUG9pbnQodGFyZ2V0LCAtMSAqIGRpcmVjdGlvblgsIC0xICogZGlyZWN0aW9uWSk7XG4gICAgdmFyIGx4ID0gcG9pbnQyLnggLSBwb2ludDEueDtcbiAgICB2YXIgbHkgPSBwb2ludDIueSAtIHBvaW50MS55O1xuICAgIHZhciBsID0gTWF0aC5zcXJ0KGx4ICogbHggKyBseSAqIGx5KTtcbiAgICB2YXIgZm9yY2UgPSBNYXRoLnBvdyhlZGdlLmlkZWFsTGVuZ3RoIC0gbCwgMikgLyBlZGdlLmVsYXN0aWNpdHk7XG5cbiAgICBpZiAoMCAhPT0gbCkge1xuICAgICAgdmFyIGZvcmNlWCA9IGZvcmNlICogbHggLyBsO1xuICAgICAgdmFyIGZvcmNlWSA9IGZvcmNlICogbHkgLyBsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZm9yY2VYID0gMDtcbiAgICAgIHZhciBmb3JjZVkgPSAwO1xuICAgIH0gLy8gQWRkIHRoaXMgZm9yY2UgdG8gdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXNcblxuXG4gICAgaWYgKCFzb3VyY2UuaXNMb2NrZWQpIHtcbiAgICAgIHNvdXJjZS5vZmZzZXRYICs9IGZvcmNlWDtcbiAgICAgIHNvdXJjZS5vZmZzZXRZICs9IGZvcmNlWTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldC5pc0xvY2tlZCkge1xuICAgICAgdGFyZ2V0Lm9mZnNldFggLT0gZm9yY2VYO1xuICAgICAgdGFyZ2V0Lm9mZnNldFkgLT0gZm9yY2VZO1xuICAgIH0gLy8gdmFyIHMgPSAnRWRnZSBmb3JjZSBiZXR3ZWVuIG5vZGVzICcgKyBzb3VyY2UuaWQgKyAnIGFuZCAnICsgdGFyZ2V0LmlkO1xuICAgIC8vIHMgKz0gXCJcXG5EaXN0YW5jZTogXCIgKyBsICsgXCIgRm9yY2U6IChcIiArIGZvcmNlWCArIFwiLCBcIiArIGZvcmNlWSArIFwiKVwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIH1cbn07XG4vKipcbiAqIEBicmllZiA6IENvbXB1dGVzIGdyYXZpdHkgZm9yY2VzIGZvciBhbGwgbm9kZXNcbiAqL1xuXG5cbnZhciBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIHZhciBkaXN0VGhyZXNob2xkID0gMTsgLy8gdmFyIHMgPSAnY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ncmFwaFNldC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBncmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbaV07XG4gICAgdmFyIG51bU5vZGVzID0gZ3JhcGgubGVuZ3RoOyAvLyBzID0gXCJTZXQ6IFwiICsgZ3JhcGgudG9TdHJpbmcoKTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICAvLyBDb21wdXRlIGdyYXBoIGNlbnRlclxuXG4gICAgaWYgKDAgPT09IGkpIHtcbiAgICAgIHZhciBjZW50ZXJYID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQgLyAyO1xuICAgICAgdmFyIGNlbnRlclkgPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IFBhcmVudCBub2RlIGZvciB0aGlzIGdyYXBoLCBhbmQgdXNlIGl0cyBwb3NpdGlvbiBhcyBjZW50ZXJcbiAgICAgIHZhciB0ZW1wID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFswXV1dO1xuICAgICAgdmFyIHBhcmVudCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcC5wYXJlbnRJZF1dO1xuICAgICAgdmFyIGNlbnRlclggPSBwYXJlbnQucG9zaXRpb25YO1xuICAgICAgdmFyIGNlbnRlclkgPSBwYXJlbnQucG9zaXRpb25ZO1xuICAgIH0gLy8gcyA9IFwiQ2VudGVyIGZvdW5kIGF0OiBcIiArIGNlbnRlclggKyBcIiwgXCIgKyBjZW50ZXJZO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIC8vIEFwcGx5IGZvcmNlIHRvIGFsbCBub2RlcyBpbiBncmFwaFxuXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV1dOyAvLyBzID0gXCJOb2RlOiBcIiArIG5vZGUuaWQ7XG5cbiAgICAgIGlmIChub2RlLmlzTG9ja2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHggPSBjZW50ZXJYIC0gbm9kZS5wb3NpdGlvblg7XG4gICAgICB2YXIgZHkgPSBjZW50ZXJZIC0gbm9kZS5wb3NpdGlvblk7XG4gICAgICB2YXIgZCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgIGlmIChkID4gZGlzdFRocmVzaG9sZCkge1xuICAgICAgICB2YXIgZnggPSBvcHRpb25zLmdyYXZpdHkgKiBkeCAvIGQ7XG4gICAgICAgIHZhciBmeSA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR5IC8gZDtcbiAgICAgICAgbm9kZS5vZmZzZXRYICs9IGZ4O1xuICAgICAgICBub2RlLm9mZnNldFkgKz0gZnk7IC8vIHMgKz0gXCI6IEFwcGxpZWQgZm9yY2U6IFwiICsgZnggKyBcIiwgXCIgKyBmeTtcbiAgICAgIH0gLy8gcyArPSBcIjogc2t5cHBlZCBzaW5jZSBpdCdzIHRvbyBjbG9zZSB0byBjZW50ZXJcIjtcbiAgICAgICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICB9XG4gIH1cbn07XG4vKipcbiAqIEBicmllZiAgICAgICAgICA6IFRoaXMgZnVuY3Rpb24gcHJvcGFnYXRlcyB0aGUgZXhpc3Rpbmcgb2Zmc2V0cyBmcm9tXG4gKiAgICAgICAgICAgICAgICAgICBwYXJlbnQgbm9kZXMgdG8gaXRzIGRlc2NlbmRlbnRzLlxuICogQGFyZyBsYXlvdXRJbmZvIDogbGF5b3V0SW5mbyBPYmplY3RcbiAqIEBhcmcgY3kgICAgICAgICA6IGN5dG9zY2FwZSBPYmplY3RcbiAqIEBhcmcgb3B0aW9ucyAgICA6IExheW91dCBvcHRpb25zXG4gKi9cblxuXG52YXIgcHJvcGFnYXRlRm9yY2VzID0gZnVuY3Rpb24gcHJvcGFnYXRlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuICB2YXIgcXVldWUgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gMDsgLy8gUG9pbnRzIHRvIHRoZSBzdGFydCB0aGUgcXVldWVcblxuICB2YXIgZW5kID0gLTE7IC8vIFBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuICAvLyBsb2dEZWJ1ZygncHJvcGFnYXRlRm9yY2VzJyk7XG4gIC8vIFN0YXJ0IGJ5IHZpc2l0aW5nIHRoZSBub2RlcyBpbiB0aGUgcm9vdCBncmFwaFxuXG4gIHF1ZXVlLnB1c2guYXBwbHkocXVldWUsIGxheW91dEluZm8uZ3JhcGhTZXRbMF0pO1xuICBlbmQgKz0gbGF5b3V0SW5mby5ncmFwaFNldFswXS5sZW5ndGg7IC8vIFRyYXZlcnNlIHRoZSBncmFwaCwgbGV2ZWwgYnkgbGV2ZWwsXG5cbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgIC8vIEdldCB0aGUgbm9kZSB0byB2aXNpdCBhbmQgcmVtb3ZlIGl0IGZyb20gcXVldWVcbiAgICB2YXIgbm9kZUlkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVJbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVJZF07XG4gICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJbmRleF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsgLy8gV2Ugb25seSBuZWVkIHRvIHByb2Nlc3MgdGhlIG5vZGUgaWYgaXQncyBjb21wb3VuZFxuXG4gICAgaWYgKDAgPCBjaGlsZHJlbi5sZW5ndGggJiYgIW5vZGUuaXNMb2NrZWQpIHtcbiAgICAgIHZhciBvZmZYID0gbm9kZS5vZmZzZXRYO1xuICAgICAgdmFyIG9mZlkgPSBub2RlLm9mZnNldFk7IC8vIHZhciBzID0gXCJQcm9wYWdhdGluZyBvZmZzZXQgZnJvbSBwYXJlbnQgbm9kZSA6IFwiICsgbm9kZS5pZCArXG4gICAgICAvLyAgIFwiLiBPZmZzZXRYOiBcIiArIG9mZlggKyBcIi4gT2Zmc2V0WTogXCIgKyBvZmZZO1xuICAgICAgLy8gcyArPSBcIlxcbiBDaGlsZHJlbjogXCIgKyBjaGlsZHJlbi50b1N0cmluZygpO1xuICAgICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbY2hpbGRyZW5baV1dXTsgLy8gUHJvcGFnYXRlIG9mZnNldFxuXG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRYICs9IG9mZlg7XG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRZICs9IG9mZlk7IC8vIEFkZCBjaGlsZHJlbiB0byBxdWV1ZSB0byBiZSB2aXNpdGVkXG5cbiAgICAgICAgcXVldWVbKytlbmRdID0gY2hpbGRyZW5baV07XG4gICAgICB9IC8vIFJlc2V0IHBhcmVudCBvZmZzZXRzXG5cblxuICAgICAgbm9kZS5vZmZzZXRYID0gMDtcbiAgICAgIG5vZGUub2Zmc2V0WSA9IDA7XG4gICAgfVxuICB9XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBVcGRhdGVzIHRoZSBsYXlvdXQgbW9kZWwgcG9zaXRpb25zLCBiYXNlZCBvblxuICogICAgICAgICAgdGhlIGFjY3VtdWxhdGVkIGZvcmNlc1xuICovXG5cblxudmFyIHVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIC8vIHZhciBzID0gJ1VwZGF0aW5nIHBvc2l0aW9ucyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICAvLyBSZXNldCBib3VuZGFyaWVzIGZvciBjb21wb3VuZCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcblxuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiUmVzZXR0aW5nIGJvdW5kYXJpZXMgb2YgY29tcG91bmQgbm9kZTogXCIgKyBuLmlkKTtcbiAgICAgIG4ubWF4WCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWCA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWF4WSA9IHVuZGVmaW5lZDtcbiAgICAgIG4ubWluWSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcblxuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGggfHwgbi5pc0xvY2tlZCkge1xuICAgICAgLy8gTm8gbmVlZCB0byBzZXQgY29tcG91bmQgb3IgbG9ja2VkIG5vZGUgcG9zaXRpb25cbiAgICAgIC8vIGxvZ0RlYnVnKFwiU2tpcHBpbmcgcG9zaXRpb24gdXBkYXRlIG9mIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHMgPSBcIk5vZGU6IFwiICsgbi5pZCArIFwiIFByZXZpb3VzIHBvc2l0aW9uOiAoXCIgK1xuICAgIC8vIG4ucG9zaXRpb25YICsgXCIsIFwiICsgbi5wb3NpdGlvblkgKyBcIikuXCI7XG4gICAgLy8gTGltaXQgZGlzcGxhY2VtZW50IGluIG9yZGVyIHRvIGltcHJvdmUgc3RhYmlsaXR5XG5cblxuICAgIHZhciB0ZW1wRm9yY2UgPSBsaW1pdEZvcmNlKG4ub2Zmc2V0WCwgbi5vZmZzZXRZLCBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcbiAgICBuLnBvc2l0aW9uWCArPSB0ZW1wRm9yY2UueDtcbiAgICBuLnBvc2l0aW9uWSArPSB0ZW1wRm9yY2UueTtcbiAgICBuLm9mZnNldFggPSAwO1xuICAgIG4ub2Zmc2V0WSA9IDA7XG4gICAgbi5taW5YID0gbi5wb3NpdGlvblggLSBuLndpZHRoO1xuICAgIG4ubWF4WCA9IG4ucG9zaXRpb25YICsgbi53aWR0aDtcbiAgICBuLm1pblkgPSBuLnBvc2l0aW9uWSAtIG4uaGVpZ2h0O1xuICAgIG4ubWF4WSA9IG4ucG9zaXRpb25ZICsgbi5oZWlnaHQ7IC8vIHMgKz0gXCIgTmV3IFBvc2l0aW9uOiAoXCIgKyBuLnBvc2l0aW9uWCArIFwiLCBcIiArIG4ucG9zaXRpb25ZICsgXCIpLlwiO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIC8vIFVwZGF0ZSBhbmNlc3RyeSBib3VkYXJpZXNcblxuICAgIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhuLCBsYXlvdXRJbmZvKTtcbiAgfSAvLyBVcGRhdGUgc2l6ZSwgcG9zaXRpb24gb2YgY29tcHVuZCBub2Rlc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG5cbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoICYmICFuLmlzTG9ja2VkKSB7XG4gICAgICBuLnBvc2l0aW9uWCA9IChuLm1heFggKyBuLm1pblgpIC8gMjtcbiAgICAgIG4ucG9zaXRpb25ZID0gKG4ubWF4WSArIG4ubWluWSkgLyAyO1xuICAgICAgbi53aWR0aCA9IG4ubWF4WCAtIG4ubWluWDtcbiAgICAgIG4uaGVpZ2h0ID0gbi5tYXhZIC0gbi5taW5ZOyAvLyBzID0gXCJVcGRhdGluZyBwb3NpdGlvbiwgc2l6ZSBvZiBjb21wb3VuZCBub2RlIFwiICsgbi5pZDtcbiAgICAgIC8vIHMgKz0gXCJcXG5Qb3NpdGlvblg6IFwiICsgbi5wb3NpdGlvblggKyBcIiwgUG9zaXRpb25ZOiBcIiArIG4ucG9zaXRpb25ZO1xuICAgICAgLy8gcyArPSBcIlxcbldpZHRoOiBcIiArIG4ud2lkdGggKyBcIiwgSGVpZ2h0OiBcIiArIG4uaGVpZ2h0O1xuICAgICAgLy8gbG9nRGVidWcocyk7XG4gICAgfVxuICB9XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBMaW1pdHMgYSBmb3JjZSAoZm9yY2VYLCBmb3JjZVkpIHRvIGJlIG5vdFxuICogICAgICAgICAgZ3JlYXRlciAoaW4gbW9kdWxvKSB0aGFuIG1heC5cbiA4ICAgICAgICAgIFByZXNlcnZlcyBmb3JjZSBkaXJlY3Rpb24uXG4gICovXG5cblxudmFyIGxpbWl0Rm9yY2UgPSBmdW5jdGlvbiBsaW1pdEZvcmNlKGZvcmNlWCwgZm9yY2VZLCBtYXgpIHtcbiAgLy8gdmFyIHMgPSBcIkxpbWl0aW5nIGZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIikuIE1heDogXCIgKyBtYXg7XG4gIHZhciBmb3JjZSA9IE1hdGguc3FydChmb3JjZVggKiBmb3JjZVggKyBmb3JjZVkgKiBmb3JjZVkpO1xuXG4gIGlmIChmb3JjZSA+IG1heCkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB4OiBtYXggKiBmb3JjZVggLyBmb3JjZSxcbiAgICAgIHk6IG1heCAqIGZvcmNlWSAvIGZvcmNlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogZm9yY2VYLFxuICAgICAgeTogZm9yY2VZXG4gICAgfTtcbiAgfSAvLyBzICs9IFwiLlxcblJlc3VsdDogKFwiICsgcmVzLnggKyBcIiwgXCIgKyByZXMueSArIFwiKVwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuXG4gIHJldHVybiByZXM7XG59O1xuLyoqXG4gKiBAYnJpZWYgOiBGdW5jdGlvbiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGNvbXBvdW5kIG5vZGVcbiAqICAgICAgICAgIHNpemVzLCBzaW5jZSB0aGV5IHNob3VsZCBib3VuZCBhbGwgdGhlaXIgc3Vibm9kZXMuXG4gKi9cblxuXG52YXIgdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzID0gZnVuY3Rpb24gdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG5vZGUsIGxheW91dEluZm8pIHtcbiAgLy8gdmFyIHMgPSBcIlByb3BhZ2F0aW5nIG5ldyBwb3NpdGlvbi9zaXplIG9mIG5vZGUgXCIgKyBub2RlLmlkO1xuICB2YXIgcGFyZW50SWQgPSBub2RlLnBhcmVudElkO1xuXG4gIGlmIChudWxsID09IHBhcmVudElkKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlIGFyZSBkb25lXG4gICAgLy8gcyArPSBcIi4gTm8gcGFyZW50IG5vZGUuXCI7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgcmV0dXJuO1xuICB9IC8vIEdldCBQYXJlbnQgTm9kZVxuXG5cbiAgdmFyIHAgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3BhcmVudElkXV07XG4gIHZhciBmbGFnID0gZmFsc2U7IC8vIE1heFhcblxuICBpZiAobnVsbCA9PSBwLm1heFggfHwgbm9kZS5tYXhYICsgcC5wYWRSaWdodCA+IHAubWF4WCkge1xuICAgIHAubWF4WCA9IG5vZGUubWF4WCArIHAucGFkUmlnaHQ7XG4gICAgZmxhZyA9IHRydWU7IC8vIHMgKz0gXCJcXG5OZXcgbWF4WCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5tYXhYO1xuICB9IC8vIE1pblhcblxuXG4gIGlmIChudWxsID09IHAubWluWCB8fCBub2RlLm1pblggLSBwLnBhZExlZnQgPCBwLm1pblgpIHtcbiAgICBwLm1pblggPSBub2RlLm1pblggLSBwLnBhZExlZnQ7XG4gICAgZmxhZyA9IHRydWU7IC8vIHMgKz0gXCJcXG5OZXcgbWluWCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5YO1xuICB9IC8vIE1heFlcblxuXG4gIGlmIChudWxsID09IHAubWF4WSB8fCBub2RlLm1heFkgKyBwLnBhZEJvdHRvbSA+IHAubWF4WSkge1xuICAgIHAubWF4WSA9IG5vZGUubWF4WSArIHAucGFkQm90dG9tO1xuICAgIGZsYWcgPSB0cnVlOyAvLyBzICs9IFwiXFxuTmV3IG1heFkgZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WTtcbiAgfSAvLyBNaW5ZXG5cblxuICBpZiAobnVsbCA9PSBwLm1pblkgfHwgbm9kZS5taW5ZIC0gcC5wYWRUb3AgPCBwLm1pblkpIHtcbiAgICBwLm1pblkgPSBub2RlLm1pblkgLSBwLnBhZFRvcDtcbiAgICBmbGFnID0gdHJ1ZTsgLy8gcyArPSBcIlxcbk5ldyBtaW5ZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1pblk7XG4gIH0gLy8gSWYgdXBkYXRlZCBib3VuZGFyaWVzLCBwcm9wYWdhdGUgY2hhbmdlcyB1cHdhcmRcblxuXG4gIGlmIChmbGFnKSB7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgcmV0dXJuIHVwZGF0ZUFuY2VzdHJ5Qm91bmRhcmllcyhwLCBsYXlvdXRJbmZvKTtcbiAgfSAvLyBzICs9IFwiLiBObyBjaGFuZ2VzIGluIGJvdW5kYXJpZXMvcG9zaXRpb24gb2YgcGFyZW50IG5vZGUgXCIgKyBwLmlkO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuXG4gIHJldHVybjtcbn07XG5cbnZhciBzZXBhcmF0ZUNvbXBvbmVudHMgPSBmdW5jdGlvbiBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICB2YXIgbm9kZXMgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBjaWQgPSBub2RlLmNtcHRJZDtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdID0gY29tcG9uZW50c1tjaWRdIHx8IFtdO1xuICAgIGNvbXBvbmVudC5wdXNoKG5vZGUpO1xuICB9XG5cbiAgdmFyIHRvdGFsQSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuXG4gICAgaWYgKCFjKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjLngxID0gSW5maW5pdHk7XG4gICAgYy54MiA9IC1JbmZpbml0eTtcbiAgICBjLnkxID0gSW5maW5pdHk7XG4gICAgYy55MiA9IC1JbmZpbml0eTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgYy54MSA9IE1hdGgubWluKGMueDEsIG4ucG9zaXRpb25YIC0gbi53aWR0aCAvIDIpO1xuICAgICAgYy54MiA9IE1hdGgubWF4KGMueDIsIG4ucG9zaXRpb25YICsgbi53aWR0aCAvIDIpO1xuICAgICAgYy55MSA9IE1hdGgubWluKGMueTEsIG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQgLyAyKTtcbiAgICAgIGMueTIgPSBNYXRoLm1heChjLnkyLCBuLnBvc2l0aW9uWSArIG4uaGVpZ2h0IC8gMik7XG4gICAgfVxuXG4gICAgYy53ID0gYy54MiAtIGMueDE7XG4gICAgYy5oID0gYy55MiAtIGMueTE7XG4gICAgdG90YWxBICs9IGMudyAqIGMuaDtcbiAgfVxuXG4gIGNvbXBvbmVudHMuc29ydChmdW5jdGlvbiAoYzEsIGMyKSB7XG4gICAgcmV0dXJuIGMyLncgKiBjMi5oIC0gYzEudyAqIGMxLmg7XG4gIH0pO1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcbiAgdmFyIHVzZWRXID0gMDtcbiAgdmFyIHJvd0ggPSAwO1xuICB2YXIgbWF4Um93VyA9IE1hdGguc3FydCh0b3RhbEEpICogbGF5b3V0SW5mby5jbGllbnRXaWR0aCAvIGxheW91dEluZm8uY2xpZW50SGVpZ2h0O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY29tcG9uZW50c1tpXTtcblxuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbiA9IGNbal07XG5cbiAgICAgIGlmICghbi5pc0xvY2tlZCkge1xuICAgICAgICBuLnBvc2l0aW9uWCArPSB4IC0gYy54MTtcbiAgICAgICAgbi5wb3NpdGlvblkgKz0geSAtIGMueTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgeCArPSBjLncgKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgdXNlZFcgKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHJvd0ggPSBNYXRoLm1heChyb3dILCBjLmgpO1xuXG4gICAgaWYgKHVzZWRXID4gbWF4Um93Vykge1xuICAgICAgeSArPSByb3dIICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgICAgeCA9IDA7XG4gICAgICB1c2VkVyA9IDA7XG4gICAgICByb3dIID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBkZWZhdWx0cyRkID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgcGFkZGluZzogMzAsXG4gIC8vIHBhZGRpbmcgdXNlZCBvbiBmaXRcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBhdm9pZE92ZXJsYXBQYWRkaW5nOiAxMCxcbiAgLy8gZXh0cmEgc3BhY2luZyBhcm91bmQgbm9kZXMgd2hlbiBhdm9pZE92ZXJsYXA6IHRydWVcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBjb25kZW5zZTogZmFsc2UsXG4gIC8vIHVzZXMgYWxsIGF2YWlsYWJsZSBzcGFjZSBvbiBmYWxzZSwgdXNlcyBtaW5pbWFsIHNwYWNlIG9uIHRydWVcbiAgcm93czogdW5kZWZpbmVkLFxuICAvLyBmb3JjZSBudW0gb2Ygcm93cyBpbiB0aGUgZ3JpZFxuICBjb2xzOiB1bmRlZmluZWQsXG4gIC8vIGZvcmNlIG51bSBvZiBjb2x1bW5zIGluIHRoZSBncmlkXG4gIHBvc2l0aW9uOiBmdW5jdGlvbiBwb3NpdGlvbihub2RlKSB7fSxcbiAgLy8gcmV0dXJucyB7IHJvdywgY29sIH0gZm9yIGVsZW1lbnRcbiAgc29ydDogdW5kZWZpbmVkLFxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgdGhlIG5vZGVzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHMgXG5cbn07XG5cbmZ1bmN0aW9uIEdyaWRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJGQsIG9wdGlvbnMpO1xufVxuXG5HcmlkTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkubm90KCc6cGFyZW50Jyk7XG5cbiAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG5cbiAgaWYgKGJiLmggPT09IDAgfHwgYmIudyA9PT0gMCkge1xuICAgIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEsXG4gICAgICAgIHk6IGJiLnkxXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIHdpZHRoL2hlaWdodCAqIHNwbGl0c14yID0gY2VsbHMgd2hlcmUgc3BsaXRzIGlzIG51bWJlciBvZiB0aW1lcyB0byBzcGxpdCB3aWR0aFxuICAgIHZhciBjZWxscyA9IG5vZGVzLnNpemUoKTtcbiAgICB2YXIgc3BsaXRzID0gTWF0aC5zcXJ0KGNlbGxzICogYmIuaCAvIGJiLncpO1xuICAgIHZhciByb3dzID0gTWF0aC5yb3VuZChzcGxpdHMpO1xuICAgIHZhciBjb2xzID0gTWF0aC5yb3VuZChiYi53IC8gYmIuaCAqIHNwbGl0cyk7XG5cbiAgICB2YXIgc21hbGwgPSBmdW5jdGlvbiBzbWFsbCh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5taW4ocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWluID0gTWF0aC5taW4ocm93cywgY29scyk7XG5cbiAgICAgICAgaWYgKG1pbiA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBsYXJnZSA9IGZ1bmN0aW9uIGxhcmdlKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtYXggPSBNYXRoLm1heChyb3dzLCBjb2xzKTtcblxuICAgICAgICBpZiAobWF4ID09IHJvd3MpIHtcbiAgICAgICAgICByb3dzID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHMgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9Sb3dzID0gb3B0aW9ucy5yb3dzO1xuICAgIHZhciBvQ29scyA9IG9wdGlvbnMuY29scyAhPSBudWxsID8gb3B0aW9ucy5jb2xzIDogb3B0aW9ucy5jb2x1bW5zOyAvLyBpZiByb3dzIG9yIGNvbHVtbnMgd2VyZSBzZXQgaW4gb3B0aW9ucywgdXNlIHRob3NlIHZhbHVlc1xuXG4gICAgaWYgKG9Sb3dzICE9IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgcm93cyA9IG9Sb3dzO1xuICAgICAgY29scyA9IG9Db2xzO1xuICAgIH0gZWxzZSBpZiAob1Jvd3MgIT0gbnVsbCAmJiBvQ29scyA9PSBudWxsKSB7XG4gICAgICByb3dzID0gb1Jvd3M7XG4gICAgICBjb2xzID0gTWF0aC5jZWlsKGNlbGxzIC8gcm93cyk7XG4gICAgfSBlbHNlIGlmIChvUm93cyA9PSBudWxsICYmIG9Db2xzICE9IG51bGwpIHtcbiAgICAgIGNvbHMgPSBvQ29scztcbiAgICAgIHJvd3MgPSBNYXRoLmNlaWwoY2VsbHMgLyBjb2xzKTtcbiAgICB9IC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB1cCwgc2VlIGlmIHdlIGNhbiByZWR1Y2Ugcm93cyBvciBjb2x1bW5zXG4gICAgZWxzZSBpZiAoY29scyAqIHJvd3MgPiBjZWxscykge1xuICAgICAgICB2YXIgc20gPSBzbWFsbCgpO1xuICAgICAgICB2YXIgbGcgPSBsYXJnZSgpOyAvLyByZWR1Y2luZyB0aGUgc21hbGwgc2lkZSB0YWtlcyBhd2F5IHRoZSBtb3N0IGNlbGxzLCBzbyB0cnkgaXQgZmlyc3RcblxuICAgICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBjZWxscykge1xuICAgICAgICAgIHNtYWxsKHNtIC0gMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGxnIC0gMSkgKiBzbSA+PSBjZWxscykge1xuICAgICAgICAgIGxhcmdlKGxnIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB0b28gbG93LCBhZGQgcm93cyBvciBjb2x1bW5zXG4gICAgICAgIHdoaWxlIChjb2xzICogcm93cyA8IGNlbGxzKSB7XG4gICAgICAgICAgdmFyIF9zbSA9IHNtYWxsKCk7XG5cbiAgICAgICAgICB2YXIgX2xnID0gbGFyZ2UoKTsgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuXG5cbiAgICAgICAgICBpZiAoKF9sZyArIDEpICogX3NtID49IGNlbGxzKSB7XG4gICAgICAgICAgICBsYXJnZShfbGcgKyAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc21hbGwoX3NtICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB2YXIgY2VsbFdpZHRoID0gYmIudyAvIGNvbHM7XG4gICAgdmFyIGNlbGxIZWlnaHQgPSBiYi5oIC8gcm93cztcblxuICAgIGlmIChvcHRpb25zLmNvbmRlbnNlKSB7XG4gICAgICBjZWxsV2lkdGggPSAwO1xuICAgICAgY2VsbEhlaWdodCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChwb3MueCA9PSBudWxsIHx8IHBvcy55ID09IG51bGwpIHtcbiAgICAgICAgICAvLyBmb3IgYmJcbiAgICAgICAgICBwb3MueCA9IDA7XG4gICAgICAgICAgcG9zLnkgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5iYiA9IG5vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICAgICAgdmFyIHAgPSBvcHRpb25zLmF2b2lkT3ZlcmxhcFBhZGRpbmc7XG4gICAgICAgIHZhciB3ID0gbmJiLncgKyBwO1xuICAgICAgICB2YXIgaCA9IG5iYi5oICsgcDtcbiAgICAgICAgY2VsbFdpZHRoID0gTWF0aC5tYXgoY2VsbFdpZHRoLCB3KTtcbiAgICAgICAgY2VsbEhlaWdodCA9IE1hdGgubWF4KGNlbGxIZWlnaHQsIGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuXG4gICAgdmFyIHVzZWQgPSBmdW5jdGlvbiB1c2VkKHJvdywgY29sKSB7XG4gICAgICByZXR1cm4gY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPyB0cnVlIDogZmFsc2U7XG4gICAgfTtcblxuICAgIHZhciB1c2UgPSBmdW5jdGlvbiB1c2Uocm93LCBjb2wpIHtcbiAgICAgIGNlbGxVc2VkWydjLScgKyByb3cgKyAnLScgKyBjb2xdID0gdHJ1ZTtcbiAgICB9OyAvLyB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgY2VsbCBwb3NpdGlvblxuXG5cbiAgICB2YXIgcm93ID0gMDtcbiAgICB2YXIgY29sID0gMDtcblxuICAgIHZhciBtb3ZlVG9OZXh0Q2VsbCA9IGZ1bmN0aW9uIG1vdmVUb05leHRDZWxsKCkge1xuICAgICAgY29sKys7XG5cbiAgICAgIGlmIChjb2wgPj0gY29scykge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICB9OyAvLyBnZXQgYSBjYWNoZSBvZiBhbGwgdGhlIG1hbnVhbCBwb3NpdGlvbnNcblxuXG4gICAgdmFyIGlkMm1hblBvcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgICAgdmFyIHJjUG9zID0gb3B0aW9ucy5wb3NpdGlvbihfbm9kZSk7XG5cbiAgICAgIGlmIChyY1BvcyAmJiAocmNQb3Mucm93ICE9PSB1bmRlZmluZWQgfHwgcmNQb3MuY29sICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCByb3cgb3IgY29sIGRlZidkXG4gICAgICAgIHZhciBfcG9zID0ge1xuICAgICAgICAgIHJvdzogcmNQb3Mucm93LFxuICAgICAgICAgIGNvbDogcmNQb3MuY29sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKF9wb3MuY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCBjb2xcbiAgICAgICAgICBfcG9zLmNvbCA9IDA7XG5cbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLmNvbCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfcG9zLnJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZmluZCB1bnVzZWQgcm93XG4gICAgICAgICAgX3Bvcy5yb3cgPSAwO1xuXG4gICAgICAgICAgd2hpbGUgKHVzZWQoX3Bvcy5yb3csIF9wb3MuY29sKSkge1xuICAgICAgICAgICAgX3Bvcy5yb3crKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZDJtYW5Qb3NbX25vZGUuaWQoKV0gPSBfcG9zO1xuICAgICAgICB1c2UoX3Bvcy5yb3csIF9wb3MuY29sKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ2V0UG9zID0gZnVuY3Rpb24gZ2V0UG9zKGVsZW1lbnQsIGkpIHtcbiAgICAgIHZhciB4LCB5O1xuXG4gICAgICBpZiAoZWxlbWVudC5sb2NrZWQoKSB8fCBlbGVtZW50LmlzUGFyZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyBzZWUgaWYgd2UgaGF2ZSBhIG1hbnVhbCBwb3NpdGlvbiBzZXRcblxuXG4gICAgICB2YXIgcmNQb3MgPSBpZDJtYW5Qb3NbZWxlbWVudC5pZCgpXTtcblxuICAgICAgaWYgKHJjUG9zKSB7XG4gICAgICAgIHggPSByY1Bvcy5jb2wgKiBjZWxsV2lkdGggKyBjZWxsV2lkdGggLyAyICsgYmIueDE7XG4gICAgICAgIHkgPSByY1Bvcy5yb3cgKiBjZWxsSGVpZ2h0ICsgY2VsbEhlaWdodCAvIDIgKyBiYi55MTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSBzZXQgYXV0b21hdGljYWxseVxuICAgICAgICB3aGlsZSAodXNlZChyb3csIGNvbCkpIHtcbiAgICAgICAgICBtb3ZlVG9OZXh0Q2VsbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgeCA9IGNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgICB1c2Uocm93LCBjb2wpO1xuICAgICAgICBtb3ZlVG9OZXh0Q2VsbCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBub2Rlcy5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJGUgPSB7XG4gIHJlYWR5OiBmdW5jdGlvbiByZWFkeSgpIHt9LFxuICAvLyBvbiBsYXlvdXRyZWFkeVxuICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge30gLy8gb24gbGF5b3V0c3RvcFxuXG59OyAvLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5cbmZ1bmN0aW9uIE51bGxMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJGUsIG9wdGlvbnMpO1xufSAvLyBydW5zIHRoZSBsYXlvdXRcblxuXG5OdWxsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gZWxlbWVudHMgdG8gY29uc2lkZXIgaW4gdGhlIGxheW91dFxuXG4gIHZhciBsYXlvdXQgPSB0aGlzOyAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIChkaXNhYmxlIGVzbGludCBmb3IgbmV4dCBsaW5lIGFzIHRoaXMgc2VydmVzIGFzIGV4YW1wbGUgbGF5b3V0IGNvZGUgdG8gZXh0ZXJuYWwgZGV2ZWxvcGVycylcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0YXJ0Jyk7IC8vIHB1dHMgYWxsIG5vZGVzIGF0ICgwLCAwKVxuICAvLyBuLmIuIG1vc3QgbGF5b3V0cyB3b3VsZCB1c2UgbGF5b3V0UG9zaXRpb25zKCksIGluc3RlYWQgb2YgcG9zaXRpb25zKCkgYW5kIG1hbnVhbCBldmVudHNcblxuICBlbGVzLm5vZGVzKCkucG9zaXRpb25zKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9KTsgLy8gdHJpZ2dlciBsYXlvdXRyZWFkeSB3aGVuIGVhY2ggbm9kZSBoYXMgaGFkIGl0cyBwb3NpdGlvbiBzZXQgYXQgbGVhc3Qgb25jZVxuXG4gIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRyZWFkeScpOyAvLyB0cmlnZ2VyIGxheW91dHN0b3Agd2hlbiB0aGUgbGF5b3V0IHN0b3BzIChlLmcuIGZpbmlzaGVzKVxuXG4gIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0c3RvcCcpO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07IC8vIGNhbGxlZCBvbiBjb250aW51b3VzIGxheW91dHMgdG8gc3RvcCB0aGVtIGJlZm9yZSB0aGV5IGZpbmlzaFxuXG5cbk51bGxMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJGYgPSB7XG4gIHBvc2l0aW9uczogdW5kZWZpbmVkLFxuICAvLyBtYXAgb2YgKG5vZGUgaWQpID0+IChwb3NpdGlvbiBvYmopOyBvciBmdW5jdGlvbihub2RlKXsgcmV0dXJuIHNvbVBvczsgfVxuICB6b29tOiB1bmRlZmluZWQsXG4gIC8vIHRoZSB6b29tIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBhbmltYXRlOiBmYWxzZSxcbiAgLy8gd2hldGhlciB0byB0cmFuc2l0aW9uIHRoZSBub2RlIHBvc2l0aW9uc1xuICBhbmltYXRpb25EdXJhdGlvbjogNTAwLFxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcblxufTtcblxuZnVuY3Rpb24gUHJlc2V0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyRmLCBvcHRpb25zKTtcbn1cblxuUHJlc2V0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcG9zSXNGbiA9IGZuKG9wdGlvbnMucG9zaXRpb25zKTtcblxuICBmdW5jdGlvbiBnZXRQb3NpdGlvbihub2RlKSB7XG4gICAgaWYgKG9wdGlvbnMucG9zaXRpb25zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb3B5UG9zaXRpb24obm9kZS5wb3NpdGlvbigpKTtcbiAgICB9XG5cbiAgICBpZiAocG9zSXNGbikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpb25zKG5vZGUpO1xuICAgIH1cblxuICAgIHZhciBwb3MgPSBvcHRpb25zLnBvc2l0aW9uc1tub2RlLl9wcml2YXRlLmRhdGEuaWRdO1xuXG4gICAgaWYgKHBvcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zO1xuICB9XG5cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24obm9kZSk7XG5cbiAgICBpZiAobm9kZS5sb2NrZWQoKSB8fCBwb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkZyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcblxufTtcblxuZnVuY3Rpb24gUmFuZG9tTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyRnLCBvcHRpb25zKTtcbn1cblxuUmFuZG9tTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG5cbiAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhub2RlLCBpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJiLngxICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogYmIudyksXG4gICAgICB5OiBiYi55MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLmgpXG4gICAgfTtcbiAgfTtcblxuICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGxheW91dCA9IFt7XG4gIG5hbWU6ICdicmVhZHRoZmlyc3QnLFxuICBpbXBsOiBCcmVhZHRoRmlyc3RMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2NpcmNsZScsXG4gIGltcGw6IENpcmNsZUxheW91dFxufSwge1xuICBuYW1lOiAnY29uY2VudHJpYycsXG4gIGltcGw6IENvbmNlbnRyaWNMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2Nvc2UnLFxuICBpbXBsOiBDb3NlTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdncmlkJyxcbiAgaW1wbDogR3JpZExheW91dFxufSwge1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ3ByZXNldCcsXG4gIGltcGw6IFByZXNldExheW91dFxufSwge1xuICBuYW1lOiAncmFuZG9tJyxcbiAgaW1wbDogUmFuZG9tTGF5b3V0XG59XTtcblxuZnVuY3Rpb24gTnVsbFJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5ub3RpZmljYXRpb25zID0gMDsgLy8gZm9yIHRlc3Rpbmdcbn1cblxudmFyIG5vb3AkMSA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxudmFyIHRocm93SW1nRXJyID0gZnVuY3Rpb24gdGhyb3dJbWdFcnIoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQSBoZWFkbGVzcyBpbnN0YW5jZSBjYW4gbm90IHJlbmRlciBpbWFnZXMnKTtcbn07XG5cbk51bGxSZW5kZXJlci5wcm90b3R5cGUgPSB7XG4gIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZTogbm9vcCQxLFxuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMrKztcbiAgfSxcbiAgaW5pdDogbm9vcCQxLFxuICBpc0hlYWRsZXNzOiBmdW5jdGlvbiBpc0hlYWRsZXNzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwbmc6IHRocm93SW1nRXJyLFxuICBqcGc6IHRocm93SW1nRXJyXG59O1xuXG52YXIgQlJwID0ge307XG5CUnAuYXJyb3dTaGFwZVdpZHRoID0gMC4zO1xuXG5CUnAucmVnaXN0ZXJBcnJvd1NoYXBlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycm93U2hhcGVzID0gdGhpcy5hcnJvd1NoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzOyAvLyBDb250cmFjdCBmb3IgYXJyb3cgc2hhcGVzOlxuICAvLyAwLCAwIGlzIGFycm93IHRpcFxuICAvLyAoMCwgMSkgaXMgZGlyZWN0aW9uIHRvd2FyZHMgbm9kZVxuICAvLyAoMSwgMCkgaXMgcmlnaHRcbiAgLy9cbiAgLy8gZnVuY3Rpb25hbCBhcGk6XG4gIC8vIGNvbGxpZGU6IGNoZWNrIHgsIHkgaW4gc2hhcGVcbiAgLy8gcm91Z2hDb2xsaWRlOiBjYWxsZWQgYmVmb3JlIGNvbGxpZGUsIG5vIGZhbHNlIG5lZ2F0aXZlc1xuICAvLyBkcmF3OiBkcmF3XG4gIC8vIHNwYWNpbmc6IGRpc3QoYXJyb3dUaXAsIG5vZGVCb3VuZGFyeSlcbiAgLy8gZ2FwOiBkaXN0KGVkZ2VUaXAsIG5vZGVCb3VuZGFyeSksIGVkZ2VUaXAgbWF5ICE9IGFycm93VGlwXG5cbiAgdmFyIGJiQ29sbGlkZSA9IGZ1bmN0aW9uIGJiQ29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgIHZhciB4MSA9IHRyYW5zbGF0aW9uLnggLSBzaXplIC8gMiAtIHBhZGRpbmc7XG4gICAgdmFyIHgyID0gdHJhbnNsYXRpb24ueCArIHNpemUgLyAyICsgcGFkZGluZztcbiAgICB2YXIgeTEgPSB0cmFuc2xhdGlvbi55IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB5MiA9IHRyYW5zbGF0aW9uLnkgKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGluc2lkZSA9IHgxIDw9IHggJiYgeCA8PSB4MiAmJiB5MSA8PSB5ICYmIHkgPD0geTI7XG4gICAgcmV0dXJuIGluc2lkZTtcbiAgfTtcblxuICB2YXIgdHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgIHZhciB4Um90YXRlZCA9IHggKiBNYXRoLmNvcyhhbmdsZSkgLSB5ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgIHZhciB5Um90YXRlZCA9IHggKiBNYXRoLnNpbihhbmdsZSkgKyB5ICogTWF0aC5jb3MoYW5nbGUpO1xuICAgIHZhciB4U2NhbGVkID0geFJvdGF0ZWQgKiBzaXplO1xuICAgIHZhciB5U2NhbGVkID0geVJvdGF0ZWQgKiBzaXplO1xuICAgIHZhciB4VHJhbnNsYXRlZCA9IHhTY2FsZWQgKyB0cmFuc2xhdGlvbi54O1xuICAgIHZhciB5VHJhbnNsYXRlZCA9IHlTY2FsZWQgKyB0cmFuc2xhdGlvbi55O1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4VHJhbnNsYXRlZCxcbiAgICAgIHk6IHlUcmFuc2xhdGVkXG4gICAgfTtcbiAgfTtcblxuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHZhciB4ID0gcHRzW2ldO1xuICAgICAgdmFyIHkgPSBwdHNbaSArIDFdO1xuICAgICAgcmV0UHRzLnB1c2godHJhbnNmb3JtKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgIH1cblxuICAgIHJldHVybiByZXRQdHM7XG4gIH07XG5cbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcHRzW2ldO1xuICAgICAgcmV0LnB1c2gocC54LCBwLnkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG5cbiAgdmFyIGRlZmluZUFycm93U2hhcGUgPSBmdW5jdGlvbiBkZWZpbmVBcnJvd1NoYXBlKG5hbWUsIGRlZm4pIHtcbiAgICBpZiAoc3RyaW5nKGRlZm4pKSB7XG4gICAgICBkZWZuID0gYXJyb3dTaGFwZXNbZGVmbl07XG4gICAgfVxuXG4gICAgYXJyb3dTaGFwZXNbbmFtZV0gPSBleHRlbmQoe1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLjE1LCAtMC4zLCAwLjE1LCAwLjMsIC0wLjE1LCAwLjNdLFxuICAgICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIHBhZGRpbmcpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xuICAgICAgICByZXR1cm4gaW5zaWRlO1xuICAgICAgfSxcbiAgICAgIHJvdWdoQ29sbGlkZTogYmJDb2xsaWRlLFxuICAgICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwoJ3BvbHlnb24nKShjb250ZXh0LCBwb2ludHMpO1xuICAgICAgfSxcbiAgICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sXG4gICAgICBnYXA6IHN0YW5kYXJkR2FwXG4gICAgfSwgZGVmbik7XG4gIH07XG5cbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wLFxuICAgIHNwYWNpbmc6IHplcm9pZnksXG4gICAgZ2FwOiB6ZXJvaWZ5XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0cmlhbmdsZScsIHtcbiAgICBwb2ludHM6IFstMC4xNSwgLTAuMywgMCwgMCwgMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2Fycm93JywgJ3RyaWFuZ2xlJyk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlLWJhY2tjdXJ2ZScsIHtcbiAgICBwb2ludHM6IGFycm93U2hhcGVzWyd0cmlhbmdsZSddLnBvaW50cyxcbiAgICBjb250cm9sUG9pbnQ6IFswLCAtMC4xNV0sXG4gICAgcm91Z2hDb2xsaWRlOiBiYkNvbGxpZGUsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgdmFyIHB0c1RyYW5zID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGN0cmxQdCA9IHRoaXMuY29udHJvbFBvaW50O1xuICAgICAgdmFyIGN0cmxQdFRyYW5zID0gdHJhbnNmb3JtKGN0cmxQdFswXSwgY3RybFB0WzFdLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCBwdHNUcmFucywgY3RybFB0VHJhbnMpO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC44O1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlLXRlZScsIHtcbiAgICBwb2ludHM6IFswLCAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuMywgMCwgMF0sXG4gICAgcG9pbnRzVGVlOiBbLTAuMTUsIC0wLjQsIC0wLjE1LCAtMC41LCAwLjE1LCAtMC41LCAwLjE1LCAtMC40XSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdHJpUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIHRlZVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50c1RlZSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIHRlZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50c1RlZSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKTtcbiAgICAgIHJlbmRlcmVyLmFycm93U2hhcGVJbXBsKHRoaXMubmFtZSkoY29udGV4dCwgdHJpUHRzLCB0ZWVQdHMpO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2NpcmNsZS10cmlhbmdsZScsIHtcbiAgICByYWRpdXM6IDAuMTUsXG4gICAgcG9pbnRzVHI6IFswLCAtMC4xNSwgMC4xNSwgLTAuNDUsIC0wLjE1LCAtMC40NSwgMCwgLTAuMTVdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0ID0gdHJhbnNsYXRpb247XG4gICAgICB2YXIgY2lyY2xlSW5zaWRlID0gTWF0aC5wb3codC54IC0geCwgMikgKyBNYXRoLnBvdyh0LnkgLSB5LCAyKSA8PSBNYXRoLnBvdygoc2l6ZSArIDIgKiBwYWRkaW5nKSAqIHRoaXMucmFkaXVzLCAyKTtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHRyaVB0cykgfHwgY2lyY2xlSW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgdmFyIHRyaVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50c1RyLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnksIHRoaXMucmFkaXVzICogc2l6ZSk7XG4gICAgfSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiByZW5kZXJlci5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMucmFkaXVzO1xuICAgIH1cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlLWNyb3NzJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBiYXNlQ3Jvc3NMaW5lUHRzOiBbLTAuMTUsIC0wLjQsIC8vIGZpcnN0IGhhbGYgb2YgdGhlIHJlY3RhbmdsZVxuICAgIC0wLjE1LCAtMC40LCAwLjE1LCAtMC40LCAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgMC4xNSwgLTAuNF0sXG4gICAgY3Jvc3NMaW5lUHRzOiBmdW5jdGlvbiBjcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSB7XG4gICAgICAvLyBzaGlmdCBwb2ludHMgc28gdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MgcG9pbnRzIG1hdGNoZXMgZWRnZSB3aWR0aFxuICAgICAgdmFyIHAgPSB0aGlzLmJhc2VDcm9zc0xpbmVQdHMuc2xpY2UoKTtcbiAgICAgIHZhciBzaGlmdEZhY3RvciA9IGVkZ2VXaWR0aCAvIHNpemU7XG4gICAgICB2YXIgeTAgPSAzO1xuICAgICAgdmFyIHkxID0gNTtcbiAgICAgIHBbeTBdID0gcFt5MF0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHBbeTFdID0gcFt5MV0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5jcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGNyb3NzTGluZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIGNyb3NzTGluZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndmVlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zLCAwLCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC41MjU7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAsIC0wLjE1LCAtMC4xLCAwLjE1LCAtMC4xLCAwLjE1LCAwXSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnc3F1YXJlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAwLjAwLCAwLjE1LCAwLjAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2RpYW1vbmQnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjE1LCAwLCAtMC4zLCAwLjE1LCAtMC4xNSwgMCwgMF0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaGV2cm9uJywge1xuICAgIHBvaW50czogWzAsIDAsIC0wLjE1LCAtMC4xNSwgLTAuMSwgLTAuMiwgMCwgLTAuMSwgMC4xLCAtMC4yLCAwLjE1LCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDAuOTUgKiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBCUnAkMSA9IHt9OyAvLyBQcm9qZWN0IG1vdXNlXG5cbkJScCQxLnByb2plY3RJbnRvVmlld3BvcnQgPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgb2Zmc2V0cyA9IHRoaXMuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICB2YXIgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICB2YXIgc2NhbGUgPSBvZmZzZXRzWzRdO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgeCA9ICgoY2xpZW50WCAtIG9mZnNldExlZnQpIC8gc2NhbGUgLSBwYW4ueCkgLyB6b29tO1xuICB2YXIgeSA9ICgoY2xpZW50WSAtIG9mZnNldFRvcCkgLyBzY2FsZSAtIHBhbi55KSAvIHpvb207XG4gIHJldHVybiBbeCwgeV07XG59O1xuXG5CUnAkMS5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jb250YWluZXJCQikge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lckJCO1xuICB9XG5cbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHN0eWxlID0gd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuXG4gIHZhciBzdHlsZVZhbHVlID0gZnVuY3Rpb24gc3R5bGVWYWx1ZShuYW1lKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH07XG5cbiAgdmFyIHBhZGRpbmcgPSB7XG4gICAgbGVmdDogc3R5bGVWYWx1ZSgncGFkZGluZy1sZWZ0JyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctcmlnaHQnKSxcbiAgICB0b3A6IHN0eWxlVmFsdWUoJ3BhZGRpbmctdG9wJyksXG4gICAgYm90dG9tOiBzdHlsZVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpXG4gIH07XG4gIHZhciBib3JkZXIgPSB7XG4gICAgbGVmdDogc3R5bGVWYWx1ZSgnYm9yZGVyLWxlZnQtd2lkdGgnKSxcbiAgICByaWdodDogc3R5bGVWYWx1ZSgnYm9yZGVyLXJpZ2h0LXdpZHRoJyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJyksXG4gICAgYm90dG9tOiBzdHlsZVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJylcbiAgfTtcbiAgdmFyIGNsaWVudFdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICB2YXIgY2xpZW50SGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgdmFyIHBhZGRpbmdIb3IgPSBwYWRkaW5nLmxlZnQgKyBwYWRkaW5nLnJpZ2h0O1xuICB2YXIgcGFkZGluZ1ZlciA9IHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b207XG4gIHZhciBib3JkZXJIb3IgPSBib3JkZXIubGVmdCArIGJvcmRlci5yaWdodDtcbiAgdmFyIHNjYWxlID0gcmVjdC53aWR0aCAvIChjbGllbnRXaWR0aCArIGJvcmRlckhvcik7XG4gIHZhciB1bnNjYWxlZFcgPSBjbGllbnRXaWR0aCAtIHBhZGRpbmdIb3I7XG4gIHZhciB1bnNjYWxlZEggPSBjbGllbnRIZWlnaHQgLSBwYWRkaW5nVmVyO1xuICB2YXIgbGVmdCA9IHJlY3QubGVmdCArIHBhZGRpbmcubGVmdCArIGJvcmRlci5sZWZ0O1xuICB2YXIgdG9wID0gcmVjdC50b3AgKyBwYWRkaW5nLnRvcCArIGJvcmRlci50b3A7XG4gIHJldHVybiB0aGlzLmNvbnRhaW5lckJCID0gW2xlZnQsIHRvcCwgdW5zY2FsZWRXLCB1bnNjYWxlZEgsIHNjYWxlXTtcbn07XG5cbkJScCQxLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jb250YWluZXJCQiA9IG51bGw7XG59O1xuXG5CUnAkMS5maW5kTmVhcmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgcmV0dXJuIHRoaXMuZmluZE5lYXJlc3RFbGVtZW50cyh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaClbMF07XG59O1xuXG5CUnAkMS5maW5kTmVhcmVzdEVsZW1lbnRzID0gZnVuY3Rpb24gKHgsIHksIGludGVyYWN0aXZlRWxlbWVudHNPbmx5LCBpc1RvdWNoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZWxlcyA9IHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgdmFyIG5lYXIgPSBbXTsgLy8gMSBub2RlIG1heCwgMSBlZGdlIG1heFxuXG4gIHZhciB6b29tID0gci5jeS56b29tKCk7XG4gIHZhciBoYXNDb21wb3VuZHMgPSByLmN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIGVkZ2VUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDI0IDogOCkgLyB6b29tO1xuICB2YXIgbm9kZVRocmVzaG9sZCA9IChpc1RvdWNoID8gOCA6IDIpIC8gem9vbTtcbiAgdmFyIGxhYmVsVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbWluU3FEaXN0ID0gSW5maW5pdHk7XG4gIHZhciBuZWFyRWRnZTtcbiAgdmFyIG5lYXJOb2RlO1xuXG4gIGlmIChpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSkge1xuICAgIGVsZXMgPSBlbGVzLmludGVyYWN0aXZlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkRWxlKGVsZSwgc3FEaXN0KSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgaWYgKG5lYXJOb2RlKSB7XG4gICAgICAgIHJldHVybjsgLy8gY2FuJ3QgcmVwbGFjZSBub2RlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZWFyTm9kZSA9IGVsZTtcbiAgICAgICAgbmVhci5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZS5pc0VkZ2UoKSAmJiAoc3FEaXN0ID09IG51bGwgfHwgc3FEaXN0IDwgbWluU3FEaXN0KSkge1xuICAgICAgaWYgKG5lYXJFZGdlKSB7XG4gICAgICAgIC8vIHRoZW4gcmVwbGFjZSBleGlzdGluZyBlZGdlXG4gICAgICAgIC8vIGNhbiByZXBsYWNlIG9ubHkgaWYgc2FtZSB6LWluZGV4XG4gICAgICAgIGlmIChuZWFyRWRnZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSA9PT0gZWxlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlICYmIG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5lYXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZWFyW2ldLmlzRWRnZSgpKSB7XG4gICAgICAgICAgICAgIG5lYXJbaV0gPSBlbGU7XG4gICAgICAgICAgICAgIG5lYXJFZGdlID0gZWxlO1xuICAgICAgICAgICAgICBtaW5TcURpc3QgPSBzcURpc3QgIT0gbnVsbCA/IHNxRGlzdCA6IG1pblNxRGlzdDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZWFyLnB1c2goZWxlKTtcbiAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrTm9kZShub2RlKSB7XG4gICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpICsgMiAqIG5vZGVUaHJlc2hvbGQ7XG4gICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcblxuICAgIGlmIChwb3MueCAtIGh3IDw9IHggJiYgeCA8PSBwb3MueCArIGh3IC8vIGJiIGNoZWNrIHhcbiAgICAmJiBwb3MueSAtIGhoIDw9IHkgJiYgeSA8PSBwb3MueSArIGhoIC8vIGJiIGNoZWNrIHlcbiAgICApIHtcbiAgICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcblxuICAgICAgICBpZiAoc2hhcGUuY2hlY2tQb2ludCh4LCB5LCAwLCB3aWR0aCwgaGVpZ2h0LCBwb3MueCwgcG9zLnkpKSB7XG4gICAgICAgICAgYWRkRWxlKG5vZGUsIDApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0VkZ2UoZWRnZSkge1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gICAgdmFyIHN0eWxlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBzY2FsZSA9IGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICAgIHZhciB3aWR0aCA9IHN0eWxlV2lkdGggLyAyICsgZWRnZVRocmVzaG9sZDsgLy8gbW9yZSBsaWtlIGEgZGlzdGFuY2UgcmFkaXVzIGZyb20gY2VudHJlXG5cbiAgICB2YXIgd2lkdGhTcSA9IHdpZHRoICogd2lkdGg7XG4gICAgdmFyIHdpZHRoMiA9IHdpZHRoICogMjtcbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNxRGlzdDtcblxuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0JyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyAzIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmIChpbkxpbmVWaWNpbml0eSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHdpZHRoMikgJiYgd2lkdGhTcSA+IChzcURpc3QgPSBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdKSkpIHtcbiAgICAgICAgICBhZGRFbGUoZWRnZSwgc3FEaXN0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAoaW5CZXppZXJWaWNpbml0eSh4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHB0c1tpICsgNF0sIHB0c1tpICsgNV0sIHdpZHRoMikgJiYgd2lkdGhTcSA+IChzcURpc3QgPSBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCBwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10sIHB0c1tpICsgNF0sIHB0c1tpICsgNV0pKSkge1xuICAgICAgICAgIGFkZEVsZShlZGdlLCBzcURpc3QpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZWRnZSBidXQgZGlkbid0IGhpdCBpdCwgbWF5YmUgd2UgaGl0IGl0cyBhcnJvd3NcblxuXG4gICAgdmFyIHNyYyA9IHNyYyB8fCBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IHRndCB8fCBfcC50YXJnZXQ7XG4gICAgdmFyIGFyU2l6ZSA9IHNlbGYuZ2V0QXJyb3dXaWR0aChzdHlsZVdpZHRoLCBzY2FsZSk7XG4gICAgdmFyIGFycm93cyA9IFt7XG4gICAgICBuYW1lOiAnc291cmNlJyxcbiAgICAgIHg6IHJzLmFycm93U3RhcnRYLFxuICAgICAgeTogcnMuYXJyb3dTdGFydFksXG4gICAgICBhbmdsZTogcnMuc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICd0YXJnZXQnLFxuICAgICAgeDogcnMuYXJyb3dFbmRYLFxuICAgICAgeTogcnMuYXJyb3dFbmRZLFxuICAgICAgYW5nbGU6IHJzLnRndEFycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnbWlkLXNvdXJjZScsXG4gICAgICB4OiBycy5taWRYLFxuICAgICAgeTogcnMubWlkWSxcbiAgICAgIGFuZ2xlOiBycy5taWRzcmNBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC10YXJnZXQnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkdGd0QXJyb3dBbmdsZVxuICAgIH1dO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhciA9IGFycm93c1tpXTtcbiAgICAgIHZhciBzaGFwZSA9IHIuYXJyb3dTaGFwZXNbZWRnZS5wc3R5bGUoYXIubmFtZSArICctYXJyb3ctc2hhcGUnKS52YWx1ZV07XG4gICAgICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcblxuICAgICAgaWYgKHNoYXBlLnJvdWdoQ29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkgJiYgc2hhcGUuY29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkpIHtcbiAgICAgICAgYWRkRWxlKGVkZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIGZvciBjb21wb3VuZCBncmFwaHMsIGhpdHRpbmcgZWRnZSBtYXkgYWN0dWFsbHkgd2FudCBhIGNvbm5lY3RlZCBub2RlIGluc3RlYWQgKGIvYyBlZGdlIG1heSBoYXZlIGdyZWF0ZXIgei1pbmRleCBwcmVjZWRlbmNlKVxuXG5cbiAgICBpZiAoaGFzQ29tcG91bmRzICYmIG5lYXIubGVuZ3RoID4gMCkge1xuICAgICAgY2hlY2tOb2RlKHNyYyk7XG4gICAgICBjaGVja05vZGUodGd0KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwcm9wKG9iaiwgbmFtZSwgcHJlKSB7XG4gICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBuYW1lLCBwcmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tMYWJlbChlbGUsIHByZWZpeCkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgdGggPSBsYWJlbFRocmVzaG9sZDtcbiAgICB2YXIgcHJlZml4RGFzaDtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeERhc2ggPSAnJztcbiAgICB9XG5cbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgYmIgPSBfcC5sYWJlbEJvdW5kc1twcmVmaXggfHwgJ21haW4nXTtcbiAgICB2YXIgdGV4dCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICdsYWJlbCcpLnZhbHVlO1xuICAgIHZhciBldmVudHNFbmFibGVkID0gZWxlLnBzdHlsZSgndGV4dC1ldmVudHMnKS5zdHJWYWx1ZSA9PT0gJ3llcyc7XG5cbiAgICBpZiAoIWV2ZW50c0VuYWJsZWQgfHwgIXRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94OyAvLyAoLW94LCAtb3kpIGFzIGJiIGFscmVhZHkgaW5jbHVkZXMgbWFyZ2luXG5cbiAgICB2YXIgbHgyID0gYmIueDIgKyB0aCAtIG94OyAvLyBhbmQgcm90YXRpb24gaXMgYWJvdXQgKGx4LCBseSlcblxuICAgIHZhciBseTEgPSBiYi55MSAtIHRoIC0gb3k7XG4gICAgdmFyIGx5MiA9IGJiLnkyICsgdGggLSBveTtcblxuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG5cbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIGx4O1xuICAgICAgICB5ID0geSAtIGx5O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgbHgsXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyBseVxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgdmFyIHB4MXkxID0gcm90YXRlKGx4MSwgbHkxKTtcbiAgICAgIHZhciBweDF5MiA9IHJvdGF0ZShseDEsIGx5Mik7XG4gICAgICB2YXIgcHgyeTEgPSByb3RhdGUobHgyLCBseTEpO1xuICAgICAgdmFyIHB4MnkyID0gcm90YXRlKGx4MiwgbHkyKTtcbiAgICAgIHZhciBwb2ludHMgPSBbLy8gd2l0aCB0aGUgbWFyZ2luIGFkZGVkIGFmdGVyIHRoZSByb3RhdGlvbiBpcyBhcHBsaWVkXG4gICAgICBweDF5MS54ICsgb3gsIHB4MXkxLnkgKyBveSwgcHgyeTEueCArIG94LCBweDJ5MS55ICsgb3ksIHB4MnkyLnggKyBveCwgcHgyeTIueSArIG95LCBweDF5Mi54ICsgb3gsIHB4MXkyLnkgKyBveV07XG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICBhZGRFbGUoZWxlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvIGEgY2hlYXBlciBiYiBjaGVja1xuICAgICAgaWYgKGluQm91bmRpbmdCb3goYmIsIHgsIHkpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gZWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIHJldmVyc2Ugb3JkZXIgZm9yIHByZWNlZGVuY2VcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcblxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGNoZWNrTm9kZShlbGUpIHx8IGNoZWNrTGFiZWwoZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlbiBlZGdlXG4gICAgICBjaGVja0VkZ2UoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUsICdzb3VyY2UnKSB8fCBjaGVja0xhYmVsKGVsZSwgJ3RhcmdldCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWFyO1xufTsgLy8gJ0dpdmUgbWUgZXZlcnl0aGluZyBmcm9tIHRoaXMgYm94J1xuXG5cbkJScCQxLmdldEFsbEluQm94ID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gIHZhciBlbGVzID0gdGhpcy5nZXRDYWNoZWRaU29ydGVkRWxlcygpLmludGVyYWN0aXZlO1xuICB2YXIgYm94ID0gW107XG4gIHZhciB4MWMgPSBNYXRoLm1pbih4MSwgeDIpO1xuICB2YXIgeDJjID0gTWF0aC5tYXgoeDEsIHgyKTtcbiAgdmFyIHkxYyA9IE1hdGgubWluKHkxLCB5Mik7XG4gIHZhciB5MmMgPSBNYXRoLm1heCh5MSwgeTIpO1xuICB4MSA9IHgxYztcbiAgeDIgPSB4MmM7XG4gIHkxID0geTFjO1xuICB5MiA9IHkyYztcbiAgdmFyIGJveEJiID0gbWFrZUJvdW5kaW5nQm94KHtcbiAgICB4MTogeDEsXG4gICAgeTE6IHkxLFxuICAgIHgyOiB4MixcbiAgICB5MjogeTJcbiAgfSk7XG5cbiAgZm9yICh2YXIgZSA9IDA7IGUgPCBlbGVzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbZV07XG5cbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZTtcbiAgICAgIHZhciBub2RlQmIgPSBub2RlLmJvdW5kaW5nQm94KHtcbiAgICAgICAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlRWRnZXM6IGZhbHNlLFxuICAgICAgICBpbmNsdWRlTGFiZWxzOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJveEJiLCBub2RlQmIpICYmICFib3VuZGluZ0JveEluQm91bmRpbmdCb3gobm9kZUJiLCBib3hCYikpIHtcbiAgICAgICAgYm94LnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlID0gZWxlO1xuICAgICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuXG4gICAgICBpZiAocnMuc3RhcnRYICE9IG51bGwgJiYgcnMuc3RhcnRZICE9IG51bGwgJiYgIWluQm91bmRpbmdCb3goYm94QmIsIHJzLnN0YXJ0WCwgcnMuc3RhcnRZKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJzLmVuZFggIT0gbnVsbCAmJiBycy5lbmRZICE9IG51bGwgJiYgIWluQm91bmRpbmdCb3goYm94QmIsIHJzLmVuZFgsIHJzLmVuZFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocnMuZWRnZVR5cGUgPT09ICdiZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VsZicgfHwgcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCcgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cycgfHwgcnMuZWRnZVR5cGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgdmFyIHB0cyA9IF9wLnJzdHlsZS5iZXppZXJQdHMgfHwgX3AucnN0eWxlLmxpbmVQdHMgfHwgX3AucnN0eWxlLmhheXN0YWNrUHRzO1xuICAgICAgICB2YXIgYWxsSW5zaWRlID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghcG9pbnRJbkJvdW5kaW5nQm94KGJveEJiLCBwdHNbaV0pKSB7XG4gICAgICAgICAgICBhbGxJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbGxJbnNpZGUpIHtcbiAgICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYm94O1xufTtcblxudmFyIEJScCQyID0ge307XG5cbkJScCQyLmNhbGN1bGF0ZUFycm93QW5nbGVzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgdmFyIGlzQmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdiZXppZXInO1xuICB2YXIgaXNNdWx0aWJlemllciA9IHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInO1xuICB2YXIgaXNTZWdtZW50cyA9IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnO1xuICB2YXIgaXNDb21wb3VuZCA9IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnO1xuICB2YXIgaXNTZWxmID0gcnMuZWRnZVR5cGUgPT09ICdzZWxmJzsgLy8gRGlzcGxhY2VtZW50IGdpdmVzIGRpcmVjdGlvbiBmb3IgYXJyb3doZWFkIG9yaWVudGF0aW9uXG5cbiAgdmFyIGRpc3BYLCBkaXNwWTtcbiAgdmFyIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBtaWRYLCBtaWRZO1xuXG4gIGlmIChpc0hheXN0YWNrKSB7XG4gICAgc3RhcnRYID0gcnMuaGF5c3RhY2tQdHNbMF07XG4gICAgc3RhcnRZID0gcnMuaGF5c3RhY2tQdHNbMV07XG4gICAgZW5kWCA9IHJzLmhheXN0YWNrUHRzWzJdO1xuICAgIGVuZFkgPSBycy5oYXlzdGFja1B0c1szXTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydFggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICBzdGFydFkgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBlbmRYID0gcnMuYXJyb3dFbmRYO1xuICAgIGVuZFkgPSBycy5hcnJvd0VuZFk7XG4gIH1cblxuICBtaWRYID0gcnMubWlkWDtcbiAgbWlkWSA9IHJzLm1pZFk7IC8vIHNvdXJjZVxuICAvL1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgZGlzcFggPSBzdGFydFggLSBycy5zZWdwdHNbMF07XG4gICAgZGlzcFkgPSBzdGFydFkgLSBycy5zZWdwdHNbMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGJYID0gcWJlemllckF0KHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIDAuMSk7XG4gICAgdmFyIGJZID0gcWJlemllckF0KHB0c1sxXSwgcHRzWzNdLCBwdHNbNV0sIDAuMSk7XG4gICAgZGlzcFggPSBzdGFydFggLSBiWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gbWlkWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIG1pZFk7XG4gIH1cblxuICBycy5zcmNBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpOyAvLyBtaWQgdGFyZ2V0XG4gIC8vXG5cbiAgdmFyIG1pZFggPSBycy5taWRYO1xuICB2YXIgbWlkWSA9IHJzLm1pZFk7XG5cbiAgaWYgKGlzSGF5c3RhY2spIHtcbiAgICBtaWRYID0gKHN0YXJ0WCArIGVuZFgpIC8gMjtcbiAgICBtaWRZID0gKHN0YXJ0WSArIGVuZFkpIC8gMjtcbiAgfVxuXG4gIGRpc3BYID0gZW5kWCAtIHN0YXJ0WDtcbiAgZGlzcFkgPSBlbmRZIC0gc3RhcnRZO1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcblxuICAgIGlmIChwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgZGlzcFggPSBwdHNbaTJdIC0gcHRzW2kxXTtcbiAgICAgIGRpc3BZID0gcHRzW2kyICsgMV0gLSBwdHNbaTEgKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgdmFyIGkzID0gaTIgKyAyO1xuICAgICAgZGlzcFggPSBwdHNbaTJdIC0gcHRzW2kxXTtcbiAgICAgIGRpc3BZID0gcHRzW2kyICsgMV0gLSBwdHNbaTEgKyAxXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGNwdHMgPSBycy5jdHJscHRzO1xuICAgIHZhciBicDB4LCBicDB5O1xuICAgIHZhciBicDF4LCBicDF5O1xuXG4gICAgaWYgKGNwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIHZhciBwMCA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gc3RhcnRwdFxuXG4gICAgICB2YXIgaWMgPSBwMCArIDI7XG4gICAgICB2YXIgcDEgPSBpYyArIDI7XG4gICAgICBicDB4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMCk7XG4gICAgICBicDB5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMCk7XG4gICAgICBicDF4ID0gcWJlemllckF0KHB0c1twMF0sIHB0c1tpY10sIHB0c1twMV0sIDAuMDAwMSk7XG4gICAgICBicDF5ID0gcWJlemllckF0KHB0c1twMCArIDFdLCBwdHNbaWMgKyAxXSwgcHRzW3AxICsgMV0sIDAuMDAwMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpYyA9IHB0cy5sZW5ndGggLyAyIC0gMTsgLy8gY3RycHRcblxuICAgICAgdmFyIHAwID0gaWMgLSAyOyAvLyBzdGFydHB0XG5cbiAgICAgIHZhciBwMSA9IGljICsgMjsgLy8gZW5kcHRcblxuICAgICAgYnAweCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjQ5OTkpO1xuICAgICAgYnAweSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjQ5OTkpO1xuICAgICAgYnAxeCA9IHFiZXppZXJBdChwdHNbcDBdLCBwdHNbaWNdLCBwdHNbcDFdLCAwLjUpO1xuICAgICAgYnAxeSA9IHFiZXppZXJBdChwdHNbcDAgKyAxXSwgcHRzW2ljICsgMV0sIHB0c1twMSArIDFdLCAwLjUpO1xuICAgIH1cblxuICAgIGRpc3BYID0gYnAxeCAtIGJwMHg7XG4gICAgZGlzcFkgPSBicDF5IC0gYnAweTtcbiAgfVxuXG4gIHJzLm1pZHRndEFycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG4gIHJzLm1pZERpc3BYID0gZGlzcFg7XG4gIHJzLm1pZERpc3BZID0gZGlzcFk7IC8vIG1pZCBzb3VyY2VcbiAgLy9cblxuICBkaXNwWCAqPSAtMTtcbiAgZGlzcFkgKj0gLTE7XG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuXG4gICAgaWYgKHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkgOyBlbHNlIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMyA9IGkyICsgMjtcbiAgICAgIGRpc3BYID0gLShwdHNbaTNdIC0gcHRzW2kyXSk7XG4gICAgICBkaXNwWSA9IC0ocHRzW2kzICsgMV0gLSBwdHNbaTIgKyAxXSk7XG4gICAgfVxuICB9XG5cbiAgcnMubWlkc3JjQXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTsgLy8gdGFyZ2V0XG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IGVuZFggLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDJdO1xuICAgIGRpc3BZID0gZW5kWSAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGwgPSBwdHMubGVuZ3RoO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbbCAtIDZdLCBwdHNbbCAtIDRdLCBwdHNbbCAtIDJdLCAwLjkpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbbCAtIDVdLCBwdHNbbCAtIDNdLCBwdHNbbCAtIDFdLCAwLjkpO1xuICAgIGRpc3BYID0gZW5kWCAtIGJYO1xuICAgIGRpc3BZID0gZW5kWSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gZW5kWCAtIG1pZFg7XG4gICAgZGlzcFkgPSBlbmRZIC0gbWlkWTtcbiAgfVxuXG4gIHJzLnRndEFycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG59O1xuXG5CUnAkMi5nZXRBcnJvd1dpZHRoID0gQlJwJDIuZ2V0QXJyb3dIZWlnaHQgPSBmdW5jdGlvbiAoZWRnZVdpZHRoLCBzY2FsZSkge1xuICB2YXIgY2FjaGUgPSB0aGlzLmFycm93V2lkdGhDYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlIHx8IHt9O1xuICB2YXIgY2FjaGVkVmFsID0gY2FjaGVbZWRnZVdpZHRoICsgJywgJyArIHNjYWxlXTtcblxuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuXG4gIGNhY2hlZFZhbCA9IE1hdGgubWF4KE1hdGgucG93KGVkZ2VXaWR0aCAqIDEzLjM3LCAwLjkpLCAyOSkgKiBzY2FsZTtcbiAgY2FjaGVbZWRnZVdpZHRoICsgJywgJyArIHNjYWxlXSA9IGNhY2hlZFZhbDtcbiAgcmV0dXJuIGNhY2hlZFZhbDtcbn07XG5cbnZhciBCUnAkMyA9IHt9O1xuXG5CUnAkMy5maW5kSGF5c3RhY2tQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcblxuICAgIGlmICghcnMuaGF5c3RhY2spIHtcbiAgICAgIHZhciBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcbiAgICAgIHJzLnNvdXJjZSA9IHtcbiAgICAgICAgeDogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICB5OiBNYXRoLnNpbihhbmdsZSlcbiAgICAgIH07XG4gICAgICBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcbiAgICAgIHJzLnRhcmdldCA9IHtcbiAgICAgICAgeDogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICB5OiBNYXRoLnNpbihhbmdsZSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcmNQb3MgPSBzcmMucG9zaXRpb24oKTtcbiAgICB2YXIgdGd0UG9zID0gdGd0LnBvc2l0aW9uKCk7XG4gICAgdmFyIHNyY1cgPSBzcmMud2lkdGgoKTtcbiAgICB2YXIgdGd0VyA9IHRndC53aWR0aCgpO1xuICAgIHZhciBzcmNIID0gc3JjLmhlaWdodCgpO1xuICAgIHZhciB0Z3RIID0gdGd0LmhlaWdodCgpO1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgnaGF5c3RhY2stcmFkaXVzJykudmFsdWU7XG4gICAgdmFyIGhhbGZSYWRpdXMgPSByYWRpdXMgLyAyOyAvLyBiL2MgaGF2ZSB0byBoYWxmIHdpZHRoL2hlaWdodFxuXG4gICAgcnMuaGF5c3RhY2tQdHMgPSBycy5hbGxwdHMgPSBbcnMuc291cmNlLnggKiBzcmNXICogaGFsZlJhZGl1cyArIHNyY1Bvcy54LCBycy5zb3VyY2UueSAqIHNyY0ggKiBoYWxmUmFkaXVzICsgc3JjUG9zLnksIHJzLnRhcmdldC54ICogdGd0VyAqIGhhbGZSYWRpdXMgKyB0Z3RQb3MueCwgcnMudGFyZ2V0LnkgKiB0Z3RIICogaGFsZlJhZGl1cyArIHRndFBvcy55XTtcbiAgICBycy5taWRYID0gKHJzLmFsbHB0c1swXSArIHJzLmFsbHB0c1syXSkgLyAyO1xuICAgIHJzLm1pZFkgPSAocnMuYWxscHRzWzFdICsgcnMuYWxscHRzWzNdKSAvIDI7IC8vIGFsd2F5cyBvdmVycmlkZSBhcyBoYXlzdGFjayBpbiBjYXNlIHNldCB0byBkaWZmZXJlbnQgdHlwZSBwcmV2aW91c2x5XG5cbiAgICBycy5lZGdlVHlwZSA9ICdoYXlzdGFjayc7XG4gICAgcnMuaGF5c3RhY2sgPSB0cnVlO1xuICAgIHRoaXMuc3RvcmVFZGdlUHJvamVjdGlvbnMoZWRnZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVBcnJvd0FuZ2xlcyhlZGdlKTtcbiAgICB0aGlzLnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMoZWRnZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhlZGdlKTtcbiAgfVxufTtcblxuQlJwJDMuZmluZFNlZ21lbnRzUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvKSB7XG4gIC8vIFNlZ21lbnRzIChtdWx0aXBsZSBzdHJhaWdodCBsaW5lcylcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyxcbiAgICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcGFpckluZm8udmVjdG9yTm9ybUludmVyc2U7XG4gIHZhciBlZGdlRGlzdGFuY2VzID0gZWRnZS5wc3R5bGUoJ2VkZ2UtZGlzdGFuY2VzJykudmFsdWU7XG4gIHZhciBzZWdtZW50V3MgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC13ZWlnaHRzJyk7XG4gIHZhciBzZWdtZW50RHMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1kaXN0YW5jZXMnKTtcbiAgdmFyIHNlZ21lbnRzTiA9IE1hdGgubWluKHNlZ21lbnRXcy5wZlZhbHVlLmxlbmd0aCwgc2VnbWVudERzLnBmVmFsdWUubGVuZ3RoKTtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICBycy5zZWdwdHMgPSBbXTtcblxuICBmb3IgKHZhciBzID0gMDsgcyA8IHNlZ21lbnRzTjsgcysrKSB7XG4gICAgdmFyIHcgPSBzZWdtZW50V3MucGZWYWx1ZVtzXTtcbiAgICB2YXIgZCA9IHNlZ21lbnREcy5wZlZhbHVlW3NdO1xuICAgIHZhciB3MSA9IDEgLSB3O1xuICAgIHZhciB3MiA9IHc7XG4gICAgdmFyIG1pZHB0UHRzID0gZWRnZURpc3RhbmNlcyA9PT0gJ25vZGUtcG9zaXRpb24nID8gcG9zUHRzIDogaW50ZXJzZWN0aW9uUHRzO1xuICAgIHZhciBhZGp1c3RlZE1pZHB0ID0ge1xuICAgICAgeDogbWlkcHRQdHMueDEgKiB3MSArIG1pZHB0UHRzLngyICogdzIsXG4gICAgICB5OiBtaWRwdFB0cy55MSAqIHcxICsgbWlkcHRQdHMueTIgKiB3MlxuICAgIH07XG4gICAgcnMuc2VncHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGQsIGFkanVzdGVkTWlkcHQueSArIHZlY3Rvck5vcm1JbnZlcnNlLnkgKiBkKTtcbiAgfVxufTtcblxuQlJwJDMuZmluZExvb3BQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8sIGksIGVkZ2VJc1VuYnVuZGxlZCkge1xuICAvLyBTZWxmLWVkZ2VcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGRpckNvdW50cyA9IHBhaXJJbmZvLmRpckNvdW50cyxcbiAgICAgIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcztcbiAgdmFyIGN0cmxwdERpc3RzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyk7XG4gIHZhciBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgbG9vcERpciA9IGVkZ2UucHN0eWxlKCdsb29wLWRpcmVjdGlvbicpLnBmVmFsdWU7XG4gIHZhciBsb29wU3dwID0gZWRnZS5wc3R5bGUoJ2xvb3Atc3dlZXAnKS5wZlZhbHVlO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICBycy5lZGdlVHlwZSA9ICdzZWxmJztcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcblxuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG5cbiAgdmFyIGxvb3BBbmdsZSA9IGxvb3BEaXIgLSBNYXRoLlBJIC8gMjtcbiAgdmFyIG91dEFuZ2xlID0gbG9vcEFuZ2xlIC0gbG9vcFN3cCAvIDI7XG4gIHZhciBpbkFuZ2xlID0gbG9vcEFuZ2xlICsgbG9vcFN3cCAvIDI7IC8vIGluY3JlYXNlIGJ5IHN0ZXAgc2l6ZSBmb3Igb3ZlcmxhcHBpbmcgbG9vcHMsIGtleWVkIG9uIGRpcmVjdGlvbiBhbmQgc3dlZXAgdmFsdWVzXG5cbiAgdmFyIGRjID0gU3RyaW5nKGxvb3BEaXIgKyAnXycgKyBsb29wU3dwKTtcbiAgaiA9IGRpckNvdW50c1tkY10gPT09IHVuZGVmaW5lZCA/IGRpckNvdW50c1tkY10gPSAwIDogKytkaXJDb3VudHNbZGNdO1xuICBycy5jdHJscHRzID0gW3NyY1Bvcy54ICsgTWF0aC5jb3Mob3V0QW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihvdXRBbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpLCBzcmNQb3MueCArIE1hdGguY29zKGluQW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnkgKyBNYXRoLnNpbihpbkFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSldO1xufTtcblxuQlJwJDMuZmluZENvbXBvdW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIENvbXBvdW5kIGVkZ2VcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnY29tcG91bmQnO1xuICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcblxuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG5cbiAgdmFyIGxvb3BXID0gNTA7XG4gIHZhciBsb29wYVBvcyA9IHtcbiAgICB4OiBzcmNQb3MueCAtIHNyY1cgLyAyLFxuICAgIHk6IHNyY1Bvcy55IC0gc3JjSCAvIDJcbiAgfTtcbiAgdmFyIGxvb3BiUG9zID0ge1xuICAgIHg6IHRndFBvcy54IC0gdGd0VyAvIDIsXG4gICAgeTogdGd0UG9zLnkgLSB0Z3RIIC8gMlxuICB9O1xuICB2YXIgbG9vcFBvcyA9IHtcbiAgICB4OiBNYXRoLm1pbihsb29wYVBvcy54LCBsb29wYlBvcy54KSxcbiAgICB5OiBNYXRoLm1pbihsb29wYVBvcy55LCBsb29wYlBvcy55KVxuICB9OyAvLyBhdm9pZHMgY2FzZXMgd2l0aCBpbXBvc3NpYmxlIGJlemllcnNcblxuICB2YXIgbWluQ29tcG91bmRTdHJldGNoID0gMC41O1xuICB2YXIgY29tcG91bmRTdHJldGNoQSA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2coc3JjVyAqIDAuMDEpKTtcbiAgdmFyIGNvbXBvdW5kU3RyZXRjaEIgPSBNYXRoLm1heChtaW5Db21wb3VuZFN0cmV0Y2gsIE1hdGgubG9nKHRndFcgKiAwLjAxKSk7XG4gIHJzLmN0cmxwdHMgPSBbbG9vcFBvcy54LCBsb29wUG9zLnkgLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQSwgbG9vcFBvcy54IC0gKDEgKyBNYXRoLnBvdyhsb29wVywgMS4xMikgLyAxMDApICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSAqIGNvbXBvdW5kU3RyZXRjaEIsIGxvb3BQb3MueV07XG59O1xuXG5CUnAkMy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgLy8gU3RyYWlnaHQgZWRnZSB3aXRoaW4gYnVuZGxlXG4gIGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2guZWRnZVR5cGUgPSAnc3RyYWlnaHQnO1xufTtcblxuQlJwJDMuZmluZEJlemllclBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlLFxuICAgICAgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgICAgaW50ZXJzZWN0aW9uUHRzID0gcGFpckluZm8uaW50ZXJzZWN0aW9uUHRzO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgc3RlcFNpemUgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1zdGVwLXNpemUnKS5wZlZhbHVlO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdFdzID0gZWRnZS5wc3R5bGUoJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cycpO1xuICB2YXIgYmV6aWVyTiA9IGN0cmxwdERpc3RzICYmIGN0cmxwdFdzID8gTWF0aC5taW4oY3RybHB0RGlzdHMudmFsdWUubGVuZ3RoLCBjdHJscHRXcy52YWx1ZS5sZW5ndGgpIDogMTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBjdHJscHRXZWlnaHQgPSBjdHJscHRXcy52YWx1ZVswXTsgLy8gKE11bHRpKWJlemllclxuXG4gIHZhciBtdWx0aSA9IGVkZ2VJc1VuYnVuZGxlZDtcbiAgcnMuZWRnZVR5cGUgPSBtdWx0aSA/ICdtdWx0aWJlemllcicgOiAnYmV6aWVyJztcbiAgcnMuY3RybHB0cyA9IFtdO1xuXG4gIGZvciAodmFyIGIgPSAwOyBiIDwgYmV6aWVyTjsgYisrKSB7XG4gICAgdmFyIG5vcm1jdHJscHREaXN0ID0gKDAuNSAtIHBhaXJJbmZvLmVsZXMubGVuZ3RoIC8gMiArIGkpICogc3RlcFNpemUgKiAoZWRnZUlzU3dhcHBlZCA/IC0xIDogMSk7XG4gICAgdmFyIG1hbmN0cmxwdERpc3QgPSB2b2lkIDA7XG4gICAgdmFyIHNpZ24gPSBzaWdudW0obm9ybWN0cmxwdERpc3QpO1xuXG4gICAgaWYgKG11bHRpKSB7XG4gICAgICBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlW2JdIDogc3RlcFNpemU7IC8vIGZhbGwgYmFjayBvbiBzdGVwIHNpemVcblxuICAgICAgY3RybHB0V2VpZ2h0ID0gY3RybHB0V3MudmFsdWVbYl07XG4gICAgfVxuXG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgLy8gbXVsdGkgb3Igc2luZ2xlIHVuYnVuZGxlZFxuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmN0cmxwdERpc3QgPSBjdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBzaWduICogY3RybHB0RGlzdCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgZGlzdGFuY2VGcm9tTWlkcG9pbnQgPSBtYW5jdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBtYW5jdHJscHREaXN0IDogbm9ybWN0cmxwdERpc3Q7XG4gICAgdmFyIHcxID0gMSAtIGN0cmxwdFdlaWdodDtcbiAgICB2YXIgdzIgPSBjdHJscHRXZWlnaHQ7XG4gICAgdmFyIG1pZHB0UHRzID0gZWRnZURpc3RhbmNlcyA9PT0gJ25vZGUtcG9zaXRpb24nID8gcG9zUHRzIDogaW50ZXJzZWN0aW9uUHRzO1xuICAgIHZhciBhZGp1c3RlZE1pZHB0ID0ge1xuICAgICAgeDogbWlkcHRQdHMueDEgKiB3MSArIG1pZHB0UHRzLngyICogdzIsXG4gICAgICB5OiBtaWRwdFB0cy55MSAqIHcxICsgbWlkcHRQdHMueTIgKiB3MlxuICAgIH07XG4gICAgcnMuY3RybHB0cy5wdXNoKGFkanVzdGVkTWlkcHQueCArIHZlY3Rvck5vcm1JbnZlcnNlLnggKiBkaXN0YW5jZUZyb21NaWRwb2ludCwgYWRqdXN0ZWRNaWRwdC55ICsgdmVjdG9yTm9ybUludmVyc2UueSAqIGRpc3RhbmNlRnJvbU1pZHBvaW50KTtcbiAgfVxufTtcblxuQlJwJDMuZmluZFRheGlQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gVGF4aWNhYiBnZW9tZXRyeSB3aXRoIHR3byB0dXJucyBtYXhpbXVtXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHJzLmVkZ2VUeXBlID0gJ3NlZ21lbnRzJztcbiAgdmFyIFZFUlRJQ0FMID0gJ3ZlcnRpY2FsJztcbiAgdmFyIEhPUklaT05UQUwgPSAnaG9yaXpvbnRhbCc7XG4gIHZhciBMRUZUV0FSRCA9ICdsZWZ0d2FyZCc7XG4gIHZhciBSSUdIVFdBUkQgPSAncmlnaHR3YXJkJztcbiAgdmFyIERPV05XQVJEID0gJ2Rvd253YXJkJztcbiAgdmFyIFVQV0FSRCA9ICd1cHdhcmQnO1xuICB2YXIgQVVUTyA9ICdhdXRvJztcbiAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyxcbiAgICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgICAgc3JjSCA9IHBhaXJJbmZvLnNyY0gsXG4gICAgICB0Z3RXID0gcGFpckluZm8udGd0VyxcbiAgICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgZEluY2x1ZGVzTm9kZUJvZHkgPSBlZGdlRGlzdGFuY2VzICE9PSAnbm9kZS1wb3NpdGlvbic7XG4gIHZhciB0YXhpRGlyID0gZWRnZS5wc3R5bGUoJ3RheGktZGlyZWN0aW9uJykudmFsdWU7XG4gIHZhciByYXdUYXhpRGlyID0gdGF4aURpcjsgLy8gdW5wcm9jZXNzZWQgdmFsdWVcblxuICB2YXIgdGF4aVR1cm4gPSBlZGdlLnBzdHlsZSgndGF4aS10dXJuJyk7XG4gIHZhciB0dXJuSXNQZXJjZW50ID0gdGF4aVR1cm4udW5pdHMgPT09ICclJztcbiAgdmFyIHRheGlUdXJuUGZWYWwgPSB0YXhpVHVybi5wZlZhbHVlO1xuICB2YXIgdHVybklzTmVnYXRpdmUgPSB0YXhpVHVyblBmVmFsIDwgMDsgLy8gaS5lLiBmcm9tIHRhcmdldCBzaWRlXG5cbiAgdmFyIG1pbkQgPSBlZGdlLnBzdHlsZSgndGF4aS10dXJuLW1pbi1kaXN0YW5jZScpLnBmVmFsdWU7XG4gIHZhciBkdyA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY1cgKyB0Z3RXKSAvIDIgOiAwO1xuICB2YXIgZGggPSBkSW5jbHVkZXNOb2RlQm9keSA/IChzcmNIICsgdGd0SCkgLyAyIDogMDtcbiAgdmFyIHBkeCA9IHBvc1B0cy54MiAtIHBvc1B0cy54MTtcbiAgdmFyIHBkeSA9IHBvc1B0cy55MiAtIHBvc1B0cy55MTsgLy8gdGFrZSBhd2F5IHRoZSBlZmZlY3RpdmUgdy9oIGZyb20gdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGVsdGEgdmFsdWVcblxuICB2YXIgc3ViRFdIID0gZnVuY3Rpb24gc3ViRFdIKGR4eSwgZHdoKSB7XG4gICAgaWYgKGR4eSA+IDApIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChkeHkgLSBkd2gsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4oZHh5ICsgZHdoLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGR4ID0gc3ViRFdIKHBkeCwgZHcpO1xuICB2YXIgZHkgPSBzdWJEV0gocGR5LCBkaCk7XG4gIHZhciBpc0V4cGxpY2l0RGlyID0gZmFsc2U7XG5cbiAgaWYgKHJhd1RheGlEaXIgPT09IEFVVE8pIHtcbiAgICB0YXhpRGlyID0gTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpID8gSE9SSVpPTlRBTCA6IFZFUlRJQ0FMO1xuICB9IGVsc2UgaWYgKHJhd1RheGlEaXIgPT09IFVQV0FSRCB8fCByYXdUYXhpRGlyID09PSBET1dOV0FSRCkge1xuICAgIHRheGlEaXIgPSBWRVJUSUNBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBMRUZUV0FSRCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQpIHtcbiAgICB0YXhpRGlyID0gSE9SSVpPTlRBTDtcbiAgICBpc0V4cGxpY2l0RGlyID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBpc1ZlcnQgPSB0YXhpRGlyID09PSBWRVJUSUNBTDtcbiAgdmFyIGwgPSBpc1ZlcnQgPyBkeSA6IGR4O1xuICB2YXIgcGwgPSBpc1ZlcnQgPyBwZHkgOiBwZHg7XG4gIHZhciBzZ25MID0gc2lnbnVtKHBsKTtcbiAgdmFyIGZvcmNlZERpciA9IGZhbHNlO1xuXG4gIGlmICghKGlzRXhwbGljaXREaXIgJiYgKHR1cm5Jc1BlcmNlbnQgfHwgdHVybklzTmVnYXRpdmUpKSAvLyBmb3JjaW5nIGluIHRoaXMgY2FzZSB3b3VsZCBjYXVzZSB3ZWlyZCBncm93aW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgJiYgKHJhd1RheGlEaXIgPT09IERPV05XQVJEICYmIHBsIDwgMCB8fCByYXdUYXhpRGlyID09PSBVUFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IExFRlRXQVJEICYmIHBsID4gMCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQgJiYgcGwgPCAwKSkge1xuICAgIHNnbkwgKj0gLTE7XG4gICAgbCA9IHNnbkwgKiBNYXRoLmFicyhsKTtcbiAgICBmb3JjZWREaXIgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGQ7XG5cbiAgaWYgKHR1cm5Jc1BlcmNlbnQpIHtcbiAgICB2YXIgcCA9IHRheGlUdXJuUGZWYWwgPCAwID8gMSArIHRheGlUdXJuUGZWYWwgOiB0YXhpVHVyblBmVmFsO1xuICAgIGQgPSBwICogbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgayA9IHRheGlUdXJuUGZWYWwgPCAwID8gbCA6IDA7XG4gICAgZCA9IGsgKyB0YXhpVHVyblBmVmFsICogc2duTDtcbiAgfVxuXG4gIHZhciBnZXRJc1Rvb0Nsb3NlID0gZnVuY3Rpb24gZ2V0SXNUb29DbG9zZShkKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGQpIDwgbWluRCB8fCBNYXRoLmFicyhkKSA+PSBNYXRoLmFicyhsKTtcbiAgfTtcblxuICB2YXIgaXNUb29DbG9zZVNyYyA9IGdldElzVG9vQ2xvc2UoZCk7XG4gIHZhciBpc1Rvb0Nsb3NlVGd0ID0gZ2V0SXNUb29DbG9zZShNYXRoLmFicyhsKSAtIE1hdGguYWJzKGQpKTtcbiAgdmFyIGlzVG9vQ2xvc2UgPSBpc1Rvb0Nsb3NlU3JjIHx8IGlzVG9vQ2xvc2VUZ3Q7XG5cbiAgaWYgKGlzVG9vQ2xvc2UgJiYgIWZvcmNlZERpcikge1xuICAgIC8vIG5vbi1pZGVhbCByb3V0aW5nXG4gICAgaWYgKGlzVmVydCkge1xuICAgICAgLy8gdmVydGljYWwgZmFsbGJhY2tzXG4gICAgICB2YXIgbFNoYXBlSW5zaWRlU3JjID0gTWF0aC5hYnMocGwpIDw9IHNyY0ggLyAyO1xuICAgICAgdmFyIGxTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeCkgPD0gdGd0VyAvIDI7XG5cbiAgICAgIGlmIChsU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gaG9yaXpvbnRhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHggPSAocG9zUHRzLngxICsgcG9zUHRzLngyKSAvIDI7XG4gICAgICAgIHZhciB5MSA9IHBvc1B0cy55MSxcbiAgICAgICAgICAgIHkyID0gcG9zUHRzLnkyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeCwgeTEsIHgsIHkyXTtcbiAgICAgIH0gZWxzZSBpZiAobFNoYXBlSW5zaWRlVGd0KSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQpXG4gICAgICAgIHZhciB5ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgeDEgPSBwb3NQdHMueDEsXG4gICAgICAgICAgICB4MiA9IHBvc1B0cy54MjtcbiAgICAgICAgcnMuc2VncHRzID0gW3gxLCB5LCB4MiwgeV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMLXNoYXBlIGZhbGxiYWNrICh0dXJuIGRpc3RhbmNlIG5vdCByZXNwZWN0ZWQsIGJ1dCB3b3JrcyB3ZWxsIHdpdGggdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MSwgcG9zUHRzLnkyXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9yaXpvbnRhbCBmYWxsYmFja3NcbiAgICAgIHZhciBfbFNoYXBlSW5zaWRlU3JjID0gTWF0aC5hYnMocGwpIDw9IHNyY1cgLyAyO1xuXG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeSkgPD0gdGd0SCAvIDI7XG5cbiAgICAgIGlmIChfbFNoYXBlSW5zaWRlU3JjKSB7XG4gICAgICAgIC8vIHZlcnRpY2FsIFotc2hhcGUgKGRpcmVjdGlvbiBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgX3kgPSAocG9zUHRzLnkxICsgcG9zUHRzLnkyKSAvIDI7XG5cbiAgICAgICAgdmFyIF94ID0gcG9zUHRzLngxLFxuICAgICAgICAgICAgX3gyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gsIF95LCBfeDIsIF95XTtcbiAgICAgIH0gZWxzZSBpZiAoX2xTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF94MyA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcblxuICAgICAgICB2YXIgX3kyID0gcG9zUHRzLnkxLFxuICAgICAgICAgICAgX3kzID0gcG9zUHRzLnkyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gzLCBfeTIsIF94MywgX3kzXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgZm9yIHRyZWUgc2libGluZ3MpXG4gICAgICAgIHJzLnNlZ3B0cyA9IFtwb3NQdHMueDIsIHBvc1B0cy55MV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICB2YXIgX3k0ID0gcG9zUHRzLnkxICsgZCArIChkSW5jbHVkZXNOb2RlQm9keSA/IHNyY0ggLyAyICogc2duTCA6IDApO1xuXG4gICAgICB2YXIgX3g0ID0gcG9zUHRzLngxLFxuICAgICAgICAgIF94NSA9IHBvc1B0cy54MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDQsIF95NCwgX3g1LCBfeTRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsXG4gICAgICB2YXIgX3g2ID0gcG9zUHRzLngxICsgZCArIChkSW5jbHVkZXNOb2RlQm9keSA/IHNyY1cgLyAyICogc2duTCA6IDApO1xuXG4gICAgICB2YXIgX3k1ID0gcG9zUHRzLnkxLFxuICAgICAgICAgIF95NiA9IHBvc1B0cy55MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDYsIF95NSwgX3g2LCBfeTZdO1xuICAgIH1cbiAgfVxufTtcblxuQlJwJDMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoOyAvLyBjYW4gb25seSBjb3JyZWN0IGJlemllcnMgZm9yIG5vdy4uLlxuXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgICB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MsXG4gICAgICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgICAgIHRndEggPSBwYWlySW5mby50Z3RILFxuICAgICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgICB0Z3RTaGFwZSA9IHBhaXJJbmZvLnRndFNoYXBlO1xuICAgIHZhciBiYWRTdGFydCA9ICFudW1iZXIocnMuc3RhcnRYKSB8fCAhbnVtYmVyKHJzLnN0YXJ0WSk7XG4gICAgdmFyIGJhZEFTdGFydCA9ICFudW1iZXIocnMuYXJyb3dTdGFydFgpIHx8ICFudW1iZXIocnMuYXJyb3dTdGFydFkpO1xuICAgIHZhciBiYWRFbmQgPSAhbnVtYmVyKHJzLmVuZFgpIHx8ICFudW1iZXIocnMuZW5kWSk7XG4gICAgdmFyIGJhZEFFbmQgPSAhbnVtYmVyKHJzLmFycm93RW5kWCkgfHwgIW51bWJlcihycy5hcnJvd0VuZFkpO1xuICAgIHZhciBtaW5DcEFEaXN0RmFjdG9yID0gMztcbiAgICB2YXIgYXJyb3dXID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUsIGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlKSAqIHRoaXMuYXJyb3dTaGFwZVdpZHRoO1xuICAgIHZhciBtaW5DcEFEaXN0ID0gbWluQ3BBRGlzdEZhY3RvciAqIGFycm93VztcbiAgICB2YXIgc3RhcnRBQ3BEaXN0ID0gZGlzdCh7XG4gICAgICB4OiBycy5jdHJscHRzWzBdLFxuICAgICAgeTogcnMuY3RybHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IHJzLnN0YXJ0WCxcbiAgICAgIHk6IHJzLnN0YXJ0WVxuICAgIH0pO1xuICAgIHZhciBjbG9zZVN0YXJ0QUNwID0gc3RhcnRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgZW5kQUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5lbmRYLFxuICAgICAgeTogcnMuZW5kWVxuICAgIH0pO1xuICAgIHZhciBjbG9zZUVuZEFDcCA9IGVuZEFDcERpc3QgPCBtaW5DcEFEaXN0O1xuICAgIHZhciBvdmVybGFwcGluZyA9IGZhbHNlO1xuXG4gICAgaWYgKGJhZFN0YXJ0IHx8IGJhZEFTdGFydCB8fCBjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICBvdmVybGFwcGluZyA9IHRydWU7IC8vIHByb2plY3QgY29udHJvbCBwb2ludCBhbG9uZyBsaW5lIGZyb20gc3JjIGNlbnRyZSB0byBvdXRzaWRlIHRoZSBzcmMgc2hhcGVcbiAgICAgIC8vIChvdGhlcndpc2UgaW50ZXJzZWN0aW9uIHdpbGwgeWllbGQgbm90aGluZylcblxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcblxuICAgICAgdmFyIGNwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBjcEQueCAvIGNwTCxcbiAgICAgICAgeTogY3BELnkgLyBjcExcbiAgICAgIH07XG4gICAgICB2YXIgcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgY3BQcm9qID0ge1xuICAgICAgICAvLyAqMiByYWRpdXMgZ3VhcmFudGVlcyBvdXRzaWRlIHNoYXBlXG4gICAgICAgIHg6IHJzLmN0cmxwdHNbMF0gKyBjcE0ueCAqIDIgKiByYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBjcE0ueSAqIDIgKiByYWRpdXNcbiAgICAgIH07XG4gICAgICB2YXIgc3JjQ3RybFB0SW50biA9IHNyY1NoYXBlLmludGVyc2VjdExpbmUoc3JjUG9zLngsIHNyY1Bvcy55LCBzcmNXLCBzcmNILCBjcFByb2oueCwgY3BQcm9qLnksIDApO1xuXG4gICAgICBpZiAoY2xvc2VTdGFydEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIGNwTS54ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgICBycy5jdHJscHRzWzFdID0gcnMuY3RybHB0c1sxXSArIGNwTS55ICogKG1pbkNwQURpc3QgLSBzdGFydEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHNyY0N0cmxQdEludG5bMF0gKyBjcE0ueCAqIG1pbkNwQURpc3Q7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBzcmNDdHJsUHRJbnRuWzFdICsgY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlOyAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG5cbiAgICAgIHZhciBfY3BEID0ge1xuICAgICAgICAvLyBkZWx0YVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdIC0gdGd0UG9zLngsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gLSB0Z3RQb3MueVxuICAgICAgfTtcblxuICAgICAgdmFyIF9jcEwgPSBNYXRoLnNxcnQoX2NwRC54ICogX2NwRC54ICsgX2NwRC55ICogX2NwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcblxuXG4gICAgICB2YXIgX2NwTSA9IHtcbiAgICAgICAgLy8gbm9ybWFsaXNlZCBkZWx0YVxuICAgICAgICB4OiBfY3BELnggLyBfY3BMLFxuICAgICAgICB5OiBfY3BELnkgLyBfY3BMXG4gICAgICB9O1xuXG4gICAgICB2YXIgX3JhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuXG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwKTtcblxuICAgICAgaWYgKGNsb3NlRW5kQUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgX2NwTS54ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAobWluQ3BBRGlzdCAtIGVuZEFDcERpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnMuY3RybHB0c1swXSA9IHRndEN0cmxQdEludG5bMF0gKyBfY3BNLnggKiBtaW5DcEFEaXN0O1xuICAgICAgICBycy5jdHJscHRzWzFdID0gdGd0Q3RybFB0SW50blsxXSArIF9jcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG92ZXJsYXBwaW5nKSB7XG4gICAgICAvLyByZWNhbGMgZW5kcHRzXG4gICAgICB0aGlzLmZpbmRFbmRwb2ludHMoZWRnZSk7XG4gICAgfVxuICB9XG59O1xuXG5CUnAkMy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnbXVsdGliZXppZXInIHx8IHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuXG4gICAgZm9yICh2YXIgYiA9IDA7IGIgKyAxIDwgcnMuY3RybHB0cy5sZW5ndGg7IGIgKz0gMikge1xuICAgICAgLy8gY3RybCBwdCBpdHNlbGZcbiAgICAgIHJzLmFsbHB0cy5wdXNoKHJzLmN0cmxwdHNbYl0sIHJzLmN0cmxwdHNbYiArIDFdKTsgLy8gdGhlIG1pZHB0IGJldHdlZW4gY3RybHB0cyBhcyBpbnRlcm1lZGlhdGUgZGVzdGluYXRpb24gcHRzXG5cbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgdmFyIG0sIG10O1xuXG4gICAgaWYgKHJzLmN0cmxwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBycy5taWRYID0gcnMuYWxscHRzW21dO1xuICAgICAgcnMubWlkWSA9IHJzLmFsbHB0c1ttICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBycy5hbGxwdHMubGVuZ3RoIC8gMiAtIDM7XG4gICAgICBtdCA9IDAuNTtcbiAgICAgIHJzLm1pZFggPSBxYmV6aWVyQXQocnMuYWxscHRzW21dLCBycy5hbGxwdHNbbSArIDJdLCBycy5hbGxwdHNbbSArIDRdLCBtdCk7XG4gICAgICBycy5taWRZID0gcWJlemllckF0KHJzLmFsbHB0c1ttICsgMV0sIHJzLmFsbHB0c1ttICsgM10sIHJzLmFsbHB0c1ttICsgNV0sIG10KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocnMuZWRnZVR5cGUgPT09ICdzdHJhaWdodCcpIHtcbiAgICAvLyBuZWVkIHRvIGNhbGMgdGhlc2UgYWZ0ZXIgZW5kcHRzXG4gICAgcnMuYWxscHRzID0gW3JzLnN0YXJ0WCwgcnMuc3RhcnRZLCBycy5lbmRYLCBycy5lbmRZXTsgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuXG4gICAgcnMubWlkWCA9IChycy5zdGFydFggKyBycy5lbmRYICsgcnMuYXJyb3dTdGFydFggKyBycy5hcnJvd0VuZFgpIC8gNDtcbiAgICBycy5taWRZID0gKHJzLnN0YXJ0WSArIHJzLmVuZFkgKyBycy5hcnJvd1N0YXJ0WSArIHJzLmFycm93RW5kWSkgLyA0O1xuICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnKSB7XG4gICAgcnMuYWxscHRzID0gW107XG4gICAgcnMuYWxscHRzLnB1c2gocnMuc3RhcnRYLCBycy5zdGFydFkpO1xuICAgIHJzLmFsbHB0cy5wdXNoLmFwcGx5KHJzLmFsbHB0cywgcnMuc2VncHRzKTtcbiAgICBycy5hbGxwdHMucHVzaChycy5lbmRYLCBycy5lbmRZKTtcblxuICAgIGlmIChycy5zZWdwdHMubGVuZ3RoICUgNCA9PT0gMCkge1xuICAgICAgdmFyIGkyID0gcnMuc2VncHRzLmxlbmd0aCAvIDI7XG4gICAgICB2YXIgaTEgPSBpMiAtIDI7XG4gICAgICBycy5taWRYID0gKHJzLnNlZ3B0c1tpMV0gKyBycy5zZWdwdHNbaTJdKSAvIDI7XG4gICAgICBycy5taWRZID0gKHJzLnNlZ3B0c1tpMSArIDFdICsgcnMuc2VncHRzW2kyICsgMV0pIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9pID0gcnMuc2VncHRzLmxlbmd0aCAvIDIgLSAxO1xuXG4gICAgICBycy5taWRYID0gcnMuc2VncHRzW19pXTtcbiAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICB9XG4gIH1cbn07XG5cbkJScCQzLmNoZWNrRm9ySW52YWxpZEVkZ2VXYXJuaW5nID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcblxuICBpZiAocnMubm9kZXNPdmVybGFwIHx8IG51bWJlcihycy5zdGFydFgpICYmIG51bWJlcihycy5zdGFydFkpICYmIG51bWJlcihycy5lbmRYKSAmJiBudW1iZXIocnMuZW5kWSkpIHtcbiAgICBycy5sb2dnZWRFcnIgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXJzLmxvZ2dlZEVycikge1xuICAgICAgcnMubG9nZ2VkRXJyID0gdHJ1ZTtcbiAgICAgIHdhcm4oJ0VkZ2UgYCcgKyBlZGdlLmlkKCkgKyAnYCBoYXMgaW52YWxpZCBlbmRwb2ludHMgYW5kIHNvIGl0IGlzIGltcG9zc2libGUgdG8gZHJhdy4gIEFkanVzdCB5b3VyIGVkZ2Ugc3R5bGUgKGUuZy4gY29udHJvbCBwb2ludHMpIGFjY29yZGluZ2x5IG9yIHVzZSBhbiBhbHRlcm5hdGl2ZSBlZGdlIHR5cGUuICBUaGlzIGlzIGV4cGVjdGVkIGJlaGF2aW91ciB3aGVuIHRoZSBzb3VyY2Ugbm9kZSBhbmQgdGhlIHRhcmdldCBub2RlIG92ZXJsYXAuJyk7XG4gICAgfVxuICB9XG59O1xuXG5CUnAkMy5maW5kRWRnZUNvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIGhhc2hUYWJsZSA9IHtcbiAgICBtYXA6IG5ldyBNYXAkMSgpLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KHBhaXJJZCkge1xuICAgICAgdmFyIG1hcDIgPSB0aGlzLm1hcC5nZXQocGFpcklkWzBdKTtcblxuICAgICAgaWYgKG1hcDIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWFwMi5nZXQocGFpcklkWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQocGFpcklkLCB2YWwpIHtcbiAgICAgIHZhciBtYXAyID0gdGhpcy5tYXAuZ2V0KHBhaXJJZFswXSk7XG5cbiAgICAgIGlmIChtYXAyID09IG51bGwpIHtcbiAgICAgICAgbWFwMiA9IG5ldyBNYXAkMSgpO1xuICAgICAgICB0aGlzLm1hcC5zZXQocGFpcklkWzBdLCBtYXAyKTtcbiAgICAgIH1cblxuICAgICAgbWFwMi5zZXQocGFpcklkWzFdLCB2YWwpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHBhaXJJZHMgPSBbXTtcbiAgdmFyIGhheXN0YWNrRWRnZXMgPSBbXTsgLy8gY3JlYXRlIGEgdGFibGUgb2YgZWRnZSAoc3JjLCB0Z3QpID0+IGxpc3Qgb2YgZWRnZXMgYmV0d2VlbiB0aGVtXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VydmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlOyAvLyBpZ25vcmUgZWRnZXMgd2hvIGFyZSBub3QgdG8gYmUgZGlzcGxheWVkXG4gICAgLy8gdGhleSBzaG91bGRuJ3QgdGFrZSB1cCBzcGFjZVxuXG4gICAgaWYgKGVkZ2UucmVtb3ZlZCgpIHx8ICFlZGdlLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VydmVTdHlsZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgaGF5c3RhY2tFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGVkZ2VJc1VuYnVuZGxlZCA9IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlID09PSAnc2VnbWVudHMnIHx8IGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodCcgfHwgY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuICAgIHZhciBlZGdlSXNCZXppZXIgPSBjdXJ2ZVN0eWxlID09PSAndW5idW5kbGVkLWJlemllcicgfHwgY3VydmVTdHlsZSA9PT0gJ2Jlemllcic7XG4gICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgIHZhciBzcmNJbmRleCA9IHNyYy5wb29sSW5kZXgoKTtcbiAgICB2YXIgdGd0SW5kZXggPSB0Z3QucG9vbEluZGV4KCk7XG4gICAgdmFyIHBhaXJJZCA9IFtzcmNJbmRleCwgdGd0SW5kZXhdLnNvcnQoKTtcbiAgICB2YXIgdGFibGVFbnRyeSA9IGhhc2hUYWJsZS5nZXQocGFpcklkKTtcblxuICAgIGlmICh0YWJsZUVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRhYmxlRW50cnkgPSB7XG4gICAgICAgIGVsZXM6IFtdXG4gICAgICB9O1xuICAgICAgaGFzaFRhYmxlLnNldChwYWlySWQsIHRhYmxlRW50cnkpO1xuICAgICAgcGFpcklkcy5wdXNoKHBhaXJJZCk7XG4gICAgfVxuXG4gICAgdGFibGVFbnRyeS5lbGVzLnB1c2goZWRnZSk7XG5cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc1VuYnVuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGVkZ2VJc0Jlemllcikge1xuICAgICAgdGFibGVFbnRyeS5oYXNCZXppZXIgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBmb3IgZWFjaCBwYWlyIChzcmMsIHRndCksIGNyZWF0ZSB0aGUgY3RybCBwdHNcbiAgLy8gTmVzdGVkIGZvciBsb29wIGlzIE9LOyB0b3RhbCBudW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgYm90aCBsb29wcyA9IGVkZ2VDb3VudFxuXG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AocCkge1xuICAgIHZhciBwYWlySWQgPSBwYWlySWRzW3BdO1xuICAgIHZhciBwYWlySW5mbyA9IGhhc2hUYWJsZS5nZXQocGFpcklkKTtcbiAgICB2YXIgc3dhcHBlZHBhaXJJbmZvID0gdm9pZCAwO1xuXG4gICAgaWYgKCFwYWlySW5mby5oYXNVbmJ1bmRsZWQpIHtcbiAgICAgIHZhciBwbGxFZGdlcyA9IHBhaXJJbmZvLmVsZXNbMF0ucGFyYWxsZWxFZGdlcygpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZS5pc0J1bmRsZWRCZXppZXIoKTtcbiAgICAgIH0pO1xuICAgICAgY2xlYXJBcnJheShwYWlySW5mby5lbGVzKTtcbiAgICAgIHBsbEVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIHBhaXJJbmZvLmVsZXMucHVzaChlZGdlKTtcbiAgICAgIH0pOyAvLyBmb3IgZWFjaCBwYWlyIGlkLCB0aGUgZWRnZXMgc2hvdWxkIGJlIHNvcnRlZCBieSBpbmRleFxuXG4gICAgICBwYWlySW5mby5lbGVzLnNvcnQoZnVuY3Rpb24gKGVkZ2UxLCBlZGdlMikge1xuICAgICAgICByZXR1cm4gZWRnZTEucG9vbEluZGV4KCkgLSBlZGdlMi5wb29sSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBmaXJzdEVkZ2UgPSBwYWlySW5mby5lbGVzWzBdO1xuICAgIHZhciBzcmMgPSBmaXJzdEVkZ2Uuc291cmNlKCk7XG4gICAgdmFyIHRndCA9IGZpcnN0RWRnZS50YXJnZXQoKTsgLy8gbWFrZSBzdXJlIHNyYy90Z3QgZGlzdGluY3Rpb24gaXMgY29uc2lzdGVudCB3LnIudC4gcGFpcklkXG5cbiAgICBpZiAoc3JjLnBvb2xJbmRleCgpID4gdGd0LnBvb2xJbmRleCgpKSB7XG4gICAgICB2YXIgdGVtcCA9IHNyYztcbiAgICAgIHNyYyA9IHRndDtcbiAgICAgIHRndCA9IHRlbXA7XG4gICAgfVxuXG4gICAgdmFyIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHBhaXJJbmZvLnNyY1cgPSBzcmMub3V0ZXJXaWR0aCgpO1xuICAgIHZhciBzcmNIID0gcGFpckluZm8uc3JjSCA9IHNyYy5vdXRlckhlaWdodCgpO1xuICAgIHZhciB0Z3RXID0gcGFpckluZm8udGd0VyA9IHRndC5vdXRlcldpZHRoKCk7XG4gICAgdmFyIHRndEggPSBwYWlySW5mby50Z3RIID0gdGd0Lm91dGVySGVpZ2h0KCk7XG5cbiAgICB2YXIgc3JjU2hhcGUgPSBwYWlySW5mby5zcmNTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUoc3JjKV07XG5cbiAgICB2YXIgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSA9IHIubm9kZVNoYXBlc1tfdGhpcy5nZXROb2RlU2hhcGUodGd0KV07XG5cbiAgICBwYWlySW5mby5kaXJDb3VudHMgPSB7XG4gICAgICAnbm9ydGgnOiAwLFxuICAgICAgJ3dlc3QnOiAwLFxuICAgICAgJ3NvdXRoJzogMCxcbiAgICAgICdlYXN0JzogMCxcbiAgICAgICdub3J0aHdlc3QnOiAwLFxuICAgICAgJ3NvdXRod2VzdCc6IDAsXG4gICAgICAnbm9ydGhlYXN0JzogMCxcbiAgICAgICdzb3V0aGVhc3QnOiAwXG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBhaXJJbmZvLmVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgdmFyIF9lZGdlID0gcGFpckluZm8uZWxlc1tfaTJdO1xuICAgICAgdmFyIHJzID0gX2VkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgICAgIHZhciBfY3VydmVTdHlsZSA9IF9lZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcblxuICAgICAgdmFyIF9lZGdlSXNVbmJ1bmRsZWQgPSBfY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IF9jdXJ2ZVN0eWxlID09PSAnc2VnbWVudHMnIHx8IF9jdXJ2ZVN0eWxlID09PSAndGF4aSc7IC8vIHdoZXRoZXIgdGhlIG5vcm1hbGlzZWQgcGFpciBvcmRlciBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSdzIHNyYy10Z3Qgb3JkZXJcblxuXG4gICAgICB2YXIgZWRnZUlzU3dhcHBlZCA9ICFzcmMuc2FtZShfZWRnZS5zb3VyY2UoKSk7XG5cbiAgICAgIGlmICghcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiAmJiBzcmMgIT09IHRndCAmJiAocGFpckluZm8uaGFzQmV6aWVyIHx8IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCkpIHtcbiAgICAgICAgcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiA9IHRydWU7IC8vIHB0IG91dHNpZGUgc3JjIHNoYXBlIHRvIGNhbGMgZGlzdGFuY2UvZGlzcGxhY2VtZW50IGZyb20gc3JjIHRvIHRndFxuXG4gICAgICAgIHZhciBzcmNPdXRzaWRlID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIHRndFBvcy54LCB0Z3RQb3MueSwgMCk7XG4gICAgICAgIHZhciBzcmNJbnRuID0gcGFpckluZm8uc3JjSW50biA9IHNyY091dHNpZGU7IC8vIHB0IG91dHNpZGUgdGd0IHNoYXBlIHRvIGNhbGMgZGlzdGFuY2UvZGlzcGxhY2VtZW50IGZyb20gc3JjIHRvIHRndFxuXG4gICAgICAgIHZhciB0Z3RPdXRzaWRlID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIHNyY1Bvcy54LCBzcmNQb3MueSwgMCk7XG4gICAgICAgIHZhciB0Z3RJbnRuID0gcGFpckluZm8udGd0SW50biA9IHRndE91dHNpZGU7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY091dHNpZGVbMF0sXG4gICAgICAgICAgeDI6IHRndE91dHNpZGVbMF0sXG4gICAgICAgICAgeTE6IHNyY091dHNpZGVbMV0sXG4gICAgICAgICAgeTI6IHRndE91dHNpZGVbMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyA9IHtcbiAgICAgICAgICB4MTogc3JjUG9zLngsXG4gICAgICAgICAgeDI6IHRndFBvcy54LFxuICAgICAgICAgIHkxOiBzcmNQb3MueSxcbiAgICAgICAgICB5MjogdGd0UG9zLnlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGR5ID0gdGd0T3V0c2lkZVsxXSAtIHNyY091dHNpZGVbMV07XG4gICAgICAgIHZhciBkeCA9IHRndE91dHNpZGVbMF0gLSBzcmNPdXRzaWRlWzBdO1xuICAgICAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgIHZhciB2ZWN0b3IgPSBwYWlySW5mby52ZWN0b3IgPSB7XG4gICAgICAgICAgeDogZHgsXG4gICAgICAgICAgeTogZHlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm0gPSBwYWlySW5mby52ZWN0b3JOb3JtID0ge1xuICAgICAgICAgIHg6IHZlY3Rvci54IC8gbCxcbiAgICAgICAgICB5OiB2ZWN0b3IueSAvIGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0ge1xuICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLnksXG4gICAgICAgICAgeTogdmVjdG9yTm9ybS54XG4gICAgICAgIH07IC8vIGlmIG5vZGUgc2hhcGVzIG92ZXJsYXAsIHRoZW4gbm8gY3RybCBwdHMgdG8gZHJhd1xuXG4gICAgICAgIHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCA9ICFudW1iZXIobCkgfHwgdGd0U2hhcGUuY2hlY2tQb2ludChzcmNPdXRzaWRlWzBdLCBzcmNPdXRzaWRlWzFdLCAwLCB0Z3RXLCB0Z3RILCB0Z3RQb3MueCwgdGd0UG9zLnkpIHx8IHNyY1NoYXBlLmNoZWNrUG9pbnQodGd0T3V0c2lkZVswXSwgdGd0T3V0c2lkZVsxXSwgMCwgc3JjVywgc3JjSCwgc3JjUG9zLngsIHNyY1Bvcy55KTtcbiAgICAgICAgcGFpckluZm8udmVjdG9yTm9ybUludmVyc2UgPSB2ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICAgICAgc3dhcHBlZHBhaXJJbmZvID0ge1xuICAgICAgICAgIG5vZGVzT3ZlcmxhcDogcGFpckluZm8ubm9kZXNPdmVybGFwLFxuICAgICAgICAgIGRpckNvdW50czogcGFpckluZm8uZGlyQ291bnRzLFxuICAgICAgICAgIGNhbGN1bGF0ZWRJbnRlcnNlY3Rpb246IHRydWUsXG4gICAgICAgICAgaGFzQmV6aWVyOiBwYWlySW5mby5oYXNCZXppZXIsXG4gICAgICAgICAgaGFzVW5idW5kbGVkOiBwYWlySW5mby5oYXNVbmJ1bmRsZWQsXG4gICAgICAgICAgZWxlczogcGFpckluZm8uZWxlcyxcbiAgICAgICAgICBzcmNQb3M6IHRndFBvcyxcbiAgICAgICAgICB0Z3RQb3M6IHNyY1BvcyxcbiAgICAgICAgICBzcmNXOiB0Z3RXLFxuICAgICAgICAgIHNyY0g6IHRndEgsXG4gICAgICAgICAgdGd0Vzogc3JjVyxcbiAgICAgICAgICB0Z3RIOiBzcmNILFxuICAgICAgICAgIHNyY0ludG46IHRndEludG4sXG4gICAgICAgICAgdGd0SW50bjogc3JjSW50bixcbiAgICAgICAgICBzcmNTaGFwZTogdGd0U2hhcGUsXG4gICAgICAgICAgdGd0U2hhcGU6IHNyY1NoYXBlLFxuICAgICAgICAgIHBvc1B0czoge1xuICAgICAgICAgICAgeDE6IHBvc1B0cy54MixcbiAgICAgICAgICAgIHkxOiBwb3NQdHMueTIsXG4gICAgICAgICAgICB4MjogcG9zUHRzLngxLFxuICAgICAgICAgICAgeTI6IHBvc1B0cy55MVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW50ZXJzZWN0aW9uUHRzOiB7XG4gICAgICAgICAgICB4MTogaW50ZXJzZWN0aW9uUHRzLngyLFxuICAgICAgICAgICAgeTE6IGludGVyc2VjdGlvblB0cy55MixcbiAgICAgICAgICAgIHgyOiBpbnRlcnNlY3Rpb25QdHMueDEsXG4gICAgICAgICAgICB5MjogaW50ZXJzZWN0aW9uUHRzLnkxXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3I6IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3IueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3IueVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yTm9ybToge1xuICAgICAgICAgICAgeDogLXZlY3Rvck5vcm0ueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtLnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yTm9ybUludmVyc2UueCxcbiAgICAgICAgICAgIHk6IC12ZWN0b3JOb3JtSW52ZXJzZS55XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFzc2VkUGFpckluZm8gPSBlZGdlSXNTd2FwcGVkID8gc3dhcHBlZHBhaXJJbmZvIDogcGFpckluZm87XG4gICAgICBycy5ub2Rlc092ZXJsYXAgPSBwYXNzZWRQYWlySW5mby5ub2Rlc092ZXJsYXA7XG4gICAgICBycy5zcmNJbnRuID0gcGFzc2VkUGFpckluZm8uc3JjSW50bjtcbiAgICAgIHJzLnRndEludG4gPSBwYXNzZWRQYWlySW5mby50Z3RJbnRuO1xuXG4gICAgICBpZiAoaGFzQ29tcG91bmRzICYmIChzcmMuaXNQYXJlbnQoKSB8fCBzcmMuaXNDaGlsZCgpIHx8IHRndC5pc1BhcmVudCgpIHx8IHRndC5pc0NoaWxkKCkpICYmIChzcmMucGFyZW50cygpLmFueVNhbWUodGd0KSB8fCB0Z3QucGFyZW50cygpLmFueVNhbWUoc3JjKSB8fCBzcmMuc2FtZSh0Z3QpICYmIHNyYy5pc1BhcmVudCgpKSkge1xuICAgICAgICBfdGhpcy5maW5kQ29tcG91bmRMb29wUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgX3RoaXMuZmluZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgICAgICBfdGhpcy5maW5kU2VnbWVudHNQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoX2N1cnZlU3R5bGUgPT09ICd0YXhpJykge1xuICAgICAgICBfdGhpcy5maW5kVGF4aVBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCAhX2VkZ2VJc1VuYnVuZGxlZCAmJiBwYWlySW5mby5lbGVzLmxlbmd0aCAlIDIgPT09IDEgJiYgX2kyID09PSBNYXRoLmZsb29yKHBhaXJJbmZvLmVsZXMubGVuZ3RoIC8gMikpIHtcbiAgICAgICAgX3RoaXMuZmluZFN0cmFpZ2h0RWRnZVBvaW50cyhfZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5maW5kQmV6aWVyUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZmluZEVuZHBvaW50cyhfZWRnZSk7XG5cbiAgICAgIF90aGlzLnRyeVRvQ29ycmVjdEludmFsaWRQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcblxuICAgICAgX3RoaXMuY2hlY2tGb3JJbnZhbGlkRWRnZVdhcm5pbmcoX2VkZ2UpO1xuXG4gICAgICBfdGhpcy5zdG9yZUFsbHB0cyhfZWRnZSk7XG5cbiAgICAgIF90aGlzLnN0b3JlRWRnZVByb2plY3Rpb25zKF9lZGdlKTtcblxuICAgICAgX3RoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoX2VkZ2UpO1xuXG4gICAgICBfdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKF9lZGdlKTtcblxuICAgICAgX3RoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMoX2VkZ2UpO1xuICAgIH0gLy8gZm9yIHBhaXIgZWRnZXNcblxuICB9O1xuXG4gIGZvciAodmFyIHAgPSAwOyBwIDwgcGFpcklkcy5sZW5ndGg7IHArKykge1xuICAgIF9sb29wKHApO1xuICB9IC8vIGZvciBwYWlyIGlkc1xuICAvLyBoYXlzdGFja3MgYXZvaWQgdGhlIGV4cGVuc2Ugb2YgcGFpckluZm8gc3R1ZmYgKGludGVyc2VjdGlvbnMgZXRjLilcblxuXG4gIHRoaXMuZmluZEhheXN0YWNrUG9pbnRzKGhheXN0YWNrRWRnZXMpO1xufTtcblxuZnVuY3Rpb24gZ2V0UHRzKHB0cykge1xuICB2YXIgcmV0UHRzID0gW107XG5cbiAgaWYgKHB0cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICB2YXIgeSA9IHB0c1tpICsgMV07XG4gICAgcmV0UHRzLnB1c2goe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXRQdHM7XG59XG5cbkJScCQzLmdldFNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgdHlwZSA9IHJzLmVkZ2VUeXBlO1xuXG4gIGlmICh0eXBlID09PSAnc2VnbWVudHMnKSB7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gICAgcmV0dXJuIGdldFB0cyhycy5zZWdwdHMpO1xuICB9XG59O1xuXG5CUnAkMy5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcblxuICBpZiAodHlwZSA9PT0gJ2JlemllcicgfHwgdHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCB0eXBlID09PSAnc2VsZicgfHwgdHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICAgIHJldHVybiBnZXRQdHMocnMuY3RybHB0cyk7XG4gIH1cbn07XG5cbkJScCQzLmdldEVkZ2VNaWRwb2ludCA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHRoaXMucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVkZ2UpO1xuICByZXR1cm4ge1xuICAgIHg6IHJzLm1pZFgsXG4gICAgeTogcnMubWlkWVxuICB9O1xufTtcblxudmFyIEJScCQ0ID0ge307XG5cbkJScCQ0Lm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuXG4gIGlmIChwcm9wLnZhbHVlLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciBwID0gW3Byb3AucGZWYWx1ZVswXSwgcHJvcC5wZlZhbHVlWzFdXTtcblxuICAgIGlmIChwcm9wLnVuaXRzWzBdID09PSAnJScpIHtcbiAgICAgIHBbMF0gPSBwWzBdICogdztcbiAgICB9XG5cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuXG4gICAgcFswXSArPSBucG9zLng7XG4gICAgcFsxXSArPSBucG9zLnk7XG4gICAgcmV0dXJuIHA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFuZ2xlID0gcHJvcC5wZlZhbHVlWzBdO1xuICAgIGFuZ2xlID0gLU1hdGguUEkgLyAyICsgYW5nbGU7IC8vIHN0YXJ0IGF0IDEyIG8nY2xvY2tcblxuICAgIHZhciBsID0gMiAqIE1hdGgubWF4KHcsIGgpO1xuICAgIHZhciBfcCA9IFtucG9zLnggKyBNYXRoLmNvcyhhbmdsZSkgKiBsLCBucG9zLnkgKyBNYXRoLnNpbihhbmdsZSkgKiBsXTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5pbnRlcnNlY3RMaW5lKG5wb3MueCwgbnBvcy55LCB3LCBoLCBfcFswXSwgX3BbMV0sIDApO1xuICB9XG59O1xuXG5CUnAkNC5maW5kRW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW50ZXJzZWN0O1xuICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgdmFyIHRhcmdldCA9IGVkZ2UudGFyZ2V0KClbMF07XG4gIHZhciBzcmNQb3MgPSBzb3VyY2UucG9zaXRpb24oKTtcbiAgdmFyIHRndFBvcyA9IHRhcmdldC5wb3NpdGlvbigpO1xuICB2YXIgdGd0QXJTaGFwZSA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHNyY0FyU2hhcGUgPSBlZGdlLnBzdHlsZSgnc291cmNlLWFycm93LXNoYXBlJykudmFsdWU7XG4gIHZhciB0Z3REaXN0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjRGlzdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZGlzdGFuY2UtZnJvbS1ub2RlJykucGZWYWx1ZTtcbiAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG4gIHZhciB0YXhpID0gY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuICB2YXIgc2VsZiA9IGV0ID09PSAnc2VsZicgfHwgZXQgPT09ICdjb21wb3VuZCc7XG4gIHZhciBiZXppZXIgPSBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdtdWx0aWJlemllcicgfHwgc2VsZjtcbiAgdmFyIG11bHRpID0gZXQgIT09ICdiZXppZXInO1xuICB2YXIgbGluZXMgPSBldCA9PT0gJ3N0cmFpZ2h0JyB8fCBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIHNlZ21lbnRzID0gZXQgPT09ICdzZWdtZW50cyc7XG4gIHZhciBoYXNFbmRwdHMgPSBiZXppZXIgfHwgbXVsdGkgfHwgbGluZXM7XG4gIHZhciBvdmVycmlkZUVuZHB0cyA9IHNlbGYgfHwgdGF4aTtcbiAgdmFyIHNyY01hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1lbmRwb2ludCcpO1xuICB2YXIgc3JjTWFuRW5kcHRWYWwgPSBvdmVycmlkZUVuZHB0cyA/ICdvdXRzaWRlLXRvLW5vZGUnIDogc3JjTWFuRW5kcHQudmFsdWU7XG4gIHZhciB0Z3RNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCd0YXJnZXQtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0VmFsID0gb3ZlcnJpZGVFbmRwdHMgPyAnb3V0c2lkZS10by1ub2RlJyA6IHRndE1hbkVuZHB0LnZhbHVlO1xuICBycy5zcmNNYW5FbmRwdCA9IHNyY01hbkVuZHB0O1xuICBycy50Z3RNYW5FbmRwdCA9IHRndE1hbkVuZHB0O1xuICB2YXIgcDE7IC8vIGxhc3Qga25vd24gcG9pbnQgb2YgZWRnZSBvbiB0YXJnZXQgc2lkZVxuXG4gIHZhciBwMjsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHNvdXJjZSBzaWRlXG5cbiAgdmFyIHAxX2k7IC8vIHBvaW50IHRvIGludGVyc2VjdCB3aXRoIHRhcmdldCBzaGFwZVxuXG4gIHZhciBwMl9pOyAvLyBwb2ludCB0byBpbnRlcnNlY3Qgd2l0aCBzb3VyY2Ugc2hhcGVcblxuICBpZiAoYmV6aWVyKSB7XG4gICAgdmFyIGNwU3RhcnQgPSBbcnMuY3RybHB0c1swXSwgcnMuY3RybHB0c1sxXV07XG4gICAgdmFyIGNwRW5kID0gbXVsdGkgPyBbcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDJdLCBycy5jdHJscHRzW3JzLmN0cmxwdHMubGVuZ3RoIC0gMV1dIDogY3BTdGFydDtcbiAgICBwMSA9IGNwRW5kO1xuICAgIHAyID0gY3BTdGFydDtcbiAgfSBlbHNlIGlmIChsaW5lcykge1xuICAgIHZhciBzcmNBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFt0Z3RQb3MueCwgdGd0UG9zLnldIDogcnMuc2VncHRzLnNsaWNlKDAsIDIpO1xuICAgIHZhciB0Z3RBcnJvd0Zyb21QdCA9ICFzZWdtZW50cyA/IFtzcmNQb3MueCwgc3JjUG9zLnldIDogcnMuc2VncHRzLnNsaWNlKHJzLnNlZ3B0cy5sZW5ndGggLSAyKTtcbiAgICBwMSA9IHRndEFycm93RnJvbVB0O1xuICAgIHAyID0gc3JjQXJyb3dGcm9tUHQ7XG4gIH1cblxuICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbdGd0UG9zLngsIHRndFBvcy55XTtcbiAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHRhcmdldCwgdGd0TWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnRndEludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgdGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMV9pID0gcDE7XG4gICAgfSBlbHNlIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgdGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMV9pID0gW3NyY1Bvcy54LCBzcmNQb3MueV07XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHRhcmdldCldLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0YXJnZXQub3V0ZXJXaWR0aCgpLCB0YXJnZXQub3V0ZXJIZWlnaHQoKSwgcDFfaVswXSwgcDFfaVsxXSwgMCk7XG5cbiAgICBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnIHx8IHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgdmFyIHRycyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICAgIHZhciBsdyA9IHRycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIGxoID0gdHJzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIGx4ID0gdHJzLmxhYmVsWDtcbiAgICAgIHZhciBseSA9IHRycy5sYWJlbFk7XG4gICAgICB2YXIgbHcyID0gbHcgLyAyO1xuICAgICAgdmFyIGxoMiA9IGxoIC8gMjtcbiAgICAgIHZhciB2YSA9IHRhcmdldC5wc3R5bGUoJ3RleHQtdmFsaWduJykudmFsdWU7XG5cbiAgICAgIGlmICh2YSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgbHkgLT0gbGgyO1xuICAgICAgfSBlbHNlIGlmICh2YSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgbHkgKz0gbGgyO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuXG4gICAgICBpZiAoaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBseCAtPSBsdzI7XG4gICAgICB9IGVsc2UgaWYgKGhhID09PSAncmlnaHQnKSB7XG4gICAgICAgIGx4ICs9IGx3MjtcbiAgICAgIH1cblxuICAgICAgdmFyIGxhYmVsSW50ZXJzZWN0ID0gcG9seWdvbkludGVyc2VjdExpbmUocDFfaVswXSwgcDFfaVsxXSwgW2x4IC0gbHcyLCBseSAtIGxoMiwgbHggKyBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgKyBsaDIsIGx4IC0gbHcyLCBseSArIGxoMl0sIHRndFBvcy54LCB0Z3RQb3MueSk7XG5cbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG5cbiAgICAgICAgaWYgKGxhYkludFNxZGlzdCA8IGludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IGxhYmVsSW50ZXJzZWN0O1xuICAgICAgICAgIG1pblNxRGlzdCA9IGxhYkludFNxZGlzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdmFyIGxhYkludDJTcURpc3QgPSBzcWRpc3QocmVmUHQsIHtcbiAgICAgICAgICAgIHg6IGxhYmVsSW50ZXJzZWN0WzJdLFxuICAgICAgICAgICAgeTogbGFiZWxJbnRlcnNlY3RbM11cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgYXJyb3dFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHRndERpc3QpO1xuICB2YXIgZWRnZUVuZCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMSwgci5hcnJvd1NoYXBlc1t0Z3RBclNoYXBlXS5nYXAoZWRnZSkgKyB0Z3REaXN0KTtcbiAgcnMuZW5kWCA9IGVkZ2VFbmRbMF07XG4gIHJzLmVuZFkgPSBlZGdlRW5kWzFdO1xuICBycy5hcnJvd0VuZFggPSBhcnJvd0VuZFswXTtcbiAgcnMuYXJyb3dFbmRZID0gYXJyb3dFbmRbMV07XG5cbiAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnaW5zaWRlLXRvLW5vZGUnKSB7XG4gICAgaW50ZXJzZWN0ID0gW3NyY1Bvcy54LCBzcmNQb3MueV07XG4gIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHQudW5pdHMpIHtcbiAgICBpbnRlcnNlY3QgPSB0aGlzLm1hbnVhbEVuZHB0VG9QeChzb3VyY2UsIHNyY01hbkVuZHB0KTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScpIHtcbiAgICBpbnRlcnNlY3QgPSBycy5zcmNJbnRuOyAvLyB1c2UgY2FjaGVkIHZhbHVlIGZyb20gY3RybHB0IGNhbGNcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUnIHx8IHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJykge1xuICAgICAgcDJfaSA9IHAyO1xuICAgIH0gZWxzZSBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnIHx8IHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lLW9yLWxhYmVsJykge1xuICAgICAgcDJfaSA9IFt0Z3RQb3MueCwgdGd0UG9zLnldO1xuICAgIH1cblxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDApO1xuXG4gICAgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCBzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciBzcnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgX2x3ID0gc3JzLmxhYmVsV2lkdGg7XG4gICAgICB2YXIgX2xoID0gc3JzLmxhYmVsSGVpZ2h0O1xuICAgICAgdmFyIF9seCA9IHNycy5sYWJlbFg7XG4gICAgICB2YXIgX2x5ID0gc3JzLmxhYmVsWTtcblxuICAgICAgdmFyIF9sdzIgPSBfbHcgLyAyO1xuXG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG5cbiAgICAgIHZhciBfdmEgPSBzb3VyY2UucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuXG4gICAgICBpZiAoX3ZhID09PSAndG9wJykge1xuICAgICAgICBfbHkgLT0gX2xoMjtcbiAgICAgIH0gZWxzZSBpZiAoX3ZhID09PSAnYm90dG9tJykge1xuICAgICAgICBfbHkgKz0gX2xoMjtcbiAgICAgIH1cblxuICAgICAgdmFyIF9oYSA9IHNvdXJjZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG5cbiAgICAgIGlmIChfaGEgPT09ICdsZWZ0Jykge1xuICAgICAgICBfbHggLT0gX2x3MjtcbiAgICAgIH0gZWxzZSBpZiAoX2hhID09PSAncmlnaHQnKSB7XG4gICAgICAgIF9seCArPSBfbHcyO1xuICAgICAgfVxuXG4gICAgICB2YXIgX2xhYmVsSW50ZXJzZWN0ID0gcG9seWdvbkludGVyc2VjdExpbmUocDJfaVswXSwgcDJfaVsxXSwgW19seCAtIF9sdzIsIF9seSAtIF9saDIsIF9seCArIF9sdzIsIF9seSAtIF9saDIsIF9seCArIF9sdzIsIF9seSArIF9saDIsIF9seCAtIF9sdzIsIF9seSArIF9saDJdLCBzcmNQb3MueCwgc3JjUG9zLnkpO1xuXG4gICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF9yZWZQdCA9IHRndFBvcztcblxuICAgICAgICB2YXIgX2ludFNxZGlzdCA9IHNxZGlzdChfcmVmUHQsIGFycmF5MnBvaW50KGludGVyc2VjdCkpO1xuXG4gICAgICAgIHZhciBfbGFiSW50U3FkaXN0ID0gc3FkaXN0KF9yZWZQdCwgYXJyYXkycG9pbnQoX2xhYmVsSW50ZXJzZWN0KSk7XG5cbiAgICAgICAgdmFyIF9taW5TcURpc3QgPSBfaW50U3FkaXN0O1xuXG4gICAgICAgIGlmIChfbGFiSW50U3FkaXN0IDwgX2ludFNxZGlzdCkge1xuICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMF0sIF9sYWJlbEludGVyc2VjdFsxXV07XG4gICAgICAgICAgX21pblNxRGlzdCA9IF9sYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgX2xhYkludDJTcURpc3QgPSBzcWRpc3QoX3JlZlB0LCB7XG4gICAgICAgICAgICB4OiBfbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBfbGFiZWxJbnRlcnNlY3RbM11cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChfbGFiSW50MlNxRGlzdCA8IF9taW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMl0sIF9sYWJlbEludGVyc2VjdFszXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGFycm93U3RhcnQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDIsIHIuYXJyb3dTaGFwZXNbc3JjQXJTaGFwZV0uc3BhY2luZyhlZGdlKSArIHNyY0Rpc3QpO1xuICB2YXIgZWRnZVN0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLmdhcChlZGdlKSArIHNyY0Rpc3QpO1xuICBycy5zdGFydFggPSBlZGdlU3RhcnRbMF07XG4gIHJzLnN0YXJ0WSA9IGVkZ2VTdGFydFsxXTtcbiAgcnMuYXJyb3dTdGFydFggPSBhcnJvd1N0YXJ0WzBdO1xuICBycy5hcnJvd1N0YXJ0WSA9IGFycm93U3RhcnRbMV07XG5cbiAgaWYgKGhhc0VuZHB0cykge1xuICAgIGlmICghbnVtYmVyKHJzLnN0YXJ0WCkgfHwgIW51bWJlcihycy5zdGFydFkpIHx8ICFudW1iZXIocnMuZW5kWCkgfHwgIW51bWJlcihycy5lbmRZKSkge1xuICAgICAgcnMuYmFkTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzLmJhZExpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbkJScCQ0LmdldFNvdXJjZUVuZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG5cbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzBdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1sxXVxuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgICAgeTogcnMuYXJyb3dTdGFydFlcbiAgICAgIH07XG4gIH1cbn07XG5cbkJScCQ0LmdldFRhcmdldEVuZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG5cbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzJdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1szXVxuICAgICAgfTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBycy5hcnJvd0VuZFgsXG4gICAgICAgIHk6IHJzLmFycm93RW5kWVxuICAgICAgfTtcbiAgfVxufTtcblxudmFyIEJScCQ1ID0ge307XG5cbmZ1bmN0aW9uIHB1c2hCZXppZXJQdHMociwgZWRnZSwgcHRzKSB7XG4gIHZhciBxYmV6aWVyQXQkMSA9IGZ1bmN0aW9uIHFiZXppZXJBdCQxKHAxLCBwMiwgcDMsIHQpIHtcbiAgICByZXR1cm4gcWJlemllckF0KHAxLCBwMiwgcDMsIHQpO1xuICB9O1xuXG4gIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gIHZhciBicHRzID0gX3AucnN0eWxlLmJlemllclB0cztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuYmV6aWVyUHJvalBjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHIuYmV6aWVyUHJvalBjdHNbaV07XG4gICAgYnB0cy5wdXNoKHtcbiAgICAgIHg6IHFiZXppZXJBdCQxKHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIHApLFxuICAgICAgeTogcWJlemllckF0JDEocHRzWzFdLCBwdHNbM10sIHB0c1s1XSwgcClcbiAgICB9KTtcbiAgfVxufVxuXG5CUnAkNS5zdG9yZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgZXQgPSBycy5lZGdlVHlwZTsgLy8gY2xlYXIgdGhlIGNhY2hlZCBwb2ludHMgc3RhdGVcblxuICBfcC5yc3R5bGUuYmV6aWVyUHRzID0gbnVsbDtcbiAgX3AucnN0eWxlLmxpbmVQdHMgPSBudWxsO1xuICBfcC5yc3R5bGUuaGF5c3RhY2tQdHMgPSBudWxsO1xuXG4gIGlmIChldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJykge1xuICAgIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpICsgNSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgcHVzaEJlemllclB0cyh0aGlzLCBlZGdlLCBycy5hbGxwdHMuc2xpY2UoaSwgaSArIDYpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdzZWdtZW50cycpIHtcbiAgICB2YXIgbHB0cyA9IF9wLnJzdHlsZS5saW5lUHRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSArIDEgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGxwdHMucHVzaCh7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV0ID09PSAnaGF5c3RhY2snKSB7XG4gICAgdmFyIGhwdHMgPSBycy5oYXlzdGFja1B0cztcbiAgICBfcC5yc3R5bGUuaGF5c3RhY2tQdHMgPSBbe1xuICAgICAgeDogaHB0c1swXSxcbiAgICAgIHk6IGhwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBocHRzWzJdLFxuICAgICAgeTogaHB0c1szXVxuICAgIH1dO1xuICB9XG5cbiAgX3AucnN0eWxlLmFycm93V2lkdGggPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5hcnJvd1NoYXBlV2lkdGg7XG59O1xuXG5CUnAkNS5yZWNhbGN1bGF0ZUVkZ2VQcm9qZWN0aW9ucyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB0aGlzLmZpbmRFZGdlQ29udHJvbFBvaW50cyhlZGdlcyk7XG59O1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQgKi9cblxudmFyIEJScCQ2ID0ge307XG5cbkJScCQ2LnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBjb250ZW50ID0gbm9kZS5wc3R5bGUoJ2xhYmVsJykuc3RyVmFsdWU7XG5cbiAgaWYgKGVtcHR5U3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRleHRYLCB0ZXh0WTtcbiAgdmFyIF9wID0gbm9kZS5fcHJpdmF0ZTtcbiAgdmFyIG5vZGVXaWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICB2YXIgbm9kZVBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIHRleHRIYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRWYWxpZ24gPSBub2RlLnBzdHlsZSgndGV4dC12YWxpZ24nKS5zdHJWYWx1ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG5cbiAgc3dpdGNoICh0ZXh0SGFsaWduKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCAtIG5vZGVXaWR0aCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyaWdodCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCArIG5vZGVXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBjZW50ZXJcbiAgICAgIHRleHRYID0gbm9kZVBvcy54O1xuICB9XG5cbiAgc3dpdGNoICh0ZXh0VmFsaWduKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHRleHRZID0gbm9kZVBvcy55IC0gbm9kZUhlaWdodCAvIDIgLSBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgKyBub2RlSGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlLmcuIG1pZGRsZVxuICAgICAgdGV4dFkgPSBub2RlUG9zLnk7XG4gIH1cblxuICBycy5sYWJlbFggPSB0ZXh0WDtcbiAgcnMubGFiZWxZID0gdGV4dFk7XG4gIHJzdHlsZS5sYWJlbFggPSB0ZXh0WDtcbiAgcnN0eWxlLmxhYmVsWSA9IHRleHRZO1xuICB0aGlzLmNhbGN1bGF0ZUxhYmVsQW5nbGVzKG5vZGUpO1xuICB0aGlzLmFwcGx5TGFiZWxEaW1lbnNpb25zKG5vZGUpO1xufTtcblxudmFyIGxpbmVBbmdsZUZyb21EZWx0YSA9IGZ1bmN0aW9uIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuKGR5IC8gZHgpO1xuXG4gIGlmIChkeCA9PT0gMCAmJiBhbmdsZSA8IDApIHtcbiAgICBhbmdsZSA9IGFuZ2xlICogLTE7XG4gIH1cblxuICByZXR1cm4gYW5nbGU7XG59O1xuXG52YXIgbGluZUFuZ2xlID0gZnVuY3Rpb24gbGluZUFuZ2xlKHAwLCBwMSkge1xuICB2YXIgZHggPSBwMS54IC0gcDAueDtcbiAgdmFyIGR5ID0gcDEueSAtIHAwLnk7XG4gIHJldHVybiBsaW5lQW5nbGVGcm9tRGVsdGEoZHgsIGR5KTtcbn07XG5cbnZhciBiZXppZXJBbmdsZSA9IGZ1bmN0aW9uIGJlemllckFuZ2xlKHAwLCBwMSwgcDIsIHQpIHtcbiAgdmFyIHQwID0gYm91bmQoMCwgdCAtIDAuMDAxLCAxKTtcbiAgdmFyIHQxID0gYm91bmQoMCwgdCArIDAuMDAxLCAxKTtcbiAgdmFyIGxwMCA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQwKTtcbiAgdmFyIGxwMSA9IHFiZXppZXJQdEF0KHAwLCBwMSwgcDIsIHQxKTtcbiAgcmV0dXJuIGxpbmVBbmdsZShscDAsIGxwMSk7XG59O1xuXG5CUnAkNi5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHA7XG4gIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjb250ZW50ID0ge1xuICAgIG1pZDogZWRnZS5wc3R5bGUoJ2xhYmVsJykuc3RyVmFsdWUsXG4gICAgc291cmNlOiBlZGdlLnBzdHlsZSgnc291cmNlLWxhYmVsJykuc3RyVmFsdWUsXG4gICAgdGFyZ2V0OiBlZGdlLnBzdHlsZSgndGFyZ2V0LWxhYmVsJykuc3RyVmFsdWVcbiAgfTtcblxuICBpZiAoY29udGVudC5taWQgfHwgY29udGVudC5zb3VyY2UgfHwgY29udGVudC50YXJnZXQpIDsgZWxzZSB7XG4gICAgICByZXR1cm47IC8vIG5vIGxhYmVscyA9PiBubyBjYWxjc1xuICAgIH0gLy8gYWRkIGNlbnRlciBwb2ludCB0byBzdHlsZSBzbyBib3VuZGluZyBib3ggY2FsY3VsYXRpb25zIGNhbiB1c2UgaXRcbiAgLy9cblxuXG4gIHAgPSB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG5cbiAgdmFyIHNldFJzID0gZnVuY3Rpb24gc2V0UnMocHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgfTtcblxuICBzZXRScygnbGFiZWxYJywgbnVsbCwgcC54KTtcbiAgc2V0UnMoJ2xhYmVsWScsIG51bGwsIHAueSk7XG4gIHZhciBtaWRBbmdsZSA9IGxpbmVBbmdsZUZyb21EZWx0YShycy5taWREaXNwWCwgcnMubWlkRGlzcFkpO1xuICBzZXRScygnbGFiZWxBdXRvQW5nbGUnLCBudWxsLCBtaWRBbmdsZSk7XG5cbiAgdmFyIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8gPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCkge1xuICAgIGlmIChjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZTtcbiAgICB9IC8vIHVzZSBjYWNoZSBzbyBvbmx5IDF4IHBlciBlZGdlXG5cblxuICAgIHZhciBjdHJscHRzID0gW107IC8vIHN0b3JlIGVhY2ggY3RybHB0IGluZm8gaW5pdFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgcDAgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfTtcbiAgICAgIHZhciBwMSA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAzXVxuICAgICAgfTsgLy8gY3RybHB0XG5cbiAgICAgIHZhciBwMiA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyA0XSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyA1XVxuICAgICAgfTtcbiAgICAgIGN0cmxwdHMucHVzaCh7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICBwMjogcDIsXG4gICAgICAgIHN0YXJ0RGlzdDogMCxcbiAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICBzZWdtZW50czogW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBicHRzID0gX3AucnN0eWxlLmJlemllclB0cztcbiAgICB2YXIgblByb2pzID0gci5iZXppZXJQcm9qUGN0cy5sZW5ndGg7XG5cbiAgICBmdW5jdGlvbiBhZGRTZWdtZW50KGNwLCBwMCwgcDEsIHQwLCB0MSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGRpc3QocDAsIHAxKTtcbiAgICAgIHZhciBwcmV2U2VnbWVudCA9IGNwLnNlZ21lbnRzW2NwLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICB0MDogdDAsXG4gICAgICAgIHQxOiB0MSxcbiAgICAgICAgc3RhcnREaXN0OiBwcmV2U2VnbWVudCA/IHByZXZTZWdtZW50LnN0YXJ0RGlzdCArIHByZXZTZWdtZW50Lmxlbmd0aCA6IDAsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoXG4gICAgICB9O1xuICAgICAgY3Auc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGNwLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgfSAvLyB1cGRhdGUgZWFjaCBjdHJscHQgd2l0aCBzZWdtZW50IGluZm9cblxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGN0cmxwdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgY3AgPSBjdHJscHRzW19pXTtcbiAgICAgIHZhciBwcmV2Q3AgPSBjdHJscHRzW19pIC0gMV07XG5cbiAgICAgIGlmIChwcmV2Q3ApIHtcbiAgICAgICAgY3Auc3RhcnREaXN0ID0gcHJldkNwLnN0YXJ0RGlzdCArIHByZXZDcC5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGFkZFNlZ21lbnQoY3AsIGNwLnAwLCBicHRzW19pICogblByb2pzXSwgMCwgci5iZXppZXJQcm9qUGN0c1swXSk7IC8vIGZpcnN0XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblByb2pzIC0gMTsgaisrKSB7XG4gICAgICAgIGFkZFNlZ21lbnQoY3AsIGJwdHNbX2kgKiBuUHJvanMgKyBqXSwgYnB0c1tfaSAqIG5Qcm9qcyArIGogKyAxXSwgci5iZXppZXJQcm9qUGN0c1tqXSwgci5iZXppZXJQcm9qUGN0c1tqICsgMV0pO1xuICAgICAgfVxuXG4gICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgblByb2pzIC0gMV0sIGNwLnAyLCByLmJlemllclByb2pQY3RzW25Qcm9qcyAtIDFdLCAxKTsgLy8gbGFzdFxuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlID0gY3RybHB0cztcbiAgfTtcblxuICB2YXIgY2FsY3VsYXRlRW5kUHJvamVjdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGFuZ2xlO1xuICAgIHZhciBpc1NyYyA9IHByZWZpeCA9PT0gJ3NvdXJjZSc7XG5cbiAgICBpZiAoIWNvbnRlbnRbcHJlZml4XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvZmZzZXQgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLXRleHQtb2Zmc2V0JykucGZWYWx1ZTtcblxuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3NlbGYnOlxuICAgICAgY2FzZSAnY29tcG91bmQnOlxuICAgICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBjcHMgPSBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkO1xuICAgICAgICAgIHZhciBzdGFydERpc3QgPSAwO1xuICAgICAgICAgIHZhciB0b3RhbERpc3QgPSAwOyAvLyBmaW5kIHRoZSBzZWdtZW50IHdlJ3JlIG9uXG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jcCA9IGNwc1tpc1NyYyA/IGkgOiBjcHMubGVuZ3RoIC0gMSAtIGldO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9jcC5zZWdtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgX3NlZyA9IF9jcC5zZWdtZW50c1tpc1NyYyA/IGogOiBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMSAtIGpdO1xuICAgICAgICAgICAgICB2YXIgbGFzdFNlZyA9IGkgPT09IGNwcy5sZW5ndGggLSAxICYmIGogPT09IF9jcC5zZWdtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICBzdGFydERpc3QgPSB0b3RhbERpc3Q7XG4gICAgICAgICAgICAgIHRvdGFsRGlzdCArPSBfc2VnLmxlbmd0aDtcblxuICAgICAgICAgICAgICBpZiAodG90YWxEaXN0ID49IG9mZnNldCB8fCBsYXN0U2VnKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB7XG4gICAgICAgICAgICAgICAgICBjcDogX2NwLFxuICAgICAgICAgICAgICAgICAgc2VnbWVudDogX3NlZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjcCA9IHNlbGVjdGVkLmNwO1xuICAgICAgICAgIHZhciBzZWcgPSBzZWxlY3RlZC5zZWdtZW50O1xuICAgICAgICAgIHZhciB0U2VnbWVudCA9IChvZmZzZXQgLSBzdGFydERpc3QpIC8gc2VnLmxlbmd0aDtcbiAgICAgICAgICB2YXIgc2VnRHQgPSBzZWcudDEgLSBzZWcudDA7XG4gICAgICAgICAgdmFyIHQgPSBpc1NyYyA/IHNlZy50MCArIHNlZ0R0ICogdFNlZ21lbnQgOiBzZWcudDEgLSBzZWdEdCAqIHRTZWdtZW50O1xuICAgICAgICAgIHQgPSBib3VuZCgwLCB0LCAxKTtcbiAgICAgICAgICBwID0gcWJlemllclB0QXQoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYW5nbGUgPSBiZXppZXJBbmdsZShjcC5wMCwgY3AucDEsIGNwLnAyLCB0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdzdHJhaWdodCc6XG4gICAgICBjYXNlICdzZWdtZW50cyc6XG4gICAgICBjYXNlICdoYXlzdGFjayc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZCA9IDAsXG4gICAgICAgICAgICAgIGRpLFxuICAgICAgICAgICAgICBkMDtcbiAgICAgICAgICB2YXIgcDAsIHAxO1xuICAgICAgICAgIHZhciBsID0gcnMuYWxscHRzLmxlbmd0aDtcblxuICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiArIDMgPCBsOyBfaTIgKz0gMikge1xuICAgICAgICAgICAgaWYgKGlzU3JjKSB7XG4gICAgICAgICAgICAgIHAwID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tfaTIgKyAxXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwMSA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbX2kyICsgMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW19pMiArIDNdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwMCA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbbCAtIDIgLSBfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tsIC0gMSAtIF9pMl1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcDEgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW2wgLSA0IC0gX2kyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbbCAtIDMgLSBfaTJdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpID0gZGlzdChwMCwgcDEpO1xuICAgICAgICAgICAgZDAgPSBkO1xuICAgICAgICAgICAgZCArPSBkaTtcblxuICAgICAgICAgICAgaWYgKGQgPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBwRCA9IG9mZnNldCAtIGQwO1xuXG4gICAgICAgICAgdmFyIF90ID0gcEQgLyBkaTtcblxuICAgICAgICAgIF90ID0gYm91bmQoMCwgX3QsIDEpO1xuICAgICAgICAgIHAgPSBsaW5lQXQocDAsIHAxLCBfdCk7XG4gICAgICAgICAgYW5nbGUgPSBsaW5lQW5nbGUocDAsIHAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJzKCdsYWJlbFgnLCBwcmVmaXgsIHAueCk7XG4gICAgc2V0UnMoJ2xhYmVsWScsIHByZWZpeCwgcC55KTtcbiAgICBzZXRScygnbGFiZWxBdXRvQW5nbGUnLCBwcmVmaXgsIGFuZ2xlKTtcbiAgfTtcblxuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCdzb3VyY2UnKTtcbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbigndGFyZ2V0Jyk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMoZWRnZSk7XG59O1xuXG5CUnAkNi5hcHBseUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSk7XG5cbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUsICdzb3VyY2UnKTtcbiAgICB0aGlzLmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMoZWxlLCAndGFyZ2V0Jyk7XG4gIH1cbn07XG5cbkJScCQ2LmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgdmFyIGxhYmVsRGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGV4dCk7XG4gIHZhciBsaW5lSGVpZ2h0ID0gZWxlLnBzdHlsZSgnbGluZS1oZWlnaHQnKS5wZlZhbHVlO1xuICB2YXIgdGV4dFdyYXAgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS5zdHJWYWx1ZTtcbiAgdmFyIGxpbmVzID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgcHJlZml4KSB8fCBbXTtcbiAgdmFyIG51bUxpbmVzID0gdGV4dFdyYXAgIT09ICd3cmFwJyA/IDEgOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpO1xuICB2YXIgbm9ybVBlckxpbmVIZWlnaHQgPSBsYWJlbERpbXMuaGVpZ2h0IC8gbnVtTGluZXM7XG4gIHZhciBsYWJlbExpbmVIZWlnaHQgPSBub3JtUGVyTGluZUhlaWdodCAqIGxpbmVIZWlnaHQ7XG4gIHZhciB3aWR0aCA9IGxhYmVsRGltcy53aWR0aDtcbiAgdmFyIGhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgKyAobnVtTGluZXMgLSAxKSAqIChsaW5lSGVpZ2h0IC0gMSkgKiBub3JtUGVyTGluZUhlaWdodDtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgsIGhlaWdodCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsTGluZUhlaWdodCcsIHByZWZpeCwgbGFiZWxMaW5lSGVpZ2h0KTtcbn07XG5cbkJScCQ2LmdldExhYmVsVGV4dCA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBwZmQgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHBmZCArICdsYWJlbCcpLnN0clZhbHVlO1xuICB2YXIgdGV4dFRyYW5zZm9ybSA9IGVsZS5wc3R5bGUoJ3RleHQtdHJhbnNmb3JtJykudmFsdWU7XG5cbiAgdmFyIHJzY3JhdGNoID0gZnVuY3Rpb24gcnNjcmF0Y2gocHJvcE5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KF9wLnJzY3JhdGNoLCBwcm9wTmFtZSwgcHJlZml4KTtcbiAgICB9XG4gIH07IC8vIGZvciBlbXB0eSB0ZXh0LCBza2lwIGFsbCBwcm9jZXNzaW5nXG5cblxuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbm9uZScpIDsgZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGV4dFRyYW5zZm9ybSA9PSAnbG93ZXJjYXNlJykge1xuICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICB2YXIgd3JhcFN0eWxlID0gZWxlLnBzdHlsZSgndGV4dC13cmFwJykudmFsdWU7XG5cbiAgaWYgKHdyYXBTdHlsZSA9PT0gJ3dyYXAnKSB7XG4gICAgdmFyIGxhYmVsS2V5ID0gcnNjcmF0Y2goJ2xhYmVsS2V5Jyk7IC8vIHNhdmUgcmVjYWxjIGlmIHRoZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyBiZWZvcmVcblxuICAgIGlmIChsYWJlbEtleSAhPSBudWxsICYmIHJzY3JhdGNoKCdsYWJlbFdyYXBLZXknKSA9PT0gbGFiZWxLZXkpIHtcbiAgICAgIHJldHVybiByc2NyYXRjaCgnbGFiZWxXcmFwQ2FjaGVkVGV4dCcpO1xuICAgIH1cblxuICAgIHZhciB6d3NwID0gXCJcXHUyMDBCXCI7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIG1heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIG92ZXJmbG93ID0gZWxlLnBzdHlsZSgndGV4dC1vdmVyZmxvdy13cmFwJykudmFsdWU7XG4gICAgdmFyIG92ZXJmbG93QW55ID0gb3ZlcmZsb3cgPT09ICdhbnl3aGVyZSc7XG4gICAgdmFyIHdyYXBwZWRMaW5lcyA9IFtdO1xuICAgIHZhciB3b3Jkc1JlZ2V4ID0gL1tcXHNcXHUyMDBiXSsvO1xuICAgIHZhciB3b3JkU2VwYXJhdG9yID0gb3ZlcmZsb3dBbnkgPyAnJyA6ICcgJztcblxuICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgIHZhciBsaW5lID0gbGluZXNbbF07XG4gICAgICB2YXIgbGluZURpbXMgPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGxpbmUpO1xuICAgICAgdmFyIGxpbmVXID0gbGluZURpbXMud2lkdGg7XG5cbiAgICAgIGlmIChvdmVyZmxvd0FueSkge1xuICAgICAgICB2YXIgcHJvY2Vzc2VkTGluZSA9IGxpbmUuc3BsaXQoJycpLmpvaW4oendzcCk7XG4gICAgICAgIGxpbmUgPSBwcm9jZXNzZWRMaW5lO1xuICAgICAgfVxuXG4gICAgICBpZiAobGluZVcgPiBtYXhXKSB7XG4gICAgICAgIC8vIGxpbmUgaXMgdG9vIGxvbmdcbiAgICAgICAgdmFyIHdvcmRzID0gbGluZS5zcGxpdCh3b3Jkc1JlZ2V4KTtcbiAgICAgICAgdmFyIHN1YmxpbmUgPSAnJztcblxuICAgICAgICBmb3IgKHZhciB3ID0gMDsgdyA8IHdvcmRzLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1t3XTtcbiAgICAgICAgICB2YXIgdGVzdExpbmUgPSBzdWJsaW5lLmxlbmd0aCA9PT0gMCA/IHdvcmQgOiBzdWJsaW5lICsgd29yZFNlcGFyYXRvciArIHdvcmQ7XG4gICAgICAgICAgdmFyIHRlc3REaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCB0ZXN0TGluZSk7XG4gICAgICAgICAgdmFyIHRlc3RXID0gdGVzdERpbXMud2lkdGg7XG5cbiAgICAgICAgICBpZiAodGVzdFcgPD0gbWF4Vykge1xuICAgICAgICAgICAgLy8gd29yZCBmaXRzIG9uIGN1cnJlbnQgbGluZVxuICAgICAgICAgICAgc3VibGluZSArPSB3b3JkICsgd29yZFNlcGFyYXRvcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd29yZCBzdGFydHMgbmV3IGxpbmVcbiAgICAgICAgICAgIGlmIChzdWJsaW5lKSB7XG4gICAgICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJsaW5lID0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHRleHQsIHB1dCBpdCBpbiBhIHdyYXBwZWQgbGluZVxuXG5cbiAgICAgICAgaWYgKCFzdWJsaW5lLm1hdGNoKC9eW1xcc1xcdTIwMGJdKyQvKSkge1xuICAgICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKHN1YmxpbmUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsaW5lIGlzIGFscmVhZHkgc2hvcnQgZW5vdWdoXG4gICAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgfVxuICAgIH0gLy8gZm9yXG5cblxuICAgIHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHdyYXBwZWRMaW5lcyk7XG4gICAgdGV4dCA9IHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRUZXh0Jywgd3JhcHBlZExpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICByc2NyYXRjaCgnbGFiZWxXcmFwS2V5JywgbGFiZWxLZXkpO1xuICB9IGVsc2UgaWYgKHdyYXBTdHlsZSA9PT0gJ2VsbGlwc2lzJykge1xuICAgIHZhciBfbWF4VyA9IGVsZS5wc3R5bGUoJ3RleHQtbWF4LXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgZWxsaXBzaXplZCA9ICcnO1xuICAgIHZhciBlbGxpcHNpcyA9IFwiXFx1MjAyNlwiO1xuICAgIHZhciBpbmNMYXN0Q2ggPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpLndpZHRoIDwgX21heFcpIHtcbiAgICAgIC8vIHRoZSBsYWJlbCBhbHJlYWR5IGZpdHNcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdpZHRoV2l0aE5leHRDaCA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgZWxsaXBzaXplZCArIHRleHRbaV0gKyBlbGxpcHNpcykud2lkdGg7XG5cbiAgICAgIGlmICh3aWR0aFdpdGhOZXh0Q2ggPiBfbWF4Vykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZWxsaXBzaXplZCArPSB0ZXh0W2ldO1xuXG4gICAgICBpZiAoaSA9PT0gdGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGluY0xhc3RDaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbmNMYXN0Q2gpIHtcbiAgICAgIGVsbGlwc2l6ZWQgKz0gZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsbGlwc2l6ZWQ7XG4gIH0gLy8gaWYgZWxsaXBzaXplXG5cblxuICByZXR1cm4gdGV4dDtcbn07XG5cbkJScCQ2LmdldExhYmVsSnVzdGlmaWNhdGlvbiA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIGp1c3RpZmljYXRpb24gPSBlbGUucHN0eWxlKCd0ZXh0LWp1c3RpZmljYXRpb24nKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRIYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnN0clZhbHVlO1xuXG4gIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcmV0dXJuICdyaWdodCc7XG5cbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIHJldHVybiAnbGVmdCc7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGp1c3RpZmljYXRpb247XG4gIH1cbn07XG5cbkJScCQ2LmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUsIHRleHQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY2FjaGVLZXkgPSBoYXNoU3RyaW5nKHRleHQsIGVsZS5fcHJpdmF0ZS5sYWJlbERpbXNLZXkpO1xuICB2YXIgY2FjaGUgPSByLmxhYmVsRGltQ2FjaGUgfHwgKHIubGFiZWxEaW1DYWNoZSA9IFtdKTtcbiAgdmFyIGV4aXN0aW5nVmFsID0gY2FjaGVbY2FjaGVLZXldO1xuXG4gIGlmIChleGlzdGluZ1ZhbCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nVmFsO1xuICB9XG5cbiAgdmFyIHBhZGRpbmcgPSAwOyAvLyBhZGQgcGFkZGluZyBhcm91bmQgdGV4dCBkaW1zLCBhcyB0aGUgbWVhc3VyZW1lbnQgaXNuJ3QgdGhhdCBhY2N1cmF0ZVxuXG4gIHZhciBmU3R5bGUgPSBlbGUucHN0eWxlKCdmb250LXN0eWxlJykuc3RyVmFsdWU7XG4gIHZhciBzaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciB3ZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXM7XG4gIHZhciBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQ7XG5cbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGMyZCA9IHRoaXMubGFiZWxDYWxjQ2FudmFzQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHZhciBkcyA9IGNhbnZhcy5zdHlsZTtcbiAgICBkcy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZHMubGVmdCA9ICctOTk5OXB4JztcbiAgICBkcy50b3AgPSAnLTk5OTlweCc7XG4gICAgZHMuekluZGV4ID0gJy0xJztcbiAgICBkcy52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgZHMucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgfVxuXG4gIGMyZC5mb250ID0gXCJcIi5jb25jYXQoZlN0eWxlLCBcIiBcIikuY29uY2F0KHdlaWdodCwgXCIgXCIpLmNvbmNhdChzaXplLCBcInB4IFwiKS5jb25jYXQoZmFtaWx5KTtcbiAgdmFyIHdpZHRoID0gMDtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuICAgIHZhciBtZXRyaWNzID0gYzJkLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgIHZhciB3ID0gTWF0aC5jZWlsKG1ldHJpY3Mud2lkdGgpO1xuICAgIHZhciBoID0gc2l6ZTtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHcsIHdpZHRoKTtcbiAgICBoZWlnaHQgKz0gaDtcbiAgfVxuXG4gIHdpZHRoICs9IHBhZGRpbmc7XG4gIGhlaWdodCArPSBwYWRkaW5nO1xuICByZXR1cm4gY2FjaGVbY2FjaGVLZXldID0ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufTtcblxuQlJwJDYuY2FsY3VsYXRlTGFiZWxBbmdsZSA9IGZ1bmN0aW9uIChlbGUsIHByZWZpeCkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgcHJlZml4RGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICB2YXIgcm90ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtcm90YXRpb24nKTtcbiAgdmFyIHJvdFN0ciA9IHJvdC5zdHJWYWx1ZTtcblxuICBpZiAocm90U3RyID09PSAnbm9uZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgcm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gcnMubGFiZWxBdXRvQW5nbGU7XG4gIH0gZWxzZSBpZiAocm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcm90LnBmVmFsdWU7XG4gIH1cbn07XG5cbkJScCQ2LmNhbGN1bGF0ZUxhYmVsQW5nbGVzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHJzLmxhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlKTtcblxuICBpZiAoaXNFZGdlKSB7XG4gICAgcnMuc291cmNlTGFiZWxBbmdsZSA9IHIuY2FsY3VsYXRlTGFiZWxBbmdsZShlbGUsICdzb3VyY2UnKTtcbiAgICBycy50YXJnZXRMYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSwgJ3RhcmdldCcpO1xuICB9XG59O1xuXG52YXIgQlJwJDcgPSB7fTtcbnZhciBUT09fU01BTExfQ1VUX1JFQ1QgPSAyODtcbnZhciB3YXJuZWRDdXRSZWN0ID0gZmFsc2U7XG5cbkJScCQ3LmdldE5vZGVTaGFwZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykudmFsdWU7XG5cbiAgaWYgKHNoYXBlID09PSAnY3V0cmVjdGFuZ2xlJyAmJiAobm9kZS53aWR0aCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUIHx8IG5vZGUuaGVpZ2h0KCkgPCBUT09fU01BTExfQ1VUX1JFQ1QpKSB7XG4gICAgaWYgKCF3YXJuZWRDdXRSZWN0KSB7XG4gICAgICB3YXJuKCdUaGUgYGN1dHJlY3RhbmdsZWAgbm9kZSBzaGFwZSBjYW4gbm90IGJlIHVzZWQgYXQgc21hbGwgc2l6ZXMgc28gYHJlY3RhbmdsZWAgaXMgdXNlZCBpbnN0ZWFkJyk7XG4gICAgICB3YXJuZWRDdXRSZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gJ3JlY3RhbmdsZSc7XG4gIH1cblxuICBpZiAobm9kZS5pc1BhcmVudCgpKSB7XG4gICAgaWYgKHNoYXBlID09PSAncmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kLXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAnY3V0LXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdiYXJyZWwnKSB7XG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgICB9XG4gIH1cblxuICBpZiAoc2hhcGUgPT09ICdwb2x5Z29uJykge1xuICAgIHZhciBwb2ludHMgPSBub2RlLnBzdHlsZSgnc2hhcGUtcG9seWdvbi1wb2ludHMnKS52YWx1ZTtcbiAgICByZXR1cm4gci5ub2RlU2hhcGVzLm1ha2VQb2x5Z29uKHBvaW50cykubmFtZTtcbiAgfVxuXG4gIHJldHVybiBzaGFwZTtcbn07XG5cbnZhciBCUnAkOCA9IHt9O1xuXG5CUnAkOC5yZWdpc3RlckNhbGN1bGF0aW9uTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlc1RvVXBkYXRlID0gY3kuY29sbGVjdGlvbigpO1xuICB2YXIgciA9IHRoaXM7XG5cbiAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKGVsZXMpIHtcbiAgICB2YXIgZGlydHlTdHlsZUNhY2hlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICBlbGVzVG9VcGRhdGUubWVyZ2UoZWxlcyk7XG5cbiAgICBpZiAoZGlydHlTdHlsZUNhY2hlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICAgIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gICAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgci5iaW5kZXIoY3kpLm9uKCdib3VuZHMuKiBkaXJ0eS4qJywgZnVuY3Rpb24gb25EaXJ0eUJvdW5kcyhlKSB7XG4gICAgdmFyIGVsZSA9IGUudGFyZ2V0O1xuICAgIGVucXVldWUoZWxlKTtcbiAgfSkub24oJ3N0eWxlLiogYmFja2dyb3VuZC4qJywgZnVuY3Rpb24gb25EaXJ0eVN0eWxlKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUsIGZhbHNlKTtcbiAgfSk7XG5cbiAgdmFyIHVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gdXBkYXRlRWxlQ2FsY3Mod2lsbERyYXcpIHtcbiAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgIHZhciBmbnMgPSByLm9uVXBkYXRlRWxlQ2FsY3NGbnM7IC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBoYXZlIHVwLXRvLWRhdGUgc3R5bGUgKGUuZy4gc3R5bGVzaGVldCBtYXBwZXJzKVxuICAgICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHJlbmRlcmVkIHN0eWxlIChhbmQgcHN0eWxlIG1pZ2h0IG5vdCBiZSBjYWxsZWQgeWV0KVxuXG4gICAgICBlbGVzVG9VcGRhdGUuY2xlYW5TdHlsZSgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1RvVXBkYXRlW2ldO1xuICAgICAgICB2YXIgcnN0eWxlID0gZWxlLl9wcml2YXRlLnJzdHlsZTtcblxuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpICYmICFyc3R5bGUuY2xlYW5Db25uZWN0ZWQpIHtcbiAgICAgICAgICBlbnF1ZXVlKGVsZS5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgICAgICByc3R5bGUuY2xlYW5Db25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmbnMpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgZm4gPSBmbnNbX2ldO1xuICAgICAgICAgIGZuKHdpbGxEcmF3LCBlbGVzVG9VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHIucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVsZXNUb1VwZGF0ZSk7XG4gICAgICBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIHIuZmx1c2hSZW5kZXJlZFN0eWxlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlRWxlQ2FsY3ModHJ1ZSk7XG4gIH07XG5cbiAgci5iZWZvcmVSZW5kZXIodXBkYXRlRWxlQ2FsY3MsIHIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5lbGVDYWxjcyk7XG59O1xuXG5CUnAkOC5vblVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBmbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgfHwgW107XG4gIGZucy5wdXNoKGZuKTtcbn07XG5cbkJScCQ4LnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVzLCB1c2VDYWNoZSkge1xuICB2YXIgaXNDbGVhbkNvbm5lY3RlZCA9IGZ1bmN0aW9uIGlzQ2xlYW5Db25uZWN0ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5yc3R5bGUuY2xlYW5Db25uZWN0ZWQ7XG4gIH07XG5cbiAgdmFyIGVkZ2VzID0gW107XG4gIHZhciBub2RlcyA9IFtdOyAvLyB0aGUgcmVuZGVyZXIgY2FuJ3QgYmUgdXNlZCBmb3IgY2FsY3Mgd2hlbiBkZXN0cm95ZWQsIGUuZy4gZWxlLmJvdW5kaW5nQm94KClcblxuICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gdXNlIGNhY2hlIGJ5IGRlZmF1bHQgZm9yIHBlcmZcblxuXG4gIGlmICh1c2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXNlQ2FjaGUgPSB0cnVlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7IC8vIGFuIGVkZ2UgbWF5IGJlIGltcGxpY2l0bHkgZGlydHkgYi9jIG9mIG9uZSBvZiBpdHMgY29ubmVjdGVkIG5vZGVzXG4gICAgLy8gKGFuZCBhIHJlcXVlc3QgZm9yIHJlY2FsYyBtYXkgY29tZSBpbiBiZXR3ZWVuIGZyYW1lcylcblxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKCFpc0NsZWFuQ29ubmVjdGVkKGVsZS5zb3VyY2UoKSkgfHwgIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnRhcmdldCgpKSkpIHtcbiAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgIH0gLy8gb25seSB1cGRhdGUgaWYgZGlydHkgYW5kIGluIGdyYXBoXG5cblxuICAgIGlmICh1c2VDYWNoZSAmJiByc3R5bGUuY2xlYW4gfHwgZWxlLnJlbW92ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBvbmx5IHVwZGF0ZSBpZiBub3QgZGlzcGxheTogbm9uZVxuXG5cbiAgICBpZiAoZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChfcC5ncm91cCA9PT0gJ25vZGVzJykge1xuICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlZGdlc1xuICAgICAgZWRnZXMucHVzaChlbGUpO1xuICAgIH1cblxuICAgIHJzdHlsZS5jbGVhbiA9IHRydWU7XG4gIH0gLy8gdXBkYXRlIG5vZGUgZGF0YSBmcm9tIHByb2plY3Rpb25zXG5cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2Rlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9lbGUgPSBub2Rlc1tfaTJdO1xuICAgIHZhciBfcDIgPSBfZWxlLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlID0gX3AyLnJzdHlsZTtcblxuICAgIHZhciBwb3MgPSBfZWxlLnBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLnJlY2FsY3VsYXRlTm9kZUxhYmVsUHJvamVjdGlvbihfZWxlKTtcbiAgICBfcnN0eWxlLm5vZGVYID0gcG9zLng7XG4gICAgX3JzdHlsZS5ub2RlWSA9IHBvcy55O1xuICAgIF9yc3R5bGUubm9kZVcgPSBfZWxlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgIF9yc3R5bGUubm9kZUggPSBfZWxlLnBzdHlsZSgnaGVpZ2h0JykucGZWYWx1ZTtcbiAgfVxuXG4gIHRoaXMucmVjYWxjdWxhdGVFZGdlUHJvamVjdGlvbnMoZWRnZXMpOyAvLyB1cGRhdGUgZWRnZSBkYXRhIGZyb20gcHJvamVjdGlvbnNcblxuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlZGdlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9lbGUyID0gZWRnZXNbX2kzXTtcbiAgICB2YXIgX3AzID0gX2VsZTIuX3ByaXZhdGU7XG4gICAgdmFyIF9yc3R5bGUyID0gX3AzLnJzdHlsZTtcbiAgICB2YXIgcnMgPSBfcDMucnNjcmF0Y2g7IC8vIHVwZGF0ZSByc3R5bGUgcG9zaXRpb25zXG5cbiAgICBfcnN0eWxlMi5zcmNYID0gcnMuYXJyb3dTdGFydFg7XG4gICAgX3JzdHlsZTIuc3JjWSA9IHJzLmFycm93U3RhcnRZO1xuICAgIF9yc3R5bGUyLnRndFggPSBycy5hcnJvd0VuZFg7XG4gICAgX3JzdHlsZTIudGd0WSA9IHJzLmFycm93RW5kWTtcbiAgICBfcnN0eWxlMi5taWRYID0gcnMubWlkWDtcbiAgICBfcnN0eWxlMi5taWRZID0gcnMubWlkWTtcbiAgICBfcnN0eWxlMi5sYWJlbEFuZ2xlID0gcnMubGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi5zb3VyY2VMYWJlbEFuZ2xlID0gcnMuc291cmNlTGFiZWxBbmdsZTtcbiAgICBfcnN0eWxlMi50YXJnZXRMYWJlbEFuZ2xlID0gcnMudGFyZ2V0TGFiZWxBbmdsZTtcbiAgfVxufTtcblxudmFyIEJScCQ5ID0ge307XG5cbkJScCQ5LnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG5cbiAgaWYgKCFlbGVzKSB7XG4gICAgLy8ganVzdCBsZXQgdGhpcyBiZSByZWNhbGN1bGF0ZWQgb24gdGhlIG5leHQgeiBzb3J0IHRpY2tcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVzLmRyYWcgPSBbXTtcbiAgZWxlcy5ub25kcmFnID0gW107XG4gIHZhciBncmFiVGFyZ2V0cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcblxuICAgIGlmIChlbGUuZ3JhYmJlZCgpICYmICFlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgZ3JhYlRhcmdldHMucHVzaChlbGUpO1xuICAgIH0gZWxzZSBpZiAocnMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVsZXMuZHJhZy5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMubm9uZHJhZy5wdXNoKGVsZSk7XG4gICAgfVxuICB9IC8vIHB1dCB0aGUgZ3JhYiB0YXJnZXQgbm9kZXMgbGFzdCBzbyBpdCdzIG9uIHRvcCBvZiBpdHMgbmVpZ2hib3VyaG9vZFxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFiVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBncmFiVGFyZ2V0c1tpXTtcbiAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICB9XG59O1xuXG5CUnAkOS5pbnZhbGlkYXRlQ2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2FjaGVkWlNvcnRlZEVsZXMgPSBudWxsO1xufTtcblxuQlJwJDkuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoZm9yY2VSZWNhbGMpIHtcbiAgaWYgKGZvcmNlUmVjYWxjIHx8ICF0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzLmN5Lm11dGFibGVFbGVtZW50cygpLnRvQXJyYXkoKTtcbiAgICBlbGVzLnNvcnQoekluZGV4U29ydCk7XG4gICAgZWxlcy5pbnRlcmFjdGl2ZSA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaW50ZXJhY3RpdmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzID0gZWxlcztcbiAgICB0aGlzLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH0gZWxzZSB7XG4gICAgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG4gIH1cblxuICByZXR1cm4gZWxlcztcbn07XG5cbnZhciBCUnAkYSA9IHt9O1xuW0JScCQxLCBCUnAkMiwgQlJwJDMsIEJScCQ0LCBCUnAkNSwgQlJwJDYsIEJScCQ3LCBCUnAkOCwgQlJwJDldLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAkYSwgcHJvcHMpO1xufSk7XG5cbnZhciBCUnAkYiA9IHt9O1xuXG5CUnAkYi5nZXRDYWNoZWRJbWFnZSA9IGZ1bmN0aW9uICh1cmwsIGNyb3NzT3JpZ2luLCBvbkxvYWQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSB8fCB7fTtcbiAgdmFyIGNhY2hlID0gaW1hZ2VDYWNoZVt1cmxdO1xuXG4gIGlmIChjYWNoZSkge1xuICAgIGlmICghY2FjaGUuaW1hZ2UuY29tcGxldGUpIHtcbiAgICAgIGNhY2hlLmltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZS5pbWFnZTtcbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IGltYWdlQ2FjaGVbdXJsXSA9IGltYWdlQ2FjaGVbdXJsXSB8fCB7fTtcbiAgICB2YXIgaW1hZ2UgPSBjYWNoZS5pbWFnZSA9IG5ldyBJbWFnZSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGltYWdlLmVycm9yID0gdHJ1ZTtcbiAgICB9KTsgLy8gIzE1ODIgc2FmYXJpIGRvZXNuJ3QgbG9hZCBkYXRhIHVyaXMgd2l0aCBjcm9zc09yaWdpbiBwcm9wZXJseVxuICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcblxuICAgIHZhciBkYXRhVXJpUHJlZml4ID0gJ2RhdGE6JztcbiAgICB2YXIgaXNEYXRhVXJpID0gdXJsLnN1YnN0cmluZygwLCBkYXRhVXJpUHJlZml4Lmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gZGF0YVVyaVByZWZpeDtcblxuICAgIGlmICghaXNEYXRhVXJpKSB7XG4gICAgICBpbWFnZS5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luOyAvLyBwcmV2ZW50IHRhaW50ZWQgY2FudmFzXG4gICAgfVxuXG4gICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgIHJldHVybiBpbWFnZTtcbiAgfVxufTtcblxudmFyIEJScCRjID0ge307XG4vKiBnbG9iYWwgZG9jdW1lbnQsIHdpbmRvdywgUmVzaXplT2JzZXJ2ZXIsIE11dGF0aW9uT2JzZXJ2ZXIgKi9cblxuQlJwJGMucmVnaXN0ZXJCaW5kaW5nID0gZnVuY3Rpb24gKHRhcmdldCwgZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMsIFsxXSk7IC8vIGNvcHlcblxuICB2YXIgYiA9IHRoaXMuYmluZGVyKHRhcmdldCk7XG4gIHJldHVybiBiLm9uLmFwcGx5KGIsIGFyZ3MpO1xufTtcblxuQlJwJGMuYmluZGVyID0gZnVuY3Rpb24gKHRndCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciB0Z3RJc0RvbSA9IHRndCA9PT0gd2luZG93IHx8IHRndCA9PT0gZG9jdW1lbnQgfHwgdGd0ID09PSBkb2N1bWVudC5ib2R5IHx8IGRvbUVsZW1lbnQodGd0KTtcblxuICBpZiAoci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMgPT0gbnVsbCkge1xuICAgIC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQjZmVhdHVyZS1kZXRlY3Rpb25cbiAgICB2YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7Ly8gbm90IHN1cHBvcnRlZFxuICAgIH1cblxuICAgIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID0gc3VwcG9ydHNQYXNzaXZlO1xuICB9XG5cbiAgdmFyIG9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGhhbmRsZXIsIHVzZUNhcHR1cmUpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodGd0SXNEb20gJiYgci5zdXBwb3J0c1Bhc3NpdmVFdmVudHMpIHtcbiAgICAgIC8vIHJlcGxhY2UgdXNlQ2FwdHVyZSB3LyBvcHRzIG9ialxuICAgICAgYXJnc1syXSA9IHtcbiAgICAgICAgY2FwdHVyZTogdXNlQ2FwdHVyZSAhPSBudWxsID8gdXNlQ2FwdHVyZSA6IGZhbHNlLFxuICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgb25jZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgci5iaW5kaW5ncy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGd0LFxuICAgICAgYXJnczogYXJnc1xuICAgIH0pO1xuICAgICh0Z3QuYWRkRXZlbnRMaXN0ZW5lciB8fCB0Z3Qub24pLmFwcGx5KHRndCwgYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBvbjogb24sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogb24sXG4gICAgYWRkTGlzdGVuZXI6IG9uLFxuICAgIGJpbmQ6IG9uXG4gIH07XG59O1xuXG5CUnAkYy5ub2RlSXNEcmFnZ2FibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLmlzTm9kZSgpICYmICFub2RlLmxvY2tlZCgpICYmIG5vZGUuZ3JhYmJhYmxlKCk7XG59O1xuXG5CUnAkYy5ub2RlSXNHcmFiYmFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gdGhpcy5ub2RlSXNEcmFnZ2FibGUobm9kZSkgJiYgbm9kZS5pbnRlcmFjdGl2ZSgpO1xufTtcblxuQlJwJGMubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIHZhciBpc1NlbGVjdGVkID0gZnVuY3Rpb24gaXNTZWxlY3RlZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH07XG5cbiAgdmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzKHRhcmdldCwgbmFtZXMsIGUsIHBvc2l0aW9uKSB7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICB0YXJnZXQgPSByLmN5O1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07XG4gICAgICB0YXJnZXQuZW1pdCh7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6IG5hbWUsXG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc011bHRTZWxLZXlEb3duID0gZnVuY3Rpb24gaXNNdWx0U2VsS2V5RG93bihlKSB7XG4gICAgcmV0dXJuIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTsgLy8gbWF5YmUgZS5hbHRLZXlcbiAgfTtcblxuICB2YXIgYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2ggPSBmdW5jdGlvbiBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCBkb3ducykge1xuICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcblxuICAgIGlmIChyLmN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBkb3duICYmIGRvd24ucGFubmFibGUoKSkge1xuICAgICAgLy8gYSBncmFiYmFibGUgY29tcG91bmQgbm9kZSBiZWxvdyB0aGUgZWxlID0+IG5vIHBhc3N0aHJvdWdoIHBhbm5pbmdcbiAgICAgIGZvciAodmFyIGkgPSAwOyBkb3ducyAmJiBpIDwgZG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGRvd24gPSBkb3duc1tpXTsgLy9pZiBhbnkgcGFyZW50IG5vZGUgaW4gZXZlbnQgaGllcmFyY2h5IGlzbid0IHBhbm5hYmxlLCByZWplY3QgcGFzc3Rocm91Z2hcblxuICAgICAgICBpZiAoZG93bi5pc05vZGUoKSAmJiBkb3duLmlzUGFyZW50KCkgJiYgIWRvd24ucGFubmFibGUoKSkge1xuICAgICAgICAgIGFsbG93UGFzc3Rocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsb3dQYXNzdGhyb3VnaDtcbiAgfTtcblxuICB2YXIgc2V0R3JhYmJlZCA9IGZ1bmN0aW9uIHNldEdyYWJiZWQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLmdyYWJiZWQgPSB0cnVlO1xuICB9O1xuXG4gIHZhciBzZXRGcmVlZCA9IGZ1bmN0aW9uIHNldEZyZWVkKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5ncmFiYmVkID0gZmFsc2U7XG4gIH07XG5cbiAgdmFyIHNldEluRHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0SW5EcmFnTGF5ZXIoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmluRHJhZ0xheWVyID0gdHJ1ZTtcbiAgfTtcblxuICB2YXIgc2V0T3V0RHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0T3V0RHJhZ0xheWVyKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbkRyYWdMYXllciA9IGZhbHNlO1xuICB9O1xuXG4gIHZhciBzZXRHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gc2V0R3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gdHJ1ZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlR3JhYlRhcmdldCA9IGZ1bmN0aW9uIHJlbW92ZUdyYWJUYXJnZXQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmlzR3JhYlRhcmdldCA9IGZhbHNlO1xuICB9O1xuXG4gIHZhciBhZGRUb0RyYWdMaXN0ID0gZnVuY3Rpb24gYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpIHtcbiAgICB2YXIgbGlzdCA9IG9wdHMuYWRkVG9MaXN0O1xuICAgIHZhciBsaXN0SGFzRWxlID0gbGlzdC5oYXMoZWxlKTtcblxuICAgIGlmICghbGlzdEhhc0VsZSkge1xuICAgICAgbGlzdC5tZXJnZShlbGUpO1xuICAgICAgc2V0R3JhYmJlZChlbGUpO1xuICAgIH1cbiAgfTsgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjaGlsZCBub2RlcyBhbmQgaW5uZXIgZWRnZXNcbiAgLy8gb2YgYSBjb21wb3VuZCBub2RlIHRvIGJlIGRyYWdnZWQgYXMgd2VsbCBhcyB0aGUgZ3JhYmJlZCBhbmQgc2VsZWN0ZWQgbm9kZXNcblxuXG4gIHZhciBhZGREZXNjZW5kYW50c1RvRHJhZyA9IGZ1bmN0aW9uIGFkZERlc2NlbmRhbnRzVG9EcmFnKG5vZGUsIG9wdHMpIHtcbiAgICBpZiAoIW5vZGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuXG4gICAgdmFyIGlubmVyTm9kZXMgPSBub2RlLmRlc2NlbmRhbnRzKCk7XG5cbiAgICBpZiAob3B0cy5pbkRyYWdMYXllcikge1xuICAgICAgaW5uZXJOb2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIGlubmVyTm9kZXMuY29ubmVjdGVkRWRnZXMoKS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG9wdHMuYWRkVG9MaXN0LnVubWVyZ2UoaW5uZXJOb2Rlcyk7XG4gICAgfVxuICB9OyAvLyBhZGRzIHRoZSBnaXZlbiBub2RlcyBhbmQgaXRzIG5laWdoYm91cmhvb2QgdG8gdGhlIGRyYWcgbGF5ZXJcblxuXG4gIHZhciBhZGROb2Rlc1RvRHJhZyA9IGZ1bmN0aW9uIGFkZE5vZGVzVG9EcmFnKG5vZGVzLCBvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBub2Rlcy5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKTtcblxuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICAgIG5vZGVzLm5laWdoYm9yaG9vZCgpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiAhaGFzQ29tcG91bmROb2RlcyB8fCBlbGUuaXNFZGdlKCk7XG4gICAgICB9KS5mb3JFYWNoKHNldEluRHJhZ0xheWVyKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGREZXNjZW5kYW50c1RvRHJhZyhub2Rlcywgb3B0cyk7IC8vIGFsd2F5cyBhZGQgdG8gZHJhZ1xuICAgIC8vIGFsc28gYWRkIG5vZGVzIGFuZCBlZGdlcyByZWxhdGVkIHRvIHRoZSB0b3Btb3N0IGFuY2VzdG9yXG5cbiAgICB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2Rlcywge1xuICAgICAgaW5EcmFnTGF5ZXI6IG9wdHMuaW5EcmFnTGF5ZXJcbiAgICB9KTtcbiAgICByLnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzKCk7XG4gIH07XG5cbiAgdmFyIGFkZE5vZGVUb0RyYWcgPSBhZGROb2Rlc1RvRHJhZztcblxuICB2YXIgZnJlZURyYWdnZWRFbGVtZW50cyA9IGZ1bmN0aW9uIGZyZWVEcmFnZ2VkRWxlbWVudHMoZ3JhYmJlZEVsZXMpIHtcbiAgICBpZiAoIWdyYWJiZWRFbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBqdXN0IGdvIG92ZXIgYWxsIGVsZW1lbnRzIHJhdGhlciB0aGFuIGRvaW5nIGEgYnVuY2ggb2YgKHBvc3NpYmx5IGV4cGVuc2l2ZSkgdHJhdmVyc2Fsc1xuXG5cbiAgICByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBzZXRGcmVlZChlbGUpO1xuICAgICAgc2V0T3V0RHJhZ0xheWVyKGVsZSk7XG4gICAgICByZW1vdmVHcmFiVGFyZ2V0KGVsZSk7XG4gICAgfSk7XG4gICAgci51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9OyAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGFuY2VzdG9yIG5vZGVzIGFuZCBlZGdlcyBzaG91bGQgZ29cbiAgLy8gdG8gdGhlIGRyYWcgbGF5ZXIgKG9yIHNob3VsZCBiZSByZW1vdmVkIGZyb20gZHJhZyBsYXllcikuXG5cblxuICB2YXIgdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiB1cGRhdGVBbmNlc3RvcnNJbkRyYWdMYXllcihub2RlLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIgPT0gbnVsbCAmJiBvcHRzLmFkZFRvTGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBub3RoaW5nIHRvIGRvXG5cblxuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZmluZCB0b3AtbGV2ZWwgcGFyZW50XG5cblxuICAgIHZhciBwYXJlbnQgPSBub2RlLmFuY2VzdG9ycygpLm9ycGhhbnMoKTsgLy8gbm8gcGFyZW50IG5vZGU6IG5vIG5vZGVzIHRvIGFkZCB0byB0aGUgZHJhZyBsYXllclxuXG4gICAgaWYgKHBhcmVudC5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vZGVzID0gcGFyZW50LmRlc2NlbmRhbnRzKCkuc3Bhd25TZWxmKCkubWVyZ2UocGFyZW50KS51bm1lcmdlKG5vZGUpLnVubWVyZ2Uobm9kZS5kZXNjZW5kYW50cygpKTtcbiAgICB2YXIgZWRnZXMgPSBub2Rlcy5jb25uZWN0ZWRFZGdlcygpO1xuXG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVkZ2VzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuYWRkVG9MaXN0KSB7XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBibHVyQWN0aXZlRG9tRWxlbWVudCA9IGZ1bmN0aW9uIGJsdXJBY3RpdmVEb21FbGVtZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyICE9IG51bGwpIHtcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGF2ZU11dGF0aW9uc0FwaSA9IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGhhdmVSZXNpemVPYnNlcnZlckFwaSA9IHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7IC8vIHdhdGNoIGZvciB3aGVuIHRoZSBjeSBjb250YWluZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb21cblxuICBpZiAoaGF2ZU11dGF0aW9uc0FwaSkge1xuICAgIHIucmVtb3ZlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0bnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG11dG4gPSBtdXRuc1tpXTtcbiAgICAgICAgdmFyIHJOb2RlcyA9IG11dG4ucmVtb3ZlZE5vZGVzO1xuXG4gICAgICAgIGlmIChyTm9kZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHJOb2RlID0gck5vZGVzW2pdO1xuXG4gICAgICAgICAgICBpZiAock5vZGUgPT09IHIuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICByLnJlbW92ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIucGFyZW50Tm9kZSwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ0RPTU5vZGVSZW1vdmVkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHIuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIG9uUmVzaXplID0gdXRpbChmdW5jdGlvbiAoKSB7XG4gICAgci5jeS5yZXNpemUoKTtcbiAgfSwgMTAwKTtcblxuICBpZiAoaGF2ZU11dGF0aW9uc0FwaSkge1xuICAgIHIuc3R5bGVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG9uUmVzaXplKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5zdHlsZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWVcbiAgICB9KTtcbiAgfSAvLyBhdXRvIHJlc2l6ZVxuXG5cbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAncmVzaXplJywgb25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgaWYgKGhhdmVSZXNpemVPYnNlcnZlckFwaSkge1xuICAgIHIucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICByLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIpO1xuICB9XG5cbiAgdmFyIGZvckVhY2hVcCA9IGZ1bmN0aW9uIGZvckVhY2hVcChkb21FbGUsIGZuKSB7XG4gICAgd2hpbGUgKGRvbUVsZSAhPSBudWxsKSB7XG4gICAgICBmbihkb21FbGUpO1xuICAgICAgZG9tRWxlID0gZG9tRWxlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpbnZhbGlkYXRlQ29vcmRzID0gZnVuY3Rpb24gaW52YWxpZGF0ZUNvb3JkcygpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICB9O1xuXG4gIGZvckVhY2hVcChyLmNvbnRhaW5lciwgZnVuY3Rpb24gKGRvbUVsZSkge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3RyYW5zaXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdhbmltYXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdzY3JvbGwnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgfSk7IC8vIHN0b3AgcmlnaHQgY2xpY2sgbWVudSBmcm9tIGFwcGVhcmluZyBvbiBjeVxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnY29udGV4dG1lbnUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgdmFyIGluQm94U2VsZWN0aW9uID0gZnVuY3Rpb24gaW5Cb3hTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHIuc2VsZWN0aW9uWzRdICE9PSAwO1xuICB9O1xuXG4gIHZhciBldmVudEluQ29udGFpbmVyID0gZnVuY3Rpb24gZXZlbnRJbkNvbnRhaW5lcihlKSB7XG4gICAgLy8gc2F2ZSBjeWNsZXMgaWYgbW91c2UgZXZlbnRzIGFyZW4ndCB0byBiZSBjYXB0dXJlZFxuICAgIHZhciBjb250YWluZXJQYWdlQ29vcmRzID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gICAgdmFyIHggPSBjb250YWluZXJQYWdlQ29vcmRzWzBdO1xuICAgIHZhciB5ID0gY29udGFpbmVyUGFnZUNvb3Jkc1sxXTtcbiAgICB2YXIgd2lkdGggPSBjb250YWluZXJQYWdlQ29vcmRzWzJdO1xuICAgIHZhciBoZWlnaHQgPSBjb250YWluZXJQYWdlQ29vcmRzWzNdO1xuICAgIHZhciBwb3NpdGlvbnMgPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXMgOiBbZV07XG4gICAgdmFyIGF0TGVhc3RPbmVQb3NJbnNpZGUgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHBvc2l0aW9uc1tpXTtcblxuICAgICAgaWYgKHggPD0gcC5jbGllbnRYICYmIHAuY2xpZW50WCA8PSB4ICsgd2lkdGggJiYgeSA8PSBwLmNsaWVudFkgJiYgcC5jbGllbnRZIDw9IHkgKyBoZWlnaHQpIHtcbiAgICAgICAgYXRMZWFzdE9uZVBvc0luc2lkZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXRMZWFzdE9uZVBvc0luc2lkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByLmNvbnRhaW5lcjtcbiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgdmFyIHRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICB2YXIgY29udGFpbmVySXNUYXJnZXQgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0UGFyZW50KSB7XG4gICAgICBpZiAodFBhcmVudCA9PT0gY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lcklzVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRQYXJlbnQgPSB0UGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCFjb250YWluZXJJc1RhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaWYgdGFyZ2V0IGlzIG91dGlzZGUgY3kgY29udGFpbmVyLCB0aGVuIHRoaXMgZXZlbnQgaXMgbm90IGZvciB1c1xuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgLy8gUHJpbWFyeSBrZXlcblxuXG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gbW91c2Vkb3duSGFuZGxlcihlKSB7XG4gICAgaWYgKCFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGJsdXJBY3RpdmVEb21FbGVtZW50KCk7XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IHRydWU7XG4gICAgci5ob3ZlckRhdGEud2hpY2ggPSBlLndoaWNoO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIGdwb3MgPSBbZS5jbGllbnRYLCBlLmNsaWVudFldO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZ3Bvc1swXSwgZ3Bvc1sxXSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFycyA9IHIuZmluZE5lYXJlc3RFbGVtZW50cyhwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBwb3M7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gZ3BvcztcblxuICAgIHZhciBjaGVja0ZvclRhcGhvbGQgPSBmdW5jdGlvbiBjaGVja0ZvclRhcGhvbGQoKSB7XG4gICAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQoci5ob3ZlckRhdGEudGFwaG9sZFRpbWVvdXQpO1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHIuaG92ZXJEYXRhLnRhcGhvbGRDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGVsZSA9IHIuaG92ZXJEYXRhLmRvd247XG5cbiAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBob2xkJyxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGhvbGQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfTsgLy8gUmlnaHQgY2xpY2sgYnV0dG9uXG5cblxuICAgIGlmIChlLndoaWNoID09IDMpIHtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgbmVhci5lbWl0KGN4dEV2dCk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd24gPSBuZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuXG4gICAgICByLmhvdmVyRGF0YS5kb3duVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlOyAvLyBQcmltYXJ5IGJ1dHRvblxuICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSAxKSB7XG4gICAgICBpZiAobmVhcikge1xuICAgICAgICBuZWFyLmFjdGl2YXRlKCk7XG4gICAgICB9IC8vIEVsZW1lbnQgZHJhZ2dpbmdcblxuXG4gICAgICB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyBpcyB1bmRlciB0aGUgY3Vyc29yIGFuZCBpdCBpcyBkcmFnZ2FibGUsIHByZXBhcmUgdG8gZ3JhYiBpdFxuICAgICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciB0cmlnZ2VyR3JhYiA9IGZ1bmN0aW9uIHRyaWdnZXJHcmFiKGVsZSkge1xuICAgICAgICAgICAgICBlbGUuZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzZXRHcmFiVGFyZ2V0KG5lYXIpO1xuXG4gICAgICAgICAgICBpZiAoIW5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVtZW50c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYm9uJykpLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBjeS4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5zZWxlY3RlZCgpICYmIHIubm9kZUlzR3JhYmJhYmxlKGVsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKHRyaWdnZXJHcmFiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByLmhvdmVyRGF0YS5kb3duID0gbmVhcjtcbiAgICAgICAgci5ob3ZlckRhdGEuZG93bnMgPSBuZWFycztcbiAgICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZWRvd24nLCAndGFwc3RhcnQnLCAndm1vdXNlZG93biddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcblxuICAgICAgaWYgKG5lYXIgPT0gbnVsbCkge1xuICAgICAgICBzZWxlY3RbNF0gPSAxO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9O1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSBlbHNlIGlmIChuZWFyLnBhbm5hYmxlKCkpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTsgLy8gZm9yIGZ1dHVyZSBwYW5cbiAgICAgIH1cblxuICAgICAgY2hlY2tGb3JUYXBob2xkKCk7XG4gICAgfSAvLyBJbml0aWFsaXplIHNlbGVjdGlvbiBib3ggY29vcmRpbmF0ZXNcblxuXG4gICAgc2VsZWN0WzBdID0gc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFsxXSA9IHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyh3aW5kb3csICdtb3VzZW1vdmUnLCBmdW5jdGlvbiBtb3VzZW1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLmhvdmVyRGF0YS5jYXB0dXJlO1xuXG4gICAgaWYgKCFjYXB0dXJlICYmICFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgZ3BvcyA9IFtlLmNsaWVudFgsIGUuY2xpZW50WV07XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChncG9zWzBdLCBncG9zWzFdKTtcbiAgICB2YXIgbWRvd25Qb3MgPSByLmhvdmVyRGF0YS5tZG93blBvcztcbiAgICB2YXIgbWRvd25HUG9zID0gci5ob3ZlckRhdGEubWRvd25HUG9zO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IG51bGw7XG5cbiAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSByLmhvdmVyRGF0YS5sYXN0O1xuICAgIHZhciBkb3duID0gci5ob3ZlckRhdGEuZG93bjtcbiAgICB2YXIgZGlzcCA9IFtwb3NbMF0gLSBzZWxlY3RbMl0sIHBvc1sxXSAtIHNlbGVjdFszXV07XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgdmFyIGlzT3ZlclRocmVzaG9sZERyYWc7XG5cbiAgICBpZiAobWRvd25HUG9zKSB7XG4gICAgICB2YXIgZHggPSBncG9zWzBdIC0gbWRvd25HUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBncG9zWzFdIC0gbWRvd25HUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICByLmhvdmVyRGF0YS5pc092ZXJUaHJlc2hvbGREcmFnID0gaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIuZGVza3RvcFRhcFRocmVzaG9sZDI7XG4gICAgfVxuXG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcblxuICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlRHJhZ0RlbHRhID0gZnVuY3Rpb24gdXBkYXRlRHJhZ0RlbHRhKCkge1xuICAgICAgdmFyIGRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSA9IHIuaG92ZXJEYXRhLmRyYWdEZWx0YSB8fCBbXTtcblxuICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlbW92ZScsICd2bW91c2Vtb3ZlJywgJ3RhcGRyYWcnXSwgZSwge1xuICAgICAgeDogcG9zWzBdLFxuICAgICAgeTogcG9zWzFdXG4gICAgfSk7XG5cbiAgICB2YXIgZ29JbnRvQm94TW9kZSA9IGZ1bmN0aW9uIGdvSW50b0JveE1vZGUoKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2JveHN0YXJ0JyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0WzRdID0gMTtcbiAgICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9OyAvLyB0cmlnZ2VyIGNvbnRleHQgZHJhZyBpZiBybW91c2UgZG93blxuXG5cbiAgICBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDMpIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG92ZXIgdGhyZXNob2xkXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2N4dGRyYWcnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICBkb3duLmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH1cblxuICAgICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIGlmIChyLmhvdmVyRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ291dCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmhvdmVyRGF0YS5jeHRPdmVyID0gbmVhcjtcblxuICAgICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENoZWNrIGlmIHdlIGFyZSBkcmFnIHBhbm5pbmcgdGhlIGVudGlyZSBncmFwaFxuXG4gICAgfSBlbHNlIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBpZiAoY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgZGVsdGFQO1xuXG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbikge1xuICAgICAgICAgIHZhciBtZFBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IChwb3NbMF0gLSBtZFBvc1swXSkgKiB6b29tLFxuICAgICAgICAgICAgeTogKHBvc1sxXSAtIG1kUG9zWzFdKSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjeS5wYW5CeShkZWx0YVApO1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIH0gLy8gTmVlZHMgcmVwcm9qZWN0IGR1ZSB0byBwYW4gY2hhbmdpbmcgdmlld3BvcnRcblxuXG4gICAgICBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpOyAvLyBDaGVja3MgcHJpbWFyeSBidXR0b24gZG93biAmIG91dCBvZiB0aW1lICYgbW91c2Ugbm90IG1vdmVkIG11Y2hcbiAgICB9IGVsc2UgaWYgKHNlbGVjdFs0XSA9PSAxICYmIChkb3duID09IG51bGwgfHwgZG93bi5wYW5uYWJsZSgpKSkge1xuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZyAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgKG11bHRTZWxLZXlEb3duIHx8ICFjeS5wYW5uaW5nRW5hYmxlZCgpIHx8ICFjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkpIHtcbiAgICAgICAgICBnb0ludG9Cb3hNb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAmJiBjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgdmFyIGFsbG93UGFzc3Rocm91Z2ggPSBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCByLmhvdmVyRGF0YS5kb3ducyk7XG5cbiAgICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4gPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0WzRdID0gMDtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KG1kb3duUG9zKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvd24gJiYgZG93bi5wYW5uYWJsZSgpICYmIGRvd24uYWN0aXZlKCkpIHtcbiAgICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoIWRvd24gfHwgIWRvd24uZ3JhYmJlZCgpKSAmJiBuZWFyICE9IGxhc3QpIHtcbiAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGxhc3QsIFsnbW91c2VvdXQnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlb3ZlcicsICd0YXBkcmFnb3ZlciddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHIuaG92ZXJEYXRhLmxhc3QgPSBuZWFyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG93bikge1xuICAgICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIHRha2UgYWN0aW9uXG4gICAgICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgLy8gdGhlbiBzZWxlY3Rpb24gb3ZlcnJpZGVzXG4gICAgICAgICAgICBpZiAoZG93biAmJiBkb3duLmdyYWJiZWQoKSkge1xuICAgICAgICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgICAgICAgIGRvd24uZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdmcmVlJyk7XG5cbiAgICAgICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgICAgIGRvd24uZW1pdCgnZHJhZ2ZyZWVvbicpO1xuICAgICAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkgJiYgci5ub2RlSXNEcmFnZ2FibGUoZG93bikpIHtcbiAgICAgICAgICAgIC8vIGRyYWcgbm9kZVxuICAgICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG5cbiAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IHRydWU7IC8vIGluZGljYXRlIHRoYXQgd2UgYWN0dWFsbHkgZGlkIGRyYWcgdGhlIG5vZGVcblxuICAgICAgICAgICAgdmFyIHRvVHJpZ2dlciA9IGN5LmNvbGxlY3Rpb24oKTsgLy8gbm93LCBhZGQgdGhlIGVsZW1lbnRzIHRvIHRoZSBkcmFnIGxheWVyIGlmIG5vdCBkb25lIGFscmVhZHlcblxuICAgICAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMpIHtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoZHJhZ2dlZEVsZW1lbnRzLCB7XG4gICAgICAgICAgICAgICAgaW5EcmFnTGF5ZXI6IHRydWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0b3RhbFNoaWZ0ID0ge1xuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobnVtYmVyKGRpc3BbMF0pICYmIG51bWJlcihkaXNwWzFdKSkge1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG5cbiAgICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICAgIHZhciBkcmFnRGVsdGEgPSByLmhvdmVyRGF0YS5kcmFnRGVsdGE7XG5cbiAgICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlcihkcmFnRGVsdGFbMF0pICYmIG51bWJlcihkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnZ2VkRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGRFbGUgPSBkcmFnZ2VkRWxlbWVudHNbaV07XG5cbiAgICAgICAgICAgICAgaWYgKHIubm9kZUlzRHJhZ2dhYmxlKGRFbGUpICYmIGRFbGUuZ3JhYmJlZCgpKSB7XG4gICAgICAgICAgICAgICAgdG9UcmlnZ2VyLnB1c2goZEVsZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRvVHJpZ2dlci5zaWxlbnRTaGlmdCh0b3RhbFNoaWZ0KS5lbWl0KCdwb3NpdGlvbiBkcmFnJyk7XG4gICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBzYXZlIGRyYWcgZGVsdGEgZm9yIHdoZW4gd2UgYWN0dWFsbHkgc3RhcnQgZHJhZ2dpbmcgc28gdGhlIHJlbGF0aXZlIGdyYWIgcG9zIGlzIGNvbnN0YW50XG4gICAgICAgICAgdXBkYXRlRHJhZ0RlbHRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gcHJldmVudCB0aGUgZHJhZ2dpbmcgZnJvbSB0cmlnZ2VyaW5nIHRleHQgc2VsZWN0aW9uIG9uIHRoZSBwYWdlXG5cblxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIH1cblxuICAgIHNlbGVjdFsyXSA9IHBvc1swXTtcbiAgICBzZWxlY3RbM10gPSBwb3NbMV07XG5cbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ21vdXNldXAnLCBmdW5jdGlvbiBtb3VzZXVwSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci5ob3ZlckRhdGEuY2FwdHVyZTtcblxuICAgIGlmICghY2FwdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHIuaG92ZXJEYXRhLmNhcHR1cmUgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgdmFyIGRvd24gPSByLmhvdmVyRGF0YS5kb3duO1xuICAgIHZhciBtdWx0U2VsS2V5RG93biA9IGlzTXVsdFNlbEtleURvd24oZSk7XG5cbiAgICBpZiAoci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uKSB7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG5cbiAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7IC8vIG5vdCBhY3RpdmUgYmcgbm93XG5cbiAgICBpZiAoZG93bikge1xuICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN4dFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICBkb3duLmVtaXQoY3h0VGFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dFRhcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgci5ob3ZlckRhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgci5ob3ZlckRhdGEud2hpY2ggPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEud2hpY2ggPT09IDEpIHtcbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZXVwJywgJ3RhcGVuZCcsICd2bW91c2V1cCddLCBlLCB7XG4gICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgeTogcG9zWzFdXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IG1vdmUgYSBub2RlIGFyb3VuZFxuICAgICAgJiYgIXIuaG92ZXJEYXRhLmRyYWdnZWQgLy8gZGlkbid0IHBhblxuICAgICAgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZyAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgJiYgIXIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgLy8gZGlkbid0IG1vdmUgdG9vIG11Y2hcbiAgICAgICkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoZG93biwgWydjbGljaycsICd0YXAnLCAndmNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIERlc2VsZWN0IGFsbCBlbGVtZW50cyBpZiBub3RoaW5nIGlzIGN1cnJlbnRseSB1bmRlciB0aGUgbW91c2UgY3Vyc29yIGFuZCB3ZSBhcmVuJ3QgZHJhZ2dpbmcgc29tZXRoaW5nXG5cblxuICAgICAgaWYgKGRvd24gPT0gbnVsbCAmJiAvLyBub3QgbW91c2Vkb3duIG9uIG5vZGVcbiAgICAgICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IG1vdmUgdGhlIG5vZGUgYXJvdW5kXG4gICAgICAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nIC8vIG5vdCBib3ggc2VsZWN0aW9uXG4gICAgICAmJiAhci5ob3ZlckRhdGEuZHJhZ2dlZCAvLyBkaWRuJ3QgcGFuXG4gICAgICAmJiAhaXNNdWx0U2VsS2V5RG93bihlKSkge1xuICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG5cbiAgICAgICAgaWYgKGRyYWdnZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gZHJhZ2dlZEVsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgfSAvLyBTaW5nbGUgc2VsZWN0aW9uXG5cblxuICAgICAgaWYgKG5lYXIgPT0gZG93biAmJiAhci5kcmFnRGF0YS5kaWREcmFnICYmICFyLmhvdmVyRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgICAgaWYgKG5lYXIgIT0gbnVsbCAmJiBuZWFyLl9wcml2YXRlLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIDsgZWxzZSBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnYWRkaXRpdmUnIHx8IG11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICBpZiAobmVhci5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgIG5lYXIudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5lYXIuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW11bHRTZWxLZXlEb3duKSB7XG4gICAgICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShuZWFyKS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgICBuZWFyLnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGJveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjeS5zZWxlY3Rpb25UeXBlKCkgPT09ICdhZGRpdGl2ZScpIHtcbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKGJveCkudW5zZWxlY3QoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBib3guZW1pdCgnYm94Jykuc3RkRmlsdGVyKGVsZVdvdWxkQmVTZWxlY3RlZCkuc2VsZWN0KCkuZW1pdCgnYm94c2VsZWN0Jyk7XG4gICAgICAgIH0gLy8gYWx3YXlzIG5lZWQgcmVkcmF3IGluIGNhc2UgZWxlcyB1bnNlbGVjdGFibGVcblxuXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9IC8vIENhbmNlbCBkcmFnIHBhblxuXG5cbiAgICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZykge1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG5cbiAgICAgICAgaWYgKGRvd25XYXNHcmFiYmVkKSB7XG4gICAgICAgICAgZG93bi5lbWl0KCdmcmVlb24nKTtcbiAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZnJlZScpO1xuXG4gICAgICAgICAgaWYgKHIuZHJhZ0RhdGEuZGlkRHJhZykge1xuICAgICAgICAgICAgZG93bi5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZHJhZ2ZyZWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIGVsc2Ugbm90IHJpZ2h0IG1vdXNlXG5cblxuICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgci5ob3ZlckRhdGEuZG93biA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBmYWxzZTtcbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBudWxsO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IG51bGw7XG4gIH0sIGZhbHNlKTtcblxuICB2YXIgd2hlZWxIYW5kbGVyID0gZnVuY3Rpb24gd2hlZWxIYW5kbGVyKGUpIHtcbiAgICBpZiAoci5zY3JvbGxpbmdQYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB3aGlsZSBzY3JvbGxpbmcsIGlnbm9yZSB3aGVlbC10by16b29tXG5cblxuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHZhciBycG9zID0gW3Bvc1swXSAqIHpvb20gKyBwYW4ueCwgcG9zWzFdICogem9vbSArIHBhbi55XTtcblxuICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCB8fCBpbkJveFNlbGVjdGlvbigpKSB7XG4gICAgICAvLyBpZiBwYW4gZHJhZ2dpbmcgb3IgY3h0IGRyYWdnaW5nLCB3aGVlbCBtb3ZlbWVudHMgbWFrZSBubyB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkgJiYgY3kuem9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLndoZWVsWm9vbWluZyA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQoci5kYXRhLndoZWVsVGltZW91dCk7XG4gICAgICByLmRhdGEud2hlZWxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHIuZGF0YS53aGVlbFpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCAxNTApO1xuICAgICAgdmFyIGRpZmY7XG5cbiAgICAgIGlmIChlLmRlbHRhWSAhPSBudWxsKSB7XG4gICAgICAgIGRpZmYgPSBlLmRlbHRhWSAvIC0yNTA7XG4gICAgICB9IGVsc2UgaWYgKGUud2hlZWxEZWx0YVkgIT0gbnVsbCkge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhWSAvIDEwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWZmID0gZS53aGVlbERlbHRhIC8gMTAwMDtcbiAgICAgIH1cblxuICAgICAgZGlmZiA9IGRpZmYgKiByLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuXG4gICAgICBpZiAobmVlZHNXaGVlbEZpeCkge1xuICAgICAgICAvLyBmaXhlcyBzbG93IHdoZWVsIGV2ZW50cyBvbiBmZi9saW51eCBhbmQgZmYvd2luZG93c1xuICAgICAgICBkaWZmICo9IDMzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Wm9vbSA9IGN5Lnpvb20oKSAqIE1hdGgucG93KDEwLCBkaWZmKTtcblxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuXG4gICAgICBjeS56b29tKHtcbiAgICAgICAgbGV2ZWw6IG5ld1pvb20sXG4gICAgICAgIHJlbmRlcmVkUG9zaXRpb246IHtcbiAgICAgICAgICB4OiBycG9zWzBdLFxuICAgICAgICAgIHk6IHJwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9OyAvLyBGdW5jdGlvbnMgdG8gaGVscCB3aXRoIHdoZXRoZXIgbW91c2Ugd2hlZWwgc2hvdWxkIHRyaWdnZXIgem9vbWluZ1xuICAvLyAtLVxuXG5cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7IC8vIGRpc2FibGUgbm9uc3RhbmRhcmQgd2hlZWwgZXZlbnRzXG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnbW91c2V3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnRE9NTW91c2VTY3JvbGwnLCB3aGVlbEhhbmRsZXIsIHRydWUpO1xuICAvLyByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCB3aGVlbEhhbmRsZXIsIHRydWUpOyAvLyBvbGRlciBmaXJlZm94XG5cbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAnc2Nyb2xsJywgZnVuY3Rpb24gc2Nyb2xsSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHIuc2Nyb2xsaW5nUGFnZSA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHIuc2Nyb2xsaW5nUGFnZVRpbWVvdXQpO1xuICAgIHIuc2Nyb2xsaW5nUGFnZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHIuc2Nyb2xsaW5nUGFnZSA9IGZhbHNlO1xuICAgIH0sIDI1MCk7XG4gIH0sIHRydWUpOyAvLyBkZXNrdG9wIHNhZmFyaSBwaW5jaCB0byB6b29tIHN0YXJ0XG5cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlc3RhcnQnLCBmdW5jdGlvbiBnZXN0dXJlU3RhcnRIYW5kbGVyKGUpIHtcbiAgICByLmdlc3R1cmVTdGFydFpvb20gPSByLmN5Lnpvb20oKTtcblxuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgd2hlZWxIYW5kbGVyKGUpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7IC8vIEZ1bmN0aW9ucyB0byBoZWxwIHdpdGggaGFuZGxpbmcgbW91c2VvdXQvbW91c2VvdmVyIG9uIHRoZSBDeXRvc2NhcGUgY29udGFpbmVyXG4gIC8vIEhhbmRsZSBtb3VzZW91dCBvbiBDeXRvc2NhcGUgY29udGFpbmVyXG5cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW91dCcsIGZ1bmN0aW9uIG1vdXNlT3V0SGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdXQnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIG1vdXNlT3ZlckhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3ZlcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHZhciBmMXgxLCBmMXkxLCBmMngxLCBmMnkxOyAvLyBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cblxuICB2YXIgZGlzdGFuY2UxLCBkaXN0YW5jZTFTcTsgLy8gaW5pdGlhbCBkaXN0YW5jZSBiZXR3ZWVuIGZpbmdlciAxIGFuZCBmaW5nZXIgMiBmb3IgcGluY2gtdG8tem9vbVxuXG4gIHZhciBjZW50ZXIxLCBtb2RlbENlbnRlcjE7IC8vIGNlbnRlciBwb2ludCBvbiBzdGFydCBwaW5jaCB0byB6b29tXG5cbiAgdmFyIG9mZnNldExlZnQsIG9mZnNldFRvcDtcbiAgdmFyIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQ7XG4gIHZhciB0d29GaW5nZXJzU3RhcnRJbnNpZGU7XG5cbiAgdmFyIGRpc3RhbmNlID0gZnVuY3Rpb24gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKSk7XG4gIH07XG5cbiAgdmFyIGRpc3RhbmNlU3EgPSBmdW5jdGlvbiBkaXN0YW5jZVNxKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuICh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKTtcbiAgfTtcblxuICB2YXIgdG91Y2hzdGFydEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIHIuaGFzVG91Y2hTdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmICghZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGJsdXJBY3RpdmVEb21FbGVtZW50KCk7XG4gICAgci50b3VjaERhdGEuY2FwdHVyZSA9IHRydWU7XG4gICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG5cbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9IC8vIHJlY29yZCBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cblxuXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IHRydWU7XG4gICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcyk7XG4gICAgICB2YXIgb2Zmc2V0cyA9IHIuZmluZENvbnRhaW5lckNsaWVudENvb3JkcygpO1xuICAgICAgb2Zmc2V0TGVmdCA9IG9mZnNldHNbMF07XG4gICAgICBvZmZzZXRUb3AgPSBvZmZzZXRzWzFdO1xuICAgICAgY29udGFpbmVyV2lkdGggPSBvZmZzZXRzWzJdO1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gb2Zmc2V0c1szXTtcbiAgICAgIGYxeDEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMXkxID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICBmMngxID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgICAgZjJ5MSA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdHdvRmluZ2Vyc1N0YXJ0SW5zaWRlID0gMCA8PSBmMXgxICYmIGYxeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMngxICYmIGYyeDEgPD0gY29udGFpbmVyV2lkdGggJiYgMCA8PSBmMXkxICYmIGYxeTEgPD0gY29udGFpbmVySGVpZ2h0ICYmIDAgPD0gZjJ5MSAmJiBmMnkxIDw9IGNvbnRhaW5lckhlaWdodDtcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgICAgZGlzdGFuY2UxID0gZGlzdGFuY2UoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBkaXN0YW5jZTFTcSA9IGRpc3RhbmNlU3EoZjF4MSwgZjF5MSwgZjJ4MSwgZjJ5MSk7XG4gICAgICBjZW50ZXIxID0gWyhmMXgxICsgZjJ4MSkgLyAyLCAoZjF5MSArIGYyeTEpIC8gMl07XG4gICAgICBtb2RlbENlbnRlcjEgPSBbKGNlbnRlcjFbMF0gLSBwYW4ueCkgLyB6b29tLCAoY2VudGVyMVsxXSAtIHBhbi55KSAvIHpvb21dOyAvLyBjb25zaWRlciBjb250ZXh0IHRhcFxuXG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZCA9IDIwMDtcbiAgICAgIHZhciBjeHREaXN0VGhyZXNob2xkU3EgPSBjeHREaXN0VGhyZXNob2xkICogY3h0RGlzdFRocmVzaG9sZDtcblxuICAgICAgaWYgKGRpc3RhbmNlMVNxIDwgY3h0RGlzdFRocmVzaG9sZFNxICYmICFlLnRvdWNoZXNbMl0pIHtcbiAgICAgICAgdmFyIG5lYXIxID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgICB2YXIgbmVhcjIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMl0sIG5vd1szXSwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKG5lYXIxICYmIG5lYXIxLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjEuYWN0aXZhdGUoKS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXIxO1xuICAgICAgICB9IGVsc2UgaWYgKG5lYXIyICYmIG5lYXIyLmlzTm9kZSgpKSB7XG4gICAgICAgICAgbmVhcjIuYWN0aXZhdGUoKS5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgci50b3VjaERhdGEuY3h0ID0gdHJ1ZTtcbiAgICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICAgIC8vIHNhZmFyaSBvbiBpb3MgcGFucyB0aGUgcGFnZSBvdGhlcndpc2UgKG5vcm1hbGx5IHlvdSBzaG91bGQgYmUgYWJsZSB0byBwcmV2ZW50ZGVmYXVsdCBvbiB0b3VjaG1vdmUuLi4pXG4gICAgICBpZiAoY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1sxXSkgOyBlbHNlIGlmIChlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHZhciBuZWFycyA9IHIuZmluZE5lYXJlc3RFbGVtZW50cyhub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB2YXIgbmVhciA9IG5lYXJzWzBdO1xuXG4gICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBuZWFyO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydHMgPSBuZWFycztcblxuICAgICAgICBpZiAoci5ub2RlSXNHcmFiYmFibGUobmVhcikpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBudWxsO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuXG4gICAgICAgICAgaWYgKG5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgLy8gcmVzZXQgZHJhZyBlbGVtZW50cywgc2luY2UgbmVhciB3aWxsIGJlIGFkZGVkIGFnYWluXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0R3JhYlRhcmdldChuZWFyKTtcblxuICAgICAgICAgIHZhciBtYWtlRXZlbnQgPSBmdW5jdGlvbiBtYWtlRXZlbnQodHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcblxuICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGVzKSB7XG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgbi5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsndG91Y2hzdGFydCcsICd0YXBzdGFydCcsICd2bW91c2Vkb3duJ10sIGUsIHtcbiAgICAgICAgeDogbm93WzBdLFxuICAgICAgICB5OiBub3dbMV1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9IC8vIFRhcCwgdGFwaG9sZFxuICAgICAgLy8gLS0tLS1cblxuXG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaFN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgY2xlYXJUaW1lb3V0KHIudG91Y2hEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIudG91Y2hEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID09PSBmYWxzZSAmJiAhci5waW5jaGluZyAvLyBpZiBwaW5jaGluZywgdGhlbiB0YXBob2xkIHVuc2VsZWN0IHNob3VsZG4ndCB0YWtlIGVmZmVjdFxuICAgICAgICAmJiAhci50b3VjaERhdGEuc2VsZWN0aW5nIC8vIGJveCBzZWxlY3Rpb24gc2hvdWxkbid0IGFsbG93IHRhcGhvbGQgdGhyb3VnaFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudHMoci50b3VjaERhdGEuc3RhcnQsIFsndGFwaG9sZCddLCBlLCB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPj0gMSkge1xuICAgICAgdmFyIHNQb3MgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG91Y2gwID0gZS50b3VjaGVzWzBdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBbdG91Y2gwLmNsaWVudFgsIHRvdWNoMC5jbGllbnRZXTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNobW92ZUhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaG1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLnRvdWNoRGF0YS5jYXB0dXJlO1xuXG4gICAgaWYgKCFjYXB0dXJlICYmICFldmVudEluQ29udGFpbmVyKGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG5cbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1sxXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMV0uY2xpZW50WCwgZS50b3VjaGVzWzFdLmNsaWVudFkpO1xuICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgbm93WzNdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICB2YXIgc3RhcnRHUG9zID0gci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb247XG4gICAgdmFyIGlzT3ZlclRocmVzaG9sZERyYWc7XG5cbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMF0gJiYgc3RhcnRHUG9zKSB7XG4gICAgICB2YXIgZGlzcCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgICBkaXNwW2pdID0gbm93W2pdIC0gZWFybGllcltqXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGR4ID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBzdGFydEdQb3NbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gc3RhcnRHUG9zWzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICBpc092ZXJUaHJlc2hvbGREcmFnID0gZGlzdDIgPj0gci50b3VjaFRhcFRocmVzaG9sZDI7XG4gICAgfSAvLyBjb250ZXh0IHN3aXBlIGNhbmNlbGxpbmdcblxuXG4gICAgaWYgKGNhcHR1cmUgJiYgci50b3VjaERhdGEuY3h0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgZjF4MiA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7IC8vIHZhciBkaXN0YW5jZTIgPSBkaXN0YW5jZSggZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5MiApO1xuXG4gICAgICB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgdmFyIGZhY3RvclNxID0gZGlzdGFuY2UyU3EgLyBkaXN0YW5jZTFTcTtcbiAgICAgIHZhciBkaXN0VGhyZXNob2xkID0gMTUwO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGRTcSA9IGRpc3RUaHJlc2hvbGQgKiBkaXN0VGhyZXNob2xkO1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZCA9IDEuNTtcbiAgICAgIHZhciBmYWN0b3JUaHJlc2hvbGRTcSA9IGZhY3RvclRocmVzaG9sZCAqIGZhY3RvclRocmVzaG9sZDsgLy8gY2FuY2VsIGN0eCBnZXN0dXJlcyBpZiB0aGUgZGlzdGFuY2UgYi90IHRoZSBmaW5nZXJzIGluY3JlYXNlc1xuXG4gICAgICBpZiAoZmFjdG9yU3EgPj0gZmFjdG9yVGhyZXNob2xkU3EgfHwgZGlzdGFuY2UyU3EgPj0gZGlzdFRocmVzaG9sZFNxKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KGN4dEV2dCk7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gY29udGV4dCBzd2lwZVxuXG5cbiAgICBpZiAoY2FwdHVyZSAmJiByLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuXG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuZW1pdChjeHRFdnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByLnRvdWNoRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLmN4dE92ZXIgfHwgbmVhciAhPT0gci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuY3h0T3Zlcikge1xuICAgICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIgPSBuZWFyO1xuXG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBib3ggc2VsZWN0aW9uXG5cbiAgICB9IGVsc2UgaWYgKGNhcHR1cmUgJiYgZS50b3VjaGVzWzJdICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5sYXN0VGhyZWVUb3VjaCA9ICtuZXcgRGF0ZSgpO1xuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IHRydWU7XG4gICAgICByLnRvdWNoRGF0YS5kaWRTZWxlY3QgPSB0cnVlO1xuICAgICAgc2VsZWN0WzRdID0gMTtcblxuICAgICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCB8fCBzZWxlY3RbMF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZWxlY3RbMF0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDM7XG4gICAgICAgIHNlbGVjdFsxXSA9IChub3dbMV0gKyBub3dbM10gKyBub3dbNV0pIC8gMztcbiAgICAgICAgc2VsZWN0WzJdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzICsgMTtcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdFsyXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMztcbiAgICAgICAgc2VsZWN0WzNdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzO1xuICAgICAgfVxuXG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTsgLy8gcGluY2ggdG8gem9vbVxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMV0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gcGluY2gtdG8tem9vbVxuICAgICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgLy8gdHdvIGZpbmdlcnMgPT4gcGluY2ggdG8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcblxuICAgICAgaWYgKGRyYWdnZWRFbGVzKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhZ2dlZEVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZGVfcCA9IGRyYWdnZWRFbGVzW2ldLl9wcml2YXRlO1xuICAgICAgICAgIGRlX3AuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICAgIGRlX3AucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgX3N0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7IC8vICh4MiwgeTIpIGZvciBmaW5nZXJzIDEgYW5kIDJcblxuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgICAgZjF5MiA9IGUudG91Y2hlc1swXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGYyeDIgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpOyAvLyB2YXIgZGlzdGFuY2UyU3EgPSBkaXN0YW5jZVNxKCBmMXgyLCBmMXkyLCBmMngyLCBmMnkyICk7XG4gICAgICAvLyB2YXIgZmFjdG9yID0gTWF0aC5zcXJ0KCBkaXN0YW5jZTJTcSApIC8gTWF0aC5zcXJ0KCBkaXN0YW5jZTFTcSApO1xuXG4gICAgICB2YXIgZmFjdG9yID0gZGlzdGFuY2UyIC8gZGlzdGFuY2UxO1xuXG4gICAgICBpZiAodHdvRmluZ2Vyc1N0YXJ0SW5zaWRlKSB7XG4gICAgICAgIC8vIGRlbHRhIGZpbmdlcjFcbiAgICAgICAgdmFyIGRmMXggPSBmMXgyIC0gZjF4MTtcbiAgICAgICAgdmFyIGRmMXkgPSBmMXkyIC0gZjF5MTsgLy8gZGVsdGEgZmluZ2VyIDJcblxuICAgICAgICB2YXIgZGYyeCA9IGYyeDIgLSBmMngxO1xuICAgICAgICB2YXIgZGYyeSA9IGYyeTIgLSBmMnkxOyAvLyB0cmFuc2xhdGlvbiBpcyB0aGUgbm9ybWFsaXNlZCB2ZWN0b3Igb2YgdGhlIHR3byBmaW5nZXJzIG1vdmVtZW50XG4gICAgICAgIC8vIGkuZS4gc28gcGluY2hpbmcgY2FuY2VscyBvdXQgYW5kIG1vdmluZyB0b2dldGhlciBwYW5zXG5cbiAgICAgICAgdmFyIHR4ID0gKGRmMXggKyBkZjJ4KSAvIDI7XG4gICAgICAgIHZhciB0eSA9IChkZjF5ICsgZGYyeSkgLyAyOyAvLyBub3cgY2FsY3VsYXRlIHRoZSB6b29tXG5cbiAgICAgICAgdmFyIHpvb20xID0gY3kuem9vbSgpO1xuICAgICAgICB2YXIgem9vbTIgPSB6b29tMSAqIGZhY3RvcjtcbiAgICAgICAgdmFyIHBhbjEgPSBjeS5wYW4oKTsgLy8gdGhlIG1vZGVsIGNlbnRlciBwb2ludCBjb252ZXJ0ZWQgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZWQgcG9zXG5cbiAgICAgICAgdmFyIGN0cnggPSBtb2RlbENlbnRlcjFbMF0gKiB6b29tMSArIHBhbjEueDtcbiAgICAgICAgdmFyIGN0cnkgPSBtb2RlbENlbnRlcjFbMV0gKiB6b29tMSArIHBhbjEueTtcbiAgICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAoY3RyeCAtIHBhbjEueCAtIHR4KSArIGN0cngsXG4gICAgICAgICAgeTogLXpvb20yIC8gem9vbTEgKiAoY3RyeSAtIHBhbjEueSAtIHR5KSArIGN0cnlcbiAgICAgICAgfTsgLy8gcmVtb3ZlIGRyYWdnZWQgZWxlc1xuXG4gICAgICAgIGlmIChfc3RhcnQgJiYgX3N0YXJ0LmFjdGl2ZSgpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuXG4gICAgICAgICAgX3N0YXJ0LnVuYWN0aXZhdGUoKS5lbWl0KCdmcmVlb24nKTtcblxuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcblxuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG5cbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3kudmlld3BvcnQoe1xuICAgICAgICAgIHpvb206IHpvb20yLFxuICAgICAgICAgIHBhbjogcGFuMixcbiAgICAgICAgICBjYW5jZWxPbkZhaWxlZFpvb206IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3RhbmNlMSA9IGRpc3RhbmNlMjtcbiAgICAgICAgZjF4MSA9IGYxeDI7XG4gICAgICAgIGYxeTEgPSBmMXkyO1xuICAgICAgICBmMngxID0gZjJ4MjtcbiAgICAgICAgZjJ5MSA9IGYyeTI7XG4gICAgICAgIHIucGluY2hpbmcgPSB0cnVlO1xuICAgICAgfSAvLyBSZS1wcm9qZWN0XG5cblxuICAgICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgICB9XG5cbiAgICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1swXSAmJiAhci50b3VjaERhdGEuZGlkU2VsZWN0IC8vIGRvbid0IGFsbG93IGJveCBzZWxlY3Rpb24gdG8gZGVncmFkZSB0byBzaW5nbGUgZmluZ2VyIGV2ZW50cyBsaWtlIHBhbm5pbmdcbiAgICApIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgICAgIHZhciBsYXN0ID0gci50b3VjaERhdGEubGFzdDtcbiAgICAgICAgdmFyIG5lYXI7XG5cbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYXB0dXJlICYmIHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gLy8gZHJhZ2dpbmcgbm9kZXNcblxuXG4gICAgICAgIGlmIChjYXB0dXJlICYmIHN0YXJ0ICE9IG51bGwgJiYgci5ub2RlSXNEcmFnZ2FibGUoc3RhcnQpKSB7XG4gICAgICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgICAgIC8vIHRoZW4gZHJhZ2dpbmcgY2FuIGhhcHBlblxuICAgICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG5cbiAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoZHJhZ2dlZEVsZXMsIHtcbiAgICAgICAgICAgICAgICBpbkRyYWdMYXllcjogdHJ1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0b3RhbFNoaWZ0ID0ge1xuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobnVtYmVyKGRpc3BbMF0pICYmIG51bWJlcihkaXNwWzFdKSkge1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG5cbiAgICAgICAgICAgICAgaWYgKGp1c3RTdGFydGVkRHJhZykge1xuICAgICAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBkcmFnRGVsdGEgPSByLnRvdWNoRGF0YS5kcmFnRGVsdGE7XG5cbiAgICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlcihkcmFnRGVsdGFbMF0pICYmIG51bWJlcihkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQoJ3Bvc2l0aW9uIGRyYWcnKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblswXSA9PSBlYXJsaWVyWzBdICYmIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gPT0gZWFybGllclsxXSkge1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgci5yZWRyYXcoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gb3RoZXJpc2Uga2VlcCB0cmFjayBvZiBkcmFnIGRlbHRhIGZvciBsYXRlclxuICAgICAgICAgICAgdmFyIGRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSA9IHIudG91Y2hEYXRhLmRyYWdEZWx0YSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB0b3VjaG1vdmVcblxuXG4gICAgICAgIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0IHx8IG5lYXIsIFsndG91Y2htb3ZlJywgJ3RhcGRyYWcnLCAndm1vdXNlbW92ZSddLCBlLCB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICgoIXN0YXJ0IHx8ICFzdGFydC5ncmFiYmVkKCkpICYmIG5lYXIgIT0gbGFzdCkge1xuICAgICAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICAgICAgbGFzdC5lbWl0KHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3V0JyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgICAgbmVhci5lbWl0KHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3ZlcicsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci50b3VjaERhdGEubGFzdCA9IG5lYXI7XG4gICAgICAgIH0gLy8gY2hlY2sgdG8gY2FuY2VsIHRhcGhvbGRcblxuICAgICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobm93W2ldICYmIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25baV0gJiYgaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gcGFubmluZ1xuXG5cbiAgICAgICAgaWYgKGNhcHR1cmUgJiYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQucGFubmFibGUoKSkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2goc3RhcnQsIHIudG91Y2hEYXRhLnN0YXJ0cyk7XG5cbiAgICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBpZiAoIXIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbikge1xuICAgICAgICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSBhcnJheTJwb2ludChyLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgICB4OiBkaXNwWzBdICogem9vbSxcbiAgICAgICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgICByLnN3aXBlUGFubmluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGN5LnBhbkJ5KHtcbiAgICAgICAgICAgICAgICB4OiBkeCAqIHpvb20sXG4gICAgICAgICAgICAgICAgeTogZHkgKiB6b29tXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0LnVuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gUmUtcHJvamVjdFxuXG5cbiAgICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgICAgIG5vd1sxXSA9IHBvc1sxXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIGVhcmxpZXJbal0gPSBub3dbal07XG4gICAgfSAvLyB0aGUgYWN0aXZlIGJnIGluZGljYXRvciBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIG1ha2luZyBhIHN3aXBlIHRoYXQgaXMgbmVpdGhlciBmb3IgZHJhZ2dpbmcgbm9kZXMgb3IgcGFubmluZ1xuXG5cbiAgICBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXMubGVuZ3RoID4gMCAmJiAhci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzICYmICFyLnN3aXBlUGFubmluZyAmJiByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gIT0gbnVsbCkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaGNhbmNlbEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHdpbmRvdywgJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hjYW5jZWxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG4gICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRvdWNoZW5kSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcod2luZG93LCAndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGVuZEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICB2YXIgY2FwdHVyZSA9IHIudG91Y2hEYXRhLmNhcHR1cmU7XG5cbiAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgci5zd2lwZVBhbm5pbmcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBub3cgPSByLnRvdWNoRGF0YS5ub3c7XG4gICAgdmFyIGVhcmxpZXIgPSByLnRvdWNoRGF0YS5lYXJsaWVyO1xuXG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1syXS5jbGllbnRYLCBlLnRvdWNoZXNbMl0uY2xpZW50WSk7XG4gICAgICBub3dbNF0gPSBwb3NbMF07XG4gICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgdmFyIGN0eFRhcGVuZDtcblxuICAgIGlmIChyLnRvdWNoRGF0YS5jeHQpIHtcbiAgICAgIGN0eFRhcGVuZCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcGVuZCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgc3RhcnQuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN0eFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgc3RhcnQuZW1pdChjdHhUYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3R4VGFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByLnRvdWNoRGF0YS5jeHQgPSBmYWxzZTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBubyBtb3JlIGJveCBzZWxlY3Rpb24gaWYgd2UgZG9uJ3QgaGF2ZSB0aHJlZSBmaW5nZXJzXG5cblxuICAgIGlmICghZS50b3VjaGVzWzJdICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiByLnRvdWNoRGF0YS5zZWxlY3RpbmcpIHtcbiAgICAgIHIudG91Y2hEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgICAgdmFyIGJveCA9IGN5LmNvbGxlY3Rpb24oci5nZXRBbGxJbkJveChzZWxlY3RbMF0sIHNlbGVjdFsxXSwgc2VsZWN0WzJdLCBzZWxlY3RbM10pKTtcbiAgICAgIHNlbGVjdFswXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFsxXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFsyXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFszXSA9IHVuZGVmaW5lZDtcbiAgICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgY3kuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdib3hlbmQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuc2VsZWN0YWJsZSgpICYmICFlbGUuc2VsZWN0ZWQoKTtcbiAgICAgIH07XG5cbiAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcblxuICAgICAgaWYgKGJveC5ub25lbXB0eSgpKSB7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGUudG91Y2hlc1sxXSkgOyBlbHNlIGlmIChlLnRvdWNoZXNbMF0pIDsgZWxzZSBpZiAoIWUudG91Y2hlc1swXSkge1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcblxuICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHN0YXJ0V2FzR3JhYmJlZCA9IHN0YXJ0Ll9wcml2YXRlLmdyYWJiZWQ7XG4gICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0V2FzR3JhYmJlZCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcblxuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIHN0YXJ0LmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWyd0b3VjaGVuZCcsICd0YXBlbmQnLCAndm1vdXNldXAnLCAndGFwZHJhZ291dCddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ3RvdWNoZW5kJywgJ3RhcGVuZCcsICd2bW91c2V1cCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHggPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzBdIC0gbm93WzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdIC0gbm93WzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICB2YXIgcmRpc3QyID0gZGlzdDIgKiB6b29tICogem9vbTsgLy8gVGFwIGV2ZW50LCByb3VnaGx5IHNhbWUgYXMgbW91c2UgY2xpY2sgZXZlbnQgZm9yIHRvdWNoXG5cbiAgICAgIGlmICghci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCkge1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgY3kuJCgnOnNlbGVjdGVkJykudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsndGFwJywgJ3ZjbGljayddLCBlLCB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9KTtcbiAgICAgIH0gLy8gUHJlcGFyZSB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB0b3VjaGVkIG5vZGUsIG9ubHkgaWYgaXQgaGFzbid0IGJlZW4gZHJhZ2dlZCBwYXN0IGEgY2VydGFpbiBkaXN0YW5jZVxuXG5cbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IGRyYWcgbm9kZXMgYXJvdW5kXG4gICAgICAmJiBzdGFydC5fcHJpdmF0ZS5zZWxlY3RhYmxlICYmIHJkaXN0MiA8IHIudG91Y2hUYXBUaHJlc2hvbGQyICYmICFyLnBpbmNoaW5nIC8vIHBpbmNoIHRvIHpvb20gc2hvdWxkIG5vdCBhZmZlY3Qgc2VsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgICBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgY3kuJChpc1NlbGVjdGVkKS51bm1lcmdlKHN0YXJ0KS51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBzdGFydC51bnNlbGVjdChbJ3RhcHVuc2VsZWN0J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhcnQuc2VsZWN0KFsndGFwc2VsZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgIHIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICBlYXJsaWVyW2pdID0gbm93W2pdO1xuICAgIH1cblxuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlOyAvLyByZXNldCBmb3IgbmV4dCB0b3VjaHN0YXJ0XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgci50b3VjaERhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgICByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gbnVsbDtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gbnVsbDtcbiAgICAgIHIudG91Y2hEYXRhLmRpZFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gdGhlIG9sZCBzdGFydCBnbG9iYWwgcG9zJ24gbWF5IG5vdCBiZSB0aGUgc2FtZSBmaW5nZXIgdGhhdCByZW1haW5zXG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW2UudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WV07XG4gICAgICB9XG5cbiAgICAgIHIucGluY2hpbmcgPSBmYWxzZTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9IC8vci5yZWRyYXcoKTtcblxuICB9LCBmYWxzZSk7IC8vIGZhbGxiYWNrIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIG1zIHBvaW50ZXIgZXZlbnRzXG5cbiAgaWYgKHR5cGVvZiBUb3VjaEV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuXG4gICAgdmFyIG1ha2VUb3VjaCA9IGZ1bmN0aW9uIG1ha2VUb3VjaChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgZm9yY2U6IDEsXG4gICAgICAgIGlkZW50aWZpZXI6IGUucG9pbnRlcklkLFxuICAgICAgICBwYWdlWDogZS5wYWdlWCxcbiAgICAgICAgcGFnZVk6IGUucGFnZVksXG4gICAgICAgIHJhZGl1c1g6IGUud2lkdGggLyAyLFxuICAgICAgICByYWRpdXNZOiBlLmhlaWdodCAvIDIsXG4gICAgICAgIHNjcmVlblg6IGUuc2NyZWVuWCxcbiAgICAgICAgc2NyZWVuWTogZS5zY3JlZW5ZLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgbWFrZVBvaW50ZXIgPSBmdW5jdGlvbiBtYWtlUG9pbnRlcihlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBldmVudDogZSxcbiAgICAgICAgdG91Y2g6IG1ha2VUb3VjaChlKVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIGFkZFBvaW50ZXIgPSBmdW5jdGlvbiBhZGRQb2ludGVyKGUpIHtcbiAgICAgIHBvaW50ZXJzLnB1c2gobWFrZVBvaW50ZXIoZSkpO1xuICAgIH07XG5cbiAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZ1bmN0aW9uIHJlbW92ZVBvaW50ZXIoZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcCA9IHBvaW50ZXJzW2ldO1xuXG4gICAgICAgIGlmIChwLmV2ZW50LnBvaW50ZXJJZCA9PT0gZS5wb2ludGVySWQpIHtcbiAgICAgICAgICBwb2ludGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB1cGRhdGVQb2ludGVyID0gZnVuY3Rpb24gdXBkYXRlUG9pbnRlcihlKSB7XG4gICAgICB2YXIgcCA9IHBvaW50ZXJzLmZpbHRlcihmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkO1xuICAgICAgfSlbMF07XG4gICAgICBwLmV2ZW50ID0gZTtcbiAgICAgIHAudG91Y2ggPSBtYWtlVG91Y2goZSk7XG4gICAgfTtcblxuICAgIHZhciBhZGRUb3VjaGVzVG9FdmVudCA9IGZ1bmN0aW9uIGFkZFRvdWNoZXNUb0V2ZW50KGUpIHtcbiAgICAgIGUudG91Y2hlcyA9IHBvaW50ZXJzLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC50b3VjaDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgcG9pbnRlcklzTW91c2UgPSBmdW5jdGlvbiBwb2ludGVySXNNb3VzZShlKSB7XG4gICAgICByZXR1cm4gZS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBlLnBvaW50ZXJUeXBlID09PSA0O1xuICAgIH07XG5cbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFkZFBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoc3RhcnRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcnVwJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG5cbiAgICAgIHJlbW92ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNoZW5kSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJjYW5jZWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cblxuICAgICAgcmVtb3ZlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hjYW5jZWxIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdXBkYXRlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2htb3ZlSGFuZGxlcihlKTtcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIEJScCRkID0ge307XG5cbkJScCRkLmdlbmVyYXRlUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1tuYW1lXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBvaW50czogcG9pbnRzLFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKCdwb2x5Z29uJywgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5wb2ludHMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcpIHtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkZC5nZW5lcmF0ZUVsbGlwc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2VsbGlwc2UnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnZWxsaXBzZScsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIgKyBwYWRkaW5nLCBoZWlnaHQgLyAyICsgcGFkZGluZyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHJldHVybiBjaGVja0luRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwYWRkaW5nKTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkZC5nZW5lcmF0ZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIChuYW1lLCBwb2ludHMpIHtcbiAgLy8gUHJlLWNvbXB1dGUgY29udHJvbCBwb2ludHNcbiAgLy8gU2luY2UgdGhlc2UgcG9pbnRzIGRlcGVuZCBvbiB0aGUgcmFkaXVzIGxlbmd0aCAod2hpY2ggaW4gdHVybnMgZGVwZW5kIG9uIHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIG5vZGUpIHdlIHdpbGwgb25seSBwcmUtY29tcHV0ZVxuICAvLyB0aGUgdW5pdCB2ZWN0b3JzLlxuICAvLyBGb3Igc2ltcGxpY2l0eSB0aGUgbGF5b3V0IHdpbGwgYmU6XG4gIC8vIFsgcDAsIFVuaXRWZWN0b3JQMFAxLCBwMSwgVW5pVmVjdG9yUDFQMiwgLi4uLCBwbiwgVW5pdFZlY3RvclBuUDAgXVxuICB2YXIgYWxsUG9pbnRzID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICB2YXIgc291cmNlSW5kZXggPSBpICogMjtcbiAgICB2YXIgZGVzdEluZGV4ID0gdm9pZCAwO1xuXG4gICAgaWYgKGkgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIGRlc3RJbmRleCA9IChpICsgMSkgKiAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0SW5kZXggPSAwO1xuICAgIH1cblxuICAgIGFsbFBvaW50c1tpICogNF0gPSBwb2ludHNbc291cmNlSW5kZXhdO1xuICAgIGFsbFBvaW50c1tpICogNCArIDFdID0gcG9pbnRzW3NvdXJjZUluZGV4ICsgMV07XG4gICAgdmFyIHhEZXN0ID0gcG9pbnRzW2Rlc3RJbmRleF0gLSBwb2ludHNbc291cmNlSW5kZXhdO1xuICAgIHZhciB5RGVzdCA9IHBvaW50c1tkZXN0SW5kZXggKyAxXSAtIHBvaW50c1tzb3VyY2VJbmRleCArIDFdO1xuICAgIHZhciBub3JtID0gTWF0aC5zcXJ0KHhEZXN0ICogeERlc3QgKyB5RGVzdCAqIHlEZXN0KTtcbiAgICBhbGxQb2ludHNbaSAqIDQgKyAyXSA9IHhEZXN0IC8gbm9ybTtcbiAgICBhbGxQb2ludHNbaSAqIDQgKyAzXSA9IHlEZXN0IC8gbm9ybTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IGFsbFBvaW50cyxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICByZXR1cm4gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkZC5nZW5lcmF0ZVJvdW5kUmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydyb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1sncm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcpIHtcbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGRpYW0gPSBjb3JuZXJSYWRpdXMgKiAyOyAvLyBDaGVjayBoQm94XG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgdkJveFxuXG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gZGlhbSwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgdG9wIGxlZnQgcXVhcnRlciBjaXJjbGVcblxuXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhlaWdodCAvIDIgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayB0b3AgcmlnaHQgcXVhcnRlciBjaXJjbGVcblxuXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhlaWdodCAvIDIgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcblxuXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuXG5cbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkZC5nZW5lcmF0ZUN1dFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snY3V0LXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydjdXRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnY3V0LXJlY3RhbmdsZScsXG4gICAgY29ybmVyTGVuZ3RoOiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgZ2VuZXJhdGVDdXRUcmlhbmdsZVB0czogZnVuY3Rpb24gZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICB2YXIgY2wgPSB0aGlzLmNvcm5lckxlbmd0aDtcbiAgICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgICB2YXIgaHcgPSB3aWR0aCAvIDI7XG4gICAgICB2YXIgeEJlZ2luID0gY2VudGVyWCAtIGh3O1xuICAgICAgdmFyIHhFbmQgPSBjZW50ZXJYICsgaHc7XG4gICAgICB2YXIgeUJlZ2luID0gY2VudGVyWSAtIGhoO1xuICAgICAgdmFyIHlFbmQgPSBjZW50ZXJZICsgaGg7IC8vIHBvaW50cyBhcmUgaW4gY2xvY2t3aXNlIG9yZGVyLCBpbm5lciAoaW1hZ2luYXJ5KSB0cmlhbmdsZSBwdCBvbiBbNCwgNV1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICB2YXIgY1B0cyA9IHRoaXMuZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCArIDIgKiBwYWRkaW5nLCBoZWlnaHQgKyAyICogcGFkZGluZywgbm9kZVgsIG5vZGVZKTtcbiAgICAgIHZhciBwdHMgPSBbXS5jb25jYXQuYXBwbHkoW10sIFtjUHRzLnRvcExlZnQuc3BsaWNlKDAsIDQpLCBjUHRzLnRvcFJpZ2h0LnNwbGljZSgwLCA0KSwgY1B0cy5ib3R0b21SaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tTGVmdC5zcGxpY2UoMCwgNCldKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogdGhpcy5jb3JuZXJMZW5ndGgsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBDaGVjayB2Qm94XG5cblxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogdGhpcy5jb3JuZXJMZW5ndGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXRUcmlhbmdsZVB0cyA9IHRoaXMuZ2VuZXJhdGVDdXRUcmlhbmdsZVB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMudG9wTGVmdCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcFJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tUmlnaHQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy5ib3R0b21MZWZ0KTtcbiAgICB9XG4gIH07XG59O1xuXG5CUnAkZC5nZW5lcmF0ZUJhcnJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snYmFycmVsJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ2JhcnJlbCcsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICAvLyB1c2UgdHdvIGZpeGVkIHQgdmFsdWVzIGZvciB0aGUgYmV6aWVyIGN1cnZlIGFwcHJveGltYXRpb25cbiAgICAgIHZhciB0MCA9IDAuMTU7XG4gICAgICB2YXIgdDEgPSAwLjU7XG4gICAgICB2YXIgdDIgPSAwLjg1O1xuICAgICAgdmFyIGJQdHMgPSB0aGlzLmdlbmVyYXRlQmFycmVsQmV6aWVyUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVkpO1xuXG4gICAgICB2YXIgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyA9IGZ1bmN0aW9uIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMocHRzKSB7XG4gICAgICAgIC8vIGFwcHJveGltYXRlIGN1cnZlIHB0cyBiYXNlZCBvbiB0aGUgdHdvIHQgdmFsdWVzXG4gICAgICAgIHZhciBtMCA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQwKTtcbiAgICAgICAgdmFyIG0xID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDEpO1xuICAgICAgICB2YXIgbTIgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0Mik7XG4gICAgICAgIHJldHVybiBbcHRzWzBdLCBwdHNbMV0sIG0wLngsIG0wLnksIG0xLngsIG0xLnksIG0yLngsIG0yLnksIHB0c1s0XSwgcHRzWzVdXTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwdHMgPSBbXS5jb25jYXQoYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcExlZnQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMudG9wUmlnaHQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMuYm90dG9tUmlnaHQpLCBhcHByb3hpbWF0ZUJhcnJlbEN1cnZlUHRzKGJQdHMuYm90dG9tTGVmdCkpO1xuICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RMaW5lKHgsIHksIHB0cywgbm9kZVgsIG5vZGVZKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQmFycmVsQmV6aWVyUHRzOiBmdW5jdGlvbiBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyh3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZKSB7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoO1xuICAgICAgdmFyIGN1cnZlQ29uc3RhbnRzID0gZ2V0QmFycmVsQ3VydmVDb25zdGFudHMod2lkdGgsIGhlaWdodCk7XG4gICAgICB2YXIgaE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgICB2YXIgY3RybFB0WE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdpZHRoOyAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgY29udHJvbCBwdCBvbiBbNCwgNV1cblxuICAgICAgdmFyIHB0cyA9IHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgaE9mZnNldCwgeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW5dLFxuICAgICAgICB0b3BSaWdodDogW3hFbmQgLSB3T2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGhPZmZzZXRdLFxuICAgICAgICBib3R0b21SaWdodDogW3hFbmQsIHlFbmQgLSBoT2Zmc2V0LCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCAtIHdPZmZzZXQsIHlFbmRdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgd09mZnNldCwgeUVuZCwgeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUVuZCwgeEJlZ2luLCB5RW5kIC0gaE9mZnNldF1cbiAgICAgIH07XG4gICAgICBwdHMudG9wTGVmdC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMudG9wUmlnaHQuaXNUb3AgPSB0cnVlO1xuICAgICAgcHRzLmJvdHRvbUxlZnQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcHRzLmJvdHRvbVJpZ2h0LmlzQm90dG9tID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwdHM7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0OyAvLyBDaGVjayBoQm94XG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogaE9mZnNldCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIHZCb3hcblxuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIDIgKiB3T2Zmc2V0LCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgYmFycmVsQ3VydmVQdHMgPSB0aGlzLmdlbmVyYXRlQmFycmVsQmV6aWVyUHRzKHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpO1xuXG4gICAgICB2YXIgZ2V0Q3VydmVUID0gZnVuY3Rpb24gZ2V0Q3VydmVUKHgsIHksIGN1cnZlUHRzKSB7XG4gICAgICAgIHZhciB4MCA9IGN1cnZlUHRzWzRdO1xuICAgICAgICB2YXIgeDEgPSBjdXJ2ZVB0c1syXTtcbiAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbMF07XG4gICAgICAgIHZhciB5MCA9IGN1cnZlUHRzWzVdOyAvLyB2YXIgeTEgPSBjdXJ2ZVB0c1sgMyBdO1xuXG4gICAgICAgIHZhciB5MiA9IGN1cnZlUHRzWzFdO1xuICAgICAgICB2YXIgeE1pbiA9IE1hdGgubWluKHgwLCB4Mik7XG4gICAgICAgIHZhciB4TWF4ID0gTWF0aC5tYXgoeDAsIHgyKTtcbiAgICAgICAgdmFyIHlNaW4gPSBNYXRoLm1pbih5MCwgeTIpO1xuICAgICAgICB2YXIgeU1heCA9IE1hdGgubWF4KHkwLCB5Mik7XG5cbiAgICAgICAgaWYgKHhNaW4gPD0geCAmJiB4IDw9IHhNYXggJiYgeU1pbiA8PSB5ICYmIHkgPD0geU1heCkge1xuICAgICAgICAgIHZhciBjb2VmZiA9IGJlemllclB0c1RvUXVhZENvZWZmKHgwLCB4MSwgeDIpO1xuICAgICAgICAgIHZhciByb290cyA9IHNvbHZlUXVhZHJhdGljKGNvZWZmWzBdLCBjb2VmZlsxXSwgY29lZmZbMl0sIHgpO1xuICAgICAgICAgIHZhciB2YWxpZFJvb3RzID0gcm9vdHMuZmlsdGVyKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICByZXR1cm4gMCA8PSByICYmIHIgPD0gMTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh2YWxpZFJvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFJvb3RzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcblxuICAgICAgdmFyIGN1cnZlUmVnaW9ucyA9IE9iamVjdC5rZXlzKGJhcnJlbEN1cnZlUHRzKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJ2ZVJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1tpXTtcbiAgICAgICAgdmFyIGNvcm5lclB0cyA9IGJhcnJlbEN1cnZlUHRzW2Nvcm5lcl07XG4gICAgICAgIHZhciB0ID0gZ2V0Q3VydmVUKHgsIHksIGNvcm5lclB0cyk7XG5cbiAgICAgICAgaWYgKHQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHkwID0gY29ybmVyUHRzWzVdO1xuICAgICAgICB2YXIgeTEgPSBjb3JuZXJQdHNbM107XG4gICAgICAgIHZhciB5MiA9IGNvcm5lclB0c1sxXTtcbiAgICAgICAgdmFyIGJlelkgPSBxYmV6aWVyQXQoeTAsIHkxLCB5MiwgdCk7XG5cbiAgICAgICAgaWYgKGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3JuZXJQdHMuaXNCb3R0b20gJiYgeSA8PSBiZXpZKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5cbkJScCRkLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLm5vZGVTaGFwZUltcGwodGhpcy5uYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSAod2lkdGggLyAyICsgcGFkZGluZyk7XG4gICAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSAoaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG4gICAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcEludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmICh0b3BJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRvcEludGVyc2VjdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGRpYW0gPSAyICogY29ybmVyUmFkaXVzOyAvLyBDaGVjayBoQm94XG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gQ2hlY2sgdkJveFxuXG5cbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gZGlhbSwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gY2hlY2sgbm9uLXJvdW5kZWQgdG9wIHNpZGVcblxuXG4gICAgICB2YXIgb3V0ZXJXaWR0aCA9IHdpZHRoIC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIG91dGVySGVpZ2h0ID0gaGVpZ2h0IC8gMiArIDIgKiBwYWRkaW5nO1xuICAgICAgdmFyIHBvaW50cyA9IFtjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0LCBjZW50ZXJYIC0gb3V0ZXJXaWR0aCwgY2VudGVyWSwgY2VudGVyWCArIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZIC0gb3V0ZXJIZWlnaHRdO1xuXG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuXG5cbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG5cblxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5cbkJScCRkLnJlZ2lzdGVyTm9kZVNoYXBlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGVTaGFwZXMgPSB0aGlzLm5vZGVTaGFwZXMgPSB7fTtcbiAgdmFyIHJlbmRlcmVyID0gdGhpcztcbiAgdGhpcy5nZW5lcmF0ZUVsbGlwc2UoKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3RyaWFuZ2xlJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDMsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtdHJpYW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoMywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncmVjdGFuZ2xlJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApKTtcbiAgbm9kZVNoYXBlc1snc3F1YXJlJ10gPSBub2RlU2hhcGVzWydyZWN0YW5nbGUnXTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUmVjdGFuZ2xlKCk7XG4gIHRoaXMuZ2VuZXJhdGVDdXRSZWN0YW5nbGUoKTtcbiAgdGhpcy5nZW5lcmF0ZUJhcnJlbCgpO1xuICB0aGlzLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUoKTtcbiAge1xuICAgIHZhciBkaWFtb25kUG9pbnRzID0gWzAsIDEsIDEsIDAsIDAsIC0xLCAtMSwgMF07XG4gICAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2RpYW1vbmQnLCBkaWFtb25kUG9pbnRzKTtcbiAgICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1kaWFtb25kJywgZGlhbW9uZFBvaW50cyk7XG4gIH1cbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3BlbnRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDUsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtcGVudGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNSwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignaGV4YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg2LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWhleGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNiwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignaGVwdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1oZXB0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg3LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdvY3RhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDgsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtb2N0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg4LCAwKSk7XG4gIHZhciBzdGFyNVBvaW50cyA9IG5ldyBBcnJheSgyMCk7XG4gIHtcbiAgICB2YXIgb3V0ZXJQb2ludHMgPSBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDUsIDApO1xuICAgIHZhciBpbm5lclBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNSwgTWF0aC5QSSAvIDUpOyAvLyBPdXRlciByYWRpdXMgaXMgMTsgaW5uZXIgcmFkaXVzIG9mIHN0YXIgaXMgc21hbGxlclxuXG4gICAgdmFyIGlubmVyUmFkaXVzID0gMC41ICogKDMgLSBNYXRoLnNxcnQoNSkpO1xuICAgIGlubmVyUmFkaXVzICo9IDEuNTc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlubmVyUG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgaW5uZXJQb2ludHNbaSAqIDJdICo9IGlubmVyUmFkaXVzO1xuICAgICAgaW5uZXJQb2ludHNbaSAqIDIgKyAxXSAqPSBpbm5lclJhZGl1cztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwIC8gNDsgaSsrKSB7XG4gICAgICBzdGFyNVBvaW50c1tpICogNF0gPSBvdXRlclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDFdID0gb3V0ZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMl0gPSBpbm5lclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDNdID0gaW5uZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICB9XG4gIH1cbiAgc3RhcjVQb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUoc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignc3RhcicsIHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3ZlZScsIFstMSwgLTEsIDAsIC0wLjMzMywgMSwgLTEsIDAsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3Job21ib2lkJywgWy0xLCAtMSwgMC4zMzMsIC0xLCAxLCAxLCAtMC4zMzMsIDFdKTtcbiAgdGhpcy5ub2RlU2hhcGVzWydjb25jYXZlaGV4YWdvbiddID0gdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2NvbmNhdmUtaGV4YWdvbicsIFstMSwgLTAuOTUsIC0wLjc1LCAwLCAtMSwgMC45NSwgMSwgMC45NSwgMC43NSwgMCwgMSwgLTAuOTVdKTtcbiAge1xuICAgIHZhciB0YWdQb2ludHMgPSBbLTEsIC0xLCAwLjI1LCAtMSwgMSwgMCwgMC4yNSwgMSwgLTEsIDFdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0YWcnLCB0YWdQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRhZycsIHRhZ1BvaW50cyk7XG4gIH1cblxuICBub2RlU2hhcGVzLm1ha2VQb2x5Z29uID0gZnVuY3Rpb24gKHBvaW50cykge1xuICAgIC8vIHVzZSBjYWNoaW5nIG9uIHVzZXItc3BlY2lmaWVkIHBvbHlnb25zIHNvIHRoZXkgYXJlIGFzIGZhc3QgYXMgbmF0aXZlIHNoYXBlc1xuICAgIHZhciBrZXkgPSBwb2ludHMuam9pbignJCcpO1xuICAgIHZhciBuYW1lID0gJ3BvbHlnb24tJyArIGtleTtcbiAgICB2YXIgc2hhcGU7XG5cbiAgICBpZiAoc2hhcGUgPSB0aGlzW25hbWVdKSB7XG4gICAgICAvLyBnb3QgY2FjaGVkIHNoYXBlXG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfSAvLyBjcmVhdGUgYW5kIGNhY2hlIG5ldyBzaGFwZVxuXG5cbiAgICByZXR1cm4gcmVuZGVyZXIuZ2VuZXJhdGVQb2x5Z29uKG5hbWUsIHBvaW50cyk7XG4gIH07XG59O1xuXG52YXIgQlJwJGUgPSB7fTtcblxuQlJwJGUudGltZVRvUmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWRyYXdUb3RhbFRpbWUgLyB0aGlzLnJlZHJhd0NvdW50O1xufTtcblxuQlJwJGUucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGlmIChyLmF2ZXJhZ2VSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gMDtcbiAgfVxuXG4gIGlmIChyLmxhc3RSZWRyYXdUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByLmxhc3RSZWRyYXdUaW1lID0gMDtcbiAgfVxuXG4gIGlmIChyLmxhc3REcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0RHJhd1RpbWUgPSAwO1xuICB9XG5cbiAgci5yZXF1ZXN0ZWRGcmFtZSA9IHRydWU7XG4gIHIucmVuZGVyT3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuXG5CUnAkZS5iZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoZm4sIHByaW9yaXR5KSB7XG4gIC8vIHRoZSByZW5kZXJlciBjYW4ndCBhZGQgdGljayBjYWxsYmFja3Mgd2hlbiBkZXN0cm95ZWRcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByaW9yaXR5ID09IG51bGwpIHtcbiAgICBlcnJvcignUHJpb3JpdHkgaXMgbm90IG9wdGlvbmFsIGZvciBiZWZvcmVSZW5kZXInKTtcbiAgfVxuXG4gIHZhciBjYnMgPSB0aGlzLmJlZm9yZVJlbmRlckNhbGxiYWNrcztcbiAgY2JzLnB1c2goe1xuICAgIGZuOiBmbixcbiAgICBwcmlvcml0eTogcHJpb3JpdHlcbiAgfSk7IC8vIGhpZ2hlciBwcmlvcml0eSBjYWxsYmFja3MgZXhlY3V0ZWQgZmlyc3RcblxuICBjYnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTtcbiAgfSk7XG59O1xuXG52YXIgYmVmb3JlUmVuZGVyQ2FsbGJhY2tzID0gZnVuY3Rpb24gYmVmb3JlUmVuZGVyQ2FsbGJhY2tzKHIsIHdpbGxEcmF3LCBzdGFydFRpbWUpIHtcbiAgdmFyIGNicyA9IHIuYmVmb3JlUmVuZGVyQ2FsbGJhY2tzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2JzW2ldLmZuKHdpbGxEcmF3LCBzdGFydFRpbWUpO1xuICB9XG59O1xuXG5CUnAkZS5zdGFydFJlbmRlckxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTtcblxuICBpZiAoci5yZW5kZXJMb29wU3RhcnRlZCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIHtcbiAgICByLnJlbmRlckxvb3BTdGFydGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciByZW5kZXJGbiA9IGZ1bmN0aW9uIHJlbmRlckZuKHJlcXVlc3RUaW1lKSB7XG4gICAgaWYgKHIuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN5LmJhdGNoaW5nKCkpIDsgZWxzZSBpZiAoci5yZXF1ZXN0ZWRGcmFtZSAmJiAhci5za2lwRnJhbWUpIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCB0cnVlLCByZXF1ZXN0VGltZSk7XG4gICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgIHIucmVuZGVyKHIucmVuZGVyT3B0aW9ucyk7XG4gICAgICB2YXIgZW5kVGltZSA9IHIubGFzdERyYXdUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICAgICAgaWYgKHIuYXZlcmFnZVJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHIucmVkcmF3Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd0NvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgci5yZWRyYXdDb3VudCsrO1xuXG4gICAgICBpZiAoci5yZWRyYXdUb3RhbFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd1RvdGFsVGltZSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICByLnJlZHJhd1RvdGFsVGltZSArPSBkdXJhdGlvbjtcbiAgICAgIHIubGFzdFJlZHJhd1RpbWUgPSBkdXJhdGlvbjsgLy8gdXNlIGEgd2VpZ2h0ZWQgYXZlcmFnZSB3aXRoIGEgYmlhcyBmcm9tIHRoZSBwcmV2aW91cyBhdmVyYWdlIHNvIHdlIGRvbid0IHNwaWtlIHNvIGVhc2lseVxuXG4gICAgICByLmF2ZXJhZ2VSZWRyYXdUaW1lID0gci5hdmVyYWdlUmVkcmF3VGltZSAvIDIgKyBkdXJhdGlvbiAvIDI7XG4gICAgICByLnJlcXVlc3RlZEZyYW1lID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJlZm9yZVJlbmRlckNhbGxiYWNrcyhyLCBmYWxzZSwgcmVxdWVzdFRpbWUpO1xuICAgIH1cblxuICAgIHIuc2tpcEZyYW1lID0gZmFsc2U7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlbmRlckZuKTtcbiAgfTtcblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyRm4pO1xufTtcblxudmFyIEJhc2VSZW5kZXJlciA9IGZ1bmN0aW9uIEJhc2VSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMuaW5pdChvcHRpb25zKTtcbn07XG5cbnZhciBCUiA9IEJhc2VSZW5kZXJlcjtcbnZhciBCUnAkZiA9IEJSLnByb3RvdHlwZTtcbkJScCRmLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcblxuQlJwJGYuaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciByID0gdGhpcztcbiAgci5vcHRpb25zID0gb3B0aW9ucztcbiAgci5jeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBjdHIgPSByLmNvbnRhaW5lciA9IG9wdGlvbnMuY3kuY29udGFpbmVyKCk7IC8vIHByZXBlbmQgYSBzdHlsZXNoZWV0IGluIHRoZSBoZWFkIHN1Y2ggdGhhdFxuXG4gIGlmICh3aW5kb3ckMSkge1xuICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdyQxLmRvY3VtZW50O1xuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZDtcbiAgICB2YXIgc3R5bGVzaGVldElkID0gJ19fX19fX19fX19jeXRvc2NhcGVfc3R5bGVzaGVldCc7XG4gICAgdmFyIGNsYXNzTmFtZSA9ICdfX19fX19fX19fY3l0b3NjYXBlX2NvbnRhaW5lcic7XG4gICAgdmFyIHN0eWxlc2hlZXRBbHJlYWR5RXhpc3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVzaGVldElkKSAhPSBudWxsO1xuXG4gICAgaWYgKGN0ci5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpIDwgMCkge1xuICAgICAgY3RyLmNsYXNzTmFtZSA9IChjdHIuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAoIXN0eWxlc2hlZXRBbHJlYWR5RXhpc3RzKSB7XG4gICAgICB2YXIgc3R5bGVzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXNoZWV0LmlkID0gc3R5bGVzaGVldElkO1xuICAgICAgc3R5bGVzaGVldC5pbm5lckhUTUwgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG5cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdyQxLmdldENvbXB1dGVkU3R5bGUoY3RyKTtcbiAgICB2YXIgcG9zaXRpb24gPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJyk7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgICB3YXJuKCdBIEN5dG9zY2FwZSBjb250YWluZXIgaGFzIHN0eWxlIHBvc2l0aW9uOnN0YXRpYyBhbmQgc28gY2FuIG5vdCB1c2UgVUkgZXh0ZW5zaW9ucyBwcm9wZXJseScpO1xuICAgIH1cbiAgfVxuXG4gIHIuc2VsZWN0aW9uID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF07IC8vIENvb3JkaW5hdGVzIGZvciBzZWxlY3Rpb24gYm94LCBwbHVzIGVuYWJsZWQgZmxhZ1xuXG4gIHIuYmV6aWVyUHJvalBjdHMgPSBbMC4wNSwgMC4yMjUsIDAuNCwgMC41LCAwLjYsIDAuNzc1LCAwLjk1XTsgLy8tLVBvaW50ZXItcmVsYXRlZCBkYXRhXG5cbiAgci5ob3ZlckRhdGEgPSB7XG4gICAgZG93bjogbnVsbCxcbiAgICBsYXN0OiBudWxsLFxuICAgIGRvd25UaW1lOiBudWxsLFxuICAgIHRyaWdnZXJNb2RlOiBudWxsLFxuICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICBpbml0aWFsUGFuOiBbbnVsbCwgbnVsbF0sXG4gICAgY2FwdHVyZTogZmFsc2VcbiAgfTtcbiAgci5kcmFnRGF0YSA9IHtcbiAgICBwb3NzaWJsZURyYWdFbGVtZW50czogW11cbiAgfTtcbiAgci50b3VjaERhdGEgPSB7XG4gICAgc3RhcnQ6IG51bGwsXG4gICAgY2FwdHVyZTogZmFsc2UsXG4gICAgLy8gVGhlc2UgMyBmaWVsZHMgcmVsYXRlZCB0byB0YXAsIHRhcGhvbGQgZXZlbnRzXG4gICAgc3RhcnRQb3NpdGlvbjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIHNpbmdsZVRvdWNoU3RhcnRUaW1lOiBudWxsLFxuICAgIHNpbmdsZVRvdWNoTW92ZWQ6IHRydWUsXG4gICAgbm93OiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgZWFybGllcjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdXG4gIH07XG4gIHIucmVkcmF3cyA9IDA7XG4gIHIuc2hvd0ZwcyA9IG9wdGlvbnMuc2hvd0ZwcztcbiAgci5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gIHIuaGlkZUVkZ2VzT25WaWV3cG9ydCA9IG9wdGlvbnMuaGlkZUVkZ2VzT25WaWV3cG9ydDtcbiAgci50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gIHIud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgci5tb3Rpb25CbHVyRW5hYmxlZCA9IG9wdGlvbnMubW90aW9uQmx1cjsgLy8gb24gYnkgZGVmYXVsdFxuXG4gIHIuZm9yY2VkUGl4ZWxSYXRpbyA9IG51bWJlcihvcHRpb25zLnBpeGVsUmF0aW8pID8gb3B0aW9ucy5waXhlbFJhdGlvIDogbnVsbDtcbiAgci5tb3Rpb25CbHVyID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBmb3IgaW5pdGlhbCBraWNrIG9mZlxuXG4gIHIubW90aW9uQmx1ck9wYWNpdHkgPSBvcHRpb25zLm1vdGlvbkJsdXJPcGFjaXR5O1xuICByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kgPSAxIC0gci5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIHIubWJQeFJCbHVycnkgPSAxOyAvLzAuODtcblxuICByLm1pbk1iTG93UXVhbEZyYW1lcyA9IDQ7XG4gIHIuZnVsbFF1YWxpdHlNYiA9IGZhbHNlO1xuICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyID0gW107XG4gIHIuZGVza3RvcFRhcFRocmVzaG9sZCA9IG9wdGlvbnMuZGVza3RvcFRhcFRocmVzaG9sZDtcbiAgci5kZXNrdG9wVGFwVGhyZXNob2xkMiA9IG9wdGlvbnMuZGVza3RvcFRhcFRocmVzaG9sZCAqIG9wdGlvbnMuZGVza3RvcFRhcFRocmVzaG9sZDtcbiAgci50b3VjaFRhcFRocmVzaG9sZCA9IG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQ7XG4gIHIudG91Y2hUYXBUaHJlc2hvbGQyID0gb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZCAqIG9wdGlvbnMudG91Y2hUYXBUaHJlc2hvbGQ7XG4gIHIudGFwaG9sZER1cmF0aW9uID0gNTAwO1xuICByLmJpbmRpbmdzID0gW107XG4gIHIuYmVmb3JlUmVuZGVyQ2FsbGJhY2tzID0gW107XG4gIHIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcyA9IHtcbiAgICAvLyBoaWdoZXIgcHJpb3JpdHkgZXhlY3MgYmVmb3JlIGxvd2VyIG9uZVxuICAgIGFuaW1hdGlvbnM6IDQwMCxcbiAgICBlbGVDYWxjczogMzAwLFxuICAgIGVsZVR4ckRlcTogMjAwLFxuICAgIGx5clR4ckRlcTogMTUwLFxuICAgIGx5clR4clNraXA6IDEwMFxuICB9O1xuICByLnJlZ2lzdGVyTm9kZVNoYXBlcygpO1xuICByLnJlZ2lzdGVyQXJyb3dTaGFwZXMoKTtcbiAgci5yZWdpc3RlckNhbGN1bGF0aW9uTGlzdGVuZXJzKCk7XG59O1xuXG5CUnAkZi5ub3RpZnkgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGN5ID0gci5jeTsgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIG5vdGlmaWVkIGFmdGVyIGl0J3MgZGVzdHJveWVkXG5cbiAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2luaXQnKSB7XG4gICAgci5sb2FkKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgci5kZXN0cm95KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2FkZCcgfHwgZXZlbnROYW1lID09PSAncmVtb3ZlJyB8fCBldmVudE5hbWUgPT09ICdtb3ZlJyAmJiBjeS5oYXNDb21wb3VuZE5vZGVzKCkgfHwgZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAnem9yZGVyJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDYWNoZWRaU29ydGVkRWxlcygpO1xuICB9XG5cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gIH1cblxuICBpZiAoZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAncmVzaXplJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgfVxuXG4gIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgdGhpcy5zdGFydFJlbmRlckxvb3AoKTtcbiAgdGhpcy5yZWRyYXcoKTtcbn07XG5cbkJScCRmLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgci5kZXN0cm95ZWQgPSB0cnVlO1xuICByLmN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGJpbmRpbmcgPSByLmJpbmRpbmdzW2ldO1xuICAgIHZhciBiID0gYmluZGluZztcbiAgICB2YXIgdGd0ID0gYi50YXJnZXQ7XG4gICAgKHRndC5vZmYgfHwgdGd0LnJlbW92ZUV2ZW50TGlzdGVuZXIpLmFwcGx5KHRndCwgYi5hcmdzKTtcbiAgfVxuXG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzRm5zID0gW107XG5cbiAgaWYgKHIucmVtb3ZlT2JzZXJ2ZXIpIHtcbiAgICByLnJlbW92ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGlmIChyLnN0eWxlT2JzZXJ2ZXIpIHtcbiAgICByLnN0eWxlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgaWYgKHIucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICByLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGlmIChyLmxhYmVsQ2FsY0Rpdikge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHIubGFiZWxDYWxjRGl2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH0gY2F0Y2ggKGUpIHsvLyBpZTEwIGlzc3VlICMxMDE0XG4gICAgfVxuICB9XG59O1xuXG5CUnAkZi5pc0hlYWRsZXNzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5bQlJwLCBCUnAkYSwgQlJwJGIsIEJScCRjLCBCUnAkZCwgQlJwJGVdLmZvckVhY2goZnVuY3Rpb24gKHByb3BzKSB7XG4gIGV4dGVuZChCUnAkZiwgcHJvcHMpO1xufSk7XG5cbnZhciBmdWxsRnBzVGltZSA9IDEwMDAgLyA2MDsgLy8gYXNzdW1lIDYwIGZyYW1lcyBwZXIgc2Vjb25kXG5cbnZhciBkZWZzID0ge1xuICBzZXR1cERlcXVldWVpbmc6IGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZyhvcHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNldHVwRGVxdWV1ZWluZ0ltcGwoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG5cbiAgICAgIGlmIChzZWxmLmRlcXVldWVpbmdTZXR1cCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmRlcXVldWVpbmdTZXR1cCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBxdWV1ZVJlZHJhdyA9IHV0aWwoZnVuY3Rpb24gKCkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9LCBvcHRzLmRlcVJlZHJhd1RocmVzaG9sZCk7XG5cbiAgICAgIHZhciBkZXF1ZXVlID0gZnVuY3Rpb24gZGVxdWV1ZSh3aWxsRHJhdywgZnJhbWVTdGFydFRpbWUpIHtcbiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgIHZhciBhdmdSZW5kZXJUaW1lID0gci5hdmVyYWdlUmVkcmF3VGltZTtcbiAgICAgICAgdmFyIHJlbmRlclRpbWUgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgICAgICB2YXIgZGVxZCA9IFtdO1xuICAgICAgICB2YXIgZXh0ZW50ID0gci5jeS5leHRlbnQoKTtcbiAgICAgICAgdmFyIHBpeGVsUmF0aW8gPSByLmdldFBpeGVsUmF0aW8oKTsgLy8gaWYgd2UgYXJlbid0IGluIGEgdGljayB0aGF0IGNhdXNlcyBhIGRyYXcsIHRoZW4gdGhlIHJlbmRlcmVkIHN0eWxlXG4gICAgICAgIC8vIHF1ZXVlIHdvbid0IGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZCBiZWZvcmUgZGVxdWV1ZWluZyBzdGFydHNcblxuICAgICAgICBpZiAoIXdpbGxEcmF3KSB7XG4gICAgICAgICAgci5mbHVzaFJlbmRlcmVkU3R5bGVRdWV1ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgICAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5vdyAtIHN0YXJ0VGltZTtcbiAgICAgICAgICB2YXIgZnJhbWVEdXJhdGlvbiA9IG5vdyAtIGZyYW1lU3RhcnRUaW1lO1xuXG4gICAgICAgICAgaWYgKHJlbmRlclRpbWUgPCBmdWxsRnBzVGltZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UncmUgcmVuZGVyaW5nIGZhc3RlciB0aGFuIHRoZSBpZGVhbCBmcHMsIHRoZW4gZG8gZGVxdWV1ZWluZ1xuICAgICAgICAgICAgLy8gZHVyaW5nIGFsbCBvZiB0aGUgcmVtYWluaW5nIGZyYW1lIHRpbWVcbiAgICAgICAgICAgIHZhciB0aW1lQXZhaWxhYmxlID0gZnVsbEZwc1RpbWUgLSAod2lsbERyYXcgPyBhdmdSZW5kZXJUaW1lIDogMCk7XG5cbiAgICAgICAgICAgIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxRmFzdENvc3QgKiB0aW1lQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAod2lsbERyYXcpIHtcbiAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IG9wdHMuZGVxQ29zdCAqIHJlbmRlclRpbWUgfHwgZHVyYXRpb24gPj0gb3B0cy5kZXFBdmdDb3N0ICogYXZnUmVuZGVyVGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lRHVyYXRpb24gPj0gb3B0cy5kZXFOb0RyYXdDb3N0ICogZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHRoaXNEZXFkID0gb3B0cy5kZXEoc2VsZiwgcGl4ZWxSYXRpbywgZXh0ZW50KTtcblxuICAgICAgICAgIGlmICh0aGlzRGVxZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXNEZXFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGRlcWQucHVzaCh0aGlzRGVxZFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBjYWxsYmFja3Mgb24gZGVxdWV1ZVxuXG5cbiAgICAgICAgaWYgKGRlcWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9wdHMub25EZXFkKHNlbGYsIGRlcWQpO1xuXG4gICAgICAgICAgaWYgKCF3aWxsRHJhdyAmJiBvcHRzLnNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBwaXhlbFJhdGlvLCBleHRlbnQpKSB7XG4gICAgICAgICAgICBxdWV1ZVJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIHByaW9yaXR5ID0gb3B0cy5wcmlvcml0eSB8fCBub29wO1xuICAgICAgci5iZWZvcmVSZW5kZXIoZGVxdWV1ZSwgcHJpb3JpdHkoc2VsZikpO1xuICAgIH07XG4gIH1cbn07XG5cbi8vIFVzZXMga2V5cyBzbyBlbGVtZW50cyBtYXkgc2hhcmUgdGhlIHNhbWUgY2FjaGUuXG5cbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChnZXRLZXkpIHtcbiAgICB2YXIgZG9lc0VsZUludmFsaWRhdGVLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNpZnk7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCk7XG5cbiAgICB0aGlzLmlkc0J5S2V5ID0gbmV3IE1hcCQxKCk7XG4gICAgdGhpcy5rZXlGb3JJZCA9IG5ldyBNYXAkMSgpO1xuICAgIHRoaXMuY2FjaGVzQnlMdmwgPSBuZXcgTWFwJDEoKTtcbiAgICB0aGlzLmx2bHMgPSBbXTtcbiAgICB0aGlzLmdldEtleSA9IGdldEtleTtcbiAgICB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5ID0gZG9lc0VsZUludmFsaWRhdGVLZXk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCwgW3tcbiAgICBrZXk6IFwiZ2V0SWRzRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldElkc0ZvcihrZXkpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcihcIkNhbiBub3QgZ2V0IGlkIGxpc3QgZm9yIG51bGwga2V5XCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGlmICghaWRzKSB7XG4gICAgICAgIGlkcyA9IG5ldyBTZXQkMSgpO1xuICAgICAgICBpZHNCeUtleS5zZXQoa2V5LCBpZHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KS5hZGQoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVJZEZvcktleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVJZEZvcktleShrZXksIGlkKSB7XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5nZXRJZHNGb3Ioa2V5KVtcImRlbGV0ZVwiXShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE51bWJlck9mSWRzRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE51bWJlck9mSWRzRm9yS2V5KGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SWRzRm9yKGtleSkuc2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHZhciBjdXJyS2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5hZGRJZEZvcktleShjdXJyS2V5LCBpZCk7XG4gICAgICB0aGlzLmtleUZvcklkLnNldChpZCwgY3VycktleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUtleU1hcHBpbmdGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB0aGlzLmRlbGV0ZUlkRm9yS2V5KHByZXZLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWRbXCJkZWxldGVcIl0oaWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJrZXlIYXNDaGFuZ2VkRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGtleUhhc0NoYW5nZWRGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIG5ld0tleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICByZXR1cm4gcHJldktleSAhPT0gbmV3S2V5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0ludmFsaWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJbnZhbGlkKGVsZSkge1xuICAgICAgcmV0dXJuIHRoaXMua2V5SGFzQ2hhbmdlZEZvcihlbGUpIHx8IHRoaXMuZG9lc0VsZUludmFsaWRhdGVLZXkoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVzQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGVzQXQobHZsKSB7XG4gICAgICB2YXIgY2FjaGVzQnlMdmwgPSB0aGlzLmNhY2hlc0J5THZsLFxuICAgICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG5cbiAgICAgIGlmICghY2FjaGVzKSB7XG4gICAgICAgIGNhY2hlcyA9IG5ldyBNYXAkMSgpO1xuICAgICAgICBjYWNoZXNCeUx2bC5zZXQobHZsLCBjYWNoZXMpO1xuICAgICAgICBsdmxzLnB1c2gobHZsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhY2hlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuZ2V0KGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7IC8vIGdldHRpbmcgZm9yIGFuIGVsZW1lbnQgbWF5IG5lZWQgdG8gYWRkIHRvIHRoZSBpZCBsaXN0IGIvYyBlbGVzIGNhbiBzaGFyZSBrZXlzXG5cbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEZvckNhY2hlZEtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChlbGUuaWQoKSk7IC8vIG4uYi4gdXNlIGNhY2hlZCBrZXksIG5vdCBuZXdseSBjb21wdXRlZCBrZXlcblxuICAgICAgdmFyIGNhY2hlID0gdGhpcy5nZXRDYWNoZShrZXksIGx2bCk7XG4gICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0NhY2hlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0NhY2hlKGtleSwgbHZsKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXNBdChsdmwpLmhhcyhrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiB0aGlzLmhhc0NhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKSB7XG4gICAgICBjYWNoZS5rZXkgPSBrZXk7XG4gICAgICB0aGlzLmdldENhY2hlc0F0KGx2bCkuc2V0KGtleSwgY2FjaGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGVsZSwgbHZsLCBjYWNoZSkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLnNldENhY2hlKGtleSwgbHZsLCBjYWNoZSk7XG4gICAgICB0aGlzLnVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKVtcImRlbGV0ZVwiXShrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB0aGlzLmRlbGV0ZUNhY2hlKGtleSwgbHZsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZUtleVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlS2V5KGtleSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfSAvLyByZXR1cm5zIHRydWUgaWYgbm8gb3RoZXIgZWxlcyByZWZlcmVuY2UgdGhlIGludmFsaWRhdGVkIGNhY2hlIChuLmIuIG90aGVyIGVsZXMgbWF5IG5lZWQgdGhlIGNhY2hlIHdpdGggdGhlIHNhbWUga2V5KVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZhbGlkYXRlKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpOyAvLyBuLmIuIHVzZSBzdG9yZWQga2V5IHJhdGhlciB0aGFuIGN1cnJlbnQgKHBvdGVudGlhbCBrZXkpXG5cbiAgICAgIHRoaXMuZGVsZXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgdmFyIGVudGlyZUtleUludmFsaWRhdGVkID0gdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuXG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRpcmVLZXlJbnZhbGlkYXRlZCB8fCB0aGlzLmdldE51bWJlck9mSWRzRm9yS2V5KGtleSkgPT09IDA7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXA7XG59KCk7XG5cbnZhciBtaW5UeHJIID0gMjU7IC8vIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGNhY2hlIGZvciBzbWFsbCBoZWlnaHQgZWxlcyAoc3BlY2lhbCBjYXNlKVxuXG52YXIgdHhyU3RlcEggPSA1MDsgLy8gdGhlIG1pbiBzaXplIG9mIHRoZSByZWd1bGFyIGNhY2hlLCBhbmQgdGhlIHNpemUgaXQgaW5jcmVhc2VzIHdpdGggZWFjaCBzdGVwIHVwXG5cbnZhciBtaW5MdmwgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG5cbnZhciBtYXhMdmwgPSAzOyAvLyB3aGVuIGxhcmdlciB0aGFuIHRoaXMgc2NhbGUganVzdCByZW5kZXIgZGlyZWN0bHkgKGNhY2hpbmcgaXMgbm90IGhlbHBmdWwpXG5cbnZhciBtYXhab29tID0gNy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcblxudmFyIGVsZVR4clNwYWNpbmcgPSA4OyAvLyBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb24gdGV4dHVyZXMgdG8gYXZvaWQgYmxpdHRpbmcgb3ZlcmxhcHNcblxudmFyIGRlZlR4cldpZHRoID0gMTAyNDsgLy8gZGVmYXVsdC9taW5pbXVtIHRleHR1cmUgd2lkdGhcblxudmFyIG1heFR4clcgPSAxMDI0OyAvLyB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHRleHR1cmVcblxudmFyIG1heFR4ckggPSAxMDI0OyAvLyB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYSB0ZXh0dXJlXG5cbnZhciBtaW5VdGlsaXR5ID0gMC4yOyAvLyBpZiB1c2FnZSBvZiB0ZXh0dXJlIGlzIGxlc3MgdGhhbiB0aGlzLCBpdCBpcyByZXRpcmVkXG5cbnZhciBtYXhGdWxsbmVzcyA9IDAuODsgLy8gZnVsbG5lc3Mgb2YgdGV4dHVyZSBhZnRlciB3aGljaCBxdWV1ZSByZW1vdmFsIGlzIGNoZWNrZWRcblxudmFyIG1heEZ1bGxuZXNzQ2hlY2tzID0gMTA7IC8vIGRlcXVldWVkIGFmdGVyIHRoaXMgbWFueSBjaGVja3NcblxudmFyIGRlcUNvc3QgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcblxudmFyIGRlcUF2Z0Nvc3QgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG5cbnZhciBkZXFOb0RyYXdDb3N0ID0gMC45OyAvLyAlIG9mIGF2ZyBmcmFtZSB0aW1lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlcXVldWVpbmcgd2hlbiBub3QgZHJhd2luZ1xuXG52YXIgZGVxRmFzdENvc3QgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG5cbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQgPSAxMDA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG5cbnZhciBtYXhEZXFTaXplID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcblxudmFyIGdldFR4clJlYXNvbnMgPSB7XG4gIGRlcXVldWU6ICdkZXF1ZXVlJyxcbiAgZG93bnNjYWxlOiAnZG93bnNjYWxlJyxcbiAgaGlnaFF1YWxpdHk6ICdoaWdoUXVhbGl0eSdcbn07XG52YXIgaW5pdERlZmF1bHRzID0gZGVmYXVsdHMoe1xuICBnZXRLZXk6IG51bGwsXG4gIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBmYWxzaWZ5LFxuICBkcmF3RWxlbWVudDogbnVsbCxcbiAgZ2V0Qm91bmRpbmdCb3g6IG51bGwsXG4gIGdldFJvdGF0aW9uUG9pbnQ6IG51bGwsXG4gIGdldFJvdGF0aW9uT2Zmc2V0OiBudWxsLFxuICBpc1Zpc2libGU6IHRydWVpZnksXG4gIGFsbG93RWRnZVR4ckNhY2hpbmc6IHRydWUsXG4gIGFsbG93UGFyZW50VHhyQ2FjaGluZzogdHJ1ZVxufSk7XG5cbnZhciBFbGVtZW50VGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gRWxlbWVudFRleHR1cmVDYWNoZShyZW5kZXJlciwgaW5pdE9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIHNlbGYub25EZXF1ZXVlcyA9IFtdO1xuICB2YXIgb3B0cyA9IGluaXREZWZhdWx0cyhpbml0T3B0aW9ucyk7XG4gIGV4dGVuZChzZWxmLCBvcHRzKTtcbiAgc2VsZi5sb29rdXAgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cChvcHRzLmdldEtleSwgb3B0cy5kb2VzRWxlSW52YWxpZGF0ZUtleSk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xuXG52YXIgRVRDcCA9IEVsZW1lbnRUZXh0dXJlQ2FjaGUucHJvdG90eXBlO1xuRVRDcC5yZWFzb25zID0gZ2V0VHhyUmVhc29uczsgLy8gdGhlIGxpc3Qgb2YgdGV4dHVyZXMgaW4gd2hpY2ggbmV3IHN1YnRleHR1cmVzIGZvciBlbGVtZW50cyBjYW4gYmUgcGxhY2VkXG5cbkVUQ3AuZ2V0VGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVsZUltZ0NhY2hlcyA9IHNlbGYuZWxlSW1nQ2FjaGVzIHx8IHt9O1xuICByZXR1cm4gc2VsZi5lbGVJbWdDYWNoZXNbdHhySF0gPSBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSB8fCBbXTtcbn07IC8vIHRoZSBsaXN0IG9mIHVzdXNlZCB0ZXh0dXJlcyB3aGljaCBjYW4gYmUgcmVjeWNsZWQgKGluIHVzZSBpbiB0ZXh0dXJlIHF1ZXVlKVxuXG5cbkVUQ3AuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSA9IGZ1bmN0aW9uICh0eHJIKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJ0eHRyUXMgPSBzZWxmLmVsZUltZ0NhY2hlcy5yZXRpcmVkID0gc2VsZi5lbGVJbWdDYWNoZXMucmV0aXJlZCB8fCB7fTtcbiAgdmFyIHJ0eHRyUSA9IHJ0eHRyUXNbdHhySF0gPSBydHh0clFzW3R4ckhdIHx8IFtdO1xuICByZXR1cm4gcnR4dHJRO1xufTsgLy8gcXVldWUgb2YgZWxlbWVudCBkcmF3IHJlcXVlc3RzIGF0IGRpZmZlcmVudCBzY2FsZSBsZXZlbHNcblxuXG5FVENwLmdldEVsZW1lbnRRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlQ2FjaGVRdWV1ZSB8fCBuZXcgSGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH0pO1xuICByZXR1cm4gcTtcbn07IC8vIHF1ZXVlIG9mIGVsZW1lbnQgZHJhdyByZXF1ZXN0cyBhdCBkaWZmZXJlbnQgc2NhbGUgbGV2ZWxzIChlbGVtZW50IGlkIGxvb2t1cClcblxuXG5FVENwLmdldEVsZW1lbnRLZXlUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBrMnEgPSBzZWxmLmVsZUtleVRvQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlIHx8IHt9O1xuICByZXR1cm4gazJxO1xufTtcblxuRVRDcC5nZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSwgYmIsIHB4UmF0aW8sIGx2bCwgcmVhc29uKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7XG5cbiAgaWYgKCFiYiB8fCBiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgaXNOYU4oYmIudykgfHwgaXNOYU4oYmIuaCkgfHwgIWVsZS52aXNpYmxlKCkgfHwgZWxlLnJlbW92ZWQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFzZWxmLmFsbG93RWRnZVR4ckNhY2hpbmcgJiYgZWxlLmlzRWRnZSgpIHx8ICFzZWxmLmFsbG93UGFyZW50VHhyQ2FjaGluZyAmJiBlbGUuaXNQYXJlbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcbiAgfVxuXG4gIGlmIChsdmwgPCBtaW5MdmwpIHtcbiAgICBsdmwgPSBtaW5Mdmw7XG4gIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tIHx8IGx2bCA+IG1heEx2bCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIGVsZVNjYWxlZEggPSBiYi5oICogc2NhbGU7XG4gIHZhciBlbGVTY2FsZWRXID0gYmIudyAqIHNjYWxlO1xuICB2YXIgc2NhbGVkTGFiZWxTaG93biA9IHIuZWxlVGV4dEJpZ2dlclRoYW5NaW4oZWxlLCBzY2FsZSk7XG5cbiAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZWxlQ2FjaGUgPSBsb29rdXAuZ2V0KGVsZSwgbHZsKTsgLy8gaWYgdGhpcyBnZXQgd2FzIG9uIGFuIHVudXNlZC9pbnZhbGlkYXRlZCBjYWNoZSwgdGhlbiByZXN0b3JlIHRoZSB0ZXh0dXJlIHVzYWdlIG1ldHJpY1xuXG4gIGlmIChlbGVDYWNoZSAmJiBlbGVDYWNoZS5pbnZhbGlkYXRlZCkge1xuICAgIGVsZUNhY2hlLmludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgZWxlQ2FjaGUudGV4dHVyZS5pbnZhbGlkYXRlZFdpZHRoIC09IGVsZUNhY2hlLndpZHRoO1xuICB9XG5cbiAgaWYgKGVsZUNhY2hlKSB7XG4gICAgcmV0dXJuIGVsZUNhY2hlO1xuICB9XG5cbiAgdmFyIHR4ckg7IC8vIHdoaWNoIHRleHR1cmUgaGVpZ2h0IHRoaXMgZWxlIGJlbG9uZ3MgdG9cblxuICBpZiAoZWxlU2NhbGVkSCA8PSBtaW5UeHJIKSB7XG4gICAgdHhySCA9IG1pblR4ckg7XG4gIH0gZWxzZSBpZiAoZWxlU2NhbGVkSCA8PSB0eHJTdGVwSCkge1xuICAgIHR4ckggPSB0eHJTdGVwSDtcbiAgfSBlbHNlIHtcbiAgICB0eHJIID0gTWF0aC5jZWlsKGVsZVNjYWxlZEggLyB0eHJTdGVwSCkgKiB0eHJTdGVwSDtcbiAgfVxuXG4gIGlmIChlbGVTY2FsZWRIID4gbWF4VHhySCB8fCBlbGVTY2FsZWRXID4gbWF4VHhyVykge1xuICAgIHJldHVybiBudWxsOyAvLyBjYWNoaW5nIGxhcmdlIGVsZW1lbnRzIGlzIG5vdCBlZmZpY2llbnRcbiAgfVxuXG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7IC8vIGZpcnN0IHRyeSB0aGUgc2Vjb25kIGxhc3Qgb25lIGluIGNhc2UgaXQgaGFzIHNwYWNlIGF0IHRoZSBlbmRcblxuICB2YXIgdHhyID0gdHhyUVt0eHJRLmxlbmd0aCAtIDJdO1xuXG4gIHZhciBhZGROZXdUeHIgPSBmdW5jdGlvbiBhZGROZXdUeHIoKSB7XG4gICAgcmV0dXJuIHNlbGYucmVjeWNsZVRleHR1cmUodHhySCwgZWxlU2NhbGVkVykgfHwgc2VsZi5hZGRUZXh0dXJlKHR4ckgsIGVsZVNjYWxlZFcpO1xuICB9OyAvLyB0cnkgdGhlIGxhc3Qgb25lIGlmIHRoZXJlIGlzIG5vIHNlY29uZCBsYXN0IG9uZVxuXG5cbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMV07XG4gIH0gLy8gaWYgdGhlIGxhc3Qgb25lIGRvZXNuJ3QgZXhpc3QsIHdlIG5lZWQgYSBmaXJzdCBvbmVcblxuXG4gIGlmICghdHhyKSB7XG4gICAgdHhyID0gYWRkTmV3VHhyKCk7XG4gIH0gLy8gaWYgdGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHRleHR1cmUsIHdlIG5lZWQgYSBuZXcgb25lXG5cblxuICBpZiAodHhyLndpZHRoIC0gdHhyLnVzZWRXaWR0aCA8IGVsZVNjYWxlZFcpIHtcbiAgICB0eHIgPSBhZGROZXdUeHIoKTtcbiAgfVxuXG4gIHZhciBzY2FsYWJsZUZyb20gPSBmdW5jdGlvbiBzY2FsYWJsZUZyb20ob3RoZXJDYWNoZSkge1xuICAgIHJldHVybiBvdGhlckNhY2hlICYmIG90aGVyQ2FjaGUuc2NhbGVkTGFiZWxTaG93biA9PT0gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcblxuICB2YXIgZGVxaW5nID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kZXF1ZXVlO1xuICB2YXIgaGlnaFF1YWxpdHlSZXEgPSByZWFzb24gJiYgcmVhc29uID09PSBnZXRUeHJSZWFzb25zLmhpZ2hRdWFsaXR5O1xuICB2YXIgZG93bnNjYWxlUmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5kb3duc2NhbGU7XG4gIHZhciBoaWdoZXJDYWNoZTsgLy8gdGhlIG5lYXJlc3QgY2FjaGUgd2l0aCBhIGhpZ2hlciBsZXZlbFxuXG4gIGZvciAodmFyIGwgPSBsdmwgKyAxOyBsIDw9IG1heEx2bDsgbCsrKSB7XG4gICAgdmFyIGMgPSBsb29rdXAuZ2V0KGVsZSwgbCk7XG5cbiAgICBpZiAoYykge1xuICAgICAgaGlnaGVyQ2FjaGUgPSBjO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG9uZVVwQ2FjaGUgPSBoaWdoZXJDYWNoZSAmJiBoaWdoZXJDYWNoZS5sZXZlbCA9PT0gbHZsICsgMSA/IGhpZ2hlckNhY2hlIDogbnVsbDtcblxuICB2YXIgZG93bnNjYWxlID0gZnVuY3Rpb24gZG93bnNjYWxlKCkge1xuICAgIHR4ci5jb250ZXh0LmRyYXdJbWFnZShvbmVVcENhY2hlLnRleHR1cmUuY2FudmFzLCBvbmVVcENhY2hlLngsIDAsIG9uZVVwQ2FjaGUud2lkdGgsIG9uZVVwQ2FjaGUuaGVpZ2h0LCB0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCBlbGVTY2FsZWRIKTtcbiAgfTsgLy8gcmVzZXQgZWxlIGFyZWEgaW4gdGV4dHVyZVxuXG5cbiAgdHhyLmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICB0eHIuY29udGV4dC5jbGVhclJlY3QodHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgdHhySCk7XG5cbiAgaWYgKHNjYWxhYmxlRnJvbShvbmVVcENhY2hlKSkge1xuICAgIC8vIHRoZW4gd2UgY2FuIHJlbGF0aXZlbHkgY2hlYXBseSByZXNjYWxlIHRoZSBleGlzdGluZyBpbWFnZSB3L28gcmVyZW5kZXJpbmdcbiAgICBkb3duc2NhbGUoKTtcbiAgfSBlbHNlIGlmIChzY2FsYWJsZUZyb20oaGlnaGVyQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB1c2UgdGhlIGhpZ2hlciBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgbmV4dCBsZXZlbCBkb3duXG4gICAgLy8gdG8gY2hlYXBseSBzY2FsZSB0b3dhcmRzIHRoZSBzbWFsbGVyIGxldmVsXG4gICAgaWYgKGhpZ2hRdWFsaXR5UmVxKSB7XG4gICAgICBmb3IgKHZhciBfbCA9IGhpZ2hlckNhY2hlLmxldmVsOyBfbCA+IGx2bDsgX2wtLSkge1xuICAgICAgICBvbmVVcENhY2hlID0gc2VsZi5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIF9sLCBnZXRUeHJSZWFzb25zLmRvd25zY2FsZSk7XG4gICAgICB9XG5cbiAgICAgIGRvd25zY2FsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGhpZ2hlckNhY2hlLmxldmVsIC0gMSk7XG4gICAgICByZXR1cm4gaGlnaGVyQ2FjaGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgbG93ZXIgbGV2ZWxcblxuICAgIGlmICghZGVxaW5nICYmICFoaWdoUXVhbGl0eVJlcSAmJiAhZG93bnNjYWxlUmVxKSB7XG4gICAgICBmb3IgKHZhciBfbDIgPSBsdmwgLSAxOyBfbDIgPj0gbWluTHZsOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcblxuICAgICAgICBpZiAoX2MpIHtcbiAgICAgICAgICBsb3dlckNhY2hlID0gX2M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NhbGFibGVGcm9tKGxvd2VyQ2FjaGUpKSB7XG4gICAgICAvLyB0aGVuIHVzZSB0aGUgbG93ZXIgcXVhbGl0eSBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgYmV0dGVyIG9uZSBmb3IgbGF0ZXJcbiAgICAgIHNlbGYucXVldWVFbGVtZW50KGVsZSwgbHZsKTtcbiAgICAgIHJldHVybiBsb3dlckNhY2hlO1xuICAgIH1cblxuICAgIHR4ci5jb250ZXh0LnRyYW5zbGF0ZSh0eHIudXNlZFdpZHRoLCAwKTtcbiAgICB0eHIuY29udGV4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgIHRoaXMuZHJhd0VsZW1lbnQodHhyLmNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIGZhbHNlKTtcbiAgICB0eHIuY29udGV4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKC10eHIudXNlZFdpZHRoLCAwKTtcbiAgfVxuXG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5cbkVUQ3AuaW52YWxpZGF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlRWxlbWVudChlbGVzW2ldKTtcbiAgfVxufTtcblxuRVRDcC5pbnZhbGlkYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbG9va3VwID0gc2VsZi5sb29rdXA7XG4gIHZhciBjYWNoZXMgPSBbXTtcbiAgdmFyIGludmFsaWQgPSBsb29rdXAuaXNJbnZhbGlkKGVsZSk7XG5cbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG5cbiAgZm9yICh2YXIgbHZsID0gbWluTHZsOyBsdmwgPD0gbWF4THZsOyBsdmwrKykge1xuICAgIHZhciBjYWNoZSA9IGxvb2t1cC5nZXRGb3JDYWNoZWRLZXkoZWxlLCBsdmwpO1xuXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZXMucHVzaChjYWNoZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5vT3RoZXJFbGVzVXNlQ2FjaGUgPSBsb29rdXAuaW52YWxpZGF0ZShlbGUpO1xuXG4gIGlmIChub090aGVyRWxlc1VzZUNhY2hlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfY2FjaGUgPSBjYWNoZXNbaV07XG4gICAgICB2YXIgdHhyID0gX2NhY2hlLnRleHR1cmU7IC8vIHJlbW92ZSBzcGFjZSBmcm9tIHRoZSB0ZXh0dXJlIGl0IGJlbG9uZ3MgdG9cblxuICAgICAgdHhyLmludmFsaWRhdGVkV2lkdGggKz0gX2NhY2hlLndpZHRoOyAvLyBtYXJrIHRoZSBjYWNoZSBhcyBpbnZhbGlkYXRlZFxuXG4gICAgICBfY2FjaGUuaW52YWxpZGF0ZWQgPSB0cnVlOyAvLyByZXRpcmUgdGhlIHRleHR1cmUgaWYgaXRzIHV0aWxpdHkgaXMgbG93XG5cbiAgICAgIHNlbGYuY2hlY2tUZXh0dXJlVXRpbGl0eSh0eHIpO1xuICAgIH1cbiAgfSAvLyByZW1vdmUgZnJvbSBxdWV1ZSBzaW5jZSB0aGUgb2xkIHJlcSB3YXMgZm9yIHRoZSBvbGQgc3RhdGVcblxuXG4gIHNlbGYucmVtb3ZlRnJvbVF1ZXVlKGVsZSk7XG59O1xuXG5FVENwLmNoZWNrVGV4dHVyZVV0aWxpdHkgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGludmFsaWRhdGUgYWxsIGVudHJpZXMgaW4gdGhlIGNhY2hlIGlmIHRoZSBjYWNoZSBzaXplIGlzIHNtYWxsXG4gIGlmICh0eHIuaW52YWxpZGF0ZWRXaWR0aCA+PSBtaW5VdGlsaXR5ICogdHhyLndpZHRoKSB7XG4gICAgdGhpcy5yZXRpcmVUZXh0dXJlKHR4cik7XG4gIH1cbn07XG5cbkVUQ3AuY2hlY2tUZXh0dXJlRnVsbG5lc3MgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGlmIHRleHR1cmUgaGFzIGJlZW4gbW9zdGx5IGZpbGxlZCBhbmQgcGFzc2VkIG92ZXIgc2V2ZXJhbCB0aW1lcywgcmVtb3ZlXG4gIC8vIGl0IGZyb20gdGhlIHF1ZXVlIHNvIHdlIGRvbid0IG5lZWQgdG8gd2FzdGUgdGltZSBsb29raW5nIGF0IGl0IHRvIHB1dCBuZXcgdGhpbmdzXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHIuaGVpZ2h0KTtcblxuICBpZiAodHhyLnVzZWRXaWR0aCAvIHR4ci53aWR0aCA+IG1heEZ1bGxuZXNzICYmIHR4ci5mdWxsbmVzc0NoZWNrcyA+PSBtYXhGdWxsbmVzc0NoZWNrcykge1xuICAgIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB9IGVsc2Uge1xuICAgIHR4ci5mdWxsbmVzc0NoZWNrcysrO1xuICB9XG59O1xuXG5FVENwLnJldGlyZVRleHR1cmUgPSBmdW5jdGlvbiAodHhyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4ckggPSB0eHIuaGVpZ2h0O1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgbG9va3VwID0gdGhpcy5sb29rdXA7IC8vIHJldGlyZSB0aGUgdGV4dHVyZSBmcm9tIHRoZSBhY3RpdmUgLyBzZWFyY2hhYmxlIHF1ZXVlOlxuXG4gIHJlbW92ZUZyb21BcnJheSh0eHJRLCB0eHIpO1xuICB0eHIucmV0aXJlZCA9IHRydWU7IC8vIHJlbW92ZSB0aGUgcmVmcyBmcm9tIHRoZSBlbGVzIHRvIHRoZSBjYWNoZXM6XG5cbiAgdmFyIGVsZUNhY2hlcyA9IHR4ci5lbGVDYWNoZXM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVDYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlQ2FjaGUgPSBlbGVDYWNoZXNbaV07XG4gICAgbG9va3VwLmRlbGV0ZUNhY2hlKGVsZUNhY2hlLmtleSwgZWxlQ2FjaGUubGV2ZWwpO1xuICB9XG5cbiAgY2xlYXJBcnJheShlbGVDYWNoZXMpOyAvLyBhZGQgdGhlIHRleHR1cmUgdG8gYSByZXRpcmVkIHF1ZXVlIHNvIGl0IGNhbiBiZSByZWN5Y2xlZCBpbiBmdXR1cmU6XG5cbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgcnR4dHJRLnB1c2godHhyKTtcbn07XG5cbkVUQ3AuYWRkVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHR4ciA9IHt9O1xuICB0eHJRLnB1c2godHhyKTtcbiAgdHhyLmVsZUNhY2hlcyA9IFtdO1xuICB0eHIuaGVpZ2h0ID0gdHhySDtcbiAgdHhyLndpZHRoID0gTWF0aC5tYXgoZGVmVHhyV2lkdGgsIG1pblcpO1xuICB0eHIudXNlZFdpZHRoID0gMDtcbiAgdHhyLmludmFsaWRhdGVkV2lkdGggPSAwO1xuICB0eHIuZnVsbG5lc3NDaGVja3MgPSAwO1xuICB0eHIuY2FudmFzID0gc2VsZi5yZW5kZXJlci5tYWtlT2Zmc2NyZWVuQ2FudmFzKHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gIHR4ci5jb250ZXh0ID0gdHhyLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICByZXR1cm4gdHhyO1xufTtcblxuRVRDcC5yZWN5Y2xlVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJ0eHRyUS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0eHIgPSBydHh0clFbaV07XG5cbiAgICBpZiAodHhyLndpZHRoID49IG1pblcpIHtcbiAgICAgIHR4ci5yZXRpcmVkID0gZmFsc2U7XG4gICAgICB0eHIudXNlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5pbnZhbGlkYXRlZFdpZHRoID0gMDtcbiAgICAgIHR4ci5mdWxsbmVzc0NoZWNrcyA9IDA7XG4gICAgICBjbGVhckFycmF5KHR4ci5lbGVDYWNoZXMpO1xuICAgICAgdHhyLmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgdHhyLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHR4ci53aWR0aCwgdHhyLmhlaWdodCk7XG4gICAgICByZW1vdmVGcm9tQXJyYXkocnR4dHJRLCB0eHIpO1xuICAgICAgdHhyUS5wdXNoKHR4cik7XG4gICAgICByZXR1cm4gdHhyO1xuICAgIH1cbiAgfVxufTtcblxuRVRDcC5xdWV1ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICB2YXIgZXhpc3RpbmdSZXEgPSBrMnFba2V5XTtcblxuICBpZiAoZXhpc3RpbmdSZXEpIHtcbiAgICAvLyB1c2UgdGhlIG1heCBsdmwgYi9jIGluIGJldHdlZW4gbHZscyBhcmUgY2hlYXAgdG8gbWFrZVxuICAgIGV4aXN0aW5nUmVxLmxldmVsID0gTWF0aC5tYXgoZXhpc3RpbmdSZXEubGV2ZWwsIGx2bCk7XG4gICAgZXhpc3RpbmdSZXEuZWxlcy5tZXJnZShlbGUpO1xuICAgIGV4aXN0aW5nUmVxLnJlcXMrKztcbiAgICBxLnVwZGF0ZUl0ZW0oZXhpc3RpbmdSZXEpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXEgPSB7XG4gICAgICBlbGVzOiBlbGUuc3Bhd24oKS5tZXJnZShlbGUpLFxuICAgICAgbGV2ZWw6IGx2bCxcbiAgICAgIHJlcXM6IDEsXG4gICAgICBrZXk6IGtleVxuICAgIH07XG4gICAgcS5wdXNoKHJlcSk7XG4gICAgazJxW2tleV0gPSByZXE7XG4gIH1cbn07XG5cbkVUQ3AuZGVxdWV1ZSA9IGZ1bmN0aW9uIChweFJhdGlvXG4vKiwgZXh0ZW50Ki9cbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBxID0gc2VsZi5nZXRFbGVtZW50UXVldWUoKTtcbiAgdmFyIGsycSA9IHNlbGYuZ2V0RWxlbWVudEtleVRvUXVldWUoKTtcbiAgdmFyIGRlcXVldWVkID0gW107XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1heERlcVNpemU7IGkrKykge1xuICAgIGlmIChxLnNpemUoKSA+IDApIHtcbiAgICAgIHZhciByZXEgPSBxLnBvcCgpO1xuICAgICAgdmFyIGtleSA9IHJlcS5rZXk7XG4gICAgICB2YXIgZWxlID0gcmVxLmVsZXNbMF07IC8vIGFsbCBlbGVzIGhhdmUgdGhlIHNhbWUga2V5XG5cbiAgICAgIHZhciBjYWNoZUV4aXN0cyA9IGxvb2t1cC5oYXNDYWNoZShlbGUsIHJlcS5sZXZlbCk7IC8vIGNsZWFyIG91dCB0aGUga2V5IHRvIHJlcSBsb29rdXBcblxuICAgICAgazJxW2tleV0gPSBudWxsOyAvLyBkZXF1ZXVlaW5nIGlzbid0IG5lY2Vzc2FyeSB3aXRoIGFuIGV4aXN0aW5nIGNhY2hlXG5cbiAgICAgIGlmIChjYWNoZUV4aXN0cykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVxdWV1ZWQucHVzaChyZXEpO1xuICAgICAgdmFyIGJiID0gc2VsZi5nZXRCb3VuZGluZ0JveChlbGUpO1xuICAgICAgc2VsZi5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIHJlcS5sZXZlbCwgZ2V0VHhyUmVhc29ucy5kZXF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlcXVldWVkO1xufTtcblxuRVRDcC5yZW1vdmVGcm9tUXVldWUgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgdmFyIHJlcSA9IGsycVtrZXldO1xuXG4gIGlmIChyZXEgIT0gbnVsbCkge1xuICAgIGlmIChyZXEuZWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIHJlbW92ZSBpZiBsYXN0IGVsZSBpbiB0aGUgcmVxXG4gICAgICAvLyBicmluZyB0byBmcm9udCBvZiBxdWV1ZVxuICAgICAgcmVxLnJlcXMgPSBNQVhfSU5UO1xuICAgICAgcS51cGRhdGVJdGVtKHJlcSk7XG4gICAgICBxLnBvcCgpOyAvLyByZW1vdmUgZnJvbSBxdWV1ZVxuXG4gICAgICBrMnFba2V5XSA9IG51bGw7IC8vIHJlbW92ZSBmcm9tIGxvb2t1cCBtYXBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgcmVtb3ZlIGVsZSBmcm9tIHJlcVxuICAgICAgcmVxLmVsZXMudW5tZXJnZShlbGUpO1xuICAgIH1cbiAgfVxufTtcblxuRVRDcC5vbkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy5vbkRlcXVldWVzLnB1c2goZm4pO1xufTtcblxuRVRDcC5vZmZEZXF1ZXVlID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlbW92ZUZyb21BcnJheSh0aGlzLm9uRGVxdWV1ZXMsIGZuKTtcbn07XG5cbkVUQ3Auc2V0dXBEZXF1ZXVlaW5nID0gZGVmcy5zZXR1cERlcXVldWVpbmcoe1xuICBkZXFSZWRyYXdUaHJlc2hvbGQ6IGRlcVJlZHJhd1RocmVzaG9sZCxcbiAgZGVxQ29zdDogZGVxQ29zdCxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCxcbiAgZGVxTm9EcmF3Q29zdDogZGVxTm9EcmF3Q29zdCxcbiAgZGVxRmFzdENvc3Q6IGRlcUZhc3RDb3N0LFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8sIGV4dGVudCk7XG4gIH0sXG4gIG9uRGVxZDogZnVuY3Rpb24gb25EZXFkKHNlbGYsIGRlcWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub25EZXF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuID0gc2VsZi5vbkRlcXVldWVzW2ldO1xuICAgICAgZm4oZGVxZCk7XG4gICAgfVxuICB9LFxuICBzaG91bGRSZWRyYXc6IGZ1bmN0aW9uIHNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGVzID0gZGVxZFtpXS5lbGVzO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGJiID0gZWxlc1tqXS5ib3VuZGluZ0JveCgpO1xuXG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzSW50ZXJzZWN0KGJiLCBleHRlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5lbGVUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgZGVmTnVtTGF5ZXJzID0gMTsgLy8gZGVmYXVsdCBudW1iZXIgb2YgbGF5ZXJzIHRvIHVzZVxuXG52YXIgbWluTHZsJDEgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG5cbnZhciBtYXhMdmwkMSA9IDI7IC8vIHdoZW4gbGFyZ2VyIHRoYW4gdGhpcyBzY2FsZSBqdXN0IHJlbmRlciBkaXJlY3RseSAoY2FjaGluZyBpcyBub3QgaGVscGZ1bClcblxudmFyIG1heFpvb20kMSA9IDMuOTk7IC8vIGJleW9uZCB0aGlzIHpvb20gbGV2ZWwsIGxheWVyZWQgdGV4dHVyZXMgYXJlIG5vdCB1c2VkXG5cbnZhciBkZXFSZWRyYXdUaHJlc2hvbGQkMSA9IDUwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxuXG52YXIgcmVmaW5lRWxlRGVib3VuY2VUaW1lID0gNTA7IC8vIHRpbWUgdG8gZGVib3VuY2Ugc2hhcnBlciBlbGUgdGV4dHVyZSB1cGRhdGVzXG5cbnZhciBkZXFDb3N0JDEgPSAwLjE1OyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGFsbG93ZWQgZm9yIGRlcXVldWluZyBlbGUgY2FjaGVzIGVhY2ggZnJhbWVcblxudmFyIGRlcUF2Z0Nvc3QkMSA9IDAuMTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBjb21wYXJlZCB0byBhdmVyYWdlIG92ZXJhbGwgcmVkcmF3IHRpbWVcblxudmFyIGRlcU5vRHJhd0Nvc3QkMSA9IDAuOTsgLy8gJSBvZiBhdmcgZnJhbWUgdGltZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZXF1ZXVlaW5nIHdoZW4gbm90IGRyYXdpbmdcblxudmFyIGRlcUZhc3RDb3N0JDEgPSAwLjk7IC8vICUgb2YgZnJhbWUgdGltZSB0byBiZSB1c2VkIHdoZW4gPjYwZnBzXG5cbnZhciBtYXhEZXFTaXplJDEgPSAxOyAvLyBudW1iZXIgb2YgZWxlcyB0byBkZXF1ZXVlIGFuZCByZW5kZXIgYXQgaGlnaGVyIHRleHR1cmUgaW4gZWFjaCBiYXRjaFxuXG52YXIgaW52YWxpZFRocmVzaG9sZCA9IDI1MDsgLy8gdGltZSB0aHJlc2hvbGQgZm9yIGRpc2FibGluZyBiL2Mgb2YgaW52YWxpZGF0aW9uc1xuXG52YXIgbWF4TGF5ZXJBcmVhID0gNDAwMCAqIDQwMDA7IC8vIGxheWVycyBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0aGlzXG5cbnZhciB1c2VIaWdoUXVhbGl0eUVsZVR4clJlcXMgPSB0cnVlOyAvLyB3aGV0aGVyIHRvIHVzZSBoaWdoIHF1YWxpdHkgZWxlIHR4ciByZXF1ZXN0cyAoZ2VuZXJhbGx5IGZhc3RlciBhbmQgY2hlYXBlciBpbiB0aGUgbG9uZ3Rlcm0pXG4vLyB2YXIgbG9nID0gZnVuY3Rpb24oKXsgY29uc29sZS5sb2cuYXBwbHkoIGNvbnNvbGUsIGFyZ3VtZW50cyApOyB9O1xuXG52YXIgTGF5ZXJlZFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIExheWVyZWRUZXh0dXJlQ2FjaGUocmVuZGVyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgc2VsZi5sYXllcnNCeUxldmVsID0ge307IC8vIGUuZy4gMiA9PiBbIGxheWVyMSwgbGF5ZXIyLCAuLi4sIGxheWVyTiBdXG5cbiAgc2VsZi5maXJzdEdldCA9IHRydWU7XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpIC0gMiAqIGludmFsaWRUaHJlc2hvbGQ7XG4gIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgc2VsZi5lbGVUeHJEZXFzID0gY3kuY29sbGVjdGlvbigpO1xuICBzZWxmLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQgPSB1dGlsKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnJlZmluZUVsZW1lbnRUZXh0dXJlcyhzZWxmLmVsZVR4ckRlcXMpO1xuICAgIHNlbGYuZWxlVHhyRGVxcy51bm1lcmdlKHNlbGYuZWxlVHhyRGVxcyk7XG4gIH0sIHJlZmluZUVsZURlYm91bmNlVGltZSk7XG4gIHIuYmVmb3JlUmVuZGVyKGZ1bmN0aW9uICh3aWxsRHJhdywgbm93KSB7XG4gICAgaWYgKG5vdyAtIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPD0gaW52YWxpZFRocmVzaG9sZCkge1xuICAgICAgc2VsZi5za2lwcGluZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJTa2lwKTtcblxuICB2YXIgcVNvcnQgPSBmdW5jdGlvbiBxU29ydChhLCBiKSB7XG4gICAgcmV0dXJuIGIucmVxcyAtIGEucmVxcztcbiAgfTtcblxuICBzZWxmLmxheWVyc1F1ZXVlID0gbmV3IEhlYXAocVNvcnQpO1xuICBzZWxmLnNldHVwRGVxdWV1ZWluZygpO1xufTtcblxudmFyIExUQ3AgPSBMYXllcmVkVGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbnZhciBsYXllcklkUG9vbCA9IDA7XG52YXIgTUFYX0lOVCQxID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuTFRDcC5tYWtlTGF5ZXIgPSBmdW5jdGlvbiAoYmIsIGx2bCkge1xuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgdyA9IE1hdGguY2VpbChiYi53ICogc2NhbGUpO1xuICB2YXIgaCA9IE1hdGguY2VpbChiYi5oICogc2NhbGUpO1xuICB2YXIgY2FudmFzID0gdGhpcy5yZW5kZXJlci5tYWtlT2Zmc2NyZWVuQ2FudmFzKHcsIGgpO1xuICB2YXIgbGF5ZXIgPSB7XG4gICAgaWQ6IGxheWVySWRQb29sID0gKytsYXllcklkUG9vbCAlIE1BWF9JTlQkMSxcbiAgICBiYjogYmIsXG4gICAgbGV2ZWw6IGx2bCxcbiAgICB3aWR0aDogdyxcbiAgICBoZWlnaHQ6IGgsXG4gICAgY2FudmFzOiBjYW52YXMsXG4gICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoJzJkJyksXG4gICAgZWxlczogW10sXG4gICAgZWxlc1F1ZXVlOiBbXSxcbiAgICByZXFzOiAwXG4gIH07IC8vIGxvZygnbWFrZSBsYXllciAlcyB3aXRoIHcgJXMgYW5kIGggJXMgYW5kIGx2bCAlcycsIGxheWVyLmlkLCBsYXllci53aWR0aCwgbGF5ZXIuaGVpZ2h0LCBsYXllci5sZXZlbCk7XG5cbiAgdmFyIGN4dCA9IGxheWVyLmNvbnRleHQ7XG4gIHZhciBkeCA9IC1sYXllci5iYi54MTtcbiAgdmFyIGR5ID0gLWxheWVyLmJiLnkxOyAvLyBkbyB0aGUgdHJhbnNmb3JtIG9uIGNyZWF0aW9uIHRvIHNhdmUgY3ljbGVzIChpdCdzIHRoZSBzYW1lIGZvciBhbGwgZWxlcylcblxuICBjeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgY3h0LnRyYW5zbGF0ZShkeCwgZHkpO1xuICByZXR1cm4gbGF5ZXI7XG59O1xuXG5MVENwLmdldExheWVycyA9IGZ1bmN0aW9uIChlbGVzLCBweFJhdGlvLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXI7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgZmlyc3RHZXQgPSBzZWxmLmZpcnN0R2V0O1xuICBzZWxmLmZpcnN0R2V0ID0gZmFsc2U7IC8vIGxvZygnLS1cXG5nZXQgbGF5ZXJzIHdpdGggJXMgZWxlcycsIGVsZXMubGVuZ3RoKTtcbiAgLy9sb2cgZWxlcy5tYXAoZnVuY3Rpb24oZWxlKXsgcmV0dXJuIGVsZS5pZCgpIH0pICk7XG5cbiAgaWYgKGx2bCA9PSBudWxsKSB7XG4gICAgbHZsID0gTWF0aC5jZWlsKGxvZzIoem9vbSAqIHB4UmF0aW8pKTtcblxuICAgIGlmIChsdmwgPCBtaW5MdmwkMSkge1xuICAgICAgbHZsID0gbWluTHZsJDE7XG4gICAgfSBlbHNlIGlmICh6b29tID49IG1heFpvb20kMSB8fCBsdmwgPiBtYXhMdmwkMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsdmwsIGVsZXMpO1xuICB2YXIgbGF5ZXJzQnlMdmwgPSBzZWxmLmxheWVyc0J5TGV2ZWw7XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciBsYXllcnMgPSBsYXllcnNCeUx2bFtsdmxdID0gbGF5ZXJzQnlMdmxbbHZsXSB8fCBbXTtcbiAgdmFyIGJiO1xuICB2YXIgbHZsQ29tcGxldGUgPSBzZWxmLmxldmVsSXNDb21wbGV0ZShsdmwsIGVsZXMpO1xuICB2YXIgdG1wTGF5ZXJzO1xuXG4gIHZhciBjaGVja1RlbXBMZXZlbHMgPSBmdW5jdGlvbiBjaGVja1RlbXBMZXZlbHMoKSB7XG4gICAgdmFyIGNhblVzZUFzVG1wTHZsID0gZnVuY3Rpb24gY2FuVXNlQXNUbXBMdmwobCkge1xuICAgICAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsLCBlbGVzKTtcblxuICAgICAgaWYgKHNlbGYubGV2ZWxJc0NvbXBsZXRlKGwsIGVsZXMpKSB7XG4gICAgICAgIHRtcExheWVycyA9IGxheWVyc0J5THZsW2xdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGNoZWNrTHZscyA9IGZ1bmN0aW9uIGNoZWNrTHZscyhkaXIpIHtcbiAgICAgIGlmICh0bXBMYXllcnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBsID0gbHZsICsgZGlyOyBtaW5MdmwkMSA8PSBsICYmIGwgPD0gbWF4THZsJDE7IGwgKz0gZGlyKSB7XG4gICAgICAgIGlmIChjYW5Vc2VBc1RtcEx2bChsKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNoZWNrTHZscygrMSk7XG4gICAgY2hlY2tMdmxzKC0xKTsgLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxheWVyczsgdGhleSB3aWxsIGJlIHJlcGxhY2VkIGFzIG5lZWRlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uXG5cbiAgICBmb3IgKHZhciBpID0gbGF5ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGF5ZXIgPSBsYXllcnNbaV07XG5cbiAgICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICAgIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgaWYgKCFsdmxDb21wbGV0ZSkge1xuICAgIC8vIGlmIHRoZSBjdXJyZW50IGxldmVsIGlzIGluY29tcGxldGUsIHRoZW4gdXNlIHRoZSBjbG9zZXN0LCBiZXN0IHF1YWxpdHkgbGF5ZXJzZXQgdGVtcG9yYXJpbHlcbiAgICAvLyBhbmQgbGF0ZXIgcXVldWUgdGhlIGN1cnJlbnQgbGF5ZXJzZXQgc28gd2UgY2FuIGdldCB0aGUgcHJvcGVyIHF1YWxpdHkgbGV2ZWwgc29vblxuICAgIGNoZWNrVGVtcExldmVscygpO1xuICB9IGVsc2Uge1xuICAgIC8vIGxvZygnbGV2ZWwgY29tcGxldGUsIHVzaW5nIGV4aXN0aW5nIGxheWVyc1xcbi0tJyk7XG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxuXG4gIHZhciBnZXRCYiA9IGZ1bmN0aW9uIGdldEJiKCkge1xuICAgIGlmICghYmIpIHtcbiAgICAgIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGVCb3VuZGluZ0JveChiYiwgZWxlc1tpXS5ib3VuZGluZ0JveCgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmI7XG4gIH07XG5cbiAgdmFyIG1ha2VMYXllciA9IGZ1bmN0aW9uIG1ha2VMYXllcihvcHRzKSB7XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgdmFyIGFmdGVyID0gb3B0cy5hZnRlcjtcbiAgICBnZXRCYigpO1xuICAgIHZhciBhcmVhID0gYmIudyAqIHNjYWxlICogKGJiLmggKiBzY2FsZSk7XG5cbiAgICBpZiAoYXJlYSA+IG1heExheWVyQXJlYSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gc2VsZi5tYWtlTGF5ZXIoYmIsIGx2bCk7XG5cbiAgICBpZiAoYWZ0ZXIgIT0gbnVsbCkge1xuICAgICAgdmFyIGluZGV4ID0gbGF5ZXJzLmluZGV4T2YoYWZ0ZXIpICsgMTtcbiAgICAgIGxheWVycy5zcGxpY2UoaW5kZXgsIDAsIGxheWVyKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMuaW5zZXJ0ID09PSB1bmRlZmluZWQgfHwgb3B0cy5pbnNlcnQpIHtcbiAgICAgIC8vIG5vIGFmdGVyIHNwZWNpZmllZCA9PiBmaXJzdCBsYXllciBtYWRlIHNvIHB1dCBhdCBzdGFydFxuICAgICAgbGF5ZXJzLnVuc2hpZnQobGF5ZXIpO1xuICAgIH0gLy8gaWYoIHRtcExheWVycyApe1xuICAgIC8vc2VsZi5xdWV1ZUxheWVyKCBsYXllciApO1xuICAgIC8vIH1cblxuXG4gICAgcmV0dXJuIGxheWVyO1xuICB9O1xuXG4gIGlmIChzZWxmLnNraXBwaW5nICYmICFmaXJzdEdldCkge1xuICAgIC8vIGxvZygnc2tpcCBsYXllcnMnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBsb2coJ2RvIGxheWVycycpO1xuXG5cbiAgdmFyIGxheWVyID0gbnVsbDtcbiAgdmFyIG1heEVsZXNQZXJMYXllciA9IGVsZXMubGVuZ3RoIC8gZGVmTnVtTGF5ZXJzO1xuICB2YXIgYWxsb3dMYXp5UXVldWVpbmcgPSAgIWZpcnN0R2V0O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgY2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgPSBycy5pbWdMYXllckNhY2hlcyB8fCB7fTsgLy8gbG9nKCdsb29rIGF0IGVsZScsIGVsZS5pZCgpKTtcblxuICAgIHZhciBleGlzdGluZ0xheWVyID0gY2FjaGVzW2x2bF07XG5cbiAgICBpZiAoZXhpc3RpbmdMYXllcikge1xuICAgICAgLy8gcmV1c2UgbGF5ZXIgZm9yIGxhdGVyIGVsZXNcbiAgICAgIC8vIGxvZygncmV1c2UgbGF5ZXIgZm9yJywgZWxlLmlkKCkpO1xuICAgICAgbGF5ZXIgPSBleGlzdGluZ0xheWVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFsYXllciB8fCBsYXllci5lbGVzLmxlbmd0aCA+PSBtYXhFbGVzUGVyTGF5ZXIgfHwgIWJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChsYXllci5iYiwgZWxlLmJvdW5kaW5nQm94KCkpKSB7XG4gICAgICAvLyBsb2coJ21ha2UgbmV3IGxheWVyIGZvciBlbGUgJXMnLCBlbGUuaWQoKSk7XG4gICAgICBsYXllciA9IG1ha2VMYXllcih7XG4gICAgICAgIGluc2VydDogdHJ1ZSxcbiAgICAgICAgYWZ0ZXI6IGxheWVyXG4gICAgICB9KTsgLy8gaWYgbm93IGxheWVyIGNhbiBiZSBidWlsdCB0aGVuIHdlIGNhbid0IHVzZSBsYXllcnMgYXQgdGhpcyBsZXZlbFxuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSAvLyBsb2coJ25ldyBsYXllciB3aXRoIGlkICVzJywgbGF5ZXIuaWQpO1xuXG4gICAgfVxuXG4gICAgaWYgKHRtcExheWVycyB8fCBhbGxvd0xhenlRdWV1ZWluZykge1xuICAgICAgLy8gbG9nKCdxdWV1ZSBlbGUgJXMgaW4gbGF5ZXIgJXMnLCBlbGUuaWQoKSwgbGF5ZXIuaWQpO1xuICAgICAgc2VsZi5xdWV1ZUxheWVyKGxheWVyLCBlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBsb2coJ2RyYXcgZWxlICVzIGluIGxheWVyICVzJywgZWxlLmlkKCksIGxheWVyLmlkKTtcbiAgICAgIHNlbGYuZHJhd0VsZUluTGF5ZXIobGF5ZXIsIGVsZSwgbHZsLCBweFJhdGlvKTtcbiAgICB9XG5cbiAgICBsYXllci5lbGVzLnB1c2goZWxlKTtcbiAgICBjYWNoZXNbbHZsXSA9IGxheWVyO1xuICB9IC8vIGxvZygnLS0nKTtcblxuXG4gIGlmICh0bXBMYXllcnMpIHtcbiAgICAvLyB0aGVuIHdlIG9ubHkgcXVldWVkIHRoZSBjdXJyZW50IGxheWVyc2V0IGFuZCBjYW4ndCBkcmF3IGl0IHlldFxuICAgIHJldHVybiB0bXBMYXllcnM7XG4gIH1cblxuICBpZiAoYWxsb3dMYXp5UXVldWVpbmcpIHtcbiAgICAvLyBsb2coJ2xhenkgcXVldWUgbGV2ZWwnLCBsdmwpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxheWVycztcbn07IC8vIGEgbGF5ZXIgbWF5IHdhbnQgdG8gdXNlIGFuIGVsZSBjYWNoZSBvZiBhIGhpZ2hlciBsZXZlbCB0byBhdm9pZCBibHVycmluZXNzXG4vLyBzbyB0aGUgbGF5ZXIgbGV2ZWwgbWlnaHQgbm90IGVxdWFsIHRoZSBlbGUgbGV2ZWxcblxuXG5MVENwLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbCA9IGZ1bmN0aW9uIChsdmwsIHB4UmF0aW8pIHtcbiAgcmV0dXJuIGx2bDtcbn07XG5cbkxUQ3AuZHJhd0VsZUluTGF5ZXIgPSBmdW5jdGlvbiAobGF5ZXIsIGVsZSwgbHZsLCBweFJhdGlvKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICB2YXIgY29udGV4dCA9IGxheWVyLmNvbnRleHQ7XG4gIHZhciBiYiA9IGVsZS5ib3VuZGluZ0JveCgpO1xuXG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsdmwgPSBzZWxmLmdldEVsZUxldmVsRm9yTGF5ZXJMZXZlbChsdmwsIHB4UmF0aW8pO1xuXG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIG51bGwsIG51bGwsIGx2bCwgdXNlSGlnaFF1YWxpdHlFbGVUeHJSZXFzKTtcbiAgfVxuXG4gIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCB0cnVlKTtcbiAgfVxufTtcblxuTFRDcC5sZXZlbElzQ29tcGxldGUgPSBmdW5jdGlvbiAobHZsLCBlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxheWVycyA9IHNlbGYubGF5ZXJzQnlMZXZlbFtsdmxdO1xuXG4gIGlmICghbGF5ZXJzIHx8IGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbnVtRWxlc0luTGF5ZXJzID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsYXllciA9IGxheWVyc1tpXTsgLy8gaWYgdGhlcmUgYXJlIGFueSBlbGVzIG5lZWRlZCB0byBiZSBkcmF3biB5ZXQsIHRoZSBsZXZlbCBpcyBub3QgY29tcGxldGVcblxuICAgIGlmIChsYXllci5yZXFzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaWYgdGhlIGxheWVyIGlzIGludmFsaWQsIHRoZSBsZXZlbCBpcyBub3QgY29tcGxldGVcblxuXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBudW1FbGVzSW5MYXllcnMgKz0gbGF5ZXIuZWxlcy5sZW5ndGg7XG4gIH0gLy8gd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZXMgcGFzc2VkIGluIHRvIGJlIGNvbXBsZXRlXG5cblxuICBpZiAobnVtRWxlc0luTGF5ZXJzICE9PSBlbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuTFRDcC52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyA9IGZ1bmN0aW9uIChsdmwsIGVsZXMpIHtcbiAgdmFyIGxheWVycyA9IHRoaXMubGF5ZXJzQnlMZXZlbFtsdmxdO1xuXG4gIGlmICghbGF5ZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGlmIGluIGEgbGF5ZXIgdGhlIGVsZXMgYXJlIG5vdCBpbiB0aGUgc2FtZSBvcmRlciwgdGhlbiB0aGUgbGF5ZXIgaXMgaW52YWxpZFxuICAvLyAoaS5lLiB0aGVyZSBpcyBhbiBlbGUgaW4gYmV0d2VlbiB0aGUgZWxlcyBpbiB0aGUgbGF5ZXIpXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICB2YXIgb2Zmc2V0ID0gLTE7IC8vIGZpbmQgdGhlIG9mZnNldFxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAobGF5ZXIuZWxlc1swXSA9PT0gZWxlc1tqXSkge1xuICAgICAgICBvZmZzZXQgPSBqO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgLy8gdGhlbiB0aGUgbGF5ZXIgaGFzIG5vbmV4aXN0YW50IGVsZW1lbnRzIGFuZCBpcyBpbnZhbGlkXG4gICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHRoZSBlbGVzIGluIHRoZSBsYXllciBtdXN0IGJlIGluIHRoZSBzYW1lIGNvbnRpbnVvdXMgb3JkZXIsIGVsc2UgdGhlIGxheWVyIGlzIGludmFsaWRcblxuXG4gICAgdmFyIG8gPSBvZmZzZXQ7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxheWVyLmVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChsYXllci5lbGVzW2pdICE9PSBlbGVzW28gKyBqXSkge1xuICAgICAgICAvLyBsb2coJ2ludmFsaWRhdGUgYmFzZWQgb24gb3JkZXJpbmcnLCBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MVENwLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMgPSBmdW5jdGlvbiAoZWxlcywgdXBkYXRlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGlzRWxlcyA9IGVsZW1lbnQoZWxlc1swXSk7IC8vIGNvbGxlY3QgdWRwYXRlZCBlbGVtZW50cyAoY2FzY2FkZWQgZnJvbSB0aGUgbGF5ZXJzKSBhbmQgdXBkYXRlIGVhY2hcbiAgLy8gbGF5ZXIgaXRzZWxmIGFsb25nIHRoZSB3YXlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVxID0gaXNFbGVzID8gbnVsbCA6IGVsZXNbaV07XG4gICAgdmFyIGVsZSA9IGlzRWxlcyA/IGVsZXNbaV0gOiBlbGVzW2ldLmVsZTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307XG5cbiAgICBmb3IgKHZhciBsID0gbWluTHZsJDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgICAgdmFyIGxheWVyID0gY2FjaGVzW2xdO1xuXG4gICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBpZiB1cGRhdGUgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGVsZSBjYWNoZSwgdGhlbiBpdCBhZmZlY3RzIG9ubHlcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBsZXZlbFxuXG5cbiAgICAgIGlmIChyZXEgJiYgc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobGF5ZXIubGV2ZWwpICE9PSByZXEubGV2ZWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZShsYXllciwgZWxlLCByZXEpO1xuICAgIH1cbiAgfVxufTtcblxuTFRDcC5oYXZlTGF5ZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBoYXZlTGF5ZXJzID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgbCA9IG1pbkx2bCQxOyBsIDw9IG1heEx2bCQxOyBsKyspIHtcbiAgICB2YXIgbGF5ZXJzID0gc2VsZi5sYXllcnNCeUxldmVsW2xdO1xuXG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgaGF2ZUxheWVycyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGF2ZUxheWVycztcbn07XG5cbkxUQ3AuaW52YWxpZGF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChlbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpOyAvLyBsb2coJ3VwZGF0ZSBpbnZhbGlkYXRlIGxheWVyIHRpbWUgZnJvbSBlbGVzJyk7XG5cbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwIHx8ICFzZWxmLmhhdmVMYXllcnMoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGYudXBkYXRlRWxlbWVudHNJbkxheWVycyhlbGVzLCBmdW5jdGlvbiBpbnZhbEFzc29jTGF5ZXJzKGxheWVyLCBlbGUsIHJlcSkge1xuICAgIHNlbGYuaW52YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgfSk7XG59O1xuXG5MVENwLmludmFsaWRhdGVMYXllciA9IGZ1bmN0aW9uIChsYXllcikge1xuICAvLyBsb2coJ3VwZGF0ZSBpbnZhbGlkYXRlIGxheWVyIHRpbWUnKTtcbiAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG5cbiAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gc2F2ZSBjeWNsZXNcblxuXG4gIHZhciBsdmwgPSBsYXllci5sZXZlbDtcbiAgdmFyIGVsZXMgPSBsYXllci5lbGVzO1xuICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnNCeUxldmVsW2x2bF07IC8vIGxvZygnaW52YWxpZGF0ZSBsYXllcicsIGxheWVyLmlkICk7XG5cbiAgcmVtb3ZlRnJvbUFycmF5KGxheWVycywgbGF5ZXIpOyAvLyBsYXllci5lbGVzID0gW107XG5cbiAgbGF5ZXIuZWxlc1F1ZXVlID0gW107XG4gIGxheWVyLmludmFsaWQgPSB0cnVlO1xuXG4gIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgIGxheWVyLnJlcGxhY2VtZW50LmludmFsaWQgPSB0cnVlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNhY2hlcyA9IGVsZXNbaV0uX3ByaXZhdGUucnNjcmF0Y2guaW1nTGF5ZXJDYWNoZXM7XG5cbiAgICBpZiAoY2FjaGVzKSB7XG4gICAgICBjYWNoZXNbbHZsXSA9IG51bGw7XG4gICAgfVxuICB9XG59O1xuXG5MVENwLnJlZmluZUVsZW1lbnRUZXh0dXJlcyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpczsgLy8gbG9nKCdyZWZpbmUnLCBlbGVzLmxlbmd0aCk7XG5cbiAgc2VsZi51cGRhdGVFbGVtZW50c0luTGF5ZXJzKGVsZXMsIGZ1bmN0aW9uIHJlZmluZUVhY2hFbGUobGF5ZXIsIGVsZSwgcmVxKSB7XG4gICAgdmFyIHJMeXIgPSBsYXllci5yZXBsYWNlbWVudDtcblxuICAgIGlmICghckx5cikge1xuICAgICAgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50ID0gc2VsZi5tYWtlTGF5ZXIobGF5ZXIuYmIsIGxheWVyLmxldmVsKTtcbiAgICAgIHJMeXIucmVwbGFjZXMgPSBsYXllcjtcbiAgICAgIHJMeXIuZWxlcyA9IGxheWVyLmVsZXM7IC8vIGxvZygnbWFrZSByZXBsYWNlbWVudCBsYXllciAlcyBmb3IgJXMgd2l0aCBsZXZlbCAlcycsIHJMeXIuaWQsIGxheWVyLmlkLCByTHlyLmxldmVsKTtcbiAgICB9XG5cbiAgICBpZiAoIXJMeXIucmVxcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByTHlyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5xdWV1ZUxheWVyKHJMeXIsIHJMeXIuZWxlc1tpXSk7XG4gICAgICB9IC8vIGxvZygncXVldWUgcmVwbGFjZW1lbnQgbGF5ZXIgcmVmaW5lbWVudCcsIHJMeXIuaWQpO1xuXG4gICAgfVxuICB9KTtcbn07XG5cbkxUQ3AuZW5xdWV1ZUVsZW1lbnRSZWZpbmVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuXG4gIHRoaXMuZWxlVHhyRGVxcy5tZXJnZShlbGUpO1xuICB0aGlzLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQoKTtcbn07XG5cbkxUQ3AucXVldWVMYXllciA9IGZ1bmN0aW9uIChsYXllciwgZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmxheWVyc1F1ZXVlO1xuICB2YXIgZWxlc1EgPSBsYXllci5lbGVzUXVldWU7XG4gIHZhciBoYXNJZCA9IGVsZXNRLmhhc0lkID0gZWxlc1EuaGFzSWQgfHwge307IC8vIGlmIGEgbGF5ZXIgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQsIHF1ZXVpbmcgaXMgYSB3YXN0ZSBvZiB0aW1lXG5cbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGVsZSkge1xuICAgIGlmIChoYXNJZFtlbGUuaWQoKV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVzUS5wdXNoKGVsZSk7XG4gICAgaGFzSWRbZWxlLmlkKCldID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChsYXllci5yZXFzKSB7XG4gICAgbGF5ZXIucmVxcysrO1xuICAgIHEudXBkYXRlSXRlbShsYXllcik7XG4gIH0gZWxzZSB7XG4gICAgbGF5ZXIucmVxcyA9IDE7XG4gICAgcS5wdXNoKGxheWVyKTtcbiAgfVxufTtcblxuTFRDcC5kZXF1ZXVlID0gZnVuY3Rpb24gKHB4UmF0aW8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYubGF5ZXJzUXVldWU7XG4gIHZhciBkZXFkID0gW107XG4gIHZhciBlbGVEZXFzID0gMDtcblxuICB3aGlsZSAoZWxlRGVxcyA8IG1heERlcVNpemUkMSkge1xuICAgIGlmIChxLnNpemUoKSA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gcS5wZWVrKCk7IC8vIGlmIGEgbGF5ZXIgaGFzIGJlZW4gb3Igd2lsbCBiZSByZXBsYWNlZCwgdGhlbiBkb24ndCB3YXN0ZSB0aW1lIHdpdGggaXRcblxuICAgIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciAlcyBpbiBxdWV1ZSBza2lwcGVkIGIvYyBpdCBhbHJlYWR5IGhhcyBhIHJlcGxhY2VtZW50JywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gaWYgdGhpcyBpcyBhIHJlcGxhY2VtZW50IGxheWVyIHRoYXQgaGFzIGJlZW4gc3VwZXJjZWRlZCwgdGhlbiBmb3JnZXQgaXRcblxuXG4gICAgaWYgKGxheWVyLnJlcGxhY2VzICYmIGxheWVyICE9PSBsYXllci5yZXBsYWNlcy5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciBpcyBubyBsb25nZXIgdGhlIG1vc3QgdXB0b2RhdGUgcmVwbGFjZW1lbnQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpXG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyLmludmFsaWQpIHtcbiAgICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgJXMgaXMgaW52YWxpZDsgZGVxdWV1ZWQnLCBsYXllci5pZCk7XG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGVsZSA9IGxheWVyLmVsZXNRdWV1ZS5zaGlmdCgpO1xuXG4gICAgaWYgKGVsZSkge1xuICAgICAgLy8gbG9nKCdkZXF1ZXVlIGxheWVyICVzJywgbGF5ZXIuaWQpO1xuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsYXllci5sZXZlbCwgcHhSYXRpbyk7XG4gICAgICBlbGVEZXFzKys7XG4gICAgfVxuXG4gICAgaWYgKGRlcWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBuZWVkIG9ubHkgb25lIGVudHJ5IGluIGRlcWQgdG8gcXVldWUgcmVkcmF3aW5nIGV0Y1xuICAgICAgZGVxZC5wdXNoKHRydWUpO1xuICAgIH0gLy8gaWYgdGhlIGxheWVyIGhhcyBhbGwgaXRzIGVsZXMgZG9uZSwgdGhlbiByZW1vdmUgZnJvbSB0aGUgcXVldWVcblxuXG4gICAgaWYgKGxheWVyLmVsZXNRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHEucG9wKCk7XG4gICAgICBsYXllci5yZXFzID0gMDsgLy8gbG9nKCdkZXF1ZXVlIG9mIGxheWVyICVzIGNvbXBsZXRlJywgbGF5ZXIuaWQpO1xuICAgICAgLy8gd2hlbiBhIHJlcGxhY2VtZW50IGxheWVyIGlzIGRlcXVldWVkLCBpdCByZXBsYWNlcyB0aGUgb2xkIGxheWVyIGluIHRoZSBsZXZlbFxuXG4gICAgICBpZiAobGF5ZXIucmVwbGFjZXMpIHtcbiAgICAgICAgc2VsZi5hcHBseUxheWVyUmVwbGFjZW1lbnQobGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVxZDtcbn07XG5cbkxUQ3AuYXBwbHlMYXllclJlcGxhY2VtZW50ID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxheWVyc0luTGV2ZWwgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbGF5ZXIubGV2ZWxdO1xuICB2YXIgcmVwbGFjZWQgPSBsYXllci5yZXBsYWNlcztcbiAgdmFyIGluZGV4ID0gbGF5ZXJzSW5MZXZlbC5pbmRleE9mKHJlcGxhY2VkKTsgLy8gaWYgdGhlIHJlcGxhY2VkIGxheWVyIGlzIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QgZm9yIHRoZSBsZXZlbCwgdGhlbiByZXBsYWNpbmdcbiAgLy8gcmVmcyB3b3VsZCBiZSBhIG1pc3Rha2UgKGkuZS4gb3ZlcndyaXRpbmcgdGhlIHRydWUgYWN0aXZlIGxheWVyKVxuXG4gIGlmIChpbmRleCA8IDAgfHwgcmVwbGFjZWQuaW52YWxpZCkge1xuICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgd291bGQgaGF2ZSBubyBlZmZlY3QnLCBsYXllci5pZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGF5ZXJzSW5MZXZlbFtpbmRleF0gPSBsYXllcjsgLy8gcmVwbGFjZSBsZXZlbCByZWZcbiAgLy8gcmVwbGFjZSByZWZzIGluIGVsZXNcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSBsYXllci5lbGVzW2ldLl9wcml2YXRlO1xuICAgIHZhciBjYWNoZSA9IF9wLmltZ0xheWVyQ2FjaGVzID0gX3AuaW1nTGF5ZXJDYWNoZXMgfHwge307XG5cbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2xheWVyLmxldmVsXSA9IGxheWVyO1xuICAgIH1cbiAgfSAvLyBsb2coJ2FwcGx5IHJlcGxhY2VtZW50IGxheWVyICVzIG92ZXIgJXMnLCBsYXllci5pZCwgcmVwbGFjZWQuaWQpO1xuXG5cbiAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG59O1xuXG5MVENwLnJlcXVlc3RSZWRyYXcgPSB1dGlsKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gIHIucmVkcmF3KCk7XG59LCAxMDApO1xuTFRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkJDEsXG4gIGRlcUNvc3Q6IGRlcUNvc3QkMSxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCQxLFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0JDEsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCQxLFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvKSB7XG4gICAgcmV0dXJuIHNlbGYuZGVxdWV1ZShweFJhdGlvKTtcbiAgfSxcbiAgb25EZXFkOiBub29wLFxuICBzaG91bGRSZWRyYXc6IHRydWVpZnksXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgQ1JwID0ge307XG52YXIgaW1wbDtcblxuZnVuY3Rpb24gcG9seWdvbihjb250ZXh0LCBwb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJpYW5nbGVCYWNrY3VydmUoY29udGV4dCwgcG9pbnRzLCBjb250cm9sUG9pbnQpIHtcbiAgdmFyIGZpcnN0UHQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgZmlyc3RQdCA9IHB0O1xuICAgIH1cblxuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG5cbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZmlyc3RQdC54LCBmaXJzdFB0LnkpO1xufVxuXG5mdW5jdGlvbiB0cmlhbmdsZVRlZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgdGVlUG9pbnRzKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICB2YXIgdHJpUHRzID0gdHJpYW5nbGVQb2ludHM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0cmlQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cblxuICB2YXIgdGVlUHRzID0gdGVlUG9pbnRzO1xuICB2YXIgZmlyc3RUZWVQdCA9IHRlZVBvaW50c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUZWVQdC54LCBmaXJzdFRlZVB0LnkpO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgdGVlUHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gdGVlUHRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaXJjbGVUcmlhbmdsZShjb250ZXh0LCB0cmlhbmdsZVBvaW50cywgcngsIHJ5LCByKSB7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gIHZhciB0cmlQdHMgPSB0cmlhbmdsZVBvaW50cztcbiAgdmFyIGZpcnN0VHJQdCA9IHRyaVB0c1swXTtcbiAgY29udGV4dC5tb3ZlVG8oZmlyc3RUclB0LngsIGZpcnN0VHJQdC55KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2lyY2xlKGNvbnRleHQsIHJ4LCByeSwgcikge1xuICBjb250ZXh0LmFyYyhyeCwgcnksIHIsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG59XG5cbkNScC5hcnJvd1NoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiAoaW1wbCB8fCAoaW1wbCA9IHtcbiAgICAncG9seWdvbic6IHBvbHlnb24sXG4gICAgJ3RyaWFuZ2xlLWJhY2tjdXJ2ZSc6IHRyaWFuZ2xlQmFja2N1cnZlLFxuICAgICd0cmlhbmdsZS10ZWUnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlLXRyaWFuZ2xlJzogY2lyY2xlVHJpYW5nbGUsXG4gICAgJ3RyaWFuZ2xlLWNyb3NzJzogdHJpYW5nbGVUZWUsXG4gICAgJ2NpcmNsZSc6IGNpcmNsZVxuICB9KSlbbmFtZV07XG59O1xuXG52YXIgQ1JwJDEgPSB7fTtcblxuQ1JwJDEuZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG5cbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGUoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZShjb250ZXh0LCBlbGUsIHNoaWZ0VG9PcmlnaW5XaXRoQmIsIHNob3dMYWJlbCwgc2hvd092ZXJsYXksIHNob3dPcGFjaXR5KTtcbiAgfVxufTtcblxuQ1JwJDEuZHJhd0VsZW1lbnRPdmVybGF5ID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgciA9IHRoaXM7XG5cbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcblxuQ1JwJDEuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRSb3RhdGlvbiwgZ2V0T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBiYiA9IGVsZVR4ckNhY2hlLmdldEJvdW5kaW5nQm94KGVsZSk7XG5cbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBpZ25vcmUgemVybyBzaXplIGNhc2VcblxuXG4gIHZhciBlbGVDYWNoZSA9IGVsZVR4ckNhY2hlLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgbHZsLCByZWFzb24pO1xuXG4gIGlmIChlbGVDYWNoZSAhPSBudWxsKSB7XG4gICAgdmFyIG9wYWNpdHkgPSBnZXRPcGFjaXR5KHIsIGVsZSk7XG5cbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0aGV0YSA9IGdldFJvdGF0aW9uKHIsIGVsZSk7XG4gICAgdmFyIHgxID0gYmIueDEsXG4gICAgICAgIHkxID0gYmIueTEsXG4gICAgICAgIHcgPSBiYi53LFxuICAgICAgICBoID0gYmIuaDtcbiAgICB2YXIgeCwgeSwgc3gsIHN5LCBzbW9vdGg7XG5cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIHZhciByb3RQdCA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uUG9pbnQoZWxlKTtcbiAgICAgIHN4ID0gcm90UHQueDtcbiAgICAgIHN5ID0gcm90UHQueTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHN4LCBzeSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICBzbW9vdGggPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcblxuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvZmYgPSBlbGVUeHJDYWNoZS5nZXRSb3RhdGlvbk9mZnNldChlbGUpO1xuICAgICAgeCA9IG9mZi54O1xuICAgICAgeSA9IG9mZi55O1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geDE7XG4gICAgICB5ID0geTE7XG4gICAgfVxuXG4gICAgdmFyIG9sZEdsb2JhbEFscGhhO1xuXG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYSAqIG9wYWNpdHk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kcmF3SW1hZ2UoZWxlQ2FjaGUudGV4dHVyZS5jYW52YXMsIGVsZUNhY2hlLngsIDAsIGVsZUNhY2hlLndpZHRoLCBlbGVDYWNoZS5oZWlnaHQsIHgsIHksIHcsIGgpO1xuXG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG5cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIGNvbnRleHQucm90YXRlKC10aGV0YSk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtc3gsIC1zeSk7XG5cbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZWxlVHhyQ2FjaGUuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlKTsgLy8gZGlyZWN0IGRyYXcgZmFsbGJhY2tcbiAgfVxufTtcblxudmFyIGdldFplcm9Sb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFplcm9Sb3RhdGlvbigpIHtcbiAgcmV0dXJuIDA7XG59O1xuXG52YXIgZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsIG51bGwpO1xufTtcblxudmFyIGdldFNvdXJjZUxhYmVsUm90YXRpb24gPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uKHIsIGVsZSkge1xuICByZXR1cm4gci5nZXRUZXh0QW5nbGUoZWxlLCAnc291cmNlJyk7XG59O1xuXG52YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsICd0YXJnZXQnKTtcbn07XG5cbnZhciBnZXRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0T3BhY2l0eShyLCBlbGUpIHtcbiAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xuXG52YXIgZ2V0VGV4dE9wYWNpdHkgPSBmdW5jdGlvbiBnZXRUZXh0T3BhY2l0eShlLCBlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ3RleHQtb3BhY2l0eScpLnBmVmFsdWUgKiBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xufTtcblxuQ1JwJDEuZHJhd0NhY2hlZEVsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQsIGx2bCwgcmVxdWVzdEhpZ2hRdWFsaXR5KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIF9yJGRhdGEgPSByLmRhdGEsXG4gICAgICBlbGVUeHJDYWNoZSA9IF9yJGRhdGEuZWxlVHhyQ2FjaGUsXG4gICAgICBsYmxUeHJDYWNoZSA9IF9yJGRhdGEubGJsVHhyQ2FjaGUsXG4gICAgICBzbGJUeHJDYWNoZSA9IF9yJGRhdGEuc2xiVHhyQ2FjaGUsXG4gICAgICB0bGJUeHJDYWNoZSA9IF9yJGRhdGEudGxiVHhyQ2FjaGU7XG4gIHZhciBiYiA9IGVsZS5ib3VuZGluZ0JveCgpO1xuICB2YXIgcmVhc29uID0gcmVxdWVzdEhpZ2hRdWFsaXR5ID09PSB0cnVlID8gZWxlVHhyQ2FjaGUucmVhc29ucy5oaWdoUXVhbGl0eSA6IG51bGw7XG5cbiAgaWYgKGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCAhZWxlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghZXh0ZW50IHx8IGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuXG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG5cbiAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGVsZVR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0WmVyb1JvdGF0aW9uLCBnZXRPcGFjaXR5KTtcblxuICAgIGlmICghaXNFZGdlIHx8ICFiYWRMaW5lKSB7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIGxibFR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cblxuICAgIGlmIChpc0VkZ2UgJiYgIWJhZExpbmUpIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgc2xiVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHRsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cblxuICAgIHIuZHJhd0VsZW1lbnRPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5cbkNScCQxLmRyYXdFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzKSB7XG4gIHZhciByID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5cbkNScCQxLmRyYXdDYWNoZWRFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnQoY29udGV4dCwgZWxlLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuXG5DUnAkMS5kcmF3Q2FjaGVkTm9kZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcblxuICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcblxuQ1JwJDEuZHJhd0xheWVyZWRFbGVtZW50cyA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgbGF5ZXJzID0gci5kYXRhLmx5clR4ckNhY2hlLmdldExheWVycyhlbGVzLCBweFJhdGlvKTtcblxuICBpZiAobGF5ZXJzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIHZhciBiYiA9IGxheWVyLmJiO1xuXG4gICAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShsYXllci5jYW52YXMsIGJiLngxLCBiYi55MSwgYmIudywgYmIuaCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGZhbGwgYmFjayBvbiBwbGFpbiBjYWNoaW5nIGlmIG5vIGxheWVyc1xuICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5cbi8qIGdsb2JhbCBQYXRoMkQgKi9cbnZhciBDUnAkMiA9IHt9O1xuXG5DUnAkMi5kcmF3RWRnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG5cbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFlZGdlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBpZiBiZXppZXIgY3RybCBwdHMgY2FuIG5vdCBiZSBjYWxjdWxhdGVkLCB0aGVuIGRpZVxuXG5cbiAgaWYgKHJzLmJhZExpbmUgfHwgcnMuYWxscHRzID09IG51bGwgfHwgaXNOYU4ocnMuYWxscHRzWzBdKSkge1xuICAgIC8vIGlzTmFOIGluIGNhc2UgZWRnZSBpcyBpbXBvc3NpYmxlIGFuZCBicm93c2VyIGJ1Z3MgKGUuZy4gc2FmYXJpKVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBiYjtcblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cblxuICB2YXIgb3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gZWRnZS5wc3R5bGUoJ29wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBsaW5lT3BhY2l0eSA9IHNob3VsZERyYXdPcGFjaXR5ID8gZWRnZS5wc3R5bGUoJ2xpbmUtb3BhY2l0eScpLnZhbHVlIDogMTtcbiAgdmFyIGxpbmVTdHlsZSA9IGVkZ2UucHN0eWxlKCdsaW5lLXN0eWxlJykudmFsdWU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICB2YXIgbGluZUNhcCA9IGVkZ2UucHN0eWxlKCdsaW5lLWNhcCcpLnZhbHVlO1xuICB2YXIgZWZmZWN0aXZlTGluZU9wYWNpdHkgPSBvcGFjaXR5ICogbGluZU9wYWNpdHk7IC8vIHNlcGFyYXRlIGFycm93IG9wYWNpdHkgd291bGQgcmVxdWlyZSBhcnJvdy1vcGFjaXR5IHByb3BlcnR5XG5cbiAgdmFyIGVmZmVjdGl2ZUFycm93T3BhY2l0eSA9IG9wYWNpdHkgKiBsaW5lT3BhY2l0eTtcblxuICB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiBkcmF3TGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSBlZGdlV2lkdGg7XG4gICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICByLmVsZVN0cm9rZVN0eWxlKGNvbnRleHQsIGVkZ2UsIHN0cm9rZU9wYWNpdHkpO1xuICAgIHIuZHJhd0VkZ2VQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cywgbGluZVN0eWxlKTtcbiAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICB9O1xuXG4gIHZhciBkcmF3T3ZlcmxheSA9IGZ1bmN0aW9uIGRyYXdPdmVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByLmRyYXdFZGdlT3ZlcmxheShjb250ZXh0LCBlZGdlKTtcbiAgfTtcblxuICB2YXIgZHJhd0Fycm93cyA9IGZ1bmN0aW9uIGRyYXdBcnJvd3MoKSB7XG4gICAgdmFyIGFycm93T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlQXJyb3dPcGFjaXR5O1xuICAgIHIuZHJhd0Fycm93aGVhZHMoY29udGV4dCwgZWRnZSwgYXJyb3dPcGFjaXR5KTtcbiAgfTtcblxuICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dCgpIHtcbiAgICByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlZGdlLCBudWxsLCBkcmF3TGFiZWwpO1xuICB9O1xuXG4gIGNvbnRleHQubGluZUpvaW4gPSAncm91bmQnO1xuICB2YXIgZ2hvc3QgPSBlZGdlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG5cbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gZWRnZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZlY3RpdmVHaG9zdE9wYWNpdHkgPSBlZmZlY3RpdmVMaW5lT3BhY2l0eSAqIGdob3N0T3BhY2l0eTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShneCwgZ3kpO1xuICAgIGRyYXdMaW5lKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgZHJhd0Fycm93cyhlZmZlY3RpdmVHaG9zdE9wYWNpdHkpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuXG4gIGRyYXdMaW5lKCk7XG4gIGRyYXdBcnJvd3MoKTtcbiAgZHJhd092ZXJsYXkoKTtcbiAgZHJhd1RleHQoKTtcblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5cbkNScCQyLmRyYXdFZGdlT3ZlcmxheSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlKSB7XG4gIGlmICghZWRnZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgb3ZlcmxheU9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnb3ZlcmxheS1vcGFjaXR5JykudmFsdWU7XG5cbiAgaWYgKG92ZXJsYXlPcGFjaXR5ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgdXNlUGF0aHMgPSByLnVzZVBhdGhzKCk7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBvdmVybGF5UGFkZGluZyA9IGVkZ2UucHN0eWxlKCdvdmVybGF5LXBhZGRpbmcnKS5wZlZhbHVlO1xuICB2YXIgb3ZlcmxheVdpZHRoID0gMiAqIG92ZXJsYXlQYWRkaW5nO1xuICB2YXIgb3ZlcmxheUNvbG9yID0gZWRnZS5wc3R5bGUoJ292ZXJsYXktY29sb3InKS52YWx1ZTtcbiAgY29udGV4dC5saW5lV2lkdGggPSBvdmVybGF5V2lkdGg7XG5cbiAgaWYgKHJzLmVkZ2VUeXBlID09PSAnc2VsZicgJiYgIXVzZVBhdGhzKSB7XG4gICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQubGluZUNhcCA9ICdyb3VuZCc7XG4gIH1cblxuICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgb3ZlcmxheUNvbG9yWzBdLCBvdmVybGF5Q29sb3JbMV0sIG92ZXJsYXlDb2xvclsyXSwgb3ZlcmxheU9wYWNpdHkpO1xuICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsICdzb2xpZCcpO1xufTtcblxuQ1JwJDIuZHJhd0VkZ2VQYXRoID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIHB0cywgdHlwZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2FudmFzQ3h0ID0gY29udGV4dDtcbiAgdmFyIHBhdGg7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgbGluZURhc2hQYXR0ZXJuID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVEYXNoT2Zmc2V0ID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBwYXRoQ2FjaGVLZXkgPSBwdHMuam9pbignJCcpO1xuICAgIHZhciBrZXlNYXRjaGVzID0gcnMucGF0aENhY2hlS2V5ICYmIHJzLnBhdGhDYWNoZUtleSA9PT0gcGF0aENhY2hlS2V5O1xuXG4gICAgaWYgKGtleU1hdGNoZXMpIHtcbiAgICAgIHBhdGggPSBjb250ZXh0ID0gcnMucGF0aENhY2hlO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBycy5wYXRoQ2FjaGVLZXkgPSBwYXRoQ2FjaGVLZXk7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW52YXNDeHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgY2FudmFzQ3h0LnNldExpbmVEYXNoKGxpbmVEYXNoUGF0dGVybik7XG4gICAgICAgIGNhbnZhc0N4dC5saW5lRGFzaE9mZnNldCA9IGxpbmVEYXNoT2Zmc2V0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICBjYW52YXNDeHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhdGhDYWNoZUhpdCAmJiAhcnMuYmFkTGluZSkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG5cbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbMF0sIHB0c1sxXSk7XG5cbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdiZXppZXInOlxuICAgICAgY2FzZSAnc2VsZic6XG4gICAgICBjYXNlICdjb21wb3VuZCc6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyhwdHNbaV0sIHB0c1tpICsgMV0sIHB0c1tpICsgMl0sIHB0c1tpICsgM10pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSArIDEgPCBwdHMubGVuZ3RoOyBfaSArPSAyKSB7XG4gICAgICAgICAgY29udGV4dC5saW5lVG8ocHRzW19pXSwgcHRzW19pICsgMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29udGV4dCA9IGNhbnZhc0N4dDtcblxuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9IC8vIHJlc2V0IGFueSBsaW5lIGRhc2hlc1xuXG5cbiAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgfVxufTtcblxuQ1JwJDIuZHJhd0Fycm93aGVhZHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSwgb3BhY2l0eSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuXG4gIGlmICghaXNIYXlzdGFjaykge1xuICAgIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnc291cmNlJywgcnMuYXJyb3dTdGFydFgsIHJzLmFycm93U3RhcnRZLCBycy5zcmNBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxuXG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXRhcmdldCcsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHRndEFycm93QW5nbGUsIG9wYWNpdHkpO1xuICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ21pZC1zb3VyY2UnLCBycy5taWRYLCBycy5taWRZLCBycy5taWRzcmNBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcblxuICBpZiAoIWlzSGF5c3RhY2spIHtcbiAgICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ3RhcmdldCcsIHJzLmFycm93RW5kWCwgcnMuYXJyb3dFbmRZLCBycy50Z3RBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuQ1JwJDIuZHJhd0Fycm93aGVhZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlZGdlLCBwcmVmaXgsIHgsIHksIGFuZ2xlLCBvcGFjaXR5KSB7XG4gIGlmIChpc05hTih4KSB8fCB4ID09IG51bGwgfHwgaXNOYU4oeSkgfHwgeSA9PSBudWxsIHx8IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJyb3dTaGFwZSA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctc2hhcGUnKS52YWx1ZTtcblxuICBpZiAoYXJyb3dTaGFwZSA9PT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFycm93Q2xlYXJGaWxsID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1maWxsJykudmFsdWUgPT09ICdob2xsb3cnID8gJ2JvdGgnIDogJ2ZpbGxlZCc7XG4gIHZhciBhcnJvd0ZpbGwgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWZpbGwnKS52YWx1ZTtcbiAgdmFyIGVkZ2VXaWR0aCA9IGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBlZGdlT3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG5cbiAgaWYgKG9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wYWNpdHkgPSBlZGdlT3BhY2l0eTtcbiAgfVxuXG4gIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcblxuICBpZiAob3BhY2l0eSAhPT0gMSB8fCBhcnJvd0ZpbGwgPT09ICdob2xsb3cnKSB7XG4gICAgLy8gdGhlbiBleHRyYSBjbGVhciBpcyBuZWVkZWRcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIDEpO1xuICAgIHNlbGYuZHJhd0Fycm93U2hhcGUoZWRnZSwgY29udGV4dCwgYXJyb3dDbGVhckZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgeCwgeSwgYW5nbGUpO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICB9IC8vIG90aGVyd2lzZSwgdGhlIG9wYXF1ZSBhcnJvdyBjbGVhcnMgaXQgZm9yIGZyZWUgOilcblxuXG4gIHZhciBjb2xvciA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctY29sb3InKS52YWx1ZTtcbiAgc2VsZi5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIG9wYWNpdHkpO1xuICBzZWxmLmRyYXdBcnJvd1NoYXBlKGVkZ2UsIGNvbnRleHQsIGFycm93RmlsbCwgZWRnZVdpZHRoLCBhcnJvd1NoYXBlLCB4LCB5LCBhbmdsZSk7XG59O1xuXG5DUnAkMi5kcmF3QXJyb3dTaGFwZSA9IGZ1bmN0aW9uIChlZGdlLCBjb250ZXh0LCBmaWxsLCBlZGdlV2lkdGgsIHNoYXBlLCB4LCB5LCBhbmdsZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciB1c2VQYXRocyA9IHRoaXMudXNlUGF0aHMoKSAmJiBzaGFwZSAhPT0gJ3RyaWFuZ2xlLWNyb3NzJztcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGF0aDtcbiAgdmFyIGNhbnZhc0NvbnRleHQgPSBjb250ZXh0O1xuICB2YXIgdHJhbnNsYXRpb24gPSB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG4gIHZhciBzY2FsZSA9IGVkZ2UucHN0eWxlKCdhcnJvdy1zY2FsZScpLnZhbHVlO1xuICB2YXIgc2l6ZSA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlV2lkdGgsIHNjYWxlKTtcbiAgdmFyIHNoYXBlSW1wbCA9IHIuYXJyb3dTaGFwZXNbc2hhcGVdO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBjYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgPSByLmFycm93UGF0aENhY2hlIHx8IFtdO1xuICAgIHZhciBrZXkgPSBoYXNoU3RyaW5nKHNoYXBlKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IGNhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkUGF0aCAhPSBudWxsKSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IGNhY2hlZFBhdGg7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIGNhY2hlW2tleV0gPSBwYXRoO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIH1cblxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgLy8gc3RvcmUgaW4gdGhlIHBhdGggY2FjaGUgd2l0aCB2YWx1ZXMgZWFzaWx5IG1hbmlwdWxhdGVkIGxhdGVyXG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCAxLCAwLCB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnRleHQgPSBjYW52YXNDb250ZXh0O1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHNldCB0cmFuc2Zvcm0gdG8gYXJyb3cgcG9zaXRpb24vb3JpZW50YXRpb25cbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LnJvdGF0ZShhbmdsZSk7XG4gICAgY29udGV4dC5zY2FsZShzaXplLCBzaXplKTtcbiAgfVxuXG4gIGlmIChmaWxsID09PSAnZmlsbGVkJyB8fCBmaWxsID09PSAnYm90aCcpIHtcbiAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZpbGwgPT09ICdob2xsb3cnIHx8IGZpbGwgPT09ICdib3RoJykge1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gKHNoYXBlSW1wbC5tYXRjaEVkZ2VXaWR0aCA/IGVkZ2VXaWR0aCA6IDEpIC8gKHVzZVBhdGhzID8gc2l6ZSA6IDEpO1xuICAgIGNvbnRleHQubGluZUpvaW4gPSAnbWl0ZXInO1xuXG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICB9XG4gIH1cblxuICBpZiAodXNlUGF0aHMpIHtcbiAgICAvLyByZXNldCB0cmFuc2Zvcm0gYnkgYXBwbHlpbmcgaW52ZXJzZVxuICAgIGNvbnRleHQuc2NhbGUoMSAvIHNpemUsIDEgLyBzaXplKTtcbiAgICBjb250ZXh0LnJvdGF0ZSgtYW5nbGUpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC14LCAteSk7XG4gIH1cbn07XG5cbnZhciBDUnAkMyA9IHt9O1xuXG5DUnAkMy5zYWZlRHJhd0ltYWdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpIHtcbiAgLy8gZGV0ZWN0IHByb2JsZW1hdGljIGNhc2VzIGZvciBvbGQgYnJvd3NlcnMgd2l0aCBiYWQgaW1hZ2VzIChjaGVhcGVyIHRoYW4gdHJ5LWNhdGNoKVxuICBpZiAoaXcgPD0gMCB8fCBpaCA8PSAwIHx8IHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIGl4LCBpeSwgaXcsIGloLCB4LCB5LCB3LCBoKTtcbn07XG5cbkNScCQzLmRyYXdJbnNjcmliZWRJbWFnZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBpbWcsIG5vZGUsIGluZGV4LCBub2RlT3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBwb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciBub2RlWCA9IHBvcy54O1xuICB2YXIgbm9kZVkgPSBwb3MueTtcbiAgdmFyIHN0eWxlT2JqID0gbm9kZS5jeSgpLnN0eWxlKCk7XG4gIHZhciBnZXRJbmRleGVkU3R5bGUgPSBzdHlsZU9iai5nZXRJbmRleGVkU3R5bGUuYmluZChzdHlsZU9iaik7XG4gIHZhciBmaXQgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtZml0JywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgcmVwZWF0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXJlcGVhdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcGFkZGluZ1gyID0gbm9kZS5wYWRkaW5nKCkgKiAyO1xuICB2YXIgbm9kZVRXID0gbm9kZVcgKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoLXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBub2RlVEggPSBub2RlSCArIChnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaGVpZ2h0LXJlbGF0aXZlLXRvJywgJ3ZhbHVlJywgaW5kZXgpID09PSAnaW5uZXInID8gMCA6IHBhZGRpbmdYMik7XG4gIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBjbGlwID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWNsaXAnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBzaG91bGRDbGlwID0gY2xpcCA9PT0gJ25vZGUnO1xuICB2YXIgaW1nT3BhY2l0eSA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1pbWFnZS1vcGFjaXR5JywgJ3ZhbHVlJywgaW5kZXgpICogbm9kZU9wYWNpdHk7XG4gIHZhciBpbWdXID0gaW1nLndpZHRoIHx8IGltZy5jYWNoZWRXO1xuICB2YXIgaW1nSCA9IGltZy5oZWlnaHQgfHwgaW1nLmNhY2hlZEg7IC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBicm93c2VycyBsaWtlIGllXG5cbiAgaWYgKG51bGwgPT0gaW1nVyB8fCBudWxsID09IGltZ0gpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltZ1cgPSBpbWcuY2FjaGVkVyA9IGltZy53aWR0aCB8fCBpbWcub2Zmc2V0V2lkdGg7XG4gICAgaW1nSCA9IGltZy5jYWNoZWRIID0gaW1nLmhlaWdodCB8fCBpbWcub2Zmc2V0SGVpZ2h0O1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW1nKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICB9XG5cbiAgdmFyIHcgPSBpbWdXO1xuICB2YXIgaCA9IGltZ0g7XG5cbiAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICd1bml0cycsIGluZGV4KSA9PT0gJyUnKSB7XG4gICAgICB3ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3BmVmFsdWUnLCBpbmRleCkgKiBub2RlVFc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBpZiAodyA9PT0gMCB8fCBoID09PSAwKSB7XG4gICAgcmV0dXJuOyAvLyBubyBwb2ludCBpbiBkcmF3aW5nIGVtcHR5IGltYWdlIChhbmQgY2hyb21lIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UpXG4gIH1cblxuICBpZiAoZml0ID09PSAnY29udGFpbicpIHtcbiAgICB2YXIgc2NhbGUgPSBNYXRoLm1pbihub2RlVFcgLyB3LCBub2RlVEggLyBoKTtcbiAgICB3ICo9IHNjYWxlO1xuICAgIGggKj0gc2NhbGU7XG4gIH0gZWxzZSBpZiAoZml0ID09PSAnY292ZXInKSB7XG4gICAgdmFyIHNjYWxlID0gTWF0aC5tYXgobm9kZVRXIC8gdywgbm9kZVRIIC8gaCk7XG4gICAgdyAqPSBzY2FsZTtcbiAgICBoICo9IHNjYWxlO1xuICB9XG5cbiAgdmFyIHggPSBub2RlWCAtIG5vZGVUVyAvIDI7IC8vIGxlZnRcblxuICB2YXIgcG9zWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBwb3NYUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICdwZlZhbHVlJywgaW5kZXgpO1xuXG4gIGlmIChwb3NYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogcG9zWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gcG9zWFBmVmFsO1xuICB9XG5cbiAgdmFyIG9mZlhVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZlhQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteCcsICdwZlZhbHVlJywgaW5kZXgpO1xuXG4gIGlmIChvZmZYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogb2ZmWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gb2ZmWFBmVmFsO1xuICB9XG5cbiAgdmFyIHkgPSBub2RlWSAtIG5vZGVUSCAvIDI7IC8vIHRvcFxuXG4gIHZhciBwb3NZVW5pdHMgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIHBvc1lQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3BmVmFsdWUnLCBpbmRleCk7XG5cbiAgaWYgKHBvc1lVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBwb3NZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBwb3NZUGZWYWw7XG4gIH1cblxuICB2YXIgb2ZmWVVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC15JywgJ3BmVmFsdWUnLCBpbmRleCk7XG5cbiAgaWYgKG9mZllVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBvZmZZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBvZmZZUGZWYWw7XG4gIH1cblxuICBpZiAocnMucGF0aENhY2hlKSB7XG4gICAgeCAtPSBub2RlWDtcbiAgICB5IC09IG5vZGVZO1xuICAgIG5vZGVYID0gMDtcbiAgICBub2RlWSA9IDA7XG4gIH1cblxuICB2YXIgZ0FscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGltZ09wYWNpdHk7XG5cbiAgaWYgKHJlcGVhdCA9PT0gJ25vLXJlcGVhdCcpIHtcbiAgICBpZiAoc2hvdWxkQ2xpcCkge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG5cbiAgICAgIGlmIChycy5wYXRoQ2FjaGUpIHtcbiAgICAgICAgY29udGV4dC5jbGlwKHJzLnBhdGhDYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCk7XG4gICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHIuc2FmZURyYXdJbWFnZShjb250ZXh0LCBpbWcsIDAsIDAsIGltZ1csIGltZ0gsIHgsIHksIHcsIGgpO1xuXG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgcGF0dGVybiA9IGNvbnRleHQuY3JlYXRlUGF0dGVybihpbWcsIHJlcGVhdCk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBwYXR0ZXJuO1xuICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRIKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgteCwgLXkpO1xuICB9XG5cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGdBbHBoYTtcbn07XG5cbnZhciBDUnAkNCA9IHt9O1xuXG5DUnAkNC5lbGVUZXh0QmlnZ2VyVGhhbk1pbiA9IGZ1bmN0aW9uIChlbGUsIHNjYWxlKSB7XG4gIGlmICghc2NhbGUpIHtcbiAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICAgIHZhciBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpOyAvLyB0aGUgZWZmZWN0aXZlIHRleHR1cmUgbGV2ZWxcblxuICAgIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgfVxuXG4gIHZhciBjb21wdXRlZFNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlICogc2NhbGU7XG4gIHZhciBtaW5TaXplID0gZWxlLnBzdHlsZSgnbWluLXpvb21lZC1mb250LXNpemUnKS5wZlZhbHVlO1xuXG4gIGlmIChjb21wdXRlZFNpemUgPCBtaW5TaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5DUnAkNC5kcmF3RWxlbWVudFRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBmb3JjZSwgcHJlZml4KSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG5cbiAgaWYgKGZvcmNlID09IG51bGwpIHtcbiAgICBpZiAodXNlRWxlT3BhY2l0eSAmJiAhci5lbGVUZXh0QmlnZ2VyVGhhbk1pbihlbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKGZvcmNlID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICB2YXIgbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuXG4gICAgaWYgKCFsYWJlbCB8fCAhbGFiZWwudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIganVzdGlmaWNhdGlvbiA9IHIuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uKGVsZSk7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSBqdXN0aWZpY2F0aW9uO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG5cbiAgICB2YXIgX2xhYmVsID0gZWxlLnBzdHlsZSgnbGFiZWwnKTtcblxuICAgIHZhciBzcmNMYWJlbCA9IGVsZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpO1xuICAgIHZhciB0Z3RMYWJlbCA9IGVsZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpO1xuXG4gICAgaWYgKGJhZExpbmUgfHwgKCFfbGFiZWwgfHwgIV9sYWJlbC52YWx1ZSkgJiYgKCFzcmNMYWJlbCB8fCAhc3JjTGFiZWwudmFsdWUpICYmICghdGd0TGFiZWwgfHwgIXRndExhYmVsLnZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbiAgfVxuXG4gIHZhciBhcHBseVJvdGF0aW9uID0gIXNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gIHZhciBiYjtcblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cblxuICBpZiAocHJlZml4ID09IG51bGwpIHtcbiAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgbnVsbCwgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG5cbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3NvdXJjZScsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsICd0YXJnZXQnLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIHByZWZpeCwgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gIH1cblxuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG5cbkNScCQ0LmdldEZvbnRDYWNoZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciBjYWNoZTtcbiAgdGhpcy5mb250Q2FjaGVzID0gdGhpcy5mb250Q2FjaGVzIHx8IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250Q2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGUgPSB0aGlzLmZvbnRDYWNoZXNbaV07XG5cbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfVxuXG4gIGNhY2hlID0ge1xuICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdGhpcy5mb250Q2FjaGVzLnB1c2goY2FjaGUpO1xuICByZXR1cm4gY2FjaGU7XG59OyAvLyBzZXQgdXAgY2FudmFzIGNvbnRleHQgd2l0aCBmb250XG4vLyByZXR1cm5zIHRyYW5zZm9ybWVkIHRleHQgc3RyaW5nXG5cblxuQ1JwJDQuc2V0dXBUZXh0U3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAvLyBGb250IHN0eWxlXG4gIHZhciBsYWJlbFN0eWxlID0gZWxlLnBzdHlsZSgnZm9udC1zdHlsZScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxTaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZSArICdweCc7XG4gIHZhciBsYWJlbEZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciBsYWJlbFdlaWdodCA9IGVsZS5wc3R5bGUoJ2ZvbnQtd2VpZ2h0Jykuc3RyVmFsdWU7XG4gIHZhciBvcGFjaXR5ID0gdXNlRWxlT3BhY2l0eSA/IGVsZS5lZmZlY3RpdmVPcGFjaXR5KCkgKiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBvdXRsaW5lT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBvcGFjaXR5O1xuICB2YXIgY29sb3IgPSBlbGUucHN0eWxlKCdjb2xvcicpLnZhbHVlO1xuICB2YXIgb3V0bGluZUNvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIGNvbnRleHQuZm9udCA9IGxhYmVsU3R5bGUgKyAnICcgKyBsYWJlbFdlaWdodCArICcgJyArIGxhYmVsU2l6ZSArICcgJyArIGxhYmVsRmFtaWx5O1xuICBjb250ZXh0LmxpbmVKb2luID0gJ3JvdW5kJzsgLy8gc28gdGV4dCBvdXRsaW5lcyBhcmVuJ3QgamFnZ2VkXG5cbiAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgdGhpcy5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIG91dGxpbmVDb2xvclswXSwgb3V0bGluZUNvbG9yWzFdLCBvdXRsaW5lQ29sb3JbMl0sIG91dGxpbmVPcGFjaXR5KTtcbn07IC8vIFRPRE8gZW5zdXJlIHJlLXVzZWRcblxuXG5mdW5jdGlvbiByb3VuZFJlY3QoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDU7XG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4Lm1vdmVUbyh4ICsgcmFkaXVzLCB5KTtcbiAgY3R4LmxpbmVUbyh4ICsgd2lkdGggLSByYWRpdXMsIHkpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHJhZGl1cyk7XG4gIGN0eC5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICBjdHgubGluZVRvKHggKyByYWRpdXMsIHkgKyBoZWlnaHQpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcbiAgY3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcbiAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCArIHJhZGl1cywgeSk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn1cblxuQ1JwJDQuZ2V0VGV4dEFuZ2xlID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciB0aGV0YTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBkYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciByb3RhdGlvbiA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICB2YXIgdGV4dEFuZ2xlID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpO1xuXG4gIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnKSB7XG4gICAgdGhldGEgPSBlbGUuaXNFZGdlKCkgPyB0ZXh0QW5nbGUgOiAwO1xuICB9IGVsc2UgaWYgKHJvdGF0aW9uLnN0clZhbHVlID09PSAnbm9uZScpIHtcbiAgICB0aGV0YSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgdGhldGEgPSByb3RhdGlvbi5wZlZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHRoZXRhO1xufTtcblxuQ1JwJDQuZHJhd1RleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBwcmVmaXgpIHtcbiAgdmFyIGFwcGx5Um90YXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGFyZW50T3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcblxuICBpZiAodXNlRWxlT3BhY2l0eSAmJiAocGFyZW50T3BhY2l0eSA9PT0gMCB8fCBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS52YWx1ZSA9PT0gMCkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gdXNlICdtYWluJyBhcyBhbiBhbGlhcyBmb3IgdGhlIG1haW4gbGFiZWwgKGkuZS4gbnVsbCBwcmVmaXgpXG5cblxuICBpZiAocHJlZml4ID09PSAnbWFpbicpIHtcbiAgICBwcmVmaXggPSBudWxsO1xuICB9XG5cbiAgdmFyIHRleHRYID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsWCcsIHByZWZpeCk7XG4gIHZhciB0ZXh0WSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFknLCBwcmVmaXgpO1xuICB2YXIgb3JnVGV4dFgsIG9yZ1RleHRZOyAvLyB1c2VkIGZvciByb3RhdGlvblxuXG4gIHZhciB0ZXh0ID0gdGhpcy5nZXRMYWJlbFRleHQoZWxlLCBwcmVmaXgpO1xuXG4gIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dCAhPT0gJycgJiYgIWlzTmFOKHRleHRYKSAmJiAhaXNOYU4odGV4dFkpKSB7XG4gICAgdGhpcy5zZXR1cFRleHRTdHlsZShjb250ZXh0LCBlbGUsIHVzZUVsZU9wYWNpdHkpO1xuICAgIHZhciBwZGFzaCA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHZhciB0ZXh0VyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4KTtcbiAgICB2YXIgdGV4dEggPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgpO1xuICAgIHZhciBtYXJnaW5YID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LW1hcmdpbi14JykucGZWYWx1ZTtcbiAgICB2YXIgbWFyZ2luWSA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWU7XG4gICAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgICB2YXIgaGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZTtcbiAgICB2YXIgdmFsaWduID0gZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcblxuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGhhbGlnbiA9ICdjZW50ZXInO1xuICAgICAgdmFsaWduID0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgdGV4dFggKz0gbWFyZ2luWDtcbiAgICB0ZXh0WSArPSBtYXJnaW5ZO1xuICAgIHZhciB0aGV0YTtcblxuICAgIGlmICghYXBwbHlSb3RhdGlvbikge1xuICAgICAgdGhldGEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGV0YSA9IHRoaXMuZ2V0VGV4dEFuZ2xlKGVsZSwgcHJlZml4KTtcbiAgICB9XG5cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIG9yZ1RleHRYID0gdGV4dFg7XG4gICAgICBvcmdUZXh0WSA9IHRleHRZO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUob3JnVGV4dFgsIG9yZ1RleHRZKTtcbiAgICAgIGNvbnRleHQucm90YXRlKHRoZXRhKTtcbiAgICAgIHRleHRYID0gMDtcbiAgICAgIHRleHRZID0gMDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHZhbGlnbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHRleHRZICs9IHRleHRIIC8gMjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRleHRZICs9IHRleHRIO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgYmFja2dyb3VuZE9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBib3JkZXJPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciB0ZXh0Qm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGJhY2tncm91bmRQYWRkaW5nID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnKS5wZlZhbHVlO1xuXG4gICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCB8fCB0ZXh0Qm9yZGVyV2lkdGggPiAwICYmIGJvcmRlck9wYWNpdHkgPiAwKSB7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcblxuICAgICAgc3dpdGNoIChoYWxpZ24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgYmdYIC09IHRleHRXO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgYmdYIC09IHRleHRXIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcblxuICAgICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCkge1xuICAgICAgICB2YXIgdGV4dEZpbGwgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgdmFyIHRleHRCYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCd0ZXh0LWJhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgdGV4dEJhY2tncm91bmRDb2xvclswXSArICcsJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMV0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzJdICsgJywnICsgYmFja2dyb3VuZE9wYWNpdHkgKiBwYXJlbnRPcGFjaXR5ICsgJyknO1xuICAgICAgICB2YXIgc3R5bGVTaGFwZSA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1zaGFwZScpLnN0clZhbHVlO1xuXG4gICAgICAgIGlmIChzdHlsZVNoYXBlLmluZGV4T2YoJ3JvdW5kJykgPT09IDApIHtcbiAgICAgICAgICByb3VuZFJlY3QoY29udGV4dCwgYmdYLCBiZ1ksIGJnVywgYmdILCAyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHRleHRGaWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGV4dEJvcmRlcldpZHRoID4gMCAmJiBib3JkZXJPcGFjaXR5ID4gMCkge1xuICAgICAgICB2YXIgdGV4dFN0cm9rZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0TGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGg7XG4gICAgICAgIHZhciB0ZXh0Qm9yZGVyQ29sb3IgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1jb2xvcicpLnZhbHVlO1xuICAgICAgICB2YXIgdGV4dEJvcmRlclN0eWxlID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItc3R5bGUnKS52YWx1ZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMF0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMV0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMl0gKyAnLCcgKyBib3JkZXJPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGg7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgICBzd2l0Y2ggKHRleHRCb3JkZXJTdHlsZSkge1xuICAgICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyA0OyAvLyA1MCUgcmVzZXJ2ZWQgZm9yIHdoaXRlIGJldHdlZW4gdGhlIHR3byBib3JkZXJzXG5cbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnN0cm9rZVJlY3QoYmdYLCBiZ1ksIGJnVywgYmdIKTtcblxuICAgICAgICBpZiAodGV4dEJvcmRlclN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICAgIHZhciB3aGl0ZVdpZHRoID0gdGV4dEJvcmRlcldpZHRoIC8gMjtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZVJlY3QoYmdYICsgd2hpdGVXaWR0aCwgYmdZICsgd2hpdGVXaWR0aCwgYmdXIC0gd2hpdGVXaWR0aCAqIDIsIGJnSCAtIHdoaXRlV2lkdGggKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHRleHRMaW5lV2lkdGg7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSB0ZXh0U3Ryb2tlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsaW5lV2lkdGggPSAyICogZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLXdpZHRoJykucGZWYWx1ZTsgLy8gKjIgYi9jIHRoZSBzdHJva2UgaXMgZHJhd24gY2VudHJlZCBvbiB0aGUgbWlkZGxlXG5cbiAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKGVsZS5wc3R5bGUoJ3RleHQtd3JhcCcpLnZhbHVlID09PSAnd3JhcCcpIHtcbiAgICAgIHZhciBsaW5lcyA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFdyYXBDYWNoZWRMaW5lcycsIHByZWZpeCk7XG4gICAgICB2YXIgbGluZUhlaWdodCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbExpbmVIZWlnaHQnLCBwcmVmaXgpO1xuICAgICAgdmFyIGhhbGZUZXh0VyA9IHRleHRXIC8gMjtcbiAgICAgIHZhciBqdXN0aWZpY2F0aW9uID0gdGhpcy5nZXRMYWJlbEp1c3RpZmljYXRpb24oZWxlKTtcblxuICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdhdXRvJykgOyBlbHNlIGlmIChoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiByaWdodFxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gLXRleHRXO1xuICAgICAgICB9IGVsc2UgaWYgKGp1c3RpZmljYXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgdGV4dFggKz0gLWhhbGZUZXh0VztcbiAgICAgICAgfSAvLyBlbHNlIHNhbWUgYXMgYXV0b1xuXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0ZmljYXRpb24gOiBjZW50ZXJcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSAvLyBlbHNlIHNhbWUgYXMgYXV0b1xuXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAvLyBhdXRvIGp1c3RpZmljYXRpb24gOiBsZWZ0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSBlbHNlIGlmIChqdXN0aWZpY2F0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgdGV4dFggKz0gdGV4dFc7XG4gICAgICAgIH0gLy8gZWxzZSBzYW1lIGFzIGF1dG9cblxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHZhbGlnbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRleHRZIC09IChsaW5lcy5sZW5ndGggLSAxKSAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5maWxsVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgdGV4dFkgKz0gbGluZUhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxpbmVXaWR0aCA+IDApIHtcbiAgICAgICAgY29udGV4dC5zdHJva2VUZXh0KHRleHQsIHRleHRYLCB0ZXh0WSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICB9XG5cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIGNvbnRleHQucm90YXRlKC10aGV0YSk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtb3JnVGV4dFgsIC1vcmdUZXh0WSk7XG4gICAgfVxuICB9XG59O1xuXG4vKiBnbG9iYWwgUGF0aDJEICovXG52YXIgQ1JwJDUgPSB7fTtcblxuQ1JwJDUuZHJhd05vZGUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgc2hpZnRUb09yaWdpbldpdGhCYikge1xuICB2YXIgZHJhd0xhYmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd092ZXJsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogdHJ1ZTtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgbm9kZVdpZHRoLCBub2RlSGVpZ2h0O1xuICB2YXIgX3AgPSBub2RlLl9wcml2YXRlO1xuICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcblxuICBpZiAoIW51bWJlcihwb3MueCkgfHwgIW51bWJlcihwb3MueSkpIHtcbiAgICByZXR1cm47IC8vIGNhbid0IGRyYXcgbm9kZSB3aXRoIHVuZGVmaW5lZCBwb3NpdGlvblxuICB9XG5cbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFub2RlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbGVPcGFjaXR5ID0gc2hvdWxkRHJhd09wYWNpdHkgPyBub2RlLmVmZmVjdGl2ZU9wYWNpdHkoKSA6IDE7XG4gIHZhciB1c2VQYXRocyA9IHIudXNlUGF0aHMoKTtcbiAgdmFyIHBhdGg7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHBhZGRpbmcgPSBub2RlLnBhZGRpbmcoKTtcbiAgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpICsgMiAqIHBhZGRpbmc7XG4gIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpICsgMiAqIHBhZGRpbmc7IC8vXG4gIC8vIHNldHVwIHNoaWZ0XG5cbiAgdmFyIGJiO1xuXG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgYmIgPSBzaGlmdFRvT3JpZ2luV2l0aEJiO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1iYi54MSwgLWJiLnkxKTtcbiAgfSAvL1xuICAvLyBsb2FkIGJnIGltYWdlXG5cblxuICB2YXIgYmdJbWdQcm9wID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtaW1hZ2UnKTtcbiAgdmFyIHVybHMgPSBiZ0ltZ1Byb3AudmFsdWU7XG4gIHZhciB1cmxEZWZpbmVkID0gbmV3IEFycmF5KHVybHMubGVuZ3RoKTtcbiAgdmFyIGltYWdlID0gbmV3IEFycmF5KHVybHMubGVuZ3RoKTtcbiAgdmFyIG51bUltYWdlcyA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHVybHNbaV07XG4gICAgdmFyIGRlZmQgPSB1cmxEZWZpbmVkW2ldID0gdXJsICE9IG51bGwgJiYgdXJsICE9PSAnbm9uZSc7XG5cbiAgICBpZiAoZGVmZCkge1xuICAgICAgdmFyIGJnSW1nQ3Jvc3NPcmlnaW4gPSBub2RlLmN5KCkuc3R5bGUoKS5nZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2UtY3Jvc3NvcmlnaW4nLCAndmFsdWUnLCBpKTtcbiAgICAgIG51bUltYWdlcysrOyAvLyBnZXQgaW1hZ2UsIGFuZCBpZiBub3QgbG9hZGVkIHRoZW4gYXNrIHRvIHJlZHJhdyB3aGVuIGxhdGVyIGxvYWRlZFxuXG4gICAgICBpbWFnZVtpXSA9IHIuZ2V0Q2FjaGVkSW1hZ2UodXJsLCBiZ0ltZ0Nyb3NzT3JpZ2luLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9wLmJhY2tncm91bmRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICBub2RlLmVtaXRBbmROb3RpZnkoJ2JhY2tncm91bmQnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvL1xuICAvLyBzZXR1cCBzdHlsZXNcblxuXG4gIHZhciBkYXJrbmVzcyA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLWJsYWNrZW4nKS52YWx1ZTtcbiAgdmFyIGJvcmRlcldpZHRoID0gbm9kZS5wc3R5bGUoJ2JvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gIHZhciBiZ09wYWNpdHkgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgYm9yZGVyQ29sb3IgPSBub2RlLnBzdHlsZSgnYm9yZGVyLWNvbG9yJykudmFsdWU7XG4gIHZhciBib3JkZXJTdHlsZSA9IG5vZGUucHN0eWxlKCdib3JkZXItc3R5bGUnKS52YWx1ZTtcbiAgdmFyIGJvcmRlck9wYWNpdHkgPSBub2RlLnBzdHlsZSgnYm9yZGVyLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIGNvbnRleHQubGluZUpvaW4gPSAnbWl0ZXInOyAvLyBzbyBib3JkZXJzIGFyZSBzcXVhcmUgd2l0aCB0aGUgbm9kZSBzaGFwZVxuXG4gIHZhciBzZXR1cFNoYXBlQ29sb3IgPSBmdW5jdGlvbiBzZXR1cFNoYXBlQ29sb3IoKSB7XG4gICAgdmFyIGJnT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBiZ09wYWNpdHk7XG4gICAgci5lbGVGaWxsU3R5bGUoY29udGV4dCwgbm9kZSwgYmdPcHkpO1xuICB9O1xuXG4gIHZhciBzZXR1cEJvcmRlckNvbG9yID0gZnVuY3Rpb24gc2V0dXBCb3JkZXJDb2xvcigpIHtcbiAgICB2YXIgYmRyT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBib3JkZXJPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBib3JkZXJDb2xvclswXSwgYm9yZGVyQ29sb3JbMV0sIGJvcmRlckNvbG9yWzJdLCBiZHJPcHkpO1xuICB9OyAvL1xuICAvLyBzZXR1cCBzaGFwZVxuXG5cbiAgdmFyIHN0eWxlU2hhcGUgPSBub2RlLnBzdHlsZSgnc2hhcGUnKS5zdHJWYWx1ZTtcbiAgdmFyIHNoYXBlUHRzID0gbm9kZS5wc3R5bGUoJ3NoYXBlLXBvbHlnb24tcG9pbnRzJykucGZWYWx1ZTtcblxuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShwb3MueCwgcG9zLnkpO1xuICAgIHZhciBwYXRoQ2FjaGUgPSByLm5vZGVQYXRoQ2FjaGUgPSByLm5vZGVQYXRoQ2FjaGUgfHwgW107XG4gICAgdmFyIGtleSA9IGhhc2hTdHJpbmdzKHN0eWxlU2hhcGUgPT09ICdwb2x5Z29uJyA/IHN0eWxlU2hhcGUgKyAnLCcgKyBzaGFwZVB0cy5qb2luKCcsJykgOiBzdHlsZVNoYXBlLCAnJyArIG5vZGVIZWlnaHQsICcnICsgbm9kZVdpZHRoKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IHBhdGhDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNhY2hlZFBhdGg7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgICAgcnMucGF0aENhY2hlID0gcGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIHBhdGhDYWNoZVtrZXldID0gcnMucGF0aENhY2hlID0gcGF0aDtcbiAgICB9XG4gIH1cblxuICB2YXIgZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlKCkge1xuICAgIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgICB2YXIgbnBvcyA9IHBvcztcblxuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIG5wb3MgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhwYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgIH1cblxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdJbWFnZXMgPSBmdW5jdGlvbiBkcmF3SW1hZ2VzKCkge1xuICAgIHZhciBub2RlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWxlT3BhY2l0eTtcbiAgICB2YXIgcHJldkJnaW5nID0gX3AuYmFja2dyb3VuZGluZztcbiAgICB2YXIgdG90YWxDb21wbGV0ZWQgPSAwO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGltYWdlLmxlbmd0aDsgX2krKykge1xuICAgICAgaWYgKHVybERlZmluZWRbX2ldICYmIGltYWdlW19pXS5jb21wbGV0ZSAmJiAhaW1hZ2VbX2ldLmVycm9yKSB7XG4gICAgICAgIHRvdGFsQ29tcGxldGVkKys7XG4gICAgICAgIHIuZHJhd0luc2NyaWJlZEltYWdlKGNvbnRleHQsIGltYWdlW19pXSwgbm9kZSwgX2ksIG5vZGVPcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfcC5iYWNrZ3JvdW5kaW5nID0gISh0b3RhbENvbXBsZXRlZCA9PT0gbnVtSW1hZ2VzKTtcblxuICAgIGlmIChwcmV2QmdpbmcgIT09IF9wLmJhY2tncm91bmRpbmcpIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBiL2MgOmJhY2tncm91bmRpbmcgc3RhdGUgY2hhbmdlZFxuICAgICAgbm9kZS51cGRhdGVTdHlsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBkcmF3UGllID0gZnVuY3Rpb24gZHJhd1BpZSgpIHtcbiAgICB2YXIgcmVkcmF3U2hhcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwaWVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBlbGVPcGFjaXR5O1xuXG4gICAgaWYgKHIuaGFzUGllKG5vZGUpKSB7XG4gICAgICByLmRyYXdQaWUoY29udGV4dCwgbm9kZSwgcGllT3BhY2l0eSk7IC8vIHJlZHJhdy9yZXN0b3JlIHBhdGggaWYgc3RlcHMgYWZ0ZXIgcGllIG5lZWQgaXRcblxuICAgICAgaWYgKHJlZHJhd1NoYXBlKSB7XG4gICAgICAgIGlmICghdXNlUGF0aHMpIHtcbiAgICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBkYXJrZW4gPSBmdW5jdGlvbiBkYXJrZW4oKSB7XG4gICAgdmFyIGRhcmtlbk9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIG9wYWNpdHkgPSAoZGFya25lc3MgPiAwID8gZGFya25lc3MgOiAtZGFya25lc3MpICogZGFya2VuT3BhY2l0eTtcbiAgICB2YXIgYyA9IGRhcmtuZXNzID4gMCA/IDAgOiAyNTU7XG5cbiAgICBpZiAoZGFya25lc3MgIT09IDApIHtcbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgYywgYywgYywgb3BhY2l0eSk7XG5cbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdCb3JkZXIgPSBmdW5jdGlvbiBkcmF3Qm9yZGVyKCkge1xuICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG5cbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBzd2l0Y2ggKGJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnZGFzaGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzQsIDJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aCAvIDM7XG4gICAgICAgIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcblxuICAgICAgICBpZiAodXNlUGF0aHMpIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZShwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9IC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG5cblxuICAgICAgaWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgbm9kZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcblxuICB2YXIgZ2hvc3QgPSBub2RlLnBzdHlsZSgnZ2hvc3QnKS52YWx1ZSA9PT0gJ3llcyc7XG5cbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gbm9kZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZHaG9zdE9wYWNpdHkgPSBnaG9zdE9wYWNpdHkgKiBlbGVPcGFjaXR5O1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGd4LCBneSk7XG4gICAgc2V0dXBTaGFwZUNvbG9yKGdob3N0T3BhY2l0eSAqIGJnT3BhY2l0eSk7XG4gICAgZHJhd1NoYXBlKCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHkpO1xuICAgIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICAgIGRhcmtlbihlZmZHaG9zdE9wYWNpdHkpO1xuICAgIHNldHVwQm9yZGVyQ29sb3IoZ2hvc3RPcGFjaXR5ICogYm9yZGVyT3BhY2l0eSk7XG4gICAgZHJhd0JvcmRlcigpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuXG4gIHNldHVwU2hhcGVDb2xvcigpO1xuICBkcmF3U2hhcGUoKTtcbiAgZHJhd0ltYWdlcygpO1xuICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgZGFya2VuKCk7XG4gIHNldHVwQm9yZGVyQ29sb3IoKTtcbiAgZHJhd0JvcmRlcigpO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuXG4gIGRyYXdUZXh0KCk7XG4gIGRyYXdPdmVybGF5KCk7IC8vXG4gIC8vIGNsZWFuIHVwIHNoaWZ0XG5cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xuXG5DUnAkNS5kcmF3Tm9kZU92ZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgcG9zLCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuXG4gIGlmICghbm9kZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgb3ZlcmxheVBhZGRpbmcgPSBub2RlLnBzdHlsZSgnb3ZlcmxheS1wYWRkaW5nJykucGZWYWx1ZTtcbiAgdmFyIG92ZXJsYXlPcGFjaXR5ID0gbm9kZS5wc3R5bGUoJ292ZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICB2YXIgb3ZlcmxheUNvbG9yID0gbm9kZS5wc3R5bGUoJ292ZXJsYXktY29sb3InKS52YWx1ZTtcblxuICBpZiAob3ZlcmxheU9wYWNpdHkgPiAwKSB7XG4gICAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcblxuICAgIGlmIChub2RlV2lkdGggPT0gbnVsbCB8fCBub2RlSGVpZ2h0ID09IG51bGwpIHtcbiAgICAgIHZhciBwYWRkaW5nID0gbm9kZS5wYWRkaW5nKCk7XG4gICAgICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgICAgIG5vZGVIZWlnaHQgPSBub2RlLmhlaWdodCgpICsgMiAqIHBhZGRpbmc7XG4gICAgfVxuXG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdmVybGF5Q29sb3JbMF0sIG92ZXJsYXlDb2xvclsxXSwgb3ZlcmxheUNvbG9yWzJdLCBvdmVybGF5T3BhY2l0eSk7XG4gICAgci5ub2RlU2hhcGVzWydyb3VuZHJlY3RhbmdsZSddLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGggKyBvdmVybGF5UGFkZGluZyAqIDIsIG5vZGVIZWlnaHQgKyBvdmVybGF5UGFkZGluZyAqIDIpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG59OyAvLyBkb2VzIHRoZSBub2RlIGhhdmUgYXQgbGVhc3Qgb25lIHBpZSBwaWVjZT9cblxuXG5DUnAkNS5oYXNQaWUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcblxuICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5oYXNQaWU7XG59O1xuXG5DUnAkNS5kcmF3UGllID0gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUsIG5vZGVPcGFjaXR5LCBwb3MpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcmFkaXVzID0gTWF0aC5taW4obm9kZVcsIG5vZGVIKSAvIDI7IC8vIG11c3QgZml0IGluIG5vZGVcblxuICB2YXIgbGFzdFBlcmNlbnQgPSAwOyAvLyB3aGF0ICUgdG8gY29udGludWUgZHJhd2luZyBwaWUgc2xpY2VzIGZyb20gb24gWzAsIDFdXG5cbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuXG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG5cbiAgaWYgKHBpZVNpemUudW5pdHMgPT09ICclJykge1xuICAgIHJhZGl1cyA9IHJhZGl1cyAqIHBpZVNpemUucGZWYWx1ZTtcbiAgfSBlbHNlIGlmIChwaWVTaXplLnBmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJhZGl1cyA9IHBpZVNpemUucGZWYWx1ZSAvIDI7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMTsgaSA8PSBjeVN0eWxlLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICAvLyAxLi5OXG4gICAgdmFyIHNpemUgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnKS52YWx1ZTtcbiAgICB2YXIgY29sb3IgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZSgncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIG5vZGVPcGFjaXR5O1xuICAgIHZhciBwZXJjZW50ID0gc2l6ZSAvIDEwMDsgLy8gbWFwIGludGVnZXIgcmFuZ2UgWzAsIDEwMF0gdG8gWzAsIDFdXG4gICAgLy8gcGVyY2VudCBjYW4ndCBwdXNoIGJleW9uZCAxXG5cbiAgICBpZiAocGVyY2VudCArIGxhc3RQZXJjZW50ID4gMSkge1xuICAgICAgcGVyY2VudCA9IDEgLSBsYXN0UGVyY2VudDtcbiAgICB9XG5cbiAgICB2YXIgYW5nbGVTdGFydCA9IDEuNSAqIE1hdGguUEkgKyAyICogTWF0aC5QSSAqIGxhc3RQZXJjZW50OyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrIGFuZCBnbyBjbG9ja3dpc2VcblxuICAgIHZhciBhbmdsZURlbHRhID0gMiAqIE1hdGguUEkgKiBwZXJjZW50O1xuICAgIHZhciBhbmdsZUVuZCA9IGFuZ2xlU3RhcnQgKyBhbmdsZURlbHRhOyAvLyBpZ25vcmUgaWZcbiAgICAvLyAtIHplcm8gc2l6ZVxuICAgIC8vIC0gd2UncmUgYWxyZWFkeSBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgLy8gLSBhZGRpbmcgdGhlIGN1cnJlbnQgc2xpY2Ugd291bGQgZ28gYmV5b25kIHRoZSBmdWxsIGNpcmNsZVxuXG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgYW5nbGVTdGFydCwgYW5nbGVFbmQpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBsYXN0UGVyY2VudCArPSBwZXJjZW50O1xuICB9XG59O1xuXG52YXIgQ1JwJDYgPSB7fTtcbnZhciBtb3Rpb25CbHVyRGVsYXkgPSAxMDA7IC8vIHZhciBpc0ZpcmVmb3ggPSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnO1xuXG5DUnAkNi5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGV4dCA9IHRoaXMuZGF0YS5jb250ZXh0c1swXTtcblxuICBpZiAodGhpcy5mb3JjZWRQaXhlbFJhdGlvICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JjZWRQaXhlbFJhdGlvO1xuICB9XG5cbiAgdmFyIGJhY2tpbmdTdG9yZSA9IGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyBiYWNraW5nU3RvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn07XG5cbkNScCQ2LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNhY2hlID0gY2FjaGVzW2ldO1xuXG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIG5lZWRUb0NyZWF0ZUNhY2hlID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuXG4gIHJldHVybiBjYWNoZTtcbn07XG5cbkNScCQ2LmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IgPSBmdW5jdGlvbiAoY29udGV4dCwgc2hhcGVTdHlsZU5hbWUsIGVsZSwgZmlsbCwgb3BhY2l0eSkge1xuICB2YXIgZ3JhZGllbnRTdHlsZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgY29sb3JzID0gZWxlLnBzdHlsZShzaGFwZVN0eWxlTmFtZSArICctZ3JhZGllbnQtc3RvcC1jb2xvcnMnKS52YWx1ZSxcbiAgICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcblxuICBpZiAoZmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgICBlbmQgPSBlbGUudGFyZ2V0RW5kcG9pbnQoKSxcbiAgICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgICAgd2lkdGggPSBlbGUucGFkZGVkV2lkdGgoKSxcbiAgICAgICAgICBoZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCk7XG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVSYWRpYWxHcmFkaWVudChwb3MueCwgcG9zLnksIDAsIHBvcy54LCBwb3MueSwgTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICB2YXIgX3N0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuXG4gICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfc3RhcnQueCwgX3N0YXJ0LnksIF9lbmQueCwgX2VuZC55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9wb3MgPSB1c2VQYXRocyA/IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSA6IGVsZS5wb3NpdGlvbigpLFxuICAgICAgICAgIF93aWR0aCA9IGVsZS5wYWRkZWRXaWR0aCgpLFxuICAgICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgICAgaGFsZldpZHRoID0gX3dpZHRoIC8gMixcbiAgICAgICAgICBoYWxmSGVpZ2h0ID0gX2hlaWdodCAvIDI7XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuXG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0by1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54LCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54ICsgaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LWJvdHRvbSc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC1ib3R0b20nOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0by10b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtdG9wJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSArIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55IC0gaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgZ3JhZGllbnRTdHlsZS5hZGRDb2xvclN0b3AoaGFzUG9zaXRpb25zID8gcG9zaXRpb25zW2ldIDogaSAvIChsZW5ndGggLSAxKSwgJ3JnYmEoJyArIGNvbG9yc1tpXVswXSArICcsJyArIGNvbG9yc1tpXVsxXSArICcsJyArIGNvbG9yc1tpXVsyXSArICcsJyArIG9wYWNpdHkgKyAnKScpO1xuICB9XG5cbiAgcmV0dXJuIGdyYWRpZW50U3R5bGU7XG59O1xuXG5DUnAkNi5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuXG4gIGNvbnRleHQuZmlsbFN0eWxlID0gZ3JhZGllbnRTdHlsZTtcbn07XG5cbkNScCQ2LmNvbG9yRmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHIsIGcsIGIsIGEpIHtcbiAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJzsgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcbiAgLy8gaWYoIGNhY2hlLmZpbGxTdHlsZSAhPT0gZmlsbFN0eWxlICl7XG4gIC8vICAgY29udGV4dC5maWxsU3R5bGUgPSBjYWNoZS5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ2LmVsZUZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIG9wYWNpdHkpIHtcbiAgdmFyIGJhY2tncm91bmRGaWxsID0gZWxlLnBzdHlsZSgnYmFja2dyb3VuZC1maWxsJykudmFsdWU7XG5cbiAgaWYgKGJhY2tncm91bmRGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBiYWNrZ3JvdW5kRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50RmlsbFN0eWxlKGNvbnRleHQsIGVsZSwgYmFja2dyb3VuZEZpbGwsIG9wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBiYWNrZ3JvdW5kQ29sb3JbMF0sIGJhY2tncm91bmRDb2xvclsxXSwgYmFja2dyb3VuZENvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcblxuQ1JwJDYuZ3JhZGllbnRTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2xpbmUnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuXG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBncmFkaWVudFN0eWxlO1xufTtcblxuQ1JwJDYuY29sb3JTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJzsgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuICAvLyB2YXIgY2FjaGUgPSB0aGlzLnBhaW50Q2FjaGUoY29udGV4dCk7XG4gIC8vIHZhciBzdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyBpZiggY2FjaGUuc3Ryb2tlU3R5bGUgIT09IHN0cm9rZVN0eWxlICl7XG4gIC8vICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNhY2hlLnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ2LmVsZVN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgbGluZUZpbGwgPSBlbGUucHN0eWxlKCdsaW5lLWZpbGwnKS52YWx1ZTtcblxuICBpZiAobGluZUZpbGwgPT09ICdsaW5lYXItZ3JhZGllbnQnIHx8IGxpbmVGaWxsID09PSAncmFkaWFsLWdyYWRpZW50Jykge1xuICAgIHRoaXMuZ3JhZGllbnRTdHJva2VTdHlsZShjb250ZXh0LCBlbGUsIGxpbmVGaWxsLCBvcGFjaXR5KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZUNvbG9yID0gZWxlLnBzdHlsZSgnbGluZS1jb2xvcicpLnZhbHVlO1xuICAgIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBsaW5lQ29sb3JbMF0sIGxpbmVDb2xvclsxXSwgbGluZUNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTsgLy8gUmVzaXplIGNhbnZhc1xuXG5cbkNScCQ2Lm1hdGNoQ2FudmFzU2l6ZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIGJiID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IGJiWzJdO1xuICB2YXIgaGVpZ2h0ID0gYmJbM107XG4gIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBtYlB4UmF0aW8gPSByLm1vdGlvbkJsdXJQeFJhdGlvO1xuXG4gIGlmIChjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRhaW5lciA9PT0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR10pIHtcbiAgICBwaXhlbFJhdGlvID0gbWJQeFJhdGlvO1xuICB9XG5cbiAgdmFyIGNhbnZhc1dpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuICB2YXIgY2FudmFzSGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcbiAgdmFyIGNhbnZhcztcblxuICBpZiAoY2FudmFzV2lkdGggPT09IHIuY2FudmFzV2lkdGggJiYgY2FudmFzSGVpZ2h0ID09PSByLmNhbnZhc0hlaWdodCkge1xuICAgIHJldHVybjsgLy8gc2F2ZSBjeWNsZXMgaWYgc2FtZVxuICB9XG5cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHIuQ0FOVkFTX0xBWUVSUzsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5jYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cblxuICByLnRleHR1cmVNdWx0ID0gMTtcblxuICBpZiAocGl4ZWxSYXRpbyA8PSAxKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICByLnRleHR1cmVNdWx0ID0gMjtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQ7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodCAqIHIudGV4dHVyZU11bHQ7XG4gIH1cblxuICByLmNhbnZhc1dpZHRoID0gY2FudmFzV2lkdGg7XG4gIHIuY2FudmFzSGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xufTtcblxuQ1JwJDYucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5cbkNScCQ2LnJlbmRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHN0YXRpY0VtcHR5T2JqZWN0KCk7XG4gIHZhciBmb3JjZWRDb250ZXh0ID0gb3B0aW9ucy5mb3JjZWRDb250ZXh0O1xuICB2YXIgZHJhd0FsbExheWVycyA9IG9wdGlvbnMuZHJhd0FsbExheWVycztcbiAgdmFyIGRyYXdPbmx5Tm9kZUxheWVyID0gb3B0aW9ucy5kcmF3T25seU5vZGVMYXllcjtcbiAgdmFyIGZvcmNlZFpvb20gPSBvcHRpb25zLmZvcmNlZFpvb207XG4gIHZhciBmb3JjZWRQYW4gPSBvcHRpb25zLmZvcmNlZFBhbjtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcGl4ZWxSYXRpbyA9IG9wdGlvbnMuZm9yY2VkUHhSYXRpbyA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXRQaXhlbFJhdGlvKCkgOiBvcHRpb25zLmZvcmNlZFB4UmF0aW87XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBkYXRhID0gci5kYXRhO1xuICB2YXIgbmVlZERyYXcgPSBkYXRhLmNhbnZhc05lZWRzUmVkcmF3O1xuICB2YXIgdGV4dHVyZURyYXcgPSByLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0ICYmIChyLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcpO1xuICB2YXIgbW90aW9uQmx1ciA9IG9wdGlvbnMubW90aW9uQmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tb3Rpb25CbHVyIDogci5tb3Rpb25CbHVyO1xuICB2YXIgbWJQeFJhdGlvID0gci5tb3Rpb25CbHVyUHhSYXRpbztcbiAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBpbk5vZGVEcmFnR2VzdHVyZSA9IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcztcbiAgdmFyIGluQm94U2VsZWN0aW9uID0gci5ob3ZlckRhdGEuc2VsZWN0aW5nIHx8IHIudG91Y2hEYXRhLnNlbGVjdGluZyA/IHRydWUgOiBmYWxzZTtcbiAgbW90aW9uQmx1ciA9IG1vdGlvbkJsdXIgJiYgIWZvcmNlZENvbnRleHQgJiYgci5tb3Rpb25CbHVyRW5hYmxlZCAmJiAhaW5Cb3hTZWxlY3Rpb247XG4gIHZhciBtb3Rpb25CbHVyRmFkZUVmZmVjdCA9IG1vdGlvbkJsdXI7XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgaWYgKHIucHJldlB4UmF0aW8gIT09IHBpeGVsUmF0aW8pIHtcbiAgICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gICAgICByLm1hdGNoQ2FudmFzU2l6ZShyLmNvbnRhaW5lcik7XG4gICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgIH1cblxuICAgIHIucHJldlB4UmF0aW8gPSBwaXhlbFJhdGlvO1xuICB9XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1clRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoci5tb3Rpb25CbHVyVGltZW91dCk7XG4gIH1cblxuICBpZiAobW90aW9uQmx1cikge1xuICAgIGlmIChyLm1iRnJhbWVzID09IG51bGwpIHtcbiAgICAgIHIubWJGcmFtZXMgPSAwO1xuICAgIH1cblxuICAgIHIubWJGcmFtZXMrKztcblxuICAgIGlmIChyLm1iRnJhbWVzIDwgMykge1xuICAgICAgLy8gbmVlZCBzZXZlcmFsIGZyYW1lcyBiZWZvcmUgZXZlbiBoaWdoIHF1YWxpdHkgbW90aW9uYmx1clxuICAgICAgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBmYWxzZTtcbiAgICB9IC8vIGdvIHRvIGxvd2VyIHF1YWxpdHkgYmx1cnJ5IGZyYW1lcyB3aGVuIHNldmVyYWwgbS9iIGZyYW1lcyBoYXZlIGJlZW4gcmVuZGVyZWQgKGF2b2lkcyBmbGFzaGluZylcblxuXG4gICAgaWYgKHIubWJGcmFtZXMgPiByLm1pbk1iTG93UXVhbEZyYW1lcykge1xuICAgICAgLy9yLmZ1bGxRdWFsaXR5TWIgPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSByLm1iUHhSQmx1cnJ5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChyLmNsZWFyaW5nTW90aW9uQmx1cikge1xuICAgIHIubW90aW9uQmx1clB4UmF0aW8gPSAxO1xuICB9IC8vIGIvYyBkcmF3VG9Db250ZXh0KCkgbWF5IGJlIGFzeW5jIHcuci50LiByZWRyYXcoKSwga2VlcCB0cmFjayBvZiBsYXN0IHRleHR1cmUgZnJhbWVcbiAgLy8gYmVjYXVzZSBhIHJvZ3VlIGFzeW5jIHRleHR1cmUgZnJhbWUgd291bGQgY2xlYXIgbmVlZERyYXdcblxuXG4gIGlmIChyLnRleHR1cmVEcmF3TGFzdEZyYW1lICYmICF0ZXh0dXJlRHJhdykge1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSB0cnVlO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gIHZhciBlZmZlY3RpdmVab29tID0gZm9yY2VkWm9vbSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkWm9vbSA6IHpvb207XG4gIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgdmFyIGVmZmVjdGl2ZVBhbiA9IHtcbiAgICB4OiBwYW4ueCxcbiAgICB5OiBwYW4ueVxuICB9O1xuICB2YXIgdnAgPSB7XG4gICAgem9vbTogem9vbSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBhbi54LFxuICAgICAgeTogcGFuLnlcbiAgICB9XG4gIH07XG4gIHZhciBwcmV2VnAgPSByLnByZXZWaWV3cG9ydDtcbiAgdmFyIHZpZXdwb3J0SXNEaWZmID0gcHJldlZwID09PSB1bmRlZmluZWQgfHwgdnAuem9vbSAhPT0gcHJldlZwLnpvb20gfHwgdnAucGFuLnggIT09IHByZXZWcC5wYW4ueCB8fCB2cC5wYW4ueSAhPT0gcHJldlZwLnBhbi55OyAvLyB3ZSB3YW50IHRoZSBsb3cgcXVhbGl0eSBtb3Rpb25ibHVyIG9ubHkgd2hlbiB0aGUgdmlld3BvcnQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgZXRjICh3aGVyZSBpdCdzIG5vdCBub3RpY2VkKVxuXG4gIGlmICghdmlld3BvcnRJc0RpZmYgJiYgIShpbk5vZGVEcmFnR2VzdHVyZSAmJiAhaGFzQ29tcG91bmROb2RlcykpIHtcbiAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gMTtcbiAgfVxuXG4gIGlmIChmb3JjZWRQYW4pIHtcbiAgICBlZmZlY3RpdmVQYW4gPSBmb3JjZWRQYW47XG4gIH0gLy8gYXBwbHkgcGl4ZWwgcmF0aW9cblxuXG4gIGVmZmVjdGl2ZVpvb20gKj0gcGl4ZWxSYXRpbztcbiAgZWZmZWN0aXZlUGFuLnggKj0gcGl4ZWxSYXRpbztcbiAgZWZmZWN0aXZlUGFuLnkgKj0gcGl4ZWxSYXRpbztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG5cbiAgZnVuY3Rpb24gbWJjbGVhcihjb250ZXh0LCB4LCB5LCB3LCBoKSB7XG4gICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kpO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSwgdywgaCk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH1cblxuICBmdW5jdGlvbiBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGNsZWFyKSB7XG4gICAgdmFyIGVQYW4sIGVab29tLCB3LCBoO1xuXG4gICAgaWYgKCFyLmNsZWFyaW5nTW90aW9uQmx1ciAmJiAoY29udGV4dCA9PT0gZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdIHx8IGNvbnRleHQgPT09IGRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXSkpIHtcbiAgICAgIGVQYW4gPSB7XG4gICAgICAgIHg6IHBhbi54ICogbWJQeFJhdGlvLFxuICAgICAgICB5OiBwYW4ueSAqIG1iUHhSYXRpb1xuICAgICAgfTtcbiAgICAgIGVab29tID0gem9vbSAqIG1iUHhSYXRpbztcbiAgICAgIHcgPSByLmNhbnZhc1dpZHRoICogbWJQeFJhdGlvO1xuICAgICAgaCA9IHIuY2FudmFzSGVpZ2h0ICogbWJQeFJhdGlvO1xuICAgIH0gZWxzZSB7XG4gICAgICBlUGFuID0gZWZmZWN0aXZlUGFuO1xuICAgICAgZVpvb20gPSBlZmZlY3RpdmVab29tO1xuICAgICAgdyA9IHIuY2FudmFzV2lkdGg7XG4gICAgICBoID0gci5jYW52YXNIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG5cbiAgICBpZiAoY2xlYXIgPT09ICdtb3Rpb25CbHVyJykge1xuICAgICAgbWJjbGVhcihjb250ZXh0LCAwLCAwLCB3LCBoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JjZWRDb250ZXh0ICYmIChjbGVhciA9PT0gdW5kZWZpbmVkIHx8IGNsZWFyKSkge1xuICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG4gICAgfVxuXG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShlUGFuLngsIGVQYW4ueSk7XG4gICAgICBjb250ZXh0LnNjYWxlKGVab29tLCBlWm9vbSk7XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlZFBhbikge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZm9yY2VkUGFuLngsIGZvcmNlZFBhbi55KTtcbiAgICB9XG5cbiAgICBpZiAoZm9yY2VkWm9vbSkge1xuICAgICAgY29udGV4dC5zY2FsZShmb3JjZWRab29tLCBmb3JjZWRab29tKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IHRydWU7XG5cbiAgICBpZiAoIXIudGV4dHVyZUNhY2hlKSB7XG4gICAgICByLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgICAgci50ZXh0dXJlQ2FjaGUuYmIgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5ib3VuZGluZ0JveCgpO1xuICAgICAgci50ZXh0dXJlQ2FjaGUudGV4dHVyZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLlRFWFRVUkVfQlVGRkVSXTtcbiAgICAgIHZhciBjeHQgPSByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3h0LmNsZWFyUmVjdCgwLCAwLCByLmNhbnZhc1dpZHRoICogci50ZXh0dXJlTXVsdCwgci5jYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0KTtcbiAgICAgIHIucmVuZGVyKHtcbiAgICAgICAgZm9yY2VkQ29udGV4dDogY3h0LFxuICAgICAgICBkcmF3T25seU5vZGVMYXllcjogdHJ1ZSxcbiAgICAgICAgZm9yY2VkUHhSYXRpbzogcGl4ZWxSYXRpbyAqIHIudGV4dHVyZU11bHRcbiAgICAgIH0pO1xuICAgICAgdmFyIHZwID0gci50ZXh0dXJlQ2FjaGUudmlld3BvcnQgPSB7XG4gICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgcGFuOiBjeS5wYW4oKSxcbiAgICAgICAgd2lkdGg6IHIuY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogci5jYW52YXNIZWlnaHRcbiAgICAgIH07XG4gICAgICB2cC5tcGFuID0ge1xuICAgICAgICB4OiAoMCAtIHZwLnBhbi54KSAvIHZwLnpvb20sXG4gICAgICAgIHk6ICgwIC0gdnAucGFuLnkpIC8gdnAuem9vbVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIHZhciBjb250ZXh0ID0gZGF0YS5jb250ZXh0c1tyLk5PREVdO1xuICAgIHZhciB0ZXh0dXJlID0gci50ZXh0dXJlQ2FjaGUudGV4dHVyZTtcbiAgICB2YXIgdnAgPSByLnRleHR1cmVDYWNoZS52aWV3cG9ydDtcbiAgICBjb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblxuICAgIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgICBtYmNsZWFyKGNvbnRleHQsIDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0c2lkZUJnQ29sb3IgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3V0c2lkZUJnT3BhY2l0eSA9IHN0eWxlLmNvcmUoJ291dHNpZGUtdGV4dHVyZS1iZy1vcGFjaXR5JykudmFsdWU7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBvdXRzaWRlQmdDb2xvclswXSwgb3V0c2lkZUJnQ29sb3JbMV0sIG91dHNpZGVCZ0NvbG9yWzJdLCBvdXRzaWRlQmdPcGFjaXR5KTtcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgZmFsc2UpO1xuICAgIGNvbnRleHQuY2xlYXJSZWN0KHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UodGV4dHVyZSwgdnAubXBhbi54LCB2cC5tcGFuLnksIHZwLndpZHRoIC8gdnAuem9vbSAvIHBpeGVsUmF0aW8sIHZwLmhlaWdodCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvKTtcbiAgfSBlbHNlIGlmIChyLnRleHR1cmVPblZpZXdwb3J0ICYmICFmb3JjZWRDb250ZXh0KSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRcbiAgICByLnRleHR1cmVDYWNoZSA9IG51bGw7XG4gIH1cblxuICB2YXIgZXh0ZW50ID0gY3kuZXh0ZW50KCk7XG4gIHZhciB2cE1hbmlwID0gci5waW5jaGluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZyB8fCByLnN3aXBlUGFubmluZyB8fCByLmRhdGEud2hlZWxab29taW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyB8fCByLmN5LmFuaW1hdGVkKCk7XG4gIHZhciBoaWRlRWRnZXMgPSByLmhpZGVFZGdlc09uVmlld3BvcnQgJiYgdnBNYW5pcDtcbiAgdmFyIG5lZWRNYkNsZWFyID0gW107XG4gIG5lZWRNYkNsZWFyW3IuTk9ERV0gPSAhbmVlZERyYXdbci5OT0RFXSAmJiBtb3Rpb25CbHVyICYmICFyLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gfHwgci5jbGVhcmluZ01vdGlvbkJsdXI7XG5cbiAgaWYgKG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSB0cnVlO1xuICB9XG5cbiAgbmVlZE1iQ2xlYXJbci5EUkFHXSA9ICFuZWVkRHJhd1tyLkRSQUddICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcblxuICBpZiAobmVlZE1iQ2xlYXJbci5EUkFHXSkge1xuICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5EUkFHXSA9IHRydWU7XG4gIH1cblxuICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBkcmF3QWxsTGF5ZXJzIHx8IGRyYXdPbmx5Tm9kZUxheWVyIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5OT0RFXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSA6IGRhdGEuY29udGV4dHNbci5OT0RFXSk7XG4gICAgdmFyIGNsZWFyID0gbW90aW9uQmx1ciAmJiAhdXNlQnVmZmVyID8gJ21vdGlvbkJsdXInIDogdW5kZWZpbmVkO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgY2xlYXIpO1xuXG4gICAgaWYgKGhpZGVFZGdlcykge1xuICAgICAgci5kcmF3Q2FjaGVkTm9kZXMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByLmRyYXdMYXllcmVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5ub25kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cblxuICAgIGlmIChyLmRlYnVnKSB7XG4gICAgICByLmRyYXdEZWJ1Z1BvaW50cyhjb250ZXh0LCBlbGVzLm5vbmRyYWcpO1xuICAgIH1cblxuICAgIGlmICghZHJhd0FsbExheWVycyAmJiAhbW90aW9uQmx1cikge1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZHJhd09ubHlOb2RlTGF5ZXIgJiYgKG5lZWREcmF3W3IuRFJBR10gfHwgZHJhd0FsbExheWVycyB8fCBuZWVkTWJDbGVhcltyLkRSQUddKSkge1xuICAgIHZhciB1c2VCdWZmZXIgPSBtb3Rpb25CbHVyICYmICFuZWVkTWJDbGVhcltyLkRSQUddICYmIG1iUHhSYXRpbyAhPT0gMTtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgKHVzZUJ1ZmZlciA/IHIuZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddIDogZGF0YS5jb250ZXh0c1tyLkRSQUddKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIG1vdGlvbkJsdXIgJiYgIXVzZUJ1ZmZlciA/ICdtb3Rpb25CbHVyJyA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoaGlkZUVkZ2VzKSB7XG4gICAgICByLmRyYXdDYWNoZWROb2Rlcyhjb250ZXh0LCBlbGVzLmRyYWcsIHBpeGVsUmF0aW8sIGV4dGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMuZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5kcmFnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMgJiYgIW1vdGlvbkJsdXIpIHtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAoci5zaG93RnBzIHx8ICFkcmF3T25seU5vZGVMYXllciAmJiBuZWVkRHJhd1tyLlNFTEVDVF9CT1hdICYmICFkcmF3QWxsTGF5ZXJzKSB7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8IGRhdGEuY29udGV4dHNbci5TRUxFQ1RfQk9YXTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQpO1xuXG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG5cbiAgICAgIGlmIChib3JkZXJXaWR0aCA+IDApIHtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwb3MgPSBkYXRhLmJnQWN0aXZlUG9zaXN0aW9uO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMF0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVsxXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLW9wYWNpdHknKS52YWx1ZSArICcpJztcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICBjb250ZXh0LmFyYyhwb3MueCwgcG9zLnksIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1zaXplJykucGZWYWx1ZSAvIHpvb20sIDAsIDIgKiBNYXRoLlBJKTtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cblxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuXG4gICAgaWYgKHIuc2hvd0ZwcyAmJiB0aW1lVG9SZW5kZXIpIHtcbiAgICAgIHRpbWVUb1JlbmRlciA9IE1hdGgucm91bmQodGltZVRvUmVuZGVyKTtcbiAgICAgIHZhciBmcHMgPSBNYXRoLnJvdW5kKDEwMDAgLyB0aW1lVG9SZW5kZXIpO1xuICAgICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKDI1NSwgMCwgMCwgMC43NSknO1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgICAgY29udGV4dC5maWxsVGV4dCgnMSBmcmFtZSA9ICcgKyB0aW1lVG9SZW5kZXIgKyAnIG1zID0gJyArIGZwcyArICcgZnBzJywgMCwgMjApO1xuICAgICAgdmFyIG1heEZwcyA9IDYwO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDMwLCAyNTAsIDIwKTtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMzAsIDI1MCAqIE1hdGgubWluKGZwcyAvIG1heEZwcywgMSksIDIwKTtcbiAgICB9XG5cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSBmYWxzZTtcbiAgICB9XG4gIH0gLy8gbW90aW9uYmx1cjogYmxpdCByZW5kZXJlZCBibHVycnkgZnJhbWVzXG5cblxuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG5cbiAgICB2YXIgZHJhd01vdGlvbkJsdXIgPSBmdW5jdGlvbiBkcmF3TW90aW9uQmx1cihjeHQsIHR4dCwgbmVlZENsZWFyKSB7XG4gICAgICBjeHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXG4gICAgICBpZiAobmVlZENsZWFyIHx8ICFtb3Rpb25CbHVyRmFkZUVmZmVjdCkge1xuICAgICAgICBjeHQuY2xlYXJSZWN0KDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1iY2xlYXIoY3h0LCAwLCAwLCByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCwgLy8gaW1nXG4gICAgICAwLCAwLCAvLyBzeCwgc3lcbiAgICAgIHIuY2FudmFzV2lkdGggKiBweHIsIHIuY2FudmFzSGVpZ2h0ICogcHhyLCAvLyBzdywgc2hcbiAgICAgIDAsIDAsIC8vIHgsIHlcbiAgICAgIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0IC8vIHcsIGhcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChuZWVkRHJhd1tyLk5PREVdIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dE5vZGUsIHR4dE5vZGUsIG5lZWRNYkNsZWFyW3IuTk9ERV0pO1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChuZWVkRHJhd1tyLkRSQUddIHx8IG5lZWRNYkNsZWFyW3IuRFJBR10pIHtcbiAgICAgIGRyYXdNb3Rpb25CbHVyKGN4dERyYWcsIHR4dERyYWcsIG5lZWRNYkNsZWFyW3IuRFJBR10pO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHIucHJldlZpZXdwb3J0ID0gdnA7XG5cbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICByLm1vdGlvbkJsdXJDbGVhcmVkID0gdHJ1ZTtcbiAgICByLm1vdGlvbkJsdXIgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG1vdGlvbkJsdXIpIHtcbiAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByLm1vdGlvbkJsdXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSA9IGZhbHNlO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXIgPSBmYWxzZTtcbiAgICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gIXRleHR1cmVEcmF3O1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgICBuZWVkRHJhd1tyLk5PREVdID0gdHJ1ZTtcbiAgICAgIG5lZWREcmF3W3IuRFJBR10gPSB0cnVlO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9LCBtb3Rpb25CbHVyRGVsYXkpO1xuICB9XG5cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgY3kuZW1pdCgncmVuZGVyJyk7XG4gIH1cbn07XG5cbnZhciBDUnAkNyA9IHt9OyAvLyBATyBQb2x5Z29uIGRyYXdpbmdcblxuQ1JwJDcuZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cykge1xuICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG5cbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIGNvbnRleHQubW92ZVRvKHggKyBoYWxmVyAqIHBvaW50c1swXSwgeSArIGhhbGZIICogcG9pbnRzWzFdKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZlcgKiBwb2ludHNbaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbaSAqIDIgKyAxXSk7XG4gIH1cblxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuQ1JwJDcuZHJhd1JvdW5kUG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUG9seWdvblJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyA0OyBfaSsrKSB7XG4gICAgdmFyIHNvdXJjZVV2ID0gdm9pZCAwLFxuICAgICAgICBkZXN0VXYgPSB2b2lkIDA7XG5cbiAgICBpZiAoX2kgPT09IDApIHtcbiAgICAgIHNvdXJjZVV2ID0gcG9pbnRzLmxlbmd0aCAtIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZVV2ID0gX2kgKiA0IC0gMjtcbiAgICB9XG5cbiAgICBkZXN0VXYgPSBfaSAqIDQgKyAyO1xuICAgIHZhciBweCA9IHggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDRdO1xuICAgIHZhciBweSA9IHkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDQgKyAxXTtcbiAgICB2YXIgY29zVGhldGEgPSAtcG9pbnRzW3NvdXJjZVV2XSAqIHBvaW50c1tkZXN0VXZdIC0gcG9pbnRzW3NvdXJjZVV2ICsgMV0gKiBwb2ludHNbZGVzdFV2ICsgMV07XG4gICAgdmFyIG9mZnNldCA9IGNvcm5lclJhZGl1cyAvIE1hdGgudGFuKE1hdGguYWNvcyhjb3NUaGV0YSkgLyAyKTtcbiAgICB2YXIgY3AweCA9IHB4IC0gb2Zmc2V0ICogcG9pbnRzW3NvdXJjZVV2XTtcbiAgICB2YXIgY3AweSA9IHB5IC0gb2Zmc2V0ICogcG9pbnRzW3NvdXJjZVV2ICsgMV07XG4gICAgdmFyIGNwMXggPSBweCArIG9mZnNldCAqIHBvaW50c1tkZXN0VXZdO1xuICAgIHZhciBjcDF5ID0gcHkgKyBvZmZzZXQgKiBwb2ludHNbZGVzdFV2ICsgMV07XG5cbiAgICBpZiAoX2kgPT09IDApIHtcbiAgICAgIGNvbnRleHQubW92ZVRvKGNwMHgsIGNwMHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVUbyhjcDB4LCBjcDB5KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFyY1RvKHB4LCBweSwgY3AxeCwgY3AxeSwgY29ybmVyUmFkaXVzKTtcbiAgfVxuXG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59OyAvLyBSb3VuZCByZWN0YW5nbGUgZHJhd2luZ1xuXG5cbkNScCQ3LmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gIHZhciBjb3JuZXJSYWRpdXMgPSBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9IC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcblxuXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTsgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG5cbiAgY29udGV4dC5hcmNUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTsgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cblxuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTsgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7IC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcblxuICBjb250ZXh0LmFyY1RvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTsgLy8gSm9pbiBsaW5lXG5cbiAgY29udGV4dC5saW5lVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuQ1JwJDcuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH0gLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuXG5cbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkpO1xuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuXG5DUnAkNy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lckxlbmd0aCA9IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpO1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICBjb250ZXh0Lm1vdmVUbyh4IC0gaGFsZldpZHRoICsgY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSArIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbkNScCQ3LmRyYXdCYXJyZWxQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgeEJlZ2luID0geCAtIGhhbGZXaWR0aDtcbiAgdmFyIHhFbmQgPSB4ICsgaGFsZldpZHRoO1xuICB2YXIgeUJlZ2luID0geSAtIGhhbGZIZWlnaHQ7XG4gIHZhciB5RW5kID0geSArIGhhbGZIZWlnaHQ7XG4gIHZhciBiYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICB2YXIgd09mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICB2YXIgaE9mZnNldCA9IGJhcnJlbEN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgdmFyIGN0cmxQdFhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3T2Zmc2V0O1xuXG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICBjb250ZXh0Lm1vdmVUbyh4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiArIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kIC0gd09mZnNldCwgeUVuZCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCwgeUVuZCAtIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxudmFyIHNpbjAgPSBNYXRoLnNpbigwKTtcbnZhciBjb3MwID0gTWF0aC5jb3MoMCk7XG52YXIgc2luID0ge307XG52YXIgY29zID0ge307XG52YXIgZWxsaXBzZVN0ZXBTaXplID0gTWF0aC5QSSAvIDQwO1xuXG5mb3IgKHZhciBpID0gMCAqIE1hdGguUEk7IGkgPCAyICogTWF0aC5QSTsgaSArPSBlbGxpcHNlU3RlcFNpemUpIHtcbiAgc2luW2ldID0gTWF0aC5zaW4oaSk7XG4gIGNvc1tpXSA9IE1hdGguY29zKGkpO1xufVxuXG5DUnAkNy5kcmF3RWxsaXBzZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuZWxsaXBzZSkge1xuICAgIGNvbnRleHQuZWxsaXBzZShjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDAsIDAsIDIgKiBNYXRoLlBJKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgeFBvcywgeVBvcztcbiAgICB2YXIgcncgPSB3aWR0aCAvIDI7XG4gICAgdmFyIHJoID0gaGVpZ2h0IC8gMjtcblxuICAgIGZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICAgICAgeFBvcyA9IGNlbnRlclggLSBydyAqIHNpbltpXSAqIHNpbjAgKyBydyAqIGNvc1tpXSAqIGNvczA7XG4gICAgICB5UG9zID0gY2VudGVyWSArIHJoICogY29zW2ldICogc2luMCArIHJoICogc2luW2ldICogY29zMDtcblxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLyogZ2xvYmFsIGF0b2IsIEFycmF5QnVmZmVyLCBVaW50OEFycmF5LCBCbG9iICovXG52YXIgQ1JwJDggPSB7fTtcblxuQ1JwJDguY3JlYXRlQnVmZmVyID0gZnVuY3Rpb24gKHcsIGgpIHtcbiAgdmFyIGJ1ZmZlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuXG5DUnAkOC5idWZmZXJDYW52YXNJbWFnZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3k7XG4gIHZhciBlbGVzID0gY3kubXV0YWJsZUVsZW1lbnRzKCk7XG4gIHZhciBiYiA9IGVsZXMuYm91bmRpbmdCb3goKTtcbiAgdmFyIGN0clJlY3QgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIHdpZHRoID0gb3B0aW9ucy5mdWxsID8gTWF0aC5jZWlsKGJiLncpIDogY3RyUmVjdFsyXTtcbiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi5oKSA6IGN0clJlY3RbM107XG4gIHZhciBzcGVjZE1heERpbXMgPSBudW1iZXIob3B0aW9ucy5tYXhXaWR0aCkgfHwgbnVtYmVyKG9wdGlvbnMubWF4SGVpZ2h0KTtcbiAgdmFyIHB4UmF0aW8gPSB0aGlzLmdldFBpeGVsUmF0aW8oKTtcbiAgdmFyIHNjYWxlID0gMTtcblxuICBpZiAob3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2lkdGggKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBoZWlnaHQgKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGU7XG4gIH0gZWxzZSBpZiAoc3BlY2RNYXhEaW1zKSB7XG4gICAgdmFyIG1heFNjYWxlVyA9IEluZmluaXR5O1xuICAgIHZhciBtYXhTY2FsZUggPSBJbmZpbml0eTtcblxuICAgIGlmIChudW1iZXIob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cblxuICAgIGlmIChudW1iZXIob3B0aW9ucy5tYXhIZWlnaHQpKSB7XG4gICAgICBtYXhTY2FsZUggPSBzY2FsZSAqIG9wdGlvbnMubWF4SGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cblxuICAgIHNjYWxlID0gTWF0aC5taW4obWF4U2NhbGVXLCBtYXhTY2FsZUgpO1xuICAgIHdpZHRoICo9IHNjYWxlO1xuICAgIGhlaWdodCAqPSBzY2FsZTtcbiAgfVxuXG4gIGlmICghc3BlY2RNYXhEaW1zKSB7XG4gICAgd2lkdGggKj0gcHhSYXRpbztcbiAgICBoZWlnaHQgKj0gcHhSYXRpbztcbiAgICBzY2FsZSAqPSBweFJhdGlvO1xuICB9XG5cbiAgdmFyIGJ1ZmZDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGJ1ZmZDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgYnVmZkNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGJ1ZmZDYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGJ1ZmZDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdmFyIGJ1ZmZDeHQgPSBidWZmQ2FudmFzLmdldENvbnRleHQoJzJkJyk7IC8vIFJhc3Rlcml6ZSB0aGUgbGF5ZXJzLCBidXQgb25seSBpZiBjb250YWluZXIgaGFzIG5vbnplcm8gc2l6ZVxuXG4gIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgIGJ1ZmZDeHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB2YXIgenNvcnRlZEVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG5cbiAgICBpZiAob3B0aW9ucy5mdWxsKSB7XG4gICAgICAvLyBkcmF3IHRoZSBmdWxsIGJvdW5kcyBvZiB0aGUgZ3JhcGhcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKC1iYi54MSAqIHNjYWxlLCAtYmIueTEgKiBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgICB0aGlzLmRyYXdFbGVtZW50cyhidWZmQ3h0LCB6c29ydGVkRWxlcyk7XG4gICAgICBidWZmQ3h0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKGJiLngxICogc2NhbGUsIGJiLnkxICogc2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkcmF3IHRoZSBjdXJyZW50IHZpZXdcbiAgICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICAgIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICAgICAgeDogcGFuLnggKiBzY2FsZSxcbiAgICAgICAgeTogcGFuLnkgKiBzY2FsZVxuICAgICAgfTtcbiAgICAgIHNjYWxlICo9IGN5Lnpvb20oKTtcbiAgICAgIGJ1ZmZDeHQudHJhbnNsYXRlKHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnkpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtdHJhbnNsYXRpb24ueCwgLXRyYW5zbGF0aW9uLnkpO1xuICAgIH0gLy8gbmVlZCB0byBmaWxsIGJnIGF0IGVuZCBsaWtlIHRoaXMgaW4gb3JkZXIgdG8gZmlsbCBjbGVhcmVkIHRyYW5zcGFyZW50IHBpeGVscyBpbiBqcGdzXG5cblxuICAgIGlmIChvcHRpb25zLmJnKSB7XG4gICAgICBidWZmQ3h0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdmVyJztcbiAgICAgIGJ1ZmZDeHQuZmlsbFN0eWxlID0gb3B0aW9ucy5iZztcbiAgICAgIGJ1ZmZDeHQucmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJ1ZmZDeHQuZmlsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWZmQ2FudmFzO1xufTtcblxuZnVuY3Rpb24gYjY0VG9CbG9iKGI2NCwgbWltZVR5cGUpIHtcbiAgdmFyIGJ5dGVzID0gYXRvYihiNjQpO1xuICB2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICB2YXIgYnVmZlVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZVaW50OFtpXSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoW2J1ZmZdLCB7XG4gICAgdHlwZTogbWltZVR5cGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGI2NFVyaVRvQjY0KGI2NHVyaSkge1xuICB2YXIgaSA9IGI2NHVyaS5pbmRleE9mKCcsJyk7XG4gIHJldHVybiBiNjR1cmkuc3Vic3RyKGkgKyAxKTtcbn1cblxuZnVuY3Rpb24gb3V0cHV0KG9wdGlvbnMsIGNhbnZhcywgbWltZVR5cGUpIHtcbiAgdmFyIGdldEI2NFVyaSA9IGZ1bmN0aW9uIGdldEI2NFVyaSgpIHtcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgfTtcblxuICBzd2l0Y2ggKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgY2FzZSAnYmxvYi1wcm9taXNlJzpcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYW52YXMudG9CbG9iKGZ1bmN0aW9uIChibG9iKSB7XG4gICAgICAgICAgICBpZiAoYmxvYiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdgY2FudmFzLnRvQmxvYigpYCBzZW50IGEgbnVsbCB2YWx1ZSBpbiBpdHMgY2FsbGJhY2snKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgbWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgcmV0dXJuIGI2NFRvQmxvYihiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSksIG1pbWVUeXBlKTtcblxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICByZXR1cm4gYjY0VXJpVG9CNjQoZ2V0QjY0VXJpKCkpO1xuXG4gICAgY2FzZSAnYmFzZTY0dXJpJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldEI2NFVyaSgpO1xuICB9XG59XG5cbkNScCQ4LnBuZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL3BuZycpO1xufTtcblxuQ1JwJDguanBnID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG91dHB1dChvcHRpb25zLCB0aGlzLmJ1ZmZlckNhbnZhc0ltYWdlKG9wdGlvbnMpLCAnaW1hZ2UvanBlZycpO1xufTtcblxudmFyIENScCQ5ID0ge307XG5cbkNScCQ5Lm5vZGVTaGFwZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ2VsbGlwc2UnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0VsbGlwc2VQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcblxuICAgIGNhc2UgJ3JvdW5kLXBvbHlnb24nOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd1JvdW5kUG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcblxuICAgIGNhc2UgJ3JvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdyb3VuZC1yZWN0YW5nbGUnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGNhc2UgJ2N1dHJlY3RhbmdsZSc6XG4gICAgY2FzZSAnY3V0LXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBjYXNlICdiYXJyZWwnOlxuICAgICAgcmV0dXJuIHRoaXMuZHJhd0JhcnJlbFBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cbn07XG5cbnZhciBDUiA9IENhbnZhc1JlbmRlcmVyO1xudmFyIENScCRhID0gQ2FudmFzUmVuZGVyZXIucHJvdG90eXBlO1xuQ1JwJGEuQ0FOVkFTX0xBWUVSUyA9IDM7IC8vXG5cbkNScCRhLlNFTEVDVF9CT1ggPSAwO1xuQ1JwJGEuRFJBRyA9IDE7XG5DUnAkYS5OT0RFID0gMjtcbkNScCRhLkJVRkZFUl9DT1VOVCA9IDM7IC8vXG5cbkNScCRhLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScCRhLk1PVElPTkJMVVJfQlVGRkVSX05PREUgPSAxO1xuQ1JwJGEuTU9USU9OQkxVUl9CVUZGRVJfRFJBRyA9IDI7XG5cbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLmRhdGEgPSB7XG4gICAgY2FudmFzZXM6IG5ldyBBcnJheShDUnAkYS5DQU5WQVNfTEFZRVJTKSxcbiAgICBjb250ZXh0czogbmV3IEFycmF5KENScCRhLkNBTlZBU19MQVlFUlMpLFxuICAgIGNhbnZhc05lZWRzUmVkcmF3OiBuZXcgQXJyYXkoQ1JwJGEuQ0FOVkFTX0xBWUVSUyksXG4gICAgYnVmZmVyQ2FudmFzZXM6IG5ldyBBcnJheShDUnAkYS5CVUZGRVJfQ09VTlQpLFxuICAgIGJ1ZmZlckNvbnRleHRzOiBuZXcgQXJyYXkoQ1JwJGEuQ0FOVkFTX0xBWUVSUylcbiAgfTtcbiAgdmFyIHRhcEhsT2ZmQXR0ciA9ICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InO1xuICB2YXIgdGFwSGxPZmZTdHlsZSA9ICdyZ2JhKDAsMCwwLDApJztcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZTtcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgY29udGFpbmVyU3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICBjb250YWluZXJTdHlsZS56SW5kZXggPSAnMCc7XG4gIGNvbnRhaW5lclN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIHZhciBjb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmNhbnZhc0NvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgdmFyIHN0eWxlTWFwID0ge1xuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJy1tb3otbm9uZScsXG4gICAgJ3VzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InOiAncmdiYSgwLDAsMCwwKScsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnbm9uZSdcbiAgfTtcblxuICBpZiAobXMoKSkge1xuICAgIHN0eWxlTWFwWyctbXMtdG91Y2gtYWN0aW9uJ10gPSAnbm9uZSc7XG4gICAgc3R5bGVNYXBbJ3RvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDUnAkYS5DQU5WQVNfTEFZRVJTOyBpKyspIHtcbiAgICB2YXIgY2FudmFzID0gci5kYXRhLmNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIHIuZGF0YS5jb250ZXh0c1tpXSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIE9iamVjdC5rZXlzKHN0eWxlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBjYW52YXMuc3R5bGVba10gPSBzdHlsZU1hcFtrXTtcbiAgICB9KTtcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgaSk7XG4gICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IFN0cmluZyhDUnAkYS5DQU5WQVNfTEFZRVJTIC0gaSk7XG4gICAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tpXSA9IGZhbHNlO1xuICB9XG5cbiAgci5kYXRhLnRvcENhbnZhcyA9IHIuZGF0YS5jYW52YXNlc1swXTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScCRhLk5PREVdLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAkYS5OT0RFICsgJy1ub2RlJyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAkYS5TRUxFQ1RfQk9YXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwJGEuU0VMRUNUX0JPWCArICctc2VsZWN0Ym94Jyk7XG4gIHIuZGF0YS5jYW52YXNlc1tDUnAkYS5EUkFHXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwJGEuRFJBRyArICctZHJhZycpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgQ1JwJGEuQlVGRkVSX0NPVU5UOyBpKyspIHtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgci5kYXRhLmJ1ZmZlckNvbnRleHRzW2ldID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLmdldENvbnRleHQoJzJkJyk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2J1ZmZlcicgKyBpKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUuekluZGV4ID0gU3RyaW5nKC1pIC0gMSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgLy9yLmRhdGEuY2FudmFzQ29udGFpbmVyLmFwcGVuZENoaWxkKHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXSk7XG4gIH1cblxuICByLnBhdGhzRW5hYmxlZCA9IHRydWU7XG4gIHZhciBlbXB0eUJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG5cbiAgdmFyIGdldEJveENlbnRlciA9IGZ1bmN0aW9uIGdldEJveENlbnRlcihiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoYmIueDEgKyBiYi54MikgLyAyLFxuICAgICAgeTogKGJiLnkxICsgYmIueTIpIC8gMlxuICAgIH07XG4gIH07XG5cbiAgdmFyIGdldENlbnRlck9mZnNldCA9IGZ1bmN0aW9uIGdldENlbnRlck9mZnNldChiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtYmIudyAvIDIsXG4gICAgICB5OiAtYmIuaCAvIDJcbiAgICB9O1xuICB9O1xuXG4gIHZhciBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCA9IGZ1bmN0aW9uIGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkKGVsZSkge1xuICAgIHZhciBfcCA9IGVsZVswXS5fcHJpdmF0ZTtcbiAgICB2YXIgc2FtZSA9IF9wLm9sZEJhY2tncm91bmRUaW1lc3RhbXAgPT09IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgcmV0dXJuICFzYW1lO1xuICB9O1xuXG4gIHZhciBnZXRTdHlsZUtleSA9IGZ1bmN0aW9uIGdldFN0eWxlS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubm9kZUtleTtcbiAgfTtcblxuICB2YXIgZ2V0TGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsU3R5bGVLZXk7XG4gIH07XG5cbiAgdmFyIGdldFNvdXJjZUxhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5zb3VyY2VMYWJlbFN0eWxlS2V5O1xuICB9O1xuXG4gIHZhciBnZXRUYXJnZXRMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUudGFyZ2V0TGFiZWxTdHlsZUtleTtcbiAgfTtcblxuICB2YXIgZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiBkcmF3RWxlbWVudChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCB1c2VFbGVPcGFjaXR5KSB7XG4gICAgcmV0dXJuIHIuZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgZmFsc2UsIGZhbHNlLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcblxuICB2YXIgZHJhd0xhYmVsID0gZnVuY3Rpb24gZHJhd0xhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ21haW4nLCB1c2VFbGVPcGFjaXR5KTtcbiAgfTtcblxuICB2YXIgZHJhd1NvdXJjZUxhYmVsID0gZnVuY3Rpb24gZHJhd1NvdXJjZUxhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3NvdXJjZScsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuXG4gIHZhciBkcmF3VGFyZ2V0TGFiZWwgPSBmdW5jdGlvbiBkcmF3VGFyZ2V0TGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAndGFyZ2V0JywgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG5cbiAgdmFyIGdldEVsZW1lbnRCb3ggPSBmdW5jdGlvbiBnZXRFbGVtZW50Qm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUuYm9keUJvdW5kcztcbiAgfTtcblxuICB2YXIgZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLm1haW4gfHwgZW1wdHlCYjtcbiAgfTtcblxuICB2YXIgZ2V0U291cmNlTGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLnNvdXJjZSB8fCBlbXB0eUJiO1xuICB9O1xuXG4gIHZhciBnZXRUYXJnZXRMYWJlbEJveCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsQm94KGVsZSkge1xuICAgIGVsZS5ib3VuZGluZ0JveCgpO1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubGFiZWxCb3VuZHMudGFyZ2V0IHx8IGVtcHR5QmI7XG4gIH07XG5cbiAgdmFyIGlzTGFiZWxWaXNpYmxlQXRTY2FsZSA9IGZ1bmN0aW9uIGlzTGFiZWxWaXNpYmxlQXRTY2FsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pIHtcbiAgICByZXR1cm4gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcblxuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRFbGVtZW50Um90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Qm94Q2VudGVyKGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG5cbiAgdmFyIGFkZFRleHRNYXJnaW4gPSBmdW5jdGlvbiBhZGRUZXh0TWFyZ2luKHByZWZpeCwgcHQsIGVsZSkge1xuICAgIHZhciBwcmUgPSBwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgeDogcHQueCArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlLFxuICAgICAgeTogcHQueSArIGVsZS5wc3R5bGUocHJlICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlXG4gICAgfTtcbiAgfTtcblxuICB2YXIgZ2V0UnNQdCA9IGZ1bmN0aW9uIGdldFJzUHQoZWxlLCB4LCB5KSB7XG4gICAgdmFyIHJzID0gZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHJldHVybiB7XG4gICAgICB4OiByc1t4XSxcbiAgICAgIHk6IHJzW3ldXG4gICAgfTtcbiAgfTtcblxuICB2YXIgZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCcnLCBnZXRSc1B0KGVsZSwgJ2xhYmVsWCcsICdsYWJlbFknKSwgZWxlKTtcbiAgfTtcblxuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCdzb3VyY2UnLCBnZXRSc1B0KGVsZSwgJ3NvdXJjZUxhYmVsWCcsICdzb3VyY2VMYWJlbFknKSwgZWxlKTtcbiAgfTtcblxuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCd0YXJnZXQnLCBnZXRSc1B0KGVsZSwgJ3RhcmdldExhYmVsWCcsICd0YXJnZXRMYWJlbFknKSwgZWxlKTtcbiAgfTtcblxuICB2YXIgZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHJldHVybiBnZXRDZW50ZXJPZmZzZXQoZ2V0RWxlbWVudEJveChlbGUpKTtcbiAgfTtcblxuICB2YXIgZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRTb3VyY2VMYWJlbEJveChlbGUpKTtcbiAgfTtcblxuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRUYXJnZXRMYWJlbEJveChlbGUpKTtcbiAgfTtcblxuICB2YXIgZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgdmFyIGJiID0gZ2V0TGFiZWxCb3goZWxlKTtcbiAgICB2YXIgcCA9IGdldENlbnRlck9mZnNldChnZXRMYWJlbEJveChlbGUpKTtcblxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHN3aXRjaCAoZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKS52YWx1ZSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBwLnggPSAtYmIudztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgcC54ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcC55ID0gLWJiLmg7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBwLnkgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwO1xuICB9O1xuXG4gIHZhciBlbGVUeHJDYWNoZSA9IHIuZGF0YS5lbGVUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFN0eWxlS2V5LFxuICAgIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBiYWNrZ3JvdW5kVGltZXN0YW1wSGFzQ2hhbmdlZCxcbiAgICBkcmF3RWxlbWVudDogZHJhd0VsZW1lbnQsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldEVsZW1lbnRCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCxcbiAgICBhbGxvd0VkZ2VUeHJDYWNoaW5nOiBmYWxzZSxcbiAgICBhbGxvd1BhcmVudFR4ckNhY2hpbmc6IGZhbHNlXG4gIH0pO1xuICB2YXIgbGJsVHhyQ2FjaGUgPSByLmRhdGEubGJsVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd0xhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldExhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciBzbGJUeHJDYWNoZSA9IHIuZGF0YS5zbGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFNvdXJjZUxhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3U291cmNlTGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFNvdXJjZUxhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIHRsYlR4ckNhY2hlID0gci5kYXRhLnRsYlR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0VGFyZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdUYXJnZXRMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0VGFyZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgbHlyVHhyQ2FjaGUgPSByLmRhdGEubHlyVHhyQ2FjaGUgPSBuZXcgTGF5ZXJlZFRleHR1cmVDYWNoZShyKTtcbiAgci5vblVwZGF0ZUVsZUNhbGNzKGZ1bmN0aW9uIGludmFsaWRhdGVUZXh0dXJlQ2FjaGVzKHdpbGxEcmF3LCBlbGVzKSB7XG4gICAgLy8gZWFjaCBjYWNoZSBzaG91bGQgY2hlY2sgZm9yIHN1Yi1rZXkgZGlmZiB0byBzZWUgdGhhdCB0aGUgdXBkYXRlIGFmZmVjdHMgdGhhdCBjYWNoZSBwYXJ0aWN1bGFybHlcbiAgICBlbGVUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgbGJsVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIHNsYlR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICB0bGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7IC8vIGFueSBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlIGxheWVyc1xuXG4gICAgbHlyVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpOyAvLyB1cGRhdGUgdGhlIG9sZCBiZyB0aW1lc3RhbXAgc28gZGlmZnMgY2FuIGJlIGRvbmUgaW4gdGhlIGVsZSB0eHIgY2FjaGVzXG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfcCA9IGVsZXNbX2ldLl9wcml2YXRlO1xuICAgICAgX3Aub2xkQmFja2dyb3VuZFRpbWVzdGFtcCA9IF9wLmJhY2tncm91bmRUaW1lc3RhbXA7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcmVmaW5lSW5MYXllcnMgPSBmdW5jdGlvbiByZWZpbmVJbkxheWVycyhyZXFzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBseXJUeHJDYWNoZS5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQocmVxc1tpXS5lbGUpO1xuICAgIH1cbiAgfTtcblxuICBlbGVUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBsYmxUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICBzbGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xuICB0bGJUeHJDYWNoZS5vbkRlcXVldWUocmVmaW5lSW5MYXllcnMpO1xufVxuXG5DUnAkYS5yZWRyYXdIaW50ID0gZnVuY3Rpb24gKGdyb3VwLCBib29sKSB7XG4gIHZhciByID0gdGhpcztcblxuICBzd2l0Y2ggKGdyb3VwKSB7XG4gICAgY2FzZSAnZWxlcyc6XG4gICAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbQ1JwJGEuTk9ERV0gPSBib29sO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAkYS5EUkFHXSA9IGJvb2w7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByLmRhdGEuY2FudmFzTmVlZHNSZWRyYXdbQ1JwJGEuU0VMRUNUX0JPWF0gPSBib29sO1xuICAgICAgYnJlYWs7XG4gIH1cbn07IC8vIHdoZXRoZXIgdG8gdXNlIFBhdGgyRCBjYWNoaW5nIGZvciBkcmF3aW5nXG5cblxudmFyIHBhdGhzSW1wbGQgPSB0eXBlb2YgUGF0aDJEICE9PSAndW5kZWZpbmVkJztcblxuQ1JwJGEucGF0aDJkRW5hYmxlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzRW5hYmxlZDtcbiAgfVxuXG4gIHRoaXMucGF0aHNFbmFibGVkID0gb24gPyB0cnVlIDogZmFsc2U7XG59O1xuXG5DUnAkYS51c2VQYXRocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBhdGhzSW1wbGQgJiYgdGhpcy5wYXRoc0VuYWJsZWQ7XG59O1xuXG5DUnAkYS5zZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCwgYm9vbCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICAgIGNvbnRleHQubXNJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9XG59O1xuXG5DUnAkYS5nZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIHJldHVybiBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGV4dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgfHwgY29udGV4dC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZDtcbiAgfVxufTtcblxuQ1JwJGEubWFrZU9mZnNjcmVlbkNhbnZhcyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBjYW52YXM7XG5cbiAgaWYgKCh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoT2Zmc2NyZWVuQ2FudmFzKSkgIT09ICggXCJ1bmRlZmluZWRcIiApKSB7XG4gICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfSBlbHNlIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5bQ1JwLCBDUnAkMSwgQ1JwJDIsIENScCQzLCBDUnAkNCwgQ1JwJDUsIENScCQ2LCBDUnAkNywgQ1JwJDgsIENScCQ5XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQ1JwJGEsIHByb3BzKTtcbn0pO1xuXG52YXIgcmVuZGVyZXIgPSBbe1xuICBuYW1lOiAnbnVsbCcsXG4gIGltcGw6IE51bGxSZW5kZXJlclxufSwge1xuICBuYW1lOiAnYmFzZScsXG4gIGltcGw6IEJSXG59LCB7XG4gIG5hbWU6ICdjYW52YXMnLFxuICBpbXBsOiBDUlxufV07XG5cbnZhciBpbmNFeHRzID0gW3tcbiAgdHlwZTogJ2xheW91dCcsXG4gIGV4dGVuc2lvbnM6IGxheW91dFxufSwge1xuICB0eXBlOiAncmVuZGVyZXInLFxuICBleHRlbnNpb25zOiByZW5kZXJlclxufV07XG5cbnZhciBleHRlbnNpb25zID0ge307IC8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG5cbnZhciBtb2R1bGVzID0ge307XG5cbmZ1bmN0aW9uIHNldEV4dGVuc2lvbih0eXBlLCBuYW1lLCByZWdpc3RyYW50KSB7XG4gIHZhciBleHQgPSByZWdpc3RyYW50O1xuXG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgZXJyb3IoJ0NhbiBub3QgcmVnaXN0ZXIgYCcgKyBuYW1lICsgJ2AgZm9yIGAnICsgdHlwZSArICdgIHNpbmNlIGAnICsgZmllbGQgKyAnYCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcHJvdG90eXBlIGFuZCBjYW4gbm90IGJlIG92ZXJyaWRkZW4nKTtcbiAgfTtcblxuICBpZiAodHlwZSA9PT0gJ2NvcmUnKSB7XG4gICAgaWYgKENvcmUucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvcmUucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgaWYgKENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xheW91dCcpIHtcbiAgICAvLyBmaWxsIGluIG1pc3NpbmcgbGF5b3V0IGZ1bmN0aW9ucyBpbiB0aGUgcHJvdG90eXBlXG4gICAgdmFyIExheW91dCA9IGZ1bmN0aW9uIExheW91dChvcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgcmVnaXN0cmFudC5jYWxsKHRoaXMsIG9wdGlvbnMpOyAvLyBtYWtlIHN1cmUgbGF5b3V0IGhhcyBfcHJpdmF0ZSBmb3IgdXNlIHcvIHN0ZCBhcGlzIGxpa2UgLm9uKClcblxuICAgICAgaWYgKCFwbGFpbk9iamVjdCh0aGlzLl9wcml2YXRlKSkge1xuICAgICAgICB0aGlzLl9wcml2YXRlID0ge307XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByaXZhdGUuY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdGhpcy5fcHJpdmF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIHRoaXMuY3JlYXRlRW1pdHRlcigpO1xuICAgIH07XG5cbiAgICB2YXIgbGF5b3V0UHJvdG8gPSBMYXlvdXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShyZWdpc3RyYW50LnByb3RvdHlwZSk7XG4gICAgdmFyIG9wdExheW91dEZucyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRMYXlvdXRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbk5hbWUgPSBvcHRMYXlvdXRGbnNbaV07XG5cbiAgICAgIGxheW91dFByb3RvW2ZuTmFtZV0gPSBsYXlvdXRQcm90b1tmbk5hbWVdIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH0gLy8gZWl0aGVyIC5zdGFydCgpIG9yIC5ydW4oKSBpcyBkZWZpbmVkLCBzbyBhdXRvZ2VuIHRoZSBvdGhlclxuXG5cbiAgICBpZiAobGF5b3V0UHJvdG8uc3RhcnQgJiYgIWxheW91dFByb3RvLnJ1bikge1xuICAgICAgbGF5b3V0UHJvdG8ucnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCFsYXlvdXRQcm90by5zdGFydCAmJiBsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJ1bigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHJlZ1N0b3AgPSByZWdpc3RyYW50LnByb3RvdHlwZS5zdG9wO1xuXG4gICAgbGF5b3V0UHJvdG8uc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAob3B0cyAmJiBvcHRzLmFuaW1hdGUpIHtcbiAgICAgICAgdmFyIGFuaXMgPSB0aGlzLmFuaW1hdGlvbnM7XG5cbiAgICAgICAgaWYgKGFuaXMpIHtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYW5pcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFuaXNbX2ldLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlZ1N0b3ApIHtcbiAgICAgICAgcmVnU3RvcC5jYWxsKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBpZiAoIWxheW91dFByb3RvLmRlc3Ryb3kpIHtcbiAgICAgIGxheW91dFByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBsYXlvdXRQcm90by5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Q3kgPSBmdW5jdGlvbiBnZXRDeShsYXlvdXQpIHtcbiAgICAgIHJldHVybiBsYXlvdXQuX3ByaXZhdGUuY3k7XG4gICAgfTtcblxuICAgIHZhciBlbWl0dGVyT3B0cyA9IHtcbiAgICAgIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhsYXlvdXQsIGV2dCkge1xuICAgICAgICBldnQubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICBldnQuY3kgPSBnZXRDeShsYXlvdXQpO1xuICAgICAgICBldnQudGFyZ2V0ID0gbGF5b3V0O1xuICAgICAgfSxcbiAgICAgIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChsYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldEN5KGxheW91dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBleHRlbmQobGF5b3V0UHJvdG8sIHtcbiAgICAgIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgICAgIHRoaXMuX3ByaXZhdGUuZW1pdHRlciA9IG5ldyBFbWl0dGVyKGVtaXR0ZXJPcHRzLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgICAgIH0sXG4gICAgICBvbjogZnVuY3Rpb24gb24oZXZ0LCBjYikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5vbihldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25lOiBmdW5jdGlvbiBvbmUoZXZ0LCBjYikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIG9uY2U6IGZ1bmN0aW9uIG9uY2UoZXZ0LCBjYikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLnJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGVtaXQ6IGZ1bmN0aW9uIGVtaXQoZXZ0LCBwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkuZW1pdChldnQsIHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlZmluZSQzLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG4gICAgdmFyIEJhc2VSZW5kZXJlciA9IGdldEV4dGVuc2lvbigncmVuZGVyZXInLCAnYmFzZScpO1xuICAgIHZhciBiUHJvdG8gPSBCYXNlUmVuZGVyZXIucHJvdG90eXBlO1xuICAgIHZhciBSZWdpc3RyYW50UmVuZGVyZXIgPSByZWdpc3RyYW50O1xuICAgIHZhciByUHJvdG8gPSByZWdpc3RyYW50LnByb3RvdHlwZTtcblxuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdmFyIHByb3RvID0gUmVuZGVyZXIucHJvdG90eXBlO1xuXG4gICAgZm9yICh2YXIgcE5hbWUgaW4gYlByb3RvKSB7XG4gICAgICB2YXIgcFZhbCA9IGJQcm90b1twTmFtZV07XG4gICAgICB2YXIgZXhpc3RzSW5SID0gclByb3RvW3BOYW1lXSAhPSBudWxsO1xuXG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvW3BOYW1lXSA9IHBWYWw7IC8vIHRha2UgaW1wbCBmcm9tIGJhc2VcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfcE5hbWUgaW4gclByb3RvKSB7XG4gICAgICBwcm90b1tfcE5hbWVdID0gclByb3RvW19wTmFtZV07IC8vIHRha2UgaW1wbCBmcm9tIHJlZ2lzdHJhbnRcbiAgICB9XG5cbiAgICBiUHJvdG8uY2xpZW50RnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHByb3RvW25hbWVdID0gcHJvdG9bbmFtZV0gfHwgZnVuY3Rpb24gKCkge1xuICAgICAgICBlcnJvcignUmVuZGVyZXIgZG9lcyBub3QgaW1wbGVtZW50IGByZW5kZXJlci4nICsgbmFtZSArICcoKWAgb24gaXRzIHByb3RvdHlwZScpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBleHQgPSBSZW5kZXJlcjtcbiAgfVxuXG4gIHJldHVybiBzZXRNYXAoe1xuICAgIG1hcDogZXh0ZW5zaW9ucyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZV0sXG4gICAgdmFsdWU6IGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXSxcbiAgICB2YWx1ZTogcmVnaXN0cmFudFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kdWxlKHR5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBtb2R1bGVzLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lXVxuICB9KTtcbn1cblxudmFyIGV4dGVuc2lvbiA9IGZ1bmN0aW9uIGV4dGVuc2lvbigpIHtcbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycpXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCB7IC4uLiB9KVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICByZXR1cm4gc2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgJ25vZGVTaGFwZScsICdlbGxpcHNlJylcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgIHJldHVybiBnZXRNb2R1bGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIH0gLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsICdub2RlU2hhcGUnLCAnZWxsaXBzZScsIHsgLi4uIH0pXG4gICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgcmV0dXJuIHNldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiBhY2Nlc3Mgc3ludGF4Jyk7XG4gICAgICAgIH1cbn07IC8vIGFsbG93cyBhIGNvcmUgaW5zdGFuY2UgdG8gYWNjZXNzIGV4dGVuc2lvbnMgaW50ZXJuYWxseVxuXG5cbkNvcmUucHJvdG90eXBlLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsgLy8gaW5jbHVkZWQgZXh0ZW5zaW9uc1xuXG5pbmNFeHRzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gIGdyb3VwLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG4gICAgc2V0RXh0ZW5zaW9uKGdyb3VwLnR5cGUsIGV4dC5uYW1lLCBleHQuaW1wbCk7XG4gIH0pO1xufSk7XG5cbi8vICh1c2VmdWwgZm9yIGluaXQpXG5cbnZhciBTdHlsZXNoZWV0ID0gZnVuY3Rpb24gU3R5bGVzaGVldCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFN0eWxlc2hlZXQpKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KCk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IDA7XG59O1xuXG52YXIgc2hlZXRmbiA9IFN0eWxlc2hlZXQucHJvdG90eXBlO1xuXG5zaGVldGZuLmluc3RhbmNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJ3N0eWxlc2hlZXQnO1xufTsgLy8ganVzdCBzdG9yZSB0aGUgc2VsZWN0b3IgdG8gYmUgcGFyc2VkIGxhdGVyXG5cblxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTsgLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5cblxuc2hlZXRmbi5jc3MgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7XG5cbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wTmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wTmFtZXNbal07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW2tleV07XG5cbiAgICAgIGlmIChtYXBWYWwgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3AgPSBTdHlsZS5wcm9wZXJ0aWVzW2tleV0gfHwgU3R5bGUucHJvcGVydGllc1tkYXNoMmNhbWVsKGtleSldO1xuXG4gICAgICBpZiAocHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX25hbWUgPSBwcm9wLm5hbWU7XG4gICAgICB2YXIgX3ZhbHVlID0gbWFwVmFsO1xuICAgICAgdGhpc1tpXS5wcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBfbmFtZSxcbiAgICAgICAgdmFsdWU6IF92YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7IC8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuXG5zaGVldGZuLmdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoY3kpIHtcbiAgdmFyIHN0eWxlID0gbmV3IFN0eWxlKGN5KTtcbiAgcmV0dXJuIHRoaXMuYXBwZW5kVG9TdHlsZShzdHlsZSk7XG59OyAvLyBhcHBlbmQgYSBkdW1teSBzdHlsZXNoZWV0IG9iamVjdCBvbiBhIHJlYWwgc3R5bGUgb2JqZWN0XG5cblxuc2hlZXRmbi5hcHBlbmRUb1N0eWxlID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gdGhpc1tpXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBjb250ZXh0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGNvbnRleHQucHJvcGVydGllcztcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgc3R5bGUuY3NzKHByb3AubmFtZSwgcHJvcC52YWx1ZSk7IC8vIGFwcGx5IHByb3BlcnR5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxudmFyIHZlcnNpb24gPSBcIjMuMTcuNFwiO1xuXG52YXIgY3l0b3NjYXBlID0gZnVuY3Rpb24gY3l0b3NjYXBlKG9wdGlvbnMpIHtcbiAgLy8gaWYgbm8gb3B0aW9ucyBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH0gLy8gY3JlYXRlIGluc3RhbmNlXG5cblxuICBpZiAocGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IENvcmUob3B0aW9ucyk7XG4gIH0gLy8gYWxsb3cgZm9yIHJlZ2lzdHJhdGlvbiBvZiBleHRlbnNpb25zXG4gIGVsc2UgaWYgKHN0cmluZyhvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbi5hcHBseShleHRlbnNpb24sIGFyZ3VtZW50cyk7XG4gICAgfVxufTsgLy8gZS5nLiBjeXRvc2NhcGUudXNlKCByZXF1aXJlKCdjeXRvc2NhcGUtZm9vJyksIGJhciApXG5cblxuY3l0b3NjYXBlLnVzZSA9IGZ1bmN0aW9uIChleHQpIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmdzIHRvIHBhc3MgdG8gZXh0XG5cbiAgYXJncy51bnNoaWZ0KGN5dG9zY2FwZSk7IC8vIGN5dG9zY2FwZSBpcyBmaXJzdCBhcmcgdG8gZXh0XG5cbiAgZXh0LmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmN5dG9zY2FwZS53YXJuaW5ncyA9IGZ1bmN0aW9uIChib29sKSB7XG4gIHJldHVybiB3YXJuaW5ncyhib29sKTtcbn07IC8vIHJlcGxhY2VkIGJ5IGJ1aWxkIHN5c3RlbVxuXG5cbmN5dG9zY2FwZS52ZXJzaW9uID0gdmVyc2lvbjsgLy8gZXhwb3NlIHB1YmxpYyBhcGlzIChtb3N0bHkgZm9yIGV4dGVuc2lvbnMpXG5cbmN5dG9zY2FwZS5zdHlsZXNoZWV0ID0gY3l0b3NjYXBlLlN0eWxlc2hlZXQgPSBTdHlsZXNoZWV0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGN5dG9zY2FwZTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///44726\n")},45019:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUwMTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/NWYwMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiB1dGlscy5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///45019\n")},45228:module=>{"use strict";eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUyMjguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcz8zMjBjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45228\n")},45412:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nmodule.exports = Readable;\n\n/**/\nvar Duplex;\n/**/\n\nReadable.ReadableState = ReadableState;\n\n/**/\nvar EE = (__webpack_require__(37007).EventEmitter);\nvar EElistenerCount = function EElistenerCount(emitter, type) {\n return emitter.listeners(type).length;\n};\n/**/\n\n/**/\nvar Stream = __webpack_require__(40345);\n/**/\n\nvar Buffer = (__webpack_require__(27650).Buffer);\nvar OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/**/\nvar debugUtil = __webpack_require__(79838);\nvar debug;\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function debug() {};\n}\n/**/\n\nvar BufferList = __webpack_require__(80345);\nvar destroyImpl = __webpack_require__(75896);\nvar _require = __webpack_require__(65291),\n getHighWaterMark = _require.getHighWaterMark;\nvar _require$codes = (__webpack_require__(86048)/* .codes */ .F),\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;\n\n// Lazy loaded to improve the startup performance.\nvar StringDecoder;\nvar createReadableStreamAsyncIterator;\nvar from;\n__webpack_require__(56698)(Readable, Stream);\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\nfunction ReadableState(options, stream, isDuplex) {\n Duplex = Duplex || __webpack_require__(25382);\n options = options || {};\n\n // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;\n\n // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);\n\n // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false;\n\n // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n this.sync = true;\n\n // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n this.paused = true;\n\n // Should close be emitted on destroy. Defaults to true.\n this.emitClose = options.emitClose !== false;\n\n // Should .destroy() be called after 'end' (and potentially 'finish')\n this.autoDestroy = !!options.autoDestroy;\n\n // has it been destroyed\n this.destroyed = false;\n\n // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n // the number of writers that are awaiting a drain event in .pipe()s\n this.awaitDrain = 0;\n\n // if true, a maybeReadMore has been scheduled\n this.readingMore = false;\n this.decoder = null;\n this.encoding = null;\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(83141)/* .StringDecoder */ .I);\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\nfunction Readable(options) {\n Duplex = Duplex || __webpack_require__(25382);\n if (!(this instanceof Readable)) return new Readable(options);\n\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the ReadableState constructor, at least with V8 6.5\n var isDuplex = this instanceof Duplex;\n this._readableState = new ReadableState(options, this, isDuplex);\n\n // legacy\n this.readable = true;\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n Stream.call(this);\n}\nObject.defineProperty(Readable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined) {\n return false;\n }\n return this._readableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n }\n\n // backward compatibility, the user is explicitly\n // managing destroyed\n this._readableState.destroyed = value;\n }\n});\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n debug('readableAddChunk', chunk);\n var state = stream._readableState;\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n if (er) {\n errorOrDestroy(stream, er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n if (addToFront) {\n if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());\n } else if (state.destroyed) {\n return false;\n } else {\n state.reading = false;\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n maybeReadMore(stream, state);\n }\n }\n\n // We can push more data if we are below the highWaterMark.\n // Also, if we have no data yet, we can stand some more bytes.\n // This is to work around cases where hwm=0, such as the repl.\n return !state.ended && (state.length < state.highWaterMark || state.length === 0);\n}\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n state.awaitDrain = 0;\n stream.emit('data', chunk);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n if (state.needReadable) emitReadable(stream);\n }\n maybeReadMore(stream, state);\n}\nfunction chunkInvalid(state, chunk) {\n var er;\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);\n }\n return er;\n}\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = (__webpack_require__(83141)/* .StringDecoder */ .I);\n var decoder = new StringDecoder(enc);\n this._readableState.decoder = decoder;\n // If setEncoding(null), decoder.encoding equals utf8\n this._readableState.encoding = this._readableState.decoder.encoding;\n\n // Iterate over current buffer to convert already stored Buffers:\n var p = this._readableState.buffer.head;\n var content = '';\n while (p !== null) {\n content += decoder.write(p.data);\n p = p.next;\n }\n this._readableState.buffer.clear();\n if (content !== '') this._readableState.buffer.push(content);\n this._readableState.length = content.length;\n return this;\n};\n\n// Don't raise the hwm > 1GB\nvar MAX_HWM = 0x40000000;\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n }\n // If we're asking for more than the current hwm, then raise the hwm.\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n;\n // Don't have enough\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n if (n !== 0) state.emittedReadable = false;\n\n // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n n = howMuchToRead(n, state);\n\n // if we've ended, and we're now clear, then finish it up.\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n }\n\n // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n\n // if we need a readable event, then we need to do some reading.\n var doRead = state.needReadable;\n debug('need readable', doRead);\n\n // if we currently have less than the highWaterMark, then also read some\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n }\n\n // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true;\n // if the length is currently zero, then we *need* a readable event.\n if (state.length === 0) state.needReadable = true;\n // call internal read method\n this._read(state.highWaterMark);\n state.sync = false;\n // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n if (ret === null) {\n state.needReadable = state.length <= state.highWaterMark;\n n = 0;\n } else {\n state.length -= n;\n state.awaitDrain = 0;\n }\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true;\n\n // If we tried to read() past the EOF, then emit end on the next tick.\n if (nOrig !== n && state.ended) endReadable(this);\n }\n if (ret !== null) this.emit('data', ret);\n return ret;\n};\nfunction onEofChunk(stream, state) {\n debug('onEofChunk');\n if (state.ended) return;\n if (state.decoder) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n state.ended = true;\n if (state.sync) {\n // if we are sync, wait until next tick to emit the data.\n // Otherwise we risk emitting data in the flow()\n // the readable code triggers during a read() call\n emitReadable(stream);\n } else {\n // emit 'readable' now to make sure it gets picked up.\n state.needReadable = false;\n if (!state.emittedReadable) {\n state.emittedReadable = true;\n emitReadable_(stream);\n }\n }\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n var state = stream._readableState;\n debug('emitReadable', state.needReadable, state.emittedReadable);\n state.needReadable = false;\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n process.nextTick(emitReadable_, stream);\n }\n}\nfunction emitReadable_(stream) {\n var state = stream._readableState;\n debug('emitReadable_', state.destroyed, state.length, state.ended);\n if (!state.destroyed && (state.length || state.ended)) {\n stream.emit('readable');\n state.emittedReadable = false;\n }\n\n // The stream needs another readable event if\n // 1. It is not flowing, as the flow mechanism will take\n // care of it.\n // 2. It is not ended.\n // 3. It is below the highWaterMark, so we can schedule\n // another readable later.\n state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;\n flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n process.nextTick(maybeReadMore_, stream, state);\n }\n}\nfunction maybeReadMore_(stream, state) {\n // Attempt to read more data if we should.\n //\n // The conditions for reading more data are (one of):\n // - Not enough data buffered (state.length < state.highWaterMark). The loop\n // is responsible for filling the buffer with enough data if such data\n // is available. If highWaterMark is 0 and we are not in the flowing mode\n // we should _not_ attempt to buffer any extra data. We'll get more data\n // when the stream consumer calls read() instead.\n // - No data in the buffer, and the stream is in flowing mode. In this mode\n // the loop below is responsible for ensuring read() is called. Failing to\n // call read here would abort the flow and there's no other mechanism for\n // continuing the flow if the stream consumer has just subscribed to the\n // 'data' event.\n //\n // In addition to the above conditions to keep reading data, the following\n // conditions prevent the data from being read:\n // - The stream has ended (state.ended).\n // - There is already a pending 'read' operation (state.reading). This is a\n // case where the the stream has called the implementation defined _read()\n // method, but they are processing the call asynchronously and have _not_\n // called push() with new data. In this case we skip performing more\n // read()s. The execution ends in this method again after the _read() ends\n // up calling push() with more data.\n while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {\n var len = state.length;\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length)\n // didn't get any data, stop spinning.\n break;\n }\n state.readingMore = false;\n}\n\n// abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));\n};\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n default:\n state.pipes.push(dest);\n break;\n }\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);\n dest.on('unpipe', onunpipe);\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n function onend() {\n debug('onend');\n dest.end();\n }\n\n // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n var cleanedUp = false;\n function cleanup() {\n debug('cleanup');\n // cleanup event handlers once the pipe is broken\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n cleanedUp = true;\n\n // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n src.on('data', ondata);\n function ondata(chunk) {\n debug('ondata');\n var ret = dest.write(chunk);\n debug('dest.write', ret);\n if (ret === false) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n }\n src.pause();\n }\n }\n\n // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);\n }\n\n // Make sure our error handler is attached before userland ones.\n prependListener(dest, 'error', onerror);\n\n // Both close and finish should trigger unpipe, but only once.\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n dest.once('close', onclose);\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n dest.once('finish', onfinish);\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n }\n\n // tell the dest that it's being piped to\n dest.emit('pipe', src);\n\n // start the flow if it hasn't been started already.\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n return dest;\n};\nfunction pipeOnDrain(src) {\n return function pipeOnDrainFunctionResult() {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = {\n hasUnpiped: false\n };\n\n // if we're not piping anywhere, then do nothing.\n if (state.pipesCount === 0) return this;\n\n // just one destination. most common case.\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n if (!dest) dest = state.pipes;\n\n // got a match.\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n }\n\n // slow case. multiple pipe destinations.\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {\n hasUnpiped: false\n });\n return this;\n }\n\n // try to find the right one.\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n dest.emit('unpipe', this, unpipeInfo);\n return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n var state = this._readableState;\n if (ev === 'data') {\n // update readableListening so that resume() may be a no-op\n // a few lines down. This is needed to support once('readable').\n state.readableListening = this.listenerCount('readable') > 0;\n\n // Try start flowing on next tick if stream isn't explicitly paused\n if (state.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.flowing = false;\n state.emittedReadable = false;\n debug('on readable', state.length, state.reading);\n if (state.length) {\n emitReadable(this);\n } else if (!state.reading) {\n process.nextTick(nReadingNextTick, this);\n }\n }\n }\n return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\nReadable.prototype.removeListener = function (ev, fn) {\n var res = Stream.prototype.removeListener.call(this, ev, fn);\n if (ev === 'readable') {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n return res;\n};\nReadable.prototype.removeAllListeners = function (ev) {\n var res = Stream.prototype.removeAllListeners.apply(this, arguments);\n if (ev === 'readable' || ev === undefined) {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n return res;\n};\nfunction updateReadableListening(self) {\n var state = self._readableState;\n state.readableListening = self.listenerCount('readable') > 0;\n if (state.resumeScheduled && !state.paused) {\n // flowing needs to be set to true now, otherwise\n // the upcoming resume will not flow.\n state.flowing = true;\n\n // crude way to check if we should resume\n } else if (self.listenerCount('data') > 0) {\n self.resume();\n }\n}\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n var state = this._readableState;\n if (!state.flowing) {\n debug('resume');\n // we flow only if there is no one listening\n // for readable, but we still have to call\n // resume()\n state.flowing = !state.readableListening;\n resume(this, state);\n }\n state.paused = false;\n return this;\n};\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n process.nextTick(resume_, stream, state);\n }\n}\nfunction resume_(stream, state) {\n debug('resume', state.reading);\n if (!state.reading) {\n stream.read(0);\n }\n state.resumeScheduled = false;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n if (this._readableState.flowing !== false) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n this._readableState.paused = true;\n return this;\n};\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n while (state.flowing && stream.read() !== null);\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n var state = this._readableState;\n var paused = false;\n stream.on('end', function () {\n debug('wrapped end');\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n _this.push(null);\n });\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk);\n\n // don't skip over falsy values in objectMode\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n var ret = _this.push(chunk);\n if (!ret) {\n paused = true;\n stream.pause();\n }\n });\n\n // proxy all the other methods.\n // important when wrapping filters and duplexes.\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function methodWrap(method) {\n return function methodWrapReturnFunction() {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n }\n\n // proxy certain important events.\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n }\n\n // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n this._read = function (n) {\n debug('wrapped _read', n);\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n return this;\n};\nif (typeof Symbol === 'function') {\n Readable.prototype[Symbol.asyncIterator] = function () {\n if (createReadableStreamAsyncIterator === undefined) {\n createReadableStreamAsyncIterator = __webpack_require__(2955);\n }\n return createReadableStreamAsyncIterator(this);\n };\n}\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.highWaterMark;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState && this._readableState.buffer;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableFlowing', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.flowing;\n },\n set: function set(state) {\n if (this._readableState) {\n this._readableState.flowing = state;\n }\n }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\nObject.defineProperty(Readable.prototype, 'readableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.length;\n }\n});\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = state.buffer.consume(n, state.decoder);\n }\n return ret;\n}\nfunction endReadable(stream) {\n var state = stream._readableState;\n debug('endReadable', state.endEmitted);\n if (!state.endEmitted) {\n state.ended = true;\n process.nextTick(endReadableNT, state, stream);\n }\n}\nfunction endReadableNT(state, stream) {\n debug('endReadableNT', state.endEmitted, state.length);\n\n // Check that we didn't get one last unshift.\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the writable side is ready for autoDestroy as well\n var wState = stream._writableState;\n if (!wState || wState.autoDestroy && wState.finished) {\n stream.destroy();\n }\n }\n }\n}\nif (typeof Symbol === 'function') {\n Readable.from = function (iterable, opts) {\n if (from === undefined) {\n from = __webpack_require__(55157);\n }\n return from(Readable, iterable, opts);\n };\n}\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n return -1;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU0MTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanM/YWQ3MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBFRWxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBFRWxpc3RlbmVyQ291bnQoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZztcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gZGVidWcoKSB7fTtcbn1cbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyTGlzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpLFxuICBnZXRIaWdoV2F0ZXJNYXJrID0gX3JlcXVpcmUuZ2V0SGlnaFdhdGVyTWFyaztcbnZhciBfcmVxdWlyZSRjb2RlcyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpLmNvZGVzLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSA9IF9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLFxuICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GID0gX3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxcbiAgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7XG5cbi8vIExhenkgbG9hZGVkIHRvIGltcHJvdmUgdGhlIHN0YXJ0dXAgcGVyZm9ybWFuY2UuXG52YXIgU3RyaW5nRGVjb2RlcjtcbnZhciBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3I7XG52YXIgZnJvbTtcbnJlcXVpcmUoJ2luaGVyaXRzJykoUmVhZGFibGUsIFN0cmVhbSk7XG52YXIgZXJyb3JPckRlc3Ryb3kgPSBkZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtcbnZhciBrUHJveHlFdmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSwgaXNEdXBsZXgpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICBpZiAodHlwZW9mIGlzRHVwbGV4ICE9PSAnYm9vbGVhbicpIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZ2V0SGlnaFdhdGVyTWFyayh0aGlzLCBvcHRpb25zLCAncmVhZGFibGVIaWdoV2F0ZXJNYXJrJywgaXNEdXBsZXgpO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXG4gIC8vIFNob3VsZCBjbG9zZSBiZSBlbWl0dGVkIG9uIGRlc3Ryb3kuIERlZmF1bHRzIHRvIHRydWUuXG4gIHRoaXMuZW1pdENsb3NlID0gb3B0aW9ucy5lbWl0Q2xvc2UgIT09IGZhbHNlO1xuXG4gIC8vIFNob3VsZCAuZGVzdHJveSgpIGJlIGNhbGxlZCBhZnRlciAnZW5kJyAoYW5kIHBvdGVudGlhbGx5ICdmaW5pc2gnKVxuICB0aGlzLmF1dG9EZXN0cm95ID0gISFvcHRpb25zLmF1dG9EZXN0cm95O1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBSZWFkYWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNVxuICB2YXIgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgRHVwbGV4O1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZGVzdHJveSA9IG9wdGlvbnMuZGVzdHJveTtcbiAgfVxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5SZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBlbmNvZGluZywgZmFsc2UsIHNraXBDaHVua0NoZWNrKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgbnVsbCwgdHJ1ZSwgZmFsc2UpO1xufTtcbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIGRlYnVnKCdyZWFkYWJsZUFkZENodW5rJywgY2h1bmspO1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKCkpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKCkpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2UgY2FuIHB1c2ggbW9yZSBkYXRhIGlmIHdlIGFyZSBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyay5cbiAgLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWUgbW9yZSBieXRlcy5cbiAgLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCwgc3VjaCBhcyB0aGUgcmVwbC5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfVxuICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xufVxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NodW5rJywgWydzdHJpbmcnLCAnQnVmZmVyJywgJ1VpbnQ4QXJyYXknXSwgY2h1bmspO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdmFyIGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBkZWNvZGVyO1xuICAvLyBJZiBzZXRFbmNvZGluZyhudWxsKSwgZGVjb2Rlci5lbmNvZGluZyBlcXVhbHMgdXRmOFxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO1xuXG4gIC8vIEl0ZXJhdGUgb3ZlciBjdXJyZW50IGJ1ZmZlciB0byBjb252ZXJ0IGFscmVhZHkgc3RvcmVkIEJ1ZmZlcnM6XG4gIHZhciBwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZDtcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgd2hpbGUgKHAgIT09IG51bGwpIHtcbiAgICBjb250ZW50ICs9IGRlY29kZXIud3JpdGUocC5kYXRhKTtcbiAgICBwID0gcC5uZXh0O1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIGlmIChjb250ZW50ICE9PSAnJykgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCXG52YXIgTUFYX0hXTSA9IDB4NDAwMDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICAvLyBUT0RPKHJvbmFnKTogVGhyb3cgRVJSX1ZBTFVFX09VVF9PRl9SQU5HRS5cbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmICgoc3RhdGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIDogc3RhdGUubGVuZ3RoID4gMCkgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHN0YXRlLmxlbmd0aCA8PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICAgIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICB9XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG4gIHJldHVybiByZXQ7XG59O1xuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGRlYnVnKCdvbkVvZkNodW5rJyk7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gaWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGxcbiAgICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUubmVlZFJlYWRhYmxlLCBzdGF0ZS5lbWl0dGVkUmVhZGFibGUpO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2VtaXRSZWFkYWJsZV8nLCBzdGF0ZS5kZXN0cm95ZWQsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIHN0cmVhbSBuZWVkcyBhbm90aGVyIHJlYWRhYmxlIGV2ZW50IGlmXG4gIC8vIDEuIEl0IGlzIG5vdCBmbG93aW5nLCBhcyB0aGUgZmxvdyBtZWNoYW5pc20gd2lsbCB0YWtlXG4gIC8vICAgIGNhcmUgb2YgaXQuXG4gIC8vIDIuIEl0IGlzIG5vdCBlbmRlZC5cbiAgLy8gMy4gSXQgaXMgYmVsb3cgdGhlIGhpZ2hXYXRlck1hcmssIHNvIHdlIGNhbiBzY2hlZHVsZVxuICAvLyAgICBhbm90aGVyIHJlYWRhYmxlIGxhdGVyLlxuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICAvLyBBdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGlmIHdlIHNob3VsZC5cbiAgLy9cbiAgLy8gVGhlIGNvbmRpdGlvbnMgZm9yIHJlYWRpbmcgbW9yZSBkYXRhIGFyZSAob25lIG9mKTpcbiAgLy8gLSBOb3QgZW5vdWdoIGRhdGEgYnVmZmVyZWQgKHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspLiBUaGUgbG9vcFxuICAvLyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIHRoZSBidWZmZXIgd2l0aCBlbm91Z2ggZGF0YSBpZiBzdWNoIGRhdGFcbiAgLy8gICBpcyBhdmFpbGFibGUuIElmIGhpZ2hXYXRlck1hcmsgaXMgMCBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgZmxvd2luZyBtb2RlXG4gIC8vICAgd2Ugc2hvdWxkIF9ub3RfIGF0dGVtcHQgdG8gYnVmZmVyIGFueSBleHRyYSBkYXRhLiBXZSdsbCBnZXQgbW9yZSBkYXRhXG4gIC8vICAgd2hlbiB0aGUgc3RyZWFtIGNvbnN1bWVyIGNhbGxzIHJlYWQoKSBpbnN0ZWFkLlxuICAvLyAtIE5vIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYW5kIHRoZSBzdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLiBJbiB0aGlzIG1vZGVcbiAgLy8gICB0aGUgbG9vcCBiZWxvdyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgcmVhZCgpIGlzIGNhbGxlZC4gRmFpbGluZyB0b1xuICAvLyAgIGNhbGwgcmVhZCBoZXJlIHdvdWxkIGFib3J0IHRoZSBmbG93IGFuZCB0aGVyZSdzIG5vIG90aGVyIG1lY2hhbmlzbSBmb3JcbiAgLy8gICBjb250aW51aW5nIHRoZSBmbG93IGlmIHRoZSBzdHJlYW0gY29uc3VtZXIgaGFzIGp1c3Qgc3Vic2NyaWJlZCB0byB0aGVcbiAgLy8gICAnZGF0YScgZXZlbnQuXG4gIC8vXG4gIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBjb25kaXRpb25zIHRvIGtlZXAgcmVhZGluZyBkYXRhLCB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHJlYWQ6XG4gIC8vIC0gVGhlIHN0cmVhbSBoYXMgZW5kZWQgKHN0YXRlLmVuZGVkKS5cbiAgLy8gLSBUaGVyZSBpcyBhbHJlYWR5IGEgcGVuZGluZyAncmVhZCcgb3BlcmF0aW9uIChzdGF0ZS5yZWFkaW5nKS4gVGhpcyBpcyBhXG4gIC8vICAgY2FzZSB3aGVyZSB0aGUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwKSkge1xuICAgIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCdfcmVhZCgpJykpO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3MubmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgdW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGRlYnVnKCdkZXN0LndyaXRlJywgcmV0KTtcbiAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGVycm9yT3JEZXN0cm95KGRlc3QsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn07XG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB7XG4gICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyB1cGRhdGUgcmVhZGFibGVMaXN0ZW5pbmcgc28gdGhhdCByZXN1bWUoKSBtYXkgYmUgYSBuby1vcFxuICAgIC8vIGEgZmV3IGxpbmVzIGRvd24uIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgb25jZSgncmVhZGFibGUnKS5cbiAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRoaXMubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG5cbiAgICAvLyBUcnkgc3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBkZWJ1Zygnb24gcmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLnJlYWRpbmcpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbik7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZW9uZSBzdGlsbCBsaXN0ZW5pbmcgdG9cbiAgICAvLyByZWFkYWJsZSBhbmQgcmVzZXQgdGhlIHN0YXRlLiBIb3dldmVyIHRoaXMgbmVlZHMgdG8gaGFwcGVuXG4gICAgLy8gYWZ0ZXIgcmVhZGFibGUgaGFzIGJlZW4gZW1pdHRlZCBidXQgYmVmb3JlIEkvTyAobmV4dFRpY2spIHRvXG4gICAgLy8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScsIGZuKSBjeWNsZXMuIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nXG4gICAgLy8gcmVzdW1lIHdpdGhpbiB0aGUgc2FtZSB0aWNrIHdpbGwgaGF2ZSBub1xuICAgIC8vIGVmZmVjdC5cbiAgICBwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLCB0aGlzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoZXYpIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICB2YXIgc3RhdGUgPSBzZWxmLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHNlbGYubGlzdGVuZXJDb3VudCgncmVhZGFibGUnKSA+IDA7XG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgIXN0YXRlLnBhdXNlZCkge1xuICAgIC8vIGZsb3dpbmcgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgbm93LCBvdGhlcndpc2VcbiAgICAvLyB0aGUgdXBjb21pbmcgcmVzdW1lIHdpbGwgbm90IGZsb3cuXG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG5cbiAgICAvLyBjcnVkZSB3YXkgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIHJlc3VtZVxuICB9IGVsc2UgaWYgKHNlbGYubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMCkge1xuICAgIHNlbGYucmVzdW1lKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIC8vIHdlIGZsb3cgb25seSBpZiB0aGVyZSBpcyBubyBvbmUgbGlzdGVuaW5nXG4gICAgLy8gZm9yIHJlYWRhYmxlLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBjYWxsXG4gICAgLy8gcmVzdW1lKClcbiAgICBzdGF0ZS5mbG93aW5nID0gIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpO1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKTtcbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuICAgIF90aGlzLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBtZXRob2RXcmFwUmV0dXJuRnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICBmb3IgKHZhciBuID0gMDsgbiA8IGtQcm94eUV2ZW50cy5sZW5ndGg7IG4rKykge1xuICAgIHN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIGtQcm94eUV2ZW50c1tuXSkpO1xuICB9XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgdGhpcy5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3InKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKTtcbiAgfTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlQnVmZmVyJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCAncmVhZGFibGVGbG93aW5nJywge1xuICAvLyBtYWtpbmcgaXQgZXhwbGljaXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgZW51bWVyYWJsZVxuICAvLyBiZWNhdXNlIG90aGVyd2lzZSBzb21lIHByb3RvdHlwZSBtYW5pcHVsYXRpb24gaW5cbiAgLy8gdXNlcmxhbmQgd2lsbCBmYWlsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIHNldChzdGF0ZSkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUxlbmd0aCcsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoO1xuICB9XG59KTtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25zdW1lKG4sIHN0YXRlLmRlY29kZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKTtcbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3MubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aCk7XG5cbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gICAgaWYgKHN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgICAvLyBpZiB0aGUgd3JpdGFibGUgc2lkZSBpcyByZWFkeSBmb3IgYXV0b0Rlc3Ryb3kgYXMgd2VsbFxuICAgICAgdmFyIHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgICAgIGlmICghd1N0YXRlIHx8IHdTdGF0ZS5hdXRvRGVzdHJveSAmJiB3U3RhdGUuZmluaXNoZWQpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcm9tID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45412\n")},45471:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU0NzEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL3NoYTEuanM/ZGYyZiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0XG5cdCAgICB2YXIgVyA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0xIGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMSA9IENfYWxnby5TSEExID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3Nixcblx0ICAgICAgICAgICAgICAgIDB4YzNkMmUxZjBcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgZSA9IEhbNF07XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IChuIDw8IDEpIHwgKG4gPj4+IDMxKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdmFyIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGUgKyBXW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGkgPCAyMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKChiICYgYykgfCAofmIgJiBkKSkgKyAweDVhODI3OTk5O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpICsgMHg2ZWQ5ZWJhMTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDYwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpKSAtIDB4NzBlNDQzMjQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGkgPCA4MCkgKi8ge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgLSAweDM1OWQzZTJhO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBlID0gZDtcblx0ICAgICAgICAgICAgICAgIGQgPSBjO1xuXHQgICAgICAgICAgICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcblx0ICAgICAgICAgICAgICAgIGIgPSBhO1xuXHQgICAgICAgICAgICAgICAgYSA9IHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLlNIQTEgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEExKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEExKG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY1NIQTEgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMSk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBMTtcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///45471\n")},45503:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * UTF-16 BE encoding strategy.\n\t */\n\t var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t /**\n\t * Converts a word array to a UTF-16 BE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 BE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 BE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 BE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t /**\n\t * UTF-16 LE encoding strategy.\n\t */\n\t C_enc.Utf16LE = {\n\t /**\n\t * Converts a word array to a UTF-16 LE string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-16 LE string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var utf16Chars = [];\n\t for (var i = 0; i < sigBytes; i += 2) {\n\t var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t utf16Chars.push(String.fromCharCode(codePoint));\n\t }\n\n\t return utf16Chars.join('');\n\t },\n\n\t /**\n\t * Converts a UTF-16 LE string to a word array.\n\t *\n\t * @param {string} utf16Str The UTF-16 LE string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t */\n\t parse: function (utf16Str) {\n\t // Shortcut\n\t var utf16StrLength = utf16Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < utf16StrLength; i++) {\n\t words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t }\n\n\t return WordArray.create(words, utf16StrLength * 2);\n\t }\n\t };\n\n\t function swapEndian(word) {\n\t return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Utf16;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU1MDMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9lbmMtdXRmMTYuanM/YThjZSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBVVEYtMTYgQkUgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBVdGYxNkJFID0gQ19lbmMuVXRmMTYgPSBDX2VuYy5VdGYxNkJFID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIFVURi0xNiBCRSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTE2IEJFIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjE2U3RyaW5nID0gQ3J5cHRvSlMuZW5jLlV0ZjE2LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgxNiAtIChpICUgNCkgKiA4KSkgJiAweGZmZmY7XG5cdCAgICAgICAgICAgICAgICB1dGYxNkNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi0xNiBCRSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgQkUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNi5wYXJzZSh1dGYxNlN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGYxNlN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZTdHJMZW5ndGggPSB1dGYxNlN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1dGYxNlN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAxXSB8PSB1dGYxNlN0ci5jaGFyQ29kZUF0KGkpIDw8ICgxNiAtIChpICUgMikgKiAxNik7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgdXRmMTZTdHJMZW5ndGggKiAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi0xNiBMRSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgQ19lbmMuVXRmMTZMRSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtMTYgTEUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi0xNiBMRSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB1dGYxNlN0ciA9IENyeXB0b0pTLmVuYy5VdGYxNkxFLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgdXRmMTZDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBzd2FwRW5kaWFuKCh3b3Jkc1tpID4+PiAyXSA+Pj4gKDE2IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmZmZik7XG5cdCAgICAgICAgICAgICAgICB1dGYxNkNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi0xNiBMRSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgTEUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNkxFLnBhcnNlKHV0ZjE2U3RyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjE2U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciB1dGYxNlN0ckxlbmd0aCA9IHV0ZjE2U3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHV0ZjE2U3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDFdIHw9IHN3YXBFbmRpYW4odXRmMTZTdHIuY2hhckNvZGVBdChpKSA8PCAoMTYgLSAoaSAlIDIpICogMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCB1dGYxNlN0ckxlbmd0aCAqIDIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIGZ1bmN0aW9uIHN3YXBFbmRpYW4od29yZCkge1xuXHQgICAgICAgIHJldHVybiAoKHdvcmQgPDwgOCkgJiAweGZmMDBmZjAwKSB8ICgod29yZCA+Pj4gOCkgJiAweDAwZmYwMGZmKTtcblx0ICAgIH1cblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuVXRmMTY7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45503\n")},45575:(I,g,n)=>{"use strict";I.exports=n.p+"1f8f4168fa107506db36.png"},45719:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Serbian [sr]\n//! author : Milan Janačković : https://github.com/milan-j\n//! author : Stefan Crnjaković : https://github.com/crnjakovic\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var translator = {\n words: {\n //Different grammatical cases\n ss: ['sekunda', 'sekunde', 'sekundi'],\n m: ['jedan minut', 'jednog minuta'],\n mm: ['minut', 'minuta', 'minuta'],\n h: ['jedan sat', 'jednog sata'],\n hh: ['sat', 'sata', 'sati'],\n d: ['jedan dan', 'jednog dana'],\n dd: ['dan', 'dana', 'dana'],\n M: ['jedan mesec', 'jednog meseca'],\n MM: ['mesec', 'meseca', 'meseci'],\n y: ['jednu godinu', 'jedne godine'],\n yy: ['godinu', 'godine', 'godina'],\n },\n correctGrammaticalCase: function (number, wordKey) {\n if (\n number % 10 >= 1 &&\n number % 10 <= 4 &&\n (number % 100 < 10 || number % 100 >= 20)\n ) {\n return number % 10 === 1 ? wordKey[0] : wordKey[1];\n }\n return wordKey[2];\n },\n translate: function (number, withoutSuffix, key, isFuture) {\n var wordKey = translator.words[key],\n word;\n\n if (key.length === 1) {\n // Nominativ\n if (key === 'y' && withoutSuffix) return 'jedna godina';\n return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];\n }\n\n word = translator.correctGrammaticalCase(number, wordKey);\n // Nominativ\n if (key === 'yy' && withoutSuffix && word === 'godinu') {\n return number + ' godina';\n }\n\n return number + ' ' + word;\n },\n };\n\n var sr = moment.defineLocale('sr', {\n months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n monthsParseExact: true,\n weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(\n '_'\n ),\n weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),\n weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'D. M. YYYY.',\n LL: 'D. MMMM YYYY.',\n LLL: 'D. MMMM YYYY. H:mm',\n LLLL: 'dddd, D. MMMM YYYY. H:mm',\n },\n calendar: {\n sameDay: '[danas u] LT',\n nextDay: '[sutra u] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[u] [nedelju] [u] LT';\n case 3:\n return '[u] [sredu] [u] LT';\n case 6:\n return '[u] [subotu] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[u] dddd [u] LT';\n }\n },\n lastDay: '[juče u] LT',\n lastWeek: function () {\n var lastWeekDays = [\n '[prošle] [nedelje] [u] LT',\n '[prošlog] [ponedeljka] [u] LT',\n '[prošlog] [utorka] [u] LT',\n '[prošle] [srede] [u] LT',\n '[prošlog] [četvrtka] [u] LT',\n '[prošlog] [petka] [u] LT',\n '[prošle] [subote] [u] LT',\n ];\n return lastWeekDays[this.day()];\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'pre %s',\n s: 'nekoliko sekundi',\n ss: translator.translate,\n m: translator.translate,\n mm: translator.translate,\n h: translator.translate,\n hh: translator.translate,\n d: translator.translate,\n dd: translator.translate,\n M: translator.translate,\n MM: translator.translate,\n y: translator.translate,\n yy: translator.translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return sr;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3MTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qcz9jZjFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTZXJiaWFuIFtzcl1cbi8vISBhdXRob3IgOiBNaWxhbiBKYW5hxI1rb3ZpxIc8bWlsYW5qYW5hY2tvdmljQGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vbWlsYW4talxuLy8hIGF1dGhvciA6IFN0ZWZhbiBDcm5qYWtvdmnEhyA8c3RlZmFuQGhvdG1haWwucnM+IDogaHR0cHM6Ly9naXRodWIuY29tL2Nybmpha292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZGEnLCAnc2VrdW5kZScsICdzZWt1bmRpJ10sXG4gICAgICAgICAgICBtOiBbJ2plZGFuIG1pbnV0JywgJ2plZG5vZyBtaW51dGEnXSxcbiAgICAgICAgICAgIG1tOiBbJ21pbnV0JywgJ21pbnV0YScsICdtaW51dGEnXSxcbiAgICAgICAgICAgIGg6IFsnamVkYW4gc2F0JywgJ2plZG5vZyBzYXRhJ10sXG4gICAgICAgICAgICBoaDogWydzYXQnLCAnc2F0YScsICdzYXRpJ10sXG4gICAgICAgICAgICBkOiBbJ2plZGFuIGRhbicsICdqZWRub2cgZGFuYSddLFxuICAgICAgICAgICAgZGQ6IFsnZGFuJywgJ2RhbmEnLCAnZGFuYSddLFxuICAgICAgICAgICAgTTogWydqZWRhbiBtZXNlYycsICdqZWRub2cgbWVzZWNhJ10sXG4gICAgICAgICAgICBNTTogWydtZXNlYycsICdtZXNlY2EnLCAnbWVzZWNpJ10sXG4gICAgICAgICAgICB5OiBbJ2plZG51IGdvZGludScsICdqZWRuZSBnb2RpbmUnXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGludScsICdnb2RpbmUnLCAnZ29kaW5hJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA+PSAxICYmXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgIChudW1iZXIgJSAxMDAgPCAxMCB8fCBudW1iZXIgJSAxMDAgPj0gMjApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldLFxuICAgICAgICAgICAgICAgIHdvcmQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knICYmIHdpdGhvdXRTdWZmaXgpIHJldHVybiAnamVkbmEgZ29kaW5hJztcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JkID0gdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5eScgJiYgd2l0aG91dFN1ZmZpeCAmJiB3b3JkID09PSAnZ29kaW51Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIGdvZGluYSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyB3b3JkO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgc3IgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzcicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydF9hcHJpbF9tYWpfanVuX2p1bF9hdmd1c3Rfc2VwdGVtYmFyX29rdG9iYXJfbm92ZW1iYXJfZGVjZW1iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqX2p1bl9qdWxfYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGVsamFfcG9uZWRlbGpha191dG9yYWtfc3JlZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyZS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuIE0uIFlZWVkuJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZLicsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lIHVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbbmVkZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkZWxqa2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFt1dG9ya2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3NyZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJlICVzJyxcbiAgICAgICAgICAgIHM6ICduZWtvbGlrbyBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3I7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45719\n")},45766:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Lithuanian [lt]\n//! author : Mindaugas Mozūras : https://github.com/mmozuras\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var units = {\n ss: 'sekundė_sekundžių_sekundes',\n m: 'minutė_minutės_minutę',\n mm: 'minutės_minučių_minutes',\n h: 'valanda_valandos_valandą',\n hh: 'valandos_valandų_valandas',\n d: 'diena_dienos_dieną',\n dd: 'dienos_dienų_dienas',\n M: 'mėnuo_mėnesio_mėnesį',\n MM: 'mėnesiai_mėnesių_mėnesius',\n y: 'metai_metų_metus',\n yy: 'metai_metų_metus',\n };\n function translateSeconds(number, withoutSuffix, key, isFuture) {\n if (withoutSuffix) {\n return 'kelios sekundės';\n } else {\n return isFuture ? 'kelių sekundžių' : 'kelias sekundes';\n }\n }\n function translateSingular(number, withoutSuffix, key, isFuture) {\n return withoutSuffix\n ? forms(key)[0]\n : isFuture\n ? forms(key)[1]\n : forms(key)[2];\n }\n function special(number) {\n return number % 10 === 0 || (number > 10 && number < 20);\n }\n function forms(key) {\n return units[key].split('_');\n }\n function translate(number, withoutSuffix, key, isFuture) {\n var result = number + ' ';\n if (number === 1) {\n return (\n result + translateSingular(number, withoutSuffix, key[0], isFuture)\n );\n } else if (withoutSuffix) {\n return result + (special(number) ? forms(key)[1] : forms(key)[0]);\n } else {\n if (isFuture) {\n return result + forms(key)[1];\n } else {\n return result + (special(number) ? forms(key)[1] : forms(key)[2]);\n }\n }\n }\n var lt = moment.defineLocale('lt', {\n months: {\n format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(\n '_'\n ),\n standalone:\n 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(\n '_'\n ),\n isFormat: /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?|MMMM?(\\[[^\\[\\]]*\\]|\\s)+D[oD]?/,\n },\n monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),\n weekdays: {\n format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(\n '_'\n ),\n standalone:\n 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(\n '_'\n ),\n isFormat: /dddd HH:mm/,\n },\n weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),\n weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: 'YYYY [m.] MMMM D [d.]',\n LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',\n l: 'YYYY-MM-DD',\n ll: 'YYYY [m.] MMMM D [d.]',\n lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',\n llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',\n },\n calendar: {\n sameDay: '[Šiandien] LT',\n nextDay: '[Rytoj] LT',\n nextWeek: 'dddd LT',\n lastDay: '[Vakar] LT',\n lastWeek: '[Praėjusį] dddd LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'po %s',\n past: 'prieš %s',\n s: translateSeconds,\n ss: translate,\n m: translateSingular,\n mm: translate,\n h: translateSingular,\n hh: translate,\n d: translateSingular,\n dd: translate,\n M: translateSingular,\n MM: translate,\n y: translateSingular,\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-oji/,\n ordinal: function (number) {\n return number + '-oji';\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return lt;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3NjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHQuanM/MjZmOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGl0aHVhbmlhbiBbbHRdXG4vLyEgYXV0aG9yIDogTWluZGF1Z2FzIE1vesWrcmFzIDogaHR0cHM6Ly9naXRodWIuY29tL21tb3p1cmFzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgIHNzOiAnc2VrdW5kxJdfc2VrdW5kxb5pxbNfc2VrdW5kZXMnLFxuICAgICAgICBtOiAnbWludXTEl19taW51dMSXc19taW51dMSZJyxcbiAgICAgICAgbW06ICdtaW51dMSXc19taW51xI1pxbNfbWludXRlcycsXG4gICAgICAgIGg6ICd2YWxhbmRhX3ZhbGFuZG9zX3ZhbGFuZMSFJyxcbiAgICAgICAgaGg6ICd2YWxhbmRvc192YWxhbmTFs192YWxhbmRhcycsXG4gICAgICAgIGQ6ICdkaWVuYV9kaWVub3NfZGllbsSFJyxcbiAgICAgICAgZGQ6ICdkaWVub3NfZGllbsWzX2RpZW5hcycsXG4gICAgICAgIE06ICdtxJdudW9fbcSXbmVzaW9fbcSXbmVzxK8nLFxuICAgICAgICBNTTogJ23El25lc2lhaV9txJduZXNpxbNfbcSXbmVzaXVzJyxcbiAgICAgICAgeTogJ21ldGFpX21ldMWzX21ldHVzJyxcbiAgICAgICAgeXk6ICdtZXRhaV9tZXTFs19tZXR1cycsXG4gICAgfTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICdrZWxpb3Mgc2VrdW5kxJdzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrZWxpxbMgc2VrdW5kxb5pxbMnIDogJ2tlbGlhcyBzZWt1bmRlcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICA/IGZvcm1zKGtleSlbMF1cbiAgICAgICAgICAgIDogaXNGdXR1cmVcbiAgICAgICAgICAgICAgPyBmb3JtcyhrZXkpWzFdXG4gICAgICAgICAgICAgIDogZm9ybXMoa2V5KVsyXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAwIHx8IChudW1iZXIgPiAxMCAmJiBudW1iZXIgPCAyMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1zKGtleSkge1xuICAgICAgICByZXR1cm4gdW5pdHNba2V5XS5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVzdWx0ICsgdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXlbMF0sIGlzRnV0dXJlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBmb3JtcyhrZXkpWzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbHQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdCcsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzYXVzaW9fdmFzYXJpb19rb3ZvX2JhbGFuZMW+aW9fZ2VndcW+xJdzX2JpcsW+ZWxpb19saWVwb3NfcnVncGrFq8SNaW9fcnVnc8SXam9fc3BhbGlvX2xhcGtyacSNaW9fZ3J1b2TFvmlvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzYXVzaXNfdmFzYXJpc19rb3Zhc19iYWxhbmRpc19nZWd1xb7El19iaXLFvmVsaXNfbGllcGFfcnVncGrFq3Rpc19ydWdzxJdqaXNfc3BhbGlzX2xhcGtyaXRpc19ncnVvZGlzJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NP3xNTU1NPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdzYXVfdmFzX2tvdl9iYWxfZ2VnX2Jpcl9saWVfcmdwX3Jnc19zcGFfbGFwX2dyZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3Nla21hZGllbsSvX3Bpcm1hZGllbsSvX2FudHJhZGllbsSvX3RyZcSNaWFkaWVuxK9fa2V0dmlydGFkaWVuxK9fcGVua3RhZGllbsSvX8WhZcWhdGFkaWVuxK8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3Nla21hZGllbmlzX3Bpcm1hZGllbmlzX2FudHJhZGllbmlzX3RyZcSNaWFkaWVuaXNfa2V0dmlydGFkaWVuaXNfcGVua3RhZGllbmlzX8WhZcWhdGFkaWVuaXMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9kZGRkIEhIOm1tLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nla19QaXJfQW50X1RyZV9LZXRfUGVuX8WgZcWhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NfUF9BX1RfS19Qbl/FoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIEhIOm1tIFt2YWwuXScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBkZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgbGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vFoGlhbmRpZW5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbUnl0b2pdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1Zha2FyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tQcmHEl2p1c8SvXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncG8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWXFoSAlcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGVTZWNvbmRzLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LW9qaS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLW9qaSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsdDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///45766\n")},45951:(I,g,n)=>{"use strict";I.exports=n.p+"42fcd391d2cdc902113a.png"},45953:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(43240));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var C_algo = C.algo;\n\n\t // Constants tables\n\t var RHO_OFFSETS = [];\n\t var PI_INDEXES = [];\n\t var ROUND_CONSTANTS = [];\n\n\t // Compute Constants\n\t (function () {\n\t // Compute rho offset constants\n\t var x = 1, y = 0;\n\t for (var t = 0; t < 24; t++) {\n\t RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t var newX = y % 5;\n\t var newY = (2 * x + 3 * y) % 5;\n\t x = newX;\n\t y = newY;\n\t }\n\n\t // Compute pi index constants\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t }\n\t }\n\n\t // Compute round constants\n\t var LFSR = 0x01;\n\t for (var i = 0; i < 24; i++) {\n\t var roundConstantMsw = 0;\n\t var roundConstantLsw = 0;\n\n\t for (var j = 0; j < 7; j++) {\n\t if (LFSR & 0x01) {\n\t var bitPosition = (1 << j) - 1;\n\t if (bitPosition < 32) {\n\t roundConstantLsw ^= 1 << bitPosition;\n\t } else /* if (bitPosition >= 32) */ {\n\t roundConstantMsw ^= 1 << (bitPosition - 32);\n\t }\n\t }\n\n\t // Compute next LFSR\n\t if (LFSR & 0x80) {\n\t // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t LFSR = (LFSR << 1) ^ 0x71;\n\t } else {\n\t LFSR <<= 1;\n\t }\n\t }\n\n\t ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t }\n\t }());\n\n\t // Reusable objects for temporary values\n\t var T = [];\n\t (function () {\n\t for (var i = 0; i < 25; i++) {\n\t T[i] = X64Word.create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-3 hash algorithm.\n\t */\n\t var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} outputLength\n\t * The desired number of bits in the output hash.\n\t * Only values permitted are: 224, 256, 384, 512.\n\t * Default: 512\n\t */\n\t cfg: Hasher.cfg.extend({\n\t outputLength: 512\n\t }),\n\n\t _doReset: function () {\n\t var state = this._state = []\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = new X64Word.init();\n\t }\n\n\t this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var state = this._state;\n\t var nBlockSizeLanes = this.blockSize / 2;\n\n\t // Absorb\n\t for (var i = 0; i < nBlockSizeLanes; i++) {\n\t // Shortcuts\n\t var M2i = M[offset + 2 * i];\n\t var M2i1 = M[offset + 2 * i + 1];\n\n\t // Swap endian\n\t M2i = (\n\t (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |\n\t (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)\n\t );\n\t M2i1 = (\n\t (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Absorb message into state\n\t var lane = state[i];\n\t lane.high ^= M2i1;\n\t lane.low ^= M2i;\n\t }\n\n\t // Rounds\n\t for (var round = 0; round < 24; round++) {\n\t // Theta\n\t for (var x = 0; x < 5; x++) {\n\t // Mix column lanes\n\t var tMsw = 0, tLsw = 0;\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t tMsw ^= lane.high;\n\t tLsw ^= lane.low;\n\t }\n\n\t // Temporary values\n\t var Tx = T[x];\n\t Tx.high = tMsw;\n\t Tx.low = tLsw;\n\t }\n\t for (var x = 0; x < 5; x++) {\n\t // Shortcuts\n\t var Tx4 = T[(x + 4) % 5];\n\t var Tx1 = T[(x + 1) % 5];\n\t var Tx1Msw = Tx1.high;\n\t var Tx1Lsw = Tx1.low;\n\n\t // Mix surrounding columns\n\t var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t for (var y = 0; y < 5; y++) {\n\t var lane = state[x + 5 * y];\n\t lane.high ^= tMsw;\n\t lane.low ^= tLsw;\n\t }\n\t }\n\n\t // Rho Pi\n\t for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t var tMsw;\n\t var tLsw;\n\n\t // Shortcuts\n\t var lane = state[laneIndex];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\t var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t // Rotate lanes\n\t if (rhoOffset < 32) {\n\t tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t } else /* if (rhoOffset >= 32) */ {\n\t tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t }\n\n\t // Transpose lanes\n\t var TPiLane = T[PI_INDEXES[laneIndex]];\n\t TPiLane.high = tMsw;\n\t TPiLane.low = tLsw;\n\t }\n\n\t // Rho pi at x = y = 0\n\t var T0 = T[0];\n\t var state0 = state[0];\n\t T0.high = state0.high;\n\t T0.low = state0.low;\n\n\t // Chi\n\t for (var x = 0; x < 5; x++) {\n\t for (var y = 0; y < 5; y++) {\n\t // Shortcuts\n\t var laneIndex = x + 5 * y;\n\t var lane = state[laneIndex];\n\t var TLane = T[laneIndex];\n\t var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t // Mix rows\n\t lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);\n\t }\n\t }\n\n\t // Iota\n\t var lane = state[0];\n\t var roundConstant = ROUND_CONSTANTS[round];\n\t lane.high ^= roundConstant.high;\n\t lane.low ^= roundConstant.low;\n\t }\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\t var blockSizeBits = this.blockSize * 32;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var state = this._state;\n\t var outputLengthBytes = this.cfg.outputLength / 8;\n\t var outputLengthLanes = outputLengthBytes / 8;\n\n\t // Squeeze\n\t var hashWords = [];\n\t for (var i = 0; i < outputLengthLanes; i++) {\n\t // Shortcuts\n\t var lane = state[i];\n\t var laneMsw = lane.high;\n\t var laneLsw = lane.low;\n\n\t // Swap endian\n\t laneMsw = (\n\t (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)\n\t );\n\t laneLsw = (\n\t (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)\n\t );\n\n\t // Squeeze state to retrieve hash\n\t hashWords.push(laneLsw);\n\t hashWords.push(laneMsw);\n\t }\n\n\t // Return final computed hash\n\t return new WordArray.init(hashWords, outputLengthBytes);\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\n\t var state = clone._state = this._state.slice(0);\n\t for (var i = 0; i < 25; i++) {\n\t state[i] = state[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA3('message');\n\t * var hash = CryptoJS.SHA3(wordArray);\n\t */\n\t C.SHA3 = Hasher._createHelper(SHA3);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA3(message, key);\n\t */\n\t C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA3;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU5NTMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGEzLmpzP2U2MWIiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL3g2NC1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3g2NC1jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ194NjQgPSBDLng2NDtcblx0ICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIENvbnN0YW50cyB0YWJsZXNcblx0ICAgIHZhciBSSE9fT0ZGU0VUUyA9IFtdO1xuXHQgICAgdmFyIFBJX0lOREVYRVMgID0gW107XG5cdCAgICB2YXIgUk9VTkRfQ09OU1RBTlRTID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgQ29uc3RhbnRzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIENvbXB1dGUgcmhvIG9mZnNldCBjb25zdGFudHNcblx0ICAgICAgICB2YXIgeCA9IDEsIHkgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgMjQ7IHQrKykge1xuXHQgICAgICAgICAgICBSSE9fT0ZGU0VUU1t4ICsgNSAqIHldID0gKCh0ICsgMSkgKiAodCArIDIpIC8gMikgJSA2NDtcblxuXHQgICAgICAgICAgICB2YXIgbmV3WCA9IHkgJSA1O1xuXHQgICAgICAgICAgICB2YXIgbmV3WSA9ICgyICogeCArIDMgKiB5KSAlIDU7XG5cdCAgICAgICAgICAgIHggPSBuZXdYO1xuXHQgICAgICAgICAgICB5ID0gbmV3WTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBDb21wdXRlIHBpIGluZGV4IGNvbnN0YW50c1xuXHQgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgNTsgeCsrKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgNTsgeSsrKSB7XG5cdCAgICAgICAgICAgICAgICBQSV9JTkRFWEVTW3ggKyA1ICogeV0gPSB5ICsgKCgyICogeCArIDMgKiB5KSAlIDUpICogNTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIENvbXB1dGUgcm91bmQgY29uc3RhbnRzXG5cdCAgICAgICAgdmFyIExGU1IgPSAweDAxO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgcm91bmRDb25zdGFudE1zdyA9IDA7XG5cdCAgICAgICAgICAgIHZhciByb3VuZENvbnN0YW50THN3ID0gMDtcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDc7IGorKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKExGU1IgJiAweDAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGJpdFBvc2l0aW9uID0gKDEgPDwgaikgLSAxO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChiaXRQb3NpdGlvbiA8IDMyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kQ29uc3RhbnRMc3cgXj0gMSA8PCBiaXRQb3NpdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGJpdFBvc2l0aW9uID49IDMyKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kQ29uc3RhbnRNc3cgXj0gMSA8PCAoYml0UG9zaXRpb24gLSAzMik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgTEZTUlxuXHQgICAgICAgICAgICAgICAgaWYgKExGU1IgJiAweDgwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWl0aXZlIHBvbHlub21pYWwgb3ZlciBHRigyKTogeF44ICsgeF42ICsgeF41ICsgeF40ICsgMVxuXHQgICAgICAgICAgICAgICAgICAgIExGU1IgPSAoTEZTUiA8PCAxKSBeIDB4NzE7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIExGU1IgPDw9IDE7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBST1VORF9DT05TVEFOVFNbaV0gPSBYNjRXb3JkLmNyZWF0ZShyb3VuZENvbnN0YW50TXN3LCByb3VuZENvbnN0YW50THN3KTtcblx0ICAgICAgICB9XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvLyBSZXVzYWJsZSBvYmplY3RzIGZvciB0ZW1wb3JhcnkgdmFsdWVzXG5cdCAgICB2YXIgVCA9IFtdO1xuXHQgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHtcblx0ICAgICAgICAgICAgVFtpXSA9IFg2NFdvcmQuY3JlYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMyBoYXNoIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFNIQTMgPSBDX2FsZ28uU0hBMyA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdXRwdXRMZW5ndGhcblx0ICAgICAgICAgKiAgIFRoZSBkZXNpcmVkIG51bWJlciBvZiBiaXRzIGluIHRoZSBvdXRwdXQgaGFzaC5cblx0ICAgICAgICAgKiAgIE9ubHkgdmFsdWVzIHBlcm1pdHRlZCBhcmU6IDIyNCwgMjU2LCAzODQsIDUxMi5cblx0ICAgICAgICAgKiAgIERlZmF1bHQ6IDUxMlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogSGFzaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBvdXRwdXRMZW5ndGg6IDUxMlxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGUgPSBbXVxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHN0YXRlW2ldID0gbmV3IFg2NFdvcmQuaW5pdCgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgdGhpcy5ibG9ja1NpemUgPSAoMTYwMCAtIDIgKiB0aGlzLmNmZy5vdXRwdXRMZW5ndGgpIC8gMzI7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGU7XG5cdCAgICAgICAgICAgIHZhciBuQmxvY2tTaXplTGFuZXMgPSB0aGlzLmJsb2NrU2l6ZSAvIDI7XG5cblx0ICAgICAgICAgICAgLy8gQWJzb3JiXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJsb2NrU2l6ZUxhbmVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIE0yaSAgPSBNW29mZnNldCArIDIgKiBpXTtcblx0ICAgICAgICAgICAgICAgIHZhciBNMmkxID0gTVtvZmZzZXQgKyAyICogaSArIDFdO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICAgICAgTTJpID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE0yaSA8PCA4KSAgfCAoTTJpID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE0yaSA8PCAyNCkgfCAoTTJpID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgICAgICBNMmkxID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE0yaTEgPDwgOCkgIHwgKE0yaTEgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTTJpMSA8PCAyNCkgfCAoTTJpMSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBBYnNvcmIgbWVzc2FnZSBpbnRvIHN0YXRlXG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlW2ldO1xuXHQgICAgICAgICAgICAgICAgbGFuZS5oaWdoIF49IE0yaTE7XG5cdCAgICAgICAgICAgICAgICBsYW5lLmxvdyAgXj0gTTJpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUm91bmRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIHJvdW5kID0gMDsgcm91bmQgPCAyNDsgcm91bmQrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gVGhldGFcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgNTsgeCsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTWl4IGNvbHVtbiBsYW5lc1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0TXN3ID0gMCwgdExzdyA9IDA7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCA1OyB5KyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVt4ICsgNSAqIHldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0TXN3IF49IGxhbmUuaGlnaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdExzdyBePSBsYW5lLmxvdztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgdmFsdWVzXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFR4ID0gVFt4XTtcblx0ICAgICAgICAgICAgICAgICAgICBUeC5oaWdoID0gdE1zdztcblx0ICAgICAgICAgICAgICAgICAgICBUeC5sb3cgID0gdExzdztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgNTsgeCsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFR4NCA9IFRbKHggKyA0KSAlIDVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBUeDEgPSBUWyh4ICsgMSkgJSA1XTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgVHgxTXN3ID0gVHgxLmhpZ2g7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFR4MUxzdyA9IFR4MS5sb3c7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBNaXggc3Vycm91bmRpbmcgY29sdW1uc1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0TXN3ID0gVHg0LmhpZ2ggXiAoKFR4MU1zdyA8PCAxKSB8IChUeDFMc3cgPj4+IDMxKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRMc3cgPSBUeDQubG93ICBeICgoVHgxTHN3IDw8IDEpIHwgKFR4MU1zdyA+Pj4gMzEpKTtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlW3ggKyA1ICogeV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxhbmUuaGlnaCBePSB0TXN3O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmxvdyAgXj0gdExzdztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJobyBQaVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgbGFuZUluZGV4ID0gMTsgbGFuZUluZGV4IDwgMjU7IGxhbmVJbmRleCsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRNc3c7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRMc3c7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlW2xhbmVJbmRleF07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVNc3cgPSBsYW5lLmhpZ2g7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVMc3cgPSBsYW5lLmxvdztcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcmhvT2Zmc2V0ID0gUkhPX09GRlNFVFNbbGFuZUluZGV4XTtcblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBsYW5lc1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChyaG9PZmZzZXQgPCAzMikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0TXN3ID0gKGxhbmVNc3cgPDwgcmhvT2Zmc2V0KSB8IChsYW5lTHN3ID4+PiAoMzIgLSByaG9PZmZzZXQpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdExzdyA9IChsYW5lTHN3IDw8IHJob09mZnNldCkgfCAobGFuZU1zdyA+Pj4gKDMyIC0gcmhvT2Zmc2V0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChyaG9PZmZzZXQgPj0gMzIpICovIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdE1zdyA9IChsYW5lTHN3IDw8IChyaG9PZmZzZXQgLSAzMikpIHwgKGxhbmVNc3cgPj4+ICg2NCAtIHJob09mZnNldCkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0THN3ID0gKGxhbmVNc3cgPDwgKHJob09mZnNldCAtIDMyKSkgfCAobGFuZUxzdyA+Pj4gKDY0IC0gcmhvT2Zmc2V0KSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3NlIGxhbmVzXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIFRQaUxhbmUgPSBUW1BJX0lOREVYRVNbbGFuZUluZGV4XV07XG5cdCAgICAgICAgICAgICAgICAgICAgVFBpTGFuZS5oaWdoID0gdE1zdztcblx0ICAgICAgICAgICAgICAgICAgICBUUGlMYW5lLmxvdyAgPSB0THN3O1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBSaG8gcGkgYXQgeCA9IHkgPSAwXG5cdCAgICAgICAgICAgICAgICB2YXIgVDAgPSBUWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHN0YXRlMCA9IHN0YXRlWzBdO1xuXHQgICAgICAgICAgICAgICAgVDAuaGlnaCA9IHN0YXRlMC5oaWdoO1xuXHQgICAgICAgICAgICAgICAgVDAubG93ICA9IHN0YXRlMC5sb3c7XG5cblx0ICAgICAgICAgICAgICAgIC8vIENoaVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVJbmRleCA9IHggKyA1ICogeTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtsYW5lSW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVExhbmUgPSBUW2xhbmVJbmRleF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBUeDFMYW5lID0gVFsoKHggKyAxKSAlIDUpICsgNSAqIHldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVHgyTGFuZSA9IFRbKCh4ICsgMikgJSA1KSArIDUgKiB5XTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggcm93c1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmhpZ2ggPSBUTGFuZS5oaWdoIF4gKH5UeDFMYW5lLmhpZ2ggJiBUeDJMYW5lLmhpZ2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsYW5lLmxvdyAgPSBUTGFuZS5sb3cgIF4gKH5UeDFMYW5lLmxvdyAgJiBUeDJMYW5lLmxvdyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJb3RhXG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlWzBdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnQgPSBST1VORF9DT05TVEFOVFNbcm91bmRdO1xuXHQgICAgICAgICAgICAgICAgbGFuZS5oaWdoIF49IHJvdW5kQ29uc3RhbnQuaGlnaDtcblx0ICAgICAgICAgICAgICAgIGxhbmUubG93ICBePSByb3VuZENvbnN0YW50Lmxvdztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQml0cyA9IHRoaXMuYmxvY2tTaXplICogMzI7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHgxIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoTWF0aC5jZWlsKChuQml0c0xlZnQgKyAxKSAvIGJsb2NrU2l6ZUJpdHMpICogYmxvY2tTaXplQml0cykgPj4+IDUpIC0gMV0gfD0gMHg4MDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGU7XG5cdCAgICAgICAgICAgIHZhciBvdXRwdXRMZW5ndGhCeXRlcyA9IHRoaXMuY2ZnLm91dHB1dExlbmd0aCAvIDg7XG5cdCAgICAgICAgICAgIHZhciBvdXRwdXRMZW5ndGhMYW5lcyA9IG91dHB1dExlbmd0aEJ5dGVzIC8gODtcblxuXHQgICAgICAgICAgICAvLyBTcXVlZXplXG5cdCAgICAgICAgICAgIHZhciBoYXNoV29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRwdXRMZW5ndGhMYW5lczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbaV07XG5cdCAgICAgICAgICAgICAgICB2YXIgbGFuZU1zdyA9IGxhbmUuaGlnaDtcblx0ICAgICAgICAgICAgICAgIHZhciBsYW5lTHN3ID0gbGFuZS5sb3c7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgICAgICBsYW5lTXN3ID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKGxhbmVNc3cgPDwgOCkgIHwgKGxhbmVNc3cgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgKCgobGFuZU1zdyA8PCAyNCkgfCAobGFuZU1zdyA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICAgICAgbGFuZUxzdyA9IChcblx0ICAgICAgICAgICAgICAgICAgICAoKChsYW5lTHN3IDw8IDgpICB8IChsYW5lTHN3ID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICgoKGxhbmVMc3cgPDwgMjQpIHwgKGxhbmVMc3cgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICAgICAgKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gU3F1ZWV6ZSBzdGF0ZSB0byByZXRyaWV2ZSBoYXNoXG5cdCAgICAgICAgICAgICAgICBoYXNoV29yZHMucHVzaChsYW5lTHN3KTtcblx0ICAgICAgICAgICAgICAgIGhhc2hXb3Jkcy5wdXNoKGxhbmVNc3cpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdChoYXNoV29yZHMsIG91dHB1dExlbmd0aEJ5dGVzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgdmFyIHN0YXRlID0gY2xvbmUuX3N0YXRlID0gdGhpcy5fc3RhdGUuc2xpY2UoMCk7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgc3RhdGVbaV0gPSBzdGF0ZVtpXS5jbG9uZSgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMygnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMyh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLlNIQTMgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEEzKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEEzKG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY1NIQTMgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMyk7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTM7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///45953\n")},46226:(I,g,n)=>{"use strict";I.exports=n.p+"a4dabe2bef0e212a7236.png"},46637:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Slovenian [sl]\n//! author : Robert Sedovšek : https://github.com/sedovsek\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n var result = number + ' ';\n switch (key) {\n case 's':\n return withoutSuffix || isFuture\n ? 'nekaj sekund'\n : 'nekaj sekundami';\n case 'ss':\n if (number === 1) {\n result += withoutSuffix ? 'sekundo' : 'sekundi';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';\n } else if (number < 5) {\n result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';\n } else {\n result += 'sekund';\n }\n return result;\n case 'm':\n return withoutSuffix ? 'ena minuta' : 'eno minuto';\n case 'mm':\n if (number === 1) {\n result += withoutSuffix ? 'minuta' : 'minuto';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'minuti' : 'minutama';\n } else if (number < 5) {\n result += withoutSuffix || isFuture ? 'minute' : 'minutami';\n } else {\n result += withoutSuffix || isFuture ? 'minut' : 'minutami';\n }\n return result;\n case 'h':\n return withoutSuffix ? 'ena ura' : 'eno uro';\n case 'hh':\n if (number === 1) {\n result += withoutSuffix ? 'ura' : 'uro';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'uri' : 'urama';\n } else if (number < 5) {\n result += withoutSuffix || isFuture ? 'ure' : 'urami';\n } else {\n result += withoutSuffix || isFuture ? 'ur' : 'urami';\n }\n return result;\n case 'd':\n return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';\n case 'dd':\n if (number === 1) {\n result += withoutSuffix || isFuture ? 'dan' : 'dnem';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';\n } else {\n result += withoutSuffix || isFuture ? 'dni' : 'dnevi';\n }\n return result;\n case 'M':\n return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';\n case 'MM':\n if (number === 1) {\n result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';\n } else if (number < 5) {\n result += withoutSuffix || isFuture ? 'mesece' : 'meseci';\n } else {\n result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';\n }\n return result;\n case 'y':\n return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';\n case 'yy':\n if (number === 1) {\n result += withoutSuffix || isFuture ? 'leto' : 'letom';\n } else if (number === 2) {\n result += withoutSuffix || isFuture ? 'leti' : 'letoma';\n } else if (number < 5) {\n result += withoutSuffix || isFuture ? 'leta' : 'leti';\n } else {\n result += withoutSuffix || isFuture ? 'let' : 'leti';\n }\n return result;\n }\n }\n\n var sl = moment.defineLocale('sl', {\n months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),\n weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),\n weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD. MM. YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd, D. MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[danes ob] LT',\n nextDay: '[jutri ob] LT',\n\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[v] [nedeljo] [ob] LT';\n case 3:\n return '[v] [sredo] [ob] LT';\n case 6:\n return '[v] [soboto] [ob] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[v] dddd [ob] LT';\n }\n },\n lastDay: '[včeraj ob] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n return '[prejšnjo] [nedeljo] [ob] LT';\n case 3:\n return '[prejšnjo] [sredo] [ob] LT';\n case 6:\n return '[prejšnjo] [soboto] [ob] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[prejšnji] dddd [ob] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'čez %s',\n past: 'pred %s',\n s: processRelativeTime,\n ss: processRelativeTime,\n m: processRelativeTime,\n mm: processRelativeTime,\n h: processRelativeTime,\n hh: processRelativeTime,\n d: processRelativeTime,\n dd: processRelativeTime,\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return sl;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY2MzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qcz84MTU1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTbG92ZW5pYW4gW3NsXVxuLy8hIGF1dGhvciA6IFJvYmVydCBTZWRvdsWhZWsgOiBodHRwczovL2dpdGh1Yi5jb20vc2Vkb3ZzZWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICA/ICduZWthaiBzZWt1bmQnXG4gICAgICAgICAgICAgICAgICAgIDogJ25la2FqIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICdzZWt1bmRvJyA6ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWt1bmRpJyA6ICdzZWt1bmRhaCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGUnIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdlbmEgbWludXRhJyA6ICdlbm8gbWludXRvJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXRvJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGknIDogJ21pbnV0YW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXRlJyA6ICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXQnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSB1cmEnIDogJ2VubyB1cm8nO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAndXJhJyA6ICd1cm8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyaScgOiAndXJhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cmUnIDogJ3VyYW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cicgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gZGFuJyA6ICdlbmltIGRuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGFuJyA6ICdkbmVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkbmknIDogJ2RuZXZvbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldmknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gbWVzZWMnIDogJ2VuaW0gbWVzZWNlbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlYycgOiAnbWVzZWNlbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNhJyA6ICdtZXNlY2VtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZScgOiAnbWVzZWNpJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2V2JyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW5vIGxldG8nIDogJ2VuaW0gbGV0b20nO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0bycgOiAnbGV0b20nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGknIDogJ2xldG9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGEnIDogJ2xldGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldCcgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2wgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzbCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyZWNfYXByaWxfbWFqX2p1bmlqX2p1bGlqX2F2Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWouX2p1bi5fanVsLl9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlbGphX3BvbmVkZWxqZWtfdG9yZWtfc3JlZGFfxI1ldHJ0ZWtfcGV0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3Rvci5fc3JlLl/EjWV0Ll9wZXQuX3NvYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdG9fc3JfxI1lX3BlX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuIE1NLiBZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmVzIG9iXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2p1dHJpIG9iXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtuZWRlbGpvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW3NvYm90b10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhaiBvYl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbbmVkZWxqb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW3NyZWRvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbc29ib3RvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmppXSBkZGRkIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8SNZXogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNsO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///46637\n")},46889:(I,g,n)=>{"use strict";I.exports=n.p+"3ba9d142d23b008b564c.png"},47763:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar enhanceError = __webpack_require__(5449);\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc3NjMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanM/MmQ4MyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBlbmhhbmNlRXJyb3IgPSByZXF1aXJlKCcuL2VuaGFuY2VFcnJvcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVFcnJvcihtZXNzYWdlLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47763\n")},47777:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Bulgarian [bg]\n//! author : Krasen Borisov : https://github.com/kraz\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var bg = moment.defineLocale('bg', {\n months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(\n '_'\n ),\n monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),\n weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(\n '_'\n ),\n weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),\n weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'D.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY H:mm',\n LLLL: 'dddd, D MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[Днес в] LT',\n nextDay: '[Утре в] LT',\n nextWeek: 'dddd [в] LT',\n lastDay: '[Вчера в] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n case 3:\n case 6:\n return '[Миналата] dddd [в] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[Миналия] dddd [в] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'след %s',\n past: 'преди %s',\n s: 'няколко секунди',\n ss: '%d секунди',\n m: 'минута',\n mm: '%d минути',\n h: 'час',\n hh: '%d часа',\n d: 'ден',\n dd: '%d дена',\n w: 'седмица',\n ww: '%d седмици',\n M: 'месец',\n MM: '%d месеца',\n y: 'година',\n yy: '%d години',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}-(ев|ен|ти|ви|ри|ми)/,\n ordinal: function (number) {\n var lastDigit = number % 10,\n last2Digits = number % 100;\n if (number === 0) {\n return number + '-ев';\n } else if (last2Digits === 0) {\n return number + '-ен';\n } else if (last2Digits > 10 && last2Digits < 20) {\n return number + '-ти';\n } else if (lastDigit === 1) {\n return number + '-ви';\n } else if (lastDigit === 2) {\n return number + '-ри';\n } else if (lastDigit === 7 || lastDigit === 8) {\n return number + '-ми';\n } else {\n return number + '-ти';\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return bg;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc3NzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZy5qcz84NGFhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCdWxnYXJpYW4gW2JnXVxuLy8hIGF1dGhvciA6IEtyYXNlbiBCb3Jpc292IDogaHR0cHM6Ly9naXRodWIuY29tL2tyYXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBiZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JnJywge1xuICAgICAgICBtb250aHM6ICfRj9C90YPQsNGA0Lhf0YTQtdCy0YDRg9Cw0YDQuF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQstGA0Lhf0L7QutGC0L7QvNCy0YDQuF/QvdC+0LXQvNCy0YDQuF/QtNC10LrQtdC80LLRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Rg1/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10LvRj1/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0Y/QtNCwX9GH0LXRgtCy0YrRgNGC0YrQul/Qv9C10YLRitC6X9GB0YrQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDRj1/Rh9C10YJf0L/QtdGCX9GB0YrQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQlNC90LXRgSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQo9GC0YDQtSDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9Cw0YLQsF0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JzQuNC90LDQu9C40Y9dIGRkZGQgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0YHQu9C10LQgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtdC00LggJXMnLFxuICAgICAgICAgICAgczogJ9C90Y/QutC+0LvQutC+INGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbTogJ9C80LjQvdGD0YLQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YfQsNGB0LAnLFxuICAgICAgICAgICAgZDogJ9C00LXQvScsXG4gICAgICAgICAgICBkZDogJyVkINC00LXQvdCwJyxcbiAgICAgICAgICAgIHc6ICfRgdC10LTQvNC40YbQsCcsXG4gICAgICAgICAgICB3dzogJyVkINGB0LXQtNC80LjRhtC4JyxcbiAgICAgICAgICAgIE06ICfQvNC10YHQtdGGJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQtdGB0LXRhtCwJyxcbiAgICAgICAgICAgIHk6ICfQs9C+0LTQuNC90LAnLFxuICAgICAgICAgICAgeXk6ICclZCDQs9C+0LTQuNC90LgnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC10LJ80LXQvXzRgtC4fNCy0Lh80YDQuHzQvNC4KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBsYXN0MkRpZ2l0cyA9IG51bWJlciAlIDEwMDtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdCyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdC9JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPiAxMCAmJiBsYXN0MkRpZ2l0cyA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCy0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgNC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA3IHx8IGxhc3REaWdpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC80LgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJnO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47777\n")},48287:(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n\n\nconst base64 = __webpack_require__(67526)\nconst ieee754 = __webpack_require__(251)\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgyODcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzP2I2MzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbmNvbnN0IGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbmNvbnN0IGN1c3RvbUluc3BlY3RTeW1ib2wgPVxuICAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA/IFN5bWJvbFsnZm9yJ10oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA6IG51bGxcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG5jb25zdCBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGNvbnN0IHByb3RvID0geyBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZylcbiAgfVxuICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheVZpZXcodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIChpc0luc3RhbmNlKHZhbHVlLCBTaGFyZWRBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgU2hhcmVkQXJyYXlCdWZmZXIpKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgY29uc3QgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgY29uc3QgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLCBVaW50OEFycmF5KVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICBjb25zdCBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICBsZXQgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICBjb25zdCBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheVZpZXcgKGFycmF5Vmlldykge1xuICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7XG4gICAgY29uc3QgY29weSA9IG5ldyBVaW50OEFycmF5KGFycmF5VmlldylcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKGNvcHkuYnVmZmVyLCBjb3B5LmJ5dGVPZmZzZXQsIGNvcHkuYnl0ZUxlbmd0aClcbiAgfVxuICByZXR1cm4gZnJvbUFycmF5TGlrZShhcnJheVZpZXcpXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBsZXQgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIGNvbnN0IGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIGxldCB4ID0gYS5sZW5ndGhcbiAgbGV0IHkgPSBiLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgbGV0IGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICBsZXQgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGxldCBidWYgPSBsaXN0W2ldXG4gICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgaWYgKHBvcyArIGJ1Zi5sZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICAgICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgYnVmLFxuICAgICAgICAgIHBvc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIH1cbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgY29uc3QgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJjaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgY29uc3QgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgbGV0IHN0ciA9ICcnXG4gIGNvbnN0IG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5pZiAoY3VzdG9tSW5zcGVjdFN5bWJvbCkge1xuICBCdWZmZXIucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIGxldCB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICBsZXQgeSA9IGVuZCAtIHN0YXJ0XG4gIGNvbnN0IGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgY29uc3QgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIGxldCBpbmRleFNpemUgPSAxXG4gIGxldCBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIGxldCB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIGxldCBpXG4gIGlmIChkaXIpIHtcbiAgICBsZXQgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIGNvbnN0IHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgY29uc3QgcmVzID0gW11cblxuICBsZXQgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgY29uc3QgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgbGV0IGNvZGVQb2ludCA9IG51bGxcbiAgICBsZXQgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKVxuICAgICAgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKVxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIGxldCBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbmNvbnN0IE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICBjb25zdCBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICBsZXQgb3V0ID0gJydcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICBsZXQgcmVzID0gJydcbiAgLy8gSWYgYnl0ZXMubGVuZ3RoIGlzIG9kZCwgdGhlIGxhc3QgOCBiaXRzIG11c3QgYmUgaWdub3JlZCAoc2FtZSBhcyBub2RlLmpzKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICBjb25zdCBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XVxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIGxldCBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NExFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgbG8gPSBmaXJzdCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDI0XG5cbiAgY29uc3QgaGkgPSB0aGlzWysrb2Zmc2V0XSArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgbGFzdCAqIDIgKiogMjRcblxuICByZXR1cm4gQmlnSW50KGxvKSArIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnVUludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCBoaSA9IGZpcnN0ICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICBjb25zdCBsbyA9IHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgbGFzdFxuXG4gIHJldHVybiAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChsbylcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgaSA9IGJ5dGVMZW5ndGhcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgNF0gK1xuICAgIHRoaXNbb2Zmc2V0ICsgNV0gKiAyICoqIDggK1xuICAgIHRoaXNbb2Zmc2V0ICsgNl0gKiAyICoqIDE2ICtcbiAgICAobGFzdCA8PCAyNCkgLy8gT3ZlcmZsb3dcblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQoZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNClcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSAoZmlyc3QgPDwgMjQpICsgLy8gT3ZlcmZsb3dcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XVxuXG4gIHJldHVybiAoQmlnSW50KHZhbCkgPDwgQmlnSW50KDMyKSkgK1xuICAgIEJpZ0ludCh0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3QpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OCA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyTEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NExFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIHJldHVybiBvZmZzZXRcbn1cblxuZnVuY3Rpb24gd3J0QmlnVUludDY0QkUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbWluLCBtYXgpIHtcbiAgY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCA3KVxuXG4gIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCArIDddID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA2XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNV0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDRdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyAzXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0ICsgMl0gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDFdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXRdID0gaGlcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0TEUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRCRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSAwXG4gIGxldCBtdWwgPSAxXG4gIGxldCBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoIC0gMVxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCcweDgwMDAwMDAwMDAwMDAwMDAnKSwgQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICBjb25zdCBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICB2YWwgPSBOdW1iZXIodmFsKVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIGxldCBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICBjb25zdCBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIENVU1RPTSBFUlJPUlNcbi8vID09PT09PT09PT09PT1cblxuLy8gU2ltcGxpZmllZCB2ZXJzaW9ucyBmcm9tIE5vZGUsIGNoYW5nZWQgZm9yIEJ1ZmZlci1vbmx5IHVzYWdlXG5jb25zdCBlcnJvcnMgPSB7fVxuZnVuY3Rpb24gRSAoc3ltLCBnZXRNZXNzYWdlLCBCYXNlKSB7XG4gIGVycm9yc1tzeW1dID0gY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgc3VwZXIoKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICAgIHZhbHVlOiBnZXRNZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCB0aGUgZXJyb3IgY29kZSB0byB0aGUgbmFtZSB0byBpbmNsdWRlIGl0IGluIHRoZSBzdGFjayB0cmFjZS5cbiAgICAgIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7c3ltfV1gXG4gICAgICAvLyBBY2Nlc3MgdGhlIHN0YWNrIHRvIGdlbmVyYXRlIHRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGluZyB0aGUgZXJyb3IgY29kZVxuICAgICAgLy8gZnJvbSB0aGUgbmFtZS5cbiAgICAgIHRoaXMuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgIC8vIFJlc2V0IHRoZSBuYW1lIHRvIHRoZSBhY3R1YWwgbmFtZS5cbiAgICAgIGRlbGV0ZSB0aGlzLm5hbWVcbiAgICB9XG5cbiAgICBnZXQgY29kZSAoKSB7XG4gICAgICByZXR1cm4gc3ltXG4gICAgfVxuXG4gICAgc2V0IGNvZGUgKHZhbHVlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvZGUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRvU3RyaW5nICgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3N5bX1dOiAke3RoaXMubWVzc2FnZX1gXG4gICAgfVxuICB9XG59XG5cbkUoJ0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUycsXG4gIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgXG4gICAgfVxuXG4gICAgcmV0dXJuICdBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzJ1xuICB9LCBSYW5nZUVycm9yKVxuRSgnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBmdW5jdGlvbiAobmFtZSwgYWN0dWFsKSB7XG4gICAgcmV0dXJuIGBUaGUgXCIke25hbWV9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YFxuICB9LCBUeXBlRXJyb3IpXG5FKCdFUlJfT1VUX09GX1JBTkdFJyxcbiAgZnVuY3Rpb24gKHN0ciwgcmFuZ2UsIGlucHV0KSB7XG4gICAgbGV0IG1zZyA9IGBUaGUgdmFsdWUgb2YgXCIke3N0cn1cIiBpcyBvdXQgb2YgcmFuZ2UuYFxuICAgIGxldCByZWNlaXZlZCA9IGlucHV0XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5wdXQpICYmIE1hdGguYWJzKGlucHV0KSA+IDIgKiogMzIpIHtcbiAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKFN0cmluZyhpbnB1dCkpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZWNlaXZlZCA9IFN0cmluZyhpbnB1dClcbiAgICAgIGlmIChpbnB1dCA+IEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpIHx8IGlucHV0IDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9XG4gICAgbXNnICs9IGAgSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gICAgcmV0dXJuIG1zZ1xuICB9LCBSYW5nZUVycm9yKVxuXG5mdW5jdGlvbiBhZGROdW1lcmljYWxTZXBhcmF0b3IgKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cblxuLy8gQ0hFQ0sgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY2hlY2tCb3VuZHMgKGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGlmIChidWZbb2Zmc2V0XSA9PT0gdW5kZWZpbmVkIHx8IGJ1ZltvZmZzZXQgKyBieXRlTGVuZ3RoXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCBidWYubGVuZ3RoIC0gKGJ5dGVMZW5ndGggKyAxKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludEJJICh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikge1xuICAgIGNvbnN0IG4gPSB0eXBlb2YgbWluID09PSAnYmlnaW50JyA/ICduJyA6ICcnXG4gICAgbGV0IHJhbmdlXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAzKSB7XG4gICAgICBpZiAobWluID09PSAwIHx8IG1pbiA9PT0gQmlnSW50KDApKSB7XG4gICAgICAgIHJhbmdlID0gYD49IDAke259IGFuZCA8IDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDh9JHtufWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlID0gYD49IC0oMiR7bn0gKiogJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufSkgYW5kIDwgMiAqKiBgICtcbiAgICAgICAgICAgICAgICBgJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufWBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UgPSBgPj0gJHttaW59JHtufSBhbmQgPD0gJHttYXh9JHtufWBcbiAgICB9XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKCd2YWx1ZScsIHJhbmdlLCB2YWx1ZSlcbiAgfVxuICBjaGVja0JvdW5kcyhidWYsIG9mZnNldCwgYnl0ZUxlbmd0aClcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIgKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gYm91bmRzRXJyb3IgKHZhbHVlLCBsZW5ndGgsIHR5cGUpIHtcbiAgaWYgKE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkge1xuICAgIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCB0eXBlKVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSh0eXBlIHx8ICdvZmZzZXQnLCAnYW4gaW50ZWdlcicsIHZhbHVlKVxuICB9XG5cbiAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUygpXG4gIH1cblxuICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA+PSAke3R5cGUgPyAxIDogMH0gYW5kIDw9ICR7bGVuZ3RofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSlcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG5jb25zdCBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgbGV0IGNvZGVQb2ludFxuICBjb25zdCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIGxldCBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIGNvbnN0IGJ5dGVBcnJheSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgbGV0IGMsIGhpLCBsb1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGxldCBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG4vLyBDcmVhdGUgbG9va3VwIHRhYmxlIGZvciBgdG9TdHJpbmcoJ2hleCcpYFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMjE5XG5jb25zdCBoZXhTbGljZUxvb2t1cFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZidcbiAgY29uc3QgdGFibGUgPSBuZXcgQXJyYXkoMjU2KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBjb25zdCBpMTYgPSBpICogMTZcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaV0gKyBhbHBoYWJldFtqXVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFibGVcbn0pKClcblxuLy8gUmV0dXJuIG5vdCBmdW5jdGlvbiB3aXRoIEVycm9yIGlmIEJpZ0ludCBub3Qgc3VwcG9ydGVkXG5mdW5jdGlvbiBkZWZpbmVCaWdJbnRNZXRob2QgKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IEJ1ZmZlckJpZ0ludE5vdERlZmluZWQgOiBmblxufVxuXG5mdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdCaWdJbnQgbm90IHN1cHBvcnRlZCcpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///48287\n")},48303:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Portuguese (Brazil) [pt-br]\n//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ptBr = moment.defineLocale('pt-br', {\n months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(\n '_'\n ),\n monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),\n weekdays:\n 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(\n '_'\n ),\n weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),\n weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D [de] MMMM [de] YYYY',\n LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',\n LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',\n },\n calendar: {\n sameDay: '[Hoje às] LT',\n nextDay: '[Amanhã às] LT',\n nextWeek: 'dddd [às] LT',\n lastDay: '[Ontem às] LT',\n lastWeek: function () {\n return this.day() === 0 || this.day() === 6\n ? '[Último] dddd [às] LT' // Saturday + Sunday\n : '[Última] dddd [às] LT'; // Monday - Friday\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'em %s',\n past: 'há %s',\n s: 'poucos segundos',\n ss: '%d segundos',\n m: 'um minuto',\n mm: '%d minutos',\n h: 'uma hora',\n hh: '%d horas',\n d: 'um dia',\n dd: '%d dias',\n M: 'um mês',\n MM: '%d meses',\n y: 'um ano',\n yy: '%d anos',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n invalidDate: 'Data inválida',\n });\n\n return ptBr;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgzMDMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzP2QyZDQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBvcnR1Z3Vlc2UgKEJyYXppbCkgW3B0LWJyXVxuLy8hIGF1dGhvciA6IENhaW8gUmliZWlybyBQZXJlaXJhIDogaHR0cHM6Ly9naXRodWIuY29tL2NhaW8tcmliZWlyby1wZXJlaXJhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgcHRCciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3B0LWJyJywge1xuICAgICAgICBtb250aHM6ICdqYW5laXJvX2ZldmVyZWlyb19tYXLDp29fYWJyaWxfbWFpb19qdW5ob19qdWxob19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZXplbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmV2X21hcl9hYnJfbWFpX2p1bl9qdWxfYWdvX3NldF9vdXRfbm92X2Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnZG9taW5nb19zZWd1bmRhLWZlaXJhX3RlcsOnYS1mZWlyYV9xdWFydGEtZmVpcmFfcXVpbnRhLWZlaXJhX3NleHRhLWZlaXJhX3PDoWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9zZWdfdGVyX3F1YV9xdWlfc2V4X3PDoWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fMsKqXzPCql80wqpfNcKqXzbCql9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgW8Ogc10gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2plIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbWFuaMOjIMOgc10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbT250ZW0gw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDZcbiAgICAgICAgICAgICAgICAgICAgPyAnW8OabHRpbW9dIGRkZGQgW8Ogc10gTFQnIC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgIDogJ1vDmmx0aW1hXSBkZGRkIFvDoHNdIExUJzsgLy8gTW9uZGF5IC0gRnJpZGF5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaMOhICVzJyxcbiAgICAgICAgICAgIHM6ICdwb3Vjb3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW0gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW1hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGlhcycsXG4gICAgICAgICAgICBNOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1bSBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIGludmFsaWREYXRlOiAnRGF0YSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHB0QnI7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///48303\n")},48414:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Uyghur (China) [ug-cn]\n//! author: boyaq : https://github.com/boyaq\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ugCn = moment.defineLocale('ug-cn', {\n months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n '_'\n ),\n monthsShort:\n 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(\n '_'\n ),\n weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(\n '_'\n ),\n weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY-MM-DD',\n LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',\n LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',\n },\n meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (\n meridiem === 'يېرىم كېچە' ||\n meridiem === 'سەھەر' ||\n meridiem === 'چۈشتىن بۇرۇن'\n ) {\n return hour;\n } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {\n return hour + 12;\n } else {\n return hour >= 11 ? hour : hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n var hm = hour * 100 + minute;\n if (hm < 600) {\n return 'يېرىم كېچە';\n } else if (hm < 900) {\n return 'سەھەر';\n } else if (hm < 1130) {\n return 'چۈشتىن بۇرۇن';\n } else if (hm < 1230) {\n return 'چۈش';\n } else if (hm < 1800) {\n return 'چۈشتىن كېيىن';\n } else {\n return 'كەچ';\n }\n },\n calendar: {\n sameDay: '[بۈگۈن سائەت] LT',\n nextDay: '[ئەتە سائەت] LT',\n nextWeek: '[كېلەركى] dddd [سائەت] LT',\n lastDay: '[تۆنۈگۈن] LT',\n lastWeek: '[ئالدىنقى] dddd [سائەت] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s كېيىن',\n past: '%s بۇرۇن',\n s: 'نەچچە سېكونت',\n ss: '%d سېكونت',\n m: 'بىر مىنۇت',\n mm: '%d مىنۇت',\n h: 'بىر سائەت',\n hh: '%d سائەت',\n d: 'بىر كۈن',\n dd: '%d كۈن',\n M: 'بىر ئاي',\n MM: '%d ئاي',\n y: 'بىر يىل',\n yy: '%d يىل',\n },\n\n dayOfMonthOrdinalParse: /\\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '-كۈنى';\n case 'w':\n case 'W':\n return number + '-ھەپتە';\n default:\n return number;\n }\n },\n preparse: function (string) {\n return string.replace(/،/g, ',');\n },\n postformat: function (string) {\n return string.replace(/,/g, '،');\n },\n week: {\n // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 1st is the first week of the year.\n },\n });\n\n return ugCn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg0MTQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qcz82MTE3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVeWdodXIgKENoaW5hKSBbdWctY25dXG4vLyEgYXV0aG9yOiBib3lhcSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ib3lhcVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVnQ24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1Zy1jbicsIHtcbiAgICAgICAgbW9udGhzOiAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2KfZhtuL2KfYsV/ZgduQ24vYsdin2YRf2YXYp9ix2Kpf2KbYp9m+2LHbkNmEX9mF2KfZil/YptmJ2Yrbh9mGX9im2YnZituH2YRf2KbYp9uL2Lrbh9iz2Kpf2LPbkNmG2Krbldio2YnYsV/YptuG2YPYqtuV2KjZidixX9mG2YjZitin2KjZidixX9iv25DZg9in2KjZidixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2YrbldmD2LTbldmG2KjblV/Yr9uI2LTbldmG2KjblV/Ys9uV2YrYtNuV2YbYqNuVX9qG2KfYsdi025XZhtio25Vf2b7bldmK2LTbldmG2KjblV/YrNuI2YXblV/YtNuV2YbYqNuVJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2YrblV/Yr9uIX9iz25Vf2obYp1/ZvtuVX9is24hf2LTblScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfZituVX9iv24hf2LPblV/ahtinX9m+25Vf2KzbiF/YtNuVJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YknLFxuICAgICAgICAgICAgTExMOiAnWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mK25DYsdmJ2YUg2YPbkNqG25V82LPbldq+25XYsXzahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhnzahtuI2LR82obbiNi02KrZidmGINmD25DZitmJ2YZ82YPbldqGLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2YrbkNix2YnZhSDZg9uQ2obblScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9iz25XavtuV2LEnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9qG24jYtNiq2YnZhiDZg9uQ2YrZidmGJyB8fCBtZXJpZGllbSA9PT0gJ9mD25XahicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZituQ2LHZidmFINmD25DahtuVJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9iz25XavtuV2LEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtNiq2YnZhiDYqNuH2LHbh9mGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtNiq2YnZhiDZg9uQ2YrZidmGJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZg9uV2oYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYqNuI2q/biNmGINiz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2Kbbldiq25Ug2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb2YPbkNmE25XYsdmD2YldIGRkZGQgW9iz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KrbhtmG24jar9uI2YZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9im2KfZhNiv2YnZhtmC2YldIGRkZGQgW9iz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2YPbkNmK2YnZhicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2Kjbh9ix24fZhicsXG4gICAgICAgICAgICBzOiAn2YbbldqG2obblSDYs9uQ2YPZiNmG2KonLFxuICAgICAgICAgICAgc3M6ICclZCDYs9uQ2YPZiNmG2KonLFxuICAgICAgICAgICAgbTogJ9io2YnYsSDZhdmJ2Ybbh9iqJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZidmG24fYqicsXG4gICAgICAgICAgICBoOiAn2KjZidixINiz2KfYptuV2KonLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2KbbldiqJyxcbiAgICAgICAgICAgIGQ6ICfYqNmJ2LEg2YPbiNmGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2YPbiNmGJyxcbiAgICAgICAgICAgIE06ICfYqNmJ2LEg2KbYp9mKJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KbYp9mKJyxcbiAgICAgICAgICAgIHk6ICfYqNmJ2LEg2YrZidmEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2YrZidmEJyxcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oLdmD24jZhtmJfC3Yptin2Yp8Ldq+25XZvtiq25UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdmD24jZhtmJJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct2r7bldm+2KrblSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdWdDbjtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48414\n")},48940:module=>{"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n * \n */\n\n/*eslint-disable no-self-compare */\n\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n // Added the nonzero y check to make Flow happy, but it is redundant\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n if (is(objA, objB)) {\n return true;\n }\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n // Test for A's keys different from B.\n for (var i = 0; i < keysA.length; i++) {\n if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqual;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg5NDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2ZianMvbGliL3NoYWxsb3dFcXVhbC5qcz9hZjM1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqIFxuICovXG5cbi8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAvLyBBZGRlZCB0aGUgbm9uemVybyB5IGNoZWNrIHRvIG1ha2UgRmxvdyBoYXBweSwgYnV0IGl0IGlzIHJlZHVuZGFudFxuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48940\n")},49102:(I,g,n)=>{"use strict";I.exports=n.p+"0ea1ecbd77e6d43dc4e2.png"},49641:module=>{eval('module.exports = {\n "version": "0.26.1"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk2NDEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzPzVjY2UiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwidmVyc2lvblwiOiBcIjAuMjYuMVwiXG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///49641\n')},50304:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Chinese (Taiwan) [zh-tw]\n//! author : Ben : https://github.com/ben-lin\n//! author : Chris Lam : https://github.com/hehachris\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var zhTw = moment.defineLocale('zh-tw', {\n months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n '_'\n ),\n monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n '_'\n ),\n weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),\n weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY/MM/DD',\n LL: 'YYYY年M月D日',\n LLL: 'YYYY年M月D日 HH:mm',\n LLLL: 'YYYY年M月D日dddd HH:mm',\n l: 'YYYY/M/D',\n ll: 'YYYY年M月D日',\n lll: 'YYYY年M月D日 HH:mm',\n llll: 'YYYY年M月D日dddd HH:mm',\n },\n meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n return hour;\n } else if (meridiem === '中午') {\n return hour >= 11 ? hour : hour + 12;\n } else if (meridiem === '下午' || meridiem === '晚上') {\n return hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n var hm = hour * 100 + minute;\n if (hm < 600) {\n return '凌晨';\n } else if (hm < 900) {\n return '早上';\n } else if (hm < 1130) {\n return '上午';\n } else if (hm < 1230) {\n return '中午';\n } else if (hm < 1800) {\n return '下午';\n } else {\n return '晚上';\n }\n },\n calendar: {\n sameDay: '[今天] LT',\n nextDay: '[明天] LT',\n nextWeek: '[下]dddd LT',\n lastDay: '[昨天] LT',\n lastWeek: '[上]dddd LT',\n sameElse: 'L',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(日|月|週)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '日';\n case 'M':\n return number + '月';\n case 'w':\n case 'W':\n return number + '週';\n default:\n return number;\n }\n },\n relativeTime: {\n future: '%s後',\n past: '%s前',\n s: '幾秒',\n ss: '%d 秒',\n m: '1 分鐘',\n mm: '%d 分鐘',\n h: '1 小時',\n hh: '%d 小時',\n d: '1 天',\n dd: '%d 天',\n M: '1 個月',\n MM: '%d 個月',\n y: '1 年',\n yy: '%d 年',\n },\n });\n\n return zhTw;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAzMDQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qcz85MGVhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChUYWl3YW4pIFt6aC10d11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aFR3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtdHcnLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+mAseaXpV/pgLHkuIBf6YCx5LqMX+mAseS4iV/pgLHlm5tf6YCx5LqUX+mAseWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NL0QnLFxuICAgICAgICAgICAgbGw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHwgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5Lit5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOaXpXzmnIh86YCxKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICflub7np5InLFxuICAgICAgICAgICAgc3M6ICclZCDnp5InLFxuICAgICAgICAgICAgbTogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tOiAnJWQg5YiG6ZCYJyxcbiAgICAgICAgICAgIGg6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQ6ICclZCDlpKknLFxuICAgICAgICAgICAgTTogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5YCL5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gemhUdztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50304\n")},50565:(I,g,n)=>{"use strict";I.exports=n.p+"c63ad14eca5de87de9e1.png"},50771:(I,g,n)=>{"use strict";I.exports=n.p+"18d83be2b03ec5bd84c6.png"},51025:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEwMjUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9obWFjLmpzPzU5ODAiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8qKlxuXHQgICAgICogSE1BQyBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBITUFDID0gQ19hbGdvLkhNQUMgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIEhNQUMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBobWFjSGFzaGVyID0gQ3J5cHRvSlMuYWxnby5ITUFDLmNyZWF0ZShDcnlwdG9KUy5hbGdvLlNIQTI1Niwga2V5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoaGFzaGVyLCBrZXkpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXJcblx0ICAgICAgICAgICAgaGFzaGVyID0gdGhpcy5faGFzaGVyID0gbmV3IGhhc2hlci5pbml0KCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0gVXRmOC5wYXJzZShrZXkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBoYXNoZXJCbG9ja1NpemUgPSBoYXNoZXIuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgaGFzaGVyQmxvY2tTaXplQnl0ZXMgPSBoYXNoZXJCbG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEFsbG93IGFyYml0cmFyeSBsZW5ndGgga2V5c1xuXHQgICAgICAgICAgICBpZiAoa2V5LnNpZ0J5dGVzID4gaGFzaGVyQmxvY2tTaXplQnl0ZXMpIHtcblx0ICAgICAgICAgICAgICAgIGtleSA9IGhhc2hlci5maW5hbGl6ZShrZXkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAga2V5LmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2xvbmUga2V5IGZvciBpbm5lciBhbmQgb3V0ZXIgcGFkc1xuXHQgICAgICAgICAgICB2YXIgb0tleSA9IHRoaXMuX29LZXkgPSBrZXkuY2xvbmUoKTtcblx0ICAgICAgICAgICAgdmFyIGlLZXkgPSB0aGlzLl9pS2V5ID0ga2V5LmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBvS2V5V29yZHMgPSBvS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgaUtleVdvcmRzID0gaUtleS53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBYT1Iga2V5cyB3aXRoIHBhZCBjb25zdGFudHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXNoZXJCbG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgb0tleVdvcmRzW2ldIF49IDB4NWM1YzVjNWM7XG5cdCAgICAgICAgICAgICAgICBpS2V5V29yZHNbaV0gXj0gMHgzNjM2MzYzNjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBvS2V5LnNpZ0J5dGVzID0gaUtleS5zaWdCeXRlcyA9IGhhc2hlckJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIEhNQUMgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0XG5cdCAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICBoYXNoZXIudXBkYXRlKHRoaXMuX2lLZXkpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgSE1BQyB3aXRoIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSBUaGUgbWVzc2FnZSB0byBhcHBlbmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtITUFDfSBUaGlzIEhNQUMgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIudXBkYXRlKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIGhtYWNIYXNoZXIudXBkYXRlKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoZXIudXBkYXRlKG1lc3NhZ2VVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBITUFDIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIEhNQUNcblx0ICAgICAgICAgICAgdmFyIGlubmVySGFzaCA9IGhhc2hlci5maW5hbGl6ZShtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICAgIHZhciBobWFjID0gaGFzaGVyLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQoaW5uZXJIYXNoKSk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhtYWM7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51025\n")},51242:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Tetun Dili (East Timor) [tet]\n//! author : Joshua Brooks : https://github.com/joshbrooks\n//! author : Onorio De J. Afonso : https://github.com/marobo\n//! author : Sonia Simoes : https://github.com/soniasimoes\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var tet = moment.defineLocale('tet', {\n months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(\n '_'\n ),\n monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),\n weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),\n weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),\n weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Ohin iha] LT',\n nextDay: '[Aban iha] LT',\n nextWeek: 'dddd [iha] LT',\n lastDay: '[Horiseik iha] LT',\n lastWeek: 'dddd [semana kotuk] [iha] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'iha %s',\n past: '%s liuba',\n s: 'segundu balun',\n ss: 'segundu %d',\n m: 'minutu ida',\n mm: 'minutu %d',\n h: 'oras ida',\n hh: 'oras %d',\n d: 'loron ida',\n dd: 'loron %d',\n M: 'fulan ida',\n MM: 'fulan %d',\n y: 'tinan ida',\n yy: 'tinan %d',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return tet;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEyNDIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzPzU3NmMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRldHVuIERpbGkgKEVhc3QgVGltb3IpIFt0ZXRdXG4vLyEgYXV0aG9yIDogSm9zaHVhIEJyb29rcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3NoYnJvb2tzXG4vLyEgYXV0aG9yIDogT25vcmlvIERlIEouIEFmb25zbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJvYm9cbi8vISBhdXRob3IgOiBTb25pYSBTaW1vZXMgOiBodHRwczovL2dpdGh1Yi5jb20vc29uaWFzaW1vZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0ZXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbmVpcnVfRmV2ZXJlaXJ1X01hcnN1X0FicmlsX01haXVfSnXDsXVfSnVsbHVfQWd1c3R1X1NldGVtYnJ1X091dHVicnVfTm92ZW1icnVfRGV6ZW1icnUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0Zldl9NYXJfQWJyX01haV9KdW5fSnVsX0Fnb19TZXRfT3V0X05vdl9EZXonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnRG9taW5ndV9TZWd1bmRhX1RlcnNhX0t1YXJ0YV9LaW50YV9TZXN0YV9TYWJhZHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEb21fU2VnX1RlcnNfS3VhX0tpbnRfU2VzdF9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRG9fU2VnX1RlX0t1X0tpX1Nlc19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPaGluIGloYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBYmFuIGloYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtpaGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSG9yaXNlaWsgaWhhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3NlbWFuYSBrb3R1a10gW2loYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpaGEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGxpdWJhJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmR1IGJhbHVuJyxcbiAgICAgICAgICAgIHNzOiAnc2VndW5kdSAlZCcsXG4gICAgICAgICAgICBtOiAnbWludXR1IGlkYScsXG4gICAgICAgICAgICBtbTogJ21pbnV0dSAlZCcsXG4gICAgICAgICAgICBoOiAnb3JhcyBpZGEnLFxuICAgICAgICAgICAgaGg6ICdvcmFzICVkJyxcbiAgICAgICAgICAgIGQ6ICdsb3JvbiBpZGEnLFxuICAgICAgICAgICAgZGQ6ICdsb3JvbiAlZCcsXG4gICAgICAgICAgICBNOiAnZnVsYW4gaWRhJyxcbiAgICAgICAgICAgIE1NOiAnZnVsYW4gJWQnLFxuICAgICAgICAgICAgeTogJ3RpbmFuIGlkYScsXG4gICAgICAgICAgICB5eTogJ3RpbmFuICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRldDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51242\n")},51322:(I,g,n)=>{"use strict";I.exports=n.p+"d3ae638df74435783f15.png"},51877:(I,g,n)=>{"use strict";I.exports=n.p+"e7ce38c9e882173fe649.png"},51930:(I,g,n)=>{"use strict";I.exports=n.p+"d57f3368d668fb9a811b.png"},52015:(I,g,n)=>{"use strict";I.exports=n.p+"01692b56d103df5b83bf.png"},52155:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Pad\n\t data.clamp();\n\t data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t },\n\n\t unpad: function (data) {\n\t // Shortcut\n\t var dataWords = data.words;\n\n\t // Unpad\n\t var i = data.sigBytes - 1;\n\t for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t data.sigBytes = i + 1;\n\t break;\n\t }\n\t }\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIxNTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9wYWQtemVyb3BhZGRpbmcuanM/MmE2NiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBaZXJvIHBhZGRpbmcgc3RyYXRlZ3kuXG5cdCAqL1xuXHRDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcgPSB7XG5cdCAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAvLyBQYWRcblx0ICAgICAgICBkYXRhLmNsYW1wKCk7XG5cdCAgICAgICAgZGF0YS5zaWdCeXRlcyArPSBibG9ja1NpemVCeXRlcyAtICgoZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzKSB8fCBibG9ja1NpemVCeXRlcyk7XG5cdCAgICB9LFxuXG5cdCAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgLy8gVW5wYWRcblx0ICAgICAgICB2YXIgaSA9IGRhdGEuc2lnQnl0ZXMgLSAxO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSBkYXRhLnNpZ0J5dGVzIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICAgICAgaWYgKCgoZGF0YVdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZikpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBpICsgMTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9O1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLnBhZC5aZXJvUGFkZGluZztcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///52155\n")},52390:(I,g,n)=>{"use strict";I.exports=n.p+"b97a01f102cd23e763ee.png"},52477:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Faroese [fo]\n//! author : Ragnar Johannesen : https://github.com/ragnar123\n//! author : Kristian Sakarisson : https://github.com/sakarisson\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var fo = moment.defineLocale('fo', {\n months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(\n '_'\n ),\n monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),\n weekdays:\n 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(\n '_'\n ),\n weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),\n weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D. MMMM, YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Í dag kl.] LT',\n nextDay: '[Í morgin kl.] LT',\n nextWeek: 'dddd [kl.] LT',\n lastDay: '[Í gjár kl.] LT',\n lastWeek: '[síðstu] dddd [kl] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'um %s',\n past: '%s síðani',\n s: 'fá sekund',\n ss: '%d sekundir',\n m: 'ein minuttur',\n mm: '%d minuttir',\n h: 'ein tími',\n hh: '%d tímar',\n d: 'ein dagur',\n dd: '%d dagar',\n M: 'ein mánaður',\n MM: '%d mánaðir',\n y: 'eitt ár',\n yy: '%d ár',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return fo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI0NzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qcz8wNzIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGYXJvZXNlIFtmb11cbi8vISBhdXRob3IgOiBSYWduYXIgSm9oYW5uZXNlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWduYXIxMjNcbi8vISBhdXRob3IgOiBLcmlzdGlhbiBTYWthcmlzc29uIDogaHR0cHM6Ly9naXRodWIuY29tL3Nha2FyaXNzb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcsOtbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVkYWd1cl9tw6FuYWRhZ3VyX3TDvXNkYWd1cl9taWt1ZGFndXJfaMOzc2RhZ3VyX2Zyw61nZ2phZGFndXJfbGV5Z2FyZGFndXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1bl9tw6FuX3TDvXNfbWlrX2jDs3NfZnLDrV9sZXknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbcOhX3TDvV9taV9ow7NfZnJfbGUnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8ONIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbw40gbW9yZ2luIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw40gZ2rDoXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tzw63DsHN0dV0gZGRkZCBba2xdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAndW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHPDrcOwYW5pJyxcbiAgICAgICAgICAgIHM6ICdmw6Egc2VrdW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kaXInLFxuICAgICAgICAgICAgbTogJ2VpbiBtaW51dHR1cicsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGlyJyxcbiAgICAgICAgICAgIGg6ICdlaW4gdMOtbWknLFxuICAgICAgICAgICAgaGg6ICclZCB0w61tYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWd1cicsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOhbmHDsHVyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOhbmHDsGlyJyxcbiAgICAgICAgICAgIHk6ICdlaXR0IMOhcicsXG4gICAgICAgICAgICB5eTogJyVkIMOhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm87XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52477\n")},52597:(I,g,n)=>{"use strict";I.exports=n.p+"8ad9823128ce519028f9.png"},52648:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Chinese (China) [zh-cn]\n//! author : suupic : https://github.com/suupic\n//! author : Zeno Zeng : https://github.com/zenozeng\n//! author : uu109 : https://github.com/uu109\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var zhCn = moment.defineLocale('zh-cn', {\n months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(\n '_'\n ),\n monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(\n '_'\n ),\n weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),\n weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),\n weekdaysMin: '日_一_二_三_四_五_六'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'YYYY/MM/DD',\n LL: 'YYYY年M月D日',\n LLL: 'YYYY年M月D日Ah点mm分',\n LLLL: 'YYYY年M月D日ddddAh点mm分',\n l: 'YYYY/M/D',\n ll: 'YYYY年M月D日',\n lll: 'YYYY年M月D日 HH:mm',\n llll: 'YYYY年M月D日dddd HH:mm',\n },\n meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {\n return hour;\n } else if (meridiem === '下午' || meridiem === '晚上') {\n return hour + 12;\n } else {\n // '中午'\n return hour >= 11 ? hour : hour + 12;\n }\n },\n meridiem: function (hour, minute, isLower) {\n var hm = hour * 100 + minute;\n if (hm < 600) {\n return '凌晨';\n } else if (hm < 900) {\n return '早上';\n } else if (hm < 1130) {\n return '上午';\n } else if (hm < 1230) {\n return '中午';\n } else if (hm < 1800) {\n return '下午';\n } else {\n return '晚上';\n }\n },\n calendar: {\n sameDay: '[今天]LT',\n nextDay: '[明天]LT',\n nextWeek: function (now) {\n if (now.week() !== this.week()) {\n return '[下]dddLT';\n } else {\n return '[本]dddLT';\n }\n },\n lastDay: '[昨天]LT',\n lastWeek: function (now) {\n if (this.week() !== now.week()) {\n return '[上]dddLT';\n } else {\n return '[本]dddLT';\n }\n },\n sameElse: 'L',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(日|月|周)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '日';\n case 'M':\n return number + '月';\n case 'w':\n case 'W':\n return number + '周';\n default:\n return number;\n }\n },\n relativeTime: {\n future: '%s后',\n past: '%s前',\n s: '几秒',\n ss: '%d 秒',\n m: '1 分钟',\n mm: '%d 分钟',\n h: '1 小时',\n hh: '%d 小时',\n d: '1 天',\n dd: '%d 天',\n w: '1 周',\n ww: '%d 周',\n M: '1 个月',\n MM: '%d 个月',\n y: '1 年',\n yy: '%d 年',\n },\n week: {\n // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return zhCn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI2NDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qcz81YzNhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChDaGluYSkgW3poLWNuXVxuLy8hIGF1dGhvciA6IHN1dXBpYyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXVwaWNcbi8vISBhdXRob3IgOiBaZW5vIFplbmcgOiBodHRwczovL2dpdGh1Yi5jb20vemVub3plbmdcbi8vISBhdXRob3IgOiB1dTEwOSA6IGh0dHBzOi8vZ2l0aHViLmNvbS91dTEwOVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoQ24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1jbicsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn5ZGo5pelX+WRqOS4gF/lkajkuoxf5ZGo5LiJX+WRqOWbm1/lkajkupRf5ZGo5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelQWjngrltbeWIhicsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZEFo54K5bW3liIYnLFxuICAgICAgICAgICAgbDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gJ+S4reWNiCdcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5LiLXWRkZExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnKxdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlZWsoKSAhPT0gbm93LndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vkuIpdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+acrF1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOWRqCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5ZGoJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5ZCOJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5Yeg56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG06ICcxIOWIhumSnycsXG4gICAgICAgICAgICBtbTogJyVkIOWIhumSnycsXG4gICAgICAgICAgICBoOiAnMSDlsI/ml7YnLFxuICAgICAgICAgICAgaGg6ICclZCDlsI/ml7YnLFxuICAgICAgICAgICAgZDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIHc6ICcxIOWRqCcsXG4gICAgICAgICAgICB3dzogJyVkIOWRqCcsXG4gICAgICAgICAgICBNOiAnMSDkuKrmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDkuKrmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgLy8gR0IvVCA3NDA4LTE5OTTjgIrmlbDmja7lhYPlkozkuqTmjaLmoLzlvI/Ct+S/oeaBr+S6pOaNosK35pel5pyf5ZKM5pe26Ze06KGo56S65rOV44CL5LiOSVNPIDg2MDE6MTk4OOetieaViFxuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoQ247XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52648\n")},53256:(I,g,n)=>{"use strict";I.exports=n.p+"9d468021fd092a189fdb.png"},53287:(I,g,n)=>{"use strict";I.exports=n.p+"bd53671ae9b9ed21216e.png"},53872:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (Australia) [en-au]\n//! author : Jared Morse : https://github.com/jarcoal\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enAu = moment.defineLocale('en-au', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY h:mm A',\n LLLL: 'dddd, D MMMM YYYY h:mm A',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return enAu;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM4NzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanM/MGU2YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoQXVzdHJhbGlhKSBbZW4tYXVdXG4vLyEgYXV0aG9yIDogSmFyZWQgTW9yc2UgOiBodHRwczovL2dpdGh1Yi5jb20vamFyY29hbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1hdScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5BdTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///53872\n")},54405:(__unused_webpack_module,exports)=>{"use strict";eval('var __webpack_unused_export__;\n/**\n * @license React\n * react-is.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),\n REACT_PORTAL_TYPE = Symbol.for("react.portal"),\n REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"),\n REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"),\n REACT_PROFILER_TYPE = Symbol.for("react.profiler");\nSymbol.for("react.provider");\nvar REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),\n REACT_CONTEXT_TYPE = Symbol.for("react.context"),\n REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),\n REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"),\n REACT_MEMO_TYPE = Symbol.for("react.memo"),\n REACT_LAZY_TYPE = Symbol.for("react.lazy"),\n REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),\n REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");\nfunction typeOf(object) {\n if ("object" === typeof object && null !== object) {\n var $$typeof = object.$$typeof;\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n switch (((object = object.type), object)) {\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n case REACT_SUSPENSE_LIST_TYPE:\n case REACT_VIEW_TRANSITION_TYPE:\n return object;\n default:\n switch (((object = object && object.$$typeof), object)) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n return object;\n case REACT_CONSUMER_TYPE:\n return object;\n default:\n return $$typeof;\n }\n }\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n}\n__webpack_unused_export__ = REACT_CONSUMER_TYPE;\n__webpack_unused_export__ = REACT_CONTEXT_TYPE;\n__webpack_unused_export__ = REACT_ELEMENT_TYPE;\n__webpack_unused_export__ = REACT_FORWARD_REF_TYPE;\n__webpack_unused_export__ = REACT_FRAGMENT_TYPE;\n__webpack_unused_export__ = REACT_LAZY_TYPE;\n__webpack_unused_export__ = REACT_MEMO_TYPE;\n__webpack_unused_export__ = REACT_PORTAL_TYPE;\n__webpack_unused_export__ = REACT_PROFILER_TYPE;\n__webpack_unused_export__ = REACT_STRICT_MODE_TYPE;\n__webpack_unused_export__ = REACT_SUSPENSE_TYPE;\n__webpack_unused_export__ = REACT_SUSPENSE_LIST_TYPE;\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_CONSUMER_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return (\n "object" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;\n};\nexports.Hy = function (type) {\n return "string" === typeof type ||\n "function" === typeof type ||\n type === REACT_FRAGMENT_TYPE ||\n type === REACT_PROFILER_TYPE ||\n type === REACT_STRICT_MODE_TYPE ||\n type === REACT_SUSPENSE_TYPE ||\n type === REACT_SUSPENSE_LIST_TYPE ||\n ("object" === typeof type &&\n null !== type &&\n (type.$$typeof === REACT_LAZY_TYPE ||\n type.$$typeof === REACT_MEMO_TYPE ||\n type.$$typeof === REACT_CONTEXT_TYPE ||\n type.$$typeof === REACT_CONSUMER_TYPE ||\n type.$$typeof === REACT_FORWARD_REF_TYPE ||\n type.$$typeof === REACT_CLIENT_REFERENCE ||\n void 0 !== type.getModuleId))\n ? !0\n : !1;\n};\nexports.QP = typeOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ0MDUuanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24uanM/OTY0YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnRcIiksXG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcbiAgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxcbiAgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxcbiAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTtcblN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKTtcbnZhciBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG4gIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcbiAgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qudmlld190cmFuc2l0aW9uXCIpLFxuICBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIik7XG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2Ygb2JqZWN0ICYmIG51bGwgIT09IG9iamVjdCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgc3dpdGNoICgoKG9iamVjdCA9IG9iamVjdC50eXBlKSwgb2JqZWN0KSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1ZJRVdfVFJBTlNJVElPTl9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3dpdGNoICgoKG9iamVjdCA9IG9iamVjdCAmJiBvYmplY3QuJCR0eXBlb2YpLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OU1VNRVJfVFlQRTtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xuZXhwb3J0cy5FbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5MYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xuZXhwb3J0cy5NZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xuZXhwb3J0cy5Qb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG59O1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59O1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuICAgIG51bGwgIT09IG9iamVjdCAmJlxuICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG4gICk7XG59O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn07XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn07XG5leHBvcnRzLmlzTGF6eSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59O1xuZXhwb3J0cy5pc01lbW8gPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufTtcbmV4cG9ydHMuaXNQb3J0YWwgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59O1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59O1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn07XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn07XG5leHBvcnRzLmlzU3VzcGVuc2VMaXN0ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn07XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUgfHxcbiAgICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8XG4gICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgIHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHxcbiAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8XG4gICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fFxuICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHxcbiAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8XG4gICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHxcbiAgICAgICAgdm9pZCAwICE9PSB0eXBlLmdldE1vZHVsZUlkKSlcbiAgICA/ICEwXG4gICAgOiAhMTtcbn07XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54405\n')},54566:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Nynorsk [nn]\n//! authors : https://github.com/mechuwind\n//! Stephen Ramthun : https://github.com/stephenramthun\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var nn = moment.defineLocale('nn', {\n months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),\n monthsParseExact: true,\n weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),\n weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),\n weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY [kl.] H:mm',\n LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',\n },\n calendar: {\n sameDay: '[I dag klokka] LT',\n nextDay: '[I morgon klokka] LT',\n nextWeek: 'dddd [klokka] LT',\n lastDay: '[I går klokka] LT',\n lastWeek: '[Føregåande] dddd [klokka] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'om %s',\n past: '%s sidan',\n s: 'nokre sekund',\n ss: '%d sekund',\n m: 'eit minutt',\n mm: '%d minutt',\n h: 'ein time',\n hh: '%d timar',\n d: 'ein dag',\n dd: '%d dagar',\n w: 'ei veke',\n ww: '%d veker',\n M: 'ein månad',\n MM: '%d månader',\n y: 'eit år',\n yy: '%d år',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return nn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ1NjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanM/Yjg0YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTnlub3JzayBbbm5dXG4vLyEgYXV0aG9ycyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWNodXdpbmRcbi8vISAgICAgICAgICAgU3RlcGhlbiBSYW10aHVuIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXBoZW5yYW10aHVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbm4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hcnNfYXByLl9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzdW5kYWdfbcOlbmRhZ190eXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2xhdXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdS5fbcOlLl90eS5fb24uX3RvLl9mci5fbGF1Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tw6VfdHlfb25fdG9fZnJfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSSBkYWcga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0kgbW9yZ29uIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSSBnw6VyIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRsO4cmVnw6VhbmRlXSBkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGFuJyxcbiAgICAgICAgICAgIHM6ICdub2tyZSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmQnLFxuICAgICAgICAgICAgbTogJ2VpdCBtaW51dHQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHQnLFxuICAgICAgICAgICAgaDogJ2VpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICB3OiAnZWkgdmVrZScsXG4gICAgICAgICAgICB3dzogJyVkIHZla2VyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2VpdCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5uO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54566\n")},54691:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Greek [el]\n//! author : Aggelos Karalias : https://github.com/mehiel\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function isFunction(input) {\n return (\n (typeof Function !== 'undefined' && input instanceof Function) ||\n Object.prototype.toString.call(input) === '[object Function]'\n );\n }\n\n var el = moment.defineLocale('el', {\n monthsNominativeEl:\n 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(\n '_'\n ),\n monthsGenitiveEl:\n 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(\n '_'\n ),\n months: function (momentToFormat, format) {\n if (!momentToFormat) {\n return this._monthsNominativeEl;\n } else if (\n typeof format === 'string' &&\n /D/.test(format.substring(0, format.indexOf('MMMM')))\n ) {\n // if there is a day number before 'MMMM'\n return this._monthsGenitiveEl[momentToFormat.month()];\n } else {\n return this._monthsNominativeEl[momentToFormat.month()];\n }\n },\n monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),\n weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(\n '_'\n ),\n weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),\n weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),\n meridiem: function (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'μμ' : 'ΜΜ';\n } else {\n return isLower ? 'πμ' : 'ΠΜ';\n }\n },\n isPM: function (input) {\n return (input + '').toLowerCase()[0] === 'μ';\n },\n meridiemParse: /[ΠΜ]\\.?Μ?\\.?/i,\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY h:mm A',\n LLLL: 'dddd, D MMMM YYYY h:mm A',\n },\n calendarEl: {\n sameDay: '[Σήμερα {}] LT',\n nextDay: '[Αύριο {}] LT',\n nextWeek: 'dddd [{}] LT',\n lastDay: '[Χθες {}] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 6:\n return '[το προηγούμενο] dddd [{}] LT';\n default:\n return '[την προηγούμενη] dddd [{}] LT';\n }\n },\n sameElse: 'L',\n },\n calendar: function (key, mom) {\n var output = this._calendarEl[key],\n hours = mom && mom.hours();\n if (isFunction(output)) {\n output = output.apply(mom);\n }\n return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');\n },\n relativeTime: {\n future: 'σε %s',\n past: '%s πριν',\n s: 'λίγα δευτερόλεπτα',\n ss: '%d δευτερόλεπτα',\n m: 'ένα λεπτό',\n mm: '%d λεπτά',\n h: 'μία ώρα',\n hh: '%d ώρες',\n d: 'μία μέρα',\n dd: '%d μέρες',\n M: 'ένας μήνας',\n MM: '%d μήνες',\n y: 'ένας χρόνος',\n yy: '%d χρόνια',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}η/,\n ordinal: '%dη',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4st is the first week of the year.\n },\n });\n\n return el;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2OTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VsLmpzPzhkNDciXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdyZWVrIFtlbF1cbi8vISBhdXRob3IgOiBBZ2dlbG9zIEthcmFsaWFzIDogaHR0cHM6Ly9naXRodWIuY29tL21laGllbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbCcsIHtcbiAgICAgICAgbW9udGhzTm9taW5hdGl2ZUVsOlxuICAgICAgICAgICAgJ86ZzrHOvc6/z4XOrM+BzrnOv8+CX86mzrXOss+Bzr/Phc6sz4HOuc6/z4JfzpzOrM+Bz4TOuc6/z4JfzpHPgM+Bzq/Ou865zr/Pgl/OnM6szrnOv8+CX86Zzr/Pjc69zrnOv8+CX86Zzr/Pjc67zrnOv8+CX86Rz43Os86/z4XPg8+Ezr/Pgl/Oo861z4DPhM6tzrzOss+BzrnOv8+CX86fzrrPhM+OzrLPgc65zr/Pgl/Onc6/zq3OvM6yz4HOuc6/z4JfzpTOtc66zq3OvM6yz4HOuc6/z4InLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzR2VuaXRpdmVFbDpcbiAgICAgICAgICAgICfOmc6xzr3Ov8+FzrHPgc6vzr/PhV/Ops61zrLPgc6/z4XOsc+Bzq/Ov8+FX86czrHPgc+Ezq/Ov8+FX86Rz4DPgc65zrvOr86/z4VfzpzOsc6Qzr/PhV/Omc6/z4XOvc6vzr/PhV/Omc6/z4XOu86vzr/PhV/Okc+FzrPOv8+Nz4PPhM6/z4VfzqPOtc+Az4TOtc68zrLPgc6vzr/PhV/On866z4TPic6yz4HOr86/z4Vfzp3Ov861zrzOss+Bzq/Ov8+FX86UzrXOus61zrzOss+Bzq/Ov8+FJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoczogZnVuY3Rpb24gKG1vbWVudFRvRm9ybWF0LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50VG9Gb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzTm9taW5hdGl2ZUVsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC9ELy50ZXN0KGZvcm1hdC5zdWJzdHJpbmcoMCwgZm9ybWF0LmluZGV4T2YoJ01NTU0nKSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGRheSBudW1iZXIgYmVmb3JlICdNTU1NJ1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNHZW5pdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzTm9taW5hdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ86ZzrHOvV/Ops61zrJfzpzOsc+BX86Rz4DPgV/OnM6xz4pfzpnOv8+Fzr1fzpnOv8+FzrtfzpHPhc6zX86jzrXPgF/On866z4Rfzp3Ov861X86UzrXOuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfOms+Fz4HOuc6xzrrOrl/OlM61z4XPhM6tz4HOsV/OpM+Bzq/PhM63X86kzrXPhM6sz4HPhM63X86gzq3OvM+Az4TOt1/OoM6xz4HOsc+DzrrOtc+Fzq5fzqPOrM6yzrLOsc+Ezr8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfOms+Fz4FfzpTOtc+FX86kz4HOuV/OpM61z4RfzqDOtc68X86gzrHPgV/Oo86xzrInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnzprPhV/OlM61X86kz4FfzqTOtV/OoM61X86gzrFfzqPOsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfOvM68JyA6ICfOnM6cJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnz4DOvCcgOiAnzqDOnCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpWzBdID09PSAnzrwnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvW86gzpxdXFwuP86cP1xcLj8vaSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXJFbDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vOo86uzrzOtc+BzrEge31dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbzpHPjc+BzrnOvyB7fV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vOp864zrXPgiB7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbz4TOvyDPgM+Bzr/Ot86zzr/Pjc68zrXOvc6/XSBkZGRkIFt7fV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbz4TOt869IM+Az4HOv863zrPOv8+NzrzOtc69zrddIGRkZGQgW3t9XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiBmdW5jdGlvbiAoa2V5LCBtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhckVsW2tleV0sXG4gICAgICAgICAgICAgICAgaG91cnMgPSBtb20gJiYgbW9tLmhvdXJzKCk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihvdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmFwcGx5KG1vbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoJ3t9JywgaG91cnMgJSAxMiA9PT0gMSA/ICfPg8+EzrcnIDogJ8+Dz4TOuc+CJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnz4POtSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgz4DPgc65zr0nLFxuICAgICAgICAgICAgczogJ867zq/Os86xIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsScsXG4gICAgICAgICAgICBzczogJyVkIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsScsXG4gICAgICAgICAgICBtOiAnzq3Ovc6xIM67zrXPgM+Ez4wnLFxuICAgICAgICAgICAgbW06ICclZCDOu861z4DPhM6sJyxcbiAgICAgICAgICAgIGg6ICfOvM6vzrEgz47Pgc6xJyxcbiAgICAgICAgICAgIGhoOiAnJWQgz47Pgc61z4InLFxuICAgICAgICAgICAgZDogJ868zq/OsSDOvM6tz4HOsScsXG4gICAgICAgICAgICBkZDogJyVkIM68zq3Pgc61z4InLFxuICAgICAgICAgICAgTTogJ86tzr3Osc+CIM68zq7Ovc6xz4InLFxuICAgICAgICAgICAgTU06ICclZCDOvM6uzr3Otc+CJyxcbiAgICAgICAgICAgIHk6ICfOrc69zrHPgiDPh8+Bz4zOvc6/z4InLFxuICAgICAgICAgICAgeXk6ICclZCDPh8+Bz4zOvc65zrEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Oty8sXG4gICAgICAgIG9yZGluYWw6ICclZM63JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54691\n")},54697:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : German (Switzerland) [de-ch]\n//! author : sschueller : https://github.com/sschueller\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n function processRelativeTime(number, withoutSuffix, key, isFuture) {\n var format = {\n m: ['eine Minute', 'einer Minute'],\n h: ['eine Stunde', 'einer Stunde'],\n d: ['ein Tag', 'einem Tag'],\n dd: [number + ' Tage', number + ' Tagen'],\n w: ['eine Woche', 'einer Woche'],\n M: ['ein Monat', 'einem Monat'],\n MM: [number + ' Monate', number + ' Monaten'],\n y: ['ein Jahr', 'einem Jahr'],\n yy: [number + ' Jahre', number + ' Jahren'],\n };\n return withoutSuffix ? format[key][0] : format[key][1];\n }\n\n var deCh = moment.defineLocale('de-ch', {\n months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(\n '_'\n ),\n monthsShort:\n 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),\n monthsParseExact: true,\n weekdays:\n 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(\n '_'\n ),\n weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY HH:mm',\n LLLL: 'dddd, D. MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[heute um] LT [Uhr]',\n sameElse: 'L',\n nextDay: '[morgen um] LT [Uhr]',\n nextWeek: 'dddd [um] LT [Uhr]',\n lastDay: '[gestern um] LT [Uhr]',\n lastWeek: '[letzten] dddd [um] LT [Uhr]',\n },\n relativeTime: {\n future: 'in %s',\n past: 'vor %s',\n s: 'ein paar Sekunden',\n ss: '%d Sekunden',\n m: processRelativeTime,\n mm: '%d Minuten',\n h: processRelativeTime,\n hh: '%d Stunden',\n d: processRelativeTime,\n dd: processRelativeTime,\n w: processRelativeTime,\n ww: '%d Wochen',\n M: processRelativeTime,\n MM: processRelativeTime,\n y: processRelativeTime,\n yy: processRelativeTime,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return deCh;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2OTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzP2JiNzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoU3dpdHplcmxhbmQpIFtkZS1jaF1cbi8vISBhdXRob3IgOiBzc2NodWVsbGVyIDogaHR0cHM6Ly9naXRodWIuY29tL3NzY2h1ZWxsZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQ2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUNoO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54697\n")},54903:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Bambara [bm]\n//! author : Estelle Comment : https://github.com/estellecomment\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var bm = moment.defineLocale('bm', {\n months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(\n '_'\n ),\n monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),\n weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),\n weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),\n weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'MMMM [tile] D [san] YYYY',\n LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',\n },\n calendar: {\n sameDay: '[Bi lɛrɛ] LT',\n nextDay: '[Sini lɛrɛ] LT',\n nextWeek: 'dddd [don lɛrɛ] LT',\n lastDay: '[Kunu lɛrɛ] LT',\n lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s kɔnɔ',\n past: 'a bɛ %s bɔ',\n s: 'sanga dama dama',\n ss: 'sekondi %d',\n m: 'miniti kelen',\n mm: 'miniti %d',\n h: 'lɛrɛ kelen',\n hh: 'lɛrɛ %d',\n d: 'tile kelen',\n dd: 'tile %d',\n M: 'kalo kelen',\n MM: 'kalo %d',\n y: 'san kelen',\n yy: 'san %d',\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return bm;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5MDMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qcz9hN2ZhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCYW1iYXJhIFtibV1cbi8vISBhdXRob3IgOiBFc3RlbGxlIENvbW1lbnQgOiBodHRwczovL2dpdGh1Yi5jb20vZXN0ZWxsZWNvbW1lbnRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBibSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JtJywge1xuICAgICAgICBtb250aHM6ICdaYW53dXlla2Fsb19GZXd1cnV5ZWthbG9fTWFyaXNpa2Fsb19Bd2lyaWxpa2Fsb19NyZtrYWxvX1p1d8mbbmthbG9fWnVsdXlla2Fsb19VdGlrYWxvX1PJm3RhbmJ1cnVrYWxvX8mUa3V0yZRidXJ1a2Fsb19Ob3dhbmJ1cnVrYWxvX0Rlc2FuYnVydWthbG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnWmFuX0Zld19NYXJfQXdpX03Jm19adXdfWnVsX1V0aV9TyZt0X8mUa3VfTm93X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdLYXJpX050yZtuyZtuX1RhcmF0YV9BcmFiYV9BbGFtaXNhX0p1bWFfU2liaXJpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnS2FyX050yZtfVGFyX0FyYV9BbGFfSnVtX1NpYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdLYV9OdF9UYV9Bcl9BbF9KdV9TaScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZIFtsyZtyyZtdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIE1NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWSBbbMmbcsmbXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0JpIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tTaW5pIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtkb24gbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0t1bnUgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3TJm23Jm25lbiBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMga8mUbsmUJyxcbiAgICAgICAgICAgIHBhc3Q6ICdhIGLJmyAlcyBiyZQnLFxuICAgICAgICAgICAgczogJ3NhbmdhIGRhbWEgZGFtYScsXG4gICAgICAgICAgICBzczogJ3Nla29uZGkgJWQnLFxuICAgICAgICAgICAgbTogJ21pbml0aSBrZWxlbicsXG4gICAgICAgICAgICBtbTogJ21pbml0aSAlZCcsXG4gICAgICAgICAgICBoOiAnbMmbcsmbIGtlbGVuJyxcbiAgICAgICAgICAgIGhoOiAnbMmbcsmbICVkJyxcbiAgICAgICAgICAgIGQ6ICd0aWxlIGtlbGVuJyxcbiAgICAgICAgICAgIGRkOiAndGlsZSAlZCcsXG4gICAgICAgICAgICBNOiAna2FsbyBrZWxlbicsXG4gICAgICAgICAgICBNTTogJ2thbG8gJWQnLFxuICAgICAgICAgICAgeTogJ3NhbiBrZWxlbicsXG4gICAgICAgICAgICB5eTogJ3NhbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54903\n")},54905:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Pad\n\t data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5MDUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9wYWQtaXNvMTAxMjYuanM/YTExYiJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBJU08gMTAxMjYgcGFkZGluZyBzdHJhdGVneS5cblx0ICovXG5cdENyeXB0b0pTLnBhZC5Jc28xMDEyNiA9IHtcblx0ICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDtcblxuXHQgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXNcblx0ICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgLy8gUGFkXG5cdCAgICAgICAgZGF0YS5jb25jYXQoQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oblBhZGRpbmdCeXRlcyAtIDEpKS5cblx0ICAgICAgICAgICAgIGNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbblBhZGRpbmdCeXRlcyA8PCAyNF0sIDEpKTtcblx0ICAgIH0sXG5cblx0ICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkge1xuXHQgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZVxuXHQgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAvLyBSZW1vdmUgcGFkZGluZ1xuXHQgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlcztcblx0ICAgIH1cblx0fTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5wYWQuSXNvMTAxMjY7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///54905\n")},54991:module=>{"use strict";eval('\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === "function") {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join("\\n");\n }\n\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5OTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qcz83NWU5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBhcnIgJiYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXSk7IGlmIChfaSA9PSBudWxsKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX3MsIF9lOyB0cnkgeyBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKSB7XG4gIHZhciBfaXRlbSA9IF9zbGljZWRUb0FycmF5KGl0ZW0sIDQpLFxuICAgICAgY29udGVudCA9IF9pdGVtWzFdLFxuICAgICAgY3NzTWFwcGluZyA9IF9pdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///54991\n')},55157:module=>{eval("module.exports = function () {\n throw new Error('Readable.from is not available in the browser')\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUxNTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Zyb20tYnJvd3Nlci5qcz8wN2M2Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlcicpXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///55157\n")},55162:(I,g,n)=>{"use strict";I.exports=n.p+"3ef723ce9db7dadcb96a.png"},55659:(I,g,n)=>{"use strict";I.exports=n.p+"6b54a629265cf42bb14d.png"},55739:(I,g,n)=>{"use strict";I.exports=n.p+"dafacddc5cc2fb59c071.png"},55802:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Thai [th]\n//! author : Kridsada Thanabulpong : https://github.com/sirn\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var th = moment.defineLocale('th', {\n months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(\n '_'\n ),\n monthsShort:\n 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),\n weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference\n weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY เวลา H:mm',\n LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',\n },\n meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,\n isPM: function (input) {\n return input === 'หลังเที่ยง';\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ก่อนเที่ยง';\n } else {\n return 'หลังเที่ยง';\n }\n },\n calendar: {\n sameDay: '[วันนี้ เวลา] LT',\n nextDay: '[พรุ่งนี้ เวลา] LT',\n nextWeek: 'dddd[หน้า เวลา] LT',\n lastDay: '[เมื่อวานนี้ เวลา] LT',\n lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'อีก %s',\n past: '%sที่แล้ว',\n s: 'ไม่กี่วินาที',\n ss: '%d วินาที',\n m: '1 นาที',\n mm: '%d นาที',\n h: '1 ชั่วโมง',\n hh: '%d ชั่วโมง',\n d: '1 วัน',\n dd: '%d วัน',\n w: '1 สัปดาห์',\n ww: '%d สัปดาห์',\n M: '1 เดือน',\n MM: '%d เดือน',\n y: '1 ปี',\n yy: '%d ปี',\n },\n });\n\n return th;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU4MDIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanM/MTBlOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGhhaSBbdGhdXG4vLyEgYXV0aG9yIDogS3JpZHNhZGEgVGhhbmFidWxwb25nIDogaHR0cHM6Ly9naXRodWIuY29tL3Npcm5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0aCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RoJywge1xuICAgICAgICBtb250aHM6ICfguKHguIHguKPguLLguITguKFf4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMX+C4oeC4teC4meC4suC4hOC4oV/guYDguKHguKnguLLguKLguJlf4Lie4Lik4Lip4Lig4Liy4LiE4LihX+C4oeC4tOC4luC4uOC4meC4suC4ouC4mV/guIHguKPguIHguI7guLLguITguKFf4Liq4Li04LiH4Lir4Liy4LiE4LihX+C4geC4seC4meC4ouC4suC4ouC4mV/guJXguLjguKXguLLguITguKFf4Lie4Lik4Lio4LiI4Li04LiB4Liy4Lii4LiZX+C4mOC4seC4meC4p+C4suC4hOC4oScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LihLuC4hC5f4LiBLuC4ni5f4Lih4Li1LuC4hC5f4LmA4LihLuC4oi5f4LieLuC4hC5f4Lih4Li0LuC4oi5f4LiBLuC4hC5f4LiqLuC4hC5f4LiBLuC4oi5f4LiVLuC4hC5f4LieLuC4oi5f4LiYLuC4hC4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4Liq4Lia4LiU4Li1X+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4LiqX+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksIC8vIHllcywgdGhyZWUgY2hhcmFjdGVycyBkaWZmZXJlbmNlXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Lit4LiyLl/guIguX+C4rS5f4LieLl/guJ7guKQuX+C4qC5f4LiqLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgICAgICBMTExMOiAn4Lin4Lix4LiZZGRkZOC4l+C4teC5iCBEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/guIHguYjguK3guJnguYDguJfguLXguYjguKLguId84Lir4Lil4Lix4LiH4LmA4LiX4Li14LmI4Lii4LiHLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vguKfguLHguJnguJnguLXguYkg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C4nuC4o+C4uOC5iOC4h+C4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFvguKvguJnguYnguLIg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C5gOC4oeC4t+C5iOC4reC4p+C4suC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C4p+C4seC4mV1kZGRkW+C4l+C4teC5iOC5geC4peC5ieC4pyDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4Lit4Li14LiBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C4l+C4teC5iOC5geC4peC5ieC4pycsXG4gICAgICAgICAgICBzOiAn4LmE4Lih4LmI4LiB4Li14LmI4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Lin4Li04LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG06ICcxIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtbTogJyVkIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBoOiAnMSDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgaGg6ICclZCDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgZDogJzEg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Lin4Lix4LiZJyxcbiAgICAgICAgICAgIHc6ICcxIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICB3dzogJyVkIOC4quC4seC4m+C4lOC4suC4q+C5jCcsXG4gICAgICAgICAgICBNOiAnMSDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgTU06ICclZCDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgeTogJzEg4Lib4Li1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lib4Li1JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///55802\n")},56e3:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : siSwati [ss]\n//! author : Nicolai Davies : https://github.com/nicolaidavies\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ss = moment.defineLocale('ss', {\n months: \"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni\".split(\n '_'\n ),\n monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),\n weekdays:\n 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(\n '_'\n ),\n weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),\n weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY h:mm A',\n LLLL: 'dddd, D MMMM YYYY h:mm A',\n },\n calendar: {\n sameDay: '[Namuhla nga] LT',\n nextDay: '[Kusasa nga] LT',\n nextWeek: 'dddd [nga] LT',\n lastDay: '[Itolo nga] LT',\n lastWeek: 'dddd [leliphelile] [nga] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'nga %s',\n past: 'wenteka nga %s',\n s: 'emizuzwana lomcane',\n ss: '%d mzuzwana',\n m: 'umzuzu',\n mm: '%d emizuzu',\n h: 'lihora',\n hh: '%d emahora',\n d: 'lilanga',\n dd: '%d emalanga',\n M: 'inyanga',\n MM: '%d tinyanga',\n y: 'umnyaka',\n yy: '%d iminyaka',\n },\n meridiemParse: /ekuseni|emini|entsambama|ebusuku/,\n meridiem: function (hours, minutes, isLower) {\n if (hours < 11) {\n return 'ekuseni';\n } else if (hours < 15) {\n return 'emini';\n } else if (hours < 19) {\n return 'entsambama';\n } else {\n return 'ebusuku';\n }\n },\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'ekuseni') {\n return hour;\n } else if (meridiem === 'emini') {\n return hour >= 11 ? hour : hour + 12;\n } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {\n if (hour === 0) {\n return 0;\n }\n return hour + 12;\n }\n },\n dayOfMonthOrdinalParse: /\\d{1,2}/,\n ordinal: '%d',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return ss;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYwMDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qcz81MmJkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBzaVN3YXRpIFtzc11cbi8vISBhdXRob3IgOiBOaWNvbGFpIERhdmllczxtYWlsQG5pY29sYWkuaW8+IDogaHR0cHM6Ly9naXRodWIuY29tL25pY29sYWlkYXZpZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NzJywge1xuICAgICAgICBtb250aHM6IFwiQmhpbWJpZHZ3YW5lX0luZGxvdmFuYV9JbmRsb3YnbGVua2h1bHVfTWFiYXNhX0lua2h3ZWtod2V0aV9JbmhsYWJhX0tob2x3YW5lX0luZ2NpX0lueW9uaV9JbXBoYWxhX0x3ZXRpX0luZ29uZ29uaVwiLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnQmhpX0luYV9JbnVfTWFiX0lua19JbmhfS2hvX0lnY19JbnlfSW1wX0x3ZV9JZ28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0xpc29udGZvX1Vtc29tYnVsdWtvX0xlc2liaWxpX0xlc2l0c2F0ZnVfTGVzaW5lX0xlc2lobGFudV9VbWdjaWJlbG8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpc19VbWJfTHNiX0xlc19Mc2lfTHNoX1VtZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9Vc19MYl9MdF9Mc19MaF9VZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tOYW11aGxhIG5nYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tLdXNhc2EgbmdhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW25nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJdG9sbyBuZ2FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVsaXBoZWxpbGVdIFtuZ2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbmdhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd3ZW50ZWthIG5nYSAlcycsXG4gICAgICAgICAgICBzOiAnZW1penV6d2FuYSBsb21jYW5lJyxcbiAgICAgICAgICAgIHNzOiAnJWQgbXp1endhbmEnLFxuICAgICAgICAgICAgbTogJ3VtenV6dScsXG4gICAgICAgICAgICBtbTogJyVkIGVtaXp1enUnLFxuICAgICAgICAgICAgaDogJ2xpaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGVtYWhvcmEnLFxuICAgICAgICAgICAgZDogJ2xpbGFuZ2EnLFxuICAgICAgICAgICAgZGQ6ICclZCBlbWFsYW5nYScsXG4gICAgICAgICAgICBNOiAnaW55YW5nYScsXG4gICAgICAgICAgICBNTTogJyVkIHRpbnlhbmdhJyxcbiAgICAgICAgICAgIHk6ICd1bW55YWthJyxcbiAgICAgICAgICAgIHl5OiAnJWQgaW1pbnlha2EnLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZWt1c2VuaXxlbWluaXxlbnRzYW1iYW1hfGVidXN1a3UvLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWt1c2VuaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VtaW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW50c2FtYmFtYSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZWJ1c3VrdSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VrdXNlbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW1pbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2VudHNhbWJhbWEnIHx8IG1lcmlkaWVtID09PSAnZWJ1c3VrdScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJyVkJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNzO1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///56000\n")},56195:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (United Kingdom) [en-gb]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enGb = moment.defineLocale('en-gb', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return enGb;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYxOTUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tZ2IuanM/MzlhNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIFtlbi1nYl1cbi8vISBhdXRob3IgOiBDaHJpcyBHZWRyaW0gOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNnZWRyaW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkdiID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tZ2InLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5HYjtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56195\n")},56425:(I,g,n)=>{"use strict";I.exports=n.p+"ee9e3fa86bb1759705ec.png"},56464:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Czech [cs]\n//! author : petrbela : https://github.com/petrbela\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = {\n standalone:\n 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(\n '_'\n ),\n format: 'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(\n '_'\n ),\n isFormat: /DD?[o.]?(\\[[^\\[\\]]*\\]|\\s)+MMMM/,\n },\n monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),\n monthsParse = [\n /^led/i,\n /^úno/i,\n /^bře/i,\n /^dub/i,\n /^kvě/i,\n /^(čvn|červen$|června)/i,\n /^(čvc|červenec|července)/i,\n /^srp/i,\n /^zář/i,\n /^říj/i,\n /^lis/i,\n /^pro/i,\n ],\n // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n monthsRegex =\n /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;\n\n function plural(n) {\n return n > 1 && n < 5 && ~~(n / 10) !== 1;\n }\n function translate(number, withoutSuffix, key, isFuture) {\n var result = number + ' ';\n switch (key) {\n case 's': // a few seconds / in a few seconds / a few seconds ago\n return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';\n case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'sekundy' : 'sekund');\n } else {\n return result + 'sekundami';\n }\n case 'm': // a minute / in a minute / a minute ago\n return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';\n case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'minuty' : 'minut');\n } else {\n return result + 'minutami';\n }\n case 'h': // an hour / in an hour / an hour ago\n return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';\n case 'hh': // 9 hours / in 9 hours / 9 hours ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'hodiny' : 'hodin');\n } else {\n return result + 'hodinami';\n }\n case 'd': // a day / in a day / a day ago\n return withoutSuffix || isFuture ? 'den' : 'dnem';\n case 'dd': // 9 days / in 9 days / 9 days ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'dny' : 'dní');\n } else {\n return result + 'dny';\n }\n case 'M': // a month / in a month / a month ago\n return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';\n case 'MM': // 9 months / in 9 months / 9 months ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'měsíce' : 'měsíců');\n } else {\n return result + 'měsíci';\n }\n case 'y': // a year / in a year / a year ago\n return withoutSuffix || isFuture ? 'rok' : 'rokem';\n case 'yy': // 9 years / in 9 years / 9 years ago\n if (withoutSuffix || isFuture) {\n return result + (plural(number) ? 'roky' : 'let');\n } else {\n return result + 'lety';\n }\n }\n }\n\n var cs = moment.defineLocale('cs', {\n months: months,\n monthsShort: monthsShort,\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.\n // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.\n monthsStrictRegex:\n /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,\n monthsShortStrictRegex:\n /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),\n weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),\n weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd D. MMMM YYYY H:mm',\n l: 'D. M. YYYY',\n },\n calendar: {\n sameDay: '[dnes v] LT',\n nextDay: '[zítra v] LT',\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[v neděli v] LT';\n case 1:\n case 2:\n return '[v] dddd [v] LT';\n case 3:\n return '[ve středu v] LT';\n case 4:\n return '[ve čtvrtek v] LT';\n case 5:\n return '[v pátek v] LT';\n case 6:\n return '[v sobotu v] LT';\n }\n },\n lastDay: '[včera v] LT',\n lastWeek: function () {\n switch (this.day()) {\n case 0:\n return '[minulou neděli v] LT';\n case 1:\n case 2:\n return '[minulé] dddd [v] LT';\n case 3:\n return '[minulou středu v] LT';\n case 4:\n case 5:\n return '[minulý] dddd [v] LT';\n case 6:\n return '[minulou sobotu v] LT';\n }\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'před %s',\n s: translate,\n ss: translate,\n m: translate,\n mm: translate,\n h: translate,\n hh: translate,\n d: translate,\n dd: translate,\n M: translate,\n MM: translate,\n y: translate,\n yy: translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return cs;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY0NjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzPzNjMGQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEN6ZWNoIFtjc11cbi8vISBhdXRob3IgOiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ2xlZGVuX8O6bm9yX2LFmWV6ZW5fZHViZW5fa3bEm3Rlbl/EjWVydmVuX8SNZXJ2ZW5lY19zcnBlbl96w6HFmcOtX8WZw61qZW5fbGlzdG9wYWRfcHJvc2luZWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAnbGVkbmFfw7pub3JhX2LFmWV6bmFfZHVibmFfa3bEm3RuYV/EjWVydm5hX8SNZXJ2ZW5jZV9zcnBuYV96w6HFmcOtX8WZw61qbmFfbGlzdG9wYWR1X3Byb3NpbmNlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0REP1tvLl0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnbGVkX8O6bm9fYsWZZV9kdWJfa3bEm1/EjXZuX8SNdmNfc3JwX3rDocWZX8WZw61qX2xpc19wcm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15sZWQvaSxcbiAgICAgICAgICAgIC9ew7puby9pLFxuICAgICAgICAgICAgL15ixZllL2ksXG4gICAgICAgICAgICAvXmR1Yi9pLFxuICAgICAgICAgICAgL15rdsSbL2ksXG4gICAgICAgICAgICAvXijEjXZufMSNZXJ2ZW4kfMSNZXJ2bmEpL2ksXG4gICAgICAgICAgICAvXijEjXZjfMSNZXJ2ZW5lY3zEjWVydmVuY2UpL2ksXG4gICAgICAgICAgICAvXnNycC9pLFxuICAgICAgICAgICAgL156w6HFmS9pLFxuICAgICAgICAgICAgL17FmcOtai9pLFxuICAgICAgICAgICAgL15saXMvaSxcbiAgICAgICAgICAgIC9ecHJvL2ksXG4gICAgICAgIF0sXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14obGVkZW58w7pub3J8YsWZZXplbnxkdWJlbnxrdsSbdGVufMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHrDocWZw618xZnDrWplbnxsaXN0b3BhZHxwcm9zaW5lY3xsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaTtcblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuID4gMSAmJiBuIDwgNSAmJiB+fihuIC8gMTApICE9PSAxO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogLy8gYSBmZXcgc2Vjb25kcyAvIGluIGEgZmV3IHNlY29uZHMgLyBhIGZldyBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3DDoXIgc2VrdW5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtJzogLy8gYSBtaW51dGUgLyBpbiBhIG1pbnV0ZSAvIGEgbWludXRlIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiBpc0Z1dHVyZSA/ICdtaW51dHUnIDogJ21pbnV0b3UnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaCc6IC8vIGFuIGhvdXIgLyBpbiBhbiBob3VyIC8gYW4gaG91ciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdob2RpbmEnIDogaXNGdXR1cmUgPyAnaG9kaW51JyA6ICdob2Rpbm91JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2RpbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2QnOiAvLyBhIGRheSAvIGluIGEgZGF5IC8gYSBkYXkgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGVuJyA6ICdkbmVtJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG55JyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkbnknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ00nOiAvLyBhIG1vbnRoIC8gaW4gYSBtb250aCAvIGEgbW9udGggYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbcSbc8OtYycgOiAnbcSbc8OtY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbcSbc8OtY2UnIDogJ23Em3PDrWPFrycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcSbc8OtY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tlbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ2xldCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbGV0eSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3MnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIC8vIE5PVEU6ICfEjWVydmVuJyBpcyBzdWJzdHJpbmcgb2YgJ8SNZXJ2ZW5lYyc7IHRoZXJlZm9yZSAnxI1lcnZlbmVjJyBtdXN0IHByZWNlZGUgJ8SNZXJ2ZW4nIGluIHRoZSByZWdleCB0byBiZSBmdWxseSBtYXRjaGVkLlxuICAgICAgICAvLyBPdGhlcndpc2UgcGFyc2VyIG1hdGNoZXMgJzEuIMSNZXJ2ZW5lYycgYXMgJzEuIMSNZXJ2ZW4nICsgJ2VjJy5cbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWRlbnxsZWRuYXzDum5vcmF8w7pub3J8YsWZZXplbnxixZllem5hfGR1YmVufGR1Ym5hfGt2xJt0ZW58a3bEm3RuYXzEjWVydmVuZWN8xI1lcnZlbmNlfMSNZXJ2ZW58xI1lcnZuYXxzcnBlbnxzcnBuYXx6w6HFmcOtfMWZw61qZW58xZnDrWpuYXxsaXN0b3BhZHV8bGlzdG9wYWR8cHJvc2luZWN8cHJvc2luY2UpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWTEm2xlX3BvbmTEm2zDrV/DunRlcsO9X3N0xZllZGFfxI10dnJ0ZWtfcMOhdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QuIE0uIFlZWVknLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIHZdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbesOtdHJhIHZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkxJtsaSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdmUgxI10dnJ0ZWsgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHDDoXRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmEgdl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMOpXSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc3TFmWVkdSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IHNvYm90dSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3DFmWVkICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjcztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56464\n")},56488:(I,g,n)=>{"use strict";I.exports=n.p+"b3108444570c6a7c0520.png"},56575:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Spanish (United States) [es-us]\n//! author : bustta : https://github.com/bustta\n//! author : chrisrodz : https://github.com/chrisrodz\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var monthsShortDot =\n 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(\n '_'\n ),\n monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),\n monthsParse = [\n /^ene/i,\n /^feb/i,\n /^mar/i,\n /^abr/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^ago/i,\n /^sep/i,\n /^oct/i,\n /^nov/i,\n /^dic/i,\n ],\n monthsRegex =\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\n\n var esUs = moment.defineLocale('es-us', {\n months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(\n '_'\n ),\n monthsShort: function (m, format) {\n if (!m) {\n return monthsShortDot;\n } else if (/-MMM-/.test(format)) {\n return monthsShort[m.month()];\n } else {\n return monthsShortDot[m.month()];\n }\n },\n monthsRegex: monthsRegex,\n monthsShortRegex: monthsRegex,\n monthsStrictRegex:\n /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\n monthsShortStrictRegex:\n /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\n monthsParse: monthsParse,\n longMonthsParse: monthsParse,\n shortMonthsParse: monthsParse,\n weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\n weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\n weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'h:mm A',\n LTS: 'h:mm:ss A',\n L: 'MM/DD/YYYY',\n LL: 'D [de] MMMM [de] YYYY',\n LLL: 'D [de] MMMM [de] YYYY h:mm A',\n LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',\n },\n calendar: {\n sameDay: function () {\n return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextDay: function () {\n return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n nextWeek: function () {\n return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastDay: function () {\n return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';\n },\n lastWeek: function () {\n return (\n '[el] dddd [pasado a la' +\n (this.hours() !== 1 ? 's' : '') +\n '] LT'\n );\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'en %s',\n past: 'hace %s',\n s: 'unos segundos',\n ss: '%d segundos',\n m: 'un minuto',\n mm: '%d minutos',\n h: 'una hora',\n hh: '%d horas',\n d: 'un día',\n dd: '%d días',\n w: 'una semana',\n ww: '%d semanas',\n M: 'un mes',\n MM: '%d meses',\n y: 'un año',\n yy: '%d años',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}º/,\n ordinal: '%dº',\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return esUs;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY1NzUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtdXMuanM/NTVjOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoVW5pdGVkIFN0YXRlcykgW2VzLXVzXVxuLy8hIGF1dGhvciA6IGJ1c3R0YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9idXN0dGFcbi8vISBhdXRob3IgOiBjaHJpc3JvZHogOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNyb2R6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc1VzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtdXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzVXM7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///56575\n")},56698:module=>{eval("if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2OTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcz8zZmI1Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56698\n")},56962:(I,g,n)=>{"use strict";I.exports=n.p+"c62c6d1ed8e5f11dd78f.png"},57037:(I,g,n)=>{"use strict";I.exports=n.p+"43d42a8021c7b365c67e.png"},57060:(I,g,n)=>{"use strict";I.exports=n.p+"6c7c944fca1f8cac0b5d.png"},57165:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(39506));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t var block;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t var modeCreator;\n\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t var finalProcessedBlocks;\n\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t var wordArray;\n\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t var salt;\n\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt, hasher) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t if (!hasher) {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t } else {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t }\n\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcxNjUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY2lwaGVyLWNvcmUuanM/MzhiYSJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2V2cGtkZlwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0LyoqXG5cdCAqIENpcGhlciBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHRDcnlwdG9KUy5saWIuQ2lwaGVyIHx8IChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG07XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODtcblx0ICAgIHZhciBCYXNlNjQgPSBDX2VuYy5CYXNlNjQ7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREY7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhpcyBjaXBoZXIncyBrZXkgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXZTaXplIFRoaXMgY2lwaGVyJ3MgSVYgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0VOQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfREVDX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZGVjcnlwdGlvbiBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyID0gQ19saWIuQ2lwaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBpdiBUaGUgSVYgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZUVuY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZURlY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHhmb3JtTW9kZSBFaXRoZXIgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiB0cmFuc29ybWF0aW9uIG1vZGUgY29uc3RhbnQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5BRVMuX0VOQ19YRk9STV9NT0RFLCBrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uICh4Zm9ybU1vZGUsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zZm9ybSBtb2RlIGFuZCBrZXlcblx0ICAgICAgICAgICAgdGhpcy5feGZvcm1Nb2RlID0geGZvcm1Nb2RlO1xuXHQgICAgICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgY2lwaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBjaXBoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIGRhdGEgdG8gYmUgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkYXRhIGFmdGVyIHByb2Nlc3NpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIucHJvY2VzcygnZGF0YScpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3Mod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYXZhaWxhYmxlIGJsb2Nrc1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2VzcygpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBwcm9jZXNzLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGZpbmFsIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBmaW5hbCBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBkYXRhIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkRGF0YSA9IHRoaXMuX2RvRmluYWxpemUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWREYXRhO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDEyOC8zMixcblxuXHQgICAgICAgIF9FTkNfWEZPUk1fTU9ERTogMSxcblxuXHQgICAgICAgIF9ERUNfWEZPUk1fTU9ERTogMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgc2hvcnRjdXQgZnVuY3Rpb25zIHRvIGEgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBlbmNyeXB0IGFuZCBkZWNyeXB0IHNob3J0Y3V0IGZ1bmN0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEFFUyA9IENyeXB0b0pTLmxpYi5DaXBoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLkFFUyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXNzd29yZEJhc2VkQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphYmxlQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjaXBoZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpLmVuY3J5cHQoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5kZWNyeXB0KGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSgpKVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBzdHJlYW0gY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDEgKDMyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZEJsb2NrcyA9IHRoaXMuX3Byb2Nlc3MoISEnZmx1c2gnKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWRCbG9ja3M7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogMVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTW9kZSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX21vZGUgPSBDLm1vZGUgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciBtb2RlIHRlbXBsYXRlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvY2tDaXBoZXJNb2RlID0gQ19saWIuQmxvY2tDaXBoZXJNb2RlID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBlbmNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRW5jcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIG1vZGUgZm9yIGRlY3J5cHRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5jcmVhdGVEZWNyeXB0b3IoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRGVjcnlwdG9yOiBmdW5jdGlvbiAoY2lwaGVyLCBpdikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5EZWNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2lwaGVyID0gY2lwaGVyO1xuXHQgICAgICAgICAgICB0aGlzLl9pdiA9IGl2O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ0JDID0gQ19tb2RlLkNCQyA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWJzdHJhY3QgYmFzZSBDQkMgbW9kZS5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICB2YXIgQ0JDID0gQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGVuY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRW5jcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gWE9SIGFuZCBlbmNyeXB0XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGRlY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRGVjcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB2YXIgdGhpc0Jsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBEZWNyeXB0IGFuZCBYT1Jcblx0ICAgICAgICAgICAgICAgIGNpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHRoaXNCbG9jaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgZnVuY3Rpb24geG9yQmxvY2sod29yZHMsIG9mZnNldCwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblxuXHQgICAgICAgICAgICAvLyBDaG9vc2UgbWl4aW5nIGJsb2NrXG5cdCAgICAgICAgICAgIGlmIChpdikge1xuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBpdjtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuX3ByZXZCbG9jaztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFhPUiBibG9ja3Ncblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0gYmxvY2tbaV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gQ0JDO1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQYWRkaW5nIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfcGFkID0gQy5wYWQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQS0NTICM1LzcgcGFkZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFBrY3M3ID0gQ19wYWQuUGtjczcgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUGFkcyBkYXRhIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byBwYWQuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbXVsdGlwbGUgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgcGFkZGVkIHRvLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcucGFkKHdvcmRBcnJheSwgNCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgcGFkZGluZyBieXRlc1xuXHQgICAgICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nIHdvcmRcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkID0gKG5QYWRkaW5nQnl0ZXMgPDwgMjQpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgMTYpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgOCkgfCBuUGFkZGluZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nV29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUGFkZGluZ0J5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmdXb3Jkcy5wdXNoKHBhZGRpbmdXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZyA9IFdvcmRBcnJheS5jcmVhdGUocGFkZGluZ1dvcmRzLCBuUGFkZGluZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhLmNvbmNhdChwYWRkaW5nKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVW5wYWRzIGRhdGEgdGhhdCBoYWQgYmVlbiBwYWRkZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHVucGFkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcudW5wYWQod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlXG5cdCAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgLy8gUmVtb3ZlIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHRvIHVzZS4gRGVmYXVsdDogQ0JDXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogUGtjczdcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IENpcGhlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgbW9kZTogQ0JDLFxuXHQgICAgICAgICAgICBwYWRkaW5nOiBQa2NzN1xuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIG1vZGVDcmVhdG9yO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGNpcGhlclxuXHQgICAgICAgICAgICBDaXBoZXIucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnO1xuXHQgICAgICAgICAgICB2YXIgaXYgPSBjZmcuaXY7XG5cdCAgICAgICAgICAgIHZhciBtb2RlID0gY2ZnLm1vZGU7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXQgYmxvY2sgbW9kZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRW5jcnlwdG9yO1xuXHQgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi8ge1xuXHQgICAgICAgICAgICAgICAgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZURlY3J5cHRvcjtcblx0ICAgICAgICAgICAgICAgIC8vIEtlZXAgYXQgbGVhc3Qgb25lIGJsb2NrIGluIHRoZSBidWZmZXIgZm9yIHVucGFkZGluZ1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbWluQnVmZmVyU2l6ZSA9IDE7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodGhpcy5fbW9kZSAmJiB0aGlzLl9tb2RlLl9fY3JlYXRvciA9PSBtb2RlQ3JlYXRvcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5pbml0KHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlQ3JlYXRvci5jYWxsKG1vZGUsIHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5jZmcucGFkZGluZztcblxuXHQgICAgICAgICAgICAvLyBGaW5hbGl6ZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBQYWQgZGF0YVxuXHQgICAgICAgICAgICAgICAgcGFkZGluZy5wYWQodGhpcy5fZGF0YSwgdGhpcy5ibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFVucGFkIGRhdGFcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmcudW5wYWQoZmluYWxQcm9jZXNzZWRCbG9ja3MpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDEyOC8zMlxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBjb2xsZWN0aW9uIG9mIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSByYXcgY2lwaGVydGV4dC5cblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBrZXkgVGhlIGtleSB0byB0aGlzIGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gc2FsdCBUaGUgc2FsdCB1c2VkIHdpdGggYSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Q2lwaGVyfSBhbGdvcml0aG0gVGhlIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzY2hlbWUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlci5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0fSBmb3JtYXR0ZXIgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXMgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNpcGhlclBhcmFtcyBBbiBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIHBvc3NpYmxlIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMubGliLkNpcGhlclBhcmFtcy5jcmVhdGUoe1xuXHQgICAgICAgICAqICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGtleToga2V5V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgaXY6IGl2V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgc2FsdDogc2FsdFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGFsZ29yaXRobTogQ3J5cHRvSlMuYWxnby5BRVMsXG5cdCAgICAgICAgICogICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcblx0ICAgICAgICAgKiAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5QS0NTNyxcblx0ICAgICAgICAgKiAgICAgICAgIGJsb2NrU2l6ZTogNCxcblx0ICAgICAgICAgKiAgICAgICAgIGZvcm1hdHRlcjogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0xcblx0ICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlclBhcmFtcykge1xuXHQgICAgICAgICAgICB0aGlzLm1peEluKGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0Zvcm1hdH0gZm9ybWF0dGVyIChPcHRpb25hbCkgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgY2lwaGVyIHBhcmFtcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEB0aHJvd3MgRXJyb3IgSWYgbmVpdGhlciB0aGUgZm9ybWF0dGVyIG5vciB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgaXMgc2V0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcy50b1N0cmluZyhDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChmb3JtYXR0ZXIgfHwgdGhpcy5mb3JtYXR0ZXIpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBGb3JtYXQgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19mb3JtYXQgPSBDLmZvcm1hdCA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIE9wZW5TU0wgZm9ybWF0dGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xGb3JtYXR0ZXIgPSBDX2Zvcm1hdC5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG9wZW5TU0xTdHJpbmcgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdmFyIHdvcmRBcnJheTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBjaXBoZXJQYXJhbXMuY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgdmFyIHNhbHQgPSBjaXBoZXJQYXJhbXMuc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBGb3JtYXRcblx0ICAgICAgICAgICAgaWYgKHNhbHQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTM2MTZjNzQsIDB4NjU2NDVmNWZdKS5jb25jYXQoc2FsdCkuY29uY2F0KGNpcGhlcnRleHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgd29yZEFycmF5ID0gY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB3b3JkQXJyYXkudG9TdHJpbmcoQmFzZTY0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZyB0byBhIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZW5TU0xTdHIgVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMLnBhcnNlKG9wZW5TU0xTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAob3BlblNTTFN0cikge1xuXHQgICAgICAgICAgICB2YXIgc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBQYXJzZSBiYXNlNjRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBCYXNlNjQucGFyc2Uob3BlblNTTFN0cik7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHRXb3JkcyA9IGNpcGhlcnRleHQud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gVGVzdCBmb3Igc2FsdFxuXHQgICAgICAgICAgICBpZiAoY2lwaGVydGV4dFdvcmRzWzBdID09IDB4NTM2MTZjNzQgJiYgY2lwaGVydGV4dFdvcmRzWzFdID09IDB4NjU2NDVmNWYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2FsdFxuXHQgICAgICAgICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5jcmVhdGUoY2lwaGVydGV4dFdvcmRzLnNsaWNlKDIsIDQpKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNhbHQgZnJvbSBjaXBoZXJ0ZXh0XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0V29yZHMuc3BsaWNlKDAsIDQpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dC5zaWdCeXRlcyAtPSAxNjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dDogY2lwaGVydGV4dCwgc2FsdDogc2FsdCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY2lwaGVyIHdyYXBwZXIgdGhhdCByZXR1cm5zIGNpcGhlcnRleHQgYXMgYSBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgKi9cblx0ICAgIHZhciBTZXJpYWxpemFibGVDaXBoZXIgPSBDX2xpYi5TZXJpYWxpemFibGVDaXBoZXIgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtGb3JtYXR0ZXJ9IGZvcm1hdCBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IGNpcGhlciBwYXJhbSBvYmplY3RzIHRvIGFuZCBmcm9tIGEgc3RyaW5nLiBEZWZhdWx0OiBPcGVuU1NMXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGZvcm1hdDogT3BlblNTTEZvcm1hdHRlclxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXkpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGVuY3J5cHRvciA9IGNpcGhlci5jcmVhdGVFbmNyeXB0b3Ioa2V5LCBjZmcpO1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGVuY3J5cHRvci5maW5hbGl6ZShtZXNzYWdlKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVyQ2ZnID0gZW5jcnlwdG9yLmNmZztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LFxuXHQgICAgICAgICAgICAgICAga2V5OiBrZXksXG5cdCAgICAgICAgICAgICAgICBpdjogY2lwaGVyQ2ZnLml2LFxuXHQgICAgICAgICAgICAgICAgYWxnb3JpdGhtOiBjaXBoZXIsXG5cdCAgICAgICAgICAgICAgICBtb2RlOiBjaXBoZXJDZmcubW9kZSxcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNpcGhlckNmZy5wYWRkaW5nLFxuXHQgICAgICAgICAgICAgICAgYmxvY2tTaXplOiBjaXBoZXIuYmxvY2tTaXplLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0dGVyOiBjZmcuZm9ybWF0XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTtcblxuXHQgICAgICAgICAgICAvLyBEZWNyeXB0XG5cdCAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBjaXBoZXIuY3JlYXRlRGVjcnlwdG9yKGtleSwgY2ZnKS5maW5hbGl6ZShjaXBoZXJ0ZXh0LmNpcGhlcnRleHQpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB0byBDaXBoZXJQYXJhbXMsXG5cdCAgICAgICAgICogZWxzZSBhc3N1bWVkIENpcGhlclBhcmFtcyBhbHJlYWR5IGFuZCByZXR1cm5zIGNpcGhlcnRleHQgdW5jaGFuZ2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlIHRvIHBhcnNlIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gVGhlIHVuc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuX3BhcnNlKGNpcGhlcnRleHRTdHJpbmdPclBhcmFtcywgZm9ybWF0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcGFyc2U6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBmb3JtYXQpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjaXBoZXJ0ZXh0ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGNpcGhlcnRleHQsIHRoaXMpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBLZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2tkZiA9IEMua2RmID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlblNTTCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xLZGYgPSBDX2tkZi5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlcml2ZXMgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZGVyaXZlIGZyb20uXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGtleVNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIGtleSB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaXZTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBJViB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgKE9wdGlvbmFsKSBBIDY0LWJpdCBzYWx0IHRvIHVzZS4gSWYgb21pdHRlZCwgYSBzYWx0IHdpbGwgYmUgZ2VuZXJhdGVkIHJhbmRvbWx5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0IHdpdGggdGhlIGtleSwgSVYsIGFuZCBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIpO1xuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIsICdzYWx0c2FsdCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwga2V5U2l6ZSwgaXZTaXplLCBzYWx0LCBoYXNoZXIpIHtcblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgcmFuZG9tIHNhbHRcblx0ICAgICAgICAgICAgaWYgKCFzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LnJhbmRvbSg2NC84KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIGlmICghaGFzaGVyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUgfSkuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUsIGhhc2hlcjogaGFzaGVyIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAgICB9XG5cblxuXHQgICAgICAgICAgICAvLyBTZXBhcmF0ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIHZhciBpdiA9IFdvcmRBcnJheS5jcmVhdGUoa2V5LndvcmRzLnNsaWNlKGtleVNpemUpLCBpdlNpemUgKiA0KTtcblx0ICAgICAgICAgICAga2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGtleToga2V5LCBpdjogaXYsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIHNlcmlhbGl6YWJsZSBjaXBoZXIgd3JhcHBlciB0aGF0IGRlcml2ZXMgdGhlIGtleSBmcm9tIGEgcGFzc3dvcmQsXG5cdCAgICAgKiBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGFzc3dvcmRCYXNlZENpcGhlciA9IENfbGliLlBhc3N3b3JkQmFzZWRDaXBoZXIgPSBTZXJpYWxpemFibGVDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0tERn0ga2RmIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgdG8gZ2VuZXJhdGUgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogU2VyaWFsaXphYmxlQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZGY6IE9wZW5TU0xLZGZcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplLCBjZmcuc2FsdCwgY2ZnLmhhc2hlcik7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIElWIHRvIGNvbmZpZ1xuXHQgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2O1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgbWVzc2FnZSwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gTWl4IGluIGRlcml2ZWQgcGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQubWl4SW4oZGVyaXZlZFBhcmFtcyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlY3J5cHRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIHBhc3N3b3JkLCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gdGhpcy5fcGFyc2UoY2lwaGVydGV4dCwgY2ZnLmZvcm1hdCk7XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgb3RoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2lwaGVydGV4dC5zYWx0LCBjZmcuaGFzaGVyKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnXG5cdCAgICAgICAgICAgIGNmZy5pdiA9IGRlcml2ZWRQYXJhbXMuaXY7XG5cblx0ICAgICAgICAgICAgLy8gRGVjcnlwdFxuXHQgICAgICAgICAgICB2YXIgcGxhaW50ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIGNpcGhlcnRleHQsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57165\n")},57392:(I,g,n)=>{"use strict";I.exports=n.p+"f404ef7897bffab48c06.png"},57609:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Uzbek [uz]\n//! author : Sardor Muminov : https://github.com/muminoff\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var uz = moment.defineLocale('uz', {\n months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(\n '_'\n ),\n monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),\n weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),\n weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),\n weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'D MMMM YYYY, dddd HH:mm',\n },\n calendar: {\n sameDay: '[Бугун соат] LT [да]',\n nextDay: '[Эртага] LT [да]',\n nextWeek: 'dddd [куни соат] LT [да]',\n lastDay: '[Кеча соат] LT [да]',\n lastWeek: '[Утган] dddd [куни соат] LT [да]',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'Якин %s ичида',\n past: 'Бир неча %s олдин',\n s: 'фурсат',\n ss: '%d фурсат',\n m: 'бир дакика',\n mm: '%d дакика',\n h: 'бир соат',\n hh: '%d соат',\n d: 'бир кун',\n dd: '%d кун',\n M: 'бир ой',\n MM: '%d ой',\n y: 'бир йил',\n yy: '%d йил',\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return uz;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc2MDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei5qcz8yZThjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVemJlayBbdXpdXG4vLyEgYXV0aG9yIDogU2FyZG9yIE11bWlub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbXVtaW5vZmZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1eiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3V6Jywge1xuICAgICAgICBtb250aHM6ICfRj9C90LLQsNGAX9GE0LXQstGA0LDQu1/QvNCw0YDRgl/QsNC/0YDQtdC7X9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgF/QvtC60YLRj9Cx0YBf0L3QvtGP0LHRgF/QtNC10LrQsNCx0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0K/QutGI0LDQvdCx0LBf0JTRg9GI0LDQvdCx0LBf0KHQtdGI0LDQvdCx0LBf0KfQvtGA0YjQsNC90LHQsF/Qn9Cw0LnRiNCw0L3QsdCwX9CW0YPQvNCwX9Co0LDQvdCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQr9C60Yhf0JTRg9GIX9Ch0LXRiF/Qp9C+0YBf0J/QsNC5X9CW0YPQvF/QqNCw0L0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0K/Qul/QlNGDX9Ch0LVf0KfQvl/Qn9CwX9CW0YNf0KjQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnRCBNTU1NIFlZWVksIGRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQkdGD0LPRg9C9INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQrdGA0YLQsNCz0LBdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YfQsCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Cj0YLQs9Cw0L1dIGRkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQr9C60LjQvSAlcyDQuNGH0LjQtNCwJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQkdC40YAg0L3QtdGH0LAgJXMg0L7Qu9C00LjQvScsXG4gICAgICAgICAgICBzOiAn0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YTRg9GA0YHQsNGCJyxcbiAgICAgICAgICAgIG06ICfQsdC40YAg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIGg6ICfQsdC40YAg0YHQvtCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHQuNGAINC60YPQvScsXG4gICAgICAgICAgICBkZDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNOiAn0LHQuNGAINC+0LknLFxuICAgICAgICAgICAgTU06ICclZCDQvtC5JyxcbiAgICAgICAgICAgIHk6ICfQsdC40YAg0LnQuNC7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LnQuNC7JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHV6O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///57609\n")},57758:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("// Ported from https://github.com/mafintosh/pump with\n// permission from the author, Mathias Buus (@mafintosh).\n\n\n\nvar eos;\nfunction once(callback) {\n var called = false;\n return function () {\n if (called) return;\n called = true;\n callback.apply(void 0, arguments);\n };\n}\nvar _require$codes = (__webpack_require__(86048)/* .codes */ .F),\n ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;\nfunction noop(err) {\n // Rethrow the error if it exists to avoid swallowing it\n if (err) throw err;\n}\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function';\n}\nfunction destroyer(stream, reading, writing, callback) {\n callback = once(callback);\n var closed = false;\n stream.on('close', function () {\n closed = true;\n });\n if (eos === undefined) eos = __webpack_require__(86238);\n eos(stream, {\n readable: reading,\n writable: writing\n }, function (err) {\n if (err) return callback(err);\n closed = true;\n callback();\n });\n var destroyed = false;\n return function (err) {\n if (closed) return;\n if (destroyed) return;\n destroyed = true;\n\n // request.destroy just do .end - .abort is what we want\n if (isRequest(stream)) return stream.abort();\n if (typeof stream.destroy === 'function') return stream.destroy();\n callback(err || new ERR_STREAM_DESTROYED('pipe'));\n };\n}\nfunction call(fn) {\n fn();\n}\nfunction pipe(from, to) {\n return from.pipe(to);\n}\nfunction popCallback(streams) {\n if (!streams.length) return noop;\n if (typeof streams[streams.length - 1] !== 'function') return noop;\n return streams.pop();\n}\nfunction pipeline() {\n for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {\n streams[_key] = arguments[_key];\n }\n var callback = popCallback(streams);\n if (Array.isArray(streams[0])) streams = streams[0];\n if (streams.length < 2) {\n throw new ERR_MISSING_ARGS('streams');\n }\n var error;\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1;\n var writing = i > 0;\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err;\n if (err) destroys.forEach(call);\n if (reading) return;\n destroys.forEach(call);\n callback(error);\n });\n });\n return streams.reduce(pipe);\n}\nmodule.exports = pipeline;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc3NTguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcz81ZDFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW9zO1xuZnVuY3Rpb24gb25jZShjYWxsYmFjaykge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2suYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICB9O1xufVxudmFyIF9yZXF1aXJlJGNvZGVzID0gcmVxdWlyZSgnLi4vLi4vLi4vZXJyb3JzJykuY29kZXMsXG4gIEVSUl9NSVNTSU5HX0FSR1MgPSBfcmVxdWlyZSRjb2Rlcy5FUlJfTUlTU0lOR19BUkdTLFxuICBFUlJfU1RSRUFNX0RFU1RST1lFRCA9IF9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEO1xuZnVuY3Rpb24gbm9vcChlcnIpIHtcbiAgLy8gUmV0aHJvdyB0aGUgZXJyb3IgaWYgaXQgZXhpc3RzIHRvIGF2b2lkIHN3YWxsb3dpbmcgaXRcbiAgaWYgKGVycikgdGhyb3cgZXJyO1xufVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKTtcbiAgdmFyIGNsb3NlZCA9IGZhbHNlO1xuICBzdHJlYW0ub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gIH0pO1xuICBpZiAoZW9zID09PSB1bmRlZmluZWQpIGVvcyA9IHJlcXVpcmUoJy4vZW5kLW9mLXN0cmVhbScpO1xuICBlb3Moc3RyZWFtLCB7XG4gICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgd3JpdGFibGU6IHdyaXRpbmdcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIGRlc3Ryb3llZCA9IHRydWU7XG5cbiAgICAvLyByZXF1ZXN0LmRlc3Ryb3kganVzdCBkbyAuZW5kIC0gLmFib3J0IGlzIHdoYXQgd2Ugd2FudFxuICAgIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5hYm9ydCgpO1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHJldHVybiBzdHJlYW0uZGVzdHJveSgpO1xuICAgIGNhbGxiYWNrKGVyciB8fCBuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3BpcGUnKSk7XG4gIH07XG59XG5mdW5jdGlvbiBjYWxsKGZuKSB7XG4gIGZuKCk7XG59XG5mdW5jdGlvbiBwaXBlKGZyb20sIHRvKSB7XG4gIHJldHVybiBmcm9tLnBpcGUodG8pO1xufVxuZnVuY3Rpb24gcG9wQ2FsbGJhY2soc3RyZWFtcykge1xuICBpZiAoIXN0cmVhbXMubGVuZ3RoKSByZXR1cm4gbm9vcDtcbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gIT09ICdmdW5jdGlvbicpIHJldHVybiBub29wO1xuICByZXR1cm4gc3RyZWFtcy5wb3AoKTtcbn1cbmZ1bmN0aW9uIHBpcGVsaW5lKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3RyZWFtcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzdHJlYW1zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHZhciBjYWxsYmFjayA9IHBvcENhbGxiYWNrKHN0cmVhbXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheShzdHJlYW1zWzBdKSkgc3RyZWFtcyA9IHN0cmVhbXNbMF07XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygnc3RyZWFtcycpO1xuICB9XG4gIHZhciBlcnJvcjtcbiAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIHZhciByZWFkaW5nID0gaSA8IHN0cmVhbXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgd3JpdGluZyA9IGkgPiAwO1xuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiAgICAgIGlmIChlcnIpIGRlc3Ryb3lzLmZvckVhY2goY2FsbCk7XG4gICAgICBpZiAocmVhZGluZykgcmV0dXJuO1xuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKTtcbiAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gcGlwZWxpbmU7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///57758\n")},57777:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Urdu [ur]\n//! author : Sawood Alam : https://github.com/ibnesayeed\n//! author : Zack : https://github.com/ZackVision\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = [\n 'جنوری',\n 'فروری',\n 'مارچ',\n 'اپریل',\n 'مئی',\n 'جون',\n 'جولائی',\n 'اگست',\n 'ستمبر',\n 'اکتوبر',\n 'نومبر',\n 'دسمبر',\n ],\n days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];\n\n var ur = moment.defineLocale('ur', {\n months: months,\n monthsShort: months,\n weekdays: days,\n weekdaysShort: days,\n weekdaysMin: days,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd، D MMMM YYYY HH:mm',\n },\n meridiemParse: /صبح|شام/,\n isPM: function (input) {\n return 'شام' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'صبح';\n }\n return 'شام';\n },\n calendar: {\n sameDay: '[آج بوقت] LT',\n nextDay: '[کل بوقت] LT',\n nextWeek: 'dddd [بوقت] LT',\n lastDay: '[گذشتہ روز بوقت] LT',\n lastWeek: '[گذشتہ] dddd [بوقت] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s بعد',\n past: '%s قبل',\n s: 'چند سیکنڈ',\n ss: '%d سیکنڈ',\n m: 'ایک منٹ',\n mm: '%d منٹ',\n h: 'ایک گھنٹہ',\n hh: '%d گھنٹے',\n d: 'ایک دن',\n dd: '%d دن',\n M: 'ایک ماہ',\n MM: '%d ماہ',\n y: 'ایک سال',\n yy: '%d سال',\n },\n preparse: function (string) {\n return string.replace(/،/g, ',');\n },\n postformat: function (string) {\n return string.replace(/,/g, '،');\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return ur;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc3NzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzPzUyOTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFVyZHUgW3VyXVxuLy8hIGF1dGhvciA6IFNhd29vZCBBbGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2libmVzYXllZWRcbi8vISBhdXRob3IgOiBaYWNrIDogaHR0cHM6Ly9naXRodWIuY29tL1phY2tWaXNpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzZhtmI2LHbjCcsXG4gICAgICAgICAgICAn2YHYsdmI2LHbjCcsXG4gICAgICAgICAgICAn2YXYp9ix2oYnLFxuICAgICAgICAgICAgJ9in2b7YsduM2YQnLFxuICAgICAgICAgICAgJ9mF2KbbjCcsXG4gICAgICAgICAgICAn2KzZiNmGJyxcbiAgICAgICAgICAgICfYrNmI2YTYp9im24wnLFxuICAgICAgICAgICAgJ9in2q/Ys9iqJyxcbiAgICAgICAgICAgICfYs9iq2YXYqNixJyxcbiAgICAgICAgICAgICfYp9qp2KrZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2LPZhdio2LEnLFxuICAgICAgICBdLFxuICAgICAgICBkYXlzID0gWyfYp9iq2YjYp9ixJywgJ9m+24zYsScsICfZhdmG2q/ZhCcsICfYqNiv2r4nLCAn2KzZhdi52LHYp9iqJywgJ9is2YXYuduBJywgJ9uB2YHYqtuBJ107XG5cbiAgICB2YXIgdXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1cicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGF5cyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i12KjYrXzYtNin2YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtdio2K0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnO1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYotisINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9qp2YQg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2q/YsNi02KrbgSDYsdmI2LIg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9qv2LDYtNiq24FdIGRkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINio2LnYrycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2YLYqNmEJyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2LPbjNqp2YbaiCcsXG4gICAgICAgICAgICBzczogJyVkINiz24zaqdmG2ognLFxuICAgICAgICAgICAgbTogJ9in24zaqSDZhdmG2bknLFxuICAgICAgICAgICAgbW06ICclZCDZhdmG2bknLFxuICAgICAgICAgICAgaDogJ9in24zaqSDar9q+2YbZuduBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2q/avtmG2bnbkicsXG4gICAgICAgICAgICBkOiAn2KfbjNqpINiv2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDYr9mGJyxcbiAgICAgICAgICAgIE06ICfYp9uM2qkg2YXYp9uBJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9uBJyxcbiAgICAgICAgICAgIHk6ICfYp9uM2qkg2LPYp9mEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9mEJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXI7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///57777\n")},58076:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Montenegrin [me]\n//! author : Miodrag Nikač : https://github.com/miodragnikac\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var translator = {\n words: {\n //Different grammatical cases\n ss: ['sekund', 'sekunda', 'sekundi'],\n m: ['jedan minut', 'jednog minuta'],\n mm: ['minut', 'minuta', 'minuta'],\n h: ['jedan sat', 'jednog sata'],\n hh: ['sat', 'sata', 'sati'],\n dd: ['dan', 'dana', 'dana'],\n MM: ['mjesec', 'mjeseca', 'mjeseci'],\n yy: ['godina', 'godine', 'godina'],\n },\n correctGrammaticalCase: function (number, wordKey) {\n return number === 1\n ? wordKey[0]\n : number >= 2 && number <= 4\n ? wordKey[1]\n : wordKey[2];\n },\n translate: function (number, withoutSuffix, key) {\n var wordKey = translator.words[key];\n if (key.length === 1) {\n return withoutSuffix ? wordKey[0] : wordKey[1];\n } else {\n return (\n number +\n ' ' +\n translator.correctGrammaticalCase(number, wordKey)\n );\n }\n },\n };\n\n var me = moment.defineLocale('me', {\n months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(\n '_'\n ),\n monthsShort:\n 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),\n monthsParseExact: true,\n weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(\n '_'\n ),\n weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),\n weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D. MMMM YYYY',\n LLL: 'D. MMMM YYYY H:mm',\n LLLL: 'dddd, D. MMMM YYYY H:mm',\n },\n calendar: {\n sameDay: '[danas u] LT',\n nextDay: '[sjutra u] LT',\n\n nextWeek: function () {\n switch (this.day()) {\n case 0:\n return '[u] [nedjelju] [u] LT';\n case 3:\n return '[u] [srijedu] [u] LT';\n case 6:\n return '[u] [subotu] [u] LT';\n case 1:\n case 2:\n case 4:\n case 5:\n return '[u] dddd [u] LT';\n }\n },\n lastDay: '[juče u] LT',\n lastWeek: function () {\n var lastWeekDays = [\n '[prošle] [nedjelje] [u] LT',\n '[prošlog] [ponedjeljka] [u] LT',\n '[prošlog] [utorka] [u] LT',\n '[prošle] [srijede] [u] LT',\n '[prošlog] [četvrtka] [u] LT',\n '[prošlog] [petka] [u] LT',\n '[prošle] [subote] [u] LT',\n ];\n return lastWeekDays[this.day()];\n },\n sameElse: 'L',\n },\n relativeTime: {\n future: 'za %s',\n past: 'prije %s',\n s: 'nekoliko sekundi',\n ss: translator.translate,\n m: translator.translate,\n mm: translator.translate,\n h: translator.translate,\n hh: translator.translate,\n d: 'dan',\n dd: translator.translate,\n M: 'mjesec',\n MM: translator.translate,\n y: 'godinu',\n yy: translator.translate,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return me;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgwNzYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qcz8yOTNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNb250ZW5lZ3JpbiBbbWVdXG4vLyEgYXV0aG9yIDogTWlvZHJhZyBOaWthxI0gPG1pb2RyYWdAcmVzdGFydGl0Lm1lPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taW9kcmFnbmlrYWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZCcsICdzZWt1bmRhJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE1NOiBbJ21qZXNlYycsICdtamVzZWNhJywgJ21qZXNlY2knXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGluYScsICdnb2RpbmUnLCAnZ29kaW5hJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMF1cbiAgICAgICAgICAgICAgICA6IG51bWJlciA+PSAyICYmIG51bWJlciA8PSA0XG4gICAgICAgICAgICAgICAgICA/IHdvcmRLZXlbMV1cbiAgICAgICAgICAgICAgICAgIDogd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdG9yLmNvcnJlY3RHcmFtbWF0aWNhbENhc2UobnVtYmVyLCB3b3JkS2V5KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHZhciBtZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21lJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hci5fYXByLl9tYWpfanVuX2p1bF9hdmcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzanV0cmEgdV0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtuZWRqZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkamVsamthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbdXRvcmthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzcmlqZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ25la29saWtvIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtZTtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58076\n")},58124:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t pad: function () {\n\t },\n\n\t unpad: function () {\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxMjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL3BhZC1ub3BhZGRpbmcuanM/Yjg2YyJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBBIG5vb3AgcGFkZGluZyBzdHJhdGVneS5cblx0ICovXG5cdENyeXB0b0pTLnBhZC5Ob1BhZGRpbmcgPSB7XG5cdCAgICBwYWQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIH0sXG5cblx0ICAgIHVucGFkOiBmdW5jdGlvbiAoKSB7XG5cdCAgICB9XG5cdH07XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMucGFkLk5vUGFkZGluZztcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58124\n")},58168:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxNjguanMiLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcz8wZDA3Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58168\n")},58243:(I,g,n)=>{"use strict";I.exports=n.p+"fadddb09cfe22d5d2cd3.png"},58347:(I,g,n)=>{"use strict";I.exports=n.p+"867798e13c7baca00b6d.png"},58581:(I,g,n)=>{"use strict";I.exports=n.p+"1d5c83b9f70b169f6522.png"},58676:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic (Kuwait) [ar-kw]\n//! author : Nusret Parlak: https://github.com/nusretparlak\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var arKw = moment.defineLocale('ar-kw', {\n months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n '_'\n ),\n monthsShort:\n 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(\n '_'\n ),\n weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[اليوم على الساعة] LT',\n nextDay: '[غدا على الساعة] LT',\n nextWeek: 'dddd [على الساعة] LT',\n lastDay: '[أمس على الساعة] LT',\n lastWeek: 'dddd [على الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'في %s',\n past: 'منذ %s',\n s: 'ثوان',\n ss: '%d ثانية',\n m: 'دقيقة',\n mm: '%d دقائق',\n h: 'ساعة',\n hh: '%d ساعات',\n d: 'يوم',\n dd: '%d أيام',\n M: 'شهر',\n MM: '%d أشهر',\n y: 'سنة',\n yy: '%d سنوات',\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 12, // The week that contains Jan 12th is the first week of the year.\n },\n });\n\n return arKw;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg2NzYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWt3LmpzPzQyM2UiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoS3V3YWl0KSBbYXIta3ddXG4vLyEgYXV0aG9yIDogTnVzcmV0IFBhcmxhazogaHR0cHM6Ly9naXRodWIuY29tL251c3JldHBhcmxha1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyS3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1rdycsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KrZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9in2K3Yr1/Yp9iq2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckt3O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///58676\n")},58845:(I,g,n)=>{"use strict";I.exports=n.p+"6851a20a5501974d9ee4.png"},59297:(I,g,n)=>{"use strict";I.exports=n.p+"7f1c40a2958c6e197678.png"},59407:(I,g,n)=>{"use strict";I.exports=n.p+"37a0828954a7e8440f33.png"},59527:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Turkmen [tk]\n//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var suffixes = {\n 1: \"'inji\",\n 5: \"'inji\",\n 8: \"'inji\",\n 70: \"'inji\",\n 80: \"'inji\",\n 2: \"'nji\",\n 7: \"'nji\",\n 20: \"'nji\",\n 50: \"'nji\",\n 3: \"'ünji\",\n 4: \"'ünji\",\n 100: \"'ünji\",\n 6: \"'njy\",\n 9: \"'unjy\",\n 10: \"'unjy\",\n 30: \"'unjy\",\n 60: \"'ynjy\",\n 90: \"'ynjy\",\n };\n\n var tk = moment.defineLocale('tk', {\n months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(\n '_'\n ),\n monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),\n weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(\n '_'\n ),\n weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),\n weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[bugün sagat] LT',\n nextDay: '[ertir sagat] LT',\n nextWeek: '[indiki] dddd [sagat] LT',\n lastDay: '[düýn] LT',\n lastWeek: '[geçen] dddd [sagat] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s soň',\n past: '%s öň',\n s: 'birnäçe sekunt',\n m: 'bir minut',\n mm: '%d minut',\n h: 'bir sagat',\n hh: '%d sagat',\n d: 'bir gün',\n dd: '%d gün',\n M: 'bir aý',\n MM: '%d aý',\n y: 'bir ýyl',\n yy: '%d ýyl',\n },\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'Do':\n case 'DD':\n return number;\n default:\n if (number === 0) {\n // special case for zero\n return number + \"'unjy\";\n }\n var a = number % 10,\n b = (number % 100) - a,\n c = number >= 100 ? 100 : null;\n return number + (suffixes[a] || suffixes[b] || suffixes[c]);\n }\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 7, // The week that contains Jan 7th is the first week of the year.\n },\n });\n\n return tk;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1MjcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzPzVhZmYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFR1cmttZW4gW3RrXVxuLy8hIGF1dGhvciA6IEF0YW15cmF0IEFiZHlyYWhtYW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdGFteXJhdGFiZHlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogXCInaW5qaVwiLFxuICAgICAgICA1OiBcIidpbmppXCIsXG4gICAgICAgIDg6IFwiJ2luamlcIixcbiAgICAgICAgNzA6IFwiJ2luamlcIixcbiAgICAgICAgODA6IFwiJ2luamlcIixcbiAgICAgICAgMjogXCInbmppXCIsXG4gICAgICAgIDc6IFwiJ25qaVwiLFxuICAgICAgICAyMDogXCInbmppXCIsXG4gICAgICAgIDUwOiBcIiduamlcIixcbiAgICAgICAgMzogXCInw7xuamlcIixcbiAgICAgICAgNDogXCInw7xuamlcIixcbiAgICAgICAgMTAwOiBcIifDvG5qaVwiLFxuICAgICAgICA2OiBcIiduanlcIixcbiAgICAgICAgOTogXCIndW5qeVwiLFxuICAgICAgICAxMDogXCIndW5qeVwiLFxuICAgICAgICAzMDogXCIndW5qeVwiLFxuICAgICAgICA2MDogXCIneW5qeVwiLFxuICAgICAgICA5MDogXCIneW5qeVwiLFxuICAgIH07XG5cbiAgICB2YXIgdGsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0aycsIHtcbiAgICAgICAgbW9udGhzOiAnw51hbndhcl9GZXdyYWxfTWFydF9BcHJlbF9NYcO9X0nDvXVuX0nDvXVsX0F3Z3VzdF9TZW50w71hYnJfT2t0w71hYnJfTm/DvWFicl9EZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnw51hbl9GZXdfTWFyX0Fwcl9NYcO9X0nDvW5fScO9bF9Bd2dfU2VuX09rdF9Ob8O9X0Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfDnWVrxZ9lbmJlX0R1xZ9lbmJlX1NpxZ9lbmJlX8OHYXLFn2VuYmVfUGVuxZ9lbmJlX0FubmFfxZ5lbmJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnw51la19EdcWfX1NpxZ9fw4dhcl9QZW5fQW5uX8WeZW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnw51rX0TFn19TxZ9fw4dyX1BuX0FuX8Webicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZXJ0aXIgc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2luZGlraV0gZGRkZCBbc2FnYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8w71uXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tnZcOnZW5dIGRkZGQgW3NhZ2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvxYgnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMO2xYgnLFxuICAgICAgICAgICAgczogJ2Jpcm7DpMOnZSBzZWt1bnQnLFxuICAgICAgICAgICAgbTogJ2JpciBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0JyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FnYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWdhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIE06ICdiaXIgYcO9JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYcO9JyxcbiAgICAgICAgICAgIHk6ICdiaXIgw715bCcsXG4gICAgICAgICAgICB5eTogJyVkIMO9eWwnLFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBcIid1bmp5XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAobnVtYmVyICUgMTAwKSAtIGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGs7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///59527\n")},59896:(I,g,n)=>{"use strict";I.exports=n.p+"a2d377fe2b7333d422bf.png"},59947:(I,g,n)=>{"use strict";I.exports=n.p+"8b0b26a7923fcdc51fea.png"},60124:(I,g,n)=>{"use strict";I.exports=n.p+"e6b649bdec16e6be6158.png"},60455:(I,g,n)=>{"use strict";I.exports=n.p+"7860a46636044ca4ce49.png"},60708:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Maldivian [dv]\n//! author : Jawish Hameed : https://github.com/jawish\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = [\n 'ޖެނުއަރީ',\n 'ފެބްރުއަރީ',\n 'މާރިޗު',\n 'އޭޕްރީލު',\n 'މޭ',\n 'ޖޫން',\n 'ޖުލައި',\n 'އޯގަސްޓު',\n 'ސެޕްޓެމްބަރު',\n 'އޮކްޓޯބަރު',\n 'ނޮވެމްބަރު',\n 'ޑިސެމްބަރު',\n ],\n weekdays = [\n 'އާދިއްތަ',\n 'ހޯމަ',\n 'އަންގާރަ',\n 'ބުދަ',\n 'ބުރާސްފަތި',\n 'ހުކުރު',\n 'ހޮނިހިރު',\n ];\n\n var dv = moment.defineLocale('dv', {\n months: months,\n monthsShort: months,\n weekdays: weekdays,\n weekdaysShort: weekdays,\n weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'D/M/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /މކ|މފ/,\n isPM: function (input) {\n return 'މފ' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'މކ';\n } else {\n return 'މފ';\n }\n },\n calendar: {\n sameDay: '[މިއަދު] LT',\n nextDay: '[މާދަމާ] LT',\n nextWeek: 'dddd LT',\n lastDay: '[އިއްޔެ] LT',\n lastWeek: '[ފާއިތުވި] dddd LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'ތެރޭގައި %s',\n past: 'ކުރިން %s',\n s: 'ސިކުންތުކޮޅެއް',\n ss: 'd% ސިކުންތު',\n m: 'މިނިޓެއް',\n mm: 'މިނިޓު %d',\n h: 'ގަޑިއިރެއް',\n hh: 'ގަޑިއިރު %d',\n d: 'ދުވަހެއް',\n dd: 'ދުވަސް %d',\n M: 'މަހެއް',\n MM: 'މަސް %d',\n y: 'އަހަރެއް',\n yy: 'އަހަރު %d',\n },\n preparse: function (string) {\n return string.replace(/،/g, ',');\n },\n postformat: function (string) {\n return string.replace(/,/g, '،');\n },\n week: {\n dow: 7, // Sunday is the first day of the week.\n doy: 12, // The week that contains Jan 12th is the first week of the year.\n },\n });\n\n return dv;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA3MDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kdi5qcz81OThhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxkaXZpYW4gW2R2XVxuLy8hIGF1dGhvciA6IEphd2lzaCBIYW1lZWQgOiBodHRwczovL2dpdGh1Yi5jb20vamF3aXNoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ96W3qzegt6q3ofept6D3qknLFxuICAgICAgICAgICAgJ96K3qzehN6w3oPeqt6H3qbeg96pJyxcbiAgICAgICAgICAgICfeid6n3oPeqN6X3qonLFxuICAgICAgICAgICAgJ96H3q3eld6w3oPeqd6N3qonLFxuICAgICAgICAgICAgJ96J3q0nLFxuICAgICAgICAgICAgJ96W3qvegt6wJyxcbiAgICAgICAgICAgICfelt6q3o3ept6H3qgnLFxuICAgICAgICAgICAgJ96H3q/ejt6m3pDesN6T3qonLFxuICAgICAgICAgICAgJ96Q3qzeld6w3pPerN6J3rDehN6m3oPeqicsXG4gICAgICAgICAgICAn3ofert6G3rDek96v3oTept6D3qonLFxuICAgICAgICAgICAgJ96C3q7eiN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgICAgICfekd6o3pDerN6J3rDehN6m3oPeqicsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ96H3qfei96o3ofesN6M3qYnLFxuICAgICAgICAgICAgJ96A3q/eid6mJyxcbiAgICAgICAgICAgICfeh96m3oLesN6O3qfeg96mJyxcbiAgICAgICAgICAgICfehN6q3ovepicsXG4gICAgICAgICAgICAn3oTeqt6D3qfekN6w3orept6M3qgnLFxuICAgICAgICAgICAgJ96A3qreht6q3oPeqicsXG4gICAgICAgICAgICAn3oDert6C3qjegN6o3oPeqicsXG4gICAgICAgIF07XG5cbiAgICB2YXIgZHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkdicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiAn3ofep96L3qhf3oDer96J3qZf3ofept6C3rBf3oTeqt6L3qZf3oTeqt6D3qdf3oDeqt6G3qpf3oDert6C3qgnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL96J3oZ83oneii8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfeid6KJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6GJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6KJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb3oneqN6H3qbei96qXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW96J3qfei96m3onep10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb3ofeqN6H3rDelN6sXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1veit6n3ofeqN6M3qreiN6oXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn3ozerN6D3q3ejt6m3ofeqCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn3obeqt6D3qjegt6wICVzJyxcbiAgICAgICAgICAgIHM6ICfekN6o3obeqt6C3rDejN6q3obert6F3qzeh96wJyxcbiAgICAgICAgICAgIHNzOiAnZCUg3pDeqN6G3qregt6w3ozeqicsXG4gICAgICAgICAgICBtOiAn3oneqN6C3qjek96s3ofesCcsXG4gICAgICAgICAgICBtbTogJ96J3qjegt6o3pPeqiAlZCcsXG4gICAgICAgICAgICBoOiAn3o7ept6R3qjeh96o3oPerN6H3rAnLFxuICAgICAgICAgICAgaGg6ICfejt6m3pHeqN6H3qjeg96qICVkJyxcbiAgICAgICAgICAgIGQ6ICfei96q3ojept6A3qzeh96wJyxcbiAgICAgICAgICAgIGRkOiAn3oveqt6I3qbekN6wICVkJyxcbiAgICAgICAgICAgIE06ICfeid6m3oDerN6H3rAnLFxuICAgICAgICAgICAgTU06ICfeid6m3pDesCAlZCcsXG4gICAgICAgICAgICB5OiAn3ofept6A3qbeg96s3ofesCcsXG4gICAgICAgICAgICB5eTogJ96H3qbegN6m3oPeqiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA3LCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZHY7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///60708\n")},61290:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Bengali [bn]\n//! author : Kaushik Gandhi : https://github.com/kaushikgandhi\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '১',\n 2: '২',\n 3: '৩',\n 4: '৪',\n 5: '৫',\n 6: '৬',\n 7: '৭',\n 8: '৮',\n 9: '৯',\n 0: '০',\n },\n numberMap = {\n '১': '1',\n '২': '2',\n '৩': '3',\n '৪': '4',\n '৫': '5',\n '৬': '6',\n '৭': '7',\n '৮': '8',\n '৯': '9',\n '০': '0',\n };\n\n var bn = moment.defineLocale('bn', {\n months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(\n '_'\n ),\n monthsShort:\n 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(\n '_'\n ),\n weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(\n '_'\n ),\n weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),\n weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),\n longDateFormat: {\n LT: 'A h:mm সময়',\n LTS: 'A h:mm:ss সময়',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY, A h:mm সময়',\n LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',\n },\n calendar: {\n sameDay: '[আজ] LT',\n nextDay: '[আগামীকাল] LT',\n nextWeek: 'dddd, LT',\n lastDay: '[গতকাল] LT',\n lastWeek: '[গত] dddd, LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s পরে',\n past: '%s আগে',\n s: 'কয়েক সেকেন্ড',\n ss: '%d সেকেন্ড',\n m: 'এক মিনিট',\n mm: '%d মিনিট',\n h: 'এক ঘন্টা',\n hh: '%d ঘন্টা',\n d: 'এক দিন',\n dd: '%d দিন',\n M: 'এক মাস',\n MM: '%d মাস',\n y: 'এক বছর',\n yy: '%d বছর',\n },\n preparse: function (string) {\n return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {\n return numberMap[match];\n });\n },\n postformat: function (string) {\n return string.replace(/\\d/g, function (match) {\n return symbolMap[match];\n });\n },\n meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,\n meridiemHour: function (hour, meridiem) {\n if (hour === 12) {\n hour = 0;\n }\n if (\n (meridiem === 'রাত' && hour >= 4) ||\n (meridiem === 'দুপুর' && hour < 5) ||\n meridiem === 'বিকাল'\n ) {\n return hour + 12;\n } else {\n return hour;\n }\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 4) {\n return 'রাত';\n } else if (hour < 10) {\n return 'সকাল';\n } else if (hour < 17) {\n return 'দুপুর';\n } else if (hour < 20) {\n return 'বিকাল';\n } else {\n return 'রাত';\n }\n },\n week: {\n dow: 0, // Sunday is the first day of the week.\n doy: 6, // The week that contains Jan 6th is the first week of the year.\n },\n });\n\n return bn;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEyOTAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanM/OTA0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVuZ2FsaSBbYm5dXG4vLyEgYXV0aG9yIDogS2F1c2hpayBHYW5kaGkgOiBodHRwczovL2dpdGh1Yi5jb20va2F1c2hpa2dhbmRoaVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgp6cnLFxuICAgICAgICAgICAgMjogJ+CnqCcsXG4gICAgICAgICAgICAzOiAn4KepJyxcbiAgICAgICAgICAgIDQ6ICfgp6onLFxuICAgICAgICAgICAgNTogJ+CnqycsXG4gICAgICAgICAgICA2OiAn4KesJyxcbiAgICAgICAgICAgIDc6ICfgp60nLFxuICAgICAgICAgICAgODogJ+CnricsXG4gICAgICAgICAgICA5OiAn4KevJyxcbiAgICAgICAgICAgIDA6ICfgp6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KenJzogJzEnLFxuICAgICAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICAgICAn4KeqJzogJzQnLFxuICAgICAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICAgICAn4KetJzogJzcnLFxuICAgICAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICAgICAn4KemJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4nLCB7XG4gICAgICAgIG1vbnRoczogJ+CmnOCmvuCmqOCngeCnn+CmvuCmsOCmv1/gpqvgp4fgpqzgp43gprDgp4Hgp5/gpr7gprDgpr9f4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4Kaf4KeH4Kau4KeN4Kas4KawX+CmheCmleCnjeCmn+Cni+CmrOCmsF/gpqjgpq3gp4fgpq7gp43gpqzgprBf4Kah4Ka/4Ka44KeH4Kau4KeN4Kas4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgppzgpr7gpqjgp4Ff4Kar4KeH4Kas4KeN4Kaw4KeBX+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn1/gpoXgppXgp43gpp/gp4tf4Kao4Kat4KeHX+CmoeCmv+CmuOCnhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprngprjgp43gpqrgpqTgpr9f4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka5X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CmhuCmnF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpobgppfgpr7gpq7gp4DgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgppfgpqTgppXgpr7gprJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Cml+CmpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpqrgprDgp4cnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCmhuCml+CnhycsXG4gICAgICAgICAgICBzOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzczogJyVkIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBtOiAn4KaP4KaVIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBtbTogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoOiAn4KaP4KaVIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBoaDogJyVkIOCmmOCmqOCnjeCmn+CmvicsXG4gICAgICAgICAgICBkOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBNOiAn4KaP4KaVIOCmruCmvuCmuCcsXG4gICAgICAgICAgICBNTTogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5OiAn4KaP4KaVIOCmrOCmm+CmsCcsXG4gICAgICAgICAgICB5eTogJyVkIOCmrOCmm+CmsCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgp6fgp6jgp6ngp6rgp6vgp6zgp63gp67gp6/gp6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gprDgpr7gpqR84Ka44KaV4Ka+4KayfOCmpuCngeCmquCngeCmsHzgpqzgpr/gppXgpr7gprJ84Kaw4Ka+4KakLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmsOCmvuCmpCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpqzgpr/gppXgpr7gprInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm47XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///61290\n")},61339:(I,g,n)=>{"use strict";I.exports=n.p+"fd02338aa21f14b3841c.png"},61501:(I,g,n)=>{"use strict";I.exports=n.p+"5190a512a002fc1723f5.png"},61509:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Arabic [ar]\n//! author : Abdel Said: https://github.com/abdelsaid\n//! author : Ahmed Elkhatib\n//! author : forabi https://github.com/forabi\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var symbolMap = {\n 1: '١',\n 2: '٢',\n 3: '٣',\n 4: '٤',\n 5: '٥',\n 6: '٦',\n 7: '٧',\n 8: '٨',\n 9: '٩',\n 0: '٠',\n },\n numberMap = {\n '١': '1',\n '٢': '2',\n '٣': '3',\n '٤': '4',\n '٥': '5',\n '٦': '6',\n '٧': '7',\n '٨': '8',\n '٩': '9',\n '٠': '0',\n },\n pluralForm = function (n) {\n return n === 0\n ? 0\n : n === 1\n ? 1\n : n === 2\n ? 2\n : n % 100 >= 3 && n % 100 <= 10\n ? 3\n : n % 100 >= 11\n ? 4\n : 5;\n },\n plurals = {\n s: [\n 'أقل من ثانية',\n 'ثانية واحدة',\n ['ثانيتان', 'ثانيتين'],\n '%d ثوان',\n '%d ثانية',\n '%d ثانية',\n ],\n m: [\n 'أقل من دقيقة',\n 'دقيقة واحدة',\n ['دقيقتان', 'دقيقتين'],\n '%d دقائق',\n '%d دقيقة',\n '%d دقيقة',\n ],\n h: [\n 'أقل من ساعة',\n 'ساعة واحدة',\n ['ساعتان', 'ساعتين'],\n '%d ساعات',\n '%d ساعة',\n '%d ساعة',\n ],\n d: [\n 'أقل من يوم',\n 'يوم واحد',\n ['يومان', 'يومين'],\n '%d أيام',\n '%d يومًا',\n '%d يوم',\n ],\n M: [\n 'أقل من شهر',\n 'شهر واحد',\n ['شهران', 'شهرين'],\n '%d أشهر',\n '%d شهرا',\n '%d شهر',\n ],\n y: [\n 'أقل من عام',\n 'عام واحد',\n ['عامان', 'عامين'],\n '%d أعوام',\n '%d عامًا',\n '%d عام',\n ],\n },\n pluralize = function (u) {\n return function (number, withoutSuffix, string, isFuture) {\n var f = pluralForm(number),\n str = plurals[u][pluralForm(number)];\n if (f === 2) {\n str = str[withoutSuffix ? 0 : 1];\n }\n return str.replace(/%d/i, number);\n };\n },\n months = [\n 'يناير',\n 'فبراير',\n 'مارس',\n 'أبريل',\n 'مايو',\n 'يونيو',\n 'يوليو',\n 'أغسطس',\n 'سبتمبر',\n 'أكتوبر',\n 'نوفمبر',\n 'ديسمبر',\n ];\n\n var ar = moment.defineLocale('ar', {\n months: months,\n monthsShort: months,\n weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),\n weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),\n weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'D/\\u200FM/\\u200FYYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n meridiemParse: /ص|م/,\n isPM: function (input) {\n return 'م' === input;\n },\n meridiem: function (hour, minute, isLower) {\n if (hour < 12) {\n return 'ص';\n } else {\n return 'م';\n }\n },\n calendar: {\n sameDay: '[اليوم عند الساعة] LT',\n nextDay: '[غدًا عند الساعة] LT',\n nextWeek: 'dddd [عند الساعة] LT',\n lastDay: '[أمس عند الساعة] LT',\n lastWeek: 'dddd [عند الساعة] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'بعد %s',\n past: 'منذ %s',\n s: pluralize('s'),\n ss: pluralize('s'),\n m: pluralize('m'),\n mm: pluralize('m'),\n h: pluralize('h'),\n hh: pluralize('h'),\n d: pluralize('d'),\n dd: pluralize('d'),\n M: pluralize('M'),\n MM: pluralize('M'),\n y: pluralize('y'),\n yy: pluralize('y'),\n },\n preparse: function (string) {\n return string\n .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {\n return numberMap[match];\n })\n .replace(/،/g, ',');\n },\n postformat: function (string) {\n return string\n .replace(/\\d/g, function (match) {\n return symbolMap[match];\n })\n .replace(/,/g, '،');\n },\n week: {\n dow: 6, // Saturday is the first day of the week.\n doy: 12, // The week that contains Jan 12th is the first week of the year.\n },\n });\n\n return ar;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE1MDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci5qcz84ZTczIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgW2FyXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vISBhdXRob3IgOiBBaG1lZCBFbGtoYXRpYlxuLy8hIGF1dGhvciA6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhtmK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhcicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXI7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///61509\n")},61987:(I,g,n)=>{"use strict";I.exports=n.p+"6cebcf3d142594360c80.png"},62012:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIwMTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcz9jMzQ1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vLyBIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xudmFyIGlnbm9yZUR1cGxpY2F0ZU9mID0gW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl07XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdmFyIHBhcnNlZCA9IHt9O1xuICB2YXIga2V5O1xuICB2YXIgdmFsO1xuICB2YXIgaTtcblxuICBpZiAoIWhlYWRlcnMpIHsgcmV0dXJuIHBhcnNlZDsgfVxuXG4gIHV0aWxzLmZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoMCwgaSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgaWYgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICBwYXJzZWRba2V5XSA9IChwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldIDogW10pLmNvbmNhdChbdmFsXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///62012\n")},62973:(I,g,n)=>{"use strict";I.exports=n.p+"e52c5174b9a76307312b.png"},63009:function(module,exports,__webpack_require__){eval(";(function (root, factory) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Initialization and round constants tables\n\t var H = [];\n\t var K = [];\n\n\t // Compute constants\n\t (function () {\n\t function isPrime(n) {\n\t var sqrtN = Math.sqrt(n);\n\t for (var factor = 2; factor <= sqrtN; factor++) {\n\t if (!(n % factor)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t function getFractionalBits(n) {\n\t return ((n - (n | 0)) * 0x100000000) | 0;\n\t }\n\n\t var n = 2;\n\t var nPrime = 0;\n\t while (nPrime < 64) {\n\t if (isPrime(n)) {\n\t if (nPrime < 8) {\n\t H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t }\n\t K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t nPrime++;\n\t }\n\n\t n++;\n\t }\n\t }());\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-256 hash algorithm.\n\t */\n\t var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init(H.slice(0));\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\t var f = H[5];\n\t var g = H[6];\n\t var h = H[7];\n\n\t // Computation\n\t for (var i = 0; i < 64; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var gamma0x = W[i - 15];\n\t var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\n\t ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t (gamma0x >>> 3);\n\n\t var gamma1x = W[i - 2];\n\t var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t (gamma1x >>> 10);\n\n\t W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t }\n\n\t var ch = (e & f) ^ (~e & g);\n\t var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\n\n\t var t1 = h + sigma1 + ch + K[i] + W[i];\n\t var t2 = sigma0 + maj;\n\n\t h = g;\n\t g = f;\n\t f = e;\n\t e = (d + t1) | 0;\n\t d = c;\n\t c = b;\n\t b = a;\n\t a = (t1 + t2) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t H[5] = (H[5] + f) | 0;\n\t H[6] = (H[6] + g) | 0;\n\t H[7] = (H[7] + h) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA256('message');\n\t * var hash = CryptoJS.SHA256(wordArray);\n\t */\n\t C.SHA256 = Hasher._createHelper(SHA256);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA256(message, key);\n\t */\n\t C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMwMDkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvc2hhMjU2LmpzPzk0ZjgiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBJbml0aWFsaXphdGlvbiBhbmQgcm91bmQgY29uc3RhbnRzIHRhYmxlc1xuXHQgICAgdmFyIEggPSBbXTtcblx0ICAgIHZhciBLID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgY29uc3RhbnRzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIGlzUHJpbWUobikge1xuXHQgICAgICAgICAgICB2YXIgc3FydE4gPSBNYXRoLnNxcnQobik7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGZhY3RvciA9IDI7IGZhY3RvciA8PSBzcXJ0TjsgZmFjdG9yKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmICghKG4gJSBmYWN0b3IpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gZ2V0RnJhY3Rpb25hbEJpdHMobikge1xuXHQgICAgICAgICAgICByZXR1cm4gKChuIC0gKG4gfCAwKSkgKiAweDEwMDAwMDAwMCkgfCAwO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBuID0gMjtcblx0ICAgICAgICB2YXIgblByaW1lID0gMDtcblx0ICAgICAgICB3aGlsZSAoblByaW1lIDwgNjQpIHtcblx0ICAgICAgICAgICAgaWYgKGlzUHJpbWUobikpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChuUHJpbWUgPCA4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgSFtuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDIpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIEtbblByaW1lXSA9IGdldEZyYWN0aW9uYWxCaXRzKE1hdGgucG93KG4sIDEgLyAzKSk7XG5cblx0ICAgICAgICAgICAgICAgIG5QcmltZSsrO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgbisrO1xuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdFxuXHQgICAgdmFyIFcgPSBbXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMjU2IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NiA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoSC5zbGljZSgwKSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgZSA9IEhbNF07XG5cdCAgICAgICAgICAgIHZhciBmID0gSFs1XTtcblx0ICAgICAgICAgICAgdmFyIGcgPSBIWzZdO1xuXHQgICAgICAgICAgICB2YXIgaCA9IEhbN107XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEweCA9IFdbaSAtIDE1XTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEwICA9ICgoZ2FtbWEweCA8PCAyNSkgfCAoZ2FtbWEweCA+Pj4gNykpICBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhbW1hMHggPDwgMTQpIHwgKGdhbW1hMHggPj4+IDE4KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnYW1tYTB4ID4+PiAzKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTF4ID0gV1tpIC0gMl07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMSAgPSAoKGdhbW1hMXggPDwgMTUpIHwgKGdhbW1hMXggPj4+IDE3KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChnYW1tYTF4IDw8IDEzKSB8IChnYW1tYTF4ID4+PiAxOSkpIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2FtbWExeCA+Pj4gMTApO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IGdhbW1hMCArIFdbaSAtIDddICsgZ2FtbWExICsgV1tpIC0gMTZdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggID0gKGUgJiBmKSBeICh+ZSAmIGcpO1xuXHQgICAgICAgICAgICAgICAgdmFyIG1haiA9IChhICYgYikgXiAoYSAmIGMpIF4gKGIgJiBjKTtcblxuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMCA9ICgoYSA8PCAzMCkgfCAoYSA+Pj4gMikpIF4gKChhIDw8IDE5KSB8IChhID4+PiAxMykpIF4gKChhIDw8IDEwKSB8IChhID4+PiAyMikpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMSA9ICgoZSA8PCAyNikgfCAoZSA+Pj4gNikpIF4gKChlIDw8IDIxKSB8IChlID4+PiAxMSkpIF4gKChlIDw8IDcpICB8IChlID4+PiAyNSkpO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdDEgPSBoICsgc2lnbWExICsgY2ggKyBLW2ldICsgV1tpXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MiA9IHNpZ21hMCArIG1hajtcblxuXHQgICAgICAgICAgICAgICAgaCA9IGc7XG5cdCAgICAgICAgICAgICAgICBnID0gZjtcblx0ICAgICAgICAgICAgICAgIGYgPSBlO1xuXHQgICAgICAgICAgICAgICAgZSA9IChkICsgdDEpIHwgMDtcblx0ICAgICAgICAgICAgICAgIGQgPSBjO1xuXHQgICAgICAgICAgICAgICAgYyA9IGI7XG5cdCAgICAgICAgICAgICAgICBiID0gYTtcblx0ICAgICAgICAgICAgICAgIGEgPSAodDEgKyB0MikgfCAwO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSFswXSA9IChIWzBdICsgYSkgfCAwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDtcblx0ICAgICAgICAgICAgSFszXSA9IChIWzNdICsgZCkgfCAwO1xuXHQgICAgICAgICAgICBIWzRdID0gKEhbNF0gKyBlKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNV0gPSAoSFs1XSArIGYpIHwgMDtcblx0ICAgICAgICAgICAgSFs2XSA9IChIWzZdICsgZykgfCAwO1xuXHQgICAgICAgICAgICBIWzddID0gKEhbN10gKyBoKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTI1NignbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBMjU2ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMjU2KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEEyNTYobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBMjU2ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTI1Nik7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTI1NjtcblxufSkpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63009\n")},63069:(I,g,n)=>{"use strict";I.exports=n.p+"dcee6b2079fb9b7f7c89.png"},63141:(I,g,n)=>{"use strict";I.exports=n.p+"06ae1ca78547fb5fa4a9.png"},63164:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Korean [ko]\n//! author : Kyungwook, Park : https://github.com/kyungw00k\n//! author : Jeeeyul Lee \n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ko = moment.defineLocale('ko', {\n months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),\n monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(\n '_'\n ),\n weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),\n weekdaysShort: '일_월_화_수_목_금_토'.split('_'),\n weekdaysMin: '일_월_화_수_목_금_토'.split('_'),\n longDateFormat: {\n LT: 'A h:mm',\n LTS: 'A h:mm:ss',\n L: 'YYYY.MM.DD.',\n LL: 'YYYY년 MMMM D일',\n LLL: 'YYYY년 MMMM D일 A h:mm',\n LLLL: 'YYYY년 MMMM D일 dddd A h:mm',\n l: 'YYYY.MM.DD.',\n ll: 'YYYY년 MMMM D일',\n lll: 'YYYY년 MMMM D일 A h:mm',\n llll: 'YYYY년 MMMM D일 dddd A h:mm',\n },\n calendar: {\n sameDay: '오늘 LT',\n nextDay: '내일 LT',\n nextWeek: 'dddd LT',\n lastDay: '어제 LT',\n lastWeek: '지난주 dddd LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: '%s 후',\n past: '%s 전',\n s: '몇 초',\n ss: '%d초',\n m: '1분',\n mm: '%d분',\n h: '한 시간',\n hh: '%d시간',\n d: '하루',\n dd: '%d일',\n M: '한 달',\n MM: '%d달',\n y: '일 년',\n yy: '%d년',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(일|월|주)/,\n ordinal: function (number, period) {\n switch (period) {\n case 'd':\n case 'D':\n case 'DDD':\n return number + '일';\n case 'M':\n return number + '월';\n case 'w':\n case 'W':\n return number + '주';\n default:\n return number;\n }\n },\n meridiemParse: /오전|오후/,\n isPM: function (token) {\n return token === '오후';\n },\n meridiem: function (hour, minute, isUpper) {\n return hour < 12 ? '오전' : '오후';\n },\n });\n\n return ko;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMxNjQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rby5qcz8yMmY4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb3JlYW4gW2tvXVxuLy8hIGF1dGhvciA6IEt5dW5nd29vaywgUGFyayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9reXVuZ3cwMGtcbi8vISBhdXRob3IgOiBKZWVleXVsIExlZSA8amVlZXl1bEBnbWFpbC5jb20+XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga28gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbycsIHtcbiAgICAgICAgbW9udGhzOiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn7J287JqU7J28X+yblOyalOydvF/tmZTsmpTsnbxf7IiY7JqU7J28X+uqqeyalOydvF/quIjsmpTsnbxf7Yag7JqU7J28Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn7J28X+yblF/tmZRf7IiYX+uqqV/quIhf7YagJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZ64WEIE1NTU0gROydvCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgQSBoOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLk1NLkRELicsXG4gICAgICAgICAgICBsbDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnrhYQgTU1NTSBE7J28IEEgaDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeuFhCBNTU1NIETsnbwgZGRkZCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ+yYpOuKmCBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAn64K07J28IExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAn7Ja07KCcIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAn7KeA64Kc7KO8IGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDtm4QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOyghCcsXG4gICAgICAgICAgICBzOiAn66qHIOy0iCcsXG4gICAgICAgICAgICBzczogJyVk7LSIJyxcbiAgICAgICAgICAgIG06ICcx67aEJyxcbiAgICAgICAgICAgIG1tOiAnJWTrtoQnLFxuICAgICAgICAgICAgaDogJ+2VnCDsi5zqsIQnLFxuICAgICAgICAgICAgaGg6ICclZOyLnOqwhCcsXG4gICAgICAgICAgICBkOiAn7ZWY66OoJyxcbiAgICAgICAgICAgIGRkOiAnJWTsnbwnLFxuICAgICAgICAgICAgTTogJ+2VnCDri6wnLFxuICAgICAgICAgICAgTU06ICclZOuLrCcsXG4gICAgICAgICAgICB5OiAn7J28IOuFhCcsXG4gICAgICAgICAgICB5eTogJyVk64WEJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOydvHzsm5R87KO8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+ydvCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7JuUJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfso7wnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/smKTsoIR87Jik7ZuELyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4gPT09ICfsmKTtm4QnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICfsmKTsoIQnIDogJ+yYpO2bhCc7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga287XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63164\n")},63421:(I,g,n)=>{"use strict";I.exports=n.p+"085f150ea3b79ac5fe49.png"},63600:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval('// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// "Software"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\nvar Transform = __webpack_require__(74610);\n__webpack_require__(56698)(PassThrough, Transform);\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n Transform.call(this, options);\n}\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM2MDAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanM/NzgwZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5yZXF1aXJlKCdpbmhlcml0cycpKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63600\n')},64051:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Pseudo [x-pseudo]\n//! author : Andrew Hood : https://github.com/andrewhood125\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var xPseudo = moment.defineLocale('x-pseudo', {\n months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(\n '_'\n ),\n monthsShort:\n 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays:\n 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(\n '_'\n ),\n weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),\n weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[T~ódá~ý át] LT',\n nextDay: '[T~ómó~rró~w át] LT',\n nextWeek: 'dddd [át] LT',\n lastDay: '[Ý~ést~érdá~ý át] LT',\n lastWeek: '[L~ást] dddd [át] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'í~ñ %s',\n past: '%s á~gó',\n s: 'á ~féw ~sécó~ñds',\n ss: '%d s~écóñ~ds',\n m: 'á ~míñ~úté',\n mm: '%d m~íñú~tés',\n h: 'á~ñ hó~úr',\n hh: '%d h~óúrs',\n d: 'á ~dáý',\n dd: '%d d~áýs',\n M: 'á ~móñ~th',\n MM: '%d m~óñt~hs',\n y: 'á ~ýéár',\n yy: '%d ý~éárs',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return xPseudo;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQwNTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzP2ZkN2UiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBzZXVkbyBbeC1wc2V1ZG9dXG4vLyEgYXV0aG9yIDogQW5kcmV3IEhvb2QgOiBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3aG9vZDEyNVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHhQc2V1ZG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd4LXBzZXVkbycsIHtcbiAgICAgICAgbW9udGhzOiAnSn7DocOxw7rDoX5yw71fRn7DqWJyw7p+w6Fyw71ffk3DoXJjfmhfw4FwfnLDrWxffk3DocO9X35Kw7rDscOpfl9Kw7psfsO9X8OBw7p+Z8O6c3R+X1PDqXB+dMOpbWJ+w6lyX8OTfmN0w7NifsOpcl/DkX7Ds3bDqW1+YsOpcl9+RMOpY8Opfm1iw6lyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKfsOhw7FffkbDqWJffk3DoXJffsOBcHJffk3DocO9X35Kw7rDsV9+SsO6bF9+w4HDumdfflPDqXBffsOTY3RffsORw7N2X35Ew6ljJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1N+w7rDsWTDoX7DvV9Nw7N+w7Fkw6HDvX5fVMO6w6l+c2TDocO9fl9Xw6lkfsOxw6lzZH7DocO9X1R+aMO6cnN+ZMOhw71ffkZyw61kfsOhw71fU37DoXTDunJ+ZMOhw70nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N+w7rDsV9+TcOzw7FfflTDusOpX35Xw6lkX35UaMO6X35GcsOtX35Tw6F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N+w7pfTcOzfl9Uw7pfflfDqV9UfmhfRnJ+X1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1R+w7Nkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1R+w7Ntw7N+cnLDs353IMOhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw51+w6lzdH7DqXJkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMfsOhc3RdIGRkZGQgW8OhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfDrX7DsSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw6F+Z8OzJyxcbiAgICAgICAgICAgIHM6ICfDoSB+ZsOpdyB+c8OpY8OzfsOxZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzfsOpY8Ozw7F+ZHMnLFxuICAgICAgICAgICAgbTogJ8OhIH5tw63DsX7DunTDqScsXG4gICAgICAgICAgICBtbTogJyVkIG1+w63DscO6fnTDqXMnLFxuICAgICAgICAgICAgaDogJ8OhfsOxIGjDs37DunInLFxuICAgICAgICAgICAgaGg6ICclZCBofsOzw7pycycsXG4gICAgICAgICAgICBkOiAnw6EgfmTDocO9JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZH7DocO9cycsXG4gICAgICAgICAgICBNOiAnw6Egfm3Ds8OxfnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbX7Ds8OxdH5ocycsXG4gICAgICAgICAgICB5OiAnw6EgfsO9w6nDoXInLFxuICAgICAgICAgICAgeXk6ICclZCDDvX7DqcOhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4geFBzZXVkbztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64051\n")},64082:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Context: () => (/* binding */ Context),\n/* harmony export */ ServiceProvider: () => (/* binding */ ServiceProvider),\n/* harmony export */ useServiceContext: () => (/* binding */ useServiceContext)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24002);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _src_constants_constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56597);\n/* harmony import */ var _azure_msal_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(77560);\n/* harmony import */ var _azure_msal_react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_azure_msal_react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _forgerock_javascript_sdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12748);\n/* harmony import */ var _forgerock_javascript_sdk__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_forgerock_javascript_sdk__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _azure_msal_browser__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(149);\n/* harmony import */ var _azure_msal_browser__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_azure_msal_browser__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _root_src_containers_msal_authConfig__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56826);\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }\nfunction _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\n\n\n\n\n\n\nconst Context = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({});\nconst useService = () => {\n const {\n instance\n } = (0,_azure_msal_react__WEBPACK_IMPORTED_MODULE_2__.useMsal)();\n const [service, setService] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const [shellTokenResponseData, setShellTokenResponseData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const [defaultServiceAppRemoteName, setDefaultServiceAppRemoteName] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\'\');\n const [idpProvider, setIdpProvider] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\'\');\n const [rbac, setRBAC] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const [clientCode, setClientCode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const [loginMicroAppOption, setLoginMicroAppOption] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const [logoutMicroAppOption, setLogoutMicroAppOption] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const fetchMicrosoftADToken = async () => {\n let msalTokenResponse;\n const currentAccount = instance.getActiveAccount();\n const accessTokenRequest = {\n scopes: _root_src_containers_msal_authConfig__WEBPACK_IMPORTED_MODULE_5__/* .msalLoginRequest */ .go.scopes,\n account: currentAccount,\n refreshTokenExpirationOffsetSeconds: "".concat("3600")\n };\n try {\n msalTokenResponse = await instance.acquireTokenSilent(accessTokenRequest);\n } catch (error) {\n if (error instanceof _azure_msal_browser__WEBPACK_IMPORTED_MODULE_4__.InteractionRequiredAuthError) {\n msalTokenResponse = await instance.acquireTokenRedirect(accessTokenRequest);\n }\n }\n return msalTokenResponse;\n };\n const fetchAccessTokenResponse = async () => {\n var _Object$keys;\n let refreshedTokenResponse;\n let currentIdpProviderName = (0,_src_constants_constant__WEBPACK_IMPORTED_MODULE_1__/* .getCurrentIdpProvider */ .sC)();\n switch (currentIdpProviderName) {\n case _src_constants_constant__WEBPACK_IMPORTED_MODULE_1__/* .IdpProviderOption */ .EP.FORGE_ROCK:\n refreshedTokenResponse = await _forgerock_javascript_sdk__WEBPACK_IMPORTED_MODULE_3__.TokenStorage.get();\n break;\n case _src_constants_constant__WEBPACK_IMPORTED_MODULE_1__/* .IdpProviderOption */ .EP.KEY_CLOAK:\n const keyCloakInstanceData = window.keyCloakInstance;\n if (keyCloakInstanceData && ((_Object$keys = Object.keys(keyCloakInstanceData)) === null || _Object$keys === void 0 ? void 0 : _Object$keys.length) > 0 && keyCloakInstanceData.authenticated === true) {\n refreshedTokenResponse = {\n accessToken: \'\',\n idToken: keyCloakInstanceData === null || keyCloakInstanceData === void 0 ? void 0 : keyCloakInstanceData.idToken\n };\n }\n break;\n case _src_constants_constant__WEBPACK_IMPORTED_MODULE_1__/* .IdpProviderOption */ .EP.MICROSOFT:\n let microsoftAdToken = await fetchMicrosoftADToken();\n refreshedTokenResponse = {\n accessToken: microsoftAdToken === null || microsoftAdToken === void 0 ? void 0 : microsoftAdToken.accessToken,\n idToken: microsoftAdToken === null || microsoftAdToken === void 0 ? void 0 : microsoftAdToken.idToken\n };\n break;\n default:\n break;\n }\n return refreshedTokenResponse;\n };\n return _objectSpread(_objectSpread({}, service), {}, {\n setService,\n rbac,\n defaultServiceAppRemoteName,\n setDefaultServiceAppRemoteName,\n shellTokenResponseData,\n setShellTokenResponseData,\n idpProvider,\n setIdpProvider,\n setRBAC,\n clientCode,\n setClientCode,\n loginMicroAppOption,\n fetchAccessTokenResponse,\n logoutMicroAppOption,\n setLoginMicroAppOption,\n setLogoutMicroAppOption,\n shellSource: _src_constants_constant__WEBPACK_IMPORTED_MODULE_1__/* .ShellSource */ ._i\n });\n};\nconst useServiceContext = () => {\n const context = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Context);\n if (context === undefined) {\n throw new Error(\'ServiceContext value is undefined. Make sure you use the ServiceProvider before using the context.\');\n }\n return context;\n};\nconst ServiceProvider = _ref => {\n let {\n children\n } = _ref;\n const value = useService();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Context.Provider, {\n value: value\n }, children);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQwODIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFPQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF3QkE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vc3JjL3NlcnZpY2VzL3NoZWxsQ29udGV4dC5zZXJ2aWNlLnRzeD8yZTJjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xyXG4gIFJlYWN0Tm9kZSxcclxuICB1c2VTdGF0ZSxcclxuICBjcmVhdGVDb250ZXh0LFxyXG4gIHVzZUNvbnRleHQsXHJcbiAgUmVhY3RFbGVtZW50LFxyXG59IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtcclxuICBJZHBQcm92aWRlck9wdGlvbixcclxuICBnZXRDdXJyZW50SWRwUHJvdmlkZXIsXHJcbn0gZnJvbSAnQHNyYy9jb25zdGFudHMvY29uc3RhbnQnO1xyXG5pbXBvcnQgeyB1c2VNc2FsIH0gZnJvbSAnQGF6dXJlL21zYWwtcmVhY3QnO1xyXG5pbXBvcnQgeyBUb2tlblN0b3JhZ2UgfSBmcm9tICdAZm9yZ2Vyb2NrL2phdmFzY3JpcHQtc2RrJztcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvciB9IGZyb20gJ0BhenVyZS9tc2FsLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBtc2FsTG9naW5SZXF1ZXN0IH0gZnJvbSAnQHJvb3Qvc3JjL2NvbnRhaW5lcnMvbXNhbC9hdXRoQ29uZmlnJztcclxuaW1wb3J0IHsgU2hlbGxTb3VyY2UgfSBmcm9tICdAc3JjL2NvbnN0YW50cy9jb25zdGFudCc7XHJcblxyXG50eXBlIFNlcnZpY2VDb250ZXh0UHJvcHMgPSB7XHJcbiAgc2V0U2VydmljZTogKGNvbmZpZzogYW55KSA9PiB2b2lkO1xyXG4gIHJiYWM6IHt9O1xyXG4gIGNsaWVudENvZGU6IHt9O1xyXG4gIGRlZmF1bHRTZXJ2aWNlQXBwUmVtb3RlTmFtZTogYm9vbGVhbjtcclxuICBzZXREZWZhdWx0U2VydmljZUFwcFJlbW90ZU5hbWU6ICgpID0+IHZvaWQ7XHJcbiAgc2hlbGxUb2tlblJlc3BvbnNlRGF0YToge307XHJcbiAgc2V0U2hlbGxUb2tlblJlc3BvbnNlRGF0YTogKCkgPT4gdm9pZDtcclxuICBpZHBQcm92aWRlcjogJyc7XHJcbiAgc2V0SWRwUHJvdmlkZXI6ICgpID0+IHZvaWQ7XHJcbiAgZ2V0QW5kU2V0UkJBQzogKCkgPT4ge307XHJcbiAgbG9naW5NaWNyb0FwcE9wdGlvbjoge307XHJcbiAgbG9nb3V0TWljcm9BcHBPcHRpb246IHt9O1xyXG4gIGZldGNoQWNjZXNzVG9rZW5SZXNwb25zZTogKCkgPT4gdm9pZDtcclxuICBzZXRMb2dpbk1pY3JvQXBwT3B0aW9uOiAoKSA9PiB2b2lkO1xyXG4gIHNldExvZ291dE1pY3JvQXBwT3B0aW9uOiAoKSA9PiB2b2lkO1xyXG59O1xyXG5cclxudHlwZSBTZXJ2aWNlUHJvdmlkZXJQcm9wcyA9IHtcclxuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFBhcnRpYWw8U2VydmljZUNvbnRleHRQcm9wcz4+KHt9KTtcclxuXHJcbmNvbnN0IHVzZVNlcnZpY2UgPSAoKTogYW55ID0+IHtcclxuICBjb25zdCB7IGluc3RhbmNlIH0gPSB1c2VNc2FsKCk7XHJcbiAgY29uc3QgW3NlcnZpY2UsIHNldFNlcnZpY2VdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IFtzaGVsbFRva2VuUmVzcG9uc2VEYXRhLCBzZXRTaGVsbFRva2VuUmVzcG9uc2VEYXRhXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbZGVmYXVsdFNlcnZpY2VBcHBSZW1vdGVOYW1lLCBzZXREZWZhdWx0U2VydmljZUFwcFJlbW90ZU5hbWVdID1cclxuICAgIHVzZVN0YXRlPGFueT4oJycpO1xyXG4gIGNvbnN0IFtpZHBQcm92aWRlciwgc2V0SWRwUHJvdmlkZXJdID0gdXNlU3RhdGU8YW55PignJyk7XHJcbiAgY29uc3QgW3JiYWMsIHNldFJCQUNdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IFtjbGllbnRDb2RlLCBzZXRDbGllbnRDb2RlXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbbG9naW5NaWNyb0FwcE9wdGlvbiwgc2V0TG9naW5NaWNyb0FwcE9wdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW2xvZ291dE1pY3JvQXBwT3B0aW9uLCBzZXRMb2dvdXRNaWNyb0FwcE9wdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcblxyXG4gIGNvbnN0IGZldGNoTWljcm9zb2Z0QURUb2tlbiA9IGFzeW5jICgpID0+IHtcclxuICAgIGxldCBtc2FsVG9rZW5SZXNwb25zZTogYW55O1xyXG4gICAgY29uc3QgY3VycmVudEFjY291bnQgPSBpbnN0YW5jZS5nZXRBY3RpdmVBY2NvdW50KCk7XHJcbiAgICBjb25zdCBhY2Nlc3NUb2tlblJlcXVlc3Q6IGFueSA9IHtcclxuICAgICAgc2NvcGVzOiBtc2FsTG9naW5SZXF1ZXN0LnNjb3BlcyxcclxuICAgICAgYWNjb3VudDogY3VycmVudEFjY291bnQsXHJcbiAgICAgIHJlZnJlc2hUb2tlbkV4cGlyYXRpb25PZmZzZXRTZWNvbmRzOiBgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfTVNBTF9UT0tFTkVYUElSQVRJT05USU1FfWAsXHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgbXNhbFRva2VuUmVzcG9uc2UgPSBhd2FpdCBpbnN0YW5jZS5hY3F1aXJlVG9rZW5TaWxlbnQoYWNjZXNzVG9rZW5SZXF1ZXN0KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcikge1xyXG4gICAgICAgIG1zYWxUb2tlblJlc3BvbnNlID0gYXdhaXQgaW5zdGFuY2UuYWNxdWlyZVRva2VuUmVkaXJlY3QoXHJcbiAgICAgICAgICBhY2Nlc3NUb2tlblJlcXVlc3QsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1zYWxUb2tlblJlc3BvbnNlO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGZldGNoQWNjZXNzVG9rZW5SZXNwb25zZSA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xyXG4gICAgbGV0IHJlZnJlc2hlZFRva2VuUmVzcG9uc2U6IGFueTtcclxuICAgIGxldCBjdXJyZW50SWRwUHJvdmlkZXJOYW1lID0gZ2V0Q3VycmVudElkcFByb3ZpZGVyKCk7XHJcbiAgICBzd2l0Y2ggKGN1cnJlbnRJZHBQcm92aWRlck5hbWUpIHtcclxuICAgICAgY2FzZSBJZHBQcm92aWRlck9wdGlvbi5GT1JHRV9ST0NLOlxyXG4gICAgICAgIHJlZnJlc2hlZFRva2VuUmVzcG9uc2UgPSBhd2FpdCBUb2tlblN0b3JhZ2UuZ2V0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgSWRwUHJvdmlkZXJPcHRpb24uS0VZX0NMT0FLOlxyXG4gICAgICAgIGNvbnN0IGtleUNsb2FrSW5zdGFuY2VEYXRhID0gKHdpbmRvdyBhcyBhbnkpLmtleUNsb2FrSW5zdGFuY2U7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAga2V5Q2xvYWtJbnN0YW5jZURhdGEgJiZcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGtleUNsb2FrSW5zdGFuY2VEYXRhKT8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAga2V5Q2xvYWtJbnN0YW5jZURhdGEuYXV0aGVudGljYXRlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmVmcmVzaGVkVG9rZW5SZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW46ICcnLFxyXG4gICAgICAgICAgICBpZFRva2VuOiBrZXlDbG9ha0luc3RhbmNlRGF0YT8uaWRUb2tlbixcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIElkcFByb3ZpZGVyT3B0aW9uLk1JQ1JPU09GVDpcclxuICAgICAgICBsZXQgbWljcm9zb2Z0QWRUb2tlbiA9IGF3YWl0IGZldGNoTWljcm9zb2Z0QURUb2tlbigpO1xyXG4gICAgICAgIHJlZnJlc2hlZFRva2VuUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogbWljcm9zb2Z0QWRUb2tlbj8uYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICBpZFRva2VuOiBtaWNyb3NvZnRBZFRva2VuPy5pZFRva2VuLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmcmVzaGVkVG9rZW5SZXNwb25zZTtcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLi4uc2VydmljZSxcclxuICAgIHNldFNlcnZpY2UsXHJcbiAgICByYmFjLFxyXG4gICAgZGVmYXVsdFNlcnZpY2VBcHBSZW1vdGVOYW1lLFxyXG4gICAgc2V0RGVmYXVsdFNlcnZpY2VBcHBSZW1vdGVOYW1lLFxyXG4gICAgc2hlbGxUb2tlblJlc3BvbnNlRGF0YSxcclxuICAgIHNldFNoZWxsVG9rZW5SZXNwb25zZURhdGEsXHJcbiAgICBpZHBQcm92aWRlcixcclxuICAgIHNldElkcFByb3ZpZGVyLFxyXG4gICAgc2V0UkJBQyxcclxuICAgIGNsaWVudENvZGUsXHJcbiAgICBzZXRDbGllbnRDb2RlLFxyXG4gICAgbG9naW5NaWNyb0FwcE9wdGlvbixcclxuICAgIGZldGNoQWNjZXNzVG9rZW5SZXNwb25zZSxcclxuICAgIGxvZ291dE1pY3JvQXBwT3B0aW9uLFxyXG4gICAgc2V0TG9naW5NaWNyb0FwcE9wdGlvbixcclxuICAgIHNldExvZ291dE1pY3JvQXBwT3B0aW9uLFxyXG4gICAgc2hlbGxTb3VyY2U6IFNoZWxsU291cmNlXHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IHVzZVNlcnZpY2VDb250ZXh0ID0gKCk6IGFueSA9PiB7XHJcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29udGV4dCk7XHJcblxyXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgJ1NlcnZpY2VDb250ZXh0IHZhbHVlIGlzIHVuZGVmaW5lZC4gTWFrZSBzdXJlIHlvdSB1c2UgdGhlIFNlcnZpY2VQcm92aWRlciBiZWZvcmUgdXNpbmcgdGhlIGNvbnRleHQuJyxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29udGV4dDtcclxufTtcclxuXHJcbmNvbnN0IFNlcnZpY2VQcm92aWRlciA9ICh7IGNoaWxkcmVuIH06IFNlcnZpY2VQcm92aWRlclByb3BzKTogUmVhY3RFbGVtZW50ID0+IHtcclxuICBjb25zdCB2YWx1ZSA9IHVzZVNlcnZpY2UoKTtcclxuXHJcbiAgcmV0dXJuIDxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvQ29udGV4dC5Qcm92aWRlcj47XHJcbn07XHJcblxyXG5leHBvcnQgeyB1c2VTZXJ2aWNlQ29udGV4dCwgU2VydmljZVByb3ZpZGVyIH07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64082\n')},64126:(I,g,n)=>{"use strict";I.exports=n.p+"dd6abe2b727b32a706d6.png"},64202:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQyMDIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcz8zOTM0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICB2YXIgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///64202\n")},64226:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Welsh [cy]\n//! author : Robert Allen : https://github.com/robgallen\n//! author : https://github.com/ryangreaves\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var cy = moment.defineLocale('cy', {\n months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(\n '_'\n ),\n monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(\n '_'\n ),\n weekdays:\n 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(\n '_'\n ),\n weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),\n weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),\n weekdaysParseExact: true,\n // time formats are the same as en-gb\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Heddiw am] LT',\n nextDay: '[Yfory am] LT',\n nextWeek: 'dddd [am] LT',\n lastDay: '[Ddoe am] LT',\n lastWeek: 'dddd [diwethaf am] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'mewn %s',\n past: '%s yn ôl',\n s: 'ychydig eiliadau',\n ss: '%d eiliad',\n m: 'munud',\n mm: '%d munud',\n h: 'awr',\n hh: '%d awr',\n d: 'diwrnod',\n dd: '%d diwrnod',\n M: 'mis',\n MM: '%d mis',\n y: 'blwyddyn',\n yy: '%d flynedd',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,\n // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh\n ordinal: function (number) {\n var b = number,\n output = '',\n lookup = [\n '',\n 'af',\n 'il',\n 'ydd',\n 'ydd',\n 'ed',\n 'ed',\n 'ed',\n 'fed',\n 'fed',\n 'fed', // 1af to 10fed\n 'eg',\n 'fed',\n 'eg',\n 'eg',\n 'fed',\n 'eg',\n 'eg',\n 'fed',\n 'eg',\n 'fed', // 11eg to 20fed\n ];\n if (b > 20) {\n if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {\n output = 'fed'; // not 30ain, 70ain or 90ain\n } else {\n output = 'ain';\n }\n } else if (b > 0) {\n output = lookup[b];\n }\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return cy;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQyMjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanM/OTc5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogV2Vsc2ggW2N5XVxuLy8hIGF1dGhvciA6IFJvYmVydCBBbGxlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JnYWxsZW5cbi8vISBhdXRob3IgOiBodHRwczovL2dpdGh1Yi5jb20vcnlhbmdyZWF2ZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N5Jywge1xuICAgICAgICBtb250aHM6ICdJb25hd3JfQ2h3ZWZyb3JfTWF3cnRoX0VicmlsbF9NYWlfTWVoZWZpbl9Hb3JmZmVubmFmX0F3c3RfTWVkaV9IeWRyZWZfVGFjaHdlZGRfUmhhZ2Z5cicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdJb25fQ2h3ZV9NYXdfRWJyX01haV9NZWhfR29yX0F3c19NZWRfSHlkX1RhY2hfUmhhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnRHlkZCBTdWxfRHlkZCBMbHVuX0R5ZGQgTWF3cnRoX0R5ZGQgTWVyY2hlcl9EeWRkIElhdV9EeWRkIEd3ZW5lcl9EeWRkIFNhZHdybicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VsX0xsdW5fTWF3X01lcl9JYXVfR3dlX1NhZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9MbF9NYV9NZV9JYV9Hd19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICAvLyB0aW1lIGZvcm1hdHMgYXJlIHRoZSBzYW1lIGFzIGVuLWdiXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGVkZGl3IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1lmb3J5IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0Rkb2UgYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGl3ZXRoYWYgYW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbWV3biAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeW4gw7RsJyxcbiAgICAgICAgICAgIHM6ICd5Y2h5ZGlnIGVpbGlhZGF1JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZWlsaWFkJyxcbiAgICAgICAgICAgIG06ICdtdW51ZCcsXG4gICAgICAgICAgICBtbTogJyVkIG11bnVkJyxcbiAgICAgICAgICAgIGg6ICdhd3InLFxuICAgICAgICAgICAgaGg6ICclZCBhd3InLFxuICAgICAgICAgICAgZDogJ2Rpd3Jub2QnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaXdybm9kJyxcbiAgICAgICAgICAgIE06ICdtaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtaXMnLFxuICAgICAgICAgICAgeTogJ2Jsd3lkZHluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgZmx5bmVkZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShmZWR8YWlufGFmfGlsfHlkZHxlZHxlZykvLFxuICAgICAgICAvLyB0cmFkaXRpb25hbCBvcmRpbmFsIG51bWJlcnMgYWJvdmUgMzEgYXJlIG5vdCBjb21tb25seSB1c2VkIGluIGNvbGxvcXVpYWwgV2Vsc2hcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgbG9va3VwID0gW1xuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FmJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lsJyxcbiAgICAgICAgICAgICAgICAgICAgJ3lkZCcsXG4gICAgICAgICAgICAgICAgICAgICd5ZGQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLCAvLyAxYWYgdG8gMTBmZWRcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsIC8vIDExZWcgdG8gMjBmZWRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGIgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSA0MCB8fCBiID09PSA1MCB8fCBiID09PSA2MCB8fCBiID09PSA4MCB8fCBiID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2ZlZCc7IC8vIG5vdCAzMGFpbiwgNzBhaW4gb3IgOTBhaW5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbG9va3VwW2JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGN5O1xuXG59KSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///64226\n")},64490:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar utils = __webpack_require__(9516);\nvar transformData = __webpack_require__(82881);\nvar isCancel = __webpack_require__(93864);\nvar defaults = __webpack_require__(37412);\nvar Cancel = __webpack_require__(31928);\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new Cancel('canceled');\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ0OTAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzUyNzAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xudmFyIGlzQ2FuY2VsID0gcmVxdWlyZSgnLi4vY2FuY2VsL2lzQ2FuY2VsJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWwoJ2NhbmNlbGVkJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64490\n")},64634:module=>{eval("module.exports = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ2MzQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcz9lM2RiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64634\n")},64671:(I,g,n)=>{"use strict";I.exports=n.p+"184f5cbe48406458ce4d.png"},64725:(I,g,n)=>{"use strict";I.exports=n.p+"4555440164553b2b7b2c.png"},64730:(I,g,n)=>{"use strict";I.exports=n.p+"5ae7fe82b1fe396f3a2e.png"},64993:(I,g,n)=>{"use strict";I.exports=n.p+"0c8661527df9882280fe.png"},65222:(I,g,n)=>{"use strict";I.exports=n.p+"33790431ab14cc36037d.png"},65291:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar ERR_INVALID_OPT_VALUE = (__webpack_require__(86048)/* .codes */ .F).ERR_INVALID_OPT_VALUE;\nfunction highWaterMarkFrom(options, isDuplex, duplexKey) {\n return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;\n}\nfunction getHighWaterMark(state, options, duplexKey, isDuplex) {\n var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);\n if (hwm != null) {\n if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {\n var name = isDuplex ? duplexKey : 'highWaterMark';\n throw new ERR_INVALID_OPT_VALUE(name, hwm);\n }\n return Math.floor(hwm);\n }\n\n // Default value\n return state.objectMode ? 16 : 16 * 1024;\n}\nmodule.exports = {\n getHighWaterMark: getHighWaterMark\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUyOTEuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RhdGUuanM/MGRiNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBFUlJfSU5WQUxJRF9PUFRfVkFMVUUgPSByZXF1aXJlKCcuLi8uLi8uLi9lcnJvcnMnKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7XG5mdW5jdGlvbiBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KSB7XG4gIHJldHVybiBvcHRpb25zLmhpZ2hXYXRlck1hcmsgIT0gbnVsbCA/IG9wdGlvbnMuaGlnaFdhdGVyTWFyayA6IGlzRHVwbGV4ID8gb3B0aW9uc1tkdXBsZXhLZXldIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsIG9wdGlvbnMsIGR1cGxleEtleSwgaXNEdXBsZXgpIHtcbiAgdmFyIGh3bSA9IGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsIGlzRHVwbGV4LCBkdXBsZXhLZXkpO1xuICBpZiAoaHdtICE9IG51bGwpIHtcbiAgICBpZiAoIShpc0Zpbml0ZShod20pICYmIE1hdGguZmxvb3IoaHdtKSA9PT0gaHdtKSB8fCBod20gPCAwKSB7XG4gICAgICB2YXIgbmFtZSA9IGlzRHVwbGV4ID8gZHVwbGV4S2V5IDogJ2hpZ2hXYXRlck1hcmsnO1xuICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX09QVF9WQUxVRShuYW1lLCBod20pO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5mbG9vcihod20pO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB2YWx1ZVxuICByZXR1cm4gc3RhdGUub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEhpZ2hXYXRlck1hcms6IGdldEhpZ2hXYXRlck1hcmtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///65291\n")},65311:(I,g,n)=>{"use strict";I.exports=n.p+"9e159bc3e6e671e47849.png"},65474:(I,g,n)=>{"use strict";I.exports=n.p+"f1f0fceb903374af7451.png"},65543:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (Israel) [en-il]\n//! author : Chris Gedrim : https://github.com/chrisgedrim\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enIl = moment.defineLocale('en-il', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n });\n\n return enIl;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU1NDMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzPzczMzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKElzcmFlbCkgW2VuLWlsXVxuLy8hIGF1dGhvciA6IENocmlzIEdlZHJpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2dlZHJpbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pbCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JbDtcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///65543\n")},65731:(module,__unused_webpack_exports,__webpack_require__)=>{eval("module.exports = __webpack_require__(34297);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU3MzEuanMiLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9oZWFwL2luZGV4LmpzPzE3NWEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9oZWFwJyk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///65731\n")},65748:(I,g,n)=>{"use strict";I.exports=n.p+"1b39044bea18fc287c65.png"},65780:(I,g,n)=>{"use strict";I.exports=n.p+"4d6e8b6c2959406cca40.png"},65813:(I,g,n)=>{"use strict";I.exports=n.p+"4a4940fc8483aae087ef.png"},66160:(I,g,n)=>{"use strict";I.exports=n.p+"29ce1018b6cfb33b4df9.png"},66207:(I,g,n)=>{"use strict";I.exports=n.p+"8a01be9a88e7526c875e.png"},66584:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : English (Ireland) [en-ie]\n//! author : Chris Cartlidge : https://github.com/chriscartlidge\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var enIe = moment.defineLocale('en-ie', {\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n '_'\n ),\n monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(\n '_'\n ),\n weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(st|nd|rd|th)/,\n ordinal: function (number) {\n var b = number % 10,\n output =\n ~~((number % 100) / 10) === 1\n ? 'th'\n : b === 1\n ? 'st'\n : b === 2\n ? 'nd'\n : b === 3\n ? 'rd'\n : 'th';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return enIe;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY1ODQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanM/ZTFkMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSXJlbGFuZCkgW2VuLWllXVxuLy8hIGF1dGhvciA6IENocmlzIENhcnRsaWRnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2NhcnRsaWRnZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSWUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pZScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSWU7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///66584\n")},66615:(I,g,n)=>{"use strict";I.exports=n.p+"d71f59756ff0e9f2ef95.png"},66772:(I,g,n)=>{"use strict";I.exports=n.p+"4be5c30d4375f69b3c03.png"},67526:(__unused_webpack_module,exports)=>{"use strict";eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjc1MjYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzPzFmYjUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///67526\n")},67527:(I,g,n)=>{"use strict";I.exports=n.p+"158e653bfc9b04f218fb.png"},67573:(I,g,n)=>{"use strict";I.exports=n.p+"5338cf3c5836cace3c19.png"},68732:(I,g,n)=>{"use strict";I.exports=n.p+"cfc23a4de95ff1554734.png"},68806:(I,g,n)=>{"use strict";I.exports=n.p+"6ed9a9e54a11dc82b51c.png"},69012:module=>{"use strict";eval("\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkwMTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2JpbmQuanM/MWQyYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69012\n")},69183:(I,g,n)=>{"use strict";I.exports=n.p+"52f016e3fe437d51ddf9.png"},69330:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Occitan, lengadocian dialecte [oc-lnc]\n//! author : Quentin PAGÈS : https://github.com/Quenty31\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var ocLnc = moment.defineLocale('oc-lnc', {\n months: {\n standalone:\n 'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(\n '_'\n ),\n format: \"de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre\".split(\n '_'\n ),\n isFormat: /D[oD]?(\\s)+MMMM/,\n },\n monthsShort:\n 'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(\n '_'\n ),\n monthsParseExact: true,\n weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(\n '_'\n ),\n weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),\n weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'H:mm',\n LTS: 'H:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM [de] YYYY',\n ll: 'D MMM YYYY',\n LLL: 'D MMMM [de] YYYY [a] H:mm',\n lll: 'D MMM YYYY, H:mm',\n LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',\n llll: 'ddd D MMM YYYY, H:mm',\n },\n calendar: {\n sameDay: '[uèi a] LT',\n nextDay: '[deman a] LT',\n nextWeek: 'dddd [a] LT',\n lastDay: '[ièr a] LT',\n lastWeek: 'dddd [passat a] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: \"d'aquí %s\",\n past: 'fa %s',\n s: 'unas segondas',\n ss: '%d segondas',\n m: 'una minuta',\n mm: '%d minutas',\n h: 'una ora',\n hh: '%d oras',\n d: 'un jorn',\n dd: '%d jorns',\n M: 'un mes',\n MM: '%d meses',\n y: 'un an',\n yy: '%d ans',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(r|n|t|è|a)/,\n ordinal: function (number, period) {\n var output =\n number === 1\n ? 'r'\n : number === 2\n ? 'n'\n : number === 3\n ? 'r'\n : number === 4\n ? 't'\n : 'è';\n if (period === 'w' || period === 'W') {\n output = 'a';\n }\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4,\n },\n });\n\n return ocLnc;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkzMzAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL29jLWxuYy5qcz8xNjdiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZSBbb2MtbG5jXVxuLy8hIGF1dGhvciA6IFF1ZW50aW4gUEFHw4hTIDogaHR0cHM6Ly9naXRodWIuY29tL1F1ZW50eTMxXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgb2NMbmMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdvYy1sbmMnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnZ2VuacOocl9mZWJyacOocl9tYXLDp19hYnJpbF9tYWlfanVuaF9qdWxoZXRfYWdvc3Rfc2V0ZW1icmVfb2N0w7JicmVfbm92ZW1icmVfZGVjZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiBcImRlIGdlbmnDqHJfZGUgZmVicmnDqHJfZGUgbWFyw6dfZCdhYnJpbF9kZSBtYWlfZGUganVuaF9kZSBqdWxoZXRfZCdhZ29zdF9kZSBzZXRlbWJyZV9kJ29jdMOyYnJlX2RlIG5vdmVtYnJlX2RlIGRlY2VtYnJlXCIuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnZ2VuLl9mZWJyLl9tYXLDp19hYnIuX21haV9qdW5oX2p1bGguX2Fnby5fc2V0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWVuZ2VfZGlsdW5zX2RpbWFyc19kaW3DqGNyZXNfZGlqw7J1c19kaXZlbmRyZXNfZGlzc2FidGUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkZy5fZGwuX2RtLl9kYy5fZGouX2R2Ll9kcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGdfZGxfZG1fZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtkZV0gWVlZWSBbYV0gSDptbScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBbZGVdIFlZWVkgW2FdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCBEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdcOoaSBhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2RlbWFuIGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpw6hyIGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbcGFzc2F0IGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBcImQnYXF1w60gJXNcIixcbiAgICAgICAgICAgIHBhc3Q6ICdmYSAlcycsXG4gICAgICAgICAgICBzOiAndW5hcyBzZWdvbmRhcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ29uZGFzJyxcbiAgICAgICAgICAgIG06ICd1bmEgbWludXRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRhcycsXG4gICAgICAgICAgICBoOiAndW5hIG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvcm4nLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3JucycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBudW1iZXIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICA/ICduJ1xuICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnw6gnO1xuICAgICAgICAgICAgaWYgKHBlcmlvZCA9PT0gJ3cnIHx8IHBlcmlvZCA9PT0gJ1cnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBvY0xuYztcblxufSkpKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///69330\n")},69341:(I,g,n)=>{"use strict";I.exports=n.p+"26e4e35c44b27e22adaa.png"},69532:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Latvian [lv]\n//! author : Kristaps Karlsons : https://github.com/skakri\n//! author : Jānis Elmeris : https://github.com/JanisE\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var units = {\n ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),\n m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),\n h: 'stundas_stundām_stunda_stundas'.split('_'),\n hh: 'stundas_stundām_stunda_stundas'.split('_'),\n d: 'dienas_dienām_diena_dienas'.split('_'),\n dd: 'dienas_dienām_diena_dienas'.split('_'),\n M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),\n y: 'gada_gadiem_gads_gadi'.split('_'),\n yy: 'gada_gadiem_gads_gadi'.split('_'),\n };\n /**\n * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.\n */\n function format(forms, number, withoutSuffix) {\n if (withoutSuffix) {\n // E.g. \"21 minūte\", \"3 minūtes\".\n return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];\n } else {\n // E.g. \"21 minūtes\" as in \"pēc 21 minūtes\".\n // E.g. \"3 minūtēm\" as in \"pēc 3 minūtēm\".\n return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];\n }\n }\n function relativeTimeWithPlural(number, withoutSuffix, key) {\n return number + ' ' + format(units[key], number, withoutSuffix);\n }\n function relativeTimeWithSingular(number, withoutSuffix, key) {\n return format(units[key], number, withoutSuffix);\n }\n function relativeSeconds(number, withoutSuffix) {\n return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';\n }\n\n var lv = moment.defineLocale('lv', {\n months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(\n '_'\n ),\n monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),\n weekdays:\n 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(\n '_'\n ),\n weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),\n weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),\n weekdaysParseExact: true,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD.MM.YYYY.',\n LL: 'YYYY. [gada] D. MMMM',\n LLL: 'YYYY. [gada] D. MMMM, HH:mm',\n LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',\n },\n calendar: {\n sameDay: '[Šodien pulksten] LT',\n nextDay: '[Rīt pulksten] LT',\n nextWeek: 'dddd [pulksten] LT',\n lastDay: '[Vakar pulksten] LT',\n lastWeek: '[Pagājušā] dddd [pulksten] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'pēc %s',\n past: 'pirms %s',\n s: relativeSeconds,\n ss: relativeTimeWithPlural,\n m: relativeTimeWithSingular,\n mm: relativeTimeWithPlural,\n h: relativeTimeWithSingular,\n hh: relativeTimeWithPlural,\n d: relativeTimeWithSingular,\n dd: relativeTimeWithPlural,\n M: relativeTimeWithSingular,\n MM: relativeTimeWithPlural,\n y: relativeTimeWithSingular,\n yy: relativeTimeWithPlural,\n },\n dayOfMonthOrdinalParse: /\\d{1,2}\\./,\n ordinal: '%d.',\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return lv;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk1MzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzP2I5N2MiXSwic291cmNlc0NvbnRlbnQiOlsiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IExhdHZpYW4gW2x2XVxuLy8hIGF1dGhvciA6IEtyaXN0YXBzIEthcmxzb25zIDogaHR0cHM6Ly9naXRodWIuY29tL3NrYWtyaVxuLy8hIGF1dGhvciA6IErEgW5pcyBFbG1lcmlzIDogaHR0cHM6Ly9naXRodWIuY29tL0phbmlzRVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVuaXRzID0ge1xuICAgICAgICBzczogJ3Nla3VuZGVzX3Nla3VuZMSTbV9zZWt1bmRlX3Nla3VuZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBtOiAnbWluxat0ZXNfbWluxat0xJNtX21pbsWrdGVfbWluxat0ZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1tOiAnbWluxat0ZXNfbWluxat0xJNtX21pbsWrdGVfbWluxat0ZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGg6ICdzdHVuZGFzX3N0dW5kxIFtX3N0dW5kYV9zdHVuZGFzJy5zcGxpdCgnXycpLFxuICAgICAgICBoaDogJ3N0dW5kYXNfc3R1bmTEgW1fc3R1bmRhX3N0dW5kYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGQ6ICdkaWVuYXNfZGllbsSBbV9kaWVuYV9kaWVuYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGRkOiAnZGllbmFzX2RpZW7EgW1fZGllbmFfZGllbmFzJy5zcGxpdCgnXycpLFxuICAgICAgICBNOiAnbcSTbmXFoWFfbcSTbmXFoWllbV9txJNuZXNpc19txJNuZcWhaScuc3BsaXQoJ18nKSxcbiAgICAgICAgTU06ICdtxJNuZcWhYV9txJNuZcWhaWVtX23Ek25lc2lzX23Ek25lxaFpJy5zcGxpdCgnXycpLFxuICAgICAgICB5OiAnZ2FkYV9nYWRpZW1fZ2Fkc19nYWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB5eTogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB3aXRob3V0U3VmZml4IGJvb2xlYW4gdHJ1ZSA9IGEgbGVuZ3RoIG9mIHRpbWU7IGZhbHNlID0gYmVmb3JlL2FmdGVyIGEgcGVyaW9kIG9mIHRpbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ybWF0KGZvcm1zLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIC8vIEUuZy4gXCIyMSBtaW7Fq3RlXCIsIFwiMyBtaW7Fq3Rlc1wiLlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxICYmIG51bWJlciAlIDEwMCAhPT0gMTEgPyBmb3Jtc1syXSA6IGZvcm1zWzNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRS5nLiBcIjIxIG1pbsWrdGVzXCIgYXMgaW4gXCJwxJNjIDIxIG1pbsWrdGVzXCIuXG4gICAgICAgICAgICAvLyBFLmcuIFwiMyBtaW7Fq3TEk21cIiBhcyBpbiBcInDEk2MgMyBtaW7Fq3TEk21cIi5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgJSAxMDAgIT09IDExID8gZm9ybXNbMF0gOiBmb3Jtc1sxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBmb3JtYXQodW5pdHNba2V5XSwgbnVtYmVyLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodW5pdHNba2V5XSwgbnVtYmVyLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdkYcW+YXMgc2VrdW5kZXMnIDogJ2Rhxb7EgW0gc2VrdW5kxJNtJztcbiAgICB9XG5cbiAgICB2YXIgbHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudsSBcmlzX2ZlYnJ1xIFyaXNfbWFydHNfYXByxKtsaXNfbWFpanNfasWrbmlqc19qxatsaWpzX2F1Z3VzdHNfc2VwdGVtYnJpc19va3RvYnJpc19ub3ZlbWJyaXNfZGVjZW1icmlzJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWlfasWrbl9qxatsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N2xJN0ZGllbmFfcGlybWRpZW5hX290cmRpZW5hX3RyZcWhZGllbmFfY2V0dXJ0ZGllbmFfcGlla3RkaWVuYV9zZXN0ZGllbmEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdl9QX09fVF9DX1BrX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVkuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgZGRkZCwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vFoG9kaWVuIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1LEq3QgcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbVmFrYXIgcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW1BhZ8SBanXFocSBXSBkZGRkIFtwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwxJNjICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwaXJtcyAlcycsXG4gICAgICAgICAgICBzOiByZWxhdGl2ZVNlY29uZHMsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbHY7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///69532\n")},69903:(I,g,n)=>{"use strict";I.exports=n.p+"77fa7d88df546421e207.png"},69982:(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nif (true) {\n module.exports = __webpack_require__(7463);\n} else // removed by dead control flow\n{}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjk5ODIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzPzQwMjkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///69982\n")},70019:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(63009), __webpack_require__(51025));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var SHA256 = C_algo.SHA256;\n\t var HMAC = C_algo.HMAC;\n\n\t /**\n\t * Password-Based Key Derivation Function 2 algorithm.\n\t */\n\t var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hasher to use. Default: SHA256\n\t * @property {number} iterations The number of iterations to perform. Default: 250000\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: SHA256,\n\t iterations: 250000\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.PBKDF2.create();\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init HMAC\n\t var hmac = HMAC.create(cfg.hasher, password);\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\t var blockIndex = WordArray.create([0x00000001]);\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var blockIndexWords = blockIndex.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t var block = hmac.update(salt).finalize(blockIndex);\n\t hmac.reset();\n\n\t // Shortcuts\n\t var blockWords = block.words;\n\t var blockWordsLength = blockWords.length;\n\n\t // Iterations\n\t var intermediate = block;\n\t for (var i = 1; i < iterations; i++) {\n\t intermediate = hmac.finalize(intermediate);\n\t hmac.reset();\n\n\t // Shortcut\n\t var intermediateWords = intermediate.words;\n\n\t // XOR intermediate with block\n\t for (var j = 0; j < blockWordsLength; j++) {\n\t blockWords[j] ^= intermediateWords[j];\n\t }\n\t }\n\n\t derivedKey.concat(block);\n\t blockIndexWords[0]++;\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Computes the Password-Based Key Derivation Function 2.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.PBKDF2(password, salt);\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.PBKDF2 = function (password, salt, cfg) {\n\t return PBKDF2.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.PBKDF2;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAwMTkuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGctbmV4dGdlbi1mcm9udGVuZC8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvcGJrZGYyLmpzPzdiYmMiXSwic291cmNlc0NvbnRlbnQiOlsiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL3NoYTI1NlwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGEyNTZcIiwgXCIuL2htYWNcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIFNIQTI1NiA9IENfYWxnby5TSEEyNTY7XG5cdCAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFBhc3N3b3JkLUJhc2VkIEtleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIDIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgUEJLREYyID0gQ19hbGdvLlBCS0RGMiA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UuIERlZmF1bHQ6IFNIQTI1NlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAyNTAwMDBcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXHQgICAgICAgICAgICBoYXNoZXI6IFNIQTI1Nixcblx0ICAgICAgICAgICAgaXRlcmF0aW9uczogMjUwMDAwXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBkZXJpdmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5QQktERjIuY3JlYXRlKCk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLlBCS0RGMi5jcmVhdGUoeyBrZXlTaXplOiA4IH0pO1xuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5QQktERjIuY3JlYXRlKHsga2V5U2l6ZTogOCwgaXRlcmF0aW9uczogMTAwMCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoY2ZnKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbXB1dGVzIHRoZSBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIga2V5ID0ga2RmLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNvbXB1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdCBITUFDXG5cdCAgICAgICAgICAgIHZhciBobWFjID0gSE1BQy5jcmVhdGUoY2ZnLmhhc2hlciwgcGFzc3dvcmQpO1xuXG5cdCAgICAgICAgICAgIC8vIEluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5ID0gV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tJbmRleCA9IFdvcmRBcnJheS5jcmVhdGUoWzB4MDAwMDAwMDFdKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXlXb3JkcyA9IGRlcml2ZWRLZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBibG9ja0luZGV4V29yZHMgPSBibG9ja0luZGV4LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGNmZy5rZXlTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXRlcmF0aW9ucyA9IGNmZy5pdGVyYXRpb25zO1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleVxuXHQgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBibG9jayA9IGhtYWMudXBkYXRlKHNhbHQpLmZpbmFsaXplKGJsb2NrSW5kZXgpO1xuXHQgICAgICAgICAgICAgICAgaG1hYy5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBibG9ja1dvcmRzID0gYmxvY2sud29yZHM7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tXb3Jkc0xlbmd0aCA9IGJsb2NrV29yZHMubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb25zXG5cdCAgICAgICAgICAgICAgICB2YXIgaW50ZXJtZWRpYXRlID0gYmxvY2s7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSA9IGhtYWMuZmluYWxpemUoaW50ZXJtZWRpYXRlKTtcblx0ICAgICAgICAgICAgICAgICAgICBobWFjLnJlc2V0KCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcm1lZGlhdGVXb3JkcyA9IGludGVybWVkaWF0ZS53b3JkcztcblxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFhPUiBpbnRlcm1lZGlhdGUgd2l0aCBibG9ja1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxvY2tXb3Jkc0xlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrV29yZHNbal0gXj0gaW50ZXJtZWRpYXRlV29yZHNbal07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBkZXJpdmVkS2V5LmNvbmNhdChibG9jayk7XG5cdCAgICAgICAgICAgICAgICBibG9ja0luZGV4V29yZHNbMF0rKztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkZXJpdmVkS2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlcml2ZWRLZXk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQ29tcHV0ZXMgdGhlIFBhc3N3b3JkLUJhc2VkIEtleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIDIuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIGNvbXB1dGF0aW9uLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuUEJLREYyKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuUEJLREYyKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDggfSk7XG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICovXG5cdCAgICBDLlBCS0RGMiA9IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCwgY2ZnKSB7XG5cdCAgICAgICAgcmV0dXJuIFBCS0RGMi5jcmVhdGUoY2ZnKS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgIH07XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuUEJLREYyO1xuXG59KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///70019\n")},70025:function(module,exports,__webpack_require__){eval(";(function (root, factory, undef) {\n\tif (true) {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(__webpack_require__(19021), __webpack_require__(57165));\n\t}\n\telse // removed by dead control flow\n{}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var CipherParams = C_lib.CipherParams;\n\t var C_enc = C.enc;\n\t var Hex = C_enc.Hex;\n\t var C_format = C.format;\n\n\t var HexFormatter = C_format.Hex = {\n\t /**\n\t * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The hexadecimally encoded string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t return cipherParams.ciphertext.toString(Hex);\n\t },\n\n\t /**\n\t * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t *\n\t * @param {string} input The hexadecimally encoded string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t */\n\t parse: function (input) {\n\t var ciphertext = Hex.parse(input);\n\t return CipherParams.create({ ciphertext: ciphertext });\n\t }\n\t };\n\t}());\n\n\n\treturn CryptoJS.format.Hex;\n\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAwMjUuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXRnLW5leHRnZW4tZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2Zvcm1hdC1oZXguanM/NmQwOCJdLCJzb3VyY2VzQ29udGVudCI6WyI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vY2lwaGVyLWNvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXM7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBIZXggPSBDX2VuYy5IZXg7XG5cdCAgICB2YXIgQ19mb3JtYXQgPSBDLmZvcm1hdDtcblxuXHQgICAgdmFyIEhleEZvcm1hdHRlciA9IENfZm9ybWF0LkhleCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGUgY2lwaGVydGV4dCBvZiBhIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgaGV4YWRlY2ltYWxseSBlbmNvZGVkIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4YWRlY2ltYWxseSBlbmNvZGVkIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmZvcm1hdC5IZXguc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBjaXBoZXJQYXJhbXMuY2lwaGVydGV4dC50b1N0cmluZyhIZXgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGhleGFkZWNpbWFsbHkgZW5jb2RlZCBjaXBoZXJ0ZXh0IHN0cmluZyB0byBhIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFRoZSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5mb3JtYXQuSGV4LnBhcnNlKGhleFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChpbnB1dCkge1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IEhleC5wYXJzZShpbnB1dCk7XG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dDogY2lwaGVydGV4dCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLmZvcm1hdC5IZXg7XG5cbn0pKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70025\n")},70217:function(__unused_webpack_module,__unused_webpack_exports,__webpack_require__){eval("//! moment.js locale configuration\n//! locale : Scottish Gaelic [gd]\n//! author : Jon Ashdown : https://github.com/jonashdown\n\n;(function (global, factory) {\n true ? factory(__webpack_require__(95093)) :\n 0\n}(this, (function (moment) { 'use strict';\n\n //! moment.js locale configuration\n\n var months = [\n 'Am Faoilleach',\n 'An Gearran',\n 'Am Màrt',\n 'An Giblean',\n 'An Cèitean',\n 'An t-Ògmhios',\n 'An t-Iuchar',\n 'An Lùnastal',\n 'An t-Sultain',\n 'An Dàmhair',\n 'An t-Samhain',\n 'An Dùbhlachd',\n ],\n monthsShort = [\n 'Faoi',\n 'Gear',\n 'Màrt',\n 'Gibl',\n 'Cèit',\n 'Ògmh',\n 'Iuch',\n 'Lùn',\n 'Sult',\n 'Dàmh',\n 'Samh',\n 'Dùbh',\n ],\n weekdays = [\n 'Didòmhnaich',\n 'Diluain',\n 'Dimàirt',\n 'Diciadain',\n 'Diardaoin',\n 'Dihaoine',\n 'Disathairne',\n ],\n weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],\n weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];\n\n var gd = moment.defineLocale('gd', {\n months: months,\n monthsShort: monthsShort,\n monthsParseExact: true,\n weekdays: weekdays,\n weekdaysShort: weekdaysShort,\n weekdaysMin: weekdaysMin,\n longDateFormat: {\n LT: 'HH:mm',\n LTS: 'HH:mm:ss',\n L: 'DD/MM/YYYY',\n LL: 'D MMMM YYYY',\n LLL: 'D MMMM YYYY HH:mm',\n LLLL: 'dddd, D MMMM YYYY HH:mm',\n },\n calendar: {\n sameDay: '[An-diugh aig] LT',\n nextDay: '[A-màireach aig] LT',\n nextWeek: 'dddd [aig] LT',\n lastDay: '[An-dè aig] LT',\n lastWeek: 'dddd [seo chaidh] [aig] LT',\n sameElse: 'L',\n },\n relativeTime: {\n future: 'ann an %s',\n past: 'bho chionn %s',\n s: 'beagan diogan',\n ss: '%d diogan',\n m: 'mionaid',\n mm: '%d mionaidean',\n h: 'uair',\n hh: '%d uairean',\n d: 'latha',\n dd: '%d latha',\n M: 'mìos',\n MM: '%d mìosan',\n y: 'bliadhna',\n yy: '%d bliadhna',\n },\n dayOfMonthOrdinalParse: /\\d{1,2}(d|na|mh)/,\n ordinal: function (number) {\n var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';\n return number + output;\n },\n week: {\n dow: 1, // Monday is the first day of the week.\n doy: 4, // The week that contains Jan 4th is the first week of the year.\n },\n });\n\n return gd;\n\n})));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAyMTcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2QuanM/ZjZiNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2NvdHRpc2ggR2FlbGljIFtnZF1cbi8vISBhdXRob3IgOiBKb24gQXNoZG93biA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb25hc2hkb3duXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ0FtIEZhb2lsbGVhY2gnLFxuICAgICAgICAgICAgJ0FuIEdlYXJyYW4nLFxuICAgICAgICAgICAgJ0FtIE3DoHJ0JyxcbiAgICAgICAgICAgICdBbiBHaWJsZWFuJyxcbiAgICAgICAgICAgICdBbiBDw6hpdGVhbicsXG4gICAgICAgICAgICAnQW4gdC3DkmdtaGlvcycsXG4gICAgICAgICAgICAnQW4gdC1JdWNoYXInLFxuICAgICAgICAgICAgJ0FuIEzDuW5hc3RhbCcsXG4gICAgICAgICAgICAnQW4gdC1TdWx0YWluJyxcbiAgICAgICAgICAgICdBbiBEw6BtaGFpcicsXG4gICAgICAgICAgICAnQW4gdC1TYW1oYWluJyxcbiAgICAgICAgICAgICdBbiBEw7liaGxhY2hkJyxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSBbXG4gICAgICAgICAgICAnRmFvaScsXG4gICAgICAgICAgICAnR2VhcicsXG4gICAgICAgICAgICAnTcOgcnQnLFxuICAgICAgICAgICAgJ0dpYmwnLFxuICAgICAgICAgICAgJ0PDqGl0JyxcbiAgICAgICAgICAgICfDkmdtaCcsXG4gICAgICAgICAgICAnSXVjaCcsXG4gICAgICAgICAgICAnTMO5bicsXG4gICAgICAgICAgICAnU3VsdCcsXG4gICAgICAgICAgICAnRMOgbWgnLFxuICAgICAgICAgICAgJ1NhbWgnLFxuICAgICAgICAgICAgJ0TDuWJoJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAnRGlkw7JtaG5haWNoJyxcbiAgICAgICAgICAgICdEaWx1YWluJyxcbiAgICAgICAgICAgICdEaW3DoGlydCcsXG4gICAgICAgICAgICAnRGljaWFkYWluJyxcbiAgICAgICAgICAgICdEaWFyZGFvaW4nLFxuICAgICAgICAgICAgJ0RpaGFvaW5lJyxcbiAgICAgICAgICAgICdEaXNhdGhhaXJuZScsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgPSBbJ0RpZCcsICdEaWwnLCAnRGltJywgJ0RpYycsICdEaWEnLCAnRGloJywgJ0RpcyddLFxuICAgICAgICB3ZWVrZGF5c01pbiA9IFsnRMOyJywgJ0x1JywgJ03DoCcsICdDaScsICdBcicsICdIYScsICdTYSddO1xuXG4gICAgdmFyIGdkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2QnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXNTaG9ydCxcbiAgICAgICAgd2Vla2RheXNNaW46IHdlZWtkYXlzTWluLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0FuLWRpdWdoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBLW3DoGlyZWFjaCBhaWddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0FuLWTDqCBhaWddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VvIGNoYWlkaF0gW2FpZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdhbm4gYW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2JobyBjaGlvbm4gJXMnLFxuICAgICAgICAgICAgczogJ2JlYWdhbiBkaW9nYW4nLFxuICAgICAgICAgICAgc3M6ICclZCBkaW9nYW4nLFxuICAgICAgICAgICAgbTogJ21pb25haWQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW9uYWlkZWFuJyxcbiAgICAgICAgICAgIGg6ICd1YWlyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdWFpcmVhbicsXG4gICAgICAgICAgICBkOiAnbGF0aGEnLFxuICAgICAgICAgICAgZGQ6ICclZCBsYXRoYScsXG4gICAgICAgICAgICBNOiAnbcOsb3MnLFxuICAgICAgICAgICAgTU06ICclZCBtw6xvc2FuJyxcbiAgICAgICAgICAgIHk6ICdibGlhZGhuYScsXG4gICAgICAgICAgICB5eTogJyVkIGJsaWFkaG5hJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGR8bmF8bWgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2Q7XG5cbn0pKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70217\n")},70359:(I,g,n)=>{"use strict";I.exports=n.p+"116dab06b8b40c3608bf.png"},70867:(I,g,n)=>{"use strict";I.exports=n.p+"e95861171d1e1568d509.png"},71312:(module,exports,__webpack_require__)=>{eval("var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * [js-sha256]{@link https://github.com/emn178/js-sha256}\n *\n * @version 0.11.1\n * @author Chen, Yi-Cyuan [emn178@gmail.com]\n * @copyright Chen, Yi-Cyuan 2014-2025\n * @license MIT\n */\n/*jslint bitwise: true */\n(function () {\n 'use strict';\n\n var ERROR = 'input is invalid type';\n var WINDOW = typeof window === 'object';\n var root = WINDOW ? window : {};\n if (root.JS_SHA256_NO_WINDOW) {\n WINDOW = false;\n }\n var WEB_WORKER = !WINDOW && typeof self === 'object';\n var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node && process.type != 'renderer';\n if (NODE_JS) {\n root = __webpack_require__.g;\n } else if (WEB_WORKER) {\n root = self;\n }\n var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && \"object\" === 'object' && module.exports;\n var AMD = true && __webpack_require__.amdO;\n var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';\n var HEX_CHARS = '0123456789abcdef'.split('');\n var EXTRA = [-2147483648, 8388608, 32768, 128];\n var SHIFT = [24, 16, 8, 0];\n var K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n ];\n var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];\n\n var blocks = [];\n\n if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {\n Array.isArray = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n }\n\n if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n ArrayBuffer.isView = function (obj) {\n return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n };\n }\n\n var createOutputMethod = function (outputType, is224) {\n return function (message) {\n return new Sha256(is224, true).update(message)[outputType]();\n };\n };\n\n var createMethod = function (is224) {\n var method = createOutputMethod('hex', is224);\n if (NODE_JS) {\n method = nodeWrap(method, is224);\n }\n method.create = function () {\n return new Sha256(is224);\n };\n method.update = function (message) {\n return method.create().update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createOutputMethod(type, is224);\n }\n return method;\n };\n\n var nodeWrap = function (method, is224) {\n var crypto = __webpack_require__(28145)\n var Buffer = (__webpack_require__(12075).Buffer);\n var algorithm = is224 ? 'sha224' : 'sha256';\n var bufferFrom;\n if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {\n bufferFrom = Buffer.from;\n } else {\n bufferFrom = function (message) {\n return new Buffer(message);\n };\n }\n var nodeMethod = function (message) {\n if (typeof message === 'string') {\n return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');\n } else {\n if (message === null || message === undefined) {\n throw new Error(ERROR);\n } else if (message.constructor === ArrayBuffer) {\n message = new Uint8Array(message);\n }\n }\n if (Array.isArray(message) || ArrayBuffer.isView(message) ||\n message.constructor === Buffer) {\n return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');\n } else {\n return method(message);\n }\n };\n return nodeMethod;\n };\n\n var createHmacOutputMethod = function (outputType, is224) {\n return function (key, message) {\n return new HmacSha256(key, is224, true).update(message)[outputType]();\n };\n };\n\n var createHmacMethod = function (is224) {\n var method = createHmacOutputMethod('hex', is224);\n method.create = function (key) {\n return new HmacSha256(key, is224);\n };\n method.update = function (key, message) {\n return method.create(key).update(message);\n };\n for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n var type = OUTPUT_TYPES[i];\n method[type] = createHmacOutputMethod(type, is224);\n }\n return method;\n };\n\n function Sha256(is224, sharedMemory) {\n if (sharedMemory) {\n blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n this.blocks = blocks;\n } else {\n this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n }\n\n if (is224) {\n this.h0 = 0xc1059ed8;\n this.h1 = 0x367cd507;\n this.h2 = 0x3070dd17;\n this.h3 = 0xf70e5939;\n this.h4 = 0xffc00b31;\n this.h5 = 0x68581511;\n this.h6 = 0x64f98fa7;\n this.h7 = 0xbefa4fa4;\n } else { // 256\n this.h0 = 0x6a09e667;\n this.h1 = 0xbb67ae85;\n this.h2 = 0x3c6ef372;\n this.h3 = 0xa54ff53a;\n this.h4 = 0x510e527f;\n this.h5 = 0x9b05688c;\n this.h6 = 0x1f83d9ab;\n this.h7 = 0x5be0cd19;\n }\n\n this.block = this.start = this.bytes = this.hBytes = 0;\n this.finalized = this.hashed = false;\n this.first = true;\n this.is224 = is224;\n }\n\n Sha256.prototype.update = function (message) {\n if (this.finalized) {\n return;\n }\n var notString, type = typeof message;\n if (type !== 'string') {\n if (type === 'object') {\n if (message === null) {\n throw new Error(ERROR);\n } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n message = new Uint8Array(message);\n } else if (!Array.isArray(message)) {\n if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n throw new Error(ERROR);\n }\n }\n } else {\n throw new Error(ERROR);\n }\n notString = true;\n }\n var code, index = 0, i, length = message.length, blocks = this.blocks;\n while (index < length) {\n if (this.hashed) {\n this.hashed = false;\n blocks[0] = this.block;\n this.block = blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n\n if (notString) {\n for (i = this.start; index < length && i < 64; ++index) {\n blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];\n }\n } else {\n for (i = this.start; index < length && i < 64; ++index) {\n code = message.charCodeAt(index);\n if (code < 0x80) {\n blocks[i >>> 2] |= code << SHIFT[i++ & 3];\n } else if (code < 0x800) {\n blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else if (code < 0xd800 || code >= 0xe000) {\n blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];\n blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n }\n }\n }\n\n this.lastByteIndex = i;\n this.bytes += i - this.start;\n if (i >= 64) {\n this.block = blocks[16];\n this.start = i - 64;\n this.hash();\n this.hashed = true;\n } else {\n this.start = i;\n }\n }\n if (this.bytes > 4294967295) {\n this.hBytes += this.bytes / 4294967296 << 0;\n this.bytes = this.bytes % 4294967296;\n }\n return this;\n };\n\n Sha256.prototype.finalize = function () {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n var blocks = this.blocks, i = this.lastByteIndex;\n blocks[16] = this.block;\n blocks[i >>> 2] |= EXTRA[i & 3];\n this.block = blocks[16];\n if (i >= 56) {\n if (!this.hashed) {\n this.hash();\n }\n blocks[0] = this.block;\n blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n }\n blocks[14] = this.hBytes << 3 | this.bytes >>> 29;\n blocks[15] = this.bytes << 3;\n this.hash();\n };\n\n Sha256.prototype.hash = function () {\n var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,\n h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;\n\n for (j = 16; j < 64; ++j) {\n // rightrotate\n t1 = blocks[j - 15];\n s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);\n t1 = blocks[j - 2];\n s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);\n blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;\n }\n\n bc = b & c;\n for (j = 0; j < 64; j += 4) {\n if (this.first) {\n if (this.is224) {\n ab = 300032;\n t1 = blocks[0] - 1413257819;\n h = t1 - 150054599 << 0;\n d = t1 + 24177077 << 0;\n } else {\n ab = 704751109;\n t1 = blocks[0] - 210244248;\n h = t1 - 1521486534 << 0;\n d = t1 + 143694565 << 0;\n }\n this.first = false;\n } else {\n s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n ab = a & b;\n maj = ab ^ (a & c) ^ bc;\n ch = (e & f) ^ (~e & g);\n t1 = h + s1 + ch + K[j] + blocks[j];\n t2 = s0 + maj;\n h = d + t1 << 0;\n d = t1 + t2 << 0;\n }\n s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));\n s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));\n da = d & a;\n maj = da ^ (d & b) ^ ab;\n ch = (h & e) ^ (~h & f);\n t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];\n t2 = s0 + maj;\n g = c + t1 << 0;\n c = t1 + t2 << 0;\n s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));\n s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));\n cd = c & d;\n maj = cd ^ (c & a) ^ da;\n ch = (g & h) ^ (~g & e);\n t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];\n t2 = s0 + maj;\n f = b + t1 << 0;\n b = t1 + t2 << 0;\n s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));\n s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));\n bc = b & c;\n maj = bc ^ (b & d) ^ cd;\n ch = (f & g) ^ (~f & h);\n t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];\n t2 = s0 + maj;\n e = a + t1 << 0;\n a = t1 + t2 << 0;\n this.chromeBugWorkAround = true;\n }\n\n this.h0 = this.h0 + a << 0;\n this.h1 = this.h1 + b << 0;\n this.h2 = this.h2 + c << 0;\n this.h3 = this.h3 + d << 0;\n this.h4 = this.h4 + e << 0;\n this.h5 = this.h5 + f << 0;\n this.h6 = this.h6 + g << 0;\n this.h7 = this.h7 + h << 0;\n };\n\n Sha256.prototype.hex = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,\n h6 = this.h6, h7 = this.h7;\n\n var hex = HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +\n HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +\n HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +\n HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\n HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +\n HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +\n HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +\n HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\n HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +\n HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +\n HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +\n HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\n HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F] +\n HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +\n HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +\n HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\n HEX_CHARS[(h4 >>> 28) & 0x0F] + HEX_CHARS[(h4 >>> 24) & 0x0F] +\n HEX_CHARS[(h4 >>> 20) & 0x0F] + HEX_CHARS[(h4 >>> 16) & 0x0F] +\n HEX_CHARS[(h4 >>> 12) & 0x0F] + HEX_CHARS[(h4 >>> 8) & 0x0F] +\n HEX_CHARS[(h4 >>> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +\n HEX_CHARS[(h5 >>> 28) & 0x0F] + HEX_CHARS[(h5 >>> 24) & 0x0F] +\n HEX_CHARS[(h5 >>> 20) & 0x0F] + HEX_CHARS[(h5 >>> 16) & 0x0F] +\n HEX_CHARS[(h5 >>> 12) & 0x0F] + HEX_CHARS[(h5 >>> 8) & 0x0F] +\n HEX_CHARS[(h5 >>> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +\n HEX_CHARS[(h6 >>> 28) & 0x0F] + HEX_CHARS[(h6 >>> 24) & 0x0F] +\n HEX_CHARS[(h6 >>> 20) & 0x0F] + HEX_CHARS[(h6 >>> 16) & 0x0F] +\n HEX_CHARS[(h6 >>> 12) & 0x0F] + HEX_CHARS[(h6 >>> 8) & 0x0F] +\n HEX_CHARS[(h6 >>> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];\n if (!this.is224) {\n hex += HEX_CHARS[(h7 >>> 28) & 0x0F] + HEX_CHARS[(h7 >>> 24) & 0x0F] +\n HEX_CHARS[(h7 >>> 20) & 0x0F] + HEX_CHARS[(h7 >>> 16) & 0x0F] +\n HEX_CHARS[(h7 >>> 12) & 0x0F] + HEX_CHARS[(h7 >>> 8) & 0x0F] +\n HEX_CHARS[(h7 >>> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];\n }\n return hex;\n };\n\n Sha256.prototype.toString = Sha256.prototype.hex;\n\n Sha256.prototype.digest = function () {\n this.finalize();\n\n var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,\n h6 = this.h6, h7 = this.h7;\n\n var arr = [\n (h0 >>> 24) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 8) & 0xFF, h0 & 0xFF,\n (h1 >>> 24) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 8) & 0xFF, h1 & 0xFF,\n (h2 >>> 24) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 8) & 0xFF, h2 & 0xFF,\n (h3 >>> 24) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 8) & 0xFF, h3 & 0xFF,\n (h4 >>> 24) & 0xFF, (h4 >>> 16) & 0xFF, (h4 >>> 8) & 0xFF, h4 & 0xFF,\n (h5 >>> 24) & 0xFF, (h5 >>> 16) & 0xFF, (h5 >>> 8) & 0xFF, h5 & 0xFF,\n (h6 >>> 24) & 0xFF, (h6 >>> 16) & 0xFF, (h6 >>> 8) & 0xFF, h6 & 0xFF\n ];\n if (!this.is224) {\n arr.push((h7 >>> 24) & 0xFF, (h7 >>> 16) & 0xFF, (h7 >>> 8) & 0xFF, h7 & 0xFF);\n }\n return arr;\n };\n\n Sha256.prototype.array = Sha256.prototype.digest;\n\n Sha256.prototype.arrayBuffer = function () {\n this.finalize();\n\n var buffer = new ArrayBuffer(this.is224 ? 28 : 32);\n var dataView = new DataView(buffer);\n dataView.setUint32(0, this.h0);\n dataView.setUint32(4, this.h1);\n dataView.setUint32(8, this.h2);\n dataView.setUint32(12, this.h3);\n dataView.setUint32(16, this.h4);\n dataView.setUint32(20, this.h5);\n dataView.setUint32(24, this.h6);\n if (!this.is224) {\n dataView.setUint32(28, this.h7);\n }\n return buffer;\n };\n\n function HmacSha256(key, is224, sharedMemory) {\n var i, type = typeof key;\n if (type === 'string') {\n var bytes = [], length = key.length, index = 0, code;\n for (i = 0; i < length; ++i) {\n code = key.charCodeAt(i);\n if (code < 0x80) {\n bytes[index++] = code;\n } else if (code < 0x800) {\n bytes[index++] = (0xc0 | (code >>> 6));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else if (code < 0xd800 || code >= 0xe000) {\n bytes[index++] = (0xe0 | (code >>> 12));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n } else {\n code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));\n bytes[index++] = (0xf0 | (code >>> 18));\n bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));\n bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));\n bytes[index++] = (0x80 | (code & 0x3f));\n }\n }\n key = bytes;\n } else {\n if (type === 'object') {\n if (key === null) {\n throw new Error(ERROR);\n } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {\n key = new Uint8Array(key);\n } else if (!Array.isArray(key)) {\n if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {\n throw new Error(ERROR);\n }\n }\n } else {\n throw new Error(ERROR);\n }\n }\n\n if (key.length > 64) {\n key = (new Sha256(is224, true)).update(key).array();\n }\n\n var oKeyPad = [], iKeyPad = [];\n for (i = 0; i < 64; ++i) {\n var b = key[i] || 0;\n oKeyPad[i] = 0x5c ^ b;\n iKeyPad[i] = 0x36 ^ b;\n }\n\n Sha256.call(this, is224, sharedMemory);\n\n this.update(iKeyPad);\n this.oKeyPad = oKeyPad;\n this.inner = true;\n this.sharedMemory = sharedMemory;\n }\n HmacSha256.prototype = new Sha256();\n\n HmacSha256.prototype.finalize = function () {\n Sha256.prototype.finalize.call(this);\n if (this.inner) {\n this.inner = false;\n var innerHash = this.array();\n Sha256.call(this, this.is224, this.sharedMemory);\n this.update(this.oKeyPad);\n this.update(innerHash);\n Sha256.prototype.finalize.call(this);\n }\n };\n\n var exports = createMethod();\n exports.sha256 = exports;\n exports.sha224 = createMethod(true);\n exports.sha256.hmac = createHmacMethod();\n exports.sha224.hmac = createHmacMethod(true);\n\n if (COMMON_JS) {\n module.exports = exports;\n } else {\n root.sha256 = exports.sha256;\n root.sha224 = exports.sha224;\n if (AMD) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return exports;\n }).call(exports, __webpack_require__, exports, module),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n }\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEzMTIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2l0Zy1uZXh0Z2VuLWZyb250ZW5kLy4vbm9kZV9tb2R1bGVzL2pzLXNoYTI1Ni9zcmMvc2hhMjU2LmpzPzZjMjciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBbanMtc2hhMjU2XXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTI1Nn1cbiAqXG4gKiBAdmVyc2lvbiAwLjExLjFcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTQtMjAyNVxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbi8qanNsaW50IGJpdHdpc2U6IHRydWUgKi9cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgRVJST1IgPSAnaW5wdXQgaXMgaW52YWxpZCB0eXBlJztcbiAgdmFyIFdJTkRPVyA9IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnO1xuICB2YXIgcm9vdCA9IFdJTkRPVyA/IHdpbmRvdyA6IHt9O1xuICBpZiAocm9vdC5KU19TSEEyNTZfTk9fV0lORE9XKSB7XG4gICAgV0lORE9XID0gZmFsc2U7XG4gIH1cbiAgdmFyIFdFQl9XT1JLRVIgPSAhV0lORE9XICYmIHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JztcbiAgdmFyIE5PREVfSlMgPSAhcm9vdC5KU19TSEEyNTZfTk9fTk9ERV9KUyAmJiB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgJiYgcHJvY2Vzcy50eXBlICE9ICdyZW5kZXJlcic7XG4gIGlmIChOT0RFX0pTKSB7XG4gICAgcm9vdCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChXRUJfV09SS0VSKSB7XG4gICAgcm9vdCA9IHNlbGY7XG4gIH1cbiAgdmFyIENPTU1PTl9KUyA9ICFyb290LkpTX1NIQTI1Nl9OT19DT01NT05fSlMgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHM7XG4gIHZhciBBTUQgPSB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQ7XG4gIHZhciBBUlJBWV9CVUZGRVIgPSAhcm9vdC5KU19TSEEyNTZfTk9fQVJSQVlfQlVGRkVSICYmIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG4gIHZhciBIRVhfQ0hBUlMgPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xuICB2YXIgRVhUUkEgPSBbLTIxNDc0ODM2NDgsIDgzODg2MDgsIDMyNzY4LCAxMjhdO1xuICB2YXIgU0hJRlQgPSBbMjQsIDE2LCA4LCAwXTtcbiAgdmFyIEsgPSBbXG4gICAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLCAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAgIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gICAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLCAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAgIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gICAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LCAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG4gIF07XG4gIHZhciBPVVRQVVRfVFlQRVMgPSBbJ2hleCcsICdhcnJheScsICdkaWdlc3QnLCAnYXJyYXlCdWZmZXInXTtcblxuICB2YXIgYmxvY2tzID0gW107XG5cbiAgaWYgKHJvb3QuSlNfU0hBMjU2X05PX05PREVfSlMgfHwgIUFycmF5LmlzQXJyYXkpIHtcbiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH07XG4gIH1cblxuICBpZiAoQVJSQVlfQlVGRkVSICYmIChyb290LkpTX1NIQTI1Nl9OT19BUlJBWV9CVUZGRVJfSVNfVklFVyB8fCAhQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIEFycmF5QnVmZmVyLmlzVmlldyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmouYnVmZmVyICYmIG9iai5idWZmZXIuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyO1xuICAgIH07XG4gIH1cblxuICB2YXIgY3JlYXRlT3V0cHV0TWV0aG9kID0gZnVuY3Rpb24gKG91dHB1dFR5cGUsIGlzMjI0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbmV3IFNoYTI1NihpczIyNCwgdHJ1ZSkudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKGlzMjI0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGNyZWF0ZU91dHB1dE1ldGhvZCgnaGV4JywgaXMyMjQpO1xuICAgIGlmIChOT0RFX0pTKSB7XG4gICAgICBtZXRob2QgPSBub2RlV3JhcChtZXRob2QsIGlzMjI0KTtcbiAgICB9XG4gICAgbWV0aG9kLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBuZXcgU2hhMjU2KGlzMjI0KTtcbiAgICB9O1xuICAgIG1ldGhvZC51cGRhdGUgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5jcmVhdGUoKS51cGRhdGUobWVzc2FnZSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE9VVFBVVF9UWVBFUy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHR5cGUgPSBPVVRQVVRfVFlQRVNbaV07XG4gICAgICBtZXRob2RbdHlwZV0gPSBjcmVhdGVPdXRwdXRNZXRob2QodHlwZSwgaXMyMjQpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0aG9kO1xuICB9O1xuXG4gIHZhciBub2RlV3JhcCA9IGZ1bmN0aW9uIChtZXRob2QsIGlzMjI0KSB7XG4gICAgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG4gICAgdmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgICB2YXIgYWxnb3JpdGhtID0gaXMyMjQgPyAnc2hhMjI0JyA6ICdzaGEyNTYnO1xuICAgIHZhciBidWZmZXJGcm9tO1xuICAgIGlmIChCdWZmZXIuZnJvbSAmJiAhcm9vdC5KU19TSEEyNTZfTk9fQlVGRkVSX0ZST00pIHtcbiAgICAgIGJ1ZmZlckZyb20gPSBCdWZmZXIuZnJvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyRnJvbSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKG1lc3NhZ2UpO1xuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG5vZGVNZXRob2QgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtKS51cGRhdGUobWVzc2FnZSwgJ3V0ZjgnKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SKTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZSkgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KG1lc3NhZ2UpIHx8XG4gICAgICAgIG1lc3NhZ2UuY29uc3RydWN0b3IgPT09IEJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtKS51cGRhdGUoYnVmZmVyRnJvbShtZXNzYWdlKSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtZXRob2QobWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gbm9kZU1ldGhvZDtcbiAgfTtcblxuICB2YXIgY3JlYXRlSG1hY091dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChvdXRwdXRUeXBlLCBpczIyNCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCBtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbmV3IEhtYWNTaGEyNTYoa2V5LCBpczIyNCwgdHJ1ZSkudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XG4gICAgfTtcbiAgfTtcblxuICB2YXIgY3JlYXRlSG1hY01ldGhvZCA9IGZ1bmN0aW9uIChpczIyNCkge1xuICAgIHZhciBtZXRob2QgPSBjcmVhdGVIbWFjT3V0cHV0TWV0aG9kKCdoZXgnLCBpczIyNCk7XG4gICAgbWV0aG9kLmNyZWF0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBuZXcgSG1hY1NoYTI1NihrZXksIGlzMjI0KTtcbiAgICB9O1xuICAgIG1ldGhvZC51cGRhdGUgPSBmdW5jdGlvbiAoa2V5LCBtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbWV0aG9kLmNyZWF0ZShrZXkpLnVwZGF0ZShtZXNzYWdlKTtcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgT1VUUFVUX1RZUEVTLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgdHlwZSA9IE9VVFBVVF9UWVBFU1tpXTtcbiAgICAgIG1ldGhvZFt0eXBlXSA9IGNyZWF0ZUhtYWNPdXRwdXRNZXRob2QodHlwZSwgaXMyMjQpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0aG9kO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFNoYTI1NihpczIyNCwgc2hhcmVkTWVtb3J5KSB7XG4gICAgaWYgKHNoYXJlZE1lbW9yeSkge1xuICAgICAgYmxvY2tzWzBdID0gYmxvY2tzWzE2XSA9IGJsb2Nrc1sxXSA9IGJsb2Nrc1syXSA9IGJsb2Nrc1szXSA9XG4gICAgICAgIGJsb2Nrc1s0XSA9IGJsb2Nrc1s1XSA9IGJsb2Nrc1s2XSA9IGJsb2Nrc1s3XSA9XG4gICAgICAgIGJsb2Nrc1s4XSA9IGJsb2Nrc1s5XSA9IGJsb2Nrc1sxMF0gPSBibG9ja3NbMTFdID1cbiAgICAgICAgYmxvY2tzWzEyXSA9IGJsb2Nrc1sxM10gPSBibG9ja3NbMTRdID0gYmxvY2tzWzE1XSA9IDA7XG4gICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ibG9ja3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgfVxuXG4gICAgaWYgKGlzMjI0KSB7XG4gICAgICB0aGlzLmgwID0gMHhjMTA1OWVkODtcbiAgICAgIHRoaXMuaDEgPSAweDM2N2NkNTA3O1xuICAgICAgdGhpcy5oMiA9IDB4MzA3MGRkMTc7XG4gICAgICB0aGlzLmgzID0gMHhmNzBlNTkzOTtcbiAgICAgIHRoaXMuaDQgPSAweGZmYzAwYjMxO1xuICAgICAgdGhpcy5oNSA9IDB4Njg1ODE1MTE7XG4gICAgICB0aGlzLmg2ID0gMHg2NGY5OGZhNztcbiAgICAgIHRoaXMuaDcgPSAweGJlZmE0ZmE0O1xuICAgIH0gZWxzZSB7IC8vIDI1NlxuICAgICAgdGhpcy5oMCA9IDB4NmEwOWU2Njc7XG4gICAgICB0aGlzLmgxID0gMHhiYjY3YWU4NTtcbiAgICAgIHRoaXMuaDIgPSAweDNjNmVmMzcyO1xuICAgICAgdGhpcy5oMyA9IDB4YTU0ZmY1M2E7XG4gICAgICB0aGlzLmg0ID0gMHg1MTBlNTI3ZjtcbiAgICAgIHRoaXMuaDUgPSAweDliMDU2ODhjO1xuICAgICAgdGhpcy5oNiA9IDB4MWY4M2Q5YWI7XG4gICAgICB0aGlzLmg3ID0gMHg1YmUwY2QxOTtcbiAgICB9XG5cbiAgICB0aGlzLmJsb2NrID0gdGhpcy5zdGFydCA9IHRoaXMuYnl0ZXMgPSB0aGlzLmhCeXRlcyA9IDA7XG4gICAgdGhpcy5maW5hbGl6ZWQgPSB0aGlzLmhhc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuZmlyc3QgPSB0cnVlO1xuICAgIHRoaXMuaXMyMjQgPSBpczIyNDtcbiAgfVxuXG4gIFNoYTI1Ni5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5vdFN0cmluZywgdHlwZSA9IHR5cGVvZiBtZXNzYWdlO1xuICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SKTtcbiAgICAgICAgfSBlbHNlIGlmIChBUlJBWV9CVUZGRVIgJiYgbWVzc2FnZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICBtZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZSkpIHtcbiAgICAgICAgICBpZiAoIUFSUkFZX0JVRkZFUiB8fCAhQXJyYXlCdWZmZXIuaXNWaWV3KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SKTtcbiAgICAgIH1cbiAgICAgIG5vdFN0cmluZyA9IHRydWU7XG4gICAgfVxuICAgIHZhciBjb2RlLCBpbmRleCA9IDAsIGksIGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoLCBibG9ja3MgPSB0aGlzLmJsb2NrcztcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmhhc2hlZCkge1xuICAgICAgICB0aGlzLmhhc2hlZCA9IGZhbHNlO1xuICAgICAgICBibG9ja3NbMF0gPSB0aGlzLmJsb2NrO1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2tzWzE2XSA9IGJsb2Nrc1sxXSA9IGJsb2Nrc1syXSA9IGJsb2Nrc1szXSA9XG4gICAgICAgICAgYmxvY2tzWzRdID0gYmxvY2tzWzVdID0gYmxvY2tzWzZdID0gYmxvY2tzWzddID1cbiAgICAgICAgICBibG9ja3NbOF0gPSBibG9ja3NbOV0gPSBibG9ja3NbMTBdID0gYmxvY2tzWzExXSA9XG4gICAgICAgICAgYmxvY2tzWzEyXSA9IGJsb2Nrc1sxM10gPSBibG9ja3NbMTRdID0gYmxvY2tzWzE1XSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChub3RTdHJpbmcpIHtcbiAgICAgICAgZm9yIChpID0gdGhpcy5zdGFydDsgaW5kZXggPCBsZW5ndGggJiYgaSA8IDY0OyArK2luZGV4KSB7XG4gICAgICAgICAgYmxvY2tzW2kgPj4+IDJdIHw9IG1lc3NhZ2VbaW5kZXhdIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSB0aGlzLnN0YXJ0OyBpbmRleCA8IGxlbmd0aCAmJiBpIDwgNjQ7ICsraW5kZXgpIHtcbiAgICAgICAgICBjb2RlID0gbWVzc2FnZS5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICBpZiAoY29kZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+PiAyXSB8PSBjb2RlIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA8IDB4ODAwKSB7XG4gICAgICAgICAgICBibG9ja3NbaSA+Pj4gMl0gfD0gKDB4YzAgfCAoY29kZSA+Pj4gNikpIDw8IFNISUZUW2krKyAmIDNdO1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4+IDJdIHw9ICgweDgwIHwgKGNvZGUgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgMHhkODAwIHx8IGNvZGUgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICBibG9ja3NbaSA+Pj4gMl0gfD0gKDB4ZTAgfCAoY29kZSA+Pj4gMTIpKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+Pj4gNikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+Pj4gMl0gfD0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZSA9IDB4MTAwMDAgKyAoKChjb2RlICYgMHgzZmYpIDw8IDEwKSB8IChtZXNzYWdlLmNoYXJDb2RlQXQoKytpbmRleCkgJiAweDNmZikpO1xuICAgICAgICAgICAgYmxvY2tzW2kgPj4+IDJdIHw9ICgweGYwIHwgKGNvZGUgPj4+IDE4KSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+Pj4gMl0gfD0gKDB4ODAgfCAoKGNvZGUgPj4+IDEyKSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+Pj4gNikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XG4gICAgICAgICAgICBibG9ja3NbaSA+Pj4gMl0gfD0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXN0Qnl0ZUluZGV4ID0gaTtcbiAgICAgIHRoaXMuYnl0ZXMgKz0gaSAtIHRoaXMuc3RhcnQ7XG4gICAgICBpZiAoaSA+PSA2NCkge1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2tzWzE2XTtcbiAgICAgICAgdGhpcy5zdGFydCA9IGkgLSA2NDtcbiAgICAgICAgdGhpcy5oYXNoKCk7XG4gICAgICAgIHRoaXMuaGFzaGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5ieXRlcyA+IDQyOTQ5NjcyOTUpIHtcbiAgICAgIHRoaXMuaEJ5dGVzICs9IHRoaXMuYnl0ZXMgLyA0Mjk0OTY3Mjk2IDw8IDA7XG4gICAgICB0aGlzLmJ5dGVzID0gdGhpcy5ieXRlcyAlIDQyOTQ5NjcyOTY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIFNoYTI1Ni5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluYWxpemVkID0gdHJ1ZTtcbiAgICB2YXIgYmxvY2tzID0gdGhpcy5ibG9ja3MsIGkgPSB0aGlzLmxhc3RCeXRlSW5kZXg7XG4gICAgYmxvY2tzWzE2XSA9IHRoaXMuYmxvY2s7XG4gICAgYmxvY2tzW2kgPj4+IDJdIHw9IEVYVFJBW2kgJiAzXTtcbiAgICB0aGlzLmJsb2NrID0gYmxvY2tzWzE2XTtcbiAgICBpZiAoaSA+PSA1Nikge1xuICAgICAgaWYgKCF0aGlzLmhhc2hlZCkge1xuICAgICAgICB0aGlzLmhhc2goKTtcbiAgICAgIH1cbiAgICAgIGJsb2Nrc1swXSA9IHRoaXMuYmxvY2s7XG4gICAgICBibG9ja3NbMTZdID0gYmxvY2tzWzFdID0gYmxvY2tzWzJdID0gYmxvY2tzWzNdID1cbiAgICAgICAgYmxvY2tzWzRdID0gYmxvY2tzWzVdID0gYmxvY2tzWzZdID0gYmxvY2tzWzddID1cbiAgICAgICAgYmxvY2tzWzhdID0gYmxvY2tzWzldID0gYmxvY2tzWzEwXSA9IGJsb2Nrc1sxMV0gPVxuICAgICAgICBibG9ja3NbMTJdID0gYmxvY2tzWzEzXSA9IGJsb2Nrc1sxNF0gPSBibG9ja3NbMTVdID0gMDtcbiAgICB9XG4gICAgYmxvY2tzWzE0XSA9IHRoaXMuaEJ5dGVzIDw8IDMgfCB0aGlzLmJ5dGVzID4+PiAyOTtcbiAgICBibG9ja3NbMTVdID0gdGhpcy5ieXRlcyA8PCAzO1xuICAgIHRoaXMuaGFzaCgpO1xuICB9O1xuXG4gIFNoYTI1Ni5wcm90b3R5cGUuaGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHRoaXMuaDAsIGIgPSB0aGlzLmgxLCBjID0gdGhpcy5oMiwgZCA9IHRoaXMuaDMsIGUgPSB0aGlzLmg0LCBmID0gdGhpcy5oNSwgZyA9IHRoaXMuaDYsXG4gICAgICBoID0gdGhpcy5oNywgYmxvY2tzID0gdGhpcy5ibG9ja3MsIGosIHMwLCBzMSwgbWFqLCB0MSwgdDIsIGNoLCBhYiwgZGEsIGNkLCBiYztcblxuICAgIGZvciAoaiA9IDE2OyBqIDwgNjQ7ICsraikge1xuICAgICAgLy8gcmlnaHRyb3RhdGVcbiAgICAgIHQxID0gYmxvY2tzW2ogLSAxNV07XG4gICAgICBzMCA9ICgodDEgPj4+IDcpIHwgKHQxIDw8IDI1KSkgXiAoKHQxID4+PiAxOCkgfCAodDEgPDwgMTQpKSBeICh0MSA+Pj4gMyk7XG4gICAgICB0MSA9IGJsb2Nrc1tqIC0gMl07XG4gICAgICBzMSA9ICgodDEgPj4+IDE3KSB8ICh0MSA8PCAxNSkpIF4gKCh0MSA+Pj4gMTkpIHwgKHQxIDw8IDEzKSkgXiAodDEgPj4+IDEwKTtcbiAgICAgIGJsb2Nrc1tqXSA9IGJsb2Nrc1tqIC0gMTZdICsgczAgKyBibG9ja3NbaiAtIDddICsgczEgPDwgMDtcbiAgICB9XG5cbiAgICBiYyA9IGIgJiBjO1xuICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaiArPSA0KSB7XG4gICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICBpZiAodGhpcy5pczIyNCkge1xuICAgICAgICAgIGFiID0gMzAwMDMyO1xuICAgICAgICAgIHQxID0gYmxvY2tzWzBdIC0gMTQxMzI1NzgxOTtcbiAgICAgICAgICBoID0gdDEgLSAxNTAwNTQ1OTkgPDwgMDtcbiAgICAgICAgICBkID0gdDEgKyAyNDE3NzA3NyA8PCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFiID0gNzA0NzUxMTA5O1xuICAgICAgICAgIHQxID0gYmxvY2tzWzBdIC0gMjEwMjQ0MjQ4O1xuICAgICAgICAgIGggPSB0MSAtIDE1MjE0ODY1MzQgPDwgMDtcbiAgICAgICAgICBkID0gdDEgKyAxNDM2OTQ1NjUgPDwgMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0ID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9ICgoYSA+Pj4gMikgfCAoYSA8PCAzMCkpIF4gKChhID4+PiAxMykgfCAoYSA8PCAxOSkpIF4gKChhID4+PiAyMikgfCAoYSA8PCAxMCkpO1xuICAgICAgICBzMSA9ICgoZSA+Pj4gNikgfCAoZSA8PCAyNikpIF4gKChlID4+PiAxMSkgfCAoZSA8PCAyMSkpIF4gKChlID4+PiAyNSkgfCAoZSA8PCA3KSk7XG4gICAgICAgIGFiID0gYSAmIGI7XG4gICAgICAgIG1haiA9IGFiIF4gKGEgJiBjKSBeIGJjO1xuICAgICAgICBjaCA9IChlICYgZikgXiAofmUgJiBnKTtcbiAgICAgICAgdDEgPSBoICsgczEgKyBjaCArIEtbal0gKyBibG9ja3Nbal07XG4gICAgICAgIHQyID0gczAgKyBtYWo7XG4gICAgICAgIGggPSBkICsgdDEgPDwgMDtcbiAgICAgICAgZCA9IHQxICsgdDIgPDwgMDtcbiAgICAgIH1cbiAgICAgIHMwID0gKChkID4+PiAyKSB8IChkIDw8IDMwKSkgXiAoKGQgPj4+IDEzKSB8IChkIDw8IDE5KSkgXiAoKGQgPj4+IDIyKSB8IChkIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoaCA+Pj4gNikgfCAoaCA8PCAyNikpIF4gKChoID4+PiAxMSkgfCAoaCA8PCAyMSkpIF4gKChoID4+PiAyNSkgfCAoaCA8PCA3KSk7XG4gICAgICBkYSA9IGQgJiBhO1xuICAgICAgbWFqID0gZGEgXiAoZCAmIGIpIF4gYWI7XG4gICAgICBjaCA9IChoICYgZSkgXiAofmggJiBmKTtcbiAgICAgIHQxID0gZyArIHMxICsgY2ggKyBLW2ogKyAxXSArIGJsb2Nrc1tqICsgMV07XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZyA9IGMgKyB0MSA8PCAwO1xuICAgICAgYyA9IHQxICsgdDIgPDwgMDtcbiAgICAgIHMwID0gKChjID4+PiAyKSB8IChjIDw8IDMwKSkgXiAoKGMgPj4+IDEzKSB8IChjIDw8IDE5KSkgXiAoKGMgPj4+IDIyKSB8IChjIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoZyA+Pj4gNikgfCAoZyA8PCAyNikpIF4gKChnID4+PiAxMSkgfCAoZyA8PCAyMSkpIF4gKChnID4+PiAyNSkgfCAoZyA8PCA3KSk7XG4gICAgICBjZCA9IGMgJiBkO1xuICAgICAgbWFqID0gY2QgXiAoYyAmIGEpIF4gZGE7XG4gICAgICBjaCA9IChnICYgaCkgXiAofmcgJiBlKTtcbiAgICAgIHQxID0gZiArIHMxICsgY2ggKyBLW2ogKyAyXSArIGJsb2Nrc1tqICsgMl07XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZiA9IGIgKyB0MSA8PCAwO1xuICAgICAgYiA9IHQxICsgdDIgPDwgMDtcbiAgICAgIHMwID0gKChiID4+PiAyKSB8IChiIDw8IDMwKSkgXiAoKGIgPj4+IDEzKSB8IChiIDw8IDE5KSkgXiAoKGIgPj4+IDIyKSB8IChiIDw8IDEwKSk7XG4gICAgICBzMSA9ICgoZiA+Pj4gNikgfCAoZiA8PCAyNikpIF4gKChmID4+PiAxMSkgfCAoZiA8PCAyMSkpIF4gKChmID4+PiAyNSkgfCAoZiA8PCA3KSk7XG4gICAgICBiYyA9IGIgJiBjO1xuICAgICAgbWFqID0gYmMgXiAoYiAmIGQpIF4gY2Q7XG4gICAgICBjaCA9IChmICYgZykgXiAofmYgJiBoKTtcbiAgICAgIHQxID0gZSArIHMxICsgY2ggKyBLW2ogKyAzXSArIGJsb2Nrc1tqICsgM107XG4gICAgICB0MiA9IHMwICsgbWFqO1xuICAgICAgZSA9IGEgKyB0MSA8PCAwO1xuICAgICAgYSA9IHQxICsgdDIgPDwgMDtcbiAgICAgIHRoaXMuY2hyb21lQnVnV29ya0Fyb3VuZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5oMCA9IHRoaXMuaDAgKyBhIDw8IDA7XG4gICAgdGhpcy5oMSA9IHRoaXMuaDEgKyBiIDw8IDA7XG4gICAgdGhpcy5oMiA9IHRoaXMuaDIgKyBjIDw8IDA7XG4gICAgdGhpcy5oMyA9IHRoaXMuaDMgKyBkIDw8IDA7XG4gICAgdGhpcy5oNCA9IHRoaXMuaDQgKyBlIDw8IDA7XG4gICAgdGhpcy5oNSA9IHRoaXMuaDUgKyBmIDw8IDA7XG4gICAgdGhpcy5oNiA9IHRoaXMuaDYgKyBnIDw8IDA7XG4gICAgdGhpcy5oNyA9IHRoaXMuaDcgKyBoIDw8IDA7XG4gIH07XG5cbiAgU2hhMjU2LnByb3RvdHlwZS5oZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuXG4gICAgdmFyIGgwID0gdGhpcy5oMCwgaDEgPSB0aGlzLmgxLCBoMiA9IHRoaXMuaDIsIGgzID0gdGhpcy5oMywgaDQgPSB0aGlzLmg0LCBoNSA9IHRoaXMuaDUsXG4gICAgICBoNiA9IHRoaXMuaDYsIGg3ID0gdGhpcy5oNztcblxuICAgIHZhciBoZXggPSBIRVhfQ0hBUlNbKGgwID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDAgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDAgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMCA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMCA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgwID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDAgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDAgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgxID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDEgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDEgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMSA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMSA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgxID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDEgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDEgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgyID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDIgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDIgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMiA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMiA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgyID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDIgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDIgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGgzID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDMgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDMgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoMyA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoMyA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGgzID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDMgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDMgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg0ID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDQgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDQgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNCA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNCA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg0ID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDQgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDQgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg1ID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDUgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDUgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNSA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNSA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg1ID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDUgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDUgJiAweDBGXSArXG4gICAgICBIRVhfQ0hBUlNbKGg2ID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDYgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDYgPj4+IDIwKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNiA+Pj4gMTYpICYgMHgwRl0gK1xuICAgICAgSEVYX0NIQVJTWyhoNiA+Pj4gMTIpICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg2ID4+PiA4KSAmIDB4MEZdICtcbiAgICAgIEhFWF9DSEFSU1soaDYgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDYgJiAweDBGXTtcbiAgICBpZiAoIXRoaXMuaXMyMjQpIHtcbiAgICAgIGhleCArPSBIRVhfQ0hBUlNbKGg3ID4+PiAyOCkgJiAweDBGXSArIEhFWF9DSEFSU1soaDcgPj4+IDI0KSAmIDB4MEZdICtcbiAgICAgICAgSEVYX0NIQVJTWyhoNyA+Pj4gMjApICYgMHgwRl0gKyBIRVhfQ0hBUlNbKGg3ID4+PiAxNikgJiAweDBGXSArXG4gICAgICAgIEhFWF9DSEFSU1soaDcgPj4+IDEyKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhoNyA+Pj4gOCkgJiAweDBGXSArXG4gICAgICAgIEhFWF9DSEFSU1soaDcgPj4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbaDcgJiAweDBGXTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbiAgfTtcblxuICBTaGEyNTYucHJvdG90eXBlLnRvU3RyaW5nID0gU2hhMjU2LnByb3RvdHlwZS5oZXg7XG5cbiAgU2hhMjU2LnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuXG4gICAgdmFyIGgwID0gdGhpcy5oMCwgaDEgPSB0aGlzLmgxLCBoMiA9IHRoaXMuaDIsIGgzID0gdGhpcy5oMywgaDQgPSB0aGlzLmg0LCBoNSA9IHRoaXMuaDUsXG4gICAgICBoNiA9IHRoaXMuaDYsIGg3ID0gdGhpcy5oNztcblxuICAgIHZhciBhcnIgPSBbXG4gICAgICAoaDAgPj4+IDI0KSAmIDB4RkYsIChoMCA+Pj4gMTYpICYgMHhGRiwgKGgwID4+PiA4KSAmIDB4RkYsIGgwICYgMHhGRixcbiAgICAgIChoMSA+Pj4gMjQpICYgMHhGRiwgKGgxID4+PiAxNikgJiAweEZGLCAoaDEgPj4+IDgpICYgMHhGRiwgaDEgJiAweEZGLFxuICAgICAgKGgyID4+PiAyNCkgJiAweEZGLCAoaDIgPj4+IDE2KSAmIDB4RkYsIChoMiA+Pj4gOCkgJiAweEZGLCBoMiAmIDB4RkYsXG4gICAgICAoaDMgPj4+IDI0KSAmIDB4RkYsIChoMyA+Pj4gMTYpICYgMHhGRiwgKGgzID4+PiA4KSAmIDB4RkYsIGgzICYgMHhGRixcbiAgICAgIChoNCA+Pj4gMjQpICYgMHhGRiwgKGg0ID4+PiAxNikgJiAweEZGLCAoaDQgPj4+IDgpICYgMHhGRiwgaDQgJiAweEZGLFxuICAgICAgKGg1ID4+PiAyNCkgJiAweEZGLCAoaDUgPj4+IDE2KSAmIDB4RkYsIChoNSA+Pj4gOCkgJiAweEZGLCBoNSAmIDB4RkYsXG4gICAgICAoaDYgPj4+IDI0KSAmIDB4RkYsIChoNiA+Pj4gMTYpICYgMHhGRiwgKGg2ID4+PiA4KSAmIDB4RkYsIGg2ICYgMHhGRlxuICAgIF07XG4gICAgaWYgKCF0aGlzLmlzMjI0KSB7XG4gICAgICBhcnIucHVzaCgoaDcgPj4+IDI0KSAmIDB4RkYsIChoNyA+Pj4gMTYpICYgMHhGRiwgKGg3ID4+PiA4KSAmIDB4RkYsIGg3ICYgMHhGRik7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH07XG5cbiAgU2hhMjU2LnByb3RvdHlwZS5hcnJheSA9IFNoYTI1Ni5wcm90b3R5cGUuZGlnZXN0O1xuXG4gIFNoYTI1Ni5wcm90b3R5cGUuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5maW5hbGl6ZSgpO1xuXG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmlzMjI0ID8gMjggOiAzMik7XG4gICAgdmFyIGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDAsIHRoaXMuaDApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMig0LCB0aGlzLmgxKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MzIoOCwgdGhpcy5oMik7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDEyLCB0aGlzLmgzKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MzIoMTYsIHRoaXMuaDQpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMigyMCwgdGhpcy5oNSk7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKDI0LCB0aGlzLmg2KTtcbiAgICBpZiAoIXRoaXMuaXMyMjQpIHtcbiAgICAgIGRhdGFWaWV3LnNldFVpbnQzMigyOCwgdGhpcy5oNyk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG5cbiAgZnVuY3Rpb24gSG1hY1NoYTI1NihrZXksIGlzMjI0LCBzaGFyZWRNZW1vcnkpIHtcbiAgICB2YXIgaSwgdHlwZSA9IHR5cGVvZiBrZXk7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBbXSwgbGVuZ3RoID0ga2V5Lmxlbmd0aCwgaW5kZXggPSAwLCBjb2RlO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvZGUgPSBrZXkuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNvZGUgPCAweDgwKSB7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweDgwMCkge1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4YzAgfCAoY29kZSA+Pj4gNikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgMHhkODAwIHx8IGNvZGUgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSAoMHhlMCB8IChjb2RlID4+PiAxMikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoKGNvZGUgPj4+IDYpICYgMHgzZikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlID0gMHgxMDAwMCArICgoKGNvZGUgJiAweDNmZikgPDwgMTApIHwgKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweDNmZikpO1xuICAgICAgICAgIGJ5dGVzW2luZGV4KytdID0gKDB4ZjAgfCAoY29kZSA+Pj4gMTgpKTtcbiAgICAgICAgICBieXRlc1tpbmRleCsrXSA9ICgweDgwIHwgKChjb2RlID4+PiAxMikgJiAweDNmKSk7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSAoMHg4MCB8ICgoY29kZSA+Pj4gNikgJiAweDNmKSk7XG4gICAgICAgICAgYnl0ZXNbaW5kZXgrK10gPSAoMHg4MCB8IChjb2RlICYgMHgzZikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBrZXkgPSBieXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKEFSUkFZX0JVRkZFUiAmJiBrZXkuY29uc3RydWN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAga2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5KTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgaWYgKCFBUlJBWV9CVUZGRVIgfHwgIUFycmF5QnVmZmVyLmlzVmlldyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA+IDY0KSB7XG4gICAgICBrZXkgPSAobmV3IFNoYTI1NihpczIyNCwgdHJ1ZSkpLnVwZGF0ZShrZXkpLmFycmF5KCk7XG4gICAgfVxuXG4gICAgdmFyIG9LZXlQYWQgPSBbXSwgaUtleVBhZCA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgICB2YXIgYiA9IGtleVtpXSB8fCAwO1xuICAgICAgb0tleVBhZFtpXSA9IDB4NWMgXiBiO1xuICAgICAgaUtleVBhZFtpXSA9IDB4MzYgXiBiO1xuICAgIH1cblxuICAgIFNoYTI1Ni5jYWxsKHRoaXMsIGlzMjI0LCBzaGFyZWRNZW1vcnkpO1xuXG4gICAgdGhpcy51cGRhdGUoaUtleVBhZCk7XG4gICAgdGhpcy5vS2V5UGFkID0gb0tleVBhZDtcbiAgICB0aGlzLmlubmVyID0gdHJ1ZTtcbiAgICB0aGlzLnNoYXJlZE1lbW9yeSA9IHNoYXJlZE1lbW9yeTtcbiAgfVxuICBIbWFjU2hhMjU2LnByb3RvdHlwZSA9IG5ldyBTaGEyNTYoKTtcblxuICBIbWFjU2hhMjU2LnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBTaGEyNTYucHJvdG90eXBlLmZpbmFsaXplLmNhbGwodGhpcyk7XG4gICAgaWYgKHRoaXMuaW5uZXIpIHtcbiAgICAgIHRoaXMuaW5uZXIgPSBmYWxzZTtcbiAgICAgIHZhciBpbm5lckhhc2ggPSB0aGlzLmFycmF5KCk7XG4gICAgICBTaGEyNTYuY2FsbCh0aGlzLCB0aGlzLmlzMjI0LCB0aGlzLnNoYXJlZE1lbW9yeSk7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLm9LZXlQYWQpO1xuICAgICAgdGhpcy51cGRhdGUoaW5uZXJIYXNoKTtcbiAgICAgIFNoYTI1Ni5wcm90b3R5cGUuZmluYWxpemUuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGV4cG9ydHMgPSBjcmVhdGVNZXRob2QoKTtcbiAgZXhwb3J0cy5zaGEyNTYgPSBleHBvcnRzO1xuICBleHBvcnRzLnNoYTIyNCA9IGNyZWF0ZU1ldGhvZCh0cnVlKTtcbiAgZXhwb3J0cy5zaGEyNTYuaG1hYyA9IGNyZWF0ZUhtYWNNZXRob2QoKTtcbiAgZXhwb3J0cy5zaGEyMjQuaG1hYyA9IGNyZWF0ZUhtYWNNZXRob2QodHJ1ZSk7XG5cbiAgaWYgKENPTU1PTl9KUykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cztcbiAgfSBlbHNlIHtcbiAgICByb290LnNoYTI1NiA9IGV4cG9ydHMuc2hhMjU2O1xuICAgIHJvb3Quc2hhMjI0ID0gZXhwb3J0cy5zaGEyMjQ7XG4gICAgaWYgKEFNRCkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHM7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pKCk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71312\n")},71511:(I,g,n)=>{"use strict";I.exports=n.p+"5eb94d86088944fbd9e9.png"},71793:(module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Accordion: () => (/* binding */ fA1),\n/* harmony export */ ActionBar: () => (/* binding */ pZ),\n/* harmony export */ ActionButton: () => (/* binding */ gA1),\n/* harmony export */ Alert: () => (/* binding */ zA1),\n/* harmony export */ Avatar: () => (/* binding */ hi),\n/* harmony export */ Badge: () => (/* binding */ l2),\n/* harmony export */ Breadcrumbs: () => (/* binding */ fZ),\n/* harmony export */ Button: () => (/* binding */ Tt),\n/* harmony export */ ButtonIcon: () => (/* binding */ N9),\n/* harmony export */ ButtonProcess: () => (/* binding */ CA1),\n/* harmony export */ Cell: () => (/* binding */ Nl),\n/* harmony export */ Checkbox: () => (/* binding */ vn),\n/* harmony export */ ClientPicker: () => (/* binding */ XC),\n/* harmony export */ ClientRelationshipTree: () => (/* binding */ OA1),\n/* harmony export */ Collapse: () => (/* binding */ Om),\n/* harmony export */ Comments: () => (/* binding */ mA1),\n/* harmony export */ ContextMenu: () => (/* binding */ vA1),\n/* harmony export */ DataTable: () => (/* binding */ yA1),\n/* harmony export */ DatePicker: () => (/* binding */ LA1),\n/* harmony export */ Divider: () => (/* binding */ a2),\n/* harmony export */ DragAndDrop: () => (/* binding */ wA1),\n/* harmony export */ Dropdown: () => (/* binding */ mn),\n/* harmony export */ DropdownSelect: () => (/* binding */ fn),\n/* harmony export */ EntityPicker: () => (/* binding */ Up1),\n/* harmony export */ FileStatusNode: () => (/* binding */ UA1),\n/* harmony export */ FilterAmount: () => (/* binding */ fg),\n/* harmony export */ FilterBoxAmount: () => (/* binding */ HI),\n/* harmony export */ FilterBoxDateRange: () => (/* binding */ QF),\n/* harmony export */ FilterBoxSelect: () => (/* binding */ K6),\n/* harmony export */ FilterBoxTextInput: () => (/* binding */ iA),\n/* harmony export */ FilterDateRange: () => (/* binding */ uz),\n/* harmony export */ FilterSelect: () => (/* binding */ _5),\n/* harmony export */ FilterTextInput: () => (/* binding */ l8),\n/* harmony export */ Grid: () => (/* binding */ Ha),\n/* harmony export */ HeaderIcon: () => (/* binding */ N3),\n/* harmony export */ HyperLink: () => (/* binding */ YA1),\n/* harmony export */ Icon: () => (/* binding */ f0),\n/* harmony export */ IconButton: () => (/* binding */ Rt),\n/* harmony export */ IconDetailed: () => (/* binding */ ov),\n/* harmony export */ Input: () => (/* binding */ L2),\n/* harmony export */ InputIcon: () => (/* binding */ Lk),\n/* harmony export */ InputLimit: () => (/* binding */ Nk),\n/* harmony export */ InputUploader: () => (/* binding */ bM),\n/* harmony export */ IntertrustThemeProvider: () => (/* binding */ XA1),\n/* harmony export */ List: () => (/* binding */ Rn),\n/* harmony export */ Loader: () => (/* binding */ dz),\n/* harmony export */ Logo: () => (/* binding */ z4),\n/* harmony export */ Menu: () => (/* binding */ yy),\n/* harmony export */ MenuItem: () => (/* binding */ e81),\n/* harmony export */ Metabar: () => (/* binding */ qA1),\n/* harmony export */ Metric: () => (/* binding */ xA1),\n/* harmony export */ Modal: () => (/* binding */ kU),\n/* harmony export */ Navbar: () => (/* binding */ W81),\n/* harmony export */ Overlay: () => (/* binding */ lU),\n/* harmony export */ OverlayPanel: () => (/* binding */ RA1),\n/* harmony export */ PageHeader: () => (/* binding */ BA1),\n/* harmony export */ PageLoader: () => (/* binding */ WA1),\n/* harmony export */ PhoneInput: () => (/* binding */ EA1),\n/* harmony export */ Portal: () => (/* binding */ Jf),\n/* harmony export */ ProgressBar: () => (/* binding */ C4),\n/* harmony export */ PushPanel: () => (/* binding */ SA1),\n/* harmony export */ Radio: () => (/* binding */ l5),\n/* harmony export */ RibbonImage: () => (/* binding */ kA1),\n/* harmony export */ RiskIndicator: () => (/* binding */ O4),\n/* harmony export */ RoundedButton: () => (/* binding */ Ai),\n/* harmony export */ ScrollBar: () => (/* binding */ ns),\n/* harmony export */ Search: () => (/* binding */ yc),\n/* harmony export */ SearchAutocomplete: () => (/* binding */ NA1),\n/* harmony export */ Sidebar: () => (/* binding */ IA1),\n/* harmony export */ Skeleton: () => (/* binding */ K2),\n/* harmony export */ Slider: () => (/* binding */ kI),\n/* harmony export */ Spinner: () => (/* binding */ TA1),\n/* harmony export */ StatusIndicator: () => (/* binding */ Dl),\n/* harmony export */ StepBase: () => (/* binding */ cd1),\n/* harmony export */ Stepper: () => (/* binding */ DA1),\n/* harmony export */ Switch: () => (/* binding */ A7),\n/* harmony export */ Table: () => (/* binding */ k51),\n/* harmony export */ TablePagination: () => (/* binding */ Na1),\n/* harmony export */ TableTabs: () => (/* binding */ HA1),\n/* harmony export */ Tabs: () => (/* binding */ gd1),\n/* harmony export */ TabsController: () => (/* binding */ j81),\n/* harmony export */ TabsHorizontal: () => (/* binding */ Sy),\n/* harmony export */ TabsVertical: () => (/* binding */ yz),\n/* harmony export */ Timeline: () => (/* binding */ FA1),\n/* harmony export */ Toast: () => (/* binding */ PA1),\n/* harmony export */ Toggle: () => (/* binding */ H51),\n/* harmony export */ Tooltip: () => (/* binding */ v2),\n/* harmony export */ Topbar: () => (/* binding */ VA1),\n/* harmony export */ Typography: () => (/* binding */ l4),\n/* harmony export */ amountRangeFilter: () => (/* binding */ Ta1),\n/* harmony export */ dateRangeFilter: () => (/* binding */ Ia1),\n/* harmony export */ getMaxAndMinFromArray: () => (/* binding */ Ha1),\n/* harmony export */ reorderObjectArray: () => (/* binding */ Da1),\n/* harmony export */ theme: () => (/* binding */ Na),\n/* harmony export */ transformToDropdownData: () => (/* binding */ Dp),\n/* harmony export */ useOutsideClick: () => (/* binding */ fc),\n/* harmony export */ useToggle: () => (/* binding */ Ta)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24002);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var styled_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(36844);\n/* harmony import */ var styled_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(styled_components__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18036);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\n/* module decorator */ module = __webpack_require__.hmd(module);\n\n\n\n\n\nconst i2 = {\n white: "#FFFFFF",\n black: "#000000",\n red: "#FF0000",\n purple: "#831F82",\n blue: "#312783",\n green: "#009640",\n orange: "#F39200",\n pink: "#EC619F",\n cyan: "#009FE3",\n lime: "#BCCF00",\n cscBlue: "#003A5C",\n cscBlueDark: "#002940",\n cscHyperLinkBlue: "#075A92",\n //new\n dark: "#20202C",\n tableText: "#363641"\n}, oL = {\n cscBlack: "#222222"\n}, V5 = {\n scampi: "#C1BEDA",\n // blue75\n blueBell: "#C1BEDA",\n lavenderGrey: "#C1BEDA",\n lavender: "#C1BEDA",\n secondaryCscBlue: "#1E5879",\n // New\n fieldBlue: "#F0F4F7",\n fieldHoverBlue: "#EBEEF5",\n fieldBorder: "#e0e1e2",\n textGrey: "#7F7F7F",\n placeholerGrey: "#8F8F95",\n LavenderMist: "#E9E9EA"\n}, t8 = {\n info: "#1473E6",\n success: "#12805C",\n warning: "#B85C00",\n error: "#D7373F"\n}, Sf = {\n paua: "#1D174F",\n // darkBlue40\n parisM: "#4536B5"\n // darkBlue20\n}, kf = {\n eclipse: "#767676",\n //\n grey: "#767676",\n darkGray: "#767676",\n // black35\n pinkSwan: "#B2B2B2",\n // black30\n silver: "#CCCCCC",\n // black25\n veryLightGrey: "#CCCCCC",\n // black20\n gainsboro: "#C1BEDA",\n // black15 D9D9D9\n whisper: "#E5E5E5",\n // black10\n cscGrey100: "#EAEBEB",\n cscGrey200: "#D1D3D4",\n cscGrey500: "#97999B",\n cscGrey700: "#54585A",\n cscGrey600: "#6E7173",\n //new\n activeGrey: "#C0C8D9"\n}, r8 = {\n ghostWhite: "#F7F9FF",\n // blue5\n cyanBg: "#F2FAFE",\n selago: "#F9F4F9",\n // purple5\n pinkBg: "#FEF7FA",\n mintCream: "#F2FAF5",\n // green5\n limeBg: "#FCFDF2",\n whiteSmoke: "#F2F2F2",\n // black5 ------GREY COLOR\n snow: "#F2F2F2",\n //\n floralWhite: "#FFFBF3",\n // orangez\n chablis: "#FFF2F2",\n //red\n cscBlue: "#F7F9FF",\n cscBlueLighter: "#F0F4F7",\n intertrustOrange: "#F9C87F",\n //new\n cultured: "#F4F4F4",\n alabaster: "#FAFAFA",\n greyGoose: "#D2D2D5"\n}, iL = {\n redOrange: (e) => `linear-gradient(to ${e}, ${i2.red} 0%, ${i2.orange} 100%)`,\n purplePink: (e) => `linear-gradient(to ${e}, ${i2.purple} 0%, #B52BB3 100%)`,\n blueCyan: (e) => `linear-gradient(to ${e}, ${i2.blue} 0%, ${Sf.parisM} 100%)`,\n greenLime: (e) => `linear-gradient(to ${e}, ${t8.success} 0%, #19B37F 100%)`,\n orangeCherokee: (e) => `linear-gradient(to ${e}, ${i2.orange} 0%, ${t8.warning} 100%)`,\n pinkLavenderPink: (e) => `linear-gradient(to ${e}, ${i2.pink} 0%, ${i2.pink} 100%)`\n}, aL = {\n primary: {\n default: i2.cscBlue,\n hover: V5.secondaryCscBlue,\n pressed: i2.cscBlueDark,\n focused: V5.secondaryCscBlue,\n disabled: kf.cscGrey100\n },\n secondary: {\n default: "transparent"\n },\n tertiary: {\n default: i2.white,\n hover: i2.white,\n pressed: i2.white,\n focused: i2.white\n },\n link: {\n default: "transparent",\n hover: r8.cscBlue,\n pressed: "transparent",\n focused: "transparent",\n disabled: "transparent"\n },\n floating: {\n default: i2.white,\n hover: r8.ghostWhite,\n pressed: V5.secondaryCscBlue\n }\n}, Nf = {\n base: "Ubuntu, Helvetica, Arial",\n secondary: "Avenir Heavy",\n tertiary: "Avenir Heavy"\n}, sL = {\n t48: "48px",\n // 3rem\n t40: "40px",\n // 2.5rem\n t32: "32px",\n // 2rem\n t28: "28px",\n // 1.75rem\n t24: "24px",\n // 1.5rem\n t20: "20px",\n // 1.25rem\n t18: "18px",\n // 1.125rem\n t16: "16px",\n // 1rem\n t14: "14px",\n // 0.875rem\n t12: "12px",\n // 0.75rem\n t10: "10px",\n // 0.625rem\n t9: "9px",\n // 0.5625rem\n t8: "8px",\n // 0.5rem\n t7: "7px",\n // 0.4375rem\n t6: "6px"\n // 0.375rem\n}, lL = {\n lh56: "56px",\n // 3.5rem\n lh48: "48px",\n // 3rem\n lh40: "40px",\n // 2.5rem\n lh39: "39.2px",\n // 2.45rem\n lh36: "36px",\n // 2.25rem\n lh32: "32px",\n // 2rem\n lh28: "28px",\n // 1.75rem\n lh26: "26px",\n // 1.625rem\n lh25: "25.2px",\n //1.575rem\n lh24: "24px",\n // 1.5rem\n lh22: "22px",\n // 1.375rem\n lh20: "20px",\n // 1.25rem\n lh19: "19.6px",\n //1.225rem\n lh18: "18px",\n // 1.125rem\n lh17: "17px",\n // 1.0625rem\n lh16: "16px",\n // 1rem\n lh15: "15px",\n // 0.9375rem\n lh14: "14px",\n // 0.9375rem\n lh12: "12px"\n //0.75rem\n}, If = {\n bold: 700,\n medium: 500,\n regular: 400,\n light: 300\n}, cL = {\n circle: "50%",\n xxl: "12px",\n // 0.75rem\n xl: "10px",\n // 0.625rem\n lg: "8px",\n // 0.5rem\n base: "4px",\n // 0.25rem\n sm: "2px"\n // 0.125rem\n}, Ks = "rgba(49, 39, 131, 0.05)", pL = {\n sm: `0 0.25rem 0.5rem ${Ks}`,\n md: `0 0.5rem 1rem ${Ks}`,\n lg: `0 1rem 1.5rem ${Ks}`,\n xl: `0 2rem 4rem ${Ks}`\n}, Tf = {\n base: "cubic-bezier(0.29,.4,.17,.99)"\n}, Df = {\n base: `all 0.2s ${Tf.base}`\n}, Hf = {\n textOverflow: "ellipsis",\n overflow: "hidden",\n whiteSpace: "nowrap"\n}, Pf = {\n background: "transparent",\n fontFamily: Nf.base,\n fontWeight: If.regular,\n transition: Df.base,\n border: 0,\n outline: "none",\n cursor: "pointer",\n userSelect: "none"\n}, Vf = {\n margin: 0,\n padding: 0,\n listStyle: "none"\n}, dL = {\n ellipsis: Hf,\n buttonReset: Pf,\n listReset: Vf\n}, AL = {\n buttonTextPrimary: "#FFFFFF",\n buttonTextPrimaryPressed: "#FFFFFF",\n buttonTextSecondaryDefault: "#312783",\n buttonTextSecondaryHover: "#FFFFFF",\n buttonTextSecondaryPressed: "#FFFFFF",\n buttonTextSecondaryFocused: "#FFFFFF",\n buttonTextTertiary: "#20202C",\n buttonTextlinkDefault: "#312783",\n buttonTextlinkHover: "#4536B5",\n buttonTextlinkPressed: "#1D174F"\n}, Ct = {\n ...i2,\n ...V5,\n ...Sf,\n ...kf,\n ...oL,\n ...t8,\n ...AL,\n gradients: iL,\n backgrounds: r8,\n buttons: aL\n}, sa = {\n sp48: "48px",\n // 3rem\n sp40: "40px",\n // 2.5rem\n sp32: "32px",\n // 2rem\n sp24: "24px",\n // 1.5rem\n sp16: "16px",\n // 1rem\n sp12: "12px",\n // 0.75rem\n sp8: "8px",\n // 0.5rem\n sp6: "6px",\n // 0.375rem\n sp4: "4px",\n // 0.25rem\n sp2: "2px"\n // 0.125rem\n}, uL = {\n xxxxs: "8px",\n // 0.5rem\n xxxs: "12px",\n //0.875rem\n xxs: "14px",\n //0.875rem\n xs: "16px",\n //1rem\n sm: "24px",\n //1.5rem\n md: "32px",\n //2rem\n lg: "40px",\n //2.5rem\n xl: "48px"\n //3rem\n}, bL = "2.5rem", hL = "32px", W2 = "16px", Ff = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n`, ML = {\n fadeIn: Ff\n}, F5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n GLOBAL_ITEM_HEIGHT: bL,\n GLOBAL_ITEM_HEIGHT_CONDENSED: hL,\n GLOBAL_SKELETON_HEIGHT: W2,\n animations: ML,\n borderRadius: cL,\n buttonReset: Pf,\n colors: Ct,\n cubicBezier: Tf,\n ellipsis: Hf,\n fadeIn: Ff,\n fontFamily: Nf,\n fontWeight: If,\n itemSize: uL,\n lineHeight: lL,\n listReset: Vf,\n mixins: dL,\n shadows: pL,\n spacings: sa,\n transitions: Df,\n typography: sL\n}, Symbol.toStringTag, { value: "Module" })), T3 = {\n bgPrimary: "#FFFFFF",\n bgSecondary: "#F5F5F5",\n //new\n bgSecondaryAlt: "#F5F7F9",\n //new\n bgTertiary: "#003A5C",\n bgPressed: "#002940",\n bgReadOnly: "#BFCED6",\n bgSelected: "#C0DBE5",\n bgHoverPrimary: "#EBF6FD",\n bgHoverSecondary: "#1E5879",\n bgDisabledPrimary: "#EAEBEB",\n bgDisabledSecondary: "#A7A7A7",\n bgInformationalPrimary: "#42788F",\n bgInformationalSecondary: "#E2EFF2",\n bgSuccessPrimary: "#509E2F",\n bgSuccessSecondary: "#DDECD7",\n bgWarningPrimary: "#F2A900",\n bgWarningSecondary: "#F8EED7",\n bgErrorPrimary: "#D1344F",\n bgErrorSecondary: "#F8E1E5",\n bgTransparencyPrimary: "#222222",\n bgTransparencyHover: "#FFFFFF",\n bgTransparencyPressed: "#FFFFFF",\n blackOverlay: "#222222"\n}, fL = {\n borderPrimary: "#D1D3D4",\n borderSecondary: "#003A5C",\n borderPressed: "#002940",\n borderTertiary: "#EAEBEB",\n borderAlternative: "#F5F5F5",\n borderError: "#D1344F",\n borderFocused: "#42788F",\n borderHover: "#1E5879",\n borderDisabledOnbg: "#A7A7A7",\n borderReadonly: "#BFCED6",\n borderTransparent: "#FFFFFF"\n}, gL = {\n textPrimary: "#222222",\n textSecondary: "#003A5C",\n textTertiary: "#FFFFFF",\n //new\n textAlertTertiary: "#222222",\n //new\n textHover: "#217CB8",\n textPressed: "#002940",\n textHighemphasis: "#2D2D2D",\n textBody: "#393939",\n textMediumemphasis: "#54585A",\n textLowemphasis: "#6E7173",\n textDisabledOnbg: "#97999B",\n textDisabledNobg: "#D1D3D4",\n textError: "#D1344F",\n textSuccess: "#509E2F",\n textWarning: "#F2A900",\n textInformational: "#42788F",\n textHyperlink: "#075A92",\n //new\n textAlertError: "#222222",\n textAlertSuccess: "#222222",\n textAlertWarning: "#222222",\n textAlertInformational: "#222222",\n //new\n textReadonly: "#BFCED6",\n textDisabled: "#A7A7A7"\n}, zL = {\n // legendBgCyan: \'#009FE3\',\n // legendBgPurple: \'#831F82\',\n // legendBgPink: \'#EC619F\',\n // legendBgRed: \'#FF0000\',\n // legendBgOrange: \'#F39200\',\n // new\n legendBg1: "#003A5C",\n legendBg2: "#00B2A9",\n legendBg3: "#F2A900",\n legendBg4: "#97999B",\n legendBg5: "#42788F",\n legendBg6: "#F68D2E",\n legendBg7: "#509E2F",\n legendBg8: "#D1344F",\n legendBorder: "#FFFFFF"\n}, CL = {\n metricsBgHover: "#F5F7F9",\n metricsBgUp: "#509E2F",\n metricsBgDown: "#D1344F"\n}, Go = {\n chartBubbleBgDefault: "#F2F5F7",\n // chartBgBlueActive: \'#312783\',\n // chartBgBlueInactive: \'#CBC9E0\',\n // chartPieBgCyanActive: \'#009FE3\',\n // chartPieBgCyanInactive: \'#BFE7F8\',\n // chartPieBgPurpleActive: \'#831F82\',\n // chartPieBgPurpleInactive: \'#E0C7E0\',\n // chartPieBgPinkActive: \'#EC619F\',\n // chartPieBgPinkInactive: \'#FAD7E7\',\n // chartPieBgGreenActive: \'#009640\',\n // chartPieBgGreenInactive: \'#BFE5CF\',\n // chartPieBgOrangeActive: \'#F39200\',\n // chartPieBgOrangeInactive: \'#FCE4BF\',\n // chartPieBgRedActive: \'#FF0000\',\n // chartPieBgRedInactive: \'#FFBFBF\',\n //new\n chartBgHover: "#F5F7F9",\n chartBg1Active: "#003A5C",\n chartBg1InActive: "#BFCED6",\n chartPieBg2Active: "#00B2A9",\n chartPieBg2InActive: "#BFECE9",\n chartPieBg3Active: "#F2A900",\n chartPieBg3InActive: "#FCE9BF",\n chartPieBg4Active: "#97999B",\n chartPieBg4InActive: "#E5E5E6",\n chartPieBg5Active: "#42788F",\n chartPieBg5InActive: "#EDF5F7",\n chartPieBg6Active: "#F68D2E",\n chartPieBg6InActive: "#FDE2CB",\n chartPieBg7Active: "#509E2F",\n chartPieBg7InActive: "#D3E7CB",\n chartPieBg8Active: "#D1344F",\n chartPieBg8InActive: "#F3CCD3"\n}, OL = {\n buttonBgPrimaryDefault: "#003A5C",\n buttonBgPrimaryHover: "#1E5879",\n buttonBgPrimaryPressed: "#002940",\n buttonBgSecondaryDefault: "#FFFFFF",\n buttonBgSecondaryHover: "#1E5879",\n buttonBgSecondaryPressed: "#002940",\n buttonBgTertiary: "#FFFFFF",\n buttonBgTertiaryHover: "#6E7173",\n buttonBgTertiaryPressed: "#222222",\n buttonBgTextlinkHover: "#EBF6FD"\n}, mL = {\n buttonBorderSecondaryDefault: "#003A5C",\n buttonBorderTertiaryDefault: "#D1D3D4",\n buttonBorderTertiaryHover: "#A7A7A7",\n buttonBorderTertiaryPressed: "#003453"\n}, vL = {\n buttonTextPrimary: "#FFFFFF",\n buttonTextPrimaryPressed: "#FFFFFF",\n buttonTextSecondaryDefault: "#003A5C",\n buttonTextSecondaryHover: "#FFFFFF",\n buttonTextSecondaryPressed: "#FFFFFF",\n buttonTextSecondaryFocused: "#FFFFFF",\n buttonTextTertiary: "#222222",\n buttonTextlinkDefault: "#003A5C",\n buttonTextlinkHover: "#1E5879",\n buttonTextlinkPressed: "#002940"\n}, yL = {\n topBarBgPrimary: "#003A5C",\n topBarBgSecondary: "#FFFFFF",\n topBarBgTertiary: "#FFFFFF",\n topBarTextPrimary: "#FFFFFF",\n topBarTextSecondary: "#003A5C"\n}, LL = {\n fieldBgDefault: "#F5F7F9",\n fieldBgHover: "#EBF6FD",\n fieldTextPlaceholder: "#97999B",\n fieldTextSupport: "#BDBDBD",\n fieldBorderActive: "#D1D3D4"\n}, wL = {\n tabIndicator: "#00B2A9",\n //new\n tabBorder: "#F5F5F5"\n}, qL = {\n actionButtonBgHoverDropdown: "#FBFBFB",\n actionButtonBgPressedDropdown: "#C0DBE5",\n actionButtonBgPressedButton: "#C0DBE5",\n actionButtonBgHoverButton: "#EBF6FD"\n}, xL = {\n filterboxButtonBorderHover: "#BDBDBD",\n filterboxButtonBorderDefault: "#EAEBEB"\n}, RL = {\n filterboxButtonBg: "#FFFFFF",\n filterboxBg: "#FFFFFF"\n}, BL = {\n toggleBgInactiveDefault: "#EAEBEB",\n switchTextReadonlyActive: "#FFFFFF"\n}, WL = {\n dataTableBgPrimary: "#FFFFFF",\n dataTableBgHeader: "#F5F7F9",\n dataTableBgFilter: "#FFFFFF",\n dataTableBgSecondary: "#F8E1E5",\n dataTableBgTertiary: "#F8EED7",\n dataTableBgTotal: "#FBFBFB",\n dataTableBorderHeader: "#D1D3D4",\n dataTableBorderCell: "#F5F5F5",\n dataTableScrollArrow: "#97999B",\n dataTableScrollBgPressedArrow: "#EAEBEB",\n dataTableLoaderBg: "#EDF3F7",\n dataTableLoaderGradient: "#FCFDFF"\n}, EL = {\n scrollBgDefault: "#D1D3D4",\n scrollBgHover: "#A7A7A7",\n scrollBgPressed: "#6E7173",\n scrollBgPrimary: "#F5F5F5"\n}, SL = {\n sliderBgDefault: "#EAEBEB"\n}, kL = {\n listTextLowemphasis: "#6E7173"\n}, NL = {\n calendarBlockBgDisabled: "#FBFBFB"\n}, IL = {\n redOrange: (e) => `linear-gradient(to ${e}, ${Go.chartPieBg7Active} 0%, ${Go.chartPieBg6Active} 100%)`,\n purplePink: (e) => `linear-gradient(to ${e}, ${Go.chartPieBg3Active} 0%, #B52BB3 100%)`,\n blueCyan: (e) => `linear-gradient(to ${e}, ${T3.bgTertiary} 0%, ${T3.bgHoverSecondary} 100%)`,\n greenLime: (e) => `linear-gradient(to ${e}, ${T3.bgSuccessPrimary} 0%, #19B37F 100%)`,\n orangeCherokee: (e) => `linear-gradient(to ${e}, ${Go.chartPieBg6Active} 0%, ${T3.bgWarningPrimary} 100%)`,\n pinkLavenderPink: (e) => `linear-gradient(to ${e}, ${Go.chartPieBg4Active} 0%, ${Go.chartPieBg4Active} 100%)`\n}, Uf = {\n base: "Ubuntu, Helvetica, Arial",\n secondary: "Scope One, Helvetica, Arial",\n tertiary: "Avenir Heavy"\n}, TL = {\n bold: 700,\n medium: 500,\n regular: 400,\n light: 300\n}, Zt = {\n border: fL,\n textIcon: gL,\n list: kL,\n buttonBackgound: OL,\n buttonBorder: mL,\n topBar: yL,\n field: LL,\n tab: wL,\n actionButton: qL,\n filterboxBorder: xL,\n filterboxBackground: RL,\n toggleSwitch: BL,\n dataTable: WL,\n scroll: EL,\n slider: SL,\n dataVisualizationLegend: zL,\n dataVisualizationMetrics: CL,\n dataVisualizationChart: Go,\n calendar: NL,\n gradients: IL,\n backgrounds: T3,\n buttonText: vL\n};\n(0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n`;\nconst D3 = {\n bgPrimary: "#272733",\n bgSecondary: "#21202B",\n bgTertiary: "#68A3BB",\n bgPressed: "#68A3BB",\n bgReadOnly: "#1A1A39",\n bgSelected: "#413E5C",\n bgHoverPrimary: "#30303D",\n bgHoverSecondary: "#68A3BB",\n bgDisabledPrimary: "#4B4B5C",\n bgDisabledSecondary: "#626275",\n bgInformationalPrimary: "#5BB5FF",\n bgInformationalSecondary: "#182226",\n bgSuccessPrimary: "#2FC294",\n bgSuccessSecondary: "#1A241F",\n bgWarningPrimary: "#E08B4F",\n bgWarningSecondary: "#26221C",\n bgErrorPrimary: "#FB666D",\n bgErrorSecondary: "#29181A",\n bgTransparencyPrimary: "#76768A",\n bgTransparencyHover: "#272733",\n bgTransparencyPressed: "#393947",\n blackOverlay: "#20202C"\n}, DL = {\n borderPrimary: "#393947",\n borderSecondary: "#68A3BB",\n borderPressed: "#68A3BB",\n borderTertiary: "#393947",\n borderAlternative: "#272733",\n borderError: "#FB666D",\n borderFocused: "#5BB5FF",\n borderHover: "#68A3BB",\n borderDisabledOnbg: "#76768A",\n borderReadonly: "#1A1A39",\n borderTransparent: "#FFFFFF"\n}, HL = {\n textPrimary: "#FFFFFF",\n textSecondary: "#68A3BB",\n textTertiary: "#20202C",\n textHover: "#68A3BB",\n textPressed: "#68A3BB",\n textHighemphasis: "#F0F0F5",\n textBody: "#D8D8E5",\n textMediumemphasis: "#D8D8E5",\n textLowemphasis: "#BCBCCC",\n textDisabledOnbg: "#76768A",\n textDisabledNobg: "#626275",\n textError: "#FB666D",\n textSuccess: "#2FC294",\n textWarning: "#E08B4F",\n textInformational: "#5BB5FF",\n textReadonly: "#1A1A39",\n textDisabled: "#A6A6AB"\n}, PL = {\n // legendBgCyan: \'#009FE3\',\n // legendBgPurple: \'#831F82\',\n // legendBgPink: \'#EC619F\',\n // legendBgRed: \'#FF0000\',\n // legendBgOrange: \'#F39200\',\n // new\n legendBg1: "#68A3BB",\n legendBg2: "#B3E8E5",\n legendBg3: "#F8DA7F",\n legendBg4: "#75D98F",\n legendBg5: "#FDCC8A",\n legendBg6: "#F492A4",\n legendBg8: "#75D98F",\n legendBorder: "#F0F0F5"\n}, VL = {\n metricsBgHover: "#323045",\n metricsBgUp: "#75D98F",\n metricsBgDown: "#F492A4"\n}, jo = {\n chartBubbleBgDefault: "#21202B",\n // chartBgBlueActive: \'#312783\',\n // chartBgBlueInactive: \'#CBC9E0\',\n // chartPieBgCyanActive: \'#009FE3\',\n // chartPieBgCyanInactive: \'#BFE7F8\',\n // chartPieBgPurpleActive: \'#831F82\',\n // chartPieBgPurpleInactive: \'#E0C7E0\',\n // chartPieBgPinkActive: \'#EC619F\',\n // chartPieBgPinkInactive: \'#FAD7E7\',\n // chartPieBgGreenActive: \'#009640\',\n // chartPieBgGreenInactive: \'#BFE5CF\',\n // chartPieBgOrangeActive: \'#F39200\',\n // chartPieBgOrangeInactive: \'#FCE4BF\',\n // chartPieBgRedActive: \'#FF0000\',\n // chartPieBgRedInactive: \'#FFBFBF\',\n //new\n chartBgHover: "#21202B",\n chartBg1Active: "#68A3BB",\n chartBg1InActive: "#003453",\n chartPieBg2Active: "#B3E8E5",\n chartPieBg2InActive: "#004744",\n chartPieBg3Active: "#F8DA7F",\n chartPieBg3InActive: "#493300",\n chartPieBg4Active: "#75D98F",\n chartPieBg4InActive: "#23462D",\n chartPieBg5Active: "#FDCC8A",\n chartPieBg5InActive: "#59411C",\n chartPieBg6Active: "#F492A4",\n chartPieBg6InActive: "#561C1B",\n chartPieBg7Active: "#E5FA6F",\n chartPieBg7InActive: "#464D26"\n}, FL = {\n buttonBgPrimaryDefault: "#68A3BB",\n buttonBgPrimaryHover: "#8BD3E2",\n buttonBgPrimaryPressed: "#769ABB",\n buttonBgSecondaryDefault: "#323045",\n buttonBgSecondaryHover: "#8BD3E2",\n buttonBgSecondaryPressed: "#769ABB",\n buttonBgTertiary: "#323045",\n //new\n buttonBgTertiaryHover: "#323045",\n buttonBgTertiaryPressed: "#323045",\n //new\n buttonBgTextlinkHover: "#413E5C"\n}, UL = {\n buttonBorderSecondaryDefault: "#68A3BB",\n buttonBorderTertiaryDefault: "#76768A",\n buttonBorderTertiaryHover: "#BCBCCC",\n buttonBorderTertiaryPressed: "#769ABB"\n}, YL = {\n buttonTextPrimary: "#20202C",\n buttonTextPrimaryPressed: "#20202C",\n buttonTextSecondaryDefault: "#68A3BB",\n buttonTextSecondaryHover: "#20202C",\n buttonTextSecondaryPressed: "#20202C",\n buttonTextSecondaryFocused: "#20202C",\n buttonTextTertiary: "#FFFFFF",\n buttonTextlinkDefault: "#68A3BB",\n buttonTextlinkHover: "#8BD3E2",\n buttonTextlinkPressed: "#769ABB"\n}, XL = {\n topBarBgPrimary: "#30303D",\n topBarBgSecondary: "#272733",\n topBarBgTertiary: "#FFFFFF",\n topBarTextPrimary: "#FFFFFF",\n topBarTextSecondary: "#30303D"\n}, QL = {\n fieldBgDefault: "#323045",\n fieldBgHover: "#413E5C",\n fieldTextPlaceholder: "#76768A",\n fieldTextSupport: "#4B4B5C",\n fieldBorderActive: "#393947"\n}, GL = {\n tabIndicator: "#B3E8E5",\n //new\n tabBorder: "#30303D"\n}, jL = {\n actionButtonBgHoverDropdown: "#1F1F29",\n actionButtonBgPressedDropdown: "#626275",\n actionButtonBgPressedButton: "#626275",\n actionButtonBgHoverButton: "#393947"\n}, KL = {\n filterboxButtonBorderHover: "#4B4B5C",\n filterboxButtonBorderDefault: "#393947"\n}, ZL = {\n filterboxButtonBg: "#323045",\n filterboxBg: "#272733"\n}, JL = {\n toggleBgInactiveDefault: "#1F1F29",\n switchTextReadonlyActive: "#BCBCCC"\n}, _L = {\n dataTableBgPrimary: "#272733",\n dataTableBgHeader: "#323045",\n dataTableBgFilter: "#272733",\n dataTableBgSecondary: "#751D1C",\n dataTableBgTertiary: "#79551D",\n dataTableBgTotal: "#1F1F29",\n dataTableBorderHeader: "#393947",\n dataTableBorderCell: "#393947",\n dataTableScrollArrow: "#8B8B9E",\n dataTableScrollBgPressedArrow: "#76768A",\n dataTableLoaderBg: "#323045",\n dataTableLoaderGradient: "#413E5C"\n}, $L = {\n scrollBgDefault: "#393947",\n scrollBgHover: "#626275",\n scrollBgPressed: "#8B8B9E",\n scrollBgPrimary: "#1F1F29"\n}, ew = {\n sliderBgDefault: "#30303D"\n}, tw = {\n listTextLowemphasis: "#D8D8E5"\n}, rw = {\n calendarBlockBgDisabled: "#272733"\n}, nw = {\n redOrange: (e) => `linear-gradient(to ${e}, ${jo.chartPieBg7Active} 0%, ${jo.chartPieBg6Active} 100%)`,\n purplePink: (e) => `linear-gradient(to ${e}, ${jo.chartPieBg3Active} 0%, #B52BB3 100%)`,\n blueCyan: (e) => `linear-gradient(to ${e}, ${D3.bgTertiary} 0%, ${D3.bgHoverSecondary} 100%)`,\n greenLime: (e) => `linear-gradient(to ${e}, ${D3.bgSuccessPrimary} 0%, #19B37F 100%)`,\n orangeCherokee: (e) => `linear-gradient(to ${e}, ${jo.chartPieBg6Active} 0%, ${D3.bgWarningPrimary} 100%)`,\n pinkLavenderPink: (e) => `linear-gradient(to ${e}, ${jo.chartPieBg4Active} 0%, ${jo.chartPieBg4Active} 100%)`\n}, fl = {\n border: DL,\n textIcon: HL,\n buttonBackgound: FL,\n buttonBorder: UL,\n topBar: XL,\n field: QL,\n tab: GL,\n actionButton: jL,\n filterboxBorder: KL,\n filterboxBackground: ZL,\n toggleSwitch: JL,\n dataTable: _L,\n scroll: $L,\n slider: ew,\n dataVisualizationLegend: PL,\n dataVisualizationMetrics: VL,\n dataVisualizationChart: jo,\n list: tw,\n calendar: rw,\n gradients: nw,\n backgrounds: D3,\n buttonText: YL\n};\n(0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n`;\nconst Na = () => {\n const [e, t] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("cscBlueLight");\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n let n = localStorage.getItem("UIKit:ThemeValue");\n n && t(n);\n }, [localStorage.getItem("UIKit:ThemeValue")]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n let n = {\n ...F5,\n colors: {\n ...Ct,\n ...Zt,\n backgrounds: {\n ...Ct.backgrounds,\n ...Zt.backgrounds\n }\n }\n }, o = {\n ...F5,\n colors: {\n ...Ct,\n ...fl,\n backgrounds: {\n ...Ct.backgrounds,\n ...fl.backgrounds\n }\n }\n }, i = n;\n return e == "cscBlueLight" ? i = n : e == "cscBlueDark" ? i = o : {\n ...F5,\n ...i\n };\n }, [e])();\n};\nvar Cn = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof __webpack_require__.g < "u" ? __webpack_require__.g : typeof self < "u" ? self : {};\nfunction $t(e) {\n return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;\n}\nfunction Yf(e) {\n if (e.__esModule)\n return e;\n var t = e.default;\n if (typeof t == "function") {\n var r = function n() {\n return this instanceof n ? Reflect.construct(t, arguments, this.constructor) : t.apply(this, arguments);\n };\n r.prototype = t.prototype;\n } else\n r = {};\n return Object.defineProperty(r, "__esModule", { value: !0 }), Object.keys(e).forEach(function(n) {\n var o = Object.getOwnPropertyDescriptor(e, n);\n Object.defineProperty(r, n, o.get ? o : {\n enumerable: !0,\n get: function() {\n return e[n];\n }\n });\n }), r;\n}\nvar n8 = { exports: {} }, h3 = {};\n/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Zd;\nfunction ow() {\n if (Zd)\n return h3;\n Zd = 1;\n var e = (react__WEBPACK_IMPORTED_MODULE_0___default()), t = Symbol.for("react.element"), r = Symbol.for("react.fragment"), n = Object.prototype.hasOwnProperty, o = e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, i = { key: !0, ref: !0, __self: !0, __source: !0 };\n function a(s, l, c) {\n var p, d = {}, u = null, h = null;\n c !== void 0 && (u = "" + c), l.key !== void 0 && (u = "" + l.key), l.ref !== void 0 && (h = l.ref);\n for (p in l)\n n.call(l, p) && !i.hasOwnProperty(p) && (d[p] = l[p]);\n if (s && s.defaultProps)\n for (p in l = s.defaultProps, l)\n d[p] === void 0 && (d[p] = l[p]);\n return { $$typeof: t, type: s, key: u, ref: h, props: d, _owner: o.current };\n }\n return h3.Fragment = r, h3.jsx = a, h3.jsxs = a, h3;\n}\nvar M3 = {};\n/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Jd;\nfunction iw() {\n return Jd || (Jd = 1, false && 0), M3;\n}\n true ? n8.exports = ow() : 0;\nvar W7 = n8.exports;\nconst S0 = W7.Fragment, A = W7.jsx, c1 = W7.jsxs, aw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "circle",\n {\n cx: "12",\n cy: "12",\n r: "11.3",\n stroke: "currentColor",\n strokeWidth: "1.4"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.0001 13.9894C12.4349 13.9894 12.7874 13.6227 12.7874 13.1702L12.7874 7.31915C12.7874 6.86675 12.4349 6.5 12.0001 6.5C11.5653 6.5 11.2129 6.86675 11.2129 7.31915L11.2129 13.1702C11.2129 13.6227 11.5653 13.9894 12.0001 13.9894Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.0001 17.5C12.4349 17.5 12.7874 17.1333 12.7874 16.6808C12.7874 16.2284 12.4349 15.8617 12.0001 15.8617C11.5653 15.8617 11.2129 16.2284 11.2129 16.6808C11.2129 17.1333 11.5653 17.5 12.0001 17.5Z",\n fill: "currentColor"\n }\n )\n] }), sw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A("g", { clipPath: "url(#clip0_2497_135990)", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24ZM12 6C12.5523 6 13 6.44772 13 7V13C13 13.5523 12.5523 14 12 14C11.4477 14 11 13.5523 11 13V7C11 6.44772 11.4477 6 12 6ZM13 17C13 17.5523 12.5523 18 12 18C11.4477 18 11 17.5523 11 17C11 16.4477 11.4477 16 12 16C12.5523 16 13 16.4477 13 17Z",\n fill: "currentColor"\n }\n ) }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2497_135990", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), lw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.3917 23.7179L5.51986 15.1746L5.51614 15.1674C5.36699 14.878 5.439 14.4522 5.73795 14.2348L5.7472 14.228L5.75748 14.223C5.90844 14.1498 6.09038 14.1339 6.25901 14.1683C6.42817 14.2029 6.59506 14.2905 6.70891 14.4377L6.71317 14.4432L11.3008 21.0903V0.661487C11.3008 0.290743 11.6063 0 11.9788 0C12.3513 0 12.6568 0.290743 12.6568 0.661487V21.1495L17.2428 14.5051C17.4637 14.1515 17.909 14.0727 18.2142 14.2901C18.576 14.5046 18.6611 14.9425 18.431 15.2435L12.5657 23.7181C12.2513 24.0325 11.7099 24.0361 11.3917 23.7179Z",\n fill: "currentColor"\n }\n) }), cw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.272954 11.4047L8.80063 5.52608C9.07051 5.38752 9.517 5.44355 9.70902 5.75494C9.90243 6.06859 9.76935 6.46524 9.49761 6.67453L2.73919 11.3206H23.3653C23.7336 11.3206 24 11.6755 24 12.0308C24 12.3886 23.7201 12.6799 23.3653 12.6799H2.73919L9.49555 17.3247C9.8382 17.5374 9.91269 17.9666 9.70155 18.2584C9.4867 18.5866 9.10507 18.5686 8.78955 18.4066L0.272954 12.5346C-0.0786668 12.2389 -0.0831133 11.692 0.272954 11.4047Z",\n fill: "currentColor"\n }\n) }), pw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M15.2172 18.4012C15.1016 18.4727 14.9811 18.5161 14.8203 18.5117C14.5768 18.5051 14.3789 18.3867 14.2695 18.2188C14.1602 18.0508 14.1774 17.9091 14.2109 17.7461C14.2446 17.5826 14.357 17.4408 14.4983 17.3323L14.5025 17.3291L21.26 12.6988H0.634725C0.266753 12.6988 0 12.3857 0 12.0312C0 11.6741 0.280275 11.3432 0.634725 11.3432H21.26L14.5046 6.71418C14.1627 6.50259 14.0875 6.07587 14.2972 5.78479C14.5043 5.43671 14.9248 5.35783 15.2119 5.57624L23.7269 11.4271C24.091 11.7912 24.0964 12.1846 23.7269 12.554L15.2172 18.4012Z",\n fill: "currentColor"\n }\n) }), dw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.392 0.282057L5.52011 8.82539L5.51638 8.83261C5.36723 9.12196 5.43925 9.54777 5.73819 9.76525L5.74744 9.77198L5.75773 9.77697C5.90869 9.85018 6.09062 9.8661 6.25925 9.83166C6.42842 9.79712 6.59531 9.70953 6.70916 9.56229L6.71342 9.55678L11.301 2.90971V23.3385C11.301 23.7093 11.6065 24 11.979 24C12.3515 24 12.657 23.7093 12.657 23.3385V2.85049L17.2431 9.49493C17.4639 9.84847 17.9092 9.92728 18.2145 9.70991C18.5762 9.49542 18.6613 9.05747 18.4313 8.75649L12.566 0.28191C12.1889 -0.0951519 11.7687 -0.0946159 11.392 0.282057Z",\n fill: "currentColor"\n }\n) }), Aw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M7.96323 3.17637C7.29937 4.30124 7.18033 5.61384 7.18033 6.28571V17.7143C7.18033 18.0299 6.9161 18.2857 6.59016 18.2857C6.26423 18.2857 6 18.0299 6 17.7143V6.28571C6 5.52902 6.12686 3.98447 6.93841 2.60935C7.77665 1.18901 9.32019 0 12 0C14.6798 0 16.2234 1.18901 17.0616 2.60935C17.8731 3.98447 18 5.52902 18 6.28571V19.619C18 20.2347 17.8673 21.3126 17.2265 22.2548C16.5594 23.2356 15.3866 24 13.4754 24C11.5642 24 10.3914 23.2356 9.72433 22.2548C9.08355 21.3126 8.95082 20.2347 8.95082 19.619V9.14286C8.95082 9.13512 8.95082 9.12719 8.95081 9.11908C8.95065 8.7254 8.95031 7.90178 9.31712 7.16777C9.5111 6.77961 9.81166 6.40618 10.2693 6.13375C10.7256 5.86209 11.2988 5.71429 12 5.71429C12.7012 5.71429 13.2744 5.86209 13.7307 6.13375C14.1883 6.40618 14.4889 6.77961 14.6829 7.16777C15.0497 7.90178 15.0494 8.7254 15.0492 9.11908C15.0492 9.12719 15.0492 9.13512 15.0492 9.14286V17.7143C15.0492 18.0299 14.785 18.2857 14.459 18.2857C14.1331 18.2857 13.8689 18.0299 13.8689 17.7143V9.14286C13.8689 8.73269 13.8608 8.14659 13.6204 7.66556C13.507 7.43864 13.3465 7.2466 13.1125 7.10732C12.8773 6.96728 12.5283 6.85714 12 6.85714C11.4717 6.85714 11.1227 6.96728 10.8875 7.10732C10.6535 7.2466 10.493 7.43864 10.3796 7.66556C10.1392 8.14659 10.1311 8.73269 10.1311 9.14286V19.619C10.1311 20.1145 10.2443 20.9414 10.7101 21.6262C11.1496 22.2723 11.944 22.8571 13.4754 22.8571C15.0068 22.8571 15.8013 22.2723 16.2407 21.6262C16.7065 20.9414 16.8197 20.1145 16.8197 19.619V6.28571C16.8197 5.61384 16.7006 4.30124 16.0368 3.17637C15.3996 2.0967 14.2382 1.14286 12 1.14286C9.76177 1.14286 8.6004 2.0967 7.96323 3.17637Z",\n fill: "currentColor"\n }\n) }), uw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.6 22.6V1.4H10.4V22.6H13.6ZM9 0H15V24H9V0ZM4.6 9.4V22.6H1.4V9.4H4.6ZM6 8H0V24H6V8ZM22.6 17.4V22.6H19.4V17.4H22.6ZM24 16H18V24H24V16Z",\n fill: "currentcolor"\n }\n) }), bw = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M9 0H15V24H9V0Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M6 8H0V24H6V8Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 16H18V24H24V16Z",\n fill: "currentcolor"\n }\n )\n] }), hw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M21.1438 8.70519H21.7883C23.0114 8.70519 24 9.64452 24 10.7156V13.1702C24 14.353 23.0141 15.2948 21.7883 15.2948H21.1438V17.4515C21.1438 17.778 20.8719 18.0348 20.5387 18.0348H0.605102C0.271898 18.0348 0 17.778 0 17.4515V6.54854C0 6.222 0.271898 5.9652 0.605102 5.9652H20.5387C20.8719 5.9652 21.1438 6.22199 21.1438 6.54854V8.70519ZM1.26973 16.8681H19.9336V7.13188H1.26973V16.8681ZM21.8478 14.1281C22.3476 14.1281 22.7898 13.6999 22.7898 13.2273V10.7727C22.7898 10.3001 22.3476 9.87189 21.8478 9.87189H21.2033V14.1281H21.8478Z",\n fill: "currentColor"\n }\n) }), Mw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M21.1438 8.70519H21.7883C23.0114 8.70519 24 9.64452 24 10.7156V13.1702C24 14.353 23.0141 15.2948 21.7883 15.2948H21.1438V17.4515C21.1438 17.778 20.8719 18.0348 20.5387 18.0348H0.605102C0.437085 18.0348 0.285565 17.9781 0.175472 17.8748C0.0649432 17.7712 0 17.624 0 17.4515V6.54854C0 6.222 0.271898 5.9652 0.605102 5.9652H20.5387C20.8719 5.9652 21.1438 6.22199 21.1438 6.54854V8.70519ZM9.91804 16.8681L12.4406 7.13188H14.0224L11.4999 16.8681H9.91804ZM7.12141 16.8681L9.64398 7.13188H11.2258L8.7032 16.8681H7.12141ZM4.26522 16.8681L6.78783 7.13188H8.36962L5.84705 16.8681H4.26522ZM1.40907 16.8681L3.93164 7.13188H5.51347L2.9909 16.8681H1.40907ZM2.65698 7.13188L1.21024 12.632V7.13188H2.65698ZM12.8337 16.8681H19.9336V7.13188H15.3563L12.8337 16.8681ZM21.7883 14.1281C22.2881 14.1281 22.7303 13.6999 22.7303 13.2273V10.7727C22.7303 10.3001 22.2881 9.87189 21.7883 9.87189H21.1438V14.1281H21.7883Z",\n fill: "currentColor"\n }\n) }), fw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.0771 0.900072V2.78298C14.2504 2.94559 15.1647 3.30162 15.8843 3.80898C16.6356 4.33878 17.1649 5.02668 17.5558 5.80996C18.3313 7.36387 18.5723 9.32337 18.9207 11.1935C19.2704 13.0706 19.9444 15.318 20.5329 17.1004C20.8752 18.1372 21.2303 19.1704 21.6208 20.1902C21.7246 20.4683 21.6889 20.7906 21.5213 21.0445C21.35 21.3038 21.0483 21.4815 20.6442 21.4815H15.5591C14.4703 24.8395 9.52813 24.8395 8.43925 21.4815H3.35427C2.95017 21.4815 2.64844 21.3038 2.47717 21.0445C2.30783 20.7881 2.27496 20.4602 2.38379 20.1741C2.76817 19.1583 3.1251 18.1316 3.46556 17.1004C4.05401 15.318 4.728 13.0706 5.0777 11.1935C5.4261 9.32332 5.66716 7.36381 6.44259 5.80992C6.83347 5.02664 7.36274 4.33876 8.11413 3.80896C8.8337 3.30161 9.74796 2.9456 10.9214 2.78298V0.900072L10.9269 0.878369C11.036 0.45387 11.4437 0 11.9992 0C12.5548 0 12.9625 0.453869 13.0715 0.878369L13.0771 0.900072ZM9.91357 21.491H14.0848C13.1966 23.0712 10.8018 23.0712 9.91357 21.491ZM3.84294 20.1296H20.1555C19.115 17.3109 18.1446 14.4084 17.5918 11.4411C17.2553 9.63504 17.1294 7.72188 16.1791 6.10477C15.3793 4.74375 13.7046 4.04404 11.9987 4.04434C10.2928 4.04465 8.61845 4.74499 7.81935 6.10477C6.86902 7.72187 6.74313 9.63504 6.40668 11.4411C5.85388 14.4084 4.88343 17.3109 3.84294 20.1296Z",\n fill: "currentcolor"\n }\n) }), gw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 13 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.9 14.1C8.9 14.2 8.9 14.2 8.8 14.3C8.5 15.3 7.5 16 6.4 16C5.3 16 4.3 15.3 4 14.3C4 14.2 4 14.2 3.9 14.1H8.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.8 11.9C12.8 12.1 12.8 12.2 12.7 12.3C12.6 12.5 12.5 12.5 12.3 12.5H0.6C0.4 12.5 0.3 12.4 0.2 12.3C0 12.3 0 12.1 0 11.9L1.6 6.2C1.7 5.7 1.9 5.1 2 4.5V4.3C2.4 2.6 3.8 1.2 5.7 1V0.5C5.7 0.2 6.2 0 6.5 0C6.8 0 7.2 0.2 7.3 0.4V1C9.3 1.2 10.6 2.7 10.9 4.5C11 5 11 5.6 11.2 6.2L12.8 11.9Z",\n fill: "currentColor"\n }\n )\n] }), zw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.0771 0.900072V2.78298C14.2504 2.94559 15.1647 3.30162 15.8843 3.80898C16.6356 4.33878 17.1649 5.02668 17.5558 5.80996C18.3313 7.36387 18.5723 9.32337 18.9207 11.1935C19.2704 13.0706 19.9444 15.318 20.5329 17.1004C20.8752 18.1372 21.2303 19.1704 21.6208 20.1902C21.7246 20.4683 21.6889 20.7906 21.5213 21.0445C21.35 21.3038 21.0483 21.4815 20.6442 21.4815H15.5591C14.4703 24.8395 9.52813 24.8395 8.43925 21.4815H3.35427C2.95017 21.4815 2.64844 21.3038 2.47717 21.0445C2.30783 20.7881 2.27496 20.4602 2.38379 20.1741C2.76817 19.1583 3.1251 18.1316 3.46556 17.1004C4.05401 15.318 4.728 13.0706 5.0777 11.1935C5.4261 9.32332 5.66716 7.36381 6.44259 5.80992C6.83347 5.02664 7.36274 4.33876 8.11413 3.80896C8.8337 3.30161 9.74796 2.9456 10.9214 2.78298V0.900072L10.9269 0.878369C11.036 0.45387 11.4437 0 11.9992 0C12.5548 0 12.9625 0.453869 13.0715 0.878369L13.0771 0.900072ZM9.91357 21.491H14.0848C13.1966 23.0712 10.8018 23.0712 9.91357 21.491ZM3.84294 20.1296H20.1555C19.115 17.3109 18.1446 14.4084 17.5918 11.4411C17.2553 9.63504 17.1294 7.72188 16.1791 6.10477C15.3793 4.74375 13.7046 4.04404 11.9987 4.04434C10.2928 4.04465 8.61845 4.74499 7.81935 6.10477C6.86902 7.72187 6.74313 9.63504 6.40668 11.4411C5.85388 14.4084 4.88343 17.3109 3.84294 20.1296Z",\n fill: "currentcolor"\n }\n) }), Cw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M4.89474 24H19.0461C19.3421 24 19.5789 23.7606 19.5789 23.4613V6.82293H20.4671C20.7632 6.82293 21 6.58354 21 6.28428V3.41147C21 3.11222 20.7632 2.87282 20.4671 2.87282H16.7368C16.5 1.25686 15.079 0 13.4211 0H10.579C8.92108 0 7.50001 1.25686 7.26316 2.87282H3.53291C3.23686 2.87282 3 3.11222 3 3.41147V6.28428C3 6.58354 3.23686 6.82293 3.53291 6.82293H4.42107V23.4613C4.36186 23.7606 4.59869 24 4.89474 24ZM18.5132 22.8628H5.42765V6.82293H18.5132V22.8628ZM10.579 1.07731H13.4211C14.4869 1.07731 15.375 1.79551 15.6119 2.81296H8.32895C8.625 1.85536 9.51319 1.07731 10.579 1.07731ZM4.06582 3.95013H7.73684H16.204H19.875V5.68578H18.9868H4.83555H3.94739V3.95013H4.06582ZM9.63151 21.5458C9.92756 21.5458 10.1644 21.3064 10.1644 21.0072V9.15717C10.1644 8.85793 9.92756 8.61853 9.63151 8.61853C9.33545 8.61853 9.09863 8.85793 9.09863 9.15717V21.0072C9.09863 21.3064 9.33545 21.5458 9.63151 21.5458ZM14.9012 21.0072C14.9012 21.3064 14.6644 21.5458 14.3683 21.5458C14.0723 21.5458 13.8354 21.3064 13.8354 21.0072V9.15717C13.8354 8.85793 14.0723 8.61853 14.3683 8.61853C14.6644 8.61853 14.9012 8.85793 14.9012 9.15717V21.0072Z",\n fill: "currentColor"\n }\n) }), Ow = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.6 8.4V23.4C19.6 23.7 19.4 23.9 19.1 23.9H4.9C4.6 23.9 4.4 23.7 4.4 23.4V8.4H19.6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.5 2.9H16.8C16.5 1.3 15.1 0 13.4 0H10.6C8.9 0 7.5 1.3 7.3 2.9H3.5C3.2 2.9 3 3.1 3 3.4V6.3C3 6.6 3.2 6.8 3.5 6.8H20.4C20.7 6.8 20.9 6.6 20.9 6.3V3.4C21 3.1 20.8 2.9 20.5 2.9ZM9 2.8C9.3 1.8 10.2 1.6 11.2 1.6H12.6C13.7 1.6 14.6 1.8 14.8 2.8H9Z",\n fill: "currentColor"\n }\n )\n] }), mw = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.4 13.4V21.6H18.6V13.4H13.4ZM13 12C12.4477 12 12 12.4477 12 13V22C12 22.5523 12.4477 23 13 23H19C19.5523 23 20 22.5523 20 22V13C20 12.4477 19.5523 12 19 12H13ZM13.4 34.6V26.4H24.6V34.6H13.4ZM12 26C12 25.4477 12.4477 25 13 25H25C25.5523 25 26 25.4477 26 26V35C26 35.5523 25.5523 36 25 36H13C12.4477 36 12 35.5523 12 35V26ZM29.4 34.6V26.4H34.6V34.6H29.4ZM28 26C28 25.4477 28.4477 25 29 25H35C35.5523 25 36 25.4477 36 26V35C36 35.5523 35.5523 36 35 36H29C28.4477 36 28 35.5523 28 35V26ZM23.4 21.6V13.4H34.6V21.6H23.4ZM22 13C22 12.4477 22.4477 12 23 12H35C35.5523 12 36 12.4477 36 13V22C36 22.5523 35.5523 23 35 23H23C22.4477 23 22 22.5523 22 22V13Z",\n fill: "currentColor"\n }\n) }), vw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M16.4571 3.17643C15.8862 3.17639 15.4958 3.34343 15.2164 3.5689C14.9288 3.80091 14.7227 4.12446 14.5775 4.48654C14.2825 5.22197 14.2837 6.00093 14.2853 6.09373V6.09374L14.2855 6.09798L14.6905 13.6022C15.625 12.2752 17.1432 11.4121 18.8571 11.4121C19.8478 11.4121 20.773 11.7005 21.558 12.2L19.4735 5.76241C19.4584 5.71588 19.4467 5.67341 19.4376 5.64004C19.3961 5.48773 19.2013 4.85286 18.7334 4.26649C18.2788 3.69692 17.5735 3.1765 16.4571 3.17643ZM23.4225 14.2664C23.4177 14.2329 23.41 14.1993 23.3992 14.166L20.5577 5.39042C20.552 5.37284 20.5466 5.35386 20.538 5.32217C20.4765 5.09689 20.2274 4.2854 19.6165 3.51976C18.9921 2.73733 17.9836 2.0001 16.4572 2C15.6484 1.99995 15.0056 2.24428 14.5114 2.64297C14.0253 3.03513 13.7173 3.54854 13.5211 4.03755C13.3576 4.44523 13.2643 4.85517 13.2112 5.20298C12.8526 5.03318 12.4344 4.94176 12 4.94176C11.5656 4.94176 11.1474 5.03318 10.7888 5.20298C10.7357 4.85517 10.6424 4.44523 10.4789 4.03755C10.2827 3.54854 9.9747 3.03513 9.48862 2.64297C8.99444 2.24428 8.3516 1.99995 7.54283 2C6.01643 2.0001 5.0079 2.73733 4.38353 3.51976C3.77256 4.2854 3.52346 5.09689 3.46204 5.32217C3.4534 5.35386 3.448 5.37284 3.44231 5.39042L0.600799 14.166C0.590021 14.1993 0.582295 14.2329 0.577464 14.2664C0.208519 14.9965 0 15.8262 0 16.7061C0 19.6298 2.30254 22 5.14286 22C7.97766 22 10.2768 19.639 10.2857 16.7231L10.434 13.9746C10.5084 13.7364 10.6104 13.5096 10.7396 13.3118C11.0284 12.8697 11.4357 12.5886 12 12.5886C12.5643 12.5886 12.9716 12.8697 13.2604 13.3118C13.3896 13.5096 13.4916 13.7364 13.566 13.9746L13.7143 16.7231C13.7232 19.639 16.0223 22 18.8571 22C21.6975 22 24 19.6298 24 16.7061C24 15.8262 23.7915 14.9965 23.4225 14.2664ZM13.4519 11.861L13.1858 6.93061C13.1581 6.86151 13.1429 6.7858 13.1429 6.70641C13.1429 6.63941 13.1033 6.50675 12.8952 6.36397C12.6911 6.22393 12.3763 6.11819 12 6.11819C11.6237 6.11819 11.3089 6.22393 11.1048 6.36397C10.8967 6.50675 10.8571 6.63941 10.8571 6.70641C10.8571 6.7858 10.8419 6.86151 10.8142 6.93061L10.5481 11.861C10.9436 11.5843 11.4274 11.4121 12 11.4121C12.5726 11.4121 13.0564 11.5843 13.4519 11.861ZM7.5429 3.17643C8.11376 3.17639 8.50415 3.34343 8.78363 3.5689C9.0712 3.80091 9.27728 4.12446 9.42252 4.48654C9.71752 5.22197 9.7163 6.00093 9.7147 6.09373V6.09374L9.71449 6.09798L9.3095 13.6022C8.37497 12.2752 6.85683 11.4121 5.14286 11.4121C4.1522 11.4121 3.22697 11.7005 2.44204 12.2L4.52653 5.76241C4.54159 5.71588 4.55329 5.67341 4.56239 5.64004C4.60391 5.48773 4.79873 4.85286 5.26664 4.26649C5.72116 3.69692 6.42649 3.1765 7.5429 3.17643ZM9.14286 16.7061C9.14286 18.9801 7.352 20.8236 5.14286 20.8236C2.93372 20.8236 1.14286 18.9801 1.14286 16.7061C1.14286 14.432 2.93372 12.5886 5.14286 12.5886C7.352 12.5886 9.14286 14.432 9.14286 16.7061ZM18.8571 20.8236C16.648 20.8236 14.8571 18.9801 14.8571 16.7061C14.8571 14.432 16.648 12.5886 18.8571 12.5886C21.0663 12.5886 22.8571 14.432 22.8571 16.7061C22.8571 18.9801 21.0663 20.8236 18.8571 20.8236Z",\n fill: "currentColor"\n }\n) }), yw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.18942 11.7139L1.19122 11.7118L4.05534 8.69542C4.11126 8.62575 4.1804 8.56864 4.25865 8.52786C4.33797 8.48651 4.4248 8.46292 4.51358 8.45875C4.60237 8.45459 4.69091 8.46994 4.77353 8.50373C4.85613 8.53752 4.93084 8.58892 4.99303 8.65442C5.05521 8.71991 5.10354 8.79807 5.13516 8.88382C5.16677 8.96957 5.18105 9.06117 5.17717 9.15286C5.17329 9.24454 5.15132 9.3345 5.11254 9.41704C5.07428 9.49847 5.02042 9.57103 4.95409 9.63011L3.16845 11.5107H9.63382C10.0013 11.5107 10.2991 11.8086 10.2991 12.176C10.2991 12.5435 10.0013 12.8414 9.63382 12.8414H3.16845L4.95409 14.722C5.02042 14.7811 5.07428 14.8536 5.11254 14.935C5.15132 15.0176 5.17329 15.1075 5.17717 15.1992C5.18105 15.2909 5.16677 15.3825 5.13516 15.4683C5.10354 15.554 5.05521 15.6322 4.99303 15.6977C4.93084 15.7632 4.85613 15.8146 4.77353 15.8484C4.69091 15.8821 4.60237 15.8975 4.51358 15.8933C4.4248 15.8892 4.33797 15.8656 4.25865 15.8242C4.18037 15.7834 4.1112 15.7263 4.05526 15.6566L1.17912 12.6085C0.893613 12.304 0.927124 12.0098 1.18942 11.7139ZM24.8104 12.6383L24.8086 12.6403L21.9445 15.6567C21.8886 15.7264 21.8194 15.7835 21.7412 15.8243C21.6619 15.8656 21.5751 15.8892 21.4863 15.8934C21.3975 15.8976 21.3089 15.8822 21.2263 15.8484C21.1437 15.8146 21.069 15.7632 21.0068 15.6977C20.9446 15.6322 20.8963 15.5541 20.8647 15.4683C20.8331 15.3826 20.8188 15.291 20.8227 15.1993C20.8266 15.1076 20.8485 15.0176 20.8873 14.9351C20.9256 14.8537 20.9794 14.7811 21.0458 14.722L22.8314 12.8414H16.366C15.9986 12.8414 15.7007 12.5435 15.7007 12.1761C15.7007 11.8087 15.9986 11.5108 16.366 11.5108H22.8314L21.0458 9.63016C20.9794 9.57108 20.9256 9.49852 20.8873 9.41709C20.8485 9.33456 20.8266 9.24459 20.8227 9.15291C20.8188 9.06122 20.8331 8.96962 20.8647 8.88387C20.8963 8.79812 20.9446 8.71996 21.0068 8.65447C21.069 8.58897 21.1437 8.53757 21.2263 8.50378C21.3089 8.46999 21.3975 8.45464 21.4863 8.45881C21.5751 8.46297 21.6619 8.48657 21.7412 8.52791C21.8195 8.56871 21.8887 8.62585 21.9446 8.69556L24.8207 11.7436C25.0389 11.9764 25.0154 12.407 24.8104 12.6383ZM12.949 21.3523C12.5536 21.3523 12.2331 21.0317 12.2331 20.6363V3.71597C12.2331 3.32055 12.5536 3 12.949 3C13.3445 3 13.665 3.32055 13.665 3.71597V20.6363C13.665 21.0317 13.3445 21.3523 12.949 21.3523Z",\n fill: "currentColor"\n }\n) }), Lw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.4613 5.83278H15.4414V3.53114C15.4414 3.23606 15.202 3 14.9027 3H9.15711C8.85786 3 8.61845 3.23606 8.61845 3.53114V5.83278H0.538653C0.239401 5.83278 0 6.06884 0 6.36392V20.4688C0 20.7639 0.239401 21 0.538653 21H23.4613C23.7606 21 24 20.7639 24 20.4688V6.36392C24 6.06884 23.7606 5.83278 23.4613 5.83278ZM9.15711 6.89507H14.9027H20.0499V19.9377H3.95012V6.89507H9.15711ZM9.69576 4.12131H14.3042V5.83278H9.69576V4.12131ZM1.13716 6.89507H2.87282V19.9377H1.13716V6.89507ZM22.9227 19.9377H21.187V6.89507H22.9227V19.9377Z",\n fill: "currentColor"\n }\n) }), ww = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.5 6.5H16.1V4.3C16.1 3.6 15.5 3 14.8 3H9.2C8.5 3 7.9 3.6 7.9 4.3V6.6H0.5C0.2 6.5 0 6.8 0 7.1V21.2C0 21.5 0.2 21.7 0.5 21.7H23.4C23.7 21.7 23.9 21.5 23.9 21.2V7.1C24 6.8 23.8 6.5 23.5 6.5ZM9.7 4.8H14.3V6.5H9.7V4.8Z",\n fill: "currentColor"\n }\n) }), qw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.46 5.83278H15.42V3.53114C15.42 3.23606 15.18 3 14.88 3H9.12C8.82 3 8.58 3.23606 8.58 3.53114V5.83278H0.540001C0.240001 5.83278 0 6.06884 0 6.36392V20.4688C0 20.7639 0.240001 21 0.540001 21H23.46C23.76 21 24 20.7639 24 20.4688V6.36392C24 6.06884 23.76 5.83278 23.46 5.83278ZM9.66 4.12131H14.28V5.83278H9.66V4.12131ZM9.12 6.89507H14.88H22.86V11.4393H14.82H9.06H1.02V6.89507H9.12ZM14.22 12.5606C13.98 13.5639 13.08 14.2721 12 14.2721C10.92 14.2721 10.02 13.5639 9.78 12.5606H14.22ZM1.02 19.9377V12.5606H8.58C8.82 14.1541 10.26 15.3934 11.94 15.3934C13.62 15.3934 15.06 14.1541 15.3 12.5606H22.86V19.9377H1.02Z",\n fill: "currentColor"\n }\n) }), xw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.9304 20.2296C22.9972 20.2963 23.1309 20.2963 23.1978 20.2963C23.3315 20.2963 23.532 20.2296 23.6657 20.0961C23.8663 19.9626 24 19.6956 24 19.4286V1.34083C24 1.07385 23.8663 0.806873 23.6657 0.673384C23.4652 0.47315 23.1978 0.473162 22.9304 0.539907L10.4782 4.8114H1.93873C0.869084 4.8114 0 5.67907 0 6.74699V14.0222C0 15.0901 0.869084 15.9578 1.93873 15.9578H2.33969V21.4976C2.33969 22.5656 3.20878 23.5 4.34528 23.5H7.0194V19.0283H8.62407L9.88224 15.9578H10.4773L22.9304 20.2296ZM5.68255 16.0246H3.67675V21.4976C3.67675 21.8981 4.01102 22.2318 4.41214 22.2318H5.74919V19.0283H5.68255V16.0246ZM11.1644 14.8233L22.6629 18.7612V2.00828L11.1644 5.94617V14.8233ZM1.33706 6.74699C1.33706 6.41326 1.60447 6.14629 1.93873 6.14629H9.82737V14.6229H1.93873C1.60447 14.6229 1.33706 14.3559 1.33706 14.0222V6.74699ZM7.75499 17.6934H7.0196V15.9581H8.49037L7.75499 17.6934Z",\n fill: "currentColor"\n }\n) }), Rw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M6 10.6C8.54051 10.6 10.6 8.54051 10.6 6C10.6 3.45949 8.54051 1.4 6 1.4C3.45949 1.4 1.4 3.45949 1.4 6C1.4 8.54051 3.45949 10.6 6 10.6ZM20 15.6C21.4359 15.6 22.6 14.4359 22.6 13C22.6 11.5641 21.4359 10.4 20 10.4C18.5641 10.4 17.4 11.5641 17.4 13C17.4 14.4359 18.5641 15.6 20 15.6ZM11 22.6C11.8837 22.6 12.6 21.8837 12.6 21C12.6 20.1163 11.8837 19.4 11 19.4C10.1163 19.4 9.4 20.1163 9.4 21C9.4 21.8837 10.1163 22.6 11 22.6ZM12 6C12 9.31371 9.31371 12 6 12C2.68629 12 0 9.31371 0 6C0 2.68629 2.68629 0 6 0C9.31371 0 12 2.68629 12 6ZM24 13C24 15.2091 22.2091 17 20 17C17.7909 17 16 15.2091 16 13C16 10.7909 17.7909 9 20 9C22.2091 9 24 10.7909 24 13ZM11 24C12.6569 24 14 22.6569 14 21C14 19.3431 12.6569 18 11 18C9.34315 18 8 19.3431 8 21C8 22.6569 9.34315 24 11 24Z",\n fill: "currentcolor"\n }\n) }), Bw = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11 24C12.6569 24 14 22.6569 14 21C14 19.3431 12.6569 18 11 18C9.34315 18 8 19.3431 8 21C8 22.6569 9.34315 24 11 24Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20 17C22.2091 17 24 15.2091 24 13C24 10.7909 22.2091 9 20 9C17.7909 9 16 10.7909 16 13C16 15.2091 17.7909 17 20 17Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M6 12C9.31371 12 12 9.31371 12 6C12 2.68629 9.31371 0 6 0C2.68629 0 0 2.68629 0 6C0 9.31371 2.68629 12 6 12Z",\n fill: "currentcolor"\n }\n )\n] }), Ww = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.1951 3.26345H21.8803C22.2246 3.26345 22.5 3.5354 22.5 3.87534V10.4023V23.3881C22.5 23.728 22.2246 24 21.8803 24H2.11969C1.77543 24 1.5 23.728 1.5 23.3881V10.4023V3.87534C1.5 3.5354 1.77543 3.26345 2.11969 3.26345H4.80491V0.611894C4.80491 0.27195 5.08034 0 5.4246 0C5.76886 0 6.04425 0.27195 6.04425 0.611894V3.26345H17.9558V0.611894C17.9558 0.27195 18.2311 0 18.5754 0C18.9197 0 19.1951 0.27195 19.1951 0.611894V3.26345ZM4.73607 4.48723H2.73934H2.6705V9.72237H21.123V4.48723H19.1262V7.13881C19.1262 7.47875 18.8508 7.7507 18.5066 7.7507C18.1623 7.7507 17.8869 7.47875 17.8869 7.13881V4.48723H5.97541V7.13881C5.97541 7.47875 5.69998 7.7507 5.35572 7.7507C5.01146 7.7507 4.73607 7.47875 4.73607 7.13881V4.48723ZM2.80821 22.7762H21.2607V11.0141H2.80821V22.7762ZM11.3458 14.8215L10.0376 15.7053C9.76224 15.9093 9.34911 15.8413 9.14256 15.5694C8.93601 15.2974 9.00486 14.8895 9.28027 14.6855L11.5523 13.1218C11.7589 12.9859 12.0343 12.9179 12.2408 13.0539C12.4474 13.1218 12.5851 13.3938 12.5851 13.5978V20.1245C12.5851 20.4644 12.3097 20.7364 11.9654 20.7364C11.6212 20.7364 11.3458 20.4644 11.3458 20.1245V14.8215Z",\n fill: "currentColor"\n }\n) }), Ew = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.1368 14.8392L17.1368 14.8377C17.1368 12.1273 14.8485 9.87561 12.0893 9.87561C9.32947 9.87561 7.0417 12.0694 7.0417 14.8377C7.0417 17.5485 9.27103 19.7997 12.0893 19.7997C14.9089 19.7997 17.1954 17.5475 17.1368 14.8392ZM18.0086 5.81615H23.4543C23.8117 5.81615 24 6.084 24 6.42556V20.396C24 20.7281 23.7297 20.9923 23.3948 20.9923H0.605215C0.270325 20.9923 0 20.7281 0 20.396V6.41241C0 6.08028 0.270328 5.81615 0.605215 5.81615H6.05095L8.70824 3.20326C8.84125 3.07247 9.03774 3.00774 9.17362 3.00774H14.8859C15.085 3.00774 15.221 3.07513 15.3513 3.20326L18.0086 5.81615ZM9.49897 4.25877L7.8605 5.81615H16.2627L14.6789 4.25877H9.49897ZM22.7896 7.00867H1.32942V19.7997H8.35544C6.77717 18.6676 5.77178 16.8901 5.77178 14.8377C5.77178 11.4046 8.60072 8.62456 12.0893 8.62456C15.5778 8.62456 18.4067 11.4046 18.4067 14.8377C18.4067 16.8349 17.3451 18.6643 15.8166 19.7997H22.7896V7.00867ZM8.62788 14.8376C8.62788 12.9843 10.2072 11.433 12.0891 11.433C14.0305 11.433 15.5504 12.9258 15.5504 14.8376C15.5504 16.6909 13.971 18.2421 12.0891 18.2421C10.2072 18.2421 8.62788 16.6909 8.62788 14.8376ZM9.83827 14.7791C9.83827 16.0255 10.8758 16.9912 12.0891 16.9912C13.3025 16.9912 14.34 16.0255 14.34 14.7791C14.34 13.5327 13.3025 12.567 12.0891 12.567C10.8187 12.567 9.83827 13.5889 9.83827 14.7791Z",\n fill: "currentColor"\n }\n) }), Sw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M2.3658 6.79341H0.657642C0.291608 6.79341 0.0475848 6.48349 0.108591 6.23556V1.6488C0.108591 1.33888 0.352613 1.09095 0.657642 1.09095H23.3518C23.6568 1.09095 23.9008 1.33888 23.9008 1.6488V6.23556C23.9008 6.54547 23.6568 6.79341 23.3518 6.79341H21.6436V22.3512C21.6436 22.6611 21.3996 22.9091 21.0946 22.9091H2.91485C2.60982 22.9091 2.3658 22.6611 2.3658 22.3512V6.79341ZM3.46391 21.7314H20.4845V6.79341H3.46391V21.7314ZM22.7417 2.14466H1.20669V5.61573H22.7417V2.14466ZM16.5187 13.6735H7.42916C7.12414 13.6735 6.88012 13.4256 6.88012 13.1157V10.8223C6.88012 10.5124 7.12414 10.2645 7.42916 10.2645H16.5187C16.8238 10.2645 17.0678 10.5124 17.0678 10.8223V13.1157C17.0678 13.4256 16.8238 13.6735 16.5187 13.6735ZM15.9087 11.3802H7.97819V12.5578H15.9087V11.3802Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M2.26662 6.89258H0.657636C0.44583 6.89258 0.267044 6.80269 0.149765 6.67436C0.0369522 6.55093 -0.0247792 6.38417 0.00941138 6.22435V1.6488C0.00941138 1.2856 0.296355 0.991776 0.657636 0.991776H23.3518C23.7131 0.991776 24 1.2856 24 1.6488V6.23556C24 6.59875 23.7131 6.89258 23.3518 6.89258H21.7428V22.3512C21.7428 22.7144 21.4558 23.0082 21.0946 23.0082H2.91485C2.55357 23.0082 2.26662 22.7144 2.26662 22.3512V6.89258ZM0.108591 6.23556C0.0475848 6.48349 0.291608 6.79341 0.657642 6.79341H2.3658V22.3512C2.3658 22.6611 2.60982 22.9091 2.91485 22.9091H21.0946C21.3996 22.9091 21.6436 22.6611 21.6436 22.3512V6.79341H23.3518C23.6568 6.79341 23.9008 6.54547 23.9008 6.23556V1.6488C23.9008 1.33888 23.6568 1.09095 23.3518 1.09095H0.657642C0.352613 1.09095 0.108591 1.33888 0.108591 1.6488V6.23556ZM3.56307 21.6322H20.3853V6.89258H3.56307V21.6322ZM22.6425 2.24384H1.30586V5.51655H22.6425V2.24384ZM16.5187 13.7727H7.42916C7.06788 13.7727 6.78095 13.4788 6.78095 13.1157V10.8223C6.78095 10.4592 7.06788 10.1653 7.42916 10.1653H16.5187C16.88 10.1653 17.167 10.4592 17.167 10.8223V13.1157C17.167 13.4788 16.88 13.7727 16.5187 13.7727ZM15.8095 11.4793H8.07737V12.4586H15.8095V11.4793ZM3.46391 21.7314V6.79341H20.4845V21.7314H3.46391ZM22.7417 2.14466V5.61573H1.20669V2.14466H22.7417ZM7.42916 13.6735H16.5187C16.8238 13.6735 17.0678 13.4256 17.0678 13.1157V10.8223C17.0678 10.5124 16.8238 10.2645 16.5187 10.2645H7.42916C7.12414 10.2645 6.88012 10.5124 6.88012 10.8223V13.1157C6.88012 13.4256 7.12414 13.6735 7.42916 13.6735ZM15.9087 11.3802V12.5578H7.97819V11.3802H15.9087Z",\n fill: "currentColor"\n }\n )\n] }), kw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.601341 23.0042H6.79098C7.12549 23.0042 7.39232 22.7331 7.39232 22.3958V1.60415C7.39232 1.26692 7.12549 0.995773 6.79098 0.995773H0.601341C0.266831 0.995773 0 1.26692 0 1.60415V22.3958C0 22.7331 0.26683 23.0042 0.601341 23.0042ZM1.26397 2.21252H6.25092V21.7254H1.26397V2.21252ZM3.727 15.3948C3.3925 15.3948 3.12567 15.6659 3.12567 16.0031V20.2855C3.12567 20.6227 3.3925 20.8938 3.727 20.8938C4.0615 20.8938 4.32833 20.6227 4.32833 20.2855V16.0031C4.32833 15.6659 4.0615 15.3948 3.727 15.3948ZM15.1254 23.0042C15.46 23.0042 15.7268 22.7331 15.7268 22.3958V1.60415C15.7268 1.26692 15.46 0.995773 15.1254 0.995773H8.93582C8.60131 0.995773 8.33447 1.26692 8.33447 1.60415V22.3958C8.33447 22.7331 8.60131 23.0042 8.93582 23.0042H15.1254ZM16.6077 1.60415V22.3958C16.6077 22.7331 16.8745 23.0042 17.209 23.0042H23.3987C23.7332 23.0042 24 22.7331 24 22.3958V1.60415C24 1.26692 23.7332 0.995773 23.3987 0.995773H17.209C16.8745 0.995773 16.6077 1.26692 16.6077 1.60415ZM22.7973 21.7254H17.8104V2.21252H22.7973V21.7254ZM20.3347 15.3948C20.0002 15.3948 19.7333 15.6659 19.7333 16.0031V20.2855C19.7333 20.6227 20.0002 20.8938 20.3347 20.8938C20.6692 20.8938 20.936 20.6227 20.936 20.2855V16.0031C20.936 15.6659 20.6692 15.3948 20.3347 15.3948ZM9.53716 21.7254H14.5241V2.21252H9.53716V21.7254ZM12.0002 15.3948C11.6657 15.3948 11.3989 15.6659 11.3989 16.0031V20.2855C11.3989 20.6227 11.6657 20.8938 12.0002 20.8938C12.3347 20.8938 12.6015 20.6227 12.6015 20.2855V16.0079C12.6015 15.645 12.3314 15.3948 12.0002 15.3948Z",\n fill: "currentColor"\n }\n) }), Nw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.4769 10.1467C18.2027 9.87718 18.2027 9.54022 18.4769 9.27066L21.1497 6.70984C22.0407 5.83376 22.0407 4.41856 21.1497 3.54248L20.6015 3.00337C19.7105 2.12729 18.2713 2.12729 17.3803 3.00337L9.90997 10.3489C9.01901 11.225 9.01901 12.6402 9.90997 13.5163C10.1841 13.7858 10.1841 14.1228 9.90997 14.3923C9.77289 14.5271 9.56729 14.5945 9.43022 14.5945C9.22461 14.5945 9.08754 14.5271 8.95047 14.3923C7.57977 13.0445 7.57977 10.8207 8.95047 9.47284L16.4208 2.12728C17.7915 0.779473 20.0532 0.779473 21.4239 2.12728L21.9722 2.66641C23.3429 4.01422 23.3429 6.23809 21.9722 7.5859L19.3678 10.1467C19.0937 10.4163 18.751 10.4163 18.4769 10.1467ZM5.52332 13.8533C5.79746 14.1229 5.79746 14.4598 5.52332 14.7294L2.91898 17.2902C2.02803 18.1662 2.02803 19.5814 2.91898 20.4575L3.5358 20.9966C4.42676 21.8727 5.866 21.8727 6.75695 20.9966L14.2273 13.6511C15.1182 12.775 15.1182 11.3599 14.2273 10.4838C13.9531 10.2142 13.9531 9.87726 14.2273 9.6077C14.5014 9.33814 14.8441 9.33814 15.1182 9.6077C16.4889 10.9555 16.4889 13.1794 15.1182 14.5272L7.64791 21.8727C6.96256 22.5466 6.00307 22.8836 5.11211 22.8836C4.15262 22.8836 3.26166 22.5466 2.57631 21.8727L2.02803 21.3336C0.657324 19.9858 0.657324 17.7619 2.02803 16.4141L4.63236 13.8533C4.9065 13.5837 5.24918 13.5837 5.52332 13.8533Z",\n fill: "currentColor"\n }\n) }), Iw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M1.17979 21.8444L23.7532 3.25524C24.4916 2.7076 23.5582 1.61094 22.8093 2.16633L1.41574 19.7444V6.44419C1.41574 5.53934 0 5.53936 0 6.44419V21.3C0 21.9934 0.688854 22.0872 1.17979 21.8444Z",\n fill: "currentColor"\n }\n) }), Tw = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.9 3.4C23.9 3.7 23.7 4.1 23.5 4.3L2.1 21.9H2C1.8 22 1.5 22.1 1.3 22.1C1.1 22.1 1 22.1 0.8 22C0.3 21.9 0 21.4 0 20.9V6.8C0 6.4 0.2 6.1 0.4 5.8C0.7 5.7 1 5.5 1.3 5.5C1.6 5.5 1.9 5.6 2.2 5.8C2.5 6 2.6 6.4 2.6 6.8V18.1L21.8 2.3C22.1 2.1 22.3 2 22.6 2C23 2 23.4 2.2 23.6 2.5C23.9 2.7 24 3.1 23.9 3.4Z",\n fill: "currentColor"\n }\n) }), Dw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.7647 6.86422C23.9216 6.70372 24 6.54322 24 6.30248C24 6.14199 23.9216 5.90124 23.7647 5.74074C23.451 5.41975 23.0588 5.41975 22.7451 5.74074L12 16.7346L1.2549 5.74074C0.941177 5.41975 0.54902 5.41975 0.235294 5.74074C-0.0784314 6.06173 -0.0784314 6.46295 0.235294 6.78394L11.451 18.2593C11.7647 18.5802 12.1569 18.5802 12.4706 18.2593L23.7647 6.86422Z",\n fill: "currentColor"\n }\n) }), Hw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M12.9477 18.208L23.574 7.48676L23.5775 7.48324C23.8374 7.21735 24 6.89469 24 6.46116C24 6.14048 23.864 5.73222 23.5775 5.43907C23.3262 5.18199 22.987 5 22.5928 5C22.1987 5 21.8595 5.18199 21.6082 5.43907L12 15.2697L2.39178 5.43907C2.14051 5.18199 1.80129 5 1.40715 5C1.01301 5 0.673793 5.18199 0.422523 5.43907C0.17054 5.69689 0 6.03666 0 6.42338C0 6.8101 0.17054 7.14987 0.422523 7.40769L10.9785 18.208C11.2297 18.4651 11.5689 18.6471 11.9631 18.6471C12.3562 18.6471 12.6947 18.466 12.9457 18.21L12.9477 18.208Z",\n fill: "currentColor"\n }\n) }), Pw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M11.0523 5.43907L0.425988 16.1603L0.422525 16.1638C0.162648 16.4297 0 16.7524 0 17.1859C0 17.5066 0.136008 17.9148 0.422525 18.208C0.673794 18.4651 1.01301 18.6471 1.40715 18.6471C1.8013 18.6471 2.14051 18.4651 2.39178 18.208L12 8.37733L21.6082 18.208C21.8595 18.4651 22.1987 18.6471 22.5928 18.6471C22.987 18.6471 23.3262 18.4651 23.5775 18.208C23.8295 17.9502 24 17.6104 24 17.2237C24 16.837 23.8295 16.4972 23.5775 16.2394L13.0215 5.43907C12.7703 5.18198 12.4311 5 12.0369 5C11.6438 5 11.3053 5.18103 11.0543 5.43705L11.0523 5.43907Z",\n fill: "currentColor"\n }\n) }), Vw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M17.1358 23.7647C17.2963 23.9216 17.4568 24 17.6975 24C17.858 24 18.0988 23.9216 18.2593 23.7647C18.5802 23.451 18.5802 23.0588 18.2593 22.7451L7.26541 12L18.2593 1.2549C18.5802 0.941177 18.5802 0.54902 18.2593 0.235294C17.9383 -0.0784314 17.537 -0.0784314 17.2161 0.235294L5.74074 11.451C5.41975 11.7647 5.41975 12.1569 5.74074 12.4706L17.1358 23.7647Z",\n fill: "currentColor"\n }\n) }), Fw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M5.73856 23.7647C5.89809 23.9216 6.0576 24 6.29689 24C6.53619 24 6.69572 23.9216 6.85525 23.7647L18.2615 12.549C18.5805 12.2353 18.5805 11.8431 18.2615 11.5294L6.77548 0.235294C6.45643 -0.0784314 6.05762 -0.0784314 5.73856 0.235294C5.4195 0.54902 5.4195 0.941177 5.73856 1.2549L16.6662 12L5.73856 22.7451C5.4195 22.9804 5.4195 23.451 5.73856 23.7647Z",\n fill: "currentColor"\n }\n) }), Uw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 25", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M18.3845 11.8758L7.66328 1.2495L7.65976 1.24604C7.39387 0.986165 7.0712 0.823517 6.63767 0.823517C6.31699 0.823517 5.90874 0.959525 5.61559 1.24604C5.3585 1.49731 5.17651 1.83653 5.17651 2.23067C5.17651 2.62481 5.3585 2.96403 5.61559 3.2153L15.4462 12.8235L5.61559 22.4317C5.3585 22.683 5.17651 23.0222 5.17651 23.4164C5.17651 23.8105 5.3585 24.1497 5.61559 24.401C5.8734 24.653 6.21317 24.8235 6.59989 24.8235C6.98662 24.8235 7.32639 24.653 7.5842 24.401L18.3845 13.8451C18.6416 13.5938 18.8236 13.2546 18.8236 12.8604C18.8236 12.4673 18.6425 12.1288 18.3865 11.8778L18.3845 11.8758Z",\n fill: "currentColor"\n }\n) }), Yw = () => /* @__PURE__ */ A(\n "svg",\n {\n width: "24",\n height: "25",\n viewBox: "0 0 24 25",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: /* @__PURE__ */ A(\n "path",\n {\n d: "M5.61534 11.8758L16.3366 1.2495L16.3401 1.24604C16.606 0.986165 16.9286 0.823517 17.3622 0.823517C17.6828 0.823517 18.0911 0.959525 18.3843 1.24604C18.6413 1.49731 18.8233 1.83653 18.8233 2.23067C18.8233 2.62481 18.6413 2.96403 18.3843 3.2153L8.5536 12.8235L18.3843 22.4317C18.6413 22.683 18.8233 23.0222 18.8233 23.4164C18.8233 23.8105 18.6413 24.1497 18.3843 24.401C18.1264 24.653 17.7867 24.8235 17.3999 24.8235C17.0132 24.8235 16.6735 24.653 16.4156 24.401L5.61534 13.8451C5.35825 13.5938 5.17627 13.2546 5.17627 12.8604C5.17627 12.4673 5.3573 12.1288 5.61332 11.8778L5.61534 11.8758Z",\n fill: "currentColor"\n }\n )\n }\n), Xw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0.235296 17.1358C0.078434 17.2963 0 17.4568 0 17.6975C0 17.858 0.078434 18.0988 0.235296 18.2593C0.549021 18.5802 0.941177 18.5802 1.2549 18.2593L12 7.26541L22.7451 18.2593C23.0588 18.5802 23.451 18.5802 23.7647 18.2593C24.0784 17.9383 24.0784 17.537 23.7647 17.2161L12.549 5.74074C12.2353 5.41975 11.8431 5.41975 11.5294 5.74074L0.235296 17.1358Z",\n fill: "currentColor"\n }\n) }), Qw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A("g", { clipPath: "url(#clip0_2346_129556)", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24ZM7.29289 7.29289C6.90237 7.68342 6.90237 8.31658 7.29289 8.70711L10.5858 12L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L12 13.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L13.4142 12L16.7071 8.70711C17.0976 8.31658 17.0976 7.68342 16.7071 7.29289C16.3166 6.90237 15.6834 6.90237 15.2929 7.29289L12 10.5858L8.70711 7.29289C8.31658 6.90237 7.68342 6.90237 7.29289 7.29289Z",\n fill: "currentColor"\n }\n ) }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2346_129556", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), Gw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.256584 12.5246C-0.0690224 12.258 -0.101531 11.7514 0.256258 11.4529L7.23551 5.64658C7.40425 5.50188 7.58479 5.4607 7.75051 5.49623C7.91371 5.53121 8.05393 5.63862 8.15063 5.77522C8.34182 6.04531 8.38119 6.46381 8.05097 6.71864L1.7183 11.9933L8.05163 17.2591C8.23416 17.4091 8.32174 17.5874 8.33384 17.7642C8.34584 17.9396 8.28317 18.1068 8.1778 18.2359C8.07254 18.3649 7.92217 18.459 7.75418 18.4853C7.58456 18.512 7.40144 18.4688 7.23589 18.3309L0.256584 12.5246ZM9.48509 19.148L13.2655 4.47971C13.3133 4.27736 13.4314 4.14071 13.5802 4.06676C13.7274 3.99362 13.9001 3.98383 14.0572 4.02464C14.2144 4.06548 14.3612 4.15832 14.4544 4.29712C14.5486 4.4374 14.5845 4.61955 14.5272 4.82942L10.7468 19.4977C10.6945 19.7062 10.5749 19.8488 10.4256 19.9271C10.2777 20.0047 10.1052 20.0173 9.94836 19.9765C9.79143 19.9356 9.64629 19.8403 9.55483 19.6973C9.46258 19.553 9.42838 19.3653 9.48509 19.148ZM15.9612 6.71845C15.7928 6.58608 15.715 6.41639 15.7078 6.24504C15.7006 6.07532 15.7628 5.90841 15.8656 5.77733C15.9685 5.64625 16.1155 5.54683 16.2829 5.51712C16.4523 5.48706 16.6363 5.52962 16.8067 5.67143L23.7556 11.4524C24.0832 11.7209 24.0796 12.2593 23.7559 12.5245L16.7765 18.3309C16.6109 18.4688 16.4287 18.5085 16.2604 18.4771C16.0941 18.4461 15.9464 18.3467 15.8432 18.2151C15.7399 18.0835 15.678 17.9155 15.6885 17.743C15.6992 17.5689 15.7835 17.3964 15.9613 17.2586L22.2941 11.9933L15.9612 6.71845Z",\n fill: "currentcolor"\n }\n) }), jw = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.7 11.3C21.8 10.4 20.7 9.9 19.5 9.9C19.3 9.9 19.1 9.9 18.9 10C17.9 7 15.2 5 12 5C9.9 5 7.9 6 6.6 7.6C6.3 7.6 6.1 7.5 5.8 7.5C2.6 7.5 0 10.2 0 13.4C0 16.6 2.6 19.3 5.8 19.3H19.4C21.9 19.3 24 17.2 24 14.6C24 13.4 23.5 12.2 22.7 11.3ZM19.4 17.5H5.9C3.7 17.5 1.9 15.7 1.9 13.4C1.9 11.1 3.7 9.3 5.9 9.3C6.2 9.3 6.6 9.4 6.8 9.4C6.9 9.4 6.9 9.4 7 9.4C7.3 9.4 7.6 9.3 7.8 9C8.9 7.5 10.4 6.7 12.1 6.7C14.7 6.7 16.9 8.6 17.3 11.1C17.3 11.4 17.4 11.7 17.7 11.9C17.8 12 18 12.1 18.1 12.1C18.2 12.1 18.4 12.1 18.5 12C18.8 11.9 19.2 11.8 19.5 11.8C21 11.8 22.3 13.1 22.3 14.7C22.2 16.2 21 17.5 19.4 17.5Z",\n fill: "currentColor"\n }\n) }), Kw = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.0492158 14.775C0.124142 14.55 0.273995 14.4 0.498775 14.325C1.54775 13.95 2.52179 13.65 3.57076 13.425V10.575C2.67164 10.35 1.6976 10.05 0.573702 9.67502C0.348922 9.60002 0.199069 9.45 0.124142 9.22499C0.0492158 8.99999 0.124142 8.775 0.199069 8.625L3.19613 3.44998C3.34598 3.22498 3.49584 3.07498 3.72062 3.07498C3.9454 2.99998 4.17018 3.07499 4.32003 3.22499C5.21915 3.97499 5.96841 4.64998 6.64275 5.32498L9.0404 3.90001C8.81562 2.92501 8.59084 1.94998 8.36606 0.824982C8.36606 0.599982 8.36606 0.374991 8.51592 0.224991C8.66577 0.0749909 8.81562 0 9.0404 0H15.0345C15.2593 0 15.4092 0.0749909 15.559 0.224991C15.7089 0.374991 15.7838 0.599982 15.7089 0.824982C15.4841 2.02498 15.2593 3.00001 15.0345 3.90001L17.4322 5.32498C18.1065 4.64998 18.8558 3.97499 19.7549 3.22499C19.9048 3.07499 20.1295 3.07498 20.3543 3.07498C20.5791 3.14998 20.8039 3.29998 20.8788 3.44998L23.8759 8.625C24.0257 8.85 24.0257 8.99999 23.9508 9.22499C23.8759 9.45 23.726 9.60002 23.5012 9.67502C22.3773 10.05 21.4033 10.35 20.5042 10.575V13.425C21.4033 13.65 22.3773 13.95 23.5012 14.325C23.726 14.4 23.8759 14.55 23.9508 14.775C24.0257 15 23.9508 15.225 23.8759 15.375L20.8788 20.55C20.7289 20.775 20.5791 20.925 20.3543 20.925C20.1295 21 19.9048 20.925 19.7549 20.775C18.8558 20.025 18.1065 19.35 17.4322 18.675L15.0345 20.1C15.2593 21.075 15.4841 22.05 15.7089 23.175C15.7089 23.4 15.7089 23.625 15.559 23.775C15.4092 23.925 15.2593 24 15.0345 24H9.0404C8.81562 24 8.66577 23.925 8.51592 23.775C8.36606 23.625 8.29114 23.4 8.36606 23.175C8.59084 21.975 8.81562 21 9.0404 20.1L6.56783 18.675C5.89349 19.35 5.14422 20.025 4.2451 20.775C4.09525 20.925 3.87047 20.925 3.64569 20.925C3.42091 20.85 3.19613 20.7 3.1212 20.55L0.124142 15.375C-0.0257108 15.15 -0.0257107 15 0.0492158 14.775ZM4.31996 9.37499L4.32003 9.375C4.61974 9.45 4.84451 9.67502 4.84451 10.05V13.95C4.84451 14.25 4.61974 14.55 4.32003 14.625L4.31996 14.625C3.49579 14.85 2.67162 15.075 1.6976 15.375L3.87047 19.05C4.61973 18.375 5.21915 17.775 5.81856 17.175C6.04334 16.95 6.34305 16.875 6.64275 17.025L10.0144 18.975C10.2392 19.2 10.3891 19.5 10.3142 19.8C10.2107 20.3178 10.0715 20.9072 9.92127 21.5433C9.85391 21.8286 9.78433 22.1232 9.71474 22.425H13.9856C13.8357 21.45 13.6109 20.625 13.3861 19.8C13.3112 19.425 13.3861 19.125 13.6858 18.975L17.0575 17.025C17.2823 16.875 17.657 16.95 17.8817 17.175C18.4811 17.775 19.0806 18.375 19.8298 19.05L22.0027 15.375C21.0287 15.075 20.2045 14.85 19.3803 14.625L19.3803 14.625C19.0806 14.55 18.8558 14.25 18.8558 13.95V10.05C18.8558 9.75002 19.0806 9.45 19.3803 9.375L19.3803 9.375C20.2045 9.15 21.0287 8.925 22.0027 8.625L19.8298 4.94998C19.0806 5.62498 18.4811 6.22498 17.8817 6.82498C17.657 7.04998 17.3572 7.12499 17.0575 6.97499L13.6858 5.02501C13.4611 4.80001 13.3112 4.49998 13.3861 4.19998C13.487 3.6448 13.6218 3.08961 13.7676 2.48871C13.8385 2.19668 13.912 1.89385 13.9856 1.57498H9.71474C9.86459 2.54998 10.0894 3.37498 10.3142 4.19998C10.3891 4.57498 10.3142 4.87501 10.0144 5.02501L6.64275 6.97499C6.41797 7.12499 6.04334 7.04998 5.81856 6.82498C5.21915 6.22498 4.61973 5.62498 3.87047 4.94998L1.6976 8.625C2.67162 8.925 3.49579 9.14999 4.31996 9.37499ZM16.1581 12C16.1581 14.3249 14.21 16.2749 11.8874 16.2749C9.48981 16.2749 7.6167 14.3249 7.6167 12C7.6167 9.67507 9.56474 7.72511 11.8874 7.72511C14.21 7.72511 16.1581 9.67507 16.1581 12ZM14.8094 12C14.8094 10.3501 13.4608 9.07507 11.8874 9.07507C10.2391 9.07507 8.96534 10.3501 8.96534 12C8.96534 13.65 10.314 14.9249 11.8874 14.9249C13.5357 14.9249 14.8094 13.575 14.8094 12Z",\n fill: "currentColor"\n }\n) }), Zw = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.5 14.3C22.4 13.9 21.4 13.6 20.5 13.4V10.5C21.4 10.3 22.4 10 23.5 9.6C23.7 9.5 23.9 9.4 24 9.1C24 9 24 8.9 23.9 8.6L20.9 3.4C20.8 3.3 20.6 3.1 20.4 3C20.2 3 20 3 19.8 3.2C18.9 4 18.2 4.6 17.5 5.3L15 3.9C15.3 3 15.5 2 15.7 0.8C15.8 0.6 15.7 0.3 15.5 0.2C15.4 0.1 15.3 0 15 0H9C8.8 0 8.7 0.1 8.5 0.2C8.4 0.4 8.4 0.6 8.4 0.8C8.6 2 8.8 2.9 9 3.9L6.6 5.3C6 4.7 5.2 4 4.3 3.2C4.2 3.1 4 3 3.7 3.1C3.5 3.1 3.3 3.3 3.2 3.5L0.2 8.7C0.1 8.8 0.1 9 0.1 9.2C0.2 9.4 0.3 9.6 0.6 9.7C1.7 10.1 2.7 10.4 3.6 10.6V13.5C2.6 13.7 1.6 14 0.5 14.4C0.3 14.5 0.1 14.6 0 14.9C0 15 0 15.2 0.1 15.4L3.1 20.6C3.2 20.7 3.4 20.9 3.6 21C3.8 21 4 21 4.2 20.8C5.1 20 5.8 19.4 6.5 18.7L9 20.1C8.8 21 8.6 22 8.4 23.2C8.3 23.4 8.4 23.6 8.6 23.8C8.7 23.9 8.8 24 9 24H15C15.2 24 15.4 23.9 15.5 23.8C15.6 23.7 15.7 23.4 15.7 23.2C15.5 22.1 15.2 21.1 15 20.1L17.4 18.7C18.1 19.4 18.8 20 19.7 20.8C19.9 21 20.1 21 20.3 21C20.5 21 20.7 20.8 20.8 20.6L23.8 15.4C24 15.2 24 15 24 14.8C23.9 14.6 23.7 14.4 23.5 14.3ZM11.9 9.1C13.5 9.1 14.8 10.4 14.8 12C14.8 13.6 13.5 14.9 11.9 14.9C10.3 14.9 9 13.7 9 12C9 10.4 10.2 9.1 11.9 9.1Z",\n fill: "currentColor"\n }\n) }), Jw = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.09091 1.09091H8.03306V22.9091H1.09091L1.09091 1.09091ZM1.09091 23.9008C0.543189 23.9008 0.0991736 23.4568 0.0991736 22.9091V1.09091C0.0991736 0.543189 0.543189 0.0991736 1.09091 0.0991736H22.9091C23.4568 0.0991736 23.9008 0.543189 23.9008 1.09091V22.9091C23.9008 23.4568 23.4568 23.9008 22.9091 23.9008H1.09091ZM9.02479 1.09091V22.9091H14.9752V1.09091H9.02479ZM15.9669 22.9091V1.09091H22.9091V22.9091H15.9669Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.09091 1.09091H8.03306V22.9091H1.09091L1.09091 1.09091ZM1.19008 22.8099H7.93388V1.19008H1.19008L1.19008 22.8099ZM1.09091 24C0.488417 24 0 23.5116 0 22.9091V1.09091C0 0.488417 0.488417 0 1.09091 0H22.9091C23.5116 0 24 0.488417 24 1.09091V22.9091C24 23.5116 23.5116 24 22.9091 24H1.09091ZM9.12397 1.19008V22.8099H14.876V1.19008H9.12397ZM15.9669 22.9091V1.09091H22.9091V22.9091H15.9669ZM22.8099 22.8099V1.19008H16.0661V22.8099H22.8099ZM1.09091 23.9008H22.9091C23.4568 23.9008 23.9008 23.4568 23.9008 22.9091V1.09091C23.9008 0.543189 23.4568 0.0991736 22.9091 0.0991736H1.09091C0.543189 0.0991736 0.0991736 0.543189 0.0991736 1.09091V22.9091C0.0991736 23.4568 0.543189 23.9008 1.09091 23.9008ZM9.02479 1.09091H14.9752V22.9091H9.02479V1.09091Z",\n fill: "currentColor"\n }\n )\n] }), _w = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M4.9 0H1.2C0.5 0 0 0.5 0 1.2V22.8C0 23.4 0.5 24 1.2 24H5C5.6 24 6.2 23.5 6.2 22.8V1.2C6.1 0.5 5.6 0 4.9 0Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.9 0H10.1C9.5 0 9 0.5 9 1.2V22.8C9 23.4 9.5 24 10.2 24H14C14.6 24 15.2 23.5 15.2 22.8V1.2C15 0.5 14.5 0 13.9 0Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.8 0H19C18.4 0 17.8 0.5 17.8 1.2V22.8C17.8 23.4 18.3 24 19 24H22.8C23.4 24 24 23.5 24 22.8V1.2C24 0.5 23.5 0 22.8 0Z",\n fill: "currentColor"\n }\n )\n] }), $w = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0.708216 24H14.7934H23.2918C23.6852 24 24 23.6852 24 23.2918V0.708192C24 0.314749 23.6852 0 23.2918 0H14.7934H0.708216C0.314773 0 0 0.314749 0 0.708192V6.37376V23.2918C0 23.6852 0.314773 24 0.708216 24ZM1.41638 7.08197H14.0853V22.5836H1.41638V7.08197ZM22.5836 22.5049H15.5803V6.29508V1.4164H22.5836V22.5049ZM1.41638 1.4164H14.0853V5.58688H1.41638V1.4164Z",\n fill: "currentColor"\n }\n) }), eq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.8 0H17.5C16.9 0 16.3 0.5 16.3 1.2V22.8C16.3 23.4 16.8 24 17.5 24H22.8C23.4 24 24 23.5 24 22.8V1.2C24 0.5 23.5 0 22.8 0Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.4 7.9H1.2C0.5 7.9 0 8.5 0 9.1V22.8C0 23.5 0.5 24 1.2 24H12.4C13 24 13.6 23.5 13.6 22.8V9.1C13.5 8.5 13 7.9 12.4 7.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.4 0H1.2C0.5 0 0 0.5 0 1.2V4C0 4.6 0.5 5.2 1.2 5.2H12.4C13 5.2 13.6 4.7 13.6 4V1.2C13.5 0.5 13 0 12.4 0Z",\n fill: "currentColor"\n }\n )\n] }), tq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2721_61458)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.3 8.3V22.7H22.7V8.3H8.3ZM8 7C7.44772 7 7 7.44772 7 8V23C7 23.5523 7.44772 24 8 24H23C23.5523 24 24 23.5523 24 23V8C24 7.44772 23.5523 7 23 7H8Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.3 1.3V15.7H15.7V1.3H1.3ZM1 0C0.447715 0 0 0.447715 0 1V16C0 16.5523 0.447715 17 1 17H16C16.5523 17 17 16.5523 17 16V1C17 0.447715 16.5523 0 16 0H1Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2721_61458", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), rq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.89 19.33H15.14V8.3122H18.89V19.33ZM17.5 9.46H16.5V18.1946H17.5V9.46Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M10.25 8.3122V19.33H13.75V8.3122H10.25ZM11.61 18.1946V9.46H12.39V18.1946H11.61Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.85999 19.33H5.10999V8.3122H8.85999V19.33ZM7.46999 9.46H6.46999V18.1946H7.46999V9.46Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 6.19V9.46H21.64V17.89H22.47V19.49H24V23H0V19.49H1.53V17.89H2.36V9.46H0V6.19C0 6.19 11.651 1 12 1C12.349 0.999998 24 6.19 24 6.19ZM21.4076 20.6628V19.33H20.4197V8.3122H22.7734V6.99886L12 2.40886L1.20898 6.99886V8.3122H3.557V19.33H2.61614V20.6628H1.20898V21.8558H22.7734V20.6628H21.4076Z",\n fill: "currentcolor"\n }\n )\n] }), nq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M4.30916 20.8102L12.027 13.0924L19.7195 20.7849C20.0066 21.0719 20.4666 21.0712 20.7545 20.7832C21.0425 20.4952 21.0433 20.0352 20.7562 19.7482L13.0637 12.0556L20.7815 4.3378C21.0695 4.04983 21.0703 3.58981 20.7832 3.30278C20.4962 3.01575 20.0362 3.0165 19.7482 3.30448L12.088 10.9647L4.33806 3.21478C4.05102 2.92775 3.59101 2.9285 3.30303 3.21648C3.01505 3.50446 3.0143 3.96447 3.30133 4.2515L10.9939 11.944L3.21843 19.7194C2.93046 20.0074 2.9297 20.4674 3.21673 20.7545C3.50377 21.0415 4.02119 21.0982 4.30916 20.8102Z",\n fill: "currentColor"\n }\n) }), oq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M14.175 12.5L21.575 5.1C22.075 4.6 22.075 3.9 21.575 3.5C21.375 3.3 21.075 3.2 20.775 3.2C20.475 3.2 20.175 3.3 19.975 3.5L12.575 10.8L5.175 3.3C4.875 3.1 4.675 3 4.275 3C3.975 3 3.675 3.1 3.475 3.3C3.275 3.6 3.175 3.9 3.175 4.2C3.175 4.5 3.275 4.8 3.475 5L10.875 12.4L3.375 19.9C2.875 20.4 2.875 21.1 3.375 21.5C3.575 21.7 3.975 21.9 4.275 21.9C4.575 21.9 4.875 21.8 5.075 21.6L12.475 14.2L19.875 21.6C20.075 21.8 20.375 21.9 20.675 21.9C20.975 21.9 21.275 21.8 21.475 21.6C21.975 21.1 21.975 20.4 21.475 20L14.175 12.5Z",\n fill: "currentColor"\n }\n) }), iq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0 23.0326C0.00776142 23.5458 0.436899 23.9921 0.967454 24.0001L15.1594 21.4177C15.5754 21.3645 15.8669 20.9521 15.7405 20.4738C15.6746 20.056 15.2532 19.7519 14.7785 19.8637L3.08071 22.0077L23.7847 1.30369C24.078 1.01043 24.0707 0.533945 23.7684 0.231611C23.4661 -0.0707233 22.9896 -0.077999 22.6963 0.215259L2.05093 20.8606L4.19501 9.16292C4.24821 8.74691 3.94403 8.32543 3.58486 8.20086C3.16704 8.13495 2.75463 8.42636 2.64096 8.7819L0 23.0326Z",\n fill: "currentcolor"\n }\n) }), aq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M22 14.3883C20.5942 15.6649 18.7169 16.4445 16.6547 16.4445C12.2966 16.4445 8.76372 12.9623 8.76372 8.66673C8.76372 5.84348 10.2899 3.37156 12.5734 2.00873C12.4315 2.00293 12.2889 2 12.1456 2C6.54233 2 2 6.47715 2 12C2 17.5228 6.54233 22 12.1456 22C16.9137 22 20.9136 18.758 22 14.3883Z",\n fill: "currentcolor"\n }\n) }), sq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.9457 23.1491C24.0519 23.3692 23.9911 23.5868 23.8603 23.7424C23.7308 23.8967 23.5259 24 23.3212 24H0.658159C0.231903 24 -0.107159 23.5739 0.0314981 23.1556L2.87181 14.6464C2.97404 14.3382 3.24032 14.2214 3.51263 14.2214H6.33872C6.68981 14.2214 6.97042 14.5044 6.97042 14.8562C6.97042 15.208 6.6898 15.4909 6.33872 15.4909H3.98404L1.56502 22.7305H22.4144L19.9954 15.4909H17.6407C17.2896 15.4909 17.009 15.208 17.009 14.8562C17.009 14.5044 17.2896 14.2214 17.6407 14.2214H20.481C20.7424 14.2214 21.0329 14.3538 21.1088 14.6498L23.9457 23.1491ZM12.0192 0C15.5065 0 18.3315 2.8416 18.3315 6.34716C18.3315 7.15594 18.0169 8.22241 17.5428 9.37493C17.0674 10.5305 16.4266 11.784 15.7642 12.9709C14.439 15.3448 13.0228 17.4593 12.6571 18.0026C12.5045 18.2294 12.2761 18.363 12.0382 18.3739C11.798 18.385 11.5612 18.2703 11.3982 18.0271C11.0641 17.5286 9.64365 15.4001 8.30646 13.005C7.63793 11.8076 6.98918 10.5417 6.5073 9.3784C6.02675 8.21833 5.70699 7.14842 5.70699 6.34716C5.70699 2.8416 8.53199 0 12.0192 0ZM16.462 8.49013C16.8043 7.62162 17.0089 6.87771 17.0089 6.34716C17.0089 3.54597 14.7459 1.32891 12.0192 1.32891C9.2926 1.32891 7.02954 3.54597 7.02954 6.34716C7.02954 6.89312 7.23078 7.64488 7.56833 8.51576C7.9048 9.38385 8.37256 10.3601 8.89675 11.3512C9.91237 13.2716 11.1364 15.2417 12.0179 16.5786C12.8729 15.2401 14.097 13.2561 15.1196 11.3288C15.6475 10.3338 16.1209 9.35557 16.462 8.49013ZM12.019 9.83769C10.1295 9.83769 8.5472 8.24576 8.5472 6.34689C8.5472 4.38851 10.0703 2.85605 12.019 2.85605C13.9086 2.85605 15.4909 4.44801 15.4909 6.34689C15.4909 8.24576 13.9086 9.83769 12.019 9.83769ZM11.9599 8.5683C13.2048 8.5683 14.1684 7.54382 14.1684 6.34689C14.1684 5.14995 13.2048 4.12543 11.9599 4.12543C10.715 4.12543 9.75134 5.14995 9.75134 6.34689C9.75134 7.60001 10.7709 8.5683 11.9599 8.5683Z",\n fill: "currentColor"\n }\n) }), lq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23.2386 6.67791H9.06435C8.76782 6.67791 8.53058 6.91487 8.53058 7.21109V12.306H3.43026C3.37095 12.306 3.31163 12.306 3.19302 12.3653C3.13371 12.3653 3.07441 12.4245 3.01511 12.4837L1.1173 14.3795V2.11617H14.224V4.42667C14.224 4.72288 14.4612 4.95985 14.7577 4.95985C15.0543 4.95985 15.2915 4.72288 15.2915 4.42667V1.58298C15.2915 1.28676 15.0543 1.0498 14.7577 1.0498H0.583563C0.287032 1.0498 0.0497925 1.28676 0.0497925 1.58298V15.7421C0.0497925 15.9791 0.168427 16.1568 0.405652 16.2753C0.464958 16.2753 0.524243 16.3345 0.642855 16.3345C0.761468 16.3345 0.939394 16.2753 1.05801 16.1568L3.72679 13.4909H8.6492V18.5858C8.6492 18.882 8.88644 19.119 9.18297 19.119H20.2732L22.942 21.7849C23.0606 21.9034 23.1792 21.9627 23.3571 21.9627C23.4165 21.9627 23.4758 21.9627 23.5944 21.9034C23.7723 21.8442 23.9502 21.6072 23.9502 21.3702V7.21109C23.7723 6.91487 23.5351 6.67791 23.2386 6.67791ZM22.6455 20.0669L20.7477 18.1711C20.6884 18.1118 20.6291 18.0526 20.5698 18.0526C20.5105 18.0526 20.4512 17.9934 20.3325 17.9934H9.53879V7.74428H22.6455V20.0669Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.405652 16.2753C0.168427 16.1568 0.0497925 15.9791 0.0497925 15.7421V1.58298C0.0497925 1.28676 0.287032 1.0498 0.583563 1.0498H14.7577C15.0543 1.0498 15.2915 1.28676 15.2915 1.58298V4.42667C15.2915 4.72288 15.0543 4.95985 14.7577 4.95985C14.4612 4.95985 14.224 4.72288 14.224 4.42667V2.11617H1.1173V14.3795L3.01511 12.4837C3.07441 12.4245 3.13371 12.3653 3.19302 12.3653C3.31163 12.306 3.37095 12.306 3.43026 12.306H8.53058V7.21109C8.53058 6.91487 8.76782 6.67791 9.06435 6.67791H23.2386C23.5351 6.67791 23.7723 6.91487 23.9502 7.21109V21.3702C23.9502 21.6072 23.7723 21.8442 23.5944 21.9034C23.4758 21.9627 23.4165 21.9627 23.3571 21.9627C23.1792 21.9627 23.0606 21.9034 22.942 21.7849L20.2732 19.119H9.18297C8.88644 19.119 8.6492 18.882 8.6492 18.5858V13.4909H3.72679L1.05801 16.1568C0.939394 16.2753 0.761468 16.3345 0.642855 16.3345C0.573374 16.3345 0.52425 16.3142 0.483555 16.2974C0.454779 16.2855 0.430217 16.2753 0.405652 16.2753ZM3.7474 13.5407L1.0932 16.1921C0.96463 16.3205 0.773766 16.3843 0.642855 16.3843C0.574524 16.3843 0.523306 16.3671 0.48354 16.3512C0.475715 16.348 0.468955 16.3452 0.462802 16.3427C0.45237 16.3384 0.443681 16.3348 0.4345 16.3315C0.421038 16.3268 0.412337 16.3251 0.405652 16.3251H0.393909L0.383403 16.3199C0.258887 16.2577 0.162498 16.1784 0.0973471 16.0808C0.0319865 15.9829 0 15.8693 0 15.7421V1.58298C0 1.25921 0.259585 1 0.583563 1H14.7577C15.0817 1 15.3413 1.25921 15.3413 1.58298V4.42667C15.3413 4.75044 15.0817 5.00965 14.7577 5.00965C14.4338 5.00965 14.1742 4.75043 14.1742 4.42667V2.16596H1.16709V14.2594L2.98131 12.4471C3.00995 12.4185 3.0417 12.3868 3.07421 12.3624C3.10367 12.3404 3.13961 12.3197 3.18023 12.3161C3.23805 12.2879 3.28395 12.2726 3.32412 12.2646C3.36604 12.2562 3.3998 12.2562 3.42931 12.2562H8.48079V7.21109C8.48079 6.88732 8.74037 6.62811 9.06435 6.62811H23.2386C23.5634 6.62811 23.8135 6.88672 23.9929 7.18545L24 7.19729V21.3702C24 21.5008 23.9512 21.629 23.8799 21.7318C23.8098 21.8331 23.7142 21.9149 23.6136 21.9495C23.5527 21.9796 23.5049 21.9958 23.4633 22.0041C23.4214 22.0125 23.3876 22.0125 23.3581 22.0125H23.3571C23.2624 22.0125 23.1812 21.9966 23.1071 21.9637C23.0333 21.931 22.9691 21.8823 22.9068 21.8202L20.2526 19.1688H9.18297C8.85899 19.1688 8.59941 18.9096 8.59941 18.5858V13.5407H3.7474ZM22.6455 20.0669V7.74428H9.53879V17.9934H20.3325C20.402 17.9934 20.4512 18.0137 20.4919 18.0305C20.5206 18.0425 20.5452 18.0526 20.5698 18.0526C20.6291 18.0526 20.6884 18.1118 20.7477 18.1711L22.6455 20.0669ZM22.5957 19.9468V7.79407H9.58859V17.9436H20.3325C20.4009 17.9436 20.4521 17.9609 20.4919 17.9768C20.4997 17.9799 20.5065 17.9827 20.5126 17.9852C20.523 17.9896 20.5317 17.9932 20.5409 17.9964C20.5544 18.0011 20.5631 18.0028 20.5698 18.0028C20.6157 18.0028 20.6561 18.0254 20.6886 18.0498C20.7211 18.0741 20.7528 18.1058 20.7815 18.1344L22.5957 19.9468Z",\n fill: "currentColor"\n }\n )\n] }), cq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 7.2V21.4C24 21.5 24 21.7 23.9 21.8C23.8 21.9 23.7 22 23.6 22C23.5 22 23.5 22 23.5 22H23.4C23.3 22 23.2 22 23.2 22C23.1 22 23.1 21.9 23 21.9L20.3 19.3H9.2C8.9 19.3 8.6 19 8.6 18.7V7.7C8.6 7.3 8.8 7 9.2 6.9C9.3 6.9 9.4 6.9 9.5 6.9H23.3C23.7963 6.9 23.8 6.9 24 7.2Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M15.3 1.6V4.8H8C7.3 4.8 6.8 5.4 6.8 6V13.5H3.8L1.1 16.1C1 16.2 0.8 16.3 0.6 16.3C0.5 16.3 0.5 16.3 0.4 16.3C0.3 16.2 0.2 16.2 0.1 16.1C0 16 0 15.9 0 15.7V1.6C0 1.3 0.3 1 0.6 1H14.8C15.1 1 15.3 1.3 15.3 1.6Z",\n fill: "currentColor"\n }\n )\n] }), pq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM19.4953 4.50467C21.4136 6.42289 22.6 9.07289 22.6 12C22.6 17.8542 17.8542 22.6 12 22.6C9.07289 22.6 6.42289 21.4136 4.50467 19.4953L19.4953 4.50467ZM18.4401 3.57999L3.57999 18.4401C2.21256 16.655 1.4 14.4224 1.4 12C1.4 6.14578 6.14578 1.4 12 1.4C14.4224 1.4 16.655 2.21256 18.4401 3.57999Z",\n fill: "currentColor"\n }\n) }), dq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 0C5.4 0 0 5.4 0 12C0 18.6 5.4 24 12 24C18.6 24 24 18.6 24 12C24 5.4 18.6 0 12 0ZM12 21.6C9.6 21.6 7.4 20.7 5.6 19.2L19.2 5.6C20.8 7.4 21.6 9.6 21.6 12C21.6 17.3 17.3 21.6 12 21.6ZM12 2.4C13.9 2.4 15.7 3 17.3 4L4 17.3C3 15.8 2.4 13.9 2.4 12C2.4 6.7 6.7 2.4 12 2.4Z",\n fill: "currentColor"\n }\n) }), Aq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2721_61325)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M7.14082 7.141C7.41418 6.86763 7.8574 6.86763 8.13076 7.141L16.8588 15.869C17.1321 16.1424 17.1321 16.5856 16.8588 16.8589C16.5854 17.1323 16.1422 17.1323 15.8688 16.8589L7.14082 8.13095C6.86745 7.85758 6.86745 7.41436 7.14082 7.141Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M21.8783 2.12219C23.1658 3.41135 23.889 5.15887 23.889 6.98089C23.889 8.8029 23.1658 10.5504 21.8783 11.8396L18.9703 14.7475C18.697 15.0209 18.2538 15.0209 17.9804 14.7475C17.707 14.4742 17.707 14.0309 17.9804 13.7576L20.8877 10.8502C21.9131 9.82359 22.489 8.4319 22.489 6.98088C22.489 5.53002 21.9132 4.13846 20.888 3.11183C19.8614 2.08664 18.4698 1.51081 17.019 1.51081C15.568 1.51081 14.1764 2.08671 13.1497 3.11201L10.2963 5.9655C10.0229 6.23886 9.57967 6.23886 9.3063 5.9655C9.03293 5.69213 9.03293 5.24891 9.3063 4.97555L12.16 2.12188C13.4491 0.834327 15.197 0.110809 17.019 0.110809C18.841 0.110809 20.5891 0.834635 21.8783 2.12219ZM5.86796 9.40384C6.14133 9.6772 6.14133 10.1204 5.86796 10.3938L2.96932 13.2924C2.00732 14.3294 1.48381 15.6985 1.50876 17.113C1.53379 18.5316 2.10844 19.885 3.11165 20.8882C4.11486 21.8914 5.4683 22.4661 6.88683 22.4911C8.30136 22.516 9.6705 21.9925 10.7074 21.0305L13.6061 18.1319C13.8794 17.8585 14.3226 17.8585 14.596 18.1319C14.8694 18.4053 14.8694 18.8485 14.596 19.1218L11.6796 22.0382L11.6706 22.0466C10.3672 23.2611 8.64335 23.9223 6.86213 23.8909C5.0809 23.8594 3.38141 23.1379 2.1217 21.8781C0.86199 20.6184 0.14041 18.9189 0.108981 17.1377C0.0775541 15.3565 0.738735 13.6326 1.95322 12.3292L1.96164 12.3202L4.87801 9.40384C5.15138 9.13047 5.59459 9.13047 5.86796 9.40384Z",\n fill: "currentcolor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2721_61325", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), uq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M33 35.4613V18.2843C33 18.2843 33 18.2843 33 18.2244C33 18.1646 33 18.1047 33 18.1047V18.0449C33 17.985 32.9409 17.9252 32.8819 17.8653L27.2164 12.1197C27.1573 12.0598 27.0983 12.0599 27.0393 12H26.9803C26.9213 12 26.8623 12 26.8623 12C26.8623 12 26.8623 12 26.8033 12H15.5311C15.236 12 15 12.2394 15 12.5386V35.4613C15 35.7606 15.236 36 15.5311 36H32.4688C32.7639 36 33 35.7606 33 35.4613ZM27.3934 13.8554L31.1704 17.6858H27.3934V13.8554ZM16.1213 34.8628V13.0773H26.3311V18.2244C26.3311 18.5237 26.5672 18.7631 26.8623 18.7631H31.9377V34.803H16.1213V34.8628Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.3282 26.72C20.2375 26.6453 20.1069 26.5733 19.9362 26.504C19.7655 26.4347 19.5789 26.4 19.3762 26.4C19.1629 26.4 18.9789 26.44 18.8242 26.52C18.6749 26.5947 18.5522 26.7013 18.4562 26.84C18.3602 26.9733 18.2909 27.1333 18.2482 27.32C18.2055 27.5067 18.1842 27.7067 18.1842 27.92C18.1842 28.4053 18.3042 28.7813 18.5442 29.048C18.7842 29.3093 19.1042 29.44 19.5042 29.44C19.7069 29.44 19.8749 29.432 20.0082 29.416C20.1469 29.3947 20.2535 29.3733 20.3282 29.352V26.72ZM20.3282 23.92L21.0722 23.792V29.88C20.9015 29.928 20.6829 29.976 20.4162 30.024C20.1495 30.072 19.8429 30.096 19.4962 30.096C19.1762 30.096 18.8882 30.0453 18.6322 29.944C18.3762 29.8427 18.1575 29.6987 17.9762 29.512C17.7949 29.3253 17.6535 29.0987 17.5522 28.832C17.4562 28.56 17.4082 28.256 17.4082 27.92C17.4082 27.6 17.4482 27.3067 17.5282 27.04C17.6135 26.7733 17.7362 26.544 17.8962 26.352C18.0562 26.16 18.2509 26.0107 18.4802 25.904C18.7149 25.7973 18.9815 25.744 19.2802 25.744C19.5202 25.744 19.7309 25.776 19.9122 25.84C20.0989 25.904 20.2375 25.9653 20.3282 26.024V23.92Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M26.0231 27.92C26.0231 28.2507 25.9751 28.5493 25.8791 28.816C25.7831 29.0827 25.6471 29.312 25.4711 29.504C25.3005 29.696 25.0951 29.8453 24.8551 29.952C24.6151 30.0533 24.3538 30.104 24.0711 30.104C23.7885 30.104 23.5271 30.0533 23.2871 29.952C23.0471 29.8453 22.8391 29.696 22.6631 29.504C22.4925 29.312 22.3591 29.0827 22.2631 28.816C22.1671 28.5493 22.1191 28.2507 22.1191 27.92C22.1191 27.5947 22.1671 27.2987 22.2631 27.032C22.3591 26.76 22.4925 26.528 22.6631 26.336C22.8391 26.144 23.0471 25.9973 23.2871 25.896C23.5271 25.7893 23.7885 25.736 24.0711 25.736C24.3538 25.736 24.6151 25.7893 24.8551 25.896C25.0951 25.9973 25.3005 26.144 25.4711 26.336C25.6471 26.528 25.7831 26.76 25.8791 27.032C25.9751 27.2987 26.0231 27.5947 26.0231 27.92ZM25.2471 27.92C25.2471 27.4507 25.1405 27.08 24.9271 26.808C24.7191 26.5307 24.4338 26.392 24.0711 26.392C23.7085 26.392 23.4205 26.5307 23.2071 26.808C22.9991 27.08 22.8951 27.4507 22.8951 27.92C22.8951 28.3893 22.9991 28.7627 23.2071 29.04C23.4205 29.312 23.7085 29.448 24.0711 29.448C24.4338 29.448 24.7191 29.312 24.9271 29.04C25.1405 28.7627 25.2471 28.3893 25.2471 27.92Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M28.8779 30.096C28.5419 30.096 28.2459 30.0427 27.9899 29.936C27.7392 29.8293 27.5259 29.68 27.3499 29.488C27.1792 29.296 27.0512 29.0693 26.9659 28.808C26.8806 28.5413 26.8379 28.248 26.8379 27.928C26.8379 27.608 26.8832 27.3147 26.9739 27.048C27.0699 26.7813 27.2032 26.552 27.3739 26.36C27.5446 26.1627 27.7526 26.0107 27.9979 25.904C28.2486 25.792 28.5259 25.736 28.8299 25.736C29.0166 25.736 29.2032 25.752 29.3899 25.784C29.5766 25.816 29.7552 25.8667 29.9259 25.936L29.7579 26.568C29.6459 26.5147 29.5152 26.472 29.3659 26.44C29.2219 26.408 29.0672 26.392 28.9019 26.392C28.4859 26.392 28.1659 26.5227 27.9419 26.784C27.7232 27.0453 27.6139 27.4267 27.6139 27.928C27.6139 28.152 27.6379 28.3573 27.6859 28.544C27.7392 28.7307 27.8192 28.8907 27.9259 29.024C28.0379 29.1573 28.1792 29.2613 28.3499 29.336C28.5206 29.4053 28.7286 29.44 28.9739 29.44C29.1712 29.44 29.3499 29.4213 29.5099 29.384C29.6699 29.3467 29.7952 29.3067 29.8859 29.264L29.9899 29.888C29.9472 29.9147 29.8859 29.9413 29.8059 29.968C29.7259 29.9893 29.6352 30.008 29.5339 30.024C29.4326 30.0453 29.3232 30.0613 29.2059 30.072C29.0939 30.088 28.9846 30.096 28.8779 30.096Z",\n fill: "currentColor"\n }\n )\n] }), bq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.9751 23.4138C20.9751 23.7118 20.74 23.9502 20.4462 23.9502H3.57868C3.28482 23.9502 3.04979 23.7118 3.04979 23.4138V0.586208C3.04979 0.288197 3.28482 0.0497926 3.57868 0.0497926H15.0391C15.0685 0.0795936 15.0979 0.0944937 15.1273 0.109394C15.1567 0.124294 15.1861 0.139194 15.2155 0.168995L20.8575 5.8908C20.9163 5.95036 20.9751 6.01004 20.9751 6.0696V23.4138ZM19.1531 5.71199L15.3918 1.89746V5.71199H19.1531ZM4.16639 1.12263V22.7582H19.9172V6.78483H14.8629C14.569 6.78483 14.3339 6.54641 14.3339 6.2484V1.12263H4.16639ZM12.0419 9.70538H6.39999C6.10614 9.70538 5.87105 9.46698 5.87105 9.16898C5.87105 8.87098 6.10614 8.63257 6.39999 8.63257H12.0419C12.3357 8.63257 12.5708 8.87098 12.5708 9.16898C12.5708 9.46698 12.3357 9.70538 12.0419 9.70538ZM14.8624 12.8643H6.45834C6.16449 12.8643 5.9294 13.1027 5.9294 13.4007C5.9294 13.6987 6.16449 13.9371 6.45834 13.9371H14.8624C15.1563 13.9371 15.3914 13.6987 15.3914 13.4007C15.3914 13.1027 15.1563 12.8643 14.8624 12.8643ZM6.45834 17.1555H14.8624C15.1563 17.1555 15.3914 17.3939 15.3914 17.6919C15.3914 17.9899 15.1563 18.2283 14.8624 18.2283H6.45834C6.16449 18.2283 5.9294 17.9899 5.9294 17.6919C5.9294 17.3939 6.16449 17.1555 6.45834 17.1555Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M15.06 0L15.0746 0.0148315C15.0977 0.038286 15.1205 0.0501023 15.1498 0.0649813L15.1512 0.0656614C15.1803 0.0804511 15.2158 0.0984337 15.2509 0.134034L20.8945 5.85736C20.9229 5.88612 20.9543 5.91801 20.9784 5.95065C21.0026 5.98334 21.0249 6.02379 21.0249 6.0696V23.4138C21.0249 23.7386 20.7682 24 20.4462 24H3.57868C3.25666 24 3 23.7386 3 23.4138V0.586207C3 0.261365 3.25666 0 3.57868 0H15.06ZM20.8575 5.8908L15.2155 0.168995C15.1861 0.139194 15.1567 0.124294 15.1273 0.109394C15.0979 0.0944937 15.0685 0.0795936 15.0391 0.0497926H3.57868C3.28482 0.0497926 3.04979 0.288197 3.04979 0.586208V23.4138C3.04979 23.7118 3.28482 23.9502 3.57868 23.9502H20.4462C20.74 23.9502 20.9751 23.7118 20.9751 23.4138V6.0696C20.9751 6.01004 20.9163 5.95036 20.8575 5.8908ZM15.3918 1.89746V5.71199H19.1531L15.3918 1.89746ZM15.4416 2.01887V5.66219H19.0341L15.4416 2.01887ZM4.21619 1.17242V22.7084H19.8674V6.83462H14.8629C14.5408 6.83462 14.2841 6.57325 14.2841 6.2484V1.17242H4.21619ZM12.0419 9.75517H6.39999C6.07799 9.75517 5.82125 9.49382 5.82125 9.16898C5.82125 8.84413 6.07798 8.58278 6.39999 8.58278H12.0419C12.3639 8.58278 12.6206 8.84413 12.6206 9.16898C12.6206 9.49382 12.3639 9.75517 12.0419 9.75517ZM6.45834 12.8145H14.8624C15.1845 12.8145 15.4412 13.0758 15.4412 13.4007C15.4412 13.7255 15.1845 13.9869 14.8624 13.9869H6.45834C6.13634 13.9869 5.87961 13.7255 5.87961 13.4007C5.87961 13.0758 6.13634 12.8145 6.45834 12.8145ZM6.45834 17.1057H14.8624C15.1845 17.1057 15.4412 17.3671 15.4412 17.6919C15.4412 18.0168 15.1845 18.2781 14.8624 18.2781H6.45834C6.13634 18.2781 5.87961 18.0168 5.87961 17.6919C5.87961 17.3671 6.13634 17.1057 6.45834 17.1057ZM4.16639 1.12263H14.3339V6.2484C14.3339 6.54641 14.569 6.78483 14.8629 6.78483H19.9172V22.7582H4.16639V1.12263ZM6.39999 9.70538H12.0419C12.3357 9.70538 12.5708 9.46698 12.5708 9.16898C12.5708 8.87098 12.3357 8.63257 12.0419 8.63257H6.39999C6.10614 8.63257 5.87105 8.87098 5.87105 9.16898C5.87105 9.46698 6.10614 9.70538 6.39999 9.70538ZM6.45834 12.8643H14.8624C15.1563 12.8643 15.3914 13.1027 15.3914 13.4007C15.3914 13.6987 15.1563 13.9371 14.8624 13.9371H6.45834C6.16449 13.9371 5.9294 13.6987 5.9294 13.4007C5.9294 13.1027 6.16449 12.8643 6.45834 12.8643ZM14.8624 17.1555H6.45834C6.16449 17.1555 5.9294 17.3939 5.9294 17.6919C5.9294 17.9899 6.16449 18.2283 6.45834 18.2283H14.8624C15.1563 18.2283 15.3914 17.9899 15.3914 17.6919C15.3914 17.3939 15.1563 17.1555 14.8624 17.1555Z",\n fill: "currentColor"\n }\n )\n] }), hq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M14.5 7.5C14 7.5 13.6 7.1 13.6 6.6V0H3.6C3.3 0 3 0.3 3 0.6V23.4C3 23.7 3.3 24 3.6 24H20.5C20.8 24 21.1 23.7 21.1 23.4V7.5H14.5ZM15.8 13.4C16.4 13.4 16.9 13.9 16.9 14.5C16.9 15.1 16.4 15.6 15.8 15.6H7.3C6.7 15.6 6.2 15.1 6.2 14.5C6.2 13.9 6.7 13.4 7.3 13.4H15.8ZM6.2 18.7C6.2 18.1 6.7 17.6 7.3 17.6H15.7C16.3 17.6 16.8 18.1 16.8 18.7C16.8 19.3 16.3 19.8 15.7 19.8H7.3C6.7 19.8 6.2 19.3 6.2 18.7ZM14.1 10.3C14.1 10.9 13.6 11.4 13 11.4H7.3C6.7 11.4 6.2 10.9 6.2 10.3C6.2 9.7 6.7 9.2 7.3 9.2H12.9C13.6 9.2 14.1 9.7 14.1 10.3Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A("path", { d: "M20.7 5.7H15.4V0.3L20.7 5.7Z", fill: "currentColor" })\n] }), Mq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.6 12C22.6 17.8542 17.8542 22.6 12 22.6C6.14578 22.6 1.4 17.8542 1.4 12C1.4 6.14578 6.14578 1.4 12 1.4C17.8542 1.4 22.6 6.14578 22.6 12ZM24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM8.67393 8.03032L8.69246 8.00774C9.06947 7.58146 9.55756 7.26238 10.1052 7.08419C10.5138 6.95324 10.9366 6.86839 11.365 6.83129V5H12.7546V6.85387C13.0017 6.88508 13.2463 6.93337 13.4864 6.99839C13.8963 7.10854 14.2834 7.28733 14.6305 7.52677C14.9188 7.72361 15.1663 7.97184 15.36 8.25839L15.7445 8.8229L14.5865 9.57032L14.2021 9.00581C14.1037 8.86062 13.9779 8.73495 13.8315 8.63548C13.6145 8.48518 13.3724 8.37286 13.1159 8.30355C12.7572 8.20904 12.3873 8.16121 12.0158 8.16129C11.5187 8.14458 11.0225 8.21338 10.5498 8.36452C10.2411 8.46444 9.96584 8.64389 9.75316 8.88387C9.61561 9.04806 9.53458 9.25031 9.52157 9.46194V9.52968C9.50478 9.77371 9.58153 10.0151 9.73695 10.2071C9.92145 10.4146 10.1563 10.5738 10.4201 10.67C10.8723 10.8355 11.3369 10.9668 11.8097 11.0629C12.2544 11.1532 12.5392 11.2187 12.8032 11.2887C12.8799 11.3092 12.9544 11.329 13.0269 11.3482C13.2502 11.4075 13.454 11.4617 13.6393 11.5145C14.0474 11.629 14.4372 11.7985 14.7973 12.0181C15.1476 12.2346 15.4423 12.5266 15.6588 12.8716C15.8903 13.2748 16.0077 13.7306 15.9992 14.1926C16.0134 14.7596 15.8351 15.3152 15.492 15.7732C15.1127 16.2639 14.5965 16.6378 14.0052 16.8503C13.6041 16.9996 13.1856 17.0997 12.7592 17.1484V19H11.3697V17.171C10.7632 17.1228 10.1704 16.9699 9.61883 16.7194C9.13538 16.4792 8.71834 16.1292 8.40297 15.6987L8 15.1477L9.13017 14.3619L9.53314 14.9129C9.71335 15.161 9.95149 15.3638 10.2279 15.5045C10.7529 15.7429 11.3281 15.8574 11.907 15.8387H11.951C12.4828 15.8562 13.0128 15.7694 13.5096 15.5835C13.8533 15.4628 14.1541 15.248 14.3758 14.9648C14.5347 14.7463 14.6161 14.483 14.6073 14.2152V14.1835C14.6122 13.9607 14.5554 13.7408 14.4429 13.5468C14.3392 13.3909 14.2016 13.2591 14.0399 13.1606C13.7907 13.009 13.521 12.8919 13.2386 12.8129C13.014 12.7497 12.7546 12.6819 12.4466 12.6097C12.1965 12.5306 11.9324 12.4697 11.5202 12.3839C10.9756 12.2738 10.4406 12.1228 9.9199 11.9323C9.42727 11.7514 8.99035 11.4506 8.65078 11.0584L8.62762 11.0313C8.26754 10.5819 8.08802 10.0199 8.12274 9.45064C8.14231 8.93119 8.33591 8.43229 8.67393 8.03032Z",\n fill: "currentcolor"\n }\n) }), fq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.258 24C14.0161 24 13.8548 23.9216 13.6935 23.7647L2.24193 12.549C2.08064 12.3922 2 12.1569 2 12C2 11.7647 2.08064 11.6078 2.24193 11.451L13.7742 0.235294C14.0967 -0.0784314 14.4999 -0.0784314 14.8225 0.235294C15.1451 0.54902 15.1451 0.941177 14.8225 1.2549L3.77415 12L14.8225 22.7451C15.1451 23.0588 15.1451 23.451 14.8225 23.7647C14.6612 23.9216 14.4193 24 14.258 24ZM9.09691 12.549C8.93562 12.3922 8.85498 12.1569 8.85498 12C8.85498 11.7647 8.9356 11.6078 9.17753 11.451L20.7098 0.235294C21.0323 -0.0784314 21.4356 -0.0784314 21.7582 0.235294C22.0808 0.54902 22.0808 0.941177 21.7582 1.2549L10.7098 12L21.7582 22.7451C22.0808 23.0588 22.0808 23.451 21.7582 23.7647C21.5969 23.9216 21.3549 24 21.1937 24C20.9517 24 20.7904 23.9216 20.6291 23.7647L9.09691 12.549Z",\n fill: "currentColor"\n }\n) }), gq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M9.10986 22.7451L20.1471 12L9.19043 1.2549C8.86817 0.941176 8.86817 0.549019 9.19043 0.235294C9.51268 -0.0784313 9.91549 -0.0784313 10.2377 0.235294L21.7584 11.5294C22.0807 11.8431 22.0807 12.2353 21.7584 12.549L10.2377 23.7647C10.0766 23.9216 9.83492 24 9.67379 24C9.4321 24 9.27098 23.9216 9.10986 23.7647C8.7876 23.451 8.7876 23.0588 9.10986 22.7451ZM2.74522 24C2.50353 24 2.34239 23.9216 2.18126 23.7647C1.93957 23.451 1.93957 22.9804 2.18126 22.6667L13.2991 12L2.26183 1.25491C1.93957 0.941184 1.93957 0.549027 2.26183 0.235302C2.58409 -0.0784237 2.9869 -0.0784237 3.30915 0.235302L14.8298 11.5294C15.1521 11.8431 15.1521 12.2353 14.8298 12.549L3.30915 23.7647C3.14803 23.9216 2.90635 24 2.74522 24Z",\n fill: "currentColor"\n }\n) }), zq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.4953 1.62864C11.4953 1.33449 11.7327 1.09917 12.0295 1.09917C12.3262 1.09917 12.5637 1.33449 12.6824 1.62864V14.3947L17.4307 9.68835C17.6681 9.45303 17.9649 9.45303 18.2023 9.68835C18.4397 9.92367 18.4397 10.2178 18.2023 10.4531L12.5043 16.1008C12.4449 16.1597 12.3856 16.2185 12.3262 16.2185C12.2075 16.2773 12.1482 16.2773 12.0888 16.2773C12.0193 16.2773 11.9701 16.2571 11.9294 16.2404C11.9006 16.2286 11.876 16.2185 11.8514 16.2185C11.792 16.2185 11.7327 16.1597 11.6733 16.1008L5.97536 10.4531C5.73794 10.2178 5.73794 9.92367 5.97536 9.68835C6.21277 9.45303 6.50954 9.45303 6.74696 9.68835L11.4953 14.3947V1.62864ZM22.8324 15.6895C22.8324 15.3953 23.0698 15.16 23.3666 15.16C23.6634 15.16 23.9008 15.4541 23.9008 15.7483V21.3961C23.9008 21.6903 23.6634 21.9256 23.3666 21.9256H0.633375C0.336597 21.9256 0.0991736 21.6903 0.0991736 21.3961V15.7483C0.0991736 15.4541 0.395952 15.16 0.692731 15.16C0.98951 15.16 1.22693 15.3953 1.22693 15.6895V20.749H22.8324V15.6895Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.7815 1.60938V14.1568L17.3609 9.6179C17.4944 9.4855 17.652 9.41268 17.8165 9.41268C17.981 9.41268 18.1385 9.4855 18.2721 9.6179C18.4056 9.75027 18.4795 9.90682 18.4795 10.0707C18.4795 10.2347 18.4056 10.3912 18.2721 10.5236L12.5717 16.1736C12.5438 16.2013 12.5098 16.235 12.4744 16.2613C12.4442 16.2838 12.4027 16.3089 12.3528 16.3158C12.2954 16.3429 12.2478 16.3587 12.2046 16.3672C12.1579 16.3765 12.1201 16.3765 12.0905 16.3765H12.0888C11.9997 16.3765 11.9355 16.3501 11.8935 16.3329L11.8917 16.3321C11.8763 16.3258 11.8672 16.3221 11.8593 16.3197C11.852 16.3174 11.8502 16.3176 11.8514 16.3176C11.7896 16.3176 11.7386 16.2876 11.7032 16.2613C11.6678 16.235 11.6339 16.2013 11.6059 16.1736L5.90554 10.5236C5.772 10.3912 5.69812 10.2347 5.69812 10.0707C5.69812 9.90682 5.772 9.75027 5.90554 9.6179C6.03912 9.4855 6.19668 9.41268 6.36116 9.41268C6.52564 9.41268 6.68319 9.4855 6.81677 9.6179L11.3961 14.1568V1.62864C11.3961 1.27889 11.6788 1 12.0295 1C12.3836 1 12.648 1.27848 12.7743 1.59153L12.7815 1.60938ZM11.4953 1.62864C11.4953 1.33449 11.7327 1.09917 12.0295 1.09917C12.3262 1.09917 12.5637 1.33449 12.6824 1.62864V14.3947L17.4307 9.68835C17.6681 9.45303 17.9649 9.45303 18.2023 9.68835C18.4397 9.92367 18.4397 10.2178 18.2023 10.4531L12.5043 16.1008C12.4449 16.1597 12.3856 16.2185 12.3262 16.2185C12.2075 16.2773 12.1482 16.2773 12.0888 16.2773C12.0193 16.2773 11.9701 16.2571 11.9294 16.2404C11.9006 16.2286 11.876 16.2185 11.8514 16.2185C11.792 16.2185 11.7327 16.1597 11.6733 16.1008L5.97536 10.4531C5.73794 10.2178 5.73794 9.92367 5.97536 9.68835C6.21277 9.45303 6.50954 9.45303 6.74696 9.68835L11.4953 14.3947V1.62864ZM22.7332 15.6895C22.7332 15.3397 23.0159 15.0608 23.3666 15.0608C23.5491 15.0608 23.7084 15.1512 23.8197 15.2785C23.9307 15.4056 24 15.5754 24 15.7483V21.3961C24 21.7459 23.7173 22.0248 23.3666 22.0248H0.633375C0.282657 22.0248 0 21.7459 0 21.3961V15.7483C0 15.5686 0.0896021 15.3975 0.214846 15.2734C0.340144 15.1492 0.512397 15.0608 0.692731 15.0608C1.04345 15.0608 1.32611 15.3397 1.32611 15.6895V20.6498H22.7332V15.6895ZM23.3666 15.16C23.0698 15.16 22.8324 15.3953 22.8324 15.6895V20.749H1.22693V15.6895C1.22693 15.3953 0.98951 15.16 0.692731 15.16C0.395952 15.16 0.0991736 15.4541 0.0991736 15.7483V21.3961C0.0991736 21.6903 0.336597 21.9256 0.633375 21.9256H23.3666C23.6634 21.9256 23.9008 21.6903 23.9008 21.3961V15.7483C23.9008 15.4541 23.6634 15.16 23.3666 15.16Z",\n fill: "currentcolor"\n }\n )\n] }), Cq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.4 16.5C11.5 16.6 11.6 16.6 11.7 16.6C11.8 16.6 11.9 16.7 12 16.7C12 16.7 12.1 16.7 12.2 16.7C12.3 16.7 12.3 16.7 12.4 16.6C12.5 16.6 12.6 16.5 12.6 16.5C12.7 16.5 12.7 16.4 12.7 16.4L18.2 10.9C18.4 10.7 18.5 10.4 18.5 10.2C18.5 9.9 18.4 9.7 18.2 9.5C18 9.3 17.7 9.2 17.5 9.2C17.2 9.2 17 9.3 16.8 9.5L13.1 13.2V1.8C12.9 1.3 12.5 1 12 1C11.4 1 11 1.5 11 2V13.1L7.3 9.4C7.1 9.2 6.8 9.1 6.6 9.1C6.3 9.1 6 9.2 5.8 9.4C5.6 9.7 5.5 9.9 5.5 10.2C5.5 10.5 5.6 10.7 5.8 10.9L11.4 16.5Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23.7 14.9C23.5 14.7 23.2 14.5 23 14.5C22.4 14.5 22 15 22 15.5V20H2.1V15.6C2.1 15 1.6 14.6 1.1 14.6C0.8 14.6 0.6 14.7 0.3 14.9C0.1 15.1 0 15.4 0 15.7V21.2C0 21.8 0.5 22.2 1 22.2H23C23.6 22.2 24 21.7 24 21.2V15.7C24 15.4 23.9 15.1 23.7 14.9Z",\n fill: "currentcolor"\n }\n )\n] }), Oq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0 11.8294C9.64556e-06 8.5623 3.04481 5.92825 6.56944 6.48341C7.88789 4.89156 9.91466 3.9834 12 3.9834C15.216 3.9834 17.9012 6.02584 18.6952 8.92779C19.0213 8.87515 19.3193 8.82046 19.6101 8.82046C22.0137 8.82046 24 10.7186 24 13.0244C24 15.3302 22.0137 17.2284 19.6101 17.2284C19.2874 17.2284 19.0252 16.9805 19.0252 16.6664C19.0252 16.3524 19.2874 16.1045 19.6101 16.1045C21.4283 16.1045 22.8303 14.7584 22.8303 13.0813C22.8303 11.3473 21.3689 10.0013 19.6101 10.0013C19.2619 10.0013 18.8523 10.1127 18.4956 10.2265C18.1761 10.3285 17.745 10.0989 17.6578 9.7284C17.1254 7.46665 14.8296 5.1642 12 5.1642C10.1718 5.1642 8.40363 6.01105 7.34348 7.47677L7.33814 7.48415C7.15722 7.65733 6.96141 7.78639 6.69815 7.7239C6.40194 7.66723 6.0494 7.61119 5.69792 7.61119C3.22628 7.61119 1.2292 9.52576 1.2292 11.8863C1.2292 14.2468 3.22628 16.1614 5.69792 16.1614C6.02061 16.1614 6.28277 16.4093 6.28277 16.7234C6.28277 17.0374 6.02061 17.2853 5.69792 17.2853C2.58033 17.2853 0.0600102 14.8737 0 11.8294ZM12.7037 11.2504V18.0293L14.522 16.2889C14.6485 16.1678 14.7941 16.1044 14.9429 16.1044C15.0916 16.1044 15.2372 16.1678 15.3637 16.2889C15.4901 16.4099 15.5574 16.5503 15.5574 16.6948C15.5574 16.8393 15.4901 16.9796 15.3637 17.1006L12.5108 19.8313L12.51 19.8321L12.5085 19.8335C12.3846 19.9521 12.2355 20.0166 12.0604 20.0166C11.888 20.0166 11.7324 19.9504 11.6103 19.8334L8.75509 17.1006C8.62867 16.9796 8.56137 16.8393 8.56137 16.6948C8.56137 16.5503 8.62867 16.4099 8.7551 16.2889C8.88162 16.1678 9.02726 16.1044 9.17598 16.1044C9.32469 16.1044 9.47034 16.1678 9.59686 16.2889L11.4151 18.0293V11.2604C11.4151 10.9463 11.6773 10.6984 12 10.6984C12.325 10.6984 12.5767 10.9464 12.6999 11.2412L12.7037 11.2504Z",\n fill: "currentcolor"\n }\n) }), mq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M14.9 15.9C14.7 15.9 14.5 16 14.3 16.2L13 17.4V11.2C12.8 10.8 12.5 10.5 12.1 10.5C11.6 10.5 11.3 10.9 11.3 11.3V17.3L10 16C9.8 15.8 9.6 15.7 9.4 15.7C9.2 15.7 9 15.8 8.8 16C8.6 16.2 8.5 16.4 8.5 16.6C8.5 16.8 8.6 17 8.8 17.2L11.6 19.9C11.8 20.1 12 20.2 12.2 20.2C12.4 20.2 12.7 20.1 12.8 19.9L15.6 17.2C15.8 17 15.9 16.8 15.9 16.6C15.9 16.4 15.8 16.2 15.6 16C15.3 15.9 15.1 15.9 14.9 15.9Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M19.5 8.7C19.3 8.7 19 8.7 18.8 8.8C17.9 5.9 15.2 4 12 4C9.9 4 7.9 4.9 6.6 6.4C6.3 6.4 6 6.4 5.8 6.4C2.6 6.4 0 8.9 0 12C0.1 15.1 2.6 17.6 5.8 17.6C6.3 17.6 6.6 17.2 6.6 16.8C6.6 16.3 6.2 16 5.8 16C3.5 16 1.7 14.2 1.7 12.1C1.7 9.9 3.5 8.2 5.8 8.2C6.1 8.2 6.5 8.3 6.7 8.3C6.8 8.3 6.8 8.3 6.9 8.3C7.2 8.3 7.4 8.1 7.6 7.9C8.6 6.6 10.2 5.8 11.9 5.8C14.6 5.8 16.7 8 17.2 10C17.3 10.4 17.7 10.7 18.1 10.7C18.2 10.7 18.3 10.7 18.3 10.7C18.6 10.6 19 10.5 19.3 10.5C20.9 10.5 22.2 11.7 22.2 13.2C22.2 14.7 20.9 15.9 19.3 15.9C18.8 15.9 18.5 16.3 18.5 16.7C18.5 17.2 18.9 17.5 19.3 17.5C21.8 17.5 23.9 15.5 23.9 13.1C23.9 10.7 22 8.7 19.5 8.7Z",\n fill: "currentcolor"\n }\n )\n] }), vq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "circle",\n {\n cx: "12",\n cy: "12",\n r: "11.3",\n stroke: "currentColor",\n strokeWidth: "1.4"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M15.582 9.25373C15.8129 9.02292 15.8129 8.64871 15.582 8.41791C15.3512 8.1871 14.977 8.1871 14.7462 8.41791L12 11.1641L9.2538 8.41791C9.023 8.1871 8.64879 8.1871 8.41799 8.41791C8.18718 8.64871 8.18718 9.02292 8.41799 9.25372L11.1642 11.9999L8.41791 14.7462C8.1871 14.977 8.1871 15.3512 8.41791 15.582C8.64871 15.8129 9.02292 15.8129 9.25372 15.582L12 12.8358L14.7463 15.582C14.9771 15.8129 15.3513 15.8129 15.5821 15.582C15.8129 15.3512 15.8129 14.977 15.5821 14.7462L12.8358 11.9999L15.582 9.25373Z",\n fill: "currentColor"\n }\n )\n] }), yq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A("g", { clipPath: "url(#clip0_2346_129556)", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24ZM7.29289 7.29289C6.90237 7.68342 6.90237 8.31658 7.29289 8.70711L10.5858 12L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L12 13.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L13.4142 12L16.7071 8.70711C17.0976 8.31658 17.0976 7.68342 16.7071 7.29289C16.3166 6.90237 15.6834 6.90237 15.2929 7.29289L12 10.5858L8.70711 7.29289C8.31658 6.90237 7.68342 6.90237 7.29289 7.29289Z",\n fill: "currentColor"\n }\n ) }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2346_129556", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), Lq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.5351 0L17.5497 0.0148315C17.5728 0.0382862 17.5956 0.0501022 17.6249 0.0649815L17.6263 0.0656614C17.6554 0.0804529 17.6909 0.0984354 17.726 0.134034L23.3696 5.85736C23.398 5.88612 23.4294 5.91801 23.4535 5.95065C23.4777 5.98334 23.5 6.02379 23.5 6.0696V23.4138C23.5 23.7386 23.2433 24 22.9213 24H6.05378C5.73176 24 5.4751 23.7386 5.4751 23.4138V18.2781H1.50525C0.952963 18.2781 0.505248 17.8304 0.505248 17.2781L0.5 6C0.5 5.44772 0.947715 5 1.5 5H5.4751V0.586207C5.4751 0.261365 5.73176 0 6.05378 0H17.5351ZM6.69129 22.7084V18.2781H12.4608H17.3375C17.6595 18.2781 17.9163 18.0168 17.9163 17.6919C17.9163 17.3671 17.6595 17.1057 17.3375 17.1057H12.5V13.9869H17.3375C17.6596 13.9869 17.9163 13.7255 17.9163 13.4007C17.9163 13.0758 17.6595 12.8145 17.3375 12.8145H12.5V9.75517H14.517C14.839 9.75517 15.0957 9.49382 15.0957 9.16898C15.0957 8.84413 14.839 8.58278 14.517 8.58278H12.5V6C12.5 5.44772 12.0523 5 11.5 5H6.69129V1.17242H16.7592V6.2484C16.7592 6.57325 17.0159 6.83462 17.338 6.83462H22.3425V22.7084H6.69129ZM17.9167 2.01887V5.66219H21.5092L17.9167 2.01887ZM3.77803 9.30307C4.03187 9.04923 4.44342 9.04923 4.69727 9.30307L6.47498 11.0808L8.25269 9.30308C8.50653 9.04924 8.91808 9.04924 9.17192 9.30308C9.42577 9.55692 9.42577 9.96848 9.17192 10.2223L7.39422 12L9.17188 13.7777C9.42572 14.0315 9.42572 14.4431 9.17188 14.6969C8.91803 14.9508 8.50648 14.9508 8.25264 14.6969L6.47498 12.9193L4.69732 14.6969C4.44347 14.9508 4.03192 14.9508 3.77808 14.6969C3.52424 14.4431 3.52424 14.0315 3.77808 13.7777L5.55574 12L3.77803 10.2223C3.52419 9.96846 3.52419 9.55691 3.77803 9.30307Z",\n fill: "currentColor"\n }\n) }), wq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M3.78307 2.13983H12V2.96152H3.78307C3.32926 2.96152 2.96138 3.3294 2.96138 3.7832V20.2169C2.96138 20.6707 3.32926 21.0386 3.78307 21.0386H20.2169C20.6707 21.0386 21.0386 20.6707 21.0386 20.2169V12.0001H21.8603V20.2169C21.8603 21.1245 21.1245 21.8603 20.2169 21.8603H3.78307C2.87546 21.8603 2.13969 21.1245 2.13969 20.2169V3.7832C2.13969 2.87559 2.87546 2.13983 3.78307 2.13983Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.735 3.58228L9.33849 14.9786C9.20345 15.1137 8.95707 15.0836 8.81873 14.9455C8.6804 14.8074 8.67777 14.5889 8.81281 14.4539L20.2094 3.0575L14.8366 4.06251C14.6186 4.11469 14.4256 3.97598 14.3959 3.78447C14.3386 3.56535 14.473 3.37568 14.664 3.35051L21.1823 2.13983L21.237 2.14043C21.2917 2.14104 21.3464 2.14165 21.374 2.16927L21.4017 2.19689C21.4564 2.1975 21.484 2.22512 21.5117 2.25273C21.5255 2.26654 21.5326 2.28712 21.5397 2.30768C21.5468 2.32824 21.5539 2.3488 21.5677 2.36261L21.5954 2.39023C21.5957 2.41754 21.6028 2.43811 21.6099 2.45867C21.6169 2.47923 21.624 2.4998 21.6244 2.52711L21.625 2.58175L20.4189 9.09545C20.4195 9.15008 20.3932 9.23172 20.3392 9.28574C20.2581 9.36676 20.1494 9.42016 20.0124 9.39132C19.8477 9.33486 19.7087 9.14213 19.7338 8.95124L20.735 3.58228Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.1397 2.00014V3.1012H3.78307C3.40641 3.1012 3.10107 3.40654 3.10107 3.7832V20.2169C3.10107 20.5936 3.40641 20.8989 3.78307 20.8989H20.2169C20.5936 20.8989 20.8989 20.5936 20.8989 20.2169V11.8604H22V20.2169C22 21.2017 21.2017 22 20.2169 22H3.78307C2.79831 22 2 21.2017 2 20.2169V3.7832C2 2.79844 2.79831 2.00014 3.78307 2.00014H12.1397ZM21.6244 2.52711L21.625 2.58175L20.4189 9.09545C20.4195 9.15008 20.3932 9.23172 20.3392 9.28574C20.2581 9.36676 20.1494 9.42016 20.0124 9.39132C19.8477 9.33486 19.7087 9.14213 19.7338 8.95124L20.735 3.58228L9.33849 14.9786C9.20345 15.1137 8.95707 15.0836 8.81873 14.9455C8.6804 14.8074 8.67777 14.5889 8.81281 14.4539L20.2094 3.0575L14.8366 4.06251C14.6186 4.11469 14.4256 3.97598 14.3959 3.78447C14.3386 3.56535 14.473 3.37568 14.664 3.35051L21.1823 2.13983L21.237 2.14043C21.2917 2.14104 21.3464 2.14165 21.374 2.16927L21.4017 2.19689C21.4564 2.1975 21.484 2.22512 21.5117 2.25273C21.5255 2.26654 21.5326 2.28712 21.5397 2.30768C21.5468 2.32824 21.5539 2.3488 21.5677 2.36261L21.5954 2.39023C21.5957 2.41754 21.6028 2.43811 21.6099 2.45867C21.6169 2.47923 21.624 2.4998 21.6244 2.52711ZM21.4674 2.06526C21.54 2.08338 21.5841 2.12754 21.6078 2.15124L21.6104 2.15387C21.6485 2.19194 21.6651 2.24196 21.6707 2.25885C21.6711 2.26017 21.6715 2.26128 21.6718 2.26217L21.6756 2.27289L21.7344 2.3316L21.7351 2.38855C21.7351 2.39093 21.7351 2.3933 21.7419 2.41319L21.7428 2.41567C21.7501 2.4368 21.7634 2.47534 21.764 2.52543L21.7648 2.59375L20.5583 9.10949C20.555 9.19657 20.5159 9.30658 20.4379 9.38451C20.3332 9.48924 20.1788 9.56909 19.9837 9.52801L19.9752 9.52624L19.9671 9.52346C19.8516 9.48386 19.7521 9.3998 19.6854 9.29864C19.6183 9.19695 19.5776 9.06778 19.5953 8.93308L19.5963 8.92559L20.5151 3.99978L9.43727 15.0774C9.33453 15.1802 9.19543 15.2142 9.06837 15.2037C8.94167 15.1933 8.81398 15.1382 8.72004 15.0444C8.52925 14.8539 8.52226 14.5469 8.71404 14.3551L19.7915 3.27777L14.8655 4.19922C14.5746 4.26678 14.305 4.08269 14.259 3.813C14.1867 3.52172 14.3666 3.25116 14.6418 3.21255L21.1702 2L21.2422 2.00079C21.2669 2.00106 21.3029 2.00144 21.3369 2.00666C21.3696 2.01168 21.423 2.0241 21.4674 2.06526ZM3.78307 2.13983C2.87546 2.13983 2.13969 2.87559 2.13969 3.7832V20.2169C2.13969 21.1245 2.87546 21.8603 3.78307 21.8603H20.2169C21.1245 21.8603 21.8603 21.1245 21.8603 20.2169V12.0001H21.0386V20.2169C21.0386 20.6707 20.6707 21.0386 20.2169 21.0386H3.78307C3.32926 21.0386 2.96138 20.6707 2.96138 20.2169V3.7832C2.96138 3.3294 3.32926 2.96152 3.78307 2.96152H12V2.13983H3.78307Z",\n fill: "currentColor"\n }\n )\n] }), qq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 8.37569C24 8.23971 23.9368 8.04434 23.7526 7.91234C23.6028 7.76571 23.3701 7.77001 23.2243 7.8416L19.4309 9.17632V6.05171C19.4309 5.72411 19.1778 5.45454 18.8536 5.45454H0.577345C0.253173 5.45454 0 5.72411 0 6.05171V17.9483C0 18.2759 0.253173 18.5455 0.577345 18.5455H18.8536C19.1778 18.5455 19.4309 18.2759 19.4309 17.9483V14.8237L23.2463 16.1661C23.4311 16.1661 23.6205 16.1702 23.7599 16.025C23.8728 15.9074 24 15.7177 24 15.5136V8.37569ZM22.7922 9.2351V14.7096L19.3778 13.5068V10.4379L22.7922 9.2351ZM1.10154 17.2958H18.2231V6.59355H1.10154V17.2958Z",\n fill: "currentColor"\n }\n) }), xq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.4574 19.4454C20.6822 19.8683 21.9104 20.3922 23.1658 20.7165C23.3055 20.7526 23.6206 20.7004 23.7802 20.5384C23.9052 20.4116 24 20.1819 24 20.0138V13.1234C24 12.9192 23.9906 12.7108 23.7995 12.5743C23.6193 12.4065 23.375 12.456 23.1907 12.5129C23.0965 12.5419 22.159 12.8633 21.2469 13.1769C20.7904 13.3338 20.3397 13.4889 20.0032 13.6048L19.5103 13.7746V10.8475C19.5103 10.489 19.226 10.1969 18.8667 10.1969H17.2878C18.3746 9.24162 19.0349 7.82682 19.0349 6.23754C19.0349 3.3048 16.6895 0.976929 13.8487 0.976929C12.2307 0.976929 10.7901 1.736 9.80811 3.00679C8.8244 1.73555 7.33182 0.976929 5.71436 0.976929C2.8185 0.976929 0.528205 3.36074 0.528205 6.23754C0.528205 7.83736 1.19688 9.21263 2.28977 10.1969H0.643591C0.284216 10.1969 0 10.489 0 10.8475V22.3724C0 22.731 0.284221 23.0231 0.643591 23.0231H18.8138C19.1732 23.0231 19.4574 22.731 19.4574 22.3724V19.4454ZM1.64758 6.23755C1.64758 3.98617 3.44348 2.11002 5.71476 2.11002C7.24655 2.11002 8.40226 2.97999 9.32813 4.415C9.40038 4.527 9.47961 4.6255 9.53628 4.68303H9.80815H10.0988C10.1607 4.61438 10.236 4.5258 10.3101 4.415C11.1969 3.08882 12.3701 2.11002 13.9547 2.11002C16.1732 2.11002 18.0219 3.93256 18.0219 6.23755C18.0219 8.54253 16.226 10.3651 13.9547 10.3651C12.423 10.3651 11.3848 9.3567 10.3101 8.06009C10.2251 7.95747 10.1546 7.84868 10.0988 7.79207H9.83474H9.57064C9.48922 7.8747 9.44441 7.95747 9.35936 8.06009C8.28471 9.3567 7.29937 10.3651 5.71476 10.3651C3.44348 10.3651 1.64758 8.48892 1.64758 6.23755ZM1.1722 21.89H18.3917V11.33H1.1722V21.89ZM22.9342 19.3706L19.3424 18.1377V15.0286L22.9342 13.7958V19.3706ZM9.78422 9.27198C9.50777 9.67969 9.19188 10.0099 8.83628 10.2617H10.7465C10.3858 9.9723 10.065 9.64237 9.78422 9.27198Z",\n fill: "currentColor"\n }\n) }), Rq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M8.31641 23.932C8.38526 24 8.52297 24 8.66067 24C8.72953 24 8.8672 24 8.93606 23.932L15.5459 20.6686C15.7525 20.5326 15.8902 20.3286 15.8902 20.1246V17.0651L22.3623 7.47876C22.4311 7.34278 22.5 7.27479 22.5 7.13881V0.611894C22.5 0.271951 22.2246 0 21.8804 0H2.11969C1.77543 0 1.5 0.271951 1.5 0.611894V7.13881C1.5 7.27479 1.56886 7.41077 1.63771 7.47876L8.10986 17.0651V23.3881C8.04101 23.6601 8.17871 23.796 8.31641 23.932ZM14.6508 19.7847L9.3492 22.4363V17.6091H14.6508V19.7847ZM2.73934 1.29178H21.1918V7.00283L14.9262 16.3173H9.00493L2.73934 7.00283V1.29178Z",\n fill: "currentColor"\n }\n) }), Bq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23 0.6V7.1C23 7.2 22.9 7.3 22.9 7.4L16.4 17V20.1C16.4 20.3 16.3 20.5 16.1 20.7L9.5 24C9.4 24 9.2 24 9.2 24C9.1 24 8.9 24 8.9 23.9C8.8 23.8 8.6 23.6 8.7 23.4V17.1L2.1 7.5C2.1 7.4 2 7.3 2 7.1V0.6C2 0.3 2.3 0 2.6 0H22.4C22.7 0 23 0.3 23 0.6Z",\n fill: "currentcolor"\n }\n) }), Wq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.652136 12.5572H2.96316V20.4128C2.96316 20.7059 3.20013 20.9404 3.49642 20.9404C3.7927 20.9404 4.02974 20.7059 4.02974 20.4128V12.5572H6.34077C6.63705 12.5572 6.87409 12.3227 6.87409 12.0296C6.87409 11.7365 6.63705 11.502 6.34077 11.502H4.02974V3.64642C4.02974 3.3533 3.7927 3.11881 3.49642 3.11881C3.20013 3.11881 2.96316 3.3533 2.96316 3.64642V11.502H0.652136C0.355852 11.502 0.118811 11.7365 0.118811 12.0296C0.118811 12.3227 0.355852 12.5572 0.652136 12.5572ZM21.0367 3.64642C21.0367 3.3533 20.7997 3.11881 20.5034 3.11881C20.2071 3.11881 19.97 3.3533 19.97 3.64642V8.68807H17.659C17.3627 8.68807 17.1257 8.92256 17.1257 9.21568C17.1257 9.5088 17.3627 9.7433 17.659 9.7433H19.97V20.4128C19.97 20.7059 20.2071 20.9404 20.5034 20.9404C20.7997 20.9404 21.0367 20.7059 21.0367 20.4128V9.7433H23.3476C23.6439 9.7433 23.881 9.5088 23.881 9.21568C23.881 8.92256 23.6439 8.68807 23.3476 8.68807H21.0367V3.64642ZM11.4963 15.3712H9.18531C8.88903 15.3712 8.65198 15.1367 8.65198 14.8436C8.65198 14.5504 8.88903 14.3159 9.18531 14.3159H11.4963V3.64642C11.4963 3.3533 11.7333 3.11881 12.0296 3.11881C12.3259 3.11881 12.5629 3.3533 12.5629 3.64642V14.3159H14.8739C15.1702 14.3159 15.4073 14.5504 15.4073 14.8436C15.4073 15.1367 15.1702 15.3712 14.8739 15.3712H12.5629V20.4128C12.5629 20.7059 12.3259 20.9404 12.0296 20.9404C11.7333 20.9404 11.4963 20.7059 11.4963 20.4128V15.3712Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M2.84438 12.676H0.652141C0.291449 12.676 0 12.3896 0 12.0296C0 11.6697 0.291449 11.3832 0.652141 11.3832H2.84438V3.64642C2.84438 3.2865 3.13573 3 3.49645 3C3.85714 3 4.14859 3.28648 4.14859 3.64642V11.3832H6.34082C6.70151 11.3832 6.99296 11.6697 6.99296 12.0296C6.99296 12.3896 6.70151 12.676 6.34082 12.676H4.14859V20.4128C4.14859 20.7727 3.85714 21.0592 3.49645 21.0592C3.13573 21.0592 2.84438 20.7727 2.84438 20.4128V12.676ZM0.652136 12.5572C0.355852 12.5572 0.118811 12.3227 0.118811 12.0296C0.118811 11.7365 0.355852 11.502 0.652136 11.502H2.96316V3.64642C2.96316 3.3533 3.20013 3.11881 3.49642 3.11881C3.7927 3.11881 4.02974 3.3533 4.02974 3.64642V11.502H6.34077C6.63705 11.502 6.87409 11.7365 6.87409 12.0296C6.87409 12.3227 6.63705 12.5572 6.34077 12.5572H4.02974V20.4128C4.02974 20.7059 3.7927 20.9404 3.49642 20.9404C3.20013 20.9404 2.96316 20.7059 2.96316 20.4128V12.5572H0.652136ZM20.5036 3C20.8642 3 21.1557 3.28648 21.1557 3.64642V8.56926H23.3479C23.7085 8.56926 24 8.85573 24 9.21568C24 9.57562 23.7086 9.86211 23.3479 9.86211H21.1557V20.4128C21.1557 20.7727 20.8643 21.0592 20.5036 21.0592C20.1429 21.0592 19.8514 20.7727 19.8514 20.4128V9.86211H17.6592C17.2985 9.86211 17.007 9.57562 17.007 9.21568C17.007 8.85574 17.2985 8.56926 17.6592 8.56926H19.8514V3.64642C19.8514 3.28648 20.1429 3 20.5036 3ZM19.97 3.64642C19.97 3.3533 20.2071 3.11881 20.5034 3.11881C20.7997 3.11881 21.0367 3.3533 21.0367 3.64642V8.68807H23.3476C23.6439 8.68807 23.881 8.92256 23.881 9.21568C23.881 9.5088 23.6439 9.7433 23.3476 9.7433H21.0367V20.4128C21.0367 20.7059 20.7997 20.9404 20.5034 20.9404C20.2071 20.9404 19.97 20.7059 19.97 20.4128V9.7433H17.659C17.3627 9.7433 17.1257 9.5088 17.1257 9.21568C17.1257 8.92256 17.3627 8.68807 17.659 8.68807H19.97V3.64642ZM11.3776 15.49H9.18539C8.8247 15.49 8.53325 15.2035 8.53325 14.8436C8.53325 14.4836 8.8247 14.1971 9.18539 14.1971H11.3776V3.64642C11.3776 3.28648 11.669 3 12.0297 3C12.3904 3 12.6818 3.28648 12.6818 3.64642V14.1971H14.8741C15.2348 14.1971 15.5262 14.4836 15.5262 14.8436C15.5262 15.2035 15.2348 15.49 14.8741 15.49H12.6818V20.4128C12.6818 20.7727 12.3904 21.0592 12.0297 21.0592C11.669 21.0592 11.3776 20.7727 11.3776 20.4128V15.49ZM11.4963 15.3712V20.4128C11.4963 20.7059 11.7333 20.9404 12.0296 20.9404C12.3259 20.9404 12.5629 20.7059 12.5629 20.4128V15.3712H14.8739C15.1702 15.3712 15.4073 15.1367 15.4073 14.8436C15.4073 14.5504 15.1702 14.3159 14.8739 14.3159H12.5629V3.64642C12.5629 3.3533 12.3259 3.11881 12.0296 3.11881C11.7333 3.11881 11.4963 3.3533 11.4963 3.64642V14.3159H9.18531C8.88903 14.3159 8.65198 14.5504 8.65198 14.8436C8.65198 15.1367 8.88903 15.3712 9.18531 15.3712H11.4963Z",\n fill: "currentcolor"\n }\n )\n] }), Eq = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M6.5 11.1H4.8V4C4.8 3.4 4.3 3 3.8 3C3.2 3 2.8 3.5 2.8 4V11.1H1C0.4 11.1 0 11.6 0 12.1C0 12.7 0.5 13.1 1 13.1H2.7V20.2C2.7 20.8 3.2 21.2 3.7 21.2C4.3 21.2 4.7 20.7 4.7 20.2V13.1H6.4C7 13.1 7.4 12.6 7.4 12.1C7.6 11.6 7.1 11.1 6.5 11.1Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.9 8.4H21.2V4C21.2 3.4 20.7 3 20.2 3C19.7 3 19.2 3.5 19.2 4V8.3H17.5C16.9 8.3 16.5 8.8 16.5 9.3C16.5 9.8 17 10.3 17.5 10.3H19.2V20.1C19.2 20.7 19.7 21.1 20.2 21.1C20.7 21.1 21.2 20.6 21.2 20.1V10.4H22.9C23.5 10.4 23.9 9.9 23.9 9.4C23.9 8.9 23.5 8.4 22.9 8.4Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M14.8 13.8H13.1V4C13.1 3.4 12.6 3 12.1 3C11.5 3 11.1 3.5 11.1 4V13.8H9.3C8.7 13.8 8.3 14.3 8.3 14.8C8.3 15.4 8.8 15.8 9.3 15.8H11V20.1C11 20.7 11.5 21.1 12 21.1C12.6 21.1 13 20.6 13 20.1V15.8H14.7C15.3 15.8 15.7 15.3 15.7 14.8C15.8 14.3 15.3 13.8 14.8 13.8Z",\n fill: "currentcolor"\n }\n )\n] }), Sq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5.4 0.7C5.4 0.313401 5.0866 0 4.7 0C4.3134 0 4 0.313401 4 0.7V23.3C4 23.6866 4.3134 24 4.7 24C5.0866 24 5.4 23.6866 5.4 23.3V0.7ZM19.1976 24C18.9569 24 18.7964 23.9216 18.6359 23.7647L7.24084 12.4706C6.91985 12.1569 6.91985 11.7647 7.24084 11.451L18.7162 0.235294C19.0371 -0.0784314 19.4384 -0.0784314 19.7594 0.235294C20.0803 0.54902 20.0803 0.941177 19.7594 1.2549L8.7655 12L19.7594 22.7451C20.0803 23.0588 20.0803 23.451 19.7594 23.7647C19.5989 23.9216 19.3581 24 19.1976 24Z",\n fill: "currentColor"\n }\n) }), kq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M9.02078 0.254132C7.13656 0.307946 5.26823 0.873142 3.56302 1.97938C3.33515 2.12564 3.18843 2.39591 3.1875 2.67119C3.1875 9.42415 3.1875 16.1771 3.1875 22.9301C3.1875 23.3829 3.54619 23.75 3.98863 23.75C4.4311 23.75 4.78977 23.3829 4.78977 22.9301V13.0056C5.78534 12.4129 9.06863 10.787 13.0181 12.5359C15.3768 13.5803 17.1723 13.7929 18.4091 13.7231C19.6458 13.6532 20.4036 13.2448 20.4036 13.2448C20.6485 13.104 20.8104 12.8233 20.8125 12.5359V2.66265C20.8151 2.37867 20.6609 2.09874 20.4228 1.95289C20.1847 1.80704 19.871 1.80064 19.6275 1.93668C19.6275 1.93668 19.3066 2.14391 18.334 2.1929C17.3613 2.2419 15.8207 2.08364 13.644 1.15092C12.4106 0.622404 11.123 0.325454 9.83024 0.262672C9.56093 0.249581 9.28993 0.246441 9.02078 0.254148V0.254132ZM9.12092 1.87689C9.33274 1.87178 9.54293 1.87472 9.75515 1.88543C10.8543 1.94161 11.957 2.2044 13.0265 2.66265C15.3932 3.67684 17.1879 3.89468 18.4174 3.83274C18.7532 3.81583 18.9515 3.74754 19.2102 3.69609V11.9551C19.0067 12.009 18.7511 12.0677 18.3256 12.0917C17.3544 12.1466 15.8143 11.99 13.6523 11.0327C9.8487 9.34841 6.51648 10.3881 4.78977 11.1949V10.3579V3.14948C6.1681 2.33898 7.63807 1.91269 9.12092 1.87689Z",\n fill: "currentColor"\n }\n) }), Nq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M20.6 2.4V12.3C20.6 12.6 20.4 12.9 20.2 13C20.2 13 19.4 13.4 18.2 13.5C17 13.6 15.2 13.4 12.8 12.3C9.1 10.7 6 12 4.8 12.6V22.6C4.8 23.1 4.4 23.5 3.9 23.5H3.8C3.8 23.5 3.8 23.5 3.7 23.5C3.3 23.4 3 23 3 22.6V2.4C3 2.1 3.2 1.8 3.4 1.7C5.1 0.6 7 0.1 8.8 0C9.1 0 9.3 0 9.6 0C10.9 0.1 12.2 0.4 13.4 0.9C15.6 1.8 17.1 2 18.1 1.9C19.1 1.9 19.4 1.7 19.4 1.7C19.6 1.6 19.9 1.6 20.2 1.7C20.5 1.9 20.6 2.1 20.6 2.4Z",\n fill: "currentColor"\n }\n) }), Iq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.9751 5.29354H13.4908L11.2209 3.01226C11.1588 2.94991 11.0936 2.89994 11.0176 2.866C10.9413 2.8319 10.8582 2.81583 10.7628 2.81583H1.01593C0.684697 2.81583 0.419922 3.08251 0.419922 3.41442V18.1079C0.419922 19.8227 1.77406 21.1842 3.48132 21.1842H22.9751C23.3064 21.1842 23.5711 20.9175 23.5711 20.5856V5.8997C23.6019 5.73253 23.5505 5.57905 23.4403 5.46837C23.3297 5.35712 23.1646 5.29354 22.9751 5.29354ZM1.66928 18.1655V4.07064H10.5576L11.7744 5.29354H3.48132C3.15009 5.29354 2.88532 5.56022 2.88532 5.89213V19.8425C2.16844 19.5939 1.66928 18.9544 1.66928 18.1655ZM4.07734 19.987H22.3791V6.49073H4.07734V19.987Z",\n fill: "currentColor"\n }\n) }), Tq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.8837 8.19881H23.4322C23.6896 8.19881 23.8226 8.33448 23.8812 8.39455L23.8887 8.40224L23.8946 8.41124C24.0227 8.60813 24.0204 8.80694 23.9599 8.9931L23.958 8.99891L19.8199 19.6495C19.7607 19.7708 19.683 19.8685 19.5843 19.9359C19.4849 20.0038 19.3702 20.0363 19.2446 20.0363H2.65335C1.21397 20.0363 0 18.8463 0 17.3211V4.56132C0 4.23212 0.258377 3.96365 0.586066 3.96365H8.90819C9.00076 3.96365 9.08282 3.9796 9.15876 4.01417C9.23415 4.0485 9.29791 4.09863 9.35724 4.1594L11.2334 6.08123H19.2976C19.6253 6.08123 19.8837 6.34971 19.8837 6.67891V8.19881ZM2.27039 18.7628C1.71545 18.5748 1.22514 17.991 1.22514 17.3211V5.159H8.70325L10.5794 7.08083C10.6388 7.1416 10.7025 7.19173 10.7779 7.22605C10.8539 7.26063 10.9359 7.27658 11.0285 7.27658H18.7115V8.19881H6.84091C6.71528 8.19881 6.6006 8.23133 6.50116 8.29924C6.40252 8.36659 6.32511 8.46446 6.26589 8.58577L2.27039 18.7628ZM18.9052 18.841L22.5833 9.44845H7.28634L3.6082 18.841H18.9052Z",\n fill: "currentColor"\n }\n) }), Dq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.8091 2.97525H23.368C23.7113 2.97525 24 3.23153 24 3.56724V7.78354C24 8.11925 23.7113 8.37553 23.368 8.37553C23.0246 8.37553 22.6767 8.11926 22.6767 7.78354V4.21399H18.8091C18.4657 4.21399 18.1771 3.90295 18.1771 3.56724C18.1771 3.24902 18.5217 2.97525 18.8091 2.97525ZM22.6767 19.8408V16.2712C22.6767 15.8896 23.0246 15.6793 23.368 15.6793C23.6818 15.6793 24 15.9575 24 16.2712V20.4725C24 20.8082 23.7113 21.0248 23.368 21.0248H18.8091C18.4657 21.0248 18.1771 20.8082 18.1771 20.4725C18.1771 20.1368 18.4657 19.8408 18.8091 19.8408H22.6767ZM1.26405 7.78354C1.26405 8.11925 0.975395 8.37553 0.632027 8.37553C0.28876 8.37553 0 8.07558 0 7.78354V3.56724C0 3.23153 0.288658 2.97525 0.632027 2.97525H5.13171C5.47508 2.97525 5.76374 3.23153 5.76374 3.56724C5.76374 3.90295 5.47508 4.21399 5.13171 4.21399H1.26405V7.78354ZM5.13171 21.0248H0.632027C0.292091 21.0248 0 20.818 0 20.4725V16.2712C0 15.9355 0.288658 15.6793 0.632027 15.6793C0.975396 15.6793 1.26405 15.9279 1.26405 16.2712V19.8408H5.13171C5.47508 19.8408 5.76374 20.1368 5.76374 20.4725C5.76374 20.8082 5.47508 21.0248 5.13171 21.0248Z",\n fill: "currentColor"\n }\n) }), Hq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M22 0C21.353 0.00166988 20.724 0.212417 20.2066 0.600811C19.6893 0.989205 19.3113 1.53444 19.1291 2.15519C18.9469 2.77593 18.9703 3.43894 19.1957 4.04533C19.4211 4.65172 19.8365 5.16899 20.38 5.52L17.76 13.07C17.6634 13.0651 17.5666 13.0651 17.47 13.07C16.8661 13.0726 16.2771 13.2573 15.78 13.6L11.15 9.38C11.3924 8.95999 11.5232 8.4849 11.53 8C11.5308 7.47913 11.3961 6.96702 11.1389 6.51404C10.8818 6.06107 10.5112 5.68284 10.0635 5.41659C9.61584 5.15033 9.10656 5.00522 8.58579 4.99553C8.06501 4.98584 7.55068 5.1119 7.09342 5.36132C6.63615 5.61074 6.2517 5.97491 5.9779 6.41801C5.7041 6.86111 5.55038 7.36785 5.53187 7.88839C5.51336 8.40893 5.63069 8.92532 5.87233 9.38674C6.11397 9.84817 6.47157 10.2387 6.90997 10.52L4.28997 18C4.19337 17.9951 4.09657 17.9951 3.99997 18C3.27826 17.9981 2.58006 18.2565 2.03342 18.7277C1.48678 19.1989 1.12833 19.8514 1.02382 20.5656C0.919304 21.2797 1.07573 22.0075 1.4644 22.6156C1.85308 23.2237 2.44795 23.6714 3.13993 23.8764C3.83191 24.0814 4.57461 24.0301 5.23183 23.7319C5.88904 23.4337 6.41673 22.9085 6.71811 22.2527C7.01948 21.597 7.07436 20.8545 6.87266 20.1616C6.67096 19.4686 6.22621 18.8716 5.61997 18.48L8.23997 10.93C8.33657 10.9349 8.43337 10.9349 8.52997 10.93C9.1338 10.9274 9.72281 10.7427 10.22 10.4L14.85 14.59C14.6026 15.0188 14.4716 15.5049 14.47 16C14.4691 16.5209 14.6039 17.033 14.861 17.486C15.1181 17.9389 15.4888 18.3172 15.9364 18.5834C16.3841 18.8497 16.8934 18.9948 17.4142 19.0045C17.9349 19.0142 18.4493 18.8881 18.9065 18.6387C19.3638 18.3893 19.7482 18.0251 20.022 17.582C20.2958 17.1389 20.4496 16.6321 20.4681 16.1116C20.4866 15.5911 20.3692 15.0747 20.1276 14.6133C19.886 14.1518 19.5284 13.7613 19.09 13.48L21.71 6C21.8066 6.00492 21.9034 6.00492 22 6C22.7956 6 23.5587 5.68393 24.1213 5.12132C24.6839 4.55871 25 3.79565 25 3C25 2.20435 24.6839 1.44129 24.1213 0.87868C23.5587 0.31607 22.7956 0 22 0V0ZM3.99997 22.6C3.68352 22.6 3.37418 22.5062 3.11106 22.3304C2.84794 22.1545 2.64286 21.9047 2.52176 21.6123C2.40066 21.3199 2.36898 20.9982 2.43071 20.6879C2.49245 20.3775 2.64483 20.0924 2.8686 19.8686C3.09236 19.6449 3.37746 19.4925 3.68782 19.4307C3.99819 19.369 4.3199 19.4007 4.61226 19.5218C4.90462 19.6429 5.15451 19.848 5.33032 20.1111C5.50613 20.3742 5.59997 20.6835 5.59997 21C5.59997 21.4243 5.4314 21.8313 5.13134 22.1314C4.83128 22.4314 4.42432 22.6 3.99997 22.6ZM8.52997 9.6C8.21352 9.6 7.90418 9.50616 7.64106 9.33035C7.37794 9.15454 7.17286 8.90466 7.05176 8.61229C6.93066 8.31993 6.89898 7.99823 6.96071 7.68786C7.02245 7.37749 7.17483 7.09239 7.3986 6.86863C7.62236 6.64487 7.90746 6.49248 8.21782 6.43074C8.52819 6.36901 8.8499 6.40069 9.14226 6.52179C9.43463 6.64289 9.68451 6.84797 9.86032 7.11109C10.0361 7.37421 10.13 7.68355 10.13 8C10.1195 8.41738 9.94636 8.81414 9.64743 9.1056C9.3485 9.39706 8.94748 9.56013 8.52997 9.56V9.6ZM17.47 17.68C17.1535 17.68 16.8442 17.5862 16.5811 17.4104C16.3179 17.2345 16.1129 16.9847 15.9918 16.6923C15.8707 16.3999 15.839 16.0782 15.9007 15.7679C15.9624 15.4575 16.1148 15.1724 16.3386 14.9486C16.5624 14.7249 16.8475 14.5725 17.1578 14.5107C17.4682 14.449 17.7899 14.4807 18.0823 14.6018C18.3746 14.7229 18.6245 14.928 18.8003 15.1911C18.9761 15.4542 19.07 15.7635 19.07 16.08C19.0595 16.4974 18.8864 16.8941 18.5874 17.1856C18.2885 17.4771 17.8875 17.6401 17.47 17.64V17.68ZM22 4.6C21.6835 4.6 21.3742 4.50616 21.1111 4.33035C20.8479 4.15454 20.6429 3.90466 20.5218 3.61229C20.4007 3.31993 20.369 2.99823 20.4307 2.68786C20.4925 2.37749 20.6448 2.09239 20.8686 1.86863C21.0924 1.64487 21.3775 1.49248 21.6878 1.43074C21.9982 1.36901 22.3199 1.40069 22.6123 1.52179C22.9046 1.64289 23.1545 1.84797 23.3303 2.11109C23.5061 2.37421 23.6 2.68355 23.6 3C23.6 3.42435 23.4314 3.83131 23.1313 4.13137C22.8313 4.43143 22.4243 4.6 22 4.6Z",\n fill: "currentcolor"\n }\n) }), Pq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 25", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M24.9999 3C24.9999 3.8 24.6999 4.6 24.0999 5.1C23.4999 5.6 22.7999 6 21.9999 6H21.8999L19.1999 13.6C19.5999 13.9 19.8999 14.2 20.0999 14.6C20.2999 15.1 20.4999 15.6 20.3999 16.1C20.3999 16.6 20.1999 17.1 19.9999 17.6C19.6999 18 19.2999 18.4 18.8999 18.7C18.3999 18.9 17.8999 19.1 17.3999 19.1C16.8999 19.1 16.3999 19 15.8999 18.7C15.3999 18.4 15.0999 18.1 14.7999 17.6C14.4999 17.1 14.3999 16.6 14.3999 16.1C14.3999 15.7 14.4999 15.3 14.6999 14.9L9.99989 10.5C9.49989 10.8 8.99989 10.9 8.49989 10.9L5.79989 18.6C6.29989 19 6.69989 19.5 6.89989 20.2C7.09989 20.9 7.09989 21.6 6.69989 22.3C6.39989 23 5.89989 23.5 5.19989 23.8C4.49989 24.1 3.79989 24.1 3.09989 23.9C2.39989 23.7 1.79989 23.2 1.39989 22.6C1.09989 22 0.89989 21.3 0.99989 20.6C1.09989 19.9 1.49989 19.2 1.99989 18.8C2.59989 18.3 3.29989 18 3.99989 18C3.99989 18 3.99989 18 4.09989 18L6.79989 10.4C6.39989 10.2 6.09989 9.8 5.89989 9.4C5.69989 8.9 5.49989 8.4 5.59989 7.9C5.59989 7.4 5.79989 6.9 5.99989 6.4C6.29989 6 6.59989 5.6 7.09989 5.4C7.59989 5.1 8.09989 5 8.59989 5C9.09989 5 9.59989 5.2 10.0999 5.4C10.5999 5.7 10.8999 6 11.1999 6.5C11.4999 7 11.5999 7.5 11.5999 8C11.5999 8.4 11.4999 8.8 11.2999 9.2L15.9999 13.5C16.4999 13.2 16.9999 13.1 17.4999 13.1H17.5999L20.2999 5.4C19.7999 5.1 19.4999 4.6 19.2999 4C18.9999 3.4 18.9999 2.8 19.0999 2.2C19.1999 1.6 19.6999 1 20.1999 0.7C20.6999 0.2 21.3999 0 21.9999 0C22.7999 0 23.5999 0.3 24.0999 0.9C24.6999 1.4 24.9999 2.2 24.9999 3Z",\n fill: "currentcolor"\n }\n) }), Vq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.6 0C0.3 0 0 0.3 0 0.7V6.6C0 7 0.3 7.3 0.6 7.3H4.4C4.8 7.2 5 6.9 5 6.5V0.7C5 0.3 4.8 0 4.4 0H0.6ZM0 9.6C0 9.2 0.3 9 0.6 9H8.4C8.8 9 9 9.3 9 9.6V15.4C9 15.8 8.7 16 8.4 16H0.6C0.3 16 0 15.7 0 15.4V9.6ZM10.8 9.6C10.8 9.2 11.1 9 11.4 9H15.3C15.7 9 15.9 9.3 15.9 9.6V15.4C15.9 15.8 15.6 16 15.3 16H11.4C11 16 10.8 15.7 10.8 15.4V9.6ZM6.7 0.7C6.7 0.3 7 0 7.4 0H15.3C15.7 0 16 0.3 16 0.7V6.6C16 7 15.7 7.3 15.3 7.3H7.4C7 7.2 6.7 6.9 6.7 6.5V0.7Z",\n fill: "currentColor"\n }\n) }), Fq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M20.788 12.9592V11.967C20.788 7.27046 16.9028 3.5 12.0637 3.5C7.22457 3.5 3.27149 7.33659 3.27149 12.0331V13.0253C1.43127 13.2899 0 14.8774 0 16.7296C0 18.7801 1.77207 20.5 3.88492 20.5C4.2257 20.5 4.49834 20.2354 4.49834 19.9047V11.967C4.49834 7.93194 7.83799 4.69069 11.9955 4.69069C16.1531 4.69069 19.4927 7.93194 19.4927 11.967V19.9047C19.4927 20.2354 19.6974 20.4339 20.0382 20.4339C22.1511 20.4339 23.9231 18.714 23.9231 16.6634C24.0594 14.8113 22.6282 13.2238 20.788 12.9592ZM1.29499 16.7296C1.29499 15.5389 2.18099 14.5467 3.27149 14.2821V19.2432C2.18099 18.9125 1.29499 17.9202 1.29499 16.7296ZM20.788 19.1109V14.1498C21.9466 14.4144 22.7645 15.4066 22.7645 16.5973C22.7645 17.788 21.9466 18.8463 20.788 19.1109Z",\n fill: "currentColor"\n }\n) }), Uq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 26 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.349 21.9435C13.2737 22.0147 13.137 22.08 12.998 22.08C12.9226 22.08 12.8654 22.0608 12.8126 22.0348C12.7895 22.0234 12.7666 22.0103 12.7447 21.9978L12.7391 21.9946C12.7148 21.9808 12.6904 21.9671 12.6627 21.9534L12.6511 21.9477L12.6517 21.9469C8.69275 19.1365 5.76181 16.8837 3.82081 14.7911C1.87811 12.6966 0.919922 10.755 0.919922 8.56803C0.919922 4.79943 3.65199 1.92 7.29891 1.92C10.2056 1.92 12.1823 3.2392 13.058 3.96663C13.9337 3.2392 15.9104 1.92 18.8171 1.92C22.4632 1.92 25.1968 4.79895 25.0761 8.5693C25.0757 10.7557 24.1176 12.7117 22.1753 14.8132C20.235 16.9124 17.3057 19.1642 13.349 21.9435ZM13.6289 5.19476C13.471 5.29439 13.3216 5.39359 13.118 5.39359C12.9194 5.39359 12.7922 5.30439 12.6289 5.19476C10.9216 4.04893 9.54905 3.14508 7.3589 3.14508C4.46833 3.14508 2.27973 5.47119 2.27973 8.56803C2.27973 10.4331 3.1501 12.16 4.9501 14.0754C6.74362 15.9839 9.45185 18.0709 13.118 20.6595C16.7841 18.0709 19.4923 15.9839 21.2859 14.0754C23.0859 12.16 23.9562 10.4331 23.9562 8.56803C23.9562 5.47119 21.7676 3.14508 18.8771 3.14508C16.1722 3.14508 14.2385 4.8102 13.6289 5.19476Z",\n fill: "currentcolor"\n }\n) }), Yq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 22.6C17.8542 22.6 22.6 17.8542 22.6 12C22.6 6.14578 17.8542 1.4 12 1.4C6.14578 1.4 1.4 6.14578 1.4 12C1.4 17.8542 6.14578 22.6 12 22.6ZM12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M9.87622 7.50601L9.95361 7.46538C10.2778 7.29519 10.6389 7.15872 11.0364 7.05547C11.4454 6.9517 11.8779 6.8999 12.3325 6.8999C12.8706 6.8999 13.3182 6.97452 13.6702 7.12934C14.0246 7.27204 14.3122 7.45944 14.5288 7.6938C14.7436 7.92613 14.8914 8.18898 14.9704 8.48165C15.0565 8.75722 15.1001 9.02521 15.1001 9.28522C15.1001 9.61228 15.037 9.90915 14.9085 10.1738L14.9078 10.1751C14.7833 10.4222 14.6301 10.6547 14.4484 10.8728C14.2684 11.0889 14.0696 11.2954 13.8521 11.4923C13.6413 11.6832 13.449 11.883 13.2752 12.0916L13.2738 12.0933C13.1029 12.2896 12.9587 12.5084 12.8414 12.7499L12.8408 12.7513C12.7277 12.9756 12.6699 13.2323 12.6699 13.5234V13.6758C12.6699 13.7257 12.6741 13.7697 12.6819 13.8084L12.7061 13.9282H11.4127L11.3965 13.8479C11.3578 13.6563 11.3386 13.4557 11.3386 13.2464C11.3386 12.9393 11.3919 12.6579 11.5003 12.4039L11.5016 12.4009C11.6167 12.1535 11.7607 11.925 11.9334 11.7155C12.1034 11.5002 12.2831 11.3032 12.4725 11.1247C12.6572 10.9415 12.8326 10.7584 12.9987 10.5754C13.1608 10.3967 13.2905 10.2102 13.3885 10.0158L13.3901 10.0126C13.4934 9.82478 13.5453 9.61987 13.5453 9.39602C13.5453 9.03205 13.4284 8.74545 13.1992 8.52652L13.1978 8.52521C12.9712 8.30045 12.6326 8.18023 12.1649 8.18023C11.5682 8.18023 10.9837 8.33248 10.4104 8.63932L10.3087 8.69374L9.87622 7.50601Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.1448 16.0719C13.1448 16.3461 13.0517 16.587 12.8674 16.7901C12.6778 16.999 12.421 17.0999 12.109 17.0999C11.7971 17.0999 11.5402 16.999 11.3506 16.7901C11.1663 16.587 11.0733 16.3461 11.0733 16.0719C11.0733 15.7978 11.1663 15.5568 11.3506 15.3538C11.5402 15.1448 11.7971 15.0439 12.109 15.0439C12.421 15.0439 12.6778 15.1448 12.8674 15.3538C13.0517 15.5568 13.1448 15.7978 13.1448 16.0719Z",\n fill: "currentColor"\n }\n )\n] }), Xq = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 0C5.4 0 0 5.4 0 12C0 18.6 5.4 24 12 24C18.6 24 24 18.6 24 12C24 5.4 18.6 0 12 0ZM10.8 16.1C10.8 15.8 10.9 15.5 11.2 15.2C11.4 14.9 11.8 14.8 12.2 14.8C12.6 14.8 12.9 14.9 13.2 15.2C13.4 15.5 13.5 15.8 13.5 16.1C13.5 16.5 13.4 16.8 13.2 17C13 17.3 12.6 17.4 12.2 17.4C11.8 17.4 11.5 17.3 11.2 17C10.9 16.7 10.8 16.4 10.8 16.1ZM15.2 9.5C15.1 9.8 14.9 10 14.7 10.3C14.5 10.5 14.3 10.7 14.1 10.9C13.9 11.1 13.7 11.3 13.6 11.5C13.4 11.7 13.3 11.9 13.2 12.1C13 12.2 13 12.5 13 12.7V13.1L13.1 13.4H11.2V13.2C11.2 12.9 11.1 12.7 11.1 12.5C11.1 12.2 11.2 11.8 11.3 11.6C11.4 11.3 11.6 11.1 11.8 10.8C12 10.6 12.2 10.4 12.4 10.2C12.6 10 12.7 9.8 12.9 9.7C13 9.6 13.2 9.4 13.3 9.2C13.4 9 13.4 8.9 13.4 8.7C13.4 8.4 13.3 8.2 13.1 8C12.9 7.8 12.6 7.7 12.3 7.7C11.8 7.7 11.2 7.8 10.7 8.1L10.3 8.3L9.5 6.6L9.7 6.5C10.2 6.2 10.5 6.1 11 6C11.4 5.9 11.9 5.8 12.4 5.8C13 5.8 13.5 5.9 13.9 6.1C14.3 6.3 14.6 6.5 14.9 6.7C15 7 15.2 7.3 15.2 7.6C15.3 7.9 15.3 8.2 15.3 8.5C15.4 8.8 15.3 9.2 15.2 9.5Z",\n fill: "currentColor"\n }\n) }), Qq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "circle",\n {\n cx: "12",\n cy: "12",\n r: "11.3",\n stroke: "currentColor",\n strokeWidth: "1.4"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M10.1557 7.99856C9.72698 8.3508 9.45455 8.85953 9.45455 9.52941C9.45455 9.91927 9.12895 10.2353 8.72727 10.2353C8.3256 10.2353 8 9.91927 8 9.52941C8 8.44496 8.46022 7.54193 9.21593 6.92104C9.96015 6.3096 10.9533 6 12 6C14.2092 6 16 7.73816 16 9.88235C16 11.5313 14.7578 12.852 13.3313 13.4278C12.7049 13.6806 12.3636 14.1103 12.3636 14.4706V14.8235C12.3636 15.2134 12.038 15.5294 11.6364 15.5294C11.2347 15.5294 10.9091 15.2134 10.9091 14.8235V14.4706C10.9091 13.2714 11.9156 12.4702 12.7727 12.1242C13.8208 11.7012 14.5455 10.8063 14.5455 9.88235C14.5455 8.51788 13.4058 7.41176 12 7.41176C11.2392 7.41176 10.596 7.6368 10.1557 7.99856ZM12.3636 17.2941C12.3636 17.684 12.038 18 11.6364 18C11.2347 18 10.9091 17.684 10.9091 17.2941C10.9091 16.9043 11.2347 16.5882 11.6364 16.5882C12.038 16.5882 12.3636 16.9043 12.3636 17.2941Z",\n fill: "currentColor"\n }\n )\n] }), Gq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M2.58405 6.49648L7.42904 5.3308C7.78849 5.24432 8.14999 5.4656 8.23647 5.82506C8.32296 6.18451 8.10167 6.54601 7.74222 6.63249L1.30246 8.18186C0.819599 8.29804 0.354159 7.9349 0.349412 7.43827L0.287629 0.974144C0.284095 0.604452 0.580925 0.301894 0.950617 0.298361C1.32031 0.294827 1.62287 0.591657 1.6264 0.961348L1.66917 5.43572C5.12616 0.136351 12.1657 -1.59248 17.7116 1.60943C23.4501 4.92258 25.4163 12.2604 22.1031 17.999C18.79 23.7375 11.4521 25.7037 5.71357 22.3906C5.3934 22.2057 5.2837 21.7963 5.46855 21.4761C5.6534 21.1559 6.06281 21.0462 6.38299 21.2311C11.4812 24.1746 18.0002 22.4278 20.9437 17.3296C23.8871 12.2314 22.1404 5.71234 17.0422 2.76889C12.0024 -0.140831 5.57412 1.5328 2.58405 6.49648Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M17.5879 11.4194H12.3003V6.13184C12.3003 5.82443 12.0544 5.5785 11.747 5.5785C11.4396 5.5785 11.1936 5.82443 11.1936 6.13184V12.0342C11.1936 12.3416 11.4396 12.5875 11.747 12.5875H17.6493C17.9568 12.5875 18.2027 12.3416 18.2027 12.0342C18.2027 11.7268 17.8953 11.4194 17.5879 11.4194Z",\n fill: "currentColor"\n }\n )\n] }), jq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.7524 10.0811L12.3049 1.59852L12.3017 1.59625C12.1967 1.52628 12.0618 1.49391 11.9313 1.49391C11.8009 1.49391 11.6659 1.52618 11.5609 1.59615L0.228707 10.0812C-0.179525 10.347 -0.0386782 11.1747 0.630618 11.1747H2.86471V21.8927C2.86471 22.2332 3.13755 22.5061 3.47804 22.5061H20.5033C20.8438 22.5061 21.1166 22.2332 21.1166 21.8927V11.1747H23.3507C24.027 11.1747 24.1993 10.3718 23.7524 10.0811ZM21.3339 9.94796L11.9017 2.82976L2.46943 9.94796H21.3339ZM19.8306 11.234V21.3387H15.4218V16.316C15.4218 15.9755 15.1489 15.7026 14.8084 15.7026H9.11357C8.77308 15.7026 8.50024 15.9755 8.50024 16.316V21.3387H4.09137V11.234H19.8306ZM9.7269 21.3387H14.1358V16.9294H9.7269V21.3387Z",\n fill: "currentColor"\n }\n) }), Kq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A("g", { clipPath: "url(#clip0_2346_129555)", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.8 9.6L12.3 1.1C12.2 1 12.1 1 11.9 1C11.7 1 11.6 1 11.5 1.1L0.200047 9.6C-0.199953 9.9 4.70281e-05 10.7 0.600047 10.7H2.80005V21.4C2.80005 21.7 3.10005 22 3.40005 22H9.60005V16.4H14V22H20.4C20.7 22 21 21.7 21 21.4V10.7H23.2C24 10.7 24.2 9.9 23.8 9.6Z",\n fill: "currentColor"\n }\n ) }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2346_129555", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), Zq = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.586228 3.0498H23.4138C23.7118 3.0498 23.9502 3.28488 23.9502 3.57874V20.4461C23.9502 20.74 23.7118 20.9751 23.4138 20.9751H0.586228C0.556427 20.9751 0.526628 20.9604 0.496828 20.9457C0.467029 20.931 0.43723 20.9163 0.407429 20.9163H0.288218L0.228612 20.8575C0.228612 20.8575 0.169007 20.8575 0.169007 20.7988C0.169007 20.7988 0.109419 20.7988 0.109419 20.74C0.0498629 20.6813 0.0498137 20.6812 0.0498137 20.6225V3.57874C0.0498137 3.28488 0.288218 3.0498 0.586228 3.0498ZM18.1092 8.86817L22.8774 13.5699V4.10768H1.18225V18.6242L5.8908 11.6892C6.01 11.5716 6.12921 11.4541 6.30802 11.4541C6.42722 11.4541 6.60602 11.5129 6.72522 11.6304L11.9702 16.8023L17.2748 8.92694C17.394 8.8094 17.5132 8.69184 17.692 8.69184C17.8112 8.69184 17.99 8.75062 18.1092 8.86817ZM6.42721 12.8646L1.65906 19.9172V19.976H22.8774V15.0979L17.8112 10.1024L12.5066 17.9777C12.3874 18.0953 12.2682 18.2128 12.0894 18.2128C11.9702 18.2128 11.7914 18.1541 11.6722 18.0365L6.42721 12.8646ZM6.84456 7.81023C6.84456 8.86809 5.95056 9.74965 4.87776 9.74965C3.80495 9.74965 2.91094 8.86809 2.91094 7.81023C2.91094 6.75238 3.80495 5.87084 4.87776 5.87084C5.95056 5.87084 6.84456 6.75238 6.84456 7.81023ZM5.77176 7.86901C5.77176 7.39885 5.35456 6.98746 4.87776 6.98746C4.40096 6.98746 3.98375 7.39885 3.98375 7.86901C3.98375 8.33916 4.40096 8.75055 4.87776 8.75055C5.35456 8.75055 5.77176 8.33916 5.77176 7.86901Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.267798 20.9661L0.205504 20.9047C0.197379 20.903 0.18728 20.9 0.176789 20.8948C0.163488 20.8883 0.148569 20.8776 0.137071 20.8606C0.13277 20.8543 0.129223 20.8474 0.126455 20.8401C0.12343 20.839 0.120326 20.8376 0.117188 20.8361C0.103888 20.8295 0.0889719 20.8188 0.0774768 20.8018C0.0696906 20.7903 0.0643757 20.7772 0.0616823 20.7628C0.0526234 20.7538 0.0447207 20.7458 0.0381643 20.7386C0.0286083 20.7282 0.0195556 20.7169 0.0128487 20.7037C-0.000138765 20.6781 -6.09367e-05 20.6519 1.07113e-05 20.6277C1.59829e-05 20.626 2.12212e-05 20.6242 2.12212e-05 20.6224V3.57874C2.12212e-05 3.25672 0.261379 3 0.586228 3H23.4138C23.7386 3 24 3.25672 24 3.57874V20.4461C24 20.7681 23.7386 21.0249 23.4138 21.0249H0.586228C0.544563 21.0249 0.505508 21.0055 0.478591 20.9922L0.474807 20.9903C0.442173 20.9743 0.42337 20.9661 0.407429 20.9661H0.267798ZM0.169007 20.7988C0.169007 20.8575 0.228612 20.8575 0.228612 20.8575L0.288218 20.9163H0.407429C0.43723 20.9163 0.467029 20.931 0.496828 20.9457C0.526628 20.9604 0.556427 20.9751 0.586228 20.9751H23.4138C23.7118 20.9751 23.9502 20.74 23.9502 20.4461V3.57874C23.9502 3.28488 23.7118 3.0498 23.4138 3.0498H0.586228C0.288218 3.0498 0.0498137 3.28488 0.0498137 3.57874V20.6225C0.0498137 20.6812 0.0498629 20.6813 0.109419 20.74C0.109419 20.7988 0.169007 20.7988 0.169007 20.7988ZM17.2748 8.92694C17.394 8.8094 17.5132 8.69184 17.692 8.69184C17.8112 8.69184 17.99 8.75062 18.1092 8.86817L22.8774 13.5699V4.10768H1.18225V18.6242L5.8908 11.6892C6.01 11.5716 6.12921 11.4541 6.30802 11.4541C6.42722 11.4541 6.60602 11.5129 6.72522 11.6304L11.9702 16.8023L17.2748 8.92694ZM11.9624 16.7247L17.2372 8.89356L17.2398 8.89139L17.2451 8.88626C17.3603 8.77261 17.4927 8.64205 17.692 8.64205C17.8233 8.64205 18.015 8.70531 18.1442 8.83271L22.8276 13.4509V4.15747H1.23204V18.4622L5.85516 11.653L5.8611 11.6485C5.97632 11.5349 6.10868 11.4043 6.30802 11.4043C6.43932 11.4043 6.63098 11.4676 6.76018 11.595L11.9624 16.7247ZM12.5423 18.0139L12.5416 18.0132L12.5363 18.0184C12.4211 18.132 12.2887 18.2626 12.0894 18.2626C11.9581 18.2626 11.7664 18.1994 11.6372 18.072L6.43491 12.9421L1.71309 19.9262H22.8276V15.1188L17.819 10.18L12.5423 18.0139ZM17.8112 10.1024L22.8774 15.0979V19.976H1.65906V19.9172L6.42721 12.8646L11.6722 18.0365C11.7914 18.1541 11.9702 18.2128 12.0894 18.2128C12.2682 18.2128 12.3874 18.0953 12.5066 17.9777L17.8112 10.1024ZM6.89435 7.81023C6.89435 8.89624 5.9774 9.79943 4.87776 9.79943C3.77811 9.79943 2.86114 8.89624 2.86114 7.81023C2.86114 6.72422 3.77811 5.82104 4.87776 5.82104C5.9774 5.82104 6.89435 6.72422 6.89435 7.81023ZM5.72197 7.869C5.72197 7.427 5.32772 7.03725 4.87776 7.03725C4.42779 7.03725 4.03355 7.427 4.03355 7.869C4.03355 8.311 4.42779 8.70076 4.87776 8.70076C5.32772 8.70076 5.72197 8.311 5.72197 7.869ZM4.87776 9.74965C5.95056 9.74965 6.84456 8.86809 6.84456 7.81023C6.84456 6.75238 5.95056 5.87084 4.87776 5.87084C3.80495 5.87084 2.91094 6.75238 2.91094 7.81023C2.91094 8.86809 3.80495 9.74965 4.87776 9.74965ZM4.87776 6.98746C5.35456 6.98746 5.77176 7.39885 5.77176 7.86901C5.77176 8.33916 5.35456 8.75055 4.87776 8.75055C4.40096 8.75055 3.98375 8.33916 3.98375 7.86901C3.98375 7.39885 4.40096 6.98746 4.87776 6.98746Z",\n fill: "currentColor"\n }\n )\n] }), Jq = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M24 0.967455C23.9923 0.455427 23.5619 0.00800594 23.0325 0L8.84056 2.58238C8.42455 2.63559 8.13314 3.04799 8.25952 3.52628C8.32543 3.94411 8.74684 4.24821 9.2215 4.13635L20.9193 1.99236L0.215259 22.6964C-0.0779991 22.9896 -0.0707233 23.4661 0.231611 23.7685C0.533945 24.0708 1.01043 24.0781 1.30369 23.7848L21.9491 3.13944L19.805 14.8372C19.7518 15.2532 20.056 15.6746 20.4151 15.7992C20.833 15.8651 21.2454 15.5737 21.359 15.2182L24 0.967455Z",\n fill: "currentcolor"\n }\n) }), _q = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 22.6C17.8542 22.6 22.6 17.8542 22.6 12C22.6 6.14578 17.8542 1.4 12 1.4C6.14578 1.4 1.4 6.14578 1.4 12C1.4 17.8542 6.14578 22.6 12 22.6ZM12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.7999 7.7C12.7999 8.0866 12.4865 8.4 12.0999 8.4C11.7133 8.4 11.3999 8.0866 11.3999 7.7C11.3999 7.3134 11.7133 7 12.0999 7C12.4865 7 12.7999 7.3134 12.7999 7.7Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.3999 9.59998H12.7999V16H11.3999V9.59998Z",\n fill: "currentColor"\n }\n )\n] }), $q = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 0C5.4 0 0 5.4 0 12C0 18.6 5.4 24 12 24C18.6 24 24 18.6 24 12C24 5.4 18.6 0 12 0ZM11 10.2H13.2V17.4H11V10.2ZM12.1 8.8C11.5 8.8 11 8.3 11 7.7C11 7.1 11.5 6.6 12.1 6.6C12.7 6.6 13.2 7.1 13.2 7.7C13.2 8.3 12.7 8.8 12.1 8.8Z",\n fill: "currentColor"\n }\n) }), ex = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.0156 0H4.67943C4.3769 0 4.07438 0.302521 4.07438 0.605042V3.22689H3.06598C2.76346 3.22689 2.46094 3.52941 2.46094 3.93277C2.46094 4.33613 2.76346 4.53782 3.06598 4.53782H4.07438V6.55462H3.06598C2.76346 6.55462 2.46094 6.85714 2.46094 7.15966C2.46094 7.46219 2.76346 7.76471 3.06598 7.76471H4.07438V9.78151H3.06598C2.76346 9.78151 2.46094 10.084 2.46094 10.4874C2.46094 10.7899 2.76346 11.0924 3.06598 11.0924H4.07438V13.1092H3.06598C2.76346 13.1092 2.46094 13.4118 2.46094 13.7143C2.46094 14.0168 2.76346 14.3193 3.06598 14.3193H4.07438V16.3361H3.06598C2.76346 16.3361 2.46094 16.6387 2.46094 16.9412C2.46094 17.2437 2.76346 17.5462 3.06598 17.5462H4.07438V19.563H3.06598C2.76346 19.563 2.46094 19.8655 2.46094 20.1681C2.46094 20.4706 2.76346 20.7731 3.06598 20.7731H4.07438V23.395C4.07438 23.6975 4.3769 24 4.67943 24H20.9147C21.2172 24 21.5198 23.6975 21.5198 23.395V0.605042C21.6206 0.302521 21.3181 0 21.0156 0ZM20.3097 22.8908H5.38531V20.874H6.39371C6.69623 20.874 6.99875 20.5714 6.99875 20.2689C6.99875 19.9664 6.69623 19.6639 6.39371 19.6639H5.38531V17.6471H6.39371C6.69623 17.6471 6.99875 17.3445 6.99875 17.042C6.99875 16.7395 6.69623 16.437 6.39371 16.437H5.38531V14.4202H6.39371C6.69623 14.4202 6.99875 14.1176 6.99875 13.8151C6.99875 13.5126 6.69623 13.2101 6.39371 13.2101H5.38531V11.1933H6.39371C6.69623 11.1933 6.99875 10.8908 6.99875 10.5882C6.99875 10.2857 6.69623 9.98319 6.39371 9.98319H5.38531V7.96639H6.39371C6.69623 7.96639 6.99875 7.66387 6.99875 7.36135C6.99875 7.05882 6.69623 6.55462 6.39371 6.55462H5.38531V4.53782H6.39371C6.69623 4.53782 6.99875 4.23529 6.99875 3.93277C6.99875 3.63025 6.69623 3.22689 6.39371 3.22689H5.38531V1.21008H20.4105V22.8908H20.3097Z",\n fill: "currentColor"\n }\n) }), tx = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M21.6 0.6V23.4C21.6 23.7 21.3 24 21 24H4.8C4.5 24 4.2 23.7 4.2 23.4V21.4H2.9C2.4 21.4 2 21 2 20.5C2 20 2.4 19.6 2.9 19.6H4.1V18.1H2.9C2.4 18.1 2 17.7 2 17.2C2 16.7 2.4 16.3 2.9 16.3H4.1V14.8H2.9C2.4 14.8 2 14.4 2 13.9C2 13.4 2.4 13 2.9 13H4.1V11.5H2.9C2.4 11.5 2 11.1 2 10.6C2 10.1 2.4 9.7 2.9 9.7H4.1V7.9H2.9C2.4 7.9 2 7.5 2 7C2 6.5 2.4 6.1 2.9 6.1H4.1V4.6H2.9C2.4 4.6 2 4.1 2 3.6C2 3.1 2.4 2.7 2.9 2.7H4.1V0.6C4.2 0.3 4.5 0 4.8 0H21.1C21.4 0 21.7 0.3 21.6 0.6Z",\n fill: "currentColor"\n }\n) }), rx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M4.94533 23.2745L11.8829 16.585L18.8205 23.2745C18.9764 23.4248 19.1323 23.5 19.3662 23.5C19.4441 23.5 19.5221 23.5 19.678 23.4248C19.9118 23.3497 20.1457 23.049 20.1457 22.7484V1.17647C20.1457 0.800649 19.8338 0.5 19.4441 0.5H4.55558C4.16582 0.5 3.854 0.800649 3.854 1.17647V22.7484C3.854 23.049 4.00993 23.2745 4.32174 23.4248C4.47764 23.5 4.78943 23.4248 4.94533 23.2745ZM5.17917 1.85293H18.6646V21.0196L12.4286 15.0065C12.2727 14.8562 12.1168 14.781 11.8829 14.781C11.727 14.781 11.4932 14.8562 11.3373 15.0065L5.10124 21.0196V1.85293H5.17917Z",\n fill: "currentColor"\n }\n) }), nx = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M4.20576 23.7647L11.8708 16.7843L19.5359 23.7647C19.7081 23.9216 19.8804 24 20.1388 24C20.2249 24 20.311 24 20.4833 23.9216C20.7416 23.8431 21 23.5294 21 23.2157V0.705877C21 0.313721 20.6555 0 20.2249 0H3.77514C3.34452 0 3 0.313721 3 0.705877V23.2157C3 23.5294 3.17228 23.7647 3.51678 23.9216C3.68903 24 4.03351 23.9216 4.20576 23.7647Z",\n fill: "currentColor"\n }\n) }), ox = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.7 0.7C20.7 0.313401 20.3866 0 20 0C19.6134 0 19.3 0.313401 19.3 0.7V23.3C19.3 23.6866 19.6134 24 20 24C20.3866 24 20.7 23.6866 20.7 23.3V0.7ZM4.09767 24C3.85838 24 3.69887 23.9216 3.53934 23.7647C3.22028 23.451 3.22028 22.9804 3.53934 22.7451L14.467 12L3.53934 1.2549C3.22028 0.941177 3.22028 0.54902 3.53934 0.235294C3.8584 -0.0784314 4.25721 -0.0784314 4.57626 0.235294L16.0623 11.5294C16.3813 11.8431 16.3813 12.2353 16.0623 12.549L4.65603 23.7647C4.4965 23.9216 4.33697 24 4.09767 24Z",\n fill: "currentColor"\n }\n) }), ix = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M10.3407 24H13.7299C14.083 24 14.3654 23.7265 14.3654 23.3846V20.6496C15.3539 20.4445 16.06 19.6239 16.06 18.6667V17.5043H16.3424C16.6248 17.5043 16.8367 17.3675 16.9073 17.1624L20.2259 10.4615V10.3932L20.7201 8.88889C21.285 7.11111 21.0026 5.19659 19.8022 3.55556C18.3195 1.43591 15.5657 0.136752 12.5296 0C12.1765 0 11.8235 0 11.4705 0C8.4343 0.136752 5.68058 1.50428 4.19781 3.55556C2.99746 5.19659 2.715 7.11111 3.27986 8.88889L3.77413 10.3932V10.4615L7.09273 17.1624C7.23395 17.3675 7.44576 17.5043 7.65759 17.5043H7.94004V18.6667C7.94004 19.6239 8.64609 20.4445 9.63461 20.6496V23.3846C9.70522 23.7265 9.98765 24 10.3407 24ZM13.0944 22.7692H10.9762V20.7863H13.0238V22.7692H13.0944ZM5.04507 9.91453L4.55085 8.41027C4.05659 6.97437 4.33902 5.47009 5.25693 4.17094C6.52788 2.39317 8.85793 1.23078 11.541 1.1624C11.8235 1.1624 12.1765 1.1624 12.4589 1.1624C15.0715 1.29915 17.4015 2.39317 18.7431 4.17094C19.661 5.47009 19.9434 6.97437 19.4492 8.41027L18.9549 9.91453L15.8482 16.2735H12.8826L15.9894 7.31625C16.1306 6.97437 15.9188 6.63248 15.5657 6.49573C15.2127 6.35897 14.8596 6.56411 14.7184 6.90599L11.9647 14.906L9.49343 7.72651H11.9647C12.3178 7.72651 12.6002 7.45299 12.6002 7.11111C12.6002 6.76923 12.3178 6.49573 11.9647 6.49573H8.57549C8.36366 6.49573 8.15184 6.5641 8.01063 6.76923C7.86941 6.90598 7.86943 7.17949 7.94004 7.31625L11.0468 16.2735H8.15185L5.04507 9.91453ZM9.3522 18.6667V17.5043H14.7891V18.6667C14.7891 19.1453 14.3654 19.4872 13.8711 19.4872H13.7299H10.3407H10.1995C9.70525 19.4872 9.3522 19.1453 9.3522 18.6667Z",\n fill: "currentColor"\n }\n) }), ax = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_6207_51984)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.9999 0.0999756C12.4969 0.0999756 12.8999 0.502919 12.8999 0.999976V2.99998C12.8999 3.49703 12.4969 3.89998 11.9999 3.89998C11.5028 3.89998 11.0999 3.49703 11.0999 2.99998V0.999976C11.0999 0.502919 11.5028 0.0999756 11.9999 0.0999756Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.9999 20.1C12.4969 20.1 12.8999 20.503 12.8999 21V23C12.8999 23.4971 12.4969 23.9 11.9999 23.9C11.5028 23.9 11.0999 23.4971 11.0999 23V21C11.0999 20.503 11.5028 20.1 11.9999 20.1Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M3.58367 3.58349C3.93514 3.23202 4.50499 3.23202 4.85646 3.58349L6.27646 5.00349C6.62794 5.35496 6.62794 5.92481 6.27646 6.27628C5.92499 6.62775 5.35514 6.62775 5.00367 6.27628L3.58367 4.85628C3.2322 4.50481 3.2322 3.93496 3.58367 3.58349Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M17.7223 17.7236C18.0738 17.3722 18.6437 17.3722 18.9951 17.7236L20.4151 19.1436C20.7666 19.4951 20.7666 20.0649 20.4151 20.4164C20.0637 20.7679 19.4938 20.7679 19.1423 20.4164L17.7223 18.9964C17.3709 18.6449 17.3709 18.0751 17.7223 17.7236Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M0.0996094 12C0.0996094 11.503 0.502553 11.1 0.999609 11.1H2.99961C3.49667 11.1 3.89961 11.503 3.89961 12C3.89961 12.4971 3.49667 12.9 2.99961 12.9H0.999609C0.502553 12.9 0.0996094 12.4971 0.0996094 12Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.0999 12C20.0999 11.503 20.5028 11.1 20.9999 11.1H22.9999C23.4969 11.1 23.8999 11.503 23.8999 12C23.8999 12.4971 23.4969 12.9 22.9999 12.9H20.9999C20.5028 12.9 20.0999 12.4971 20.0999 12Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M6.27646 17.7236C6.62794 18.0751 6.62794 18.6449 6.27646 18.9964L4.85646 20.4164C4.50499 20.7679 3.93514 20.7679 3.58367 20.4164C3.2322 20.0649 3.2322 19.4951 3.58367 19.1436L5.00367 17.7236C5.35514 17.3722 5.92499 17.3722 6.27646 17.7236Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.4151 3.58349C20.7666 3.93496 20.7666 4.50481 20.4151 4.85628L18.9951 6.27628C18.6437 6.62775 18.0738 6.62775 17.7223 6.27628C17.3709 5.92481 17.3709 5.35496 17.7223 5.00349L19.1423 3.58349C19.4938 3.23202 20.0637 3.23202 20.4151 3.58349Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12 19C15.866 19 19 15.866 19 12C19 8.13401 15.866 5 12 5C8.13401 5 5 8.13401 5 12C5 15.866 8.13401 19 12 19Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_6207_51984", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), sx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2640_44857)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5.1 5.20001V1.50001H1.5V5.20001H5.1ZM6.6 5.90001V0.700008C6.6 0.300008 6.3 7.62939e-06 5.9 7.62939e-06H0.7C0.3 7.62939e-06 0 0.300008 0 0.700008V5.90001C0 6.30001 0.3 6.70001 0.7 6.70001H5.9C6.3 6.70001 6.7 6.30001 6.6 5.90001Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23 3.80001H10.3C9.7 3.80001 9.3 3.42501 9.3 3.05001C9.3 2.60001 9.8 2.30001 10.3 2.30001H23C23.6 2.30001 24 2.67501 24 3.05001C24 3.50001 23.6 3.80001 23 3.80001Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5.1 13.8V10.2H1.5V13.8H5.1ZM6.6 14.6V9.40001C6.6 9.00001 6.3 8.70001 5.9 8.70001H0.7C0.3 8.70001 0 9.00001 0 9.40001V14.6C0 15 0.3 15.3 0.7 15.3H5.9C6.3 15.3 6.7 15 6.6 14.6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23 12.5H10.3C9.7 12.5 9.3 12.125 9.3 11.75C9.3 11.3 9.8 11 10.3 11H23C23.6 11 24 11.375 24 11.75C24 12.2 23.6 12.5 23 12.5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5.1 22.5V18.9H1.5V22.5H5.1ZM6.6 23.3V18.1C6.6 17.7 6.3 17.4 5.9 17.4H0.7C0.3 17.4 0 17.7 0 18.1V23.3C0 23.7 0.3 24 0.7 24H5.9C6.3 24 6.7 23.7 6.6 23.3Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23 21.2H10.3C9.7 21.2 9.3 20.825 9.3 20.45C9.3 20 9.8 19.7 10.3 19.7H23C23.6 19.7 24 20.075 24 20.45C24 20.825 23.6 21.2 23 21.2Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2640_44857", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), lx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2640_44856)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M0.7 6.5H5.9C6.3 6.5 6.7 6.11194 6.6 5.72388V0.679105C6.6 0.291045 6.3 0 5.9 0H0.7C0.3 0 0 0.291045 0 0.679105V5.72388C0 6.11194 0.3 6.5 0.7 6.5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M10.3 4.05H23C23.6 4.05 24 3.7 24 3.175C24 2.7375 23.6 2.3 23 2.3H10.3C9.80005 2.3 9.30005 2.65 9.30005 3.175C9.30005 3.6125 9.70005 4.05 10.3 4.05Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M5.9 15.2H0.7C0.3 15.2 0 14.9045 0 14.5106V9.38939C0 8.99545 0.3 8.7 0.7 8.7H5.9C6.3 8.7 6.6 8.99545 6.6 9.38939V14.5106C6.7 14.9045 6.3 15.2 5.9 15.2Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M10.3 12.75H23C23.6 12.75 24 12.4 24 11.875C24 11.4375 23.6 11 23 11H10.3C9.80005 11 9.30005 11.35 9.30005 11.875C9.30005 12.3125 9.70005 12.75 10.3 12.75Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M5.9 23.9H0.7C0.3 23.9 0 23.6045 0 23.2106V18.0894C0 17.6954 0.3 17.4 0.7 17.4H5.9C6.3 17.4 6.6 17.6954 6.6 18.0894V23.2106C6.7 23.6045 6.3 23.9 5.9 23.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M10.3 21.45H23C23.6 21.45 24 21.0125 24 20.575C24 20.1375 23.6 19.7 23 19.7H10.3C9.80005 19.7 9.30005 20.05 9.30005 20.575C9.30005 21.0125 9.70005 21.45 10.3 21.45Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2640_44856", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), cx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 1.5C6.20101 1.5 1.5 6.20101 1.5 12C1.5 17.799 6.20101 22.5 12 22.5C17.799 22.5 22.5 17.799 22.5 12C22.5 11.5858 22.8358 11.25 23.25 11.25C23.6642 11.25 24 11.5858 24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C12.4142 0 12.75 0.335786 12.75 0.75C12.75 1.16421 12.4142 1.5 12 1.5Z",\n fill: "currentColor"\n }\n) }), px = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.9998 3.76468C14.4724 3.76468 16.5462 5.80385 16.5462 8.23516C16.5462 10.7449 14.4724 12.7056 11.9998 12.7056C9.5272 12.7056 7.4534 10.6665 7.4534 8.23516C7.4534 5.80385 9.5272 3.76468 11.9998 3.76468ZM12.0796 5.1764C10.3248 5.1764 8.96887 6.58814 8.96887 8.23516C8.96887 9.88217 10.3248 11.2939 12.0796 11.2939C13.8343 11.2939 15.1903 9.88217 15.1903 8.23516C15.1903 6.50971 13.8343 5.1764 12.0796 5.1764Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.6381 23.6863C12.4786 23.9216 12.2393 24 12 24C11.7607 24 11.5214 23.8431 11.3619 23.6863C11.3511 23.6703 11.3321 23.6427 11.3056 23.604C10.5488 22.5003 3.62476 12.4029 3.62476 8.2353C3.62476 3.68628 7.37366 0 12 0C16.6263 0 20.3752 3.68628 20.3752 8.2353C20.3752 12.4541 13.5312 22.3894 12.7082 23.5842C12.6743 23.6333 12.6507 23.6677 12.6381 23.6863ZM18.8597 8.2353C18.8597 4.54902 15.8286 1.49019 12 1.49019C8.25107 1.49019 5.14027 4.47059 5.14027 8.2353C5.14027 11.2157 9.60706 18.4314 12 21.9608C14.3131 18.4314 18.8597 11.1373 18.8597 8.2353Z",\n fill: "currentColor"\n }\n )\n] }), dx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.8824 9.72237H19.1373V7.88667C19.1373 6.86684 19 5.98299 18.7255 5.16712C17.6961 2.03964 14.951 0 12 0C8.01961 0 4.79412 3.5354 4.79412 7.95466V9.79037H2.11764C1.77451 9.79037 1.5 10.0623 1.5 10.4023V23.3881C1.5 23.7281 1.77451 24 2.11764 24H21.8824C22.2255 24 22.5 23.7281 22.5 23.3881V10.4023C22.5 10.0623 22.2255 9.72237 21.8824 9.72237ZM6.09804 7.95466C6.09804 4.28328 8.77451 1.29178 12 1.29178C14.4706 1.29178 16.6667 3.05948 17.5588 5.64305C17.7647 6.32294 17.902 7.07081 17.902 7.95466V9.79037H6.09804V7.95466ZM21.1961 22.7762H2.80392V11.0142H21.1961V22.7762Z",\n fill: "currentColor"\n }\n) }), Ax = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 25", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.1 10.4H18.9V9.00002C18.9 8.00002 18.8 7.10002 18.5 6.20002C17.5 3.00002 14.7 0.900024 11.6 0.900024C7.5 1.00002 4.2 4.60003 4.2 9.10003V10.5H2C1.4 10.5 1 11 1 11.5V24C1 24.6 1.4 25 2 25H21.1C21.7 25 22.1 24.6 22.1 24V11.5C22.1 10.9 21.6 10.4 21.1 10.4ZM6.3 9.10003C6.3 5.80002 8.7 3.10002 11.6 3.10002C13.8 3.10002 15.8 4.70002 16.6 7.00002C16.8 7.70002 16.9 8.40003 16.9 9.10003V10.5H6.3V9.10003Z",\n fill: "currentColor"\n }\n) }), ux = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M12.0344 1.29178C15.0639 1.29178 17.6115 3.87534 17.9557 7.20678C18.0246 7.54673 18.3 7.8187 18.6443 7.75071C18.9885 7.68272 19.2639 7.41076 19.1951 7.07082C18.782 3.05949 15.6836 0 12.0344 0C8.04098 0 4.80491 3.5354 4.80491 7.95466V9.79037H2.11967C1.77541 9.79037 1.5 10.0623 1.5 10.4023V23.3881C1.5 23.7281 1.77541 24 2.11967 24H21.8803C22.2246 24 22.5 23.7281 22.5 23.3881V10.4023C22.5 10.0623 22.2246 9.79037 21.8803 9.79037H6.04427V7.95466C6.11312 4.28328 8.7295 1.29178 12.0344 1.29178ZM21.2606 22.7762H2.80819V11.0142H21.2606V22.7762Z",\n fill: "currentColor"\n }\n) }), bx = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M17.8 7.3C18.4 7.2 18.8 6.6 18.7 6.1C17.9 2.5 15 0 11.6 0C7.5 0 4.2 3.6 4.2 8.1V9.5H2C1.4 9.5 1 10 1 10.5V23C1 23.5 1.4 24 2 24H21.1C21.6 24 22.1 23.5 22.1 23V10.4C22.1 9.8 21.6 9.4 21.1 9.4H6.2V8.1C6.3 4.7 8.6 2.1 11.6 2.1C14 2.1 16.1 4 16.8 6.6C16.8 7 17.3 7.4 17.8 7.3Z",\n fill: "currentColor"\n }\n) }), hx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.2853 1.37705V9.11427H14.6247V1.18033C14.6247 0.535768 14.1203 0 13.482 0H2.13115C1.49292 0 0.988525 0.535768 0.988525 1.18033V22.8197C0.988525 23.4642 1.49292 24 2.13115 24H13.482C14.1203 24 14.6247 23.4642 14.6247 22.8197V14.8856H13.2853V22.6229H2.32788V1.37705H13.2853Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.785 11.5163L16.9065 7.62159C16.2941 7.1779 15.6156 8.19717 16.279 8.5974L20.57 11.4326H6.78431C6.04471 11.4326 6.05837 12.5953 6.78431 12.5953H20.57L16.2752 15.4326C15.688 15.8673 16.2752 16.7774 16.9157 16.3597L22.785 12.471C23.0975 12.2582 23.0763 11.7284 22.785 11.5163Z",\n fill: "currentColor"\n }\n )\n] }), Mx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M1.67421 3.52778C1.20362 3.52778 0.889893 3.85053 0.889893 4.33466V19.746C0.889893 20.1644 1.20307 20.4722 1.59577 20.4722H24.1056C24.5094 20.4722 24.8899 20.0685 24.8899 19.6653V4.33466C24.8899 3.85053 24.5762 3.52778 24.1056 3.52778H1.67421ZM2.14854 5.79069L8.68938 11.8732L2.14854 18.3444V5.79069ZM14.8437 12.311C13.7457 13.36 11.9232 13.36 10.9036 12.311L2.90824 4.8714H22.902L14.8437 12.311ZM9.44495 12.6755C10.4136 13.672 11.3256 14.2521 12.7893 14.2521C14.2122 14.2521 15.2515 13.6486 16.1974 12.6755L22.902 19.254H2.90824L9.44495 12.6755ZM17.0678 11.8732L23.6923 5.79069V18.3444L17.0678 11.8732Z",\n fill: "currentColor"\n }\n) }), fx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M14.2721 1.04154C12.9016 -0.311576 10.7377 -0.311576 9.43934 1.04154C7.89118 2.57007 1.18548 9.08902 1 9.65875C1 9.65875 1.0001 9.65875 1 23.3323C1 23.6884 1.28852 23.9733 1.64918 23.9733H22.3508C22.7364 23.9733 23 23.6946 23 23.3323V9.80118C22.7612 9.08902 17.1003 3.80997 14.2721 1.04154ZM13.0459 16.5668L21.4852 11.0119V22.1929L13.0459 16.5668ZM3.74098 10.4421H20.0426L11.8918 15.7834L3.74098 10.4421ZM10.377 1.96736C11.1705 1.18397 12.541 1.18397 13.3344 1.96736L20.5475 9.08902H3.16393L10.377 1.96736ZM2.22623 11.0119L11.5311 17.1365L20.0426 22.7626H2.22623V11.0119Z",\n fill: "currentColor"\n }\n) }), gx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M22.6557 3.31679L16.0459 0.0510276C16.0459 0.0510276 16.0459 0.0510276 15.977 0.0510276H15.9082H15.8393H15.7705H15.7016H15.6328H15.5639H15.4951L9.22951 3.18071L2.89508 0.0510276C2.68853 -0.0170092 2.48197 -0.0170092 2.27541 0.0510276C2.06885 0.187101 2 0.391203 2 0.595314V20.1219C2 20.394 2.1377 20.5981 2.34426 20.6662L8.9541 23.9319C9.02295 24 9.09181 24 9.22951 24C9.29836 24 9.43606 24 9.50492 23.9319L15.7705 20.8023L22.1049 23.9319C22.1738 24 22.3115 24 22.3803 24C22.518 24 22.5869 24 22.7246 23.9319C22.9311 23.7959 23 23.5918 23 23.3877V3.86107C23 3.58893 22.8623 3.38482 22.6557 3.31679ZM3.23935 1.61587L8.54099 4.26932V22.3671L3.23935 19.7137V1.61587ZM9.84918 4.26932L15.1508 1.61587V19.7137L9.84918 22.3671V4.26932ZM21.7607 22.3671L16.459 19.7137V1.61587L21.7607 4.26932V22.3671Z",\n fill: "currentColor"\n }\n) }), zx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M14.7809 10.1289L22.3616 2.5481C22.006 4.46766 21.6375 6.42648 21.2854 8.31535C21.2137 8.63385 21.4101 9.01286 21.7752 9.07538C22.123 9.13495 22.4306 8.87628 22.4851 8.56374C22.5202 8.36249 23.8202 1.64601 23.9418 0.88761C23.9778 0.663051 23.8969 0.406678 23.7321 0.242163C23.4719 -0.0175803 23.1137 0.0581477 22.7928 0.114975C20.3267 0.551676 17.8678 1.02963 15.407 1.49485C15.0618 1.54386 14.8382 1.8829 14.9274 2.2449C14.9856 2.58246 15.3226 2.81128 15.6845 2.7276L21.4573 1.64773L13.878 9.22707C13.6377 9.4674 13.6469 9.85169 13.8852 10.0895C14.1179 10.3219 14.5369 10.3728 14.7809 10.1289Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.85 10.1247C13.5932 9.86833 13.5822 9.4525 13.8428 9.1919L21.3086 1.72617L15.6946 2.77631C15.3069 2.86538 14.9427 2.62047 14.8787 2.2551C14.7841 1.86754 15.0237 1.49971 15.3988 1.44576C15.9768 1.3365 16.5547 1.22653 17.1326 1.11655C19.0147 0.758375 20.8974 0.400105 22.7841 0.0659949C22.7963 0.0638449 22.8085 0.0616566 22.8209 0.0594525C22.9695 0.0328935 23.1314 0.00397103 23.2872 0.0101516C23.4581 0.0169308 23.626 0.0659363 23.7672 0.20696C23.9434 0.382854 24.0294 0.655291 23.9909 0.895488C23.903 1.4441 23.1964 5.12082 22.8003 7.18212C22.6494 7.96714 22.5436 8.51786 22.5341 8.57229C22.4754 8.90867 22.1447 9.18913 21.7668 9.12441C21.3696 9.05638 21.1603 8.64688 21.2367 8.30536C21.3701 7.58959 21.5058 6.86383 21.6424 6.13398C21.8563 4.99061 22.072 3.83722 22.2835 2.69656L14.816 10.164C14.5482 10.4319 14.0975 10.3718 13.85 10.1247ZM14.7809 10.1289C14.5369 10.3728 14.1179 10.3219 13.8852 10.0895C13.6469 9.85169 13.6377 9.4674 13.878 9.22707L21.4573 1.64773L15.6845 2.7276C15.3226 2.81128 14.9856 2.58246 14.9274 2.2449C14.8382 1.8829 15.0618 1.54386 15.407 1.49485C15.9854 1.3855 16.5637 1.27545 17.142 1.16539C19.0241 0.807226 20.9064 0.44903 22.7928 0.114975L22.8287 0.108593C23.1402 0.0529929 23.4815 -0.0079439 23.7321 0.242163C23.8969 0.406678 23.9778 0.663051 23.9418 0.88761C23.854 1.43543 23.1513 5.09201 22.7546 7.15622C22.6021 7.94968 22.4948 8.50786 22.4851 8.56374C22.4306 8.87628 22.123 9.13495 21.7752 9.07538C21.4101 9.01286 21.2137 8.63385 21.2854 8.31535C21.4184 7.60174 21.5538 6.87814 21.6899 6.15045L21.6914 6.14231C21.9097 4.97541 22.13 3.79803 22.3456 2.63446C22.3509 2.60566 22.3563 2.57688 22.3616 2.5481L14.7809 10.1289Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M10.1154 13.8408C9.85901 13.5839 9.44319 13.573 9.18259 13.8336L1.71686 21.2993L2.76699 15.6854C2.85607 15.2976 2.61116 14.9334 2.24579 14.8694C1.85822 14.7748 1.49039 15.0145 1.43644 15.3896C0.971355 17.8497 0.0666385 23.0928 0.0666385 23.0928C-0.0159211 23.6609 0.270755 24.0803 0.886173 23.9817C1.64371 23.8602 8.36564 22.5592 8.56297 22.5248C8.89936 22.4661 9.17982 22.1354 9.1151 21.7575C9.04707 21.3603 8.63757 21.151 8.29605 21.2274C6.45895 21.5698 4.55601 21.9277 2.68725 22.2742L10.1547 14.8068C10.4225 14.5389 10.3625 14.0882 10.1154 13.8408Z",\n fill: "currentColor"\n }\n )\n] }), Cx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.633375 5.95044H23.3666C23.5473 5.95044 23.7052 6.03642 23.8161 6.15047C23.9258 6.26323 24 6.41433 24 6.55963C24 6.90203 23.7138 7.16883 23.3666 7.16883H0.633375C0.286202 7.16883 0 6.90203 0 6.55963C0 6.21723 0.286205 5.95044 0.633375 5.95044ZM0.633375 11.3908H23.3666C23.7138 11.3908 24 11.6576 24 12C24 12.3424 23.7138 12.6092 23.3666 12.6092H0.633375C0.286201 12.6092 0 12.3424 0 12C0 11.6576 0.286201 11.3908 0.633375 11.3908ZM0.633375 16.8312H23.3666C23.7138 16.8312 24 17.098 24 17.4404C24 17.7828 23.7138 18.0496 23.3666 18.0496H0.633375C0.286202 18.0496 0 17.7828 0 17.4404C0 17.098 0.2862 16.8312 0.633375 16.8312Z",\n fill: "currentColor"\n }\n) }), Ox = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 6C13.6569 6 15 4.65685 15 3C15 1.34315 13.6569 0 12 0C10.3431 0 9 1.34315 9 3C9 4.65685 10.3431 6 12 6ZM12 4.6C12.8837 4.6 13.6 3.88366 13.6 3C13.6 2.11634 12.8837 1.4 12 1.4C11.1163 1.4 10.4 2.11634 10.4 3C10.4 3.88366 11.1163 4.6 12 4.6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15ZM12 13.6C12.8837 13.6 13.6 12.8837 13.6 12C13.6 11.1163 12.8837 10.4 12 10.4C11.1163 10.4 10.4 11.1163 10.4 12C10.4 12.8837 11.1163 13.6 12 13.6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M15 21C15 22.6569 13.6569 24 12 24C10.3431 24 9 22.6569 9 21C9 19.3431 10.3431 18 12 18C13.6569 18 15 19.3431 15 21ZM13.6 21C13.6 21.8837 12.8837 22.6 12 22.6C11.1163 22.6 10.4 21.8837 10.4 21C10.4 20.1163 11.1163 19.4 12 19.4C12.8837 19.4 13.6 20.1163 13.6 21Z",\n fill: "currentColor"\n }\n )\n] }), mx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12 6C13.6569 6 15 4.65685 15 3C15 1.34315 13.6569 0 12 0C10.3431 0 9 1.34315 9 3C9 4.65685 10.3431 6 12 6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12 24C13.6569 24 15 22.6569 15 21C15 19.3431 13.6569 18 12 18C10.3431 18 9 19.3431 9 21C9 22.6569 10.3431 24 12 24Z",\n fill: "currentColor"\n }\n )\n] }), vx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.637321 5.94608H23.3627C23.7655 5.94608 24.0071 6.22345 23.9998 6.57226C23.9927 6.91412 23.7075 7.17277 23.3627 7.17277H0.637321C0.288111 7.17277 0 6.90425 0 6.55942C0 6.21459 0.288114 5.94608 0.637321 5.94608ZM17.726 12.67H0.696827C0.335038 12.67 0.0595061 12.3516 0.0595061 12.0567C0.0595061 11.7118 0.347614 11.4433 0.696827 11.4433H17.726C18.0752 11.4433 18.3633 11.7118 18.3633 12.0567C18.3633 12.4015 18.0752 12.67 17.726 12.67ZM0.637321 16.8272H23.3627C23.7601 16.8272 24.0058 17.1087 23.9999 17.4512C23.994 17.7937 23.7083 18.0539 23.3627 18.0539H0.637321C0.288111 18.0539 0 17.7854 0 17.4406C0 17.0957 0.288108 16.8272 0.637321 16.8272Z",\n fill: "currentColor"\n }\n) }), yx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.3666 7.17221H0.63341C0.290586 7.17221 -0.00561394 6.89688 9.05165e-05 6.55029C0.005705 6.20916 0.289141 5.94852 0.63341 5.94852H23.3666C23.7143 5.94852 24 6.21696 24 6.56036C24 6.90376 23.7143 7.17221 23.3666 7.17221ZM5.63853 11.9715C5.63853 11.6281 5.92425 11.3597 6.27191 11.3597H17.6679C18.0155 11.3597 18.3012 11.6281 18.3012 11.9715C18.3012 12.3149 18.0155 12.5834 17.6679 12.5834H6.27191C5.92425 12.5834 5.63853 12.3149 5.63853 11.9715ZM23.3666 18.0515H0.6334C0.290577 18.0515 -0.00562084 17.7762 8.09816e-05 17.4296C0.00569291 17.0885 0.28913 16.8278 0.6334 16.8278H23.3666C23.7143 16.8278 24 17.0963 24 17.4397C24 17.7831 23.7143 18.0515 23.3666 18.0515Z",\n fill: "currentColor"\n }\n) }), Lx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5.69797 6.5596C5.69797 6.2172 5.98417 5.95041 6.33134 5.95041H23.3664C23.7136 5.95041 23.9998 6.2172 23.9998 6.5596C23.9998 6.902 23.7136 7.1688 23.3664 7.1688H6.33134C5.98417 7.1688 5.69797 6.902 5.69797 6.5596ZM23.3666 12.6659H0.633372C0.274112 12.6659 0 12.3489 0 12.0567C0 11.7143 0.286195 11.4475 0.633372 11.4475H23.3666C23.7138 11.4475 24 11.7143 24 12.0567C24 12.3991 23.7138 12.6659 23.3666 12.6659ZM6.33134 16.8311H23.3664C23.7136 16.8311 23.9998 17.098 23.9998 17.4404C23.9998 17.7828 23.7136 18.0496 23.3664 18.0496H6.33134C5.98417 18.0496 5.69797 17.7828 5.69797 17.4404C5.69797 17.098 5.98417 16.8311 6.33134 16.8311Z",\n fill: "currentColor"\n }\n) }), wx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.352 21.2446C11.352 21.6289 11.6635 21.9404 12.0478 21.9404C12.4321 21.9404 12.7436 21.6289 12.7436 21.2446V2.75546C12.7436 2.37116 12.4321 2.05963 12.0478 2.05963C11.6635 2.05963 11.352 2.37116 11.352 2.75546V21.2446Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M16.0933 11.4253H19.7264H23.3595C23.7132 11.4253 24 11.7121 24 12.0658C24 12.4195 23.7132 12.7063 23.3595 12.7063H16.0933L18.1857 14.9101C18.2505 14.9671 18.3033 15.0377 18.3407 15.1174C18.3782 15.1971 18.3995 15.2841 18.4032 15.3729C18.407 15.4618 18.3932 15.5504 18.3626 15.6333C18.332 15.7162 18.2854 15.7915 18.2257 15.8543C18.166 15.9172 18.0945 15.9663 18.0159 15.9985C17.9372 16.0307 17.853 16.0453 17.7686 16.0413C17.6843 16.0373 17.6016 16.0149 17.526 15.9755C17.4503 15.9361 17.3833 15.8805 17.3291 15.8122L14.1839 12.479C14.133 12.4247 14.091 12.3619 14.0596 12.293H14.1185C14.0929 12.2299 14.0796 12.162 14.0792 12.0933V12.0245C14.0735 11.9718 14.0735 11.9187 14.0792 11.8661V11.8041C14.1086 11.7358 14.1484 11.673 14.1969 11.6181L17.3291 8.31932C17.3833 8.25111 17.4503 8.19551 17.526 8.15608C17.6016 8.11664 17.6843 8.09423 17.7686 8.09027C17.853 8.08631 17.9372 8.10088 18.0159 8.13307C18.0945 8.16526 18.166 8.21435 18.2257 8.27722C18.2854 8.3401 18.332 8.41537 18.3626 8.49825C18.3932 8.58114 18.407 8.66981 18.4032 8.75864C18.3995 8.84746 18.3782 8.93449 18.3407 9.01418C18.3033 9.09387 18.2505 9.16448 18.1857 9.2215L16.0933 11.4253Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M7.90668 12.6405H0.640417C0.28669 12.6405 -6.18844e-05 12.3537 -6.18844e-05 12C-6.18844e-05 11.6462 0.28669 11.3595 0.640417 11.3595H7.90668L5.81419 9.1557C5.74942 9.09867 5.69663 9.02806 5.65919 8.94837C5.62175 8.86868 5.60047 8.78166 5.59671 8.69283C5.59295 8.604 5.60679 8.51533 5.63735 8.43244C5.66791 8.34956 5.71453 8.27429 5.77422 8.21141C5.83392 8.14854 5.90539 8.09945 5.98408 8.06726C6.06278 8.03508 6.14698 8.0205 6.23132 8.02446C6.31566 8.02842 6.39829 8.05083 6.47396 8.09027C6.54962 8.1297 6.61666 8.1853 6.67081 8.25352L9.81608 11.5868C9.86698 11.6411 9.90897 11.7039 9.94031 11.7727H9.88146C9.90701 11.8359 9.92035 11.9038 9.9207 11.9724V12.0413C9.92648 12.0939 9.92648 12.1471 9.9207 12.1997V12.2617C9.89134 12.33 9.85158 12.3928 9.803 12.4476L6.67081 15.7464C6.61666 15.8146 6.54962 15.8702 6.47396 15.9097C6.39829 15.9491 6.31566 15.9715 6.23132 15.9755C6.14698 15.9795 6.06278 15.9649 5.98409 15.9327C5.90539 15.9005 5.83392 15.8514 5.77422 15.7885C5.71452 15.7257 5.66791 15.6504 5.63735 15.5675C5.60679 15.4846 5.59295 15.3959 5.59671 15.3071C5.60047 15.2183 5.62175 15.1313 5.65919 15.0516C5.69663 14.9719 5.74942 14.9013 5.81419 14.8443L7.90668 12.6405Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M7.90668 12.6405H0.640417C0.28669 12.6405 -6.18844e-05 12.3537 -6.18844e-05 12C-6.18844e-05 11.6462 0.28669 11.3595 0.640417 11.3595H7.90668L5.81419 9.1557C5.74942 9.09867 5.69663 9.02806 5.65919 8.94837C5.62175 8.86868 5.60047 8.78166 5.59671 8.69283C5.59295 8.604 5.60679 8.51533 5.63735 8.43244C5.66791 8.34956 5.71453 8.27429 5.77422 8.21141C5.83392 8.14854 5.90539 8.09945 5.98408 8.06726C6.06278 8.03508 6.14698 8.0205 6.23132 8.02446C6.31566 8.02842 6.39829 8.05083 6.47396 8.09027C6.54962 8.1297 6.61666 8.1853 6.67081 8.25352L9.81608 11.5868C9.86698 11.6411 9.90897 11.7039 9.94031 11.7727H9.88146C9.90701 11.8359 9.92035 11.9038 9.9207 11.9724V12.0413C9.92648 12.0939 9.92648 12.1471 9.9207 12.1997V12.2617C9.89134 12.33 9.85158 12.3928 9.803 12.4476L6.67081 15.7464C6.61666 15.8146 6.54962 15.8702 6.47396 15.9097C6.39829 15.9491 6.31566 15.9715 6.23132 15.9755C6.14698 15.9795 6.06278 15.9649 5.98409 15.9327C5.90539 15.9005 5.83392 15.8514 5.77422 15.7885C5.71452 15.7257 5.66791 15.6504 5.63735 15.5675C5.60679 15.4846 5.59295 15.3959 5.59671 15.3071C5.60047 15.2183 5.62175 15.1313 5.65919 15.0516C5.69663 14.9719 5.74942 14.9013 5.81419 14.8443L7.90668 12.6405Z",\n fill: "currentcolor"\n }\n )\n] }), qx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.3839 9.73289V5.19938C17.3839 2.30786 14.9873 0 11.9999 0C9.01255 0 6.61603 2.30786 6.61603 5.19938V9.73289C6.61603 12.6244 9.01255 14.9323 11.9999 14.9323C14.9873 14.9323 17.3839 12.6244 17.3839 9.73289ZM12.0002 24C12.3778 24 12.6866 23.707 12.6866 23.3341V19.4601C17.9107 19.0988 22.0167 14.922 22.0167 9.79615C22.0167 9.42325 21.708 9.13028 21.3303 9.13028C20.9527 9.13028 20.644 9.42326 20.644 9.79615C20.644 14.3977 16.7769 18.1346 12.0002 18.1346C7.22341 18.1346 3.35641 14.3977 3.35641 9.79615C3.35641 9.42326 3.0477 9.13028 2.67004 9.13028C2.2924 9.13028 1.98364 9.42325 1.98364 9.79615C1.98364 14.9221 6.154 19.0982 11.3138 19.4601V23.3341C11.3138 23.707 11.6225 24 12.0002 24ZM11.9971 13.5376L11.9999 13.5375C14.1668 13.5376 15.9459 11.8157 15.9459 9.73289V5.19938C15.9459 3.11661 14.1668 1.39469 11.9999 1.39469C9.83307 1.39469 8.05399 3.11661 8.05399 5.19938V9.73289C8.05399 11.8801 9.83401 13.599 11.9971 13.5376Z",\n fill: "currentColor"\n }\n) }), xx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.74865 15.0981C4.21112 14.6325 6.67257 14.1541 9.14099 13.717C9.87669 13.5867 10.4316 13.8488 10.295 14.6763C10.08 15.9109 8.924 22.0405 8.89071 22.2314C8.83197 22.5681 8.50093 22.8488 8.12267 22.784C7.72511 22.7159 7.52171 22.3541 7.59184 21.9653C7.93189 20.0804 8.29296 18.2179 8.63986 16.3501L1.1653 23.8246C0.897232 24.0927 0.44607 24.0326 0.198383 23.7853C-0.0587126 23.5286 -0.069678 23.1124 0.191173 22.8516L7.66401 15.3787L2.04472 16.4299C1.65662 16.519 1.29203 16.2739 1.22804 15.9082C1.13335 15.5202 1.37319 15.1521 1.74865 15.0981ZM23.8019 0.214702C24.059 0.471357 24.07 0.887579 23.8092 1.14843L16.3363 8.62127L21.9556 7.57013C22.3437 7.48097 22.7083 7.72612 22.7723 8.09183C22.867 8.47977 22.6271 8.84795 22.2517 8.90195C19.7892 9.36748 17.3278 9.84591 14.8593 10.283C14.5401 10.3395 14.1563 10.4224 13.8753 10.1419C13.6989 9.96586 13.6128 9.69317 13.6514 9.45274C13.773 8.69448 15.0752 1.96615 15.1096 1.76863C15.1684 1.43193 15.4994 1.1512 15.8777 1.21598C16.2752 1.28407 16.4847 1.69396 16.4083 2.03581C16.0655 3.87466 15.7073 5.77941 15.3604 7.64995L22.835 0.175369C23.1031 -0.0927036 23.5543 -0.0325612 23.8019 0.214702Z",\n fill: "currentColor"\n }\n) }), Rx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0.708204 12.8H23.2918C23.6853 12.8 24 12.4445 24 12C24 11.5556 23.6853 11.2 23.2918 11.2H0.708204C0.314761 11.2 0 11.5556 0 12C0 12.4445 0.314761 12.8 0.708204 12.8Z",\n fill: "currentColor"\n }\n) }), Bx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.9184 14.7148V5.5082C23.9184 2.43934 21.4089 0 18.4289 0H5.48947C2.43105 0 0 2.51803 0 5.5082V14.7148C0 17.7836 2.50947 20.223 5.48947 20.223H15.5273L22.8989 23.9213C22.9773 24 23.1342 24 23.2126 24C23.3694 24 23.6047 23.9213 23.7616 23.7639C23.9968 23.5279 24.0752 23.2131 23.9184 22.8983L21.9579 18.9639C23.1342 17.941 23.9184 16.4459 23.9184 14.7148ZM15.9979 18.8852C15.9195 18.8852 15.841 18.8852 15.841 18.8065C15.7626 18.8065 15.7626 18.8065 15.6842 18.8065H5.48947C3.21526 18.8065 1.41157 16.9967 1.41157 14.7148V5.5082C1.41157 3.22623 3.21526 1.41638 5.48947 1.41638H18.4289C20.7031 1.41638 22.5068 3.22623 22.5068 5.5082V14.7148C22.5068 16.1312 21.801 17.3901 20.6247 18.177L20.5463 18.2557L20.4679 18.3344C20.4679 18.3344 20.3895 18.4131 20.3895 18.4918C20.3895 18.5705 20.311 18.5705 20.311 18.6492C20.311 18.7279 20.311 18.7278 20.311 18.8065C20.311 18.8852 20.311 18.8852 20.311 18.9639C20.311 19.0426 20.311 19.0426 20.311 19.1213V19.2L21.5658 21.718L15.9979 18.8852Z",\n fill: "currentColor"\n }\n) }), Wx = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.9184 14.7148V5.5082C23.9184 2.43934 21.4089 0 18.4289 0H5.48947C2.43105 0 0 2.51803 0 5.5082V14.7148C0 17.7836 2.50947 20.223 5.48947 20.223H15.5273L22.8989 23.9213C22.9773 24 23.1342 24 23.2126 24C23.3694 24 23.6047 23.9213 23.7616 23.7639C23.9968 23.5279 24.0752 23.2131 23.9184 22.8983L21.9579 18.9639C23.1342 17.941 23.9184 16.4459 23.9184 14.7148Z",\n fill: "currentColor"\n }\n) }), Ex = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M11.4001 3.8752C11.4001 3.53527 11.6668 3.26331 12.0001 3.26331C12.3335 3.26331 12.6001 3.53527 12.6001 3.8752V7.13852C12.6001 7.47845 12.3335 7.75036 12.0001 7.75036C11.6668 7.75036 11.4001 7.47845 11.4001 7.13852V3.8752Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M5 7.13882C5 3.19547 8.13334 0 12 0C15.8667 0 19 3.19547 19 7.13882V16.8612C19 20.8046 15.8667 24 12 24C8.13334 24 5 20.8046 5 16.8612V7.13882ZM12 22.7082C15.1333 22.7082 17.7334 20.1247 17.7334 16.8612V7.13882C17.7334 3.94335 15.2 1.29176 12 1.29176C8.86667 1.29176 6.26668 3.87536 6.26668 7.13882V16.8612C6.26668 20.0567 8.80001 22.7082 12 22.7082Z",\n fill: "currentColor"\n }\n )\n] }), Sx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.9672 1.8279L14.3198 4.14119C14.9139 4.7253 15.9076 3.85589 15.286 3.2446L12.4503 0.456309C12.1841 0.194556 11.8094 0.194556 11.5432 0.456309L8.70757 3.2446C8.12676 3.81571 9.01122 4.73451 9.61462 4.14119L11.9672 1.8279ZM20.8978 8.76253C20.2933 8.16956 19.4104 9.08849 19.9915 9.65987L22.3418 11.9708L19.9915 14.2818C19.3865 14.8767 20.3479 15.7779 20.9576 15.1784L23.7933 12.3901C24.0594 12.1285 24.0594 11.7551 23.7933 11.4935L20.8986 8.76328L20.8978 8.76253ZM20.4746 11.4071C20.8232 11.4071 21.1055 11.6823 21.1055 12.0291C21.1055 12.3753 20.808 12.6511 20.3565 12.6511H12.5391V20.3362C12.5391 21.1404 11.2774 21.1404 11.2774 20.3362V12.6511H3.46006C3.11148 12.6511 2.82919 12.3759 2.82919 12.0291C2.82919 11.6823 3.11148 11.4071 3.46006 11.4071H11.3955V3.72206C11.3955 3.37527 11.6778 3.10005 12.0264 3.10005C12.375 3.10005 12.6573 3.37527 12.6573 3.72206V11.4071H20.4746ZM0.20508 12.453C-0.07581 12.2401 -0.0666719 11.8074 0.267714 11.6016L3.09506 8.82148C3.66704 8.25905 4.60397 9.12626 4.00211 9.71807L1.6519 12.029L4.00211 14.34C4.63503 14.9624 3.61034 15.8014 3.03598 15.2366L0.20508 12.453ZM12.4923 23.5185C12.229 23.8147 11.8388 23.7944 11.5766 23.5185L8.76664 20.7554C8.18666 20.1852 9.07759 19.2727 9.6737 19.8589L11.9968 22.1721L14.3789 19.8589C14.9525 19.2949 15.8959 20.1557 15.286 20.7554L12.4923 23.5185Z",\n fill: "currentColor"\n }\n) }), kx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1 5C0.447715 5 0 5.44771 0 6V8C0 8.55228 0.447715 9 1 9H3C3.55228 9 4 8.55228 4 8V6C4 5.44771 3.55228 5 3 5H1ZM1 15C0.447715 15 0 15.4477 0 16V18C0 18.5523 0.447715 19 1 19H3C3.55228 19 4 18.5523 4 18V16C4 15.4477 3.55228 15 3 15H1ZM10 6C10 5.44771 10.4477 5 11 5H13C13.5523 5 14 5.44771 14 6V8C14 8.55228 13.5523 9 13 9H11C10.4477 9 10 8.55228 10 8V6ZM11 15C10.4477 15 10 15.4477 10 16V18C10 18.5523 10.4477 19 11 19H13C13.5523 19 14 18.5523 14 18V16C14 15.4477 13.5523 15 13 15H11ZM20 6C20 5.44771 20.4477 5 21 5H23C23.5523 5 24 5.44771 24 6V8C24 8.55228 23.5523 9 23 9H21C20.4477 9 20 8.55228 20 8V6ZM21 15C20.4477 15 20 15.4477 20 16V18C20 18.5523 20.4477 19 21 19H23C23.5523 19 24 18.5523 24 18V16C24 15.4477 23.5523 15 23 15H21Z",\n fill: "currentColor"\n }\n) }), Nx = () => /* @__PURE__ */ c1(\n "svg",\n {\n xmlns: "http://www.w3.org/2000/svg",\n viewBox: "0 0 24 24",\n fill: "none",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M3.4 5H1.4C0.6 5 0 5.6 0 6.4V8.4C0 9.2 0.6 9.8 1.4 9.8H3.4C4.2 9.8 4.8 9.2 4.8 8.4V6.4C4.9 5.6 4.2 5 3.4 5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M3.4 15H1.4C0.6 15 0 15.6 0 16.4V18.4C0 19.2 0.6 19.8 1.4 19.8H3.4C4.2 19.8 4.8 19.2 4.8 18.4V16.4C4.9 15.6 4.2 15 3.4 15Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13 5H11C10.2 5 9.6 5.6 9.6 6.4V8.4C9.6 9.2 10.2 9.8 11 9.8H13C13.8 9.8 14.4 9.2 14.4 8.4V6.4C14.4 5.6 13.8 5 13 5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13 15H11C10.2 15 9.6 15.6 9.6 16.4V18.4C9.6 19.2 10.2 19.8 11 19.8H13C13.8 19.8 14.4 19.2 14.4 18.4V16.4C14.4 15.6 13.8 15 13 15Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.6 5H20.6C19.8 5 19.2 5.6 19.2 6.4V8.4C19.2 9.2 19.8 9.8 20.6 9.8H22.6C23.4 9.8 24 9.2 24 8.4V6.4C24 5.6 23.3 5 22.6 5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.6 15H20.6C19.8 15 19.2 15.6 19.2 16.4V18.4C19.2 19.2 19.8 19.8 20.6 19.8H22.6C23.4 19.8 24 19.2 24 18.4V16.4C24 15.6 23.3 15 22.6 15Z",\n fill: "currentColor"\n }\n )\n ]\n }\n), Ix = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.6252 10.0674C22.0735 10.03 24.0587 12.0968 23.9987 14.5557C23.998 17.013 21.9963 19.0414 19.5667 19.0414H5.67842C2.53609 19.0414 0 16.4713 0 13.2922C0 9.82757 3.04503 7.02347 6.58615 7.59483C7.91189 5.91629 9.94079 4.95859 12.029 4.95859C15.2496 4.95859 17.9381 7.1125 18.7496 10.173C18.7496 10.173 18.9186 10.1425 19.0274 10.1267C19.2596 10.093 19.4421 10.0702 19.6252 10.0674ZM17.909 11.5488C17.7298 11.4278 17.6314 11.2463 17.6274 11.0171C17.1575 8.24298 14.8257 6.23922 12.029 6.23922C10.1451 6.23922 8.53088 7.18525 7.41961 8.66377C7.24977 8.86362 6.99089 9.00779 6.72477 8.94147C6.43024 8.88188 6.08284 8.8237 5.73776 8.8237C3.30106 8.8237 1.32645 10.8216 1.32645 13.2922C1.32645 15.7629 3.30106 17.7608 5.73776 17.7608H19.626C21.3481 17.7608 22.7316 16.3062 22.7316 14.5544C22.7316 12.7437 21.3493 11.3481 19.626 11.3481C19.2878 11.3481 18.8862 11.4631 18.5301 11.5833C18.3484 11.6446 18.0719 11.6468 17.909 11.5488Z",\n fill: "currentcolor"\n }\n) }), Tx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.7845 5.85153V0H0V24H24V5.85153H12.7845ZM11.2761 22.5077H1.45643V1.54425H11.2756L11.2761 22.5077ZM22.485 22.5077H12.7845L12.785 7.31349H22.485V22.5077Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.74961 6.05346H4.03479V7.55153H8.74961V6.05346Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.74961 11.15H4.03479V12.6705H8.74961V11.15Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.74961 16.6054H4.03479V18.1484H8.74961V16.6054Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M19.9658 11.15H15.251V12.6705H19.9658V11.15Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M19.9658 16.6054H15.251V18.1484H19.9658V16.6054Z",\n fill: "currentColor"\n }\n )\n] }), Dx = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M0 0V24H11.3V0H0ZM8.1 7.5H3.4V5.8H8.1V7.5ZM8.1 16.4V18.2H3.4V16.4H8.1ZM8.1 10.9V12.7H3.4V10.9H8.1Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.1 5.9V24H24V5.9H13.1ZM16 12.7V10.9H20.7V12.7H16ZM20.8 16.4V18.2H16V16.4H20.8Z",\n fill: "currentColor"\n }\n )\n] }), Hx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.8958 4.55583C13.8958 3.41014 14.8245 2.48138 15.9702 2.48138H21.9256C23.0712 2.48138 24 3.41014 24 4.55583V7.53349C24 8.67918 23.0712 9.60794 21.9256 9.60794H15.9702C14.8245 9.60794 13.8958 8.67918 13.8958 7.53349V6.97307L9.24944 9.68343C9.78926 10.4874 10.1042 11.4551 10.1042 12.4962C10.1042 13.2923 9.92002 14.0456 9.59184 14.7156L13.8958 17.2262V16.4665C13.8958 15.3208 14.8245 14.3921 15.9702 14.3921H21.9256C23.0712 14.3921 24 15.3208 24 16.4665V19.4442C24 20.5898 23.0712 21.5186 21.9256 21.5186H15.9702C14.8245 21.5186 13.8958 20.5898 13.8958 19.4442V18.3998L9.05653 15.5769C8.13293 16.7756 6.68274 17.5483 5.05211 17.5483C2.26191 17.5483 0 15.2864 0 12.4962C-4.80683e-07 9.70595 2.26191 7.44404 5.05211 7.44404C6.43132 7.44404 7.68158 7.99682 8.59316 8.89271L13.8958 5.79952V4.55583ZM15.9702 3.6526C15.4714 3.6526 15.067 4.05699 15.067 4.55583V7.53349C15.067 8.03233 15.4714 8.43672 15.9702 8.43672H21.9256C22.4244 8.43672 22.8288 8.03233 22.8288 7.53349V4.55583C22.8288 4.05699 22.4244 3.6526 21.9256 3.6526H15.9702ZM5.05211 8.61526C2.90875 8.61526 1.17122 10.3528 1.17122 12.4962C1.17122 14.6395 2.90875 16.377 5.05211 16.377C6.29899 16.377 7.43827 15.7691 8.18856 14.7822C8.65672 14.141 8.933 13.351 8.933 12.4962C8.933 10.3528 7.19547 8.61526 5.05211 8.61526ZM15.9702 15.5633C15.4714 15.5633 15.067 15.9677 15.067 16.4665V19.4442C15.067 19.943 15.4714 20.3474 15.9702 20.3474H21.9256C22.4244 20.3474 22.8288 19.943 22.8288 19.4442V16.4665C22.8288 15.9677 22.4244 15.5633 21.9256 15.5633H15.9702Z",\n fill: "currentColor"\n }\n) }), Px = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.9 8.1L9.4 10.6C9.7 11.2 10.1 12 10.1 13C10.1 13.7 9.9 14.3 9.7 14.8L13.9 17.2V17C13.9 15.8 14.8 14.9 16 14.9H22C23.1 14.9 24.1 15.8 24.1 17V20C24.1 21.2 23.2 22.1 22 22.1H16C14.9 22.1 13.9 21.2 13.9 20V19.4L8.8 16.5C7.9 17.5 6.5 18.2 5 18.2C2.2 18.2 0 15.9 0 13.1C0 10.2 2.3 8 5 8C6.3 8 7.4 8.5 8.3 9.2L13.9 6V5.1C13.9 3.9 14.8 3 16 3H22C23.1 3 24 3.9 24 5.1V8.1C24 9.2 23.1 10.2 21.9 10.2H15.9C14.8 10.1 13.9 9.2 13.9 8.1Z",\n fill: "currentColor"\n }\n) }), Vx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M6.96314 6.58666C6.96314 7.97965 7.52873 9.2407 8.44255 10.1524L4.37789 15.3765H2.1238C0.978355 15.3765 0.0497925 16.305 0.0497925 17.4505V20.4133C0.0497925 21.5588 0.978355 22.4873 2.1238 22.4873H8.04952C9.19496 22.4873 10.1235 21.5588 10.1235 20.4133V17.4505C10.1235 16.305 9.19496 15.3765 8.04952 15.3765H5.87951L9.37378 10.8855C10.1385 11.3537 11.0379 11.6235 12 11.6235C12.9621 11.6235 13.8615 11.3537 14.6262 10.8855L18.1205 15.3765H15.9505C14.805 15.3765 13.8765 16.305 13.8765 17.4505V20.4133C13.8765 21.5588 14.805 22.4873 15.9505 22.4873H21.8762C23.0216 22.4873 23.9502 21.5588 23.9502 20.4133V17.4505C23.9502 16.305 23.0216 15.3765 21.8762 15.3765H19.6221L15.5574 10.1524C16.4713 9.2407 17.0369 7.97965 17.0369 6.58666C17.0369 3.80487 14.7818 1.54979 12 1.54979C9.21822 1.54979 6.96314 3.80487 6.96314 6.58666ZM8.04952 16.5616H2.1238C1.63289 16.5616 1.23494 16.9596 1.23494 17.4505V20.4133C1.23494 20.9042 1.63289 21.3022 2.1238 21.3022H8.04952C8.54042 21.3022 8.93838 20.9042 8.93838 20.4133V17.4505C8.93838 16.9596 8.54042 16.5616 8.04952 16.5616ZM15.8517 6.58666C15.8517 8.7139 14.1272 10.4384 12 10.4384C9.87275 10.4384 8.14828 8.7139 8.14828 6.58666C8.14828 4.45941 9.87275 2.73494 12 2.73494C14.1272 2.73494 15.8517 4.45941 15.8517 6.58666ZM21.8762 16.5616H15.9505C15.4596 16.5616 15.0616 16.9596 15.0616 17.4505V20.4133C15.0616 20.9042 15.4596 21.3022 15.9505 21.3022H21.8762C22.3671 21.3022 22.7651 20.9042 22.7651 20.4133V17.4505C22.7651 16.9596 22.3671 16.5616 21.8762 16.5616Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 10.3886C14.0997 10.3886 15.8019 8.6864 15.8019 6.58666C15.8019 4.48691 14.0997 2.78473 12 2.78473C9.90025 2.78473 8.19807 4.48691 8.19807 6.58666C8.19807 8.6864 9.90025 10.3886 12 10.3886ZM8.37634 10.1564C7.47179 9.23829 6.91334 7.97756 6.91334 6.58666C6.91334 3.77737 9.19072 1.5 12 1.5C14.8093 1.5 17.0867 3.77737 17.0867 6.58666C17.0867 7.97757 16.5282 9.23829 15.6236 10.1564L19.6465 15.3267H21.8762C23.0491 15.3267 24 16.2775 24 17.4505V20.4133C24 21.5863 23.0491 22.5371 21.8762 22.5371H15.9505C14.7775 22.5371 13.8267 21.5863 13.8267 20.4133V17.4505C13.8267 16.2775 14.7775 15.3267 15.9505 15.3267H18.0187L14.6141 10.9511C13.8501 11.4097 12.9556 11.6733 12 11.6733C11.0444 11.6733 10.1499 11.4097 9.38587 10.9511L5.98135 15.3267H8.04952C9.22246 15.3267 10.1733 16.2775 10.1733 17.4505V20.4133C10.1733 21.5863 9.22246 22.5371 8.04952 22.5371H2.1238C0.950855 22.5371 0 21.5863 0 20.4133V17.4505C0 16.2775 0.950855 15.3267 2.1238 15.3267H4.35355L8.37634 10.1564ZM8.44255 10.1524C7.52873 9.2407 6.96314 7.97965 6.96314 6.58666C6.96314 3.80487 9.21822 1.54979 12 1.54979C14.7818 1.54979 17.0369 3.80487 17.0369 6.58666C17.0369 7.97965 16.4713 9.2407 15.5574 10.1524L19.6221 15.3765H21.8762C23.0216 15.3765 23.9502 16.305 23.9502 17.4505V20.4133C23.9502 21.5588 23.0216 22.4873 21.8762 22.4873H15.9505C14.805 22.4873 13.8765 21.5588 13.8765 20.4133V17.4505C13.8765 16.305 14.805 15.3765 15.9505 15.3765H18.1205L14.6262 10.8855C13.8615 11.3537 12.9621 11.6235 12 11.6235C11.0379 11.6235 10.1385 11.3537 9.37378 10.8855L5.87951 15.3765H8.04952C9.19496 15.3765 10.1235 16.305 10.1235 17.4505V20.4133C10.1235 21.5588 9.19496 22.4873 8.04952 22.4873H2.1238C0.978355 22.4873 0.0497925 21.5588 0.0497925 20.4133V17.4505C0.0497925 16.305 0.978355 15.3765 2.1238 15.3765H4.37789L8.44255 10.1524ZM8.04952 16.6114H2.1238C1.66039 16.6114 1.28473 16.9871 1.28473 17.4505V20.4133C1.28473 20.8767 1.66039 21.2524 2.1238 21.2524H8.04952C8.51292 21.2524 8.88858 20.8767 8.88858 20.4133V17.4505C8.88858 16.9871 8.51292 16.6114 8.04952 16.6114ZM21.8762 16.6114H15.9505C15.4871 16.6114 15.1114 16.9871 15.1114 17.4505V20.4133C15.1114 20.8767 15.4871 21.2524 15.9505 21.2524H21.8762C22.3396 21.2524 22.7153 20.8767 22.7153 20.4133V17.4505C22.7153 16.9871 22.3396 16.6114 21.8762 16.6114ZM2.1238 16.5616H8.04952C8.54042 16.5616 8.93838 16.9596 8.93838 17.4505V20.4133C8.93838 20.9042 8.54042 21.3022 8.04952 21.3022H2.1238C1.63289 21.3022 1.23494 20.9042 1.23494 20.4133V17.4505C1.23494 16.9596 1.63289 16.5616 2.1238 16.5616ZM12 10.4384C14.1272 10.4384 15.8517 8.7139 15.8517 6.58666C15.8517 4.45941 14.1272 2.73494 12 2.73494C9.87275 2.73494 8.14828 4.45941 8.14828 6.58666C8.14828 8.7139 9.87275 10.4384 12 10.4384ZM15.9505 16.5616H21.8762C22.3671 16.5616 22.7651 16.9596 22.7651 17.4505V20.4133C22.7651 20.9042 22.3671 21.3022 21.8762 21.3022H15.9505C15.4596 21.3022 15.0616 20.9042 15.0616 20.4133V17.4505C15.0616 16.9596 15.4596 16.5616 15.9505 16.5616Z",\n fill: "currentColor"\n }\n )\n] }), Fx = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 18V21C24 22.2 23 23.1 21.9 23.1H16C14.8 23.1 13.9 22.1 13.9 21V18C13.9 16.8 14.9 15.9 16 15.9H17.7L14.4 11.7C13.7 12.1 12.9 12.3 12.1 12.3C11.2 12.3 10.4 12.1 9.7 11.7L6.4 16H8C9.2 16 10.1 17 10.1 18.1V21.1C10.1 22.3 9.1 23.2 8 23.2H2.1C1 23 0 22.1 0 20.9V17.9C0 16.7 1 15.8 2.1 15.8H4L8.2 10.4C7.4 9.6 6.9 8.4 6.9 7.1C6.9 4.3 9.2 2 12 2C14.8 2 17.1 4.3 17.1 7.1C17.1 8.4 16.6 9.6 15.8 10.5L19.9 15.8H21.9C23 15.8 24 16.8 24 18Z",\n fill: "currentColor"\n }\n) }), Ux = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "24",\n height: "24",\n viewBox: "0 0 24 24",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2721_61383)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.4445 6.55517C17.7178 6.82853 17.7178 7.27175 17.4445 7.54511L7.54498 17.4446C7.27162 17.718 6.8284 17.718 6.55503 17.4446C6.28167 17.1712 6.28167 16.728 6.55503 16.4547L16.4545 6.55517C16.7279 6.2818 17.1711 6.2818 17.4445 6.55517Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M21.8797 2.12082C23.1673 3.40998 23.8905 5.1575 23.8905 6.97951C23.8905 8.80153 23.1673 10.549 21.8797 11.8382L18.9718 14.7461C18.6984 15.0195 18.2552 15.0195 17.9818 14.7461C17.7085 14.4728 17.7085 14.0296 17.9818 13.7562L20.8892 10.8489C21.9146 9.82221 22.4905 8.43052 22.4905 6.97951C22.4905 5.52864 21.9147 4.13709 20.8895 3.11046C19.8629 2.08527 18.4713 1.50944 17.0204 1.50944C15.5695 1.50944 14.1779 2.08534 13.1512 3.11064L10.2977 5.96412C10.0243 6.23749 9.58113 6.23749 9.30777 5.96412C9.0344 5.69076 9.0344 5.24754 9.30777 4.97417L12.1614 2.12051C13.4506 0.832954 15.1984 0.109436 17.0204 0.109436C18.8424 0.109436 20.5906 0.833261 21.8797 2.12082ZM5.86943 9.40246C6.14279 9.67583 6.14279 10.119 5.86943 10.3924L2.97079 13.2911C2.00879 14.328 1.48527 15.6971 1.51023 17.1117C1.53526 18.5302 2.10991 19.8836 3.11312 20.8868C4.11632 21.89 5.46976 22.4647 6.88829 22.4897C8.30282 22.5147 9.67196 21.9912 10.7089 21.0292L13.6075 18.1305C13.8809 17.8572 14.3241 17.8572 14.5975 18.1305C14.8708 18.4039 14.8708 18.8471 14.5975 19.1205L11.6811 22.0368L11.6721 22.0453C10.3687 23.2597 8.64482 23.9209 6.86359 23.8895C5.08237 23.8581 3.38288 23.1365 2.12317 21.8768C0.863455 20.6171 0.141875 18.9176 0.110446 17.1363C0.079019 15.3551 0.7402 13.6312 1.95469 12.3279L1.96311 12.3188L4.87948 9.40246C5.15284 9.1291 5.59606 9.1291 5.86943 9.40246Z",\n fill: "currentcolor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2721_61383", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n ]\n }\n), Yx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.5 22.8854V6.68047C23.5 6.6051 23.4999 6.52973 23.4248 6.37898C23.4248 6.30361 23.3496 6.22825 23.2745 6.15288L17.8628 0.726106C17.7876 0.650734 17.7124 0.575376 17.6372 0.575376C17.5621 0.575376 17.4869 0.5 17.3366 0.5H1.17649C0.800671 0.5 0.5 0.801482 0.5 1.17834V22.81C0.5 23.1869 0.800671 23.4884 1.17649 23.4884H22.7484C23.1993 23.5637 23.5 23.2622 23.5 22.8854ZM17.8628 2.36912L21.8541 6.37898H17.781L17.8628 2.36912ZM1.79772 22.3899V1.74464H16.8105V6.68047C16.8105 7.05733 17.1111 7.35883 17.4869 7.35883H22.4771V22.3899H1.79772Z",\n fill: "currentColor"\n }\n) }), Xx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M5.73315 0.935417C5.73315 0.556872 6.04003 0.25 6.41857 0.25C6.79712 0.25 7.10399 0.556872 7.10399 0.935417V23.0646C7.10399 23.4431 6.79712 23.75 6.41857 23.75C6.04003 23.75 5.73315 23.4431 5.73315 23.0646V0.935417Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M16.8957 0.935417C16.8957 0.556872 17.2025 0.25 17.5811 0.25C17.9596 0.25 18.2665 0.556872 18.2665 0.935417V23.0646C18.2665 23.4431 17.9596 23.75 17.5811 23.75C17.2025 23.75 16.8957 23.4431 16.8957 23.0646V0.935417Z",\n fill: "currentColor"\n }\n )\n] }), Qx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M32.4898 17.934H28.5425V19.4924H35.1552V12.9469L33.5807 12.9469V16.7108L32.7538 15.7805C30.534 13.2831 27.2855 11.7002 23.6616 11.7002C17.5487 11.7002 12.4997 16.1744 11.6616 21.9859H13.2644C14.0888 17.042 18.4371 13.2586 23.6616 13.2586C26.9852 13.2586 29.953 14.7866 31.878 17.1749L32.4898 17.934ZM13.7425 30.6896L14.5695 31.6199C16.7892 34.1172 20.0378 35.7002 23.6616 35.7002C29.7745 35.7002 34.8236 31.226 35.6616 25.4145H34.0588C33.2344 30.3584 28.8862 34.1418 23.6616 34.1418C20.3371 34.1418 17.3829 32.6131 15.4463 30.2268L14.8292 29.4664H18.7808V27.908H12.168L12.168 34.4534H13.7425V30.6896ZM22.0206 21.3891C22.0206 22.0646 22.4795 22.4984 23.9067 22.918C25.3338 23.3375 26.8615 24.0273 26.8615 26.0468C26.8615 27.5046 25.887 28.3082 24.6611 28.5713V30.1002H22.775V28.5571C21.5679 28.2655 20.5369 27.3908 20.4615 25.8335H21.8446C21.9137 26.6726 22.423 27.3268 23.718 27.3268C25.1074 27.3268 25.4155 26.5446 25.4155 26.054C25.4155 25.3926 25.1011 24.7668 23.5294 24.3402C21.7754 23.8637 20.5746 23.046 20.5746 21.4033C20.5746 20.0308 21.5554 19.1348 22.775 18.8362V17.3002H24.6611V18.8575C25.975 19.2202 26.6351 20.3437 26.6791 21.5668H25.2898C25.252 20.678 24.8371 20.0735 23.718 20.0735C22.6556 20.0735 22.0206 20.614 22.0206 21.3891Z",\n fill: "currentColor"\n }\n) }), Gx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M33 35.4613V18.2843C33 18.2843 33 18.2843 33 18.2244C33 18.1646 33 18.1047 33 18.1047V18.0449C33 17.985 32.9409 17.9252 32.8819 17.8653L27.2164 12.1197C27.1573 12.0598 27.0983 12.0599 27.0393 12H26.9803C26.9213 12 26.8623 12 26.8623 12C26.8623 12 26.8623 12 26.8033 12H15.5311C15.236 12 15 12.2394 15 12.5386V35.4613C15 35.7606 15.236 36 15.5311 36H32.4688C32.7639 36 33 35.7606 33 35.4613ZM27.3934 13.8554L31.1704 17.6858H27.3934V13.8554ZM16.1213 34.8628V13.0773H26.3311V18.2244C26.3311 18.5237 26.5672 18.7631 26.8623 18.7631H31.9377V34.803H16.1213V34.8628Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.5281 27.928C20.5281 27.4427 20.4081 27.0693 20.1681 26.808C19.9281 26.5467 19.6081 26.416 19.2081 26.416C18.9841 26.416 18.8081 26.424 18.6801 26.44C18.5575 26.456 18.4588 26.4747 18.3841 26.496V29.12C18.4748 29.1947 18.6055 29.2667 18.7761 29.336C18.9468 29.4053 19.1335 29.44 19.3361 29.44C19.5495 29.44 19.7308 29.4027 19.8801 29.328C20.0348 29.248 20.1601 29.1413 20.2561 29.008C20.3521 28.8693 20.4215 28.7093 20.4641 28.528C20.5068 28.3413 20.5281 28.1413 20.5281 27.928ZM21.3041 27.928C21.3041 28.2427 21.2615 28.5333 21.1761 28.8C21.0961 29.0667 20.9761 29.296 20.8161 29.488C20.6561 29.68 20.4588 29.8293 20.2241 29.936C19.9948 30.0427 19.7308 30.096 19.4321 30.096C19.1921 30.096 18.9788 30.064 18.7921 30C18.6108 29.936 18.4748 29.8747 18.3841 29.816V31.48H17.6401V25.968C17.8161 25.9253 18.0348 25.88 18.2961 25.832C18.5628 25.7787 18.8695 25.752 19.2161 25.752C19.5361 25.752 19.8241 25.8027 20.0801 25.904C20.3361 26.0053 20.5548 26.1493 20.7361 26.336C20.9175 26.5227 21.0561 26.752 21.1521 27.024C21.2535 27.2907 21.3041 27.592 21.3041 27.928Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M25.2391 26.72C25.1484 26.6453 25.0177 26.5733 24.8471 26.504C24.6764 26.4347 24.4897 26.4 24.2871 26.4C24.0737 26.4 23.8897 26.44 23.7351 26.52C23.5857 26.5947 23.4631 26.7013 23.3671 26.84C23.2711 26.9733 23.2017 27.1333 23.1591 27.32C23.1164 27.5067 23.0951 27.7067 23.0951 27.92C23.0951 28.4053 23.2151 28.7813 23.4551 29.048C23.6951 29.3093 24.0151 29.44 24.4151 29.44C24.6177 29.44 24.7857 29.432 24.9191 29.416C25.0577 29.3947 25.1644 29.3733 25.2391 29.352V26.72ZM25.2391 23.92L25.9831 23.792V29.88C25.8124 29.928 25.5937 29.976 25.3271 30.024C25.0604 30.072 24.7537 30.096 24.4071 30.096C24.0871 30.096 23.7991 30.0453 23.5431 29.944C23.2871 29.8427 23.0684 29.6987 22.8871 29.512C22.7057 29.3253 22.5644 29.0987 22.4631 28.832C22.3671 28.56 22.3191 28.256 22.3191 27.92C22.3191 27.6 22.3591 27.3067 22.4391 27.04C22.5244 26.7733 22.6471 26.544 22.8071 26.352C22.9671 26.16 23.1617 26.0107 23.3911 25.904C23.6257 25.7973 23.8924 25.744 24.1911 25.744C24.4311 25.744 24.6417 25.776 24.8231 25.84C25.0097 25.904 25.1484 25.9653 25.2391 26.024V23.92Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M29.086 23.792C29.3047 23.792 29.4913 23.808 29.646 23.84C29.806 23.872 29.918 23.9013 29.982 23.928L29.846 24.568C29.782 24.536 29.6913 24.5067 29.574 24.48C29.4567 24.448 29.3127 24.432 29.142 24.432C28.7953 24.432 28.5527 24.528 28.414 24.72C28.2753 24.9067 28.206 25.16 28.206 25.48V25.84H29.806V26.464H28.206V30H27.462V25.464C27.462 24.9307 27.5927 24.52 27.854 24.232C28.1153 23.9387 28.526 23.792 29.086 23.792Z",\n fill: "currentColor"\n }\n )\n] }), jx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 25", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.8391 6.90341C24.2547 5.48818 24.2547 3.17234 22.8391 1.69278C22.1313 0.985159 21.2304 0.599189 20.2652 0.599189C19.3 0.599189 18.3348 0.985159 17.6913 1.69278L2.44093 16.9387C2.37658 17.003 2.37658 17.0674 2.31223 17.0674C2.31223 17.0674 2.31223 17.0674 2.31223 17.1317L0.124416 23.6289C0.0600686 23.8219 0.124416 24.0792 0.253111 24.2078C0.381806 24.3365 0.510501 24.4008 0.703544 24.4008C0.767891 24.4008 0.832239 24.4008 0.896586 24.4008L7.39569 22.2136C7.39569 22.2136 7.39569 22.2136 7.46003 22.2136C7.52438 22.2136 7.58873 22.1493 7.58873 22.085L20.6513 9.02626L22.8391 6.90341ZM18.5278 2.59338C18.9782 2.14308 19.6217 1.88576 20.2652 1.88576C20.9087 1.88576 21.5521 2.14308 22.0026 2.59338C22.9678 3.55832 22.9678 5.10221 22.0026 6.13147L20.2652 7.86834L16.7261 4.33026L18.5278 2.59338ZM13.7661 7.35371L17.3052 10.8918L7.26699 20.9271L3.79222 17.4533L13.7661 7.35371ZM1.60441 22.9856L3.0844 18.4826L6.04439 21.4417L1.60441 22.9856ZM18.0774 9.99119L14.5383 6.45311L15.8896 5.1022L19.4287 8.64028L18.0774 9.99119Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M22.9092 6.97355L22.9082 6.97459L20.7214 9.0964L20.7203 9.09744L7.68244 22.1315C7.67189 22.1763 7.64718 22.215 7.61862 22.2436C7.58057 22.2816 7.52445 22.3128 7.46003 22.3128H7.4123L0.912827 24.5H0.704298C0.596206 24.5 0.500943 24.4819 0.413926 24.4432C0.327339 24.4047 0.253197 24.3482 0.182995 24.278C0.102425 24.1974 0.046952 24.0827 0.0197403 23.9648C-0.00756671 23.8465 -0.00879298 23.7149 0.0303346 23.5975L2.21306 17.1154V17.0679L2.31223 17.0674V17.1317L0.124416 23.6289C0.0600686 23.8219 0.124416 24.0792 0.253111 24.2078C0.381806 24.3365 0.510501 24.4008 0.703544 24.4008H0.896586L7.39569 22.2136H7.46003C7.52438 22.2136 7.58873 22.1493 7.58873 22.085L20.6513 9.02626L22.8391 6.90341C24.2547 5.48818 24.2547 3.17234 22.8391 1.69278C22.1313 0.985159 21.2304 0.599189 20.2652 0.599189C19.3 0.599189 18.3348 0.985159 17.6913 1.69278L2.44093 16.9387C2.41635 16.9633 2.40116 16.9878 2.38818 17.0088C2.36719 17.0428 2.352 17.0674 2.31223 17.0674V16.9682C2.30995 16.9682 2.30174 16.9693 2.29358 16.975C2.29089 16.9769 2.28948 16.9785 2.28952 16.9784C2.28955 16.9784 2.29102 16.9767 2.29407 16.9721C2.29562 16.9698 2.29771 16.9664 2.30034 16.9621C2.31266 16.9419 2.33666 16.9027 2.37081 16.8686L17.6195 1.62428C18.2837 0.894993 19.2759 0.500015 20.2652 0.500015C21.2581 0.500015 22.1838 0.897447 22.9092 1.62264L22.9108 1.6242C24.3623 3.14123 24.3644 5.51874 22.9092 6.97355ZM18.5979 2.66352L18.5966 2.6648L16.8676 4.33155L20.2652 7.72811L21.9313 6.06246C22.8609 5.07008 22.8574 3.58816 21.9325 2.66352C21.5014 2.23257 20.8835 1.98494 20.2652 1.98494C19.6469 1.98494 19.029 2.23257 18.5979 2.66352ZM22.0026 6.13147C22.9678 5.10221 22.9678 3.55832 22.0026 2.59338C21.5521 2.14308 20.9087 1.88576 20.2652 1.88576C19.6217 1.88576 18.9782 2.14308 18.5278 2.59338L16.7261 4.33026L20.2652 7.86834L22.0026 6.13147ZM13.7661 7.35371L3.79222 17.4533L7.26699 20.9271L17.3052 10.8918L13.7661 7.35371ZM13.7665 7.49439L3.93205 17.4529L7.26699 20.7868L17.1649 10.8918L13.7665 7.49439ZM1.60441 22.9856L6.04439 21.4417L3.0844 18.4826L1.60441 22.9856ZM1.76123 22.8261L5.86239 21.4L3.12829 18.6667L1.76123 22.8261ZM18.0774 9.99119L14.5383 6.45311L15.8896 5.1022L19.4287 8.64028L18.0774 9.99119ZM19.2884 8.64028L18.0774 9.85096L14.6785 6.45311L15.8896 5.24243L19.2884 8.64028Z",\n fill: "currentcolor"\n }\n )\n] }), Kx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M13.7509 1.2323C15.3875 -0.410769 18.0408 -0.410764 19.6774 1.2323C21.3138 2.87536 21.3138 5.53929 19.6774 7.18237L19.212 7.6496L19.3591 7.79727C20.6979 9.14153 20.6979 11.321 19.3591 12.6653L16.8917 15.1426C16.5569 15.4786 16.0142 15.4786 15.6794 15.1426C15.3447 14.8065 15.3447 14.2616 15.6794 13.9256L18.1469 11.4483C18.8163 10.7762 18.8163 9.68641 18.1469 9.01427L17.9998 8.8666L8.3203 18.5847C8.21045 18.695 8.07281 18.7733 7.92211 18.811L1.06504 20.5321C0.761544 20.6084 0.440805 20.5125 0.228253 20.2821C0.0157006 20.0516 -0.0549271 19.7232 0.0440032 19.4253L2.18684 12.971C2.22892 12.8443 2.29981 12.7291 2.3939 12.6347L13.7509 1.2323ZM18.4652 2.44931C17.498 1.47838 15.9302 1.47838 14.9631 2.44931L3.74915 13.708L2.16405 18.4823L7.27602 17.1992L18.4652 5.96535C19.4322 4.99442 19.4322 3.42024 18.4652 2.44931ZM6.79991 24C4.68273 24 3.01569 23.025 1.9058 22.0952L4.1081 21.5424C4.8715 21.972 5.77569 22.2789 6.79991 22.2789C7.49486 22.2789 8.21142 21.9966 8.97565 21.4925C9.74149 20.9872 10.4811 20.3101 11.2279 19.6072L11.4224 19.4239C12.0813 18.8021 12.7665 18.1555 13.4215 17.7083C14.121 17.2307 15.048 16.797 16.0219 17.173C16.6653 17.4216 17.083 17.8802 17.3777 18.4412C17.654 18.9666 17.8443 19.6255 18.0295 20.3416C18.1141 20.669 18.2576 20.9853 18.422 21.1992C18.5021 21.3035 18.5712 21.3626 18.6193 21.3923C18.6617 21.4185 18.6805 21.4185 18.6853 21.4185C18.8943 21.4185 19.2529 21.2765 19.7653 20.9264C20.0832 20.7092 20.3545 20.4919 20.6262 20.2743C20.7948 20.1394 20.9634 20.0041 21.1434 19.869C21.6215 19.5096 22.0359 19.2687 22.3393 19.1146C22.4908 19.0375 22.615 18.9821 22.7055 18.9446C22.7507 18.9258 22.7876 18.9115 22.8154 18.901L22.8502 18.8885L22.8623 18.8842L22.867 18.8826L22.869 18.8819C22.869 18.8819 22.8707 18.8812 23.1426 19.6974L22.8707 18.8812C23.3197 18.7305 23.8053 18.9737 23.9555 19.4244C24.105 19.8733 23.8655 20.3585 23.4203 20.5115L23.4136 20.5141C23.4044 20.5175 23.3864 20.5244 23.3603 20.5352C23.3082 20.5567 23.224 20.5939 23.1131 20.6504C22.8913 20.7629 22.5627 20.9523 22.1705 21.2469C22.07 21.3223 21.9387 21.4269 21.7889 21.5462C21.4781 21.7939 21.0875 22.1049 20.7298 22.3493C20.1968 22.7135 19.4586 23.1396 18.6855 23.1396C17.9388 23.1396 17.3978 22.684 17.0647 22.2505C16.7247 21.8082 16.4967 21.264 16.3702 20.7741C16.1822 20.047 16.0332 19.5707 15.8616 19.2442C15.7085 18.953 15.5702 18.8427 15.4064 18.7794C15.2659 18.7251 14.9858 18.7217 14.3854 19.1315C13.8487 19.4979 13.2639 20.049 12.5716 20.7015L12.4004 20.8629C11.6615 21.5584 10.8226 22.3334 9.91698 22.9308C9.00979 23.5293 7.9621 24 6.79991 24Z",\n fill: "currentColor"\n }\n) }), Zx = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 26 26", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24.8278 1.17701C24.7588 1.10466 24.6759 1.04704 24.584 1.00763C24.4918 0.968085 24.3926 0.947693 24.2923 0.947693C24.1919 0.947693 24.0927 0.968085 24.0005 1.00763C23.9085 1.0471 23.8255 1.10482 23.7564 1.1773L1.1778 23.766C1.10533 23.835 1.04715 23.9185 1.00769 24.0104C0.968146 24.1026 0.947754 24.2019 0.947754 24.3022C0.947754 24.4025 0.968146 24.5018 1.00769 24.5939C1.04713 24.6859 1.10479 24.7688 1.1772 24.8379C1.24565 24.9073 1.3275 24.9621 1.41777 24.9989C1.50811 25.0358 1.60501 25.0539 1.70257 25.0522C1.80231 25.0527 1.90114 25.0331 1.99311 24.9945C2.08517 24.9558 2.16845 24.8989 2.23794 24.8272L24.8271 2.23806C24.898 2.16913 24.9546 2.08647 24.9931 1.99538C25.0317 1.90419 25.0515 1.8062 25.0515 1.70719C25.0515 1.60819 25.0317 1.51019 24.9931 1.41901C24.9547 1.32812 24.8985 1.24584 24.8278 1.17701ZM10.3635 12.0325C9.36854 12.6973 8.19883 13.0521 7.00226 13.0521C5.3977 13.0521 3.85885 12.4147 2.72426 11.2801C1.58966 10.1455 0.952255 8.60665 0.952255 7.00209C0.952255 5.80551 1.30708 4.63581 1.97186 3.64089C2.63665 2.64597 3.58153 1.87053 4.68702 1.41262C5.79251 0.954709 7.00897 0.834898 8.18255 1.06834C9.35614 1.30178 10.4341 1.87799 11.2803 2.72409C12.1264 3.5702 12.7026 4.64821 12.936 5.82179C13.1694 6.99538 13.0496 8.21183 12.5917 9.31733C12.1338 10.4228 11.3584 11.3677 10.3635 12.0325ZM9.5301 3.2189C8.78186 2.71894 7.90216 2.45209 7.00226 2.45209C5.79552 2.45209 4.63821 2.93146 3.78492 3.78475C2.93163 4.63804 2.45225 5.79536 2.45225 7.00209C2.45225 7.902 2.71911 8.78169 3.21907 9.52993C3.71903 10.2782 4.42964 10.8614 5.26105 11.2057C6.09245 11.5501 7.0073 11.6402 7.88992 11.4647C8.77253 11.2891 9.58326 10.8558 10.2196 10.2194C10.8559 9.5831 11.2893 8.77237 11.4648 7.88975C11.6404 7.00714 11.5503 6.09228 11.2059 5.26088C10.8615 4.42948 10.2783 3.71886 9.5301 3.2189ZM15.6411 13.9717C16.636 13.3069 17.8057 12.9521 19.0023 12.9521C20.6068 12.9521 22.1457 13.5895 23.2803 14.7241C24.4148 15.8587 25.0523 17.3975 25.0523 19.0021C25.0523 20.1987 24.6974 21.3684 24.0326 22.3633C23.3679 23.3582 22.423 24.1336 21.3175 24.5916C20.212 25.0495 18.9955 25.1693 17.822 24.9358C16.6484 24.7024 15.5704 24.1262 14.7243 23.2801C13.8782 22.434 13.3019 21.356 13.0685 20.1824C12.8351 19.0088 12.9549 17.7923 13.4128 16.6869C13.8707 15.5814 14.6461 14.6365 15.6411 13.9717ZM16.4744 22.7853C17.2227 23.2852 18.1024 23.5521 19.0023 23.5521C20.209 23.5521 21.3663 23.0727 22.2196 22.2194C23.0729 21.3661 23.5523 20.2088 23.5523 19.0021C23.5523 18.1022 23.2854 17.2225 22.7854 16.4742C22.2855 15.726 21.5749 15.1428 20.7435 14.7984C19.9121 14.4541 18.9972 14.364 18.1146 14.5395C17.232 14.7151 16.4213 15.1484 15.7849 15.7848C15.1486 16.4211 14.7152 17.2318 14.5397 18.1144C14.3641 18.997 14.4542 19.9119 14.7986 20.7433C15.143 21.5747 15.7262 22.2853 16.4744 22.7853Z",\n fill: "currentcolor"\n }\n) }), Jx = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.6369 3.21864C22.7222 5.27018 23.9235 8.05571 23.9846 10.981V11.3518H12.6277V0H12.8228C15.7475 0.0121534 18.5516 1.16709 20.6369 3.21864ZM14.1108 9.87813H22.4138C22.1188 7.77939 21.1491 5.83389 19.6511 4.33532C18.1532 2.83676 16.2085 1.86663 14.1108 1.57149V9.87813Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.0013 1.66856H11.3721V12.6497H22.3387V12.8351C22.3384 15.036 21.688 17.1879 20.4691 19.0202C19.2502 20.8525 17.5173 22.2835 15.4879 23.1336C13.4586 23.9836 11.2234 24.2147 9.06319 23.7979C6.90292 23.3812 4.91398 22.335 3.34619 20.7908C1.77846 19.2468 0.701777 17.2735 0.251454 15.1192C-0.198869 12.9647 -0.00270911 10.7254 0.815221 8.68216C1.63321 6.63896 3.03647 4.88314 4.84878 3.63527C6.66103 2.3874 8.80152 1.70323 11.0013 1.66856ZM9.8988 14.1233V3.24004C8.11025 3.4799 6.42431 4.21518 5.03136 5.36296C3.63846 6.51075 2.594 8.02516 2.01594 9.73534C1.43788 11.4455 1.34927 13.2833 1.76005 15.0413C2.1709 16.7992 3.06475 18.4073 4.34081 19.6839C5.6168 20.9602 7.22414 21.8546 8.98136 22.2657C10.7385 22.6765 12.5756 22.5878 14.285 22.0095C15.9945 21.4314 17.5084 20.3864 18.6556 18.9928C19.8029 17.5995 20.5379 15.9127 20.7777 14.1233H9.8988Z",\n fill: "currentcolor"\n }\n )\n] }), _x = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M20.6369 3.21864C22.7222 5.27018 23.9235 8.05571 23.9846 10.981V11.3518H12.6277V0H12.8228C15.7475 0.0121534 18.5516 1.16709 20.6369 3.21864Z", fill: "currentcolor" }),\n /* @__PURE__ */ A("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M11.0013 1.66856H11.3721V12.6497H22.3387V12.8351C22.3384 15.036 21.688 17.1879 20.4691 19.0202C19.2502 20.8525 17.5173 22.2835 15.4879 23.1336C13.4586 23.9836 11.2234 24.2147 9.06319 23.7979C6.90292 23.3812 4.91398 22.335 3.34619 20.7908C1.77846 19.2468 0.701777 17.2735 0.251454 15.1192C-0.198869 12.9647 -0.00270909 10.7254 0.815221 8.68216C1.63321 6.63896 3.03647 4.88314 4.84878 3.63527C6.66103 2.3874 8.80152 1.70323 11.0013 1.66856Z", fill: "currentcolor" })\n] }), $x = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 12C24 12.5342 23.636 13.023 23.0587 13.2639L2.48727 21.8479C1.95584 22.0696 1.32317 22.0477 0.816049 21.7901C0.30893 21.5324 -8.3383e-07 21.0758 -8.12333e-07 20.584L-6.18951e-08 3.41599C-4.03981e-08 2.9242 0.308931 2.46763 0.81605 2.20994C1.32317 1.95226 1.95584 1.93037 2.48727 2.15212L23.0587 10.7361C23.636 10.977 24 11.4658 24 12ZM22.7962 12L1.43823 3.17091L1.43823 20.6923L22.7962 12Z",\n fill: "currentColor"\n }\n) }), eR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0.710526 12.7475H11.2895V23.2918C11.2895 23.6852 11.6053 24 12 24C12.3947 24 12.7105 23.6852 12.7105 23.2918V12.7475H23.2895C23.6842 12.7475 24 12.4328 24 12.0393C24 11.6459 23.6842 11.3311 23.2895 11.3311H12.7895V0.708196C12.7895 0.314754 12.4737 0 12.0789 0C11.6842 0 11.3684 0.314754 11.3684 0.708196V11.2525H0.710526C0.315789 11.2525 0 11.5672 0 11.9607C0 12.3541 0.315789 12.7475 0.710526 12.7475Z",\n fill: "currentColor"\n }\n) }), tR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.990251 13.2467L0.990234 13.2454C0.990243 10.1132 2.37607 7.1863 4.7301 5.14507L4.73722 5.13889C5.04656 4.91089 5.53642 4.89407 5.79284 5.23006C6.02498 5.53424 6.04299 6.01601 5.70483 6.26956C3.67721 8.06479 2.52933 10.5891 2.52933 13.2454C2.52933 18.3611 6.78952 22.5507 12.0002 22.5507C17.2108 22.5507 21.471 18.3611 21.471 13.2454C21.471 10.5891 20.3231 8.06478 18.2955 6.26956C17.9573 6.01601 17.9753 5.53424 18.2074 5.23006C18.4639 4.89407 18.9536 4.91119 19.2629 5.13919L19.272 5.14594C21.6241 7.25349 23.01 10.1798 23.01 13.2454C23.01 19.1694 18.0916 24 12.0686 24C5.97741 24 1.05953 19.1699 0.990251 13.2467ZM11.3333 0.724629C11.3333 0.32056 11.6623 0 12.0683 0C12.4743 0 12.8032 0.32056 12.8032 0.724629V8.26374C12.8032 8.66781 12.4743 8.98837 12.0683 8.98837C11.6623 8.98837 11.3333 8.66781 11.3333 8.26374V0.724629Z",\n fill: "currentColor"\n }\n) }), rR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.3094 7.13788H23.4111C23.7377 7.13788 24 7.39745 24 7.72239V19.07C24 19.3949 23.7377 19.6545 23.4111 19.6545H18.3094V21.9217C18.3094 22.2467 18.0472 22.5062 17.7205 22.5062H6.27946C5.95284 22.5062 5.69058 22.2467 5.69058 21.9217V19.6545H0.588878C0.262256 19.6545 0 19.3949 0 19.07V7.72239C0 7.39745 0.262256 7.13788 0.588878 7.13788H5.69058V2.0783C5.69058 1.75336 5.95284 1.49379 6.27946 1.49379H17.7205C18.0472 1.49379 18.3094 1.75336 18.3094 2.0783V7.13788ZM6.86837 7.13788H17.1316V2.66279H6.86837V7.13788ZM17.0717 21.3372V16.8621H6.80845V21.3372H17.0717ZM22.8222 8.30688H1.17779V18.4855H5.69058V16.2182C5.69058 15.8933 5.95284 15.6337 6.27946 15.6337H17.7205C18.0472 15.6337 18.3094 15.8933 18.3094 16.2182V18.4855H22.8222V8.30688ZM2.75549 11.9999C2.75549 10.9026 3.67664 9.98957 4.78194 9.98957C5.94812 9.98957 6.80839 10.9036 6.80839 11.9999C6.80839 13.0971 5.88723 14.0102 4.78194 14.0102C3.67664 14.0102 2.75549 13.0971 2.75549 11.9999ZM3.93325 11.9999C3.93325 12.4473 4.32986 12.8412 4.78194 12.8412C5.23402 12.8412 5.63063 12.4473 5.63063 11.9999C5.63063 11.5525 5.23402 11.1585 4.78194 11.1585C4.32986 11.1585 3.93325 11.5525 3.93325 11.9999Z",\n fill: "currentColor"\n }\n) }), nR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M14.8044 10.2787C16.0847 9.37269 16.9382 7.92314 16.9382 6.232C16.9382 3.51411 14.7435 1.33977 12 1.33977C9.2566 1.33977 7.06185 3.51411 7.06185 6.232C7.06185 7.92314 7.91536 9.37269 9.19563 10.2787C5.47675 11.1846 2.67235 14.5065 2.67235 18.4927V22.1166C2.67235 22.4186 2.91621 22.6602 3.22103 22.6602H20.779C21.0839 22.6602 21.3277 22.4186 21.3277 22.1166V18.4927C21.3277 14.5669 18.5233 11.1846 14.8044 10.2787ZM8.22018 6.29239C8.22018 4.23887 9.92722 2.54772 12 2.54772C14.0729 2.54772 15.7799 4.23887 15.7799 6.29239C15.7799 8.34591 14.0729 10.0371 12 10.0371C9.92722 10.0371 8.22018 8.34591 8.22018 6.29239ZM3.83069 21.573V18.4927C3.83069 14.4461 7.18377 11.1242 11.2684 11.1242H12.7926C16.8773 11.1242 20.2303 14.4461 20.2303 18.4927V21.573H3.83069Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.8577 10.2405C16.1083 9.33227 16.9382 7.89959 16.9382 6.232C16.9382 3.51411 14.7435 1.33977 12 1.33977C9.2566 1.33977 7.06185 3.51411 7.06185 6.232C7.06185 7.89959 7.89175 9.33227 9.14239 10.2405C9.16005 10.2533 9.1778 10.266 9.19563 10.2787C9.17439 10.2838 9.15318 10.2891 9.132 10.2944C5.44481 11.2226 2.67235 14.5292 2.67235 18.4927V22.1166C2.67235 22.4186 2.91621 22.6602 3.22103 22.6602H20.779C21.0839 22.6602 21.3277 22.4186 21.3277 22.1166V18.4927C21.3277 14.5893 18.5553 11.2233 14.8681 10.2944C14.8469 10.2891 14.8257 10.2838 14.8044 10.2787C14.8223 10.266 14.84 10.2533 14.8577 10.2405ZM14.9203 10.2563C16.164 9.33847 16.988 7.9021 16.988 6.23201C16.988 3.48617 14.7705 1.28998 12 1.28998C9.22954 1.28998 7.01206 3.48617 7.01206 6.23201C7.01206 7.90209 7.83605 9.33846 9.07974 10.2563C5.39159 11.2036 2.62256 14.5196 2.62256 18.4927V22.1166C2.62256 22.4465 2.88915 22.71 3.22103 22.71H20.779C21.1109 22.71 21.3775 22.4465 21.3775 22.1166V18.4927C21.3775 14.5797 18.6087 11.2048 14.9203 10.2563ZM12 2.59751C9.95428 2.59751 8.26997 4.2668 8.26997 6.29239C8.26997 8.31797 9.95428 9.98726 12 9.98726C14.0458 9.98726 15.7301 8.31797 15.7301 6.29239C15.7301 4.2668 14.0458 2.59751 12 2.59751ZM3.88048 21.5232H20.1806V18.4927C20.1806 14.474 16.8502 11.174 12.7926 11.174H11.2684C7.21083 11.174 3.88048 14.474 3.88048 18.4927V21.5232ZM12 2.54772C9.92722 2.54772 8.22018 4.23887 8.22018 6.29239C8.22018 8.34591 9.92722 10.0371 12 10.0371C14.0729 10.0371 15.7799 8.34591 15.7799 6.29239C15.7799 4.23887 14.0729 2.54772 12 2.54772ZM20.2303 21.573V18.4927C20.2303 14.4461 16.8773 11.1242 12.7926 11.1242H11.2684C7.18377 11.1242 3.83069 14.4461 3.83069 18.4927V21.573H20.2303Z",\n fill: "currentColor"\n }\n )\n] }), oR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 10 12", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M6.40222 5.13936C7.04235 4.68638 7.46911 3.9616 7.46911 3.11603C7.46911 1.75708 6.37174 0.669915 5.00002 0.669915C3.6283 0.669915 2.53092 1.75708 2.53092 3.11603C2.53092 3.9616 2.95768 4.68638 3.59782 5.13936C1.73837 5.59234 0.336175 7.25327 0.336175 9.2464V11.0583C0.336175 11.2093 0.458103 11.3301 0.610516 11.3301H9.38952C9.54193 11.3301 9.66386 11.2093 9.66386 11.0583V9.2464C9.66386 7.28347 8.26166 5.59234 6.40222 5.13936Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M6.42884 5.12028C7.05416 4.66617 7.46911 3.94983 7.46911 3.11603C7.46911 1.75708 6.37174 0.669915 5.00002 0.669915C3.6283 0.669915 2.53092 1.75708 2.53092 3.11603C2.53092 3.94982 2.94588 4.66617 3.5712 5.12028C3.58003 5.12669 3.5889 5.13305 3.59782 5.13936C3.5872 5.14195 3.57659 5.14457 3.566 5.14724C1.7224 5.61133 0.336175 7.26465 0.336175 9.2464V11.0583C0.336175 11.2093 0.458103 11.3301 0.610516 11.3301H9.38952C9.54193 11.3301 9.66386 11.2093 9.66386 11.0583V9.2464C9.66386 7.29468 8.27763 5.61167 6.43403 5.14724C6.42344 5.14457 6.41284 5.14195 6.40222 5.13936C6.41113 5.13305 6.42 5.12669 6.42884 5.12028ZM6.46015 5.1282C7.08201 4.66927 7.49401 3.95108 7.49401 3.11603C7.49401 1.74312 6.38527 0.64502 5.00002 0.64502C3.61477 0.64502 2.50603 1.74312 2.50603 3.11603C2.50603 3.95108 2.91802 4.66926 3.53987 5.1282C1.69579 5.60183 0.311279 7.25985 0.311279 9.2464V11.0583C0.311279 11.2233 0.444573 11.355 0.610517 11.355H9.38952C9.55546 11.355 9.68875 11.2233 9.68875 11.0583V9.2464C9.68875 7.28987 8.30434 5.60241 6.46015 5.1282Z",\n fill: "currentColor"\n }\n )\n] }), iR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_935_86674)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.5311 6.2311C14.5311 7.92251 13.6647 9.3723 12.3651 10.2784C16.1401 11.1845 18.9868 14.5673 18.9868 18.4938V22.1183C18.9868 22.4203 18.7393 22.662 18.4298 22.662H0.606779C0.29735 22.662 0.0497925 22.4203 0.0497925 22.1183V18.4938C0.0497925 14.5069 2.89654 11.1845 6.67157 10.2784C5.37197 9.3723 4.50557 7.92251 4.50557 6.2311C4.50557 3.51276 6.73346 1.33806 9.51831 1.33806C12.3032 1.33806 14.5311 3.51276 14.5311 6.2311ZM9.51831 2.54621C7.4142 2.54621 5.68139 4.23763 5.68139 6.29149C5.68139 8.34535 7.4142 10.0368 9.51831 10.0368C11.6224 10.0368 13.3552 8.34535 13.3552 6.29149C13.3552 4.23763 11.6224 2.54621 9.51831 2.54621ZM1.22564 21.5746H17.8729V18.4938C17.8729 14.4465 14.4692 11.1241 10.3228 11.1241H8.77567C4.62934 11.1241 1.22564 14.4465 1.22564 18.4938V21.5746Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.9179 7.13734H23.3314C23.6408 7.13734 23.9502 7.37894 23.9502 7.68097C23.9502 7.98299 23.7027 8.22463 23.3933 8.22463H20.9798V10.5805C20.9798 10.8825 20.7322 11.1241 20.4228 11.1241C20.1134 11.1241 19.8659 10.8825 19.8659 10.5805V8.22463H17.4524C17.143 8.22463 16.8954 7.98299 16.8954 7.68097C16.8954 7.37894 17.143 7.13734 17.4524 7.13734H19.804V4.7815C19.804 4.47947 20.0515 4.23787 20.3609 4.23787C20.6704 4.23787 20.9179 4.47947 20.9179 4.7815V7.13734Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.419 10.2403C12.4011 10.2531 12.3831 10.2658 12.3651 10.2784C12.3865 10.2836 12.4079 10.2888 12.4293 10.2941C16.1723 11.223 18.9868 14.5896 18.9868 18.4938V22.1183C18.9868 22.4203 18.7393 22.662 18.4298 22.662H0.606779C0.29735 22.662 0.0497925 22.4203 0.0497925 22.1183V18.4938C0.0497925 14.5296 2.86428 11.2223 6.6073 10.2941C6.62869 10.2888 6.65012 10.2836 6.67157 10.2784C6.65349 10.2658 6.63549 10.2531 6.61757 10.2403C5.34803 9.33191 4.50557 7.89898 4.50557 6.2311C4.50557 3.51276 6.73346 1.33806 9.51831 1.33806C12.3032 1.33806 14.5311 3.51276 14.5311 6.2311C14.5311 7.89898 13.6886 9.33191 12.419 10.2403ZM12.4823 10.2561C13.7444 9.33814 14.5808 7.90163 14.5808 6.2311C14.5808 3.48413 12.3295 1.28827 9.51831 1.28827C6.7071 1.28827 4.45578 3.48413 4.45578 6.2311C4.45578 7.90162 5.29222 9.33813 6.55432 10.256C2.81115 11.2033 0 14.5196 0 18.4938V22.1183C0 22.4489 0.270992 22.7118 0.606779 22.7118H18.4298C18.7656 22.7118 19.0366 22.4489 19.0366 22.1183V18.4938C19.0366 14.5796 16.2257 11.2044 12.4823 10.2561ZM9.51831 2.59601C7.44056 2.59601 5.73118 4.26626 5.73118 6.29149C5.73118 8.31672 7.44056 9.98698 9.51831 9.98698C11.5961 9.98698 13.3054 8.31672 13.3054 6.29149C13.3054 4.26626 11.5961 2.59601 9.51831 2.59601ZM17.8231 21.5248V18.4938C17.8231 14.4751 14.4428 11.1739 10.3228 11.1739H8.77567C4.65569 11.1739 1.27543 14.4751 1.27543 18.4938V21.5248H17.8231ZM20.9677 7.08754H23.3314C23.4985 7.08754 23.6645 7.15257 23.789 7.25787C23.9136 7.36326 24 7.51217 24 7.68097C24 8.01162 23.729 8.27442 23.3933 8.27442H21.0296V10.5805C21.0296 10.9111 20.7586 11.1739 20.4228 11.1739C20.087 11.1739 19.8161 10.9111 19.8161 10.5805V8.27442H17.4524C17.1166 8.27442 16.8457 8.01162 16.8457 7.68097C16.8457 7.35031 17.1166 7.08754 17.4524 7.08754H19.7542V4.7815C19.7542 4.45084 20.0252 4.18808 20.3609 4.18808C20.6967 4.18808 20.9677 4.45084 20.9677 4.7815V7.08754ZM5.68139 6.29149C5.68139 4.23763 7.4142 2.54621 9.51831 2.54621C11.6224 2.54621 13.3552 4.23763 13.3552 6.29149C13.3552 8.34535 11.6224 10.0368 9.51831 10.0368C7.4142 10.0368 5.68139 8.34535 5.68139 6.29149ZM1.22564 21.5746V18.4938C1.22564 14.4465 4.62934 11.1241 8.77567 11.1241H10.3228C14.4692 11.1241 17.8729 14.4465 17.8729 18.4938V21.5746H1.22564ZM20.9179 7.13734V4.7815C20.9179 4.47947 20.6704 4.23787 20.3609 4.23787C20.0515 4.23787 19.804 4.47947 19.804 4.7815V7.13734H17.4524C17.143 7.13734 16.8954 7.37894 16.8954 7.68097C16.8954 7.98299 17.143 8.22463 17.4524 8.22463H19.8659V10.5805C19.8659 10.8825 20.1134 11.1241 20.4228 11.1241C20.7322 11.1241 20.9798 10.8825 20.9798 10.5805V8.22463H23.3933C23.7027 8.22463 23.9502 7.98299 23.9502 7.68097C23.9502 7.37894 23.6408 7.13734 23.3314 7.13734H20.9179Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_935_86674", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), aR = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_5630_95919)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.5311 6.23116C14.5311 7.92257 13.6647 9.37236 12.3651 10.2785C16.1401 11.1846 18.9868 14.5674 18.9868 18.4939V22.1183C18.9868 22.4204 18.7393 22.662 18.4298 22.662H0.606779C0.29735 22.662 0.0497925 22.4204 0.0497925 22.1183V18.4939C0.0497925 14.507 2.89654 11.1846 6.67157 10.2785C5.37197 9.37236 4.50557 7.92257 4.50557 6.23116C4.50557 3.51282 6.73346 1.33812 9.51831 1.33812C12.3032 1.33812 14.5311 3.51282 14.5311 6.23116Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M20.9179 7.1374H23.3314C23.6408 7.1374 23.9502 7.379 23.9502 7.68103C23.9502 7.98306 23.7027 8.22469 23.3933 8.22469H20.9798V10.5805C20.9798 10.8826 20.7322 11.1242 20.4228 11.1242C20.1134 11.1242 19.8659 10.8826 19.8659 10.5805V8.22469H17.4524C17.143 8.22469 16.8954 7.98306 16.8954 7.68103C16.8954 7.379 17.143 7.1374 17.4524 7.1374H19.804V4.78156C19.804 4.47953 20.0515 4.23793 20.3609 4.23793C20.6704 4.23793 20.9179 4.47953 20.9179 4.78156V7.1374Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.419 10.2403C12.4011 10.2532 12.3831 10.2659 12.3651 10.2785C12.3865 10.2836 12.4079 10.2889 12.4293 10.2942C16.1723 11.223 18.9868 14.5897 18.9868 18.4939V22.1183C18.9868 22.4204 18.7393 22.662 18.4298 22.662H0.606779C0.29735 22.662 0.0497925 22.4204 0.0497925 22.1183V18.4939C0.0497925 14.5296 2.86428 11.2224 6.6073 10.2942C6.62869 10.2889 6.65012 10.2836 6.67157 10.2785C6.65349 10.2659 6.63549 10.2532 6.61757 10.2403C5.34803 9.33197 4.50557 7.89904 4.50557 6.23116C4.50557 3.51282 6.73346 1.33812 9.51831 1.33812C12.3032 1.33812 14.5311 3.51282 14.5311 6.23116C14.5311 7.89904 13.6886 9.33197 12.419 10.2403ZM12.4823 10.2561C13.7444 9.3382 14.5808 7.90169 14.5808 6.23116C14.5808 3.48419 12.3295 1.28833 9.51831 1.28833C6.7071 1.28833 4.45578 3.48419 4.45578 6.23116C4.45578 7.90168 5.29221 9.33819 6.55432 10.2561C2.81115 11.2033 0 14.5196 0 18.4939V22.1183C0 22.449 0.270992 22.7118 0.606779 22.7118H18.4298C18.7656 22.7118 19.0366 22.449 19.0366 22.1183V18.4939C19.0366 14.5797 16.2257 11.2045 12.4823 10.2561ZM20.9677 7.0876H23.3314C23.4985 7.0876 23.6645 7.15263 23.789 7.25794C23.9136 7.36332 24 7.51224 24 7.68103C24 8.01168 23.729 8.27448 23.3933 8.27448H21.0296V10.5805C21.0296 10.9112 20.7586 11.174 20.4228 11.174C20.087 11.174 19.8161 10.9112 19.8161 10.5805V8.27448H17.4524C17.1166 8.27448 16.8457 8.01168 16.8457 7.68103C16.8457 7.35037 17.1166 7.0876 17.4524 7.0876H19.7542V4.78156C19.7542 4.4509 20.0252 4.18814 20.3609 4.18814C20.6967 4.18814 20.9677 4.4509 20.9677 4.78156V7.0876ZM20.9179 7.1374V4.78156C20.9179 4.47953 20.6704 4.23793 20.3609 4.23793C20.0515 4.23793 19.804 4.47953 19.804 4.78156V7.1374H17.4524C17.143 7.1374 16.8954 7.379 16.8954 7.68103C16.8954 7.98306 17.143 8.22469 17.4524 8.22469H19.8659V10.5805C19.8659 10.8826 20.1134 11.1242 20.4228 11.1242C20.7322 11.1242 20.9798 10.8826 20.9798 10.5805V8.22469H23.3933C23.7027 8.22469 23.9502 7.98306 23.9502 7.68103C23.9502 7.379 23.6408 7.1374 23.3314 7.1374H20.9179Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_5630_95919", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), sR = () => /* @__PURE__ */ A(\n "svg",\n {\n width: "24",\n height: "24",\n viewBox: "0 0 24 24",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.0228 1.32873C19.6597 1.31843 19.2982 1.38077 18.9596 1.51223C18.6202 1.64398 18.3106 1.84247 18.0493 2.09589C17.788 2.34932 17.5803 2.65257 17.4384 2.98781C17.2965 3.323 17.2234 3.68325 17.2234 4.04723V6.76704H19.9372C20.6565 6.77586 21.3509 6.49986 21.8673 5.99905C22.3847 5.49736 22.6818 4.81098 22.6932 4.09046C22.7045 3.36995 22.4291 2.67455 21.9278 2.15685C21.4273 1.64003 20.742 1.34248 20.0228 1.32873ZM3.97671 1.32874C3.2575 1.34249 2.57269 1.64003 2.0722 2.15685C1.57087 2.67455 1.2955 3.36995 1.30684 4.09046C1.31818 4.81098 1.6153 5.49736 2.13266 5.99905C2.6491 6.49986 3.34289 6.77586 4.0622 6.76704L6.77652 6.76704V4.04722C6.77657 3.68325 6.70347 3.323 6.5616 2.98781C6.4197 2.65257 6.2119 2.34932 5.9506 2.09589C5.68931 1.84247 5.37979 1.64398 5.04037 1.51223C4.70172 1.38077 4.33975 1.31844 3.97671 1.32874ZM8.10935 17.2324V19.9521C8.10936 20.7525 7.8717 21.535 7.4263 22.2006C6.9809 22.8662 6.34772 23.3852 5.60669 23.6917C4.86565 23.9982 4.05018 24.0785 3.26345 23.9222C2.47671 23.7659 1.75419 23.3802 1.1872 22.814C0.620224 22.2478 0.234232 21.5266 0.0778688 20.7416C-0.0784964 19.9566 0.00175045 19.143 0.30851 18.4035C0.61527 17.664 1.13482 17.0317 1.80164 16.5868C2.46846 16.1419 3.25254 15.9044 4.05472 15.9044H6.77738V8.09564H4.05472C3.25254 8.09565 2.46846 7.85811 1.80164 7.4132C1.13482 6.96829 0.61527 6.33606 0.30851 5.59654C0.00175235 4.85703 -0.0784964 4.0433 0.0778688 3.25831C0.234232 2.47331 0.620224 1.75211 1.1872 1.18593C1.75418 0.61976 2.47669 0.234101 3.26345 0.0778289C4.0502 -0.0784442 4.86567 0.00174282 5.60669 0.308247C6.34772 0.614754 6.9809 1.13371 7.4263 1.79936C7.8717 2.465 8.10936 3.24747 8.10935 4.04782V6.7488L15.8906 6.74879V4.04782C15.8906 3.24747 16.1282 2.465 16.5736 1.79936C17.019 1.13371 17.6522 0.614754 18.3933 0.308247C19.1343 0.00174282 19.9498 -0.0784442 20.7365 0.0778289C21.5233 0.234101 22.2458 0.61976 22.8128 1.18593C23.3798 1.75211 23.7658 2.47331 23.9221 3.25831C24.0785 4.0433 23.9982 4.85703 23.6915 5.59654C23.3847 6.33606 22.8652 6.96829 22.1984 7.4132C21.5315 7.85811 20.7474 8.09565 19.9452 8.09564H17.2226V15.9044H19.9452C20.7474 15.9044 21.5315 16.1419 22.1984 16.5868C22.8652 17.0317 23.3847 17.664 23.6915 18.4035C23.9982 19.143 24.0785 19.9566 23.9221 20.7416C23.7658 21.5266 23.3798 22.2478 22.8128 22.814C22.2458 23.3802 21.5233 23.7659 20.7365 23.9222C19.9498 24.0785 19.1343 23.9982 18.3933 23.6917C17.6522 23.3852 17.019 22.8662 16.5736 22.2006C16.1282 21.535 15.8906 20.7525 15.8906 19.9521V17.2324H8.10935ZM15.8912 15.9038V8.09505H8.10871V15.9038H15.8912ZM19.9459 17.2318H17.2232V19.9517C17.2233 20.4896 17.3832 21.0155 17.6825 21.4626C17.9818 21.9097 18.407 22.258 18.9042 22.4636C19.4014 22.6692 19.9485 22.7229 20.4763 22.6181C21.004 22.5132 21.4889 22.2544 21.8697 21.8743C22.2504 21.4941 22.5098 21.0096 22.615 20.482C22.7201 19.9544 22.6662 19.4075 22.4602 18.9105C22.2541 18.4135 21.9052 17.9889 21.4576 17.6901C21.0102 17.3914 20.484 17.2319 19.9459 17.2318ZM6.77673 17.2318H4.05408C3.51599 17.2319 2.98982 17.3914 2.54234 17.6901C2.09483 17.9889 1.74589 18.4135 1.53983 18.9105C1.33376 19.4075 1.27987 19.9544 1.38501 20.482C1.49016 21.0096 1.74959 21.4941 2.13031 21.8743C2.51103 22.2544 2.99596 22.5132 3.52372 22.6181C4.05148 22.7229 4.59853 22.6692 5.09575 22.4636C5.593 22.258 6.01819 21.9097 6.31746 21.4626C6.61674 21.0155 6.77661 20.4896 6.77673 19.9517V17.2318Z",\n fill: "black"\n }\n )\n }\n), lR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M22.3334 4.58963C22.7014 4.58963 23 4.28821 23 3.91581C23 3.54342 22.7014 3.242 22.3334 3.242H18.3181C18.3052 3.242 18.2927 3.24514 18.2803 3.24559C18.2585 3.24694 18.2367 3.24874 18.2154 3.25233C18.2056 3.25413 18.1941 3.25323 18.1843 3.25548C18.1772 3.25682 18.1719 3.26132 18.1647 3.26311C18.1012 3.27839 18.0403 3.30175 17.983 3.33544C17.9736 3.34083 17.9665 3.34667 17.9576 3.35251C17.9048 3.3871 17.8559 3.42842 17.8128 3.47918C17.8092 3.48323 17.8052 3.48637 17.8025 3.48996C17.8008 3.49221 17.7985 3.49356 17.7968 3.4958C17.7554 3.54836 17.7261 3.60631 17.7025 3.66561C17.6981 3.67684 17.6932 3.68762 17.6897 3.69974C17.6674 3.76533 17.6563 3.83226 17.6545 3.90009C17.6545 3.90548 17.6519 3.90998 17.6519 3.91581L17.6523 7.96363C17.6523 8.33603 17.951 8.63745 18.319 8.63745C18.6869 8.63745 18.9856 8.33558 18.9856 7.96363L18.9851 5.47681C20.6108 7.26242 21.5112 9.55833 21.5112 11.9998C21.5112 17.322 17.227 21.6519 11.962 21.6519C11.0501 21.6519 10.1483 21.5221 9.28172 21.267C8.92885 21.1623 8.55821 21.368 8.4551 21.7247C8.352 22.0823 8.55465 22.4565 8.90841 22.5602C9.89635 22.8518 10.9238 23 11.9624 23C17.963 23 22.8449 18.0654 22.8449 12.0002C22.8449 9.23175 21.8392 6.6205 20.0037 4.59008H22.3334V4.58963ZM5.68194 15.3617C5.31352 15.3617 5.01531 15.6635 5.01531 16.0355L5.01576 18.6094C3.33941 16.8126 2.41191 14.4803 2.41191 11.9998C2.41191 6.67755 6.69566 2.34763 11.9611 2.34763C12.8731 2.34763 13.7748 2.47745 14.641 2.73305C14.9934 2.83771 15.3649 2.63242 15.4676 2.27485C15.5707 1.91773 15.368 1.54354 15.0147 1.43933C14.0263 1.14779 12.9993 1 11.9607 1C5.96014 1 1.07822 5.93456 1.07822 11.9998C1.07822 14.7682 2.08393 17.3799 3.91893 19.4099H1.66663C1.2982 19.4099 1 19.7118 1 20.0837C1 20.4557 1.2982 20.7576 1.66663 20.7576H5.68194C6.05036 20.7576 6.34856 20.4557 6.34856 20.0837L6.34812 16.0355C6.34856 15.6635 6.04992 15.3617 5.68194 15.3617Z",\n fill: "currentcolor"\n }\n) }), cR = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M6.6 15.6C6.4 15.4 6.2 15.3 5.9 15.3C5.4 15.3 4.9 15.7 4.9 16.3V18.1C3.6 16.4 2.9 14.4 2.9 12.3C2.9 7.1 7.1 2.9 12.2 2.9C13.1 2.9 13.1 2.9 13.6 3C13.7 3 13.8 3 13.9 3C14.3 3 14.7 2.7 14.8 2.3C14.9 1.8 14.7 1.2 14.2 1.1C13.3 1 13.3 1 12.2 1C6.1 1 1.1 6.1 1.1 12.3C1.1 14.9 2 17.4 3.6 19.4H2C1.5 19.4 1 19.8 1 20.4C1 21 1.4 21.4 2 21.4H6C6.5 21.4 7 21 7 20.4V16.4C6.9 16.1 6.8 15.8 6.6 15.6Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.6 5.2C23.1 5.2 23.6 4.8 23.6 4.2C23.6 3.6 23.2 3.2 22.6 3.2H18.3C18.2 3.2 18.1 3.3 18 3.3C17.9 3.4 17.9 3.4 17.8 3.5C17.7 3.6 17.7 3.6 17.6 3.8C17.5822 3.83567 17.5 4 17.5 4.1V8.1C17.5 8.6 17.9 9.1 18.5 9.1C19 9.1 19.4 8.7 19.4 8.1V6.5C20.7 8.1 21.4 10.2 21.4 12.2C21.4 17.4 17.2 21.6 12.1 21.6C11.2 21.6 11.2 21.6 10.5 21.5C10.4 21.5 10.3 21.5 10.2 21.5C9.8 21.5 9.4 21.8 9.3 22.2C9.2 22.7 9.4 23.3 9.9 23.4C10.8 23.6 10.9 23.6 12 23.6C18.2 23.6 23.2 18.5 23.2 12.3C23.2 9.7 22.3 7.2 20.7 5.2H22.6Z",\n fill: "currentcolor"\n }\n )\n] }), pR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M3.36906 6.95498L7.80975 5.88657C8.13925 5.8073 8.47062 6.01014 8.5499 6.33964C8.62917 6.66913 8.42633 7.00051 8.09683 7.07978L2.19372 8.50005C1.7511 8.60654 1.32444 8.27366 1.32009 7.81842L1.26346 1.89297C1.26022 1.55408 1.53231 1.27674 1.8712 1.2735C2.21008 1.27026 2.48742 1.54235 2.49066 1.88124L2.52987 5.98346C5.69861 1.12513 12.1519 -0.459927 17.2359 2.4753C22.4962 5.51235 24.2985 12.2387 21.2615 17.4991C18.2244 22.7594 11.4981 24.5617 6.23772 21.5247C5.94422 21.3552 5.84367 20.9799 6.01312 20.6864C6.18257 20.3929 6.55786 20.2924 6.85135 20.4618C11.5247 23.16 17.5005 21.5588 20.1987 16.8854C22.8968 12.2121 21.2956 6.2363 16.6223 3.53814C12.0025 0.870916 6.10999 2.40503 3.36906 6.95498Z",\n fill: "currentcolor"\n }\n) }), dR = () => /* @__PURE__ */ c1(\n "svg",\n {\n xmlns: "http://www.w3.org/2000/svg",\n width: "14",\n height: "15",\n viewBox: "0 0 14 15",\n fill: "none",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M1.37248 3.88264L4.2681 3.18597C4.48293 3.13428 4.69898 3.26654 4.75067 3.48136C4.80235 3.69619 4.6701 3.91224 4.45528 3.96393L0.606536 4.88992C0.317952 4.95935 0.0397803 4.74231 0.0369435 4.44551L1.86599e-05 0.582202C-0.00209312 0.361255 0.175308 0.18043 0.396255 0.178318C0.617202 0.176206 0.798027 0.353608 0.800139 0.574555L0.825698 3.24868C2.89178 0.0814929 7.09899 -0.951745 10.4135 0.96188C13.8431 2.942 15.0182 7.32749 13.0381 10.7572C11.058 14.1868 6.67251 15.3619 3.24285 13.3818C3.05149 13.2713 2.98593 13.0266 3.09641 12.8353C3.20689 12.6439 3.45157 12.5784 3.64293 12.6888C6.68988 14.448 10.586 13.404 12.3452 10.3571C14.1043 7.31012 13.0604 3.414 10.0134 1.65484C7.00137 -0.0841658 3.1595 0.916084 1.37248 3.88264Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M10.3396 6.82481H7.17945V3.66472C7.17945 3.48099 7.03246 3.33401 6.84873 3.33401C6.66501 3.33401 6.51803 3.48099 6.51803 3.66472V7.19227C6.51803 7.37599 6.66501 7.52297 6.84873 7.52297H10.3763C10.56 7.52297 10.707 7.37599 10.707 7.19227C10.707 7.00854 10.5233 6.82481 10.3396 6.82481Z",\n fill: "currentcolor"\n }\n )\n ]\n }\n), AR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 25 25", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.98981 24.781C1.44254 24.781 0.998893 24.3373 0.998893 23.7901V1.98992C0.998893 1.44265 1.44254 0.999 1.98981 0.999H23.79C24.3372 0.999 24.7809 1.44265 24.7809 1.98992V23.7901C24.7809 24.3373 24.3372 24.781 23.79 24.781H1.98981ZM1.98981 7.93542V1.98992H23.79V7.93542H1.98981ZM1.98981 8.92633H23.79V15.8627H1.98981V8.92633ZM1.98981 23.7901V16.8537H23.79V23.7901H1.98981Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.98981 24.89C1.38234 24.89 0.889893 24.3975 0.889893 23.7901V1.98992C0.889893 1.38245 1.38234 0.889999 1.98981 0.889999H23.79C24.3974 0.889999 24.8899 1.38245 24.8899 1.98992V23.7901C24.8899 24.3975 24.3974 24.89 23.79 24.89H1.98981ZM1.98981 7.93542V1.98992H23.79V7.93542H1.98981ZM23.681 7.82642V2.09892H2.09881V7.82642H23.681ZM1.98981 8.92633H23.79V15.8627H1.98981V8.92633ZM2.09881 15.7537H23.681V9.03533H2.09881V15.7537ZM1.98981 23.7901V16.8537H23.79V23.7901H1.98981ZM23.681 23.6811V16.9627H2.09881V23.6811H23.681ZM0.998893 23.7901C0.998893 24.3373 1.44254 24.781 1.98981 24.781H23.79C24.3372 24.781 24.7809 24.3373 24.7809 23.7901V1.98992C24.7809 1.44265 24.3372 0.999 23.79 0.999H1.98981C1.44254 0.999 0.998893 1.44265 0.998893 1.98992V23.7901Z",\n fill: "currentColor"\n }\n )\n] }), uR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M24 4.9V1.2C24 0.500001 23.5 9.74764e-07 22.8 9.44166e-07L1.2 0C0.600002 -2.62268e-08 9.74764e-07 0.5 9.44166e-07 1.2L7.78063e-07 5C7.51836e-07 5.6 0.500001 6.2 1.2 6.2L22.8 6.2C23.5 6.1 24 5.6 24 4.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M24 13.9V10.1C24 9.5 23.5 9 22.8 9L1.2 9C0.600001 9 5.81362e-07 9.5 5.50764e-07 10.2L3.8466e-07 14C3.58433e-07 14.6 0.500001 15.2 1.2 15.2L22.8 15.2C23.5 15 24 14.5 24 13.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M24 22.8V19C24 18.4 23.5 17.8 22.8 17.8H1.2C0.600001 17.8 1.96701e-07 18.3 1.66103e-07 19L0 22.8C-2.62268e-08 23.4 0.500001 24 1.2 24H22.8C23.5 24 24 23.5 24 22.8Z",\n fill: "currentColor"\n }\n )\n] }), bR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M10.0212 13.3371C10.607 12.9458 11.2956 12.7369 12 12.7369C12.9446 12.7369 13.8506 13.1121 14.5185 13.7801C15.1865 14.448 15.5617 15.3539 15.5617 16.2986C15.5617 17.003 15.3528 17.6916 14.9615 18.2773C14.5701 18.8631 14.0138 19.3196 13.363 19.5891C12.7122 19.8587 11.9961 19.9293 11.3052 19.7918C10.6143 19.6544 9.97964 19.3152 9.48152 18.8171C8.98341 18.319 8.64419 17.6843 8.50676 16.9934C8.36933 16.3025 8.43987 15.5864 8.70944 14.9356C8.97902 14.2848 9.43553 13.7285 10.0212 13.3371ZM10.5671 18.4431C10.9913 18.7265 11.4899 18.8777 12 18.8777C12.3399 18.8818 12.6771 18.8179 12.9919 18.6898C13.3066 18.5616 13.5926 18.3718 13.8329 18.1315C14.0733 17.8912 14.2631 17.6052 14.3912 17.2904C14.5194 16.9756 14.5833 16.6384 14.5792 16.2986C14.5792 15.7885 14.4279 15.2898 14.1445 14.8657C13.8611 14.4415 13.4583 14.111 12.987 13.9157C12.5157 13.7205 11.9972 13.6695 11.4968 13.769C10.9965 13.8685 10.537 14.1141 10.1763 14.4748C9.81558 14.8355 9.56994 15.2951 9.47042 15.7954C9.3709 16.2957 9.42198 16.8143 9.61719 17.2856C9.8124 17.7568 10.143 18.1597 10.5671 18.4431Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.4479 0.14817C18.5762 0.153233 18.6974 0.20834 18.7856 0.301691L23.6983 5.21437C23.7917 5.30256 23.8468 5.42379 23.8518 5.55211V22.1324C23.8439 22.5859 23.6602 23.0187 23.3395 23.3395C23.0187 23.6603 22.5859 23.8439 22.1324 23.8518H1.86761C1.41405 23.8439 0.981271 23.6603 0.660508 23.3395C0.339746 23.0187 0.15606 22.5859 0.14817 22.1324V1.86761C0.15606 1.41405 0.339746 0.981272 0.660508 0.66051C0.981271 0.339747 1.41405 0.15606 1.86761 0.14817H18.4479ZM5.93387 1.1307C5.82477 1.1307 5.73634 1.21914 5.73634 1.32824V8.54782C5.73634 8.65691 5.82477 8.74535 5.93387 8.74535H16.838C16.9471 8.74535 17.0355 8.65691 17.0355 8.54782V1.32824C17.0355 1.21914 16.9471 1.1307 16.838 1.1307H5.93387ZM22.8693 22.1324V5.84886C22.8693 5.79647 22.8485 5.74623 22.8114 5.70919L18.3552 1.25298C18.2308 1.12854 18.018 1.21668 18.018 1.39266V9.23662C18.018 9.36691 17.9663 9.49187 17.8741 9.584C17.782 9.67613 17.6571 9.72789 17.5268 9.72789H5.24507C5.11478 9.72789 4.98982 9.67613 4.89769 9.584C4.80556 9.49187 4.7538 9.36691 4.7538 9.23662V1.32824C4.7538 1.21914 4.66537 1.1307 4.55627 1.1307H1.86761C1.76968 1.12635 1.67191 1.14242 1.58053 1.17791C1.48915 1.2134 1.40617 1.26753 1.33685 1.33685C1.26753 1.40616 1.21341 1.48915 1.17792 1.58053C1.14243 1.67191 1.12635 1.76968 1.1307 1.86761V22.1324C1.12635 22.2303 1.14243 22.3281 1.17792 22.4195C1.21341 22.5108 1.26753 22.5938 1.33685 22.6632C1.40617 22.7325 1.48915 22.7866 1.58053 22.8221C1.67191 22.8576 1.76968 22.8737 1.86761 22.8693H22.1324C22.2303 22.8737 22.3281 22.8576 22.4195 22.8221C22.5108 22.7866 22.5938 22.7325 22.6631 22.6632C22.7325 22.5938 22.7866 22.5108 22.8221 22.4195C22.8576 22.3281 22.8737 22.2303 22.8693 22.1324Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.4479 0.14817C18.5762 0.153233 18.6974 0.20834 18.7856 0.301691L23.6983 5.21437C23.7917 5.30256 23.8468 5.42379 23.8518 5.55211V22.1324C23.8439 22.5859 23.6602 23.0187 23.3395 23.3395C23.0187 23.6603 22.5859 23.8439 22.1324 23.8518H1.86761C1.41405 23.8439 0.981271 23.6603 0.660508 23.3395C0.339746 23.0187 0.15606 22.5859 0.14817 22.1324V1.86761C0.15606 1.41405 0.339746 0.981272 0.660508 0.66051C0.981271 0.339747 1.41405 0.15606 1.86761 0.14817H18.4479ZM23.8017 5.10821C23.9222 5.22287 23.9933 5.38 23.9999 5.54627L24.0001 5.55211L24 22.135C23.9914 22.6269 23.7922 23.0963 23.4442 23.4442C23.0963 23.7922 22.6269 23.9914 22.135 24L22.1324 24L1.86503 24C1.37308 23.9914 0.903667 23.7922 0.555752 23.4442C0.207837 23.0963 0.00860242 22.6269 4.48285e-05 22.135L0 22.1324L2.24142e-05 1.86503C0.00858001 1.37308 0.207837 0.903668 0.555752 0.555753C0.903667 0.207838 1.37308 0.00860242 1.86503 4.48285e-05L1.86761 0L18.4537 2.24142e-05C18.62 0.00658211 18.7771 0.0778192 18.8918 0.198348L23.8017 5.10821ZM22.7211 22.1324V5.84886C22.7211 5.83577 22.7159 5.8232 22.7067 5.81394L18.2505 1.35774C18.2194 1.32663 18.1662 1.34866 18.1662 1.39266V9.23662C18.1662 9.4062 18.0988 9.56884 17.9789 9.68875C17.859 9.80867 17.6963 9.87603 17.5268 9.87603H5.24507C5.07549 9.87603 4.91285 9.80867 4.79293 9.68875C4.67302 9.56884 4.60565 9.4062 4.60565 9.23662V1.32824C4.60565 1.30096 4.58355 1.27885 4.55627 1.27885H1.86101C1.78363 1.27541 1.70637 1.28797 1.63417 1.31601C1.56196 1.34406 1.49638 1.38683 1.4416 1.4416C1.38683 1.49638 1.34406 1.56196 1.31601 1.63417C1.28797 1.70638 1.27526 1.78363 1.27871 1.86102L1.279 1.86761L1.27885 22.139C1.27541 22.2164 1.28797 22.2936 1.31601 22.3658C1.34406 22.438 1.38683 22.5036 1.4416 22.5584C1.49638 22.6132 1.56196 22.6559 1.63416 22.684L1.58053 22.8221C1.48915 22.7866 1.40617 22.7325 1.33685 22.6632C1.26753 22.5938 1.21341 22.5108 1.17792 22.4195C1.14243 22.3281 1.12635 22.2303 1.1307 22.1324V1.86761C1.12635 1.76968 1.14243 1.67191 1.17792 1.58053C1.21341 1.48915 1.26753 1.40616 1.33685 1.33685C1.40617 1.26753 1.48915 1.2134 1.58053 1.17791C1.67191 1.14242 1.76968 1.12635 1.86761 1.1307H4.55627C4.66537 1.1307 4.7538 1.21914 4.7538 1.32824V9.23662C4.7538 9.36691 4.80556 9.49187 4.89769 9.584C4.98982 9.67613 5.11478 9.72789 5.24507 9.72789H17.5268C17.6571 9.72789 17.782 9.67613 17.8741 9.584C17.9663 9.49187 18.018 9.36691 18.018 9.23662V1.39266C18.018 1.21668 18.2308 1.12854 18.3552 1.25298L22.8114 5.70919C22.8485 5.74623 22.8693 5.79647 22.8693 5.84886V22.1324C22.8737 22.2303 22.8576 22.3281 22.8221 22.4195C22.7866 22.5108 22.7325 22.5938 22.6631 22.6632C22.5938 22.7325 22.5108 22.7866 22.4195 22.8221C22.3281 22.8576 22.2303 22.8737 22.1324 22.8693H1.86761C1.76968 22.8737 1.67191 22.8576 1.58053 22.8221L1.63416 22.684C1.70637 22.712 1.78363 22.7247 1.86102 22.7213L1.86761 22.721L22.139 22.7211C22.2164 22.7246 22.2936 22.712 22.3658 22.684C22.438 22.6559 22.5036 22.6132 22.5584 22.5584C22.6132 22.5036 22.6559 22.438 22.684 22.3658C22.712 22.2936 22.7247 22.2164 22.7213 22.139L22.7211 22.1324ZM12 18.7296H12.0018C12.3219 18.7335 12.6395 18.6733 12.936 18.5526C13.2325 18.4319 13.5018 18.2531 13.7282 18.0267C13.9545 17.8004 14.1333 17.531 14.254 17.2346C14.3747 16.9381 14.4349 16.6204 14.431 16.3004L14.431 16.2986C14.431 15.8178 14.2884 15.3478 14.0213 14.948C13.7542 14.5482 13.3745 14.2366 12.9303 14.0526C12.4861 13.8686 11.9973 13.8205 11.5258 13.9143C11.0542 14.0081 10.621 14.2396 10.281 14.5796C9.94106 14.9196 9.70952 15.3527 9.61572 15.8243C9.52192 16.2959 9.57006 16.7847 9.75406 17.2289C9.93806 17.6731 10.2496 18.0528 10.6494 18.3199C11.0492 18.587 11.5192 18.7296 12 18.7296ZM5.93387 8.5972H16.838C16.8652 8.5972 16.8873 8.5751 16.8873 8.54782V1.32824C16.8873 1.30096 16.8652 1.27885 16.838 1.27885H5.93387C5.90659 1.27885 5.88448 1.30096 5.88448 1.32824V8.54782C5.88448 8.5751 5.90659 8.5972 5.93387 8.5972ZM9.93894 13.214C10.549 12.8063 11.2663 12.5887 12 12.5887C12.9839 12.5887 13.9275 12.9796 14.6233 13.6753C15.319 14.371 15.7099 15.3147 15.7099 16.2986C15.7099 17.0323 15.4923 17.7496 15.0846 18.3596C14.677 18.9697 14.0976 19.4452 13.4197 19.726C12.7418 20.0068 11.9959 20.0803 11.2763 19.9371C10.5566 19.794 9.8956 19.4407 9.37677 18.9218C8.85794 18.403 8.50461 17.742 8.36146 17.0223C8.21832 16.3027 8.29179 15.5568 8.57257 14.8789C8.85336 14.201 9.32886 13.6216 9.93894 13.214ZM5.73634 1.32824C5.73634 1.21914 5.82477 1.1307 5.93387 1.1307H16.838C16.9471 1.1307 17.0355 1.21914 17.0355 1.32824V8.54782C17.0355 8.65691 16.9471 8.74535 16.838 8.74535H5.93387C5.82477 8.74535 5.73634 8.65691 5.73634 8.54782V1.32824ZM12 12.7369C11.2956 12.7369 10.607 12.9458 10.0212 13.3371C9.43553 13.7285 8.97902 14.2848 8.70944 14.9356C8.43987 15.5864 8.36933 16.3025 8.50676 16.9934C8.64419 17.6843 8.98341 18.319 9.48152 18.8171C9.97964 19.3152 10.6143 19.6544 11.3052 19.7918C11.9961 19.9293 12.7122 19.8587 13.363 19.5891C14.0138 19.3196 14.5701 18.8631 14.9615 18.2773C15.3528 17.6916 15.5617 17.003 15.5617 16.2986C15.5617 15.3539 15.1865 14.448 14.5185 13.7801C13.8506 13.1121 12.9446 12.7369 12 12.7369ZM12 18.8777C11.4899 18.8777 10.9913 18.7265 10.5671 18.4431C10.143 18.1597 9.8124 17.7568 9.61719 17.2856C9.42198 16.8143 9.3709 16.2957 9.47042 15.7954C9.56994 15.2951 9.81558 14.8355 10.1763 14.4748C10.537 14.1141 10.9965 13.8685 11.4968 13.769C11.9972 13.6695 12.5157 13.7205 12.987 13.9157C13.4583 14.111 13.8611 14.4415 14.1445 14.8657C14.4279 15.2898 14.5792 15.7885 14.5792 16.2986C14.5833 16.6384 14.5194 16.9756 14.3912 17.2904C14.2631 17.6052 14.0733 17.8912 13.8329 18.1315C13.5926 18.3718 13.3066 18.5616 12.9919 18.6898C12.6771 18.8179 12.3399 18.8818 12 18.8777Z",\n fill: "currentcolor"\n }\n )\n] }), hR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.8 5.1L18.9 0.2C18.8 0.1 18.6 0 18.5 0H1.9C1.4 0 0.9 0.2 0.6 0.6C0.2 0.9 0 1.4 0 1.9V22.2C0 22.7 0.2 23.2 0.6 23.5C0.9 23.8 1.4 24 1.9 24H22.2C22.7 24 23.2 23.8 23.5 23.4C23.8 23.1 24 22.6 24.1 22.1V5.6C24 5.4 23.9 5.2 23.8 5.1ZM14.4 17.3C14.3 17.6 14.1 17.9 13.8 18.1C13.5 18.3 13.3 18.5 13 18.7C12.7 18.8 12.4 18.9 12 18.9C11.5 18.9 11 18.8 10.6 18.5C10.2 18.2 9.8 17.8 9.6 17.3C9.4 16.8 9.4 16.3 9.4 15.8C9.5 15.3 9.8 14.8 10.1 14.5C10.4 14.2 10.9 13.9 11.4 13.8C11.9 13.7 12.4 13.8 12.9 13.9C13.4 14.1 13.8 14.4 14.1 14.9C14.4 15.3 14.5 15.8 14.5 16.3C14.6 16.6 14.5 17 14.4 17.3ZM17 8.6C17 8.7 16.9 8.8 16.8 8.8H5.8L5.7 8.7V1.3C5.7 1.2 5.8 1.1 5.9 1.1H16.8C17 1.1 17 1.2 17 1.3V8.6Z",\n fill: "currentcolor"\n }\n) }), MR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 26 26", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.54301 4.75879C8.54301 6.84568 6.84838 8.54031 4.76149 8.54031C2.6746 8.54031 0.97998 6.84568 0.97998 4.75879C0.97998 2.6719 2.6746 0.97728 4.76149 0.97728C6.84838 0.97728 8.54301 2.6719 8.54301 4.75879ZM1.02029 17.4597H8.58332V25.0227H1.02029V17.4597ZM21.1984 25.0227C23.2853 25.0227 24.98 23.3281 24.98 21.2412C24.98 19.1538 23.2853 17.4597 21.1984 17.4597C19.1116 17.4597 17.4169 19.1538 17.4169 21.2412C17.4169 23.3281 19.1116 25.0227 21.1984 25.0227ZM21.2414 0.979721L25.0204 4.75871L21.2414 8.5377L17.4624 4.75871L21.2414 0.979721ZM12.9109 19.253L12.8882 19.2505L12.865 19.2495L12.8423 19.249L12.8191 19.25L12.7964 19.2515L12.7733 19.2546L12.7506 19.2586L12.7279 19.2636L12.7052 19.2702L12.683 19.2772L12.6608 19.2858L12.6391 19.2954L12.6175 19.3065L12.5963 19.3181L12.5756 19.3312L10.5054 20.7056L10.4857 20.7193L10.4675 20.7339L10.4499 20.749L10.4333 20.7651L10.4196 20.7798L10.4186 20.7803L10.401 20.7898L10.3838 20.7999L10.3672 20.811L10.3511 20.8221L10.3354 20.8342L10.3198 20.8468L10.3052 20.8599L10.2911 20.8735L10.2775 20.8882L10.2639 20.9028L10.2512 20.9179L10.2396 20.934L10.2281 20.9502L10.217 20.9668L10.2069 20.984L10.1973 21.0016L10.1887 21.0193L10.1807 21.0374L10.1731 21.0566L10.166 21.0752L10.16 21.0949L10.1549 21.1146L10.1504 21.1342L10.1469 21.1549L10.1439 21.1751L10.1418 21.1962L10.1403 21.2169L10.1398 21.2386L10.1403 21.2598L10.1418 21.2804L10.1439 21.3016L10.1469 21.3218L10.1504 21.3425L10.1549 21.3621L10.16 21.3818L10.166 21.4014L10.1731 21.4206L10.1807 21.4393L10.1887 21.4574L10.1973 21.4751L10.2069 21.4927L10.217 21.5098L10.2281 21.5265L10.2396 21.5426L10.2512 21.5588L10.2639 21.5739L10.2775 21.5885L10.2911 21.6031L10.3052 21.6167L10.3198 21.6298L10.3354 21.6425L10.3511 21.6546L10.3672 21.6661L10.3838 21.6767L10.401 21.6868L10.4121 21.6929L10.4176 21.6999L10.4333 21.7166L10.4499 21.7327L10.4675 21.7478L10.4857 21.7625L10.5054 21.7761L12.5756 23.1505L12.5963 23.1636L12.6175 23.1752L12.6391 23.1863L12.6608 23.1959L12.683 23.2045L12.7052 23.2115L12.7279 23.2181L12.7506 23.2231L12.7733 23.2272L12.7964 23.2302L12.8191 23.2317L12.8423 23.2327H12.865L12.8882 23.2312L12.9109 23.2287L12.9336 23.2251L12.9563 23.2206L12.9785 23.2151L13.0001 23.2085L13.0218 23.2009L13.0435 23.1924L13.0642 23.1828L13.0849 23.1722L13.105 23.1606L13.1247 23.148L13.1433 23.1344L13.162 23.1198L13.1801 23.1046L13.1973 23.088L13.2134 23.0704L13.2296 23.0522L13.2447 23.0325L13.3117 22.9418L13.3254 22.9226L13.3375 22.9025L13.3491 22.8823L13.3591 22.8616L13.3677 22.8404L13.3758 22.8193L13.3823 22.7976L13.3879 22.7759L13.3924 22.7542L13.3954 22.732L13.3975 22.7098L13.3985 22.6877V22.6655L13.3975 22.6438L13.3954 22.6216L13.3919 22.5999L13.3879 22.5783L13.3823 22.5571L13.3758 22.5359L13.3682 22.5152L13.3596 22.4946L13.3501 22.4744L13.3395 22.4547L13.3279 22.4361L13.3153 22.4174L13.3017 22.3993L13.287 22.3821L13.2714 22.365L13.2553 22.3493L13.2376 22.3337L13.219 22.3196L13.1998 22.306L12.3684 21.7539H15.6749L15.6961 21.7534L15.7168 21.7524L15.738 21.7504L15.7581 21.7473L15.7788 21.7433L15.7985 21.7388L15.8181 21.7337L15.8378 21.7277L15.8569 21.7211L15.8756 21.7135L15.8938 21.7055L15.9119 21.6964L15.929 21.6868L15.9462 21.6767L15.9628 21.6661L15.9795 21.6546L15.9951 21.6425L16.0102 21.6298L16.0248 21.6167L16.0395 21.6031L16.0531 21.5885L16.0662 21.5739L16.0788 21.5588L16.0909 21.5426L16.1025 21.5265L16.1131 21.5098L16.1232 21.4927L16.1327 21.4751L16.1418 21.4574L16.1499 21.4393L16.1575 21.4206L16.164 21.4014L16.1701 21.3818L16.1751 21.3621L16.1796 21.3425L16.1837 21.3218L16.1867 21.3016L16.1887 21.2804L16.1897 21.2598L16.1902 21.2386L16.1897 21.2169L16.1887 21.1962L16.1867 21.1751L16.1837 21.1549L16.1796 21.1342L16.1751 21.1146L16.1701 21.0949L16.164 21.0752L16.1575 21.0566L16.1499 21.0374L16.1418 21.0193L16.1327 21.0016L16.1232 20.984L16.1131 20.9668L16.1025 20.9502L16.0909 20.934L16.0788 20.9179L16.0662 20.9028L16.0531 20.8882L16.0395 20.8735L16.0248 20.8599L16.0102 20.8468L15.9951 20.8342L15.9795 20.8221L15.9628 20.811L15.9462 20.7999L15.929 20.7898L15.9119 20.7803L15.8938 20.7712L15.8756 20.7631L15.8569 20.7556L15.8378 20.749L15.8181 20.743L15.7985 20.7379L15.7788 20.7334L15.7581 20.7293L15.738 20.7263L15.7168 20.7243L15.6961 20.7233L15.6749 20.7228H12.3759L13.1993 20.1757L13.219 20.1621L13.2376 20.148L13.2548 20.1324L13.2714 20.1167L13.287 20.0996L13.3017 20.0825L13.3153 20.0643L13.3279 20.0462L13.3395 20.027L13.3501 20.0073L13.3596 19.9872L13.3682 19.967L13.3758 19.9458L13.3823 19.9251L13.3879 19.9035L13.3919 19.8818L13.3954 19.8601L13.3975 19.8384L13.3985 19.8162V19.7941L13.3975 19.7719L13.3954 19.7497L13.3924 19.728L13.3879 19.7058L13.3823 19.6841L13.3758 19.6625L13.3677 19.6413L13.3591 19.6201L13.3491 19.5994L13.3375 19.5793L13.3254 19.5591L13.3117 19.5399L13.2447 19.4492L13.2296 19.4295L13.2139 19.4114L13.1973 19.3937L13.1801 19.3776L13.162 19.3619L13.1438 19.3473L13.1247 19.3337L13.105 19.3211L13.0849 19.3095L13.0642 19.2989L13.0435 19.2893L13.0218 19.2808L13.0001 19.2732L12.9785 19.2667L12.9563 19.2611L12.9336 19.2566L12.9109 19.253ZM13.5341 2.76961L13.5568 2.77264L13.58 2.77667L13.6027 2.78171L13.6249 2.78776L13.6475 2.79533L13.6692 2.8039L13.6914 2.81348L13.7126 2.82407L13.7338 2.83617L13.7544 2.84928L15.8252 4.22322L15.8443 4.23684L15.863 4.25146L15.8806 4.26659L15.8968 4.28272L15.9109 4.29785H15.9119L15.929 4.30743L15.9462 4.31802L15.9628 4.3286L15.9795 4.3402L15.9951 4.3523L16.0102 4.36491L16.0248 4.37801L16.0395 4.39163L16.0531 4.40575L16.0662 4.42037L16.0788 4.436L16.0909 4.45163L16.1025 4.46776L16.1131 4.4844L16.1232 4.50154L16.1327 4.51919L16.1418 4.53734L16.1499 4.55549L16.1575 4.57415L16.164 4.59331L16.1701 4.61247L16.1751 4.63213L16.1796 4.6523L16.1837 4.67247L16.1867 4.69314L16.1887 4.71381L16.1897 4.73499L16.1902 4.75617L16.1897 4.77734L16.1887 4.79852L16.1867 4.81919L16.1837 4.83986L16.1796 4.86003L16.1751 4.8802L16.1701 4.89986L16.164 4.91902L16.1575 4.93818L16.1499 4.95684L16.1418 4.97499L16.1327 4.99314L16.1232 5.01079L16.1131 5.02793L16.1025 5.04457L16.0909 5.0607L16.0788 5.07633L16.0662 5.09196L16.0531 5.10659L16.0395 5.1207L16.0248 5.13432L16.0102 5.14743L15.9951 5.16003L15.9795 5.17213L15.9628 5.18373L15.9462 5.19432L15.929 5.20491L15.9185 5.21045L15.9124 5.21751L15.8968 5.23415L15.8801 5.25028L15.863 5.26541L15.8443 5.28003L15.8247 5.29365L13.7544 6.6681L13.7338 6.68121L13.7126 6.69331L13.6914 6.7039L13.6697 6.71348L13.6475 6.72205L13.6249 6.72961L13.6027 6.73566L13.58 6.7407L13.5568 6.74474L13.5341 6.74776L13.5109 6.74978L13.4882 6.75079L13.465 6.75028L13.4423 6.74877L13.4191 6.74675L13.3964 6.74323L13.3743 6.73869L13.3521 6.73314L13.3299 6.72659L13.3082 6.71902L13.287 6.71045L13.2659 6.70087L13.2452 6.69028L13.2255 6.67869L13.2059 6.66608L13.1867 6.65247L13.168 6.63785L13.1504 6.62222L13.1333 6.60558L13.1166 6.58844L13.101 6.56978L13.0859 6.55062L13.0188 6.45986L13.0052 6.4402L12.9926 6.42054L12.9815 6.39986L12.9714 6.37919L12.9623 6.35852L12.9548 6.33684L12.9477 6.31566L12.9427 6.29348L12.9381 6.2718L12.9346 6.24961L12.9326 6.22793L12.9316 6.20575V6.18356L12.9326 6.16138L12.9351 6.1397L12.9381 6.11751L12.9427 6.09583L12.9482 6.07465L12.9543 6.05348L12.9618 6.0328L12.9704 6.01213L12.98 5.99247L12.9906 5.97281L13.0022 5.95365L13.0148 5.93499L13.0284 5.91734L13.043 5.8997L13.0586 5.88306L13.0753 5.86692L13.0929 5.8518L13.1111 5.83717L13.1307 5.82356L13.9617 5.27196H10.6556L10.6344 5.27146L10.6133 5.26995L10.5926 5.26793L10.5719 5.26491L10.5517 5.26138L10.5316 5.25684L10.5119 5.25129L10.4928 5.24524L10.4736 5.23869L10.4549 5.23112L10.4363 5.22306L10.4186 5.21398L10.401 5.20491L10.3838 5.19432L10.3672 5.18373L10.3511 5.17213L10.3354 5.16003L10.3198 5.14743L10.3052 5.13432L10.2911 5.1207L10.2775 5.10659L10.2639 5.09196L10.2512 5.07633L10.2396 5.0607L10.2281 5.04457L10.217 5.02793L10.2069 5.01079L10.1973 4.99314L10.1887 4.97499L10.1807 4.95684L10.1731 4.93818L10.166 4.91902L10.16 4.89986L10.1549 4.8802L10.1504 4.86003L10.1469 4.83986L10.1439 4.81919L10.1418 4.79852L10.1403 4.77734L10.1398 4.75617L10.1403 4.73499L10.1418 4.71381L10.1439 4.69314L10.1469 4.67247L10.1504 4.6523L10.1549 4.63213L10.16 4.61247L10.166 4.59331L10.1731 4.57415L10.1807 4.55549L10.1887 4.53734L10.1973 4.51919L10.2069 4.50154L10.217 4.4844L10.2281 4.46776L10.2396 4.45163L10.2512 4.436L10.2639 4.42037L10.2775 4.40575L10.2911 4.39163L10.3052 4.37801L10.3198 4.36491L10.3354 4.3523L10.3511 4.3402L10.3672 4.3286L10.3838 4.31802L10.401 4.30743L10.4186 4.29785L10.4363 4.28928L10.4549 4.28121L10.4736 4.27364L10.4928 4.26659L10.5119 4.26104L10.5316 4.25549L10.5517 4.25096L10.5719 4.24743L10.5926 4.2444L10.6133 4.24238L10.6344 4.24087L10.6556 4.24037H13.9546L13.1307 3.69381L13.1111 3.6802L13.0929 3.66558L13.0753 3.65045L13.0586 3.63432L13.043 3.61768L13.0284 3.60054L13.0148 3.58238L13.0022 3.56373L12.9906 3.54457L12.98 3.52491L12.9704 3.50524L12.9618 3.48457L12.9543 3.4639L12.9482 3.44272L12.9427 3.42154L12.9381 3.39986L12.9351 3.37818L12.9326 3.356L12.9316 3.33381V3.31163L12.9326 3.28995L12.9346 3.26776L12.9381 3.24558L12.9427 3.2239L12.9477 3.20171L12.9548 3.18054L12.9623 3.15886L12.9714 3.13818L12.9815 3.11751L12.9926 3.09684L13.0052 3.07717L13.0188 3.05751L13.0859 2.96675L13.101 2.94759L13.1166 2.92894L13.1333 2.9118L13.1504 2.89516L13.168 2.87953L13.1867 2.86491L13.2059 2.85129L13.2255 2.83869L13.2452 2.82709L13.2659 2.8165L13.287 2.80692L13.3082 2.79835L13.3299 2.79079L13.3521 2.78423L13.3743 2.77869L13.3964 2.77415L13.4191 2.77062L13.4423 2.7686L13.465 2.76709L13.4882 2.76659L13.5109 2.76759L13.5341 2.76961ZM21.265 10.0997L21.2443 10.0977L21.2232 10.0967H21.202L21.1808 10.0972L21.1596 10.0987L21.139 10.1012L21.1188 10.1042L21.0981 10.1083L21.0785 10.1133L21.0588 10.1188L21.0396 10.1249L21.0205 10.132L21.0018 10.1395L20.9837 10.1481L20.966 10.1572L20.9484 10.1667L20.9317 10.1773L20.9151 10.1884L20.899 10.2L20.8833 10.2121L20.8682 10.2247L20.8536 10.2383L20.8395 10.252L20.8259 10.2666L20.8127 10.2817L20.8006 10.2968L20.7885 10.313L20.7775 10.3291L20.7669 10.3462L20.7568 10.3634L20.7477 10.381L20.7391 10.3992L20.7311 10.4173L20.7235 10.436L20.7175 10.4552L20.7114 10.4748L20.7064 10.4945L20.7023 10.5146L20.6988 10.5348L20.6958 10.5555L20.6943 10.5762L20.6933 10.5973L20.6927 10.6185L20.7341 13.9246L20.1719 13.1007L20.1583 13.081L20.1432 13.0629L20.128 13.0457L20.1114 13.0291L20.0948 13.014L20.0771 12.9994L20.059 12.9862L20.0403 12.9736L20.0212 12.9625L20.0015 12.952L19.9813 12.9429L19.9606 12.9343L19.94 12.9273L19.9188 12.9207L19.8971 12.9157L19.8754 12.9116L19.8538 12.9086L19.8316 12.9066L19.8099 12.9061H19.7877L19.7655 12.9076L19.7433 12.9101L19.7217 12.9136L19.6995 12.9182L19.6778 12.9237L19.6566 12.9308L19.6354 12.9388L19.6143 12.9479L19.5936 12.9585L19.5734 12.9701L19.5538 12.9827L19.5346 12.9963L19.4443 13.0644L19.4252 13.08L19.407 13.0962L19.3899 13.1128L19.3738 13.1299L19.3581 13.1481L19.344 13.1667L19.3309 13.1859L19.3183 13.2056L19.3072 13.2262L19.2966 13.2469L19.287 13.2676L19.279 13.2893L19.2714 13.311L19.2654 13.3331L19.2603 13.3553L19.2558 13.378L19.2528 13.4007L19.2507 13.4234L19.2497 13.4466V13.4693L19.2507 13.4925L19.2528 13.5152L19.2563 13.5383L19.2603 13.561L19.2659 13.5837L19.2724 13.6059L19.28 13.6286L19.2885 13.6503L19.2986 13.672L19.3097 13.6931L19.3218 13.7143L19.3349 13.735L20.7351 15.7881L20.7492 15.8073L20.7638 15.8254L20.7795 15.8425L20.7956 15.8592L20.8127 15.8743L20.8198 15.8804L20.8259 15.891L20.8359 15.9081L20.847 15.9247L20.8586 15.9409L20.8707 15.9565L20.8838 15.9716L20.8969 15.9862L20.9111 16.0004L20.9252 16.0135L20.9403 16.0266L20.9559 16.0392L20.9716 16.0508L20.9882 16.0624L21.0049 16.073L21.022 16.0825L21.0396 16.0921L21.0578 16.1007L21.0764 16.1088L21.0951 16.1158L21.1143 16.1224L21.1334 16.1279L21.1536 16.133L21.1733 16.1375L21.1939 16.141L21.2141 16.1436L21.2353 16.1456L21.2559 16.1466H21.2776L21.2988 16.1461L21.3195 16.1446L21.3406 16.142L21.3608 16.139L21.381 16.135L21.4012 16.1299L21.4208 16.1244L21.44 16.1183L21.4591 16.1113L21.4778 16.1037L21.4959 16.0952L21.5136 16.0861L21.5312 16.0765L21.5479 16.0659L21.5645 16.0548L21.5806 16.0432L21.5963 16.0311L21.6114 16.0185L21.626 16.0049L21.6401 15.9913L21.6538 15.9767L21.6669 15.9615L21.679 15.9464L21.6911 15.9303L21.7022 15.9141L21.7127 15.897L21.7228 15.8799L21.7319 15.8622L21.7324 15.8612L21.747 15.8476L21.7627 15.8304L21.7778 15.8128L21.7919 15.7941L21.8055 15.7745L23.1543 13.6871L23.1669 13.6664L23.1785 13.6452L23.1891 13.6236L23.1981 13.6014L23.2067 13.5792L23.2138 13.557L23.2198 13.5343L23.2243 13.5116L23.2284 13.4889L23.2309 13.4657L23.2324 13.4425L23.2329 13.4199L23.2324 13.3967L23.2309 13.374L23.2279 13.3513L23.2243 13.3286L23.2198 13.3059L23.2138 13.2837L23.2067 13.262L23.1991 13.2404L23.1901 13.2192L23.1805 13.1985L23.1694 13.1778L23.1578 13.1582L23.1447 13.1385L23.1311 13.1199L23.1159 13.1012L23.1003 13.0836L23.0837 13.0664L23.066 13.0503L23.0474 13.0346L23.0282 13.02L22.9364 12.954L22.9168 12.9409L22.8966 12.9288L22.8759 12.9177L22.8553 12.9076L22.8341 12.899L22.8129 12.8915L22.7912 12.8849L22.7696 12.8799L22.7474 12.8758L22.7252 12.8728L22.703 12.8708L22.6808 12.8703H22.6591L22.6369 12.8718L22.6153 12.8743L22.5931 12.8778L22.5719 12.8824L22.5502 12.8884L22.5296 12.895L22.5089 12.9025L22.4882 12.9116L22.4685 12.9212L22.4489 12.9323L22.4302 12.9439L22.4116 12.957L22.3939 12.9706L22.3768 12.9852L22.3601 13.0014L22.3445 13.018L22.3294 13.0357L22.3153 13.0543L22.3017 13.074L21.7652 13.9044L21.7243 10.6059L21.7233 10.5847L21.7218 10.5636L21.7193 10.5429L21.7163 10.5222L21.7122 10.502L21.7077 10.4819L21.7022 10.4627L21.6956 10.4431L21.6885 10.4244L21.681 10.4057L21.6729 10.3876L21.6638 10.3694L21.6538 10.3523L21.6437 10.3352L21.6326 10.3185L21.621 10.3024L21.6084 10.2867L21.5958 10.2716L21.5827 10.257L21.5685 10.2429L21.5539 10.2298L21.5393 10.2167L21.5237 10.2041L21.508 10.1925L21.4914 10.1814L21.4748 10.1703L21.4576 10.1607L21.44 10.1511L21.4218 10.1425L21.4032 10.1345L21.3845 10.1274L21.3654 10.1209L21.3462 10.1153L21.326 10.1103L21.3064 10.1057L21.2857 10.1022L21.265 10.0997Z",\n fill: "currentColor"\n }\n) }), fR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 26 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.53859 2.96951H24.4613C24.7929 2.96951 25.0599 3.23164 25.0599 3.56065V17.6656C25.0599 17.9946 24.7929 18.2567 24.4613 18.2567H13.6285V19.8482H15.8428C16.1744 19.8482 16.4415 20.1103 16.4415 20.4393C16.4415 20.7683 16.1744 21.0305 15.8428 21.0305H10.0972C9.76561 21.0305 9.49855 20.7683 9.49855 20.4393C9.49855 20.1103 9.76561 19.8482 10.0972 19.8482H12.3714V18.2567H1.53859C1.207 18.2567 0.939941 17.9946 0.939941 17.6656V3.56065C0.939941 3.23164 1.207 2.96951 1.53859 2.96951ZM23.8626 14.3007V4.21082H2.1971V14.3007H23.8626ZM2.1971 15.4829V17.0744H23.8626V15.4829H2.1971Z",\n fill: "currentColor"\n }\n) }), gR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M8.06781 16.339C10.1017 16.339 11.9322 15.5932 13.4237 14.3729L15.5254 16.4746L15.1864 16.8136C15.0508 16.9492 14.9831 17.0847 14.9831 17.2881C14.9831 17.4237 15.0508 17.6271 15.1864 17.7627L21.2204 23.7966C21.3559 23.9322 21.4915 24 21.6949 24C21.8305 24 22.0339 23.9322 22.1695 23.7966L22.5085 23.4576L22.8474 23.7966C22.983 23.9322 23.1186 24 23.322 24C23.5254 24 23.661 23.9322 23.7966 23.7966C24.0678 23.5254 24.0678 23.1864 23.7966 22.9153L23.4576 22.5763L23.7966 22.2373C24.0678 21.9661 24.0678 21.6271 23.7966 21.3559L17.7627 15.322C17.4915 15.0508 17.1525 15.0508 16.8814 15.322L16.5424 15.661L14.4407 13.5593C15.661 12.1356 16.4068 10.2373 16.4068 8.20339C16.4068 3.66102 12.7458 0 8.20341 0C3.66104 0 0 3.66102 0 8.20339C0 12.7458 3.59323 16.339 8.06781 16.339ZM22.3051 21.7627L21.6949 22.3729L16.5424 17.2203L17.1526 16.6102L22.3051 21.7627ZM8.06781 1.15255C11.8644 1.15255 14.9831 4.27119 14.9831 8.0678C14.9831 11.8644 11.8644 14.983 8.06781 14.983C4.2712 14.983 1.15255 11.8644 1.15255 8.0678C1.15255 4.27119 4.2712 1.15255 8.06781 1.15255Z",\n fill: "currentcolor"\n }\n) }), zR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.6753 23.7C23.5754 23.8 23.3757 24 23.1759 24C22.9761 24 22.8762 23.9 22.6764 23.8L22.3767 23.5L22.077 23.8C21.9771 23.9 21.7773 24 21.5775 24C21.3777 24 21.2778 23.9 21.078 23.8L15.0843 17.8C14.9844 17.7 14.8845 17.5 14.8845 17.3C14.8845 17.1 14.9844 17 15.0843 16.8L15.2841 16.6L13.1863 14.5C11.7877 15.6 9.98959 16.3 7.99168 16.3C3.59625 16.3 0 12.7 0 8.2C0 3.7 3.69615 0 8.19147 0C12.6868 0 16.3829 3.7 16.3829 8.2C16.3829 10.2 15.7836 12 14.5848 13.4L16.6826 15.5L16.8824 15.3C17.1821 15 17.4818 15 17.7815 15.3L23.7752 21.3C24.0749 21.6 24.0749 21.9 23.7752 22.2L23.4755 22.4L23.7752 22.7C24.0749 23 23.975 23.5 23.6753 23.7Z",\n fill: "currentcolor"\n }\n) }), CR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M24 3.41043C24 3.3518 24 3.35179 24 3.29316C24 3.29316 24 3.23454 23.9405 3.23454C23.9405 3.17591 23.881 3.1759 23.881 3.11727L23.8215 3.05864C23.7619 3.05864 23.7619 3 23.7024 3C23.7024 3 23.7024 3 23.6429 3C23.6429 3 23.6429 3 23.5834 3C23.5239 3 23.5239 3 23.4643 3C23.4048 3 23.4049 3 23.3454 3C23.3454 3 23.3453 3 23.2858 3L0.491596 5.81434C0.253536 5.81434 0.0749984 5.99023 0.0154834 6.22475C-0.0440315 6.45928 0.0749765 6.69381 0.253521 6.81107L8.52611 12.2639V20.4137C8.52611 20.6482 8.64513 20.8241 8.88319 20.9414C8.9427 20.9414 9.00225 21 9.06176 21C9.24031 21 9.35931 20.9414 9.47834 20.8241L13.7634 15.7818L17.3343 18.127C17.4533 18.2443 17.6319 18.2443 17.8104 18.1857C17.989 18.127 18.108 18.0098 18.1675 17.8925L23.881 3.87948C23.881 3.82085 23.9405 3.76222 23.9405 3.70359C24 3.46906 24 3.46906 24 3.41043ZM20.9052 4.34854L9.2403 11.2671L2.21754 6.63518L20.9052 4.34854ZM9.77591 18.8306V12.9088L12.9897 15.0195L9.77591 18.8306ZM17.5129 16.7199L10.2521 11.9707L22.3336 4.81759L17.5129 16.7199Z",\n fill: "currentColor"\n }\n) }), OR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.9001 6.9818C19.8665 6.9818 21.5208 5.39378 21.5208 3.4909C21.5208 1.58802 19.8665 -1.52588e-05 17.9001 -1.52588e-05C15.9337 -1.52588e-05 14.2795 1.58803 14.2795 3.4909C14.2795 4.07014 14.394 4.54217 14.6227 5.00729L8.51771 9.43192C7.88589 8.85311 7.02219 8.50907 6.10011 8.50907C4.13369 8.50907 2.47949 10.0971 2.47949 12C2.47949 13.9029 4.13369 15.4909 6.10011 15.4909C7.02219 15.4909 7.88589 15.1469 8.51771 14.5681L14.6229 18.9928C14.3937 19.4641 14.2795 19.9869 14.2795 20.5091C14.2795 22.4119 15.9337 24 17.9001 24C19.8665 24 21.5208 22.4119 21.5208 20.5091C21.5208 18.6062 19.8665 17.0182 17.9001 17.0182C16.978 17.0182 16.1143 17.3622 15.4825 17.941L9.37736 13.5163C9.60653 13.0449 9.72073 12.5221 9.72073 12C9.72073 11.4207 9.60623 10.9487 9.37752 10.4836L15.4825 6.05895C16.1143 6.63776 16.978 6.9818 17.9001 6.9818ZM17.9001 1.2694C19.148 1.2694 20.2104 2.24167 20.2104 3.4909C20.2104 4.68387 19.2064 5.71239 17.9001 5.71239C16.653 5.71239 15.5912 4.74134 15.5899 3.49323C15.6503 2.23729 16.6573 1.2694 17.9001 1.2694ZM6.10011 14.2215C4.85226 14.2215 3.78984 13.2492 3.78984 12C3.78984 10.807 4.79385 9.7785 6.10011 9.7785C7.34796 9.7785 8.41038 10.7508 8.41038 12C8.41038 13.1913 7.34627 14.2215 6.10011 14.2215ZM17.9001 18.3471C19.148 18.3471 20.2104 19.3193 20.2104 20.5686C20.2104 21.7615 19.2064 22.7901 17.9001 22.7901C16.653 22.7901 15.5912 21.819 15.5899 20.5709C15.6503 19.315 16.6573 18.3471 17.9001 18.3471Z",\n fill: "currentcolor"\n }\n) }), mR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.0839 3.41402C20.9419 3.2102 20.729 3.07432 20.5161 3.07432C17.4645 3.00638 14.6258 1.98726 12.2839 0.152866C12.071 -0.0509554 11.7161 -0.0509554 11.4323 0.152866C9.1613 1.91932 6.39354 2.93844 3.4129 3.07432C3.2 3.07432 2.9871 3.2102 2.84517 3.41402C1.63871 5.52018 1 7.89808 1 10.276C1 16.5945 5.40001 22.2335 11.7871 24C11.8581 24 11.929 24 12 24C12.071 24 12.1419 24 12.2129 24C18.529 22.2335 23 16.6624 23 10.276C23 7.89808 22.3613 5.52018 21.0839 3.41402ZM12 22.7771C6.32258 21.1465 2.34838 16.051 2.34838 10.3439C2.34838 8.23779 2.84516 6.19958 3.83871 4.36519C6.74839 4.16137 9.51612 3.21019 11.8581 1.51168C14.271 3.27813 17.1097 4.22931 20.0903 4.36519C21.0839 6.19958 21.5806 8.23779 21.5806 10.3439C21.6516 16.051 17.6774 21.1465 12 22.7771Z",\n fill: "currentColor"\n }\n) }), vR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.0839 3.41402C20.9419 3.2102 20.729 3.07432 20.5161 3.07432C17.4645 3.00638 14.6258 1.98726 12.2839 0.152866C12.071 -0.0509554 11.7161 -0.0509554 11.4323 0.152866C9.1613 1.91932 6.39354 2.93844 3.4129 3.07432C3.2 3.07432 2.9871 3.2102 2.84517 3.41402C1.63871 5.52018 1 7.89808 1 10.276C1 16.5945 5.40001 22.2335 11.7871 24C11.8581 24 11.929 24 12 24C12.071 24 12.1419 24 12.2129 24C18.529 22.2335 23 16.6624 23 10.276C23 7.89808 22.3613 5.52018 21.0839 3.41402Z",\n fill: "currentColor"\n }\n) }), yR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.00011457 12.0036C0.00331864 12.1681 0.0814908 12.3247 0.151725 12.3967L3.01901 15.3146C3.07254 15.3789 3.13865 15.4314 3.21323 15.4687C3.28847 15.5064 3.37065 15.5278 3.45456 15.5316C3.53846 15.5354 3.62221 15.5214 3.70047 15.4907C3.77873 15.4599 3.84977 15.4131 3.90907 15.3531C3.96837 15.2931 4.01464 15.2214 4.04497 15.1424C4.07529 15.0634 4.08902 14.9789 4.08529 14.8943C4.08156 14.8097 4.06045 14.7268 4.02329 14.6508C3.98646 14.5755 3.93465 14.5087 3.87108 14.4546L2.04793 12.6107L22.0749 12.5609",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.0749 12.5609L20.1664 14.4911C20.0775 14.5986 20.0317 14.7359 20.0379 14.8759C20.044 15.0159 20.1018 15.1484 20.1998 15.2475C20.2977 15.3466 20.4288 15.405 20.5672 15.4113C20.7057 15.4175 20.8414 15.3711 20.9477 15.2813L23.8044 12.3981C23.9194 12.2803 24 12.1659 24 11.9922C24 11.817 23.9261 11.7029 23.8044 11.5569L20.9845 8.68524C20.931 8.621 20.8649 8.56858 20.7904 8.53127C20.7152 8.49362 20.633 8.47221 20.5491 8.46843C20.4652 8.46464 20.3814 8.47857 20.3032 8.50931C20.2249 8.54005 20.1539 8.58691 20.0946 8.64689C20.0353 8.70686 19.989 8.77863 19.9587 8.85762C19.9284 8.9366 19.9146 9.02108 19.9184 9.1057C19.9221 9.19031 19.9432 9.27323 19.9804 9.34918C20.0172 9.42445 20.069 9.49126 20.1326 9.54542L21.9557 11.3893H2.04794L3.87108 9.54542C3.93465 9.49126 3.98646 9.42445 4.02329 9.34918C4.06045 9.27323 4.08156 9.19031 4.08529 9.1057C4.08902 9.02108 4.07529 8.9366 4.04497 8.85762C4.01464 8.77864 3.96837 8.70686 3.90907 8.64689C3.84977 8.58691 3.77873 8.54005 3.70047 8.50931C3.62221 8.47857 3.53846 8.46464 3.45456 8.46843C3.37065 8.47221 3.28847 8.49362 3.21323 8.53127C3.13868 8.56859 3.07258 8.62104 3.01906 8.6853L0.163853 11.5729L0.162692 11.5742C0.073429 11.6709 -0.00337693 11.8243 0.00011457 12.0036C0.00331864 12.1681 0.0814908 12.3247 0.151725 12.3967L3.01901 15.3146C3.07254 15.3789 3.13865 15.4314 3.21323 15.4687C3.28847 15.5064 3.37065 15.5278 3.45456 15.5316C3.53846 15.5354 3.62221 15.5214 3.70047 15.4907C3.77873 15.4599 3.84977 15.4131 3.90907 15.3531C3.96837 15.2931 4.01464 15.2214 4.04497 15.1424C4.07529 15.0634 4.08902 14.9789 4.08529 14.8943C4.08156 14.8097 4.06045 14.7268 4.02329 14.6508C3.98646 14.5755 3.93465 14.5087 3.87108 14.4546L2.04793 12.6107L22.0749 12.5609Z",\n fill: "currentColor"\n }\n )\n] }), LR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.7718 16.3015C16.6371 18.2562 14.4238 19.4661 12 19.4661C9.57584 19.4661 7.36247 18.2562 6.22785 16.3012C6.04341 15.9832 6.15128 15.576 6.46955 15.3912C6.78733 15.2064 7.19481 15.3148 7.37951 15.6329C8.27337 17.1725 10.0419 18.1343 12 18.1343C13.958 18.1343 15.7262 17.1725 16.6198 15.6329C16.8046 15.315 17.2121 15.2068 17.53 15.3912C17.8481 15.5757 17.9562 15.9833 17.7718 16.3015ZM24 12C24 18.5059 18.5056 24 12 24C5.49441 24 0 18.5059 0 12C0 5.49413 5.49441 0 12 0C18.5056 0 24 5.49413 24 12ZM22.6682 12C22.6682 6.21827 17.7817 1.33176 12 1.33176C6.21827 1.33176 1.33176 6.21827 1.33176 12C1.33176 17.7817 6.21827 22.6682 12 22.6682C17.7817 22.6682 22.6682 17.7817 22.6682 12ZM8.98403 10.8269C8.98403 11.4303 8.49485 11.9195 7.89142 11.9195C7.28799 11.9195 6.79881 11.4303 6.79881 10.8269C6.79881 10.2235 7.28799 9.73431 7.89142 9.73431C8.49485 9.73431 8.98403 10.2235 8.98403 10.8269ZM17.3411 10.8269C17.3411 11.4303 16.852 11.9195 16.2485 11.9195C15.6451 11.9195 15.1559 11.4303 15.1559 10.8269C15.1559 10.2235 15.6451 9.73431 16.2485 9.73431C16.852 9.73431 17.3411 10.2235 17.3411 10.8269Z",\n fill: "currentColor"\n }\n) }), wR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2721_61430)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M4.27477 23.6803L4.2732 23.6824C4.14005 23.8609 3.96628 23.9823 3.77599 23.9982C3.58042 24.0146 3.39511 23.9175 3.24952 23.7163C2.92896 23.2733 0.182071 19.2084 0.104271 19.0977C-0.0638096 18.8586 -0.0366705 18.4862 0.236934 18.2926C0.525375 18.0885 0.899268 18.2149 1.05917 18.4649C1.75543 19.4802 2.47296 20.5299 3.18332 21.5645L3.18332 0.568042C3.18332 0.229741 3.46616 -0.00874059 3.79075 0.000261753C4.10594 0.00900375 4.36535 0.246717 4.36535 0.5675L4.36535 21.5614L6.49024 18.4586C6.67019 18.1735 7.03914 18.0976 7.30357 18.281C7.59093 18.4576 7.67387 18.8278 7.4763 19.0939C6.42578 20.6341 5.34853 22.1562 4.27477 23.6803Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.60039 4.05703C8.60039 3.67043 8.91379 3.35703 9.30039 3.35703H23.3004C23.687 3.35703 24.0004 3.67043 24.0004 4.05703C24.0004 4.44363 23.687 4.75703 23.3004 4.75703H9.30039C8.91379 4.75703 8.60039 4.44363 8.60039 4.05703Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.60039 9.35235C8.60039 8.96575 8.91379 8.65235 9.30039 8.65235H21.8004C22.187 8.65235 22.5004 8.96575 22.5004 9.35235C22.5004 9.73895 22.187 10.0524 21.8004 10.0524H9.30039C8.91379 10.0524 8.60039 9.73895 8.60039 9.35235Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.60039 14.6477C8.60039 14.2611 8.91379 13.9477 9.30039 13.9477H19.3004C19.687 13.9477 20.0004 14.2611 20.0004 14.6477C20.0004 15.0343 19.687 15.3477 19.3004 15.3477H9.30039C8.91379 15.3477 8.60039 15.0343 8.60039 14.6477Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.60039 19.943C8.60039 19.5564 8.91379 19.243 9.30039 19.243H17.8004C18.187 19.243 18.5004 19.5564 18.5004 19.943C18.5004 20.3296 18.187 20.643 17.8004 20.643H9.30039C8.91379 20.643 8.60039 20.3296 8.60039 19.943Z",\n fill: "currentcolor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2721_61430", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), qR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.4803 8.70365L15.4751 8.18404L12.5585 0.38972C12.4964 0.129909 12.2482 0 12 0C11.7518 0 11.5656 0.129909 11.4415 0.38972L8.52486 8.18404L0.519709 8.70365C0.271487 8.70365 0.0853277 8.89851 0.023272 9.09337C-0.0387836 9.35318 0.0232645 9.61299 0.209431 9.7429L6.35292 15.069L4.36717 23.1881C4.30511 23.4479 4.36714 23.7077 4.61537 23.8376C4.73948 23.9026 4.86359 23.9675 4.92564 23.9675C5.04975 23.9675 5.11181 23.9675 5.23592 23.9026L12 19.4208L18.764 23.9026C18.9502 24.0325 19.1984 24.0325 19.3846 23.9026C19.5708 23.7727 19.6328 23.5129 19.6328 23.253L17.647 15.134L23.7906 9.80786C23.9767 9.67795 24.0388 9.41814 23.9767 9.15833C23.9147 8.89852 23.7285 8.76861 23.4803 8.70365ZM16.6542 14.4195C16.468 14.5494 16.406 14.8092 16.468 15.0041L18.2056 22.0189L12.3723 18.1218C12.1862 17.9919 11.9379 17.9919 11.7518 18.1218L5.91856 22.0189L7.65611 15.0041C7.71816 14.8092 7.65611 14.5494 7.46995 14.4195L2.13314 9.80786L9.02134 9.35318C9.26956 9.35318 9.45572 9.22327 9.51778 8.96346L12.062 2.20839L14.6063 8.96346C14.6684 9.15832 14.8546 9.35318 15.1028 9.35318L21.9909 9.80786L16.6542 14.4195Z",\n fill: "currentColor"\n }\n) }), xR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.4803 8.70365L15.4751 8.18404L12.5585 0.38972C12.4964 0.129909 12.2482 0 12 0C11.7518 0 11.5656 0.129909 11.4415 0.38972L8.52486 8.18404L0.519709 8.70365C0.271487 8.70365 0.0853277 8.89851 0.023272 9.09337C-0.0387836 9.35318 0.0232645 9.61299 0.209431 9.7429L6.35292 15.069L4.36717 23.1881C4.30511 23.4479 4.36714 23.7077 4.61537 23.8376C4.73948 23.9026 4.86359 23.9675 4.92564 23.9675C5.04975 23.9675 5.11181 23.9675 5.23592 23.9026L12 19.4208L18.764 23.9026C18.9502 24.0325 19.1984 24.0325 19.3846 23.9026C19.5708 23.7727 19.6328 23.5129 19.6328 23.253L17.647 15.134L23.7906 9.80786C23.9767 9.67795 24.0388 9.41814 23.9767 9.15833C23.9147 8.89852 23.7285 8.76861 23.4803 8.70365Z",\n fill: "currentColor"\n }\n) }), RR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M30.8241 34.3133C30.6563 34.3139 30.4927 34.2616 30.3564 34.1638L23.951 29.5201L17.5456 34.1638C17.4088 34.2631 17.2439 34.3163 17.0749 34.3157C16.9058 34.315 16.7414 34.2607 16.6052 34.1604C16.4691 34.0602 16.3684 33.9192 16.3177 33.758C16.2669 33.5967 16.2688 33.4235 16.3229 33.2634L18.8211 25.8639L12.3465 21.4238C12.2063 21.3277 12.1004 21.1893 12.0445 21.0288C11.9885 20.8683 11.9853 20.6941 12.0354 20.5317C12.0854 20.3692 12.1861 20.227 12.3228 20.1259C12.4594 20.0248 12.6248 19.97 12.7948 19.9695H20.7825L23.193 12.5511C23.2449 12.3909 23.3463 12.2513 23.4824 12.1523C23.6186 12.0533 23.7827 12 23.951 12C24.1194 12 24.2834 12.0533 24.4196 12.1523C24.5558 12.2513 24.6571 12.3909 24.7091 12.5511L27.1196 19.972H35.1073C35.2775 19.9719 35.4432 20.0263 35.5803 20.1273C35.7173 20.2282 35.8184 20.3704 35.8688 20.533C35.9192 20.6955 35.9162 20.87 35.8603 21.0307C35.8044 21.1915 35.6984 21.3301 35.558 21.4263L29.0809 25.8639L31.5776 33.2614C31.6181 33.3812 31.6295 33.5088 31.6108 33.6339C31.5922 33.7589 31.5441 33.8777 31.4704 33.9805C31.3968 34.0832 31.2998 34.167 31.1874 34.2249C31.075 34.2827 30.9505 34.313 30.8241 34.3133Z",\n fill: "currentColor"\n }\n) }), BR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M4.59082 0H19.3997C19.5958 0 19.764 0.0629001 19.8757 0.170352C19.9872 0.277609 20.0396 0.426953 20.0071 0.591182V23.4138C20.0071 23.7411 19.7352 24 19.3997 24H4.59082C4.25535 24 3.9834 23.7411 3.9834 23.4138V0.586189C3.9834 0.258875 4.25536 0 4.59082 0ZM18.7922 1.232H5.19829V22.8276H18.7922V1.232ZM13.5134 4.03316H10.5393C10.2039 4.03316 9.93188 3.77425 9.93188 3.44694C9.93188 3.11963 10.2039 2.86076 10.5393 2.86076H13.5134C13.8489 2.86076 14.1208 3.11963 14.1208 3.44694C14.1208 3.77425 13.8489 4.03316 13.5134 4.03316ZM14.1208 19.1224C14.1208 20.2246 13.1673 21.1391 12.0263 21.1391C10.8854 21.1391 9.93188 20.2246 9.93188 19.1224C9.93188 18.0203 10.8854 17.1057 12.0263 17.1057C13.1673 17.1057 14.1208 18.0203 14.1208 19.1224ZM12.906 19.1224C12.906 18.6749 12.4964 18.2782 12.0263 18.2782C11.5563 18.2782 11.1467 18.6749 11.1467 19.1224C11.1467 19.5699 11.5563 19.9667 12.0263 19.9667C12.4964 19.9667 12.906 19.5699 12.906 19.1224Z",\n fill: "currentColor"\n }\n) }), WR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20 1.4H4C2.56406 1.4 1.4 2.56406 1.4 4V20C1.4 21.4359 2.56406 22.6 4 22.6H20C21.4359 22.6 22.6 21.4359 22.6 20V4C22.6 2.56406 21.4359 1.4 20 1.4ZM4 0C1.79086 0 0 1.79086 0 4V20C0 22.2091 1.79086 24 4 24H20C22.2091 24 24 22.2091 24 20V4C24 1.79086 22.2091 0 20 0H4Z",\n fill: "currentColor"\n }\n) }), ER = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.4803 0.654532C14.4803 1.01815 14.1796 1.30902 13.8038 1.30902H10.1961C9.82028 1.30902 9.51966 1.01815 9.51966 0.654532C9.51966 0.290913 9.82028 0 10.1961 0H13.8038C14.1796 0 14.4803 0.290913 14.4803 0.654532ZM12 1.7454C5.68626 1.7454 0.5 6.7636 0.5 12.8727C0.5 18.9818 5.68626 24 12 24C18.3137 24 23.5 18.9818 23.5 12.8727C23.5 6.7636 18.3889 1.7454 12 1.7454ZM12 22.6182C6.4379 22.6182 1.92808 18.2546 1.92808 12.8727C1.92808 7.49087 6.4379 3.1272 12 3.1272C17.5621 3.1272 22.0719 7.49087 22.0719 12.8727C22.147 18.2546 17.5621 22.6182 12 22.6182ZM9.06864 5.60004C8.91832 5.23641 8.46734 5.16367 8.1667 5.30912C7.79089 5.45457 7.71576 5.89094 7.86608 6.18184L11.4738 13.1635C11.6241 13.3817 11.8496 13.5271 12.0751 13.5271H19.2906C19.6664 13.5271 19.967 13.2362 19.967 12.8726C19.967 12.509 19.6664 12.2181 19.2906 12.2181H12.5261L9.06864 5.60004Z",\n fill: "currentColor"\n }\n) }), SR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "circle",\n {\n cx: "12",\n cy: "12",\n r: "11.3",\n stroke: "currentColor",\n strokeWidth: "1.4"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.287 9.97941V14.0661L15.9485 8.1327L15.9559 8.12751C16.1847 7.96756 16.6056 7.91559 16.8558 8.2266C17.0367 8.45136 17.0909 8.86929 16.7586 9.1096L8.02234 15.8906L7.9844 15.9083L7.97415 15.9132C7.92354 15.9373 7.7922 16 7.64351 16L7.64113 16C7.62508 16 7.57732 16.0001 7.52493 15.992C7.49108 15.9867 7.41957 15.9733 7.34505 15.9297C7.22518 15.8744 7.14468 15.7834 7.09654 15.7065C7.03957 15.6155 7 15.5009 7 15.3818V9.97941C7 9.61955 7.30561 9.36119 7.64351 9.36119C7.98144 9.36119 8.287 9.61958 8.287 9.97941Z",\n fill: "currentColor"\n }\n )\n] }), kR = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A("g", { clipPath: "url(#clip0_3216_12400)", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 24C14.3734 24 16.6935 23.2962 18.6668 21.9776C20.6402 20.6591 22.1783 18.7849 23.0866 16.5922C23.9948 14.3995 24.2324 11.9867 23.7694 9.65892C23.3064 7.33115 22.1635 5.19295 20.4853 3.51472C18.8071 1.83649 16.6689 0.693605 14.3411 0.230582C12.0133 -0.232441 9.60051 0.00519943 7.4078 0.913451C5.21509 1.8217 3.34094 3.35977 2.02236 5.33316C0.703788 7.30655 0 9.62663 0 12C0 15.1826 1.26428 18.2348 3.51472 20.4853C5.76515 22.7357 8.8174 24 12 24ZM7.64 16.37C7.58021 16.3771 7.5198 16.3771 7.46 16.37C7.35446 16.3565 7.25257 16.3225 7.16 16.27C7.00282 16.1916 6.87107 16.0702 6.78 15.92C6.68316 15.7638 6.63126 15.5838 6.63 15.4V10C6.63 9.73481 6.73536 9.48045 6.9229 9.29292C7.11043 9.10538 7.36479 9.00002 7.63 9.00002C7.89522 9.00002 8.14958 9.10538 8.33711 9.29292C8.52465 9.48045 8.63 9.73481 8.63 10V13.33L15.69 7.86002C15.8801 7.72523 16.107 7.65194 16.34 7.65002C16.4877 7.651 16.6334 7.68469 16.7665 7.74866C16.8996 7.81264 17.017 7.90531 17.11 8.02002C17.1978 8.12628 17.2626 8.24953 17.3004 8.38204C17.3383 8.51455 17.3484 8.65345 17.33 8.79002C17.3142 8.91828 17.2712 9.04169 17.2039 9.15204C17.1367 9.26239 17.0467 9.35715 16.94 9.43002L8.19 16.23H8.11C7.95499 16.3098 7.78423 16.3542 7.61 16.36L7.64 16.37Z",\n fill: "currentColor"\n }\n ) }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_3216_12400", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "white" }) }) })\n] }), NR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M15.142 7.25708H8.79201C8.46128 7.25708 8.19669 7.51171 8.19669 7.83001C8.19669 8.14831 8.46128 8.40294 8.79201 8.40294H15.142C15.4727 8.40294 15.7373 8.14831 15.7373 7.83001C15.7373 7.51171 15.4727 7.25708 15.142 7.25708Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.79201 11.0131H15.142C15.4727 11.0131 15.7373 11.2677 15.7373 11.586C15.7373 11.9043 15.4727 12.159 15.142 12.159H8.79201C8.46128 12.159 8.19669 11.9043 8.19669 11.586C8.19669 11.2677 8.46128 11.0131 8.79201 11.0131Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M15.142 14.7054H8.79201C8.46128 14.7054 8.19669 14.9601 8.19669 15.2784C8.19669 15.5967 8.46128 15.8513 8.79201 15.8513H15.142C15.4727 15.8513 15.7373 15.5967 15.7373 15.2784C15.7373 14.9601 15.4727 14.7054 15.142 14.7054Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M8.79201 18.3978H15.142C15.4727 18.3978 15.7373 18.6525 15.7373 18.9707C15.7373 19.289 15.4727 19.5437 15.142 19.5437H8.79201C8.46128 19.5437 8.19669 19.289 8.19669 18.9707C8.19669 18.6525 8.46128 18.3978 8.79201 18.3978Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.8385 1.52787H15.7373V0.57296C15.7373 0.254658 15.4727 0 15.142 0H8.79182C8.46108 0 8.19648 0.254658 8.19648 0.57296V1.52787H4.09535C3.76461 1.52787 3.5 1.78251 3.5 2.10081V23.4271C3.5 23.7454 3.76461 24 4.09535 24H19.9046C20.2354 24 20.5 23.7454 20.5 23.4271V2.10081C20.5 1.78251 20.2354 1.52787 19.8385 1.52787ZM9.38717 1.20957H14.4805V3.05572H9.38717V1.20957ZM4.62452 22.8542V2.73742H8.13034V3.69232C8.13034 4.01063 8.39495 4.26526 8.72569 4.26526H15.0759C15.4066 4.26526 15.6712 4.01063 15.6712 3.69232V2.73742H19.3077V22.8542H4.62452Z",\n fill: "currentColor"\n }\n )\n] }), IR = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M16.1 0.2V3.5C16.1 3.8 15.9 4.1 15.6 4.2H9.5C9.4 4.2 9.4 4.2 9.4 4.2C8.9 4.2 8.7 3.9 8.7 3.6V0.6C8.7 0.2 9 0 9.3 0H15.7C15.8 0 16 0.1 16.1 0.2Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M20.3 1.5H17.9V5.3C17.9 5.7 17.6 6 17.2 6H7.6C7.2 6 6.9 5.7 6.9 5.3V1.5H4.6C4.3 1.5 4 1.8 4 2.1V23.4C4 23.7 4.3 24 4.6 24H20.4C20.7 24 21 23.7 21 23.4V2.1C21 1.8 20.7 1.5 20.3 1.5ZM15.4 21.2H9.5C9 21.2 8.6 20.8 8.6 20.3C8.6 19.8 9 19.4 9.5 19.4H15.3C15.8 19.4 16.2 19.8 16.2 20.3C16.3 20.8 15.9 21.2 15.4 21.2ZM15.4 17.4H9.5C9 17.4 8.6 17 8.6 16.5C8.6 16 9 15.6 9.5 15.6H15.3C15.8 15.6 16.2 16 16.2 16.5C16.2 17 15.9 17.4 15.4 17.4ZM15.4 13.6H9.5C9 13.6 8.6 13.2 8.6 12.7C8.6 12.2 9 11.8 9.5 11.8H15.3C15.8 11.8 16.2 12.2 16.2 12.7C16.3 13.2 15.9 13.6 15.4 13.6ZM15.4 9.7H9.5C9 9.7 8.6 9.3 8.6 8.8C8.6 8.3 9 7.9 9.5 7.9H15.3C15.8 7.9 16.2 8.3 16.2 8.8C16.3 9.3 15.9 9.7 15.4 9.7Z",\n fill: "currentColor"\n }\n )\n] }), TR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M23.2895 11.2895H22.1053C21.7105 6.23684 17.7632 2.2105 12.7105 1.89471V0.710498C12.7105 0.315761 12.3947 0 12 0C11.6053 0 11.2895 0.315761 11.2895 0.710498V1.89471C6.23684 2.28945 2.21053 6.23684 1.89474 11.2895H0.710527C0.315791 11.2895 0 11.6053 0 12C0 12.3948 0.315791 12.7105 0.710527 12.7105H1.89474C2.28947 17.7632 6.23684 21.7895 11.2895 22.1053V23.2895C11.2895 23.6842 11.6053 24 12 24C12.3947 24 12.7105 23.6842 12.7105 23.2895V22.1053C17.7632 21.7106 21.7895 17.7632 22.1053 12.7105H23.2895C23.6842 12.7105 24 12.3948 24 12C24 11.6053 23.6842 11.2895 23.2895 11.2895ZM12.7105 20.8282V19.7229C12.7105 19.3282 12.3947 19.0124 12 19.0124C11.6053 19.0124 11.2895 19.3282 11.2895 19.7229V20.8282C7.10526 20.5124 3.58755 16.9737 3.19281 12.7105H4.29807C4.69281 12.7105 5.0086 12.3948 5.0086 12C5.0086 11.6053 4.69281 11.2895 4.29807 11.2895H3.19281C3.5086 7.10526 7.02632 3.59347 11.2895 3.19873V4.30397C11.2895 4.69871 11.6053 5.01452 12 5.01452C12.3947 5.01452 12.7105 4.69871 12.7105 4.30397V3.19873C16.8947 3.51452 20.4771 7.09818 20.8718 11.3613H19.7666C19.3718 11.3613 19.056 11.6772 19.056 12.0719C19.056 12.4666 19.3718 12.7824 19.7666 12.7824H20.8718C20.4771 16.9667 16.8947 20.5124 12.7105 20.8282Z",\n fill: "currentColor"\n }\n) }), DR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M18.9212 9.60994C19.917 8.81326 20.4149 7.71783 20.4149 6.42322C20.4149 4.23235 18.6224 2.43982 16.3319 2.43982C14.1411 2.43982 12.249 4.23235 12.249 6.42322C12.249 7.61824 12.7469 8.81326 13.7427 9.60994C12.5477 10.0083 11.3527 10.7054 10.556 11.7012C10.3568 11.6016 10.2573 11.6016 10.0581 11.5021C11.0539 10.7054 11.5519 9.60994 11.5519 8.31534C11.5519 6.12447 9.75934 4.33194 7.46888 4.33194C5.27801 4.33194 3.38589 6.12447 3.38589 8.31534C3.48548 9.51036 3.9834 10.7054 4.97925 11.5021C1.9917 12.3983 0 14.9875 0 18.0747V20.9626C0 21.2614 0.298755 21.5602 0.59751 21.5602H14.5394C14.8382 21.5602 15.1369 21.2614 15.1369 20.9626V19.668H23.4025C23.7012 19.668 24 19.3693 24 19.0705V16.1826C23.9004 13.195 21.8091 10.4066 18.9212 9.60994ZM11.751 12.1992C12.8465 11.1037 14.3402 10.5062 15.834 10.5062H17.029C20.2158 10.5062 22.805 13.0954 22.805 16.1826V18.473H15.1369V18.0747C15.0373 15.6846 13.7427 13.4938 11.751 12.1992ZM13.5436 6.52281C13.5436 4.92945 14.8382 3.73443 16.4315 3.73443C18.0249 3.73443 19.3195 5.02903 19.3195 6.52281C19.3195 8.11617 18.0249 9.31119 16.4315 9.31119C14.8382 9.31119 13.5436 8.01658 13.5436 6.52281ZM6.97095 12.2987H8.16597C8.76348 12.2987 9.46058 12.3983 10.0581 12.5975C10.3568 12.6971 10.6556 12.7967 10.8548 12.9958C12.7469 13.9917 13.8423 15.8838 13.8423 17.9751V20.2655H1.19502V17.9751C1.19502 14.888 3.78423 12.2987 6.97095 12.2987ZM4.6805 8.41492C4.6805 6.82156 5.9751 5.62654 7.56846 5.62654C9.16183 5.62654 10.4564 6.92115 10.4564 8.41492C10.4564 10.0083 9.16183 11.2033 7.56846 11.2033C5.9751 11.2033 4.6805 9.9087 4.6805 8.41492Z",\n fill: "currentColor"\n }\n) }), HR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M18.9212 9.61007C19.917 8.81339 20.4149 7.71795 20.4149 6.42334C20.4149 4.23247 18.6224 2.43994 16.3319 2.43994C14.1411 2.43994 12.249 4.23247 12.249 6.42334C12.249 7.61836 12.7469 8.81339 13.7427 9.61007C12.5477 10.0084 11.3527 10.7055 10.556 11.7014C10.3568 11.6018 10.2573 11.6018 10.0581 11.5022C11.0539 10.7055 11.5519 9.61007 11.5519 8.31546C11.5519 6.12459 9.75934 4.33206 7.46888 4.33206C5.27801 4.33206 3.38589 6.12459 3.38589 8.31546C3.48548 9.51048 3.9834 10.7055 4.97925 11.5022C1.9917 12.3984 0 14.9877 0 18.0748V20.9628C0 21.2615 0.298755 21.5603 0.59751 21.5603H14.5394C14.8382 21.5603 15.1369 21.2615 15.1369 20.9628V19.6682H23.4025C23.7012 19.6682 24 19.3694 24 19.0706V16.1827C23.9004 13.1951 21.8091 10.4067 18.9212 9.61007Z",\n fill: "currentColor"\n }\n) }), PR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M8.04765 23.996C7.36348 23.9535 6.70303 23.4115 6.37664 22.6473L6.37616 22.6462C6.19194 22.2022 5.98205 21.4059 6.17244 20.2501C6.35614 19.1348 6.91151 17.6907 8.21249 15.9094H4.71979C3.36061 15.9094 2.24615 14.8131 2.24615 13.469C2.24615 12.9616 2.40956 12.487 2.67797 12.1019C1.69535 11.7694 0.990234 10.8742 0.990234 9.79317C0.990234 8.71216 1.69534 7.81692 2.67797 7.48439C2.40956 7.09935 2.24614 6.62469 2.24614 6.11731C2.24614 4.92438 3.13038 3.91586 4.27145 3.70586C4.01909 3.323 3.89452 2.86144 3.89452 2.40276C3.89452 1.06259 4.9663 -0.0387229 6.33067 0.00104425L12.6085 0.0010437C15.2516 0.00104347 17.63 1.46324 18.6126 3.6769L22.4202 3.6769C22.7132 3.6769 23.01 3.91572 23.01 4.26003V14.359C23.01 14.6519 22.7653 14.9421 22.4202 14.9421L17.5556 14.9421L13.467 18.1668C11.7987 19.4673 10.9447 20.8424 9.57003 23.0883C9.1877 23.594 8.73985 24.0481 8.04765 23.996ZM17.6777 4.4561C16.9211 2.4148 14.3222 1.40006 12.6477 1.40006L6.36816 1.39947C5.68424 1.39947 5.11333 1.93045 5.11333 2.63492C5.11333 3.3051 5.64946 3.87037 6.36816 3.87037C7.07608 3.87037 7.13969 5.03663 6.36816 5.03663H4.71978C4.03586 5.03663 3.46495 5.56761 3.46495 6.27208C3.46495 6.94226 4.00109 7.50753 4.71978 7.50753C5.4277 7.50753 5.49131 8.6738 4.71979 8.6738H3.50312C2.8192 8.6738 2.24829 9.20478 2.24829 9.90925C2.24829 10.5794 2.78443 11.1447 3.50312 11.1447H4.71979C5.4277 11.1447 5.49131 12.311 4.71979 12.311C4.03811 12.311 3.46495 12.8784 3.46495 13.5464C3.46495 14.2166 4.00109 14.7819 4.71979 14.7819H9.46869C9.98281 14.7819 10.2114 15.3588 9.91647 15.7465L9.91292 15.7512C8.29318 17.6751 7.63719 19.1667 7.41166 20.2406C7.18655 21.3124 7.38863 21.9752 7.49869 22.2464L7.49929 22.2479C7.68373 22.7207 8.00166 22.8688 8.13429 22.8688C8.39757 22.8688 8.5512 22.5079 8.67711 22.3221C10.0137 20.1608 10.9269 18.6842 12.7313 17.2836L16.9649 13.9214C17.0705 13.8203 17.2187 13.7758 17.3574 13.7758L21.8697 13.7758V4.84316L18.26 4.84316C17.9846 4.84316 17.7723 4.68957 17.679 4.45947L17.6777 4.4561Z",\n fill: "currentcolor"\n }\n) }), VR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M15.9526 0.00395192C16.6368 0.0465183 17.2972 0.588476 17.6236 1.3527L17.6241 1.35383C17.8083 1.7978 18.0182 2.59409 17.8278 3.74994C17.6441 4.86522 17.0887 6.30929 15.7878 8.09057H19.2805C20.6396 8.09057 21.7541 9.18689 21.7541 10.531C21.7541 11.0384 21.5907 11.513 21.3223 11.8981C22.3049 12.2306 23.01 13.1258 23.01 14.2068C23.01 15.2878 22.3049 16.1831 21.3223 16.5156C21.5907 16.9006 21.7541 17.3753 21.7541 17.8827C21.7541 19.0756 20.8699 20.0841 19.7288 20.2941C19.9812 20.677 20.1057 21.1386 20.1057 21.5972C20.1057 22.9374 19.0339 24.0387 17.6696 23.999H11.3918C8.7486 23.999 6.3703 22.5368 5.38763 20.3231H1.58001C1.28704 20.3231 0.990234 20.0843 0.990234 19.74V9.64103C0.990234 9.34811 1.23491 9.0579 1.58001 9.0579H6.44469L10.5333 5.83319C12.2016 4.5327 13.0555 3.15765 14.4302 0.911712C14.8126 0.406018 15.2604 -0.0481279 15.9526 0.00395192ZM6.32258 19.5439C7.04935 21.5049 9.07855 22.8279 11.3407 22.6011L11.3525 22.5999L17.6321 22.6005C18.316 22.6005 18.8869 22.0696 18.8869 21.3651C18.8869 20.6949 18.3508 20.1296 17.6321 20.1296C16.878 20.1296 16.8729 18.9634 17.6321 18.9634H19.2805C19.9644 18.9634 20.5353 18.4324 20.5353 17.7279C20.5353 17.0577 19.9992 16.4925 19.2805 16.4925C18.5264 16.4925 18.5213 15.3262 19.2805 15.3262H20.4971C21.181 15.3262 21.752 14.7952 21.752 14.0908C21.752 13.4206 21.2158 12.8553 20.4971 12.8553H19.2805C18.5264 12.8553 18.5213 11.689 19.2805 11.689C19.9621 11.689 20.5353 11.1216 20.5353 10.4536C20.5353 9.78341 19.9992 9.21813 19.2805 9.21813H14.5316C14.285 9.21813 14.09 9.07168 13.9939 8.88221C13.8887 8.67479 13.9477 8.43239 14.0838 8.25352L14.0873 8.24884C15.7071 6.32489 16.3631 4.83331 16.5886 3.75942C16.8137 2.68757 16.6116 2.02484 16.5016 1.75358L16.501 1.7521C16.3165 1.27931 15.9986 1.13124 15.866 1.13124C15.6027 1.13124 15.4757 1.41864 15.3231 1.67793C14.0981 3.75942 13.0733 5.31584 11.2689 6.71641L7.03537 10.0786C6.92976 10.1797 6.78158 10.2242 6.64289 10.2242H2.13054V19.1568H5.74021C6.01564 19.1568 6.22792 19.3104 6.32127 19.5405L6.32258 19.5439Z",\n fill: "currentcolor"\n }\n) }), FR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0 12C0 5.37313 5.37313 -7.62939e-06 12 -7.62939e-06C18.6269 -7.62939e-06 24 5.37313 24 12C24 18.6269 18.6269 24 12 24C5.37313 24 0 18.6269 0 12ZM1.3233 12C1.3233 17.866 6.13397 22.6767 12 22.6767C17.9249 22.6767 22.6767 17.8664 22.6767 12C22.6767 6.13396 17.866 1.32329 12 1.32329C6.13397 1.32329 1.3233 6.13396 1.3233 12ZM12.6912 11.3677H17.6838C18.0443 11.3677 18.375 11.6984 18.375 12.059C18.375 12.4098 18.0938 12.691 17.743 12.691H12.0592C11.7084 12.691 11.4272 12.4098 11.4272 12.059V6.37517C11.4272 6.02437 11.7084 5.74314 12.0592 5.74314C12.41 5.74314 12.6912 6.02436 12.6912 6.37517V11.3677Z",\n fill: "currentColor"\n }\n) }), UR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 0C5.4 0 0 5.4 0 12C0 18.6 5.4 24 12 24C18.6 24 24 18.6 24 12C24 5.4 18.6 0 12 0ZM11.1 12.1V6.4C11.1 5.9 11.5 5.5 12 5.5C12.5 5.5 12.9 5.9 12.9 6.4V11.1H17.6C18.1 11.1 18.6 11.6 18.6 12.1C18.6 12.6 18.2 13 17.7 13H12C11.5 13 11.1 12.6 11.1 12.1Z",\n fill: "currentColor"\n }\n) }), YR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2640_44855)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.9 5.20001V1.50001H22.5V5.20001H18.9ZM17.4 5.90001V0.700008C17.4 0.300008 17.7 7.62939e-06 18.1 7.62939e-06H23.3C23.7 7.62939e-06 24 0.300008 24 0.700008V5.90001C24 6.30001 23.7 6.70001 23.3 6.70001H18.1C17.7 6.70001 17.3 6.30001 17.4 5.90001Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M1 3.80001H13.7C14.3 3.80001 14.7 3.42501 14.7 3.05001C14.7 2.60001 14.2 2.30001 13.7 2.30001H1C0.4 2.30001 0 2.67501 0 3.05001C0 3.50001 0.4 3.80001 1 3.80001Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.9 13.8V10.2H22.5V13.8H18.9ZM17.4 14.6V9.40001C17.4 9.00001 17.7 8.70001 18.1 8.70001H23.3C23.7 8.70001 24 9.00001 24 9.40001V14.6C24 15 23.7 15.3 23.3 15.3H18.1C17.7 15.3 17.3 15 17.4 14.6Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M1 12.5H13.7C14.3 12.5 14.7 12.125 14.7 11.75C14.7 11.3 14.2 11 13.7 11H1C0.4 11 0 11.375 0 11.75C0 12.2 0.4 12.5 1 12.5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M18.9 22.5V18.9H22.5V22.5H18.9ZM17.4 23.3V18.1C17.4 17.7 17.7 17.4 18.1 17.4H23.3C23.7 17.4 24 17.7 24 18.1V23.3C24 23.7 23.7 24 23.3 24H18.1C17.7 24 17.3 23.7 17.4 23.3Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M1 21.2H13.7C14.3 21.2 14.7 20.825 14.7 20.45C14.7 20 14.2 19.7 13.7 19.7H1C0.4 19.7 0 20.075 0 20.45C0 20.825 0.4 21.2 1 21.2Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2640_44855", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), XR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2640_45013)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M23.3 6.5H18.1C17.7001 6.5 17.3 6.11194 17.4 5.72388V0.679105C17.4 0.291045 17.7001 0 18.1 0H23.3C23.7 0 24 0.291045 24 0.679105V5.72388C24 6.11194 23.7 6.5 23.3 6.5Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.7 4.05H1C0.400002 4.05 0 3.7 0 3.175C0 2.7375 0.400002 2.3 1 2.3H13.7C14.2 2.3 14.7 2.65 14.7 3.175C14.7 3.6125 14.3 4.05 13.7 4.05Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M18.1 15.2H23.3C23.7 15.2 24 14.9045 24 14.5106V9.38939C24 8.99545 23.7 8.7 23.3 8.7H18.1C17.7001 8.7 17.4 8.99545 17.4 9.38939V14.5106C17.3 14.9045 17.7001 15.2 18.1 15.2Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.7 12.75H1C0.400002 12.75 0 12.4 0 11.875C0 11.4375 0.400002 11 1 11H13.7C14.2 11 14.7 11.35 14.7 11.875C14.7 12.3125 14.3 12.75 13.7 12.75Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M18.1 23.9H23.3C23.7 23.9 24 23.6045 24 23.2106V18.0894C24 17.6954 23.7 17.4 23.3 17.4H18.1C17.7001 17.4 17.4 17.6954 17.4 18.0894V23.2106C17.3 23.6045 17.7001 23.9 18.1 23.9Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M13.7 21.45H1C0.400002 21.45 0 21.0125 0 20.575C0 20.1375 0.400002 19.7 1 19.7H13.7C14.2 19.7 14.7 20.05 14.7 20.575C14.7 21.0125 14.3 21.45 13.7 21.45Z",\n fill: "currentColor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2640_45013", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), QR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M19.9005 1.11443H4.09954V22.8856H19.9005V1.11443ZM2.98511 1.05473C2.98511 0.472218 3.45732 0 4.03983 0H19.9602C20.5427 0 21.015 0.472217 21.015 1.05473V22.9453C21.015 23.5278 20.5427 24 19.9602 24H4.03983C3.45732 24 2.98511 23.5278 2.98511 22.9453V1.05473ZM8.64839 4.97512H15.3517C15.7309 4.97512 16.0398 5.26434 16.0398 5.63184C16.0398 5.99934 15.7309 6.28856 15.3517 6.28856H8.64839C8.26921 6.28856 7.96023 5.99934 7.96023 5.63184C7.96023 5.26434 8.26921 4.97512 8.64839 4.97512ZM8.64839 9.15442H15.3517C15.7309 9.15442 16.0398 9.44364 16.0398 9.81114C16.0398 10.1786 15.7309 10.4679 15.3517 10.4679H8.64839C8.26921 10.4679 7.96023 10.1786 7.96023 9.81114C7.96023 9.44364 8.26921 9.15442 8.64839 9.15442ZM8.64839 13.3337H15.3517C15.7309 13.3337 16.0398 13.6229 16.0398 13.9904C16.0398 14.3579 15.7309 14.6472 15.3517 14.6472H8.64839C8.26921 14.6472 7.96023 14.3579 7.96023 13.9904C7.96023 13.6229 8.26921 13.3337 8.64839 13.3337ZM8.64839 17.513H15.3517C15.7309 17.513 16.0398 17.8022 16.0398 18.1697C16.0398 18.5372 15.7309 18.8265 15.3517 18.8265H8.64839C8.26921 18.8265 7.96023 18.5372 7.96023 18.1697C7.96023 17.8022 8.26921 17.513 8.64839 17.513Z",\n fill: "currentColor"\n }\n) }), GR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M21.3902 1.30808H19.7256V0.590415C19.7256 0.264353 19.4526 0 19.1158 0H4.88423C4.54743 0 4.27438 0.264334 4.27438 0.590415V1.30808H2.60985C2.27303 1.30808 2 1.57241 2 1.89849V3.90579C2 6.72845 3.91432 9.34712 7.00508 10.7666C7.79788 11.6365 8.72791 12.3036 9.74669 12.7056V13.6518C9.74669 14.7888 9.46511 15.8966 8.97417 16.6911C8.72746 17.0904 8.21375 17.7517 7.50069 17.7921H5.71673C5.3799 17.7921 5.10689 18.0564 5.10689 18.3825V23.4096C5.10689 23.7357 5.3799 24 5.71673 24H18.2833C18.6201 24 18.8931 23.7357 18.8931 23.4096V18.3825C18.8931 18.0564 18.6201 17.7921 18.2833 17.7921H16.4992C15.7862 17.7517 15.2725 17.0904 15.0258 16.6911C14.5349 15.8966 14.2533 14.7888 14.2533 13.6518V12.7056C15.272 12.3036 16.2021 11.6365 16.9948 10.7667C20.0856 9.34714 22 6.72845 22 3.90577V1.89849C22 1.57241 21.727 1.30808 21.3902 1.30808ZM3.21971 3.90577V2.48889H4.2744V3.15986C4.2744 5.05089 4.68376 6.82074 5.394 8.32934C4.01555 7.11497 3.21971 5.54649 3.21971 3.90577ZM17.6735 22.8192H6.3266V18.9729H7.38449C7.40023 18.9741 7.4161 18.9749 7.43214 18.9749C7.46476 18.9749 7.49728 18.9742 7.52974 18.9729H16.4703C16.5027 18.9742 16.5352 18.9749 16.5679 18.9749C16.5839 18.9749 16.5998 18.9741 16.6155 18.9729H17.6735V22.8192ZM13.9792 17.2973C14.0894 17.4757 14.2066 17.6406 14.3297 17.7921H9.67031C9.79343 17.6406 9.91062 17.4757 10.0209 17.2973C10.6306 16.3106 10.9664 15.0159 10.9664 13.6518V13.0495C11.3046 13.1081 11.6496 13.1386 12 13.1386C12.3504 13.1386 12.6954 13.1081 13.0336 13.0495V13.6518C13.0336 15.0159 13.3694 16.3106 13.9792 17.2973ZM12 11.9578C10.4786 11.9578 9.02468 11.2364 7.85302 9.9133C7.84471 9.9033 7.8361 9.89348 7.82708 9.884C7.70353 9.74302 7.58314 9.59537 7.46618 9.4411C6.19446 7.76322 5.49407 5.5325 5.49407 3.15986V1.18083H18.5059V3.15986C18.5059 5.53252 17.8056 7.76322 16.5339 9.4411C16.4169 9.59537 16.2965 9.743 16.173 9.88396C16.1639 9.89352 16.1553 9.9034 16.1469 9.91346C14.9752 11.2365 13.5213 11.9578 12 11.9578ZM20.7803 3.90577C20.7803 5.5465 19.9845 7.11501 18.606 8.32942C19.3162 6.8208 19.7256 5.05091 19.7256 3.15986V2.48889H20.7803V3.90577Z",\n fill: "currentcolor"\n }\n) }), jR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M0.786885 5.02857C1.18033 5.02857 1.4951 4.72381 1.4951 4.34285V1.37143H11.3312V22.6286H8.26229C7.86885 22.6286 7.5541 22.9333 7.5541 23.3143C7.5541 23.6952 7.86885 24 8.26229 24H15.8164C16.2098 24 16.5246 23.6952 16.5246 23.3143C16.5246 22.9333 16.2098 22.6286 15.8164 22.6286H12.7476V1.37143H22.5836V4.34285C22.5836 4.72381 22.8984 5.02857 23.2918 5.02857C23.6853 5.02857 24 4.72381 24 4.34285V0.68571C24 0.304757 23.6853 0 23.2918 0H0.708216C0.314773 0 0 0.304757 0 0.68571V4.34285C0.0786885 4.72381 0.393443 5.02857 0.786885 5.02857Z",\n fill: "currentColor"\n }\n) }), KR = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M20.4706 20.4706C20.549 20.3922 20.549 20.3922 20.549 20.3922C20.7059 20.2353 20.8628 20.1569 20.9412 20C22.902 17.8039 24 14.9804 24 12C24 5.41176 18.5882 0 12 0C9.01962 0 6.19608 1.09804 4 3.05882C3.84314 3.21568 3.68628 3.37255 3.60785 3.45098C3.60785 3.45098 3.52941 3.45098 3.52941 3.52941C3.52941 3.52941 3.52943 3.60783 3.451 3.60783C1.25492 5.80391 0 8.86274 0 12C0 18.5882 5.41178 24 12 24C15.2157 24 18.1961 22.6667 20.4706 20.4706ZM22.5882 12C22.5882 14.5098 21.6471 17.0196 20 18.902L5.17647 4.07842C7.05883 2.43136 9.56864 1.49019 12.0784 1.49019C17.8824 1.49019 22.5882 6.19607 22.5882 12ZM1.56863 12C1.56863 9.41176 2.50982 6.9804 4.15688 5.09804L18.9804 19.9216C17.098 21.5686 14.5883 22.5098 12.0784 22.5098C6.27453 22.5098 1.56863 17.8039 1.56863 12Z",\n fill: "currentColor"\n }\n) }), ZR = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 0C18.6 0 24 5.4 24 12C24 18.6 18.6 24 12 24C5.4 24 0 18.6 0 12C0 5.4 5.4 0 12 0ZM12 21.6C14.4 21.6 16.6 20.7 18.4 19.2L4.8 5.6C3.2 7.4 2.4 9.6 2.4 12C2.4 17.3 6.7 21.6 12 21.6ZM12 2.4C10.1 2.4 8.3 3 6.7 4L20 17.3C21 15.8 21.6 13.9 21.6 12C21.6 6.7 17.3 2.4 12 2.4Z",\n fill: "currentColor"\n }\n) }), JR = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ c1("g", { clipPath: "url(#clip0_2721_61460)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0 1.12424C0 0.503339 0.503337 0 1.12424 0H15.2994C15.9203 0 16.4236 0.503338 16.4236 1.12424V8.21182C16.4236 8.56276 16.1391 8.84725 15.7882 8.84725C15.4373 8.84725 15.1528 8.56276 15.1528 8.21182V1.27088H1.27088V15.1528H8.21182C8.56276 15.1528 8.84725 15.4373 8.84725 15.7882C8.84725 16.1391 8.56276 16.4236 8.21182 16.4236H1.12424C0.503338 16.4236 0 15.9203 0 15.2994V1.12424ZM15.7882 9.47047C16.1391 9.47047 16.4236 9.75497 16.4236 10.1059V12C16.4236 12.3509 16.1391 12.6354 15.7882 12.6354C15.4373 12.6354 15.1528 12.3509 15.1528 12V10.1059C15.1528 9.75497 15.4373 9.47047 15.7882 9.47047ZM15.7882 13.2587C16.1391 13.2587 16.4236 13.5432 16.4236 13.8941V15.2994C16.4236 15.9203 15.9203 16.4236 15.2994 16.4236H13.8941C13.5432 16.4236 13.2587 16.1391 13.2587 15.7882C13.2587 15.4373 13.5432 15.1528 13.8941 15.1528H15.1528V13.8941C15.1528 13.5432 15.4373 13.2587 15.7882 13.2587ZM9.47047 15.7882C9.47047 15.4373 9.75497 15.1528 10.1059 15.1528H12C12.3509 15.1528 12.6354 15.4373 12.6354 15.7882C12.6354 16.1391 12.3509 16.4236 12 16.4236H10.1059C9.75497 16.4236 9.47047 16.1391 9.47047 15.7882Z",\n fill: "currentcolor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.9998 22.8758C23.9998 23.4967 23.4964 24 22.8755 24L8.70036 24C8.07946 24 7.57612 23.4967 7.57612 22.8758L7.57612 15.7882C7.57612 15.4372 7.86062 15.1527 8.21156 15.1527C8.56251 15.1527 8.847 15.4372 8.847 15.7882L8.847 22.7291L22.7289 22.7291L22.7289 8.84724L15.7879 8.84724C15.437 8.84724 15.1525 8.56275 15.1525 8.2118C15.1525 7.86086 15.437 7.57637 15.7879 7.57637L22.8755 7.57637C23.4964 7.57637 23.9998 8.0797 23.9998 8.7006L23.9998 22.8758ZM8.21156 14.5295C7.86062 14.5295 7.57613 14.245 7.57613 13.8941L7.57613 12C7.57613 11.649 7.86062 11.3646 8.21156 11.3646C8.56251 11.3646 8.847 11.649 8.847 12L8.847 13.8941C8.847 14.245 8.56251 14.5295 8.21156 14.5295ZM8.21156 10.7413C7.86062 10.7413 7.57613 10.4568 7.57613 10.1059L7.57613 8.7006C7.57613 8.0797 8.07946 7.57637 8.70036 7.57637L10.1057 7.57637C10.4566 7.57637 10.7411 7.86086 10.7411 8.2118C10.7411 8.56275 10.4566 8.84724 10.1057 8.84724L8.847 8.84724L8.847 10.1059C8.847 10.4568 8.56251 10.7413 8.21156 10.7413ZM14.5293 8.2118C14.5293 8.56275 14.2448 8.84724 13.8938 8.84724L11.9998 8.84724C11.6488 8.84724 11.3643 8.56275 11.3643 8.2118C11.3643 7.86086 11.6488 7.57637 11.9998 7.57637L13.8938 7.57637C14.2448 7.57637 14.5293 7.86086 14.5293 8.2118Z",\n fill: "currentcolor"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_2721_61460", children: /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "currentColor" }) }) })\n] }), _R = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M31.7896 13.2918C34.8191 13.2918 37.3666 15.8753 37.7108 19.2068C37.7797 19.5467 38.0551 19.8187 38.3994 19.7507C38.7436 19.6827 39.019 19.4108 38.9502 19.0708C38.5371 15.0595 35.4387 12 31.7896 12C27.7961 12 24.56 15.5354 24.56 19.9547V21.7904L9.61968 21.7903C9.2754 21.7903 9 22.0622 9 22.4021V35.3879C9 35.7279 9.2754 35.9999 9.61968 35.9999H29.3803C29.7246 35.9999 30 35.7279 30 35.3879V22.4021C30 22.0622 29.7246 21.7903 29.3803 21.7903L25.7994 21.7904V19.9547C25.8682 16.2833 28.4846 13.2918 31.7896 13.2918ZM28.7606 34.7761H10.3082V23.014H28.7606V34.7761Z",\n fill: "currentColor"\n }\n) }), $R = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M11.9817 1.47793C12.1912 1.48365 12.3343 1.56659 12.4697 1.70118L18.0795 7.32423C18.2133 7.45729 18.2872 7.61456 18.2872 7.77912C18.2872 7.94368 18.2133 8.10095 18.0795 8.23401C17.9456 8.3671 17.7877 8.44035 17.6228 8.44035C17.4579 8.44035 17.2999 8.3671 17.1661 8.23401L12.575 3.66902V16.2692C12.575 16.6203 12.2921 16.9008 11.9403 16.9008C11.5962 16.9008 11.3056 16.6276 11.3056 16.3283V3.72819L6.71452 8.29318C6.64913 8.35819 6.57983 8.41084 6.49873 8.44668C6.41721 8.4827 6.32882 8.49951 6.22807 8.49951C6.12732 8.49951 6.03893 8.4827 5.95741 8.44668C5.87631 8.41084 5.80701 8.35819 5.74163 8.29318C5.60781 8.16012 5.55769 8.00585 5.55769 7.84129C5.55769 7.67674 5.60781 7.51646 5.74163 7.3834L11.4563 1.70118C11.5693 1.5888 11.7589 1.47185 11.9817 1.47793ZM22.7306 16.2105C22.7306 15.8593 23.0135 15.5788 23.3653 15.5788C23.5478 15.5788 23.7064 15.6692 23.8171 15.7878C23.9268 15.9053 24 16.0615 24 16.2105V21.8904C24 22.2415 23.7171 22.5221 23.3653 22.5221H0.634712C0.282953 22.5221 0 22.2415 0 21.8904V16.2105C0 15.8593 0.282954 15.5788 0.634712 15.5788C0.986471 15.5788 1.26942 15.8593 1.26942 16.2105V21.1996H22.7306V16.2105Z",\n fill: "currentColor"\n }\n) }), eB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.5684 9.706C17.0673 7.49522 14.7705 5.18901 11.9696 5.18901C10.1593 5.18901 8.40961 6.02864 7.36121 7.47979L7.35594 7.48709L7.34944 7.49332C7.16627 7.66884 6.95462 7.81419 6.66649 7.7462C6.37187 7.68979 6.02399 7.63463 5.6783 7.63463C3.23625 7.63463 1.26672 9.52792 1.26672 11.858C1.26672 14.188 3.23625 16.0813 5.6783 16.0813C6.02581 16.0813 6.31166 16.3492 6.31166 16.6923C6.31166 17.0354 6.02581 17.3034 5.6783 17.3034C2.54124 17.3034 0 14.8742 0 11.858C0 8.56962 3.05204 5.92068 6.58754 6.46182C7.91402 4.87234 9.94271 3.96692 12.029 3.96692C15.2451 3.96692 17.9353 6.00221 18.7486 8.90209C19.0436 8.85403 19.3311 8.80128 19.6261 8.80128C22.1091 8.80128 24.0588 10.7179 23.9986 12.9968C23.9979 15.3299 21.9911 17.2465 19.5668 17.2465C19.2193 17.2465 18.9334 16.9785 18.9334 16.6354C18.9334 16.2923 19.2193 16.0244 19.5668 16.0244C21.3572 16.0244 22.732 14.6987 22.732 13.0523C22.732 11.3491 21.2978 10.0234 19.5668 10.0234C19.2276 10.0234 18.8252 10.1325 18.4692 10.2462C18.1216 10.3572 17.6591 10.106 17.5684 9.706ZM12.5696 10.8741L15.3618 13.5494C15.4954 13.6775 15.5704 13.8299 15.5704 13.9907C15.5704 14.1514 15.4954 14.3038 15.3618 14.4319C15.2279 14.5602 15.0707 14.6301 14.9074 14.6301C14.744 14.6301 14.5869 14.5602 14.453 14.4319L12.7216 12.7728V19.422C12.7216 19.7651 12.444 20.0331 12.0965 20.0331C11.7567 20.0331 11.4549 19.7723 11.4549 19.4789V12.8297L9.72347 14.4888C9.58469 14.6218 9.38133 14.687 9.23939 14.687C9.03292 14.687 8.89031 14.6182 8.75531 14.4888C8.62164 14.3607 8.54671 14.2082 8.54671 14.0475C8.54671 13.8868 8.62164 13.7344 8.75531 13.6063L11.6065 10.8741C11.72 10.7653 11.8875 10.6733 12.0965 10.6784C12.2934 10.6831 12.4404 10.7503 12.5696 10.8741Z",\n fill: "currentcolor"\n }\n) }), tB = () => /* @__PURE__ */ c1("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 24", fill: "none", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.7 10.8C12.5 10.6 12.3 10.5 12 10.5C11.8 10.5 11.5 10.6 11.3 10.8L8.6 13.5C8.4 13.7 8.3 13.9 8.3 14.1C8.3 14.3 8.4 14.5 8.6 14.7C8.8 14.9 9 15 9.3 15C9.5 15 9.8 14.9 10 14.7L11.2 13.5V19.3C11.2 19.7 11.6 20.1 12.1 20.1C12.6 20.1 13 19.7 13 19.2V13.5L14.2 14.7C14.4 14.9 14.6 15 14.8 15C15 15 15.2 14.9 15.4 14.7C15.6 14.5 15.7 14.3 15.7 14.1C15.7 13.9 15.6 13.7 15.4 13.5L12.7 10.8Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M22.8 10.1C21.9 9.2 20.7 8.7 19.5 8.7C19.3 8.7 19.1 8.7 18.8 8.8C17.8 5.9 15.2 4 12 4C9.9 4 7.9 4.9 6.6 6.4C6.3 6.4 6.1 6.3 5.8 6.3C2.6 6.4 0 8.9 0 12C0 15.1 2.6 17.6 5.8 17.6C6.3 17.6 6.7 17.2 6.7 16.7C6.7 16.2 6.3 15.8 5.8 15.8C3.6 15.8 1.8 14.1 1.8 12C1.8 9.9 3.6 8.2 5.8 8.2C6.1 8.2 6.5 8.3 6.7 8.3C6.8 8.3 6.8 8.3 6.9 8.3C7.2 8.3 7.5 8.1 7.7 7.9C8.7 6.6 10.3 5.8 12 5.8C14.6 5.8 16.7 8 17.2 10C17.3 10.4 17.7 10.8 18.2 10.8C18.3 10.8 18.4 10.8 18.5 10.8C18.8 10.7 19.2 10.6 19.5 10.6C21 10.6 22.3 11.8 22.3 13.3C22.3 14.8 21.1 15.9 19.5 15.9C19 15.9 18.6 16.3 18.6 16.8C18.6 17.3 19 17.7 19.5 17.7C22 17.7 24.1 15.7 24.1 13.3C24 12 23.6 10.9 22.8 10.1Z",\n fill: "currentColor"\n }\n )\n] }), rB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M18.9212 9.61007C19.917 8.81339 20.4149 7.71795 20.4149 6.42334C20.4149 4.23247 18.6224 2.43994 16.3319 2.43994C14.1411 2.43994 12.249 4.23247 12.249 6.42334C12.249 7.61836 12.7469 8.81339 13.7427 9.61007C12.5477 10.0084 11.3527 10.7055 10.556 11.7014C10.3568 11.6018 10.2573 11.6018 10.0581 11.5022C11.0539 10.7055 11.5519 9.61007 11.5519 8.31546C11.5519 6.12459 9.75934 4.33206 7.46888 4.33206C5.27801 4.33206 3.38589 6.12459 3.38589 8.31546C3.48548 9.51048 3.9834 10.7055 4.97925 11.5022C1.9917 12.3984 0 14.9877 0 18.0748V20.9628C0 21.2615 0.298755 21.5603 0.59751 21.5603H14.5394C14.8382 21.5603 15.1369 21.2615 15.1369 20.9628V19.6682H23.4025C23.7012 19.6682 24 19.3694 24 19.0706V16.1827C23.9004 13.1951 21.8091 10.4067 18.9212 9.61007ZM11.751 12.1993C12.8465 11.1038 14.3402 10.5063 15.834 10.5063H17.029C20.2158 10.5063 22.805 13.0955 22.805 16.1827V18.4731H15.1369V18.0748C15.0373 15.6848 13.7427 13.4939 11.751 12.1993ZM13.5436 6.52293C13.5436 4.92957 14.8382 3.73455 16.4315 3.73455C18.0249 3.73455 19.3195 5.02915 19.3195 6.52293C19.3195 8.11629 18.0249 9.31131 16.4315 9.31131C14.8382 9.31131 13.5436 8.01671 13.5436 6.52293ZM6.97095 12.2989H8.16597C8.76348 12.2989 9.46058 12.3984 10.0581 12.5976C10.3568 12.6972 10.6556 12.7968 10.8548 12.996C12.7469 13.9918 13.8423 15.8839 13.8423 17.9752V20.2657H1.19502V17.9752C1.19502 14.8881 3.78423 12.2989 6.97095 12.2989ZM4.6805 8.41505C4.6805 6.82168 5.9751 5.62666 7.56846 5.62666C9.16183 5.62666 10.4564 6.92127 10.4564 8.41505C10.4564 10.0084 9.16183 11.2034 7.56846 11.2034C5.9751 11.2034 4.6805 9.90882 4.6805 8.41505Z",\n fill: "currentColor"\n }\n) }), nB = () => /* @__PURE__ */ c1("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12 18.0505C16.8532 18.0505 21.3824 15.8852 23.8715 12.3987L23.8903 12.3723V12.3525C23.9064 12.3359 23.9451 12.2961 23.9451 12.2266L23.9452 12.2113C23.9507 12.2052 23.9585 12.197 23.9715 12.1836L23.9999 12.1542V11.8867L24 11.881C24.0001 11.859 24.0004 11.8221 23.983 11.786C23.9739 11.7672 23.962 11.7523 23.952 11.7407L23.944 11.7317C23.9422 11.7137 23.938 11.693 23.9282 11.6727C23.919 11.6538 23.9072 11.6389 23.8971 11.6273C23.8887 11.6177 23.8784 11.6069 23.8674 11.5956C21.4316 8.11159 16.8494 5.94954 12 5.94954C6.33778 5.94954 1.79896 8.66932 6.8518e-05 11.9516C1.84132 15.5317 8.28218 18.0505 12 18.0505ZM1.48934 11.9516C3.72521 14.8892 7.7787 16.8285 12.0548 16.8285C16.3313 16.8285 20.3851 14.9947 22.6209 12.0567C20.3851 9.11867 16.3313 7.28478 12.0548 7.28478C7.77918 7.28478 3.77864 9.01234 1.48934 11.9516Z",\n fill: "currentColor"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.055 8.66932C10.2963 8.66932 8.82852 10.1908 8.82852 11.9999C8.82852 13.809 10.2963 15.3305 12.055 15.3305C13.8136 15.3305 15.2814 13.809 15.2814 11.9999C15.2814 10.1908 13.8136 8.66932 12.055 8.66932ZM10.0175 11.9999C10.0175 13.1921 10.9607 14.1087 12.055 14.1087C13.1475 14.1087 14.0924 13.1371 14.0924 11.9999C14.0924 10.8078 13.1492 9.89121 12.055 9.89121C10.9092 9.89121 10.0175 10.861 10.0175 11.9999Z",\n fill: "currentColor"\n }\n )\n] }), oB = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 11.8C24 11.7 24 11.7 24 11.7C21.4 8.2 16.8 6 12 6C6.3 6 1.8 8.7 0 12C1.8 15.6 8.3 18.1 12 18.1C16.8 18.1 21.4 15.9 23.9 12.4L24 12.3V11.8C24 11.9 24 11.9 24 11.8ZM12.1 15.4C10.3 15.4 8.9 13.9 8.9 12.1C8.9 10.3 10.4 8.8 12.1 8.8C13.9 8.8 15.3 10.3 15.3 12.1C15.3 13.9 13.8 15.4 12.1 15.4Z",\n fill: "currentColor"\n }\n) }), iB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0.000244141 17.3467L0.522877 18.392L4.79317 16.2568C7.25769 17.5721 10.1626 18.3582 12.2177 18.3582C16.9695 18.3582 21.404 16.2382 23.841 12.8245L23.8594 12.7987V12.7793C23.8752 12.7631 23.9131 12.7241 23.9131 12.6561L23.9132 12.6411C23.9186 12.635 23.9263 12.6271 23.939 12.6139L23.9668 12.5852V12.3232L23.9668 12.3177C23.967 12.2962 23.9673 12.26 23.9502 12.2247C23.9413 12.2062 23.9297 12.1916 23.9198 12.1803L23.912 12.1715C23.9103 12.1538 23.9062 12.1336 23.8965 12.1137C23.8876 12.0953 23.876 12.0806 23.8661 12.0693C23.8579 12.0598 23.8478 12.0493 23.8371 12.0382C22.8817 10.6717 21.589 9.51291 20.0774 8.6147L24.0002 6.6533L23.4776 5.60803L18.8053 7.94417C16.8178 7.02064 14.5493 6.51018 12.2177 6.51018C6.67382 6.51018 2.22986 9.17311 0.468573 12.3868C1.08247 13.5805 2.2186 14.6536 3.59384 15.5499L0.000244141 17.3467ZM5.97 15.6684C7.84779 16.6168 10.0283 17.1618 12.2714 17.1618C16.4585 17.1618 20.4275 15.3663 22.6166 12.4897C21.624 11.1854 20.2655 10.1033 18.6866 9.3101L15.1386 11.0841C15.3256 11.4977 15.4305 11.9556 15.4305 12.4341C15.4305 14.2054 13.9934 15.6951 12.2715 15.6951C11.0659 15.6951 9.99989 14.9648 9.46904 13.9189L5.97 15.6684ZM9.13101 12.7813L4.75347 14.9701C3.64306 14.2496 2.67963 13.376 1.92672 12.3868C4.16817 9.50896 8.0851 7.81751 12.2714 7.81751C14.0188 7.81751 15.7282 8.13024 17.2862 8.70376L14.4698 10.1119C13.8977 9.53408 13.1191 9.17311 12.2715 9.17311C10.5496 9.17311 9.1125 10.6628 9.1125 12.4341C9.1125 12.5512 9.11878 12.6671 9.13101 12.7813ZM10.5075 13.3997C10.8473 14.0612 11.5233 14.4988 12.2715 14.4988C13.3413 14.4988 14.2664 13.5476 14.2664 12.4341C14.2664 12.1364 14.2063 11.8562 14.099 11.6039L10.5075 13.3997ZM13.3265 10.6836L10.2893 12.2022C10.4003 11.1905 11.2283 10.3695 12.2715 10.3695C12.6537 10.3695 13.0171 10.4837 13.3265 10.6836Z",\n fill: "currentColor"\n }\n) }), aB = () => /* @__PURE__ */ A("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 24", fill: "none", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M24 12.2C24 12.1 24 12.1 24 12.1C23.2 10.9 22.2 9.9 20.9 9.1L23.6 7.8C24.1 7.6 24.2 7 24 6.6C23.7 6.2 23.4 6 23.1 6C23 6 22.8 6 22.7 6.1L19 8C16.9 7 14.5 6.4 12 6.4C6.3 6.4 1.8 9.1 0 12.4C0.7 13.7 1.9 14.8 3.4 15.8L0.5 17.2C0 17.4 -0.1 18 0.1 18.4C0.3 18.7 0.6 18.9 0.9 18.9C1 18.9 1.2 18.9 1.3 18.8L5.3 16.8C7.6 17.9 10.1 18.5 12 18.5C16.8 18.5 21.4 16.3 23.9 12.8L24 12.7V12.2ZM8.8 12.4C8.8 10.6 10.3 9.1 12 9.1C12.9 9.1 13.8 9.5 14.4 10.2L8.9 13C8.8 12.8 8.8 12.6 8.8 12.4ZM12.1 15.8C11.1 15.8 10.3 15.3 9.7 14.6L15.3 11.8C15.3 12 15.4 12.2 15.4 12.4C15.3 14.2 13.8 15.8 12.1 15.8Z",\n fill: "currentColor"\n }\n) }), sB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.9879 3.68144C13.5619 3.39638 12.9938 3.46767 12.5678 3.75273L7.38448 6.95966C6.39041 7.60105 5.25434 7.8861 4.18927 7.8861H2.76918C1.20707 7.8861 0 9.38267 0 11.2356V12.7321C0 14.585 1.27808 16.0816 2.76918 16.0816H3.55023C5.11233 16.0816 6.60342 16.5091 8.02352 17.4356L12.5678 20.2862C12.7808 20.4287 13.0648 20.5 13.3489 20.5C13.5619 20.5 13.8459 20.4287 14.0589 20.2862C14.6269 20.0011 14.911 19.3598 14.911 18.6471V5.24928C14.84 4.6079 14.4849 3.9665 13.9879 3.68144ZM13.4909 18.6471C13.4909 18.8609 13.4199 19.0747 13.2779 19.0747H13.2068L8.66255 16.2241C7.10045 15.2264 5.32535 14.7275 3.55023 14.7275H2.69817C1.91712 14.7275 1.20707 13.8011 1.20707 12.7321V11.2356C1.20707 10.1666 1.84611 9.24011 2.69817 9.24011H4.11826C5.46735 9.24011 6.81644 8.81253 8.02352 8.09988L13.2068 4.89296H13.2779L13.2779 4.89299C13.3489 4.96426 13.4909 5.10676 13.4909 5.32053V18.6471ZM20.5918 12.0197C20.5918 10.2381 19.4557 8.74151 17.8226 8.17139C17.4676 8.02886 17.1126 8.24268 16.9706 8.59901C16.8286 8.95533 17.0416 9.31167 17.3966 9.4542C18.5327 9.81052 19.2427 10.8795 19.2427 12.091C19.2427 13.3025 18.4617 14.3002 17.3966 14.7278C17.0416 14.8703 16.8286 15.2266 16.9706 15.583C17.0416 15.868 17.3256 16.0105 17.6096 16.0105H17.8226C19.4557 15.2979 20.5918 13.7301 20.5918 12.0197ZM18.0356 5.32063C18.1776 4.9643 18.5326 4.75052 18.8877 4.89305C21.9409 5.89076 23.929 8.74136 24 12.0195C24 15.2977 21.9409 18.1483 18.8877 19.146H18.6747C18.3907 19.146 18.1066 19.0035 18.0356 18.7185C17.9646 18.3621 18.1066 18.0058 18.4617 17.8633C20.9468 17.0081 22.6509 14.6563 22.6509 12.0195C22.6509 9.38274 20.9468 7.03099 18.4617 6.17581C18.1066 6.03328 17.8936 5.67695 18.0356 5.32063Z",\n fill: "currentColor"\n }\n) }), lB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M14.3169 3.75273C14.7514 3.46767 15.3307 3.39638 15.7652 3.68144C16.3445 3.9665 16.7065 4.6079 16.7065 5.24928V18.6471C16.7065 19.3598 16.4169 20.0011 15.8376 20.2862C15.6203 20.4287 15.3307 20.5 15.1135 20.5C14.8238 20.5 14.5342 20.4287 14.3169 20.2862L9.68255 17.4356C8.23431 16.5091 6.71367 16.0816 5.1206 16.0816H4.32404C2.80339 16.0816 1.5 14.585 1.5 12.7321V11.2356C1.5 9.38267 2.73098 7.8861 4.32404 7.8861H5.77228C6.85846 7.8861 8.01706 7.60105 9.03082 6.95966L14.3169 3.75273ZM15.1135 19.0747C15.2583 19.0747 15.3307 18.8609 15.3307 18.6471H15.4031V5.32053C15.4031 5.10679 15.2583 4.96429 15.1859 4.89301L15.1858 4.89296H15.1135L9.82738 8.09988C8.59638 8.81253 7.22055 9.24011 5.84472 9.24011H4.39648C3.52754 9.24011 2.8758 10.1666 2.8758 11.2356V12.7321C2.8758 13.8011 3.59995 14.7275 4.39648 14.7275H5.193C7.0033 14.7275 8.81361 15.2264 10.4067 16.2241L15.0411 19.0747H15.1135ZM18.807 8.52762C18.9518 8.1713 19.3139 7.95753 19.6759 8.10006C21.3414 8.67017 22.5 10.238 22.5 12.0908C22.5 13.8724 21.3414 15.369 19.6759 15.9391H19.4587C19.1691 15.9391 18.8794 15.7966 18.807 15.5115C18.6622 15.1552 18.8794 14.7989 19.2415 14.6564C20.3277 14.2288 21.1242 13.2311 21.1242 12.0196C21.1242 10.8081 20.4001 9.73912 19.2415 9.3828C18.8794 9.24027 18.6622 8.88394 18.807 8.52762Z",\n fill: "currentColor"\n }\n) }), cB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M12.4572 3.75273C12.8794 3.46767 13.4425 3.39638 13.8647 3.68144C14.4278 3.9665 14.7797 4.6079 14.7797 5.24928V18.6471C14.7797 19.3598 14.4982 20.0011 13.9351 20.2862C13.724 20.4287 13.4425 20.5 13.2314 20.5C12.9498 20.5 12.6683 20.4287 12.4572 20.2862L7.95288 17.4356C6.54529 16.5091 5.06733 16.0816 3.51898 16.0816H2.74478C1.26681 16.0816 0 14.585 0 12.7321V11.2356C0 9.38267 1.19643 7.8861 2.74478 7.8861H4.15237C5.20806 7.8861 6.33414 7.60105 7.31945 6.95966L12.4572 3.75273ZM13.2314 19.0747C13.3721 19.0747 13.4425 18.8609 13.4425 18.6471H13.5128V5.32053C13.5128 5.10674 13.3721 4.96424 13.3017 4.89297L13.3017 4.89296H13.2314L8.09365 8.09988C6.8972 8.81253 5.55999 9.24011 4.22277 9.24011H2.81518C1.97063 9.24011 1.33719 10.1666 1.33719 11.2356V12.7321C1.33719 13.8011 2.04101 14.7275 2.81518 14.7275H3.58934C5.34883 14.7275 7.10833 15.2264 8.65668 16.2241L13.1609 19.0747H13.2314ZM22.7332 9.45415C23.0147 9.16908 23.3666 9.16908 23.6481 9.45415C23.9296 9.73921 23.9296 10.1668 23.7889 10.3806L21.8886 12.3048L23.7889 14.229C24.0704 14.514 24.0704 14.8704 23.7889 15.1555C23.6481 15.298 23.437 15.3692 23.2962 15.3692C23.0851 15.3692 22.9443 15.298 22.8035 15.1555L20.9033 13.2313L19.0031 15.1555C18.8623 15.298 18.6512 15.3692 18.5104 15.3692C18.2993 15.3692 18.1585 15.298 18.0177 15.1555C17.7362 14.8704 17.7362 14.514 18.0177 14.229L19.918 12.3048L18.0177 10.3806C17.7362 10.0955 17.7362 9.73921 18.0177 9.45415C18.2992 9.16908 18.6511 9.16908 18.9327 9.45415L20.8329 11.3783L22.7332 9.45415Z",\n fill: "currentColor"\n }\n) }), pB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M17.077 0.539978V4.25998C19.7557 5.87998 21.5 8.75999 21.5 12C21.5 15.24 19.6935 18.12 17.0148 19.74V23.46C17.0148 23.76 16.7656 24 16.4541 24H7.54591C7.23443 24 6.98525 23.76 6.98525 23.46V19.74C4.30656 18.12 2.5 15.24 2.5 12C2.5 8.75999 4.30656 5.87998 6.98525 4.25998V0.539978C6.98525 0.239978 7.23443 0 7.54591 0H16.5164C16.8279 0 17.077 0.239978 17.077 0.539978ZM15.8934 1.13998H8.16886V3.71997C9.35246 3.17997 10.6607 2.87999 12.0312 2.87999C13.4017 2.87999 14.7098 3.17997 15.8934 3.71997V1.13998ZM8.10656 22.98H15.8311V20.4C14.6475 20.94 13.3394 21.24 11.9689 21.24C10.5984 21.24 9.29016 20.94 8.10656 20.4V22.98ZM3.6836 12.06C3.6836 16.5 7.42132 20.1 12.0312 20.1C16.641 20.1 20.3787 16.5 20.3787 12.06C20.3787 7.61998 16.641 4.01997 12.0312 4.01997C7.42132 4.01997 3.6836 7.61998 3.6836 12.06ZM12.0311 5.75977C12.3426 5.75977 12.5918 5.99977 12.5918 6.29976H12.6541V11.5195H18.0113C18.3227 11.5195 18.5719 11.7595 18.5719 12.0595C18.5719 12.3595 18.3227 12.5995 18.0113 12.5995H12.0311C11.7197 12.5995 11.4705 12.3595 11.4705 12.0595V6.29976C11.4705 5.99977 11.7197 5.75977 12.0311 5.75977Z",\n fill: "currentColor"\n }\n) }), dB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M1.4 1.4V9.6H6.6V1.4H1.4ZM1 0C0.447715 0 0 0.447715 0 1V10C0 10.5523 0.447715 11 1 11H7C7.55228 11 8 10.5523 8 10V1C8 0.447715 7.55228 0 7 0H1ZM1.4 22.6V14.4H12.6V22.6H1.4ZM0 14C0 13.4477 0.447715 13 1 13H13C13.5523 13 14 13.4477 14 14V23C14 23.5523 13.5523 24 13 24H1C0.447716 24 0 23.5523 0 23V14ZM17.4 22.6V14.4H22.6V22.6H17.4ZM16 14C16 13.4477 16.4477 13 17 13H23C23.5523 13 24 13.4477 24 14V23C24 23.5523 23.5523 24 23 24H17C16.4477 24 16 23.5523 16 23V14ZM11.4 9.6V1.4H22.6V9.6H11.4ZM10 1C10 0.447715 10.4477 0 11 0H23C23.5523 0 24 0.447715 24 1V10C24 10.5523 23.5523 11 23 11H11C10.4477 11 10 10.5523 10 10V1Z",\n fill: "currentColor"\n }\n) }), AB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M23.9998 20.3043C23.9998 20.6906 23.6851 20.9996 23.2916 20.9996C22.8982 20.9996 22.5835 20.6906 22.5835 20.3043V3.69526C22.5835 3.30901 22.8982 3 23.2916 3C23.6851 3 23.9998 3.30901 23.9998 3.69526V20.3043ZM17.6261 20.9997C18.0195 20.9997 18.3343 20.6907 18.3343 20.3044V6.47643C18.3343 6.09017 18.0195 5.78117 17.6261 5.78117C17.2327 5.78117 16.918 6.09017 16.918 6.47643V20.3044C16.918 20.6907 17.2327 20.9997 17.6261 20.9997ZM12.0392 8.48507C12.4327 8.48507 12.7474 8.79407 12.7474 9.18033V20.2273C12.7474 20.6136 12.4327 20.9226 12.0392 20.9226C11.6458 20.9226 11.3311 20.6136 11.3311 20.2273V9.18033C11.3311 8.79407 11.6458 8.48507 12.0392 8.48507ZM5.66553 11.9615V20.3047C5.66553 20.6909 5.98024 21 6.37367 21C6.7671 21 7.08187 20.6909 7.08187 20.3047V11.9615C7.08187 11.5753 6.7671 11.2663 6.37367 11.2663C5.98024 11.2663 5.66553 11.5753 5.66553 11.9615ZM0.708146 21C1.10158 21 1.41634 20.691 1.41634 20.3047V14.7426C1.41634 14.3564 1.10158 14.0473 0.708146 14.0473C0.314715 14.0473 0 14.3564 0 14.7426V20.3047C0 20.691 0.314715 21 0.708146 21Z",\n fill: "currentColor"\n }\n) }), uB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n d: "M12.1438 1C12.0719 1 12.0719 1 12 1C5.96081 1 1 5.96078 1 12C1 18.0392 5.96081 23 12 23C18.0392 23 23 18.0392 23 12C23 5.96078 18.183 1.0719 12.1438 1ZM21.634 11.281H17.2484C17.1046 7.97385 15.8104 4.88236 13.7255 2.43791C18.0392 3.22876 21.3464 6.82353 21.634 11.281ZM12.0719 21.2745C9.77125 18.9739 8.33332 15.8824 8.18953 12.6471H15.9543C15.7386 15.8824 14.3726 18.9739 12.0719 21.2745ZM8.18953 11.281C8.33332 8.04575 9.69935 4.95424 12.0719 2.65359C14.3726 4.95424 15.8105 8.04575 15.9543 11.281H8.18953ZM10.3464 2.50979C8.18953 4.95423 6.96734 8.04573 6.82355 11.3529H2.43791C2.72549 6.82351 6.03267 3.22874 10.3464 2.50979ZM2.43791 12.6471H6.82355C6.96734 15.9543 8.26143 19.0458 10.3464 21.4902C6.03267 20.6994 2.72549 17.1046 2.43791 12.6471ZM13.7255 21.4902C15.8823 19.0458 17.1046 15.9543 17.2484 12.6471H21.634C21.3464 17.1046 18.0392 20.6994 13.7255 21.4902Z",\n fill: "currentColor"\n }\n) }), bB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M0 8.18029C0 3.65071 3.64043 0 8.15729 0C12.6741 0 16.3146 3.6507 16.4494 8.24789C16.4494 10.2761 15.7079 12.169 14.4944 13.5887L16.5843 15.6845L16.9213 15.3465C17.191 15.0761 17.5281 15.0761 17.7977 15.3465L23.7977 21.3634C24.0674 21.6338 24.0674 21.9718 23.7977 22.2423L23.4607 22.5803L23.7977 22.9183C24.0674 23.1887 24.0674 23.5268 23.7977 23.7972C23.6629 23.9324 23.5281 24 23.3258 24C23.1236 24 22.9887 23.9324 22.8539 23.7972L22.5168 23.4592L22.1798 23.7972C22.0449 23.9324 21.8427 24 21.7079 24C21.5056 24 21.3708 23.9324 21.236 23.7972L15.2359 17.7803C15.1011 17.6451 15.0337 17.4423 15.0337 17.3071C15.0337 17.1042 15.1011 16.969 15.2359 16.8338L15.573 16.4958L13.4831 14.4C12 15.6169 10.1798 16.3606 8.15729 16.3606C3.64043 16.3606 0 12.7099 0 8.18029ZM21.9775 22.1071L22.3146 21.769L17.1236 16.6986L16.5169 17.3071L21.6404 22.4451L21.9775 22.1071ZM8.15729 1.28451C4.38201 1.28451 1.28087 4.39437 1.28087 8.18029C1.28087 11.9662 4.38201 15.0761 8.15729 15.0761C11.9326 15.0761 15.0337 11.9662 15.0337 8.18029C15.0337 4.39437 11.9326 1.28451 8.15729 1.28451ZM8.76392 7.50417H10.6515C11.056 7.50417 11.2582 7.84219 11.2582 8.18021C11.2582 8.51823 10.9886 8.78864 10.6515 8.78864H8.76392V10.6139C8.76392 10.952 8.49425 11.2224 8.15718 11.2224C7.82011 11.2224 7.55048 10.952 7.55048 10.6139V8.72104H5.66285C5.32578 8.72104 5.05615 8.45062 5.05615 8.11261C5.05615 7.77459 5.32578 7.50417 5.66285 7.50417H7.55048V5.61127C7.55048 5.27325 7.82011 5.00284 8.15718 5.00284C8.49425 5.00284 8.76392 5.27325 8.76392 5.61127V7.50417Z",\n fill: "currentColor"\n }\n) }), hB = () => /* @__PURE__ */ A("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ A(\n "path",\n {\n fillRule: "evenodd",\n clipRule: "evenodd",\n d: "M13.4237 14.4676C11.9322 15.6845 10.1017 16.4282 8.0678 16.4282C3.52543 16.4282 0 12.7099 0 8.18028C0 3.6507 3.66108 0 8.20344 0C12.7458 0 16.4068 3.6507 16.4068 8.18028C16.4068 10.2084 15.661 12.1014 14.4407 13.5211L16.5424 15.6169L16.8813 15.2789C17.0847 15.0761 17.5593 15.0761 17.7627 15.2789L23.7966 21.2958C23.9322 21.431 24 21.6338 24 21.769C24 21.9718 23.9322 22.107 23.7966 22.2423L23.4576 22.5803L23.7966 22.9183C24.0678 23.1887 24.0678 23.5268 23.7966 23.7972C23.661 23.9324 23.5254 24 23.322 24C23.1186 24 22.9831 23.9324 22.8475 23.7972L22.5085 23.4592L22.1695 23.7972C22.0339 23.9324 21.8983 24 21.6949 24C21.4915 24 21.3559 23.9324 21.2203 23.7972L15.1864 17.7803C14.9152 17.5099 14.9152 17.1718 15.1864 16.9014L15.5254 16.5634L13.4237 14.4676ZM22.3051 21.769L17.1525 16.631L16.8813 16.9014L16.5424 17.2394L21.6949 22.3775L22.3051 21.769ZM14.9831 8.18028C14.9831 4.39437 11.8644 1.28451 8.0678 1.28451C4.27119 1.28451 1.15259 4.39437 1.15259 8.18028C1.15259 11.9662 4.27119 15.0761 8.0678 15.0761C11.8644 15.0761 14.9831 11.9662 14.9831 8.18028ZM10.5762 8.85631H5.55939C5.22041 8.85631 4.94922 8.58589 4.94922 8.24787C4.94922 7.90985 5.22041 7.63943 5.55939 7.63943H10.5762C10.9152 7.63943 11.1863 7.90985 11.1863 8.24787C11.1863 8.58589 10.9152 8.85631 10.5762 8.85631Z",\n fill: "currentColor"\n }\n) }), Xf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n Alert: aw,\n AlertFilled: sw,\n ArrowBottom: lw,\n ArrowLeft: cw,\n ArrowRight: pw,\n ArrowUp: dw,\n Attachment: Aw,\n BarGraph: uw,\n BarGraphFilled: bw,\n BatteryEmpty: hw,\n BatteryFull: Mw,\n Bell: fw,\n BellFilled: gw,\n BellOff: zw,\n Bin: Cw,\n BinFilled: Ow,\n BinOculars: vw,\n Blocks: mw,\n Break: yw,\n BriefCaseBack: Lw,\n BriefCaseBackFilled: ww,\n BriefCaseFront: qw,\n Broadcast: xw,\n Bubbles: Rw,\n BubblesFilled: Bw,\n Calendar: Ww,\n Camera: Ew,\n Case: Sw,\n Cases: kw,\n Chains: Nw,\n CheckMark: Iw,\n CheckMarkFilled: Tw,\n ChevronDown: Dw,\n ChevronDownDropdown: Hw,\n ChevronLeft: Vw,\n ChevronLeftThick: Yw,\n ChevronRight: Fw,\n ChevronRightThick: Uw,\n ChevronUp: Xw,\n ChevronUpDropdown: Pw,\n Close: Qw,\n CloudFilled: jw,\n Code: Gw,\n CogWheel: Kw,\n CogWheelFilled: Zw,\n ColumnOptionFilled: _w,\n ColumnOptions: Jw,\n Columns: $w,\n ColumnsFilled: eq,\n Combine: tq,\n Corporate: rq,\n Cross: nq,\n CrossFilled: oq,\n DarkModeSwitcherFilled: aq,\n Decrease: iq,\n Destination: sq,\n Dialogue: lq,\n DialogueFilled: cq,\n Disabled: pq,\n DisabledFilled: dq,\n Disconnect: Aq,\n DocFile: uq,\n Document: bq,\n DocumentFilled: hq,\n Dollar: Mq,\n DoubleChevronLeft: fq,\n DoubleChevronRight: gq,\n Download: zq,\n DownloadCloud: Oq,\n DownloadCloudFilled: mq,\n DownloadFilled: Cq,\n Error: vq,\n ErrorFilled: yq,\n Excel: Lq,\n ExternalLink: wq,\n Film: qq,\n FilmBig: xq,\n Filter: Rq,\n FilterFilled: Bq,\n Filters: Wq,\n FiltersFilled: Eq,\n FirstPage: Sq,\n Flag: kq,\n FlagFilled: Nq,\n Folder: Iq,\n FolderOpen: Tq,\n FullScreen: Dq,\n Graph: Hq,\n GraphFilled: Pq,\n HeadPhones: Fq,\n Heart: Uq,\n Help: Yq,\n Help2: Qq,\n HelpFilled: Xq,\n History: Gq,\n Home: jq,\n HomeFilled: Kq,\n Image: Zq,\n Increase: Jq,\n Info: _q,\n InfoFilled: $q,\n Journal: ex,\n JournalFilled: tx,\n Label: rx,\n LabelFilled: nx,\n LastPage: ox,\n LightBulb: ix,\n LightModeSwitcherFilled: ax,\n List: sx,\n ListFilled: lx,\n Loader: cx,\n Location: px,\n LockClosed: dx,\n LockClosedFilled: Ax,\n LockOpened: ux,\n LockOpenedFilled: bx,\n LogOut: hx,\n MailClosed: Mx,\n MailOpened: fx,\n Map: gx,\n Maximize: zx,\n Menu: Cx,\n MenuDown: Ox,\n MenuDownFilled: mx,\n MenuLeft: vx,\n MenuMiddle: yx,\n MenuRight: Lx,\n Merge: wx,\n Microphone: qx,\n Minimize: xx,\n Minus: Rx,\n Monologue: Bx,\n MonologueFilled: Wx,\n Mouse: Ex,\n Move: Sx,\n MoveDots: kx,\n MoveDotsFilled: Nx,\n Normal: Ix,\n Office: Tx,\n OfficeFilled: Dx,\n OrientationHorizontal: Hx,\n OrientationHorizontalFilled: Px,\n OrientationVertical: Vx,\n OrientationVerticalFilled: Fx,\n Pair: Ux,\n Paper: Yx,\n Pause: Xx,\n Payment: Qx,\n PdfFile: Gx,\n PenciWrite: Kx,\n Pencil: jx,\n Percentage: Zx,\n Pie: Jx,\n PieFilled: _x,\n Play: $x,\n Plus: eR,\n Power: tR,\n Print: rR,\n Profile: nR,\n ProfileFilled: oR,\n ProfilePlus: iR,\n ProfilePlusFilled: aR,\n Recent: dR,\n Reconciliation: sR,\n Refresh: lR,\n RefreshFilled: cR,\n Reset: pR,\n RowOptions: AR,\n RowOptionsFilled: uR,\n Save: bR,\n SaveFilled: hR,\n Scheme: MR,\n Screen: fR,\n Search: gR,\n SearchFilled: zR,\n Send: CR,\n Share: OR,\n Shield: mR,\n ShieldFilled: vR,\n SideArrows: yR,\n Smile: LR,\n Sort: wR,\n Star: qR,\n StarFilled: xR,\n StarSolid: RR,\n Stereo: BR,\n Stop: WR,\n StopWatch: ER,\n Success: SR,\n SuccessFilled: kR,\n Survey: NR,\n SurveyFilled: IR,\n Target: TR,\n Team: DR,\n TeamFilled: HR,\n ThumbsDown: PR,\n ThumbsUp: VR,\n Time: FR,\n TimeFilled: UR,\n ToDo: YR,\n ToDoFilled: XR,\n TooltipInfo: QR,\n Trophy: GR,\n Typography: jR,\n Unavailable: KR,\n UnavailableFilled: ZR,\n Uncombine: JR,\n Unlocked: _R,\n Upload: $R,\n UploadCloud: eB,\n UploadCloudFilled: tB,\n Users: rB,\n View: nB,\n ViewFilled: oB,\n ViewOff: iB,\n ViewOffFilled: aB,\n VolumeMax: sB,\n VolumeMin: lB,\n VolumeOff: cB,\n Watch: pB,\n WiFi: AB,\n Widgets: dB,\n WidgetsFilled: Vq,\n World: uB,\n ZoomIn: bB,\n ZoomOut: hB\n}, Symbol.toStringTag, { value: "Module" })), lt = {\n XXXXSMALL: "xxxxs",\n XXXSMALL: "xxxs",\n XXSMALL: "xxs",\n XSMALL: "xs",\n SMALL: "sm",\n MEDIUM: "md",\n LARGE: "lg",\n EXTRA_LARGE: "xl"\n}, z2 = {\n HORIZONTAL: "horizontal",\n VERTICAL: "vertical"\n}, Qf = {\n LEFT: "left",\n CENTER: "center",\n RIGHT: "right",\n TOP: "up"\n};\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n min-width: 100vw;\n`;\nconst MB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ color: e = "inherit" }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n line-height: 0;\n color: ${e};\n\n > svg {\n path: {\n fill: currentColor;\n }\n }\n `\n), Ia = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(\n MB\n)(({ size: e, theme: { itemSize: t } }) => {\n let r;\n switch (e) {\n case lt.XXXXSMALL:\n r = t.xxxxs;\n break;\n case lt.XXXSMALL:\n r = t.xxxs;\n break;\n case lt.XXSMALL:\n r = t.xxs;\n break;\n case lt.XSMALL:\n r = t.xs;\n break;\n case lt.SMALL:\n r = t.sm;\n break;\n case lt.LARGE:\n r = t.lg;\n break;\n case lt.EXTRA_LARGE:\n r = t.xl;\n break;\n case lt.MEDIUM:\n default:\n r = t.md;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${r};\n box-sizing: content-box;\n\n > svg {\n width: ${r};\n }\n `;\n}), fB = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Ia)``;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: inline-flex;\n height: 100vh;\n flex-direction: column;\n flex-wrap: wrap;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n min-width: 250px;\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n .icon-system {\n margin-right: 8px;\n }\n\n .icon-detailed {\n width: ${({ theme: e }) => e.itemSize.sm};\n margin: 0 16px 8px 0;\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)`\n font-size: 14px;\n`;\nfunction J4(e) {\n return (t) => (r) => {\n const { name: n, ...o } = r, i = String(n), a = e[n];\n if (!a)\n throw new Error(\n `There is no image available with such name: [${i}].`\n );\n return /* @__PURE__ */ A(t, { ...o, children: /* @__PURE__ */ A(a, { fill: "currentColor" }) });\n };\n}\nfunction gB(e) {\n var t, r, n, o, i, a;\n return /* @__PURE__ */ A(\n Ia,\n {\n role: "img",\n "aria-label": (n = (r = (t = e == null ? void 0 : e.children) == null ? void 0 : t._owner) == null ? void 0 : r.memoizedProps) != null && n.name ? (a = (i = (o = e == null ? void 0 : e.children) == null ? void 0 : o._owner) == null ? void 0 : i.memoizedProps) == null ? void 0 : a.name : "",\n className: "icon-system",\n ...e\n }\n );\n}\nconst f0 = J4(Xf)(gB), zB = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().ul)`\n padding: 0;\n margin: 0;\n`, o8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n height: calc(${e.GLOBAL_ITEM_HEIGHT_CONDENSED} + 6px);\n padding: 0 ${e.spacings.sp8} 0 ${e.spacings.sp12};\n color: ${e.colors.textIcon.textHighemphasis};\n cursor: pointer;\n `\n), gl = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n height: 32px;\n width: 32px;\n min-width: 32px;\n display: flex;\n justify-content: center;\n align-items: center;\n`, _d = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n flex-grow: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n`, i8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-weight: ${e.fontWeight.medium};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n `\n), Zs = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-weight: ${e.fontWeight.light};\n font-size: ${e.typography.t12};\n color: ${e.colors.textIcon.textMediumemphasis};\n margin: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n `\n), $d = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ $isAlign: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n gap: 8px;\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-grow: 1;\n `}\n `\n), eA = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-weight: ${e.fontWeight.light};\n font-size: ${e.typography.t12};\n color: ${e.colors.textIcon.textLowemphasis};\n padding: 0 4px ${e.spacings.sp8} ${e.spacings.sp12};\n margin: 0;\n `\n), a8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, height: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: ${t}px;\n transition: ${e.transitions.base};\n overflow: hidden;\n `\n), tA = styled_components__WEBPACK_IMPORTED_MODULE_1___default().li(\n ({ theme: e, $isExpanded: t, $isDisabled: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n list-style-type: none;\n font-size: ${e.typography.t14};\n line-height: ${e.lineHeight.lh22};\n background-color: ${e.colors.backgrounds.bgPrimary};\n border-radius: ${e.borderRadius.base};\n transition: ${e.transitions.base};\n border: 1px solid ${e.colors.border.borderPrimary};\n\n &:hover {\n transition: ${e.transitions.base};\n border-color: ${!t && !r && e.colors.border.borderPrimary};\n background-color: ${!t && !r && e.colors.backgrounds.bgHoverPrimary};\n }\n\n ${gl} {\n .icon-system {\n pointer-events: none;\n transform: rotate(90deg);\n transition: ${e.transitions.base};\n }\n }\n\n ${!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border-color: ${e.colors.border.borderPrimary};\n\n ${gl} {\n .icon-system {\n transform: rotate(0deg);\n }\n }\n\n ${a8} {\n height: 0;\n }\n `}\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.colors.backgrounds.bgDisabledPrimary};\n border-color: ${e.colors.border.borderDisabledOnbg};\n\n ${o8} {\n cursor: default;\n }\n\n ${i8}, .icon-system {\n color: ${e.colors.textIcon.textDisabledOnbg};\n user-select: none;\n }\n `}\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 520px;\n`;\nfunction fA1(e) {\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), [n, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), i = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)([]), { data: a, isMulti: s, onClick: l, isExpand: c } = e, p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (b) => {\n const M = b && b.offsetHeight;\n M && r(M);\n },\n [r]\n ), d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (b) => {\n i.current && i.current[b] && p(i.current[b]), o(n !== b || n === -1 ? b : -1);\n },\n [o, n, i, p]\n ), u = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (b) => {\n i.current && i.current[b] && p(i.current[b]), o(b);\n },\n [o, n, i, p]\n ), h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (s)\n return a == null ? void 0 : a.map(\n ({\n iconLeft: b,\n title: M,\n helperText: C,\n alignHelperText: g,\n content: f,\n isDisabled: O,\n hideExpandedHelperText: m\n }, v) => /* @__PURE__ */ c1(\n tA,\n {\n $isExpanded: n === v,\n $isDisabled: O,\n children: [\n /* @__PURE__ */ c1(o8, { onClick: () => !O && d(v), children: [\n b && /* @__PURE__ */ A(f0, { name: b, size: "xxxs" }),\n /* @__PURE__ */ A(_d, { children: /* @__PURE__ */ c1(\n $d,\n {\n $isAlign: g ?? !1,\n children: [\n /* @__PURE__ */ A(i8, { title: M, children: M }),\n m && C && n != v && /* @__PURE__ */ A(Zs, { children: C }),\n C && (m == null || !m) && /* @__PURE__ */ A(Zs, { children: C })\n ]\n }\n ) }),\n /* @__PURE__ */ A(gl, { children: /* @__PURE__ */ A(f0, { name: "ChevronRight", size: "xxxs" }) })\n ] }),\n !O && /* @__PURE__ */ A(a8, { height: t, children: /* @__PURE__ */ A(eA, { ref: (y) => i.current[v] = y, children: f }) })\n ]\n },\n v\n )\n );\n if (s)\n return null;\n {\n let b = [a];\n return b == null ? void 0 : b.map(\n ({\n iconLeft: M,\n title: C,\n helperText: g,\n alignHelperText: f,\n content: O,\n isDisabled: m,\n hideExpandedHelperText: v\n }, y) => /* @__PURE__ */ c1(\n tA,\n {\n $isExpanded: !!c,\n $isDisabled: m,\n children: [\n /* @__PURE__ */ c1(o8, { onClick: () => !m && l && l(), children: [\n M && /* @__PURE__ */ A(f0, { name: M, size: "xxxs" }),\n /* @__PURE__ */ A(_d, { children: /* @__PURE__ */ c1(\n $d,\n {\n $isAlign: f ?? !1,\n children: [\n /* @__PURE__ */ A(i8, { title: C, children: C }),\n v && g && n != y && /* @__PURE__ */ A(Zs, { children: g }),\n g && (v == null || !v) && /* @__PURE__ */ A(Zs, { children: g })\n ]\n }\n ) }),\n /* @__PURE__ */ A(gl, { children: /* @__PURE__ */ A(f0, { name: "ChevronRight", size: "xxxs" }) })\n ] }),\n !m && /* @__PURE__ */ A(a8, { height: t, children: /* @__PURE__ */ A(eA, { ref: (z) => i.current[y] = z, children: O }) })\n ]\n },\n y\n )\n );\n }\n }, [\n a,\n n,\n i,\n t,\n d,\n u,\n c,\n s\n ]);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i.current && i.current[0] && p(i.current[0]);\n }, [i, p]), /* @__PURE__ */ A(zB, { children: h() });\n}\nconst E7 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { typography: e, fontWeight: t, colors: r }, fontSize: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n .input-container {\n width: 100%;\n }\n & label {\n display: none;\n }\n & input {\n max-height: 22px;\n padding: 5px 8px;\n background-color: ${r.dataTable.dataTableBgFilter};\n width: 100%;\n font-size: ${n === "xs" ? e.t10 : "11px"};\n font-weight: ${t.light};\n border: 1px solid ${r.border.borderTertiary};\n }\n\n & .input-clear-btn {\n top: 2px;\n }\n `\n), S7 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().input(\n ({ theme: e, isError: t, isReadOnly: r, required: n, $hasValue: o, type: i }) => {\n const {\n colors: a,\n borderRadius: s,\n typography: l,\n transitions: c,\n fontFamily: p,\n fontWeight: d,\n spacings: u,\n GLOBAL_ITEM_HEIGHT_CONDENSED: h\n } = e;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n width: 100%;\n height: ${h};\n border: 1px solid ${t ? a.border.borderError : "transparent"};\n border-radius: ${s.base};\n background-color: ${a.field.fieldBgDefault};\n font-family: ${p.base};\n font-size: ${l.t12};\n font-weight: ${d.light};\n color: ${t ? a.textIcon.textError : a.textIcon.textPrimary};\n padding: 0 ${i == "password" ? "61px" : "28px"} 0 ${u.sp8};\n transition: ${c.base};\n outline: none;\n box-sizing: border-box;\n border-left: 2px solid\n ${n && !t ? a.border.borderSecondary : n && t ? a.border.borderError : "none"} !important;\n\n /* Clear Icon */\n position: relative;\n\n &:after {\n content: \'\\u00d7\';\n position: absolute;\n right: 10px;\n top: 50%;\n transform: translateY(-50%);\n font-size: 16px;\n height: 40px;\n width: 40px;\n cursor: pointer;\n color: ${a.grey};\n opacity: ${o ? 1 : 0};\n pointer-events: ${o ? "auto" : "none"};\n transition: opacity 0.2s ease-in-out;\n }\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border: 1px solid ${a.border.borderTertiary};\n pointer-events: none;\n background-color: ${a.backgrounds.bgPrimary} !important;\n color: ${a.grey};\n `}\n\n &:hover:not(:disabled):not(:focus) {\n /* border-color: ${!t && a.pinkSwan}; */\n background-color: ${a.field.fieldBgHover};\n }\n\n ${!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:focus {\n border: 1px solid ${a.border.borderSecondary};\n color: ${a.textIcon.textHighemphasis};\n &:hover {\n /* background-color: ${a.field.fieldBgHover}; */\n border: 1px solid\n ${t ? a.border.borderError : a.field.fieldBorderActive};\n border-left: 2px solid\n ${n && !t ? a.field.fieldBorderActive : n && t ? a.border.borderError : "none"};\n }\n }\n `}\n\n &:disabled {\n border-color: transparent;\n // new disabled color\n background-color: ${a.backgrounds.bgDisabledPrimary};\n color: ${a.textIcon.textDisabledOnbg};\n //\n\n border-left: 2px solid\n ${n ? a.border.borderReadonly : "transparent"};\n font-weight: ${d.light};\n\n &,\n &::placeholder {\n color: ${a.textIcon.textDisabledOnbg};\n }\n }\n\n &::placeholder {\n color: ${a.field.fieldTextPlaceholder};\n font-size: ${l.t12};\n font-weight: ${d.regular};\n }\n\n &:active {\n border: 1px solid\n ${t ? a.field.fieldBorderActive : a.border.borderError};\n border-left: 2px solid\n ${n && !t ? a.backgrounds.bgReadOnly : n && t ? a.border.borderError : "none"};\n }\n &::-webkit-contacts-auto-fill-button,\n &::-webkit-credentials-auto-fill-button {\n display: none;\n visibility: hidden;\n pointer-events: none;\n position: absolute;\n right: 0;\n }\n & {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n }\n &::-ms-reveal,\n &::-ms-clear {\n display: none;\n }\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border-color: ${a.field.fieldBorderActive};\n `}\n `;\n }\n), rA = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(S7)``, CB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, isError: t, type: r }) => {\n const { colors: n } = e;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n top: 6px;\n right: ${r == "password" ? 28 : 8}px;\n cursor: pointer;\n background: transparent;\n z-index: 2;\n pointer-events: ${t ? "none" : "initial"};\n margin: 4px 0;\n &:hover {\n .icon-system {\n color: ${n.backgrounds.bgHoverSecondary};\n transition: 0.3s all ease-in-out;\n }\n }\n .icon-system svg {\n width: 12px;\n height: 12px;\n }\n .input-clear-btn {\n top: 2px;\n }\n `;\n }\n), OB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ isError: e, isDisabled: t, $isTableInput: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n top: ${r ? 1 : 6}px;\n right: 10px;\n cursor: ${t ? "default" : "pointer"};\n background: transparent;\n z-index: 2;\n pointer-events: ${e ? "none" : "initial"};\n margin: 4px 0;\n .icon-system svg {\n width: 12px;\n height: 12px;\n }\n `\n), mB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ $isTableInput: e, theme: { colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n & .input-clear-btn {\n top: 1.5px;\n }\n `}\n ${E7} {\n & input {\n border: 1px solid transparent;\n &:hover:not(:disabled):not(:focus) {\n border: 1px solid ${t.border.borderPrimary};\n }\n &:focus:not(:disabled) {\n border: 1px solid ${t.border.borderSecondary};\n }\n }\n }\n `\n);\nfunction vB(e, t) {\n const [r, n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("password"), [o, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), a = (l) => {\n l || n(r === "text" ? "password" : "text");\n }, s = e.value !== "" && // props.hasValue &&\n !e.disabled && !e.isReadOnly;\n return /* @__PURE__ */ c1(\n mB,\n {\n className: "input-container",\n $isTableInput: e == null ? void 0 : e.isTableInput,\n children: [\n e != null && e.isTableInput ? /* @__PURE__ */ A(E7, { children: /* @__PURE__ */ A(\n rA,\n {\n ref: t,\n ...e,\n id: e.$inputId,\n type: (e == null ? void 0 : e.type) === "password" ? r : e == null ? void 0 : e.type,\n $isError: e.isError,\n $isReadOnly: e.isReadOnly,\n onMouseOver: () => {\n i(!0);\n },\n onMouseOut: () => {\n i(!1);\n }\n }\n ) }) : /* @__PURE__ */ A(\n rA,\n {\n ref: t,\n ...e,\n id: e.$inputId,\n type: (e == null ? void 0 : e.type) === "password" ? r : e == null ? void 0 : e.type,\n $isError: e.isError,\n $isReadOnly: e.isReadOnly,\n onMouseOver: () => {\n i(!0);\n },\n onMouseOut: () => {\n i(!1);\n }\n }\n ),\n s && !e.hideClearButton && /* @__PURE__ */ A(\n CB,\n {\n onClick: e.handleClearFn,\n $isError: e.isError,\n type: e == null ? void 0 : e.type,\n className: "input-clear-btn",\n children: /* @__PURE__ */ A(\n "div",\n {\n onMouseOver: () => {\n i(!0);\n },\n onMouseOut: () => {\n i(!1);\n },\n children: /* @__PURE__ */ A(\n f0,\n {\n name: e.isError && !o ? "AlertFilled" : "Close",\n size: "xxs",\n color: e.isError ? "#D7373F !important" : "#A6A6AB"\n }\n )\n }\n )\n }\n ),\n (e == null ? void 0 : e.type) === "password" && /* @__PURE__ */ A(\n OB,\n {\n onClick: () => a(e == null ? void 0 : e.disabled),\n isDisabled: e == null ? void 0 : e.disabled,\n $isTableInput: e == null ? void 0 : e.isTableInput,\n children: /* @__PURE__ */ A(\n f0,\n {\n name: r === "text" ? "ViewOff" : "View",\n size: "xxs",\n color: "#797980"\n }\n )\n }\n )\n ]\n }\n );\n}\nconst Gf = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(vB), yB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, spacings: t }, isError: r, $isTableInput: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n color: ${e.grey};\n\n .icon-system {\n position: absolute;\n top: 50%;\n transform: translate(0, -50%);\n z-index: 1;\n color: ${e.placeholerGrey};\n &[data-position=\'left\'] {\n color: ${r && e.error};\n left: ${t.sp12};\n }\n\n &[data-position=\'right\'] {\n right: ${t.sp8};\n }\n }\n\n .icon-flag {\n position: absolute;\n top: 50%;\n transform: translate(0, -50%);\n z-index: 1;\n\n img {\n width: ${t.sp16};\n height: ${t.sp16};\n }\n &[data-position=\'left\'] {\n color: ${r && e.error};\n left: ${t.sp8};\n }\n\n &[data-position=\'right\'] {\n right: ${t.sp8};\n }\n }\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .input-clear-btn {\n right: 40px;\n top: 7px;\n }\n `}\n\n ${!n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .input-clear-btn {\n right: 40px;\n top: 12px;\n }\n `}\n `\n), LB = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Gf)(\n ({ iconLeft: e, iconRight: t, theme: { colors: r, spacings: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-left: ${e ? n.sp40 : n.sp16};\n padding-right: ${t ? n.sp40 : n.sp16};\n\n &:focus ~ ${zl} {\n color: ${r.black};\n }\n\n &:disabled ~ ${zl} {\n color: ${r.pinkSwan};\n }\n `\n), zl = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ onClick: e, isDisabled: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${e && (t ? (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n pointer-events: none;\n ` : (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n cursor: pointer;\n `)}\n `\n), jf = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ size: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${e};\n\n > svg {\n width: ${e};\n height: auto;\n }\n `\n), Kf = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e }, hideClassName: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${t == !1 && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: ${e.sp16} ${e.sp32};\n `}\n text-align: center;\n vertical-align: top;\n `\n), wB = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)``, qB = styled_components__WEBPACK_IMPORTED_MODULE_1___default().img(\n ({ theme: { spacings: e, itemSize: t }, hideClassName: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${r == !1 && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: 0 auto ${e.sp16};\n `}\n\n display: block;\n width: ${t.sm};\n height: ${t.sm};\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: ${e.sp16} ${e.sp32};\n display: grid;\n grid-template-columns: repeat(8, 1fr);\n\n ${Kf}{\n display: flex;\n margin: 16px 32px;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n padding: 10px;\n }\n `\n);\nvar D1 = /* @__PURE__ */ ((e) => (e.ABKHAZIA = "ab", e.AFGHANISTAN = "af", e.ALBANIA = "alb", e.ALGERIA = "alg", e.ANDORRA = "and", e.ANGOLA = "ang", e.ANTIGUABARBUDA = "anb", e.ARGENTINA = "arg", e.ARMENIA = "arm", e.AUSTRALIA = "aus", e.AUSTRIA = "as", e.AZERBAIJAN = "az", e.BAHAMAS = "bam", e.BAHRAIN = "bah", e.BANGLADESH = "ban", e.BARBADOS = "bar", e.BELARUS = "ber", e.BELGIUM = "bel", e.BELIZE = "bez", e.BENIN = "ben", e.BHUTAN = "bhu", e.BOLIVIA = "bol", e.BOSNIAHERZEGOVINA = "bos", e.BOTSWANA = "bot", e.BRAZIL = "bra", e.BRUNEI = "bru", e.BULGARIA = "bul", e.BURKINAFASO = "bur", e.BURUNDI = "bud", e.CAMBODIA = "cad", e.CAMEROON = "cam", e.CANADA = "ca", e.CAPEVERDE = "cv", e.CENTRAL_AFRICAN_REPUBLIC = "car", e.CHAD = "ch", e.CHILE = "che", e.CHINA = "chi", e.COLOMBIA = "col", e.COMOROS = "com", e.CONGO = "con", e.COOKISLANDS = "ci", e.COSTARICA = "cr", e.CROATIA = "cro", e.CUBA = "cu", e.CYPRUS = "cy", e.CZECH_REPUBLIC = "cz", e.DEMOCRATIC_REPUBLIC_CONGO = "drc", e.DENMARK = "den", e.DJIBOUTI = "dj", e.DOMINICA = "dom", e.DOMINICAN_REPUBLIC = "dr", e.EASTTIMOR = "et", e.ECUADOR = "ec", e.EGYPT = "eg", e.ELSALVADOR = "es", e.EQUITORIAL_GUINEA = "eqg", e.ERITREA = "eri", e.ESTONIA = "est", e.ETHIOPIA = "eth", e.EU = "eu", e.F_S_MICRONESIA = "fs", e.FIJI = "fi", e.FINLAND = "fd", e.FRANCE = "fr", e.GABON = "gab", e.GAMBIA = "gam", e.GEORGIA = "geo", e.GERMANY = "ger", e.GHANA = "gh", e.GREECE = "gr", e.GRENADA = "gra", e.GUATEMALA = "gu", e.GUINEABISSAU = "gb", e.GUINEA = "gui", e.GUYANA = "guy", e.HAITI = "hai", e.HONDURAS = "hon", e.HONG_KONG = "hk", e.HUNGARY = "hu", e.ICELAND = "il", e.INDIA = "ind", e.INDONESIA = "ina", e.IRAN = "irn", e.IRAQ = "irq", e.IRELAND = "ire", e.ISRAEL = "isr", e.ITALY = "it", e.IVORY_COAST = "ic", e.JAMAICA = "jam", e.JAPAN = "jap", e.JORDAN = "jor", e.KENYA = "ken", e.KIRIBATI = "ki", e.KOSOVO = "ko", e.KZAKHSTAN = "kz", e.KUWAIT = "ku", e.KYRGYZSTAN = "ky", e.LAOS = "lao", e.LATVIA = "lat", e.LEBANON = "leb", e.LESOTHO = "les", e.LIBERIA = "lib", e.LIBIA = "li", e.LIECHTENSTEIN = "lin", e.LITHUANIA = "lit", e.LUXEMBOURG = "lux", e.MACAU = "ma", e.MACEDONIA = "mae", e.MADAGASCAR = "mg", e.MALAWI = "maw", e.MALAYSIA = "mal", e.MALDIVES = "mv", e.MALI = "mi", e.MALTA = "mt", e.MARSHALL_ISLANDS = "mis", e.MAURITANIA = "mu", e.MAURITIUS = "mau", e.MEXICO = "mx", e.MOLDOVA = "mo", e.MONACO = "mon", e.MONGOLIA = "mgl", e.MONTENEGRO = "mog", e.MOROCCO = "mor", e.MOZAMBIQUE = "mz", e.MYANMAR = "my", e.NAGORNOKARABAKJ = "nk", e.NAMIBIA = "nm", e.NAURU = "na", e.NEPAL = "np", e.NETHERLANDS = "nl", e.NEW_ZEALAND = "nz", e.NICARAGUA = "nic", e.NIGER = "nig", e.NIGERIA = "nga", e.NIUE = "ni", e.NORTH_KOREA = "nko", e.NORTHERN_CYPRUS = "nc", e.NORWAY = "ny", e.ORMAN = "or", e.PAKISTAN = "pk", e.PALAU = "pa", e.PALESTINE = "pal", e.PAPA_NEW_GUINEA = "png", e.PARAGUAY = "par", e.PERU = "pe", e.PHILLIPPINES = "ph", e.POLAND = "pl", e.PORTUGAL = "por", e.PUERTO_RICA = "pr", e.QATAR = "qt", e.REPUBLIC_OF_CHINA = "rc", e.ROMANIA = "ro", e.RUSSIA = "ru", e.RWANDA = "rw", e.SAHRAWI_ARAB_DEMOCRATIC_REPUBLIC = "sa", e.SAINT_KITTS_AND_NEVIS = "sk", e.SAINT_LUCIA = "sl", e.SAMOA = "sam", e.SAN_MARINO = "sm", e.SAO_TOME_AND_PRINCIPE = "stp", e.SAUDI_ARABIA = "sau", e.SENEGAL = "sen", e.SERBIA = "ser", e.SEYCHELLES = "sy", e.SIERRA_LEONE = "sle", e.SINGAPORE = "sgp", e.SLOVAKIA = "slo", e.SLOVENIA = "SLV", e.SOLOMON_ISLANDS = "SI", e.SOMALIA = "SOM", e.SOMALILAND = "SMD", e.SOUTH_AFRICA = "SAF", e.SOUTH_KOREA = "SKO", e.SOUTH_OSSETIA = "SO", e.SOUTH_SUDAN = "SS", e.SPAIN = "sp", e.SRI_LANKA = "sla", e.ST_VINCENT_AND_THE_GRENADINES = "sv", e.SUDAN = "sud", e.SURINAME = "su", e.SWAZILAND = "swa", e.SWEDEN = "swd", e.SWITZERLAND = "sw", e.SYRIA = "syr", e.TAJIKISTAN = "taj", e.TANZANIA = "ta", e.THAILAND = "th", e.TOGO = "tog", e.TONGA = "to", e.TRANSNISTRIA = "tr", e.TRINIDAD_TOBAGO = "tt", e.TUNISIA = "tun", e.TURKEY = "tur", e.TURKMENISTAN = "tk", e.TUVALU = "tu", e.U_S_VIRGIN_ISLANDS = "vi", e.UGANDA = "ug", e.UKRAINE = "ukr", e.UNITED_ARAB_EMIRATES = "ae", e.UNITED_KINGDOM = "uk", e.UZBEKISTAN = "uz", e.VATICAN_CITY = "vc", e.VENEZUELA = "vn", e.VIETNAM = "vt", e.YEMEN = "ym", e.ZAMBIA = "za", e.BRITISH_VIRGIN_ISLANDS = "bv", e.CAYMAN_ISLANDS = "cay", e.CURACAO = "cur", e.GUERNSEY = "gue", e.JERSEY = "je", e.ZIMBABWE = "zm", e.USA = "usa", e.RESTRICTED = "res", e))(D1 || {});\nconst xB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ5SURBVHgBpVZvTFtVFP+9vldshy1lsFhDdGVjBDf+OI3MbWTORLOsgvpBsxDjHz4qH1Y/GI1+sIvx3wczP7iZqAk4RRf/JDqZG0YDMxOdZrJBFkhBiiB/RqktKe1K2/eu99y+m3ZK3dhOc3LvO/ed87vnd887t8D/CGPMxfVlrr1cgywnEdPm4+rBaoWczABXKx2FgJQVgu/ng5+ri54HRubx0fEA/piM4sJ4FEdCXahza1Br61Dk9ULb0SRdo1wPKIrydkEAosMMjlNnZ/DWkQHctbkUfb+H0Li5HExRsG/NDKvKhBhLxKHPzjJ2k5s59vs0q9Uqw/g5yIH/AJg7F+gHPz6HD7tH0LpnIwbHFjlIOYbGoojEUnjhyS2oWe+QPjAMA+l0Gna7HQ6HQ4Z7VmaiSM6JDaLllfd/w2AgBKtmxaW0gTtrynD6fAgNm9YiHF1G+1Q36rQo9+F+EoSPqZFh3NDcAttzz0u6tnKQCc1EJGpc5wNhDAxfRDhmoNimYFvdOnx35iLua3Sjf3ABiaQOvWoTmEr+LI9bA6rbjcRoAOpEEFZPJZ1fB9d7NXP3T9F73X0BfHN6Bu2P3obAZBzHfpxGc1OFGBu3lCE4E0dqjxfp6tL8cxM0keqpFGKqirXZpd1U5pTBw/JQ/R8M4ZlHanDylzlU31qCO2pK8dkPU2hrrkRXz59Iccq0l16EXQsLcokmMfLBWE7BOjcHnRszh9+V1eUjgIdo1vPzFJ7wbsDhL0exa6sbyzxY79l5tN7vwaEvRnF3bRkSl3RkFsrAinIMMfHjEk/AomkwOEB6fFwC3EMAt9NsOBjB97/Ooq2lCh3dQVTf4uTVU4b3vhrD43s96Dw+Dn5oSL7qQ7K2HP8q7xxNui5s9uySR6HPkGb1+z6H5+Zi9JyZx/b6dRidimH+72U8uKsCJ/pn0cRtY9MxdOgn0WQNZfmRaiZE1aQbHKzEieKuo8IuqwgbKhxiJ9vryuG6sUiUZyyeRrFdwzZ+wGvsKuqrXHBMqrwm9dz2ldygcBTKEk5nbpmaGKWyuLgoDBaLRbwkXlyF0OZIiSKK4cyCRCmDCQKwdR8DO/opVAqOFZrUlQBMpUO2eB8Anm4n8zkCOMV1t7WyEpnpaVgUXDOAYU60hgZp/poooq8uQk9LS0uiEiRNqwIwK4nEmTuDSo0HivLFPsrCHl5A+o3XoILOAKsSXjw8A4ai19+Ups78XtTGdUBd73EpG6tgfNIlqCK5Eo7k3kLUtD4Gi0u0EXE3XOZP1x8fDtI8mUyKFixpKkQXk98AH+k+sNlscunydp3n4Ee2s4py0w+9k8FfUwWzEOF3NkFtbtFU3uRMoVvNLx9WujJ9Joi4Mln/T8CJb4ELQ2CTk1mHkhKAes1eL5QdO6XrilcmCqROl34nu3rpZdfx78JnBojkBQyaNr9Z5gXlH9EMdxrNQgj9AAAAAElFTkSuQmCC", RB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOOSURBVHgBpVZLbIxRFP7uP6+aER2iEgtMV0iIVohN0RXiVRZIEOKxkRAVgo2YrhASFnYWuhIiSEOLboqUxCPpJJ610PFYoKIznZrHPzP/dc6de6dDp0zTk5y5/z3/Pd93z7nnP3eAf4iUMkh6krSLtE8Oy4C2NZOGMFZhJw1QqVwejUiUAT9IQ5g0yPPc427YdzvUKONxrFvvwDVjJuqmz0fT3LVorG0wrjHSFiHEhVEJOB0aHJn+ftjHjgBv3sCqqYGYHITlD+Bog0RUDOGX/QsffkaV362tVxShljCRtIwg0DtX7OmzZ5C5eQOe2lqIQABWJgNy4kUIr56CbxO0owSSdhJvv7/H/iV7sWfxTgN3yEQiTM5p6OG0xCkNcsd2VHk9sDhFS5fB8+wpBJPQPHXmHJypU9lHqeM4aszQ+wBtprq62qSrnkiilmbk1ARt20YikYC7vg6gtFipFHyd92Fls7CSSQiaMwlHY1mWUpfLpUaPx6N8mUif32UVgd59H09+tN9GduEiTCBAP6XJ/fqVAuQoXJEeWEMJPD91LJ+YEuBsmdSSOhSJRGwoJn1en7VhwVqz8clu+tnAT/kn3RA9PXAtXgKr9x3cL54Vdkvq6byn8s2Tow9PuL4ECgcghM4yvUtnM/gc+wIQUdekdlNdzUzQpMqxowNV165C5vOoorIUqWRJiQkYhpSdQ9InSiuPrAIDqVhhGe297d0dQ7CcCer4yQ6FHLl5i+PK5ZBdsRI5rxeW241hpALPpjqJuFdCDr9BNp8lzUHS7iUd+qyJM9nMziE+A7W2n+q+9PCEGPEN/lNMReUpAyw1VCQoBKSToAHHClwq7Pu3P4cRJQ1djFzCx/hnCEuUaSAVCuWCq2n+tLk4XHOALbEiQTw3iNbXVwoxjYMADpXOxH3GEmG4h/zUNGcNxiVSK2PNLmK18SHzVzfAs463neqQyuXyv/i6dXD46+atMuZa04u6aGjM0hc8ODhYrKJKSUr7UjAYlNQ+2LGV/HeNaHZJ6jnpdHpMpWoIfD4f/H4/m4rNTn1J/EALuIef5wVXe2+i5dHpyg+bMnNy2XHsrt9uLHzxRBX2XzsJo9BZEfn6Ehuvb0M0/ml4gfgTlKVxVoMC57EEPFzOxZA0axJ1ZT742I223nZEvr0skgV91QqQq6UEuOyVWT7iwqXfKiuXLjmOfxfNGmCgBLBP28K6zEeV34TVMhcP4r6cAAAAAElFTkSuQmCC", nA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQySURBVHgBpVZfaFtVGP/d3Js/bZI27TpcpjbdBpWRtm6RiljZUrQ4N2wtedBHdY8+WPayB4tJYAOnIFVWUBA7KIggiK3oHldj9qJ7CBW1ZbgkG13RJiahyc3/3H3n5J4sW9LSsQ8+znfOPef3+/6cPxfYRTRNc5D6Sa+RRrX7ktLHZkgH8KjCFukAe5WFnYikNuDvUxMgdbB+JnQd/y//zNtKJsPnWFz9sI4MoXfyNLpPjImladKgJElzOxKwdOjgWFlZwf5PLqMYvwPzE/uhOByQbVY+r5rNkWaRj99GVdJgDS9W3fuGZB0mQCRBgWlo4zmCwSB8Ph9kowLb0UGYenogG8iXnAqoKmRJgtFuh33YDcvgYfh+PCNf+v2CgAqw2oiOInLeDD4/Pw+PxwNDqQwwbQ6WNVrDLcjk99E+N75YvcxHzo/OssZPmD9QJDERAUuNIxKJIBAIwOl0kqMqtHwBkpoHqNVU5n2eR8FsiSv7lodaVeG0H8RHNy4gvBGCXr8FniLd+7dZZ3p6uu4kpSCXyxFYjsDqoCYiNR92Qe7spPTYUNOJ2Lc8ESiywqO7dKORKi/b5iyCN0RRY7EY/5JMJnkEzGMGInfZCdgCyWSC8UknZCp4x/FhoFKmKCmCmop0KcUrGt4MIXw3JEhmGMEUs5aWlsQgtra2eAQ1Arf5JtBx6gUUYrcAWUPxTgzFjTgszw+j4+QoRZKDWskhUUpAMtRr9FN0WUCdZEPHmMXyL6RYLHISqcMCGA1QQ7+h49kR2F8/hd73zsLidiP56Ze0RWi5WUGymEChmm9sguubvwqoAUUvCKLRKJqlXC7DfGwQXd5XUPnrNsqpLaS++RYaYSrWbnS+OArbq15k19ZRrq01wKl8yJTSDQIDdhFDRUb57gZgNcJgNqL33FkoB3pRuLUOqQKY+g5AK1SwKwZpjBk9dJgeluxKGPl/1qDRWTAdOkIDFdheHkfXmBdVpYDEwtco/vn3g4sogn67S/TSDQKv19tCUMtsoxr9F12nJ1CKx5EIfobUx1+hnE+j0/McJE1BbTvfsm6ob0SYEVaDXxj+1NQU5ubmWiZnFr9HJZvCwYsXUboZg0Zb0zjwFDY/+BDq1TBtgpYlODMwKcwliR0GMlKsNz4+zs+DkFVzX8M2uZ6G6ZkjqLGLLplGcf0mHy8RwcTn2/Xrg7Tf6kLkrXWx7JBCpzZNJAzV6/f7HyBolhLdqkx3FSJYnPhO9K4030XvkKZZHRjJI4vu/XnPLIb38fzzt4EZnIAxiQF22QkSbY/YHPz4LCfQJahjtjw4AdRvVn6yTW++izKlRUySHgYmsXjH8N/CObzkPNEMHkCbNYJkRifhJzxLT2Vm+SoKq380aiB3d8NGT2XX5Gu81aXtk9k+7Pqjf0Xbu1zTHuPvYkYHSDUBRvWxgL7Nd5R7x+lqwE5JSUEAAAAASUVORK5CYII=", BB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ7SURBVHgBpVZNaFxVFP7u+0sysU1SiJVCS1wJTWojEYpNqQZ1kYAaC7q1ooiuGsG2CxcmiIskItlq1bYqFEHRWoyLLlohqQsFa5vUgIGkk5XFZPqTzMyb93P9zp33pq/NpFQ84cx99+d83z3nnnNvgHuI1rqV+h71HHVB35ZCMjZE7cB/FTFKAO5Xjm9EpOqAH2IzTG2Vfjg9hcpPk6bVN26YNdaOHbC7dsEbGICzd19qep06opSa2JBAwpGAG8DyxEfQS0uw2tuh2lqhcs3GRK+tUtcQ56/SBmj+4kvYnbtSmGGSjKwjSHZu2Mvjo/A//QRuz+OwXBeKKDSCQTMmGtr8AnGxhHDuCrxXXkXj4aMp3NupJyqNOZvfJSwCHnz+GQo7d2KrZeFaFCNPbbQUuh0bZaL+GUUokuwR20Ibia/xu+XSH3DfeDMlkXA9RpLFlOA4m4Px7Ixe7duv3M5OnHY8BDTcRpK5OMapYhnjm5tR4tjIagkHGj0z57Mfk/SloExP5tD0/Q/puZwnQZ9Kdr8gI6s93VBLebidXfjar2CFwN/4ATZxl+82N+GDtZLx/62mRpwq+1gm+H7XQZfjoN9zEM7OAL29yH13Jg1Vm8OfQfmKLkwBBLclSwoF5JSFZRI4JJhne9IvYz4IjdW3fgm/VkI8xBDlGhqwzDhYJQXLJMc0QmIlXgwJwQsmayYnzQKLu7VWlnGrMYcCgRVB18IIP2ay7WzShraNW2GAbWxVuWhsbXoVESsheFIIus05zFyu7l46vo+WUhm+46JAgiIPWaeZVD0z09oMjRs6UBUfit6IbSx6YTrdS4cQmIIC812Zv2pquUGAVpJs5QlKxixEMbKyhWQeM8ur2GwtEnjGjl+IkoIUAguZgpANpoXRTqN/CNzPnT3KtpdZH5BUVL4PuTb2kGAxjNGceKYymop4sChM2NwibtQmAkahjxnytOfiL55BRMKXGzyw7Lhjjb/p2cSmHM5WAmjcKXKVJHK9RmAzvfSVmdqieRZTnod8hgC7udt9JHj95pqJ89gDTZCAHFktmrrooJfPciOpF2CaJ3JRCH6mPmXx4oqOfVwj2MPdD9rVCF5l/N9nDbjJ3BL7B1kLByzPFJrOBEW8cYiVyGkpNDnkgvTCF5+HYgZYWH/N/sJsOsZDl1J7jbn/TIN7x7y5l0S3b4f728V0+GGmrpJ747z0bN4j6SV2d1yfoEe2ZA6/7wZHxsY5+VU6dCJ7F3UgueziD8egeeHV82KF4bgZV2NeDxzvHIV1+Ih81S6724uqz5+RaHxURw9u0XGi+h4q87I2GhvNvnBDqCecGK4tmbmko57d64jijBrgwed0PD2VBR/OYtZ7MoVdXjZT4VrKnk8mZi9D5/NVgxbWjNw1/QNQe3tT07pP5kaeyKN/Qt+/nNP/47+LoQSgkAFcSMaGkzTfUP4FG5+9QuaBmmkAAAAASUVORK5CYII=", WB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQESURBVHgBpVbdb1NlGP+dntOu3TK7lXVICslAIdnI0AvjcDOZM1GTiVETFi/0giGJF0Zd5A/YpiZe+QHGeEMyEhMvNFEwXgxkWfRi5WN8XEDhbgPaAWO0Xba2pzvdOTzPe963PW06AuFJnrwfPe/v93y9z1vgEeI4TgvpKOk06ZxTkYzcGyHtwJMKH5IAjysTGxFpdcC/oGGMtIXXM3fOYnL+DOI0Llsr+OvV32AYBgKBAEKhEILBoDqaJR3XNO1HL55RAz4qwQXwkSu/ILmaRLSxDbFnYthlhASobdsolUpIp9PiXFtbm0OEbNAPhBEmknGF6atjOb67dBSHpj5FQDewK7ITraFWaD4NeduEz+eDruvCC7aePVlaWtKWl5cV1BjnpsoDGT8X/PJRTNz4Fd3R3bBQwppdEoFUsWQCeUYoS0NDA3K5nJiHw2EeRum3E+TJvPKAQ9NyLZ0ggiPY3NQOk6wtkJp2AUUa8zTymg6VVXnDo9/vx8rKCorFImT+JkSSpfVzvHj5934k8yl0beqkkEBaruG5eyUMXjTRfdPCJn8rsH0H0D8ADLwuvOCcsDI4hy4ajaoItXKI3uNZ/O45JHNJQNeQtTIIGkFBsD9u4sBUDkW/hj9fCeGjT74HGhuBVApYWAC2bCl7xN5YliWIOGwkI2znuzybvHWaAuwGO72WQX69gMhiDgdP3oeey+OrfTqO9Wlw2tuB5mYgFoND4F7hULGapqm2+pngRZ5dTV93Q0JatNcEyQeT94FCHv902ph6fh35UgG4OOsm+NtvUCsqL+yFlA5DJgS3cwtuqWhuvVi2hc5EGs6qg/MxAwXyiPPhmJTEl14gc3Vg3zvA3t4yuFJVXUzgqzahegxa9OH6Ota4YKlcmVT89uCBa0giQfFMV3mgadXNgQnmeRIONFeTkFze4RfjnrmS5wQd+T8O9PUBBw8BkQhqhStJSrZM0Ptsj7vlVD78ozckxqGZPDoWJUnPXmDrVro5X2Mj8RBcYYL/ePbWtjeqwFku7Azg58Em6DZw7Kcs3o9Tkt2LREmicM1eqEsgS5TlJF80TnKGV/v//RDxxfMy2ZUDb8+aGKa70HVbetG1mz4eAg58XP5GXTiWSCVs2zX54zQNr83cO4chIlH3oZ4k3jzLMajaU32JCbgXyRAdp4QPqyoaJs32bu7Bl3s+d0Pl1CeoBfcKt3IJLt4GnggC7npq4zARHO7+7NEkNZazcutu5BbiyrjErLwH8iUSJOzF6cG/sa0pViGS6gVl5f7TTK2DrfeAl1+1ek8mPxaiffM6Tnk5lTojWklyNYVTAyfEZVLPprfmUefJ3Mh1fvSPO48v085T/LsYkQAZD+Cc3BuTZb6hPATvmEcNCRp08QAAAABJRU5ErkJggg==", EB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQpSURBVHgBpVZNbBtVEP72x78xjZO0deIQ10GpWhVVMYcUJAixxBUUQIJzOMCFA75WAiWBQ69IVdWjK5ByQEI0B8SJpFGRkPhL6hTRUtIkLSU2dv2TeDf+3cfMetd2UicK6tjjfW9m9vtm5j2/XeAQEUL4SadJF0nXRUtyli1GGsb/Fb7JAjiqxA8ikjqAf0SXGVI/z2vlG6jszptXYeTNGFkJQ3FG4PRMQnVF7VvZOStJ0ucHEnA7LHAsLScxGpyCIu4TYACS0gNJ8llxRSLTYNTu0xhQM9/Be/6sDTNDJLP2RO6QOT6LL+PdjxcI0AmH+xxURy9URYYia6Q6jSWy+cg3CtU5grW3P8DWpStNAl4be6LaPW8Hv/rNXbxw5gSBVSFLNdJGrXa5wvoRZruArnOnkb76hekbuPghX6YJ8zpVsmFXwK3xr65ljU/jt9Df1wW9XIdM2XLGfJUljSrSTeWxbNtJoZfgHgggRVXs3PwJ1vrFzRZZ2U/x5K2LCzIk/spEYBCYZgFrqFVU5NKDSG+FUK/VTVvTr+9CUVWz36lWq6K8zblFb5qLupLEZlIDE2QLVbjdqplt6p/TSD4cQ/+zCfy9cYFaoqBSEshlI+g78SOCoT8gdkswyhUik6D98DOKVIVv/ALDxphgkkfzNx+a4KzpQgW93HGhw+vZBBYHoAxF0J9ZhhRKAr/o6BoV8PkeUVTRbBHyBbMCXpfCt9/bBBNsi/Ao8Ve2sZKk5ZqBDJGUNBm3f3sDqAr0vuqAUhqCqiUh5VNQoOPO6iQKWQeMTJaqKJsEZhWNdWAJq9aCYGNLaxKwVIlEVlKktDXHyP/l74DHgOYIwD/yL0pE4XA+pk2Qgag+YwOadxuF4h6ClkeS2iaA01XF8MgCUr/2wCvdgnzcC89JFfqcA9L7WfQcewBft94GwR+x59/LVW3woNvnQid5sD6BuuhtgagCnmoZhuimRX95T362OE8N2sO8ahGEJyIBJNYKTxAY9RJSlSEkh9+hreiA2KpBH9fh2exBb6CCTuJuHRsrTLBEGp0cH8Llr+9i//kXefErPE4FsZ3rQfLRS+YuGT77J7qPJ2iH3WvGibbf7tdfs83zTMCn3zRXwLq0krYCG0Qudx7BU3n0nVTg8mzD65Pg77tNduOJzPkuNRSE95Ux23SddpXEx+wNnn0ydb6ZxX5xeeoYPrOKwGDiQHCW0Nxl23St/Sx6jzTPFZgkfAbbp9kRpBEt0EcHnavRf/PZsDeo8fgzZTaeEOrEnNDTDmEUyLV9sLL/zrHnRfrSlfYnXKxzJkLM2BEr93KinHtO1PMNEJvIHrOyr74TFfTPbQefObzcRiU5O9qoLgpDjwmjGBX17bAwWHciDRv59r0IxHAUsR7618TRZVE8xdtFzALItQGuWzZuqf8wjP8AsA3FVpI03HMAAAAASUVORK5CYII=", SB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO6SURBVHgBpVZNaFNZFP7uS1I77YBxUTcjmaiVkUmGcdoZGH+w1YV/m3ShoG5UEHEhGBF1mVYREUVcF6uCghtBo1gXgqliFNwk/lJd2GhRXNimrTZpm7xcz7nv3vRpEn9PObmvJ/d83z3fPffdAF8wKaWfPEaeIB+Q05bVsSh5EN9rnKQBvtXO1CISVcB309BJ7uf/i8k7mLreq0Y5OqrmWIEAPOG/ULduHbxLlpnUEfIuIcTJmgQshwZXgBMnT0AODsJqaoKY5YdoaFQpcvwD+ThKr15SDtB47rz0/Bk2WJ1E0lVBoFeu2CeOHcXkqW74Wv+F5fNBEAolQaGpFAmpPoFSLo9i/1PUbdmG+n0HDNweU4kwmtOQYlkYvHC6B75wWH0pCMUS7tUIDe/w8XOJyAvpFHw7dhoSlusfIskYgjM0bLUfP8L4yjb4QiF4Gn+FpUHVJH8JCNnAFD3f91JQTFdBTPb7MaqkH79cvmL2pY8IVgi9+gGOfGhdBDH4igjCtGpRJlAfTQS1YQIyVIC4VwfEZ0COOTUxiU0kxSePgaVL0XDpqpFqFmN08JN99w5A4B7ukmwWVj4HYTyXA1qyEMclrP004+8RiOZRWLnpORZ1GIOVkkkUGcuxKMciqmt6exW4h1c+PKRAFfAM6pgdQ8CmYWAVSfsyD3HYgtxOscAYxLgzTwy9U1Uzhk1Y2tpITCxSZZL+ZUkmJymBAOrrSXMB8ZSEf0Z78GASyNM+PCRR3uaBMcrIWVTBBESx4FTAfjdpCIJMoA4UqN+F+tMkhYJy2UXJPQ3AG0oXvMNTTuo7IlhNhOl61U4mj+hg6wPJBDBnfcHcuQWvEBV+cA/sgduwm+d8Gu+/AXv5f7Cr5SyYN69gcLmqDFM1zpzpLUpZ4Sd6YF29Cetit/Ru7HBiHWukd/ZsWCXa82o5vwUCXl3BCMxLLRqNmrYu+x/zIX+f4zy3hCBT1yA3RyAzSciVS1Ax3zhjaUtwBbeYKhKJ4HNbOB94cRtIXKCzvx0YpiZa3Ao8p1OTeY2a5sKKm3e+svb29orVrF8L2fY/5Dl67y1ucSoKkncfgdy1pXL1wWDQ/RoPKhojUyKRqFl2NT+0F3Jh86exVCpVviPKJekLhm8pGYvFvovE7ZzruvGCbtmgrz/5oyQucNUzqGb0RaeZwaWynl8D5n1jaV3W6casdmUyewz6hPf19SEejyOdTiOTyag5fr8fBKy6hUdtVa/MWpXwnpyV324J+RO/LqIaIOsCHNAxltT/JYyPOvofLjSSdtQAAAAASUVORK5CYII=", kB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ/SURBVHgBpVZfTFtVGP+dC60CHRTmIHHStRlzgIQ/LosLaECXmGCygeHJJ43xxSdr4jKjJlCTkYzFZFnG4suymZj4ojIygQfCqG4zmZaIK2z4MFpDRBeYVNp72Wh7j+c7PafrZruw+CW/3PPnfr/f+b7vnHsu8AjjnLsF+gWmBSL8vq2pMb+AF49r5KQItmrnCgmxPOTviceAgJv6wWAQo6Oj8hmLxWAYgMfjRWtrK3p6etDV1aVdYwIBxtjJggKUDkUuCQcHBxGNRtGwtwacVaL2GRecDuBWJIEnnSZ+nlmUfiMjI1JQ2YAQCeiOkWflCAQC6Ovrg8PhQGNjI17pqEL1dgMVZSZqtlsodzF0HnChpaUFdXV16O7ulj5agGrzQAQqf79QWujF4eFh6dy4B7izBmxzAd1dQGQJeEJEUFMNXL4GLIp+07PAtVkgFArB7/ejv79fp6tNRBLVAufE461wOJxqbm4uFoDL5YKrFDh2BLg4BRx9l2NpmWHjLtBcz/HxCYa+bjF/Gri9yrG+vo75+XlMT0/rugSFwMtMrT5CIz6fT+b81YMtONAGrKyROjD0EVBawkS4nLpiQZnQ3/8USNvA0zXAlZ+AiclfJTmJKKukGvTqohI52Y3f7mDyBwv1PgvDAUuwWGB2ArDpacHgJpjA0IcW2hosfDNmYW7hb2gegjI/CfRQa3V8LLubypwrqPOYME0ToesmykpMsWwhxE0FS+L2iilqlMAer4kd7tWs/+LYd7rZSSmiRLg3eg/hg3sNOFN/WMRvwFFsoMRhwGBM5oTLHcFkbnRPtkRzI2kjmRK54jbeWJzC2fgllFz6ngSixVAHii0tIbA8g7Gd+/F7+U4k01wgjSKDCZFMLXJPDRHTkM0zImS7zBV8NnNWbLMq/ZrXQI5V2PcwEQzAnTSzY2mbZ8T0UyEl+jSnyakxOfUJnto0Hzi9JBCVEZRXyIG98T8xRKt4TOsPf4Xdib8kueHx6OFYsRLwFnV0gN+Yk6Pv3JqEp6MV/M23t0ReOn4BLwkBHQx7rklPzdIho6PN01cv883qKp4WsAVSvlpu3rzJE4nEI2EuLPBUfZ1tK9/NHcJfcCnz0y6iItNOQur1w2A/XpV5o1CTPh9PXrjI+LbyvCsXvnAe7IRTnB9ZcEJtLRyhWf2KT+xCRt+NIPWKjhzNnFQFRyTC2OAxXig1zlMnJTlyfIq/+FJPn6dvkV6JV91SPH3iOE+pNHGFu6dP/Sc11udnbD2v05MeOp5743kfDtevZ0lE10I6797F4+GwnZv3ZFO9XYCc536uHxYZyL4yd52n97VkhTbbX7ATy3/weDzOk/ta7xP3HhJFvZJLPpDLme/KJHX6qMsTzkXRMTEOzIfxz/P7eWmlmzm+/Rpof1FcEq+BtXdo17xXZqFIqCbn+dZtmv+Pvwu/IljLIYyosQG1zQvav3b9O+/vcHZOAAAAAElFTkSuQmCC", NB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgBpVbbTlNBFF1zzukNCoVGEUUjwXhLLEp80RiNia/G6Ktgol8gfgHFL/APJGrioxo/AI2JxhcV9EFNuPhAEBVoaaXtuY17z5lTTwtFiDvZmemc2Wvty8yeAluIlLKLdIx0knRO/pVVvTZK2o+dChtpgO3K/VZEYhPw2zTkSbv499R3G6+/VdVYtn21pzdt4lA2hnMHkxjsjYemBdJxIcS9lgScDg2uAB9PlbH020N3ykJHQiBpGWpf1fVRcSQWSy7b4O6lrBzIWiFWnkjGNxBozxX7g/clPPtcwfGeOCyDQIXAxmAlG6Hq+JhbcXD5aBI3hjrCj3fCSESYcxrec1oefCjj+ZcKpSAOweC8JULAU8KtE3AEPH79VcO1YykiSYfpGiKSeUMzcmq6ZlZcPJpax672GGzfQE2rHR29yFyG3wR2p2N4OL2OaUqtrt99nhja+5sqeZMF8tpUWo2AMQDXl8eah2DuiQYy0wzsHpKDWi7yMbdocpV/za3Y2JPysbfdQrZdwjI5HRS+kI3FCpLTMOEsuUScNgR818ZC0UZfRp2uUcHnndmKxSIqlQosy1LesNZPAiWec+2VZuD7PmKdA+StFeQ/qKFa9zwPrusilUohk8nwpxccwSme8QeDisoaAgoR+O3ZJVSX3sFdfELp2IVU3yW07z+DZuH9bO84TrjUb+mCKA8Mw2gwCD20CzOwV7/AXHkKv1xD2aki2b0PRtuBBvBQQzsmMKIbomNUrJiEs/wWyUQFvX22qo101zaNoNmeI5hXTOR9hLlBzMxJJPuvo7R8FMvFeXQcu0LeH0Yr4TpqKdQJ4vE4arVaS6O23tNwkgl0Hr4Cs+MItpIIwQeevSS9uOYnMPGJC23qG9wsWdILrVHVhfaplgK3hlLQTeMZE3DPGNvXGUPBjeHjT316NqnFlqLahkBPm4m9nfUInhoExn3jBf8aySWCjeoGyZ3h6940dr4tXJqI9qJbpIXBHgvDuXhwNXeCrxve8IkEBrrVBVVvA08UATOFCyO0afhEXOUzaJvyn+C8l21GcvXHZ1xjbnhw8gg6K2YLPu6+qmJpnWpS3yaaCCVyu00Cj2Gwx4yC5xGxaHJIjmoSdcOnf3h4s+BhdtWn1y0AT5OjOQI822dGgTd9MltErR79Cbl9mZT/8e9iVAOsRgDn9Fqee/5WGH8AKIU0tzqfI4YAAAAASUVORK5CYII=", IB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANJSURBVHgBpVY9TFRBEP72HccBdyKYIBoTAsaGP8VgCIoJYqOhUCtbpdDQqFAYS45KjQkhsTMoFMbGwr9EYwUa/6CBKBIKEv5MjMbAAXf83N1768yy+3jmQO9wyLA789583+zM7tsD/iJSygLSDtJ+0km5IfPa10ZaikyFgzRAutK7FZHYBPwaDWHSAraT798h/uqlGuXCgnrHKimBr6oa2c3NyDp23IRGSDuFEN1bEnA5NLgCXO3ugpydhVVUBFFYAJEXVCEyFiWNwZ6ZpiAg+PBR0ldekaVhwkTSmUKgM1fsq3duY63nHvy1R2D5/RBSgoL4JR0iGVeps7yC5PgYsi+0IOf6DQPXblYiTM1pGOayMHjiwX34q6rUQ0EolvBmIzQ8gatBwiby5Mgw/JdbDQmX6zCRTBmCXhou2qNfEDvZCH9lJXzBECwNql+iiTDLVXN3FWTbS4u0knHkPn1u+jJABE1CZz/JnmhtDcTsDBFUUdbCJYBnBVK6RaW/9QeOJkl8HYVoaEDekxfmpUJuzDme/Rwcwce5IGVejpx4Efw5gdQtxmLptHWZDEkykcByyIY9ModDQ2Moq6tgdxsTnOXZraEE7pa0UpoWAtl+7MoPqMa6ldH93cxmI7IUx0pJnKYOrgxG0VWneBuZoIZnnyfmYCq+lnDwayGO3IBPNdhNWJg95CWQWFlzkEjabvzb4R9mvaVMoA7U1PcYPC2lAEepjxgsK7VYnDmDc+03+rIeH4km/iDQz8TGLvFU36a9aDsSmclGPLdsiic7Q9kpD7cnAqV7Q8aIuASNNcXal2m2qXLwQKGZjnCJ3pCeuHomhOrAY1VvIba3CtUTKmfT6ZvG9YwPGjd5nq3kxHmI2CCReNqRNvj6p8Px7aOD+sG4y+jACv5uDLDl29OuzqfaIchMzK7K2t9jXH38LbK00UIaEaGjsIrbvQc1bXAWjhW56gSru0H5+B8zuQ5ahdjdrjP6N495DxTDsVo6NWbKhROmoUMZK2Nwpi8B8W9uP4TwEBryYL1KSITqveBhY2x2ZbZpEnXCZfQTsPiabqExSCZjpy8fYMAdp7zAm16ZWyxbXfp9Mn3pl//x66JNA8x7ACe1L6y3+ZbyG+a3+vfju5pFAAAAAElFTkSuQmCC", TB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQmSURBVHgBpVZvbFNVFP+9rmVj3UZx7dL9cSwTtul0W9mAxNjWBb8YnTWCSiQxkAwXBbWTKMEw6L5oDMYYQ4yJhvFlYKJRZyKKSNiUiCR0KCqMObO6ZayOrX+2lvW9vtfHvbfvdiUryxpOcnvuPe/e3++cc8+9t8ASoqqqibRDpJ0lbVRdkKBmc5NWhWyFLtIAlis9dyISMoC/TpSHNBMd/3bZD3ORgOJvT0A4/SMchhdQYilEQ00xXI9Ww9lcxpeGSOsWBOHDOxLQdGjgGPBex4mTQ9i+sRCNF76DYLXifG0res9MYDYiITovYXRiFiqZ+9X7jzNCTTyEpHsRgeY5Y//1wghOef3YWzYFw6AXgcfa0HNNj8FrAQgCncsXq7gZk/HnyDQ6nnkAXS9t4HCdPBKB55yoSzQtscPvIVpZiZyWjdCPDANN6zE4LmLupgyK/vGXw1AS6gILi0HFuH8WRw/asamhgqfLRkh8nKCHqB3K338h2uqAob4eOcYC6DQPtEmM4Iny3YgkhLTcqnQ9Vhl1aG+rwpqKEtjqLPRDPyFoFTTvR6kl0twEYXyMEDwIHQHjBByNKkdFJ6IJHdI2LhkF0TRVDpsVP33Sxr+u1pOfp2lPkiRIHS8j/8B+yLs6oDOboQsEILVswhVfGHNRmREEj09ATihp6UmSiHGZKIEUxyQrEK263NQVF+2dPDeG88E85vkVv4Tj8/dCuDGF/LffRHGBHu/+MIOdn/kQjsbZxlKxN5ag0mpENKZgOiSREHUsjX39Ph6BkxI00d6RL4aYl9QQDIvYc9iL7RMP4V/3IVTvewXf113Fa8/VQoorpERliJKCp+zlMOblEHAR86KSKsyfL01ygiqKxw6U73qEkGubR3RcTuDr/nFsfucqPmg/Aogi3ji6B4qUjGByZh5b9/9CwKbYXA5eXV6IUvPKFAHdZJbIta7P4Q/EYEqIkA25mIndfshXFRigl6VF9rTdZntRZNSjqjQf3t4tzEoj8CUBcknYCfyv5GYECUfiS4AvyCzZo9VFeXwYShE4m0uTnhoNuFtpWJe6Nn6nBAO0t+PJdXi4wYxXn6/BI40WmApXIBsps+Rj97M1LP8u5xpu7qME7M6gl9VHezegc1st9r14P0JzErKRBLk+7MQxa/HKVDaIfEPKXqD3Rj8d1a+1sGMfJuAtdfcgG/GTqtp24Bw+7bJz0zF6F/Ezv5O0kF6vx+mL0+g95cPFoZnlo2sV1LXLhsZk/tnbQDuMgDJxw9bN96GlvmThjskC/GC7jRu7NcxFD46HKPro4I/hALa8dQb/+aNLwjvXW9HV3sR0GriHDzI9mW6NhJ3wgUE/+gbGcPmfAHyTETbHVLACDgLoclamA2d8MjMHnXz0j6nLl7PqXfy7cGsAwTTAUc3mIc20FMYtsV1Kq3nw9ksAAAAASUVORK5CYII=", DB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMGSURBVHgBrVbLS5RRFP/d7zE1mugEutPGtRMZttIga5dQ2F9QbqJdExQSBI2LCBPCdVRauO8FtdRAWwVKPnA3Ni4L1NLG+h63c673ft5wRtQ8M2fu8/x+95x77r0D7CJSygbS+6TjpEW5LSu6L0+axX6FjTTAXmWkGpGoAH6TigJpA7fDqUn8+fBelXJtTc1xWlrg5k4i1dMDr/OsMV0lHRBCDFcl4HBocAW4OfwYcnkZTmMjRKYBoqZWmciNddINxKWvZAPUvByTXlvOYBWIZGAHgV65Yt8cGsTvp0/gd5yB4/sQhEJGUGjKREKqXyD+VUa4uIDU1T4cvdNv4G4ZT4SJORXTHBYGD54/g5/LqUFBKI6wVyM0/BYf12MiD2am4V+/YUg4XKeJZMkQjFBxLZqbxcaFc/Db2uDWHoOjQYVBEwKw6okX1I5+/iBPFpF+/dbsywQRnBd69UXuWe9oh1guEUGOVi0SAlgeSJkElT5C14CIBoL5OYiuLtS8emcmZTz66VWbujCPiLPjRBZxUxNAsTeoQoXezgdpvoqEqaIwgMxkEMQSfrEIv7WVJ+bZg3GqdK9RCpbLZXieB9d1lSaZwOHQG21KHdqkjOMYURQhDEOk02nU19erMHEU2pUHNOA4jlIDlKzXAjKlPW4vhO2DIDBdWQ6ROlC8Ah60pRJINWFwo5Zd1rEn2OVBxBDYwgRLqqJDcxjC+6hlNSFIpVI4LLEIZrj2kbT76PdvcB4+gMtu4mCexJyuFP8jd+8BdXXc9YbTlDd5hVvhlcsQn6a2D9g+RJ1o1uZm+J9nTHcrHVjB98YEt1y6R8zx33v+bBOwei/GTNco30Umi/pIV0VnFxxNsl9wFud2PwRdM9Bvw7+Ttp4/JdHQoIyajstYq9xFeZznRo8G7RcuX3klUhaSKXNfZNRxagdRbKkC7r0k46lJG7xgY1Z6MpmdXzZ1wiVtOujJxPwsZKm0ZcD3DF/JF3vAYdVS8cms5gk/+qNy7zIu/+PfRV4DrFiARd1X0GleVf4Cx1o4TyrPR0YAAAAASUVORK5CYII=", HB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO4SURBVHgBpVZLSJRRFP7uP7+jUukIaVIxTRH0sKAgKhRqkUVtKiqKNlGrnqRBtG3cRNCimk22SklcBEFtepOmJZn2AM20jaOj5gOZmUbnPf/fufe//8zIjDLS0eN9/Oec79zvnnuvwAKi67qN9CZpC+mgnhKvnKsldWCxwp1kgFzl0XxALEvwGmqcpDY+/uwO491ASLSBsCZsVtlUbC63onpDIXY7CkxXH2kdY+zevACcDhmcAkbwoN2PEX8cy5eqsBUqKLQqwmE2qiEY0eHxxcgJqD+1HJsIUIqTQOoyAGTmAt3V6kdjVwDbVhcgz6KQFZuTi04/zHBCkMB+T0RxescS1OwtNk2umSthJufUfOe0uD748bh7ljLKp7j8swmAVCuDCyhdE/2esQjO7kyCcLq2k79bkeacGtuviah+vy2AsiIrwnFFaChBbYIhJMZMaCjGUnMJi2hXFOfBRb6dQxHI/XskcpLZD/LBXtcfjP6FyB4Kz5xzztLIZAY9uqA+SRhoFbqmoX88gp12Fc1nSs2PJSr9Ocp7A/0TWNPTjrXMgtJAAdR8qxGcpeJk1lxy/xCPUjF4g9CHEhjevgP2rev4p1oOcIT3HE33Uf+8HirxrOYT/yUlqXjV+4F91cDQMO3UV6CzMy17+iVDzedDIhxGgsCUFReArbcEKRxgG+9pvT2wGFsKRCJg09NAAdX4iZPAlavAqePA5JSxijwqyfJyYHycbMNgIdJ4TPjyk6J1fDJTcyhyQ8A8HkFJsiBjVOOBAHCYGHTdBdxuIBQE4nHg4iXg6TNg4yZgZobmYkk/cVL8/iSAavaEActCs58qLhwxAnNRyWXdeiAaBRJxWa5pMTA3Bl+BW/SKipFV3rwGLl2meigxxqEQUUYcHzpA+/Etw1yswm43hz5VAjgsVVXQ+3ozAZqbKNMEcPsOMOIBXr4AurvovpjFfMIqtpjdH/wcOKlzc7i/A3cenqTSZ3MObM4iz4am6bhx/gnsGyv57DUOwDfZy0fH3p9Gx9SXTCJzBOC6unAVug+3mbNrFbov+L3RykfXt9TM2bTFr0JH4556c9SQfhedI/VVlu2WIEi/C3LOnvtW2DbzGfE28I4A4EjmBDe6XnE1dxAzOPmI5AypkzEzHhwnjJsVP319OPvxAjzB0QXjV5buouA1qCzblR7caQ6yPZm1EkSc8I7JTrwae4tebx88swZYkXUZqojOgyv3pwfO+mRmX7Xx6DfouUuL/h//XdTKAN60gINyzinLfF75B1IFGj6N1x12AAAAAElFTkSuQmCC", PB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOpSURBVHgBpVbNbxNHFP/N2puEkjhrQZuSUuIAaqFSQlpU9dCKOApVP9QqVdUDhx6IVFVVD61RJXpzHHqoOMEBCW7kD0BIlrjxEXNCCAUIH0J8CBuQECiO7ZjEkWPvPt7M7thLEgcjnvT8Zt+++f1m37x5Y2ANISKLdYx1kjVNdcl7vhhrBG8qcpIH0KycbEQkVgH/m02C1ZLPF58vIvlkXtnCkq1iIu0mdoVbMfJhOwa71umpBdZxIcTRhgQyHR64Avz/Vh6PShV0tQURbg1gfdBQcQsVB/NVB+n5JZ4EnI52U7/VorESTDK+gsBbuWI/dGMWx+4V8cW762AaDCrcMPImaMuTUKrauJUr4/ePOhDv26DhDugvETrnbK7JtBy6mcPx+0X0h9v4rQeutL4igu/HIUU0NVvCXx+HNIlM16dMktEEJ9nsv37vIXaffUb92yKioyUI0uDQBP6MusBai+UKbhfKOD+8CYPvqX1JMcGQ8Faflp7e3l5kFqoY+OcwGbu/FprAxfbSRPorCDUHOcreyC1icGMLk3TrVYSD/POTokulkMlklDd77F/xTvQybftlr9j8gXglNbUU+YUJKnYVXcYCHNvGw7mvsLVzu3wTkwQjcpRMJmvxMzMz2HDhlMjdPYU/D4J++HZlOftTRSTgOHnY9iKYB4aIsf+IfDkI71RSNBolb3FKTdOkUChElmXRH79Z9PhOp0Mv+GAr7fRpiKhokl0AVXKgxRlQKTugD2AaetTT0/MKgdZAIKDItm81aeKEqcBcDbIGWHkbi5ykOVA1DypnJUGkdsSDeI3YnFOp2VmuSAe8mzAaxap6k3Xh2yQZnJGDcDjckGR4D5zpS6DRXxuD1xkYNBjRnkKNgPdgRbzVCRw/CufcGRhbNq+10ct4AgN6eF2egwQPxmSZDg0N1aP6vqRv/tuH7k1Oc8DqvJHK41jfj4h0qDI9IAlk18zLJ0mQunqTxL6DML7b3/SKXQL3wEXaBB58/7729upWMckmmrpyFXunuJC7ttRbRNMEjupLU8MbscsypWeCW8Wo3rRR1kL0888Q37OzXqRvtHogvrNdg6u7QQ4Ugex62hH/hNvujvX1RrYWE6EWF9/RruZ6Mu5hrrhwEmzkpYPpQgU/Xy7whWP7wpZ3IlLNTa5cWh94Ar4Zy76WYh6Je2Vml5B8Wsb0XAWZkntlWqahAEe6W/3Aq16Zq3+5e+lPUPMySW/x7yLmAeR9gGnPl/DKvKG8BCuDaInVpOWDAAAAAElFTkSuQmCC", VB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOJSURBVHgBpVbNS1RRFP+9eTOOjpZTBppQGrUpwmwdVNtaWLs2LWoRbYJsUStJBVe1SPoD0jSQkkAN+6JQCyEo1NSQxFLTUVLMmebT+bqdc9+945PGGuvI9Z53vef8zvmde88V+IMIIbw06mn00ZgW67Kq1mppVGKrwkbKQa7SshmQkcX5VZoaaHj5O/BmED96nso5FQhA0Fp+xV4UVh3GzprTKD5+TJv6aTQahtG8KQDToZxjbW0Ny+/eY+VmE5xOJ5xeL8yiQrkvFQrTCCE6+42NcLCzHR4CVNJAII2/AajIJXqAIg0GgzBn5xDrfYHk5BcYvFMoC2GpgvRUJILw+ARKL13Anrob2t01nYmhOadpmGnxz/uw8qofGBpGamo6E4WhY7EDyB9LDw6NoOzKZQ3CdB0lkBmHQmRqvIlEIhlYWICLnKS/L0NEYzAiUYBmQZGC9XBE6oYcUWuN9Pzy3fA13cJPqpWqX4uMR0UvQ11cXJRobrcbDocDa5RJ+OFjpGbn7ZWSaZBdJps0B0RqaHQcRVT0Qy+79eYdTvp1VheVjUzTtJgg0s2SnXDk5yPB0duKxr4zHxqW7NkySBlwFtut01XLAGdYi8ViMmpOPfzkOeKvBxAf+yQj5ALLgA0duZFB0d9pv1/WyUEGq3SsFcAJBqhmLZlMSgBEidN0GvGprxB0HGlR+eKCGjaatCqQJhuRIHtd8LeD+q+VXAO5e2lpSQLowdEy/6H7HYgTtxb1xgbHPAQFI2dYdUiTZlbswZHPw3KbM8OtMjZsTszycq64jC4X0cfZfnsZYIZT4eJyMoIuWLirF6GWB0hMTCJX0feQxU2tRInfoQCQl5cnV9J0zg3mnfn/R7G1jREGGNAA8piWlaLw/DmUfxhAyd3byKuuysmpsGleaoJKuhmgWQO4XC4Isb7VsasEhqcAuQpbuoiebesdtstJRfWT0376OOnxeBDw+RDuoNNzrx3JOd+WnLPs72zTS632XnSRhp8zcKdoK7VlgdxFN7wyanQFFv/ybWDF3q5rabrDeoRuM7eOyKMuyqQN8Y/jf3VeSs7L6q7r5Uy7tt+DZn6DSa1nqrjhJQ7sAwoKkKX1ZNYKie9Scly0zvuGVy3bk8mZyPbN3yFqXIGeZ4iNjiFODxCLWVwsHW6vOWV3nPXJzJ629ei3itylT/zHfxe1ysGqzeG0WmtQtG4qvwAyTELQjmMuuwAAAABJRU5ErkJggg==", FB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPBSURBVHgBpVZLaJRXFP7+jDFjTOLEtNZYjEmaLrRJiH2A4ISmpV2UWOqmdtNF0i7a0kWni2IWBScL8QGCL1BRSVBwIYIKBgXB+Ai6EM1IMMbnjPExJviYSeY96u8557935o8zCSOe4XDvf+8533fPOfcxwAximqaLdB1pP6nfzMoLNeYhrcW7CjspgEKlZzoiIw/4P9R4SV38PXB3EH3XL1DrQzgeEZua+QvRtKgB7Y2tcNcv164h0m7DMLZOS8DpUOACvOXMQYyGglhQVgXXnHLMLXGKSzQZRzQVQ+B5kJ1wqGOD2VjdoLG8RNKdQ6BWLuwbT/dgz8Uj+LLmMxQ7ZomVQT+TfuxgZpyAWCqB4eBd/LZiNbq+79Qz/+pIDJ1zagY5LQy+99JRNH3cADISUFfyNUpem4gWF4naFpVh8z0YwZ8rf9YknK7l5B/QBD3UdAw9vo3Wbb+jcdEnmOssxQ/3J/Hdw0kse56QVBAj/BUlOFpfgdNLKixwRTKRiOBG0I8Tf2zTdTlLBN8YavV+HmneuAaj4TEp4H+D41gVmLBCNLL5NNWKD3/qws7mD3UoQsILdNe2EMl2HWQlJRirpaj3fAT+RNKy5vI9rLodEUDDlm9dCwb85VoMY0jjwLIq+U6mU+I74PcR1qCOwsMJ/Yl7fcMXJAWLo2n8dfYmjFhMFKJxIK7aWJT6cdHOqw/hiEQQTSfwNBYWf9a+4QG9rK85ghbuDT2+I6ttexRBUTIJ49kzwEnbsqhIFTITQiZP5cTZdmscPfWlSL98aU0bkAiU1DKBHCje72ywOJKy0pJOW+pwWF5SBNuxkbybqHwaQnrJ7Ow4mYQTkSkE2Rkrw1Pl1SvMKLrqhq1WNuEaBLgzb06ZDARoG76LjMx35ozVVFbrbihD4K6XUuBEXQXCJQ4UIqPlxTjF5+Et4W2uxMcE57jXvrRVRsKzHdj8+UcoRHY0L0DSYa+L1WgskuNMsFVH4K5rEaNdTR9g0xczk6z/aiH2NVblgHN6dDZIjumrop+aNj4kP+73qP1MxpMpdF0Zw4pgFHUTKYyXzsJJSsluWsBI5Vu5V6f5/N/70FQtKeqlg9eZe9md6cUmUk1SkKg7ae23Hegihe2yk6uRO9TIHc4Ga8XIzNly04JjCjhLt8LMeXC81PCjg6HgHfx66H86gGPWZL5oaNUr6XJjYKlfFtyrP/I9mR5FYj2ZVJe+GwNCOBp6IjbznGUC2L7UbQfO+2Tmj9p69HvNwqXffI9/Fx4F8MIG6FdjXlLXTBhvAFZNJumnSqKUAAAAAElFTkSuQmCC", UB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPJSURBVHgBpVZdaBRXFP5mZrNt6dbErTaWYrutgZa20Q22Tf/s5qEP7VMKQoVSrFIfxBcHfPBBxUQFXxREBMEH1wdRQUTzIIIP+fEH8Y+seRGNmo2CJqjZye7OrNnNzPWcO3OTXd1dIh7227k/537fOefO3BmgjgkhmgjbCX2EETFrmWDMJMTwpsaLAoK5WrKWkFaFfCNdughN3J+e6kex0COvwrOkj27EYITjCL/XidA7HWopT3ZrmravpgCXIyDHwOAYli9eDTGdJsJmaMZ8aFok8MuTmA1v+gG1gVH7pmhtiSquLhLpVpx6lcixMzmIv7f2Qtca0PDu1wg1RBEydBi6TXCordFYhOaWIRRuwZ+bzmu8Rgnw3qhOSNW8nPzg6Tto+3IhDKNIURdJyM9VhSiCPyHLBXy7JIr9J2/LuW1r2/iynTjPUCZplQGXpunW8AR2JG9h0Yfvw5lyZbQMnaHZJOZIcFtX4wR7SuCThRG5lksb7F9SliiIfg13Vm7ppTB1+ukk4PlEkphRQHrUhmUpIX+c550XFEzIkBXfmUyp6nTwbc4Z/CU3NTWG0TFbOk1MlmC/8JDLObh6g8jAyONQ0sHRE9y2Ja7RnGU5MphMriSDG0iNqyzYTN6DTm71XHwkHSgsPM0WESWKxnk29u4HVvwErFoJ3BkGnj0Hsllg7wHgLvWPHxYUjAtLCmgywJ5LD5FoW8S0Cc4gzq2hexP+ThKmSh6eTRapnYe5wcH5XgfNH9loX+7gm68czPvAxtlzNjabnLEtfQtFd2b9hcFxlUEsFGwI0k/sGQe20rRHt0kWv7QbGBnVqRQ0RkHS3YrHT4Bwg0C8lW8lz/eV5q+38qUKgWBOC1IEKp8/Fz//4OLaTcBzfVy/AbR/hzo2u54F0qzUGAkD4wVUOT2w5HNg9x4gQ1kUyCUaBf77pzZ57OOI6lgzAol4M4buT8J/fCpF/vgdWLAAuHyFIqIViV+BH79HTVvaMl81U7zJA9zqXLE4IH/d4kuBdaspik+BFsrm31V0/aIWvQi4pPWwgDz9OAOGcqpmjY0+6tlnVJ5ZHpzR6bzgY7afe9vWtNYkZzM3AOv/R63A5d+pXb+pkSPlZ9FagsXKUoTP4DpC1dmFXLvMr798N1S6+K8/ad3JIRFKHBPeJCTocagJnmdfXlNmZvU4hOhSHqnhjHCzMeFaqBBSbQbPubkO0T84Xk7eVT9ZP5OM8vZKfcJzTOHlO6Sgx8jF/TGae+VDwMRcLHjpHxFztz7xFl8XZkCQKSMcCca4pE31OF4CT0OwCrLOACoAAAAASUVORK5CYII=", YB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMvSURBVHgBrVZNSFRRFP7Oe434U+YsrEUiuowZwzAQNUohCASpoJ1ESRC1qKYkate4aBFBuIwolWrfHxhRoIaj2EahMd1pTgYFOmON6Tgz73XufffOPHGUqTx63v1593zfOeee++4AW4ht22Wst1kHWGfsrETVXIC1Cn8rwkgB5Cu9mxFRDvCr3ARZy8Q4FRrG2pt+2dpLS3KNUVkJ01+DgtZW7Gg8rE1jrF1E1L0pgUiHApeAq933YUciMMrLQd4yUHGJNLGX46zLsOa+sA1Q8uQpTF+NhgkySdcGAuW5ZF+9dxeJRw/hqTsEw+MBMQobQaJJExu2fALW7xWkpj+j4GwHCm/c1HDXdCSkc87NuEiLAE/2PIbH75cviVEMcntDCt7hE32LyZMT4/BcuKhJRLoOMsmsJujl5pw1GbbjLUfI4/PBLNkJQ4GSRiMCXP1MFDxO//rJkUyj6MUrvS+DTNBCyvsZMROvqwVF5uDx+dlryhDAFYFtZ5LKf6R6QJpfpCbDQFMTip+/1ou8O/hxUvTSI8MAg5vcN6JRGEWFWe81Col/yrBIQrXASKxJh1KhEFKMpaIICIITsmr6++UC6fniAleN11VilGXItA4raeJYTNqaIl2MpQiOCoJauTT8yfFeDBIJ0MICUFjIE4aDmQ3BnSfZp5VVUCopbS2hIyH9tkoQyAMFrndyEuD4l0w6aprZzSVaByzVshwSZWfwM60OpCbIJIEox9FOp5GvkEu1iKhmZa90N7ZDZBT8KVESyxCYXF7bJcRlrmRCpGiItflbexvurDzjPaV1qc5bbHXoLBu3zrSh2pl9KQ6a2OSoGJ1+147RHx83JjJPArHZFcX7MHZqSM9Wc+mS+G4MitH1A1fWl+A/RNHT/ECP+sS3yFCDDtZY4956RQJV+/kDC+1kW593v5iRd4PoSALBpCfEos6ay/mTaHC2kc450qUwN1w4QW7EpYPJ6BTOf7iEyPL8lvgNe+oleANH7wIP6kGuKzOgSOQJH/0+hrfz7xFenMLXuENWWrALIp3HK465gXNembmjdi79Pjt/GbD/49dFQAFEXYAzai6oynxT+QNcneD436O67AAAAABJRU5ErkJggg==", XB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMGSURBVHgBrVbPTxNBFP5md4uoJFAPGvRATTwYFdo/gMSem1T8AwjxP7A3DsZQEBO4mRhPHOBsPAiGM1DhboCDiYkgZ8pW6O72547vze6UbcOPqrzk676ZN/N9b+ZNdxa4wKSUA4QpwhphT56aHfblCAn8rfGkkKBbWzxPSJxB/pIeecIAtxvVddS8ZfWUfkmNMcwEzJ4Ueq6PwbqW1lM5OC2EeHeuAG9HSI7NzU2kHs5ANvaJ8A6EGYcQfeG4Mok58Bs/yQduHK5Ia3hYc+VJZFpzGmdkjvn5eUxMTMAQMcR6H8GK3YJlGjANh+CSL6ivj2JJWD0PcJzNCGf2jabKc210w9J7HiVfWFhAMpmEaZYp6xoJBWvVKcrwR6rtAnoeP0Hlw3s14Oar1xydIs7PtJJ9vQLemoGdnR3Mzc1hcHAQnuepbBkGQzgk5iqwb+h+gnAdxO7eQ4VWUS9sIKzfotqiMPsX3BgfH2/Vw3VDIkXM8CK+Gz6DuOlQIpYJWgy8t62tSvMx5xU810U9ODigSQK2bSsBnbEAo8yyoe8oGDruUTJHtipos1DQq2DLcd8Ye6urq63si8ViIEAkkBpuhx+0WVg41Fc8VAKM+pcVTfWUi5xib3d3V2XPVq1WlQhQwelBk+go86l/2ICo19VIjjS/FnQwYYUFUdsTtTpNgDwmz4yIoJ1YwafBFsKDpuCXSm0Cl1gzxOUWFdHGqe2z09/fj6sycyih3VJLYHR0FFdhnL0xMqKb31hAnalMJoOrMK5KLPtMN5cF/xnIsbmVzWaxtbXVGnz0y+6KtHY7pssNOTSEG99/6NB9g44ml3ydW5OTk/hX02eq9+Mn3bXE76IgGFwwfEtJehfJeDyuQKe0K1R6Y9Ij1GZnojdeoj2D4PqTURH/NxQuIud4B7mMvq47RfJ6xPb2tmweJ2SzhDYh7TM41jxJy+bGepQ8jwv3MliJrUf79TXpuznpl9NK0GecpII+inV8COTQVcGCmizJ7m1N/sfXRS4ksCOEe2FfPjzm59of6mKqjL3m6E4AAAAASUVORK5CYII=", QB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAV7SURBVHgBpZZrTJNXGMd/RbC6tkKlCggTnCBe8AKKFzDCxG0RLxhddNNt2cx0cTEbW5ZlWaJD2aftg7q4uHiJlw/O69S5qTHecOKNokJFlACFVqHl0tJBS0GgO+/bvqgRF5c9yek55815/v9znmvhX8Tn84WJ8Z0YF8Uw+56IM/AtV4w4/qtISgGAl5XdLyJS9QH+uZjyxAiT9l2FV+g8fUqefS6XfCZo+HD6JY2nf3Y2wWkzFdUWMTaoVKrNLySQzBEAp6C4jsvbjhBjNjHAoAe9nqBXNPK5Hrcbn7uNNms9ln56lv7yLRNGhSsweYJkw3MEgZvL7Pnbi9h68C7TxkcQplUzMzmSpHg9Om0P6uCBtLq7KCyxc6/aSW19G6bKJj5ZPJZ1q1MVuC+Ul6gUm4vptmSW/B1FbDt8T9zIQHb6q6RNVTFEPRCj+Rqx2hhae9oZNTQRs9uKQZPAX0YXR8+bKb7XwGfvJrFuVapirmRBUhMUYJRME1Za0cTG7cVEGrQsnfMaSSlNNDgeYPc2oBtioLjzNi3qJq47itCH6DhdvJt5GWG889ZIoodqZV3JtAH/7Zb9Fbj9h9Jm8VdnxZuCWJI1gknJ7TittUxMnIHDa8doOUu7qYayG+cpLN9HqdPIiqzVbP7ze5bMimDF3ARZN39HsWKmTCnMpRcsUpxaa2tleKSO+ZkGjKUXyJixgMe2FsqOHGZo8DBCBxoYEK5FU9KAeecB6svNLH99NdsKf+btN6MI1Q4QOPXKKyTJlQhypNWJglrpQcxKieJ6+REi4uJpPHMMT9FPLJzaH29IB1WP71NuNGLIno/G0Y+7u36gu8RMZkImdtcD3p8XL16h4sSlGoUgQyKYJK1KK5pln0vmiTeMJMkwjlAB2t3eiMdmJWfgBFaOzeWbrEVMdnbSLEK0ylKPu8WJN6iL+1WlzE4dJmNcvl2vEMQFBxxCjQg3ib1LBIDL1Yi9s5G0hWvxPVwgss2D7V6ZCNFm1EFthAc7WXP4JI9szUyZkkpNSw2/Ow6yfPQCGaOltbOXQImi3rQYGRXDDXsJmhB/UoWGhePt7o9+SCxDps9GG6elzVxAsFpHYuJo+UxjayOZ2hRUPcH4I/9J/kpfaiSmUJFQ4KH6URvzx8wldnCsfMDr9RIdHc39ED2magedncuITvbR3d2Nx+NBp9MJk8ZzK/IWWpcfOG6YTsFv6SXImBxFaaWTC0X1RCcUY2mxMmliKm1/N1JbYeSM2YWq2o23XwyqOAcrO86i0oUSEZHDr1f3oHbDfpNZRp2Q0Fs27kgmKpBWORn+G+8/U8Wq2V/j6W7niuUqtua72ByP0YfVM3TyJWZmHid6kJsb7Te4VnaCI6ZDTNWMY860FeJy/vBUsKTgVEnJIBZOaTdnzSkKbtlZu2wsa9/TU3zzHJr4WCJUaTRZTNjrzGRlZfGwzkawJgZrzzW0ljbccTpKr8aRv/M2sVEaKo8vVQhGBIl6IdWNS9Ju3apk8etj66FyDpz0Ej95OuOChmOs20d84gTGZaYTMkhNu0aD1XWO5ke1RIwZjfXuKPJ33ZF1j/6YpYDveboWfSQ5JEMkmUzi85G34xa/HRNuV4czuPMVrtcdo9Z4hi2H1xPpdWDvcPFGynL2noAvN92UdSTdiX77y70Bni3XuWLaJK03iqfm77gjx3RslI6MlEg+mDcStaaDnm4vVlsXRSYPe/+oFDHf0Qu+/uNJCtyz5fopkjz8lZWSCgd7127BZ7WKQ881PkUD0tPJ+XSefImASF0tT9n01TJzAyRyhvuuFoJomZSZ8FksfoXQUJBa5dxsVGnpimqfLbPve/mb/h7fy8tF3//4d5EbAHA+BWgOfMsLhPkL5R9E39RdNMNd4AAAAABJRU5ErkJggg==", GB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM9SURBVHgBrVZJa1NRFP7uy6t1KDZaUVQsBXGiziurgl0pFkR/gAUFF+5MxQFc2HThVosLt7UiuHQCwVUrqFUQnFs3HahFO2nS2qRN8/KO59x3bxJiW1PrISfv3JNzv+8M790XYA4hojBrI2sbay/lJGZ8EdYqzFdkkwEoVlqKJuLAcyZDLW+HX1IiFqGxwd0U/1aldXyoVvvSU21UUFWkEE8VgDfyJSr2u5EO3PtyE4PJAdzay4GhFVCqzMRNgPwEfK+HbWDZqvsIley2MFGlVNMfBJI5X5rFbu28jgfdLdhWsRcljosrW0cZXELJbCFtESn4mQS89CcsWnoWi5c3WrgGjm/OEpj+vWUN3+m6jkc9rdgYroZgkiJcqx7VkTYbMl9k1PeBdOoNSpZFLEmcdQ+T9Dlmj3jD3WOfcafrBiqWrkGKJrVO0xQcJwlHJZgwqVVs7ctqAu6i9UhPROGl2gUvzNoihmuyPyWLqx1noJhSOQopPwldgnwYUAxlWlM4RKXTdEEhYHqiCW5prThq5TZ32Tghq/ejHRieGtDBv7wYSt0lug0BRzLbf5Vrkp6LJXQUV8oEXrpdV2FIIkJwXKwX358G2TLBWPonlqsVGjzAS2A2UVniGLcKCLFmUg8twSEh0PdX91hnUCqjejSNcSYpDS02TchVkDfmrK0wyZrmKnjgjOFzFUaqXDMQDE1+NQ0NfvEoDc+TTaFZKiCjfkCignYKSUbfRDkCWytmsn3KAFvKPBQhOj+ZW2U58BoaW776hKmspBwjPOQZJaNcFCtM4KyrtKu4Ywiwq2If/peo6u3WfCcEz8Q6sPZIbnSEBYlbV2fNh0Kgz4ydFTVcRQ0WIjqvyg1Q+w9a1wOHHxYZebus6jc36MPlXwqw95Tbete6buefRadZ41JF/aaGXPQ8wEWcC5dt/yVpfWRrAmGyjpObz2sSKpIkG8bgzsVL1t1kMAuCiaL29cQnK9W31dDhJxvIX71SK5mr1YzoiWPkv3ie/2aL5mOqGUjktaePb1l/+PEKO5ofA58/gvr7gw3l/CDJII/W8UAP2K1xk3kz/lp28NK/TcVLGy3g30XEAMTyAHuNT1oangvjN+PVJN9uZwCtAAAAAElFTkSuQmCC", jB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATNSURBVHgBpVZbTFxVFF3nzoPhDsMMzFCQl4C01oEqNaVphVr9EI2JYnzUNqkxTfzQmEZItH4Kxn5htImJSdVa/BATvyRRQviQEKNIW6FPgRpgoOAwD2aY9/Pe6zln7p1CAFPjTvY9j9l7rX32OWefAf5FFEWxUf2A6ijVBeWuBNW5Lqp1+K/CnFSAe5WLOxGRbcDfoU0PVRsbZyPjSK+P8FaRQ9xGMNRAJzbBaOuA3nJYc12n2ksIObcjAUuHCs4Bk6ufQUkvU8AyEL0NRBBzdnKMq5xcoj6A+YGvOKEqPZSkdwuBGjlnT7o/Rcr3NQxFj0IQDNyIbA6F2hMOLstxZOOzMDpOwnRft2bQra2EaDmnzRRLCwPP+L+BweykoISqAkFF10iyKIInVAsY98Kiv45C8hcy0WswlL2hkbB07af+Lr3KyFJjkxLTctrziWAQnRCQpMC5CAj7Epn3kngI0ZQD5pJG+CL3A4b9UIps+GN6AI3Jy6i0+lEgOtj+XaT6JFGjX2As0VuPgUjLPHpBgEqQZ4EkmxCX6xEQ3sTaWgQ+nw/l5eUwm81Iry4hXVSKXX+OofpkPlUlFAYvsJ4UHadrX4aOAStBuoIExVRVidMFxKFHkAawjmg0jWQyiSLj36gtBVLuRRSEvbCH3ZBv/koPSEAj6GIEnTyvoZFc1EzlAAVNcAUFB29zmsYu+DzzKCkpQaG1CaELfWju70IkGoPdPYNg+yuQvvtYIzjK9qCF9eTkrVz0LC8Uhkg0CsHEc7Po3w2H3ca31y78hNa9NYgIrbBarZhoeRnWtudR4PNjpelxZIIBJIrLUJAjqGME/EKRzDI/JUQ7WsggmTLiTuJVpMQOuFbSEEURRmkCdXM+eJu98Hg8OKJbx5yhGpbbwyi8MoSK3U0g138BjnfnCfI3gpDN590kliASP4qAJ0bznUScZstW+TRmhSCsJhNqamqQ+LwPzpgf+qCbkmcgzU1AKqvJYzACF2MiumKap7vgkmLGUrADVyZv4ynHDCoGB+huiih8uA0eewMS7S8h5l1B7dIkt5eJoMUJobxWg1kXVALozIexUWQpAUVXDqfTidTNMHyvf4GYrRKYGELh9G/wXRpFdM0P34HnEHjxXaydPo+IopI0NGswV9nMGOsJxR1Iyw5kJQGKYIFPOgaXfw/C4TDMx7phaj6EbOfb3Kt4YRKtP3yIg5PfQ19WBaHzLbjt9TA+coQWEZqWQ89qBIPsorFNDrJRbOkjhBOlcEcexLwriJYbP2LRVAZnaB6OAhrLqguG1flNK2WAgbPDEKoaIX55BsLsZRguXNV+rtdq0ShtnlCyIUyNjKDKYoZpdADitZ+R2nMQM8+cxr7xb1EwPoidRFZyW6g7N6alqJ/WolPaKTpFdYrorbaW0AIy5/tgpOaMfaXhACwV1UiUN4BY7DBG1raAK2ornHhfA+dvA5/jm0KrXn7ixBkYjr/HSzFzdLgmUVlZCenS8I7gzBYUnPmq0qtibnlwepCrrLT83YB89jXAewdxowhzJs6NlU329LOvDYRF3ty2EbxHG2z3ZHapJPyGK7R44fchTqh4l3IOZivQ3A7Q07IBeNsnc1tRH/1+5d5lVPkf/y66VIDgBsAFda5HPeY7yj/RD4oP3z49HgAAAABJRU5ErkJggg==", KB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPXSURBVHgBpVZdbFRFFP5mdu92u7tCfygV0aZaISbbmhr6gEAEeTHpCxoSExMabGKMiQ+2JsTwxPbRaAzPCELgXVQSjU9dpUITjFSoFR9gW2oxRWW3f7vd3bs7nDM7c/eWdkkbzubcOXPume+bM2fmzgKPEaVUA+kJ0mHSlKpK2vgGSNuxUeFBBmC9crYWkVgD/CNqEqQN3Hd/GUHhh+91q+bmdIxsa0Ogswuh3l4E9+yzQzOkQ0KIkzUJeDkMuAZcPvkF1PQ0ZEsLRGMDRCSqh6ilRdIllO9O0Rggev4CAvEuC5MgkqFVBGbmmn35s0+RP30Kzq4eSMeBIBQaBI2mhygo/QTK2RzcWxMIHe1H+NgnFm7QZiLsmlNznZeFwYtfnYHT2alfCkKRwj8bYeArfGyXibw4dh3O+x9YEl6uV4hk0hKcpebd0vhNLB3cDyceRyAagzSgwqIJAfhsLwvqlxbmKZNbqP/mO1uXJBG8LszsU+xZ3NUNMX2XCDpp1sIjgC8DpbxFpZ8wFlCiF+4f48DevYhcvGSDGoP0eJOt0vhlYNttBJ6hJWm9D+HUe+BCrSTxUH0ii3nImAu3mIR752cEX3iN3QNMcIgtd8vXkJ8vQrJHTkIEmz00xpr6R2A+uwU5AtoULeCl55arTIoCS2kINwdZIqzIRQShCfYzXDdb5fwYpKwssxB5iPK/RFTPbMjmm/FnMosvRxzkQ0/hw0MFbG0ooCmW0gRC5WguRT2el7CcTdrE2plAHygUUxVwbxmKFFlEvhDFr6eymHm2DfHdXWhSGcze+x2Tt5cRfgeI1C1USOyG4Ec54xFIa1VmXt0oVupCS4j85WLi6VZcnhnBcCmDmx1dCFwpEPjcymIIH4mtDemkfhdoXBG4ooB5ibdmr6GptQczYgd6p0YRCD9SZVR3nHTarSsTNATtMnqAvjVjWEs6jj/A+LUYjm+7hDTVdnOmDrGjC6glMtxtzTEm+In0wH+hwzgzcwEyYFL0Z1FHus8mzEJbBRHgXqQao0yBy0B/y2Fsr3i/5YPGRU5z79jVt3EjPbqaYD1iCFrD23H+4FXrfZ4OrOCSJ7nXt3NQRylsXPQJp8eJntPWdY6/RTbnftLMy82vom/HILyPzAZmz3KExnZsirOp7wY2NAEzWceRnR9rErUeEhPDsQzeR2ONDBnMVRdOghq+dHBnfgKJ397DbO7vmuVgYJ31i4PU7vaDJ2xnrStzwJDoE37j/1Fcuf+jJpzNTeuYaHCzBtyz9Q0/8JpXZo2Z6Uv/nFq/DKsn+HcxYADSPsCU8SXMNq8pDwH0Lhftsd+6awAAAABJRU5ErkJggg==", ZB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARRSURBVHgBpVZtbJNVFH7u26+xuXWfmYGOdIkfrFGygZKBTPdLMSxoYjBki8likP1w4sii4eMHXUQl8ccwwYi4OIzxD/9M0ER/uM1Uw8cGxMmHIFDqVlzXtV3Z2q5r39dz73svW7aWQDjpyXnvfe99nnPuOfe8Be4jhmGUkh4kHSC9ZSxIVM51kbrxsMI3SYAHlf58RCwH+PtkvKSlfJyJn0Y68rOwRjYu1mgOFyyFHtjLX4G1pFFtjZH2MMaO5CXgxyHBBWBq/CiM9Bg0eyWYtRRMKzTX6Qkim4WeCtAeoOjpPsNSWKewvETSs4xAei7YQ9ePwRH/ErbiBmgWm1jE2NJIScnqmQQyib9hr2pDgWuPer1HRaKpM1eeH/3uCrbvs2Fa3wSLlqEFSVhY0rRS1ZwFCVgJwV60BvOhfoq4VxEcVDnR1AQ/82w2ixfqnVjX8CwOfL8F4ZjNBDRSApSxlFBNkKRMlWOroxrzwSPI3D0Nmb9+QSCZ2vng1z/G8F84jXOjMcTnyrD7m22YiNrpiAicgxlkjYQ55tZYFJnVShEzpBeiaOZlziN4nY98wyG8fWAY7ftH8FRtCT7cWYfKihp0f7sDd6aIhBILnYB1ioJbCc4tJ9T0aWiEps+cUVFw6eIEr/GnU4NjiM9kMZc2ULTChk3rKuF2PYYL/zjw1uc7MB520O6E1OQ9VZEwIyoILKTZ2C+K4CXGbyU/s63vDOD382GRlhefr4auA1Yrg07lYrdbEPz3Bk5298FVEcWSeqJfktZnSA1ksjS0e7DC8xN/6ddkQhAIzsqqZfhteBI+Iksks/jsg7XwdnpQVe3Gtk/bEZgsEIAgz2HM8jMhm5E7GSWd125csbs1LL0RbGFwdjSCyzfuIjiRwtC5MOyFNWj5uAP+iRKDg9JtMyNQW5lycUE4gZ8/OIsdyNE5sJMS3/nRebS2rEbvvnpsbqzHm73vsUC4HDmFma1ESuweQdP6qpzrs3Suoak5JFNZbGyoIH8NXBt3ouWTd5GPhFGfknKREwzxp63Nq8xwRcTGsk2hyByaWgdwhY6ssb4CloKaZSRql9X5spr6gVcRT7IojZZdQ/CNTMnGw3J6t2FtOb4+9BwmwinsPnQRibgfp/Z/gZqKCFUc5deyCrY6n1peq1FT4m12kI/2dnhyer9Yzv4ZwcilKK7fnsHVm3EUOd0iktuTZbynweo+rpaeIGy/cFO2iwukpYePX8bhr67mjYK3A+5pWYkNW5oex/ZXXeg7eROjf13C0LEMymo7+DLudAMnEGXKH8iIHr53l4ciWWP24xzR8KRzTyPTaZHw5g1VdF/m0frGRgXOpUdiLvvgeGF2Voxei6Gt+wwCdxLIJ888WSJaSmfbE1i9smgxuFcNcn0yuySJuOG+kTB+HAwS4TTddpPMWWzD5vWVVHkrhZWS85OZU+RH/4Tx4DJgPMK/iy4JEF0EeEvOeWWZ55X/AUn0hLaqTAQuAAAAAElFTkSuQmCC", JB = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM0SURBVHgBpVZPaxNBFP9NdjepNYVY7B8QTai0KDShBSmIoAWvgkqOraCfwPgJmvZQr149tbSCBy8tfoBWBL0ItTlpwSaCYlvEBNqm+bc7vjc7u26b9K8PHjP7Zub3m/dm3psFjhApZYx0gnSJNC//SVHbMqQJnFZ4kQY4qcwcRiRagD+lJksa4+/VjRo+fK+odqfmqDm9UQNXOy3circh1Rv2lpZIJ4UQLw4l4HBocAX4enUHm7s2Lpwz0RERaDNDal6l4WCvLvFru8FrMHW3E32dpgeTJZLJJgK9c8U+t7KNxS97uN4dhhkiUCHQ7KzkRajUHeSLddwbaMOj4Q5v8JnnifBiTs0Kh2Xu8w7eft2jEIQhGJynBAi4S7g+AXvA7drvKh5eO0ckUS9cw0RSCGlGDk3s258GXq2WcfG8hZoTQlVrLdjagb70xgS6ohbmc2XkKLT6/Ga4E9K7f6yCt1SiXRtKKwEwBuDz5bZqw+3bYh+ZYbjr5mmDWkb5mvPJPOCv3EYdW7tQYdmuCYQt4UZm342QkGghkjbQEGptbrOhvNC3K8ME97lXrVWRHhAIGQRO1ojlRV26HYmmc1ZmzVhtkNZDcGwHlWqVLIrgDhMMcW/h5XPk83natYvCLluWpVp9EfwxqVH523EIsFLx7ayFRAIj09NsSsBLxXg8LvU+9ykRSCJqUtM01RiRNK1JJBJ+ips4RmzbVnpWYYICu5JOp1EoFJTbQogzgXkh6u/v90wlwUWNOqOffpSpPDTUTRAtM/dYeAXOZzLUY+LG5XY2LrMH75ggbIXxZo0JhNJTE7gJDUk5MnLFL4CLnMmqZqSINdVj6Jk4o0j0RAVS3f7RLoQoHFw3lvlrPBlx64t/IU4D7bowcbvdM80Ga9ET0hIzjyXD2teTg0MXvLHBCPpiKm/U28AdRcBMnmGcJo0Nhmm+o9NUHgvOc3nNeNKP/aTGbHpwsnArK9ZLDqbeV7BZpgz2p4kDhBLJLoPALYq7EQTPIrDiwIZkRpOoJzO3ZePjTxvrRYdeNxc8ShtNEuDNS0YQuOWTeYjX6tGflSeXJfkffxcZDVAMAOa1Lcs1/yiMv19zMrXPTtTNAAAAAElFTkSuQmCC", _B = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUtSURBVHgBpVZrbFRFFP7m7u222+3udrePLY9CoYBpSUAJPywGpYqACdEgSVFpDajRH4a4EPhHYhujiQkWYojGxFBeKtigIkFaUQpGaaNUHpVHkdJCad1d6d5ud+++944zs/eWkrYG40nOztx7z3zfnDPnnFngX4RSms/0baZtTHvpPVH0dx6mZfivwhfpAA8qTZMRkQnA32JDPdN8/nzh73acHWwVYzgRFDYl1lLMyZ+PJVNX4uGiKmPpMNMGQsiuSQl4OHRwAfjFtQ/hjdyBM6cINnM+LHKusIumIoilVAyGb/NVeGfJHjrbUWlg1TOShnEE+s4F+74rjfimpwkVBYuQJcnCKscELCtS+ZSeDeQgmDARhs2IougNXsPqWbV4uXKLAbfZ8IQYMWfDeR6W/Vcb8e3NfShnISAcjVDMzUtgXWmI5pqosFeSEn7w52nnFbPESZgRugMX8Xz5qwYJD9cjjKTPIGhiw4ae4GW88eMqlDsrYMmywpWdpjXTw3SeLS5RBuRXnGJ7bldA7O2ckoMWrxWBuAQ1HmKedOODpc1YmDmX04ygmui77+Vv1rdUwR+7wwgqsdwdoc+UqESmJnrgxHJy5NRShCMWtmEKp12la6t/ouuePk1UqpHjf1nRPmRBj3IFCwoeFSS6ODmBh012Xrzbjq0/16DMlqSeh6ykwmGCGrPQjQ1b0TtQQngkCNGjSqmIzMK5N7VPt++UCNHQHdTou5dV4ovK2PHYl4YXDRL7eY7PfvW20BdnjNAdC/ykwjbAYFQcPbOK3lWLUVRkonm5Mo1E01CjKURiaUSZdnTNlD5urha282yD5JPFPo1h4Bdvq+HBE9wDhR9uLFBNiXaamFjSSIxWIlnYffIk/gjcStlkO6a5XNKMQhe54O8i6cHZOPy1QpOpNMnLVXH5UC00LckUSKWBcHoRCt2dnKBPNgoKtJcQKZNWXK/3F2s7dqtSKOyQiUREYhAomFZSSEsqu0kdS8Sr5xy09ZiZ3PY6Uer2ixByU6scMDwok8cWBBmNM2A2paXhkQSyZAIzy0a+kIdlSImTvu/t6Gwz0dVrKN7cHtIctiwJY9aLA9OFf+jjE5W67qtrd4GiTXcnYLXISKY0hNQUrLkmFr6MUTKZJqdOmIi30552WAfu26Uklxkww6MEzb5n0TxgH+W2ZMelmqeO0eFQEuyAxbt0OvONe8V2DQsr79mFh0ejENcI/bzfTg8OPG7gXOAEZ/isqmQl9vbZyYbOKfDGZGHgeekrzJzio4HhhLAOR1IIMkIT88KRl4UCew/dtO6o+NY1ko2tXcX0s9t2sti9yojFUZ5F/JB5JmFbew0uKR0ijmunh7RXZg4jrFql95peoPuOr0A8YSa8oh15Kl5f8x22rD9CNVOCHBpwaM39NlHt7pxp2P9ku+HULKNVtLFh2aWhdmzrqBGpwEnc2SlsKg9oi51xSWP9pqd/qpZtTkrFLoXmmJPkYjBba7zhknwxGVQTQPhoaQvK7fM57F7WKjaOa3YHrzfiwI1dmWzSHV3hVrG+NMgIM4cQTkn0/esu/KZYMhZUYKN2jgd18yZodjqJaBl8fvDPnTjAdCwJ96aWVWmCHeSeWw6ipiQBnFnLwOduRh1TXe5v12NI6tnALx3cHLmC+t9fgy96Z/y1h3vACwqqUDdns2hyuvBbrd54mOjK9OgkosIvDXXgrL9VEPqi/cLGKjsE4JLilWOBJ7wyJ9mZuPT30geXNvo//l14dABlDGCv/q5eT/NJ5R/BBN+7lILg8wAAAABJRU5ErkJggg==", $B = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR2SURBVHgBpVZdaFxFFP7m/u0m3YRE0zS1/iw+KMQUUq0lFsFdCChWSV6KT4oUhT5Y3Lxp/NlEoT4o2BZ98MVWSkURqUUQpMRd29K0xbg2bEut6CZBE4Jp9ie72b17753jzN17txu6iRUPnNyTmTPnm/OdMzMLbCBE1CE0LjQhNEM3JeuNxYSG8V9FLvIC3K4cXQ+INQn+qviMCe2Q/9tmEtXyKfdLPOf6KGoYqtEPo2UIWiDiL5WT44yxQ+sCSDq84G7AyspBkD0jAm4BUzvBWMjzKwqwErj9h7CBTV0noer9fpgxATJ+C4C3cxe9UhiHWToC3RgQwXXhRCK4cCV/FbkmEQN3SrCtNIzW/Qi2x/1wI34mzOdcfFKSlmJhiuzSKAsGOJgiHISHwmqePKegeEFH+1OmC0aecg5Y5k/QN8V8EEnXDgEy4wMcFZ8XLcuixcVFFgwGoamrpClXoSs/M5VNQcECsidaUJ1TsOX1kot4E4DgOAVB6xW03Jnw65IUAFHm7T4jRxYWFtz8AoEAFEVxVVLD8wVUvvmYnOtnGK8Axr0cHXsr0LbxeiYOl3W7DGgRtAoQTzo18WdYWqZpykygqmqtJks3gO7Nrm2ePY/VcwvMng1A7emBdYOTpe5kmw/kuYrLCi9ck15QggLESroN4mURkxlIuMjk5CS1tbWhp6dHUMKw/NIB3PFeXPCeB9NUqHdthfXb74JsG3rvgyCzCjszC3XbVmTffIe6P3qcQZvgivODogZfQKD9Q5cmmYHbX6OjoyyZTKKvrw/RaJR2h4Ls0TfeRXD3LrQ++zRYKARnaVnmBkPY0E2UE2dRTU3DGNjJLOM5UYu9igMHWvUvCtQaKKz5ByqTccuAdDotlR0T818ZnUhencKgsYrQrijd53CmtARcKqu/nANr0eFkc2gd3uPWyleH7vbb3wVoKiHRo3+D49Nfr+OJTw7ildfeYs8YXeju306P5RfRdeYD1vb2lyie+FpQqNeOhwcgN+CL6HTMSGN7X+caAHm4DtslBMWCSoHh5FAQQ+EyHipeZB3HY2x2Yh4vD+/D5w/cgyvpNDWu1bT6vnP1ItulEczPHeITSSjfnQa/eAmKNa/gsNaORx4mFLIMcwXBf5GhrBB29BOmL6h43sphRexYNAeJ2rHBwUEaGBhgvb29tbMgAMaEEeeivZyVKGSXytMrdfISKPEjUE0a7PQ0p2irztSciu+VCtQyw3luNaU3kUggEolIc8S/812x8hGys+Iey4vhwlrN/wnn1Bfg+/eB3x8WxandTLdoOBxuvMbDLqJ/9/NqgqxlkJNrDtKo16bAj7wPvudJkK7D9gFSqVT9jain5D0w8pUiZzW+bhbrqbkEmvgWdPyzMd7w4oXX8OY9f6445Tg5Hsi/Acl56SvXNEisaXFkwesudoqcQrhOlw/k225gMeesRIhbicbgY9hIvEyyvrdczFdjxIsRF5BLXemvja0NnF13501AZE2O0e1Lgv7Hr4uYFyDbEDDjjUlKOzaK8Q88uLDBUBoBfwAAAABJRU5ErkJggg==", eW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL5SURBVHgBrVZLa1NBFD73keTWaJNiuxCRxiIIQtHixlXrorpT629w58a4V0yra6kbd9JuFUHUH9CHIO6sXYggtkUXRVHTGONN7ms839yZ9KZJJFFPOJnXme87j8lMiP4gQog86y3WJdZNsStlNVdkLVC/gk0KoFdZ6EZkdAC/xk2JNY9xvV4n13VlG0WRtLFtm9LpNA0MDJDjOHrrDuusYRjzXQmQDgVOjUaDKpUKBUEgAU3TlAoBEduS7/tyPDw8LAmVlJhkto1AeS7ZAVytVqV3AOUNUhO2zRZknudRNpulXC6nTa7rSAydc25eIy0Ar9VqlMlkJKgmkMZ7SDQBWkScIEG6Jth+y1T2SE0ensBzhAtgy7KaBMlItCZtUqmU3AsiVb8F6ZTyfhOD7e1tyQbvdc6TXqOv05OMBFFAAY56jYyM6OUhm79m0PtW+0Lr5Zdk2RY5DYdsK02GCU91JgXtlky0NhEXPPTJ9VwKw5DGndN0+EABS0UQXELv4cZ9erLxgEyLKGVnaDA9REbbIe5CxFL1KlT3XRIh0eXgCl0dL2F6CgSn0PtQecseyzxQIDz64X+njOXsATNaeWTDBQ7Z8yiI02kKWv/6SvMWbFUQ+ux+ijcqjED4/BvwyTS4iE0SI6Yx1CnCR0SybRKz/gwqLQS7ix36Eccc0R4R1LMgKVvo7E/l2u+Nv5RD2SO6u9MkOHnwDP0PgZNjgyf0cA0pWmE9O2NP09j8XbKIOpye3oRPq0znxL1pPfUUPzQUuYyRe54XXqzKvPXLgbIAXIyO0r537/X0UZOPFu6NZYzSN25KQ639EkCdR4/11CLuongxfmDwSgnv9pz45aREnbXRo8LWZfXuzCVfvEKrB/HzJzSJqzbW+weHFDuHKURJW4Rra8I9fqyNqJ5QrDXOTYtwZTkJXkpidnoywS6vb4yj1RUKnz8j8WadxMet2CiXJ3NykqwLF7md0ls7PpndIkFNFkXvsiT+4d9FUQGUE4Cbaq6kjnlX+Q29hmFUs9PwZAAAAABJRU5ErkJggg==", tW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOASURBVHgBpVZLaFNBFD3zXqKt0TZpoCqKilgtaqOCih+ouHLnZ9+CguhCxdSNCxVTdKE7N6KColsRQevGotCPIIK02mq7tD+FVlqbtuknJu+N986bSVLTlJZeuG9+955z752ZTIB5REoZJL1J2kTaI7MyqueipJuwWGEnDbBQeVqISMwBfpmaGGmQx39bW5BsaECKWjk2pmzsjRthR3Zh+fHjWFZ9xLjGSeuFEPcKEnA5NLgCnLx7B25/P+zycohQCFYgQB4CbiIBSer09rIPSl+8hC8SMTAxIqnPI9CRK/bJ27cw8+A+/Pv2w/L7ldH/qUqt7tQU0l3fsfzsOQSu3zDLdSYTYWpOzRcuC4MnHz2EnyKylIEkFQUIpG4Fku1tKLp4CYFrN0y59hBJryF4Ss3p9LdOObZ/r/BXVcEXWJmJXCmVgstj4KWmZAKHvs74BFLdXShpfAe/ty/NRHBU6Oh7eGa0sgLo68OyqghswaAGU2Tq6cWskXNK5dBiqrMTVnU1kbw3iYZ89DlpNlUSOE+IPyMQxcWzay+9gcgBR5Yb1kxSldRpbVVYOoso451QBG8aYLMh6/AwRFkZRS+4fpnYxTo/7RLtSncqS0LrKst4XPlKjaUJjjDBbu45HR0eOA+SSYBIJGUBy9Ik1K1cAYRtuJ8nsxnw2vQ0RCqVIXA+tJrVTUygLpTs79OnRmdNDkptG/b5UoiddFwrfRAWnahtxZBtSTgvE8B42ssix9eNx2cRKLl6N5weTE55AHn3G6hZZ/tOlbiq37jDwpOQPy2PhmbZqEQdidVFYTyA2k716WUmGQz6Jid+eQRWPsFAWmIo7fUHqZ8osnyz0TWBK7GybIOZjVuaALvCBzBH4BlZRZYXBl1Eh1yMuZhXNpdsN92vTNDCvcNrj2VPn8x3ej5OURPwqAO8TciC4FJjaXnNBOo3IxI+SFkcxFJlzYr1CkvLK4vOOm95M49qt9apQsrF43r1J43tfWymnvFvkdnOM6RxZq6tqMve/wWje01NRZTqv4O76m3gjiJgJjNRs/WKIpELIdE2bFtDPrXkq6VeY+Y9ODFq+NHBj/FuxNrPYmj6Z8HTxcAq6y111B7IBY+ZwVxPZlSTqBveOfIJH383KsKh6QFlE/CVKsBD5cdyged8MgtEph79Z3Lh0iSX8O8iqgFGcwB79FyMNDgfxj/4sgTdq4nVowAAAABJRU5ErkJggg==", rW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASJSURBVHgBpVZrbFRVEP7O7W4vdrfttsu29skKoUmrQKiKDxIU/xgxlsQHP5tqIin8kKqgiSHSJhIiRovPGBrSItoYChFKsDRG6oNCogZKu6YEMe22ldKWfXYf3dcdz7l773ZLW1LjbCZnzjkz38yZM3fOAnchIrJw3se5h/MQzZJHW2vgbMd/JWGkASyVWhdzxBYA38WHRs4WMff90gt35/fqmPD5QHxt2YpymNY+gPyaLcjdtFE39XJuYowdWtSBSIcGrgKOvd+MiHMUcqENBosFGWaTqpcIBDkHEHaOCCNUdhxDFneoUSN30jTPgRa56n30vYMY/6IFORsehGQ0gvGwmdAkzYKSInE5EQoh6BhE4at1KNv7lg73un4SpuecD1dEWiZ/OE+jOxpgqljNpLQomB5LugP1l5QD129gxVeHYXv8ET1d67mTYR1DpMYSjUYRraxgpZ3HmaFgOVF4BiwUBvhIPFIIORhSZaZyWF0zFtio5OQxRMpLEIlEoN1fqxqPFv2QmDicl2HNLIIsy5AkCaFvjlOwvQPLHtuArBe2Ql5TJfQRH3JS8MQpFjr3I2XXv8Luef45KIqigkcQgr1olZ6qPGi1TH1TF+nZU6sTLVcOKC6Xi7xeL/l8PvLdHCe/36/ytQtnqP/XE6m51+lMCB2h63a76ejVZqo5U0l9kxf18m0UKdoqXPWOd3PvYalj7HO27886xRW9lYzBlKUXASZaWxA53I5UhVgsaoo9sSnaP7gdX498iFBiGr23unWVJ8SRPSJnb17YhgHPJTCJXyc3M0hG+rS6C1b53lSlxfxeJCIhLLMVp5xElBml/venpGDcD1J4IAphpfl+fLn5nNgeNmgXgonwqF4uKsUpxvIzC9XIdTJk56qcvpbJZIkowaEh6faBuE/ftkuz5wUWkiNKCP3fHcLE5GBqbdo9hsn2NoTi0+pcYSRhERIbw0IwG3Pn+JBYBnljLgr4JyE3tSJy8mxqb7zzW7j3fwBjIIYgdzKTCM0BLTKV6aI35WCd9dGUQlXOw/h4/VlmMVqZ1WJH6fkulO/YndqvqNsN20+dMFryYTJk47PqbhRn3Uf64VfmVOmqfcLBz0LaWPQ05AwTau178G7VERTIJUmVWJxM+cV3nhxW2yoofr8q2+RifLTuNHupbCfxnkICS6PTes9XyTl1Q/0GPB6PWtujB5vJkVem/F27nW4PONQ1wa7rf9HwG+8ojuV2Gmk6kBBrwkbYXrs5kN7G7Xov6uHDk7FYDPwDAv0zDveutyly6bc53VbKNoPJspK47ZpzqZlr1yjWI59IrLgIubm80gyiONHGe9HL85qd74/LGNnyIsg/Pf+xWITUJms2U2nHUeRt3iTM5jY7IfBB7eG5D1XD9lp9qksuBVywrWEn08AFNWmY8x6cRiQ7K8JXHRjaVosYf3B0JXYHsCATf9EK9+6BefZlE+CNWMBGd9KgOVG/8AB/2XydXZjpH0CUOxOUwfMsAHNqnkkHXvDJXPjYyUe/jZZOPfQ//l00aACeNMAhba1RlPndMP4FK1/t36HxteQAAAAASUVORK5CYII=", nW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARASURBVHgBpVZdTJtVGH6+rx9QKNaO/VApgcpkifw4GBITGSvLduNMhk4Tt3jjFF280eqFd2jJbkw0xgv/ohfswhuzRENMtsRoGIvswo0Jo8NkjLWjgTVQ2tL1j/59vud855TiYBnxTV7OOW/P+zzvz/nOAXiI6LpuI/2EdJTUp69LRNjcpE5sV5iTAHhUGd6KSNkE/H0aPKQ2th6bWMTIpTu4TGP0fobvcdY9hmf27UR/XxNcXXXSNUo6pCjKl1sSsHIIcA786fAE7t6LY09NFXZYK1BdWcb3xZNZJFIZ+BZi0Gn98+cvcEIhHiIZeoBARM7Zz35/FV/95MVz7bXQNBPfpihsD4qj4awjmc5h+nYIZ060YPCdbgn3gcxEkTWn4W9WlrM/XMW352cool0CTRG7lP/WUk64Tsws4b1TbRh8u1uWq5NI/JJgmIY3pm6t4NnXz6O9eTeqq8oNAgGsG3mIuV5CpzN/3I+ncXNuBb9/d1z25RIRHFZE9D5e264OqIF5aK1tUAlcxcbggzU7oSkqdoWWN9Aw8jyR5G56gZ4eVP3yq2TfwTBeYrP8lT8BAmcGNRKBmkoim89BoVFJkiaSmOvqxtRT+4x1MgWVjSlD1dVV7lsYH0eOYRniZrZ+NstduADWThOLPLzCQf45fASre+wAgYFAzK4+7D95kuYprnO1tbjd02sQroR41gwjT1hCXIygg6fpnV4vydoa4pZqZCliP5ULBBBoaUVZZSVmFheRe7qFbAlUvnYKd9raqf4JKOl00b9wZVwSODWIDwqBAG+ibKv3yFHkbDaED/bC0tqKBYsFvslJVFRU4K8TryLTewhOAjctLeHy8wfx4m8XuZ9Kf/NUrlICyD4qyvph3B2PY8lkQoAiNjc385PSUudAfX09xqnOaevjMBFQPp/HXipfEQMbDzQj8DMmkAOlUfwhReWIxWJIJBI86kKhgFAoxG2NjY0Ih8NYXl6G2WxG1FKFUlEbGuQ0WiQw0fHSZ7zc6qfa17o/hI16wQCampq4fZGyYZk4HA44nU5q1RpmZ2ex97MvEF9YgGX6hpEJ65shk6wvY5z12DFuSVO0mTffQpqaFgwGkclk+JxpNBrl2cg1I8hms3w+P3AG8tvWBBbJCPvQWJMjbJV7+TgU+hZitJnVMUmnJxKNwEG1Z8LKomkarFarEYwgtdvt/LPLfPM1asrLUHZtUhI8Ka+KURr6xq7fw9F3L1KOxQO7DaH49QKu/diP/c38Zj1HV8VpVfx6mjXEdeAJuqw6xUWmbxNc574CnL8NbMIJ2K0nDR8PdNLGjm2QrIMzXyFDAvOBB8dDA3t0MHUrjFc++gN3g4mHwrsO2DE40MHHEnCPXGz2ZLoFifFkXg9iZGweN2bD8NPrxsRWXY5DBNjvaigF3vTJ3Dxp49E/pz+6jOr/478LtwCIlAD6hM0jjvmW8i/6z3oMPQb6mQAAAABJRU5ErkJggg==", oW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN2SURBVHgBpVZLaxRBEP66Z3Zj4iOrIYoIsgcNKMYIXnyBuYkB0R+goOBBvJgI4kFwd8+CCnpPFEQ8mSAonpKAMR4jkngKeYJo1GTNvrKzO21VT/dmYjYxj4Laqa7p+r6qmn4ssIoopWKkCdJe0jG1KLPG104ax3qFgwzAWqVzJSJRBfwWPZKkMR6XBj6g+O6tfqp0Ws+R+/fDOdKMaFsb3FNnbOgcaUoI8XhFAm6HAcfQzCAO3HwANTUF2dgIsTMGWbdVh/jZDFQ2C39ygmKArZ+64ESOWZgkkaSWEZjMNfuzkYfoHu3Ei5eHISMRCEKhIGg0HaKg9C/g5/IoPR1EtO4GtuxIWLgOW4lre24zf/71Id6MPUPTrmY4XgGi6EGKcDbCwAd8kmwZPQIvG3TGkCQIs5tIxqVhZG9sND1MBI/QULcHCyoPJ09ayEPSU+ZyEPQU+Zy2tY/fFQqQMgs3ug9eJonSQh/M9+vUFZjsr/Lg/uB1CKIUlPKCz0CFIOtQBUpVmqo97BMyp5uhHKCYScGtaeUJrbzMuUWXePT55yB+FKY1wXxpFjVurc5WLMULIA2LJtQMlIygSoig5PXpKgxJOxNcZGvg2/sAgAjS3m/sEDspLhdaCwTaSJonMyMrrEJzZWnGLLUKcEjLCz2W4CwT6PU1mh7R4LRcUFJF/CESZMvQUcqUcLQI1JH5KoqK8ArDDGmwGHya7lMVRuKu+SD4np8KEjU9KSmPepWllJxgxpMMcKgcvOS87hHTNCP65PA4L61MUtZ7LiCQlUzCWy5slwn0F+kdyrqWKthOepfsCT94t/jVg/wMkRUmGGdjW6R++bkRlgMEmKKdfJu0uVR9jq3CiVvPnGsI4i0NJzA2P7wyQX8EaxXhVI6NIa6gn63Te89hyRLfoHDH3JqLdtjDBHqPH204iRbSzYj+HDIOEWm1rm5J5wV/8j4eXWnq0LM2UgCDc5y77bV1dYXPomukc1zFlYMdqByV6wDn+bImAeHq/uu7gQ1NwEzWcbnptiaxGf2PR8/hrbAlAVmbtO6Uwfw3E5W0dyCdrKp8vEWVd+9SvlEVsln5XfnSBeV7veHrMxnGrHZltsMc33r8cQCgKxPDX6AmJ4OA+nqAr8rzbRCnTtvQqldm9bKDS79LrV161Sb+XbQbgNkQ4JjxcUtjq2H8BdKUIMMjnl76AAAAAElFTkSuQmCC", iW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO/SURBVHgBpVZZa1RJFP7q3ttbYtKZmZCZQdHMwwzjzDzMhiAK+iyuP0D0TQTFFhFBBNtHF4wLPriAUVRwAfEl+OAWMKIgqKgYcUk04gKS7nSnl3T3veU5das6t+1uiXjgdC236vvOOXXqVANfECllB+l20uukQ3JSUnouQdqNrxXepAGmKsebEYkG4BuoSZJ28LhYLKJQKKjW8zy1xnEchMNhxGIxRKNRszVNukMIsa8pAYdDg2NiYgJjY2OoVCoK0LIspSxMRGtRLpfVuLOzUxFqSRLJjjoCbbliZ+BsNqusY1DaoDSwttoyWalUQmtrK+LxuFmy0XgiTMypucdhyQ4+QbY9jkgkokCDBCIzBoQjkETM4IaAW/a4LTWKtj//MuH6h/YMW5qRQ9PhPnqI4pnTyl0Gtm27hiB89QpC165Wx8E1oVAIxZO9qNy6CX1+x9V5aetX86CwaiXsxUuAoNUMNPQS9uPHCF26CJQrym/3/znwurr8ONMaJoKwUNq9E87F+Ty9kNOcPVjOI5eZR17D1gcZjDlaWhDd3wPr3TtYHz8i2rMXctq0yUzRhtiWgDcwYLxgSTDaMu5V+vpANsA2i18NE+BbRA70QLa0QrKF+QJpDl7Hd5wJiBw7otY4TwcVGuWZwnAJS8sCh37+VgdN8Wc2TxM4/f1k9V4VLuvBA4pfnsDzflpQv2XdWhW68KGDyG/dBvz6Gy0V6rN3a8AQdDv6QCg8IxAQ1byVMbpAlKoUXDgDN00sfEtfPOfU85WyyOvu9sOkvBBwyTtDYFXjqPcbAjE66ndcl+JX8ZUvllEe0zdJ6WyNvJnEQO3tZYJh1WuPIygTa9Yid+I0ZNePaCbe9OnInb2A8vIVNfPWzJmmm64S2PPm1QFU5s7F+NnzDcFleztyZ87Bnf1H3TfhXzaW+3wG/aQLrUWL4B49DPn5aqpDxY2bIGfMgEhnINsoo6gsWIODNalas4WwtFwSfBmok1IWr1iK0r//obR+Q+090GLfuQ3508/wZs2q94gOPLxnF0KX+xC6e99M/2IRENeNGwpg8xadHLJa0Orcp5rTCNyoc+KUme7lWlRX7IrPnyH//Q/VGlQDnslA8EUjLxoRxD68R/T32TxVLXbBcp2gpof7ebpQXB0NQaNwGWDTcmnnB0hLbbkObEjCr6yU4i7Gx8dVOf4SAT9GDMytFn7Vkmgm+iFPmceWXi2Zy+VkJpOR6XRaKT1Iao6/ffZHIIGpiH70e+XU5br8hn8XCQ2QCgAO6bmkTvOm8glHP2Z05ApEQgAAAABJRU5ErkJggg==", aW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQkSURBVHgBpVZfaJtVFP/dNE3SmM38gXbgqBErOrfV1j4MQa2CD1OQDmU+iH868c+LaHwQX1aXOhWf1IkyhEILioJdNyr4VtnaFFSoa9wUldUlnbZLS5ekW/P/S67n3Hw3zdYvZWMnnJzvu/ee8zvnd2/ODbCJSCm9pIdIT5LG5LqkzLEQaRA3KuxkBrheGW4EJCyCv0kmTOrl98nZBMYjcUxFE0ivFdWa4DYPOjv86HsoiN7ubdo1TToohPi0IQDTYQZXgT/6Kor5ixm0Blrg2+KEx9WsPNZyJWSyJcQuXmEfHP/wMXTe5ddhwgQyuAHAzFyhHx6exefH/sSena2w221qGTnRmqqDpI92zuZLOPtPEq/tuxsDB7p1uLd0JUJzTmaWaeHgR0/8TRQEaFZAxWK7gU0Jhaikgl//WsEb+3doEKarm0DiGmCYTP+ZuaTseel7sfvOADxupsNWK1RlL4SuFkLUSlcVXVkr4I9YEhNH9up9OUXrHxVm9jEe6XjmGOaXsir7KiVCZc8fXUAtachrKpE4c+4SertaMfHZXr3IZ6evfWpT6ZTMJzIq6+RqCS6XXWXebK+gZDTVAlaB5TpToopaKBrKdzK6rA6IWUWIOejjp/HIv1VKSFcuF5DJl+FvuYT+PRFkCwbsyJAt0wkylM3SPNtMrqzWrlBSijfS8ekLGr6XAbr4ifg3Twsw9Nw38DkXydHATCyg7P77f8a9bXHkCIzf17VEwYvIFctmOQJTs0saIMh7IKv8Hyf+c6oCvyePyzkXjIoNTTYBG2m7P4XVXAupq7YX7FrhTZZ1eyEruL2tBXPfPVVlUAMkk0k4CtOwVxZg3Pp87cTUizAW4UgfQdF/ENK25ao5qYAkyuWysj6fT43zTsa5FPvYKHD+J8qjhCbHIhpKdgbC/cXGHmOCUEkQwSDw8is8lK4BOJaWYIxFIG6hbcn8YhmApeIiyvLfWs6pXwRhNL3woh6KMkVhejhkGAZyy6NorszD8L5uTZEswLHyNoqBDzalyOPxUIvh3KllcM+nhxS/ffz1JKLnDdpnJ65tDW5nkY4ljZaXIZu2W+dPAO1tbrz/ao8evMNOmaZp4hS9PNKz6x68M/QjBp+cwNHIA0isboXXnUc668LAExP44dwOnL5wGy39zyI+n5UKZoYe1yMj3It0szlAmu7tasNA/26ciO5EvtiM7vYFfPnsGDzOAkZPd2IhvRXWUm0V7Htfhzo96m5QtNZxGCLzCT+/N3IWh0d+p+wLRE0Jiw0Dm8ElB9+FdwnAlKvbdR1ImAxfOvhtLo2nD06p5rdZbG5uHJytKXyrhfWL1ZUZMkGqVyY1r/HpBWolKcQTa2qN1+PAwxSw78Ht9YEtr0zrxKqX/oi8fjkpb+LfRcgMkKoLGDPHwuYxbyj/AxeXlTDspI8DAAAAAElFTkSuQmCC", sW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANRSURBVHgBrVZNbExRFP7umzfFtGFMS4pW6i9KpCWSRiNBhAgiamPBkNj76cJSUiURsRIby/FTLCTKQiSIn5VYYSGIRUkI0UTbxLzOzJt51zln7n19U23TH19y5t173j3fd+85d+59wATQWifJusiek/XpEQwYXydZE6YKDjIEk0VmPCE1BvkpepwlS3L/5Zuf8B89RNuT69BDQzLGWboUr9s6EN+9F1s31NvQQbJupdTlcQU4HYZciC/efIuvP7I46b7HUfURTqJaQoLsH9yJrcFFr5ljcO/CDrSsSlmasyTSbTvOGDPH+cwbHDzzDHHXRfOy+Zg7rxqucuB4npirFObUJNCysg6rGpPYc/qxxFgBrk2FgMlfSH619xM2rF6AQgnwcgGKOV+IY8PDYg5ZMVdANleCJop1K1K4cvdDVKTL1sSugFOTfPf5N85l3qG+thpevkQWwCsEQsYCiojVcHkVLOoVtIzJ5jWWLKiRWE6tqV9GamCU+rjT398valVVVYjFYqBcisVv34J7p0cKRikXFA8dhn8oLTUIgkCsUChIXCoV1mO+Sz8d3OKXPNilvDOpqJsnfB8q68mWUPzDKn4xHOM4jsQyebFYFC6eJKGTBfZbAR7IZmceggRAqSlvOl1+Fn1EYYXY8vm8FdjKAutlyaQcFagAk3lGwObJrxSIivgj75pcUxDJIb+MQpuEa1qdCESEtUlplNxaxN/ERZZe+mk7fuW+QTk0qFIH6d4C0vcrZ9zTEUfPgarIbMoL04HGwlkN6Nn5StxM9YUbNfF5/54b08Si6kbbHAwFWms34X+AJ7l87lrbfcsCL7m1edEuhJnTmDa04TJ4wAJy+rXUttMq2jFT1CcahMvgPp1bapDq/II62y61nkbp+xHaTeVChzWp43lVFjldF0d6dSLs0yZEwH+2xox1XSPuL3a/HCMbVIk2OLUnysfBFNJUHk/HXuoE1KxmdsndwA0RYKXQkToORabttpsEuQgQOccadBvOkfvA3EShiNPQCx1bQvu6Usgujn0B+2e3QS2+MZr88gQzkot8wF62gfdaB/e6dHBgny5tbNUB2/YtZR+9G/Uh0InJwFz61/Tk8VzP4Oui0xAMRAj7jI+vx+REHH8BJuo8hHRw4RAAAAAASUVORK5CYII=", lW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMXSURBVHgBrVZNTxNRFD1vZqgaSKwYBRaQLkyMILHGndG0azYYE3Vn8BfYhYbEaCi6QjfuNG6KiXEruGDJR6RsQXZGIzUuJBFpC0wL7cw8730zr0wJYAVuevLu+5hz7sd0ZoB9TEoZJQwRpghLctvywVqKEMP/Gl8UEDRqmb2ExC7k92lIE6I8d7amUSmPq1F6BXXGMGMwI3FETvTDOpbUl/LmsBDi5Z4CXI6AHDPzy7jSeRfSyRFhG4R5CoZoUec8uUFiNjznO10DNK9+hNnTq2nSJDKsJ8YukeNZZh63H08SYROajnfDamqFZRowDJtQIl/QWgvtXYIVOQf7zi1svhipCXBv9MTSNQ+Tv/rwBZfPn4FpViBEhYT8XHW6Uo8el4twoRvVN6/V2vGHgzwMEecYZZLTGXBpoovfVuXTzGe0n25GacuFSdEyOGpD2CRWUmDfEME6o0RZdXSgSlk4c7MI+pdRJQqiH+DJzUeTAsKgn0ECXkDExIxyyC8Fo63KZpbLlK0FSgaV7VIl+TbnDG6opi4s48eyrWqxWqzC3vRqEQswNmhP+7aCoffKlEWxqBrqZbM6C7YUr/WzN/7pJzh6xu9ihQRcRQKpUdrh+3MWFlQi8WeFBIXKwp2Y0AIJbnKcPaq/30nCluNhhUSgojZCrd3ZZt8XK5StU/UzYMxl9WbMChqC3C+7JsBWJRHINfLMkAjqiH3QOceqXUkdhEvlCgv4pk6I0ESbG+DfJhAO0TcOLcfOyZYIjsJUFl1delqoCSTi7TgqEz0XtbvAAjPs9V/vRH3zDmbMYPX16ek4C6inXyLeprB97GDk6OqEuHpNL43RrSv4MTvNsycDvTgMuYr+7Tu9NBp+Ft0jFDgDJSL18cbJ2YwHg7r+6t1Qf8h//SkbzixKK/FeekUo0N9hT/C+e7ZVus9Hwm+41O6RSJnWJxa+5qW7FpNuAXVC2lfEtOeuJ6WXnQ2Tp7Fvun4meX3aq05Jr5SS3kZSCXqM9bi/Rns7PgRSaKim/kt/VDZuU/IQXxepgCAfIlwK1rik0f04/gLuaW/S1gRDqwAAAABJRU5ErkJggg==", cW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM2SURBVHgBrVZLSFRRGP7uvfO6Gc4widRC0SJIMhKEIA2sZUJluGlZu3bNwrCdI22yBwVBUUEq2S4IN1lu1MgWmaCmEUXqWEiEOjOOozPN3Hs6/5l7xjs5ipo/fHMe95zv+x/3njPABsYY83G0cPRxTLFVC1tzAY4ybNVok0WwWWtfT0jJQ36FN0EOH40HhmfR3T+Jt7yNxP6g934dCnQXXC4XdF2Hx+ORWyMcrYqi3LPzOf4hb7HIBfGNp8MI/VpCsX8XSvYVomK/EwW7dGgqkE6nsbCwIPYVFRWRIDl0l3N4uUir5FTzeI7rj4dw4VovvLvdOFTuh9+rQ1VVxBMGbzVomgaHwyG8p0jm5uYQjUYlVZBqkyNg5S9D/mQID198xuXGChw56MdywsRy0uDk1JpQFUUIkKCE2+1GPB63i7TImsgUUWp8o1/ncefZKB40H8exymLwUFF5wIdHL78jtpLmBeMlUxUxLwqoZPqmacLpdCIWi4mouCClq53jlGopXaQNjU1vhKedPSHs3aMLdL0O4Xc4iRWKgKco+3ZY5BIUFWFxcVEuOUmvOUXQIItKBaWsadzL28+/wO3SBOI2YjCsMbtIKpVCMpkUaeMWIIFz1OseCEG8tXzhh4l5jE/GxCbGxFSGmLcmW1VgLFdN1iSRSEiBOhKoot7Yt3lkaq4iGk/zgjLoHl5Mzsqyrit5ie2RkABFYVkZCYgPanp2KeezS6VNpJZMkS5VVXK8zidgr4fteZnCrFGyugrqzx/QLD8VbM2YBYP/GCUl8AyPiHnKybToFXqxU6aWlspuJCug1dZip0w5XCm7IyQwIFTr67FT5ljl6qYaUJHDNEqfPwvl/aDI23ZqYBJ4/p0fR+R0OT9aFDpm+2mkXW3OFottQ4Dg6OySUx2ce1qeppc4IkpNLVRLZKvkZGpTs8y/uBtyF2WuP2HGrTZmFPuZaYFtAHpOa42bbfYbLpDfE8aC2SXjY8yoPrpGyLRBEDecYebgOzt50M6Z78okdXF8izEvOnpeAROfwGZmMhu8/JupOQGcrgel1bK8V+Z6kdCl38E2b33sP/5dBCyCsI1wypoLWq/5uvYXaLQ0v3DpqyYAAAAASUVORK5CYII=", pW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANcSURBVHgBrVZdSFRBFP7OvXfNfkgN7K0oKCgs+rGH0CB6TOgPei9forc2MKSHaIVeTAgfeynt572ysqBAA1cIQs0/pBdtfVZXTdd2773TOXNn1g1XUfQs587cuTPfN+ebMzMLrGFKqXL2h+xd7ONq2WZMW5z9ADZqMsgArNfaViOiIuB3uEiwl8u7n+xB9lOnLtXsrO7j7N8P99hxlNTVwas5Z4em2ZuIqHVVApHDgGvApdYnUJOTcCorQRXlcKpKgSwh/JWBWlhAmPrNY4CdL1/BrTpuYRJM0rSCwMxcsy+1NCP74Sm802fgTG8DMQoPAo7mgBiXP10oGcMeLmbgj42i5EY9Su81Wri7NhKymnPRL7IIeO75M3gNh+H4BOdLCYgKZ0NQp5lomstxIVIIuUNuoB+xW7ctich1ikkmLEEbFzeD4SEsPKqBFz8Et2InHP5Ks0zSwdL0ucgznc1qqVRfLIqCIwzm5ziSMWx/22HXpZsJLpCZ/bi0/Kk+CWcyBe/6ETj3FzUBHuwCpdx8BKK5EZV/ZGpAwB/8kWGgthY73ry3nSo8flyVWtDbAzC4I1lSNgXnYwzIEahqDjS2LUKRiORxiiNg+WjQgzJBOX+zeqyfTMJnLBNFXAiu6Kzp7ITM02UZ6PsMqLNS1AYOBsBiiDyDlC6vQcj1jMcJYIjTaY6Y4IpcjGUIzgvBSR0m6+8YCBoJQLEpoJS1H+VWlY2Aq31gnnt8do0CWa0ZZZZAfk6Pl6mEvUkr0QEh0BsKnO8UCRApm8tF7i4vruKZUxlXMiXRYoiHYURixjn8DMyGtAT5BSQqsrWDIF+lr/ZrDsWMCtyaRDWha7vLsFUmR4mxdJ7A5fTaKqOqY7Y6IATfNCsfXJs1u0W8Zax3stFkkWfkzb92GcQZYLNpo+A6g/btQ+zHgG0+yKlLcm50y5vL54g9xNQGwa17L17b5nY5ixzzUs+epppaOIZko6b3W0Oj1V/fDf93iK4/bUFLswr27lGhcbWGy3fpGzxuLrzh4sVnoVQi32V4UAXVJ1YQhQWuga9eUmGypxA8UYhZ7MoUdrnZ9A5Xsu35ysTIEFQqFQ0o4z0jZ83FOoisxopematFIpd+u1q/dalN/LuIG4CZAsBx05Ywab6q/QO0TEDap97pzgAAAABJRU5ErkJggg==", dW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgBrVZNSFRRFP7ufW+mcZxwjExciEKuUspqU1bYKigIXbVqE7QMGiFx6bi0oIJoF2mroFVtCmxhQma7fhWCQBOhpNAZcn6amfdu59x337wZHMW/A2fuzzv3+87fe3eATUQpFScdJp0knVeBrJq9BGk7tit8yABsVcY2IhI1wG/SkCSN87r0dwaF1ARKazNQTlrbyHArrLpOhOMXYO8/7R9NkY4IIe5vSMDpMOAaOP/rAVRhCTLUBGHHIa2otnOdDJSbgZtfpDNA/eFHsKKdPkySSEbWERjPNXv+5z38+/0YodgJSBnSRqLaFbIX9MtkWZSy3xA+eBWRlgHfYMCPRPg5p+EDp4XBi3+eIFR/hEAFqYI06D6J8g5p71ld0uLaJ4SarvsknK7jdH5BGkZOTdzJzaKwfBf2vmZI5GGJHCwaeS5FlrzJEUmO1lmzx8rrHOxIC4p0llNr6jemnTLez/Niba4HorSkvZdELQWHKLw4zaC0/6IcgQkGjkt1y8wB0VOIdjzzU9Vo008/zxzqEhSXYFkErFbJq4jB9cC8vAhTNFUuoDLPpVvQTpUy73XH2THdXQkm6NNdk56ARQas0l2BkI3re9hABiOnwH+S1gQWR0NYhqCXCbq1T/lZbSA4LyhAOCvEFEHQaAo1XhsvBkW1USV9ngvuUhRG2m1TEJ0eEaSbN8iSlMoc9KioAvaK4PqJ0gmUFJLjpqsItHQND+LHcs4DERLbF0OoXLQ1R/Hd1JmRFnjSEAvX8HInItDeEvMXqTJBb3dz4Mku5WhHoz/9yARTPOs717on4IzhYWl5wQT6m8ER7EUUbZSeAAfPbfpepOhtfkOL86+v1MF5ekMXJuimrYlr1Ho45W+NV36LrpGmRM8ZyMGhbfvv28tbQxCdXTzVd0O1kXf9aXHujCrn0AHlGlWbKD9nW+f2aOUNl6jtiVLJssnXz8o5eWwdkVuhGrj/snKn31aCJysxa12ZzK4/33r9bhp49RKY/QK1uOgdaGgAes4CFy+B02qk5pW5USR86Y+rrcuk2sW/i4QBWK0AnDd7nNL4Zhj/AZRiJNhy+uaPAAAAAElFTkSuQmCC", AW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPYSURBVHgBpVZNbFRVFP7umzd/nVYHy1DLT9rGsBEFSkgjIRE2/sRE0IUxGhZoXWmQkrhwYeLUvT8JUTetQOLKjRITCWJsSDCTFJNSok0NavltaZnSDu1M37w3717OufNuO51OyxBO5sz9mXO/79xz7j13gDVEKZUk/ZR0gHRMLclMMNdD2o6HFV4UANQrJ1YjEjXAj1KTJk3yuDSXgTv7K0rzGSg/p22syBaE4tsQSb4Iu2mPWTpL2iuE+GpVAg5HAK6BndvHodybsMIpCDsJK9Sg7aSfh5J5SOc6rQEST/Uh1LDNwKSJpHcFQeC5ZncmvoR75zvYjbtgWWFtJJa7QvaCvpmsgFLhH0TWH0Ks9ZgxOGZ2IkzMqRnisDC4lz2FcOJpWIQqhCItoxsSVV6kvWeVpN78MMKp9wwJh6uT1l21AkYOTfK/3N/4fvRzZUdbYMEhgoVyq/sF8maBSHiuEMwZmwXYsVZ4k1/o0Ab5O6GdCrwf48GRgQMYzQ1hd8vzeOHJN9Xu5v1CVMSG+0opVOUNUkqtxWIRtm0jlUqZn9eF0un0Yeq8PJzNwPcUxp3/MS9nMTJ3UUy5N9WW+FbRYDeiHmGyUqmESCSiiUiKHKKD3Ptj4iwG7/4GDy5y3l04lLxM9qz4bKRbnR7vV8bzyh1U78ayLK2O45ipfUywk3vj+Wt4Zl0X4nYCJeXiXkCSc6fFjzf6xEfDr+PCnTPKAFeDmxAyged5ZqpdGNcOnduDzYkOjM4NwaEzbg6wJUKURJMHgb2pV/DG5veRim5ErVz4vq/HJg/2Ej3gK5+895ZdP0lzsgJo9twPKvpNH+JTftXNKCvDy7Y2YPTKIsFV3kpj+HE8Fn4CnnQhrBW7x4YpHx98m0PnJVfgARJqa1/0Z5FgR/NzGJn+EzEqB0VVWDRO5CUO/lxQr/2UR6yoHgjOBtb27WZ4iQnOk+7f2/oSGlUzpicnUfQK2vLZv1x19HhObKgKx1rCYQq/esAMT3OS+dbN8OiTwcO4mP0dLVkfR77OYcdlt17ccl3iluLfEMSfpMPUogHexeXpDD48c0GV5t+matkkalTzNRgkfSROvdWErev12TlJx/adFcWuf3AB/YNFOtNWdQldA5zvhUR3V5Q0zjPLix13qNE1nA26u2J6gS6VUHWCxww4S2+AueLBSaNcWXGF8vDxLwXcnpNLZryjZTdYoXNjCO8S+K5NdiV42gxqPZk9AYl+ModulXB+zMO/WYmJe+Ur1xQV2LkphH0dYXQuAdd8MlfZtX70T6r6ZUA9wr+LngBgpgJwLJhLB8d8VbkPjAFhTAQlg1EAAAAASUVORK5CYII=", uW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOOSURBVHgBpVZLb1NHFP7m3hiSuAVHbooDDXFFN7QS0K5KkQJUbUOrNq1aqSBgwQ52mD0oBrEDBcQfCLBhCYQNLFBCELBBIkG8JBQSAeINfsRv37nDOXPvONfERgGO9d1z5/V9M2fO3DHwHlNKRQgDhBHClJq1lF+XIMTxocaDfIL52lAzIdGAfDe5JCHC5fGX13D1yQXtc5WM7hMLd+ObyHf4aWkf1nSuNUPThP1CiKNNBTgcPrkmPHXvGJ4VHqOjtROfL4igraVd9ys6BZScPFaH76K/awbhL07DDq0xNEkS2T9HwJ+5Vj9xZxBnJoewMvoDQlaL1+udtfZGC1gXLcKVeTjVW1jQvgutiwZM8x6zEmFiTu4Gh+Xk3UEMPziBFRQCQa1KKPKibjo/d+YJBSiXxwIu+Wr5OkLhhBHhcH1P46aNwBC5HZOZ29h5cRNWdKxEWyisBbzZ80Np8r4lefz2ZU43MLknoCBlFk75NtqiI2hZuIG7jpLARuHPfoprtp1fixelxyTwrU8utIBZwJ+xHH6P5QJ75ntagSQ45QmgZQPaScS3Dose//DbxKtrmlxQzYyTQlmVUHaLqBDYb1ryHH/EXpBegZDXsETBK5O3xBtYNoXq8BiqY5eMQIJ2EH/z25WnF7zZkkCm+gaLREdt5v8tm0F/bMZEqc6ErhT0S0EdocFHbVSdYYR613PzehbQ+TWZuaPJmdVRFWRJZKHdis1f5fDv0qy/ByaVgkqUBKBsOiyhBm0whbw8ZhrjLKAP1PPio7p0dFQVW7pe4/9lFHNlzZ26FmG4kIcECdi14W46XSdg1hpcN7Z3Z7F9ecavkGhm8pBFsGsU7x4Znto0v3wWWlxrqCfHvMiDZvfEzWu6JrA6+qNHvjyLbd0fT86TtFatMsVxFtA5ta6rD1u7P42cjXcl9Fe/KZ7lg8abnOKSk90I4Y7CsmYP13zJve0m39OD9nv3TfXXXqP/7XcrI4qyU8k0Hc4MVWfr4eyzVLk11BBFQp4gJ8Zrd8SsunfB8C2lZGFA0UGeI/A+8pIvUDl4IHjjxeuX6F1/2mRxQElfhPGB5GyJhvGlhmSti3NDyWxcVfdamqQUICwFiMu//qLkpdEgeTLI2ejKZHX+qOsT7tKHS54bhpq4CfVw2uu0OAKrtxc2ZYvlfXPYGl6ZzVbCe3Jczd9G1Cf8u0j4BKkA4ZRfl/TTvKm9BdTMv9u9qFBsAAAAAElFTkSuQmCC", bW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQrSURBVHgBpVZ9bFNVFP+9127duk66MJZtxrUShwaFuC11QaMdzH/4hxKDKCgJomhCBGaEPxYdbgJigkb8XsKSLfCHED/CEmLi5z4SN9SNfeo26Vgtkc61rN36sdH29Xnu23uvT+hGCSc5veeed+/5nXvOuecWWIJEUTQTv0XcRjwhJskv62qIrbhdYptkA+lS82JAXArj+2moJzazed/oFAqW6ZB9ugli1y9Yz29FwYpcrF21HI6qlbBXFCtbA8QNHMedWBSAhUM2jo7eqzjfPo7tNhNWfvcleIsFbaUb8NVPbgQjMYTnopj4ZxYirf3mvY0SoEz1BNJwE4DsuYT+W89ltA1MYY/JBW5sDNNPbkLzUBwDl/zgOLZW2SwiMh/HkNOHV55ajbqXbYq515STcErMWTRYWMJHDiNaUoKMRyrBj42Ce/Qx/O4MkiFB2vnxucsQEmISRTqDiN4/p7Bv20Oo221TwlVGIC4FoJmGncLgAAKVNmSsWQN9jklCV5kZJPcdqw4ilOA0sRXZfgRD8/hj/Bp+bNyk5KWdANbrZe93Ms3s1i3Q0ain7XwkTEYlm2ok2W+YQhJJ8NAkTgLR6fS0gMfhk70KQBUrc9JiM5vFYzFwR98F//w28AcOgi8uBuf14vq6xzEyMQPPtXkJzH/KiXhC0IQHyMvNxPVoHG++WIbWdpdUIDJIDXPFwaQz34+j2x2TTjDsCuJztxmcxwPD9i0o4ObwRbcPrzaOYCYckxK7wALyzVk4e6wKWQY97rfmwZidAaNBPaGdSQ8zqeW8k8ovLoUhEIyh9rN+bOi7F1eOfoqiN/bhVG4X6nc9iGhMoBKNk8cC3t9vQ+k9d2Hz6z/jL/csdhzqxK/DPjScvKgAWBmAdKFcV0MUAk5NaiyeQPeQF+W1A/jkhY8AQcBz7+yAEF04QWYGjwvDXnT2/YtBp5+cii7sJBujrhkVgGP3nEn3Oc7g78mIvEiTxBS0Ii8LjbXrcKx5CD0jvmQ+5IRbCo1wtj4raZklFxOWmQwL6zgOtyKvfx5nf3BhcjqS8ru1OFcRAyqAvaJIdeRWZKaqebraghDlLBWtLVXbRj8D6GCSw25BugjZBh21hwCMWfqU35O20MoATignsJcXpgXi8c3h264r2PvM6pu+WYpMyWgA53iqHNY32tmsbncZ0ooR0d35OQiGoyhcnq3Rivj6eLUyadH2IivkZvd2Ux9d93452Usn3EiXq7NpI/YevwC3J4RdjlIceok5eUOzk0FqaPiAybcDUm0rlC7ehwcqUf5AvqJW27Va8LJCeiiYFz2nHVTPOVDa8WIcF0Qc2VOhNf6/Vy3Vk8lOwl426YZ3XJxEa4cbg5em4aIwMDKbMvEEFYTDXqIpjNRPZkqSH/0WMX1qE+/g30WNbMCvMTgh6+pZz1/Kxn/WYlT5yKjeUAAAAABJRU5ErkJggg==", hW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANMSURBVHgBrVbNT1NBEJ9979mWCgUqVSQBCwc1JhLQGA8mFC8aTQxG/wEPfsSosV68EUu4mPhFIidNhKsXDfGkifLh0aCgnvxqQaE0qVCgfLV97zmzb7d92IIlMmSY3bezv9/uzOxuAdYR0zQrUG+h9qOGzZzMiG9BVD9sVGiSAChWetYiYgXAr6MJoVZQf3B4EvoGfsAQ2sR8ivv4a8qgcfc2aGttgMDBGjk1gdrBGOtak4DCIcA58O0nwzA2lYTtXjdUepxQWrKF+yUX07CwlILwxByY2H929wQnFBJCko48ArFyzt756B10P/0Mh/fvAE1TuRtj5ANZa002YXE5A5++xeHSmX3QfvGQhLshd8JkzNF8oLD8iv6G52++Q+1OD4IpqIyr5ZzbsEl/Zk4nY3NwKlAPtTVVMlzNOC8iCXrQnEun02YsFmMulwtUVeXAiqJY4Iz9nausNQwDMpkMrKysgM/nA6fTSUMDOOcoE6sP05doNMonkQMBk9qBqS2B7UREQEoEmqZxEiGVGv47Ta3UxIShvHppaKoCqnsrUx1beEjyyswOLqxCJLpumsl50HUDUoFWzdHQQENBImijVqbrvuLqfqhQSjXagddrrZ6vmFlwqzJtCxV29UQClKUl0Anr6jVw3LlHwwEiaKKWPjoKFG0ecdwqxONglpTgByVXNlagbGsHawyBWTrN59KI/nZIjvqJgB8oc3yMOzChgBO4YrKzJPZEU58UY0+W2eYaicQqguy6suB20XVLi5BCGLToCG+Ul8NmCIGru/yym8gSqC0B2CxRGhtlc4RCNIjaql2+Ast79mYMUftsg6CUXKooHXNSeuy4rJc+OmiU5Blymp2dxXDreQesKAJx4Ei8WOJC6hUEopQPUM/tdq+6XzYCLv09Ho/83Gu/i/wgLrv49Dy8GIqIHRS7C1w9Epw8UgfVPl4s2cuOlyk1kITu8AdV3jL4Gc9A5+MRUff/IrHOQ/uFZglOQg9PBCD/wQmhoUcHRr9Mw9mbr/HBWVgXPnCgGtrPN3FrAw/JTqEnMyhIrCfz/RT0DY7Dx6/TEIkmuU9FqQNaELAtUGcHLvhkFt609ej3msVLv/kfvy6CAmDGBhgW30KizNeUP+4gCo41ct5HAAAAAElFTkSuQmCC", MW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARdSURBVHgBpVZdbFRFFP7m3rvbrbt0W9puoWj/1PJTW1oCRUmkENQ3fowG4xshxcQEQvsgRLGyWEgUjfqi0EgC8UGbmBoLSkKwwhIfqqblp5bY0pR1oWm3UNiu+9Pu3r3DzPROu9tuCYSTPZlzZ85835kzZ2YWeIhQSrOZHmR6gelNOiP3zb4GpiV4XOGTTIBHlZPzEZE04HtZ42aazb9jlzyYPH0acdbS8XHhoxYXQ61aCduWLbCsr5NTA0wPEUK+mpeAp8MEF4DhTz+B4fNBdblAcnKg2O1sBoERCoEyTXi9fA6cP7ZBq6qSMG5GcmgOgRm5YA8fbsbEsa9hWVMLxWIRTrOXSk01IhHovf8go/4d2D9sksONciVE5pw1l3laOPhky3FYWESKcKBMiXA0nrJD0VQgGDQJqNkSTHZ3wbZ7D+wHmmS6ahiJVxKcZM2OxLWrCKxdA0tlJTS7A/6sfFx/egW0gIGFLgd+XbIQmmsxApcm8ILuw9IlYZQN9sMx4kMi+D/i13uRde683JeLjGCjYka/g/cEt78JFh80FpESCaOt4jW01K7F3xkF6Po3jFt2G/4a9iPD2YFfFpSidXU1fnrxdajhCFS2Mj43eqRZpmkDL3ONGdtEtfT1GcbSZYa6bDmMggICixW1+Rr5zfa8MpAbReYES1b+apS6IrgzmodsSwwb/+jCS4tyEwYLguo6RWEhYgZFbHBQs5aVcdgGwuuds42zEoxGo9A0DaqqCuVyxtOHdRWFyHc5gaEhwOEAnE4M9fkwoNjx8rM5opIMw0AikYCu68jMzGQuzqk08VPJN3dsbEw4cAJFUVg1EqHWbZtBspxIfN8K9e23RJlKm47dRezsuWkCScLn5+XlcQKvJg8UH+QDs84FjE2vQhkZBjl+DLS6GmCBSJuGw8JHlKMZEFfZx6REmz4QhKS0UoydO4GeHmhbN0NvPyP6pE3Ly1N80xCAE3g5E48+eUCKeuADcRY4oNr6g6h8aRuTE8A3LXPm8DSbElBMAlitVqQVtvnEdwsoKhIBzLHTSBLBFW55mG4YDSSw52inTgjjJDN7cfS9w0pJ8Lai1aycSZFpewuew76DnfqUJ+Wbxn4GPm9cpyxfIC6Cdl5FfJN5JeGVd8/C0+0XlSJvn/oKii9WhUBu9APsdFN24ZFRP2hpGXbfrcR3528jmaB4sR0DP2+X8ZUqbFP4vXGRfzXtqplyTJITvQRHemyI720E+bMTyu8d0Pe/j/13ypPAMU3S9tkm+XEq+S4qgXnZfXziMpq/vZKyCi7P2OJYkUtgD/jRQUowHoqnAPPom3ZV46N6HuSsy84kaWDNl9yejyS9SPAaBl4tO1Ov6yQSN2v4o4Or/ffwxr4O/DcSfih83apFaGLAvDWFv2pu+ZHuyWwwScQJ93SPoN3jw7Ub9+AdDgmfbIcV6xng1rqiZOC0T2b6RU89+qfoo8sF+gT/LhpMgPtJgDfNPrdZ5vPKA/rHg04JAdkHAAAAAElFTkSuQmCC", fW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPkSURBVHgBpVZdbFRFFP7m7t1dami5bW1LiDXVxGKMP6wEf4i6mBgVo5aAEHzSJgXetEbaoEl1a1+KwYimxkQg5cFoTCOk/iTGBPvjg4m1IqiE8NeWstCUhjbQbne7997hnNm5l+12W0r4ktMzd3bO982cOTNTYAFIKS2yD8m6yAbkDYzrvnqyKtwqOEgTLBbt8wmJPORvk4uRWfzd038Rnd3n0Et+4tqMGlO1ohAPV5eiZt29iK5e4YVOkDULIfbOK8Dp0OSKuLW9H0OXJlFecgeKi8JYWhBU4yYTaUxNz2AgfhWSvg/tWa8ENWIk0jxHQM9cqbd81Ye27/7D4w9VwDQDapgQPAa+zwRLJJI2/j0zhh0bH0DT9jUe3TveSoSXc3JHOS0t+/rwZccJmtGdmk3oUSI3l15DWf+JUbz1+oNo2rbGS1eERAY9gXZybzrHj2FsdyvMXe/BuKsShmGQRobY8zkpVea6LmzbRiqVQllZGcLhMP/cTTHPCj37Ae4Zv/8+iKEhBCMR4I1a6by2GSIU8plZRPozvyHCAmwsYJqmEtEoNujPBm6le3sAIucOY3QUZtvnIrx1iwj8/NMssnxgYbZAIIB0Oq2ENOqZr0YJ/PiDIuctdZ96GmJqCsa5swi+vwuhulop4vE5IrmCnFK2ZDLpdUU5RePUsCaffw7y916IJ56E29CIJVu3AAUFHOVvaIf1GPaUr8dwqHSWyHTKQdp26MNV9kh1Mf76ehP/PGhCHygnkYD9y68wqldCEHHy/5Mwv2jjVPkimxPdeGnkD/lJ+YvYW/aCsKnCXLXRfrJU5XkHklBl+Msbu4wlGzdAUA7V97ffwPzsU1KmmXEfVQl723ZFYCYlzHRKOm42eZZIVknzCgaV0rJlkFReRt+fMH87AjeyOjcSB0qjcnfFy4gHrdksOeCrRGOC96CLGuuSDe/CPnwYZvxCJrKyEmJ4WI1y165FuvVj161eacxH6p0Jh1bM56CwUIl0c0APt4KvvApB5P5CiVxWLJczHd+7qUOdWIg8F/qgMTp5BbzJXEmYpkoCV1JREZztO2DvbNC3z83hHThGSUmJ132Pd1WoNDl02BIH9rvOzkZDpWhx3LOuDMuyJB04DjxI8bVzLruP9h9Fy75/9MQXJ6AuPBJo2rYKH9RFuMO/7FReuUFO3eE8gAdm6k/eAnnEI2c0a845D06MHD86OHbqCjY1HsHQyNSC9NFHl6OpbpXyWeQx7yPfk1mvRTJP5t8j6Ow5j+Onr2CQXjeGtTSEZ4iwJnp3NnHeJzP/ojOP/kG5eHTJ2/jvol4TjGcRDui+mC7zeXEdkIVY4Ft8g88AAAAASUVORK5CYII=", gW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN3SURBVHgBpVZLT1NREP7ubaEthUKRkoBAwGBifGJCoiYm4NaYyNrEhYm4tS5cW/6Ace0GfoJuXKnVhYliDBiNIUTCI4ESgba0pZS29DgznFNvW8AaJ5me9/fNmZk7p8AxopRqI31CGiVdVH8koefCpP34V+FDGqBemTyKyDoE/CE1EdI2HudyOezu7kpbKpVkj9vtRmNjI3w+H7xerzmaJJ2wLOvZkQTsDg2Ovb09bG9vo1gsCqBt26IsTER7USgUZNzR0SGEWiJEMlFDoC0XdgZOp9NiHYPSAdEqY0SZLJ/Pw+/3o7W11Sw/MjexjM+pmWG3MPjOzg48Ho+A1kPALd/YQcLuukxnlmy9n13Txpaw5XxdBna5XBUETjUukz3E3bg5i8z6TyHS8ZuUG2jrF3kQi8WEja03AE7Luc/WVshyFGp1Gvvn7iLnCki8QqGQWQ266WfMBJUP8wYDVgZe/QgUdwFvGyyb1rO/YMW+ADvrUCevoXT1MUceLgo6B56x2EiSMKPd5h6nodNqUQKA7wSw9BrW2idUixp6gNLgLQ6IjM15xtIEI0wwxD1OxzJBfB7Y/AZ79jk5twUoZATDqv5qFl4BfaNAg798az5v0pek360DItlg8txKzMOefgqxq5CliYN5JUlHs81dKA2NA3ki3ksJgTMBHHHqdzsDWA5kz3U61HQArkoHatzSeRHq0jhU13C1xw4jkCziDOqPx+OyUI4B+d9efkMB3YC1PkMW3xfLVfA0DhPzXezv70vqBoNBnk7yDZaYgHNf57DIu/RnnD01ik5fD5BaAQJ9NaCx7DJmtj7gZu+dinmTiSSz7Nz33GMC59UGA+exkP6BueRXqEBvBUC2mMZieg7TG1EMd4zUEOsMYnnJLuIgJ3jEZYKvaNz0PTFNBDNobmiFx/biRvcY3q69QCq/RV+vGxfar2Cg5UzZRabatre3G4IBU4ui1IxyeqVSqZr6s5lbx0pmHvH8Bvr8gwh5uxH0hGr8zxoIBIyLpuj8vZpil81myx+dVZP4h4sBZ9c0NTXxVGWx4w41UsN5A5dpp1V/A2blMxqcZUJj1jw4ERxUVolFJpMRvx51E1O7+GVzZA6DR3CMVWH9qItQXBS9D4pio5LJpCglg8zxWtUfgTDqEf3oT6n6Jar+499FWAMkHICLei6i0/xI+Q2T7YF5SS02TwAAAABJRU5ErkJggg==", zW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMpSURBVHgBpVZLaBNBGP53kzSJLSRCKijSRCj0VnzcPDSXiiDY1oMgnrwqgulRPJi2Fi8ivfXgob34AL20gjep0VMLpmnVViw1qX0oaTUJaZLdJLvj/LMzySbZSIIffMxMdub7/sd2pwD/ACHES3mfcoEyTqpI8d9ClAFoF3iIC7SKmWZGkoX4HTqEKb24VhQFCoUCG3VdZ3vsdjt0dHSA2+0Gl8sljqYpxyRJmmpqgOXg4qCqKmQyGSiXy0xQlmVGBBrRvVAqldja5/MxQ44wNRlrMOCRM3cUzmazLDoUpQcY64JhRLNisQidnZ3g8XjE41GRiSRqTodlLAuK53I5cDqdTLQVAxwxY5MJlusMPZOQ+X4sjTe+m4H1zSRLF4VtNluNgZmiZGKPw+FgWaMR798My4BHH8dF79Az0GhEk7fOwqXzJyrilXrSOUZbnwlmgURx7Fd3d7d4fBQzGMFZ5OMebP06hJ2kAvemP8HEzBr8PFAaxKwgssJssPE8C0QIDYZxNhfZMlpCN+6nVXj5dgduTCzC/IddYhY3m9QbirLhK80RRIPTOFvd+I1bGNWSDgfU5Nt2FkKPl6XRqShsJ/M1JlbZiN6I15cigD1gO3uHX9AS5QwTVnej9jYZD0lw8pgbRq/1wfWLPWAF0QtN09ha9MFeF0PdCLTphPHP9j703J4Ed/aLtQEnyut+P8DXjYpBAlPxdDnpkOfR1+Jqeok82n0u+cqH0Aps/oCYpmVuAMFzx6uhcHi1PHmamCazW09aFsfw5P5+sYyhQQRnw0E/mB1G0lH98/pdaSQTlaAN4GnH5SGxnMMm419dCleDN9/A98U1eLj3Sr+SicrtCuO3ltD6H+H1pzhlPOTf/uWlTbLZ5dMLLgdRKNU2iGdylNpKrHJHVN2NCwZvKVKcGCf5Ng0UblB8MG6+8QK1KRrXHxEmIgulfXFEyLqOhITFDi0WI4W+3gYjxUR8pl4YJFrknVk8bNa0ujLRnX2+ca2/j4D2eh7IyiqQHwljk8cL8sAA2OjbIg8ExVHLK7NZJtiTWdI6Fsh//HcR4gIpk2Cc/xbmr3lT/AX3lMcAQuXZ2AAAAABJRU5ErkJggg==", CW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARsSURBVHgBpVZtTJtVFH7ubaF00K64MUdAAXW6kZCJojMRITPMXxrnR6IjYeOHXwzZ8J8/VIp/TBwshgUZUTPEzxgX52ZmZsgGxRhWzERmxuZM+Nzm0I1CC22h7z3e+/Z9S7F0Ynaa2/vRe57nnHPPPbfADYSIXLI1yHZKtmFalCljrV62fPxfUUoGwErlUDIitgz4Xtm5ZXOped9ICF0XgnrvDwl9T47LisL1qai4x46H8tNMVZ9sjYyx95ISqHAY4BIwjLbeaUxMR7A2wwqXncOeynWF2XmBuTBh3LcglYCDz63FJkloiFuSNCYQGJbr7C3d0/i43497c9OQYuFyF1tiC8kPiyphTpL9fnUeO0rSsbd8tbnlNdMTZsZcdr+osLT/+Cc+PC2kRTaJq36OI2BL3I1SkcAqyywKbe30YlEKs9/ZYIarWOqPmASHZFethQYQ+KMY3H4fvhqtww8T20GM6/hELMpjYDNGer81+zieXvcZpZ8YRXjfEJxfd7GUsnK1rVsSbGWG9cNqxX+hAIHQdbjPeXA5mCdRVMxZXDBZNDwSuHiNFy8XNlPWySvQjliYdg1YGBwELyuD80SX6WemVX5tVyNtthsDk1koWTciTbyOYCQ/FhWKHRhh85p+VN3VjqKxAYg6TmKCcT2QobAKJjSPBwueHhhe1CuCJ9Wo1VuAlp+O4vkNnci2ncVvU/dHQ6MfKEOh61dRU9jEN4/9DOG2QBvQXeIqTnrofD5YHAReKaBlH0EKdIJyFaIpdbiVn1yDd1yTKlY4UgMI02qkWRnyHMMkgVExdQzaASvoDGeLPhkHIuaI7Qwz/zMO6ph8ifVPv0Jf7LpD0Y4oD/QLdXlGGDEHAgtOOG0+1Gxspp3sA2LvgEVOSjvZwr+ziPgTEczWZ7BP/6rFR3272UwoAznOWL7lWxc1omuOlBlUb2zHrvVtSG8LQBzmjEKJN549IsjyqqBvnDuoqc/N/w5lMQiVXhriPVQEI4opKz1Ej+e04oXcNpbxZQDUKff7eSLwAwKWPYJ6cx8VTYNufv58ETdciu3JdcXs9sUIPi9rZtr7LcQ6OTQ/TzBZB64V8BY8jAPnXmdeT6kFSWTTrTGCAcXeo0ZcXiqt1cLIvxSaZRNZ9mticH8JqoLHUNX9HbyTpYmocee+7W6bOfxWZZE6ZJVJCD5WAfR69HxmmRK4WuBKZS7bd7ZROz7+VFKLowTRsiEPGD27bzFXC7i8zqpudKtZ6htvglQu12qYO+rAuw++Tdu+P4P/BAfBdOHgs05zsSO+FuXDKHZitBEtg0F0XqyBP+LCikSlrGx1pTbsKV2lVmLFTs8ANZCdXsN5XgN45lvwy7tgVswbWm7sqStNM8GVNBqYCQ+OW3Z6vR2a1FBzOIBL6gIuKXjxnIQtt1kluB1bbrfGg7vNyXJPZr1Bosfn9FgEXRfnMXRVw6VpoWs4bEwHrNiQGg+87JO5vOPRR7+DVi6n6Cb+XdQbAFNxgMPGmttI86TyD5SoeL6vpisJAAAAAElFTkSuQmCC", OW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMaSURBVHgBrVY7bxNBEJ7dO0MkUliWeKQAJXQkkAjRhQgQZQQkDY8GBagQDS7yEA8pToloKHkIEh4/IGnSBoTND4DUSQhVJIId2+ezfb4dZvZuLyfLBIcw0qe7G+9838zs3K0BdjBETBKmCUuEVdy2fOhLE7pht8ZBIUG7Ntu2EC28H2aorVqtYqFQwI2NDczfuIaF0/1YHLmEzqMH6OU+Y1NV6WY+0UQ+TZcM3zdyWSjZdqPe3WOTgZQS9r96AXJlBZRTBnQcUOvfKQbgwLv3YPWdMjQZIcSMeZDxzA159ekTcO6MgaxUZEdHByQSCbAsC2Stzj6whQC7sxMSvX1g9xwH5/pVHWME4pVI0/M4uffmNezvHwBpBZkbWPUaWK4LksBXq+KCDQj7TvSC9/J5XGTa7ImpgFuT9Je/QZ0W2UcOaxKJCqncSEDUaiDciq5C/15lVIOqurrAo9jGlyzzJQmzWiBUusUP7thNsOhq0dZoEuVr4mjDalUQ5BdELiqOvud1uhqqlmPr21Vc4DHn6FF+8ln5x7peJPN5ypCIlAqIqQoNXYEbiFB7pBYLILe2dDtULmeqYEuzb0RPzeJikD235NdmkJ1SGO5RABIAyhxIJACRO5VAcPMnSIplDp+4QjsveH65ZzTroChjM5Im63aMxTmW4fu+9qVSKb6s2eGG6B/j/TaB7VrURkIsrttutfBfrVXVnPIa3/CLtBfyuDFXaAUwHzWPvi31Qyn0CYqABHdh3iuXy2jQuDKs/a2gwljvYArrxBXaElfwSZcyPAz/w7j79jbXAgs80wKDQyAGz0L729qaHI4dJZ4h45qn0RUFuvnIT9bElF5ksFtynf3bD8Y1R9xrZi5vEwpcgQxFdkvOJsenQPSd5FtOWn+ytQArRY7xSRCmEvz7uxBVS+RyYtK4Z0LOpsWImeh8Wv6KlVzWLxaLWCqVNHiKVDgxZmr80cuoctn4yZaBHTMKDvLoyGw0Gui6Lh1gDnr37qI6M4Dq4jlUjx82E7c8Mv8kwof+HLZvS7iHfxfpkCAfI1wNfdzS5E4cvwF9IrMQL9B2HgAAAABJRU5ErkJggg==", mW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPuSURBVHgBpVZLaFxVGP7OnTuP5tEmKUkTrKY26aBWQwMq1i4sughIQV25MBEUXbkwEVy4ysSV4EZw4UZIjIIvisTowoXUKqaCYJqUiJWmaZw000kaksnMdO7cxzme/8w5N1M6U0b84Z/zn3PP+b7/de8Z4C4ihGiTOi71nNQVsSfbem1U6hH8V6FDGqBRmaxHxGqAvymHlNQ2mi/ccDG36qix4HK1p7slgr6OKE71JjDQHTNHd6ROMMY+qEtA6dDgCvDzhQKyxQDt+2y0xhkStqVOOB5HyRPI5H06g3ef6cDRDtvApCTJxB0E2nPFPj2fx8xfJTzYFYNtEaiFGomkQ4psZdvDmWQCI4Ot5uGYiYSZnMthntIyfbGA2cslmYKYxLUqWxgLfSFT4oYEFAGNf98s44UH9kmSFpOuQUlyzbhGqWlzXRdxbxfJg1G4IoIyt5S61WNQZQvzjKGzJYpPF29hUaZW129SOaS9X6FJJpNRbPF4HL9kbPyatUXRsxhjVRklj5kOoBK+VC4HjuUtFwNdEbw/1GYOtFMEz5NVLpdVuJFIRD05fVjgjUcCdqKTw/GhtOzLnAcVm8YyKYeKoOAxldLFrG+iIBklgufIchwHltxASi5b19fQHhd4sd/H24OeOBDT4AZYq+Mzucaw61GtpHPy/Fw6JHiKCE6Q5ft+SGAvLSE6Oxv2S0+zYOOPe3gp6aM1KsKIjOYknhtAOcZkxy3IKLQcsXVBwDlHZC2NxFdfIHbpEqzNDViZ63CHX0ZwLKl2n+wO8NihgM8sR9i3qwF8LhgXpjyyoyyaBCh6/DYC3X4M4r5eeBIwceZZWKVbCF59PQQ34gZ5i8c/A2v9RPhBce+BMPUW4PHDcuGCWiaCa8REqaEis9wuRH8fvOMPgxULt4H/uHFWnE1/hC03u/di1JCe5nuNuRMSxGKxSid1diL/9TeqI6zlK2rXUu53fJn+UFzOz9cFDTMh9ej+h8z0IhGcl3qaCKiTuCQwjZ/v7RJTV97hP29+F8FdPK4WqsKpniEznaEXjYq8TbNcLocgCODBwez6tNRJUealhoBNDQ4l7sH00xfM6v229HZHkvxEUTQ1NeH8P9/zqdX3rJvuuom4MXxR+Rl/9GOzNFX9LXpF6k40GsWN4Kq16azr70Cj6JVh+NgY+vYfJ1PdDWQoAmIyC8PJtzAiN1Y8agBYp4bAR+RZLRMa844LJ4XKlxVXd/9E6o/XkC2t1c0TAQ8cPImR/jE5PlENnjKTWlfmqCZRb/ji1m+Y2/hBEWZLabWn2T6gAJ/sGqoGrnll1vFMXfpTonE5J/7Hv4tRDbBdBbii11K6zevKvzBTgsxsK5IMAAAAAElFTkSuQmCC", vW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASySURBVHgBpVZ7TFtVGP/d29JCy2gLzFE2oEDZEMd4BGVTkDk2p384HzMsapbgYrKoifLHEvaHCVtiFI1GNCYzokIiKkYjmhmdjzAcsIeJpQlKJDxaMA5ER1toe/u4vcdzTm9LQ9zE+CVf77nfOd/v9z3OuafADYQQYqbaQfU8VRdZE49qa6Nqw38V5qQCbFR6NkxEFz6rRshleNpBBn98kfjGDpL9jfZYY2MjWVpaIoMTV8jwjIOsy6ptPZ52HXgHfZxi45GZMbw6+D7mvQt4skKH+rKtqKm7CVLUBK1Wi988i3jlQh9zwgetL6DSWmambq9RDJMgCKcTmGJq5Anwzu96cLTvOQ60I68YWQYztKKAUDAISZKg0WiQoU/Hznw7SjYX4PA7J7iPKqdSMxETNU8F7740gKptOyCTGILREGQlBFGQEAoFSYJAJgqCcggQgIr8Urw1+kkqSUeiJ4kMWGnM41en0Pl9D6ymHEhyWNUIYoyABBkBz4CWgJOzOb4mGobVvJn7jsyOMTxWLs4mqEwu9rKrswXzvj9QSVOnKGyWP48rfhwYC+OaS6TLAYu9DBfLM/F6ultQ60sVYAE22Krx5fE3EplYWJMf4E2ddVLwRR7dsuRDhi6d+eCIU8KmP2VICzJ+z9YIAa2AkvGfkesScWhbGj6uMXCCcDTCfUdcTp5FQ0kNg21jBPezkez9BicqvBBpM/W6INJ1JugnRNJ8WRYc1jSQYBSZRXXIWPIBgWnQQuHhywq22H1ktVIQwtEVhLaGoMQIZM+3FJETNDGCajaqN/yEPbd4aQMFSkKbI3gw128WzuUZsX9GgkLTGTL64dt1K1q/nkDpiozPtuvQcmlVKHhwGYoiU6XgMZqQfogitjNYm1ZtCO455sCce4HvCt4cqv2rWiUnLyaSAOG2LPku9AbfxJGIH5vCBHf+IiEYlJXiu+dFktzvFNWmx9BFJAm4aNILocsUeR0Tog1qUeSTQeS4uyUgIc1ixVc5y2iZJ5izaFAVgKjLLEHKeaI4tjUMqm7GNDAwED8YYpyE6bVHnsFHS04cmgzTCQVZk2/DYzdixZRGV0Zw1aRBdWG54jj7Ht9eTGOxGMdQxZskcCxO4sKMA4K4loV+j0V8qDOM8VwRZrrns7NdOOMREHMbMVpowL3TEZx7wiR4Rj5MRk8UBY2ltdiXdRszORnBD1T3pqXp0DXaHz96KWX6q96IvbNhZET0cC8bYBgm2LkawxXauW46122cEjA6FV/MdgIlab55d8L9CwbXxUYNJdVoKK7mTUKyYxRktwG/HhaUopooCjxR5HqjRHd7LTxHD/I5pDSXSSHtEceJy+ciLYeXDobYW3tzK/5JIrVEzH9ZwlOWKfnRzICQ++kZSHXl61bFGfoeez5h6KXY7kQ3HmcNYczt+1qTR3/DombNfCutdmZhQfNPNidgTAnDSbqIk2CDJCT+w3xOcj8up1XMtfuAGrpSSYaffpcUmrcko0tNin/x4gPcYavC2WNd68G7rh9Q/CJfuzJnx8iw8yWizLSQ+w5sjzY1NRG/38+vUjb3b1fm9UjYpd9LNi7nyf/4d9GmAnhSAF2qjV2P5hth/A291fHGWsJnDAAAAABJRU5ErkJggg==", yW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPDSURBVHgBpVZNaFxVFP7ez8QS62QatbSkaqyibdK0YsVFEjDdCKYLuxFBGlBw05VZVFtETALSxh/QpT+VNFWRIohiiYqL1E7GjdSathZq1IZ0LDPTn8x0MvPeZPLe6Tl33n2dGZKQ0A/OvPPuPfc7v7w7wDIgohjLAMs4yyW6jdlgrZ+lFauFHAoIVoqRFTtiw9eCCBXiZ1L0zsgZSqfTlEqllGQyGSoMH6JyIk51WfXX89l15AP8GBR94s80Pvj6PGZSRWzb3IRI5CEYhqHt4P99Ec43x1kH7j72Baz2jhhvfch7TWw3pDnN6sg1+eHRs9g7FEfEsrGlNYbo2jWwLKtG7GgUkbZ22A9vRuHFF+C+/66mGqzOxNQ1D8mPncORH/7BjsfuQ9kHiq6PEiumaYainLgurKLDJSA0bG1D+dOPq50M6J7oDKQ0sXP/zmKYHWy4txFuyYfDUpwnuCxCLCUKxS3BdB0WF2axCHvjRpTZwcJvE8In5RpRDgJPL8vLS2/HAcNiAhMFJi9w9JKBM++rKHQP1EEmN5hYyC3H4axsWLw+fzuLHhlzyWCPaupkBjOZoiK5kV9Q0Tslj8k9pWvyMAMmFXLDqYiZy6ly+ImEzkLQL1P0vGgnEslKxTj667ky1kUrRDwkXC4PF6bS+C85g4htYtfTLVjDpYGQiwH7NrJZmGxv8Vh5Y2OwO7uF9hlD5ldqlmUD3/dh23ZNvQX5wjyOjMXR1VJC29TvGG3sQN9zvWq6wrHlsyKe56m15uZmeUybQUPUphBXQw6KXMxN4fJdp/HHhTkcT67H6fLPuHJtMtyvKV1VnxittYx1jdRo4KDWcb13ffk56H8P3BG4fhmLna13Ig6mRZHZXoxc8Dii2PnLKcz2PIDupy7j1YkktjW0YikIV4Cs9GCclZ6Ft94EffaJGjUjEA3atAm5Ez/BumctN9JE+eZNdB+YRDLjVltBfTc4v317HsXhfU/I4knJ4FeVSm8vlkOEPw1CrvUlwT52d7Xot+/lxEfKAY+V0dkFwp3hwQ2N6N5+v379jkfXyLJyUt6s1w8oB1pWBar8fDXQqVeOMve0nqJXIA3hDMzAyerZCQf3bkXHI2rqJWj1yVYOxFO4sP8NGCvOJLAgId+Cg31temMo4KwzJxoM76fzZ8nbuYO89c3kPbmd8vl8jbT3/UhNz35Lu/efovjk1eqbbXD5mCoXeXhl+okJ8t4bpkKhQHNzc6EcGv2rnnjRK3MpJ3LpH6WVY5zu4N9Ff0AwW0V4KViTksaW47gFKpK8y+YM7rwAAAAASUVORK5CYII=", LW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARISURBVHgBpVZdTFxFFP7mbkHY8rNYoaSVAho1bYEVG7ZJMRFioimJkQefNqLYaGKMQcQUfWgEXqyoNJCY0JimmMKDYgyihhpjAo3QR1h1IRDXQkEfSJR/WGB353hmuLPs8pcaT3L2zszu+b4537kzZ4EDjIhc7A3s/eyTtG3z9lotex7+q6kgG+BerWM/IrEH+Fv8aGR3qXl4aBCbN/v0kxYX9W+sEyfgKChEYkUFDp170oQusDcJIVr3JVBy2OAacL31CmhmBlZmJkSGC5bzsA6Rqyug1VXI6bscAxy+0QnH6UID08gkTbsI7J1r9p++b0HJ4teUMP6wsKYJglE4CBpNhxBIfwJyLYjw+BgSX34FSRffNXBvm0wso7nZeVNTE7wXmvHFbI7YrEolqzoZ1tEIWWtrcASD2i376WDwQ0yTePIUQp9dxfrHzYagwdRE2AQd/Kj2+XwoLi5GUVERUlJSkP1AAlrfz8WxrESIsaDEjyuEiQ2HzoQzimbB88jyEmcyjuRvvjV1GeAsyoXNNKlW8vPzMTU1BbfbHa2LM8lC7YVseuH8kS1IX5BwcxkYXxdkK6xIIkwSHvUDpaVw9nxnwjMO8UelphsY0ODK5ubmkJSUpMesDC59EhB/TC5QTXU2nG5LwJ3GBJxVN79Vo+tbb9bGptY7PDSE8O1Bk0WtWntejXp7e6O7rqqqgsvlwiq/KYooIyMDn964K572joiZvxhUMuij/MNL6aD3Ugk5ESn++RsW5+hQ2fT1GainFMHjaqT0NzY7O4vOzk7U1dWhq6sLgUBAk03cWYCncpi6ev5kXYLaRREr/WGyJS4fiQh3MinR5O0hA5UHcxRzc3N1zdLT06mtrY1WVla019TUUEJCwi5/57UH5byvRMrAWZIBD0V+91BoooTWr5+itVfPRo+4hRhTRW5vb4fH44mu1dfXo7y8HKFQKM6Xljd4cxGxVWLbeCaSuPZy+/yqIk+pVJTOSiav16u/8Pv9aGlpwdjYGJxOJ9LS0rC0tARXqgMfXMyh171ZcbeAGA6SdX1O0HBQOEofMssLUYKysrK4OnR3d6OjoyMWA+6TTuq5+ojIO37fNvgI1+HaHGgkGF0TpwvM0Kdq0Ki06u/vN+dGO5cubv7Gi1ms+RNS6a39q0KiZ48TZd2vXbKH2TczeTz0sylBrbnztXEWcaDKXWkOee1y/jZwd6GkZ45JA7yL4Iw79hrP03mYu39nFoWPJdOdW+49d7wTPMIeUnO/X5oeEZXRbjCqS1FDQ4MGf/Olo7T4yxl5EPDO3Yc/ao7teHlxBbTbn7ZbP1yR4S8LpGRgeQBw7O4j2+Bb2u9lpuDa/L9ShPWM2CAyBlDGAlc+x0UdjAVvjMXcq2UqdtXZdMskdey5ZWL0N9D09FZAejqgLrPzFRDnSk3oni1zv0xUTT6ne7d++h//LmptgPkYwEl7TUnqOgjjX1DGjSNpiazMAAAAAElFTkSuQmCC", wW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARFSURBVHgBpVZbTBxVGP7OmVmWhcWFlku3tpa7TS8Kiw9abKCJD1qDFE3a6Iv2pa9i1PRR+liNiYlP1sTy2NQ0wIOXxAsQrU0TsLWggtCAaMtFG5Yu7MzszszxP2dm2iUsWOMP/845M///ff9t5yywhQghSknfIR0knRH3Zdm/101ajf8q0skHeFA5vxkRywP+Ol16SEvl3l4dQSY5hOzqKISzqmy0gji0SCMKStuhR58IXJOkZxhjH2xKIMvhgxPwKMyFT+Bm58H17eChEjBe5Nk5abguqXVb+iBa+74i9KWHSM5sIPAjV+zG/Dlk/r5A0R2ExkNkJUBOnrGQ//KPqbXrGLCNaYS2vYRI/FQA90aQCQtqTpdrsizmAoHf+RR6USM4Z+C54IGHIlF+EC6R0Ca79gtC5S8jsuNUUK5m8pvlvpssTalj/AZr8Rz0cDk0ZkGDSQQWOKTKteldlVreM+Y9C4UrkSVfWVq/f+dVPH70M3KT+rUDzFlAqLiRCChqin7ypo3+L12krAqcOBpD0rAx8Nkc9tUzHGnVUPMIVBYOpWGnp4BIAsV1HwX5lun0cUyunLVRMHsBmgZwsULgYcjCNNYwvNjBMTM9h4uXQohEOTqOWKitKUS8UkZoq5pxkaWSEk76R5WFHm2RsN2yRJ1qalaGlIFGdWdukqBNcjaRNh1MzaaRKs4i83AFEq0RHGgSuLWQhJlxycZQdkwkvZ4Rhn13KMigTWbQJFeuOaUeMqnIUqmoT7wQP41kMHp7CRl2HPGWMlzLaOgbWEIl7wM3QnjyqYxHAFv5q6ZTFr5U635DYBqL4G4IGk2EjMSbGhMN1Wu4MbkLSyWFeDSyF7fCYZiRcbiLdahrn4RpRf0x12maBByHCCwDRT6BbLKcONSf6MPvi4Y3hywYLuB40wgS1jRSexlGVuIob0hh/593wW5yXA01oH8sEXyTJItKYU9VEaYvdqm7EmlWLmLRgpxBXy8rJQ+h+ask/rAPYmI8gUT/PNZiRbAdHRuFoToeDTbJewRtTVX3I8mRmTvb0XV4AlZxCV6d68UrEx/jSjiO154dw8RSFfLJY/VlwfK6JBiWq87DuzeAS/l5fic+/K4d3+zajdqyJOL7aIKad+LNS89jKRXLAy98LCUDsgeyycty90z31xi+/hdlyZBbqrDuooCnUb94FRURG1dibTAyOmyhrwOWPdizg+p/oTO4WRO8iwbp0i5+uAyn6wXVmPUU/y6ur9q3w2D7D8hbvfQuOhmMy0nSJDvUCv726TyF2loCe/7W6QBcnQ3rjbzjT4nz3lnhVG4Trq9iC5XPpa3z7tncE647fyRC9NwzGb8hnJbHNxC5OaqAj3UI9/L3ueA9uZj5jkzJrl7fak99wRef0ziNQczNeQ4xmp5DTwPPHYUsqy95j8zNMpGHfq94cBkU/+PXRbcPsJwDOOPf6/HHfFP5By1vqhbbQC2IAAAAAElFTkSuQmCC", qW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANXSURBVHgBpVZLa1NBFP7uKzaJ2FQNLkS94sJFEqnoSgWjSzf1H6hQxJ1xIS5Td4ogQnfiC90KWgXdmQoK7hLxQUEwsXFhqxKjiWlyH+M5kzvptU201hNOZu7MnO8755u5mQB/MCFEgjxPXiAvi0WrBWM5chv/ahwUAKzUbg4i0vqAn6ZmgjzBz+7zZ+g8fiRbUa/LNfrWrTDSGUSOHIG574AK/UZ+XtO0KwMJWI4AXAIuXLkMUa1CTyahjSSgx+IyxG82IJpN+LMfKAaI374DI5VRMBNEcn4ZQZC5ZF+4dBGda1dh7tkL3bKgEQoFQaLJEAEhvwH/ZwvuzFtEjp3A0NlzCu6MqkRTmlNTZFkY3LlxHVY6DZ0XEIqmhbPRAvguH/d9WuCUirBOnlIkLNduIqkogpvUHPdev0Lz8EFYqRSM+NouwWIWi0xBv1cFPXs/vlMlM4jef6D2ZZoIDmlB9mUeaewZhV6dhZmi7AlAESBUgRA9UemjBT3Aown3zWtg/37E7j1Ui0ZM+joqN7X83nfTad/I7IKWTGqCtBc9VMiMPec7DGtdd0Aomq5kvucJb9s2eL6AVS6b1vbtPJ3jCgrUydbpCLZaLZimCcMwpPdOAoH7XhtOYxbG0EboZgy6sYalVQcEvu/D8zy4rotoNIrh4WEpE6swKiugCV3XpTOgWNQCTuszPr28AKc9D6c5i1r5LjqteSw1juN4x3HUkM0SyReKM+DJsCmSTrOKxvwLqk6H266hVn2C+KYDvyXB4MpD45KgtyDchs1zGjDXjCA2vAPCiKDxdQZeh05ifMuyCpZWzylXZCeQZpDFNoxiofERolPHus2HiaA+cC3vY2DfzIDAjkQiaLfbfQPWkhycwEL9HYS1CfHkTgwlUishKHHvKXl2bm4O4+Pj7qAq+BS57S9dgMh6OknRZWtYGvbJyUk9k8mwOlPqN19aNptVL+eq3bbt8M+4rZgL/FQoFP6boFgs9u6IcGl2cEuJfD6/anCODd14Npbol1OzqyEJgbPl0M9oYkKt4FJZz78B876xtCGbCGP2uzKZPY/gDZ+ensbU1BRKpRIqlYpck0gkQMAYGxuTbWB9r8xBlfCe3BIrt4L4j38XuQCgFgIsB2MsaeJPGL8Aqoe6M5Zylg4AAAAASUVORK5CYII=", xW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPASURBVHgBpVZfaJNXFP/dL19Ss1iayNqOrmqr3Wa7Rd1gbHSB/X+ajLGHvVjLZA/bg7D6lj013YswJux1MLAbbHt1nVoQpFWLIEWsjaj1T1MqrVa0TWpNrF/yXc+5uTf9NEm1eMj5zv3znd/vnHO/e2+AVURKGSbtJR0iTckVWdBjPaQtWKuwkwZ4XjlUjUhUAP+RTII0zP2RsTkcOXNT2cySo97Z9EoI0bYIdnVuRGxno3FNk/YJIX6rSsDl0OAK8Nd/L2L6dhYNkXUI19YgFLSVw1LOwYOHeUzNLrEX/vn5Q0S3RgxMgkj6ygh05Ir9wJ/j+P3wVbzbXg+/3yII4YlEUF8aL2SJ6HJqHnt3vY6fuqPmpf0mE2FqTuY8l+XAX0n8MXANb1FE9BJNkrItq6bUP1dRnp+4hx++fsOQcLneJv8pQ3CIzLfJGwuIfT9I4BuwPhhQwCb6FetNXSolfyw+WKZM0jh68FPEdjTw5DARfCx09Ckeie4ewPSdLNVzAyFYGkYUEyhByiKR9GSiUpFI3phHbPvLikRLxKbHV9y6MpV2tzYF3baNITRGXhL+gF2M2RO2cBfp4YMrQk8UjEkLTkHWh32QbgGTMxl7y6t1PNXDGQxR46NMJoNcLgfbtuHz+ZSWllVI2NnTSC/SfG0UId8M3EA7Ea2HLjFc10WhUEA+n0cwGERdnSIY5jrs5BZPWJallBdXrtQAVm4U/f9n4LibIZ37ODYyD+vhGJ4W9mN/x3HMUAsTqA3FEfDkE98JkYj8HP47NYrBk4+QmxnE/MR1DJxI4/i5KxCFhVIgDG7UE1yL7WX32hKJFcJywUH95iyOTZzC5FIKOasRF64t45P3ZVkGZdmTTqmGLs3TQtXHe60WQjWXqNeNZv8OyEdX8c3nH0D6IqgkvI5a0iWCQCBQ8WWIGjS/1o09n3Xg4q0kxmdSiH/3JZob2lBNPARj/BUlqNGbmr2PfQdH86JKJpB5IrOxmkiXN52LX/a9Y73ZGubg97MHnxm9rU21tLd89sj4vSpHw7OkuNk2Na4DgZvBwxZFy+fGMPfiezpgzpg1iyw+/k50mpF+PovMd7mXNB3bXk8k7Sht/zWhS8S72hHdoqJXdwM3FAEzmYF4VweRbNOHzbNIVs6heNc2XQElfRqz7MJJkOFLB8nJNHYnzmJ6Llt9OQibDzfOmq0HPGE6la7MHk1SvDLH7+LomVkizBTJSOpCfgX4RWeTF7jilVk5sOKl3y+fX4bkC/y76NEACx7AlB5LkIZXw3gMGcYkSVk8PcUAAAAASUVORK5CYII=", RW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO6SURBVHgBpVZdaFNJFP5mepP+7GYbt9R11+3abMuyq9vV3X2orYL6IKJUFBGfRBTffNAqii+CqT5VoYoPgoj0B0F88wcUFfwBq4iV1t/UB21sbdUKNo02uW1y7zhnMvc2sUmteshhzsycc74z37n3ToBJRAjhl7pX6jWpPWJchvRavdRyfKlQkE4wVWnOBcSyJN8mh6BUP8273t7GrYFLavwwNqx8ZnxXhkr/HNT+sgzzSmuc0IjUBsbY4ZwARIdOrhKe6j6C17GXmFZQCp/Xj0KjSPnFkzGYyREMfOilKOyrOYEKCaglKEEaJgDoyhV665MmnHnWjL9K/oOHGymvT88qUmom4+gZ7kZdYD02zN7h7G53TsIczuXQSbS0hZpw7nmrqohxyiEgnTPLEW5RGojh6bv7WFOx2QEhuv6VcWGuQ4ga/7Phx2gLHUJJ0U8YFXGM2nGMCVPapjtXSrZco70x0F4MpUUz0NbdhPuSWt2/ZjK4rn4jTbaebxdUNeNMJpI8y2SmShobT67VtEf0fkwB5hmGiiMQLYvpMZcEYzXN7rwYRXe4jlWUD1mBX1/Bm+eRSIx+DiMuSwKZVEmukLAt4eclsC2g/33YmOmjulFPAKvIuvzUlMk43r7ZnLdkviH+nM7dtlIPiG8a2egjhHt74DEodAT+aTNRUFwN27ZhWRaSySQK7UIndBH1YB5ZoTdJ4gbvExw7rwBRc7xu1Uw9xkUlCn6rRmPfVTzxlCDBZyO9EM45EomEs1TOdUMwELUVAJX9Kgp29G4qYTa919+JWjMAj22oyp3kjjoFOQBp7CpPZY5ZGdS7QhTUVS7H3B9+x5LAIkQikYwTuI+0FgIIk+HL5y7Izz75ptQgq8TjccRiMfT19SMajWJwcHCCj6H6oyTiAlTP8qqV7/Mhjq2Uo3fid4qEjk8c+8v/QSgUQlVV1WQAXWTdkLp46R9etHSY2HLvuKjs6LSQQ2bpsTTLni1JtWQB+Q37OXw+Kv4so5dBGkPkcHpPm1h7fDsbJ2vqQg2jdttlZfB0dDnLAS6bQl26TrN1KyqY/oZl7/BnAEiN1pPOUkv6t2iT1AirXQC+a/dXJSdhO3eDzfmbTHU3ZDqlrj8l1sFGYU3/UdhaxSRK++RrHWhMv+Hqs1ciRNB1efRAWP/PnQBkp6lKvHqlsNtvpicPpufMdmUSuvp8q/mtduDiBeDxQ4je3lRAcTFQuxBYvgJEq5asV2auk9Cl3yKmLtfEN/y7qNcJhtIS9ui1oH7Mc8pHVRGjNAQfy0QAAAAASUVORK5CYII=", BW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARPSURBVHgBpVZdTJNXGH5OW0pZoRYcCCgEUsUJTFEWHdTFbTFzYW5TExcvlmV/Vybb2E92tcS6XbmfzJvd+DO92cWyZdlPcG4xQxLB4IV0kzgRExg4XANSO+gP8LVnzzn9vlIGJRrf5O35e8/zvO97znm/AsuIlNJLPUTtpA7JeQmbc+3UGtyrqE0mwN3KqVxEYgnwt9gEqF41Do5fRM/YL7qdno1om3J3FdZ6G9BauQtNpS3W1jvUw0KIozkJVDpMcBjdF3B04gtccd1EsasURU4vChwPaLu4EUPCiGJsekTtwoctJ+EjoSkBkhxeRGB6rtkTnxzBzIljyGt+BJNlTtm/3i5v1NrFeEmWQzKtCSOOocg17K59ES/Vv2Otvm1FIqycs+lTaVHgc1+eRF5jo14UBLGZsKEygWC9XV6vtSNUIgT3mUQCA5O/Y5/vNYtEpWszSYYtglNsXk72X0H0yR3Ia2iA3V0Im+mBacSOsMIlmU0GNzjk5Xohxr1CRGemGMkAPnvsG2xKn8t5EjwhTO+H1Mx0cxPE6AgJGum1yBDoH7eAiErNY+VImhkbKxXyYpMd35ddE+V1rZrElGIHf/aoXrLnAkBwO/u2cBg2nxvi6XwID2lupYDVBBtIQpyfpSepzAEyO6gcgdg7OItnb8YxWNWJf493w7PFr0zalZPP61tz5oz2WHs+Mwnxrg2ifwo4GyZKDDg+AbgSwH4a2dnG49QYo6LGqLcn9N61oynkf9dhRbBDYTbpgJl/7b0aPEPw30JAxySwiznxzQEPJ4EfSbaJ/XXUWJQa062YuA2RSGRSmurptghqVIr0g8LoKBdF+lBXk6qPHk7NAH9xWwG1i2D/MDVX2XdwPpZIH3wqpVvrMtA1JCORBQQZUZdEH9tK/pYQaIUCo+dRqos6Z3BM74sIahj4v4gstURFNawXPSvmZ8cI4HemCeroQwUjWu9I97fmATcWg2eT2KqrreGdDIHd75+3OsH8Omm6zwW8zjdzi4DXGcERD3CMqbo0i+VE8JqbElQEXTqUtrZ5iynm9iCBBwn8QRGwhdG00vuPeKu+ii8L3lexORXbc8Aa/qAemjrksBoZe5+D4A3IPDAlKj2FIk2WQy5XNMtf63bKjrrdhq2y3Nl1sMRaqrVKRSebxyXBkyRZUCJySO+aR9Fd48e3jS8Y4+4HHeomqdr006sebCjTd+c0S8Uri4pd6tOPIVnwbEsQXFqzVfZWtYivNx6QocJVWZVVan1jez7e3K5LeqbYaSrVIYmq4Z/b3nsfqhAoEiV/rNqYPPtQmzjne0oOF9fYTUir6qWrKRS4i+AFFqX68AwDiz84ATaH9OBqv9z/sysZNFY6MmaWdVbB21blIHgBtlU7ssEDWOjJApJ2k0S/8N4RA+dYyP4MJfF3JKV3FOULDbhznTMbeMlP5pJifvRPy7uXTnkf/y7aTYBwFuCQORcwr3lO+Q/TJUUmQT8xawAAAABJRU5ErkJggg==", WW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMQSURBVHgBrVZPTxNBFH+zXei2SqGtKNHE1GBI9KBtYsKBg004etBgPGr8ACTWT2D7CSDxagLBBL2p4QNQDujBiMXoQRIp0YR/NdlSS9ttuzu+NzsDXbCkIC95nTdv5v1+b97b2S3AEcI570N9hjqPmuf7YkpfCjUGxxUKkgCdylQ7IvYP8Cc4pFH7aL788w8srpiw/KsM5Zot9gz0dsPg+QCMDIXh5uUeFVpEzTDGJtsSUDkkuACe/bAJWyULwsEu6Al0gdGtiYBq3UFtwkaxjjMHMmNXkTCoYNJIkjlEIDMX7DOL6/D2UwGuXToLuk8T25jazsReFQRWw4b8dgXuJM7Bo5GLCu6pOglTNcfhM5VlZnED5pYKMDhwBldpWRMja02Huz/Ew7mDbg7f18swdqsfHrokVK4EkqxpMoRK0/djuwovkSAaMsDCcls2E2MdlcpvNZnQmmeNfAD9vQaefAu+YGll/6bI0GT2jwXLm1Vgmg9Vk2DgEjU51FEt20HbcW3hc9drSOLzuXEz7zdVmZL0mOto3KPZx2+rzvLCnEObINLDDH+X7BLbL4unRK1zJKw3+ObvEmwsOfDg+n19+MYQraSI4C5Zsy+ea19fTYqSrfj9EI1GoROhhmOtwTRNqFarwvf6wjYMT0yQeZsI4mTlcrm9IMuyoFAoQCAQAE3TPEDKbiUg4EajsefLZrPKjOmyIZDP5z2ZUQAp1VaRHMyc1HEcDyFJsVj0EBwptm0LPalQamtkhMNhOC2JxWLKLO4RJJNJOC2Jx+PKzFGJFgh/fHwcEolEU9VbNbRTUT0hHR0dJRDSd4wuAxombdrZ2RH1JpKTEFDDSSKRiHJf0RCIWp6lWTAY9GRykuxDoZByT9O76NDLrlKpQK1WO9YpFLgfLyglCQdfdmTgkFGnMAyjo5O07qEYCU6SkZiHPjhpcN+sohflclnUtd1JCFjXdXHjaWwBT8MRWaXkR10I3ma+u7vLS6USxxsqFB8G4aO1A38EUtCJyI/+NO9c5vl//LtISQCzBTAvfWn5mLeVv3oGZEHnjaSTAAAAAElFTkSuQmCC", EW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAThSURBVHgBpVZZTFxVGP7uZWYYGJaBsllhGKSWQktY+mBLaVlMWrWV0vatNqaJJr4YRdNaX1SqsYZWiRpj4kNDadI0xrgUrdgaBS1LFQyIQFlkKVJApiwzw2zMzL3+58y9w9RCU+Of/HP27/u3c88A9xBZlo2kb5A2kY7JK7KgzFWRmvFfhR1SAO5X6tYiElYBf5GaalIjG3db2tE2dYW3S8tWvifFkIYNxs0oWr8H+Ynb1aOLpCcFQXh/TQIWDgWcA14c+BAzzknE6RMRrTMiQhPJ97l8Trh9DkwtTbBTeHP7WWQSoSLVRHLyLgLFcs5e31+Lr0bqkL2uEFpRE9j1b1/lgLp9LoxZB7Av4wieznlZXX1J9URQY05NFwvL+Ru1aBit5xYJIsOQ4ZpLhcOyHl5nLGRJRHjMPKIfHIHOMK8QCRic/x0HM59RSVi4CohkXCWoo+boiLUPz/3wGDLjshGhNcDnMWDq1z1wzKYRjoAovRs+fxjcXi23LDa9H0m5LdCEO+Dw2MmTQby38zPkBfLSTARlomL9UTbzevuz3GpBFGC3a9HXeAguSzxE0QGXR0Jc1CzSk0ep70d05G3YJkzo/+4QnB4ZYRoNP3d+oFYNUykrc4JDJRtN2lqQZRhGSbILW2Km8XfXNtjmDZi16rApdQAOtw85pht4KGUMTrcfGtGO2UUdrPPRmPylBLkxM9iV5EIsmjBtv6aSVFEGsZ/1EvE5jmfNgQzBwFQ8PurNhiBIPMTXB8zYkDIMvXaR5yQ3ow+jMyncE7Y+1peN8ko3MtPn4PcBovwFze5ksCWMIJ/nwddNoQAPUcP1rZizeXGkvI3mZG6KKcGCBXsEDBEeZCSPYF30NAzhbkiU4E8ul6GxYzNeqBgC1QAkb7PqgZmFyBgou7FA/Kk7fCsVXp+EuqvbECbYaMYBj9eDDy7txqmLFVQAC7DaQXtc+PjrEnj9MoanU8ljsl5Qi2iFIHghuNKPTusLlvunPxcjRm9DQswcjbyI1C8h1zyEeCrVuu8f5R7cgSHceWVYiMYZE8Q4am7yyYzkGUSS+zmmv/ht6hjeSDF/AM/va0AqhepCUzksViMRjfPSberJQ2Hmn0ErxTCzir8oKgQI05UGWcvyuqn09Ogcfph0I4pzehEV4SLrZFgdBpiSLNi1pQcdQ1kcnMnuwt9WPAnLV7vdzIOfWM2KlgPwHzvLZx8RbmHvUhcuRxXwcVqiBV+276CqCQ+CHC5tCvaf8l6D6VUXJERThiksbx0EcvjSJYFdBuossJHvQAWEtlYwtxY0USjLeg2LcRH89jrcepgSZ/mpCUsSYg0OuJfDYbbP4sfBtxEpuRk2pLQ0aDu7Ve4Mka4zS3kzD9PxE+o3DHG+JVwZOoW9E90cnInVaeDK+xSqw9OtuDr0DgdXz2nrL8gK+LnQb5EZysdOevc05DM13Au1Gm7qEvCNsQB9+jQ+3uSewv7FTqQv3+Zjhsisx7ETZOQrPLlQPnbBOCrPHxf/mRrZnxQvS4rK91C2zvb6T9eEvnBVWE1ooTq4pbdH9m/Nu4tIClEOXPmkLLW2hIJXh2Ku9mQydvay8RsuU9LR+C3Q9wfkiYnAgdhYoKgYePwJCEU71KOrPplrecIe/XPy/UuT/D/+XVQpAAshgGPKXLVS5mvKPwSW5U276ZaGAAAAAElFTkSuQmCC", SW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ2SURBVHgBpVZdbJNVGH6+Qf/L1oEMNoarsCEQ6TaQzBi0mGhgUeiCemG8gcSfLEStGi8nBW52YeJiTDQKDo0aiUgcwbBEyOj0QoWxgRMRnOuQbQXWrd3arlu/9uM95zunLaPACO/y7vw/zznP+c77FriDaZrmIN9F3kHer2VtTPR5yZ24V2OLBMBsrfV2REoe8Leo8JE7WNvfNYS2k/+hk8rwxDSf4yybB9eKBfBsXAb3ujK5NEy+W1GUltsSMDkEOAdubu3CwHAUJfOtKC40wW4xwGRQEYpoiE1Oo39wHBrNPfxBPScU5iOS3bcQiJ1z9r2fncLHB3tRt2YRCm0a4lMGKDTzhbq/MZk04GhXpVhMYwkVf/47gte3rUbTa+sl3NvyJAVSc7nzvZ+fwieHzqN2VQkWO8bxxqZfMN8WRiyRRuC6Bf9csRNhGkXWCJqeP44VZaN4pPIBfPRdL18rbJe8E0UQtFKx/ezFEB59+XusqVoIu9VIkiSx4eEraD+7nEuhiANr9Gc1qtiy7iL855ciGLZhIprAX30hHP90q7yXk3SKpxTB1M96Krd+i4FgFPV1ZgyNFRIMASoSNgs+46vgvUuKIzj2+xTca0uJZIscLWYSNchLZeBF1iT2vHgEDevPkRQp0jhF8jBXuU8m9D7dVT7n2dpeNL90hNZOE84wxxLmnUv/PKzW5h/gu4xMmtHQ/AzsNisHYRtkFyw0yrazHwd+Ol2OL0+U0FqCU1L0WQekTG5GUMNq5y6F+J0X0OrBURMM44DFnKQeRYiSvQUNNxOMhOcgqRqpleZzOruH5bCTScQfVGAoyne4c3MXXM5rtCCN8WgSE/GkLoWQJMbrehmN6+NsblXpKN597g84bFOZBykJckzB6vIR2I2ZCUilNQ4w01VyNqaJ4yxfFMbK8hDCcQty3y+TKMCYiuwmKuJo3FePPBHkrtbeswzt3Q9xAVkoERYuEAR0KaVCVNLMlsC9GpNGmqsqEzZ6GIGf1TzuCt4zzzyFg97D2FTdh9lafU0fDr3zA6wmFblYZG2MoEWewL12MSYSRnzV6UIwYp8tPi4MLcAXHdX0JuaiotSeVQP4UYaKDio2+s8M4+nGY3QFjFe/h8eqBvHbpSV5gTes/B+/XlgqWqStlsbprz2o1iU6QKFih/yKdpCH2TNverU28/yrnVfxzZttqFgY4ZNcFVfxxKrLvM769jcexeMUq3Rwja8V4Dw3ADeHay8VH7L6nn3dFBl7eLAzzNEwFjPzOS3bf6Z2Cjv3b4aFgh3LDRwtauTg779SI+Ey4XpmwvFRwZIOvexRbdt7J5SBYCwzbjKw0KFgWs0+H3ZvTQTMSmEsq/lkI1/K9AoSPWWeCVKcuswIEaDsxsxhN+JJAvS4H8wFzpsy85pI+ge02VuHdh+/LrwCYCwHsF/0+cgdd8K4ASprijhtKQc8AAAAAElFTkSuQmCC", kW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO3SURBVHgBpVZLT1NBFP7m3ragFlJQaI2iBIzRhBKJic+gJi7cmKhrdOEfUHTrwurOuNB/oPERVyYa3asx6sYXjQs10YJghAIWKND23vaO58zM7YNXMJz05MzMvfOdc745c26BFURKGSG9SvqCNCUrkjFr/aTt+F/hTQZgtXJnOUdiCfCLZBKkEZ4PjDp4O5RXdtbx1DuxsI3O5iAOb69Hdyzkb50ivSaEuL2sA6bDgCvARwOzGJsroWldAA11AvUBS+3Iux5yrsSfbJH34PrxZnQ0B3yYBDm5tsiBiVx5v/cpi6dfc9jdGkLAYlBLvRNdD5QkMJFTO3iTcpbKuDi5sx7nehp8uEt+JsLnnMwnpuXe51k8+5YjCkKEa+lXhEB8E7A3CniE+3EM+DKpNqoM2H6fKODMrnXkJOzT1UNOBi3jkamJ/PhbxIOBeWzaEIQjbRQ8S6lD+j5tE0VC6YdxW60VpH5W8ARawkHcT84jSdSa87ujMjDRp3hy7vEE0vMCnRtDihbB1FD09ANH0sIU0TlnCtpKnT6pR8bDj0kH3a02bp6I+FQ18cmc5lFy1EV6jvBsG1lXoC4gFtXYrxkDulCkgFMUitLkWFFlYaqrnx2c4tGbYUrN0lFPOwKNKvKKB2kOzLeV4tCzWZcDsglD4u1w2cFRznwPj35mioYSCwc2AzMFDZQv+iqVLRSr17ROU2y9W6ACYowBysJIu2UOhOpdKvAOmh1vA270SuJdIkfABapNpwRl8yVZtvwstsHDrSMShzdLbGvUFTfnlolsD9RwKXSds7Dn+oCkshSqNJcTpyRQpIPm6GWZwAqJ7GCQPYVDFtJ5gaGswPMUlWJaYDUyNg9cfiVwjCgazuq1WIPtP56yjAN0R4N6iYL4kMaqxdXtCS9HzAJl0tlUJuYzO3jFo0NtQV3TaxXCONgW9GdP2YHqGd3RACmnJpcsdrrcaKWL1tG4IjqiYUGXrZzBE4sOh/vGS56djdfp/qI81HqZc4Er+zxc6PGWgdY96Wrven/pbnUvOk86xZ774iFz/WsBjm2VyOSB8ZzA/tiCh6bh9XXVoaNJHbD6NvCgul33k7nF4wdfHDwk1Rev8toOuiN5ug8j2Vpw7kN9XSGc7Sp/fGrbdZWTBHRnxc8pD9df56kMqcbLr/nNokJMvMUm8KBqckb4q5ZA1Y4F2apMVPvmeTJdwrvfJWolnr7tJGEKNE6AB7fY1cBLfjKXFPPRvytXLy/kGv5d9BuATBVgyqwlSCMrYfwDSlA7gCpnwKAAAAAASUVORK5CYII=", NW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL+SURBVHgBpVa9bhNBEJ49nx07ke0ARooESCmgoaYn4gWgTAkvAC7pHDe0pEUgJS+ABBIgUaAkNOQB0iESF5SJ/x2ffT/DfOtd+3xxkJ2MNbq9vZ3vm5/dWRP9R5h5VbQiuid6whNpmLmy6DotKjAyAPPKzmVEagb4K3lsia7i/fDPgL4f9fXz9ZOQ7t9mcl2XMpkM5XI5ymaz1rQpWlVKbcfx3AR4xYDTYDCgN187wcHvwC3lU3TnRpryeYAyRVFEQRBQvV7XdqVSCYRw6K1gFIWkeoEg5jm1Wi3qdDpUyOacB2vGQ6WI5ec4StTBekqlUprs9PSUVlZWqFgsYuWWfGvZSByb8zh4r9fT4fuRQ/1AicrTdwCvwZO6tLSkbWBrpGJr4tgJ5Hw4HGrPkV8Y+pxigHuaABEoCWSkFhxR4JlOp7UtUmvqt6MJDNNzvJydnY0NADIQ7z0BBrgXCgFP7wlLBoUdtN1u288b2OaowTNbVOQVO8QaD0Oic38CGkY0U+Ikvu9rLKRNpAy0pxh5njcO2xr4keK+z1IkS8DaCXwztZsisvbAMgSPFU4lcrb5rk6HtUiMhVNJTl1FWRdEZMBoPI4L5uFEIOExS4hRSA/XFH0r38LnmmsKQn8bPKq5AfFDKLblZCdoAuM0G414RAJD/FgWtb0x/7p70Sc1db4jOEVziLVJbAQ4V8OgkHNoRudYUJTWuzdTdqKJGuzJYKPb7erqx4v88qMT/DyenPYPm0yP7vFMaBQcGoahLnA+n8f0Ptw+wAiHK7krripmB0E+g2DbEuA0XocEtsgAsIx8ciQVaLP7eFteXh6HughRfH2hULDTu4JdszvwhWgTEaDJTcAXiwZ3g+kE+m7AQBOAyU4gCiychyQeLWxga6RqMCc7BP0bzUmGFSyUQnEu03Molqpk6mzvQtS2h9GMWy3pVdlc6lp+Hftc/XLOm++7/OOoxc1mk6Xvs/R/lsbGiT8CZZpHzKW/y/PLHl/j30XZADRigCdmbsuk9VL5B1Z/PHQwGPntAAAAAElFTkSuQmCC", IW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARWSURBVHgBpVZtTFtVGH7u5bZACwmgFNgCY8pgFEiEyNA/E8PUzKgbEb9jBvpjUX+IWdQfaig6lviVmBgNanRT4+ZHnDrjD+MHTJclwxi2dcVFHKUQ5mhn27W7/b73+p7Te0sZsJXsTd6ec8857/O85z3nfU+By4imaSWkA6QjpG5tQQL6WD9pLVYrzEgHyFX2rkQkLAP+NDUO0hL2PX7ai4oSCQUfvgvN5cKL3a+jvEjC+jIzNq2zoKmywDANkg4KgvDWigQsHDo4Dv95Fj8ddeOBVitqvt8PsaEBI+s3Y0oqQzypIprU4A0nmQ2e77Khlgh1cRDJ4BIC3XPOPuacw29js9iZPwnB7YZv6734aEyGayqIm+9qh5a2YEaIEZknEMft9UXkTIkB94yxE8GIOYsGC4u8+xUk6jbA3NgIYcYDcVMHjp+5ADmu0GIBR1HFgdMcarpL7T/nY7hzY4aEhauVSKYNgr3U9ConTyDY0Q5TSwskaxFnF42tMiRBwO4XDmUHFVH/OcJXEUkomPaFMdRdh9brbGxylAhulXTve9lI6P4e5FErEbQYkQmUY2YiyX4TisA7LPbRwDxe/foRpCzkcp0K6YgTeX93Au/9zJZ3smsuUWc7+0olkxAGXob42A6IQ3sgmkwQwmHIHZvhPBPAOX+cE8QVLeN/IqVhbksPcOpjyE0RVFWq8IV+ReG/oyiu6mRL+lkEtrHepz9MYuJslO/A5Q7h/flyCJ5pWB/chhpRxhejc9g17OQEhsZSKtZeWwipawfW+Hth+rINpsBtiERChg+3MIIbWO+zH6cQklPcy0AogefeHscdrnrMDr2Dqmd34sA1x/BSbxPiKSwo3aCB4nzsKS7EcMP1iK+pA8xtGPhr0iCoZQT82GfnZSgC+W/O59dQIT3i9OEmxykMP/kB4rEkHn3z8UU7iBJBX+MWPCxtQFdJHUrNVlRaSvFQc1eGQGB5znpPfeMF3TQ61DwIooBlknyJyL4ZHDy0K32fCEVxnoRqs0Grr4f1q4N8nB3yNGOymkUi0HLBXSTB7u2wSGZOwMBEIlC678lMZwjsFWZ4QnGeoLmSWMtrcLrlblSXScjX8lA2dgxaUzM+qc7HE+klx9kZHGa99uqChQxdhRyYLMb4iSmY6FqrlHAX/efRVlRtTH/HCHjNaKId2CtMSNeY3An8MQGf/7cR+10p+KLATPgiOuw3GtPfGqVihJrOCW8Cg79coEMW6bBzO+i0aDyzNUXFa1vLtHWlecxwH2H0GaWmjzRot5lxX4slHarVRIsXPI3b6uD8bWBTnIBVPWOgp9lKauEe6aXyCuDMe5Xb9LRYjdFBHXPJg+Oghj068ARTeOP3MHwRlZfptAiLCAka9nITgRfCbjNlgzuQZXGJQ1q/TsIzfMKbxB9zCXpUFPhkha9hOdNok9C+1pwNvOyTucKu+aO/T8tdRrSr+HfRrwMEsgDd+piD1fzLYfwP7bptsMx9LHAAAAAASUVORK5CYII=", TW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOmSURBVHgBpVZbbxNXEP5212s7FyQ3TXBpCQS3qarKXCSkVq3UNmrV5/YVJQ/wC/ArT0n4BfwAJBDhDSRuDzwgERAQJF5wLFAgkIuIQAlByfqy9tq72cPM2T3Gjp2QiJFGe87szPfNzDl7zgLbiBAiQTpKOkm6ID7JemjLkA5gt8JBIcBO5cJWRFob8NP0GCNN8NxxHFQqFfn0fV/6RCIRRKNRdHR0IB6Pq1CLdFzTtHNbEnA7QnBML9ewT7fgeZ4E1HVdKgsTkS9c15VzJ74XqZ6IghkjknE10dtkjktPizg7aUlAztA0zSYSHrPyO67kzJ11TFCMIuC1aSII+xeAZ0u4NetgsDdWB/ycHuqJ4doLh0hKCndUrYmqgFuTmFvzcHm6jN4uEzVfh2EYEoBKblEFzj5VX0Nft4mJXBk5am24fhckQch0UtZGbdF0Q6rjNwPLBdOa94R6p5LhuAlKMJQh3uZcwf88yy27eG9TEGVVdDWZ1WZxaiWUq7YcV91q3c6+JYrh2NyKp6pgyTDBfzx6tERG2Q4D+RoRbAQEFaeMq3fPo0rAq29n8fD5Tbmzrt2dgO0EPXfIt0AEoFjGmFqqE/zFBMd4NL/uEbjOJcCjjAphgnPvnuHbvgMwsIZk9zMMHezEzJtppPYPIvtySvrkCa+2oVqmY5qqCGVADxcEK7aQ4OrL8ITcXXi7+gY+Z1jegw3Ph7U0hYI9BzMSRalUlD4b8vvjCgK1XdFE0LBqyvGTSRcRdMY74JZXqdd90L7+G68X5/Gh8I7a6KBVNDQCMMEiD7qjegs4y0+po7h/+wqyM1mU9ePIa4dQpN0w8+Qxjg7+2gpOFXyzx1AGq05wJGkGJtEc8l3vQaR//gVLyw+wYs0j92oSq4U5pFPH0Z9MoZ18/1X92Mjy6D7p0O/9Jq7Pum2OP+Cff09gZe0PJLp78cOBNI79OISBfYNoLwK/9ZtqcoMrOBdUECE1pMPmKliSPfsRi8ZpPbq2BU92aTiyt17BdZ22Fh+z93g2cjjGWwdCMgjsRmQMxY7+2alMFwl7Ue2iU6QWMw8fjkrHXeGLAHw4HUMqIRdY3g08kATMpAwj5DScjpJ/cOazbo0rQvVlzAgnF8h4iNly4YwhOFmxYPl+j1bU+XLZfMg1EvC9sFDppL4bjeBj2CarTHipS6FbS9i2LQqFgrAsS2o+n5c2frfpRyCDnUh46V8UO5dJ8QV/F5kQYL0BcCG08fWY2A7jI+/0UwuY2rZ7AAAAAElFTkSuQmCC", DW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOMSURBVHgBpVZJaJNBFP5m8qeLqU1dsC1aDUJFRUVRtDaCHgTBi8tNsKgHb4qtuIAItl5EBBE8CKLWgydPelEEV1ygKrgVxfbQ0pxqoYttkr/pn398b/6ZNKVpae2Dl1ny3ve9ZTITYBpRSlWQXiJ9RdqlxmXA7DWSxjBbYScDMFNpnYpIFAA/RUMzaQWvvffvkOl4Bq/+G5Q/rG1keClCpWtQFN0Np2ybdR0kbRFC3JiSgMthwDWwe+M6VCIBWVcN0bQUUpZqF99PQmVT8EcTULQTid0iwtUWpplIWiYRmMg1u3vtKjJ3bsPZvIWiDUPEQhDHI2xlXBTZsw+REZHndqBowSGUVJ20cE02E2FrTsMXLguDj927i/C6dZBsQECi1gFORHLRMLgdyZcyAsZS7QgvOoKSypO2XJuIpFsaHy5NRbb9BzJE4FRVQqbTgbqkGVKkicCFEC6k4DWP4+oUV2Lsz014I20w/WvliWOiP8qL9JEGUKyggkCmUkEGuma869CcSuMDE5uoiJSdHKgQkCES0/hdfMzZcz+vsh/eAYkeDSoHBiBLSzR4QBCmWjgGUJheBOUz1YJUGToEAl76I7xkG5yIJmlkr3361Dx5QpFTIBROf18fOqNRxMMBKEaJwHdyDR4/G0pnAGq2UENEQP40zw6/sAQ72WujNqX625K8TSbxKZlCfPFCaK9RjwzCKCxEoqg38LQpN9xPttkvY45pCJUnge/ZLC6OpPHZ8+BSYM+J5EJ5GQ6m55NXOKAXKg+b577JJAiOSbL+3wkEpraUiuPgStk8bO4f0nsnqA8HnRC+D7s491tgWlHm2PoKS4pdPKgNtpmgm5lQHuU00E1ZHC0pxoqQxC+a/49UR2rsdDBHEIrHoX62YxNlcaC4SGfUk/UxW2G/leVr7fIr9/UNz+TevXqHI7eyPG8+U+GuxKv32OVjRtB3hqzfAVEfh8LcpKp0GTYs2m6XjyTdF3xvvOZV6Ox5TWB1NqIPFH1c3tpqG3c//y46RjrIGUhDMjv0YDhc24TY/NX8e9VvA+9pAmbKbZw5BzHTTIwBR8/gDatO229aDCZyXTT3d45EvnwNVVMzTqImKwOvX7gd17Y9RAMR5IHnXrVCT2YjzPWt1x/eo/fTU1yv60RvOqFtIk6UGlmH+iV79Gik4JNZOPPg0b+vZi6v1Bz+XTQagIE8wC6z18x3/nQY/wBcyP4NJKpcjwAAAABJRU5ErkJggg==", HW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM5SURBVHgBrVbPS1RRFP7umzfWqOhARQ4VWVakgbUoKyeohRC4qT8gs1q2aZJ+0MpxGYG0aJkp/gFhGyEQLNCyVqUWbkJJhMDGGWt68/vdzrnvXp1yNIc8cObec96733fOufedO8AGIqUMknaTjpLOylWJa1+EtB7lCi/SAJuV/vWIRAnwWzRESYNs55PvkF0eUaN0f6p3LP8e+AKNqKhtg1192ixNkPYIIR6vS8Dl0ODIj48hHeqDzC4Q4E4IuxaWFVBLXPcXZMGBm5mHJM9i6AkagscMTJRIeoxhlYgc6UcP4dzoJEA//JWHYFfUwvYJWCKllOe2vwr+qkbY2/fjwXgHBj/3rhDw3hjDNjUvBs8960NF83EiyEEIVi9Xk64sGi0fcCB4FM+/9Cnf1aYuHroJc4gymTMZcGmChekpZInArtsNK8XRpr2oQSNSRJAmMm+ufMLTjHSwq7IOgzO9+Lj4Fnr/+lWJdPTX2Eh1dqiUfARlOQ6BOApIKPCMRyJZjS+lfBny+WwbwhKKRMsFPuacwWW2Cm/GgPmvalOseJwycLyIpQckKEr8DS69rDJuGsnCMhEAk7EJkwVLhPEuqVMzPEyRU/RUcGspBkEZMDiDwjWaJnX0mNaEDhE4+JFb8o4MbdT4t5eG4DxX5ITaMKq/fg5kMhCxGDkD+qCZbS0lEonsEgpunvZHcNEx+X3CPKy39YZQeeYJXEAYklyOokx6BJy74uCjVEQmee6iIPOerRcn88t/EKw+EyU+bQKgT7g44LKE859Ts5pabJWEqvaZaWKFwBcOYyuEK3CwpsmYH5jgNc+s9nZshXAFw6GLxnzBBKr7Wa3nIFrD5ZZ4jdRV7kXzjrPGHLLoaHGbfcWW7+59RWC0HFEHin66Tz41roHiXnSdNMEZWJqkPHRvuHL4NhpqVNtWdwNPFAEzrTju3IMwmch/Z6LekR54x5Eu4+7RmGsunCi8zgp8moJbTW09v+C1a3jfiSyKWs23t2B6202q+5li8KgxSl2ZEU2ivnCZeg84I9Q+ZiCZTKVZAwROAZVtEIEWs7TklblO2urSH5Cbl1H5H/8uIhogXgQ4q318PQY3wvgNZuTzrwt/WuEAAAAASUVORK5CYII=", PW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAStSURBVHgBpVZrTFtVHP+d2xbKS1oYgoxpCUgyFxj4GgwWGZrg2FwW9Zuw4GNqfA2mfiEmK/uyxUh8LGY+s6ofzOQTfhqYSJcJ1Bm3FRyvbdKtwHiuZaW0pb3neM7tvTxGWWb2T/859557zu/3f53/KXAHYYyZuB7m2sl1hC2LR51r4GrB/xWxSQW4Wzm5HhGJAX6QD1auJvF+cboH3ePtyji/OKesyUrahHzTFmzPrkZxRpm21cu1mRDy2boEIhwquAL48+AXmFgYhdmYgZQ4ExL0icq6QGQBwYgf4/PXxS4cKfseeZxQFSsnaV5DoFqusLddsTHbQAvZnP4oDJI+uup2X1lUg5EARuYGsSe3FvsfOaR9bdQ8IVrM+XBBhCUw3Qp/KJn64wvIpblzGPD9henQBFllDlsySiUiGLrpxPN5r2okIlwlnMSlEZzkQ73T6WS/2p7Bu6+XIiEpE4gvIjS+FFM0lZ33dJErvl42HrhGlpxnUSZGGTfKxz0ZQsuOVmyN5sXOCXYS1foRMXOppBDHBocxs6MQ7+w3Y9dTieCLwCQTqKEQclwpG5PTcHm+jzqmO6SJwChRXBA/Clz19KMovVQhUcUsCBr4w6dy9x8I7NsLHnE4MjJps8ykJ55OxHv1ZuQ8oF+OvWRmsmErkQ3bcINtoudvnkUPJxtfcGFqfkwh+qT8F82LZkHQyR8qQx81gX7zFfTcYl18PIjZjOOBEH4IheS6epP0xku8ioxS1GItGVIKjRielOS4Cno9nAbHtJ12TZ7WFWWUkrcKrdEwiVMpkhvc9xxIdxd0nEASew0GwGiEm+Md9QdwNk3G4YMZ8ovPJutwezmxIChMbFFXjJChBjPIJXlZm8VHlyBQMhV8rBiS280JoBAsVaWO43HStlCYfehfIGU1yTjSuAEP5ejVJFOFRDxSnmyZv8qShSXktysQS8FVSp3EONqyrAypcoSwcARjNwKUsbCklepKEQXBSwJEil+CEQQurhbcl8oH95pNo5TizVt+9s8GwHYim1RuS5QQS6QURAwVCMXtho9slLO573zWK6kE0JWXrzach+7YQpBVLM6j+EAKcZ62gIOvWsMIB014gQVNx+FKOsF+8maxpoHPadvEKS1PF4UHZ7hWSjU1kL/9Wpk9sxjGyz4/KShNoPajDxJLjkGLogIqJ1SzSFwVhkJ6XPCcI3/OtrARXz9RDjZl5MCWJs2GNpFk0TVFJcG9dw97u+M39GUwfNmciZqdScugxioaMe6WhoNU7pvrlexTbXD7Ly+njEVznmnciB+rerTZXF72xMtJ7MKLq4c+ICUWB7O9kkbMplSEjbsEMK6F9NQ+00n6vB9T3i50sVLA1OZnffw7bcq2shdZoDY72XuKd8hUuOQ05pj9HU5Plzzsc+pxJ1Gtr81vQF1BjGankigtQzx3uFvR0ve+UrZr63Y1sGZ97cONqOOqyup2vYLEygdx6eDfW/2w/v0aJoOj63II4KL0MtTlNypNThVxq1m1l1hXZoNKolyZvbMOdE+1K4STgeg5SdKnKoDb769eCRzzylzHMuXSt7G7l052D/8uGlQAzwrAEXXOqpb5uvIfgXa7QhN9cSIAAAAASUVORK5CYII=", VW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPaSURBVHgBpVZdTFRHFP5m2RWhlEVqoSXBUlNtWpRKlZpIG+xTa1NB+0b7Yh/689Ri0sYn4xpftH/pQ02btglo1MRojLyoMSqgYGJWogJu/GfZRSCyyLqs/O3eHc+ZnVkv7mJQT3J25p57zvfNOWfmzgJPESllAek20hbSXvlYRrWtgbQMzyocpAHmKo2zEYkM4D/S4CEt4Oe2zgE0t97BWRrDY9PKp6zkZVQsfQV1axejZmWJCQ2TbhdC/DkrAZdDgyvgnY2d6BuMoqgwFwvys5GX41J+0fEYHk5Mo/duBJKej/y2ThFq8RDJ9jQCvXLFvuNfL/462IPVy4vhdGYpNyHYB6kxGSwxPhlH960QvvviXWz9tsrAbTaZCFNzGi5xWXb858Xfh3y0ooUaTWgv8WQtzURpp+8efqhfhq3fVJlyVRKJ3xA00rDpyo0RrPrqEJYveRV5ufOSBBpYJvPQc2mjkxyPsegkrt4ewal/ak1fWongY6FX38uWt2oPoG8oigoioJdJGGFgH4OnZyLV2HVzGDXvv6ZItCxw0s8G01QGBxy4H5nG/GznjAzsTZO21RuSqVhcxbZ1DiksnUUDE9TxrLmtLxlOoMPhKRS6hcri7TfysenzJQQwjZ7b5yCyC1BZVknvHNh9+BqCalFIbmGyMWlzq98Q1LBlBc+6bo6oFbBOxRIIEUl0Iobc+U58+elirK2aB3/OYdxyNaHqA0vZFrqzabvGle/ElJXK8eylQZNiGSOqA+UfiM6oRiyeQCQaU9vw4WgEe/84gfq8Snxf9An2/X4akeB1Ao1jjM4E+6YKSFmbA8kETjO72r8Tjv4gsnSdU1yvV+NM90u4cNeH8lA7xgMxeN2rMdy/CicHdgN3OlLdYLXox4qX0qxe2ZnAz0zId9MQxJPyIBSA98b/+KjiOEJDeRgpSWD9ihZc9AElExHkIF0cixaZaThFkFVdDenrSScYDiC/2wGnayn1UKC4GJgMTiLY74V/aBDvZCAQ5cvM9DKfAw9NtiXOt8PaWJdeojmKvUTOo80Qaz5k82Ym4CaP8lN8Yy3E+Q61l56HgFudKC2F6+JlY37TQXudvxut/JT185bUSuTcsWfEuPbsN6FN/C1y6IevScNiTTUcmuRZRX2rftoClJdz8upumOmQvP6UWL/uklZRoUxolU9Rfs++1i+77DdcQ+ZVUMNTLj1d0lr5XhpRwqYKeMN6mehot4N77JiZrkxm55tNnXBJTcfxY3QSuyEDgWSAm84M75J1n4HLqiXjlTlbJnzpN8m5S4t8gX8XDRpg1AbYq20evc1nlUfkgYmDABtHTwAAAABJRU5ErkJggg==", FW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANzSURBVHgBpVZNbExRFP7ue29mOhgzaIkWbVmIRkJXrZ+FRLBkLxZdsTMW1qaJWBEWViw0YUFiQdhoSGtBiMQ/jQTT0proj/4wM52/e51z332dv7Y6cZIz577zzvm+c87tu7fAIqKUipCeIe0jjauiTBpflLQFtQonGYClyrWFiMQ84CfJxEgj/PzsSwYP3qe1nUlLHbNhtY22Rj8ObQ+ic0vAS50i7RZCXFqQgMdhwDXg5Ue/MTyZR33IRiRoY1nA0nGpjEQyK/FtIs9JuNpVT4Q+DyZGJN1VBKZyzX6xdwY9T5Jo3+SHz7FNZEWzyv1JZQv49COHo7uW4dTBld7bU14nwps5mVc8Fga//jSFtiY/vbUMsFFRTqAgdQdCSbz9nkHX3uUeCY+rnUgGLRPOo4kMJLLy0sM/WBv2IZ235nSWbU5g1qhe54X2z5qYdWE/OJdHa/bvmu7AVB/nhz3nfmJkGtjWGKDiLV21EOXVK4XKNkgk+SUGRjLoaHVw68QaL2CVQz9HeDU4lsGORon2jQ7WhBR8dunYVfmOKbM2+6CUQIGmtWWVBVnIYYiwmhv0X1eUO+ijxb7p6Wmk02k4jgPbtrWyvEsIrKDY1tVKd6OUaz+PA+NJoGOT0j4pJQqFAvL5PILBIMLhMKf38xx28opfWDQWy7LMKNyqb74E3idQ5mP7lQheDKFMmJjzc7mc52rhDnTW6OjoHAGrEFXfIO5/oFFQ9OHtLpEkY4kiudcFS0NDg7ZWKXup9eRXsrixAdqxdaHiLiez1R1U5jPBIC945vNVfaFf4N4H139gq0Jns+u//UbgbK/QXVQK76ORKccQtPj9fmQymargE7uV3uRK2d2i0N5UHNECBK959Zh038RsAOcfZCmBMiwLtYvQ34KUFk4fqkMopJ13mYDPjDPN9T6MpRw8j0tzMoja8JX70TVFLDCWkTtUsOBzo5+fovuD/NkAc1oTg864cmyF5+gpPYu6SKc6N/uIpG6umtqqV5QbQNt6PX99N/BCEzCT5+AuTjKJOSn/yaRjpM7hXCPdBrPqwonBPVnxMVHA8RspDE/JYpgQRUJzDnW02rrrzlanFDzmPcx3ZUYNiXtlxvPo/ZjDQEIaMiBUJwjQxsE2XynwvFfmAl3rS79HLV361H/8dxE1AJMlgHHji5FGFsP4C3XlGTkG6VvXAAAAAElFTkSuQmCC", UW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP4SURBVHgBpVZdbFRFFP5m7l1tXLCFQDHRpDUxkLa0xthanopGQE20GkV80xoNvqCWGH1R4kIx0QdIg0XxxWLiz4MxphUTtxpaanisbokgxsRu+yAYC7tduv9753hm7p12y+5qiSc5nb0z53zfnDPnzBT4FyGiBta3WcdZZ2hZEsFcP2szblS0UwCwWhmuRSSqgL/KQ4S1QX8XJs8gPzqKIo+0sGBsnKYmOB13o663F6Ge7dY1yXpQCDFYk0CnIwA3gOn33oWam4PT2Aixbh1kOMweAmpxEcTqxePaB/VffgW3o8PCRJjkYAVBsHPDnj48gNyHxxHqug8yFDJG14dKgapMBqXzv+DmF/ci/NYBu7zfRiJsznn4WadFg+c/OoGbeEc+MEFWZjIgoGAUyP80hbp9LyP85gGbrnuYJG4Jhnno885NI9ndhVB7O9zwGgMrbahrwpC79wCJBNTI1wbUEnn810tdQ/HCedwa/d6eywQTPOAGu+/TM6k9u+Hw6LKzzKQhyKTcxBH64ARESwu8zz4FOC16zYr2getA8ZB9Z8AS3K/LXG/wCXuomJ01OxZXr0BokGzGjLKtzYDT1BTkvZ0QaX9+yYZVXk0YX29y0sfypV/PPW4Ivhk1Bno3Yn4ectdDDLwVgssRirebThsSFf0O7tBxuNExuB8PQ95+BxOmgSvzxl8GWIFsR9CVdG3ng5SqC1GaNcfqfXLSb6FcjkqDg6T+ukzF1/aT+u0iUSZD3liUSCmi1ALlt7ZQNvDVGKnuTtuAM5rQNJSam11RjnqnUArq21Nw+vrgvfE6EJuGGhpC6fAhjqYVNP83Ss89y+dBS75aKZm0ETTDUqW23EWLzJ4NIsizMlCwmCI1MU6FbV1Uev8YqV8vUPGF56lw20Zjlw98tK/G0FhWdARxTSXr6yuq3eOeKLa3wvvic6izZ+EOHgNd+hNiYyPcI0dBqC5OU7P9mVwicLi0qjnIfa9APvkU5N6XILq3Qba2gWb+4AUH8tHeCnvTO8vXRkwTmJoKPVbFeNMmyIcf0Z0IsWED1NEjUGNRiM4uYO1a4PKlCh9aiTUidDPwj4T+yu7aAfw46feCVr41xdPPQK5fD/XDGNTp0z7x5s1wR06h2LrFkFtg3WjEPrdc/N0S3OkvBnd/6cyEKbXyg66lBT7I8m9bpt50bOmNWA7Lf2BMPxQGDlFmFQTlaiuoYKvOx2pemTv/+SNLYqPI3Ti4ln5UE16IWAsvFqMsp+F6olyZ6rX8zh3kcWrLJLKiUKqQaHb9svkdzheXx3cLTZ8DzcV9o/oGyJ4eOFwt8j+ezFqR6DM5SauXcfof/130BwCJMsCZYC4SlHlN+QcP3UEPtLQqEQAAAABJRU5ErkJggg==", YW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMbSURBVHgBrVbPTxNBFP52261iwZYgmmDCDyMcLBgETRRMRC8mnPwDIEpijDdbE/VIOaqJ4WxEiP4BoiYaT2CixpMQRcLBWKRe0BAKUkvo7o7vTWfaTWhJQV7z9s3OvPd9b97MzhTYQoQQYdJB0gnShCjIsuqLkjZiu8JBCqBcGS1FZBQBv0EmThrmd/v9O2y8fiWtWFmRPmZ9PXytbQj09sLfdVaHpkiHDMMYLknA5VDgEnB9+AFEMgmzthZGdRjmvqAMcdNrEOk03IUfFAMEnzyFL9KmYeJEMrSJQGUu2dfv38XGo4fwd56EaVkwCIWCINFkiICQT8D9m4E9N4vA5QHsvXVHw8X0TAxdczJTXBYGzz4egdXaCpMdCMUwvNkYCj7Hx22XHLLTU7CuXdckXK4TRDKvCUbJXHFmviB94RysSAS+YGWOoJBFgUm187Ogd+fPKs1kDhXjL/S6TBLBeUNln+Cetc52mMkF+COUPQFoAnhmIES+qPQzVAtwaMD+OgN0d2Pfs5faqdpPj0vcys4nYHd0wEd1N2oOQAQsuFBJCxSy15BCt3Ilc2wbdnMzHFfASiRgNTXxcJRnMEGNnhXagplMBn6/Hz6fT2p+J3A51EJrq0qbt67rwnEc2ERUUVGBUCgky8RVaOcWD5imKVUD5fP1AGnrHfcmwvHZbFZ3NXKJ5AfFGfCgV4qBlBIG1+qJazS9Dl67E9EEXmGCedlQpdkN4XVUksoTBAIB7JZ4CKa59Za0Z1UsYfTbPRg+Y8czES6ri4HIbVTRj+Q5E/CZMVhX1YCU+xuflz7mtvx2OUTuIzy05zDqKht07zh9sAafG5P81t8Sk17l7x0Pvsg94qdGdPgYn0V6Fw2Qpo7XnEF/cwz5Q2Yb2bP0UeyR/cd47vJu4D5JwEy6o6/lpiQR5ZAoH/Zl8H6KVTKkMDddOHEyfOng++os4p+uYjHzs+RyMLCc9dEY2dNe8Lh+KXZlRhWJ/MJ50T/8eiMJFzNJ6RP0hyRg18GLXuCiV2aJzOSlPybKlwnxH/8uogpg2QOYUH1x0vBWGP8AY8bxXnTW11sAAAAASUVORK5CYII=", XW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPeSURBVHgBpVZLaFRXGP7OuTMmwYnM1GRM0iYdatVFSxNNabtQJ5A+aKGNbSlduGmp3bahULrSRC100ULFjWh8rcSF77duNKBuwoCgCEIkL3xgMBnDzNzJzL33+P/nnjvJ6IxE/eFnzjn3/N/3v845A7xAlFJR0j7Sy6Qjak6mzVovaQIvK2xkABYqB6oRiQrgv9NPP2mU5861qyicP4fs2vVqYKJe7D81gkRLPT5YuRQ9Xe8g2dkSmKZJtwohdlQl4HQYcNydmEYMGS/8w3dSNjbC+fMvdTYTF+ev30cmV0TWLmDk3gwU7T3235ea0Eg/kWwNJrKC59i+Zwj/7BuCCIdFeNUqhGIxWOEQXA/IzboQUiKyuJZAG7GiLYavfjujbQICrk0ZgcmfDz4whF1HbmN52xuwCMjK5mDZNqSrUCTN5j0iIc27eqwoCe+/24Cdh29pWyN9QU2CCDg10VvDU862PSk0NURQLCpIIpB5AmcC5cFxKQICzRK4JjHKRG/GI2DbwdR9mPod0ASG6SeebPjjQojihyAtOEQghJK5HIRNSvkpOgzmGO+N2q6eW1YIbLt9IBVE0cVtHmJcnjHz2MOMDmpqpoBC0SMiaHAtrksECjaBqbm2CAqI2aKjbQdTDzSW6a5eJujh0aPHGfz4WUJ7X7MojPaVMd8+l/ObzXWw/K0IvvikCeWd5xPZFJk9uxQeRTo5lQk+J5mgg0efL8up7q/rEbZCinMvZBa4M0mWtk80Po7uD5ep7k/rSo7rJicGQbnwPAVP1VGgVChMCfM1wd/09nxnB+TEBCzhV750QCwLOlcaUJS7zup5+pdBPM4kDdzWVtSlbuhtofnh6pzjGdEeLUzEPA2ECUY5lOLuvV6BWtHS6ZH+JkpP3bff6FYubPvbcT/6WFYD5wgUpcmliERNjaj1edIlgkvpqDwxOEatKXUoa9vj2Liu1SsBNLfI05P18uy1e6gq5CBVAz3JBL73V24wwSBpV0NsMQ5fGvMDFL6jG9c1ltnfHE7j0MWx6jHocir8suG9YPEkI+nbL9nZjOSaprnNryhvN0c0lpETdFgFX7NXeLb519WvBc62R//tDiYHCXs0KNrPpOnkmmafxLTdwsn89LBt+wp9beu3gQe6TZmJjgMv/L9l02ptMjye9lsdFVq3CviWTR3BIj88oyUCQ7KDLyca9jHJ9EyeTt9MKYbn7h8jXLfNBDxXv/JX7ZmDJvix4PD6Yktqo1hSK9XxUwA9mSIeF9EnYV3EaGQR1hNgT7JtPnDFJ7Ny0P6jf1AtXC6r1/h30WsApucBjpi1fpPWqvIUA6pgRracnJsAAAAASUVORK5CYII=", QW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOfSURBVHgBpVZLaBNRFD1vMkma1DTRaCot1opaFD9UFL8ggqAbF6ILFeyi4EoQGxdum25dCaKgCBURdenCjaK0G0VdKIioqNjaarXR2qSNnUwmmfHelzdx2qaS6iU373vPuZ+89wL8RRzHiZF2k/aRDjh/ZFzNdZG2Yr7CRgqgVumdi0hUAT9NTYo0xmNz6CmM9w9hDj+Dk5+Qe7RoMwKJtQit3otgyzbXNEPaI4Q4PycBp0OBE+BT5B5fRnHyC3zhxdBCUWj+sLSwC1NwSIuZYbZB/NAl+BNrXJgUkfTMIlCeS/aJRxcw9fwGAk3t0Hy63CTEzEhJqbUtA1b6HULtR9Cw65S7nHQjEW7OqXnBaZlk8Be3EGhcA41QhXA8BKJsQeg8y94zkU1qfn2F+s0diJRJOF2biGRQU4ycmpiVfktpuQh/wxJopTypUW5tE6KYh6C+bIt5tZ6v7As0JKStOfQMqn690iXl/QAP0lf2ApRz9t4nvWeHRcVxlRwZCcegPjKKEmlh9A18zVsRP3rd3bxQp6+D3Cv8HIK9eAP0xo1AfRzQ/dOq5FQGDmYJT5WK0CKtsEo2TMIKLmrhlS6OoI86e7LZLAzDgK7r8Pl8Ul0xCzZuPxiCZTn4OmZgWSKMY/taEAxo7g8Etm2jVCqhWCwiFAohGo3yUj/vaOceL2iaJpWKI41cuXn/E3ZvWoJwnYbt6+Nob4vh8p0PswJhO7a3LMudatVVQaQHvDgtckXyy7Aw8n0Kdx+NIJuzcPLwKiyKBKY5IWTNxEznWjXvBm/rlUjYj7FsAT9IA34N0Xq/7FeLYKY9RzAomch7r0deSY/nsX5lFGeOteHbzzyWxusq+a8mXEclmUqRc7kcTNOs1MDriWGW0Ht3EB+/5NDSGCIADZ0HViAU/PNDKB86RxY6GAwiEonwdD8TpKjTPTL5Cb2vz0H4RNU01SKOzWqjc91ZNC1YzlNJjoXvjO6myHJk7O94OfakfC3Ml8MpH7jGumYXnOUOXTeC741+HnW0JdU98w/eqyPdveWqO3XNexd1kmY2xnegY3VSnX/ULmrvcbJd2bCOu/Jt4I4kYCZ34njbGUni1EKi9vBeBu8gWyU9CnPWg5NC+WbFx4nXSD0/gVHj85zlYGAZ9aoktdu94Cl3UO3J7FIk8oRz0R+n70nCUWNY7qnXoxJwZ2K/F7jqkzmHZ/LRv+bULn3Of/y76FIA4x7AATWXIo39DeM320UwxkzwefkAAAAASUVORK5CYII=", GW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMJSURBVHgBrVbNTxNBFP/N7ra0xYSPhCvBcyHB4ElMiB656H+gXow368F4tD0aE8PZqBD9A/xK8AgmlCskouEGwhXsUttSuh/je7Mz29XaphUfvJ3Z2Xm/3/vanQI9REo5SvqYdI10T7alotcKpFMYVNhIA/Qry92IxF/A79NQJB3le7+8gdanVTXKkxO1x5qchD09g/TiIpwrV42pS1oSQix1JeB0aHAF2Fx6Bnl4CGtiAmJsFFZuWJmE9RpkvY7w4DvZAMOv38DOzxiYIpGUOgi054q9+fQJWi+ew5m7DCuVgiAUMoJCUyYSUl2BsHEKf/cb0rfuIPPwkYF7YCIRJuc0bHFaGNx79RKp6WlYvIFQhEh6IzR8xMfzkDZ421tI3b1nSDhdl4hk3xAs03A72PmC+vUFpPJ52MMXIoK2F20mPY+joPvgZ5Ui2UX23QdTl3UiuCa093u8UpubhXV4ACdP3hOAIUAiAinjpNKf0DMgoAf+1x1gfh65tx/NpjGHLjd5FmxuAATOoFalAiubaXtvUAT/i5hFEeoN1llL2frlMnzC0lEUmOCG6prVVdg02uz5j2PqmrFEi4k2QzxGrMIQu66K2uZ0EZYmWGCCWbWV8h+n5OwM4vgYyGTINSvCbIeQzJOai9MmhO8p+5B1s2yeTjGBeqFA/S6iBEQknhepbSfaSPwGrDQMIxJtZ9E10C8kE3CRlTtHR0dqxSZA7nkhOl7ynsIwrEEQqHGCXk4oQmBfTSgVg4J2E8dxzNSNCdLpNP6XJAi2meCzIZDJ4p1DhoaGzPQ914CLXOG7EyoO5/Bf0sXOhVxwkvHxcbN8kVpX8Hdjne9yuVxcrEGiSdqMjIz4enkl+S2agv7YNRoNNJvNgaIw4JwadhKJjx3XgIH2aSiZKDL0gvUTSXIP22hwlpLG7DhwijTwoaNqUavVVF67RcLA3DHZbDbZOQxeRA+vCvpQV+J5Hh1edVmtVqXrukqpGdQaP/vjh0AB/Yg+9Fdk/7Imz/HroqABKgnAPb1W1G3eVX4BYBA6iXtqfawAAAAASUVORK5CYII=", jW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP0SURBVHgBpVZfaFtVGP/dc2+Spm2WpDF1COtSIxt1grU+tRbmmzj8M0XBiQjDV9Eqyh7NFMRO6cRXlW71oeiTTlBUtAxc99hN3VbB2fTPqmPdknRpbpJ77zk738m5adolpWMffJx/3/f7fef7zrnnAluIECIm9T2pU1LnxLrk9NyI1BTuVMhJA2xXxlsRGU3A35RNRmqMxueuncX08k+qLVYLymZnxy48ENuHofueQH9y0HfNSz1qGManLQkoHRpcAU7Ofob/S0uItyURCcYQttqVne2WUHbXsFxcIC+8P/gl0pJQS0aSHL2NQEeu2E9eHMO3l8fRlxhAgFk1q817FTUtuzbmCrN4qvcVvPrg2/7qW/5ODD/nspmhtExcGsOpf0+qiAxGGALSeGM4oh6UJjLw943zeD79mk9C6XpE+mWZdqHUxC4XLmLi0nEk2u9FRdiocBtVUZb9cn2slPpyjtaqoLUSku07MTE7hvMytbp+4yomHf0cDT48+wZsr4iOtogMiqMr1K3CvunmYTIG0zBR9mw5YyAaSKDg3ADnHFGrC4IL/JO7gN7oXrw+8IGfqrhMMA5S78pqFns6+sGZK436ZHQ2PDhwhYMQC6tMEDmNI1ZMgl/HQGw/HF6Byx2U3CJ2h/vgOFXkStcRb08Q7AgRPEu9ThHHcPcBWJYF0zSV1k+CrAHlmy0vA2tFiD1712ugW9qJ53lwXRfMsXzX/VSDfuqpBZkGUh+wfmCks3V8DCIUApuehvnF58B8FpuF/MjfcRx/KsV0QVQEtNgoRKIi/+ZriLBMU2kNIp8Hj8VgTk7W131wXxuCS7FG9sZ2Q2QrK0AwAKNYBAIWjPl5CMtquoPN/kSQVR2dmmbiHXoZomc3zK8mYGSleTQKPjyMVmKtk+ctTZAKBoOoVCpNHUQ8Dj44pE4Sm5mB98KLEDt2bIfgHPVOS308JMH596fAqKBXliDSaQjblohm7Uuxcg38niSMnh6wX36W90QW9Op/4L1pYHWVUMFlkIHFRbS9dAiIRIjgO7poVOQcjcqjH4FN/Qrs6oFhl2BQURNJBS7aQvJWklEZorMTbGkR/P40HT8YlSq43JEoFMBTKYSPfeLvoNf/Fk3RLsT0GXjPPaMK0+z7tpVwreZvp2Hse4imTsiaHvZP0WEqiDH0GNi7RyBwZ+Lbs3eO+ODqbdhoVHv+lHgfjwqvu0twrWILpXWy9Y6NNr5wI80jESJTN/nrD+E9+vBtRLxBFfDBpwU/83sjeKYRs9mTSezq863Gsi748Qfgwp8QCws1B3kPMCTvwZMHQGnV0vTJbLUTevRPiO3LlLiLv4sRDZBrAJzTcxl9zFvKLcNhrhfcP2XFAAAAAElFTkSuQmCC", KW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN0SURBVHgBpVZLa1NBFP7uzY1Rm2isb0G9O/GJIhRE0LgTF7YLf4AbsQvBuHElpAUXasUHgggiCgqC4iIiPtEbhWJ1YdpSW/HV9GFb22LfafO4uZ4zmYm39mFtTziZc+fOfN+Z78xkAkxjjuMEySPkFnmz88f6ZF+Y3MT/Gk+SADO1m1MRaZOAH6emgjzIzwNvqvHr4WPR2gMDcKhv/vp1KNq2BcUHD2Dxnt1qaj95paZpl6YkYDkkuABsP3sRqZY2+FYuhxEMwuMvEuPs4RHyYYy2tPIkbLx/GwuJUFoFkVROIJCZC/a20+fQefU6FpXshO71QqO0NR7pyBlOPnQotpNJjDQ0YeWRw1h76qSCO6FWoinNqYmzLAz+89oN+Ckj3ZWFpnJxE4hPPh76UItVx44qEpZrB5EkFMFNag4n6xtQXxKCf+tmeIUcGnSSgAbyGEniuBeCnOzJDA5hpPETNj2PYlG+LjGat0+T2TdzT3zDDmRIc/+2zZS9TiB50PE7IQ/PhIolp+WJhilBP4EzibQlBn2VcTTa04vgmUp4dB2+QAC6RxeZaxM32jgqkT8FdjYD/wgV384hlUrB5/PxyzATlHKUnufFgl0lMAwDHo9HeGEnKIlcrZS20OZyORi2jWw2i7GxMUWwl+u4nSN+oVP27ApI2ZsuCx3JdtEXbXsgWvZvQ19Q01ONO99vFRLh+ZlMRk01mUAcKM6AX46TgEDuJe7iKwEVGQGk7TS6RjsLBN1j3bjSdAG9qZ68nNJdyZmGWwbV/ki2Yen85Xjf+xZW1wuUrT2Ei41noWs6lswrFuOedjzC4/ZHSOfS4nkoOwi/JzBh9ZxyQgRSGrZ3vTUos/bjctN5kfG1z1dQ1xfHMt8KvCJCztjqeon2ZCuyThaG5sWzjicFUK6jtH7ephYFoWE6+lx9Jmoa/IjVC9ag2LcUMzUlm02F5gIHaCeSxZjqNRNw5auqqgo6zsbUbiovL1cEUfWbLywUCqmTP2s3TdP9M24qZoufLMuaM0FdXZ2t7gj30kx5SzmRSGTW4DzXdeOZ+Eu/sHo7GxIXOFsYUxSpQo2Ix+NCz38Bc91YWpdVuDEnuzKZPQJ5wmOxGKLRKGpra5FIJMSYIN1uBIzS0lLRSpv0ypxqJVyTW87MzXLm8O8iLAH6XIDNso8lDU6H8RtRF+C1Tu0TbgAAAABJRU5ErkJggg==", ZW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL1SURBVHgBrVZLTxNRFP7udFpbY6CRABpcsNBGFz5WCnGhiQtXRn+AJGqMG00s7g3tH0ATdc3DpRuNKxMTdAEYEhPc0IURiJAYH6Gd4TFTOp3rObdzpy2FUsGvOb3v75tz7pl7B2gCKWWSbIhsgmxBVpEP+tJkvfhX8KKAoFWM7CQktiF/SEWGLMlt13XhOI4qfd9Xc0zTRCwWQyKRQDwe10sLZFkhxNMdBTgcATlmf0+j2++FLEtFaBiGMgYL0VyUSiXV7jRtRLtOapoMiWR1w9jmyTE2N4zsp3swIkI9YTQarRPhOhuPsScrr+7CnnwWCvDe1AkE8VPk47lhvF0YQ+rw6ZBwN4t1pbDx+SVWqyJDek+0Bxya5LyV88dzT9BxsBtF6cAQFQJyucE0eSQSgVF2EGvrwtrUCxS/zyDYvxElECjd4sbj6TvMCWEIFP0NVWpCtWGiPidCsbILw4wiQmvXpp7r4cuc5uzBDW59+TONX+4yWGDVy5MHLgcPW5IA20GwQNEiAQFveQabSzN6KM0C17k2+eOdyikWsEorcMsbdaRby7q65wDFPIWUQkLr3a/v9ZRLJv2d49o3a06Rk8/w5CZsElEEormIgrMClD1eSiICpeXQg14z2BD8dJYqb0UQZk+WKEByx7DUwffCpWyyuBoKGNVAYt8Q/BMqCCFYYJErh6LttTP3wh4WkfYe3VsIBc529P0PJxTMzlO6OssCH7l28ejValK2EPYGyGpx4PgV3fuGBdTpd6ajn7zox37ASWG09cA8dl53vaasEnzMfuDWQGqQc3DPDrAduha+yaPEvaiz6DZZgb0YODFYnd2ikspk+otfuI9Ipzq21d3AFSXASrrjZuqREuFFu70HPFYxIEbk8b4HeigbcDZcOBlUTlbM23NI+kcgpGg45GoF+F5IWLnauDN5Bk2eKh1c6gp0a8n19XVp27YsFArKLMtSfTy25UMgjVYQXPqjsnVMyH18XaQDgnwN4ULQx9djshnHX3laBNZMf+coAAAAAElFTkSuQmCC", JW = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOJSURBVHgBpVZLa1NBFP7m5ubepFZTH60WX7WILxAUFB8oKoLiSl0IggvxB4hx58507UJ/gGDBjUsfC0HEx0LRVcUXqEgrihSLzcOkSZrbezxn7kyTJo1GPORk5s7M+b45jztzgT8IEfWwXmZ9zDpKdcmasTTrAP5VxMgAdCo32hGpecAvcJNh7ZHnSqWCcrms2zAM9RrXdeF5HpLJJBKJhDXNsQ4ppa61JZBwGHCMTVQxVcwDYaABHceBYtXrmCgMCUFQw1QNGFzViyXdcQuTYZKhFgKzc81+9UEBw89K2L7GQ9yNmZVNzlL0NzU9gw/fazizpwsXjyyysxetJ8rGnJsRCYuA33w+hS0rPZ51DLBRNZeAEIoxFIV4/bWKc/sWWBIJ13YmGXPMcglNz3veybWHRfSl4igHzqxWpK0pVIzqfqD0eMWsWZ7ytO2Lz1WY/N3QHpjdj8rDt+/jmJkhTpwPJxbjzatI9f4jD6YDwItFLoSR+zr5IXtRLleR8F2s6Ou1fi52+e+E9KrVKhw28XiBhJ3xdXTqoSfcfqN06E9upXqkJFSOYhLegh/TiRcs3/dlOi0Ex6UnZSiVoqvF7FykUAEnEiiyfpoAxgvA1n6gm1PUzRgLvHparL1gGYIDQrBNekEQzCEgSR63I98It0YUfpYUjm0mpLjsL91Tuj21jXB0U51A1ot9rVazQwOuSYiOo+M4mFOJTLJ/ELj7VmHtqhBnd0ahCTgcE0XgyEbSIbLgVolmQzjgNLI3tnOFsMivP/34BUyWWlc1htaKeDCmmXj3Dcyzcved0nF/P86J5GnOJ15+UVicJDwfVdi7rtVG3nwjuVkCOVsk+81yaD1hx2qFXxXClUcK/SnC1ROEbs7BQr8VvInglfSesh4UAsl+syz0DRC/oLvWcp+BN/TND2zFVJDIHXnRJMlZeZrM5VGdDk0ltRrKwdYVnx9UwisaU4TeZUvs8DqXk5LjiSfixcfJLpy+XjTHjz2DOhGKfkxw/3yKeiPD4caz6BxrbvdgHOnDCfN6onMh7YK23dwfE3B9N8iUJhAmO5A+nMQFITEn5V+Z9JpQ24itkSGD2XLhZBCdrMiWZjD+sxiVrlJtwWNcMUm+1dYsdRvBM2i/IX2RZ+1ly689lUolKhQKlMvltObzeT0mc00fAml0IubSH6bO5TH9x9dF2gBkGwBHzVjGlHlb+Q2F60gMc5OmRgAAAABJRU5ErkJggg==", _W = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALpSURBVHgBrVbNaxNBFH8zuwmtFAz2UHuw9GJBa9WjtYLehF70Il4s2ItXU/HjIjQ5ilA9ipd+4B+gCAVPVTCtx6rQetEUFERtTDaSZNtNdnzvZSbJ5qvR9MHbnfdm5veb9+btzAK0EaVUBHUWdQU1qaqS1r4o6jD8q9AkDdCpzLciEk3Ab+Irhhoh23VdKBQK/PZ9n8fYtg3hcBh6e3uhp6fHTM2gxoUQj1sSUDo0OKz/WoMBfxhUSTGglJKVhIhwLHiex/ZAOgXW6JiBiSFJ3BiyycphcWMO4u9ugLQErzAUCgVIqE1KfRRJ7uoVcB8+qBDQ3gQIdP4YfGlzDl4mF2Hk0FgFcC8NHzsO3tMntSSzZk9MBJSaSDL7qbi0+Qj6DwzAjiqAFGUADLlBDbhlWSDzebAHB8FDguLqW9D7N88Emuk6GfdXp23EBCEF7Ph5fhtA3jARrAnTZ2ERWJYNFvp2q1FcoDKnCC6T9X57DX6634AI/hTTGIFLyYO6IoBmIgp5kI7D6fATCRMFSZR8l6iV+P6Ka4oIHO83uKV8ALT+XdsWmCKR2saUCo6itLxshpy38XGaWp+dDQbHmKGodiGLJAwg2pMwwXYKRNErR0C6mjBdw7beEPhR+Fr+KnSai8rDBKmWaQkIgpupWBJQwnQZAlldBnQtAgJrZCGCLWr0hQ4GR3ZBIoeGjJmpEJzqP7MfQZRJRk+Y5joRvKHWxODFalF2kPZWQlPtyUljviACPv1O9o9jFOPQjfC6ho6AOHvOuJ5j6Qo6Zl+TNTUyQzX4XwEorfbiM+NaQOwtU0XTqBmKYuroTHV0h0xmmLx9z+Sf7wb20YOYjOPayC0mofLf6zugPmUiRnB5567pimvMhgsnBuWTFb5kNyDiHwahRMMhV0tA90Lfxw+Y94la8Bi0WVVUX+oseGupXC6nstmsymQyrI7jsI/66n4EotCJ6Et/QXUuK6qLv4uoBkjXACa1j67HSDuMvzFhACY4OuJZAAAAAElFTkSuQmCC", $W = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALSSURBVHgBrVY7bxNBEJ69u1h2hIQNUiAFlkWqYJCgoQAkU6cJEjK08AtwwaMKsaEKNHQgmgSJBirShDJEwpEQFCRAgSjslCg2fiR+5c5eZsa79vmJSfLJ45t93PftzL4OYAiklH60ebRVtJRsI6fqYmgh+F/QS4pgVCwOEhJ9yO/gI47mp3K1WoVKpcLPRqPBfSzLAo/HAz6fD7xer341j5YQQjwbKEDpUOSw9j0L0xN1cByHCQ3DYCOQEPYF27a5fCKXBTN8TtPEUSShC0afkcPjNz/hxpPPTEgjHBsb6xAhn4zaKJLSzShUny60BGhuOgRU/lrkz99vwYWpQIvwX+aZPgP2yxdukXk9JzoCSo1/I1WAR29/wcnj41DG6E3TZAIMucc0Ofcpl8GanAQbBZz1j6Dmb5EFlNItKlxf+IKzQoQGlGuNDkKeMNG5JnSbiYvANC0wsW6vHcVVWuYUwTWe1B9Z2NqussCfXQdKNQndoIntB1Epg1EocDoayaSOghCjulnylj/9ZnLK2vYOCuw1Oki7n25fYIpENgMGRYPl+sqK7hKx8O88eZvpYlMAO9VsCZkdu4eonwgLZLIgHLsZAdl6UjeFSIA3VJrSw9tC8M925MCU9ADJ1ZsoIqCO6dICRnsYHWOC/UC4TIME0uQcHffAYcEIBrWbbwlEwsfgsCDCZ7X7lQTWyJu9OOHqMmLuu6DfsmZmdNUyCfDpRxFEwgE4MIKnQFy6okvvcOkKOmY/UGkuOtUcxz4CkMqsV6911RJyp/Uquo2Wpyjmoqdd3UcnJ4i7D3T++W4ghwVISVc8xChYRDb3wbC9oNu5B5Kb9+7rpoTi7Llw4tA8WWEjvQuhQJ0vl+5Dzi1A98KRb5uY98tu8jgMGVVMXeoMvLVkqVSSxWJR5vN5tkKhwHXU1vUhEINRoC79JTk6VuUBvi5iiiDnIkypOroe/cM4/gIjS/cY17kGzAAAAABJRU5ErkJggg==", eE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANWSURBVHgBrVZLbIxRFP7uP38fM4Kppt6kUhZFpAhtpQ0LiQUJEbs2ErGQSNSwsBNTeyVWNtJHIhYssCJBdYOy0C70Eak21RdNTKfP6XT+/zrn/vd2pu2UFmfmzH2de75zvvPf/w7wG5FSBklvkDaSdsukRPRciDQfyxXepB0sVWoXAxJpnF+mJkwa5HHL8Du8HXih2vF4VNmsX7EF24O7cGjjMRTllZqtI6TVQog7iwIwHdq5cviw4y6GJvuQk52HlZlB+O2AsptKTCKWmMDAeC/vws3S+yggQC1hAqleAKAjV+j1bTV40lWLwtx9yLBsz2p+rtLTWGIK3dEOnNhWibM7r5rVKyYTYTin5hPT0tBeg2df61VEglalkNSKueHI2aA0kEDnz1acLjhvQJiuvbSvx9JbmJpgV/QzGtpvIzewDtNySmlcxqiNeWNXq1qLqbU4eG0SeYH1aOioQStRq+tXq2LS0XfzoOJ5KX7E+lCQs1NFr36E12ABQ1JFrlLgrwt0RdqwJ7cEt8ofGbMcIhinuDc48h67Mwdh+X0I+seQ4cuedS41O0QWfaRhKIUqwHXiyJc+yPhH5WtDsISXQgxwkntrpl4htCELtg/w+cYhbDtN5DriOcUgQMrEdcbgJLLgOIAVe03zCuAwAxQp0+l2WFQRwVURcQg3QpZZNLCSoaYVyotqIZBQ+12iyp1oNov5ti4IMNOvKRc6vhmynPEAGFXqDEQKGHMDV5Pn5cUgjjs6B2A2e1PXueJ6FUwGvKjw48w1SvXB+feoRXt1iiWWL+aoUGtlbjazI7MAvsBB/C8R2YWm28IUNZEeGbIqca3pANFt6ZO73DSkOtmSqnz9+H5oiKd80LjIER5VPIjiwzfHK6pYJgA7p1ptWkURX1xjZrdZFC2/N97wqKo8oI+R0aVHb+zvnVllJutS30XnSEeKt2agqszvPX5/4b+qLBuFa9WDqe4G7igARjITVWUBXCJDD+RPmSRteA/v1VKtfS64cMLw3qzoHHbcC4/Hrf5RN2k273XNneItNjn3o3irneo8bAbprsyQBlEnvLk3gZdf4mj/7qA/6qodK7OEcnh0R2aq47RXZvrEvUu/Ti5dGuU//LsIaQeRFIfdei6sH/NF5RdSrPnVytZHDAAAAABJRU5ErkJggg==", tE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANnSURBVHgBpVZdSFRBFP7m7t1NW8u1//82KntY+0OjX7B6CXypxx6UEiKCoNxAenSlp4jC18JSqvesoOhJhQqhH8NMhEI3rcAw/F3/9t47nTM7d93NH9w8y5k5c2bm+86cc++dBeYRKWWAtIq0kbRbTsuA9lWQBpGp8CYNsFCpm4tIzAJ+lboIaYDH1pvXmHr5QvVyaEitMbZsgadgN3wlJTCPHHO3DpJWCyFq5iTgdGhwBThRcweytxfG6tUQeQEYS/1qixMbhYzF4PR8pz2A/+EjeEK7XZgIkVTPINCRK/aJWzcxVXsPZmERDK8XglBoExSa2iIhVQs4Y+OwOjvgO1eOrMrrLlzYPYlwc05dK6eFweMP7sNbUACDFxCKEKnRCA2f4GPboQXxT63wXrzkknC69hNJ1CWoo+683f4ZsZPF8IZC8PhzEgTTUUwzaTt5ChrbI8N0kk5kNzxz69JEBCeEjr6bPaOF+2D09sAMUfQE4BIg5QRSJpNKP6EtwKYJ60s7cPQolj557i7KM6k5w1Y8GoVdWAgUHYCzahXg8yKRcQEBifTnQSZbqWcdy4KTvwvUwhfthhncxksqmOA0W1+tbHw7WwmP6YFheLDEZ858hkUSO03YNTlF0LYN27GxdtiLg4mpYibYx9aV2+/Q/KGPQAyVXy8RZWcRmY4QyfOkc1CKMT5pI27ZNHCU7s3Pw/vHm3g6yATqhYr+Gk3LQtxyEB914DGoFoaYNWrpSFXg6boIFdzgyJTrUAT/5CC1p+IRCOvCRaTt5wclykZuzhI9L7BYCW5Y5pqD/Jg2knG8s6vf6h8Yo3QkaiAyJJLqrePTWti8brkR3LiCg2/iFDUzQe6amHn3Z5hqrMEzPYhMkHBdLvtvkGMFe58yAX8zqtbnbIVpmmgbaElk6b8IgLVZG7EjEHK9DfTCCv5uNPGoLD+sVmVS0iS+TDRVRbWuq56/RYYelJMO7ll5GGU7w0h+ZDKInqWU9m5frqJXdwMbioCZXEdp/jVFIhdCotfwWgYvo71aqjXmjAsnQl0V213DHYh8vIC+8R9zloOB1al3hKk/lAoecQezXZkVmkS94W1/WvD29ytF2Dfeq9b4zVwFeGTNqVTgWa/MOSJTl369XLg0ykX8u6jQAAMpgN3aFyENzIfxFzDnAW502GF0AAAAAElFTkSuQmCC", rE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANRSURBVHgBpVZLTxNRFD53+gJqaReEsPBRjErim7ggMRr5ARIwxp0xGmNi3Fh3xg0Qo8FEAxqjS4jxB6jBrWAiLIgLV7pgAcoGCYGWPmaatnM93+297bQgFvyS07mPOd95zr0l2gZSyhjLIMsUy4KsYl2vJVjitFNASRM0ivGGDfGLd7WHCrZty7W1NZnqPS+T3SeVbFy5rNawVxdVop7PX0c+yI8hjPP5PKVSKSoWi+T3+ym0by9ZXV28I8gtlcjhdTai9Nra2igYDMZ4OMocUSHE8CYD8NyQgzidTlNTU5MSViC/sIhyOWVANDcroz6fj1zXpdXVVQqHwxSNRqE+xFwp1hnDxDI5N+T261fkzM3JZiaxLKsqTO6z7bI4Ts1eKBSi/MdJ6bx8IbW/g6YmlllgiZV+fKfMym8KxGJKER7iiQhgQDC5sHNKDLl5J9DRQZnlZSrOfgEf0jWuUqQtXcck82REFh8+Er5wWIDUCCAcJlfR8liU/ars8dM93S1KeyLSnvwgI2fPYaMXbY4aDJiiZh+PCOTWq2wgsjmkHxUgaVm1e8aZeFykb9+hIHMhbYwE2Poxcjx59XrOXpTHdrnAvEKcl8qeF0YfXNrABYH+Rc6cgT4SszPkQ77xciBA3ELQUpzlH0GVPFXbj4075BYL5PK0yHN5/AQ1f/qM3UW/LgjR0pIKX2g/qVAoC7w16fKmDcQQblM8jR7HTyVuc4145TsQWr828wz+qBqF8IgBDCzCErW3E62sVHZlvTIXzgtZzvGWsDo7zTCJGkzxoDeTyahOqi+yQfTIwSp5ayttfP1WaxC5ZylxxChwJBLB8jTqqarBZ8mmrtgtQtXo3sPAmDEQfXBfcmF3bcX6+Uu2XruquDTeWZyKJA+mMfPdvCWCz0eFNT8vdxIN3vXPzsjA2zcUePrM1csTzL1oPskbLEmrp4ea9h/QH9XOIPn4Dh0+JMTRY+CE0+rIFh4vcFmMYpzjgw0F9541WxXZRIknjnWcwBr3ao5rTTJmrLa0tFArk4DYdIdJmDSi13GaomM85MOGfOtQyxd55coscNGz2ax0L/XJ0plT0mUp9V9Ua9j715X5NyO49Cdk45iS//HvIqEJ1j2EC3oN12NsO44/r+dW01oiysQAAAAASUVORK5CYII=", nE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMXSURBVHgBrVZPT1NBEP/tK5VCEal/QjSGtJp4kRQKFxKCVr9AjZ9AjSS9+Tx4bnvh4sWQcPIA34A0XvTUqpF4QC2xnEjaRhLxQijYCqW0z5l9u/RVWm0jk0x3ZvfN77cz+6/AX8SyrCHSGGmKNG81ZEf1maR+dCscpAA6lcV2RKIF+BNq4qRD7KfTaSSTSdkWi0X5jd/vx/j4OCKRCMLhsA7lwYQQ4kVbAi6HApeAc3NzKBQKGB4ehs/nw8DAgPyuVCqhXC4jl8tJf3l5WRIqiRNJ4gSBmrlkTyQSmJ+fx9TUFNxuN4+BgppaGUw2E2WzWUSjUcRiMQ33VGcidM2p+cJlYfCFhQWMjY2hG1ldXYVpmpqEyxUikoImWKTmQSaTQSgUQjAYPC6HI0M54z9t7e/t7WF9fR2pVEqvS5q+uSPU7PPcEwgEZM1bzd5ZmnaytrYmwZlEia+Hfu6xlX//DtM/vmPG04tLpZ9w93loahIZtsH1bGTgYJbjtcohghRb/7iCHGFdm7nFoyYTRNi68uY1Xp71oocCXIf7EF6PhoO9VBpU+8omMovceuUXaoNe1Mg3CAs2wW0mkPvLyn6FoUMrFYjtbcBDWRiGwlbAksuRAa/H/gHEUVXG11lXPuhRPxPIA4XNTVkCoUmqVVtdLlUGNFoFLLVet0lUnEG/td3dJgJVXzv+xNGu1dCpCIdq4awK0ho8h9MSY2REm8VjAtf0NE5DZAY3R7Wb4RK9JQ0bjyI4Gn0Fy1B7Ht0Lb19ekp6793VXkg8aL/IOe9VvUYiDz7RxRNN6dgZO680ExmWcuZ7U3QGDZsv3Rpo918VZOXO5QdCd6E3lvvpcdy3xXWQo5yF4Qfon4TrPJN0x2BOiA0axovcGd8m3gQ1JwEzHHZSF4ZuV6f4zE6tRGgbnCihJKMwTD06cGnnfWpUNq771TKC61ThnaCaUZ9szAXHhMUTfpBM8rp1WT6apSOQJt/Y/wSrTRjvYAI627I8Musr7CdgbJuAJHdryyWyduf3oL1mdS8r6j38XpgLYcQDmVV9cbfO28htsy+l+8t52AAAAAABJRU5ErkJggg==", oE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPISURBVHgBpVZdbFRFFP5m7t3tzy66qLUosFm07YMtpIBGCyZEfTDhRZ98MDRKYvx5smtCfFK2vhhjQogPPhgrBPUZI0ZDJEAIpYWE/99AoKXlrwTYbunSZffuHc6Znbl7oV3ShrOZOzPnnvN958yZubPAY0QplaC2kdoeakOqKlmj66GWwlyFnQzAbGVLLSIxA/iX1GWoJXju9e9H8b9/da9yOW0jk0k4HUsRXbsW7qo3res4tV4hxOaaBLwcBlwDFjZvghodhWxqgpifgGyMaRc/PwmVz8MfuUw+QGzb73Dal1qYDJH0TiMwkWv2wo8/oPjrL3BXvgoZiUAQCjlBo2kXBaWfgH9vCt65M4h+tB71G762cGmbibBrTt1RXhYGL/3Wh0hHByQbEIoQ4WiEga/w8dgng9Kxo4h8+rkl4eVaTiTDlmALdR+XT51E/u01iLS3w4nFKwTVKKpMZhxkQfPy3QnK5Bwa/vrb1mUvEbwlTPRDrJlc2Qk5OgK3naInAEuAUAZKBYtKP2FGQJleeKdPAatXo3H7Dms036XH+zwqnx8EWu5AtlHkTUWIaH1QINsXSgTqKzTUyaAW9q0slSCb4/BwHN7Fg3Bffp3VPUzwnt418X7Ib5shHXJwXQg3FipoBWRffw7xRomu5XFURZkUfAhvAWSZMmnYDxeaYA0TdPLIL1yApMAEN5QgylQnWR+KFNi+8xoS8xx0dboIi1AFsvK0v/J5Zx2xr1JsqQ8UStf0VgyKSg7wJ3HlhocvvhnB8NX7uHy1iDJF+M+uMSQXRtH3fQrNzzk6AOsnJD39uwGBDKIQ1RaWRQtc/PzdIrQkXUzm72OqUMSSxRJ/bEoSuAyys8WqBlgRthjW75x5D1uFZPELUTyTcPXy1EUFWlP1NH54mRAClnUvWtV4QCBjK/A4uZUt4fCODpz9fxl2D0zUNhRculY7O8bnIEODjddzh/DT4Q8pE1FZplAWuQkPsQYHbqSiLHsKjvtImsqcbKrRZyv+RCqhd1GaCbjIWZ5tGPgAJ7KD0whmJYaguW4htr0zYLVL6MAK/m7s5Vl3W1pbKcxd9AmnR+a1Puu+lb9Fdhetpza+7NkudLemEXxk5hA9yzryfempVzh3fTewThMwk1Wsa/tKk6jZkBgbtmXwbvI10mswp104Ger40sGliTPIHPkEY1NXapaDgXXWLWnq3wiDZ+xkpiuzx5DoE37i9iAO3NypCcemRrVNzH1aA656/t0w8IxXZo3I9KW/Vc1e9qgn+HfRYwCyIcAho8uYbV5THgCj0Ax1zhPDNAAAAABJRU5ErkJggg==", iE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPhSURBVHgBpVZPbFRFGP998972dXdtu7tla4AKW5sY0qDRi6AxQaPRm3rzgokcJJ50jRe92JJ4x5MXEsDgQS+mepNEq4k0mJjgQSAmQgt02SaltEuzf97uvjd837x52y1saRsmnc68mfl+v/n+zgKPaFrrDPdJ7jPc5/R6W7FrRe4F7LSJkAXYbjuzGRH1AP+EhynuGfmeX/Lx7WwdF6/5uFcPzZnRnIOJPX1462ASh8e9WHSV+wki+npTAjGHBcedio/Qr+Df2wG+mXWRSTpIecqcq/khqs0QN5fbIoRTx3YxYSKGmWKSE/GH2+PmOHn+Hhq1NXz4iofBtItsmoGJUG9HZ99/USGbJGg4qDNRaXEJe9NpDA0NGQLGqsSauLHNu8HPzdbw2RtJKMbVUAysImWtvvtyGrmUFjmEIRNpD9Vq1exZkknem2aSebIEZ3j4oFpv6lO/LQX5QY8mdjvq6byiNZ/037co7LZmpQ4EDA5tZLmHaLbaKK829XsvDbsHR41ffmeC18jefk5WyuWyAfA8j2+vTOdD6w4jMoCfTivcrpirmT8gNCRXSz4Ojbn44aPhWCQrJnpXZgvLTfz6H1vVcZH2COMjhEKOnc2aX16kDXHxTF5jLAcLLhoQAtZxPKsQBi3c4MjbnzdaFIXgHZmdvtDAaY4WkAsvofDxkYigxMH31S8dbAP63VGNJwcj81gTsy80goDQ5kBI9jXEDrJ1RAiel9mVMu+QmEShyQerrQgzYMF6S0xjAsm0hQqDaRt9hoD3Q9FCNHCgWPhZ42sUhMAk1MKKHFUdX7JJzc0CFqw1tfVBhHj8e4qAxfrG0fKhOk4fZfA/P18neKDRhvQT2XaIrVssozcWB4kiiaBCafFuW0vUq8hMCYdUwtEmdesttLfCN1HLagdhyIHiYE8+I5dflX/zQjD0RJ/r+75JLiKNruhEMgF3awJtSAJ2juc58fI/IvgH91eXGx6++LHJfibj7B03MQ1roNnRX77djwMDZvUnIZCaMbl/VwIhh+hf123SEu2QIEq6vRmFA7s7hW86LhUzosXlUgs/X1ozPogyePsk2txe4+jLA3hq2Fj0LGMciwkKPFzinqnVamg0Gg+ViUeDR4VPSkwqlZIleRtekGJnqGTCB6SGn7QHcOF/3xBQdGAzaJsDGs/t60c2lYw35OGZl0knOqR+yxvM00khGR3x9PFzNVpY7UqCONOwPhwac1B8PY2RjNsN3nnVej2ZRSGBzfCLc22cv9LC1XKImGygn3CYgd+cSPDYAe75ZPZWPHr0z+rttxn9GL8uihZgpQtwzq5NWbNu2u4DRuVOIAnZfkEAAAAASUVORK5CYII=", aE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAReSURBVHgBpVZvaBxFFP/N7u3l7tJejuZfY5vaVqkgJNUUpVqbRmoRxKaCghQ/aD5EqiCNpaLoh6aKYKzQIkUlWNoP7ReLoCkIsYU0YkihRpPS1D9gcyRFkzZp7nJ/dm9vd8c3uzNJNElJ8cG7efNm33szv/dm3gF3IM55gvgQcQ/xCJ+jaalrI16PuyVhJB0sl04uFYgt4nw/De3ECTG3f+hFoasLRRp5zAQsF3p8LfT6zYg0N8No3KFMU8SHGWPHlgwg4JDOfYe5jo/gjY5Cr6qCVlMO/cW1QEiDcyIJns3CTSaFDcrOfo1Qfb1y005BDi8IIHfuR89/dQTWF58h3PAomBHyP2L0wzZEwG0O3CiACxtiL59H8bdhRPbvQ+yZA8rdm+okTGFOwy8CFmu8E/bUWRixTdA0Ro45MZvbCQs888AO3KMgNCnmrsGo2Ivo6lcVXA+TXVKTZgKahGv+AftmJ0IlFdBYARosOSrZCkafC8Ga/M4oqUJxohNOdgAyfyeFoMndvyImB/ta0JuzoOsadDLSYdIHFm2akksOGckQjEAn1jRmQheBdR3fzeTx/lCHOmuTKPMQCc+J2dBkP65mRzGcB87b1/FGdRXuixoSwyWqQq79btk4c3MKl1MZgqwfQ7f6sbnyMbHaJgLsEVLf392+NSPQrpu3cOgvB9vjUTyfiKEyRJ9lXfChXBBkW9wfZxwPX07O4GezgIydJjyCgH3j3SrADhHgISFNZH/1nYtycbiNmeJtXEhF0JtO4YVEKfa0jgKrw0GOjxVx7mgNvrEtZD0PBdeE6zl+MRBuuDJ5SZ1vvSYTgrdXmaiLhWcxcHgROSdDu8zgavcYtF0R6O9S8g+WQ2sqwU8D45gsZmE6dB+4M4cfcdZJ/yuAT5l3RrCxxFgAtMddWHoR7qdjYCUeWMyDe3wMLuEu1vj8BC1CAqKkiHS6dQ0upq8tyOIKTcOWx8vBtrtw9v0Z5OnJOJ7YWYnRqSymxUX4D9WU1ioxNRsgtm4r7ORwcGUl7S6L4eWKOErpwuHzleCXMkBYA6uL4VmD4ZEVEZy5ncH5GXPWRlhvjD+opoMCol4hbat5evawddEwjtSW4/WqssC5Mt66EqyhFDACXbWh40B1AifWVaI2HPJ1XPqS9C0Tl4GEaTHruLwXDdowdpZF5x9kWUSvBr5P53EhV4ZPGn9U6g3qLeqhocnLD8C98RrdTuaX7N3E8Pw3iSN072kqhk1CdYrKtkVVUQtxSottgb6qNagMvnzn3P+cQyNb6dzvDULwgROvHp1CKI5qFa3wetKwP/wAKro6CbvHoD7g0hWeqxz1bOtvvQf9pValFo0nuchOeLvqge7gIDcfuJ+bEYNbkt3ja7jzcQ0vrAr7c7FW2PUUd3svzm+f7fN9LtYy2yCfbx9b6mzuuS56h66AVU8AUQZvKAytsRH67mYa79wyl8DUb/qn+PKph/+Pfxdt0sH0PIcjUtcuy3xJ+gfTJYL8z1sUAwAAAABJRU5ErkJggg==", sE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALiSURBVHgBrVZPaxNBFH+7+V8hBKSQQAutVREL4kFqxIOCB4/6ASzouaLRm6ckX6AI4k1p6cWbxKMgVA/R6kUtKD0oKRRBrG02Melukt0d33s7E/PfhObB25038+b3m/dmdt4CDBAhRAw1jbqOWhD/pCj7UqgzMKrQJAkwrKz0I9J6gN/FVwY1RrZlWWCaJr9d12Ufv98PwWAQIpEIhMNhNdVAzWqa9rAvAaVDgkNt5z2UQrNg2zYD6rrOSkJE6AuNRoNtc6IIc7F5BZNBkqwy9B4rh3L+ERRzdxiQVhgIBNpIqE1KYxTJg/wirH1dbhLQ3rQRyPwx+B8ENz8+g1B8vgn4P52NnYLn35+2kqTVnqgIKDWxxq8tqLx9DIHoJOiOBT6fjwEw5C5V4ORTEwcwORGHta1l+Lz7DuT+rTCBZLpJRjG3BD6k1HUEcMw2QN4wrf1MqLGaMMGHKdNwHpFIuUzHnCK4TlZ95wOI8g/w0aRaCTSMoFNoY3tJzbWg4uAcRNvc21BRkKSI4Bo7fXvlrRx7NGsfwDbbQDvfre2aewDlxr6XcAwy//Olcrnkx8dZatmYf8QHyoLm4PGzil1AvUhIjPoeOK7tpVAXsPl7Qw3NEAF/UC6mhwnUp4Ek/VLSKY6wvYbmacUuNQma34HaP006jUuIYJsboejYcBNHplXTaBIEphdgHEKLPBY9rcxPRPCGWsHjV4AzPlza+wpNv5i4qswXRMC3X2BqAfyoglwOQRKfmIIzRy8oM6fj0aJr9jVZkeQSCIk/KgcfOHykzz1RXauIva1O0S1UgyIIM8mIUUjfGyfuwVyUr22uDdRgAmJSHeHkbQidl5HgY9C3oMbJhcAXT95XQ1mJ2VVwMuDdrODs4s0aTHBx6bzkWgmoLhTqXzDvyVbwDAxYVUoWdRasWqJarYpyuSwMw2AtlUrcR2MdPwIpGEZk0V8Vw8u6OMTfRUoCFFsAC7KPymNsEMZfadwE19Sm5wYAAAAASUVORK5CYII=", lE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARJSURBVHgBpVZdbBRVFP7uMGvbpe1u03bpT5ZukUTaGlkFI+2DFKPUB+Oa6IsGFNCYaMRuleAfyjb4ojFI4EkfaFWURBNDH3xAxbbRUCONhSpQQ+w2tBZaXPs/M+3OzPHeuzP9oV0o4SQn586Zc77vzLl/A9xAiMjPdT/XVq5xmpMRxxflGsKtikhyAJYrTemI2BLg9dzEuPrF89lrHTg9eFLayZkxGVO0Moi1/irUlNQhXFjtpo5ybWSMHUpLINrhgEvA4z2HcVUbQF5mIXLu8CNL9co43dRgmFMYnLwssnCg5iit8VW6WDFO0riIwKlcsn924SBO/N2Eivz74FHUVNT130opNUwd8bEePFa+Dc9Wvua+bXC/hLk956ZLtCUxeBj7/jiK3OxKMP6WGHHLFpZDs0U5RAzjE932++tfVPKLX3XbdS/P63MJmrjZYRkXMXUpAnjvop+1TPbjuOlUz+ZQ53eXUr4HsxWq8xrM0i8hq/wLqNkPCHcbJ9jCnOrjwjPYuZl83ivM462AogBXTaJPhpMsYV0PLugIxapCOwo9KFUZs2zA1C5iLLkRxeu/csPyOAyekHRtbaiOdLAz5wxSaBQKDJR6ptl7JTYezU3CsHVMO2pYOh7OMe29xRaCPIbxWIXG8Uunjg1bv5FYjkQFQUSMWlpacHkwiS3P9LPXD/yFZFIDIx0e6Hjcl8TbRZadwwz4FZ3eKLLoSb+pZMJgjDRMTEyhfn8P6p4bwJVhU2I5shnOrqTa2lqaWxugO8u81P51pUV99xP1bZRqczXiG2z3WehPxytpzeqsBbnhcNjdgHG4o7KysgVBrr71UqE93LnOpt4qot67eUqV1JFzFdTwfAHxiVyUEwqFZre4ipuIZpjMo1qYW5spMz1tkmeFJQpkN8oXc9Anpzsvb8GLUKkHHd+upkPvBuDPVaRvyia4C2pVgco+eDPATn0ZJBG7IDcUcoejswR8DqSHLwmK7sqjru9C2BTOmq2uW7Pwcp+BXXEdf2q26fofqvay89+HUL9zrkA+B+7wrCBoF6NIJIKyUg+dOhZkB98JsPlVf3pthvb2T2MoSVL39BvqsUQSM5Taad4sBR/vC+CHz4McQ5VYjrSIjSZOzRHx9F/PNvKpZ5iiMLl5z2sWfTg0g6GZpfu8ysMQK8mg8kyFCSqbF5OYLEIg3O6GlLtHRavoEmm/wfpnO0zepuZEkp0YMbEceTrfg6f8KmXwulYEW8Ay1gl3M19hOxcdduP/HsErXR9h2KQlbos0wkMDKsOR8B74CncLz+xhJxstBtzIMzy3YDe2hqKpc4xuDixUxD7CcxxwIY0O5qILJ8aNuHTQO34Bsd9fwJA+kPZDBPA9+dXYvraB203zwWPuw1JXZtQhkVdmd+JXnB4+KQmH9H4Zs1L1ScCaQN184CWvzDSVyUu/mZYvrXQbfxdRB2BkHmDc8cWcZZ5W/gf2jL2yI+ee0wAAAABJRU5ErkJggg==", cE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMqSURBVHgBpVa/T1RBEJ733nEHRwJnAkJMMLQUKhTaGqONNlpqI9Yaw9mgnXe9RvwLoNBEGwJ2Woi0xkRbCAEKzSVcwcHdvfv53jrf3O5z4bwfxgmT3X3Mft/M7MzuEXURpVSK9TnrBuue+iOH+luadZr+VbBJA/Qry52InL+AL/CQYU1hXa1WqVKpyBiGodjEYjGKx+M0NDREg4ODZmuBNes4zlJHAqRDg1OtVqOjoyNqNpsC6LquKAREbEuNRkPWY2NjQqglwyTZNgLtubADuFgsincA5Q2ilm00gqxer9Pw8DCNjo4akycmEsfknIfvSAvAy+UyJRIJATUEYnyKxBBgRMQWCdI1x/b7MW2P1KQ4ZMWeO7bnSIr36SN5m5vkbm8RBQGFMzMUXL8hChuQDAwMRFGzczi/ZdZrjvZ+Dyy5XE7Y4L3kPH9AiWeL5Pz8FeWT/dYh8N/kJNVfvKTg7ISQIAqc1/j4uAn0DBy8Yw4VoZqDhGeJhcfs9TY5fpkcThth9H2e+zK6u7sUf/SQXN4Le8/z5OCBpSUNtNuYoQwBDiMYxz6sk7vFKQEwAwKcGFTWFb81B9nODnnv3wmaqTRgabkKglnMUI7GQLx5+4ZUqUSKe0AxuGIwVcZY0WNLQeytrUZRY78pX5ZpnIEkNZ/PRwbQ5LkJlAqfsAfXWnOrimQNRfPx6OcO5BwCLgKIOQdTRe2lCGCOClVDelMvMf1i+kTSxrpv8mfXeXj5CvUr4YWLJ9aoJC2FiMBqdZHg5i3qV4L5B50IfoBg0xDYoTXvz5OaOk+9BDbNu/dOfEMfaVkHwZIhQDdGJNyRtdW1riT4H2xIe2z6yMrGmst5x73xBatkMhndMaJTU1T9+o3qr15TeGk2Ag7n5qix+JRqnzfExthDRkZGjNkK7qK2y87nejdNZx961zRpAqQGTpJ12cm9gAkPWRMFLiw7kl7AUOzR4JCsxmx7cDLUulmlYUrcyWieTpEAGBWDl82qHIBnqItXaf2oi+AK5/dBHR8fq0KhIMpvhnzD/079EEhTP6If/RXVv2yo//h1kdYAhxbgnv6WYU11w/gNBlJ/vrhWDDMAAAAASUVORK5CYII=", pE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANvSURBVHgBpVZJTFNBGP7mtdgLYRODS6LPEJcYlbpEOSgUIy4xpGiMFw/qwQRjotV4MB7sa0KIR2zCFUgUPRAjuEVPrcuRhN1EEqAgB0xYaqFRQvvG+advoAUKJf7J3/nnfzPf9y/z3hRYRTjneUK9QgNCh/miTFs+j1Ad6xXaZAFkKk3piNgK4HfFYAjNo3kwGER7e7scw+GwXKPrOpxOJ9xuN1wul9pKD32Msfq0BFQOC1wC1tXVIRQKoaioCPn5+cjOzpbrZmdnEY1GMTQ0JOdtbW28pKREYRmCxLeMwIpcsvt8Pvj9fpSWliIrK4ueQWxKGeVmYRNRX18fampq4PV6Fdw9lQlTNRdDJ5WFwBsaGiAiwnqko6MDHo9HkVC5DgmSkCJoEsP1qe5u7D/k5JsOHGSqHEkZyoiX2moeiUTQ39+PQCCg+hIUayqYFf0weab37sJPUfOWffv5J5On9Ce5NOmkWwRI4ERiSb5d/FSTNf/lMzAyAl0AGZEwO7LBwT9u1xnfsgWZyPz8PAoLC2UQg4ODKC4uJreHCNxywds30MRoo2gnJlBdUMCqoxGYVTe5ee48Ww2cQE3TRDweRywWg8PhUI/KCdNJlinSownbvQdsbg4QJBgYgHb7FtMe3AcbG+NrZUFl1DRNZmOJTpjyhTJHR4DKM4i/+wDz0mXKGaJzwMwMtOfPoFVXMfbyhYx2qSpwpUmi2xfYSSdF1N/7waYmF5eItEnZ5BS43WYKj7ZWFilz+ogRU/T4UbCenkSZkPqK84pT8dhTv4at29L2QmVDfaAy5eTkkDtMeCGybGXlWFbknFzE6/1mrPWVbTXwpWK3LxSmizIwhOGNi2P692xl4hQJDeg2s+luBTMLN2UGzK0sTI4nlQZ2bZTH9B4RUJOnafbnzGmMd35F7cks3njEnnHEioBUz92O4Ts9yrtTE02h70ZQEtQ+huuagzceXid4kry+0qLMZvoWqRNxQ2i44FgZblQ9Yiqa9UbvLXsI5+YD5JF3AxmSgJiUwyh/CK/QhY2ZgCMBbqh9iYsnJLFT1loNJ7trvBcXW68i9Ht0cQFbDuzacUKC05gEbqy0RZF4LJLElTnyDe0/3qPrV+8CWZ4jVwK691xIBl7xylw568Sl38wzlwD/j38XHgtgOglw2PIZ1jFPK/8AwW4g81idSyQAAAAASUVORK5CYII=", dE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARASURBVHgBpVZfaFtlFP/dm9yka02T6miDtVmYMMW5dFOwgm4poi8Om9qqLwVxiAVRuhVBJ0iTFKF9EKZQCGMP3cteJkUDCoJo1yAFccXWVVnxIU1apSu65U+T5v/1nC/3prcmGRMPnH7n+77z7/ud03MD3IVUVXUQ+4nniaPqHt3Rzs4Ru/FfiY00B/dKs80CSQ2cn6UlQOzg/cLCAsLhsFgTiYTQcbvd6O3thc/ng9fr1U35MihJ0qdNAzAcmnPhcGpqCrFYDF1dXejo6EBbW5vQy2Qy2NnZQTQaFfu5uTkRUKMABQnWBdAyF9EnJycxMzODvr4+KIpiTABkXFuZstksVldXMTo6iomJCV11XH+JpGNOy88MCzsPhULweDxCs7W1VTipZaQFYLLZbEin00JeWlrC2NiYHoThOkG667Jmx9A4VlZWRPZOpxO7u7vC8fDwMGRZFvJDsgJ7Nidkq9WKoaEhITN3d3cLW4ZWq98sC7KW/Ru8YQM9S8aZmQ0GBwdxMJvHxJHHMP3k0+jczWFgYACLi4s1PZPJBB1ejfq5zSXuZdpcKBQKiMfjQpGz46x1nLl7Km+dhf2F58RZYj6CjiuXavcMWaVSQT6fR7lchsvlgsVi4augmf74WNoKTiN1aRYmKovJaoGZukY4IOMtVNCZzkKyKKjkcpCiMcSe98FBSYDKoZJaKZlEiV5WpoOt0TNwfSxq4eUAx0U3/LQENZWma4nckUEiBflAC4Eo42IxjfdNbcjf/F0EKRMkM8ltfGhuEwlUqF6VYknvNaS+/R6oBnCbtYKgEIuTa6nWt2qxiDKxRJAtl1LYVFS03lyD3N6O3zJpRAopfEAdrBI00LpKb8tyIqlv3bLxou7fmgMRppuFPNaJD/SfhPWEB9skpyg43/3buTFJJn7BOkcy2e0oYbOmaCQb1eIgZOQWf4SayeJBqtQDUqN0qmQ95NLFhKwFgO3UM00NnpAUHJXNUA67oTx6BD1Ul2OS0lS/1fO4Li5zmwZI8BepO3aoE7hNuXskQ4Zr4a9gefs9OMbfAfUjEp+FULl4AQ+/9GJNp9qqzGXcZ3dAabHy8ThDxDPDr7S0YOjqK7gW+6GuICOHX8Vgp4qnCB61VMQfdhWfpK/iu9C7e0pqld12F6Jjv+inX8qUKc+Na7zznzpf91xXew8i1yP4yFfG7e0NZDfiePP1Mv4y/Q2HZK/T/+K1K7p42TiLzhAn+t3PVoNo2TBJRWDj/ltYc6o43fMNRo5ex58OFSu3f4U5Je3Lnm2PO4/xifg2CHsDhmJksByITCNIjH0aTUhLxH/yPALeGgL7x7UhSADVyYrlrRt4+fMRrCfjewpSveP+Q9VX86oRf9UCjUyMLxHjm/dc9PDa11i+daMWzGG1C4e+R04bHTf8ZDZ+dfWjf1m9d5pX/8evi3OagzsGh1HtLMAz/24+/gHItXgQAgIDxAAAAABJRU5ErkJggg==", AE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUXSURBVHgBpVZNbFRVFP7ue/Om02k7nUKVAqGZShORThEtv22h/CgaMNbIAhMNSmKIiQvrAl0ZyooQNbpxY1QwwQVuBEyqEQhtaBuUwEBtoYCmLVPTzjB/bacz836v576+ByW0BOOZnHf/v+/cc869d4BHCOc8SHqQ9DzpEL8vaaevjTSE/ypikQPwuHJ0PiI2B/gHVLSTBkXb6OmG9kuHXfKJCXuOVF0NOVwP786d8DQ2u0szpIcYY1/OSyDc4YDbgOkTn8PMj8K7qAqyXA4lWQyrnEEL5cF4HtpfwzCHdSw6eBxyXb0L004khx4icCy32QufHoH6zddQGtZAUhRMrbDAN3pR4legF3HIl3ToQwb8UcDK5WEMXof37X3wHfjYhfvQ3QlzfU5FRLhFgOvffQslHLYHGaePQjt6RgLWe6FPmvDd5lDHdBSPMXD6WYxBvxqBsv89l0S46zkiGXYJjlLxjnl9wJresklS6uogl5RCcixwJlGFudu164JbqEVtc2qSdjKI4pOn3bh0EsFW5lg/JHqyDavBoneg1IUhEYBLYFQQkEkgjV6YAQ7Wb6KI4i39w2f4SE0iMQb6gaYm+H/62XVVhYc+r4ma2dsNELgssiSdhlTss8FN8jlv8oE3K2ALAK8kQW20wEaBfEcOxREitGiNqtkGGT09MAjL2UWb6Gu1s6ajw55gW55KguVytuZaDfAdFOQKDR5JhWVMQy5SkQ8VgG2ELOdn5iYT9lphoElYjrQIzNWiZvX/OWO9aKgqLUjCeKIA/0rq86mQWR4euQBfkQ6/T7fr3rAFfa0GliCDCoV7LrV6e1yCkHCRfaBYNEqD7H5QdR2TlRn4F8lQp4HygJdWMietKLE8lEkFStfl05CKaHfGzFqJvqZzIF0CW8w9bxg4c0aWUglmrnqWm9u2w7d9E7MCdMC0fuLrhqxHwMwkTGUFVHkzrIXroOytgNbQB372gsG6OmWeSDC+sZG7doosEhkUisVS3OeTmURBpPTClcEU/30gxVJTGlbWBPDyhipyjeLaQ+NJXOxPQYyHnwryF9Y+SeMyM00TAiMQCNjnQexgWBAc+eEWuzQQh8cj4eZIlt/NqKy8REF5qYI7sRxkcvC6ukoqGQZHMkhkdATLFATodH8Wu8FEsm4IL6RYgW9du5gd3L9GEFwVBF2kW/buqsXNoZRFCYi3dobY9jVVBLiAez0yGxmf5j3XEuz0hShUjePNl2rw4vrF98ajsRzv7ouzk51RS9dM1tpS4270lHCRCHLaPmjZLCyimMqb+LV3nPcO3EU6o6G+Nshf37KM1S4rtf06Ma3jt4vjvDMSw1RW509XB/BqyxK2MhSwxx33CKlxr4rzYheRmwnsPnAOo/GCfRnULw/aLroVnTLjqYIs6sJto/GcZXFI7vjfo1k+lsyxgN+Dy8dbEVpSJmCPUSz3PXTZffXjdTpQFl5pXsqDZd57t233tbs4+0cM8XQeTasq+a7mpQiWet31uBCJYzJv8T07akXfg5edM6mNii9EPZ8v4PD3ffzyjTRLTqhW7bIyaffWat64qhKlxR4mLD5xdoRdvpGyMlkNNUtKpMPvN1ihpUHJgXvwup5F0k6FeHRw7VYKuz86BwowHiUtz1fhk3dX26Uj4lVrdxtzPZltDol9wruujONU1x303U5heCxrzyHXYDMBtrZUzwae88mcU5xH/xh/fDnP/8e/izYHID0LcMjpa3fSfF75F4Xh6k8yRac6AAAAAElFTkSuQmCC", uE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ8SURBVHgBpVZtbJNFHP893UrZ2q0dzrpuZC2z6KaMDZAQg9IZp5kBbcKHfdBIQnwLGkM10W9zHfhBE4zEmKDTyBKJ0WQhNjH4RQIdBlHsQJhLgIV2jL25bi3r0z7r+vJ4d7172rKXYPwll7v7P3e/393/f/e/B1gFqqpaSOkm5QwpQTWPCLd5SHHgv4JO4gT3iuMrCUnLkB8klZcUC+37AxPwnb2JAVJHY4tsjKO2Apsfug/utga4ttWKqVFSeiRJOrqiAHUHJ2fEH30TwOiUDOu6clRVGmAq07NxciKFuLKI4Pg8VNI/eeQ5JsjhJSI9SwT4ypn64d6L+PyHIexofgClpSVsmCTRMdDq3GQViYU0ro6E8cbeR9D1+nZB947YiU74XKz88FcXcax/GFuarLBVG5HNEiKdhH27G9hOGuoq8WLHBpjK9YgvZGG3mbDJWY3Pvh9iczm6RUx0wkB9/tf1WRzqDZCVW8lKdYT0Qex+Yj1mIouIxTOEMI1rt2Io0ekwTWwdj9fhFbeTLeKpx2rZXOpaHr/jbJdcKUg7zhe+w7M7auB56VG89XEAer0Oa/SluP1PQvOmClWLWbXZgAxhp6765GArTpwaweC1O/jli+fFkCoq4CGNT6ly+4GfUGE0oM5qQjqDnMM5sdWk4N1dQ+i90IibcxUiciKArB2OJBCdXyACe8Tp6qEuctOWzz/KyGKJNIITceKODAkgcYuSZoGMyCpqjXPofvo83n/yD2YT3+nY8RkFUTnNFuU7GxI7cFGBVtq6cmOWh0SHZCqLcDQJWUlBIURSVsGHz5xDmS6G8hIZ2+vG8HLL1Rw5KXSsksxoB3Pg0qQQcJTygCA0IRfdilQ6i7WpJFzOKbQ5p+Ewh5HN5L93Ng8jRsiPnX9YO7aMgOxAXEghUABJqy1lSfR1DmC9JZ5zcxZLsKcphHrzPHzDdvwWur+AI79S6pMQbZhNBv499zGqGPBrqAarwWpU0L5xHC222SI7TSUcUU3Atc2WM+VPIY74m3EjXInVEEvq8W3AWWTbvFFLG5epgJ+23C47ligQfHmhCWNR44rkvb83Ir6oL7LnueCj94AGOUJ77QdOwT84XXT+KXSSiv59p1FvkZHOSui/0oCOxjG8eXInrs+Y8wsj0bbbjBj5sVNM3cBYaO4nVZt/cJKI/EyTD+7O5G/v/Bv2KhlHz23C7TtGONbJCM2ZCkao7CT8ecKNlpyL+kjC2y9y0X5Soq6tNnS9tkW7mYWYTawlxcDIKZaSq2wuJ2dvA1CcrlnKoO1DX18imfFykasqDCnN78XIk3/waqswaun67gfHi1xmJTd7Tt373mlpdCqO1eDaWoMuQkxrDvqqeUVnuSfTw0VyT+bgFMlTt6ggQpMyG2MxrcEuQuh21RcSL/tkLgv+6Pep944z6v/4u/BwgkgBYZDbvPyYr4h/ActEbGMEE2s/AAAAAElFTkSuQmCC", bE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARlSURBVHgBpVbdbxRVFP/dmZ39XtpuKVut1S1FpXTb8OEDoNEmxkQTDRrjE5DoX0CJiT7a9sEXX3wh8Y0GavTFKIH4ZhqDQMCk0G0T1MKWtny0C2Hb/ZzZmZ3ruXdmll3akhpPcnLvzN7z+51z7jlnFniGcM5bSb8inSSd508k574bJk3iv4owcgG2Kqc3I2IbgJ+gZYS0VTxPL1dxeUGXa7FqyzOdURW9cQ2vvxTEYKffM10lHWWMfbspgUiHCy4Bf5guYqVUQ1vIh1iAIehT5DndslExOR4ULGGDsbfj2Bn3eTAjRDK6jsD1XLKfuV7Aub8q6Nvhh08hUMawPlgujKCbNuZzJt5/JYjj+2Lejye9SJiXc1qui7ScuVHE+b8rlAI/mAAXRxoIxJZw6wQiArH+88jAR7tDRBL10rWPSO4oLqNITevtxyafmC5je0RD1VZguOrt/UoJESWHvsgUVKbD4N5vDB1RDWfTZaQpte79nRYbn+v9pzJ5k2uMKSqE6mTIuJMe4fXzgXsY3DZF+Q+h3f8ICirwMQt/5N4Ep7OqCml3lhz8xrn4IVHmIoIPxVN62US2JPAUFKpMemVQ0Rg1oEVdxkD0Cvw8j48T4xhqu4B323+CZdewP3YJNjdRNJlMaXrF8qIQMiwIjojdpSV6KXJOXqzRYaPmKfBqaAq8puOd+M+AXSHV0e67iwOxi2jz3Ydpc+RNcVeqxLi8VCd4SxDsFbtMzpLe08WQZ0DeoLO8RCkBctUw5ZpecgLnhrtWiGQJBVNDxTIkCZPpVDBNUbiSVNwLoXq3nRJxK8ai4nij5QJ5OUkp04hIlI/ugutS54rdsh/8dB+fJ79Gq7Yq7UsmbyJ40hJeObol/9q2q/ikcwK3yr1YMTpwPvsBpY/KkFOe8ynMFlK4tnYQB1quoT82gxfDdxz7hp4R7SfeJqN+BVm9uZl+XD6O5wL30RedQbqwF12Bu/hu8QR6wreQM+MUpQ8BxcBiJYmH1QSR7idsG50x1YNYrRMMJjRk8lYTwQyBdgcX8GfhIJKhDG6W9mC+vAu3K7sQVYvQWJV85XghuIhTiyfrdr1t9bFxQ6Tod7E73K15Ldokvz48gu1aFjeL/Vi14kjFptEbnkOYCDKVl9EVXMLVtcNYKPe4FhyHBJYj5wSBnBmDCR+pCmcENJPMlXdT44Wok3W0aY+RoSgMev6iZwzzFI1IlweeiDAM7qhH8Is3iyZpGUpnLXz5W0XWMttwwAF7IrNI0L08MLqwqCdRrkUcaE5VSKV86r0wdrbKOxgnjM/WDbuJWQPfz5qynp2q2oLIoWfjaL8fxwbkmGgedmJDi5zhx1IBHE35HY/knfCtgafq4EJGXcx1H5wROJMVmVUbYxd1rJSpQ+vH2FOEHAMdKoFrlHe1EXwEDRZPOcSHXRLZ4elsDVfu1WiU2NTtDniUHB0gwENdaiPwhp/MTaKWH/1xvnWZ5P/j38WwC5BrAJx3342Imf8sjH8Br/6UQySz+JIAAAAASUVORK5CYII=", hE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANSSURBVHgBrVZdSJNRGH6+bWpqun0OIwTRoaSlbFo3OfvRqygKpW4jiiC6kSyCbiK3rlQQpKtuRIMgqIuwi8JuNEq7MVq/6EVsSYkwdIq/+/tO5z073+dsmy7y2V6+c873vs9z3vecszNgGzDGbNy6uI1y87NNhORYJ7dK/CsoSBJki8FMQkoa8hv84eFmo74v+B4TsyPiuRJZEj77C8tRbauDu+wUGkqb9NBFbl5FUfozClA5JLkgfDL1AHNrv6DuKUVRrg35lgLhtx5bw0ZsFbMrMxSF+00DqOKCEh4u4k0RkDMX6oMf+tiL2SHloP0wckyWhNffubKEbcTW4V+awlnHRVw6dEt/e1PPRNFrzh8fqSxerxcDTx/iQu8J5KlmMIWBO2+dDjMmJYUUTC98wvmqq7oIlauRxwV0gUH+uOzz+dDY2Ain0wl7uRW1123IKzFzYmWTNbm6LDHGNIbV8DLPZBp9x5/BlViXMS7QqsjZ+2nE4XAgEAjA5XKJQEuhwmquqbBW56ZuBhJkUpi+GvAj9B1O+1EhIqHyAqNdyI2NCXLC/Pw88vPzgTUok92rzN1Rixp3pVEllpwNS2QSiUexBwWIRqOYXf6JsqIKettJAm3UGh4eNmKCwSDsdrtRi9rlZnQc6EAm0FpomoZ4PI5YLIY8/pE4SQIN1KL66wiHw0KEsjCZTIhEIsgGtBnIn7KQqCQBcaD8fv8WZ3IiM5vNQoAxtiO5bkm+QmBbUNqUfrYZGFtawsQtQA1VVbFboKwlFg2BlpYW7BYsFqMwPmq9If62tjb09/enONMmdL4eQd7cb2UnYn7eEOf1z717D6iqoqFhOmi0yCHqtba2ivOgw8br+dy6l7Xk5uxITstKK6WVlyNn0tiRDhNfFPrdGKNeV1eXEVDBt9tbtTgrcl2AzPLosT40RL9FJtm5wm2R1oFEKjn5qFqMeos5a3KC6fYdKHX11BR3w1anxPUnsNDTzeL7SpgmjW1j9J584709yTdcZ/qZMOYxXL5+ZvEjrhQhLckEcfs5po2/Syb3JHOmuzJJnRZDnHA2MQ68egl8+wI2M5MIsFoB9zHg9Bko7mY9NO2VmSkTuvSHWPYYZf/x76JTEoSSCP1yzCO3eUb8AZKFOe/A8b0KAAAAAElFTkSuQmCC", ME = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQESURBVHgBpVZLbxxFEP56Zsex1wHboISD4zxAoMheZIPDxUEycMMSYPgDkAvihpEIObI5OkEoZ0RIJJA48ohkLijGyBtLkCgrbEcRimRnNw/l4Wwefux6Z6bzVc/0elbejRKlrNrumen6vqrq6moDjxCtdSf1a+okdUFvSCl+N0bdjScVMYoBHldONCNSDcA/55Cldsqzn5vG+h8TZtT37pk1zs6dcDOvomVkBKmhN63pXephpdSxpgSSjhjcAJaPfQtdLMLZtg2qqxMq3W5M9MoydQVh4TJtgPYff9Jub8ZiZUlyeBNB7LlhLx8dR+X77+AN7oPjeVBEoREMmjHR0OYXCFfX4F+8gJaPD6D14CEL94WNRNmcczgvaRHw6g/H4WUy5qMiiqOS3qgYPuKTeUjyav48vE8/sySSrtdIsmgJTnD4JJibxco7w/D6+uC2b4UTg5pF2/nUzlkXx6IP3EpEQabgwX1GchFtv/5u9+UvErytYu8X5M3y4ABUsUCCDL1WcIildrlArwcEnL+Siryfr0LYdV6IQkMSkMSfnwP270f6l1M2VV0p/ozKLDgzTc8KcKVKSiU4ba1Qe1yol1uAHm0AcbMSRbOPD2kFtSWA/ncdWAzgVCpmiZ/LwSdWHMWYvPvAVM3EhAF3xfM7S1Crq1B76eEb1GsrwCTTuoNg3RVgguX6N/V5EvKdCteglpZM1IIRECuWYYlgwOwD829zDnqj0gRYC4ErTEfI/OxgFMdJtJWr+mlWFW84d3yuvQ9VLhv7UPRMzhLslnfmQIH1rsxfTLKXSwfo7dkSoyDBVYJ3M4LWMnB7lTXCyGYY1Ytr9K5as3PkNz6QQpBKHggp9drBuB5GXi4T6DTB04xgZAuwxDFH4j+rUZ2Gbs1IJdSKRLBoZs92oE7u0niGQMOtwNR6ZLWL/rzuyUYB50gw4EUl21HfcaSVWJQagcvyqpMi0/KMfNZRzmfWo/Kcpf7vR0Td9L7ISP+p1pkqlnkseUGYMqxsXHXi68jwEsE+auMxZB86xYh+Zv5HGVUvSc+R9GpgzkhSUhtYv8lBk00uGcwP34diBdSqSeQlAg150X70c5Rdy/OBvCaiC74pHXOiRXt64J3NW+s9tlVMcnhLEzwgSV2LsNJH8Bf45SZhyoR7QL2x4XoYq3t6yqboJFvFgU3NLvzmCDQbnoMGl0UTsT0JXx6Cc/ArmdWa3cai6PozEhwd18H253QYq36EyndZGxwZT95wY4090TpbWzL3nw4G+zcRhQk1wKPv6TA3nQTPJjEbXZnCLjebOeGyL+CViflZ6EIhMujgmZFm9u4I1FCtvBtemc0ikUv/pH58mdRP8d/FWAxQSgAuxO+ycZk3lYf57pKoAeDhpgAAAABJRU5ErkJggg==", fE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAORSURBVHgBpVZNaFNZFP5e0mc6E20bSh3aGaadQWfQGTOj1gouGgTFla0rN24URBD/KgpCVYw/oOJGEFFBUDduRLAVBFFoI4IbbWO1Cv417aJVqzY1vy/Jy/Wc9+5NkzYpBg+cd8+795zvO/fcd3MCzCJCiBrSI6Q9pENiSibkXAdpE8oVDpIA3ytXShFpRcD30OAnreH31IMAjO5upGkUk5OWj7OxEU7vf3C1tWFOq0+FhkmPapp2tiQBl0OCW4Cx06eQHRmBc/58aB4PHG43RWjIRqMQpGYoxDGovnETFV6vgvETydEZBDJziz124jiSF85DX9ECh65bTtO3KqRm43FkBp/DtXUb3IcOq+W9aieaqjkN/VwWBjcuXYROGTksB0GqlSAQctRg9D1B5c5dcB88rMq1lEhCiuAKDZszzwbEZEuzpi9Zggr33FzmllIpuDwKXkhKJjDpaX6NIP1iEFV370G3z6WXCFZrMvshnlnQdh3D76PwLqwjLDt3BtXyqmnnXHBwNg2NA6/H4VtWj/sX16tVTwU9NrAVeDJK4BGynPjyNYVKV4XMWMNvdT+jc8ti/PV7FZxUt+dvwzh57SVGP8VzJEY6Q4aDcMYsLN/yBl7p4DK3s9UVGLYcGHQ8bCCWNBEn9czTceFAM1b+U2vZVW4dq7x1uNzZgl+JOJbIWL6fwimKteO7ekNqBz4m+J+tgdefZRkclE2WAgxEE2ns37QIDXU/Ybr8UluJzs2LLQL2TRimXNHwoH9MuTVxiawLFRqN5h0i3YNMFuloFs2LPNa3Xkz+/bMakXgaU8v2mYUjqRyBozBEmzbOLq45TszkLrw1TBBio3quS64Xgg++m0QpefRsvOh8U8M8ZYZzBL7l9fbUtIz2n+vH2OfEDJAvVIYdZx6jmHgX1iozyAQBttp9jSjG8Go4gnW7e9Db9xFpOvy4kcHD4Dja9wUw8j5elGAKC1180fiQJ/htzfY7CPR9yH3/5Yl92Rrr3Xhza6Oa/MNekr/9mUCviFXqIkGaJDXKUI7hWPNpMNcjprjtBsNdSqSOHxPxMgmSkiB14lh+x2sq3KDd/oQiUbtIlg/O0lG8ikL4lYcZDIrE3wtmECXzlNeMtWuESaXNE38+ZrGWyezc2awbnqXOZt7uhng6ADESsp2qa+BobYVzfRuNs7fMUjvhM7kqvl96xA/8u+iQABN5gENyzi8/85LyDV9VvWnIUvJYAAAAAElFTkSuQmCC", gE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMTSURBVHgBrVZPSJRBFP/N525lGbua2qHU7dBFMwgxULIIOiQIRbcOQVJ0qEMb2cUOrR0CI6gOBYGgdIkuQiToTVPaDkGWtVFEuGodKtddt9VadHd6b3bm80NX2TWfPOfNn/f7zXsz35sF1hAppZf0Bukg6bhckqge85P6kK+wkwbIVbpXIxJZwC9TEyD1cn9m5CV+PB9AZCSIhdlZtaawsgKe/fuws6UZJYcbjWuMtEMIcW9VAk6HBlfAX2/fx5/Jb9hcXga31wtX0Va1bjExj9RcAnPhSfZC3dPHcntttcEKEEnHCgK9c8X+5dYdTDzsQsnBOlhut2Oh1JZUFtuL8/OIhz6h4twZ7L1+zcBdMZEIk3NqRjktDD71qJtSUKMmxbIwBf0ZeOnQ2Jt3qLx43pBwug4QSdgQdFNzNj72AcGGY/DUVsNdtC0DTt60kBdBCI2mmgyR1PEsxH8j/vEz6vt7zbkMkd9RoXc/ziPD1fVITk4RQY3aqVAwIhOBCUPaSbXNtB6efR+C91Aj6gd6zaJiF/07mTnUIP4SeAHZqZkoCrYU2jlfghL6CGwWO5JUMgmL+lHCmRkOmij8THCCrV99/WqBxQc3HYEoKTZ7X1uITFLuUrGY8pfk8rNvwBAc4RRF+XAjkQhSqRRcLhcsy1J5V7nPQQgD6XRaKWOwf2lpKU+FOQL1QfEkTyx3zFXMhlgdfj7LucDZrkeyRc0EYWXotGyEcJq1xFyawDfdeRffH3Tpg16fpJVK7Lp0AcWdN3noLWO9YKuMChccX2i+4vQpbzluzGd8i/iQ+SZhtPkU4iOvVpSHXAlYN1XtRkPotRneY1HeuW4MqV5727p27ySpfdJjuj1ci0y6W0lj3qZG+Nqv2rvJB5i1inyLqEhCvw1sKAJmMgM+iqIqDxInOGdAS4fGXPHgBKjhRweJsRBCp1uRnJiy58UyYBZPUwOBt4Gjd4AHsvkYEr8mUV94jIpXhGpLgko5F0MWl8ejAHfQbXEAZ30ys4edefR7ZO4yKP/j14VfA0QdgON6LKCv+aryD7yb2d+BlGG8AAAAAElFTkSuQmCC", zE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPRSURBVHgBpVZba1RXFP72OXMmM07iZFITqgVJSymWmdCKFotK24AvTdHaX1DzUvrWFFrsW8cHH6IgguKDeEMRfFQfoi8aBeODCEpMJIiamIsJRs1tMjnjuWzX2nP2uM2NiB+sOfvss9f3rb3WvgywDKSUtWT/k3WS9ct3mIj62sga8aFgp4hgpTi9lJBYhPwveuTJavnd77qFN1c61FNOTakx1vr1sHNNiLe0ILZ1u3adJNsnhDi8pACnIyJXhO7hQ5BDQ7Dq6yEytRCrUspFzhbIZhEOPiMfIHX2HOxsk6bJk8i+BQJR5ErdPdiO0onjcDZthuU4EMRCTlBsykVCql8gLM7B73uI+O+tSPy7V9P9rWcidM7pcY/TwuTeqZNwcjn1URCLJcxoRERf1uN2SOLe/Xtw/vhTi3C6NpLIgBY4TY89fm+PLDb/IJxsFnaqGlZEKjSbEIDRrsyC3oOZaZpJH5IXL+u63CCBZhFF3889Y8PDkL6PRDIJy7JUWrQx7ry+hg01G7HaqTPrhjAMlZXcOdhVVaj/dK3+nInRz25ulUolhERqE7mkvMO2yxFHkT4p9OD86FGsHs8gl/4eO9ftQdJOKQE1IxKwOFUUIHNVkRChjbPwqyqs66qobSI2o2aCgj+NjtFzyDgNmPVn8MIdxow3USY3wP5szBXhRxb4Vi1LUtYDNDGj4E/h1NP9GHefY7w0Al/6GJjtQ9fLq5gPDor9Pc/TXY2cIrWhgiCokJvRCynwJnQxMtevyGPCwapYNa6OnqfiC+xa11rx0WbMrNEy1c2nEkCIG+MXaTXZCIi8SOkJpIeCN4maWC2qrMSCGZj+Km1kA9zQuTfxqjSG3um7eFx4gJSdRkPiM1UDXvtCWBhzh/Cs2If5iMViujlZEYjH4wsGPik8xBfVX2P7ml+QTX9HxR1R/f9tOIbNmWbEaQaPZrqXE7jPrZtkP7GAUX2FLZ/swBbsUO0LQ0eQsFLwpIu1yUZ8VaPWhkrbfERLlHGJNxoXeYLfpui01MXW6fLCEh4VulVxv6xuwu2XHXCDIrataaFi11RI9YZj1NVVNuLn+qjo5FnI210Iftv1/hGxQoSR2ddvQmRz3HWGgmzVq4jX2qTYug0WHVYSHwY93vpnryZXd8P7g8rXn0JwsF0GDXUyjEwuY/ydxwYH2s0brm3xSKTMV4b0dMtg0zcLhELDFPHunTLsumWS503Oxa5MVuebTe1wrgvoykTvA8jBwbJDOg3wkfxzCzitERa9MpeaCV/6Z+TK0Sk/4t9FW0QwYRD2R335aJkvibelF5SFnL7sjgAAAABJRU5ErkJggg==", CE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOnSURBVHgBpVZLTJNZFP5uW9upY4tMhwrOhpmxJMxgMw9lHpmkzCRkMhudzGKSyUiiiY+dgolLY4ksWChxQaJRo8aFiWkkMW4gQKgu1MSgiMqiasH4CIgE0CKltFzvOb23/JbWQPyS03Mf537fuef+/38LfABSyrXKDinrUzYsFzGpxxqVVWKloEWaYLk4W0xIFCDfp1xY2VrqX+1/gcvROK4pP/UmxTGV6z0IVvmwte4rhH5cb5ZOKWsWQhwrKkDl0ORM3HqmH09GE/B/thqlXhfWuFdxXOLtPGZmUxh+/hpS9TuO/MWCGmEl0rxEQGfO6odP3kL7xfv4aeM6OBx2DhOCYpDz2cUSb5Np3Hv0Cnv++QYHd282dE1mJ8LUXLk7VJbDp27heGRIZfS5nhY6SuTX0jTY+odeYu9/NTi4a7Mp1/dKZMQInFVu+93YBDb9H8HGQBnWrHZm083lyvvQlNIiJ2k93iSSePB4Aj0ntphziSqB34XOfphGNmy5wDUPKgE1maURhnaRfOlOJPvBh+MI/VDOIhqlDvXzN7Xm5uZw5ehvaYfdDpdrlbDbHZJEhFjMtaPjEnw+H0KhOkv2WZHMQkYkkymZyWSIy+FyuSigkQS2UiuZTKLU43QowK5EyAxIpKenB8gk8WrsGZ6OxFBdXc2l0SXGwoKA2ymQTqeZSwuEbOrnO2rRhM1mY+PySGmpguT5eDyOWCyGmZmZ9+atidD6+fl5M1RJZ8CR4+PjuQAjYkUqlUIwGER5eTmi0egS8uwuFkAlIpSVlbG3WdWtPh9tbW0YHR3FwMAA2tvbC8bkn5kRGOFGgawNIpEIWltbc/2Wlhb09vaiGOgcNaaoRH2qUZdIJPhJMkJGbHp6GrW1taivr0dnZyfcbjcqKip4noS9Xi/HUYnIqER0wB6Ph4ajJHWVBJxOJ59+PkpKStDV1YXu7m4EAgE+bL/fj5qamhx5PvQTRLhMO6Cv5iT1Dtz4F4OTN7MvsMDKkH3XsO6TL3D+jxtm9Eub2ip9N6LUa6hq4iiJlcO8cIc2nTZD5+hbZJ6iHcqmgr5f0BBoMt+vFWVP2KbWfu39lpp8N1CDBUjJDGyr2s8icjkii58hJm9QazWaNeeSCyesHF06iL8eQvj2TozNPit6HETMu97QpPzPVvKw6RS6Mhu1CF+ZgxM3cf1lFwuOzT7lmE8dJUz4q/9PK3HBK7NIZnzpn5PLR5/8iH8XjZpg0kI4rMfC+jEvincFxSmb+2WgOQAAAABJRU5ErkJggg==", OE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPqSURBVHgBpVZdbFRFFP7m3rvb3bL9gUBN/Gnpgy9oE42ND9QE+gCF8oA/CYkxRtQXE2Nc4t+LCYsY45PWSNJEje2TxvhQIRHkQaAk/iQNASuQBsWyVQtKShf2brvdnbnDOXPnbpd0l7RwkrNz79yZ75vvnDMzC9zGtNat5HvJj5NP6kWbtX1p8vVYqfEkC7BcG6pHJGqAv05NhryV30dPTePgib9wktqv//xUtskbntPeDvfhLsT7++FtfCKamiPfJ4QYqEvA4bDgBvjDoVPIXvbRtqYRq5sbMJj8NWhW846eKwB+AWoqiyCRQOrAILyOjggmQyT7lhDYlRv2/Z+N4cA3Z9HbfR9KSpthgkZ+8ka3alkVc2lsNAdBEKBcLiOZTKKpqSmC2xMpEVHMqTnNYdn/+RgGvz2Pxza04bm+Tgx/P2lHCXz5dHNpjSddCw/mMSTkpVxONyaTTrJvm2PD9SiRXPIsI4em9bcLM/jgi9N4+4UudG9Yh8cfWoui1Bi/cB1jEzOID3zkxlXBNcgkSRsaGAIvfwNyYgLyu0OcF87fEHmvZ1e/m1meefMoCI/Acnh+x4NINcYIQeDkmf+NArl9B1RMhYp0CM6/TMBK1PQ05qYvozlc9GYuc1bwZJTU7BWfnhxc/NvH3ILEV0ezKBNjoajMDLnzKcjWhuqiqLRKKQRSokSeKJUQj8f5U5oJdvLTwdFsmBKSnp+XePbdX+BT23nvKswVpVmu8/57QYNb0ri18sJQ5fOQlGxFSQ+2bHXw0suci01M8AgPHP9jxqye/WpuATlfIplwce7i9UoovGM/CkflPWhdzQDMF2n1ZRM5wYT/XQER8Nf1Qlud4xP/mvGu60I4DgkJK1hU7ZQOOYslZuNvkq0Co4DfV3d1mc9RFaHdLRhQJnAYVdTAisdQzwQXVqDJVZR920+HGEtZ6N0E5/xZuGEmauHf1qKS5X2pe3oQHznE3TlWcIkJxK5dCA6nTEjEStGtkQBD4PZti7rOsIIMPeyVVF6+74c5EKKSg2UriPYClWsqlYLnmejvYQLedSZ78yMjEBQm5w4kRATB/Q+gcfeLUXenRyvN0YcT9LI5cU8b1CsDplhXmofAuntsNOoa5rNoyWEnfziC0uw1UuFEZ9wyVs/xDxBbuw6xLVu5q3LYVR/XaWo+5udisWiO4MW9IOoALx4VsVgMCbobrN16XFdNyCA8WaGnpqBeexXin6m6Igz8xh6It96B0165cPhWy0Qvta7MtCUxV6b++SfgyGHg3O+G1ExoaSFguiq390MQgbWaVybqSOdLf1gv347ru/h3kbYAs1WAk7YvY8u8rt0EC8pxY5/52XQAAAAASUVORK5CYII=", mE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANaSURBVHgBpVZLT1NREP5u6RV5BAoGl00x1g2tYDQBiaZoSExIiK5kA1ESI+4sJsQlZWlMDDsTo0L0DwgLG8OiLHywkoeGQEhsFTcIhVIorZb2OHM4By7SIugkc8/c05nvm5l7HgX2ESGEg7SXNEQaFjuyoub8pC4cVjhIARxUBvIRGTnA79IQIHXw++a7t/gVfC1HsboqfWxOJwo8XhxpaYG98YIOjZH2GYbRn5eA26HAJWCq/xHE/DxsVVUwKhywFZfIkGxiHSKRQPbbV4oBSl68REGNV8MEiKRvD4HKXLKnHj7Az6dPYJ49B5tpwiAUCoJEkyECQj6B7EYSmzPTOHKjE0d77mu4bl2JoXtOwzi3hcHTz5/B9Hjkjwah2AxrNoaC3+JjO0vk6YlxmLfvaBJu1xkiiWiCARpuZj5/QuKyD2ZNDQpKSmFToIZGMwzAYm9XQe+ZtThVMoOiV8P6u4wSwSVDZR/mmerqakQiEdTW1uJP4RYJIbCfTE5OoqmpCaFQSE9V2OlxTdKNjkpwlmg0iqKiol3BQn8HZWtSLalUChqHlYlI/NyFq2wNDQ1tOy8uLiJBq8SqdrsdbW1taGhoQGVlJTY2NuT8+vq6HJeWlrbjLVg+qF0piFG3VKppmqKsrEw4HA7h9XrFyMiI8Hg88r28vFz4fD5psw/7WmPr6ur0BgxzBXJDhcPhXS1Jp9OIx+NYW1tDfX09hoeHMTs7K7MtLS1FV1cXgsGgrIZ9rRKLxbTpsuEvkslkUFhYiGw2K4FYuffLy8tIJpOgCvYH0IcYl2Ut06rcEspWOJ3O7Tm3253Xn9utD0WuIMJE6qvnlFU6g7glzc3NaG1tRXFxMebm5vL6U7LanOAKAkxFazdvRodVxlLi12e+yLWS/kVdLpf1GHfpoyLEXZqKfkDP2HV5+BgGDiUiu0Xx+GIQJ8pqeGqQFkOnXkWdpLHTx86jw929k8+B0beGdrdfg8u7gQ1JwKeenmg/dU+SiIOQKB/2baeYDopV0qcw91w4ARp62f4Sn0bg4y0sJL8jX7cYWFZ9spvGBit4QL/kujL9ikTu8KnoGN7/eCMJF5Lz0qfEXi4BG49fsQLnvDLzZCYv/UFxcAmJ//h34VcAKxbAsJrjPeTYD+M3QhmUYpjO6sEAAAAASUVORK5CYII=", vE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOFSURBVHgBrVZLSFRRGP7uHe09aZZFSaEuCnoaVlAG1a7sXbSINrWodmVQtIom3Gi1CGoRCWnUJoJoggwp0JFso5PvhF6Olg+0yWmccR537j2d/8w5OuIjLX/473nc83/ff/7//PdcYBJhjKVyvc61kms7G5EBOVfANRPTFTKSAFOV0omItHHAL/LGwTWVxi53N5xV31DNW99gVKzJXGHHxtWLcXh3NnblrlCmPq43NE27MyEBhUOCC+Cih2509vxC+uJULFo4GwvmJot1gSEDwVAU7V1+MD5+fnufIJTi4CQ3xhBIzwV74YNa3Hvagm0bliFnWQNavVugabQGw23cmGEoHEPzl584f2wtrp3bquAuqZ1oKua8qaewFJbU4kWFC8e39aLfPx8Z9h4EtQyk2Q28aduEKLMrj5RrQt0f+3Dh5HpcO7tVhWszJ/EoglLenG785MWWU89QfKISp/YyeLoMdPXGsGCejnVrZqHocToa/Qc4HEuILSN7DAbCaP3qxdv7h1ReqjjBHl16f5pmjl+u4HvSkZ1h4bc/ACMaxPIlUcxKDiMcGsL2zRqCPCRDYZO3UkOmGNtsScK2sKROMe+mY85ncUQltaM3wHs62rxZ2LnxA9LTNEQjFhal6DyxEZS7lyPEwViC9ypcESMmbF3uXoEld1FABIep53R1xFPCs3j3ZSacrzoR9PUhEo0HJCMrG+3GGo4VE4lOOByiFUeY74BInVUeRbCLCHKo1/TZKzwg7Q/Mgy9pP+babXykCT8H/PSMidiP7CBOEIqYMGIm1Nmqru9RrzOJQBSUpzswqiqMmAUjYMGma9D1MfUYPzsWg8XYyIGSEVAFSQQak3uM5OZA//EdtviysSX+F2FSTf4wV67EHHeDmKeYeERvYQpmSvRVq1TXN0xgy8vDTIm2br3qNhCBS7Dm52OmJGkEy0k5oCQP0Ch29BC09zUibv+SA4uUxz+5rkFNZ+m8nOm7UUUj25Wrw8limJ4om6RHT9RUGX2LdDk4w9Wn7ciDLkmmC06iX76q4i/uhtGL4tefEPNWMTOXpjFLKptE6T2tNW8WJ95wBeN7wphjeElLEzNzN40hshJUAB85yKyad4ngjkTM8a5MYqebTVQ440nH63KgtRmsszNukMJrZsdOYF8+KKxSxr0yJ9oJXfplbOpSyf7j76JAAgwkALbLOYc85hPKH7zWdYk7drLYAAAAAElFTkSuQmCC", yE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANFSURBVHgBrVZLSBVRGP7OPDTT8pYRuRB6kIss7EWEBbmKCiylVcs2LtpkULjsurQHtAtdpEGLqEUEYUsNsiKUxMqgB5pBalh68+Z9zczp/+ecuXfUq6j1D/+dc878//f9jzNzLrCESCkjpFdJu0mHZU6m9FoT6VasVNhJAyxXOhYjEnnAL9ItShrhuRPvQ3q6B5l4P6Qb923MgnKYRZUoiNTCKjkYuE6Ttgghbi1KwOXQ4ATcj+T4HXiZMRhWGQx7HYSxVtm5s/A80tR39kHJ9ps+oZYokbQsINCR++yJsXakJ+9TdHtgGjZZSZATGWWt6VJzz03ASXyGvfEsisobA4NLQSYiqDnd3nBZkuME/vMhrLWVMAwBQ4OLcEhScXH00iMSmmT+DMHedA5FWxqDcu0jvxFDu3FpIm7io0xNtMMq3ARTpGAiCQMprTQWSXUP1oVWmtuFm5EhXy6t7l+HH4+OfpgnMx/qINxx2MUUvchFr8LnLGSuSggyUVm4lIYz+wko2o/iHW2BxQaLfup5NBnr8wZiXz3DBNZ4P4RlrqGmEqzItydkaGOomjlOWiYTKbjxl6gqe22VRw7x4yYmOMOjB6NPjEcTUwYT2NYs1hdsmAceakAeopl0DMlMgnYY0FDchQuK4BgT7OXRl9iQHzGjOjKN35lfKKQs5oKJuTxQJUrRTnI9R5XTkBicfBXwbrV0QzCR+KYcNYYjM5R2hvpgUhNFNgOpYlA7iC9qQLYz2j/uxOYQ5B7mGXuUs4d5IrFs4aKM8KDELl343ViFMEZ5cUUwnc4SVJcdxv+S7et3BcMBLtEz0toG+zh2tt12DKFqvNJs1JvNJZWovnGCA2d9zC8aN3mKjZyG0xAvev0nqyHgXnkVFbD7BoLlbfTCCv5u9PDMvNKsIsGK+pjLgNS6ey9Y6gx/i86TTouaIzA0yUrBWYzLzRBVu3nonw1zjdTx54t7vVW6mzdKT6tcQvk527rXWsMnXFP+SKSMZk3eDUr3QPUCIi+kPnB9nfR6n4fBo2HMfEcms/ufb39OTcfTLuD9W8jRUeVQWgrUHAVOngKXVUveI3OxTPjQ75TLl275D/8umjTAVAhwWK9F9TZfVP4CKedExhPzLHEAAAAASUVORK5CYII=", LE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMjSURBVHgBrVY7T1RBFP7mPhYBhaUAE/GBtuwaDFooGtGSyh4SpVE7sTCWLHbGxFBYGRWiP0DUREswaiwh8ggVixALaHjIArr3znjOMHOd8BKQszn3zJ2Z833nnDuPBbYRpVSatJO0nzSv/sqc6esgrcNuhZ0MwE6lZysisQn4HTI50jS/R18+4/eH99qqhQU9xzt+HH4mi1RLC4ILF63rPGmXEKJ7SwIuhwHXgKvdj6Gmp+FVV0NUpeGVlWsXWViCKhQgp76TD1D+8hX8+qyFyRFJ1wYCE7lmX330EL+ePUXYeBZeGEIQCjlBo2kXBaWfgFxeQTQ+htT1dhy4d9/C3bWZCFtzMoNcFgYvvniOMJPRg4JQPOFGIwz8Gh+3JZEXhwYR3rxtSbhcZ4hk0hL0kLkRjwyjcPUywvp6+OUH4RlQYdGEAJx2kgW9xz8XKZNxlPa9td9lgAiuCBN9nnuWGhsgpqeIIENRi4QATgZKJUWlnzAtIKaBaHQEaGpC2et3dlJVQI9r+qOOjcq4tlb6R49BHj4sQLXXFRcGQbjrQcFUSZPoMkWRkhUViGOJYj4fhCdP8nAHZ9BPjeYFWoIrKysIggC+72tNVgKXw3xoa01pEyulJPAYURShtLQUlZWVukxchQadAQ14nqfVAiXxOkDWuuNuIOxfLBZtVx2XSG8ojoAHXdkMZCthcKuOX53nTnDtXsQSuMIEk7phSrMfwt/RyHxCkEqlsF/iEAxx6yNp86IswZPBOPI8H8LbQyaKN5yEij3cOnfAO7RWnTdMwGdG55GKEJEIguFZswx3Wy69sgRqyjycSIe2t482rOBzY4Df2rIlaxOTQ2A3CSjt23mpzHb18llkV1E76fzpmgCt2ZQ9xXYVPWtrpgSnqvQG1XcDNzQBM9mONprUmknRfGkOHvVPcJ7LPm3ZZKF0GcwNF06ODF86mJiXePBpFTPLfNrYaWIdoUK22ifwEKdrfBc8B8djXUCqw5DoHf5tNsbXHzEm5iRmCmvgBynQLAGer/Vd4E2vzC2y1pd+r9q59Kv/+HfRYQDmHMC86cuRprfD+AN6ofo7K7nyOQAAAABJRU5ErkJggg==", wE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUNSURBVHgBpVZrbFRFFP5m7j7bXbYspY9FaEspUCpvNaCiaIyBSJWQ8ANjjGIIhUjExPhDY0pNABUNYmJEjIL4iNFgNJBQjRHU2ATxAYTyaC1dW2pb2u5ud7t793XvcebuvWVLCsEwzbk7r/N9Z845M6fADRoRFQlpFHJMSCddbWFzbquQSvzfJpVMgJtt+69HxMYBf078bBNSJMehX35F/+FmFNdfhN2v5vZkytD3eRlKV62E/767LdWIkCbG2Nv5eLZrwBtNcAO44409ULsuw1kyGb5FU8hT4TcMirVGMHL2HPqPNEstLP7iY3jn1UmDdgsMnyBpsjD5OJajfceb+HPdM1DsdkyYPRNO/0Rk+3WxOWlIqjMLu9eDorl18FRPx8nV69C+fZcFtU3GZgyB6T8DXO3dR5nBL2niwnlAJgNKJAAh6oUoFJaEwpNIdsTEnGqsSQBf3WzEz39Gat8+C7fRiol1AumaosSl8zRy5j1WubmalTysgFQJIkRNItEWY3LMsirFT0XFfDK3JmTSPaBZjbNY4u+9iJ09QWb89hsxMJmekoPfVz3JkBlAzctVKKsvAM9w9H0Vh5UOaluUmIMxPaEavpdIZWs9KF1jZ8NnU9T6/BXmrn6d3dn8tdRYLtNcBnl1LqgtSHZ1QxH94M4gEqf9CKzzgus29HwSNTh6DmblmUlPpI1gBx73oniFDd17+6nvmzDL9GaR/LcFoZ9brOzaKgkek72Bw0cNfzHxlx0cwsARHbGTEdy2fgJNmEdwlCiY9KCDhN089GOWUj1ZFNZoaF3fidQQMS0SMfRJUF8R2WUS3C8JFuRyuw3eGruutmc5pdKCJAQ17kL7KyNs8iMFqHh2otilMWmCd46T/fOOinNbumWGQBMx0kVCSOPc5YquJ/6wYltpMwOCigYVfGM5V8RSujurpwc1rgYz+uB3KVb8EGegJPJbSb1C4ZYMK613wz3DRc6AnTlKuK6BcY0ryCfIxZDlrrXx62CcuxnlTpYlka7CMwrPJ9ASIoWzGhQ3dAbOmQJd5DFn2tjnQRIEJVPwXQ3R4716MqiJTWTmTW7v0LGE7lviGnOCweY44hfTaGsMWcRcF5+C2XYqemA6anYZuhFuEoC7FiHeIfyfA8+xexlm7vBT6orGO14dotiZFMXb09S5K4yR82lWu7uYXAFlDPHIhTQjPtM6xClJ8JPsTRYPF5ADl1//vW6640iAtChR6HgSvYfi7NJrYdaxPYSeT2OInEiJE2TY3A9LxT3wgPLjs2qF1f2WycsgOmE5+mvlGiQv/kZVW3wofdTDLh+IUnB3ZNSlt79foimFjJ9+on90blqDD9M2+TDwfZwuib1kL8fS1pPWcpVNvHwRQXJcDJbP2Pki2PBm5g7YEdwTocsfRcc8555aB2d2xriNQc/mbO7aOwzSQFM3+5hnvpN4+UFL54DADloBeloGxLtgCQrqNqHzrRB1XwNeWGvXbD6RLAXiHixw5C+h64Nh1t40RPaKBriqauWUURuM2MqPZBqdKN4A27SNRo7m+9Vb6xxN08JZVwmsfa45Dcw+ZYNlVJOJebUemJXIIKl86QUsbvkBzoqpowDehQ6jIy4uiu5yada8b9lSzD96yNDJAx+tauOVTFksjOfbOKt4BIfE2xJY2wtn8YCxJxsvRPfBakwS2VK07MYlc9xmFv0DdPPtGN3CfxdbTYBwHmCnObfNTPPrtv8APjzc5aHQnD0AAAAASUVORK5CYII=", qE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMhSURBVHgBrVbNTxNBFP/N7rYlIKWCIRo0EARJ/EAPHPw4YOKBg4n6B0iiNz0J3k1LSDz7keCFCAejJxP0bhCvEmNiwk0gGg+eutJut9uPHd+bnSmtaQUCL3mZeTM7v9/76kyB/4iUMkWaJl0m3ZDbktVrU6QD2KvwIQ2wW1loRSSagD+gIUOaYrv04ztKb+ZQ/rwCmfujvrH7+mGPnEfi2g3ExsbNUZd0RgjxpCUBp0ODIwgC5PN5yLUviM8/hpU8DNHeoY7IQh4hafXXJp9B8tlbOCOjBiZDJDPGsJp4jlwuh2w2C8uyEO9Mwkl1w7YErGKB1FNz51AnEiPnEO8fQu7edRRezNYIuDbGcEzO68F930dbW5sisCBhE/C/uZTROTWPD59F8Oq5mrfff8RDmvaWKJJNEwGnJlUul+F5HmKxWATOSiDsufA9CB6VelE0gU/kvooq1tuHgKKorK5A129BpUh7f0dVyXVh23YNnDyAkGEEGviNRDz6ngLndduxYROGP1dL1VVuc07RLdUtpZIK2XEcBaw6gAnCUAFJ3RJCRunRZq2QkpqCSoPq6icVhRN11xQT3DQEDZ5rElSrkOQhsROwiLLPe7K+GrS05UZEpOUP7w3BOBNc4FmlUmkg2K5mSHF70Umh/ebimk9oLqgOolJWBKGOQsuAowuCkFLB4A2dwl4TMfwC6hi2PWciOqdI9K4iybkNBA3S4D3Jt8EYZjPd2FE0H0KJ3sQRvNTLTLDJTNw9raTsCOyWgDPa03XCrLqWJlC9fxDCrgwmTxvzKxOoX0Y8Hq/9MvcjjHDl2IQx3zGBuv24/1n3S3K0/ThGey4Zc8mionLJP7LF94/qHK178jy6nJAemzdLi/V30V1SlyNIJBJ7j0J/fnt4GieTZ3iq3gaeKAJmMgschalHpDsA6+5h8MlTD83OjMZE7XfALxFfTjRNMwl3VbFYjKJpQcJbnO/JoWkaL9aD1161Zk8mPxbq+mZ7K3Dxev0p1rfW8Nv/qb7pcLoU4OXeiXrgpk9mC8/Uo78ody/Lch//LqY0QLYOcEOvZXRaW8pf3wcNaSvhdNoAAAAASUVORK5CYII=", xE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOLSURBVHgBrVZNaFNBEP72JdVQNa34U0Uq8R9R0lY8VEWNXrwotRdBtKKg0ouYCp6TXHryIIV6EloUbx5avFg8JPUfLBq09SBYA62CPyVpDE1i+t46s2+3BtpIqx0yb3f27Xzf7szs2wB/ESllLWmENE76Sf6RtB4LkwawUGEnDTBf6alEJOYAv0pNlLSW7UQigf7+ftVmMhk1JxAIoLGxES0tLQiFQsaVX8aEEDcrEnA4NLgC7OzsRCqVQl1dHQ6uWY16v1/N+5z9iVeTk/gwOqrsvr4+2dDQYLCiRBKbRaBXrthjsRi6urrQ3NyMPT4fTviqkJMSOUdi3HEQ9Hiw0rJwr/ALr7JZDA8Po729HZFIxMB1mJ0IE3Nq3nBYGLy7uxu0Iuyr8uKMbwkeFEsYmbYRJJuJ0rYDjxA4vbQK94tEQu+GhoYQDocNCYeriUhShqCHmvPJZBJNTU0IBoPYRuG4sbwadwtFrPVYuLR0CS3H3bBDJLdo9T4yV9BYz1QBXyhkIyMjiMfjJi8JIjhi6dWf55HW1lY3buTU8KuIoewknKkpXJY2RCEPKz8FQbYnn8cVOY2PlIvvuRyO2iV4vV6Y8GoJcZnz6Em2koODqP88jnoKw3pOYLUPOYrzF4r7udxPnTBh8jVTGEWaMyEd7KBQ1ZCv/ewpRp88xuaDh/h1mAlauLfz0QAGalfAS6v32EUIb7ULZ/HTYlidMqltuH3+CQtOrgB7pR82kVsDDwGX4DATNKqpw++UmwItEsHEBEAVBFqhwjQEikOW1zZEvgAxXVL+DuvzZ+ZtgAnUgcLYmAqBMCSlkqtUkia5M60GVkplq0i0n0VPm0JcTqDj6/rPOtq2jfmKKFMjvKuU6vlrsFhibdxoupkZAs+BA1gsEbt2m26SQzRIGvrRdhx37F5VNELgn0SlhB7nCGudO9Qv+DBQJ83W9Ren8Db90iVYKInOeZ1vA+4cfWFGN1l0avm7kWCrbXuHmiWxcFGVS4/I3ttmqJe/RebEXCDNBFftQ9u2DrfkF8Ki554l3y3+XdxVdwN3FAEzmYGz268pEjkfEj2H5zJ4G/lqiWnMWRdOlBr1vR3Nvkf09UV8zY9XTAcDq11v7aC2uRw8aoy5rsywJlEn/O3ESzz/NqAIv+bH1Jxl3hoFuH/tsXLgOa/MCitTl36vnL/E5X/8uwhrgHQZ4Cc9FtVlXlF+A8HQFtmspAAIAAAAAElFTkSuQmCC", RE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQWSURBVHgBpVZZbFRlFP7+u8zmtB2NMoVSAYuhMRRjojFSo2gRlQfBRB/ExPSlBGOMg2vUB4b4gktijcgDMYU3NcEgxvggIWBLo4ANUyq4xZluglBghnJnv/f+nHO5t50uQ9pwkjP/fr7/fOf85w5wA5FSRki3kR4mTclJSbtzMdKlmK/wIdfAXGVPNSAxi/HXqImTRnj8c99ZHDiSRDe1masl/HKuE4HFC6GubIFv/Xpoqx/2jmZItwshOqsCMB2uccfwjq4+DP1vYMFtIdxa60c4qOPz+w0oeQPIZmFdvAh7UQNqX9gEXdc9M3EC2T4DwL25g/7B7hPY+c3veLAlCk1TnW1C8B7gyy1N0FWFT/AZ2LaNUi6PkN+H8Ipmz9xWzxPhcU7NSabFOPcFDhz8FSPGQxgYiSJb9KFQ1ibusv98F3RpupdyYGATejlxEvrmLQi89Y5H130EMqi5iExNxCr8gfd39qMntRHhkA9N9RncuWgMZVPDiVQ9pK3AfOVVS1HZrAvAXpDKXA7G1XGpGIbqC4c5fntIH9Pc27czyvGeOHYdbMOquxXUBq/g2Qf6se7eFJLnIwj4WnDo1DJIXVehePw6CFAYqaYGQtrI9R6F78mneHkNpzl7sJFHVvYY/hnNUU/B5fESaoIWQpqBgGrgngYDGWMleVKE/83X4bfLk4nBsaHWLpagjY6AyTO/+97LrhgDbODej0eTWLdqCHW3lDCWKcJHWXFooB6RUBrdfy7BmeEQxq4I5Hd3WbZPwbTsg22Z0i6bMC2CiEaVMBw/HxX8Kpn/tS//gKebv0Jr81m073oGw5duR/NiSkVLQZn0wnjIISXZLhFQZKV5SNN04sBqWjZEXR1qn3ueFwcZwNm9fMPXlPNZtK74D4+3DKMvuRA/9d9Fx4lyZfK5pIfeg1+WvQgTN7bTOjQx1dSxGhsR7Es4+7UpvtINe/9qRO/fS6bc0LInb5w9dQbmNIo8mlgty3LaoDvPAIOkS9/Fb2Ym/a9DnJhZQSYkuOM0NFWZdc2jCU3LFXRs5k2ZCYCXHolq8kI3VHH9SVWF6BmddVq6ZwR1xB0LvOkExyBOnW0mBcowDKiqSmVBODofqaQoHA5TiXHY38oA/Oo4k1D8+EOI48dcmuYnXpDthkYEOj/zppdpdNMMgRyhwRq97QnbTCRsKcS8EZyEoh9/R4eXOHu5Fs0odoVCAaVSiVJTmTNNHj1csgOBAE9NLXbcoQ1cwz/lDdr+b4FPPvJKTlVnZIWKN96GuulFb4k/PIMzznoBdwanB1Det8+0r7/DWUF4hZNCbVuridWtlcbjuIG7Mfej7ghll8zn8zKbzUrKsgnlOV6b9kcghrmI+9HfK+cuh+VN/LuIuQbSFQZT7lzcTfOqcg0XGq3yotVfiQAAAABJRU5ErkJggg==", BE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOWSURBVHgBpVZLaBNdFP7upOnf/ulv21+q1GLxsRBMfaELrUrVhWLxuXGjqN2ICGIFi+DGuJIqSheuxBe6cKELdeEDwSoYW3ShVi1FkdRW8W2aNk2mzcxcz7kzN0kxKSkecuaeuXPO95177ivAOCKlrCA9StpOGpEZiXp9zaQzMFHhIA+gULmYj0jkAD9ATYi0gt+t8GOM3rmtWhmLKR+jtha+unkobmxEUf0KHTpAekwI0ZaXgMvhgStAs+00ZH8/jKoqiMoKGP8GVIgzHIccHobT94FigMDlK/AF52mYEJEc+4PAy1yxmydbMXruLIoWL4Hh90MQCgVBoakQCamegJNIwurpRvGuJpS0HNZwB/VIhK45Nc+5LAyeunAe/ro6GOxAKEJkZyM8eJePbYccUi+ew79nrybhci0ikl5NcJGa3fbrVxhe0wB/MAhfoMwlyGSRYfLs9Cjo3R4apJH0oPTGLT0vD4lgtfCyj3DP9rvL8M38iNmVc10sfogM7pj5Ymjplkv9HOB9tBvzJy/FqZXXtFslJ7mFrZc/OhS4oJ4hK4oRaZImMeokMUJqOmyPoLq0FmVF5RixuT9BfeRHGrdjKrbrZydefu/QBM1MsJmt8Od7brbUE0v9gmknCCShWtNKoMz3H/bPOY6q4mn4lIjQN1ORKD8iGqQYXdPwl3uaoKGIHgvZeh/rVuBcD0uOqoB/fCXpqd0xswV98Xe4/+W6XkjpUjGR7VjuSjMkun50aoIZTKA21Ndkf9aM0j6QKVhWCobwIUDZByctwdXeNso4CXfFSgUuqfh6Ven4uBUbQ5D5mMN2pJ2249YgbCLWeIUIF6WXjTJ/OUQepyFrAG9iT1E/eS0KkerAdG0OpAkW0PIaT868PYKGqZuxoWbnuH6c5KxJc/XrCyZ4xNby6nWZkecowTfzE/Y9W4tIvAc1pbPy4atQxvLkJm80nuQov7V0bENXtNPbZJiYSHeDTy2pweU16X0wUx8V7dSskk/CsLduGntEFCiOp74HjyCCddx1iZZtk+F9byIdEPXLYdBhNYFFopNXIg4d1uDqbhjr5F5/SuyTrdKe8r90PJXjKH9nX/tEa/YN15w7EylDaZfXXdJevOAPIidLFfCWjdIJP84GD2Vj5roymZ1vNrXDeV5AVybevILs63MDyssBPpLXN4LL6knOKzPfSPjSvyQLl3b5F/8umj2AaBZgxOsLecs8r/wGe2aIenhMwSMAAAAASUVORK5CYII=", WE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM3SURBVHgBrVbLa5NBEP/t932NNo01mIPkYCyiAa1VKR6sFexN6EUv4qUFRfBqKj7Ag00uggjVo3jpg/4BilDw1Aqm9aBQL+1BtEXFovaR1LRJmsc6s9nNw6ZvB+bLzOzu77cz+wqwjkgpvaTdpMOkU7IkCzoWIm3AVoUHaYDNSu9aRKIK+E36CZN62c8m3mMlNoJM4gNkLqH62C4/7NogXN42OJ7TZmiMNCKEeLomAZdDg2P89xgOxweRz8zAcnywavZAWO5Cv9wy8nnS9A8eAw8ewm5sMjBhIokYx6oyc/RP9CDy7gaE7cDlPgRnVz1s26LOKaW2LeDUeOCqC6KmNoClK5eRevyoSMBrU0Gg66fAByZ78GqqH8F9TbCtHCyRhC3SsBlYkFqpgk+2aiME19FjyDx/Vk7SbdbEZMCl8X6OT8iBySfwufcjLZMK1EJaKwOmilmomNC6vAzH70eGCLKjb6HXr1cRaKar7DwYuy4EUQpLIE01tpBUYIJ+QYBCpihdUh2zpM4iSUrltKllpZRFG29zzuASex9nx/Ar+R1M8Ce7QBkwCIEyGNuUEaSxtao26pOkycTjqhz5aNRkwRLi2EW2ojOvVcGYIJ6ZR4p2ippxnoDzqTKt9JlYUInE3CxlI1QWuaEhQ3Deoc8ptqj+ChzUKStXsEgkkPV6J0tU7uxynyKzcxDZTCED1tGoaWpw9ILgZ/JbYaw+GVmZoZ4JFNOqJjJfICNwM9Sib47KVU5Qmlg1m+ekgDYWgYo5KuGpTbPhqdm7+t7YhqgsAgHjxooEJ31n8L9ENB435jgTvGGr1X+htHQS2xYe6rS3G/clE6jb74SvhbJowU5EzStwAOLsORN6QVtX8DU7wl5nsIsvpm0lILU6/YMm1EfY02b/XSONcRadR7pKvbcAzmLdvmfqr94GFeMPM5lAR/CWIqFECroBcrEPgVt37pqWiMZc9eCEUbhZ8WVxAgfn7wP04Ajd698zzLbY3QzxtYPq3loOHjZOtSczpEnUCZdJeiqXaKOlPtGJndG18ABuAq5rg6htNkOrPpnVMy88+n1y8zIsd/DvIqQBFsoAp3SMn0fvehh/AVzh/jmDo729AAAAAElFTkSuQmCC", EE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMxSURBVHgBrVZNTxNBGH5md1vpFmPjVwQDAgcTKYiJejFGjUcSIhfjVX+BHPwKMaEcjRePxgv4cTdeuKIJ5eSBKBdPoNeGtrRsu+22O77vdKYthCIIb/J0Z2Z3n+f92pkCe5iUMkGYISwS1mTLcnptijCAgxq/pAn2a3OdhMQu5I/pkiIkeO77PsrlsrqGYYjuiXFY/f2wR0YRHR+Hc+OmeTVPmBVCvOkowOnQ5KhUKtjc3EStVoPjOLAsS8GdfoHQ24L0PIR/ftM7QPzDR9jJUUOTIpFZM7F28VwRZzIZVoFNZJFIpCVSKsERAk53NyLDSTiDQ/Ae3If/+lVTgGuzTUDnr0nukXexWAzljQ1kC8Wm9wyb0mUR+GqXynAgEb00jODd23aRGVMTEwGnJlGtVlEsFhGNRlkUWa8Ir0o1KG2Bwm6gXFJRsIjlM/xGVD09CEigtrwEXb85Hjha6SFPNshj27aR+fkDklLya32NotnCMWEjW63gQk8vBJHppKoSCuhC2o5aqZKI81kV/g63OUcwaYrKXrNAnFIRIe/O9Z7H6dNn6KYPlzpIxuMUQVmJCEoPe84RqagotUwWptMmCrYph37umXY0eT5+eQwJErJWV3Eq5qI/mVTpkQSUPLSaT0I0AoHI52HRfZucrC8smPa9zQJXeMTtaAQUGT3okmfSiai5bgbQRwHVm632owh8iFrQiICxnDZ3BxxdEPURMXm7udeuwzXExkwNeI1B7ykRHRe5hzqlq11AmfHSXDtaEHS8JdpgjF1eVwOdmqMw3kq05ZsC3PtHZSI5YoYrLPDNCGzL9SHMoU1Q2xfBHwMNcjzjbaJer++ZrhMXh3ZdZ9dUB/X1IfJ9xSwPUusK3ma/8sx1XRWFwUFMajjvP5mleeJeN335iJDnXZM3uf8hZ7OePDf5V2eDWuMfVjILHEVXV9e+IzGeg8itp8/M8qzm3PGwlClzBtKXLfP5vMxmszKXyzURnj3ZRJ0xOSHD9FL78ZnCnh41DvKceToIAjq8PFkoFJRgeHVMhndvyfDl9E7iXPtB8y8RPvTn5f5tUR7i38WUJsi1Ea7ptZRu8472F49EclkJx3enAAAAAElFTkSuQmCC", SE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATZSURBVHgBpVZtTFtVGH7ObTugvR3d2Bh0bnzJNhggSLZhppYfi2Y/tAYTEwwaZzaMMZmYJfs1lI0//tBMM3XJRmQaTSRGIxpAxQ1BnE5WxnDiNpAvg6Xjq1AobaH3+J7LvaXLYJnxTU7OuafnPM97nvc97ylwF+Oc26i9Qa2F2gBftiltroJaKv6riU0awL1a7WpEbAXwV6mromYT362uf1D/Yz/aqPf6QuqaVLsVedsS4CxOh6PQrm/1UjvOGHtnVQIhhwauAr/5oQtDo7PYskmGOc4EmZqwWf8C5uZDGBiZAafvL9/arxJqVkUkx+8g0DxX2avPdOC9umvYk7sJRqMBieviMD4dhKJwMCbW6ps5/IFF/N43jpdKslFZvkuHe00/CdM1p+6KkKX6bAdOf95DHm2AhTw2x5qQlizjxvA0gUvwzoZ0j3TX1ObquYXDpTmoPLRLl6uASAYlbZWQxtbdO8FPnHEhaYOMuBgT7r9vLQp3rMe+PUnYmb4O9o1mgmKYC4ThDyqRNhdQsDlRhtgrpNXiVysGRs37F8RHyZHvGMhLq2UNMrda4XRsQV6mDcGQgoT4WDT+4safgzMkSzg6cOoJDAYjxN7qsy498MUizcUJntKDOjTqo5FEukuq7ml2GRKJbo41In2zjHS7BTEmiWIBlUTo7w+G1fGUKp1EOG60d47o9BVEC6cY1bcOwWaNxUabGRYCTLULmQx6Aqi91WxCToYN8wQ6MjYPn38x8ptI4RiDwl/J+hVp4z6K7REx7RAE+WLUfXOCFi1QEH245Q0hXo6h9DQjN0O9DpiYCeH7S2780e+F6/pklEJcJdy9fgCnihqZPW4aGBW/qwSpRi0gGHTPQs1BCuIMeTYy5sfpL3rxxMObkbwhDnXNQ+i8MUngU8u5Q2lrNc7jZOF5/mzGNaYQWdgoA+mP6fwqQZSxSNx+6hrDjpQAunu9yEpbi95hH4Y9fiwsKpHVB7d1Ksfy26R4U5DBJINtL+HSzjLGTZbIGkEwKJiEJBQ6RF/u60M+GCSGQChMpybN5xbV+RTZi/cfasTexL8lSAaO7DIgpwwsdh1DOEx79OyHN0LgKExGd9+UdvhlkjDJECQCAR5vCuBw9m+8fIeLyWZyaFsZZ/kvMqyxqrGYpkz6tGkAievN/IBzrQDpEgStImedjhScquvBSuaZCmDvpmG8u/tbJSNhnrGsUiCXvI6xqZ60k5w1X/cpLZc90vRsED98sF/3sJ6Jy0ADNXL7Xm5Ea6cnEmxh9jgfP1bQxkszexkynwTLex6wJDH3+Dz/qGGA1Tb0wzMRWDo5nSIl2YK+r57RfUvTa1GLOEVrp5tImtQbKQjKt7uUo7kXkZD3OCMpsBiTiIaLbtTU9zGRBLebIFBw+RMnHshUK+s5qkUH7ih2J2qu4LO6C/ztogt4pLgILPc5/NwH1tzh4bXf/MWmZxdWEHHJ+8pD+Xj9YIEaXGjFLrpcV1B3UozHupp40LwFH7cH0XzJw9qvjmF108ELCDxfn7y9XEeRVGGpsuLqzUk8ffQ81ac53M0cDyahkoBFr5l41ar0j5WezAqNZOnJ7BylOjVMF25y6baLH+Q1eJQAnY6t0cArPpkrH3rp0T/H791a+P/4d1GhAUxFAQ5oc1Vamq9q/wKJp7lfzxf0DgAAAABJRU5ErkJggg==", kE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQKSURBVHgBpVZfaFtlFP/d9KZJa2rSdJVmxZKNCpZZSUFBWafiqg+WYUH2VB+qggo+GKfQgoIpDpn4B19FoWM63YMgg/VBNpzSOMGqjXSbwtq11rGkXdskS3Kbm39353z3u+ntmo5uO+Xkfn/OOb/z7/u+ArcgwzB8xO8TnyWeM9YpKdfCxEHcLrGSNLBdGtsKSKlh/E36RIh9PI/OTmH8wgR9Y0ivZYVMh78N3Ts70f/QPvTu7rFUU8SjiqJ8viUAp0MaF4Y//elrLKTiuM/TAl9DE+5xuYVKTl9DrqBhfjXOSjg+9CG6Aw9YZiIEMroJQHou0I+cHsMX577HIx174KxThZRCfwb9sYJRVQK0Qh4X47N4+bEBjDzzkrXzlhWJYuWcPlOcFjb+5W8/oLu9EyQkjQoEtLor0MoUQVGxnKqixf7/F6/vPWiBcLp6SH/eIRE5Nb7pq5dw5MwYAt4WrJV0yQWslXVoxTw6vVk82poRY83a429RR8DXKnSjl9lPUb8xHqjS+yGeDB57F3CQvw4HGdHJa3KPomhyGjgUyqKvXRcO72l24bOYBxkZCddB5VQ6zPSeek0U/iluc45gQBT1cgwL6QTbw73qKnmWFyDs3ZKm4+O/VGR0HYlsAYcnVSzSmkYyVqTNzqRIaXQuZkXBFCZYPM+j8YsTwlvmgHsZVzQHihVHtQZBTxGDZ9zIlRTsbMwhtqyKEvJ+Ham1N6xIfbYVtdr3SZYK8Wj66oxZcfqpdxRw4P44jl3yU8bMNEwmDOEh02yKa1syhSk9A8EklrUKTV0CwxZB0CELIvpdIBD/uliPV7vSFPZ1ZKnfcwUzXdySduaz4HVm8PbDKVxIOquNn85nNwDYjoTp4UJWJa7Dd31JtDcWUaqUBBdtXKqUqW2LONG3gt+X6vEfyW++F0TdMc8Db4Nnw8YbEz74XWWMP7eCVx7U0NZYqe61uCoY7skgOnBNdNgHfzZt0O1oDljDlCoBgr27QzifmK0KcQQHT/txfH8SnzyeFqzTIcuXyZl6oyrzwo9+8bUT31OSYhzBLzzq79qHm+n8qhPPntqBQ+e8mFxyUjtCgPxxzYmPpprwxMkdmLmurivIU22zdVLhw0CDJM8OfBVGdD5WbbfbIjZOHdXha8Pf75ywVndRFyp8b/zMs+H9Q7hzMt3/ZvCwtXDUfhfxDZXq3RXC8NNDwpP1K3ObtolZtzsg8i/eBh4IAEayFkZISIBgmyCG+cM6I0JP0Ki0uenBicC8WTEdn8GL375HB3DR3KxVE4p0bzAkDHP0NuMRa1LryQxLEPPJpMtr/J+oAFxIJYSM1+0RBvu7eu2Gaz6ZtaM2H/2jxvbprHEX/12EpYGkzeCcXIvINt+SbgB7lHbmgZBzsAAAAABJRU5ErkJggg==", NE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANWSURBVHgBrVZLTBRBEH09syvg+kGNRj0YE9ELn/DxoEQDetFwUE+eIEhijDfBhHhkORoTQzx4MCpErx6ARI2JCaBoPAkBg0SN/DwsyGcBF/Y7bVVP9+waPgG1SG9X11S9V13VMw2wjkgpc2k00eiiMSLTMqdt9TQOY7PCQRpgo9K6FpFYBfwGTUEaubxOvutF/OULNcv5eeVjHToEu6AQW6qq4Cs/ZULDNJqFEC1rEnA5NLgCjLbchZyYgLV3L8SuXFhbAyrEifyCjETgjI9RDBB48hR2fqGBCRJJ8woCnblij965jfjDB/CVHYfl90MQCgVBoakQCal+AWdpGcnhIWyprUN24y0D12B2IkzNaerjsjB44vEj+AsKYLEDoQiRmY3Q8C4f6w45JPr74L923ZBwuUqIZNQQtNJ0JfVpEJGzFfDn58MObHMJ0lmkmbTu7YLWqcUF2skwcto7TV+6ieCM0NmPsCXv8jOMTS6hKG+PKomUQgHxHzKwtZaepUs18HUGFcX78PreeeO0y0c/l1jr6Q9hLBQhIBuz8wlkZ/vc3FXJhQfoEnss+rlELJ4k3SKcKfT0hVBRsp+f1jPKRdY63k4oB87450IcuzlvBaYro/u72poX4cWEfiDQ0TtuCCqYoJi1gW+zXsVjCQfT83HkZNmwhM5dZmwImQQSyzEHiWTKi3/TN2n2d5gJ1AsVml5Alj/lHhsVnUIsBvh8gkj+fB+FbixLMiXVYchiJDgU6iAaj3oE3GTlGf1yAZYMwbbcOosV7/j6wihM6lCOKWs/co51KjuTj6qs7O3p/DYJnrkzBZp10JjCHoEVKMV/EWKxso+aVT8T9LBm76jUNpk+4psU03x7e6UxdTCB+mZYW8sgckoh/xLcE/8BhaWl3UcNDVOfu2lR+TlQi8bB5+CzuekmO1Cdvn+6FUdcUxt/iyz9vI5GuGjPSdQcbYD3kdkwujtVU+yRHfmsqruBFUXATMZQfeymIpEbIdE+7MvgNRSrpVljrrhwgjQ1sf59YQjBj1cxufxjzVPLwGrXeQ00n8gED5rFaldmvSZRb/jAzAe8n3qlCCeXJ5RPwLdTAZbvO5cJvOqVuUZm6tJvkxuXLvkP/13Ua4C5DMARbQvSyF0P4zcpn/46Mkp25AAAAABJRU5ErkJggg==", IE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOuSURBVHgBpVZNTFNZFP7e62uHDjNQKMGBEQbGCIv5ETcTx5lEJ5nERBfqwp2/iXFrNf7sFJbGRF0aE6MY92o0JOpCTQTcmKgJGI0IiEGxFPqK5d3y2l7PuX23PxQQ4klOe3/O/b77nXt6b4ElTEoZIj9N/oB8WBZs2huLkLdgpcaLPIDl2pXFiIwFwA/TVyd5iPtCCDiOo76z2ayKsSwLgUAAwWAQFRUVemmcvMswjAuLEnA6PHA8i/ajUa5BOp1WgKZpKmdjIoqF67qqXy8cWL+u0TCdRNKlO+YCO0f34Dl0PTmkAHmHfr+/hITb7DzHSpJ7d0OcPZMn4LMpIfDyp8CvvTyH28PdaKv9Iw/4NQ+0t8O9dLGY5LQ+E62AUxMasgeI4DzC369CSjrw+XwKgCSXuQZXMY6A1dAAlwjSfY/hnd8VReAx7efOqf6DMIjSMA2ksrMlgOrAjNKayJOlBBFZ8NHYXEHFZi5zVrCDe88n+/FJvFcEM+lpUiAw31KzScx8eFM2blCVmbat0pHt7dUq2CIWfWznVu+Hu6qmmMB2p1Bl1OjDp6rJIPr6Pp7e68HU2Ci+CzVh+9EzCAQr8wSITcIkNT6Kz/T0wNr4L09tYtIObg3ZgwqcNCMt55AgEm0ZMQFB7FY2RSoEYmOv8OLhzYKCqRgM+p2o5ayir1dPtZjegWDCGcvNemlOS1ftPjo5CvFZQKbGEXs/AjvjR+uGbbATDiZj71QM0pn8UpM/KV3FBN42ipNaaDqJIfS9nkBs1odfNu2i8xF4NfACres3Ih4fLwk3ULJHZUwwwo0f/NXl9wZZsLIRLbVRdGc6cOdjAu5/VBP/70TKHUddXWtZvFLR3Ky7ccsjaFkX3oDhmYGyBXX17RApG/uyo0BTgBRQTuvnUFWzFtVV9VjIjN9+181nTPCIfPM/DVtwY+RyToVEic7VTX9hlSsQXf0ZjRkX4R9r6PqoWBCcl1pbt+ruLU6Ruv3+DP+NdeSLGQM2Vtfhp9qGJcHR3AQjV6JsN6l0Db5mH3JvT9sRLvxc4ApMFrnVfV0PXyXsEV1FB8jjrGLP2iOF6BUQsJnHTur8q7dBjfEHM+mB3W1HFQmXN9e4qvPFgL15pZnAzeMn9FSXh1n24HQid7PibWIQYfmzelzmX3LFBPwuVA69gdmxvhi8E0vsKuI96sro1ZLJZFImEgkZj8eV27atxnhu3h+BCJZj3qN/VS7fHshv+HcR8QCmiwCHvTF+HkNLYXwBELRL31gZdjYAAAAASUVORK5CYII=", TE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP9SURBVHgBpVZNbFRVFP7u+xnmp+kMlDbUitMFJTYoUIyYGOMQw86UmpgIC0006la7MG6k0oruNcaY4AJWLggmgKsmJNgxMSJOtASJVkzbVCmm7fy082bedDrvcs59706nMAMlnOTk/rx7vu+ce86cO8B9REqZID1Bepl0Wq5LLtgbJu3FwwobBQCbldOtiEQT8PdpGCVN8HqteAWrhUtqlN6KOmPYPTAj/QjFD8Nqe06b5knHhBCftyTg6wjAMZG5hX3tx2HW/iXA7RBWHIYRUSae50DWSvAqc5C0E61+AWvvXg0zSiRjemE08RwnT13Fax+OQxgh2NFdsEJxWKaAIcpKeW7ZMdixfljhJJaPvAzn05N1As6NXlj6zuvg31zF1+duYKC/C6aoEqBH6seqw5UNo2ECoT1Pwf3qS3Ug9tEIfzpBmOcpkhkdAV9NYnJqCZ+cymDH9jaUXAauEAl5DZe0TPYuhPDnak/4KkoO7Md64FIU1fQEgvydVlcUeP8mL179YJy8MAjEIIIaAZYUkFDgFRTyKxCS5lLvlRWZ6ZRgWiYoGJQ/q1/VIS5zjuAVndTZ2ysqLdnlVTiKwFWAP/1cwnKujNk/BDK/APPzJVy/QeAyiKpMjmRzKqG1dFpHwTLMORji2YWJWQVO7mMhX8G2OF0oAVC54NuLBXSNG3h+dwxb4wbOph24ZghPP2kTgYRwHCrSvCLgvFS/vwj7xRTDpphgP8+u/b3kZ5KOVaoeFolEeEzgYc/jceycdGH9s4gFo4YetwMYbKdvWR9ycRGiWq0T1H5M6wh6rSAhmLlVVN5rqa55hF2kaDx891sNg51RbH0ihLmcjeLtGPoKDhYW8ujsIAgCDwpNqZfPbyBoEHHXCHS2ewRchJeo4Eq2Hc5qBOF4HB3bpgncxHrRYgOJFiaYYaZ42xYaShui0NJnu1iaWkPqBRtLbhSJ6Qz+z8XQTNjaTPbqZb5OkHqmG9du5nyH7uJ47w0bf12v4ddMFOVKAUOvhxBOVBmqKYmx3jZ+57yomhpKJYM9eY9Bd5eFQy9twc7d8zh2rIieXhMdiebgbG0PHtHLC0yguh9HkDqwoyUJy9GhEPp2Nf+mrUQyCdMvUZbzBvULTvkPvBp5d6Al+INEBho+e05vnWnsRW+R5lMHun0SqY9vHpzFPj5C97+Pp+pt4IkiYCa98fE7A0SyX5Ewz4No9BmTwG2/k7KMBZj3PDij8DsrJqey6LePwvLm6pXLo2xwW83DB4Gbb8NYv3cGH9WLZk/mcECifuGyTN2tdAmo/Am59p9vYFCbiDxLT9lhiMhBbdr0yWwRtnr0z8jNy2X5CP8uhgOAXAPgdLDHz2Pifhh3ALa2LLvubAtvAAAAAElFTkSuQmCC", DE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL0SURBVHgBrVY7bxNBEP72zq/EyCQp0iYUSDQxUAS6RPyBwE+gQFQgTA0RtqCAjgYBVdIjCkKFQEpikKh4JCK0ftQBn43t2Dnulpn17vkcY8sOjDQ3t7s33zcz+zpgiEgpp0jvkW6SFmRXKrovQzqPcYWdNMCosjaISPwF/BaZLOkUtw/z22hvbMAlK6tV9Y09Nwc7fRaJlRVEl5aNq0OaE0I8HkjA5dDgCrDx6CH8chn27CzE9DSsZJI8BPx6HZLUKxbZBydfvEQknTYwWSLJ9RHoyBV748F9tJ4+QXTxAqxoVH10NFWp1W828XvvG+LXriN5d9UM3zaZCFNzMl+4LAzefv4MMYqoAyxh9VdSE0htBdqfPyFx4yaSd1ZNuc4TSdEQrJG56u3uwLm4iOjCAiLJEwrWMqlSKbg8Bl5qUibw6OnVfsH9vofUm7dmXraI4JLQ0Re4p3LmNESphNhCGpZgUIMpgnp2YtbIoVJ5NOju7sJaWiKSdybR6Qg9rphJBYFzxOLnD4iJid7ay05DhMDR5YbVaitfL59XWDqLDBNcVgSvN9QHNvvs70PMzFD0gusXxA7TVtYQy06WjqP8pcbSBMtMcI7f/J2dTvSs7TZAJJKygGVpknDIoTaPHRxAuG5A4L3Pm9F5JlAbyi+XAgIl5KDUtrskQvQCs/p+JwsTHGM5Tg+BksMPH5W1CZBLI0T/0hwmvOFYPc9T1ggHXVQvFOW4oIMkEgnidgKCWCyG/yUhgq9MsG0IZM9kHl/i8bh5fcUbjSe5wq0qnZZcw+OUi4PzecJJZmiJazllERBP+Ra3Jicng8kaJ5uwTyqVMt3r4bNoHvqwa9Lp2Gq1xsrCgHNpOEiEDjt1lvELmZzJIpFIjJRJ+Bv20eAsOY3Zd+FkyfClo+aiTpcK13VQJgzMK2aCdnxo5TB4FkOiyuhLXYnrurLRaMharSYdx1FKi0H18diRH4EMRhF96a/L0WVT/sPfRUYDVEKABd2X1ct8oPwBeE4v0HMnM1QAAAAASUVORK5CYII=", HE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANRSURBVHgBrVZNSFRRFP7uve+NJmpjoWgWMyDRopwUKogwo2WRBRHSrtq0CEpoFSUqFW2DCGql62jRzyJaWQaGK9OCICI1ijT8GbSZefPz3u2e+96dGfMHZTpyvH/nfN8559537wDriJQyrLRH6aDSCVmQhWCuS2kUmxVyCgA2Kv1rEbFVwK+ppldpmMZj0xkMTzm6/ZPxtE19pUDTNhtHIuWI1YeMa1xpH2Ps/poEVI4AHNmht+hONWMm4aJmi4WqMoZyi2sPJ+shlZX4tZQjHwzsmYYVixmYXkXSZwZ8lciRuHMbi+c7YSnASE0ZqrfYYNxC2uNIu1z3K8osNG0vw86tISx2nNQ+hoD2ZhlBUL88ePrxI4RaWuFC+KAeC1qOjOT5Pim4QGjvPjgPHyBxN0/SY/bEZEClCec+jktHGVkN9RDJZAG0uHWL+tJvWTIBe0cjHBUclTbYv35NEDBdoMHSubOMGIUqNFdOBowyoP3Vmbjw+y7Lr4tEEsISyg9IFbI4Rsec8M7QyE2MgNXOaCM2P6eiogygAZ2cr+mchGPGrr9GNiyVBJ9f0OVwh4ZMFiRdNHdan5pPryDqLG3EZ2fBEokgyoCkSNNF6uSYtsXcrO9LWC9fGIJ2S/1roZ73eRxs1PE3JZ0GFEkqVzjHUv2xlZ+NOiDQtiyb1b40dN8NmeUoDzYEcvEHWDVH6PUuiM5qFUYWSXXWU6osaVcioyOmEsl8S2ukZEvURmU8niewTI+F1dYeKAdvtOFVcR2Jzkz6uhEpJjFCGUzqxVEbcjiFUoXARSRqhnErIIhancfhNXzF/xBeuDY+UAb6TInYCXhTWZQqVE37VIcZPicCffvxikPg7kF9eZUCziIRiKPtZuoZVzcfbfkbGlmXb+hjJwPjzYKTlj95aqYGFPakuYsuKo2L1jYw+wq8LxlsRkww9q1uVf/91NVvA3U0ATGZCRG9Ct523XeSG8hFSm0hFLh9s9vM9gWYKx6cXvg3K7yxMVz6vhszyeIvWH9Gy2JvrhW4Z42AF+pO4L0o8vgnIP1Y6OubxuO/Xbz/6eLbgqdeNx+8Ur2SzXUChxsFYnXCuK76ZK6RtX70B+TGZVCW8OuiKwBYKAKcCOboeQyvh/EXWo8/1+14eYEAAAAASUVORK5CYII=", PE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR3SURBVHgBpVZdaBxVFP7u7MxOspvsblPT0tZkEzUITRpbo5VEalpU+kNR8UkRoUWffDFifakPJi99KAr6IgSERETsgwhiob41aTFSWpsaG22xNT9rf7ZJdjaT3dmdnZ/ruZOZzW6TSMUDh3vmzjnfd++5554Z4F+Ec54g/Yj0LOkUXxHNn+sjbcF/FRHkAzyoDK1HxNYAf5eGftKEeNbTv2AhNUrjZThWzvNRo1sQ2dCGjU17Edv8ZBCaJR1gjH26LoFIhw+OzPmfcPPkZyjM/g11UyOURAJyXcTzs3MGnHwO+elZEYWuU1+ivrM9gOknkoFVBP7KPfY/T3yMmc+/QMPuLkiKUuHIfYt7lrBtw4A+eQ1Nb72Jtg8/CODeC3bCgpzTMC7SIsBTg0OI04qY7xCsgkkMLMzgFt0yXaDZy7+i+Z23AxKRrl1EMh0QDNFwRJ+4irHuFxDfsR1KXXQZnKLJEVK9BPmZKAymInwhA3fR9fbB/f1Y+hL036/j6TPfoeG5HgE7QnH7JH/1R8TMldeOIkSoIQLk+QJY1AJTS2QbcEMluEoJkfocnFqaM/KkBkLNBG8UEJJl0AZxkzLgy15R5hIZrywf6hiKsymICSejgRco6AkJbIMNKQmE9ymw/lpE6ZIGZbeMUAe9i9uQO2nkJhwt68VqhJM5NxaQ9Im5l4U1d/qM5yCJg5tfACImAXPIT8kwb+mwby1B3uzSrmj1uQLMq4sIv6iCbXPgxiw4C5nleNrFvdM/BgS9Ym6nsJYmJj0Hr0bMEixbh8sLkB4Fag+otEMd+UaGuWQttBsFKJ0E1ibybwKUNrdQpFjmxWtU4r60yPAvlEhPVcVwCy6j3Fs2XMfExY5WTM1sgcHDaG3WcOjOJcgmvTcd2CkDlXXvLOpVBKtEOEmxEJy07VVJ6LEQsiyG3prrSJv1dDcYap6PwrVtWDN0+FNmOe7+1iCyMi2McDxW9dq6kIf9m0G5tygPDNtq0piwVcxKLiRJh2O6KBF44dQCFQSvAo4kmwIzWyZI7OlZtRP3rgXz5F0sfTWPZzfOoV1NY3s8ja6YhuIPWWQGdaR6kqvi6jo7AvOKIBgVVuPhg4DfALj/lhc5wvvjUDsjyH+bQXsdXc9aOpsRHfIjKtQ3GsAfj1P3Y+UYIZsOHwjM75m4DGRo4mn84KvQz/+80iK2KpBeisMZnIeyP4bwoQSYzOCcW6LUZAhJBtccMIuXW0Y4+TC6Jy8GBK0SXWfRN0a8p+PHqlbCb1N9f615kfYfRerdDmXVRulacdnhnu2Bl/1Jd3wzHDwOV/aiFvjNblp00hOfrFkRPCx6Ugh8wa6e97X5+PveIlHR7MQZiGY2TYPXw1vIIUmOQVClsBJfFzy5Ai5kwMdc9cHpp0F8dJCjmz35+lGYM6kVgvuAhcT3dBP4scoqFOD9a8UEJH0+iXfD8/Pj0G+Porh4AyXjjucTUuoRfWgnYlt7adwVhK75yVxT/I/+MH9wOcv/x99Fnw+gVQBO+XP9fpmvK/8AYiWMvf12ebMAAAAASUVORK5CYII=", VE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOJSURBVHgBpVZLSJRRFP7+mdEcs2Z62iJzoiKyjCIslB4ELYqioja1CIpatcmoNrVo3LSIFrUJgsBaFQRCJChtNK1pUWhaY4mIr4h8zMPReTX+83fOnXv/+dXRlA6euec+zvedc+5/7xWYRwzDcJPeJW0i7TOyEpJj1aQeLFbYSQIsVGrnItJygF+jxkvq5n6w9QOG3zQi0OpDanxcrHFuKIFr5w4UnziGlQerlGuYtEbTtIdzEnA5JLgA7r3/CPHBn1iydg3y3G44igrFuqnJGPToJKL9g+yFPS+fY9nO7QrGSyQ1swhk5IK9594DDDx+ipV798CWl2dZaEjLEBbbU7EYIv4fKLl8AVvu3FJw11Ummqo5Ne1cFgYfelJLJdguJjVLFJr8VfCGRcNtHdhw9Yoi4XLtJpJ+RVBLzcVI5zf4Ko/AVV6GvKKlGXDypoW8CJom0USTITJkPqnIBCJd3ahoqFP70kx+hzUZfR+PtJRVIDk4RAQcvSYgMq0lDcMsqmmm5fD4Vz/c+6tQ0VinFq1w0M/pzKb6kCBwO9l6MAR7gdOseRZKk1tgspiZ6MkkbNQPEU6wxaeyqOaxU2yN1jeIBTbeuLEA0rEoaRw6baIu2jg+r9bQ49TNPms6KtcFghl/CmCkvlHxH+IMdrE10ekXC0SAyT9EEoTdWUADtkwm9Ne9tBCF+Ro8gzFkU6Do4wmkUymzrCH6xKV4mEAcKC6P9YsxyGGKnex2vNhXjLdlbhRPpGjGjldb1+Ns2xiOdwRgpNPTSsb++nhkGsEssZ4+Q9dxzvcLyyMJvN+8DEmHDZebhlHVG8nut8Vv5tXA+fezke9anmM6K93rCrBpNIGtIwn0r1oyb1CFpSXKDDskgcd9oArRzq45CU52hIggLuzv65yYT4ronpLyhTN4x9YaurhgOaEzRYGzbPsdnzVv9Vl74qgyX/NB400Oca/92BlEWj/mrOW/RF0Z+aXrUen/pIY32ug4873RLHq3b+aMfjEk5S+fK4hnfBfZZOcSaZj3wXP7hhnNYoBZS8m3qLyMkxdvA88JAmZSAx7KonQRJFZwroCUGok568HxUsOPDibpZPvPX0JyYMic12YAs7gOVBL4TXD2FnBvLh9FUi1JxAkP0+UVoLtlkq5yPu0sDpdLAK6ir8UCnPPJzJ125tF/Zixcmoz/+O+iWgKELIB9cswrP/M55S8hYx+lSeEpFwAAAABJRU5ErkJggg==", FE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARcSURBVHgBpVZtTJtVFH7uS0v5KF+DfcDcKMxFxE0gE+IwAss23TSRxcREozG6xWyJLHaRH2bR0M24zcSE+UPB7AdzSuIvp1GjZjqIJMxMZieD6LJI+ZCEMKDlo7R92/e9nnv7vqXMFmZ24Pace3ru85x77leBFYRznkuthVoXNQ9fEq/hc1Jz4P+KGGQA3K10JCNiCcDfIOWiliv63Tdv4Gv3FdL98AUWZIwjfz0qN21BY9VONDyw3Rzqo3aCMXY2KYEohwEugU999wWGpyexPicPeRl22NPSZNxCMAh/KICh2xOyf/H1d4iw1IRxEcmJ/xAYmUv2L8+147XBLjxaWgarxQIuA5mhKVZaZJPyqyEM/OPBkfqn0PLMiybcMXMmzKw5Kbcoy61TH2Dskw5ca6zDpZJ8cOWOiUYZzKxium/4Fpy7G00SUa4qIhk2CTpIvTLXP4DenXuQs70cVnsmpjNS+UePbGakRQxoQBSP/qIDY7PH3KIfg+Mj6Go+TevysKwyxe9iRvYe4fmlvBqh0TEieEiWRBRlwWbhnduK0FeUw3h89jF044P+/xgbQsPWbURyxgzKs9DHAWHN9PQiSOApZGszXtgftCDoscC+yNjhnpvY90QtIvv3LpWILZVIKDWsYr7cD03XMTU1hYKCAvGVUxA0Cuv2t99DlFuhkUO+STx92ILfj+ZiEToi5L/vq58xcvFH/XRoVpnUNcRtDlk6r9eLQCAgfR6nE62trcKsFwSVwprvH8Qs19EUmMHuAgvW+XRcCAfwmJqBCiUVOmW5iUFxcRva1Dn+ayRkrp8EDofDMdLu7m7TdAgCeaAi3hGMPu/FcywLDVWFaD5jRfvZDdia14vwgALPySzoYQX5FPs2bKwjrPJPQ/NMp5JwHlsYKT6fbxmBlMi8gh3frIFWA7x/IQt1dTW4Ono//D/Mw9Yp9oBmtKholLGmaVhNBMGwYErNycZnfwegahU4cqgGxaU7sDa7H23nJvBC3IAJruHdoI/f0MMsGajD4YhNJkaQ+3gtNrrdeHnfNShqH8bfsmPzyVkcfNKKyXY7spgCt6bivdAsn+QaWynryspK07wuzoGLjBYvbdPr+5/Fur0qpi/ZYmc3u1rF3G+pKDxYy/VDBxgHTwjKo0cBuqZjQ/Eu5BcUC/cxQSAW2St6biKY67kiwU0C21rGt7SkI7/eumLWgkCnraanbIS15LLpLlFoD4sl75a9483L8sssS0HF53a2Gnj8DCxFH5uu8+IuUozOq9R8Yh0cx9+UgYUvpaKqM5PbipTVsKMHmj6UNUfBbGXCJd8GYcRf105S8vj5Ln/Is4vboncbS/Aq3Zm5IMhrIoIm0738uo4jcZFqkZ3Qn9AnaEBkHMYlKnX8XSfttBowAmfpNeY34lVzmZ1ET6bTIJEnnAeuAos/EeFf4IJMOJVsIL0ayNgTD5zwyUwybfnon+d3L138Hn5dOA0Abxygx/C5jG2eVP4Fr11w9puZxbkAAAAASUVORK5CYII=", UE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQISURBVHgBpVZdaBxVFP7mL02ySXc3ba1pabrEblqj2ARa24fSBkykL9YWhFp80OeKmCI+CIKb6mNThBb0RauiLyKIP4gPmhoVbJPWbEqt4A8JGwJN0pis2Z2ZnZ2Z6zmzdyZrNlsqHvhy/875vnvPmb03wF1MCJEgvEa4TJgSq7Yk5wYJKfxX4yBJcK92qZ6Qsg75i9RkCAkeu4WrcPLfBK3wVwIf1dgOrelBNMT7obccCEOXCUOKorxZV4DTIckDQnv+bQhnlgg3Q9HjUNWmIMT3ixCeCb80A0EzsdRbJLgnpMmQyFCNgNx5oG7PXYBz5wPosV4i1aEogsCuQoYI8ucYEiMh1/4NDW2n0Lj1hZDuTHgSJcw5NROcFiYvL34Eo3kPkStg3oCbobaRsyUBKSLoREDZvAlj07OhCKerl0SmVanIqUl49q9w5i9Ab9wCVbElLKigFkRqdBDSQT+YU1ahb9iKMsVyamX9LgX1krt/jgfW9GnoGqCpqiQ2AyKFCBWU4Bn74BuPQBHhnBWIaeSraToBwQal9fFnrlPnOI/m82P+9eWcr5JTo7uoGEZTkHvODWenWW9FOtmjMenPZtkr+6WgIrwuPAFXlIRlefD+/gm9bVf09sRBXhxkgSe590nuK/XTOUdlAUO/jY0NyUrupR3YvA+7mAzNGDF3a9mlH2XRK7bi5GGXHRIDTsS+xumKwBEW6OHen/lbULgixNqTPISHkvspVXqlkmQPJx6NyI62n8LOWFc09oSLW8vXMLYwwknHjTtXwqWULguCOWum8qUQrv01gs7Wbpzc+TyqTUixzpbuAGxl4eDDqfMYXxyJ4gtuPhJQo+jqnxz1P85dxJnrx7BQmkU9W7Bn8erkM/hy9v26PiwwzZ0WI15zb+TM3/HyxFO4bc/UBP6SH8dLEyfwx8rNmrX22I6wuxwJ7N10EOuZ5RaxQW2sme+IpeF4pZp53mTnxu5wmOUajBL6juv96Do37Gqo/HLD0zTt70Py0BY9CL5Kxdu2DWJHB1r1BF75tst3x3/weY2r49MfHuy9OKDK7HwW3vmBmQOPCbPREDahJGG++44oFArCHD5XmYu3CGsoU5k7Pxz5cQzHFnfvqr7GU8Euw7vfHf1OFMnJqhIp0px19PGIKIT19ElRHBtbHbMvwZvMRm9ElDf5wPArJZzXz0ansNOdwu7YXkMe7Tr9gCjdf1/gywLOG2erX7zUv4ojnz8RioSnsOuQV6dmDTnbINYzWsiEHl42KyzK51ohuwq8VhroFx6lscoya7+qmpNAXt889r8fhffF5xCTNyBy0xWneALq4cPQnjhG7ZEwdN0ns95JuCbviXu3y+J//HcxKAmWqgin5BynNHE3jn8AwboKhIqDUDYAAAAASUVORK5CYII=", YE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPFSURBVHgBpVZbaFRHGP5mzjmbmKxxkzYX22IjFSwmSsRQbBVMoSDkobXYCy2UVCilL7abh9rHbvDJtlhpHwrSVlvxzRcRryheUDQoxBtRQTAxisao2dXsZrN7csb/n53ZPWqiK37w75mZM/N981/OzALPgFIqRvYz2WGya6qEUTMWJ2vGi4IXGYJysWU6ITEF+Q/0SJDFuO+fOI7c3j36qVIpPUfOmQOndSEinZ1w31tulybJeoQQm6YV4HAYck2Y3bQRamgIsr4eojYGWVWtlwTpMah0GsH1QVoDVP+/DU7LQkuTIJGepwTMzrV69tcNmPh7M7wl7ZCeB0EstAiaTS9RUPoXCDLj8C/3I9K1BpU//mTpuq0nwsacHn0cFibP//sPvNZW/VIQixTh3QhDX9DjdkDi+bN98L79zopwuBaTyIBrFDk0scmLF5AjAa+lBXJ8HNKQCssmjIRpWy/Qthjuqo+Rz/twfTLX5fxtIXvfNbv/mueNd30Fh54OUcpMpiiAkAdKFYOqR/QG3poHfPo5FJHncjkW4AkdXObcWsW9oTP9waHUq4FTU4+qyUbhVUYM6ROFFlJZtqhJRqspR282Cykl/EmlDvTeVEsWzJZzX5vJU+Is8BG3fj+Zln++3iUhJCoosXU1FTqxxciY/Ib7J9Z9gLqGKs4hgiDAcDInvljfK9Z+Mh8b177DtCtYoI1b56/eL0Z8wg9wN5XDjApHJ1iVIoJZtOPG2hnaA8cpeJdK+xh9OIEbd7J60rG+YetvMwvoD2rgVhqhlCJPImwOKUhZClP7/Drs+63jsaj9seMK1v93sVjGybH8YwKl2AoR6hQwGShtFj6JPh+l9VwoA9yYFY2gHBw9N4I3Vu/UNng7rcfWfbkAI7tW4/TmlZq8eXbUTk8WBVa0NaFcDN/ParOojEjKjUub9HR/0bxa++osh+goWcf3H0axLLbN53KTojyhVx4cFNlMRLi1ncKJdQqOwu5flqv2txuAQpx2Cv4YqDHKI/7VzyDSvZTUUDrKQUMcqj6uS5XN8zz7Zq6kWudz4wj3nKZufbYUzpgXQOYM1MhfUPe226+YsZXPImk6a8iSIvouZGN3qe7LhHp4HLi9ATK4Vzh1zd3ADS3ASsUB8kKwywpleWLnoaFbrzXoMZxPXTgJFE5WOvkuqWDwG4HcjWI+hAgJWvHqpbQh2lR0aZg8YTtTXZlxI6K/cDV2Cniwn26hfigW40GnBmDCmSvDxFNemdO4rS/9rap8HFYv8e8ibghGQ4TXzFjClPm0eAQxDhEtu1I+gAAAAABJRU5ErkJggg==", XE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASQSURBVHgBpVZ9TFtVFP/dxwPC+KZMC3PQ4WTZEAIav0YZJdGZSfiYLovOKZtZdGNRazIcRje+YrTZMo0hLpnB8c80LiAWNxXU0DK2fwgLG3MLMxlgHNICo0BboLS93vv6XmkdxRlPcnrPPTn3/M7Xu7fACkQpTWBcw7iL8RBdoilZp2eswX8lfkh2cK90OhQQWcb522ypZZzA9+a+URhNt9DNVtusS7LRpMYiJ1OFMl0GCh9NVY7aGNcRQj4NCcDLITuXHH/8ZR9uj08jKT4WiXGRiIkKl+zszkU45lwYuj0DyvbfHt8mAcpUy0Dq7gKQI5fQG071ovGbazhY6sYDSXNweUT8/Nt6ZsMOEEir7zBle4oSbQrdsdqO6M35ir93lEwEpeZK5A1f9OJky3W88ZwL+euHoNtwHeq4CZTk9MO54IVj3iutznkPNj2YSBsrH8aOGz/AW7GbzB8zKPHWKD0RFAWv+ZWbk6g/1Qd1cgwykv9CWoIF6UlWFGXeYNHOM+M55tiLyPAwevjVLPp+mpWqqvU0/IKZiCkpWGQA7ks9kPt3mguijLSHb1441MHyFljaAizTIroH78eaRCt+ubYOFpsIK+OCvCRaVZKK+75ugmAy+SrAf8JEaXUxELFNyzU6PuYiE8qVpo6M2aWk7sy40Ny9ES89OYDPOnNhmYnBpVtZ+Kgyx7PFMShEHKggxG739U6uurDgksrhvngR7oGrELNzuFrPAcq4ZDSP+HrOujhuW2CTQ9BkzoIq2om8rAxqPLIOySc+FMSebrI0G6zJVD5ms0GIi4O7pp7eVEWQTT6DQg6ay6Wrv0/KLRGwsOjFBAOJEAkOVTxFT+ZOUfWucoidHQRzc4DTIbNTWsnEJLzaAu/Y2TO0MtKMl437lGZrRLkhGB61B30Vzz6RQj/fn0lWH6un4vnvfcNAAgz4rDKm0dGs7sdp5yPJdN+Pe4h1dpxoYtcGAQQQQVJcBBqrHveWzl4RIouLKKZtAkKQ++mtdLzhCHnrsgEtrcYwUL8bP3GAYY4UHxOJ7ToVNTyvpmubDEQ0tv3DNCD4+AS68MFR2p4Xizfby2F1WIPsNInpimjzA3zVoMWayyZE7X5dEGZmQgUNT77WYz1hCNP3GXC2vW3ZAHLV2YrYzwHMjHUPOcbgObifkBCOKZsQ19E6z6+PqYVXWrfhzvxUsCmVmVHZhmJFa+T19d0Z2dkgm/P9ZQyK+pmt3tFzbd7XVnWT4tadhDlHKNIkpEGn0Srb70R2KdnYF2fiWYRVHYZne+kSCIt68d1q2lmQTg907BL+nB0l+Bdq23lGEZuZ72FlQvYytvEMBAbCATy6Iu/YT+ewV9XrLWl9MWxF53J5arZUK/WX3gYuBF7XerZ8wuXFngu0JcZC9F3vUatzfOWo5XRrCqpRW1itaP3Xtf874Ap+OXHbcG0B2Tg2gFViFAlqCrnbsS5dK0XOV5mCXrXlnkyeiXR9871ppAfGwfPotwxgePoPySYhMl5yyKclwPGyT+byWfse/WZ679RF/8e/C73sYCrA4ZCsq5XLGpL+Bt0wdvig7rMvAAAAAElFTkSuQmCC", QE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOlSURBVHgBpVZbSJRbFP72P2NazGksO1pxzlHjeII6iXpOSBSNET3UQ0Y9RRA9ZPVUE0RvU1O+BEX1EBQZGPQUUeRLERRqUAQx2f3BLmpghnnLxnKuu7X2v/c//5SORgs2+zJrfd+67H/tAXKIlLKQxmEarTS6ZEaG9VmQRhl+VthIA0xXmicjEhOA76MpTKOQ9+2R92hpe4u7NI98jiudsoW/ofKfItTXLULgv4XGdITGESHE6UkJOB0aXAEfa46gpy+K4rmzMGd2Pnwz85Re9EsCY1/j6OodhaT9tRPrFaGWMJEc+YFAe67YG88/xJnLz1G7rARer0epCcE6cGbbWOLLeBLPXg9g9+YlCO1abuD2m0iEyTlNHZyWxqaHOHvlJXk0T6MJrSW+z6VZqBF52Y+9W/9FqGG5SVc1kXQbgmaadjzpHMT/265gWcXv8M2aYRNoYGnHodfSRSfZHp+j43jxZhC3z200dWkjgjVe7f0OPtly4BahWIRrUegpG0YY2Az4j5FIeDxeZdvYFDEEdXzN6RSbTFF7PkRpZWFoNI6CfG9WBO6iSZf3hiSWSCrb9kifwtIkQSao51VLe49tTqAfR2KY6+fCCqewOkeZvROATaKuMEXAii1t3YYgwARVvHr6alB5wCOWSGOASGYWeGgntJ+ZKkhkE3yNpZBIppwY73b0mZ/LhNQudLauh0j1wmMJWFYmMVwP5ZmOIDs7XJG0IlGVSAPptETK+wcW191Qat5McsUktzFtW+I7110ikP2zO4VM0M2hbG1qwNPXwzqPAotLZ6O7bwzraudjNJqgsPuRW6RzowI1JbgdUIcjliagoixw9MoX+FC7tAj3zq/Dyb01WFk5D3U1xZiuVFY4beMxE7Tzqj5Q6njyKRrD9g3l+PtPH/WhfOzZXIF4Mj1tggwWWpjgtIkgUDMffl8eVpDHxXMKHAMu/NJFfpQUFUwJXkrRO9kArlt017lvtPEu1FBN3sdpJHDjfq8dD6XswfMB6qBJ9A+NTwEvcfX4WrO56O5FZdDN7uiFDvrcH2NVVTFGCXRJuR95HguXbnblBGZPQg1VOLSzmg+ym50mCdJ0iteGhO+b3zdDRTQ1eDWBV5nD7HbtIgnTxI8OnnQOYcvBO9SfxpBLuG4hAuZZC79qYbOZ6MkMahL7yXz0gfrUO2olQ/RdRJVOIUW1mgDrA3+5gSd8MicO2n70L8rpS6v8hX8XQQ0w7ALs0mdh7vm5ML4BWOwfaXyQzNQAAAAASUVORK5CYII=", GE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ9SURBVHgBpVZ9TFtVFD/3PdaoY6MlMkD+sHFjmwkBBBxsMCl+xLBkE7esOok6k80QE6VqNmMMtuMPXSVGzDIcJjBscC4zZKCGZKKjTjcTqTAcfoFII5kuY9LSlrLS9h3PLfd1z8o6zE7yyz33vHvP75xzvx5AEkFEPcFK6CdM4DXxCJuFYIT/K3yScLBUObpkIhpYLyJUpV9EWiiIOUzC1p+QlSXRH0twbqXGxvXBn6e8RXdnmEl1EzIJBkKqGBogzBJ+F/2ThEKh2xhjB/5DwCOnppnrc2/Z4YPjLrhY/di31TvLOzYVZl8SY1HTqvM50QihjmAV9heJpDlOIOo3RNBfaG6HO1sPgpyXB1NSKny6Ij/429qyrnf3VzggubgIFkHiJdxDJG6V4Cg1u6dnrrqtG/Ya7Xe4QbpteTzMC7psOJRedan84aLX6sx5v2gyiReA4COHP/J1Id1EcFK/ShLR7+ajWj4eeYbRPIljbg7kYDCGfO84tE60ZYU7HW07nuva1+McXS5KoyJISBFkav35RtBLpNQIg7OhzeVmFJcky8DSVkK0wQaRF+pBIiPHnsunwT7cUtP39omO7S/1VgvHKqZjNWfMyX0JnxbO+ojo9CwsCoNoSQmwDaWglJby8oFy8U9g37tAGnRBDgbB7v8o59jfv765bevY5rwHSxvfqC+bpKkeTcl6RJkqeQbq9jqvfl3W1QVKVjaIiABy10DKN2dAClLZROlqL38NTaPtWzydH55LK3//WWY2z2sInKI18gz0ojMB6sL5ZuDWR7cBrl4NwTDAqZkVZLwLkPENAaAwXMgsglA5dV5SbvFb20JVT0sFZdvDwy8PiV0UJ7iuSOPjsZM1YNgCB/UPtFIyxyESSRi10GfU4jJdWqIPTuDmTLBwUr3aj8qqTGBXrkCjpxdmmW7PoZWbz0Rde4/BjcUoWq+WwETojse1Yyco+QUUggxS72fQdLZbVlBxHLn3iDQ/UNd5A4Jr60q1tKmXGpS9Z6xf9xSG7q/EwNgoBgIB9Pv9GJicxPD6XAxlpOOrax+PyMWtTyTzrrkELXwXNQu76UTjQyauRDduAtTsItTrIVpREdsCr3tOyft8px3XIxEH1yS63XR+GK+7M5bX+ttjl1XKl320AEp8EvP5QB4aBB4NPycN3s/lJ2e/c+iKWxYjOSnaDn4XxVnVN+Cnd9pxflU6hizPY/CLPrza043h2l2okC1K4N/mqFSBDAO+kmuOyEWHazXRWzVvgzExNYv6ckSb7BjhDtcYUcnJRCSd498khhjJfk5ScniXxjku9vCoJLb4kJEfMFpcEHOoaMD7nDxECBJBsGYrDg2Ma3yjTeuTLUKi3umxE47nzsInX/0Bw2PT4P7LHxujT9XBfUVZUGlaB4aNxepUvpYH1IcmqYg16cClSz/exN+F+rhrfwQmhI2XVJ/Mxz9EtPQGB0YKUgAAAABJRU5ErkJggg==", jE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMhSURBVHgBrVZNTFNBEP729bVQEVoOcFBD+LuQQoLBE5iIXjCcPHlVEmO8WSHGI+XgwZgYzkaBaOJV1ETjCUz8OUICGDSaIlVPCkWpxfb1rTPb3ddnLEiVaaezb3fn+2Zm9+0W2EGklFHSUdIZ0qQsybrui5M2o1JhJw2wW5ncjkiUAb9IJkEa5WfnxXPknjxWVm5sqDlWUxMCnV0IDQ7C7j1qXNOkY0KI8W0JuBwaXAFujd+ATKVgNTRA1Edh7atRLm5mEzKTgbv6gXyAmjt3EYh1GZgEkYz9QaAjV+xb168hd+sm7J4jsIJBCEIhJyg05SIh1S/g/sjCWX6N0JkhVF++YuAumUyEqTmZOS4Lg+cnbiPY2QmLJxCKEP5ohIYv8nHbpQn5+TkEz18wJFyuw0SyYggmyZwtLC4gc+IYgrEYAjX7iwSlKEpMuu1lQc+F798ok2WEpx+adZklguNCR5/kns2eblipVdgxip4ADAF8GUjpFZU+QreAAg04S4tAXx/23X9kJtXb9HNKLerbN26htdVFWzvcxkYhqfZSowpVev9+kObrlcx1HOnSZmCifDJpB1taeDDOGcxQo3+DtmA2m4Vt2wgEAkq9ncDl0AttrC6tZ13XRaFQgOM4CIfDiEQiqkxchW6VAQ1YlqXUAHnx+oCM9Y/7A2H/fD5vupq5ROqF4gh40C/lQLYTBjfq82u2/BP89l/EEPiFCVZUQ5dmL4TXUUvaIwiFQtgr8RHMc+sZaf+XbBDD99KOsAI6k0qzKS68pJ109XSt1VGrqvOACfjMGG1uqIII2Par9znCtionUOeGi0P1FjoOVJneaXphBZ8bs/w0cjKqJ+5+9/gzYJk812g6pvgsMrtoiDTd215NJJFSRJVErwKMIHZQraW6G7ihCJjJdHAWIwN1xYj+SiI9ZR8vuOLFs6Kwfw9EJsjwpYOlTzkMTXzFxzWnOE2Ux+9tC2GYgHvbq/zgCfNQ7sqMaxL1hr989xNPF7JY+pxDaq2g5tSFBQFXY6Ar7Acue2WWT7x46U/J3cuM/I9/F3ENsO4DTOq+BGl0J4xfdWjwuTJTrWUAAAAASUVORK5CYII=", KE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAO8SURBVHgBpVZbTFRXFF33ztCminHQ1AJqIYialIaC1A+x7a39sLFJM32kiU39qFHA+CFolMQoMiT+GB8Yox8ajY/E14fGUT7UaAT90PhChWBQzFzkpUJgGOYFzOW6951zhjEigcxO9pxzzzl7rf04jwHGEdM0HaSVpLdIPeao9ImxMtJMTFbYSABMVI5/ikgZA7yUGhepg7+fNHfjq5QkTD15BOHnzSjsXobM9GnIXTATzp+zoBWkS1MvaZWiKPs/ScDpEOCoe9SJG/d0/Pv9dMytOQvbwoW4PrsQF27q8AeHEQgNwdPhg0lrL+5ZYREKcRFJ1UcEwnOL/UFjF+48bMO6KR4ougfdy//E0bs+NL7qg6LwWmlsIhiOoKGlByV/fYOK4sUSbqOMRJE5p6ae0xLevQvDOd/CPi8bKoGrhUtR39KPYCgCY8TE7vPN0iPpmqWPmt5h+8oFKC1eKtOVTyS6JDhOzf9GYwMCv2hIysmBbWoyVOGBWIQh1Y7lqesJzozLrcn2GPCHUZ7ajl83/4eZc2bxRC0RLFOE9x4e8RfkQW17DTtFoFIuJIFEG1bsWJJWCnxYuGgU1Oqd/dDyZ+Hivt/kbIqdfv7gnmEYQEUl1OI1UKt2QrWrUAYCCC35EQ2U+56+MCKGidCRBphx3kuSweEIfIEIrtxptzaI2F1l7KSTe6dqXqCpPQgbed7k6cext18CrTq+WPUPZiOIwzUebDhQDz/VggvLys5nTQMCYQM93iGKlODI3l2rSw80Jsjj3umrrywPOBu9vkGU7r2P35vmoa2yGulbSnA5oxHbVuciRMCBUFS/S+rHCt9TAh9EaNCIbczb9V2SIJMJrAOld/pHC8r5jozg2r0OLN76GIeKDgIjBlZVF5G3Ue+5dbfasKkjy1orwTkC78BQjICLbCUy23kOrW+CYpGKyYsZK3hG6hS0uFdao4ykc2d68ufCCQWJCl8lQrwxAq0gLeZIopI7P3ZtPGGCOu45tQwkylAy14vsGbY4LLiZwLozOAJtUWpCJANhE+lzUkazAVyiA6vwvVHLXxVF+UgkgjPdDlSX/yABTvBdJLfLalKvtigtSiKP/4QluoPYNnf+DN4l1tvAMxYBM8mBHWvzaWHeJEhGwdlWSJXA/OjBcVHDjw6evujF3+U36WwExoXnulWszYurnwXukh9jPZllgsQ64XWP38Bd9xrPXvZC7/JbaxzJn+EnAnRqX8cDj/lkjh109NE/YU5cbpkJ/LsoEwB9cYAeMeYidYyH8R4rtDd9nBncagAAAABJRU5ErkJggg==", ZE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOnSURBVHgBpVY7bBxVFD3v7exn1ng/cWyUj9ECAck4oAASEhYS6WyJhoYWgQSijIlDS9YFXSKloYzsig4JGhMqOwWkjCVIIjDBVvxRPvZ6bCU7k5nZebn3zZv1/hzZyt29+/7n3M/MfQs8R5RSJdKLpPOky2pPts3cJGkFhxU+ZAAOKjP7EYke4OeoqZKWePznUh3XFnepfYIdN9J7hgfSOH0ih4kzBYy9kU+OOqTTQogr+xJwOAy4Br5ybRPrtQBHCxbKeQv5rNT76l6Ex34D9zZ9OgPMfjOM0ZPZBKZKJNNdBMZyzX5p7hGuLjh4/1UbaUtC0Tb+qHZf+RBcIrqz7uHzj0q48Mlgsvht4olIYk7NTQ7LpblNzF53MDps06qMtwjRNEfo/QkBfyMImli8V8fXHzdJOFzvEsmKNIwcmtLfax4uz23h5VIGbijgBqQh4AWI+6R108ZrgtbiuWN05vJvNR1ak78ZbZOxfpkHH3z/P1adCKMnyHoZWy8S6000lekp40H8w/0Gbq16GDuVxc/nhpNQlS36+ZR7/254UWUA0WtDGQwVpUhb1l5Muh+2tjywhKFUR/MRosjHykPPqgzleHqSPZinztmdnR24rguLgFOplNbmk0BeBN4DRCpAKPuQ9h8h0/8m5w4mhwQcodFoEFEI27ZRLBZ5aYHjcCa2IKSoSK0MmBxm8etrkCkbS34Bd4MsrPwreLp7p8sfPsfngyBIpiqWSYi2QErZHgBDIq1+OPU+3Li/CLWdxrF3juNIvtJmBIMn2jKvCZobWts2y2QGN7d+xHv2H1iHhX+WRvHh6e96etDpPeeAn6BKrVbTC0mIWom83dt4uNuHbCYFJSk/9OwPFPOQ6XKbt6ycB85fuazXHI7JCvcymQz2k1zhLQy+VEMp5+CIXUchV28D7xTLagZmkXvXSc9uummc/8kJBVkYW98ZqpGOsdcxjj1QlMsfPuuXI/1g439lAq4ZFyuDWYiUZd246++ViMOIit+Jk2WBkePNwveLJGu5bizwaGqi1Nx4eInf6JmvhpKJ2dZa9CWpM3Yqh/MTRbS+oQe2XhtYpDKjc6nvBu5oAmZKJi6QF1PjByVRTZ0aL2gCI9MGs+vCqSKurLi94asvrm6JtVqIvZrUjT/2ekZ7zUWuBbyaDHpdmZOGJL4y/3uK3/9ycWvDx2qtofcUbEHAOYy/bbcC97wyezseX/qz6uAyr17g38WkAdhuAVw2c1XS0vMwngHMjCa1C/D7PAAAAABJRU5ErkJggg==", JE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANuSURBVHgBpVZNSFRRFP7um+fYKM1YlkGC2o9hBGUU/W6KAqEgIoha6CJoWeREe8f2QSAFRaBE0LagFi1CCRQ1UJGoyFJz+tMo/8I3z/fm3c65c5+OzoyNdPB47zv3nu8759y/AVYQKWUJaRNpO+mIXJRJbWskrcJqhZ00QL7SmotIZAG/Rk2MtIS/7bEeWEMvYcd7IRMzao4RKUewbCdC1SdQWHHQd50ibRZC3M5JwOXQ4ATYgz9d9+DOfkWgaAOMUARGQZHy8ObnIEndqTj7oPTcXRSU1fgwMSJpziDQkSv2mc4WzPU9QnBzLYyAqSYJsTxTUmo9x4Iz8QGh2gsIH73qD0f9TIRfc2r6uSyzDN7/GMFNNTAIVQiZRiBSHoTOVo6eiTxS+/sbFO9rwNoUCZdrL5GMGpqRS1PiTLynstxBQXgjjGSC1Eq1ng3hJiCor1o3occTC/OC4TLla4/1Qq9fqwpJRz/CHxP3TwBUc44+oKLngMVC4Lo4KhPOQf+pLJKk8+PvECg/gNKLD/3J60z6d5Z78z8/ejJc6ZnrtgDFpQJmwZJVkgsfEhlCJpF0pVG4Hg4x2b/HzML1FTzSyBm0U+fY9PQ0LMuCaZoIBAJKF3YCZzP0FIh3cs5A5UnIrXVqDfQawvM8JJNJuK6LUCiESCTCQx2cQS33eMAwDKUMyE7C3zpDz4DXLYs76Uc/JK0Dqs8sSYTns7/jOL6pytALoiLgwSWZq11CUX4iAteCdBKkllLEXy2O+1lq9W1MYKazp7fLawzPXWpz5jKmZSEAhzyqOro02URWHs+0bTuFXMLrqGXK1ARVwWAQtm1nJ6g5D88sghh+Tt50XVQcJ4LT+RAM8C6KUafp2+xn3Bq44RoBkTOTf4lHR1qSXtlz09gS3snViTIV3xlNm9dWwjCFOTjZndotq+WQqQO3aU05CNy3PqHrRvC90cFfDTui+p5ZvUh9pJv2P/BNbel30SXSqd2lh9FQHdXnH/mLnltPvtvCu7ir3gbuKAJm8g31O64rEpkPiZ7Dcxm8gXy1NGvMjAcnhtTNiuGZt4j1Xca49SXncjCwynp7lNpD6eAx/yPbk9moSdQJH/zVja6JF4pw3IqrOcVmRAEeKatLB876ZOaITD36bTJ/aZf/8euiUQNMpgGOaFuMtGQljL9IMh+0fRoDCQAAAABJRU5ErkJggg==", _E = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL1SURBVHgBrVZLTxNRFD4zHXlptJGokGBEDY3xbeIC4kJ3LmXjDhJN3Fv4AVJ+gOgP0PD4AcbXhhW6ILAEEtCFCIkmvlo6Qx/ToTNzPefMve20tKQUvuS093W+75wzd+4dgD0ghIiijaHNoW2IMtJyLI7WC/sFOUmCRjFZT0irQf4U/xJoUeo7jgO2XeB/nOM1uq5DS0sLtLe3QWtrq3I10cY1TXtZV4DKIclh6d8C9Ggx8DwXIhGDSXU9WO77Atf64Loei+baknAxekXRJFBkHGpFrvKdWn0uBt9fFanUlkinTWGalrAssm1pFo/RHK15+PGWmEafEOKKV1c1V5HPfJmADxvTEDt5DSOPyMirrTxOa85HL8Gb9dcwszaheMfUM9HVANV83VpFgRfQ2XEGHGGDpgVlISJqY+olCws6Ig+nOrpg5usELGNp5fObZAGp9Ig6zxaeAPKgaeD4eSYnYn5YGkjyoB2MBWIUTMQw2I9EJO7RNifvQeotJxfgb+EnC2TcNDoV2FkRlfdD0A7POX4Bsp7FviupRZUFIU4CD6g1/2uWfWmRVdyCgpcPb4CapkDZbqMPFxw55n/Pqqm7Bv7cpNa6tcbklL8rdgKHil1WLk01zJ0UeL4bZKULWEkuqqleQz4Q+GP/UNkzXFGsiFKJ1IIn3HD1IOtaJQG9tCocXZ1ImwEJbFLj2JETh8JLHN1Hz6quWRK40dkPh4ULxy+r5hIJfKbWne77UCqxgKYhJJfEOxLg0+965wBmMQAHRVdHD3NJvNVxa9Ex+4l6w7ER3irNJMA7DC1x+5UamkLuTbWLHqOZpDzcNxLkuR8VuXaoL47152Ob7wZqsAApqYGh2CiLUETVb2wt5mANkY9gBUbVxLjk3HXhJCA4WeF7Zk2c1s5pvu+Hzp3Kl43IDSMC3+wVrHt/mDxRP6bgIk+rm6NYdIVt2yKXy4lMJsuWzWZ5jOaqPgTi0AjkpT8lGsecOMDXRVwSpEOEG3IsQWf+Xhz/AS5HPgBrjxfVAAAAAElFTkSuQmCC", $E = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPiSURBVHgBrVZbaJRHFP5m/j8xuokJiMbWSjUUWxuEtlBIaovJQ81DH+pDEYpSUloRitBs6cVCixuKFArSQmsVEeINJYIPgnh7MImCRkGjosZojFFjNNG4m2z2kvyX8ZzZfzbBJGrUs5x/Lsz5vjnnzJlZ4CmilCoiXUfaQHpTjUg0mKshnYfJChsFAM8rdRMRiXHAv6cmQlrE45arvSguspG3fQtUczPwSz9y82fCCpUid8ZS2NPLjWmMtFYI8c+EBByOABxNZ7tx8EQHvvwghPmH6iFLStDwViUqX/8PlohDuQn46dtQtDb0zlZY00oNTIRIascQBDvX7GdabqPhXDe+C3VAXruGh58uQ90FBxfbo9i5ah9yLJeABdkAvpeEm2hD7qyVyJsbNnBh44kwMedocFj21R9AYdxD+ccLINraIBcvxpnrcSTTnrasmLMetuWwkSbQJKRO/AJyir81JByu94mk0xDUUVMd7etAa+NyNLV9hm+ONaPAS8N624a650P0E4Gg5Rtnw84d1nvj8ChCZwLPiWtPpi7ca/LSSASVMth9Nc+sWVsPHxZ6nUKIRAKSVAwmIaekgVQKIpmEUKRIZ1pSiRRZkFo2LCkwfPdvE6YKPuY2dZbxyHUc/FrxJv5auwg/bliIwiV/QESjSJd9gtbOGO73DWkHquQPEP5QNoGcC46T9IchLcKJN8MdOGW8qJH0+Zx7uw+3o/eBj03uLji3+rClZybE3S7krfgCxXIIO5p6sGZzK5Q3SEEnj/yUVuGzJ9SqRyAHyAsKV+yo8WIJE7zHvR0HbyAed2CvyEc06eDnf1tQdXkB7qzfiNd+Wo09M07j92o6ioriT6CaQLESgd9HBGlIQhOkPnkRyDxpCqqze5BCIOBvGIBwFRzXx/GWHnz420X8v3ozbcvDV3+uhKTEG2B4CVLySLk6XIJ+7AW8/iyB4Drn3tCljyDdLp0ojrUYU+NPF3NkPTpSnvUG8had1PPsQafuWdNHVk8S/EmRU+aabixLYBWU41WJmPau6Z5ngibNWrh0ZIXCS4ldVGW6+zkHnOQoj9z25VRgpzOn4QVywBXtW3OQU3rSTM+XdHL43mjkkTU7TJsP7hhMTjJJVrBLtpqpbXwXyWDwNWlM5JdDFocz4JNgUMFathVTdfz126Dn+MNM2QnyQswKZ4/ds3jMOpAN2wZSG2COeXAi1KzTg9QV+LdWAcNd2XxwmyU05KEyvSGRXzYaPGIG4z2ZNQGJrnA1SGU/cARIX6FboitjwDXDgAVVo4HHfTIncFs/+tvU80uDeol/FzUBQHQU4M1gLhIc8wnlMX/wTbitBzYaAAAAAElFTkSuQmCC", eS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQrSURBVHgBpVZdTFxFFP7m3ssihSJgFLP8CCbWH2ilJQ1amm71yTZR1CY+mGjEYDXGpqipb8QlxFRNTTXxSWOpD/60SS1oUiWNwqpQEVux3Ua0prvy061p7VJYdoG9945n5s69rAG2GA85d372zPedc2bmDEAW4ZwXkb5K2ksa4QsSV3OtpFX4ryIWKYCVSudyRGwJ8N3UBEmLxDh08gK6+87jW2onp+elTZV/NdatuQFNW29FoN7vLp0kbWeMvb0sgUiHApfArx84iT8vJnBTySoUF+aiIC9H2iWSacyk5hGZmAKn8Wf7tklCJUEiaV9EoDyX7B3vDeHdQ2E0rC2FYejSjDFhA691FnMkZ02c+eMynn30LrTt3OjCvehGwtycU/OzSMuFU2F0haKoKC+BJtAkuOOH23LFwMWf6JNOxOJ4cPMt8G+oddO1nuyjLkEnNU9Z4TOYuT+AnJoa6PkF0JQHyshxP6PPJQlg09ianoI5MoK8rs9hbNosrPqI4D6mvI/I3NbXgY2NEkGt9J7l58Pe1Aim62ATE9DDp730OP6riEgt+sE8GwYaG7Hq6BeuUbFBn4dFzxr4HiBwkXEtHof9xJOwmp+W/ht9vUjv2k0k48jd8zJYLOZtIFdBaXPzMmKzvx8mYakoWsVck+iZx45JcJ08tx7YhvRzz4Nflwd96EfoR4/IXNv+Msy+tZ+8MYFUijQJNkOaJP37soxaYFiEpSQgIqiTYVL+Zc4pHXZDA/TjPWA+H/SPP4I2OAg91EcrLbnKJAeMTz/x9oOlZsHMtFxvCx3odwmqBIG8UBgbE+cFfO062PUbkbvvTRiHCIQIxYbmtjSDl5Vj7rW9sNbcAYO8lhti2w6JSplGX+vqVY9Ac3vSgD4iZF5Sgrm9byDdstPx2jTBi4uROtIFizZdgtKc/G1h1z2SzNsrCKKyV3i9Y/RXDIyOnOzTZoPSxEtLwS5dAnIMOa8P/oBsolVWut1Jj0Cn4yVBp6bge8cpJ1rkPFJfHkfyxBDSL+yCfvgw2Pg49J6vshKwmlq3OywIQhJs+3bPwOj8AL6Odswe+BB2dbWcm39pD1DmR97jj4ElprMSGAtY3eKiiU2Oi5H5yENgdALcG8zLy2Hdcy/46kJoI79CPzGwLKi80UIrKpDz07A7Xe2Wil5qtnICt4jkXyVihWIr1b8JuSk6SKWieVGxS/x2zu7pH7UZcw/YtWlE0QC3saXeb9x4951iyit28liIDpGIGr6/4PbbtLPfJbSO94dVcbsWgVNN255Zjx0OuBDx8EQXuUckQWrEo4Nffr+CHa98TQ/OTFb4wIab0dZSJ9sM8KA7WOrJbFUkzpN56iK6Q6M4fe4KorGEtCkq8GELATYFKjOBl3wylw7aefQP8pVLL/8f/120KoB4BmBEzQXVMV9W/gGiH07mTVcK+wAAAABJRU5ErkJggg==", tS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOrSURBVHgBpVZNSFRRFP7u+xnHMppER6IWtSoqyP43QbULWlSLov9yExFFE/SziiYIwooKok1UupZC2mS1SAuDbKOLiihIKUsUdEYdnd/3budc7x1HnRGjA2fum3fvOd893zn33AfMIlLKEOlV0lbSbjkpMf0uQroM/ypspB3MVRpKAYkizs/RECUN8f9UKoVkMqlG3/fVGsdxEAgEUF5ejmAwaEzjpNeEEPdKAjAd2jnS6TSGh4eRy+WUQ8uylLIwEK1FNptV/6uqqhSgliiBXJsBoHeu0FO36pF59BDOho2wXBeCnJERL9ImElL9Eth4ErmvXxA4XofgxcvG3XkTiTCc09DJtLDz7JPHcNesAe9XkBchCncjtPsJPH72aUG2qxPuyVMGhOlaRyA9BqCBhhOZTAYDAwOKV9u2FSVCezfjNEqVMmVMJdNaXV2NsrIynm4jmx1C776b3/T19SlDXmDHhhBsbob7rg1iLAE5vwLe5i3IHDwEP1wzBYQBWBmA88UgWhY59LPHJJUXq4T292P+uTOwR0fgra1F5uhx+CtWUuBxWLyJKnKgE26iY+WoOfHsS0cRYYDdKrFUhqZSKuqOwU6OI7dtO5LXbyhjBhc1NciFw5N0xWPAwlAeyNizLw2wjbdRy0/MIU+67e2wun9ADA4iffpsnobpI2ugqQnW929wOj5A0FlhYPZhypdkGQOoLTCHCuDzJ1Ut3qrV8BYvzjuborTWaXsD51ULKnbthPOxA5g3L0+V2YgBmFIl0nUmXiQSKCm01q8OQ9JJlkzF+PiUXBQKA/QY/njSX6sYg/3rJ6xYrCSGinDrViRaXiO7Zy+s0dH8HBeKlngewBz13MZN8GrXA3QmglevFA8glVRj+ghV15Kl8KjC/AULigF0McBbA6C4o0iSd+6S4RK4L1+g4sA+2MSxNTQIq7cXgWdPgWxOWUvivZjoCmJ5zgeNk6y44ObmeZ6iy/7zG2UP7sN93w5BtS+poWX27Ufm8DE6aOEZTs2BY6msrDSvl5tW0UrDdi6vkZGRfD6KtYdiUtgyQqGQpAPHho1kXzej2fm3b0JSw1ONDnMT1VX54cJl2Bcv8VO+2RXuImKuJ+9WvfTCldLXKmdRnue13s36whsuYvxOv3CiNPClo3KRoLPAYZeiyvQuvtkKKodvtShKhjsRScxshfIix8bGJOVGxuNxpVQM6h3PTfsQiGBOnE5c+o1y7tIq/+PrIqIdxAocdut3UV3mJeUv6BmxQ1S24k4AAAAASUVORK5CYII=", rS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPdSURBVHgBpVZbaBRnFP7+fya7NlGzFUsVm8YNgRrTFq1irRWax5oW0j4U6UOtPgqiEbwgPiS+CGLQPIkI3sAHH7zlQUERNOoKohjxEgQvSbwhXthVszub3Zn/95x/ZpLJamSDB87+l/nP953vzJmZBT5hWusEeRv5OfI+PWLpYK+VfCbGaxwUAJRr+8smooNrggyNnb/2VK/tuKgvXL2nX3Vs15m5P+q3LX/q7OZNupi6qEtUtZbiyRLwNho6yRPF/j5cvz2AlVu7cf3ua0yIxxGvrUV8wc+wJk2C7r0DZ/UqvJ03B96dWxyeIN8ZYHxIwJnT0M7z/PZtGNzRgarKGGYlp2BK9ReosC1Iz4XM5WALAXviRFTMboSdrEN26T8mJrD2qBIZ1jwKXty3F7G6OghhIZdXyA150BCwXA+W40CS82jlHNh0JdYwG8U9u6MkbeE9CRWwrIR3+xYKdMie9jVkoUhbgsCVIVFaQLguhJMzKphE5tnzvqrp01GkWPfypbBc+w1BwLScF87//1FGgEXAsugTZPMeEZACTSu3CEFggsBFLmvmDG7UWDbFwSQYWBO3OeP9xSuPmR8/MpJkOg1VKICSNuDmuiIGImVww2boYc6YTIcKJtZNpYwKe9Fi3m5lghaeDb0bVHr5CqWkBTcWg5g3XyqlZdahshCI8qhM381SbsvfCgLR1gPTKSqVInJNiRTeDUrbL/9vTDCHz/V81SDTzUkpLeoWIhGE+uTmKzh51wDcvP8G2W/qJZrqR7c2gytlgJVW8DwPkmL/8C/PFPyE8Ky+5TAGnmf9+84pB2laku6HjKY8AuyD6qBiOiidQu20Stzv+tecs0eHiZLRr72pf9kmRsWzgj6WkuoZoIwoY8tXwCV69tLB0s0pc3DPpgVoSE4eE9YUQnMyCpVxGz81zuDtDCvoZ4L5j3ugTp2kp1SaBNTCX1C1cMkwQHJGFeY+vALrzOmPE8CvkEc/spnugE9wgwm6yZsqpk6Fd/yY6WUWaJozQmDk9vbCPnpkTAJlSkJ1X7Ys3O7ijuCXGyT1rVj0K8ZT7Y/atzWEszhcnaCOEhmanOeVtX6jLxXjtzDOPngo3DpA2P1hT68gz7ACGZKMgyU8KtZthGj8nqec9BaemDZlJuoC3tgp120wtdQPHpRFMqyYwK31G8LtLYw5TBCQdPLLiaZtTGJnMhAv8iP5BWy6BBykWpBqVh8B7wwXox40usAfi4whSSQSPxDd2V2/o6v7Eb6cPAG6uhqoqQF45KZY0hwFzpSCjy3b/+gf0OXbOf0Z/y5aA4B0BLAv2GsPyjqmvQd6EnsusWyKrAAAAABJRU5ErkJggg==", nS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANlSURBVHgBrVZLaFNBFD0z76VpKZqoVEFRav2CH0QEtd2IG8GFqOBGFHQjulDjH0RoBXHjQpf+QNG6cWUX/kCsgm23giJWsK1UK4XSpK1pkua9N947mXmJNbUt9pKbyZ3POffeuTMT4B+ilIqTNpK2knaroiRNX4K0FtMVXmQApir3JiISZcBPUtNEGmfba3uH0UwG6TVrEQSBnuO6LioqKlBVVYXKykq7NEV6WQhxoxRPjgNvpIYnxL1vPfi1by8yZ04h6PqKSCSiAVkdx4HneRgcHERfXx/GxsZgHLpuMEJxy3iObEc7ci0tGlSuWgUxaxa7XfRKSp6viTiqgYEBVFdXIxaL8XATjQ3ZSKTNeQg+MoI8eReNx+DULYNMj0J6vgadSKPRKNLpNIaGhqwPjXZPbIo4rLifTGKMPHKfPYUcHYWTy8HJZojAA3n0h1pwjoJbjnaEnMvRGpOuezpFhukQG5kvnXBePIezfDnko2bNzlUgvHyhIgiYU2OFbdsyEevw8DBqamq4exuXOSd2N1s+bSqOHoHz4zvkxk2Qx09APHwA8bMPTldX4LS3qbDmihx2/6B8XwlKkxf4yG/e4kaW1vFQQnC9M1vu0kX4t2/CJW9cyqlYvRoiPgfo/GziUONaw8QfMoNUCn42C5/I5JGjiF65yhPecAQb9NSPH+DYTaE8ik+fAK5xym/BYwOsOVSp+xCZrE4jr+WTErS32dFa12wI0NtLa0Uh52zn8wWlvMLkOmwNsFY+fEqF6yR9+8VqqnVLcylEmaPt+5iqiBK1wlH16MHZMcyE6CiWLLFmKiRwGhowUyLo3jLynlP0lnSb3LkT/p1bZRe8qneD1w1OMBmw3ZJj+3fJ2kJ2WrhMeZOTPMHbswuCKsAeMCvNuyNo3lMxCXqBYEHlIjzY3mF7l0o6hXzNvmHLOXdBF6PV6Ygyi5o23bVd9wm7x95Fh0lTor4B0pBMD73QHFiRQN3sNfxTvw38QxMwU9hx9jzEVCMxE9j7AytO4eDK03bkssEsPjjm/g5JZOtbpRYvLpKov5WB183dimubH+MgEZSAh69auSczAXN9a5s2vaP/JZ4s7ER/plfPqXZjWD9vC+rn79CtkbJPZvnIC4/+fTV1aVX/8e8iYQCSJYDdpq/JlPmE8huy+/5qdwjULwAAAABJRU5ErkJggg==", oS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQWSURBVHgBpVZvaFtVFP+91yRNkybN7KptJbU17ebm0Dm/2A1x+KWjCI4JanEdyrYvQ7DVfRLBdIggyhRB2Qela/EviCgyXPHD9IN1CHNrwS0qNdO1XTf7L1mbvLy+vOs5N/c90y1vbuyE23vuueee3/l37ytwHRJCxGi8SuMEjbT4jxaUrI9GK26W+JAycKM06AWkVTD+Ak1JGjFen/nnJ4xOj8h5ycxIncZwHO2xe7G1uQubGzqdo4s0BjRNe8cTgNOhjEuDn6bexUxuEmuCDYgEYqjxhaRe3srBsJYxvfQ3n8Khzg+RIEBFSQIZuAZAeS7Rh84exlcTg9hQvwV+3VfSujpWURqGlUc6k8JjbbuxZ+OLzm6/E4nm5Jym05yWYxOfYDD1hvRI09mGACmvdke4TikgDb/Nj2FXYq8Dwul6gM6d19URTk3MNE2kZ39HfegOFEQeBTsPUxjEG+465Isg5A9LGe+Z4L0cGkKNGE4dxhilVtVvkBldef8sL+bm5qBX6eS5RsYoz2SQB/NsfH30fnTf2YMZ4wLJl9V+jiITqK2uk+cYRNF2bnOOYCevCoWCDFknpSvWguu1aZc8jwZuwzNtL+H49GcwiiQrloBN20DWWsS+9ldwYP0hjM+ddKJg6mOAx5kzDIOMl7zPrMyTEfKaBs8Gdc2T8QOYNS7iXOZUyXjRkDPvdzU9hZZwB2oDdbJOP86MOACPUItgM3OWZZUAqKCWMJElkOqqoKxsxBfDPdEtOJc9Jb2XxXYKTb/h9Fuw7SK+u/gFgr4gxmdPOgCtPlUQUrBdAAkoVgh0BbpWhUTtJpm+SFVMArAKr+VP2HIeSr8J2VT0Z8nKuAC6eyHKW7Gs521RlAVlaqpppWjqYNkrKApL7gknFA9igPOSKfP+aprKpUvKdDGeaNmP/6MmekoULboAgUDA88CylcWvmZ8l3928Bzvjez111wYbcXd0o7M8wwA/OADyZjJViPqDideQs65Ivrf1IJ5f9zraI5vc/bA/gh3NPdi2thvbmroc8dcaXwZiFniVyWTw+V/v4cupIxXeWVAnPYiDG97GmkCDK7OpFqZtolqvwTeTQ/h2+iMMP+regzYf5X2RQL6nxfZQKMRtIAOoVI0UtenLYz3YFd8v2zYe6pBdxek7NvUxxudH8f7Dxx31o/wW+dTiORqn/X5/rCWWoKoqaQWUy8YUjvyRXC2U7Qns7uhHIiqfbfltYEa2KSM5gh13PY1eUhTqOb4uidXGe9e5z/WAsnnNByeJ0suKP7NnkfxlHy7lJ6F52SfD99V3ore9n+aHyo0n4ZUE/pArEHnD+fEavTwiAS/lL0idMF02Nrj19q5ywxU/mR6eyY/+UXHjdELcwn8XfcrAQpnBtJIlVZt70r9eC40gt3NUmwAAAABJRU5ErkJggg==", iS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPRSURBVHgBpVZfaFNXGP+d3OQ2oamk7WrjNrduhbGxps6HMTqROfYgE5nbnsZUxt4H62Cwx6Vub3vxYexhsCnOoYiCIigIUqRYQQRNKKJC/4j/mtiaqEnvzU3uPX7fuefGtEm04hc+zjn3nvP7ne93vvPdAM8wKWWC/FfycfJZ+dQK+tko+QBe1HiRBlit7WtHJFqA/0hNmjzB48y8g8mbtmpLjqfmJOMGBnsi2PRmFMNJM1haJB8TQuxtS8ByaHAFeChTQq7sojsWRleHQDQcUivsqgerKnHvcY3XYM9nPXi7JxzApIlkrIlA71yxH7j8GCeuWXhvrYlwiEFDaCEkL1Jks4Uqtr8Txe6NXcHLn4JIRKA5NZdZlgNXSjh53SIJTMIN+VOEqO+Fu4RbJ+AIuL2xUMFX78aIJB7ItZFI5oK4WJrE9IMaDmaWMNhrwpEGYrDwYeIiktF5BZJzXsVUaQMWnV6ik+oHj0k89MUj+C+7hA3rTD4XPr995J8KvftZZtl9bAH5JaEIRron8XXyKGKGpTcvNChw+v4Xyv1AOAJPkUwvOhhea+CPrYlAqm6O4EvuZeeryJcJxjCQ6pzAt+v+ITmE1hDLsmLbK0dQroVxZmGbPg4BpyaUpNlcjbCcILtGWeQd3Dt/ywFowppICTv6/iUgG0LaJAFF4NkN7o+39x5GTBRhE7DtCjyq8lkZCmOSsXz7hAk+4N5MoUY7DiG1JoN+8xaES+ckCUxWdGstG8dCi9icOEUEwEPCc1z4ERNGhqLQNsASKcFyZanScSA2p/OFJnklatulKdAfmYZVk1pBnW3k5aq3jGC5wGLl5fbUIbYyU9iNx9MIUh/x1ua4Ezf9nL9Teb1FAWltV0tDLcD9UqKtWCcY7o+oJ5eKH+FhNYHnmeXFMFHY0vyCFBh8WjauMME57n28PqJyuuzG8efNn/E8O5b7Bnkn2fyCMEbWR4LRCSbY60cQJufQJC4UN+G36d+RrzQDlN1O/H37Bxy6+10LWon+uKDLVo/geFCLxqnZks3X8MtZS+Uyp1xHyMHm7nEMRGfQYdi4bb+Bs4tbUXK7moBVTfI8/PV5p/dWQhWx/YTxfVOxOzhVwf9TVZXPzRnVxqRfj3a+b2JXSt3gerFTCc4dalQN3zXUgZ1Dplrgl025OvChOjjbmMZs+uCk4VdWzBQ97JmwkVuSEPVpYgWhRKrPIPCIKnIN4Gk0rFixITmqSVSuZvMuLtxxqZR4/m0H3xkgRYAjrxmNwC0/mW2iVh/9/XL1Ni5f4t/FqAYoNADO6mdp8mfeyiczZD1xzYr3vAAAAABJRU5ErkJggg==", aS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANTSURBVHgBpVZfSJNRFP/dbVaCoBPECqul9IfKXEHgQ6lBf6io1UsRPVRv9qKzEAyCbQ/50FNYPmtEEPUglj5vWS+RkH8fKtRZFgWmaygp277bOXffnd/mlI1+cHbPd797fr9zzr18d8A6kFKWkPnIgmRTcgXz5pyXzIV8wUEmQa7oWktIZCFvpsFPVsLPoVAIvb29aoxEImqNy+WC2+2Gx+NBQ0ODDuWXASHEwzUFuB0muSJsb29HOBxGeXk5nE4nioqK1LqFhQUsLi5icnJSPff09ChBE34SCawSMDNX6oFAAB0dHaitrUVBQQG/AwWljSqYfBYaGxtDY2MjfD6fpmvRlQjdcxo+cluYvLOzEzU1NcgHg4OD8Hq9WoTbdYhEwlqgi4Ybc8PDcB9yw1l9MNUOS4Uq40xfP0ejUYyPjyMYDOp9CdGa48LMfopn5vfuwgz1/Pm+A+g3ZJqAtTVrYZgSZHIWMeF00M9F9mIDb4DpaewgonvRCA5v2IiBA9UJbNma1nOdcSYSiYSsrKxU7yYmJhxVVVU87WUBjxJ4/Qo2Gu1MNDuL86WlOP/juz1+4YJMeC6KzI22CvFoGAaLIB6Po7CwUOvWM6c6XwaVxw8cKpaXARLBl89wtN4RjtteiJlvaYTZqmBhm82GWCymp1ycmVoZpf7bqEVcgRZSsNMMBcmKCsSbmhG/eg3ZYK2CUVZWpkZbSt1iGc2l/sUgfs9Jo2Ib1gNXYD1dWiCsnOLi1eQm4pevyKX3H4RxrA65wOFwaDeSErDX1SOzq9LplMtPnspYx2NBPnKFRWCI98BPji9Bx3Tp9MnkKSJ7sd9udF0/YoAqyxXSSG7+o7MPbNXl+zn5Fhbgr+Y8L/h76gSmR96i9dQG2bfHLpAPZNJcxdsx1TSiZ3faaFP4uxFSAvd9sv7GJtm3O09yC3ouP9NuN3+L9Cm6SRYpPXJM3DpzV+hs8s3eV9cG9+ZqnlF3AztKgJX0hL++DT6yVGAu5EiS+3Vc8uIJK+60teaGsz/0cxSXXl5D+M/XlQViNXHDjqOKnEcLuT9biBbxmiLJK3P6HXo/9WPo12hKrGRjsSL07DlnJc56ZWavOnnpd8vcEZT/8e/CaxLMWwinzDm/eczXxD9yxBrNHuEvfwAAAABJRU5ErkJggg==", sS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPKSURBVHgBpVZNbBtFFP5m1uvGP4mdRAlYJLGtRCCEZEwLOCcaIQQX2lQIkCoVDqhCglRgTiBRaidUUSsuXCqoVKkgOCAhDqlUro7hEDhAkiNwcPpzqYKSWthOlqz39c16x3ViJ03bF32Z2Z2Z75v33uw8A3sYEUUZOUaBUaK7tu69yzISuF9TizyC/drl3YREB/IPuckzour5/1+KsK5cwRa3VC67c4x4HEbqaXQdPQrzhcN66W3GtBDiy10FVDg8cpewev4cnOvXYQwOQvT2QoZCvELAqVRAjPrKilqDyI8/wZdKaZo8i0y3CXg7d9WrZz/H5lcXYD73PKRpupN2ukoenFoN9dQtdL3+DgKHTunhj7QnQsecm0UVFkVuXfwaft5Rg5gg2yPpCfBfQEJ+kYT1/a8w5RsIffqZDtczLLIivfkqNNHS8jJunJ0hX+xRSN6ZglHbgFD9arX5TtaqMAbqMI93wxgBb2AT/hfHYD/+A+ybv8PL32XXA2/3JfWQTCbhXLuGCwfT9JIhhSA35M0ACW/XYpDD9kovYHP/tT6QA9Qdgl37BwgcRGj0ona018f/jqne/Pw8bNtGORzGe7dWxYlwEO9KiSEp7sZENESM02MQMb+XO8sdlLQFno567U/YlT/gCx9Sw1nlQYE7E/l8HsFgkEXqmJmZRn9/P4Z4+2d8kl6WSsVzp88H8VQQOMBsAz4YJx9hEU52+TbshX9RD3FO+o4j8OoZd9/Kg7TqFYtFjIyMYG1tDZZlYXV1FZVAACeY/E3m/8Qn8ZgSqHLab5SbyRYxByJlQHRz8M7fBCW7UD+yoIcT0J9iPB6nltPXhGEYZJomjfpNuhTsIqs72EA4QFaInwN+srpM2jodp41jA/Qf96uXDjc/8V0FhoeHKZMZbxM8aUj6+4DPJW3FJmNjNES194eoMvXsNoGS6qTT6SZJJBKhq1d/poWF3ygWi7WJxPl8fWcaTptA2E/ViJ9qHxxpXorQl1o2m91GkslkaHx8vGPYNN42pKO9aQo8GabNcx9rgYISyLu9QmGbB3sR7/TmW9NoCDAqDLs4rwWy+s53bWJiws3F1NSpfQtovMW5+Yu9qT4x1nqNJ7yPpREmPqr3TbzTm/XlZUfXCGijRoFRVYpmZ2epp6fngQRyuVwzubSzAFGj/LmmJj4EeSP2nUwnXNni4iIlEol7Equ8qQPSYvlWzk4lU6nn4JVMdQnOzc1haWkJK1zBlEWjUTAxJicn3dazjiVzN09UTr6h/VuBHuLXRdYjWG8hLHnvVEije3HcAdKaT/aoV78UAAAAAElFTkSuQmCC", lS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOSSURBVHgBpVZLa1NBFP7m5oFJE5o0VhqQGqtSpBFbFQSr1sfOjeIfUEHFnRUUV2oKbkQQ3YovdC1WBd2otaDutFVrqQ9IH0Jr0aa1jc3j5o7nTO6kF5qGVk9yMs/zfXPOnJkJUEGklCHSC6RdpEk5Jym7r500hqUKG9kAi5XbCxGJMuAnqUiQhrhtvn6F3NMnqpRTU2qOUV8PV3wDvPv2wb1tuzadJO0QQlxdkIDDYYMrwMzVK5AjIzBqayHCIRj+KmVipWcg02lYw0NkA1TdvQdX0wYNkyCSjnkE9soVe+byJWRvXIdn8xYYHg8EoZARFJoykZDqF7D+zMIc6If30BEsO3NWw53Snggdcyp6OCwMnr91E554XA0KQjGEczXChi/ycd0i8nxvDzzHT2gSDlcLkQxqgttUHC70fUR6Txs8TU1wVQVg2KBCowkBOOolL6hdmP5NngzA1/lI78tLItgt7NUnuWdmczPEyDARxGnVokQAhwdSloJKH2HXgAINmJ/6gNZW+B881pPCbvo5oDb1y2er0NBgudashbVihZAUe2mjChV6Zz5I/S2FzDJNaVEyMFE+mXR7Vq/mwXb2oIsqu6YoBWdnZ+F2u+FyuZSWMoHAU6kUhxJ+v1/NYZVS7wURWBYKhQJM04TP50N1dbUKE3vQrDygAcMwlDKg1JlDksvl0Pv+Pb5bP2HkBGLBOjQ2NiISicApPJ/t8/m87opxmNWB4hXwoFOYhJXJn42/xdbGIHZsXY/O/helMe0Fg2uVcxsVczvZnaVTOHzmdAY9v7KYGetBXWA5AoHAvHllCPgMSc6g2MTEhBrQIXIS8Vgmk8G3zChCviBqEUQ0Gi3rLe8D7184HObuSfZgkAm8Xi+y2SzKSU1NjSoj2YjaD9ZKwglgSy/Xukl3jU8WcOziG1MYxewX8+/BiqIvD0l7ee10qxEPqmP0kAn4zrjQsLKawuJyd7/9Yef80giKB0NiVbQK8bU1urOTDqzge+Mlt84da4E+Pv8mEvcv79WNO3wX6bw8QjrZtilaJJH6llk8MNuw7cZ16myot4ErioCZdMf5oy00sXkJJHPgbGtLh40578FJUMGPDj58nZAHzzwXQ2PpivBtm+pw7mizKh3gCd0o92S22yTqhHe/G8PD7mEmxODojJoTCnixkwD3t9U7gcs+meWdLj76d+TipUv+x7+Ldhsg5QBM2n0J0lAljL9RDjgADl19OwAAAABJRU5ErkJggg==", cS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAK5SURBVHgBrVY7bxNBEJ7dO5tYQuAuRAIrDUgQXnUcCeo00CAqFOAP4CKPMnaJaCgREiRI/ABo0gakODWSQ50It7F9Z8lnhzvfMTPecc5P7CSfNLp9zHzfzuze7QGMQRRFabRNtF20w+gUNTOWQ5uHaUFBhmBSbI0SUkPI3+Ajj5amfqvVgmazyc8wDNnHtm1IJpOQSqVgZmZGQh20glLq/UgBKochh6C4B9WbtyAIAibUWrMRSAh9wfd9Cgpnnaq2Fu4JTR5FCtLRQ1YOrXdvwXu9woS0wkQi0SNCbTKau5RIRI3nzzhGBGhvegRM/brk/udPkLz/oEv4P0vevgP+xw9xkU3ZE8mASpNuH5TgLzrZ12ZBY90ty2ICTHnAugLk43lgz82Bj7HB/h6Y/dtiAaP0kjrNlRdg49PCraGgOCFvmOo9EzxH/rwYG+OAF2jwmI45ZfCUem1SLv/hlHSthhl40A/a2GFQ6Ktdl2PDYlGyIORo7Am1gp0dXoFF6VcroDyvh7T/GW+Tr6ocg8ZY4mgjl8EjqshDdsb6kxoX4eQEAyoDRMNE0D9Sx7igwO9kQLZflOl5EuAXCsplUNCpKYvgGR9Vkh6QD5JLHB4JaGO5REDHVgK0hwrODhUzAQkccevKVbgo6ExGmk5XwMpm4aKgFu5K8xcJ/GTV5WU4L2TH7FOu7yTAXz+9uARqMQsTbOt4ZG4gz5L0vuHRVfSZ/UE9a22DBcSmgcTYX77K0DZyH8kpeoXmUAbaiExLTlCrG1J/vhuowQKk1B1YXQclmeAZH/cuyDx7ILm1ti5TBcM5cOHkofNlBfhdAvd6hi+X/o9cXMC2rPDyQUlT9jHyPIxZVc5c6gy8taJGoxHV6/XIcRw213V5jOb6fgRyMAnMpb8dTY7d6Bx/FzlDUIsRHpoxuh7T4zj+AaCs8yjORkbTAAAAAElFTkSuQmCC", pS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQLSURBVHgBpVZdbFRFFP7m7r3dn652Wymihu4WjUZpJIhgRJP6YNQ2Cn0w+uSD8UGfdDEkmhjCgi/gHxBJTAyxGElME5U0ETDEhNZYpLWEYmnUii6lQKih3d1u7y6792ecM3unuxu6ZIkn+TJnZs853zln5s4scBPhnEcEtgucEEjysqS8tbhADLcq5OQFqFd6axGxJYK/JYaEQITmg+euoX/kKn46N4t0zpI2sdYgHm5vwuYNK9DZsUy5pgV2MMb21iSgdnjBReBZ7Pp2ElP/5rE84kdzuAHhgC7tFq7bMAWSM6bwAb57d70k9CQhSHbcQOBlLtnf7/sT+48k8dj9d0DXmTQTTuCeAyeNl/RcwcL41DxefzaKbS8/oMJtUZUw1XMxnKG2UPDPjk2VMmJaOQdWWSyvGFw5nj6fwpvPxxQJtWutILmgeR7UmkixWERr0MLae5tA7c4VuYArdA6zwL056VjUc0XAFDb3LAtiZ99fGJyYhbd/vTIvL/skTWauTMJlt8Hv9+PImQz/+lQKMxlL5M4WG8p51aZ5ZXCp/5ZMo3N1M37c+biyaKYKekgr5qZh5L6Bz+eDxuew6dEWtueVKNu0rpmbBRcKeaqoQHBK1XmVpExHtnRwYk5VQRIngs2k2eZZQG9Fgz2M0Px2ual3RQxs6VrBDr99Hx6JBtzcdUecIKcUvFAiMoVOxNeydmnPBPpHZhRBJ7UoRT3L//MGWOE03NAzsBtfBDdWSZJKOTw6h71Hr2J6tljVpXzRgWW7pQ13XayJNWL0oyfpZ7nJ8oOCdUUGNIq/QLfPIrCwXxgv0AmTMPLf46WHBjCw7UHEu+5ES0jnVE1WfA+Ww8sHXoxp01L8MV1plKy00cJw9A5wPQrOGhczdX2tYt4Cls1i62Qf3jvey9j8fLkSD8TlrFwptDG5TgQXiAkNbXCdMJhxN3zOeViBrqr22MYGGMd/4KFdrzHt0jRqCSWptbWpabpMcHsPLPNv8OB6GPavVU6+4VMIfLoP+sgwQx3CVncodYwIBgWeMoJRFHKXRCva4eqrZCbUgsC+T9yGQ19p1R9AbSErvbtbTfvpFNEm00lCJpOB4zjQbJsHvjjAAgc+58hm68qaAstzJPpvjI6p5XZNnBy6NwZoFgqFoJ8ccsPPPc38ez5GvcEVgcz+y0Nq6WDlXfSqQNowDIT/+F1jly/jVkQ1T9v6juq/fBuqjUrPnxTnw93cWd7CXQ/8JqDfydb5YHflCxdfOhPOE4smE+Ous27NDURuBWTgnhe4O/RzZfBEZcylnkxil9e3nJ8cAo4dBSbGwS9eLDk0ibdio7gKurrBNj6hXJd8MmtVQo/+QV6/nOD/499F3AuQqgiY9NYS3jGvKf8BmZrGK0hqtsMAAAAASUVORK5CYII=", dS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKNSURBVHgBrVZLb1JBFD73QYGQCBpw1wbXmljTXTFxLYlaf4K/QEw0XUqX1Y3/oDXxD7jRZTWxrjQSH2uaasISCCE87x3Pd5ih09tLBcuXnM7jznzfeQwzJToHSqkc23O2A7a6OkFTz1XYirQosEkTzIu9WUJODPljbqpsOYz7/T71ej1pwzCUNb7v08rKCqXTaUqlUmZri23HcZxXMwWQDk1Og8GA2u02jcdjIXRdVwyAEK+l0Wgk43w+L4IaVRbZOSOgPRd1EHc6HfEOpLxBLOKMGMSGwyFlMhnKZrPm8xMTiWNyzs03pAXk3W6XksmkkM4jgBYRWyJI1y3ec+Tq9UhNDp7Ac4QLYs/zTgnYZlJm1iQSCdkLIV2/PYlAe1/HoNFoiBq8NwS25+jD22gkiAIGctSrUCiYz5cRwZYpKhbDI0MWRZTcFoZhLwqvowAqEHiAHo6h7bURMKTRNk7Q7AeXxh0IrKOH42gLxBHZbVw0pjbm+DKKPukflOIfE9ScICAnkvt/AStdYsGQhXm/JV5EkWU02Fgn989v8vSG+el1lNoC/hOsrlLqa03m4fSR9C5laVlw19ZMtzUV8EolWhac6zdMtwaBj6JaLtOy4J9wvUUNUOQmRuOH98n5fDgpNi0G5B93bcj5T3ypmelrLp8W3BsfMPKebU+Lpf5DAOa/fmOm9u276BFby9kskatFFiUH3KfbJv/yNpxeNHn+BMHLXRVcvaJCbeocw3esDV7s2i9cJd4TparTJT+/q2Dj5hmh0DIh3rqnwsNPNnnV5ox7MqEu17eMuej0/h3Rrx+kjo8nG3Dnb94mulsmpFUj9smcFQke/X01Pw7UBf67qGiCpkVY13NVfcxn4i917iVThT/P2AAAAABJRU5ErkJggg==", AS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASTSURBVHgBpVZtTJtVFH7u+74tXw1tB2Ng+WjBGQbUj6D+ANzHD6PWLSOaaWKMc8YsZj8cWZxb+EMbE6fR6GI08QcJC2j8Y1xQR2JiVrYAOrMEHAycmbR0KhuU0gothb4f3nv7vqWTojM7cODe23uec55zzr23wL+Ipmk2ql1U/VQD2ros6msdVJ34v8KMdIA7lZ7NHJEc4EfpPy9VG5sPBobQP/UtDnaPqK5gTGBrQnU1xCY3zB4PpJY2wzRK1UcIOb2pA5YOHZwDv33hfQSjIWyzlKF7tESpUQpFZqLGl6HF41BDM9QGKOrtg9joNmC81InPmAg5Iofv/Ck8+8WLMEkmNGyrx5YiO0RqJSQSYCoRAsligamhEZKrFvHnDyD53rsZB6w2tzHQ8zfK0uLzn8Inl7rxwD1N9FOS2fXpoKA4Y+AMNPqTtgMfq3RfamwUpsOvIf/4CSNdD9GYggYDlhrb2M1xeP3voKK4HAk5SXWFagI2KQ65dAmqlgBZSbMQVlYgJJkm06wqKpCiLOSRIej16+Gx6dEH2MT1gRvBWIhG7+ZRP1e3hmqLimuLIo7JKsi8AOUvoHjYDCnMmKQZMj4KpSNfnQBaW1F49hsjQ3bGoJ0XNTjEwSEQLKxE8Mq9i/DAhbzz2/HIj7WQA07Y/NuxulyDxBEr1griPHLGiLOKxXhB1eFhgwWTDra2n41YK/IdNKidjlkcbI5ix/QMDtyag2c5D/Y6E2A2o9Q+Bi20hBsvhwEGHqfKHC2EaWyEFQnKwIDhYJdE/zzIRiz/HJ3+Nm+NYyaaRMO5cuClI/iz5QmcHQzgaDftffcOCA4VaEphtWYJeZMCZZAEkVNpBkxHhg0HTkkvCAIsPSRNwkG3DVyn0bTPI78ggqu/LqDWUYzvfvgdpa/fxH23TJBdMcirEvJ+MvF2InpLUndQaLoMB5lzgPWOZGXA7BxQ9bUFdVoRbBYzb8nZcALN3RJS8SQCoRQgK+lezYIguP30MgdBXu58K19Q6KdzREBPMA+RyhLcuNyL2spiTPwWwQtbxxGJySjel4Ajn4BMicgl7CrRJZpxsLvmscyGvl/M+PLxOD6suY6U9jMqPW3o/KoTmu8wwq8WIFT+BwofVlA4JeV0QBqbjOEYc3CBjfbXP53ZcGlegj9iwv2PhnHaEsPnT1qRsC4gUWKHeTqKtQkRUodlA7CRLIlegrr0s4PGirzIZnt692JwZiiTyGeca2itUBCIEHSqKtRxEUUlGoSPC1C8JGwA5x1UVQXT5TFj2WXcRX6WJXbY9vTt3VCpMrOK7y8StX5UFEwpkjNyw4Hov6iShkbm/Qy9iw4ZYRyiGt3tbEPXzpPrFrrMrdFt06KaCzzbCXnjBHRw/jawde6A3XrGgnfXSXRRzVj9h2hZ4OLxN41ln475j82a5jXewNHZK5rzI7eGt6xcrzTYU1rZFk3NUoVp+z5NHR7Kfj692Zi5nkz2WPDrm81Z0fuvncOxzyZlx+SMxA2s9Mywp/IpD0hLq2Ga88nMTTv96J/R7lz82l18u+jQARazAAP6mldv803lbwjvkzYz55+5AAAAAElFTkSuQmCC", uS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQtSURBVHgBpVZtbFNVGH7ubWcHnd1nARexXZyd0dEBKoZA1ogYNYYNE4lBopkRQaPE4h+NbKObGjVoQqIRDOr2R2NcIG5Gf5mwjhhBsimdGrQk6ypqCZRus9/tvYfznt67XbZ2gfAkT8+55+N9znnf855TYBEwxqo493Me55xgc4hpbV5OJ64XNEkzcK3oKyUkFTH+Ci98nFX0nR3xIzM0hBwv2fS0GGNyOGByt6C8rQ1lrR596hRnjyRJB0sKkDs048Jg4r13oYbDMC1bBqm6GrLVymdIUONxME4lFKI5qBw4CrPbrZvxcZGeBQLayoX6wUMnYPnoANvhkiTZbBaD5m+VaVSTSeR//w2Wnbtg7ezSu/fqO5F0n/PiF3LLm0dO49DAH3C76mBX4th1cZjdlwotdKUg00oJmbFRlL+8B9Z9Xbq71nCRkC7Qx4uOM39Fce+OAay6w46KpTcJd9AaNqy2s+cea5CW15ZjnksFVVVFPp9HJpOB3W6HxWKh7mEu8ICkrX6CWhrbvsRkJA43F+CdYmUkImne3Pbgreyphx2oqigzulYIEEnAzF1KIhqqZf6zlWr+0X+FcUDG5ZksEmkFyQwnLxOCefR/F5I6ek9Jx/z/MONOaDFEk8mEXC4nhDR4SaCdaoP+yUJI+MCLUxlhdH1zLWTelOTGk6m8KIN/x9H9ybj0yN4R9eR4VDEKybIsmE6n9SaPmf+splogGBWrJ2ZyKi5xkUfXr0B0OosfA5e0sBbcRbU/QzPy9u6fsC32M16dPIqViQhU3i4UW1qAk6ep5qQYiO02tn/FXZQQAnuedOH1Z+6CpUxGXmUIhmew+51RBM/Hrz5FvE+l6SpYZ+QbdFweQU3+f0nliWg7GxTjzLgKhdh9+PU5ZHMMb7+wCmbuo+3dp3D+QhKlUKkm6byp5Wpemp8zJBCirVRW0NFKakcTcK28GZ2Hx+Fy2NBQby0p8Gz0BPNFjkm1+bgsEg90lTj17qlZAc89tyBwLqa7Gu9/cRb/RQvBum3F0gWGN7jrsH/n3crapq0m4AOktJxQFEXPA8KvFFU/1do9Dsx5F7PGCeHI3OqX1yxhn+1bpw4e2Ii1TdUmFIFBYJCCTLdmjL42v/g9/GMXZjPYCJu1DLsfvx0vPdHIKpaYi93CItkINTU1enODzBOE7o1h+up6fs3sDozYsrGejRzexF57+k6UMq4dRthsNr25n+4ifYBTe6VYz5ExZl73OTPf38c8zW+wH+qaWaa8bFGmOVOc2bd6jS+ec/4qvHpv76dj6sf1m9S0Nvk6jRO8KAbe4dNHKIGAkmpqFJONQmkDqS/z0Gam+IeNxn1Gm8X8Ser0soknU+Uvm/LtENiZAFg4VBhUWQW5tRWmLW28XPzJLLUTikk/u3YcZzfw78KrGYgZDE5obT7tmJfEFWC/5F7AwdX5AAAAAElFTkSuQmCC", bS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAONSURBVHgBpVZLSFRRGP7PnXEyszKzhxJii4KiKbOioKKCoBa9aBEILZIyqI22CSSiESqiXLQUonQTRW0qJAgpnygIag/RSGvMGJ0cH6Mzznvu6f/PPceujYpjP3Puedzzf9//OvcMwDzCOc/AdgtbHTYn/yvjcq0UWx4kK6QkARYqVXMRsVnAS7BzYMug+WBTOzhr6sHV3A6RCZ/Yszw3B7Lsm2HjicOQc3CXUvViK2eMPZyTgMIhwQVwR0UV+AeGIG1tJizJWAEpy5aKfdGpAET8QZj86UIlgOPPK2A1EkpxIEl5AoG0XLA737dAQ9FNWLfHDhabFRinnYw2Tfdc6kUDIRjt7oOtF8/C7rLLCu6a8oSpmGPXSWHx+XzgGxkD14taPtLyiREYbk6IpaDAny7nw53dsO1qIZIUq3DtRL1+RVCF3YVoNAru/gH4eucxhF3Dgp9NW2Hy1zSmoY7P8KQfPfkOJ99WqrzUI8ERJq130orH4xFKNpsNeu490Ycb2zVFkiDkAAMjXMwgGfncC+sPFggSKaus+DhDo0gkQp4AD4ShreQ++HqcGvsHXBlu7lW4YuEooAK4sTiGsGUbXpSihXBaEWiahtWyHHY4rkDWXjvEMYGxQBCb0cdn9CGjnzLmkVEvaGQQ5qsfy1rKIfIgn0axWEwQhNyj0Ff5krve4CbNQvsNK2UBJUQKX8SDYYhHY2JOW4aaOtXrPCIQB0rXdUGQlrMGsvZtB3dtKwv8+g3MgnYxDaa1zTngGHmdG+zyNQVVHUhFMEPQZK4HQ8DjcRFqHqf06ZCMmO0g0/ppYLFYRPyCgx420fODh4bHGSxCSCk9L0dNvdMEKSkpYmUphmjDqSNsdcEWDouULPsmNfxIBA00otqnhEXxwHTdfsRG2roW5QFZlXvikJq+poNGSR6nmd/vF8nWsfRai8t1T2OHlgwwnYe03Gw41/VKLW/UMO703ainWWpqKlaAX28+f4MnA24mOfrsgQptNX2LFEgRNq/VaoX0NZna/qd3efax/UkBk/U78UOXad9EoRV3A70TBMSkFsgLb1uX5nrXDAvJsgLPR/D8sktquVxiJlw4Duzo0oGxL9/gQ+F1mBpwz0uwDj9uBLz+QIEZ3KEms12ZpZJEnHB3cwcM1DQgYa+43UhsK9MFIFWLCXjWK3N2t41Lv5ovXOr4f/y7KJUA4yZAp1xzyDKfU/4AV5dB9VZuAcQAAAAASUVORK5CYII=", hS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN5SURBVHgBrVZNbExRFP7eezOjpWOKSPy3pCKiysJOFPGTiCiJjR1LG9GFhYjGtNhLBBGJEomF/xKJRERnLEQo9ZeUolOkkSgd7cx7M5157zrnvnenr7R01Gm+3p937/fde8695w7wBxNClBMOEe4TusSQ9Xl99YRKFGs8ySMYqzWPJqSNQL6XiiihnNuxth60tH5AnMrkwCAevW2EUVEBo2YZSurqEKxdraYmCY2aph0bVYDd4ZHjxduvOHr2Kd51/0C4bAKmTJ6AstIgTn0+DyeVgiDYiQTPQeTyVQRqahRNlEQaVUMfYeV48voLzlx7hRWLpyO6ewWmRkqh6zrSGRt6Oo2ApiEQDiO0dCmCVVXor9uM9JHDBQGOzTABz3+SvKOrFxdud2D39mpsWjkXL9//wPZ18+EIDWbWgW6aPqRhQCC0pBqZE8eRPloQOaRiElAd7PNETz+aTrdhz45qLKyIyFUHAwHciH2CReRmxhWgJdGf611BsOl/cNZsZGgXoVW1HBeOXzNhre4p7eLBOxvuYVp5KSaTz5mckbPdUOVsQQLUoFWDRDRylYKRNmEEDNoNYA3tYg0fc3bRNnVaHr76inkzy3CdVvzmYz86Pw3g4p0PWDAnjJSZpxjkoUly0y0Zlgv9e5/0tx2PIxePKZF67tvKtZZYN8VCw4GTzzAtUoJLdxNovtmJuTPKsO/YY3zptWgHeYBWDCLkXUik3F3gW68UYORu3VQCqzkGy+Wx7Pzmfdax/3gbJpYGEJ4UwmDOQdrKe97WIEzLqxeOHwla0HI5OVvG5EFcfa1kAXmhEj2pwq0ws3mCjd5kFoauUSx814VjoIgZjiNLDSjASSaHCUh79qYBene3DJQaWKz5RZTxrhKyEon8E+lIZlRUqmqyIGBQThEYv/Ei9aG00c4C8kwFt9Thf5gYztWi8WWgSh+3rI3rAToBOoqPARM7XFKmndjRqbrn65T5OOSt3AodbJADFYoVYJRcuqK6zhF3wv3oPjD8SonBw03CLAmKDCE7RvBYizB4pMn/4lUOX4H7/AklYnkTM8WTC3+6/lUkqkbY7e3CWlT1m1DGB/6W3bBe2LFWP3nUzznSk8nqMn1z26HEZVNuEc9fQHxMuIMi5dBra2HQadH/8mSOthOOyTkxdrsvxvHrot4j6PMRdnl9Ue+Yj2o/AXoGqSix5uf4AAAAAElFTkSuQmCC", MS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM6SURBVHgBrVZNSFRRFP7ue29MU9SFhOZiXAQhhX+R7ZoW7iINotZFtc5FtElTs/ZFRGALXYcLrZUgmLYqEfqBiH5QySTIn8mcNzOO827n3HfvzNNmdMoOHO69597zfefnzb0D7CBSykrSHtIJ0lmZlVVt6yStw98KO2mAQmUwH5HIAX6Nhl7SSl5vrr/Exs9xNUrvlzpjhWphl9SjqKINTtkJ4xol7RNC3MtLwOXQ4JicWURjeRfs9AIBVkE4FbCsEuXieTHItAsv+RWSLPtT9+E0NBiYXiLpMwsrR+ToH5jGhRtjEFYRQvsPwSmqgGMLWCKulOdOqBSh0no4xWGstZ9G7E5/hoB7YxaOqXkG/PE0Hg2/R3P9AdgiRepBCD9Xk64MjJYNFB05isTDB+pA6c1u3uohzBHKZM5kwKWpfPNxGbcHZlBdVQY34VG0ST9qJEjj5J8gMn+ubMJX4cYQOliLBGWRmpqE7t+gKpGO/iIvzl0foygsArGIIE2ArgISCjzpk0hWY4srmx1zYTs2KBnE72ZKdYo/c87grGnq/Pd11ZaVtQ3EFEHCB1TALtVkG7jUWcUpkJVV1dD01JTJgqWTbR08G52c14UW+BFNKgIGVOoZTZC6ekxoQhciFgOWlxQBa+rZU0MQ4SY38eztp2W9bSGZ8rBEJIJBpRdoay6hvaUliFRKefPJ9Isps1nn6IZgbnF9y68itekRNtk8T/XF5+AMA2SS57RP4PpDU+pFo1sIAiK2jfABVBbZgPNJkMQIZzXHk4qyffqUwF6Eve1wnVlGMwSRYzW7RlioWNlr4zUTqG+qIxLG/2Bg79CZdrMcZQJ1+3EGkZbqwLF/AxfhMOyTEWMasei+4JY/51X31WbsBZy1+MmwMQ0F76JLpNFIS41PIs3xwsFZQl3dVP9Gnqq3gSeKgJmM4daVZiJpUiTMI3fhUWdotAk85N+kLH0a848Hpxf+zYp3X1bTh63ztuMtZL5cHmUgbDUvbgU+X4aVrTuD95pFriezU5OoX7iMvwLccSD5AXLzm+9glQMlx+kpa4MoaTWuOZ/MPGmrR39IFi4Tcg//Ljo1wGoAcFbb+Hms3AnjN4Fo/CYZbDccAAAAAElFTkSuQmCC", fS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL0SURBVHgBrVZLT1NBFD5ze/uywSIBEhckNe7E4IMdmuDGhcYH/gR+gFoTDEtLXBg0MRJ/AJj4B1wIS9SIK40EZU1hQwzGFkvt4z7G801n6KUPbCMnfMzzfN+ZM3NnSnSISSl7GY8Yy4wNWbec7kszUtStwUkTdGrz7YREC/L7XGQYvWiXy2UqlUqq9H1fzbFtmyKRCMXjcYrFYsY1z5gRQrxoK4B0aHKqVCq0u7tLrusqQsuyFGAQ4rnkOI5q9/f3K0FtGRaZaRLQkSt1EBcKBRUdSNlBoSEYBYhVq1VKJBKUTCbN8AOzEmFyzsVXpAXkxWKRotGoIu1EACVWHBBBui6wT9bS85GaXkSCyLFcEIdCoQMCQZiUmTnhcFj5Qkjv37xagY5+A43t7W2lhugNQTBy1BFt40qwCgDk2K+BgQEzfMLmfxOobf7Yo6UvOQpZNiXiZY4opMmbDlqD1VLluh7t/amQ53t0dTRGp0/2YDANgduozb3dopeLm8wXomjEpr6eCFNzxA0Sze3aivJ7DpUqfKqkR3d3BD2fPIPucQicR20t+5s9LeSBKo6knwWH4mHkF2moEwotUk8RUanqkeP6ypekRR/Wf5nhlK03hLI7Ze0u1J/j8jnnbyBk8YY2ZknUiAFfnaaAMpf5onNAoB5ai4bnS/KoUxMB1AzHNItK8liEjspSg8dMNb8vMD7cR0dlI6njprqKFL1nXLk3IujGk8dqn6x/Hs3Wxt807wnRxak50/UGHxo2OYeWe+cWiU8rKm/dSkglwBgaovDnVdN9yuKPCffGO7RCD6fVRINuBQD71WvTtRC8iyYZeTF2iSwt0i05TExNkxg+i6p6Gw5Oqj1/yrxns9Ib7JO+hjwEGMdc7+ls8IVLt45Eysz+lO9r0hs91yTkB6CIJ25Kf+VjkDwT5Gz1ZEJdXd+qzZtOS4tE699Ibm3VHHDnj10munadkFZtLZ/MdivBo78gO7dl+R+/LtKaIBcg3NB9GX3M29pfkyUxQtCCWYcAAAAASUVORK5CYII=", gS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN2SURBVHgBrVZLTxNRFP7uzNAHpVqrMWhUqsZXosZX3Gi06tIEdWHiwoUuXIs7d1R/gX/AaNRE3YlGt0AibHkZFRJ5K49EKFBoO53O9Zw7d9oaCgHxJCf3zu0933fOd+6dKbCKSSlj5M3kreRDsmyzeq2JPIH1GgdpgLXas5WIRBXw+zSkyGP83DNpo3Mkp8aM7ao99XUm9sdrcK4hhOP1AT80Tf5ICPFkRQKWQ4MrwNc9GUwtFrElbCEaFAhZhorIFVxkCxITCw7H4PGVOPbFLR8mRSSPlhHozBX7i64FtHzP4sj2ACyDQQ1UERJRcw7pfADj6SXcOGyi8ehu/8cHfiXC15yGLpblRXcGH/qzJEGAcA1vixClXHgq4CIg8mgIDSJeM00ALjp+bsGZvYdx8/g2X66TRDLsp8bSxH7MOHjVs4RtkRrY0kTeNZTblWPRgCsdbA38wtlYOy5v/YQDtV+Q2JzDS4rtJWl1/57xxNDZ31HitaYpa1N5rigUmEciwP3lMV8EERRhyiwsLCFspBE0MgjXuNgZnlAk2pJ8zLkz1/mpd7KA6UUq3zSxUBAIWmLZGROku6QxV4wgJOLonT+C33YUo0t7MJWrw7i9F4UpR1WhT1cTE1zjWccYlUaaC2ronC2wicQWQlS01OPzx8lsHEIewkAmgUWnDt/md8HhXw0HnWMlgotMcIJng7OOAucT45AU83kgYJWL4NxFRUk51GLGPkgHhCWzqSpOzlXxPVSFtoSlG4LF/IITIVm8HhjecaFgU58crVHlKVXVUEtg0nrEkupOSLcI4fKFVPInBN9zldFAI3V8EqbCFhDL7vjq5lUiQfgoGvUIH3yv1vmYDqvkzGg5zXWCoxypEjOCO/2ldInAiJzC/zIjdMCfdjNBO8/MTUm9psX9R+NQM5r0H1uYQL0zjNrTEOFTkBsEh7VDYWl7Z1FD09TnNnpIdri3centGy0m1mfS8657T71zDzyvfBfdJU8nE+fRfOFhafN6wTn2RP0xXlHfBp4oAmbyF1IXH6KZvBS4FnB44Ck/zvvwDCvsv/ZKmYL3ZkXf9Fen8e0ta3hutLxBLAdONnhV81gBnqoW4pM0aRJ1w9tGPqOl/yO6p/rgk8WCmxXgtUNXK4GrfjKrV+199J/LtVur3MC/iyYNMFsBOKTXUvzOXw3jDztyBwdcDqOfAAAAAElFTkSuQmCC", zS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOtSURBVHgBpVZZaFNZGP7u7Ual6TIjttOBmVs7MlCZNMUZ6AwzY2YUUUTjguICouJDBZdUfPBBSAJSxZdKpeCLuICCSgkVxcfEBUGpmG4WxTZREa1VE9Om1WY5nv/knvSmSbXBH/6cc/57/u/7l3PvCfAFYYyVc3Vw9XD1sykJ6jY7Vw25CjnpALOVMzMRKVnA9/PBybWc1l6vF52dnWIMhUJij6ZpsFgssNlssFqt0pUeuhRFOTEjAZVDBxeALS0tCAQCqKysREVFBUpKSsS+sbExRCIRDA0NibXb7RaEujg5iSuDQI9csLtcLrS1taGxsREFBQX0DNwpbRTOfE5EfX19aGpqgsPhkHDNMhNF1pwPD6ksBN7e3o76+nrkIl1dXbDb7ZKEytXASQKS4Awftvt8PjQ0NMBsNqfKYchQRDx9LtfhcBj9/f3weDyyL16+5z9Fj95Pllt1f6D16SPmr1uQ0XxjaWaS7u5uAU4kulTk8581NHt/+y4+Pn+BPYUm5UEkzgbqfkFh1Txles1lxNMlGo2iuroaiUQCg4ODqK2tJbOdCGw0G7l2AyofVd6WP9+HlSXBcWjHDqDgxx/SGhx9M4JQx1WYlv2PovlaipCA4/E4YrEYiouLJe9iwhTna7SnXxBQjOzTJCZ6B/BkySq8O3eRyYijI28xtGknylavQPxDGPHwaEYZVVUV2eiiUQbihaLyKJg6t4xvinF9efiIMt7dxyqb92Di0YCSN/d7hD23EbzsRp7JhHn23ZizyCLApRpKqKnIIsYOM54294BaWqIkxiI86jC+27IBk6+GMTk8LMCNGRhPFwllECCmwrJSRKd9OVQeYdXBvZi7a5t4YFpqxevWdozyDGrOn0JiYiJbfMjPz5fTkKoToPyfv9I2FdXWsAXXLjEOnrLllZow/+JpjD/sgcobOcdi/hqBj94DJ584gvyY+lasE6fohiWBe5sXCsCchJeeJRhalx+FuWohWZqJgJocpNX9VetxPO8m6/g9pmR+Z78OTqqV/QT/vh5prVF5U+i74aXV+MlmdCyK5QqdJu6NF+T0LH2L5CnawTVk1f6G499DqWhyjZ58LVW/kUXcDTQRBMQkDc7Fh+DgmnKcDTiS4E7pl7x4AgI7ba/ecJr7Xvdi7ZWtCHx4PrVByQS2/pzMmkYDuDObiySx6yTJK/PZHXQ+vg7fcG+KrLyoTADafl1pBM56ZWbPOnnpn2WzFw/7hn8Xdh0gaAD06zanfsxnlM+Z5SvSe0N5+wAAAABJRU5ErkJggg==", CS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASkSURBVHgBpVZtTJRHEH72OFE40bsDPECOQmwtarVUmzZYWukPUiQpWqLURKAhbUIatHykLelHAJv0R02URpr+ayjFIv+gaVqFEg8SPpooSlHANKFQPj1rD4gCB9ztdHd5Xzj0MDZOMtnZfWefmXlmb/eARwgRmYWWCXUIHaQVmdTWCoXG4v+K3KQBPK5UrRWI+QEvEEO5ULOcd//TiY7xRjXeX5hWPhEmO54278L+qDeQEJ6ob50Seoox9vWaASQdGrgCvHDrHG7PjsKyIRwhgWYEGYOV35xnFm7PDMbvDyPcaMCZpCoEBG3XYcpFkFMPBdAyV9Gr+86iYaAKO0L3Yp3BuOT1YK0EvBS8AYnBhLaW69Q9dhClpaW6V5FeiVHnXM/8h/6z+HmwGtutu8HZIty0ILCZAtSDWAIMyDCbYF3k+PY7J7Ve2ciuXq2QOCgrkySgTNgNIsiQQYsoV80D070iQAVCg22YpznM8zkskFvY7uX5yybg5Jb1GLjiotyP+uiZ599mISEhKCoqQl1dHVpaWqD1r0pRpGU/KCfHLyXijnsU2yw7wRQtTGUth3BjALJCN8LqZvim2kn1v02qerKyspCTk4OJiQkkJCQgOTkZDodDJ9IiKzgsrT/udipwJlbueSaXs14QWb+2EfjYtgF/iazTcnvofMMom5mZQWpqKrKzs2EymRAXF4eSkhJVgVaFlELZg0PSap9oXMpWBJhedGETsyBsXQC9H76JRXkYCj7tp4ut06taXVNTg9raWrS1tSEjIwMulwv2yECYqE18TZYuB2SABGkNTPcpcMmHRzQ2NWSBjlqt7Jemuzzz3JhhZGJe9IzpJw4+pw95eXno6upCwTsRVFawG+sHruknNNaoNQTOuRG1ZFsXgOJIM2IWDSznZA+vb5o2CMGDIoGlcs5x6+Zlunw+nr36bDD4l3eYd9ADHFFuKsCSCPBDFhOyw0JwqWmSXv/sb0zd8yhkr9eLtaQwN4JKP4hi5o45TlkjjFxeMLt1VSaD8jLp7ztKY50v8HePxXG73S45oJiYGDX609itgdR6YQfnv+8lfiyG8y1W8gpdCLfS/OE3ly9FWcGQLGVqfA8lvlXPvAhCY2MjmpubERoaivz8/Iey/vC9SPr8RBQ2dc2BHR8Wx44z8vnOdj2nm92SglZpuQOSmKAEFosFNpsNxcXFil9fEVnD8WM8Tp/Yis3lTrBPbjMBvsKGNhrT0vSln2QAdWfIH0h6ejoyMzPR09MDp9OJoKAgpKSkKM+CXBt6G/fQgX8ZsSNDDB2zDP4kxg62P0mfNeh9cEjCxC9Q8RsdHU2VlZVLXEcHcpE18a59nGc95SXBsz+V/C8K5TdvLL8R8Gl0rPZKkbisFHBkZCSJE8Jd10UTq3Z6aFsYrQWuN9hz+ivfFy92VWXa86ek4swX1FwTT95rLxLPsPO1gH3BvSvgUgr90ic+lOse3P0n96bs414NhPsAcl9gcSR5e5sveLkvpr8nU0ZX17ead7QDF38Fem+AhoeXNmzeDMhGHkwTDX1F3+r3yVyrEtmT7+nxxUFP8O+iUAOY9AEc1NYkpeZHYfwH1jw923/01lQAAAAASUVORK5CYII=", OS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARISURBVHgBpVZdTJtlFH6+rz8waBkUW4YNUmlmhhPc4k/cmGiiMWpmtl3sYplL9Gp6o92liYlFb83cjdPERJDW+LsIgtsSRGZUmmgmo/FCSybgnJYFpaP/v6/nvN/X9qODuWUHTt7f8zzvOe95z1fgOiKEaCZ9jXSKdF5UZUWf85F6cLPCRjrAjcrgRkTKOuAvU+MnbebxbDSH6cWMbBO5ktyzxWaC12FBX2c9erdYy6Yx0gFFUU5sSMDh0MEl4EezCSwli2jZZIa9TkG9WZUWmXwJ6bzA3/EC2+D1xxzocpjLMH4iGbiGQD+5ZB+eiWP01zS6XVaYVQZV5Z7trUA8B/wRlxZsJMnmV/LYe1c9juy0l+GOlT1RyjGnZobDMnwhgbHf0hQCK+Gq2hZFke2RboFVIhi9qFQI2ANuI8tZHNi2iUhs5XDtJJIFVWfk0DRf/LeA4GwKtzVakBMmZEuq1Bwph2h57jwK0Ygk5rms0NuSAqfNgkA4hTCFVr+/Qe6o+umfk8GbipGxSWqmqCBbVHUSBX23A+Pj4/hp+hzubxO0Vl1nEpNJswvQAXV5lNOcPdjPo3A0jytJyE3xvEJGBEBJky0COdKW7GWMjIwgGAyi256hA2hrcg/tTZANexZeKpS9YPExwT7u/XCJJmmDQhd6NafoHigSZIdT4LtvJpBMJhGNRhGaGEVnk5BrmYK2dzXPd2WSGNOXKgSPMMEO7v2+UpDgnDEFOtFqFkgXGADY3Q68c/JtpFIpqZ99+gn63UKusV7NaV7SpUqMWfJCF4+qXwjlu9DSUU/cAg1TlOuuBoG56a8QiUSkB6yTk5PILs5AVQQdQqBYQjXbSJNkZySoilLeWJ162iPw/uAg8vk8XnnRhaOHWmV/7NTHeLJTQKBWFBgBmGCBOzareg04ZSucmQWcPXMa+x5vgf8lN9445sa93Q0IBAJ4qDm2DrhWSnSJVQh62yzalOFID1A6fvDeSXg76hA47pVzm+0mfPHuVmxuzGDs8w/pddf4QCHyVsvGBSb4lnu7OyzyRRplv1cgfH4CE8FtsDVUo+lx12H4zS5Mfn0ae+9ci88Yuzos5dEoW53QPDCTmjQX6P8OKiuhs6fw6gtmCVgr/Q/aceDhRaTnvoe9UlAF2mwKel0VD0ZUSi0O5DkePdtTp9UX+numq4Tt7SE8sceGjeToISe6WkJ02SVpw7YD/Y1FfXnIWIueJ40x8+EeK1rrBPY0fYn7vD/j/2Rr6xk81f4LZYvA4Xus8DSrHAb5beB1Y7n2UfMW92f+/Ac92YNUqJK1ibVWtGiiqLbhR3UIfR5HeWVtuTaQ+KFVViRSf+F4aBlLKeMmvUwbpMep4uDdjXA0VW6bv2p+owVqSHw6iXzh4StFhC4XqZSUtNcOfjME7DJhl9tEF1rNeazzyVzfc+2jPyRuXKbELfy68OkAKwbAeX3OzzX/ehj/AQFgdMQZCSi/AAAAAElFTkSuQmCC", mS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANvSURBVHgBrVY7TFRBFD3z3gCiRJAQooVGtFFXo4mNERM/nST+YtTGQitLKfx0un4K0cZoocEC1NgZDY3GRsWIMVES/BZq1AWCohC+7+3C+4z3zs7AEhcCgZs9mc+bOWfuvfNZYApTSpURzhKeEX6oceszfbWE5Zip8SRDMF1rmExI5CE/TkWSUMbt5tYuND3/jhdUhoNDYXPXNeksWwZ37ToU1tRAbt5ip/YTzgkhrk4qwOEw5Jr4UkMrUr+GUVk+H4sWFqGiGPH1ngdO7A1DeR7i9hTNARbcuQs3sc7SJEnknG04eVaOC/VvcPDUExQXSayqKkd5aTEcx4GfiZXj+5BCQJaUoGBNArJqBbxDB5C5UjcmwLmZIGDilyW/9QY37n/Gnu1VOFyzkknhj0TwqEwT3HQaDoFL109DQqFw9RoE9TdzRc7anFgPODRl77704nx9KxZXlKCnbxRNL7qIPNYiXiaiMoJI+2AvWMTJMDK6LZcsQUAC4auXMPlr4Io0Ske4sf/EE8qKgy0bKvH5+xBS3WlqC5MoAUeRAJGZoOo+AZNIV+qeURKRD3Xit/E2l1TZa5Oa+j1MsZZ42vqH6RDGChP2gQrIgzR0Zs0XZT47I6M6HGFLi/bC7K5a7tvDtabmFHZsXIzGM5tQUVqEAS/QIfHSIZUEU8L3ABbR8CE8X3slenvgkLcucUWPHtklbWUPNnDt/ddefOvwEEQKbV/7MRooFM9zaVUCyoZEUWeOB9luRV5lIMJAexAzXrXYr8ulSQg6uwbD7r8ejl18PRYWP6BJrgP6aZHCOCA3fGmJNeI4K2Jm8YKigYEJAtredV6WTmeHdlEgzxHPmsQUJvLMZa9+6trCUsyV8VVirH9MwK2uxlyZSKy11TYWaNaqdHHN1mzq5ThXk+DDQJU+boX7dkPQDmBVgZkZk+sdtHQpCt622e4q2rqCr9nn3HJPntYDLWZCblFw+56d2kjcP+1ddJTQLzZXwzEiMzV95k+cBhIJdl6/DRMHZJ8/bdGVOhVVlqvYQE0B/s5jo8t1uS9cbf5VKJUcG/LxvYo2rv9PKM6BJt67S8UtL3PJk7mc+Z5MVtfXt27zsX9Md8unD1Dt7dkJpXRm+DLbWQMOq7G8T+ZknvCj36imb8/ULP5d1BqCvhzCH6Yvabb5pPYP0QGC5WyMt0UAAAAASUVORK5CYII=", vS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARFSURBVHgBpVZLbxtVFP7maTu2YzuJnZT0kUdJIhRHUCGkVgIKQkKw4CGWjgT9BZgFsAPnH7AAsWxhw4IViAWvEkpFC5WqltSoqEVJIGqTOHX8yownfsxwzvWM6zgxKuJIR3fm+pzvO697x8C/iOM4UdL3SRdJV5z7UnD30qRj+K/CTi7Ag8rZXkTSAeBv0pIhjfK7ZVmoVqtitW1b2KiqCl3XEQgE4Pf7Pdci6YIkSR/0JOByuODY3d1FqVRCo9EQgLIsC2VhIrJFvV4X70NDQ4LQlQyRLOwjcCMX7AxcqVREdAxKDkLtelHYylpUELAyWa1WQzAYRCQS8eDe8jKRvJrTco3LwuCGYcDn8wnQToKmuYYds4bI0OQeAl454w4SjuQx8llVXUYuTZQj6YzcA+dSGOs/YXs7B3/fIGxzFfrAEwiGwq3MiETTtLYvBcf9O0v6jOpG/waz5PN5KIqyJ2rWqrENM3cJesNAvVRERRrGWPyE+E2UgVb2Yy2Xy4jH47x9msecu/aK11ROlY08JxbTNBGJjeBOMYZaZQXNWgFGM0GZDIhSerYeCWfLWK6kuUQve+PYWRZW0zJx8dqPmA6WEK5+jeXKAGJRPw7r32Pt92F882cep6afwszUTKv5rj9jcQ9JnmaCR/mJx7G77p9/9SF2qhoODWTx5fprCB9NQrHrSEhNTN76GFvrx3G1/m2bwBsKb3xJxphAHKhKzW7IEhE02AhoNhz8XajK+fUN6fFQRRodn0WdgtihsmjDEwjWFWhmv529fV3eLBuNUCAIPoeNpkPOdDboPHoEQt77RVNzFkevQJKp/jULeq4AOzKOgrGK0ICKjcI9jB2bhFUuYqsWxA9XN2Rd60f6ckyFGFsaWVtBImDj01dbuEywykwhXUbOku4fPT0Cy+7H4PZNrA0/goT5HSwEcK+0QcS3kZX7MRJvIqc9Cx86zi2VaSSseBtF2SXA3LDW2nLa1qgOvQh55Cgu/ZrFzaUrdGUso76bxWDgLn6+YcBR++GbeB7dMhlrF+Y6E1zgp1NHND7SewyD409iuTSNrfG38dDx1zFDGRl/0NXgT6Ey+Bwqh1JQA+EueAcnj2jeyxcSHwZ6KPDbO+cN3NhyKEtZpMrycLiG+dG7WFor47crF5A4NoXBcB9OTB3GZ3/FcMuKuritHiT6HHzyUpt03LuLFmk5vZRr4N3zVR5o96Dtu82piU0aAmX/PoHzGH30Qh8mouL3c4RxRnZ/P0NanEuoSCX1VqkcHCgHgbfsHaRmfR64+DbwgyDgW8/bmCej1Kzeikj0pAdTBzjbss98sv1NWHAx931wMmjdrFgp2vbCRUveNKknbTOpi9BBMq4QuIa5hNIJnkGHR1dATtolEd1byjVx+U4TywUbm0YLPESBJgnw5KjSCXzgJ7NH1uKjf855cFl0/se/i7QLUOgAXHH3Mu6Y95R/AAXvgOo2R5GcAAAAAElFTkSuQmCC", yS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQASURBVHgBpVZdbFRFFP7m7l1qu3S7pbTVYiIIYkKNVJuoxQeKMZgQE9QHTLSNNvhkYthqwkNjYMsTMWlqTCQaVGijxkSjwQeiqFlM+gMxglTWYmLbtQUBte1S96/buzueM3dmWegulHCSs/N3zvedc2buzAI3ECllgHQvaZh0Ql6VWT0XJF2NWxV20gBLlUOliEQR8F3UhEgDPP7ln2EMXviW2iEkMnPKpt53N9YFHsDjq55CU22LcY2Rdgsh3i5JwOXQ4Ar409F3cCl5HivKa1HprcIdtk95pJ0EUgsJXIxPQpLtvk0fEmGjgQkRSfciAh25Yu+L9OCrsY+wYWUzbMvLqyAn+pXaRWonJkthInYOT69pw0uNbxi4TpOJMDWn5jSXpe+3Hnw93oe1FJGwCkIQptFEhoPbHPD7zBk8t3anIeFyPUQkUUu7c2kCf8Qi6B/tRU1FPeaRwnyOVKaQkWnVV600824/o/pJ1PruRP+5Xpyh0ur9O6QC0tFP8ODk8w/Lb178Fw13NQqOnssirsugsEpSjzkLmZO4eGUU66ofwwvNn5lSVdv08wz3skMDaAxHxcYZr7R749LyVzC+iyuuPxdX90DqMuWyGTiVZXCyp+AkTsL2PcoWQS7Rdu45R4/CQ61nxBHWnkmIbJLSS5E3ac5omjSJ7wem3T6tCenaCTkDi9A8lkD2vx9MNJuZoEkFc/ZX5Pd0MC7Eq1GJeIL20wVyNanaT768hIGfpvPzDC5o1yxVVuDYd2FDsJr3QOWbbm6CNTUFDxkYInm/LcWBGmC5xUcHHx+Zw/4D04j+5cBLxd38SDk+2F+HldWWKlP4RApdb11GfKEBZyPjisEqrGy+5kbu8Qi5LEvgDhcRbdsrEOzwI5Ggei846O9xwY20EmEoWItEUubneDWqev6qQmjIJ8og9vkhvNfeJmOTGXz+bgM6dlThVCR9zRpH9+eFBby2M/9Vx7hEXLBW580uyIPvq43GFgavXATOMp+RKFvmzs/EslgR8LgB6eM6n8nBrnkZ3rounj7OGfyoUtm2zTXcWkaXS3FwFgPOYsDzWZPatoC9/EkzdYQz4K9ulkcn9jwrv9hyWp1/FMcvLTqDurJV2L1p0MyusQktRiTHadBavmu3GBneoXZG3CKBeydJvNd80Hzrhwvvog7S2MaaFrSv79SfJ5Yu2r59/eu417+BwdXbwEuKgJnMBBu139fpRnQzEm3DtuzDvlq6NeaiBycE92bF+FwEe39+BZdT50tvBwE/SFm3EThnXwAeMoNiT2ZQk6gnc2R6GEN/H8PYlQiRTSkbn12lAFvqtxYCF30yiwfmPvqH5dIlLG/j30VQA8wWAE7ouZA+5iXlfwlIWyq053iZAAAAAElFTkSuQmCC", LS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQXSURBVHgBrVbtT5tVFP89bekKHbS1KR1adMBYIix7MbAMlOg0kURnNH7YF4tm+gdYluyTiRa/uxhj4heVbdH4gZjMJVMbF5kjQLMsvFRhyMYKA+n7G31/2+O5t8/TwaBLl+00J/c8z3Pv73fuOeeeW+AhIoqinvQz0lFSt3hfItI7G+lePKqwRRJAtTJciUjYAfxjGuykevY8E5jExLqDj4lcjM/Zo23GPn0nep/ux2FTj7w0SjokCMKXFQlYOCRwDvjTwlfwptZg0JhQr9ajVlXH56ULKWQKSawn7rJV+LznO7QRoSR2IhnaRiB5ztnPz5/FxaVhPG98ATUKVWnWg3sVS5oppOGOLeBEixXvd5yWvw7KOxHkmNMwzcJy4eZZXLpznnskKBiGCJq81R2x7JREJODf8CzebftIJmHhOkLrllXSEhYa/VJsDj/f+hadpi7oNUb+IXsvRQQKwrkHc20ztDX1uJu4BbVCQ6FK8B3oaowoigU4VkZwiHJCyvI3THpckLx3M7D3fu8hmAKGur9HtBBEXsxiJbGIdDEJi7YVuWIGGspDh6ELi1EXdtfocGVtBG82DyCVS2LKP4al+By+6BuRQ2WgIOAdZs0GJ+HPrOGAsRvhvJfHwZtexVToGtTKXVAKSmSJMFmI40bgKu1iEaGMB92Nx+HPruN2/G/6noYr5MQsFYgkNkbwNrPGPQ4e46nwNVz1XCLvGtBrfh1vPfsBzBoLPKkVWOpa0KHvotAkYdhlgkKhxITPgUbNM9it1vEwMoxxr0MmeJkRHGbWUmy+lFRBxEFjD3n0D2bC4xjzXuZxb2voRIbyEc0F0FT3HJyBP6CgX7vuIDbyIaSKGzBrLRzDFXTKBHtZkvmB8lE4GPtR02sIZ30w1u7BetKNA4ajSObj+HX1R/Q1ncBl/w9QKdQ48tRLuB78E7lCBtcDV9Ba3wlf6j+OkSjEthBsKcFRz0XuxU6yEJsu29PBsS3fbkamIYrb1zCoZWawihDw+MIwmqiVSBItExwyHsOTktaGDtmcYQR/MevFpn6UdyhWB6RVNWx7J0pYkvzCDhpLcoQ9nZk8CVfECdYZzHUWvNFs5WdAlnwxy8eiWOQn11xrQSPpauI2vp77hOfATCV74dXyOWiRe9EoDa+4QpM44zxJmREgVJkQpaCi6Qqqphx3/5u+3yhEvLOeo150Sq6XU6RRVv8D7YPlTlmNsJ3kizluW9ttMji/G5jBCVjXk19Y95/mJGI1JNIcNtdKawb2l9v1kIS57cKxo9RZsRxfKH5640OlL71WMVwMmO963yCNxzaD2+WHna5Mm0TCTzhrXhN+B+5szJdOO1j16Dhgb2P/ZuAdr8wKnvFL/5xYvYyKj/HvwiYBRDYBuqV3dqnMK8r/ZwZJ4AZXvvwAAAAASUVORK5CYII=", wS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOJSURBVHgBpVZLaBRLFD3V3RlfnvKcl7yn5uELg/jBf7Z+wCCKkIWfpYug4sqVoyguE5cqQZfiQo2I4MoPIriKgklcihJFURPxg5+J6UlmujMz3V3eW12V6ZhkSPDCmb5ddeuce291dQ9Qw6SUaUIHoYcwKKs2oseyhAzmarxIE8zWrswkJKYhP0qXTkKa74PSQ5T9O+oqI1fFWHYGdqoFqfo9cOa1mqU8eVoIcWFGAW6HJsfT7/1YLjoggyEiXAxh/w3LWqDioqhAYkVEwTuaB+bn78Jeu97QdJLI6SkCOnOl3j3QhVtvL+PGlgyR11GQBC3iKL1EKk9KgWi8iGDHB6QOHMIfJ08ZumOmEsf03GTe/aILdwe7sbJhAxw7R8RlKG5RzUaaa8TtErBWr0Hl0kU1pkU6iPM2iQxZOpZbk37jDuDay/No/HMxSvCpJV4VokhCngL7lkjMeR6cpiZUzp1B0PcYev+uqP3S2R9UKk8OQ5CksARKoa+JmJjhJ3xPX+N52/dh2w5s4iiTiLZWfsy5gr1qU3P9+Op/VAJjgYuS9CcyFmAUlGjI4ygqWGbOpyryeTBZ1NtrqmDL8tge9vo+P1C9ZoF8ZRjjoadIIA08PB8N8XqsrPwYRSUsqEViOEeCQlUR3r9vBLbxJrew9zY/AJUCBQWyjNHKD7opIJIWZR1vbX8uhXpHYsV8T62us+LtFrkQIqjEFTD6eo1AxtEbgi/+h/gx0Y9KICvEOUqLbNz8tBDX3/8FE/DgSxrtzS52NxX4UFCwPbHUot+Q2pUUiC155CYdvxD7l/5AY2ocXa8b1MiRZcPY/q8/JVhgUo7KuKohdhbULZz63kjYM3ce9v1XQNuSAt4VU6hlVnOzcV1HC2Q2/rMJg2MDMy7aschDS7qk/L7hetQysXadcZ9yBY/Y27Jk18QJrTpVM+Rsmxv9aYnNMqetzQzdYQH1zuAKNjZuwm9b8/8Qm7eau9v06Ap+zT7ku/ZVx1UaEnM3qeF0XzdDV5PvokMElytoX3msGj0HcjZx4pTpv/o2TA6KP3/Krr3qkjvvLZVRHgp0HGZE9E3IcFGDDM+eSX7hstNnImWniaCTHYWjGRm6mCRkfAbPhW6rjHofJ8k7UbPcuJIREx1VemTkZWVUaJUsGDHGWuIxmvvlj0AWs+pp/NG/KmdvPfI3/l1kNcFIgnBQj3FL07U4fgJq25sTp6TBbAAAAABJRU5ErkJggg==", qS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR6SURBVHgBpVZdTBxVFP5mdnbZH1iWoaUFWtiNMSRlIVD6UK1KE61abKrGN5vG+NKYVCM+NL4YhcQXY1KbNL4Ykzb+vJm0iLEPamoJatrEQvhpRA0sLH8Wyi7L7s7fzoznDnf4EbbF9GzO3nvP7Pm+e885c+4C9xHbtiOkH5BeJ52w1yXFbZ2kUfxfYU4cYKdyqRiRsA342zR0kUbYuvBLP/Rr3zujvbzs/Easq4Mn3gRfRwekx59wXdOk3YIgXChKwMLBwR1A9cJ52MkkUF0FT1k5hGDIcbFzWdIcrKlJ8gGCX3xlS41xF6uLSLq3EPCdO+zqxx9B+/wziIcfw1L1HuiSFzWLS/Dmc9zFpg8ctfIKCn/cge+11+E/964L9457EsGNOQ0DLCwMXO+5grvPPwNPyELAUJCXQpAgomB7UT8+C/vuP3xTq1SWIMAYHID3zBsuCQtXK5EkRM7IQhMxR4ahE4E3XI4SYwqKOofM3AwKZhaiNYfC/F/IKssQ83mIigJRZao6a6m6Ggb5Fn7tB8/fJecEfPcTbJFta4GQnIK3MY7R2gqkGlVUhf3IZnQEZA/0OyIODS+7QaWPwGeASccxRkcgHDmC4JVeN1QVEn29xGZLN2/j1koInsgBtK5o2DdzD/m6AGzdgKZ6IeQ1xEYUKJqN4dD+9cIQVnNS0HQo5GuOLqHh9zHE2hrY405G8CKbfTjqx8Xm9+hMHvyw8jUOP9uEcnEQkdqTiHu9GBy4CvlYA27ensKr8ul1Amf/FPSsAWW3QQYTbw2ZON/mmNtZDlrYbCiRIXBa0o5SLa1IPdmOxm9GEaqpgR6NIf7tb5hrPwr76WPIaea6qhYWMwSuW44vvSXoo1NwiUo8IUgsqLyoBKR37UaSYqqfPgP/+DgWLAv1Z8/BqqnFwHe3kNfl1QoiteiLjbx6nTGdM9YIRGx5I+jF0TWYpgk1s0IVkkOsshL9Y2OYn59HrEKGUaCYmzZMi4NvAhE2gTGCBJuUB31rRmNmBqFQCPLBgwg1NUPbW432U6egUGkuTk/jQRKtCrrTtMQJou2NMoYms461jFqBz+dDoe8GNFp7qff8mZxGVccLtPvCAwmao2F3OsgIbpAeffP4PjyyS4ToERHvK0XVtS+RfHQ/yv6ehYfiMOknx/5eVIYFXDwR3Yrq5MSCRfk6fqjGtfawF40lOcVWy9QtWex9vVcx29eNPfdMpN7vweTCApo+PYtZWcfe57rh7XhlKz5tgoEzkWXZNcdE6hesb/zMVsFg0PmhcfJl1HmeQq68FkuUMH+kArP1TajLHCgK7mo4vBaey6wXbWl2eeorKusvIuX/px8hJRJQS0sRKiuF3nGC1/r2BCUlJc4msaHZbWzXnTR8wuaMRNM0wlp9LGwD6gK7o9/vRyAQcB9tbtcbHLqw2lmdXGSzWSeu9yOQJMkBZiMXdqt1oZjwizzlXraGYdDllbMzmYydTqcdpWJwbOzZf/4IdGInwi/9y/bO5br9EP8uOjlAagPgBLd18TIvKv8CINTWRKsc33EAAAAASUVORK5CYII=", xS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQrSURBVHgBpVZdaFxVEP7m3pukzZptJKIGhf6QVnBtMaXUpBGMvohYbKqNtT8LFkH6ZBOhiE9N8ElELPSlIqbBCFqLtrUQUdA2rQkKhsS221SaZIONNClsdzeb/b0/xzl3z90fzIZIZ5m9c+ae8818c2bPWWAZEULUsx5jvcgaFkWJKl8X6zr8X5GLFMBK5VSlQLQE+BF+9LDWy7G1+AdysUswF0ch7EV3jl7dCH31JlTXt8N4YJu3NMbaS0THKwaQ5VDgDDyKzFwfHPMONKMBWlUdSKvNz7NTcBzWMxPAmTh8XwxAD2z2YHo4SK830JbIHKd/GRbJ8FGQbqC6dgOMGj90XePJGVd1nVB1WaD6xuMw1m9Acm8nMh99WAgg96aMgarfmCzLB6f/whNVJ5ydzULTNIJGApxRkao0fkgAPyV4Ha/lj8PvzfExVL19GKuOvueVq5nXzXgMZGnqr84siO8uX3F2boloOmWhuxlnlbJNrBfuQjs3Dy2dhpaRyr5UCkZjI0xmYY38CrV/p9x8VPZhOWg6/DN6nx8Qe7abpFEx+3z6zOJsHDgX94rKH1IWYDMdK3QdaGtD7dkLHt8HDf7qkNZQKAKy7uDVzSHSxCMMXiMhVQ0Z/htm/W08XyNZG1UtoWqnZXPuhlrDwy4LY8ez0t0lA+yS1vnf5/H+C0OQdScnxh2zhunlwegrBv466kGi2Hz8Tg0pFoNkrfN8e3DQC/CcDPC0tLKpKbG/dZzcADBBNmesrQIN8HMgWgR2Ywig2H6gdIbZmy4DR+rIsPd2naE2BPsCg4VuyedngT77G+jn7EllTFQG7Krj5INIn98Pa1eHyO153V4NGF4AV7Y99g9JugWsz+8BUlcggoGzh94SmQNBsnw+2TgFXGnMyEik13HSc27+1LcycPvJgDBf6xTZg0FN5DuSnTYMo4AfKwTQfFsh4rfy4H3Lg1vbW5B95wg/nylWtGRfSgKMS2uItV33t8M+fpJ/HvcqliH3xj6YL70s7MBTtFwCNTU1nnle0pKbHHUz2/0KiDtAQ0kjNjwkcvsPUPbNQxB1/oqgsjxZKyMWrAg2Phrwlq83uHNi/PKSy4LPEZuDuL/M5q3C7NxLZsduiCLlMkmYUYzFrohwcoKmEiFMJq7jRNv3Hni/PIv+c9jZn55Ecu1aOC2t+WNCScpKYDY97dxK/Ek3E2OYWrxGkdy8Sj+/BQebuhDc9K70FA47KqEoj9hPXDA+vOYSs2IyeY1uLoxiOhnC7fQkkhykvC7eWgbf2I0gq5Ju7+IpcJcOtR/Hamv5YrEs+nLiY8ynZ0EV6w5saWhFsKmbny2eu+xWW+rKlEzc41uOr0Z+w8jdHzG9cIOD3Xbn+Iw1LuCOh18sBV7yyqyQmXvp94uVy0VxH/8uuhRAtAQwrHw9qqwV5V+qNXQqRFXK1QAAAABJRU5ErkJggg==", RS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMhSURBVHgBrVbPTxNBFP52WwqLqW3BAhFNquUiRIOepIkJNzx4IF41JkTvVjh6oOhZNP4BFLh48IKe5ARe4ChE+WG0tlEgxh+UjciW7Y9x3uzssoWCVHnh8WbmzXzfm2/YGYADjDEW5D7IfYp7mu1YVo7FuUdQrdEiCXBYS+5HpFQAv8tDgnuQ+nPfZzGzNinipqmLOS3HTqMt2IHYyR50hrvspRvchxRFebIvAckhwQXgs+Wn+Lq1glBdGH5fEJq3XswzClvIFX5jbfMzrcLD2Ag7G2i3sRKcZGgPgaxcsI8tDmMilcS5xkuoUb3WrN17ZZbnCgbS+jKunbmJW+39dvaevRPF1pyHNyTL+NIwXn4aQ5RLoPAsUxiPSnk5zClKEil4vz6P69HbNgnJdZGvy6hyCUkTTOkLGF96jMb6ZmwzQ7jJcjzmrH5JusjlRM4E5bYQrm/B+PIw5rm08vySoiZZfZo6N1514VtuBdFQu6he/FKsgD0KMVG52AL9lIBUdhEXGi/j0ZXn9rQQFxi91PqQfYcGXxNOaM1o4O7z1AhkIZMLWIGrz5wDRL6YRy3TYJomVn9l0OqPUCZOO5jijW5d12EYBrxeLzwej3AHlLOQ3u7onIGMpVIJxWIRhUIBmqYhEAhQaprOoJNalFBVVbgN5BTqArKjO+8uhNbn83l7KOKVByIqoGSZzhVA9jNFyKnsLi6iuie447+YTeA2IsiIhpTmKIzOUdqGQ+Dz+XBU5iKYo9Zr7t0/jBo8mNChiJ2oqNroW+AfAysVcb/XD79fjL4gArozBiPhWujbHsymTC4mEVQpF7O+tlMhFdGmWnt0QuW6070xTb2Bq0E58fB/PWVb4Ja802QPjLrvoj7uG7G2Ok4S2KmomupFgQF0tIqzFG8DNQQBMdkDtIuBnuOQov4N2XFa4xRnPTwZgV1eCEvAulmxsGqib+QnVtYLlW87iR+L+tDPgWNttW7whN2p9GTGJYn4wmc+bmPyrYGFNRNf1otiznFN4cB16DmvuYErPpmVC7Me/VF2eJti//HfRVwCZF2AaTmW4B48COMPJSb3R7FZiEoAAAAASUVORK5CYII=", BS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANnSURBVHgBrVbfS1RBFP5m7t2rrriZUEE9tEFBP5WoZ3uJXirrL4jeIgrc3iNXqvcgelao6CF6yJ6CyF8PmoapgQQhrhlCpe267N3ddt07nTM7s2qprNmBszN3dub75nznzJ0LbGJKqUbyDvJe8hm1YkkzFiOPYqvGiwxAtda1EZFYB7ydmjh5Iz8XBvrxq6cHRWrV0pKe4+zfD6e5BTVtbfBaz9ilKfJOIcSDDQlYDgOOwvQ00l/nEIyNwRt5B1ksQtbX0wqBIJOBIi8lErwGO56/gNvcbGHiRNJpH+Q6O0fmyWP8KBTgzM8jPDSEkOdBXLoMSWDS9+ESidvQAO/ECYQOHkS67Tz8e3crBJybNQRGPw3OEzPRKOoIxCMiIQh0YQHuxATk4iIkjcts1rgPBwresePIP3oI/36FpMPmxEbA0jQuf5xU2WdP4R4+ArfvLaRDy69dh5QSzvtRagVKN24SaZnEyea0CyIK7d2HPG2Oc2Xy16VzYJhm+CF5+BBUoIDhEb37kI6A0lQfptCyQG0tkM8ZTVca9hJNK05OQra2IvL6jY1kJ0dwmXu6SmZn4c59gTM1BXXqNESOQHftQunCRQjSPjh/Adi9h/pZ2rXxXNnlz6SWozQwYKNgi/HYJU3wqof0LGsWunMb6uhRLF+5CpD+YvwDQDKI4WHg+zeAibPGM74mx+KCXisNlrEzLFGSNcucOws1OFAhEZTo5fZbWhaXEijm5rBS2QpYKT8izCGgMg44Ah5raUHD8Cj3EkygZ6dJf0kSVQgsACWaslsGEmItMHsQ6JZBLEFABzHy6bOe5tr5hb7BZQZwCJBLcQ1YNUYkAZGxmz279idBHpWe5+o/aLeKwMUWCSprSyW9SWMpaQjg0Wn9X+a6FWHGmaDfEpjQtm01NTW2+5KTzKeOKwlL9LYsUYh8cv9FItaframpyQ4foHwKfs328VM4HNYTrW8F3M6PRCJ2uJuwE8JMiFJDpwmNWTo8+Xx+S1FYApaGN4ny3XCSCfTLjjvUdNooaulwVRPJ6jm8xoCzdRrMvy6cOMpvVp2LDF0qrOtGkTAwV0xdXd3qymHwODbZVcxc6tqKxaLyfV+l02mVSqW0UzHoMf7vjw+BGKoxc+l3q+qtV23j6yJmAJKrAGfMWNyU+Yb2GwAZeHXKo356AAAAAElFTkSuQmCC", WS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPzSURBVHgBpVZdaFxFFP7uz/6mySYxKSRNbVJtSxtp/S21FisoSC3VVPFBECS+qxGUiC9usCKNtQhRRFGaF1tESBW1PiiGaFN9CBpj87Kiuy2BPIQmu9nd3Lu7997xnNk7663d/IiHfJmfe+b7Zs6cmVlgDRNCNBNeI4wT0uIfW/L7Bgjd+K/Gg3yCjdqZ1YS0OuQvUJEkNHPbtm1YliVLz/Okj2maCIfDiMViiEajamiWMKRp2jurCnA4fHKUSiXkcjk4jiMJdV2XYGMh8kWlUpHttrY2QYKKK0kiQzcI+DOX6kycz+fl7JiUBkgEfGsli5XLZTQ0NCCRSCiXF9VKNBVzKn7lsDB5sVhEJBKRpEpAOv9LRAlwySsOiHC47iD/jO77c2iaeSY8c44vExuGURMIrkQh6BMKheRYFvL374yclD/7NDfm5+cR+iOFaCoFQyeSTY3QaIaabVVn3dKKyoMP1UIUDBODyXm/2tvb1ecWk/71cW0hu4JLqTz2T0yieewc9FgU3v4D8I4cRXjoNDHRX1cXZncfQs5yEEgNKeK6LopWmYRc7HOiuKWjkT8OsMBjXHtzLIORC1cweVMOWxavwXnlVbgH7gWammC9/yFizz4DFAp4/fwcfkkXg/SyzBYqsEqUVcLFc0cdnO7fw92HWeB2rs1klilgOjZFDM5RmGc/gXl+DE7fcYQ+/ohoaIMtG44nUCy5gRBRd9lFxfE4C6hDxw+zi+pzt+lvCDILtkwq0yAnCkVp+JSMvbelC96OnTC//grGzz/BLntYIUImZngym1DNR7/MFivXCVTNz0DHpPScm0Ps+KPwdu9B5YknETlRPTfezl1wXDpgjkB90wKoGgtkWCkRD1NRxufuNgpTG1LxTkyVduGzix0YbdiGa6FG3NyxHVN/FbCedW+Oq2q2JnC4txUzVwp4L9+Dqac/wJd/erUBd95zCi1xA8d2hGD/Zq8rsLe7SVWnWWCC8MDzezXc/fYIKP3R2bsd6a6ncHluRXol4iY+7ZzGwrnv8PAaxHSmaU+A+weHVdcXfNB4k5e45VDctUuT4OPt9NyKE4+/gR8XoxgpfYves+9iLRNSgLB1K0JT06q7R91F47wKQeQuibCA2ipB50BbXsZ65vkwvp+A1nsbd43SddKv7qJ+QlY7eB/0lwcRzJGNkCt//aVBRS7fhuudqs+fNPetk8Ld3Co8H2IN8Hf2dYdPBl+4gfozESJZc7k8I9y79t0g5AUgifuOCW/yYpA8GeSs92Syury+ZZv2Bd9cAGZ/h7h6tTqA7/yDh4Ajj4DD6lvdJ3O1lfCjPyo2buPif/y6GPAJlgKEab8v6af5qvY3+kml0v+VfDoAAAAASUVORK5CYII=", ES = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOISURBVHgBrVZJaxRBFP6qezozmRmdGKIYcYkbiru4gAsuF3FBiSdPgv4ANYqSo+NFiKIIOXlxAUHQk4LLybgjIkbUCS4HY1BckpiZTMZZeinfq+me9JCFjPrBR3XVvPq+eq+quwYYBVLKGuJxYhvxkxxEnzvWRGxApeBJrsBYcXEkIzGM+CFq4sQa7udyOWSzWdU6jqNiAoEAqqqqUF1djVAo5E1NEk8IIc6NaMDlcMWRz+eRSqVgWZYS1DRNkcFGFAvTNFW/rq5OGbqIk8mJIQbuypU7C6fTabU6FqUJir7YUstmhUIBkUgEsVjMCznsZSK8mlPTzmVh8e5fabR/MfG1ZwCpnIEpNTZm1U/AqlnRMhPPgFvO2GfC5VpOJp0BN55LU0MrcWjlWs/7L2h9LJR/2EhTI5ApZHG3kQTnzR+sr5sZmxiGUco6GAzy/l0kbtbc1e/jCb29vZqu66g1M/idd5Ah5mwDPQM6lcGCiEaHiHvkecz+/n4vZBMfc86gkXvfezNo6+iHrukwUjqJS+xaWYtVc6K4+aIPqcRHPP82HvlMGuXgUoEOg41MNk/Z2Fi9IITZ9eP4xybB553djlzoQOvtz7Q0HYutn9izdw0ObK0vyZxvuYVzP6ZAovzoSRQ3PDlgIpunUyVtHNgxA2f3L+Dh+5zBMn563cmpaareXSKG0IcO3JsaRiSoIZ1z8NOuoqxsJS79BtTJFmyYlqPmQmp4mPjl/dzAB1u9UJ3duWIASaSMMJ4/+oC5VjcmxgLoav+I6+8s2hdbmfwuFNuBnE3mFkxbDqZFbTJjlgwCg7uGMlyLLkfi5EtsmfwMV3vq8D04AbAlRofwsQg26GSnWJjfxAL8bonIdCR4T4OoCA2Twt5jUnMNsHFhLf4XljSM9x5fcQYPiJsOLhFYeaaVtxmaEPgb0DsNh6q4ofmUN3SDjylvch/3rN27IJ4+USaVWkhlQJw2DcaLV97wTFqs4O/Gfe7px5pVoMdKDZiBy1e8oUv8LdLczn5iUqxdB801qVScoR1thli4iB/V3VAeVLz+FOzTLdKeVCsdl3IU8u8ca59q8d9wTcOvRMp4KeTta2mvWDrEyPFRCTfulM6Tx37xuF9zuCuT3dXnW/Vp03HnNr0UbyC7uooT+Ju/dj2wbTu4rC6GvTJHyoQv/Uty7GiT//DvoskV6PMJfnLH4u4xHxF/AHlcfWRcFC9hAAAAAElFTkSuQmCC", SS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQySURBVHgBpVZdTJtVGH5OQ/kfBcwWIWbrTIYDh8GBi5nLyjRmI2pQ5+bFArIbDc5Al/izCw1duJkJMRteOHULZFOjWyJBhxewZKUjJm6BYRtANlwLbPzYdi2lf7Slx3O+7zttgTJr9jan5z2n532e9zznr8BDjFKaz0oLK9dYsdK4uZQ+PSta/F/jQQpAqtaxHhFJAt7MKgMr+bzdPziDbuNdmFjtXgxJY7TFG/BMyWOorX4SuspiEepm5SQh5PS6BFwOBRzXb81i5I4d7T+NYFNhNgryMpCbpZbGef1h+AIhWO97QFn757YaiVAxAyM5uYZAyVxib//BjFJtDnaWbkLHrxP43WwHIXwMYrUcTOEPRmCZcOC9N8vw2bvPCbjjYiZEaM6qW1yW1m9v4qvLozjVtItlnI5LV21we0NYo6ZgkeZAMTj6Dz49WoLmuheEXM8yEpsg6GBVw7zTjycOXED5to3Q5GZgmcVmpqchGFqWYIhCQtknTkd5PHZvHo82VHSptu09g7T8Kv6DkRHsI0r2Vklbrxc/9tlw8Tcb0zgiwxABGwdPtLzMII6/NEQPlFmJwzWGLv92eqzmkuAvSGNfr3PPHwxLWo9PLmJqzofMjDRZ8FXSEEUUbtUl9+jnB03IVYfIdaeH1t2YwbRvkjy9fQDVW/fwIXpOUMu9tgtmtJ4bYggqZKSrUagheHlXMfpuzMo8skaS9JqsJbS9ZaL7yybJQiSKD8dc9Ozd+yQQigAqoPuvK4JAxwkquGdi21LOT4XcbDVaG3fixaoiCfcX03SMoWaHjX5xqB8bcwPE6PBHPxh1kNuLXhKOhJXpERhtA2LCWk4gHSjbjFeRBHAuLMHlCSEUjqJn4J60FXnWpw8b6dtVt4mbZf2+xRn9ZtqjikajK9eFQbiDCysIViks163n/sRHZ25iQ44a+0vv0PP1V1GYEyS9dj9tsNgxG1xWJQ2lWLFsnMDGmfi2ZEsdm4XHF+KAaDvYS+ueHyNuNpvGkQf07JRnzfWy2rQFW4TrjhHoKotgnnDFMni1/G/a+U4fNNlLxPggiENDc3CEo/8Jzq3i8XLhDvNp9nOvViez8qzP1/fSrsYrhKoDpGnEEd33xwwHfzgqRWz/1j71iujt5geNL7KLt061f03rd1xEkcZPeuw+emzUialAJKWsBYFWsxnWJrPo3apix5nfG0be+qShkqRnLaJ5zEFfG5wnKYMnWNfh74Xbye8isROOsuImeVX4jh4hX1o9ZNWNkFL2LXtPCP2lt4E7EgFnEh363R+jRXciHpgKOGRwg4iTHx6bhL1iLKUGPpb7w3MWvHH5CGwLU/EBZC1w9ZY9EjivE8ANyUIEiV4hkU64cXIA3eM9GJ63xMjyMzQSIN8tCcBJn8zks5Yf/U6aul2jj/DvQq8AuBIArUqfQdnm69q/qoRtV0tkgHoAAAAASUVORK5CYII=", kS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOQSURBVHgBpVZbS1RRFP72OXOx0nAsTajIMrDA0XwJLKQeegmi26sG9QsyiHqJHCN67h9oGvQsPfUQlpJCL+pEdIG8pJKX0Ekdnds5u7X22efMyRlLacGas/c+e33fuu19BviLSCnLSTtI+0knZF6W9Vo7aQ12KmykAbYrXVsRiSLgt+kRIy3n+dhcBkNTKfVcy9hqT3WpidqKIM4eKUFDdcg1TZB2CiGebknA6dDgCvDF2BrmkxYiuwIoCwuUBAy1L5WzsZGV+LGaYxs8vlBh1UQCpoaJEUlnAYH2XLH3jKyi7/MGTlaFEDAIVAgUBivZCKmsjYmlLC7VleBGU5n78o4biXBzTo8RTkvP6BpeftmgFIQgGJy3+Ah4SLgeAUcAaePrzwyundhFJKVuupqIZNLQjJya8m9LOTwfW8f+PUFkbANprRn/0/KNZf5dZWkQvfF1xCm1un5dPDC09zdV8voT5LWpNOUDS9sCXN+9YTIgl3ictoSj6p0B03TseslBLee5zTmCqzyLz2WxkIRKy2rWMUwrIC6qo0fKJOr3SWduwSNgXSMbto3P59woWNqZ4AqP3k1nlHtCmPiVEXkPLU1CerpaonG/9NYcckHvBFayXCtTYQxNewTnAvRzikfjyzkC544xkCOPVtLAIfK45aAqp5KavYBFk4s10uulwRlghiK3LG4AoezHKArXJKALQv0u1Uu3G3M0nVwB6iIS149LVJQ43aNCPiYpjUD3R4Hvq0I7oLuNNJm1PQIDfhHuxvzSqymBB0MG5Ti/lqTx/UEDA7MCEpvlzzPDBJM8KA0ZBeCusOfUhZ7wgU5mUUQc4+oy91Aj4RE0HNAIhS6hngq7uAE8HBZ48p7qQzVsrJQoKpSi2kjAnY0ywVsenTkcdI9ogZRT/98dMPBpSWBkUaBj2EDYLI7PGM2HvXD7BB8GGizz7N7rJD4sSt1NAjsSdW3YqNot8eyydycdNai1+N54w7O2aNjZqPIkd4av76aOlt3uUrf/LrpFmmioCqA1GnJStRN86YC31odxLKJyp74NPFAEzOQutNGm1vqQCtepifwnOO9lm7ao9/Hp1JgFH5wYnJsV4wkbjwZTmF+nmnjbxCZCiWilSeBBNFSZfvAYfBabHJLtmkSd8PiCheFZi64S2znt4DMDRAmw+aDpBy76ydwiavXR75bbl375H/8u2jXAsg9wQq/FdJtvKb8B7GZEqW2remsAAAAASUVORK5CYII=", NS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPXSURBVHgBpVbdb1NlGP+d00PpaTfasm5juI3WBisyUaJXiJGYGKJExewv4HoXLlFDoiQUTUxAZ+ROr4aJN4sXxgs0JOq2CE1FYha6TUycHdugGyv9GPvs+Xh5n3fnLQdoyQbP8st7nvfj93zufQs8QhhjIY6THIMcWXZPis5cL0cUmxU65BBsVPrrGVJqkL/PhyRHiPT09BWM5sbww9iP8Gk+6JqOVWsVXa3PobvrXexv2yePljhOKYrydV0DlA6HHLMLc5gp3sCZ1Fm8vHM/Iv4m6F4dOxt3wLRMjM9fQ2G5hFtL8/jsjRPY7g9LmiQ3ckoqWg3PkZpMY2llBcv2Mtq27UDA50c4EIaqqrD5X4UZ2BXehZAexDZfA9LZy2Ae4Mizh4UBzlWWkagy55L828v9+G1iGFu3erGnOYEjicPY27IHN5dyaPAGoG/RcX1hikfjw6K5jGKljKJRRiY3jr+m/5b+npQ1UeUE5XxkNoMPLnyCcmUBmflxTJSyOP/fBSxxong4hjvGIhRVQWtDC/65/a8waCsM+dUCngq14fPhLzGUvQinfv2iBo6lLCmxr55HR7Adr8UOIhHZjRVeTNMyRHF/nRzC69FX8Xv2Dx6FD/tau3DzTg4VqwLDNBAPxnD2z28QDXVg8Nh5GUmYanCUvsbmrtm7Q3GbPJwqTSu5xVnRA4rTBn6PLjrKz7uIO4Wrs2PVLiF9ZG6UPdMUBzMZJm7/r8WbnqblXopgkH8cKpfLWOGF1TQNHo9HoNpq3AqRuEendtXRtm1YlgXTNKHrOoLBIC0NUQ1epC9aoC4hSCJXh4kxlUohnU4L3b3udoTOG4Yhp6KaUxDhAS26xU3S19eHgYEBBAIBdHd3o6enpxqJJJdwnYtSioSWz+fFDKVGbnxQEokEvF4vMpnMQ2syKkoTjc3NzeuG6RIjS4VCQSzIFD1oYGZmBrSHUhmJRNDZ2VnXADkZDov/7BKlaJIMkGdra2uoJ+3t7QIbEWoUR0boa5jjkC8/D/XEx7aHCoXHE8q1xaPwJj9V0NhIKfiJUkRFLtIG8713oKQuCQPKY5DbhI4ObLkyIqdjKs81XbNDpHk+Oi42SmyGXEL77ns5fY5zT8psHOMoKQdegeoY2azQGeXD41D2dpEq3ob7N6w/f0KsL04zq2U7sx2wR4DWaa915rT7heut7QVjyeqW0avMeumFhwzZLgjio28z+9JFN3nSzVnrySTr4voWOi86fvmZ34YZsKmp9QN0zxw4CLz5FiitjtR8MutFQo/+ObZxGWRP8Oui1yEougizzlzSafO6cherg5/yCRPGSQAAAABJRU5ErkJggg==", IS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ4SURBVHgBpVZtbJNVFH5u+67dOlZbFWR1Hx0JmsgmLTEqTjcaGT+WGInZH/8oGgEhokMlyg9YFyIfmmyYJQTjjxE1SxQMbBgWImbrmKCS0MJwIZGsXRcnYWFr19V29G1fz3373q7bOphwmtN77+m9z3PuOfeeW+AuoiiKhbSJtIfUr8zIhGZrJLXj/wpfpAEsVtoXImI5wD+gxk1q4WP5137c6T6jtko4rM7RlZVBX1kFQ309pBdeFEtDpM2MscMLEvBwaOAqYPxwC5SREeiWLgWzWsBMheoSJTpFGkUqOExrgMJvvoV+VZWAcRNJ8zwCzXOVPRKJYPqH72HyXYZuchKMUGgRVDR1iQJF/QZS/8YgXx+E4c23kL/rEwG3U+yEiZhT4+Vhae45gIHRQex37UXxtB55XZ2Q+s9necM0+DQf76eIPOHzIm/Lu4KEh8tJJAFB0E7Npis3r8FxpBpPL69EqeVxvFH5OupX1EG6eAF5Hd+BjY0hg8zYzC5onIxM0k6uo+BUl8hLLxG4mOa9n1sqWqoQCAex2laVCd76Che2Od6GLcpUEv25n0VQ6cO0HpAkEvnPa0B1NUwnT4tQWSX62sh747f/gDF5i44Iw+3YOAoMBeqMrhtn8PvoJWxZvQkNOz9C6qlVkM52Z4AFCRJ3KNtLICcSkAN+SPYKbm3kO+ihzrrBvs9gl46jJRjB/kAU1gKLGoY0TLp9beUr2LFmK0qKbJhz+pBKpZBMJiHLMoxGI4qKitJh4reSJ9flcqHUdBUH37dhupBho28cgTijDekyIIwTsTSlOFE8UDE5hoSc0BICOJZVwrutn88K8BCpF8rv96N3eBznvVPYt92GK/XL4L4xgQNDkTRW1jkSGVBPEHkuTpWYEoqHxcguYY6EoynkSWmvLdSaWAqhZAr3FJZhnnV9OUGAM1mtVjhXhPHlxyVImhnWXhzFb6E47kfs1nLRDWUIjh9pQLn+BNpGwtg3EEJInu/1SyVr8dWGVpSZS+f9xnPElSfaYDAIs48TeEjXPfJkHdZ3tKGPez2nBD5kNGP38x/iPedm9HlvYffJC/Pd5rEhAh1F99CO57Cy3MSNnZyA14wm68PPQmd+BpjoT89nM14frWuFWfcYtn9+CR1nh5Fb0gTlxYUEbhHGUzq6zrxu9PJRU82nmelGyYhDtc3objiB4SEjaraeuwv4DMmPX7wsBseya5EdWrFzew7ilyEPjm5ooXteDPfXA2j/aeiewNz7PZsd2PuOkxtmFzuNpJGaVt6Px+M43RfErjYf/h6LLRLcSeAOYcyU68w94Ab+BlO3KT8/H0/YH4WkF6ViYaldsxx7CJi3msx61XI9mXwn/GVTM+W5fBOdniCu/kWl458pdY5liQE1BPhqbVk2cM4nM/em04/+MWXx0qM8wL+LRg1gIgvQr9ncWlgXlP8AYJ9b3AA/xUsAAAAASUVORK5CYII=", TS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQjSURBVHgBpVZdSJtXGH6SfEkTE9Qt/u3GdX/d1G0XE0bdD5vUsa1utheiXpRBceIPDB3adcSNxitB0A0cWymyht0osos5WIco1CkOW3EOfyg6xSKiOOMSxST+JPl23jffyT4ldpY+5OWc7/w8zznv+55zAjwAqqqmCrsm7LawJfU/+LS2BmGn8bCgSRrBSXHzOCFDAvJ6UbiFpdL37u4uQqEQl9FolMcoigKLxQKbzQar1Sqn+oW1GAyGr48VIHdo5Njb28PW1hbC4TATGo1GNgIJibE4ODjg77S0NFUISi63EGmRnMYEK0d/fz82NjaYkFZoNpsPiZhMJv6mPtqJ1+s1jI6OSio3xeaQgOY/Jh8fH0djYyOGh4d5F5JUrOqQgL59cHAQ9fX1GBsbk7zXZEzkDsg1qfv7+ygtLUVFRQXm5ubgcDgOkVOpN2qjnUxNTaG4uBhVVVW8KC1+NzkGmtISfTQ1NWFlZYW37nK5kJWVxUTKnTGYf/4JpoUFqML/kZdeRviDDxF+JZ9jsb6+jp6eHszPzyMnJ4fnaniMdnCRaqurq+jt7WXfFxYWIjMzk0dYPN/D9qULyt27MPj+gVEE3jwyDNvVK7D84OExGRkZSE9PZ6Guri6sra1JgQYSuEA1u92Ozs5O5ObmoqSkhFduufULTnXdAIIhIBSMlcGAqIfYTt24DmXyD2YqLy/ngHs8HiQlJUmBt8hFPvLZ5uYmIpFIPFtI4PePXHj/3q8iCzgVYlktfgcGRXyJBUT3ET5bgMA333HqkhEHzRepS5PuG7WAcKfMc0I4omLgLxGwnZ3YqoNB3kW75SyynVeQkv4FrlrPwTQ5yeP1wae4aDgdZ6QOfUm4nvwaBqxnhFoYoagBLY5z+NzxLrxRi2iKosP+Jm4pz0LPoZ9PUGgbrCRWr1OGYjLg+Wcex3lU4UzEi78NdviNNhzFnYKLeONIG7lZg9+oCXCAZmdn0dzcHB/4ccnTXM6b0hKSE3IuvB6vt7W18ZnQCfxJAr9RbXFxEbW1tZiensbIyAj3XnrvybhIInx26QWcL3iC693d3bzAyspKedgIfZRFFGTKJD4g5EMaPDQ0hJSUlNjkgWV8++MC7t3f5v6CF534pOw5vPNq7KwsLy+jr6+PS6fTidbWVinwFEeE7n5RvE23Y11dHacaEXV0dOAkqKmpQXZ2Nl/p7e3t0kUewXFZZtFlYX66NcvKyjAzM4Pk5GS+qv8PdKXn5eXxVVFdXS3J+W2gSjyntCv2K6rT7Zifn58wdfWQWUflxMQEioqKZNen8uE5+uC4EbtZ2U074pDRAXyQAK2YXjZd5tCr5sZx0B5yn3xsRVzUQCCgbm9vq36/n024hduo78gfgQacBNqj71FPjtvqI/y7aNAIfDrCJa3NraX5sfgXMdSCDrQleUMAAAAASUVORK5CYII=", DS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALgSURBVHgBrVa7blNBEJ299/qlIOyEpKCJHFpShAqkFBgqqOAXoEB0mC+IIyEaGiSEhGiSP0B8gU0BbZCgBQcScENkW5bx695d5ox3nWsnBltk5ON9zpyZ2Vmvif4ixpgcY4tRZlTNsdTtXJGRp3kFStbArLIzjUidYvwRNyVGDuNut0udTkdarbXsCYKAkskkZTIZSqfTTrXB2FZKPZ9KgHRY49Tr9ajZbFIYhmLQ8zwBBES8lwaDgYyXl5eF0EqJSbZPEFjPhR2GW62WeAejrCCYcEYAsn6/TwsLC5TNZt3yYxeJcjnnZg9pgfF2u02pVEqMzkKAFhHHSJCuK6yz79n9SE0OnsBzhAvDvu+PEcThUub2JBIJ0QWRPb8dicB6X8WgVqsJG7x3BuKeow9vJyNBFACM47xWVlbc8mLAX3fRG9RqOqiUdcAeBem08lJJzt9EkbnhOMcwXVFkFKc21BENrl4LEmuXsFQEwR309MsX3rnXr7yAvfSR/8XFmHllrcZby4QPD3WjQUku5QgRPXhI9OQpNlwHwYZs/fyJPKfKoaqjIyLUOErT0LFh4TBx90l1uqTCgejjpugP791qPrAHQnRwIClRjgQ1DnDKyJ1DvJJAAuDygcTq8alRxJUYJxglQalTrnYU0ayiYnCCqPaldz5LZyESxeqqGzZGBP7mJp2VqMvrrvsRKXrHKHj3b1G0/iw8EeM8gmPhI/Fv3objwFtcNBxyHevh4Q1SvYoUjpqTRM4b8PKUyFfd9JrHtxO/GxWM/Atbo+Iw89kf6rD3wcU3bmo3/lt0j9FQmQJ5S0OSeRjctYCuSsm1krdB5vAFptHEUolv8eyRuH2U2xJdK9vW5uRmUxo9gt09E33Lm+gLR/51CFPl1oHHEfCjYPTvcvz5LP3DI3nI6243lPWvotE/Cyb6njcaONwYznXGDEOnSLOIffR3zexSNv/x76JoDdRjBqt2rmTLfKr8AY8+Nzo7dEetAAAAAElFTkSuQmCC", HS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP8SURBVHgBpVZNbBtFFP52s4lNcBoHqNMUKRjUhAOBOEGVIpHgVMoBCVFTUYEoqqColVIO4CAOVaVi+xIhcaAKisStvcClarEPQEECO4KjU5LUPjSg2G5JaGhdryP/4ezuMDO747hxQhP1yW/fm9mZ73vvzcyOgf8RQoiTaoBqlGqKbEjO6vNTdWO3wiZZADuVC9sRSVuAf0RNkKqTtWOxGCKRCLeqqvIxbrcbHo8HPp8Po6OjYip7GZIk6fy2BKwcFjgHnJycRDqdRmdnJzo6OuBwOPi4QqGAYrGIpaUl3g6Hw6S/v19gBSlJqIHAipyzh0IhTE1NYWhoCM3Nzewd6KT7LJ9MfUaUSCQwPj6OQCAg4CZEJpKoOTW/s7Iw8OnpadCIsBuJx+Pw+/2ChJVrgJKkBcEFat6bX8xi0Hvc6HMty6IcdRnyiDf7or22toZkMoloNCrWJUbHHJKs6FOs58Dhb5C5XcALblqWf37WDTXRVKtlXWm2k/n5eQ7OSCzpUOjjdebNzK5wcEDGvXIr7E8caRo59K52+mgPntzb2hDx5ux0XZcqlQqhFtVqVWlpaWGv/IzAx7zITIbFieGeFawWHkOh4sKPcVWJx38lx9YT+if5X2AuGcHG3iDmjzYNNU/0f8vQDALy/kkDnwZlOsDLHh42dOGPLI9+f3sZXx27isH9izh+cBZ56NJnmkcZsJ1QIqUuGdmsgrt3LL3LrXTzliLdyypysaTIpZJixKKyFYGbOfxArd7JYaR3GW8dXMTIgRWEx68g+ZcNy1kZpYqGG1ob3m47Kp9qfQ2ZdTtQKoHuUXYoAG2d5yTxEOkznxfVcyvCc9g1uNrKeKRFq9U2V7RDpykzFZIibaS6Ttua1vAVkOpUCCNIM6YqceLytR40yRJ6XHmcDb+EV/rSSK48DrVsQ7eWwxfZK+RwKdkAvFnk7m7hqjUC74tdWPgzh1s5B8bOv4FMdg8uzfZij1HB2bWf8HE+RtqNygPBeSbP9Ql3jp2DIHUCM7N/Y+yDHyDTVTGIuf2H+/fiywkPnnHZHwjKtqpBDBi6gUedTig2G+ueYARskXOsNXb6e8xcWwVpzcHou0zIvuSOIjYZTHW3dyP14YLofVqmB4h9N2Ksde7UAIzeq9C9n2NX4HXy7ZtfC/ci+xaJ/XqCquod7MK5kwNAU9mMaJfRB14+A8++51kPvxuYwwkYk+gIes8gQLU2cSfgMMGDYp558aQ59n1jrQVn/tzt6zhy6R2k8zc3BkiNwKNPDXNwZuvAg1tNESR+i8S8MjO/IXLjO8ytXq+ROW3tHND37Kv1wFtemVtnbV76F8nOJUoe4t+F3wLI1QGmrL6gtc23lf8AREdhvfSNXisAAAAASUVORK5CYII=", PS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP0SURBVHgBpVZdaBxVFP7u7G5i0iQ7SZOUglm3iD80afyJlbZSo/SlxUJEQfBBsOqTL0asL/XBDYIP4oO+CIKQ+uZTISjYF2lDaRDENE1NbPrDJtkQWjfJTrY7+5Odmes5d+5sxnajCZ7lzP2Zc77vnnPP3LvAv4iU0iT9lPQCaVpuSk7PDZMmsVNhJw2wXRndikjUAf+AmhSpyeO1S5dx98fzWL00ger6urJpSvQg3t+HPSdPoOPFI4GrRToihPhqSwJOhwZXwLe/+BqlxSU0dnchZpqItjQrO6dQhGsXYM8vshcGfvgerf29AUyKSEYeINArV+w3P/8SC998h47nB2DEYiFDqXtS9bjvFIvIz1xHz7tv4bFPPg7gPgwiEUHOqbnCaWHwzLejlIJe9VLcF6agXwAvQ2pNXkXi/fcCEk7XM0QyHxCMUvN2/tqMnDh0TMQP7EesZZcPTt5kyEYQQqOpxieSOp5q/h7ys3M4+PO5YF8ukt/LQq8+zTOFiUchKguIxfthEJohNKgQtTTJcJr08rl1SZ38NNA2iOZnfwkCbjfo8Sr33Nw4QOCRCGC4azCkjcpGFek7HgrFCoRnA6TCK6m+8IpkU6QIaUyt4eZgEJq3Pg7HGg8IhqP0GFKVsTKmDJQ6WdxY7kHmcgzGisT1qIFqh4mhN5ZDG633RPpjoQkiHE12DFFzkF8PcgRPc8+zryJCfgbprT8luhuXYDVY+G1hA3fXHDzRv4zZWRcVu0wI9qZyNLQgjoR9OZschZYkE6gPSpTn1UvW296TuPF7HEvnyjjQlqB6eAdz5dewIhIouZyHogKGWyC9R0FVa9XGJJSjfxD4oWpwjnhjeg8yVx7Cnc5OzP0FVLM2uuXDyE82wUo3KUBIh3dus6xCGCJU17wH88xESSOkBbUCKcsw91dwuJTDr+sVJDIVNETzUDZ2CXVFl7CKoikZzFqGJkDE3xQlG4/H0dXnodzm4lCrja7KFBpX59A60IH23ir+S8Sup4LuFBOoHTF2D9UMssUsGppNtPdF0PLKCxC9e7H3uIPJm4tYLbfVR5WbTbSzhjXGHxpvco5HzrVjEPlxVW5CYEfCe+exxpKIHbwVTO+L0udsEclFGrxUsD7D1InXwWHtEF+t3CN9bmIM/vGIs3wWBVV0itQyjx5B8sxHtQNsJ+Csj5Bvi39sq7uBO4qAmYKJ5JnTynC7JGHwfeSrZURjPnDhpKjhSweF6RnMvHmKjqdM7b24D5glfvQwgZ8GRx8CT9XzCUiGNYn6wi26Kld/Ok+Ef6C86JNF43EFuPvk8TBw3Suzftj+pX9Wbl8uyP/x72JYA+RCgGk9l9JlvqX8DZueS/CZSfwBAAAAAElFTkSuQmCC", VS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARcSURBVHgBpVZdTBxVFP7unWF/oMsuxVLEVsCmKbpBjElbNRp4qE18IPjTNzXR9MH4YMBUfWhjgMQ2McbE1OiTSUl8qPGpGNPEPwrVVG20oU2oUCysGEqBluVnZ3Z3Zmeu596ZQUq3uKYHzs69d879vvNz99wFNhAhRIK0m/QM6aT4V9L+WhdpA/6vyE0+QKly4k5ErAh4Jz16SBNyXkgPwZrrV09hLyobHm2AFmtBqKYDelVrsFW+7GWMfXRHApkOHxyF0UHkzh+DiE+Bb6vFwvmtYHyT2iEKGQjHgJ2eRG6O4/7XvkCsORnA9BBJ720EvueKPXeqF/nvj6Nsx2MEHgJ7kGG8L4otj1u4/mWFtKY/b3vBNLE8MortB1/GziNvB3BvBpHwIOeB54On34c98AnCjY9Ccy1w8lYTBtwZC+kRi7w3IcwsQCoIXALEk02Y+vQzjB/9ICDoDmrCgwWZ8+Frf+Dot8cpr/eC2yY0qY4EMeFczyF31qVMe+BONKOIhE9UXleLiWMfYuHsOfj1O6EIfKZX5OS5vtcpz4DGGbhleEoeM0FeZ7NwTU/jLYtw48sQeobITGSb0qhut7G1PYuZofeCKNrkMddp8KxKzdVfkVqcxk6qCjdugoeiqkCsQB8uh2uEvZLJIteuoHI6gvKX0qisEyiUuSjYebgNBqZ+HkTj2E8o3/WkhO2SKeqQo/6R72gzk//gmXkw8p7ZBkBpIrfhyLSQt45hwg0bWJg3sTJuYeySiapyE7OzN4AwlX5aw9Xf+oMoWmUEj8jR8LVRz0HpdiEPZswDepTGGuAwiiC6euYcIs8vAUtXbBRashifzCCbs7GU5tAGKpCZvwC8qEwbdL8gmExPr55cj8T21CITV1feyxfL3EF93MBMzEHZBR11+5cRijqYWxBINgORr2+ARVJBBIrgVln/3XYdeY7peBbUNFomMDZtIZZ0EW7iqH/IUeu11UyawXFVwKsia5CSg6porCj+etFthqUJDSJpYdeBHPK2nzYCzubpadAJjDQE5ourBG079qJUiVXSzpMVuJniuHw6pNamLnP8/m4lfjxQjSs/7AlMhyXBkBx1JPeVTHAPHVuMh/Bn12ZkPo5j4hJHfiAKMRyGTmnatrs9MO2XBKpntD2wl3SPyuN/yfLnMUQyGmT2q14wcF8N9apfvHJG6rcj8dQTgekpTk1JttlBOeve9wZUIxNACTwQjAr+VRgXDyWQmA+pPc0n+4LXfYSdCnrRq6SLMorOpzs98HUMoS0O4gdXYHF3dU0XDDW2jtwsV+b1hw9h08Oqbau7QQ4UgWQKFp7Z/w5Ye7fasDYSkXBVfkMuvzUKXyV44+G3guVeH/O2C6cHXmcF/h6Ge+55QvwLrJZh9psIikplKyK7j6zNuwTvCSbFrswun0R9w8USHbIF6i3mRYh8ytugJRQwNneAxTe+MouKf+n3idLljLiLXxddPkB6DeCkv9Yje/5GGP8AhGaCmrhB/noAAAAASUVORK5CYII=", FS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP1SURBVHgBpVZdaFxFFP5m7m6yf9lss6IGLQ0x9EGxaC2CETRPNQhiRRT0ScUWfOqq+Nztu9U+t2KLIPrYvlTtg62CWsVSDVbECC20ZluyyW7s3b272XtnPGfuTLLr3pZKT3Iy58yd831nzvwFuIVorUukB0jPkF7Sm9KwfRXSKfxf4SALcLty7GZEIgF8PzVV0hL7of8z1ptn0fPPQ0e+GeONTMLLbsdIaQ6pwi4X2iQ9KIQ4fFMCLocFJ+Dz6Fz7GKpXg0yVIdNjEDIXj4vaUIq0u8QxKEwfMoRWqkRycIjAZm7Yg9oRrNc/p+wehifTNEqDguLBmn/5RxhbRQHC4C+kJ15EdnKfg3vbzUS4mlNzgcvy/qk69m17BencdkhJoP3gLsKQmDhoRSTk9Fq/Y3n8ZfXA1rekLdejFHdZ2jAuTem3qx0cOrWC1OhdkKILiY5tnd2JW6Pd+Jsdlx69Gyf/PKx+Xf4Bdv2OsSFt9q+x88aRJerx4HkSHgV5CGhAh5IO6GuXKtWhtEkR9/E3KQJ4TOx5pAKf/PGBm+scb3OewR72vl9s40ojohJIClzbBCWwdtgm8MCAC6sB1Z6/CR2PkdonMmBh5RzsLFgqTPA8W18utAw4q1BNG0zZqgBfrDXwk09lVbH/7T8NnF5bNT4Tx6RNE85r9N21rxzB0yn68whbF//uxuBg7UFEBCgzWA4VviawPKX3eLZsED5bqaMdaewuCOR4I5gyhvFmIJKF+jlHMJWyC4Irq1FML9zeDSlDH6ebVLpOy/T8eCOFG0rhatc3O+jEqsarE3mzrThGiBjCD9cGCDb3n7Btn2gdIdShsdtqHWmmVj3jjwqzWQcg/itctctsFHMyceALW/KmPPeNpIhIY4TsKbLvSXt4djw3BMihk/mtzm2mLMHU7EwWF5f8oYC8lNhTyhvAT1d8FFMSL20p0CppZGVCyiTTxQed+Qun/Q1b8zv6stGDATwLluthhMVOD2kC3j2WSwTn0Ccnn3HuSSYwdwbPYHZmdBjdzuJ6L9rwA6XjBU1Avzd3P3aUn3A9JyRtLb43zrL37nyJV5V/h2jcWnCpnhrLDGPbmAO7PnJdx/kucrvoddILszOZ0jvz4/FdqcXAYru1KNE1khEiAVzjuen9clvxIe4ybwMb/dd1hZoP2Vb1o1CNo3T0488Or0VngM4Xip7cKAlnrYhBTuyFLO91cIPXdR9JFfHNCt1d1Kr2Hh3q2gaBvak3x3NfZidE+U2I7GOum1+1qnOSnsyKJTEnXAf0VLZoo3UW6YTV4kGyAOQIOD9HwDtdaOKTmSj20T+ub1/O6Dv476JiARp9gJdsX5Xv/Fth/Auwo0EPgikYNQAAAABJRU5ErkJggg==", US = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN4SURBVHgBpVZLaFNLGP7mmEhTvSRB3MglN9mUy70NVXrBi16xcjciYnWhKCgqgq+FxoW4THQhVfGxEAUpKApuNb5XJtj6WAiJj6rg4sTqoqA19pG2yck54/yTmdODJrbVL/nPPM7M9818M5MJ8ANwzkMikiIyIkw+iaKqS4iIYqagTopgurjYSIjVId8vkpSIEJWrD3tRuXtHpnxoSLYxIhHMao1j9qpV8C35T3f9IuIwY+xMQwGyQ5FLwokzp8Dfv4cxfz5YOATWPEd24aVRESU4/e9EH2DO5SuY9Xdc06SEyOHvBNTIpfrEiWMod1+Av/0fGH4/mGARnSDZZBcOLp+AMzaO6ptXmL11O5oOHtJ0B/RMmPZcJDmypa/7OI+c7Gb+1lb5kgkWg3lHwxR9TY/yjhC38jn4d+7WImTXIiFS0AIXRbLt+UCf03ZuiXG6GMde8zcYipRpNsYAT96dhSjbI8NiJm8QuH5Dr0tWCKxgavQm1cROxVEY6kfbgjjaPxlIPQF+LzHXSKa4lYr4MJUDbPGi2vcSWLoUzddu6kZhn3islXKFXklOfgyOf0ZPOIAty4Cjz+byxXNbmDt6l1IvSc0yp2LBaW6GXa7AMk34YzFqkiCBTsqlX9+C9uTj+CDmsTDeNjGsX1xie9pWY9+iXXKhuV7wmrVu6jgObNtGtVoFAgEEayNZTpQLKZcfeFFjF9+yXZYio5VRjFnjOPn0LNalNzv9wx9cQj7plQsSNgwDlmXpqigJyANlkj0eFyzbwnB5BCNCpFQpoefDI2PNtU243/+AawGvEJHr8IhHfZPyntQjZDs2bJUfnPgsdoyDRqgjIF0vUCbcFMSP8Ne8P5HdcBv/R5YzTAGfzx33F1eg449lDTvsXbiDP9x4D7FgBNOBRyBP5yAlMknapisur3Z3ksQEx4LHYf5vsH3KUWuQPV1dXWhpaaHiARKgRS5SiQSy73prm2lAHJ2rYwxFBzNBNBqFaZq6GNOqGdoaGbOH40iQs5UBznxM/xLMKHK5nHtHeKcVVbcUT54/8lPEFMlk0nvjRfGNdwn9lhr+AjkhgXqgBdctaKrCzymJOzo6eCaT8ZKnvJz1rkxST0Kd8Gw2i3Q6jXw+j0KhINuEQiEIYnR2dspUoe6V2WgmtCaX+PSR4b/w7yKhCIoeQlPVpdQ2b4ivv32roP0ZekoAAAAASUVORK5CYII=", YS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANwSURBVHgBpVZNSFRRFP7ue2MzmYyjYCWB2SoiI1tEv5S1rMAkWrmpnbumna5mZpNCESK0CALduYgoId2VGmYGgYKCtHEmDTTBnAk1Hd+b1zn33TvzZOaJ0tHz7rnXc77v3nPuj8Au4jhOhDRGOkyadAqyqsaipPXYr3CQAtir9PoRiRLgj6iJk0a4P5Icw8Dse9mmNzPSpz5Sh8baM2g+dQdNJ67q0DRpQgjR7UvA6VDgEvDJ6DOk0vM4UnEYVQcjqDhwiCIE1rbWsJ5dx9zvlIx719rvnD3aoLHiRJIoIlAzl+yJj53omXiJi3XnUWaWwaEfCqKvG8B9/mV7PbuBmaVZtJ1/iNjNDg33WK9E6JxTM8lpSQx34sXXVzhb2wAYosQ6vUuWwdLh289JRC+1IXajQ6frHJGkNEEvNQ+y2SyWl5cRCoVgmiYMw5AzlxxiJ4sjgd02l8vBsixsbW2hpqYGwWBQZplibgg1+ySPLC4uyiB2YHAvgSbRwF4iJmBlgkAgIEmUVAXoc5cte3wM4Xstlkm2eeyYMEMhR3izw7gcl6WRP05+jJ24l8tmhbWw4FhkW2/eBgKX5e6KMkEzW9bQEAzbDpg0S5PSJKqqPKl3S4tGCi/LAcPBPKtQlRfpNAxahUkrsglLEVxngkbpOjMNQ8+YlipWVkDFoEIb7hT5c2HDxR0s9+YI4u8mhLUt43Os45/1X+uZQB4oLCwQuEA+LdvbrjbZwH1qedKHc27Y8zWAufppcMJwSVQcVQ12JpMnMLxJ4HoW7cgRqkriAIFsF9Qm7S4Dvgi1TT0Y2InBBClphSvhK8vkljQL/SXqz5m+7kZdnTbTeQLzyhXfAFRSahqowE8p9z0HKVU060OOr7s43aDNKSYYlay3bvkTVBNYtAIYo7R8oHTFiKg25+seKGAN8EHjIq9yL0PFsW276IDtRfSBk/OprtbDJwwC4ntjhHvl5eXSUet+wLWGw2E93Oe9i+qhLrv4aBcSn7qKt8OuDK7GrrUjfr2dR/KXndymbFAj73B2iLlO6oDtARw7wFkSCrPowYmzL9tTS9Noed2KVGa+4CCKgZuOX5Xg3HrA46VCNElUkbhP5g96Mr8PYurXdJ4sEqyUgM0nb3uBSz6ZpVftPvp9zt5l2PmP/y6iCmDVA5hUY3G1zX3lH1C8CqWeiMSMAAAAAElFTkSuQmCC", XS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASYSURBVHgBpVZtTJtVFH5e+rYULFBoxoZshQbG3MCtJLIIwTE10c0QZ1yi0Tjilhj5N2acSzRO9mNq+IPJlvhPlsXMiGjiwhz6AzaYOL9GJx+ZgmvDV4BCW0pLv94Pz71934IBFoynPbkfPed5zj333nMLPEBUVbWSfkDaQ+pWV8SvzTWRFuO/CnPSADYrbRsRCeuAn6SmmdTKxgNDC+i9PQPXkA+hcILbbMvPQKkjGwce34bKCpvuGiA9JwjCJxsSsHRo4Bz48ldjmJmLIM+ajiyLERlmkdtFohIiERnTs8tQ6fPxu1VqqSNLx2omknNrCLTIOftnX4yi45ob5WU2iKLAzciJoJIOatKDOSEak3Hfs4gjh+w48UqZDndKX4mg55wFzdIyMnIZV793Y0fhVg7KgahNfpIeqooUjcIG9J2YmiKSMuzefUxPVyX5e3SCNmpelxMuhL2VMKbvhcFgQVoax+aKVPwrfTW5CCiKClkOQooNI8PWAzH9IDO6QQRPClr0bjbTu6cKsfEJ5DxarkWspiIfU2VIeVbscTgQG3PDGAxqayACjXJxcBjW2hpUdX2jpyqX7doLrOfr60eUwA3Ul31+GMwZWFYVXJci+NlWDm/Qg4vvnITzII8O4zdvYbSlFdmTM3yj5VgMtGD4CcfX24+8AzXMrInNHWE9b+d1bpBG8UrzC5gOBXHaP43vMkuxy34U1QXPobu7W48M9rpaPH3ta+S9cQzKcgTygi/pT8v133HpZnVsBU7Wi8kuGE8scQOPX8XprhnsKNqLmqoSmCbvI7j1YVy5cp7yraChoQEjIyOwWCywP/MU1J0CEp1vIRyinSl6HmFbrk5QzEj5hYoseaBMiBgfNODM1ShmvXGEQiGYxAgmxX5EAl2IURra29sRjUbh9/vh8/noPkRQ/eybyHysBdnxLBTSri/d+PRfBFxkZCFnyQDTtIilYHLOZDJBkiQOlm/P58D6fDgchtFoRCKRvN1SSET2XALKjz8Ay0oqlSxFHsaUGMpC7G468mnwkTkPp6I+xONxOq4GWK1WDl5SUoLGxkbeN5vNfEWiKOJ2ewcWzpyFBBOdKDpPdYU6fiBFUFC7H1N3/+Cz+9KMuJRhw9t/juLivXupaBgRA3U6nVyZ3Gm9gMWz55FLW6zHXVixS3dxsRTdZL0t9YexqgjALoi4QCSvmh5CrpCWIggEAnSpZHhv9eP3wy8i/P6HyFSF1J1gkl9/SO9+yy4a22Q/Gw2QQ7DvJySrz4pIpL8pccwrEt0TAY40EY/QKleLqqmpaDuqh3/Vpx3JH7Xar8R71IQPqhyAqizSdHDzynyYr5IYSL0RwDrFbvSvz9HROZgsdMKa52J9oaPJatLR+gqUlb3GZlLFjhd41iESVsNbd5JBwXY32r70aNX0QSSqngEcf6mYwB36D+zh8QBrH5xmatijgzF3CO+1DGJ2LrYhBwN2lltx/GUHb1eBN+uD9Z7MJo2Ee7iGA+j7ZR5/E+GMN8JtLJlG7KvIwRP7t6wGXvfJ3Cgy9uhfUjcvPer/+HfRpAH4VwG6tblm7ZhvKP8A8WjFj/MsyX8AAAAASUVORK5CYII=", QS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOMSURBVHgBpVbLS1RRGP+de++Mzjjo9KCI0dAy6F1rF9UmmkVQ0Cpo0QvaBEmuYyxoE702bpLQ/oHIRepCMFsYFURUVFCglNrC1DF07p07d+7p+849d5wRJ9Q++Ljn8Z3f73ucxwX+IVLKJGmGdJh0TC7JnB5rJ23GWoUXaYDVSk81IrEC+DX6dJImue8tvIY7P6S+Vweu4stMC5o2RbA/VYv04Xq07YqHS7OkN4UQD8vxrGXgGQ2O0W85xObveK2JUcuIbIZVm8KhliQSyQRyjo/Pv1wMfpyiNUDvlSbsa6xhhx4QRgOR3AwxjRU8x93+aVzqnkCuWG9E4q2wog2wTIG85yNXoKBNE4lYBHsb49ixtQZnu37g7vPpEKqTa1NBoPOnwX+jd2QeB7fXwTQKMIQNUzhkaKNQlHA8AbsQqgEpTOxJxdE9ki0nyYQ1CSPg1CQ/TTi41z+DrckobAKSsiBNIjDgKKK8J1UEJQIPcOjLY9tozb2BWZVaXb8eRaCZznPn4qMpGjEgDFMt8mVegRMUBLVdTpELAgfNk7oBODtjWSZtGVM5qOUYb3OO4HRY1J9znjKas6UCkUWXgO2AADlKj0ceUxSuD9tlG0oZ2dlEmrWhnBv97oRRsLQzwSluDX5YJHBD6cyiVJ76IAQigB9o3i0il5cKMNRFN3BmdlFnnNYrrECOCj6VnDNn/BxE/i1vEHJEUM4j1KjRZZKoLjQnHfi+RypBQUJGdiO2s48nxy1dEKAwCSH45Al9+sgtv1DyKuBggzIyPgQUJ0+KYJazhKL/J7RoLh20ADz4VgoBSL/C4WpCB4wwZAUGxz+uWlZDmSXWLmLJUSPaGI5mLU3QfPvdY3S/XCADnRKSJydveMdbRktRnnl6H68mD1VhkEHKKNrLRxK4tV0NvmekEW6lD8YrjdcptGkIqy7s9jGBuv3aWmOkNesHl4E2bbQIpzYcfWZQYfiafcG9jnRSh7kekoCh5/KWcKCXsMfDu+gCaZaZO9K62Gsh0ba8dl8qyk31NnBDETBTOMBRdJyoV95IKphchdesvKbkXPDwMCbKzoF4yJcTNTNsmD4QQ36qzlBHQCwHXOq27YziOtkH9SuBl161iheNJvix4PAyFGoSqS5D2m/o2hwC8l/RtMHERM5EfUwQcC1OHIiVA6/4ZK4cePDo98rVy7D8j7+Ldg0wVwY4psc6dVqryl+B6z4H88oJLQAAAABJRU5ErkJggg==", GS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgBrVbNT1NBEJ/d1xIQI8UEvSjh3hJj8ARGxJtEBf8AA1z8OFGJhqPliCSGk4lGBS0H40XkgEcwoVwhgoQbWLyYiAW1fdD2dZ2Zt9u+SmkoMuTX/Xg7v9/O7BcAZUwpFUA8Qswg1lTBErovjGiCSo2cNMFBbWw/IVGCvB+LCCJA7WxsDtIfp7lU29s8RjY2ghVqhqrOTvC1XjSuW4ghIcTovgKUDk3OhDujT0BtbIBsaABRHwBxrJZdVPIPIgm5+Ff0Aah9EwUr2GxoIigytEdAz5zVd0aGYffFc/C3XADp94NAFnQCZmMXBYp/AXIpG7KrK1DV0wfVDwcN3X0TiTA5x2KB0kLkmVcvwR8K8UeBLBIruTv3igKWz56yHknlUDyzuAD+23eNCKXrPIqsG4ExLHqd5SVIXmkHfzAIVu1xkJqS4Lyf8mYTrJs3ClGgkvP7F0ayCjWTU2ZdZlGgQ+rZ91KP3XMLLHJGSplK5SHsFMsIUZAUqSTC/W7ZNliWj33TmAFtl2mb+7DSTS1nfg5gI86DZCIBsqY6P3vOpTCluwYCc8813S930xxxNhaDLHLpKMLU18W7ZnranT0SyJ+bPDsCMGx3fSnjbgXDtRE4JumOE5s/cK0EczjIpa0d9KlUdtc1tdNQrzKnTqp0NKrS6UxlmIiyr40cqY5L5gCuUQR8oAD3u+C/QjoqNXKT9KsPJFqT9H4k4kNy59fLu27AggDrXDtRB0dldJVo2/JpgSarrQ3UyjL3WgP9IAb6i5wy374Xtf1nThe1zZkgE8GQ6V6kCD6xKl5cR2W+AtcHEuA7Q+K+Fa1t+Vkcxti38Szy5G/YSdy6gu6NWWpZeI+YUCsVMj6+1xOma5zuIp9u9CEWMIKAJBE87v/uJvHubVlyMvlg0OSf34biQe7zx+aMDCsHD01OQ5UBfaexzuNh7wsXLj0TpSL5IcufldNybo9QzgMm7r6ucrE5L3mkKPISIqROLxufcDUfA8AnE74sgYrHXYc6PDO0kFc7eWNoK/lk7hcJPfrj6uA2o/7jv4uwJkh4CNd0H6U0UI7jL5vAbkvW4TnLAAAAAElFTkSuQmCC", jS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANtSURBVHgBpVZLSFRRGP7uPLiNOc0oTFP54BIUqKmFGCESRqsg0E2tEnpBkIumRasWo5sWEViLAjHQaGGbBGmRu5kUhVrklG8inVQE8a2j0zSP0/nP3DNe1PH5D/89557zn+87//ffe88AOxhjzMndy93HfZxt2KI+5uGuYb9Gi3SAvVpLOiJlG/BHvKnn7qT7he4ezHzqxHx3L6LLyyLGlp8HR8k5uK9fQ/blCrl0iXuDoigv0xKQHDq4AP79/BXCE1NQj7tgdTphycwQcbHQOuJrIawFJ2gVyj68g72kSMLUc5KGLQT6zgX7r2cv8OfNW2RfLIPJajUEMr3HRI/6sfV1rAyOIO9eLc48fSLhHstMFKk5b/pIFgKfbGrhEhSJSWVTmgr/SXhm8KXvP5D/8L4kIbkucJKgJGjhze3V/kHWc+mq4iguhDXzaBKcr+aBFARF0dFEkyRiej7RlVWsDI2i/HO7rIufr7ui6Lsfp5GuwnJEJibhKC4SO1UEjJLMQKbBUqKmugl9eLl/EM7KCpR3tsugLAu/1FBvZWA4Yck9lVDzc6C63YqZa087Nm190AzGOHgyk8S/GGOOY4gmEgiNBS2ZpzUK8FAGPt6pWuaPYDgchsVigdlsFp7SnTMxIdFGq0ubahMcOB6PIxaLwWazweFwCJlM/HKeejRhMpmED8wNoWuyd2OfBiDZyj5Z7/Q39Ex/FcS0PhqNyimNJBIvFLHTZNvIRzT9bMHfeAS1hTfxoPQOVLOKdPY60IzWgTZkWjNw42wN7hbeMpJrJJG4m52dFTsgaUrfV2JqdRpzdWMwKybsZlpzKY5YVPTX9ohqE6TL5UrKSx8xillYWBATkUQEgdl+nDjqhtVsRb49d0fwcCyM4flRRFkcbpsLORknxSazsrJoeilV5FAohEgkImSiTGQh92qyLiS1qqqw2+007KcafCGCmZkZ1NXVxfYLvB1RY2OjqaCggLTtkN98YVVVVca3/0CuaZrxM65JVh/d+Xy+QxP09fWlzghjWpp+SjGv13tgcFprOPE0bNLOI2cPQmIAJ/MgTYHqZQSlSnruBkx1I2kNVm/E3O7IJHYv9Dfc7/ejo6MDgUAAwWBQxDj56caBUV1dLVrdtj0y02VCNWllezcfO8S/C48OsGgAHNfHSFLnThj/AS/Ewq8gVAGzAAAAAElFTkSuQmCC", KS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOmSURBVHgBpVZJbxRHFP6ql/F4CbHlAJGSICJMosgmIYFIiQMhySUKl/wBUIKEEm7YSMAFwfiIQCwXDojFggNHFonthBGLELtYLAvJDGA4gGRsDOOZdvd08d5zVbuNPcgWT3pTS9f7vnpfbQO8x7TW9eRbyM+R5/WYDZi+NvK5mK5xkAGYqh2sRKQmAV9LRY68ntvRpYsYOX1KSv3qlYxx5syB27IAmeXL4bUusaGD5B1KqV0VCVgOAy6ApV07oPv64MycCdVQD1VTKyG68Ia8gPjJY4oBag8dhtu8wMLkiKRjAoGZubCXtm1FsG8v/EWL4fg+FKFQEARNQjS0/ALxcBFRTzcy/6xCdv1GC9duM1FWcypusSwMHh7YD7+lRT4qQnFUejbKwI/ycT0m8vD2Lfj/rbEkLNf3RPLIEhyk4t/yvbso/LEMfnMz3No6OAZUWTSlgFQ9yYLa5ddDlEkPqo+dsOvSRQS/KzP7vND+vxqKNM/Ma6JZK/FEQ1PXWo+tmSmZgD3s7QVaWzFj02Y7pIEJ2qiyMwgC9Pf3w/M8cdd1RXelxvaBE9wnogzizHwDr4SQPY5jhGGIKIrQ2NiIqqoqDunw6OdvWdhSCY7jiKeBOdgrXoN26gi4iXoCuIUL0G4DylXNSJuNZyxDsIxlXsg1Zk4TiBQ6gj90FFH1jwT2DVT4DCoirWuWIPa/gP/65DgCjuN4zsTYXCaQA8Up8se0abgIa35NZHCCB3AKXaOSqI8QZRcma2KzTiaXIkgGpEs2r3gDKi4lbda+XLN0bMbRS7hBz7gM0vGCQf5ImGj26R0igN6npH01nJBO80ieMugmwgLK2e9Qrl4sMk28bCCbxNhgQpDJZMA7aRyB/xm84Ytwh6+RXgEB8+GLKLPrcEv3EGe/Rlj31/sIbrNE57nGBO9mwMYLqr3Zcn7dkV7K5Cn1lqH9TyYFZzM7iO04nwNe5AFudXZvj+8PXI2VozBt06MHblb2c2xYtMOm8KVHizJIJF3U+O2H2b84R/K7Hb581DQ5dAy5QvYsPWO7OvkusrtoFfngt40/Y+X8diSXzDRmz7aCYufNkMMnbwNXhICZbMeKr9YJiZ4KiRnDYxl8JcUa6zCYEx6cHBX86ODhUDdyN1fjefEpKqnFwJJ1UzuVP6XBc7Yx2ZPZZkjkhN/pv4LLL84K4fNin4yp9T4WwNZZf6aBJ30yK8xMHv1OPXU7pz/g30WbARhIAeZNX85s84r2FodHNNVBPBlUAAAAAElFTkSuQmCC", ZS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARhSURBVHgBpVZrTFxFFP7mLruwWyi7RR5tbaViYlpBsbHRLRUhMTaxpjX+sQlEMampsQYXtWnUCIttbOAHpWL0R4kUgpL4RGIa+8OCMYqJqLAGbJpQGl7dBXQXKN33Pc7M3gsL3bU1/ZKTM3ce33fm3HNnLvAfICIrtzpuvdzGaAVerc/BLR//F2KRRnCraEsmxBKQv8qdk5tVPA/O9uPn6fPSXwvNyzl567bgHut92L1pL4qz7fpSH7d6xlhzUgGRDo1cEnZdfB/u65OwpWUjw2SFOcUi5/kj1xGILGH62jg2GFRq3tPKDJYincbJRepvENAil+rtI03oHm3D9qydMCopsVlr90rAjrSo+oTZpwz+6sKguwo1r9fqozX6Tpiec+7+EGnp+KsJPZfbUcBTwPgoMeKerQrHrBCeXR+k3EiUdfaE0HMhgoGBATgcDtTV1enpepCvu6ILtHFXNTo/Qoe/38sKbNthNq6TArHoWSxkDrslQk9lBjEyrLKTZwJwz5JYj4WFBQwPD6O3txdlZWViah8XKGda9GOip+I7O2YCkyiw7dDImRQQLoNHfdAaonsRQssnIdb1bRhrMTQ0JMmFiAYbTzCeloNz/ZjxT4IZgMWIF6kpZhm0IN9lCavP2YKKyxVl+5oCmHRHYxljKy8mEAhI39fXJ03bhUMIHBCtn66eBxS+iNt8+B+sZzakGwivZAXUbdEIa2gJUuvnoURlLYW8Xq98zsxgZImc4/OkwGNCoFi0eP4luQg5QiHsSvXQoTsA16DKSur9bHw6uhyxII0X8Pv9CIfDqDxgpMajacy7zqcP5wsB+UF5/BMy31kpRC9n+6lQDSu1J4PU0hlhiqIgUeTCVFWFLRP08XsWlD+axTqnX6NfZp5nHcUrAjFw8tL0MFXnBPH7b2Fl55t+GptSZcjRaBTJULnfqLa8Y1bGWQlVX2qCO7CJ5ZjV5XEhcEUovZFrorsCftQ2BHG6I6hJJkf+ZgWn306jx8s2KF2eGvrS8xKTqWMq8jIM+jTfskB07mH2QMWPmLhKuBkO7jPSR04zm2C72eGLH9Lf4TymfycCBbblxAyK5P4gWovsyZuS52UznDtjodbGPPbZ4nEcG/0KMfJ4EOxbjPrDN2Jb4iXLGisvL5c1nAhHKkx4tzoVU4YSnJpohju0dQ2veOkqciyE9v0Zeu82hZeeqCnJqp0jq7B1o4KvP7BQw1u5+GLphIz6BnIZN0mRulKL3nVWnEV6/b3AzSe+vniRqmdMNNSTjoJHStmRSxeoe/ZFJATFyCsKU3G3Vb5geTeIRvxx7eDulGifOF5PD21sxB57FvvUc5S65w4lrygtNRWFJlRy07D6uI4TcXIX20LwTxzrM8Hlu5NP0qetnKp6YoqyDZzciPtzlktT3GpOxK1YE5DciRCRX7hrJor+qSgue1V4lmLk6TzQIk5o32yIJ054ZSbZtbz0z9Kto5du4+/CoRF44wjHtD6nVuZJ8S9eLX49hJXI+QAAAABJRU5ErkJggg==", JS = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANXSURBVHgBpVZNSFRRFP7eezPzpqbUJhxIpCxoEWY/GAQWWYsgjchVLat9kVHhsnEZkQntIlCKoG2QuWihhUY7wzSCFpqikiZqjj8z8969nXPn3nFGx1I8cubed94733fuuefeI/APkVKWkD4g7SIdkisyo22NpBXYrLCTBtiotK1HZBUAv01DnLSEn73eHqQ636lRzs2pb+y9e+EcrkKovh6BmtPGdZa02bKs1nUJOB0aXAEut7ZAjo7CLi2FtasE1vaIcpELCdIFiJGf5ANEXryEU1llYOJE0ryGQEeu2JcfPUTy+TMEq0/ADgZhEQo5QaEpFwmpfgGxuATv+zeErt1A+H6TgbtjVmKZnNPQx2lJjI8j2fEWwfJy2LalPrB1HIpEAzMZ/wkeyZCamIB7oQ47yspMuo7T98OGoI2G6+l0GtPT03BdF47jEIGdybkeC+yXUiEEPM9DKpVCNBpFKBTi191EcM7S0Q+xZWpqSjnyB0zAEZuozQqkSlM+CROwMgH7MYmWXQH6aeDZ2K8/4v3nMRGwHWwLu1YwGABjZwlM+vUerF6F5/tycSlFo4cz1XbgQLkqwkYmuMyzx68G7aevByjdNtxQENHisI4YisgQZJ9zCFTS55NYWk6Twcetq4touVvD5lomOMaz/h/TajtZk2mB37NJWomjNljmLCE//gzBUtJH2vNNIvGxb8K8rmACtZbh8UTeqUh7AumEgEOVxNW0WlSZipUqMuC8vNn5VB5BjlirRsAnENaNi5XnzzkZ5knxDle/t7BVqSjbaaazWYLa6j0Z02aCXUeOHNxtpl84RR9Iz968cgiVByKebWfq394kqIDZE4HzJ/dlqgV4wweNN3mGP0okEurA8Mm1Npkqc+BYioqKjHm/TUB8b3TzUzgczh6c1Sf2f+BGI5GIMbfn3kUV0JddcnISorNDVfxGF8GxCNo8p/4i3NIYm7KXnSpTnhAJ3+FP3FgMgu8kurLXFm0BcK2410R9I2bM3HiGC0Qi49kmONAv/eqj0o9FpdAqc+as/M5vuCRFb09u+4znYhZqmY00cGdTJ1x+6gWoZWLwK+TISMahuBjgVllXD6vmlHEt2DILLzvT9NvlxqVLbuG/i0YNMJMDOKRtcV3m68pfHVs8b9zKzn0AAAAASUVORK5CYII=", _S = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOlSURBVHgBrVZNbBtFFP5mdk1RVIgtJYHkkLgVagRKmiD1hBxabkiNMD8SQioVEjckBDnmZvtEqgqUG721HCoOXIjaBiEk0qRuxIkkNRfUH7vtpTm0cdTsrptd7/S92ZnEVZ0qafuszzP7PPN9M++9mTXwDFNKpQkFwhyhqrZtzfgmCFns1XiSIditnd1JSLQh/56aIiHNz9HVMjb/mNXtzwN1nBlWyKb7Mdo7jPzb4zh2IGen1gklIcT0jgIcDkOuCRvTP0HdvQvZ3Q2RSePCUAdmDgIbjzbgbXq49aCm5/1+4lc18uaQ5SqSSMlyyjYrR+PiBfhffwWZSiE1OAg3k4ErJKJHPvzIh3AE9r+6HyN9Q3ir6yA+/OVTUfr7B0tV5Nw8IWDil5CfPoWwqwuvHB6BG4ZwPB9OEED6PgkE8CIWCeA3uR/oGAz1voPpf86gNLclUrA5ca2DY968cxubKytIffsdJAnIWlXHUKyu8ipwsg84mYu3oksujZi+mmEvIn8K0cMxuK/lOH9nCR8Io1TlKRs3bkD29cF1XUgpIT0P4sfTwNUrCeVHCiofa3JmVnr7iUiT3JFXATpy6Dh0ye4kwyH6mHvNxTLw+WcJMSOOIb78AuKvPyEoPIJChZBaFUDE3PqQBIFAQ8Z1micQe2XaRdkKTLBAXlfN7Cyc7h44QkAuzENQgkXPGwCRw6dYB9RuUht7tGTqkxBDKE+LCXWfBACH0Fy/aAWOcg5G9U7/q0AeOQKRHweW/oU4TO6xMeDKAmwspioKp/bZ0KgkD/QJKNlhFCbjYoHRnjKWvtECWRbQBwpU72JxEbSB5HBcWwZuXqeyakA7ycKGovpXSVmbT0yhNJI296g31u1T1m3xb5NboyS3WkyZDGOFtmYnKjxBwjmo6d7rnXhZls0M2G7dNQJZ5/x7UGsriaRsP7Fg0M5US7kiM2zdy0w1zz3ZebxlNJ7L7Llwt7lm+KBxktf4KaqOQwRlXW5C7JFcn2iC04/UoWvWfUDSzcfX7GV+cnom9Sr0drE3syFy+89b1znironkR31dLBHSxfkplBamTFntlj1B4f1JFI9OsocX/S4L6HRyhxp9h/OAQjJod9swY1rI2UqG86kXThGmUJbvVfDJbydQW7+zPUA8TXxsIKfJuW0hL7abYkUmjIg+4ZdvlzHz/yUsr1a2xNL7OjVhfvB4K3HbV2b7XScv/XNq9zanXuDfxYQhWGshrBpf0ZT5jvYYcDM4tkZ5l4UAAAAASUVORK5CYII=", $S = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgBrVbLS5RRFP99nzMy1uhMRbVQmzEpLB8I0ULBMijIEJRW2Ur/ggbUjRaOQUHUojatAm1VqyAocqcl2cJFIhmoiDbVpqnm0Tybx9c5d+4dP3UMxzrDmfua8/udc+659w7wFzEMw0k6QjpJumqsS0DOeUjdKFbYSALsVMa2I9IKgF+jxkvq5HEikUA8HhdtNpvF0oUulB2phqOpAYc7O7D/TKsyDZKOapp2f1sCTocERzKZRCgUQjqdhsViga7rQr/0DyMdiSETjSC65mMrnHr6GOVN9QrGSySjaqAX8BxfX07A7/cLQJvNBqvVmicxYnGUkJW13A5nYz3stUcx292D5Vt38wS8NxsIZP4E+PLte1i98wAaefd7aZlzJIDJK9GCCJgk18YEgKO+Dr6Hj8wkI2pPNEkwRk1veP4DZlrOw9F4Elb7XrFYdfM6yhpOCAKWle6ruYhp1RAfiO9U+BfCHxdx+tUztS9TZHNOl0y9PDN3pQ8lhFNCYEaUPIzGQDubB+c2S55nhfdREQFIRdo4hfSzFcqAlHYucwt1unkU83+Hts8B3fcZut2OyhuD5KMGW22NuQiQpYqizvqcjCRDRcHpCkzP4OebGRWFhwm6uJcqtcJaUYEUJyaVwt7mJmyqMBFBhqPauACD54NBQWCQ+bcXE4rgLBM0c4/LsazuGEpEezwPqMDzEcS2EmTidEZSKRExxxOYfqtW3UwgDhQfosrhwXy9m4HNkuEKksDCe7Izp4xdyoTCGwiELLZfQuoT5Z9+omN3omHr1cBYa9wpdVQUWC4OXMkeV7XqBvMEzrZW/C+x0z0lZY4JXnPvIF1cgNxMFC9mm0OdF1X3ucaHgToBHr3vuIzw9LuCudwJAWupqwotC7NqukanUuRrdkqMhgZ25b2ZpPHJuBqOE/aaKpg+0iDvg3uoP+9NMcCsLrK1565t8TZwRxAwk5pwUxSuIkjM4JwBKaMSc8uD46WGHx1E5hew0NOHJJ0NJdomYBZHWwuBD5irkMG9hWwUiUeSiBMepMvrB90tEbrKE74cmcXhEIAHqFpMwAWfzMJh5x79cWPnMmn8w78LjwQImABX5ZxXlvm28gfqYg7HSqxFqgAAAABJRU5ErkJggg==", ek = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANYSURBVHgBrVbbS5RBFP/N9+3q1kK6L0FPblAURduNjCKsoCKQVMg/oIfoqch6TWm9QK8+FOST0kvQBdKIkAJXjd7UlAzBB1d7ywddL3tx9/umc+ab0V1vrdWBs/PNmTm/35wzM2cW2EaklOWkj0n7SKfkmsxpWwNpGDsVdtIAxUrnVkRiE/D71ERJy7m/MtCPTE8PstTKRELNsSsqYEeOI1BTA3/VReM6T9oshGjfkoDTocGRnexH8sUTOO9+wt67FyIUghUMkoeAu7QESerE4+yDstdv4YtEDEyUSJo3EOiVK/bltlZkYk/hP1QJ8atETVofqtTqJpPIjX9H6e07CDY2meEHJhJhck7NCKdFgXc8R0ntMVglZJkBrNSGTGoCqVuBzPAQAnfvIfioyaTrJJHEDUEnNbecsVHMnz2D0odH4a8Mwu2w4aty4fZaEJQKTo+BlzomJnDo11lYRPbHOPb0fjL7EiOCy0Kvfootc4cPAtPTKD0XgRWW8FW6QJpy/tJezae3Zo2clyqHBrNjY7Cqqojkswk05KOfOrWpfEoInA2+m7PA5C6AGkEcIml5KMLkNC9XOigrnYHFRAMDCktH0cB4tfzVPfEBQxf8sMjB/riI4B4amhWef0SDCoFVJs0iNdnyUgK5/X7VP01Y9R7BRSY4wV/P/OOIEYFaBi3b71vALl+ACC0NxFn3QpCryEKlLJVLIZvLkY38KeITzlfUe7xhJlAXaioxU3AWs05WqW3ZxCkK8wFzgiRc113bFz1lPp0wPUVQ6Lvu0DuuQ6ekCFk7YAX+HH+cP0KBMvwvCYcqzOe8TxOEG8V5DH8ZUYwbK1RxwtvCAZzad8SYvjFBP+mlusPVuD7YDhvYtDT8ERzm0gGBxmpj7uaLxps8x73UtSvA4IB3kLAzUXWJW6q0uycmjXm/RdeZ60aMeyVUrGTeav4mgsCrN8bUxbXIG/QeGH6lZKa1RSYDfpkmzRSpPDdFutLWkv/ihQtX4D1/SlaIJKUd0zsHZ2nYPEwpo2aGMzrqpg4d2ECUzlMey1y9Ip3+WD54NB9zsyeT2fllUzfcpcLlvO+BHB2DnIl7k8rKVdW0b9RQu/2TuVUkvCddsnjpk//w76JBA8zlAU5pW1Qf8y3lN9AhcnfpaSwdAAAAAElFTkSuQmCC", tk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARoSURBVHgBpVZtTJtVFH5u+cqgQDNrNpeMdTPo3BwfEROzBCOJJjNZBjgTN92WjegPjREWRlRIpDW0C26JSEDZsmWI2QJZ4jAzEXVxCK4uMZmoAwaFUBgyEGnLR6Gj7Xs99/K+2LKWbNlpTu5978fznHvOPecWWEU45wbSStKrpEP8f3GrYyWkJjyoiE0qwP3KuWhELAJ4MTVmUoP4dnVew8TlNkx12uGfnpZr1qRtRGrG01i3+2WsfX6nttVDamGM1UQlEO5QwTE5OQnfzV4MHf0QCY8aEWcwIFafKNcF5uYR9M7B6xwRu/BMSxNP3rFNwzITiUXD1EWwHBaLBdnZ2XwAQf7EqRqs2fAYYnQMfH6edIH6QFyyHoYd26F/fAt+y9/HHNYTGpRZxCbsBKr/fhduEeD19fXIzMyETqfjZWVlyFprZGOffAbF66UNREQ/uS9EPTf+QNo7byK9okxzVzadxKkRnKPmcFdXl7AcGRkZ0Ov1EiQhIQHFxcU817SZjX5kgzLnVcGXiJYIOPwzs5jp6cOz332txaWdCPJ0qvWHxYghJYXn5uZymoCXrBXqcrlQWVnJrvTd4mnHzdAlxEMhN/F5r3QZNLfFxoK8iEHbSc07L4hrLmJQsHRb7Jj8wIwvz55FTk4O7Z1HqFZUVLDGH9r4prqTiElNUUkWqPXJNuj2yIC6CcfVYddISmLMZvNx6phGPj+Nfy5cZOgbwCvVVjicTvT29jK/3w9N7XY70+mT8OKxo/B8fwUBAuWLi+CBABG4ZSuiGpOaCuNLeZIhljRLdGb/7JYWzLb/wob3FeHTi008Pj6eNzc3a3GCcF11dTUWCfS9M3UYPPAWFkf/RnDBB4UMYOoVcFPuqGISBDKhfCO35ZUSuvBXD/rz98N2/gyLi4vjDQ0NYflSVVUlSUq/Oo3+gtcRoACHXsvg9EwYwT0iSfocbOCNIlhamlhycjJsNlvYGqvVigC55P1L5+HYexC+4ZFlA0NFeMUpOvEUuJXTvr5BOPa8htKDh1BeXn6PIcJdH5/6gj95uYUnbk3n2njipo1a17NMYMjdiUhyd2QUjsIDUUlqamqYpa4W6ZcusMTtT8kxPdUpVbpE8ERqc1fHNf5T0jrenrSe/0zasUKvb83hU723OJGEJvCyFhUVBf8dcvLrz+UpbsJSpUSr+VJu7CqMSiBJ0jOVqe4eTkFWIpEUFBQo7vHx0DJu0tHVE3WjXZxnc/kxcESXxbEJJm7N23vyGdUsZeV8a2src965o302ilqkVdMjIiAiDqby0mWTIol/bBz9rx7Cu4V7WW1tbdgyKinIypJpJd+GsI3q8ydlyHpiVVcJ/XVLBp/otIscESQKgYe6Jrxch5CYhSGiP0eZ3b3/CO4O30akxQJVl5SIbT9+A2XDehiNRm1KvGrmiATaSVQSmeEeKl5T37YR4U2Z7UJiqdYIdz6ye1fo9Y74ZEYU9dFv5PcvV/lD/LsoUQHcIYBD6pjIIcNqGP8BrV4MLEJcEFEAAAAASUVORK5CYII=", rk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQDSURBVHgBpVZdbFRFFP7mbi8WaqQ1VJKakGKMmmyJSutfi2gTfbBRgcT4EzG1KoTEB9dE0xhUtm+2FcKzIDT4g4kgBE3VFwrabUIIoUDbkPBQ2n2lLPRnt7v33jmcmTuz3O0PKeFszp3Zu+d858z5mwXuQERUybyLuY95lG5TxrxLMNfibkkpGYCl0sHFDIkFwD/jJclcqb77qX4U/u7VK928qWWcNWsQq1uHZS0tKGvcYFVvMHcIIfYuakCFw4BrwNm9e0DpNJzqaoiqSogVFVqFZqaZZyDHx1gHqDj0E2LxdRYmyUY65hkwnmvrs92dyO//AW59AxzXhWAUVoJG0yoE0k9AZnPwL49gWWsbyr9st3Cf25MIG3NezquwKHDvwI9w6+r0j4JRHBH1Rhj40J7aSzbuDZ6Hu32HNaLC9TQbuWoNHOTlQzk8RNPNG4UbjyNWcT8cAyosmhBAZF88BX8Ppib5JJex/PgJm5dTbKBZGO9H1Zvp+qcg0uNw43XstSgawPr1wAetEI89DnJdwsgwwImnf/8JbTMHbMQfHgKamrDi2J82VFVl/NisdsFAP8DgMVUlmQyc5eWh959sBz7eBvx1IsBvh2MilwNeeVWg/SuIVatAnCtdWfmCdshPpeAzljlFQr3bpKumt1cLaM+vT0BksxAbXpQa/OudAZLfOlj7CLDzG0JjU4CxsdDwM8+Slp24pnWVgwFjGXoJpispt+l1mq2uIu+hBylgpodXE/13WtLR34keXUt0YL/ULXX0iKfXdDpssTNniGpWax2lm2OMbPNG24CjymndUOB6F/pj4u55wHPPA8ePEbIzwDvvCQykgEM9AvEnJK5PSK3X0CDhe0U9Rz1NQzLVOtGGUEVS0nmeJ3BfOcfPhwLRApmMQCHvIJ8PRR2nFAOlGOrHq3r3wErMowuD4HiHRf/Lz4QXGoG33w1whYuupibEuXSBoir6FDxKDN0oMwZqY1xeNDJUamDPbuDIHw5OnSR07OIMcgrf31qGyUlgakpqB/ftmzfPBJe5oUGV5KTKRpD6nwomwVIl2XLXd2G6Dv8q6a0tRK1biXZ3E3mepO+7inLS6Baqec9YhhJ25mvyNr9B/lwDij/dIencWV8LBUFAAymibR8FURmlo3QL9U9Gx3itHRV9vLzMigi2vFk6IpZI0nDs5Gkboh4eFW22AtpUQkRjExweVoS7IyvvfNFuwfXdUCoUXn9hFLo7i7mYF645bGMfdHVGQ5NY2BOTcE1DFyngeM41JCOsgTlvMtUfBU9GMRe6MpV1dbPpDld5UZMTw5dA4+OhwkruGTXMXmuBCquhBa/MxU6iLv0eWjr10T38u0gYgEwEcNS8UyGtvBPGLefBGRrhsAY4AAAAAElFTkSuQmCC", nk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPMSURBVHgBpVZJTBRBFH3VzSiKUdwTDohLogkYFzwxKuhFJa6J8ap4cEETUVGPjt5AY0yMB1eMJsbEGLcEjSaiCePFgxvjdgFBPQCGHQeY7vL/WmYGGAjGT35XT3f/96re//ULYBSTUmaSnySvIa+XCWszz8rIc/CvxkEGYKxWNRKRSAF+iIYQeSb/joVr0f+kWo2yo0N942Rnw81bjHHFxUgrWGlD28lPCSHOj0jAchhwBRg9fw6yqQnOzJkQUzMhJmaoENnTTd4Dv/E7xQAZN2/BzV1sYUJEcmoYgZm5Yo+eqUDf1csI5K+AEwhAEAoFQaGpEAmproDf+wexL58wbmcJ0o+dsHCH7UqE1ZyGtywLgw9cv4ZAXp56KQjFEcmzEQZe8/G9T+QD794isGefJWG5lhFJgyWoomGXV/cRPWsLEcjNhZsxCQ7DzZpN0kwAmpuB3l7EkYVIrIJ+e12dtJIvmPDgkc3LSyJYI8zs6/lJd/5SiKZGIsiDs2o1nJLdEDlzNejvVojWVsjKCqCh3sik18QkHpHEInVAMIiJ9x9bqaam0WUr33mvawECd7lKtu+As79U6S7u3AaqrgGdXUojsWw5MJdIIxGdDSOf09evVhwLhxEjLLOKMibYoqqmulqBu9lzEuAXLwBXLsUTq0aqLqSnUyX0ATOmQ7S0auL2dsqVgMtyEZYhKGSCpWqZpL/S/Gi5TiWVJ6hM4Tga2xIwl83FwiBQlAXx/j0Ex0ej8Dknr8NWohwmUBsKBCj4jzRXJfn8GdBFsriuSqhmTdo2BQS+bj2tfxtAyRWFQcXt0NUzG9ISxEuQ48X48RhknoeU1tJCMkX1avqiaiKCvhUYvHtZlQZ1N3mKfvLmjR4LizCqfYpQPkiK8iPAwVJg/oIEKLUSY+1xApfKS9nTal3nCyhg/4HU4FYq6lG4dxf49lW7fU1lbuwdE7xSrNS4lHGCuNbZQqcB3plZWQlw1n7efH3f2ZGSP81iAQ9tz1c2sHWTjM2aJn1yWbpXysbGREP+/Jka+Aspt2yUkt8PcY7h2P78JcltPMe2ihoaiiTN3tu2WZercSxcRHVG+Wn6Afz6iZHMN+6+eGUlukHVWDKs2flnKyGp4VmSsZjtSSg/AefYcb6LN7vER/r4U+adqZCeWbafQo6h0vC3XmVFsjRlqWciZSj+Sd0H6ZGeQ4n8JFfAlDc/XJsMHkrGTHVkMjufbGqHc15UOUY+gpKuA6ZQTrjXbCiGKAja0JRH5kgr4UP/hhy71cj/+O+izAC0JQHWm2csaeZoGH8B4VebtJwfshIAAAAASUVORK5CYII=", ok = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPoSURBVHgBpVZNbBNHFP527VBDSJuQxFF+aA2pqaIa4iSqlKpFsaiqSoCa9lRFPbS9teqhqVr1girbBypVueTUAz3ApVWlSlC36gUJMBfCPwYiRMLPOjhAsIlj5H/vepc3szMmKCFKwrOfZ+bNzve99+btjIEVxLKsRtIg6SlSzXomC8I2SurBWoUtEgCrlcMvIlKWAf+OmhBpIxtHp64jcmWC2mvIFHP8GU9zG/xbuzHc9y4Cb+2USzOkYUVRxl9IwNIhwDnwL///hfh8Em2vNaFp02Zsdrn4c7lSCflyEXdTc3x87NufiXC7hAkRSXgJgfCcs0/9OobA7AX0e3tQ53RiYOubmE49QKFSxg53J27M3bMXW0CebJOzGr4e2ovgx59LuO9lJKrMufR8amwMmYlD6Pd0o2JWUTQqSJdyMEwTpaoBp9MBr7sDBb2CvF7mLvq6PBg/EUH43z8kQVDuiSoNLOfx2RuYjPyGJ3XttLjCQXq7tsOkyZmFFO1BHmnSjqYWmivzeZuogk6yhf77k++V2L/DnEAwfckGt3/8DA+3FBA3mvkiFv7xmzHEZuMoCo8/6umjFCX4HBuzlpE5KZVQFYSJREiAlTlZ8QlPzeUzSOj34cq2ovtVjfLdCt2h8m1q2qRQtfiw/+13cG5mGqdvTT6/gSQlcgCKguj0dV4gorpGGcEwr4yjx6FEN6Kj7gka9s2jWNmJssPJF08n72MmnUTk6nmUDR3PVR59FPos5LM2I5FEYhOSYIgh+Fnv6JyGhNeFxqyBbVc3IDmYg+MVF0Vt+5kvl2itIkAX/VJTpBTphmHHRN+oiJDE4xQbgnrtDna1d2DCTGPD4yItqCJvFeBQVZvEsr0THe455RimZbe1OfpmCrkagawiuHQHUrcfwZuuYHc5W0tBlcpTr1ahU8nqVKa8T61BLZvj4CsIiyDOmHy6iuaHWTTrJho+pHSgKqbXKBSIp6VNjjI1Au3AF0j8/TsuqvXo1G4CLVi3+Ltqx0aMpeg0673XvQtuOOCqp6qoMrOK9cqwf1B2IwyFnxm+nn68YbZj6OQlfNCbIouJNYnYCs8WNwI7aifsP1QgCjtmo2w08MNPKLRuw/zlhnVEYFfQsW8OSMMRwo5LlK9IM13+AQweHIfl7qPqUNaEzSS4f0Tmn98NkG4yJml4/f3d8O3ZU/NotQzBfSMIkQoJC8wlF04I9smKWELDp4cO8gtHvqFLcS2e7+DeEWp9i8FDcrDclTkqSOwrk177SOwsnaga4ukkf6ZxYz0CXh+GewcXAy97ZS4fsH3pH7FWL6esl/h3MSoAFhYBasIWYmf+ShhPAejMYT9FksBJAAAAAElFTkSuQmCC", ik = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASbSURBVHgBpVZ7TFtVGP+d29uOtkABocDYRjHKWIVsGBloIuIDNcRMTXBE+cMtJJsz6jDRTOOrZMSYZcbFoNOYBeI7C2bO6B8a68DHH8I2XtuYQOSxgVAGLY8+b3uv55zeW9oIE+PXfD3f+XrP7/ed7zv3OwWuI4qipFF9g+oZqqPKirhVXyNVG/6rsEUqwHqldS0isgr4QTo4qKax+dlBF3IsOpg+OwHF6cSrDSeQlaxDQYYBO/PNuCUnSVvqodpECDm2JgFLhwqOznNTOOUcRv1tKSj8qR3Cps34eet9GNZlIBiW4ZdkuJbCbA0O3WuFjRKq4qAkTf8gUCPn7F09E3CencQzaRMg/QNwV+9C22UBPUPzuP2hMij0oy5CgBKNu4O4vzAZdaVpGtzz2k6IlnM69LC0eJsPI2S3Q7+jFMIfl0HKK9A96oUvEKEPE3SHLIjiK5xAYbYiY+RaADVFMRKWrlJKMqYRtNJhT6S/D57yMuhLSiCakzl7TBkSIWh+5Zv4pFJsRiLDFwpjYj6EpgeytLp0UIK7BTX6PcyzuLsWOjqKFFLweSF4vXwkPh/g9/MxFCEIyQTBCKhGbYmqqNOBCAJO9i1q7FXsmIvUeITNwpIEcuhlCE8/BeElOqang8zNQSq/AwMjHniWQ3wHwYiCRCF0BwKksIIbTNPI2/AtZhbqkW25if3YKNCvh5n1lXMU590GvoNLk358sZQHcvUq9PsbkGMG3v5+Bvs+HOYE8Qoso3pLC261fo4bLRdQV/QWZhd+19jvYgQ7mPXR6SEseSWe7/nFEA4c6cLj09tx5bWjyH32SXyX348XnthGjygS1Ci6sD3zS9gzfsT52RocOXcSH/dXawQ2RsDLPja1TDNAYkWV6Fn/uuMKKpsv4vjBNiAUxP5jexOiD9C0jHlseL+/Be/2tvIUjizsxLIUS6ONsPecWQfap+EOEiTJEmRRj6AiJmRar6OFl8OQdHqsKkr0NCmyjEyjgvcezeZutoMxZqQYRSj0FAQMRg4iiEKCRmh0a4LHFdysX4Q1JRacJ0Zgz1ZfdQX/KhW5p+CoeJCCeRL89ozfsK/kOVRuGdJcvYygk1llm5MQfS3XIwRh2QBb6kCC1+XLR5ZxHFUFQc11mtWAFdnNZk1ONwZnaUsgAi/Y9YRF75Wivadq06eIyCK6/qpB8gYzWnZlao8VCPTksH12sNljJWbeHaPNLHE3eiEAUYhGVpzZifqi12E1jWOjeRh1hc10N30QSBgv3hlreG2sFwnqZC9Vj91qoCSmaKri8JN0XuwufBM1tuMwiQvYaBqh+f6Vp2PKezM+oMf0k8HDqNmai/x0XmB+NzCDzxgTjZw53qktNvMct1/wR1st/QpEzMgx/QmL4Rp8YQt+mGjAjD8fF+cqeTC9rntQW2ykatJiYhfPmLp8RSiJgw7s0sG4J4yjvyxh1ifzNp26YY4WVg+flLryPP3Ys/Qc3G7Vx4M7tMlqV2ajSsKTeckloXsyRC+VCGa9kWiBDQK2WUWU5RnigVe9MlcV9dJvU9YvZ5T/8e+iUQVwxwGOqj6HeszXlL8BnOSPQMI9R1QAAAAASUVORK5CYII=", ak = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUOSURBVHgBpVZZbFRVGP7uMp3p3JnpdLpOZ2iLIFTKIItlDZJSqBGj8uCTMQFjIPpkNTwYXigv+gAJaHzzATTGB0W2uKJIWdqkAW3TFqWltdt0mXb2O+ud5XrO6b21Vktq+JM/59x7zvm+8//3Xy7wCFFV1U70BNEbRIfVvyWkvWshWov/K/SQBrBcObcUEfcf4G+ToZWonT6nUikkk0k25vN5tkcURRQUFKCwsBAmk0k/GiZ6kuO4s0sSUHdo4Ein04hEIshmswyQ53mmVCgR2YtMJsOeS0tLGaEmrYTk5L8ItJszdgosyzK7HQUlBzA1OQEl+B3sDhfsrhcYAVVKpigKJElCUVGRDveObgmv+1y/eWjiGsIzfcx8/dZUZf891BT3w57/FhkCuHDNaDRibLgLielvdIIT+jfhNIJzZDicjd/H2K39cFZ7EEjUwOo8AM62l53g836Y/cfY/IF8GCtWNzILQqMXkIvfhd0wgPDsA9g8X6HUtZNuayNWNHIa0zA7+MM2zM6MYlvDRkTjeQjEvo7Jo3DWbsHM72dgleIIRPLYVFeBmOVN+HyD2Gw9BYNIgkEBpr294KTtqGu6qFtSTJZwkM6UpB+RhBErKgV0dk1j7RNWiIXlaO8exKVPBbKjcf6jqWzWhaZ1AaxuJmeVGNScAq8vB4tDRioRgMlcQje1UIKX6WwqmEeg4l1UW3+FFPsSnCrAxI2h0mJDIrVqDpWj7iSDFhrGXC/Moh8ysSqbyyFpOoi6hmNIZ0RowbuHEmykMznlx4WRH9FTtBqvbfgIvO8t3L7H4VmPEe6hPoKtIhqLMSCekCjkuXazCd4pGXZLGmPiKeza2YTe4RDWmzO6i2opAUuoEqkYoiDids8d7HlyF9z246hyfYFkloMrG2WOkfIJFEpmqCQ35GwGNRUFCM0+BZPjINqGtqDtehiSkUOpLUlyY46A16kMogE7arfBVC7h5z/aYHW9Avf2S3C5VyKQ/pP4OPcPNRWlMR5cgXWNn6GwvBk3hzhYSDJ3PowhGFN0WJYHI2xC4jkXyCAwNouOkU5c721DcPou/ANnULp/DHJMxkKRV41DGf8A/snfYLNa0LwyCndlCRpqOHhWOvRt4XkCmuovNhxAVbULMXMCv3hvYXzgJ5DLwpfxQHq+D4KZuEpIwuvuRsK4hkQcj3SoHd5QFp39QQJixqHGKlZaNOmmBDd1AoEXcGTrIVhHk2hQrpKCNICK9a1wWzqQV72477gFX90N2CoG4alsR1n9+8jE+zF4+yh21wtoWmuYiy6S2ZpcoQRndQKDwYCn3R68vu4lVDlEOHecJn5ehbLiLKqdAvZtF7DGncBuEj1lDh4G21bIZScxETNig22aZTZ19YLCd5kn6UzLbBt9MpvNbNO+A2/Auf5rXOy5irX1DfAZTyNIYl0k+VZRIqC7X0Ck+GPMKFU48nka10LHsPGZZnbWZrPp4OcJ9ohei2pZapKQTSQSrPbrVVQX78PvYYh8glDMDGf9e5CK63D8ShqX7wzhuS1V+PBVB3MNvSTmesOmeQKNpIUMZ+icktB+oBPoYzjkY1XWaJq75Uw4heHJMDK8CXs3lLM1TebL9eKG00oG2nRI9OQQI5lL6/1CSxbtZxFDgRdEDu1qrVhKtEYe0pst6VpqPB5Xo9GoGg6HmZKGxN7RtUU/Ai1YjmhN/7y6fLmhPsbfRYsGEFoAOKy9ayVqfxTGXy3C5jdYpk9BAAAAAElFTkSuQmCC", sk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP2SURBVHgBpVZfaJtVFP/dL0ldk4DpnMaODSOzrdQ+tBNGR2GroE8SM/XNhzIfJpEK63wRn5JMKcgcjiLI8KHDf/hQqNG3ISytjD0o2o5C1dQmrSO1OOxHkzZ/v+96zv2+r01NUio7ycn9d875nXPuPfcG2IeklAHiGPEt4ozcpQ17bow4hP9LrGQbOChNtgISTYxfpCZOHOBxKpVCMplUra7rSiYUCqG/vx+RSATDw8OOKi8mhBDXWgJwOmzjyuD4+Diy2SyCwSA6Ojrg9/uVXKFQwNbWFpaXl9V4enpaAdoUJ5BEA4DtuUJPJBKYmJjA4OAgPB4Pr4GU9rRKmfoMtLCwgGg0ilgs5pi75EQinJxT8wunZT39Cb6Z+hTHQ31kABazDKy+5Y3T0Me0hrk/7yL8chTBrjeddA0QSNYBmKTmvFH8HVvp1+D2dsHl9kFj4xoD8Efuxiv5K3YATFPCrBVQ3f4D3hPX4fY/q7JMAM8J2/sMz+QXwxDGX/D4uuEidzUhd0OwQeSeTduNwiCQ2nYaaD8JH4HY1OGmn3Pcq+V+NHE7bWousubNCbQdghRWzu1Ngny8E9guAps69pwT3ptaRYp8ATVzhviO2911mhfHGCDCvcpHX2vmx8uaxrYeugfz8GHLOCsfPQrX1Wv47OaXePXF1+E1SjDefQf4Z8PacBIz6AibxaKKsPLWFNxXFMBZBlDny5yfh2bvuiiXgfv3IdvbAYJ0f/AhqgMDWP/qC5SfeAb+k49A+HyovnJOOQAyLKpVpc8Axg+zTnghnlMFZa6uWMadJVLA5iaE1wsxNISlpSX89Pc6iuUiNtfWIAZPQ7AD+bySdXTVidN3UhhyO71TpSqyxP+lkCnwK7W9vb3oe7oPF9+4gEkCxuxtHNfz0IuVRp1yTekwMUCW59qpUssrKw3Cv1Elc1X39PSgu7sbgUAAaysZ3Jyawrquoxl10lVik67ZAPV3SgONjIxgcXFRgQzQXqyFIxgdHW0pX3dtzHEdxKkTy6TvYO778zVNs3MpGhWPPPYo2to8yN3LNazxXps2D4U/14LHTrHzlxiAN3mDhaqrUYjSz3RwRFOA/cgCoIrWOtF2IulMP6nRWedEpnjkOnJBHTMpsbdiDwjA7Dl2xZm6UX8XhWBfdsbqdRjJq1ZNHDQK9p4aLfw2XKEoz+xcdnUeqOdPUeW9y7J4yCNLNpf3YV5n2cr7l+tfuLEWYcq4I2HMzcliz1MNQKU65rXyC89LYyZVbzxeb7PZk8no/HJYFT47A+O7byHn70KuZi2hhwPQzpyBK/wStWcd1aZPZqtI+NG/IQ9Ot+QD/LsYsw1s1BnM2HNx+5i3pH8B/i2Z+CHOls4AAAAASUVORK5CYII=", lk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMySURBVHgBrVbPT1NBEP52W2hpDLYQYgSaQIKJBg8YYw/EhJhwMPGg/4AmHowXDTXxrOUOCSdvhv4DHrwgByNw4cBFYiSYSIRQMCZCW4n9Ae1768x2t++RUkLVaae7b97M983O7Htb4BRRSkVJX5IukG4qT3LGliQdQKvCQQbgrDLbjEicAD5BQ4o0ytfLX4uYXz2gsYBfJVf7xLvbcLUvjNsjnRi9FLGhedJJIcRMUwIuhwHXwDPze9jJVtDTGUQsEkQkJLVfsezi95GD7b0jigHSj+MY7g9ZmBSRTDYQmMw1+9TcT7xezOH6YARtQQlFbvxRx9fKQSgR0fpuGQ9uRvH8To+9+cyuRNia0/CRyzI1t4f0Uh7D8Q66y7elGWveQvtbAv66EGRY3S7i0VidhMt1jUi2pGHk0kQ/75QxPbePC9F2lKoCpYqkEShXQHOhtWhGreRTNraLFDP9LqtLa/o3q3My2W/yReLFN2TyDob7qHFS6pSFzd5UU5mZMiuo/fDcwVqmjNGhEN5MxG2pYkH6uWebmsk5BBxArqQQbvfV2jcyoVJeN2zJDqvQSS1vlDWW2V1JJrjLs/lPBfKWWvcLCjEdrBoyR0OrlbbndWU4XmksQzDGBCM8W9s91OCCnI6ottmCi3CbhKSAelPr5fLRKe6Pi2qVb9OOUy6tomT5B4KmIchkHW+bkFYcVhcBu4k0vjqWOYO7yuwqYXkFDopunYCbrKMON25Bqu8EKDSgaHjGTxdliBxHwZG9CA8twBQNW3oWPO95twjuj+HEZHu/tebrBIFIAv9LRPiKna4ywRLP5Llxz0OhdVHeEPSw3nIPuMk5vqru3Icor9B2Fn/VA5c67gb60Db4wZoHJT04/N5Y5KtA19N6s1pdhI0J9r6yprT/XfSQNC+oD7K7RtIKQ81fQVKCInSZTfps4IkmYKa6oesJBOlZV2L9QOAca2TSYDYcOCnU3qz0YKzD/UEB1V3vbS18hJY8nICIUVIdCT94yl6cdGQmDYl+wlVphY6w90T4BYrJ9DI7gY4bQGTcD3zikdlk2frQT6uzy4L6h38XSQOQ8wFuGlvKbPOm8gcJRgjdrC312QAAAABJRU5ErkJggg==", ck = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMCSURBVHgBrVZLTxNRFP7mdiQUAw4akGhMhugCNFG2gIndmRBNWbLw+Qus7oyLFlcSEnHjwgdi/AHGbkhcFRPAJVVZsDE0oMTEYCFCO+08rufe3hkGbJEKX3JyX+d+37nn3M4tsAs45wZZkixDtsi3kFdzCTIT9UJsUgR7xUQtIa0K+R1qUmSGGGd/fsTsynvZbpTXpU/H4VM4Y5xD34nL6Gnr9beukQ1rmvakpoBIhyKHMzONB95T/Ch8Q2tjG5obDET1JulXdAqwnE2sbCyJXXjYO47TJKiQIpHhvwRU5FLdGh1B+eVzPJq4iENMr3jtPCuvmOUUsbi+gCud13Dj7D1/9a5/Et3PuR+5ILdfjaPh/AV4mg2Ll4lbqxBqIfLKPoABnUYX3n4dl3NKJElr70gkx9QWkRrDnf+CMgnoHcfBikWUvCLK3EJJWmUsTfRpTqyVIdYKaGvqwJuFx/hEtVL1mxAdpqK/JXN787o8UoRCZQXKM5FZkrSwRa7M8jbVekEKRnQdGtOkiEJMXHPBNyhG7uw0sLwkTgyWz4NFG9HV0udqWpCRoGgc21NFuYLjufxYpB2eC3z/ndNPNou4kRACcXlrJicpcoqeGNmvVWitrbjdeT8iSWlO5DvcBjVQred5cF0XjuMg6kX9EC4JgR7pRPlnfh1LJWirq0HUYaJwuxNCmDEG27b9KVNXBaH0LMvbEtxIcqpFVIvct9A+kwUO0qnKT7sO+AJhCIGc7LUcwUFB13W/uxYIRPr7cVAICWRF7wNZjA0MwH3xbJvj0NCQgzoh8j82Nsa6u7tF8Gn/my9hD17lTvtR7pFxMgRfnL2baZrhz7jpq2bEyJuZ5jYRu0rkfwTm5uaCNyJ8LFO9UtwdHQlOUS95MpkMv3gmduQu4a8KEbdOgRC5QAI1CpQKXOY/y3z+izgWi/FMJhMmT4U5qz2ZQj0J9QufmppCOp1GNptFLpeTPoZhgIgRj8dlq1D1yax1ElGT13zvyPB9/LtIKIJ8iHBRzYmUGrtx/AGKRqt4j4yNAwAAAABJRU5ErkJggg==", pk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR/SURBVHgBrVZ9TFVlGP+959x7uYDARRKvfdxsU1CzbII44A9wtRwsw+mWzWzSZv2Rq1gtV84JjC1oOYXcqhUIytba+pgM26JIcCVJyXRT3EoSCLoxcrt83e9zztvzvvccvIIaLZ/td877+Xs+3/Me4A7COXcRKgldhEF+Q3zmWAVhOf6riE0mwUKl+XaK2C3IX6NXFcEl+mf6vAiFgsj7+SSU1hOxRbvLcS73aTidiSjKudfaOkGoZozVx/PZ5pBXmuSSuO5YH4bHZvDy9mzkL3XDkZcnbYouSsGQdxqHWn8Cp5GvDpXg0awMYdAR4kgjJdUWp3ILy1Hz8S94Zl8H7HYVqx5ajNQUJ2yKAiUQkLAxhkSng0iXYKUnHaWvnkJt03mLqkrk5iYFZvwk+cz4OErz78HmAg8iGhAIGdB0WqhpUIPBGKit6Rx+muPk0RMbH8C6FcmY8Xot3korJ5YHIjQu/fIl6E8+jpW/X8TRNzdg2yYPAmFdkgkFjMhZMACmRaXSQNhAScF9aHgjlxeyceilm6H1/Agzf80yB6amctGZHLwGB70dDUfA+y9j1/O7yboCfvFXH2MTGhQi5xR0Fo3i/qVJ/HDFerYm0wal8ROmtLchQpMzwVCsOoBiUebCg62iN+ydRHRjPo9+9jn0LWVQRkfgONaIZWqYlRRQpUSiZHJAeoFIBJty3OzhJSrsRxtgu/ob9G3bEWk7Bd+KNbju81uhqhBVVCZaGY4owtN+piQlQdvxLLiqgqohtmxqCsw/QwqCImPU9ssxIdreV0QOYeg6VEKqHoLDSKCZZDFdxMSpFDELbd0C1nMWKpEKtxS7HVTo1FAga1E+WOzkcI642gYoLAblxRAKqc/XPoLE02fE7JDNTAgwMkJ7mdwv7aY4S5AnsDxh7GZiAcOQb2ufQk99ctJatXz2oDFz/7yjTW4vVFgcLBHRGJKt1DTcDZFeeDxWd0LkoIsaxQGfD1FKpCpOLJtrB2D/6AMJIdrOXYjse2seuUHhErAtWoSk9HQx1C1CJLJRHGQJCKlUBUYYtuYmqL3nwBdnIPJOHXhaGnhCwiyRaPPUVLAwVcyB/WCjozCyshHe8xIMtxvXgypMH9pEiOTXL8OVhPThASSWPQX7+/XgWVmI1L6LgWnF+Pqsl8+19tOOYVwdjxqRtw/AWLUattbjcO7cAdvp7+FZlmItO0nRYOIz2y16iYYOTi4Gm1oQqqpBzZcjfEP5t8qlgYl5uf9jzI/c8g6ltn0M0/sP8lBjsyzk5Oxsa0kLcQ9ZVfQC4QIrKHQZ33yHC3+G+N4XO9E/ODmPeK7UnbhC3gyyL2oL+eofepg9WR4weTeIhvzYCU3WQEJmJnqvTKH/mo+ZJ+xfhEtv2nv+Zs4YuZBqk/PGfWDeRFLJ68+tZedby/CgO1kS8DhFfPbN5bNovRudH5bg4J7H4snrb29P7CL3WZdtd99fvLN3hIdbj3M9Zx03COHD78kxMTfnR6ACCxHz0m/hC5cu/j/+LipMAl8c4aA5Jq5H1504/gHdu6pacKBOxAAAAABJRU5ErkJggg==", dk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM1SURBVHgBrVZLTxRBEP66Z3bCCrgEH/g4iKCIMRJJPPi4ED148aAx8WAg0cQYb4KJZxZ/AcarCQSORhNuegIvQDzIw2gMiUIEURDcBRYWmNkZq3q7YQKsWZBKKtVd3fV91dW10wv8Q4IgKCFtJu0mHQ3WJaF9jaTl2K5wkAbIV9pyEYktwB+RiZOW8Hzo1yoGJ5fRN76KxVUfAfkOFVmoLI3g8rEC1BxyTGiStEUI0ZqTgMuhwRVw31gKH6czOL3fQtKVqIhJTKSgiNJugJ8LHsfg6dVSVJTaBiZOJC2bCHTmir1jYAFdX9KoPezACyQKbIHljEBEAq6/FsFBWCbHaMLF9aoCNNQWm8UmcxJhak5mgMvSMZjC++9pHIk5iNgSq76ALQVSrkBZITC9aEiyBHwCtiMzK7hZHSWSIlOuWiIZk5qRS1Py9Y+H15+WACuCmWWJJU9iluw8lWeRxj9SWbviMzHZQFtK4kBRBJ3DSxim0ur7a+OB1Nnf5cmz3iRKohJldIl7HEnlESh0uDQCHmXtWMBKBgTKVpCuk1mWBSEtdA4tmTLVcZvzzdzg2fTIGKrfvPKkEIiVxhCJRKiAG5qMpiJQxcGG5kDGc1EzOwc/8PH71B3rQPkRDm4U3O/MNjc3h3Q6Ddu2VTasa7hExCBha4CN9X0fmUwGnuchGo0iFovxUg/fwTke8YKUUqkBCme40YbXw4lwvOu6xlVu6wtRGfDixqPnKwxuNBRXLsMbwnYnYgjCwgRjaqBLsxvC96gluUbgOA52S0IEgzx6R1q3kpj0X7Y+8KXIdud2z8JV59L7pLcePreLi8+yu4vblC85wbMnfbcxnOjPtv8OGJigrOAoOq70Ge9x+l0J/m708Kyhqin7fcH2JdBHaD7/wrjaw9+ie6TJmn0X0XCySZ8X+YveW0+xlXvP8FC9DTxQBMxkHPVVjxVJkA+J3sN7GbyBYrW0aMxND04c2S8rvs1/RvzDfUylJ3JeBwOrU59oInshDB43k62ezEZNon7hw7P96J1+qwin0uNqT6EdU4CXDl4LA2/5ZObITD367UH+0h38x7+LRg2QCAGOal9ct3lO+QtuMhO18TT89AAAAABJRU5ErkJggg==", Ak = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOtSURBVHgBpVa/byNFFP5mf3gd20nsJAYZdBfTnI5Dp9wB7Ykg/gCQ6JEoqDE1hZ2GhgIaKoo7UVHCHwBJh4QEF0ruCHHBRbYSYq/t3ayz3h3eG8/4NgZyju5Zb2dmZ+b73q+dMXCJSCnLpE3SXdJD+VR6+l2DtI6rCm/SAIvK/YWJaOHH2kIlcbQrg15D+p07sn9Ul0+eHMhOpyNPT0/l2dmZnPOqMY8n5sCb1LS4PxnvIRp+Bjlpw7JfhLArsEQJofwCaWrzWsRxrPZtbGwgl8sZmJYQYscMrKzlBjwa7CA4fZ8AXbj5W3DcNTi2BcsKSC3Ytg3HcZDP5xXwyckJfN+fEWQ9ESbm1DwkLTN4HH4FN7cFQfSCVlhiupKbQH5LT1d5wJqmqWrH4zGKxSJWV1cZsk96lzxpGw84NOUk3sf5qEUW18jSELZW7lsiILJQkdFGpcYbbl3XxXA4VESMRXpfeaCtP+TBqPsKWdmG623RJmgw4yeBQmKU/kDPWbxxHo1oTGR2ToFz6KrVqpmuOPR4j3vJ+R7Fqg3b4cT8TeBLClzMykBqJoms+N1fMElSVK/fU95w4pnI8zyebjDBu6pqou8pHFBqiWOCWtcJuoCn4s0TkziCf/IYf/3+I4WHxomDwtotlfgoigzBW5yDO2rjZF+FhRMLMSaMYw4aaag10O2U5M/Hv8I//gMv33gHa7U3kPdc+AffqHyY8iWpOzohtOtwWjUm5KBFkhfayFTztHroV1zdxDiqIoyOEB39DK+8CW+5rpKvvMwQAHgKLATmJNF6UWq1Glka4bevP8WAgnDvow9UDpIkyRKoKuIKqo97d8nOfZWDi8m9KIO0S/Z7ePTT50iiY6yEryMuvYSuO0ZpuYIbN7cUUaVS4eV99r3NPTu3jatIrriJZe9NFK+/hgJ9XOuTHF6orqs5LlUt++xBizrNNN5DMnyb2BfzwEh48IhKfILSzVdVaDhEKysr5mz6hD34knuWuw3hbENKXElkSDVfLE37tJmrKHPwfWdR1vnc2OORvdRUBEYXkeLt23CvXZsllq3X8iB7Fn1I2hfkhZVvXtkLI/yR6fiz0erIVgTMNHux1IJgkvTZnpgTlZXBC4WCmdrRmP/a0JrdT5OHMhnUZdInLn+qcgDZ73Vkr9dTyrfaYDCQ9OVmb7YWLhN9kc+uzDTelWnYkOloWxH6/a6ky0UGQTAP/J9X5v+R8KX/QC4uu/I5/l00NEAvA3io33FIy5dh/AMtU6MJ1TyzJQAAAABJRU5ErkJggg==", uk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPMSURBVHgBpVZNbFRVFP7unfdmOm9qO0XaYQy1RWZhrFEUkmI14kJNJFHREDeaGBO26DTRsHRYIgkYWbhRoYkrQkzYYOIGMVY2En5LICEpNCWloaXTdv76Zt67nHPffa8zoYU2nOb0nXvvOd93zrn3vTvAY0QplSb9nvQs6bhaljkzlyftx3qFgwzAWuX4akRiBfBv6FEgTfO4sXgebvEvNErnobx57SPjvYglBxBPvw/rmTfC0CLpQSHEj6sScDsMuAau3TsG5U5C2t0QVhoy5mg/3ytD+WX4tQmKAVJbf0HMGQhhCkRy8BECk7lmr00dhXv/N1jtr0NKWzuJ1lToT2hw36ugUbmJ+MYv0JYdDh2Gw0pE2HN6XOS2MHh9ZgR26iVIQhWCoBhdLGejgiBNoElI66XLsLv3hSTcrtco7rY0MdyatFcdgzt9BFYiA4kaEVRJa4GNChFUiayq7WDd+NC81ZZFnWK5tWb/jusKTPbjPChdH4JsTMLi7Ila6qxN6uahdP4iqsAUA8+nfStfB5ydcHInw1Z1WfRvD1tTU2P+uQsdfkwOIOn0CNuOG9AIubVHQumnMmQNr64qZQHPW8CgfcPa0vcie+aZ4GO2Dp+qyGOnPpcQEom4jQ0dCd17zo634L0dPbg5UUJbXKI7ncDo1dmwEM1YXHRRXXLJ9LG/uIAj+3Uqu3gPtrF15dYDhL1YqvuYmXdRqjYwvDeHvoyD2fklHfGAgOZKLvqzDvJ7t6Jcq2vfqutF8f9cnA5b1M97oHPIffYH7kxXwRVwys/3pMhU+iQtVjzMl+tolg7H0tVYtFkyRps4VQ7KoQr6MkncOvmp9pNRhD6KYZMFss8msHtwEwVWKMMl1Bt+i84uuLg7U8O7O7qRbrfRKssvDRPcZqOzPR4t5janqJ8+fj49jifJr2fu6IPwwnOpKL4/2x4uFyOCXdsyZk5hU1cbMl0JrFVSyRg2b0xG41dyXaF5iU/ROdJ3vh50sP2nEY8Z5d1g9UusUSaDxz5Seh3w9s6jEkGfTvMm81s3xw6NTz6C+G8U4ep6RBlwv7cX9v+XwuktdEgEfzf+5lHsuwPaMdT1ErBaI7+HUyeav0VfkRbF0JuQhmS94Czi2wMQAy+zqe+GVqfg+tPiHT6kvJ4NyjeqHqO8zr7eD4eab7j8ypkoVYhcrl1R3vZXHyHym1QD7/lQ+aP/NoMXmjFXujKZXX++9Zg2HX+eAcauQk1MBAGdncDQW8AHu8FtNbLilblaJXzpn1Brl7PqKX5d5A3AXBPguJkrmGO+qjwEQ2RwVFODJksAAAAASUVORK5CYII=", bk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOeSURBVHgBpVZdb0xdFH72mZlGW6+2b956fYSQSEhaQSoiKhFuRBNfvwA34ooSIq6My2oidSuor8SFC19JXSI6roSixAUp7QWJMFM62qNzzvasffY+M2NmhFjNmv1x1nqetddee+8CvxCtdTP1OPUudUQXJWvnuqmL8KciThbgd6W/FpGqAn6ATZraLONCZhDf7wyYVo+PGxtv4UIk2pejrqsLyXXrnWuOekIp1VeTQNJhwQ3gVN8p6LExeK2tUC3N8BoajUuYn4DO5xGOvqMP0HjpMhJtyx1MmiQnKghs5IZ9qrcH/tkzSHWshpdKQRGFTjBoxkVDm18g/DaJwquXqNu1BzOOHHVwB91KlMs5myeSFgGfPn8OqfZ281ERxVOl0SgLH/FJPyT59NATpPbucySSrlUkeesI+tnsDoafI79pA1JtbUg0zoRnQZVDm8uZBo7eBJxUxVXwW/D1C1fyCvU3brl9uUeCjcpGPyIzEx0rocZGSdDOqFVM4BKpNiWhZ7Jzs2DTFH0QkoAkhRfDQGcnGq7fdqlqSfJnh/SCh4MAwRNSJdksvPoZxegdypp6qH84c/VbnDJtDTz/uwmokMmgQCy7im4h2G6qZmDAGJjIP39i1bSUlBh7s9ks8SKm+T7wOjR9Zfdd5XLGNyHpIpYl2CAEK02AzL+JXga+DzWP+7R3FjAnEXHUaSmZqH+c4Hm7vvEQqjcH9cE3vkIbPsy4yBbJnDlQYL0r82fT8niKFf2RkX4BWieBJo71ZKQNfjQ39hU4RJthP/bzDOl4GUGcTyn1spP3gVEfzgPnGbnmxurpovZzbv8E8ClEGQbKMYTgrenNakJNeR9Wzk1q2ONQJmYVvEqs5GKCBMurpmxORu0DruLadNRfm6xprljmVoaE4L70PF5cVeV/xrSMG93HvB/jPpz2I5WK+s+rMJdFJYtYN+WgySZnZVTYuQ2KFRAfMJEVBM/R7d1PaZpDi6X8dr8QA5sKWrAAqUdDzmoxS1fJvXFPRgneI+74x+l9GlSCi0gBWHCU+CQvXnFTF+QucmvcQ82pdZ3wLMmfiLP3Dh91+TdvQ7lR9PwZCXp7dDD7Xx1a1b9Q+S62wcme0heuu3okWqdjk+FnOuhYUUEUlqgB3rFVh5nBUvB0KWa1J1PY5WUzJ1zLseeTiRfPoUdHI4cmnhm5a7Z0QdJqpeqTWWsl8uhf0L8vd/Vf/HfRbQGyJYAjdi5ty7ym/AA6pls/2DukmwAAAABJRU5ErkJggg==", hk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALHSURBVHgBrVZBTxNBFP52u9tYMGF7gCMuVwoJBk9iYvXIBf+BejGesB6Mx5ajaWI4GxWjP0CriR63JnpuE4Fwa4UTJ0CpJXR3x/eGme1EW8SW176+2Z153zfvm9mdAqeYEMIjL5IH5A3RtT11r0Du43+NkxTAWW2tH5HVA/wBhRK5x9fh1y84/vRRRnFwIMfYk5NIzcwivbgI5+o1nbpPvmJZ1mpfApZDgUvAo9WnEDs7sMfHYWU92COjMiVuHUK0Woi3v1MOMPr6DVK5WQ1TIpKVvwjUzCX7UfkJjp8/gzN/BbbrwiIUSoJEkykCQv4C8a82wq1NpG/fxYVHjzXcQ12JpTWnUGNZGLzz8gXcmRnYPIBQLMucjaXgT/i4HdOATr0G9959TcJyXSaSpiZYo3AnWv+G1s3rcHM5pEYvnhB0Z9FlUu2kCrqOfv6gSraQefder0uVCG5YavYNvnM4Pwd7ZxtOjmZPAJoARgVCJKLSx1ItIKKOcGMdWFjAyNsPelDWoZ9bclE3NxDR7sAlH/HEBEDaa1RLSm/uB6G/J4vOMoUdxNksQiJyGw24U1PcWeAKAmrkD2gLttttOI6DVColPdkJLIdaaB2VtEmM4xhRFCEMQ2QyGYyNjUmZWIU5WQF12LYtXQMl8zWAdDT7zYlwfqfT0bd8lkg+UDwD7jStF0g/Y3DtRp5vmwPMOIhpAtOYoCkbSprzMF5HZfsJQTqdxnmZQVDn1mfy/O7uLpaXl4eugvUvl8uYnp7my4p+50vL5/P64RzYfd83X+O+Zg34KgiCoQlqtVpyRphl+eqUEsVicWBwzjVOPB9/aFfQvYOQGOBsBfRZoJIewaWynv8C5nVjaQ0rmZi9jkxmL0I94dVqFZVKBfV6Hc1mU47xPA8EjKWlJRmV9Twy+1XCa/JKnN0CMcS/i4IC2DMAG+oeS+qdhvEbO0F4AtTecrwAAAAASUVORK5CYII=", Mk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOESURBVHgBrVZNaFNLFP5ubtrXvoaXxD58ryI1VfC/NSKCYLVXoS5UiBsRdGM3giuruOhGkyDoRkQE/0DQlStFBd16K4ooCrb+okITxZ+KtE1ta/68dzxn7kyaapRaPcnJnDmZ+b45Z07uCfATEUKESOOkNmlKjMuQ8nWSRvCrwpsUwGTl7I+IjArgu2hIkIZ43p26hSvPrsoxkxuWayKhRkQbmhFbsBFWU6vemiFNGoZx9IcEnA4FLgEP3jiMdOY1/gtMR7g2hEB1HeoKAh/wGWOFMfQNpuW+S1vPS0IlCSJJfkegTi7Zk9cP4did01jRuBxVZhUEvWgTTFdgby6Pf4sO7vn9yJJvTmEEJ/pfYGe0A2s27ddwu3Ukhs45DQ84LUn7EI7fPYMlDYsBn1EhTqBtrICWvIN5cFFXDbwbAV49vY/Q5j1oX79Pp2spkaQ1wVkatvf2PxbREyuNlv8XI1AT0PQ0Gl4U0sEWpF1XdBH7VMA/QuCUP4fbg89hd1zT99JNBGsMdfoUe5qONCM9/BpLZjSPn5pHQ0MrQjE+W1b4gpeGiU8UbW//I1izWiWJkrCfPjZJuvQtCc5pGcgOora6dkJ66CDyHjzbI+LpTU6jKCKXz8uDMA4XiIqikwlibHEpwucBfswOoN4Iyw1QCeHxpG1i0YA3f++62DI8WiLe0TKE9tk5OFQIM59cpHRIgjYmiLLVQ+FJIHrnnbwkqfXXUEC+UgT1gybm9BsyhCoiGBsYkf5sNotAYxFzidsh9fV16xRFmED+oFKcnrJqKTpFqabPpMC8L5ycCXxWafriYHR0FC4RySjGrwtuLjOBYEKuSyuVOK4DR9kuVQ2KisBx4TgOyoXBDTGxqjn+tLzumiD+hDC4OS2ip5kSgTVrFf6UVDVEtdnDBDfYis3fgN8W4dXcXwtj2nOFCeQzw4q0SpUrBKYkvM0XjqC6ydKuyz6qYb7ybp7FV3dhqqLPFdx2SbvO8bPIpyYdpBmOQJJMJQpa//faOPxe/mVvYEMSMJN2JNq6EG/rKm2arMzcGCeChJ4mFeY3hxAioXvgg/cPReRYs8CBYEntpWHhTp8mta8+JOO0LEvYtl3ePhPlmJVaZicN3Nm8lvmKWubza+j58Aj7L7yB9ZacwSAyK1ait30diEBvrdgyK4pq+ufE5MUWv/HvolMBDJUBppSPUxr6GcZXPmEoU3BtZ+cAAAAASUVORK5CYII=", fk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARkSURBVHgBpVZ7TJtVFP99LaVWHisbaBkTcCGAgoRuY8qWrJ2Zz2TWQGaiiYMlsImJDra4zCha5v6ZmEiCjyVqWHzMxBAjPrIoKKsYozKgyhjbYKEyVraO9f3+2n7e+/HdrpGOddlJTs79bs/9/e4959xzCywjgiCoib5JdJDojHBdHNJcK9Fi3KrQRRJAqtJzIyIuCfheYoxE1fR7eMIGzUoFVvR+BmGgH5u5Z6C5OxtVpatg0K+Fbv1qttRJtIPjuK4bEtBwSOAwjVjR2z+Fhlo17hvqA5e/Gr+WbsXxnyzw+Hj4AmHMXHJDIL5fv/OESCiJkZB0LCGQdi6yD5vnMHDqEvbmzYMbM8PxyHb0nOUwMrkAjqO+bLEAfzCC8ekF7Km7H+27axhcGzsJx2JOzBgNS7DzCPiKSiiqqsCdOwduQw1OzfjhDURE8K4vJxGNxa6ziGcQMHLGhpefrUR7cw0Ll5aQWBhBDzGN0dPj8D2sg6KiAvKMTMikHUhOoAyPaloQ4uQJsRXoeni8QUxcuIaBo0+xvJwkBFvTpN030plAw/OQE0uXy/z+OAFDo8ZHQhJOyNyG8pVSiGPIvlOGE0PTjEBPyzyNDJ6mX9FoFNF9r0DZ9hKw/wD4zGzIHQ4ItbWYtLjhcIdEIO8nU4jEovHdu/xHIaRfwV92HmtDLnT/5sSuLZ+jbN1m6tBKN2mgo76TFvx5RQYZCcNZawBfefKhsFmR/mIzcpUCOr+3orH7DFykgmhiFzUKZzQMBQK45nNg20OP4171Gvx+up8dUEcJqunog95JsfzohN0VQsuRP1A/XYaLr3WiYH8TfiiZwMGGKvB8lJRoJK4Rtxuq0AI0wh3QFm+CXlMC89wwIyimeOKFsli9JIdcPHl8JIbvhi6i9vUxvLfnQ3AkhC+8vxshUv909zQXXj+POfDIUkSQEZEjt2gNbDE/Qk5HnCANCbLzxxhUhYeBb3nyJRPnbI4g9r07jENZJHGRRnj4xbJkwofD+GVWQH1JGII/CHuaDJVKefx3imKhgxWZSoTCJKZyFZy8DP8XpyecdL4wyKMsI4YvXKtQUFiEQmUeiu8qiC+LE+jW57PCSFnUWenIVuQhJ1cBOQmpSqWCXrsJsZwK5mKmBCY6MuiKcKsMb9eN4rkHfLB6SSlfncWDBw149fhhFFc/xlz6KEEXO4FunSZlkuwMBS5cJfWhyEFb2Xl8+uQO3JMeRPeOOujLNzK3b1irGCRGbxqdx7aWE+TKxu/wTSUnSwlt7ig2asZRU5qG7Ts7wWWU05+OkarctaTZHfp4DG99ZBb7Tqok4olJP2pvrsYbTVo6EW92YlnQATFiD6cO1HGxW6aSDwauZeBUOiTMJQ+OkRj66ODv83bUH/gZ/172LQtP89beVJ2QPxHcyD6SPZmtEol4w02jl9FnmsU/U3ZY5r2ijzozHVsIoEFXmAic9MlMfujFR/+YkLoMCrfx76JVAnAkAM5Ic0ba85fD+A+CLnN0K/RGhQAAAABJRU5ErkJggg==", gk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR8SURBVHgBpVZrTFxFFP7u3V0WwlKWIslCyyMULBEsbCutqGGxUVurdlFjLCGNRWubauThK9GEurRNjGlM+GGURg01MRFFraQmYizCphqSUh7lVZ5hobA8Aixln90H15nLne2SBdymJzmZuZMz33fmnDNnLrCJCIKgJvoJ0WaiY8JdsUhr5URTcK9CN0kAoUrtRkTcOuBlZDAQVdPvzoE5aLaGIbLuOziMV/GEuxApCVHY9WAs9AWp0O1JYFuXiFZxHFe9IQENhwQOY7sZl1tGcfRRNdL+/hVITERTcj7qm8Zhc3hgd7oxNrUMgdhe+vxZ4eH0WIZlICRVQQSS5yJ7W+80Wtpu4W31JLjBAcwXHEJttxddQ4vgOGrLNgtwuLzoGZnHyZceQuWJXAZXwU7CsZjTaNCwuM5/Bo92NxQ7M8ANDYLbuw9tIzbYCdAKQa7+oZ95xFwTtb1/DqVFWah8M5eFS0tITIyglgzHfL09sO/XQZGZCVmkCrzkgWQENy/HM5q3CJwQEFuB7ofV5kLf6AKu1BxmeWkhBE/KJe+P0RXna0chI6OMbOcdDj8BQ+M5uXgSrE0cCvOUiOOH0Bozh5//uskICmiZy8mkkH75fD74Siug/KAC3MeV8CiUkFksEPLySOwtYqzd3hU4a0cgBHgfG+lAatQ1dLT9i+yEaNT3ZYsFIpGUUyf1dFb35wgGrXLISBZvml1ocCUgbHYKivfKsC2Kx5lfbuHEVwOwOb0i2ar6IFcp8FHvVdQQJ95v7MTUggkNLSbmgY4S5NBZ7eVhLNu9YjQWl+/g9XOtKJnZhckKA7a/+waatGOoKMqEkwDbnasql/HYMb2IYmsuPk1/AaXpzyFfWED7dT9BCiUQL5TJbLubUCIeEo7vG0dRcLYHX5y6AN5ux8lvS8UcUO/pKJdxeHr8AmLMTZjrr4PG0YJ9s7/jAd7pJ+DoPaezNH0dZhecCL/jAsLDseTh1+RSHRUGuFxr1pPjVbi08xr6rJPwXZ9ATl4WZhetqFHp8dOXr4g2NMkmyhStUmJ8xgGXLIK4H9RBsGR10zoKWv8x4yBkQjeyXj2N+uEriNmShohe//4lXiIgWY9nhRGyRHiciFwZx9S8CfO37SSsU/B6zTiQEcFMuiiBkc70umTcC0Px4yqcS2nEXGsvMpIO43x9GeK3ZqG//zb2JyuZWQMlqGYn0O3WhExSjH/AHYyBIm4eThuP1LjnccMUjZzt4dA8tpeZ/cZaRTMZCowd03jq1B+klPx3eEPJzw6H0mdGyYthGJsYQGJSGjRbvMjVHoFKtY2aXCStoiSo2Z35phNnv+6C2Db/h4TJjngZYlUuvFO0B0cOaemSv9mJZUEnZBB7+OnjWtIRc6RuGUo+BIyaPTige4SBU6mSMIMeHAMZ6KODG6T3v/xhEyld+6bwNG+Vx3MC8ieCG9jHek9muUQi3nBjxwwajBPoHl6Eadom2qhVYcgngHpdUiDwuk/m+odeffQvCqFLs3AffxflEoAlAHBMWjPQnr8Zxn+ZTYAC+NOunAAAAABJRU5ErkJggg==", zk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgBpVZJTJNBFP7+ioBYtLiDUdG4JMYQwHAiWjRePCBGvZi4xLjdFC/GS7XoxYMHT8aoCZAYiQdNUA4kalgSuZiymYiytTURiGwFy1K6jO/NP1PKmgKveZ3/n775vjffzLwpsIgJIWzkD8hryN1i2oZVXzF5JpZqPEgBxGulCxEZ84DfpsZJbuP3OlcPKmu7UU+t79+UjMnMSEXW/o0oKtgD++EMPdRHXmIYxtMFCVgOBS6BH5e64O31Y8uGFKStS4J1zWoZ5x8PYmxiCu4/oxD0/v7JSUmozEkkJXMIVOaS3dszjMLb1TiQuQFhYYYZBscg2pq9AuOTIXzvHMDNMwfhuJGn4e7omRhac2qaWJbyj204kbcV3T3jeFrRRpmGVJQxW0v9IN314y9unT8Ex/U8LVcOkXgSVBRLY2tpH4Tj2Tf4L2djZDyEfl9AAqemrMYoyWIoEkGfaTrBCWL7FisevnDhaO52Xhdev1LyY4bK3s2he0+9gbfPj6x9m0kKQ8Kkrk3EueO7UFbVFQWfOxMh29aOfthz0/H5eaH+NY1ncFovKoMDFgyNTiE5KQGFR3fi6qn9yNicgoN70uB80YwB32QMhYiSBIIhObbO1Sux1O4qttBXET9V1nlNnSlzlmZsMoy3nzzwjU3BShKVVXXKBPy0JrywpoflGnHsgI+2sGGR4ytrPToDOxNk81Nrx6DMgD0QjNCAAIEFUVHtRu6FD9iUlizBJghYgsY4x04EwtB7q76pVxNkskTyQHl6/DM2SjAUQdAfwfN3P2GxGPjlHZkpPXtEICLE9IZSCugDqQlizJjVAmECYY/fjBnjWRMPP6y3JqnfDazUuJQo80UJ7IfTza6lJLuAZe2Llo1mlqiOvODexWRcyn8i9VabYUkmzKMg5dy197XuruSDxos8zG8T/bRjgw1EsjwCXiqBHUhJb9TduxPoxPqIpJZnkbjuLr423JIEy2Hgwngkv1z3lMXWoivkTauS8m21Xa/w6GWzIoiXxNTHcT0b9oJD3CHvBn7gXLnueHTH/Ws5MjBaY+IGz5FjlZUozDkXjhNmZUVL+xDO3v1C5WFsUXh77jY4rmXLNgbcqV/muzKLFYl5ZTb2UZ36TaVkCJ5ev4yxWROpLG9DkX1nLPC8V+b8kzYv/TIRv9WIFfy7KFYAwzGAbtXnVNt8QfsPpAY0myr8p50AAAAASUVORK5CYII=", Ck = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAObSURBVHgBpVY9iBRJFP6qerp7lhvPvcPg9m64W9RjPY41EqMVRUyEFcVIMFAjQycx3jUzUTcSRERDEQMRA8HARRQDFQXxB1QcV3QN1JnZ1enp6e4q36upGntmWFn1MY/uqlfv+16996p6gG+I1nqYdIr0OulL/VVqdq5COorvFXayAMuVs8smooWHbIRGkiTRtSvXdHXTbv1i/Tajc5P7dO3SVWPr21WlH6/QBz5Fj2l+T9MUrVaL55A1FhGWRyDG1ph16nMTWX0RURQZe7E4pIPAHybTCRqvFEIcGSDgyB04A8dxDN/3IaWEHhoCyhpypEFWATUv4Q+Fxq6UovWRUCojoiK7TxNWg0hmeCBdzvPgtHWEYQjP8wyBTDPoNzGKW+soTn4E3rYhsszYC4UCgiAwPuxrZcrVRLoJ0uGMnNrttnFiYAYwJDQv3pPzhxiiSc/3MZGqDrlV9mESTi1jkZ41KbJM+3nAOe2CWkfaqokWrRjIIioAvTdDiCTt2Kya2lC6XIAkW7jNeQe7eMTRswyAszOB6c+RIRCKCt+MuAt61rgdM4ndBUuFqXaa6Gdvo/38FTJPImWSYtiNLLn30II2iURBR0Wk9x8hOn+ZCwjN0UctMilSqtfqUazYNsGumwX3L+dsfscBJLfuIvyXon3mQ1CHCCKBFLbNgNJMHfIPhYU9vyPX29BUXMUpK6dov6YUj4/hrxsX2Vot2IIgm3tjKh5siREcXoTQFpi2DiENgbc65S5F6bjrFkU/bUhQUohnQySnf4FuLDj60e45ELmn9z9F08aAiJLu1GlNMmDTQS+OEyaoMpNc+SvU63lkL3wsbF8FvSAHQEqnavD+zNDYsQqDRjqI6zrE/t9lN1vvEpQO7kX71h14lI7CZG8c6ZNnVNTHvZFRngvj63p3QamSaxWCiY1u6gFP8tHW1Kaaetg8qdV6rspPJ87od7+N608Xyjq6OWLeF4+e7FnDPg4j51/hPHTuDNvTHMWPivN17U1ySdKgTi+zPOKDwoucfi84qz3FLOcIu+oqeYC07k7kUuBCLg3uIrfRc9DmypbWUO1O5FKV34n3T4rsKV1o1OveWDIQucuAlSMW8+v3gO9vvpzodYpJWPhesTBIXxWQHluRD7trz194FnzGDXq+aGTgjuLtmevbpcv7by38iQ1Qc2876+jMcIv2Adf7wZcU+9E/p5cv1/VP/LuoWIBaDvClnZu2aV1SvgBIocKrNuRZrwAAAABJRU5ErkJggg==", Ok = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPzSURBVHgBpVZbaFxVFF1z55FMM2PHOmlFSYlBlCoIgUpaReqHFS1IFMVXldaPIlix44dCPiQp9qOCj6pVWxBT86GkItgKoh+SIn5IUVMSM7U1jzGJY52kmfd05s6997j3yT23dybpJKULNue19177cc7cARpACBEh6SUZIpkSl5G292Ik7bhasJHtYLXoXzURKe6zI5SoVquiWCyKbDYrMpmMlFwuJ/f4rC6rWL0/T53zXhr6eG4YBsrlMu9B0zR4PB4IS4fmbZJ7LJZlybGlpQVer1e56SPd/UsIOHIaDvGcHeu6Dp/PJ53DTEEvnCOlCnTDC6/HAvy3IHhdhyThYAKBAJqbm5W7V4nkkENg12+YJMLOKXX4/X4ncpb02BPwCt4PQCenazd9XZOJsrFJMiSdZJfQbEYuTcS4VBu5W8YHb0A+XkVmNI/UidCSc7ZhEj3NvhEh6eeJZke/mxdn7nkEydcPwJq7WGPMGbRUspifMFCKmygXsk5mfM71t+YXMPPKGzi/e58q0/18zX00eZRXhdGz0Gf+QW4mienxBKLPPY7orielE0YgmAXCJXioTMFy2CEwyxVcHPgKKZLSn+MwIVAYOYvQXZvYLMYl6uaZ/7YOtL+3H01tN6FMiv+9cwR/PbwTpZG4JLAiD8AwK9D0SwiUtsq94ukzmHzqRaQ+/AzG37PS9tbBo/Df3qGy2Obh+6uaK1MWQOrdo5j/+Bg0uhnQPLj+sR2IPNONRE8vtLVhtPW8hvSnXyD7/Sm+IRSdH617d2HdC0/D8vtk44PBIBMkmECoq6nqyWN1Nolk79vIfPcjEVMTb1yPUPd2+Gi+8OU3sLJ56Si8bQs2vv8mfBta5W0yTVOKTQCHoFKpOASqvoyF4ydx4eBHsj9uNG28GW0fHEDo3rvVO5KiCNSb4B4k0AChrZuxZrFhNVjT1YkAkSwH+TgXkeEMhvhK8WvkCFQGgt5Eivow98kAzFxeaofv64J3XQSZEz/ItW99FBtie9C6Z2dNBvLSUF8Ip3izj8tEB4IemRxzP58W8a4dYjh6p5T45odEnvYUFgZPirHOB53zsc7tojg8KihI6YN6oVRj6jdfojg1Lc4/+5L43TYc6dgi/j14WFjlypLfZyObF8m3DjskbDO5t0cUJhJutXbVoCFeceS/Ru+QyhNEVJmeFSuBdSaff1n8RjZsW/zjnDrqd5oiFj8w8htw4ciAyPz0izvNFcG6c8e/JdvP1VZa1H+AxOLnT4L7wMKGKxHxudJ3Ibbs9RJ2wxsRqbnbcV0QfWgEO5O0O0K3Q/e6znH6ipEvQ8I9OSZWjyFxDf8uYraDtMvhlL3HJY008vE/M9FJvtrwmx0AAAAASUVORK5CYII=", mk = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASKSURBVHgBpVZtTFtlFH5ueym3X6NlARng0g1IiLoPjD8GzomJcQ6zMD/QOTVZ4kf8peWH89/oNJuixhkTY7bwpZiYECfww8U5CWNbmPFrzKAuSgoBNkZpoa39oO29fT3v7b2lKsUZ3+Tcc3vueZ/nfc8573kLrDEYYw6SNpJhkkm2MpY0m5vEhf86+CQN4GZHdz4iYRXwl0l5SBz899jCJYxeP6PqSDKk+pRZb0W143Y0lO/G9pJ6fWqQ5IggCO/lJeDh0MBVwE+vvo8bsVk4pRLYTQ6YRYvqF5djWJajuB6Z5rPwWn0nqohQGx4iOfIPAm3lKvvQha/wwdRL2FF7F0RDAXkxchRUnfHVJwHLShzToato3vwU9lQd0uFa9Z0IesxJXeZhCYVCiEajuHD+LEQMYO+eCAxCxlNYwc3odIYsTTqV+B4FVjekdW16uOqIZEon6CZ1MJlMwufzQZIkGI1G+P1+jAy9ylr2zcNuY3+jEFTwDAGDooQhJ36Gef0wxMJG7nSOCO4TtNVPcsvc3Jw63VI4QxDVkPpPIdL8MAb7P8SD1QOoMBrIngHnyEzjYsStEIkcvAJIjbA8dFYPlVOkxz7+lkgk+E6wuHAesB6C89qdKOy4BuXunXh8vxun+sohdXex/Uoqs/RMVsC0TRkSKRhm7ZDxA+SBixAbdnKz20CPZv62vLwMg8GAsor7YbI+hqXK7xCsCMPU06UCPNLSgu0dncLJQolF47E04nEqpxiEKEmMJOCnXAkwkq9y+rS+g3t5iJZ4chfHx2F6ux2mK2MIbvHC/m4KZrMZygkrWK8TwkYX5Ht2Ifrs8zhx+DA2DPbLmfylkYoRmZwC5RoUKTi2bcWBi5d4dKagH0VKLvOPXWapui1s4R0Ti/nA/PR57ncj830hscSxF1hodoYFg0FV2tvbWUlJCaNEMi3rWXG5XNkjLmYPBG2PVVTC/1kf5EA9lHAS3inAZlVQXKVgrqYYDptdd4fNZgOvOpY9FKuPzDYAF48/d5acEiIpIBQGbiklTd3hjwhQXL5LncDPSO/Ro3D29shvcYPdkgXTt1B8Wy3PLZdglsBkMqmVhFgBLGNJxGtF8NCWlQG+G0YUWhrg9Xox+OQTinvRb3SYJTF3pTq4wh91dbp5jDuNkDRyAl5JQigI8Y5vUVpZmZ1c/esIPu/thfLmMXhSCSPFE2uGpalJfx3kVcS7Jq8k8DahKIparoIGEg6H8cnHr6Npcxe2rcsPrJ5oLtiEgr2/6eZNIgEFieQc34XFYlEB9cRNTEzg6y8fTb94cFpwFmHNZat9iUS09+mmHt6LNHb1guG3FKMkskAgwDo7jqc/OlnEGOf7F0mHwJQlklhb7o3n4ti57dpN6jh/Hx4dwhvjB7Chxog1181WVv90TSse2PiK/uWv7TqHxENK7bfe8C/w/Pgc5uOzeTl4JLeur8cz1a2kd+hmfqt59B+rXZlujUS9Mn8KfINR3xmVcD4+o/pYxSIVsKF0dy7wqldmnpWpOelhNz+G2f/4d+HWAJZyACc1m0cr87zjT8cv6mg/RdfrAAAAAElFTkSuQmCC", vk = (e) => {\n let t = nA;\n const r = e.classes();\n switch (!0) {\n case r.includes(D1.ABKHAZIA.toLowerCase()):\n t = RB;\n break;\n case r.includes(D1.AFGHANISTAN.toLowerCase()):\n t = nA;\n break;\n case r.includes(D1.ALBANIA.toLowerCase()):\n t = BB;\n break;\n case r.includes(D1.ALGERIA.toLowerCase()):\n t = WB;\n break;\n case r.includes(D1.ANDORRA.toLowerCase()):\n t = EB;\n break;\n case r.includes(D1.ANGOLA.toLowerCase()):\n t = SB;\n break;\n case r.includes(D1.ANTIGUABARBUDA.toLowerCase()):\n t = kB;\n break;\n case r.includes(D1.ARGENTINA.toLowerCase()):\n t = NB;\n break;\n case r.includes(D1.ARMENIA.toLowerCase()):\n t = IB;\n break;\n case r.includes(D1.AUSTRALIA.toLowerCase()):\n t = TB;\n break;\n case r.includes(D1.AUSTRIA.toLowerCase()):\n t = DB;\n break;\n case r.includes(D1.AZERBAIJAN.toLowerCase()):\n t = HB;\n break;\n case r.includes(D1.BAHAMAS.toLowerCase()):\n t = PB;\n break;\n case r.includes(D1.BAHRAIN.toLowerCase()):\n t = VB;\n break;\n case r.includes(D1.BANGLADESH.toLowerCase()):\n t = FB;\n break;\n case r.includes(D1.BARBADOS.toLowerCase()):\n t = UB;\n break;\n case r.includes(D1.BELARUS.toLowerCase()):\n t = YB;\n break;\n case r.includes(D1.BELGIUM.toLowerCase()):\n t = XB;\n break;\n case r.includes(D1.BELIZE.toLowerCase()):\n t = QB;\n break;\n case r.includes(D1.BENIN.toLowerCase()):\n t = GB;\n break;\n case r.includes(D1.BHUTAN.toLowerCase()):\n t = jB;\n break;\n case r.includes(D1.BOLIVIA.toLowerCase()):\n t = KB;\n break;\n case r.includes(D1.BOSNIAHERZEGOVINA.toLowerCase()):\n t = ZB;\n break;\n case r.includes(D1.BOTSWANA.toLowerCase()):\n t = JB;\n break;\n case r.includes(D1.BRAZIL.toLowerCase()):\n t = _B;\n break;\n case r.includes(D1.BRUNEI.toLowerCase()):\n t = $B;\n break;\n case r.includes(D1.BULGARIA.toLowerCase()):\n t = eW;\n break;\n case r.includes(D1.BURKINAFASO.toLowerCase()):\n t = tW;\n break;\n case r.includes(D1.BURUNDI.toLowerCase()):\n t = rW;\n break;\n case r.includes(D1.CAMBODIA.toLowerCase()):\n t = nW;\n break;\n case r.includes(D1.CAMEROON.toLowerCase()):\n t = oW;\n break;\n case r.includes(D1.CANADA.toLowerCase()):\n t = iW;\n break;\n case r.includes(D1.CAPEVERDE.toLowerCase()):\n t = aW;\n break;\n case r.includes(D1.CENTRAL_AFRICAN_REPUBLIC.toLowerCase()):\n t = sW;\n break;\n case r.includes(D1.CHAD.toLowerCase()):\n t = lW;\n break;\n case r.includes(D1.CHILE.toLowerCase()):\n t = cW;\n break;\n case r.includes(D1.CHINA.toLowerCase()):\n t = pW;\n break;\n case r.includes(D1.COLOMBIA.toLowerCase()):\n t = dW;\n break;\n case r.includes(D1.COMOROS.toLowerCase()):\n t = AW;\n break;\n case r.includes(D1.CONGO.toLowerCase()):\n t = uW;\n break;\n case r.includes(D1.COOKISLANDS.toLowerCase()):\n t = bW;\n break;\n case r.includes(D1.COSTARICA.toLowerCase()):\n t = hW;\n break;\n case r.includes(D1.CROATIA.toLowerCase()):\n t = MW;\n break;\n case r.includes(D1.CUBA.toLowerCase()):\n t = fW;\n break;\n case r.includes(D1.CYPRUS.toLowerCase()):\n t = gW;\n break;\n case r.includes(D1.CZECH_REPUBLIC.toLowerCase()):\n t = zW;\n break;\n case r.includes(D1.DEMOCRATIC_REPUBLIC_CONGO.toLowerCase()):\n t = CW;\n break;\n case r.includes(D1.DENMARK.toLowerCase()):\n t = OW;\n break;\n case r.includes(D1.DJIBOUTI.toLowerCase()):\n t = mW;\n break;\n case r.includes(D1.DOMINICA.toLowerCase()):\n t = vW;\n break;\n case r.includes(D1.DOMINICAN_REPUBLIC.toLowerCase()):\n t = yW;\n break;\n case r.includes(D1.EASTTIMOR.toLowerCase()):\n t = LW;\n break;\n case r.includes(D1.ECUADOR.toLowerCase()):\n t = wW;\n break;\n case r.includes(D1.EGYPT.toLowerCase()):\n t = qW;\n break;\n case r.includes(D1.ELSALVADOR.toLowerCase()):\n t = xW;\n break;\n case r.includes(D1.EQUITORIAL_GUINEA.toLowerCase()):\n t = RW;\n break;\n case r.includes(D1.ERITREA.toLowerCase()):\n t = BW;\n break;\n case r.includes(D1.ESTONIA.toLowerCase()):\n t = WW;\n break;\n case r.includes(D1.ETHIOPIA.toLowerCase()):\n t = EW;\n break;\n case r.includes(D1.EU.toLowerCase()):\n t = SW;\n break;\n case r.includes(D1.F_S_MICRONESIA.toLowerCase()):\n t = kW;\n break;\n case r.includes(D1.FIJI.toLowerCase()):\n t = NW;\n break;\n case r.includes(D1.FINLAND.toLowerCase()):\n t = IW;\n break;\n case r.includes(D1.FRANCE.toLowerCase()):\n t = $W;\n break;\n case r.includes(D1.GABON.toLowerCase()):\n t = eE;\n break;\n case r.includes(D1.GAMBIA.toLowerCase()):\n t = tE;\n break;\n case r.includes(D1.GEORGIA.toLowerCase()):\n t = rE;\n break;\n case r.includes(D1.GERMANY.toLowerCase()):\n t = nE;\n break;\n case r.includes(D1.GHANA.toLowerCase()):\n t = oE;\n break;\n case r.includes(D1.GREECE.toLowerCase()):\n t = iE;\n break;\n case r.includes(D1.GRENADA.toLowerCase()):\n t = aE;\n break;\n case r.includes(D1.GUATEMALA.toLowerCase()):\n t = TW;\n break;\n case r.includes(D1.GUINEABISSAU.toLowerCase()):\n t = DW;\n break;\n case r.includes(D1.GUINEA.toLowerCase()):\n t = HW;\n break;\n case r.includes(D1.GUYANA.toLowerCase()):\n t = PW;\n break;\n case r.includes(D1.HAITI.toLowerCase()):\n t = VW;\n break;\n case r.includes(D1.HONDURAS.toLowerCase()):\n t = FW;\n break;\n case r.includes(D1.HONG_KONG.toLowerCase()):\n t = UW;\n break;\n case r.includes(D1.HUNGARY.toLowerCase()):\n t = YW;\n break;\n case r.includes(D1.ICELAND.toLowerCase()):\n t = XW;\n break;\n case r.includes(D1.INDIA.toLowerCase()):\n t = QW;\n break;\n case r.includes(D1.INDONESIA.toLowerCase()):\n t = GW;\n break;\n case r.includes(D1.IRAN.toLowerCase()):\n t = jW;\n break;\n case r.includes(D1.IRAQ.toLowerCase()):\n t = KW;\n break;\n case r.includes(D1.IRELAND.toLowerCase()):\n t = ZW;\n break;\n case r.includes(D1.ISRAEL.toLowerCase()):\n t = JW;\n break;\n case r.includes(D1.ITALY.toLowerCase()):\n t = _W;\n break;\n case r.includes(D1.IVORY_COAST.toLowerCase()):\n t = sE;\n break;\n case r.includes(D1.JAMAICA.toLowerCase()):\n t = lE;\n break;\n case r.includes(D1.JAPAN.toLowerCase()):\n t = cE;\n break;\n case r.includes(D1.JORDAN.toLowerCase()):\n t = pE;\n break;\n case r.includes(D1.KENYA.toLowerCase()):\n t = dE;\n break;\n case r.includes(D1.KIRIBATI.toLowerCase()):\n t = AE;\n break;\n case r.includes(D1.KOSOVO.toLowerCase()):\n t = uE;\n break;\n case r.includes(D1.KZAKHSTAN.toLowerCase()):\n t = bE;\n break;\n case r.includes(D1.KUWAIT.toLowerCase()):\n t = hE;\n break;\n case r.includes(D1.KYRGYZSTAN.toLowerCase()):\n t = ME;\n break;\n case r.includes(D1.LAOS.toLowerCase()):\n t = fE;\n break;\n case r.includes(D1.LATVIA.toLowerCase()):\n t = gE;\n break;\n case r.includes(D1.LEBANON.toLowerCase()):\n t = zE;\n break;\n case r.includes(D1.LESOTHO.toLowerCase()):\n t = CE;\n break;\n case r.includes(D1.LIBERIA.toLowerCase()):\n t = OE;\n break;\n case r.includes(D1.LIBIA.toLowerCase()):\n t = mE;\n break;\n case r.includes(D1.LIECHTENSTEIN.toLowerCase()):\n t = vE;\n break;\n case r.includes(D1.LITHUANIA.toLowerCase()):\n t = yE;\n break;\n case r.includes(D1.LUXEMBOURG.toLowerCase()):\n t = LE;\n break;\n case r.includes(D1.MACEDONIA.toLowerCase()):\n t = wE;\n break;\n case r.includes(D1.MADAGASCAR.toLowerCase()):\n t = qE;\n break;\n case r.includes(D1.MALAWI.toLowerCase()):\n t = xE;\n break;\n case r.includes(D1.MALAYSIA.toLowerCase()):\n t = RE;\n break;\n case r.includes(D1.MALDIVES.toLowerCase()):\n t = BE;\n break;\n case r.includes(D1.MALI.toLowerCase()):\n t = WE;\n break;\n case r.includes(D1.MALTA.toLowerCase()):\n t = EE;\n break;\n case r.includes(D1.MARSHALL_ISLANDS.toLowerCase()):\n t = SE;\n break;\n case r.includes(D1.MAURITANIA.toLowerCase()):\n t = kE;\n break;\n case r.includes(D1.MAURITIUS.toLowerCase()):\n t = NE;\n break;\n case r.includes(D1.MEXICO.toLowerCase()):\n t = IE;\n break;\n case r.includes(D1.MOLDOVA.toLowerCase()):\n t = TE;\n break;\n case r.includes(D1.MONACO.toLowerCase()):\n t = DE;\n break;\n case r.includes(D1.MONGOLIA.toLowerCase()):\n t = HE;\n break;\n case r.includes(D1.MONTENEGRO.toLowerCase()):\n t = PE;\n break;\n case r.includes(D1.MOROCCO.toLowerCase()):\n t = VE;\n break;\n case r.includes(D1.MOZAMBIQUE.toLowerCase()):\n t = FE;\n break;\n case r.includes(D1.MYANMAR.toLowerCase()):\n t = UE;\n break;\n case r.includes(D1.NAGORNOKARABAKJ.toLowerCase()):\n t = YE;\n break;\n case r.includes(D1.NAMIBIA.toLowerCase()):\n t = XE;\n break;\n case r.includes(D1.NAURU.toLowerCase()):\n t = QE;\n break;\n case r.includes(D1.NEPAL.toLowerCase()):\n t = GE;\n break;\n case r.includes(D1.NETHERLANDS.toLowerCase()):\n t = jE;\n break;\n case r.includes(D1.NEW_ZEALAND.toLowerCase()):\n t = KE;\n break;\n case r.includes(D1.NICARAGUA.toLowerCase()):\n t = ZE;\n break;\n case r.includes(D1.NIGER.toLowerCase()):\n t = JE;\n break;\n case r.includes(D1.NIGERIA.toLowerCase()):\n t = _E;\n break;\n case r.includes(D1.NIUE.toLowerCase()):\n t = $E;\n break;\n case r.includes(D1.NORTH_KOREA.toLowerCase()):\n t = eS;\n break;\n case r.includes(D1.NORTHERN_CYPRUS.toLowerCase()):\n t = tS;\n break;\n case r.includes(D1.NORWAY.toLowerCase()):\n t = rS;\n break;\n case r.includes(D1.ORMAN.toLowerCase()):\n t = nS;\n break;\n case r.includes(D1.PAKISTAN.toLowerCase()):\n t = oS;\n break;\n case r.includes(D1.PALAU.toLowerCase()):\n t = iS;\n break;\n case r.includes(D1.PALESTINE.toLowerCase()):\n t = aS;\n break;\n case r.includes(D1.PAPA_NEW_GUINEA.toLowerCase()):\n t = sS;\n break;\n case r.includes(D1.PARAGUAY.toLowerCase()):\n t = lS;\n break;\n case r.includes(D1.PERU.toLowerCase()):\n t = cS;\n break;\n case r.includes(D1.PHILLIPPINES.toLowerCase()):\n t = pS;\n break;\n case r.includes(D1.POLAND.toLowerCase()):\n t = dS;\n break;\n case r.includes(D1.PORTUGAL.toLowerCase()):\n t = AS;\n break;\n case r.includes(D1.PUERTO_RICA.toLowerCase()):\n t = uS;\n break;\n case r.includes(D1.QATAR.toLowerCase()):\n t = bS;\n break;\n case r.includes(D1.REPUBLIC_OF_CHINA.toLowerCase()):\n t = hS;\n break;\n case r.includes(D1.ROMANIA.toLowerCase()):\n t = MS;\n break;\n case r.includes(D1.RUSSIA.toLowerCase()):\n t = fS;\n break;\n case r.includes(D1.RWANDA.toLowerCase()):\n t = gS;\n break;\n case r.includes(D1.SAHRAWI_ARAB_DEMOCRATIC_REPUBLIC.toLowerCase()):\n t = zS;\n break;\n case r.includes(D1.SAINT_KITTS_AND_NEVIS.toLowerCase()):\n t = CS;\n break;\n case r.includes(D1.SAINT_LUCIA.toLowerCase()):\n t = OS;\n break;\n case r.includes(D1.SAMOA.toLowerCase()):\n t = mS;\n break;\n case r.includes(D1.SAN_MARINO.toLowerCase()):\n t = vS;\n break;\n case r.includes(D1.SAO_TOME_AND_PRINCIPE.toLowerCase()):\n t = yS;\n break;\n case r.includes(D1.SAUDI_ARABIA.toLowerCase()):\n t = LS;\n break;\n case r.includes(D1.SENEGAL.toLowerCase()):\n t = wS;\n break;\n case r.includes(D1.SERBIA.toLowerCase()):\n t = qS;\n break;\n case r.includes(D1.SEYCHELLES.toLowerCase()):\n t = xS;\n break;\n case r.includes(D1.SIERRA_LEONE.toLowerCase()):\n t = RS;\n break;\n case r.includes(D1.SINGAPORE.toLowerCase()):\n t = BS;\n break;\n case r.includes(D1.SLOVAKIA.toLowerCase()):\n t = WS;\n break;\n case r.includes(D1.SLOVENIA.toLowerCase()):\n t = ES;\n break;\n case r.includes(D1.SOLOMON_ISLANDS.toLowerCase()):\n t = SS;\n break;\n case r.includes(D1.SOMALIA.toLowerCase()):\n t = kS;\n break;\n case r.includes(D1.SOMALILAND.toLowerCase()):\n t = NS;\n break;\n case r.includes(D1.SOUTH_AFRICA.toLowerCase()):\n t = IS;\n break;\n case r.includes(D1.SOUTH_KOREA.toLowerCase()):\n t = TS;\n break;\n case r.includes(D1.SOUTH_OSSETIA.toLowerCase()):\n t = DS;\n break;\n case r.includes(D1.SOUTH_SUDAN.toLowerCase()):\n t = HS;\n break;\n case r.includes(D1.SPAIN.toLowerCase()):\n t = PS;\n break;\n case r.includes(D1.SRI_LANKA.toLowerCase()):\n t = VS;\n break;\n case r.includes(D1.ST_VINCENT_AND_THE_GRENADINES.toLowerCase()):\n t = FS;\n break;\n case r.includes(D1.SUDAN.toLowerCase()):\n t = US;\n break;\n case r.includes(D1.SURINAME.toLowerCase()):\n t = YS;\n break;\n case r.includes(D1.SWAZILAND.toLowerCase()):\n t = XS;\n break;\n case r.includes(D1.SWEDEN.toLowerCase()):\n t = QS;\n break;\n case r.includes(D1.SWITZERLAND.toLowerCase()):\n t = GS;\n break;\n case r.includes(D1.SYRIA.toLowerCase()):\n t = jS;\n break;\n case r.includes(D1.TAJIKISTAN.toLowerCase()):\n t = KS;\n break;\n case r.includes(D1.TANZANIA.toLowerCase()):\n t = ZS;\n break;\n case r.includes(D1.THAILAND.toLowerCase()):\n t = JS;\n break;\n case r.includes(D1.TOGO.toLowerCase()):\n t = _S;\n break;\n case r.includes(D1.TONGA.toLowerCase()):\n t = $S;\n break;\n case r.includes(D1.TRANSNISTRIA.toLowerCase()):\n t = ek;\n break;\n case r.includes(D1.TRINIDAD_TOBAGO.toLowerCase()):\n t = tk;\n break;\n case r.includes(D1.TUNISIA.toLowerCase()):\n t = rk;\n break;\n case r.includes(D1.TURKEY.toLowerCase()):\n t = nk;\n break;\n case r.includes(D1.TURKMENISTAN.toLowerCase()):\n t = ok;\n break;\n case r.includes(D1.TUVALU.toLowerCase()):\n t = ik;\n break;\n case r.includes(D1.U_S_VIRGIN_ISLANDS.toLowerCase()):\n t = ak;\n break;\n case r.includes(D1.UGANDA.toLowerCase()):\n t = sk;\n break;\n case r.includes(D1.UKRAINE.toLowerCase()):\n t = lk;\n break;\n case r.includes(D1.UNITED_ARAB_EMIRATES.toLowerCase()):\n t = ck;\n break;\n case r.includes(D1.UNITED_KINGDOM.toLowerCase()):\n t = pk;\n break;\n case r.includes(D1.UZBEKISTAN.toLowerCase()):\n t = dk;\n break;\n case r.includes(D1.VATICAN_CITY.toLowerCase()):\n t = Ak;\n break;\n case r.includes(D1.VENEZUELA.toLowerCase()):\n t = uk;\n break;\n case r.includes(D1.VIETNAM.toLowerCase()):\n t = bk;\n break;\n case r.includes(D1.YEMEN.toLowerCase()):\n t = hk;\n break;\n case r.includes(D1.ZAMBIA.toLowerCase()):\n t = Mk;\n break;\n case r.includes(D1.BRITISH_VIRGIN_ISLANDS.toLowerCase()):\n t = fk;\n break;\n case r.includes(D1.CAYMAN_ISLANDS.toLowerCase()):\n t = gk;\n break;\n case r.includes(D1.CURACAO.toLowerCase()):\n t = zk;\n break;\n case r.includes(D1.GUERNSEY.toLowerCase()):\n t = Ck;\n break;\n case r.includes(D1.JERSEY.toLowerCase()):\n t = Ok;\n break;\n case r.includes(D1.ZIMBABWE.toLowerCase()):\n t = mk;\n break;\n default:\n t = xB;\n break;\n }\n return t;\n}, E2 = {\n Countries: [\n {\n CountryName: "United States Of America",\n CountryCode: "US",\n Flag: "FlagUSA"\n },\n {\n CountryName: "Abkhazia",\n CountryCode: "AB",\n Flag: "FlagAB"\n },\n {\n CountryName: "Afghanistan",\n CountryCode: "AF",\n Flag: "FlagAF"\n },\n {\n CountryName: "Albania",\n CountryCode: "ALB",\n Flag: "FlagALB"\n },\n {\n CountryName: "Algeria",\n CountryCode: "ALG",\n Flag: "FlagALG"\n },\n {\n CountryName: "Andorra",\n CountryCode: "AND",\n Flag: "FlagAND"\n },\n {\n CountryName: "Angola",\n CountryCode: "ANG",\n Flag: "FlagANG"\n },\n {\n CountryName: "Antigua & Barbuda",\n CountryCode: "ANB",\n Flag: "FlagANB"\n },\n {\n CountryName: "Argentina",\n CountryCode: "ARG",\n Flag: "FlagARG"\n },\n {\n CountryName: "Armenia",\n CountryCode: "ARM",\n Flag: "FlagARM"\n },\n {\n CountryName: "Australia",\n CountryCode: "AUS",\n Flag: "FlagAUS"\n },\n {\n CountryName: "Austria",\n CountryCode: "AS",\n Flag: "FlagAS"\n },\n {\n CountryName: "Azerbaijan",\n CountryCode: "AZ",\n Flag: "FlagAZ"\n },\n {\n CountryName: "Bahamas",\n CountryCode: "BAM",\n Flag: "FlagBAM"\n },\n {\n CountryName: "Bahrain",\n CountryCode: "BAH",\n Flag: "FlagBAH"\n },\n {\n CountryName: "Bangladesh",\n CountryCode: "BAN",\n Flag: "FlagBAN"\n },\n {\n CountryName: "Barbados",\n CountryCode: "BAR",\n Flag: "FlagBAR"\n },\n {\n CountryName: "Belarus",\n CountryCode: "BER",\n Flag: "FlagBER"\n },\n {\n CountryName: "Belgium",\n CountryCode: "BEL",\n Flag: "FlagBEL"\n },\n {\n CountryName: "Belize",\n CountryCode: "BEZ",\n Flag: "FlagBEZ"\n },\n {\n CountryName: "Benin",\n CountryCode: "BEN",\n Flag: "FlagBEN"\n },\n {\n CountryName: "Bhutan",\n CountryCode: "BHU",\n Flag: "FlagBHU"\n },\n {\n CountryName: "Bolivia",\n CountryCode: "BOL",\n Flag: "FlagBOL"\n },\n {\n CountryName: "Bosnia & Herzegovina",\n CountryCode: "BOS",\n Flag: "FlagBOS"\n },\n {\n CountryName: "Botswana",\n CountryCode: "BOT",\n Flag: "FlagBOT"\n },\n {\n CountryName: "Brazil",\n CountryCode: "BRA",\n Flag: "FlagBRA"\n },\n {\n CountryName: "Brunei",\n CountryCode: "BRU",\n Flag: "FlagBRU"\n },\n {\n CountryName: "Bulgaria",\n CountryCode: "BUL",\n Flag: "FlagBUL"\n },\n {\n CountryName: "Burkina Faso",\n CountryCode: "BUR",\n Flag: "FlagBUR"\n },\n {\n CountryName: "Burundi",\n CountryCode: "BUD",\n Flag: "FlagBUD"\n },\n {\n CountryName: "Cambodia",\n CountryCode: "CAD",\n Flag: "FlagCAD"\n },\n {\n CountryName: "Cameroon",\n CountryCode: "CAM",\n Flag: "FlagCAM"\n },\n {\n CountryName: "Canada",\n CountryCode: "CA",\n Flag: "FlagCA"\n },\n {\n CountryName: "Cape Verde",\n CountryCode: "CV",\n Flag: "FlagCV"\n },\n {\n CountryName: "Central African Republic",\n CountryCode: "CAR",\n Flag: "FlagCAR"\n },\n {\n CountryName: "Chad",\n CountryCode: "CH",\n Flag: "FlagCH"\n },\n {\n CountryName: "Chile",\n CountryCode: "CHE",\n Flag: "FlagCHE"\n },\n {\n CountryName: "China",\n CountryCode: "CHI",\n Flag: "FlagCHI"\n },\n {\n CountryName: "Colombia",\n CountryCode: "COL",\n Flag: "FlagCOL"\n },\n {\n CountryName: "Comoros",\n CountryCode: "COM",\n Flag: "FlagCOM"\n },\n {\n CountryName: "Congo",\n CountryCode: "CON",\n Flag: "FlagCON"\n },\n {\n CountryName: "Cook Islands",\n CountryCode: "CI",\n Flag: "FlagCI"\n },\n {\n CountryName: "Costa Rica",\n CountryCode: "CR",\n Flag: "FlagCR"\n },\n {\n CountryName: "Croatia",\n CountryCode: "CRO",\n Flag: "FlagCRO"\n },\n {\n CountryName: "Cuba",\n CountryCode: "CU",\n Flag: "FlagCU"\n },\n {\n CountryName: "Cyprus",\n CountryCode: "CY",\n Flag: "FlagCY"\n },\n {\n CountryName: "Czech Republic",\n CountryCode: "CZ",\n Flag: "FlagCZ"\n },\n {\n CountryName: "Democratic Republic of the Congo",\n CountryCode: "DRC",\n Flag: "FlagDRC"\n },\n {\n CountryName: "Denmark",\n CountryCode: "DEN",\n Flag: "FlagDEN"\n },\n {\n CountryName: "Djibouti",\n CountryCode: "DJ",\n Flag: "FlagDJ"\n },\n {\n CountryName: "Dominica",\n CountryCode: "DOM",\n Flag: "FlagDOM"\n },\n {\n CountryName: "Dominican Republic",\n CountryCode: "DR",\n Flag: "FlagDR"\n },\n {\n CountryName: "East Timor",\n CountryCode: "ET",\n Flag: "FlagET"\n },\n {\n CountryName: "Ecuador",\n CountryCode: "EC",\n Flag: "FlagEC"\n },\n {\n CountryName: "Egypt",\n CountryCode: "EG",\n Flag: "FlagEG"\n },\n {\n CountryName: "El Salvador",\n CountryCode: "ES",\n Flag: "FlagES"\n },\n {\n CountryName: "Equitorial Guinea",\n CountryCode: "EQG",\n Flag: "FlagEQG"\n },\n {\n CountryName: "Eritrea",\n CountryCode: "ERI",\n Flag: "FlagERI"\n },\n {\n CountryName: "Estonia",\n CountryCode: "EST",\n Flag: "FlagEST"\n },\n {\n CountryName: "Ethiopia",\n CountryCode: "ETH",\n Flag: "FlagETH"\n },\n {\n CountryName: "EU",\n CountryCode: "EU",\n Flag: "FlagEU"\n },\n {\n CountryName: "F.S. Micronesia",\n CountryCode: "FS",\n Flag: "FlagFS"\n },\n {\n CountryName: "Fiji",\n CountryCode: "FI",\n Flag: "FlagFI"\n },\n {\n CountryName: "Finland",\n CountryCode: "FD",\n Flag: "FlagFD"\n },\n {\n CountryName: "France",\n CountryCode: "FR",\n Flag: "FlagFR"\n },\n {\n CountryName: "Gabon",\n CountryCode: "GAB",\n Flag: "FlagGAB"\n },\n {\n CountryName: "Gambia",\n CountryCode: "GAM",\n Flag: "FlagGAM"\n },\n {\n CountryName: "Georgia",\n CountryCode: "GEO",\n Flag: "FlagGEO"\n },\n {\n CountryName: "Germany",\n CountryCode: "GER",\n Flag: "FlagGER"\n },\n {\n CountryName: "Ghana",\n CountryCode: "GH",\n Flag: "FlagGH"\n },\n {\n CountryName: "Greece",\n CountryCode: "GR",\n Flag: "FlagGR"\n },\n {\n CountryName: "Grenada",\n CountryCode: "GRA",\n Flag: "FlagGRA"\n },\n {\n CountryName: "Guatemala",\n CountryCode: "GU",\n Flag: "FlagGU"\n },\n {\n CountryName: "Guinea-Bissau",\n CountryCode: "GB",\n Flag: "FlagGB"\n },\n {\n CountryName: "Guinea",\n CountryCode: "GUI",\n Flag: "FlagGUI"\n },\n {\n CountryName: "Guyana",\n CountryCode: "GUY",\n Flag: "FlagGUY"\n },\n {\n CountryName: "Haiti",\n CountryCode: "HAI",\n Flag: "FlagHAI"\n },\n {\n CountryName: "Honduras",\n CountryCode: "HON",\n Flag: "FlagHON"\n },\n {\n CountryName: "Hong Kong",\n CountryCode: "HK",\n Flag: "FlagHK"\n },\n {\n CountryName: "Hungary",\n CountryCode: "HU",\n Flag: "FlagHU"\n },\n {\n CountryName: "Iceland",\n CountryCode: "IL",\n Flag: "FlagIL"\n },\n {\n CountryName: "India",\n CountryCode: "IND",\n Flag: "FlagIND"\n },\n {\n CountryName: "Indonesia",\n CountryCode: "INA",\n Flag: "FlagINA"\n },\n {\n CountryName: "Iran",\n CountryCode: "IRN",\n Flag: "FlagIRN"\n },\n {\n CountryName: "Iraq",\n CountryCode: "IRQ",\n Flag: "FlagIRQ"\n },\n {\n CountryName: "Ireland",\n CountryCode: "IRE",\n Flag: "FlagIRE"\n },\n {\n CountryName: "Israel",\n CountryCode: "ISR",\n Flag: "FlagISR"\n },\n {\n CountryName: "Italy",\n CountryCode: "IT",\n Flag: "FlagIT"\n },\n {\n CountryName: "Ivory Coast",\n CountryCode: "IC",\n Flag: "FlagIC"\n },\n {\n CountryName: "Jamaica",\n CountryCode: "JAM",\n Flag: "FlagJAM"\n },\n {\n CountryName: "Japan",\n CountryCode: "JAP",\n Flag: "FlagJAP"\n },\n {\n CountryName: "Jordan",\n CountryCode: "JOR",\n Flag: "FlagJOR"\n },\n {\n CountryName: "Kenya",\n CountryCode: "KEN",\n Flag: "FlagKEN"\n },\n {\n CountryName: "Kiribati",\n CountryCode: "KI",\n Flag: "FlagKI"\n },\n {\n CountryName: "Kosovo",\n CountryCode: "KO",\n Flag: "FlagKO"\n },\n {\n CountryName: "Kzakhstan",\n CountryCode: "KZ",\n Flag: "FlagKZ"\n },\n {\n CountryName: "Kuwait",\n CountryCode: "KU",\n Flag: "FlagKU"\n },\n {\n CountryName: "Kyrgyzstan",\n CountryCode: "KY",\n Flag: "FlagKY"\n },\n {\n CountryName: "Laos",\n CountryCode: "LAO",\n Flag: "FlagLAO"\n },\n {\n CountryName: "Latvia",\n CountryCode: "LAT",\n Flag: "FlagLAT"\n },\n {\n CountryName: "Lebanon",\n CountryCode: "LEB",\n Flag: "FlagLEB"\n },\n {\n CountryName: "Lesotho",\n CountryCode: "LES",\n Flag: "FlagLES"\n },\n {\n CountryName: "Liberia",\n CountryCode: "LIB",\n Flag: "FlagLIB"\n },\n {\n CountryName: "Libya",\n CountryCode: "LI",\n Flag: "FlagLI"\n },\n {\n CountryName: "Liechtenstein",\n CountryCode: "LIN",\n Flag: "FlagLIN"\n },\n {\n CountryName: "Lithuania",\n CountryCode: "LIT",\n Flag: "FlagLIT"\n },\n {\n CountryName: "Luxembourg",\n CountryCode: "LUX",\n Flag: "FlagLUX"\n },\n // {\n // CountryName: \'Macau\',\n // CountryCode: \'MA\',\n // Flag: "FlagMA",\n // },\n {\n CountryName: "Macedonia",\n CountryCode: "MAE",\n Flag: "FlagMAE"\n },\n {\n CountryName: "Madagascar",\n CountryCode: "mg",\n Flag: "FlagMG"\n },\n {\n CountryName: "Malawi",\n CountryCode: "MAW",\n Flag: "FlagMAW"\n },\n {\n CountryName: "Malaysia",\n CountryCode: "MAL",\n Flag: "FlagMAL"\n },\n {\n CountryName: "Maldives",\n CountryCode: "MV",\n Flag: "FlagMV"\n },\n {\n CountryName: "Mali",\n CountryCode: "MI",\n Flag: "FlagMI"\n },\n {\n CountryName: "Malta",\n CountryCode: "MT",\n Flag: "FlagMT"\n },\n {\n CountryName: "Marshall Islands",\n CountryCode: "MIS",\n Flag: "FlagMIS"\n },\n {\n CountryName: "Mauritania",\n CountryCode: "MU",\n Flag: "FlagMU"\n },\n {\n CountryName: "Mauritius",\n CountryCode: "MAU",\n Flag: "FlagMAU"\n },\n {\n CountryName: "Mexico",\n CountryCode: "MX",\n Flag: "FlagMX"\n },\n {\n CountryName: "Moldova",\n CountryCode: "MO",\n Flag: "FlagMO"\n },\n {\n CountryName: "Monaco",\n CountryCode: "MON",\n Flag: "FlagMON"\n },\n {\n CountryName: "Mongolia",\n CountryCode: "MGL",\n Flag: "FlagMGL"\n },\n {\n CountryName: "Montenegro",\n CountryCode: "MOG",\n Flag: "FlagMOG"\n },\n {\n CountryName: "Morocco",\n CountryCode: "MOR",\n Flag: "FlagMOR"\n },\n {\n CountryName: "Mozambique",\n CountryCode: "MZ",\n Flag: "FlagMZ"\n },\n {\n CountryName: "Myanmar",\n CountryCode: "MY",\n Flag: "FlagMY"\n },\n {\n CountryName: "Nagorno-Karabakj",\n CountryCode: "NK",\n Flag: "FlagNK"\n },\n {\n CountryName: "Namibia",\n CountryCode: "NM",\n Flag: "FlagNM"\n },\n {\n CountryName: "Nauru",\n CountryCode: "NA",\n Flag: "FlagNA"\n },\n {\n CountryName: "Nepal",\n CountryCode: "NP",\n Flag: "FlagNP"\n },\n {\n CountryName: "Netherlands",\n CountryCode: "NL",\n Flag: "FlagNL"\n },\n {\n CountryName: "New Zealand",\n CountryCode: "NZ",\n Flag: "FlagNZ"\n },\n {\n CountryName: "Nicaragua",\n CountryCode: "NIC",\n Flag: "FlagNIC"\n },\n {\n CountryName: "Niger",\n CountryCode: "NIG",\n Flag: "FlagNIG"\n },\n {\n CountryName: "Nigeria",\n CountryCode: "NGA",\n Flag: "FlagNGA"\n },\n {\n CountryName: "Niue",\n CountryCode: "NI",\n Flag: "FlagNI"\n },\n {\n CountryName: "North Korea",\n CountryCode: "NKO",\n Flag: "FlagNKO"\n },\n {\n CountryName: "Northern Cyprus",\n CountryCode: "NC",\n Flag: "FlagNC"\n },\n {\n CountryName: "Norway",\n CountryCode: "NY",\n Flag: "FlagNY"\n },\n {\n CountryName: "Orman",\n CountryCode: "OR",\n Flag: "FlagOR"\n },\n {\n CountryName: "Pakistan",\n CountryCode: "PK",\n Flag: "FlagPK"\n },\n {\n CountryName: "Palau",\n CountryCode: "PA",\n Flag: "FlagPA"\n },\n {\n CountryName: "Palestine",\n CountryCode: "PAL",\n Flag: "FlagPAL"\n },\n {\n CountryName: "Papa New Guinea",\n CountryCode: "PNG",\n Flag: "FlagPNG"\n },\n {\n CountryName: "Paraguay",\n CountryCode: "PAR",\n Flag: "FlagPAR"\n },\n {\n CountryName: "Peru",\n CountryCode: "PE",\n Flag: "FlagPE"\n },\n {\n CountryName: "Phillippines",\n CountryCode: "PH",\n Flag: "FlagPH"\n },\n {\n CountryName: "Poland",\n CountryCode: "PL",\n Flag: "FlagPL"\n },\n {\n CountryName: "Portugal",\n CountryCode: "POR",\n Flag: "FlagPOR"\n },\n {\n CountryName: "Puerto Rica",\n CountryCode: "PR",\n Flag: "FlagPR"\n },\n {\n CountryName: "Qatar",\n CountryCode: "QT",\n Flag: "FlagQT"\n },\n {\n CountryName: "Republic of China",\n CountryCode: "RC",\n Flag: "FlagRC"\n },\n {\n CountryName: "Romania",\n CountryCode: "RO",\n Flag: "FlagRO"\n },\n {\n CountryName: "Russia",\n CountryCode: "RU",\n Flag: "FlagRU"\n },\n {\n CountryName: "Rwanda",\n CountryCode: "RW",\n Flag: "FlagRW"\n },\n {\n CountryName: "Sahrawi Arab Democratic Republic",\n CountryCode: "SA",\n Flag: "FlagSA"\n },\n {\n CountryName: "Saint Kitts and Nevis",\n CountryCode: "SK",\n Flag: "FlagSK"\n },\n {\n CountryName: "Saint Lucia",\n CountryCode: "SL",\n Flag: "FlagSL"\n },\n {\n CountryName: "Samoa",\n CountryCode: "SAM",\n Flag: "FlagSAM"\n },\n {\n CountryName: "San Marino",\n CountryCode: "SM",\n Flag: "FlagSM"\n },\n {\n CountryName: "Sao Tome and Principe",\n CountryCode: "STP",\n Flag: "FlagSTP"\n },\n {\n CountryName: "Saudi Arabia",\n CountryCode: "SAU",\n Flag: "FlagSAU"\n },\n {\n CountryName: "Senegal",\n CountryCode: "SEN",\n Flag: "FlagSEN"\n },\n {\n CountryName: "Serbia",\n CountryCode: "SER",\n Flag: "FlagSER"\n },\n {\n CountryName: "Seychelles",\n CountryCode: "SY",\n Flag: "FlagSY"\n },\n {\n CountryName: "Sierra Leone",\n CountryCode: "SLE",\n Flag: "FlagSLE"\n },\n {\n CountryName: "Singapore",\n CountryCode: "SGP",\n Flag: "FlagSGP"\n },\n {\n CountryName: "Slovakia",\n CountryCode: "SLO",\n Flag: "FlagSLO"\n },\n {\n CountryName: "Slovenia",\n CountryCode: "SLV",\n Flag: "FlagSLV"\n },\n {\n CountryName: "Solomon Islands",\n CountryCode: "SI",\n Flag: "FlagSI"\n },\n {\n CountryName: "Somalia",\n CountryCode: "SOM",\n Flag: "FlagSOM"\n },\n {\n CountryName: "Somaliland",\n CountryCode: "SMD",\n Flag: "FlagSMD"\n },\n {\n CountryName: "South Africa",\n CountryCode: "SAF",\n Flag: "FlagSAF"\n },\n {\n CountryName: "South Korea",\n CountryCode: "SKO",\n Flag: "FlagSKO"\n },\n {\n CountryName: "South Ossetia",\n CountryCode: "SO",\n Flag: "FlagSO"\n },\n {\n CountryName: "South Sudan",\n CountryCode: "SS",\n Flag: "FlagSS"\n },\n {\n CountryName: "Spain",\n CountryCode: "SP",\n Flag: "FlagSP"\n },\n {\n CountryName: "Sri Lanka",\n CountryCode: "SLA",\n Flag: "FlagSLA"\n },\n {\n CountryName: "St. Vincent and the Grenadines",\n CountryCode: "SV",\n Flag: "FlagSV"\n },\n {\n CountryName: "Sudan",\n CountryCode: "SUD",\n Flag: "FlagSUD"\n },\n {\n CountryName: "Suriname",\n CountryCode: "SU",\n Flag: "FlagSU"\n },\n {\n CountryName: "Swaziland",\n CountryCode: "SWA",\n Flag: "FlagSWA"\n },\n {\n CountryName: "Sweden",\n CountryCode: "SWD",\n Flag: "FlagSWD"\n },\n {\n CountryName: "Switzerland",\n CountryCode: "SW",\n Flag: "FlagSW"\n },\n {\n CountryName: "Syria",\n CountryCode: "SYR",\n Flag: "FlagSYR"\n },\n {\n CountryName: "Tajikistan",\n CountryCode: "TAJ",\n Flag: "FlagTAJ"\n },\n {\n CountryName: "Tanzania",\n CountryCode: "TA",\n Flag: "FlagTA"\n },\n {\n CountryName: "Thailand",\n CountryCode: "TH",\n Flag: "FlagTH"\n },\n {\n CountryName: "Togo",\n CountryCode: "TOG",\n Flag: "FlagTOG"\n },\n {\n CountryName: "Tonga",\n CountryCode: "TO",\n Flag: "FlagTO"\n },\n {\n CountryName: "Transnistria",\n CountryCode: "TR",\n Flag: "FlagTR"\n },\n {\n CountryName: "Trinidad & Tobago",\n CountryCode: "TT",\n Flag: "FlagTT"\n },\n {\n CountryName: "Tunisia",\n CountryCode: "TUN",\n Flag: "FlagTUN"\n },\n {\n CountryName: "Turkey",\n CountryCode: "TUR",\n Flag: "FlagTUR"\n },\n {\n CountryName: "Turkmenistan",\n CountryCode: "TK",\n Flag: "FlagTK"\n },\n {\n CountryName: "Tuvalu",\n CountryCode: "TU",\n Flag: "FlagTU"\n },\n {\n CountryName: "U.S. Virgin Islands",\n CountryCode: "VI",\n Flag: "FlagVI"\n },\n {\n CountryName: "Uganda",\n CountryCode: "UG",\n Flag: "FlagUG"\n },\n {\n CountryName: "Ukraine",\n CountryCode: "UKR",\n Flag: "FlagUKR"\n },\n {\n CountryName: "United Arab Emirates",\n CountryCode: "AE",\n Flag: "FlagAE"\n },\n {\n CountryName: "United Kingdom",\n CountryCode: "UK",\n Flag: "FlagUK"\n },\n {\n CountryName: "Uzbekistan",\n CountryCode: "UZ",\n Flag: "FlagUZ"\n },\n {\n CountryName: "Vatican City",\n CountryCode: "VC",\n Flag: "FlagVC"\n },\n {\n CountryName: "Venezuela",\n CountryCode: "VN",\n Flag: "FlagVN"\n },\n {\n CountryName: "Vietnam",\n CountryCode: "VT",\n Flag: "FlagVT"\n },\n {\n CountryName: "Yemen",\n CountryCode: "YM",\n Flag: "FlagYM"\n },\n {\n CountryName: "Zambia",\n CountryCode: "ZA",\n Flag: "FlagZA"\n },\n {\n CountryName: "British Virgin Islands",\n CountryCode: "BV",\n Flag: "FlagBV"\n },\n {\n CountryName: "Cayman Islands",\n CountryCode: "CAY",\n Flag: "FlagCAY"\n },\n {\n CountryName: "Curacao",\n CountryCode: "CUR",\n Flag: "FlagCUR"\n },\n {\n CountryName: "Guernsey",\n CountryCode: "GUE",\n Flag: "FlagGUE"\n },\n {\n CountryName: "Jersey",\n CountryCode: "JE",\n Flag: "FlagJE"\n },\n {\n CountryName: "Zimbabwe",\n CountryCode: "ZM",\n Flag: "FlagZM"\n },\n {\n CountryName: "Madagascar",\n CountryCode: "MG",\n Flag: "FlagMG"\n }\n ]\n};\nfunction Cl(e) {\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("");\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var n;\n (n = E2.Countries) == null || n.map((o) => {\n (e.name == o.Flag || e.name == o.CountryName) && r(o.CountryCode.toLowerCase());\n });\n }, [e.name]), t && /* @__PURE__ */ c1(\n Kf,\n {\n className: "icon-flag",\n ...e,\n hideClassName: e.hideClassName,\n children: [\n /* @__PURE__ */ A(\n qB,\n {\n src: `${vk({\n classes: () => [t]\n })}`,\n alt: t\n }\n ),\n e.hideClassName != null && !e.hideClassName && /* @__PURE__ */ A(wB, { children: t })\n ]\n },\n e.name\n );\n}\nfunction yk(e, t) {\n const {\n disabled: r,\n iconLeft: n,\n iconRight: o,\n iconSize: i = "xxs",\n onIconLeftClick: a,\n onIconRightClick: s,\n colorIconLeft: l = "#000",\n colorIconRight: c = "#000",\n ...p\n } = e, [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n n != null && n.includes("Flag") && u(n), o != null && o.includes("Flag") && b(n);\n }, [n, o]), /* @__PURE__ */ c1(\n yB,\n {\n isError: e.isError,\n className: "input-wrapper",\n $isTableInput: e == null ? void 0 : e.isTableInput,\n children: [\n /* @__PURE__ */ A(\n LB,\n {\n ...p,\n ref: t,\n disabled: r,\n iconLeft: n,\n iconRight: o,\n $isError: e.isError,\n $isReadOnly: e.isReadOnly\n }\n ),\n !!n && /* @__PURE__ */ A(zl, { onClick: a, isDisabled: r, children: n.includes("Flag") ? /* @__PURE__ */ A(Cl, { "data-position": "left", name: d, size: i }) : /* @__PURE__ */ A(\n f0,\n {\n "data-position": "left",\n name: n,\n size: i,\n color: l\n }\n ) }),\n !!o && /* @__PURE__ */ A(zl, { onClick: s, isDisabled: r, children: o.includes("Flag") ? /* @__PURE__ */ A(Cl, { "data-position": "right", name: h, size: i }) : /* @__PURE__ */ A(\n f0,\n {\n "data-position": "right",\n name: o,\n size: i,\n color: c\n }\n ) })\n ]\n }\n );\n}\nconst Lk = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(yk), wk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div((e) => {\n const { colors: t, fontFamily: r, typography: n, fontWeight: o, lineHeight: i } = e.theme;\n let a = t.textIcon.textPrimary, s = r.base, l = n.t28, c = "normal", p = i.lh36, d = o.medium, u = "16.8px", h = "12.6px";\n switch (e != null && e.color && (a = e.color), e == null ? void 0 : e.variant) {\n case "display-lg":\n l = n.t28, p = i.lh39, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-lg-medium":\n l = n.t20, p = i.lh28, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-lg-regular":\n l = n.t20, p = i.lh28, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-md":\n l = n.t18, p = i.lh25, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-sm":\n l = n.t16, p = i.lh25, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-xs-medium":\n l = n.t14, p = i.lh19, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "heading-xs-regular":\n l = n.t14, p = i.lh19, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-lg-regular":\n l = n.t14, p = i.lh19, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-lg-light":\n l = n.t14, p = i.lh19, d = o.light, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-sm-bold":\n l = n.t12, p = u, d = o.bold, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-sm-medium":\n l = n.t12, p = u, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-sm-regular":\n l = n.t12, p = u, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "body-sm-light":\n l = n.t12, p = u, d = o.light, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-lg-regular":\n l = n.t12, p = u, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-lg-light":\n l = n.t12, p = u, d = o.light, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-sm":\n l = n.t10, p = i.lh14, d = o.medium, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-sm-regular":\n l = n.t10, p = i.lh14, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-sm-light":\n l = n.t10, p = i.lh14, d = o.light, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-xs-regular":\n l = n.t9, p = h, d = o.regular, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n case "label-xs-light":\n l = n.t9, p = h, d = o.light, e != null && e.fontWeight && (d = o[e.fontWeight]), e != null && e.fontFamily && (s = r[e.fontFamily]);\n break;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: 0px;\n color: ${a};\n font-family: ${s};\n font-size: ${l};\n font-style: ${c};\n font-weight: ${d};\n line-height: ${p};\n ${e != null && e.$whiteSpace ? `white-space:${e == null ? void 0 : e.$whiteSpace}` : ""}\n `;\n}), l4 = ({ children: e, ...t }) => {\n let r = "p";\n if (t != null && t.element)\n r = t == null ? void 0 : t.element;\n else if (t != null && t.variant)\n switch (t == null ? void 0 : t.variant) {\n case "display-lg":\n r = "h1";\n break;\n case "heading-lg-medium":\n r = "h2";\n break;\n case "heading-lg-regular":\n r = "h2";\n break;\n case "heading-md":\n r = "h3";\n break;\n case "heading-sm":\n r = "h3";\n break;\n case "heading-xs-medium":\n r = "h4";\n break;\n case "heading-xs-regular":\n r = "h4";\n break;\n case "body-lg-regular":\n r = "p";\n break;\n case "body-lg-light":\n r = "p";\n break;\n case "body-sm-bold":\n r = "p";\n break;\n case "body-sm-medium":\n r = "p";\n break;\n case "body-sm-regular":\n r = "p";\n break;\n case "body-sm-light":\n r = "p";\n break;\n case "label-lg-regular":\n r = "label";\n break;\n case "label-lg-light":\n r = "label";\n break;\n case "label-sm":\n r = "label";\n break;\n case "label-sm-regular":\n r = "label";\n break;\n case "label-sm-light":\n r = "label";\n break;\n case "label-xs-regular":\n r = t != null && t.element ? t == null ? void 0 : t.element : "label";\n break;\n case "label-xs-light":\n r = t != null && t.element ? t == null ? void 0 : t.element : "label";\n break;\n }\n return /* @__PURE__ */ A(wk, { as: r, ...t, children: e });\n}, oA = 4;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 400px;\n`;\nconst Q3 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.textIcon.textSecondary};\n `), qk = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(l4)`\n ${({ theme: e, isError: t, isDisabled: r }) => {\n const { colors: n, lineHeight: o, fontWeight: i } = e;\n let a = n.textIcon.textLowemphasis;\n return r ? a = n.pinkSwan : t && (a = n.error), (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n vertical-align: top;\n line-height: ${o.lh20};\n color: ${a};\n font-size: 9px;\n font-weight: ${i.regular};\n `;\n}}\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e, isDisabled: t, isError: r }) => {\n const { colors: n, typography: o, lineHeight: i } = e;\n let a = n.grey;\n return t ? a = n.pinkSwan : r && (a = n.error), (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n vertical-align: top;\n margin: 4px 0 0;\n font-size: ${o.t12};\n line-height: ${i.lh20};\n color: ${a};\n `;\n }\n);\nconst s8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(l4)`\n ${({ theme: e, isError: t, isDisabled: r }) => {\n const { colors: n } = e;\n let o = n.textIcon.textPrimary;\n return r ? o = n.textIcon.textDisabledOnbg : t && (o = n.textIcon.textError), (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n vertical-align: top;\n margin-bottom: 5px;\n color: ${o};\n ${(i) => i.$active && !t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${o};\n `}\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Q3} {\n color: ${n.textIcon.textDisabledOnbg};\n }\n `}\n &:focus-visible {\n outline: none;\n }\n\n ${t && !r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Q3} {\n color: ${n.textIcon.textError};\n }\n `}\n `;\n}}\n`, c4 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)`\n color: ${({ theme: e }) => e.colors.pinkSwan};\n margin-left: ${({ theme: e }) => e.spacings.sp4};\n`, G3 = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(qk)`\n margin-left: 10px;\n`, xk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().textarea.attrs(() => ({\n as: "textarea"\n}))(({ theme: e, isError: t, isReadOnly: r, required: n, $hasValue: o }) => {\n const {\n colors: i,\n borderRadius: a,\n typography: s,\n transitions: l,\n fontFamily: c,\n fontWeight: p,\n spacings: d\n } = e;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-top: 12.96px;\n padding-bottom: 12.96px;\n width: 100%;\n resize: vertical;\n min-height: 90px;\n border-radius: ${a.base};\n background: ${i.field.fieldBgDefault};\n padding: ${d.sp8};\n color: ${t ? i.textIcon.textError : i.textIcon.textPrimary};\n border: 1px solid\n ${t ? i.textIcon.textError : i.field.fieldBgDefault};\n transition: ${l.base};\n font-family: ${c.base};\n font-size: ${s.t12};\n font-weight: ${p.light};\n outline: none;\n box-sizing: border-box;\n border-left: 2px solid\n ${n && !t ? i.border.borderSecondary : n && t ? i.border.borderError : "none"};\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border: 1px solid ${i.border.borderTertiary};\n pointer-events: none;\n background-color: ${i.backgrounds.bgPrimary} !important;\n color: ${i.grey};\n `}\n\n &:hover:not(:disabled):not(:focus) {\n /* border-color: ${!t && i.pinkSwan}; */\n background-color: ${i.field.fieldBgHover};\n }\n\n ${!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:focus {\n border-color: ${i.border.borderSecondary};\n color: ${i.textIcon.textHighemphasis};\n &:hover {\n /* background-color: ${i.field.fieldBgHover}; */\n border: 1px solid\n ${t ? i.border.borderError : i.field.fieldBorderActive};\n border-left: 2px solid\n ${n && !t ? i.field.fieldBorderActive : n && t ? i.border.borderError : "none"};\n }\n }\n `}\n\n &:disabled {\n border-color: transparent;\n // new disabled color\n background-color: ${i.backgrounds.bgDisabledPrimary};\n color: ${i.textIcon.textDisabledOnbg};\n //\n\n border-left: 2px solid\n ${n ? i.border.borderReadonly : "transparent"};\n font-weight: ${p.light};\n\n &,\n &::placeholder {\n color: ${i.textIcon.textDisabledOnbg};\n }\n }\n\n &::placeholder {\n color: ${i.field.fieldTextPlaceholder};\n font-size: ${s.t12};\n font-weight: ${p.regular};\n }\n\n &:active {\n border: 1px solid\n ${t ? i.border.borderError : i.field.fieldBorderActive};\n border-left: 2px solid\n ${n && !t ? i.backgrounds.bgReadOnly : n && t ? i.border.borderError : "none"};\n }\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border-color: ${i.field.fieldBorderActive};\n `}\n /* Styles for the scrollbar */\n &::-webkit-scrollbar {\n height: ${oA}px;\n width: ${oA}px;\n }\n &::-webkit-scrollbar-track {\n background-color: ${(u) => u.theme.colors.scroll.scrollBgPrimary};\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: ${(u) => u.theme.colors.scroll.scrollBgDefault};\n\n border-radius: ${(u) => u.theme.borderRadius.xl};\n }\n /* Handle on hover */\n &::-webkit-scrollbar-thumb:hover {\n background-color: ${(u) => u.theme.colors.scroll.scrollBgHover};\n }\n &::-webkit-scrollbar-thumb:active {\n background-color: ${(u) => u.theme.colors.scroll.scrollBgPressed};\n }\n\n &:focus-visible {\n outline: 1px solid ${(u) => u.theme.colors.border.borderSecondary} !important;\n }\n `;\n}), Rk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ $Optinal: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n\n ${!e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n gap: 8px;\n `}\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n gap: 20px;\n `}\n `\n), Bk = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n flex-basis: 70%;\n`, Wk = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: relative;\n`, Ek = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(({ theme: e, isError: t, isDisabled: r }) => {\n const { colors: n, typography: o } = e;\n let i = n.black;\n return r ? i = n.grey : t && (i = n.black), (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n top: 10px;\n left: 10px;\n pointer-events: none;\n transition: 0.3s;\n display: inline-block;\n vertical-align: top;\n font-size: ${o.t10};\n color: ${i};\n padding: 0 5px;\n ${(a) => a.floating && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n top: -8px;\n left: 10px;\n padding: 2px 5px;\n &::after {\n content: \'\';\n width: 100%;\n display: block;\n background-color: #fff;\n height: 14px;\n margin-top: -17px;\n }\n `}\n ${(a) => a.$active && !t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${n.textIcon.textSecondary};\n `}\n `;\n});\nfunction Sk(e, t) {\n const {\n label: r,\n id: n,\n iconLeft: o,\n iconRight: i,\n multiLine: a,\n isDisabled: s,\n isRequired: l,\n supportText: c,\n iconSize: p,\n labelType: d,\n handleClearFn: u,\n onIconRightClick: h,\n ...b\n } = e, M = {\n disabled: s,\n ref: t,\n id: n,\n ...b\n }, [C, g] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [f, O] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [m, v] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), y = (x) => {\n g(!0), O(!0), b.onFocus && b.onFocus(x);\n }, z = (x) => {\n g(x.target.value !== ""), O(!1), b.onBlur && b.onBlur(x);\n }, N = (x) => {\n v(x.target.value !== ""), b.onChange && b.onChange(x);\n }, W = () => {\n u && u(), g(!1), v(!1);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n e.value ? g(!0) : g(!1);\n }, [e.value]);\n const T = () => {\n switch (!0) {\n case (!!o || !!i):\n return /* @__PURE__ */ A(\n Lk,\n {\n ...M,\n iconLeft: o,\n iconRight: i,\n iconSize: p,\n required: l,\n $inputId: r,\n onFocus: y,\n onBlur: z,\n onChange: N,\n $hasValue: m,\n disabled: s,\n handleClearFn: W,\n placeholder: d === "inside" ? "" : e.placeholder,\n onIconRightClick: h\n }\n );\n case a:\n return /* @__PURE__ */ A(\n xk,\n {\n required: l,\n onFocus: y,\n onBlur: z,\n onChange: N,\n $hasValue: m,\n ...M\n }\n );\n default:\n return /* @__PURE__ */ A(\n Gf,\n {\n required: l,\n $inputId: r,\n ...M,\n onFocus: y,\n onBlur: z,\n onChange: N,\n $hasValue: m,\n disabled: s,\n handleClearFn: W,\n placeholder: d === "inside" ? "" : e.placeholder\n }\n );\n }\n };\n return /* @__PURE__ */ A(S0, { children: d === "horizontal" ? /* @__PURE__ */ c1(Rk, { $Optinal: l, children: [\n r && r.length > 0 && !(M != null && M.isTableInput) && /* @__PURE__ */ c1(\n s8,\n {\n variant: "label-sm-regular",\n htmlFor: r,\n isDisabled: s,\n isError: M.isError,\n className: "input__label",\n tabIndex: -1,\n $active: f,\n element: "label",\n children: [\n r,\n " ",\n l && r && r.length > 0 && /* @__PURE__ */ A(Q3, { children: "*" }),\n !l && r && r.length > 0 && /* @__PURE__ */ A(c4, { children: "Optional" })\n ]\n }\n ),\n /* @__PURE__ */ c1(Bk, { children: [\n T(),\n !!c && !(M != null && M.isTableInput) && /* @__PURE__ */ A(\n G3,\n {\n isDisabled: s,\n isError: M.isError,\n className: "supportText",\n variant: "label-sm-regular",\n element: "span",\n children: c\n }\n )\n ] })\n ] }) : d === "inside" ? /* @__PURE__ */ c1(Wk, { children: [\n T(),\n /* @__PURE__ */ c1(\n Ek,\n {\n floating: C.toString() === "true",\n htmlFor: r,\n isDisabled: s,\n isError: M.isError,\n $active: f,\n children: [\n r,\n " ",\n l && r && r.length > 0 && /* @__PURE__ */ A(Q3, { children: "*" })\n ]\n }\n ),\n !!c && !(M != null && M.isTableInput) && /* @__PURE__ */ A(\n G3,\n {\n isDisabled: s,\n isError: M.isError,\n className: "supportText",\n variant: "label-sm-regular",\n element: "span",\n children: c\n }\n )\n ] }) : /* @__PURE__ */ c1(S0, { children: [\n r && r.length > 0 && !(M != null && M.isTableInput) && /* @__PURE__ */ c1(\n s8,\n {\n variant: "label-sm-regular",\n element: "label",\n htmlFor: r,\n isDisabled: s,\n isError: M.isError,\n className: "input__label 1",\n tabIndex: -1,\n $active: f,\n children: [\n r,\n " ",\n l && /* @__PURE__ */ A(Q3, { children: "*" }),\n !l && /* @__PURE__ */ A(c4, { children: "Optional" })\n ]\n }\n ),\n T(),\n !!c && !(M != null && M.isTableInput) && /* @__PURE__ */ A(\n G3,\n {\n isDisabled: s,\n isError: M.isError,\n className: "supportText",\n variant: "label-sm-regular",\n element: "span",\n children: c\n }\n )\n ] }) });\n}\nconst L2 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(Sk);\nfunction kk(e, t) {\n const { limit: r = 50, isError: n, supportText: o, value: i, ...a } = e, [s, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i || l(0);\n }, [i]);\n const c = (u) => {\n const h = u.currentTarget.value;\n l(h.length);\n }, p = s > r;\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n L2,\n {\n ref: t,\n value: i,\n isError: p || n,\n limit: r,\n supportText: p ? "You used too many characters" : o,\n onKeyUp: c,\n ...a\n }\n ) });\n}\nconst Nk = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(kk);\nfunction l8(e) {\n const { limit: t } = e;\n return t ? /* @__PURE__ */ A(Nk, { isRequired: !0, ...e }) : /* @__PURE__ */ A(L2, { isRequired: !0, ...e });\n}\nvar On = /* @__PURE__ */ ((e) => (e.PRIMARY = "primary", e.SECONDARY = "secondary", e.TERTIARY = "tertiary", e.LINK = "link", e.MINI = "mini", e))(On || {}), k7 = /* @__PURE__ */ ((e) => (e.SMALL = "sm", e.LARGE = "lg", e))(k7 || {});\nconst tt = (e, t = 1) => `0 0 0 ${t}px ${e} inset`, In = styled_components__WEBPACK_IMPORTED_MODULE_1___default().button(\n ({ theme: e, size: t }) => {\n const {\n lineHeight: r,\n fontWeight: n,\n typography: o,\n colors: i,\n transitions: a,\n borderRadius: s,\n mixins: l,\n itemSize: c\n } = e, p = t === k7.SMALL;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${l.buttonReset};\n\n background-color: ${i.buttonBackgound.buttonBgPrimaryDefault};\n border-radius: ${s.base};\n padding: 0 ${p ? 0.625 : 0.75}rem;\n line-height: ${p ? r.lh32 : r.lh40};\n font-weight: ${n.regular};\n font-size: ${o.t12};\n color: ${i.buttonText.buttonTextPrimary};\n box-shadow: ${tt(i.buttonBackgound.buttonBgPrimaryDefault)};\n min-width: ${p ? c.md : c.lg};\n\n &:not(:disabled) {\n &:hover {\n background-color: ${i.buttonBackgound.buttonBgPrimaryHover};\n box-shadow: ${tt(i.buttonBackgound.buttonBgPrimaryHover)};\n transition: ${a.base};\n color: ${i.buttonText.buttonTextPrimary};\n }\n\n &:focus-visible {\n background-color: ${i.buttonBackgound.buttonBgPrimaryHover};\n box-shadow: ${tt(i.border.borderFocused, 2)};\n transition: ${a.base};\n color: ${i.buttonText.buttonTextPrimary};\n }\n\n &:active {\n background-color: ${i.buttonBackgound.buttonBgPrimaryPressed};\n box-shadow: ${tt(i.buttonBackgound.buttonBgPrimaryPressed)};\n transition: ${a.base};\n color: ${i.buttonText.buttonTextPrimaryPressed};\n }\n }\n\n &[aria-disabled=\'true\'] {\n background-color: ${i.backgrounds.bgDisabledPrimary};\n box-shadow: ${tt(i.backgrounds.bgDisabledPrimary)};\n color: ${i.textIcon.textDisabledOnbg};\n cursor: default;\n pointer-events: none;\n }\n `;\n }\n), N7 = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(In)(\n ({ theme: { colors: e, fontWeight: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.buttonBackgound.buttonBgSecondaryDefault};\n color: ${e.buttonText.buttonTextSecondaryDefault};\n font-weight: ${t.regular};\n box-shadow: ${tt(e.buttonBorder.buttonBorderSecondaryDefault)};\n\n &:hover {\n background-color: ${e.buttonBackgound.buttonBgSecondaryHover} ;\n box-shadow: ${tt(e.buttonBackgound.buttonBgSecondaryHover)} ;\n }\n\n &:active {\n background-color: ${e.buttonBackgound.buttonBgSecondaryPressed} ;\n }\n\n &:focus-visible{\n background-color: ${e.buttonBackgound.buttonBgSecondaryHover} ;\n color: ${e.buttonText.buttonTextSecondaryFocused} ;\n }\n\n &[aria-disabled=\'true\'] {\n background-color: ${e.buttonBackgound.buttonBgSecondaryDefault};\n box-shadow: ${tt(e.backgrounds.bgDisabledPrimary)} ;\n cursor: default;\n color: ${e.textIcon.textDisabledOnbg};\n pointer-events: none;\n }\n `\n), Zf = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(In)(\n ({ theme: { colors: e, fontWeight: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.buttonBackgound.buttonBgTertiary};\n color: ${e.buttonText.buttonTextTertiary};\n box-shadow: ${tt(e.buttonBorder.buttonBorderTertiaryDefault)};\n font-weight: ${t.regular};\n\n &:not(:disabled) {\n &:hover {\n background-color: ${e.buttonBackgound.buttonBgTertiary};\n box-shadow: ${tt(e.buttonBorder.buttonBorderTertiaryHover)};\n color: ${e.buttonText.buttonTextTertiary};\n }\n\n &:focus-visible {\n background-color: ${e.buttonBackgound.buttonBgTertiary};\n box-shadow: ${tt(e.border.borderFocused, 2)};\n color: ${e.buttonText.buttonTextTertiary};\n }\n\n &:active {\n background-color: ${e.buttonBackgound.buttonBgTertiary};\n box-shadow: ${tt(e.buttonBorder.buttonBorderTertiaryPressed)};\n color: ${e.buttonText.buttonTextTertiary};\n }\n }\n\n &[aria-disabled=\'true\'] {\n background-color: ${e.buttonBackgound.buttonBgTertiary};\n cursor: default;\n color: ${e.textIcon.textDisabledNobg};\n box-shadow: ${tt(e.border.borderTertiary)};\n pointer-events: none;\n }\n `\n), Ik = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(In)(\n ({ theme: { colors: e, fontWeight: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: transparent;\n color: ${e.buttonText.buttonTextlinkDefault};\n font-weight: ${t.regular};\n box-shadow: none;\n\n &:not(:disabled) {\n &:hover {\n background-color: ${e.buttonBackgound.buttonBgTextlinkHover};\n box-shadow: none;\n color: ${e.buttonText.buttonTextlinkHover};\n }\n\n &:focus-visible{\n background-color: transparent;\n box-shadow: ${tt(e.border.borderFocused, 2)};\n color: ${e.buttonText.buttonTextlinkHover};\n }\n\n &:active {\n background-color: transparent;\n box-shadow: none;\n color: ${e.buttonText.buttonTextlinkPressed};\n }\n }\n\n &[aria-disabled=\'true\'] {\n background-color: transparent;\n box-shadow: none;\n color: ${e.textIcon.textDisabledNobg};\n pointer-events: none;\n }\n `\n);\nfunction Tt(e) {\n const {\n buttonType: t = On.PRIMARY,\n isDisabled: r,\n ...n\n } = e, o = { ...n };\n switch (t) {\n case On.SECONDARY:\n return /* @__PURE__ */ A(N7, { "aria-disabled": r, ...o, children: e.children });\n case On.TERTIARY:\n return /* @__PURE__ */ A(Zf, { "aria-disabled": r, ...o, children: e.children });\n case On.LINK:\n return /* @__PURE__ */ A(Ik, { "aria-disabled": r, ...o, children: e.children });\n default:\n return /* @__PURE__ */ A(In, { "aria-disabled": r, ...o, children: e.children });\n }\n}\nconst a2 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, orientation: t, $hasMargin: r, $default: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${t === "vertical" ? "1px" : "100%"};\n height: ${t === "vertical" ? "100%" : "1px"};\n background-color: ${n ? e.colors.border.borderTertiary : e.colors.LavenderMist};\n margin: ${r && t === "vertical" ? "1px 4px" : r && t === "horizontal" ? "4px 1px" : "0"};\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ orientation: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${e === "horizontal" ? "400px" : "0"};\n height: 300px;\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n`;\nfunction Jf({\n children: e,\n container: t = window.document.body\n}) {\n return (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.createPortal)(e, t);\n}\nconst Tk = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: relative;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgTertiary};\n border-radius: 4px;\n `\n);\nconst I7 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n $isOpenedUp: e,\n theme: {\n borderRadius: t,\n colors: r,\n cubicBezier: n,\n typography: o,\n lineHeight: i,\n GLOBAL_ITEM_HEIGHT_CONDENSED: a,\n GLOBAL_ITEM_HEIGHT: s,\n spacings: l,\n animations: c\n },\n width: p = "100%",\n coords: d,\n $bodyPadding: u\n }) => {\n const { innerWidth: h, innerHeight: b } = window, M = e ? (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n bottom: ${d ? `${b + 20 - d.bottom}px` : "100%"};\n margin-bottom: ${l.sp8};\n ` : (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n top: ${d ? `${Number(d.top + d.height)}px` : "100%"};\n margin-top: ${l.sp4};\n `;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n min-height: ${a};\n min-width: 50px;\n width: ${p};\n max-width: ${p};\n box-sizing: border-box;\n padding: ${u || l.sp8};\n background: ${r.backgrounds.bgPrimary};\n border-radius: ${t.base};\n animation-duration: 0.3s;\n animation-timing-function: ${n};\n animation-fill-mode: forwards;\n animation-name: ${c.fadeIn};\n font-size: ${o.t14};\n line-height: ${i.lh22};\n border: 1px solid ${r.border.borderTertiary};\n z-index: 11;\n\n li > div > label > span {\n width: ${p};\n display: inline-block !important;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n li > span {\n width: ${p};\n display: inline-block !important;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n ${M};\n\n &.align-center {\n left: ${d ? `${d.left + d.width / 2}px` : "50%"};\n margin-left: -${Number(parseFloat(p)) / 2}px;\n }\n\n &.align-right {\n right: ${d ? h - d.left - d.width : 0}px;\n }\n\n &.align-left {\n left: ${d ? d.left : 0}px;\n }\n\n .scrollbar-container {\n max-height: ${Number(parseFloat(s)) * 6}rem;\n }\n\n .ps--active-y {\n margin-right: -${l.sp8};\n }\n `;\n }\n), Dk = typeof window < "u" ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect;\nfunction Hk(e, t, r) {\n const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(t);\n Dk(() => {\n n.current = t;\n }, [t]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const o = (r == null ? void 0 : r.current) || window;\n if (!(o && o.addEventListener))\n return;\n const i = (a) => n.current(a);\n return o.addEventListener(e, i), () => {\n o.removeEventListener(e, i);\n };\n }, [e, r]);\n}\nfunction Pk(e, t, r = "mousedown") {\n Hk(r, (n) => {\n const o = e == null ? void 0 : e.current;\n !o || o.contains(n.target) || t(n);\n });\n}\nconst mn = ({\n body: e,\n position: t = Qf.LEFT,\n children: r,\n isShowed: n,\n onChange: o,\n isDisabled: i,\n preventCloseOnClickInside: a,\n isBodyGenerated: s,\n dropdownBodyWidth: l,\n bodyPadding: c,\n dropdownStyles: p\n}) => {\n const d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), u = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [M, C] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (z) => {\n z.stopPropagation(), (!a && !n || !(z.target instanceof HTMLElement) || !u.current || !u.current.contains(z.target)) && (b(!1), o && o(!1));\n },\n [o, n, a]\n ), f = () => {\n const z = d.current, N = u.current;\n if (!z || !N)\n return;\n const W = z.getBoundingClientRect(), T = window.innerHeight, x = N.scrollHeight, E = T - W.bottom, L = W.top, w = E < x && L > E;\n C(w);\n };\n Pk(u, g), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n f(), b(!!n);\n }, [n]);\n const O = (z) => {\n z.stopPropagation(), !i && n === void 0 && (o && o(!h), f(), b((N) => !N));\n }, m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => `dropdown-body align-${t}`, [t]);\n return /* @__PURE__ */ c1(\n Tk,\n {\n className: "dropdown",\n ref: d,\n onClick: O,\n children: [\n /* @__PURE__ */ A("div", { children: r }),\n h && /* @__PURE__ */ A(s ? Jf : react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: /* @__PURE__ */ A(\n I7,\n {\n $bodyPadding: c,\n ref: u,\n className: m,\n $isOpenedUp: M,\n coords: (() => s && d.current ? d.current.getBoundingClientRect() : null)(),\n width: l,\n style: p,\n children: e\n }\n ) })\n ]\n }\n );\n}, fc = (e, t, r) => {\n react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n const n = (o) => {\n t && o.target instanceof HTMLElement && e.current && !e.current.contains(o.target) && r && r();\n };\n return document.addEventListener("mousedown", n), () => {\n document.removeEventListener("mousedown", n);\n };\n }, [e, t, r]);\n}, Vk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t }, width: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n \n & > .dropdown > .dropdown-body {\n padding: ${e.sp8};\n width: ${r}px;\n background: ${t.backgrounds.bgPrimary};\n border: 1px solid ${t.border.borderPrimary};\n }\n `\n), Fk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-bottom: ${e.sp8};\n `\n), Uk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding-top: ${e.sp8};\n box-sizing: border-box;\n gap: 8px;\n\n\n `\n);\nfunction _4(e) {\n const {\n children: t,\n applyText: r = "Apply",\n clearText: n = "Clear",\n position: o,\n width: i = 336,\n isDisabled: a,\n button: s,\n isShowed: l,\n isFilterValueChanged: c,\n onApplyFilter: p,\n onClearFilter: d,\n handleDropdownShowed: u,\n isEnableApplyBtn: h\n } = e, b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n return fc(b, l, u), /* @__PURE__ */ A(Vk, { width: i, ref: b, children: /* @__PURE__ */ A(\n mn,\n {\n body: /* @__PURE__ */ c1(S0, { children: [\n /* @__PURE__ */ A(Fk, { children: t }),\n /* @__PURE__ */ A(a2, { $default: !0 }),\n /* @__PURE__ */ c1(Uk, { children: [\n /* @__PURE__ */ A(\n Tt,\n {\n onClick: d,\n isDisabled: h,\n buttonType: "link",\n size: "sm",\n children: n\n }\n ),\n /* @__PURE__ */ A(\n Tt,\n {\n onClick: p,\n buttonType: "primary",\n isDisabled: h,\n size: "sm",\n children: r\n }\n )\n ] })\n ] }),\n position: o,\n isShowed: l,\n preventCloseOnClickInside: !0,\n isDisabled: a,\n dropdownBodyWidth: "336px",\n children: s\n }\n ) });\n}\nconst C2 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { borderRadius: e, typography: t, colors: r }, $noDigit: n, $variant: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: 14px;\n min-width: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: ${t.t10};\n background-color: ${o === "blue" || o === void 0 ? `${r.backgrounds.bgTertiary}` : `${r.backgrounds.bgErrorPrimary}`};\n color: ${r.textIcon.textTertiary};\n border-radius: ${e.xxl};\n padding: 0 4px;\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${o === "blue" || o === void 0 ? `${r.backgrounds.bgTertiary}` : `${r.backgrounds.bgErrorPrimary}`};\n height: 8px;\n width: 8px;\n border-radius: ${e.xxl};\n min-width: auto;\n padding: 0;\n `}\n `), Yk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e }, $noDigit: t, $badgeSize: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n\n ${C2} {\n position: absolute;\n top: -${e.sp6};\n right: ${r === 1 ? "-6px" : r === 2 ? "-9.5px" : r === 3 ? "-14px" : 0};\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n top: -4px;\n right: -4px;\n `}\n }\n `\n), Kr = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { mixins: e }, $isDate: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: block;\n max-width: ${t ? "150px" : "90px"};\n ${e.ellipsis}\n `\n), _f = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, $isActive: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n gap: 4px;\n &:hover {\n color: ${t ? e.textIcon.textTertiary : e.textIcon.textPressed};\n }\n &:focus {\n color: ${e.textIcon.textSecondary} !important ;\n }\n color: ${t ? e.textIcon.textTertiary : e.textIcon.textSecondary};\n ${C2} {\n width: 4px;\n height: 4px;\n background: ${t ? e.textIcon.textTertiary : e.textIcon.textSecondary};\n }\n `\n), Xk = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n margin-bottom: ${e.sp8};\n `\n), go = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n gap: 4px;\n svg {\n width: 12px;\n }\n `\n), c8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n div {\n background-color: ${e.backgrounds.bgTertiary};\n }\n `\n), di = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n svg {\n opacity: 0.2;\n }\n `\n), Qk = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(N7)(\n ({\n theme: { colors: e, fontWeight: t, typography: r, lineHeight: n, itemSize: o },\n $isActive: i,\n isFiltered: a,\n ...s\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: ${r.t12};\n background-color: ${e.backgrounds.bgPrimary} !important;\n border-radius: 40px;\n height: ${o.md};\n white-space: nowrap;\n min-width: min-content;\n //new\n color: ${e.textIcon.textPrimary} !important;\n box-shadow: ${tt(e.border.borderTertiary)};\n line-height: ${n.lh20};\n font-weight: ${t.regular};\n &:not(:disabled) {\n &:hover {\n ${!i && !a && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgHoverPrimary} !important;\n box-shadow: ${tt(e.border.borderTertiary)};\n `}\n }\n\n &:focus-visible {\n color: ${e.textIcon.textPrimary} !important;\n border-color: ${e.border.borderFocused} mpo !important;\n box-shadow: ${tt(e.border.borderFocused)} !important;\n }\n\n &:active {\n background-color: ${e.blue};\n color: ${e.white};\n }\n }\n svg {\n color: ${e.textIcon.textPrimary} !important;\n }\n &:disabled {\n box-shadow: ${tt(e.border.borderDisabledOnbg)} !important;\n color: ${e.textIcon.textDisabledOnbg} !important;\n ${c8} {\n div {\n\n background-color: ${e.backgrounds.bgDisabledPrimary};\n color: ${e.textIcon.textDisabledOnbg};\n }\n }\n svg {\n color: ${e.backgrounds.bgDisabledPrimary}!important;\n background-color:${e.textIcon.textDisabledOnbg} !important;\n border-radius: ${sa.sp8};\n opacity:1;\n }\n }\n ${a && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.textIcon.textSecondary} !important;\n background-color: ${e.backgrounds.bgPrimary};\n box-shadow: ${tt(e.border.borderSecondary)};\n\n svg {\n color: ${e.textIcon.textTertiary};\n opacity: 0.3;\n }\n &:hover {\n color: ${e.textIcon.textPressed} !important;\n box-shadow: ${tt(e.border.borderPressed)} !important;\n background-color: ${e.backgrounds.bgSecondary} !important;\n }\n `}\n ${i ? (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.textIcon.textTertiary} !important;\n background-color: ${e.backgrounds.bgPressed} !important;\n border-color: ${e.backgrounds.bgPressed} !important;\n box-shadow: ${tt(e.backgrounds.bgPressed)} !important;\n svg {\n color: ${e.textIcon.textTertiary} !important;\n opacity: 1;\n }\n ${c8} {\n div {\n background-color: ${e.backgrounds.bgPrimary};\n color: ${e.textIcon.textPressed};\n border-radius: ${sa.sp8};\n opacity:1;\n }\n }\n ` : (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.dark};\n background-color: ${e.white};\n svg {\n color: ${e.dark};\n }\n `}\n `\n);\nfunction Ol(e) {\n return /* @__PURE__ */ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(Qk, { ...e, key: "isActive-" + e.$isActive });\n}\nconst Gk = (e) => {\n if (typeof e == "number" && (e = e.toString()), typeof e != "string")\n throw new Error("Input is not a valid number or string");\n if (e === "0")\n return 1;\n const t = e.replace(".", "");\n return t === "99+" || t.length >= 3 ? 3 : t.length;\n}, jk = "99+";\nfunction l2(e) {\n const { count: t = 0, children: r, noDigit: n, variant: o } = e, i = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => Number(t) >= 1 ? Number(t) > 99 ? jk : Number(t).toString() : null, [Number(t)]), a = () => n ? /* @__PURE__ */ A(C2, { $variant: o, $noDigit: n }) : /* @__PURE__ */ A(C2, { $variant: o, children: i });\n return r ? Number(t) > 0 ? /* @__PURE__ */ c1(Yk, { $noDigit: n, $badgeSize: Gk(i), children: [\n /* @__PURE__ */ A(a, {}),\n r\n ] }) : /* @__PURE__ */ A(S0, { children: r }) : /* @__PURE__ */ A(a, {});\n}\nconst Kk = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Ol)(\n ({ theme: { colors: e }, $isActive: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${C2} {\n background-color: ${e.blue};\n\n &:not(:first-child) {\n margin-left: 8px;\n }\n }\n\n &:not(:disabled) {\n &:active {\n ${C2} {\n background-color: ${e.white};\n color: ${e.blue};\n }\n }\n }\n\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:not(:focus) {\n ${C2} {\n background-color: ${e.white};\n color: ${e.blue};\n }\n }\n `}\n\n &:disabled {\n ${C2} {\n background-color: ${e.lavenderGrey};\n color: ${e.white};\n }\n }\n `\n), Zk = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Kr)``;\nfunction Jk(e) {\n const { count: t, children: r, ...n } = e;\n return /* @__PURE__ */ c1(Kk, { ...n, isApplied: !!t, children: [\n r && /* @__PURE__ */ A(Zk, { children: r }),\n /* @__PURE__ */ A(l2, { count: t })\n ] });\n}\nconst _k = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Kr)`\n & + & {\n &:before {\n content: \'\\\\2022\';\n display: inline-block;\n vertical-align: middle;\n margin: 0 8px;\n line-height: 1;\n }\n }\n`;\nfunction $k(e) {\n const { range: t = [], ...r } = e, n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => t.map(\n (o, i) => /* @__PURE__ */ A(_k, { children: o }, i)\n ),\n [t]\n );\n return /* @__PURE__ */ A(Ol, { ...r, isApplied: !!t.length, children: n });\n}\nfunction Ai(e) {\n const { isDisabled: t, count: r, range: n, ...o } = e, i = { disabled: t, ...o };\n if (n && n.length)\n return /* @__PURE__ */ A($k, { range: n, ...i });\n if (r)\n return /* @__PURE__ */ A(Jk, { count: r, ...i });\n const a = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n button {\n ${i.style}\n }\n `;\n return i != null && i.overRideStyle ? /* @__PURE__ */ A(a, { children: /* @__PURE__ */ A(Ol, { ...i }) }) : /* @__PURE__ */ A(Ol, { ...i });\n}\nconst Ta = (e) => {\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e || !1), n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n () => r((i) => !i),\n [r]\n ), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (i) => r(() => i),\n [r]\n );\n return [t, n, o];\n};\nfunction eN(e) {\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (o) => {\n o.code === "ArrowDown" ? (o.preventDefault(), r(t === e - 1 ? 0 : t + 1)) : o.code === "ArrowUp" && (o.preventDefault(), r(t === 0 ? e - 1 : t - 1));\n },\n [e, t, r]\n );\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (document.addEventListener("keydown", n, !1), () => {\n document.removeEventListener("keydown", n, !1);\n }), [n]), [t, r];\n}\nconst tN = () => {\n const e = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!0);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n e.current = !1;\n }, []), e.current;\n};\nfunction iA(e) {\n const {\n onClearFilter: t,\n onApplyFilter: r,\n value: n,\n isDisabled: o,\n buttonText: i,\n ...a\n } = e, [s, l] = Ta(!1), [c, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n r && r(c), l();\n }, [r, l, c]), C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n p(""), r && r(""), t && t(), l();\n }, [t]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n typeof n == "string" && p(n);\n }, [n]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c != "" ? b(!1) : b(!0);\n }, [c]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n (n !== c !== d || c) && u(!0);\n }, [n, c, s, d]);\n const g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => /* @__PURE__ */ A(S0, { children: n ? /* @__PURE__ */ A(\n Ai,\n {\n isDisabled: o,\n $isActive: s,\n onClick: l,\n isFiltered: !!(!s && n),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: n || i }),\n s ? /* @__PURE__ */ A(\n f0,\n {\n name: s ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n ) : /* @__PURE__ */ A(di, { onClick: C, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) })\n ] })\n }\n ) : /* @__PURE__ */ A(\n Ai,\n {\n isDisabled: o,\n $isActive: s,\n onClick: l,\n isFiltered: !!(!s && n),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: n || i }),\n n ? /* @__PURE__ */ A(di, { onClick: C, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) }) : /* @__PURE__ */ A(\n f0,\n {\n name: s ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n )\n ] })\n }\n ) }),\n [l, s, o, n, i]\n ), f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (O) => p(O.currentTarget.value),\n []\n );\n return /* @__PURE__ */ A(\n _4,\n {\n ...a,\n button: g,\n isShowed: s,\n isFilterValueChanged: d,\n isEnableApplyBtn: h,\n onApplyFilter: M,\n onClearFilter: C,\n handleDropdownShowed: l,\n children: /* @__PURE__ */ A(\n l8,\n {\n ...a,\n isRequired: !0,\n placeholder: "Insert text here",\n onChange: f,\n value: c,\n handleClearFn: () => {\n p("");\n }\n }\n )\n }\n );\n}\nfunction ml(e, t) {\n return ml = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(r, n) {\n return r.__proto__ = n, r;\n }, ml(e, t);\n}\nfunction gc(e, t) {\n e.prototype = Object.create(t.prototype), e.prototype.constructor = e, ml(e, t);\n}\nfunction v6(e) {\n return e && e.stopPropagation && e.stopPropagation(), e && e.preventDefault && e.preventDefault(), !1;\n}\nfunction y6(e) {\n return e == null ? [] : Array.isArray(e) ? e.slice() : [e];\n}\nfunction Js(e) {\n return e !== null && e.length === 1 ? e[0] : e.slice();\n}\nfunction _s(e) {\n Object.keys(e).forEach((t) => {\n typeof document < "u" && document.addEventListener(t, e[t], !1);\n });\n}\nfunction Yo(e, t) {\n return p8(function(r, n) {\n let o = r;\n return o <= n.min && (o = n.min), o >= n.max && (o = n.max), o;\n }(e, t), t);\n}\nfunction p8(e, t) {\n const r = (e - t.min) % t.step;\n let n = e - r;\n return 2 * Math.abs(r) >= t.step && (n += r > 0 ? t.step : -t.step), parseFloat(n.toFixed(5));\n}\nlet d8 = function(e) {\n function t(n) {\n var o;\n (o = e.call(this, n) || this).onKeyUp = () => {\n o.onEnd();\n }, o.onMouseUp = () => {\n o.onEnd(o.getMouseEventMap());\n }, o.onTouchEnd = (s) => {\n s.preventDefault(), o.onEnd(o.getTouchEventMap());\n }, o.onBlur = () => {\n o.setState({ index: -1 }, o.onEnd(o.getKeyDownEventMap()));\n }, o.onMouseMove = (s) => {\n o.setState({ pending: !0 });\n const l = o.getMousePosition(s), c = o.getDiffPosition(l[0]), p = o.getValueFromPosition(c);\n o.move(p);\n }, o.onTouchMove = (s) => {\n if (s.touches.length > 1)\n return;\n o.setState({ pending: !0 });\n const l = o.getTouchPosition(s);\n if (o.isScrolling === void 0) {\n const d = l[0] - o.startPosition[0], u = l[1] - o.startPosition[1];\n o.isScrolling = Math.abs(u) > Math.abs(d);\n }\n if (o.isScrolling)\n return void o.setState({ index: -1 });\n const c = o.getDiffPosition(l[0]), p = o.getValueFromPosition(c);\n o.move(p);\n }, o.onKeyDown = (s) => {\n if (!(s.ctrlKey || s.shiftKey || s.altKey || s.metaKey))\n switch (o.setState({ pending: !0 }), s.key) {\n case "ArrowLeft":\n case "ArrowDown":\n case "Left":\n case "Down":\n s.preventDefault(), o.moveDownByStep();\n break;\n case "ArrowRight":\n case "ArrowUp":\n case "Right":\n case "Up":\n s.preventDefault(), o.moveUpByStep();\n break;\n case "Home":\n s.preventDefault(), o.move(o.props.min);\n break;\n case "End":\n s.preventDefault(), o.move(o.props.max);\n break;\n case "PageDown":\n s.preventDefault(), o.moveDownByStep(o.props.pageFn(o.props.step));\n break;\n case "PageUp":\n s.preventDefault(), o.moveUpByStep(o.props.pageFn(o.props.step));\n }\n }, o.onSliderMouseDown = (s) => {\n if (!o.props.disabled && s.button !== 2) {\n if (o.setState({ pending: !0 }), !o.props.snapDragDisabled) {\n const l = o.getMousePosition(s);\n o.forceValueFromPosition(l[0], (c) => {\n o.start(c, l[0]), _s(o.getMouseEventMap());\n });\n }\n v6(s);\n }\n }, o.onSliderClick = (s) => {\n if (!o.props.disabled && o.props.onSliderClick && !o.hasMoved) {\n const l = o.getMousePosition(s), c = Yo(o.calcValue(o.calcOffsetFromPosition(l[0])), o.props);\n o.props.onSliderClick(c);\n }\n }, o.createOnKeyDown = (s) => (l) => {\n o.props.disabled || (o.start(s), _s(o.getKeyDownEventMap()), v6(l));\n }, o.createOnMouseDown = (s) => (l) => {\n if (o.props.disabled || l.button === 2)\n return;\n o.setState({ pending: !0 });\n const c = o.getMousePosition(l);\n o.start(s, c[0]), _s(o.getMouseEventMap()), v6(l);\n }, o.createOnTouchStart = (s) => (l) => {\n if (o.props.disabled || l.touches.length > 1)\n return;\n o.setState({ pending: !0 });\n const c = o.getTouchPosition(l);\n o.startPosition = c, o.isScrolling = void 0, o.start(s, c[0]), _s(o.getTouchEventMap()), function(p) {\n p.stopPropagation && p.stopPropagation();\n }(l);\n }, o.handleResize = () => {\n const s = window.setTimeout(() => {\n o.pendingResizeTimeouts.shift(), o.resize();\n }, 0);\n o.pendingResizeTimeouts.push(s);\n }, o.renderThumb = (s, l) => {\n const c = o.props.thumbClassName + " " + o.props.thumbClassName + "-" + l + " " + (o.state.index === l ? o.props.thumbActiveClassName : ""), p = { ref: (u) => {\n o["thumb" + l] = u;\n }, key: o.props.thumbClassName + "-" + l, className: c, style: s, onMouseDown: o.createOnMouseDown(l), onTouchStart: o.createOnTouchStart(l), onFocus: o.createOnKeyDown(l), tabIndex: 0, role: "slider", "aria-orientation": o.props.orientation, "aria-valuenow": o.state.value[l], "aria-valuemin": o.props.min, "aria-valuemax": o.props.max, "aria-label": Array.isArray(o.props.ariaLabel) ? o.props.ariaLabel[l] : o.props.ariaLabel, "aria-labelledby": Array.isArray(o.props.ariaLabelledby) ? o.props.ariaLabelledby[l] : o.props.ariaLabelledby, "aria-disabled": o.props.disabled }, d = { index: l, value: Js(o.state.value), valueNow: o.state.value[l] };\n return o.props.ariaValuetext && (p["aria-valuetext"] = typeof o.props.ariaValuetext == "string" ? o.props.ariaValuetext : o.props.ariaValuetext(d)), o.props.renderThumb(p, d);\n }, o.renderTrack = (s, l, c) => {\n const p = { key: o.props.trackClassName + "-" + s, className: o.props.trackClassName + " " + o.props.trackClassName + "-" + s, style: o.buildTrackStyle(l, o.state.upperBound - c) }, d = { index: s, value: Js(o.state.value) };\n return o.props.renderTrack(p, d);\n };\n let i = y6(n.value);\n i.length || (i = y6(n.defaultValue)), o.pendingResizeTimeouts = [];\n const a = [];\n for (let s = 0; s < i.length; s += 1)\n i[s] = Yo(i[s], n), a.push(s);\n return o.resizeObserver = null, o.resizeElementRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(), o.state = { index: -1, upperBound: 0, sliderLength: 0, value: i, zIndices: a }, o;\n }\n gc(t, e);\n var r = t.prototype;\n return r.componentDidMount = function() {\n typeof window < "u" && (this.resizeObserver = new ResizeObserver(this.handleResize), this.resizeObserver.observe(this.resizeElementRef.current), this.resize());\n }, t.getDerivedStateFromProps = function(n, o) {\n const i = y6(n.value);\n return i.length ? o.pending ? null : { value: i.map((a) => Yo(a, n)) } : null;\n }, r.componentDidUpdate = function() {\n this.state.upperBound === 0 && this.resize();\n }, r.componentWillUnmount = function() {\n this.clearPendingResizeTimeouts(), this.resizeObserver && this.resizeObserver.disconnect();\n }, r.onEnd = function(n) {\n n && function(o) {\n Object.keys(o).forEach((i) => {\n typeof document < "u" && document.removeEventListener(i, o[i], !1);\n });\n }(n), this.hasMoved && this.fireChangeEvent("onAfterChange"), this.setState({ pending: !1 }), this.hasMoved = !1;\n }, r.getValue = function() {\n return Js(this.state.value);\n }, r.getClosestIndex = function(n) {\n let o = Number.MAX_VALUE, i = -1;\n const { value: a } = this.state, s = a.length;\n for (let l = 0; l < s; l += 1) {\n const c = this.calcOffset(a[l]), p = Math.abs(n - c);\n p < o && (o = p, i = l);\n }\n return i;\n }, r.getMousePosition = function(n) {\n return [n["page" + this.axisKey()], n["page" + this.orthogonalAxisKey()]];\n }, r.getTouchPosition = function(n) {\n const o = n.touches[0];\n return [o["page" + this.axisKey()], o["page" + this.orthogonalAxisKey()]];\n }, r.getKeyDownEventMap = function() {\n return { keydown: this.onKeyDown, keyup: this.onKeyUp, focusout: this.onBlur };\n }, r.getMouseEventMap = function() {\n return { mousemove: this.onMouseMove, mouseup: this.onMouseUp };\n }, r.getTouchEventMap = function() {\n return { touchmove: this.onTouchMove, touchend: this.onTouchEnd };\n }, r.getValueFromPosition = function(n) {\n const o = n / (this.state.sliderLength - this.state.thumbSize) * (this.props.max - this.props.min);\n return Yo(this.state.startValue + o, this.props);\n }, r.getDiffPosition = function(n) {\n let o = n - this.state.startPosition;\n return this.props.invert && (o *= -1), o;\n }, r.resize = function() {\n const { slider: n, thumb0: o } = this;\n if (!n || !o)\n return;\n const i = this.sizeKey(), a = n.getBoundingClientRect(), s = n[i], l = a[this.posMaxKey()], c = a[this.posMinKey()], p = o.getBoundingClientRect()[i.replace("client", "").toLowerCase()], d = s - p, u = Math.abs(l - c);\n this.state.upperBound === d && this.state.sliderLength === u && this.state.thumbSize === p || this.setState({ upperBound: d, sliderLength: u, thumbSize: p });\n }, r.calcOffset = function(n) {\n const o = this.props.max - this.props.min;\n return o === 0 ? 0 : (n - this.props.min) / o * this.state.upperBound;\n }, r.calcValue = function(n) {\n return n / this.state.upperBound * (this.props.max - this.props.min) + this.props.min;\n }, r.calcOffsetFromPosition = function(n) {\n const { slider: o } = this, i = o.getBoundingClientRect(), a = i[this.posMaxKey()], s = i[this.posMinKey()];\n let l = n - (window["page" + this.axisKey() + "Offset"] + (this.props.invert ? a : s));\n return this.props.invert && (l = this.state.sliderLength - l), l -= this.state.thumbSize / 2, l;\n }, r.forceValueFromPosition = function(n, o) {\n const i = this.calcOffsetFromPosition(n), a = this.getClosestIndex(i), s = Yo(this.calcValue(i), this.props), l = this.state.value.slice();\n l[a] = s;\n for (let c = 0; c < l.length - 1; c += 1)\n if (l[c + 1] - l[c] < this.props.minDistance)\n return;\n this.fireChangeEvent("onBeforeChange"), this.hasMoved = !0, this.setState({ value: l }, () => {\n o(a), this.fireChangeEvent("onChange");\n });\n }, r.clearPendingResizeTimeouts = function() {\n do {\n const n = this.pendingResizeTimeouts.shift();\n clearTimeout(n);\n } while (this.pendingResizeTimeouts.length);\n }, r.start = function(n, o) {\n const i = this["thumb" + n];\n i && i.focus();\n const { zIndices: a } = this.state;\n a.splice(a.indexOf(n), 1), a.push(n), this.setState((s) => ({ startValue: s.value[n], startPosition: o !== void 0 ? o : s.startPosition, index: n, zIndices: a }));\n }, r.moveUpByStep = function(n) {\n n === void 0 && (n = this.props.step);\n const o = this.state.value[this.state.index], i = Yo(this.props.invert && this.props.orientation === "horizontal" ? o - n : o + n, this.props);\n this.move(Math.min(i, this.props.max));\n }, r.moveDownByStep = function(n) {\n n === void 0 && (n = this.props.step);\n const o = this.state.value[this.state.index], i = Yo(this.props.invert && this.props.orientation === "horizontal" ? o + n : o - n, this.props);\n this.move(Math.max(i, this.props.min));\n }, r.move = function(n) {\n const o = this.state.value.slice(), { index: i } = this.state, { length: a } = o, s = o[i];\n if (n === s)\n return;\n this.hasMoved || this.fireChangeEvent("onBeforeChange"), this.hasMoved = !0;\n const { pearling: l, max: c, min: p, minDistance: d } = this.props;\n if (!l) {\n if (i > 0) {\n const u = o[i - 1];\n n < u + d && (n = u + d);\n }\n if (i < a - 1) {\n const u = o[i + 1];\n n > u - d && (n = u - d);\n }\n }\n o[i] = n, l && a > 1 && (n > s ? (this.pushSucceeding(o, d, i), function(u, h, b, M) {\n for (let C = 0; C < u; C += 1) {\n const g = M - C * b;\n h[u - 1 - C] > g && (h[u - 1 - C] = g);\n }\n }(a, o, d, c)) : n < s && (this.pushPreceding(o, d, i), function(u, h, b, M) {\n for (let C = 0; C < u; C += 1) {\n const g = M + C * b;\n h[C] < g && (h[C] = g);\n }\n }(a, o, d, p))), this.setState({ value: o }, this.fireChangeEvent.bind(this, "onChange"));\n }, r.pushSucceeding = function(n, o, i) {\n let a, s;\n for (a = i, s = n[a] + o; n[a + 1] !== null && s > n[a + 1]; a += 1, s = n[a] + o)\n n[a + 1] = p8(s, this.props);\n }, r.pushPreceding = function(n, o, i) {\n for (let a = i, s = n[a] - o; n[a - 1] !== null && s < n[a - 1]; a -= 1, s = n[a] - o)\n n[a - 1] = p8(s, this.props);\n }, r.axisKey = function() {\n return this.props.orientation === "vertical" ? "Y" : "X";\n }, r.orthogonalAxisKey = function() {\n return this.props.orientation === "vertical" ? "X" : "Y";\n }, r.posMinKey = function() {\n return this.props.orientation === "vertical" ? this.props.invert ? "bottom" : "top" : this.props.invert ? "right" : "left";\n }, r.posMaxKey = function() {\n return this.props.orientation === "vertical" ? this.props.invert ? "top" : "bottom" : this.props.invert ? "left" : "right";\n }, r.sizeKey = function() {\n return this.props.orientation === "vertical" ? "clientHeight" : "clientWidth";\n }, r.fireChangeEvent = function(n) {\n this.props[n] && this.props[n](Js(this.state.value), this.state.index);\n }, r.buildThumbStyle = function(n, o) {\n const i = { position: "absolute", touchAction: "none", willChange: this.state.index >= 0 ? this.posMinKey() : void 0, zIndex: this.state.zIndices.indexOf(o) + 1 };\n return i[this.posMinKey()] = n + "px", i;\n }, r.buildTrackStyle = function(n, o) {\n const i = { position: "absolute", willChange: this.state.index >= 0 ? this.posMinKey() + "," + this.posMaxKey() : void 0 };\n return i[this.posMinKey()] = n, i[this.posMaxKey()] = o, i;\n }, r.buildMarkStyle = function(n) {\n var o;\n return (o = { position: "absolute" })[this.posMinKey()] = n, o;\n }, r.renderThumbs = function(n) {\n const { length: o } = n, i = [];\n for (let s = 0; s < o; s += 1)\n i[s] = this.buildThumbStyle(n[s], s);\n const a = [];\n for (let s = 0; s < o; s += 1)\n a[s] = this.renderThumb(i[s], s);\n return a;\n }, r.renderTracks = function(n) {\n const o = [], i = n.length - 1;\n o.push(this.renderTrack(0, 0, n[0]));\n for (let a = 0; a < i; a += 1)\n o.push(this.renderTrack(a + 1, n[a], n[a + 1]));\n return o.push(this.renderTrack(i + 1, n[i], this.state.upperBound)), o;\n }, r.renderMarks = function() {\n let { marks: n } = this.props;\n const o = this.props.max - this.props.min + 1;\n return typeof n == "boolean" ? n = Array.from({ length: o }).map((i, a) => a) : typeof n == "number" && (n = Array.from({ length: o }).map((i, a) => a).filter((i) => i % n == 0)), n.map(parseFloat).sort((i, a) => i - a).map((i) => {\n const a = this.calcOffset(i), s = { key: i, className: this.props.markClassName, style: this.buildMarkStyle(a) };\n return this.props.renderMark(s);\n });\n }, r.render = function() {\n const n = [], { value: o } = this.state, i = o.length;\n for (let c = 0; c < i; c += 1)\n n[c] = this.calcOffset(o[c], c);\n const a = this.props.withTracks ? this.renderTracks(n) : null, s = this.renderThumbs(n), l = this.props.marks ? this.renderMarks() : null;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: (c) => {\n this.slider = c, this.resizeElementRef.current = c;\n }, style: { position: "relative" }, className: this.props.className + (this.props.disabled ? " disabled" : ""), onMouseDown: this.onSliderMouseDown, onClick: this.onSliderClick }, a, s, l);\n }, t;\n}((react__WEBPACK_IMPORTED_MODULE_0___default().Component));\nd8.displayName = "ReactSlider", d8.defaultProps = { min: 0, max: 100, step: 1, pageFn: (e) => 10 * e, minDistance: 0, defaultValue: 0, orientation: "horizontal", className: "slider", thumbClassName: "thumb", thumbActiveClassName: "active", trackClassName: "track", markClassName: "mark", withTracks: !0, pearling: !1, disabled: !1, snapDragDisabled: !1, invert: !1, marks: [], renderThumb: (e) => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", e), renderTrack: (e) => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", e), renderMark: (e) => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", e) };\nvar rN = d8;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n min-width: 480px;\n`;\nconst nN = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n color: transparent !important ;\n\n :focus-visible{\n outline: none !important;\n }\n\n `, oN = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: absolute;\n top: -8px;\n background: transparent;\n line-height: 24px;\n width: 15px;\n :focus-visible{\n outline: none !important;\n } \n\n `, iN = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { borderRadius: e, colors: t, transitions: r }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .horizontal-slider {\n width: 100%;\n max-width: 500px;\n height: 50px;\n}\n\n.horizontal-slider .example-track {\n top: 20px;\n height: 4px;\n border-radius: ${e.base};\n \n}\n\n.horizontal-slider .example-thumb {\n z-index: 0 !important;\n top: 14px; \n width: 16px;\n height: 16px;\n border-radius: 50%;\n background-color: ${t.backgrounds.bgTertiary};\n color: white;\n cursor: pointer;\n box-sizing: border-box;\n transition: ${r.base};\n border: none;\n \n &:hover,\n &:active {\n box-shadow: 0 0 0px 10px ${t.backgrounds.bgReadOnly};\n transform: scale(1);\n \n }\n\n \n}\n.example-thumb{\n &:focus-visible{\n outline: none !important;\n }\n}\n\n.example-track.example-track-0 {\n background: ${t.slider.sliderBgDefault};\n}\n\n.example-track.example-track-1 {\n background: ${t.backgrounds.bgTertiary};\n}\n\n.example-track.example-track-2 {\n background: ${t.slider.sliderBgDefault};\n}\n\n\n `\n);\nfunction p4(e, t) {\n if (e == null)\n return {};\n var r = {};\n for (var n in e)\n if ({}.hasOwnProperty.call(e, n)) {\n if (t.indexOf(n) !== -1)\n continue;\n r[n] = e[n];\n }\n return r;\n}\nfunction H0() {\n return H0 = Object.assign ? Object.assign.bind() : function(e) {\n for (var t = 1; t < arguments.length; t++) {\n var r = arguments[t];\n for (var n in r)\n ({}).hasOwnProperty.call(r, n) && (e[n] = r[n]);\n }\n return e;\n }, H0.apply(null, arguments);\n}\nvar $f = react__WEBPACK_IMPORTED_MODULE_0__.createContext(), eg = react__WEBPACK_IMPORTED_MODULE_0__.createContext();\nfunction aN(e) {\n var t = e.children, r = react__WEBPACK_IMPORTED_MODULE_0__.useState(null), n = r[0], o = r[1], i = react__WEBPACK_IMPORTED_MODULE_0__.useRef(!1);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n return function() {\n i.current = !0;\n };\n }, []);\n var a = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(s) {\n i.current || o(s);\n }, []);\n return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement($f.Provider, {\n value: n\n }, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(eg.Provider, {\n value: a\n }, t));\n}\nvar tg = function(t) {\n return Array.isArray(t) ? t[0] : t;\n}, rg = function(t) {\n if (typeof t == "function") {\n for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), o = 1; o < r; o++)\n n[o - 1] = arguments[o];\n return t.apply(void 0, n);\n }\n}, A8 = function(t, r) {\n if (typeof t == "function")\n return rg(t, r);\n t != null && (t.current = r);\n}, aA = function(t) {\n return t.reduce(function(r, n) {\n var o = n[0], i = n[1];\n return r[o] = i, r;\n }, {});\n}, sA = typeof window < "u" && window.document && window.document.createElement ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect, O2 = "top", nr = "bottom", or = "right", m2 = "left", T7 = "auto", $4 = [O2, nr, or, m2], za = "start", d4 = "end", sN = "clippingParents", ng = "viewport", f3 = "popper", lN = "reference", lA = /* @__PURE__ */ $4.reduce(function(e, t) {\n return e.concat([t + "-" + za, t + "-" + d4]);\n}, []), og = /* @__PURE__ */ [].concat($4, [T7]).reduce(function(e, t) {\n return e.concat([t, t + "-" + za, t + "-" + d4]);\n}, []), cN = "beforeRead", pN = "read", dN = "afterRead", AN = "beforeMain", uN = "main", bN = "afterMain", hN = "beforeWrite", MN = "write", fN = "afterWrite", gN = [cN, pN, dN, AN, uN, bN, hN, MN, fN];\nfunction Zr(e) {\n return e ? (e.nodeName || "").toLowerCase() : null;\n}\nfunction T2(e) {\n if (e == null)\n return window;\n if (e.toString() !== "[object Window]") {\n var t = e.ownerDocument;\n return t && t.defaultView || window;\n }\n return e;\n}\nfunction ui(e) {\n var t = T2(e).Element;\n return e instanceof t || e instanceof Element;\n}\nfunction tr(e) {\n var t = T2(e).HTMLElement;\n return e instanceof t || e instanceof HTMLElement;\n}\nfunction D7(e) {\n if (typeof ShadowRoot > "u")\n return !1;\n var t = T2(e).ShadowRoot;\n return e instanceof t || e instanceof ShadowRoot;\n}\nfunction zN(e) {\n var t = e.state;\n Object.keys(t.elements).forEach(function(r) {\n var n = t.styles[r] || {}, o = t.attributes[r] || {}, i = t.elements[r];\n !tr(i) || !Zr(i) || (Object.assign(i.style, n), Object.keys(o).forEach(function(a) {\n var s = o[a];\n s === !1 ? i.removeAttribute(a) : i.setAttribute(a, s === !0 ? "" : s);\n }));\n });\n}\nfunction CN(e) {\n var t = e.state, r = {\n popper: {\n position: t.options.strategy,\n left: "0",\n top: "0",\n margin: "0"\n },\n arrow: {\n position: "absolute"\n },\n reference: {}\n };\n return Object.assign(t.elements.popper.style, r.popper), t.styles = r, t.elements.arrow && Object.assign(t.elements.arrow.style, r.arrow), function() {\n Object.keys(t.elements).forEach(function(n) {\n var o = t.elements[n], i = t.attributes[n] || {}, a = Object.keys(t.styles.hasOwnProperty(n) ? t.styles[n] : r[n]), s = a.reduce(function(l, c) {\n return l[c] = "", l;\n }, {});\n !tr(o) || !Zr(o) || (Object.assign(o.style, s), Object.keys(i).forEach(function(l) {\n o.removeAttribute(l);\n }));\n });\n };\n}\nconst ON = {\n name: "applyStyles",\n enabled: !0,\n phase: "write",\n fn: zN,\n effect: CN,\n requires: ["computeStyles"]\n};\nfunction Yr(e) {\n return e.split("-")[0];\n}\nvar si = Math.max, vl = Math.min, Ca = Math.round;\nfunction u8() {\n var e = navigator.userAgentData;\n return e != null && e.brands && Array.isArray(e.brands) ? e.brands.map(function(t) {\n return t.brand + "/" + t.version;\n }).join(" ") : navigator.userAgent;\n}\nfunction ig() {\n return !/^((?!chrome|android).)*safari/i.test(u8());\n}\nfunction Oa(e, t, r) {\n t === void 0 && (t = !1), r === void 0 && (r = !1);\n var n = e.getBoundingClientRect(), o = 1, i = 1;\n t && tr(e) && (o = e.offsetWidth > 0 && Ca(n.width) / e.offsetWidth || 1, i = e.offsetHeight > 0 && Ca(n.height) / e.offsetHeight || 1);\n var a = ui(e) ? T2(e) : window, s = a.visualViewport, l = !ig() && r, c = (n.left + (l && s ? s.offsetLeft : 0)) / o, p = (n.top + (l && s ? s.offsetTop : 0)) / i, d = n.width / o, u = n.height / i;\n return {\n width: d,\n height: u,\n top: p,\n right: c + d,\n bottom: p + u,\n left: c,\n x: c,\n y: p\n };\n}\nfunction H7(e) {\n var t = Oa(e), r = e.offsetWidth, n = e.offsetHeight;\n return Math.abs(t.width - r) <= 1 && (r = t.width), Math.abs(t.height - n) <= 1 && (n = t.height), {\n x: e.offsetLeft,\n y: e.offsetTop,\n width: r,\n height: n\n };\n}\nfunction ag(e, t) {\n var r = t.getRootNode && t.getRootNode();\n if (e.contains(t))\n return !0;\n if (r && D7(r)) {\n var n = t;\n do {\n if (n && e.isSameNode(n))\n return !0;\n n = n.parentNode || n.host;\n } while (n);\n }\n return !1;\n}\nfunction xn(e) {\n return T2(e).getComputedStyle(e);\n}\nfunction mN(e) {\n return ["table", "td", "th"].indexOf(Zr(e)) >= 0;\n}\nfunction xo(e) {\n return ((ui(e) ? e.ownerDocument : (\n // $FlowFixMe[prop-missing]\n e.document\n )) || window.document).documentElement;\n}\nfunction zc(e) {\n return Zr(e) === "html" ? e : (\n // this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n e.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n e.parentNode || // DOM Element detected\n (D7(e) ? e.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n xo(e)\n );\n}\nfunction cA(e) {\n return !tr(e) || // https://github.com/popperjs/popper-core/issues/837\n xn(e).position === "fixed" ? null : e.offsetParent;\n}\nfunction vN(e) {\n var t = /firefox/i.test(u8()), r = /Trident/i.test(u8());\n if (r && tr(e)) {\n var n = xn(e);\n if (n.position === "fixed")\n return null;\n }\n var o = zc(e);\n for (D7(o) && (o = o.host); tr(o) && ["html", "body"].indexOf(Zr(o)) < 0; ) {\n var i = xn(o);\n if (i.transform !== "none" || i.perspective !== "none" || i.contain === "paint" || ["transform", "perspective"].indexOf(i.willChange) !== -1 || t && i.willChange === "filter" || t && i.filter && i.filter !== "none")\n return o;\n o = o.parentNode;\n }\n return null;\n}\nfunction es(e) {\n for (var t = T2(e), r = cA(e); r && mN(r) && xn(r).position === "static"; )\n r = cA(r);\n return r && (Zr(r) === "html" || Zr(r) === "body" && xn(r).position === "static") ? t : r || vN(e) || t;\n}\nfunction P7(e) {\n return ["top", "bottom"].indexOf(e) >= 0 ? "x" : "y";\n}\nfunction j3(e, t, r) {\n return si(e, vl(t, r));\n}\nfunction yN(e, t, r) {\n var n = j3(e, t, r);\n return n > r ? r : n;\n}\nfunction sg() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}\nfunction lg(e) {\n return Object.assign({}, sg(), e);\n}\nfunction cg(e, t) {\n return t.reduce(function(r, n) {\n return r[n] = e, r;\n }, {});\n}\nvar LN = function(t, r) {\n return t = typeof t == "function" ? t(Object.assign({}, r.rects, {\n placement: r.placement\n })) : t, lg(typeof t != "number" ? t : cg(t, $4));\n};\nfunction wN(e) {\n var t, r = e.state, n = e.name, o = e.options, i = r.elements.arrow, a = r.modifiersData.popperOffsets, s = Yr(r.placement), l = P7(s), c = [m2, or].indexOf(s) >= 0, p = c ? "height" : "width";\n if (!(!i || !a)) {\n var d = LN(o.padding, r), u = H7(i), h = l === "y" ? O2 : m2, b = l === "y" ? nr : or, M = r.rects.reference[p] + r.rects.reference[l] - a[l] - r.rects.popper[p], C = a[l] - r.rects.reference[l], g = es(i), f = g ? l === "y" ? g.clientHeight || 0 : g.clientWidth || 0 : 0, O = M / 2 - C / 2, m = d[h], v = f - u[p] - d[b], y = f / 2 - u[p] / 2 + O, z = j3(m, y, v), N = l;\n r.modifiersData[n] = (t = {}, t[N] = z, t.centerOffset = z - y, t);\n }\n}\nfunction qN(e) {\n var t = e.state, r = e.options, n = r.element, o = n === void 0 ? "[data-popper-arrow]" : n;\n o != null && (typeof o == "string" && (o = t.elements.popper.querySelector(o), !o) || ag(t.elements.popper, o) && (t.elements.arrow = o));\n}\nconst xN = {\n name: "arrow",\n enabled: !0,\n phase: "main",\n fn: wN,\n effect: qN,\n requires: ["popperOffsets"],\n requiresIfExists: ["preventOverflow"]\n};\nfunction ma(e) {\n return e.split("-")[1];\n}\nvar RN = {\n top: "auto",\n right: "auto",\n bottom: "auto",\n left: "auto"\n};\nfunction BN(e, t) {\n var r = e.x, n = e.y, o = t.devicePixelRatio || 1;\n return {\n x: Ca(r * o) / o || 0,\n y: Ca(n * o) / o || 0\n };\n}\nfunction pA(e) {\n var t, r = e.popper, n = e.popperRect, o = e.placement, i = e.variation, a = e.offsets, s = e.position, l = e.gpuAcceleration, c = e.adaptive, p = e.roundOffsets, d = e.isFixed, u = a.x, h = u === void 0 ? 0 : u, b = a.y, M = b === void 0 ? 0 : b, C = typeof p == "function" ? p({\n x: h,\n y: M\n }) : {\n x: h,\n y: M\n };\n h = C.x, M = C.y;\n var g = a.hasOwnProperty("x"), f = a.hasOwnProperty("y"), O = m2, m = O2, v = window;\n if (c) {\n var y = es(r), z = "clientHeight", N = "clientWidth";\n if (y === T2(r) && (y = xo(r), xn(y).position !== "static" && s === "absolute" && (z = "scrollHeight", N = "scrollWidth")), y = y, o === O2 || (o === m2 || o === or) && i === d4) {\n m = nr;\n var W = d && y === v && v.visualViewport ? v.visualViewport.height : (\n // $FlowFixMe[prop-missing]\n y[z]\n );\n M -= W - n.height, M *= l ? 1 : -1;\n }\n if (o === m2 || (o === O2 || o === nr) && i === d4) {\n O = or;\n var T = d && y === v && v.visualViewport ? v.visualViewport.width : (\n // $FlowFixMe[prop-missing]\n y[N]\n );\n h -= T - n.width, h *= l ? 1 : -1;\n }\n }\n var x = Object.assign({\n position: s\n }, c && RN), E = p === !0 ? BN({\n x: h,\n y: M\n }, T2(r)) : {\n x: h,\n y: M\n };\n if (h = E.x, M = E.y, l) {\n var L;\n return Object.assign({}, x, (L = {}, L[m] = f ? "0" : "", L[O] = g ? "0" : "", L.transform = (v.devicePixelRatio || 1) <= 1 ? "translate(" + h + "px, " + M + "px)" : "translate3d(" + h + "px, " + M + "px, 0)", L));\n }\n return Object.assign({}, x, (t = {}, t[m] = f ? M + "px" : "", t[O] = g ? h + "px" : "", t.transform = "", t));\n}\nfunction WN(e) {\n var t = e.state, r = e.options, n = r.gpuAcceleration, o = n === void 0 ? !0 : n, i = r.adaptive, a = i === void 0 ? !0 : i, s = r.roundOffsets, l = s === void 0 ? !0 : s, c = {\n placement: Yr(t.placement),\n variation: ma(t.placement),\n popper: t.elements.popper,\n popperRect: t.rects.popper,\n gpuAcceleration: o,\n isFixed: t.options.strategy === "fixed"\n };\n t.modifiersData.popperOffsets != null && (t.styles.popper = Object.assign({}, t.styles.popper, pA(Object.assign({}, c, {\n offsets: t.modifiersData.popperOffsets,\n position: t.options.strategy,\n adaptive: a,\n roundOffsets: l\n })))), t.modifiersData.arrow != null && (t.styles.arrow = Object.assign({}, t.styles.arrow, pA(Object.assign({}, c, {\n offsets: t.modifiersData.arrow,\n position: "absolute",\n adaptive: !1,\n roundOffsets: l\n })))), t.attributes.popper = Object.assign({}, t.attributes.popper, {\n "data-popper-placement": t.placement\n });\n}\nconst EN = {\n name: "computeStyles",\n enabled: !0,\n phase: "beforeWrite",\n fn: WN,\n data: {}\n};\nvar $s = {\n passive: !0\n};\nfunction SN(e) {\n var t = e.state, r = e.instance, n = e.options, o = n.scroll, i = o === void 0 ? !0 : o, a = n.resize, s = a === void 0 ? !0 : a, l = T2(t.elements.popper), c = [].concat(t.scrollParents.reference, t.scrollParents.popper);\n return i && c.forEach(function(p) {\n p.addEventListener("scroll", r.update, $s);\n }), s && l.addEventListener("resize", r.update, $s), function() {\n i && c.forEach(function(p) {\n p.removeEventListener("scroll", r.update, $s);\n }), s && l.removeEventListener("resize", r.update, $s);\n };\n}\nconst kN = {\n name: "eventListeners",\n enabled: !0,\n phase: "write",\n fn: function() {\n },\n effect: SN,\n data: {}\n};\nvar NN = {\n left: "right",\n right: "left",\n bottom: "top",\n top: "bottom"\n};\nfunction U5(e) {\n return e.replace(/left|right|bottom|top/g, function(t) {\n return NN[t];\n });\n}\nvar IN = {\n start: "end",\n end: "start"\n};\nfunction dA(e) {\n return e.replace(/start|end/g, function(t) {\n return IN[t];\n });\n}\nfunction V7(e) {\n var t = T2(e), r = t.pageXOffset, n = t.pageYOffset;\n return {\n scrollLeft: r,\n scrollTop: n\n };\n}\nfunction F7(e) {\n return Oa(xo(e)).left + V7(e).scrollLeft;\n}\nfunction TN(e, t) {\n var r = T2(e), n = xo(e), o = r.visualViewport, i = n.clientWidth, a = n.clientHeight, s = 0, l = 0;\n if (o) {\n i = o.width, a = o.height;\n var c = ig();\n (c || !c && t === "fixed") && (s = o.offsetLeft, l = o.offsetTop);\n }\n return {\n width: i,\n height: a,\n x: s + F7(e),\n y: l\n };\n}\nfunction DN(e) {\n var t, r = xo(e), n = V7(e), o = (t = e.ownerDocument) == null ? void 0 : t.body, i = si(r.scrollWidth, r.clientWidth, o ? o.scrollWidth : 0, o ? o.clientWidth : 0), a = si(r.scrollHeight, r.clientHeight, o ? o.scrollHeight : 0, o ? o.clientHeight : 0), s = -n.scrollLeft + F7(e), l = -n.scrollTop;\n return xn(o || r).direction === "rtl" && (s += si(r.clientWidth, o ? o.clientWidth : 0) - i), {\n width: i,\n height: a,\n x: s,\n y: l\n };\n}\nfunction U7(e) {\n var t = xn(e), r = t.overflow, n = t.overflowX, o = t.overflowY;\n return /auto|scroll|overlay|hidden/.test(r + o + n);\n}\nfunction pg(e) {\n return ["html", "body", "#document"].indexOf(Zr(e)) >= 0 ? e.ownerDocument.body : tr(e) && U7(e) ? e : pg(zc(e));\n}\nfunction K3(e, t) {\n var r;\n t === void 0 && (t = []);\n var n = pg(e), o = n === ((r = e.ownerDocument) == null ? void 0 : r.body), i = T2(n), a = o ? [i].concat(i.visualViewport || [], U7(n) ? n : []) : n, s = t.concat(a);\n return o ? s : (\n // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n s.concat(K3(zc(a)))\n );\n}\nfunction b8(e) {\n return Object.assign({}, e, {\n left: e.x,\n top: e.y,\n right: e.x + e.width,\n bottom: e.y + e.height\n });\n}\nfunction HN(e, t) {\n var r = Oa(e, !1, t === "fixed");\n return r.top = r.top + e.clientTop, r.left = r.left + e.clientLeft, r.bottom = r.top + e.clientHeight, r.right = r.left + e.clientWidth, r.width = e.clientWidth, r.height = e.clientHeight, r.x = r.left, r.y = r.top, r;\n}\nfunction AA(e, t, r) {\n return t === ng ? b8(TN(e, r)) : ui(t) ? HN(t, r) : b8(DN(xo(e)));\n}\nfunction PN(e) {\n var t = K3(zc(e)), r = ["absolute", "fixed"].indexOf(xn(e).position) >= 0, n = r && tr(e) ? es(e) : e;\n return ui(n) ? t.filter(function(o) {\n return ui(o) && ag(o, n) && Zr(o) !== "body";\n }) : [];\n}\nfunction VN(e, t, r, n) {\n var o = t === "clippingParents" ? PN(e) : [].concat(t), i = [].concat(o, [r]), a = i[0], s = i.reduce(function(l, c) {\n var p = AA(e, c, n);\n return l.top = si(p.top, l.top), l.right = vl(p.right, l.right), l.bottom = vl(p.bottom, l.bottom), l.left = si(p.left, l.left), l;\n }, AA(e, a, n));\n return s.width = s.right - s.left, s.height = s.bottom - s.top, s.x = s.left, s.y = s.top, s;\n}\nfunction dg(e) {\n var t = e.reference, r = e.element, n = e.placement, o = n ? Yr(n) : null, i = n ? ma(n) : null, a = t.x + t.width / 2 - r.width / 2, s = t.y + t.height / 2 - r.height / 2, l;\n switch (o) {\n case O2:\n l = {\n x: a,\n y: t.y - r.height\n };\n break;\n case nr:\n l = {\n x: a,\n y: t.y + t.height\n };\n break;\n case or:\n l = {\n x: t.x + t.width,\n y: s\n };\n break;\n case m2:\n l = {\n x: t.x - r.width,\n y: s\n };\n break;\n default:\n l = {\n x: t.x,\n y: t.y\n };\n }\n var c = o ? P7(o) : null;\n if (c != null) {\n var p = c === "y" ? "height" : "width";\n switch (i) {\n case za:\n l[c] = l[c] - (t[p] / 2 - r[p] / 2);\n break;\n case d4:\n l[c] = l[c] + (t[p] / 2 - r[p] / 2);\n break;\n }\n }\n return l;\n}\nfunction A4(e, t) {\n t === void 0 && (t = {});\n var r = t, n = r.placement, o = n === void 0 ? e.placement : n, i = r.strategy, a = i === void 0 ? e.strategy : i, s = r.boundary, l = s === void 0 ? sN : s, c = r.rootBoundary, p = c === void 0 ? ng : c, d = r.elementContext, u = d === void 0 ? f3 : d, h = r.altBoundary, b = h === void 0 ? !1 : h, M = r.padding, C = M === void 0 ? 0 : M, g = lg(typeof C != "number" ? C : cg(C, $4)), f = u === f3 ? lN : f3, O = e.rects.popper, m = e.elements[b ? f : u], v = VN(ui(m) ? m : m.contextElement || xo(e.elements.popper), l, p, a), y = Oa(e.elements.reference), z = dg({\n reference: y,\n element: O,\n strategy: "absolute",\n placement: o\n }), N = b8(Object.assign({}, O, z)), W = u === f3 ? N : y, T = {\n top: v.top - W.top + g.top,\n bottom: W.bottom - v.bottom + g.bottom,\n left: v.left - W.left + g.left,\n right: W.right - v.right + g.right\n }, x = e.modifiersData.offset;\n if (u === f3 && x) {\n var E = x[o];\n Object.keys(T).forEach(function(L) {\n var w = [or, nr].indexOf(L) >= 0 ? 1 : -1, q = [O2, nr].indexOf(L) >= 0 ? "y" : "x";\n T[L] += E[q] * w;\n });\n }\n return T;\n}\nfunction FN(e, t) {\n t === void 0 && (t = {});\n var r = t, n = r.placement, o = r.boundary, i = r.rootBoundary, a = r.padding, s = r.flipVariations, l = r.allowedAutoPlacements, c = l === void 0 ? og : l, p = ma(n), d = p ? s ? lA : lA.filter(function(b) {\n return ma(b) === p;\n }) : $4, u = d.filter(function(b) {\n return c.indexOf(b) >= 0;\n });\n u.length === 0 && (u = d);\n var h = u.reduce(function(b, M) {\n return b[M] = A4(e, {\n placement: M,\n boundary: o,\n rootBoundary: i,\n padding: a\n })[Yr(M)], b;\n }, {});\n return Object.keys(h).sort(function(b, M) {\n return h[b] - h[M];\n });\n}\nfunction UN(e) {\n if (Yr(e) === T7)\n return [];\n var t = U5(e);\n return [dA(e), t, dA(t)];\n}\nfunction YN(e) {\n var t = e.state, r = e.options, n = e.name;\n if (!t.modifiersData[n]._skip) {\n for (var o = r.mainAxis, i = o === void 0 ? !0 : o, a = r.altAxis, s = a === void 0 ? !0 : a, l = r.fallbackPlacements, c = r.padding, p = r.boundary, d = r.rootBoundary, u = r.altBoundary, h = r.flipVariations, b = h === void 0 ? !0 : h, M = r.allowedAutoPlacements, C = t.options.placement, g = Yr(C), f = g === C, O = l || (f || !b ? [U5(C)] : UN(C)), m = [C].concat(O).reduce(function(r1, a1) {\n return r1.concat(Yr(a1) === T7 ? FN(t, {\n placement: a1,\n boundary: p,\n rootBoundary: d,\n padding: c,\n flipVariations: b,\n allowedAutoPlacements: M\n }) : a1);\n }, []), v = t.rects.reference, y = t.rects.popper, z = /* @__PURE__ */ new Map(), N = !0, W = m[0], T = 0; T < m.length; T++) {\n var x = m[T], E = Yr(x), L = ma(x) === za, w = [O2, nr].indexOf(E) >= 0, q = w ? "width" : "height", S = A4(t, {\n placement: x,\n boundary: p,\n rootBoundary: d,\n altBoundary: u,\n padding: c\n }), B = w ? L ? or : m2 : L ? nr : O2;\n v[q] > y[q] && (B = U5(B));\n var I = U5(B), P = [];\n if (i && P.push(S[E] <= 0), s && P.push(S[B] <= 0, S[I] <= 0), P.every(function(r1) {\n return r1;\n })) {\n W = x, N = !1;\n break;\n }\n z.set(x, P);\n }\n if (N)\n for (var k = b ? 3 : 1, K = function(a1) {\n var _ = m.find(function(Y) {\n var D = z.get(Y);\n if (D)\n return D.slice(0, a1).every(function(H) {\n return H;\n });\n });\n if (_)\n return W = _, "break";\n }, $ = k; $ > 0; $--) {\n var j = K($);\n if (j === "break")\n break;\n }\n t.placement !== W && (t.modifiersData[n]._skip = !0, t.placement = W, t.reset = !0);\n }\n}\nconst XN = {\n name: "flip",\n enabled: !0,\n phase: "main",\n fn: YN,\n requiresIfExists: ["offset"],\n data: {\n _skip: !1\n }\n};\nfunction uA(e, t, r) {\n return r === void 0 && (r = {\n x: 0,\n y: 0\n }), {\n top: e.top - t.height - r.y,\n right: e.right - t.width + r.x,\n bottom: e.bottom - t.height + r.y,\n left: e.left - t.width - r.x\n };\n}\nfunction bA(e) {\n return [O2, or, nr, m2].some(function(t) {\n return e[t] >= 0;\n });\n}\nfunction QN(e) {\n var t = e.state, r = e.name, n = t.rects.reference, o = t.rects.popper, i = t.modifiersData.preventOverflow, a = A4(t, {\n elementContext: "reference"\n }), s = A4(t, {\n altBoundary: !0\n }), l = uA(a, n), c = uA(s, o, i), p = bA(l), d = bA(c);\n t.modifiersData[r] = {\n referenceClippingOffsets: l,\n popperEscapeOffsets: c,\n isReferenceHidden: p,\n hasPopperEscaped: d\n }, t.attributes.popper = Object.assign({}, t.attributes.popper, {\n "data-popper-reference-hidden": p,\n "data-popper-escaped": d\n });\n}\nconst GN = {\n name: "hide",\n enabled: !0,\n phase: "main",\n requiresIfExists: ["preventOverflow"],\n fn: QN\n};\nfunction jN(e, t, r) {\n var n = Yr(e), o = [m2, O2].indexOf(n) >= 0 ? -1 : 1, i = typeof r == "function" ? r(Object.assign({}, t, {\n placement: e\n })) : r, a = i[0], s = i[1];\n return a = a || 0, s = (s || 0) * o, [m2, or].indexOf(n) >= 0 ? {\n x: s,\n y: a\n } : {\n x: a,\n y: s\n };\n}\nfunction KN(e) {\n var t = e.state, r = e.options, n = e.name, o = r.offset, i = o === void 0 ? [0, 0] : o, a = og.reduce(function(p, d) {\n return p[d] = jN(d, t.rects, i), p;\n }, {}), s = a[t.placement], l = s.x, c = s.y;\n t.modifiersData.popperOffsets != null && (t.modifiersData.popperOffsets.x += l, t.modifiersData.popperOffsets.y += c), t.modifiersData[n] = a;\n}\nconst ZN = {\n name: "offset",\n enabled: !0,\n phase: "main",\n requires: ["popperOffsets"],\n fn: KN\n};\nfunction JN(e) {\n var t = e.state, r = e.name;\n t.modifiersData[r] = dg({\n reference: t.rects.reference,\n element: t.rects.popper,\n strategy: "absolute",\n placement: t.placement\n });\n}\nconst _N = {\n name: "popperOffsets",\n enabled: !0,\n phase: "read",\n fn: JN,\n data: {}\n};\nfunction $N(e) {\n return e === "x" ? "y" : "x";\n}\nfunction eI(e) {\n var t = e.state, r = e.options, n = e.name, o = r.mainAxis, i = o === void 0 ? !0 : o, a = r.altAxis, s = a === void 0 ? !1 : a, l = r.boundary, c = r.rootBoundary, p = r.altBoundary, d = r.padding, u = r.tether, h = u === void 0 ? !0 : u, b = r.tetherOffset, M = b === void 0 ? 0 : b, C = A4(t, {\n boundary: l,\n rootBoundary: c,\n padding: d,\n altBoundary: p\n }), g = Yr(t.placement), f = ma(t.placement), O = !f, m = P7(g), v = $N(m), y = t.modifiersData.popperOffsets, z = t.rects.reference, N = t.rects.popper, W = typeof M == "function" ? M(Object.assign({}, t.rects, {\n placement: t.placement\n })) : M, T = typeof W == "number" ? {\n mainAxis: W,\n altAxis: W\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, W), x = t.modifiersData.offset ? t.modifiersData.offset[t.placement] : null, E = {\n x: 0,\n y: 0\n };\n if (y) {\n if (i) {\n var L, w = m === "y" ? O2 : m2, q = m === "y" ? nr : or, S = m === "y" ? "height" : "width", B = y[m], I = B + C[w], P = B - C[q], k = h ? -N[S] / 2 : 0, K = f === za ? z[S] : N[S], $ = f === za ? -N[S] : -z[S], j = t.elements.arrow, r1 = h && j ? H7(j) : {\n width: 0,\n height: 0\n }, a1 = t.modifiersData["arrow#persistent"] ? t.modifiersData["arrow#persistent"].padding : sg(), _ = a1[w], Y = a1[q], D = j3(0, z[S], r1[S]), H = O ? z[S] / 2 - k - D - _ - T.mainAxis : K - D - _ - T.mainAxis, G = O ? -z[S] / 2 + k + D + Y + T.mainAxis : $ + D + Y + T.mainAxis, J = t.elements.arrow && es(t.elements.arrow), F = J ? m === "y" ? J.clientTop || 0 : J.clientLeft || 0 : 0, V = (L = x == null ? void 0 : x[m]) != null ? L : 0, Q = B + H - V - F, Z = B + G - V, t1 = j3(h ? vl(I, Q) : I, B, h ? si(P, Z) : P);\n y[m] = t1, E[m] = t1 - B;\n }\n if (s) {\n var n1, U = m === "x" ? O2 : m2, e1 = m === "x" ? nr : or, o1 = y[v], u1 = v === "y" ? "height" : "width", M1 = o1 + C[U], A1 = o1 - C[e1], l1 = [O2, m2].indexOf(g) !== -1, b1 = (n1 = x == null ? void 0 : x[v]) != null ? n1 : 0, h1 = l1 ? M1 : o1 - z[u1] - N[u1] - b1 + T.altAxis, z1 = l1 ? o1 + z[u1] + N[u1] - b1 - T.altAxis : A1, O1 = h && l1 ? yN(h1, o1, z1) : j3(h ? h1 : M1, o1, h ? z1 : A1);\n y[v] = O1, E[v] = O1 - o1;\n }\n t.modifiersData[n] = E;\n }\n}\nconst tI = {\n name: "preventOverflow",\n enabled: !0,\n phase: "main",\n fn: eI,\n requiresIfExists: ["offset"]\n};\nfunction rI(e) {\n return {\n scrollLeft: e.scrollLeft,\n scrollTop: e.scrollTop\n };\n}\nfunction nI(e) {\n return e === T2(e) || !tr(e) ? V7(e) : rI(e);\n}\nfunction oI(e) {\n var t = e.getBoundingClientRect(), r = Ca(t.width) / e.offsetWidth || 1, n = Ca(t.height) / e.offsetHeight || 1;\n return r !== 1 || n !== 1;\n}\nfunction iI(e, t, r) {\n r === void 0 && (r = !1);\n var n = tr(t), o = tr(t) && oI(t), i = xo(t), a = Oa(e, o, r), s = {\n scrollLeft: 0,\n scrollTop: 0\n }, l = {\n x: 0,\n y: 0\n };\n return (n || !n && !r) && ((Zr(t) !== "body" || // https://github.com/popperjs/popper-core/issues/1078\n U7(i)) && (s = nI(t)), tr(t) ? (l = Oa(t, !0), l.x += t.clientLeft, l.y += t.clientTop) : i && (l.x = F7(i))), {\n x: a.left + s.scrollLeft - l.x,\n y: a.top + s.scrollTop - l.y,\n width: a.width,\n height: a.height\n };\n}\nfunction aI(e) {\n var t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), n = [];\n e.forEach(function(i) {\n t.set(i.name, i);\n });\n function o(i) {\n r.add(i.name);\n var a = [].concat(i.requires || [], i.requiresIfExists || []);\n a.forEach(function(s) {\n if (!r.has(s)) {\n var l = t.get(s);\n l && o(l);\n }\n }), n.push(i);\n }\n return e.forEach(function(i) {\n r.has(i.name) || o(i);\n }), n;\n}\nfunction sI(e) {\n var t = aI(e);\n return gN.reduce(function(r, n) {\n return r.concat(t.filter(function(o) {\n return o.phase === n;\n }));\n }, []);\n}\nfunction lI(e) {\n var t;\n return function() {\n return t || (t = new Promise(function(r) {\n Promise.resolve().then(function() {\n t = void 0, r(e());\n });\n })), t;\n };\n}\nfunction cI(e) {\n var t = e.reduce(function(r, n) {\n var o = r[n.name];\n return r[n.name] = o ? Object.assign({}, o, n, {\n options: Object.assign({}, o.options, n.options),\n data: Object.assign({}, o.data, n.data)\n }) : n, r;\n }, {});\n return Object.keys(t).map(function(r) {\n return t[r];\n });\n}\nvar hA = {\n placement: "bottom",\n modifiers: [],\n strategy: "absolute"\n};\nfunction MA() {\n for (var e = arguments.length, t = new Array(e), r = 0; r < e; r++)\n t[r] = arguments[r];\n return !t.some(function(n) {\n return !(n && typeof n.getBoundingClientRect == "function");\n });\n}\nfunction pI(e) {\n e === void 0 && (e = {});\n var t = e, r = t.defaultModifiers, n = r === void 0 ? [] : r, o = t.defaultOptions, i = o === void 0 ? hA : o;\n return function(s, l, c) {\n c === void 0 && (c = i);\n var p = {\n placement: "bottom",\n orderedModifiers: [],\n options: Object.assign({}, hA, i),\n modifiersData: {},\n elements: {\n reference: s,\n popper: l\n },\n attributes: {},\n styles: {}\n }, d = [], u = !1, h = {\n state: p,\n setOptions: function(g) {\n var f = typeof g == "function" ? g(p.options) : g;\n M(), p.options = Object.assign({}, i, p.options, f), p.scrollParents = {\n reference: ui(s) ? K3(s) : s.contextElement ? K3(s.contextElement) : [],\n popper: K3(l)\n };\n var O = sI(cI([].concat(n, p.options.modifiers)));\n return p.orderedModifiers = O.filter(function(m) {\n return m.enabled;\n }), b(), h.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function() {\n if (!u) {\n var g = p.elements, f = g.reference, O = g.popper;\n if (MA(f, O)) {\n p.rects = {\n reference: iI(f, es(O), p.options.strategy === "fixed"),\n popper: H7(O)\n }, p.reset = !1, p.placement = p.options.placement, p.orderedModifiers.forEach(function(T) {\n return p.modifiersData[T.name] = Object.assign({}, T.data);\n });\n for (var m = 0; m < p.orderedModifiers.length; m++) {\n if (p.reset === !0) {\n p.reset = !1, m = -1;\n continue;\n }\n var v = p.orderedModifiers[m], y = v.fn, z = v.options, N = z === void 0 ? {} : z, W = v.name;\n typeof y == "function" && (p = y({\n state: p,\n options: N,\n name: W,\n instance: h\n }) || p);\n }\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: lI(function() {\n return new Promise(function(C) {\n h.forceUpdate(), C(p);\n });\n }),\n destroy: function() {\n M(), u = !0;\n }\n };\n if (!MA(s, l))\n return h;\n h.setOptions(c).then(function(C) {\n !u && c.onFirstUpdate && c.onFirstUpdate(C);\n });\n function b() {\n p.orderedModifiers.forEach(function(C) {\n var g = C.name, f = C.options, O = f === void 0 ? {} : f, m = C.effect;\n if (typeof m == "function") {\n var v = m({\n state: p,\n name: g,\n instance: h,\n options: O\n }), y = function() {\n };\n d.push(v || y);\n }\n });\n }\n function M() {\n d.forEach(function(C) {\n return C();\n }), d = [];\n }\n return h;\n };\n}\nvar dI = [kN, _N, EN, ON, ZN, XN, tI, xN, GN], AI = /* @__PURE__ */ pI({\n defaultModifiers: dI\n}), uI = typeof Element < "u", bI = typeof Map == "function", hI = typeof Set == "function", MI = typeof ArrayBuffer == "function" && !!ArrayBuffer.isView;\nfunction Y5(e, t) {\n if (e === t)\n return !0;\n if (e && t && typeof e == "object" && typeof t == "object") {\n if (e.constructor !== t.constructor)\n return !1;\n var r, n, o;\n if (Array.isArray(e)) {\n if (r = e.length, r != t.length)\n return !1;\n for (n = r; n-- !== 0; )\n if (!Y5(e[n], t[n]))\n return !1;\n return !0;\n }\n var i;\n if (bI && e instanceof Map && t instanceof Map) {\n if (e.size !== t.size)\n return !1;\n for (i = e.entries(); !(n = i.next()).done; )\n if (!t.has(n.value[0]))\n return !1;\n for (i = e.entries(); !(n = i.next()).done; )\n if (!Y5(n.value[1], t.get(n.value[0])))\n return !1;\n return !0;\n }\n if (hI && e instanceof Set && t instanceof Set) {\n if (e.size !== t.size)\n return !1;\n for (i = e.entries(); !(n = i.next()).done; )\n if (!t.has(n.value[0]))\n return !1;\n return !0;\n }\n if (MI && ArrayBuffer.isView(e) && ArrayBuffer.isView(t)) {\n if (r = e.length, r != t.length)\n return !1;\n for (n = r; n-- !== 0; )\n if (e[n] !== t[n])\n return !1;\n return !0;\n }\n if (e.constructor === RegExp)\n return e.source === t.source && e.flags === t.flags;\n if (e.valueOf !== Object.prototype.valueOf && typeof e.valueOf == "function" && typeof t.valueOf == "function")\n return e.valueOf() === t.valueOf();\n if (e.toString !== Object.prototype.toString && typeof e.toString == "function" && typeof t.toString == "function")\n return e.toString() === t.toString();\n if (o = Object.keys(e), r = o.length, r !== Object.keys(t).length)\n return !1;\n for (n = r; n-- !== 0; )\n if (!Object.prototype.hasOwnProperty.call(t, o[n]))\n return !1;\n if (uI && e instanceof Element)\n return !1;\n for (n = r; n-- !== 0; )\n if (!((o[n] === "_owner" || o[n] === "__v" || o[n] === "__o") && e.$$typeof) && !Y5(e[o[n]], t[o[n]]))\n return !1;\n return !0;\n }\n return e !== e && t !== t;\n}\nvar fI = function(t, r) {\n try {\n return Y5(t, r);\n } catch (n) {\n if ((n.message || "").match(/stack|recursion/i))\n return console.warn("react-fast-compare cannot handle circular refs"), !1;\n throw n;\n }\n};\nconst gI = /* @__PURE__ */ $t(fI);\nvar zI = [], Ag = function(t, r, n) {\n n === void 0 && (n = {});\n var o = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null), i = {\n onFirstUpdate: n.onFirstUpdate,\n placement: n.placement || "bottom",\n strategy: n.strategy || "absolute",\n modifiers: n.modifiers || zI\n }, a = react__WEBPACK_IMPORTED_MODULE_0__.useState({\n styles: {\n popper: {\n position: i.strategy,\n left: "0",\n top: "0"\n },\n arrow: {\n position: "absolute"\n }\n },\n attributes: {}\n }), s = a[0], l = a[1], c = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function() {\n return {\n name: "updateState",\n enabled: !0,\n phase: "write",\n fn: function(h) {\n var b = h.state, M = Object.keys(b.elements);\n react_dom__WEBPACK_IMPORTED_MODULE_2__.flushSync(function() {\n l({\n styles: aA(M.map(function(C) {\n return [C, b.styles[C] || {}];\n })),\n attributes: aA(M.map(function(C) {\n return [C, b.attributes[C]];\n }))\n });\n });\n },\n requires: ["computeStyles"]\n };\n }, []), p = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function() {\n var u = {\n onFirstUpdate: i.onFirstUpdate,\n placement: i.placement,\n strategy: i.strategy,\n modifiers: [].concat(i.modifiers, [c, {\n name: "applyStyles",\n enabled: !1\n }])\n };\n return gI(o.current, u) ? o.current || u : (o.current = u, u);\n }, [i.onFirstUpdate, i.placement, i.strategy, i.modifiers, c]), d = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n return sA(function() {\n d.current && d.current.setOptions(p);\n }, [p]), sA(function() {\n if (!(t == null || r == null)) {\n var u = n.createPopper || AI, h = u(t, r, p);\n return d.current = h, function() {\n h.destroy(), d.current = null;\n };\n }\n }, [t, r, n.createPopper]), {\n state: d.current ? d.current.state : null,\n styles: s.styles,\n attributes: s.attributes,\n update: d.current ? d.current.update : null,\n forceUpdate: d.current ? d.current.forceUpdate : null\n };\n}, CI = function() {\n}, OI = function() {\n return Promise.resolve(null);\n}, mI = [];\nfunction vI(e) {\n var t = e.placement, r = t === void 0 ? "bottom" : t, n = e.strategy, o = n === void 0 ? "absolute" : n, i = e.modifiers, a = i === void 0 ? mI : i, s = e.referenceElement, l = e.onFirstUpdate, c = e.innerRef, p = e.children, d = react__WEBPACK_IMPORTED_MODULE_0__.useContext($f), u = react__WEBPACK_IMPORTED_MODULE_0__.useState(null), h = u[0], b = u[1], M = react__WEBPACK_IMPORTED_MODULE_0__.useState(null), C = M[0], g = M[1];\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n A8(c, h);\n }, [c, h]);\n var f = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function() {\n return {\n placement: r,\n strategy: o,\n onFirstUpdate: l,\n modifiers: [].concat(a, [{\n name: "arrow",\n enabled: C != null,\n options: {\n element: C\n }\n }])\n };\n }, [r, o, l, a, C]), O = Ag(s || d, h, f), m = O.state, v = O.styles, y = O.forceUpdate, z = O.update, N = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(function() {\n return {\n ref: b,\n style: v.popper,\n placement: m ? m.placement : r,\n hasPopperEscaped: m && m.modifiersData.hide ? m.modifiersData.hide.hasPopperEscaped : null,\n isReferenceHidden: m && m.modifiersData.hide ? m.modifiersData.hide.isReferenceHidden : null,\n arrowProps: {\n style: v.arrow,\n ref: g\n },\n forceUpdate: y || CI,\n update: z || OI\n };\n }, [b, g, r, m, v, z, y]);\n return tg(p)(N);\n}\nvar yI = "production" !== "production", ug = function() {\n};\nif (yI) {\n var LI = function(t, r) {\n var n = arguments.length;\n r = new Array(n > 1 ? n - 1 : 0);\n for (var o = 1; o < n; o++)\n r[o - 1] = arguments[o];\n var i = 0, a = "Warning: " + t.replace(/%s/g, function() {\n return r[i++];\n });\n typeof console < "u" && console.error(a);\n try {\n throw new Error(a);\n } catch {\n }\n };\n ug = function(e, t, r) {\n var n = arguments.length;\n r = new Array(n > 2 ? n - 2 : 0);\n for (var o = 2; o < n; o++)\n r[o - 2] = arguments[o];\n if (t === void 0)\n throw new Error(\n "`warning(condition, format, ...args)` requires a warning message argument"\n );\n e || LI.apply(null, [t].concat(r));\n };\n}\nvar wI = ug;\nconst qI = /* @__PURE__ */ $t(wI);\nfunction xI(e) {\n var t = e.children, r = e.innerRef, n = react__WEBPACK_IMPORTED_MODULE_0__.useContext(eg), o = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(i) {\n A8(r, i), rg(n, i);\n }, [r, n]);\n return react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n return function() {\n return A8(r, null);\n };\n }, []), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n qI(!!n, "`Reference` should not be used outside of a `Manager` component.");\n }, [n]), tg(t)({\n ref: o\n });\n}\nfunction bg(e) {\n var t = react__WEBPACK_IMPORTED_MODULE_0__.useRef(e);\n return t.current = e, react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function() {\n return t.current;\n }, []);\n}\nvar RI = function() {\n};\nfunction BI(e) {\n var t = e.initial, r = e.value, n = e.onChange, o = n === void 0 ? RI : n;\n if (t === void 0 && r === void 0)\n throw new TypeError(\'Either "value" or "initial" variable must be set. Now both are undefined\');\n var i = react__WEBPACK_IMPORTED_MODULE_0__.useState(t), a = i[0], s = i[1], l = bg(a), c = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function(d) {\n var u = l(), h = typeof d == "function" ? d(u) : d;\n typeof h.persist == "function" && h.persist(), s(h), typeof o == "function" && o(h);\n }, [l, o]), p = r !== void 0;\n return [p ? r : a, p ? o : c];\n}\nfunction hg(e, t) {\n return e === void 0 && (e = 0), t === void 0 && (t = 0), function() {\n return {\n width: 0,\n height: 0,\n top: t,\n right: e,\n bottom: t,\n left: e,\n x: 0,\n y: 0,\n toJSON: function() {\n return null;\n }\n };\n };\n}\nvar WI = ["styles", "attributes"], fA = {\n getBoundingClientRect: hg()\n}, gA = {\n closeOnOutsideClick: !0,\n closeOnTriggerHidden: !1,\n defaultVisible: !1,\n delayHide: 0,\n delayShow: 0,\n followCursor: !1,\n interactive: !1,\n mutationObserverOptions: {\n attributes: !0,\n childList: !0,\n subtree: !0\n },\n offset: [0, 6],\n trigger: "hover"\n};\nfunction EI(e, t) {\n var r, n, o;\n e === void 0 && (e = {}), t === void 0 && (t = {});\n var i = Object.keys(gA).reduce(function(q, S) {\n var B;\n return H0({}, q, (B = {}, B[S] = q[S] !== void 0 ? q[S] : gA[S], B));\n }, e), a = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(\n function() {\n return [{\n name: "offset",\n options: {\n offset: i.offset\n }\n }];\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Array.isArray(i.offset) ? i.offset : []\n ), s = H0({}, t, {\n placement: t.placement || i.placement,\n modifiers: t.modifiers || a\n }), l = react__WEBPACK_IMPORTED_MODULE_0__.useState(null), c = l[0], p = l[1], d = react__WEBPACK_IMPORTED_MODULE_0__.useState(null), u = d[0], h = d[1], b = BI({\n initial: i.defaultVisible,\n value: i.visible,\n onChange: i.onVisibleChange\n }), M = b[0], C = b[1], g = react__WEBPACK_IMPORTED_MODULE_0__.useRef();\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n return function() {\n return clearTimeout(g.current);\n };\n }, []);\n var f = Ag(i.followCursor ? fA : c, u, s), O = f.styles, m = f.attributes, v = p4(f, WI), y = v.update, z = bg({\n visible: M,\n triggerRef: c,\n tooltipRef: u,\n finalConfig: i\n }), N = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(\n function(q) {\n return Array.isArray(i.trigger) ? i.trigger.includes(q) : i.trigger === q;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Array.isArray(i.trigger) ? i.trigger : [i.trigger]\n ), W = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function() {\n clearTimeout(g.current), g.current = window.setTimeout(function() {\n return C(!1);\n }, i.delayHide);\n }, [i.delayHide, C]), T = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function() {\n clearTimeout(g.current), g.current = window.setTimeout(function() {\n return C(!0);\n }, i.delayShow);\n }, [i.delayShow, C]), x = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function() {\n z().visible ? W() : T();\n }, [z, W, T]);\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (z().finalConfig.closeOnOutsideClick) {\n var q = function(B) {\n var I, P = z(), k = P.tooltipRef, K = P.triggerRef, $ = (B.composedPath == null || (I = B.composedPath()) == null ? void 0 : I[0]) || B.target;\n $ instanceof Node && k != null && K != null && !k.contains($) && !K.contains($) && W();\n };\n return document.addEventListener("mousedown", q), function() {\n return document.removeEventListener("mousedown", q);\n };\n }\n }, [z, W]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(c == null || !N("click")))\n return c.addEventListener("click", x), function() {\n return c.removeEventListener("click", x);\n };\n }, [c, N, x]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(c == null || !N("double-click")))\n return c.addEventListener("dblclick", x), function() {\n return c.removeEventListener("dblclick", x);\n };\n }, [c, N, x]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(c == null || !N("right-click"))) {\n var q = function(B) {\n B.preventDefault(), x();\n };\n return c.addEventListener("contextmenu", q), function() {\n return c.removeEventListener("contextmenu", q);\n };\n }\n }, [c, N, x]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(c == null || !N("focus")))\n return c.addEventListener("focus", T), c.addEventListener("blur", W), function() {\n c.removeEventListener("focus", T), c.removeEventListener("blur", W);\n };\n }, [c, N, T, W]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(c == null || !N("hover")))\n return c.addEventListener("mouseenter", T), c.addEventListener("mouseleave", W), function() {\n c.removeEventListener("mouseenter", T), c.removeEventListener("mouseleave", W);\n };\n }, [c, N, T, W]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(u == null || !N("hover") || !z().finalConfig.interactive))\n return u.addEventListener("mouseenter", T), u.addEventListener("mouseleave", W), function() {\n u.removeEventListener("mouseenter", T), u.removeEventListener("mouseleave", W);\n };\n }, [u, N, T, W, z]);\n var E = v == null || (r = v.state) == null || (n = r.modifiersData) == null || (o = n.hide) == null ? void 0 : o.isReferenceHidden;\n react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n i.closeOnTriggerHidden && E && W();\n }, [i.closeOnTriggerHidden, W, E]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!i.followCursor || c == null)\n return;\n function q(S) {\n var B = S.clientX, I = S.clientY;\n fA.getBoundingClientRect = hg(B, I), y == null || y();\n }\n return c.addEventListener("mousemove", q), function() {\n return c.removeEventListener("mousemove", q);\n };\n }, [i.followCursor, c, y]), react__WEBPACK_IMPORTED_MODULE_0__.useEffect(function() {\n if (!(u == null || y == null || i.mutationObserverOptions == null)) {\n var q = new MutationObserver(y);\n return q.observe(u, i.mutationObserverOptions), function() {\n return q.disconnect();\n };\n }\n }, [i.mutationObserverOptions, u, y]);\n var L = function(S) {\n return S === void 0 && (S = {}), H0({}, S, {\n style: H0({}, S.style, O.popper)\n }, m.popper, {\n "data-popper-interactive": i.interactive\n });\n }, w = function(S) {\n return S === void 0 && (S = {}), H0({}, S, m.arrow, {\n style: H0({}, S.style, O.arrow),\n "data-popper-arrow": !0\n });\n };\n return H0({\n getArrowProps: w,\n getTooltipProps: L,\n setTooltipRef: h,\n setTriggerRef: p,\n tooltipRef: u,\n triggerRef: c,\n visible: M\n }, v);\n}\nconst SI = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n max-width: 600px;\n`, Mg = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n maxWidth: e,\n size: t,\n theme: { colors: r, typography: n, spacings: o, borderRadius: i, fontWeight: a }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${n.t10};\n line-height: ${t === "mini" ? "10px" : "16px"};\n font-weight: ${t === "mini" ? a.regular : a.medium};\n padding: ${t === "mini" ? `${o.sp4} 5px` : o.sp8};\n border-radius: ${i.base};\n background: ${r.backgrounds.bgTertiary};\n color: ${r.textIcon.textTertiary};\n border: none;\n z-index: 9999;\n max-width: ${e || "500px"};\n word-wrap: break-word;\n &[data-popper-interactive=\'false\'] {\n pointer-events: none;\n }\n `\n);\nfunction v2(e) {\n const {\n text: t,\n place: r,\n children: n,\n followCursor: o,\n size: i = "default",\n maxWidth: a,\n ...s\n } = e, l = i === "mini" ? [0, 2] : [0, 6], { getTooltipProps: c, setTooltipRef: p, setTriggerRef: d, visible: u } = EI({\n ...s,\n followCursor: o,\n placement: r,\n offset: l\n });\n return /* @__PURE__ */ c1(SI, { ref: d, children: [\n n,\n u && t && (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.createPortal)(\n /* @__PURE__ */ A(\n Mg,\n {\n maxWidth: a,\n size: i,\n ref: p,\n ...c({ className: "tooltip-container" }),\n children: t\n }\n ),\n document.body\n )\n ] });\n}\nfunction kI(e) {\n const {\n minValue: t,\n maxValue: r,\n isDisabled: n,\n value: o,\n defaultValue: i,\n getValue: a,\n ...s\n } = e, [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(o), p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (d) => {\n c(d), a && a(d);\n },\n [c, a]\n );\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c(o);\n }, [o]), /* @__PURE__ */ A(iN, { children: /* @__PURE__ */ A(\n rN,\n {\n ...s,\n min: t,\n defaultValue: i,\n max: r,\n disabled: n,\n value: l,\n onChange: p,\n className: "horizontal-slider",\n thumbClassName: "example-thumb",\n trackClassName: "example-track",\n renderThumb: (d, u) => /* @__PURE__ */ A(nN, { ...d, children: /* @__PURE__ */ A(oN, { children: /* @__PURE__ */ A(v2, { size: "default", text: u.valueNow, place: "top", children: u.valueNow }) }) })\n }\n ) });\n}\nconst NI = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n margin-bottom: ${({ theme: { spacings: e } }) => e.sp16};\n`, zA = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n flex: 1;\n\n input[type=\'number\'] {\n ::-webkit-outer-spin-button,\n ::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n`, II = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-top: ${e.sp24};\n width: 1rem;\n margin: 0 ${e.sp8};\n `\n), TI = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n p {\n position: absolute;\n margin-top: -15px;\n }\n `\n);\nfunction DI(e, t) {\n const {\n isDisabled: r,\n value: n,\n hideClearButton: o,\n min: i,\n max: a,\n onChange: s,\n isValidation: l,\n defaultValue: c,\n ...p\n } = e, [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(n), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [M, C] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [g, f] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), [O, m] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), [v, y] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(c), [z, N] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0), [W, T] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useImperativeHandle)(t, () => ({\n handleReset(q) {\n u(q);\n }\n })), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n u(n), f(n[0]), m(n[1]);\n }, [n]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c && (y(c), N(c[0]), T(c[1]));\n }, [c]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n d[0] > d[1] && l ? b(!0) : b(!1);\n }, [d, l]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n d[1] < d[0] && l ? C(!0) : C(!1);\n }, [d, l]);\n const x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (q) => {\n const { value: S } = q.target, B = /^[0-9\\b]+$/, I = [Number(S), d[1]];\n (S === "" || B.test(S)) && (u(I), s(I), f(S)), b(!1);\n },\n [d, g]\n ), E = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (q) => {\n const { value: S } = q.currentTarget, B = /^[0-9\\b]+$/, I = [d[0], Number(S)];\n (S === "" || B.test(S)) && (u(I), s(I), m(S)), C(!1);\n },\n [d, O]\n ), L = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (q) => {\n u(q), s(q), C(!1), b(!1), f(q[0]), m(q[1]);\n },\n [s, g, O, d]\n ), w = {\n type: "text",\n isDisabled: r,\n placeholder: "Enter amount"\n };\n return /* @__PURE__ */ c1(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [\n /* @__PURE__ */ c1(NI, { children: [\n /* @__PURE__ */ A(zA, { children: /* @__PURE__ */ A(\n L2,\n {\n label: "From",\n value: g,\n defaultValue: z,\n onChange: x,\n isError: h,\n isRequired: !0,\n hideClearButton: o,\n handleClearFn: () => {\n const q = [0, d[1]];\n f(""), u(q), s(q);\n },\n ...w\n }\n ) }),\n /* @__PURE__ */ A(II, { children: /* @__PURE__ */ A(a2, { $default: !0 }) }),\n /* @__PURE__ */ A(zA, { children: /* @__PURE__ */ A(\n L2,\n {\n label: "To",\n value: O,\n defaultValue: W,\n onChange: E,\n isError: M,\n isRequired: !0,\n hideClearButton: o,\n handleClearFn: () => {\n const q = [d[0], 0];\n m(""), u(q), s(q);\n },\n ...w\n }\n ) })\n ] }),\n h && M && /* @__PURE__ */ A(TI, { children: /* @__PURE__ */ A(G3, { isError: !0, children: "From value must be smaller than To value" }) }),\n /* @__PURE__ */ A(\n kI,\n {\n ...p,\n isDisabled: r,\n value: d,\n defaultValue: v,\n getValue: L,\n minValue: i,\n maxValue: a\n }\n )\n ] });\n}\nconst fg = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(DI);\nfunction HI(e) {\n const {\n onClearFilter: t,\n isDisabled: r,\n onApplyFilter: n,\n value: o,\n buttonText: i,\n showDefaultValue: a,\n ...s\n } = e, l = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [c, p] = Ta(!1), [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(o), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [M, C] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n u(o);\n }, [o]);\n const g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n d && (n && n(d), p());\n }, [n, p, d]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n d[0] < d[1] ? C(!1) : C(!0);\n }, [d[0], d[1]]);\n const f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const v = [0, 0];\n u(v), n && n(v), l != null && l.current && l.current.handleReset(v), t && t(), p();\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n b(\n d[0] !== 0 || d[1] !== 0 || o[0] !== 0 || o[1] !== 0\n );\n }, [o, d, c]);\n const O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => /* @__PURE__ */ A(\n Ai,\n {\n ...{\n isDisabled: r,\n isActive: c,\n onClick: p\n },\n isDisabled: r,\n $isActive: c,\n onClick: p,\n isFiltered: !!(!c && o[0] && o[1]),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: o[1] && !a ? /* @__PURE__ */ c1(_f, { $isActive: c, children: [\n o[0],\n " ",\n /* @__PURE__ */ A(l2, { count: 0, noDigit: !0 }),\n " ",\n o[1]\n ] }) : i }),\n o[1] ? !c && !a ? /* @__PURE__ */ A(di, { onClick: f, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) }) : /* @__PURE__ */ A(\n f0,\n {\n name: c ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n ) : /* @__PURE__ */ A(\n f0,\n {\n name: c ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n )\n ] })\n }\n ), [p, c, r, o, i]), m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(([v, y]) => {\n u([v, y]);\n }, []);\n return /* @__PURE__ */ A(\n _4,\n {\n ...s,\n button: O,\n isShowed: c,\n isFilterValueChanged: h,\n onApplyFilter: g,\n onClearFilter: f,\n handleDropdownShowed: p,\n isEnableApplyBtn: M,\n children: /* @__PURE__ */ A(\n fg,\n {\n ...s,\n ref: l,\n onChange: m,\n value: d,\n isValidation: !0\n }\n )\n }\n );\n}\nfunction nt(e) {\n return e.replace(/([a-z])([A-Z])/g, "$1 $2").replace("_", " ").split(/(?=[A-Z])/).map(\n (n, o) => o === 0 ? n.charAt(0).toUpperCase() + n.slice(1) : n.toLowerCase()\n ).join(" ");\n}\nfunction ir(e) {\n "@babel/helpers - typeof";\n return ir = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t) {\n return typeof t;\n } : function(t) {\n return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;\n }, ir(e);\n}\nfunction ie(e) {\n if (e === null || e === !0 || e === !1)\n return NaN;\n var t = Number(e);\n return isNaN(t) ? t : t < 0 ? Math.ceil(t) : Math.floor(t);\n}\nfunction z0(e, t) {\n if (t.length < e)\n throw new TypeError(e + " argument" + (e > 1 ? "s" : "") + " required, but only " + t.length + " present");\n}\nfunction v0(e) {\n z0(1, arguments);\n var t = Object.prototype.toString.call(e);\n return e instanceof Date || ir(e) === "object" && t === "[object Date]" ? new Date(e.getTime()) : typeof e == "number" || t === "[object Number]" ? new Date(e) : ((typeof e == "string" || t === "[object String]") && typeof console < "u" && (console.warn("Starting with v2.0.0-beta.1 date-fns doesn\'t accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"), console.warn(new Error().stack)), /* @__PURE__ */ new Date(NaN));\n}\nfunction Da(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n return isNaN(n) ? /* @__PURE__ */ new Date(NaN) : (n && r.setDate(r.getDate() + n), r);\n}\nfunction Or(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n if (isNaN(n))\n return /* @__PURE__ */ new Date(NaN);\n if (!n)\n return r;\n var o = r.getDate(), i = new Date(r.getTime());\n i.setMonth(r.getMonth() + n + 1, 0);\n var a = i.getDate();\n return o >= a ? i : (r.setFullYear(i.getFullYear(), i.getMonth(), o), r);\n}\nfunction Y7(e, t) {\n z0(2, arguments);\n var r = v0(e).getTime(), n = ie(t);\n return new Date(r + n);\n}\nvar PI = 36e5;\nfunction VI(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Y7(e, r * PI);\n}\nvar FI = {};\nfunction Ro() {\n return FI;\n}\nfunction gg(e, t) {\n var r, n, o, i, a, s, l, c;\n z0(1, arguments);\n var p = Ro(), d = ie((r = (n = (o = (i = t == null ? void 0 : t.weekStartsOn) !== null && i !== void 0 ? i : t == null || (a = t.locale) === null || a === void 0 || (s = a.options) === null || s === void 0 ? void 0 : s.weekStartsOn) !== null && o !== void 0 ? o : p.weekStartsOn) !== null && n !== void 0 ? n : (l = p.locale) === null || l === void 0 || (c = l.options) === null || c === void 0 ? void 0 : c.weekStartsOn) !== null && r !== void 0 ? r : 0);\n if (!(d >= 0 && d <= 6))\n throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");\n var u = v0(e), h = u.getDay(), b = (h < d ? 7 : 0) + h - d;\n return u.setDate(u.getDate() - b), u.setHours(0, 0, 0, 0), u;\n}\nfunction yl(e) {\n return z0(1, arguments), gg(e, {\n weekStartsOn: 1\n });\n}\nfunction UI(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getFullYear(), n = /* @__PURE__ */ new Date(0);\n n.setFullYear(r + 1, 0, 4), n.setHours(0, 0, 0, 0);\n var o = yl(n), i = /* @__PURE__ */ new Date(0);\n i.setFullYear(r, 0, 4), i.setHours(0, 0, 0, 0);\n var a = yl(i);\n return t.getTime() >= o.getTime() ? r + 1 : t.getTime() >= a.getTime() ? r : r - 1;\n}\nfunction YI(e) {\n z0(1, arguments);\n var t = UI(e), r = /* @__PURE__ */ new Date(0);\n r.setFullYear(t, 0, 4), r.setHours(0, 0, 0, 0);\n var n = yl(r);\n return n;\n}\nfunction va(e) {\n var t = new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds()));\n return t.setUTCFullYear(e.getFullYear()), e.getTime() - t.getTime();\n}\nfunction Xr(e) {\n z0(1, arguments);\n var t = v0(e);\n return t.setHours(0, 0, 0, 0), t;\n}\nvar XI = 864e5;\nfunction Ll(e, t) {\n z0(2, arguments);\n var r = Xr(e), n = Xr(t), o = r.getTime() - va(r), i = n.getTime() - va(n);\n return Math.round((o - i) / XI);\n}\nvar QI = 6e4;\nfunction h8(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Y7(e, r * QI);\n}\nfunction zg(e, t) {\n z0(2, arguments);\n var r = ie(t), n = r * 3;\n return Or(e, n);\n}\nfunction wl(e, t) {\n z0(2, arguments);\n var r = ie(t), n = r * 7;\n return Da(e, n);\n}\nfunction ya(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Or(e, r * 12);\n}\nfunction CA(e) {\n z0(1, arguments);\n var t;\n if (e && typeof e.forEach == "function")\n t = e;\n else if (ir(e) === "object" && e !== null)\n t = Array.prototype.slice.call(e);\n else\n return /* @__PURE__ */ new Date(NaN);\n var r;\n return t.forEach(function(n) {\n var o = v0(n);\n (r === void 0 || r < o || isNaN(Number(o))) && (r = o);\n }), r || /* @__PURE__ */ new Date(NaN);\n}\nfunction OA(e) {\n z0(1, arguments);\n var t;\n if (e && typeof e.forEach == "function")\n t = e;\n else if (ir(e) === "object" && e !== null)\n t = Array.prototype.slice.call(e);\n else\n return /* @__PURE__ */ new Date(NaN);\n var r;\n return t.forEach(function(n) {\n var o = v0(n);\n (r === void 0 || r > o || isNaN(o.getDate())) && (r = o);\n }), r || /* @__PURE__ */ new Date(NaN);\n}\nfunction X5(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t), o = r.getTime() - n.getTime();\n return o < 0 ? -1 : o > 0 ? 1 : o;\n}\nvar X7 = 6e4, Q7 = 36e5, GI = 1e3;\nfunction jI(e, t) {\n z0(2, arguments);\n var r = Xr(e), n = Xr(t);\n return r.getTime() === n.getTime();\n}\nfunction Cc(e) {\n return z0(1, arguments), e instanceof Date || ir(e) === "object" && Object.prototype.toString.call(e) === "[object Date]";\n}\nfunction u4(e) {\n if (z0(1, arguments), !Cc(e) && typeof e != "number")\n return !1;\n var t = v0(e);\n return !isNaN(Number(t));\n}\nfunction b4(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t), o = r.getFullYear() - n.getFullYear(), i = r.getMonth() - n.getMonth();\n return o * 12 + i;\n}\nfunction _i(e) {\n z0(1, arguments);\n var t = v0(e), r = Math.floor(t.getMonth() / 3) + 1;\n return r;\n}\nfunction ql(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getFullYear() - n.getFullYear();\n}\nfunction KI(e, t) {\n return z0(2, arguments), v0(e).getTime() - v0(t).getTime();\n}\nvar mA = {\n ceil: Math.ceil,\n round: Math.round,\n floor: Math.floor,\n trunc: function(t) {\n return t < 0 ? Math.ceil(t) : Math.floor(t);\n }\n // Math.trunc is not supported by IE\n}, ZI = "trunc";\nfunction JI(e) {\n return e ? mA[e] : mA[ZI];\n}\nfunction xl(e) {\n z0(1, arguments);\n var t = v0(e);\n return t.setHours(23, 59, 59, 999), t;\n}\nfunction Cg(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getMonth();\n return t.setFullYear(t.getFullYear(), r + 1, 0), t.setHours(23, 59, 59, 999), t;\n}\nfunction _I(e) {\n z0(1, arguments);\n var t = v0(e);\n return xl(t).getTime() === Cg(t).getTime();\n}\nfunction $I(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t), o = X5(r, n), i = Math.abs(b4(r, n)), a;\n if (i < 1)\n a = 0;\n else {\n r.getMonth() === 1 && r.getDate() > 27 && r.setDate(30), r.setMonth(r.getMonth() - o * i);\n var s = X5(r, n) === -o;\n _I(v0(e)) && i === 1 && X5(e, n) === 1 && (s = !1), a = o * (i - Number(s));\n }\n return a === 0 ? 0 : a;\n}\nfunction eT(e, t, r) {\n z0(2, arguments);\n var n = KI(e, t) / 1e3;\n return JI(r == null ? void 0 : r.roundingMethod)(n);\n}\nfunction M8(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getMonth(), n = r - r % 3;\n return t.setMonth(n, 1), t.setHours(0, 0, 0, 0), t;\n}\nfunction Og(e) {\n z0(1, arguments);\n var t = v0(e);\n return t.setDate(1), t.setHours(0, 0, 0, 0), t;\n}\nfunction tT(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getFullYear();\n return t.setFullYear(r + 1, 0, 0), t.setHours(23, 59, 59, 999), t;\n}\nfunction mg(e) {\n z0(1, arguments);\n var t = v0(e), r = /* @__PURE__ */ new Date(0);\n return r.setFullYear(t.getFullYear(), 0, 1), r.setHours(0, 0, 0, 0), r;\n}\nfunction vg(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Y7(e, -r);\n}\nvar rT = 864e5;\nfunction nT(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getTime();\n t.setUTCMonth(0, 1), t.setUTCHours(0, 0, 0, 0);\n var n = t.getTime(), o = r - n;\n return Math.floor(o / rT) + 1;\n}\nfunction La(e) {\n z0(1, arguments);\n var t = 1, r = v0(e), n = r.getUTCDay(), o = (n < t ? 7 : 0) + n - t;\n return r.setUTCDate(r.getUTCDate() - o), r.setUTCHours(0, 0, 0, 0), r;\n}\nfunction yg(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getUTCFullYear(), n = /* @__PURE__ */ new Date(0);\n n.setUTCFullYear(r + 1, 0, 4), n.setUTCHours(0, 0, 0, 0);\n var o = La(n), i = /* @__PURE__ */ new Date(0);\n i.setUTCFullYear(r, 0, 4), i.setUTCHours(0, 0, 0, 0);\n var a = La(i);\n return t.getTime() >= o.getTime() ? r + 1 : t.getTime() >= a.getTime() ? r : r - 1;\n}\nfunction oT(e) {\n z0(1, arguments);\n var t = yg(e), r = /* @__PURE__ */ new Date(0);\n r.setUTCFullYear(t, 0, 4), r.setUTCHours(0, 0, 0, 0);\n var n = La(r);\n return n;\n}\nvar iT = 6048e5;\nfunction Lg(e) {\n z0(1, arguments);\n var t = v0(e), r = La(t).getTime() - oT(t).getTime();\n return Math.round(r / iT) + 1;\n}\nfunction bi(e, t) {\n var r, n, o, i, a, s, l, c;\n z0(1, arguments);\n var p = Ro(), d = ie((r = (n = (o = (i = t == null ? void 0 : t.weekStartsOn) !== null && i !== void 0 ? i : t == null || (a = t.locale) === null || a === void 0 || (s = a.options) === null || s === void 0 ? void 0 : s.weekStartsOn) !== null && o !== void 0 ? o : p.weekStartsOn) !== null && n !== void 0 ? n : (l = p.locale) === null || l === void 0 || (c = l.options) === null || c === void 0 ? void 0 : c.weekStartsOn) !== null && r !== void 0 ? r : 0);\n if (!(d >= 0 && d <= 6))\n throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");\n var u = v0(e), h = u.getUTCDay(), b = (h < d ? 7 : 0) + h - d;\n return u.setUTCDate(u.getUTCDate() - b), u.setUTCHours(0, 0, 0, 0), u;\n}\nfunction G7(e, t) {\n var r, n, o, i, a, s, l, c;\n z0(1, arguments);\n var p = v0(e), d = p.getUTCFullYear(), u = Ro(), h = ie((r = (n = (o = (i = t == null ? void 0 : t.firstWeekContainsDate) !== null && i !== void 0 ? i : t == null || (a = t.locale) === null || a === void 0 || (s = a.options) === null || s === void 0 ? void 0 : s.firstWeekContainsDate) !== null && o !== void 0 ? o : u.firstWeekContainsDate) !== null && n !== void 0 ? n : (l = u.locale) === null || l === void 0 || (c = l.options) === null || c === void 0 ? void 0 : c.firstWeekContainsDate) !== null && r !== void 0 ? r : 1);\n if (!(h >= 1 && h <= 7))\n throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");\n var b = /* @__PURE__ */ new Date(0);\n b.setUTCFullYear(d + 1, 0, h), b.setUTCHours(0, 0, 0, 0);\n var M = bi(b, t), C = /* @__PURE__ */ new Date(0);\n C.setUTCFullYear(d, 0, h), C.setUTCHours(0, 0, 0, 0);\n var g = bi(C, t);\n return p.getTime() >= M.getTime() ? d + 1 : p.getTime() >= g.getTime() ? d : d - 1;\n}\nfunction aT(e, t) {\n var r, n, o, i, a, s, l, c;\n z0(1, arguments);\n var p = Ro(), d = ie((r = (n = (o = (i = t == null ? void 0 : t.firstWeekContainsDate) !== null && i !== void 0 ? i : t == null || (a = t.locale) === null || a === void 0 || (s = a.options) === null || s === void 0 ? void 0 : s.firstWeekContainsDate) !== null && o !== void 0 ? o : p.firstWeekContainsDate) !== null && n !== void 0 ? n : (l = p.locale) === null || l === void 0 || (c = l.options) === null || c === void 0 ? void 0 : c.firstWeekContainsDate) !== null && r !== void 0 ? r : 1), u = G7(e, t), h = /* @__PURE__ */ new Date(0);\n h.setUTCFullYear(u, 0, d), h.setUTCHours(0, 0, 0, 0);\n var b = bi(h, t);\n return b;\n}\nvar sT = 6048e5;\nfunction wg(e, t) {\n z0(1, arguments);\n var r = v0(e), n = bi(r, t).getTime() - aT(r, t).getTime();\n return Math.round(n / sT) + 1;\n}\nfunction ke(e, t) {\n for (var r = e < 0 ? "-" : "", n = Math.abs(e).toString(); n.length < t; )\n n = "0" + n;\n return r + n;\n}\nvar lT = {\n // Year\n y: function(t, r) {\n var n = t.getUTCFullYear(), o = n > 0 ? n : 1 - n;\n return ke(r === "yy" ? o % 100 : o, r.length);\n },\n // Month\n M: function(t, r) {\n var n = t.getUTCMonth();\n return r === "M" ? String(n + 1) : ke(n + 1, 2);\n },\n // Day of the month\n d: function(t, r) {\n return ke(t.getUTCDate(), r.length);\n },\n // AM or PM\n a: function(t, r) {\n var n = t.getUTCHours() / 12 >= 1 ? "pm" : "am";\n switch (r) {\n case "a":\n case "aa":\n return n.toUpperCase();\n case "aaa":\n return n;\n case "aaaaa":\n return n[0];\n case "aaaa":\n default:\n return n === "am" ? "a.m." : "p.m.";\n }\n },\n // Hour [1-12]\n h: function(t, r) {\n return ke(t.getUTCHours() % 12 || 12, r.length);\n },\n // Hour [0-23]\n H: function(t, r) {\n return ke(t.getUTCHours(), r.length);\n },\n // Minute\n m: function(t, r) {\n return ke(t.getUTCMinutes(), r.length);\n },\n // Second\n s: function(t, r) {\n return ke(t.getUTCSeconds(), r.length);\n },\n // Fraction of second\n S: function(t, r) {\n var n = r.length, o = t.getUTCMilliseconds(), i = Math.floor(o * Math.pow(10, n - 3));\n return ke(i, r.length);\n }\n};\nconst Gn = lT;\nvar Ti = {\n am: "am",\n pm: "pm",\n midnight: "midnight",\n noon: "noon",\n morning: "morning",\n afternoon: "afternoon",\n evening: "evening",\n night: "night"\n}, cT = {\n // Era\n G: function(t, r, n) {\n var o = t.getUTCFullYear() > 0 ? 1 : 0;\n switch (r) {\n case "G":\n case "GG":\n case "GGG":\n return n.era(o, {\n width: "abbreviated"\n });\n case "GGGGG":\n return n.era(o, {\n width: "narrow"\n });\n case "GGGG":\n default:\n return n.era(o, {\n width: "wide"\n });\n }\n },\n // Year\n y: function(t, r, n) {\n if (r === "yo") {\n var o = t.getUTCFullYear(), i = o > 0 ? o : 1 - o;\n return n.ordinalNumber(i, {\n unit: "year"\n });\n }\n return Gn.y(t, r);\n },\n // Local week-numbering year\n Y: function(t, r, n, o) {\n var i = G7(t, o), a = i > 0 ? i : 1 - i;\n if (r === "YY") {\n var s = a % 100;\n return ke(s, 2);\n }\n return r === "Yo" ? n.ordinalNumber(a, {\n unit: "year"\n }) : ke(a, r.length);\n },\n // ISO week-numbering year\n R: function(t, r) {\n var n = yg(t);\n return ke(n, r.length);\n },\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function(t, r) {\n var n = t.getUTCFullYear();\n return ke(n, r.length);\n },\n // Quarter\n Q: function(t, r, n) {\n var o = Math.ceil((t.getUTCMonth() + 1) / 3);\n switch (r) {\n case "Q":\n return String(o);\n case "QQ":\n return ke(o, 2);\n case "Qo":\n return n.ordinalNumber(o, {\n unit: "quarter"\n });\n case "QQQ":\n return n.quarter(o, {\n width: "abbreviated",\n context: "formatting"\n });\n case "QQQQQ":\n return n.quarter(o, {\n width: "narrow",\n context: "formatting"\n });\n case "QQQQ":\n default:\n return n.quarter(o, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // Stand-alone quarter\n q: function(t, r, n) {\n var o = Math.ceil((t.getUTCMonth() + 1) / 3);\n switch (r) {\n case "q":\n return String(o);\n case "qq":\n return ke(o, 2);\n case "qo":\n return n.ordinalNumber(o, {\n unit: "quarter"\n });\n case "qqq":\n return n.quarter(o, {\n width: "abbreviated",\n context: "standalone"\n });\n case "qqqqq":\n return n.quarter(o, {\n width: "narrow",\n context: "standalone"\n });\n case "qqqq":\n default:\n return n.quarter(o, {\n width: "wide",\n context: "standalone"\n });\n }\n },\n // Month\n M: function(t, r, n) {\n var o = t.getUTCMonth();\n switch (r) {\n case "M":\n case "MM":\n return Gn.M(t, r);\n case "Mo":\n return n.ordinalNumber(o + 1, {\n unit: "month"\n });\n case "MMM":\n return n.month(o, {\n width: "abbreviated",\n context: "formatting"\n });\n case "MMMMM":\n return n.month(o, {\n width: "narrow",\n context: "formatting"\n });\n case "MMMM":\n default:\n return n.month(o, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // Stand-alone month\n L: function(t, r, n) {\n var o = t.getUTCMonth();\n switch (r) {\n case "L":\n return String(o + 1);\n case "LL":\n return ke(o + 1, 2);\n case "Lo":\n return n.ordinalNumber(o + 1, {\n unit: "month"\n });\n case "LLL":\n return n.month(o, {\n width: "abbreviated",\n context: "standalone"\n });\n case "LLLLL":\n return n.month(o, {\n width: "narrow",\n context: "standalone"\n });\n case "LLLL":\n default:\n return n.month(o, {\n width: "wide",\n context: "standalone"\n });\n }\n },\n // Local week of year\n w: function(t, r, n, o) {\n var i = wg(t, o);\n return r === "wo" ? n.ordinalNumber(i, {\n unit: "week"\n }) : ke(i, r.length);\n },\n // ISO week of year\n I: function(t, r, n) {\n var o = Lg(t);\n return r === "Io" ? n.ordinalNumber(o, {\n unit: "week"\n }) : ke(o, r.length);\n },\n // Day of the month\n d: function(t, r, n) {\n return r === "do" ? n.ordinalNumber(t.getUTCDate(), {\n unit: "date"\n }) : Gn.d(t, r);\n },\n // Day of year\n D: function(t, r, n) {\n var o = nT(t);\n return r === "Do" ? n.ordinalNumber(o, {\n unit: "dayOfYear"\n }) : ke(o, r.length);\n },\n // Day of week\n E: function(t, r, n) {\n var o = t.getUTCDay();\n switch (r) {\n case "E":\n case "EE":\n case "EEE":\n return n.day(o, {\n width: "abbreviated",\n context: "formatting"\n });\n case "EEEEE":\n return n.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "EEEEEE":\n return n.day(o, {\n width: "short",\n context: "formatting"\n });\n case "EEEE":\n default:\n return n.day(o, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // Local day of week\n e: function(t, r, n, o) {\n var i = t.getUTCDay(), a = (i - o.weekStartsOn + 8) % 7 || 7;\n switch (r) {\n case "e":\n return String(a);\n case "ee":\n return ke(a, 2);\n case "eo":\n return n.ordinalNumber(a, {\n unit: "day"\n });\n case "eee":\n return n.day(i, {\n width: "abbreviated",\n context: "formatting"\n });\n case "eeeee":\n return n.day(i, {\n width: "narrow",\n context: "formatting"\n });\n case "eeeeee":\n return n.day(i, {\n width: "short",\n context: "formatting"\n });\n case "eeee":\n default:\n return n.day(i, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // Stand-alone local day of week\n c: function(t, r, n, o) {\n var i = t.getUTCDay(), a = (i - o.weekStartsOn + 8) % 7 || 7;\n switch (r) {\n case "c":\n return String(a);\n case "cc":\n return ke(a, r.length);\n case "co":\n return n.ordinalNumber(a, {\n unit: "day"\n });\n case "ccc":\n return n.day(i, {\n width: "abbreviated",\n context: "standalone"\n });\n case "ccccc":\n return n.day(i, {\n width: "narrow",\n context: "standalone"\n });\n case "cccccc":\n return n.day(i, {\n width: "short",\n context: "standalone"\n });\n case "cccc":\n default:\n return n.day(i, {\n width: "wide",\n context: "standalone"\n });\n }\n },\n // ISO day of week\n i: function(t, r, n) {\n var o = t.getUTCDay(), i = o === 0 ? 7 : o;\n switch (r) {\n case "i":\n return String(i);\n case "ii":\n return ke(i, r.length);\n case "io":\n return n.ordinalNumber(i, {\n unit: "day"\n });\n case "iii":\n return n.day(o, {\n width: "abbreviated",\n context: "formatting"\n });\n case "iiiii":\n return n.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "iiiiii":\n return n.day(o, {\n width: "short",\n context: "formatting"\n });\n case "iiii":\n default:\n return n.day(o, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // AM or PM\n a: function(t, r, n) {\n var o = t.getUTCHours(), i = o / 12 >= 1 ? "pm" : "am";\n switch (r) {\n case "a":\n case "aa":\n return n.dayPeriod(i, {\n width: "abbreviated",\n context: "formatting"\n });\n case "aaa":\n return n.dayPeriod(i, {\n width: "abbreviated",\n context: "formatting"\n }).toLowerCase();\n case "aaaaa":\n return n.dayPeriod(i, {\n width: "narrow",\n context: "formatting"\n });\n case "aaaa":\n default:\n return n.dayPeriod(i, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // AM, PM, midnight, noon\n b: function(t, r, n) {\n var o = t.getUTCHours(), i;\n switch (o === 12 ? i = Ti.noon : o === 0 ? i = Ti.midnight : i = o / 12 >= 1 ? "pm" : "am", r) {\n case "b":\n case "bb":\n return n.dayPeriod(i, {\n width: "abbreviated",\n context: "formatting"\n });\n case "bbb":\n return n.dayPeriod(i, {\n width: "abbreviated",\n context: "formatting"\n }).toLowerCase();\n case "bbbbb":\n return n.dayPeriod(i, {\n width: "narrow",\n context: "formatting"\n });\n case "bbbb":\n default:\n return n.dayPeriod(i, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // in the morning, in the afternoon, in the evening, at night\n B: function(t, r, n) {\n var o = t.getUTCHours(), i;\n switch (o >= 17 ? i = Ti.evening : o >= 12 ? i = Ti.afternoon : o >= 4 ? i = Ti.morning : i = Ti.night, r) {\n case "B":\n case "BB":\n case "BBB":\n return n.dayPeriod(i, {\n width: "abbreviated",\n context: "formatting"\n });\n case "BBBBB":\n return n.dayPeriod(i, {\n width: "narrow",\n context: "formatting"\n });\n case "BBBB":\n default:\n return n.dayPeriod(i, {\n width: "wide",\n context: "formatting"\n });\n }\n },\n // Hour [1-12]\n h: function(t, r, n) {\n if (r === "ho") {\n var o = t.getUTCHours() % 12;\n return o === 0 && (o = 12), n.ordinalNumber(o, {\n unit: "hour"\n });\n }\n return Gn.h(t, r);\n },\n // Hour [0-23]\n H: function(t, r, n) {\n return r === "Ho" ? n.ordinalNumber(t.getUTCHours(), {\n unit: "hour"\n }) : Gn.H(t, r);\n },\n // Hour [0-11]\n K: function(t, r, n) {\n var o = t.getUTCHours() % 12;\n return r === "Ko" ? n.ordinalNumber(o, {\n unit: "hour"\n }) : ke(o, r.length);\n },\n // Hour [1-24]\n k: function(t, r, n) {\n var o = t.getUTCHours();\n return o === 0 && (o = 24), r === "ko" ? n.ordinalNumber(o, {\n unit: "hour"\n }) : ke(o, r.length);\n },\n // Minute\n m: function(t, r, n) {\n return r === "mo" ? n.ordinalNumber(t.getUTCMinutes(), {\n unit: "minute"\n }) : Gn.m(t, r);\n },\n // Second\n s: function(t, r, n) {\n return r === "so" ? n.ordinalNumber(t.getUTCSeconds(), {\n unit: "second"\n }) : Gn.s(t, r);\n },\n // Fraction of second\n S: function(t, r) {\n return Gn.S(t, r);\n },\n // Timezone (ISO-8601. If offset is 0, output is always `\'Z\'`)\n X: function(t, r, n, o) {\n var i = o._originalDate || t, a = i.getTimezoneOffset();\n if (a === 0)\n return "Z";\n switch (r) {\n case "X":\n return yA(a);\n case "XXXX":\n case "XX":\n return Ko(a);\n case "XXXXX":\n case "XXX":\n default:\n return Ko(a, ":");\n }\n },\n // Timezone (ISO-8601. If offset is 0, output is `\'+00:00\'` or equivalent)\n x: function(t, r, n, o) {\n var i = o._originalDate || t, a = i.getTimezoneOffset();\n switch (r) {\n case "x":\n return yA(a);\n case "xxxx":\n case "xx":\n return Ko(a);\n case "xxxxx":\n case "xxx":\n default:\n return Ko(a, ":");\n }\n },\n // Timezone (GMT)\n O: function(t, r, n, o) {\n var i = o._originalDate || t, a = i.getTimezoneOffset();\n switch (r) {\n case "O":\n case "OO":\n case "OOO":\n return "GMT" + vA(a, ":");\n case "OOOO":\n default:\n return "GMT" + Ko(a, ":");\n }\n },\n // Timezone (specific non-location)\n z: function(t, r, n, o) {\n var i = o._originalDate || t, a = i.getTimezoneOffset();\n switch (r) {\n case "z":\n case "zz":\n case "zzz":\n return "GMT" + vA(a, ":");\n case "zzzz":\n default:\n return "GMT" + Ko(a, ":");\n }\n },\n // Seconds timestamp\n t: function(t, r, n, o) {\n var i = o._originalDate || t, a = Math.floor(i.getTime() / 1e3);\n return ke(a, r.length);\n },\n // Milliseconds timestamp\n T: function(t, r, n, o) {\n var i = o._originalDate || t, a = i.getTime();\n return ke(a, r.length);\n }\n};\nfunction vA(e, t) {\n var r = e > 0 ? "-" : "+", n = Math.abs(e), o = Math.floor(n / 60), i = n % 60;\n if (i === 0)\n return r + String(o);\n var a = t || "";\n return r + String(o) + a + ke(i, 2);\n}\nfunction yA(e, t) {\n if (e % 60 === 0) {\n var r = e > 0 ? "-" : "+";\n return r + ke(Math.abs(e) / 60, 2);\n }\n return Ko(e, t);\n}\nfunction Ko(e, t) {\n var r = t || "", n = e > 0 ? "-" : "+", o = Math.abs(e), i = ke(Math.floor(o / 60), 2), a = ke(o % 60, 2);\n return n + i + r + a;\n}\nconst pT = cT;\nvar LA = function(t, r) {\n switch (t) {\n case "P":\n return r.date({\n width: "short"\n });\n case "PP":\n return r.date({\n width: "medium"\n });\n case "PPP":\n return r.date({\n width: "long"\n });\n case "PPPP":\n default:\n return r.date({\n width: "full"\n });\n }\n}, qg = function(t, r) {\n switch (t) {\n case "p":\n return r.time({\n width: "short"\n });\n case "pp":\n return r.time({\n width: "medium"\n });\n case "ppp":\n return r.time({\n width: "long"\n });\n case "pppp":\n default:\n return r.time({\n width: "full"\n });\n }\n}, dT = function(t, r) {\n var n = t.match(/(P+)(p+)?/) || [], o = n[1], i = n[2];\n if (!i)\n return LA(t, r);\n var a;\n switch (o) {\n case "P":\n a = r.dateTime({\n width: "short"\n });\n break;\n case "PP":\n a = r.dateTime({\n width: "medium"\n });\n break;\n case "PPP":\n a = r.dateTime({\n width: "long"\n });\n break;\n case "PPPP":\n default:\n a = r.dateTime({\n width: "full"\n });\n break;\n }\n return a.replace("{{date}}", LA(o, r)).replace("{{time}}", qg(i, r));\n}, AT = {\n p: qg,\n P: dT\n};\nconst f8 = AT;\nvar uT = ["D", "DD"], bT = ["YY", "YYYY"];\nfunction xg(e) {\n return uT.indexOf(e) !== -1;\n}\nfunction Rg(e) {\n return bT.indexOf(e) !== -1;\n}\nfunction Rl(e, t, r) {\n if (e === "YYYY")\n throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t, "`) for formatting years to the input `").concat(r, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));\n if (e === "YY")\n throw new RangeError("Use `yy` instead of `YY` (in `".concat(t, "`) for formatting years to the input `").concat(r, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));\n if (e === "D")\n throw new RangeError("Use `d` instead of `D` (in `".concat(t, "`) for formatting days of the month to the input `").concat(r, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));\n if (e === "DD")\n throw new RangeError("Use `dd` instead of `DD` (in `".concat(t, "`) for formatting days of the month to the input `").concat(r, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));\n}\nvar hT = {\n lessThanXSeconds: {\n one: "less than a second",\n other: "less than {{count}} seconds"\n },\n xSeconds: {\n one: "1 second",\n other: "{{count}} seconds"\n },\n halfAMinute: "half a minute",\n lessThanXMinutes: {\n one: "less than a minute",\n other: "less than {{count}} minutes"\n },\n xMinutes: {\n one: "1 minute",\n other: "{{count}} minutes"\n },\n aboutXHours: {\n one: "about 1 hour",\n other: "about {{count}} hours"\n },\n xHours: {\n one: "1 hour",\n other: "{{count}} hours"\n },\n xDays: {\n one: "1 day",\n other: "{{count}} days"\n },\n aboutXWeeks: {\n one: "about 1 week",\n other: "about {{count}} weeks"\n },\n xWeeks: {\n one: "1 week",\n other: "{{count}} weeks"\n },\n aboutXMonths: {\n one: "about 1 month",\n other: "about {{count}} months"\n },\n xMonths: {\n one: "1 month",\n other: "{{count}} months"\n },\n aboutXYears: {\n one: "about 1 year",\n other: "about {{count}} years"\n },\n xYears: {\n one: "1 year",\n other: "{{count}} years"\n },\n overXYears: {\n one: "over 1 year",\n other: "over {{count}} years"\n },\n almostXYears: {\n one: "almost 1 year",\n other: "almost {{count}} years"\n }\n}, MT = function(t, r, n) {\n var o, i = hT[t];\n return typeof i == "string" ? o = i : r === 1 ? o = i.one : o = i.other.replace("{{count}}", r.toString()), n != null && n.addSuffix ? n.comparison && n.comparison > 0 ? "in " + o : o + " ago" : o;\n};\nconst fT = MT;\nfunction L6(e) {\n return function() {\n var t = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, r = t.width ? String(t.width) : e.defaultWidth, n = e.formats[r] || e.formats[e.defaultWidth];\n return n;\n };\n}\nvar gT = {\n full: "EEEE, MMMM do, y",\n long: "MMMM do, y",\n medium: "MMM d, y",\n short: "MM/dd/yyyy"\n}, zT = {\n full: "h:mm:ss a zzzz",\n long: "h:mm:ss a z",\n medium: "h:mm:ss a",\n short: "h:mm a"\n}, CT = {\n full: "{{date}} \'at\' {{time}}",\n long: "{{date}} \'at\' {{time}}",\n medium: "{{date}}, {{time}}",\n short: "{{date}}, {{time}}"\n}, OT = {\n date: L6({\n formats: gT,\n defaultWidth: "full"\n }),\n time: L6({\n formats: zT,\n defaultWidth: "full"\n }),\n dateTime: L6({\n formats: CT,\n defaultWidth: "full"\n })\n};\nconst mT = OT;\nvar vT = {\n lastWeek: "\'last\' eeee \'at\' p",\n yesterday: "\'yesterday at\' p",\n today: "\'today at\' p",\n tomorrow: "\'tomorrow at\' p",\n nextWeek: "eeee \'at\' p",\n other: "P"\n}, yT = function(t, r, n, o) {\n return vT[t];\n};\nconst LT = yT;\nfunction g3(e) {\n return function(t, r) {\n var n = r != null && r.context ? String(r.context) : "standalone", o;\n if (n === "formatting" && e.formattingValues) {\n var i = e.defaultFormattingWidth || e.defaultWidth, a = r != null && r.width ? String(r.width) : i;\n o = e.formattingValues[a] || e.formattingValues[i];\n } else {\n var s = e.defaultWidth, l = r != null && r.width ? String(r.width) : e.defaultWidth;\n o = e.values[l] || e.values[s];\n }\n var c = e.argumentCallback ? e.argumentCallback(t) : t;\n return o[c];\n };\n}\nvar wT = {\n narrow: ["B", "A"],\n abbreviated: ["BC", "AD"],\n wide: ["Before Christ", "Anno Domini"]\n}, qT = {\n narrow: ["1", "2", "3", "4"],\n abbreviated: ["Q1", "Q2", "Q3", "Q4"],\n wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]\n}, xT = {\n narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],\n abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],\n wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]\n}, RT = {\n narrow: ["S", "M", "T", "W", "T", "F", "S"],\n short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],\n abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],\n wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]\n}, BT = {\n narrow: {\n am: "a",\n pm: "p",\n midnight: "mi",\n noon: "n",\n morning: "morning",\n afternoon: "afternoon",\n evening: "evening",\n night: "night"\n },\n abbreviated: {\n am: "AM",\n pm: "PM",\n midnight: "midnight",\n noon: "noon",\n morning: "morning",\n afternoon: "afternoon",\n evening: "evening",\n night: "night"\n },\n wide: {\n am: "a.m.",\n pm: "p.m.",\n midnight: "midnight",\n noon: "noon",\n morning: "morning",\n afternoon: "afternoon",\n evening: "evening",\n night: "night"\n }\n}, WT = {\n narrow: {\n am: "a",\n pm: "p",\n midnight: "mi",\n noon: "n",\n morning: "in the morning",\n afternoon: "in the afternoon",\n evening: "in the evening",\n night: "at night"\n },\n abbreviated: {\n am: "AM",\n pm: "PM",\n midnight: "midnight",\n noon: "noon",\n morning: "in the morning",\n afternoon: "in the afternoon",\n evening: "in the evening",\n night: "at night"\n },\n wide: {\n am: "a.m.",\n pm: "p.m.",\n midnight: "midnight",\n noon: "noon",\n morning: "in the morning",\n afternoon: "in the afternoon",\n evening: "in the evening",\n night: "at night"\n }\n}, ET = function(t, r) {\n var n = Number(t), o = n % 100;\n if (o > 20 || o < 10)\n switch (o % 10) {\n case 1:\n return n + "st";\n case 2:\n return n + "nd";\n case 3:\n return n + "rd";\n }\n return n + "th";\n}, ST = {\n ordinalNumber: ET,\n era: g3({\n values: wT,\n defaultWidth: "wide"\n }),\n quarter: g3({\n values: qT,\n defaultWidth: "wide",\n argumentCallback: function(t) {\n return t - 1;\n }\n }),\n month: g3({\n values: xT,\n defaultWidth: "wide"\n }),\n day: g3({\n values: RT,\n defaultWidth: "wide"\n }),\n dayPeriod: g3({\n values: BT,\n defaultWidth: "wide",\n formattingValues: WT,\n defaultFormattingWidth: "wide"\n })\n};\nconst kT = ST;\nfunction z3(e) {\n return function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = r.width, o = n && e.matchPatterns[n] || e.matchPatterns[e.defaultMatchWidth], i = t.match(o);\n if (!i)\n return null;\n var a = i[0], s = n && e.parsePatterns[n] || e.parsePatterns[e.defaultParseWidth], l = Array.isArray(s) ? IT(s, function(d) {\n return d.test(a);\n }) : NT(s, function(d) {\n return d.test(a);\n }), c;\n c = e.valueCallback ? e.valueCallback(l) : l, c = r.valueCallback ? r.valueCallback(c) : c;\n var p = t.slice(a.length);\n return {\n value: c,\n rest: p\n };\n };\n}\nfunction NT(e, t) {\n for (var r in e)\n if (e.hasOwnProperty(r) && t(e[r]))\n return r;\n}\nfunction IT(e, t) {\n for (var r = 0; r < e.length; r++)\n if (t(e[r]))\n return r;\n}\nfunction TT(e) {\n return function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, n = t.match(e.matchPattern);\n if (!n)\n return null;\n var o = n[0], i = t.match(e.parsePattern);\n if (!i)\n return null;\n var a = e.valueCallback ? e.valueCallback(i[0]) : i[0];\n a = r.valueCallback ? r.valueCallback(a) : a;\n var s = t.slice(o.length);\n return {\n value: a,\n rest: s\n };\n };\n}\nvar DT = /^(\\d+)(th|st|nd|rd)?/i, HT = /\\d+/i, PT = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i\n}, VT = {\n any: [/^b/i, /^(a|c)/i]\n}, FT = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i\n}, UT = {\n any: [/1/i, /2/i, /3/i, /4/i]\n}, YT = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n}, XT = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n}, QT = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n}, GT = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]\n}, jT = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n}, KT = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i\n }\n}, ZT = {\n ordinalNumber: TT({\n matchPattern: DT,\n parsePattern: HT,\n valueCallback: function(t) {\n return parseInt(t, 10);\n }\n }),\n era: z3({\n matchPatterns: PT,\n defaultMatchWidth: "wide",\n parsePatterns: VT,\n defaultParseWidth: "any"\n }),\n quarter: z3({\n matchPatterns: FT,\n defaultMatchWidth: "wide",\n parsePatterns: UT,\n defaultParseWidth: "any",\n valueCallback: function(t) {\n return t + 1;\n }\n }),\n month: z3({\n matchPatterns: YT,\n defaultMatchWidth: "wide",\n parsePatterns: XT,\n defaultParseWidth: "any"\n }),\n day: z3({\n matchPatterns: QT,\n defaultMatchWidth: "wide",\n parsePatterns: GT,\n defaultParseWidth: "any"\n }),\n dayPeriod: z3({\n matchPatterns: jT,\n defaultMatchWidth: "any",\n parsePatterns: KT,\n defaultParseWidth: "any"\n })\n};\nconst JT = ZT;\nvar _T = {\n code: "en-US",\n formatDistance: fT,\n formatLong: mT,\n formatRelative: LT,\n localize: kT,\n match: JT,\n options: {\n weekStartsOn: 0,\n firstWeekContainsDate: 1\n }\n};\nconst j7 = _T;\nvar $T = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|\'\'|\'(\'\'|[^\'])+(\'|$)|./g, eD = /P+p+|P+|p+|\'\'|\'(\'\'|[^\'])+(\'|$)|./g, tD = /^\'([^]*?)\'?$/, rD = /\'\'/g, nD = /[a-zA-Z]/;\nfunction h4(e, t, r) {\n var n, o, i, a, s, l, c, p, d, u, h, b, M, C, g, f, O, m;\n z0(2, arguments);\n var v = String(t), y = Ro(), z = (n = (o = r == null ? void 0 : r.locale) !== null && o !== void 0 ? o : y.locale) !== null && n !== void 0 ? n : j7, N = ie((i = (a = (s = (l = r == null ? void 0 : r.firstWeekContainsDate) !== null && l !== void 0 ? l : r == null || (c = r.locale) === null || c === void 0 || (p = c.options) === null || p === void 0 ? void 0 : p.firstWeekContainsDate) !== null && s !== void 0 ? s : y.firstWeekContainsDate) !== null && a !== void 0 ? a : (d = y.locale) === null || d === void 0 || (u = d.options) === null || u === void 0 ? void 0 : u.firstWeekContainsDate) !== null && i !== void 0 ? i : 1);\n if (!(N >= 1 && N <= 7))\n throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");\n var W = ie((h = (b = (M = (C = r == null ? void 0 : r.weekStartsOn) !== null && C !== void 0 ? C : r == null || (g = r.locale) === null || g === void 0 || (f = g.options) === null || f === void 0 ? void 0 : f.weekStartsOn) !== null && M !== void 0 ? M : y.weekStartsOn) !== null && b !== void 0 ? b : (O = y.locale) === null || O === void 0 || (m = O.options) === null || m === void 0 ? void 0 : m.weekStartsOn) !== null && h !== void 0 ? h : 0);\n if (!(W >= 0 && W <= 6))\n throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");\n if (!z.localize)\n throw new RangeError("locale must contain localize property");\n if (!z.formatLong)\n throw new RangeError("locale must contain formatLong property");\n var T = v0(e);\n if (!u4(T))\n throw new RangeError("Invalid time value");\n var x = va(T), E = vg(T, x), L = {\n firstWeekContainsDate: N,\n weekStartsOn: W,\n locale: z,\n _originalDate: T\n }, w = v.match(eD).map(function(q) {\n var S = q[0];\n if (S === "p" || S === "P") {\n var B = f8[S];\n return B(q, z.formatLong);\n }\n return q;\n }).join("").match($T).map(function(q) {\n if (q === "\'\'")\n return "\'";\n var S = q[0];\n if (S === "\'")\n return oD(q);\n var B = pT[S];\n if (B)\n return !(r != null && r.useAdditionalWeekYearTokens) && Rg(q) && Rl(q, t, String(e)), !(r != null && r.useAdditionalDayOfYearTokens) && xg(q) && Rl(q, t, String(e)), B(E, q, z.localize, L);\n if (S.match(nD))\n throw new RangeError("Format string contains an unescaped latin alphabet character `" + S + "`");\n return q;\n }).join("");\n return w;\n}\nfunction oD(e) {\n var t = e.match(tD);\n return t ? t[1].replace(rD, "\'") : e;\n}\nfunction K7(e, t) {\n if (e == null)\n throw new TypeError("assign requires that input parameter not be null or undefined");\n for (var r in t)\n Object.prototype.hasOwnProperty.call(t, r) && (e[r] = t[r]);\n return e;\n}\nfunction iD(e) {\n return K7({}, e);\n}\nvar wA = 1440, aD = 2520, w6 = 43200, sD = 86400;\nfunction lD(e, t, r) {\n var n, o;\n z0(2, arguments);\n var i = Ro(), a = (n = (o = r == null ? void 0 : r.locale) !== null && o !== void 0 ? o : i.locale) !== null && n !== void 0 ? n : j7;\n if (!a.formatDistance)\n throw new RangeError("locale must contain formatDistance property");\n var s = X5(e, t);\n if (isNaN(s))\n throw new RangeError("Invalid time value");\n var l = K7(iD(r), {\n addSuffix: !!(r != null && r.addSuffix),\n comparison: s\n }), c, p;\n s > 0 ? (c = v0(t), p = v0(e)) : (c = v0(e), p = v0(t));\n var d = eT(p, c), u = (va(p) - va(c)) / 1e3, h = Math.round((d - u) / 60), b;\n if (h < 2)\n return r != null && r.includeSeconds ? d < 5 ? a.formatDistance("lessThanXSeconds", 5, l) : d < 10 ? a.formatDistance("lessThanXSeconds", 10, l) : d < 20 ? a.formatDistance("lessThanXSeconds", 20, l) : d < 40 ? a.formatDistance("halfAMinute", 0, l) : d < 60 ? a.formatDistance("lessThanXMinutes", 1, l) : a.formatDistance("xMinutes", 1, l) : h === 0 ? a.formatDistance("lessThanXMinutes", 1, l) : a.formatDistance("xMinutes", h, l);\n if (h < 45)\n return a.formatDistance("xMinutes", h, l);\n if (h < 90)\n return a.formatDistance("aboutXHours", 1, l);\n if (h < wA) {\n var M = Math.round(h / 60);\n return a.formatDistance("aboutXHours", M, l);\n } else {\n if (h < aD)\n return a.formatDistance("xDays", 1, l);\n if (h < w6) {\n var C = Math.round(h / wA);\n return a.formatDistance("xDays", C, l);\n } else if (h < sD)\n return b = Math.round(h / w6), a.formatDistance("aboutXMonths", b, l);\n }\n if (b = $I(p, c), b < 12) {\n var g = Math.round(h / w6);\n return a.formatDistance("xMonths", g, l);\n } else {\n var f = b % 12, O = Math.floor(b / 12);\n return f < 3 ? a.formatDistance("aboutXYears", O, l) : f < 9 ? a.formatDistance("overXYears", O, l) : a.formatDistance("almostXYears", O + 1, l);\n }\n}\nfunction Bg(e, t) {\n return z0(1, arguments), lD(e, Date.now(), t);\n}\nfunction qA(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getDate();\n return r;\n}\nfunction cD(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getDay();\n return r;\n}\nfunction pD(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getFullYear(), n = t.getMonth(), o = /* @__PURE__ */ new Date(0);\n return o.setFullYear(r, n + 1, 0), o.setHours(0, 0, 0, 0), o.getDate();\n}\nfunction Qr(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getHours();\n return r;\n}\nvar dD = 6048e5;\nfunction AD(e) {\n z0(1, arguments);\n var t = v0(e), r = yl(t).getTime() - YI(t).getTime();\n return Math.round(r / dD) + 1;\n}\nfunction Gr(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getMinutes();\n return r;\n}\nfunction Dt(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getMonth();\n return r;\n}\nfunction xA(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getSeconds();\n return r;\n}\nfunction g8(e) {\n z0(1, arguments);\n var t = v0(e), r = t.getTime();\n return r;\n}\nfunction oe(e) {\n return z0(1, arguments), v0(e).getFullYear();\n}\nfunction zo(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getTime() > n.getTime();\n}\nfunction ro(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getTime() < n.getTime();\n}\nfunction uD(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getTime() === n.getTime();\n}\nfunction RA(e, t) {\n (t == null || t > e.length) && (t = e.length);\n for (var r = 0, n = Array(t); r < t; r++)\n n[r] = e[r];\n return n;\n}\nfunction bD(e, t) {\n if (e) {\n if (typeof e == "string")\n return RA(e, t);\n var r = {}.toString.call(e).slice(8, -1);\n return r === "Object" && e.constructor && (r = e.constructor.name), r === "Map" || r === "Set" ? Array.from(e) : r === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? RA(e, t) : void 0;\n }\n}\nfunction BA(e, t) {\n var r = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"];\n if (!r) {\n if (Array.isArray(e) || (r = bD(e)) || t && e && typeof e.length == "number") {\n r && (e = r);\n var n = 0, o = function() {\n };\n return {\n s: o,\n n: function() {\n return n >= e.length ? {\n done: !0\n } : {\n done: !1,\n value: e[n++]\n };\n },\n e: function(c) {\n throw c;\n },\n f: o\n };\n }\n throw new TypeError(`Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);\n }\n var i, a = !0, s = !1;\n return {\n s: function() {\n r = r.call(e);\n },\n n: function() {\n var c = r.next();\n return a = c.done, c;\n },\n e: function(c) {\n s = !0, i = c;\n },\n f: function() {\n try {\n a || r.return == null || r.return();\n } finally {\n if (s)\n throw i;\n }\n }\n };\n}\nfunction B0(e) {\n if (e === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return e;\n}\nfunction me(e, t) {\n if (typeof t != "function" && t !== null)\n throw new TypeError("Super expression must either be null or a function");\n e.prototype = Object.create(t && t.prototype, {\n constructor: {\n value: e,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(e, "prototype", {\n writable: !1\n }), t && ml(e, t);\n}\nfunction Bl(e) {\n return Bl = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, Bl(e);\n}\nfunction Wg() {\n try {\n var e = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n }));\n } catch {\n }\n return (Wg = function() {\n return !!e;\n })();\n}\nfunction hD(e, t) {\n if (t && (ir(t) == "object" || typeof t == "function"))\n return t;\n if (t !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return B0(e);\n}\nfunction ve(e) {\n var t = Wg();\n return function() {\n var r, n = Bl(e);\n if (t) {\n var o = Bl(this).constructor;\n r = Reflect.construct(n, arguments, o);\n } else\n r = n.apply(this, arguments);\n return hD(this, r);\n };\n}\nfunction Ae(e, t) {\n if (!(e instanceof t))\n throw new TypeError("Cannot call a class as a function");\n}\nfunction MD(e, t) {\n if (ir(e) != "object" || !e)\n return e;\n var r = e[Symbol.toPrimitive];\n if (r !== void 0) {\n var n = r.call(e, t || "default");\n if (ir(n) != "object")\n return n;\n throw new TypeError("@@toPrimitive must return a primitive value.");\n }\n return (t === "string" ? String : Number)(e);\n}\nfunction Eg(e) {\n var t = MD(e, "string");\n return ir(t) == "symbol" ? t : t + "";\n}\nfunction WA(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, Eg(n.key), n);\n }\n}\nfunction ue(e, t, r) {\n return t && WA(e.prototype, t), r && WA(e, r), Object.defineProperty(e, "prototype", {\n writable: !1\n }), e;\n}\nfunction w0(e, t, r) {\n return (t = Eg(t)) in e ? Object.defineProperty(e, t, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = r, e;\n}\nvar fD = 10, Sg = /* @__PURE__ */ function() {\n function e() {\n Ae(this, e), w0(this, "priority", void 0), w0(this, "subPriority", 0);\n }\n return ue(e, [{\n key: "validate",\n value: function(r, n) {\n return !0;\n }\n }]), e;\n}(), gD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r(n, o, i, a, s) {\n var l;\n return Ae(this, r), l = t.call(this), l.value = n, l.validateValue = o, l.setValue = i, l.priority = a, s && (l.subPriority = s), l;\n }\n return ue(r, [{\n key: "validate",\n value: function(o, i) {\n return this.validateValue(o, this.value, i);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return this.setValue(o, i, this.value, a);\n }\n }]), r;\n}(Sg), zD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", fD), w0(B0(n), "subPriority", -1), n;\n }\n return ue(r, [{\n key: "set",\n value: function(o, i) {\n if (i.timestampIsSet)\n return o;\n var a = /* @__PURE__ */ new Date(0);\n return a.setFullYear(o.getUTCFullYear(), o.getUTCMonth(), o.getUTCDate()), a.setHours(o.getUTCHours(), o.getUTCMinutes(), o.getUTCSeconds(), o.getUTCMilliseconds()), a;\n }\n }]), r;\n}(Sg), Re = /* @__PURE__ */ function() {\n function e() {\n Ae(this, e), w0(this, "incompatibleTokens", void 0), w0(this, "priority", void 0), w0(this, "subPriority", void 0);\n }\n return ue(e, [{\n key: "run",\n value: function(r, n, o, i) {\n var a = this.parse(r, n, o, i);\n return a ? {\n setter: new gD(a.value, this.validate, this.set, this.priority, this.subPriority),\n rest: a.rest\n } : null;\n }\n }, {\n key: "validate",\n value: function(r, n, o) {\n return !0;\n }\n }]), e;\n}(), CD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 140), w0(B0(n), "incompatibleTokens", ["R", "u", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "G":\n case "GG":\n case "GGG":\n return a.era(o, {\n width: "abbreviated"\n }) || a.era(o, {\n width: "narrow"\n });\n case "GGGGG":\n return a.era(o, {\n width: "narrow"\n });\n case "GGGG":\n default:\n return a.era(o, {\n width: "wide"\n }) || a.era(o, {\n width: "abbreviated"\n }) || a.era(o, {\n width: "narrow"\n });\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return i.era = a, o.setUTCFullYear(a, 0, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), Mt = {\n month: /^(1[0-2]|0?\\d)/,\n // 0 to 12\n date: /^(3[0-1]|[0-2]?\\d)/,\n // 0 to 31\n dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/,\n // 0 to 366\n week: /^(5[0-3]|[0-4]?\\d)/,\n // 0 to 53\n hour23h: /^(2[0-3]|[0-1]?\\d)/,\n // 0 to 23\n hour24h: /^(2[0-4]|[0-1]?\\d)/,\n // 0 to 24\n hour11h: /^(1[0-1]|0?\\d)/,\n // 0 to 11\n hour12h: /^(1[0-2]|0?\\d)/,\n // 0 to 12\n minute: /^[0-5]?\\d/,\n // 0 to 59\n second: /^[0-5]?\\d/,\n // 0 to 59\n singleDigit: /^\\d/,\n // 0 to 9\n twoDigits: /^\\d{1,2}/,\n // 0 to 99\n threeDigits: /^\\d{1,3}/,\n // 0 to 999\n fourDigits: /^\\d{1,4}/,\n // 0 to 9999\n anyDigitsSigned: /^-?\\d+/,\n singleDigitSigned: /^-?\\d/,\n // 0 to 9, -0 to -9\n twoDigitsSigned: /^-?\\d{1,2}/,\n // 0 to 99, -0 to -99\n threeDigitsSigned: /^-?\\d{1,3}/,\n // 0 to 999, -0 to -999\n fourDigitsSigned: /^-?\\d{1,4}/\n // 0 to 9999, -0 to -9999\n}, Tr = {\n basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/\n};\nfunction ft(e, t) {\n return e && {\n value: t(e.value),\n rest: e.rest\n };\n}\nfunction it(e, t) {\n var r = t.match(e);\n return r ? {\n value: parseInt(r[0], 10),\n rest: t.slice(r[0].length)\n } : null;\n}\nfunction Dr(e, t) {\n var r = t.match(e);\n if (!r)\n return null;\n if (r[0] === "Z")\n return {\n value: 0,\n rest: t.slice(1)\n };\n var n = r[1] === "+" ? 1 : -1, o = r[2] ? parseInt(r[2], 10) : 0, i = r[3] ? parseInt(r[3], 10) : 0, a = r[5] ? parseInt(r[5], 10) : 0;\n return {\n value: n * (o * Q7 + i * X7 + a * GI),\n rest: t.slice(r[0].length)\n };\n}\nfunction kg(e) {\n return it(Mt.anyDigitsSigned, e);\n}\nfunction pt(e, t) {\n switch (e) {\n case 1:\n return it(Mt.singleDigit, t);\n case 2:\n return it(Mt.twoDigits, t);\n case 3:\n return it(Mt.threeDigits, t);\n case 4:\n return it(Mt.fourDigits, t);\n default:\n return it(new RegExp("^\\\\d{1," + e + "}"), t);\n }\n}\nfunction Wl(e, t) {\n switch (e) {\n case 1:\n return it(Mt.singleDigitSigned, t);\n case 2:\n return it(Mt.twoDigitsSigned, t);\n case 3:\n return it(Mt.threeDigitsSigned, t);\n case 4:\n return it(Mt.fourDigitsSigned, t);\n default:\n return it(new RegExp("^-?\\\\d{1," + e + "}"), t);\n }\n}\nfunction Z7(e) {\n switch (e) {\n case "morning":\n return 4;\n case "evening":\n return 17;\n case "pm":\n case "noon":\n case "afternoon":\n return 12;\n case "am":\n case "midnight":\n case "night":\n default:\n return 0;\n }\n}\nfunction Ng(e, t) {\n var r = t > 0, n = r ? t : 1 - t, o;\n if (n <= 50)\n o = e || 100;\n else {\n var i = n + 50, a = Math.floor(i / 100) * 100, s = e >= i % 100;\n o = e + a - (s ? 100 : 0);\n }\n return r ? o : 1 - o;\n}\nfunction Ig(e) {\n return e % 400 === 0 || e % 4 === 0 && e % 100 !== 0;\n}\nvar OD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 130), w0(B0(n), "incompatibleTokens", ["Y", "R", "u", "w", "I", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n var s = function(c) {\n return {\n year: c,\n isTwoDigitYear: i === "yy"\n };\n };\n switch (i) {\n case "y":\n return ft(pt(4, o), s);\n case "yo":\n return ft(a.ordinalNumber(o, {\n unit: "year"\n }), s);\n default:\n return ft(pt(i.length, o), s);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i.isTwoDigitYear || i.year > 0;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n var s = o.getUTCFullYear();\n if (a.isTwoDigitYear) {\n var l = Ng(a.year, s);\n return o.setUTCFullYear(l, 0, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n var c = !("era" in i) || i.era === 1 ? a.year : 1 - a.year;\n return o.setUTCFullYear(c, 0, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), mD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 130), w0(B0(n), "incompatibleTokens", ["y", "R", "u", "Q", "q", "M", "L", "I", "d", "D", "i", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n var s = function(c) {\n return {\n year: c,\n isTwoDigitYear: i === "YY"\n };\n };\n switch (i) {\n case "Y":\n return ft(pt(4, o), s);\n case "Yo":\n return ft(a.ordinalNumber(o, {\n unit: "year"\n }), s);\n default:\n return ft(pt(i.length, o), s);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i.isTwoDigitYear || i.year > 0;\n }\n }, {\n key: "set",\n value: function(o, i, a, s) {\n var l = G7(o, s);\n if (a.isTwoDigitYear) {\n var c = Ng(a.year, l);\n return o.setUTCFullYear(c, 0, s.firstWeekContainsDate), o.setUTCHours(0, 0, 0, 0), bi(o, s);\n }\n var p = !("era" in i) || i.era === 1 ? a.year : 1 - a.year;\n return o.setUTCFullYear(p, 0, s.firstWeekContainsDate), o.setUTCHours(0, 0, 0, 0), bi(o, s);\n }\n }]), r;\n}(Re), vD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 130), w0(B0(n), "incompatibleTokens", ["G", "y", "Y", "u", "Q", "q", "M", "L", "w", "d", "D", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i) {\n return Wl(i === "R" ? 4 : i.length, o);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n var s = /* @__PURE__ */ new Date(0);\n return s.setUTCFullYear(a, 0, 4), s.setUTCHours(0, 0, 0, 0), La(s);\n }\n }]), r;\n}(Re), yD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 130), w0(B0(n), "incompatibleTokens", ["G", "y", "Y", "R", "w", "I", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i) {\n return Wl(i === "u" ? 4 : i.length, o);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCFullYear(a, 0, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), LD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 120), w0(B0(n), "incompatibleTokens", ["Y", "R", "q", "M", "L", "w", "I", "d", "D", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "Q":\n case "QQ":\n return pt(i.length, o);\n case "Qo":\n return a.ordinalNumber(o, {\n unit: "quarter"\n });\n case "QQQ":\n return a.quarter(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.quarter(o, {\n width: "narrow",\n context: "formatting"\n });\n case "QQQQQ":\n return a.quarter(o, {\n width: "narrow",\n context: "formatting"\n });\n case "QQQQ":\n default:\n return a.quarter(o, {\n width: "wide",\n context: "formatting"\n }) || a.quarter(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.quarter(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 4;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMonth((a - 1) * 3, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), wD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 120), w0(B0(n), "incompatibleTokens", ["Y", "R", "Q", "M", "L", "w", "I", "d", "D", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "q":\n case "qq":\n return pt(i.length, o);\n case "qo":\n return a.ordinalNumber(o, {\n unit: "quarter"\n });\n case "qqq":\n return a.quarter(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.quarter(o, {\n width: "narrow",\n context: "standalone"\n });\n case "qqqqq":\n return a.quarter(o, {\n width: "narrow",\n context: "standalone"\n });\n case "qqqq":\n default:\n return a.quarter(o, {\n width: "wide",\n context: "standalone"\n }) || a.quarter(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.quarter(o, {\n width: "narrow",\n context: "standalone"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 4;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMonth((a - 1) * 3, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), qD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "incompatibleTokens", ["Y", "R", "q", "Q", "L", "w", "I", "D", "i", "e", "c", "t", "T"]), w0(B0(n), "priority", 110), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n var s = function(c) {\n return c - 1;\n };\n switch (i) {\n case "M":\n return ft(it(Mt.month, o), s);\n case "MM":\n return ft(pt(2, o), s);\n case "Mo":\n return ft(a.ordinalNumber(o, {\n unit: "month"\n }), s);\n case "MMM":\n return a.month(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.month(o, {\n width: "narrow",\n context: "formatting"\n });\n case "MMMMM":\n return a.month(o, {\n width: "narrow",\n context: "formatting"\n });\n case "MMMM":\n default:\n return a.month(o, {\n width: "wide",\n context: "formatting"\n }) || a.month(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.month(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 11;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMonth(a, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), xD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 110), w0(B0(n), "incompatibleTokens", ["Y", "R", "q", "Q", "M", "w", "I", "D", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n var s = function(c) {\n return c - 1;\n };\n switch (i) {\n case "L":\n return ft(it(Mt.month, o), s);\n case "LL":\n return ft(pt(2, o), s);\n case "Lo":\n return ft(a.ordinalNumber(o, {\n unit: "month"\n }), s);\n case "LLL":\n return a.month(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.month(o, {\n width: "narrow",\n context: "standalone"\n });\n case "LLLLL":\n return a.month(o, {\n width: "narrow",\n context: "standalone"\n });\n case "LLLL":\n default:\n return a.month(o, {\n width: "wide",\n context: "standalone"\n }) || a.month(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.month(o, {\n width: "narrow",\n context: "standalone"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 11;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMonth(a, 1), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re);\nfunction RD(e, t, r) {\n z0(2, arguments);\n var n = v0(e), o = ie(t), i = wg(n, r) - o;\n return n.setUTCDate(n.getUTCDate() - i * 7), n;\n}\nvar BD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 100), w0(B0(n), "incompatibleTokens", ["y", "R", "u", "q", "Q", "M", "L", "I", "d", "D", "i", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "w":\n return it(Mt.week, o);\n case "wo":\n return a.ordinalNumber(o, {\n unit: "week"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 53;\n }\n }, {\n key: "set",\n value: function(o, i, a, s) {\n return bi(RD(o, a, s), s);\n }\n }]), r;\n}(Re);\nfunction WD(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t), o = Lg(r) - n;\n return r.setUTCDate(r.getUTCDate() - o * 7), r;\n}\nvar ED = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 100), w0(B0(n), "incompatibleTokens", ["y", "Y", "u", "q", "Q", "M", "L", "w", "d", "D", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "I":\n return it(Mt.week, o);\n case "Io":\n return a.ordinalNumber(o, {\n unit: "week"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 53;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return La(WD(o, a));\n }\n }]), r;\n}(Re), SD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], kD = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], ND = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "subPriority", 1), w0(B0(n), "incompatibleTokens", ["Y", "R", "q", "Q", "w", "I", "D", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "d":\n return it(Mt.date, o);\n case "do":\n return a.ordinalNumber(o, {\n unit: "date"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n var a = o.getUTCFullYear(), s = Ig(a), l = o.getUTCMonth();\n return s ? i >= 1 && i <= kD[l] : i >= 1 && i <= SD[l];\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCDate(a), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), ID = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "subpriority", 1), w0(B0(n), "incompatibleTokens", ["Y", "R", "q", "Q", "M", "L", "w", "I", "d", "E", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "D":\n case "DD":\n return it(Mt.dayOfYear, o);\n case "Do":\n return a.ordinalNumber(o, {\n unit: "date"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n var a = o.getUTCFullYear(), s = Ig(a);\n return s ? i >= 1 && i <= 366 : i >= 1 && i <= 365;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMonth(0, a), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re);\nfunction J7(e, t, r) {\n var n, o, i, a, s, l, c, p;\n z0(2, arguments);\n var d = Ro(), u = ie((n = (o = (i = (a = r == null ? void 0 : r.weekStartsOn) !== null && a !== void 0 ? a : r == null || (s = r.locale) === null || s === void 0 || (l = s.options) === null || l === void 0 ? void 0 : l.weekStartsOn) !== null && i !== void 0 ? i : d.weekStartsOn) !== null && o !== void 0 ? o : (c = d.locale) === null || c === void 0 || (p = c.options) === null || p === void 0 ? void 0 : p.weekStartsOn) !== null && n !== void 0 ? n : 0);\n if (!(u >= 0 && u <= 6))\n throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");\n var h = v0(e), b = ie(t), M = h.getUTCDay(), C = b % 7, g = (C + 7) % 7, f = (g < u ? 7 : 0) + b - M;\n return h.setUTCDate(h.getUTCDate() + f), h;\n}\nvar TD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "incompatibleTokens", ["D", "i", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "E":\n case "EE":\n case "EEE":\n return a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "EEEEE":\n return a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "EEEEEE":\n return a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "EEEE":\n default:\n return a.day(o, {\n width: "wide",\n context: "formatting"\n }) || a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 6;\n }\n }, {\n key: "set",\n value: function(o, i, a, s) {\n return o = J7(o, a, s), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), DD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "incompatibleTokens", ["y", "R", "u", "q", "Q", "M", "L", "I", "d", "D", "E", "i", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a, s) {\n var l = function(p) {\n var d = Math.floor((p - 1) / 7) * 7;\n return (p + s.weekStartsOn + 6) % 7 + d;\n };\n switch (i) {\n case "e":\n case "ee":\n return ft(pt(i.length, o), l);\n case "eo":\n return ft(a.ordinalNumber(o, {\n unit: "day"\n }), l);\n case "eee":\n return a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "eeeee":\n return a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "eeeeee":\n return a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n case "eeee":\n default:\n return a.day(o, {\n width: "wide",\n context: "formatting"\n }) || a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 6;\n }\n }, {\n key: "set",\n value: function(o, i, a, s) {\n return o = J7(o, a, s), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), HD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "incompatibleTokens", ["y", "R", "u", "q", "Q", "M", "L", "I", "d", "D", "E", "i", "e", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a, s) {\n var l = function(p) {\n var d = Math.floor((p - 1) / 7) * 7;\n return (p + s.weekStartsOn + 6) % 7 + d;\n };\n switch (i) {\n case "c":\n case "cc":\n return ft(pt(i.length, o), l);\n case "co":\n return ft(a.ordinalNumber(o, {\n unit: "day"\n }), l);\n case "ccc":\n return a.day(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.day(o, {\n width: "short",\n context: "standalone"\n }) || a.day(o, {\n width: "narrow",\n context: "standalone"\n });\n case "ccccc":\n return a.day(o, {\n width: "narrow",\n context: "standalone"\n });\n case "cccccc":\n return a.day(o, {\n width: "short",\n context: "standalone"\n }) || a.day(o, {\n width: "narrow",\n context: "standalone"\n });\n case "cccc":\n default:\n return a.day(o, {\n width: "wide",\n context: "standalone"\n }) || a.day(o, {\n width: "abbreviated",\n context: "standalone"\n }) || a.day(o, {\n width: "short",\n context: "standalone"\n }) || a.day(o, {\n width: "narrow",\n context: "standalone"\n });\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 6;\n }\n }, {\n key: "set",\n value: function(o, i, a, s) {\n return o = J7(o, a, s), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re);\nfunction PD(e, t) {\n z0(2, arguments);\n var r = ie(t);\n r % 7 === 0 && (r = r - 7);\n var n = 1, o = v0(e), i = o.getUTCDay(), a = r % 7, s = (a + 7) % 7, l = (s < n ? 7 : 0) + r - i;\n return o.setUTCDate(o.getUTCDate() + l), o;\n}\nvar VD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 90), w0(B0(n), "incompatibleTokens", ["y", "Y", "u", "q", "Q", "M", "L", "w", "d", "D", "E", "e", "c", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n var s = function(c) {\n return c === 0 ? 7 : c;\n };\n switch (i) {\n case "i":\n case "ii":\n return pt(i.length, o);\n case "io":\n return a.ordinalNumber(o, {\n unit: "day"\n });\n case "iii":\n return ft(a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n }), s);\n case "iiiii":\n return ft(a.day(o, {\n width: "narrow",\n context: "formatting"\n }), s);\n case "iiiiii":\n return ft(a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n }), s);\n case "iiii":\n default:\n return ft(a.day(o, {\n width: "wide",\n context: "formatting"\n }) || a.day(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.day(o, {\n width: "short",\n context: "formatting"\n }) || a.day(o, {\n width: "narrow",\n context: "formatting"\n }), s);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 7;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o = PD(o, a), o.setUTCHours(0, 0, 0, 0), o;\n }\n }]), r;\n}(Re), FD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 80), w0(B0(n), "incompatibleTokens", ["b", "B", "H", "k", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "a":\n case "aa":\n case "aaa":\n return a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "aaaaa":\n return a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "aaaa":\n default:\n return a.dayPeriod(o, {\n width: "wide",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCHours(Z7(a), 0, 0, 0), o;\n }\n }]), r;\n}(Re), UD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 80), w0(B0(n), "incompatibleTokens", ["a", "B", "H", "k", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "b":\n case "bb":\n case "bbb":\n return a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "bbbbb":\n return a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "bbbb":\n default:\n return a.dayPeriod(o, {\n width: "wide",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCHours(Z7(a), 0, 0, 0), o;\n }\n }]), r;\n}(Re), YD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 80), w0(B0(n), "incompatibleTokens", ["a", "b", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "B":\n case "BB":\n case "BBB":\n return a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "BBBBB":\n return a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n case "BBBB":\n default:\n return a.dayPeriod(o, {\n width: "wide",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "abbreviated",\n context: "formatting"\n }) || a.dayPeriod(o, {\n width: "narrow",\n context: "formatting"\n });\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCHours(Z7(a), 0, 0, 0), o;\n }\n }]), r;\n}(Re), XD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 70), w0(B0(n), "incompatibleTokens", ["H", "K", "k", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "h":\n return it(Mt.hour12h, o);\n case "ho":\n return a.ordinalNumber(o, {\n unit: "hour"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 12;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n var s = o.getUTCHours() >= 12;\n return s && a < 12 ? o.setUTCHours(a + 12, 0, 0, 0) : !s && a === 12 ? o.setUTCHours(0, 0, 0, 0) : o.setUTCHours(a, 0, 0, 0), o;\n }\n }]), r;\n}(Re), QD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 70), w0(B0(n), "incompatibleTokens", ["a", "b", "h", "K", "k", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "H":\n return it(Mt.hour23h, o);\n case "Ho":\n return a.ordinalNumber(o, {\n unit: "hour"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 23;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCHours(a, 0, 0, 0), o;\n }\n }]), r;\n}(Re), GD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 70), w0(B0(n), "incompatibleTokens", ["h", "H", "k", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "K":\n return it(Mt.hour11h, o);\n case "Ko":\n return a.ordinalNumber(o, {\n unit: "hour"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 11;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n var s = o.getUTCHours() >= 12;\n return s && a < 12 ? o.setUTCHours(a + 12, 0, 0, 0) : o.setUTCHours(a, 0, 0, 0), o;\n }\n }]), r;\n}(Re), jD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 70), w0(B0(n), "incompatibleTokens", ["a", "b", "h", "H", "K", "t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "k":\n return it(Mt.hour24h, o);\n case "ko":\n return a.ordinalNumber(o, {\n unit: "hour"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 1 && i <= 24;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n var s = a <= 24 ? a % 24 : a;\n return o.setUTCHours(s, 0, 0, 0), o;\n }\n }]), r;\n}(Re), KD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 60), w0(B0(n), "incompatibleTokens", ["t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "m":\n return it(Mt.minute, o);\n case "mo":\n return a.ordinalNumber(o, {\n unit: "minute"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 59;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMinutes(a, 0, 0), o;\n }\n }]), r;\n}(Re), ZD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 50), w0(B0(n), "incompatibleTokens", ["t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i, a) {\n switch (i) {\n case "s":\n return it(Mt.second, o);\n case "so":\n return a.ordinalNumber(o, {\n unit: "second"\n });\n default:\n return pt(i.length, o);\n }\n }\n }, {\n key: "validate",\n value: function(o, i) {\n return i >= 0 && i <= 59;\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCSeconds(a, 0), o;\n }\n }]), r;\n}(Re), JD = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 30), w0(B0(n), "incompatibleTokens", ["t", "T"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i) {\n var a = function(l) {\n return Math.floor(l * Math.pow(10, -i.length + 3));\n };\n return ft(pt(i.length, o), a);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return o.setUTCMilliseconds(a), o;\n }\n }]), r;\n}(Re), _D = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 10), w0(B0(n), "incompatibleTokens", ["t", "T", "x"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i) {\n switch (i) {\n case "X":\n return Dr(Tr.basicOptionalMinutes, o);\n case "XX":\n return Dr(Tr.basic, o);\n case "XXXX":\n return Dr(Tr.basicOptionalSeconds, o);\n case "XXXXX":\n return Dr(Tr.extendedOptionalSeconds, o);\n case "XXX":\n default:\n return Dr(Tr.extended, o);\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return i.timestampIsSet ? o : new Date(o.getTime() - a);\n }\n }]), r;\n}(Re), $D = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 10), w0(B0(n), "incompatibleTokens", ["t", "T", "X"]), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o, i) {\n switch (i) {\n case "x":\n return Dr(Tr.basicOptionalMinutes, o);\n case "xx":\n return Dr(Tr.basic, o);\n case "xxxx":\n return Dr(Tr.basicOptionalSeconds, o);\n case "xxxxx":\n return Dr(Tr.extendedOptionalSeconds, o);\n case "xxx":\n default:\n return Dr(Tr.extended, o);\n }\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return i.timestampIsSet ? o : new Date(o.getTime() - a);\n }\n }]), r;\n}(Re), eH = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 40), w0(B0(n), "incompatibleTokens", "*"), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o) {\n return kg(o);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return [new Date(a * 1e3), {\n timestampIsSet: !0\n }];\n }\n }]), r;\n}(Re), tH = /* @__PURE__ */ function(e) {\n me(r, e);\n var t = ve(r);\n function r() {\n var n;\n Ae(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = t.call.apply(t, [this].concat(i)), w0(B0(n), "priority", 20), w0(B0(n), "incompatibleTokens", "*"), n;\n }\n return ue(r, [{\n key: "parse",\n value: function(o) {\n return kg(o);\n }\n }, {\n key: "set",\n value: function(o, i, a) {\n return [new Date(a), {\n timestampIsSet: !0\n }];\n }\n }]), r;\n}(Re), rH = {\n G: new CD(),\n y: new OD(),\n Y: new mD(),\n R: new vD(),\n u: new yD(),\n Q: new LD(),\n q: new wD(),\n M: new qD(),\n L: new xD(),\n w: new BD(),\n I: new ED(),\n d: new ND(),\n D: new ID(),\n E: new TD(),\n e: new DD(),\n c: new HD(),\n i: new VD(),\n a: new FD(),\n b: new UD(),\n B: new YD(),\n h: new XD(),\n H: new QD(),\n K: new GD(),\n k: new jD(),\n m: new KD(),\n s: new ZD(),\n S: new JD(),\n X: new _D(),\n x: new $D(),\n t: new eH(),\n T: new tH()\n}, nH = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|\'\'|\'(\'\'|[^\'])+(\'|$)|./g, oH = /P+p+|P+|p+|\'\'|\'(\'\'|[^\'])+(\'|$)|./g, iH = /^\'([^]*?)\'?$/, aH = /\'\'/g, sH = /\\S/, lH = /[a-zA-Z]/;\nfunction q6(e, t, r, n) {\n var o, i, a, s, l, c, p, d, u, h, b, M, C, g, f, O, m, v;\n z0(3, arguments);\n var y = String(e), z = String(t), N = Ro(), W = (o = (i = n == null ? void 0 : n.locale) !== null && i !== void 0 ? i : N.locale) !== null && o !== void 0 ? o : j7;\n if (!W.match)\n throw new RangeError("locale must contain match property");\n var T = ie((a = (s = (l = (c = n == null ? void 0 : n.firstWeekContainsDate) !== null && c !== void 0 ? c : n == null || (p = n.locale) === null || p === void 0 || (d = p.options) === null || d === void 0 ? void 0 : d.firstWeekContainsDate) !== null && l !== void 0 ? l : N.firstWeekContainsDate) !== null && s !== void 0 ? s : (u = N.locale) === null || u === void 0 || (h = u.options) === null || h === void 0 ? void 0 : h.firstWeekContainsDate) !== null && a !== void 0 ? a : 1);\n if (!(T >= 1 && T <= 7))\n throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");\n var x = ie((b = (M = (C = (g = n == null ? void 0 : n.weekStartsOn) !== null && g !== void 0 ? g : n == null || (f = n.locale) === null || f === void 0 || (O = f.options) === null || O === void 0 ? void 0 : O.weekStartsOn) !== null && C !== void 0 ? C : N.weekStartsOn) !== null && M !== void 0 ? M : (m = N.locale) === null || m === void 0 || (v = m.options) === null || v === void 0 ? void 0 : v.weekStartsOn) !== null && b !== void 0 ? b : 0);\n if (!(x >= 0 && x <= 6))\n throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");\n if (z === "")\n return y === "" ? v0(r) : /* @__PURE__ */ new Date(NaN);\n var E = {\n firstWeekContainsDate: T,\n weekStartsOn: x,\n locale: W\n }, L = [new zD()], w = z.match(oH).map(function(D) {\n var H = D[0];\n if (H in f8) {\n var G = f8[H];\n return G(D, W.formatLong);\n }\n return D;\n }).join("").match(nH), q = [], S = BA(w), B;\n try {\n var I = function() {\n var H = B.value;\n !(n != null && n.useAdditionalWeekYearTokens) && Rg(H) && Rl(H, z, e), !(n != null && n.useAdditionalDayOfYearTokens) && xg(H) && Rl(H, z, e);\n var G = H[0], J = rH[G];\n if (J) {\n var F = J.incompatibleTokens;\n if (Array.isArray(F)) {\n var V = q.find(function(Z) {\n return F.includes(Z.token) || Z.token === G;\n });\n if (V)\n throw new RangeError("The format string mustn\'t contain `".concat(V.fullToken, "` and `").concat(H, "` at the same time"));\n } else if (J.incompatibleTokens === "*" && q.length > 0)\n throw new RangeError("The format string mustn\'t contain `".concat(H, "` and any other token at the same time"));\n q.push({\n token: G,\n fullToken: H\n });\n var Q = J.run(y, H, W.match, E);\n if (!Q)\n return {\n v: /* @__PURE__ */ new Date(NaN)\n };\n L.push(Q.setter), y = Q.rest;\n } else {\n if (G.match(lH))\n throw new RangeError("Format string contains an unescaped latin alphabet character `" + G + "`");\n if (H === "\'\'" ? H = "\'" : G === "\'" && (H = cH(H)), y.indexOf(H) === 0)\n y = y.slice(H.length);\n else\n return {\n v: /* @__PURE__ */ new Date(NaN)\n };\n }\n };\n for (S.s(); !(B = S.n()).done; ) {\n var P = I();\n if (ir(P) === "object")\n return P.v;\n }\n } catch (D) {\n S.e(D);\n } finally {\n S.f();\n }\n if (y.length > 0 && sH.test(y))\n return /* @__PURE__ */ new Date(NaN);\n var k = L.map(function(D) {\n return D.priority;\n }).sort(function(D, H) {\n return H - D;\n }).filter(function(D, H, G) {\n return G.indexOf(D) === H;\n }).map(function(D) {\n return L.filter(function(H) {\n return H.priority === D;\n }).sort(function(H, G) {\n return G.subPriority - H.subPriority;\n });\n }).map(function(D) {\n return D[0];\n }), K = v0(r);\n if (isNaN(K.getTime()))\n return /* @__PURE__ */ new Date(NaN);\n var $ = vg(K, va(K)), j = {}, r1 = BA(k), a1;\n try {\n for (r1.s(); !(a1 = r1.n()).done; ) {\n var _ = a1.value;\n if (!_.validate($, E))\n return /* @__PURE__ */ new Date(NaN);\n var Y = _.set($, j, E);\n Array.isArray(Y) ? ($ = Y[0], K7(j, Y[1])) : $ = Y;\n }\n } catch (D) {\n r1.e(D);\n } finally {\n r1.f();\n }\n return $;\n}\nfunction cH(e) {\n return e.match(iH)[1].replace(aH, "\'");\n}\nfunction pH(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getFullYear() === n.getFullYear() && r.getMonth() === n.getMonth();\n}\nfunction dH(e, t) {\n z0(2, arguments);\n var r = M8(e), n = M8(t);\n return r.getTime() === n.getTime();\n}\nfunction AH(e, t) {\n z0(2, arguments);\n var r = v0(e), n = v0(t);\n return r.getFullYear() === n.getFullYear();\n}\nfunction M4(e, t) {\n z0(2, arguments);\n var r = v0(e).getTime(), n = v0(t.start).getTime(), o = v0(t.end).getTime();\n if (!(n <= o))\n throw new RangeError("Invalid interval");\n return r >= n && r <= o;\n}\nfunction uH(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Da(e, -r);\n}\nfunction bH(e, t) {\n var r;\n z0(1, arguments);\n var n = ie((r = t == null ? void 0 : t.additionalDigits) !== null && r !== void 0 ? r : 2);\n if (n !== 2 && n !== 1 && n !== 0)\n throw new RangeError("additionalDigits must be 0, 1 or 2");\n if (!(typeof e == "string" || Object.prototype.toString.call(e) === "[object String]"))\n return /* @__PURE__ */ new Date(NaN);\n var o = gH(e), i;\n if (o.date) {\n var a = zH(o.date, n);\n i = CH(a.restDateString, a.year);\n }\n if (!i || isNaN(i.getTime()))\n return /* @__PURE__ */ new Date(NaN);\n var s = i.getTime(), l = 0, c;\n if (o.time && (l = OH(o.time), isNaN(l)))\n return /* @__PURE__ */ new Date(NaN);\n if (o.timezone) {\n if (c = mH(o.timezone), isNaN(c))\n return /* @__PURE__ */ new Date(NaN);\n } else {\n var p = new Date(s + l), d = /* @__PURE__ */ new Date(0);\n return d.setFullYear(p.getUTCFullYear(), p.getUTCMonth(), p.getUTCDate()), d.setHours(p.getUTCHours(), p.getUTCMinutes(), p.getUTCSeconds(), p.getUTCMilliseconds()), d;\n }\n return new Date(s + l + c);\n}\nvar e5 = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/\n}, hH = /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/, MH = /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/, fH = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\nfunction gH(e) {\n var t = {}, r = e.split(e5.dateTimeDelimiter), n;\n if (r.length > 2)\n return t;\n if (/:/.test(r[0]) ? n = r[0] : (t.date = r[0], n = r[1], e5.timeZoneDelimiter.test(t.date) && (t.date = e.split(e5.timeZoneDelimiter)[0], n = e.substr(t.date.length, e.length))), n) {\n var o = e5.timezone.exec(n);\n o ? (t.time = n.replace(o[1], ""), t.timezone = o[1]) : t.time = n;\n }\n return t;\n}\nfunction zH(e, t) {\n var r = new RegExp("^(?:(\\\\d{4}|[+-]\\\\d{" + (4 + t) + "})|(\\\\d{2}|[+-]\\\\d{" + (2 + t) + "})$)"), n = e.match(r);\n if (!n)\n return {\n year: NaN,\n restDateString: ""\n };\n var o = n[1] ? parseInt(n[1]) : null, i = n[2] ? parseInt(n[2]) : null;\n return {\n year: i === null ? o : i * 100,\n restDateString: e.slice((n[1] || n[2]).length)\n };\n}\nfunction CH(e, t) {\n if (t === null)\n return /* @__PURE__ */ new Date(NaN);\n var r = e.match(hH);\n if (!r)\n return /* @__PURE__ */ new Date(NaN);\n var n = !!r[4], o = C3(r[1]), i = C3(r[2]) - 1, a = C3(r[3]), s = C3(r[4]), l = C3(r[5]) - 1;\n if (n)\n return qH(t, s, l) ? vH(t, s, l) : /* @__PURE__ */ new Date(NaN);\n var c = /* @__PURE__ */ new Date(0);\n return !LH(t, i, a) || !wH(t, o) ? /* @__PURE__ */ new Date(NaN) : (c.setUTCFullYear(t, i, Math.max(o, a)), c);\n}\nfunction C3(e) {\n return e ? parseInt(e) : 1;\n}\nfunction OH(e) {\n var t = e.match(MH);\n if (!t)\n return NaN;\n var r = x6(t[1]), n = x6(t[2]), o = x6(t[3]);\n return xH(r, n, o) ? r * Q7 + n * X7 + o * 1e3 : NaN;\n}\nfunction x6(e) {\n return e && parseFloat(e.replace(",", ".")) || 0;\n}\nfunction mH(e) {\n if (e === "Z")\n return 0;\n var t = e.match(fH);\n if (!t)\n return 0;\n var r = t[1] === "+" ? -1 : 1, n = parseInt(t[2]), o = t[3] && parseInt(t[3]) || 0;\n return RH(n, o) ? r * (n * Q7 + o * X7) : NaN;\n}\nfunction vH(e, t, r) {\n var n = /* @__PURE__ */ new Date(0);\n n.setUTCFullYear(e, 0, 4);\n var o = n.getUTCDay() || 7, i = (t - 1) * 7 + r + 1 - o;\n return n.setUTCDate(n.getUTCDate() + i), n;\n}\nvar yH = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction Tg(e) {\n return e % 400 === 0 || e % 4 === 0 && e % 100 !== 0;\n}\nfunction LH(e, t, r) {\n return t >= 0 && t <= 11 && r >= 1 && r <= (yH[t] || (Tg(e) ? 29 : 28));\n}\nfunction wH(e, t) {\n return t >= 1 && t <= (Tg(e) ? 366 : 365);\n}\nfunction qH(e, t, r) {\n return t >= 1 && t <= 53 && r >= 0 && r <= 6;\n}\nfunction xH(e, t, r) {\n return e === 24 ? t === 0 && r === 0 : r >= 0 && r < 60 && t >= 0 && t < 60 && e >= 0 && e < 25;\n}\nfunction RH(e, t) {\n return t >= 0 && t <= 59;\n}\nfunction o2(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t), o = r.getFullYear(), i = r.getDate(), a = /* @__PURE__ */ new Date(0);\n a.setFullYear(o, n, 15), a.setHours(0, 0, 0, 0);\n var s = pD(a);\n return r.setMonth(n, Math.min(i, s)), r;\n}\nfunction BH(e, t) {\n if (z0(2, arguments), ir(t) !== "object" || t === null)\n throw new RangeError("values parameter must be an object");\n var r = v0(e);\n return isNaN(r.getTime()) ? /* @__PURE__ */ new Date(NaN) : (t.year != null && r.setFullYear(t.year), t.month != null && (r = o2(r, t.month)), t.date != null && r.setDate(ie(t.date)), t.hours != null && r.setHours(ie(t.hours)), t.minutes != null && r.setMinutes(ie(t.minutes)), t.seconds != null && r.setSeconds(ie(t.seconds)), t.milliseconds != null && r.setMilliseconds(ie(t.milliseconds)), r);\n}\nfunction Q5(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n return r.setHours(n), r;\n}\nfunction G5(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n return r.setMinutes(n), r;\n}\nfunction Di(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t), o = Math.floor(r.getMonth() / 3) + 1, i = n - o;\n return o2(r, r.getMonth() + i * 3);\n}\nfunction WH(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n return r.setSeconds(n), r;\n}\nfunction Mn(e, t) {\n z0(2, arguments);\n var r = v0(e), n = ie(t);\n return isNaN(r.getTime()) ? /* @__PURE__ */ new Date(NaN) : (r.setFullYear(n), r);\n}\nfunction wa(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return Or(e, -r);\n}\nfunction EH(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return zg(e, -r);\n}\nfunction EA(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return wl(e, -r);\n}\nfunction f4(e, t) {\n z0(2, arguments);\n var r = ie(t);\n return ya(e, -r);\n}\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: absolute;\n top: 20px;\n transform: translateX(-50%);\n width: 230px;\n`;\nconst SA = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n & + & {\n margin: ${({ theme: { spacings: e } }) => e.sp16} 0 0;\n }\n`;\nvar z8 = { exports: {} }, t5 = { exports: {} }, Be = {};\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar kA;\nfunction SH() {\n if (kA)\n return Be;\n kA = 1;\n var e = typeof Symbol == "function" && Symbol.for, t = e ? Symbol.for("react.element") : 60103, r = e ? Symbol.for("react.portal") : 60106, n = e ? Symbol.for("react.fragment") : 60107, o = e ? Symbol.for("react.strict_mode") : 60108, i = e ? Symbol.for("react.profiler") : 60114, a = e ? Symbol.for("react.provider") : 60109, s = e ? Symbol.for("react.context") : 60110, l = e ? Symbol.for("react.async_mode") : 60111, c = e ? Symbol.for("react.concurrent_mode") : 60111, p = e ? Symbol.for("react.forward_ref") : 60112, d = e ? Symbol.for("react.suspense") : 60113, u = e ? Symbol.for("react.suspense_list") : 60120, h = e ? Symbol.for("react.memo") : 60115, b = e ? Symbol.for("react.lazy") : 60116, M = e ? Symbol.for("react.block") : 60121, C = e ? Symbol.for("react.fundamental") : 60117, g = e ? Symbol.for("react.responder") : 60118, f = e ? Symbol.for("react.scope") : 60119;\n function O(v) {\n if (typeof v == "object" && v !== null) {\n var y = v.$$typeof;\n switch (y) {\n case t:\n switch (v = v.type, v) {\n case l:\n case c:\n case n:\n case i:\n case o:\n case d:\n return v;\n default:\n switch (v = v && v.$$typeof, v) {\n case s:\n case p:\n case b:\n case h:\n case a:\n return v;\n default:\n return y;\n }\n }\n case r:\n return y;\n }\n }\n }\n function m(v) {\n return O(v) === c;\n }\n return Be.AsyncMode = l, Be.ConcurrentMode = c, Be.ContextConsumer = s, Be.ContextProvider = a, Be.Element = t, Be.ForwardRef = p, Be.Fragment = n, Be.Lazy = b, Be.Memo = h, Be.Portal = r, Be.Profiler = i, Be.StrictMode = o, Be.Suspense = d, Be.isAsyncMode = function(v) {\n return m(v) || O(v) === l;\n }, Be.isConcurrentMode = m, Be.isContextConsumer = function(v) {\n return O(v) === s;\n }, Be.isContextProvider = function(v) {\n return O(v) === a;\n }, Be.isElement = function(v) {\n return typeof v == "object" && v !== null && v.$$typeof === t;\n }, Be.isForwardRef = function(v) {\n return O(v) === p;\n }, Be.isFragment = function(v) {\n return O(v) === n;\n }, Be.isLazy = function(v) {\n return O(v) === b;\n }, Be.isMemo = function(v) {\n return O(v) === h;\n }, Be.isPortal = function(v) {\n return O(v) === r;\n }, Be.isProfiler = function(v) {\n return O(v) === i;\n }, Be.isStrictMode = function(v) {\n return O(v) === o;\n }, Be.isSuspense = function(v) {\n return O(v) === d;\n }, Be.isValidElementType = function(v) {\n return typeof v == "string" || typeof v == "function" || v === n || v === c || v === i || v === o || v === d || v === u || typeof v == "object" && v !== null && (v.$$typeof === b || v.$$typeof === h || v.$$typeof === a || v.$$typeof === s || v.$$typeof === p || v.$$typeof === C || v.$$typeof === g || v.$$typeof === f || v.$$typeof === M);\n }, Be.typeOf = O, Be;\n}\nvar We = {};\n/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar NA;\nfunction kH() {\n return NA || (NA = 1, false && 0), We;\n}\nvar IA;\nfunction _7() {\n return IA || (IA = 1, true ? t5.exports = SH() : 0), t5.exports;\n}\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\nvar R6, TA;\nfunction NH() {\n if (TA)\n return R6;\n TA = 1;\n var e = Object.getOwnPropertySymbols, t = Object.prototype.hasOwnProperty, r = Object.prototype.propertyIsEnumerable;\n function n(i) {\n if (i == null)\n throw new TypeError("Object.assign cannot be called with null or undefined");\n return Object(i);\n }\n function o() {\n try {\n if (!Object.assign)\n return !1;\n var i = new String("abc");\n if (i[5] = "de", Object.getOwnPropertyNames(i)[0] === "5")\n return !1;\n for (var a = {}, s = 0; s < 10; s++)\n a["_" + String.fromCharCode(s)] = s;\n var l = Object.getOwnPropertyNames(a).map(function(p) {\n return a[p];\n });\n if (l.join("") !== "0123456789")\n return !1;\n var c = {};\n return "abcdefghijklmnopqrst".split("").forEach(function(p) {\n c[p] = p;\n }), Object.keys(Object.assign({}, c)).join("") === "abcdefghijklmnopqrst";\n } catch {\n return !1;\n }\n }\n return R6 = o() ? Object.assign : function(i, a) {\n for (var s, l = n(i), c, p = 1; p < arguments.length; p++) {\n s = Object(arguments[p]);\n for (var d in s)\n t.call(s, d) && (l[d] = s[d]);\n if (e) {\n c = e(s);\n for (var u = 0; u < c.length; u++)\n r.call(s, c[u]) && (l[c[u]] = s[c[u]]);\n }\n }\n return l;\n }, R6;\n}\nvar B6, DA;\nfunction $7() {\n if (DA)\n return B6;\n DA = 1;\n var e = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";\n return B6 = e, B6;\n}\nvar W6, HA;\nfunction Dg() {\n return HA || (HA = 1, W6 = Function.call.bind(Object.prototype.hasOwnProperty)), W6;\n}\nvar E6, PA;\nfunction IH() {\n if (PA)\n return E6;\n PA = 1;\n var e = function() {\n };\n if (false) // removed by dead control flow\n{ var t, r, n; }\n function o(i, a, s, l, c) {\n if (false) // removed by dead control flow\n{ var h, u, d, p; }\n }\n return o.resetWarningCache = function() {\n false && (0);\n }, E6 = o, E6;\n}\nvar S6, VA;\nfunction TH() {\n if (VA)\n return S6;\n VA = 1;\n var e = _7(), t = NH(), r = $7(), n = Dg(), o = IH(), i = function() {\n };\n false && (0);\n function a() {\n return null;\n }\n return S6 = function(s, l) {\n var c = typeof Symbol == "function" && Symbol.iterator, p = "@@iterator";\n function d(k) {\n var K = k && (c && k[c] || k[p]);\n if (typeof K == "function")\n return K;\n }\n var u = "<>", h = {\n array: g("array"),\n bigint: g("bigint"),\n bool: g("boolean"),\n func: g("function"),\n number: g("number"),\n object: g("object"),\n string: g("string"),\n symbol: g("symbol"),\n any: f(),\n arrayOf: O,\n element: m(),\n elementType: v(),\n instanceOf: y,\n node: T(),\n objectOf: N,\n oneOf: z,\n oneOfType: W,\n shape: E,\n exact: L\n };\n function b(k, K) {\n return k === K ? k !== 0 || 1 / k === 1 / K : k !== k && K !== K;\n }\n function M(k, K) {\n this.message = k, this.data = K && typeof K == "object" ? K : {}, this.stack = "";\n }\n M.prototype = Error.prototype;\n function C(k) {\n if (false)\n // removed by dead control flow\n{ var K, $; }\n function j(a1, _, Y, D, H, G, J) {\n if (D = D || u, G = G || Y, J !== r) {\n if (l) {\n var F = new Error(\n "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"\n );\n throw F.name = "Invariant Violation", F;\n } else if (false) // removed by dead control flow\n{ var V; }\n }\n return _[Y] == null ? a1 ? _[Y] === null ? new M("The " + H + " `" + G + "` is marked as required " + ("in `" + D + "`, but its value is `null`.")) : new M("The " + H + " `" + G + "` is marked as required in " + ("`" + D + "`, but its value is `undefined`.")) : null : k(_, Y, D, H, G);\n }\n var r1 = j.bind(null, !1);\n return r1.isRequired = j.bind(null, !0), r1;\n }\n function g(k) {\n function K($, j, r1, a1, _, Y) {\n var D = $[j], H = S(D);\n if (H !== k) {\n var G = B(D);\n return new M(\n "Invalid " + a1 + " `" + _ + "` of type " + ("`" + G + "` supplied to `" + r1 + "`, expected ") + ("`" + k + "`."),\n { expectedType: k }\n );\n }\n return null;\n }\n return C(K);\n }\n function f() {\n return C(a);\n }\n function O(k) {\n function K($, j, r1, a1, _) {\n if (typeof k != "function")\n return new M("Property `" + _ + "` of component `" + r1 + "` has invalid PropType notation inside arrayOf.");\n var Y = $[j];\n if (!Array.isArray(Y)) {\n var D = S(Y);\n return new M("Invalid " + a1 + " `" + _ + "` of type " + ("`" + D + "` supplied to `" + r1 + "`, expected an array."));\n }\n for (var H = 0; H < Y.length; H++) {\n var G = k(Y, H, r1, a1, _ + "[" + H + "]", r);\n if (G instanceof Error)\n return G;\n }\n return null;\n }\n return C(K);\n }\n function m() {\n function k(K, $, j, r1, a1) {\n var _ = K[$];\n if (!s(_)) {\n var Y = S(_);\n return new M("Invalid " + r1 + " `" + a1 + "` of type " + ("`" + Y + "` supplied to `" + j + "`, expected a single ReactElement."));\n }\n return null;\n }\n return C(k);\n }\n function v() {\n function k(K, $, j, r1, a1) {\n var _ = K[$];\n if (!e.isValidElementType(_)) {\n var Y = S(_);\n return new M("Invalid " + r1 + " `" + a1 + "` of type " + ("`" + Y + "` supplied to `" + j + "`, expected a single ReactElement type."));\n }\n return null;\n }\n return C(k);\n }\n function y(k) {\n function K($, j, r1, a1, _) {\n if (!($[j] instanceof k)) {\n var Y = k.name || u, D = P($[j]);\n return new M("Invalid " + a1 + " `" + _ + "` of type " + ("`" + D + "` supplied to `" + r1 + "`, expected ") + ("instance of `" + Y + "`."));\n }\n return null;\n }\n return C(K);\n }\n function z(k) {\n if (!Array.isArray(k))\n return false && (0), a;\n function K($, j, r1, a1, _) {\n for (var Y = $[j], D = 0; D < k.length; D++)\n if (b(Y, k[D]))\n return null;\n var H = JSON.stringify(k, function(J, F) {\n var V = B(F);\n return V === "symbol" ? String(F) : F;\n });\n return new M("Invalid " + a1 + " `" + _ + "` of value `" + String(Y) + "` " + ("supplied to `" + r1 + "`, expected one of " + H + "."));\n }\n return C(K);\n }\n function N(k) {\n function K($, j, r1, a1, _) {\n if (typeof k != "function")\n return new M("Property `" + _ + "` of component `" + r1 + "` has invalid PropType notation inside objectOf.");\n var Y = $[j], D = S(Y);\n if (D !== "object")\n return new M("Invalid " + a1 + " `" + _ + "` of type " + ("`" + D + "` supplied to `" + r1 + "`, expected an object."));\n for (var H in Y)\n if (n(Y, H)) {\n var G = k(Y, H, r1, a1, _ + "." + H, r);\n if (G instanceof Error)\n return G;\n }\n return null;\n }\n return C(K);\n }\n function W(k) {\n if (!Array.isArray(k))\n return false && 0, a;\n for (var K = 0; K < k.length; K++) {\n var $ = k[K];\n if (typeof $ != "function")\n return i(\n "Invalid argument supplied to oneOfType. Expected an array of check functions, but received " + I($) + " at index " + K + "."\n ), a;\n }\n function j(r1, a1, _, Y, D) {\n for (var H = [], G = 0; G < k.length; G++) {\n var J = k[G], F = J(r1, a1, _, Y, D, r);\n if (F == null)\n return null;\n F.data && n(F.data, "expectedType") && H.push(F.data.expectedType);\n }\n var V = H.length > 0 ? ", expected one of type [" + H.join(", ") + "]" : "";\n return new M("Invalid " + Y + " `" + D + "` supplied to " + ("`" + _ + "`" + V + "."));\n }\n return C(j);\n }\n function T() {\n function k(K, $, j, r1, a1) {\n return w(K[$]) ? null : new M("Invalid " + r1 + " `" + a1 + "` supplied to " + ("`" + j + "`, expected a ReactNode."));\n }\n return C(k);\n }\n function x(k, K, $, j, r1) {\n return new M(\n (k || "React class") + ": " + K + " type `" + $ + "." + j + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + r1 + "`."\n );\n }\n function E(k) {\n function K($, j, r1, a1, _) {\n var Y = $[j], D = S(Y);\n if (D !== "object")\n return new M("Invalid " + a1 + " `" + _ + "` of type `" + D + "` " + ("supplied to `" + r1 + "`, expected `object`."));\n for (var H in k) {\n var G = k[H];\n if (typeof G != "function")\n return x(r1, a1, _, H, B(G));\n var J = G(Y, H, r1, a1, _ + "." + H, r);\n if (J)\n return J;\n }\n return null;\n }\n return C(K);\n }\n function L(k) {\n function K($, j, r1, a1, _) {\n var Y = $[j], D = S(Y);\n if (D !== "object")\n return new M("Invalid " + a1 + " `" + _ + "` of type `" + D + "` " + ("supplied to `" + r1 + "`, expected `object`."));\n var H = t({}, $[j], k);\n for (var G in H) {\n var J = k[G];\n if (n(k, G) && typeof J != "function")\n return x(r1, a1, _, G, B(J));\n if (!J)\n return new M(\n "Invalid " + a1 + " `" + _ + "` key `" + G + "` supplied to `" + r1 + "`.\\nBad object: " + JSON.stringify($[j], null, " ") + `\nValid keys: ` + JSON.stringify(Object.keys(k), null, " ")\n );\n var F = J(Y, G, r1, a1, _ + "." + G, r);\n if (F)\n return F;\n }\n return null;\n }\n return C(K);\n }\n function w(k) {\n switch (typeof k) {\n case "number":\n case "string":\n case "undefined":\n return !0;\n case "boolean":\n return !k;\n case "object":\n if (Array.isArray(k))\n return k.every(w);\n if (k === null || s(k))\n return !0;\n var K = d(k);\n if (K) {\n var $ = K.call(k), j;\n if (K !== k.entries) {\n for (; !(j = $.next()).done; )\n if (!w(j.value))\n return !1;\n } else\n for (; !(j = $.next()).done; ) {\n var r1 = j.value;\n if (r1 && !w(r1[1]))\n return !1;\n }\n } else\n return !1;\n return !0;\n default:\n return !1;\n }\n }\n function q(k, K) {\n return k === "symbol" ? !0 : K ? K["@@toStringTag"] === "Symbol" || typeof Symbol == "function" && K instanceof Symbol : !1;\n }\n function S(k) {\n var K = typeof k;\n return Array.isArray(k) ? "array" : k instanceof RegExp ? "object" : q(K, k) ? "symbol" : K;\n }\n function B(k) {\n if (typeof k > "u" || k === null)\n return "" + k;\n var K = S(k);\n if (K === "object") {\n if (k instanceof Date)\n return "date";\n if (k instanceof RegExp)\n return "regexp";\n }\n return K;\n }\n function I(k) {\n var K = B(k);\n switch (K) {\n case "array":\n case "object":\n return "an " + K;\n case "boolean":\n case "date":\n case "regexp":\n return "a " + K;\n default:\n return K;\n }\n }\n function P(k) {\n return !k.constructor || !k.constructor.name ? u : k.constructor.name;\n }\n return h.checkPropTypes = o, h.resetWarningCache = o.resetWarningCache, h.PropTypes = h, h;\n }, S6;\n}\nvar k6, FA;\nfunction DH() {\n if (FA)\n return k6;\n FA = 1;\n var e = $7();\n function t() {\n }\n function r() {\n }\n return r.resetWarningCache = t, k6 = function() {\n function n(a, s, l, c, p, d) {\n if (d !== e) {\n var u = new Error(\n "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"\n );\n throw u.name = "Invariant Violation", u;\n }\n }\n n.isRequired = n;\n function o() {\n return n;\n }\n var i = {\n array: n,\n bigint: n,\n bool: n,\n func: n,\n number: n,\n object: n,\n string: n,\n symbol: n,\n any: n,\n arrayOf: o,\n element: n,\n elementType: n,\n instanceOf: o,\n node: n,\n objectOf: o,\n oneOf: o,\n oneOfType: o,\n shape: o,\n exact: o,\n checkPropTypes: r,\n resetWarningCache: t\n };\n return i.PropTypes = i, i;\n }, k6;\n}\nif (false) // removed by dead control flow\n{ var HH, PH; } else\n z8.exports = DH()();\nvar Hg = z8.exports;\nconst Hi = /* @__PURE__ */ (/* unused pure expression or super */ null && ($t(Hg)));\nvar Pg = { exports: {} };\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n(function(e) {\n (function() {\n var t = {}.hasOwnProperty;\n function r() {\n for (var i = "", a = 0; a < arguments.length; a++) {\n var s = arguments[a];\n s && (i = o(i, n(s)));\n }\n return i;\n }\n function n(i) {\n if (typeof i == "string" || typeof i == "number")\n return i;\n if (typeof i != "object")\n return "";\n if (Array.isArray(i))\n return r.apply(null, i);\n if (i.toString !== Object.prototype.toString && !i.toString.toString().includes("[native code]"))\n return i.toString();\n var a = "";\n for (var s in i)\n t.call(i, s) && i[s] && (a = o(a, s));\n return a;\n }\n function o(i, a) {\n return a ? i ? i + " " + a : i + a : i;\n }\n e.exports ? (r.default = r, e.exports = r) : window.classNames = r;\n })();\n})(Pg);\nvar VH = Pg.exports;\nconst Pt = /* @__PURE__ */ $t(VH);\nfunction FH(e, t) {\n e.prototype = Object.create(t.prototype), e.prototype.constructor = e, C8(e, t);\n}\nfunction C8(e, t) {\n return C8 = Object.setPrototypeOf || function(n, o) {\n return n.__proto__ = o, n;\n }, C8(e, t);\n}\nfunction UH(e, t) {\n if (e == null)\n return {};\n var r = {}, n = Object.keys(e), o, i;\n for (i = 0; i < n.length; i++)\n o = n[i], !(t.indexOf(o) >= 0) && (r[o] = e[o]);\n return r;\n}\nfunction UA(e) {\n if (e === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return e;\n}\nfunction YH(e, t, r) {\n return e === t ? !0 : e.correspondingElement ? e.correspondingElement.classList.contains(r) : e.classList.contains(r);\n}\nfunction XH(e, t, r) {\n if (e === t)\n return !0;\n for (; e.parentNode || e.host; ) {\n if (e.parentNode && YH(e, t, r))\n return !0;\n e = e.parentNode || e.host;\n }\n return e;\n}\nfunction QH(e) {\n return document.documentElement.clientWidth <= e.clientX || document.documentElement.clientHeight <= e.clientY;\n}\nvar GH = function() {\n if (!(typeof window > "u" || typeof window.addEventListener != "function")) {\n var t = !1, r = Object.defineProperty({}, "passive", {\n get: function() {\n t = !0;\n }\n }), n = function() {\n };\n return window.addEventListener("testPassiveEventSupport", n, r), window.removeEventListener("testPassiveEventSupport", n, r), t;\n }\n};\nfunction jH(e) {\n return e === void 0 && (e = 0), function() {\n return ++e;\n };\n}\nvar KH = jH(), O8, r5 = {}, N6 = {}, ZH = ["touchstart", "touchmove"], JH = "ignore-react-onclickoutside";\nfunction YA(e, t) {\n var r = {}, n = ZH.indexOf(t) !== -1;\n return n && O8 && (r.passive = !e.props.preventDefault), r;\n}\nfunction Oc(e, t) {\n var r, n, o = e.displayName || e.name || "Component";\n return n = r = /* @__PURE__ */ function(i) {\n FH(a, i);\n function a(l) {\n var c;\n return c = i.call(this, l) || this, c.__outsideClickHandler = function(p) {\n if (typeof c.__clickOutsideHandlerProp == "function") {\n c.__clickOutsideHandlerProp(p);\n return;\n }\n var d = c.getInstance();\n if (typeof d.props.handleClickOutside == "function") {\n d.props.handleClickOutside(p);\n return;\n }\n if (typeof d.handleClickOutside == "function") {\n d.handleClickOutside(p);\n return;\n }\n throw new Error("WrappedComponent: " + o + " lacks a handleClickOutside(event) function for processing outside click events.");\n }, c.__getComponentNode = function() {\n var p = c.getInstance();\n return t && typeof t.setClickOutsideRef == "function" ? t.setClickOutsideRef()(p) : typeof p.setClickOutsideRef == "function" ? p.setClickOutsideRef() : (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.findDOMNode)(p);\n }, c.enableOnClickOutside = function() {\n if (!(typeof document > "u" || N6[c._uid])) {\n typeof O8 > "u" && (O8 = GH()), N6[c._uid] = !0;\n var p = c.props.eventTypes;\n p.forEach || (p = [p]), r5[c._uid] = function(d) {\n if (c.componentNode !== null && !(c.initTimeStamp > d.timeStamp) && (c.props.preventDefault && d.preventDefault(), c.props.stopPropagation && d.stopPropagation(), !(c.props.excludeScrollbar && QH(d)))) {\n var u = d.composed && d.composedPath && d.composedPath().shift() || d.target;\n XH(u, c.componentNode, c.props.outsideClickIgnoreClass) === document && c.__outsideClickHandler(d);\n }\n }, p.forEach(function(d) {\n document.addEventListener(d, r5[c._uid], YA(UA(c), d));\n });\n }\n }, c.disableOnClickOutside = function() {\n delete N6[c._uid];\n var p = r5[c._uid];\n if (p && typeof document < "u") {\n var d = c.props.eventTypes;\n d.forEach || (d = [d]), d.forEach(function(u) {\n return document.removeEventListener(u, p, YA(UA(c), u));\n }), delete r5[c._uid];\n }\n }, c.getRef = function(p) {\n return c.instanceRef = p;\n }, c._uid = KH(), c.initTimeStamp = performance.now(), c;\n }\n var s = a.prototype;\n return s.getInstance = function() {\n if (e.prototype && !e.prototype.isReactComponent)\n return this;\n var c = this.instanceRef;\n return c.getInstance ? c.getInstance() : c;\n }, s.componentDidMount = function() {\n if (!(typeof document > "u" || !document.createElement)) {\n var c = this.getInstance();\n if (t && typeof t.handleClickOutside == "function" && (this.__clickOutsideHandlerProp = t.handleClickOutside(c), typeof this.__clickOutsideHandlerProp != "function"))\n throw new Error("WrappedComponent: " + o + " lacks a function for processing outside click events specified by the handleClickOutside config option.");\n this.componentNode = this.__getComponentNode(), !this.props.disableOnClickOutside && this.enableOnClickOutside();\n }\n }, s.componentDidUpdate = function() {\n this.componentNode = this.__getComponentNode();\n }, s.componentWillUnmount = function() {\n this.disableOnClickOutside();\n }, s.render = function() {\n var c = this.props;\n c.excludeScrollbar;\n var p = UH(c, ["excludeScrollbar"]);\n return e.prototype && e.prototype.isReactComponent ? p.ref = this.getRef : p.wrappedRef = this.getRef, p.disableOnClickOutside = this.disableOnClickOutside, p.enableOnClickOutside = this.enableOnClickOutside, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(e, p);\n }, a;\n }(react__WEBPACK_IMPORTED_MODULE_0__.Component), r.displayName = "OnClickOutside(" + o + ")", r.defaultProps = {\n eventTypes: ["mousedown", "touchstart"],\n excludeScrollbar: t && t.excludeScrollbar || !1,\n outsideClickIgnoreClass: JH,\n preventDefault: !1,\n stopPropagation: !1\n }, r.getClass = function() {\n return e.getClass ? e.getClass() : e;\n }, n;\n}\nfunction XA(e, t) {\n var r = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n t && (n = n.filter(function(o) {\n return Object.getOwnPropertyDescriptor(e, o).enumerable;\n })), r.push.apply(r, n);\n }\n return r;\n}\nfunction El(e) {\n for (var t = 1; t < arguments.length; t++) {\n var r = arguments[t] != null ? arguments[t] : {};\n t % 2 ? XA(Object(r), !0).forEach(function(n) {\n x1(e, n, r[n]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : XA(Object(r)).forEach(function(n) {\n Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));\n });\n }\n return e;\n}\nfunction m8(e) {\n return m8 = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t) {\n return typeof t;\n } : function(t) {\n return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;\n }, m8(e);\n}\nfunction Wt(e, t) {\n if (!(e instanceof t))\n throw new TypeError("Cannot call a class as a function");\n}\nfunction QA(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, Vg(n.key), n);\n }\n}\nfunction Et(e, t, r) {\n return t && QA(e.prototype, t), r && QA(e, r), Object.defineProperty(e, "prototype", { writable: !1 }), e;\n}\nfunction x1(e, t, r) {\n return (t = Vg(t)) in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e;\n}\nfunction qa() {\n return qa = Object.assign ? Object.assign.bind() : function(e) {\n for (var t = 1; t < arguments.length; t++) {\n var r = arguments[t];\n for (var n in r)\n Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]);\n }\n return e;\n }, qa.apply(this, arguments);\n}\nfunction St(e, t) {\n if (typeof t != "function" && t !== null)\n throw new TypeError("Super expression must either be null or a function");\n e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), Object.defineProperty(e, "prototype", { writable: !1 }), t && v8(e, t);\n}\nfunction Sl(e) {\n return Sl = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, Sl(e);\n}\nfunction v8(e, t) {\n return v8 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(r, n) {\n return r.__proto__ = n, r;\n }, v8(e, t);\n}\nfunction E1(e) {\n if (e === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return e;\n}\nfunction kt(e) {\n var t = function() {\n if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)\n return !1;\n if (typeof Proxy == "function")\n return !0;\n try {\n return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n })), !0;\n } catch {\n return !1;\n }\n }();\n return function() {\n var r, n = Sl(e);\n if (t) {\n var o = Sl(this).constructor;\n r = Reflect.construct(n, arguments, o);\n } else\n r = n.apply(this, arguments);\n return function(i, a) {\n if (a && (typeof a == "object" || typeof a == "function"))\n return a;\n if (a !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return E1(i);\n }(this, r);\n };\n}\nfunction g4(e) {\n return function(t) {\n if (Array.isArray(t))\n return I6(t);\n }(e) || function(t) {\n if (typeof Symbol < "u" && t[Symbol.iterator] != null || t["@@iterator"] != null)\n return Array.from(t);\n }(e) || function(t, r) {\n if (t) {\n if (typeof t == "string")\n return I6(t, r);\n var n = Object.prototype.toString.call(t).slice(8, -1);\n if (n === "Object" && t.constructor && (n = t.constructor.name), n === "Map" || n === "Set")\n return Array.from(t);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n return I6(t, r);\n }\n }(e) || function() {\n throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);\n }();\n}\nfunction I6(e, t) {\n (t == null || t > e.length) && (t = e.length);\n for (var r = 0, n = new Array(t); r < t; r++)\n n[r] = e[r];\n return n;\n}\nfunction Vg(e) {\n var t = function(r, n) {\n if (typeof r != "object" || r === null)\n return r;\n var o = r[Symbol.toPrimitive];\n if (o !== void 0) {\n var i = o.call(r, n || "default");\n if (typeof i != "object")\n return i;\n throw new TypeError("@@toPrimitive must return a primitive value.");\n }\n return (n === "string" ? String : Number)(r);\n }(e, "string");\n return typeof t == "symbol" ? t : String(t);\n}\nvar GA = function(e, t) {\n switch (e) {\n case "P":\n return t.date({ width: "short" });\n case "PP":\n return t.date({ width: "medium" });\n case "PPP":\n return t.date({ width: "long" });\n default:\n return t.date({ width: "full" });\n }\n}, jA = function(e, t) {\n switch (e) {\n case "p":\n return t.time({ width: "short" });\n case "pp":\n return t.time({ width: "medium" });\n case "ppp":\n return t.time({ width: "long" });\n default:\n return t.time({ width: "full" });\n }\n}, _H = { p: jA, P: function(e, t) {\n var r, n = e.match(/(P+)(p+)?/) || [], o = n[1], i = n[2];\n if (!i)\n return GA(e, t);\n switch (o) {\n case "P":\n r = t.dateTime({ width: "short" });\n break;\n case "PP":\n r = t.dateTime({ width: "medium" });\n break;\n case "PPP":\n r = t.dateTime({ width: "long" });\n break;\n default:\n r = t.dateTime({ width: "full" });\n }\n return r.replace("{{date}}", GA(o, t)).replace("{{time}}", jA(i, t));\n} }, Z3 = 12, $H = /P+p+|P+|p+|\'\'|\'(\'\'|[^\'])+(\'|$)|./g;\nfunction Pe(e) {\n var t = e ? typeof e == "string" || e instanceof String ? bH(e) : v0(e) : /* @__PURE__ */ new Date();\n return $n(t) ? t : null;\n}\nfunction $n(e, t) {\n return t = t || /* @__PURE__ */ new Date("1/1/1000"), u4(e) && !ro(e, t);\n}\nfunction rt(e, t, r) {\n if (r === "en")\n return h4(e, t, { awareOfUnicodeTokens: !0 });\n var n = po(r);\n return r && !n && console.warn(\'A locale object was not found for the provided string ["\'.concat(r, \'"].\')), !n && li() && po(li()) && (n = po(li())), h4(e, t, { locale: n || null, awareOfUnicodeTokens: !0 });\n}\nfunction kr(e, t) {\n var r = t.dateFormat, n = t.locale;\n return e && rt(e, Array.isArray(r) ? r[0] : r, n) || "";\n}\nfunction KA(e, t) {\n var r = t.hour, n = r === void 0 ? 0 : r, o = t.minute, i = o === void 0 ? 0 : o, a = t.second;\n return Q5(G5(WH(e, a === void 0 ? 0 : a), i), n);\n}\nfunction jr(e, t, r) {\n var n = po(t || li());\n return gg(e, { locale: n, weekStartsOn: r });\n}\nfunction co(e) {\n return Og(e);\n}\nfunction H3(e) {\n return mg(e);\n}\nfunction ZA(e) {\n return M8(e);\n}\nfunction JA() {\n return Xr(Pe());\n}\nfunction no(e, t) {\n return e && t ? AH(e, t) : !e && !t;\n}\nfunction br(e, t) {\n return e && t ? pH(e, t) : !e && !t;\n}\nfunction kl(e, t) {\n return e && t ? dH(e, t) : !e && !t;\n}\nfunction Xe(e, t) {\n return e && t ? jI(e, t) : !e && !t;\n}\nfunction oi(e, t) {\n return e && t ? uD(e, t) : !e && !t;\n}\nfunction j5(e, t, r) {\n var n, o = Xr(t), i = xl(r);\n try {\n n = M4(e, { start: o, end: i });\n } catch {\n n = !1;\n }\n return n;\n}\nfunction li() {\n return (typeof window < "u" ? window : globalThis).__localeId__;\n}\nfunction po(e) {\n if (typeof e == "string") {\n var t = typeof window < "u" ? window : globalThis;\n return t.__localeData__ ? t.__localeData__[e] : null;\n }\n return e;\n}\nfunction e9(e, t) {\n return rt(o2(Pe(), e), "LLLL", t);\n}\nfunction Fg(e, t) {\n return rt(o2(Pe(), e), "LLL", t);\n}\nfunction mc(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.maxDate, o = t.excludeDates, i = t.excludeDateIntervals, a = t.includeDates, s = t.includeDateIntervals, l = t.filterDate;\n return vc(e, { minDate: r, maxDate: n }) || o && o.some(function(c) {\n return Xe(e, c);\n }) || i && i.some(function(c) {\n var p = c.start, d = c.end;\n return M4(e, { start: p, end: d });\n }) || a && !a.some(function(c) {\n return Xe(e, c);\n }) || s && !s.some(function(c) {\n var p = c.start, d = c.end;\n return M4(e, { start: p, end: d });\n }) || l && !l(Pe(e)) || !1;\n}\nfunction t9(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.excludeDates, n = t.excludeDateIntervals;\n return n && n.length > 0 ? n.some(function(o) {\n var i = o.start, a = o.end;\n return M4(e, { start: i, end: a });\n }) : r && r.some(function(o) {\n return Xe(e, o);\n }) || !1;\n}\nfunction Ug(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.maxDate, o = t.excludeDates, i = t.includeDates, a = t.filterDate;\n return vc(e, { minDate: Og(r), maxDate: Cg(n) }) || o && o.some(function(s) {\n return br(e, s);\n }) || i && !i.some(function(s) {\n return br(e, s);\n }) || a && !a(Pe(e)) || !1;\n}\nfunction T6(e, t, r, n) {\n var o = oe(e), i = Dt(e), a = oe(t), s = Dt(t), l = oe(n);\n return o === a && o === l ? i <= r && r <= s : o < a ? l === o && i <= r || l === a && s >= r || l < a && l > o : void 0;\n}\nfunction eP(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.maxDate, o = t.excludeDates, i = t.includeDates, a = t.filterDate;\n return vc(e, { minDate: r, maxDate: n }) || o && o.some(function(s) {\n return kl(e, s);\n }) || i && !i.some(function(s) {\n return kl(e, s);\n }) || a && !a(Pe(e)) || !1;\n}\nfunction D6(e, t, r) {\n if (!u4(t) || !u4(r))\n return !1;\n var n = oe(t), o = oe(r);\n return n <= e && o >= e;\n}\nfunction Yg(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.maxDate, o = t.excludeDates, i = t.includeDates, a = t.filterDate, s = new Date(e, 0, 1);\n return vc(s, { minDate: mg(r), maxDate: tT(n) }) || o && o.some(function(l) {\n return no(s, l);\n }) || i && !i.some(function(l) {\n return no(s, l);\n }) || a && !a(Pe(s)) || !1;\n}\nfunction H6(e, t, r, n) {\n var o = oe(e), i = _i(e), a = oe(t), s = _i(t), l = oe(n);\n return o === a && o === l ? i <= r && r <= s : o < a ? l === o && i <= r || l === a && s >= r || l < a && l > o : void 0;\n}\nfunction vc(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.maxDate;\n return r && Ll(e, r) < 0 || n && Ll(e, n) > 0;\n}\nfunction _A(e, t) {\n return t.some(function(r) {\n return Qr(r) === Qr(e) && Gr(r) === Gr(e);\n });\n}\nfunction $A(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.excludeTimes, n = t.includeTimes, o = t.filterTime;\n return r && _A(e, r) || n && !_A(e, n) || o && !o(e) || !1;\n}\nfunction eu(e, t) {\n var r = t.minTime, n = t.maxTime;\n if (!r || !n)\n throw new Error("Both minTime and maxTime props required");\n var o, i = Pe(), a = Q5(G5(i, Gr(e)), Qr(e)), s = Q5(G5(i, Gr(r)), Qr(r)), l = Q5(G5(i, Gr(n)), Qr(n));\n try {\n o = !M4(a, { start: s, end: l });\n } catch {\n o = !1;\n }\n return o;\n}\nfunction tu(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.includeDates, o = wa(e, 1);\n return r && b4(r, o) > 0 || n && n.every(function(i) {\n return b4(i, o) > 0;\n }) || !1;\n}\nfunction ru(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.maxDate, n = t.includeDates, o = Or(e, 1);\n return r && b4(o, r) > 0 || n && n.every(function(i) {\n return b4(o, i) > 0;\n }) || !1;\n}\nfunction nu(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.minDate, n = t.includeDates, o = f4(e, 1);\n return r && ql(r, o) > 0 || n && n.every(function(i) {\n return ql(i, o) > 0;\n }) || !1;\n}\nfunction ou(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, r = t.maxDate, n = t.includeDates, o = ya(e, 1);\n return r && ql(o, r) > 0 || n && n.every(function(i) {\n return ql(o, i) > 0;\n }) || !1;\n}\nfunction Xg(e) {\n var t = e.minDate, r = e.includeDates;\n if (r && t) {\n var n = r.filter(function(o) {\n return Ll(o, t) >= 0;\n });\n return OA(n);\n }\n return r ? OA(r) : t;\n}\nfunction Qg(e) {\n var t = e.maxDate, r = e.includeDates;\n if (r && t) {\n var n = r.filter(function(o) {\n return Ll(o, t) <= 0;\n });\n return CA(n);\n }\n return r ? CA(r) : t;\n}\nfunction iu() {\n for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [], t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "react-datepicker__day--highlighted", r = /* @__PURE__ */ new Map(), n = 0, o = e.length; n < o; n++) {\n var i = e[n];\n if (Cc(i)) {\n var a = rt(i, "MM.dd.yyyy"), s = r.get(a) || [];\n s.includes(t) || (s.push(t), r.set(a, s));\n } else if (m8(i) === "object") {\n var l = Object.keys(i), c = l[0], p = i[l[0]];\n if (typeof c == "string" && p.constructor === Array)\n for (var d = 0, u = p.length; d < u; d++) {\n var h = rt(p[d], "MM.dd.yyyy"), b = r.get(h) || [];\n b.includes(c) || (b.push(c), r.set(h, b));\n }\n }\n }\n return r;\n}\nfunction tP() {\n var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [], t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "react-datepicker__day--holidays", r = /* @__PURE__ */ new Map();\n return e.forEach(function(n) {\n var o = n.date, i = n.holidayName;\n if (Cc(o)) {\n var a = rt(o, "MM.dd.yyyy"), s = r.get(a) || {};\n if (!("className" in s) || s.className !== t || (l = s.holidayNames, c = [i], l.length !== c.length || !l.every(function(d, u) {\n return d === c[u];\n }))) {\n var l, c;\n s.className = t;\n var p = s.holidayNames;\n s.holidayNames = p ? [].concat(g4(p), [i]) : [i], r.set(a, s);\n }\n }\n }), r;\n}\nfunction rP(e, t, r, n, o) {\n for (var i = o.length, a = [], s = 0; s < i; s++) {\n var l = h8(VI(e, Qr(o[s])), Gr(o[s])), c = h8(e, (r + 1) * n);\n zo(l, t) && ro(l, c) && a.push(o[s]);\n }\n return a;\n}\nfunction au(e) {\n return e < 10 ? "0".concat(e) : "".concat(e);\n}\nfunction $i(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Z3, r = Math.ceil(oe(e) / t) * t;\n return { startPeriod: r - (t - 1), endPeriod: r };\n}\nfunction su(e) {\n var t = e.getSeconds(), r = e.getMilliseconds();\n return v0(e.getTime() - 1e3 * t - r);\n}\nfunction nP(e, t, r, n) {\n for (var o = [], i = 0; i < 2 * t + 1; i++) {\n var a = e + t - i, s = !0;\n r && (s = oe(r) <= a), n && s && (s = oe(n) >= a), s && o.push(a);\n }\n return o;\n}\nvar oP = Oc(function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n Wt(this, r), x1(E1(o = t.call(this, n)), "renderOptions", function() {\n var l = o.props.year, c = o.state.yearsList.map(function(u) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: l === u ? "react-datepicker__year-option react-datepicker__year-option--selected_year" : "react-datepicker__year-option", key: u, onClick: o.onChange.bind(E1(o), u), "aria-selected": l === u ? "true" : void 0 }, l === u ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__year-option--selected" }, "✓") : "", u);\n }), p = o.props.minDate ? oe(o.props.minDate) : null, d = o.props.maxDate ? oe(o.props.maxDate) : null;\n return d && o.state.yearsList.find(function(u) {\n return u === d;\n }) || c.unshift(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__year-option", key: "upcoming", onClick: o.incrementYears }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { className: "react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-upcoming" }))), p && o.state.yearsList.find(function(u) {\n return u === p;\n }) || c.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__year-option", key: "previous", onClick: o.decrementYears }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", { className: "react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-previous" }))), c;\n }), x1(E1(o), "onChange", function(l) {\n o.props.onChange(l);\n }), x1(E1(o), "handleClickOutside", function() {\n o.props.onCancel();\n }), x1(E1(o), "shiftYears", function(l) {\n var c = o.state.yearsList.map(function(p) {\n return p + l;\n });\n o.setState({ yearsList: c });\n }), x1(E1(o), "incrementYears", function() {\n return o.shiftYears(1);\n }), x1(E1(o), "decrementYears", function() {\n return o.shiftYears(-1);\n });\n var i = n.yearDropdownItemNumber, a = n.scrollableYearDropdown, s = i || (a ? 10 : 5);\n return o.state = { yearsList: nP(o.props.year, s, o.props.minDate, o.props.maxDate) }, o.dropdownRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.createRef)(), o;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n var n = this.dropdownRef.current;\n if (n) {\n var o = n.children ? Array.from(n.children) : null, i = o ? o.find(function(a) {\n return a.ariaSelected;\n }) : null;\n n.scrollTop = i ? i.offsetTop + (i.clientHeight - n.clientHeight) / 2 : (n.scrollHeight - n.clientHeight) / 2;\n }\n } }, { key: "render", value: function() {\n var n = Pt({ "react-datepicker__year-dropdown": !0, "react-datepicker__year-dropdown--scrollable": this.props.scrollableYearDropdown });\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: n, ref: this.dropdownRef }, this.renderOptions());\n } }]), r;\n}()), iP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "state", { dropdownVisible: !1 }), x1(E1(n), "renderSelectOptions", function() {\n for (var s = n.props.minDate ? oe(n.props.minDate) : 1900, l = n.props.maxDate ? oe(n.props.maxDate) : 2100, c = [], p = s; p <= l; p++)\n c.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { key: p, value: p }, p));\n return c;\n }), x1(E1(n), "onSelectChange", function(s) {\n n.onChange(s.target.value);\n }), x1(E1(n), "renderSelectMode", function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { value: n.props.year, className: "react-datepicker__year-select", onChange: n.onSelectChange }, n.renderSelectOptions());\n }), x1(E1(n), "renderReadView", function(s) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: "read", style: { visibility: s ? "visible" : "hidden" }, className: "react-datepicker__year-read-view", onClick: function(l) {\n return n.toggleDropdown(l);\n } }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__year-read-view--down-arrow" }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__year-read-view--selected-year" }, n.props.year));\n }), x1(E1(n), "renderDropdown", function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(oP, { key: "dropdown", year: n.props.year, onChange: n.onChange, onCancel: n.toggleDropdown, minDate: n.props.minDate, maxDate: n.props.maxDate, scrollableYearDropdown: n.props.scrollableYearDropdown, yearDropdownItemNumber: n.props.yearDropdownItemNumber });\n }), x1(E1(n), "renderScrollMode", function() {\n var s = n.state.dropdownVisible, l = [n.renderReadView(!s)];\n return s && l.unshift(n.renderDropdown()), l;\n }), x1(E1(n), "onChange", function(s) {\n n.toggleDropdown(), s !== n.props.year && n.props.onChange(s);\n }), x1(E1(n), "toggleDropdown", function(s) {\n n.setState({ dropdownVisible: !n.state.dropdownVisible }, function() {\n n.props.adjustDateOnChange && n.handleYearChange(n.props.date, s);\n });\n }), x1(E1(n), "handleYearChange", function(s, l) {\n n.onSelect(s, l), n.setOpen();\n }), x1(E1(n), "onSelect", function(s, l) {\n n.props.onSelect && n.props.onSelect(s, l);\n }), x1(E1(n), "setOpen", function() {\n n.props.setOpen && n.props.setOpen(!0);\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n var n;\n switch (this.props.dropdownMode) {\n case "scroll":\n n = this.renderScrollMode();\n break;\n case "select":\n n = this.renderSelectMode();\n }\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__year-dropdown-container react-datepicker__year-dropdown-container--".concat(this.props.dropdownMode) }, n);\n } }]), r;\n}(), aP = Oc(function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "isSelectedMonth", function(s) {\n return n.props.month === s;\n }), x1(E1(n), "renderOptions", function() {\n return n.props.monthNames.map(function(s, l) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: n.isSelectedMonth(l) ? "react-datepicker__month-option react-datepicker__month-option--selected_month" : "react-datepicker__month-option", key: s, onClick: n.onChange.bind(E1(n), l), "aria-selected": n.isSelectedMonth(l) ? "true" : void 0 }, n.isSelectedMonth(l) ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-option--selected" }, "✓") : "", s);\n });\n }), x1(E1(n), "onChange", function(s) {\n return n.props.onChange(s);\n }), x1(E1(n), "handleClickOutside", function() {\n return n.props.onCancel();\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__month-dropdown" }, this.renderOptions());\n } }]), r;\n}()), sP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "state", { dropdownVisible: !1 }), x1(E1(n), "renderSelectOptions", function(s) {\n return s.map(function(l, c) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { key: c, value: c }, l);\n });\n }), x1(E1(n), "renderSelectMode", function(s) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { value: n.props.month, className: "react-datepicker__month-select", onChange: function(l) {\n return n.onChange(l.target.value);\n } }, n.renderSelectOptions(s));\n }), x1(E1(n), "renderReadView", function(s, l) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: "read", style: { visibility: s ? "visible" : "hidden" }, className: "react-datepicker__month-read-view", onClick: n.toggleDropdown }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-read-view--down-arrow" }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-read-view--selected-month" }, l[n.props.month]));\n }), x1(E1(n), "renderDropdown", function(s) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(aP, { key: "dropdown", month: n.props.month, monthNames: s, onChange: n.onChange, onCancel: n.toggleDropdown });\n }), x1(E1(n), "renderScrollMode", function(s) {\n var l = n.state.dropdownVisible, c = [n.renderReadView(!l, s)];\n return l && c.unshift(n.renderDropdown(s)), c;\n }), x1(E1(n), "onChange", function(s) {\n n.toggleDropdown(), s !== n.props.month && n.props.onChange(s);\n }), x1(E1(n), "toggleDropdown", function() {\n return n.setState({ dropdownVisible: !n.state.dropdownVisible });\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n var n, o = this, i = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(this.props.useShortMonthInDropdown ? function(a) {\n return Fg(a, o.props.locale);\n } : function(a) {\n return e9(a, o.props.locale);\n });\n switch (this.props.dropdownMode) {\n case "scroll":\n n = this.renderScrollMode(i);\n break;\n case "select":\n n = this.renderSelectMode(i);\n }\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__month-dropdown-container react-datepicker__month-dropdown-container--".concat(this.props.dropdownMode) }, n);\n } }]), r;\n}();\nfunction lP(e, t) {\n for (var r = [], n = co(e), o = co(t); !zo(n, o); )\n r.push(Pe(n)), n = Or(n, 1);\n return r;\n}\nvar cP = Oc(function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "renderOptions", function() {\n return o.state.monthYearsList.map(function(i) {\n var a = g8(i), s = no(o.props.date, i) && br(o.props.date, i);\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: s ? "react-datepicker__month-year-option--selected_month-year" : "react-datepicker__month-year-option", key: a, onClick: o.onChange.bind(E1(o), a), "aria-selected": s ? "true" : void 0 }, s ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-year-option--selected" }, "✓") : "", rt(i, o.props.dateFormat, o.props.locale));\n });\n }), x1(E1(o), "onChange", function(i) {\n return o.props.onChange(i);\n }), x1(E1(o), "handleClickOutside", function() {\n o.props.onCancel();\n }), o.state = { monthYearsList: lP(o.props.minDate, o.props.maxDate) }, o;\n }\n return Et(r, [{ key: "render", value: function() {\n var n = Pt({ "react-datepicker__month-year-dropdown": !0, "react-datepicker__month-year-dropdown--scrollable": this.props.scrollableMonthYearDropdown });\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: n }, this.renderOptions());\n } }]), r;\n}()), pP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "state", { dropdownVisible: !1 }), x1(E1(n), "renderSelectOptions", function() {\n for (var s = co(n.props.minDate), l = co(n.props.maxDate), c = []; !zo(s, l); ) {\n var p = g8(s);\n c.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { key: p, value: p }, rt(s, n.props.dateFormat, n.props.locale))), s = Or(s, 1);\n }\n return c;\n }), x1(E1(n), "onSelectChange", function(s) {\n n.onChange(s.target.value);\n }), x1(E1(n), "renderSelectMode", function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { value: g8(co(n.props.date)), className: "react-datepicker__month-year-select", onChange: n.onSelectChange }, n.renderSelectOptions());\n }), x1(E1(n), "renderReadView", function(s) {\n var l = rt(n.props.date, n.props.dateFormat, n.props.locale);\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: "read", style: { visibility: s ? "visible" : "hidden" }, className: "react-datepicker__month-year-read-view", onClick: function(c) {\n return n.toggleDropdown(c);\n } }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-year-read-view--down-arrow" }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "react-datepicker__month-year-read-view--selected-month-year" }, l));\n }), x1(E1(n), "renderDropdown", function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(cP, { key: "dropdown", date: n.props.date, dateFormat: n.props.dateFormat, onChange: n.onChange, onCancel: n.toggleDropdown, minDate: n.props.minDate, maxDate: n.props.maxDate, scrollableMonthYearDropdown: n.props.scrollableMonthYearDropdown, locale: n.props.locale });\n }), x1(E1(n), "renderScrollMode", function() {\n var s = n.state.dropdownVisible, l = [n.renderReadView(!s)];\n return s && l.unshift(n.renderDropdown()), l;\n }), x1(E1(n), "onChange", function(s) {\n n.toggleDropdown();\n var l = Pe(parseInt(s));\n no(n.props.date, l) && br(n.props.date, l) || n.props.onChange(l);\n }), x1(E1(n), "toggleDropdown", function() {\n return n.setState({ dropdownVisible: !n.state.dropdownVisible });\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n var n;\n switch (this.props.dropdownMode) {\n case "scroll":\n n = this.renderScrollMode();\n break;\n case "select":\n n = this.renderSelectMode();\n }\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__month-year-dropdown-container react-datepicker__month-year-dropdown-container--".concat(this.props.dropdownMode) }, n);\n } }]), r;\n}(), dP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "dayEl", react__WEBPACK_IMPORTED_MODULE_0___default().createRef()), x1(E1(n), "handleClick", function(s) {\n !n.isDisabled() && n.props.onClick && n.props.onClick(s);\n }), x1(E1(n), "handleMouseEnter", function(s) {\n !n.isDisabled() && n.props.onMouseEnter && n.props.onMouseEnter(s);\n }), x1(E1(n), "handleOnKeyDown", function(s) {\n s.key === " " && (s.preventDefault(), s.key = "Enter"), n.props.handleOnKeyDown(s);\n }), x1(E1(n), "isSameDay", function(s) {\n return Xe(n.props.day, s);\n }), x1(E1(n), "isKeyboardSelected", function() {\n return !n.props.disabledKeyboardNavigation && !(n.isSameDay(n.props.selected) || n.isSameWeek(n.props.selected)) && (n.isSameDay(n.props.preSelection) || n.isSameWeek(n.props.preSelection));\n }), x1(E1(n), "isDisabled", function() {\n return mc(n.props.day, n.props);\n }), x1(E1(n), "isExcluded", function() {\n return t9(n.props.day, n.props);\n }), x1(E1(n), "isStartOfWeek", function() {\n return Xe(n.props.day, jr(n.props.day, n.props.locale, n.props.calendarStartDay));\n }), x1(E1(n), "isSameWeek", function(s) {\n return n.props.showWeekPicker && Xe(s, jr(n.props.day, n.props.locale, n.props.calendarStartDay));\n }), x1(E1(n), "getHighLightedClass", function() {\n var s = n.props, l = s.day, c = s.highlightDates;\n if (!c)\n return !1;\n var p = rt(l, "MM.dd.yyyy");\n return c.get(p);\n }), x1(E1(n), "getHolidaysClass", function() {\n var s = n.props, l = s.day, c = s.holidays;\n if (!c)\n return !1;\n var p = rt(l, "MM.dd.yyyy");\n return c.has(p) ? [c.get(p).className] : void 0;\n }), x1(E1(n), "isInRange", function() {\n var s = n.props, l = s.day, c = s.startDate, p = s.endDate;\n return !(!c || !p) && j5(l, c, p);\n }), x1(E1(n), "isInSelectingRange", function() {\n var s, l = n.props, c = l.day, p = l.selectsStart, d = l.selectsEnd, u = l.selectsRange, h = l.selectsDisabledDaysInRange, b = l.startDate, M = l.endDate, C = (s = n.props.selectingDate) !== null && s !== void 0 ? s : n.props.preSelection;\n return !(!(p || d || u) || !C || !h && n.isDisabled()) && (p && M && (ro(C, M) || oi(C, M)) ? j5(c, C, M) : (d && b && (zo(C, b) || oi(C, b)) || !(!u || !b || M || !zo(C, b) && !oi(C, b))) && j5(c, b, C));\n }), x1(E1(n), "isSelectingRangeStart", function() {\n var s;\n if (!n.isInSelectingRange())\n return !1;\n var l = n.props, c = l.day, p = l.startDate, d = l.selectsStart, u = (s = n.props.selectingDate) !== null && s !== void 0 ? s : n.props.preSelection;\n return Xe(c, d ? u : p);\n }), x1(E1(n), "isSelectingRangeEnd", function() {\n var s;\n if (!n.isInSelectingRange())\n return !1;\n var l = n.props, c = l.day, p = l.endDate, d = l.selectsEnd, u = l.selectsRange, h = (s = n.props.selectingDate) !== null && s !== void 0 ? s : n.props.preSelection;\n return Xe(c, d || u ? h : p);\n }), x1(E1(n), "isRangeStart", function() {\n var s = n.props, l = s.day, c = s.startDate, p = s.endDate;\n return !(!c || !p) && Xe(c, l);\n }), x1(E1(n), "isRangeEnd", function() {\n var s = n.props, l = s.day, c = s.startDate, p = s.endDate;\n return !(!c || !p) && Xe(p, l);\n }), x1(E1(n), "isWeekend", function() {\n var s = cD(n.props.day);\n return s === 0 || s === 6;\n }), x1(E1(n), "isAfterMonth", function() {\n return n.props.month !== void 0 && (n.props.month + 1) % 12 === Dt(n.props.day);\n }), x1(E1(n), "isBeforeMonth", function() {\n return n.props.month !== void 0 && (Dt(n.props.day) + 1) % 12 === n.props.month;\n }), x1(E1(n), "isCurrentDay", function() {\n return n.isSameDay(Pe());\n }), x1(E1(n), "isSelected", function() {\n return n.isSameDay(n.props.selected) || n.isSameWeek(n.props.selected);\n }), x1(E1(n), "getClassNames", function(s) {\n var l, c = n.props.dayClassName ? n.props.dayClassName(s) : void 0;\n return Pt("react-datepicker__day", c, "react-datepicker__day--" + rt(n.props.day, "ddd", l), { "react-datepicker__day--disabled": n.isDisabled(), "react-datepicker__day--excluded": n.isExcluded(), "react-datepicker__day--selected": n.isSelected(), "react-datepicker__day--keyboard-selected": n.isKeyboardSelected(), "react-datepicker__day--range-start": n.isRangeStart(), "react-datepicker__day--range-end": n.isRangeEnd(), "react-datepicker__day--in-range": n.isInRange(), "react-datepicker__day--in-selecting-range": n.isInSelectingRange(), "react-datepicker__day--selecting-range-start": n.isSelectingRangeStart(), "react-datepicker__day--selecting-range-end": n.isSelectingRangeEnd(), "react-datepicker__day--today": n.isCurrentDay(), "react-datepicker__day--weekend": n.isWeekend(), "react-datepicker__day--outside-month": n.isAfterMonth() || n.isBeforeMonth() }, n.getHighLightedClass("react-datepicker__day--highlighted"), n.getHolidaysClass());\n }), x1(E1(n), "getAriaLabel", function() {\n var s = n.props, l = s.day, c = s.ariaLabelPrefixWhenEnabled, p = c === void 0 ? "Choose" : c, d = s.ariaLabelPrefixWhenDisabled, u = d === void 0 ? "Not available" : d, h = n.isDisabled() || n.isExcluded() ? u : p;\n return "".concat(h, " ").concat(rt(l, "PPPP", n.props.locale));\n }), x1(E1(n), "getTitle", function() {\n var s = n.props, l = s.day, c = s.holidays, p = c === void 0 ? /* @__PURE__ */ new Map() : c, d = rt(l, "MM.dd.yyyy");\n return p.has(d) && p.get(d).holidayNames.length > 0 ? p.get(d).holidayNames.join(", ") : "";\n }), x1(E1(n), "getTabIndex", function(s, l) {\n var c = s || n.props.selected, p = l || n.props.preSelection;\n return (!n.props.showWeekPicker || !n.props.showWeekNumber && n.isStartOfWeek()) && (n.isKeyboardSelected() || n.isSameDay(c) && Xe(p, c)) ? 0 : -1;\n }), x1(E1(n), "handleFocusDay", function() {\n var s, l = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, c = !1;\n n.getTabIndex() === 0 && !l.isInputFocused && n.isSameDay(n.props.preSelection) && (document.activeElement && document.activeElement !== document.body || (c = !0), n.props.inline && !n.props.shouldFocusDayInline && (c = !1), n.props.containerRef && n.props.containerRef.current && n.props.containerRef.current.contains(document.activeElement) && document.activeElement.classList.contains("react-datepicker__day") && (c = !0), n.props.monthShowsDuplicateDaysEnd && n.isAfterMonth() && (c = !1), n.props.monthShowsDuplicateDaysStart && n.isBeforeMonth() && (c = !1)), c && ((s = n.dayEl.current) === null || s === void 0 || s.focus({ preventScroll: !0 }));\n }), x1(E1(n), "renderDayContents", function() {\n return n.props.monthShowsDuplicateDaysEnd && n.isAfterMonth() || n.props.monthShowsDuplicateDaysStart && n.isBeforeMonth() ? null : n.props.renderDayContents ? n.props.renderDayContents(qA(n.props.day), n.props.day) : qA(n.props.day);\n }), x1(E1(n), "render", function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: n.dayEl, className: n.getClassNames(n.props.day), onKeyDown: n.handleOnKeyDown, onClick: n.handleClick, onMouseEnter: n.handleMouseEnter, tabIndex: n.getTabIndex(), "aria-label": n.getAriaLabel(), role: "option", title: n.getTitle(), "aria-disabled": n.isDisabled(), "aria-current": n.isCurrentDay() ? "date" : void 0, "aria-selected": n.isSelected() || n.isInRange() }, n.renderDayContents(), n.getTitle() !== "" && react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "holiday-overlay" }, n.getTitle()));\n }), n;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n this.handleFocusDay();\n } }, { key: "componentDidUpdate", value: function(n) {\n this.handleFocusDay(n);\n } }]), r;\n}(), AP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "weekNumberEl", react__WEBPACK_IMPORTED_MODULE_0___default().createRef()), x1(E1(n), "handleClick", function(s) {\n n.props.onClick && n.props.onClick(s);\n }), x1(E1(n), "handleOnKeyDown", function(s) {\n s.key === " " && (s.preventDefault(), s.key = "Enter"), n.props.handleOnKeyDown(s);\n }), x1(E1(n), "isKeyboardSelected", function() {\n return !n.props.disabledKeyboardNavigation && !Xe(n.props.date, n.props.selected) && Xe(n.props.date, n.props.preSelection);\n }), x1(E1(n), "getTabIndex", function() {\n return n.props.showWeekPicker && n.props.showWeekNumber && (n.isKeyboardSelected() || Xe(n.props.date, n.props.selected) && Xe(n.props.preSelection, n.props.selected)) ? 0 : -1;\n }), x1(E1(n), "handleFocusWeekNumber", function() {\n var s = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, l = !1;\n n.getTabIndex() === 0 && !s.isInputFocused && Xe(n.props.date, n.props.preSelection) && (document.activeElement && document.activeElement !== document.body || (l = !0), n.props.inline && !n.props.shouldFocusDayInline && (l = !1), n.props.containerRef && n.props.containerRef.current && n.props.containerRef.current.contains(document.activeElement) && document.activeElement && document.activeElement.classList.contains("react-datepicker__week-number") && (l = !0)), l && n.weekNumberEl.current && n.weekNumberEl.current.focus({ preventScroll: !0 });\n }), n;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n this.handleFocusWeekNumber();\n } }, { key: "componentDidUpdate", value: function(n) {\n this.handleFocusWeekNumber(n);\n } }, { key: "render", value: function() {\n var n = this.props, o = n.weekNumber, i = n.ariaLabelPrefix, a = i === void 0 ? "week " : i, s = { "react-datepicker__week-number": !0, "react-datepicker__week-number--clickable": !!n.onClick, "react-datepicker__week-number--selected": Xe(this.props.date, this.props.selected), "react-datepicker__week-number--keyboard-selected": this.isKeyboardSelected() };\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: this.weekNumberEl, className: Pt(s), "aria-label": "".concat(a, " ").concat(this.props.weekNumber), onClick: this.handleClick, onKeyDown: this.handleOnKeyDown, tabIndex: this.getTabIndex() }, o);\n } }], [{ key: "defaultProps", get: function() {\n return { ariaLabelPrefix: "week " };\n } }]), r;\n}(), uP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "handleDayClick", function(s, l) {\n n.props.onDayClick && n.props.onDayClick(s, l);\n }), x1(E1(n), "handleDayMouseEnter", function(s) {\n n.props.onDayMouseEnter && n.props.onDayMouseEnter(s);\n }), x1(E1(n), "handleWeekClick", function(s, l, c) {\n if (typeof n.props.onWeekSelect == "function" && n.props.onWeekSelect(s, l, c), n.props.showWeekPicker) {\n var p = jr(s, n.props.locale, n.props.calendarStartDay);\n n.handleDayClick(p, c);\n }\n n.props.shouldCloseOnSelect && n.props.setOpen(!1);\n }), x1(E1(n), "formatWeekNumber", function(s) {\n return n.props.formatWeekNumber ? n.props.formatWeekNumber(s) : function(l, c) {\n var p = c && po(c) || li() && po(li());\n return AD(l, p ? { locale: p } : null);\n }(s);\n }), x1(E1(n), "renderDays", function() {\n var s = jr(n.props.day, n.props.locale, n.props.calendarStartDay), l = [], c = n.formatWeekNumber(s);\n if (n.props.showWeekNumber) {\n var p = n.props.onWeekSelect || n.props.showWeekPicker ? n.handleWeekClick.bind(E1(n), s, c) : void 0;\n l.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(AP, { key: "W", weekNumber: c, date: s, onClick: p, selected: n.props.selected, preSelection: n.props.preSelection, ariaLabelPrefix: n.props.ariaLabelPrefix, showWeekPicker: n.props.showWeekPicker, showWeekNumber: n.props.showWeekNumber, disabledKeyboardNavigation: n.props.disabledKeyboardNavigation, handleOnKeyDown: n.props.handleOnKeyDown, isInputFocused: n.props.isInputFocused, containerRef: n.props.containerRef }));\n }\n return l.concat([0, 1, 2, 3, 4, 5, 6].map(function(d) {\n var u = Da(s, d);\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(dP, { ariaLabelPrefixWhenEnabled: n.props.chooseDayAriaLabelPrefix, ariaLabelPrefixWhenDisabled: n.props.disabledDayAriaLabelPrefix, key: u.valueOf(), day: u, month: n.props.month, onClick: n.handleDayClick.bind(E1(n), u), onMouseEnter: n.handleDayMouseEnter.bind(E1(n), u), minDate: n.props.minDate, maxDate: n.props.maxDate, excludeDates: n.props.excludeDates, excludeDateIntervals: n.props.excludeDateIntervals, includeDates: n.props.includeDates, includeDateIntervals: n.props.includeDateIntervals, highlightDates: n.props.highlightDates, holidays: n.props.holidays, selectingDate: n.props.selectingDate, filterDate: n.props.filterDate, preSelection: n.props.preSelection, selected: n.props.selected, selectsStart: n.props.selectsStart, selectsEnd: n.props.selectsEnd, selectsRange: n.props.selectsRange, showWeekPicker: n.props.showWeekPicker, showWeekNumber: n.props.showWeekNumber, selectsDisabledDaysInRange: n.props.selectsDisabledDaysInRange, startDate: n.props.startDate, endDate: n.props.endDate, dayClassName: n.props.dayClassName, renderDayContents: n.props.renderDayContents, disabledKeyboardNavigation: n.props.disabledKeyboardNavigation, handleOnKeyDown: n.props.handleOnKeyDown, isInputFocused: n.props.isInputFocused, containerRef: n.props.containerRef, inline: n.props.inline, shouldFocusDayInline: n.props.shouldFocusDayInline, monthShowsDuplicateDaysEnd: n.props.monthShowsDuplicateDaysEnd, monthShowsDuplicateDaysStart: n.props.monthShowsDuplicateDaysStart, locale: n.props.locale });\n }));\n }), x1(E1(n), "startOfWeek", function() {\n return jr(n.props.day, n.props.locale, n.props.calendarStartDay);\n }), x1(E1(n), "isKeyboardSelected", function() {\n return !n.props.disabledKeyboardNavigation && !Xe(n.startOfWeek(), n.props.selected) && Xe(n.startOfWeek(), n.props.preSelection);\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n var n = { "react-datepicker__week": !0, "react-datepicker__week--selected": Xe(this.startOfWeek(), this.props.selected), "react-datepicker__week--keyboard-selected": this.isKeyboardSelected() };\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: Pt(n) }, this.renderDays());\n } }], [{ key: "defaultProps", get: function() {\n return { shouldCloseOnSelect: !0 };\n } }]), r;\n}(), Gg = "two_columns", jg = "three_columns", Kg = "four_columns", P6 = x1(x1(x1({}, Gg, { grid: [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10, 11]], verticalNavigationOffset: 2 }), jg, { grid: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]], verticalNavigationOffset: 3 }), Kg, { grid: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], verticalNavigationOffset: 4 });\nfunction lu(e, t) {\n return e ? Kg : t ? Gg : jg;\n}\nvar bP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "MONTH_REFS", g4(Array(12)).map(function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createRef();\n })), x1(E1(n), "QUARTER_REFS", g4(Array(4)).map(function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createRef();\n })), x1(E1(n), "isDisabled", function(s) {\n return mc(s, n.props);\n }), x1(E1(n), "isExcluded", function(s) {\n return t9(s, n.props);\n }), x1(E1(n), "handleDayClick", function(s, l) {\n n.props.onDayClick && n.props.onDayClick(s, l, n.props.orderInDisplay);\n }), x1(E1(n), "handleDayMouseEnter", function(s) {\n n.props.onDayMouseEnter && n.props.onDayMouseEnter(s);\n }), x1(E1(n), "handleMouseLeave", function() {\n n.props.onMouseLeave && n.props.onMouseLeave();\n }), x1(E1(n), "isRangeStartMonth", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate;\n return !(!p || !d) && br(o2(c, s), p);\n }), x1(E1(n), "isRangeStartQuarter", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate;\n return !(!p || !d) && kl(Di(c, s), p);\n }), x1(E1(n), "isRangeEndMonth", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate;\n return !(!p || !d) && br(o2(c, s), d);\n }), x1(E1(n), "isRangeEndQuarter", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate;\n return !(!p || !d) && kl(Di(c, s), d);\n }), x1(E1(n), "isInSelectingRangeMonth", function(s) {\n var l, c = n.props, p = c.day, d = c.selectsStart, u = c.selectsEnd, h = c.selectsRange, b = c.startDate, M = c.endDate, C = (l = n.props.selectingDate) !== null && l !== void 0 ? l : n.props.preSelection;\n return !(!(d || u || h) || !C) && (d && M ? T6(C, M, s, p) : (u && b || !(!h || !b || M)) && T6(b, C, s, p));\n }), x1(E1(n), "isSelectingMonthRangeStart", function(s) {\n var l;\n if (!n.isInSelectingRangeMonth(s))\n return !1;\n var c = n.props, p = c.day, d = c.startDate, u = c.selectsStart, h = o2(p, s), b = (l = n.props.selectingDate) !== null && l !== void 0 ? l : n.props.preSelection;\n return br(h, u ? b : d);\n }), x1(E1(n), "isSelectingMonthRangeEnd", function(s) {\n var l;\n if (!n.isInSelectingRangeMonth(s))\n return !1;\n var c = n.props, p = c.day, d = c.endDate, u = c.selectsEnd, h = c.selectsRange, b = o2(p, s), M = (l = n.props.selectingDate) !== null && l !== void 0 ? l : n.props.preSelection;\n return br(b, u || h ? M : d);\n }), x1(E1(n), "isInSelectingRangeQuarter", function(s) {\n var l, c = n.props, p = c.day, d = c.selectsStart, u = c.selectsEnd, h = c.selectsRange, b = c.startDate, M = c.endDate, C = (l = n.props.selectingDate) !== null && l !== void 0 ? l : n.props.preSelection;\n return !(!(d || u || h) || !C) && (d && M ? H6(C, M, s, p) : (u && b || !(!h || !b || M)) && H6(b, C, s, p));\n }), x1(E1(n), "isWeekInMonth", function(s) {\n var l = n.props.day, c = Da(s, 6);\n return br(s, l) || br(c, l);\n }), x1(E1(n), "isCurrentMonth", function(s, l) {\n return oe(s) === oe(Pe()) && l === Dt(Pe());\n }), x1(E1(n), "isCurrentQuarter", function(s, l) {\n return oe(s) === oe(Pe()) && l === _i(Pe());\n }), x1(E1(n), "isSelectedMonth", function(s, l, c) {\n return Dt(c) === l && oe(s) === oe(c);\n }), x1(E1(n), "isSelectedQuarter", function(s, l, c) {\n return _i(s) === l && oe(s) === oe(c);\n }), x1(E1(n), "renderWeeks", function() {\n for (var s = [], l = n.props.fixedHeight, c = 0, p = !1, d = jr(co(n.props.day), n.props.locale, n.props.calendarStartDay); s.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement(uP, { ariaLabelPrefix: n.props.weekAriaLabelPrefix, chooseDayAriaLabelPrefix: n.props.chooseDayAriaLabelPrefix, disabledDayAriaLabelPrefix: n.props.disabledDayAriaLabelPrefix, key: c, day: d, month: Dt(n.props.day), onDayClick: n.handleDayClick, onDayMouseEnter: n.handleDayMouseEnter, onWeekSelect: n.props.onWeekSelect, formatWeekNumber: n.props.formatWeekNumber, locale: n.props.locale, minDate: n.props.minDate, maxDate: n.props.maxDate, excludeDates: n.props.excludeDates, excludeDateIntervals: n.props.excludeDateIntervals, includeDates: n.props.includeDates, includeDateIntervals: n.props.includeDateIntervals, inline: n.props.inline, shouldFocusDayInline: n.props.shouldFocusDayInline, highlightDates: n.props.highlightDates, holidays: n.props.holidays, selectingDate: n.props.selectingDate, filterDate: n.props.filterDate, preSelection: n.props.preSelection, selected: n.props.selected, selectsStart: n.props.selectsStart, selectsEnd: n.props.selectsEnd, selectsRange: n.props.selectsRange, selectsDisabledDaysInRange: n.props.selectsDisabledDaysInRange, showWeekNumber: n.props.showWeekNumbers, showWeekPicker: n.props.showWeekPicker, startDate: n.props.startDate, endDate: n.props.endDate, dayClassName: n.props.dayClassName, setOpen: n.props.setOpen, shouldCloseOnSelect: n.props.shouldCloseOnSelect, disabledKeyboardNavigation: n.props.disabledKeyboardNavigation, renderDayContents: n.props.renderDayContents, handleOnKeyDown: n.props.handleOnKeyDown, isInputFocused: n.props.isInputFocused, containerRef: n.props.containerRef, calendarStartDay: n.props.calendarStartDay, monthShowsDuplicateDaysEnd: n.props.monthShowsDuplicateDaysEnd, monthShowsDuplicateDaysStart: n.props.monthShowsDuplicateDaysStart })), !p; ) {\n c++, d = wl(d, 1);\n var u = l && c >= 6, h = !l && !n.isWeekInMonth(d);\n if (u || h) {\n if (!n.props.peekNextMonth)\n break;\n p = !0;\n }\n }\n return s;\n }), x1(E1(n), "onMonthClick", function(s, l) {\n n.handleDayClick(co(o2(n.props.day, l)), s);\n }), x1(E1(n), "onMonthMouseEnter", function(s) {\n n.handleDayMouseEnter(co(o2(n.props.day, s)));\n }), x1(E1(n), "handleMonthNavigation", function(s, l) {\n n.isDisabled(l) || n.isExcluded(l) || (n.props.setPreSelection(l), n.MONTH_REFS[s].current && n.MONTH_REFS[s].current.focus());\n }), x1(E1(n), "onMonthKeyDown", function(s, l) {\n var c = n.props, p = c.selected, d = c.preSelection, u = c.disabledKeyboardNavigation, h = c.showTwoColumnMonthYearPicker, b = c.showFourColumnMonthYearPicker, M = c.setPreSelection, C = s.key;\n if (C !== "Tab" && s.preventDefault(), !u) {\n var g = lu(b, h), f = P6[g].verticalNavigationOffset, O = P6[g].grid;\n switch (C) {\n case "Enter":\n n.onMonthClick(s, l), M(p);\n break;\n case "ArrowRight":\n n.handleMonthNavigation(l === 11 ? 0 : l + 1, Or(d, 1));\n break;\n case "ArrowLeft":\n n.handleMonthNavigation(l === 0 ? 11 : l - 1, wa(d, 1));\n break;\n case "ArrowUp":\n n.handleMonthNavigation(O[0].includes(l) ? l + 12 - f : l - f, wa(d, f));\n break;\n case "ArrowDown":\n n.handleMonthNavigation(O[O.length - 1].includes(l) ? l - 12 + f : l + f, Or(d, f));\n }\n }\n }), x1(E1(n), "onQuarterClick", function(s, l) {\n n.handleDayClick(ZA(Di(n.props.day, l)), s);\n }), x1(E1(n), "onQuarterMouseEnter", function(s) {\n n.handleDayMouseEnter(ZA(Di(n.props.day, s)));\n }), x1(E1(n), "handleQuarterNavigation", function(s, l) {\n n.isDisabled(l) || n.isExcluded(l) || (n.props.setPreSelection(l), n.QUARTER_REFS[s - 1].current && n.QUARTER_REFS[s - 1].current.focus());\n }), x1(E1(n), "onQuarterKeyDown", function(s, l) {\n var c = s.key;\n if (!n.props.disabledKeyboardNavigation)\n switch (c) {\n case "Enter":\n n.onQuarterClick(s, l), n.props.setPreSelection(n.props.selected);\n break;\n case "ArrowRight":\n n.handleQuarterNavigation(l === 4 ? 1 : l + 1, zg(n.props.preSelection, 1));\n break;\n case "ArrowLeft":\n n.handleQuarterNavigation(l === 1 ? 4 : l - 1, EH(n.props.preSelection, 1));\n }\n }), x1(E1(n), "getMonthClassNames", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate, u = l.selected, h = l.minDate, b = l.maxDate, M = l.preSelection, C = l.monthClassName, g = l.excludeDates, f = l.includeDates, O = C ? C(o2(c, s)) : void 0, m = o2(c, s);\n return Pt("react-datepicker__month-text", "react-datepicker__month-".concat(s), O, { "react-datepicker__month-text--disabled": (h || b || g || f) && Ug(m, n.props), "react-datepicker__month-text--selected": n.isSelectedMonth(c, s, u), "react-datepicker__month-text--keyboard-selected": !n.props.disabledKeyboardNavigation && Dt(M) === s, "react-datepicker__month-text--in-selecting-range": n.isInSelectingRangeMonth(s), "react-datepicker__month-text--in-range": T6(p, d, s, c), "react-datepicker__month-text--range-start": n.isRangeStartMonth(s), "react-datepicker__month-text--range-end": n.isRangeEndMonth(s), "react-datepicker__month-text--selecting-range-start": n.isSelectingMonthRangeStart(s), "react-datepicker__month-text--selecting-range-end": n.isSelectingMonthRangeEnd(s), "react-datepicker__month-text--today": n.isCurrentMonth(c, s) });\n }), x1(E1(n), "getTabIndex", function(s) {\n var l = Dt(n.props.preSelection);\n return n.props.disabledKeyboardNavigation || s !== l ? "-1" : "0";\n }), x1(E1(n), "getQuarterTabIndex", function(s) {\n var l = _i(n.props.preSelection);\n return n.props.disabledKeyboardNavigation || s !== l ? "-1" : "0";\n }), x1(E1(n), "getAriaLabel", function(s) {\n var l = n.props, c = l.chooseDayAriaLabelPrefix, p = c === void 0 ? "Choose" : c, d = l.disabledDayAriaLabelPrefix, u = d === void 0 ? "Not available" : d, h = l.day, b = o2(h, s), M = n.isDisabled(b) || n.isExcluded(b) ? u : p;\n return "".concat(M, " ").concat(rt(b, "MMMM yyyy"));\n }), x1(E1(n), "getQuarterClassNames", function(s) {\n var l = n.props, c = l.day, p = l.startDate, d = l.endDate, u = l.selected, h = l.minDate, b = l.maxDate, M = l.preSelection, C = l.disabledKeyboardNavigation;\n return Pt("react-datepicker__quarter-text", "react-datepicker__quarter-".concat(s), { "react-datepicker__quarter-text--disabled": (h || b) && eP(Di(c, s), n.props), "react-datepicker__quarter-text--selected": n.isSelectedQuarter(c, s, u), "react-datepicker__quarter-text--keyboard-selected": !C && _i(M) === s, "react-datepicker__quarter-text--in-selecting-range": n.isInSelectingRangeQuarter(s), "react-datepicker__quarter-text--in-range": H6(p, d, s, c), "react-datepicker__quarter-text--range-start": n.isRangeStartQuarter(s), "react-datepicker__quarter-text--range-end": n.isRangeEndQuarter(s) });\n }), x1(E1(n), "getMonthContent", function(s) {\n var l = n.props, c = l.showFullMonthYearPicker, p = l.renderMonthContent, d = l.locale, u = l.day, h = Fg(s, d), b = e9(s, d);\n return p ? p(s, h, b, u) : c ? b : h;\n }), x1(E1(n), "getQuarterContent", function(s) {\n var l = n.props, c = l.renderQuarterContent, p = function(d, u) {\n return rt(Di(Pe(), d), "QQQ", u);\n }(s, l.locale);\n return c ? c(s, p) : p;\n }), x1(E1(n), "renderMonths", function() {\n var s = n.props, l = s.showTwoColumnMonthYearPicker, c = s.showFourColumnMonthYearPicker, p = s.day, d = s.selected;\n return P6[lu(c, l)].grid.map(function(u, h) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__month-wrapper", key: h }, u.map(function(b, M) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: n.MONTH_REFS[b], key: M, onClick: function(C) {\n n.onMonthClick(C, b);\n }, onKeyDown: function(C) {\n n.onMonthKeyDown(C, b);\n }, onMouseEnter: function() {\n return n.onMonthMouseEnter(b);\n }, tabIndex: n.getTabIndex(b), className: n.getMonthClassNames(b), role: "option", "aria-label": n.getAriaLabel(b), "aria-current": n.isCurrentMonth(p, b) ? "date" : void 0, "aria-selected": n.isSelectedMonth(p, b, d) }, n.getMonthContent(b));\n }));\n });\n }), x1(E1(n), "renderQuarters", function() {\n var s = n.props, l = s.day, c = s.selected;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__quarter-wrapper" }, [1, 2, 3, 4].map(function(p, d) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: d, ref: n.QUARTER_REFS[d], role: "option", onClick: function(u) {\n n.onQuarterClick(u, p);\n }, onKeyDown: function(u) {\n n.onQuarterKeyDown(u, p);\n }, onMouseEnter: function() {\n return n.onQuarterMouseEnter(p);\n }, className: n.getQuarterClassNames(p), "aria-selected": n.isSelectedQuarter(l, p, c), tabIndex: n.getQuarterTabIndex(p), "aria-current": n.isCurrentQuarter(l, p) ? "date" : void 0 }, n.getQuarterContent(p));\n }));\n }), x1(E1(n), "getClassNames", function() {\n var s = n.props, l = s.selectingDate, c = s.selectsStart, p = s.selectsEnd, d = s.showMonthYearPicker, u = s.showQuarterYearPicker, h = s.showWeekPicker;\n return Pt("react-datepicker__month", { "react-datepicker__month--selecting-range": l && (c || p) }, { "react-datepicker__monthPicker": d }, { "react-datepicker__quarterPicker": u }, { "react-datepicker__weekPicker": h });\n }), n;\n }\n return Et(r, [{ key: "render", value: function() {\n var n = this.props, o = n.showMonthYearPicker, i = n.showQuarterYearPicker, a = n.day, s = n.ariaLabelPrefix, l = s === void 0 ? "month " : s;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: this.getClassNames(), onMouseLeave: this.handleMouseLeave, "aria-label": "".concat(l, " ").concat(rt(a, "yyyy-MM")), role: "listbox" }, o ? this.renderMonths() : i ? this.renderQuarters() : this.renderWeeks());\n } }]), r;\n}(), Zg = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n var n;\n Wt(this, r);\n for (var o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return x1(E1(n = t.call.apply(t, [this].concat(i))), "state", { height: null }), x1(E1(n), "scrollToTheSelectedTime", function() {\n requestAnimationFrame(function() {\n n.list && (n.list.scrollTop = n.centerLi && r.calcCenterPosition(n.props.monthRef ? n.props.monthRef.clientHeight - n.header.clientHeight : n.list.clientHeight, n.centerLi));\n });\n }), x1(E1(n), "handleClick", function(s) {\n (n.props.minTime || n.props.maxTime) && eu(s, n.props) || (n.props.excludeTimes || n.props.includeTimes || n.props.filterTime) && $A(s, n.props) || n.props.onChange(s);\n }), x1(E1(n), "isSelectedTime", function(s) {\n return n.props.selected && (l = n.props.selected, c = s, su(l).getTime() === su(c).getTime());\n // removed by dead control flow\n{ var l, c; }\n }), x1(E1(n), "isDisabledTime", function(s) {\n return (n.props.minTime || n.props.maxTime) && eu(s, n.props) || (n.props.excludeTimes || n.props.includeTimes || n.props.filterTime) && $A(s, n.props);\n }), x1(E1(n), "liClasses", function(s) {\n var l = ["react-datepicker__time-list-item", n.props.timeClassName ? n.props.timeClassName(s) : void 0];\n return n.isSelectedTime(s) && l.push("react-datepicker__time-list-item--selected"), n.isDisabledTime(s) && l.push("react-datepicker__time-list-item--disabled"), n.props.injectTimes && (60 * Qr(s) + Gr(s)) % n.props.intervals != 0 && l.push("react-datepicker__time-list-item--injected"), l.join(" ");\n }), x1(E1(n), "handleOnKeyDown", function(s, l) {\n s.key === " " && (s.preventDefault(), s.key = "Enter"), s.key !== "ArrowUp" && s.key !== "ArrowLeft" || !s.target.previousSibling || (s.preventDefault(), s.target.previousSibling.focus()), s.key !== "ArrowDown" && s.key !== "ArrowRight" || !s.target.nextSibling || (s.preventDefault(), s.target.nextSibling.focus()), s.key === "Enter" && n.handleClick(l), n.props.handleOnKeyDown(s);\n }), x1(E1(n), "renderTimes", function() {\n for (var s = [], l = n.props.format ? n.props.format : "p", c = n.props.intervals, p = n.props.selected || n.props.openToDate || Pe(), d = Xr(p), u = n.props.injectTimes && n.props.injectTimes.sort(function(O, m) {\n return O - m;\n }), h = 60 * function(O) {\n var m = new Date(O.getFullYear(), O.getMonth(), O.getDate()), v = new Date(O.getFullYear(), O.getMonth(), O.getDate(), 24);\n return Math.round((+v - +m) / 36e5);\n }(p), b = h / c, M = 0; M < b; M++) {\n var C = h8(d, M * c);\n if (s.push(C), u) {\n var g = rP(d, C, M, c, u);\n s = s.concat(g);\n }\n }\n var f = s.reduce(function(O, m) {\n return m.getTime() <= p.getTime() ? m : O;\n }, s[0]);\n return s.map(function(O, m) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { key: m, onClick: n.handleClick.bind(E1(n), O), className: n.liClasses(O), ref: function(v) {\n O === f && (n.centerLi = v);\n }, onKeyDown: function(v) {\n n.handleOnKeyDown(v, O);\n }, tabIndex: O === f ? 0 : -1, role: "option", "aria-selected": n.isSelectedTime(O) ? "true" : void 0, "aria-disabled": n.isDisabledTime(O) ? "true" : void 0 }, rt(O, l, n.props.locale));\n });\n }), n;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n this.scrollToTheSelectedTime(), this.props.monthRef && this.header && this.setState({ height: this.props.monthRef.clientHeight - this.header.clientHeight });\n } }, { key: "render", value: function() {\n var n = this, o = this.state.height;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__time-container ".concat(this.props.todayButton ? "react-datepicker__time-container--with-today-button" : "") }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__header react-datepicker__header--time ".concat(this.props.showTimeSelectOnly ? "react-datepicker__header--time--only" : ""), ref: function(i) {\n n.header = i;\n } }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker-time__header" }, this.props.timeCaption)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__time" }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__time-box" }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "react-datepicker__time-list", ref: function(i) {\n n.list = i;\n }, style: o ? { height: o } : {}, role: "listbox", "aria-label": this.props.timeCaption }, this.renderTimes()))));\n } }], [{ key: "defaultProps", get: function() {\n return { intervals: 30, onTimeChange: function() {\n }, todayButton: null, timeCaption: "Time" };\n } }]), r;\n}();\nx1(Zg, "calcCenterPosition", function(e, t) {\n return t.offsetTop - (e / 2 - t.clientHeight / 2);\n});\nvar hP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "YEAR_REFS", g4(Array(o.props.yearItemNumber)).map(function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createRef();\n })), x1(E1(o), "isDisabled", function(i) {\n return mc(i, o.props);\n }), x1(E1(o), "isExcluded", function(i) {\n return t9(i, o.props);\n }), x1(E1(o), "selectingDate", function() {\n var i;\n return (i = o.props.selectingDate) !== null && i !== void 0 ? i : o.props.preSelection;\n }), x1(E1(o), "updateFocusOnPaginate", function(i) {\n var a = (function() {\n this.YEAR_REFS[i].current.focus();\n }).bind(E1(o));\n window.requestAnimationFrame(a);\n }), x1(E1(o), "handleYearClick", function(i, a) {\n o.props.onDayClick && o.props.onDayClick(i, a);\n }), x1(E1(o), "handleYearNavigation", function(i, a) {\n var s = o.props, l = s.date, c = s.yearItemNumber, p = $i(l, c).startPeriod;\n o.isDisabled(a) || o.isExcluded(a) || (o.props.setPreSelection(a), i - p == -1 ? o.updateFocusOnPaginate(c - 1) : i - p === c ? o.updateFocusOnPaginate(0) : o.YEAR_REFS[i - p].current.focus());\n }), x1(E1(o), "isSameDay", function(i, a) {\n return Xe(i, a);\n }), x1(E1(o), "isCurrentYear", function(i) {\n return i === oe(Pe());\n }), x1(E1(o), "isRangeStart", function(i) {\n return o.props.startDate && o.props.endDate && no(Mn(Pe(), i), o.props.startDate);\n }), x1(E1(o), "isRangeEnd", function(i) {\n return o.props.startDate && o.props.endDate && no(Mn(Pe(), i), o.props.endDate);\n }), x1(E1(o), "isInRange", function(i) {\n return D6(i, o.props.startDate, o.props.endDate);\n }), x1(E1(o), "isInSelectingRange", function(i) {\n var a = o.props, s = a.selectsStart, l = a.selectsEnd, c = a.selectsRange, p = a.startDate, d = a.endDate;\n return !(!(s || l || c) || !o.selectingDate()) && (s && d ? D6(i, o.selectingDate(), d) : (l && p || !(!c || !p || d)) && D6(i, p, o.selectingDate()));\n }), x1(E1(o), "isSelectingRangeStart", function(i) {\n if (!o.isInSelectingRange(i))\n return !1;\n var a = o.props, s = a.startDate, l = a.selectsStart, c = Mn(Pe(), i);\n return no(c, l ? o.selectingDate() : s);\n }), x1(E1(o), "isSelectingRangeEnd", function(i) {\n if (!o.isInSelectingRange(i))\n return !1;\n var a = o.props, s = a.endDate, l = a.selectsEnd, c = a.selectsRange, p = Mn(Pe(), i);\n return no(p, l || c ? o.selectingDate() : s);\n }), x1(E1(o), "isKeyboardSelected", function(i) {\n var a = H3(Mn(o.props.date, i));\n return !o.props.disabledKeyboardNavigation && !o.props.inline && !Xe(a, H3(o.props.selected)) && Xe(a, H3(o.props.preSelection));\n }), x1(E1(o), "onYearClick", function(i, a) {\n var s = o.props.date;\n o.handleYearClick(H3(Mn(s, a)), i);\n }), x1(E1(o), "onYearKeyDown", function(i, a) {\n var s = i.key;\n if (!o.props.disabledKeyboardNavigation)\n switch (s) {\n case "Enter":\n o.onYearClick(i, a), o.props.setPreSelection(o.props.selected);\n break;\n case "ArrowRight":\n o.handleYearNavigation(a + 1, ya(o.props.preSelection, 1));\n break;\n case "ArrowLeft":\n o.handleYearNavigation(a - 1, f4(o.props.preSelection, 1));\n }\n }), x1(E1(o), "getYearClassNames", function(i) {\n var a = o.props, s = a.minDate, l = a.maxDate, c = a.selected, p = a.excludeDates, d = a.includeDates, u = a.filterDate;\n return Pt("react-datepicker__year-text", { "react-datepicker__year-text--selected": i === oe(c), "react-datepicker__year-text--disabled": (s || l || p || d || u) && Yg(i, o.props), "react-datepicker__year-text--keyboard-selected": o.isKeyboardSelected(i), "react-datepicker__year-text--range-start": o.isRangeStart(i), "react-datepicker__year-text--range-end": o.isRangeEnd(i), "react-datepicker__year-text--in-range": o.isInRange(i), "react-datepicker__year-text--in-selecting-range": o.isInSelectingRange(i), "react-datepicker__year-text--selecting-range-start": o.isSelectingRangeStart(i), "react-datepicker__year-text--selecting-range-end": o.isSelectingRangeEnd(i), "react-datepicker__year-text--today": o.isCurrentYear(i) });\n }), x1(E1(o), "getYearTabIndex", function(i) {\n return o.props.disabledKeyboardNavigation ? "-1" : i === oe(o.props.preSelection) ? "0" : "-1";\n }), x1(E1(o), "getYearContainerClassNames", function() {\n var i = o.props, a = i.selectingDate, s = i.selectsStart, l = i.selectsEnd, c = i.selectsRange;\n return Pt("react-datepicker__year", { "react-datepicker__year--selecting-range": a && (s || l || c) });\n }), x1(E1(o), "getYearContent", function(i) {\n return o.props.renderYearContent ? o.props.renderYearContent(i) : i;\n }), o;\n }\n return Et(r, [{ key: "render", value: function() {\n for (var n = this, o = [], i = this.props, a = i.date, s = i.yearItemNumber, l = i.onYearMouseEnter, c = i.onYearMouseLeave, p = $i(a, s), d = p.startPeriod, u = p.endPeriod, h = function(M) {\n o.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: n.YEAR_REFS[M - d], onClick: function(C) {\n n.onYearClick(C, M);\n }, onKeyDown: function(C) {\n n.onYearKeyDown(C, M);\n }, tabIndex: n.getYearTabIndex(M), className: n.getYearClassNames(M), onMouseEnter: function(C) {\n return l(C, M);\n }, onMouseLeave: function(C) {\n return c(C, M);\n }, key: M, "aria-current": n.isCurrentYear(M) ? "date" : void 0 }, n.getYearContent(M)));\n }, b = d; b <= u; b++)\n h(b);\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: this.getYearContainerClassNames() }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__year-wrapper", onMouseLeave: this.props.clearSelectingDate }, o));\n } }]), r;\n}(), MP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "onTimeChange", function(i) {\n o.setState({ time: i });\n var a = o.props.date, s = a instanceof Date && !isNaN(a) ? a : /* @__PURE__ */ new Date();\n s.setHours(i.split(":")[0]), s.setMinutes(i.split(":")[1]), o.props.onChange(s);\n }), x1(E1(o), "renderTimeInput", function() {\n var i = o.state.time, a = o.props, s = a.date, l = a.timeString, c = a.customTimeInput;\n return c ? react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(c, { date: s, value: i, onChange: o.onTimeChange }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "time", className: "react-datepicker-time__input", placeholder: "Time", name: "time-input", required: !0, value: i, onChange: function(p) {\n o.onTimeChange(p.target.value || l);\n } });\n }), o.state = { time: o.props.timeString }, o;\n }\n return Et(r, [{ key: "render", value: function() {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__input-time-container" }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker-time__caption" }, this.props.timeInputLabel), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker-time__input-container" }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker-time__input" }, this.renderTimeInput())));\n } }], [{ key: "getDerivedStateFromProps", value: function(n, o) {\n return n.timeString !== o.time ? { time: n.timeString } : null;\n } }]), r;\n}();\nfunction fP(e) {\n var t = e.className, r = e.children, n = e.showPopperArrow, o = e.arrowProps, i = o === void 0 ? {} : o;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: t }, n && react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", qa({ className: "react-datepicker__triangle" }, i)), r);\n}\nvar gP = ["react-datepicker__year-select", "react-datepicker__month-select", "react-datepicker__month-year-select"], zP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "handleClickOutside", function(i) {\n o.props.onClickOutside(i);\n }), x1(E1(o), "setClickOutsideRef", function() {\n return o.containerRef.current;\n }), x1(E1(o), "handleDropdownFocus", function(i) {\n (function() {\n var a = ((arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}).className || "").split(/\\s+/);\n return gP.some(function(s) {\n return a.indexOf(s) >= 0;\n });\n })(i.target) && o.props.onDropdownFocus();\n }), x1(E1(o), "getDateInView", function() {\n var i = o.props, a = i.preSelection, s = i.selected, l = i.openToDate, c = Xg(o.props), p = Qg(o.props), d = Pe(), u = l || s || a;\n return u || (c && ro(d, c) ? c : p && zo(d, p) ? p : d);\n }), x1(E1(o), "increaseMonth", function() {\n o.setState(function(i) {\n var a = i.date;\n return { date: Or(a, 1) };\n }, function() {\n return o.handleMonthChange(o.state.date);\n });\n }), x1(E1(o), "decreaseMonth", function() {\n o.setState(function(i) {\n var a = i.date;\n return { date: wa(a, 1) };\n }, function() {\n return o.handleMonthChange(o.state.date);\n });\n }), x1(E1(o), "handleDayClick", function(i, a, s) {\n o.props.onSelect(i, a, s), o.props.setPreSelection && o.props.setPreSelection(i);\n }), x1(E1(o), "handleDayMouseEnter", function(i) {\n o.setState({ selectingDate: i }), o.props.onDayMouseEnter && o.props.onDayMouseEnter(i);\n }), x1(E1(o), "handleMonthMouseLeave", function() {\n o.setState({ selectingDate: null }), o.props.onMonthMouseLeave && o.props.onMonthMouseLeave();\n }), x1(E1(o), "handleYearMouseEnter", function(i, a) {\n o.setState({ selectingDate: Mn(Pe(), a) }), o.props.onYearMouseEnter && o.props.onYearMouseEnter(i, a);\n }), x1(E1(o), "handleYearMouseLeave", function(i, a) {\n o.props.onYearMouseLeave && o.props.onYearMouseLeave(i, a);\n }), x1(E1(o), "handleYearChange", function(i) {\n o.props.onYearChange && (o.props.onYearChange(i), o.setState({ isRenderAriaLiveMessage: !0 })), o.props.adjustDateOnChange && (o.props.onSelect && o.props.onSelect(i), o.props.setOpen && o.props.setOpen(!0)), o.props.setPreSelection && o.props.setPreSelection(i);\n }), x1(E1(o), "handleMonthChange", function(i) {\n o.handleCustomMonthChange(i), o.props.adjustDateOnChange && (o.props.onSelect && o.props.onSelect(i), o.props.setOpen && o.props.setOpen(!0)), o.props.setPreSelection && o.props.setPreSelection(i);\n }), x1(E1(o), "handleCustomMonthChange", function(i) {\n o.props.onMonthChange && (o.props.onMonthChange(i), o.setState({ isRenderAriaLiveMessage: !0 }));\n }), x1(E1(o), "handleMonthYearChange", function(i) {\n o.handleYearChange(i), o.handleMonthChange(i);\n }), x1(E1(o), "changeYear", function(i) {\n o.setState(function(a) {\n var s = a.date;\n return { date: Mn(s, i) };\n }, function() {\n return o.handleYearChange(o.state.date);\n });\n }), x1(E1(o), "changeMonth", function(i) {\n o.setState(function(a) {\n var s = a.date;\n return { date: o2(s, i) };\n }, function() {\n return o.handleMonthChange(o.state.date);\n });\n }), x1(E1(o), "changeMonthYear", function(i) {\n o.setState(function(a) {\n var s = a.date;\n return { date: Mn(o2(s, Dt(i)), oe(i)) };\n }, function() {\n return o.handleMonthYearChange(o.state.date);\n });\n }), x1(E1(o), "header", function() {\n var i = jr(arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : o.state.date, o.props.locale, o.props.calendarStartDay), a = [];\n return o.props.showWeekNumbers && a.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: "W", className: "react-datepicker__day-name" }, o.props.weekLabel || "#")), a.concat([0, 1, 2, 3, 4, 5, 6].map(function(s) {\n var l = Da(i, s), c = o.formatWeekday(l, o.props.locale), p = o.props.weekDayClassName ? o.props.weekDayClassName(l) : void 0;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: s, className: Pt("react-datepicker__day-name", p) }, c);\n }));\n }), x1(E1(o), "formatWeekday", function(i, a) {\n return o.props.formatWeekDay ? function(s, l, c) {\n return l(rt(s, "EEEE", c));\n }(i, o.props.formatWeekDay, a) : o.props.useWeekdaysShort ? function(s, l) {\n return rt(s, "EEE", l);\n }(i, a) : function(s, l) {\n return rt(s, "EEEEEE", l);\n }(i, a);\n }), x1(E1(o), "decreaseYear", function() {\n o.setState(function(i) {\n var a = i.date;\n return { date: f4(a, o.props.showYearPicker ? o.props.yearItemNumber : 1) };\n }, function() {\n return o.handleYearChange(o.state.date);\n });\n }), x1(E1(o), "clearSelectingDate", function() {\n o.setState({ selectingDate: null });\n }), x1(E1(o), "renderPreviousButton", function() {\n if (!o.props.renderCustomHeader) {\n var i;\n switch (!0) {\n case o.props.showMonthYearPicker:\n i = nu(o.state.date, o.props);\n break;\n case o.props.showYearPicker:\n i = function(g) {\n var f = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, O = f.minDate, m = f.yearItemNumber, v = m === void 0 ? Z3 : m, y = $i(H3(f4(g, v)), v).endPeriod, z = O && oe(O);\n return z && z > y || !1;\n }(o.state.date, o.props);\n break;\n default:\n i = tu(o.state.date, o.props);\n }\n if ((o.props.forceShowMonthNavigation || o.props.showDisabledMonthNavigation || !i) && !o.props.showTimeSelectOnly) {\n var a = ["react-datepicker__navigation", "react-datepicker__navigation--previous"], s = o.decreaseMonth;\n (o.props.showMonthYearPicker || o.props.showQuarterYearPicker || o.props.showYearPicker) && (s = o.decreaseYear), i && o.props.showDisabledMonthNavigation && (a.push("react-datepicker__navigation--previous--disabled"), s = null);\n var l = o.props.showMonthYearPicker || o.props.showQuarterYearPicker || o.props.showYearPicker, c = o.props, p = c.previousMonthButtonLabel, d = c.previousYearButtonLabel, u = o.props, h = u.previousMonthAriaLabel, b = h === void 0 ? typeof p == "string" ? p : "Previous Month" : h, M = u.previousYearAriaLabel, C = M === void 0 ? typeof d == "string" ? d : "Previous Year" : M;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: a.join(" "), onClick: s, onKeyDown: o.props.handleOnKeyDown, "aria-label": l ? C : b }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: ["react-datepicker__navigation-icon", "react-datepicker__navigation-icon--previous"].join(" ") }, l ? o.props.previousYearButtonLabel : o.props.previousMonthButtonLabel));\n }\n }\n }), x1(E1(o), "increaseYear", function() {\n o.setState(function(i) {\n var a = i.date;\n return { date: ya(a, o.props.showYearPicker ? o.props.yearItemNumber : 1) };\n }, function() {\n return o.handleYearChange(o.state.date);\n });\n }), x1(E1(o), "renderNextButton", function() {\n if (!o.props.renderCustomHeader) {\n var i;\n switch (!0) {\n case o.props.showMonthYearPicker:\n i = ou(o.state.date, o.props);\n break;\n case o.props.showYearPicker:\n i = function(g) {\n var f = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, O = f.maxDate, m = f.yearItemNumber, v = m === void 0 ? Z3 : m, y = $i(ya(g, v), v).startPeriod, z = O && oe(O);\n return z && z < y || !1;\n }(o.state.date, o.props);\n break;\n default:\n i = ru(o.state.date, o.props);\n }\n if ((o.props.forceShowMonthNavigation || o.props.showDisabledMonthNavigation || !i) && !o.props.showTimeSelectOnly) {\n var a = ["react-datepicker__navigation", "react-datepicker__navigation--next"];\n o.props.showTimeSelect && a.push("react-datepicker__navigation--next--with-time"), o.props.todayButton && a.push("react-datepicker__navigation--next--with-today-button");\n var s = o.increaseMonth;\n (o.props.showMonthYearPicker || o.props.showQuarterYearPicker || o.props.showYearPicker) && (s = o.increaseYear), i && o.props.showDisabledMonthNavigation && (a.push("react-datepicker__navigation--next--disabled"), s = null);\n var l = o.props.showMonthYearPicker || o.props.showQuarterYearPicker || o.props.showYearPicker, c = o.props, p = c.nextMonthButtonLabel, d = c.nextYearButtonLabel, u = o.props, h = u.nextMonthAriaLabel, b = h === void 0 ? typeof p == "string" ? p : "Next Month" : h, M = u.nextYearAriaLabel, C = M === void 0 ? typeof d == "string" ? d : "Next Year" : M;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: a.join(" "), onClick: s, onKeyDown: o.props.handleOnKeyDown, "aria-label": l ? C : b }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: ["react-datepicker__navigation-icon", "react-datepicker__navigation-icon--next"].join(" ") }, l ? o.props.nextYearButtonLabel : o.props.nextMonthButtonLabel));\n }\n }\n }), x1(E1(o), "renderCurrentMonth", function() {\n var i = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : o.state.date, a = ["react-datepicker__current-month"];\n return o.props.showYearDropdown && a.push("react-datepicker__current-month--hasYearDropdown"), o.props.showMonthDropdown && a.push("react-datepicker__current-month--hasMonthDropdown"), o.props.showMonthYearDropdown && a.push("react-datepicker__current-month--hasMonthYearDropdown"), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: a.join(" ") }, rt(i, o.props.dateFormat, o.props.locale));\n }), x1(E1(o), "renderYearDropdown", function() {\n var i = arguments.length > 0 && arguments[0] !== void 0 && arguments[0];\n if (o.props.showYearDropdown && !i)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(iP, { adjustDateOnChange: o.props.adjustDateOnChange, date: o.state.date, onSelect: o.props.onSelect, setOpen: o.props.setOpen, dropdownMode: o.props.dropdownMode, onChange: o.changeYear, minDate: o.props.minDate, maxDate: o.props.maxDate, year: oe(o.state.date), scrollableYearDropdown: o.props.scrollableYearDropdown, yearDropdownItemNumber: o.props.yearDropdownItemNumber });\n }), x1(E1(o), "renderMonthDropdown", function() {\n var i = arguments.length > 0 && arguments[0] !== void 0 && arguments[0];\n if (o.props.showMonthDropdown && !i)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(sP, { dropdownMode: o.props.dropdownMode, locale: o.props.locale, onChange: o.changeMonth, month: Dt(o.state.date), useShortMonthInDropdown: o.props.useShortMonthInDropdown });\n }), x1(E1(o), "renderMonthYearDropdown", function() {\n var i = arguments.length > 0 && arguments[0] !== void 0 && arguments[0];\n if (o.props.showMonthYearDropdown && !i)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(pP, { dropdownMode: o.props.dropdownMode, locale: o.props.locale, dateFormat: o.props.dateFormat, onChange: o.changeMonthYear, minDate: o.props.minDate, maxDate: o.props.maxDate, date: o.state.date, scrollableMonthYearDropdown: o.props.scrollableMonthYearDropdown });\n }), x1(E1(o), "handleTodayButtonClick", function(i) {\n o.props.onSelect(JA(), i), o.props.setPreSelection && o.props.setPreSelection(JA());\n }), x1(E1(o), "renderTodayButton", function() {\n if (o.props.todayButton && !o.props.showTimeSelectOnly)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__today-button", onClick: function(i) {\n return o.handleTodayButtonClick(i);\n } }, o.props.todayButton);\n }), x1(E1(o), "renderDefaultHeader", function(i) {\n var a = i.monthDate, s = i.i;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__header ".concat(o.props.showTimeSelect ? "react-datepicker__header--has-time-select" : "") }, o.renderCurrentMonth(a), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__header__dropdown react-datepicker__header__dropdown--".concat(o.props.dropdownMode), onFocus: o.handleDropdownFocus }, o.renderMonthDropdown(s !== 0), o.renderMonthYearDropdown(s !== 0), o.renderYearDropdown(s !== 0)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__day-names" }, o.header(a)));\n }), x1(E1(o), "renderCustomHeader", function() {\n var i = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, a = i.monthDate, s = i.i;\n if (o.props.showTimeSelect && !o.state.monthContainer || o.props.showTimeSelectOnly)\n return null;\n var l = tu(o.state.date, o.props), c = ru(o.state.date, o.props), p = nu(o.state.date, o.props), d = ou(o.state.date, o.props), u = !o.props.showMonthYearPicker && !o.props.showQuarterYearPicker && !o.props.showYearPicker;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__header react-datepicker__header--custom", onFocus: o.props.onDropdownFocus }, o.props.renderCustomHeader(El(El({}, o.state), {}, { customHeaderCount: s, monthDate: a, changeMonth: o.changeMonth, changeYear: o.changeYear, decreaseMonth: o.decreaseMonth, increaseMonth: o.increaseMonth, decreaseYear: o.decreaseYear, increaseYear: o.increaseYear, prevMonthButtonDisabled: l, nextMonthButtonDisabled: c, prevYearButtonDisabled: p, nextYearButtonDisabled: d })), u && react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__day-names" }, o.header(a)));\n }), x1(E1(o), "renderYearHeader", function() {\n var i = o.state.date, a = o.props, s = a.showYearPicker, l = $i(i, a.yearItemNumber), c = l.startPeriod, p = l.endPeriod;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__header react-datepicker-year-header" }, s ? "".concat(c, " - ").concat(p) : oe(i));\n }), x1(E1(o), "renderHeader", function(i) {\n switch (!0) {\n case o.props.renderCustomHeader !== void 0:\n return o.renderCustomHeader(i);\n case (o.props.showMonthYearPicker || o.props.showQuarterYearPicker || o.props.showYearPicker):\n return o.renderYearHeader(i);\n default:\n return o.renderDefaultHeader(i);\n }\n }), x1(E1(o), "renderMonths", function() {\n var i;\n if (!o.props.showTimeSelectOnly && !o.props.showYearPicker) {\n for (var a = [], s = o.props.showPreviousMonths ? o.props.monthsShown - 1 : 0, l = wa(o.state.date, s), c = (i = o.props.monthSelectedIn) !== null && i !== void 0 ? i : s, p = 0; p < o.props.monthsShown; ++p) {\n var d = Or(l, p - c + s), u = "month-".concat(p), h = p < o.props.monthsShown - 1, b = p > 0;\n a.push(react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: u, ref: function(M) {\n o.monthContainer = M;\n }, className: "react-datepicker__month-container" }, o.renderHeader({ monthDate: d, i: p }), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(bP, { chooseDayAriaLabelPrefix: o.props.chooseDayAriaLabelPrefix, disabledDayAriaLabelPrefix: o.props.disabledDayAriaLabelPrefix, weekAriaLabelPrefix: o.props.weekAriaLabelPrefix, ariaLabelPrefix: o.props.monthAriaLabelPrefix, onChange: o.changeMonthYear, day: d, dayClassName: o.props.dayClassName, calendarStartDay: o.props.calendarStartDay, monthClassName: o.props.monthClassName, onDayClick: o.handleDayClick, handleOnKeyDown: o.props.handleOnDayKeyDown, onDayMouseEnter: o.handleDayMouseEnter, onMouseLeave: o.handleMonthMouseLeave, onWeekSelect: o.props.onWeekSelect, orderInDisplay: p, formatWeekNumber: o.props.formatWeekNumber, locale: o.props.locale, minDate: o.props.minDate, maxDate: o.props.maxDate, excludeDates: o.props.excludeDates, excludeDateIntervals: o.props.excludeDateIntervals, highlightDates: o.props.highlightDates, holidays: o.props.holidays, selectingDate: o.state.selectingDate, includeDates: o.props.includeDates, includeDateIntervals: o.props.includeDateIntervals, inline: o.props.inline, shouldFocusDayInline: o.props.shouldFocusDayInline, fixedHeight: o.props.fixedHeight, filterDate: o.props.filterDate, preSelection: o.props.preSelection, setPreSelection: o.props.setPreSelection, selected: o.props.selected, selectsStart: o.props.selectsStart, selectsEnd: o.props.selectsEnd, selectsRange: o.props.selectsRange, selectsDisabledDaysInRange: o.props.selectsDisabledDaysInRange, showWeekNumbers: o.props.showWeekNumbers, startDate: o.props.startDate, endDate: o.props.endDate, peekNextMonth: o.props.peekNextMonth, setOpen: o.props.setOpen, shouldCloseOnSelect: o.props.shouldCloseOnSelect, renderDayContents: o.props.renderDayContents, renderMonthContent: o.props.renderMonthContent, renderQuarterContent: o.props.renderQuarterContent, renderYearContent: o.props.renderYearContent, disabledKeyboardNavigation: o.props.disabledKeyboardNavigation, showMonthYearPicker: o.props.showMonthYearPicker, showFullMonthYearPicker: o.props.showFullMonthYearPicker, showTwoColumnMonthYearPicker: o.props.showTwoColumnMonthYearPicker, showFourColumnMonthYearPicker: o.props.showFourColumnMonthYearPicker, showYearPicker: o.props.showYearPicker, showQuarterYearPicker: o.props.showQuarterYearPicker, showWeekPicker: o.props.showWeekPicker, isInputFocused: o.props.isInputFocused, containerRef: o.containerRef, monthShowsDuplicateDaysEnd: h, monthShowsDuplicateDaysStart: b })));\n }\n return a;\n }\n }), x1(E1(o), "renderYears", function() {\n if (!o.props.showTimeSelectOnly)\n return o.props.showYearPicker ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__year--container" }, o.renderHeader(), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(hP, qa({ onDayClick: o.handleDayClick, selectingDate: o.state.selectingDate, clearSelectingDate: o.clearSelectingDate, date: o.state.date }, o.props, { onYearMouseEnter: o.handleYearMouseEnter, onYearMouseLeave: o.handleYearMouseLeave }))) : void 0;\n }), x1(E1(o), "renderTimeSection", function() {\n if (o.props.showTimeSelect && (o.state.monthContainer || o.props.showTimeSelectOnly))\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Zg, { selected: o.props.selected, openToDate: o.props.openToDate, onChange: o.props.onTimeChange, timeClassName: o.props.timeClassName, format: o.props.timeFormat, includeTimes: o.props.includeTimes, intervals: o.props.timeIntervals, minTime: o.props.minTime, maxTime: o.props.maxTime, excludeTimes: o.props.excludeTimes, filterTime: o.props.filterTime, timeCaption: o.props.timeCaption, todayButton: o.props.todayButton, showMonthDropdown: o.props.showMonthDropdown, showMonthYearDropdown: o.props.showMonthYearDropdown, showYearDropdown: o.props.showYearDropdown, withPortal: o.props.withPortal, monthRef: o.state.monthContainer, injectTimes: o.props.injectTimes, locale: o.props.locale, handleOnKeyDown: o.props.handleOnKeyDown, showTimeSelectOnly: o.props.showTimeSelectOnly });\n }), x1(E1(o), "renderInputTimeSection", function() {\n var i = new Date(o.props.selected), a = $n(i) && o.props.selected ? "".concat(au(i.getHours()), ":").concat(au(i.getMinutes())) : "";\n if (o.props.showTimeInput)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MP, { date: i, timeString: a, timeInputLabel: o.props.timeInputLabel, onChange: o.props.onTimeChange, customTimeInput: o.props.customTimeInput });\n }), x1(E1(o), "renderAriaLiveRegion", function() {\n var i, a = $i(o.state.date, o.props.yearItemNumber), s = a.startPeriod, l = a.endPeriod;\n return i = o.props.showYearPicker ? "".concat(s, " - ").concat(l) : o.props.showMonthYearPicker || o.props.showQuarterYearPicker ? oe(o.state.date) : "".concat(e9(Dt(o.state.date), o.props.locale), " ").concat(oe(o.state.date)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { role: "alert", "aria-live": "polite", className: "react-datepicker__aria-live" }, o.state.isRenderAriaLiveMessage && i);\n }), x1(E1(o), "renderChildren", function() {\n if (o.props.children)\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__children-container" }, o.props.children);\n }), o.containerRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(), o.state = { date: o.getDateInView(), selectingDate: null, monthContainer: null, isRenderAriaLiveMessage: !1 }, o;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n var n = this;\n this.props.showTimeSelect && (this.assignMonthContainer = void n.setState({ monthContainer: n.monthContainer }));\n } }, { key: "componentDidUpdate", value: function(n) {\n var o = this;\n if (!this.props.preSelection || Xe(this.props.preSelection, n.preSelection) && this.props.monthSelectedIn === n.monthSelectedIn)\n this.props.openToDate && !Xe(this.props.openToDate, n.openToDate) && this.setState({ date: this.props.openToDate });\n else {\n var i = !br(this.state.date, this.props.preSelection);\n this.setState({ date: this.props.preSelection }, function() {\n return i && o.handleCustomMonthChange(o.state.date);\n });\n }\n } }, { key: "render", value: function() {\n var n = this.props.container || fP;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: { display: "contents" }, ref: this.containerRef }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(n, { className: Pt("react-datepicker", this.props.className, { "react-datepicker--time-only": this.props.showTimeSelectOnly }), showPopperArrow: this.props.showPopperArrow, arrowProps: this.props.arrowProps }, this.renderAriaLiveRegion(), this.renderPreviousButton(), this.renderNextButton(), this.renderMonths(), this.renderYears(), this.renderTodayButton(), this.renderTimeSection(), this.renderInputTimeSection(), this.renderChildren()));\n } }], [{ key: "defaultProps", get: function() {\n return { onDropdownFocus: function() {\n }, monthsShown: 1, forceShowMonthNavigation: !1, timeCaption: "Time", previousYearButtonLabel: "Previous Year", nextYearButtonLabel: "Next Year", previousMonthButtonLabel: "Previous Month", nextMonthButtonLabel: "Next Month", customTimeInput: null, yearItemNumber: Z3 };\n } }]), r;\n}(), CP = function(e) {\n var t = e.icon, r = e.className, n = r === void 0 ? "" : r, o = e.onClick, i = "react-datepicker__calendar-icon";\n return react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(t) ? react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(t, { className: "".concat(t.props.className || "", " ").concat(i, " ").concat(n), onClick: function(a) {\n typeof t.props.onClick == "function" && t.props.onClick(a), typeof o == "function" && o(a);\n } }) : typeof t == "string" ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "".concat(i, " ").concat(t, " ").concat(n), "aria-hidden": "true", onClick: o }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", { className: "".concat(i, " ").concat(n), xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", onClick: o }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { d: "M96 32V64H48C21.5 64 0 85.5 0 112v48H448V112c0-26.5-21.5-48-48-48H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32V64H160V32c0-17.7-14.3-32-32-32S96 14.3 96 32zM448 192H0V464c0 26.5 21.5 48 48 48H400c26.5 0 48-21.5 48-48V192z" }));\n}, Jg = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), (o = t.call(this, n)).el = document.createElement("div"), o;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n this.portalRoot = (this.props.portalHost || document).getElementById(this.props.portalId), this.portalRoot || (this.portalRoot = document.createElement("div"), this.portalRoot.setAttribute("id", this.props.portalId), (this.props.portalHost || document.body).appendChild(this.portalRoot)), this.portalRoot.appendChild(this.el);\n } }, { key: "componentWillUnmount", value: function() {\n this.portalRoot.removeChild(this.el);\n } }, { key: "render", value: function() {\n return react_dom__WEBPACK_IMPORTED_MODULE_2___default().createPortal(this.props.children, this.el);\n } }]), r;\n}(), OP = function(e) {\n return !e.disabled && e.tabIndex !== -1;\n}, _g = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "getTabChildren", function() {\n return Array.prototype.slice.call(o.tabLoopRef.current.querySelectorAll("[tabindex], a, button, input, select, textarea"), 1, -1).filter(OP);\n }), x1(E1(o), "handleFocusStart", function() {\n var i = o.getTabChildren();\n i && i.length > 1 && i[i.length - 1].focus();\n }), x1(E1(o), "handleFocusEnd", function() {\n var i = o.getTabChildren();\n i && i.length > 1 && i[0].focus();\n }), o.tabLoopRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(), o;\n }\n return Et(r, [{ key: "render", value: function() {\n return this.props.enableTabLoop ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__tab-loop", ref: this.tabLoopRef }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__tab-loop__start", tabIndex: "0", onFocus: this.handleFocusStart }), this.props.children, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__tab-loop__end", tabIndex: "0", onFocus: this.handleFocusEnd })) : this.props.children;\n } }], [{ key: "defaultProps", get: function() {\n return { enableTabLoop: !0 };\n } }]), r;\n}(), mP = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r() {\n return Wt(this, r), t.apply(this, arguments);\n }\n return Et(r, [{ key: "render", value: function() {\n var n, o = this.props, i = o.className, a = o.wrapperClassName, s = o.hidePopper, l = o.popperComponent, c = o.popperModifiers, p = o.popperPlacement, d = o.popperProps, u = o.targetComponent, h = o.enableTabLoop, b = o.popperOnKeyDown, M = o.portalId, C = o.portalHost;\n if (!s) {\n var g = Pt("react-datepicker-popper", i);\n n = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(vI, qa({ modifiers: c, placement: p }, d), function(O) {\n var m = O.ref, v = O.style, y = O.placement, z = O.arrowProps;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_g, { enableTabLoop: h }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: m, style: v, className: g, "data-placement": y, onKeyDown: b }, react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(l, { arrowProps: z })));\n });\n }\n this.props.popperContainer && (n = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(this.props.popperContainer, {}, n)), M && !s && (n = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Jg, { portalId: M, portalHost: C }, n));\n var f = Pt("react-datepicker-wrapper", a);\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(aN, { className: "react-datepicker-manager" }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(xI, null, function(O) {\n var m = O.ref;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: m, className: f }, u);\n }), n);\n } }], [{ key: "defaultProps", get: function() {\n return { hidePopper: !0, popperModifiers: [], popperProps: {}, popperPlacement: "bottom-start" };\n } }]), r;\n}(), cu = "react-datepicker-ignore-onclickoutside", vP = Oc(zP), V6 = "Date input not valid.", $g = function(e) {\n St(r, (react__WEBPACK_IMPORTED_MODULE_0___default().Component));\n var t = kt(r);\n function r(n) {\n var o;\n return Wt(this, r), x1(E1(o = t.call(this, n)), "getPreSelection", function() {\n return o.props.openToDate ? o.props.openToDate : o.props.selectsEnd && o.props.startDate ? o.props.startDate : o.props.selectsStart && o.props.endDate ? o.props.endDate : Pe();\n }), x1(E1(o), "modifyHolidays", function() {\n var i;\n return (i = o.props.holidays) === null || i === void 0 ? void 0 : i.reduce(function(a, s) {\n var l = new Date(s.date);\n return u4(l) ? [].concat(g4(a), [El(El({}, s), {}, { date: l })]) : a;\n }, []);\n }), x1(E1(o), "calcInitialState", function() {\n var i, a = o.getPreSelection(), s = Xg(o.props), l = Qg(o.props), c = s && ro(a, Xr(s)) ? s : l && zo(a, xl(l)) ? l : a;\n return { open: o.props.startOpen || !1, preventFocus: !1, preSelection: (i = o.props.selectsRange ? o.props.startDate : o.props.selected) !== null && i !== void 0 ? i : c, highlightDates: iu(o.props.highlightDates), focused: !1, shouldFocusDayInline: !1, isRenderAriaLiveMessage: !1 };\n }), x1(E1(o), "clearPreventFocusTimeout", function() {\n o.preventFocusTimeout && clearTimeout(o.preventFocusTimeout);\n }), x1(E1(o), "setFocus", function() {\n o.input && o.input.focus && o.input.focus({ preventScroll: !0 });\n }), x1(E1(o), "setBlur", function() {\n o.input && o.input.blur && o.input.blur(), o.cancelFocusInput();\n }), x1(E1(o), "setOpen", function(i) {\n var a = arguments.length > 1 && arguments[1] !== void 0 && arguments[1];\n o.setState({ open: i, preSelection: i && o.state.open ? o.state.preSelection : o.calcInitialState().preSelection, lastPreSelectChange: F6 }, function() {\n i || o.setState(function(s) {\n return { focused: !!a && s.focused };\n }, function() {\n !a && o.setBlur(), o.setState({ inputValue: null });\n });\n });\n }), x1(E1(o), "inputOk", function() {\n return Cc(o.state.preSelection);\n }), x1(E1(o), "isCalendarOpen", function() {\n return o.props.open === void 0 ? o.state.open && !o.props.disabled && !o.props.readOnly : o.props.open;\n }), x1(E1(o), "handleFocus", function(i) {\n o.state.preventFocus || (o.props.onFocus(i), o.props.preventOpenOnFocus || o.props.readOnly || o.setOpen(!0)), o.setState({ focused: !0 });\n }), x1(E1(o), "sendFocusBackToInput", function() {\n o.preventFocusTimeout && o.clearPreventFocusTimeout(), o.setState({ preventFocus: !0 }, function() {\n o.preventFocusTimeout = setTimeout(function() {\n o.setFocus(), o.setState({ preventFocus: !1 });\n });\n });\n }), x1(E1(o), "cancelFocusInput", function() {\n clearTimeout(o.inputFocusTimeout), o.inputFocusTimeout = null;\n }), x1(E1(o), "deferFocusInput", function() {\n o.cancelFocusInput(), o.inputFocusTimeout = setTimeout(function() {\n return o.setFocus();\n }, 1);\n }), x1(E1(o), "handleDropdownFocus", function() {\n o.cancelFocusInput();\n }), x1(E1(o), "handleBlur", function(i) {\n (!o.state.open || o.props.withPortal || o.props.showTimeInput) && o.props.onBlur(i), o.setState({ focused: !1 });\n }), x1(E1(o), "handleCalendarClickOutside", function(i) {\n o.props.inline || o.setOpen(!1), o.props.onClickOutside(i), o.props.withPortal && i.preventDefault();\n }), x1(E1(o), "handleChange", function() {\n for (var i = arguments.length, a = new Array(i), s = 0; s < i; s++)\n a[s] = arguments[s];\n var l = a[0];\n if (!o.props.onChangeRaw || (o.props.onChangeRaw.apply(E1(o), a), typeof l.isDefaultPrevented == "function" && !l.isDefaultPrevented())) {\n o.setState({ inputValue: l.target.value, lastPreSelectChange: yP });\n var c, p, d, u, h, b, M, C, g = (c = l.target.value, p = o.props.dateFormat, d = o.props.locale, u = o.props.strictParsing, h = o.props.minDate, b = null, M = po(d) || po(li()), C = !0, Array.isArray(p) ? (p.forEach(function(f) {\n var O = q6(c, f, /* @__PURE__ */ new Date(), { locale: M });\n u && (C = $n(O, h) && c === rt(O, f, d)), $n(O, h) && C && (b = O);\n }), b) : (b = q6(c, p, /* @__PURE__ */ new Date(), { locale: M }), u ? C = $n(b) && c === rt(b, p, d) : $n(b) || (p = p.match($H).map(function(f) {\n var O = f[0];\n return O === "p" || O === "P" ? M ? (0, _H[O])(f, M.formatLong) : O : f;\n }).join(""), c.length > 0 && (b = q6(c, p.slice(0, c.length), /* @__PURE__ */ new Date())), $n(b) || (b = new Date(c))), $n(b) && C ? b : null));\n o.props.showTimeSelectOnly && o.props.selected && g && !Xe(g, o.props.selected) && (g = BH(o.props.selected, { hours: Qr(g), minutes: Gr(g), seconds: xA(g) })), !g && l.target.value || (o.props.showWeekPicker && (g = jr(g, o.props.locale, o.props.calendarStartDay)), o.setSelected(g, l, !0));\n }\n }), x1(E1(o), "handleSelect", function(i, a, s) {\n if (o.props.shouldCloseOnSelect && !o.props.showTimeSelect && o.sendFocusBackToInput(), o.props.onChangeRaw && o.props.onChangeRaw(a), o.props.showWeekPicker && (i = jr(i, o.props.locale, o.props.calendarStartDay)), o.setSelected(i, a, !1, s), o.props.showDateSelect && o.setState({ isRenderAriaLiveMessage: !0 }), !o.props.shouldCloseOnSelect || o.props.showTimeSelect)\n o.setPreSelection(i);\n else if (!o.props.inline) {\n o.props.selectsRange || o.setOpen(!1);\n var l = o.props, c = l.startDate, p = l.endDate;\n !c || p || ro(i, c) || o.setOpen(!1);\n }\n }), x1(E1(o), "setSelected", function(i, a, s, l) {\n var c = i;\n if (o.props.showYearPicker) {\n if (c !== null && Yg(oe(c), o.props))\n return;\n } else if (o.props.showMonthYearPicker) {\n if (c !== null && Ug(c, o.props))\n return;\n } else if (c !== null && mc(c, o.props))\n return;\n var p = o.props, d = p.onChange, u = p.selectsRange, h = p.startDate, b = p.endDate;\n if (!oi(o.props.selected, c) || o.props.allowSameDay || u)\n if (c !== null && (!o.props.selected || s && (o.props.showTimeSelect || o.props.showTimeSelectOnly || o.props.showTimeInput) || (c = KA(c, { hour: Qr(o.props.selected), minute: Gr(o.props.selected), second: xA(o.props.selected) })), o.props.inline || o.setState({ preSelection: c }), o.props.focusSelectedMonth || o.setState({ monthSelectedIn: l })), u) {\n var M = h && !b, C = h && b;\n !h && !b ? d([c, null], a) : M && (ro(c, h) ? d([c, null], a) : d([h, c], a)), C && d([c, null], a);\n } else\n d(c, a);\n s || (o.props.onSelect(c, a), o.setState({ inputValue: null }));\n }), x1(E1(o), "setPreSelection", function(i) {\n var a = o.props.minDate !== void 0, s = o.props.maxDate !== void 0, l = !0;\n if (i) {\n o.props.showWeekPicker && (i = jr(i, o.props.locale, o.props.calendarStartDay));\n var c = Xr(i);\n if (a && s)\n l = j5(i, o.props.minDate, o.props.maxDate);\n else if (a) {\n var p = Xr(o.props.minDate);\n l = zo(i, p) || oi(c, p);\n } else if (s) {\n var d = xl(o.props.maxDate);\n l = ro(i, d) || oi(c, d);\n }\n }\n l && o.setState({ preSelection: i });\n }), x1(E1(o), "toggleCalendar", function() {\n o.setOpen(!o.state.open);\n }), x1(E1(o), "handleTimeChange", function(i) {\n var a = o.props.selected ? o.props.selected : o.getPreSelection(), s = o.props.selected ? i : KA(a, { hour: Qr(i), minute: Gr(i) });\n o.setState({ preSelection: s }), o.props.onChange(s), o.props.shouldCloseOnSelect && (o.sendFocusBackToInput(), o.setOpen(!1)), o.props.showTimeInput && o.setOpen(!0), (o.props.showTimeSelectOnly || o.props.showTimeSelect) && o.setState({ isRenderAriaLiveMessage: !0 }), o.setState({ inputValue: null });\n }), x1(E1(o), "onInputClick", function() {\n o.props.disabled || o.props.readOnly || o.setOpen(!0), o.props.onInputClick();\n }), x1(E1(o), "onInputKeyDown", function(i) {\n o.props.onKeyDown(i);\n var a = i.key;\n if (o.state.open || o.props.inline || o.props.preventOpenOnFocus) {\n if (o.state.open) {\n if (a === "ArrowDown" || a === "ArrowUp") {\n i.preventDefault();\n var s = o.props.showWeekPicker && o.props.showWeekNumbers ? \'.react-datepicker__week-number[tabindex="0"]\' : \'.react-datepicker__day[tabindex="0"]\', l = o.calendar.componentNode && o.calendar.componentNode.querySelector(s);\n return void (l && l.focus({ preventScroll: !0 }));\n }\n var c = Pe(o.state.preSelection);\n a === "Enter" ? (i.preventDefault(), o.inputOk() && o.state.lastPreSelectChange === F6 ? (o.handleSelect(c, i), !o.props.shouldCloseOnSelect && o.setPreSelection(c)) : o.setOpen(!1)) : a === "Escape" ? (i.preventDefault(), o.sendFocusBackToInput(), o.setOpen(!1)) : a === "Tab" && o.setOpen(!1), o.inputOk() || o.props.onInputError({ code: 1, msg: V6 });\n }\n } else\n a !== "ArrowDown" && a !== "ArrowUp" && a !== "Enter" || o.onInputClick();\n }), x1(E1(o), "onPortalKeyDown", function(i) {\n i.key === "Escape" && (i.preventDefault(), o.setState({ preventFocus: !0 }, function() {\n o.setOpen(!1), setTimeout(function() {\n o.setFocus(), o.setState({ preventFocus: !1 });\n });\n }));\n }), x1(E1(o), "onDayKeyDown", function(i) {\n o.props.onKeyDown(i);\n var a = i.key, s = Pe(o.state.preSelection);\n if (a === "Enter")\n i.preventDefault(), o.handleSelect(s, i), !o.props.shouldCloseOnSelect && o.setPreSelection(s);\n else if (a === "Escape")\n i.preventDefault(), o.setOpen(!1), o.inputOk() || o.props.onInputError({ code: 1, msg: V6 });\n else if (!o.props.disabledKeyboardNavigation) {\n var l;\n switch (a) {\n case "ArrowLeft":\n l = o.props.showWeekPicker ? EA(s, 1) : uH(s, 1);\n break;\n case "ArrowRight":\n l = o.props.showWeekPicker ? wl(s, 1) : Da(s, 1);\n break;\n case "ArrowUp":\n l = EA(s, 1);\n break;\n case "ArrowDown":\n l = wl(s, 1);\n break;\n case "PageUp":\n l = wa(s, 1);\n break;\n case "PageDown":\n l = Or(s, 1);\n break;\n case "Home":\n l = f4(s, 1);\n break;\n case "End":\n l = ya(s, 1);\n break;\n default:\n l = null;\n }\n if (!l)\n return void (o.props.onInputError && o.props.onInputError({ code: 1, msg: V6 }));\n if (i.preventDefault(), o.setState({ lastPreSelectChange: F6 }), o.props.adjustDateOnChange && o.setSelected(l), o.setPreSelection(l), o.props.inline) {\n var c = Dt(s), p = Dt(l), d = oe(s), u = oe(l);\n c !== p || d !== u ? o.setState({ shouldFocusDayInline: !0 }) : o.setState({ shouldFocusDayInline: !1 });\n }\n }\n }), x1(E1(o), "onPopperKeyDown", function(i) {\n i.key === "Escape" && (i.preventDefault(), o.sendFocusBackToInput());\n }), x1(E1(o), "onClearClick", function(i) {\n i && i.preventDefault && i.preventDefault(), o.sendFocusBackToInput(), o.props.selectsRange ? o.props.onChange([null, null], i) : o.props.onChange(null, i), o.setState({ inputValue: null });\n }), x1(E1(o), "clear", function() {\n o.onClearClick();\n }), x1(E1(o), "onScroll", function(i) {\n typeof o.props.closeOnScroll == "boolean" && o.props.closeOnScroll ? i.target !== document && i.target !== document.documentElement && i.target !== document.body || o.setOpen(!1) : typeof o.props.closeOnScroll == "function" && o.props.closeOnScroll(i) && o.setOpen(!1);\n }), x1(E1(o), "renderCalendar", function() {\n return o.props.inline || o.isCalendarOpen() ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(vP, { ref: function(i) {\n o.calendar = i;\n }, locale: o.props.locale, calendarStartDay: o.props.calendarStartDay, chooseDayAriaLabelPrefix: o.props.chooseDayAriaLabelPrefix, disabledDayAriaLabelPrefix: o.props.disabledDayAriaLabelPrefix, weekAriaLabelPrefix: o.props.weekAriaLabelPrefix, monthAriaLabelPrefix: o.props.monthAriaLabelPrefix, adjustDateOnChange: o.props.adjustDateOnChange, setOpen: o.setOpen, shouldCloseOnSelect: o.props.shouldCloseOnSelect, dateFormat: o.props.dateFormatCalendar, useWeekdaysShort: o.props.useWeekdaysShort, formatWeekDay: o.props.formatWeekDay, dropdownMode: o.props.dropdownMode, selected: o.props.selected, preSelection: o.state.preSelection, onSelect: o.handleSelect, onWeekSelect: o.props.onWeekSelect, openToDate: o.props.openToDate, minDate: o.props.minDate, maxDate: o.props.maxDate, selectsStart: o.props.selectsStart, selectsEnd: o.props.selectsEnd, selectsRange: o.props.selectsRange, startDate: o.props.startDate, endDate: o.props.endDate, excludeDates: o.props.excludeDates, excludeDateIntervals: o.props.excludeDateIntervals, filterDate: o.props.filterDate, onClickOutside: o.handleCalendarClickOutside, formatWeekNumber: o.props.formatWeekNumber, highlightDates: o.state.highlightDates, holidays: tP(o.modifyHolidays()), includeDates: o.props.includeDates, includeDateIntervals: o.props.includeDateIntervals, includeTimes: o.props.includeTimes, injectTimes: o.props.injectTimes, inline: o.props.inline, shouldFocusDayInline: o.state.shouldFocusDayInline, peekNextMonth: o.props.peekNextMonth, showMonthDropdown: o.props.showMonthDropdown, showPreviousMonths: o.props.showPreviousMonths, useShortMonthInDropdown: o.props.useShortMonthInDropdown, showMonthYearDropdown: o.props.showMonthYearDropdown, showWeekNumbers: o.props.showWeekNumbers, showYearDropdown: o.props.showYearDropdown, withPortal: o.props.withPortal, forceShowMonthNavigation: o.props.forceShowMonthNavigation, showDisabledMonthNavigation: o.props.showDisabledMonthNavigation, scrollableYearDropdown: o.props.scrollableYearDropdown, scrollableMonthYearDropdown: o.props.scrollableMonthYearDropdown, todayButton: o.props.todayButton, weekLabel: o.props.weekLabel, outsideClickIgnoreClass: cu, fixedHeight: o.props.fixedHeight, monthsShown: o.props.monthsShown, monthSelectedIn: o.state.monthSelectedIn, onDropdownFocus: o.handleDropdownFocus, onMonthChange: o.props.onMonthChange, onYearChange: o.props.onYearChange, dayClassName: o.props.dayClassName, weekDayClassName: o.props.weekDayClassName, monthClassName: o.props.monthClassName, timeClassName: o.props.timeClassName, showDateSelect: o.props.showDateSelect, showTimeSelect: o.props.showTimeSelect, showTimeSelectOnly: o.props.showTimeSelectOnly, onTimeChange: o.handleTimeChange, timeFormat: o.props.timeFormat, timeIntervals: o.props.timeIntervals, minTime: o.props.minTime, maxTime: o.props.maxTime, excludeTimes: o.props.excludeTimes, filterTime: o.props.filterTime, timeCaption: o.props.timeCaption, className: o.props.calendarClassName, container: o.props.calendarContainer, yearItemNumber: o.props.yearItemNumber, yearDropdownItemNumber: o.props.yearDropdownItemNumber, previousMonthAriaLabel: o.props.previousMonthAriaLabel, previousMonthButtonLabel: o.props.previousMonthButtonLabel, nextMonthAriaLabel: o.props.nextMonthAriaLabel, nextMonthButtonLabel: o.props.nextMonthButtonLabel, previousYearAriaLabel: o.props.previousYearAriaLabel, previousYearButtonLabel: o.props.previousYearButtonLabel, nextYearAriaLabel: o.props.nextYearAriaLabel, nextYearButtonLabel: o.props.nextYearButtonLabel, timeInputLabel: o.props.timeInputLabel, disabledKeyboardNavigation: o.props.disabledKeyboardNavigation, renderCustomHeader: o.props.renderCustomHeader, popperProps: o.props.popperProps, renderDayContents: o.props.renderDayContents, renderMonthContent: o.props.renderMonthContent, renderQuarterContent: o.props.renderQuarterContent, renderYearContent: o.props.renderYearContent, onDayMouseEnter: o.props.onDayMouseEnter, onMonthMouseLeave: o.props.onMonthMouseLeave, onYearMouseEnter: o.props.onYearMouseEnter, onYearMouseLeave: o.props.onYearMouseLeave, selectsDisabledDaysInRange: o.props.selectsDisabledDaysInRange, showTimeInput: o.props.showTimeInput, showMonthYearPicker: o.props.showMonthYearPicker, showFullMonthYearPicker: o.props.showFullMonthYearPicker, showTwoColumnMonthYearPicker: o.props.showTwoColumnMonthYearPicker, showFourColumnMonthYearPicker: o.props.showFourColumnMonthYearPicker, showYearPicker: o.props.showYearPicker, showQuarterYearPicker: o.props.showQuarterYearPicker, showWeekPicker: o.props.showWeekPicker, showPopperArrow: o.props.showPopperArrow, excludeScrollbar: o.props.excludeScrollbar, handleOnKeyDown: o.props.onKeyDown, handleOnDayKeyDown: o.onDayKeyDown, isInputFocused: o.state.focused, customTimeInput: o.props.customTimeInput, setPreSelection: o.setPreSelection }, o.props.children) : null;\n }), x1(E1(o), "renderAriaLiveRegion", function() {\n var i, a = o.props, s = a.dateFormat, l = a.locale, c = o.props.showTimeInput || o.props.showTimeSelect ? "PPPPp" : "PPPP";\n return i = o.props.selectsRange ? "Selected start date: ".concat(kr(o.props.startDate, { dateFormat: c, locale: l }), ". ").concat(o.props.endDate ? "End date: " + kr(o.props.endDate, { dateFormat: c, locale: l }) : "") : o.props.showTimeSelectOnly ? "Selected time: ".concat(kr(o.props.selected, { dateFormat: s, locale: l })) : o.props.showYearPicker ? "Selected year: ".concat(kr(o.props.selected, { dateFormat: "yyyy", locale: l })) : o.props.showMonthYearPicker ? "Selected month: ".concat(kr(o.props.selected, { dateFormat: "MMMM yyyy", locale: l })) : o.props.showQuarterYearPicker ? "Selected quarter: ".concat(kr(o.props.selected, { dateFormat: "yyyy, QQQ", locale: l })) : "Selected date: ".concat(kr(o.props.selected, { dateFormat: c, locale: l })), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { role: "alert", "aria-live": "polite", className: "react-datepicker__aria-live" }, i);\n }), x1(E1(o), "renderDateInput", function() {\n var i, a = Pt(o.props.className, x1({}, cu, o.state.open)), s = o.props.customInput || react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "text" }), l = o.props.customInputRef || "ref", c = typeof o.props.value == "string" ? o.props.value : typeof o.state.inputValue == "string" ? o.state.inputValue : o.props.selectsRange ? function(p, d, u) {\n if (!p)\n return "";\n var h = kr(p, u), b = d ? kr(d, u) : "";\n return "".concat(h, " - ").concat(b);\n }(o.props.startDate, o.props.endDate, o.props) : kr(o.props.selected, o.props);\n return react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(s, (x1(x1(x1(x1(x1(x1(x1(x1(x1(x1(i = {}, l, function(p) {\n o.input = p;\n }), "value", c), "onBlur", o.handleBlur), "onChange", o.handleChange), "onClick", o.onInputClick), "onFocus", o.handleFocus), "onKeyDown", o.onInputKeyDown), "id", o.props.id), "name", o.props.name), "form", o.props.form), x1(x1(x1(x1(x1(x1(x1(x1(x1(x1(i, "autoFocus", o.props.autoFocus), "placeholder", o.props.placeholderText), "disabled", o.props.disabled), "autoComplete", o.props.autoComplete), "className", Pt(s.props.className, a)), "title", o.props.title), "readOnly", o.props.readOnly), "required", o.props.required), "tabIndex", o.props.tabIndex), "aria-describedby", o.props.ariaDescribedBy), x1(x1(x1(i, "aria-invalid", o.props.ariaInvalid), "aria-labelledby", o.props.ariaLabelledBy), "aria-required", o.props.ariaRequired)));\n }), x1(E1(o), "renderClearButton", function() {\n var i = o.props, a = i.isClearable, s = i.disabled, l = i.selected, c = i.startDate, p = i.endDate, d = i.clearButtonTitle, u = i.clearButtonClassName, h = u === void 0 ? "" : u, b = i.ariaLabelClose, M = b === void 0 ? "Close" : b;\n return !a || l == null && c == null && p == null ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: Pt("react-datepicker__close-icon", h, { "react-datepicker__close-icon--disabled": s }), disabled: s, "aria-label": M, onClick: o.onClearClick, title: d, tabIndex: -1 });\n }), o.state = o.calcInitialState(), o.preventFocusTimeout = null, o;\n }\n return Et(r, [{ key: "componentDidMount", value: function() {\n window.addEventListener("scroll", this.onScroll, !0);\n } }, { key: "componentDidUpdate", value: function(n, o) {\n var i, a;\n n.inline && (i = n.selected, a = this.props.selected, i && a ? Dt(i) !== Dt(a) || oe(i) !== oe(a) : i !== a) && this.setPreSelection(this.props.selected), this.state.monthSelectedIn !== void 0 && n.monthsShown !== this.props.monthsShown && this.setState({ monthSelectedIn: 0 }), n.highlightDates !== this.props.highlightDates && this.setState({ highlightDates: iu(this.props.highlightDates) }), o.focused || oi(n.selected, this.props.selected) || this.setState({ inputValue: null }), o.open !== this.state.open && (o.open === !1 && this.state.open === !0 && this.props.onCalendarOpen(), o.open === !0 && this.state.open === !1 && this.props.onCalendarClose());\n } }, { key: "componentWillUnmount", value: function() {\n this.clearPreventFocusTimeout(), window.removeEventListener("scroll", this.onScroll, !0);\n } }, { key: "renderInputContainer", value: function() {\n var n = this.props, o = n.showIcon, i = n.icon, a = n.calendarIconClassname, s = n.toggleCalendarOnIconClick, l = this.state.open;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__input-container".concat(o ? " react-datepicker__view-calendar-icon" : "") }, o && react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CP, qa({ icon: i, className: "".concat(a, " ").concat(l && "react-datepicker-ignore-onclickoutside") }, s ? { onClick: this.toggleCalendar } : null)), this.state.isRenderAriaLiveMessage && this.renderAriaLiveRegion(), this.renderDateInput(), this.renderClearButton());\n } }, { key: "render", value: function() {\n var n = this.renderCalendar();\n if (this.props.inline)\n return n;\n if (this.props.withPortal) {\n var o = this.state.open ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_g, { enableTabLoop: this.props.enableTabLoop }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "react-datepicker__portal", tabIndex: -1, onKeyDown: this.onPortalKeyDown }, n)) : null;\n return this.state.open && this.props.portalId && (o = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Jg, { portalId: this.props.portalId, portalHost: this.props.portalHost }, o)), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, this.renderInputContainer(), o);\n }\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(mP, { className: this.props.popperClassName, wrapperClassName: this.props.wrapperClassName, hidePopper: !this.isCalendarOpen(), portalId: this.props.portalId, portalHost: this.props.portalHost, popperModifiers: this.props.popperModifiers, targetComponent: this.renderInputContainer(), popperContainer: this.props.popperContainer, popperComponent: n, popperPlacement: this.props.popperPlacement, popperProps: this.props.popperProps, popperOnKeyDown: this.onPopperKeyDown, enableTabLoop: this.props.enableTabLoop });\n } }], [{ key: "defaultProps", get: function() {\n return { allowSameDay: !1, dateFormat: "MM/dd/yyyy", dateFormatCalendar: "LLLL yyyy", onChange: function() {\n }, disabled: !1, disabledKeyboardNavigation: !1, dropdownMode: "scroll", onFocus: function() {\n }, onBlur: function() {\n }, onKeyDown: function() {\n }, onInputClick: function() {\n }, onSelect: function() {\n }, onClickOutside: function() {\n }, onMonthChange: function() {\n }, onCalendarOpen: function() {\n }, onCalendarClose: function() {\n }, preventOpenOnFocus: !1, onYearChange: function() {\n }, onInputError: function() {\n }, monthsShown: 1, readOnly: !1, withPortal: !1, selectsDisabledDaysInRange: !1, shouldCloseOnSelect: !0, showTimeSelect: !1, showTimeInput: !1, showPreviousMonths: !1, showMonthYearPicker: !1, showFullMonthYearPicker: !1, showTwoColumnMonthYearPicker: !1, showFourColumnMonthYearPicker: !1, showYearPicker: !1, showQuarterYearPicker: !1, showWeekPicker: !1, strictParsing: !1, timeIntervals: 30, timeCaption: "Time", previousMonthAriaLabel: "Previous Month", previousMonthButtonLabel: "Previous Month", nextMonthAriaLabel: "Next Month", nextMonthButtonLabel: "Next Month", previousYearAriaLabel: "Previous Year", previousYearButtonLabel: "Previous Year", nextYearAriaLabel: "Next Year", nextYearButtonLabel: "Next Year", timeInputLabel: "Time", enableTabLoop: !0, yearItemNumber: Z3, focusSelectedMonth: !1, showPopperArrow: !0, excludeScrollbar: !0, customTimeInput: null, calendarStartDay: void 0, toggleCalendarOnIconClick: !1 };\n } }]), r;\n}(), yP = "input", F6 = "navigate";\nconst pu = [\n "January",\n "February",\n "March",\n "April",\n "May",\n "June",\n "July",\n "August",\n "September",\n "October",\n "November",\n "December"\n], Nl = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n $columnStart: e = "",\n $middle: t = !1,\n $center: r = !1,\n end: n = !1,\n $cellHeight: o = 1,\n $rowStart: i = "",\n width: a = 1,\n area: s = ""\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n grid-column-end: ${`span ${a}`};\n grid-row-end: ${`span ${o}`};\n grid-column-start: ${e};\n grid-row-start: ${i};\n grid-area: ${s};\n\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n flex-flow: column wrap;\n justify-content: center;\n justify-self: stretch;\n `}\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n text-align: center;\n `}\n\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n text-align: end;\n `}\n `\n), LP = "12px", wP = "20px", Ha = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: e,\n $minRowHeight: t = wP,\n $justifyContent: r = "",\n $alignContent: n = "",\n alignItems: o = "",\n // Add the alignItems prop with a default value of \'center\'\n flow: i = "row",\n height: a = "",\n areas: s = "",\n rows: l = "",\n gap: c = LP,\n columns: p\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: grid;\n grid-gap: ${c};\n height: ${a};\n grid-template-columns: ${p && `repeat(${p}, 1fr)`};\n grid-auto-rows: ${`minmax(${t}, auto)`};\n grid-template-areas: ${s};\n grid-template-rows: ${l};\n grid-auto-flow: ${i};\n justify-content: ${r};\n align-content: ${n};\n align-items: ${o}; // Add align-items property\n `\n), ez = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().label)``, K5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, typography: t, fontWeight: r, borderRadius: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n padding: 2px 8px;\n background: ${e.backgrounds.bgPrimary};\n color: ${e.textIcon.textHighemphasis};\n border-radius: ${n.base};\n font-size: ${t.t12};\n font-weight: ${r.light};\n transition: color 0.2s, background-color 0.2s;\n line-height: 17px;\n /* max-width: 64px; */\n cursor: pointer;\n white-space: nowrap;\n\n &:hover {\n background-color: ${e.backgrounds.bgHoverPrimary};\n }\n &:focus-visible {\n box-shadow: 0 0 0 2px ${e.border.borderFocused} inset;\n outline: none;\n }\n\n &:active {\n background-color: ${e.backgrounds.bgTertiary};\n color: ${e.textIcon.textTertiary};\n &:hover {\n background-color: ${e.backgrounds.bgHoverSecondary};\n }\n }\n\n ${Ia} {\n margin-right: 4px;\n }\n `\n), qP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().input(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n left: -9999px;\n width: 0;\n height: 0;\n\n &:checked + ${K5} {\n background-color: ${e.backgrounds.bgTertiary};\n color: ${e.textIcon.textTertiary};\n &:not(:active) {\n &:hover {\n background-color: ${e.backgrounds.bgHoverSecondary};\n }\n }\n &:active {\n background: ${e.backgrounds.bgPressed};\n }\n }\n\n &:disabled + ${K5} {\n background-color: ${e.backgrounds.bgPrimary};\n color: ${e.textIcon.textLowemphasis};\n cursor: not-allowed;\n }\n\n &:checked:disabled + ${K5} {\n color: ${e.toggleSwitch.switchTextReadonlyActive};\n background-color: ${e.backgrounds.bgReadOnly};\n cursor: not-allowed;\n }\n `\n), tz = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n\n ${In} {\n margin-left: ${({ theme: e }) => e.spacings.sp4};\n }\n`, xP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n $isDisabled: e,\n $isError: t,\n $isReadOnly: r,\n theme: { colors: n, spacings: o, borderRadius: i }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n background-color: ${n.white};\n border: 1px solid ${n.gainsboro};\n padding: 4px;\n border-radius: ${i.base};\n\n ${ez} {\n margin-right: ${o.sp4};\n\n &:last-child {\n margin-right: 0;\n }\n }\n\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border-color: ${n.red};\n `}\n\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${n.white};\n border-color: ${n.gainsboro};\n `}\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100%;\n `}\n `\n), RP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { typography: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: 24px;\n font-size: ${e.t12};\n width: 100%;\n display: flex;\n align-items: center;\n padding: 0 8px;\n background-color: ${t.backgrounds.bgReadOnly};\n color: #ffffff;\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: absolute;\n top: 20px;\n transform: translateX(-50%);\n width: 300px;\n`;\nconst du = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n `\n), Au = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: flex-end;\n `\n), uu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n gap: 8px;\n `\n), BP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: ${e.spacings.sp16};\n background-color: ${e.colors.white};\n box-shadow: ${e.shadows.sm};\n position: absolute;\n z-index: 10;\n `\n), WP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: ${e.sp8} 0;\n ${a2} {\n background-color: ${t.LavenderMist};\n }\n `\n), bu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: ${e.sp12} 0;\n ${a2} {\n background-color: ${t.LavenderMist};\n }\n `\n), EP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: ${e.sp8};\n user-select: none;\n `\n), SP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n gap: 4px;\n padding-left: 11px;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: 0 0 ${e.sp8} 0;\n `\n);\nconst hu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { borderRadius: e, transitions: t, colors: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: 10px;\n border-radius: ${e.base};\n transition: ${t.base};\n cursor: pointer;\n\n &:hover {\n background-color: ${r.backgrounds.whiteSmoke};\n }\n\n .icon-system {\n color: ${r.textIcon.textPrimary};\n }\n `\n), kP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-weight: ${e.fontWeight.regular};\n font-size: ${e.typography.t16};\n color: ${e.colors.black};\n margin: 0;\n width: 100%;\n\n .dropdown div div .input__label {\n display: none;\n }\n .input-container {\n &:has(.input-clear-btn) {\n input {\n padding-left: ${e.spacings.sp8} !important;\n padding-right: 35px !important;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n input {\n padding-right: 25px !important;\n padding-left: ${e.spacings.sp8} !important;\n }\n .input-clear-btn {\n right: 36px;\n }\n }\n ${Ha} {\n padding: 0;\n }\n `\n), NP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e }, $isTime: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-bottom: ${e.sp8};\n `}\n `\n), IP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-weight: ${e.fontWeight.light};\n font-size: ${e.typography.t12};\n color: ${e.colors.dark};\n `\n), Mu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n padding-right: 20px;\n input {\n padding-right: 22px !important;\n padding-left: 8px !important;\n }\n svg {\n width: 12px;\n }\n `), fu = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)`\n padding: 8px;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)`\n position: relative;\n`;\nconst gu = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n /* ${tz}{\n justify-content: flex-end;\n } */\n`, zu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-top: ${e.sp8};\n label {\n display: unset;\n }\n svg {\n top: 11px !important;\n }\n `), Cu = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: space-between;\n label {\n display: unset;\n }\n ${Ha} {\n padding: 0;\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n padding: 8px;\n\n header {\n margin: 0px;\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)``;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n input {\n z-index: 13;\n }\n label {\n display: unset;\n }\n ${Ha} {\n padding: 0;\n }\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n label {\n display: unset;\n }\n ${Ha} {\n padding: 0;\n }\n `\n);\nconst Ou = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(L2)`\n cursor: pointer;\n position: relative;\n + * {\n .icon-system {\n cursor: pointer;\n }\n }\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ $isTime: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n `}\n\n gap:8px;\n padding: 0 24px;\n margin-top: 24px;\n input {\n z-index: 11;\n }\n width: ${e ? "308px" : "306px"};\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``);\nconst TP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n bottom: 0;\n `\n), rz = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, isDisabled: t, $isTime: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .react-datepicker-popper[data-placement^=\'top\'],\n .react-datepicker-popper[data-placement^=\'bottom\'],\n .react-datepicker-popper[data-placement^=\'left\'],\n .react-datepicker-popper[data-placement^=\'right\'] {\n position: fixed !important;\n }\n .react-datepicker-popper {\n z-index: 12 !important;\n }\n .align-center,\n .align-left,\n .align-right {\n top: 100%;\n height: fit-content;\n }\n\n .react-datepicker__day-name {\n width: 32px !important;\n height: 32px !important;\n /* padding: 10px; */\n }\n .react-datepicker__day {\n width: 32px !important;\n height: 32px !important;\n font-size: ${e.typography.t12} !important;\n line-height: ${e.lineHeight.lh20};\n }\n .react-datepicker-popper {\n width: min-content;\n }\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .react-datepicker-wrapper {\n position: absolute;\n top: 16px;\n }\n `}\n .react-datepicker__aria-live {\n display: none;\n }\n\n .react-datepicker-popper {\n background-color: ${e.colors.white};\n box-shadow: ${e.shadows.sm};\n padding: ${e.spacings.sp16};\n background-color: ${e.colors.backgrounds.bgPrimary};\n z-index: 11;\n }\n .react-datepicker {\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t12};\n line-height: ${e.lineHeight.lh20};\n color: ${e.colors.blue};\n border: none;\n background-color: ${e.colors.backgrounds.bgPrimary};\n border-radius: ${e.borderRadius.base};\n display: flex;\n flex-direction: column;\n position: relative;\n\n &__header {\n text-align: center;\n background-color: ${e.colors.backgrounds.bgPrimary};\n border-bottom: none;\n border-top-left-radius: ${e.borderRadius.base};\n padding: 0px;\n position: relative;\n\n &:not(.react-datepicker__header--has-time-select) {\n border-top-right-radius: ${e.borderRadius.base};\n }\n }\n\n &__day,\n &__day-name {\n display: inline-block;\n margin: 2px;\n }\n\n &__day {\n outline: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${e.itemSize.lg};\n height: ${e.itemSize.lg};\n font-size: ${e.typography.t16};\n font-weight: ${e.fontWeight.regular};\n color: ${e.colors.textIcon.textSecondary};\n border-radius: ${e.borderRadius.base};\n transition: ${e.transitions.base};\n\n &:hover {\n transition: ${e.transitions.base};\n\n background-color: ${e.colors.backgrounds.bgHoverPrimary};\n color: ${e.colors.textIcon.textSecondary};\n }\n\n &-name {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${e.itemSize.lg};\n height: ${e.itemSize.lg};\n color: ${e.colors.textIcon.textLowemphasis};\n }\n }\n\n &__triangle {\n display: none;\n }\n }\n .react-datepicker__month {\n padding-bottom: 0px !important;\n }\n .react-datepicker__day--selected,\n .react-datepicker__day--in-selecting-range,\n .react-datepicker__day--in-range,\n .react-datepicker__month-text--selected,\n .react-datepicker__month-text--in-selecting-range,\n .react-datepicker__month-text--in-range,\n .react-datepicker__quarter-text--selected,\n .react-datepicker__quarter-text--in-selecting-range,\n .react-datepicker__quarter-text--in-range,\n .react-datepicker__year-text--selected,\n .react-datepicker__year-text--in-selecting-range,\n .react-datepicker__year-text--in-range,\n .react-datepicker__day--keyboard-selected,\n .react-datepicker__month-text--keyboard-selected,\n .react-datepicker__quarter-text--keyboard-selected,\n .react-datepicker__year-text--keyboard-selected {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.backgrounds.bgHoverSecondary};\n color: ${e.colors.buttonText.buttonTextPrimaryPressed};\n\n &:hover {\n background-color: ${e.colors.backgrounds.bgHoverSecondary};\n color: ${e.colors.buttonText.buttonTextPrimaryPressed};\n }\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n margin-left: -8px;\n position: absolute;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow,\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n box-sizing: content-box;\n position: absolute;\n border: 8px solid transparent;\n height: 0;\n width: 1px;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n content: \'\';\n z-index: -1;\n border-width: 8px;\n left: -8px;\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle {\n top: 0;\n margin-top: -8px;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before {\n border-top: none;\n border-bottom-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before {\n top: -1px;\n border-bottom-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n bottom: 0;\n margin-bottom: -8px;\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n border-bottom: none;\n border-top-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n bottom: -1px;\n border-top-color: ${e.colors.white};\n }\n .react-datepicker--time-only .react-datepicker__triangle {\n left: 35px;\n }\n\n .react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n }\n\n .react-datepicker__year-option:first-of-type,\n .react-datepicker__month-option:first-of-type,\n .react-datepicker__month-year-option:first-of-type {\n border-top-left-radius: ${e.borderRadius.base};\n border-top-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker--time-only .react-datepicker__time,\n .react-datepicker--time-only .react-datepicker__time-box {\n border-bottom-left-radius: ${e.borderRadius.base};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__day--today,\n .react-datepicker__month-text--today,\n .react-datepicker__quarter-text--today,\n .react-datepicker__year-text--today {\n font-weight: ${e.fontWeight.regular};\n }\n\n .react-datepicker--time-only .react-datepicker__triangle {\n left: 35px;\n }\n\n .react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n }\n\n .react-datepicker__triangle {\n position: absolute;\n left: 50px;\n }\n\n .react-datepicker-popper {\n z-index: 10;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\'] {\n margin-top: 10px;\n }\n\n .react-datepicker-popper[data-placement=\'bottom-end\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement=\'top-end\']\n .react-datepicker__triangle {\n left: auto;\n right: 50px;\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] {\n margin-bottom: 10px;\n }\n\n .react-datepicker-popper[data-placement^=\'right\'] {\n margin-left: 8px;\n }\n\n .react-datepicker-popper[data-placement^=\'right\']\n .react-datepicker__triangle {\n left: auto;\n right: 42px;\n }\n\n .react-datepicker-popper[data-placement^=\'left\'] {\n margin-right: 8px;\n }\n\n .react-datepicker-popper[data-placement^=\'left\']\n .react-datepicker__triangle {\n left: 42px;\n right: auto;\n }\n .react-datepicker__header--time {\n padding-bottom: 8px;\n padding-left: 5px;\n padding-right: 5px;\n }\n\n .react-datepicker__header--time:not(.react-datepicker__header--time--only) {\n border-top-left-radius: 0;\n }\n\n .react-datepicker__year-dropdown-container--select,\n .react-datepicker__month-dropdown-container--select,\n .react-datepicker__month-year-dropdown-container--select,\n .react-datepicker__year-dropdown-container--scroll,\n .react-datepicker__month-dropdown-container--scroll,\n .react-datepicker__month-year-dropdown-container--scroll {\n display: inline-block;\n margin: 0 2px;\n }\n\n .react-datepicker__current-month,\n .react-datepicker-time__header,\n .react-datepicker-year-header {\n margin-top: 0;\n color: ${e.colors.black};\n font-weight: ${e.fontWeight.bold};\n font-size: ${e.typography.t16};\n }\n\n .react-datepicker-time__header {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .react-datepicker__navigation {\n background: none;\n line-height: 1.7rem;\n text-align: center;\n cursor: pointer;\n position: absolute;\n top: 10px;\n padding: 0;\n border: 0.45rem solid transparent;\n z-index: 1;\n height: 10px;\n width: 10px;\n text-indent: -999em;\n overflow: hidden;\n }\n\n .react-datepicker__navigation--previous {\n left: 10px;\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--previous:hover {\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--previous--disabled,\n .react-datepicker__navigation--previous--disabled:hover {\n border-right-color: ${e.colors.darkGray};\n cursor: default;\n }\n\n .react-datepicker__navigation--next {\n right: 10px;\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--next--with-time:not(\n .react-datepicker__navigation--next--with-today-button\n ) {\n right: 95px;\n }\n\n .react-datepicker__navigation--next:hover {\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--next--disabled,\n .react-datepicker__navigation--next--disabled:hover {\n border-left-color: ${e.colors.darkGray};\n cursor: default;\n }\n\n .react-datepicker__navigation--years {\n position: relative;\n top: 0;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .react-datepicker__navigation--years-previous {\n top: 4px;\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-previous:hover {\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-upcoming {\n top: -4px;\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-upcoming:hover {\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__month-container {\n float: left;\n }\n\n .react-datepicker__year {\n margin: 0.4rem;\n text-align: center;\n }\n\n .react-datepicker__year-wrapper {\n display: flex;\n flex-wrap: wrap;\n max-width: 180px;\n }\n\n .react-datepicker__year .react-datepicker__year-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n }\n\n .react-datepicker__month {\n padding-bottom: 1rem;\n text-align: center;\n }\n\n .react-datepicker__month .react-datepicker__month-text,\n .react-datepicker__month .react-datepicker__quarter-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n }\n\n .react-datepicker__input-time-container {\n clear: both;\n width: 100%;\n float: left;\n margin: 5px 0 10px 15px;\n text-align: left;\n }\n\n .react-datepicker__input-time-container .react-datepicker-time__caption {\n display: inline-block;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container {\n display: inline-block;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input {\n display: inline-block;\n margin-left: 10px;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input {\n width: 85px;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\']::-webkit-inner-spin-button,\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\']::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\'] {\n -moz-appearance: textfield;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__delimiter {\n margin-left: 5px;\n display: inline-block;\n }\n\n .react-datepicker__time-container {\n float: right;\n border-left: none;\n width: 85px;\n }\n\n .react-datepicker__time-container--with-today-button {\n display: inline;\n border: 1px solid ${e.colors.black};\n border-radius: 0.3rem;\n position: absolute;\n right: -72px;\n top: 0;\n }\n .react-datepicker__today-button {\n border-top: none !important;\n text-align: left !important;\n }\n\n .react-datepicker__time-container .react-datepicker__time {\n position: relative;\n background: ${e.colors.white};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box {\n width: 85px;\n overflow-x: hidden;\n margin: 0 auto;\n text-align: center;\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list {\n list-style: none;\n margin: 0;\n height: calc(195px + (1.7rem / 2));\n overflow-y: scroll;\n padding-right: 0;\n padding-left: 0;\n width: 100%;\n box-sizing: content-box;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item {\n height: 30px;\n padding: 5px 10px;\n white-space: nowrap;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item:hover {\n cursor: pointer;\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--selected {\n background-color: ${e.colors.blue};\n color: ${e.colors.white};\n font-weight: bold;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--selected:hover {\n background-color: ${e.colors.blue};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--disabled {\n color: ${e.colors.darkGray};\n }\n\n .react-datepicker__week-number {\n color: ${e.colors.darkGray};\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n }\n\n .react-datepicker__week-number.react-datepicker__week-number--clickable {\n cursor: pointer;\n }\n\n .react-datepicker__week-number.react-datepicker__week-number--clickable:hover {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__day-names,\n .react-datepicker__week {\n white-space: nowrap;\n user-select: none;\n }\n\n .react-datepicker__time-name {\n color: ${e.colors.black};\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n }\n\n .react-datepicker__month--selected,\n .react-datepicker__month--in-selecting-range,\n .react-datepicker__month--in-range,\n .react-datepicker__quarter--selected,\n .react-datepicker__quarter--in-selecting-range,\n .react-datepicker__quarter--in-range {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.blue};\n color: ${e.colors.white};\n }\n\n .react-datepicker__month--selected:hover,\n .react-datepicker__month--in-selecting-range:hover,\n .react-datepicker__month--in-range:hover,\n .react-datepicker__quarter--selected:hover,\n .react-datepicker__quarter--in-selecting-range:hover,\n .react-datepicker__quarter--in-range:hover {\n background-color: ${e.colors.scampi};\n }\n\n .react-datepicker__month--disabled,\n .react-datepicker__quarter--disabled {\n color: ${e.colors.darkGray};\n pointer-events: none;\n }\n\n .react-datepicker__month--disabled:hover,\n .react-datepicker__quarter--disabled:hover {\n cursor: default;\n background-color: transparent;\n }\n\n .react-datepicker__day,\n .react-datepicker__month-text,\n .react-datepicker__quarter-text,\n .react-datepicker__year-text {\n cursor: pointer;\n }\n\n .react-datepicker__month-text:hover,\n .react-datepicker__quarter-text:hover,\n .react-datepicker__year-text:hover {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__day--highlighted,\n .react-datepicker__month-text--highlighted,\n .react-datepicker__quarter-text--highlighted,\n .react-datepicker__year-text--highlighted {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.mediumSeaGreen};\n color: ${e.colors.white};\n }\n\n .react-datepicker__day--highlighted:hover,\n .react-datepicker__month-text--highlighted:hover,\n .react-datepicker__quarter-text--highlighted:hover,\n .react-datepicker__year-text--highlighted:hover {\n background-color: ${e.colors.mediumSeaGreen};\n }\n\n .react-datepicker__day--highlighted-custom-1,\n .react-datepicker__month-text--highlighted-custom-1,\n .react-datepicker__quarter-text--highlighted-custom-1,\n .react-datepicker__year-text--highlighted-custom-1 {\n color: ${e.colors.pink};\n }\n\n .react-datepicker__day--highlighted-custom-2,\n .react-datepicker__month-text--highlighted-custom-2,\n .react-datepicker__quarter-text--highlighted-custom-2,\n .react-datepicker__year-text--highlighted-custom-2 {\n color: ${e.colors.green};\n }\n\n .react-datepicker__day--in-selecting-range,\n .react-datepicker__month-text--in-selecting-range,\n .react-datepicker__quarter-text--in-selecting-range,\n .react-datepicker__year-text--in-selecting-range {\n background-color: ${`rgba( ${e.colors.blue}, 0.5)`};\n }\n\n .react-datepicker__month--selecting-range .react-datepicker__day--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__month-text--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__quarter-text--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__year-text--in-range {\n background-color: ${e.colors.lavenderGrey};\n color: ${e.colors.black};\n }\n\n .react-datepicker__day--disabled,\n .react-datepicker__month-text--disabled,\n .react-datepicker__quarter-text--disabled,\n .react-datepicker__year-text--disabled {\n cursor: default;\n color: ${e.colors.darkGray};\n }\n\n .react-datepicker__day--disabled:hover,\n .react-datepicker__month-text--disabled:hover,\n .react-datepicker__quarter-text--disabled:hover,\n .react-datepicker__year-text--disabled:hover {\n background-color: transparent;\n }\n\n .react-datepicker__quarter-text.react-datepicker__month--selected:hover,\n .react-datepicker__quarter-text.react-datepicker__month--in-range:hover,\n .react-datepicker__quarter-text.react-datepicker__quarter--selected:hover,\n .react-datepicker__quarter-text.react-datepicker__quarter--in-range:hover {\n background-color: ${e.colors.blue};\n }\n\n .react-datepicker__month-text:hover,\n .react-datepicker__quarter-text:hover {\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__input-container {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n .react-datepicker__year-read-view,\n .react-datepicker__month-read-view,\n .react-datepicker__month-year-read-view {\n border: 1px solid transparent;\n border-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__year-read-view:hover,\n .react-datepicker__month-read-view:hover,\n .react-datepicker__month-year-read-view:hover {\n cursor: pointer;\n }\n\n .react-datepicker__year-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__year-read-view:hover\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view:hover\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-year-read-view:hover\n .react-datepicker__month-read-view--down-arrow {\n border-top-color: transparent;\n }\n\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n border-top-color: ${e.colors.black};\n float: right;\n margin-left: 20px;\n top: 8px;\n position: relative;\n border-width: 0.45rem;\n }\n\n .react-datepicker__year-dropdown,\n .react-datepicker__month-dropdown,\n .react-datepicker__month-year-dropdown {\n background-color: ${e.colors.white};\n position: absolute;\n width: 50%;\n left: 25%;\n top: 30px;\n z-index: 1;\n text-align: center;\n border-radius: ${e.borderRadius.base};\n border: 1px solid ${e.colors.black};\n }\n\n .react-datepicker__year-dropdown:hover,\n .react-datepicker__month-dropdown:hover,\n .react-datepicker__month-year-dropdown:hover {\n cursor: pointer;\n }\n\n .react-datepicker__year-dropdown--scrollable,\n .react-datepicker__month-dropdown--scrollable,\n .react-datepicker__month-year-dropdown--scrollable {\n height: 150px;\n overflow-y: scroll;\n }\n\n .react-datepicker__year-option,\n .react-datepicker__month-option,\n .react-datepicker__month-year-option {\n line-height: 20px;\n width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .react-datepicker__year-option:last-of-type,\n .react-datepicker__month-option:last-of-type,\n .react-datepicker__month-year-option:last-of-type {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border-bottom-left-radius: ${e.borderRadius.base};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__year-option:hover,\n .react-datepicker__month-option:hover,\n .react-datepicker__month-year-option:hover {\n background-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option:hover\n .react-datepicker__navigation--years-upcoming,\n .react-datepicker__month-option:hover\n .react-datepicker__navigation--years-upcoming,\n .react-datepicker__month-year-option:hover\n .react-datepicker__navigation--years-upcoming {\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option:hover\n .react-datepicker__navigation--years-previous,\n .react-datepicker__month-option:hover\n .react-datepicker__navigation--years-previous,\n .react-datepicker__month-year-option:hover\n .react-datepicker__navigation--years-previous {\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option--selected,\n .react-datepicker__month-option--selected,\n .react-datepicker__month-year-option--selected {\n position: absolute;\n left: 15px;\n }\n\n .react-datepicker__close-icon {\n cursor: pointer;\n background-color: transparent;\n border: 0;\n outline: 0;\n padding: 0 6px 0 0;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n display: table-cell;\n vertical-align: middle;\n }\n\n .react-datepicker__today-button {\n background: ${e.colors.white};\n border-top: 1px solid ${e.colors.black};\n cursor: pointer;\n text-align: center;\n font-weight: bold;\n padding: 0px;\n clear: left;\n }\n\n .react-datepicker__portal {\n position: fixed;\n width: 100vw;\n height: 100vh;\n background-color: ${`rgba(${e.colors.black}, 0.8)`};\n left: 0;\n top: 0;\n justify-content: center;\n align-items: center;\n display: flex;\n z-index: 2147483647;\n }\n\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 3rem;\n line-height: 3rem;\n }\n\n @media (max-width: 400px), (max-height: 550px) {\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 2rem;\n line-height: 2rem;\n }\n }\n\n .react-datepicker__portal .react-datepicker__current-month,\n .react-datepicker__portal .react-datepicker-time__header {\n font-size: ${e.typography.t20};\n }\n\n .react-datepicker__portal .react-datepicker__navigation {\n border: 0.81rem solid transparent;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous {\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous:hover {\n border-right-color: unset;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous--disabled,\n .react-datepicker__portal\n .react-datepicker__navigation--previous--disabled:hover {\n border-right-color: ${e.colors.grey};\n cursor: default;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next {\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next:hover {\n border-left-color: unset;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next--disabled,\n .react-datepicker__portal\n .react-datepicker__navigation--next--disabled:hover {\n border-left-color: ${e.colors.grey};\n cursor: default;\n }\n\n .react-datepicker__day--outside-month {\n color: ${e.colors.textIcon.textDisabledOnbg};\n }\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${S7} {\n cursor: default;\n color: ${e.colors.textIcon.textDisabledOnbg};\n background-color: ${e.colors.backgrounds.bgDisabledPrimary};\n }\n svg {\n color: #8f8f95;\n }\n `}\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 250px;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n `);\nconst nz = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin-bottom: ${e.sp8};\n `\n), DP = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 400px;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: column;\n gap: 8px;\n `\n);\nconst HP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), mu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${nz} {\n label {\n display: none;\n }\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: ${e.sp8};\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 0 ${e.sp8};\n `\n);\nconst U6 = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(L2)(({ iconRight: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n cursor: pointer;\n position: relative;\n + * {\n .icon-system {\n cursor: pointer;\n }\n }\n ${e && e == "ChevronUp" && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border: 1px solid #312783;\n `}\n `), PP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n input {\n padding-right: 48px;\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ horizontal: e, outside: t, inside: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n svg {\n position: absolute;\n right: 32px;\n top: 28px;\n z-index: 1;\n opacity: 0.2;\n width: 12px;\n cursor: pointer;\n }\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n svg {\n position: absolute;\n right: 30px;\n top: 10px;\n z-index: 1;\n opacity: 0.2;\n width: 12px;\n cursor: pointer;\n }\n `}\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n svg {\n position: absolute;\n right: 30px;\n top: 30px;\n z-index: 1;\n width: 12px;\n opacity: 0.2;\n cursor: pointer;\n }\n `}\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n svg {\n position: absolute;\n right: 30px;\n top: 10px;\n z-index: 1;\n width: 12px;\n opacity: 0.2;\n cursor: pointer;\n }\n `}\n `\n);\nconst VP = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().ul)`\n padding-left: 20px;\n padding-right: 10px;\n margin: 0;\n`, FP = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Mg)`\n margin-bottom: 5px;\n padding: 0;\n display: list-item;\n &:last-child {\n margin-bottom: 0;\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 250px;\n`;\nconst UP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: column;\n gap:8px;\n `);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n gap:8px;\n justify-content: flex-end;\n `);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 518px;\n`;\nconst YP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n .input-clear-btn {\n right: 32px;\n }\n .input-wrapper input {\n padding-right: 34px;\n }\n `\n), XP = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(L2)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border-bottom: 1px solid ${e.border.borderTertiary} !important;\n background-color: ${e.backgrounds.bgPrimary};\n border-radius: 0px;\n color: ${e.textIcon.textLowemphasis};\n &:hover:not(:disabled):not(:focus) {\n border: 1px solid transparent;\n border-bottom: 1px solid ${e.border.borderTertiary};\n }\n &:hover:focus {\n border: 1px solid transparent;\n border-bottom: 1px solid ${e.border.borderTertiary};\n }\n &:hover {\n border: 1px solid transparent;\n border-bottom: 1px solid ${e.border.borderTertiary};\n }\n &:focus {\n border: 1px solid transparent;\n border-bottom: 1px solid ${e.border.borderTertiary};\n }\n `\n);\nfunction yc(e) {\n const t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [r, n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), {\n onChange: o,\n value: i,\n getValue: a,\n iconSize: s,\n inputType: l,\n resetValues: c,\n handleClearFn: p,\n ...d\n } = e, u = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (b) => {\n const { value: M } = b.currentTarget;\n n(M), o && o(b), a && a(M);\n },\n [n, o, a]\n ), h = () => {\n p && p(), n(""), a && a("");\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c && h();\n }, [c]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i && n(i);\n }, [i]), /* @__PURE__ */ A(YP, { children: l != "base" ? /* @__PURE__ */ A(\n XP,\n {\n ...d,\n onChange: u,\n colorIconLeft: "#797980",\n iconLeft: "Search",\n value: r,\n ref: t,\n handleClearFn: h,\n iconSize: s || "xxs",\n label: e.label\n }\n ) : /* @__PURE__ */ A(\n L2,\n {\n ...d,\n onChange: u,\n iconLeft: "Search",\n colorIconLeft: "#797980",\n value: r,\n ref: t,\n handleClearFn: h,\n iconSize: s || "xxs"\n }\n ) });\n}\nconst QP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n \n width: 100%;\n height: 100%;\n align-self: stretch;\n border-radius: 4px;\n `\n), GP = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100%;\n height: 100%;\n align-self: stretch;\n border-radius: 4px;\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 300px;\n`;\nvar vu = Number.isNaN || function(t) {\n return typeof t == "number" && t !== t;\n};\nfunction jP(e, t) {\n return !!(e === t || vu(e) && vu(t));\n}\nfunction KP(e, t) {\n if (e.length !== t.length)\n return !1;\n for (var r = 0; r < e.length; r++)\n if (!jP(e[r], t[r]))\n return !1;\n return !0;\n}\nfunction gt(e, t) {\n t === void 0 && (t = KP);\n var r, n = [], o, i = !1;\n function a() {\n for (var s = [], l = 0; l < arguments.length; l++)\n s[l] = arguments[l];\n return i && r === this && t(s, n) || (o = e.apply(this, s), i = !0, r = this, n = s), o;\n }\n return a;\n}\nvar ZP = typeof performance == "object" && typeof performance.now == "function", yu = ZP ? function() {\n return performance.now();\n} : function() {\n return Date.now();\n};\nfunction Lu(e) {\n cancelAnimationFrame(e.id);\n}\nfunction JP(e, t) {\n var r = yu();\n function n() {\n yu() - r >= t ? e.call(null) : o.id = requestAnimationFrame(n);\n }\n var o = {\n id: requestAnimationFrame(n)\n };\n return o;\n}\nvar Y6 = -1;\nfunction wu(e) {\n if (e === void 0 && (e = !1), Y6 === -1 || e) {\n var t = document.createElement("div"), r = t.style;\n r.width = "50px", r.height = "50px", r.overflow = "scroll", document.body.appendChild(t), Y6 = t.offsetWidth - t.clientWidth, document.body.removeChild(t);\n }\n return Y6;\n}\nvar Pi = null;\nfunction qu(e) {\n if (e === void 0 && (e = !1), Pi === null || e) {\n var t = document.createElement("div"), r = t.style;\n r.width = "50px", r.height = "50px", r.overflow = "scroll", r.direction = "rtl";\n var n = document.createElement("div"), o = n.style;\n return o.width = "100px", o.height = "100px", t.appendChild(n), document.body.appendChild(t), t.scrollLeft > 0 ? Pi = "positive-descending" : (t.scrollLeft = 1, t.scrollLeft === 0 ? Pi = "negative" : Pi = "positive-ascending"), document.body.removeChild(t), Pi;\n }\n return Pi;\n}\n"production";\nvar _P = 150, $P = function(t, r) {\n return t;\n}, Z5 = null, J5 = null;\n false && (0);\nfunction eV(e) {\n var t, r = e.getItemOffset, n = e.getEstimatedTotalSize, o = e.getItemSize, i = e.getOffsetForIndexAndAlignment, a = e.getStartIndexForOffset, s = e.getStopIndexForStartIndex, l = e.initInstanceProps, c = e.shouldResetStyleCacheOnItemSizeChange, p = e.validateProps;\n return t = /* @__PURE__ */ function(d) {\n gc(u, d);\n function u(b) {\n var M;\n return M = d.call(this, b) || this, M._instanceProps = l(M.props, B0(M)), M._outerRef = void 0, M._resetIsScrollingTimeoutId = null, M.state = {\n instance: B0(M),\n isScrolling: !1,\n scrollDirection: "forward",\n scrollOffset: typeof M.props.initialScrollOffset == "number" ? M.props.initialScrollOffset : 0,\n scrollUpdateWasRequested: !1\n }, M._callOnItemsRendered = void 0, M._callOnItemsRendered = gt(function(C, g, f, O) {\n return M.props.onItemsRendered({\n overscanStartIndex: C,\n overscanStopIndex: g,\n visibleStartIndex: f,\n visibleStopIndex: O\n });\n }), M._callOnScroll = void 0, M._callOnScroll = gt(function(C, g, f) {\n return M.props.onScroll({\n scrollDirection: C,\n scrollOffset: g,\n scrollUpdateWasRequested: f\n });\n }), M._getItemStyle = void 0, M._getItemStyle = function(C) {\n var g = M.props, f = g.direction, O = g.itemSize, m = g.layout, v = M._getItemStyleCache(c && O, c && m, c && f), y;\n if (v.hasOwnProperty(C))\n y = v[C];\n else {\n var z = r(M.props, C, M._instanceProps), N = o(M.props, C, M._instanceProps), W = f === "horizontal" || m === "horizontal", T = f === "rtl", x = W ? z : 0;\n v[C] = y = {\n position: "absolute",\n left: T ? void 0 : x,\n right: T ? x : void 0,\n top: W ? 0 : z,\n height: W ? "100%" : N,\n width: W ? N : "100%"\n };\n }\n return y;\n }, M._getItemStyleCache = void 0, M._getItemStyleCache = gt(function(C, g, f) {\n return {};\n }), M._onScrollHorizontal = function(C) {\n var g = C.currentTarget, f = g.clientWidth, O = g.scrollLeft, m = g.scrollWidth;\n M.setState(function(v) {\n if (v.scrollOffset === O)\n return null;\n var y = M.props.direction, z = O;\n if (y === "rtl")\n switch (qu()) {\n case "negative":\n z = -O;\n break;\n case "positive-descending":\n z = m - f - O;\n break;\n }\n return z = Math.max(0, Math.min(z, m - f)), {\n isScrolling: !0,\n scrollDirection: v.scrollOffset < z ? "forward" : "backward",\n scrollOffset: z,\n scrollUpdateWasRequested: !1\n };\n }, M._resetIsScrollingDebounced);\n }, M._onScrollVertical = function(C) {\n var g = C.currentTarget, f = g.clientHeight, O = g.scrollHeight, m = g.scrollTop;\n M.setState(function(v) {\n if (v.scrollOffset === m)\n return null;\n var y = Math.max(0, Math.min(m, O - f));\n return {\n isScrolling: !0,\n scrollDirection: v.scrollOffset < y ? "forward" : "backward",\n scrollOffset: y,\n scrollUpdateWasRequested: !1\n };\n }, M._resetIsScrollingDebounced);\n }, M._outerRefSetter = function(C) {\n var g = M.props.outerRef;\n M._outerRef = C, typeof g == "function" ? g(C) : g != null && typeof g == "object" && g.hasOwnProperty("current") && (g.current = C);\n }, M._resetIsScrollingDebounced = function() {\n M._resetIsScrollingTimeoutId !== null && Lu(M._resetIsScrollingTimeoutId), M._resetIsScrollingTimeoutId = JP(M._resetIsScrolling, _P);\n }, M._resetIsScrolling = function() {\n M._resetIsScrollingTimeoutId = null, M.setState({\n isScrolling: !1\n }, function() {\n M._getItemStyleCache(-1, null);\n });\n }, M;\n }\n u.getDerivedStateFromProps = function(M, C) {\n return tV(M, C), p(M), null;\n };\n var h = u.prototype;\n return h.scrollTo = function(M) {\n M = Math.max(0, M), this.setState(function(C) {\n return C.scrollOffset === M ? null : {\n scrollDirection: C.scrollOffset < M ? "forward" : "backward",\n scrollOffset: M,\n scrollUpdateWasRequested: !0\n };\n }, this._resetIsScrollingDebounced);\n }, h.scrollToItem = function(M, C) {\n C === void 0 && (C = "auto");\n var g = this.props, f = g.itemCount, O = g.layout, m = this.state.scrollOffset;\n M = Math.max(0, Math.min(M, f - 1));\n var v = 0;\n if (this._outerRef) {\n var y = this._outerRef;\n O === "vertical" ? v = y.scrollWidth > y.clientWidth ? wu() : 0 : v = y.scrollHeight > y.clientHeight ? wu() : 0;\n }\n this.scrollTo(i(this.props, M, C, m, this._instanceProps, v));\n }, h.componentDidMount = function() {\n var M = this.props, C = M.direction, g = M.initialScrollOffset, f = M.layout;\n if (typeof g == "number" && this._outerRef != null) {\n var O = this._outerRef;\n C === "horizontal" || f === "horizontal" ? O.scrollLeft = g : O.scrollTop = g;\n }\n this._callPropsCallbacks();\n }, h.componentDidUpdate = function() {\n var M = this.props, C = M.direction, g = M.layout, f = this.state, O = f.scrollOffset, m = f.scrollUpdateWasRequested;\n if (m && this._outerRef != null) {\n var v = this._outerRef;\n if (C === "horizontal" || g === "horizontal")\n if (C === "rtl")\n switch (qu()) {\n case "negative":\n v.scrollLeft = -O;\n break;\n case "positive-ascending":\n v.scrollLeft = O;\n break;\n default:\n var y = v.clientWidth, z = v.scrollWidth;\n v.scrollLeft = z - y - O;\n break;\n }\n else\n v.scrollLeft = O;\n else\n v.scrollTop = O;\n }\n this._callPropsCallbacks();\n }, h.componentWillUnmount = function() {\n this._resetIsScrollingTimeoutId !== null && Lu(this._resetIsScrollingTimeoutId);\n }, h.render = function() {\n var M = this.props, C = M.children, g = M.className, f = M.direction, O = M.height, m = M.innerRef, v = M.innerElementType, y = M.innerTagName, z = M.itemCount, N = M.itemData, W = M.itemKey, T = W === void 0 ? $P : W, x = M.layout, E = M.outerElementType, L = M.outerTagName, w = M.style, q = M.useIsScrolling, S = M.width, B = this.state.isScrolling, I = f === "horizontal" || x === "horizontal", P = I ? this._onScrollHorizontal : this._onScrollVertical, k = this._getRangeToRender(), K = k[0], $ = k[1], j = [];\n if (z > 0)\n for (var r1 = K; r1 <= $; r1++)\n j.push((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(C, {\n data: N,\n key: T(r1, N),\n index: r1,\n isScrolling: q ? B : void 0,\n style: this._getItemStyle(r1)\n }));\n var a1 = n(this.props, this._instanceProps);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(E || L || "div", {\n className: g,\n onScroll: P,\n ref: this._outerRefSetter,\n style: H0({\n position: "relative",\n height: O,\n width: S,\n overflow: "auto",\n WebkitOverflowScrolling: "touch",\n willChange: "transform",\n direction: f\n }, w)\n }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(v || y || "div", {\n children: j,\n ref: m,\n style: {\n height: I ? "100%" : a1,\n pointerEvents: B ? "none" : void 0,\n width: I ? a1 : "100%"\n }\n }));\n }, h._callPropsCallbacks = function() {\n if (typeof this.props.onItemsRendered == "function") {\n var M = this.props.itemCount;\n if (M > 0) {\n var C = this._getRangeToRender(), g = C[0], f = C[1], O = C[2], m = C[3];\n this._callOnItemsRendered(g, f, O, m);\n }\n }\n if (typeof this.props.onScroll == "function") {\n var v = this.state, y = v.scrollDirection, z = v.scrollOffset, N = v.scrollUpdateWasRequested;\n this._callOnScroll(y, z, N);\n }\n }, h._getRangeToRender = function() {\n var M = this.props, C = M.itemCount, g = M.overscanCount, f = this.state, O = f.isScrolling, m = f.scrollDirection, v = f.scrollOffset;\n if (C === 0)\n return [0, 0, 0, 0];\n var y = a(this.props, v, this._instanceProps), z = s(this.props, y, v, this._instanceProps), N = !O || m === "backward" ? Math.max(1, g) : 1, W = !O || m === "forward" ? Math.max(1, g) : 1;\n return [Math.max(0, y - N), Math.max(0, Math.min(C - 1, z + W)), y, z];\n }, u;\n }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent), t.defaultProps = {\n direction: "ltr",\n itemData: void 0,\n layout: "vertical",\n overscanCount: 2,\n useIsScrolling: !1\n }, t;\n}\nvar tV = function(t, r) {\n var n = t.children, o = t.direction, i = t.height, a = t.layout, s = t.innerTagName, l = t.outerTagName, c = t.width, p = r.instance;\n if (false) // removed by dead control flow\n{ var d; }\n}, rV = 50, ea = function(t, r, n) {\n var o = t, i = o.itemSize, a = n.itemMetadataMap, s = n.lastMeasuredIndex;\n if (r > s) {\n var l = 0;\n if (s >= 0) {\n var c = a[s];\n l = c.offset + c.size;\n }\n for (var p = s + 1; p <= r; p++) {\n var d = i(p);\n a[p] = {\n offset: l,\n size: d\n }, l += d;\n }\n n.lastMeasuredIndex = r;\n }\n return a[r];\n}, nV = function(t, r, n) {\n var o = r.itemMetadataMap, i = r.lastMeasuredIndex, a = i > 0 ? o[i].offset : 0;\n return a >= n ? oz(t, r, i, 0, n) : oV(t, r, Math.max(0, i), n);\n}, oz = function(t, r, n, o, i) {\n for (; o <= n; ) {\n var a = o + Math.floor((n - o) / 2), s = ea(t, a, r).offset;\n if (s === i)\n return a;\n s < i ? o = a + 1 : s > i && (n = a - 1);\n }\n return o > 0 ? o - 1 : 0;\n}, oV = function(t, r, n, o) {\n for (var i = t.itemCount, a = 1; n < i && ea(t, n, r).offset < o; )\n n += a, a *= 2;\n return oz(t, r, Math.min(n, i - 1), Math.floor(n / 2), o);\n}, xu = function(t, r) {\n var n = t.itemCount, o = r.itemMetadataMap, i = r.estimatedItemSize, a = r.lastMeasuredIndex, s = 0;\n if (a >= n && (a = n - 1), a >= 0) {\n var l = o[a];\n s = l.offset + l.size;\n }\n var c = n - a - 1, p = c * i;\n return s + p;\n}, Ru = /* @__PURE__ */ eV({\n getItemOffset: function(t, r, n) {\n return ea(t, r, n).offset;\n },\n getItemSize: function(t, r, n) {\n return n.itemMetadataMap[r].size;\n },\n getEstimatedTotalSize: xu,\n getOffsetForIndexAndAlignment: function(t, r, n, o, i, a) {\n var s = t.direction, l = t.height, c = t.layout, p = t.width, d = s === "horizontal" || c === "horizontal", u = d ? p : l, h = ea(t, r, i), b = xu(t, i), M = Math.max(0, Math.min(b - u, h.offset)), C = Math.max(0, h.offset - u + h.size + a);\n switch (n === "smart" && (o >= C - u && o <= M + u ? n = "auto" : n = "center"), n) {\n case "start":\n return M;\n case "end":\n return C;\n case "center":\n return Math.round(C + (M - C) / 2);\n case "auto":\n default:\n return o >= C && o <= M ? o : o < C ? C : M;\n }\n },\n getStartIndexForOffset: function(t, r, n) {\n return nV(t, n, r);\n },\n getStopIndexForStartIndex: function(t, r, n, o) {\n for (var i = t.direction, a = t.height, s = t.itemCount, l = t.layout, c = t.width, p = i === "horizontal" || l === "horizontal", d = p ? c : a, u = ea(t, r, o), h = n + d, b = u.offset + u.size, M = r; M < s - 1 && b < h; )\n M++, b += ea(t, M, o).size;\n return M;\n },\n initInstanceProps: function(t, r) {\n var n = t, o = n.estimatedItemSize, i = {\n itemMetadataMap: {},\n estimatedItemSize: o || rV,\n lastMeasuredIndex: -1\n };\n return r.resetAfterIndex = function(a, s) {\n s === void 0 && (s = !0), i.lastMeasuredIndex = Math.min(i.lastMeasuredIndex, a - 1), r._getItemStyleCache(-1), s && r.forceUpdate();\n }, i;\n },\n shouldResetStyleCacheOnItemSizeChange: !1,\n validateProps: function(t) {\n var r = t.itemSize;\n if (false)\n // removed by dead control flow\n{}\n }\n});\nfunction Bu(e) {\n return typeof e == "number" && isFinite(e) && Math.floor(e) === e;\n}\nfunction iV(e) {\n var t = e.lastRenderedStartIndex, r = e.lastRenderedStopIndex, n = e.startIndex, o = e.stopIndex;\n return !(n > r || o < t);\n}\nfunction aV(e) {\n for (var t = e.isItemLoaded, r = e.itemCount, n = e.minimumBatchSize, o = e.startIndex, i = e.stopIndex, a = [], s = null, l = null, c = o; c <= i; c++) {\n var p = t(c);\n p ? l !== null && (a.push(s, l), s = l = null) : (l = c, s === null && (s = c));\n }\n if (l !== null) {\n for (var d = Math.min(Math.max(l, s + n - 1), r - 1), u = l + 1; u <= d && !t(u); u++)\n l = u;\n a.push(s, l);\n }\n if (a.length)\n for (; a[1] - a[0] + 1 < n && a[0] > 0; ) {\n var h = a[0] - 1;\n if (!t(h))\n a[0] = h;\n else\n break;\n }\n return a;\n}\nvar sV = function(e, t) {\n if (!(e instanceof t))\n throw new TypeError("Cannot call a class as a function");\n}, lV = function() {\n function e(t, r) {\n for (var n = 0; n < r.length; n++) {\n var o = r[n];\n o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o);\n }\n }\n return function(t, r, n) {\n return r && e(t.prototype, r), n && e(t, n), t;\n };\n}(), cV = function(e, t) {\n if (typeof t != "function" && t !== null)\n throw new TypeError("Super expression must either be null or a function, not " + typeof t);\n e.prototype = Object.create(t && t.prototype, {\n constructor: {\n value: e,\n enumerable: !1,\n writable: !0,\n configurable: !0\n }\n }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t);\n}, Wu = function(e, t) {\n if (!e)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return t && (typeof t == "object" || typeof t == "function") ? t : e;\n}, pV = function(e) {\n cV(t, e);\n function t() {\n var r, n, o, i;\n sV(this, t);\n for (var a = arguments.length, s = Array(a), l = 0; l < a; l++)\n s[l] = arguments[l];\n return i = (n = (o = Wu(this, (r = t.__proto__ || Object.getPrototypeOf(t)).call.apply(r, [this].concat(s))), o), o._lastRenderedStartIndex = -1, o._lastRenderedStopIndex = -1, o._memoizedUnloadedRanges = [], o._onItemsRendered = function(c) {\n var p = c.visibleStartIndex, d = c.visibleStopIndex;\n false && (0), o._lastRenderedStartIndex = p, o._lastRenderedStopIndex = d, o._ensureRowsLoaded(p, d);\n }, o._setRef = function(c) {\n o._listRef = c;\n }, n), Wu(o, i);\n }\n return lV(t, [{\n key: "resetloadMoreItemsCache",\n value: function() {\n var n = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !1;\n this._memoizedUnloadedRanges = [], n && this._ensureRowsLoaded(this._lastRenderedStartIndex, this._lastRenderedStopIndex);\n }\n }, {\n key: "componentDidMount",\n value: function() {\n false && 0;\n }\n }, {\n key: "render",\n value: function() {\n var n = this.props.children;\n return n({\n onItemsRendered: this._onItemsRendered,\n ref: this._setRef\n });\n }\n }, {\n key: "_ensureRowsLoaded",\n value: function(n, o) {\n var i = this.props, a = i.isItemLoaded, s = i.itemCount, l = i.minimumBatchSize, c = l === void 0 ? 10 : l, p = i.threshold, d = p === void 0 ? 15 : p, u = aV({\n isItemLoaded: a,\n itemCount: s,\n minimumBatchSize: c,\n startIndex: Math.max(0, n - d),\n stopIndex: Math.min(s - 1, o + d)\n });\n (this._memoizedUnloadedRanges.length !== u.length || this._memoizedUnloadedRanges.some(function(h, b) {\n return u[b] !== h;\n })) && (this._memoizedUnloadedRanges = u, this._loadUnloadedRanges(u));\n }\n }, {\n key: "_loadUnloadedRanges",\n value: function(n) {\n for (var o = this, i = this.props.loadMoreItems || this.props.loadMoreRows, a = function(c) {\n var p = n[c], d = n[c + 1], u = i(p, d);\n u != null && u.then(function() {\n if (iV({\n lastRenderedStartIndex: o._lastRenderedStartIndex,\n lastRenderedStopIndex: o._lastRenderedStopIndex,\n startIndex: p,\n stopIndex: d\n })) {\n if (o._listRef == null)\n return;\n typeof o._listRef.resetAfterIndex == "function" ? o._listRef.resetAfterIndex(p, !0) : (typeof o._listRef._getItemStyleCache == "function" && o._listRef._getItemStyleCache(-1), o._listRef.forceUpdate());\n }\n });\n }, s = 0; s < n.length; s += 2)\n a(s);\n }\n }]), t;\n}(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent);\nconst iz = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { typography: e, lineHeight: t, colors: r, fontWeight: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n font-size: ${e.t10};\n line-height: ${t.lh20};\n color: ${r.textIcon.textHighemphasis};\n font-weight: ${n.light};\n\n & > div:first-child {\n margin-right: 8px;\n }\n `\n), dV = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n`, az = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { colors: e, typography: t, lineHeight: r, fontWeight: n } }) => {\n const o = t.t12;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin-left: 4px;\n font-size: ${o};\n font-weight: ${n.light};\n line-height: ${r.lh20};\n color:${e.textIcon.textPrimary};\n `;\n }\n), Eu = 4, n5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n input {\n cursor: pointer;\n }\n `\n), o5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .icon-system {\n color: ${e.textIcon.textPrimary};\n }\n `\n), i5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), Su = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, isContentLarge: t, contentHeight: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background: ${e.backgrounds.bgPrimary};\n ${t == "true" && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .List {\n height: fit-content !important;\n }\n .List .ListWrapDiv {\n height: ${r - 4}px !important;\n }\n `}\n `\n), ku = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, lineHeight: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n span {\n margin-left: ${e.sp8};\n }\n ${az} {\n line-height: ${t.lh16};\n }\n `\n), Nu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n () => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n /* padding-bottom: 3px; */\n position: relative;\n top: -3px;\n height: 16px;\n `\n), Iu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { lineHeight: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${iz} {\n line-height: ${e.lh16};\n }\n `\n), AV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n height: 24px;\n align-items: center;\n flex-shrink: 0;\n border-radius: 4px;\n padding: 0px ${e.sp8};\n width: auto;\n `\n), y8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, spacings: t }, $subLabel: r, $isSelected: n, $isScroll: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n height: auto;\n align-items: center;\n flex-shrink: 0;\n padding: 3.5px ${t.sp8};\n gap: ${t.sp8};\n width: auto;\n cursor: pointer;\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin-right: 8px;\n `}\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: 40px;\n `}\n\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background: ${e.backgrounds.bgSelected};\n `}\n :nth-child(0) {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n }\n\n &:hover {\n background: ${e.backgrounds.bgHoverPrimary};\n }\n &:focus-visible {\n border: 1px solid ${e.border.borderFocused};\n outline: none;\n }\n &:hover ${Il} {\n display: block;\n }\n `\n), uV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({ theme: { fontFamily: e, typography: t, fontWeight: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-direction: column;\n justify-content: center;\n color: #797980;\n font-family: ${e.base};\n font-size: ${t.t12};\n font-weight: ${r.medium};\n line-height: 16.8px;\n cursor: pointer;\n `\n), Nr = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({\n theme: { colors: e, fontFamily: t, typography: r, lineHeight: n, fontWeight: o }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-direction: column;\n justify-content: center;\n flex: 1 0 0;\n overflow: hidden;\n color: ${e.textIcon.textPrimary};\n word-break: break-all;\n font-family: ${t.base};\n font-size: ${r.t12};\n font-weight: ${o.light};\n line-height: ${n.lh17};\n max-height: 17px;\n cursor: pointer;\n label {\n cursor: pointer;\n }\n `\n), Tu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n cursor: pointer;\n label {\n cursor: pointer;\n }\n `\n), Du = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({\n theme: { colors: e, fontFamily: t, typography: r, lineHeight: n, fontWeight: o }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-direction: column;\n justify-content: center;\n flex: 1 0 0;\n overflow: hidden;\n color: ${e.list.listTextLowemphasis};\n word-break: break-all;\n font-family: ${t.base};\n font-size: ${r.t10};\n font-weight: ${o.light};\n line-height: 16.8px;\n cursor: pointer;\n label {\n cursor: pointer;\n }\n `\n), Hu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({\n theme: { colors: e, fontFamily: t, typography: r, lineHeight: n, fontWeight: o }\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n justify-content: center;\n overflow: hidden;\n color: ${e.textIcon.textPrimary};\n word-break: break-all;\n font-family: ${t.base};\n font-size: ${r.t12};\n font-weight: ${o.light};\n line-height: ${n.lh20};\n cursor: pointer;\n label {\n cursor: pointer;\n }\n `\n), bV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, borderRadius: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ::-webkit-scrollbar {\n height: ${Eu}px;\n width: ${Eu}px;\n }\n ::-webkit-scrollbar-track {\n background-color: ${e.scroll.scrollBgPrimary};\n border-radius: ${t.xl};\n }\n\n ::-webkit-scrollbar-thumb {\n background-color: ${e.scroll.scrollBgDefault};\n }\n /* Handle on hover */\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${e.scroll.scrollBgHover};\n }\n ::-webkit-scrollbar-thumb:active {\n background-color: ${e.scroll.scrollBgPressed};\n }\n `\n), X6 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), a5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ $width: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n width: ${e ? "40px" : "180px"};\n line-height: 17px;\n `\n), s5 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { colors: e }, isTimeZone: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-left: 16px;\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 17px;\n\n ${!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.textIcon.textLowemphasis};\n `}\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.textIcon.textMediumemphasis};\n `}\n `\n), Pu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .icon-flag {\n img {\n width: ${e.sp16};\n height: ${e.sp16};\n }\n }\n `\n), Il = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: none;\n width: 100%;\n position: absolute;\n left: 207px;\n z-index: 2;\n top: 0;\n `\n), hV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n div {\n overflow: visible !important;\n /* background: ${e.backgrounds.bgPrimary}; */\n }\n ${y8} {\n margin-right: 0;\n }\n `\n), Vu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { borderRadius: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .logo-svg {\n display: flex;\n padding: 2.667px;\n justify-content: center;\n align-items: center;\n background: ${t.white};\n border-radius: ${e.circle};\n border: 0.667px solid #f4f4f4;\n svg {\n border-radius: ${e.circle};\n }\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n button {\n width: 20px;\n height: 20px;\n padding: 5px;\n div {\n width: auto;\n }\n svg {\n width: 10px;\n height: 10px;\n }\n }\n `\n);\nconst MV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { colors: e, spacings: t, fontFamily: r, typography: n, fontWeight: o, lineHeight: i },\n $isSelected: a\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: 3.5px ${t.sp8};\n margin-bottom: 4px;\n label {\n color: ${e.textIcon.textPrimary};\n font-family: ${r.base};\n font-size: ${n.t12};\n font-weight: ${o.light};\n line-height: ${i.lh17};\n max-height: 17px;\n cursor: pointer;\n }\n ${a && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background: ${e.backgrounds.bgSelected};\n `}\n\n &:hover {\n background: ${e.backgrounds.bgHoverPrimary};\n }\n &:focus-visible {\n border: 1px solid ${e.border.borderFocused};\n outline: none;\n }\n &:hover ${Il} {\n display: block;\n }\n `\n), fV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-top: ${e.sp6};\n padding-bottom: ${e.sp8};\n `\n), Mr = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { itemSize: e, colors: t, borderRadius: r, transitions: n, spacings: o } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: start;\n width: ${e.xxs};\n height: ${e.xxs};\n border: 1px solid ${t.border.borderPrimary};\n border-radius: ${r.sm};\n transition: ${n.base};\n box-sizing: border-box;\n background-color: ${t.backgrounds.bgPrimary};\n padding: ${o.sp2};\n .icon-system {\n opacity: 0;\n color: ${t.textIcon.textTertiary};\n transition: ${n.base};\n\n > svg {\n width: 9px;\n }\n }\n `\n), gV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), zV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({ theme: { colors: e, spacings: t }, $isReadOnly: r, $isError: n, $isRtl: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n cursor: pointer;\n width: 100%;\n user-select: none;\n gap: ${t.sp8};\n &:hover {\n ${Mr} {\n border-color: ${e.border.borderSecondary};\n }\n }\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Tl}:checked + ${Mr} {\n background-color: ${e.backgrounds.bgReadOnly};\n border-color: ${e.backgrounds.bgReadOnly};\n .icon-system {\n color: ${e.textIcon.textTertiary};\n }\n }\n `}\n\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Mr} {\n background-color: ${e.backgrounds.bgPrimary};\n border-color: ${e.border.borderError};\n\n .icon-system {\n color: ${e.textIcon.textTertiary};\n }\n }\n `}\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-direction: row-reverse;\n `}\n `\n), Fu = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${e.typography.t14};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh22};\n color: ${e.colors.textIcon.textHighemphasis};\n padding-left: ${e.spacings.sp4};\n padding-right: ${e.spacings.sp4};\n `\n), CV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${e.typography.t10};\n font-weight: ${e.fontWeight.regular};\n line-height: ${e.lineHeight.lh14};\n color: ${e.colors.textIcon.textError};\n `\n), OV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({}) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: column;\n gap: 4px;\n `\n), Tl = styled_components__WEBPACK_IMPORTED_MODULE_1___default().input(\n ({ theme: { colors: e, transitions: t }, $isError: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n opacity: 0;\n display: none;\n\n &:checked + ${Mr} {\n background-color: ${e.backgrounds.bgTertiary};\n border-color: ${e.backgrounds.bgTertiary};\n transition: ${t.base};\n\n .icon-system {\n opacity: 1;\n transition: ${t.base};\n }\n }\n\n &:focus + ${Mr} {\n transition: ${t.base};\n }\n\n &:disabled {\n & ~ * {\n cursor: default;\n }\n\n & + ${Mr} {\n background-color: ${e.backgrounds.bgDisabledPrimary};\n border-color: ${e.border.borderDisabledOnbg}; // #D2D2D5;\n\n .icon-system,\n + ${Fu}, ~ ${Fu} ${c4} {\n color: ${e.textIcon.textDisabledOnbg};\n }\n }\n }\n\n ${r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgPrimary};\n border-color: ${e.border.borderError};\n\n &:checked + ${Mr} {\n background-color: ${e.backgrounds.bgPrimary};\n border-color: ${e.border.borderError};\n &::after {\n background-color: ${e.backgrounds.bgPrimary};\n border-color: ${e.border.borderError};\n }\n }\n `}\n `\n), mV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().label(\n ({ theme: { typography: e, fontWeight: t, lineHeight: r, colors: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${e.t10};\n font-weight: ${t.light};\n line-height: ${r.lh18};\n color: ${n.textIcon.textHighemphasis};\n `\n), sz = (e) => {\n const {\n label: t,\n customIcon: r,\n isReadOnly: n,\n isError: o,\n isDisabled: i,\n isRequired: a,\n isRtl: s,\n className: l,\n inputType: c = "checkbox",\n ...p\n } = e;\n return n && (p.disabled = !0), /* @__PURE__ */ c1(OV, { children: [\n /* @__PURE__ */ c1(\n zV,\n {\n $isRtl: s,\n $isReadOnly: n,\n $isError: o,\n className: l,\n role: "checkbox",\n "aria-checked": p.checked,\n "aria-label": t == null ? void 0 : t.toString(),\n "aria-labelledby": t == null ? void 0 : t.toString(),\n tabIndex: 0,\n children: [\n /* @__PURE__ */ c1(gV, { $isRtl: s, children: [\n /* @__PURE__ */ A(\n Tl,\n {\n disabled: i,\n $isError: o,\n name: t == null ? void 0 : t.toString(),\n type: c,\n id: t == null ? void 0 : t.toString(),\n ...p\n }\n ),\n /* @__PURE__ */ A(Mr, { children: r && /* @__PURE__ */ A(f0, { name: r, size: "xxxs" }) })\n ] }),\n t && /* @__PURE__ */ A(mV, { htmlFor: t == null ? void 0 : t.toString(), children: t }),\n !a && /* @__PURE__ */ A(\n l4,\n {\n color: "#767676",\n variant: "label-sm-regular",\n element: "label",\n children: "Optional"\n }\n )\n ]\n }\n ),\n (p == null ? void 0 : p.errorText) && /* @__PURE__ */ A(CV, { children: p == null ? void 0 : p.errorText })\n ] });\n}, vV = (e, t) => {\n const { isPartlyOnly: r, ...n } = e;\n return /* @__PURE__ */ A(\n sz,\n {\n ...n,\n customIcon: r ? "Minus" : "CheckMark",\n ref: t,\n inputType: "checkbox"\n }\n );\n}, vn = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(vV), yV = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(sz)(\n ({ theme: { colors: e, transitions: t, borderRadius: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Mr} {\n border-radius: ${r.circle};\n padding: 2px;\n\n &:after {\n content: \'\';\n display: block;\n width: 100%;\n height: 100%;\n opacity: 0;\n border-radius: ${r.circle};\n transition: ${t.base};\n background-color: ${e.backgrounds.bgTertiary};\n }\n }\n\n ${Tl}:checked + ${Mr} {\n background-color: ${e.backgrounds.bgPrimary};\n\n &:after {\n opacity: 1;\n transition: ${t.base};\n }\n }\n\n ${Tl}:disabled {\n &:checked + ${Mr} {\n &:after {\n background-color: ${e.backgrounds.bgTertiary};\n }\n }\n }\n `\n), LV = (e, t) => /* @__PURE__ */ A(yV, { ...e, inputType: "radio", ref: t }), l5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(LV), wV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "24",\n height: "24",\n viewBox: "0 0 24 24",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n xmlnsXlink: "http://www.w3.org/1999/xlink",\n children: [\n /* @__PURE__ */ A("rect", { width: "24", height: "24", fill: "url(#pattern0)" }),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ A(\n "pattern",\n {\n id: "pattern0",\n patternContentUnits: "objectBoundingBox",\n width: "1",\n height: "1",\n children: /* @__PURE__ */ A("use", { xlinkHref: "#image0", transform: "scale(0.004)" })\n }\n ),\n /* @__PURE__ */ A(\n "image",\n {\n id: "image0",\n width: "250",\n height: "250",\n xlinkHref: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAag0lEQVR4Ae1daZdVRZbdb8hMBlmFYIuKHwoF51IR6KpmSBRFUQQhwb/U/6H7S/+AAkywe3VLDmitBrRJluJqVKgqQLuEXuUAmk2+nN7LXieGTCjJzPfuFOfeu+9aKLx3I+LcfWK/iBsn4uxKawQz4EUEiEChEagW+un4cESACBgESHR2BCJQAgRI9BI4mY9IBEh09gEiUAIESPQSOJmPSARIdPYBIlACBEj0EjiZj0gESHT2ASJQAgRI9BI4mY9IBEh09gEiUAIESPQSOJmPSARIdPYBIlACBEj0EjiZj0gESHT2ASJQAgRI9BI4mY9IBEh09gEiUAIESPQSOJmPSARIdPYBIlACBEj0EjiZj0gESHT2ASJQAgRI9BI4mY9IBEh09gEiUAIESPQSOJmPSARIdPYBIlACBEj0EjiZj0gESHT2ASJQAgRI9BI4mY9IBEh09gEiUAIESPQSOJmPSARIdPYBIlACBEj0EjiZj0gESHT2ASJQAgRI9BI4mY9IBOqEYHEEZmaAVgvAzOL3ZnZHBajVMmuNDeUcARK9DQdWa0B1BYBKGzdndUsLaN3WZVJWj852OkeARF8AMxnJq3Xgh1vAv/27HdA1cL3ZAlYsA/buAJZWdU00FoCTXwVEgERvA/xmDfjHfwIufQNUq24a30a5NG6pVAD5AapVgeF/Bnq3As1RTuPTwLpIdXIxbgFvCqmmJoAHHwL6dtsb5b1YyB7qj9jU3QXIqP7ehwDowQU8yK88AuwmHol5/i+ExiRw8FU7ik5N2RFdFudC/ZmetsaeOAXc/CtQ77aj/DyPwI+JAMeDxfqAEH1mHNj8NNC7yd5tyL9YwRS/b80AMrJf+RYYOAtgadjXiRQflVUnhABH9DaAnG4ClWXAoV325qqCFTn/Y3N0EEAT0GBTG1DylkAIkOhtAG9INAHs6QUeWgUY4gcmu4nrAzj5MfCnq0C1B5CRnhcRuBcCJPq9UPmbz2T0nB4HHv81sHOL/dKPqH9za2b/9Cvvt0aB9/9gp+8zzcyaZ0M5Q4BEb9dhMlrW5lbfhWharv4BoPl/NuavaveeFoBoBxfj2u0DZgQfA177e+DxR+3iV+j3Yj9VH/kSOHcRqC4Fmop+gNrFlveljwBH9DYxllXu6Slg1RpgX68tpGH6Xq8BY+PA+6fsjIMjepsOLdltJHonDpcFuKadvvd06ViUk40zch0ZBMZ+BOpdjKl34tKy3Euid+DpWgVoNYB/+A2w8SlbUEb6kJesFYgNl78BPjjHmHpIX2hum0TvxDtC9GmgvgLoe80WDP2eLlbIvne5jp10R2kD//hYa/hfTQiQ6B16w4zgE8DeXuD+Fbqm78OfAFe/AeoSU3dT+g4fj7cXFAESvUPHygJccxx4ZgOw4yVbWMui3PXvgYH/BLCE7+kdurXwt5PoEVxsYuhdwMHXbWENo6eP65stsQ2gwuwzETxb3CIkegTf+pj6/q3AI39nR8/Qi3I+pn72c+Czy0BtCafvEVxb2CIkegTXCqmbElN/CDjoDrr4BbEI1SVSREZ0iamPjgH9ctClm3vfEwG2IJWQ6BEdaabKM8A7r9jsLhLPDr3Y7Uf1/g+B0R+BrjrTTEV0b+GKkegRXSrT95kGsHUj8OIGO30PvSgnawUS7rtwGTj7KYBlQIsHXSJ6uFjFSPSI/pTpu2yJXb4S2PdKxEpSKFZxHv29TN95EQGHAIkeoyuYEXwSOLALWNJj87iFnr7PuPj54Bng+nXG1GO4t1BFSfQY7pTRU9JM/eYJ4GVFaaYkgeW1G8DQabcllifaYni5GEVJ9Bh+lNF7Wt6Ll86lmYpRXXJFHbGPyYm2CaBOLyeHbU5rYheI6TgTVmsAb7k0U2b1PfD83W/g+eAMcOkKUOkB/JQ+5uOyeE4RINFjOs7E1CeAR9YCb+6wlYVefZcBXX6AGhPA0WG7JdYfZ435uCyeUwRI9AQcZ2LqVaDvVVuZ346aQNWxqzgxBNz+CahLTJ3v6rHxzGsFJHoCnjMjuMTUNwPPPubSTAVGVqbvMts4/xUw8rlNV+2n9Ak8MqvIGQKBu2PO0JrHXCGUKLisWm2Pr8pt8lnISwZv+QGS1NTHZVEusD0hsWDbVO5KrA+YBBRTwOHd9v24qWBHml+A6x8Gbn1H6abEnJ3DijiiJ+Q0GT29dNMORTF1+QG6eh04KdJNsiWWCSkS8ni+qiHRE/SXUXC5DzjktsRqSDPlt8Sac+rTlG5K0N25qopET9BdhtjjlG5KEFJWlRACJHpCQEo1ZvFrHFi/TrF0k6SZUrB+kCDsrKoNBEj0NkDq6BazW2UuS6ym2PXxQaB520o3abKrI3x5cyQESPRIsM1fyMTUx4BXfws8pk266Ys56SYuys3vwyJ+Q6In7FWJn8s59dVrgP3KpJtue+mmesIPzerUI0Cip+Ei2ZzSBA7uBtRJNw0BYz9QuikNt2uuk0RPwTtGumkM2CbSTU/aBoLvlJO1A5Fu+ho4KdJNjKmn4Hm9VZLoafjGSTfVRLppt21AQ0zdn0s/KtJN3DiThufV1kmip+Qas1FlAnhTqXTTNUo3peR5ndWS6Cn5RVbfmxPAc+uBXo3STS7NlN8PnxIMrFYJAiR6io4wJOoGDrjpu4aQlo+fe+mmKlfgU+wBeqom0VP0hYmpN4D92/RJN525YKWbqpRuSrEH6KmaRE/RF7LS3px00k3+oEtgxGVEp3RTik5XWnXgbqcUlQTN8lNlI91UtcdEQ+eAmJVu+ggYvUnppgTdrbYqEj1l18j0fUZi6puA59crk266BJyhdFPKPUBH9SR6yn7wW2KX/QrY75JHakjrNHtOfSBlAFi9CgRI9AzcYBblJq3EspFuaoZP4eZfKQZO3yHdxCyxGfSGME2Q6Bngbqbv48BzmqSbWlbu+dr/AsNnnHQTd8tl0BvCNEGiZ4S7SDfVlsxJN6kYPJ0RRuSB0k0Z9YQwzZDoGeFupJvGrXTTw6vd6nvg5Xe/gUekmy5TuimjnhCmGRI9I9xNTF2kmx4F9my3jYY+6CID+i+km1RMNTJySomaIdEzdLZZAKsom7675z8xDNz+2W6m8Qt1GULDplJGgERPGeA7q/dbYn+nULpp5Etg5AKlm+70V5H+TqJn6E2Zvot00+oH7Lu6NC2fhbxkpi4/QJRuCumF9Nsm0dPH+K4WzHv5FPCuQukm0WijdNNd7irMP0j0jF1ppu/jwOangR1KzqnL3neZWVz5FhgQ6aallG7KuFuk3hyJnjrEv2xgSnbGiXTTLvtd6NV3scL8AAE4MmgTW4Z+pfglavwkDgIkehz0IpY1xG7olW66chWo9QD+lFvEx2QxRQiQ6AGcYRa/Jqx0U+9ma4AfUQOYY5qUkFqtBtwaBY5/ZKfvlG4K5Y3k2yXRk8e0vRrNbpW5LLHQsFHF2XB8GJh20k0q7GoPUd61AAIk+gLgpPmVGcEbwGtOuqnZCi9p7KfqIxeB8/8NVJcCYhev/CNAogfyoSx2TU8Cqx8E9u2wRmiYvkuaKZFuklEdTBwZqHck3yyJnjym7dcom2VaQN/r+qSbjg0DDUo3te9L5XeS6AEdZKSbGla66YUnrCGhw1p+P/6lr4EPRijdFLB7JNo0iZ4onB1WJtJNU4BIN737ui2rIaY+K930AcDFuA59qvR2Ej2wY0zutklgzw5g5Qq75zz0qO7PqQ9/Anz9NVCXmDoX5QL3lHjNk+jx8ItdWhbgmg3guQ1A70ZbnUlSEbvm6BXI6rssyl3/HhhwaaYo3RQdTw0lSXQFXjDvxSLd5KbvGkZPY5NsiZUssQ2gWlMAFE2IjACJHhm65AqasNoYsH8r8MgDdutp8Om72zwj0k0XLtuYuoYfoORQL1dNJLoCfwupm3JO/WGbElpM0hJTHx0D+ocAdHPvu4KuEtkEEj0ydMkW9FNlkW4SksvoGTgnxeyhlv4PKd2UrLezr41Ezx7ze7Yo5Bbppq0vAS9usNJNXk3lngUy+ND82FSAzy4BZ0W6Sc6pNzNomE0kjgCJnjik0SqU6fv0FLB8JbDPKa+Gfk+XJ/GvEEdlUa7CsHo074YvRaKH98GsBYZUXrqpG2hqkG5y8fOTTrqpq8fONmaN5l9ygQCJrshNMlWfEemmJ4GdSs6pS0xdzqkb6SammVLUWzozhUTvDK9U75bFNyPdtHQuzVSqDbZbuQu1yUEXTFjRh3aL8j4dCJDoOvwwa4XZFdeYk26S8+Ch39V9/PyD0066aQnAnXKzLsvFX0h0ZW4yi3ITwNq1wBvbrHGhD7rIgC4/QGMTgBFk7GFCCmXdZlFzSPRFIQpwg2EW0PdqgLYXafLEKSfdVOei3CJQqfqaRFflDmuMWX2XmPoW4NnH7ejpw1yhzPUx9XMXKd0Uygdx2iXR46CXUlmZvhvpptXAWy7NVOj3dJlkyI+NrBnIqA72nJS8n061dFc6uMau1byXTwGHFUo3nfgQuPVXoN7N6XtsR2dUAYmeEdCdNiOjp8TUtzwNbHfn1INP351005/+Agx8TOmmTn0a8n4SPST6i7QtCqeV5cC7r9kbQ0/fxQqfFOOol25iD1rEizq+ppt0+OGeVpjp+wTw+g5gzSq3JTbwkTaf5/3kWeDqNaDG46v39J22D0l0bR65wx6Zqk+PAxvWATs32S9CT9/lOK2M6jdHgf4/AJDNMzzRdofXdP6VRNfplzmrXEz9kEsz5c+tz90Q7m/HB+ekmzTZFQ4RvS2T6Hp9YywzI3gDeFWkm9bahBShd8rdJd10kWmmlHch24/yYGSZbTRbYkW6aQ2wr9cioWH67qWbTEyd0k3quyhHdPUusgkf0LTKqz11Hbnf/aKc7H2ndJP+TkSi6/cRvHTT1ueBF5+yBocOtck7uQQALl0DTop0k6SZosiD2t5Eoqt1zR2GOemm+grg0G77eej3dLFCElLIdVSkm3ipRoBEV+2eOeNMosgJu/d95X06pu9+BB/6L+DaN066SaIEvNQhQKKrc8m9DZIFuOY48OwGYMdL9h6/S+3eJdL/1KeZuv4dMHjaTt8ZU08f9ygtkOhRUAtUxsSqu4GDLqbuF8QCmWObdSP4709a6aYKpZuCumO+xkn0+ZBR+LmPqXvpJrMgFnhLrI+pn/0cuPBHoMZFOYU9h6eKVTplPqNkpb0pMfWHgQO77F2hp+/yYyMxdSPdJAdduPd9PvcF/ZwjelD4O2/cTN8BvPOyPumm45Ru6tyhGZUg0TMCOqlmZPou0k3bNgEbn3DKq4G9KKvvEu77lNJNSbk58XoCd5HEn6fwFZotsU66ae/L9nFDb54RK7xOHKWbdHZBEl2nXxa0yizKTQJ9rwA9TrppwQIZfOnzvA+cBa7fACjdlAHoHTRBoncAlpZbzfRdpJueAl520k2hF+VMTL0KXL0OnDpjY+oqwn9anBbYDhI9sAOiNm+km5Yok25yD2NEHijdFNW1qZQj0VOBNf1KzQg+bqWbHpI0Uwqlm6qUbkq/I7TZAoneJlDabjOLck66ac92a515dw9oqEmG46WbJPc7pZsCeuPupkn0u/HI17+EWVXgoJduUnSg5MQwMPYzUKd0k4o+RaKrcEM0I8wI3gC2bQaefYzSTdFQLEcpEj3Hfpbpu5FuegDY69JMhY6pm0mGk26SnXImO0WOMS6K6SR6zj1pElBM24QUskDXVJB62cfUjXTT95Ru0tDFSHQNXohhg5++b9Eo3fQ/lG6K4dpEi5LoicIZprIpkW66DzjspJtUpJlyPctsiW3avfBh0GGrggCJXoB+YIg9Duxx0k1Gsy3wOXW/K+7kx8CfrwHVHnsApwBw5/IRSPRcuu1uo2X6LtJN69cBvS7NVPCYupdu+hl4X6SbllK66W6vZfsvEj1bvNNrzexWAQ69YZvw59bTa7D9mt8bAJq3gaoIPSiK9bf/BPm/k0TPvw/NE5gRfAx47Q7pptChNp9m6vwXwHkn3dQk0YP0OBI9COzJN2q2xE4Bqx8E3t5h6w99os2nmbo9DsxKN5HoyTu/jRpJ9DZAys0tsgDXAvpeB7q7dOR+94tyR4Yo3RSyH5HoIdFPuG2RbpppACLdtPFJW3no6btfK6B0U8LO7rA6Er1DwFTfLllip4CuFUCfopi6ZImV65jkfpcrcOjPWVGq/5HoBXO3yd02Cby9E9Ai3eSn70OfAFdFuokpoTPvdSR65pCn26Csvot00zPr56SbVMTUa8C33wFDlG5KtwPMUzuJPg8wef7YHCoR6SanvOrFEIM+k1ttPzIAYBygdFO23iDRs8U7k9bMCN4A9m8DHn4AkAWx0ItyPqZ+5gJw4TJQW0I99Uw6g2uERM8S7YzaElJ76aaDr9hGNUzf75Ju4t73jHqD83+mrbGxzBDwYa13dgGycUam76EXu/2ofvwjYPQm0CVppjJDpNwNcUQvqP9lBBfppq0vAS9scNP3wN6elW76Cvj4U3vQpaUgUUZBu8BdjxXY9XfZwn8kiIDfEnvfSuBtN30P/Z4uj+elm46I8mroKUaCeGuvikTX7qEY9pn3ci/d1KUrzdTgGeDGDaaZiuHejoqS6B3Bla+bZfScUSrddOW6i6kvs9lr84Vs/qwl0fPns7Ytlpmxl27q29V2scxuPCYiDxNAnb0wdcwJceoQh23ASzft3Qk8eL8y6aYzwB+vAJUeu1gYFqlit06iF9u/ZqPMtJNuesudUw+dPFJCavIDNDYOHJFRfYmO9YMidwUSvcje9c8mzLpDuklT7PrEEKWbvJvS/D+Jnia6Sur2W2JFuumZdXbzTOidcmYDTwUY+RI4/zlQWcotsWl2FxI9TXSV1C3xc63STZKaul+m7+7MuhLICmcGiV44l977gbx00+HdgGSi0STddPwU8NN3jKnf23PJfEqiJ4Oj+lr89H3LM8B2JbnfZe+7zDb+/BdAhB4k97uKI7Xqvdm5gSR655jltoSRbloOHHZ66qFX3wVIn6nWSzdp2KabWwcvYDiJvgA4RfvKEHsCeKMXWLNKV5ZYL91U4/HVVLodiZ4KrDorlem7SDdt+DXQu8naGHr1XY7Tyqh+00s3LaF0Uxq9h0RPA1XNdbYA1IE+l2bKn1vXYHL/INAac2mmNAX7NYAT0wYSPSaAeStelTDWGLD7d8Bja11CisDHRX1CipEvgHMXgZocdCHRE+1aJHqicOqvTBa7pqeVSjc1gH/1MXUSPdHORKInCmeOKhPppt1Ad13HopwPqxnpph+BehcPuiTZm0j0JNHMSV2yYabVALa9ALz4lDU6dFjLx9S/ugacHGFMPemuRKInjWge6hOiTwN1kW7SGFOndFPivYhETxzSfFRoRvBJQM6pa5NuGv4E+JrSTYl2JBI9UTjzU5nEz0W66bkNuqSbJPe7SDcNeOkmCQfyio0AiR4bwvxW4KWbDviYugJS+bj+UckSS+mmxDoXiZ4YlPmryOyKG5uTbvILYiGfxMfUT38GfC7STbIlVsEPUEhMkmibRE8CxZzWIe/poqf+wMPAQZc8UsWW2BowOgb0DwHg3vdEeheJngiM+a3ET5XfeUWPdJO3qf9DSjcl1bNI9KSQzGk9MoKLdNO2l4Dn11O6KaduXNRsEn1RiIp9g9kSOwUsXwnsc9P3wFvfDeCUbkq235HoyeKZy9rMe/kUcGAX0NOtQznFRARgw2xGuomLcrH6FokeC75iFDbSTQ3g+SeAne6cus/8EuoJZfW9VgOu3gCGz7gtsTzoEtkdJHpk6IpTcFa6aRlwyE3fVXDKGXFsGMAkpZvi9DgSPQ56BSprRvAG8JakmbpfyTl1Fz//D0o3xe5pJHpsCItRgYmpTwCPPgq8qVC66aiM6pRuitzZSPTI0BWvoIlfi3STQuXVE8PA2ChQr/OcepSeR6JHQa2gZczqu5xT32Klm5otIPROuVnppi+AkQtAZRm3xEbpfiR6FNQKWkam7166Sd7V5ZLPQl6yHic/NpKT/oSkmWKPjeQOwhYJtuIW8tJN74p0kxxlbYZ/Vh9Tf28YuEXppkgOIdEjwVbcQn76bqSbNtrnDD59d9JNV74FBindFKnzkeiRYCt2ISPddB/Q50+0BZ6+C9p+A8+RAQDN8K8UeesBJHrePJaBvWb6Pg68qVS66co1d05dxa6eDBySQBMkegIgFq0Kmaob6aZ1lG4qim9J9KJ4MunnkNFSsXRT8zZgVGc4qrfleRK9LZjKd5NZgBPppt8C65RJN52TmPoXQJXSTW13TBK9bajKdaM/p756DbDPbYn1C2KhkJCde5Il9nYDeF9i6nUAHNHbcgeJ3hZMJb1JVttbwEGF0k1Hh4DGD5RuardnkujtIlXC+7x003aRbnrSAtBVt+fE5ax4iD/ySiGjukg3DX4KYBngN9SU0EVtPzKJ3jZUJbxRpJumrHTTIZf7XXbKhfwz3Zybrf/LUQDTwIyCOL/23iFvObyIwLwImNxt4zYhxfmLwNR0+M0qsn4wKWmqfwXc/Am4fynQ4iaaeX0oX1RaI1zOWBAhfmmG0IoMCTVFYFSAGRnd5YdHkVlaTeGIrtUzmuxy6qsyTdZ0ychOkrfnERK9PZxKf1fo46qld0BMALgYFxNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiIkAiR4TQBYnAnlAgETPg5doIxGIiQCJHhNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiIkAiR4TQBYnAnlAgETPg5doIxGIiQCJHhNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiIkAiR4TQBYnAnlAgETPg5doIxGIiQCJHhNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiIkAiR4TQBYnAnlAgETPg5doIxGIiQCJHhNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiIkAiR4TQBYnAnlAgETPg5doIxGIiQCJHhNAFicCeUCARM+Dl2gjEYiJAIkeE0AWJwJ5QIBEz4OXaCMRiInA/wNesgjeBcB+xwAAAABJRU5ErkJggg=="\n }\n )\n ] })\n ]\n }\n), qV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M2.66606 100.557C3.07565 102.104 3.53002 103.631 4.02914 105.139C4.44368 106.394 4.88889 107.634 5.36477 108.862V108.871C5.83917 110.097 6.34275 111.309 6.87551 112.507V112.514C8.57465 116.33 10.5711 120.006 12.8465 123.509C18.0688 121.838 29.4432 117.515 48.0128 112.357C62.4821 108.338 94.834 100.323 124.467 93.9558C143.363 89.897 153.635 87.352 156.802 86.3192C157.549 86.075 158.855 85.5074 159.5 84.8945C159.734 84.6695 159.875 84.3656 159.898 84.042C159.964 82.7034 159.998 81.3567 159.999 80.0018C160.002 73.7381 159.272 67.4954 157.824 61.4015C143.939 65.5715 106.711 73.2868 75.4808 80.8084C42.2682 88.81 13.5522 97.5403 2.66606 100.557Z",\n fill: "url(#paint0_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M3.75756 55.7105L3.74569 55.7491L3.73456 55.7824C3.72195 55.8233 3.70933 55.8633 3.69598 55.9041C3.63216 56.1069 3.56909 56.3103 3.50676 56.5141C3.50305 56.5244 3.50008 56.5348 3.49712 56.5452C3.48079 56.5972 3.46521 56.6491 3.44963 56.701C3.34278 57.0522 3.2384 57.404 3.1365 57.7562L3.12685 57.7903C3.02346 58.1455 2.92304 58.5021 2.82559 58.8602C38.0713 50.3102 62.8754 43.3073 84.2714 36.6182C96.8115 32.6968 106.007 29.1352 112.211 25.9988C112.354 25.9261 112.497 25.8534 112.638 25.7806L112.764 25.7153C112.862 25.6649 112.96 25.6144 113.056 25.5669L113.212 25.4853L113.465 25.3518L113.628 25.2642L113.865 25.1373L114.028 25.0483L114.258 24.9222L114.415 24.8353L114.646 24.7062L114.794 24.6246L115.037 24.4859L115.161 24.4154L115.486 24.2262L115.517 24.2076L115.864 24.0021L115.97 23.9375C116.045 23.8908 116.125 23.844 116.201 23.7973L116.329 23.7186L116.53 23.5932L116.661 23.5109L116.851 23.3899C116.894 23.3625 116.937 23.335 116.979 23.3068C117.042 23.2675 117.103 23.2274 117.163 23.1874L117.287 23.1065L117.47 22.9841L117.584 22.9099C117.65 22.8653 117.715 22.8216 117.779 22.777L117.871 22.7132C117.965 22.6479 118.058 22.5829 118.149 22.5181C120.18 21.0593 123.17 18.4126 122.955 15.2718C122.955 15.2443 122.95 15.2169 122.948 15.1894C122.8 13.652 121.397 11.4594 117.161 9.13622L116.893 8.99673L116.577 8.832L116.153 8.61534L116.004 8.54114C115.699 8.38681 115.392 8.23445 115.084 8.08407L114.888 7.98761L114.414 7.75982L114.169 7.64407L113.803 7.47118L113.534 7.34727L113.255 7.21817L112.958 7.08461L112.705 6.97108L112.394 6.83159L112.165 6.73067L111.831 6.58228L111.654 6.50808C111.221 6.32109 110.785 6.13782 110.348 5.95826L110.232 5.91003L109.825 5.74531L109.681 5.68743L109.272 5.52567L109.14 5.47374L108.71 5.30679L108.635 5.27859C107.96 5.01939 107.281 4.76958 106.598 4.52918L106.573 4.52027C106.409 4.4624 106.245 4.40526 106.081 4.34887L106.02 4.3281L105.526 4.15966L105.495 4.14928C104.615 3.85248 103.729 3.572 102.837 3.30785L102.814 3.30118L102.295 3.14907L102.256 3.13794C101.504 2.92029 100.748 2.71376 99.9858 2.51837C100.036 3.13052 100.05 3.67885 100.004 4.07656C99.7855 5.92709 98.8439 7.48973 97.3903 8.86688C94.3806 11.7176 88.4045 14.6819 80.9784 17.2952C73.0499 20.0947 56.575 25.5217 41.9714 29.1812C32.1768 31.6365 19.2657 34.8307 13.0587 36.1812C12.8183 36.5477 12.5814 36.9162 12.3479 37.2868C12.3382 37.3016 12.3286 37.3164 12.3197 37.3313L12.3093 37.3469C12.27 37.4092 12.2306 37.4708 12.1921 37.5331C12.0971 37.6845 12.0026 37.8363 11.9086 37.9887C11.893 38.0132 11.8782 38.0376 11.8633 38.0629C11.8485 38.0881 11.8277 38.12 11.8107 38.1489C11.7936 38.1779 11.7624 38.2231 11.7365 38.2647C11.6437 38.4131 11.551 38.5682 11.4589 38.7203C11.4352 38.7604 11.4115 38.8004 11.3847 38.8405L11.2979 38.9889C11.202 39.1477 11.1072 39.3065 11.0137 39.4652C11.0063 39.4771 10.9996 39.489 10.993 39.5009L10.9885 39.509C10.7713 39.878 10.5571 40.249 10.3459 40.622L10.2138 40.855C10.1243 41.0153 10.035 41.1758 9.94597 41.3366L9.93855 41.3492L9.91555 41.3915L9.79683 41.6059L9.53415 42.0889C9.50002 42.1528 9.46663 42.2166 9.4325 42.2796L9.39762 42.3442C9.3071 42.5134 9.21657 42.6825 9.12753 42.8525L9.12085 42.8658L9.11566 42.8755C8.9069 43.2712 8.70136 43.6714 8.49904 44.076L8.39961 44.2726C8.31354 44.4448 8.22895 44.6169 8.14436 44.792V44.798C8.12136 44.844 8.0991 44.89 8.07684 44.936L8.06793 44.9538L8.02341 45.045C7.93981 45.2162 7.8567 45.3881 7.77409 45.5607L7.66279 45.7967C7.51785 46.1009 7.37538 46.4064 7.23539 46.7131V46.7168C7.09441 47.023 6.9559 47.3304 6.81986 47.6391C6.80428 47.6739 6.7887 47.7081 6.77386 47.7422L6.75382 47.7875C6.67319 47.9725 6.59256 48.1577 6.51192 48.3432L6.48521 48.4055C6.46147 48.4619 6.43698 48.5176 6.41101 48.574C6.33236 48.7575 6.25445 48.9415 6.17728 49.126C6.14759 49.1965 6.11791 49.267 6.08898 49.3382C5.95442 49.6607 5.8221 49.9847 5.692 50.3102V50.3184V50.3236C5.56239 50.6491 5.43427 50.9761 5.30763 51.3045L5.27424 51.3906C5.20004 51.5887 5.12584 51.7883 5.05164 51.9842L4.97744 52.1912C4.90324 52.3856 4.83349 52.5807 4.76299 52.7766L4.73406 52.8582C4.71996 52.8953 4.7066 52.9324 4.69324 52.9703C4.57155 53.3096 4.45209 53.6497 4.33485 53.9905C4.33328 53.9944 4.33204 53.9983 4.33114 54.0024L4.32669 54.015C4.20846 54.3588 4.09295 54.7031 3.98017 55.0479L3.97572 55.0612V55.0679C3.97415 55.0715 3.97291 55.0752 3.97201 55.079C3.89533 55.2883 3.82385 55.4988 3.75756 55.7105Z",\n fill: "url(#paint1_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M3.07564 81.166C5.24975 81.1779 10.8616 80.8907 17.0908 80.2949C27.9406 79.2561 49.6282 76.4366 74.3744 73.2363C93.6386 70.7455 135.79 64.6292 157.832 61.403C157.796 61.2492 157.76 61.0975 157.723 60.9482C157.655 60.6692 157.585 60.3912 157.514 60.1142C157.489 60.0155 157.464 59.9175 157.44 59.8174L157.436 59.801C157.386 59.6121 157.337 59.4229 157.287 59.2334C157.26 59.1332 157.233 59.0331 157.206 58.9366C157.14 58.6932 157.073 58.4506 157.004 58.2087L156.956 58.0358C156.9 57.8392 156.842 57.6441 156.785 57.4489L156.731 57.2656C156.702 57.1662 156.672 57.0675 156.642 56.9688C156.585 56.7789 156.528 56.5889 156.469 56.3997C156.438 56.3003 156.408 56.2009 156.377 56.1029C156.312 55.8944 156.245 55.6867 156.179 55.4789L156.147 55.3802C156.124 55.306 156.101 55.237 156.078 55.1651C156.033 55.027 155.987 54.889 155.94 54.751C155.909 54.6553 155.877 54.5596 155.845 54.4639L155.741 54.1574C155.741 54.15 155.736 54.1426 155.733 54.1352L155.553 53.6158C155.517 53.5141 155.479 53.4117 155.446 53.3101C155.361 53.0731 155.277 52.8372 155.192 52.6022C155.161 52.5169 155.129 52.4315 155.097 52.3455C155.073 52.2794 155.048 52.2141 155.023 52.1481C154.968 51.9997 154.914 51.8565 154.859 51.7111C154.819 51.6035 154.778 51.4966 154.737 51.3898C154.709 51.3156 154.681 51.2414 154.653 51.1731L154.54 50.88C154.498 50.7739 154.456 50.6671 154.414 50.561C154.372 50.4549 154.334 50.3606 154.294 50.2642C154.244 50.1366 154.193 50.0084 154.14 49.8798C154.099 49.7797 154.057 49.6795 154.016 49.583L153.936 49.3909C153.884 49.264 153.832 49.1371 153.778 49.0102C153.731 48.8989 153.684 48.7876 153.636 48.6763C153.568 48.516 153.499 48.3563 153.43 48.197C153.381 48.0872 153.333 47.9776 153.287 47.8683C153.245 47.7726 153.202 47.6768 153.159 47.5811C153.104 47.4565 153.049 47.3311 152.993 47.2101C152.943 47.0981 152.891 46.9875 152.84 46.8747C152.789 46.762 152.743 46.6618 152.692 46.5557C152.661 46.4889 152.63 46.4221 152.6 46.3561C152.546 46.2411 152.492 46.1268 152.439 46.0118C152.375 45.8748 152.31 45.7375 152.244 45.6L152.237 45.5866L152.224 45.5592C152.17 45.4472 152.118 45.3366 152.063 45.2246C151.96 45.0099 151.855 44.7962 151.75 44.5835C151.69 44.4633 151.63 44.3438 151.57 44.2236L151.407 43.9008L151.358 43.8044C151.35 43.7858 151.34 43.7673 151.331 43.7495L151.151 43.3985L151.087 43.2753C151.034 43.1734 150.981 43.0718 150.928 42.9704L150.75 42.6313C150.638 42.4191 150.525 42.2074 150.41 41.9961L150.212 41.6333C150.138 41.5042 150.07 41.3743 149.998 41.2452L149.971 41.1955L149.773 40.8431C149.751 40.8023 149.728 40.7622 149.705 40.7214L149.542 40.4357C149.477 40.3215 149.413 40.2079 149.347 40.0944C149.281 39.9809 149.227 39.8881 149.167 39.785C149.098 39.6663 149.029 39.5468 148.959 39.4288L148.736 39.0504C143.097 39.8666 136.245 40.8312 127.825 41.9969C109.338 44.5523 88.5721 47.9462 67.3268 50.6938C34.6855 54.8942 13.3184 58.0217 2.82262 58.8646C2.77711 59.0318 2.73234 59.1985 2.68831 59.3647C2.67941 59.3981 2.6705 59.4308 2.66234 59.4634L2.60892 59.6645C2.60725 59.6698 2.60601 59.6753 2.60521 59.6808C2.56613 59.8292 2.52705 59.9776 2.48797 60.126C2.4568 60.2477 2.42712 60.3694 2.39596 60.4911C2.38186 60.549 2.36776 60.6061 2.35292 60.6632C2.34402 60.6996 2.33511 60.7374 2.32547 60.7723C2.31582 60.8072 2.31137 60.8294 2.30469 60.8576C2.28391 60.9407 2.26388 61.0246 2.24384 61.1077C0.759524 67.2487 0.00659236 73.5437 0.000732422 79.8616C0.0222509 80.6889 1.21319 81.1556 3.07564 81.166Z",\n fill: "url(#paint2_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M140.319 132.559C134.976 137.535 115.809 146.553 96.8189 150.304C78.8696 153.85 62.7144 154.641 51.9923 154.654C52.177 154.919 52.5859 155.167 53.23 155.411C54.5196 155.869 55.824 156.295 57.1433 156.688L57.1775 156.699C57.7424 156.867 58.3093 157.028 58.8782 157.183L58.9524 157.204C59.2037 157.272 59.4555 157.34 59.7078 157.406L59.822 157.436C60.0936 157.506 60.3657 157.575 60.6382 157.643L60.7488 157.67C60.9754 157.726 61.2022 157.781 61.4292 157.835L61.6518 157.888C61.8893 157.944 62.1272 157.999 62.3657 158.052L62.5534 158.094C62.7656 158.141 62.9778 158.187 63.1908 158.233L63.5098 158.301L63.9914 158.4L64.3275 158.468C64.5501 158.512 64.7676 158.554 64.9879 158.596L65.4005 158.67L65.7463 158.733L66.1915 158.813L66.3814 158.845C66.698 158.9 67.0156 158.952 67.3342 159.003L67.5568 159.038L68.094 159.12L68.1912 159.135C68.5795 159.192 68.9686 159.247 69.3584 159.298L69.4059 159.305C69.6107 159.332 69.8155 159.358 70.0203 159.383L70.0744 159.39C70.7052 159.468 71.3381 159.538 71.9733 159.602H71.9829C72.4133 159.645 72.8451 159.685 73.2785 159.721C75.4941 159.905 77.7345 159.998 79.9996 160C104.066 160 125.65 149.372 140.317 132.556L140.319 132.559Z",\n fill: "url(#paint3_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M145.77 107.163C143.706 107.163 131.821 107.442 112.646 109.28C87.5274 111.689 50.9394 116.965 36.1443 119.488C26.9552 121.055 18.3849 122.888 13.2101 124.051C13.4421 124.403 13.6771 124.752 13.915 125.099L14.0753 125.334C14.1742 125.482 14.2759 125.628 14.3803 125.772C14.4367 125.853 14.4938 125.934 14.5502 126.014C14.6548 126.163 14.7587 126.311 14.8641 126.46L14.9739 126.608C15.191 126.911 15.4107 127.213 15.6328 127.513C15.6788 127.575 15.7233 127.636 15.7693 127.697C15.8791 127.846 15.9919 127.994 16.1017 128.142L16.2665 128.36C16.3793 128.508 16.4928 128.657 16.6071 128.805L16.728 128.961C16.9842 129.291 17.2425 129.619 17.5027 129.945L17.5427 129.996C17.6667 130.151 17.7921 130.305 17.9137 130.458L18.0584 130.636C18.1831 130.784 18.3078 130.94 18.4332 131.09L18.5467 131.227C18.9667 131.73 19.3926 132.228 19.8244 132.72L19.9328 132.843C20.0708 133 20.2095 133.156 20.349 133.312C20.3809 133.348 20.4129 133.386 20.4455 133.419C20.9036 133.93 21.3678 134.434 21.8383 134.932L21.885 134.982C22.0384 135.144 22.1925 135.305 22.3473 135.466L22.4215 135.545C23.0774 136.224 23.7452 136.892 24.4249 137.548L24.4761 137.597C25.1687 138.263 25.8714 138.917 26.5842 139.558L26.6087 139.58C27.3339 140.23 28.0705 140.867 28.8184 141.49C29.2183 141.826 30.091 141.886 32.8297 141.368C38.5766 140.281 60.1003 136.545 83.965 133.274C106.418 130.197 130.529 129.545 133.743 129.577C137.941 129.62 141.915 130.555 140.314 132.555C140.494 132.35 140.672 132.143 140.849 131.935L140.889 131.889C140.892 131.885 140.895 131.881 140.898 131.877C141.068 131.679 141.237 131.479 141.405 131.277L141.441 131.235C141.45 131.222 141.461 131.211 141.471 131.198C141.637 131 141.803 130.8 141.968 130.596L142.028 130.522C142.195 130.316 142.362 130.109 142.529 129.901L142.56 129.862C143.181 129.083 143.787 128.293 144.38 127.492L144.408 127.455C145.002 126.653 145.578 125.841 146.138 125.016L146.143 125.01L146.158 124.987C146.311 124.762 146.463 124.537 146.614 124.311C146.628 124.289 146.642 124.268 146.657 124.246C146.806 124.025 146.952 123.802 147.096 123.578L147.104 123.567C147.116 123.548 147.128 123.529 147.14 123.511C147.289 123.284 147.435 123.056 147.579 122.828C147.588 122.815 147.596 122.802 147.604 122.789C148.841 120.841 149.992 118.838 151.059 116.779L151.074 116.753C151.201 116.505 151.328 116.258 151.454 116.011L151.467 115.986L151.477 115.966C151.603 115.716 151.727 115.465 151.848 115.214L151.853 115.204L151.862 115.185C152.888 113.092 153.824 110.949 154.671 108.756C154.98 107.859 154.016 107.163 145.77 107.163Z",\n fill: "url(#paint4_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M66.7339 9.22594C67.392 4.45714 54.7518 5.24514 54.1938 4.25458C47.6411 6.48826 41.4074 9.56624 35.6501 13.4108C35.4015 13.5748 35.3014 13.9346 36.4507 14.1691C38.9536 14.6811 44.2486 15.2331 48.0062 15.2643C56.011 15.3333 66.1336 13.5792 66.7339 9.22594Z",\n fill: "url(#paint5_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M150.3 111.678C148.301 112.48 137.463 115.772 125.621 120.396C113.274 125.219 104.579 131.07 104.468 137.469C104.38 142.545 114.119 146.15 116.341 147.184C118.562 148.217 119.519 148.917 119.771 149.437C135.586 140.36 148.005 126.035 154.653 108.838C154.09 110.131 152.684 110.72 150.3 111.678Z",\n fill: "url(#paint6_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M17.6147 70.1957C31.6699 64.0757 46.4049 57.2331 56.0422 52.6928C71.1192 45.5897 84.284 36.9336 81.4191 28.1165C78.8718 20.2639 68.393 21.2078 47.4823 24.9496C34.0318 27.3567 16.2472 31.7879 13.849 34.9962L13.7555 35.1335C13.6568 35.2819 13.5574 35.4303 13.4587 35.5787C5.16293 47.9782 0.240403 62.8336 0.00889464 78.8192C0.00444254 79.1657 0.000732422 79.5122 0.000732422 79.858C0.031155 78.4356 5.13325 75.6308 17.6147 70.1957Z",\n fill: "url(#paint7_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M133.38 37.9605C116.982 40.3712 90.9592 45.189 93.4991 60.5675C95.4543 72.4076 119.11 75.8608 128.996 77.767C136.844 79.2814 152.202 81.3738 158.773 83.0158C159.651 83.2384 159.926 83.6569 159.902 84.1288C159.902 84.1236 159.902 84.1192 159.902 84.114C159.936 83.4329 159.961 82.7495 159.976 82.0639V81.9414C159.992 81.2959 160 80.6491 160 80.0011C160 65.202 155.981 51.3431 148.977 39.4526L148.7 39.0074C147.857 37.6444 142.19 36.6649 133.38 37.9605Z",\n fill: "url(#paint8_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M92.441 95.2543C90.8791 89.4667 82.4053 85.2812 70.3112 85.5772C57.5485 85.8903 44.2931 87.0938 28.3176 90.6858C14.0419 93.8957 5.38928 97.5953 4.05366 98.1466C2.80188 98.666 2.37744 99.3427 2.60673 100.325V100.332C2.66262 100.543 2.71852 100.754 2.77442 100.964C2.84862 101.24 2.92282 101.516 3.0037 101.791C3.02745 101.876 3.05193 101.96 3.0779 102.045C3.14172 102.268 3.20553 102.49 3.27083 102.708C3.28938 102.771 3.30793 102.835 3.32722 102.899C3.40835 103.17 3.49047 103.44 3.57357 103.709C3.59806 103.789 3.62329 103.867 3.64777 103.947C3.71307 104.155 3.77985 104.364 3.84663 104.572L3.92454 104.814C4.01111 105.08 4.09917 105.345 4.1887 105.61L4.25771 105.812C4.33191 106.021 4.40092 106.23 4.47364 106.438L4.56861 106.708C4.6537 106.949 4.74002 107.189 4.82758 107.427L4.89436 107.61C4.97796 107.839 5.06304 108.067 5.14961 108.295L5.25869 108.58C5.33239 108.774 5.4066 108.967 5.48129 109.159C5.51172 109.236 5.5414 109.314 5.57256 109.392C5.6715 109.64 5.77043 109.887 5.86937 110.134C5.90869 110.233 5.9495 110.33 5.98957 110.431C6.06081 110.603 6.13229 110.776 6.20402 110.95L6.32867 111.247C6.43058 111.487 6.53322 111.726 6.63661 111.964C6.67965 112.063 6.72343 112.161 6.76646 112.261C6.8377 112.423 6.90942 112.584 6.98165 112.745L7.13005 113.078C7.21217 113.259 7.29527 113.44 7.37937 113.621C7.44615 113.769 7.51441 113.91 7.58194 114.053C7.65614 114.211 7.73034 114.367 7.80454 114.523L7.97817 114.884C8.0457 115.023 8.11396 115.162 8.18223 115.301C8.26311 115.465 8.34399 115.628 8.42635 115.791C8.50872 115.954 8.59108 116.121 8.67493 116.285C8.74072 116.414 8.80701 116.542 8.87379 116.67C8.93414 116.788 8.99498 116.905 9.05632 117.021C9.12459 117.154 9.1936 117.285 9.26334 117.416C9.36624 117.611 9.47012 117.805 9.57499 117.999C9.65513 118.147 9.73576 118.295 9.81689 118.444C9.8713 118.543 9.92596 118.642 9.98087 118.741C10.06 118.884 10.1397 119.027 10.2198 119.169L10.3623 119.421C10.5107 119.685 10.662 119.949 10.8164 120.211C10.8616 120.285 10.9062 120.365 10.9514 120.442C11.041 120.595 11.131 120.747 11.2215 120.899L11.3432 121.102C11.5317 121.417 11.7219 121.729 11.9138 122.04L11.965 122.122C12.0669 122.286 12.1691 122.449 12.2715 122.612L12.3731 122.773C12.7011 123.29 13.0348 123.804 13.3741 124.313L13.4483 124.421C13.8079 124.959 14.1747 125.494 14.5487 126.023C14.5524 126.03 14.5569 126.036 14.5613 126.043C17.5245 130.246 20.8839 134.155 24.5934 137.717C24.7245 137.844 24.8566 137.971 24.9896 138.096L25.0816 138.183C25.5763 138.652 26.0784 139.114 26.5879 139.57L26.6109 139.59C27.1199 140.047 27.6352 140.497 28.1565 140.94L28.2708 141.038L28.2775 141.045C28.4605 141.2 28.6445 141.354 28.8295 141.507C28.9107 141.572 29.0023 141.622 29.1004 141.656C28.8874 141.573 29.2377 141.21 30.3165 140.803C35.0654 139.022 41.0483 136.655 51.5998 131.43C62.1846 126.188 66.2746 123.992 77.6304 115.707C88.3941 107.852 94.5261 102.971 92.441 95.2543Z",\n fill: "url(#paint9_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M86.1457 150.933C85.0528 147.626 76.4714 146.419 66.0683 148.512C60.1025 149.712 55.8552 151.529 53.9735 152.518C51.4691 153.833 51.1723 154.647 53.2945 155.435H53.299C53.4333 155.482 53.5691 155.529 53.7041 155.575L54.0469 155.694C54.5911 155.88 55.1431 156.063 55.7031 156.241L55.7432 156.254C56.2992 156.43 56.8609 156.602 57.4283 156.769C57.6217 156.826 57.8154 156.883 58.0093 156.939L58.1213 156.97C63.3179 158.443 68.6507 159.385 74.0375 159.78C75.5579 158.161 87.8635 156.134 86.1457 150.933Z",\n fill: "url(#paint10_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M82.4446 8.55297C105.322 8.23985 114.972 10.6869 119.363 12.2333C121.973 13.1533 122.648 14.0296 122.839 14.6121C122.424 13.1237 120.885 11.173 117.134 9.12134L117.12 9.11392C106.027 3.29371 93.3997 0 80.0034 0C63.5967 0 48.3445 4.93946 35.6501 13.4108C43.7663 11.7465 62.5534 8.82454 82.4446 8.55297Z",\n fill: "url(#paint11_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M86.1457 150.933C85.0528 147.626 76.4714 146.419 66.0683 148.512C60.1025 149.712 55.8552 151.529 53.9735 152.518C51.4691 153.833 51.1723 154.647 53.2945 155.435H53.299C53.4333 155.482 53.5691 155.529 53.7041 155.575L54.0469 155.694C54.5911 155.88 55.1431 156.063 55.7031 156.241L55.7432 156.254C56.2992 156.43 56.8609 156.602 57.4283 156.769C57.6217 156.826 57.8154 156.883 58.0093 156.939L58.1213 156.97C63.3179 158.443 68.6507 159.385 74.0375 159.78C75.5579 158.161 87.8635 156.134 86.1457 150.933Z",\n fill: "url(#paint12_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M82.4446 8.55297C105.322 8.23985 114.972 10.6869 119.363 12.2333C121.973 13.1533 122.648 14.0296 122.839 14.6121C122.424 13.1237 120.885 11.173 117.134 9.12134L117.12 9.11392C106.027 3.29371 93.3997 0 80.0034 0C63.5967 0 48.3445 4.93946 35.6501 13.4108C43.7663 11.7465 62.5534 8.82454 82.4446 8.55297Z",\n fill: "url(#paint13_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M17.6147 70.1956C31.67 64.0756 46.4049 57.2329 56.0422 52.6927C56.57 52.4453 57.0951 52.1948 57.6175 51.941C30.41 55.5145 12.2403 58.1085 2.82337 58.8646C2.80037 58.9507 2.77662 59.0367 2.75288 59.1228L2.68832 59.3647C2.68832 59.3751 2.68313 59.3847 2.68016 59.3944C2.63786 59.5554 2.59557 59.7157 2.55402 59.8767C2.5414 59.9227 2.52953 59.9687 2.51766 60.0139C2.47363 60.1851 2.43035 60.3565 2.3878 60.5281C2.37667 60.5749 2.3648 60.6209 2.35293 60.6669C2.34848 60.6869 2.34328 60.7062 2.33883 60.7255C2.2906 60.9199 2.24311 61.1151 2.19637 61.3095C2.18449 61.3592 2.17262 61.4089 2.16149 61.4579C2.11845 61.6379 2.07616 61.8182 2.03461 61.9988C2.02496 62.0403 2.01531 62.0819 2.00641 62.1234C1.90401 62.5686 1.80508 63.0165 1.7096 63.4672C1.70292 63.5021 1.6955 63.5369 1.68808 63.5711C1.6495 63.7566 1.61141 63.9423 1.57381 64.1283C1.56343 64.1832 1.5523 64.2381 1.54117 64.2938C1.50604 64.4674 1.47191 64.6405 1.43877 64.8132L1.40983 64.9616C1.36828 65.1775 1.32821 65.3949 1.28888 65.6123V65.6227C1.24733 65.8522 1.20676 66.082 1.16719 66.312C1.16051 66.3476 1.15458 66.3862 1.14864 66.4196C1.11698 66.6056 1.08582 66.7921 1.05515 66.979L1.02621 67.1579C0.998505 67.327 0.971793 67.4965 0.946069 67.6661C0.937165 67.7247 0.927519 67.7834 0.918615 67.8412C0.888934 68.0386 0.859253 68.236 0.831057 68.4348C0.826605 68.4608 0.822895 68.486 0.819185 68.509C0.786536 68.7386 0.754629 68.9683 0.723465 69.1984L0.710109 69.3015C0.683891 69.4909 0.659157 69.6804 0.635907 69.8699C0.627745 69.9329 0.620325 69.9967 0.612163 70.0598C0.591386 70.226 0.571352 70.3925 0.55206 70.5592C0.544639 70.6237 0.536477 70.6883 0.529057 70.7528C0.50828 70.9378 0.487752 71.1231 0.46747 71.3086L0.454114 71.4303C0.42938 71.6603 0.404646 71.8906 0.379912 72.1211C0.379912 72.15 0.374718 72.1797 0.37175 72.2086C0.352457 72.4045 0.334649 72.6011 0.31684 72.7978C0.310904 72.8631 0.30571 72.9291 0.299774 72.9944C0.285923 73.1591 0.272072 73.3241 0.258221 73.4893C0.253027 73.5583 0.247091 73.6281 0.241897 73.6978C0.227799 73.8737 0.215184 74.0495 0.20257 74.2261L0.19144 74.3819C0.175116 74.6134 0.160275 74.8442 0.146177 75.0757C0.146177 75.0957 0.146177 75.1158 0.142467 75.135C0.130595 75.3428 0.11897 75.5506 0.107592 75.7583C0.107592 75.8244 0.100914 75.8911 0.097946 75.9572C0.0897838 76.1226 0.0816218 76.2874 0.0749437 76.4528C0.0749437 76.527 0.0682652 76.5975 0.0652971 76.6695C0.0583717 76.8416 0.0519413 77.0148 0.0460051 77.1889C0.0460051 77.2475 0.0415529 77.3061 0.0400689 77.3647C0.0326487 77.5977 0.0259703 77.8307 0.0200342 78.0637V78.0726C0.0148401 78.2952 0.0103881 78.5245 0.00742004 78.7508V78.8992C0.00742004 79.2175 0 79.5366 0 79.8556C0.0311646 78.4354 5.13326 75.6307 17.6147 70.1956Z",\n fill: "url(#paint14_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M145.77 107.163C143.706 107.163 131.821 107.442 112.646 109.28C87.5274 111.689 50.9394 116.965 36.1443 119.488C26.9552 121.055 18.3849 122.888 13.2101 124.051C13.4421 124.403 13.6771 124.752 13.915 125.099L14.0753 125.334C14.1742 125.482 14.2759 125.628 14.3803 125.772C14.4367 125.853 14.4938 125.934 14.5502 126.014C14.6548 126.163 14.7587 126.311 14.8641 126.46L14.9739 126.608C15.191 126.911 15.4107 127.213 15.6328 127.513C15.6788 127.575 15.7233 127.636 15.7693 127.697C15.8791 127.846 15.9919 127.994 16.1017 128.142L16.2665 128.36C16.3793 128.508 16.4928 128.657 16.6071 128.805L16.728 128.961C16.9842 129.291 17.2425 129.619 17.5027 129.945L17.5427 129.996C17.6667 130.151 17.7921 130.305 17.9137 130.458L18.0584 130.636C18.1831 130.784 18.3078 130.94 18.4332 131.09L18.5467 131.227C18.9667 131.73 19.3926 132.228 19.8244 132.72L19.9328 132.843C20.0708 133 20.2095 133.156 20.349 133.312C20.3809 133.348 20.4129 133.386 20.4455 133.419C20.9036 133.93 21.3678 134.434 21.8383 134.932L21.885 134.982C22.0384 135.144 22.1925 135.305 22.3473 135.466L22.4215 135.545C23.0774 136.224 23.7452 136.892 24.4249 137.548L24.4761 137.597C25.1687 138.263 25.8714 138.917 26.5842 139.558L26.6087 139.58C27.3339 140.23 28.0705 140.867 28.8184 141.49C29.2183 141.826 30.091 141.886 32.8297 141.368C38.5766 140.281 60.1003 136.545 83.965 133.274C106.418 130.197 130.529 129.545 133.743 129.577C137.941 129.62 141.915 130.555 140.314 132.555C140.494 132.35 140.672 132.143 140.849 131.935L140.889 131.889C140.892 131.885 140.895 131.881 140.898 131.877C141.068 131.679 141.237 131.479 141.405 131.277L141.441 131.235C141.45 131.222 141.461 131.211 141.471 131.198C141.637 131 141.803 130.8 141.968 130.596L142.028 130.522C142.195 130.316 142.362 130.109 142.529 129.901L142.56 129.862C143.181 129.083 143.787 128.293 144.38 127.492L144.408 127.455C145.002 126.653 145.578 125.841 146.138 125.016L146.143 125.01L146.158 124.987C146.311 124.762 146.463 124.537 146.614 124.311C146.628 124.289 146.642 124.268 146.657 124.246C146.806 124.025 146.952 123.802 147.096 123.578L147.104 123.567C147.116 123.548 147.128 123.529 147.14 123.511C147.289 123.284 147.435 123.056 147.579 122.828C147.588 122.815 147.596 122.802 147.604 122.789C148.841 120.841 149.992 118.838 151.059 116.779L151.074 116.753C151.201 116.505 151.328 116.258 151.454 116.011L151.467 115.986L151.477 115.966C151.603 115.716 151.727 115.465 151.848 115.214L151.853 115.204L151.862 115.185C152.888 113.092 153.824 110.949 154.671 108.756C154.98 107.859 154.016 107.163 145.77 107.163Z",\n fill: "url(#paint15_linear)"\n }\n ),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint0_linear",\n x1: "2.66606",\n y1: "92.4554",\n x2: "160.007",\n y2: "92.4554",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#E9F7FE", stopOpacity: "0.4" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#5EA1D7" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#4DA3DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.89", stopColor: "#645FAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#414099" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint1_linear",\n x1: "20.8714",\n y1: "74.2626",\n x2: "98.1835",\n y2: "-3.05173",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FFF795", stopOpacity: "0.3" }),\n /* @__PURE__ */ A("stop", { offset: "0.35", stopColor: "#F3C206" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#F99B1C" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F6891F" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint2_linear",\n x1: "2.34921",\n y1: "60.0993",\n x2: "156.032",\n y2: "60.0993",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#912A73" }),\n /* @__PURE__ */ A("stop", { offset: "0.17", stopColor: "#C6168D" }),\n /* @__PURE__ */ A("stop", { offset: "0.51", stopColor: "#F175AD" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#C593C3" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "white", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint3_linear",\n x1: "67.4151",\n y1: "146.281",\n x2: "150.697",\n y2: "146.281",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#72BF44" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#91C83D" }),\n /* @__PURE__ */ A("stop", { offset: "0.38", stopColor: "#ACD037" }),\n /* @__PURE__ */ A("stop", { offset: "0.47", stopColor: "#99CA3B" }),\n /* @__PURE__ */ A("stop", { offset: "0.6", stopColor: "#7DC242" }),\n /* @__PURE__ */ A("stop", { offset: "0.72", stopColor: "#4FB848" }),\n /* @__PURE__ */ A("stop", { offset: "0.84", stopColor: "#24AE4D" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#0AA850" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A651" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint4_linear",\n x1: "24.1118",\n y1: "124.458",\n x2: "131.498",\n y2: "124.458",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0077AC" }),\n /* @__PURE__ */ A("stop", { offset: "0.22", stopColor: "#0083BB" }),\n /* @__PURE__ */ A("stop", { offset: "0.44", stopColor: "#0099DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#00B2DD" }),\n /* @__PURE__ */ A("stop", { offset: "0.67", stopColor: "#00B1DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.83", stopColor: "#00ACC6" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#00AAA9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A99D" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint5_linear",\n x1: "44.3183",\n y1: "7.71376",\n x2: "64.3489",\n y2: "15.9874",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F58220" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#FCAF17" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint6_linear",\n x1: "104.468",\n y1: "129.137",\n x2: "154.651",\n y2: "129.137",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#008A4B" }),\n /* @__PURE__ */ A("stop", { offset: "0.12", stopColor: "#179449" }),\n /* @__PURE__ */ A("stop", { offset: "0.56", stopColor: "#6CB842" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#8DC63F" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#32A443" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint7_linear",\n x1: "0.000732422",\n y1: "51.004",\n x2: "81.8161",\n y2: "51.004",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FCAF17" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F04E23" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint8_linear",\n x1: "93.3262",\n y1: "60.7419",\n x2: "163.801",\n y2: "60.7419",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#812990" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#882E92" }),\n /* @__PURE__ */ A("stop", { offset: "0.5", stopColor: "#9C3B97" }),\n /* @__PURE__ */ A("stop", { offset: "0.71", stopColor: "#BC509F" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#E86DAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F173AC" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint9_linear",\n x1: "2.54588",\n y1: "113.606",\n x2: "92.8454",\n y2: "113.606",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0089CF", stopOpacity: "0.9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#0054A6" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint10_linear",\n x1: "86.7802",\n y1: "156.894",\n x2: "60.4973",\n y2: "150.099",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#9ACA3C" }),\n /* @__PURE__ */ A("stop", { offset: "0.34", stopColor: "#7AC340" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint11_linear",\n x1: "49.7751",\n y1: "5.1769",\n x2: "103.842",\n y2: "12.7753",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FDB515" }),\n /* @__PURE__ */ A("stop", { offset: "0.36", stopColor: "#FFD100" }),\n /* @__PURE__ */ A("stop", { offset: "0.58", stopColor: "#FFC907" }),\n /* @__PURE__ */ A("stop", { offset: "0.7", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.87", stopColor: "#FBA617" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F78E1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint12_linear",\n x1: "63.8311",\n y1: "158.853",\n x2: "77.472",\n y2: "145.212",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#BAD532" }),\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#B1D334", stopOpacity: "0.93" }),\n /* @__PURE__ */ A("stop", { offset: "0.11", stopColor: "#94CC39", stopOpacity: "0.72" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#7AC53D", stopOpacity: "0.52" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#64C041", stopOpacity: "0.36" }),\n /* @__PURE__ */ A("stop", { offset: "0.41", stopColor: "#52BC44", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.53", stopColor: "#44B847", stopOpacity: "0.13" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#3AB649", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.79", stopColor: "#35B44A", stopOpacity: "0.01" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A", stopOpacity: "0" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint13_linear",\n x1: "50.2055",\n y1: "19.6079",\n x2: "101.358",\n y2: "5.90185",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F15F22", stopOpacity: "0.8" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#F6861A", stopOpacity: "0.48" }),\n /* @__PURE__ */ A("stop", { offset: "0.39", stopColor: "#FAA514", stopOpacity: "0.22" }),\n /* @__PURE__ */ A("stop", { offset: "0.52", stopColor: "#FDB910", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.59", stopColor: "#FEC00F", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FDBC10", stopOpacity: "0.04" }),\n /* @__PURE__ */ A("stop", { offset: "0.75", stopColor: "#FCB313", stopOpacity: "0.15" }),\n /* @__PURE__ */ A("stop", { offset: "0.88", stopColor: "#FAA418", stopOpacity: "0.32" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F7941D", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint14_linear",\n x1: "2.34922",\n y1: "65.9024",\n x2: "156.032",\n y2: "65.9024",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F4EAE5", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#DAAFAC", stopOpacity: "0.33" }),\n /* @__PURE__ */ A("stop", { offset: "0.68", stopColor: "#981B1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint15_linear",\n x1: "13.2094",\n y1: "124.458",\n x2: "154.728",\n y2: "124.458",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.85", stopColor: "white", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.91", stopColor: "#D6D7D8", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.97", stopColor: "#B4B6B8", stopOpacity: "0.43" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#A7A9AC", stopOpacity: "0.5" })\n ]\n }\n )\n ] })\n ]\n }\n), xV = () => /* @__PURE__ */ A(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: /* @__PURE__ */ A(\n "path",\n {\n d: "M159.994 80.9826C159.998 80.6571 160 80.338 160 80.0253C160 79.8122 160 79.5994 160 79.3868C160 79.3132 160 79.2395 160 79.1711C160 79.0319 160 78.8927 159.995 78.7542C159.995 78.6629 159.995 78.5724 159.99 78.4818C159.99 78.3632 159.985 78.2447 159.982 78.1254C159.982 78.0245 159.977 77.9229 159.975 77.8212C159.973 77.7196 159.968 77.6099 159.965 77.5038L159.954 77.1702C159.954 77.0797 159.948 76.9891 159.944 76.8985C159.94 76.7741 159.934 76.6496 159.929 76.5252C159.929 76.4663 159.924 76.4073 159.921 76.3477C159.888 75.6201 159.846 74.8935 159.793 74.1679V74.1385C159.779 73.9514 159.765 73.7637 159.75 73.5766V73.5494C159.415 69.3605 158.75 65.2047 157.762 61.1204L157.726 60.9665L157.684 60.8008C157.637 60.6071 157.588 60.4149 157.536 60.222L157.514 60.1314C157.509 60.1137 157.505 60.096 157.5 60.0784C157.456 59.9031 157.41 59.7283 157.363 59.554C157.363 59.5467 157.36 59.5393 157.358 59.5312C157.319 59.3839 157.28 59.2381 157.24 59.0938L157.203 58.9524C157.196 58.9296 157.19 58.9067 157.184 58.8839C157.163 58.8103 157.143 58.7307 157.121 58.6542C157.089 58.5378 157.056 58.421 157.023 58.3036C157.015 58.2771 157.009 58.2506 157.001 58.2241L156.952 58.0518C156.952 58.0498 156.952 58.0478 156.952 58.0459C156.878 57.797 156.809 57.5496 156.735 57.3014C156.734 57.2947 156.732 57.288 156.73 57.2815L156.656 57.0437L156.637 56.984V56.9752C156.585 56.8024 156.533 56.6288 156.479 56.4545C156.475 56.4413 156.471 56.4273 156.467 56.414L156.445 56.3404C156.437 56.3154 156.429 56.2903 156.422 56.2668C156.406 56.2167 156.391 56.1666 156.375 56.1195C156.332 55.983 156.289 55.847 156.245 55.7115C156.209 55.5981 156.173 55.4847 156.136 55.3713L156.075 55.182C156.061 55.1386 156.046 55.0951 156.032 55.0517C155.992 54.9294 155.951 54.8067 155.91 54.6835L155.903 54.6599C155.883 54.5995 155.863 54.5392 155.842 54.4788L155.803 54.3617L155.734 54.1599V54.1496C155.734 54.1452 155.73 54.14 155.729 54.1349C155.669 53.9586 155.608 53.7829 155.547 53.6076L155.531 53.5627C155.503 53.4824 155.475 53.4014 155.446 53.3211L155.398 53.1849C155.357 53.071 155.316 52.9569 155.275 52.8425C155.247 52.7688 155.22 52.69 155.192 52.6142C155.173 52.5604 155.153 52.5074 155.133 52.4537L155.124 52.4301C155.118 52.4102 155.11 52.3903 155.103 52.3712L155.098 52.3565C155.077 52.3005 155.057 52.2453 155.035 52.1893L154.99 52.0678C154.977 52.0317 154.963 51.9941 154.95 51.9603L154.891 51.8012C154.881 51.7747 154.871 51.7482 154.861 51.7224L154.75 51.4279L154.739 51.3977C154.728 51.3704 154.717 51.3424 154.706 51.3152C154.675 51.2342 154.644 51.1539 154.613 51.0736C154.589 51.0118 154.566 50.9499 154.539 50.8881L154.513 50.8203L154.414 50.5685C154.382 50.4875 154.349 50.4065 154.316 50.3255L154.242 50.1495L154.207 50.0604C154.197 50.0368 154.188 50.0125 154.178 49.9867L154.136 49.8821L154.032 49.6296L153.977 49.4955C153.946 49.4219 153.915 49.3483 153.885 49.2746C153.848 49.1862 153.811 49.0971 153.775 49.0095L153.698 48.8276C153.689 48.8077 153.68 48.7871 153.672 48.7665C153.664 48.7459 153.646 48.7054 153.633 48.6752C153.58 48.55 153.526 48.4253 153.472 48.3011C153.454 48.2584 153.435 48.2164 153.417 48.1744L153.401 48.1361L153.284 47.8666L153.2 47.6781L153.119 47.4969L153.113 47.4829L152.989 47.2053C152.962 47.1442 152.934 47.0838 152.907 47.0234C152.899 47.0065 152.891 46.9896 152.884 46.9726C152.877 46.9557 152.863 46.927 152.852 46.9041L152.837 46.8688L152.702 46.5742L152.656 46.4755L152.641 46.4417C152.634 46.4269 152.628 46.4122 152.62 46.3975L152.598 46.3489L152.437 46.005C152.417 45.9623 152.397 45.9196 152.377 45.8776L152.313 45.7414C152.288 45.6913 152.265 45.6405 152.239 45.5897L152.189 45.4858C152.146 45.396 152.104 45.3061 152.06 45.2163C151.994 45.0813 151.928 44.9465 151.862 44.812C151.832 44.7494 151.801 44.6868 151.77 44.6242C151.763 44.608 151.755 44.5918 151.746 44.5756C151.696 44.4733 151.645 44.3716 151.594 44.27L151.567 44.2163C151.559 44.2008 151.551 44.1853 151.544 44.1706L151.414 43.9121C151.414 43.9055 151.407 43.8989 151.403 43.8923L151.33 43.745L151.241 43.5712C151.214 43.5196 151.188 43.4674 151.161 43.4165L151.15 43.3944L151.086 43.2715C151.078 43.256 151.07 43.2413 151.062 43.2258L150.847 42.812C150.814 42.7501 150.782 42.6882 150.749 42.6264L150.665 42.4703C150.607 42.3623 150.55 42.2542 150.492 42.1462L150.409 41.9916C150.383 41.943 150.356 41.8951 150.331 41.8443C150.176 41.5606 150.02 41.2778 149.862 40.996L149.772 40.8347L149.734 40.767C149.67 40.6536 149.605 40.5401 149.541 40.4267L149.497 40.3531L149.346 40.0887C149.34 40.0792 149.334 40.0689 149.329 40.0585L149.165 39.7787L149.099 39.6646L148.961 39.4289L148.955 39.4193L148.734 39.043C148.713 39.0087 148.689 38.9766 148.661 38.9473C147.899 37.8427 145.495 37.3906 143.589 37.2072C141.528 37.0076 137.988 36.9281 132.871 37.6807C126.694 38.5887 118.695 39.9098 111.603 42.0792C108.595 43.0005 105.923 44.0226 103.629 45.1287C91.8719 46.8835 79.7184 48.6973 67.3366 50.2989C65.3183 50.5601 63.3448 50.8166 61.4163 51.0685C67.679 47.8556 72.4456 44.8157 75.8986 41.8377C76.7807 41.0786 77.619 40.2699 78.4093 39.4157C80.4164 38.8005 82.4173 38.1815 84.4121 37.5585C96.4132 33.8028 105.77 30.2475 112.23 26.98C112.378 26.9064 112.517 26.8328 112.658 26.7591L112.785 26.6936L113.079 26.5426L113.235 26.4601L113.489 26.3269L113.653 26.2385C113.732 26.1965 113.812 26.1538 113.89 26.1111L114.053 26.0227L114.285 25.8961L114.441 25.8092L114.674 25.6788L114.821 25.5971L115.052 25.4653L115.19 25.3865C115.301 25.3231 115.41 25.2596 115.518 25.1957L115.548 25.1781C115.667 25.1089 115.782 25.0396 115.897 24.9704L116.004 24.9063L116.237 24.7642L116.365 24.6854L116.568 24.5595L116.7 24.4755L116.891 24.354L117.022 24.2701L117.208 24.1493L117.333 24.0668L117.518 23.9431L117.633 23.8695C117.7 23.8246 117.765 23.7796 117.83 23.734L117.924 23.6699C118.022 23.6036 118.116 23.5376 118.206 23.4718C120.625 21.7457 123.462 19.0026 123.238 15.7396C123.238 15.7153 123.235 15.6917 123.233 15.666V15.6373C123.095 14.1939 122.039 11.9994 117.913 9.56415L117.889 9.55015L117.751 9.46915L117.663 9.41908L117.569 9.36532L117.426 9.28431L117.374 9.25486L117.171 9.14219L117.145 9.1282L117.135 9.12304L117.122 9.11568C116.68 8.88543 116.239 8.65886 115.797 8.43598L115.767 8.42125C115.489 8.28207 115.21 8.14363 114.93 8.00813L114.888 7.98751L114.702 7.89767L114.408 7.75702H114.401L114.216 7.66938L114.159 7.64287L114.073 7.60163L113.86 7.50148L113.793 7.46982L113.581 7.37188L113.49 7.3299L113.471 7.32107L113.316 7.24743L113.243 7.21429L112.948 7.081L112.894 7.05596L112.785 7.00736L112.696 6.96686L112.384 6.82768L112.31 6.79454L112.281 6.78202L112.155 6.72605L111.823 6.57877L111.646 6.50513L111.476 6.43149L111.108 6.27317L110.822 6.15313L110.527 6.03015L110.344 5.95651L110.227 5.90791C110.092 5.85268 109.956 5.79819 109.821 5.74369L109.673 5.68552L109.265 5.52351L109.133 5.47196L108.702 5.3048L108.629 5.27608C108.39 5.18476 108.149 5.09419 107.908 5.00435H107.9C107.464 4.84234 107.026 4.68254 106.593 4.5301L106.566 4.52053L106.074 4.34895L106.013 4.32833C105.848 4.27187 105.684 4.21615 105.521 4.16117L105.487 4.14938L105.234 4.06543L105.013 3.99179L104.651 3.87397L104.38 3.78707L104.051 3.6825L103.734 3.58309L103.439 3.49178L102.906 3.3305L102.832 3.30841L102.808 3.30105L102.292 3.14935H102.281H102.274L102.253 3.14346L102.126 3.10737C101.227 2.84914 100.324 2.60638 99.4164 2.37907C84.4694 -1.33826 68.7698 -0.688327 54.181 4.25174L54.1582 4.25984C53.9911 4.31728 53.8232 4.37472 53.6561 4.43364L53.5265 4.47856C53.3571 4.53747 53.1885 4.59785 53.0199 4.65824L52.9073 4.698L52.3779 4.89094L52.3109 4.91524C47.8766 6.55097 43.5967 8.57844 39.522 10.9736L39.4808 10.9979C39.3475 11.076 39.2142 11.1555 39.0817 11.235L38.8741 11.3588C38.7607 11.4265 38.6478 11.4947 38.5354 11.5635C38.4456 11.618 38.3557 11.6725 38.2667 11.7277C38.166 11.7891 38.0654 11.8509 37.9648 11.9133C37.8642 11.9756 37.7616 12.0394 37.657 12.1047L37.3853 12.2748C37.2705 12.347 37.1559 12.4206 37.0415 12.4958L36.8052 12.6453C36.6702 12.7312 36.5362 12.8178 36.4032 12.9052L36.222 13.023C36.0257 13.1512 35.8311 13.2798 35.6382 13.4089C35.3128 13.6261 35.1523 13.9745 35.2192 14.3191C35.3422 14.9546 36.0984 15.1799 36.6572 15.2941C39.1244 15.7985 44.3681 16.3611 48.243 16.3935C48.3947 16.3935 48.5457 16.3935 48.6973 16.3935C52.9434 16.3935 57.2063 15.8965 60.4577 15.0179C62.4147 14.4885 63.9918 13.8301 65.1411 13.0598C66.2904 12.2896 67.0281 11.3963 67.3285 10.4088C72.0841 10.0546 77.1687 9.802 82.4278 9.73057C87.2381 9.6643 91.6761 9.71805 95.7417 9.89185C92.6877 12.2837 87.4499 14.8412 80.7602 17.1984C76.7387 18.6138 71.5819 20.3436 65.9613 22.1205C61.1336 22.4718 55.1043 23.4262 47.6165 24.7664C40.3451 26.0669 32.7432 27.7805 26.7544 29.4669C19.3697 31.5465 15.0279 33.4007 13.8506 34.9781L13.8352 35.0002L13.4442 35.5798C13.3124 35.7771 13.1806 35.9752 13.051 36.1733C13.0478 36.1773 13.0449 36.1815 13.0422 36.1858C12.8176 36.5275 12.585 36.8891 12.3302 37.2904L12.2654 37.3942L12.1771 37.5349C12.0819 37.6866 11.9874 37.8385 11.8936 37.9907L11.8863 38.0025L11.8811 38.0113L11.7236 38.2661L11.5255 38.5924C11.5174 38.6049 11.51 38.6174 11.5027 38.6299L11.446 38.722L11.2663 39.0224C11.2317 39.0799 11.1979 39.138 11.1633 39.1962L11.1242 39.261L11.0027 39.4657L10.9821 39.5011L10.9785 39.5085C10.8032 39.8067 10.6243 40.116 10.4373 40.4444C10.4226 40.4702 10.4078 40.496 10.3939 40.5181C10.3799 40.5401 10.3556 40.5843 10.3364 40.6189L10.2878 40.7029L10.2039 40.8502L10.0787 41.0726L10.0301 41.1602L9.93148 41.3377L9.89982 41.3951L9.78423 41.6101C9.76435 41.647 9.74447 41.6838 9.72386 41.7206L9.6944 41.7751C9.63649 41.8811 9.57881 41.9872 9.52138 42.0932L9.37413 42.365C9.28725 42.5292 9.19963 42.6927 9.11202 42.8591L9.10171 42.8797C8.89997 43.2634 8.69824 43.6559 8.48472 44.08L8.38533 44.2759C8.29918 44.4482 8.21451 44.6206 8.12616 44.7995L8.00541 45.0462C7.92197 45.2175 7.83902 45.3894 7.75656 45.5617C7.72784 45.6221 7.69986 45.6824 7.67115 45.7421L7.64538 45.7973C7.50181 46.0992 7.35823 46.4078 7.21761 46.7141V46.7178C7.07772 47.0227 6.93783 47.3327 6.80162 47.6405L6.75892 47.737V47.7422L6.7383 47.7893C6.65657 47.9741 6.57632 48.1575 6.49607 48.346L6.39741 48.578C6.31863 48.7621 6.24132 48.9462 6.16401 49.131L6.07566 49.3424C5.9424 49.6627 5.80913 49.9904 5.68102 50.3115L5.67366 50.3284C5.54334 50.6554 5.41376 50.9853 5.28859 51.3108L5.25546 51.3962C5.18184 51.5943 5.10821 51.7938 5.03016 51.9927L4.95654 52.1996C4.88438 52.396 4.81297 52.5923 4.74228 52.7887L4.66866 52.9824C4.54865 53.3167 4.4279 53.6599 4.31157 53.9986L4.30126 54.0281C4.18199 54.3771 4.06492 54.724 3.95448 55.059L3.9508 55.0694V55.0789L3.94712 55.0914C3.87865 55.2999 3.81165 55.5097 3.74465 55.7189L3.68354 55.9118C3.61923 56.1151 3.55592 56.3185 3.49358 56.5223L3.43689 56.7086C3.3316 57.0554 3.22631 57.4104 3.12324 57.7653L3.11367 57.7985C3.00912 58.16 2.90825 58.5201 2.81253 58.8692C2.81282 58.8704 2.81282 58.8717 2.81253 58.8729V58.8802C2.76787 59.0462 2.7232 59.2121 2.67853 59.378L2.58208 59.7462L2.47827 60.1446C2.45765 60.2264 2.43704 60.3081 2.41716 60.3899L2.23457 61.1263C1.34717 64.7973 0.72125 68.5268 0.361506 72.2864C0.35488 72.3512 0.348989 72.416 0.343099 72.4816C0.328374 72.634 0.315121 72.7857 0.301132 72.9381L0.279045 73.1966C0.268001 73.3299 0.256956 73.4639 0.246649 73.5972C0.239286 73.69 0.231188 73.7821 0.224561 73.8748C0.214253 74.0103 0.204682 74.1466 0.19511 74.2821C0.188484 74.369 0.181857 74.4551 0.175967 74.5413C0.161978 74.7467 0.149462 74.9522 0.136945 75.1584L0.119275 75.4625C0.112649 75.5818 0.106022 75.7004 0.100132 75.8189C0.094242 75.925 0.0890882 76.031 0.0846706 76.1371C0.0787805 76.2542 0.0736265 76.3713 0.0684727 76.4876C0.0630734 76.5912 0.0586558 76.695 0.0552199 76.7991C0.050066 76.9258 0.0456483 77.0517 0.0412307 77.1776C0.0412307 77.2711 0.0346045 77.3647 0.0316594 77.4582C0.025033 77.6577 0.0198789 77.8566 0.0147251 78.0561C0.0147251 78.1099 0.0147251 78.1644 0.0147251 78.2182C0.0107983 78.4032 0.00736247 78.5881 0.00441741 78.7727C0.00441741 78.794 0.00441741 78.8154 0.00441741 78.8375V78.8419C0.00441741 78.9685 0.00441759 79.0871 0 79.2005C0 79.2557 0 79.311 0 79.3669C0 79.5474 0 79.713 0 79.8721V79.9023C0.0147253 80.4679 0.402737 81.7853 3.67396 81.803H3.80796C6.14708 81.803 11.7074 81.504 17.6431 80.9355C28.0075 79.9428 48.257 77.3271 71.7041 74.2902L74.5019 73.9279C81.1283 73.0707 90.4053 71.7923 100.639 70.3504C102.392 71.3593 104.342 72.2437 106.39 73.0221C95.9906 75.3786 85.4517 77.7874 75.3774 80.2145C67.3167 82.1564 59.5086 84.1454 52.16 86.0844C44.2819 86.9224 36.6145 88.2074 28.5811 90.0146C19.7511 92.0029 11.2266 94.6156 4.57883 97.3786L4.40287 97.4522C2.90162 98.0715 2.2942 99.0414 2.59607 100.335V100.345L2.59975 100.359L2.65939 100.58V100.589L2.7632 100.982V100.987C2.8383 101.263 2.91487 101.539 2.99292 101.815C3.01648 101.899 3.04078 101.984 3.06654 102.069C3.12986 102.29 3.19416 102.511 3.25945 102.731L3.3154 102.923C3.39639 103.194 3.47861 103.464 3.56205 103.733L3.63568 103.97C3.70121 104.179 3.76747 104.387 3.83447 104.595L3.85877 104.669C3.87644 104.725 3.89484 104.78 3.91251 104.835C3.94712 104.942 3.98614 105.048 4.01854 105.155C4.07007 105.311 4.12161 105.468 4.17389 105.624L4.2431 105.827C4.31476 106.036 4.38691 106.244 4.45956 106.453L4.55454 106.723C4.63994 106.963 4.72609 107.203 4.81297 107.442L4.87997 107.626C4.9639 107.854 5.04906 108.082 5.13545 108.31C5.17153 108.405 5.20908 108.5 5.24442 108.595C5.27976 108.69 5.31804 108.785 5.35412 108.88L5.46677 109.175L5.50358 109.269C5.52125 109.316 5.53966 109.362 5.55807 109.409C5.65599 109.657 5.75612 109.905 5.85625 110.152L5.95786 110.399L5.977 110.446C6.05063 110.618 6.11984 110.791 6.19199 110.962L6.22218 111.035L6.31568 111.256C6.41778 111.496 6.52061 111.734 6.62418 111.973L6.71474 112.179L6.7545 112.267C6.82812 112.428 6.89733 112.59 6.96949 112.751C7.01955 112.862 7.06888 112.972 7.11674 113.084C7.1992 113.266 7.2824 113.447 7.36633 113.627C7.43358 113.775 7.50107 113.919 7.56881 114.06C7.64243 114.217 7.71606 114.374 7.78969 114.53C7.84712 114.651 7.90504 114.771 7.96345 114.891C8.03045 115.03 8.09892 115.169 8.16739 115.308C8.24764 115.472 8.32937 115.635 8.41109 115.799C8.49282 115.962 8.57602 116.128 8.65995 116.292C8.72523 116.421 8.79125 116.55 8.85801 116.678C8.91912 116.796 8.97949 116.913 9.0406 117.029L9.05901 117.065C9.12183 117.185 9.18466 117.305 9.24749 117.424C9.35106 117.621 9.45512 117.815 9.55967 118.007L9.80116 118.449C9.85638 118.548 9.91087 118.647 9.96609 118.743C10.0451 118.887 10.1246 119.03 10.2046 119.172L10.3033 119.346L10.3475 119.42C10.4991 119.687 10.6516 119.953 10.8017 120.211L10.9365 120.441C11.0256 120.594 11.1161 120.747 11.2067 120.899L11.3289 121.103C11.5196 121.421 11.711 121.736 11.8995 122.04L11.9496 122.122C12.0512 122.286 12.1535 122.449 12.2566 122.612L12.3582 122.773C12.3707 122.793 12.384 122.812 12.3965 122.833C12.409 122.854 12.4274 122.88 12.4421 122.907C12.5644 123.098 12.6871 123.289 12.8103 123.48C12.8176 123.492 12.825 123.504 12.8331 123.516C12.9487 123.695 13.065 123.871 13.1821 124.048L13.1902 124.062C13.4074 124.392 13.6386 124.734 13.8948 125.11L13.9338 125.166L14.0553 125.345L14.1974 125.549L14.2924 125.686L14.3601 125.783L14.5192 126.011C14.5236 126.016 14.5273 126.022 14.5309 126.027L14.5434 126.044C14.5434 126.049 14.5501 126.053 14.553 126.058C14.6502 126.195 14.7467 126.332 14.8475 126.469L14.9565 126.621L15.0662 126.773L15.1479 126.885C15.3018 127.098 15.4579 127.313 15.6162 127.526L15.6633 127.59L15.7524 127.711C15.8628 127.858 15.9738 128.006 16.0852 128.153C16.1397 128.226 16.1949 128.3 16.2494 128.374C16.3628 128.521 16.4764 128.668 16.5903 128.816L16.711 128.972C16.9716 129.308 17.2323 129.64 17.4856 129.956L17.5261 130.007C17.6497 130.162 17.7749 130.316 17.9001 130.47L18.0473 130.646C18.172 130.798 18.2972 130.95 18.4228 131.102L18.5362 131.238C18.9559 131.741 19.3859 132.244 19.8136 132.731L19.9219 132.855C20.0598 133.011 20.1987 133.168 20.3386 133.325L20.4343 133.431C20.893 133.942 21.362 134.452 21.8281 134.945L21.8744 134.994C22.0276 135.156 22.1817 135.318 22.3368 135.479L22.4104 135.557C22.6674 135.823 22.9258 136.089 23.1909 136.353L23.2189 136.381C23.6142 136.78 24.014 137.175 24.4146 137.56L24.4661 137.609C24.5029 137.645 24.5397 137.683 24.5787 137.716C24.7105 137.843 24.8423 137.97 24.9749 138.095L25.0485 138.164L25.0647 138.18C25.1898 138.298 25.3165 138.416 25.4424 138.534C25.516 138.608 25.5896 138.673 25.6669 138.742C25.7538 138.823 25.8414 138.904 25.9283 138.983L26.1153 139.155C26.2663 139.292 26.4172 139.429 26.5667 139.563L26.5711 139.567L26.5954 139.589L26.6123 139.605C26.7596 139.738 26.9105 139.871 27.0651 140.006L27.2448 140.165L27.5334 140.416C27.6608 140.527 27.7881 140.637 27.9155 140.746C27.9891 140.811 28.0627 140.876 28.1415 140.94L28.1975 140.988L28.2395 141.024L28.2623 141.044C28.4095 141.171 28.5627 141.297 28.7136 141.423L28.8049 141.496L28.8182 141.507C28.8506 141.533 28.8844 141.558 28.919 141.58C29.026 141.653 29.1418 141.712 29.2636 141.756H29.2695H29.2754C29.597 141.858 29.9336 141.905 30.2708 141.894C30.9681 141.894 31.9296 141.764 33.302 141.505C37.6651 140.678 59.0588 136.896 84.0101 133.478C91.453 132.457 99.0409 131.71 105.969 131.165C104.453 133.095 103.671 135.048 103.637 137.007C103.574 140.606 107.793 143.407 111.39 145.226C106.627 146.781 101.598 148.145 96.5509 149.141C93.2377 149.795 89.9937 150.354 86.8322 150.83C86.7985 150.611 86.7466 150.395 86.6768 150.184C86.0657 148.334 83.5757 147.043 79.6646 146.547C75.8758 146.068 71.0363 146.357 66.0378 147.363C59.2959 148.719 55.0204 150.794 53.8703 151.397C52.1033 152.323 51.4068 153.023 51.4568 153.813C51.5113 154.671 52.4442 155.128 53.2622 155.433L53.282 155.44L53.6347 155.563L53.687 155.582L54.0301 155.7C54.5845 155.89 55.1418 156.074 55.6845 156.247L55.7264 156.261L56.1498 156.393H56.1564C56.459 156.487 56.7683 156.582 57.0812 156.675L57.1261 156.689L57.1607 156.699L57.2166 156.716L57.411 156.774C57.6047 156.831 57.7983 156.887 57.9919 156.942L58.1046 156.975C58.6072 157.118 59.1118 157.255 59.6183 157.387L59.692 157.406L59.8061 157.437L59.8245 157.441C60.0297 157.494 60.2351 157.546 60.4408 157.598L60.6219 157.644L60.7308 157.671L60.7853 157.684L61.3184 157.813L61.4112 157.836L61.6372 157.889C61.6784 157.899 61.7204 157.908 61.7623 157.917L62.2085 158.021L62.3506 158.053L62.5384 158.095C62.6194 158.113 62.7011 158.13 62.7828 158.148C62.8933 158.172 63.0037 158.197 63.1156 158.222L63.176 158.235L63.4955 158.303L63.8533 158.376L64.0588 158.418H64.0742L64.3128 158.467C64.5332 158.51 64.754 158.553 64.9754 158.595L65.3885 158.669L65.7338 158.732L65.9326 158.767L66.0113 158.781L66.1814 158.811L66.3706 158.844L66.9258 158.937L67.0635 158.959L67.3241 159.001L67.545 159.036C67.6731 159.057 67.8012 159.076 67.93 159.095L68.0037 159.106L68.0854 159.119L68.1826 159.133C68.428 159.168 68.671 159.203 68.9115 159.237L69.0845 159.261L69.351 159.297L69.3982 159.303L69.9275 159.371L70.0093 159.381L70.063 159.388L70.4083 159.429C71.0062 159.5 71.6045 159.565 72.2033 159.623C72.4036 159.642 72.6039 159.661 72.8048 159.679L73.1546 159.71L73.2334 159.716L73.2658 159.72C73.4962 159.739 73.7281 159.757 73.9601 159.774L74.0212 159.779C76.0002 159.926 78.0022 160 79.9849 160C85.8763 160.002 91.7501 159.357 97.5007 158.076C103.072 156.83 108.494 154.988 113.671 152.581C115.726 151.626 117.741 150.582 119.715 149.449C119.728 149.442 119.741 149.437 119.754 149.43C120.811 148.823 121.852 148.193 122.877 147.539L122.913 147.516C123.173 147.35 123.432 147.183 123.69 147.014L123.863 146.901C124.076 146.761 124.287 146.62 124.498 146.479L124.728 146.325C124.924 146.192 125.119 146.059 125.312 145.926C125.492 145.802 125.672 145.676 125.851 145.55C125.988 145.454 126.125 145.359 126.261 145.262C126.445 145.131 126.628 145 126.81 144.868L126.989 144.738C127.189 144.591 127.389 144.443 127.587 144.296L127.672 144.233C127.808 144.133 127.944 144.033 128.079 143.931C132.538 140.57 136.636 136.754 140.306 132.545C140.485 132.34 140.663 132.134 140.84 131.926L140.89 131.868C141.06 131.668 141.229 131.468 141.396 131.269L141.463 131.189C141.629 130.989 141.795 130.788 141.96 130.587L142.019 130.513C142.188 130.307 142.355 130.1 142.52 129.893L142.552 129.852C143.169 129.08 143.781 128.282 144.371 127.483L144.399 127.445C144.988 126.646 145.57 125.825 146.127 125.011L146.135 124.999L146.151 124.976C146.304 124.752 146.456 124.527 146.606 124.301L146.649 124.236C146.796 124.014 146.943 123.791 147.09 123.567L147.134 123.5C147.281 123.273 147.428 123.045 147.576 122.816L147.6 122.778C148.833 120.832 149.996 118.809 151.06 116.761L151.069 116.744L151.074 116.735C151.202 116.489 151.328 116.242 151.453 115.993L151.477 115.946C151.603 115.696 151.727 115.445 151.852 115.193L151.865 115.165C152.463 113.946 153.032 112.703 153.569 111.449C153.606 111.362 153.642 111.276 153.681 111.19C153.732 111.068 153.782 110.946 153.833 110.822C153.894 110.674 153.955 110.529 154.016 110.384C154.069 110.254 154.122 110.123 154.174 109.993C154.226 109.863 154.285 109.721 154.339 109.585C154.399 109.433 154.458 109.283 154.518 109.131C154.559 109.026 154.601 108.92 154.641 108.814V108.809C154.651 108.783 154.661 108.757 154.672 108.735C154.672 108.727 154.678 108.717 154.681 108.707C154.856 108.183 154.7 107.808 154.54 107.584C154.072 106.937 152.969 106.305 145.245 106.305C145.135 106.305 133.659 106.362 112.317 108.408C103.746 109.231 93.7177 110.402 83.6412 111.691C86.3654 109.556 88.6147 107.578 90.244 105.607C91.3757 104.237 92.1819 102.907 92.6906 101.567C103.109 99.1106 113.986 96.6392 124.245 94.4352C140.532 90.9365 152.55 88.097 156.394 86.8392C157.117 86.6028 158.544 86.0093 159.307 85.2839L159.312 85.2788C159.598 85.002 159.791 84.6437 159.865 84.253C159.879 84.2051 159.889 84.1557 159.892 84.1057V84.1013V84.091C159.892 84.0674 159.892 84.0438 159.892 84.0173C159.892 84.0102 159.892 84.0031 159.892 83.996C159.924 83.3457 159.949 82.6881 159.965 82.0393V81.9171C159.972 81.6395 159.976 81.3648 159.981 81.0916L159.994 80.9826ZM60.1249 13.8147C56.8625 14.6983 52.5333 15.1814 48.2467 15.1453C44.8938 15.1174 40.3429 14.6659 37.7329 14.2248C41.8316 13.4457 52.4582 11.5937 65.9245 10.5207C64.9725 12.2608 61.9854 13.3124 60.1249 13.8147ZM81.1718 18.3804C90.9045 14.9539 95.4553 11.9413 97.5662 9.98537C106.728 10.4714 113.852 11.5974 118.838 13.3537C120.6 13.9745 121.688 14.6726 121.9 15.3191C121.938 15.4598 121.964 15.6034 121.979 15.7484V15.775C121.979 15.7897 121.979 15.8037 121.982 15.8199C122.084 17.3037 121.384 19.658 117.472 22.4475C117.384 22.5108 117.294 22.5742 117.203 22.6375L117.113 22.6993L116.923 22.829L116.813 22.9026L116.635 23.0219L116.514 23.1007L116.335 23.2178L116.209 23.2988L116.024 23.4159L115.896 23.4969L115.699 23.6191L115.575 23.6928L115.35 23.8297L115.245 23.8931C115.134 23.9603 115.021 24.0276 114.906 24.0948L114.876 24.1125C114.771 24.1739 114.665 24.2355 114.557 24.2973L114.424 24.371L114.198 24.4998L114.051 24.5801C113.978 24.6221 113.904 24.6648 113.824 24.7068L113.671 24.7922L113.445 24.9159L113.285 25.0028C113.211 25.0448 113.13 25.086 113.052 25.128L112.892 25.2134L112.643 25.3452L112.49 25.4255L112.204 25.5728L112.079 25.6369C111.94 25.7085 111.8 25.78 111.659 25.8511C105.26 29.0876 95.9648 32.6202 84.0314 36.3515C82.6468 36.7855 81.2591 37.2163 79.8686 37.6439C80.4219 36.9092 80.9076 36.1259 81.3198 35.3036C82.4978 32.925 82.7187 30.5759 81.9868 28.3225C81.308 26.2304 80.099 24.709 78.2915 23.6714C76.5922 22.6957 74.3436 22.15 71.4163 22.0034C71.1134 21.9887 70.8039 21.9779 70.4878 21.971C74.5019 20.6787 78.156 19.4408 81.1718 18.3789V18.3804ZM74.3245 72.6856L71.5267 73.0479C48.0906 76.0796 27.8507 78.6983 17.5069 79.6887C11.4953 80.2639 5.88644 80.5629 3.66513 80.5503C1.88558 80.5408 1.27079 80.1085 1.23545 79.8876C1.25828 79.7616 1.54837 79.0282 5.06403 77.1018C7.8022 75.6017 12.1425 73.5619 18.3337 70.8659C32.1475 64.8495 46.7028 58.0945 56.4811 53.4868C56.9818 53.2512 57.4729 53.0163 57.9581 52.7821C61.018 52.3805 64.1945 51.9664 67.4875 51.5398C78.6994 50.0898 89.7228 48.466 100.428 46.8695C98.0448 48.3541 96.1886 49.9963 94.8972 51.7651C92.9321 54.4581 92.2135 57.5091 92.7621 60.8383C93.3378 64.3245 95.6814 67.0977 98.9702 69.3217C89.3288 70.673 80.6284 71.8689 74.3252 72.6841L74.3245 72.6856ZM113.149 151.492C108.053 153.861 102.717 155.674 97.2327 156.9C91.5718 158.161 85.7896 158.796 79.9901 158.794C78.7929 158.794 77.5884 158.765 76.3824 158.711C76.847 158.531 77.3535 158.343 77.8549 158.16C79.8494 157.428 82.3314 156.517 84.1514 155.324C85.6409 154.348 86.5207 153.283 86.7865 152.141C90.0394 151.654 93.3835 151.081 96.7939 150.407C101.984 149.382 107.518 147.885 113.006 146.04C113.704 146.36 114.34 146.635 114.865 146.863C115.234 147.022 115.552 147.157 115.777 147.264C117.276 147.961 118.059 148.447 118.463 148.767C116.726 149.742 114.955 150.65 113.149 151.491L113.149 151.492ZM112.439 109.702C130.298 107.989 142.412 107.604 145.247 107.604C148.215 107.604 150.342 107.693 151.749 107.878C153.048 108.049 153.414 108.268 153.502 108.341V108.349L153.483 108.4C153.034 109.422 151.81 109.953 149.51 110.877C148.915 111.115 147.449 111.603 145.42 112.276C140.835 113.8 133.16 116.351 125.026 119.527C118.514 122.07 113.4 124.755 109.825 127.498C108.878 128.218 107.984 129.005 107.151 129.855C99.8619 130.408 91.7681 131.186 83.8422 132.273C58.8651 135.697 37.4413 139.484 33.0716 140.311C32.7321 140.375 32.4259 140.429 32.1475 140.475C36.6299 138.77 42.3721 136.425 52.0871 131.614C62.4051 126.503 66.5562 124.31 78.0036 115.955C79.2867 115.019 80.5062 114.118 81.6621 113.252C92.4418 111.858 103.274 110.579 112.44 109.7L112.439 109.702ZM156.007 85.6948C150.369 87.5358 130.072 91.9491 123.986 93.257C113.951 95.4131 103.324 97.8226 93.1125 100.228C93.4924 98.5561 93.4343 96.8403 92.9358 94.9934C92.522 93.4609 91.6606 92.033 90.3766 90.7502C89.1249 89.4984 87.4911 88.4107 85.5297 87.5219C81.467 85.6808 76.2204 84.7824 70.3575 84.9268C66.6762 85.0173 63.1178 85.1816 59.6338 85.4246C64.8149 84.091 70.1779 82.7492 75.6571 81.4289C86.3448 78.8515 97.5596 76.2983 108.576 73.8056C114.653 75.8477 121.266 77.073 126.07 77.9633C126.935 78.1239 127.752 78.2748 128.484 78.4162C131.572 79.012 135.779 79.6895 140.233 80.4045C147.041 81.5018 154.081 82.6358 157.998 83.6152C158.555 83.7544 158.635 83.926 158.644 84.0306C158.623 84.1794 158.553 84.3171 158.445 84.4216C157.95 84.8944 156.82 85.429 156.007 85.6948H156.007Z",\n fill: "currentColor"\n }\n )\n }\n), RV = () => /* @__PURE__ */ A(\n "svg",\n {\n width: "20",\n height: "20",\n viewBox: "0 0 20 20",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: /* @__PURE__ */ A(\n "path",\n {\n d: "M19.9993 10.1228C19.9998 10.0821 20 10.0423 20 10.0032C20 9.97653 20 9.94992 20 9.92335C20 9.91415 20 9.90494 20 9.89638C20 9.87898 20 9.86159 19.9994 9.84428C19.9994 9.83287 19.9994 9.82154 19.9987 9.81022C19.9987 9.7954 19.9982 9.78058 19.9978 9.76567C19.9978 9.75306 19.9971 9.74036 19.9969 9.72765C19.9966 9.71495 19.996 9.70123 19.9957 9.68798L19.9943 9.64628C19.9943 9.63496 19.9935 9.62364 19.993 9.61232C19.9925 9.59676 19.9918 9.5812 19.9912 9.56565C19.9912 9.55828 19.9905 9.55092 19.9902 9.54346C19.986 9.45252 19.9807 9.36169 19.9741 9.27099V9.26731C19.9724 9.24393 19.9706 9.22046 19.9687 9.19708V9.19367C19.9268 8.67007 19.8437 8.15058 19.7202 7.64005L19.7157 7.62081L19.7105 7.6001C19.7046 7.57589 19.6985 7.55186 19.6921 7.52775L19.6893 7.51642C19.6887 7.51421 19.6881 7.512 19.6875 7.5098C19.682 7.48789 19.6763 7.46604 19.6704 7.44426C19.6704 7.44334 19.67 7.44241 19.6697 7.4414C19.6649 7.42299 19.66 7.40477 19.6551 7.38672L19.6504 7.36905C19.6495 7.3662 19.6488 7.36334 19.648 7.36049C19.6454 7.35128 19.6428 7.34134 19.6402 7.33177C19.6361 7.31723 19.632 7.30262 19.6278 7.28795C19.6269 7.28464 19.6261 7.28133 19.6251 7.27801L19.619 7.25647C19.619 7.25623 19.619 7.25598 19.619 7.25574C19.6098 7.22462 19.6011 7.1937 19.5919 7.16267C19.5917 7.16183 19.5915 7.161 19.5912 7.16019L19.582 7.13046L19.5797 7.123V7.1219C19.5732 7.10029 19.5666 7.0786 19.5599 7.05682C19.5593 7.05516 19.5589 7.05341 19.5583 7.05175L19.5556 7.04255C19.5547 7.03942 19.5536 7.03629 19.5527 7.03334C19.5507 7.02708 19.5489 7.02082 19.5468 7.01493C19.5415 6.99787 19.5361 6.98087 19.5306 6.96394C19.5262 6.94976 19.5216 6.93559 19.517 6.92141L19.5094 6.89775C19.5076 6.89232 19.5058 6.88689 19.5039 6.88146C19.499 6.86618 19.4939 6.85084 19.4888 6.83544L19.4878 6.83249C19.4854 6.82494 19.4829 6.81739 19.4803 6.80985L19.4753 6.79521L19.4668 6.76999V6.7687C19.4668 6.76815 19.4663 6.7675 19.4661 6.76686C19.4586 6.74483 19.451 6.72286 19.4434 6.70095L19.4414 6.69533C19.4379 6.6853 19.4344 6.67518 19.4308 6.66514L19.4247 6.64811C19.4197 6.63388 19.4145 6.61961 19.4093 6.60531C19.4058 6.59611 19.4025 6.58626 19.399 6.57677C19.3966 6.57005 19.3941 6.56343 19.3917 6.55671L19.3906 6.55376C19.3897 6.55128 19.3888 6.54879 19.3879 6.5464L19.3872 6.54456C19.3847 6.53756 19.3821 6.53066 19.3794 6.52366L19.3738 6.50847C19.3722 6.50396 19.3704 6.49927 19.3687 6.49503L19.3614 6.47515C19.3601 6.47184 19.3589 6.46852 19.3576 6.4653L19.3438 6.42848L19.3423 6.42471C19.341 6.4213 19.3397 6.4178 19.3383 6.4144C19.3344 6.40427 19.3306 6.39424 19.3266 6.38421C19.3237 6.37647 19.3207 6.36874 19.3174 6.36101L19.3141 6.35254L19.3017 6.32106C19.2977 6.31093 19.2936 6.30081 19.2895 6.29068L19.2803 6.26868L19.2759 6.25754C19.2747 6.2546 19.2735 6.25156 19.2722 6.24834L19.267 6.23527L19.254 6.20369L19.2471 6.18694C19.2433 6.17774 19.2394 6.16853 19.2356 6.15933C19.2311 6.14828 19.2264 6.13714 19.2219 6.12619L19.2122 6.10345C19.2111 6.10097 19.21 6.09839 19.209 6.09581C19.208 6.09323 19.2058 6.08817 19.2041 6.0844C19.1975 6.06875 19.1908 6.05316 19.1839 6.03764C19.1817 6.0323 19.1794 6.02705 19.1771 6.0218L19.1751 6.01702L19.1605 5.98333L19.15 5.95976L19.1399 5.93712L19.1391 5.93537L19.1237 5.90067C19.1203 5.89303 19.1168 5.88548 19.1134 5.87793C19.1123 5.87581 19.1114 5.87369 19.1105 5.87158C19.1096 5.86946 19.1078 5.86587 19.1065 5.86302L19.1046 5.8586L19.0878 5.82178L19.0821 5.80944L19.0801 5.80521C19.0793 5.80337 19.0785 5.80153 19.0776 5.79969L19.0748 5.79361L19.0546 5.75062C19.0522 5.74528 19.0497 5.73995 19.0471 5.7347L19.0391 5.71767C19.036 5.71141 19.0331 5.70506 19.0299 5.69871L19.0236 5.68573C19.0183 5.6745 19.0129 5.66327 19.0075 5.65204C18.9993 5.63516 18.991 5.61832 18.9828 5.6015C18.979 5.59368 18.9751 5.58585 18.9713 5.57803C18.9703 5.576 18.9693 5.57398 18.9683 5.57195C18.962 5.55916 18.9556 5.54646 18.9493 5.53375L18.9459 5.52703C18.9449 5.5251 18.9439 5.52317 18.943 5.52133L18.9267 5.48902C18.9267 5.48819 18.9259 5.48736 18.9254 5.48653L18.9162 5.46812L18.9051 5.4464C18.9018 5.43995 18.8985 5.43342 18.8951 5.42707L18.8938 5.42431L18.8858 5.40893C18.8847 5.407 18.8837 5.40516 18.8828 5.40323L18.8558 5.35149C18.8518 5.34376 18.8477 5.33603 18.8436 5.3283L18.8331 5.30878C18.8259 5.29528 18.8187 5.28178 18.8115 5.26828L18.8011 5.24895C18.7979 5.24287 18.7945 5.23689 18.7913 5.23054C18.772 5.19507 18.7525 5.15972 18.7328 5.1245L18.7215 5.10434L18.7167 5.09587C18.7087 5.08169 18.7007 5.06752 18.6926 5.05334L18.6871 5.04414L18.6683 5.01109C18.6675 5.0099 18.6667 5.00861 18.6661 5.00732L18.6456 4.97234L18.6374 4.95807L18.6201 4.92862L18.6194 4.92742L18.5918 4.88038C18.5892 4.87608 18.5861 4.87207 18.5826 4.86841C18.4874 4.73034 18.1869 4.67382 17.9487 4.6509C17.691 4.62595 17.2485 4.61601 16.6089 4.71009C15.8368 4.82359 14.8369 4.98872 13.9504 5.2599C13.5743 5.37506 13.2403 5.50282 12.9536 5.64108C11.484 5.86044 9.9648 6.08716 8.41708 6.28737C8.16478 6.32002 7.9181 6.35208 7.67704 6.38356C8.45987 5.98195 9.05569 5.60196 9.48733 5.22971C9.59759 5.13482 9.70237 5.03374 9.80116 4.92696C10.052 4.85007 10.3022 4.77268 10.5515 4.69481C12.0517 4.22535 13.2212 3.78093 14.0288 3.37251C14.0472 3.3633 14.0646 3.3541 14.0823 3.34489L14.0981 3.3367L14.1349 3.31783L14.1544 3.30752L14.1861 3.29086L14.2066 3.27981C14.2165 3.27456 14.2265 3.26923 14.2362 3.26389L14.2567 3.25284L14.2856 3.23701L14.3052 3.22615L14.3343 3.20985L14.3527 3.19964L14.3816 3.18316L14.3988 3.17331C14.4126 3.16539 14.4262 3.15745 14.4397 3.14947L14.4435 3.14726C14.4583 3.13861 14.4728 3.12995 14.4871 3.1213L14.5005 3.11329L14.5296 3.09553L14.5456 3.08568L14.571 3.06994L14.5875 3.05944L14.6114 3.04426L14.6278 3.03376L14.6509 3.01867L14.6666 3.00836L14.6898 2.99289L14.7041 2.98369C14.7125 2.97807 14.7206 2.97246 14.7288 2.96675L14.7405 2.95874C14.7528 2.95046 14.7645 2.9422 14.7757 2.93398C15.0782 2.71821 15.4328 2.37533 15.4048 1.96745C15.4048 1.96441 15.4043 1.96147 15.4041 1.95825V1.95466C15.3868 1.77424 15.2549 1.49993 14.7391 1.19552L14.7362 1.19377L14.7189 1.18364L14.7079 1.17738L14.6961 1.17066L14.6783 1.16054L14.6717 1.15686L14.6464 1.14277L14.6431 1.14102L14.6419 1.14038L14.6403 1.13946C14.585 1.11068 14.5298 1.08236 14.4746 1.0545L14.4709 1.05266C14.4361 1.03526 14.4013 1.01795 14.3662 1.00102L14.3609 0.998439L14.3378 0.987209L14.3009 0.969627H14.3001L14.277 0.958673L14.2699 0.955359L14.2591 0.950204L14.2326 0.937685L14.2241 0.933727L14.1977 0.921485L14.1863 0.916238L14.1839 0.915133L14.1645 0.905928L14.1553 0.901786L14.1185 0.885125L14.1117 0.881995L14.0981 0.87592L14.087 0.870857L14.0479 0.85346L14.0387 0.849317L14.0351 0.847753L14.0193 0.840757L13.9779 0.822347L13.9557 0.813142L13.9346 0.803937L13.8885 0.784146L13.8527 0.769142L13.8159 0.753769L13.793 0.744564L13.7784 0.738489C13.7615 0.731585 13.7445 0.724773 13.7276 0.717962L13.7092 0.71069L13.6581 0.690439L13.6416 0.683995L13.5878 0.6631L13.5786 0.65951C13.5487 0.648095 13.5187 0.636773 13.4885 0.625543H13.4876C13.433 0.605292 13.3783 0.585317 13.3241 0.566263L13.3208 0.565066L13.2592 0.543619L13.2517 0.541041C13.2311 0.533984 13.2105 0.527019 13.1901 0.520146L13.1859 0.518673L13.1542 0.508179L13.1266 0.498974L13.0814 0.484246L13.0475 0.473384L13.0064 0.460313L12.9667 0.447886L12.9299 0.436472L12.8632 0.416313L12.854 0.413552L12.851 0.412631L12.7865 0.393669H12.7851H12.7842L12.7817 0.392932L12.7657 0.388422C12.6533 0.356143 12.5404 0.325797 12.4271 0.297384C10.5587 -0.167283 8.59623 -0.0860409 6.77263 0.531468L6.76977 0.532481C6.74888 0.53966 6.7279 0.54684 6.70701 0.554204L6.69081 0.559819C6.66964 0.567183 6.64857 0.574731 6.62749 0.58228L6.61341 0.58725L6.54724 0.611367L6.53886 0.614405C5.98457 0.818872 5.44959 1.07231 4.94025 1.3717L4.93509 1.37474C4.91844 1.3845 4.90178 1.39444 4.88521 1.40438L4.85926 1.41984C4.84509 1.42831 4.83097 1.43684 4.81692 1.44543C4.8057 1.45225 4.79447 1.45906 4.78333 1.46596C4.77075 1.47363 4.75818 1.48136 4.7456 1.48916C4.73302 1.49695 4.7202 1.50493 4.70713 1.51309L4.67317 1.53436C4.65881 1.54338 4.64448 1.55258 4.63019 1.56197L4.60065 1.58066C4.58377 1.5914 4.56702 1.60223 4.5504 1.61315L4.52776 1.62788C4.50321 1.6439 4.47889 1.65997 4.45477 1.67611C4.41409 1.70327 4.39403 1.74681 4.40241 1.78989C4.41778 1.86933 4.51229 1.89749 4.58215 1.91176C4.89055 1.97482 5.54601 2.04514 6.03038 2.04919C6.04934 2.04919 6.06821 2.04919 6.08717 2.04919C6.61792 2.04919 7.15079 1.98706 7.55721 1.87724C7.80184 1.81106 7.99897 1.72877 8.14263 1.63248C8.2863 1.5362 8.37851 1.42454 8.41606 1.3011C9.01051 1.25682 9.64609 1.22525 10.3035 1.21632C10.9048 1.20804 11.4595 1.21476 11.9677 1.23648C11.586 1.53546 10.9312 1.85515 10.095 2.1498C9.59234 2.32672 8.94774 2.54295 8.24516 2.76507C7.6417 2.80897 6.88804 2.92827 5.95206 3.0958C5.04314 3.25836 4.0929 3.47256 3.3443 3.68336C2.42121 3.94331 1.87849 4.17509 1.73133 4.37226L1.72939 4.37503L1.68053 4.44747C1.66405 4.47214 1.64758 4.4969 1.63138 4.52166C1.63098 4.52216 1.63061 4.52268 1.63028 4.52323C1.60221 4.56594 1.57312 4.61113 1.54128 4.6613L1.53318 4.67428L1.52214 4.69186C1.51023 4.71082 1.49842 4.72982 1.4867 4.74884L1.48578 4.75031L1.48514 4.75142L1.46544 4.78327L1.44069 4.82405C1.43967 4.82561 1.43875 4.82718 1.43783 4.82874L1.43075 4.84025L1.40829 4.8778C1.40397 4.88498 1.39973 4.89226 1.39541 4.89953L1.39053 4.90763L1.37534 4.93322L1.37277 4.93764L1.37231 4.93856C1.3504 4.97584 1.32804 5.0145 1.30466 5.05555C1.30282 5.05877 1.30098 5.062 1.29923 5.06476C1.29748 5.06752 1.29445 5.07304 1.29205 5.07737L1.28598 5.08786L1.27549 5.10627L1.25984 5.13407L1.25377 5.14503L1.24144 5.16721L1.23748 5.17439L1.22303 5.20127C1.22054 5.20587 1.21806 5.21047 1.21548 5.21508L1.2118 5.22189C1.20456 5.23514 1.19735 5.2484 1.19017 5.26165L1.17177 5.29562C1.16091 5.31615 1.14995 5.33658 1.139 5.35739L1.13771 5.35996C1.1125 5.40792 1.08728 5.45698 1.06059 5.51L1.04817 5.53449C1.0374 5.55603 1.02681 5.57757 1.01577 5.59994L1.00068 5.63077C0.990246 5.65219 0.979877 5.67367 0.969569 5.69521C0.96598 5.70276 0.962483 5.71031 0.958893 5.71776L0.955672 5.72467C0.937726 5.76241 0.919779 5.80097 0.902201 5.83927V5.83973C0.884715 5.87784 0.867229 5.91659 0.850202 5.95507L0.844864 5.96713V5.96777L0.842287 5.97366C0.832072 5.99677 0.82204 6.01969 0.812009 6.04325L0.799676 6.07225C0.789829 6.09526 0.780165 6.11827 0.770502 6.14138L0.759458 6.1678C0.7428 6.20784 0.726142 6.2488 0.710128 6.28893L0.709207 6.29105C0.692918 6.33192 0.67672 6.37316 0.661074 6.41385L0.656933 6.42452C0.647729 6.44929 0.638526 6.47423 0.62877 6.49908L0.619567 6.52495C0.610548 6.5495 0.601621 6.57404 0.592786 6.59859L0.583582 6.6228C0.568581 6.66459 0.553487 6.70749 0.538946 6.74983L0.537658 6.75351C0.522748 6.79714 0.508115 6.8405 0.49431 6.88238L0.49385 6.88367V6.88487L0.49339 6.88643C0.484831 6.91248 0.476456 6.93872 0.468081 6.96486L0.460442 6.98898C0.452404 7.01438 0.444489 7.03982 0.436697 7.06528L0.429611 7.08857C0.41645 7.13193 0.403289 7.1763 0.390405 7.22067L0.389208 7.22481C0.376139 7.27 0.363531 7.31502 0.351567 7.35865C0.351602 7.3588 0.351602 7.35896 0.351567 7.35911V7.36003C0.345983 7.38077 0.3404 7.40151 0.334817 7.42226L0.32276 7.46828L0.309784 7.51808C0.307207 7.5283 0.30463 7.53852 0.302145 7.54873L0.279321 7.64078C0.168397 8.09967 0.0901562 8.56585 0.0451882 9.0358C0.0443599 9.0439 0.0436237 9.052 0.0428874 9.0602C0.0410467 9.07925 0.0393902 9.09821 0.0376415 9.11727L0.0348806 9.14958C0.0335001 9.16624 0.0321196 9.18299 0.0308311 9.19965C0.0299108 9.21125 0.0288984 9.22276 0.0280701 9.23436C0.0267817 9.25129 0.0255852 9.26832 0.0243888 9.28526C0.0235605 9.29612 0.0227322 9.30689 0.0219959 9.31766C0.0202473 9.34334 0.0186827 9.36903 0.0171182 9.3948L0.0149094 9.43282C0.0140811 9.44773 0.0132528 9.46255 0.0125165 9.47737C0.0117802 9.49062 0.011136 9.50388 0.0105838 9.51713C0.00984756 9.53177 0.00920332 9.54641 0.00855909 9.56095C0.00788418 9.5739 0.00733197 9.58688 0.00690249 9.59989C0.00625825 9.61572 0.00570603 9.63146 0.00515383 9.6472C0.00515383 9.65889 0.00432556 9.67058 0.00395743 9.68227C0.00312913 9.70722 0.00248487 9.73207 0.00184064 9.75702C0.00184064 9.76374 0.00184064 9.77055 0.00184064 9.77727C0.00134979 9.8004 0.000920309 9.82351 0.000552176 9.84658C0.000552176 9.84925 0.000552176 9.85192 0.000552176 9.85468V9.85524C0.000552176 9.87107 0.000552199 9.88589 0 9.90006C0 9.90697 0 9.91387 0 9.92087C0 9.94342 0 9.96413 0 9.98401V9.98779C0.00184066 10.0585 0.0503421 10.2232 0.459245 10.2254H0.475996C0.768385 10.2254 1.46342 10.188 2.20539 10.1169C3.50094 9.99285 6.03213 9.66589 8.96302 9.28627L9.31274 9.24098C10.141 9.13384 11.3007 8.97404 12.5799 8.7938C12.7991 8.91991 13.0428 9.03047 13.2987 9.12776C11.9988 9.42232 10.6815 9.72342 9.42217 10.0268C8.41459 10.2696 7.43858 10.5182 6.52 10.7605C5.53524 10.8653 4.57681 11.0259 3.57264 11.2518C2.46888 11.5004 1.40332 11.827 0.572354 12.1723L0.550358 12.1815C0.362703 12.2589 0.286775 12.3802 0.324509 12.5419V12.5431L0.324969 12.5449L0.332424 12.5725V12.5737L0.3454 12.6227V12.6234C0.354788 12.6579 0.364359 12.6924 0.374115 12.7268C0.37706 12.7374 0.380097 12.748 0.383318 12.7586C0.391233 12.7862 0.399271 12.8138 0.407431 12.8414L0.414425 12.8654C0.424549 12.8992 0.434826 12.933 0.445256 12.9666L0.45446 12.9963C0.462651 13.0224 0.470934 13.0484 0.479309 13.0744L0.482346 13.0836C0.484555 13.0906 0.486855 13.0975 0.489064 13.1044C0.49339 13.1178 0.498268 13.131 0.502317 13.1444C0.508759 13.1639 0.515202 13.1835 0.521736 13.203L0.530387 13.2283C0.539345 13.2545 0.548364 13.2805 0.557445 13.3066L0.569317 13.3403C0.579993 13.3704 0.590761 13.4004 0.601621 13.4303L0.609996 13.4532C0.620488 13.4817 0.631133 13.5102 0.641931 13.5387C0.646441 13.5507 0.651135 13.5626 0.655552 13.5744C0.65997 13.5863 0.664756 13.5982 0.669265 13.6101L0.683346 13.6469L0.687948 13.6586C0.690157 13.6645 0.692457 13.6703 0.694758 13.6761C0.706999 13.7072 0.719515 13.7381 0.732032 13.769L0.744732 13.7999L0.747125 13.8058C0.756328 13.8273 0.76498 13.8488 0.773999 13.8702L0.777772 13.8794L0.78946 13.907C0.802222 13.937 0.815076 13.9668 0.828022 13.9966L0.839342 14.0223L0.844312 14.0334C0.853516 14.0536 0.862167 14.0737 0.871186 14.0939C0.877444 14.1078 0.88361 14.1215 0.889593 14.1355C0.8999 14.1582 0.9103 14.1809 0.920792 14.2034C0.929197 14.2218 0.937634 14.2399 0.946101 14.2575C0.955304 14.2772 0.964508 14.2968 0.973711 14.3163C0.980889 14.3314 0.988129 14.3464 0.995431 14.3614C1.00381 14.3788 1.01236 14.3962 1.02092 14.4135C1.03096 14.434 1.04117 14.4544 1.05139 14.4749C1.0616 14.4953 1.072 14.516 1.08249 14.5365C1.09065 14.5527 1.09891 14.5688 1.10725 14.5848C1.11489 14.5995 1.12244 14.6141 1.13008 14.6287L1.13238 14.6331C1.14023 14.6481 1.14808 14.6631 1.15594 14.678C1.16888 14.7026 1.18189 14.7268 1.19496 14.7508L1.22515 14.8061C1.23205 14.8185 1.23886 14.8309 1.24576 14.8429C1.25564 14.8609 1.26558 14.8787 1.27558 14.8965L1.28791 14.9183L1.29343 14.9275C1.31239 14.9609 1.33144 14.9941 1.35022 15.0263L1.36706 15.0552C1.3782 15.0743 1.38952 15.0934 1.40084 15.1124L1.41611 15.1378C1.43995 15.1776 1.46388 15.217 1.48744 15.255L1.4937 15.2652C1.5064 15.2857 1.51919 15.3061 1.53208 15.3265L1.54478 15.3466C1.54634 15.3491 1.548 15.3516 1.54956 15.3541C1.55113 15.3567 1.55343 15.36 1.55527 15.3633C1.57055 15.3873 1.58588 15.4112 1.60128 15.435C1.60221 15.4365 1.60313 15.438 1.60414 15.4395C1.61859 15.4618 1.63313 15.4839 1.64776 15.506L1.64877 15.5078C1.67592 15.549 1.70482 15.5918 1.73685 15.6388L1.74173 15.6457L1.75691 15.6681L1.77468 15.6936L1.78655 15.7107L1.79501 15.7229L1.81489 15.7513C1.81545 15.752 1.81591 15.7527 1.81637 15.7534L1.81793 15.7555C1.81793 15.7561 1.81876 15.7567 1.81913 15.7572C1.83128 15.7744 1.84333 15.7916 1.85594 15.8087L1.86956 15.8276L1.88327 15.8466L1.89349 15.8607C1.91273 15.8873 1.93224 15.9141 1.95202 15.9408L1.95791 15.9488L1.96905 15.9639C1.98285 15.9823 1.99672 16.0007 2.01065 16.0191C2.01746 16.0283 2.02436 16.0375 2.03117 16.0467C2.04534 16.0651 2.05955 16.0835 2.07378 16.1019L2.08888 16.1215C2.12146 16.1635 2.15404 16.205 2.1857 16.2444L2.19076 16.2509C2.20622 16.2702 2.22186 16.2895 2.23751 16.3087L2.25592 16.3308C2.2715 16.3498 2.28715 16.3688 2.30285 16.3878L2.31703 16.4047C2.36949 16.4676 2.42323 16.5304 2.4767 16.5914L2.49023 16.6068C2.50747 16.6264 2.52484 16.646 2.54232 16.6656L2.55429 16.6789C2.61162 16.7428 2.67025 16.8065 2.72851 16.8681L2.7343 16.8743C2.75345 16.8945 2.77271 16.9147 2.7921 16.9348L2.80131 16.9446C2.83342 16.9779 2.86573 17.0111 2.89886 17.0442L2.90236 17.0477C2.95178 17.0975 3.00175 17.1469 3.05182 17.195L3.05826 17.2011C3.06286 17.2056 3.06747 17.2103 3.07234 17.2146C3.08882 17.2304 3.10529 17.2462 3.12186 17.2619L3.13106 17.2705L3.13308 17.2725C3.14873 17.2873 3.16456 17.302 3.1803 17.3167C3.1895 17.3259 3.1987 17.3341 3.20837 17.3428C3.21923 17.3529 3.23018 17.3629 3.24104 17.3729L3.26442 17.3943C3.28328 17.4115 3.30215 17.4286 3.32083 17.4454L3.32138 17.4459L3.32442 17.4486L3.32654 17.4506C3.34495 17.4672 3.36381 17.4839 3.38314 17.5007L3.40559 17.5206L3.44167 17.552C3.45759 17.5658 3.47352 17.5796 3.48944 17.5933C3.49864 17.6014 3.50784 17.6095 3.51769 17.6175L3.52469 17.6234L3.52993 17.628L3.53278 17.6305C3.55119 17.6464 3.57033 17.6621 3.5892 17.6778L3.60061 17.6871L3.60227 17.6883C3.60632 17.6917 3.61055 17.6948 3.61488 17.6975C3.62825 17.7066 3.64272 17.714 3.65795 17.7195H3.65869H3.65942C3.69962 17.7322 3.74169 17.7381 3.78385 17.7368C3.87101 17.7368 3.9912 17.7205 4.16275 17.6881C4.70814 17.5848 7.38235 17.112 10.5013 16.6847C11.4316 16.5571 12.3801 16.4638 13.2461 16.3957C13.0567 16.6369 12.9588 16.8811 12.9546 17.1258C12.9468 17.5758 13.4741 17.9258 13.9238 18.1532C13.3283 18.3476 12.6997 18.5181 12.0689 18.6426C11.6547 18.7244 11.2492 18.7942 10.854 18.8538C10.8498 18.8264 10.8433 18.7993 10.8346 18.773C10.7582 18.5417 10.447 18.3804 9.95808 18.3184C9.48448 18.2585 8.87954 18.2947 8.25473 18.4204C7.41198 18.5899 6.87755 18.8492 6.73379 18.9246C6.51291 19.0404 6.42585 19.1278 6.43211 19.2266C6.43892 19.3338 6.55552 19.391 6.65777 19.4291L6.66026 19.43L6.70434 19.4454L6.71087 19.4477L6.75376 19.4625C6.82306 19.4863 6.89273 19.5093 6.96056 19.5309L6.96581 19.5326L7.01872 19.5491H7.01955C7.05738 19.5609 7.09603 19.5727 7.13515 19.5844L7.14076 19.5861L7.14509 19.5874L7.15208 19.5895L7.17638 19.5967C7.20058 19.6038 7.22479 19.6109 7.24899 19.6178L7.26307 19.6219C7.3259 19.6397 7.38897 19.6569 7.45229 19.6733L7.4615 19.6758L7.47576 19.6796L7.47806 19.6801C7.50371 19.6868 7.52939 19.6933 7.55509 19.6997L7.57773 19.7055L7.59136 19.7088L7.59817 19.7105L7.6648 19.7266L7.67639 19.7295L7.70465 19.7361C7.7098 19.7374 7.71505 19.7385 7.72029 19.7397L7.77607 19.7526L7.79383 19.7566L7.8173 19.7619C7.82742 19.7642 7.83764 19.7663 7.84785 19.7685C7.86166 19.7715 7.87546 19.7747 7.88945 19.7777L7.897 19.7794L7.93694 19.7878L7.98167 19.797L8.00735 19.8023H8.00928L8.0391 19.8084C8.06664 19.8138 8.09425 19.8192 8.12193 19.8244L8.17356 19.8336L8.21672 19.8415L8.24157 19.8459L8.25142 19.8477L8.27268 19.8514L8.29633 19.8555L8.36572 19.8671L8.38293 19.8698L8.41551 19.8751L8.44312 19.8795C8.45914 19.8821 8.47515 19.8845 8.49125 19.8869L8.50046 19.8883L8.51067 19.8898L8.52282 19.8916C8.5535 19.896 8.58387 19.9004 8.61394 19.9046L8.63556 19.9076L8.66888 19.9121L8.67477 19.9129L8.74094 19.9214L8.75116 19.9227L8.75788 19.9235L8.80104 19.9286C8.87577 19.9375 8.95056 19.9456 9.02542 19.9529C9.05045 19.9553 9.07548 19.9577 9.10061 19.9599L9.14432 19.9637L9.15417 19.9646L9.15822 19.965C9.18703 19.9674 9.21602 19.9696 9.24501 19.9717L9.25265 19.9724C9.50003 19.9908 9.75027 20 9.99811 20C10.7345 20.0002 11.4688 19.9196 12.1876 19.7595C12.884 19.6037 13.5617 19.3735 14.2089 19.0727C14.4658 18.9533 14.7176 18.8227 14.9643 18.6811C14.966 18.6803 14.9676 18.6796 14.9692 18.6787C15.1014 18.6029 15.2315 18.5241 15.3596 18.4423L15.3641 18.4395C15.3966 18.4188 15.429 18.3979 15.4613 18.3768L15.4828 18.3626C15.5095 18.3451 15.5359 18.3275 15.5623 18.3099L15.591 18.2906C15.6155 18.2741 15.6398 18.2574 15.664 18.2407C15.6865 18.2252 15.709 18.2095 15.7314 18.1937C15.7485 18.1817 15.7656 18.1699 15.7826 18.1578C15.8056 18.1414 15.8285 18.125 15.8512 18.1085L15.8736 18.0923C15.8986 18.0738 15.9236 18.0554 15.9484 18.037L15.959 18.0291C15.9759 18.0166 15.993 18.0041 16.0098 17.9914C16.5672 17.5712 17.0795 17.0942 17.5383 16.5682C17.5606 16.5425 17.5829 16.5167 17.605 16.4908L17.6113 16.4835C17.6325 16.4585 17.6536 16.4335 17.6745 16.4086L17.6829 16.3986C17.7037 16.3736 17.7244 16.3485 17.745 16.3233L17.7524 16.3141C17.7735 16.2884 17.7943 16.2625 17.8149 16.2366L17.819 16.2316C17.8961 16.135 17.9726 16.0353 18.0464 15.9354L18.0499 15.9306C18.1235 15.8308 18.1962 15.7281 18.2659 15.6263L18.2669 15.6249L18.2689 15.622C18.288 15.594 18.307 15.5658 18.3257 15.5376L18.3311 15.5295C18.3495 15.5017 18.3679 15.4739 18.3863 15.4459L18.3917 15.4375C18.4101 15.4092 18.4285 15.3807 18.4469 15.352L18.45 15.3472C18.6041 15.104 18.7495 14.8512 18.8825 14.5951L18.8836 14.593L18.8842 14.5919C18.9002 14.5612 18.916 14.5303 18.9316 14.4991L18.9346 14.4933C18.9504 14.462 18.9659 14.4307 18.9815 14.3991L18.9831 14.3956C19.0579 14.2433 19.129 14.0879 19.1961 13.9311C19.2008 13.9203 19.2053 13.9095 19.2101 13.8987C19.2165 13.8835 19.2228 13.8683 19.2291 13.8527C19.2367 13.8343 19.2443 13.8161 19.252 13.798C19.2587 13.7817 19.2652 13.7654 19.2717 13.7491C19.2783 13.7329 19.2856 13.7152 19.2924 13.6981C19.2999 13.6792 19.3073 13.6603 19.3147 13.6414C19.3199 13.6282 19.3251 13.615 19.3302 13.6018V13.6011C19.3314 13.5979 19.3327 13.5947 19.334 13.5919C19.334 13.5908 19.3348 13.5896 19.3352 13.5884C19.357 13.5229 19.3375 13.4759 19.3175 13.448C19.259 13.3671 19.1212 13.2881 18.1556 13.2881C18.1419 13.2881 16.7073 13.2952 14.0396 13.5511C12.9682 13.6539 11.7147 13.8002 10.4552 13.9614C10.7957 13.6945 11.0768 13.4472 11.2805 13.2009C11.422 13.0297 11.5227 12.8633 11.5863 12.6958C12.8886 12.3888 14.2483 12.0799 15.5307 11.8044C17.5665 11.3671 19.0687 11.0121 19.5492 10.8549C19.6396 10.8254 19.8181 10.7512 19.9134 10.6605L19.914 10.6598C19.9497 10.6253 19.9738 10.5805 19.9831 10.5316C19.9849 10.5256 19.9861 10.5195 19.9865 10.5132V10.5127V10.5114C19.9865 10.5084 19.9865 10.5055 19.9865 10.5022C19.9865 10.5013 19.9865 10.5004 19.9865 10.4995C19.9905 10.4182 19.9937 10.336 19.9957 10.2549V10.2396C19.9965 10.2049 19.9971 10.1706 19.9976 10.1364L19.9993 10.1228ZM7.51561 1.72683C7.10781 1.83729 6.56666 1.89768 6.03084 1.89317C5.61172 1.88967 5.04286 1.83324 4.71661 1.7781C5.22896 1.68072 6.55727 1.44921 8.24056 1.31509C8.12156 1.53261 7.74818 1.66405 7.51561 1.72683ZM10.1465 2.29754C11.3631 1.86923 11.9319 1.49266 12.1958 1.24817C13.3409 1.30892 14.2315 1.44967 14.8547 1.66921C15.075 1.74681 15.211 1.83407 15.2375 1.91489C15.2422 1.93248 15.2455 1.95043 15.2473 1.96856V1.97187C15.2473 1.97371 15.2473 1.97546 15.2478 1.97748C15.2605 2.16297 15.173 2.45725 14.684 2.80594C14.6729 2.81385 14.6617 2.82177 14.6504 2.82969L14.6391 2.83742L14.6154 2.85362L14.6016 2.86282L14.5793 2.87774L14.5642 2.88759L14.5419 2.90222L14.5261 2.91235L14.503 2.92698L14.487 2.93711L14.4624 2.95239L14.4469 2.96159L14.4187 2.97872L14.4057 2.98663C14.3918 2.99504 14.3777 3.00345 14.3632 3.01185L14.3595 3.01406C14.3464 3.02173 14.3331 3.02944 14.3196 3.03717L14.303 3.04637L14.2748 3.06248L14.2564 3.07251C14.2472 3.07776 14.238 3.0831 14.228 3.08835L14.2089 3.09903L14.1807 3.11449L14.1606 3.12535C14.1514 3.1306 14.1413 3.13575 14.1315 3.141L14.1114 3.15168L14.0803 3.16815L14.0612 3.17819L14.0255 3.1966L14.0098 3.20461C13.9925 3.21357 13.9751 3.22249 13.9574 3.23139C13.1575 3.63595 11.9956 4.07752 10.5039 4.54394C10.3308 4.59819 10.1574 4.65204 9.98357 4.70549C10.0527 4.61365 10.1134 4.51573 10.165 4.41295C10.3122 4.11563 10.3398 3.82199 10.2484 3.54031C10.1635 3.2788 10.0124 3.08862 9.78644 2.95892C9.57403 2.83696 9.29296 2.76875 8.92703 2.75043C8.88918 2.74859 8.85049 2.74724 8.81098 2.74638C9.31274 2.58483 9.7695 2.4301 10.1465 2.29736V2.29754ZM9.29056 9.0857L8.94084 9.13098C6.01133 9.50995 3.48134 9.83729 2.18836 9.96109C1.43691 10.033 0.735805 10.0704 0.458141 10.0688C0.235697 10.0676 0.158849 10.0136 0.154432 9.98595C0.157285 9.97021 0.193546 9.87852 0.633004 9.63772C0.975275 9.45021 1.51781 9.19523 2.29172 8.85824C4.01844 8.10619 5.83785 7.26181 7.06014 6.68585C7.12272 6.6564 7.18411 6.62703 7.24476 6.59776C7.62725 6.54756 8.02431 6.4958 8.43594 6.44247C9.83742 6.26123 11.2153 6.05826 12.5535 5.85869C12.2556 6.04426 12.0236 6.24954 11.8622 6.47064C11.6165 6.80727 11.5267 7.18863 11.5953 7.60479C11.6672 8.04056 11.9602 8.38722 12.3713 8.66521C11.1661 8.83412 10.0786 8.98361 9.29066 9.08551L9.29056 9.0857ZM14.1436 18.9365C13.5066 19.2326 12.8396 19.4592 12.1541 19.6125C11.4465 19.7701 10.7237 19.8495 9.99876 19.8492C9.84911 19.8492 9.69855 19.8456 9.5478 19.8389C9.60587 19.8164 9.66919 19.7929 9.73186 19.7701C9.98118 19.6786 10.2914 19.5646 10.5189 19.4155C10.7051 19.2935 10.8151 19.1603 10.8483 19.0176C11.2549 18.9567 11.6729 18.8851 12.0992 18.8009C12.748 18.6727 13.4397 18.4856 14.1257 18.255C14.213 18.295 14.2925 18.3294 14.3582 18.3578C14.4042 18.3778 14.444 18.3946 14.4721 18.408C14.6595 18.4951 14.7574 18.5558 14.8079 18.5959C14.5908 18.7178 14.3694 18.8313 14.1437 18.9364L14.1436 18.9365ZM14.0549 13.7127C16.2873 13.4986 17.8015 13.4504 18.1559 13.4504C18.5269 13.4504 18.7928 13.4617 18.9686 13.4848C19.131 13.5061 19.1768 13.5336 19.1878 13.5426V13.5436L19.1853 13.55C19.1293 13.6778 18.9762 13.7442 18.6888 13.8596C18.6144 13.8894 18.4311 13.9504 18.1776 14.0345C17.6044 14.225 16.645 14.5438 15.6282 14.9408C14.8142 15.2588 14.1749 15.5944 13.7281 15.9373C13.6097 16.0272 13.498 16.1257 13.3939 16.2318C12.4827 16.301 11.471 16.3983 10.4803 16.5341C7.35814 16.9621 4.68016 17.4355 4.13395 17.5389C4.09152 17.5469 4.05323 17.5537 4.01844 17.5594C4.57874 17.3462 5.29651 17.0531 6.51089 16.4517C7.80064 15.8129 8.31952 15.5388 9.75045 14.4944C9.91084 14.3774 10.0633 14.2647 10.2078 14.1566C11.5552 13.9823 12.9093 13.8224 14.055 13.7125L14.0549 13.7127ZM19.5009 10.7119C18.7961 10.942 16.259 11.4936 15.4982 11.6571C14.2439 11.9266 12.9155 12.2278 11.6391 12.5285C11.6866 12.3195 11.6793 12.105 11.617 11.8742C11.5653 11.6826 11.4576 11.5041 11.2971 11.3438C11.1406 11.1873 10.9364 11.0513 10.6912 10.9402C10.1834 10.7101 9.52755 10.5978 8.79469 10.6158C8.33452 10.6272 7.88973 10.6477 7.45423 10.6781C8.10186 10.5114 8.77223 10.3437 9.45714 10.1786C10.7931 9.85643 12.1949 9.53729 13.5719 9.2257C14.3317 9.48096 15.1582 9.63413 15.7587 9.74542C15.8669 9.76549 15.969 9.78436 16.0605 9.80203C16.4465 9.8765 16.9724 9.96118 17.5291 10.0506C18.3801 10.1877 19.2601 10.3295 19.7498 10.4519C19.8193 10.4693 19.8294 10.4908 19.8305 10.5038C19.8279 10.5224 19.8191 10.5396 19.8056 10.5527C19.7437 10.6118 19.6025 10.6786 19.5008 10.7119H19.5009Z",\n fill: "#fff"\n }\n )\n }\n), BV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n color: "transparent",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A("mask", { id: "path-1-inside-1", fill: "white", children: /* @__PURE__ */ A("path", { d: "M159.994 80.9826C159.998 80.6571 160 80.338 160 80.0253C160 79.8122 160 79.5994 160 79.3868C160 79.3132 160 79.2395 160 79.1711C160 79.0319 160 78.8927 159.995 78.7542C159.995 78.6629 159.995 78.5724 159.99 78.4818C159.99 78.3632 159.985 78.2447 159.982 78.1254C159.982 78.0245 159.977 77.9229 159.975 77.8212C159.973 77.7196 159.968 77.6099 159.965 77.5038L159.954 77.1702C159.954 77.0797 159.948 76.9891 159.944 76.8985C159.94 76.7741 159.934 76.6496 159.929 76.5252C159.929 76.4663 159.924 76.4073 159.921 76.3477C159.888 75.6201 159.846 74.8935 159.793 74.1679V74.1385C159.779 73.9514 159.765 73.7637 159.75 73.5766V73.5494C159.415 69.3605 158.75 65.2047 157.762 61.1204L157.726 60.9665L157.684 60.8008C157.637 60.6071 157.588 60.4149 157.536 60.222L157.514 60.1314C157.509 60.1137 157.505 60.096 157.5 60.0784C157.456 59.9031 157.41 59.7283 157.363 59.554C157.363 59.5467 157.36 59.5393 157.358 59.5312C157.319 59.3839 157.28 59.2381 157.24 59.0938L157.203 58.9524C157.196 58.9296 157.19 58.9067 157.184 58.8839C157.163 58.8103 157.143 58.7307 157.121 58.6542C157.089 58.5378 157.056 58.421 157.023 58.3036C157.015 58.2771 157.009 58.2506 157.001 58.2241L156.952 58.0518C156.952 58.0498 156.952 58.0478 156.952 58.0459C156.878 57.797 156.809 57.5496 156.735 57.3014C156.734 57.2947 156.732 57.288 156.73 57.2815L156.656 57.0437L156.637 56.984V56.9752C156.585 56.8024 156.533 56.6288 156.479 56.4545C156.475 56.4413 156.471 56.4273 156.467 56.414L156.445 56.3404C156.437 56.3154 156.429 56.2903 156.422 56.2668C156.406 56.2167 156.391 56.1666 156.375 56.1195C156.332 55.983 156.289 55.847 156.245 55.7115C156.209 55.5981 156.173 55.4847 156.136 55.3713L156.075 55.182C156.061 55.1386 156.046 55.0951 156.032 55.0517C155.992 54.9294 155.951 54.8067 155.91 54.6835L155.903 54.6599C155.883 54.5995 155.863 54.5392 155.842 54.4788L155.803 54.3617L155.734 54.1599V54.1496C155.734 54.1452 155.73 54.14 155.729 54.1349C155.669 53.9586 155.608 53.7829 155.547 53.6076L155.531 53.5627C155.503 53.4824 155.475 53.4014 155.446 53.3211L155.398 53.1849C155.357 53.071 155.316 52.9569 155.275 52.8425C155.247 52.7688 155.22 52.69 155.192 52.6142C155.173 52.5604 155.153 52.5074 155.133 52.4537L155.124 52.4301C155.118 52.4102 155.11 52.3903 155.103 52.3712L155.098 52.3565C155.077 52.3005 155.057 52.2453 155.035 52.1893L154.99 52.0678C154.977 52.0317 154.963 51.9941 154.95 51.9603L154.891 51.8012C154.881 51.7747 154.871 51.7482 154.861 51.7224L154.75 51.4279L154.739 51.3977C154.728 51.3704 154.717 51.3424 154.706 51.3152C154.675 51.2342 154.644 51.1539 154.613 51.0736C154.589 51.0118 154.566 50.9499 154.539 50.8881L154.513 50.8203L154.414 50.5685C154.382 50.4875 154.349 50.4065 154.316 50.3255L154.242 50.1495L154.207 50.0604C154.197 50.0368 154.188 50.0125 154.178 49.9867L154.136 49.8821L154.032 49.6296L153.977 49.4955C153.946 49.4219 153.915 49.3483 153.885 49.2746C153.848 49.1862 153.811 49.0971 153.775 49.0095L153.698 48.8276C153.689 48.8077 153.68 48.7871 153.672 48.7665C153.664 48.7459 153.646 48.7054 153.633 48.6752C153.58 48.55 153.526 48.4253 153.472 48.3011C153.454 48.2584 153.435 48.2164 153.417 48.1744L153.401 48.1361L153.284 47.8666L153.2 47.6781L153.119 47.4969L153.113 47.4829L152.989 47.2053C152.962 47.1442 152.934 47.0838 152.907 47.0234C152.899 47.0065 152.891 46.9896 152.884 46.9726C152.877 46.9557 152.863 46.927 152.852 46.9041L152.837 46.8688L152.702 46.5742L152.656 46.4755L152.641 46.4417C152.634 46.4269 152.628 46.4122 152.62 46.3975L152.598 46.3489L152.437 46.005C152.417 45.9623 152.397 45.9196 152.377 45.8776L152.313 45.7414C152.288 45.6913 152.265 45.6405 152.239 45.5897L152.189 45.4858C152.146 45.396 152.104 45.3061 152.06 45.2163C151.994 45.0813 151.928 44.9465 151.862 44.812C151.832 44.7494 151.801 44.6868 151.77 44.6242C151.763 44.608 151.755 44.5918 151.746 44.5756C151.696 44.4733 151.645 44.3716 151.594 44.27L151.567 44.2163C151.559 44.2008 151.551 44.1853 151.544 44.1706L151.414 43.9121C151.414 43.9055 151.407 43.8989 151.403 43.8923L151.33 43.745L151.241 43.5712C151.214 43.5196 151.188 43.4674 151.161 43.4165L151.15 43.3944L151.086 43.2715C151.078 43.256 151.07 43.2413 151.062 43.2258L150.847 42.812C150.814 42.7501 150.782 42.6882 150.749 42.6264L150.665 42.4703C150.607 42.3623 150.55 42.2542 150.492 42.1462L150.409 41.9916C150.383 41.943 150.356 41.8951 150.331 41.8443C150.176 41.5606 150.02 41.2778 149.862 40.996L149.772 40.8347L149.734 40.767C149.67 40.6536 149.605 40.5401 149.541 40.4267L149.497 40.3531L149.346 40.0887C149.34 40.0792 149.334 40.0689 149.329 40.0585L149.165 39.7787L149.099 39.6646L148.961 39.4289L148.955 39.4193L148.734 39.043C148.713 39.0087 148.689 38.9766 148.661 38.9473C147.899 37.8427 145.495 37.3906 143.589 37.2072C141.528 37.0076 137.988 36.9281 132.871 37.6807C126.694 38.5887 118.695 39.9098 111.603 42.0792C108.595 43.0005 105.923 44.0226 103.629 45.1287C91.8719 46.8835 79.7184 48.6973 67.3366 50.2989C65.3183 50.5601 63.3448 50.8166 61.4163 51.0685C67.679 47.8556 72.4456 44.8157 75.8986 41.8377C76.7807 41.0786 77.619 40.2699 78.4093 39.4157C80.4164 38.8005 82.4173 38.1815 84.4121 37.5585C96.4132 33.8028 105.77 30.2475 112.23 26.98C112.378 26.9064 112.517 26.8328 112.658 26.7591L112.785 26.6936L113.079 26.5426L113.235 26.4601L113.489 26.3269L113.653 26.2385C113.732 26.1965 113.812 26.1538 113.89 26.1111L114.053 26.0227L114.285 25.8961L114.441 25.8092L114.674 25.6788L114.821 25.5971L115.052 25.4653L115.19 25.3865C115.301 25.3231 115.41 25.2596 115.518 25.1957L115.548 25.1781C115.667 25.1089 115.782 25.0396 115.897 24.9704L116.004 24.9063L116.237 24.7642L116.365 24.6854L116.568 24.5595L116.7 24.4755L116.891 24.354L117.022 24.2701L117.208 24.1493L117.333 24.0668L117.518 23.9431L117.633 23.8695C117.7 23.8246 117.765 23.7796 117.83 23.734L117.924 23.6699C118.022 23.6036 118.116 23.5376 118.206 23.4718C120.625 21.7457 123.462 19.0026 123.238 15.7396C123.238 15.7153 123.235 15.6917 123.233 15.666V15.6373C123.095 14.1939 122.039 11.9994 117.913 9.56415L117.889 9.55015L117.751 9.46915L117.663 9.41908L117.569 9.36532L117.426 9.28431L117.374 9.25486L117.171 9.14219L117.145 9.1282L117.135 9.12304L117.122 9.11568C116.68 8.88543 116.239 8.65886 115.797 8.43598L115.767 8.42125C115.489 8.28207 115.21 8.14363 114.93 8.00813L114.888 7.98751L114.702 7.89767L114.408 7.75702H114.401L114.216 7.66938L114.159 7.64287L114.073 7.60163L113.86 7.50148L113.793 7.46982L113.581 7.37188L113.49 7.3299L113.471 7.32107L113.316 7.24743L113.243 7.21429L112.948 7.081L112.894 7.05596L112.785 7.00736L112.696 6.96686L112.384 6.82768L112.31 6.79454L112.281 6.78202L112.155 6.72605L111.823 6.57877L111.646 6.50513L111.476 6.43149L111.108 6.27317L110.822 6.15313L110.527 6.03015L110.344 5.95651L110.227 5.90791C110.092 5.85268 109.956 5.79819 109.821 5.74369L109.673 5.68552L109.265 5.52351L109.133 5.47196L108.702 5.3048L108.629 5.27608C108.39 5.18476 108.149 5.09419 107.908 5.00435H107.9C107.464 4.84234 107.026 4.68254 106.593 4.5301L106.566 4.52053L106.074 4.34895L106.013 4.32833C105.848 4.27187 105.684 4.21615 105.521 4.16117L105.487 4.14938L105.234 4.06543L105.013 3.99179L104.651 3.87397L104.38 3.78707L104.051 3.6825L103.734 3.58309L103.439 3.49178L102.906 3.3305L102.832 3.30841L102.808 3.30105L102.292 3.14935H102.281H102.274L102.253 3.14346L102.126 3.10737C101.227 2.84914 100.324 2.60638 99.4164 2.37907C84.4694 -1.33826 68.7698 -0.688327 54.181 4.25174L54.1582 4.25984C53.9911 4.31728 53.8232 4.37472 53.6561 4.43364L53.5265 4.47856C53.3571 4.53747 53.1885 4.59785 53.0199 4.65824L52.9073 4.698L52.3779 4.89094L52.3109 4.91524C47.8766 6.55097 43.5967 8.57844 39.522 10.9736L39.4808 10.9979C39.3475 11.076 39.2142 11.1555 39.0817 11.235L38.8741 11.3588C38.7607 11.4265 38.6478 11.4947 38.5354 11.5635C38.4456 11.618 38.3557 11.6725 38.2667 11.7277C38.166 11.7891 38.0654 11.8509 37.9648 11.9133C37.8642 11.9756 37.7616 12.0394 37.657 12.1047L37.3853 12.2748C37.2705 12.347 37.1559 12.4206 37.0415 12.4958L36.8052 12.6453C36.6702 12.7312 36.5362 12.8178 36.4032 12.9052L36.222 13.023C36.0257 13.1512 35.8311 13.2798 35.6382 13.4089C35.3128 13.6261 35.1523 13.9745 35.2192 14.3191C35.3422 14.9546 36.0984 15.1799 36.6572 15.2941C39.1244 15.7985 44.3681 16.3611 48.243 16.3935C48.3947 16.3935 48.5457 16.3935 48.6973 16.3935C52.9434 16.3935 57.2063 15.8965 60.4577 15.0179C62.4147 14.4885 63.9918 13.8301 65.1411 13.0598C66.2904 12.2896 67.0281 11.3963 67.3285 10.4088C72.0841 10.0546 77.1687 9.802 82.4278 9.73057C87.2381 9.6643 91.6761 9.71805 95.7417 9.89185C92.6877 12.2837 87.4499 14.8412 80.7602 17.1984C76.7387 18.6138 71.5819 20.3436 65.9613 22.1205C61.1336 22.4718 55.1043 23.4262 47.6165 24.7664C40.3451 26.0669 32.7432 27.7805 26.7544 29.4669C19.3697 31.5465 15.0279 33.4007 13.8506 34.9781L13.8352 35.0002L13.4442 35.5798C13.3124 35.7771 13.1806 35.9752 13.051 36.1733C13.0478 36.1773 13.0449 36.1815 13.0422 36.1858C12.8176 36.5275 12.585 36.8891 12.3302 37.2904L12.2654 37.3942L12.1771 37.5349C12.0819 37.6866 11.9874 37.8385 11.8936 37.9907L11.8863 38.0025L11.8811 38.0113L11.7236 38.2661L11.5255 38.5924C11.5174 38.6049 11.51 38.6174 11.5027 38.6299L11.446 38.722L11.2663 39.0224C11.2317 39.0799 11.1979 39.138 11.1633 39.1962L11.1242 39.261L11.0027 39.4657L10.9821 39.5011L10.9785 39.5085C10.8032 39.8067 10.6243 40.116 10.4373 40.4444C10.4226 40.4702 10.4078 40.496 10.3939 40.5181C10.3799 40.5401 10.3556 40.5843 10.3364 40.6189L10.2878 40.7029L10.2039 40.8502L10.0787 41.0726L10.0301 41.1602L9.93148 41.3377L9.89982 41.3951L9.78423 41.6101C9.76435 41.647 9.74447 41.6838 9.72386 41.7206L9.6944 41.7751C9.63649 41.8811 9.57881 41.9872 9.52138 42.0932L9.37413 42.365C9.28725 42.5292 9.19963 42.6927 9.11202 42.8591L9.10171 42.8797C8.89997 43.2634 8.69824 43.6559 8.48472 44.08L8.38533 44.2759C8.29918 44.4482 8.21451 44.6206 8.12616 44.7995L8.00541 45.0462C7.92197 45.2175 7.83902 45.3894 7.75656 45.5617C7.72784 45.6221 7.69986 45.6824 7.67115 45.7421L7.64538 45.7973C7.50181 46.0992 7.35823 46.4078 7.21761 46.7141V46.7178C7.07772 47.0227 6.93783 47.3327 6.80162 47.6405L6.75892 47.737V47.7422L6.7383 47.7893C6.65657 47.9741 6.57632 48.1575 6.49607 48.346L6.39741 48.578C6.31863 48.7621 6.24132 48.9462 6.16401 49.131L6.07566 49.3424C5.9424 49.6627 5.80913 49.9904 5.68102 50.3115L5.67366 50.3284C5.54334 50.6554 5.41376 50.9853 5.28859 51.3108L5.25546 51.3962C5.18184 51.5943 5.10821 51.7938 5.03016 51.9927L4.95654 52.1996C4.88438 52.396 4.81297 52.5923 4.74228 52.7887L4.66866 52.9824C4.54865 53.3167 4.4279 53.6599 4.31157 53.9986L4.30126 54.0281C4.18199 54.3771 4.06492 54.724 3.95448 55.059L3.9508 55.0694V55.0789L3.94712 55.0914C3.87865 55.2999 3.81165 55.5097 3.74465 55.7189L3.68354 55.9118C3.61923 56.1151 3.55592 56.3185 3.49358 56.5223L3.43689 56.7086C3.3316 57.0554 3.22631 57.4104 3.12324 57.7653L3.11367 57.7985C3.00912 58.16 2.90825 58.5201 2.81253 58.8692C2.81282 58.8704 2.81282 58.8717 2.81253 58.8729V58.8802C2.76787 59.0462 2.7232 59.2121 2.67853 59.378L2.58208 59.7462L2.47827 60.1446C2.45765 60.2264 2.43704 60.3081 2.41716 60.3899L2.23457 61.1263C1.34717 64.7973 0.72125 68.5268 0.361506 72.2864C0.35488 72.3512 0.348989 72.416 0.343099 72.4816C0.328374 72.634 0.315121 72.7857 0.301132 72.9381L0.279045 73.1966C0.268001 73.3299 0.256956 73.4639 0.246649 73.5972C0.239286 73.69 0.231188 73.7821 0.224561 73.8748C0.214253 74.0103 0.204682 74.1466 0.19511 74.2821C0.188484 74.369 0.181857 74.4551 0.175967 74.5413C0.161978 74.7467 0.149462 74.9522 0.136945 75.1584L0.119275 75.4625C0.112649 75.5818 0.106022 75.7004 0.100132 75.8189C0.094242 75.925 0.0890882 76.031 0.0846706 76.1371C0.0787805 76.2542 0.0736265 76.3713 0.0684727 76.4876C0.0630734 76.5912 0.0586558 76.695 0.0552199 76.7991C0.050066 76.9258 0.0456483 77.0517 0.0412307 77.1776C0.0412307 77.2711 0.0346045 77.3647 0.0316594 77.4582C0.025033 77.6577 0.0198789 77.8566 0.0147251 78.0561C0.0147251 78.1099 0.0147251 78.1644 0.0147251 78.2182C0.0107983 78.4032 0.00736247 78.5881 0.00441741 78.7727C0.00441741 78.794 0.00441741 78.8154 0.00441741 78.8375V78.8419C0.00441741 78.9685 0.00441759 79.0871 0 79.2005C0 79.2557 0 79.311 0 79.3669C0 79.5474 0 79.713 0 79.8721V79.9023C0.0147253 80.4679 0.402737 81.7853 3.67396 81.803H3.80796C6.14708 81.803 11.7074 81.504 17.6431 80.9355C28.0075 79.9428 48.257 77.3271 71.7041 74.2902L74.5019 73.9279C81.1283 73.0707 90.4053 71.7923 100.639 70.3504C102.392 71.3593 104.342 72.2437 106.39 73.0221C95.9906 75.3786 85.4517 77.7874 75.3774 80.2145C67.3167 82.1564 59.5086 84.1454 52.16 86.0844C44.2819 86.9224 36.6145 88.2074 28.5811 90.0146C19.7511 92.0029 11.2266 94.6156 4.57883 97.3786L4.40287 97.4522C2.90162 98.0715 2.2942 99.0414 2.59607 100.335V100.345L2.59975 100.359L2.65939 100.58V100.589L2.7632 100.982V100.987C2.8383 101.263 2.91487 101.539 2.99292 101.815C3.01648 101.899 3.04078 101.984 3.06654 102.069C3.12986 102.29 3.19416 102.511 3.25945 102.731L3.3154 102.923C3.39639 103.194 3.47861 103.464 3.56205 103.733L3.63568 103.97C3.70121 104.179 3.76747 104.387 3.83447 104.595L3.85877 104.669C3.87644 104.725 3.89484 104.78 3.91251 104.835C3.94712 104.942 3.98614 105.048 4.01854 105.155C4.07007 105.311 4.12161 105.468 4.17389 105.624L4.2431 105.827C4.31476 106.036 4.38691 106.244 4.45956 106.453L4.55454 106.723C4.63994 106.963 4.72609 107.203 4.81297 107.442L4.87997 107.626C4.9639 107.854 5.04906 108.082 5.13545 108.31C5.17153 108.405 5.20908 108.5 5.24442 108.595C5.27976 108.69 5.31804 108.785 5.35412 108.88L5.46677 109.175L5.50358 109.269C5.52125 109.316 5.53966 109.362 5.55807 109.409C5.65599 109.657 5.75612 109.905 5.85625 110.152L5.95786 110.399L5.977 110.446C6.05063 110.618 6.11984 110.791 6.19199 110.962L6.22218 111.035L6.31568 111.256C6.41778 111.496 6.52061 111.734 6.62418 111.973L6.71474 112.179L6.7545 112.267C6.82812 112.428 6.89733 112.59 6.96949 112.751C7.01955 112.862 7.06888 112.972 7.11674 113.084C7.1992 113.266 7.2824 113.447 7.36633 113.627C7.43358 113.775 7.50107 113.919 7.56881 114.06C7.64243 114.217 7.71606 114.374 7.78969 114.53C7.84712 114.651 7.90504 114.771 7.96345 114.891C8.03045 115.03 8.09892 115.169 8.16739 115.308C8.24764 115.472 8.32937 115.635 8.41109 115.799C8.49282 115.962 8.57602 116.128 8.65995 116.292C8.72523 116.421 8.79125 116.55 8.85801 116.678C8.91912 116.796 8.97949 116.913 9.0406 117.029L9.05901 117.065C9.12183 117.185 9.18466 117.305 9.24749 117.424C9.35106 117.621 9.45512 117.815 9.55967 118.007L9.80116 118.449C9.85638 118.548 9.91087 118.647 9.96609 118.743C10.0451 118.887 10.1246 119.03 10.2046 119.172L10.3033 119.346L10.3475 119.42C10.4991 119.687 10.6516 119.953 10.8017 120.211L10.9365 120.441C11.0256 120.594 11.1161 120.747 11.2067 120.899L11.3289 121.103C11.5196 121.421 11.711 121.736 11.8995 122.04L11.9496 122.122C12.0512 122.286 12.1535 122.449 12.2566 122.612L12.3582 122.773C12.3707 122.793 12.384 122.812 12.3965 122.833C12.409 122.854 12.4274 122.88 12.4421 122.907C12.5644 123.098 12.6871 123.289 12.8103 123.48C12.8176 123.492 12.825 123.504 12.8331 123.516C12.9487 123.695 13.065 123.871 13.1821 124.048L13.1902 124.062C13.4074 124.392 13.6386 124.734 13.8948 125.11L13.9338 125.166L14.0553 125.345L14.1974 125.549L14.2924 125.686L14.3601 125.783L14.5192 126.011C14.5236 126.016 14.5273 126.022 14.5309 126.027L14.5434 126.044C14.5434 126.049 14.5501 126.053 14.553 126.058C14.6502 126.195 14.7467 126.332 14.8475 126.469L14.9565 126.621L15.0662 126.773L15.1479 126.885C15.3018 127.098 15.4579 127.313 15.6162 127.526L15.6633 127.59L15.7524 127.711C15.8628 127.858 15.9738 128.006 16.0852 128.153C16.1397 128.226 16.1949 128.3 16.2494 128.374C16.3628 128.521 16.4764 128.668 16.5903 128.816L16.711 128.972C16.9716 129.308 17.2323 129.64 17.4856 129.956L17.5261 130.007C17.6497 130.162 17.7749 130.316 17.9001 130.47L18.0473 130.646C18.172 130.798 18.2972 130.95 18.4228 131.102L18.5362 131.238C18.9559 131.741 19.3859 132.244 19.8136 132.731L19.9219 132.855C20.0598 133.011 20.1987 133.168 20.3386 133.325L20.4343 133.431C20.893 133.942 21.362 134.452 21.8281 134.945L21.8744 134.994C22.0276 135.156 22.1817 135.318 22.3368 135.479L22.4104 135.557C22.6674 135.823 22.9258 136.089 23.1909 136.353L23.2189 136.381C23.6142 136.78 24.014 137.175 24.4146 137.56L24.4661 137.609C24.5029 137.645 24.5397 137.683 24.5787 137.716C24.7105 137.843 24.8423 137.97 24.9749 138.095L25.0485 138.164L25.0647 138.18C25.1898 138.298 25.3165 138.416 25.4424 138.534C25.516 138.608 25.5896 138.673 25.6669 138.742C25.7538 138.823 25.8414 138.904 25.9283 138.983L26.1153 139.155C26.2663 139.292 26.4172 139.429 26.5667 139.563L26.5711 139.567L26.5954 139.589L26.6123 139.605C26.7596 139.738 26.9105 139.871 27.0651 140.006L27.2448 140.165L27.5334 140.416C27.6608 140.527 27.7881 140.637 27.9155 140.746C27.9891 140.811 28.0627 140.876 28.1415 140.94L28.1975 140.988L28.2395 141.024L28.2623 141.044C28.4095 141.171 28.5627 141.297 28.7136 141.423L28.8049 141.496L28.8182 141.507C28.8506 141.533 28.8844 141.558 28.919 141.58C29.026 141.653 29.1418 141.712 29.2636 141.756H29.2695H29.2754C29.597 141.858 29.9336 141.905 30.2708 141.894C30.9681 141.894 31.9296 141.764 33.302 141.505C37.6651 140.678 59.0588 136.896 84.0101 133.478C91.453 132.457 99.0409 131.71 105.969 131.165C104.453 133.095 103.671 135.048 103.637 137.007C103.574 140.606 107.793 143.407 111.39 145.226C106.627 146.781 101.598 148.145 96.5509 149.141C93.2377 149.795 89.9937 150.354 86.8322 150.83C86.7985 150.611 86.7466 150.395 86.6768 150.184C86.0657 148.334 83.5757 147.043 79.6646 146.547C75.8758 146.068 71.0363 146.357 66.0378 147.363C59.2959 148.719 55.0204 150.794 53.8703 151.397C52.1033 152.323 51.4068 153.023 51.4568 153.813C51.5113 154.671 52.4442 155.128 53.2622 155.433L53.282 155.44L53.6347 155.563L53.687 155.582L54.0301 155.7C54.5845 155.89 55.1418 156.074 55.6845 156.247L55.7264 156.261L56.1498 156.393H56.1564C56.459 156.487 56.7683 156.582 57.0812 156.675L57.1261 156.689L57.1607 156.699L57.2166 156.716L57.411 156.774C57.6047 156.831 57.7983 156.887 57.9919 156.942L58.1046 156.975C58.6072 157.118 59.1118 157.255 59.6183 157.387L59.692 157.406L59.8061 157.437L59.8245 157.441C60.0297 157.494 60.2351 157.546 60.4408 157.598L60.6219 157.644L60.7308 157.671L60.7853 157.684L61.3184 157.813L61.4112 157.836L61.6372 157.889C61.6784 157.899 61.7204 157.908 61.7623 157.917L62.2085 158.021L62.3506 158.053L62.5384 158.095C62.6194 158.113 62.7011 158.13 62.7828 158.148C62.8933 158.172 63.0037 158.197 63.1156 158.222L63.176 158.235L63.4955 158.303L63.8533 158.376L64.0588 158.418H64.0742L64.3128 158.467C64.5332 158.51 64.754 158.553 64.9754 158.595L65.3885 158.669L65.7338 158.732L65.9326 158.767L66.0113 158.781L66.1814 158.811L66.3706 158.844L66.9258 158.937L67.0635 158.959L67.3241 159.001L67.545 159.036C67.6731 159.057 67.8012 159.076 67.93 159.095L68.0037 159.106L68.0854 159.119L68.1826 159.133C68.428 159.168 68.671 159.203 68.9115 159.237L69.0845 159.261L69.351 159.297L69.3982 159.303L69.9275 159.371L70.0093 159.381L70.063 159.388L70.4083 159.429C71.0062 159.5 71.6045 159.565 72.2033 159.623C72.4036 159.642 72.6039 159.661 72.8048 159.679L73.1546 159.71L73.2334 159.716L73.2658 159.72C73.4962 159.739 73.7281 159.757 73.9601 159.774L74.0212 159.779C76.0002 159.926 78.0022 160 79.9849 160C85.8763 160.002 91.7501 159.357 97.5007 158.076C103.072 156.83 108.494 154.988 113.671 152.581C115.726 151.626 117.741 150.582 119.715 149.449C119.728 149.442 119.741 149.437 119.754 149.43C120.811 148.823 121.852 148.193 122.877 147.539L122.913 147.516C123.173 147.35 123.432 147.183 123.69 147.014L123.863 146.901C124.076 146.761 124.287 146.62 124.498 146.479L124.728 146.325C124.924 146.192 125.119 146.059 125.312 145.926C125.492 145.802 125.672 145.676 125.851 145.55C125.988 145.454 126.125 145.359 126.261 145.262C126.445 145.131 126.628 145 126.81 144.868L126.989 144.738C127.189 144.591 127.389 144.443 127.587 144.296L127.672 144.233C127.808 144.133 127.944 144.033 128.079 143.931C132.538 140.57 136.636 136.754 140.306 132.545C140.485 132.34 140.663 132.134 140.84 131.926L140.89 131.868C141.06 131.668 141.229 131.468 141.396 131.269L141.463 131.189C141.629 130.989 141.795 130.788 141.96 130.587L142.019 130.513C142.188 130.307 142.355 130.1 142.52 129.893L142.552 129.852C143.169 129.08 143.781 128.282 144.371 127.483L144.399 127.445C144.988 126.646 145.57 125.825 146.127 125.011L146.135 124.999L146.151 124.976C146.304 124.752 146.456 124.527 146.606 124.301L146.649 124.236C146.796 124.014 146.943 123.791 147.09 123.567L147.134 123.5C147.281 123.273 147.428 123.045 147.576 122.816L147.6 122.778C148.833 120.832 149.996 118.809 151.06 116.761L151.069 116.744L151.074 116.735C151.202 116.489 151.328 116.242 151.453 115.993L151.477 115.946C151.603 115.696 151.727 115.445 151.852 115.193L151.865 115.165C152.463 113.946 153.032 112.703 153.569 111.449C153.606 111.362 153.642 111.276 153.681 111.19C153.732 111.068 153.782 110.946 153.833 110.822C153.894 110.674 153.955 110.529 154.016 110.384C154.069 110.254 154.122 110.123 154.174 109.993C154.226 109.863 154.285 109.721 154.339 109.585C154.399 109.433 154.458 109.283 154.518 109.131C154.559 109.026 154.601 108.92 154.641 108.814V108.809C154.651 108.783 154.661 108.757 154.672 108.735C154.672 108.727 154.678 108.717 154.681 108.707C154.856 108.183 154.7 107.808 154.54 107.584C154.072 106.937 152.969 106.305 145.245 106.305C145.135 106.305 133.659 106.362 112.317 108.408C103.746 109.231 93.7177 110.402 83.6412 111.691C86.3654 109.556 88.6147 107.578 90.244 105.607C91.3757 104.237 92.1819 102.907 92.6906 101.567C103.109 99.1106 113.986 96.6392 124.245 94.4352C140.532 90.9365 152.55 88.097 156.394 86.8392C157.117 86.6028 158.544 86.0093 159.307 85.2839L159.312 85.2788C159.598 85.002 159.791 84.6437 159.865 84.253C159.879 84.2051 159.889 84.1557 159.892 84.1057V84.1013V84.091C159.892 84.0674 159.892 84.0438 159.892 84.0173C159.892 84.0102 159.892 84.0031 159.892 83.996C159.924 83.3457 159.949 82.6881 159.965 82.0393V81.9171C159.972 81.6395 159.976 81.3648 159.981 81.0916L159.994 80.9826ZM60.1249 13.8147C56.8625 14.6983 52.5333 15.1814 48.2467 15.1453C44.8938 15.1174 40.3429 14.6659 37.7329 14.2248C41.8316 13.4457 52.4582 11.5937 65.9245 10.5207C64.9725 12.2608 61.9854 13.3124 60.1249 13.8147ZM81.1718 18.3804C90.9045 14.9539 95.4553 11.9413 97.5662 9.98537C106.728 10.4714 113.852 11.5974 118.838 13.3537C120.6 13.9745 121.688 14.6726 121.9 15.3191C121.938 15.4598 121.964 15.6034 121.979 15.7484V15.775C121.979 15.7897 121.979 15.8037 121.982 15.8199C122.084 17.3037 121.384 19.658 117.472 22.4475C117.384 22.5108 117.294 22.5742 117.203 22.6375L117.113 22.6993L116.923 22.829L116.813 22.9026L116.635 23.0219L116.514 23.1007L116.335 23.2178L116.209 23.2988L116.024 23.4159L115.896 23.4969L115.699 23.6191L115.575 23.6928L115.35 23.8297L115.245 23.8931C115.134 23.9603 115.021 24.0276 114.906 24.0948L114.876 24.1125C114.771 24.1739 114.665 24.2355 114.557 24.2973L114.424 24.371L114.198 24.4998L114.051 24.5801C113.978 24.6221 113.904 24.6648 113.824 24.7068L113.671 24.7922L113.445 24.9159L113.285 25.0028C113.211 25.0448 113.13 25.086 113.052 25.128L112.892 25.2134L112.643 25.3452L112.49 25.4255L112.204 25.5728L112.079 25.6369C111.94 25.7085 111.8 25.78 111.659 25.8511C105.26 29.0876 95.9648 32.6202 84.0314 36.3515C82.6468 36.7855 81.2591 37.2163 79.8686 37.6439C80.4219 36.9092 80.9076 36.1259 81.3198 35.3036C82.4978 32.925 82.7187 30.5759 81.9868 28.3225C81.308 26.2304 80.099 24.709 78.2915 23.6714C76.5922 22.6957 74.3436 22.15 71.4163 22.0034C71.1134 21.9887 70.8039 21.9779 70.4878 21.971C74.5019 20.6787 78.156 19.4408 81.1718 18.3789V18.3804ZM74.3245 72.6856L71.5267 73.0479C48.0906 76.0796 27.8507 78.6983 17.5069 79.6887C11.4953 80.2639 5.88644 80.5629 3.66513 80.5503C1.88558 80.5408 1.27079 80.1085 1.23545 79.8876C1.25828 79.7616 1.54837 79.0282 5.06403 77.1018C7.8022 75.6017 12.1425 73.5619 18.3337 70.8659C32.1475 64.8495 46.7028 58.0945 56.4811 53.4868C56.9818 53.2512 57.4729 53.0163 57.9581 52.7821C61.018 52.3805 64.1945 51.9664 67.4875 51.5398C78.6994 50.0898 89.7228 48.466 100.428 46.8695C98.0448 48.3541 96.1886 49.9963 94.8972 51.7651C92.9321 54.4581 92.2135 57.5091 92.7621 60.8383C93.3378 64.3245 95.6814 67.0977 98.9702 69.3217C89.3288 70.673 80.6284 71.8689 74.3252 72.6841L74.3245 72.6856ZM113.149 151.492C108.053 153.861 102.717 155.674 97.2327 156.9C91.5718 158.161 85.7896 158.796 79.9901 158.794C78.7929 158.794 77.5884 158.765 76.3824 158.711C76.847 158.531 77.3535 158.343 77.8549 158.16C79.8494 157.428 82.3314 156.517 84.1514 155.324C85.6409 154.348 86.5207 153.283 86.7865 152.141C90.0394 151.654 93.3835 151.081 96.7939 150.407C101.984 149.382 107.518 147.885 113.006 146.04C113.704 146.36 114.34 146.635 114.865 146.863C115.234 147.022 115.552 147.157 115.777 147.264C117.276 147.961 118.059 148.447 118.463 148.767C116.726 149.742 114.955 150.65 113.149 151.491L113.149 151.492ZM112.439 109.702C130.298 107.989 142.412 107.604 145.247 107.604C148.215 107.604 150.342 107.693 151.749 107.878C153.048 108.049 153.414 108.268 153.502 108.341V108.349L153.483 108.4C153.034 109.422 151.81 109.953 149.51 110.877C148.915 111.115 147.449 111.603 145.42 112.276C140.835 113.8 133.16 116.351 125.026 119.527C118.514 122.07 113.4 124.755 109.825 127.498C108.878 128.218 107.984 129.005 107.151 129.855C99.8619 130.408 91.7681 131.186 83.8422 132.273C58.8651 135.697 37.4413 139.484 33.0716 140.311C32.7321 140.375 32.4259 140.429 32.1475 140.475C36.6299 138.77 42.3721 136.425 52.0871 131.614C62.4051 126.503 66.5562 124.31 78.0036 115.955C79.2867 115.019 80.5062 114.118 81.6621 113.252C92.4418 111.858 103.274 110.579 112.44 109.7L112.439 109.702ZM156.007 85.6948C150.369 87.5358 130.072 91.9491 123.986 93.257C113.951 95.4131 103.324 97.8226 93.1125 100.228C93.4924 98.5561 93.4343 96.8403 92.9358 94.9934C92.522 93.4609 91.6606 92.033 90.3766 90.7502C89.1249 89.4984 87.4911 88.4107 85.5297 87.5219C81.467 85.6808 76.2204 84.7824 70.3575 84.9268C66.6762 85.0173 63.1178 85.1816 59.6338 85.4246C64.8149 84.091 70.1779 82.7492 75.6571 81.4289C86.3448 78.8515 97.5596 76.2983 108.576 73.8056C114.653 75.8477 121.266 77.073 126.07 77.9633C126.935 78.1239 127.752 78.2748 128.484 78.4162C131.572 79.012 135.779 79.6895 140.233 80.4045C147.041 81.5018 154.081 82.6358 157.998 83.6152C158.555 83.7544 158.635 83.926 158.644 84.0306C158.623 84.1794 158.553 84.3171 158.445 84.4216C157.95 84.8944 156.82 85.429 156.007 85.6948H156.007Z" }) }),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M159.994 80.9826C159.998 80.6571 160 80.338 160 80.0253C160 79.8122 160 79.5994 160 79.3868C160 79.3132 160 79.2395 160 79.1711C160 79.0319 160 78.8927 159.995 78.7542C159.995 78.6629 159.995 78.5724 159.99 78.4818C159.99 78.3632 159.985 78.2447 159.982 78.1254C159.982 78.0245 159.977 77.9229 159.975 77.8212C159.973 77.7196 159.968 77.6099 159.965 77.5038L159.954 77.1702C159.954 77.0797 159.948 76.9891 159.944 76.8985C159.94 76.7741 159.934 76.6496 159.929 76.5252C159.929 76.4663 159.924 76.4073 159.921 76.3477C159.888 75.6201 159.846 74.8935 159.793 74.1679V74.1385C159.779 73.9514 159.765 73.7637 159.75 73.5766V73.5494C159.415 69.3605 158.75 65.2047 157.762 61.1204L157.726 60.9665L157.684 60.8008C157.637 60.6071 157.588 60.4149 157.536 60.222L157.514 60.1314C157.509 60.1137 157.505 60.096 157.5 60.0784C157.456 59.9031 157.41 59.7283 157.363 59.554C157.363 59.5467 157.36 59.5393 157.358 59.5312C157.319 59.3839 157.28 59.2381 157.24 59.0938L157.203 58.9524C157.196 58.9296 157.19 58.9067 157.184 58.8839C157.163 58.8103 157.143 58.7307 157.121 58.6542C157.089 58.5378 157.056 58.421 157.023 58.3036C157.015 58.2771 157.009 58.2506 157.001 58.2241L156.952 58.0518C156.952 58.0498 156.952 58.0478 156.952 58.0459C156.878 57.797 156.809 57.5496 156.735 57.3014C156.734 57.2947 156.732 57.288 156.73 57.2815L156.656 57.0437L156.637 56.984V56.9752C156.585 56.8024 156.533 56.6288 156.479 56.4545C156.475 56.4413 156.471 56.4273 156.467 56.414L156.445 56.3404C156.437 56.3154 156.429 56.2903 156.422 56.2668C156.406 56.2167 156.391 56.1666 156.375 56.1195C156.332 55.983 156.289 55.847 156.245 55.7115C156.209 55.5981 156.173 55.4847 156.136 55.3713L156.075 55.182C156.061 55.1386 156.046 55.0951 156.032 55.0517C155.992 54.9294 155.951 54.8067 155.91 54.6835L155.903 54.6599C155.883 54.5995 155.863 54.5392 155.842 54.4788L155.803 54.3617L155.734 54.1599V54.1496C155.734 54.1452 155.73 54.14 155.729 54.1349C155.669 53.9586 155.608 53.7829 155.547 53.6076L155.531 53.5627C155.503 53.4824 155.475 53.4014 155.446 53.3211L155.398 53.1849C155.357 53.071 155.316 52.9569 155.275 52.8425C155.247 52.7688 155.22 52.69 155.192 52.6142C155.173 52.5604 155.153 52.5074 155.133 52.4537L155.124 52.4301C155.118 52.4102 155.11 52.3903 155.103 52.3712L155.098 52.3565C155.077 52.3005 155.057 52.2453 155.035 52.1893L154.99 52.0678C154.977 52.0317 154.963 51.9941 154.95 51.9603L154.891 51.8012C154.881 51.7747 154.871 51.7482 154.861 51.7224L154.75 51.4279L154.739 51.3977C154.728 51.3704 154.717 51.3424 154.706 51.3152C154.675 51.2342 154.644 51.1539 154.613 51.0736C154.589 51.0118 154.566 50.9499 154.539 50.8881L154.513 50.8203L154.414 50.5685C154.382 50.4875 154.349 50.4065 154.316 50.3255L154.242 50.1495L154.207 50.0604C154.197 50.0368 154.188 50.0125 154.178 49.9867L154.136 49.8821L154.032 49.6296L153.977 49.4955C153.946 49.4219 153.915 49.3483 153.885 49.2746C153.848 49.1862 153.811 49.0971 153.775 49.0095L153.698 48.8276C153.689 48.8077 153.68 48.7871 153.672 48.7665C153.664 48.7459 153.646 48.7054 153.633 48.6752C153.58 48.55 153.526 48.4253 153.472 48.3011C153.454 48.2584 153.435 48.2164 153.417 48.1744L153.401 48.1361L153.284 47.8666L153.2 47.6781L153.119 47.4969L153.113 47.4829L152.989 47.2053C152.962 47.1442 152.934 47.0838 152.907 47.0234C152.899 47.0065 152.891 46.9896 152.884 46.9726C152.877 46.9557 152.863 46.927 152.852 46.9041L152.837 46.8688L152.702 46.5742L152.656 46.4755L152.641 46.4417C152.634 46.4269 152.628 46.4122 152.62 46.3975L152.598 46.3489L152.437 46.005C152.417 45.9623 152.397 45.9196 152.377 45.8776L152.313 45.7414C152.288 45.6913 152.265 45.6405 152.239 45.5897L152.189 45.4858C152.146 45.396 152.104 45.3061 152.06 45.2163C151.994 45.0813 151.928 44.9465 151.862 44.812C151.832 44.7494 151.801 44.6868 151.77 44.6242C151.763 44.608 151.755 44.5918 151.746 44.5756C151.696 44.4733 151.645 44.3716 151.594 44.27L151.567 44.2163C151.559 44.2008 151.551 44.1853 151.544 44.1706L151.414 43.9121C151.414 43.9055 151.407 43.8989 151.403 43.8923L151.33 43.745L151.241 43.5712C151.214 43.5196 151.188 43.4674 151.161 43.4165L151.15 43.3944L151.086 43.2715C151.078 43.256 151.07 43.2413 151.062 43.2258L150.847 42.812C150.814 42.7501 150.782 42.6882 150.749 42.6264L150.665 42.4703C150.607 42.3623 150.55 42.2542 150.492 42.1462L150.409 41.9916C150.383 41.943 150.356 41.8951 150.331 41.8443C150.176 41.5606 150.02 41.2778 149.862 40.996L149.772 40.8347L149.734 40.767C149.67 40.6536 149.605 40.5401 149.541 40.4267L149.497 40.3531L149.346 40.0887C149.34 40.0792 149.334 40.0689 149.329 40.0585L149.165 39.7787L149.099 39.6646L148.961 39.4289L148.955 39.4193L148.734 39.043C148.713 39.0087 148.689 38.9766 148.661 38.9473C147.899 37.8427 145.495 37.3906 143.589 37.2072C141.528 37.0076 137.988 36.9281 132.871 37.6807C126.694 38.5887 118.695 39.9098 111.603 42.0792C108.595 43.0005 105.923 44.0226 103.629 45.1287C91.8719 46.8835 79.7184 48.6973 67.3366 50.2989C65.3183 50.5601 63.3448 50.8166 61.4163 51.0685C67.679 47.8556 72.4456 44.8157 75.8986 41.8377C76.7807 41.0786 77.619 40.2699 78.4093 39.4157C80.4164 38.8005 82.4173 38.1815 84.4121 37.5585C96.4132 33.8028 105.77 30.2475 112.23 26.98C112.378 26.9064 112.517 26.8328 112.658 26.7591L112.785 26.6936L113.079 26.5426L113.235 26.4601L113.489 26.3269L113.653 26.2385C113.732 26.1965 113.812 26.1538 113.89 26.1111L114.053 26.0227L114.285 25.8961L114.441 25.8092L114.674 25.6788L114.821 25.5971L115.052 25.4653L115.19 25.3865C115.301 25.3231 115.41 25.2596 115.518 25.1957L115.548 25.1781C115.667 25.1089 115.782 25.0396 115.897 24.9704L116.004 24.9063L116.237 24.7642L116.365 24.6854L116.568 24.5595L116.7 24.4755L116.891 24.354L117.022 24.2701L117.208 24.1493L117.333 24.0668L117.518 23.9431L117.633 23.8695C117.7 23.8246 117.765 23.7796 117.83 23.734L117.924 23.6699C118.022 23.6036 118.116 23.5376 118.206 23.4718C120.625 21.7457 123.462 19.0026 123.238 15.7396C123.238 15.7153 123.235 15.6917 123.233 15.666V15.6373C123.095 14.1939 122.039 11.9994 117.913 9.56415L117.889 9.55015L117.751 9.46915L117.663 9.41908L117.569 9.36532L117.426 9.28431L117.374 9.25486L117.171 9.14219L117.145 9.1282L117.135 9.12304L117.122 9.11568C116.68 8.88543 116.239 8.65886 115.797 8.43598L115.767 8.42125C115.489 8.28207 115.21 8.14363 114.93 8.00813L114.888 7.98751L114.702 7.89767L114.408 7.75702H114.401L114.216 7.66938L114.159 7.64287L114.073 7.60163L113.86 7.50148L113.793 7.46982L113.581 7.37188L113.49 7.3299L113.471 7.32107L113.316 7.24743L113.243 7.21429L112.948 7.081L112.894 7.05596L112.785 7.00736L112.696 6.96686L112.384 6.82768L112.31 6.79454L112.281 6.78202L112.155 6.72605L111.823 6.57877L111.646 6.50513L111.476 6.43149L111.108 6.27317L110.822 6.15313L110.527 6.03015L110.344 5.95651L110.227 5.90791C110.092 5.85268 109.956 5.79819 109.821 5.74369L109.673 5.68552L109.265 5.52351L109.133 5.47196L108.702 5.3048L108.629 5.27608C108.39 5.18476 108.149 5.09419 107.908 5.00435H107.9C107.464 4.84234 107.026 4.68254 106.593 4.5301L106.566 4.52053L106.074 4.34895L106.013 4.32833C105.848 4.27187 105.684 4.21615 105.521 4.16117L105.487 4.14938L105.234 4.06543L105.013 3.99179L104.651 3.87397L104.38 3.78707L104.051 3.6825L103.734 3.58309L103.439 3.49178L102.906 3.3305L102.832 3.30841L102.808 3.30105L102.292 3.14935H102.281H102.274L102.253 3.14346L102.126 3.10737C101.227 2.84914 100.324 2.60638 99.4164 2.37907C84.4694 -1.33826 68.7698 -0.688327 54.181 4.25174L54.1582 4.25984C53.9911 4.31728 53.8232 4.37472 53.6561 4.43364L53.5265 4.47856C53.3571 4.53747 53.1885 4.59785 53.0199 4.65824L52.9073 4.698L52.3779 4.89094L52.3109 4.91524C47.8766 6.55097 43.5967 8.57844 39.522 10.9736L39.4808 10.9979C39.3475 11.076 39.2142 11.1555 39.0817 11.235L38.8741 11.3588C38.7607 11.4265 38.6478 11.4947 38.5354 11.5635C38.4456 11.618 38.3557 11.6725 38.2667 11.7277C38.166 11.7891 38.0654 11.8509 37.9648 11.9133C37.8642 11.9756 37.7616 12.0394 37.657 12.1047L37.3853 12.2748C37.2705 12.347 37.1559 12.4206 37.0415 12.4958L36.8052 12.6453C36.6702 12.7312 36.5362 12.8178 36.4032 12.9052L36.222 13.023C36.0257 13.1512 35.8311 13.2798 35.6382 13.4089C35.3128 13.6261 35.1523 13.9745 35.2192 14.3191C35.3422 14.9546 36.0984 15.1799 36.6572 15.2941C39.1244 15.7985 44.3681 16.3611 48.243 16.3935C48.3947 16.3935 48.5457 16.3935 48.6973 16.3935C52.9434 16.3935 57.2063 15.8965 60.4577 15.0179C62.4147 14.4885 63.9918 13.8301 65.1411 13.0598C66.2904 12.2896 67.0281 11.3963 67.3285 10.4088C72.0841 10.0546 77.1687 9.802 82.4278 9.73057C87.2381 9.6643 91.6761 9.71805 95.7417 9.89185C92.6877 12.2837 87.4499 14.8412 80.7602 17.1984C76.7387 18.6138 71.5819 20.3436 65.9613 22.1205C61.1336 22.4718 55.1043 23.4262 47.6165 24.7664C40.3451 26.0669 32.7432 27.7805 26.7544 29.4669C19.3697 31.5465 15.0279 33.4007 13.8506 34.9781L13.8352 35.0002L13.4442 35.5798C13.3124 35.7771 13.1806 35.9752 13.051 36.1733C13.0478 36.1773 13.0449 36.1815 13.0422 36.1858C12.8176 36.5275 12.585 36.8891 12.3302 37.2904L12.2654 37.3942L12.1771 37.5349C12.0819 37.6866 11.9874 37.8385 11.8936 37.9907L11.8863 38.0025L11.8811 38.0113L11.7236 38.2661L11.5255 38.5924C11.5174 38.6049 11.51 38.6174 11.5027 38.6299L11.446 38.722L11.2663 39.0224C11.2317 39.0799 11.1979 39.138 11.1633 39.1962L11.1242 39.261L11.0027 39.4657L10.9821 39.5011L10.9785 39.5085C10.8032 39.8067 10.6243 40.116 10.4373 40.4444C10.4226 40.4702 10.4078 40.496 10.3939 40.5181C10.3799 40.5401 10.3556 40.5843 10.3364 40.6189L10.2878 40.7029L10.2039 40.8502L10.0787 41.0726L10.0301 41.1602L9.93148 41.3377L9.89982 41.3951L9.78423 41.6101C9.76435 41.647 9.74447 41.6838 9.72386 41.7206L9.6944 41.7751C9.63649 41.8811 9.57881 41.9872 9.52138 42.0932L9.37413 42.365C9.28725 42.5292 9.19963 42.6927 9.11202 42.8591L9.10171 42.8797C8.89997 43.2634 8.69824 43.6559 8.48472 44.08L8.38533 44.2759C8.29918 44.4482 8.21451 44.6206 8.12616 44.7995L8.00541 45.0462C7.92197 45.2175 7.83902 45.3894 7.75656 45.5617C7.72784 45.6221 7.69986 45.6824 7.67115 45.7421L7.64538 45.7973C7.50181 46.0992 7.35823 46.4078 7.21761 46.7141V46.7178C7.07772 47.0227 6.93783 47.3327 6.80162 47.6405L6.75892 47.737V47.7422L6.7383 47.7893C6.65657 47.9741 6.57632 48.1575 6.49607 48.346L6.39741 48.578C6.31863 48.7621 6.24132 48.9462 6.16401 49.131L6.07566 49.3424C5.9424 49.6627 5.80913 49.9904 5.68102 50.3115L5.67366 50.3284C5.54334 50.6554 5.41376 50.9853 5.28859 51.3108L5.25546 51.3962C5.18184 51.5943 5.10821 51.7938 5.03016 51.9927L4.95654 52.1996C4.88438 52.396 4.81297 52.5923 4.74228 52.7887L4.66866 52.9824C4.54865 53.3167 4.4279 53.6599 4.31157 53.9986L4.30126 54.0281C4.18199 54.3771 4.06492 54.724 3.95448 55.059L3.9508 55.0694V55.0789L3.94712 55.0914C3.87865 55.2999 3.81165 55.5097 3.74465 55.7189L3.68354 55.9118C3.61923 56.1151 3.55592 56.3185 3.49358 56.5223L3.43689 56.7086C3.3316 57.0554 3.22631 57.4104 3.12324 57.7653L3.11367 57.7985C3.00912 58.16 2.90825 58.5201 2.81253 58.8692C2.81282 58.8704 2.81282 58.8717 2.81253 58.8729V58.8802C2.76787 59.0462 2.7232 59.2121 2.67853 59.378L2.58208 59.7462L2.47827 60.1446C2.45765 60.2264 2.43704 60.3081 2.41716 60.3899L2.23457 61.1263C1.34717 64.7973 0.72125 68.5268 0.361506 72.2864C0.35488 72.3512 0.348989 72.416 0.343099 72.4816C0.328374 72.634 0.315121 72.7857 0.301132 72.9381L0.279045 73.1966C0.268001 73.3299 0.256956 73.4639 0.246649 73.5972C0.239286 73.69 0.231188 73.7821 0.224561 73.8748C0.214253 74.0103 0.204682 74.1466 0.19511 74.2821C0.188484 74.369 0.181857 74.4551 0.175967 74.5413C0.161978 74.7467 0.149462 74.9522 0.136945 75.1584L0.119275 75.4625C0.112649 75.5818 0.106022 75.7004 0.100132 75.8189C0.094242 75.925 0.0890882 76.031 0.0846706 76.1371C0.0787805 76.2542 0.0736265 76.3713 0.0684727 76.4876C0.0630734 76.5912 0.0586558 76.695 0.0552199 76.7991C0.050066 76.9258 0.0456483 77.0517 0.0412307 77.1776C0.0412307 77.2711 0.0346045 77.3647 0.0316594 77.4582C0.025033 77.6577 0.0198789 77.8566 0.0147251 78.0561C0.0147251 78.1099 0.0147251 78.1644 0.0147251 78.2182C0.0107983 78.4032 0.00736247 78.5881 0.00441741 78.7727C0.00441741 78.794 0.00441741 78.8154 0.00441741 78.8375V78.8419C0.00441741 78.9685 0.00441759 79.0871 0 79.2005C0 79.2557 0 79.311 0 79.3669C0 79.5474 0 79.713 0 79.8721V79.9023C0.0147253 80.4679 0.402737 81.7853 3.67396 81.803H3.80796C6.14708 81.803 11.7074 81.504 17.6431 80.9355C28.0075 79.9428 48.257 77.3271 71.7041 74.2902L74.5019 73.9279C81.1283 73.0707 90.4053 71.7923 100.639 70.3504C102.392 71.3593 104.342 72.2437 106.39 73.0221C95.9906 75.3786 85.4517 77.7874 75.3774 80.2145C67.3167 82.1564 59.5086 84.1454 52.16 86.0844C44.2819 86.9224 36.6145 88.2074 28.5811 90.0146C19.7511 92.0029 11.2266 94.6156 4.57883 97.3786L4.40287 97.4522C2.90162 98.0715 2.2942 99.0414 2.59607 100.335V100.345L2.59975 100.359L2.65939 100.58V100.589L2.7632 100.982V100.987C2.8383 101.263 2.91487 101.539 2.99292 101.815C3.01648 101.899 3.04078 101.984 3.06654 102.069C3.12986 102.29 3.19416 102.511 3.25945 102.731L3.3154 102.923C3.39639 103.194 3.47861 103.464 3.56205 103.733L3.63568 103.97C3.70121 104.179 3.76747 104.387 3.83447 104.595L3.85877 104.669C3.87644 104.725 3.89484 104.78 3.91251 104.835C3.94712 104.942 3.98614 105.048 4.01854 105.155C4.07007 105.311 4.12161 105.468 4.17389 105.624L4.2431 105.827C4.31476 106.036 4.38691 106.244 4.45956 106.453L4.55454 106.723C4.63994 106.963 4.72609 107.203 4.81297 107.442L4.87997 107.626C4.9639 107.854 5.04906 108.082 5.13545 108.31C5.17153 108.405 5.20908 108.5 5.24442 108.595C5.27976 108.69 5.31804 108.785 5.35412 108.88L5.46677 109.175L5.50358 109.269C5.52125 109.316 5.53966 109.362 5.55807 109.409C5.65599 109.657 5.75612 109.905 5.85625 110.152L5.95786 110.399L5.977 110.446C6.05063 110.618 6.11984 110.791 6.19199 110.962L6.22218 111.035L6.31568 111.256C6.41778 111.496 6.52061 111.734 6.62418 111.973L6.71474 112.179L6.7545 112.267C6.82812 112.428 6.89733 112.59 6.96949 112.751C7.01955 112.862 7.06888 112.972 7.11674 113.084C7.1992 113.266 7.2824 113.447 7.36633 113.627C7.43358 113.775 7.50107 113.919 7.56881 114.06C7.64243 114.217 7.71606 114.374 7.78969 114.53C7.84712 114.651 7.90504 114.771 7.96345 114.891C8.03045 115.03 8.09892 115.169 8.16739 115.308C8.24764 115.472 8.32937 115.635 8.41109 115.799C8.49282 115.962 8.57602 116.128 8.65995 116.292C8.72523 116.421 8.79125 116.55 8.85801 116.678C8.91912 116.796 8.97949 116.913 9.0406 117.029L9.05901 117.065C9.12183 117.185 9.18466 117.305 9.24749 117.424C9.35106 117.621 9.45512 117.815 9.55967 118.007L9.80116 118.449C9.85638 118.548 9.91087 118.647 9.96609 118.743C10.0451 118.887 10.1246 119.03 10.2046 119.172L10.3033 119.346L10.3475 119.42C10.4991 119.687 10.6516 119.953 10.8017 120.211L10.9365 120.441C11.0256 120.594 11.1161 120.747 11.2067 120.899L11.3289 121.103C11.5196 121.421 11.711 121.736 11.8995 122.04L11.9496 122.122C12.0512 122.286 12.1535 122.449 12.2566 122.612L12.3582 122.773C12.3707 122.793 12.384 122.812 12.3965 122.833C12.409 122.854 12.4274 122.88 12.4421 122.907C12.5644 123.098 12.6871 123.289 12.8103 123.48C12.8176 123.492 12.825 123.504 12.8331 123.516C12.9487 123.695 13.065 123.871 13.1821 124.048L13.1902 124.062C13.4074 124.392 13.6386 124.734 13.8948 125.11L13.9338 125.166L14.0553 125.345L14.1974 125.549L14.2924 125.686L14.3601 125.783L14.5192 126.011C14.5236 126.016 14.5273 126.022 14.5309 126.027L14.5434 126.044C14.5434 126.049 14.5501 126.053 14.553 126.058C14.6502 126.195 14.7467 126.332 14.8475 126.469L14.9565 126.621L15.0662 126.773L15.1479 126.885C15.3018 127.098 15.4579 127.313 15.6162 127.526L15.6633 127.59L15.7524 127.711C15.8628 127.858 15.9738 128.006 16.0852 128.153C16.1397 128.226 16.1949 128.3 16.2494 128.374C16.3628 128.521 16.4764 128.668 16.5903 128.816L16.711 128.972C16.9716 129.308 17.2323 129.64 17.4856 129.956L17.5261 130.007C17.6497 130.162 17.7749 130.316 17.9001 130.47L18.0473 130.646C18.172 130.798 18.2972 130.95 18.4228 131.102L18.5362 131.238C18.9559 131.741 19.3859 132.244 19.8136 132.731L19.9219 132.855C20.0598 133.011 20.1987 133.168 20.3386 133.325L20.4343 133.431C20.893 133.942 21.362 134.452 21.8281 134.945L21.8744 134.994C22.0276 135.156 22.1817 135.318 22.3368 135.479L22.4104 135.557C22.6674 135.823 22.9258 136.089 23.1909 136.353L23.2189 136.381C23.6142 136.78 24.014 137.175 24.4146 137.56L24.4661 137.609C24.5029 137.645 24.5397 137.683 24.5787 137.716C24.7105 137.843 24.8423 137.97 24.9749 138.095L25.0485 138.164L25.0647 138.18C25.1898 138.298 25.3165 138.416 25.4424 138.534C25.516 138.608 25.5896 138.673 25.6669 138.742C25.7538 138.823 25.8414 138.904 25.9283 138.983L26.1153 139.155C26.2663 139.292 26.4172 139.429 26.5667 139.563L26.5711 139.567L26.5954 139.589L26.6123 139.605C26.7596 139.738 26.9105 139.871 27.0651 140.006L27.2448 140.165L27.5334 140.416C27.6608 140.527 27.7881 140.637 27.9155 140.746C27.9891 140.811 28.0627 140.876 28.1415 140.94L28.1975 140.988L28.2395 141.024L28.2623 141.044C28.4095 141.171 28.5627 141.297 28.7136 141.423L28.8049 141.496L28.8182 141.507C28.8506 141.533 28.8844 141.558 28.919 141.58C29.026 141.653 29.1418 141.712 29.2636 141.756H29.2695H29.2754C29.597 141.858 29.9336 141.905 30.2708 141.894C30.9681 141.894 31.9296 141.764 33.302 141.505C37.6651 140.678 59.0588 136.896 84.0101 133.478C91.453 132.457 99.0409 131.71 105.969 131.165C104.453 133.095 103.671 135.048 103.637 137.007C103.574 140.606 107.793 143.407 111.39 145.226C106.627 146.781 101.598 148.145 96.5509 149.141C93.2377 149.795 89.9937 150.354 86.8322 150.83C86.7985 150.611 86.7466 150.395 86.6768 150.184C86.0657 148.334 83.5757 147.043 79.6646 146.547C75.8758 146.068 71.0363 146.357 66.0378 147.363C59.2959 148.719 55.0204 150.794 53.8703 151.397C52.1033 152.323 51.4068 153.023 51.4568 153.813C51.5113 154.671 52.4442 155.128 53.2622 155.433L53.282 155.44L53.6347 155.563L53.687 155.582L54.0301 155.7C54.5845 155.89 55.1418 156.074 55.6845 156.247L55.7264 156.261L56.1498 156.393H56.1564C56.459 156.487 56.7683 156.582 57.0812 156.675L57.1261 156.689L57.1607 156.699L57.2166 156.716L57.411 156.774C57.6047 156.831 57.7983 156.887 57.9919 156.942L58.1046 156.975C58.6072 157.118 59.1118 157.255 59.6183 157.387L59.692 157.406L59.8061 157.437L59.8245 157.441C60.0297 157.494 60.2351 157.546 60.4408 157.598L60.6219 157.644L60.7308 157.671L60.7853 157.684L61.3184 157.813L61.4112 157.836L61.6372 157.889C61.6784 157.899 61.7204 157.908 61.7623 157.917L62.2085 158.021L62.3506 158.053L62.5384 158.095C62.6194 158.113 62.7011 158.13 62.7828 158.148C62.8933 158.172 63.0037 158.197 63.1156 158.222L63.176 158.235L63.4955 158.303L63.8533 158.376L64.0588 158.418H64.0742L64.3128 158.467C64.5332 158.51 64.754 158.553 64.9754 158.595L65.3885 158.669L65.7338 158.732L65.9326 158.767L66.0113 158.781L66.1814 158.811L66.3706 158.844L66.9258 158.937L67.0635 158.959L67.3241 159.001L67.545 159.036C67.6731 159.057 67.8012 159.076 67.93 159.095L68.0037 159.106L68.0854 159.119L68.1826 159.133C68.428 159.168 68.671 159.203 68.9115 159.237L69.0845 159.261L69.351 159.297L69.3982 159.303L69.9275 159.371L70.0093 159.381L70.063 159.388L70.4083 159.429C71.0062 159.5 71.6045 159.565 72.2033 159.623C72.4036 159.642 72.6039 159.661 72.8048 159.679L73.1546 159.71L73.2334 159.716L73.2658 159.72C73.4962 159.739 73.7281 159.757 73.9601 159.774L74.0212 159.779C76.0002 159.926 78.0022 160 79.9849 160C85.8763 160.002 91.7501 159.357 97.5007 158.076C103.072 156.83 108.494 154.988 113.671 152.581C115.726 151.626 117.741 150.582 119.715 149.449C119.728 149.442 119.741 149.437 119.754 149.43C120.811 148.823 121.852 148.193 122.877 147.539L122.913 147.516C123.173 147.35 123.432 147.183 123.69 147.014L123.863 146.901C124.076 146.761 124.287 146.62 124.498 146.479L124.728 146.325C124.924 146.192 125.119 146.059 125.312 145.926C125.492 145.802 125.672 145.676 125.851 145.55C125.988 145.454 126.125 145.359 126.261 145.262C126.445 145.131 126.628 145 126.81 144.868L126.989 144.738C127.189 144.591 127.389 144.443 127.587 144.296L127.672 144.233C127.808 144.133 127.944 144.033 128.079 143.931C132.538 140.57 136.636 136.754 140.306 132.545C140.485 132.34 140.663 132.134 140.84 131.926L140.89 131.868C141.06 131.668 141.229 131.468 141.396 131.269L141.463 131.189C141.629 130.989 141.795 130.788 141.96 130.587L142.019 130.513C142.188 130.307 142.355 130.1 142.52 129.893L142.552 129.852C143.169 129.08 143.781 128.282 144.371 127.483L144.399 127.445C144.988 126.646 145.57 125.825 146.127 125.011L146.135 124.999L146.151 124.976C146.304 124.752 146.456 124.527 146.606 124.301L146.649 124.236C146.796 124.014 146.943 123.791 147.09 123.567L147.134 123.5C147.281 123.273 147.428 123.045 147.576 122.816L147.6 122.778C148.833 120.832 149.996 118.809 151.06 116.761L151.069 116.744L151.074 116.735C151.202 116.489 151.328 116.242 151.453 115.993L151.477 115.946C151.603 115.696 151.727 115.445 151.852 115.193L151.865 115.165C152.463 113.946 153.032 112.703 153.569 111.449C153.606 111.362 153.642 111.276 153.681 111.19C153.732 111.068 153.782 110.946 153.833 110.822C153.894 110.674 153.955 110.529 154.016 110.384C154.069 110.254 154.122 110.123 154.174 109.993C154.226 109.863 154.285 109.721 154.339 109.585C154.399 109.433 154.458 109.283 154.518 109.131C154.559 109.026 154.601 108.92 154.641 108.814V108.809C154.651 108.783 154.661 108.757 154.672 108.735C154.672 108.727 154.678 108.717 154.681 108.707C154.856 108.183 154.7 107.808 154.54 107.584C154.072 106.937 152.969 106.305 145.245 106.305C145.135 106.305 133.659 106.362 112.317 108.408C103.746 109.231 93.7177 110.402 83.6412 111.691C86.3654 109.556 88.6147 107.578 90.244 105.607C91.3757 104.237 92.1819 102.907 92.6906 101.567C103.109 99.1106 113.986 96.6392 124.245 94.4352C140.532 90.9365 152.55 88.097 156.394 86.8392C157.117 86.6028 158.544 86.0093 159.307 85.2839L159.312 85.2788C159.598 85.002 159.791 84.6437 159.865 84.253C159.879 84.2051 159.889 84.1557 159.892 84.1057V84.1013V84.091C159.892 84.0674 159.892 84.0438 159.892 84.0173C159.892 84.0102 159.892 84.0031 159.892 83.996C159.924 83.3457 159.949 82.6881 159.965 82.0393V81.9171C159.972 81.6395 159.976 81.3648 159.981 81.0916L159.994 80.9826ZM60.1249 13.8147C56.8625 14.6983 52.5333 15.1814 48.2467 15.1453C44.8938 15.1174 40.3429 14.6659 37.7329 14.2248C41.8316 13.4457 52.4582 11.5937 65.9245 10.5207C64.9725 12.2608 61.9854 13.3124 60.1249 13.8147ZM81.1718 18.3804C90.9045 14.9539 95.4553 11.9413 97.5662 9.98537C106.728 10.4714 113.852 11.5974 118.838 13.3537C120.6 13.9745 121.688 14.6726 121.9 15.3191C121.938 15.4598 121.964 15.6034 121.979 15.7484V15.775C121.979 15.7897 121.979 15.8037 121.982 15.8199C122.084 17.3037 121.384 19.658 117.472 22.4475C117.384 22.5108 117.294 22.5742 117.203 22.6375L117.113 22.6993L116.923 22.829L116.813 22.9026L116.635 23.0219L116.514 23.1007L116.335 23.2178L116.209 23.2988L116.024 23.4159L115.896 23.4969L115.699 23.6191L115.575 23.6928L115.35 23.8297L115.245 23.8931C115.134 23.9603 115.021 24.0276 114.906 24.0948L114.876 24.1125C114.771 24.1739 114.665 24.2355 114.557 24.2973L114.424 24.371L114.198 24.4998L114.051 24.5801C113.978 24.6221 113.904 24.6648 113.824 24.7068L113.671 24.7922L113.445 24.9159L113.285 25.0028C113.211 25.0448 113.13 25.086 113.052 25.128L112.892 25.2134L112.643 25.3452L112.49 25.4255L112.204 25.5728L112.079 25.6369C111.94 25.7085 111.8 25.78 111.659 25.8511C105.26 29.0876 95.9648 32.6202 84.0314 36.3515C82.6468 36.7855 81.2591 37.2163 79.8686 37.6439C80.4219 36.9092 80.9076 36.1259 81.3198 35.3036C82.4978 32.925 82.7187 30.5759 81.9868 28.3225C81.308 26.2304 80.099 24.709 78.2915 23.6714C76.5922 22.6957 74.3436 22.15 71.4163 22.0034C71.1134 21.9887 70.8039 21.9779 70.4878 21.971C74.5019 20.6787 78.156 19.4408 81.1718 18.3789V18.3804ZM74.3245 72.6856L71.5267 73.0479C48.0906 76.0796 27.8507 78.6983 17.5069 79.6887C11.4953 80.2639 5.88644 80.5629 3.66513 80.5503C1.88558 80.5408 1.27079 80.1085 1.23545 79.8876C1.25828 79.7616 1.54837 79.0282 5.06403 77.1018C7.8022 75.6017 12.1425 73.5619 18.3337 70.8659C32.1475 64.8495 46.7028 58.0945 56.4811 53.4868C56.9818 53.2512 57.4729 53.0163 57.9581 52.7821C61.018 52.3805 64.1945 51.9664 67.4875 51.5398C78.6994 50.0898 89.7228 48.466 100.428 46.8695C98.0448 48.3541 96.1886 49.9963 94.8972 51.7651C92.9321 54.4581 92.2135 57.5091 92.7621 60.8383C93.3378 64.3245 95.6814 67.0977 98.9702 69.3217C89.3288 70.673 80.6284 71.8689 74.3252 72.6841L74.3245 72.6856ZM113.149 151.492C108.053 153.861 102.717 155.674 97.2327 156.9C91.5718 158.161 85.7896 158.796 79.9901 158.794C78.7929 158.794 77.5884 158.765 76.3824 158.711C76.847 158.531 77.3535 158.343 77.8549 158.16C79.8494 157.428 82.3314 156.517 84.1514 155.324C85.6409 154.348 86.5207 153.283 86.7865 152.141C90.0394 151.654 93.3835 151.081 96.7939 150.407C101.984 149.382 107.518 147.885 113.006 146.04C113.704 146.36 114.34 146.635 114.865 146.863C115.234 147.022 115.552 147.157 115.777 147.264C117.276 147.961 118.059 148.447 118.463 148.767C116.726 149.742 114.955 150.65 113.149 151.491L113.149 151.492ZM112.439 109.702C130.298 107.989 142.412 107.604 145.247 107.604C148.215 107.604 150.342 107.693 151.749 107.878C153.048 108.049 153.414 108.268 153.502 108.341V108.349L153.483 108.4C153.034 109.422 151.81 109.953 149.51 110.877C148.915 111.115 147.449 111.603 145.42 112.276C140.835 113.8 133.16 116.351 125.026 119.527C118.514 122.07 113.4 124.755 109.825 127.498C108.878 128.218 107.984 129.005 107.151 129.855C99.8619 130.408 91.7681 131.186 83.8422 132.273C58.8651 135.697 37.4413 139.484 33.0716 140.311C32.7321 140.375 32.4259 140.429 32.1475 140.475C36.6299 138.77 42.3721 136.425 52.0871 131.614C62.4051 126.503 66.5562 124.31 78.0036 115.955C79.2867 115.019 80.5062 114.118 81.6621 113.252C92.4418 111.858 103.274 110.579 112.44 109.7L112.439 109.702ZM156.007 85.6948C150.369 87.5358 130.072 91.9491 123.986 93.257C113.951 95.4131 103.324 97.8226 93.1125 100.228C93.4924 98.5561 93.4343 96.8403 92.9358 94.9934C92.522 93.4609 91.6606 92.033 90.3766 90.7502C89.1249 89.4984 87.4911 88.4107 85.5297 87.5219C81.467 85.6808 76.2204 84.7824 70.3575 84.9268C66.6762 85.0173 63.1178 85.1816 59.6338 85.4246C64.8149 84.091 70.1779 82.7492 75.6571 81.4289C86.3448 78.8515 97.5596 76.2983 108.576 73.8056C114.653 75.8477 121.266 77.073 126.07 77.9633C126.935 78.1239 127.752 78.2748 128.484 78.4162C131.572 79.012 135.779 79.6895 140.233 80.4045C147.041 81.5018 154.081 82.6358 157.998 83.6152C158.555 83.7544 158.635 83.926 158.644 84.0306C158.623 84.1794 158.553 84.3171 158.445 84.4216C157.95 84.8944 156.82 85.429 156.007 85.6948H156.007Z",\n stroke: "black",\n strokeWidth: "2",\n mask: "url(#path-1-inside-1)"\n }\n )\n ]\n }\n), WV = () => /* @__PURE__ */ A(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: /* @__PURE__ */ A(\n "path",\n {\n d: "M159.994 80.9833C159.998 80.6564 160 80.3338 160 80.0187V80.0017C160 79.7955 160 79.5893 160 79.3831C160 79.3095 160 79.23 160 79.1534C160 79.0194 160 78.8846 159.995 78.7506C159.995 78.6563 159.995 78.5628 159.99 78.4686C159.99 78.3537 159.985 78.2381 159.982 78.1232C159.979 78.0083 159.977 77.9141 159.974 77.8095C159.971 77.7049 159.969 77.6055 159.965 77.5032L159.954 77.16C159.954 77.0731 159.948 76.9869 159.945 76.9L159.929 76.5156C159.929 76.4626 159.924 76.4096 159.922 76.3566C159.889 75.6202 159.845 74.8858 159.792 74.1533V74.1364C159.779 73.9459 159.764 73.7552 159.749 73.5642V73.5487C159.414 69.3571 158.749 65.1984 157.761 61.1111L157.725 60.9639C157.712 60.9094 157.697 60.8549 157.684 60.8011C157.636 60.6045 157.587 60.4094 157.536 60.212C157.53 60.184 157.522 60.1553 157.516 60.1273L157.503 60.078C157.417 59.7456 157.33 59.414 157.24 59.0831C157.229 59.0382 157.216 58.9933 157.204 58.9484L157.186 58.8836L157.123 58.6501C157.09 58.5316 157.056 58.413 157.023 58.2945C157.016 58.2702 157.009 58.2451 157.003 58.2208L156.953 58.0485V58.0441C156.882 57.7942 156.809 57.5448 156.732 57.2959C156.731 57.2899 156.729 57.284 156.727 57.2782L156.654 57.0404L156.635 56.9807V56.9756C156.582 56.7989 156.529 56.6229 156.475 56.4461L156.464 56.4108L156.442 56.3371L156.422 56.2716L156.369 56.1022C156.328 55.9697 156.286 55.8386 156.244 55.7075C156.207 55.5907 156.169 55.4739 156.131 55.357L156.072 55.1729L156.03 55.0463C155.989 54.9203 155.947 54.7951 155.906 54.67L155.9 54.6523C155.88 54.5919 155.86 54.5315 155.839 54.4711L155.801 54.3577C155.715 54.1039 155.627 53.8501 155.539 53.5963L155.524 53.5551C155.496 53.4748 155.468 53.3938 155.44 53.3135C155.424 53.2693 155.408 53.2252 155.392 53.181C155.35 53.0632 155.309 52.9468 155.266 52.8297C155.239 52.7561 155.213 52.6824 155.186 52.6088L155.123 52.449C155.119 52.4387 155.116 52.4277 155.111 52.4173L155.091 52.3629L155.086 52.3481C155.066 52.2922 155.045 52.2369 155.024 52.181L154.979 52.0595L154.942 51.9623C154.921 51.9048 154.9 51.8474 154.878 51.7907C154.868 51.7649 154.859 51.7391 154.849 51.717L154.739 51.4225L154.727 51.3923L154.696 51.3128C154.664 51.2296 154.631 51.1463 154.599 51.0624C154.576 51.0027 154.553 50.9424 154.526 50.8827L154.499 50.815L154.401 50.5631C154.368 50.4821 154.336 50.4011 154.303 50.3201L154.229 50.1441L154.197 50.0646C154.186 50.0366 154.175 50.0086 154.164 49.9806C154.153 49.9527 154.136 49.9122 154.122 49.8783L154.019 49.6257L153.965 49.4954L153.869 49.2649C153.833 49.1787 153.796 49.0918 153.762 49.0057C153.737 48.946 153.711 48.8871 153.688 48.8282L153.659 48.759L153.622 48.6713L153.467 48.312C153.447 48.2634 153.426 48.2155 153.405 48.1647L153.39 48.1301L153.273 47.8606C153.246 47.7987 153.218 47.7369 153.19 47.675C153.162 47.6131 153.134 47.5498 153.106 47.4865L153.102 47.4769L152.978 47.1993L152.897 47.0204L152.871 46.9622C152.861 46.9408 152.852 46.9195 152.841 46.8981L152.826 46.8628L152.691 46.5682L152.645 46.4695C152.642 46.4607 152.637 46.4526 152.634 46.4438C152.63 46.4349 152.617 46.4077 152.609 46.3893C152.601 46.3709 152.594 46.3583 152.587 46.3429L152.426 45.999C152.407 45.9577 152.387 45.9165 152.368 45.876C152.349 45.8355 152.321 45.7781 152.299 45.7287C152.276 45.6794 152.252 45.6323 152.229 45.5815L152.179 45.4776C152.137 45.3878 152.094 45.2979 152.051 45.2081C151.989 45.0807 151.926 44.9541 151.864 44.8267C151.829 44.753 151.795 44.6845 151.76 44.6138C151.752 44.5984 151.745 44.5829 151.737 44.5674C151.687 44.4651 151.635 44.3635 151.584 44.2618L151.557 44.2081C151.551 44.1934 151.543 44.1794 151.536 44.1654L151.403 43.9003L151.394 43.8841L151.32 43.7368L151.233 43.5674L151.15 43.4054L151.147 43.3914L151.084 43.2699C151.004 43.1153 150.923 42.9599 150.842 42.8053C150.81 42.7449 150.778 42.6838 150.746 42.6234L150.664 42.4702L150.485 42.1396L150.404 41.9886C150.378 41.9415 150.353 41.8944 150.33 41.8472C150.174 41.56 150.016 41.2733 149.855 40.9871L149.77 40.8347L149.734 40.7706C149.668 40.6533 149.602 40.5367 149.535 40.4208L149.495 40.3472L149.344 40.0828C149.338 40.0733 149.332 40.0644 149.327 40.0549L149.15 39.7507L149.097 39.6587L148.959 39.423L148.953 39.4135L148.732 39.0372C148.711 39.0029 148.686 38.9708 148.659 38.9414C147.897 37.8369 145.493 37.3847 143.587 37.2014C141.526 37.0018 137.986 36.9223 132.869 37.6749C126.692 38.5828 118.693 39.9039 111.601 42.0733C108.592 42.9945 105.921 44.0166 103.626 45.1227C91.8697 46.8775 79.7162 48.6912 67.3344 50.2929C65.3161 50.554 63.3426 50.8105 61.4141 51.0624C67.6768 47.8495 72.4433 44.8097 75.8964 41.8318C76.7793 41.0746 77.6183 40.2677 78.4093 39.4149C80.4164 38.8008 82.4173 38.182 84.4121 37.5585C96.4132 33.8029 105.77 30.2476 112.23 26.9803C112.378 26.9067 112.517 26.833 112.658 26.7594L112.785 26.6938L113.079 26.5429L113.235 26.4604L113.489 26.3271L113.653 26.2387C113.732 26.1968 113.812 26.1541 113.89 26.1114L114.053 26.023L114.285 25.8963L114.441 25.8094L114.674 25.6791L114.821 25.5974L115.052 25.4655L115.19 25.3867C115.301 25.3234 115.41 25.2598 115.518 25.196L115.548 25.1783C115.667 25.1091 115.782 25.0399 115.897 24.9707L116.004 24.9066L116.237 24.7645L116.365 24.6857L116.568 24.5598L116.7 24.4758L116.891 24.3543L117.022 24.2704L117.208 24.1496L117.333 24.0671L117.518 23.9434L117.633 23.8698C117.7 23.8249 117.765 23.7799 117.83 23.7343L117.924 23.6702C118.022 23.6039 118.116 23.5379 118.206 23.4721C120.625 21.746 123.462 19.003 123.238 15.7401C123.238 15.7158 123.235 15.6922 123.233 15.6664V15.6377C123.095 14.1944 122.039 11.9999 117.913 9.56471L117.889 9.55072L117.751 9.46971L117.663 9.41964L117.569 9.36588L117.426 9.28488L117.374 9.25542L117.171 9.14276L117.145 9.12876L117.135 9.12361L117.122 9.11625C116.68 8.886 116.239 8.65944 115.797 8.43656L115.767 8.42183C115.489 8.28265 115.21 8.14421 114.93 8.00872L114.888 7.9881L114.702 7.89752L114.408 7.75687H114.401L114.216 7.66924L114.159 7.64273L114.073 7.60149L113.86 7.50135L113.793 7.46968L113.581 7.37174L113.49 7.32977L113.471 7.32093L113.316 7.24729L113.243 7.21415L112.948 7.08087L112.894 7.05583L112.785 7.00723L112.696 6.96673L112.384 6.82755L112.31 6.79441L112.281 6.7819L112.155 6.72593L111.823 6.57865L111.646 6.50501L111.476 6.43137L111.108 6.27305L110.822 6.15302L110.527 6.03004L110.344 5.9564L110.227 5.9078C110.092 5.85257 109.956 5.79808 109.821 5.74359L109.673 5.68541L109.265 5.52341L109.133 5.47186L108.702 5.3047L108.629 5.27598C108.39 5.18467 108.149 5.09409 107.908 5.00425H107.9C107.464 4.84225 107.026 4.68245 106.593 4.53002L106.566 4.52045L106.074 4.34887L106.013 4.32825C105.848 4.27179 105.684 4.21607 105.521 4.16109L105.487 4.14931L105.234 4.06536L105.013 3.99172L104.651 3.8739L104.38 3.787L104.051 3.68244L103.734 3.58302L103.439 3.49171L102.906 3.33044L102.832 3.30835L102.808 3.30099L102.292 3.14929H102.281H102.274L102.253 3.1434L102.126 3.10732C101.227 2.84909 100.324 2.60633 99.4164 2.37903C84.4694 -1.33824 68.7698 -0.688315 54.181 4.25167L54.1582 4.25977C53.9911 4.3172 53.8232 4.37464 53.6561 4.43355L53.5265 4.47847C53.3571 4.53738 53.1885 4.59777 53.0199 4.65815L52.9073 4.69792L52.3779 4.89085L52.3109 4.91515C47.8766 6.55085 43.5967 8.57828 39.522 10.9734L39.4808 10.9977C39.3475 11.0758 39.2142 11.1553 39.0817 11.2348L38.8741 11.3585C38.7607 11.4263 38.6478 11.4945 38.5354 11.5633C38.4456 11.6178 38.3557 11.6722 38.2667 11.7275C38.166 11.7888 38.0654 11.8507 37.9648 11.913C37.8642 11.9754 37.7616 12.0392 37.657 12.1045L37.3853 12.2746C37.2705 12.3468 37.1559 12.4204 37.0415 12.4955L36.8052 12.645C36.6702 12.7309 36.5362 12.8176 36.4032 12.905L36.222 13.0228C36.0257 13.1509 35.8311 13.2795 35.6382 13.4087C35.3128 13.6259 35.1523 13.9742 35.2192 14.3188C35.3422 14.9543 36.0984 15.1797 36.6572 15.2938C39.1244 15.7982 44.3681 16.3608 48.243 16.3932C48.3947 16.3932 48.5457 16.3932 48.6973 16.3932C52.9434 16.3932 57.2063 15.8962 60.4577 15.0177C62.4147 14.4882 63.9918 13.8299 65.1411 13.0596C66.2904 12.2893 67.0281 11.3961 67.3285 10.4086C72.0841 10.0544 77.1687 9.80182 82.4278 9.73039C87.2381 9.66412 91.6756 9.71788 95.7402 9.89166C92.6899 12.279 87.4565 14.8365 80.7631 17.1937C76.7417 18.609 71.5841 20.3388 65.9642 22.1157C61.1365 22.467 55.1072 23.4213 47.6202 24.7616C40.3451 26.0664 32.7432 27.78 26.7544 29.4663C19.3697 31.5459 15.0279 33.4001 13.8506 34.9775L13.8352 34.9996L13.4442 35.5791C13.3124 35.7764 13.1806 35.9745 13.051 36.1726C13.0478 36.1766 13.0449 36.1808 13.0422 36.1851C12.8176 36.5268 12.585 36.8884 12.3302 37.2897L12.2654 37.3936L12.1771 37.5342C12.0819 37.6859 11.9874 37.8378 11.8936 37.99L11.8863 38.0018L11.8811 38.0106L11.7236 38.2654L11.5255 38.5917C11.5174 38.6042 11.51 38.6167 11.5027 38.6292L11.446 38.7213L11.2663 39.0217C11.2317 39.0791 11.1979 39.1373 11.1633 39.1955L11.1242 39.2603L11.0027 39.465L10.9821 39.5004L10.9785 39.5077C10.8032 39.806 10.6243 40.1152 10.4373 40.4437C10.4226 40.4694 10.4078 40.4952 10.3939 40.5173C10.3799 40.5394 10.3556 40.5836 10.3364 40.6182L10.2878 40.7021L10.2039 40.8494L10.0787 41.0718L10.0301 41.1594L9.93148 41.3369L9.89982 41.3944L9.78423 41.6094C9.76435 41.6462 9.74447 41.683 9.72386 41.7198L9.6944 41.7743C9.63649 41.8804 9.57881 41.9864 9.52138 42.0924L9.37413 42.3642C9.28725 42.5284 9.19963 42.6919 9.11202 42.8583L9.10171 42.8789C8.89997 43.2626 8.69824 43.6551 8.48472 44.0792L8.38533 44.2751C8.29918 44.4474 8.21451 44.6197 8.12616 44.7987L8.00541 45.0454C7.92197 45.2167 7.83902 45.3885 7.75656 45.5608C7.72784 45.6212 7.69986 45.6816 7.67115 45.7412L7.64538 45.7965C7.50181 46.0984 7.35823 46.4069 7.21761 46.7133V46.717C7.07772 47.0218 6.93783 47.3318 6.80162 47.6397L6.75892 47.7361V47.7413L6.7383 47.7884C6.65657 47.9732 6.57632 48.1566 6.49607 48.3451L6.39741 48.5771C6.31863 48.7612 6.24132 48.9453 6.16401 49.1301L6.07566 49.3415C5.9424 49.6618 5.80913 49.9895 5.68102 50.3105L5.67366 50.3275C5.54334 50.6544 5.41376 50.9843 5.28859 51.3098L5.25546 51.3952C5.18184 51.5933 5.10821 51.7929 5.03016 51.9917L4.95654 52.1986C4.88438 52.395 4.81297 52.5914 4.74228 52.7878L4.66866 52.9814C4.54865 53.3157 4.4279 53.6589 4.31157 53.9976L4.30126 54.0271C4.18199 54.3761 4.06492 54.723 3.95448 55.058L3.9508 55.0683V55.0779L3.94712 55.0904C3.87865 55.2988 3.81165 55.5087 3.74465 55.7178L3.68354 55.9108C3.61923 56.114 3.55592 56.3175 3.49358 56.5212L3.43689 56.7075C3.3316 57.0544 3.22631 57.4093 3.12324 57.7643L3.11367 57.7974C3.00912 58.159 2.90825 58.5191 2.81253 58.8681C2.81282 58.8693 2.81282 58.8706 2.81253 58.8718V58.8792C2.76787 59.0451 2.7232 59.211 2.67853 59.377L2.58208 59.7451L2.47827 60.1435C2.45765 60.2253 2.43704 60.307 2.41716 60.3888L2.23457 61.1251C1.34717 64.7962 0.72125 68.5255 0.361506 72.2851C0.35488 72.3499 0.348989 72.4147 0.343099 72.4802C0.328374 72.6327 0.315121 72.7844 0.301132 72.9368L0.279045 73.1953C0.268001 73.3286 0.256956 73.4626 0.246649 73.5959C0.239286 73.6887 0.231188 73.7807 0.224561 73.8735C0.214253 74.009 0.204682 74.1452 0.19511 74.2807C0.188484 74.3676 0.181857 74.4538 0.175967 74.5399C0.161978 74.7454 0.149462 74.9508 0.136945 75.157L0.119275 75.4611C0.112649 75.5804 0.106022 75.699 0.100132 75.8176C0.094242 75.9236 0.0890882 76.0296 0.0846706 76.1357C0.0787805 76.2528 0.0736265 76.3699 0.0684727 76.4862C0.0630734 76.5898 0.0586558 76.6936 0.0552199 76.7977C0.050066 76.9243 0.0456483 77.0503 0.0412307 77.1762C0.0412307 77.2697 0.0346045 77.3632 0.0316594 77.4568C0.025033 77.6563 0.0198789 77.8551 0.0147251 78.0547C0.0147251 78.1085 0.0147251 78.163 0.0147251 78.2167C0.0107983 78.4018 0.00736247 78.5866 0.00441741 78.7712C0.00441741 78.7926 0.00441741 78.8139 0.00441741 78.836V78.8404C0.00441741 78.9671 0.00441759 79.0856 0 79.1991C0 79.2543 0 79.3095 0 79.3655C0 79.5459 0 79.7116 0 79.8706V79.9008C0.0147253 80.4664 0.402737 81.7838 3.67396 81.8014H3.80796C6.14708 81.8014 11.7074 81.5025 17.6431 80.934C28.0075 79.9413 48.257 77.3257 71.7041 74.2888L74.5019 73.9265C81.1283 73.0694 90.4053 71.791 100.639 70.3491C102.392 71.358 104.342 72.2424 106.39 73.0208C95.9906 75.3772 85.4517 77.7859 75.3774 80.2131C67.3167 82.1549 59.5086 84.1439 52.1607 86.0828C44.2783 86.9208 36.6145 88.2058 28.5811 90.0129C19.7511 92.0012 11.2266 94.6139 4.57883 97.3768L4.40287 97.4504C2.90162 98.0697 2.2942 99.0396 2.59607 100.333V100.343L2.59975 100.357L2.65939 100.578V100.587L2.7632 100.98V100.985C2.8383 101.261 2.91487 101.537 2.99292 101.813C3.01648 101.897 3.04078 101.982 3.06654 102.067C3.12986 102.288 3.19416 102.509 3.25945 102.73L3.3154 102.921C3.39639 103.192 3.47861 103.462 3.56205 103.731L3.63568 103.968C3.70121 104.177 3.76747 104.385 3.83447 104.593L3.85877 104.667C3.87644 104.723 3.89484 104.778 3.91251 104.833C3.94712 104.94 3.98614 105.046 4.01854 105.153C4.07007 105.309 4.12161 105.466 4.17389 105.622L4.2431 105.825C4.31476 106.034 4.38691 106.242 4.45956 106.451L4.55454 106.721C4.63994 106.961 4.72609 107.201 4.81297 107.44L4.87997 107.624C4.9639 107.852 5.04906 108.08 5.13545 108.308C5.17153 108.403 5.20908 108.498 5.24442 108.593C5.27976 108.688 5.31804 108.783 5.35412 108.878L5.46677 109.173L5.50358 109.267C5.52125 109.314 5.53966 109.36 5.55807 109.407C5.65599 109.655 5.75612 109.903 5.85625 110.15L5.95786 110.397L5.977 110.444C6.05063 110.616 6.11984 110.789 6.19199 110.959L6.22218 111.033L6.31568 111.254C6.41778 111.494 6.52061 111.732 6.62418 111.971L6.71474 112.177L6.7545 112.265C6.82812 112.426 6.89733 112.588 6.96949 112.749C7.01955 112.86 7.06888 112.97 7.11674 113.082C7.1992 113.264 7.2824 113.445 7.36633 113.625C7.43358 113.772 7.50107 113.917 7.56881 114.058C7.64243 114.215 7.71606 114.372 7.78969 114.528C7.84712 114.649 7.90504 114.769 7.96345 114.889C8.03045 115.028 8.09892 115.167 8.16739 115.306C8.24764 115.47 8.32937 115.633 8.41109 115.797C8.49282 115.96 8.57602 116.126 8.65995 116.29C8.72523 116.419 8.79125 116.548 8.85801 116.676C8.91912 116.794 8.97949 116.911 9.0406 117.027L9.05901 117.063C9.12183 117.183 9.18466 117.303 9.24749 117.422C9.35106 117.618 9.45512 117.813 9.55967 118.005L9.80116 118.446C9.85638 118.546 9.91087 118.645 9.96609 118.741C10.0451 118.885 10.1246 119.028 10.2046 119.169L10.3033 119.344L10.3475 119.418C10.4991 119.685 10.6516 119.951 10.8017 120.209L10.9365 120.439C11.0256 120.592 11.1161 120.745 11.2067 120.897L11.3289 121.1C11.5196 121.418 11.711 121.734 11.8995 122.038L11.9496 122.119C12.0512 122.284 12.1535 122.446 12.2566 122.61L12.3582 122.77C12.3707 122.79 12.384 122.81 12.3965 122.831C12.409 122.851 12.4274 122.878 12.4421 122.904C12.5644 123.096 12.6871 123.287 12.8103 123.478C12.8176 123.49 12.825 123.502 12.8331 123.513C12.9494 123.692 13.066 123.87 13.1828 124.048C13.1828 124.048 13.1872 124.056 13.1902 124.06C13.4074 124.39 13.6386 124.732 13.8948 125.108L13.9338 125.164L14.0553 125.343L14.1974 125.547L14.2924 125.684L14.3601 125.781L14.5192 126.008C14.5236 126.013 14.5273 126.019 14.5309 126.025L14.5434 126.041C14.5434 126.047 14.5501 126.051 14.553 126.055C14.6502 126.193 14.7467 126.33 14.8475 126.467L14.9565 126.619L15.0662 126.77L15.1479 126.883C15.3018 127.096 15.4579 127.31 15.6162 127.524L15.6633 127.588L15.7524 127.709C15.8628 127.856 15.9738 128.003 16.0852 128.15C16.1397 128.224 16.1949 128.298 16.2494 128.371C16.3628 128.519 16.4764 128.666 16.5903 128.813L16.711 128.969C16.9716 129.306 17.2323 129.637 17.4856 129.953L17.5261 130.005C17.6497 130.159 17.7749 130.313 17.9001 130.467L18.0473 130.644C18.172 130.796 18.2972 130.948 18.4228 131.1L18.5362 131.235C18.9559 131.738 19.3859 132.241 19.8136 132.729L19.9219 132.852C20.0598 133.009 20.1987 133.166 20.3386 133.322L20.4343 133.429C20.893 133.94 21.362 134.45 21.8281 134.942L21.8744 134.992C22.0276 135.154 22.1817 135.315 22.3368 135.476L22.4104 135.554C22.6674 135.821 22.9258 136.087 23.1909 136.351L23.2189 136.379C23.6142 136.777 24.014 137.173 24.4146 137.557L24.4661 137.606C24.5029 137.643 24.5397 137.68 24.5787 137.714C24.7105 137.841 24.8423 137.967 24.9749 138.092L25.0485 138.162L25.0647 138.177C25.1898 138.296 25.3165 138.413 25.4424 138.531C25.516 138.605 25.5896 138.671 25.6669 138.74C25.7538 138.821 25.8414 138.901 25.9283 138.981L26.1153 139.152C26.2663 139.29 26.4172 139.426 26.5667 139.561L26.5711 139.564L26.5954 139.587L26.6123 139.602C26.7596 139.735 26.9105 139.869 27.0651 140.003L27.2448 140.162L27.5334 140.414C27.6608 140.524 27.7881 140.634 27.9155 140.743C27.9891 140.808 28.0627 140.873 28.1415 140.937L28.1975 140.985L28.2395 141.021L28.2623 141.042C28.4095 141.168 28.5627 141.294 28.7136 141.42L28.8049 141.494L28.8182 141.504C28.8506 141.531 28.8844 141.556 28.919 141.578C29.026 141.651 29.1418 141.709 29.2636 141.753H29.2695H29.2754C29.597 141.855 29.9336 141.902 30.2708 141.891C30.9681 141.891 31.9296 141.761 33.302 141.502C37.6651 140.676 59.0588 136.894 84.0101 133.475C91.453 132.455 99.0409 131.708 105.969 131.163C104.453 133.092 103.671 135.046 103.637 137.004C103.574 140.604 107.793 143.404 111.39 145.222C106.626 146.777 101.598 148.142 96.5509 149.138C93.2377 149.793 89.9937 150.35 86.8322 150.827C86.7985 150.608 86.7466 150.392 86.6768 150.181C86.0657 148.331 83.5757 147.04 79.6646 146.545C75.8758 146.065 71.0363 146.355 66.0378 147.361C59.2959 148.716 55.0204 150.791 53.8703 151.394C52.1033 152.32 51.4068 153.02 51.4568 153.81C51.5113 154.668 52.4442 155.125 53.2622 155.43L53.282 155.437L53.6347 155.56L53.687 155.579L54.0301 155.697C54.5845 155.887 55.1418 156.071 55.6845 156.244L55.7264 156.258L56.1513 156.391C56.4553 156.486 56.7675 156.581 57.0834 156.675L57.1254 156.688L57.16 156.699L57.213 156.714L57.4103 156.773C57.6039 156.83 57.7976 156.887 57.9912 156.942L58.1038 156.974C58.6079 157.117 59.1142 157.255 59.6228 157.387L59.6927 157.406L59.8068 157.436L59.823 157.44C60.0302 157.494 60.2375 157.546 60.4452 157.598L60.6226 157.644L60.7316 157.67L60.7839 157.683C60.9625 157.727 61.1419 157.77 61.3221 157.813L61.4119 157.835L61.6379 157.888L61.7601 157.916C61.9103 157.951 62.0608 157.986 62.2115 158.02L62.3514 158.052L62.5391 158.094L62.7791 158.147L63.1185 158.22L63.1767 158.233L63.4963 158.3L63.8489 158.374L64.0617 158.417H64.075L64.3135 158.466C64.5339 158.51 64.7548 158.553 64.9761 158.594L65.3892 158.668L65.7345 158.731L65.9296 158.766L66.0143 158.781L66.1822 158.811L66.3714 158.843L66.9243 158.935L67.0679 158.959L67.3248 159L67.5457 159.035L67.9264 159.094L68 159.105L68.0795 159.118L68.1767 159.132C68.4221 159.168 68.6643 159.202 68.9034 159.236L69.0823 159.26C69.1699 159.272 69.2583 159.285 69.3451 159.296L69.3923 159.303L69.915 159.37L70.0048 159.381L70.0586 159.388C70.1653 159.401 70.2728 159.413 70.3803 159.426C70.988 159.499 71.5964 159.565 72.2055 159.624C72.4019 159.643 72.5982 159.661 72.7945 159.679L73.1494 159.71L73.2231 159.716L73.2554 159.72C73.4837 159.739 73.7119 159.756 73.9409 159.773L74.0145 159.779C75.9936 159.926 77.9948 160 79.9783 160C85.8697 160.002 91.7435 159.357 97.494 158.076C103.066 156.83 108.487 154.988 113.665 152.582C115.72 151.626 117.734 150.582 119.708 149.449C119.72 149.442 119.734 149.437 119.747 149.43C120.804 148.823 121.846 148.192 122.872 147.538L122.903 147.518C123.165 147.351 123.425 147.183 123.685 147.013L123.855 146.902C124.068 146.762 124.281 146.62 124.494 146.478L124.72 146.325C124.917 146.193 125.112 146.059 125.309 145.924C125.483 145.804 125.657 145.683 125.83 145.562C125.972 145.462 126.115 145.363 126.256 145.262C126.44 145.132 126.624 145.001 126.803 144.869C126.863 144.825 126.924 144.782 126.984 144.738C127.184 144.591 127.383 144.444 127.582 144.297L127.668 144.233C127.802 144.132 127.939 144.033 128.073 143.931C132.533 140.57 136.631 136.754 140.301 132.546C140.48 132.341 140.658 132.134 140.835 131.927L140.885 131.868C141.055 131.669 141.224 131.469 141.391 131.269L141.458 131.19C141.624 130.989 141.79 130.788 141.955 130.587L142.014 130.514C142.183 130.307 142.35 130.101 142.514 129.893L142.547 129.853C143.164 129.081 143.776 128.283 144.366 127.484L144.394 127.446C144.983 126.647 145.565 125.826 146.122 125.011L146.13 124.999L146.146 124.977C146.299 124.752 146.451 124.527 146.601 124.301L146.643 124.237C146.791 124.015 146.938 123.792 147.085 123.568L147.129 123.501C147.276 123.274 147.423 123.046 147.57 122.817L147.595 122.779C148.828 120.833 149.991 118.81 151.055 116.761L151.064 116.745L151.068 116.736C151.196 116.49 151.323 116.243 151.448 115.993L151.472 115.947C151.598 115.697 151.722 115.446 151.847 115.194L151.86 115.166C152.455 113.953 153.02 112.717 153.553 111.47C153.594 111.376 153.634 111.283 153.674 111.19C153.723 111.074 153.772 110.957 153.821 110.839C153.885 110.692 153.948 110.538 154.01 110.387C154.062 110.261 154.113 110.134 154.164 110.007C154.22 109.867 154.278 109.728 154.334 109.588C154.39 109.448 154.45 109.294 154.508 109.146C154.551 109.038 154.594 108.931 154.636 108.822V108.816C154.645 108.791 154.655 108.765 154.666 108.742C154.666 108.733 154.672 108.724 154.675 108.714C154.85 108.19 154.694 107.814 154.534 107.591C154.066 106.944 152.964 106.311 145.239 106.311C145.129 106.311 133.653 106.369 112.311 108.415C103.74 109.238 93.7118 110.409 83.6353 111.698C86.3595 109.563 88.6088 107.585 90.2381 105.614C91.3698 104.244 92.176 102.914 92.6848 101.574C103.103 99.1184 113.98 96.6463 124.24 94.4423C140.526 90.9437 152.544 88.1042 156.388 86.8464C157.111 86.6101 158.539 86.0165 159.301 85.2912L159.306 85.286C159.592 85.0093 159.784 84.6513 159.859 84.261C159.873 84.2131 159.883 84.1637 159.886 84.1137V84.1093V84.099C159.92 83.4178 159.946 82.7286 159.963 82.0481V81.9259C159.97 81.6468 159.974 81.3699 159.979 81.0953L159.994 80.9833ZM82.4043 8.48663C63.0758 8.751 46.0792 11.4396 39.067 12.7083C51.3788 5.19866 65.4577 1.2472 79.9908 1.2472C92.7168 1.22863 105.256 4.30768 116.526 10.2186L116.537 10.2245C117.42 10.7068 118.623 11.4381 119.678 12.3269C119.541 12.2746 119.399 12.2223 119.254 12.1715C111.652 9.49328 99.2544 8.25246 82.4043 8.48663ZM14.4838 36.2757L14.7783 35.8398L14.8615 35.7175C15.209 35.2595 16.1978 34.4819 18.9294 33.3662C21.0012 32.5201 23.7482 31.6136 27.0946 30.6711C33.0458 28.995 40.605 27.2918 47.8329 25.9979C58.3777 24.1106 65.9929 22.9935 71.3603 23.263C74.0845 23.3992 76.1512 23.8911 77.6752 24.766C79.1993 25.6408 80.2242 26.9346 80.8029 28.7182C81.439 30.677 81.2447 32.6534 80.2043 34.7565C79.2354 36.7205 77.5089 38.7809 75.0733 40.8811C70.8523 44.5233 64.597 48.2737 55.9481 52.3489C46.1778 56.9528 31.6344 63.7025 17.8346 69.7122C7.78674 74.0885 3.19834 76.4641 1.25754 78.0238C1.61288 63.1339 6.20055 48.6531 14.4838 36.2757ZM54.4542 152.539C55.5674 151.955 59.7089 149.947 66.2874 148.624C71.1564 147.644 75.853 147.36 79.5108 147.823C82.8667 148.248 85.0467 149.263 85.4907 150.61C85.9244 151.921 85.2816 153.085 83.4689 154.272C81.7696 155.387 79.362 156.271 77.4271 156.982C75.6174 157.644 74.471 158.08 73.8562 158.553C68.6428 158.152 63.4824 157.232 58.4514 155.807L58.3387 155.775C58.148 155.72 57.9573 155.664 57.7674 155.609C57.1982 155.441 56.6401 155.27 56.1071 155.101L56.0688 155.088C55.5328 154.918 54.9843 154.736 54.4387 154.55L54.1008 154.433L54.0485 154.414L53.7098 154.297C52.9735 154.023 52.7711 153.826 52.7203 153.761C52.7674 153.657 53.0332 153.285 54.4542 152.539ZM104.892 137.06C104.987 131.573 112.107 125.913 125.482 120.688C133.581 117.521 141.239 114.98 145.814 113.46C147.94 112.753 149.348 112.286 149.975 112.033C150.924 111.652 151.746 111.323 152.434 110.968C145.8 126.473 134.24 139.574 119.614 148.107C119.158 147.643 118.252 147.027 116.308 146.123C116.068 146.012 115.742 145.871 115.366 145.708C112.481 144.462 104.821 141.148 104.892 137.06ZM111.96 43.2692C118.972 41.1241 126.911 39.8133 133.044 38.912C136.116 38.4598 138.595 38.3148 140.514 38.3148C141.712 38.3148 142.692 38.3715 143.459 38.4459C146.331 38.7227 147.442 39.3612 147.628 39.6602C147.718 39.8074 147.808 39.9532 147.897 40.0976C155.022 52.1925 158.769 65.9791 158.746 80.0172C158.746 80.6328 158.738 81.2757 158.723 81.9281V82.0489C158.723 82.2079 158.714 82.3677 158.709 82.5275C158.576 82.4771 158.44 82.4345 158.302 82.4001C154.334 81.4082 147.266 80.2698 140.432 79.1689C135.989 78.4524 131.791 77.7764 128.726 77.1843C127.989 77.0422 127.17 76.8897 126.303 76.7292C120.781 75.7064 113.214 74.3043 106.64 71.7792C103.071 70.4088 100.215 68.8506 98.1493 67.1473C95.7933 65.2018 94.3944 63.0081 94.0034 60.6273C93.5101 57.6435 94.1507 54.9078 95.9133 52.4961C98.6006 48.8105 104.001 45.7066 111.962 43.2707L111.96 43.2692ZM89.2832 104.852C86.7284 107.945 82.514 111.111 77.2703 114.94C65.9024 123.237 61.78 125.415 51.5305 130.49C40.9518 135.73 35.1118 138.027 30.4733 139.768C29.9432 139.968 29.578 140.155 29.3284 140.329L29.0913 140.129L29.0685 140.109L28.9558 140.013C28.4405 139.571 27.9251 139.124 27.4318 138.682L27.4148 138.666L27.4082 138.66C26.9186 138.218 26.4201 137.762 25.9268 137.295L25.8348 137.207C25.7047 137.084 25.5749 136.959 25.4453 136.835C21.7947 133.327 18.4878 129.478 15.5698 125.34L15.5558 125.321C15.1921 124.805 14.8276 124.273 14.4728 123.742L14.4028 123.636C14.0708 123.139 13.7402 122.628 13.417 122.119L13.3183 121.964C13.2172 121.804 13.1166 121.643 13.0164 121.482L12.9664 121.401C12.7816 121.102 12.5931 120.792 12.4046 120.478L12.2846 120.278C12.1957 120.13 12.1071 119.98 12.0188 119.828L11.8863 119.6C11.739 119.347 11.5918 119.085 11.4394 118.822L11.3944 118.744L11.2987 118.574C11.2202 118.434 11.1417 118.293 11.0631 118.153L10.9019 117.858C10.8224 117.711 10.7421 117.563 10.6641 117.422C10.561 117.232 10.4586 117.04 10.357 116.848C10.2945 116.731 10.2334 116.613 10.1715 116.496L10.1531 116.46L9.97345 116.114C9.90792 115.988 9.84239 115.862 9.7776 115.734C9.69612 115.573 9.61464 115.411 9.53316 115.248C9.45217 115.088 9.37266 114.926 9.29314 114.765C9.22614 114.629 9.1584 114.492 9.09214 114.355C9.03471 114.236 8.97802 114.119 8.92133 114C8.8477 113.846 8.77407 113.692 8.70045 113.538C8.63345 113.395 8.56718 113.254 8.50092 113.111C8.41846 112.933 8.33649 112.755 8.25501 112.577C8.20592 112.467 8.15684 112.357 8.10775 112.249C8.03413 112.09 7.96565 111.932 7.89571 111.772L7.85595 111.683L7.7676 111.482C7.6655 111.248 7.56439 111.013 7.46426 110.777L7.37296 110.56L7.34204 110.486C7.27136 110.317 7.20092 110.147 7.13073 109.977L7.11085 109.93C7.07772 109.85 7.04459 109.769 7.01219 109.688C6.91402 109.443 6.81585 109.199 6.71768 108.957C6.70001 108.912 6.68308 108.867 6.66541 108.823L6.62786 108.727C6.55374 108.538 6.48012 108.348 6.40698 108.158C6.3709 108.064 6.33335 107.97 6.29949 107.876C6.21457 107.652 6.13088 107.428 6.04842 107.202L5.98216 107.023C5.89577 106.787 5.8111 106.551 5.72814 106.314C5.69648 106.226 5.66556 106.137 5.63464 106.048C5.56248 105.843 5.49156 105.638 5.42186 105.431L5.35338 105.233C5.26552 104.972 5.17889 104.711 5.09348 104.449L5.01986 104.21C4.95359 104.006 4.8888 103.801 4.82401 103.596L4.75038 103.362C4.66792 103.096 4.58693 102.83 4.50742 102.564L4.4522 102.375C4.3879 102.158 4.32458 101.941 4.26224 101.723L4.18861 101.473C4.11204 101.203 4.03694 100.933 3.96332 100.663C3.9081 100.456 3.85361 100.249 3.79913 100.04C3.69237 99.5801 3.69163 99.0904 4.86524 98.6066L5.04415 98.5329C11.6286 95.7972 20.0794 93.2052 28.8417 91.2346C42.7741 88.099 55.5873 86.5438 70.3892 86.1756C76.065 86.0364 81.1217 86.895 85.0136 88.6587C88.6265 90.2964 91.0112 92.661 91.7283 95.3171C92.6538 98.7465 91.8999 101.687 89.2832 104.853V104.852Z",\n fill: "#231F20"\n }\n )\n }\n), EV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "48",\n viewBox: "0 0 160 48",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M57.7234 12.2924C57.3418 12.3007 56.9724 12.1559 56.696 11.8896C56.4238 11.5935 56.2725 11.2041 56.2725 10.7997C56.2725 10.3953 56.4238 10.0059 56.696 9.70982C56.9762 9.44923 57.3428 9.30463 57.7234 9.30463C58.1039 9.30463 58.4706 9.44923 58.7508 9.70982C59.023 10.0059 59.1743 10.3953 59.1743 10.7997C59.1743 11.2041 59.023 11.5935 58.7508 11.8896C58.4743 12.1559 58.105 12.3007 57.7234 12.2924ZM58.8524 27.3308H56.5944V14.595H58.8524V27.3308Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M62.7304 14.9635C63.2479 14.8321 63.9338 14.6931 64.788 14.5464C65.7643 14.3895 66.7519 14.3159 67.7404 14.3265C68.5911 14.2995 69.4385 14.4452 70.2327 14.755C70.854 15.0113 71.4001 15.4244 71.8189 15.9549C72.2285 16.5008 72.513 17.1322 72.6516 17.8032C72.8195 18.5839 72.9009 19.3812 72.8943 20.1801V27.3222H70.6363V20.6686C70.6444 19.9985 70.5915 19.3291 70.4782 18.6689C70.4019 18.1871 70.2248 17.7274 69.9589 17.3204C69.7172 16.9794 69.3799 16.7197 68.9908 16.5748C68.5079 16.4076 67.9993 16.3292 67.4892 16.3434C67.2464 16.3434 66.9981 16.3434 66.7412 16.3662C66.4844 16.3891 66.236 16.4034 66.0017 16.4291C65.7674 16.4548 65.5586 16.4805 65.3723 16.5148L64.9743 16.5862V27.3394H62.7163L62.7304 14.9635Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M78.5083 14.595H83.2755V16.5062H78.5083V22.3828C78.4988 22.9133 78.548 23.4432 78.6551 23.9626C78.7244 24.3184 78.8731 24.6536 79.0897 24.9425C79.2803 25.1755 79.5316 25.3496 79.8151 25.4453C80.1441 25.5481 80.487 25.5973 80.8312 25.591C81.3851 25.6097 81.938 25.5314 82.4655 25.3596C82.8776 25.2025 83.1626 25.0939 83.3122 25.0282L83.7497 26.9137C83.3658 27.0865 82.9695 27.2298 82.5643 27.3422C81.9346 27.5225 81.2823 27.6091 80.628 27.5993C79.9083 27.6212 79.1907 27.5089 78.5111 27.2679C77.9826 27.0673 77.5181 26.7245 77.1676 26.2766C76.8111 25.7954 76.5669 25.2387 76.4535 24.6482C76.3069 23.9111 76.2378 23.1603 76.2475 22.4085V11.044L78.5055 10.6526L78.5083 14.595Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M85.1864 20.9857C85.1653 19.9805 85.3279 18.98 85.6662 18.0346C85.9508 17.2569 86.3865 16.5449 86.9477 15.9406C87.4657 15.3959 88.0933 14.9702 88.7879 14.6921C89.4647 14.4176 90.187 14.276 90.9161 14.275C92.6096 14.275 93.908 14.8102 94.8112 15.8806C95.7144 16.9509 96.166 18.5793 96.166 20.7658V21.1457C96.1676 21.2889 96.1601 21.432 96.1434 21.5742H87.5347C87.6307 22.896 88.007 23.9007 88.6637 24.5882C89.3204 25.2757 90.3554 25.6186 91.7685 25.6167C92.4396 25.6289 93.1096 25.5588 93.764 25.4081C94.1807 25.31 94.5878 25.1742 94.9805 25.0024L95.2967 26.9137C94.8357 27.1232 94.3528 27.2794 93.8572 27.3793C93.09 27.5515 92.3059 27.6339 91.5201 27.625C90.5493 27.6473 89.5836 27.4765 88.6779 27.1222C87.9238 26.8196 87.2481 26.3467 86.7021 25.7395C86.1765 25.132 85.7849 24.4182 85.5533 23.6454C85.2991 22.7827 85.1753 21.886 85.1864 20.9857ZM93.8261 19.7373C93.8786 18.8277 93.6083 17.929 93.064 17.2033C92.8058 16.8772 92.4751 16.6174 92.0989 16.4452C91.7227 16.2729 91.3117 16.193 90.8992 16.212C90.4253 16.2012 89.9557 16.3061 89.5303 16.5176C89.1467 16.7125 88.8052 16.9824 88.5254 17.3118C88.2472 17.6464 88.0302 18.0285 87.8847 18.4403C87.7334 18.8589 87.632 19.2943 87.5827 19.7373H93.8261Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M103.694 14.3264C103.915 14.3275 104.137 14.3399 104.357 14.3636C104.608 14.3864 104.854 14.4207 105.096 14.4607C105.339 14.5007 105.559 14.5407 105.763 14.5835C105.913 14.6115 106.062 14.6478 106.209 14.6921L105.822 16.6776C105.532 16.5819 105.237 16.5037 104.938 16.4434C104.416 16.3444 103.886 16.2994 103.355 16.3091C102.936 16.3095 102.517 16.3545 102.107 16.4434C101.695 16.5348 101.427 16.5948 101.297 16.629V27.3308H99.0393V15.1349C99.6847 14.9059 100.345 14.7216 101.015 14.5835C101.896 14.4024 102.794 14.3162 103.694 14.3264Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M110.504 14.595H115.272V16.5062H110.504V22.3828C110.495 22.9133 110.544 23.4432 110.651 23.9626C110.72 24.3184 110.869 24.6536 111.086 24.9425C111.276 25.1755 111.528 25.3496 111.811 25.4453C112.14 25.5481 112.483 25.5973 112.827 25.591C113.381 25.6097 113.934 25.5314 114.462 25.3596C114.874 25.2025 115.159 25.0939 115.308 25.0282L115.746 26.9137C115.362 27.0865 114.966 27.2298 114.56 27.3422C113.931 27.5225 113.278 27.6091 112.624 27.5993C111.904 27.6212 111.187 27.5089 110.507 27.2679C109.978 27.0687 109.513 26.7257 109.164 26.2766C108.807 25.7954 108.563 25.2387 108.45 24.6482C108.303 23.9111 108.234 23.1603 108.244 22.4085V11.044L110.502 10.6526L110.504 14.595Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M122.76 14.3265C122.952 14.3265 123.175 14.3265 123.426 14.3636C123.677 14.4008 123.92 14.4208 124.163 14.4608C124.405 14.5008 124.625 14.5408 124.829 14.5836C124.979 14.6116 125.128 14.6478 125.275 14.6922L124.899 16.6777C124.61 16.582 124.315 16.5038 124.016 16.4434C123.494 16.3443 122.963 16.2993 122.432 16.3091C122.013 16.3095 121.595 16.3545 121.185 16.4434C120.776 16.5348 120.505 16.5948 120.375 16.6291V27.3308H118.117V15.135C118.762 14.9063 119.422 14.7221 120.092 14.5836C120.97 14.4033 121.864 14.3171 122.76 14.3265Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M137.996 26.9623C137.48 27.0937 136.798 27.2327 135.949 27.3794C134.978 27.5352 133.995 27.6088 133.011 27.5993C132.176 27.6238 131.345 27.4781 130.567 27.1708C129.94 26.9129 129.39 26.4957 128.969 25.9595C128.553 25.4112 128.256 24.7805 128.097 24.1083C127.912 23.3349 127.823 22.5413 127.832 21.7457V14.6036H130.09V21.2657C130.09 22.8161 130.332 23.9264 130.815 24.5968C131.299 25.2672 132.113 25.6015 133.259 25.5996C133.502 25.5996 133.753 25.5996 134.01 25.5767C134.267 25.5539 134.51 25.5396 134.736 25.5139C134.961 25.4881 135.167 25.4653 135.354 25.4396C135.489 25.4283 135.623 25.3995 135.752 25.3539V14.595H138.01L137.996 26.9623Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M144.795 25.6881C145.712 25.6881 146.395 25.5681 146.839 25.3224C147.05 25.2124 147.226 25.0426 147.344 24.8337C147.462 24.6248 147.518 24.3858 147.505 24.1454C147.512 23.8873 147.456 23.6313 147.342 23.4005C147.228 23.1696 147.059 22.9711 146.85 22.8227C146.177 22.3724 145.454 22.0033 144.696 21.7228C144.214 21.5257 143.748 21.3257 143.305 21.1229C142.891 20.9365 142.504 20.6932 142.156 20.4001C141.833 20.1219 141.57 19.7796 141.383 19.3945C141.178 18.9415 141.082 18.4464 141.1 17.9489C141.081 17.4353 141.183 16.9244 141.398 16.4585C141.612 15.9926 141.933 15.5849 142.334 15.2692C143.158 14.6064 144.279 14.275 145.698 14.275C146.054 14.2761 146.409 14.2971 146.762 14.3379C147.118 14.3779 147.448 14.4264 147.756 14.4836C148.063 14.5407 148.32 14.6036 148.566 14.6693C148.811 14.735 148.981 14.7892 149.111 14.8407L148.699 16.8005C148.337 16.6255 147.959 16.4895 147.57 16.3948C146.96 16.2444 146.334 16.1743 145.707 16.1862C145.135 16.1722 144.57 16.3028 144.061 16.5662C143.842 16.6731 143.659 16.8427 143.534 17.0539C143.409 17.2651 143.348 17.5087 143.358 17.7547C143.354 18.0085 143.408 18.26 143.516 18.4889C143.634 18.7128 143.799 18.9079 143.999 19.0602C144.251 19.2503 144.524 19.4104 144.812 19.5373C145.134 19.683 145.52 19.8373 145.972 20.003C146.569 20.2315 147.101 20.4553 147.57 20.6743C148.003 20.8719 148.406 21.1317 148.766 21.4457C149.095 21.7392 149.356 22.1032 149.528 22.5113C149.719 22.998 149.811 23.519 149.797 24.0426C149.797 25.2158 149.365 26.1052 148.501 26.7108C147.637 27.3165 146.408 27.6193 144.812 27.6193C143.932 27.6459 143.052 27.5498 142.198 27.3336C141.568 27.1432 141.14 27.0003 140.914 26.9051L141.326 24.9453C141.583 25.0424 141.995 25.191 142.56 25.3853C143.284 25.6062 144.039 25.7085 144.795 25.6881Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M154.761 14.595H159.529V16.5062H154.761V22.3828C154.752 22.9133 154.801 23.4432 154.908 23.9626C154.977 24.3184 155.126 24.6536 155.343 24.9425C155.533 25.1755 155.785 25.3496 156.068 25.4453C156.397 25.5481 156.74 25.5973 157.084 25.591C157.638 25.6097 158.191 25.5314 158.719 25.3596L159.565 25.0282L160 26.9137C159.616 27.0865 159.22 27.2298 158.814 27.3422C158.185 27.5225 157.533 27.6091 156.878 27.5993C156.159 27.6212 155.441 27.5089 154.761 27.2679C154.233 27.0673 153.768 26.7245 153.418 26.2766C153.061 25.7954 152.817 25.2387 152.704 24.6482C152.557 23.9111 152.488 23.1603 152.498 22.4085V11.044L154.756 10.6526L154.761 14.595Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M0.787476 30.2048C0.908844 30.6676 1.04433 31.1275 1.19392 31.5789C1.31811 31.956 1.44794 32.3274 1.58907 32.6959C1.7302 33.0645 1.87132 33.4273 2.03785 33.7873C2.54255 34.9375 3.13618 36.0456 3.81321 37.1012C5.36278 36.5984 8.73851 35.3014 14.2565 33.7501C18.5524 32.5445 28.1518 30.1362 36.9496 28.2221C42.5579 27.0051 45.6062 26.2395 46.5461 25.9367C46.8361 25.8461 47.107 25.7018 47.3449 25.511C47.4146 25.4432 47.4568 25.3515 47.4634 25.2539C47.4832 24.8511 47.4945 24.4454 47.4945 24.0397C47.4957 22.151 47.2768 20.2687 46.8425 18.4318C42.7216 19.6831 31.6715 22.0028 22.4023 24.2626C12.5433 26.6766 4.01926 29.2877 0.787476 30.2048Z",\n fill: "url(#paint0_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M1.11198 16.732V16.7548V16.7891C1.09222 16.8519 1.07247 16.9119 1.05553 16.9748V17.0205C1.02166 17.1272 0.990614 17.2329 0.962389 17.3376C0.931341 17.4433 0.900295 17.5519 0.87207 17.6576C11.3323 15.0864 18.6963 12.9866 25.0469 10.9754C28.767 9.79842 31.4964 8.7271 33.3395 7.78435L33.4665 7.7215L33.5032 7.7015L33.5907 7.65579L33.6358 7.63008L33.7121 7.59008L33.7318 7.5758L33.8024 7.53866C33.8174 7.52756 33.8335 7.51799 33.8504 7.51009L33.9181 7.47295L33.9661 7.44724L34.0338 7.40725L34.0762 7.38439L34.1495 7.34154L34.1862 7.32154L34.2822 7.2644L34.3866 7.20155L34.4177 7.18155L34.4854 7.14156L34.5249 7.11585L34.5842 7.07871L34.6209 7.05585L34.6774 7.01872L34.7169 6.99301L34.7705 6.95872L34.8072 6.93301L34.8636 6.89587L34.8975 6.87302L34.954 6.83302L34.9822 6.81302L35.064 6.75589C35.6681 6.31879 36.5543 5.52459 36.4922 4.58184C36.4909 4.57332 36.4909 4.56463 36.4922 4.55612C36.4471 4.09617 36.0322 3.43624 34.7733 2.73918L34.6943 2.69632L34.6011 2.64776L34.4741 2.58205L34.429 2.55919L34.1467 2.42207L34.0875 2.3935L33.9463 2.32493L33.8758 2.29065L33.7657 2.23923L33.6866 2.19923L33.6048 2.16209L33.5173 2.1221L33.4411 2.08781L33.3479 2.04496L33.2802 2.01639L33.1814 1.97069L33.1306 1.94783L32.7411 1.78213H32.7072L32.5859 1.73357L32.5435 1.71643L32.4222 1.66786L32.3826 1.65358L32.2556 1.60215H32.2331L31.629 1.37646L31.4738 1.29076H31.454L31.3073 1.23934C31.0448 1.15077 30.7823 1.06793 30.5198 0.987934L30.3674 0.942223C30.1444 0.876516 29.9186 0.813668 29.6928 0.756531C29.7067 0.912389 29.7067 1.06919 29.6928 1.22505C29.6104 1.77957 29.3352 2.2861 28.9166 2.65347C28.0219 3.51052 26.2493 4.399 24.0449 5.18463C21.691 6.02454 16.7995 7.65579 12.4726 8.75567C9.5626 9.49274 5.73245 10.4526 3.88934 10.8583L3.67765 11.1897L3.64378 11.2468L3.55911 11.384V11.404L3.54217 11.4325L3.51959 11.4668C3.49419 11.5125 3.46596 11.5582 3.43774 11.6039L3.41798 11.6382L3.38975 11.6839C3.36153 11.7296 3.33331 11.7782 3.3079 11.8268L3.11597 12.161C3.11597 12.1867 3.09057 12.2096 3.07928 12.2324L2.99743 12.3781L2.96356 12.4438C2.93533 12.4924 2.90993 12.541 2.88453 12.5895C2.85912 12.6381 2.86477 12.6267 2.85348 12.6467V12.6667C2.82525 12.7153 2.79985 12.7667 2.77162 12.8181L2.58816 13.1809C2.58816 13.2009 2.5684 13.2181 2.55993 13.2381L2.48373 13.3952L2.46115 13.438L2.44704 13.4637C2.42163 13.5152 2.39623 13.5666 2.37365 13.6209L2.33978 13.6894L2.21277 13.9751C2.17043 14.0665 2.12809 14.1608 2.08857 14.2608L2.07446 14.2922V14.3065L2.0039 14.4722V14.4922L1.98132 14.5436L1.91358 14.7093L1.88535 14.7722C1.84584 14.8693 1.80632 14.9664 1.76963 15.0579C1.73011 15.155 1.69342 15.2521 1.65673 15.3435V15.3693C1.63415 15.4292 1.61157 15.4892 1.59181 15.5464L1.56641 15.6092C1.54665 15.6692 1.52407 15.7264 1.50432 15.7863V15.8092V15.8435C1.46762 15.9463 1.43093 16.0492 1.39706 16.1492C1.36037 16.252 1.3265 16.3549 1.29263 16.4606L1.11198 16.732Z",\n fill: "url(#paint1_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M0.908795 24.3796C1.55515 24.3796 3.22043 24.2968 5.06918 24.1197C8.28967 23.8054 14.7278 22.9598 22.072 21.997C27.7904 21.2485 40.2998 19.4116 46.8424 18.4431L46.8114 18.306C46.7916 18.2231 46.769 18.1403 46.7493 18.0546C46.7493 18.026 46.7323 17.9975 46.7267 17.9689L46.6844 17.7975L46.659 17.7089L46.5997 17.4889C46.5937 17.4722 46.589 17.455 46.5856 17.4375L46.5348 17.2604L46.5178 17.2061L46.4924 17.1175L46.4416 16.9461C46.4416 16.9147 46.4219 16.8861 46.4134 16.8547L46.3541 16.669V16.6376C46.3541 16.6176 46.34 16.5947 46.3316 16.5747C46.3231 16.5548 46.3061 16.4919 46.292 16.449C46.2779 16.4062 46.2723 16.3919 46.2638 16.3633L46.2328 16.2719C46.2158 16.2205 46.1989 16.1691 46.1791 16.1177C46.1594 16.0662 46.1594 16.0548 46.1481 16.0234L46.0719 15.812C46.0719 15.7863 46.0549 15.7605 46.0437 15.7348C46.0324 15.7091 46.0295 15.6948 46.0239 15.6748L45.9731 15.5434L45.9392 15.4463L45.9138 15.3834L45.8687 15.2892C45.8545 15.2577 45.8433 15.2235 45.832 15.192C45.8207 15.1606 45.8066 15.132 45.7953 15.1035C45.784 15.0749 45.7642 15.0263 45.7501 14.9863C45.736 14.9464 45.7247 14.9264 45.7134 14.8978L45.688 14.8378L45.6429 14.7264L45.6005 14.6235C45.5808 14.5778 45.5582 14.5293 45.5384 14.4807L45.4961 14.3807L45.4594 14.295L45.4086 14.1836C45.3945 14.1493 45.3775 14.115 45.3634 14.0836L45.3211 13.9865C45.3105 13.967 45.3011 13.947 45.2929 13.9265L45.2449 13.8236C45.2251 13.7808 45.2054 13.7408 45.1884 13.6979C45.1715 13.6636 45.1546 13.6322 45.1405 13.5979L45.0473 13.4065L44.9937 13.298L44.9457 13.2008L44.9316 13.1723V13.1551C44.9118 13.1208 44.8949 13.0837 44.878 13.0494C44.8703 13.0377 44.8637 13.0252 44.8582 13.0123L44.8102 12.9209L44.7594 12.818L44.6578 12.6266L44.5985 12.518L44.5336 12.4038V12.3866L44.4743 12.2809C44.4661 12.2695 44.4594 12.257 44.4546 12.2438C44.4376 12.2152 44.4207 12.1866 44.4066 12.1581L44.3473 12.0552L44.2937 11.9638L44.2316 11.8553L44.1639 11.7438C42.4901 11.9867 40.4579 12.2781 37.9543 12.6266C32.4673 13.3951 26.3058 14.415 20.0003 15.2406C10.3106 16.509 3.97123 17.4461 0.855167 17.7003C0.855167 17.7518 0.826942 17.8003 0.815652 17.8518V17.8803L0.798717 17.9403L0.764844 18.0746C0.764844 18.1117 0.745089 18.1489 0.736621 18.186L0.722508 18.2374V18.2689V18.2946L0.705574 18.3688C0.264981 20.2146 0.0413927 22.1065 0.0394596 24.0054C0.00276686 24.2368 0.358404 24.3768 0.908795 24.3796Z",\n fill: "url(#paint2_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M41.635 39.8209C40.0487 41.315 34.3585 44.0233 28.722 45.1518C24.3381 46.015 19.8827 46.4522 15.4166 46.4574C15.5165 46.5654 15.6432 46.6444 15.7836 46.6859C16.1674 46.823 16.5541 46.9516 16.9464 47.0687C17.113 47.1201 17.2823 47.1687 17.4488 47.2144H17.4714L17.6972 47.2744H17.7311L17.9738 47.3373H18.0049L18.2081 47.3858L18.273 47.4001L18.4875 47.4515H18.5411L18.7303 47.4944L18.8262 47.5144L18.9674 47.543L19.069 47.563L19.2637 47.6029L19.3879 47.6258L19.4895 47.6458L19.6222 47.6687H19.6786L19.9609 47.7172H20.0286L20.1867 47.7401H20.2149L20.5621 47.7886H20.5762L20.7596 47.8115L21.3242 47.8743L21.708 47.9115C22.3666 47.9667 23.0318 47.9943 23.7035 47.9943C27.0962 48.0098 30.4526 47.2882 33.546 45.8782C36.6394 44.4681 39.3979 42.4025 41.635 39.8209Z",\n fill: "url(#paint3_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M43.2635 32.1902C42.651 32.1902 39.1229 32.2731 33.4327 32.8273C25.9756 33.5501 15.1174 35.1356 10.7255 35.8927C7.99614 36.3641 5.45305 36.9155 3.9176 37.264C3.98534 37.3697 4.05591 37.4754 4.12647 37.5782L4.17445 37.6497L4.26478 37.7811L4.31558 37.8553L4.40872 37.9868L4.43977 38.0325L4.63735 38.3039L4.67686 38.361L4.77565 38.4924L4.82363 38.5581L4.92524 38.6924C4.92524 38.7095 4.95065 38.7238 4.96194 38.7381L5.19056 39.0238L5.20467 39.0381L5.31475 39.1781L5.35709 39.2323C5.39378 39.2781 5.43047 39.3238 5.46999 39.3666L5.50386 39.4095C5.62805 39.5609 5.75506 39.6952 5.88208 39.858L5.91312 39.8951L6.03732 40.0351L6.06554 40.0665C6.20102 40.2208 6.33932 40.3722 6.48045 40.5208L6.49456 40.5379L6.63004 40.6836L6.65262 40.7065C6.84738 40.9093 7.04495 41.1121 7.24817 41.3093L7.26229 41.3236C7.46833 41.5235 7.6772 41.7207 7.88889 41.9121C8.1034 42.1092 8.32073 42.3006 8.54371 42.4834C8.66225 42.5863 8.92192 42.6034 9.73481 42.4491C11.4283 42.1206 17.8298 40.9979 24.9115 40.0151C29.8129 39.371 34.7457 39.001 39.6874 38.9067C40.9321 38.9067 42.1119 39.1923 41.6377 39.8009C41.6913 39.738 41.7421 39.6752 41.7958 39.6152V39.6009L41.9482 39.418L42.0978 39.2381L42.1147 39.2152L42.2643 39.0295C42.4478 38.7953 42.6284 38.5581 42.8034 38.3182C42.9784 38.0753 43.1506 37.8325 43.3171 37.584L43.4526 37.3811V37.3611L43.5824 37.1611V37.144L43.7123 36.9383C44.0792 36.3527 44.4235 35.7499 44.7397 35.1328C44.7792 35.0585 44.8159 34.9842 44.8526 34.9071L44.9626 34.6814C45.2675 34.0491 45.545 33.4054 45.7953 32.7502C45.9957 32.3988 45.7106 32.1902 43.2635 32.1902Z",\n fill: "url(#paint4_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M19.8056 2.76768C20.0003 1.33927 16.2492 1.57067 16.0827 1.27356C14.1379 1.94509 12.2877 2.8699 10.5788 4.02469C10.5054 4.07612 10.4743 4.18182 10.8159 4.25324C11.9525 4.45361 13.1029 4.56346 14.2565 4.58178C16.6218 4.60178 19.6193 4.07612 19.8056 2.76768Z",\n fill: "url(#paint5_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M44.607 33.5473C44.0143 33.7873 40.7966 34.7786 37.2826 36.167C33.6133 37.6154 31.0364 39.3724 31.0053 41.295C30.9771 42.8206 33.8674 43.9033 34.5278 44.2147C35.1883 44.5261 35.4706 44.7347 35.5468 44.8918C40.2747 42.1438 43.9288 37.8382 45.8997 32.6931C45.7332 33.0816 45.3042 33.2588 44.607 33.5473Z",\n fill: "url(#paint6_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M5.22448 21.0858C9.39616 19.2459 13.7711 17.1919 16.6303 15.8263C21.1068 13.6923 25.0131 11.0925 24.1636 8.44424C23.4071 6.0845 20.2967 6.36733 14.09 7.49292C10.099 8.2157 4.82086 9.54699 4.10958 10.5097L4.08136 10.5497L3.99386 10.684C1.4466 14.5317 0.059042 19.0457 0 23.6769C0 23.7797 0 23.8855 0 23.9883C0.00564503 23.5741 1.52134 22.717 5.22448 21.0858Z",\n fill: "url(#paint7_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M39.5858 11.401C34.7198 12.1238 26.9946 13.5722 27.7482 18.1917C28.3296 21.7485 35.3492 22.7855 38.2846 23.3598C40.6132 23.814 45.1716 24.4425 47.1219 24.9367C47.3816 25.0024 47.4635 25.1281 47.4578 25.271C47.4578 25.0682 47.4747 24.8625 47.4804 24.6568V24.6196C47.4804 24.4292 47.4804 24.2387 47.4804 24.0483C47.49 19.7635 46.3632 15.5546 44.2176 11.861L44.1357 11.7267C43.893 11.3068 42.1995 11.0039 39.5858 11.401Z",\n fill: "url(#paint8_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M27.4349 28.6135C26.972 26.8766 24.4571 25.6167 20.8669 25.7053C16.6715 25.7872 12.4952 26.3012 8.40265 27.2394C5.94165 27.773 3.53145 28.5234 1.19959 29.482C0.827014 29.6363 0.702822 29.842 0.770562 30.1362L0.821365 30.3248L0.889107 30.5733C0.889107 30.599 0.903222 30.6247 0.908867 30.6504L0.968137 30.8504L0.985072 30.9076C1.00765 30.9876 1.03306 31.0704 1.05846 31.1504L1.07822 31.2218L1.13749 31.4104C1.14629 31.4337 1.15383 31.4576 1.16007 31.4818C1.1883 31.5618 1.2137 31.6418 1.2391 31.7218C1.24695 31.7413 1.25355 31.7614 1.25886 31.7818C1.28144 31.8446 1.30402 31.9075 1.32377 31.9703C1.34353 32.0332 1.34353 32.0246 1.352 32.0503L1.42821 32.2674C1.43603 32.285 1.44263 32.3032 1.44796 32.3217L1.52417 32.5274L1.55804 32.6131C1.5778 32.6731 1.60038 32.7302 1.62296 32.7874L1.65119 32.8588L1.73868 33.0816C1.73868 33.1102 1.76409 33.1388 1.77538 33.1702L1.83747 33.3244C1.85159 33.353 1.86288 33.3844 1.87699 33.413C1.90521 33.4844 1.93626 33.5559 1.96731 33.6273C1.97877 33.6575 1.99197 33.6871 2.00683 33.7158L2.06892 33.8615C2.08303 33.8958 2.09997 33.9301 2.11408 33.9615L2.18747 34.1244C2.20722 34.1701 2.22698 34.2129 2.24956 34.2558C2.27214 34.2986 2.2919 34.3501 2.31448 34.3958L2.36528 34.5043C2.38504 34.5472 2.40762 34.5872 2.42738 34.63L2.49794 34.7786L2.57415 34.9271C2.59109 34.9643 2.61084 35.0043 2.6306 35.0414L2.68705 35.1471L2.74632 35.2671L2.83947 35.4414L2.91285 35.5728C2.92696 35.6042 2.9439 35.6328 2.96083 35.6642L3.0314 35.7928L3.07374 35.867L3.20922 36.1041L3.24873 36.1756L3.32776 36.3127C3.34101 36.332 3.35325 36.3521 3.36446 36.3727L3.5338 36.6584L3.54792 36.6812L3.64106 36.8298L3.66929 36.8784C3.76808 37.0326 3.86686 37.1869 3.96847 37.3412L3.98823 37.3726C4.09549 37.5354 4.20556 37.6954 4.31564 37.8554C5.19606 39.1168 6.19315 40.2906 7.2934 41.3607L7.41194 41.475L7.44017 41.5007C7.58694 41.6436 7.72242 41.7864 7.88613 41.9178C8.03572 42.0549 8.18814 42.2035 8.34338 42.3235L8.37724 42.3549L8.54095 42.4949C8.56489 42.5141 8.59153 42.5295 8.61998 42.5406C8.55789 42.5149 8.66232 42.4063 8.98126 42.2835C11.1369 41.4641 13.2458 40.5237 15.2981 39.4666C18.4395 37.8925 19.656 37.2326 23.0261 34.7443C26.2325 32.3988 28.053 30.9304 27.4349 28.6135Z",\n fill: "url(#paint9_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M25.5664 45.3403C25.2418 44.3461 22.6959 43.9833 19.608 44.6118C18.3633 44.8491 17.1558 45.2546 16.0178 45.8174C15.2726 46.2116 15.171 46.4573 15.8146 46.6944L15.9331 46.7373L16.0347 46.7716L16.5287 46.9373C16.6924 46.9925 16.8589 47.0439 17.0282 47.0915L17.2004 47.143H17.2343C18.7765 47.5897 20.3596 47.8768 21.9592 48C22.4221 47.5115 26.0744 46.903 25.5664 45.3403Z",\n fill: "url(#paint10_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M24.4684 2.56487C31.2425 2.4706 34.1214 3.20766 35.4254 3.67047C36.1988 3.95615 36.3992 4.21041 36.4556 4.38468C36.3343 3.93901 35.8911 3.35336 34.7621 2.73628C30.9878 0.740159 26.7532 -0.193348 22.5006 0.0332999C18.248 0.259947 14.1336 1.63843 10.5873 4.02471C15.1646 3.13763 19.8087 2.64923 24.4684 2.56487Z",\n fill: "url(#paint11_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M25.5664 45.3403C25.2418 44.3461 22.6959 43.9833 19.608 44.6118C18.3633 44.8491 17.1558 45.2546 16.0178 45.8174C15.2726 46.2116 15.171 46.4573 15.8146 46.6944L15.9331 46.7373L16.0347 46.7716L16.5287 46.9373C16.6924 46.9925 16.8589 47.0439 17.0282 47.0915L17.2004 47.143H17.2343C18.7765 47.5897 20.3596 47.8768 21.9592 48C22.4221 47.5115 26.0744 46.903 25.5664 45.3403Z",\n fill: "url(#paint12_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M24.4684 2.56487C31.2425 2.4706 34.1214 3.20766 35.4254 3.67047C36.1988 3.95615 36.3992 4.21041 36.4556 4.38468C36.3343 3.93901 35.8911 3.35336 34.7621 2.73628C30.9878 0.740159 26.7532 -0.193348 22.5006 0.0332999C18.248 0.259947 14.1336 1.63843 10.5873 4.02471C15.1646 3.13763 19.8087 2.64923 24.4684 2.56487Z",\n fill: "url(#paint13_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M5.22446 21.0858C9.39614 19.246 13.771 17.1919 16.6303 15.8263L17.0988 15.6006C9.02357 16.6748 3.62974 17.4547 0.835448 17.6804C0.827544 17.7058 0.820951 17.7315 0.815693 17.7576C0.807793 17.7819 0.801196 17.8067 0.795933 17.8318C0.781821 17.8804 0.770529 17.929 0.759239 17.9775V18.0175C0.759239 18.069 0.733837 18.1204 0.719724 18.1718V18.2147V18.2318L0.677388 18.4061V18.4518C0.677388 18.5061 0.651984 18.5603 0.640694 18.6146V18.6517C0.609646 18.786 0.581422 18.9203 0.553197 19.0546V19.086L0.519328 19.2545V19.3031C0.519328 19.3545 0.49957 19.4088 0.48828 19.4602V19.5059L0.454411 19.7002L0.420538 19.9088V19.9402C0.420538 19.9973 0.400783 20.0516 0.392315 20.1087V20.163L0.36691 20.3144C0.365668 20.3325 0.365668 20.3506 0.36691 20.3687C0.36691 20.4287 0.347154 20.4858 0.338687 20.5458V20.5687C0.338687 20.6373 0.318928 20.7087 0.31046 20.7772V20.8087C0.31046 20.8629 0.293524 20.9201 0.287879 20.9772V21.0343L0.270945 21.1858C0.26956 21.2048 0.26956 21.2239 0.270945 21.2429C0.270945 21.3 0.270947 21.3543 0.25119 21.4115V21.4457C0.25119 21.5172 0.237077 21.5857 0.228609 21.6543V21.68C0.228609 21.74 0.228608 21.8 0.214496 21.8571C0.213101 21.8771 0.213101 21.8971 0.214496 21.9171C0.214496 21.9657 0.214495 22.0171 0.200382 22.0657C0.18627 22.1142 0.200382 22.1085 0.200382 22.1285C0.200382 22.1485 0.200382 22.2342 0.200382 22.2856C0.200382 22.3371 0.200382 22.3171 0.200382 22.3342C0.200382 22.4028 0.200382 22.4713 0.200382 22.5428V22.5599V22.7484C0.198979 22.7684 0.198979 22.7885 0.200382 22.8084V22.957C0.201789 22.9779 0.201789 22.9989 0.200382 23.0199C0.200382 23.0741 0.200382 23.1256 0.200382 23.177V23.2284V23.4398C0.200382 23.5055 0.200382 23.5741 0.200382 23.6426V23.6883C0.200382 23.7826 0.200382 23.8798 0.200382 23.974C0.00562847 23.5741 1.52132 22.717 5.22446 21.0858Z",\n fill: "url(#paint14_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M43.2635 32.1902C42.651 32.1902 39.1229 32.2731 33.4327 32.8273C25.9756 33.5501 15.1174 35.1356 10.7255 35.8927C7.99614 36.3641 5.45305 36.9155 3.9176 37.264C3.98534 37.3697 4.05591 37.4754 4.12647 37.5782L4.17445 37.6497L4.26478 37.7811L4.31558 37.8553L4.40872 37.9868L4.43977 38.0325L4.63735 38.3039L4.67686 38.361L4.77565 38.4924L4.82363 38.5581L4.92524 38.6924C4.92524 38.7095 4.95065 38.7238 4.96194 38.7381L5.19056 39.0238L5.20467 39.0381L5.31475 39.1781L5.35709 39.2323C5.39378 39.2781 5.43047 39.3238 5.46999 39.3666L5.50386 39.4095C5.62805 39.5609 5.75506 39.6952 5.88208 39.858L5.91312 39.8951L6.03732 40.0351L6.06554 40.0665C6.20102 40.2208 6.33932 40.3722 6.48045 40.5208L6.49456 40.5379L6.63004 40.6836L6.65262 40.7065C6.84738 40.9093 7.04495 41.1121 7.24817 41.3093L7.26229 41.3236C7.46833 41.5235 7.6772 41.7207 7.88889 41.9121C8.1034 42.1092 8.32073 42.3006 8.54371 42.4834C8.66225 42.5863 8.92192 42.6034 9.73481 42.4491C11.4283 42.1206 17.8298 40.9979 24.9115 40.0151C29.8129 39.371 34.7457 39.001 39.6874 38.9067C40.9321 38.9067 42.1119 39.1923 41.6377 39.8009C41.6913 39.738 41.7421 39.6752 41.7958 39.6152V39.6009L41.9482 39.418L42.0978 39.2381L42.1147 39.2152L42.2643 39.0295C42.4478 38.7953 42.6284 38.5581 42.8034 38.3182C42.9784 38.0753 43.1506 37.8325 43.3171 37.584L43.4526 37.3811V37.3611L43.5824 37.1611V37.144L43.7123 36.9383C44.0792 36.3527 44.4235 35.7499 44.7397 35.1328C44.7792 35.0585 44.8159 34.9842 44.8526 34.9071L44.9626 34.6814C45.2675 34.0491 45.545 33.4054 45.7953 32.7502C45.9957 32.3988 45.7106 32.1902 43.2635 32.1902Z",\n fill: "url(#paint15_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M60.3369 34.1186C59.9772 34.0956 59.617 34.155 59.2832 34.2925C58.9494 34.4301 58.6506 34.6421 58.4091 34.9128C57.9669 35.4423 57.7449 36.1765 57.743 37.1155C57.7386 37.5287 57.7928 37.9405 57.9039 38.3382C57.9961 38.6833 58.1565 39.0059 58.3752 39.2867C58.5841 39.55 58.8508 39.7603 59.1542 39.9009C59.4965 40.0564 59.8687 40.1325 60.2437 40.1237C60.468 40.1249 60.6922 40.1144 60.9155 40.0923C61.0669 40.079 61.217 40.0532 61.3643 40.0151V37.044H62.8489V41.0179C62.5107 41.132 62.1644 41.2199 61.813 41.2807C61.2542 41.3819 60.6872 41.4297 60.1195 41.4236C59.5685 41.4308 59.021 41.334 58.5051 41.1379C58.0333 40.9571 57.6078 40.671 57.2603 40.3008C56.905 39.9125 56.6339 39.4532 56.4644 38.9524C56.2666 38.3611 56.1711 37.7396 56.1821 37.1155C56.1707 36.4886 56.277 35.8652 56.4954 35.2785C56.6816 34.7724 56.97 34.3112 57.3422 33.9244C57.7004 33.5491 58.1347 33.2567 58.6151 33.0673C59.1113 32.8745 59.6389 32.7776 60.1703 32.7816C60.5078 32.7784 60.8449 32.8042 61.178 32.8588C61.435 32.9013 61.6894 32.9585 61.9401 33.0302C62.1204 33.0827 62.296 33.1505 62.465 33.233L62.7473 33.3901L62.2985 34.6186C62.0235 34.4579 61.7282 34.3358 61.4207 34.2558C61.0672 34.1606 60.7026 34.1145 60.3369 34.1186Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M68.5561 32.9016C69.7359 32.9016 70.6363 33.1216 71.2629 33.5587C71.8895 33.9958 72.1999 34.6643 72.1999 35.5585C72.1999 36.6803 71.6533 37.4421 70.5601 37.8439C70.7087 38.0344 70.8781 38.2572 71.0681 38.5124C71.2572 38.7753 71.4492 39.0581 71.6326 39.3695C71.8161 39.6809 72.0193 39.9923 72.1971 40.3123C72.3749 40.6322 72.5386 40.9522 72.6798 41.2636H71.0173C70.8687 40.976 70.7078 40.6903 70.5347 40.4065C70.3616 40.1228 70.1866 39.8371 70.0097 39.5495C69.8319 39.2638 69.6569 39.0152 69.4847 38.7753C69.3125 38.5353 69.1516 38.3153 69.002 38.1239C68.892 38.1239 68.796 38.1239 68.7198 38.1239H67.7742V41.2579H66.3037V33.1044C66.6844 33.0243 67.0701 32.9708 67.4581 32.9445C67.8674 32.9159 68.2343 32.9016 68.5561 32.9016ZM68.6605 34.2043C68.3463 34.2043 68.0556 34.2158 67.7884 34.2386V36.9126H68.4488C68.7688 36.9153 69.0885 36.8953 69.4057 36.8526C69.646 36.8231 69.8792 36.7506 70.0943 36.6384C70.2706 36.5433 70.4157 36.3983 70.5121 36.2213C70.6138 36.0139 70.6623 35.784 70.6532 35.5528C70.6612 35.3289 70.6126 35.1067 70.5121 34.9071C70.4185 34.7318 70.2775 34.5871 70.1056 34.49C69.9101 34.3802 69.6971 34.3058 69.4762 34.27C69.2069 34.2228 68.9338 34.2008 68.6605 34.2043Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M82.9142 37.1155C82.9258 37.7544 82.8195 38.39 82.601 38.9895C82.4147 39.4955 82.1263 39.9567 81.7542 40.3437C81.3986 40.7045 80.9701 40.9832 80.4982 41.1607C79.5064 41.5265 78.419 41.5265 77.4273 41.1607C76.9533 40.984 76.5228 40.7052 76.1656 40.3437C75.7947 39.9558 75.5065 39.4949 75.3189 38.9895C75.0967 38.3908 74.9885 37.7549 74.9999 37.1155C74.988 36.4778 75.0962 35.8437 75.3189 35.2471C75.5122 34.74 75.8073 34.2789 76.1854 33.8929C76.5456 33.531 76.9775 33.2506 77.4527 33.0702C78.4347 32.7045 79.5133 32.7045 80.4953 33.0702C80.9682 33.2487 81.3968 33.5295 81.7514 33.8929C82.121 34.2819 82.409 34.7425 82.5981 35.2471C82.8198 35.8439 82.9271 36.478 82.9142 37.1155ZM76.5354 37.1155C76.5299 37.5327 76.585 37.9486 76.6991 38.3496C76.7955 38.6925 76.9576 39.0128 77.1761 39.2924C77.3816 39.5493 77.6422 39.7554 77.9382 39.8952C78.2559 40.0423 78.6021 40.1155 78.9514 40.1094C79.297 40.1145 79.6394 40.0413 79.9534 39.8952C80.2494 39.7554 80.51 39.5493 80.7155 39.2924C80.934 39.0128 81.0961 38.6925 81.1925 38.3496C81.4108 37.5417 81.4108 36.6892 81.1925 35.8813C81.0961 35.5384 80.934 35.2181 80.7155 34.9386C80.51 34.6817 80.2494 34.4755 79.9534 34.3358C79.6401 34.1873 79.2974 34.113 78.9514 34.1186C78.6018 34.1121 78.2552 34.1864 77.9382 34.3358C77.6414 34.4767 77.3806 34.6849 77.1761 34.9443C76.9598 35.2253 76.7979 35.5451 76.6991 35.887C76.5848 36.2861 76.5297 36.7 76.5354 37.1155Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M89.1322 41.435C88.6415 41.4474 88.1529 41.365 87.6927 41.1921C87.3128 41.0431 86.9719 40.8075 86.6964 40.5036C86.4309 40.204 86.2317 39.8505 86.1121 39.4666C85.9829 39.041 85.9192 38.5977 85.923 38.1525V33.0016H87.4218V38.0239C87.4157 38.3493 87.4576 38.6738 87.546 38.9867C87.614 39.2269 87.7346 39.4485 87.8988 39.6352C88.0477 39.8008 88.2335 39.9281 88.4407 40.0065C88.666 40.0884 88.9042 40.128 89.1435 40.1237C89.3838 40.1278 89.6228 40.0881 89.8491 40.0065C90.0591 39.9286 90.2477 39.8013 90.3995 39.6352C90.5635 39.4438 90.6823 39.2171 90.7467 38.9724C90.8351 38.6595 90.8769 38.335 90.8709 38.0096V33.0016H92.3668V38.1439C92.3717 38.5897 92.306 39.0333 92.1721 39.458C92.0515 39.8421 91.8514 40.1956 91.585 40.4951C91.3053 40.8005 90.9594 41.0362 90.5745 41.1836C90.1134 41.3575 89.6243 41.4428 89.1322 41.435Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M98.2377 32.9016C99.4231 32.9016 100.333 33.1206 100.967 33.5587C101.601 33.9967 101.917 34.6814 101.915 35.6128C101.927 36.0422 101.84 36.4686 101.661 36.8583C101.495 37.205 101.241 37.5007 100.925 37.7154C100.564 37.9491 100.164 38.1128 99.7449 38.1982C99.2212 38.3071 98.6875 38.3589 98.153 38.3525H97.4107V41.2664H95.926V33.1044C96.3045 33.0221 96.6885 32.9686 97.0748 32.9445C97.4953 32.9159 97.882 32.9016 98.2377 32.9016ZM98.3421 34.2043C97.9658 34.2043 97.6553 34.2158 97.4107 34.2386V37.0555H98.1304C98.6965 37.085 99.2617 36.9813 99.7816 36.7526C100.158 36.5507 100.346 36.1698 100.346 35.6099C100.354 35.3738 100.301 35.1396 100.194 34.93C100.095 34.7499 99.9482 34.6015 99.7703 34.5014C99.5699 34.3911 99.3522 34.3166 99.1268 34.2815C98.868 34.2323 98.6054 34.2065 98.3421 34.2043Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint0_linear",\n x1: "0.787476",\n y1: "27.7736",\n x2: "47.4888",\n y2: "27.7736",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#E9F7FE", stopOpacity: "0.4" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#5EA1D7" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#4DA3DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.89", stopColor: "#645FAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#414099" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint1_linear",\n x1: "6.19251",\n y1: "22.3057",\n x2: "29.4169",\n y2: "-0.639732",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FFF795", stopOpacity: "0.3" }),\n /* @__PURE__ */ A("stop", { offset: "0.35", stopColor: "#F3C206" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#F99B1C" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F6891F" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint2_linear",\n x1: "0.694283",\n y1: "18.0517",\n x2: "46.309",\n y2: "18.0517",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#912A73" }),\n /* @__PURE__ */ A("stop", { offset: "0.17", stopColor: "#C6168D" }),\n /* @__PURE__ */ A("stop", { offset: "0.51", stopColor: "#F175AD" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#C593C3" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "white", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint3_linear",\n x1: "20.006",\n y1: "43.9433",\n x2: "44.7256",\n y2: "43.9433",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#72BF44" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#91C83D" }),\n /* @__PURE__ */ A("stop", { offset: "0.38", stopColor: "#ACD037" }),\n /* @__PURE__ */ A("stop", { offset: "0.47", stopColor: "#99CA3B" }),\n /* @__PURE__ */ A("stop", { offset: "0.6", stopColor: "#7DC242" }),\n /* @__PURE__ */ A("stop", { offset: "0.72", stopColor: "#4FB848" }),\n /* @__PURE__ */ A("stop", { offset: "0.84", stopColor: "#24AE4D" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#0AA850" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A651" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint4_linear",\n x1: "7.15503",\n y1: "37.3868",\n x2: "39.0269",\n y2: "37.3868",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0077AC" }),\n /* @__PURE__ */ A("stop", { offset: "0.22", stopColor: "#0083BB" }),\n /* @__PURE__ */ A("stop", { offset: "0.44", stopColor: "#0099DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#00B2DD" }),\n /* @__PURE__ */ A("stop", { offset: "0.67", stopColor: "#00B1DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.83", stopColor: "#00ACC6" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#00AAA9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A99D" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint5_linear",\n x1: "13.1501",\n y1: "2.31345",\n x2: "19.1179",\n y2: "4.74801",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F58220" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#FCAF17" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint6_linear",\n x1: "31.0053",\n y1: "38.7925",\n x2: "45.8997",\n y2: "38.7925",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#008A4B" }),\n /* @__PURE__ */ A("stop", { offset: "0.12", stopColor: "#179449" }),\n /* @__PURE__ */ A("stop", { offset: "0.56", stopColor: "#6CB842" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#8DC63F" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#32A443" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint7_linear",\n x1: "-0.00282252",\n y1: "15.3178",\n x2: "24.2821",\n y2: "15.3178",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FCAF17" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F04E23" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint8_linear",\n x1: "27.6974",\n y1: "18.2432",\n x2: "48.615",\n y2: "18.2432",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#812990" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#882E92" }),\n /* @__PURE__ */ A("stop", { offset: "0.5", stopColor: "#9C3B97" }),\n /* @__PURE__ */ A("stop", { offset: "0.71", stopColor: "#BC509F" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#E86DAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F173AC" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint9_linear",\n x1: "0.753627",\n y1: "34.1272",\n x2: "27.5534",\n y2: "34.1272",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0089CF", stopOpacity: "0.9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#0054A6" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint10_linear",\n x1: "25.7555",\n y1: "47.1315",\n x2: "17.9423",\n y2: "45.1347",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#9ACA3C" }),\n /* @__PURE__ */ A("stop", { offset: "0.34", stopColor: "#7AC340" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint11_linear",\n x1: "14.7702",\n y1: "1.55069",\n x2: "30.8265",\n y2: "3.77982",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FDB515" }),\n /* @__PURE__ */ A("stop", { offset: "0.36", stopColor: "#FFD100" }),\n /* @__PURE__ */ A("stop", { offset: "0.58", stopColor: "#FFC907" }),\n /* @__PURE__ */ A("stop", { offset: "0.7", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.87", stopColor: "#FBA617" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F78E1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint12_linear",\n x1: "18.9419",\n y1: "47.72",\n x2: "23.0412",\n y2: "43.67",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#BAD532" }),\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#B1D334", stopOpacity: "0.93" }),\n /* @__PURE__ */ A("stop", { offset: "0.11", stopColor: "#94CC39", stopOpacity: "0.72" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#7AC53D", stopOpacity: "0.52" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#64C041", stopOpacity: "0.36" }),\n /* @__PURE__ */ A("stop", { offset: "0.41", stopColor: "#52BC44", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.53", stopColor: "#44B847", stopOpacity: "0.13" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#3AB649", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.79", stopColor: "#35B44A", stopOpacity: "0.01" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A", stopOpacity: "0" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint13_linear",\n x1: "14.8973",\n y1: "5.88737",\n x2: "30.1067",\n y2: "1.86255",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F15F22", stopOpacity: "0.8" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#F6861A", stopOpacity: "0.48" }),\n /* @__PURE__ */ A("stop", { offset: "0.39", stopColor: "#FAA514", stopOpacity: "0.22" }),\n /* @__PURE__ */ A("stop", { offset: "0.52", stopColor: "#FDB910", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.59", stopColor: "#FEC00F", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FDBC10", stopOpacity: "0.04" }),\n /* @__PURE__ */ A("stop", { offset: "0.75", stopColor: "#FCB313", stopOpacity: "0.15" }),\n /* @__PURE__ */ A("stop", { offset: "0.88", stopColor: "#FAA418", stopOpacity: "0.32" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F7941D", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint14_linear",\n x1: "0.694323",\n y1: "19.7945",\n x2: "46.309",\n y2: "19.7945",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F4EAE5", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#DAAFAC", stopOpacity: "0.33" }),\n /* @__PURE__ */ A("stop", { offset: "0.68", stopColor: "#981B1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint15_linear",\n x1: "3.9176",\n y1: "37.3868",\n x2: "45.9223",\n y2: "37.3868",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.85", stopColor: "white", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.91", stopColor: "#D6D7D8", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.97", stopColor: "#B4B6B8", stopOpacity: "0.43" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#A7A9AC", stopOpacity: "0.5" })\n ]\n }\n )\n ] })\n ]\n }\n), SV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n opacity: "0.61",\n d: "M154.651 108.987C148.002 126.208 135.581 140.553 119.769 149.642C119.517 149.122 118.563 148.422 116.338 147.386C114.113 146.35 104.38 142.741 104.466 137.657C104.576 131.25 113.271 125.389 125.619 120.561C137.459 115.931 148.298 112.634 150.297 111.831C152.684 110.872 154.09 110.283 154.651 108.987ZM17.614 70.2925C31.6694 64.1641 46.4044 57.3119 56.0417 52.7654C71.1188 45.6525 84.2837 36.9845 81.4187 28.1552C78.8714 20.2918 68.3926 21.2369 47.4818 24.984C34.0312 27.3943 16.2465 31.8316 13.8483 35.0444L13.7548 35.1819C13.6561 35.3305 13.5567 35.4791 13.458 35.6277C5.16222 48.0443 0.239672 62.9202 0.00816225 78.9278C0.00371014 79.2748 0 79.6218 0 79.968C0.0304228 78.5437 5.13254 75.7351 17.614 70.2925ZM133.38 38.0128C116.981 40.4269 90.9589 45.2513 93.4988 60.6511C95.454 72.5074 119.11 75.9654 128.996 77.8742C136.844 79.3907 152.202 81.486 158.773 83.1303C159.651 83.3532 159.926 83.7723 159.902 84.2449C159.902 84.2397 159.902 84.2352 159.902 84.23C159.936 83.5479 159.961 82.8636 159.976 82.177V82.0544C159.992 81.408 160 80.7604 160 80.1115C160 65.292 155.981 51.4139 148.977 39.507L148.7 39.0612C147.857 37.6963 142.19 36.7155 133.38 38.0128ZM92.4407 95.3857C90.8787 89.5901 82.4049 85.3988 70.3107 85.6952C57.548 86.0088 44.2926 87.214 28.3169 90.8109C14.0412 94.0252 5.38854 97.7299 4.05291 98.282C2.80112 98.8021 2.37669 99.4797 2.60597 100.463V100.47C2.66187 100.682 2.71777 100.893 2.77367 101.103C2.84787 101.38 2.92207 101.656 3.00295 101.932C3.02669 102.016 3.05118 102.101 3.07715 102.186C3.14096 102.409 3.20478 102.632 3.27008 102.849C3.28863 102.913 3.30718 102.977 3.32647 103.041C3.4076 103.312 3.48971 103.583 3.57282 103.852C3.59731 103.932 3.62254 104.011 3.64702 104.09C3.71232 104.299 3.7791 104.508 3.84588 104.716L3.92379 104.959C4.01036 105.225 4.09842 105.49 4.18795 105.755L4.25696 105.958C4.33116 106.167 4.40017 106.376 4.47289 106.584L4.56787 106.856C4.65295 107.096 4.73927 107.336 4.82683 107.576L4.89361 107.758C4.97721 107.987 5.0623 108.216 5.14887 108.444L5.25794 108.73C5.33165 108.924 5.40585 109.117 5.48055 109.309C5.51097 109.387 5.54065 109.465 5.57182 109.543C5.67075 109.791 5.76969 110.038 5.86863 110.286C5.90795 110.385 5.94876 110.482 5.98883 110.583C6.06007 110.756 6.13155 110.929 6.20328 111.103L6.32794 111.401C6.42984 111.641 6.53249 111.88 6.63587 112.118C6.67891 112.217 6.72269 112.315 6.76573 112.416C6.83696 112.578 6.90869 112.739 6.98091 112.9L7.12932 113.234C7.21143 113.415 7.29454 113.596 7.37863 113.778C7.44542 113.926 7.51368 114.067 7.5812 114.211C7.65541 114.368 7.72961 114.525 7.80381 114.681L7.97744 115.042C8.04497 115.181 8.11323 115.321 8.1815 115.46C8.26238 115.624 8.34326 115.787 8.42562 115.951C8.50799 116.114 8.59035 116.281 8.6742 116.445C8.73999 116.574 8.80628 116.703 8.87306 116.831C8.93341 116.949 8.99426 117.066 9.0556 117.183C9.12386 117.315 9.19287 117.447 9.26262 117.578C9.36551 117.773 9.4694 117.967 9.57427 118.161C9.65441 118.31 9.73504 118.459 9.81617 118.607C9.87058 118.706 9.92524 118.805 9.98015 118.904C10.0593 119.048 10.1389 119.191 10.2191 119.333L10.3615 119.586C10.51 119.85 10.6613 120.114 10.8157 120.377C10.8609 120.451 10.9055 120.531 10.9507 120.608C11.0403 120.761 11.1303 120.914 11.2208 121.066L11.3425 121.269C11.531 121.584 11.7212 121.897 11.9131 122.208L11.9643 122.29C12.0662 122.454 12.1684 122.618 12.2708 122.781L12.3724 122.942C12.7004 123.46 13.0341 123.974 13.3734 124.484L13.4476 124.592C13.8072 125.132 14.174 125.667 14.548 126.197C14.5517 126.204 14.5562 126.21 14.5606 126.216C17.5238 130.425 20.8833 134.34 24.5927 137.907C24.7238 138.034 24.8559 138.161 24.989 138.287L25.081 138.374C25.5757 138.843 26.0778 139.306 26.5873 139.762L26.6103 139.782C27.1193 140.24 27.6345 140.691 28.1559 141.135L28.2702 141.233L28.2769 141.24C28.4599 141.395 28.6439 141.549 28.8289 141.702C28.9101 141.767 29.0017 141.817 29.0998 141.851C28.8868 141.769 29.237 141.405 30.3159 140.997C35.0648 139.214 41.0477 136.843 51.5992 131.611C62.1841 126.362 66.2741 124.163 77.63 115.867C88.3937 108.001 94.5258 103.113 92.4407 95.3857ZM86.1454 151.141C85.0524 147.829 76.471 146.621 66.0679 148.717C60.102 149.918 55.8547 151.738 53.973 152.729C51.4686 154.045 51.1718 154.86 53.294 155.649H53.2985C53.4328 155.696 53.5686 155.743 53.7036 155.79L54.0464 155.909C54.5906 156.095 55.1426 156.278 55.7026 156.457L55.7427 156.47C56.2987 156.646 56.8604 156.818 57.4278 156.986C57.6212 157.043 57.8149 157.099 58.0088 157.155L58.1208 157.187C63.3175 158.662 68.6503 159.604 74.0371 160C75.5575 158.379 87.8632 156.35 86.1454 151.141ZM82.4442 8.56477C105.322 8.25121 114.971 10.7017 119.363 12.2501C121.973 13.1715 122.648 14.049 122.839 14.6323C122.423 13.1418 120.884 11.1884 117.134 9.13392L117.12 9.12649C106.027 3.29826 93.3994 0 80.003 0C63.5962 0 48.344 4.94627 35.6495 13.4293C43.7658 11.7627 62.5529 8.83671 82.4442 8.56477Z",\n fill: "url(#paint0_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M75.1401 80.4387C106.226 72.9516 143.283 65.2717 157.103 61.1208C158.545 67.1868 159.272 73.4008 159.268 79.6359C159.268 80.9846 159.235 82.3251 159.168 83.6575C159.145 83.9797 159.004 84.2822 158.772 84.5062C158.13 85.1162 156.83 85.6813 156.086 85.9243C152.934 86.9583 142.709 89.4858 123.901 93.5259C94.4026 99.8623 62.2036 107.841 47.7988 111.843C29.3148 116.975 17.9944 121.279 12.7947 122.943C10.5298 119.456 8.54249 115.796 6.85119 111.997V111.991C6.32088 110.801 5.81962 109.594 5.34742 108.372V108.362C4.87472 107.141 4.43156 105.906 4.01795 104.656C3.52161 103.156 3.06935 101.635 2.66115 100.096C13.4889 97.0933 42.0725 88.403 75.1401 80.4387ZM3.7395 55.4551L3.72768 55.4935L3.7166 55.5267C3.70405 55.5673 3.69149 55.6072 3.67819 55.6478C3.61468 55.8497 3.5519 56.0521 3.48985 56.255C3.48616 56.2653 3.48321 56.2756 3.48025 56.286C3.464 56.3377 3.44849 56.3894 3.43298 56.4411C3.32662 56.7907 3.22273 57.1408 3.1213 57.4914L3.11169 57.5253C3.00878 57.8789 2.90883 58.2339 2.81183 58.5904C37.895 50.0796 62.5847 43.1087 83.882 36.4503C96.3643 32.5469 105.517 29.0016 111.692 25.8796C111.836 25.8072 111.977 25.7348 112.118 25.6624L112.243 25.5974C112.341 25.5472 112.438 25.497 112.534 25.4497L112.689 25.3685L112.941 25.2355L113.103 25.1484L113.339 25.0221L113.501 24.9334L113.731 24.8079L113.887 24.7215L114.116 24.5929L114.264 24.5117L114.506 24.3736L114.629 24.3034L114.952 24.1151L114.983 24.0966L115.329 23.892L115.435 23.8278C115.509 23.7812 115.589 23.7347 115.664 23.6882L115.792 23.6099L115.992 23.485L116.122 23.4031L116.311 23.2827C116.354 23.2553 116.397 23.228 116.439 23.1999C116.501 23.1608 116.562 23.1209 116.622 23.081L116.746 23.0005L116.927 22.8787L117.041 22.8048C117.107 22.7605 117.171 22.7169 117.235 22.6726L117.327 22.6091C117.421 22.5441 117.513 22.4793 117.603 22.4148C119.625 20.9627 122.601 18.3282 122.387 15.2017C122.387 15.1744 122.383 15.1471 122.381 15.1197C122.233 13.5894 120.837 11.4068 116.619 9.09429L116.354 8.95543L116.038 8.79147L115.616 8.5758L115.469 8.50194C115.164 8.34831 114.859 8.19665 114.553 8.04696L114.357 7.95095L113.885 7.7242L113.642 7.60898L113.277 7.43689L113.01 7.31354L112.732 7.18503L112.437 7.05208L112.185 6.93907L111.875 6.80022L111.647 6.69977L111.315 6.55205L111.138 6.47819C110.707 6.29207 110.274 6.10963 109.838 5.93089L109.722 5.88289L109.318 5.71892L109.174 5.66131L108.767 5.50029L108.636 5.44859L108.208 5.28241L108.134 5.25434C107.462 4.99633 106.786 4.74767 106.106 4.50836L106.08 4.4995C105.918 4.44189 105.754 4.38502 105.591 4.32888L105.53 4.3082L105.039 4.14054L105.007 4.1302C104.132 3.83477 103.25 3.55558 102.362 3.29264L102.34 3.28599L101.822 3.13458L101.783 3.1235C101.035 2.90685 100.282 2.70127 99.524 2.50677C99.5742 3.11611 99.5882 3.66193 99.5417 4.05782C99.3246 5.89987 98.3873 7.45535 96.9404 8.82618C93.9446 11.6639 87.996 14.6145 80.6042 17.2159C72.7123 20.0026 56.3133 25.4046 41.7771 29.0474C32.0276 31.4914 19.1761 34.671 12.9978 36.0153C12.7585 36.3801 12.5226 36.747 12.2902 37.1158C12.2806 37.1306 12.271 37.1453 12.2621 37.1601L12.2518 37.1756C12.2126 37.2377 12.1735 37.299 12.1351 37.361C12.0406 37.5117 11.9465 37.6628 11.8529 37.8145C11.8374 37.8389 11.8227 37.8632 11.8079 37.8884C11.7931 37.9135 11.7724 37.9452 11.7555 37.974C11.7385 38.0028 11.7074 38.0479 11.6816 38.0893C11.5893 38.237 11.4969 38.3913 11.4054 38.5428C11.3817 38.5826 11.3581 38.6225 11.3315 38.6624L11.2451 38.8101C11.1496 38.9682 11.0553 39.1262 10.9622 39.2843C10.9548 39.2961 10.9482 39.3079 10.9415 39.3198L10.9371 39.3279C10.7209 39.6952 10.5077 40.0645 10.2975 40.4358L10.166 40.6677C10.0769 40.8272 9.988 40.987 9.89937 41.147L9.89198 41.1596L9.86909 41.2017L9.75091 41.4151L9.48945 41.896C9.45547 41.9595 9.42224 42.023 9.38826 42.0858L9.35355 42.15C9.26344 42.3184 9.17333 42.4868 9.0847 42.656L9.07805 42.6693L9.07288 42.6789C8.86509 43.0728 8.6605 43.4711 8.45911 43.8739L8.36014 44.0696C8.27446 44.241 8.19026 44.4124 8.10606 44.5867V44.5926C8.08317 44.6384 8.06101 44.6842 8.03885 44.7299L8.02999 44.7477L7.98567 44.8385C7.90246 45.0089 7.81974 45.18 7.7375 45.3518L7.62672 45.5867C7.48244 45.8895 7.34063 46.1936 7.20129 46.4989V46.5026C7.06095 46.8074 6.92308 47.1134 6.78767 47.4206C6.77216 47.4554 6.75665 47.4893 6.74188 47.5233L6.72194 47.5684C6.64168 47.7525 6.56142 47.9369 6.48116 48.1216L6.45457 48.1836C6.43093 48.2397 6.40656 48.2951 6.38071 48.3513C6.30242 48.534 6.22486 48.7171 6.14805 48.9008C6.11851 48.971 6.08896 49.0411 6.06016 49.112C5.92623 49.4331 5.79451 49.7556 5.66501 50.0796V50.0877V50.0929C5.536 50.4169 5.40847 50.7423 5.28242 51.0693L5.24918 51.155C5.17532 51.3522 5.10146 51.5509 5.02761 51.7458L4.95375 51.9519C4.87989 52.1454 4.81046 52.3397 4.74029 52.5347L4.71149 52.6159C4.69745 52.6528 4.68416 52.6898 4.67086 52.7274C4.54974 53.0652 4.43082 53.4037 4.31412 53.743C4.31256 53.7468 4.31133 53.7508 4.31043 53.7548L4.306 53.7674C4.18832 54.1096 4.07334 54.4523 3.96108 54.7955L3.95665 54.8088V54.8154C3.95508 54.819 3.95385 54.8227 3.95295 54.8265C3.87663 55.0348 3.80548 55.2443 3.7395 55.4551ZM3.06147 80.7977C5.22555 80.8095 10.8115 80.5237 17.012 79.9306C27.8117 78.8965 49.3993 76.0899 74.0314 72.9043C93.2068 70.4249 135.164 64.3367 157.104 61.1252C157.068 60.9721 157.032 60.8212 156.996 60.6725C156.928 60.3948 156.859 60.1181 156.788 59.8423C156.763 59.7441 156.738 59.6466 156.714 59.5469L156.71 59.5306C156.66 59.3425 156.611 59.1542 156.562 58.9656C156.535 58.8659 156.508 58.7662 156.481 58.6702C156.415 58.4279 156.348 58.1864 156.28 57.9456L156.232 57.7735C156.176 57.5778 156.119 57.3835 156.062 57.1893L156.009 57.0069C155.98 56.9079 155.95 56.8096 155.92 56.7114C155.863 56.5223 155.806 56.3333 155.748 56.1449C155.717 56.0459 155.687 55.947 155.656 55.8495C155.591 55.6419 155.525 55.4351 155.458 55.2283L155.427 55.1301C155.404 55.0562 155.381 54.9875 155.358 54.9159C155.313 54.7785 155.268 54.6411 155.221 54.5038C155.19 54.4085 155.159 54.3132 155.127 54.2179L155.023 53.9129C155.023 53.9055 155.017 53.8981 155.015 53.8907L154.836 53.3737C154.8 53.2725 154.762 53.1706 154.729 53.0694C154.645 52.8336 154.561 52.5987 154.476 52.3648C154.445 52.2799 154.413 52.1949 154.382 52.1092C154.358 52.0435 154.333 51.9785 154.308 51.9128C154.254 51.765 154.2 51.6225 154.145 51.4777C154.105 51.3706 154.064 51.2643 154.023 51.1579C153.996 51.0841 153.968 51.0102 153.94 50.9423L153.827 50.6505C153.785 50.5449 153.744 50.4385 153.702 50.3329C153.66 50.2273 153.622 50.1335 153.582 50.0375C153.533 49.9104 153.482 49.7829 153.429 49.6549C153.388 49.5552 153.347 49.4555 153.306 49.3595L153.226 49.1682C153.174 49.0419 153.122 48.9156 153.069 48.7893C153.022 48.6785 152.975 48.5677 152.928 48.4569C152.86 48.2974 152.792 48.1383 152.723 47.9798C152.673 47.8704 152.626 47.7614 152.58 47.6526C152.539 47.5573 152.496 47.462 152.453 47.3667C152.398 47.2426 152.343 47.1178 152.288 46.9974C152.237 46.8859 152.186 46.7759 152.135 46.6636C152.084 46.5513 152.039 46.4516 151.988 46.346C151.957 46.2795 151.926 46.213 151.896 46.1473C151.843 46.0328 151.789 45.9191 151.736 45.8046C151.672 45.6682 151.607 45.5316 151.542 45.3947L151.535 45.3814L151.522 45.3541C151.469 45.2425 151.416 45.1325 151.362 45.021C151.259 44.8073 151.155 44.5945 151.05 44.3828C150.991 44.2632 150.931 44.1442 150.871 44.0246L150.709 43.7033L150.66 43.6073C150.652 43.5888 150.642 43.5704 150.633 43.5526L150.454 43.2033L150.39 43.0807C150.337 42.9792 150.285 42.878 150.232 42.7771L150.055 42.4396C149.944 42.2283 149.831 42.0176 149.717 41.8073L149.519 41.4462C149.446 41.3176 149.378 41.1884 149.306 41.0599L149.279 41.0104L149.082 40.6596C149.06 40.6189 149.037 40.5791 149.014 40.5384L148.852 40.2541C148.788 40.1403 148.724 40.0273 148.658 39.9143C148.592 39.8013 148.539 39.709 148.479 39.6063C148.41 39.4882 148.341 39.3692 148.272 39.2518L148.05 38.8751C142.437 39.6876 135.617 40.6477 127.235 41.8081C108.834 44.3518 88.1637 47.7301 67.0163 50.4651C34.5248 54.6426 13.2563 57.7558 2.80887 58.5948C2.76357 58.7613 2.71901 58.9272 2.67518 59.0926C2.66632 59.1259 2.65746 59.1584 2.64933 59.1909L2.59616 59.391C2.5945 59.3963 2.59326 59.4018 2.59246 59.4073C2.55356 59.555 2.51466 59.7027 2.47576 59.8504C2.44474 59.9716 2.4152 60.0927 2.38418 60.2138C2.37015 60.2714 2.35611 60.3283 2.34134 60.3852C2.33248 60.4214 2.32361 60.459 2.31401 60.4937C2.30441 60.5285 2.29998 60.5506 2.29333 60.5787C2.27265 60.6614 2.25271 60.7449 2.23277 60.8276C0.755293 66.9405 0.00583292 73.2066 0 79.4955C0.0214192 80.3191 1.20686 80.7836 3.06073 80.794L3.06147 80.7977ZM139.672 131.955C134.354 136.909 115.275 145.885 96.3724 149.618C78.5058 153.148 62.4252 153.936 51.7525 153.949C51.9364 154.212 52.3434 154.459 52.9845 154.702C54.2682 155.159 55.5666 155.582 56.8798 155.974L56.9138 155.984C57.4761 156.151 58.0404 156.312 58.6066 156.467L58.6805 156.487C58.9306 156.555 59.1813 156.622 59.4324 156.688L59.5461 156.718C59.8165 156.788 60.0873 156.857 60.3586 156.924L60.4686 156.951C60.6942 157.007 60.9199 157.061 61.1459 157.115L61.3675 157.168C61.6039 157.224 61.8407 157.278 62.078 157.331L62.2649 157.373C62.4761 157.42 62.6874 157.466 62.8994 157.512L63.217 157.579L63.6963 157.677L64.0309 157.745C64.2525 157.789 64.4689 157.831 64.6882 157.873L65.0989 157.947L65.4431 158.01L65.8862 158.089L66.0753 158.121C66.3904 158.175 66.7066 158.227 67.0237 158.278L67.2452 158.313L67.78 158.394L67.8767 158.409C68.2633 158.466 68.6505 158.52 69.0385 158.572L69.0858 158.578C69.2897 158.605 69.4935 158.631 69.6974 158.657L69.7513 158.663C70.3791 158.74 71.0091 158.811 71.6413 158.874H71.6509C72.0793 158.917 72.5092 158.957 72.9405 158.993C75.146 159.176 77.376 159.268 79.6307 159.27C103.586 159.27 125.07 148.691 139.669 131.952L139.672 131.955ZM145.098 106.676C143.043 106.676 131.213 106.953 112.127 108.783C87.1237 111.18 50.7044 116.433 35.9776 118.944C26.8309 120.504 18.3001 122.328 13.1492 123.486C13.3801 123.836 13.614 124.184 13.8508 124.529L14.0104 124.763C14.1089 124.911 14.21 125.056 14.3139 125.199C14.3701 125.28 14.4269 125.361 14.4831 125.44C14.5872 125.588 14.6906 125.736 14.7955 125.884L14.9048 126.031C15.121 126.333 15.3396 126.634 15.5607 126.932C15.6065 126.994 15.6508 127.055 15.6966 127.116C15.8059 127.263 15.9182 127.411 16.0275 127.559L16.1914 127.775C16.3037 127.923 16.4167 128.071 16.5305 128.218L16.6509 128.373C16.9059 128.702 17.1629 129.029 17.4219 129.354L17.4618 129.404C17.5852 129.558 17.71 129.711 17.8311 129.864L17.9751 130.04C18.0992 130.188 18.2233 130.343 18.3481 130.493L18.4611 130.629C18.8792 131.13 19.3031 131.625 19.733 132.115L19.8408 132.238C19.9782 132.394 20.1163 132.549 20.2552 132.705C20.2869 132.741 20.3187 132.778 20.3512 132.812C20.8072 133.32 21.2693 133.822 21.7375 134.318L21.7841 134.367C21.9367 134.528 22.0901 134.689 22.2442 134.849L22.3181 134.927C22.971 135.604 23.6357 136.268 24.3123 136.921L24.3632 136.97C25.0526 137.633 25.752 138.284 26.4616 138.922L26.486 138.944C27.2078 139.591 27.941 140.225 28.6855 140.845C29.0836 141.18 29.9522 141.24 32.6783 140.723C38.3987 139.641 59.8231 135.923 83.5778 132.667C105.927 129.604 129.927 128.955 133.126 128.987C137.305 129.03 141.26 129.96 139.667 131.951C139.846 131.747 140.024 131.541 140.2 131.334L140.239 131.288C140.242 131.284 140.246 131.28 140.249 131.276C140.417 131.079 140.586 130.88 140.753 130.679L140.788 130.637C140.798 130.625 140.808 130.613 140.819 130.6C140.984 130.403 141.149 130.204 141.313 130.001L141.373 129.927C141.54 129.722 141.706 129.516 141.871 129.309L141.903 129.27C142.52 128.495 143.124 127.709 143.714 126.912L143.742 126.874C144.333 126.076 144.907 125.267 145.465 124.447L145.469 124.44L145.484 124.418C145.637 124.194 145.788 123.97 145.938 123.745C145.952 123.723 145.966 123.702 145.981 123.68C146.128 123.46 146.274 123.238 146.418 123.016L146.425 123.004C146.438 122.985 146.45 122.967 146.462 122.948C146.609 122.722 146.755 122.496 146.898 122.268C146.907 122.256 146.915 122.242 146.923 122.23C148.154 120.291 149.301 118.297 150.363 116.247L150.377 116.221C150.504 115.975 150.63 115.729 150.756 115.483L150.768 115.458L150.779 115.438C150.904 115.189 151.027 114.94 151.148 114.69L151.152 114.679L151.162 114.661C152.183 112.577 153.115 110.444 153.958 108.262C154.265 107.365 153.305 106.672 145.097 106.672L145.098 106.676ZM66.4254 9.18366C67.0805 4.43672 54.4986 5.22111 53.9432 4.23508C47.4207 6.45853 41.2157 9.5224 35.485 13.3493C35.2376 13.5126 35.1378 13.8708 36.2819 14.1042C38.7732 14.6138 44.0438 15.1633 47.784 15.1943C55.752 15.263 65.8279 13.517 66.4254 9.18366Z",\n fill: "url(#paint1_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M154.675 108.338C148.058 125.457 135.694 139.716 119.954 148.751C119.704 148.234 118.755 147.538 116.54 146.508C114.325 145.479 104.637 141.891 104.722 136.838C104.832 130.468 113.487 124.643 125.777 119.843C137.563 115.241 148.352 111.963 150.342 111.165C152.718 110.212 154.117 109.626 154.675 108.338ZM18.2713 69.8739C32.2618 63.782 46.9287 56.9707 56.5216 52.4512C71.5291 45.3807 84.6332 36.7642 81.7815 27.9875C79.2459 20.171 68.8155 21.1105 48.0012 24.8352C34.6127 27.2312 16.9101 31.6421 14.523 34.8358L14.4299 34.9724C14.3317 35.1201 14.2327 35.2678 14.1345 35.4156C5.87698 47.7582 0.977152 62.5456 0.746711 78.4578C0.742279 78.8027 0.738586 79.1477 0.738586 79.4918C0.768869 78.076 5.84744 75.2841 18.2713 69.8739ZM133.503 37.7864C117.18 40.1861 91.2776 44.9818 93.8058 60.2899C95.752 72.0756 119.298 75.513 129.139 77.4105C136.951 78.918 152.238 81.0008 158.779 82.6353C159.652 82.8569 159.926 83.2734 159.903 83.7432C159.903 83.738 159.903 83.7336 159.903 83.7284C159.936 83.0504 159.961 82.3701 159.976 81.6877V81.5658C159.992 80.9232 160 80.2794 160 79.6344C160 64.9031 156 51.1077 149.027 39.2717L148.752 38.8286C147.913 37.4718 142.272 36.4969 133.503 37.7864ZM92.7526 94.8176C91.1978 89.0566 82.7631 84.8902 70.7247 85.1849C58.0209 85.4966 44.8267 86.6946 28.9248 90.2701C14.715 93.4653 6.10225 97.1479 4.77278 97.6967C3.52678 98.2137 3.1043 98.8873 3.33253 99.8652V99.8718C3.38817 100.083 3.44381 100.292 3.49945 100.501C3.57331 100.776 3.64717 101.051 3.72767 101.325C3.75131 101.409 3.77568 101.493 3.80153 101.577C3.86505 101.799 3.92857 102.02 3.99357 102.237C4.01203 102.3 4.0305 102.364 4.0497 102.427C4.13045 102.697 4.21219 102.966 4.29491 103.234C4.31929 103.313 4.3444 103.391 4.36877 103.47C4.43377 103.678 4.50024 103.885 4.56672 104.092L4.64427 104.334C4.73044 104.598 4.81808 104.862 4.90721 105.125L4.9759 105.327C5.04976 105.535 5.11844 105.743 5.19083 105.95L5.28537 106.219C5.37006 106.459 5.45598 106.697 5.54314 106.935L5.60961 107.117C5.69283 107.344 5.77752 107.571 5.86369 107.798L5.97226 108.082C6.04563 108.275 6.11948 108.467 6.19384 108.658C6.22412 108.736 6.25366 108.813 6.28468 108.891C6.38316 109.137 6.48164 109.383 6.58012 109.629C6.61927 109.728 6.65989 109.824 6.69977 109.925C6.77068 110.096 6.84183 110.269 6.91323 110.442L7.03731 110.737C7.13874 110.976 7.24092 111.214 7.34383 111.451C7.38667 111.549 7.43024 111.647 7.47308 111.746C7.54399 111.907 7.61538 112.068 7.68727 112.228L7.83499 112.559C7.91673 112.74 7.99945 112.92 8.08316 113.1C8.14963 113.248 8.21758 113.387 8.28479 113.531C8.35865 113.687 8.43251 113.843 8.50637 113.998L8.6792 114.357C8.74642 114.495 8.81437 114.634 8.88232 114.772C8.96282 114.935 9.04333 115.098 9.12531 115.26C9.2073 115.423 9.28928 115.588 9.37274 115.752C9.43823 115.88 9.50421 116.008 9.57069 116.136C9.63076 116.252 9.69132 116.369 9.75238 116.485C9.82033 116.617 9.88902 116.747 9.95845 116.878C10.0609 117.071 10.1643 117.265 10.2687 117.458C10.3484 117.605 10.4287 117.753 10.5094 117.901C10.5636 117.999 10.618 118.098 10.6727 118.196C10.7515 118.339 10.8307 118.481 10.9105 118.623L11.0523 118.874C11.2 119.137 11.3507 119.399 11.5043 119.66C11.5494 119.734 11.5937 119.813 11.6387 119.89C11.7279 120.042 11.8175 120.194 11.9076 120.345L12.0287 120.547C12.2163 120.86 12.4057 121.171 12.5967 121.48L12.6477 121.562C12.7491 121.725 12.8508 121.888 12.9527 122.05L13.0539 122.21C13.3804 122.725 13.7125 123.236 14.0503 123.743L14.1241 123.85C14.4821 124.387 14.8472 124.918 15.2194 125.446C15.2231 125.452 15.2276 125.458 15.232 125.465C18.1815 129.649 21.5254 133.54 25.2178 137.086C25.3483 137.212 25.4797 137.338 25.6122 137.463L25.7038 137.55C26.1962 138.016 26.696 138.476 27.2031 138.93L27.226 138.95C27.7327 139.405 28.2455 139.853 28.7645 140.294L28.8783 140.392L28.8849 140.398C29.0671 140.553 29.2503 140.706 29.4344 140.859C29.5152 140.923 29.6064 140.973 29.704 141.006C29.492 140.924 29.8406 140.563 30.9146 140.158C35.6416 138.385 41.5968 136.028 52.0996 130.827C62.6357 125.61 66.7068 123.423 78.0102 115.177C88.7243 107.357 94.828 102.499 92.7526 94.8176ZM86.4863 150.241C85.3984 146.949 76.8565 145.748 66.5015 147.831C60.5632 149.025 56.3355 150.835 54.4624 151.819C51.9696 153.127 51.6742 153.938 53.7866 154.722H53.791C53.9247 154.769 54.0599 154.816 54.1943 154.862L54.5355 154.981C55.0771 155.166 55.6267 155.347 56.1841 155.525L56.2239 155.538C56.7774 155.713 57.3365 155.884 57.9013 156.051C58.0938 156.107 58.2866 156.163 58.4796 156.219L58.5911 156.251C63.7638 157.717 69.072 158.654 74.434 159.047C75.9473 157.436 88.1962 155.419 86.4863 150.241ZM82.8022 8.51377C105.575 8.20208 115.179 10.638 119.55 12.1772C122.149 13.093 122.82 13.9653 123.011 14.5451C122.597 13.0635 121.065 11.1217 117.331 9.07953L117.318 9.07214C106.276 3.27862 93.7068 0 80.3723 0C64.0412 0 48.8594 4.91682 36.2236 13.3493C44.3023 11.6927 63.0027 8.78409 82.8022 8.51377Z",\n fill: "url(#paint2_linear)"\n }\n ),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint0_linear",\n x1: "7.41796",\n y1: "113.847",\n x2: "152.537",\n y2: "46.268",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#6D6E71" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#B1B3B6", stopOpacity: "0.6" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#D8D9DA" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint1_linear",\n x1: "1.42253",\n y1: "91.3359",\n x2: "158.6",\n y2: "69.2461",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#414042" }),\n /* @__PURE__ */ A("stop", { offset: "0.51", stopColor: "#D3D5D6" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#414042" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint2_linear",\n x1: "8.12231",\n y1: "113.169",\n x2: "152.503",\n y2: "45.8438",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#515254" }),\n /* @__PURE__ */ A("stop", { offset: "0.09", stopColor: "#595A5C" }),\n /* @__PURE__ */ A("stop", { offset: "0.23", stopColor: "#6E6F71" }),\n /* @__PURE__ */ A("stop", { offset: "0.41", stopColor: "#909194" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#B1B3B6" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#3E3E3F" })\n ]\n }\n )\n ] })\n ]\n }\n), kV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "160",\n viewBox: "0 0 160 160",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M75.4854 80.8074C106.714 73.2859 143.941 65.5709 157.825 61.401C159.274 67.4948 160.004 73.7372 160 80.0008C160 81.3557 159.966 82.7024 159.899 84.0409C159.877 84.3645 159.735 84.6684 159.501 84.8934C158.857 85.5063 157.551 86.0739 156.803 86.318C153.637 87.3568 143.365 89.8958 124.47 93.9544C94.8364 100.32 62.4895 108.335 48.0185 112.355C29.4495 117.511 18.077 121.835 12.8535 123.506C10.5782 120.003 8.58175 116.326 6.88268 112.511V112.504C6.34993 111.308 5.84637 110.096 5.37199 108.868V108.858C4.89712 107.632 4.45193 106.391 4.03641 105.136C3.5378 103.628 3.08345 102.101 2.67338 100.554C13.5509 97.5382 42.2658 88.8081 75.4854 80.8074ZM3.75668 55.7093L3.74481 55.7478L3.73368 55.7812C3.72107 55.822 3.70845 55.8621 3.6951 55.9029C3.63129 56.1057 3.56822 56.309 3.50589 56.5128C3.50218 56.5232 3.49921 56.5336 3.49625 56.544C3.47992 56.5959 3.46434 56.6479 3.44876 56.6998C3.34191 57.051 3.23754 57.4027 3.13564 57.7549L3.12599 57.789C3.02261 58.1442 2.92219 58.5008 2.82475 58.8589C38.0692 50.3092 62.8723 43.3064 84.2675 36.6175C96.8071 32.6961 106.002 29.1346 112.206 25.9983C112.35 25.9256 112.492 25.8529 112.633 25.7802L112.759 25.7149C112.857 25.6644 112.955 25.614 113.051 25.5665L113.207 25.4849L113.46 25.3513L113.623 25.2637L113.86 25.1369L114.023 25.0478L114.253 24.9217L114.41 24.8349L114.641 24.7058L114.789 24.6242L115.032 24.4854L115.156 24.4149L115.481 24.2257L115.512 24.2072L115.859 24.0016L115.965 23.9371C116.039 23.8903 116.12 23.8436 116.196 23.7969L116.324 23.7182L116.525 23.5928L116.656 23.5105L116.846 23.3895C116.889 23.3621 116.932 23.3346 116.974 23.3064C117.037 23.2671 117.098 23.227 117.158 23.187L117.282 23.1061L117.465 22.9837L117.579 22.9095C117.645 22.8649 117.71 22.8212 117.773 22.7766L117.866 22.7128C117.96 22.6475 118.053 22.5825 118.144 22.5177C120.175 21.059 123.165 18.4123 122.95 15.2716C122.95 15.2441 122.945 15.2166 122.943 15.1892C122.795 13.6518 121.392 11.4593 117.155 9.13615L116.888 8.99666L116.571 8.83194L116.148 8.61528L115.999 8.54108C115.694 8.38675 115.387 8.2344 115.079 8.08403L114.883 7.98757L114.409 7.75978L114.164 7.64403L113.798 7.47115L113.529 7.34724L113.25 7.21814L112.954 7.08459L112.701 6.97106L112.389 6.83157L112.16 6.73066L111.826 6.58227L111.649 6.50807C111.216 6.32109 110.78 6.13782 110.343 5.95826L110.227 5.91004L109.82 5.74532L109.676 5.68744L109.267 5.52569L109.135 5.47375L108.705 5.30681L108.631 5.27862C107.955 5.01942 107.276 4.76962 106.593 4.52922L106.568 4.52032C106.405 4.46244 106.24 4.40531 106.076 4.34892L106.015 4.32814L105.522 4.15971L105.49 4.14933C104.61 3.85254 103.725 3.57207 102.833 3.30793L102.81 3.30125L102.29 3.14914L102.251 3.13801C101.5 2.92037 100.743 2.71385 99.9814 2.51846C100.032 3.13059 100.046 3.67891 99.9992 4.07661C99.781 5.9271 98.8394 7.4897 97.3859 8.86681C94.3764 11.7175 88.4004 14.6817 80.9746 17.2949C73.0465 20.0944 56.5721 25.5212 41.969 29.1806C32.1748 31.6358 19.2642 34.83 13.0575 36.1804C12.8171 36.547 12.5802 36.9155 12.3467 37.286C12.337 37.3008 12.3274 37.3157 12.3185 37.3305L12.3081 37.3461C12.2688 37.4084 12.2294 37.47 12.1909 37.5323C12.0959 37.6837 12.0014 37.8355 11.9074 37.9879C11.8918 38.0124 11.877 38.0369 11.8622 38.0621C11.8473 38.0873 11.8265 38.1192 11.8095 38.1482C11.7924 38.1771 11.7612 38.2224 11.7353 38.2639C11.6425 38.4123 11.5498 38.5674 11.4578 38.7195C11.434 38.7596 11.4103 38.7996 11.3836 38.8397L11.2968 38.9881C11.2008 39.1469 11.1061 39.3056 11.0126 39.4644C11.0052 39.4763 10.9985 39.4882 10.9918 39.5L10.9874 39.5082C10.7702 39.8772 10.556 40.2482 10.3448 40.6212L10.2127 40.8541C10.1232 41.0144 10.0339 41.1749 9.94486 41.3357L9.93744 41.3483L9.91444 41.3906L9.79572 41.605L9.53306 42.0881C9.49893 42.1519 9.46554 42.2157 9.43141 42.2787L9.39653 42.3433C9.30601 42.5125 9.21549 42.6816 9.12645 42.8516L9.11977 42.8649L9.11458 42.8746C8.90583 43.2703 8.7003 43.6704 8.49798 44.0751L8.39856 44.2717C8.31249 44.4438 8.2279 44.616 8.14331 44.7911V44.797C8.12031 44.843 8.09805 44.889 8.07579 44.935L8.06689 44.9528L8.02237 45.0441C7.93877 45.2152 7.85567 45.3871 7.77306 45.5598L7.66177 45.7957C7.51683 46.0999 7.37437 46.4054 7.23438 46.7121V46.7158C7.0934 47.0219 6.9549 47.3294 6.81887 47.638C6.80329 47.6729 6.7877 47.707 6.77286 47.7412L6.75283 47.7864C6.6722 47.9714 6.59157 48.1567 6.51094 48.3422L6.48423 48.4045C6.46049 48.4609 6.436 48.5165 6.41003 48.5729C6.33138 48.7564 6.25347 48.9405 6.17631 49.125C6.14663 49.1954 6.11695 49.2659 6.08801 49.3372C5.95346 49.6597 5.82114 49.9837 5.69105 50.3092V50.3173V50.3225C5.56145 50.648 5.43333 50.975 5.3067 51.3034L5.27331 51.3895C5.19911 51.5876 5.12491 51.7872 5.05071 51.9831L4.97651 52.1901C4.90231 52.3845 4.83257 52.5796 4.76208 52.7755L4.73314 52.8571C4.71904 52.8942 4.70569 52.9313 4.69233 52.9691C4.57064 53.3085 4.45118 53.6485 4.33395 53.9894C4.33238 53.9932 4.33114 53.9972 4.33024 54.0012L4.32579 54.0138C4.20756 54.3576 4.09206 54.7019 3.97928 55.0467L3.97483 55.06V55.0667C3.97326 55.0703 3.97202 55.074 3.97112 55.0778C3.89445 55.2871 3.82297 55.4975 3.75668 55.7093ZM3.07554 81.1679C5.24956 81.1798 10.8612 80.8927 17.0902 80.2969C27.9395 79.2581 49.6264 76.4386 74.3717 73.2384C93.6351 70.7476 135.785 64.6315 157.826 61.4054C157.79 61.2516 157.754 61.1 157.718 60.9506C157.649 60.6716 157.58 60.3936 157.508 60.1166C157.483 60.0179 157.458 59.92 157.434 59.8198L157.43 59.8035C157.38 59.6145 157.331 59.4253 157.281 59.2359C157.254 59.1357 157.227 59.0355 157.2 58.9391C157.134 58.6957 157.067 58.4531 156.999 58.2112L156.95 58.0383C156.894 57.8417 156.836 57.6466 156.779 57.4514L156.726 57.2682C156.697 57.1687 156.666 57.07 156.637 56.9714C156.579 56.7814 156.522 56.5915 156.464 56.4023C156.433 56.3028 156.402 56.2034 156.371 56.1055C156.306 55.897 156.24 55.6892 156.173 55.4815L156.142 55.3828C156.119 55.3086 156.095 55.2396 156.072 55.1676C156.027 55.0296 155.981 54.8916 155.935 54.7536C155.903 54.6579 155.872 54.5622 155.84 54.4664L155.735 54.16C155.735 54.1526 155.73 54.1452 155.728 54.1378L155.547 53.6184C155.512 53.5167 155.473 53.4143 155.44 53.3127C155.356 53.0757 155.271 52.8398 155.186 52.6048C155.155 52.5195 155.123 52.4342 155.091 52.3481C155.067 52.2821 155.042 52.2168 155.017 52.1507C154.963 52.0023 154.908 51.8591 154.854 51.7137C154.813 51.6061 154.772 51.4993 154.731 51.3924C154.704 51.3182 154.675 51.244 154.647 51.1758L154.534 50.8827C154.492 50.7766 154.451 50.6698 154.408 50.5637C154.366 50.4576 154.328 50.3633 154.288 50.2669C154.239 50.1392 154.187 50.0111 154.134 49.8825C154.093 49.7823 154.051 49.6822 154.011 49.5857L153.931 49.3936C153.878 49.2667 153.826 49.1398 153.772 49.0129C153.725 48.9016 153.678 48.7903 153.631 48.679C153.562 48.5188 153.494 48.359 153.424 48.1997C153.375 48.0899 153.327 47.9803 153.281 47.871C153.24 47.7753 153.197 47.6796 153.154 47.5839C153.098 47.4592 153.043 47.3338 152.987 47.2129C152.937 47.1008 152.886 46.9903 152.835 46.8775C152.783 46.7647 152.737 46.6646 152.686 46.5585C152.655 46.4917 152.625 46.4249 152.594 46.3589C152.541 46.2439 152.487 46.1296 152.433 46.0146C152.369 45.8776 152.304 45.7403 152.238 45.6028L152.231 45.5894L152.218 45.562C152.165 45.45 152.112 45.3394 152.058 45.2274C151.954 45.0127 151.849 44.799 151.744 44.5863C151.685 44.4661 151.624 44.3466 151.564 44.2264L151.402 43.9037L151.353 43.8072C151.344 43.7887 151.334 43.7701 151.325 43.7523L151.145 43.4014L151.081 43.2782C151.028 43.1763 150.975 43.0746 150.923 42.9732L150.744 42.6342C150.633 42.422 150.519 42.2102 150.405 41.999L150.206 41.6362C150.132 41.5071 150.064 41.3772 149.992 41.2481L149.965 41.1984L149.767 40.846C149.745 40.8052 149.722 40.7651 149.699 40.7243L149.536 40.4386C149.472 40.3244 149.407 40.2109 149.341 40.0973C149.275 39.9838 149.221 39.8911 149.161 39.7879C149.092 39.6692 149.023 39.5498 148.953 39.4318L148.731 39.0534C143.092 39.8695 136.24 40.8341 127.82 41.9998C109.334 44.5551 88.5688 47.9489 67.3242 50.6965C34.6835 54.8931 13.3172 58.0205 2.82178 58.8634C2.77627 59.0306 2.7315 59.1973 2.68748 59.3635C2.67858 59.3969 2.66967 59.4295 2.66151 59.4622L2.60809 59.6632C2.60642 59.6686 2.60518 59.674 2.60438 59.6796C2.5653 59.828 2.52622 59.9764 2.48714 60.1248C2.45598 60.2464 2.4263 60.3681 2.39514 60.4898C2.38104 60.5477 2.36694 60.6048 2.3521 60.6619C2.3432 60.6983 2.33429 60.7361 2.32465 60.771C2.315 60.8059 2.31055 60.8282 2.30387 60.8563C2.2831 60.9394 2.26306 61.0233 2.24303 61.1064C0.758763 67.2473 0.00585972 73.5421 0 79.8598C0.0215176 80.6871 1.21241 81.1538 3.0748 81.1642L3.07554 81.1679ZM140.314 132.559C134.971 137.536 115.805 146.553 96.8153 150.304C78.8666 153.85 62.7121 154.641 51.9903 154.654C52.1751 154.919 52.5839 155.167 53.228 155.411C54.5175 155.869 55.822 156.295 57.1412 156.689L57.1753 156.699C57.7402 156.867 58.3071 157.028 58.876 157.183L58.9502 157.204C59.2015 157.272 59.4532 157.34 59.7055 157.406L59.8198 157.436C60.0914 157.506 60.3634 157.575 60.636 157.643L60.7465 157.67C60.9731 157.726 61.1999 157.781 61.4269 157.835L61.6495 157.888C61.887 157.944 62.1249 157.999 62.3633 158.052L62.551 158.094C62.7633 158.141 62.9755 158.187 63.1884 158.233L63.5075 158.301L63.989 158.4L64.3251 158.468C64.5477 158.512 64.7651 158.554 64.9855 158.596L65.3981 158.67L65.7438 158.733L66.189 158.813L66.379 158.845C66.6955 158.9 67.0131 158.952 67.3317 159.003L67.5543 159.038L68.0915 159.12L68.1887 159.135C68.577 159.192 68.966 159.247 69.3558 159.298L69.4033 159.305C69.6081 159.332 69.8129 159.358 70.0177 159.383L70.0718 159.39C70.7025 159.468 71.3354 159.538 71.9706 159.602H71.9802C72.4106 159.645 72.8424 159.685 73.2757 159.721C75.4913 159.905 77.7316 159.998 79.9967 160C104.062 160 125.645 149.373 140.311 132.556L140.314 132.559ZM145.765 107.165C143.701 107.165 131.816 107.443 112.642 109.281C87.5241 111.69 50.9375 116.966 36.143 119.489C26.9542 121.056 18.3842 122.889 13.2096 124.052C13.4416 124.404 13.6766 124.753 13.9145 125.1L14.0748 125.335C14.1737 125.483 14.2753 125.629 14.3797 125.773C14.4361 125.854 14.4932 125.935 14.5496 126.015C14.6543 126.164 14.7581 126.312 14.8635 126.46L14.9733 126.609C15.1905 126.912 15.4101 127.214 15.6322 127.514C15.6782 127.576 15.7227 127.637 15.7687 127.698C15.8785 127.846 15.9913 127.995 16.1011 128.143L16.2659 128.361C16.3786 128.509 16.4922 128.657 16.6064 128.806L16.7274 128.962C16.9836 129.292 17.2418 129.62 17.502 129.946L17.5421 129.997C17.666 130.152 17.7914 130.305 17.9131 130.459L18.0578 130.636C18.1824 130.785 18.3071 130.94 18.4325 131.091L18.546 131.228C18.9659 131.731 19.3918 132.228 19.8237 132.72L19.932 132.844C20.07 133.001 20.2088 133.157 20.3483 133.313C20.3802 133.349 20.4121 133.387 20.4447 133.42C20.9028 133.931 21.367 134.435 21.8374 134.933L21.8842 134.983C22.0375 135.145 22.1916 135.306 22.3464 135.467L22.4206 135.545C23.0766 136.225 23.7443 136.893 24.424 137.548L24.4752 137.597C25.1677 138.264 25.8704 138.917 26.5832 139.559L26.6077 139.581C27.3328 140.231 28.0694 140.867 28.8173 141.491C29.2172 141.827 30.0898 141.887 32.8285 141.368C38.5752 140.281 60.098 136.545 83.9618 133.275C106.414 130.198 130.525 129.546 133.738 129.578C137.936 129.621 141.91 130.555 140.309 132.556C140.489 132.35 140.667 132.144 140.844 131.935L140.883 131.889C140.887 131.886 140.89 131.882 140.893 131.878C141.063 131.68 141.232 131.48 141.4 131.277L141.435 131.236C141.445 131.223 141.455 131.211 141.466 131.199C141.632 131.001 141.798 130.8 141.962 130.597L142.022 130.523C142.19 130.316 142.357 130.109 142.523 129.902L142.555 129.862C143.175 129.084 143.782 128.294 144.374 127.493L144.403 127.455C144.996 126.654 145.573 125.841 146.133 125.017L146.137 125.011L146.153 124.988C146.306 124.763 146.458 124.538 146.609 124.312C146.623 124.29 146.637 124.269 146.652 124.247C146.8 124.025 146.946 123.803 147.091 123.579L147.098 123.567C147.111 123.549 147.123 123.53 147.135 123.512C147.283 123.285 147.429 123.057 147.573 122.828C147.582 122.816 147.59 122.802 147.598 122.79C148.835 120.842 149.987 118.839 151.054 116.78L151.068 116.754C151.196 116.507 151.322 116.259 151.449 116.012L151.461 115.987L151.472 115.967C151.598 115.717 151.721 115.466 151.843 115.215L151.847 115.205L151.857 115.186C152.883 113.093 153.819 110.95 154.665 108.758C154.974 107.857 154.009 107.161 145.764 107.161L145.765 107.165ZM66.7307 9.22593C67.3888 4.45725 54.749 5.24523 54.1911 4.25469C47.6386 6.48831 41.4051 9.56622 35.6481 13.4107C35.3995 13.5747 35.2993 13.9345 36.4487 14.169C38.9514 14.6809 44.2462 15.233 48.0036 15.2641C56.0082 15.3331 66.1304 13.5791 66.7307 9.22593Z",\n fill: "url(#paint0_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n opacity: "0.35",\n d: "M154.645 108.835C147.997 126.031 135.576 140.356 119.764 149.433C119.512 148.913 118.559 148.213 116.334 147.179C114.109 146.145 104.376 142.541 104.462 137.464C104.573 131.066 113.267 125.214 125.614 120.392C137.454 115.768 148.293 112.476 150.292 111.674C152.679 110.717 154.084 110.129 154.645 108.835ZM17.6138 70.1939C31.6685 64.0741 46.4029 57.2316 56.0398 52.6915C71.1163 45.5885 84.2806 36.9326 81.4158 28.1157C78.8686 20.2634 68.3902 21.2072 47.4803 24.949C34.0303 27.3559 16.2463 31.787 13.8482 34.9953L13.7547 35.1326C13.656 35.281 13.5566 35.4294 13.4579 35.5778C5.1625 47.9769 0.24015 62.832 0.00865019 78.8172C0.00419827 79.1637 0.000488281 79.5102 0.000488281 79.8559C0.0309098 78.4336 5.13282 75.6289 17.6138 70.1939ZM133.375 37.9595C116.977 40.3702 90.9556 45.1878 93.4954 60.566C95.4505 72.4058 119.105 75.8589 128.991 77.7651C136.839 79.2794 152.196 81.3718 158.767 83.0138C159.644 83.2364 159.92 83.6549 159.896 84.1268C159.896 84.1216 159.896 84.1171 159.896 84.1119C159.93 83.4308 159.955 82.7474 159.97 82.0618V81.9394C159.986 81.2939 159.994 80.6471 159.994 79.9991C159.994 65.2004 155.975 51.3418 148.971 39.4516L148.694 39.0064C147.851 37.6434 142.185 36.664 133.375 37.9595ZM92.4373 95.2519C90.8754 89.4645 82.4019 85.2791 70.3083 85.5751C57.5461 85.8882 44.2912 87.0917 28.3162 90.6836C14.0411 93.8934 5.3888 97.5929 4.05323 98.1442C2.80149 98.6636 2.37707 99.3402 2.60635 100.323V100.329C2.66225 100.541 2.71814 100.752 2.77404 100.961C2.84824 101.237 2.92244 101.513 3.00331 101.789C3.02706 101.873 3.05154 101.958 3.07751 102.043C3.14132 102.265 3.20513 102.488 3.27043 102.705C3.28898 102.769 3.30753 102.833 3.32682 102.897C3.40794 103.168 3.49006 103.438 3.57316 103.707C3.59764 103.786 3.62287 103.865 3.64736 103.944C3.71265 104.153 3.77943 104.361 3.84621 104.569L3.92412 104.812C4.01068 105.077 4.09873 105.342 4.18827 105.607L4.25727 105.81C4.33147 106.018 4.40047 106.227 4.47319 106.435L4.56816 106.706C4.65324 106.946 4.73956 107.186 4.82712 107.425L4.8939 107.607C4.97749 107.836 5.06257 108.064 5.14914 108.292L5.25821 108.577C5.33192 108.771 5.40612 108.964 5.48081 109.156C5.51123 109.234 5.54091 109.312 5.57207 109.39C5.67101 109.637 5.76994 109.884 5.86887 110.132C5.90819 110.23 5.949 110.327 5.98907 110.428C6.0603 110.6 6.13178 110.774 6.20351 110.948L6.32816 111.245C6.43006 111.484 6.5327 111.723 6.63608 111.961C6.67912 112.06 6.7229 112.158 6.76593 112.258C6.83716 112.42 6.90889 112.581 6.98111 112.742L7.12951 113.075C7.21162 113.256 7.29472 113.437 7.37881 113.618C7.44559 113.766 7.51385 113.907 7.58138 114.051C7.65557 114.208 7.72977 114.365 7.80397 114.52L7.9776 114.881C8.04512 115.02 8.11338 115.159 8.18164 115.298C8.26252 115.462 8.3434 115.625 8.42576 115.788C8.50812 115.952 8.59048 116.118 8.67432 116.282C8.74011 116.411 8.8064 116.539 8.87318 116.668C8.93353 116.785 8.99437 116.902 9.05571 117.019C9.12397 117.151 9.19297 117.282 9.26272 117.413C9.36561 117.608 9.46949 117.802 9.57436 117.996C9.65449 118.144 9.73512 118.293 9.81624 118.441C9.87066 118.54 9.92532 118.639 9.98022 118.738C10.0594 118.881 10.139 119.024 10.2191 119.166L10.3616 119.418C10.51 119.682 10.6614 119.946 10.8157 120.208C10.861 120.283 10.9055 120.362 10.9507 120.439C11.0403 120.592 11.1303 120.744 11.2208 120.896L11.3425 121.099C11.531 121.414 11.7212 121.726 11.9131 122.037L11.9643 122.119C12.0662 122.283 12.1683 122.446 12.2707 122.609L12.3724 122.77C12.7003 123.287 13.034 123.8 13.3733 124.31L13.4475 124.418C13.8071 124.956 14.1739 125.49 14.5479 126.02C14.5516 126.027 14.5561 126.033 14.5605 126.04C17.5236 130.243 20.8829 134.152 24.5922 137.714C24.7233 137.841 24.8553 137.967 24.9884 138.093L25.0804 138.18C25.5751 138.648 26.0772 139.11 26.5866 139.566L26.6096 139.587C27.1187 140.044 27.6338 140.494 28.1552 140.937L28.2695 141.035L28.2762 141.042C28.4592 141.196 28.6432 141.35 28.8282 141.504C28.9094 141.568 29.001 141.618 29.099 141.652C28.8861 141.57 29.2363 141.207 30.3151 140.8C35.0639 139.019 41.0465 136.651 51.5976 131.426C62.182 126.185 66.2719 123.989 77.6272 115.705C88.3905 107.849 94.5223 102.968 92.4373 95.2519ZM86.1423 150.929C85.0493 147.622 76.4683 146.416 66.0656 148.508C60.1 149.708 55.8529 151.526 53.9712 152.515C51.467 153.829 51.1702 154.643 53.2923 155.431H53.2967C53.431 155.478 53.5668 155.525 53.7018 155.572L54.0446 155.69C54.5888 155.876 55.1408 156.059 55.7008 156.237L55.7408 156.251C56.2968 156.426 56.8585 156.598 57.4259 156.766C57.6193 156.822 57.813 156.879 58.0069 156.935L58.1189 156.967C63.3153 158.44 68.6479 159.381 74.0345 159.776C75.5549 158.157 87.86 156.13 86.1423 150.929ZM82.4413 8.55276C105.318 8.23965 114.967 10.6867 119.358 12.233C121.968 13.153 122.643 14.0293 122.834 14.6117C122.419 13.1233 120.88 11.1727 117.129 9.12112L117.116 9.1137C106.023 3.29363 93.396 0 80.0001 0C63.594 0 48.3425 4.93934 35.6485 13.4105C43.7644 11.7462 62.5508 8.82432 82.4413 8.55276Z",\n fill: "url(#paint1_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M154.645 108.835C147.997 126.031 135.576 140.356 119.764 149.433C119.512 148.913 118.559 148.213 116.334 147.179C114.109 146.145 104.376 142.541 104.462 137.464C104.573 131.066 113.267 125.214 125.614 120.392C137.454 115.768 148.293 112.476 150.292 111.674C152.679 110.717 154.084 110.129 154.645 108.835ZM17.6138 70.1939C31.6685 64.0741 46.4029 57.2316 56.0398 52.6915C71.1163 45.5885 84.2806 36.9326 81.4158 28.1157C78.8686 20.2634 68.3902 21.2072 47.4803 24.949C34.0303 27.3559 16.2463 31.787 13.8482 34.9953L13.7547 35.1326C13.656 35.281 13.5566 35.4294 13.4579 35.5778C5.1625 47.9769 0.24015 62.832 0.00865019 78.8172C0.00419827 79.1637 0.000488281 79.5102 0.000488281 79.8559C0.0309098 78.4336 5.13282 75.6289 17.6138 70.1939ZM133.375 37.9595C116.977 40.3702 90.9556 45.1878 93.4954 60.566C95.4505 72.4058 119.105 75.8589 128.991 77.7651C136.839 79.2794 152.196 81.3718 158.767 83.0138C159.644 83.2364 159.92 83.6549 159.896 84.1268C159.896 84.1216 159.896 84.1171 159.896 84.1119C159.93 83.4308 159.955 82.7474 159.97 82.0618V81.9394C159.986 81.2939 159.994 80.6471 159.994 79.9991C159.994 65.2004 155.975 51.3418 148.971 39.4516L148.694 39.0064C147.851 37.6434 142.185 36.664 133.375 37.9595ZM92.4373 95.2519C90.8754 89.4645 82.4019 85.2791 70.3083 85.5751C57.5461 85.8882 44.2912 87.0917 28.3162 90.6836C14.0411 93.8934 5.3888 97.5929 4.05323 98.1442C2.80149 98.6636 2.37707 99.3402 2.60635 100.323V100.329C2.66225 100.541 2.71814 100.752 2.77404 100.961C2.84824 101.237 2.92244 101.513 3.00331 101.789C3.02706 101.873 3.05154 101.958 3.07751 102.043C3.14132 102.265 3.20513 102.488 3.27043 102.705C3.28898 102.769 3.30753 102.833 3.32682 102.897C3.40794 103.168 3.49006 103.438 3.57316 103.707C3.59764 103.786 3.62287 103.865 3.64736 103.944C3.71265 104.153 3.77943 104.361 3.84621 104.569L3.92412 104.812C4.01068 105.077 4.09873 105.342 4.18827 105.607L4.25727 105.81C4.33147 106.018 4.40047 106.227 4.47319 106.435L4.56816 106.706C4.65324 106.946 4.73956 107.186 4.82712 107.425L4.8939 107.607C4.97749 107.836 5.06257 108.064 5.14914 108.292L5.25821 108.577C5.33192 108.771 5.40612 108.964 5.48081 109.156C5.51123 109.234 5.54091 109.312 5.57207 109.39C5.67101 109.637 5.76994 109.884 5.86887 110.132C5.90819 110.23 5.949 110.327 5.98907 110.428C6.0603 110.6 6.13178 110.774 6.20351 110.948L6.32816 111.245C6.43006 111.484 6.5327 111.723 6.63608 111.961C6.67912 112.06 6.7229 112.158 6.76593 112.258C6.83716 112.42 6.90889 112.581 6.98111 112.742L7.12951 113.075C7.21162 113.256 7.29472 113.437 7.37881 113.618C7.44559 113.766 7.51385 113.907 7.58138 114.051C7.65557 114.208 7.72977 114.365 7.80397 114.52L7.9776 114.881C8.04512 115.02 8.11338 115.159 8.18164 115.298C8.26252 115.462 8.3434 115.625 8.42576 115.788C8.50812 115.952 8.59048 116.118 8.67432 116.282C8.74011 116.411 8.8064 116.539 8.87318 116.668C8.93353 116.785 8.99437 116.902 9.05571 117.019C9.12397 117.151 9.19297 117.282 9.26272 117.413C9.36561 117.608 9.46949 117.802 9.57436 117.996C9.65449 118.144 9.73512 118.293 9.81624 118.441C9.87066 118.54 9.92532 118.639 9.98022 118.738C10.0594 118.881 10.139 119.024 10.2191 119.166L10.3616 119.418C10.51 119.682 10.6614 119.946 10.8157 120.208C10.861 120.283 10.9055 120.362 10.9507 120.439C11.0403 120.592 11.1303 120.744 11.2208 120.896L11.3425 121.099C11.531 121.414 11.7212 121.726 11.9131 122.037L11.9643 122.119C12.0662 122.283 12.1683 122.446 12.2707 122.609L12.3724 122.77C12.7003 123.287 13.034 123.8 13.3733 124.31L13.4475 124.418C13.8071 124.956 14.1739 125.49 14.5479 126.02C14.5516 126.027 14.5561 126.033 14.5605 126.04C17.5236 130.243 20.8829 134.152 24.5922 137.714C24.7233 137.841 24.8553 137.967 24.9884 138.093L25.0804 138.18C25.5751 138.648 26.0772 139.11 26.5866 139.566L26.6096 139.587C27.1187 140.044 27.6338 140.494 28.1552 140.937L28.2695 141.035L28.2762 141.042C28.4592 141.196 28.6432 141.35 28.8282 141.504C28.9094 141.568 29.001 141.618 29.099 141.652C28.8861 141.57 29.2363 141.207 30.3151 140.8C35.0639 139.019 41.0465 136.651 51.5976 131.426C62.182 126.185 66.2719 123.989 77.6272 115.705C88.3905 107.849 94.5223 102.968 92.4373 95.2519ZM86.1423 150.929C85.0493 147.622 76.4683 146.416 66.0656 148.508C60.1 149.708 55.8529 151.526 53.9712 152.515C51.467 153.829 51.1702 154.643 53.2923 155.431H53.2967C53.431 155.478 53.5668 155.525 53.7018 155.572L54.0446 155.69C54.5888 155.876 55.1408 156.059 55.7008 156.237L55.7408 156.251C56.2968 156.426 56.8585 156.598 57.4259 156.766C57.6193 156.822 57.813 156.879 58.0069 156.935L58.1189 156.967C63.3153 158.44 68.6479 159.381 74.0345 159.776C75.5549 158.157 87.86 156.13 86.1423 150.929ZM82.4413 8.55276C105.318 8.23965 114.967 10.6867 119.358 12.233C121.968 13.153 122.643 14.0293 122.834 14.6117C122.419 13.1233 120.88 11.1727 117.129 9.12112L117.116 9.1137C106.023 3.29363 93.396 0 80.0001 0C63.594 0 48.3425 4.93934 35.6485 13.4105C43.7644 11.7462 62.5508 8.82432 82.4413 8.55276Z",\n fill: "url(#paint2_linear)"\n }\n ),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint0_linear",\n x1: "1.42907",\n y1: "91.7545",\n x2: "159.328",\n y2: "69.5628",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#414042" }),\n /* @__PURE__ */ A("stop", { offset: "0.3", stopColor: "#808285" }),\n /* @__PURE__ */ A("stop", { offset: "0.53", stopColor: "#A7A9AC" }),\n /* @__PURE__ */ A("stop", { offset: "0.77", stopColor: "#808285" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#414042" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint1_linear",\n x1: "7.41814",\n y1: "113.688",\n x2: "152.461",\n y2: "46.0521",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#6D6E71" }),\n /* @__PURE__ */ A("stop", { offset: "0.12", stopColor: "#757679" }),\n /* @__PURE__ */ A("stop", { offset: "0.3", stopColor: "#8A8B8E" }),\n /* @__PURE__ */ A("stop", { offset: "0.52", stopColor: "#ACAEB1" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#B1B3B6" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#808285" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint2_linear",\n x1: "7.41814",\n y1: "113.688",\n x2: "152.461",\n y2: "46.0521",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#6D6E71" }),\n /* @__PURE__ */ A("stop", { offset: "0.12", stopColor: "#757679" }),\n /* @__PURE__ */ A("stop", { offset: "0.3", stopColor: "#8A8B8E" }),\n /* @__PURE__ */ A("stop", { offset: "0.52", stopColor: "#ACAEB1" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#B1B3B6" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#808285" })\n ]\n }\n )\n ] })\n ]\n }\n), NV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "160",\n height: "130",\n viewBox: "0 0 160 130",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M2.23805 85.8336C1.64946 85.8462 1.07975 85.6269 0.653288 85.2237C0.233418 84.7754 0 84.1858 0 83.5734C0 82.9611 0.233418 82.3715 0.653288 81.9232C1.08623 81.5284 1.65253 81.3093 2.24023 81.3093C2.82793 81.3093 3.39423 81.5284 3.82717 81.9232C4.24704 82.3715 4.48045 82.9611 4.48045 83.5734C4.48045 84.1858 4.24704 84.7754 3.82717 85.2237C3.39911 85.6272 2.82797 85.8464 2.23805 85.8336ZM3.97955 108.604H0.496552V89.32H3.97955V108.604Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M9.96604 89.8783C10.7628 89.6793 11.8164 89.4673 13.1356 89.2467C14.6417 89.0113 16.1649 88.8999 17.6896 88.9137C19.0018 88.8725 20.309 89.0931 21.5339 89.5625C22.4936 89.9482 23.3366 90.5741 23.9807 91.3793C24.6176 92.2056 25.0635 93.1611 25.2869 94.178C25.5441 95.3603 25.6682 96.5673 25.6569 97.7769V108.591H22.1739V98.5166C22.1865 97.502 22.1049 96.4884 21.9301 95.4886C21.8142 94.76 21.5409 94.065 21.129 93.4513C20.7564 92.9337 20.2363 92.539 19.6357 92.3179C18.8923 92.0651 18.1093 91.9464 17.3239 91.9676C16.9494 91.9676 16.562 91.9676 16.1658 92.0022C15.7696 92.0368 15.3864 92.0584 15.0251 92.0973C14.6637 92.1363 14.3416 92.1752 14.0542 92.2271L13.4403 92.3352V108.604H9.95734L9.96604 89.8783Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M34.3208 89.3201H41.6742V92.2139H34.3208V101.112C34.3051 101.915 34.3796 102.717 34.5428 103.504C34.651 104.043 34.8818 104.55 35.2176 104.987C35.5086 105.343 35.8973 105.608 36.3366 105.749C36.8439 105.904 37.373 105.979 37.9039 105.969C38.7568 105.998 39.6082 105.879 40.4204 105.619C41.056 105.385 41.4957 105.217 41.7265 105.117L42.397 107.972C41.8047 108.234 41.1935 108.451 40.5684 108.621C39.5971 108.894 38.591 109.025 37.5817 109.01C36.4718 109.045 35.365 108.876 34.3164 108.513C33.5006 108.208 32.7841 107.687 32.244 107.008C31.694 106.279 31.3174 105.436 31.1425 104.542C30.9183 103.426 30.8118 102.289 30.8247 101.151V83.9433L34.3077 83.3507L34.3208 89.3201Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M44.6043 99.0012C44.5723 97.4788 44.8248 95.9637 45.3487 94.5328C45.7857 93.3543 46.458 92.2758 47.3253 91.3621C48.1243 90.5362 49.0923 89.8901 50.164 89.4675C51.2083 89.0536 52.3223 88.8407 53.4467 88.8403C56.059 88.8403 58.0617 89.6492 59.4592 91.267C60.8568 92.8847 61.549 95.3547 61.549 98.6638V99.2391C61.5503 99.456 61.5372 99.6727 61.5098 99.8879H48.2222C48.3731 101.889 48.9536 103.41 49.9637 104.451C50.9738 105.493 52.5702 106.012 54.7528 106.009C55.7894 106.029 56.8247 105.923 57.8353 105.693C58.4798 105.543 59.1104 105.339 59.7205 105.083L60.2037 107.973C59.4934 108.292 58.7483 108.528 57.9833 108.678C56.8014 108.938 55.5933 109.063 54.3828 109.05C52.8838 109.084 51.3928 108.825 49.9942 108.288C48.8299 107.832 47.7871 107.116 46.9466 106.195C46.1444 105.274 45.5505 104.193 45.2051 103.024C44.7992 101.721 44.5966 100.365 44.6043 99.0012ZM57.9267 97.1066C58.0088 95.7291 57.5918 94.3681 56.7512 93.2697C56.3524 92.7765 55.8422 92.3836 55.262 92.1228C54.6819 91.862 54.048 91.7407 53.4119 91.7687C52.6793 91.7612 51.9554 91.9273 51.3003 92.2532C50.7091 92.5488 50.1835 92.9592 49.7547 93.4601C49.3249 93.9653 48.9888 94.5424 48.7621 95.1644C48.5307 95.7988 48.3743 96.4578 48.2962 97.1282L57.9267 97.1066Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M73.1476 88.9136C73.4908 88.9153 73.8337 88.934 74.1751 88.9699C74.5582 89.0045 74.937 89.0564 75.3114 89.117C75.6858 89.1775 76.0254 89.2424 76.3389 89.303C76.571 89.3453 76.8006 89.4002 77.0268 89.4673L76.4303 92.4736C75.9849 92.3292 75.5313 92.2107 75.0719 92.1189C74.2654 91.9691 73.4456 91.901 72.6251 91.9156C71.9783 91.9162 71.3333 91.9844 70.7008 92.1189C70.0695 92.2574 69.6515 92.3482 69.4513 92.4001V108.604H65.9683V90.1378C66.964 89.7915 67.9822 89.5126 69.0159 89.303C70.3754 89.0287 71.7604 88.8982 73.1476 88.9136Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M83.6354 89.3201H90.9845V92.2139H83.6354V101.112C83.6198 101.915 83.6943 102.717 83.8575 103.504C83.9639 104.044 84.1949 104.551 84.5323 104.987C84.8233 105.343 85.212 105.608 85.6512 105.749C86.1585 105.905 86.6876 105.979 87.2186 105.969C88.0714 105.998 88.9228 105.879 89.735 105.619C90.3707 105.385 90.8104 105.217 91.0629 105.117L91.7334 107.972C91.1412 108.234 90.5299 108.451 89.9048 108.621C88.9335 108.894 87.9274 109.025 86.9181 109.01C85.8082 109.045 84.7014 108.876 83.6528 108.513C82.837 108.208 82.1205 107.687 81.5805 107.008C81.0305 106.279 80.6539 105.436 80.479 104.542C80.2548 103.426 80.1483 102.289 80.1611 101.151V83.9433L83.6441 83.3507L83.6354 89.3201Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M102.557 88.9136C102.9 88.9152 103.243 88.934 103.584 88.9698C103.968 89.0044 104.351 89.0563 104.721 89.1169C105.091 89.1775 105.439 89.2423 105.748 89.3029C105.982 89.3454 106.213 89.4002 106.441 89.4673L105.844 92.4736C104.616 92.0704 103.327 91.8816 102.035 91.9156C101.389 91.9158 100.746 91.984 100.115 92.1189C99.4789 92.2573 99.0609 92.3481 98.865 92.4001V108.604H95.382V90.1377C96.3778 89.7915 97.396 89.5126 98.4296 89.3029C99.7878 89.0289 101.171 88.8984 102.557 88.9136Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M126.058 108.046C125.261 108.245 124.212 108.457 122.902 108.677C121.403 108.914 119.887 109.025 118.369 109.01C117.082 109.047 115.799 108.827 114.599 108.362C113.633 107.97 112.785 107.338 112.135 106.528C111.494 105.699 111.037 104.745 110.794 103.729C110.508 102.557 110.369 101.354 110.38 100.147V89.3332H113.863V99.4205C113.863 101.771 114.236 103.452 114.982 104.464C115.728 105.476 116.985 105.983 118.753 105.983C119.123 105.983 119.51 105.983 119.906 105.948C120.302 105.913 120.677 105.892 121.03 105.853C121.382 105.814 121.691 105.779 121.979 105.745C122.189 105.722 122.396 105.679 122.597 105.615V89.3202H126.08L126.058 108.046Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M136.547 106.121C137.966 106.121 139.017 105.935 139.699 105.563C140.025 105.397 140.296 105.14 140.478 104.823C140.661 104.507 140.747 104.145 140.726 103.781C140.738 103.391 140.652 103.004 140.476 102.654C140.301 102.305 140.041 102.004 139.721 101.778C138.681 101.098 137.567 100.54 136.399 100.113C135.65 99.8245 134.935 99.5217 134.252 99.2045C133.613 98.9222 133.015 98.554 132.476 98.1101C131.934 97.6596 131.503 97.0906 131.218 96.4476C130.934 95.8045 130.802 95.1048 130.835 94.403C130.805 93.6247 130.962 92.8504 131.293 92.1442C131.624 91.438 132.119 90.82 132.737 90.3413C134.009 89.3377 135.738 88.8374 137.927 88.8403C138.475 88.8403 139.023 88.8707 139.568 88.9311C140.117 88.9917 140.626 89.0695 141.101 89.1517C141.575 89.2339 141.972 89.3334 142.35 89.4329C142.729 89.5324 142.99 89.6189 143.191 89.6924L142.555 92.6598C141.998 92.3949 141.414 92.189 140.814 92.0456C139.873 91.82 138.907 91.7139 137.94 91.7298C137.059 91.7105 136.187 91.9081 135.402 92.3051C135.064 92.4672 134.782 92.7241 134.59 93.044C134.398 93.3638 134.305 93.7326 134.322 94.1046C134.313 94.4886 134.395 94.8694 134.562 95.2163C134.742 95.557 134.998 95.8528 135.31 96.0814C135.697 96.3702 136.116 96.6127 136.56 96.8038C137.056 97.0244 137.653 97.2623 138.349 97.5088C139.272 97.8549 140.091 98.1923 140.814 98.5254C141.481 98.8287 142.104 99.2217 142.664 99.6933C143.171 100.138 143.573 100.689 143.839 101.307C144.13 102.045 144.269 102.833 144.249 103.625C144.249 105.407 143.583 106.756 142.25 107.67C140.918 108.584 139.021 109.041 136.56 109.041C135.202 109.081 133.846 108.935 132.528 108.608C131.859 108.426 131.199 108.209 130.552 107.96L131.183 104.992C131.584 105.144 132.215 105.364 133.09 105.663C134.211 105.997 135.377 106.151 136.547 106.121Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M151.924 89.3201H159.273V92.2139H151.924V101.112C151.908 101.915 151.983 102.717 152.146 103.504C152.254 104.043 152.485 104.55 152.821 104.987C153.112 105.343 153.5 105.608 153.94 105.749C154.447 105.904 154.976 105.979 155.507 105.969C156.36 105.998 157.211 105.879 158.023 105.619C158.659 105.385 159.099 105.217 159.33 105.117L160 107.972C159.408 108.234 158.797 108.451 158.171 108.621C157.2 108.894 156.194 109.025 155.185 109.01C154.075 109.045 152.968 108.876 151.919 108.513C151.104 108.208 150.387 107.687 149.847 107.008C149.297 106.279 148.921 105.436 148.746 104.542C148.521 103.426 148.415 102.289 148.428 101.151V83.9433L151.911 83.3507L151.924 89.3201Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M44.6041 45.7437C44.7899 46.4445 44.9989 47.1395 45.2311 47.8287C45.4183 48.3997 45.6229 48.9663 45.8406 49.5243C46.0583 50.078 46.276 50.6317 46.5328 51.1724C47.3081 52.9092 48.2224 54.5814 49.267 56.1728C51.6572 55.4158 56.8643 53.4477 65.3758 51.1032C71.9979 49.2734 86.8093 45.6269 100.376 42.7331C109.026 40.8861 113.733 39.7311 115.178 39.2726C115.625 39.1312 116.042 38.9115 116.41 38.6237C116.519 38.5215 116.584 38.3825 116.593 38.2344C116.624 37.6245 116.641 37.0146 116.641 36.396C116.641 33.5468 116.307 30.7073 115.644 27.9351C109.288 29.8341 92.2428 33.3422 77.9451 36.7637C62.7375 40.4016 49.5892 44.3725 44.6041 45.7437Z",\n fill: "url(#paint0_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M45.1054 25.3396V25.3959C45.0792 25.4867 45.0488 25.5775 45.0183 25.6727L44.9965 25.7462C44.9486 25.902 44.9008 26.062 44.8572 26.2264C44.8093 26.3864 44.7614 26.5508 44.7179 26.7152C60.8529 22.8221 72.2118 19.6384 82.0034 16.5975C87.7459 14.811 91.956 13.1933 94.799 11.7658L94.9906 11.6663L95.0515 11.636L95.1822 11.5668L95.2562 11.5322L95.3694 11.4717L95.4477 11.4284L95.5522 11.3722L95.6306 11.3332L95.7351 11.2727L95.8047 11.2337L95.9136 11.1775L95.9789 11.1386L96.0877 11.0737L96.1487 11.0434L96.2967 10.9569L96.4534 10.8661L96.5057 10.8358L96.6102 10.7709L96.6668 10.7363L96.7582 10.6801L96.8191 10.6411L96.9062 10.5849L96.9672 10.546L97.0499 10.4941L97.1065 10.4551L97.1892 10.4032L97.2415 10.3643L97.3329 10.3037L97.3764 10.2778L97.5027 10.1869C98.4344 9.52945 99.8015 8.3226 99.7013 6.89514V6.86054C99.6317 6.15979 98.9917 5.16057 97.0499 4.10511L96.928 4.04023L96.7843 3.96669L96.5884 3.8672L96.5187 3.8326L96.0834 3.62497L95.9963 3.58171L95.7786 3.4779L95.6698 3.42599L95.5 3.34813L95.3781 3.29189L95.2475 3.23134L95.1168 3.17078L94.9993 3.11887L94.8556 3.05831L94.7511 3.01073L94.5988 2.94584L94.516 2.91124L93.9196 2.66036L93.8673 2.63873L93.6801 2.56086L93.6148 2.53491L93.4276 2.46137H93.3666L93.1707 2.38352H93.1359C92.8268 2.26672 92.5177 2.15426 92.2042 2.04612L91.9778 1.96825H91.9517L91.7253 1.89472C91.3204 1.76062 90.9155 1.63086 90.5062 1.50974L90.2711 1.44053C89.9272 1.34104 89.5832 1.2502 89.2349 1.15936C89.2563 1.39535 89.2563 1.63278 89.2349 1.86877C89.109 2.70874 88.6842 3.47606 88.0377 4.03158C86.6575 5.32927 83.9234 6.67454 80.5231 7.86409C76.8921 9.13582 69.347 11.6058 62.6727 13.2711C58.184 14.3871 52.2716 15.8405 49.433 16.4548L49.1065 16.9566V16.9782L49.0542 17.0604L48.9236 17.268V17.3026L48.9018 17.3415L48.867 17.3934L48.7408 17.6011L48.7059 17.6573L48.6667 17.7222L48.5361 17.9385C48.436 18.1028 48.3359 18.2759 48.2401 18.4446C48.2401 18.4792 48.2009 18.5138 48.1791 18.5484L48.0572 18.769C48.04 18.8016 48.0211 18.8334 48.0006 18.8642L47.8831 19.0848L47.8352 19.1713V19.2016L47.7133 19.4308C47.6175 19.6125 47.5217 19.7942 47.4303 19.9758L47.3867 20.0667L47.2692 20.3003L47.2387 20.3608V20.4041L47.1212 20.6377C47.1212 20.6723 47.0907 20.7069 47.0733 20.7458L46.8773 21.1784C46.812 21.3168 46.7467 21.4552 46.6858 21.6109L46.664 21.6542C46.6248 21.7407 46.59 21.8229 46.5552 21.9094V21.9354L46.5203 22.0132C46.4855 22.0954 46.4507 22.1819 46.4115 22.2641L46.3723 22.3593C46.3114 22.5063 46.2504 22.6534 46.1938 22.7918C46.1329 22.9389 46.0763 23.0903 46.0197 23.2244V23.2633L45.9152 23.5358C45.9152 23.5661 45.8934 23.5964 45.8803 23.631L45.7846 23.8949V23.9338L45.7628 23.9857C45.7105 24.1371 45.654 24.2928 45.6017 24.4485C45.5451 24.6086 45.4929 24.7643 45.4406 24.92L45.1054 25.3396Z",\n fill: "url(#paint1_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M44.7915 36.9239C45.7885 36.9239 48.3572 36.7984 51.2089 36.5259C56.1765 36.0544 66.1074 34.7697 77.4358 33.3163C86.2565 32.183 105.552 29.3973 115.644 27.9309L115.596 27.7276C115.562 27.5978 115.531 27.4724 115.501 27.3469C115.501 27.3037 115.475 27.2561 115.466 27.2128C115.444 27.1263 115.422 27.0398 115.396 26.9533C115.37 26.8668 115.396 26.8625 115.361 26.8192L115.27 26.4861C115.261 26.4608 115.253 26.4347 115.248 26.4083L115.17 26.1401L115.144 26.0579L115.104 25.9238C115.078 25.8373 115.052 25.7508 115.022 25.6643L114.983 25.5302L114.891 25.2447V25.2014L114.856 25.1019C114.835 25.0414 114.817 24.9765 114.795 24.9159C114.774 24.8554 114.765 24.8251 114.752 24.7818C114.733 24.7366 114.717 24.6904 114.704 24.6434C114.678 24.5612 114.647 24.4834 114.621 24.4055C114.595 24.3276 114.591 24.3103 114.573 24.2671L114.43 23.9081L114.386 23.7913C114.377 23.7614 114.365 23.7325 114.351 23.7048C114.329 23.6355 114.303 23.5707 114.277 23.5058C114.261 23.4558 114.242 23.4067 114.221 23.3587C114.207 23.3262 114.195 23.293 114.186 23.2592L114.134 23.1251L114.073 22.9824L114.02 22.844C113.994 22.7877 113.972 22.7272 113.946 22.6709L113.894 22.5325L113.855 22.446L113.785 22.273L113.72 22.1216C113.685 22.048 113.655 21.9745 113.624 21.901L113.559 21.7539L113.498 21.6241C113.476 21.5636 113.45 21.5073 113.424 21.4511C113.398 21.3949 113.376 21.3516 113.354 21.2997C113.332 21.2478 113.311 21.2002 113.285 21.1526L113.245 21.0618L113.171 20.9061L113.08 20.7201C113.058 20.6682 113.032 20.6163 113.006 20.5644C112.98 20.5124 112.914 20.3697 112.862 20.2745L112.784 20.1102L112.706 19.9631V19.9198V19.8939L112.623 19.7338L112.597 19.6776C112.571 19.6343 112.549 19.5868 112.523 19.5392C112.498 19.4873 112.47 19.4368 112.44 19.3878L112.288 19.098L112.196 18.9336C112.161 18.873 112.131 18.8125 112.096 18.7562V18.7346L112.009 18.5746L111.974 18.5183C111.952 18.4751 111.926 18.4318 111.9 18.3886L111.813 18.2328L111.73 18.0901L111.634 17.93L111.53 17.757C108.948 18.129 105.814 18.5659 101.952 19.098C93.4881 20.2572 83.9839 21.8015 74.2533 23.0516C59.3112 24.9722 49.5283 26.3953 44.7261 26.776L44.6608 27.0052V27.0485L44.6347 27.1436C44.6347 27.2128 44.5955 27.2821 44.5781 27.3513L44.5389 27.5156V27.5935V27.6411V27.68L44.5128 27.7968C43.8332 30.59 43.4883 33.4533 43.4853 36.3269C43.3939 36.7033 43.9381 36.9196 44.7915 36.9239Z",\n fill: "url(#paint2_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M107.624 60.2993C105.182 62.5659 96.4048 66.6666 87.7104 68.3709C80.9479 69.6767 74.0758 70.34 67.1868 70.3521C67.3403 70.5155 67.5361 70.6338 67.7528 70.6938C68.3449 70.9057 68.9414 71.0961 69.5466 71.2778L70.3259 71.4984H70.3607L70.709 71.5892H70.7613L71.1313 71.6844H71.1836L71.497 71.7579L71.5972 71.7838L71.9237 71.8574H72.0108L72.3025 71.9223L72.4505 71.9526L72.6682 72.0001L72.8249 72.0304L73.1253 72.0866L73.3126 72.1212L73.4736 72.1515L73.6783 72.1861H73.7653L74.2007 72.2553H74.3008L74.549 72.2943H74.5926L75.1281 72.3678H75.1498L75.4285 72.4024H75.4546C75.7463 72.437 76.0336 72.4716 76.3253 72.4976L76.9175 72.5538C77.9333 72.6374 78.9594 72.6793 79.9956 72.6793C85.23 72.685 90.4047 71.5734 95.1692 69.4196C99.9336 67.2658 104.177 64.1201 107.611 60.1955L107.624 60.2993Z",\n fill: "url(#paint3_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M110.124 48.75C109.179 48.75 103.737 48.8754 94.9552 49.7103C83.4569 50.8047 66.7037 53.2054 59.9337 54.356C55.7236 55.0654 51.8009 55.9003 49.4324 56.4323L49.7546 56.9081L49.8286 57.012C49.8722 57.0812 49.9201 57.146 49.9679 57.2109L50.0463 57.3234L50.19 57.5267L50.2379 57.5959L50.5426 58.0068L50.6036 58.089L50.756 58.2923C50.7821 58.3226 50.8039 58.3572 50.83 58.3918L50.9867 58.5908L51.0433 58.6643L51.396 59.0969V59.1229L51.5701 59.3305L51.6354 59.4127L51.8052 59.6203L51.8575 59.6809C52.0534 59.9101 52.245 60.1134 52.4452 60.36L52.4931 60.4162L52.6847 60.6282L52.7282 60.6801L53.3639 61.3679L53.3856 61.3895L53.599 61.6101L53.6338 61.6447C53.9342 61.9561 54.239 62.2589 54.5524 62.5574L54.5742 62.579C54.892 62.8818 55.2142 63.1803 55.5407 63.4701C55.876 63.7643 56.2112 64.0541 56.5552 64.3352C56.738 64.4866 57.1386 64.5126 58.3924 64.279C61.0047 63.7859 70.8746 62.0859 81.8025 60.5979C89.3722 59.6313 96.9897 59.0796 104.621 58.9455C106.541 58.9671 108.36 59.3781 107.629 60.2994L107.873 60.0183V59.9966L108.104 59.7241V59.7025L108.33 59.43L108.36 59.3997L108.587 59.1142C108.87 58.7595 109.148 58.4005 109.418 58.0371C109.688 57.6738 109.954 57.3018 110.211 56.9298L110.42 56.6226L110.441 56.5967L110.642 56.2896V56.2636L110.846 55.9522C111.412 55.0654 111.939 54.157 112.431 53.2184C112.492 53.1059 112.549 52.9934 112.605 52.881L112.775 52.5393C113.241 51.5876 113.672 50.61 114.081 49.6151C114.338 49.0658 113.898 48.75 110.124 48.75Z",\n fill: "url(#paint4_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M73.9402 4.19608C74.2449 2.03327 68.4545 2.38798 68.2019 1.93811C65.2014 2.95311 62.3473 4.3535 59.7121 6.10369C59.5989 6.17722 59.551 6.3416 60.0778 6.44541C61.8255 6.74741 63.594 6.91516 65.3676 6.94718C69.0291 6.97746 73.6615 6.17289 73.9402 4.19608Z",\n fill: "url(#paint5_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M112.196 50.8005C111.282 51.1682 106.319 52.6648 100.898 54.7671C95.2384 56.9602 91.2634 59.6248 91.2112 62.5532C91.172 64.8588 95.6302 66.5025 96.649 66.9697C97.6678 67.4368 98.1032 67.7569 98.2164 67.9949C105.509 63.8357 111.146 57.3179 114.186 49.5287C113.933 50.0997 113.289 50.3679 112.196 50.8005Z",\n fill: "url(#paint6_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M51.4483 31.9322C57.8831 29.1465 64.6314 26.0363 69.0417 23.9687C75.9468 20.7374 81.9724 16.8011 80.6619 12.7913C79.4951 9.21828 74.6973 9.64652 65.1234 11.3508C58.9672 12.4452 50.8213 14.4609 49.7242 15.9187L49.685 15.9836L49.5457 16.1825C45.621 22.0103 43.4825 28.8442 43.3895 35.8555C43.3895 36.0155 43.3895 36.1713 43.3895 36.3313C43.3982 35.6825 45.7361 34.4064 51.4483 31.9322Z",\n fill: "url(#paint7_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M104.451 17.2682C96.9412 18.3669 85.0293 20.5557 86.1918 27.5546C87.0887 32.94 97.9164 34.5102 102.444 35.3753C106.036 36.0631 113.067 37.019 116.076 37.7631C116.476 37.8625 116.603 38.0572 116.594 38.2691C116.594 37.9577 116.62 37.6463 116.629 37.3348V37.2786C116.629 36.9902 116.629 36.7018 116.629 36.4135C116.638 29.9276 114.895 23.5581 111.583 17.969L111.452 17.7657C111.078 17.1255 108.483 16.6799 104.451 17.2682Z",\n fill: "url(#paint8_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M85.6947 43.33C84.9763 40.7 81.0971 38.7924 75.5635 38.9308C69.0918 39.0504 62.6494 39.8287 56.3374 41.2537C52.5407 42.0574 48.8227 43.1923 45.2266 44.645C44.6519 44.8829 44.4604 45.19 44.5649 45.6356C44.591 45.7307 44.6171 45.8302 44.6389 45.9254C44.6708 46.0494 44.7056 46.1748 44.7434 46.3017C44.7434 46.3406 44.7434 46.3796 44.7738 46.4142C44.8043 46.518 44.8348 46.6175 44.8609 46.717L44.887 46.8035C44.9262 46.9289 44.9654 47.05 45.0002 47.1712C45.0002 47.2101 45.0263 47.2447 45.0351 47.2793L45.1265 47.5648C45.1401 47.6017 45.1517 47.6392 45.1613 47.6773C45.2005 47.7984 45.244 47.9152 45.2832 48.0363C45.2832 48.0666 45.2832 48.0968 45.3137 48.1315L45.4138 48.4126C45.4138 48.4559 45.4443 48.4948 45.4574 48.5381L45.5749 48.8625C45.587 48.8906 45.5972 48.9195 45.6054 48.949L45.723 49.2604L45.7752 49.3902C45.8057 49.4767 45.8405 49.5632 45.8753 49.6498C45.8872 49.6868 45.9018 49.7229 45.9189 49.7579C45.9624 49.8704 46.006 49.9828 46.0538 50.0953C46.0538 50.1385 46.0887 50.1861 46.1104 50.2294L46.2062 50.463L46.2628 50.5971L46.4065 50.9258C46.4065 50.9691 46.4457 51.0123 46.4631 51.0599L46.5632 51.2805C46.5632 51.3281 46.6111 51.38 46.6329 51.4319L46.7461 51.6785L46.8375 51.8731L46.942 52.0894L47.0204 52.2538C47.0509 52.3143 47.0813 52.3792 47.1162 52.4398C47.151 52.5003 47.1902 52.5912 47.225 52.6647C47.2598 52.7383 47.3034 52.8161 47.3382 52.8896L47.4296 53.067C47.4601 53.1189 47.4862 53.1708 47.5123 53.2227C47.5385 53.2746 47.5776 53.3438 47.6081 53.4044L47.7518 53.6683L47.8606 53.8716L47.939 54.0057C47.9738 54.0705 48.0087 54.1354 48.0479 54.2003L48.1132 54.3171C48.1828 54.4339 48.2481 54.555 48.3221 54.6761C48.3221 54.7107 48.3613 54.7453 48.3831 54.7799L48.505 54.9876L48.5616 55.0784L48.8228 55.511V55.5499L48.9665 55.7705L49.01 55.844C49.1624 56.0776 49.3148 56.3112 49.4715 56.5448L49.502 56.5924C49.6674 56.8389 49.8329 57.0812 50.007 57.3234C51.365 59.2348 52.903 61.0134 54.6002 62.6353L54.7831 62.804L54.8223 62.8472C55.053 63.0592 55.2794 63.2798 55.5145 63.4745L56.2242 64.0887L56.2764 64.1319L56.529 64.3396C56.5641 64.371 56.6057 64.3947 56.6509 64.4088C56.5551 64.3742 56.7162 64.2055 57.2081 64.0238C60.5317 62.7792 63.7844 61.3554 66.9518 59.7587C71.7975 57.3753 73.6696 56.3761 78.8724 52.6042C83.853 49.0615 86.6612 46.8338 85.6947 43.33Z",\n fill: "url(#paint9_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M82.8261 68.6569C82.3254 67.1559 78.394 66.6065 73.631 67.5582C71.7122 67.9143 69.8508 68.5269 68.0974 69.3792C66.948 69.9762 66.813 70.3482 67.7839 70.7072L67.9668 70.7721L68.1235 70.824L68.8811 71.0749H68.9028L69.6734 71.3128L69.939 71.3863H69.9913C72.3695 72.0554 74.8099 72.483 77.2751 72.6624C77.976 71.9443 83.6098 71.023 82.8261 68.6569Z",\n fill: "url(#paint10_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M81.1279 3.89336C91.603 3.75062 96.022 4.86231 98.0334 5.56738C99.2264 5.99995 99.5355 6.38493 99.6226 6.64879C99.4353 5.96967 98.73 5.08291 97.0103 4.14858C91.1879 1.12201 84.6535 -0.293402 78.0915 0.050578C71.5295 0.394558 65.1813 2.48527 59.7118 6.10376C66.7732 4.75598 73.9384 4.01644 81.1279 3.89336Z",\n fill: "url(#paint11_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M82.8261 68.6569C82.3254 67.1559 78.394 66.6065 73.631 67.5582C71.7122 67.9143 69.8508 68.5269 68.0974 69.3792C66.948 69.9762 66.813 70.3482 67.7839 70.7072L67.9668 70.7721L68.1235 70.824L68.8811 71.0749H68.9028L69.6734 71.3128L69.939 71.3863H69.9913C72.3695 72.0554 74.8099 72.483 77.2751 72.6624C77.976 71.9443 83.6098 71.023 82.8261 68.6569Z",\n fill: "url(#paint12_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M81.1279 3.89336C91.603 3.75062 96.022 4.86231 98.0334 5.56738C99.2264 5.99995 99.5355 6.38493 99.6226 6.64879C99.4353 5.96967 98.73 5.08291 97.0103 4.14858C91.1879 1.12201 84.6535 -0.293402 78.0915 0.050578C71.5295 0.394558 65.1813 2.48527 59.7118 6.10376C66.7732 4.75598 73.9384 4.01644 81.1279 3.89336Z",\n fill: "url(#paint13_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M51.4485 31.9323C57.8833 29.1466 64.6316 26.0364 69.0419 23.9688L69.7647 23.6271C57.3086 25.2535 48.9886 26.4344 44.6784 26.7761C44.6784 26.8194 44.6566 26.8583 44.6436 26.8972C44.6354 26.9338 44.6253 26.9699 44.6131 27.0054C44.5913 27.0789 44.5739 27.1525 44.5521 27.226V27.2866C44.5304 27.3644 44.5086 27.4423 44.4912 27.5201V27.585V27.611L44.4259 27.8792V27.9441C44.4259 28.0262 44.3867 28.1084 44.3693 28.1906V28.2468C44.3214 28.4501 44.2778 28.6535 44.2343 28.8568V28.9043L44.1821 29.1596V29.2331C44.1821 29.3153 44.1516 29.3931 44.1342 29.471V29.5402C44.1342 29.6397 44.0993 29.7392 44.0776 29.8387C44.0776 29.9425 44.0427 30.0463 44.021 30.1501V30.202C44.021 30.2842 43.9905 30.3707 43.9774 30.4529V30.5351L43.9382 30.7687V30.8465L43.8991 31.1147V31.1537C43.8991 31.2575 43.8686 31.3613 43.8555 31.4651V31.5127C43.8555 31.5992 43.8338 31.6857 43.825 31.7722V31.8587L43.7989 32.0837V32.1745L43.7728 32.4254V32.4816C43.7728 32.5855 43.751 32.6893 43.7423 32.7931V32.8363L43.7162 33.1045C43.7162 33.1305 43.7162 33.1608 43.7162 33.191C43.7162 33.2213 43.7162 33.3424 43.6944 33.416C43.6727 33.4895 43.6944 33.4809 43.6944 33.5111C43.6944 33.5414 43.6944 33.6712 43.6727 33.7534C43.6748 33.7764 43.6748 33.7996 43.6727 33.8226C43.6727 33.9307 43.6727 34.0345 43.6727 34.1383V34.1643C43.6727 34.2595 43.6727 34.3546 43.6727 34.4498C43.6748 34.48 43.6748 34.5104 43.6727 34.5406C43.6727 34.6142 43.6727 34.692 43.6727 34.7656C43.6727 34.8391 43.6727 34.8305 43.6727 34.8651C43.6727 34.8997 43.6727 35.0208 43.6727 35.0986C43.6747 35.126 43.6747 35.1535 43.6727 35.1808C43.6727 35.2846 43.6727 35.3928 43.6727 35.4966C43.6727 35.6004 43.6727 35.7042 43.6727 35.8037V35.8729C43.6727 36.0157 43.6727 36.1627 43.6727 36.3055C43.3984 35.6826 45.7363 34.4065 51.4485 31.9323Z",\n fill: "url(#paint14_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n style: { mixBlendMode: "multiply" },\n d: "M110.124 48.75C109.179 48.75 103.737 48.8754 94.9552 49.7103C83.4569 50.8047 66.7037 53.2054 59.9337 54.356C55.7236 55.0654 51.8009 55.9003 49.4324 56.4323L49.7546 56.9081L49.8286 57.012C49.8722 57.0812 49.9201 57.146 49.9679 57.2109L50.0463 57.3234L50.19 57.5267L50.2379 57.5959L50.5426 58.0068L50.6036 58.089L50.756 58.2923C50.7821 58.3226 50.8039 58.3572 50.83 58.3918L50.9867 58.5908L51.0433 58.6643L51.396 59.0969V59.1229L51.5701 59.3305L51.6354 59.4127L51.8052 59.6203L51.8575 59.6809C52.0534 59.9101 52.245 60.1134 52.4452 60.36L52.4931 60.4162L52.6847 60.6282L52.7282 60.6801L53.3639 61.3679L53.3856 61.3895L53.599 61.6101L53.6338 61.6447C53.9342 61.9561 54.239 62.2589 54.5524 62.5574L54.5742 62.579C54.892 62.8818 55.2142 63.1803 55.5407 63.4701C55.876 63.7643 56.2112 64.0541 56.5552 64.3352C56.738 64.4866 57.1386 64.5126 58.3924 64.279C61.0047 63.7859 70.8746 62.0859 81.8025 60.5979C89.3722 59.6313 96.9897 59.0796 104.621 58.9455C106.541 58.9671 108.36 59.3781 107.629 60.2994L107.873 60.0183V59.9966L108.104 59.7241V59.7025L108.33 59.43L108.36 59.3997L108.587 59.1142C108.87 58.7595 109.148 58.4005 109.418 58.0371C109.688 57.6738 109.954 57.3018 110.211 56.9298L110.42 56.6226L110.441 56.5967L110.642 56.2896V56.2636L110.846 55.9522C111.412 55.0654 111.939 54.157 112.431 53.2184C112.492 53.1059 112.549 52.9934 112.605 52.881L112.775 52.5393C113.241 51.5876 113.672 50.61 114.081 49.6151C114.338 49.0658 113.898 48.75 110.124 48.75Z",\n fill: "url(#paint15_linear)"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M51.5183 118.921C50.2121 118.921 49.2282 119.318 48.5447 120.123C47.8611 120.928 47.5128 122.035 47.5128 123.454C47.5063 124.081 47.5899 124.706 47.761 125.309C47.9042 125.832 48.1514 126.32 48.4881 126.746C48.8115 127.143 49.2226 127.461 49.6897 127.676C50.2186 127.908 50.7923 128.021 51.3702 128.009C51.7161 128.012 52.062 127.997 52.4064 127.965C52.6404 127.946 52.8722 127.906 53.0987 127.844V123.346H55.3887V129.363C54.8677 129.537 54.3334 129.671 53.7909 129.761C52.9292 129.916 52.0544 129.988 51.1787 129.977C50.3287 129.988 49.4841 129.841 48.6883 129.544C47.9609 129.272 47.3046 128.84 46.7683 128.281C46.2211 127.692 45.803 126.997 45.5406 126.239C45.2373 125.342 45.0901 124.4 45.1052 123.454C45.0879 122.505 45.2519 121.561 45.5885 120.672C45.8801 119.908 46.3244 119.211 46.8946 118.622C47.4493 118.062 48.119 117.626 48.8581 117.346C49.6241 117.056 50.4374 116.909 51.257 116.913C51.7775 116.909 52.2975 116.948 52.8113 117.03C53.2079 117.096 53.6004 117.184 53.9868 117.294C54.2656 117.372 54.5367 117.474 54.7966 117.601L55.232 117.835L54.5398 119.695C54.1147 119.453 53.6594 119.269 53.1857 119.145C52.6427 118.996 52.0818 118.92 51.5183 118.921Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M64.1919 117.078C66.0117 117.078 67.4006 117.406 68.3671 118.068C68.8465 118.41 69.2305 118.867 69.4834 119.397C69.7362 119.926 69.8495 120.511 69.8126 121.096C69.8126 122.798 68.9694 123.951 67.283 124.557C67.5152 124.845 67.7765 125.183 68.0667 125.569C68.3584 125.967 68.6545 126.399 68.9375 126.867C69.2205 127.334 69.5339 127.805 69.8082 128.294C70.0825 128.783 70.335 129.259 70.5527 129.73H67.9883C67.759 129.298 67.5109 128.865 67.2438 128.433C66.9783 128 66.7083 127.567 66.4341 127.135C66.1598 126.702 65.8898 126.326 65.6243 125.958C65.3587 125.591 65.1105 125.262 64.8798 124.972C64.71 124.972 64.5619 124.972 64.4444 124.972H63.012V129.709H60.7176V117.385C61.3058 117.26 61.9024 117.177 62.5026 117.138C63.1296 117.099 63.6955 117.078 64.1919 117.078ZM64.3573 119.046C63.8697 119.046 63.4213 119.046 63.012 119.102V123.147H64.009C64.5024 123.15 64.9954 123.121 65.4849 123.06C65.8565 123.017 66.2167 122.905 66.5472 122.731C66.8191 122.587 67.043 122.368 67.1916 122.1C67.3495 121.786 67.4245 121.438 67.4093 121.088C67.4216 120.75 67.3467 120.415 67.1916 120.114C67.0473 119.848 66.83 119.627 66.5647 119.478C66.2633 119.312 65.9346 119.199 65.5938 119.145C65.1867 119.077 64.7745 119.044 64.3617 119.046H64.3573Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M86.3392 123.454C86.3577 124.421 86.1938 125.384 85.856 126.291C85.5707 127.059 85.1256 127.757 84.5498 128.342C84.0011 128.889 83.3404 129.312 82.6124 129.583C81.0827 130.137 79.4053 130.137 77.8756 129.583C77.145 129.312 76.4814 128.889 75.9294 128.342C75.3555 127.756 74.9107 127.058 74.6233 126.291C73.9674 124.46 73.9674 122.46 74.6233 120.629C74.9226 119.861 75.3776 119.161 75.9599 118.574C76.5162 118.027 77.1823 117.603 77.9147 117.329C79.4295 116.775 81.0933 116.775 82.6081 117.329C83.3374 117.599 83.9986 118.024 84.5455 118.574C85.1149 119.166 85.559 119.864 85.8516 120.629C86.1932 121.531 86.3587 122.49 86.3392 123.454ZM76.4998 123.454C76.4915 124.087 76.5766 124.718 76.7523 125.327C76.903 125.845 77.1528 126.33 77.4881 126.754C77.8063 127.142 78.208 127.454 78.6636 127.667C79.1537 127.89 79.6877 128.001 80.2266 127.991C80.7597 127.999 81.2878 127.888 81.7721 127.667C82.2277 127.454 82.6294 127.142 82.9477 126.754C83.2829 126.33 83.5327 125.845 83.6834 125.327C84.02 124.102 84.02 122.81 83.6834 121.585C83.5327 121.067 83.2829 120.582 82.9477 120.158C82.6294 119.77 82.2277 119.458 81.7721 119.245C81.2878 119.024 80.7597 118.913 80.2266 118.921C79.6877 118.911 79.1537 119.022 78.6636 119.245C78.2058 119.458 77.8036 119.774 77.4881 120.166C77.1544 120.592 76.9048 121.076 76.7523 121.594C76.5763 122.198 76.4913 122.825 76.4998 123.454Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M95.9306 129.998C95.1733 130.016 94.4197 129.89 93.7101 129.626C93.1244 129.402 92.5985 129.047 92.1733 128.588C91.7628 128.134 91.4554 127.597 91.272 127.014C91.0743 126.37 90.9774 125.701 90.9847 125.028V117.203H93.2922V124.812C93.2826 125.303 93.3471 125.793 93.4838 126.265C93.5904 126.63 93.7762 126.966 94.028 127.252C94.2598 127.499 94.5458 127.69 94.8639 127.81C95.2112 127.935 95.5785 127.996 95.948 127.991C96.3202 127.996 96.6903 127.934 97.0408 127.81C97.3619 127.691 97.6511 127.5 97.8854 127.252C98.1372 126.966 98.3229 126.63 98.4296 126.265C98.5662 125.793 98.6308 125.303 98.6212 124.812V117.203H100.933V125.028C100.942 125.701 100.842 126.372 100.637 127.014C100.449 127.597 100.139 128.133 99.727 128.588C99.2962 129.048 98.7643 129.404 98.1727 129.626C97.4554 129.889 96.6948 130.015 95.9306 129.998Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M109.976 117.078C111.805 117.078 113.208 117.408 114.186 118.068C115.161 118.734 115.649 119.768 115.649 121.178C115.666 121.83 115.532 122.477 115.257 123.069C115.002 123.595 114.61 124.043 114.121 124.366C113.566 124.723 112.949 124.971 112.301 125.097C111.494 125.266 110.67 125.346 109.845 125.335H108.7V129.743H106.41V117.385C106.993 117.257 107.586 117.174 108.182 117.138C108.831 117.099 109.427 117.078 109.976 117.078ZM110.137 119.046C109.558 119.046 109.079 119.046 108.7 119.102V123.367H109.811C110.684 123.411 111.556 123.252 112.357 122.904C112.95 122.597 113.25 122.018 113.25 121.174C113.261 120.816 113.179 120.461 113.011 120.145C112.856 119.872 112.631 119.647 112.357 119.491C112.048 119.324 111.713 119.212 111.365 119.158C110.96 119.087 110.549 119.049 110.137 119.046Z",\n fill: "#231F20"\n }\n ),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint0_linear",\n x1: "44.6041",\n y1: "42.0583",\n x2: "116.641",\n y2: "42.0583",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#E9F7FE", stopOpacity: "0.4" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#5EA1D7" }),\n /* @__PURE__ */ A("stop", { offset: "0.55", stopColor: "#4DA3DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.89", stopColor: "#645FAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#414099" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint1_linear",\n x1: "52.9421",\n y1: "33.7832",\n x2: "88.1087",\n y2: "-1.61628",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FFF795", stopOpacity: "0.3" }),\n /* @__PURE__ */ A("stop", { offset: "0.35", stopColor: "#F3C206" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#F99B1C" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F6891F" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint2_linear",\n x1: "44.4606",\n y1: "27.3383",\n x2: "114.821",\n y2: "27.3383",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#912A73" }),\n /* @__PURE__ */ A("stop", { offset: "0.17", stopColor: "#C6168D" }),\n /* @__PURE__ */ A("stop", { offset: "0.51", stopColor: "#F175AD" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#C593C3" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "white", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint3_linear",\n x1: "74.2486",\n y1: "66.5412",\n x2: "112.379",\n y2: "66.5412",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#72BF44" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#91C83D" }),\n /* @__PURE__ */ A("stop", { offset: "0.38", stopColor: "#ACD037" }),\n /* @__PURE__ */ A("stop", { offset: "0.47", stopColor: "#99CA3B" }),\n /* @__PURE__ */ A("stop", { offset: "0.6", stopColor: "#7DC242" }),\n /* @__PURE__ */ A("stop", { offset: "0.72", stopColor: "#4FB848" }),\n /* @__PURE__ */ A("stop", { offset: "0.84", stopColor: "#24AE4D" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#0AA850" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A651" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint4_linear",\n x1: "54.4218",\n y1: "56.614",\n x2: "103.589",\n y2: "56.614",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0077AC" }),\n /* @__PURE__ */ A("stop", { offset: "0.22", stopColor: "#0083BB" }),\n /* @__PURE__ */ A("stop", { offset: "0.44", stopColor: "#0099DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#00B2DD" }),\n /* @__PURE__ */ A("stop", { offset: "0.67", stopColor: "#00B1DA" }),\n /* @__PURE__ */ A("stop", { offset: "0.83", stopColor: "#00ACC6" }),\n /* @__PURE__ */ A("stop", { offset: "0.94", stopColor: "#00AAA9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#00A99D" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint5_linear",\n x1: "63.674",\n y1: "3.50831",\n x2: "72.83",\n y2: "7.31346",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F58220" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#FCAF17" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint6_linear",\n x1: "91.2112",\n y1: "58.7423",\n x2: "114.186",\n y2: "58.7423",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#008A4B" }),\n /* @__PURE__ */ A("stop", { offset: "0.12", stopColor: "#179449" }),\n /* @__PURE__ */ A("stop", { offset: "0.56", stopColor: "#6CB842" }),\n /* @__PURE__ */ A("stop", { offset: "0.76", stopColor: "#8DC63F" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#32A443" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint7_linear",\n x1: "43.3851",\n y1: "23.203",\n x2: "80.8404",\n y2: "23.203",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FCAF17" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F04E23" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint8_linear",\n x1: "86.1134",\n y1: "27.6324",\n x2: "118.379",\n y2: "27.6324",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#812990" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#882E92" }),\n /* @__PURE__ */ A("stop", { offset: "0.5", stopColor: "#9C3B97" }),\n /* @__PURE__ */ A("stop", { offset: "0.71", stopColor: "#BC509F" }),\n /* @__PURE__ */ A("stop", { offset: "0.95", stopColor: "#E86DAA" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F173AC" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint9_linear",\n x1: "44.5474",\n y1: "51.6785",\n x2: "85.8906",\n y2: "51.6785",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#0089CF", stopOpacity: "0.9" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#0054A6" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint10_linear",\n x1: "83.1134",\n y1: "71.369",\n x2: "71.0939",\n y2: "68.2428",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#9ACA3C" }),\n /* @__PURE__ */ A("stop", { offset: "0.34", stopColor: "#7AC340" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint11_linear",\n x1: "66.1727",\n y1: "2.35777",\n x2: "90.9219",\n y2: "5.85813",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#FDB515" }),\n /* @__PURE__ */ A("stop", { offset: "0.36", stopColor: "#FFD100" }),\n /* @__PURE__ */ A("stop", { offset: "0.58", stopColor: "#FFC907" }),\n /* @__PURE__ */ A("stop", { offset: "0.7", stopColor: "#FFC20E" }),\n /* @__PURE__ */ A("stop", { offset: "0.87", stopColor: "#FBA617" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F78E1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint12_linear",\n x1: "72.6079",\n y1: "72.2601",\n x2: "78.815",\n y2: "66.0169",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#BAD532" }),\n /* @__PURE__ */ A("stop", { offset: "0.03", stopColor: "#B1D334", stopOpacity: "0.93" }),\n /* @__PURE__ */ A("stop", { offset: "0.11", stopColor: "#94CC39", stopOpacity: "0.72" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#7AC53D", stopOpacity: "0.52" }),\n /* @__PURE__ */ A("stop", { offset: "0.31", stopColor: "#64C041", stopOpacity: "0.36" }),\n /* @__PURE__ */ A("stop", { offset: "0.41", stopColor: "#52BC44", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.53", stopColor: "#44B847", stopOpacity: "0.13" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#3AB649", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.79", stopColor: "#35B44A", stopOpacity: "0.01" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#33B44A", stopOpacity: "0" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint13_linear",\n x1: "66.3687",\n y1: "8.91975",\n x2: "89.767",\n y2: "2.61074",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F15F22", stopOpacity: "0.8" }),\n /* @__PURE__ */ A("stop", { offset: "0.21", stopColor: "#F6861A", stopOpacity: "0.48" }),\n /* @__PURE__ */ A("stop", { offset: "0.39", stopColor: "#FAA514", stopOpacity: "0.22" }),\n /* @__PURE__ */ A("stop", { offset: "0.52", stopColor: "#FDB910", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.59", stopColor: "#FEC00F", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.65", stopColor: "#FDBC10", stopOpacity: "0.04" }),\n /* @__PURE__ */ A("stop", { offset: "0.75", stopColor: "#FCB313", stopOpacity: "0.15" }),\n /* @__PURE__ */ A("stop", { offset: "0.88", stopColor: "#FAA418", stopOpacity: "0.32" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#F7941D", stopOpacity: "0.5" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint14_linear",\n x1: "44.4607",\n y1: "29.9814",\n x2: "114.822",\n y2: "29.9814",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { stopColor: "#F4EAE5", stopOpacity: "0.06" }),\n /* @__PURE__ */ A("stop", { offset: "0.19", stopColor: "#DAAFAC", stopOpacity: "0.33" }),\n /* @__PURE__ */ A("stop", { offset: "0.68", stopColor: "#981B1E" })\n ]\n }\n ),\n /* @__PURE__ */ c1(\n "linearGradient",\n {\n id: "paint15_linear",\n x1: "49.4324",\n y1: "56.614",\n x2: "114.225",\n y2: "56.614",\n gradientUnits: "userSpaceOnUse",\n children: [\n /* @__PURE__ */ A("stop", { offset: "0.85", stopColor: "white", stopOpacity: "0" }),\n /* @__PURE__ */ A("stop", { offset: "0.91", stopColor: "#D6D7D8", stopOpacity: "0.23" }),\n /* @__PURE__ */ A("stop", { offset: "0.97", stopColor: "#B4B6B8", stopOpacity: "0.43" }),\n /* @__PURE__ */ A("stop", { offset: "1", stopColor: "#A7A9AC", stopOpacity: "0.5" })\n ]\n }\n )\n ] })\n ]\n }\n), IV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "219",\n height: "63",\n viewBox: "0 0 219 63",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n xmlnsXlink: "http://www.w3.org/1999/xlink",\n children: [\n /* @__PURE__ */ A("rect", { width: "219", height: "63", fill: "url(#pattern0)" }),\n /* @__PURE__ */ c1("defs", { children: [\n /* @__PURE__ */ A(\n "pattern",\n {\n id: "pattern0",\n patternContentUnits: "objectBoundingBox",\n width: "1",\n height: "1",\n children: /* @__PURE__ */ A(\n "use",\n {\n xlinkHref: "#image0_6622_91263",\n transform: "matrix(0.00338437 0 0 0.0117647 -0.00765512 0)"\n }\n )\n }\n ),\n /* @__PURE__ */ A(\n "image",\n {\n id: "image0_6622_91263",\n width: "300",\n height: "85",\n xlinkHref: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABVCAYAAADzJ9nIAAAKqmlDQ1BJQ0MgUHJvZmlsZQAASImVlwdQk9kWgO///+kktIQISAm9CdIJICX00HuzEZIAoYQYCCh2ZXEF14KKCCiCLogouCp1LYAotkWxF3RBFhFlXSzYUHk/MAR337z35p2ZM+ebk3PPuefOvZnzA0CR54hEqbA8AGnCTHGotxsjOiaWgR8COEAGJIAACoebIWIFB/sDVGbs3+X9XQBN2lumk7n+/ff/Kgo8fgYXACgY5XheBjcN5VOovuCKxJkAIAdQv052pmiSO1GmidENonx/khOneWSS46cYA6ZiwkPdUaYBQCBzOOJEAMgM1M/I4iaieciuKJsLeQIhyiKUndPS0nkoH0fZEI1BfeTJ/Mz47/Ik/i1nvDQnh5Mo5elepoTgIcgQpXJW/J/H8b8lLVUyU0MfVXKS2CcUtYromd1PSfeTsjA+MGiGBbyp+ClOkvhEzDA3wz12hnkcDz/p2tRA/xlOEHixpXky2eEzzM/wDJthcXqotFaC2J01wxzxbF1JSoTUn8RnS/PnJIVHzXCWIDJwhjNSwvxmY9ylfrEkVLp/vtDbbbaul7T3tIzv+hWwpWszk8J9pL1zZvfPF7Jmc2ZES/fG43t4zsZESONFmW7SWqLUYGk8P9Vb6s/ICpOuzUQv5OzaYOkZJnN8g2cY+ANvwAA+wAOEotYaoN1n8pdnTjbini5aIRYkJmUyWOgL4zPYQq7ZPIaluaUVAJPvdfo6vKVPvUOIfmXWt+Y2APa/o9A26wvpAaAlFwD5o7M+fQv0Ku0DoL2dKxFnTfum3hIW/ReQAzSgAjSADjAEpsAS2AJH4Ao8gS8IAuEgBiwBXJAE0oAYZINVYD3IAwVgO9gNSkA5OAgOg2PgBGgCp0E7uAiughvgDngE+sAgeAlGwXswDkEQHqJAVEgF0oT0IBPIEmJCzpAn5A+FQjFQHJQICSEJtAraCBVAhVAJVAHVQL9ALVA7dBnqgR5A/dAw9Ab6DCMwGabB6rA+PB9mwizYDw6HF8OJ8DI4B86Ft8LFcCV8FG6E2+Gr8B24D34JjyEAkUHoiBZiijARdyQIiUUSEDGyBslHipBKpA5pRbqQW0gfMoJ8wuAwVAwDY4pxxPhgIjBczDLMGswWTAnmMKYR04m5henHjGK+YSlYNawJ1gHLxkZjE7HZ2DxsEbYK24C9gL2DHcS+x+FwdJwBzg7ng4vBJeNW4rbg9uHqcW24HtwAbgyPx6vgTfBO+CA8B5+Jz8PvxR/Fn8PfxA/iPxJkCJoES4IXIZYgJGwgFBGOEM4SbhKGCONEeaIe0YEYROQRVxC3EQ8RW4nXiYPEcZICyYDkRAonJZPWk4pJdaQLpF7SWxkZGW0Ze5kQGYHMOplimeMyl2T6ZT6RFcnGZHfyIrKEvJVcTW4jPyC/pVAo+hRXSiwlk7KVUkM5T3lC+ShLlTWTZcvyZNfKlso2yt6UfSVHlNOTY8ktkcuRK5I7KXddbkSeKK8v7y7PkV8jXyrfIn9PfkyBqmChEKSQprBF4YjCZYXninhFfUVPRZ5iruJBxfOKA1SEqkN1p3KpG6mHqBeogzQczYDGpiXTCmjHaN20USVFJWulSKXlSqVKZ5T66Ahdn86mp9K30U/Q79I/z1Gfw5rDn7N5Tt2cm3M+KM9VdlXmK+cr1yvfUf6swlDxVElR2aHSpPJYFaNqrBqimq26X/WC6shc2lzHudy5+XNPzH2oBqsZq4WqrVQ7qHZNbUxdQ91bXaS+V/28+ogGXcNVI1ljl8ZZjWFNqqazpkBzl+Y5zRcMJQaLkcooZnQyRrXUtHy0JFoVWt1a49oG2hHaG7TrtR/rkHSYOgk6u3Q6dEZ1NXUDdFfp1uo+1CPqMfWS9Pbodel90DfQj9LfpN+k/9xA2YBtkGNQa9BrSDF0MVxmWGl42whnxDRKMdpndMMYNrYxTjIuNb5uApvYmghM9pn0zMPOs58nnFc5754p2ZRlmmVaa9pvRjfzN9tg1mT2ar7u/Nj5O+Z3zf9mbmOean7I/JGFooWvxQaLVos3lsaWXMtSy9tWFCsvq7VWzVavrU2s+db7re/bUG0CbDbZdNh8tbWzFdvW2Q7b6drF2ZXZ3WPSmMHMLcxL9lh7N/u19qftPznYOmQ6nHD4y9HUMcXxiOPzBQYL+AsOLRhw0nbiOFU49TkznOOcDzj3uWi5cFwqXZ666rjyXKtch1hGrGTWUdYrN3M3sVuD2wd3B/fV7m0eiIe3R75Ht6eiZ4RniecTL22vRK9ar1FvG++V3m0+WB8/nx0+99jqbC67hj3qa+e72rfTj+wX5lfi99Tf2F/s3xoAB/gG7AzoDdQLFAY2BYEgdtDOoMfBBsHLgn8NwYUEh5SGPAu1CF0V2hVGDVsadiTsfbhb+LbwRxGGEZKIjki5yEWRNZEfojyiCqP6oudHr46+GqMaI4hpjsXHRsZWxY4t9Fy4e+HgIptFeYvuLjZYvHzx5SWqS1KXnFkqt5Sz9GQcNi4q7kjcF04Qp5IzFs+OL4sf5bpz93Bf8lx5u3jDfCd+IX8owSmhMOF5olPizsThJJekoqQRgbugRPA62Se5PPlDSlBKdcpEalRqfRohLS6tRagoTBF2pmukL0/vEZmI8kR9yxyW7V42KvYTV2VAGYszmjNp6GB0TWIo+UHSn+WcVZr1MTsy++RyheXC5ddWGK/YvGIoxyvn55WYldyVHau0Vq1f1b+atbpiDbQmfk3HWp21uWsH13mvO7yetD5l/W8bzDcUbni3MWpja6567rrcgR+8f6jNk80T593b5Lip/EfMj4Ifuzdbbd67+Vs+L/9KgXlBUcGXLdwtV36y+Kn4p4mtCVu7t9lu278dt124/e4Olx2HCxUKcwoHdgbsbNzF2JW/693upbsvF1kXle8h7ZHs6Sv2L27eq7t3+94vJUkld0rdSuvL1Mo2l33Yx9t3c7/r/rpy9fKC8s8HBAfuV3hXNFbqVxYdxB3MOvjsUOShrp+ZP9dUqVYVVH2tFlb3HQ493FljV1NzRO3Itlq4VlI7fHTR0RvHPI4115nWVdTT6wuOg+OS4y9+ifvl7gm/Ex0nmSfrTumdKmugNuQ3Qo0rGkebkpr6mmOae1p8WzpaHVsbfjX7tfq01unSM0pntp0lnc09O3Eu59xYm6htpD2xfaBjacej89Hnb3eGdHZf8Ltw6aLXxfNdrK5zl5wunb7scLnlCvNK01Xbq43XbK41/GbzW0O3bXfjdbvrzTfsb7T2LOg5e9PlZvstj1sXb7NvX70TeKfnbsTd+/cW3eu7z7v//EHqg9cPsx6OP1rXi+3Nfyz/uOiJ2pPK341+r++z7TvT79F/7WnY00cD3IGXf2T88WUw9xnlWdGQ5lDNc8vnp4e9hm+8WPhi8KXo5fhI3p8Kf5a9Mnx16i/Xv66NRo8Ovha/nniz5a3K2+p31u86xoLHnrxPez/+If+jysfDn5ifuj5HfR4az/6C/1L81ehr6ze/b70TaRMTIo6YMzUKIKjCCQkAvKkGgBIDAPUGAKSF0/P0lEDT3wBTBP4TT8/cU2ILQJ0rAEFtAHisA6AGtfqoJaM6ORKFuwLYykqqM7Pv1Jw+KRrod0J2MMB/rehVdxsF/5DpGf67ff/TAmnWv9l/AQqVBifvbywuAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAEsoAMABAAAAAEAAABVAAAAAMQ28cYAACSvSURBVHgB7V0LfFTF1T9zd0lQKr6r+ECsqLW+QR5JtKKfqEUetkIIJFAFQgL4qFbt14eK/T4/P/VrfbQkJAGlkoQEKgpoi7VWRZKAQlWsWrX1/YYW0SKQ7N7z/WdDyGZ37+7MnbubDb3z+yV778w5Z86cO/fcM2fOzBD5yZeALwFfAr4EfAn4EvAl4EvAl4AvAV8CvgR8CfgS8CXgS8CXQHZLQHQ7e2dcfgD1acsjEscR8wAS9A3w1A9/BxLTASTEYfj9CvmfEvFHyP+MWHyC+w/ItjdSgJ6jtfVbu70dXjPw2NIzKGR/E3LpD9L446/TuKJClWoqK6svp6B4j9vaXpg9e/beJxsVIfgwe6UEukdhFZScAyV0MQm+CC/kYA8k+zZobCCbn4ES+y2tXwLl1sPSYw8dQ3ZoNNpwPpTxeZDLgV1bwNtpbNHXuuYlvquoqnkHD/aY3aWfMvHLgsRLgunx8vLSJxJj+bm+BLJfAplTWKdN6UNf46lQUlfiZfxW+kTDYdD/ExTiEtq1azltXLYtfXUZUl5VfwhRYCKU1GRYkrAyoaock2uF1YUiE20WzPWCes0rL7/izS6F/o0vgSyXQJIXxCPOhxUfRZa4jiwuxfuoZCF4VHM7GeYKDKfupOb6dz2la0Js+fKDKdB6E+QxCyoqR42UNworui5YXn+0WNzpW13RUvGvs1kC6VNY+ZPPIGH9BI2fkCUCWEYhnkvr617tVn5WNv4IChRyEX31+FBXWJVV1VDOEd+XWhVMTbbFN86ZObNZDcGH8iXQPRLwXmFFhn727Xhh5sB6sLqnWU61cgh83UNfirm0afF2J6i05K9qvBRDv7sx9Bvgjr66worxYWlUxw9xOFTqO+o1ROaDZlQC3iqUvOLR8FO9jpfyquxTVlKuIoh/19N+/CrllVycEUmvfqgfrWhcDZ/aw+6VlR6nAtOoehgd0OIyEQi+Ulm5oKAjx//1JZBNEvBGYY0YEaSC4rvhq1oFRXVkNjXQgZf+sP1+D57vxIg14ABjnr1i6UhqbXsFMsFsaOYSY2bDfW2iH/yNayuram5xT8PH9CWQHgmYKyzpVG89Er4P8YP0sJhOquIGys9dQ8MmHeZ5LSsa7oTe+APkEhOe4HlNcQTdW1hdSM2tqKp+oqKiIuP8d+HCv/ElECUBM4WVP+UUCoiNGOoMiaLZsy4F5VPA2kBDp57gCeNLlwZoRcMSyOQGT+i5IGJmYXVWiNitC4QVfBlDxFM6c/0rXwLdJwH3Cmt4cQEJuwXDna93H/se1SzEURQMP095U841orh06T7U2/4dlFWRER1DZI8srHYuhDiSLX52XnV1viFbProvAWMJuFNYBSUjYVmtxXAn83FVxk12ICAQZmDx05Q/eZwDRPJshqM7l5dDJhcmB0x/qVcWVgen8OAfgHitpvnza0Z25Pm/vgS6QwJy1kwvyfgqwozX3piYmcJYo+gmrWqsgWWVmZnHFPy1W1guJwqT0LaJl8+rqRk6p7T0tSRg2V109mT45PhkCgXa+76gVizn2ky7cjbTi4s+zwrmC4qOIDuA4GJ7f2qjL4isfyJ+0F2/zHSDIoHillwX3N4Bhf0VhQObafvOzfTKsn+ZsqPXq4cUHU29gi9gGHiwacXZic/zqaluljZvqxpuQCQBZhzTmdTjsLQDRzXYhkp/PyDsQWVlZVs00LoPNG/yReivQ9r9rEJ+bOVicufE/AHgpXJ4C89U+mfXUNPiDc4IBiUyZrGPPQ4z1ueAyomwzk/C7+GOFJl3gJ/NULibESbzEuB+T7tan+i25WdS+XNk3av0YZ+F60Hg76AU/H+C8g8B+zLa8QJGNU9i84K3HHFiCtQV1uAx+1Lvvn+GUCHYvTAxf0oi93hquv9LrdatXHo+sf0EHpS74bVyZeoKy33gqBozWNLTPLtsZvbGahVMHkVsTYPikRZvH7VWJYFifgcv10IKc40nC+vPLjmdbLoJ/F2CWnsnqVmtiCOz0Q0kcn6r3X/VaugKlV9yBTJKwP/5XQtc363Hx+F+4p2LqWXZjmRU1BVWQfEiKKvvJyPmXRk3oQHrQW+38uAAhHMotPIByJN/34SCOMa7+iKUSqiptk6L5oqlAzHxsBFy0Vxmo1VLOzDTizRu4pkqmOm0sKLq/8WsstLro+67/1K+SIJ/iOdxctqYYXqALGsurX3wPVd1FBTfDP5udYWbCimyDRMvpjbrDnpu8dupwLXKC6btR9R6FXDkn7MVqEU0DvhLDCXvg1vmTgyBMRSOT2oKK69kEszW+nh0r3KgoGzxCIlwEzUvaVGiWjDpZOIAzH3+DjrABUo4TkDMLdRcpz8LtrJRKtWhTmSN8pmw5pFX4+VYiz2/1tKoQgwF1FJVVVV/m6wJGL6NF4KGAUvtOauR74QSPGbWzJmPdmZ001VeyaXoBwbLnlzx/VN84P5HGVP6pTiAPp6hECDmRWSHb6V1De8o8+gEmF/yI8j3R+hGGYrJ4y3QB1dTS+2SWJZSd+TBJf1gtL4JRHPTOrZ2pnuJ7LuNd1KQvrWcIHaDoHL8HRpbjcL9heh8TyjAdYKsbPwJbm7rzPDsai3Uy+00ZuLvvKBYUbHwRDhvb8aDngh6nkb1M9HnOQFx3IwZM/7pBa+uaERWK3RTzBvz4/jQyWFn8pRXko9niqVZGQ4BYvoHfRUc6HoyYVhxX0QDIKaQRiVvYJpKbf45tdTdEk29faYkOif2OpfvgGb1Vlkx/5Z2QYNurP04tjpX9883vA88mNr4Kyj5OX6xdYtqgnXXVKenrB5tOAk+CG+VlRzyCZ6FTfrWqXKuAjd79vTXAVdcU1Pzszabbt+tuFRQU8KA1gFtYfseAE5NCew1QN6EfeCzwWy1uMhr0hr0UlscZ0/tDx/nk6Bp7qvSYCwCKifH9m3dH9ef66KSNAKC4o/AO0Eb1ysEgV2HY1JyR3H+pDyYsFNicNzfMuNLbF+Gr9IEz5RVLDdNtTfji3AGsjfFFiW8t/m6hPnJMm2xMFmxfhnXQ4EP81pZRfNRWlr69uyy0iLBYiwsI+XhZTSNxNdiSkV19bmJy9KUe86EQ8nKRdCyS2UlZ9uI34dP9AX8yg/EJ644FQprNtn+DWhrKiveCt6eifxRZDbQHX+yUW22rd224SWDItEAbpUVs/Q/vb1bti/BL+XWAkdX7ZqSW1gicF9XcKM7WDEWHNuLPzOiooK8tvYlGjwmj3L7yh0SLnREYW6klvrnHMsTFaxonIZsuTuoF2kXHuo1UFRVXhBToVFePmPVggULvtkWwoskxGgVnFQwwha/BsypqeA8KY/EKAWfAi39L790mJN9H1wQLybkRS7PCtjfQNkp8NlKF4N+HdGE8yfLj/2I6Kwk13jB7V+Rba3HMKg5IVze5KHwaZ4LBTAbz25AQhjTzIiRQo+DDJzsWgkOc6qgttA8ah/xdEWWUQY5fY+DRXwcZDsIsGiDfngUrHqHJLeKkbsveJGkA7C57govSGnTyC9+EA83sZXI4lRqXvwXZZqPP9gHAYbvQOiHKOMkA7Qw7T56ouwcGU+IkRXzq2sWoC1SARsn2BqXYufSFcaEUhHIL0FsFDq8TmK+n8L2T7RCEtpnxaSlkCyth+9zuCNAfvEz6HvfdizvKJAuEjnq0El5xdPw4sMHnGK1SWuof0IFkqiuIRMOp5zc11B0QKJixzzmnxG3/jJVSEIX/PwpOLsAMVjJkpwxbK67JhrEir7pcm2JW7rcu79Z2G3KSvLcXAf/CsdbMEyPaCkrSWtn7rWeKCtmBI3zZd2lrGRTBIYzs8pmTsflXHlvmljwzaY0UuJL/6SesnqDwmI4+sB0LWUlGZHxeMxrUvLkBCAjvtWUlZyh1lNWss6WOsQtoQ97mXrlLAI5DWXFf4R/bgD4v01LWUmemxf/Cf+3y0udlFhh5RfLYdRZOoQcYJ/AF2iGQ1nmspvqytH5arpUKISe0/x3tTLW6vouNFzfwKoZV7TcNbqHiIiluhXkPBj6i0Hz5y9IbU245X1Y8beAepM6Or9F1q6zad1iGXriLjEiyd0mi8YpoVrY199tEvSoW9Q4vPxiBIJq+QRXY7JqpNkMvwx41UuJFZagMj0yCaBldPDOXfpfjgSkPMlqrpu554spI4N1l1uEgjfi6y5nXEzTPQgA/Y0pES/xLbKvR/R6Yr+ORkW24GINcD3QoJinjCCdvBy6kJ5dZja5YGPnDbdJ0LEpUeU7Iv2tbtPO1tUpUXNzREoYOfwV4q6UcJ0AG7DN+PjOW5dXqT8IcbzHKyx5sCmJ77lkoRMtjDVS2XbEVlvrRJjR/8Df/E5GFa4erTsQUIigNk38Fzri8xtNqXiNj3WBbXbAuhRD56+MaDNPmDt3bnyfMiIKZOnvUHdeA5SnUXPj302rxTByE/rKh450Ohb4JgIQkcOAE5VE5Yl3o270L+X7JWcTkyU7FPfSx4PvuhJ5h8fnJ8zZhcNcvuvJmQgi/FjCGpJkxneuPm1FSeDVipj+M/Kw1aAzB/X8MkwP4wzAlrqHtSq1g3OhxDWnpmNr4J3YUv57dFZZW2xJNtxfOWPGu9iWBj469wl+sQO/fsQR3sdFCf6BMlcMR25z/Qpl+JSA7M7KYqGgADgnZfWpANh0WIgtwpm6OLZTVCmXzXyQAkatuKnhIwBuUgNuh4pXWCRkRLT7JGNbmmsRbJqlqblOb9wsD5EgutqD1txIY8a/6QGdtJH47OMPF2A5z+smFWC2UM13o1pJ3tQjATpGFRzbxsxWhlUCZGcrQIgkFimn/jAJMVCJhWRAYWtlsmLaZbUmLR/eexSGg4clhekolNamvev2jltPfpMpXBHvlO+qsAZ+JxcWyNlGjNiezS4aseEZcmvIfAjH9Dca81d1H4xnzOsRwnDOFhb/WA8rBpo9W8HfTliE1RWgXCrz3INvxHBkdrutzXnqvX2LFyf6KvGGh7reMLKj1kh7McHglFKtJrFsdfcPY8eKFLspOLHhmC9otWOZLeKsr64K65CD8zD0CToSSFXA/DJmZbyJ3UpVVybK5VHy7MEEhOBrScy1M8GyaR1YzPww2qwXTBtdqRDHV1ZWSqvIq6SusIjrvKp0D532Ted+HfEV7Yk+j0zn30SWfeseuPgLFYWF182qgdI6Jh5dI4cxIdHBW/SvHVlbm4rQ2FQAe8rDAe/l21T7LOg/EcM/rFosU0uw+LmrcrJoxB7mXF2IRa7QshXJDpRjZnAfQ/bWIZLdu+lnQ2aU0IW9GKsShirBJgBiETwP2bUJivSzVGKZ2qnupG1tD+tXoIDRVCu3VNFLTH9G31FJh0JptdCw4gtcn0reXPtLVCT/9JLcl4vpIEWkDZ5brx0VN9XKMCql1NXC0gvKi69gFy2Jz+zROeb+EEvIGZgelTjcy52jeU8r+fQ9lyYXck2b8jo8XuvFFrwm7HbBtXJ1Rhr9sND4FRzuW9aFRrpvbC5QrkIOt7MgdVVYTCcZ8LQ+bQuaDZhyjbpq6Xh8Ifu5xpeIjEMpRhduNKLRDcizZ097y8j5LgzX4HW0OaC1BCc92xh38KL72x4przdbaSHcpqDkdQwRrzYeJirxK85UApNATFnRj7sqLEEDlRsQC8h2zxr2xPIfe2+zB1876yexZHvKPVbuuLayMBI6wZt28jeU6dj8Z2XYTAFaLnYCkbIT1r34e4fyS/6GvwpYXhenh2U+VpluKJwVH4ROhZU36ZvKzCcEFO4dtQnpdWPmI0uOhnX1H0YcSOtqXOHrRjS6EZkJh8u6TsKwL3VULPp3XKX8DQdfSgmTaYDI4Qr2da6rFXQc+uEsLHL+PRTXFlhfC6hg8vdoxOWGMYEdHIkBHVcpfj9XXkCdgpBpcafCsixEuBskDrxigJ1dqMKaCYbUXKZOnAfIq8XjTjWkNR/nnX1sUsF9999/qAl+Oy6rOoSJcndsNa8vDRSa6u8GVfPZtfatWKZjMuQhbOGyhfKLH6CzJ5mFIBEfqNZi1/tZqZHXgOpUWCR6aeDFg7Y8+GF8Zo/NkQrLIPEKGl30FwMC3Y4qwsGPTJjIbWs72AQ/ggszT5lGiP6lDJtpwKbaEviAXA+xE7DbB8Gel2OP+GcjPq+8kmtcWV2qJz1xfABnAp4yktXZIdhAYTE2DN5bktygz3TvbcG/6uniyM0lI4Vly4NAM5m8Dmj0mvfm2ktA8kavyYLeCVDr91Br6GWSm++lJ2XNx6BTYZk0VGh8CU3qyQSuDPI0SvwajZnkHB1tRDtzyNOnT/8Sm/y57qg4rUd9OOfULEFfORX1yPym2rsoZJ+AKbd6z/mXE2Yi0Iyh4n9r0N6hBCuyxyDpVFjySGmTJLeu7elpVSN2LBCnGDWDqcdbV3vaj9XMe641L2xvOrnaCyV5O3nC1zRZ7B7w9fVvYh+pYpy7eSoYWOY5E0L8FA76J0meypwqyXMM1VJqWmp0jKE6FRZbrr+mES7CQYXV6cb8ppeA6Uk4jINfd1mL0stkZqjLLZShrfq4rs2KHETgGj2CyMkWF8eQ3r9XZoegMdVr38qtuZtqCyM7djL/Aj4u73zA8kRmW6zGuQb7JudLcTsh9mhL8OTMKJV2Kiy7zUxhWYZBlkrsphFoZcM4+K6+ZVSDoIVUWKhuFRhVll5kHFRhtB7QCltfmHPInyrTsK2epbA6GtZc/y62GL4eO5xgS+XwORgu3oWA4792FLv+FWIo9e6bfHmUIDX5mvp0XTciHrFTYYmwYQfjnj4kvDlePFo5jOHkfVoYWQwcChkEEaNdQoQ8CDOw3lMWkWCzBcTKFaURcO2StRgu3ggFdhKF5a4pLAOP33Bfo/gu4rbOc8RnUpdv+zY/jqQyVdCpsFqW/RMCMrGy8HXooenRxovwig0y4x77Jo0tfNuMRvZgI9LdyNrELqbqL4NTszn8rlNRXL4Q58bl9eSMdXXygN/bMWw8EcPGM/Fu3oK/LfpNEv/jjCPUn5EIZcX73amwZKuYXnNuXIoSIdK0fCBFvV4U2zTXnIwlAwT3mgSn+UjXjWH6i2vcaMRW1lm/lhUvVDT7nl3LcxSb6n5OO7+AFcma+6rh1KD8iccl5EXIg2QVkxAjFCHTCtZVYQnhXmERHUrDpwxLK7fpIL6y4TsgO9yMNPZqH1v4JzMaWYbNdIFbjlgYfPiiK924BBZFks3pomHlTiODJ+wfnbXXXW9c9RUU15WwuK7QapsIjE0IvzPcnDA/ceaIxNmZzQ3GVGf2ZRT2KNBbH0Mzu2+ZbjNchIP2JTO7s7v5ibirrK7+Lqbd3YcJMG9KRNdVHtPTeD7fUMLNzZkBuF8owaYbKHIQqzzcAQepcsyearvC4ymijF0y0Vy/CPFWH8FRqLblC1vfRk3xIwDJQ0Hxq+BRYfgvTowsBZJ+tm5MXS0s237GiBdLXE6DZ5ot8TFiQBN5ZYM88hv+AaP0Ie0US40oZBuyLSYbsRQQZv0ounLWOX3c7BCN6GrNryPKSvqPLobCPbfLX+8AfKaGSZ5NEHvWpiNJTjwkbIdf6YgWW8DWDbFZmb7vqrBa6p+HCW7ieO9PvbdPz3QjXNUnD5dgcYcr3GgkxpersDAcndWTr+fNu/9onFH4PbdtQPxW6JD999cZaiSvart4AgA7kwPtLhV0JCyPEiXY9AP1T1KFdEOYJ0v5rEZnXsLWI+qMiLE0dOoJ6vDeQ3ZVWNLtTuIps2rEzT3CymoN/QZfPffDHikkph3UV1SZySu7sEUwfCsC3GP7hTqTgpoKvVTgmxZvh5xrlRkQ4s60+rJkMGZB8e+w6Jjx+31HvjiJDBlWlxep/RDW7SlJJTvdR56MLc9iUE29wvNVQV3BnT21PyL1X43IN3/yGbE04jumTY/FAmne96PeX5Vp4mQWfGVjISp0PwvWwa3gX9J5hVoWaU1NzbEd6Nn2W1VVdaogusKEL0E6QzjVmsS9qpCA60e5OXdpwOuB5vZdjo96u4XENM0RWWDPVqckt4opmHKWU7FWPvPmlPDM7yeFYSyeVk7iPMR2pWcUdc6EQ8kOPwND4qR2dsSkWLbiFdaOYCO+aG2xgFr3THfgtN5TtHAyBbxq6ZFon7lVxLSNgqE7ddiurFxwZpvNq3VwMglrs/Vr0/pw7H29KY04fLmMhemhuHynDCFK8YVOPDPmhKOSX1C8Aj7PTv+TELmOaJGVTY6lKGBvhoVCDEhWS6RMpFj201J3P+DeTklnDwBCeApKTtxz68VF/pSvk53zNOQ7IIpc3EaF8QrrxUWfQ5gropD0LwXtSwKBlCoLMPWpm2HY3AgNfoAZEWBbfBuNKvlChw4LngML5ISK+TX36eBlArZifvWPIZdvm9QF39cfEDD6sQkNR1w7dL1jWeKCFfBnjU9cpJmbN2EfDP/gS4MPx6vEHiis4VPGqLEj/p4Sju1rU8J0AuyHYSR2hogfsnWCaFwNKz4KOqcJ8k05WxmvsCL1iEUa1TmB9odTO7tmz1Y2NOClLHBiWCP/PdqBfbc1kjyrD6uJI6Y0fq+aP78mztzVIOcpKHgZCb+VnNEySmjXA0YEkiGva3iHbM1DXoVYBqX1w2RkU5bllVxKIgfxieKClLA6AELkGX3QpRK1+A6lKjmMYWyK1Fy/Akro0RRQncVCHIR959dgeDiqM9PFlTxwIyhexns5UAU7scJqrpV+LA0T0akqPOT8kqdJCre704pGvJBiokdsXIeZwVYtWlbwxmh4BFfWV1bWjIjO647riurqC8DLH0zrhsPmbRzC2mBKJyl+S93/4qV6LilMbKEQ/4fhy/Pa1sCwycej7z6Gnd4exjDlmFiyntyzeAjnEcK60ExyT3eR+1u85Lt9PUnwmd+h5iUtSSA6iwKt02DpbO3MSHm1H4Yaj0G+S2nIhMNTQkcDyDWO+SVQVJEPv/KIJ7HCkoSZvHFcRmJQcppp8KRDovnN6PXKhh/g4f7YkzqZn6WxE9X9KagUzuxDMN1fGls/hoirpF8rNj9T9xVVCy4VHAkbMK+S6b/MiahQYDlhktrR3JXUWXgxXogM6wqKnT9a8hzE/OKrIh/ZoPUG+oyZ9dCVhwR3cGAHxfuor57az2BMABOTVVBSSK1tbyrzJsTiGArOt88u24yt+iY4AziWTKCc3I+huGrhuz7fESp/8rch358C7nUouj+hDdp+bkwKOaSIyZnzHqwSbxSN1PRhHk/r6zc61Jie7JWN/wvCP/KMOONEGM3TcCqram5H/f/pwMNOJjF9dtkM753VDhXK7MrK6lKyRHUSEPUiPNtZ5TOPVUcwhBw2eTAFradABV941+kTYH6KL/MO/B6Jfn60C0rrsTh5eEK8guL5oFmWsMw58xNYkJuAJycZoDAZoxy5C4oFC4/lkGkYrL3jndFjSpj+Rru2nU5ySY9OioRrmLqFIjOTH8ItlBtpgxCH6bAQgWW6F9vu/CAaz1lhSaj8kuugBX8RjWB8zfY11Fyffqfzw0sGUMCSXxds0+FRYrqVxk2cq0NN+q7ICn6QGoerdmw/4Nrrrkv/floVVTV348F36Qip+XOGgMIthMJd5gyRhpLhRQMg1+Xon91moUaGp811wxK2Lr+kBrzNSFiWkUwOgb8heNdedFWdtIaE1Qjcw13he4HEOBuhue7qaFLOQ0IJ1Vz7SzRaPagsmrLTtRyzyunhoVPS90Ve0XANBSILub1UVq/rKquICKyAtK4Ukijr3WfbK/Oqqs5TAHYFAuf6qMqq6k1eKitYAmsyrqxk66UTvrl2EPqn+pDHldQckOQpOLZ1uUMpjAp2pygcCeoWiMtdKytZVXP9GmrddSba8bxuzd7AY1eKQGucmwF9N0WSY2uLN8AUTQ2bglTXYg5HZhEFrJamWoxpDdOjDafg5RmNrWGvxpetnyG1eHQODKJx41+IL3DOqaipGSxs2uAMkbiEieopbP189uzp5nJBFVBU40DzZ5DLWYlrdJ+LuKvTEMrg7UdNlx0500TiFvTRg3RRteGZP0A9c9BnV6bELSgZiRcellaanPaJGGDehnfgUlpX+3SiYld5BcV3Q76eWeQpeFhPofBMWr8EQ+P4pKaECorvBMM3xKN7lBOZ+RHLyQ41Rr6cKmSfeqA3fbnfcUQhaUVdCf60HXgq1URgBM2lMRNvVYbfDVg5v2YNlIT7fZqYMNVM98yaVfq0bt3V1dUnhGwqxssyGQ95oC6+CjwmEv57dvnMm1Rg0w4jD6HYP3cO6imFzNEvPE9vwCFdQdvFApLLhXRSXjGOjhNXgq/0Dl+ZHiHL/iFFTpzWYVABdkjR0ZQTuA5GxhS042AFDD0Q5jXo61XUUpfUl6umsGhCgPJznoXQ8/S40Ib+El+uvkpYKxpXQ3AXKcGaADE9RWNfu4DEXFuHDGbgLhGkEdeSijjLzda4Bc/gfSiKz7FS7XNYTdtEWEinMUYndg6xdbQl6Bjkj8ODPS0VSaNyppZZ5aX5RjTShdzulC+CdTMB8jrGoJpNoLEaFgs+pLV/NqDTjppXdCaO4roWPE0xphVNgPlJvAs/w15Z66Kz03bdbjnKNuAcBKH2vsYzsxP9eSOUFCxVBHPLve0VkqLCAiUZOk/8alq0ayej2aaw3ibufTqNG/dlJ4tqV9JXBKvvVDXongUFhfkFh4OnzJkz7f2s51zutimH8xa2wGbMBra7C46ApXBYpC8zfYbZuM0owwyd2IS4q1fJtjdRS71evJeOIOSauVDOSNQl3RiDwQfiqTRmKZnly/1i5GVvtVca7a2lw3ci2HYlnAfZ4VxEOaMp4KSPnO8A+UKZydOABG1p/+WXUP4KAoAh3zpXbgR1hSWZlQs2meXixH0T8e5BXvYoLLlWkMQw3RAGKQOEMVyNn3s9kEfWkYCyCiF+7MI5ZWVPZR1zPZmh06b0QZAGDp+A/zVgH4SXHn/W19CkrXjB/xl56cP0Aa2ve7UnN9OU96AWgabFGyhvCoLp7D9Ae+Zo4fYoYN6JDjISAaLaTu9fL1hwDIfs2zyfo8gS+VkkppaXzfSVldfPo90vpj1B4zUb2U4veVhDIu5bFsPC4kmJivaKPGYbw4dLaWyRq+lcy7ZPh7KSX8a9MV1fXl66ZG9smN+mniEBfYUl29VUvxxj0vEwW8M9o5mKXDJjWx3ruzR64uOKGHFgs2fOXImtkORs1d6WrplVVuptEPHeJiG/PWmXgDuFJdlqrn0IjraJe43SksfMyxX54woxa2GWystnViD6uxiygQLs2Un6rGymIiir+3p2S3zu9wYJuFdYsvURpcXn42pzjxYG08cIjj0HkexrvGqHXBuIXRBG4oXf6hXNTNORvMPBfsmc8lK5RMNPvgS6XQJ6s4RO7A6bdBgFAnJdl2lcTuZnCZlfoF7WRTSqMC1K91cLFx4RbLOxRQkNdRJfVuYj7ivUyxp91fTpHyXib+nSpYF/bN12A2K+jsLM8WeACXBANMwpLX0tEbyf50vACwmYWVgdHKxf8ik1DzwHfq0f4k9vZXgHje74Zaqhvjvy06WsZJPkC48Ay2F4se/qjia6qRO83gOeBzkpK0lzy9ZtCwXTRnzxtmCSwZLKKhDm82SEvZs6fRxfAioS8EZhRWpCJLhcLE32t3C7WqXyOBiMQeLy0pKBADbBgzEEnEnnXYGI2/Sn2WWlNwq2zoBCz+Kpa36ZLToLvF6bTCLY36s/JhYODoeDCP7jUyDLly2bry8rK63EcqCiZLh+mS8BEwl4qLB2syFD7Jtqv4PjtM9Fjt7Lme7gJWa5x9D3EbJwBo0pMl9qoSn58vLpL8FyGQKtfCVe9I810dMJ/ikU0A2zymaeNru0dGOqisJCHIs4vLckHNpyFNtiLD41z+Px4egFrxfJp+LGL/93koD3CqtDenJ7iqbaIRSWG/fzUx3ZSX/TZWHJXUKJx9C4ohOhqB5MykMGCmHBzPv04+P7Yybxcvh/ui9yWa5PFDwVOy4cjZnN/1NueiiENXY0MBhshXYS6zFh8RCWmfwNj0/6RL3xiyoz4wP+O0kgc51LHgvEdA2EW4gufbCDkL1zujPJKPVaCgYX0yWXvetQX1Zkz5+/4GKbEIwr6DI8kD7pZ4obMDytLC+fscZtXXITQFhV6+C9+gKxZ7+fN79mIhZ7nw5f1mLf8e5Wqj5eKglkTmFFc5JXcjFeTlhedCF+o7cCMVBYCB+QOysIepIC9Ee6pOiN6Cp7wvUDDzzQ+6tdIbnTQiFMlxHgGevJvEi8BUO352ENNdmh4MI5c66Q2wMbpblz51qH9TtS+roOgmX1L4wE95FnEmJvrL8aEfaRfQkkkUD3KKxohuSpIRafjO1Yj8DwZH9skXFPdLHj9YrGuVBOveBL2YA9gF7piQrKsW27C+S6xIBtD8JiIezlLfdSwop+5sOhHA50xGX+EENN+OcQrmHRRm4LvtAjdlVwbJBf4EugUwLdr7A6efGvNCQwb979RwcCfBhQegkR2hoK5XzuheWkwYIP6kvAl4AvAV8CvgR8CfgS8CXgS8CXgC8BXwK+BHwJ+BLIlAT+H3jX8PUgE5jvAAAAAElFTkSuQmCC"\n }\n )\n ] })\n ]\n }\n), TV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "138",\n height: "37",\n viewBox: "0 0 138 37",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ c1("g", { "clip-path": "url(#clip0_6736_4393)", children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M99.3 22.7001C99.3 21.9001 99.5 21.6001 100.3 21.6001H102.4L103.4 25.3001C103.7 25.5001 105.2 26.6001 107.3 26.6001C110.1 26.6001 111.4 25.2001 111.4 23.6001C111.4 22.1001 110.3 20.9001 108 20.2001C107.3 20.0001 106.4 19.7001 105.9 19.6001C102.1 18.5001 99.3 16.7001 99.3 12.8001C99.3 8.1001 103.1 6.2001 107.4 6.2001C112 6.2001 114.5 7.9001 115.2 8.3001V13.0001C115.2 13.8001 114.9 14.1001 114.2 14.1001H112.2L111.1 10.2001C110.8 10.0001 109.6 9.3001 107.7 9.3001C105.4 9.3001 103.9 10.3001 103.9 12.2001C103.9 14.1001 105.8 15.1001 108.2 15.8001C108.9 16.0001 109.5 16.2001 110 16.3001C113.5 17.3001 116.2 19.3001 116.2 22.9001C116.2 28.1001 112.1 29.8001 107.4 29.8001C102.8 29.8001 100.1 28.0001 99.4 27.5001V22.7001H99.3ZM96.2 23.7001C96.2 23.3001 96 23.0001 95.6 23.0001C95.2 23.0001 94.9 23.4001 94.5 23.8001C94 24.2001 92.3 26.4001 89 26.4001C85.5 26.4001 82.3 23.2001 82.3 18.0001C82.3 13.2001 84.7 9.4001 89 9.4001C90.4 9.4001 91.7 9.8001 92.1 9.9001L93.3 14.0001H95.3C95.9 14.0001 96.3 13.8001 96.3 12.9001V8.2001C95.4 7.6001 93.1 6.1001 89 6.1001C82 6.1001 77.3 10.5001 77.3 17.9001C77.3 25.7001 82.1 29.7001 88.6 29.7001C92.7 29.7001 95.4 28.0001 96.3 27.4001V23.7001H96.2ZM137.4 23.7001C137.4 23.3001 137.2 23.0001 136.8 23.0001C136.4 23.0001 136.1 23.4001 135.7 23.8001C135.2 24.2001 133.5 26.4001 130.2 26.4001C126.7 26.4001 123.5 23.2001 123.5 18.0001C123.5 13.2001 125.9 9.4001 130.2 9.4001C131.6 9.4001 132.9 9.8001 133.3 9.9001L134.5 14.0001H136.5C137.1 14.0001 137.5 13.8001 137.5 12.9001V8.2001C136.6 7.6001 134.3 6.1001 130.2 6.1001C123.2 6.1001 118.5 10.5001 118.5 17.9001C118.5 25.7001 123.3 29.7001 129.8 29.7001C133.9 29.7001 136.6 28.0001 137.5 27.4001V23.7001H137.4Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M18 7.3001C23.3 7.3001 26.3 10.9001 27.3 12.6001C28.2 10.4001 30.1 6.8001 31 5.6001C29.6 4.1001 25.1 0.100098 18 0.100098C7.9 0.100098 0 8.3001 0 18.1001C0 28.7001 8.6 35.3001 15.6 35.9001V28.6001C11.8 27.8001 7.2 24.1001 7.2 18.1001C7.2 12.1001 12.1 7.3001 18 7.3001Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M53.7001 0.200195V7.5002C57.5 8.3002 62.1 12.0002 62.1 18.0002C62.1 24.0002 57.2 28.8002 51.3 28.8002C46 28.8002 43 25.2002 42 23.5002C41.1 25.7002 39.2 29.3002 38.3 30.5002C39.7 32.0002 44.2 36.0002 51.3 36.0002C61.4 36.0002 69.3001 27.8002 69.3001 18.0002C69.3001 7.40019 60.6 0.900195 53.7001 0.200195Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M48.8999 7.4001V0.100098C37.8999 1.2001 34.2999 9.8001 31.2999 16.6001C27.6999 24.9001 25.3999 27.5001 20.3999 28.6001V35.9001C30.9999 34.8001 34.9999 26.2001 37.8999 19.5001C40.7999 12.6001 43.0999 8.3001 48.8999 7.4001Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M65.6 34.0001C65.6 33.2001 66.2 32.6001 66.9 32.6001C67.6 32.6001 68.2 33.2001 68.2 34.0001C68.2 34.8001 67.6 35.4001 66.9 35.4001C66.1 35.4001 65.6 34.8001 65.6 34.0001ZM66.9 35.6001C67.8 35.6001 68.5 34.9001 68.5 34.0001C68.5 33.1001 67.7 32.4001 66.9 32.4001C66 32.4001 65.2 33.1001 65.2 34.0001C65.2 34.9001 66 35.6001 66.9 35.6001ZM66.5 34.1001H66.8L67.3 34.9001H67.6L67.1 34.1001C67.4 34.1001 67.6 33.9001 67.6 33.6001C67.6 33.2001 67.4 33.1001 66.9 33.1001H66.2V35.0001H66.5V34.1001ZM66.5 33.9001V33.3001H66.9C67.1 33.3001 67.3 33.3001 67.3 33.6001C67.3 33.9001 67.1 33.9001 66.8 33.9001H66.5Z",\n fill: "white"\n }\n )\n ] }),\n /* @__PURE__ */ A("defs", { children: /* @__PURE__ */ A("clipPath", { id: "clip0_6736_4393", children: /* @__PURE__ */ A("rect", { width: "137.4", height: "36.1", fill: "white" }) }) })\n ]\n }\n), DV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "48",\n height: "48",\n viewBox: "0 0 48 48",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A(\n "path",\n {\n d: "M12.4674 5.13566C16.1383 5.13566 18.2162 7.70349 18.9089 8.91607C19.5322 7.34684 20.8483 4.77901 21.4716 3.92307C20.5019 2.85314 17.3851 0 12.4674 0C5.4718 0 0 5.84894 0 12.8391C0 20.4 5.95664 25.1077 10.8051 25.5356V20.3286C8.17307 19.758 4.98696 17.1189 4.98696 12.8391C4.98696 8.55943 8.38086 5.13566 12.4674 5.13566Z",\n fill: "#003A5C"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M37.1949 0.0712891V5.27828C39.8269 5.8489 43.013 8.48806 43.013 12.7678C43.013 17.0475 39.6191 20.4713 35.5325 20.4713C31.8616 20.4713 29.7837 17.9034 29.0911 16.6908C28.4677 18.2601 27.1517 20.8279 26.5283 21.6838C27.498 22.7538 30.6149 25.6069 35.5325 25.6069C42.5281 25.6069 47.9999 19.758 47.9999 12.7678C47.9999 5.20695 41.974 0.570589 37.1949 0.0712891Z",\n fill: "#97999B"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M33.8699 5.20699V0C26.251 0.784614 23.7575 6.91887 21.6796 11.7692C19.1861 17.6895 17.593 19.544 14.1299 20.3286V25.5356C21.4718 24.751 24.2423 18.6168 26.251 13.8377C28.2596 8.91607 29.8527 5.84894 33.8699 5.20699Z",\n fill: "#00B2A9"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M45.4362 24.1803C45.4362 23.6097 45.8518 23.1817 46.3367 23.1817C46.8215 23.1817 47.2371 23.6097 47.2371 24.1803C47.2371 24.7509 46.8215 25.1789 46.3367 25.1789C45.7826 25.1789 45.4362 24.7509 45.4362 24.1803ZM46.3367 25.3216C46.96 25.3216 47.4449 24.8223 47.4449 24.1803C47.4449 23.5384 46.8908 23.0391 46.3367 23.0391C45.7133 23.0391 45.1592 23.5384 45.1592 24.1803C45.1592 24.8223 45.7133 25.3216 46.3367 25.3216ZM46.0596 24.2516H46.2674L46.6137 24.8223H46.8215L46.4752 24.2516C46.683 24.2516 46.8215 24.109 46.8215 23.895C46.8215 23.6097 46.683 23.5384 46.3367 23.5384H45.8518V24.8936H46.0596V24.2516ZM46.0596 24.109V23.681H46.3367C46.4752 23.681 46.6137 23.681 46.6137 23.895C46.6137 24.109 46.4752 24.109 46.2674 24.109H46.0596Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M18.2223 41.8111C18.2223 41.2405 18.365 41.0265 18.9356 41.0265H20.4335L21.1468 43.6657C21.3608 43.8083 22.4307 44.5929 23.9286 44.5929C25.9258 44.5929 26.8531 43.5943 26.8531 42.4531C26.8531 41.3832 26.0685 40.5272 24.4279 40.0279C23.9286 39.8853 23.2866 39.6713 22.93 39.5999C20.2195 38.8153 18.2223 37.5314 18.2223 34.7496C18.2223 31.3972 20.9328 30.0419 23.9999 30.0419C27.281 30.0419 29.0643 31.2545 29.5636 31.5398V34.8923C29.5636 35.4629 29.3496 35.6769 28.8503 35.6769H27.4237L26.6391 32.8951C26.4251 32.7524 25.5692 32.2531 24.2139 32.2531C22.5734 32.2531 21.5034 32.9664 21.5034 34.3216C21.5034 35.6769 22.8587 36.3902 24.5706 36.8895C25.0699 37.0321 25.4978 37.1748 25.8545 37.2461C28.351 37.9594 30.2768 39.386 30.2768 41.9538C30.2768 45.6629 27.3524 46.8755 23.9999 46.8755C20.7188 46.8755 18.7929 45.5915 18.2936 45.2349V41.8111H18.2223ZM16.0111 42.5244C16.0111 42.2391 15.8685 42.0251 15.5832 42.0251C15.2978 42.0251 15.0839 42.3104 14.7985 42.5957C14.4419 42.8811 13.2293 44.4503 10.8755 44.4503C8.37897 44.4503 6.09646 42.1678 6.09646 38.4587C6.09646 35.0349 7.80834 32.3244 10.8755 32.3244C11.8741 32.3244 12.8013 32.6097 13.0867 32.6811L13.9426 35.6055H15.3692C15.7971 35.6055 16.0825 35.4629 16.0825 34.8209V31.4685C15.4405 31.0405 13.7999 29.9706 10.8755 29.9706C5.88247 29.9706 2.53003 33.109 2.53003 38.3874C2.53003 43.951 5.9538 46.8041 10.5902 46.8041C13.5146 46.8041 15.4405 45.5915 16.0825 45.1636V42.5244H16.0111ZM45.3985 42.5244C45.3985 42.2391 45.2558 42.0251 44.9705 42.0251C44.6852 42.0251 44.4712 42.3104 44.1859 42.5957C43.8293 42.8811 42.6167 44.4503 40.2628 44.4503C37.7663 44.4503 35.4838 42.1678 35.4838 38.4587C35.4838 35.0349 37.1957 32.3244 40.2628 32.3244C41.2614 32.3244 42.1887 32.6097 42.474 32.6811L43.33 35.6055H44.7565C45.1845 35.6055 45.4698 35.4629 45.4698 34.8209V31.4685C44.8279 31.0405 43.1873 29.9706 40.2628 29.9706C35.2698 29.9706 31.9174 33.109 31.9174 38.3874C31.9174 43.951 35.3412 46.8041 39.9775 46.8041C42.902 46.8041 44.8279 45.5915 45.4698 45.1636V42.5244H45.3985Z",\n fill: "#003A5C"\n }\n )\n ]\n }\n), HV = () => /* @__PURE__ */ c1(\n "svg",\n {\n width: "48",\n height: "48",\n viewBox: "0 0 48 48",\n fill: "none",\n xmlns: "http://www.w3.org/2000/svg",\n children: [\n /* @__PURE__ */ A("rect", { width: "48", height: "48", fill: "white" }),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M15.7625 10.5255C18.3846 10.5255 19.8688 12.3597 20.3635 13.2258C20.8088 12.1049 21.7488 10.2708 22.194 9.65937C21.5014 8.89514 19.2751 6.85718 15.7625 6.85718C10.7656 6.85718 6.85718 11.035 6.85718 16.028C6.85718 21.4286 11.1119 24.7912 14.5751 25.0969V21.3776C12.6951 20.97 10.4193 19.0849 10.4193 16.028C10.4193 12.9711 12.8435 10.5255 15.7625 10.5255Z",\n fill: "#003A5C"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M33.4249 6.9082V10.6275C35.3049 11.0351 37.5807 12.9202 37.5807 15.9771C37.5807 19.0341 35.1565 21.4796 32.2375 21.4796C29.6154 21.4796 28.1312 19.6454 27.6364 18.7793C27.1912 19.9002 26.2512 21.7344 25.8059 22.3457C26.4985 23.11 28.7249 25.1479 32.2375 25.1479C37.2343 25.1479 41.1428 20.9701 41.1428 15.9771C41.1428 10.5765 36.8386 7.26485 33.4249 6.9082Z",\n fill: "#97999B"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M31.05 10.5765V6.85718C25.6079 7.41762 23.8268 11.7992 22.3426 15.2638C20.5615 19.4925 19.4236 20.8172 16.95 21.3776V25.0969C22.1942 24.5365 24.1731 20.1549 25.6079 16.7413C27.0426 13.2258 28.1805 11.035 31.05 10.5765Z",\n fill: "#00B2A9"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M39.3117 24.1289C39.3117 23.7213 39.6085 23.4156 39.9548 23.4156C40.3011 23.4156 40.598 23.7213 40.598 24.1289C40.598 24.5365 40.3011 24.8422 39.9548 24.8422C39.559 24.8422 39.3117 24.5365 39.3117 24.1289ZM39.9548 24.9441C40.4001 24.9441 40.7464 24.5874 40.7464 24.1289C40.7464 23.6704 40.3506 23.3137 39.9548 23.3137C39.5096 23.3137 39.1138 23.6704 39.1138 24.1289C39.1138 24.5874 39.5096 24.9441 39.9548 24.9441ZM39.7569 24.1799H39.9054L40.1527 24.5874H40.3011L40.0538 24.1799C40.2022 24.1799 40.3011 24.078 40.3011 23.9251C40.3011 23.7213 40.2022 23.6704 39.9548 23.6704H39.6085V24.6384H39.7569V24.1799ZM39.7569 24.078V23.7723H39.9548C40.0538 23.7723 40.1527 23.7723 40.1527 23.9251C40.1527 24.078 40.0538 24.078 39.9054 24.078H39.7569Z",\n fill: "white"\n }\n ),\n /* @__PURE__ */ A(\n "path",\n {\n d: "M19.8731 36.7223C19.8731 36.3147 19.975 36.1619 20.3826 36.1619H21.4525L21.962 38.047C22.1148 38.1489 22.8791 38.7093 23.949 38.7093C25.3756 38.7093 26.0379 37.996 26.0379 37.1808C26.0379 36.4166 25.4775 35.8052 24.3056 35.4486C23.949 35.3467 23.4905 35.1938 23.2357 35.1429C21.2997 34.5824 19.8731 33.6654 19.8731 31.6784C19.8731 29.2838 21.8091 28.3157 23.9999 28.3157C26.3436 28.3157 27.6173 29.1819 27.974 29.3856V31.7803C27.974 32.1878 27.8211 32.3407 27.4645 32.3407H26.4455L25.8851 30.3537C25.7322 30.2518 25.1208 29.8951 24.1528 29.8951C22.981 29.8951 22.2167 30.4046 22.2167 31.3727C22.2167 32.3407 23.1848 32.8502 24.4075 33.2068C24.7642 33.3087 25.0699 33.4106 25.3246 33.4616C27.1078 33.9711 28.4835 34.99 28.4835 36.8242C28.4835 39.4735 26.3945 40.3397 23.9999 40.3397C21.6563 40.3397 20.2807 39.4226 19.924 39.1679V36.7223H19.8731ZM18.2937 37.2318C18.2937 37.028 18.1918 36.8751 17.988 36.8751C17.7842 36.8751 17.6313 37.0789 17.4275 37.2827C17.1728 37.4865 16.3067 38.6074 14.6253 38.6074C12.8421 38.6074 11.2118 36.977 11.2118 34.3277C11.2118 31.8821 12.4345 29.9461 14.6253 29.9461C15.3386 29.9461 16.001 30.1499 16.2048 30.2008L16.8161 32.2897H17.8351C18.1408 32.2897 18.3446 32.1878 18.3446 31.7293V29.3347C17.8861 29.029 16.7142 28.2648 14.6253 28.2648C11.0589 28.2648 8.66431 30.5065 8.66431 34.2767C8.66431 38.2508 11.1099 40.2887 14.4215 40.2887C16.5104 40.2887 17.8861 39.4226 18.3446 39.1169V37.2318H18.2937ZM39.2846 37.2318C39.2846 37.028 39.1827 36.8751 38.9789 36.8751C38.7752 36.8751 38.6223 37.0789 38.4185 37.2827C38.1638 37.4865 37.2976 38.6074 35.6163 38.6074C33.8331 38.6074 32.2027 36.977 32.2027 34.3277C32.2027 31.8821 33.4255 29.9461 35.6163 29.9461C36.3296 29.9461 36.9919 30.1499 37.1957 30.2008L37.8071 32.2897H38.8261C39.1318 32.2897 39.3356 32.1878 39.3356 31.7293V29.3347C38.877 29.029 37.7052 28.2648 35.6163 28.2648C32.0499 28.2648 29.6553 30.5065 29.6553 34.2767C29.6553 38.2508 32.1008 40.2887 35.4125 40.2887C37.5014 40.2887 38.877 39.4226 39.3356 39.1169V37.2318H39.2846Z",\n fill: "#003A5C"\n }\n )\n ]\n }\n), PV = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n CSCHorizontaWhite: TV,\n CSCHorizontal: IV,\n CSCVertical: DV,\n CSCVerticalFilled: HV,\n Client: wV,\n Colored: qV,\n Filled: xV,\n FilledWhite: RV,\n KeyLine: BV,\n KeyLineDark: WV,\n Landscape: EV,\n Mono: SV,\n MonoDark: kV,\n Portrait: NV\n}, Symbol.toStringTag, { value: "Module" }));\nfunction VV(e) {\n return /* @__PURE__ */ A(jf, { className: "logo-svg", ...e });\n}\nconst z4 = J4(PV)(VV), FV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, borderRadius: t, itemSize: r }, size: n, $hasUrl: o }) => {\n let i;\n switch (n) {\n case lt.MEDIUM:\n i = r.md;\n break;\n case lt.LARGE:\n i = r.lg;\n break;\n case lt.EXTRA_LARGE:\n i = r.xl;\n break;\n case lt.SMALL:\n i = r.sm;\n break;\n case lt.XSMALL:\n default:\n i = r.xs;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: center;\n width: ${i};\n height: ${i};\n overflow: hidden;\n border-radius: ${t.circle};\n background-color: ${o ? "none" : e.topBar.topBarBgTertiary};\n color: ${e.grey};\n position: relative;\n\n img {\n display: block;\n max-width: 100%;\n max-height: 100%;\n border-radius: ${t.circle};\n }\n `;\n }\n), UV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { borderRadius: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n /* top: 0.25rem;\n right: 0.25rem;\n bottom: 0.25rem;\n left: 0.25rem; */\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n border-radius: ${e.circle};\n\n .icon-system {\n /* position: absolute;\n bottom: -5%;\n left: 50%;\n right: 0; */\n width: 75%;\n /* transform: translate(-50%, 0); */\n display: flex;\n justify-content: center;\n align-items: center;\n\n svg {\n width: 75%;\n }\n }\n `\n), YV = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n`, XV = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { typography: e, fontWeight: t, lineHeight: r, colors: n }, size: o }) => {\n let i;\n switch (o) {\n case lt.MEDIUM:\n i = e.t16;\n break;\n case lt.LARGE:\n i = e.t20;\n break;\n case lt.EXTRA_LARGE:\n i = e.t24;\n break;\n case lt.SMALL:\n i = e.t12;\n break;\n case lt.XSMALL:\n default:\n i = e.t10;\n }\n const a = parseFloat(i) * 10;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: block;\n color: ${n.topBar.topBarTextSecondary};\n font-size: ${i};\n font-weight: ${t.medium};\n line-height: ${r.lh20};\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n max-width: ${a}rem;\n `;\n }\n), QV = (e, t) => {\n const { size: r, url: n, name: o } = e;\n let i;\n if (o && !n) {\n const a = o.split(" "), s = a.length >= 2 ? `${a[0].charAt(0)}${a[1].charAt(0)}`.toUpperCase() : Array.from(o)[0].toUpperCase();\n i = /* @__PURE__ */ A(XV, { size: r, children: s });\n } else\n n ? i = /* @__PURE__ */ A("img", { src: n, alt: o }) : i = /* @__PURE__ */ A(UV, { children: /* @__PURE__ */ A(f0, { name: "ProfileFilled", color: "#1D174F", size: "xxs" }) });\n return /* @__PURE__ */ A(FV, { size: r, $hasUrl: !!n, ref: t, children: i });\n}, Uu = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(QV), GV = (e, t) => {\n const { size: r = lt.SMALL, name: n, ...o } = e;\n return n ? /* @__PURE__ */ A(YV, { ref: t, children: /* @__PURE__ */ A(Uu, { size: r, ...o, name: n }) }) : /* @__PURE__ */ A(Uu, { ref: t, size: r, ...o });\n}, hi = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(GV), jV = 2, KV = {\n xs: 16,\n sm: 24,\n md: 40,\n lg: 48,\n xl: 64\n};\nfunction ZV(e, t, r) {\n return r || e[t];\n}\nfunction JV(e) {\n const t = ZV(KV, e), r = jV, n = (t - r) / 2, o = n * 2 * Math.PI;\n return [t, r, n, o];\n}\nconst _V = styled_components__WEBPACK_IMPORTED_MODULE_1___default().svg(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.backgrounds.bgInformationalPrimary};\n stroke: currentColor;\n transform: rotate(-90deg);\n fill: none;\n `\n), $V = styled_components__WEBPACK_IMPORTED_MODULE_1___default().circle(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.backgrounds.bgInformationalPrimary};\n `\n), eF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().circle(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.border.borderPrimary};\n `\n), tF = (e, t) => {\n const { progress: r = 0, size: n = "xs", ...o } = e, [i, a, s, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => JV(n),\n [n]\n ), c = r <= 0 ? 0 : r > 100 ? 100 : Number(r), p = l - l * c / 100;\n return /* @__PURE__ */ c1(\n _V,\n {\n ...o,\n width: i,\n height: i,\n viewBox: `0 0 ${i} ${i}`,\n ref: t,\n children: [\n /* @__PURE__ */ A(\n eF,\n {\n cx: i / 2,\n cy: i / 2,\n r: s,\n strokeWidth: a,\n strokeDasharray: l,\n strokeDashoffset: 0\n }\n ),\n /* @__PURE__ */ A(\n $V,\n {\n cx: i / 2,\n cy: i / 2,\n r: s,\n strokeWidth: a,\n strokeDasharray: l,\n strokeDashoffset: p\n }\n )\n ]\n }\n );\n}, rF = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(tF), Q6 = {\n CIRCLE: "circle",\n LINEAR: "linear"\n}, L8 = {\n CYAN: "cyan",\n BLUE: "blue"\n}, nF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, progress: t, $backgroundColor: r }) => {\n let n;\n switch (r) {\n case L8.BLUE:\n n = e.backgrounds.bgInformationalPrimary;\n break;\n case L8.CYAN:\n default:\n n = e.backgrounds.bgInformationalPrimary;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n width: 100%;\n min-width: 40px;\n height: 4px;\n background-color: ${e.border.borderPrimary};\n border-radius: 20px;\n overflow: hidden;\n\n &:after {\n content: \'\';\n position: absolute;\n height: 100%;\n width: ${t}%;\n background-color: ${n};\n border-radius: 20px;\n transition: width 0.2s linear;\n }\n `;\n }\n);\nfunction oF(e, t) {\n const {\n progress: r = 0,\n backgroundColor: n = L8.CYAN,\n ...o\n } = e, i = r <= 0 ? 0 : r > 100 ? 100 : Number(r);\n return /* @__PURE__ */ A(\n nF,\n {\n ref: t,\n progress: i,\n $backgroundColor: n,\n ...o\n }\n );\n}\nconst iF = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(oF), aF = (e, t) => {\n const { hasLabel: r, progress: n, type: o = Q6.CIRCLE } = e;\n return /* @__PURE__ */ c1(dV, { ref: t, children: [\n (() => {\n switch (o) {\n case Q6.LINEAR:\n return /* @__PURE__ */ A(iF, { progress: n });\n case Q6.CIRCLE:\n default:\n return /* @__PURE__ */ A(rF, { progress: n });\n }\n })(),\n r && /* @__PURE__ */ c1(az, { children: [\n Number(n),\n "%"\n ] })\n ] });\n}, C4 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(aF), Lc = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { borderRadius: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: ${e.circle};\n `\n), sF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Lc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgSuccessPrimary};\n `\n), lF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Lc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgWarningPrimary};\n `\n), lz = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Lc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgErrorPrimary};\n `\n), la = {\n ACTIVE: "active",\n PENDING: "pending",\n INACTIVE: "inactive"\n}, Yu = ({ type: e, ...t }) => {\n switch (e) {\n case la.ACTIVE:\n return /* @__PURE__ */ A(sF, { ...t });\n case la.PENDING:\n return /* @__PURE__ */ A(lF, { ...t });\n case la.INACTIVE:\n default:\n return /* @__PURE__ */ A(lz, { ...t });\n }\n}, Dl = ({\n type: e,\n hasLabel: t = !0,\n children: r,\n iconStyle: n,\n ...o\n}) => {\n if (!t)\n return /* @__PURE__ */ A(Yu, { type: e });\n let i;\n switch (e) {\n case la.ACTIVE:\n i = "Active";\n break;\n case la.PENDING:\n i = "Pending";\n break;\n case la.INACTIVE:\n default:\n i = "Inactive";\n }\n return /* @__PURE__ */ c1(iz, { ...o, children: [\n /* @__PURE__ */ A(Yu, { type: e, style: n }),\n r || i\n ] });\n}, wc = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { typography: e, fontWeight: t, spacings: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n justify-content: center;\n align-items: center;\n padding: ${r.sp4} ${r.sp6};\n border-radius: 56px;\n font-size: ${e.t10};\n font-weight: ${t.medium};\n height: 16px;\n box-sizing: border-box;\n border: 1px solid transparent;\n `\n), cF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(wc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgSuccessPrimary};\n border-color: ${e.backgrounds.bgSuccessPrimary};\n color: ${e.textIcon.textTertiary};\n `\n), pF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(wc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgWarningPrimary};\n border-color: ${e.backgrounds.bgWarningPrimary};\n color: ${e.textIcon.textTertiary};\n `\n), dF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(wc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgErrorPrimary};\n border-color: ${e.backgrounds.bgErrorPrimary};\n color: ${e.textIcon.textTertiary};\n `\n), AF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(wc)(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgErrorSecondary};\n border-color: ${e.border.borderError};\n color: ${e.textIcon.textError};\n `\n), G6 = {\n LOW: "low",\n MEDIUM: "medium",\n HIGH: "high",\n NO_GO: "no_go"\n}, O4 = ({\n type: e,\n children: t,\n ...r\n}) => {\n switch (e) {\n case G6.LOW:\n return /* @__PURE__ */ A(cF, { ...r, children: t || "Low" });\n case G6.MEDIUM:\n return /* @__PURE__ */ A(pF, { ...r, children: t || "Medium" });\n case G6.HIGH:\n return /* @__PURE__ */ A(dF, { ...r, children: t || "High" });\n default:\n return /* @__PURE__ */ A(AF, { ...r, children: t || "No Go" });\n }\n};\nfunction c5({\n style: e,\n isGroup: t,\n radioBtnValue: r,\n isRadioButton: n,\n data: o,\n index: i,\n onSelectHandle: a,\n label: s,\n subLabel: l,\n isMulti: c,\n checkboxValue: p,\n groupByDivider: d,\n defaultValues: u,\n selectedLists: h,\n tooltipText: b\n}) {\n var O, m, v, y, z, N, W, T, x, E, L, w, q, S, B, I, P, k, K, $, j, r1, a1, _, Y, D, H, G, J, F, V, Q, Z, t1, n1, U, e1, o1, u1, M1, A1, l1, b1, h1, z1, O1, m1, L1, y1, B1, T1, F1, X1, G1, Q1, K1, n0, u0, c0, C0, y0, q1, v1, k1, S1, i0, m0, l0, _1, H1, j1, s0, M0, I0, re, R1, r0, d0, q0, D0, G0, V0, W0, ae, ee, se, Me, At, Ne, _e, ut, pr, wr, Vn, xi, ko, No, Io, p2, x2, Fe, F2, nn, on, To, qr, xr, U2, an, Do, Ho, bt, dr, Y2, Po, Vo, d2, R2, sn, xs, Fn, n3, Ri, o3, i3, Rs, a3, Bs, Ws, Bi, Es, Ss, ks, Ns, Is, Ts, Ds, s3, Wi, l3, Ei, c3, p3, Si, Hs, Ps, Vs, Un, d3, ki, Fs, Us, Ys, R;\n if (t)\n return d ? i == 0 ? "" : /* @__PURE__ */ A(\n X6,\n {\n className: `ListItem list-item-${i}`,\n style: e,\n children: /* @__PURE__ */ A(a2, { $default: !0 })\n },\n (O = o[i].item) == null ? void 0 : O.value\n ) : /* @__PURE__ */ A(\n X6,\n {\n className: `ListItem list-item-${i}`,\n style: e,\n children: /* @__PURE__ */ A(AV, { children: /* @__PURE__ */ A(uV, { children: s }) })\n },\n (m = o[i].item) != null && m.value ? (v = o[i].item) == null ? void 0 : v.value : i\n );\n const M = (X, i1, d1) => {\n if ((u == null ? void 0 : u.length) == 0) {\n let f1;\n return X == null || X.filter((g1) => {\n var C1;\n (C1 = i1[d1].item) != null && C1.value && (g1 != null && g1.value) && i1[d1].item.value == (g1 == null ? void 0 : g1.value) && (f1 = !1);\n }), f1;\n } else {\n let f1;\n return X == null || X.filter((g1) => {\n var C1, I1;\n (C1 = i1[d1].item) != null && C1.value && (g1 != null && g1.value) && ((I1 = i1[d1].item) == null ? void 0 : I1.value) == (g1 == null ? void 0 : g1.value) && (f1 = !0);\n }), f1;\n }\n }, C = (X, i1, d1) => {\n let f1;\n return d1 == null || d1.filter((g1) => {\n let C1 = X[i1].item.value;\n C1 == "" && (C1 = void 0), g1.value == C1 && (f1 = !0);\n }), f1;\n }, g = (X, i1, d1) => {\n let f1;\n return d1.value == X[i1].item.value && (f1 = !0), f1;\n };\n let f = (o == null ? void 0 : o[0].type) == "item" && (o == null ? void 0 : o.length) > 8 ? !0 : (o == null ? void 0 : o[0].type) != "item" && (o == null ? void 0 : o.length) > 10;\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n X6,\n {\n className: `ListItem list-item-${i}`,\n style: e,\n children: (y = o[i].item) != null && y.tooltipText ? /* @__PURE__ */ A(\n v2,\n {\n text: (z = o[i].item) == null ? void 0 : z.tooltipText,\n size: "mini",\n place: "bottom",\n children: /* @__PURE__ */ c1(\n y8,\n {\n onClick: () => {\n a && a(o[i], i);\n },\n $subLabel: !!((N = o[i].item) != null && N.subLabel),\n tabIndex: 0,\n $isSelected: u != null && u.length ? C(o, i, u) : (u == null ? void 0 : u.length) == null ? M([u], o, i) : !(h != null && h.length) && h != null ? (h == null ? void 0 : h.value) === ((W = o[i].item) == null ? void 0 : W.value) : !!M(h, o, i),\n $isScroll: f,\n children: [\n ((T = o[i].item) == null ? void 0 : T.leftIcon) && /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: ((x = E2 == null ? void 0 : E2.Countries.filter((X) => {\n var i1;\n return ((i1 = o[i].item) == null ? void 0 : i1.leftIcon.name) == X.CountryName;\n })) == null ? void 0 : x.length) > 0 ? /* @__PURE__ */ A(Pu, { children: /* @__PURE__ */ A(\n Cl,\n {\n name: (E = o[i].item) == null ? void 0 : E.leftIcon.name,\n size: "xxs",\n hideClassName: !0\n }\n ) }) : /* @__PURE__ */ A(o5, { children: /* @__PURE__ */ A(\n f0,\n {\n name: (L = o[i].item) == null ? void 0 : L.leftIcon.name,\n size: "xxs",\n color: (w = o[i].item) != null && w.leftIcon.color ? (q = o[i].item) == null ? void 0 : q.leftIcon.color : "#2B2B37"\n }\n ) }) }),\n !((S = o[i].item) != null && S.countryList) && !((B = o[i].item) != null && B.timeZone) && c && !n && /* @__PURE__ */ A(n5, { children: u ? /* @__PURE__ */ A(\n vn,\n {\n defaultChecked: C(\n o,\n i,\n u\n ),\n id: (I = o[i].item) == null ? void 0 : I.value,\n isRequired: !0\n }\n ) : /* @__PURE__ */ A(\n vn,\n {\n defaultChecked: p[i],\n id: (P = o[i].item) == null ? void 0 : P.value,\n isRequired: !0\n }\n ) }),\n !((k = o[i].item) != null && k.countryList) && !((K = o[i].item) != null && K.timeZone) && n && !c && (u ? /* @__PURE__ */ A(\n l5,\n {\n name: "list",\n defaultChecked: g(\n o,\n i,\n u\n ),\n isRequired: !0\n },\n i\n ) : /* @__PURE__ */ A(\n l5,\n {\n name: "list",\n defaultChecked: r[i],\n isRequired: !0\n },\n i\n )),\n ((($ = o[i].item) == null ? void 0 : $.avatar) || ((j = o[i].item) == null ? void 0 : j.logoName)) && /* @__PURE__ */ c1(Vu, { children: [\n !((r1 = o[i].item) != null && r1.avatar) && ((a1 = o[i].item) == null ? void 0 : a1.logoName) && /* @__PURE__ */ A(\n z4,\n {\n name: (_ = o[i].item) == null ? void 0 : _.logoName,\n size: "10px"\n }\n ),\n ((Y = o[i].item) == null ? void 0 : Y.avatar) && /* @__PURE__ */ A(\n hi,\n {\n size: "xs",\n url: `${(D = o[i].item) == null ? void 0 : D.avatar.url}`,\n name: `${(H = o[i].item) == null ? void 0 : H.avatar.name}`\n }\n )\n ] }),\n !((G = o[i].item) != null && G.countryList) && !((J = o[i].item) != null && J.timeZone) ? (F = o[i].item) != null && F.subLabel ? /* @__PURE__ */ c1(Du, { children: [\n /* @__PURE__ */ A(Hu, { children: s }),\n /* @__PURE__ */ A(Tu, { children: l })\n ] }) : /* @__PURE__ */ A(Nr, { children: s }) : (V = o[i].item) != null && V.timeZone ? /* @__PURE__ */ c1(Nr, { children: [\n /* @__PURE__ */ A(\n a5,\n {\n $width: ((t1 = (Z = (Q = o[i].item) == null ? void 0 : Q.timeZone) == null ? void 0 : Z.zone) == null ? void 0 : t1.length) <= 4,\n children: (U = (n1 = o[i].item) == null ? void 0 : n1.timeZone) == null ? void 0 : U.zone\n }\n ),\n /* @__PURE__ */ A(s5, { isTimeZone: !0, children: (o1 = (e1 = o[i].item) == null ? void 0 : e1.timeZone) == null ? void 0 : o1.time })\n ] }) : /* @__PURE__ */ c1(Nr, { children: [\n /* @__PURE__ */ A(\n a5,\n {\n $width: ((A1 = (M1 = (u1 = o[i].item) == null ? void 0 : u1.countryList) == null ? void 0 : M1.countryCode) == null ? void 0 : A1.length) <= 4,\n children: (b1 = (l1 = o[i].item) == null ? void 0 : l1.countryList) == null ? void 0 : b1.countryCode\n }\n ),\n /* @__PURE__ */ A(s5, { isTimeZone: !1, children: (z1 = (h1 = o[i].item) == null ? void 0 : h1.countryList) == null ? void 0 : z1.countryName })\n ] }),\n ((O1 = o[i].item) == null ? void 0 : O1.subMenu) == !0 && /* @__PURE__ */ A(Il, { children: /* @__PURE__ */ A(Rn, { data: (m1 = o[i].item) == null ? void 0 : m1.subMenuData }) }),\n /* @__PURE__ */ c1(n5, { children: [\n ((L1 = o[i].item) == null ? void 0 : L1.rightIcon) != null ? /* @__PURE__ */ A(o5, { children: /* @__PURE__ */ A(\n f0,\n {\n name: (B1 = (y1 = o[i].item) == null ? void 0 : y1.rightIcon) == null ? void 0 : B1.name,\n size: "xxs",\n color: (T1 = o[i].item) != null && T1.rightIcon.color ? (F1 = o[i].item) == null ? void 0 : F1.rightIcon.color : "#2B2B37"\n }\n ) }) : (X1 = o[i].item) != null && X1.indicator && ((G1 = o[i].item) == null ? void 0 : G1.indicator.indicatorType.toLowerCase()) == "risk" ? /* @__PURE__ */ A(Nu, { children: /* @__PURE__ */ A(\n O4,\n {\n type: (K1 = (Q1 = o[i].item) == null ? void 0 : Q1.indicator) == null ? void 0 : K1.status\n }\n ) }) : ((u0 = (n0 = o[i].item) == null ? void 0 : n0.indicator) == null ? void 0 : u0.indicatorType.toLowerCase()) == "status" ? /* @__PURE__ */ A(Iu, { children: /* @__PURE__ */ A(\n Dl,\n {\n type: (C0 = (c0 = o[i].item) == null ? void 0 : c0.indicator) == null ? void 0 : C0.status,\n hasLabel: (q1 = (y0 = o[i].item) == null ? void 0 : y0.indicator) == null ? void 0 : q1.hasLabel\n }\n ) }) : ((k1 = (v1 = o[i].item) == null ? void 0 : v1.indicator) == null ? void 0 : k1.indicatorType.toLowerCase()) == "progress" ? /* @__PURE__ */ A(ku, { children: /* @__PURE__ */ A(\n C4,\n {\n progress: (i0 = (S1 = o[i].item) == null ? void 0 : S1.indicator) == null ? void 0 : i0.progress,\n type: (l0 = (m0 = o[i].item) == null ? void 0 : m0.indicator) == null ? void 0 : l0.status,\n hasLabel: (H1 = (_1 = o[i].item) == null ? void 0 : _1.indicator) == null ? void 0 : H1.hasLabel\n }\n ) }) : null,\n !((j1 = o[i].item) != null && j1.indicator) && ((s0 = o[i].item) == null ? void 0 : s0.isFavourite) && /* @__PURE__ */ A(f0, { name: "StarSolid", size: "xs" }),\n !((M0 = o[i].item) != null && M0.indicator) && !((I0 = o[i].item) != null && I0.isFavourite) && ((re = o[i].item) == null ? void 0 : re.isActionButton) && /* @__PURE__ */ A(Nr, { children: "Action Btn" }),\n !((R1 = o[i].item) != null && R1.indicator) && !((r0 = o[i].item) != null && r0.isFavourite) && !((d0 = o[i].item) != null && d0.isActionButton) && ((q0 = o[i].item) == null ? void 0 : q0.isToggle) && /* @__PURE__ */ A(Nr, { children: "toggle" })\n ] })\n ]\n }\n )\n }\n ) : /* @__PURE__ */ c1(\n y8,\n {\n onClick: () => {\n a && a(o[i], i);\n },\n $subLabel: !!((D0 = o[i].item) != null && D0.subLabel),\n tabIndex: 0,\n $isSelected: u != null && u.length ? C(o, i, u) : (u == null ? void 0 : u.length) == null ? M([u], o, i) : !(h != null && h.length) && h != null ? (h == null ? void 0 : h.value) === ((G0 = o[i].item) == null ? void 0 : G0.value) : !!M(h, o, i),\n $isScroll: f,\n children: [\n ((V0 = o[i].item) == null ? void 0 : V0.leftIcon) && /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: ((W0 = E2 == null ? void 0 : E2.Countries.filter((X) => {\n var i1;\n return ((i1 = o[i].item) == null ? void 0 : i1.leftIcon.name) == X.CountryName;\n })) == null ? void 0 : W0.length) > 0 ? /* @__PURE__ */ A(Pu, { children: /* @__PURE__ */ A(\n Cl,\n {\n name: (ae = o[i].item) == null ? void 0 : ae.leftIcon.name,\n size: "xxs",\n hideClassName: !0\n }\n ) }) : /* @__PURE__ */ A(o5, { children: /* @__PURE__ */ A(\n f0,\n {\n name: (ee = o[i].item) == null ? void 0 : ee.leftIcon.name,\n size: "xxs",\n color: (se = o[i].item) != null && se.leftIcon.color ? (Me = o[i].item) == null ? void 0 : Me.leftIcon.color : "#2B2B37"\n }\n ) }) }),\n !((At = o[i].item) != null && At.countryList) && !((Ne = o[i].item) != null && Ne.timeZone) && c && !n && /* @__PURE__ */ A(n5, { children: u ? /* @__PURE__ */ A(\n vn,\n {\n defaultChecked: C(\n o,\n i,\n u\n ),\n id: (_e = o[i].item) == null ? void 0 : _e.value,\n isRequired: !0\n }\n ) : /* @__PURE__ */ A(\n vn,\n {\n defaultChecked: p[i],\n id: (ut = o[i].item) == null ? void 0 : ut.value,\n isRequired: !0\n }\n ) }),\n !((pr = o[i].item) != null && pr.countryList) && !((wr = o[i].item) != null && wr.timeZone) && n && !c && (u ? /* @__PURE__ */ A(\n l5,\n {\n name: "list",\n defaultChecked: g(\n o,\n i,\n u\n ),\n isRequired: !0\n },\n i\n ) : /* @__PURE__ */ A(\n l5,\n {\n name: "list",\n defaultChecked: r[i],\n isRequired: !0\n },\n i\n )),\n (((Vn = o[i].item) == null ? void 0 : Vn.avatar) || ((xi = o[i].item) == null ? void 0 : xi.logoName)) && /* @__PURE__ */ c1(Vu, { children: [\n !((ko = o[i].item) != null && ko.avatar) && ((No = o[i].item) == null ? void 0 : No.logoName) && /* @__PURE__ */ A(z4, { name: (Io = o[i].item) == null ? void 0 : Io.logoName, size: "10px" }),\n ((p2 = o[i].item) == null ? void 0 : p2.avatar) && /* @__PURE__ */ A(\n hi,\n {\n size: "xs",\n url: `${(x2 = o[i].item) == null ? void 0 : x2.avatar.url}`,\n name: `${(Fe = o[i].item) == null ? void 0 : Fe.avatar.name}`\n }\n )\n ] }),\n !((F2 = o[i].item) != null && F2.countryList) && !((nn = o[i].item) != null && nn.timeZone) ? (on = o[i].item) != null && on.subLabel ? /* @__PURE__ */ c1(Du, { children: [\n /* @__PURE__ */ A(Hu, { children: s }),\n /* @__PURE__ */ A(Tu, { children: l })\n ] }) : /* @__PURE__ */ A(Nr, { children: s }) : (To = o[i].item) != null && To.timeZone ? /* @__PURE__ */ c1(Nr, { children: [\n /* @__PURE__ */ A(\n a5,\n {\n $width: ((U2 = (xr = (qr = o[i].item) == null ? void 0 : qr.timeZone) == null ? void 0 : xr.zone) == null ? void 0 : U2.length) <= 4,\n children: (Do = (an = o[i].item) == null ? void 0 : an.timeZone) == null ? void 0 : Do.zone\n }\n ),\n /* @__PURE__ */ A(s5, { isTimeZone: !0, children: (bt = (Ho = o[i].item) == null ? void 0 : Ho.timeZone) == null ? void 0 : bt.time })\n ] }) : /* @__PURE__ */ c1(Nr, { children: [\n /* @__PURE__ */ A(\n a5,\n {\n $width: ((Po = (Y2 = (dr = o[i].item) == null ? void 0 : dr.countryList) == null ? void 0 : Y2.countryCode) == null ? void 0 : Po.length) <= 4,\n children: (d2 = (Vo = o[i].item) == null ? void 0 : Vo.countryList) == null ? void 0 : d2.countryCode\n }\n ),\n /* @__PURE__ */ A(s5, { isTimeZone: !1, children: (sn = (R2 = o[i].item) == null ? void 0 : R2.countryList) == null ? void 0 : sn.countryName })\n ] }),\n ((xs = o[i].item) == null ? void 0 : xs.subMenu) == !0 && /* @__PURE__ */ A(Il, { children: /* @__PURE__ */ A(Rn, { data: (Fn = o[i].item) == null ? void 0 : Fn.subMenuData }) }),\n /* @__PURE__ */ c1(n5, { children: [\n ((n3 = o[i].item) == null ? void 0 : n3.rightIcon) != null ? /* @__PURE__ */ A(o5, { children: /* @__PURE__ */ A(\n f0,\n {\n name: (o3 = (Ri = o[i].item) == null ? void 0 : Ri.rightIcon) == null ? void 0 : o3.name,\n size: "xxs",\n color: (i3 = o[i].item) != null && i3.rightIcon.color ? (Rs = o[i].item) == null ? void 0 : Rs.rightIcon.color : "#2B2B37"\n }\n ) }) : (a3 = o[i].item) != null && a3.indicator && ((Bs = o[i].item) == null ? void 0 : Bs.indicator.indicatorType.toLowerCase()) == "risk" ? /* @__PURE__ */ A(Nu, { children: /* @__PURE__ */ A(\n O4,\n {\n type: (Bi = (Ws = o[i].item) == null ? void 0 : Ws.indicator) == null ? void 0 : Bi.status\n }\n ) }) : ((Ss = (Es = o[i].item) == null ? void 0 : Es.indicator) == null ? void 0 : Ss.indicatorType.toLowerCase()) == "status" ? /* @__PURE__ */ A(Iu, { children: /* @__PURE__ */ A(\n Dl,\n {\n type: (Ns = (ks = o[i].item) == null ? void 0 : ks.indicator) == null ? void 0 : Ns.status,\n hasLabel: (Ts = (Is = o[i].item) == null ? void 0 : Is.indicator) == null ? void 0 : Ts.hasLabel\n }\n ) }) : ((s3 = (Ds = o[i].item) == null ? void 0 : Ds.indicator) == null ? void 0 : s3.indicatorType.toLowerCase()) == "progress" ? /* @__PURE__ */ A(ku, { children: /* @__PURE__ */ A(\n C4,\n {\n progress: (l3 = (Wi = o[i].item) == null ? void 0 : Wi.indicator) == null ? void 0 : l3.progress,\n type: (c3 = (Ei = o[i].item) == null ? void 0 : Ei.indicator) == null ? void 0 : c3.status,\n hasLabel: (Si = (p3 = o[i].item) == null ? void 0 : p3.indicator) == null ? void 0 : Si.hasLabel\n }\n ) }) : null,\n !((Hs = o[i].item) != null && Hs.indicator) && ((Ps = o[i].item) == null ? void 0 : Ps.isFavourite) && /* @__PURE__ */ A(f0, { name: "StarSolid", size: "xs" }),\n !((Vs = o[i].item) != null && Vs.indicator) && !((Un = o[i].item) != null && Un.isFavourite) && ((d3 = o[i].item) == null ? void 0 : d3.isActionButton) && /* @__PURE__ */ A(Nr, { children: "Action Btn" }),\n !((ki = o[i].item) != null && ki.indicator) && !((Fs = o[i].item) != null && Fs.isFavourite) && !((Us = o[i].item) != null && Us.isActionButton) && ((Ys = o[i].item) == null ? void 0 : Ys.isToggle) && /* @__PURE__ */ A(Nr, { children: "toggle" })\n ] })\n ]\n }\n )\n },\n (R = o[i].item) == null ? void 0 : R.value\n ) });\n}\nconst uF = 1, w8 = 2;\nlet m4 = {};\nconst bF = (e) => !!m4[e], hF = (e, t) => {\n for (let r = e; r <= t; r++)\n m4[r] = uF;\n return new Promise((r) => {\n for (let n = e; n <= t; n++)\n m4[n] = w8;\n r();\n });\n}, O3 = 28;\nfunction MF(e) {\n const {\n highLightSelectedOptions: t,\n data: r,\n isMulti: n,\n isRadioButton: o,\n selectedOptions: i,\n groupByDivider: a,\n maxheight: s,\n selectedLists: l,\n resetList: c,\n showSelectedList: p,\n enableSelectAll: d\n } = e, [u, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [b, M] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [C, g] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [f, O] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [m, v] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e.defaultValues);\n let y = 225;\n const z = r && (r == null ? void 0 : r.length) > 8 ? s || y : r && (r == null ? void 0 : r.length) * O3;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n (m == null ? void 0 : m.length) == 0 && O([]);\n }, [m]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n v(e.defaultValues);\n }, [e.defaultValues]);\n const N = (w, q) => {\n var B, I, P, k, K, $;\n let S = {\n ...w == null ? void 0 : w.item\n };\n if (n)\n if (w.length) {\n let j = w;\n const r1 = [...b];\n j == null || j.map((_) => {\n let Y = _.value - 1;\n r1[Y] = !b[Y];\n }), M(r1);\n let a1 = [];\n j == null || j.map((_) => {\n a1.push({ label: _.label, value: _.value });\n }), f.push(a1), O(a1), t && i && i(a1);\n } else {\n const j = [...b];\n j[q] = !b[q], M(j);\n let r1, a1;\n r == null || r.filter((H) => {\n H != null && H.group ? a1 = W : a1 = r;\n }), a1 && (r1 = {\n label: (B = a1[q]) != null && B.label ? (I = a1[q]) == null ? void 0 : I.label : (P = a1[q].item) == null ? void 0 : P.label,\n value: (k = a1[q]) != null && k.value ? (K = a1[q]) == null ? void 0 : K.value : ($ = a1[q].item) == null ? void 0 : $.value\n }), f.push(r1);\n let _;\n const Y = f.reduce(\n (H, G) => ((_ = H.find(\n (J) => J.value === G.value\n )) ? _.times++ : (G.times = 1, H.push(G)), H),\n []\n );\n Y == null || Y.map((H, G) => {\n H.times == 2 && Y.splice(G, 1);\n });\n let D = [];\n Y == null || Y.map((H) => {\n D.push({ label: H.label, value: H.value });\n }), O(D), i && i(D);\n }\n else if (o) {\n let j = [];\n if (r)\n for (let a1 = 0; a1 < (r == null ? void 0 : r.length); a1++)\n j[a1] = !1;\n w && (j[q] = !0), g(j);\n let r1 = {\n value: S.value,\n label: S.label\n };\n i && i(r1), O(r1);\n } else {\n let j;\n S.countryList ? j = {\n countryList: { countryCode: S.countryList.countryCode },\n countryName: S.countryList.countryName,\n value: S.value,\n leftIcon: S.leftIcon\n } : S.timeZone ? j = {\n zone: S.timeZone.zone,\n time: S.timeZone.time,\n value: S.value\n } : j = {\n value: S.value,\n label: S.label\n }, i && i(j), O(j);\n }\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n m != null && n && (r == null || r.filter((w) => {\n Object.keys(m).forEach(function(q) {\n var S;\n m[q] && ((S = m[q]) != null && S.value) && w.value == m[q].value && N(m, m[q].value - 1);\n });\n }));\n }, []), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c != null && c.length && t && (r == null || r.filter((w) => {\n Object.keys(c).forEach(function(q) {\n var S;\n c[q] && ((S = c[q]) != null && S.value) && w.value == c[q].value && N(c, c[q].value - 1);\n });\n }));\n }, [c, t]);\n const W = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const w = {};\n let q = !0;\n if (r)\n for (let B = 0; B < (r == null ? void 0 : r.length); B++) {\n const I = r[B];\n !(I != null && I.hasOwnProperty("group")) && q && (q = !1), w[I == null ? void 0 : I.group] || (w[I == null ? void 0 : I.group] = []), w[I == null ? void 0 : I.group].push(I);\n }\n return Object.entries(w).reduce(\n (B, [I, P]) => (q && B.push({ type: "group", group: I }), P.forEach((k) => B.push({ type: "item", item: k })), B),\n []\n );\n }, [r]);\n let T;\n if (r)\n for (let w = 0; w < (r == null ? void 0 : r.length); w++)\n r[w].subMenu && (T = !0), r[w].subLabel;\n let x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var w, q, S;\n if (p && (w = x == null ? void 0 : x.current) != null && w.childNodes) {\n let B = ((q = m[0]) == null ? void 0 : q.value) <= 8 ? 0 : 27, I = (m == null ? void 0 : m.value) <= 8 ? 0 : 27;\n x.current.childNodes[0].scrollTop = (m == null ? void 0 : m.length) > 0 ? ((S = m[0]) == null ? void 0 : S.value) * B : (m == null ? void 0 : m.value) * I;\n }\n }, [p]);\n let E;\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var w, q, S;\n (S = (q = (w = x == null ? void 0 : x.current) == null ? void 0 : w.children[0]) == null ? void 0 : q.children[0]) != null && S.classList && z != y && (x == null || x.current.children[0].children[0].classList.add(\n "ListWrapDiv"\n ), E = x.current.children[0].children[0].clientHeight);\n }, [x, z, r, y]);\n const L = (w) => {\n w.target.checked ? (O(r), i && i(r)) : (v([]), O([]), i && i([])), h(!u);\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n (r == null ? void 0 : r.length) == (m == null ? void 0 : m.length) ? h(!0) : h(!1);\n }, [u, r, m]), /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: /* @__PURE__ */ A(\n pV,\n {\n isItemLoaded: bF,\n itemCount: W.length,\n loadMoreItems: hF,\n children: ({ onItemsRendered: w, ref: q }) => /* @__PURE__ */ A(bV, { children: T ? /* @__PURE__ */ A(hV, { children: /* @__PURE__ */ A(Su, { children: /* @__PURE__ */ A(\n Ru,\n {\n className: "List subList",\n height: z,\n itemCount: W.length,\n itemSize: (S) => W[S].type === "group" && a ? S == 0 ? 0 : 6 : (r == null ? void 0 : r.length) == 1 ? 24 : O3,\n onItemsRendered: w,\n ref: q,\n width: "",\n children: ({ index: S, style: B }) => {\n const I = W[S];\n if (I.type === "group")\n return /* @__PURE__ */ A(\n i5,\n {\n style: {\n ...B,\n height: S == W.length - 1 ? 24 : B.height\n },\n children: /* @__PURE__ */ A(\n c5,\n {\n ...e,\n isGroup: I.type === "group",\n style: {\n marginBottom: `${S == W.length - 1 ? "0" : "4px"}`\n },\n data: W,\n index: S,\n label: I.group,\n groupByDivider: a\n }\n )\n }\n );\n if (I.type === "item") {\n const { item: P } = I;\n let k, K;\n return m4[S] === w8 ? (k = `${P.label}`, k = `${P.subLabel}`) : (k = "Loading...", K = "Loading..."), /* @__PURE__ */ A(\n i5,\n {\n style: {\n ...B,\n height: S == W.length - 1 ? 24 : B.height\n },\n children: /* @__PURE__ */ A(\n c5,\n {\n ...e,\n isGroup: I.type === "group",\n style: {\n marginBottom: `${S == W.length - 1 ? "0" : "4px"}`\n },\n data: W,\n index: S,\n onSelectHandle: N,\n checkboxValue: b,\n label: k,\n subLabel: K,\n radioBtnValue: C,\n isRadioButton: o,\n isMulti: n,\n defaultValues: m\n }\n )\n }\n );\n }\n return "";\n }\n }\n ) }) }) : (\n //\n /* @__PURE__ */ c1(\n Su,\n {\n isContentLarge: r && (r == null ? void 0 : r.length) > 8 ? `${z}px` : "true",\n contentHeight: (r == null ? void 0 : r.length) == 1 ? 28 : E,\n ref: x,\n children: [\n n && d && /* @__PURE__ */ c1(S0, { children: [\n /* @__PURE__ */ A(MV, { $isSelected: u, children: /* @__PURE__ */ A(\n vn,\n {\n label: u ? "Clear All" : "Select All",\n checked: u,\n onChange: L,\n isRequired: !0\n }\n ) }),\n /* @__PURE__ */ A(fV, { children: /* @__PURE__ */ A(a2, {}) })\n ] }),\n /* @__PURE__ */ A(\n Ru,\n {\n className: "List",\n height: z,\n itemCount: W.length,\n itemSize: (S) => W[S].type === "group" && a ? S == 0 ? 0 : 6 : (r == null ? void 0 : r.length) == 1 ? 24 : O3,\n onItemsRendered: w,\n ref: q,\n width: "",\n children: ({ index: S, style: B }) => {\n var P, k;\n const I = W[S];\n if (I.type === "group")\n return /* @__PURE__ */ A(\n i5,\n {\n style: {\n ...B,\n height: S == W.length - 1 ? 24 : B.height\n },\n children: /* @__PURE__ */ A(\n c5,\n {\n ...e,\n isGroup: I.type === "group",\n style: {\n marginBottom: `${S == W.length - 1 ? "0" : "4px"}`\n },\n data: W,\n index: S,\n label: I.group,\n groupByDivider: a\n }\n )\n }\n );\n if (I.type === "item") {\n const { item: K } = I;\n let $, j;\n return m4[S] === w8 ? ($ = `${K.label}`, j = `${K.subLabel}`) : ($ = "Loading...", j = "Loading..."), /* @__PURE__ */ A(\n i5,\n {\n style: {\n ...B,\n top: (P = W[S].item) != null && P.subLabel ? B.top * 1.5 : B.top,\n height: (k = W[S].item) != null && k.subLabel ? 40 : S == W.length - 1 ? 24 : B.height\n },\n children: /* @__PURE__ */ A(\n c5,\n {\n ...e,\n isGroup: I.type === "group",\n style: {\n marginBottom: `${S == W.length - 1 ? "0" : "4px"}`\n },\n data: W,\n index: S,\n onSelectHandle: N,\n checkboxValue: b,\n label: $,\n subLabel: j,\n radioBtnValue: C,\n isRadioButton: o,\n isMulti: n,\n defaultValues: m,\n selectedLists: f || l\n }\n )\n }\n );\n }\n return "";\n }\n }\n )\n ]\n }\n )\n ) })\n },\n a\n ) });\n}\nvar cz = { exports: {} };\n/*! react-checkbox-tree - v1.8.0 | 2022 */\n(function(e, t) {\n /*! For license information please see index.browser.js.LICENSE.txt */\n (function(r, n) {\n e.exports = n((react__WEBPACK_IMPORTED_MODULE_0___default()));\n })(self, (r) => (() => {\n var n = { 4184: (s, l) => {\n var c;\n (function() {\n var p = {}.hasOwnProperty;\n function d() {\n for (var u = [], h = 0; h < arguments.length; h++) {\n var b = arguments[h];\n if (b) {\n var M = typeof b;\n if (M === "string" || M === "number")\n u.push(b);\n else if (Array.isArray(b)) {\n if (b.length) {\n var C = d.apply(null, b);\n C && u.push(C);\n }\n } else if (M === "object")\n if (b.toString === Object.prototype.toString)\n for (var g in b)\n p.call(b, g) && b[g] && u.push(g);\n else\n u.push(b.toString());\n }\n }\n return u.join(" ");\n }\n s.exports ? (d.default = d, s.exports = d) : (c = (function() {\n return d;\n }).apply(l, [])) === void 0 || (s.exports = c);\n })();\n }, 8552: (s, l, c) => {\n var p = c(852)(c(5639), "DataView");\n s.exports = p;\n }, 1989: (s, l, c) => {\n var p = c(1789), d = c(401), u = c(7667), h = c(1327), b = c(1866);\n function M(C) {\n var g = -1, f = C == null ? 0 : C.length;\n for (this.clear(); ++g < f; ) {\n var O = C[g];\n this.set(O[0], O[1]);\n }\n }\n M.prototype.clear = p, M.prototype.delete = d, M.prototype.get = u, M.prototype.has = h, M.prototype.set = b, s.exports = M;\n }, 8407: (s, l, c) => {\n var p = c(7040), d = c(4125), u = c(2117), h = c(7518), b = c(4705);\n function M(C) {\n var g = -1, f = C == null ? 0 : C.length;\n for (this.clear(); ++g < f; ) {\n var O = C[g];\n this.set(O[0], O[1]);\n }\n }\n M.prototype.clear = p, M.prototype.delete = d, M.prototype.get = u, M.prototype.has = h, M.prototype.set = b, s.exports = M;\n }, 7071: (s, l, c) => {\n var p = c(852)(c(5639), "Map");\n s.exports = p;\n }, 3369: (s, l, c) => {\n var p = c(4785), d = c(1285), u = c(6e3), h = c(9916), b = c(5265);\n function M(C) {\n var g = -1, f = C == null ? 0 : C.length;\n for (this.clear(); ++g < f; ) {\n var O = C[g];\n this.set(O[0], O[1]);\n }\n }\n M.prototype.clear = p, M.prototype.delete = d, M.prototype.get = u, M.prototype.has = h, M.prototype.set = b, s.exports = M;\n }, 3818: (s, l, c) => {\n var p = c(852)(c(5639), "Promise");\n s.exports = p;\n }, 8525: (s, l, c) => {\n var p = c(852)(c(5639), "Set");\n s.exports = p;\n }, 8668: (s, l, c) => {\n var p = c(3369), d = c(619), u = c(2385);\n function h(b) {\n var M = -1, C = b == null ? 0 : b.length;\n for (this.__data__ = new p(); ++M < C; )\n this.add(b[M]);\n }\n h.prototype.add = h.prototype.push = d, h.prototype.has = u, s.exports = h;\n }, 6384: (s, l, c) => {\n var p = c(8407), d = c(7465), u = c(3779), h = c(7599), b = c(4758), M = c(4309);\n function C(g) {\n var f = this.__data__ = new p(g);\n this.size = f.size;\n }\n C.prototype.clear = d, C.prototype.delete = u, C.prototype.get = h, C.prototype.has = b, C.prototype.set = M, s.exports = C;\n }, 2705: (s, l, c) => {\n var p = c(5639).Symbol;\n s.exports = p;\n }, 1149: (s, l, c) => {\n var p = c(5639).Uint8Array;\n s.exports = p;\n }, 577: (s, l, c) => {\n var p = c(852)(c(5639), "WeakMap");\n s.exports = p;\n }, 4963: (s) => {\n s.exports = function(l, c) {\n for (var p = -1, d = l == null ? 0 : l.length, u = 0, h = []; ++p < d; ) {\n var b = l[p];\n c(b, p, l) && (h[u++] = b);\n }\n return h;\n };\n }, 4636: (s, l, c) => {\n var p = c(2545), d = c(5694), u = c(1469), h = c(4144), b = c(5776), M = c(6719), C = Object.prototype.hasOwnProperty;\n s.exports = function(g, f) {\n var O = u(g), m = !O && d(g), v = !O && !m && h(g), y = !O && !m && !v && M(g), z = O || m || v || y, N = z ? p(g.length, String) : [], W = N.length;\n for (var T in g)\n !f && !C.call(g, T) || z && (T == "length" || v && (T == "offset" || T == "parent") || y && (T == "buffer" || T == "byteLength" || T == "byteOffset") || b(T, W)) || N.push(T);\n return N;\n };\n }, 2488: (s) => {\n s.exports = function(l, c) {\n for (var p = -1, d = c.length, u = l.length; ++p < d; )\n l[u + p] = c[p];\n return l;\n };\n }, 2908: (s) => {\n s.exports = function(l, c) {\n for (var p = -1, d = l == null ? 0 : l.length; ++p < d; )\n if (c(l[p], p, l))\n return !0;\n return !1;\n };\n }, 8470: (s, l, c) => {\n var p = c(7813);\n s.exports = function(d, u) {\n for (var h = d.length; h--; )\n if (p(d[h][0], u))\n return h;\n return -1;\n };\n }, 8866: (s, l, c) => {\n var p = c(2488), d = c(1469);\n s.exports = function(u, h, b) {\n var M = h(u);\n return d(u) ? M : p(M, b(u));\n };\n }, 4239: (s, l, c) => {\n var p = c(2705), d = c(9607), u = c(2333), h = p ? p.toStringTag : void 0;\n s.exports = function(b) {\n return b == null ? b === void 0 ? "[object Undefined]" : "[object Null]" : h && h in Object(b) ? d(b) : u(b);\n };\n }, 9454: (s, l, c) => {\n var p = c(4239), d = c(7005);\n s.exports = function(u) {\n return d(u) && p(u) == "[object Arguments]";\n };\n }, 939: (s, l, c) => {\n var p = c(2492), d = c(7005);\n s.exports = function u(h, b, M, C, g) {\n return h === b || (h == null || b == null || !d(h) && !d(b) ? h != h && b != b : p(h, b, M, C, u, g));\n };\n }, 2492: (s, l, c) => {\n var p = c(6384), d = c(7114), u = c(8351), h = c(6096), b = c(4160), M = c(1469), C = c(4144), g = c(6719), f = "[object Arguments]", O = "[object Array]", m = "[object Object]", v = Object.prototype.hasOwnProperty;\n s.exports = function(y, z, N, W, T, x) {\n var E = M(y), L = M(z), w = E ? O : b(y), q = L ? O : b(z), S = (w = w == f ? m : w) == m, B = (q = q == f ? m : q) == m, I = w == q;\n if (I && C(y)) {\n if (!C(z))\n return !1;\n E = !0, S = !1;\n }\n if (I && !S)\n return x || (x = new p()), E || g(y) ? d(y, z, N, W, T, x) : u(y, z, w, N, W, T, x);\n if (!(1 & N)) {\n var P = S && v.call(y, "__wrapped__"), k = B && v.call(z, "__wrapped__");\n if (P || k) {\n var K = P ? y.value() : y, $ = k ? z.value() : z;\n return x || (x = new p()), T(K, $, N, W, x);\n }\n }\n return !!I && (x || (x = new p()), h(y, z, N, W, T, x));\n };\n }, 8458: (s, l, c) => {\n var p = c(3560), d = c(5346), u = c(3218), h = c(346), b = /^\\[object .+?Constructor\\]$/, M = Function.prototype, C = Object.prototype, g = M.toString, f = C.hasOwnProperty, O = RegExp("^" + g.call(f).replace(/[\\\\^$.*+?()[\\]{}|]/g, "\\\\$&").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, "$1.*?") + "$");\n s.exports = function(m) {\n return !(!u(m) || d(m)) && (p(m) ? O : b).test(h(m));\n };\n }, 8749: (s, l, c) => {\n var p = c(4239), d = c(1780), u = c(7005), h = {};\n h["[object Float32Array]"] = h["[object Float64Array]"] = h["[object Int8Array]"] = h["[object Int16Array]"] = h["[object Int32Array]"] = h["[object Uint8Array]"] = h["[object Uint8ClampedArray]"] = h["[object Uint16Array]"] = h["[object Uint32Array]"] = !0, h["[object Arguments]"] = h["[object Array]"] = h["[object ArrayBuffer]"] = h["[object Boolean]"] = h["[object DataView]"] = h["[object Date]"] = h["[object Error]"] = h["[object Function]"] = h["[object Map]"] = h["[object Number]"] = h["[object Object]"] = h["[object RegExp]"] = h["[object Set]"] = h["[object String]"] = h["[object WeakMap]"] = !1, s.exports = function(b) {\n return u(b) && d(b.length) && !!h[p(b)];\n };\n }, 280: (s, l, c) => {\n var p = c(5726), d = c(6916), u = Object.prototype.hasOwnProperty;\n s.exports = function(h) {\n if (!p(h))\n return d(h);\n var b = [];\n for (var M in Object(h))\n u.call(h, M) && M != "constructor" && b.push(M);\n return b;\n };\n }, 2545: (s) => {\n s.exports = function(l, c) {\n for (var p = -1, d = Array(l); ++p < l; )\n d[p] = c(p);\n return d;\n };\n }, 1717: (s) => {\n s.exports = function(l) {\n return function(c) {\n return l(c);\n };\n };\n }, 4757: (s) => {\n s.exports = function(l, c) {\n return l.has(c);\n };\n }, 4429: (s, l, c) => {\n var p = c(5639)["__core-js_shared__"];\n s.exports = p;\n }, 7114: (s, l, c) => {\n var p = c(8668), d = c(2908), u = c(4757);\n s.exports = function(h, b, M, C, g, f) {\n var O = 1 & M, m = h.length, v = b.length;\n if (m != v && !(O && v > m))\n return !1;\n var y = f.get(h), z = f.get(b);\n if (y && z)\n return y == b && z == h;\n var N = -1, W = !0, T = 2 & M ? new p() : void 0;\n for (f.set(h, b), f.set(b, h); ++N < m; ) {\n var x = h[N], E = b[N];\n if (C)\n var L = O ? C(E, x, N, b, h, f) : C(x, E, N, h, b, f);\n if (L !== void 0) {\n if (L)\n continue;\n W = !1;\n break;\n }\n if (T) {\n if (!d(b, function(w, q) {\n if (!u(T, q) && (x === w || g(x, w, M, C, f)))\n return T.push(q);\n })) {\n W = !1;\n break;\n }\n } else if (x !== E && !g(x, E, M, C, f)) {\n W = !1;\n break;\n }\n }\n return f.delete(h), f.delete(b), W;\n };\n }, 8351: (s, l, c) => {\n var p = c(2705), d = c(1149), u = c(7813), h = c(7114), b = c(8776), M = c(1814), C = p ? p.prototype : void 0, g = C ? C.valueOf : void 0;\n s.exports = function(f, O, m, v, y, z, N) {\n switch (m) {\n case "[object DataView]":\n if (f.byteLength != O.byteLength || f.byteOffset != O.byteOffset)\n return !1;\n f = f.buffer, O = O.buffer;\n case "[object ArrayBuffer]":\n return !(f.byteLength != O.byteLength || !z(new d(f), new d(O)));\n case "[object Boolean]":\n case "[object Date]":\n case "[object Number]":\n return u(+f, +O);\n case "[object Error]":\n return f.name == O.name && f.message == O.message;\n case "[object RegExp]":\n case "[object String]":\n return f == O + "";\n case "[object Map]":\n var W = b;\n case "[object Set]":\n var T = 1 & v;\n if (W || (W = M), f.size != O.size && !T)\n return !1;\n var x = N.get(f);\n if (x)\n return x == O;\n v |= 2, N.set(f, O);\n var E = h(W(f), W(O), v, y, z, N);\n return N.delete(f), E;\n case "[object Symbol]":\n if (g)\n return g.call(f) == g.call(O);\n }\n return !1;\n };\n }, 6096: (s, l, c) => {\n var p = c(8234), d = Object.prototype.hasOwnProperty;\n s.exports = function(u, h, b, M, C, g) {\n var f = 1 & b, O = p(u), m = O.length;\n if (m != p(h).length && !f)\n return !1;\n for (var v = m; v--; ) {\n var y = O[v];\n if (!(f ? y in h : d.call(h, y)))\n return !1;\n }\n var z = g.get(u), N = g.get(h);\n if (z && N)\n return z == h && N == u;\n var W = !0;\n g.set(u, h), g.set(h, u);\n for (var T = f; ++v < m; ) {\n var x = u[y = O[v]], E = h[y];\n if (M)\n var L = f ? M(E, x, y, h, u, g) : M(x, E, y, u, h, g);\n if (!(L === void 0 ? x === E || C(x, E, b, M, g) : L)) {\n W = !1;\n break;\n }\n T || (T = y == "constructor");\n }\n if (W && !T) {\n var w = u.constructor, q = h.constructor;\n w == q || !("constructor" in u) || !("constructor" in h) || typeof w == "function" && w instanceof w && typeof q == "function" && q instanceof q || (W = !1);\n }\n return g.delete(u), g.delete(h), W;\n };\n }, 1957: (s, l, c) => {\n var p = typeof c.g == "object" && c.g && c.g.Object === Object && c.g;\n s.exports = p;\n }, 8234: (s, l, c) => {\n var p = c(8866), d = c(9551), u = c(3674);\n s.exports = function(h) {\n return p(h, u, d);\n };\n }, 5050: (s, l, c) => {\n var p = c(7019);\n s.exports = function(d, u) {\n var h = d.__data__;\n return p(u) ? h[typeof u == "string" ? "string" : "hash"] : h.map;\n };\n }, 852: (s, l, c) => {\n var p = c(8458), d = c(7801);\n s.exports = function(u, h) {\n var b = d(u, h);\n return p(b) ? b : void 0;\n };\n }, 9607: (s, l, c) => {\n var p = c(2705), d = Object.prototype, u = d.hasOwnProperty, h = d.toString, b = p ? p.toStringTag : void 0;\n s.exports = function(M) {\n var C = u.call(M, b), g = M[b];\n try {\n M[b] = void 0;\n var f = !0;\n } catch {\n }\n var O = h.call(M);\n return f && (C ? M[b] = g : delete M[b]), O;\n };\n }, 9551: (s, l, c) => {\n var p = c(4963), d = c(479), u = Object.prototype.propertyIsEnumerable, h = Object.getOwnPropertySymbols, b = h ? function(M) {\n return M == null ? [] : (M = Object(M), p(h(M), function(C) {\n return u.call(M, C);\n }));\n } : d;\n s.exports = b;\n }, 4160: (s, l, c) => {\n var p = c(8552), d = c(7071), u = c(3818), h = c(8525), b = c(577), M = c(4239), C = c(346), g = "[object Map]", f = "[object Promise]", O = "[object Set]", m = "[object WeakMap]", v = "[object DataView]", y = C(p), z = C(d), N = C(u), W = C(h), T = C(b), x = M;\n (p && x(new p(new ArrayBuffer(1))) != v || d && x(new d()) != g || u && x(u.resolve()) != f || h && x(new h()) != O || b && x(new b()) != m) && (x = function(E) {\n var L = M(E), w = L == "[object Object]" ? E.constructor : void 0, q = w ? C(w) : "";\n if (q)\n switch (q) {\n case y:\n return v;\n case z:\n return g;\n case N:\n return f;\n case W:\n return O;\n case T:\n return m;\n }\n return L;\n }), s.exports = x;\n }, 7801: (s) => {\n s.exports = function(l, c) {\n return l == null ? void 0 : l[c];\n };\n }, 1789: (s, l, c) => {\n var p = c(4536);\n s.exports = function() {\n this.__data__ = p ? p(null) : {}, this.size = 0;\n };\n }, 401: (s) => {\n s.exports = function(l) {\n var c = this.has(l) && delete this.__data__[l];\n return this.size -= c ? 1 : 0, c;\n };\n }, 7667: (s, l, c) => {\n var p = c(4536), d = Object.prototype.hasOwnProperty;\n s.exports = function(u) {\n var h = this.__data__;\n if (p) {\n var b = h[u];\n return b === "__lodash_hash_undefined__" ? void 0 : b;\n }\n return d.call(h, u) ? h[u] : void 0;\n };\n }, 1327: (s, l, c) => {\n var p = c(4536), d = Object.prototype.hasOwnProperty;\n s.exports = function(u) {\n var h = this.__data__;\n return p ? h[u] !== void 0 : d.call(h, u);\n };\n }, 1866: (s, l, c) => {\n var p = c(4536);\n s.exports = function(d, u) {\n var h = this.__data__;\n return this.size += this.has(d) ? 0 : 1, h[d] = p && u === void 0 ? "__lodash_hash_undefined__" : u, this;\n };\n }, 5776: (s) => {\n var l = /^(?:0|[1-9]\\d*)$/;\n s.exports = function(c, p) {\n var d = typeof c;\n return !!(p = p ?? 9007199254740991) && (d == "number" || d != "symbol" && l.test(c)) && c > -1 && c % 1 == 0 && c < p;\n };\n }, 7019: (s) => {\n s.exports = function(l) {\n var c = typeof l;\n return c == "string" || c == "number" || c == "symbol" || c == "boolean" ? l !== "__proto__" : l === null;\n };\n }, 5346: (s, l, c) => {\n var p, d = c(4429), u = (p = /[^.]+$/.exec(d && d.keys && d.keys.IE_PROTO || "")) ? "Symbol(src)_1." + p : "";\n s.exports = function(h) {\n return !!u && u in h;\n };\n }, 5726: (s) => {\n var l = Object.prototype;\n s.exports = function(c) {\n var p = c && c.constructor;\n return c === (typeof p == "function" && p.prototype || l);\n };\n }, 7040: (s) => {\n s.exports = function() {\n this.__data__ = [], this.size = 0;\n };\n }, 4125: (s, l, c) => {\n var p = c(8470), d = Array.prototype.splice;\n s.exports = function(u) {\n var h = this.__data__, b = p(h, u);\n return !(b < 0 || (b == h.length - 1 ? h.pop() : d.call(h, b, 1), --this.size, 0));\n };\n }, 2117: (s, l, c) => {\n var p = c(8470);\n s.exports = function(d) {\n var u = this.__data__, h = p(u, d);\n return h < 0 ? void 0 : u[h][1];\n };\n }, 7518: (s, l, c) => {\n var p = c(8470);\n s.exports = function(d) {\n return p(this.__data__, d) > -1;\n };\n }, 4705: (s, l, c) => {\n var p = c(8470);\n s.exports = function(d, u) {\n var h = this.__data__, b = p(h, d);\n return b < 0 ? (++this.size, h.push([d, u])) : h[b][1] = u, this;\n };\n }, 4785: (s, l, c) => {\n var p = c(1989), d = c(8407), u = c(7071);\n s.exports = function() {\n this.size = 0, this.__data__ = { hash: new p(), map: new (u || d)(), string: new p() };\n };\n }, 1285: (s, l, c) => {\n var p = c(5050);\n s.exports = function(d) {\n var u = p(this, d).delete(d);\n return this.size -= u ? 1 : 0, u;\n };\n }, 6e3: (s, l, c) => {\n var p = c(5050);\n s.exports = function(d) {\n return p(this, d).get(d);\n };\n }, 9916: (s, l, c) => {\n var p = c(5050);\n s.exports = function(d) {\n return p(this, d).has(d);\n };\n }, 5265: (s, l, c) => {\n var p = c(5050);\n s.exports = function(d, u) {\n var h = p(this, d), b = h.size;\n return h.set(d, u), this.size += h.size == b ? 0 : 1, this;\n };\n }, 8776: (s) => {\n s.exports = function(l) {\n var c = -1, p = Array(l.size);\n return l.forEach(function(d, u) {\n p[++c] = [u, d];\n }), p;\n };\n }, 4536: (s, l, c) => {\n var p = c(852)(Object, "create");\n s.exports = p;\n }, 6916: (s, l, c) => {\n var p = c(5569)(Object.keys, Object);\n s.exports = p;\n }, 1167: (s, l, c) => {\n s = c.nmd(s);\n var p = c(1957), d = l && !l.nodeType && l, u = d && s && !s.nodeType && s, h = u && u.exports === d && p.process, b = function() {\n try {\n return u && u.require && u.require("util").types || h && h.binding && h.binding("util");\n } catch {\n }\n }();\n s.exports = b;\n }, 2333: (s) => {\n var l = Object.prototype.toString;\n s.exports = function(c) {\n return l.call(c);\n };\n }, 5569: (s) => {\n s.exports = function(l, c) {\n return function(p) {\n return l(c(p));\n };\n };\n }, 5639: (s, l, c) => {\n var p = c(1957), d = typeof self == "object" && self && self.Object === Object && self, u = p || d || Function("return this")();\n s.exports = u;\n }, 619: (s) => {\n s.exports = function(l) {\n return this.__data__.set(l, "__lodash_hash_undefined__"), this;\n };\n }, 2385: (s) => {\n s.exports = function(l) {\n return this.__data__.has(l);\n };\n }, 1814: (s) => {\n s.exports = function(l) {\n var c = -1, p = Array(l.size);\n return l.forEach(function(d) {\n p[++c] = d;\n }), p;\n };\n }, 7465: (s, l, c) => {\n var p = c(8407);\n s.exports = function() {\n this.__data__ = new p(), this.size = 0;\n };\n }, 3779: (s) => {\n s.exports = function(l) {\n var c = this.__data__, p = c.delete(l);\n return this.size = c.size, p;\n };\n }, 7599: (s) => {\n s.exports = function(l) {\n return this.__data__.get(l);\n };\n }, 4758: (s) => {\n s.exports = function(l) {\n return this.__data__.has(l);\n };\n }, 4309: (s, l, c) => {\n var p = c(8407), d = c(7071), u = c(3369);\n s.exports = function(h, b) {\n var M = this.__data__;\n if (M instanceof p) {\n var C = M.__data__;\n if (!d || C.length < 199)\n return C.push([h, b]), this.size = ++M.size, this;\n M = this.__data__ = new u(C);\n }\n return M.set(h, b), this.size = M.size, this;\n };\n }, 346: (s) => {\n var l = Function.prototype.toString;\n s.exports = function(c) {\n if (c != null) {\n try {\n return l.call(c);\n } catch {\n }\n try {\n return c + "";\n } catch {\n }\n }\n return "";\n };\n }, 7813: (s) => {\n s.exports = function(l, c) {\n return l === c || l != l && c != c;\n };\n }, 5694: (s, l, c) => {\n var p = c(9454), d = c(7005), u = Object.prototype, h = u.hasOwnProperty, b = u.propertyIsEnumerable, M = p(function() {\n return arguments;\n }()) ? p : function(C) {\n return d(C) && h.call(C, "callee") && !b.call(C, "callee");\n };\n s.exports = M;\n }, 1469: (s) => {\n var l = Array.isArray;\n s.exports = l;\n }, 8612: (s, l, c) => {\n var p = c(3560), d = c(1780);\n s.exports = function(u) {\n return u != null && d(u.length) && !p(u);\n };\n }, 4144: (s, l, c) => {\n s = c.nmd(s);\n var p = c(5639), d = c(5062), u = l && !l.nodeType && l, h = u && s && !s.nodeType && s, b = h && h.exports === u ? p.Buffer : void 0, M = (b ? b.isBuffer : void 0) || d;\n s.exports = M;\n }, 8446: (s, l, c) => {\n var p = c(939);\n s.exports = function(d, u) {\n return p(d, u);\n };\n }, 3560: (s, l, c) => {\n var p = c(4239), d = c(3218);\n s.exports = function(u) {\n if (!d(u))\n return !1;\n var h = p(u);\n return h == "[object Function]" || h == "[object GeneratorFunction]" || h == "[object AsyncFunction]" || h == "[object Proxy]";\n };\n }, 1780: (s) => {\n s.exports = function(l) {\n return typeof l == "number" && l > -1 && l % 1 == 0 && l <= 9007199254740991;\n };\n }, 3218: (s) => {\n s.exports = function(l) {\n var c = typeof l;\n return l != null && (c == "object" || c == "function");\n };\n }, 7005: (s) => {\n s.exports = function(l) {\n return l != null && typeof l == "object";\n };\n }, 6719: (s, l, c) => {\n var p = c(8749), d = c(1717), u = c(1167), h = u && u.isTypedArray, b = h ? d(h) : p;\n s.exports = b;\n }, 3674: (s, l, c) => {\n var p = c(4636), d = c(280), u = c(8612);\n s.exports = function(h) {\n return u(h) ? p(h) : d(h);\n };\n }, 8306: (s, l, c) => {\n var p = c(3369);\n function d(u, h) {\n if (typeof u != "function" || h != null && typeof h != "function")\n throw new TypeError("Expected a function");\n var b = function() {\n var M = arguments, C = h ? h.apply(this, M) : M[0], g = b.cache;\n if (g.has(C))\n return g.get(C);\n var f = u.apply(this, M);\n return b.cache = g.set(C, f) || g, f;\n };\n return b.cache = new (d.Cache || p)(), b;\n }\n d.Cache = p, s.exports = d;\n }, 479: (s) => {\n s.exports = function() {\n return [];\n };\n }, 5062: (s) => {\n s.exports = function() {\n return !1;\n };\n }, 2703: (s, l, c) => {\n var p = c(414);\n function d() {\n }\n function u() {\n }\n u.resetWarningCache = d, s.exports = function() {\n function h(C, g, f, O, m, v) {\n if (v !== p) {\n var y = 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");\n throw y.name = "Invariant Violation", y;\n }\n }\n function b() {\n return h;\n }\n h.isRequired = h;\n var M = { array: h, bigint: h, bool: h, func: h, number: h, object: h, string: h, symbol: h, any: h, arrayOf: b, element: h, elementType: h, instanceOf: b, node: h, objectOf: b, oneOf: b, oneOfType: b, shape: b, exact: b, checkPropTypes: u, resetWarningCache: d };\n return M.PropTypes = M, M;\n };\n }, 5697: (s, l, c) => {\n s.exports = c(2703)();\n }, 414: (s) => {\n s.exports = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";\n }, 9787: (s) => {\n s.exports = r;\n } }, o = {};\n function i(s) {\n var l = o[s];\n if (l !== void 0)\n return l.exports;\n var c = o[s] = { id: s, loaded: !1, exports: {} };\n return n[s](c, c.exports, i), c.loaded = !0, c.exports;\n }\n i.n = (s) => {\n var l = s && s.__esModule ? () => s.default : () => s;\n return i.d(l, { a: l }), l;\n }, i.d = (s, l) => {\n for (var c in l)\n i.o(l, c) && !i.o(s, c) && Object.defineProperty(s, c, { enumerable: !0, get: l[c] });\n }, i.g = function() {\n if (typeof globalThis == "object")\n return globalThis;\n try {\n return this || new Function("return this")();\n } catch {\n if (typeof window == "object")\n return window;\n }\n }(), i.o = (s, l) => Object.prototype.hasOwnProperty.call(s, l), i.r = (s) => {\n typeof Symbol < "u" && Symbol.toStringTag && Object.defineProperty(s, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(s, "__esModule", { value: !0 });\n }, i.nmd = (s) => (s.paths = [], s.children || (s.children = []), s);\n var a = {};\n return (() => {\n i.r(a), i.d(a, { default: () => y0, expandNodesToLevel: () => C0 });\n var s = i(4184), l = i.n(s), c = i(8446), p = i.n(c), d = i(8306), u = i.n(d);\n let h = (q1 = 21) => crypto.getRandomValues(new Uint8Array(q1)).reduce((v1, k1) => v1 + ((k1 &= 63) < 36 ? k1.toString(36) : k1 < 62 ? (k1 - 26).toString(36).toUpperCase() : k1 > 62 ? "-" : "_"), "");\n var b = i(5697), M = i.n(b), C = i(9787), g = i.n(C);\n function f(q1) {\n return f = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(v1) {\n return typeof v1;\n } : function(v1) {\n return v1 && typeof Symbol == "function" && v1.constructor === Symbol && v1 !== Symbol.prototype ? "symbol" : typeof v1;\n }, f(q1);\n }\n var O = ["children", "title"];\n function m() {\n return m = Object.assign ? Object.assign.bind() : function(q1) {\n for (var v1 = 1; v1 < arguments.length; v1++) {\n var k1 = arguments[v1];\n for (var S1 in k1)\n Object.prototype.hasOwnProperty.call(k1, S1) && (q1[S1] = k1[S1]);\n }\n return q1;\n }, m.apply(this, arguments);\n }\n function v(q1, v1) {\n if (!(q1 instanceof v1))\n throw new TypeError("Cannot call a class as a function");\n }\n function y(q1, v1) {\n for (var k1 = 0; k1 < v1.length; k1++) {\n var S1 = v1[k1];\n S1.enumerable = S1.enumerable || !1, S1.configurable = !0, "value" in S1 && (S1.writable = !0), Object.defineProperty(q1, S1.key, S1);\n }\n }\n function z(q1, v1) {\n return z = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(k1, S1) {\n return k1.__proto__ = S1, k1;\n }, z(q1, v1);\n }\n function N(q1, v1) {\n if (v1 && (f(v1) === "object" || typeof v1 == "function"))\n return v1;\n if (v1 !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return function(k1) {\n if (k1 === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return k1;\n }(q1);\n }\n function W(q1) {\n return W = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(v1) {\n return v1.__proto__ || Object.getPrototypeOf(v1);\n }, W(q1);\n }\n function T(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n var x = function(q1) {\n (function(_1, H1) {\n if (typeof H1 != "function" && H1 !== null)\n throw new TypeError("Super expression must either be null or a function");\n _1.prototype = Object.create(H1 && H1.prototype, { constructor: { value: _1, writable: !0, configurable: !0 } }), Object.defineProperty(_1, "prototype", { writable: !1 }), H1 && z(_1, H1);\n })(l0, q1);\n var v1, k1, S1, i0, m0 = (S1 = l0, i0 = function() {\n if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)\n return !1;\n if (typeof Proxy == "function")\n return !0;\n try {\n return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n })), !0;\n } catch {\n return !1;\n }\n }(), function() {\n var _1, H1 = W(S1);\n if (i0) {\n var j1 = W(this).constructor;\n _1 = Reflect.construct(H1, arguments, j1);\n } else\n _1 = H1.apply(this, arguments);\n return N(this, _1);\n });\n function l0() {\n return v(this, l0), m0.apply(this, arguments);\n }\n return v1 = l0, (k1 = [{ key: "render", value: function() {\n var _1 = this.props, H1 = _1.children, j1 = _1.title, s0 = function(M0, I0) {\n if (M0 == null)\n return {};\n var re, R1, r0 = function(q0, D0) {\n if (q0 == null)\n return {};\n var G0, V0, W0 = {}, ae = Object.keys(q0);\n for (V0 = 0; V0 < ae.length; V0++)\n G0 = ae[V0], D0.indexOf(G0) >= 0 || (W0[G0] = q0[G0]);\n return W0;\n }(M0, I0);\n if (Object.getOwnPropertySymbols) {\n var d0 = Object.getOwnPropertySymbols(M0);\n for (R1 = 0; R1 < d0.length; R1++)\n re = d0[R1], I0.indexOf(re) >= 0 || Object.prototype.propertyIsEnumerable.call(M0, re) && (r0[re] = M0[re]);\n }\n return r0;\n }(_1, O);\n return g().createElement("button", m({ "aria-label": j1, title: j1, type: "button" }, s0), H1);\n } }]) && y(v1.prototype, k1), Object.defineProperty(v1, "prototype", { writable: !1 }), l0;\n }(g().PureComponent);\n T(x, "propTypes", { children: M().node.isRequired, title: M().string }), T(x, "defaultProps", { title: null });\n const E = x, L = { ALL: "all", PARENT: "parent", LEAF: "leaf" };\n function w(q1) {\n this.message = q1, this.stack = Error().stack;\n }\n w.prototype = Object.create(Error.prototype), w.prototype.name = "CheckboxTreeError";\n const q = w;\n function S(q1, v1) {\n var k1 = Object.keys(q1);\n if (Object.getOwnPropertySymbols) {\n var S1 = Object.getOwnPropertySymbols(q1);\n v1 && (S1 = S1.filter(function(i0) {\n return Object.getOwnPropertyDescriptor(q1, i0).enumerable;\n })), k1.push.apply(k1, S1);\n }\n return k1;\n }\n function B(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n function I(q1, v1) {\n if (!(q1 instanceof v1))\n throw new TypeError("Cannot call a class as a function");\n }\n function P(q1, v1) {\n for (var k1 = 0; k1 < v1.length; k1++) {\n var S1 = v1[k1];\n S1.enumerable = S1.enumerable || !1, S1.configurable = !0, "value" in S1 && (S1.writable = !0), Object.defineProperty(q1, S1.key, S1);\n }\n }\n var k = L;\n const K = function() {\n function q1(S1) {\n var i0 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n I(this, q1), this.props = S1, this.flatNodes = i0;\n }\n var v1, k1;\n return v1 = q1, k1 = [{ key: "setProps", value: function(S1) {\n this.props = S1;\n } }, { key: "clone", value: function() {\n var S1 = this, i0 = {};\n return Object.keys(this.flatNodes).forEach(function(m0) {\n var l0 = S1.flatNodes[m0];\n i0[m0] = function(_1) {\n for (var H1 = 1; H1 < arguments.length; H1++) {\n var j1 = arguments[H1] != null ? arguments[H1] : {};\n H1 % 2 ? S(Object(j1), !0).forEach(function(s0) {\n B(_1, s0, j1[s0]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(_1, Object.getOwnPropertyDescriptors(j1)) : S(Object(j1)).forEach(function(s0) {\n Object.defineProperty(_1, s0, Object.getOwnPropertyDescriptor(j1, s0));\n });\n }\n return _1;\n }({}, l0);\n }), new q1(this.props, i0);\n } }, { key: "getNode", value: function(S1) {\n return this.flatNodes[S1];\n } }, { key: "reset", value: function() {\n this.flatNodes = {};\n } }, { key: "flattenNodes", value: function(S1) {\n var i0 = this, m0 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, l0 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;\n if (Array.isArray(S1) && S1.length !== 0) {\n var _1 = this.props, H1 = _1.disabled, j1 = _1.noCascade;\n S1.forEach(function(s0, M0) {\n var I0 = i0.nodeHasChildren(s0);\n if (i0.flatNodes[s0.value] !== void 0)\n throw new q("Duplicate value \'".concat(s0.value, "\' detected. All node values must be unique."));\n i0.flatNodes[s0.value] = { label: s0.label, value: s0.value, children: s0.children, parent: m0, isChild: m0.value !== void 0, isParent: I0, isLeaf: !I0, showCheckbox: s0.showCheckbox === void 0 || s0.showCheckbox, disabled: i0.getDisabledState(s0, m0, H1, j1), treeDepth: l0, index: M0 }, i0.flattenNodes(s0.children, s0, l0 + 1);\n });\n }\n } }, { key: "nodeHasChildren", value: function(S1) {\n return Array.isArray(S1.children);\n } }, { key: "getDisabledState", value: function(S1, i0, m0, l0) {\n return !!m0 || !(l0 || !i0.disabled) || !!S1.disabled;\n } }, { key: "deserializeLists", value: function(S1) {\n var i0 = this, m0 = ["checked", "expanded"];\n Object.keys(this.flatNodes).forEach(function(l0) {\n m0.forEach(function(_1) {\n i0.flatNodes[l0][_1] = !1;\n });\n }), m0.forEach(function(l0) {\n S1[l0].forEach(function(_1) {\n i0.flatNodes[_1] !== void 0 && (i0.flatNodes[_1][l0] = !0);\n });\n });\n } }, { key: "serializeList", value: function(S1) {\n var i0 = this, m0 = [];\n return Object.keys(this.flatNodes).forEach(function(l0) {\n i0.flatNodes[l0][S1] && m0.push(l0);\n }), m0;\n } }, { key: "expandAllNodes", value: function(S1) {\n var i0 = this;\n return Object.keys(this.flatNodes).forEach(function(m0) {\n i0.flatNodes[m0].isParent && (i0.flatNodes[m0].expanded = S1);\n }), this;\n } }, { key: "toggleChecked", value: function(S1, i0, m0, l0) {\n var _1 = this, H1 = !(arguments.length > 4 && arguments[4] !== void 0) || arguments[4], j1 = this.flatNodes[S1.value], s0 = [k.PARENT, k.ALL].indexOf(m0) > -1, M0 = [k.LEAF, k.ALL].indexOf(m0) > -1;\n if (j1.isLeaf || l0) {\n if (S1.disabled)\n return this;\n this.toggleNode(S1.value, "checked", i0);\n } else\n (s0 || j1.children.length === 0) && this.toggleNode(S1.value, "checked", i0), M0 && j1.children.forEach(function(I0) {\n _1.toggleChecked(I0, i0, m0, l0, !1);\n });\n return H1 && !l0 && j1.isChild && s0 && this.toggleParentStatus(j1.parent, m0), this;\n } }, { key: "toggleParentStatus", value: function(S1, i0) {\n var m0 = this.flatNodes[S1.value];\n m0.isChild ? (i0 === k.ALL && this.toggleNode(S1.value, "checked", this.isEveryChildChecked(m0)), this.toggleParentStatus(m0.parent, i0)) : this.toggleNode(S1.value, "checked", this.isEveryChildChecked(m0));\n } }, { key: "isEveryChildChecked", value: function(S1) {\n var i0 = this;\n return S1.children.every(function(m0) {\n return i0.getNode(m0.value).checked;\n });\n } }, { key: "toggleNode", value: function(S1, i0, m0) {\n return this.flatNodes[S1][i0] = m0, this;\n } }], k1 && P(v1.prototype, k1), Object.defineProperty(v1, "prototype", { writable: !1 }), q1;\n }();\n function $(q1) {\n return $ = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(v1) {\n return typeof v1;\n } : function(v1) {\n return v1 && typeof Symbol == "function" && v1.constructor === Symbol && v1 !== Symbol.prototype ? "symbol" : typeof v1;\n }, $(q1);\n }\n function j() {\n return j = Object.assign ? Object.assign.bind() : function(q1) {\n for (var v1 = 1; v1 < arguments.length; v1++) {\n var k1 = arguments[v1];\n for (var S1 in k1)\n Object.prototype.hasOwnProperty.call(k1, S1) && (q1[S1] = k1[S1]);\n }\n return q1;\n }, j.apply(this, arguments);\n }\n function r1(q1, v1) {\n var k1 = Object.keys(q1);\n if (Object.getOwnPropertySymbols) {\n var S1 = Object.getOwnPropertySymbols(q1);\n v1 && (S1 = S1.filter(function(i0) {\n return Object.getOwnPropertyDescriptor(q1, i0).enumerable;\n })), k1.push.apply(k1, S1);\n }\n return k1;\n }\n function a1(q1, v1) {\n if (!(q1 instanceof v1))\n throw new TypeError("Cannot call a class as a function");\n }\n function _(q1, v1) {\n for (var k1 = 0; k1 < v1.length; k1++) {\n var S1 = v1[k1];\n S1.enumerable = S1.enumerable || !1, S1.configurable = !0, "value" in S1 && (S1.writable = !0), Object.defineProperty(q1, S1.key, S1);\n }\n }\n function Y(q1, v1) {\n return Y = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(k1, S1) {\n return k1.__proto__ = S1, k1;\n }, Y(q1, v1);\n }\n function D(q1, v1) {\n if (v1 && ($(v1) === "object" || typeof v1 == "function"))\n return v1;\n if (v1 !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return function(k1) {\n if (k1 === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return k1;\n }(q1);\n }\n function H(q1) {\n return H = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(v1) {\n return v1.__proto__ || Object.getPrototypeOf(v1);\n }, H(q1);\n }\n function G(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n var J = function(q1) {\n (function(_1, H1) {\n if (typeof H1 != "function" && H1 !== null)\n throw new TypeError("Super expression must either be null or a function");\n _1.prototype = Object.create(H1 && H1.prototype, { constructor: { value: _1, writable: !0, configurable: !0 } }), Object.defineProperty(_1, "prototype", { writable: !1 }), H1 && Y(_1, H1);\n })(l0, q1);\n var v1, k1, S1, i0, m0 = (S1 = l0, i0 = function() {\n if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)\n return !1;\n if (typeof Proxy == "function")\n return !0;\n try {\n return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n })), !0;\n } catch {\n return !1;\n }\n }(), function() {\n var _1, H1 = H(S1);\n if (i0) {\n var j1 = H(this).constructor;\n _1 = Reflect.construct(H1, arguments, j1);\n } else\n _1 = H1.apply(this, arguments);\n return D(this, _1);\n });\n function l0() {\n return a1(this, l0), m0.apply(this, arguments);\n }\n return v1 = l0, k1 = [{ key: "componentDidMount", value: function() {\n this.updateDeterminateProperty();\n } }, { key: "componentDidUpdate", value: function() {\n this.updateDeterminateProperty();\n } }, { key: "updateDeterminateProperty", value: function() {\n var _1 = this.props.indeterminate;\n this.checkbox.indeterminate = _1;\n } }, { key: "render", value: function() {\n var _1 = this, H1 = function(j1) {\n for (var s0 = 1; s0 < arguments.length; s0++) {\n var M0 = arguments[s0] != null ? arguments[s0] : {};\n s0 % 2 ? r1(Object(M0), !0).forEach(function(I0) {\n G(j1, I0, M0[I0]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(j1, Object.getOwnPropertyDescriptors(M0)) : r1(Object(M0)).forEach(function(I0) {\n Object.defineProperty(j1, I0, Object.getOwnPropertyDescriptor(M0, I0));\n });\n }\n return j1;\n }({}, this.props);\n return delete H1.indeterminate, g().createElement("input", j({}, H1, { ref: function(j1) {\n _1.checkbox = j1;\n }, type: "checkbox" }));\n } }], k1 && _(v1.prototype, k1), Object.defineProperty(v1, "prototype", { writable: !1 }), l0;\n }(g().PureComponent);\n G(J, "propTypes", { indeterminate: M().bool }), G(J, "defaultProps", { indeterminate: !1 });\n const F = J, V = M().shape({ check: M().node, uncheck: M().node, halfCheck: M().node, expandClose: M().node, expandOpen: M().node, expandAll: M().node, collapseAll: M().node, parentClose: M().node, parentOpen: M().node, leaf: M().node }), Q = M().shape({ collapseAll: M().string.isRequired, expandAll: M().string.isRequired, toggle: M().string.isRequired });\n function Z(q1) {\n return Z = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(v1) {\n return typeof v1;\n } : function(v1) {\n return v1 && typeof Symbol == "function" && v1.constructor === Symbol && v1 !== Symbol.prototype ? "symbol" : typeof v1;\n }, Z(q1);\n }\n function t1(q1, v1) {\n for (var k1 = 0; k1 < v1.length; k1++) {\n var S1 = v1[k1];\n S1.enumerable = S1.enumerable || !1, S1.configurable = !0, "value" in S1 && (S1.writable = !0), Object.defineProperty(q1, S1.key, S1);\n }\n }\n function n1(q1, v1) {\n return n1 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(k1, S1) {\n return k1.__proto__ = S1, k1;\n }, n1(q1, v1);\n }\n function U(q1, v1) {\n if (v1 && (Z(v1) === "object" || typeof v1 == "function"))\n return v1;\n if (v1 !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return e1(q1);\n }\n function e1(q1) {\n if (q1 === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return q1;\n }\n function o1(q1) {\n return o1 = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(v1) {\n return v1.__proto__ || Object.getPrototypeOf(v1);\n }, o1(q1);\n }\n function u1(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n var M1 = function(q1) {\n (function(_1, H1) {\n if (typeof H1 != "function" && H1 !== null)\n throw new TypeError("Super expression must either be null or a function");\n _1.prototype = Object.create(H1 && H1.prototype, { constructor: { value: _1, writable: !0, configurable: !0 } }), Object.defineProperty(_1, "prototype", { writable: !1 }), H1 && n1(_1, H1);\n })(l0, q1);\n var v1, k1, S1, i0, m0 = (S1 = l0, i0 = function() {\n if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)\n return !1;\n if (typeof Proxy == "function")\n return !0;\n try {\n return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n })), !0;\n } catch {\n return !1;\n }\n }(), function() {\n var _1, H1 = o1(S1);\n if (i0) {\n var j1 = o1(this).constructor;\n _1 = Reflect.construct(H1, arguments, j1);\n } else\n _1 = H1.apply(this, arguments);\n return U(this, _1);\n });\n function l0(_1) {\n var H1;\n return function(j1, s0) {\n if (!(j1 instanceof s0))\n throw new TypeError("Cannot call a class as a function");\n }(this, l0), (H1 = m0.call(this, _1)).onCheck = H1.onCheck.bind(e1(H1)), H1.onCheckboxKeyPress = H1.onCheckboxKeyPress.bind(e1(H1)), H1.onCheckboxKeyUp = H1.onCheckboxKeyUp.bind(e1(H1)), H1.onClick = H1.onClick.bind(e1(H1)), H1.onExpand = H1.onExpand.bind(e1(H1)), H1;\n }\n return v1 = l0, (k1 = [{ key: "onCheck", value: function() {\n var _1 = this.props, H1 = _1.value;\n (0, _1.onCheck)({ value: H1, checked: this.getCheckState({ toggle: !0 }) });\n } }, { key: "onCheckboxKeyPress", value: function(_1) {\n _1.which === 32 && _1.preventDefault();\n } }, { key: "onCheckboxKeyUp", value: function(_1) {\n var H1 = _1.keyCode;\n [13, 32].includes(H1) && this.onCheck();\n } }, { key: "onClick", value: function() {\n var _1 = this.props, H1 = _1.expandOnClick, j1 = _1.isParent, s0 = _1.value, M0 = _1.onClick;\n j1 && H1 && this.onExpand(), M0({ value: s0, checked: this.getCheckState({ toggle: !1 }) });\n } }, { key: "onExpand", value: function() {\n var _1 = this.props, H1 = _1.expanded, j1 = _1.value;\n (0, _1.onExpand)({ value: j1, expanded: !H1 });\n } }, { key: "getCheckState", value: function(_1) {\n var H1 = _1.toggle, j1 = this.props, s0 = j1.checked, M0 = j1.optimisticToggle;\n return !(s0 !== 0 || !H1) || s0 === 1 && !H1 || s0 === 2 && M0;\n } }, { key: "renderCollapseButton", value: function() {\n var _1 = this.props, H1 = _1.expandDisabled, j1 = _1.isLeaf, s0 = _1.lang;\n return j1 ? g().createElement("span", { className: "rct-collapse" }, g().createElement("span", { className: "rct-icon" })) : g().createElement(E, { className: "rct-collapse rct-collapse-btn", disabled: H1, title: s0.toggle, onClick: this.onExpand }, this.renderCollapseIcon());\n } }, { key: "renderCollapseIcon", value: function() {\n var _1 = this.props, H1 = _1.expanded, j1 = _1.icons, s0 = j1.expandClose, M0 = j1.expandOpen;\n return H1 ? M0 : s0;\n } }, { key: "renderCheckboxIcon", value: function() {\n var _1 = this.props, H1 = _1.checked, j1 = _1.icons, s0 = j1.uncheck, M0 = j1.check, I0 = j1.halfCheck;\n return H1 === 0 ? s0 : H1 === 1 ? M0 : I0;\n } }, { key: "renderNodeIcon", value: function() {\n var _1 = this.props, H1 = _1.expanded, j1 = _1.icon, s0 = _1.icons, M0 = s0.leaf, I0 = s0.parentClose, re = s0.parentOpen, R1 = _1.isLeaf;\n return j1 !== null ? j1 : R1 ? M0 : H1 ? re : I0;\n } }, { key: "renderBareLabel", value: function(_1) {\n var H1 = this.props, j1 = H1.onClick, s0 = H1.title, M0 = j1 !== null;\n return g().createElement("span", { className: "rct-bare-label", title: s0 }, M0 ? g().createElement("span", { className: "rct-node-clickable", onClick: this.onClick, onKeyPress: this.onClick, role: "button", tabIndex: 0 }, _1) : _1);\n } }, { key: "renderCheckboxLabel", value: function(_1) {\n var H1 = this.props, j1 = H1.checked, s0 = H1.disabled, M0 = H1.title, I0 = H1.treeId, re = H1.value, R1 = H1.onClick !== null, r0 = "".concat(I0, "-").concat(String(re).split(" ").join("_")), d0 = [g().createElement("label", { key: 0, htmlFor: r0, title: M0 }, g().createElement(F, { checked: j1 === 1, disabled: s0, id: r0, indeterminate: j1 === 2, onClick: this.onCheck, onChange: function() {\n } }), g().createElement("span", { "aria-checked": j1 === 1, "aria-disabled": s0, className: "rct-checkbox", role: "checkbox", tabIndex: 0, onKeyPress: this.onCheckboxKeyPress, onKeyUp: this.onCheckboxKeyUp }, this.renderCheckboxIcon()), R1 ? null : _1)];\n return R1 && d0.push(g().createElement("span", { key: 1, className: "rct-node-clickable", onClick: this.onClick, onKeyPress: this.onClick, role: "link", tabIndex: 0 }, _1)), d0;\n } }, { key: "renderLabel", value: function() {\n var _1 = this.props, H1 = _1.label, j1 = _1.showCheckbox, s0 = [_1.showNodeIcon ? g().createElement("span", { key: 0, className: "rct-node-icon" }, this.renderNodeIcon()) : null, g().createElement("span", { key: 1, className: "rct-title" }, H1)];\n return j1 ? this.renderCheckboxLabel(s0) : this.renderBareLabel(s0);\n } }, { key: "renderChildren", value: function() {\n return this.props.expanded ? this.props.children : null;\n } }, { key: "render", value: function() {\n var _1 = this.props, H1 = _1.className, j1 = _1.disabled, s0 = _1.expanded, M0 = _1.isLeaf, I0 = l()({ "rct-node": !0, "rct-node-leaf": M0, "rct-node-parent": !M0, "rct-node-expanded": !M0 && s0, "rct-node-collapsed": !M0 && !s0, "rct-disabled": j1 }, H1);\n return g().createElement("li", { className: I0 }, g().createElement("span", { className: "rct-text" }, this.renderCollapseButton(), this.renderLabel()), this.renderChildren());\n } }]) && t1(v1.prototype, k1), Object.defineProperty(v1, "prototype", { writable: !1 }), l0;\n }(g().PureComponent);\n u1(M1, "propTypes", { checked: M().number.isRequired, disabled: M().bool.isRequired, expandDisabled: M().bool.isRequired, expanded: M().bool.isRequired, icons: V.isRequired, isLeaf: M().bool.isRequired, isParent: M().bool.isRequired, label: M().node.isRequired, lang: Q.isRequired, optimisticToggle: M().bool.isRequired, showNodeIcon: M().bool.isRequired, treeId: M().string.isRequired, value: M().oneOfType([M().string, M().number]).isRequired, onCheck: M().func.isRequired, onExpand: M().func.isRequired, children: M().node, className: M().string, expandOnClick: M().bool, icon: M().node, showCheckbox: M().bool, title: M().string, onClick: M().func }), u1(M1, "defaultProps", { children: null, className: null, expandOnClick: !1, icon: null, showCheckbox: !0, title: null, onClick: function() {\n } });\n const A1 = M1, l1 = M().oneOfType([M().arrayOf(M().string), M().arrayOf(M().number)]);\n function b1(q1, v1) {\n var k1 = Object.keys(q1);\n if (Object.getOwnPropertySymbols) {\n var S1 = Object.getOwnPropertySymbols(q1);\n v1 && (S1 = S1.filter(function(i0) {\n return Object.getOwnPropertyDescriptor(q1, i0).enumerable;\n })), k1.push.apply(k1, S1);\n }\n return k1;\n }\n function h1(q1) {\n for (var v1 = 1; v1 < arguments.length; v1++) {\n var k1 = arguments[v1] != null ? arguments[v1] : {};\n v1 % 2 ? b1(Object(k1), !0).forEach(function(S1) {\n z1(q1, S1, k1[S1]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(q1, Object.getOwnPropertyDescriptors(k1)) : b1(Object(k1)).forEach(function(S1) {\n Object.defineProperty(q1, S1, Object.getOwnPropertyDescriptor(k1, S1));\n });\n }\n return q1;\n }\n function z1(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n var O1 = { label: M().node.isRequired, value: M().oneOfType([M().string, M().number]).isRequired, disabled: M().bool, icon: M().node, showCheckbox: M().bool, title: M().string };\n const m1 = M().oneOfType([M().shape(O1), M().shape(h1(h1({}, O1), {}, { children: M().arrayOf(O1).isRequired }))]);\n function L1(q1) {\n return L1 = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(v1) {\n return typeof v1;\n } : function(v1) {\n return v1 && typeof Symbol == "function" && v1.constructor === Symbol && v1 !== Symbol.prototype ? "symbol" : typeof v1;\n }, L1(q1);\n }\n function y1(q1, v1) {\n var k1 = Object.keys(q1);\n if (Object.getOwnPropertySymbols) {\n var S1 = Object.getOwnPropertySymbols(q1);\n v1 && (S1 = S1.filter(function(i0) {\n return Object.getOwnPropertyDescriptor(q1, i0).enumerable;\n })), k1.push.apply(k1, S1);\n }\n return k1;\n }\n function B1(q1) {\n for (var v1 = 1; v1 < arguments.length; v1++) {\n var k1 = arguments[v1] != null ? arguments[v1] : {};\n v1 % 2 ? y1(Object(k1), !0).forEach(function(S1) {\n K1(q1, S1, k1[S1]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(q1, Object.getOwnPropertyDescriptors(k1)) : y1(Object(k1)).forEach(function(S1) {\n Object.defineProperty(q1, S1, Object.getOwnPropertyDescriptor(k1, S1));\n });\n }\n return q1;\n }\n function T1(q1, v1) {\n for (var k1 = 0; k1 < v1.length; k1++) {\n var S1 = v1[k1];\n S1.enumerable = S1.enumerable || !1, S1.configurable = !0, "value" in S1 && (S1.writable = !0), Object.defineProperty(q1, S1.key, S1);\n }\n }\n function F1(q1, v1) {\n return F1 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(k1, S1) {\n return k1.__proto__ = S1, k1;\n }, F1(q1, v1);\n }\n function X1(q1, v1) {\n if (v1 && (L1(v1) === "object" || typeof v1 == "function"))\n return v1;\n if (v1 !== void 0)\n throw new TypeError("Derived constructors may only return object or undefined");\n return G1(q1);\n }\n function G1(q1) {\n if (q1 === void 0)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return q1;\n }\n function Q1(q1) {\n return Q1 = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(v1) {\n return v1.__proto__ || Object.getPrototypeOf(v1);\n }, Q1(q1);\n }\n function K1(q1, v1, k1) {\n return v1 in q1 ? Object.defineProperty(q1, v1, { value: k1, enumerable: !0, configurable: !0, writable: !0 }) : q1[v1] = k1, q1;\n }\n var n0 = function(q1) {\n (function(H1, j1) {\n if (typeof j1 != "function" && j1 !== null)\n throw new TypeError("Super expression must either be null or a function");\n H1.prototype = Object.create(j1 && j1.prototype, { constructor: { value: H1, writable: !0, configurable: !0 } }), Object.defineProperty(H1, "prototype", { writable: !1 }), j1 && F1(H1, j1);\n })(_1, q1);\n var v1, k1, S1, i0, m0, l0 = (i0 = _1, m0 = function() {\n if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)\n return !1;\n if (typeof Proxy == "function")\n return !0;\n try {\n return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {\n })), !0;\n } catch {\n return !1;\n }\n }(), function() {\n var H1, j1 = Q1(i0);\n if (m0) {\n var s0 = Q1(this).constructor;\n H1 = Reflect.construct(j1, arguments, s0);\n } else\n H1 = j1.apply(this, arguments);\n return X1(this, H1);\n });\n function _1(H1) {\n var j1;\n (function(M0, I0) {\n if (!(M0 instanceof I0))\n throw new TypeError("Cannot call a class as a function");\n })(this, _1), j1 = l0.call(this, H1);\n var s0 = new K(H1);\n return s0.flattenNodes(H1.nodes), s0.deserializeLists({ checked: H1.checked, expanded: H1.expanded }), j1.state = { id: H1.id || "rct-".concat(h()), model: s0, prevProps: H1 }, j1.onCheck = j1.onCheck.bind(G1(j1)), j1.onExpand = j1.onExpand.bind(G1(j1)), j1.onNodeClick = j1.onNodeClick.bind(G1(j1)), j1.onExpandAll = j1.onExpandAll.bind(G1(j1)), j1.onCollapseAll = j1.onCollapseAll.bind(G1(j1)), j1.combineMemorized = u()(function(M0, I0) {\n return B1(B1({}, M0), I0);\n }).bind(G1(j1)), j1;\n }\n return v1 = _1, k1 = [{ key: "onCheck", value: function(H1) {\n var j1 = this.props, s0 = j1.checkModel, M0 = j1.noCascade, I0 = j1.onCheck, re = this.state.model.clone(), R1 = re.getNode(H1.value);\n re.toggleChecked(H1, H1.checked, s0, M0), I0(re.serializeList("checked"), B1(B1({}, R1), H1));\n } }, { key: "onExpand", value: function(H1) {\n var j1 = this.props.onExpand, s0 = this.state.model.clone(), M0 = s0.getNode(H1.value);\n s0.toggleNode(H1.value, "expanded", H1.expanded), j1(s0.serializeList("expanded"), B1(B1({}, M0), H1));\n } }, { key: "onNodeClick", value: function(H1) {\n (0, this.props.onClick)(B1(B1({}, this.state.model.getNode(H1.value)), H1));\n } }, { key: "onExpandAll", value: function() {\n this.expandAllNodes();\n } }, { key: "onCollapseAll", value: function() {\n this.expandAllNodes(!1);\n } }, { key: "expandAllNodes", value: function() {\n var H1 = !(arguments.length > 0 && arguments[0] !== void 0) || arguments[0], j1 = this.props.onExpand;\n j1(this.state.model.clone().expandAllNodes(H1).serializeList("expanded"));\n } }, { key: "determineShallowCheckState", value: function(H1, j1) {\n var s0 = this.state.model.getNode(H1.value);\n return s0.isLeaf || j1 || H1.children.length === 0 ? s0.checked ? 1 : 0 : this.isEveryChildChecked(H1) ? 1 : this.isSomeChildChecked(H1) ? 2 : 0;\n } }, { key: "isEveryChildChecked", value: function(H1) {\n var j1 = this;\n return H1.children.every(function(s0) {\n return j1.state.model.getNode(s0.value).checkState === 1;\n });\n } }, { key: "isSomeChildChecked", value: function(H1) {\n var j1 = this;\n return H1.children.some(function(s0) {\n return j1.state.model.getNode(s0.value).checkState > 0;\n });\n } }, { key: "renderTreeNodes", value: function(H1) {\n var j1 = this, s0 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, M0 = this.props, I0 = M0.expandDisabled, re = M0.expandOnClick, R1 = M0.icons, r0 = M0.lang, d0 = M0.noCascade, q0 = M0.onClick, D0 = M0.onlyLeafCheckboxes, G0 = M0.optimisticToggle, V0 = M0.showNodeTitle, W0 = M0.showNodeIcon, ae = this.state, ee = ae.id, se = ae.model, Me = _1.defaultProps.icons, At = H1.map(function(Ne) {\n var _e = Ne.value, ut = se.getNode(Ne.value), pr = ut.isParent ? j1.renderTreeNodes(Ne.children, Ne) : null;\n ut.checkState = j1.determineShallowCheckState(Ne, d0);\n var wr = D0 ? ut.isLeaf : ut.showCheckbox;\n return !s0.value || se.getNode(s0.value).expanded ? g().createElement(A1, { key: _e, checked: ut.checkState, className: Ne.className, disabled: ut.disabled, expandDisabled: I0, expandOnClick: re, expanded: ut.expanded, icon: Ne.icon, icons: j1.combineMemorized(Me, R1), label: Ne.label, lang: r0, optimisticToggle: G0, isLeaf: ut.isLeaf, isParent: ut.isParent, showCheckbox: wr, showNodeIcon: W0, title: V0 ? Ne.title || Ne.label : Ne.title, treeId: ee, value: Ne.value, onCheck: j1.onCheck, onClick: q0 && j1.onNodeClick, onExpand: j1.onExpand }, pr) : null;\n });\n return g().createElement("ol", null, At);\n } }, { key: "renderExpandAll", value: function() {\n var H1 = this.props, j1 = H1.icons, s0 = j1.expandAll, M0 = j1.collapseAll, I0 = H1.lang;\n return H1.showExpandAll ? g().createElement("div", { className: "rct-options" }, g().createElement(E, { className: "rct-option rct-option-expand-all", title: I0.expandAll, onClick: this.onExpandAll }, s0), g().createElement(E, { className: "rct-option rct-option-collapse-all", title: I0.collapseAll, onClick: this.onCollapseAll }, M0)) : null;\n } }, { key: "renderHiddenInput", value: function() {\n var H1 = this.props, j1 = H1.name, s0 = H1.nameAsArray;\n return j1 === void 0 ? null : s0 ? this.renderArrayHiddenInput() : this.renderJoinedHiddenInput();\n } }, { key: "renderArrayHiddenInput", value: function() {\n var H1 = this.props, j1 = H1.checked, s0 = H1.name;\n return j1.map(function(M0) {\n var I0 = "".concat(s0, "[]");\n return g().createElement("input", { key: M0, name: I0, type: "hidden", value: M0 });\n });\n } }, { key: "renderJoinedHiddenInput", value: function() {\n var H1 = this.props, j1 = H1.checked, s0 = H1.name, M0 = j1.join(",");\n return g().createElement("input", { name: s0, type: "hidden", value: M0 });\n } }, { key: "render", value: function() {\n var H1, j1 = this.props, s0 = j1.direction, M0 = j1.disabled, I0 = j1.iconsClass, re = j1.nodes, R1 = j1.nativeCheckboxes, r0 = this.state.id, d0 = this.renderTreeNodes(re), q0 = l()((K1(H1 = { "react-checkbox-tree": !0, "rct-disabled": M0 }, "rct-icons-".concat(I0), !0), K1(H1, "rct-native-display", R1), K1(H1, "rct-direction-rtl", s0 === "rtl"), H1));\n return g().createElement("div", { className: q0, id: r0 }, this.renderExpandAll(), this.renderHiddenInput(), d0);\n } }], S1 = [{ key: "getDerivedStateFromProps", value: function(H1, j1) {\n var s0 = j1.model, M0 = j1.prevProps, I0 = H1.disabled, re = H1.id, R1 = H1.nodes, r0 = B1(B1({}, j1), {}, { prevProps: H1 });\n return s0.setProps(H1), p()(M0.nodes, R1) && M0.disabled === I0 || (s0.reset(), s0.flattenNodes(R1)), re !== null && (r0 = B1(B1({}, r0), {}, { id: re })), s0.deserializeLists({ checked: H1.checked, expanded: H1.expanded }), r0;\n } }], k1 && T1(v1.prototype, k1), S1 && T1(v1, S1), Object.defineProperty(v1, "prototype", { writable: !1 }), _1;\n }(g().Component);\n function u0(q1) {\n return function(v1) {\n if (Array.isArray(v1))\n return c0(v1);\n }(q1) || function(v1) {\n if (typeof Symbol < "u" && v1[Symbol.iterator] != null || v1["@@iterator"] != null)\n return Array.from(v1);\n }(q1) || function(v1, k1) {\n if (v1) {\n if (typeof v1 == "string")\n return c0(v1, k1);\n var S1 = Object.prototype.toString.call(v1).slice(8, -1);\n return S1 === "Object" && v1.constructor && (S1 = v1.constructor.name), S1 === "Map" || S1 === "Set" ? Array.from(v1) : S1 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(S1) ? c0(v1, k1) : void 0;\n }\n }(q1) || function() {\n throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);\n }();\n }\n function c0(q1, v1) {\n (v1 == null || v1 > q1.length) && (v1 = q1.length);\n for (var k1 = 0, S1 = new Array(v1); k1 < v1; k1++)\n S1[k1] = q1[k1];\n return S1;\n }\n function C0(q1, v1) {\n var k1 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;\n if (k1 > v1)\n return [];\n var S1 = [];\n return q1.forEach(function(i0) {\n i0.children && (S1 = [].concat(u0(S1), [i0.value], u0(C0(i0.children, v1, k1 + 1))));\n }), S1;\n }\n K1(n0, "propTypes", { nodes: M().arrayOf(m1).isRequired, checkModel: M().oneOf([L.LEAF, L.ALL]), checked: l1, direction: M().string, disabled: M().bool, expandDisabled: M().bool, expandOnClick: M().bool, expanded: l1, icons: V, iconsClass: M().string, id: M().string, lang: Q, name: M().string, nameAsArray: M().bool, nativeCheckboxes: M().bool, noCascade: M().bool, onlyLeafCheckboxes: M().bool, optimisticToggle: M().bool, showExpandAll: M().bool, showNodeIcon: M().bool, showNodeTitle: M().bool, onCheck: M().func, onClick: M().func, onExpand: M().func }), K1(n0, "defaultProps", { checkModel: L.LEAF, checked: [], direction: "ltr", disabled: !1, expandDisabled: !1, expandOnClick: !1, expanded: [], icons: { check: g().createElement("span", { className: "rct-icon rct-icon-check" }), uncheck: g().createElement("span", { className: "rct-icon rct-icon-uncheck" }), halfCheck: g().createElement("span", { className: "rct-icon rct-icon-half-check" }), expandClose: g().createElement("span", { className: "rct-icon rct-icon-expand-close" }), expandOpen: g().createElement("span", { className: "rct-icon rct-icon-expand-open" }), expandAll: g().createElement("span", { className: "rct-icon rct-icon-expand-all" }), collapseAll: g().createElement("span", { className: "rct-icon rct-icon-collapse-all" }), parentClose: g().createElement("span", { className: "rct-icon rct-icon-parent-close" }), parentOpen: g().createElement("span", { className: "rct-icon rct-icon-parent-open" }), leaf: g().createElement("span", { className: "rct-icon rct-icon-leaf" }) }, iconsClass: "fa4", id: null, lang: { collapseAll: "Collapse all", expandAll: "Expand all", toggle: "Toggle" }, name: void 0, nameAsArray: !1, nativeCheckboxes: !1, noCascade: !1, onlyLeafCheckboxes: !1, optimisticToggle: !0, showExpandAll: !1, showNodeIcon: !0, showNodeTitle: !1, onCheck: function() {\n }, onClick: null, onExpand: function() {\n } });\n const y0 = n0;\n })(), a;\n })());\n})(cz);\nvar fF = cz.exports;\nconst gF = /* @__PURE__ */ $t(fF);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${e.typography.t14};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh22};\n color: ${e.colors.textIcon.textPrimary};\n padding-left: 0.5rem;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n padding: 0 ${e.sp8};\n `\n);\nconst zF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n > label {\n pointer-events: none;\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 200px;\n justify-content: space-between;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n min-width: 200px;\n width: 150px;\n gap: 8px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `\n);\nconst CF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n cursor: pointer;\n .icon-system {\n color: ${e.textIcon.textPrimary};\n }\n `\n), OF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n cursor: pointer;\n .icon-system {\n color: ${e.textIcon.textPrimary};\n }\n `\n), mF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, $hideCheck: t, isSelected: r, $expandIconName: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n li {\n list-style-type: none;\n }\n\n label > input {\n display: none;\n }\n .rct-title {\n width: 100%;\n }\n .rct-text .rct-checkbox {\n margin-right: 4px;\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: none;\n `}\n }\n .rct-text > .rct-collapse-btn {\n border: none;\n background: none;\n }\n .rct-node-expanded {\n padding-left: ${sa.sp8};\n }\n .rct-node-icon .icon-system {\n color: ${e.colors.textIcon.textPrimary};\n }\n .rct-node-clickable:focus {\n outline: 0;\n background: none;\n }\n .rct-text {\n display: flex !important;\n align-items: center !important;\n }\n .rct-node-collapsed {\n padding-left: ${sa.sp8};\n }\n /* .rct-node .rct-text label {\n display: flex !important;\n justify-content: space-between;\n align-items: center !important;\n width: 100%;\n } */\n & label {\n font-size: ${e.typography.t12};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh20};\n color: ${e.colors.textIcon.textPrimary};\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .rct-node-leaf {\n padding-left: ${sa.sp8} !important;\n }\n .rct-text {\n padding: 2px;\n color: ${e.colors.textIcon.textPrimary};\n }\n\n .rct-node-leaf .rct-text {\n background: unset;\n }\n .react-checkbox-tree label:hover {\n background: transparent;\n }\n .rct-node-parent .rct-node-clickable {\n align-items: center;\n gap: 8px;\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-left: 0px;\n `}\n ${!n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-left: 8px;\n `}\n &:hover,\n :focus {\n background: unset;\n }\n .rct-text {\n background: unset;\n }\n }\n `\n), vF = (e) => {\n const {\n iconName: t,\n checked: r,\n nodes: n,\n expanded: o,\n onCheck: i,\n onClick: a,\n onExpand: s,\n hideCheck: l = !0,\n showNodeIcon: c,\n expandIconName: p,\n expandIcon: d,\n expandOnClick: u\n } = e;\n let h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const b = react__WEBPACK_IMPORTED_MODULE_0___default().useCallback(\n ({ checked: f = !1, isPartlyOnly: O = !1 }) => /* @__PURE__ */ A(zF, { className: "rct-checkbox", children: /* @__PURE__ */ A(\n vn,\n {\n isRequired: !0,\n label: "",\n readOnly: !0,\n checked: f,\n isPartlyOnly: O\n }\n ) }),\n []\n );\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var f;\n n == null || n.map((O, m) => {\n var v;\n (v = document.getElementsByClassName("rct-collapse-btn")[m]) == null || v.removeAttribute("title");\n }), console.log("CheckBoxTreeRef", (f = h == null ? void 0 : h.current) == null ? void 0 : f.onNo);\n }, [n]);\n const [M, C] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), g = (f) => {\n C(!M);\n };\n return /* @__PURE__ */ A(\n mF,\n {\n $hideCheck: l,\n $expandIconName: p,\n isSelected: M,\n children: /* @__PURE__ */ A(\n gF,\n {\n ref: h,\n nodes: n,\n expandOnClick: u,\n checked: r,\n expanded: o,\n onCheck: i,\n onClick: (f) => {\n g(), a(f);\n },\n onExpand: s,\n showNodeIcon: c,\n icons: {\n expandOpen: d ? /* @__PURE__ */ A(CF, { children: /* @__PURE__ */ A(\n f0,\n {\n color: "#000",\n name: p || "ChevronDown",\n size: "xxs"\n }\n ) }) : null,\n expandClose: d ? /* @__PURE__ */ A(OF, { children: /* @__PURE__ */ A(\n f0,\n {\n color: "#000",\n name: p || "ChevronRight",\n size: "xxs"\n }\n ) }) : null,\n check: /* @__PURE__ */ A(b, { checked: !0 }),\n uncheck: /* @__PURE__ */ A(b, {}),\n halfCheck: /* @__PURE__ */ A(b, { isPartlyOnly: !0, checked: !0 })\n }\n }\n )\n }\n );\n};\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n /* max-width: 378px; */\n min-height: 350px;\n height: 276px;\n width: 100%;\n background-color: ${({ theme: e }) => e.colors.white};\n padding: ${({ theme: e }) => e.spacings.sp8} 0;\n`;\nconst yF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .rct-node-clickable {\n display: flex;\n }\n .rct-text {\n padding: 0;\n }\n .rct-node {\n .rct-node-clickable {\n cursor: pointer;\n &:focus {\n background: ${e.colors.backgrounds.bgSelected};\n }\n &:hover {\n background: ${e.colors.backgrounds.bgHoverPrimary};\n }\n }\n }\n\n svg {\n height: 13px;\n }\n .rct-title {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: ${e.typography.t12};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh17};\n color: ${e.colors.textIcon.textPrimary};\n }\n label {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: ${e.typography.t12};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh17};\n color: ${e.colors.textIcon.textPrimary};\n }\n .react-checkbox-tree ol ol {\n padding-left: 15px;\n }\n .rct-node-parent .rct-node-clickable {\n padding: 3.5px;\n }\n .rct-node-icon > div {\n padding: 0;\n }\n .rct-node .rct-node-parent .rct-node-expanded {\n padding-left: 0px;\n }\n .rct-node-expanded {\n padding-left: 0px;\n }\n .rct-node-collapsed {\n padding-left: 0px;\n }\n ol li {\n padding: 4px 0;\n }\n .rct-collapse,\n .rct-checkbox,\n .rct-node-icon {\n padding: 0;\n }\n `\n);\nfunction LF(e) {\n const { nodes: t, selectedOptions: r, expandAll: n } = e, [o, i] = react__WEBPACK_IMPORTED_MODULE_0___default().useState([]), a = (s) => {\n let l = [];\n return s == null || s.forEach(({ value: c, children: p }) => {\n l = [...l, c, ...a(p)];\n }), l;\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i(n ? a(t) : []);\n }, [n]), /* @__PURE__ */ A(yF, { children: /* @__PURE__ */ A(\n vF,\n {\n nodes: t,\n expanded: o,\n onClick: (s) => {\n r && r(s);\n },\n onExpand: i,\n expandAll: n,\n ...e\n }\n ) });\n}\nfunction Rn(e) {\n const { nestedList: t } = e;\n return /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: t ? /* @__PURE__ */ A(GP, { children: /* @__PURE__ */ A(LF, { ...e }) }) : /* @__PURE__ */ A(QP, { children: /* @__PURE__ */ A(MF, { ...e }) }) });\n}\nfunction pz(e, t) {\n const [r, n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const o = setTimeout(() => n(e), t || 500);\n return () => {\n clearTimeout(o);\n };\n }, [e, t]), r;\n}\nconst Xu = (e) => {\n let t = (e == null ? void 0 : e.data) ?? [], r = e == null ? void 0 : e.isSearchable;\n const [n, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t), [i, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), [s, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [c, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), d = pz(i, 500), [u, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\n e == null ? void 0 : e.enableSelectAll\n ), [b, M] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), C = (O) => {\n a(O), l(!s), e == null || e.setSearchValue(O), (O == null ? void 0 : O.length) == 0 ? M(!1) : M(!0);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n e != null && e.enableSelectAll && h(!b);\n }, [b, e == null ? void 0 : e.enableSelectAll]);\n const g = () => {\n let O = t == null ? void 0 : t.filter(\n (m) => {\n var v, y, z;\n return (m == null ? void 0 : m.countryList) != null ? (y = (v = m == null ? void 0 : m.countryList) == null ? void 0 : v.countryName) == null ? void 0 : y.toLowerCase().includes(d.toLowerCase()) : (m == null ? void 0 : m.timeZone) != null ? (z = m == null ? void 0 : m.timeZone) == null ? void 0 : z.zone.toLowerCase().includes(d.toLowerCase()) : m == null ? void 0 : m.label.toLowerCase().includes(d.toLowerCase());\n }\n );\n o(O);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n g();\n }, [d]);\n const f = (O) => {\n (typeof O == "object" && Object.keys(O).length || O.length > 0) && (p(O), e.selectedValue && e.selectedValue(O)), (O == null ? void 0 : O.length) == 0 && (p(""), e.selectedValue && e.selectedValue([]));\n };\n return /* @__PURE__ */ c1(UP, { children: [\n r && /* @__PURE__ */ A(\n yc,\n {\n getValue: C,\n value: i,\n inputType: "base",\n placeholder: "Search"\n }\n ),\n /* @__PURE__ */ A(\n Rn,\n {\n ...e,\n defaultValues: e == null ? void 0 : e.values,\n selectedLists: c,\n data: n,\n selectedOptions: f,\n showSelectedList: e == null ? void 0 : e.showSelectedList,\n enableSelectAll: u\n }\n )\n ] });\n}, wF = 4, qF = {\n xs: 14,\n sm: 24,\n md: 40,\n lg: 48,\n xl: 64\n};\nfunction xF(e, t, r) {\n return r || e[t];\n}\nfunction RF(e) {\n const t = xF(qF, e), r = wF, n = (t - r) / 2, o = n * 2 * Math.PI;\n return [t, r, n, o];\n}\nconst BF = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`, WF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().svg(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.info};\n stroke: currentColor;\n transform: rotate(-90deg);\n fill: none;\n `\n), EF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().circle(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.backgrounds.bgInformationalPrimary};\n animation: ${BF} 1s linear infinite;\n transform-origin: center;\n `\n), SF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().circle(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.border.borderTertiary};\n `\n), kF = (e, t) => {\n const { progress: r = 0, size: n = "md", ...o } = e, [i, a, s, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => RF(n),\n [n]\n ), c = l - l * 25 / 100;\n return /* @__PURE__ */ c1(\n WF,\n {\n ...o,\n width: i,\n height: i,\n viewBox: `0 0 ${i} ${i}`,\n ref: t,\n children: [\n /* @__PURE__ */ A(\n SF,\n {\n cx: i / 2,\n cy: i / 2,\n r: s,\n strokeWidth: a,\n strokeDasharray: l,\n strokeDashoffset: 0\n }\n ),\n /* @__PURE__ */ A(\n EF,\n {\n cx: i / 2,\n cy: i / 2,\n r: s,\n strokeWidth: a,\n strokeDasharray: l,\n strokeDashoffset: c\n }\n )\n ]\n }\n );\n}, NF = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(kF), j6 = {\n CIRCLE: "circle",\n LINEAR: "linear"\n}, q8 = {\n CYAN: "cyan",\n BLUE: "blue"\n}, IF = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% {\n width: 0;\n }\n 100% {\n width: 100%;\n }\n`, TF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, progress: t, $backgroundColor: r }) => {\n let n;\n switch (r) {\n case q8.BLUE:\n n = e.backgrounds.bgInformationalPrimary;\n break;\n case q8.CYAN:\n default:\n n = e.backgrounds.bgInformationalPrimary;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n width: 100%;\n min-width: 100px;\n height: 4px;\n background-color: ${e.border.borderTertiary};\n border-radius: 20px;\n overflow: hidden;\n\n &:after {\n content: \'\';\n position: absolute;\n height: 100%;\n width: ${t}%;\n background-color: ${n};\n border-radius: 20px;\n transition: width 0.2s linear;\n animation: ${IF} 2s linear infinite;\n }\n `;\n }\n);\nfunction DF(e, t) {\n const {\n progress: r = 0,\n backgroundColor: n = q8.CYAN,\n ...o\n } = e;\n return /* @__PURE__ */ A(\n TF,\n {\n ref: t,\n progress: 5,\n $backgroundColor: n,\n ...o\n }\n );\n}\nconst HF = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(DF);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 970px;\n`;\nconst PF = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n`, VF = (e, t) => {\n const { progress: r, type: n = j6.CIRCLE } = e;\n return /* @__PURE__ */ A(PF, { ref: t, children: (() => {\n switch (n) {\n case j6.LINEAR:\n return /* @__PURE__ */ A(HF, { progress: r });\n case j6.CIRCLE:\n default:\n return /* @__PURE__ */ A(NF, { progress: r });\n }\n })() });\n}, dz = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(VF), FF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { typography: e, lineHeight: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${I7} {\n font-size: ${e.t12};\n line-height: ${t.lh20};\n }\n\n `\n), x8 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.grey};\n display: flex;\n width: 100%;\n align-items: center;\n box-sizing: border-box;\n gap: 8px;\n\n svg {\n height: 100%;\n width: 14px;\n }\n\n \n `\n), UF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().strong(\n ({ theme: { colors: e, fontWeight: t, spacings: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n color: ${e.grey};\n display: block;\n font-weight: ${t.regular};\n margin: 0 ${r.sp4} ${r.sp8};\n `\n), fn = (e) => {\n const {\n data: t,\n selectedOptions: r,\n isMulti: n,\n isFilter: o,\n ApplyFilter: i,\n placeholder: a,\n label: s,\n labelType: l,\n dropdownBodyWidth: c,\n position: p,\n getSearchValue: d,\n isSearchable: u,\n isBodyGenerated: h,\n defaultValues: b,\n autoSearch: M,\n isRequired: C,\n iconRight: g,\n showSelectedList: f,\n isHideClearBtn: O,\n handleClearFn: m,\n isLoading: v,\n isTooltip: y\n } = e, z = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [N, W] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [T, x] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), [E, L] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), w = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(), [q, S] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t), [B, I] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0), P = (_, Y) => {\n let D, H = [];\n if (b != null)\n return _ != null && _.length ? (Y == null || Y.filter((G) => {\n _ == null || _.map((J) => {\n G.label == (J == null ? void 0 : J.label) && G.value == (J == null ? void 0 : J.value) && H.push(!0);\n });\n }), H.length == (_ == null ? void 0 : _.length)) : Y != null && Y.timeZone ? (Y == null || Y.filter((G) => {\n G.timeZone.zone == _.timeZone.zone && G.value == _.value && (D = !0);\n }), D) : (Y == null || Y.filter((G) => {\n G.label == _.label && G.value == _.value && (D = !0);\n }), D);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var _, Y, D;\n if (P(b, t))\n if (b != null && b.length) {\n let H = [];\n b == null || b.map((G) => {\n H.push(G.label);\n }), x(H), L(b);\n } else if ((_ = b == null ? void 0 : b.timeZone) != null && _.zone) {\n let H = `${(Y = b == null ? void 0 : b.timeZone) == null ? void 0 : Y.zone}`;\n L(b), x(H);\n } else if (b != null && b.countryList) {\n let H = `${(D = b == null ? void 0 : b.countryList) == null ? void 0 : D.countryCode}`;\n L(b), x(H);\n } else\n L(b), x(b == null ? void 0 : b.label);\n JSON.stringify(b) === "{}" && (L({}), x("")), (b == null ? void 0 : b.length) == 0 && (L([]), x(""));\n }, [b, v, t]);\n const k = () => {\n W(!N);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n b && M && (S(t), I(!0));\n }, [b]);\n const K = (_) => {\n let Y = _.target.value;\n if (I(!1), Y.length > 0) {\n x(Y);\n let D = [];\n t == null || t.filter((H) => {\n H.label.toString().toLowerCase().includes(Y) && D.push(H);\n }), S(D);\n } else\n x(""), L([]), S(t);\n W(!0);\n };\n fc(z, N, k), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n !n && T && W(!1);\n }, [n, T]);\n const $ = (_) => {\n var Y;\n if (I(!0), _) {\n let D = [];\n _.length && (_ == null || _.map((H) => {\n D.push(H.label);\n }), x(D), L(_), S([_]), r && r(_));\n }\n _ != null && _.countryList && (x((Y = _.countryList) == null ? void 0 : Y.countryCode), r && r(_)), _ != null && _.zone && (x(_.zone), r && r(_)), _ != null && _.label && (x(_.label), L(_), S([_]), r && r(_)), (_ == null ? void 0 : _.length) == 0 && (x(""), L([]), r && r([]));\n }, j = (_) => {\n var Y;\n if (_ != null && _.countryList && (x(_.countryCode), r && r(_)), _ != null && _.zone && (x(_.zone), r && r(_)), _ != null && _.label && (x(_.label), r && r(_.label)), _) {\n let D = [];\n _.length && (_ == null || _.map((H) => {\n D.push(H.label);\n }), x(D), r && r(D));\n }\n _ && L(_), ((Y = Object.keys(_)) == null ? void 0 : Y.length) === 0 && (x(""), L(_)), o && (L(_), r && r(_)), i && i(_);\n }, r1 = (_) => {\n d && d(_);\n }, a1 = () => {\n m && m(), x(""), S(t), n ? (L([]), r && r([]), i && i([])) : (L({}), r && r({}), i && i({})), W(!1);\n };\n return /* @__PURE__ */ A(HP, { ref: w, children: /* @__PURE__ */ A(\n mn,\n {\n isShowed: N,\n isBodyGenerated: h,\n dropdownBodyWidth: c || "100%",\n position: p,\n body: !v && !(e != null && e.isDisabled) && t && t.length > 0 ? /* @__PURE__ */ A(mu, { ref: z, children: M ? /* @__PURE__ */ A(\n Rn,\n {\n ...e,\n defaultValues: E,\n data: q,\n isMulti: !1,\n selectedOptions: $,\n showSelectedList: f\n }\n ) : /* @__PURE__ */ A(\n Xu,\n {\n ...e,\n values: E,\n ApplyFilterValue: j,\n selectedValue: $,\n setSearchValue: r1,\n isSearchable: !!(t && (t == null ? void 0 : t.length) > 1 && u),\n showSelectedList: f\n }\n ) }) : v && !(e != null && e.isDisabled) ? /* @__PURE__ */ c1(x8, { children: [\n /* @__PURE__ */ A(dz, { type: "circle", progress: 50 }),\n " Loading"\n ] }) : /* @__PURE__ */ A(mu, { ref: z, children: M ? /* @__PURE__ */ A(\n Rn,\n {\n ...e,\n defaultValues: E,\n data: q,\n isMulti: !1,\n selectedOptions: $,\n showSelectedList: f\n }\n ) : /* @__PURE__ */ A(\n Xu,\n {\n ...e,\n values: E,\n ApplyFilterValue: j,\n selectedValue: $,\n setSearchValue: r1,\n isSearchable: !!(t && (t == null ? void 0 : t.length) > 10 && u),\n showSelectedList: f\n }\n ) }),\n children: /* @__PURE__ */ A(PP, { children: M ? /* @__PURE__ */ A(\n U6,\n {\n ...e,\n placeholder: a || "Select",\n iconRight: g || (N ? "ChevronUp" : "ChevronDown"),\n readOnly: !1,\n label: s,\n labelType: l,\n isRequired: C || !1,\n iconSize: "xxxs",\n onClick: k,\n value: T,\n handleClearFn: a1,\n onChange: K,\n hideClearButton: B,\n onIconRightClick: k\n }\n ) : /* @__PURE__ */ A(S0, { children: n && T && y ? /* @__PURE__ */ A(\n v2,\n {\n place: "right-start",\n followCursor: !0,\n text: /* @__PURE__ */ A(VP, { children: T == null ? void 0 : T.map((_) => /* @__PURE__ */ A(FP, { children: _ })) }),\n children: /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n U6,\n {\n ...e,\n placeholder: a || "Select",\n iconRight: g || (N ? "ChevronUp" : "ChevronDown"),\n readOnly: !0,\n label: s,\n labelType: l,\n isRequired: C || !1,\n iconSize: "xxxs",\n onClick: k,\n onIconRightClick: k,\n value: T,\n handleClearFn: a1,\n onChange: () => null,\n hideClearButton: O\n }\n ) })\n }\n ) : /* @__PURE__ */ A(\n U6,\n {\n ...e,\n placeholder: a || "Select",\n iconRight: g || (N ? "ChevronUp" : "ChevronDown"),\n readOnly: !0,\n label: s,\n labelType: l,\n isRequired: C || !1,\n iconSize: "xxxs",\n onClick: k,\n onIconRightClick: k,\n value: T,\n handleClearFn: a1,\n onChange: () => null,\n hideClearButton: O\n }\n ) }) })\n }\n ) });\n}, p5 = [\n {\n value: 0,\n label: "January"\n },\n {\n value: 1,\n label: "February"\n },\n {\n value: 2,\n label: "March"\n },\n {\n value: 3,\n label: "April"\n },\n {\n value: 4,\n label: "May"\n },\n {\n value: 5,\n label: "June"\n },\n {\n value: 6,\n label: "July"\n },\n {\n value: 7,\n label: "August"\n },\n {\n value: 8,\n label: "September"\n },\n {\n value: 9,\n label: "October"\n },\n {\n value: 10,\n label: "November"\n },\n {\n value: 11,\n label: "December"\n }\n];\nfunction Az(e) {\n const { date: t, decreaseMonth: r, increaseMonth: n, changeMonth: o, changeYear: i } = e, l = ((u, h, b) => {\n var M, C;\n return (C = (M = new Array(h - u)) == null ? void 0 : M.fill({ ...b, ...u, ...h })) == null ? void 0 : C.map((g, f) => f + u);\n })(1900, oe(/* @__PURE__ */ new Date()) + 100, 1);\n let c = [];\n l.map((u, h) => {\n c.push({ value: h, label: u });\n });\n const p = () => {\n let u = [], h = pu[Dt(t)];\n return p5 == null || p5.map((b) => {\n b.label == h && u.push(b);\n }), u;\n }, d = () => {\n let u = [], h = oe(t);\n return c == null || c.map((b) => {\n b.label == h && u.push(b);\n }), u;\n };\n return /* @__PURE__ */ c1(EP, { children: [\n /* @__PURE__ */ A(kP, { children: /* @__PURE__ */ c1(Ha, { columns: 12, $justifyContent: "space-between", children: [\n /* @__PURE__ */ A(Nl, { width: 7, children: /* @__PURE__ */ A(\n fn,\n {\n data: p5,\n selectedOptions: (u) => {\n if (u.label) {\n let h = pu.indexOf(u.label);\n o(h);\n }\n },\n defaultValues: p(),\n autoSearch: !0,\n dropdownBodyWidth: "115px",\n showSelectedList: !0\n }\n ) }),\n /* @__PURE__ */ A(Nl, { width: 5, children: /* @__PURE__ */ A(\n fn,\n {\n data: c,\n selectedOptions: (u) => {\n let h = u == null ? void 0 : u.label;\n u.label && i(h);\n },\n defaultValues: d(),\n autoSearch: !0,\n dropdownBodyWidth: "104px",\n showSelectedList: !0\n }\n ) })\n ] }) }),\n /* @__PURE__ */ c1(SP, { children: [\n /* @__PURE__ */ A(hu, { onClick: r, children: /* @__PURE__ */ A(f0, { name: "ChevronLeft", size: "xxxs" }) }),\n /* @__PURE__ */ A(hu, { onClick: n, children: /* @__PURE__ */ A(f0, { name: "ChevronRight", size: "xxxs" }) })\n ] })\n ] });\n}\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: absolute;\n top: 20px;\n transform: translateX(-50%);\n width: 400px;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n div {\n right: 26px;\n top: 50%;\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: ${e.sp16};\n user-select: none;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().header(\n ({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, borderRadius: t, transitions: r, colors: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${e.sp12};\n height: ${e.sp12};\n padding: 6px 10px;\n border-radius: ${t.base};\n transition: ${r.base};\n cursor: pointer;\n\n &:hover {\n background-color: ${n.backgrounds.whiteSmoke};\n }\n\n .icon-system {\n color: ${n.black};\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-weight: ${e.fontWeight.regular};\n font-size: ${e.typography.t16};\n color: ${e.colors.black};\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 52%;\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-basis: 51%;\n input {\n font-family: ${e.fontFamily.base};\n font-weight: ${e.fontWeight.regular};\n font-size: ${e.typography.t16};\n color: ${e.colors.black};\n margin: 0;\n height: 2rem;\n position: absolute;\n top: -16px;\n border: none;\n padding-right: 0;\n padding-left: 10px;\n }\n .icon-system {\n svg {\n width: 1.5rem;\n }\n }\n ${I7} {\n top: 16px;\n left: -10px;\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default()(L2)`\n cursor: pointer;\n /* position: relative; */\n /* z-index: 99; */\n /* z-index: ${(e) => e.iconRight === "ChevronDown" ? 2 : 1}; */\n + * {\n .icon-system {\n pointer-events: none;\n }\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n position: absolute;\n top: ${(e) => e.isLabel ? "28px" : e.checkRequired ? "5px" : "28px"};\n right: 35px;\n cursor: pointer;\n background: #ffffff;\n z-index: 2;\n`;\nconst YF = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: e, isDisabled: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: relative;\n .align-center,\n .align-left,\n .align-right {\n top: 100%;\n height: fit-content;\n }\n .react-datepicker__day-name {\n width: 32px !important;\n height: 32px !important;\n /* padding: 10px; */\n }\n .react-datepicker__day-name {\n width: 32px !important;\n height: 32px !important;\n /* padding: 10px; */\n }\n .react-datepicker__day {\n width: 32px !important;\n height: 32px !important;\n font-size: ${e.typography.t12} !important;\n line-height: ${e.lineHeight.lh20};\n }\n .react-datepicker-popper {\n width: min-content;\n }\n .react-datepicker {\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t12};\n background-color: ${e.colors.backgrounds.bgPrimary};\n color: ${e.colors.blue};\n border: none;\n border-radius: ${e.borderRadius.base};\n box-shadow: ${e.shadows.sm};\n display: inline-block;\n position: relative;\n\n .react-datepicker__aria-live {\n display: none;\n }\n &__header {\n text-align: center;\n background-color: ${e.colors.backgrounds.bgPrimary};\n border-bottom: none;\n border-top-left-radius: ${e.borderRadius.base};\n /* padding: 0; */\n position: relative;\n padding: ${e.spacings.sp16} ${e.spacings.sp16} 0;\n\n &:not(.react-datepicker__header--has-time-select) {\n border-top-right-radius: ${e.borderRadius.base};\n }\n }\n\n &__day,\n &__day-name {\n display: inline-block;\n margin: 2px;\n }\n\n &__day {\n outline: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${e.itemSize.lg};\n height: ${e.itemSize.lg};\n font-size: ${e.typography.t16};\n font-weight: ${e.fontWeight.regular};\n color: ${e.colors.textIcon.textSecondary};\n border-radius: ${e.borderRadius.base};\n transition: ${e.transitions.base};\n\n &--keyboard-selected,\n &--selected {\n background-color: ${e.colors.backgrounds.bgTertiary} !important;\n color: ${e.colors.textIcon.textTertiary} !important;\n }\n\n &:hover {\n transition: ${e.transitions.base};\n background-color: ${e.colors.backgrounds.bgHoverPrimary};\n color: ${e.colors.textIcon.textSecondary};\n }\n\n &-name {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${e.itemSize.lg};\n height: ${e.itemSize.lg};\n color: ${e.colors.textIcon.textLowemphasis};\n }\n }\n\n &__triangle {\n display: none;\n }\n }\n .react-datepicker__day--in-range {\n :hover {\n background: none;\n }\n }\n .react-datepicker__day--selected,\n .react-datepicker__day--in-selecting-range,\n .react-datepicker__day--in-range,\n .react-datepicker__month-text--selected,\n .react-datepicker__month-text--in-selecting-range,\n .react-datepicker__month-text--in-range,\n .react-datepicker__quarter-text--selected,\n .react-datepicker__quarter-text--in-selecting-range,\n .react-datepicker__quarter-text--in-range,\n .react-datepicker__year-text--selected,\n .react-datepicker__year-text--in-selecting-range,\n .react-datepicker__year-text--in-range,\n .react-datepicker__day--keyboard-selected,\n .react-datepicker__month-text--keyboard-selected,\n .react-datepicker__quarter-text--keyboard-selected,\n .react-datepicker__year-text--keyboard-selected {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.backgrounds.bgHoverPrimary};\n color: ${e.colors.textIcon.textSecondary};\n\n /* &:hover {\n background-color: ${e.colors.blue};\n } */\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n margin-left: -8px;\n position: absolute;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow,\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n box-sizing: content-box;\n position: absolute;\n border: 8px solid transparent;\n height: 0;\n width: 1px;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n content: \'\';\n z-index: -1;\n border-width: 8px;\n left: -8px;\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle {\n top: 0;\n margin-top: -8px;\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before {\n border-top: none;\n border-bottom-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'bottom\']\n .react-datepicker__triangle::before {\n top: -1px;\n border-bottom-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n bottom: 0;\n margin-bottom: -8px;\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] .react-datepicker__triangle,\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow,\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n border-bottom: none;\n border-top-color: ${e.colors.white};\n }\n\n .react-datepicker-popper[data-placement^=\'top\']\n .react-datepicker__triangle::before,\n .react-datepicker__year-read-view--down-arrow::before,\n .react-datepicker__month-read-view--down-arrow::before,\n .react-datepicker__month-year-read-view--down-arrow::before {\n bottom: -1px;\n border-top-color: ${e.colors.white};\n }\n\n .react-datepicker-wrapper {\n display: flex;\n padding: 0;\n border: 0;\n }\n\n .react-datepicker--time-only .react-datepicker__triangle {\n left: 35px;\n }\n\n .react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n }\n\n .react-datepicker__year-option:first-of-type,\n .react-datepicker__month-option:first-of-type,\n .react-datepicker__month-year-option:first-of-type {\n border-top-left-radius: ${e.borderRadius.base};\n border-top-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker--time-only .react-datepicker__time,\n .react-datepicker--time-only .react-datepicker__time-box {\n border-bottom-left-radius: ${e.borderRadius.base};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__day--today,\n .react-datepicker__month-text--today,\n .react-datepicker__quarter-text--today,\n .react-datepicker__year-text--today {\n font-weight: ${e.fontWeight.regular};\n }\n\n .react-datepicker--time-only .react-datepicker__triangle {\n left: 35px;\n }\n\n .react-datepicker--time-only .react-datepicker__time-container {\n border-left: 0;\n }\n\n .react-datepicker__triangle {\n position: absolute;\n left: 50px;\n }\n\n .react-datepicker-popper {\n z-index: 10;\n }\n\n /* .react-datepicker-popper[data-placement^=\'bottom\'] {\n margin-top: 10px;\n } */\n\n .react-datepicker-popper[data-placement=\'bottom-end\']\n .react-datepicker__triangle,\n .react-datepicker-popper[data-placement=\'top-end\']\n .react-datepicker__triangle {\n left: auto;\n right: 50px;\n }\n\n .react-datepicker-popper[data-placement^=\'top\'] {\n margin-bottom: 10px;\n }\n\n .react-datepicker-popper[data-placement^=\'right\'] {\n margin-left: 8px;\n }\n\n .react-datepicker-popper[data-placement^=\'right\']\n .react-datepicker__triangle {\n left: auto;\n right: 42px;\n }\n\n .react-datepicker-popper[data-placement^=\'left\'] {\n margin-right: 8px;\n }\n\n .react-datepicker-popper[data-placement^=\'left\']\n .react-datepicker__triangle {\n left: 42px;\n right: auto;\n }\n\n .react-datepicker__header--time {\n padding-bottom: 8px;\n padding-left: 5px;\n padding-right: 5px;\n }\n\n .react-datepicker__header--time:not(.react-datepicker__header--time--only) {\n border-top-left-radius: 0;\n }\n\n .react-datepicker__year-dropdown-container--select,\n .react-datepicker__month-dropdown-container--select,\n .react-datepicker__month-year-dropdown-container--select,\n .react-datepicker__year-dropdown-container--scroll,\n .react-datepicker__month-dropdown-container--scroll,\n .react-datepicker__month-year-dropdown-container--scroll {\n display: inline-block;\n margin: 0 2px;\n }\n\n .react-datepicker__current-month,\n .react-datepicker-time__header,\n .react-datepicker-year-header {\n margin-top: 0;\n color: ${e.colors.black};\n font-weight: ${e.fontWeight.bold};\n font-size: ${e.typography.t16};\n }\n\n .react-datepicker-time__header {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .react-datepicker__navigation {\n background: none;\n line-height: 1.7rem;\n text-align: center;\n cursor: pointer;\n position: absolute;\n top: 10px;\n padding: 0;\n border: 0.45rem solid transparent;\n z-index: 1;\n height: 10px;\n width: 10px;\n text-indent: -999em;\n overflow: hidden;\n }\n\n .react-datepicker__navigation--previous {\n left: 10px;\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--previous:hover {\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--previous--disabled,\n .react-datepicker__navigation--previous--disabled:hover {\n border-right-color: ${e.colors.darkGray};\n cursor: default;\n }\n\n .react-datepicker__navigation--next {\n right: 10px;\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--next--with-time:not(\n .react-datepicker__navigation--next--with-today-button\n ) {\n right: 95px;\n }\n\n .react-datepicker__navigation--next:hover {\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--next--disabled,\n .react-datepicker__navigation--next--disabled:hover {\n border-left-color: ${e.colors.darkGray};\n cursor: default;\n }\n\n .react-datepicker__navigation--years {\n position: relative;\n top: 0;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .react-datepicker__navigation--years-previous {\n top: 4px;\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-previous:hover {\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-upcoming {\n top: -4px;\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__navigation--years-upcoming:hover {\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__month-container {\n float: left;\n }\n\n .react-datepicker__year {\n margin: 0.4rem;\n text-align: center;\n }\n\n .react-datepicker__year-wrapper {\n display: flex;\n flex-wrap: wrap;\n max-width: 180px;\n }\n\n .react-datepicker__year .react-datepicker__year-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n }\n\n .react-datepicker__month {\n padding-bottom: 1rem;\n text-align: center;\n }\n\n .react-datepicker__month .react-datepicker__month-text,\n .react-datepicker__month .react-datepicker__quarter-text {\n display: inline-block;\n width: 4rem;\n margin: 2px;\n }\n\n .react-datepicker__input-time-container {\n clear: both;\n width: 100%;\n float: left;\n margin: 5px 0 10px 15px;\n text-align: left;\n }\n\n .react-datepicker__input-time-container .react-datepicker-time__caption {\n display: inline-block;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container {\n display: inline-block;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input {\n display: inline-block;\n margin-left: 10px;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input {\n width: 85px;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\']::-webkit-inner-spin-button,\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\']::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__input\n input[type=\'time\'] {\n -moz-appearance: textfield;\n }\n\n .react-datepicker__input-time-container\n .react-datepicker-time__input-container\n .react-datepicker-time__delimiter {\n margin-left: 5px;\n display: inline-block;\n }\n\n .react-datepicker__time-container {\n float: right;\n border-left: none;\n width: 85px;\n }\n\n .react-datepicker__time-container--with-today-button {\n display: inline;\n border: 1px solid ${e.colors.black};\n border-radius: 0.3rem;\n position: absolute;\n right: -72px;\n top: 0;\n }\n\n .react-datepicker__time-container .react-datepicker__time {\n position: relative;\n background: ${e.colors.white};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box {\n width: 85px;\n overflow-x: hidden;\n margin: 0 auto;\n text-align: center;\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list {\n list-style: none;\n margin: 0;\n height: calc(195px + (1.7rem / 2));\n overflow-y: scroll;\n padding-right: 0;\n padding-left: 0;\n width: 100%;\n box-sizing: content-box;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item {\n height: 30px;\n padding: 5px 10px;\n white-space: nowrap;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item:hover {\n cursor: pointer;\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--selected {\n background-color: ${e.colors.blue};\n color: ${e.colors.white};\n font-weight: bold;\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--selected:hover {\n background-color: ${e.colors.blue};\n }\n\n .react-datepicker__time-container\n .react-datepicker__time\n .react-datepicker__time-box\n ul.react-datepicker__time-list\n li.react-datepicker__time-list-item--disabled {\n color: ${e.colors.darkGray};\n }\n\n .react-datepicker__week-number {\n color: ${e.colors.darkGray};\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n }\n\n .react-datepicker__week-number.react-datepicker__week-number--clickable {\n cursor: pointer;\n }\n\n .react-datepicker__week-number.react-datepicker__week-number--clickable:hover {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__day-names,\n .react-datepicker__week {\n white-space: nowrap;\n user-select: none;\n }\n\n .react-datepicker__time-name {\n color: ${e.colors.black};\n display: inline-block;\n width: 1.7rem;\n line-height: 1.7rem;\n text-align: center;\n margin: 0.166rem;\n }\n\n .react-datepicker__month--selected,\n .react-datepicker__month--in-selecting-range,\n .react-datepicker__month--in-range,\n .react-datepicker__quarter--selected,\n .react-datepicker__quarter--in-selecting-range,\n .react-datepicker__quarter--in-range {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.blue};\n color: ${e.colors.white};\n }\n\n .react-datepicker__month--selected:hover,\n .react-datepicker__month--in-selecting-range:hover,\n .react-datepicker__month--in-range:hover,\n .react-datepicker__quarter--selected:hover,\n .react-datepicker__quarter--in-selecting-range:hover,\n .react-datepicker__quarter--in-range:hover {\n background-color: ${e.colors.scampi};\n }\n\n .react-datepicker__month--disabled,\n .react-datepicker__quarter--disabled {\n color: ${e.colors.darkGray};\n pointer-events: none;\n }\n\n .react-datepicker__month--disabled:hover,\n .react-datepicker__quarter--disabled:hover {\n cursor: default;\n background-color: transparent;\n }\n\n .react-datepicker__day,\n .react-datepicker__month-text,\n .react-datepicker__quarter-text,\n .react-datepicker__year-text {\n cursor: pointer;\n }\n\n .react-datepicker__month-text:hover,\n .react-datepicker__quarter-text:hover,\n .react-datepicker__year-text:hover {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__day--highlighted,\n .react-datepicker__month-text--highlighted,\n .react-datepicker__quarter-text--highlighted,\n .react-datepicker__year-text--highlighted {\n border-radius: ${e.borderRadius.base};\n background-color: ${e.colors.success};\n color: ${e.colors.white};\n }\n\n .react-datepicker__day--highlighted:hover,\n .react-datepicker__month-text--highlighted:hover,\n .react-datepicker__quarter-text--highlighted:hover,\n .react-datepicker__year-text--highlighted:hover {\n background-color: ${e.colors.success};\n }\n\n .react-datepicker__day--highlighted-custom-1,\n .react-datepicker__month-text--highlighted-custom-1,\n .react-datepicker__quarter-text--highlighted-custom-1,\n .react-datepicker__year-text--highlighted-custom-1 {\n color: ${e.colors.pink};\n }\n\n .react-datepicker__day--highlighted-custom-2,\n .react-datepicker__month-text--highlighted-custom-2,\n .react-datepicker__quarter-text--highlighted-custom-2,\n .react-datepicker__year-text--highlighted-custom-2 {\n color: ${e.colors.green};\n }\n\n .react-datepicker__day--in-selecting-range,\n .react-datepicker__month-text--in-selecting-range,\n .react-datepicker__quarter-text--in-selecting-range,\n .react-datepicker__year-text--in-selecting-range {\n background-color: ${`rgba( ${e.colors.blue}, 0.5)`};\n }\n\n .react-datepicker__month--selecting-range .react-datepicker__day--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__month-text--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__quarter-text--in-range,\n .react-datepicker__month--selecting-range\n .react-datepicker__year-text--in-range {\n background-color: ${e.colors.backgrounds.bgHoverPrimary};\n color: ${e.colors.black};\n }\n\n .react-datepicker__day--disabled,\n .react-datepicker__month-text--disabled,\n .react-datepicker__quarter-text--disabled,\n .react-datepicker__year-text--disabled {\n cursor: default;\n color: ${e.colors.darkGray};\n }\n\n .react-datepicker__day--disabled:hover,\n .react-datepicker__month-text--disabled:hover,\n .react-datepicker__quarter-text--disabled:hover,\n .react-datepicker__year-text--disabled:hover {\n background-color: transparent;\n }\n\n .react-datepicker__quarter-text.react-datepicker__month--selected:hover,\n .react-datepicker__quarter-text.react-datepicker__month--in-range:hover,\n .react-datepicker__quarter-text.react-datepicker__quarter--selected:hover,\n .react-datepicker__quarter-text.react-datepicker__quarter--in-range:hover {\n background-color: ${e.colors.blue};\n }\n\n .react-datepicker__month-text:hover,\n .react-datepicker__quarter-text:hover {\n background-color: ${e.colors.white};\n }\n\n .react-datepicker__input-container {\n position: relative;\n display: inline-block;\n width: 100%;\n .input-wrapper {\n /* background-color: ${e.colors.white}; */\n input {\n /* background-color: transparent; */\n }\n }\n }\n\n .react-datepicker__year-read-view,\n .react-datepicker__month-read-view,\n .react-datepicker__month-year-read-view {\n border: 1px solid transparent;\n border-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__year-read-view:hover,\n .react-datepicker__month-read-view:hover,\n .react-datepicker__month-year-read-view:hover {\n cursor: pointer;\n }\n\n .react-datepicker__year-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__year-read-view:hover\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view:hover\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view:hover\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-year-read-view:hover\n .react-datepicker__month-read-view--down-arrow {\n border-top-color: transparent;\n }\n\n .react-datepicker__year-read-view--down-arrow,\n .react-datepicker__month-read-view--down-arrow,\n .react-datepicker__month-year-read-view--down-arrow {\n border-top-color: ${e.colors.black};\n float: right;\n margin-left: 20px;\n top: 8px;\n position: relative;\n border-width: 0.45rem;\n }\n\n .react-datepicker__year-dropdown,\n .react-datepicker__month-dropdown,\n .react-datepicker__month-year-dropdown {\n background-color: ${e.colors.white};\n position: absolute;\n width: 50%;\n left: 25%;\n top: 30px;\n z-index: 1;\n text-align: center;\n border-radius: ${e.borderRadius.base};\n border: 1px solid ${e.colors.black};\n }\n\n .react-datepicker__year-dropdown:hover,\n .react-datepicker__month-dropdown:hover,\n .react-datepicker__month-year-dropdown:hover {\n cursor: pointer;\n }\n\n .react-datepicker__year-dropdown--scrollable,\n .react-datepicker__month-dropdown--scrollable,\n .react-datepicker__month-year-dropdown--scrollable {\n height: 150px;\n overflow-y: scroll;\n }\n\n .react-datepicker__year-option,\n .react-datepicker__month-option,\n .react-datepicker__month-year-option {\n line-height: 20px;\n width: 100%;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n\n .react-datepicker__year-option:last-of-type,\n .react-datepicker__month-option:last-of-type,\n .react-datepicker__month-year-option:last-of-type {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border-bottom-left-radius: ${e.borderRadius.base};\n border-bottom-right-radius: ${e.borderRadius.base};\n }\n\n .react-datepicker__year-option:hover,\n .react-datepicker__month-option:hover,\n .react-datepicker__month-year-option:hover {\n background-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option:hover\n .react-datepicker__navigation--years-upcoming,\n .react-datepicker__month-option:hover\n .react-datepicker__navigation--years-upcoming,\n .react-datepicker__month-year-option:hover\n .react-datepicker__navigation--years-upcoming {\n border-bottom-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option:hover\n .react-datepicker__navigation--years-previous,\n .react-datepicker__month-option:hover\n .react-datepicker__navigation--years-previous,\n .react-datepicker__month-year-option:hover\n .react-datepicker__navigation--years-previous {\n border-top-color: ${e.colors.black};\n }\n\n .react-datepicker__year-option--selected,\n .react-datepicker__month-option--selected,\n .react-datepicker__month-year-option--selected {\n position: absolute;\n left: 15px;\n }\n\n .react-datepicker__close-icon {\n cursor: pointer;\n background-color: transparent;\n border: 0;\n outline: 0;\n padding: 0 6px 0 0;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n display: table-cell;\n vertical-align: middle;\n }\n\n .react-datepicker__today-button {\n background: ${e.colors.white};\n border-top: 1px solid ${e.colors.black};\n cursor: pointer;\n text-align: center;\n font-weight: bold;\n padding: 5px 0;\n clear: left;\n }\n\n .react-datepicker__portal {\n position: fixed;\n width: 100vw;\n height: 100vh;\n background-color: ${`rgba(${e.colors.black}, 0.8)`};\n left: 0;\n top: 0;\n justify-content: center;\n align-items: center;\n display: flex;\n z-index: 2147483647;\n }\n\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 3rem;\n line-height: 3rem;\n }\n\n @media (max-width: 400px), (max-height: 550px) {\n .react-datepicker__portal .react-datepicker__day-name,\n .react-datepicker__portal .react-datepicker__day,\n .react-datepicker__portal .react-datepicker__time-name {\n width: 2rem;\n line-height: 2rem;\n }\n }\n\n .react-datepicker__portal .react-datepicker__current-month,\n .react-datepicker__portal .react-datepicker-time__header {\n font-size: ${e.typography.t20};\n }\n\n .react-datepicker__portal .react-datepicker__navigation {\n border: 0.81rem solid transparent;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous {\n border-right-color: ${e.colors.black};\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous:hover {\n border-right-color: unset;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--previous--disabled,\n .react-datepicker__portal\n .react-datepicker__navigation--previous--disabled:hover {\n border-right-color: ${e.colors.grey};\n cursor: default;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next {\n border-left-color: ${e.colors.black};\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next:hover {\n border-left-color: unset;\n }\n\n .react-datepicker__portal .react-datepicker__navigation--next--disabled,\n .react-datepicker__portal\n .react-datepicker__navigation--next--disabled:hover {\n border-left-color: ${e.colors.grey};\n cursor: default;\n }\n\n .react-datepicker__day--outside-month {\n color: ${e.colors.textIcon.textDisabledOnbg};\n }\n\n ${t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${S7} {\n cursor: default;\n color: ${e.colors.textIcon.textDisabledNobg};\n background-color: ${e.colors.backgrounds.bgDisabledPrimary};\n }\n `}\n `\n);\nfunction Qu(e) {\n const {\n label: t,\n getValue: r,\n isDisabled: n,\n placeholder: o,\n isRequired: i,\n isError: a,\n disableClear: s,\n handleClearButton: l,\n dateFormat: c = "dd/MM/yyyy",\n popperPlacement: p = "top-start",\n minDate: d,\n maxDate: u,\n defaultValue: h,\n ...b\n } = e, [M, C] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [g, f] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (x) => /* @__PURE__ */ A(Az, { ...x }),\n []\n ), m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (x) => x.substr(0, 1),\n []\n ), v = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => /* @__PURE__ */ A(\n L2,\n {\n placeholder: o,\n iconLeft: "Calendar",\n iconRight: g ? "ChevronUp" : "ChevronDown",\n readOnly: !0,\n label: t,\n isRequired: i,\n isError: a,\n iconSize: "xxxs",\n handleClearFn: () => {\n l && l(), C(null);\n }\n }\n ),\n [o, g, t, i, a]\n ), y = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (x) => {\n C(x), r && r(x), f(!1);\n },\n [C, r, f]\n ), z = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n f(!0);\n }, [f]), N = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n f(!1);\n }, [f]), W = () => {\n if (d)\n return d;\n }, T = () => {\n if (u)\n return u;\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n ((b == null ? void 0 : b.value) == null || (b == null ? void 0 : b.value) == "") && C(null);\n }, [b == null ? void 0 : b.value]), /* @__PURE__ */ A(YF, { isDisabled: n, children: /* @__PURE__ */ A(\n $g,\n {\n ...b,\n fixedHeight: !0,\n closeOnScroll: !0,\n renderCustomHeader: O,\n formatWeekDay: m,\n onChange: y,\n onFocus: z,\n onBlur: N,\n customInput: v,\n placeholderText: o,\n disabled: n,\n selected: M || h,\n dateFormat: c,\n popperClassName: "some-custom-class",\n popperPlacement: "bottom-start",\n popperModifiers: [\n {\n name: "offset",\n options: {\n offset: [0, 0]\n }\n },\n {\n name: "preventOverflow",\n options: {\n rootBoundary: "viewport",\n tether: !1,\n altAxis: !0\n }\n }\n ],\n popperProps: { strategy: "fixed" },\n minDate: W(),\n maxDate: T()\n }\n ) });\n}\nfunction XF(e, t) {\n const {\n isDisabled: r,\n hideClearBtn: n,\n min: o,\n max: i,\n onChange: a,\n dateFormat: s = "dd/MM/yyyy",\n defaultValue: l,\n handleClearButton: c,\n ...p\n } = e, [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n min: o,\n max: i\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n l && o == null && i == null && u({ min: o, max: i });\n }, [l, o, i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n o != null && i != null && u({ min: o, max: i });\n }, [o, i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n o && !d.min && d.min != null && (u({ ...d, min: o }), a({ ...d, min: o }));\n }, [o, a, d]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n i && !d.max && d.max != null && (u({ ...d, max: i }), a({ ...d, max: i }));\n }, [i, a, d]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useImperativeHandle)(t, () => ({\n handleReset(f) {\n u(f);\n }\n }));\n const h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (f) => {\n u({ ...d, min: f }), a({ ...d, min: f });\n },\n [a, d]\n ), b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (f) => {\n u({ ...d, max: f }), a({ ...d, max: f });\n },\n [a, d]\n ), M = {\n placeholder: "Select a date",\n startDate: d.min,\n endDate: d.max,\n isDisabled: r,\n dateFormat: s\n }, C = d.min && typeof s == "string" ? h4(new Date(d.min), s) : "", g = d.max && typeof s == "string" ? h4(new Date(d.max), s) : "";\n return /* @__PURE__ */ c1("div", { className: "date-range-container", children: [\n /* @__PURE__ */ A(SA, { children: /* @__PURE__ */ A(\n Qu,\n {\n ...M,\n label: "From",\n getValue: h,\n defaultValue: d != null && d.min ? d == null ? void 0 : d.min : void 0,\n maxDate: d.max || (p == null ? void 0 : p.maxToDate),\n value: C,\n selectsStart: !0,\n isRequired: !0,\n disableClear: n,\n handleClearButton: () => {\n u({\n min: null,\n max: null\n });\n }\n }\n ) }),\n /* @__PURE__ */ A(SA, { children: /* @__PURE__ */ A(\n Qu,\n {\n ...M,\n label: "To",\n getValue: b,\n defaultValue: d != null && d.max ? d == null ? void 0 : d.max : void 0,\n minDate: d.min,\n maxDate: p == null ? void 0 : p.maxToDate,\n isDisabled: !d.min,\n value: g,\n selectsEnd: !0,\n disableClear: n,\n handleClearButton: () => {\n u({\n min: d.min ? d.min : null,\n max: null\n }), c && c({\n min: d.min ? d.min : null,\n max: null\n });\n }\n }\n ) })\n ] });\n}\nconst uz = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(XF);\nfunction QF(e) {\n const {\n onClearFilter: t,\n onApplyFilter: r,\n value: n,\n isDisabled: o,\n buttonText: i,\n defaultValue: a,\n dateFormat: s = "dd/MM/yyyy",\n ...l\n } = e, [c, p] = Ta(!1), d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [u, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [b, M] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [C, g] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n n && h(n);\n }, [n]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n let z = {\n min: null,\n max: null\n };\n u == null || JSON.stringify(u) == JSON.stringify(z) ? g(!0) : g(!1);\n }, [u]);\n const f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n u && (r && r(u), p());\n }, [r, p, u]), O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const z = {\n min: null,\n max: null\n };\n r && r(z), h(z), d != null && d.current && d.current.handleReset(z), t && t(), p();\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n M(\n (u == null ? void 0 : u.min) !== null || (u == null ? void 0 : u.max) !== null || (n == null ? void 0 : n.min) !== null || (n == null ? void 0 : n.max) !== null\n );\n }, [n, c, u]);\n const m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const z = (T) => h4(new Date(T), s), N = {\n isDisabled: o,\n isActive: c,\n onClick: p\n };\n if (!n.min && !n.max)\n return /* @__PURE__ */ A(Ai, { ...N, "aria-label": `${i} filter`, children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ c1(Kr, { $isDate: !0, children: [\n " ",\n i\n ] }),\n /* @__PURE__ */ A(\n f0,\n {\n name: c ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n )\n ] }) });\n let W = [\n n != null && n.min ? `${z(n.min)} ` : "...",\n n != null && n.max ? z(n.max) : "..."\n ];\n return /* @__PURE__ */ A(\n Ai,\n {\n ...N,\n isDisabled: o,\n $isActive: c,\n onClick: p,\n isFiltered: !!(!c && W),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { $isDate: !0, children: W ? /* @__PURE__ */ c1(_f, { $isActive: c, children: [\n W[0],\n /* @__PURE__ */ A(l2, { count: 0, noDigit: !0 }),\n W[1],\n " "\n ] }) : i }),\n c && W ? /* @__PURE__ */ A(\n f0,\n {\n name: c ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n ) : /* @__PURE__ */ A(di, { onClick: O, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) })\n ] })\n }\n );\n }, [p, c, o, n, i]), v = ({ min: z, max: N }) => {\n h({\n min: z,\n max: N\n });\n }, y = (z) => {\n h(z);\n };\n return /* @__PURE__ */ A(\n _4,\n {\n ...l,\n button: m,\n isShowed: c,\n isFilterValueChanged: b,\n isEnableApplyBtn: C,\n onApplyFilter: f,\n onClearFilter: O,\n handleDropdownShowed: p,\n children: /* @__PURE__ */ A(\n uz,\n {\n ...l,\n dateFormat: s,\n ref: d,\n defaultValue: a,\n onChange: v,\n min: u != null && u.min ? new Date(u.min) : null,\n max: u != null && u.max ? new Date(u.max) : null,\n handleClearButton: y\n }\n )\n }\n );\n}\nconst GF = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(N7)(\n ({ theme: { colors: e, fontWeight: t, typography: r, lineHeight: n, itemSize: o } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: ${r.t12};\n background: ${e.backgrounds.bgPrimary};\n border-radius: 40px;\n height: ${o.md};\n white-space: nowrap;\n min-width: min-content;\n //new\n color: ${e.textIcon.textPrimary} !important;\n box-shadow: ${tt(e.border.borderTertiary)};\n line-height: ${n.lh20};\n font-weight: ${t.regular};\n &:not(:disabled) {\n &:not(:active) {\n &:hover {\n background-color: ${e.backgrounds.bgHoverPrimary} !important;\n box-shadow: ${tt(e.border.borderTertiary)};\n }\n\n &:focus-visible {\n background: ${e.backgrounds.bgPrimary} !important;\n color: ${e.textIcon.textPrimary} !important;\n border-color: ${e.border.borderFocused} !important;\n box-shadow: ${tt(\n e.border.borderFocused\n )} !important;\n }\n }\n }\n svg {\n color: ${e.textIcon.textPrimary} !important;\n }\n &:active {\n background: ${e.backgrounds.bgPressed} !important;\n color: ${e.textIcon.textTertiary} !important;\n\n svg {\n color: ${e.buttonText.buttonTextPrimary} !important;\n /* background: ${e.backgrounds.bgTransparencyPressed} !important;\n border-radius: 8px; */\n opacity: unset;\n }\n }\n `\n);\nfunction jF(e) {\n return /* @__PURE__ */ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(GF, { ...e, key: "isActive-" + e.$isActive });\n}\nfunction KF(e) {\n const { isDisabled: t, ...r } = e, n = { disabled: t, ...r };\n return /* @__PURE__ */ A(jF, { ...n });\n}\nfunction _5(e) {\n const {\n isSearchable: t,\n getFilteredValue: r,\n highLightSelectedOptions: n,\n values: o,\n data: i,\n isMulti: a,\n placeholder: s,\n label: l\n } = e, [c, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(i), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(), M = pz(c, 500), [C, g] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [f, O] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(), m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((N) => {\n p(N), g(!!N);\n }, []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n (o == null ? void 0 : o.length) == 0 && b([]);\n }, [o]);\n const v = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (N) => {\n if (a)\n if (!C)\n b(N), r && r(N);\n else {\n let W = [...N, ...h];\n W == null || W.map((T, x) => {\n T != null && T.times && W.splice(x, 1);\n }), b(N), r && r(N);\n }\n else\n b(N), r && r(N);\n },\n [h]\n ), y = () => {\n let N = i == null ? void 0 : i.filter(\n (W) => {\n var T, x, E, L, w;\n return (W == null ? void 0 : W.countryList) != null ? (x = (T = W == null ? void 0 : W.countryList) == null ? void 0 : T.countryName) == null ? void 0 : x.toLowerCase().includes(M == null ? void 0 : M.toLowerCase()) : (W == null ? void 0 : W.timeZone) != null ? (L = (E = W == null ? void 0 : W.timeZone) == null ? void 0 : E.zone) == null ? void 0 : L.toLowerCase().includes(M == null ? void 0 : M.toLowerCase()) : (w = W == null ? void 0 : W.label) == null ? void 0 : w.toLowerCase().includes(M == null ? void 0 : M.toLowerCase());\n }\n );\n u(N);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n y();\n }, [M]);\n const z = (N, W) => {\n let T = [];\n W == null || W.filter((x) => {\n x.value != N.value && T.push(x);\n }), b(T), r && r(T), O(T);\n };\n return /* @__PURE__ */ c1(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [\n t && /* @__PURE__ */ A(nz, { children: /* @__PURE__ */ A(\n yc,\n {\n label: l,\n getValue: m,\n value: c,\n placeholder: s\n }\n ) }),\n /* @__PURE__ */ A(DP, { children: n && (h == null ? void 0 : h.map((N) => /* @__PURE__ */ A(Xk, { children: /* @__PURE__ */ A(KF, { children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: N.label }),\n (N == null ? void 0 : N.label) && /* @__PURE__ */ A(\n di,\n {\n onClick: () => z(N, h),\n children: /* @__PURE__ */ A(\n f0,\n {\n name: "Close",\n color: `${Ct.black}`,\n size: "xxs"\n }\n )\n }\n )\n ] }) }) }))) }),\n /* @__PURE__ */ A(\n Rn,\n {\n ...e,\n defaultValues: o,\n selectedLists: h,\n data: d || i,\n selectedOptions: v,\n resetList: f,\n highLightSelectedOptions: n,\n maxheight: 245\n }\n )\n ] });\n}\nfunction K6(e) {\n const {\n onApplyFilter: t,\n value: r = null,\n data: n,\n isDisabled: o,\n buttonText: i,\n onClearFilter: a,\n label: s,\n isFilterCleard: l,\n ...c\n } = e, [p, d] = Ta(!1), [u, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [b, M] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(), [C, g] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [f, O] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0), m = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n t && t(b), d();\n }, [t, d, u]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var W;\n b && ((W = Object.keys(b)) != null && W.length) || b != null && b.length ? O(!1) : O(!0);\n }, [b]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n M(r), h(r), g(!0);\n }, [r, p]);\n const v = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n h(""), M([]), a && a(), d();\n }, [a]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n l || M([]);\n }, [l]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n var T, x;\n let W;\n if (typeof u == "object" || typeof r == "object")\n W = !!(u && ((T = Object.keys(u)) == null ? void 0 : T.length) > 0 || r && ((x = Object.keys(r)) == null ? void 0 : x.length) > 0);\n else {\n let E = r;\n W = !!((u == null ? void 0 : u.length) > 0 || E && (E == null ? void 0 : E.length) > 0);\n }\n W !== C && g(W);\n }, [r, u, C]);\n let y = r;\n const z = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(\n () => /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: Array.isArray(b) && Array.isArray(r) ? /* @__PURE__ */ A(\n Ai,\n {\n isDisabled: o,\n $isActive: p,\n onClick: d,\n isFiltered: !!(!p && r),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: i }),\n /* @__PURE__ */ A(c8, { children: /* @__PURE__ */ A(l2, { count: r == null ? void 0 : r.length }) }),\n r == null && !p ? /* @__PURE__ */ A(\n f0,\n {\n name: p ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n ) : (r == null ? void 0 : r.length) > 0 && !p ? /* @__PURE__ */ A(di, { onClick: v, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) }) : /* @__PURE__ */ A(\n f0,\n {\n name: p ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n )\n ] })\n }\n ) : /* @__PURE__ */ A(\n Ai,\n {\n isDisabled: o,\n $isActive: p,\n onClick: d,\n isFiltered: !!(!p && r),\n children: /* @__PURE__ */ c1(go, { children: [\n /* @__PURE__ */ A(Kr, { children: r && (y == null ? void 0 : y.label) || i }),\n r == null && !p ? /* @__PURE__ */ A(\n f0,\n {\n name: p ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n ) : typeof r == "object" && !p ? /* @__PURE__ */ A(di, { onClick: v, children: /* @__PURE__ */ A(f0, { name: "Close", color: `${Ct.black}`, size: "xxs" }) }) : /* @__PURE__ */ A(\n f0,\n {\n name: p ? "ChevronUpDropdown" : "ChevronDownDropdown",\n size: "xxs"\n }\n )\n ] })\n }\n ) }),\n [\n d,\n p,\n o,\n r,\n i,\n b\n ]\n ), N = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (W) => {\n W.length ? (M(W), h(W), g(!0)) : typeof W == "object" && (M(W), h(W.label), g(!0));\n },\n [u]\n );\n return /* @__PURE__ */ A(\n _4,\n {\n ...c,\n button: z,\n isShowed: p,\n isFilterValueChanged: C,\n onApplyFilter: m,\n isEnableApplyBtn: f,\n onClearFilter: v,\n handleDropdownShowed: d,\n children: /* @__PURE__ */ A(\n _5,\n {\n ...c,\n data: n,\n getFilteredValue: N,\n isSearchable: !0,\n values: b,\n label: s\n }\n )\n }\n );\n}\nconst ZF = ({\n filterData: e,\n handleFilterValue: t,\n filterValues: r,\n clearFilter: n,\n defaultFilterValues: o\n}) => {\n function i(p) {\n return p == null ? void 0 : p.map((d) => ({\n value: d,\n label: d\n }));\n }\n const [a, s] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n JSON.stringify(r) == "{}" && s(!0);\n }, [r]);\n const l = () => {\n let p = {}, d = [], u, h = { min: null, max: null }, b = [0, 0];\n return o == null || o.map((M) => {\n var C, g;\n M.id == e.columnId && e.type == "dropdown" ? (p.value = M.value, p.label = M.value) : M.id == e.columnId && (e.type == "dropdown-multi" || e.type == "dropdown-multi-chip") ? M != null && M.value && ((C = M == null ? void 0 : M.value) == null ? void 0 : C.length) > 0 && ((g = M == null ? void 0 : M.value) == null || g.map((f) => {\n d.push({\n value: f,\n label: f\n });\n })) : M.id == e.columnId && e.type == "input" ? u = M.value : M.id == e.columnId && e.type == "daterange" ? h = {\n min: M.value[0],\n max: M.value[1]\n } : M.id == e.columnId && e.type == "amount" && (b = M.value);\n }), (d == null ? void 0 : d.length) > 0 ? d : u || (e.type == "daterange" ? h : e.type == "amount" ? b : JSON.stringify(p) == "{}" ? null : p);\n };\n return /* @__PURE__ */ A("div", { children: (() => {\n var p, d, u, h, b, M, C, g, f, O, m, v, y, z, N, W;\n switch (e.type) {\n case "input":\n return /* @__PURE__ */ A(\n iA,\n {\n label: e.filterLabel ? e.filterLabel : nt(e.columnId),\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n onApplyFilter: (T) => {\n t(e.columnId, T);\n },\n value: (o == null ? void 0 : o.length) > 0 ? l() : r[e.columnId] || "",\n onClearFilter: () => n(e.columnId)\n }\n );\n case "dropdown":\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n K6,\n {\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n placeholder: `Search ${e.filterLabel ? e.filterLabel : nt(e.columnId)}`,\n isSearchable: !0,\n data: (p = e == null ? void 0 : e.settings) == null ? void 0 : p.options,\n onApplyFilter: (T) => {\n const x = [T].map(\n (E) => E.value\n );\n t(e.columnId, x);\n },\n defaultValues: (o == null ? void 0 : o.length) > 0 && l(),\n value: (d = i(\n r[e.columnId]\n )) == null ? void 0 : d[0],\n onClearFilter: () => n(e.columnId),\n isFilterCleard: ((u = i(r[e.columnId])) == null ? void 0 : u.length) > 0\n }\n ) });\n case "daterange":\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n QF,\n {\n dateFormat: e != null && e.filterDateFormat ? e == null ? void 0 : e.filterDateFormat : "dd/MM/yyy",\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n onApplyFilter: (T) => {\n t(e.columnId, [T.min, T.max]);\n },\n defaultValue: (o == null ? void 0 : o.length) > 0 && l(),\n value: r[e.columnId] ? {\n min: r[e.columnId][0],\n max: r[e.columnId][1]\n } : {\n min: null,\n max: null\n },\n onClearFilter: () => n(e.columnId)\n }\n ) });\n case "amount":\n return (\n // @ts-ignore\n /* @__PURE__ */ A(\n HI,\n {\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n showDefaultValue: e.type == "amount" && ((h = l()) != null && h.length) ? !1 : a,\n value: r[e.columnId] || [0, 0],\n defaultValue: (o == null ? void 0 : o.length) > 0 && l(),\n onApplyFilter: (T) => {\n t(e.columnId, T), s(!1);\n },\n min: (M = (b = e == null ? void 0 : e.settings) == null ? void 0 : b.value) != null && M.min ? (g = (C = e == null ? void 0 : e.settings) == null ? void 0 : C.value) == null ? void 0 : g.min : null,\n max: (O = (f = e == null ? void 0 : e.settings) == null ? void 0 : f.value) != null && O.max ? (v = (m = e == null ? void 0 : e.settings) == null ? void 0 : m.value) == null ? void 0 : v.max : null,\n onClearFilter: () => {\n n(e.columnId), s(!0);\n }\n }\n )\n );\n case "dropdown-multi":\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n K6,\n {\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n placeholder: `Search ${e.filterLabel ? e.filterLabel : nt(e.columnId)}`,\n isSearchable: !0,\n isMulti: !0,\n data: (y = e == null ? void 0 : e.settings) == null ? void 0 : y.options,\n onApplyFilter: (T) => {\n const x = T.map(\n (E) => E.value\n );\n t(e.columnId, x);\n },\n defaultValues: (o == null ? void 0 : o.length) > 0 && l(),\n value: i(\n r[e.columnId]\n ),\n onClearFilter: () => n(e.columnId),\n isFilterCleard: ((z = i(r[e.columnId])) == null ? void 0 : z.length) > 0\n }\n ) });\n case "dropdown-multi-chip":\n return /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n K6,\n {\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n placeholder: `Search ${e.filterLabel ? e.filterLabel : nt(e.columnId)}`,\n isSearchable: !0,\n isMulti: !0,\n highLightSelectedOptions: !0,\n data: (N = e == null ? void 0 : e.settings) == null ? void 0 : N.options,\n onApplyFilter: (T) => {\n const x = T.map(\n (E) => E.value\n );\n t(e.columnId, x);\n },\n defaultValues: (o == null ? void 0 : o.length) > 0 && l(),\n value: i(\n r[e.columnId]\n ),\n onClearFilter: () => n(e.columnId),\n isFilterCleard: ((W = i(r[e.columnId])) == null ? void 0 : W.length) > 0\n }\n ) });\n default:\n return /* @__PURE__ */ A(\n iA,\n {\n label: e.filterLabel ? e.filterLabel : nt(e.columnId),\n buttonText: e.filterLabel ? e.filterLabel : nt(e.columnId),\n onApplyFilter: (T) => {\n t(e.columnId, T);\n },\n value: (o == null ? void 0 : o.length) > 0 ? l() : r[e.columnId] || "",\n onClearFilter: () => n(e.columnId)\n }\n );\n }\n })() });\n}, JF = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n margin-left: auto;\n align-items: flex-start;\n\n .skeleton-child-container {\n display: flex;\n margin-left: auto;\n align-items: flex-start;\n > * {\n margin-left: ${({ theme: e }) => e.spacings.sp8};\n }\n }\n`, _F = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n ${In} {\n min-width: max-content;\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n display: flex;\n align-items: center;\n margin-bottom: ${({ theme: e }) => e.spacings.sp8};\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n\n > * {\n margin-right: ${({ theme: e }) => e.spacings.sp8};\n }\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t14};\n line-height: ${e.lineHeight.lh22};\n color: ${e.colors.blue};\n padding: 0.3125rem 0.625rem;\n cursor: pointer;\n user-select: none;\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\nconst $F = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n margin-bottom: 8px;\n > div {\n padding: 0;\n }\n\n ${(e) => e.loading && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-left: 10px;\n .skeleton-container {\n div {\n opacity: 0;\n }\n }\n `}\n`, eU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n gap: 4px;\n padding: 8px 0 0 0px;\n`, tU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)``, rU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n > div {\n padding: 0;\n }\n`, nU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: flex-start;\n gap: 8px;\n align-items: stretch;\n`, Z6 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n ${(e) => e.$items === "tabs" && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-basis: 136px;\n `}\n\n ${(e) => e.$items === "divider" && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-basis: 4px;\n `}\n\n ${(e) => e.$items === "content" && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n flex-grow: 1;\n `}\n\n ${(e) => e.$tabsMaxHeight == !0 && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .scrollbar-container {\n padding-right: 10px;\n }\n `}\n`, oU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n .date-range-container {\n display: flex;\n justify-content: space-between;\n\n align-items: center;\n gap: 16px;\n & > div {\n margin-top: 0;\n }\n }\n`, iU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 4px;\n width: 100%;\n`, bz = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(Tt)(\n ({ theme: { borderRadius: e }, size: t, buttonType: r }) => {\n const n = t === k7.SMALL;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${Ia} {\n width: ${n ? "12px" : "16px"};\n padding: ${n ? "7px" : "9px"};\n * {\n max-width: 100%;\n height: 100%;\n }\n border-radius: ${e.base};\n ${r == On.MINI && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 10px;\n padding: 5px;\n & svg {\n width: 10px;\n }\n `}\n }\n `;\n }\n), ca = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(bz)(\n ({ theme: { colors: e, shadows: t }, buttonType: r }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: 3px;\n min-width: auto;\n ${r == On.MINI && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgPrimary};\n color: ${e.textIcon.textPrimary};\n padding: 0px;\n box-shadow: none;\n min-height: 20px;\n min-width: 20px;\n max-height: 20px;\n max-width: 20px;\n display: block;\n box-sizing: border-box;\n &:not(:disabled):hover {\n background-color: ${e.backgrounds.bgHoverPrimary};\n color: ${e.textIcon.textPrimary};\n padding: 0px;\n box-shadow: none;\n }\n &:not(:disabled):focus {\n background-color: ${e.backgrounds.bgPrimary};\n color: ${e.textIcon.textPrimary};\n }\n &:not(:disabled):active {\n background-color: ${e.backgrounds.bgPressed};\n color: ${e.textIcon.textTertiary};\n padding: 0px;\n box-shadow: none;\n }\n &[aria-disabled=\'true\'] {\n background-color: ${e.backgrounds.bgDisabledPrimary};\n color: ${e.textIcon.textDisabledOnbg};\n }\n `}\n `\n);\nfunction Rt(e) {\n const {\n name: t,\n tooltipText: r,\n isDisabled: n,\n isTooltip: o,\n toolTipPosition: i,\n buttonType: a,\n ...s\n } = e;\n return /* @__PURE__ */ c1(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: [\n a == On.MINI && (o && !n ? /* @__PURE__ */ A(v2, { text: r, place: i, size: "mini", children: /* @__PURE__ */ A(\n ca,\n {\n isDisabled: n,\n buttonType: a,\n ...s,\n children: /* @__PURE__ */ A(f0, { name: t, size: "xxxs" })\n }\n ) }) : /* @__PURE__ */ A(\n ca,\n {\n isDisabled: n,\n buttonType: a,\n ...s,\n children: /* @__PURE__ */ A(f0, { name: t })\n }\n )),\n a != On.MINI && /* @__PURE__ */ A(\n ca,\n {\n isDisabled: n,\n buttonType: a,\n ...s,\n children: /* @__PURE__ */ A(f0, { name: t })\n }\n )\n ] });\n}\nconst s2 = (e) => {\n let t = e == null ? void 0 : e.replace(/#/, "");\n (t == null ? void 0 : t.length) === 3 && (t = t[0] + t[0] + t[1] + t[1] + t[2] + t[2]);\n const r = parseInt(t, 16), n = r >> 16 & 255, o = r >> 8 & 255, i = r & 255;\n return `${n},${o},${i}`;\n}, aU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => {\n const t = `rgba(${s2(e.backgrounds.blackOverlay)}, 0.6)`;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: ${t};\n z-index: 2;\n `;\n }\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n /* width: 320px; */\n position: relative;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: calc(100% - 40px);\n height: 500px;\n margin-bottom: 10px;\n padding: 20px;\n position: relative;\n`;\nconst sU = ({}, e) => /* @__PURE__ */ A(aU, { ref: e }), lU = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(sU), $5 = {\n SMALL: lt.SMALL,\n MEDIUM: lt.MEDIUM,\n LARGE: lt.LARGE\n}, cU = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t12};\n font-weight: ${e.fontWeight.regular};\n line-height: ${e.lineHeight.lh18};\n color: ${e.colors.black};\n //user-select: none;\n `}\n`, pU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { colors: e, GLOBAL_ITEM_HEIGHT_CONDENSED: t, spacings: r },\n tableRowCell: n,\n loading: o\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100%;\n height: ${n ? "24px" : t};\n background-color: transparent;\n box-sizing: border-box;\n padding: 2px ${r.sp4};\n border-bottom: ${n || o ? "none" : `1px solid ${e.dataTable.dataTableBorderHeader}`};\n ${cU}\n `\n), dU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n height: 100%;\n display: flex;\n justify-content: center;\n flex-direction: column;\n`, hz = ({\n children: e,\n tableRowCell: t,\n loading: r,\n ...n\n}) => /* @__PURE__ */ A(pU, { tableRowCell: t, loading: r, ...n, children: /* @__PURE__ */ A(dU, { children: e }) }), Mz = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(hz)`\n padding: 0 8px;\n`, AU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { mixins: e, typography: t, fontWeight: r, colors: n }, fontSize: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${e.ellipsis}\n font-size: ${o === "xs" ? t.t10 : "11px"};\n font-weight: ${r.light};\n color: ${n.textIcon.textBody};\n `\n), Gu = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAECAYAAABLLYUHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA4SURBVHgBFYoxEQAwCANLFSChkiqpLjimWOzKAoQMSe7vZTEANCIg7n6rCmS6M1N5/hgyZWaH8xoY0hGjnTH2YAAAAABJRU5ErkJggg==", ju = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAECAYAAABLLYUHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA/SURBVHgBATQAy/8AmJiYn5eXlyAAAAAAAZiYmP8AAADg////gQIAAAAAAAAAEAICAvAEAAAAsAcHB2FhYWHwzmIPuHsaJu8AAAAASUVORK5CYII=", Ku = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA+SURBVHgBATMAzP8AAAAAAJeXl2CZmZlQAAAAAAGXl5cgAQEBvwAAABAHBwchBAEBAX8AAAAgAAAAAPr6+p8ctQtiqvlgDAAAAABJRU5ErkJggg==", Zu = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA4SURBVHgBJYhRDQAgCAWf/lCPCBrFFMCfDaxkBBsgym233a6o6gLASGYloh5xwu3u428zYxFpry8+sg1vQIIZMwAAAABJRU5ErkJggg==";\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n max-width: 95vw;\n min-width: 95vw;\n `);\nconst uU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), bU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { colors: e, borderRadius: t }, loading: r, $hideOverflow: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n border: ${r ? "transparent" : `1px solid ${e.border.borderTertiary}`};\n max-height: 500px;\n max-width: 100%;\n overflow: ${r ? "hidden" : "auto"};\n border-top-left-radius: ${t.base};\n border-top-right-radius: ${t.base};\n position: relative;\n\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n overflow: hidden;\n `}\n\n /* sticky columns */\n .sticky {\n position: sticky;\n left: 0;\n z-index: 9;\n background-color: ${e.dataTable.dataTableBgFilter};\n th {\n background: ${e.dataTable.dataTableBgHeader};\n }\n }\n\n /* Scrollbar */\n\n &::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n }\n\n &::-webkit-scrollbar-corner {\n border: 1px solid #e1e3e1;\n }\n\n &::-webkit-scrollbar-button:start {\n display: none;\n }\n &::-webkit-scrollbar-button:end {\n display: block;\n }\n\n &::-webkit-scrollbar:horizontal:corner-present {\n border-right-width: 0px;\n }\n\n /* &::-webkit-scrollbar-thumb:horizontal {\n background-color: ${e.veryLightGrey};\n border-radius: ${t.lg};\n min-width: 20px;\n height: 30%;\n } */\n\n &::-webkit-scrollbar-thumb:horizontal {\n background-color: ${e.scroll.scrollBgDefault};\n background-clip: content-box;\n border: 2px solid transparent;\n box-shadow: inset 0 0 0 4px ${e.scroll.scrollBgDefault};\n border-radius: ${t.lg};\n }\n\n &::-webkit-scrollbar-track-piece:horizontal:start {\n margin-left: 0px;\n }\n &::-webkit-scrollbar-track-piece:horizontal:end {\n margin-right: 0px;\n }\n\n &::-webkit-scrollbar-track-piece:horizontal:decrement {\n background-color: ${e.scroll.scrollBgPrimary};\n border-top: 1px solid ${e.border.borderPrimary};\n background-clip: content-box;\n }\n\n &::-webkit-scrollbar-track-piece:horizontal:increment {\n background-color: ${e.scroll.scrollBgPrimary};\n border-top: 1px solid ${e.border.borderPrimary};\n background-clip: content-box;\n }\n\n &::-webkit-scrollbar-button:horizontal {\n height: 12px;\n }\n\n &::-webkit-scrollbar-button:horizontal:decrement {\n background-image: url(${Gu});\n background-size: inherit;\n background-repeat: no-repeat;\n background-position: 5px 3px, 0 0;\n height: 16px;\n background-color: ${e.backgrounds.bgPrimary};\n border: 1px solid ${e.border.borderTertiary};\n }\n\n &::-webkit-scrollbar-button:horizontal:decrement:active {\n background-image: url(${Gu});\n background-color: ${e.veryLightGrey};\n }\n\n &::-webkit-scrollbar-button:horizontal:increment {\n background-image: url(${ju});\n background-repeat: no-repeat;\n background-size: inherit;\n background-position: 5px 3px, 0 0;\n background-color: ${e.backgrounds.bgPrimary};\n height: 14px;\n border: 1px solid ${e.border.borderTertiary};\n }\n\n &::-webkit-scrollbar-button:horizontal:increment:active {\n background-image: url(${ju});\n background-color: ${e.veryLightGrey};\n }\n\n &::-webkit-scrollbar-button:horizontal:end:increment:corner-present {\n border-right-width: 0;\n }\n\n &::-webkit-scrollbar:vertical:corner-present {\n border-bottom-width: 0;\n }\n\n /* &::-webkit-scrollbar-thumb:vertical {\n background-color: ${e.veryLightGrey};\n border-radius: ${t.lg};\n min-height: 20px;\n } */\n\n &::-webkit-scrollbar-thumb:vertical {\n background-color: transparent;\n background-clip: content-box;\n border: 2px solid transparent;\n box-shadow: inset 0 0 0 4px ${e.veryLightGrey};\n border-radius: ${t.lg};\n }\n\n &::-webkit-scrollbar-track-piece:vertical:start {\n margin-top: 0px;\n }\n &::-webkit-scrollbar-track-piece:vertical:end {\n margin-bottom: 0px;\n }\n\n &::-webkit-scrollbar-track-piece:vertical:decrement {\n background-color: ${e.white};\n border-left: 1px solid #f2f2f2;\n }\n &::-webkit-scrollbar-track-piece:vertical:increment {\n background-color: ${e.white};\n border-left: 1px solid #f2f2f2;\n }\n &::-webkit-scrollbar-button:vertical {\n height: 13px;\n }\n &::-webkit-scrollbar-button:vertical:decrement {\n background-image: url(${Ku});\n background-size: inherit;\n background-repeat: no-repeat;\n background-position: 3px 3px, 0 0;\n height: 13px;\n background-color: #f8f8f8;\n border: 1px solid #e1e3e1;\n }\n &::-webkit-scrollbar-button:vertical:decrement:active {\n background-image: url(${Ku});\n background-color: ${e.veryLightGrey};\n }\n &::-webkit-scrollbar-button:vertical:increment {\n background-image: url(${Zu});\n background-size: inherit;\n background-repeat: no-repeat;\n background-position: 3px 3px, 0 0;\n height: 12px;\n background-color: #f8f8f8;\n border: 1px solid #e1e3e1;\n }\n &::-webkit-scrollbar-button:vertical:increment:active {\n background-image: url(${Zu});\n background-color: ${e.veryLightGrey};\n }\n &::-webkit-scrollbar-button:vertical:end:increment:corner-present {\n border-bottom-width: 0;\n height: 11px;\n }\n &::-webkit-scrollbar:disabled {\n -webkit-border-image: none;\n display: none;\n }\n\n /* Scrollbar */\n `), hU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { borderRadius: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: fit-content;\n border-radius: ${e.base};\n position: relative;\n border-spacing: 0px;\n\n .table-scroll-container {\n padding-right: 0px;\n }\n width: auto;\n `), MU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n position: sticky;\n top: 0;\n z-index: 10;\n table-layout: fixed;\n`, fU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n .table-scroll-container {\n padding-right: 0px !important;\n }\n`, gU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n position: sticky;\n bottom: 0;\n z-index: 1;\n`, Ju = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, loading: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n width: 100%;\n background: ${t ? "transparent" : e.dataTable.dataTableBgPrimary};\n border-top: ${t ? "transparent" : `1px solid ${e.dataTable.dataTableBorderCell}`};\n &:first-child {\n border-top: none;\n }\n .table-body-column {\n border-right: ${t ? "transparent" : `1px solid ${e.dataTable.dataTableBorderCell}`};\n }\n &:hover {\n ${!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgHoverPrimary} !important;\n `}\n }\n `\n), zU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n () => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n width: 100%;\n ${Mz} {\n background-color: #fbfbfb;\n }\n `\n), CU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, isLoading: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: inline-flex;\n width: 100%;\n background: ${t ? "transparent" : e.dataTable.dataTableBgHeader};\n `\n), OU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n () => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n &.header-last-row {\n display: flex;\n flex-direction: column;\n }\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 4px;\n`;\nconst r9 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n\n ${(e) => e.filterState && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100vw;\n `}\n ${(e) => !e.filterState && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n max-width: 100%;\n `}\n`, fz = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n width: 262px;\n text-align: center;\n`, gz = styled_components__WEBPACK_IMPORTED_MODULE_1___default().h1(\n ({ theme: { colors: e, typography: t, fontWeight: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${t.t14};\n font-weight: ${r.medium};\n color: ${e.textIcon.textPrimary};\n margin-top: 24px;\n `\n), zz = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: { colors: e, typography: t, fontWeight: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${t.t12};\n font-weight: ${r.regular};\n color: ${e.textIcon.textLowemphasis};\n margin: 0;\n line-height: 20px;\n `\n), mU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n margin-top: 10px;\n`, vU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().td(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: 0 10px;\n color: ${e.textIcon.textBody};\n `\n), yU = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n`, LU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ $isSwitch: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n ${e && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n justify-content: space-between;\n `}\n `\n), wU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t, typography: r, fontWeight: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n gap: ${e.sp4};\n margin-right: 20px;\n span {\n margin-left: ${e.sp4};\n color: ${t.textIcon.textMediumemphasis};\n font-size: ${r.t10};\n font-weight: ${n.regular};\n }\n `\n), _u = 4, qU = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n 0% {\n transform: translateY(-10px);\n }\n 100% {\n transform: translateY(0px);\n }\n`, xU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { cubicBezier: e, animations: t, spacings: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n position: fixed;\n z-index: 11;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${r.sp48};\n animation-duration: 0.3s;\n animation-timing-function: ${e};\n animation-fill-mode: forwards;\n animation-name: ${t.fadeIn};\n `\n), RU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { colors: e, cubicBezier: t, spacings: r },\n size: n,\n isResize: o,\n isFilterModal: i,\n isTableModal: a\n }) => {\n let s;\n switch (n) {\n case $5.LARGE:\n s = 1264;\n break;\n case $5.MEDIUM:\n s = 612;\n break;\n case $5.SMALL:\n default:\n s = 464;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n z-index: 3;\n width: ${s}px;\n max-width: 100%;\n max-height: 100%;\n background-color: ${e.backgrounds.bgPrimary};\n box-sizing: border-box;\n animation-duration: 1.5s;\n animation-timing-function: ${t};\n animation-fill-mode: forwards;\n animation-name: ${qU};\n border-radius: ${r.sp8};\n resize: ${o ? "both" : "none"};\n h3 {\n margin: 0;\n padding: 12px 12px ${r.sp8} ${r.sp16};\n }\n .close-btn {\n .icon-system {\n color: ${e.textIcon.textPrimary};\n }\n position: absolute;\n z-index: 1;\n top: ${r.sp12};\n right: ${r.sp12};\n background-color: ${e.backgrounds.bgPrimary};\n box-shadow: none;\n }\n ${!i && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n overflow-y: auto;\n `}\n\n ${a && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${r9} {\n width: 100%;\n }\n `}\n `;\n }\n), BU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: flex-end;\n flex-wrap: wrap;\n padding: ${e.sp12};\n ${In} {\n margin-left: ${e.sp8};\n }\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: { colors: e, lineHeight: t, typography: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${r.t14};\n line-height: ${t.lh22};\n color: ${e.grey};\n margin: 0;\n `\n);\nconst WU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().h3(\n ({ theme: { colors: e, lineHeight: t, typography: r, fontWeight: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${r.t18};\n line-height: ${t.lh32};\n font-weight: ${n.medium};\n color: ${e.textIcon.textHighemphasis};\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n border-left: 2px solid rgba(229, 229, 229, 1);\n height: 28px;\n margin: 12px;\n`;\nconst EU = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t, borderRadius: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: ${e.sp6};\n margin: 10px;\n overflow: hidden;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n height: ${_u}px;\n width: ${_u}px;\n }\n &::-webkit-scrollbar-track {\n background-color: ${t.scroll.scrollBgPrimary};\n border-radius: ${r.xl};\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: ${t.scroll.scrollBgDefault};\n }\n /* Handle on hover */\n &::-webkit-scrollbar-thumb:hover {\n background-color: ${t.scroll.scrollBgHover};\n }\n &::-webkit-scrollbar-thumb:active {\n background-color: ${t.scroll.scrollBgPressed};\n }\n `\n);\nfunction SU({\n isOpen: e = !1,\n size: t = $5.SMALL,\n hasCloseButton: r = !1,\n preventCloseOnClickOutside: n = !1,\n onClose: o,\n children: i,\n container: a,\n actionsGroup: s,\n title: l,\n isResize: c,\n isFilterModal: p,\n isTableModal: d\n}, u) {\n const h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n return fc(h, !n, o), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (e && (window.document.body.style.overflow = "hidden"), () => {\n window.document.body.style.overflow = "visible";\n }), [e]), e ? /* @__PURE__ */ A(Jf, { container: a, children: /* @__PURE__ */ c1(xU, { ref: u, children: [\n /* @__PURE__ */ A(lU, {}),\n /* @__PURE__ */ c1(\n RU,\n {\n size: t,\n ref: h,\n isResize: c,\n isFilterModal: p,\n isTableModal: d,\n children: [\n /* @__PURE__ */ c1("div", { children: [\n typeof l == "string" ? /* @__PURE__ */ c1(S0, { children: [\n /* @__PURE__ */ A(WU, { children: l }),\n /* @__PURE__ */ A(a2, { $default: !0 })\n ] }) : /* @__PURE__ */ c1(S0, { children: [\n l,\n /* @__PURE__ */ A(a2, { $default: !0 })\n ] }),\n r && /* @__PURE__ */ A(\n Rt,\n {\n buttonType: "tertiary",\n name: "Cross",\n className: "close-btn",\n onClick: o,\n size: "sm"\n }\n )\n ] }),\n /* @__PURE__ */ A(EU, { children: i }),\n /* @__PURE__ */ A("div", { children: s && /* @__PURE__ */ c1(S0, { children: [\n /* @__PURE__ */ A(a2, { $default: !0 }),\n /* @__PURE__ */ A(BU, { children: s })\n ] }) })\n ]\n }\n )\n ] }) }) : null;\n}\nconst kU = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(SU);\nvar R8 = { exports: {} }, B8 = { exports: {} };\n/*!\n * perfect-scrollbar v1.5.6\n * Copyright 2024 Hyunje Jun, MDBootstrap and Contributors\n * Licensed under MIT\n */\nfunction Vr(e) {\n return getComputedStyle(e);\n}\nfunction f2(e, t) {\n for (var r in t) {\n var n = t[r];\n typeof n == "number" && (n = n + "px"), e.style[r] = n;\n }\n return e;\n}\nfunction d5(e) {\n var t = document.createElement("div");\n return t.className = e, t;\n}\nvar $u = typeof Element < "u" && (Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector);\nfunction oo(e, t) {\n if (!$u)\n throw new Error("No element matching method supported");\n return $u.call(e, t);\n}\nfunction ta(e) {\n e.remove ? e.remove() : e.parentNode && e.parentNode.removeChild(e);\n}\nfunction eb(e, t) {\n return Array.prototype.filter.call(\n e.children,\n function(r) {\n return oo(r, t);\n }\n );\n}\nvar zt = {\n main: "ps",\n rtl: "ps__rtl",\n element: {\n thumb: function(e) {\n return "ps__thumb-" + e;\n },\n rail: function(e) {\n return "ps__rail-" + e;\n },\n consuming: "ps__child--consume"\n },\n state: {\n focus: "ps--focus",\n clicking: "ps--clicking",\n active: function(e) {\n return "ps--active-" + e;\n },\n scrolling: function(e) {\n return "ps--scrolling-" + e;\n }\n }\n}, Cz = { x: null, y: null };\nfunction Oz(e, t) {\n var r = e.element.classList, n = zt.state.scrolling(t);\n r.contains(n) ? clearTimeout(Cz[t]) : r.add(n);\n}\nfunction mz(e, t) {\n Cz[t] = setTimeout(\n function() {\n return e.isAlive && e.element.classList.remove(zt.state.scrolling(t));\n },\n e.settings.scrollingThreshold\n );\n}\nfunction NU(e, t) {\n Oz(e, t), mz(e, t);\n}\nvar ts = function(t) {\n this.element = t, this.handlers = {};\n}, vz = { isEmpty: { configurable: !0 } };\nts.prototype.bind = function(t, r) {\n typeof this.handlers[t] > "u" && (this.handlers[t] = []), this.handlers[t].push(r), this.element.addEventListener(t, r, !1);\n};\nts.prototype.unbind = function(t, r) {\n var n = this;\n this.handlers[t] = this.handlers[t].filter(function(o) {\n return r && o !== r ? !0 : (n.element.removeEventListener(t, o, !1), !1);\n });\n};\nts.prototype.unbindAll = function() {\n for (var t in this.handlers)\n this.unbind(t);\n};\nvz.isEmpty.get = function() {\n var e = this;\n return Object.keys(this.handlers).every(\n function(t) {\n return e.handlers[t].length === 0;\n }\n );\n};\nObject.defineProperties(ts.prototype, vz);\nvar Pa = function() {\n this.eventElements = [];\n};\nPa.prototype.eventElement = function(t) {\n var r = this.eventElements.filter(function(n) {\n return n.element === t;\n })[0];\n return r || (r = new ts(t), this.eventElements.push(r)), r;\n};\nPa.prototype.bind = function(t, r, n) {\n this.eventElement(t).bind(r, n);\n};\nPa.prototype.unbind = function(t, r, n) {\n var o = this.eventElement(t);\n o.unbind(r, n), o.isEmpty && this.eventElements.splice(this.eventElements.indexOf(o), 1);\n};\nPa.prototype.unbindAll = function() {\n this.eventElements.forEach(function(t) {\n return t.unbindAll();\n }), this.eventElements = [];\n};\nPa.prototype.once = function(t, r, n) {\n var o = this.eventElement(t), i = function(a) {\n o.unbind(r, i), n(a);\n };\n o.bind(r, i);\n};\nfunction A5(e) {\n if (typeof window.CustomEvent == "function")\n return new CustomEvent(e);\n var t = document.createEvent("CustomEvent");\n return t.initCustomEvent(e, !1, !1, void 0), t;\n}\nfunction Hl(e, t, r, n, o) {\n n === void 0 && (n = !0), o === void 0 && (o = !1);\n var i;\n if (t === "top")\n i = ["contentHeight", "containerHeight", "scrollTop", "y", "up", "down"];\n else if (t === "left")\n i = ["contentWidth", "containerWidth", "scrollLeft", "x", "left", "right"];\n else\n throw new Error("A proper axis should be provided");\n IU(e, r, i, n, o);\n}\nfunction IU(e, t, r, n, o) {\n var i = r[0], a = r[1], s = r[2], l = r[3], c = r[4], p = r[5];\n n === void 0 && (n = !0), o === void 0 && (o = !1);\n var d = e.element;\n e.reach[l] = null, d[s] < 1 && (e.reach[l] = "start"), d[s] > e[i] - e[a] - 1 && (e.reach[l] = "end"), t && (d.dispatchEvent(A5("ps-scroll-" + l)), t < 0 ? d.dispatchEvent(A5("ps-scroll-" + c)) : t > 0 && d.dispatchEvent(A5("ps-scroll-" + p)), n && NU(e, l)), e.reach[l] && (t || o) && d.dispatchEvent(A5("ps-" + l + "-reach-" + e.reach[l]));\n}\nfunction ot(e) {\n return parseInt(e, 10) || 0;\n}\nfunction TU(e) {\n return oo(e, "input,[contenteditable]") || oo(e, "select,[contenteditable]") || oo(e, "textarea,[contenteditable]") || oo(e, "button,[contenteditable]");\n}\nfunction DU(e) {\n var t = Vr(e);\n return ot(t.width) + ot(t.paddingLeft) + ot(t.paddingRight) + ot(t.borderLeftWidth) + ot(t.borderRightWidth);\n}\nvar Zi = {\n isWebKit: typeof document < "u" && "WebkitAppearance" in document.documentElement.style,\n supportsTouch: typeof window < "u" && ("ontouchstart" in window || "maxTouchPoints" in window.navigator && window.navigator.maxTouchPoints > 0 || window.DocumentTouch && document instanceof window.DocumentTouch),\n supportsIePointer: typeof navigator < "u" && navigator.msMaxTouchPoints,\n isChrome: typeof navigator < "u" && /Chrome/i.test(navigator && navigator.userAgent)\n};\nfunction Bn(e) {\n var t = e.element, r = Math.floor(t.scrollTop), n = t.getBoundingClientRect();\n e.containerWidth = Math.floor(n.width), e.containerHeight = Math.floor(n.height), e.contentWidth = t.scrollWidth, e.contentHeight = t.scrollHeight, t.contains(e.scrollbarXRail) || (eb(t, zt.element.rail("x")).forEach(function(o) {\n return ta(o);\n }), t.appendChild(e.scrollbarXRail)), t.contains(e.scrollbarYRail) || (eb(t, zt.element.rail("y")).forEach(function(o) {\n return ta(o);\n }), t.appendChild(e.scrollbarYRail)), !e.settings.suppressScrollX && e.containerWidth + e.settings.scrollXMarginOffset < e.contentWidth ? (e.scrollbarXActive = !0, e.railXWidth = e.containerWidth - e.railXMarginWidth, e.railXRatio = e.containerWidth / e.railXWidth, e.scrollbarXWidth = tb(e, ot(e.railXWidth * e.containerWidth / e.contentWidth)), e.scrollbarXLeft = ot(\n (e.negativeScrollAdjustment + t.scrollLeft) * (e.railXWidth - e.scrollbarXWidth) / (e.contentWidth - e.containerWidth)\n )) : e.scrollbarXActive = !1, !e.settings.suppressScrollY && e.containerHeight + e.settings.scrollYMarginOffset < e.contentHeight ? (e.scrollbarYActive = !0, e.railYHeight = e.containerHeight - e.railYMarginHeight, e.railYRatio = e.containerHeight / e.railYHeight, e.scrollbarYHeight = tb(\n e,\n ot(e.railYHeight * e.containerHeight / e.contentHeight)\n ), e.scrollbarYTop = ot(\n r * (e.railYHeight - e.scrollbarYHeight) / (e.contentHeight - e.containerHeight)\n )) : e.scrollbarYActive = !1, e.scrollbarXLeft >= e.railXWidth - e.scrollbarXWidth && (e.scrollbarXLeft = e.railXWidth - e.scrollbarXWidth), e.scrollbarYTop >= e.railYHeight - e.scrollbarYHeight && (e.scrollbarYTop = e.railYHeight - e.scrollbarYHeight), HU(t, e), e.scrollbarXActive ? t.classList.add(zt.state.active("x")) : (t.classList.remove(zt.state.active("x")), e.scrollbarXWidth = 0, e.scrollbarXLeft = 0, t.scrollLeft = e.isRtl === !0 ? e.contentWidth : 0), e.scrollbarYActive ? t.classList.add(zt.state.active("y")) : (t.classList.remove(zt.state.active("y")), e.scrollbarYHeight = 0, e.scrollbarYTop = 0, t.scrollTop = 0);\n}\nfunction tb(e, t) {\n return e.settings.minScrollbarLength && (t = Math.max(t, e.settings.minScrollbarLength)), e.settings.maxScrollbarLength && (t = Math.min(t, e.settings.maxScrollbarLength)), t;\n}\nfunction HU(e, t) {\n var r = { width: t.railXWidth }, n = Math.floor(e.scrollTop);\n t.isRtl ? r.left = t.negativeScrollAdjustment + e.scrollLeft + t.containerWidth - t.contentWidth : r.left = e.scrollLeft, t.isScrollbarXUsingBottom ? r.bottom = t.scrollbarXBottom - n : r.top = t.scrollbarXTop + n, f2(t.scrollbarXRail, r);\n var o = { top: n, height: t.railYHeight };\n t.isScrollbarYUsingRight ? t.isRtl ? o.right = t.contentWidth - (t.negativeScrollAdjustment + e.scrollLeft) - t.scrollbarYRight - t.scrollbarYOuterWidth - 9 : o.right = t.scrollbarYRight - e.scrollLeft : t.isRtl ? o.left = t.negativeScrollAdjustment + e.scrollLeft + t.containerWidth * 2 - t.contentWidth - t.scrollbarYLeft - t.scrollbarYOuterWidth : o.left = t.scrollbarYLeft + e.scrollLeft, f2(t.scrollbarYRail, o), f2(t.scrollbarX, {\n left: t.scrollbarXLeft,\n width: t.scrollbarXWidth - t.railBorderXWidth\n }), f2(t.scrollbarY, {\n top: t.scrollbarYTop,\n height: t.scrollbarYHeight - t.railBorderYWidth\n });\n}\nfunction PU(e) {\n e.event.bind(e.scrollbarY, "mousedown", function(t) {\n return t.stopPropagation();\n }), e.event.bind(e.scrollbarYRail, "mousedown", function(t) {\n var r = t.pageY - window.pageYOffset - e.scrollbarYRail.getBoundingClientRect().top, n = r > e.scrollbarYTop ? 1 : -1;\n e.element.scrollTop += n * e.containerHeight, Bn(e), t.stopPropagation();\n }), e.event.bind(e.scrollbarX, "mousedown", function(t) {\n return t.stopPropagation();\n }), e.event.bind(e.scrollbarXRail, "mousedown", function(t) {\n var r = t.pageX - window.pageXOffset - e.scrollbarXRail.getBoundingClientRect().left, n = r > e.scrollbarXLeft ? 1 : -1;\n e.element.scrollLeft += n * e.containerWidth, Bn(e), t.stopPropagation();\n });\n}\nvar u5 = null;\nfunction VU(e) {\n rb(e, [\n "containerHeight",\n "contentHeight",\n "pageY",\n "railYHeight",\n "scrollbarY",\n "scrollbarYHeight",\n "scrollTop",\n "y",\n "scrollbarYRail"\n ]), rb(e, [\n "containerWidth",\n "contentWidth",\n "pageX",\n "railXWidth",\n "scrollbarX",\n "scrollbarXWidth",\n "scrollLeft",\n "x",\n "scrollbarXRail"\n ]);\n}\nfunction rb(e, t) {\n var r = t[0], n = t[1], o = t[2], i = t[3], a = t[4], s = t[5], l = t[6], c = t[7], p = t[8], d = e.element, u = null, h = null, b = null;\n function M(f) {\n f.touches && f.touches[0] && (f[o] = f.touches[0]["page" + c.toUpperCase()]), u5 === a && (d[l] = u + b * (f[o] - h), Oz(e, c), Bn(e), f.stopPropagation(), f.preventDefault());\n }\n function C() {\n mz(e, c), e[p].classList.remove(zt.state.clicking), document.removeEventListener("mousemove", M), document.removeEventListener("mouseup", C), document.removeEventListener("touchmove", M), document.removeEventListener("touchend", C), u5 = null;\n }\n function g(f) {\n u5 === null && (u5 = a, u = d[l], f.touches && (f[o] = f.touches[0]["page" + c.toUpperCase()]), h = f[o], b = (e[n] - e[r]) / (e[i] - e[s]), f.touches ? (document.addEventListener("touchmove", M, { passive: !1 }), document.addEventListener("touchend", C)) : (document.addEventListener("mousemove", M), document.addEventListener("mouseup", C)), e[p].classList.add(zt.state.clicking)), f.stopPropagation(), f.cancelable && f.preventDefault();\n }\n e[a].addEventListener("mousedown", g), e[a].addEventListener("touchstart", g);\n}\nfunction FU(e) {\n var t = e.element, r = function() {\n return oo(t, ":hover");\n }, n = function() {\n return oo(e.scrollbarX, ":focus") || oo(e.scrollbarY, ":focus");\n };\n function o(i, a) {\n var s = Math.floor(t.scrollTop);\n if (i === 0) {\n if (!e.scrollbarYActive)\n return !1;\n if (s === 0 && a > 0 || s >= e.contentHeight - e.containerHeight && a < 0)\n return !e.settings.wheelPropagation;\n }\n var l = t.scrollLeft;\n if (a === 0) {\n if (!e.scrollbarXActive)\n return !1;\n if (l === 0 && i < 0 || l >= e.contentWidth - e.containerWidth && i > 0)\n return !e.settings.wheelPropagation;\n }\n return !0;\n }\n e.event.bind(e.ownerDocument, "keydown", function(i) {\n if (!(i.isDefaultPrevented && i.isDefaultPrevented() || i.defaultPrevented) && !(!r() && !n())) {\n var a = document.activeElement ? document.activeElement : e.ownerDocument.activeElement;\n if (a) {\n if (a.tagName === "IFRAME")\n a = a.contentDocument.activeElement;\n else\n for (; a.shadowRoot; )\n a = a.shadowRoot.activeElement;\n if (TU(a))\n return;\n }\n var s = 0, l = 0;\n switch (i.which) {\n case 37:\n i.metaKey ? s = -e.contentWidth : i.altKey ? s = -e.containerWidth : s = -30;\n break;\n case 38:\n i.metaKey ? l = e.contentHeight : i.altKey ? l = e.containerHeight : l = 30;\n break;\n case 39:\n i.metaKey ? s = e.contentWidth : i.altKey ? s = e.containerWidth : s = 30;\n break;\n case 40:\n i.metaKey ? l = -e.contentHeight : i.altKey ? l = -e.containerHeight : l = -30;\n break;\n case 32:\n i.shiftKey ? l = e.containerHeight : l = -e.containerHeight;\n break;\n case 33:\n l = e.containerHeight;\n break;\n case 34:\n l = -e.containerHeight;\n break;\n case 36:\n l = e.contentHeight;\n break;\n case 35:\n l = -e.contentHeight;\n break;\n default:\n return;\n }\n e.settings.suppressScrollX && s !== 0 || e.settings.suppressScrollY && l !== 0 || (t.scrollTop -= l, t.scrollLeft += s, Bn(e), o(s, l) && i.preventDefault());\n }\n });\n}\nfunction UU(e) {\n var t = e.element;\n function r(a, s) {\n var l = Math.floor(t.scrollTop), c = t.scrollTop === 0, p = l + t.offsetHeight === t.scrollHeight, d = t.scrollLeft === 0, u = t.scrollLeft + t.offsetWidth === t.scrollWidth, h;\n return Math.abs(s) > Math.abs(a) ? h = c || p : h = d || u, h ? !e.settings.wheelPropagation : !0;\n }\n function n(a) {\n var s = a.deltaX, l = -1 * a.deltaY;\n return (typeof s > "u" || typeof l > "u") && (s = -1 * a.wheelDeltaX / 6, l = a.wheelDeltaY / 6), a.deltaMode && a.deltaMode === 1 && (s *= 10, l *= 10), s !== s && l !== l && (s = 0, l = a.wheelDelta), a.shiftKey ? [-l, -s] : [s, l];\n }\n function o(a, s, l) {\n if (!Zi.isWebKit && t.querySelector("select:focus"))\n return !0;\n if (!t.contains(a))\n return !1;\n for (var c = a; c && c !== t; ) {\n if (c.classList.contains(zt.element.consuming))\n return !0;\n var p = Vr(c);\n if (l && p.overflowY.match(/(scroll|auto)/)) {\n var d = c.scrollHeight - c.clientHeight;\n if (d > 0 && (c.scrollTop > 0 && l < 0 || c.scrollTop < d && l > 0))\n return !0;\n }\n if (s && p.overflowX.match(/(scroll|auto)/)) {\n var u = c.scrollWidth - c.clientWidth;\n if (u > 0 && (c.scrollLeft > 0 && s < 0 || c.scrollLeft < u && s > 0))\n return !0;\n }\n c = c.parentNode;\n }\n return !1;\n }\n function i(a) {\n var s = n(a), l = s[0], c = s[1];\n if (!o(a.target, l, c)) {\n var p = !1;\n e.settings.useBothWheelAxes ? e.scrollbarYActive && !e.scrollbarXActive ? (c ? t.scrollTop -= c * e.settings.wheelSpeed : t.scrollTop += l * e.settings.wheelSpeed, p = !0) : e.scrollbarXActive && !e.scrollbarYActive && (l ? t.scrollLeft += l * e.settings.wheelSpeed : t.scrollLeft -= c * e.settings.wheelSpeed, p = !0) : (t.scrollTop -= c * e.settings.wheelSpeed, t.scrollLeft += l * e.settings.wheelSpeed), Bn(e), p = p || r(l, c), p && !a.ctrlKey && (a.stopPropagation(), a.preventDefault());\n }\n }\n typeof window.onwheel < "u" ? e.event.bind(t, "wheel", i) : typeof window.onmousewheel < "u" && e.event.bind(t, "mousewheel", i);\n}\nfunction YU(e) {\n if (!Zi.supportsTouch && !Zi.supportsIePointer)\n return;\n var t = e.element, r = {\n startOffset: {},\n startTime: 0,\n speed: {},\n easingLoop: null\n };\n function n(d, u) {\n var h = Math.floor(t.scrollTop), b = t.scrollLeft, M = Math.abs(d), C = Math.abs(u);\n if (C > M) {\n if (u < 0 && h === e.contentHeight - e.containerHeight || u > 0 && h === 0)\n return window.scrollY === 0 && u > 0 && Zi.isChrome;\n } else if (M > C && (d < 0 && b === e.contentWidth - e.containerWidth || d > 0 && b === 0))\n return !0;\n return !0;\n }\n function o(d, u) {\n t.scrollTop -= u, t.scrollLeft -= d, Bn(e);\n }\n function i(d) {\n return d.targetTouches ? d.targetTouches[0] : d;\n }\n function a(d) {\n return d.target === e.scrollbarX || d.target === e.scrollbarY || d.pointerType && d.pointerType === "pen" && d.buttons === 0 ? !1 : !!(d.targetTouches && d.targetTouches.length === 1 || d.pointerType && d.pointerType !== "mouse" && d.pointerType !== d.MSPOINTER_TYPE_MOUSE);\n }\n function s(d) {\n if (a(d)) {\n var u = i(d);\n r.startOffset.pageX = u.pageX, r.startOffset.pageY = u.pageY, r.startTime = (/* @__PURE__ */ new Date()).getTime(), r.easingLoop !== null && clearInterval(r.easingLoop);\n }\n }\n function l(d, u, h) {\n if (!t.contains(d))\n return !1;\n for (var b = d; b && b !== t; ) {\n if (b.classList.contains(zt.element.consuming))\n return !0;\n var M = Vr(b);\n if (h && M.overflowY.match(/(scroll|auto)/)) {\n var C = b.scrollHeight - b.clientHeight;\n if (C > 0 && (b.scrollTop > 0 && h < 0 || b.scrollTop < C && h > 0))\n return !0;\n }\n if (u && M.overflowX.match(/(scroll|auto)/)) {\n var g = b.scrollWidth - b.clientWidth;\n if (g > 0 && (b.scrollLeft > 0 && u < 0 || b.scrollLeft < g && u > 0))\n return !0;\n }\n b = b.parentNode;\n }\n return !1;\n }\n function c(d) {\n if (a(d)) {\n var u = i(d), h = { pageX: u.pageX, pageY: u.pageY }, b = h.pageX - r.startOffset.pageX, M = h.pageY - r.startOffset.pageY;\n if (l(d.target, b, M))\n return;\n o(b, M), r.startOffset = h;\n var C = (/* @__PURE__ */ new Date()).getTime(), g = C - r.startTime;\n g > 0 && (r.speed.x = b / g, r.speed.y = M / g, r.startTime = C), n(b, M) && d.cancelable && d.preventDefault();\n }\n }\n function p() {\n e.settings.swipeEasing && (clearInterval(r.easingLoop), r.easingLoop = setInterval(function() {\n if (e.isInitialized) {\n clearInterval(r.easingLoop);\n return;\n }\n if (!r.speed.x && !r.speed.y) {\n clearInterval(r.easingLoop);\n return;\n }\n if (Math.abs(r.speed.x) < 0.01 && Math.abs(r.speed.y) < 0.01) {\n clearInterval(r.easingLoop);\n return;\n }\n o(r.speed.x * 30, r.speed.y * 30), r.speed.x *= 0.8, r.speed.y *= 0.8;\n }, 10));\n }\n Zi.supportsTouch ? (e.event.bind(t, "touchstart", s), e.event.bind(t, "touchmove", c), e.event.bind(t, "touchend", p)) : Zi.supportsIePointer && (window.PointerEvent ? (e.event.bind(t, "pointerdown", s), e.event.bind(t, "pointermove", c), e.event.bind(t, "pointerup", p)) : window.MSPointerEvent && (e.event.bind(t, "MSPointerDown", s), e.event.bind(t, "MSPointerMove", c), e.event.bind(t, "MSPointerUp", p)));\n}\nvar XU = function() {\n return {\n handlers: ["click-rail", "drag-thumb", "keyboard", "wheel", "touch"],\n maxScrollbarLength: null,\n minScrollbarLength: null,\n scrollingThreshold: 1e3,\n scrollXMarginOffset: 0,\n scrollYMarginOffset: 0,\n suppressScrollX: !1,\n suppressScrollY: !1,\n swipeEasing: !0,\n useBothWheelAxes: !1,\n wheelPropagation: !0,\n wheelSpeed: 1\n };\n}, QU = {\n "click-rail": PU,\n "drag-thumb": VU,\n keyboard: FU,\n wheel: UU,\n touch: YU\n}, rs = function(t, r) {\n var n = this;\n if (r === void 0 && (r = {}), typeof t == "string" && (t = document.querySelector(t)), !t || !t.nodeName)\n throw new Error("no element is specified to initialize PerfectScrollbar");\n this.element = t, t.classList.add(zt.main), this.settings = XU();\n for (var o in r)\n this.settings[o] = r[o];\n this.containerWidth = null, this.containerHeight = null, this.contentWidth = null, this.contentHeight = null;\n var i = function() {\n return t.classList.add(zt.state.focus);\n }, a = function() {\n return t.classList.remove(zt.state.focus);\n };\n this.isRtl = Vr(t).direction === "rtl", this.isRtl === !0 && t.classList.add(zt.rtl), this.isNegativeScroll = function() {\n var c = t.scrollLeft, p = null;\n return t.scrollLeft = -1, p = t.scrollLeft < 0, t.scrollLeft = c, p;\n }(), this.negativeScrollAdjustment = this.isNegativeScroll ? t.scrollWidth - t.clientWidth : 0, this.event = new Pa(), this.ownerDocument = t.ownerDocument || document, this.scrollbarXRail = d5(zt.element.rail("x")), t.appendChild(this.scrollbarXRail), this.scrollbarX = d5(zt.element.thumb("x")), this.scrollbarXRail.appendChild(this.scrollbarX), this.scrollbarX.setAttribute("tabindex", 0), this.event.bind(this.scrollbarX, "focus", i), this.event.bind(this.scrollbarX, "blur", a), this.scrollbarXActive = null, this.scrollbarXWidth = null, this.scrollbarXLeft = null;\n var s = Vr(this.scrollbarXRail);\n this.scrollbarXBottom = parseInt(s.bottom, 10), isNaN(this.scrollbarXBottom) ? (this.isScrollbarXUsingBottom = !1, this.scrollbarXTop = ot(s.top)) : this.isScrollbarXUsingBottom = !0, this.railBorderXWidth = ot(s.borderLeftWidth) + ot(s.borderRightWidth), f2(this.scrollbarXRail, { display: "block" }), this.railXMarginWidth = ot(s.marginLeft) + ot(s.marginRight), f2(this.scrollbarXRail, { display: "" }), this.railXWidth = null, this.railXRatio = null, this.scrollbarYRail = d5(zt.element.rail("y")), t.appendChild(this.scrollbarYRail), this.scrollbarY = d5(zt.element.thumb("y")), this.scrollbarYRail.appendChild(this.scrollbarY), this.scrollbarY.setAttribute("tabindex", 0), this.event.bind(this.scrollbarY, "focus", i), this.event.bind(this.scrollbarY, "blur", a), this.scrollbarYActive = null, this.scrollbarYHeight = null, this.scrollbarYTop = null;\n var l = Vr(this.scrollbarYRail);\n this.scrollbarYRight = parseInt(l.right, 10), isNaN(this.scrollbarYRight) ? (this.isScrollbarYUsingRight = !1, this.scrollbarYLeft = ot(l.left)) : this.isScrollbarYUsingRight = !0, this.scrollbarYOuterWidth = this.isRtl ? DU(this.scrollbarY) : null, this.railBorderYWidth = ot(l.borderTopWidth) + ot(l.borderBottomWidth), f2(this.scrollbarYRail, { display: "block" }), this.railYMarginHeight = ot(l.marginTop) + ot(l.marginBottom), f2(this.scrollbarYRail, { display: "" }), this.railYHeight = null, this.railYRatio = null, this.reach = {\n x: t.scrollLeft <= 0 ? "start" : t.scrollLeft >= this.contentWidth - this.containerWidth ? "end" : null,\n y: t.scrollTop <= 0 ? "start" : t.scrollTop >= this.contentHeight - this.containerHeight ? "end" : null\n }, this.isAlive = !0, this.settings.handlers.forEach(function(c) {\n return QU[c](n);\n }), this.lastScrollTop = Math.floor(t.scrollTop), this.lastScrollLeft = t.scrollLeft, this.event.bind(this.element, "scroll", function(c) {\n return n.onScroll(c);\n }), Bn(this);\n};\nrs.prototype.update = function() {\n this.isAlive && (this.negativeScrollAdjustment = this.isNegativeScroll ? this.element.scrollWidth - this.element.clientWidth : 0, f2(this.scrollbarXRail, { display: "block" }), f2(this.scrollbarYRail, { display: "block" }), this.railXMarginWidth = ot(Vr(this.scrollbarXRail).marginLeft) + ot(Vr(this.scrollbarXRail).marginRight), this.railYMarginHeight = ot(Vr(this.scrollbarYRail).marginTop) + ot(Vr(this.scrollbarYRail).marginBottom), f2(this.scrollbarXRail, { display: "none" }), f2(this.scrollbarYRail, { display: "none" }), Bn(this), Hl(this, "top", 0, !1, !0), Hl(this, "left", 0, !1, !0), f2(this.scrollbarXRail, { display: "" }), f2(this.scrollbarYRail, { display: "" }));\n};\nrs.prototype.onScroll = function(t) {\n this.isAlive && (Bn(this), Hl(this, "top", this.element.scrollTop - this.lastScrollTop), Hl(this, "left", this.element.scrollLeft - this.lastScrollLeft), this.lastScrollTop = Math.floor(this.element.scrollTop), this.lastScrollLeft = this.element.scrollLeft);\n};\nrs.prototype.destroy = function() {\n this.isAlive && (this.event.unbindAll(), ta(this.scrollbarX), ta(this.scrollbarY), ta(this.scrollbarXRail), ta(this.scrollbarYRail), this.removePsClasses(), this.element = null, this.scrollbarX = null, this.scrollbarY = null, this.scrollbarXRail = null, this.scrollbarYRail = null, this.isAlive = !1);\n};\nrs.prototype.removePsClasses = function() {\n this.element.className = this.element.className.split(" ").filter(function(t) {\n return !t.match(/^ps([-_].+|)$/);\n }).join(" ");\n};\nconst GU = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n default: rs\n}, Symbol.toStringTag, { value: "Module" })), jU = /* @__PURE__ */ Yf(GU);\n(function(e, t) {\n Object.defineProperty(t, "__esModule", {\n value: !0\n });\n var r = Object.assign || function(C) {\n for (var g = 1; g < arguments.length; g++) {\n var f = arguments[g];\n for (var O in f)\n Object.prototype.hasOwnProperty.call(f, O) && (C[O] = f[O]);\n }\n return C;\n }, n = function() {\n function C(g, f) {\n for (var O = 0; O < f.length; O++) {\n var m = f[O];\n m.enumerable = m.enumerable || !1, m.configurable = !0, "value" in m && (m.writable = !0), Object.defineProperty(g, m.key, m);\n }\n }\n return function(g, f, O) {\n return f && C(g.prototype, f), O && C(g, O), g;\n };\n }(), o = (react__WEBPACK_IMPORTED_MODULE_0___default()), i = c(o), a = Hg, s = jU, l = c(s);\n function c(C) {\n return C && C.__esModule ? C : { default: C };\n }\n function p(C, g) {\n var f = {};\n for (var O in C)\n g.indexOf(O) >= 0 || Object.prototype.hasOwnProperty.call(C, O) && (f[O] = C[O]);\n return f;\n }\n function d(C, g) {\n if (!(C instanceof g))\n throw new TypeError("Cannot call a class as a function");\n }\n function u(C, g) {\n if (!C)\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n return g && (typeof g == "object" || typeof g == "function") ? g : C;\n }\n function h(C, g) {\n if (typeof g != "function" && g !== null)\n throw new TypeError("Super expression must either be null or a function, not " + typeof g);\n C.prototype = Object.create(g && g.prototype, { constructor: { value: C, enumerable: !1, writable: !0, configurable: !0 } }), g && (Object.setPrototypeOf ? Object.setPrototypeOf(C, g) : C.__proto__ = g);\n }\n var b = {\n "ps-scroll-y": "onScrollY",\n "ps-scroll-x": "onScrollX",\n "ps-scroll-up": "onScrollUp",\n "ps-scroll-down": "onScrollDown",\n "ps-scroll-left": "onScrollLeft",\n "ps-scroll-right": "onScrollRight",\n "ps-y-reach-start": "onYReachStart",\n "ps-y-reach-end": "onYReachEnd",\n "ps-x-reach-start": "onXReachStart",\n "ps-x-reach-end": "onXReachEnd"\n };\n Object.freeze(b);\n var M = function(C) {\n h(g, C);\n function g(f) {\n d(this, g);\n var O = u(this, (g.__proto__ || Object.getPrototypeOf(g)).call(this, f));\n return O.handleRef = O.handleRef.bind(O), O._handlerByEvent = {}, O;\n }\n return n(g, [{\n key: "componentDidMount",\n value: function() {\n this.props.option && console.warn(\'react-perfect-scrollbar: the "option" prop has been deprecated in favor of "options"\'), this._ps = new l.default(this._container, this.props.options || this.props.option), this._updateEventHook(), this._updateClassName();\n }\n }, {\n key: "componentDidUpdate",\n value: function(O) {\n this._updateEventHook(O), this.updateScroll(), O.className !== this.props.className && this._updateClassName();\n }\n }, {\n key: "componentWillUnmount",\n value: function() {\n var O = this;\n Object.keys(this._handlerByEvent).forEach(function(m) {\n var v = O._handlerByEvent[m];\n v && O._container.removeEventListener(m, v, !1);\n }), this._handlerByEvent = {}, this._ps.destroy(), this._ps = null;\n }\n }, {\n key: "_updateEventHook",\n value: function() {\n var O = this, m = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n Object.keys(b).forEach(function(v) {\n var y = O.props[b[v]], z = m[b[v]];\n if (y !== z) {\n if (z) {\n var N = O._handlerByEvent[v];\n O._container.removeEventListener(v, N, !1), O._handlerByEvent[v] = null;\n }\n if (y) {\n var W = function() {\n return y(O._container);\n };\n O._container.addEventListener(v, W, !1), O._handlerByEvent[v] = W;\n }\n }\n });\n }\n }, {\n key: "_updateClassName",\n value: function() {\n var O = this.props.className, m = this._container.className.split(" ").filter(function(v) {\n return v.match(/^ps([-_].+|)$/);\n }).join(" ");\n this._container && (this._container.className = "scrollbar-container" + (O ? " " + O : "") + (m ? " " + m : ""));\n }\n }, {\n key: "updateScroll",\n value: function() {\n this.props.onSync(this._ps);\n }\n }, {\n key: "handleRef",\n value: function(O) {\n this._container = O, this.props.containerRef(O);\n }\n }, {\n key: "render",\n value: function() {\n var O = this.props;\n O.className;\n var m = O.style;\n O.option, O.options, O.containerRef, O.onScrollY, O.onScrollX, O.onScrollUp, O.onScrollDown, O.onScrollLeft, O.onScrollRight, O.onYReachStart, O.onYReachEnd, O.onXReachStart, O.onXReachEnd;\n var v = O.component;\n O.onSync;\n var y = O.children, z = p(O, ["className", "style", "option", "options", "containerRef", "onScrollY", "onScrollX", "onScrollUp", "onScrollDown", "onScrollLeft", "onScrollRight", "onYReachStart", "onYReachEnd", "onXReachStart", "onXReachEnd", "component", "onSync", "children"]), N = v;\n return i.default.createElement(\n N,\n r({ style: m, ref: this.handleRef }, z),\n y\n );\n }\n }]), g;\n }(o.Component);\n t.default = M, M.defaultProps = {\n className: "",\n style: void 0,\n option: void 0,\n options: void 0,\n containerRef: function() {\n },\n onScrollY: void 0,\n onScrollX: void 0,\n onScrollUp: void 0,\n onScrollDown: void 0,\n onScrollLeft: void 0,\n onScrollRight: void 0,\n onYReachStart: void 0,\n onYReachEnd: void 0,\n onXReachStart: void 0,\n onXReachEnd: void 0,\n onSync: function(g) {\n return g.update();\n },\n component: "div"\n }, M.propTypes = {\n children: a.PropTypes.node.isRequired,\n className: a.PropTypes.string,\n style: a.PropTypes.object,\n option: a.PropTypes.object,\n options: a.PropTypes.object,\n containerRef: a.PropTypes.func,\n onScrollY: a.PropTypes.func,\n onScrollX: a.PropTypes.func,\n onScrollUp: a.PropTypes.func,\n onScrollDown: a.PropTypes.func,\n onScrollLeft: a.PropTypes.func,\n onScrollRight: a.PropTypes.func,\n onYReachStart: a.PropTypes.func,\n onYReachEnd: a.PropTypes.func,\n onXReachStart: a.PropTypes.func,\n onXReachEnd: a.PropTypes.func,\n onSync: a.PropTypes.func,\n component: a.PropTypes.string\n }, e.exports = t.default;\n})(B8, B8.exports);\nvar KU = B8.exports;\n(function(e, t) {\n Object.defineProperty(t, "__esModule", {\n value: !0\n });\n var r = KU, n = o(r);\n function o(i) {\n return i && i.__esModule ? i : { default: i };\n }\n t.default = n.default, e.exports = t.default;\n})(R8, R8.exports);\nvar ZU = R8.exports;\nconst JU = /* @__PURE__ */ $t(ZU), Ir = 4, b5 = 8, _U = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, borderRadius: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: 100%;\n\n .ps {\n overflow: hidden !important;\n overflow-anchor: none;\n -ms-overflow-style: none;\n touch-action: auto;\n -ms-touch-action: auto;\n }\n\n .ps__rail-x {\n display: none;\n opacity: 0;\n transition: background-color 0.2s linear, opacity 0.2s linear;\n -webkit-transition: background-color 0.2s linear, opacity 0.2s linear;\n height: ${Ir}px;\n /* there must be \'bottom\' or \'top\' for ps__rail-x */\n bottom: ${b5}px;\n /* please don\'t change \'position\' */\n position: absolute;\n background: ${e.scroll.scrollBgPrimary};\n }\n\n .ps__rail-y {\n display: none;\n opacity: 0;\n transition: background-color 0.2s linear, opacity 0.2s linear;\n -webkit-transition: background-color 0.2s linear, opacity 0.2s linear;\n width: ${Ir}px;\n /* there must be \'right\' or \'left\' for ps__rail-y */\n right: ${b5}px;\n /* please don\'t change \'position\' */\n position: absolute;\n \n background: ${e.scroll.scrollBgPrimary};\n }\n\n .ps__thumb-x {\n background-color: ${e.scroll.scrollBgDefault};\n border-radius: ${t.xl};\n transition: background-color 0.2s linear, height 0.2s ease-in-out;\n -webkit-transition: background-color 0.2s linear, height 0.2s ease-in-out;\n height: ${Ir}px;\n /* there must be \'bottom\' for ps__thumb-x */\n bottom: 0;\n /* please don\'t change \'position\' */\n position: absolute;\n }\n\n .ps__thumb-y {\n background-color: ${e.scroll.scrollBgDefault};\n border-radius: ${t.xl};\n transition: background-color 0.2s linear, width 0.2s ease-in-out;\n -webkit-transition: background-color 0.2s linear, width 0.2s ease-in-out;\n width: ${Ir}px;\n /* there must be \'right\' for ps__thumb-y */\n right: 0;\n /* please don\'t change \'position\' */\n position: absolute;\n }\n\n /* MS supports */\n @supports (-ms-overflow-style: none) {\n .ps {\n overflow: auto !important;\n }\n }\n\n @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n .ps {\n overflow: auto !important;\n }\n }\n\n .scrollbar-container {\n position: relative;\n height: 100%;\n box-sizing: border-box;\n }\n\n .ps--active-x {\n padding-bottom: ${Ir + b5 * 2}px;\n }\n\n .ps--active-y {\n padding-right: ${Ir + b5 * 2}px;\n }\n\n .ps--active-x > .ps__rail-x,\n .ps--active-y > .ps__rail-y {\n display: block;\n background-color: ${e.scroll.scrollBgPrimary};\n border-radius: ${t.xl};\n }\n\n .ps:hover > .ps__rail-x,\n .ps:hover > .ps__rail-y,\n .ps--focus > .ps__rail-x,\n .ps--focus > .ps__rail-y,\n .ps--scrolling-x > .ps__rail-x,\n .ps--scrolling-y > .ps__rail-y {\n opacity: 1;\n }\n\n .ps .ps__rail-x:hover,\n .ps .ps__rail-y:hover,\n .ps .ps__rail-x:focus,\n .ps .ps__rail-y:focus,\n .ps .ps__rail-x.ps--clicking,\n .ps .ps__rail-y.ps--clicking {\n background-color: ${e.scroll.scrollBgPrimary};\n opacity: 1;\n }\n\n .ps__rail-y:hover > .ps__thumb-y,\n .ps__rail-y:focus > .ps__thumb-y,\n .ps__rail-y.ps--clicking .ps__thumb-y {\n background-color: ${e.scroll.scrollBgPressed};\n width: ${Ir}px;\n }\n\n .ps__rail-y:hover > .ps__thumb-y {\n background-color: ${e.scroll.scrollBgHover};\n width: ${Ir}px;\n }\n\n .ps__rail-x:hover > .ps__thumb-x,\n .ps__rail-x:focus > .ps__thumb-x,\n .ps__rail-x.ps--clicking .ps__thumb-x {\n background-color: ${e.scroll.scrollBgPressed};\n height: ${Ir}px;\n }\n\n .ps__rail-x:hover > .ps__thumb-x {\n background-color: ${e.scroll.scrollBgHover};\n height: ${Ir}px;\n }\n\n .ps__rail-y {\n margin-top: 8px;\n }\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n background-color: ${({ theme: e }) => e.colors.backgrounds.whiteSmoke};\n height: 100%;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 800px;\n height: 400px;\n background-color: ${({ theme: e }) => e.colors.backgrounds.bgPrimary};\n padding: ${({ theme: e }) => e.spacings.sp8} 0;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n height: 1000px;\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 800px;\n height: 400px;\n padding: 0 ${({ theme: e }) => e.spacings.sp8};\n background-color: ${({ theme: e }) => e.colors.backgrounds.bgPrimary};\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 1000px;\n height: 100%;\n`;\nfunction $U({ children: e, ...t }, r) {\n const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n n.current && n.current.updateScroll();\n }, []), /* @__PURE__ */ A(_U, { ref: r, children: /* @__PURE__ */ A(JU, { ref: n, ...t, children: e }) });\n}\nconst ns = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)($U), n9 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().button(\n ({\n theme: {\n borderRadius: e,\n lineHeight: t,\n typography: r,\n colors: n,\n transitions: o,\n mixins: i,\n GLOBAL_ITEM_HEIGHT_CONDENSED: a\n },\n isActive: s,\n orientation: l\n }) => {\n const c = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n transition: ${o.base};\n color: ${n.blue};\n\n &:after {\n transition: ${o.base};\n opacity: 1;\n z-index: 1;\n }\n `, p = () => {\n switch (l) {\n case z2.VERTICAL:\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n top: 6px;\n bottom: 6px;\n left: 0;\n width: 2px;\n border-radius: ${e.base} 0 0 ${e.base};\n box-shadow: 2px 0 0 0 ${n.tab.tabIndicator} inset;\n `;\n case z2.HORIZONTAL:\n default:\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n bottom: 0;\n right: 12px;\n left: 12px;\n height: 2px;\n border-radius: 0;\n box-shadow: 0 2px 0 0 ${n.tab.tabIndicator} inset;\n `;\n }\n }, d = () => {\n switch (l) {\n case z2.VERTICAL:\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n top: 1px;\n bottom: 1px;\n left: 0;\n width: 2px;\n border-radius: ${e.base} 0 0 ${e.base};\n box-shadow: 2px 0 0 0 ${n.tab.tabIndicator} inset;\n `;\n case z2.HORIZONTAL:\n default:\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n bottom: 0;\n right: 1px;\n left: 1px;\n height: 2px;\n border-radius: 0;\n box-shadow: 0 2px 0 0 ${n.tab.tabIndicator} inset;\n `;\n }\n };\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${i.buttonReset};\n\n padding: 6px 12px;\n font-size: ${r.t14};\n line-height: ${t.lh22};\n color: ${n.eclipse};\n min-width: 178px;\n text-align: center;\n position: relative;\n height: ${a};\n white-space: nowrap;\n\n &:after {\n content: \'\';\n position: absolute;\n opacity: 0;\n transition: ${o.base};\n ${p};\n }\n\n &:not(:disabled) {\n &:hover {\n background-color: ${n.backgrounds.cultured};\n transition: ${o.base};\n ${s && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:after {\n content: \'\';\n position: absolute;\n opacity: 1;\n transition: ${o.base};\n ${d};\n }\n `}\n }\n\n ${s && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${c}\n `}\n\n &:active {\n ${c}\n }\n }\n\n &:disabled {\n color: ${n.gainsboro};\n cursor: default;\n }\n `;\n }\n), o9 = styled_components__WEBPACK_IMPORTED_MODULE_1___default().span(\n ({ theme: { typography: e, lineHeight: t, colors: r, fontWeight: n } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-size: ${e.t12};\n line-height: ${t.lh20};\n color: ${r.textIcon.textMediumemphasis};\n font-weight: ${n.medium};\n\n &:not(:last-child) {\n margin-right: ${({ theme: o }) => o.spacings.sp12};\n }\n `\n), ra = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(n9)(\n ({ theme: { colors: e, spacings: t }, isActive: r, orientation: n }) => {\n (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${C2} {\n background-color: ${e.backgrounds.bgTertiary};\n }\n &:hover {\n background: ${e.backgrounds.bgHoverPrimary};\n }\n `;\n const o = n === z2.VERTICAL;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: ${o ? "flex-start" : "center"};\n min-width: ${o ? "100%" : "auto"};\n .icon-system {\n color: ${e.textIcon.textHighemphasis};\n }\n &:hover {\n background: ${e.backgrounds.bgHoverPrimary} !important;\n }\n\n ${Ia} {\n &:not(:first-child:last-child) {\n margin-right: ${t.sp4};\n }\n\n & + ${C2} {\n &:not(:first-child:last-child) {\n margin-left: 0;\n }\n }\n }\n\n ${C2} {\n &:not(:first-child:last-child) {\n margin-left: ${o ? "auto" : "0"};\n }\n }\n\n &:disabled {\n ${C2} {\n background-color: ${e.backgrounds.bgDisabledPrimary};\n }\n ${o9} {\n color: ${e.textIcon.textDisabledNobg} !important;\n }\n .icon-system {\n color: ${e.textIcon.textDisabledNobg} !important ;\n }\n }\n `;\n }\n), eY = (e, t) => {\n const {\n children: r,\n iconLeft: n,\n title: o,\n badge: i,\n isDisabled: a,\n noDigit: s,\n badgeVariant: l,\n ...c\n } = e, p = /* @__PURE__ */ c1(\n ra,\n {\n ref: t,\n disabled: a,\n role: "tab",\n "aria-selected": c.isActive,\n ...c,\n children: [\n n && /* @__PURE__ */ A(f0, { name: n, size: "xxxs" }),\n r && /* @__PURE__ */ A(o9, { children: r }),\n !!i && /* @__PURE__ */ A(l2, { count: i, noDigit: s, variant: l })\n ]\n }\n );\n return o ? /* @__PURE__ */ A(v2, { text: o, place: "bottom", children: p }) : p;\n}, i9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(eY), tY = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n maxHeight: e,\n theme: { spacings: t, GLOBAL_ITEM_HEIGHT_CONDENSED: r, mixins: n }\n }) => {\n const o = Number(parseFloat(r)) * 6;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n overflow: auto;\n\n background: ${({ theme: i }) => i.colors.backgrounds.bgPrimary};\n\n ${ra} {\n justify-content: flex-start;\n\n ${o9} {\n ${n.ellipsis}\n }\n }\n\n .scrollbar-container {\n padding: 0;\n max-height: ${e ? `${e}px` : `${o}rem`};\n\n .ps__rail-y {\n right: 0 !important;\n }\n }\n `;\n }\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 300px;\n`;\nconst rY = (e, t) => {\n const {\n tabItems: r = [],\n activeTab: n = null,\n onChange: o,\n customTab: i,\n isZIndexReverse: a,\n maxHeight: s,\n ...l\n } = e, c = () => r.map((p, d) => {\n const u = () => o(p), h = (p == null ? void 0 : p.children) === (n == null ? void 0 : n.children);\n return a && (p.style = {\n ...p.style,\n zIndex: r.length - d\n }), i ? i({\n ...p,\n isActive: h,\n key: (p == null ? void 0 : p.children) + (h ? "-selected" : "-not-selected") || d,\n onClick: u,\n orientation: z2.VERTICAL\n }) : /* @__PURE__ */ (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\n i9,\n {\n ...p,\n orientation: z2.VERTICAL,\n isActive: h,\n key: (p == null ? void 0 : p.children) + (h ? "-selected" : "-not-selected") || d,\n onClick: u\n }\n );\n });\n return /* @__PURE__ */ A(tY, { ref: t, ...l, maxHeight: s, children: /* @__PURE__ */ A(ns, { ...l.scrollBarProps, children: c() }) });\n}, yz = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(rY), nY = ({\n filters: e,\n filterValues: t,\n handleFilterValue: r,\n clearFilter: n,\n setClearFilterId: o,\n maxVisibleFilters: i,\n tabsMaxHeight: a,\n enableFilterIndicatorDots: s,\n defaultFilterValues: l\n}) => {\n const [c, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [d, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [h, b] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n c.length > 0 && u(c[0]);\n }, [c.length]);\n const g = (E) => {\n u(E);\n }, f = (E) => E.slice(i).map((L) => ({\n children: L.filterLabel ? L.filterLabel : nt(L.columnId),\n title: "",\n noDigit: s,\n badge: t[L.columnId] === void 0 ? 0 : L.type === "daterange" && Array.isArray(t[L.columnId]) ? t[L.columnId].length - 1 : Array.isArray(t[L.columnId]) ? t[L.columnId].length : 1\n }));\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n p(f(e.filter((E) => E.enableFilter)));\n }, [e, t]);\n function O(E, L) {\n for (let w of L)\n if (w.columnId === E)\n return w.type;\n return null;\n }\n function m(E, L) {\n for (let w of E)\n if (w.columnId === L) {\n if (w.type === "input" || w.type === "amount")\n return w.settings.options;\n if (w.type === "dropdown" || w.type === "dropdown-multi" || w.type === "dropdown-multi-chip")\n return w.settings.options;\n }\n return null;\n }\n function v(E, L) {\n for (let w of E)\n if (w.columnId === L)\n return w.settings.value;\n return null;\n }\n const y = (E) => {\n o(E);\n };\n function z(E) {\n return E == null ? void 0 : E.map((L) => ({\n value: L,\n label: L\n }));\n }\n const N = () => {\n let E = {}, L = [], w, q = { min: null, max: null }, S = [0, 0], B;\n if (d) {\n const I = d.children;\n B = e.find(\n (P) => P.filterLabel ? P.filterLabel === I : nt(P.columnId) === I\n );\n }\n return l == null || l.map((I) => {\n var P, k;\n I.id == (B == null ? void 0 : B.columnId) && O(B.columnId, e) == "dropdown" ? (E.value = I.value, E.label = I.value) : I.id == (B == null ? void 0 : B.columnId) && (O(B.columnId, e) == "dropdown-multi" || O(B.columnId, e) == "dropdown-multi-chip") ? I != null && I.value && ((P = I == null ? void 0 : I.value) == null ? void 0 : P.length) > 0 && ((k = I == null ? void 0 : I.value) == null || k.map((K) => {\n L.push({\n value: K,\n label: K\n });\n })) : I.id == (B == null ? void 0 : B.columnId) && O(B.columnId, e) == "input" ? w = I.value : I.id == (B == null ? void 0 : B.columnId) && O(B.columnId, e) == "daterange" ? q = {\n min: I.value[0],\n max: I.value[1]\n } : I.id == (B == null ? void 0 : B.columnId) && O(B.columnId, e) == "amount" && (S = I.value);\n }), (L == null ? void 0 : L.length) > 0 ? L : w || (O(B.columnId, e) == "daterange" ? q : O(B.columnId, e) == "amount" ? S : JSON.stringify(E) == "{}" ? null : E);\n }, W = (E, L, w, q, S) => {\n switch (y(E), L) {\n case "input":\n return /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n l8,\n {\n label: q || nt(E),\n isRequired: !0,\n placeholder: q || nt(E),\n onChange: (k) => {\n r(E, k == null ? void 0 : k.target.value);\n },\n defaultValue: (l == null ? void 0 : l.length) > 0 && N(),\n value: t[E] || "",\n hideClearButton: !0\n }\n ) }, E);\n case "dropdown":\n return /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n _5,\n {\n placeholder: `Search ${q || nt(E)}`,\n isSearchable: !0,\n data: m(w, E),\n getFilteredValue: (k) => {\n const K = [k].map(\n ($) => $.value\n );\n r(E, K), b(k);\n },\n defaultValues: (l == null ? void 0 : l.length) > 0 ? N() : h,\n values: z(t[E])\n }\n ) }, E);\n case "daterange":\n const B = {\n min: null,\n max: null\n };\n return M != null && M.current && JSON.stringify(t) === "{}" && M.current.handleReset(B), /* @__PURE__ */ A(oU, { children: /* @__PURE__ */ A(\n uz,\n {\n dateFormat: S || "dd/MM/yyyy",\n onChange: (k) => {\n r(E, [k.min, k.max]);\n },\n defaultValue: (l == null ? void 0 : l.length) > 0 && N(),\n value: t[E] ? {\n min: t[E][0],\n max: t[E][1]\n } : {\n min: null,\n max: null\n },\n ref: M,\n min: t[E] ? t[E][0] : null,\n max: t[E] ? t[E][1] : null,\n hideClearBtn: !0\n }\n ) }, E);\n case "amount":\n const I = v(w, E), P = [0, 0];\n return C != null && C.current && JSON.stringify(t) === "{}" && C.current.handleReset(P), /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n fg,\n {\n value: t[E] || P,\n defaultValue: (l == null ? void 0 : l.length) > 0 && N(),\n onChange: (k) => {\n r(E, k);\n },\n ref: C,\n min: I != null && I.min ? I == null ? void 0 : I.min : null,\n max: I != null && I.max ? I == null ? void 0 : I.max : null,\n isValidation: !0,\n hideClearButton: !0\n }\n ) }, E);\n case "dropdown-multi":\n return /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n _5,\n {\n placeholder: `Search ${q || nt(E)}`,\n isSearchable: !0,\n isMulti: !0,\n data: m(w, E),\n getFilteredValue: (k) => {\n const K = k.map(\n ($) => $.value\n );\n r(E, K), b(k);\n },\n defaultValues: (l == null ? void 0 : l.length) > 0 ? N() : JSON.stringify(N()) === "{}" ? [] : b,\n values: JSON.stringify(t) === "{}" ? [] : z(t[E])\n }\n ) }, E);\n case "dropdown-multi-chip":\n return /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n _5,\n {\n placeholder: `Search ${q || nt(E)}`,\n highLightSelectedOptions: !0,\n isSearchable: !0,\n isMulti: !0,\n data: m(w, E),\n getFilteredValue: (k) => {\n const K = k.map(\n ($) => $.value\n );\n r(E, K), b(k);\n },\n defaultValues: (l == null ? void 0 : l.length) > 0 ? N() : JSON.stringify(t) === "{}" ? [] : b,\n values: JSON.stringify(t) === "{}" ? [] : z(t[E])\n }\n ) }, E);\n default:\n return /* @__PURE__ */ A((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { children: /* @__PURE__ */ A(\n l8,\n {\n label: q || nt(E),\n isRequired: !0,\n placeholder: q || nt(E),\n onChange: (k) => {\n r(E, k == null ? void 0 : k.target.value);\n },\n defaultValue: (l == null ? void 0 : l.length) > 0 && N(),\n value: t[E] || "",\n hideClearButton: !0\n }\n ) }, E);\n }\n }, T = () => {\n if (d) {\n const E = d.children, L = e.find(\n (w) => w.filterLabel ? w.filterLabel === E : nt(w.columnId) === E\n );\n if (L)\n return /* @__PURE__ */ A("div", { children: W(\n L.columnId,\n O(L.columnId, e) || "",\n e,\n L.filterLabel,\n L.filterDateFormat\n ) });\n }\n return null;\n };\n let x = a || 500;\n return /* @__PURE__ */ A(rU, { children: /* @__PURE__ */ c1(nU, { children: [\n /* @__PURE__ */ A(\n Z6,\n {\n $items: "tabs",\n $tabsMaxHeight: (c == null ? void 0 : c.length) >= 13,\n children: /* @__PURE__ */ A(\n yz,\n {\n tabItems: c,\n activeTab: d,\n onChange: g,\n maxHeight: x\n }\n )\n }\n ),\n /* @__PURE__ */ A(Z6, { $items: "divider", children: /* @__PURE__ */ A(a2, { $default: !0, orientation: "vertical", $hasMargin: !0 }) }),\n /* @__PURE__ */ A(Z6, { $items: "content", children: T() })\n ] }) });\n};\nfunction nb(e, t) {\n var r = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n t && (n = n.filter(function(o) {\n return Object.getOwnPropertyDescriptor(e, o).enumerable;\n })), r.push.apply(r, n);\n }\n return r;\n}\nfunction ob(e) {\n for (var t = 1; t < arguments.length; t++) {\n var r = arguments[t] != null ? arguments[t] : {};\n t % 2 ? nb(Object(r), !0).forEach(function(n) {\n w0(e, n, r[n]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : nb(Object(r)).forEach(function(n) {\n Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(r, n));\n });\n }\n return e;\n}\nfunction b2(e) {\n return "Minified Redux error #" + e + "; visit https://redux.js.org/Errors?code=" + e + " for the full message or use the non-minified dev environment for full errors. ";\n}\nvar ib = function() {\n return typeof Symbol == "function" && Symbol.observable || "@@observable";\n}(), J6 = function() {\n return Math.random().toString(36).substring(7).split("").join(".");\n}, ab = {\n INIT: "@@redux/INIT" + J6(),\n REPLACE: "@@redux/REPLACE" + J6(),\n PROBE_UNKNOWN_ACTION: function() {\n return "@@redux/PROBE_UNKNOWN_ACTION" + J6();\n }\n};\nfunction oY(e) {\n if (typeof e != "object" || e === null)\n return !1;\n for (var t = e; Object.getPrototypeOf(t) !== null; )\n t = Object.getPrototypeOf(t);\n return Object.getPrototypeOf(e) === t;\n}\nfunction iY(e) {\n if (e === void 0)\n return "undefined";\n if (e === null)\n return "null";\n var t = typeof e;\n switch (t) {\n case "boolean":\n case "string":\n case "number":\n case "symbol":\n case "function":\n return t;\n }\n if (Array.isArray(e))\n return "array";\n if (lY(e))\n return "date";\n if (sY(e))\n return "error";\n var r = aY(e);\n switch (r) {\n case "Symbol":\n case "Promise":\n case "WeakMap":\n case "WeakSet":\n case "Map":\n case "Set":\n return r;\n }\n return t.slice(8, -1).toLowerCase().replace(/\\s/g, "");\n}\nfunction aY(e) {\n return typeof e.constructor == "function" ? e.constructor.name : null;\n}\nfunction sY(e) {\n return e instanceof Error || typeof e.message == "string" && e.constructor && typeof e.constructor.stackTraceLimit == "number";\n}\nfunction lY(e) {\n return e instanceof Date ? !0 : typeof e.toDateString == "function" && typeof e.getDate == "function" && typeof e.setDate == "function";\n}\nfunction Zo(e) {\n var t = typeof e;\n return false && (0), t;\n}\nfunction Lz(e, t, r) {\n var n;\n if (typeof t == "function" && typeof r == "function" || typeof r == "function" && typeof arguments[3] == "function")\n throw new Error( true ? b2(0) : 0);\n if (typeof t == "function" && typeof r > "u" && (r = t, t = void 0), typeof r < "u") {\n if (typeof r != "function")\n throw new Error( true ? b2(1) : 0);\n return r(Lz)(e, t);\n }\n if (typeof e != "function")\n throw new Error( true ? b2(2) : 0);\n var o = e, i = t, a = [], s = a, l = !1;\n function c() {\n s === a && (s = a.slice());\n }\n function p() {\n if (l)\n throw new Error( true ? b2(3) : 0);\n return i;\n }\n function d(M) {\n if (typeof M != "function")\n throw new Error( true ? b2(4) : 0);\n if (l)\n throw new Error( true ? b2(5) : 0);\n var C = !0;\n return c(), s.push(M), function() {\n if (C) {\n if (l)\n throw new Error( true ? b2(6) : 0);\n C = !1, c();\n var f = s.indexOf(M);\n s.splice(f, 1), a = null;\n }\n };\n }\n function u(M) {\n if (!oY(M))\n throw new Error( true ? b2(7) : 0);\n if (typeof M.type > "u")\n throw new Error( true ? b2(8) : 0);\n if (l)\n throw new Error( true ? b2(9) : 0);\n try {\n l = !0, i = o(i, M);\n } finally {\n l = !1;\n }\n for (var C = a = s, g = 0; g < C.length; g++) {\n var f = C[g];\n f();\n }\n return M;\n }\n function h(M) {\n if (typeof M != "function")\n throw new Error( true ? b2(10) : 0);\n o = M, u({\n type: ab.REPLACE\n });\n }\n function b() {\n var M, C = d;\n return M = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function(f) {\n if (typeof f != "object" || f === null)\n throw new Error( true ? b2(11) : 0);\n function O() {\n f.next && f.next(p());\n }\n O();\n var m = C(O);\n return {\n unsubscribe: m\n };\n }\n }, M[ib] = function() {\n return this;\n }, M;\n }\n return u({\n type: ab.INIT\n }), n = {\n dispatch: u,\n subscribe: d,\n getState: p,\n replaceReducer: h\n }, n[ib] = b, n;\n}\nfunction sb(e, t) {\n return function() {\n return t(e.apply(this, arguments));\n };\n}\nfunction lb(e, t) {\n if (typeof e == "function")\n return sb(e, t);\n if (typeof e != "object" || e === null)\n throw new Error( true ? b2(16) : 0);\n var r = {};\n for (var n in e) {\n var o = e[n];\n typeof o == "function" && (r[n] = sb(o, t));\n }\n return r;\n}\nfunction wz() {\n for (var e = arguments.length, t = new Array(e), r = 0; r < e; r++)\n t[r] = arguments[r];\n return t.length === 0 ? function(n) {\n return n;\n } : t.length === 1 ? t[0] : t.reduce(function(n, o) {\n return function() {\n return n(o.apply(void 0, arguments));\n };\n });\n}\nfunction cY() {\n for (var e = arguments.length, t = new Array(e), r = 0; r < e; r++)\n t[r] = arguments[r];\n return function(n) {\n return function() {\n var o = n.apply(void 0, arguments), i = function() {\n throw new Error( true ? b2(15) : 0);\n }, a = {\n getState: o.getState,\n dispatch: function() {\n return i.apply(void 0, arguments);\n }\n }, s = t.map(function(l) {\n return l(a);\n });\n return i = wz.apply(void 0, s)(o.dispatch), ob(ob({}, o), {}, {\n dispatch: i\n });\n };\n };\n}\nvar a9 = /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createContext(null);\n false && (0);\nfunction pY(e) {\n e();\n}\nvar qz = pY, dY = function(t) {\n return qz = t;\n}, AY = function() {\n return qz;\n};\nfunction uY() {\n var e = AY(), t = null, r = null;\n return {\n clear: function() {\n t = null, r = null;\n },\n notify: function() {\n e(function() {\n for (var o = t; o; )\n o.callback(), o = o.next;\n });\n },\n get: function() {\n for (var o = [], i = t; i; )\n o.push(i), i = i.next;\n return o;\n },\n subscribe: function(o) {\n var i = !0, a = r = {\n callback: o,\n next: null,\n prev: r\n };\n return a.prev ? a.prev.next = a : t = a, function() {\n !i || t === null || (i = !1, a.next ? a.next.prev = a.prev : r = a.prev, a.prev ? a.prev.next = a.next : t = a.next);\n };\n }\n };\n}\nvar cb = {\n notify: function() {\n },\n get: function() {\n return [];\n }\n};\nfunction xz(e, t) {\n var r, n = cb;\n function o(d) {\n return l(), n.subscribe(d);\n }\n function i() {\n n.notify();\n }\n function a() {\n p.onStateChange && p.onStateChange();\n }\n function s() {\n return !!r;\n }\n function l() {\n r || (r = t ? t.addNestedSub(a) : e.subscribe(a), n = uY());\n }\n function c() {\n r && (r(), r = void 0, n.clear(), n = cb);\n }\n var p = {\n addNestedSub: o,\n notifyNestedSubs: i,\n handleChangeWrapper: a,\n isSubscribed: s,\n trySubscribe: l,\n tryUnsubscribe: c,\n getListeners: function() {\n return n;\n }\n };\n return p;\n}\nvar Rz = typeof window < "u" && typeof window.document < "u" && typeof window.document.createElement < "u" ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect;\nfunction Bz(e) {\n var t = e.store, r = e.context, n = e.children, o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n var s = xz(t);\n return {\n store: t,\n subscription: s\n };\n }, [t]), i = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return t.getState();\n }, [t]);\n Rz(function() {\n var s = o.subscription;\n return s.onStateChange = s.notifyNestedSubs, s.trySubscribe(), i !== t.getState() && s.notifyNestedSubs(), function() {\n s.tryUnsubscribe(), s.onStateChange = null;\n };\n }, [o, i]);\n var a = r || a9;\n return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(a.Provider, {\n value: o\n }, n);\n}\n false && (0);\nvar s9 = _7(), bY = {\n childContextTypes: !0,\n contextType: !0,\n contextTypes: !0,\n defaultProps: !0,\n displayName: !0,\n getDefaultProps: !0,\n getDerivedStateFromError: !0,\n getDerivedStateFromProps: !0,\n mixins: !0,\n propTypes: !0,\n type: !0\n}, hY = {\n name: !0,\n length: !0,\n prototype: !0,\n caller: !0,\n callee: !0,\n arguments: !0,\n arity: !0\n}, MY = {\n $$typeof: !0,\n render: !0,\n defaultProps: !0,\n displayName: !0,\n propTypes: !0\n}, Wz = {\n $$typeof: !0,\n compare: !0,\n defaultProps: !0,\n displayName: !0,\n propTypes: !0,\n type: !0\n}, l9 = {};\nl9[s9.ForwardRef] = MY;\nl9[s9.Memo] = Wz;\nfunction pb(e) {\n return s9.isMemo(e) ? Wz : l9[e.$$typeof] || bY;\n}\nvar fY = Object.defineProperty, gY = Object.getOwnPropertyNames, db = Object.getOwnPropertySymbols, zY = Object.getOwnPropertyDescriptor, CY = Object.getPrototypeOf, Ab = Object.prototype;\nfunction Ez(e, t, r) {\n if (typeof t != "string") {\n if (Ab) {\n var n = CY(t);\n n && n !== Ab && Ez(e, n, r);\n }\n var o = gY(t);\n db && (o = o.concat(db(t)));\n for (var i = pb(e), a = pb(t), s = 0; s < o.length; ++s) {\n var l = o[s];\n if (!hY[l] && !(r && r[l]) && !(a && a[l]) && !(i && i[l])) {\n var c = zY(t, l);\n try {\n fY(e, l, c);\n } catch {\n }\n }\n }\n }\n return e;\n}\nvar OY = Ez;\nconst ub = /* @__PURE__ */ $t(OY);\nvar W8 = { exports: {} }, Ie = {};\n/** @license React v17.0.2\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar bb;\nfunction mY() {\n if (bb)\n return Ie;\n bb = 1;\n var e = 60103, t = 60106, r = 60107, n = 60108, o = 60114, i = 60109, a = 60110, s = 60112, l = 60113, c = 60120, p = 60115, d = 60116, u = 60121, h = 60122, b = 60117, M = 60129, C = 60131;\n if (typeof Symbol == "function" && Symbol.for) {\n var g = Symbol.for;\n e = g("react.element"), t = g("react.portal"), r = g("react.fragment"), n = g("react.strict_mode"), o = g("react.profiler"), i = g("react.provider"), a = g("react.context"), s = g("react.forward_ref"), l = g("react.suspense"), c = g("react.suspense_list"), p = g("react.memo"), d = g("react.lazy"), u = g("react.block"), h = g("react.server.block"), b = g("react.fundamental"), M = g("react.debug_trace_mode"), C = g("react.legacy_hidden");\n }\n function f(L) {\n if (typeof L == "object" && L !== null) {\n var w = L.$$typeof;\n switch (w) {\n case e:\n switch (L = L.type, L) {\n case r:\n case o:\n case n:\n case l:\n case c:\n return L;\n default:\n switch (L = L && L.$$typeof, L) {\n case a:\n case s:\n case d:\n case p:\n case i:\n return L;\n default:\n return w;\n }\n }\n case t:\n return w;\n }\n }\n }\n var O = i, m = e, v = s, y = r, z = d, N = p, W = t, T = o, x = n, E = l;\n return Ie.ContextConsumer = a, Ie.ContextProvider = O, Ie.Element = m, Ie.ForwardRef = v, Ie.Fragment = y, Ie.Lazy = z, Ie.Memo = N, Ie.Portal = W, Ie.Profiler = T, Ie.StrictMode = x, Ie.Suspense = E, Ie.isAsyncMode = function() {\n return !1;\n }, Ie.isConcurrentMode = function() {\n return !1;\n }, Ie.isContextConsumer = function(L) {\n return f(L) === a;\n }, Ie.isContextProvider = function(L) {\n return f(L) === i;\n }, Ie.isElement = function(L) {\n return typeof L == "object" && L !== null && L.$$typeof === e;\n }, Ie.isForwardRef = function(L) {\n return f(L) === s;\n }, Ie.isFragment = function(L) {\n return f(L) === r;\n }, Ie.isLazy = function(L) {\n return f(L) === d;\n }, Ie.isMemo = function(L) {\n return f(L) === p;\n }, Ie.isPortal = function(L) {\n return f(L) === t;\n }, Ie.isProfiler = function(L) {\n return f(L) === o;\n }, Ie.isStrictMode = function(L) {\n return f(L) === n;\n }, Ie.isSuspense = function(L) {\n return f(L) === l;\n }, Ie.isValidElementType = function(L) {\n return typeof L == "string" || typeof L == "function" || L === r || L === o || L === M || L === n || L === l || L === c || L === C || typeof L == "object" && L !== null && (L.$$typeof === d || L.$$typeof === p || L.$$typeof === i || L.$$typeof === a || L.$$typeof === s || L.$$typeof === b || L.$$typeof === u || L[0] === h);\n }, Ie.typeOf = f, Ie;\n}\nvar Te = {};\n/** @license React v17.0.2\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar hb;\nfunction vY() {\n return hb || (hb = 1, false && 0), Te;\n}\n true ? W8.exports = mY() : 0;\nvar Mb = W8.exports, yY = ["getDisplayName", "methodName", "renderCountProp", "shouldHandleStateChanges", "storeKey", "withRef", "forwardRef", "context"], LY = ["reactReduxForwardedRef"], wY = [], qY = [null, null], xY = function(t) {\n try {\n return JSON.stringify(t);\n } catch {\n return String(t);\n }\n};\nfunction RY(e, t) {\n var r = e[1];\n return [t.payload, r + 1];\n}\nfunction fb(e, t, r) {\n Rz(function() {\n return e.apply(void 0, t);\n }, r);\n}\nfunction BY(e, t, r, n, o, i, a) {\n e.current = n, t.current = o, r.current = !1, i.current && (i.current = null, a());\n}\nfunction WY(e, t, r, n, o, i, a, s, l, c) {\n if (e) {\n var p = !1, d = null, u = function() {\n if (!p) {\n var M = t.getState(), C, g;\n try {\n C = n(M, o.current);\n } catch (f) {\n g = f, d = f;\n }\n g || (d = null), C === i.current ? a.current || l() : (i.current = C, s.current = C, a.current = !0, c({\n type: "STORE_UPDATED",\n payload: {\n error: g\n }\n }));\n }\n };\n r.onStateChange = u, r.trySubscribe(), u();\n var h = function() {\n if (p = !0, r.tryUnsubscribe(), r.onStateChange = null, d)\n throw d;\n };\n return h;\n }\n}\nvar EY = function() {\n return [null, 0];\n};\nfunction SY(e, t) {\n t === void 0 && (t = {});\n var r = t, n = r.getDisplayName, o = n === void 0 ? function(y) {\n return "ConnectAdvanced(" + y + ")";\n } : n, i = r.methodName, a = i === void 0 ? "connectAdvanced" : i, s = r.renderCountProp, l = s === void 0 ? void 0 : s, c = r.shouldHandleStateChanges, p = c === void 0 ? !0 : c, d = r.storeKey, u = d === void 0 ? "store" : d, h = r.withRef, b = h === void 0 ? !1 : h, M = r.forwardRef, C = M === void 0 ? !1 : M, g = r.context, f = g === void 0 ? a9 : g, O = p4(r, yY);\n if (false) // removed by dead control flow\n{ var m; }\n var v = f;\n return function(z) {\n if (false)\n // removed by dead control flow\n{}\n var N = z.displayName || z.name || "Component", W = o(N), T = H0({}, O, {\n getDisplayName: o,\n methodName: a,\n renderCountProp: l,\n shouldHandleStateChanges: p,\n storeKey: u,\n displayName: W,\n wrappedComponentName: N,\n WrappedComponent: z\n }), x = O.pure;\n function E(B) {\n return e(B.dispatch, T);\n }\n var L = x ? react__WEBPACK_IMPORTED_MODULE_0__.useMemo : function(B) {\n return B();\n };\n function w(B) {\n var I = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n var A1 = B.reactReduxForwardedRef, l1 = p4(B, LY);\n return [B.context, A1, l1];\n }, [B]), P = I[0], k = I[1], K = I[2], $ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return P && P.Consumer && Mb.isContextConsumer(/* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P.Consumer, null)) ? P : v;\n }, [P, v]), j = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)($), r1 = !!B.store && !!B.store.getState && !!B.store.dispatch, a1 = !!j && !!j.store;\n if (false)\n // removed by dead control flow\n{}\n var _ = r1 ? B.store : j.store, Y = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return E(_);\n }, [_]), D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n if (!p)\n return qY;\n var A1 = xz(_, r1 ? null : j.subscription), l1 = A1.notifyNestedSubs.bind(A1);\n return [A1, l1];\n }, [_, r1, j]), H = D[0], G = D[1], J = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return r1 ? j : H0({}, j, {\n subscription: H\n });\n }, [r1, j, H]), F = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(RY, wY, EY), V = F[0], Q = V[0], Z = F[1];\n if (Q && Q.error)\n throw Q.error;\n var t1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(), n1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(K), U = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(), e1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), o1 = L(function() {\n return U.current && K === n1.current ? U.current : Y(_.getState(), K);\n }, [_, Q, K]);\n fb(BY, [n1, t1, e1, K, o1, U, G]), fb(WY, [p, _, H, Y, n1, t1, e1, U, G, Z], [_, H, Y]);\n var u1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(z, H0({}, o1, {\n ref: k\n }));\n }, [k, z, o1]), M1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function() {\n return p ? /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createElement($.Provider, {\n value: J\n }, u1) : u1;\n }, [$, u1, J]);\n return M1;\n }\n var q = x ? react__WEBPACK_IMPORTED_MODULE_0___default().memo(w) : w;\n if (q.WrappedComponent = z, q.displayName = w.displayName = W, C) {\n var S = react__WEBPACK_IMPORTED_MODULE_0___default().forwardRef(function(I, P) {\n return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(q, H0({}, I, {\n reactReduxForwardedRef: P\n }));\n });\n return S.displayName = W, S.WrappedComponent = z, ub(S, z);\n }\n return ub(q, z);\n };\n}\nfunction gb(e, t) {\n return e === t ? e !== 0 || t !== 0 || 1 / e === 1 / t : e !== e && t !== t;\n}\nfunction _6(e, t) {\n if (gb(e, t))\n return !0;\n if (typeof e != "object" || e === null || typeof t != "object" || t === null)\n return !1;\n var r = Object.keys(e), n = Object.keys(t);\n if (r.length !== n.length)\n return !1;\n for (var o = 0; o < r.length; o++)\n if (!Object.prototype.hasOwnProperty.call(t, r[o]) || !gb(e[r[o]], t[r[o]]))\n return !1;\n return !0;\n}\nfunction kY(e, t) {\n var r = {}, n = function(a) {\n var s = e[a];\n typeof s == "function" && (r[a] = function() {\n return t(s.apply(void 0, arguments));\n });\n };\n for (var o in e)\n n(o);\n return r;\n}\nfunction NY(e) {\n if (typeof e != "object" || e === null)\n return !1;\n var t = Object.getPrototypeOf(e);\n if (t === null)\n return !0;\n for (var r = t; Object.getPrototypeOf(r) !== null; )\n r = Object.getPrototypeOf(r);\n return t === r;\n}\nfunction Sz(e) {\n typeof console < "u" && typeof console.error == "function" && console.error(e);\n try {\n throw new Error(e);\n } catch {\n }\n}\nfunction kz(e, t, r) {\n NY(e) || Sz(r + "() in " + t + " must return a plain object. Instead received " + e + ".");\n}\nfunction c9(e) {\n return function(r, n) {\n var o = e(r, n);\n function i() {\n return o;\n }\n return i.dependsOnOwnProps = !1, i;\n };\n}\nfunction zb(e) {\n return e.dependsOnOwnProps !== null && e.dependsOnOwnProps !== void 0 ? !!e.dependsOnOwnProps : e.length !== 1;\n}\nfunction Nz(e, t) {\n return function(n, o) {\n var i = o.displayName, a = function(l, c) {\n return a.dependsOnOwnProps ? a.mapToProps(l, c) : a.mapToProps(l);\n };\n return a.dependsOnOwnProps = !0, a.mapToProps = function(l, c) {\n a.mapToProps = e, a.dependsOnOwnProps = zb(e);\n var p = a(l, c);\n return typeof p == "function" && (a.mapToProps = p, a.dependsOnOwnProps = zb(p), p = a(l, c)), false && 0, p;\n }, a;\n };\n}\nfunction IY(e) {\n return typeof e == "function" ? Nz(e, "mapDispatchToProps") : void 0;\n}\nfunction TY(e) {\n return e ? void 0 : c9(function(t) {\n return {\n dispatch: t\n };\n });\n}\nfunction DY(e) {\n return e && typeof e == "object" ? c9(function(t) {\n return kY(e, t);\n }) : void 0;\n}\nconst HY = [IY, TY, DY];\nfunction PY(e) {\n return typeof e == "function" ? Nz(e, "mapStateToProps") : void 0;\n}\nfunction VY(e) {\n return e ? void 0 : c9(function() {\n return {};\n });\n}\nconst FY = [PY, VY];\nfunction UY(e, t, r) {\n return H0({}, r, e, t);\n}\nfunction YY(e) {\n return function(r, n) {\n var o = n.displayName, i = n.pure, a = n.areMergedPropsEqual, s = !1, l;\n return function(p, d, u) {\n var h = e(p, d, u);\n return s ? (!i || !a(h, l)) && (l = h) : (s = !0, l = h, false && 0), l;\n };\n };\n}\nfunction XY(e) {\n return typeof e == "function" ? YY(e) : void 0;\n}\nfunction QY(e) {\n return e ? void 0 : function() {\n return UY;\n };\n}\nconst GY = [XY, QY];\nfunction $6(e, t, r) {\n if (e)\n (t === "mapStateToProps" || t === "mapDispatchToProps") && (Object.prototype.hasOwnProperty.call(e, "dependsOnOwnProps") || Sz("The selector for " + t + " of " + r + " did not specify a value for dependsOnOwnProps."));\n else\n throw new Error("Unexpected value for " + t + " in " + r + ".");\n}\nfunction jY(e, t, r, n) {\n $6(e, "mapStateToProps", n), $6(t, "mapDispatchToProps", n), $6(r, "mergeProps", n);\n}\nvar KY = ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"];\nfunction ZY(e, t, r, n) {\n return function(i, a) {\n return r(e(i, a), t(n, a), a);\n };\n}\nfunction JY(e, t, r, n, o) {\n var i = o.areStatesEqual, a = o.areOwnPropsEqual, s = o.areStatePropsEqual, l = !1, c, p, d, u, h;\n function b(O, m) {\n return c = O, p = m, d = e(c, p), u = t(n, p), h = r(d, u, p), l = !0, h;\n }\n function M() {\n return d = e(c, p), t.dependsOnOwnProps && (u = t(n, p)), h = r(d, u, p), h;\n }\n function C() {\n return e.dependsOnOwnProps && (d = e(c, p)), t.dependsOnOwnProps && (u = t(n, p)), h = r(d, u, p), h;\n }\n function g() {\n var O = e(c, p), m = !s(O, d);\n return d = O, m && (h = r(d, u, p)), h;\n }\n function f(O, m) {\n var v = !a(m, p), y = !i(O, c, m, p);\n return c = O, p = m, v && y ? M() : v ? C() : y ? g() : h;\n }\n return function(m, v) {\n return l ? f(m, v) : b(m, v);\n };\n}\nfunction _Y(e, t) {\n var r = t.initMapStateToProps, n = t.initMapDispatchToProps, o = t.initMergeProps, i = p4(t, KY), a = r(e, i), s = n(e, i), l = o(e, i);\n false && 0;\n var c = i.pure ? JY : ZY;\n return c(a, s, l, e, i);\n}\nvar $Y = ["pure", "areStatesEqual", "areOwnPropsEqual", "areStatePropsEqual", "areMergedPropsEqual"];\nfunction ep(e, t, r) {\n for (var n = t.length - 1; n >= 0; n--) {\n var o = t[n](e);\n if (o)\n return o;\n }\n return function(i, a) {\n throw new Error("Invalid value of type " + typeof e + " for " + r + " argument when connecting component " + a.wrappedComponentName + ".");\n };\n}\nfunction eX(e, t) {\n return e === t;\n}\nfunction tX(e) {\n var t = e === void 0 ? {} : e, r = t.connectHOC, n = r === void 0 ? SY : r, o = t.mapStateToPropsFactories, i = o === void 0 ? FY : o, a = t.mapDispatchToPropsFactories, s = a === void 0 ? HY : a, l = t.mergePropsFactories, c = l === void 0 ? GY : l, p = t.selectorFactory, d = p === void 0 ? _Y : p;\n return function(h, b, M, C) {\n C === void 0 && (C = {});\n var g = C, f = g.pure, O = f === void 0 ? !0 : f, m = g.areStatesEqual, v = m === void 0 ? eX : m, y = g.areOwnPropsEqual, z = y === void 0 ? _6 : y, N = g.areStatePropsEqual, W = N === void 0 ? _6 : N, T = g.areMergedPropsEqual, x = T === void 0 ? _6 : T, E = p4(g, $Y), L = ep(h, i, "mapStateToProps"), w = ep(b, s, "mapDispatchToProps"), q = ep(M, c, "mergeProps");\n return n(d, H0({\n // used in error messages\n methodName: "connect",\n // used to compute Connect\'s displayName from the wrapped component\'s displayName.\n getDisplayName: function(B) {\n return "Connect(" + B + ")";\n },\n // if mapStateToProps is falsy, the Connect component doesn\'t subscribe to store state changes\n shouldHandleStateChanges: !!h,\n // passed through to selectorFactory\n initMapStateToProps: L,\n initMapDispatchToProps: w,\n initMergeProps: q,\n pure: O,\n areStatesEqual: v,\n areOwnPropsEqual: z,\n areStatePropsEqual: W,\n areMergedPropsEqual: x\n }, E));\n };\n}\nconst Iz = /* @__PURE__ */ tX();\ndY(react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates);\nfunction rX(e, t) {\n if (e.length !== t.length)\n return !1;\n for (var r = 0; r < e.length; r++)\n if (e[r] !== t[r])\n return !1;\n return !0;\n}\nfunction Tz(e, t) {\n var r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function() {\n return {\n inputs: t,\n result: e()\n };\n })[0], n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!0), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(r), i = n.current || !!(t && o.current.inputs && rX(t, o.current.inputs)), a = i ? o.current : {\n inputs: t,\n result: e()\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n n.current = !1, o.current = a;\n }, [a]), a.result;\n}\nfunction nX(e, t) {\n return Tz(function() {\n return e;\n }, t);\n}\nvar ze = Tz, F0 = nX, oX = "production" === "production", tp = "Invariant failed";\nfunction Cb(e, t) {\n if (!e) {\n if (oX)\n throw new Error(tp);\n var r = typeof t == "function" ? t() : t, n = r ? "".concat(tp, ": ").concat(r) : tp;\n throw new Error(n);\n }\n}\nvar fr = function(t) {\n var r = t.top, n = t.right, o = t.bottom, i = t.left, a = n - i, s = o - r, l = {\n top: r,\n right: n,\n bottom: o,\n left: i,\n width: a,\n height: s,\n x: i,\n y: r,\n center: {\n x: (n + i) / 2,\n y: (o + r) / 2\n }\n };\n return l;\n}, p9 = function(t, r) {\n return {\n top: t.top - r.top,\n left: t.left - r.left,\n bottom: t.bottom + r.bottom,\n right: t.right + r.right\n };\n}, Ob = function(t, r) {\n return {\n top: t.top + r.top,\n left: t.left + r.left,\n bottom: t.bottom - r.bottom,\n right: t.right - r.right\n };\n}, iX = function(t, r) {\n return {\n top: t.top + r.y,\n left: t.left + r.x,\n bottom: t.bottom + r.y,\n right: t.right + r.x\n };\n}, rp = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n}, d9 = function(t) {\n var r = t.borderBox, n = t.margin, o = n === void 0 ? rp : n, i = t.border, a = i === void 0 ? rp : i, s = t.padding, l = s === void 0 ? rp : s, c = fr(p9(r, o)), p = fr(Ob(r, a)), d = fr(Ob(p, l));\n return {\n marginBox: c,\n borderBox: fr(r),\n paddingBox: p,\n contentBox: d,\n margin: o,\n border: a,\n padding: l\n };\n}, G2 = function(t) {\n var r = t.slice(0, -2), n = t.slice(-2);\n if (n !== "px")\n return 0;\n var o = Number(r);\n return isNaN(o) && ( false ? 0 : Cb(!1)), o;\n}, aX = function() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n}, Pl = function(t, r) {\n var n = t.borderBox, o = t.border, i = t.margin, a = t.padding, s = iX(n, r);\n return d9({\n borderBox: s,\n border: o,\n margin: i,\n padding: a\n });\n}, Vl = function(t, r) {\n return r === void 0 && (r = aX()), Pl(t, r);\n}, Dz = function(t, r) {\n var n = {\n top: G2(r.marginTop),\n right: G2(r.marginRight),\n bottom: G2(r.marginBottom),\n left: G2(r.marginLeft)\n }, o = {\n top: G2(r.paddingTop),\n right: G2(r.paddingRight),\n bottom: G2(r.paddingBottom),\n left: G2(r.paddingLeft)\n }, i = {\n top: G2(r.borderTopWidth),\n right: G2(r.borderRightWidth),\n bottom: G2(r.borderBottomWidth),\n left: G2(r.borderLeftWidth)\n };\n return d9({\n borderBox: t,\n margin: n,\n padding: o,\n border: i\n });\n}, Hz = function(t) {\n var r = t.getBoundingClientRect(), n = window.getComputedStyle(t);\n return Dz(r, n);\n}, sX = function(t) {\n var r = [], n = null, o = function() {\n for (var a = arguments.length, s = new Array(a), l = 0; l < a; l++)\n s[l] = arguments[l];\n r = s, !n && (n = requestAnimationFrame(function() {\n n = null, t.apply(void 0, r);\n }));\n };\n return o.cancel = function() {\n n && (cancelAnimationFrame(n), n = null);\n }, o;\n};\nconst v4 = sX;\nvar lX = "production" === "production", cX = /[ \\t]{2,}/g, pX = /^[ \\t]*/gm, mb = function(t) {\n return t.replace(cX, " ").replace(pX, "").trim();\n}, dX = function(t) {\n return mb(`\n %creact-beautiful-dnd\n\n %c` + mb(t) + `\n\n %c👷‍ This is a development only message. It will be removed in production builds.\n`);\n}, AX = function(t) {\n return [dX(t), "color: #00C584; font-size: 1.2em; font-weight: bold;", "line-height: 1.5", "color: #723874;"];\n}, uX = "__react-beautiful-dnd-disable-dev-warnings";\nfunction Pz(e, t) {\n var r;\n lX || typeof window < "u" && window[uX] || (r = console)[e].apply(r, AX(t));\n}\nvar Qe = Pz.bind(null, "warn"), E8 = Pz.bind(null, "error");\nfunction Ao() {\n}\nfunction bX(e, t) {\n return H0({}, e, {}, t);\n}\nfunction _2(e, t, r) {\n var n = t.map(function(o) {\n var i = bX(r, o.options);\n return e.addEventListener(o.eventName, o.fn, i), function() {\n e.removeEventListener(o.eventName, o.fn, i);\n };\n });\n return function() {\n n.forEach(function(i) {\n i();\n });\n };\n}\nvar hX = "production" === "production", vb = "Invariant failed";\nfunction y4(e) {\n this.message = e;\n}\ny4.prototype.toString = function() {\n return this.message;\n};\nfunction V1(e, t) {\n if (!e)\n throw hX ? new y4(vb) : new y4(vb + ": " + (t || ""));\n}\nvar MX = function(e) {\n gc(t, e);\n function t() {\n for (var n, o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = e.call.apply(e, [this].concat(i)) || this, n.callbacks = null, n.unbind = Ao, n.onWindowError = function(s) {\n var l = n.getCallbacks();\n l.isDragging() && (l.tryAbort(), false && 0);\n var c = s.error;\n c instanceof y4 && (s.preventDefault(), false && 0);\n }, n.getCallbacks = function() {\n if (!n.callbacks)\n throw new Error("Unable to find AppCallbacks in ");\n return n.callbacks;\n }, n.setCallbacks = function(s) {\n n.callbacks = s;\n }, n;\n }\n var r = t.prototype;\n return r.componentDidMount = function() {\n this.unbind = _2(window, [{\n eventName: "error",\n fn: this.onWindowError\n }]);\n }, r.componentDidCatch = function(o) {\n if (o instanceof y4) {\n false && 0, this.setState({});\n return;\n }\n throw o;\n }, r.componentWillUnmount = function() {\n this.unbind();\n }, r.render = function() {\n return this.props.children(this.setCallbacks);\n }, t;\n}((react__WEBPACK_IMPORTED_MODULE_0___default().Component)), fX = `\n Press space bar to start a drag.\n When dragging you can use the arrow keys to move the item around and escape to cancel.\n Some screen readers may require you to be in focus mode or to use your pass through key\n`, Fl = function(t) {\n return t + 1;\n}, gX = function(t) {\n return `\n You have lifted an item in position ` + Fl(t.source.index) + `\n`;\n}, Vz = function(t, r) {\n var n = t.droppableId === r.droppableId, o = Fl(t.index), i = Fl(r.index);\n return n ? `\n You have moved the item from position ` + o + `\n to position ` + i + `\n ` : `\n You have moved the item from position ` + o + `\n in list ` + t.droppableId + `\n to list ` + r.droppableId + `\n in position ` + i + `\n `;\n}, Fz = function(t, r, n) {\n var o = r.droppableId === n.droppableId;\n return o ? `\n The item ` + t + `\n has been combined with ` + n.draggableId : `\n The item ` + t + `\n in list ` + r.droppableId + `\n has been combined with ` + n.draggableId + `\n in list ` + n.droppableId + `\n `;\n}, zX = function(t) {\n var r = t.destination;\n if (r)\n return Vz(t.source, r);\n var n = t.combine;\n return n ? Fz(t.draggableId, t.source, n) : "You are over an area that cannot be dropped on";\n}, yb = function(t) {\n return `\n The item has returned to its starting position\n of ` + Fl(t.index) + `\n`;\n}, CX = function(t) {\n if (t.reason === "CANCEL")\n return `\n Movement cancelled.\n ` + yb(t.source) + `\n `;\n var r = t.destination, n = t.combine;\n return r ? `\n You have dropped the item.\n ` + Vz(t.source, r) + `\n ` : n ? `\n You have dropped the item.\n ` + Fz(t.draggableId, t.source, n) + `\n ` : `\n The item has been dropped while not over a drop area.\n ` + yb(t.source) + `\n `;\n}, el = {\n dragHandleUsageInstructions: fX,\n onDragStart: gX,\n onDragUpdate: zX,\n onDragEnd: CX\n}, Bt = {\n x: 0,\n y: 0\n}, Ht = function(t, r) {\n return {\n x: t.x + r.x,\n y: t.y + r.y\n };\n}, S2 = function(t, r) {\n return {\n x: t.x - r.x,\n y: t.y - r.y\n };\n}, uo = function(t, r) {\n return t.x === r.x && t.y === r.y;\n}, Va = function(t) {\n return {\n x: t.x !== 0 ? -t.x : 0,\n y: t.y !== 0 ? -t.y : 0\n };\n}, Mi = function(t, r, n) {\n var o;\n return n === void 0 && (n = 0), o = {}, o[t] = r, o[t === "x" ? "y" : "x"] = n, o;\n}, L4 = function(t, r) {\n return Math.sqrt(Math.pow(r.x - t.x, 2) + Math.pow(r.y - t.y, 2));\n}, Lb = function(t, r) {\n return Math.min.apply(Math, r.map(function(n) {\n return L4(t, n);\n }));\n}, Uz = function(t) {\n return function(r) {\n return {\n x: t(r.x),\n y: t(r.y)\n };\n };\n}, OX = function(e, t) {\n var r = fr({\n top: Math.max(t.top, e.top),\n right: Math.min(t.right, e.right),\n bottom: Math.min(t.bottom, e.bottom),\n left: Math.max(t.left, e.left)\n });\n return r.width <= 0 || r.height <= 0 ? null : r;\n}, os = function(t, r) {\n return {\n top: t.top + r.y,\n left: t.left + r.x,\n bottom: t.bottom + r.y,\n right: t.right + r.x\n };\n}, wb = function(t) {\n return [{\n x: t.left,\n y: t.top\n }, {\n x: t.right,\n y: t.top\n }, {\n x: t.left,\n y: t.bottom\n }, {\n x: t.right,\n y: t.bottom\n }];\n}, mX = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n}, vX = function(t, r) {\n return r ? os(t, r.scroll.diff.displacement) : t;\n}, yX = function(t, r, n) {\n if (n && n.increasedBy) {\n var o;\n return H0({}, t, (o = {}, o[r.end] = t[r.end] + n.increasedBy[r.line], o));\n }\n return t;\n}, LX = function(t, r) {\n return r && r.shouldClipSubject ? OX(r.pageMarginBox, t) : fr(t);\n}, xa = function(e) {\n var t = e.page, r = e.withPlaceholder, n = e.axis, o = e.frame, i = vX(t.marginBox, o), a = yX(i, n, r), s = LX(a, o);\n return {\n page: t,\n withPlaceholder: r,\n active: s\n };\n}, A9 = function(e, t) {\n e.frame || ("production", V1(!1));\n var r = e.frame, n = S2(t, r.scroll.initial), o = Va(n), i = H0({}, r, {\n scroll: {\n initial: r.scroll.initial,\n current: t,\n diff: {\n value: n,\n displacement: o\n },\n max: r.scroll.max\n }\n }), a = xa({\n page: e.subject.page,\n withPlaceholder: e.subject.withPlaceholder,\n axis: e.axis,\n frame: i\n }), s = H0({}, e, {\n frame: i,\n subject: a\n });\n return s;\n};\nfunction wX(e) {\n return Number.isInteger ? Number.isInteger(e) : typeof e == "number" && isFinite(e) && Math.floor(e) === e;\n}\nfunction Ul(e) {\n return Object.values ? Object.values(e) : Object.keys(e).map(function(t) {\n return e[t];\n });\n}\nfunction u9(e, t) {\n if (e.findIndex)\n return e.findIndex(t);\n for (var r = 0; r < e.length; r++)\n if (t(e[r]))\n return r;\n return -1;\n}\nfunction Bo(e, t) {\n if (e.find)\n return e.find(t);\n var r = u9(e, t);\n if (r !== -1)\n return e[r];\n}\nfunction Yz(e) {\n return Array.prototype.slice.call(e);\n}\nvar Xz = gt(function(e) {\n return e.reduce(function(t, r) {\n return t[r.descriptor.id] = r, t;\n }, {});\n}), Qz = gt(function(e) {\n return e.reduce(function(t, r) {\n return t[r.descriptor.id] = r, t;\n }, {});\n}), qc = gt(function(e) {\n return Ul(e);\n}), qX = gt(function(e) {\n return Ul(e);\n}), vi = gt(function(e, t) {\n var r = qX(t).filter(function(n) {\n return e === n.descriptor.droppableId;\n }).sort(function(n, o) {\n return n.descriptor.index - o.descriptor.index;\n });\n return r;\n});\nfunction b9(e) {\n return e.at && e.at.type === "REORDER" ? e.at.destination : null;\n}\nfunction xc(e) {\n return e.at && e.at.type === "COMBINE" ? e.at.combine : null;\n}\nvar Rc = gt(function(e, t) {\n return t.filter(function(r) {\n return r.descriptor.id !== e.descriptor.id;\n });\n}), xX = function(e) {\n var t = e.isMovingForward, r = e.draggable, n = e.destination, o = e.insideDestination, i = e.previousImpact;\n if (!n.isCombineEnabled)\n return null;\n var a = b9(i);\n if (!a)\n return null;\n function s(M) {\n var C = {\n type: "COMBINE",\n combine: {\n draggableId: M,\n droppableId: n.descriptor.id\n }\n };\n return H0({}, i, {\n at: C\n });\n }\n var l = i.displaced.all, c = l.length ? l[0] : null;\n if (t)\n return c ? s(c) : null;\n var p = Rc(r, o);\n if (!c) {\n if (!p.length)\n return null;\n var d = p[p.length - 1];\n return s(d.descriptor.id);\n }\n var u = u9(p, function(M) {\n return M.descriptor.id === c;\n });\n u === -1 && ( false ? 0 : V1(!1));\n var h = u - 1;\n if (h < 0)\n return null;\n var b = p[h];\n return s(b.descriptor.id);\n}, Fa = function(e, t) {\n return e.descriptor.droppableId === t.descriptor.id;\n}, Gz = {\n point: Bt,\n value: 0\n}, w4 = {\n invisible: {},\n visible: {},\n all: []\n}, RX = {\n displaced: w4,\n displacedBy: Gz,\n at: null\n}, rr = function(e, t) {\n return function(r) {\n return e <= r && r <= t;\n };\n}, jz = function(e) {\n var t = rr(e.top, e.bottom), r = rr(e.left, e.right);\n return function(n) {\n var o = t(n.top) && t(n.bottom) && r(n.left) && r(n.right);\n if (o)\n return !0;\n var i = t(n.top) || t(n.bottom), a = r(n.left) || r(n.right), s = i && a;\n if (s)\n return !0;\n var l = n.top < e.top && n.bottom > e.bottom, c = n.left < e.left && n.right > e.right, p = l && c;\n if (p)\n return !0;\n var d = l && a || c && i;\n return d;\n };\n}, BX = function(e) {\n var t = rr(e.top, e.bottom), r = rr(e.left, e.right);\n return function(n) {\n var o = t(n.top) && t(n.bottom) && r(n.left) && r(n.right);\n return o;\n };\n}, h9 = {\n direction: "vertical",\n line: "y",\n crossAxisLine: "x",\n start: "top",\n end: "bottom",\n size: "height",\n crossAxisStart: "left",\n crossAxisEnd: "right",\n crossAxisSize: "width"\n}, Kz = {\n direction: "horizontal",\n line: "x",\n crossAxisLine: "y",\n start: "left",\n end: "right",\n size: "width",\n crossAxisStart: "top",\n crossAxisEnd: "bottom",\n crossAxisSize: "height"\n}, WX = function(e) {\n return function(t) {\n var r = rr(t.top, t.bottom), n = rr(t.left, t.right);\n return function(o) {\n return e === h9 ? r(o.top) && r(o.bottom) : n(o.left) && n(o.right);\n };\n };\n}, EX = function(t, r) {\n var n = r.frame ? r.frame.scroll.diff.displacement : Bt;\n return os(t, n);\n}, SX = function(t, r, n) {\n return r.subject.active ? n(r.subject.active)(t) : !1;\n}, kX = function(t, r, n) {\n return n(r)(t);\n}, M9 = function(t) {\n var r = t.target, n = t.destination, o = t.viewport, i = t.withDroppableDisplacement, a = t.isVisibleThroughFrameFn, s = i ? EX(r, n) : r;\n return SX(s, n, a) && kX(s, o, a);\n}, NX = function(t) {\n return M9(H0({}, t, {\n isVisibleThroughFrameFn: jz\n }));\n}, Zz = function(t) {\n return M9(H0({}, t, {\n isVisibleThroughFrameFn: BX\n }));\n}, IX = function(t) {\n return M9(H0({}, t, {\n isVisibleThroughFrameFn: WX(t.destination.axis)\n }));\n}, TX = function(t, r, n) {\n if (typeof n == "boolean")\n return n;\n if (!r)\n return !0;\n var o = r.invisible, i = r.visible;\n if (o[t])\n return !1;\n var a = i[t];\n return a ? a.shouldAnimate : !0;\n};\nfunction DX(e, t) {\n var r = e.page.marginBox, n = {\n top: t.point.y,\n right: 0,\n bottom: 0,\n left: t.point.x\n };\n return fr(p9(r, n));\n}\nfunction q4(e) {\n var t = e.afterDragging, r = e.destination, n = e.displacedBy, o = e.viewport, i = e.forceShouldAnimate, a = e.last;\n return t.reduce(function(l, c) {\n var p = DX(c, n), d = c.descriptor.id;\n l.all.push(d);\n var u = NX({\n target: p,\n destination: r,\n viewport: o,\n withDroppableDisplacement: !0\n });\n if (!u)\n return l.invisible[c.descriptor.id] = !0, l;\n var h = TX(d, a, i), b = {\n draggableId: d,\n shouldAnimate: h\n };\n return l.visible[d] = b, l;\n }, {\n all: [],\n visible: {},\n invisible: {}\n });\n}\nfunction HX(e, t) {\n if (!e.length)\n return 0;\n var r = e[e.length - 1].descriptor.index;\n return t.inHomeList ? r : r + 1;\n}\nfunction qb(e) {\n var t = e.insideDestination, r = e.inHomeList, n = e.displacedBy, o = e.destination, i = HX(t, {\n inHomeList: r\n });\n return {\n displaced: w4,\n displacedBy: n,\n at: {\n type: "REORDER",\n destination: {\n droppableId: o.descriptor.id,\n index: i\n }\n }\n };\n}\nfunction Yl(e) {\n var t = e.draggable, r = e.insideDestination, n = e.destination, o = e.viewport, i = e.displacedBy, a = e.last, s = e.index, l = e.forceShouldAnimate, c = Fa(t, n);\n if (s == null)\n return qb({\n insideDestination: r,\n inHomeList: c,\n displacedBy: i,\n destination: n\n });\n var p = Bo(r, function(M) {\n return M.descriptor.index === s;\n });\n if (!p)\n return qb({\n insideDestination: r,\n inHomeList: c,\n displacedBy: i,\n destination: n\n });\n var d = Rc(t, r), u = r.indexOf(p), h = d.slice(u), b = q4({\n afterDragging: h,\n destination: n,\n displacedBy: i,\n last: a,\n viewport: o.frame,\n forceShouldAnimate: l\n });\n return {\n displaced: b,\n displacedBy: i,\n at: {\n type: "REORDER",\n destination: {\n droppableId: n.descriptor.id,\n index: s\n }\n }\n };\n}\nfunction Co(e, t) {\n return !!t.effected[e];\n}\nvar PX = function(e) {\n var t = e.isMovingForward, r = e.destination, n = e.draggables, o = e.combine, i = e.afterCritical;\n if (!r.isCombineEnabled)\n return null;\n var a = o.draggableId, s = n[a], l = s.descriptor.index, c = Co(a, i);\n return c ? t ? l : l - 1 : t ? l + 1 : l;\n}, VX = function(e) {\n var t = e.isMovingForward, r = e.isInHomeList, n = e.insideDestination, o = e.location;\n if (!n.length)\n return null;\n var i = o.index, a = t ? i + 1 : i - 1, s = n[0].descriptor.index, l = n[n.length - 1].descriptor.index, c = r ? l : l + 1;\n return a < s || a > c ? null : a;\n}, FX = function(e) {\n var t = e.isMovingForward, r = e.isInHomeList, n = e.draggable, o = e.draggables, i = e.destination, a = e.insideDestination, s = e.previousImpact, l = e.viewport, c = e.afterCritical, p = s.at;\n if (p || ( false ? 0 : V1(!1)), p.type === "REORDER") {\n var d = VX({\n isMovingForward: t,\n isInHomeList: r,\n location: p.destination,\n insideDestination: a\n });\n return d == null ? null : Yl({\n draggable: n,\n insideDestination: a,\n destination: i,\n viewport: l,\n last: s.displaced,\n displacedBy: s.displacedBy,\n index: d\n });\n }\n var u = PX({\n isMovingForward: t,\n destination: i,\n displaced: s.displaced,\n draggables: o,\n combine: p.combine,\n afterCritical: c\n });\n return u == null ? null : Yl({\n draggable: n,\n insideDestination: a,\n destination: i,\n viewport: l,\n last: s.displaced,\n displacedBy: s.displacedBy,\n index: u\n });\n}, UX = function(e) {\n var t = e.displaced, r = e.afterCritical, n = e.combineWith, o = e.displacedBy, i = !!(t.visible[n] || t.invisible[n]);\n return Co(n, r) ? i ? Bt : Va(o.point) : i ? o.point : Bt;\n}, YX = function(e) {\n var t = e.afterCritical, r = e.impact, n = e.draggables, o = xc(r);\n o || ("production", V1(!1));\n var i = o.draggableId, a = n[i].page.borderBox.center, s = UX({\n displaced: r.displaced,\n afterCritical: t,\n combineWith: i,\n displacedBy: r.displacedBy\n });\n return Ht(a, s);\n}, Jz = function(t, r) {\n return r.margin[t.start] + r.borderBox[t.size] / 2;\n}, XX = function(t, r) {\n return r.margin[t.end] + r.borderBox[t.size] / 2;\n}, f9 = function(t, r, n) {\n return r[t.crossAxisStart] + n.margin[t.crossAxisStart] + n.borderBox[t.crossAxisSize] / 2;\n}, xb = function(t) {\n var r = t.axis, n = t.moveRelativeTo, o = t.isMoving;\n return Mi(r.line, n.marginBox[r.end] + Jz(r, o), f9(r, n.marginBox, o));\n}, Rb = function(t) {\n var r = t.axis, n = t.moveRelativeTo, o = t.isMoving;\n return Mi(r.line, n.marginBox[r.start] - XX(r, o), f9(r, n.marginBox, o));\n}, QX = function(t) {\n var r = t.axis, n = t.moveInto, o = t.isMoving;\n return Mi(r.line, n.contentBox[r.start] + Jz(r, o), f9(r, n.contentBox, o));\n}, GX = function(e) {\n var t = e.impact, r = e.draggable, n = e.draggables, o = e.droppable, i = e.afterCritical, a = vi(o.descriptor.id, n), s = r.page, l = o.axis;\n if (!a.length)\n return QX({\n axis: l,\n moveInto: o.page,\n isMoving: s\n });\n var c = t.displaced, p = t.displacedBy, d = c.all[0];\n if (d) {\n var u = n[d];\n if (Co(d, i))\n return Rb({\n axis: l,\n moveRelativeTo: u.page,\n isMoving: s\n });\n var h = Pl(u.page, p.point);\n return Rb({\n axis: l,\n moveRelativeTo: h,\n isMoving: s\n });\n }\n var b = a[a.length - 1];\n if (b.descriptor.id === r.descriptor.id)\n return s.borderBox.center;\n if (Co(b.descriptor.id, i)) {\n var M = Pl(b.page, Va(i.displacedBy.point));\n return xb({\n axis: l,\n moveRelativeTo: M,\n isMoving: s\n });\n }\n return xb({\n axis: l,\n moveRelativeTo: b.page,\n isMoving: s\n });\n}, S8 = function(e, t) {\n var r = e.frame;\n return r ? Ht(t, r.scroll.diff.displacement) : t;\n}, jX = function(t) {\n var r = t.impact, n = t.draggable, o = t.droppable, i = t.draggables, a = t.afterCritical, s = n.page.borderBox.center, l = r.at;\n return !o || !l ? s : l.type === "REORDER" ? GX({\n impact: r,\n draggable: n,\n draggables: i,\n droppable: o,\n afterCritical: a\n }) : YX({\n impact: r,\n draggables: i,\n afterCritical: a\n });\n}, Bc = function(e) {\n var t = jX(e), r = e.droppable, n = r ? S8(r, t) : t;\n return n;\n}, _z = function(e, t) {\n var r = S2(t, e.scroll.initial), n = Va(r), o = fr({\n top: t.y,\n bottom: t.y + e.frame.height,\n left: t.x,\n right: t.x + e.frame.width\n }), i = {\n frame: o,\n scroll: {\n initial: e.scroll.initial,\n max: e.scroll.max,\n current: t,\n diff: {\n value: r,\n displacement: n\n }\n }\n };\n return i;\n};\nfunction Bb(e, t) {\n return e.map(function(r) {\n return t[r];\n });\n}\nfunction KX(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r].visible[e];\n if (n)\n return n;\n }\n return null;\n}\nvar ZX = function(e) {\n var t = e.impact, r = e.viewport, n = e.destination, o = e.draggables, i = e.maxScrollChange, a = _z(r, Ht(r.scroll.current, i)), s = n.frame ? A9(n, Ht(n.frame.scroll.current, i)) : n, l = t.displaced, c = q4({\n afterDragging: Bb(l.all, o),\n destination: n,\n displacedBy: t.displacedBy,\n viewport: a.frame,\n last: l,\n forceShouldAnimate: !1\n }), p = q4({\n afterDragging: Bb(l.all, o),\n destination: s,\n displacedBy: t.displacedBy,\n viewport: r.frame,\n last: l,\n forceShouldAnimate: !1\n }), d = {}, u = {}, h = [l, c, p];\n l.all.forEach(function(M) {\n var C = KX(M, h);\n if (C) {\n u[M] = C;\n return;\n }\n d[M] = !0;\n });\n var b = H0({}, t, {\n displaced: {\n all: l.all,\n invisible: d,\n visible: u\n }\n });\n return b;\n}, JX = function(e, t) {\n return Ht(e.scroll.diff.displacement, t);\n}, g9 = function(e) {\n var t = e.pageBorderBoxCenter, r = e.draggable, n = e.viewport, o = JX(n, t), i = S2(o, r.page.borderBox.center);\n return Ht(r.client.borderBox.center, i);\n}, $z = function(e) {\n var t = e.draggable, r = e.destination, n = e.newPageBorderBoxCenter, o = e.viewport, i = e.withDroppableDisplacement, a = e.onlyOnMainAxis, s = a === void 0 ? !1 : a, l = S2(n, t.page.borderBox.center), c = os(t.page.borderBox, l), p = {\n target: c,\n destination: r,\n withDroppableDisplacement: i,\n viewport: o\n };\n return s ? IX(p) : Zz(p);\n}, _X = function(e) {\n var t = e.isMovingForward, r = e.draggable, n = e.destination, o = e.draggables, i = e.previousImpact, a = e.viewport, s = e.previousPageBorderBoxCenter, l = e.previousClientSelection, c = e.afterCritical;\n if (!n.isEnabled)\n return null;\n var p = vi(n.descriptor.id, o), d = Fa(r, n), u = xX({\n isMovingForward: t,\n draggable: r,\n destination: n,\n insideDestination: p,\n previousImpact: i\n }) || FX({\n isMovingForward: t,\n isInHomeList: d,\n draggable: r,\n draggables: o,\n destination: n,\n insideDestination: p,\n previousImpact: i,\n viewport: a,\n afterCritical: c\n });\n if (!u)\n return null;\n var h = Bc({\n impact: u,\n draggable: r,\n droppable: n,\n draggables: o,\n afterCritical: c\n }), b = $z({\n draggable: r,\n destination: n,\n newPageBorderBoxCenter: h,\n viewport: a.frame,\n withDroppableDisplacement: !1,\n onlyOnMainAxis: !0\n });\n if (b) {\n var M = g9({\n pageBorderBoxCenter: h,\n draggable: r,\n viewport: a\n });\n return {\n clientSelection: M,\n impact: u,\n scrollJumpRequest: null\n };\n }\n var C = S2(h, s), g = ZX({\n impact: u,\n viewport: a,\n destination: n,\n draggables: o,\n maxScrollChange: C\n });\n return {\n clientSelection: l,\n impact: g,\n scrollJumpRequest: C\n };\n}, r2 = function(t) {\n var r = t.subject.active;\n return r || ( false ? 0 : V1(!1)), r;\n}, $X = function(e) {\n var t = e.isMovingForward, r = e.pageBorderBoxCenter, n = e.source, o = e.droppables, i = e.viewport, a = n.subject.active;\n if (!a)\n return null;\n var s = n.axis, l = rr(a[s.start], a[s.end]), c = qc(o).filter(function(d) {\n return d !== n;\n }).filter(function(d) {\n return d.isEnabled;\n }).filter(function(d) {\n return !!d.subject.active;\n }).filter(function(d) {\n return jz(i.frame)(r2(d));\n }).filter(function(d) {\n var u = r2(d);\n return t ? a[s.crossAxisEnd] < u[s.crossAxisEnd] : u[s.crossAxisStart] < a[s.crossAxisStart];\n }).filter(function(d) {\n var u = r2(d), h = rr(u[s.start], u[s.end]);\n return l(u[s.start]) || l(u[s.end]) || h(a[s.start]) || h(a[s.end]);\n }).sort(function(d, u) {\n var h = r2(d)[s.crossAxisStart], b = r2(u)[s.crossAxisStart];\n return t ? h - b : b - h;\n }).filter(function(d, u, h) {\n return r2(d)[s.crossAxisStart] === r2(h[0])[s.crossAxisStart];\n });\n if (!c.length)\n return null;\n if (c.length === 1)\n return c[0];\n var p = c.filter(function(d) {\n var u = rr(r2(d)[s.start], r2(d)[s.end]);\n return u(r[s.line]);\n });\n return p.length === 1 ? p[0] : p.length > 1 ? p.sort(function(d, u) {\n return r2(d)[s.start] - r2(u)[s.start];\n })[0] : c.sort(function(d, u) {\n var h = Lb(r, wb(r2(d))), b = Lb(r, wb(r2(u)));\n return h !== b ? h - b : r2(d)[s.start] - r2(u)[s.start];\n })[0];\n}, Wb = function(t, r) {\n var n = t.page.borderBox.center;\n return Co(t.descriptor.id, r) ? S2(n, r.displacedBy.point) : n;\n}, eQ = function(t, r) {\n var n = t.page.borderBox;\n return Co(t.descriptor.id, r) ? os(n, Va(r.displacedBy.point)) : n;\n}, tQ = function(e) {\n var t = e.pageBorderBoxCenter, r = e.viewport, n = e.destination, o = e.insideDestination, i = e.afterCritical, a = o.filter(function(s) {\n return Zz({\n target: eQ(s, i),\n destination: n,\n viewport: r.frame,\n withDroppableDisplacement: !0\n });\n }).sort(function(s, l) {\n var c = L4(t, S8(n, Wb(s, i))), p = L4(t, S8(n, Wb(l, i)));\n return c < p ? -1 : p < c ? 1 : s.descriptor.index - l.descriptor.index;\n });\n return a[0] || null;\n}, is = gt(function(t, r) {\n var n = r[t.line];\n return {\n value: n,\n point: Mi(t.line, n)\n };\n}), rQ = function(t, r, n) {\n var o = t.axis;\n if (t.descriptor.mode === "virtual")\n return Mi(o.line, r[o.line]);\n var i = t.subject.page.contentBox[o.size], a = vi(t.descriptor.id, n), s = a.reduce(function(p, d) {\n return p + d.client.marginBox[o.size];\n }, 0), l = s + r[o.line], c = l - i;\n return c <= 0 ? null : Mi(o.line, c);\n}, eC = function(t, r) {\n return H0({}, t, {\n scroll: H0({}, t.scroll, {\n max: r\n })\n });\n}, tC = function(t, r, n) {\n var o = t.frame;\n Fa(r, t) && ( false ? 0 : V1(!1)), t.subject.withPlaceholder && ( false ? 0 : V1(!1));\n var i = is(t.axis, r.displaceBy).point, a = rQ(t, i, n), s = {\n placeholderSize: i,\n increasedBy: a,\n oldFrameMaxScroll: t.frame ? t.frame.scroll.max : null\n };\n if (!o) {\n var l = xa({\n page: t.subject.page,\n withPlaceholder: s,\n axis: t.axis,\n frame: t.frame\n });\n return H0({}, t, {\n subject: l\n });\n }\n var c = a ? Ht(o.scroll.max, a) : o.scroll.max, p = eC(o, c), d = xa({\n page: t.subject.page,\n withPlaceholder: s,\n axis: t.axis,\n frame: p\n });\n return H0({}, t, {\n subject: d,\n frame: p\n });\n}, nQ = function(t) {\n var r = t.subject.withPlaceholder;\n r || ( false ? 0 : V1(!1));\n var n = t.frame;\n if (!n) {\n var o = xa({\n page: t.subject.page,\n axis: t.axis,\n frame: null,\n withPlaceholder: null\n });\n return H0({}, t, {\n subject: o\n });\n }\n var i = r.oldFrameMaxScroll;\n i || ( false ? 0 : V1(!1));\n var a = eC(n, i), s = xa({\n page: t.subject.page,\n axis: t.axis,\n frame: a,\n withPlaceholder: null\n });\n return H0({}, t, {\n subject: s,\n frame: a\n });\n}, oQ = function(e) {\n var t = e.previousPageBorderBoxCenter, r = e.moveRelativeTo, n = e.insideDestination, o = e.draggable, i = e.draggables, a = e.destination, s = e.viewport, l = e.afterCritical;\n if (!r) {\n if (n.length)\n return null;\n var c = {\n displaced: w4,\n displacedBy: Gz,\n at: {\n type: "REORDER",\n destination: {\n droppableId: a.descriptor.id,\n index: 0\n }\n }\n }, p = Bc({\n impact: c,\n draggable: o,\n droppable: a,\n draggables: i,\n afterCritical: l\n }), d = Fa(o, a) ? a : tC(a, o, i), u = $z({\n draggable: o,\n destination: d,\n newPageBorderBoxCenter: p,\n viewport: s.frame,\n withDroppableDisplacement: !1,\n onlyOnMainAxis: !0\n });\n return u ? c : null;\n }\n var h = t[a.axis.line] <= r.page.borderBox.center[a.axis.line], b = function() {\n var C = r.descriptor.index;\n return r.descriptor.id === o.descriptor.id || h ? C : C + 1;\n }(), M = is(a.axis, o.displaceBy);\n return Yl({\n draggable: o,\n insideDestination: n,\n destination: a,\n viewport: s,\n displacedBy: M,\n last: w4,\n index: b\n });\n}, iQ = function(e) {\n var t = e.isMovingForward, r = e.previousPageBorderBoxCenter, n = e.draggable, o = e.isOver, i = e.draggables, a = e.droppables, s = e.viewport, l = e.afterCritical, c = $X({\n isMovingForward: t,\n pageBorderBoxCenter: r,\n source: o,\n droppables: a,\n viewport: s\n });\n if (!c)\n return null;\n var p = vi(c.descriptor.id, i), d = tQ({\n pageBorderBoxCenter: r,\n viewport: s,\n destination: c,\n insideDestination: p,\n afterCritical: l\n }), u = oQ({\n previousPageBorderBoxCenter: r,\n destination: c,\n draggable: n,\n draggables: i,\n moveRelativeTo: d,\n insideDestination: p,\n viewport: s,\n afterCritical: l\n });\n if (!u)\n return null;\n var h = Bc({\n impact: u,\n draggable: n,\n droppable: c,\n draggables: i,\n afterCritical: l\n }), b = g9({\n pageBorderBoxCenter: h,\n draggable: n,\n viewport: s\n });\n return {\n clientSelection: b,\n impact: u,\n scrollJumpRequest: null\n };\n}, k2 = function(e) {\n var t = e.at;\n return t ? t.type === "REORDER" ? t.destination.droppableId : t.combine.droppableId : null;\n}, aQ = function(t, r) {\n var n = k2(t);\n return n ? r[n] : null;\n}, sQ = function(e) {\n var t = e.state, r = e.type, n = aQ(t.impact, t.dimensions.droppables), o = !!n, i = t.dimensions.droppables[t.critical.droppable.id], a = n || i, s = a.axis.direction, l = s === "vertical" && (r === "MOVE_UP" || r === "MOVE_DOWN") || s === "horizontal" && (r === "MOVE_LEFT" || r === "MOVE_RIGHT");\n if (l && !o)\n return null;\n var c = r === "MOVE_DOWN" || r === "MOVE_RIGHT", p = t.dimensions.draggables[t.critical.draggable.id], d = t.current.page.borderBoxCenter, u = t.dimensions, h = u.draggables, b = u.droppables;\n return l ? _X({\n isMovingForward: c,\n previousPageBorderBoxCenter: d,\n draggable: p,\n destination: a,\n draggables: h,\n viewport: t.viewport,\n previousClientSelection: t.current.client.selection,\n previousImpact: t.impact,\n afterCritical: t.afterCritical\n }) : iQ({\n isMovingForward: c,\n previousPageBorderBoxCenter: d,\n draggable: p,\n isOver: a,\n draggables: h,\n droppables: b,\n viewport: t.viewport,\n afterCritical: t.afterCritical\n });\n};\nfunction Jo(e) {\n return e.phase === "DRAGGING" || e.phase === "COLLECTING";\n}\nfunction rC(e) {\n var t = rr(e.top, e.bottom), r = rr(e.left, e.right);\n return function(o) {\n return t(o.y) && r(o.x);\n };\n}\nfunction lQ(e, t) {\n return e.left < t.right && e.right > t.left && e.top < t.bottom && e.bottom > t.top;\n}\nfunction cQ(e) {\n var t = e.pageBorderBox, r = e.draggable, n = e.candidates, o = r.page.borderBox.center, i = n.map(function(a) {\n var s = a.axis, l = Mi(a.axis.line, t.center[s.line], a.page.borderBox.center[s.crossAxisLine]);\n return {\n id: a.descriptor.id,\n distance: L4(o, l)\n };\n }).sort(function(a, s) {\n return s.distance - a.distance;\n });\n return i[0] ? i[0].id : null;\n}\nfunction pQ(e) {\n var t = e.pageBorderBox, r = e.draggable, n = e.droppables, o = qc(n).filter(function(i) {\n if (!i.isEnabled)\n return !1;\n var a = i.subject.active;\n if (!a || !lQ(t, a))\n return !1;\n if (rC(a)(t.center))\n return !0;\n var s = i.axis, l = a.center[s.crossAxisLine], c = t[s.crossAxisStart], p = t[s.crossAxisEnd], d = rr(a[s.crossAxisStart], a[s.crossAxisEnd]), u = d(c), h = d(p);\n return !u && !h ? !0 : u ? c < l : p > l;\n });\n return o.length ? o.length === 1 ? o[0].descriptor.id : cQ({\n pageBorderBox: t,\n draggable: r,\n candidates: o\n }) : null;\n}\nvar nC = function(t, r) {\n return fr(os(t, r));\n}, dQ = function(e, t) {\n var r = e.frame;\n return r ? nC(t, r.scroll.diff.value) : t;\n};\nfunction oC(e) {\n var t = e.displaced, r = e.id;\n return !!(t.visible[r] || t.invisible[r]);\n}\nfunction AQ(e) {\n var t = e.draggable, r = e.closest, n = e.inHomeList;\n return r ? n && r.descriptor.index > t.descriptor.index ? r.descriptor.index - 1 : r.descriptor.index : null;\n}\nvar uQ = function(e) {\n var t = e.pageBorderBoxWithDroppableScroll, r = e.draggable, n = e.destination, o = e.insideDestination, i = e.last, a = e.viewport, s = e.afterCritical, l = n.axis, c = is(n.axis, r.displaceBy), p = c.value, d = t[l.start], u = t[l.end], h = Rc(r, o), b = Bo(h, function(C) {\n var g = C.descriptor.id, f = C.page.borderBox.center[l.line], O = Co(g, s), m = oC({\n displaced: i,\n id: g\n });\n return O ? m ? u <= f : d < f - p : m ? u <= f + p : d < f;\n }), M = AQ({\n draggable: r,\n closest: b,\n inHomeList: Fa(r, n)\n });\n return Yl({\n draggable: r,\n insideDestination: o,\n destination: n,\n viewport: a,\n last: i,\n displacedBy: c,\n index: M\n });\n}, bQ = 4, hQ = function(e) {\n var t = e.draggable, r = e.pageBorderBoxWithDroppableScroll, n = e.previousImpact, o = e.destination, i = e.insideDestination, a = e.afterCritical;\n if (!o.isCombineEnabled)\n return null;\n var s = o.axis, l = is(o.axis, t.displaceBy), c = l.value, p = r[s.start], d = r[s.end], u = Rc(t, i), h = Bo(u, function(M) {\n var C = M.descriptor.id, g = M.page.borderBox, f = g[s.size], O = f / bQ, m = Co(C, a), v = oC({\n displaced: n.displaced,\n id: C\n });\n return m ? v ? d > g[s.start] + O && d < g[s.end] - O : p > g[s.start] - c + O && p < g[s.end] - c - O : v ? d > g[s.start] + c + O && d < g[s.end] + c - O : p > g[s.start] + O && p < g[s.end] - O;\n });\n if (!h)\n return null;\n var b = {\n displacedBy: l,\n displaced: n.displaced,\n at: {\n type: "COMBINE",\n combine: {\n draggableId: h.descriptor.id,\n droppableId: o.descriptor.id\n }\n }\n };\n return b;\n}, iC = function(e) {\n var t = e.pageOffset, r = e.draggable, n = e.draggables, o = e.droppables, i = e.previousImpact, a = e.viewport, s = e.afterCritical, l = nC(r.page.borderBox, t), c = pQ({\n pageBorderBox: l,\n draggable: r,\n droppables: o\n });\n if (!c)\n return RX;\n var p = o[c], d = vi(p.descriptor.id, n), u = dQ(p, l);\n return hQ({\n pageBorderBoxWithDroppableScroll: u,\n draggable: r,\n previousImpact: i,\n destination: p,\n insideDestination: d,\n afterCritical: s\n }) || uQ({\n pageBorderBoxWithDroppableScroll: u,\n draggable: r,\n destination: p,\n insideDestination: d,\n last: i.displaced,\n viewport: a,\n afterCritical: s\n });\n}, z9 = function(e, t) {\n var r;\n return H0({}, e, (r = {}, r[t.descriptor.id] = t, r));\n}, MQ = function(t) {\n var r = t.previousImpact, n = t.impact, o = t.droppables, i = k2(r), a = k2(n);\n if (!i || i === a)\n return o;\n var s = o[i];\n if (!s.subject.withPlaceholder)\n return o;\n var l = nQ(s);\n return z9(o, l);\n}, fQ = function(e) {\n var t = e.draggable, r = e.draggables, n = e.droppables, o = e.previousImpact, i = e.impact, a = MQ({\n previousImpact: o,\n impact: i,\n droppables: n\n }), s = k2(i);\n if (!s)\n return a;\n var l = n[s];\n if (Fa(t, l) || l.subject.withPlaceholder)\n return a;\n var c = tC(l, t, r);\n return z9(a, c);\n}, J3 = function(e) {\n var t = e.state, r = e.clientSelection, n = e.dimensions, o = e.viewport, i = e.impact, a = e.scrollJumpRequest, s = o || t.viewport, l = n || t.dimensions, c = r || t.current.client.selection, p = S2(c, t.initial.client.selection), d = {\n offset: p,\n selection: c,\n borderBoxCenter: Ht(t.initial.client.borderBoxCenter, p)\n }, u = {\n selection: Ht(d.selection, s.scroll.current),\n borderBoxCenter: Ht(d.borderBoxCenter, s.scroll.current),\n offset: Ht(d.offset, s.scroll.diff.value)\n }, h = {\n client: d,\n page: u\n };\n if (t.phase === "COLLECTING")\n return H0({\n phase: "COLLECTING"\n }, t, {\n dimensions: l,\n viewport: s,\n current: h\n });\n var b = l.draggables[t.critical.draggable.id], M = i || iC({\n pageOffset: u.offset,\n draggable: b,\n draggables: l.draggables,\n droppables: l.droppables,\n previousImpact: t.impact,\n viewport: s,\n afterCritical: t.afterCritical\n }), C = fQ({\n draggable: b,\n impact: M,\n previousImpact: t.impact,\n draggables: l.draggables,\n droppables: l.droppables\n }), g = H0({}, t, {\n current: h,\n dimensions: {\n draggables: l.draggables,\n droppables: C\n },\n impact: M,\n viewport: s,\n scrollJumpRequest: a || null,\n forceShouldAnimate: a ? !1 : null\n });\n return g;\n};\nfunction gQ(e, t) {\n return e.map(function(r) {\n return t[r];\n });\n}\nvar aC = function(e) {\n var t = e.impact, r = e.viewport, n = e.draggables, o = e.destination, i = e.forceShouldAnimate, a = t.displaced, s = gQ(a.all, n), l = q4({\n afterDragging: s,\n destination: o,\n displacedBy: t.displacedBy,\n viewport: r.frame,\n forceShouldAnimate: i,\n last: a\n });\n return H0({}, t, {\n displaced: l\n });\n}, sC = function(e) {\n var t = e.impact, r = e.draggable, n = e.droppable, o = e.draggables, i = e.viewport, a = e.afterCritical, s = Bc({\n impact: t,\n draggable: r,\n draggables: o,\n droppable: n,\n afterCritical: a\n });\n return g9({\n pageBorderBoxCenter: s,\n draggable: r,\n viewport: i\n });\n}, lC = function(e) {\n var t = e.state, r = e.dimensions, n = e.viewport;\n t.movementMode !== "SNAP" && ("production", V1(!1));\n var o = t.impact, i = n || t.viewport, a = r || t.dimensions, s = a.draggables, l = a.droppables, c = s[t.critical.draggable.id], p = k2(o);\n p || ( false ? 0 : V1(!1));\n var d = l[p], u = aC({\n impact: o,\n viewport: i,\n destination: d,\n draggables: s\n }), h = sC({\n impact: u,\n draggable: c,\n droppable: d,\n draggables: s,\n viewport: i,\n afterCritical: t.afterCritical\n });\n return J3({\n impact: u,\n clientSelection: h,\n state: t,\n dimensions: a,\n viewport: i\n });\n}, zQ = function(e) {\n return {\n index: e.index,\n droppableId: e.droppableId\n };\n}, cC = function(e) {\n var t = e.draggable, r = e.home, n = e.draggables, o = e.viewport, i = is(r.axis, t.displaceBy), a = vi(r.descriptor.id, n), s = a.indexOf(t);\n s === -1 && ( false ? 0 : V1(!1));\n var l = a.slice(s + 1), c = l.reduce(function(h, b) {\n return h[b.descriptor.id] = !0, h;\n }, {}), p = {\n inVirtualList: r.descriptor.mode === "virtual",\n displacedBy: i,\n effected: c\n }, d = q4({\n afterDragging: l,\n destination: r,\n displacedBy: i,\n last: null,\n viewport: o.frame,\n forceShouldAnimate: !1\n }), u = {\n displaced: d,\n displacedBy: i,\n at: {\n type: "REORDER",\n destination: zQ(t.descriptor)\n }\n };\n return {\n impact: u,\n afterCritical: p\n };\n}, CQ = function(e, t) {\n return {\n draggables: e.draggables,\n droppables: z9(e.droppables, t)\n };\n}, as = function(t) {\n "production";\n}, ss = function(t) {\n "production";\n}, OQ = function(e) {\n var t = e.draggable, r = e.offset, n = e.initialWindowScroll, o = Pl(t.client, r), i = Vl(o, n), a = H0({}, t, {\n placeholder: H0({}, t.placeholder, {\n client: o\n }),\n client: o,\n page: i\n });\n return a;\n}, mQ = function(e) {\n var t = e.frame;\n return t || ( false ? 0 : V1(!1)), t;\n}, vQ = function(e) {\n var t = e.additions, r = e.updatedDroppables, n = e.viewport, o = n.scroll.diff.value;\n return t.map(function(i) {\n var a = i.descriptor.droppableId, s = r[a], l = mQ(s), c = l.scroll.diff.value, p = Ht(o, c), d = OQ({\n draggable: i,\n offset: p,\n initialWindowScroll: n.scroll.initial\n });\n return d;\n });\n}, yQ = function(e) {\n var t = e.state, r = e.published;\n as();\n var n = r.modified.map(function(O) {\n var m = t.dimensions.droppables[O.droppableId], v = A9(m, O.scroll);\n return v;\n }), o = H0({}, t.dimensions.droppables, {}, Xz(n)), i = Qz(vQ({\n additions: r.additions,\n updatedDroppables: o,\n viewport: t.viewport\n })), a = H0({}, t.dimensions.draggables, {}, i);\n r.removals.forEach(function(O) {\n delete a[O];\n });\n var s = {\n droppables: o,\n draggables: a\n }, l = k2(t.impact), c = l ? s.droppables[l] : null, p = s.draggables[t.critical.draggable.id], d = s.droppables[t.critical.droppable.id], u = cC({\n draggable: p,\n home: d,\n draggables: a,\n viewport: t.viewport\n }), h = u.impact, b = u.afterCritical, M = c && c.isCombineEnabled ? t.impact : h, C = iC({\n pageOffset: t.current.page.offset,\n draggable: s.draggables[t.critical.draggable.id],\n draggables: s.draggables,\n droppables: s.droppables,\n previousImpact: M,\n viewport: t.viewport,\n afterCritical: b\n });\n ss();\n var g = H0({\n phase: "DRAGGING"\n }, t, {\n phase: "DRAGGING",\n impact: C,\n onLiftImpact: h,\n dimensions: s,\n afterCritical: b,\n forceShouldAnimate: !1\n });\n if (t.phase === "COLLECTING")\n return g;\n var f = H0({\n phase: "DROP_PENDING"\n }, g, {\n phase: "DROP_PENDING",\n reason: t.reason,\n isWaiting: !1\n });\n return f;\n}, k8 = function(t) {\n return t.movementMode === "SNAP";\n}, np = function(t, r, n) {\n var o = CQ(t.dimensions, r);\n return !k8(t) || n ? J3({\n state: t,\n dimensions: o\n }) : lC({\n state: t,\n dimensions: o\n });\n};\nfunction op(e) {\n return e.isDragging && e.movementMode === "SNAP" ? H0({\n phase: "DRAGGING"\n }, e, {\n scrollJumpRequest: null\n }) : e;\n}\nvar Eb = {\n phase: "IDLE",\n completed: null,\n shouldFlush: !1\n}, LQ = function(e, t) {\n if (e === void 0 && (e = Eb), t.type === "FLUSH")\n return H0({}, Eb, {\n shouldFlush: !0\n });\n if (t.type === "INITIAL_PUBLISH") {\n e.phase !== "IDLE" && ( false ? 0 : V1(!1));\n var r = t.payload, n = r.critical, o = r.clientSelection, i = r.viewport, a = r.dimensions, s = r.movementMode, l = a.draggables[n.draggable.id], c = a.droppables[n.droppable.id], p = {\n selection: o,\n borderBoxCenter: l.client.borderBox.center,\n offset: Bt\n }, d = {\n client: p,\n page: {\n selection: Ht(p.selection, i.scroll.initial),\n borderBoxCenter: Ht(p.selection, i.scroll.initial),\n offset: Ht(p.selection, i.scroll.diff.value)\n }\n }, u = qc(a.droppables).every(function(J) {\n return !J.isFixedOnPage;\n }), h = cC({\n draggable: l,\n home: c,\n draggables: a.draggables,\n viewport: i\n }), b = h.impact, M = h.afterCritical, C = {\n phase: "DRAGGING",\n isDragging: !0,\n critical: n,\n movementMode: s,\n dimensions: a,\n initial: d,\n current: d,\n isWindowScrollAllowed: u,\n impact: b,\n afterCritical: M,\n onLiftImpact: b,\n viewport: i,\n scrollJumpRequest: null,\n forceShouldAnimate: null\n };\n return C;\n }\n if (t.type === "COLLECTION_STARTING") {\n if (e.phase === "COLLECTING" || e.phase === "DROP_PENDING")\n return e;\n e.phase !== "DRAGGING" && ( false ? 0 : V1(!1));\n var g = H0({\n phase: "COLLECTING"\n }, e, {\n phase: "COLLECTING"\n });\n return g;\n }\n if (t.type === "PUBLISH_WHILE_DRAGGING")\n return e.phase === "COLLECTING" || e.phase === "DROP_PENDING" || ( false ? 0 : V1(!1)), yQ({\n state: e,\n published: t.payload\n });\n if (t.type === "MOVE") {\n if (e.phase === "DROP_PENDING")\n return e;\n Jo(e) || ( false ? 0 : V1(!1));\n var f = t.payload.client;\n return uo(f, e.current.client.selection) ? e : J3({\n state: e,\n clientSelection: f,\n impact: k8(e) ? e.impact : null\n });\n }\n if (t.type === "UPDATE_DROPPABLE_SCROLL") {\n if (e.phase === "DROP_PENDING" || e.phase === "COLLECTING")\n return op(e);\n Jo(e) || ( false ? 0 : V1(!1));\n var O = t.payload, m = O.id, v = O.newScroll, y = e.dimensions.droppables[m];\n if (!y)\n return e;\n var z = A9(y, v);\n return np(e, z, !1);\n }\n if (t.type === "UPDATE_DROPPABLE_IS_ENABLED") {\n if (e.phase === "DROP_PENDING")\n return e;\n Jo(e) || ( false ? 0 : V1(!1));\n var N = t.payload, W = N.id, T = N.isEnabled, x = e.dimensions.droppables[W];\n x || ( false ? 0 : V1(!1)), x.isEnabled === T && ( false ? 0 : V1(!1));\n var E = H0({}, x, {\n isEnabled: T\n });\n return np(e, E, !0);\n }\n if (t.type === "UPDATE_DROPPABLE_IS_COMBINE_ENABLED") {\n if (e.phase === "DROP_PENDING")\n return e;\n Jo(e) || ( false ? 0 : V1(!1));\n var L = t.payload, w = L.id, q = L.isCombineEnabled, S = e.dimensions.droppables[w];\n S || ( false ? 0 : V1(!1)), S.isCombineEnabled === q && ( false ? 0 : V1(!1));\n var B = H0({}, S, {\n isCombineEnabled: q\n });\n return np(e, B, !0);\n }\n if (t.type === "MOVE_BY_WINDOW_SCROLL") {\n if (e.phase === "DROP_PENDING" || e.phase === "DROP_ANIMATING")\n return e;\n Jo(e) || ( false ? 0 : V1(!1)), e.isWindowScrollAllowed || ( false ? 0 : V1(!1));\n var I = t.payload.newScroll;\n if (uo(e.viewport.scroll.current, I))\n return op(e);\n var P = _z(e.viewport, I);\n return k8(e) ? lC({\n state: e,\n viewport: P\n }) : J3({\n state: e,\n viewport: P\n });\n }\n if (t.type === "UPDATE_VIEWPORT_MAX_SCROLL") {\n if (!Jo(e))\n return e;\n var k = t.payload.maxScroll;\n if (uo(k, e.viewport.scroll.max))\n return e;\n var K = H0({}, e.viewport, {\n scroll: H0({}, e.viewport.scroll, {\n max: k\n })\n });\n return H0({\n phase: "DRAGGING"\n }, e, {\n viewport: K\n });\n }\n if (t.type === "MOVE_UP" || t.type === "MOVE_DOWN" || t.type === "MOVE_LEFT" || t.type === "MOVE_RIGHT") {\n if (e.phase === "COLLECTING" || e.phase === "DROP_PENDING")\n return e;\n e.phase !== "DRAGGING" && ( false ? 0 : V1(!1));\n var $ = sQ({\n state: e,\n type: t.type\n });\n return $ ? J3({\n state: e,\n impact: $.impact,\n clientSelection: $.clientSelection,\n scrollJumpRequest: $.scrollJumpRequest\n }) : e;\n }\n if (t.type === "DROP_PENDING") {\n var j = t.payload.reason;\n e.phase !== "COLLECTING" && ( false ? 0 : V1(!1));\n var r1 = H0({\n phase: "DROP_PENDING"\n }, e, {\n phase: "DROP_PENDING",\n isWaiting: !0,\n reason: j\n });\n return r1;\n }\n if (t.type === "DROP_ANIMATE") {\n var a1 = t.payload, _ = a1.completed, Y = a1.dropDuration, D = a1.newHomeClientOffset;\n e.phase === "DRAGGING" || e.phase === "DROP_PENDING" || ( false ? 0 : V1(!1));\n var H = {\n phase: "DROP_ANIMATING",\n completed: _,\n dropDuration: Y,\n newHomeClientOffset: D,\n dimensions: e.dimensions\n };\n return H;\n }\n if (t.type === "DROP_COMPLETE") {\n var G = t.payload.completed;\n return {\n phase: "IDLE",\n completed: G,\n shouldFlush: !1\n };\n }\n return e;\n}, wQ = function(t) {\n return {\n type: "BEFORE_INITIAL_CAPTURE",\n payload: t\n };\n}, qQ = function(t) {\n return {\n type: "LIFT",\n payload: t\n };\n}, xQ = function(t) {\n return {\n type: "INITIAL_PUBLISH",\n payload: t\n };\n}, RQ = function(t) {\n return {\n type: "PUBLISH_WHILE_DRAGGING",\n payload: t\n };\n}, BQ = function() {\n return {\n type: "COLLECTION_STARTING",\n payload: null\n };\n}, WQ = function(t) {\n return {\n type: "UPDATE_DROPPABLE_SCROLL",\n payload: t\n };\n}, EQ = function(t) {\n return {\n type: "UPDATE_DROPPABLE_IS_ENABLED",\n payload: t\n };\n}, SQ = function(t) {\n return {\n type: "UPDATE_DROPPABLE_IS_COMBINE_ENABLED",\n payload: t\n };\n}, pC = function(t) {\n return {\n type: "MOVE",\n payload: t\n };\n}, kQ = function(t) {\n return {\n type: "MOVE_BY_WINDOW_SCROLL",\n payload: t\n };\n}, NQ = function(t) {\n return {\n type: "UPDATE_VIEWPORT_MAX_SCROLL",\n payload: t\n };\n}, IQ = function() {\n return {\n type: "MOVE_UP",\n payload: null\n };\n}, TQ = function() {\n return {\n type: "MOVE_DOWN",\n payload: null\n };\n}, DQ = function() {\n return {\n type: "MOVE_RIGHT",\n payload: null\n };\n}, HQ = function() {\n return {\n type: "MOVE_LEFT",\n payload: null\n };\n}, C9 = function() {\n return {\n type: "FLUSH",\n payload: null\n };\n}, PQ = function(t) {\n return {\n type: "DROP_ANIMATE",\n payload: t\n };\n}, O9 = function(t) {\n return {\n type: "DROP_COMPLETE",\n payload: t\n };\n}, dC = function(t) {\n return {\n type: "DROP",\n payload: t\n };\n}, VQ = function(t) {\n return {\n type: "DROP_PENDING",\n payload: t\n };\n}, AC = function() {\n return {\n type: "DROP_ANIMATION_FINISHED",\n payload: null\n };\n};\nfunction FQ(e) {\n if (!(e.length <= 1)) {\n for (var t = e.map(function(s) {\n return s.descriptor.index;\n }), r = {}, n = 1; n < t.length; n++) {\n var o = t[n], i = t[n - 1];\n o !== i + 1 && (r[o] = !0);\n }\n if (Object.keys(r).length) {\n var a = t.map(function(s) {\n var l = !!r[s];\n return l ? "[🔥" + s + "]" : "" + s;\n }).join(", ");\n false && 0;\n }\n }\n}\nfunction UQ(e, t) {\n if (false) // removed by dead control flow\n{ var r; }\n}\nvar YQ = function(e) {\n return function(t) {\n var r = t.getState, n = t.dispatch;\n return function(o) {\n return function(i) {\n if (i.type !== "LIFT") {\n o(i);\n return;\n }\n var a = i.payload, s = a.id, l = a.clientSelection, c = a.movementMode, p = r();\n p.phase === "DROP_ANIMATING" && n(O9({\n completed: p.completed\n })), r().phase !== "IDLE" && ( false ? 0 : V1(!1)), n(C9()), n(wQ({\n draggableId: s,\n movementMode: c\n }));\n var d = {\n shouldPublishImmediately: c === "SNAP"\n }, u = {\n draggableId: s,\n scrollOptions: d\n }, h = e.startPublishing(u), b = h.critical, M = h.dimensions, C = h.viewport;\n UQ(b, M), n(xQ({\n critical: b,\n dimensions: M,\n clientSelection: l,\n movementMode: c,\n viewport: C\n }));\n };\n };\n };\n}, XQ = function(e) {\n return function() {\n return function(t) {\n return function(r) {\n r.type === "INITIAL_PUBLISH" && e.dragging(), r.type === "DROP_ANIMATE" && e.dropping(r.payload.completed.result.reason), (r.type === "FLUSH" || r.type === "DROP_COMPLETE") && e.resting(), t(r);\n };\n };\n };\n}, m9 = {\n outOfTheWay: "cubic-bezier(0.2, 0, 0, 1)",\n drop: "cubic-bezier(.2,1,.1,1)"\n}, x4 = {\n opacity: {\n drop: 0,\n combining: 0.7\n },\n scale: {\n drop: 0.75\n }\n}, v9 = {\n outOfTheWay: 0.2,\n minDropTime: 0.33,\n maxDropTime: 0.55\n}, Xo = v9.outOfTheWay + "s " + m9.outOfTheWay, _3 = {\n fluid: "opacity " + Xo,\n snap: "transform " + Xo + ", opacity " + Xo,\n drop: function(t) {\n var r = t + "s " + m9.drop;\n return "transform " + r + ", opacity " + r;\n },\n outOfTheWay: "transform " + Xo,\n placeholder: "height " + Xo + ", width " + Xo + ", margin " + Xo\n}, Sb = function(t) {\n return uo(t, Bt) ? null : "translate(" + t.x + "px, " + t.y + "px)";\n}, N8 = {\n moveTo: Sb,\n drop: function(t, r) {\n var n = Sb(t);\n return n ? r ? n + " scale(" + x4.scale.drop + ")" : n : null;\n }\n}, I8 = v9.minDropTime, uC = v9.maxDropTime, QQ = uC - I8, kb = 1500, GQ = 0.6, jQ = function(e) {\n var t = e.current, r = e.destination, n = e.reason, o = L4(t, r);\n if (o <= 0)\n return I8;\n if (o >= kb)\n return uC;\n var i = o / kb, a = I8 + QQ * i, s = n === "CANCEL" ? a * GQ : a;\n return Number(s.toFixed(2));\n}, KQ = function(e) {\n var t = e.impact, r = e.draggable, n = e.dimensions, o = e.viewport, i = e.afterCritical, a = n.draggables, s = n.droppables, l = k2(t), c = l ? s[l] : null, p = s[r.descriptor.droppableId], d = sC({\n impact: t,\n draggable: r,\n draggables: a,\n afterCritical: i,\n droppable: c || p,\n viewport: o\n }), u = S2(d, r.client.borderBox.center);\n return u;\n}, ZQ = function(e) {\n var t = e.draggables, r = e.reason, n = e.lastImpact, o = e.home, i = e.viewport, a = e.onLiftImpact;\n if (!n.at || r !== "DROP") {\n var s = aC({\n draggables: t,\n impact: a,\n destination: o,\n viewport: i,\n forceShouldAnimate: !0\n });\n return {\n impact: s,\n didDropInsideDroppable: !1\n };\n }\n if (n.at.type === "REORDER")\n return {\n impact: n,\n didDropInsideDroppable: !0\n };\n var l = H0({}, n, {\n displaced: w4\n });\n return {\n impact: l,\n didDropInsideDroppable: !0\n };\n}, JQ = function(e) {\n var t = e.getState, r = e.dispatch;\n return function(n) {\n return function(o) {\n if (o.type !== "DROP") {\n n(o);\n return;\n }\n var i = t(), a = o.payload.reason;\n if (i.phase === "COLLECTING") {\n r(VQ({\n reason: a\n }));\n return;\n }\n if (i.phase !== "IDLE") {\n var s = i.phase === "DROP_PENDING" && i.isWaiting;\n s && ( false ? 0 : V1(!1)), i.phase === "DRAGGING" || i.phase === "DROP_PENDING" || ( false ? 0 : V1(!1));\n var l = i.critical, c = i.dimensions, p = c.draggables[i.critical.draggable.id], d = ZQ({\n reason: a,\n lastImpact: i.impact,\n afterCritical: i.afterCritical,\n onLiftImpact: i.onLiftImpact,\n home: i.dimensions.droppables[i.critical.droppable.id],\n viewport: i.viewport,\n draggables: i.dimensions.draggables\n }), u = d.impact, h = d.didDropInsideDroppable, b = h ? b9(u) : null, M = h ? xc(u) : null, C = {\n index: l.draggable.index,\n droppableId: l.droppable.id\n }, g = {\n draggableId: p.descriptor.id,\n type: p.descriptor.type,\n source: C,\n reason: a,\n mode: i.movementMode,\n destination: b,\n combine: M\n }, f = KQ({\n impact: u,\n draggable: p,\n dimensions: c,\n viewport: i.viewport,\n afterCritical: i.afterCritical\n }), O = {\n critical: i.critical,\n afterCritical: i.afterCritical,\n result: g,\n impact: u\n }, m = !uo(i.current.client.offset, f) || !!g.combine;\n if (!m) {\n r(O9({\n completed: O\n }));\n return;\n }\n var v = jQ({\n current: i.current.client.offset,\n destination: f,\n reason: a\n }), y = {\n newHomeClientOffset: f,\n dropDuration: v,\n completed: O\n };\n r(PQ(y));\n }\n };\n };\n}, bC = function() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n};\nfunction _Q(e) {\n return {\n eventName: "scroll",\n options: {\n passive: !0,\n capture: !1\n },\n fn: function(r) {\n r.target !== window && r.target !== window.document || e();\n }\n };\n}\nfunction $Q(e) {\n var t = e.onWindowScroll;\n function r() {\n t(bC());\n }\n var n = v4(r), o = _Q(n), i = Ao;\n function a() {\n return i !== Ao;\n }\n function s() {\n a() && ( false ? 0 : V1(!1)), i = _2(window, [o]);\n }\n function l() {\n a() || ( false ? 0 : V1(!1)), n.cancel(), i(), i = Ao;\n }\n return {\n start: s,\n stop: l,\n isActive: a\n };\n}\nvar eG = function(t) {\n return t.type === "DROP_COMPLETE" || t.type === "DROP_ANIMATE" || t.type === "FLUSH";\n}, tG = function(e) {\n var t = $Q({\n onWindowScroll: function(n) {\n e.dispatch(kQ({\n newScroll: n\n }));\n }\n });\n return function(r) {\n return function(n) {\n !t.isActive() && n.type === "INITIAL_PUBLISH" && t.start(), t.isActive() && eG(n) && t.stop(), r(n);\n };\n };\n}, rG = function(e) {\n var t = !1, r = !1, n = setTimeout(function() {\n r = !0;\n }), o = function(a) {\n if (t) {\n false && 0;\n return;\n }\n if (r) {\n false && 0;\n return;\n }\n t = !0, e(a), clearTimeout(n);\n };\n return o.wasCalled = function() {\n return t;\n }, o;\n}, nG = function() {\n var e = [], t = function(i) {\n var a = u9(e, function(c) {\n return c.timerId === i;\n });\n a === -1 && ( false ? 0 : V1(!1));\n var s = e.splice(a, 1), l = s[0];\n l.callback();\n }, r = function(i) {\n var a = setTimeout(function() {\n return t(a);\n }), s = {\n timerId: a,\n callback: i\n };\n e.push(s);\n }, n = function() {\n if (e.length) {\n var i = [].concat(e);\n e.length = 0, i.forEach(function(a) {\n clearTimeout(a.timerId), a.callback();\n });\n }\n };\n return {\n add: r,\n flush: n\n };\n}, oG = function(t, r) {\n return t == null && r == null ? !0 : t == null || r == null ? !1 : t.droppableId === r.droppableId && t.index === r.index;\n}, iG = function(t, r) {\n return t == null && r == null ? !0 : t == null || r == null ? !1 : t.draggableId === r.draggableId && t.droppableId === r.droppableId;\n}, aG = function(t, r) {\n if (t === r)\n return !0;\n var n = t.draggable.id === r.draggable.id && t.draggable.droppableId === r.draggable.droppableId && t.draggable.type === r.draggable.type && t.draggable.index === r.draggable.index, o = t.droppable.id === r.droppable.id && t.droppable.type === r.droppable.type;\n return n && o;\n}, m3 = function(t, r) {\n as(), r(), ss();\n}, h5 = function(t, r) {\n return {\n draggableId: t.draggable.id,\n type: t.droppable.type,\n source: {\n droppableId: t.droppable.id,\n index: t.draggable.index\n },\n mode: r\n };\n}, ip = function(t, r, n, o) {\n if (!t) {\n n(o(r));\n return;\n }\n var i = rG(n), a = {\n announce: i\n };\n t(r, a), i.wasCalled() || n(o(r));\n}, sG = function(e, t) {\n var r = nG(), n = null, o = function(u, h) {\n n && ( false ? 0 : V1(!1)), m3("onBeforeCapture", function() {\n var b = e().onBeforeCapture;\n if (b) {\n var M = {\n draggableId: u,\n mode: h\n };\n b(M);\n }\n });\n }, i = function(u, h) {\n n && ( false ? 0 : V1(!1)), m3("onBeforeDragStart", function() {\n var b = e().onBeforeDragStart;\n b && b(h5(u, h));\n });\n }, a = function(u, h) {\n n && ( false ? 0 : V1(!1));\n var b = h5(u, h);\n n = {\n mode: h,\n lastCritical: u,\n lastLocation: b.source,\n lastCombine: null\n }, r.add(function() {\n m3("onDragStart", function() {\n return ip(e().onDragStart, b, t, el.onDragStart);\n });\n });\n }, s = function(u, h) {\n var b = b9(h), M = xc(h);\n n || ( false ? 0 : V1(!1));\n var C = !aG(u, n.lastCritical);\n C && (n.lastCritical = u);\n var g = !oG(n.lastLocation, b);\n g && (n.lastLocation = b);\n var f = !iG(n.lastCombine, M);\n if (f && (n.lastCombine = M), !(!C && !g && !f)) {\n var O = H0({}, h5(u, n.mode), {\n combine: M,\n destination: b\n });\n r.add(function() {\n m3("onDragUpdate", function() {\n return ip(e().onDragUpdate, O, t, el.onDragUpdate);\n });\n });\n }\n }, l = function() {\n n || ( false ? 0 : V1(!1)), r.flush();\n }, c = function(u) {\n n || ( false ? 0 : V1(!1)), n = null, m3("onDragEnd", function() {\n return ip(e().onDragEnd, u, t, el.onDragEnd);\n });\n }, p = function() {\n if (n) {\n var u = H0({}, h5(n.lastCritical, n.mode), {\n combine: null,\n destination: null,\n reason: "CANCEL"\n });\n c(u);\n }\n };\n return {\n beforeCapture: o,\n beforeStart: i,\n start: a,\n update: s,\n flush: l,\n drop: c,\n abort: p\n };\n}, lG = function(e, t) {\n var r = sG(e, t);\n return function(n) {\n return function(o) {\n return function(i) {\n if (i.type === "BEFORE_INITIAL_CAPTURE") {\n r.beforeCapture(i.payload.draggableId, i.payload.movementMode);\n return;\n }\n if (i.type === "INITIAL_PUBLISH") {\n var a = i.payload.critical;\n r.beforeStart(a, i.payload.movementMode), o(i), r.start(a, i.payload.movementMode);\n return;\n }\n if (i.type === "DROP_COMPLETE") {\n var s = i.payload.completed.result;\n r.flush(), o(i), r.drop(s);\n return;\n }\n if (o(i), i.type === "FLUSH") {\n r.abort();\n return;\n }\n var l = n.getState();\n l.phase === "DRAGGING" && r.update(l.critical, l.impact);\n };\n };\n };\n}, cG = function(e) {\n return function(t) {\n return function(r) {\n if (r.type !== "DROP_ANIMATION_FINISHED") {\n t(r);\n return;\n }\n var n = e.getState();\n n.phase !== "DROP_ANIMATING" && ( false ? 0 : V1(!1)), e.dispatch(O9({\n completed: n.completed\n }));\n };\n };\n}, pG = function(e) {\n var t = null, r = null;\n function n() {\n r && (cancelAnimationFrame(r), r = null), t && (t(), t = null);\n }\n return function(o) {\n return function(i) {\n if ((i.type === "FLUSH" || i.type === "DROP_COMPLETE" || i.type === "DROP_ANIMATION_FINISHED") && n(), o(i), i.type === "DROP_ANIMATE") {\n var a = {\n eventName: "scroll",\n options: {\n capture: !0,\n passive: !1,\n once: !0\n },\n fn: function() {\n var l = e.getState();\n l.phase === "DROP_ANIMATING" && e.dispatch(AC());\n }\n };\n r = requestAnimationFrame(function() {\n r = null, t = _2(window, [a]);\n });\n }\n };\n };\n}, dG = function(e) {\n return function() {\n return function(t) {\n return function(r) {\n (r.type === "DROP_COMPLETE" || r.type === "FLUSH" || r.type === "DROP_ANIMATE") && e.stopPublishing(), t(r);\n };\n };\n };\n}, AG = function(e) {\n var t = !1;\n return function() {\n return function(r) {\n return function(n) {\n if (n.type === "INITIAL_PUBLISH") {\n t = !0, e.tryRecordFocus(n.payload.critical.draggable.id), r(n), e.tryRestoreFocusRecorded();\n return;\n }\n if (r(n), !!t) {\n if (n.type === "FLUSH") {\n t = !1, e.tryRestoreFocusRecorded();\n return;\n }\n if (n.type === "DROP_COMPLETE") {\n t = !1;\n var o = n.payload.completed.result;\n o.combine && e.tryShiftRecord(o.draggableId, o.combine.draggableId), e.tryRestoreFocusRecorded();\n }\n }\n };\n };\n };\n}, uG = function(t) {\n return t.type === "DROP_COMPLETE" || t.type === "DROP_ANIMATE" || t.type === "FLUSH";\n}, bG = function(e) {\n return function(t) {\n return function(r) {\n return function(n) {\n if (uG(n)) {\n e.stop(), r(n);\n return;\n }\n if (n.type === "INITIAL_PUBLISH") {\n r(n);\n var o = t.getState();\n o.phase !== "DRAGGING" && ( false ? 0 : V1(!1)), e.start(o);\n return;\n }\n r(n), e.scroll(t.getState());\n };\n };\n };\n}, hG = function(e) {\n return function(t) {\n return function(r) {\n if (t(r), r.type === "PUBLISH_WHILE_DRAGGING") {\n var n = e.getState();\n n.phase === "DROP_PENDING" && (n.isWaiting || e.dispatch(dC({\n reason: n.reason\n })));\n }\n };\n };\n}, MG = false ? 0 : wz, fG = function(e) {\n var t = e.dimensionMarshal, r = e.focusMarshal, n = e.styleMarshal, o = e.getResponders, i = e.announce, a = e.autoScroller;\n return Lz(LQ, MG(cY(XQ(n), dG(t), YQ(t), JQ, cG, pG, hG, bG(a), tG, AG(r), lG(o, i))));\n}, ap = function() {\n return {\n additions: {},\n removals: {},\n modified: {}\n };\n};\nfunction gG(e) {\n var t = e.registry, r = e.callbacks, n = ap(), o = null, i = function() {\n o || (r.collectionStarting(), o = requestAnimationFrame(function() {\n o = null, as();\n var p = n, d = p.additions, u = p.removals, h = p.modified, b = Object.keys(d).map(function(g) {\n return t.draggable.getById(g).getDimension(Bt);\n }).sort(function(g, f) {\n return g.descriptor.index - f.descriptor.index;\n }), M = Object.keys(h).map(function(g) {\n var f = t.droppable.getById(g), O = f.callbacks.getScrollWhileDragging();\n return {\n droppableId: g,\n scroll: O\n };\n }), C = {\n additions: b,\n removals: Object.keys(u),\n modified: M\n };\n n = ap(), ss(), r.publish(C);\n }));\n }, a = function(p) {\n var d = p.descriptor.id;\n n.additions[d] = p, n.modified[p.descriptor.droppableId] = !0, n.removals[d] && delete n.removals[d], i();\n }, s = function(p) {\n var d = p.descriptor;\n n.removals[d.id] = !0, n.modified[d.droppableId] = !0, n.additions[d.id] && delete n.additions[d.id], i();\n }, l = function() {\n o && (cancelAnimationFrame(o), o = null, n = ap());\n };\n return {\n add: a,\n remove: s,\n stop: l\n };\n}\nvar hC = function(e) {\n var t = e.scrollHeight, r = e.scrollWidth, n = e.height, o = e.width, i = S2({\n x: r,\n y: t\n }, {\n x: o,\n y: n\n }), a = {\n x: Math.max(0, i.x),\n y: Math.max(0, i.y)\n };\n return a;\n}, MC = function() {\n var e = document.documentElement;\n return e || ( false ? 0 : V1(!1)), e;\n}, fC = function() {\n var e = MC(), t = hC({\n scrollHeight: e.scrollHeight,\n scrollWidth: e.scrollWidth,\n width: e.clientWidth,\n height: e.clientHeight\n });\n return t;\n}, zG = function() {\n var e = bC(), t = fC(), r = e.y, n = e.x, o = MC(), i = o.clientWidth, a = o.clientHeight, s = n + i, l = r + a, c = fr({\n top: r,\n left: n,\n right: s,\n bottom: l\n }), p = {\n frame: c,\n scroll: {\n initial: e,\n current: e,\n max: t,\n diff: {\n value: Bt,\n displacement: Bt\n }\n }\n };\n return p;\n}, CG = function(e) {\n var t = e.critical, r = e.scrollOptions, n = e.registry;\n as();\n var o = zG(), i = o.scroll.current, a = t.droppable, s = n.droppable.getAllByType(a.type).map(function(d) {\n return d.callbacks.getDimensionAndWatchScroll(i, r);\n }), l = n.draggable.getAllByType(t.draggable.type).map(function(d) {\n return d.getDimension(i);\n }), c = {\n draggables: Qz(l),\n droppables: Xz(s)\n };\n ss();\n var p = {\n dimensions: c,\n critical: t,\n viewport: o\n };\n return p;\n};\nfunction Nb(e, t, r) {\n if (r.descriptor.id === t.id || r.descriptor.type !== t.type)\n return !1;\n var n = e.droppable.getById(r.descriptor.droppableId);\n return n.descriptor.mode !== "virtual" ? ( false && 0, !1) : !0;\n}\nvar OG = function(e, t) {\n var r = null, n = gG({\n callbacks: {\n publish: t.publishWhileDragging,\n collectionStarting: t.collectionStarting\n },\n registry: e\n }), o = function(h, b) {\n e.droppable.exists(h) || ( false ? 0 : V1(!1)), r && t.updateDroppableIsEnabled({\n id: h,\n isEnabled: b\n });\n }, i = function(h, b) {\n r && (e.droppable.exists(h) || ( false ? 0 : V1(!1)), t.updateDroppableIsCombineEnabled({\n id: h,\n isCombineEnabled: b\n }));\n }, a = function(h, b) {\n r && (e.droppable.exists(h) || ( false ? 0 : V1(!1)), t.updateDroppableScroll({\n id: h,\n newScroll: b\n }));\n }, s = function(h, b) {\n r && e.droppable.getById(h).callbacks.scroll(b);\n }, l = function() {\n if (r) {\n n.stop();\n var h = r.critical.droppable;\n e.droppable.getAllByType(h.type).forEach(function(b) {\n return b.callbacks.dragStopped();\n }), r.unsubscribe(), r = null;\n }\n }, c = function(h) {\n r || ( false ? 0 : V1(!1));\n var b = r.critical.draggable;\n h.type === "ADDITION" && Nb(e, b, h.value) && n.add(h.value), h.type === "REMOVAL" && Nb(e, b, h.value) && n.remove(h.value);\n }, p = function(h) {\n r && ( false ? 0 : V1(!1));\n var b = e.draggable.getById(h.draggableId), M = e.droppable.getById(b.descriptor.droppableId), C = {\n draggable: b.descriptor,\n droppable: M.descriptor\n }, g = e.subscribe(c);\n return r = {\n critical: C,\n unsubscribe: g\n }, CG({\n critical: C,\n registry: e,\n scrollOptions: h.scrollOptions\n });\n }, d = {\n updateDroppableIsEnabled: o,\n updateDroppableIsCombineEnabled: i,\n scrollDroppable: s,\n updateDroppableScroll: a,\n startPublishing: p,\n stopPublishing: l\n };\n return d;\n}, gC = function(e, t) {\n return e.phase === "IDLE" ? !0 : e.phase !== "DROP_ANIMATING" || e.completed.result.draggableId === t ? !1 : e.completed.result.reason === "DROP";\n}, mG = function(e) {\n window.scrollBy(e.x, e.y);\n}, vG = gt(function(e) {\n return qc(e).filter(function(t) {\n return !(!t.isEnabled || !t.frame);\n });\n}), yG = function(t, r) {\n var n = Bo(vG(r), function(o) {\n return o.frame || ( false ? 0 : V1(!1)), rC(o.frame.pageMarginBox)(t);\n });\n return n;\n}, LG = function(e) {\n var t = e.center, r = e.destination, n = e.droppables;\n if (r) {\n var o = n[r];\n return o.frame ? o : null;\n }\n var i = yG(t, n);\n return i;\n}, bo = {\n startFromPercentage: 0.25,\n maxScrollAtPercentage: 0.05,\n maxPixelScroll: 28,\n ease: function(t) {\n return Math.pow(t, 2);\n },\n durationDampening: {\n stopDampeningAt: 1200,\n accelerateAt: 360\n }\n}, wG = function(e, t) {\n var r = e[t.size] * bo.startFromPercentage, n = e[t.size] * bo.maxScrollAtPercentage, o = {\n startScrollingFrom: r,\n maxScrollValueAt: n\n };\n return o;\n}, zC = function(e) {\n var t = e.startOfRange, r = e.endOfRange, n = e.current, o = r - t;\n if (o === 0)\n return false && 0, 0;\n var i = n - t, a = i / o;\n return a;\n}, y9 = 1, qG = function(e, t) {\n if (e > t.startScrollingFrom)\n return 0;\n if (e <= t.maxScrollValueAt)\n return bo.maxPixelScroll;\n if (e === t.startScrollingFrom)\n return y9;\n var r = zC({\n startOfRange: t.maxScrollValueAt,\n endOfRange: t.startScrollingFrom,\n current: e\n }), n = 1 - r, o = bo.maxPixelScroll * bo.ease(n);\n return Math.ceil(o);\n}, Ib = bo.durationDampening.accelerateAt, Tb = bo.durationDampening.stopDampeningAt, xG = function(e, t) {\n var r = t, n = Tb, o = Date.now(), i = o - r;\n if (i >= Tb)\n return e;\n if (i < Ib)\n return y9;\n var a = zC({\n startOfRange: Ib,\n endOfRange: n,\n current: i\n }), s = e * bo.ease(a);\n return Math.ceil(s);\n}, Db = function(e) {\n var t = e.distanceToEdge, r = e.thresholds, n = e.dragStartTime, o = e.shouldUseTimeDampening, i = qG(t, r);\n return i === 0 ? 0 : o ? Math.max(xG(i, n), y9) : i;\n}, Hb = function(e) {\n var t = e.container, r = e.distanceToEdges, n = e.dragStartTime, o = e.axis, i = e.shouldUseTimeDampening, a = wG(t, o), s = r[o.end] < r[o.start];\n return s ? Db({\n distanceToEdge: r[o.end],\n thresholds: a,\n dragStartTime: n,\n shouldUseTimeDampening: i\n }) : -1 * Db({\n distanceToEdge: r[o.start],\n thresholds: a,\n dragStartTime: n,\n shouldUseTimeDampening: i\n });\n}, RG = function(e) {\n var t = e.container, r = e.subject, n = e.proposedScroll, o = r.height > t.height, i = r.width > t.width;\n return !i && !o ? n : i && o ? null : {\n x: i ? 0 : n.x,\n y: o ? 0 : n.y\n };\n}, BG = Uz(function(e) {\n return e === 0 ? 0 : e;\n}), CC = function(e) {\n var t = e.dragStartTime, r = e.container, n = e.subject, o = e.center, i = e.shouldUseTimeDampening, a = {\n top: o.y - r.top,\n right: r.right - o.x,\n bottom: r.bottom - o.y,\n left: o.x - r.left\n }, s = Hb({\n container: r,\n distanceToEdges: a,\n dragStartTime: t,\n axis: h9,\n shouldUseTimeDampening: i\n }), l = Hb({\n container: r,\n distanceToEdges: a,\n dragStartTime: t,\n axis: Kz,\n shouldUseTimeDampening: i\n }), c = BG({\n x: l,\n y: s\n });\n if (uo(c, Bt))\n return null;\n var p = RG({\n container: r,\n subject: n,\n proposedScroll: c\n });\n return p ? uo(p, Bt) ? null : p : null;\n}, WG = Uz(function(e) {\n return e === 0 ? 0 : e > 0 ? 1 : -1;\n}), L9 = function() {\n var e = function(r, n) {\n return r < 0 ? r : r > n ? r - n : 0;\n };\n return function(t) {\n var r = t.current, n = t.max, o = t.change, i = Ht(r, o), a = {\n x: e(i.x, n.x),\n y: e(i.y, n.y)\n };\n return uo(a, Bt) ? null : a;\n };\n}(), OC = function(t) {\n var r = t.max, n = t.current, o = t.change, i = {\n x: Math.max(n.x, r.x),\n y: Math.max(n.y, r.y)\n }, a = WG(o), s = L9({\n max: i,\n current: n,\n change: a\n });\n return !s || a.x !== 0 && s.x === 0 || a.y !== 0 && s.y === 0;\n}, w9 = function(t, r) {\n return OC({\n current: t.scroll.current,\n max: t.scroll.max,\n change: r\n });\n}, EG = function(t, r) {\n if (!w9(t, r))\n return null;\n var n = t.scroll.max, o = t.scroll.current;\n return L9({\n current: o,\n max: n,\n change: r\n });\n}, q9 = function(t, r) {\n var n = t.frame;\n return n ? OC({\n current: n.scroll.current,\n max: n.scroll.max,\n change: r\n }) : !1;\n}, SG = function(t, r) {\n var n = t.frame;\n return !n || !q9(t, r) ? null : L9({\n current: n.scroll.current,\n max: n.scroll.max,\n change: r\n });\n}, kG = function(e) {\n var t = e.viewport, r = e.subject, n = e.center, o = e.dragStartTime, i = e.shouldUseTimeDampening, a = CC({\n dragStartTime: o,\n container: t.frame,\n subject: r,\n center: n,\n shouldUseTimeDampening: i\n });\n return a && w9(t, a) ? a : null;\n}, NG = function(e) {\n var t = e.droppable, r = e.subject, n = e.center, o = e.dragStartTime, i = e.shouldUseTimeDampening, a = t.frame;\n if (!a)\n return null;\n var s = CC({\n dragStartTime: o,\n container: a.pageMarginBox,\n subject: r,\n center: n,\n shouldUseTimeDampening: i\n });\n return s && q9(t, s) ? s : null;\n}, Pb = function(e) {\n var t = e.state, r = e.dragStartTime, n = e.shouldUseTimeDampening, o = e.scrollWindow, i = e.scrollDroppable, a = t.current.page.borderBoxCenter, s = t.dimensions.draggables[t.critical.draggable.id], l = s.page.marginBox;\n if (t.isWindowScrollAllowed) {\n var c = t.viewport, p = kG({\n dragStartTime: r,\n viewport: c,\n subject: l,\n center: a,\n shouldUseTimeDampening: n\n });\n if (p) {\n o(p);\n return;\n }\n }\n var d = LG({\n center: a,\n destination: k2(t.impact),\n droppables: t.dimensions.droppables\n });\n if (d) {\n var u = NG({\n dragStartTime: r,\n droppable: d,\n subject: l,\n center: a,\n shouldUseTimeDampening: n\n });\n u && i(d.descriptor.id, u);\n }\n}, IG = function(e) {\n var t = e.scrollWindow, r = e.scrollDroppable, n = v4(t), o = v4(r), i = null, a = function(p) {\n i || ( false ? 0 : V1(!1));\n var d = i, u = d.shouldUseTimeDampening, h = d.dragStartTime;\n Pb({\n state: p,\n scrollWindow: n,\n scrollDroppable: o,\n dragStartTime: h,\n shouldUseTimeDampening: u\n });\n }, s = function(p) {\n as(), i && ( false ? 0 : V1(!1));\n var d = Date.now(), u = !1, h = function() {\n u = !0;\n };\n Pb({\n state: p,\n dragStartTime: 0,\n shouldUseTimeDampening: !1,\n scrollWindow: h,\n scrollDroppable: h\n }), i = {\n dragStartTime: d,\n shouldUseTimeDampening: u\n }, ss(), u && a(p);\n }, l = function() {\n i && (n.cancel(), o.cancel(), i = null);\n };\n return {\n start: s,\n stop: l,\n scroll: a\n };\n}, TG = function(e) {\n var t = e.move, r = e.scrollDroppable, n = e.scrollWindow, o = function(c, p) {\n var d = Ht(c.current.client.selection, p);\n t({\n client: d\n });\n }, i = function(c, p) {\n if (!q9(c, p))\n return p;\n var d = SG(c, p);\n if (!d)\n return r(c.descriptor.id, p), null;\n var u = S2(p, d);\n r(c.descriptor.id, u);\n var h = S2(p, u);\n return h;\n }, a = function(c, p, d) {\n if (!c || !w9(p, d))\n return d;\n var u = EG(p, d);\n if (!u)\n return n(d), null;\n var h = S2(d, u);\n n(h);\n var b = S2(d, h);\n return b;\n }, s = function(c) {\n var p = c.scrollJumpRequest;\n if (p) {\n var d = k2(c.impact);\n d || ( false ? 0 : V1(!1));\n var u = i(c.dimensions.droppables[d], p);\n if (u) {\n var h = c.viewport, b = a(c.isWindowScrollAllowed, h, u);\n b && o(c, b);\n }\n }\n };\n return s;\n}, DG = function(e) {\n var t = e.scrollDroppable, r = e.scrollWindow, n = e.move, o = IG({\n scrollWindow: r,\n scrollDroppable: t\n }), i = TG({\n move: n,\n scrollWindow: r,\n scrollDroppable: t\n }), a = function(c) {\n if (c.phase === "DRAGGING") {\n if (c.movementMode === "FLUID") {\n o.scroll(c);\n return;\n }\n c.scrollJumpRequest && i(c);\n }\n }, s = {\n scroll: a,\n start: o.start,\n stop: o.stop\n };\n return s;\n}, Ra = "data-rbd", Ba = function() {\n var e = Ra + "-drag-handle";\n return {\n base: e,\n draggableId: e + "-draggable-id",\n contextId: e + "-context-id"\n };\n}(), T8 = function() {\n var e = Ra + "-draggable";\n return {\n base: e,\n contextId: e + "-context-id",\n id: e + "-id"\n };\n}(), HG = function() {\n var e = Ra + "-droppable";\n return {\n base: e,\n contextId: e + "-context-id",\n id: e + "-id"\n };\n}(), Vb = {\n contextId: Ra + "-scroll-container-context-id"\n}, PG = function(t) {\n return function(r) {\n return "[" + r + \'="\' + t + \'"]\';\n };\n}, v3 = function(t, r) {\n return t.map(function(n) {\n var o = n.styles[r];\n return o ? n.selector + " { " + o + " }" : "";\n }).join(" ");\n}, VG = "pointer-events: none;", FG = function(e) {\n var t = PG(e), r = function() {\n var s = `\n cursor: -webkit-grab;\n cursor: grab;\n `;\n return {\n selector: t(Ba.contextId),\n styles: {\n always: `\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n touch-action: manipulation;\n `,\n resting: s,\n dragging: VG,\n dropAnimating: s\n }\n };\n }(), n = function() {\n var s = `\n transition: ` + _3.outOfTheWay + `;\n `;\n return {\n selector: t(T8.contextId),\n styles: {\n dragging: s,\n dropAnimating: s,\n userCancel: s\n }\n };\n }(), o = {\n selector: t(HG.contextId),\n styles: {\n always: "overflow-anchor: none;"\n }\n }, i = {\n selector: "body",\n styles: {\n dragging: `\n cursor: grabbing;\n cursor: -webkit-grabbing;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n overflow-anchor: none;\n `\n }\n }, a = [n, r, o, i];\n return {\n always: v3(a, "always"),\n resting: v3(a, "resting"),\n dragging: v3(a, "dragging"),\n dropAnimating: v3(a, "dropAnimating"),\n userCancel: v3(a, "userCancel")\n };\n}, N2 = typeof window < "u" && typeof window.document < "u" && typeof window.document.createElement < "u" ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect, sp = function() {\n var t = document.querySelector("head");\n return t || ( false ? 0 : V1(!1)), t;\n}, Fb = function(t) {\n var r = document.createElement("style");\n return t && r.setAttribute("nonce", t), r.type = "text/css", r;\n};\nfunction UG(e, t) {\n var r = ze(function() {\n return FG(e);\n }, [e]), n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), i = F0(gt(function(d) {\n var u = o.current;\n u || ( false ? 0 : V1(!1)), u.textContent = d;\n }), []), a = F0(function(d) {\n var u = n.current;\n u || ( false ? 0 : V1(!1)), u.textContent = d;\n }, []);\n N2(function() {\n !n.current && !o.current || ( false ? 0 : V1(!1));\n var d = Fb(t), u = Fb(t);\n return n.current = d, o.current = u, d.setAttribute(Ra + "-always", e), u.setAttribute(Ra + "-dynamic", e), sp().appendChild(d), sp().appendChild(u), a(r.always), i(r.resting), function() {\n var h = function(M) {\n var C = M.current;\n C || ( false ? 0 : V1(!1)), sp().removeChild(C), M.current = null;\n };\n h(n), h(o);\n };\n }, [t, a, i, r.always, r.resting, e]);\n var s = F0(function() {\n return i(r.dragging);\n }, [i, r.dragging]), l = F0(function(d) {\n if (d === "DROP") {\n i(r.dropAnimating);\n return;\n }\n i(r.userCancel);\n }, [i, r.dropAnimating, r.userCancel]), c = F0(function() {\n o.current && i(r.resting);\n }, [i, r.resting]), p = ze(function() {\n return {\n dragging: s,\n dropping: l,\n resting: c\n };\n }, [s, l, c]);\n return p;\n}\nvar mC = function(e) {\n return e && e.ownerDocument ? e.ownerDocument.defaultView : window;\n};\nfunction ls(e) {\n return e instanceof mC(e).HTMLElement;\n}\nfunction vC(e, t) {\n var r = "[" + Ba.contextId + \'="\' + e + \'"]\', n = Yz(document.querySelectorAll(r));\n if (!n.length)\n return false && 0, null;\n var o = Bo(n, function(i) {\n return i.getAttribute(Ba.draggableId) === t;\n });\n return o ? ls(o) ? o : ( false && 0, null) : ( false && 0, null);\n}\nfunction YG(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), i = F0(function(u, h) {\n var b = {\n id: u,\n focus: h\n };\n return t.current[u] = b, function() {\n var C = t.current, g = C[u];\n g !== b && delete C[u];\n };\n }, []), a = F0(function(u) {\n var h = vC(e, u);\n h && h !== document.activeElement && h.focus();\n }, [e]), s = F0(function(u, h) {\n r.current === u && (r.current = h);\n }, []), l = F0(function() {\n n.current || o.current && (n.current = requestAnimationFrame(function() {\n n.current = null;\n var u = r.current;\n u && a(u);\n }));\n }, [a]), c = F0(function(u) {\n r.current = null;\n var h = document.activeElement;\n h && h.getAttribute(Ba.draggableId) === u && (r.current = u);\n }, []);\n N2(function() {\n return o.current = !0, function() {\n o.current = !1;\n var u = n.current;\n u && cancelAnimationFrame(u);\n };\n }, []);\n var p = ze(function() {\n return {\n register: i,\n tryRecordFocus: c,\n tryRestoreFocusRecorded: l,\n tryShiftRecord: s\n };\n }, [i, c, l, s]);\n return p;\n}\nfunction XG() {\n var e = {\n draggables: {},\n droppables: {}\n }, t = [];\n function r(d) {\n return t.push(d), function() {\n var h = t.indexOf(d);\n h !== -1 && t.splice(h, 1);\n };\n }\n function n(d) {\n t.length && t.forEach(function(u) {\n return u(d);\n });\n }\n function o(d) {\n return e.draggables[d] || null;\n }\n function i(d) {\n var u = o(d);\n return u || ( false ? 0 : V1(!1)), u;\n }\n var a = {\n register: function(u) {\n e.draggables[u.descriptor.id] = u, n({\n type: "ADDITION",\n value: u\n });\n },\n update: function(u, h) {\n var b = e.draggables[h.descriptor.id];\n b && b.uniqueId === u.uniqueId && (delete e.draggables[h.descriptor.id], e.draggables[u.descriptor.id] = u);\n },\n unregister: function(u) {\n var h = u.descriptor.id, b = o(h);\n b && u.uniqueId === b.uniqueId && (delete e.draggables[h], n({\n type: "REMOVAL",\n value: u\n }));\n },\n getById: i,\n findById: o,\n exists: function(u) {\n return !!o(u);\n },\n getAllByType: function(u) {\n return Ul(e.draggables).filter(function(h) {\n return h.descriptor.type === u;\n });\n }\n };\n function s(d) {\n return e.droppables[d] || null;\n }\n function l(d) {\n var u = s(d);\n return u || ( false ? 0 : V1(!1)), u;\n }\n var c = {\n register: function(u) {\n e.droppables[u.descriptor.id] = u;\n },\n unregister: function(u) {\n var h = s(u.descriptor.id);\n h && u.uniqueId === h.uniqueId && delete e.droppables[u.descriptor.id];\n },\n getById: l,\n findById: s,\n exists: function(u) {\n return !!s(u);\n },\n getAllByType: function(u) {\n return Ul(e.droppables).filter(function(h) {\n return h.descriptor.type === u;\n });\n }\n };\n function p() {\n e.draggables = {}, e.droppables = {}, t.length = 0;\n }\n return {\n draggable: a,\n droppable: c,\n subscribe: r,\n clean: p\n };\n}\nfunction QG() {\n var e = ze(XG, []);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n return function() {\n requestAnimationFrame(e.clean);\n };\n }, [e]), e;\n}\nvar x9 = react__WEBPACK_IMPORTED_MODULE_0___default().createContext(null), R4 = function() {\n var e = document.body;\n return e || ( false ? 0 : V1(!1)), e;\n}, GG = {\n position: "absolute",\n width: "1px",\n height: "1px",\n margin: "-1px",\n border: "0",\n padding: "0",\n overflow: "hidden",\n clip: "rect(0 0 0 0)",\n "clip-path": "inset(100%)"\n}, jG = function(t) {\n return "rbd-announcement-" + t;\n};\nfunction KG(e) {\n var t = ze(function() {\n return jG(e);\n }, [e]), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n var i = document.createElement("div");\n return r.current = i, i.id = t, i.setAttribute("aria-live", "assertive"), i.setAttribute("aria-atomic", "true"), H0(i.style, GG), R4().appendChild(i), function() {\n setTimeout(function() {\n var l = R4();\n l.contains(i) && l.removeChild(i), i === r.current && (r.current = null);\n });\n };\n }, [t]);\n var n = F0(function(o) {\n var i = r.current;\n if (i) {\n i.textContent = o;\n return;\n }\n false && 0;\n }, []);\n return n;\n}\nvar ZG = 0, JG = {\n separator: "::"\n};\nfunction R9(e, t) {\n return t === void 0 && (t = JG), ze(function() {\n return "" + e + t.separator + ZG++;\n }, [t.separator, e]);\n}\nfunction _G(e) {\n var t = e.contextId, r = e.uniqueId;\n return "rbd-hidden-text-" + t + "-" + r;\n}\nfunction $G(e) {\n var t = e.contextId, r = e.text, n = R9("hidden-text", {\n separator: "-"\n }), o = ze(function() {\n return _G({\n contextId: t,\n uniqueId: n\n });\n }, [n, t]);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n var a = document.createElement("div");\n return a.id = o, a.textContent = r, a.style.display = "none", R4().appendChild(a), function() {\n var l = R4();\n l.contains(a) && l.removeChild(a);\n };\n }, [o, r]), o;\n}\nvar Wc = react__WEBPACK_IMPORTED_MODULE_0___default().createContext(null), ej = {\n react: "^16.8.5 || ^17.0.0 || ^18.0.0",\n "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0"\n}, tj = /(\\d+)\\.(\\d+)\\.(\\d+)/, Ub = function(t) {\n var r = tj.exec(t);\n r == null && ( false ? 0 : V1(!1));\n var n = Number(r[1]), o = Number(r[2]), i = Number(r[3]);\n return {\n major: n,\n minor: o,\n patch: i,\n raw: t\n };\n}, rj = function(t, r) {\n return r.major > t.major ? !0 : r.major < t.major ? !1 : r.minor > t.minor ? !0 : r.minor < t.minor ? !1 : r.patch >= t.patch;\n}, nj = function(e, t) {\n var r = Ub(e), n = Ub(t);\n rj(r, n) || false && 0;\n}, lp = (/* unused pure expression or super */ null && (`\n We expect a html5 doctype: \n This is to ensure consistent browser layout and measurement\n\n More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/doctype.md\n`)), oj = function(e) {\n var t = e.doctype;\n if (!t) {\n false && 0;\n return;\n }\n t.name.toLowerCase() !== "html" && "production" !== "production" && 0, t.publicId !== "" && "production" !== "production" && 0;\n};\nfunction B9(e) {\n false && 0;\n}\nfunction cs(e, t) {\n B9(function() {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n try {\n e();\n } catch (r) {\n E8(`\n A setup problem was encountered.\n\n > ` + r.message + `\n `);\n }\n }, t);\n });\n}\nfunction ij() {\n cs(function() {\n nj(ej.react, (react__WEBPACK_IMPORTED_MODULE_0___default().version)), oj(document);\n }, []);\n}\nfunction W9(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(e);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n t.current = e;\n }), t;\n}\nfunction aj() {\n var e = null;\n function t() {\n return !!e;\n }\n function r(a) {\n return a === e;\n }\n function n(a) {\n e && ( false ? 0 : V1(!1));\n var s = {\n abandon: a\n };\n return e = s, s;\n }\n function o() {\n e || ( false ? 0 : V1(!1)), e = null;\n }\n function i() {\n e && (e.abandon(), o());\n }\n return {\n isClaimed: t,\n isActive: r,\n claim: n,\n release: o,\n tryAbandon: i\n };\n}\nvar sj = 9, lj = 13, E9 = 27, yC = 32, cj = 33, pj = 34, dj = 35, Aj = 36, uj = 37, bj = 38, hj = 39, Mj = 40, M5, fj = (M5 = {}, M5[lj] = !0, M5[sj] = !0, M5), LC = function(e) {\n fj[e.keyCode] && e.preventDefault();\n}, Ec = function() {\n var e = "visibilitychange";\n if (typeof document > "u")\n return e;\n var t = [e, "ms" + e, "webkit" + e, "moz" + e, "o" + e], r = Bo(t, function(n) {\n return "on" + n in document;\n });\n return r || e;\n}(), wC = 0, Yb = 5;\nfunction gj(e, t) {\n return Math.abs(t.x - e.x) >= Yb || Math.abs(t.y - e.y) >= Yb;\n}\nvar Xb = {\n type: "IDLE"\n};\nfunction zj(e) {\n var t = e.cancel, r = e.completed, n = e.getPhase, o = e.setPhase;\n return [{\n eventName: "mousemove",\n fn: function(a) {\n var s = a.button, l = a.clientX, c = a.clientY;\n if (s === wC) {\n var p = {\n x: l,\n y: c\n }, d = n();\n if (d.type === "DRAGGING") {\n a.preventDefault(), d.actions.move(p);\n return;\n }\n d.type !== "PENDING" && ( false ? 0 : V1(!1));\n var u = d.point;\n if (gj(u, p)) {\n a.preventDefault();\n var h = d.actions.fluidLift(p);\n o({\n type: "DRAGGING",\n actions: h\n });\n }\n }\n }\n }, {\n eventName: "mouseup",\n fn: function(a) {\n var s = n();\n if (s.type !== "DRAGGING") {\n t();\n return;\n }\n a.preventDefault(), s.actions.drop({\n shouldBlockNextClick: !0\n }), r();\n }\n }, {\n eventName: "mousedown",\n fn: function(a) {\n n().type === "DRAGGING" && a.preventDefault(), t();\n }\n }, {\n eventName: "keydown",\n fn: function(a) {\n var s = n();\n if (s.type === "PENDING") {\n t();\n return;\n }\n if (a.keyCode === E9) {\n a.preventDefault(), t();\n return;\n }\n LC(a);\n }\n }, {\n eventName: "resize",\n fn: t\n }, {\n eventName: "scroll",\n options: {\n passive: !0,\n capture: !1\n },\n fn: function() {\n n().type === "PENDING" && t();\n }\n }, {\n eventName: "webkitmouseforcedown",\n fn: function(a) {\n var s = n();\n if (s.type === "IDLE" && ( false ? 0 : V1(!1)), s.actions.shouldRespectForcePress()) {\n t();\n return;\n }\n a.preventDefault();\n }\n }, {\n eventName: Ec,\n fn: t\n }];\n}\nfunction Cj(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(Xb), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(Ao), n = ze(function() {\n return {\n eventName: "mousedown",\n fn: function(d) {\n if (!d.defaultPrevented && d.button === wC && !(d.ctrlKey || d.metaKey || d.shiftKey || d.altKey)) {\n var u = e.findClosestDraggableId(d);\n if (u) {\n var h = e.tryGetLock(u, a, {\n sourceEvent: d\n });\n if (h) {\n d.preventDefault();\n var b = {\n x: d.clientX,\n y: d.clientY\n };\n r.current(), c(h, b);\n }\n }\n }\n }\n };\n }, [e]), o = ze(function() {\n return {\n eventName: "webkitmouseforcewillbegin",\n fn: function(d) {\n if (!d.defaultPrevented) {\n var u = e.findClosestDraggableId(d);\n if (u) {\n var h = e.findOptionsForDraggable(u);\n h && (h.shouldRespectForcePress || e.canGetLock(u) && d.preventDefault());\n }\n }\n }\n };\n }, [e]), i = F0(function() {\n var d = {\n passive: !1,\n capture: !0\n };\n r.current = _2(window, [o, n], d);\n }, [o, n]), a = F0(function() {\n var p = t.current;\n p.type !== "IDLE" && (t.current = Xb, r.current(), i());\n }, [i]), s = F0(function() {\n var p = t.current;\n a(), p.type === "DRAGGING" && p.actions.cancel({\n shouldBlockNextClick: !0\n }), p.type === "PENDING" && p.actions.abort();\n }, [a]), l = F0(function() {\n var d = {\n capture: !0,\n passive: !1\n }, u = zj({\n cancel: s,\n completed: a,\n getPhase: function() {\n return t.current;\n },\n setPhase: function(b) {\n t.current = b;\n }\n });\n r.current = _2(window, u, d);\n }, [s, a]), c = F0(function(d, u) {\n t.current.type !== "IDLE" && ( false ? 0 : V1(!1)), t.current = {\n type: "PENDING",\n point: u,\n actions: d\n }, l();\n }, [l]);\n N2(function() {\n return i(), function() {\n r.current();\n };\n }, [i]);\n}\nvar Vi;\nfunction Oj() {\n}\nvar mj = (Vi = {}, Vi[pj] = !0, Vi[cj] = !0, Vi[Aj] = !0, Vi[dj] = !0, Vi);\nfunction vj(e, t) {\n function r() {\n t(), e.cancel();\n }\n function n() {\n t(), e.drop();\n }\n return [{\n eventName: "keydown",\n fn: function(i) {\n if (i.keyCode === E9) {\n i.preventDefault(), r();\n return;\n }\n if (i.keyCode === yC) {\n i.preventDefault(), n();\n return;\n }\n if (i.keyCode === Mj) {\n i.preventDefault(), e.moveDown();\n return;\n }\n if (i.keyCode === bj) {\n i.preventDefault(), e.moveUp();\n return;\n }\n if (i.keyCode === hj) {\n i.preventDefault(), e.moveRight();\n return;\n }\n if (i.keyCode === uj) {\n i.preventDefault(), e.moveLeft();\n return;\n }\n if (mj[i.keyCode]) {\n i.preventDefault();\n return;\n }\n LC(i);\n }\n }, {\n eventName: "mousedown",\n fn: r\n }, {\n eventName: "mouseup",\n fn: r\n }, {\n eventName: "click",\n fn: r\n }, {\n eventName: "touchstart",\n fn: r\n }, {\n eventName: "resize",\n fn: r\n }, {\n eventName: "wheel",\n fn: r,\n options: {\n passive: !0\n }\n }, {\n eventName: Ec,\n fn: r\n }];\n}\nfunction yj(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(Oj), r = ze(function() {\n return {\n eventName: "keydown",\n fn: function(i) {\n if (i.defaultPrevented || i.keyCode !== yC)\n return;\n var a = e.findClosestDraggableId(i);\n if (!a)\n return;\n var s = e.tryGetLock(a, p, {\n sourceEvent: i\n });\n if (!s)\n return;\n i.preventDefault();\n var l = !0, c = s.snapLift();\n t.current();\n function p() {\n l || ( false ? 0 : V1(!1)), l = !1, t.current(), n();\n }\n t.current = _2(window, vj(c, p), {\n capture: !0,\n passive: !1\n });\n }\n };\n }, [e]), n = F0(function() {\n var i = {\n passive: !1,\n capture: !0\n };\n t.current = _2(window, [r], i);\n }, [r]);\n N2(function() {\n return n(), function() {\n t.current();\n };\n }, [n]);\n}\nvar cp = {\n type: "IDLE"\n}, Lj = 120, wj = 0.15;\nfunction qj(e) {\n var t = e.cancel, r = e.getPhase;\n return [{\n eventName: "orientationchange",\n fn: t\n }, {\n eventName: "resize",\n fn: t\n }, {\n eventName: "contextmenu",\n fn: function(o) {\n o.preventDefault();\n }\n }, {\n eventName: "keydown",\n fn: function(o) {\n if (r().type !== "DRAGGING") {\n t();\n return;\n }\n o.keyCode === E9 && o.preventDefault(), t();\n }\n }, {\n eventName: Ec,\n fn: t\n }];\n}\nfunction xj(e) {\n var t = e.cancel, r = e.completed, n = e.getPhase;\n return [{\n eventName: "touchmove",\n options: {\n capture: !1\n },\n fn: function(i) {\n var a = n();\n if (a.type !== "DRAGGING") {\n t();\n return;\n }\n a.hasMoved = !0;\n var s = i.touches[0], l = s.clientX, c = s.clientY, p = {\n x: l,\n y: c\n };\n i.preventDefault(), a.actions.move(p);\n }\n }, {\n eventName: "touchend",\n fn: function(i) {\n var a = n();\n if (a.type !== "DRAGGING") {\n t();\n return;\n }\n i.preventDefault(), a.actions.drop({\n shouldBlockNextClick: !0\n }), r();\n }\n }, {\n eventName: "touchcancel",\n fn: function(i) {\n if (n().type !== "DRAGGING") {\n t();\n return;\n }\n i.preventDefault(), t();\n }\n }, {\n eventName: "touchforcechange",\n fn: function(i) {\n var a = n();\n a.type === "IDLE" && ("production", V1(!1));\n var s = i.touches[0];\n if (s) {\n var l = s.force >= wj;\n if (l) {\n var c = a.actions.shouldRespectForcePress();\n if (a.type === "PENDING") {\n c && t();\n return;\n }\n if (c) {\n if (a.hasMoved) {\n i.preventDefault();\n return;\n }\n t();\n return;\n }\n i.preventDefault();\n }\n }\n }\n }, {\n eventName: Ec,\n fn: t\n }];\n}\nfunction Rj(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(cp), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(Ao), n = F0(function() {\n return t.current;\n }, []), o = F0(function(h) {\n t.current = h;\n }, []), i = ze(function() {\n return {\n eventName: "touchstart",\n fn: function(h) {\n if (!h.defaultPrevented) {\n var b = e.findClosestDraggableId(h);\n if (b) {\n var M = e.tryGetLock(b, s, {\n sourceEvent: h\n });\n if (M) {\n var C = h.touches[0], g = C.clientX, f = C.clientY, O = {\n x: g,\n y: f\n };\n r.current(), d(M, O);\n }\n }\n }\n }\n };\n }, [e]), a = F0(function() {\n var h = {\n capture: !0,\n passive: !1\n };\n r.current = _2(window, [i], h);\n }, [i]), s = F0(function() {\n var u = t.current;\n u.type !== "IDLE" && (u.type === "PENDING" && clearTimeout(u.longPressTimerId), o(cp), r.current(), a());\n }, [a, o]), l = F0(function() {\n var u = t.current;\n s(), u.type === "DRAGGING" && u.actions.cancel({\n shouldBlockNextClick: !0\n }), u.type === "PENDING" && u.actions.abort();\n }, [s]), c = F0(function() {\n var h = {\n capture: !0,\n passive: !1\n }, b = {\n cancel: l,\n completed: s,\n getPhase: n\n }, M = _2(window, xj(b), h), C = _2(window, qj(b), h);\n r.current = function() {\n M(), C();\n };\n }, [l, n, s]), p = F0(function() {\n var h = n();\n h.type !== "PENDING" && ( false ? 0 : V1(!1));\n var b = h.actions.fluidLift(h.point);\n o({\n type: "DRAGGING",\n actions: b,\n hasMoved: !1\n });\n }, [n, o]), d = F0(function(h, b) {\n n().type !== "IDLE" && ( false ? 0 : V1(!1));\n var M = setTimeout(p, Lj);\n o({\n type: "PENDING",\n point: b,\n actions: h,\n longPressTimerId: M\n }), c();\n }, [c, n, o, p]);\n N2(function() {\n return a(), function() {\n r.current();\n var b = n();\n b.type === "PENDING" && (clearTimeout(b.longPressTimerId), o(cp));\n };\n }, [n, a, o]), N2(function() {\n var h = _2(window, [{\n eventName: "touchmove",\n fn: function() {\n },\n options: {\n capture: !1,\n passive: !1\n }\n }]);\n return h;\n }, []);\n}\nfunction Bj(e) {\n B9(function() {\n var t = W9(e);\n cs(function() {\n t.current.length !== e.length && ( false ? 0 : V1(!1));\n });\n });\n}\nvar Wj = {\n input: !0,\n button: !0,\n textarea: !0,\n select: !0,\n option: !0,\n optgroup: !0,\n video: !0,\n audio: !0\n};\nfunction qC(e, t) {\n if (t == null)\n return !1;\n var r = !!Wj[t.tagName.toLowerCase()];\n if (r)\n return !0;\n var n = t.getAttribute("contenteditable");\n return n === "true" || n === "" ? !0 : t === e ? !1 : qC(e, t.parentElement);\n}\nfunction Ej(e, t) {\n var r = t.target;\n return ls(r) ? qC(e, r) : !1;\n}\nvar Sj = function(e) {\n return fr(e.getBoundingClientRect()).center;\n};\nfunction kj(e) {\n return e instanceof mC(e).Element;\n}\nvar Nj = function() {\n var e = "matches";\n if (typeof document > "u")\n return e;\n var t = [e, "msMatchesSelector", "webkitMatchesSelector"], r = Bo(t, function(n) {\n return n in Element.prototype;\n });\n return r || e;\n}();\nfunction xC(e, t) {\n return e == null ? null : e[Nj](t) ? e : xC(e.parentElement, t);\n}\nfunction Ij(e, t) {\n return e.closest ? e.closest(t) : xC(e, t);\n}\nfunction Tj(e) {\n return "[" + Ba.contextId + \'="\' + e + \'"]\';\n}\nfunction Dj(e, t) {\n var r = t.target;\n if (!kj(r))\n return false && 0, null;\n var n = Tj(e), o = Ij(r, n);\n return o ? ls(o) ? o : ( false && 0, null) : null;\n}\nfunction Hj(e, t) {\n var r = Dj(e, t);\n return r ? r.getAttribute(Ba.draggableId) : null;\n}\nfunction Pj(e, t) {\n var r = "[" + T8.contextId + \'="\' + e + \'"]\', n = Yz(document.querySelectorAll(r)), o = Bo(n, function(i) {\n return i.getAttribute(T8.id) === t;\n });\n return o ? ls(o) ? o : ( false && 0, null) : null;\n}\nfunction Vj(e) {\n e.preventDefault();\n}\nfunction f5(e) {\n var t = e.expected, r = e.phase, n = e.isLockActive, o = e.shouldWarn;\n return n() ? t !== r ? (o && "production" !== "production" && 0, !1) : !0 : (o && "production" !== "production" && 0, !1);\n}\nfunction RC(e) {\n var t = e.lockAPI, r = e.store, n = e.registry, o = e.draggableId;\n if (t.isClaimed())\n return !1;\n var i = n.draggable.findById(o);\n return i ? !(!i.options.isEnabled || !gC(r.getState(), o)) : ( false && 0, !1);\n}\nfunction Fj(e) {\n var t = e.lockAPI, r = e.contextId, n = e.store, o = e.registry, i = e.draggableId, a = e.forceSensorStop, s = e.sourceEvent, l = RC({\n lockAPI: t,\n store: n,\n registry: o,\n draggableId: i\n });\n if (!l)\n return null;\n var c = o.draggable.getById(i), p = Pj(r, c.descriptor.id);\n if (!p)\n return false && 0, null;\n if (s && !c.options.canDragInteractiveElements && Ej(p, s))\n return null;\n var d = t.claim(a || Ao), u = "PRE_DRAG";\n function h() {\n return c.options.shouldRespectForcePress;\n }\n function b() {\n return t.isActive(d);\n }\n function M(y, z) {\n f5({\n expected: y,\n phase: u,\n isLockActive: b,\n shouldWarn: !0\n }) && n.dispatch(z());\n }\n var C = M.bind(null, "DRAGGING");\n function g(y) {\n function z() {\n t.release(), u = "COMPLETED";\n }\n u !== "PRE_DRAG" && (z(), u !== "PRE_DRAG" && ( false ? 0 : V1(!1))), n.dispatch(qQ(y.liftActionArgs)), u = "DRAGGING";\n function N(W, T) {\n if (T === void 0 && (T = {\n shouldBlockNextClick: !1\n }), y.cleanup(), T.shouldBlockNextClick) {\n var x = _2(window, [{\n eventName: "click",\n fn: Vj,\n options: {\n once: !0,\n passive: !1,\n capture: !0\n }\n }]);\n setTimeout(x);\n }\n z(), n.dispatch(dC({\n reason: W\n }));\n }\n return H0({\n isActive: function() {\n return f5({\n expected: "DRAGGING",\n phase: u,\n isLockActive: b,\n shouldWarn: !1\n });\n },\n shouldRespectForcePress: h,\n drop: function(T) {\n return N("DROP", T);\n },\n cancel: function(T) {\n return N("CANCEL", T);\n }\n }, y.actions);\n }\n function f(y) {\n var z = v4(function(W) {\n C(function() {\n return pC({\n client: W\n });\n });\n }), N = g({\n liftActionArgs: {\n id: i,\n clientSelection: y,\n movementMode: "FLUID"\n },\n cleanup: function() {\n return z.cancel();\n },\n actions: {\n move: z\n }\n });\n return H0({}, N, {\n move: z\n });\n }\n function O() {\n var y = {\n moveUp: function() {\n return C(IQ);\n },\n moveRight: function() {\n return C(DQ);\n },\n moveDown: function() {\n return C(TQ);\n },\n moveLeft: function() {\n return C(HQ);\n }\n };\n return g({\n liftActionArgs: {\n id: i,\n clientSelection: Sj(p),\n movementMode: "SNAP"\n },\n cleanup: Ao,\n actions: y\n });\n }\n function m() {\n var y = f5({\n expected: "PRE_DRAG",\n phase: u,\n isLockActive: b,\n shouldWarn: !0\n });\n y && t.release();\n }\n var v = {\n isActive: function() {\n return f5({\n expected: "PRE_DRAG",\n phase: u,\n isLockActive: b,\n shouldWarn: !1\n });\n },\n shouldRespectForcePress: h,\n fluidLift: f,\n snapLift: O,\n abort: m\n };\n return v;\n}\nvar Uj = [Cj, yj, Rj];\nfunction Yj(e) {\n var t = e.contextId, r = e.store, n = e.registry, o = e.customSensors, i = e.enableDefaultSensors, a = [].concat(i ? Uj : [], o || []), s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function() {\n return aj();\n })[0], l = F0(function(f, O) {\n f.isDragging && !O.isDragging && s.tryAbandon();\n }, [s]);\n N2(function() {\n var f = r.getState(), O = r.subscribe(function() {\n var m = r.getState();\n l(f, m), f = m;\n });\n return O;\n }, [s, r, l]), N2(function() {\n return s.tryAbandon;\n }, [s.tryAbandon]);\n var c = F0(function(g) {\n return RC({\n lockAPI: s,\n registry: n,\n store: r,\n draggableId: g\n });\n }, [s, n, r]), p = F0(function(g, f, O) {\n return Fj({\n lockAPI: s,\n registry: n,\n contextId: t,\n store: r,\n draggableId: g,\n forceSensorStop: f,\n sourceEvent: O && O.sourceEvent ? O.sourceEvent : null\n });\n }, [t, s, n, r]), d = F0(function(g) {\n return Hj(t, g);\n }, [t]), u = F0(function(g) {\n var f = n.draggable.findById(g);\n return f ? f.options : null;\n }, [n.draggable]), h = F0(function() {\n s.isClaimed() && (s.tryAbandon(), r.getState().phase !== "IDLE" && r.dispatch(C9()));\n }, [s, r]), b = F0(s.isClaimed, [s]), M = ze(function() {\n return {\n canGetLock: c,\n tryGetLock: p,\n findClosestDraggableId: d,\n findOptionsForDraggable: u,\n tryReleaseLock: h,\n isLockClaimed: b\n };\n }, [c, p, d, u, h, b]);\n Bj(a);\n for (var C = 0; C < a.length; C++)\n a[C](M);\n}\nvar Xj = function(t) {\n return {\n onBeforeCapture: t.onBeforeCapture,\n onBeforeDragStart: t.onBeforeDragStart,\n onDragStart: t.onDragStart,\n onDragEnd: t.onDragEnd,\n onDragUpdate: t.onDragUpdate\n };\n};\nfunction y3(e) {\n return e.current || ( false ? 0 : V1(!1)), e.current;\n}\nfunction Qj(e) {\n var t = e.contextId, r = e.setCallbacks, n = e.sensors, o = e.nonce, i = e.dragHandleUsageInstructions, a = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n ij();\n var s = W9(e), l = F0(function() {\n return Xj(s.current);\n }, [s]), c = KG(t), p = $G({\n contextId: t,\n text: i\n }), d = UG(t, o), u = F0(function(W) {\n y3(a).dispatch(W);\n }, []), h = ze(function() {\n return lb({\n publishWhileDragging: RQ,\n updateDroppableScroll: WQ,\n updateDroppableIsEnabled: EQ,\n updateDroppableIsCombineEnabled: SQ,\n collectionStarting: BQ\n }, u);\n }, [u]), b = QG(), M = ze(function() {\n return OG(b, h);\n }, [b, h]), C = ze(function() {\n return DG(H0({\n scrollWindow: mG,\n scrollDroppable: M.scrollDroppable\n }, lb({\n move: pC\n }, u)));\n }, [M.scrollDroppable, u]), g = YG(t), f = ze(function() {\n return fG({\n announce: c,\n autoScroller: C,\n dimensionMarshal: M,\n focusMarshal: g,\n getResponders: l,\n styleMarshal: d\n });\n }, [c, C, M, g, l, d]);\n false && 0, a.current = f;\n var O = F0(function() {\n var W = y3(a), T = W.getState();\n T.phase !== "IDLE" && W.dispatch(C9());\n }, []), m = F0(function() {\n var W = y3(a).getState();\n return W.isDragging || W.phase === "DROP_ANIMATING";\n }, []), v = ze(function() {\n return {\n isDragging: m,\n tryAbort: O\n };\n }, [m, O]);\n r(v);\n var y = F0(function(W) {\n return gC(y3(a).getState(), W);\n }, []), z = F0(function() {\n return Jo(y3(a).getState());\n }, []), N = ze(function() {\n return {\n marshal: M,\n focus: g,\n contextId: t,\n canLift: y,\n isMovementAllowed: z,\n dragHandleUsageInstructionsId: p,\n registry: b\n };\n }, [t, M, p, g, y, z, b]);\n return Yj({\n contextId: t,\n store: f,\n registry: b,\n customSensors: n,\n enableDefaultSensors: e.enableDefaultSensors !== !1\n }), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n return O;\n }, [O]), react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Wc.Provider, {\n value: N\n }, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Bz, {\n context: x9,\n store: f\n }, e.children));\n}\nvar Gj = 0;\nfunction jj() {\n return ze(function() {\n return "" + Gj++;\n }, []);\n}\nfunction Kj(e) {\n var t = jj(), r = e.dragHandleUsageInstructions || el.dragHandleUsageInstructions;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MX, null, function(n) {\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Qj, {\n nonce: e.nonce,\n contextId: t,\n setCallbacks: n,\n dragHandleUsageInstructions: r,\n enableDefaultSensors: e.enableDefaultSensors,\n sensors: e.sensors,\n onBeforeCapture: e.onBeforeCapture,\n onBeforeDragStart: e.onBeforeDragStart,\n onDragStart: e.onDragStart,\n onDragUpdate: e.onDragUpdate,\n onDragEnd: e.onDragEnd\n }, e.children);\n });\n}\nvar S9 = function(t) {\n return function(r) {\n return t === r;\n };\n}, Zj = S9("scroll"), Jj = S9("auto"), _j = S9("visible"), Qb = function(t, r) {\n return r(t.overflowX) || r(t.overflowY);\n}, $j = function(t, r) {\n return r(t.overflowX) && r(t.overflowY);\n}, BC = function(t) {\n var r = window.getComputedStyle(t), n = {\n overflowX: r.overflowX,\n overflowY: r.overflowY\n };\n return Qb(n, Zj) || Qb(n, Jj);\n}, eK = function() {\n if (true)\n return !1;\n // removed by dead control flow\n{ var t, r; }\n // removed by dead control flow\n{}\n // removed by dead control flow\n{ var n, o; }\n // removed by dead control flow\n{}\n}, WC = function e(t) {\n return t == null ? null : t === document.body ? eK() ? t : null : t === document.documentElement ? null : BC(t) ? t : e(t.parentElement);\n}, tK = function(e) {\n if (e) {\n var t = WC(e.parentElement);\n t && "production" !== "production" && 0;\n }\n}, D8 = function(e) {\n return {\n x: e.scrollLeft,\n y: e.scrollTop\n };\n}, rK = function e(t) {\n if (!t)\n return !1;\n var r = window.getComputedStyle(t);\n return r.position === "fixed" ? !0 : e(t.parentElement);\n}, nK = function(e) {\n var t = WC(e), r = rK(e);\n return {\n closestScrollable: t,\n isFixedOnPage: r\n };\n}, oK = function(e) {\n var t = e.descriptor, r = e.isEnabled, n = e.isCombineEnabled, o = e.isFixedOnPage, i = e.direction, a = e.client, s = e.page, l = e.closest, c = function() {\n if (!l)\n return null;\n var h = l.scrollSize, b = l.client, M = hC({\n scrollHeight: h.scrollHeight,\n scrollWidth: h.scrollWidth,\n height: b.paddingBox.height,\n width: b.paddingBox.width\n });\n return {\n pageMarginBox: l.page.marginBox,\n frameClient: b,\n scrollSize: h,\n shouldClipSubject: l.shouldClipSubject,\n scroll: {\n initial: l.scroll,\n current: l.scroll,\n max: M,\n diff: {\n value: Bt,\n displacement: Bt\n }\n }\n };\n }(), p = i === "vertical" ? h9 : Kz, d = xa({\n page: s,\n withPlaceholder: null,\n axis: p,\n frame: c\n }), u = {\n descriptor: t,\n isCombineEnabled: n,\n isFixedOnPage: o,\n axis: p,\n isEnabled: r,\n client: a,\n page: s,\n frame: c,\n subject: d\n };\n return u;\n}, iK = function(t, r) {\n var n = Hz(t);\n if (!r || t !== r)\n return n;\n var o = n.paddingBox.top - r.scrollTop, i = n.paddingBox.left - r.scrollLeft, a = o + r.scrollHeight, s = i + r.scrollWidth, l = {\n top: o,\n right: s,\n bottom: a,\n left: i\n }, c = p9(l, n.border), p = d9({\n borderBox: c,\n margin: n.margin,\n border: n.border,\n padding: n.padding\n });\n return p;\n}, aK = function(e) {\n var t = e.ref, r = e.descriptor, n = e.env, o = e.windowScroll, i = e.direction, a = e.isDropDisabled, s = e.isCombineEnabled, l = e.shouldClipSubject, c = n.closestScrollable, p = iK(t, c), d = Vl(p, o), u = function() {\n if (!c)\n return null;\n var b = Hz(c), M = {\n scrollHeight: c.scrollHeight,\n scrollWidth: c.scrollWidth\n };\n return {\n client: b,\n page: Vl(b, o),\n scroll: D8(c),\n scrollSize: M,\n shouldClipSubject: l\n };\n }(), h = oK({\n descriptor: r,\n isEnabled: !a,\n isCombineEnabled: s,\n isFixedOnPage: n.isFixedOnPage,\n direction: i,\n client: p,\n page: d,\n closest: u\n });\n return h;\n}, sK = {\n passive: !1\n}, lK = {\n passive: !0\n}, Gb = function(e) {\n return e.shouldPublishImmediately ? sK : lK;\n};\nfunction Xl(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(e);\n return t || ( false ? 0 : V1(!1)), t;\n}\nvar g5 = function(t) {\n return t && t.env.closestScrollable || null;\n};\nfunction cK(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), r = Xl(Wc), n = R9("droppable"), o = r.registry, i = r.marshal, a = W9(e), s = ze(function() {\n return {\n id: e.droppableId,\n type: e.type,\n mode: e.mode\n };\n }, [e.droppableId, e.mode, e.type]), l = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(s), c = ze(function() {\n return gt(function(m, v) {\n t.current || ( false ? 0 : V1(!1));\n var y = {\n x: m,\n y: v\n };\n i.updateDroppableScroll(s.id, y);\n });\n }, [s.id, i]), p = F0(function() {\n var m = t.current;\n return !m || !m.env.closestScrollable ? Bt : D8(m.env.closestScrollable);\n }, []), d = F0(function() {\n var m = p();\n c(m.x, m.y);\n }, [p, c]), u = ze(function() {\n return v4(d);\n }, [d]), h = F0(function() {\n var m = t.current, v = g5(m);\n m && v || ( false ? 0 : V1(!1));\n var y = m.scrollOptions;\n if (y.shouldPublishImmediately) {\n d();\n return;\n }\n u();\n }, [u, d]), b = F0(function(m, v) {\n t.current && ( false ? 0 : V1(!1));\n var y = a.current, z = y.getDroppableRef();\n z || ( false ? 0 : V1(!1));\n var N = nK(z), W = {\n ref: z,\n descriptor: s,\n env: N,\n scrollOptions: v\n };\n t.current = W;\n var T = aK({\n ref: z,\n descriptor: s,\n env: N,\n windowScroll: m,\n direction: y.direction,\n isDropDisabled: y.isDropDisabled,\n isCombineEnabled: y.isCombineEnabled,\n shouldClipSubject: !y.ignoreContainerClipping\n }), x = N.closestScrollable;\n return x && (x.setAttribute(Vb.contextId, r.contextId), x.addEventListener("scroll", h, Gb(W.scrollOptions)), false && 0), T;\n }, [r.contextId, s, h, a]), M = F0(function() {\n var m = t.current, v = g5(m);\n return m && v || ( false ? 0 : V1(!1)), D8(v);\n }, []), C = F0(function() {\n var m = t.current;\n m || ( false ? 0 : V1(!1));\n var v = g5(m);\n t.current = null, v && (u.cancel(), v.removeAttribute(Vb.contextId), v.removeEventListener("scroll", h, Gb(m.scrollOptions)));\n }, [h, u]), g = F0(function(m) {\n var v = t.current;\n v || ( false ? 0 : V1(!1));\n var y = g5(v);\n y || ( false ? 0 : V1(!1)), y.scrollTop += m.y, y.scrollLeft += m.x;\n }, []), f = ze(function() {\n return {\n getDimensionAndWatchScroll: b,\n getScrollWhileDragging: M,\n dragStopped: C,\n scroll: g\n };\n }, [C, b, M, g]), O = ze(function() {\n return {\n uniqueId: n,\n descriptor: s,\n callbacks: f\n };\n }, [f, s, n]);\n N2(function() {\n return l.current = O.descriptor, o.droppable.register(O), function() {\n t.current && ( false && 0, C()), o.droppable.unregister(O);\n };\n }, [f, s, C, O, i, o.droppable]), N2(function() {\n t.current && i.updateDroppableIsEnabled(l.current.id, !e.isDropDisabled);\n }, [e.isDropDisabled, i]), N2(function() {\n t.current && i.updateDroppableIsCombineEnabled(l.current.id, e.isCombineEnabled);\n }, [e.isCombineEnabled, i]);\n}\nfunction pp() {\n}\nvar jb = {\n width: 0,\n height: 0,\n margin: mX\n}, pK = function(t) {\n var r = t.isAnimatingOpenOnMount, n = t.placeholder, o = t.animate;\n return r || o === "close" ? jb : {\n height: n.client.borderBox.height,\n width: n.client.borderBox.width,\n margin: n.client.margin\n };\n}, dK = function(t) {\n var r = t.isAnimatingOpenOnMount, n = t.placeholder, o = t.animate, i = pK({\n isAnimatingOpenOnMount: r,\n placeholder: n,\n animate: o\n });\n return {\n display: n.display,\n boxSizing: "border-box",\n width: i.width,\n height: i.height,\n marginTop: i.margin.top,\n marginRight: i.margin.right,\n marginBottom: i.margin.bottom,\n marginLeft: i.margin.left,\n flexShrink: "0",\n flexGrow: "0",\n pointerEvents: "none",\n transition: o !== "none" ? _3.placeholder : null\n };\n};\nfunction AK(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), r = F0(function() {\n t.current && (clearTimeout(t.current), t.current = null);\n }, []), n = e.animate, o = e.onTransitionEnd, i = e.onClose, a = e.contextId, s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e.animate === "open"), l = s[0], c = s[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function() {\n return l ? n !== "open" ? (r(), c(!1), pp) : t.current ? pp : (t.current = setTimeout(function() {\n t.current = null, c(!1);\n }), r) : pp;\n }, [n, l, r]);\n var p = F0(function(u) {\n u.propertyName === "height" && (o(), n === "close" && i());\n }, [n, i, o]), d = dK({\n isAnimatingOpenOnMount: l,\n animate: e.animate,\n placeholder: e.placeholder\n });\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(e.placeholder.tagName, {\n style: d,\n "data-rbd-placeholder-context-id": a,\n onTransitionEnd: p,\n ref: e.innerRef\n });\n}\nvar uK = react__WEBPACK_IMPORTED_MODULE_0___default().memo(AK), k9 = react__WEBPACK_IMPORTED_MODULE_0___default().createContext(null);\nfunction EC(e) {\n e && ls(e) || ( false ? 0 : V1(!1));\n}\nfunction dp(e) {\n return typeof e == "boolean";\n}\nfunction Ap(e, t) {\n t.forEach(function(r) {\n return r(e);\n });\n}\nvar bK = [function(t) {\n var r = t.props;\n r.droppableId || ( false ? 0 : V1(!1)), typeof r.droppableId != "string" && ( false ? 0 : V1(!1));\n}, function(t) {\n var r = t.props;\n dp(r.isDropDisabled) || ( false ? 0 : V1(!1)), dp(r.isCombineEnabled) || ( false ? 0 : V1(!1)), dp(r.ignoreContainerClipping) || ( false ? 0 : V1(!1));\n}, function(t) {\n var r = t.getDroppableRef;\n EC(r());\n}], hK = [function(t) {\n var r = t.props, n = t.getPlaceholderRef;\n if (r.placeholder) {\n var o = n();\n o || false && 0;\n }\n}], MK = [function(t) {\n var r = t.props;\n r.renderClone || ( false ? 0 : V1(!1));\n}, function(t) {\n var r = t.getPlaceholderRef;\n r() && ( false ? 0 : V1(!1));\n}];\nfunction fK(e) {\n cs(function() {\n Ap(e, bK), e.props.mode === "standard" && Ap(e, hK), e.props.mode === "virtual" && Ap(e, MK);\n });\n}\nvar gK = function(e) {\n gc(t, e);\n function t() {\n for (var n, o = arguments.length, i = new Array(o), a = 0; a < o; a++)\n i[a] = arguments[a];\n return n = e.call.apply(e, [this].concat(i)) || this, n.state = {\n isVisible: !!n.props.on,\n data: n.props.on,\n animate: n.props.shouldAnimate && n.props.on ? "open" : "none"\n }, n.onClose = function() {\n n.state.animate === "close" && n.setState({\n isVisible: !1\n });\n }, n;\n }\n t.getDerivedStateFromProps = function(o, i) {\n return o.shouldAnimate ? o.on ? {\n isVisible: !0,\n data: o.on,\n animate: "open"\n } : i.isVisible ? {\n isVisible: !0,\n data: i.data,\n animate: "close"\n } : {\n isVisible: !1,\n animate: "close",\n data: null\n } : {\n isVisible: !!o.on,\n data: o.on,\n animate: "none"\n };\n };\n var r = t.prototype;\n return r.render = function() {\n if (!this.state.isVisible)\n return null;\n var o = {\n onClose: this.onClose,\n data: this.state.data,\n animate: this.state.animate\n };\n return this.props.children(o);\n }, t;\n}((react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent)), Kb = {\n dragging: 5e3,\n dropAnimating: 4500\n}, zK = function(t, r) {\n return r ? _3.drop(r.duration) : t ? _3.snap : _3.fluid;\n}, CK = function(t, r) {\n return t ? r ? x4.opacity.drop : x4.opacity.combining : null;\n}, OK = function(t) {\n return t.forceShouldAnimate != null ? t.forceShouldAnimate : t.mode === "SNAP";\n};\nfunction mK(e) {\n var t = e.dimension, r = t.client, n = e.offset, o = e.combineWith, i = e.dropping, a = !!o, s = OK(e), l = !!i, c = l ? N8.drop(n, a) : N8.moveTo(n), p = {\n position: "fixed",\n top: r.marginBox.top,\n left: r.marginBox.left,\n boxSizing: "border-box",\n width: r.borderBox.width,\n height: r.borderBox.height,\n transition: zK(s, i),\n transform: c,\n opacity: CK(a, l),\n zIndex: l ? Kb.dropAnimating : Kb.dragging,\n pointerEvents: "none"\n };\n return p;\n}\nfunction vK(e) {\n return {\n transform: N8.moveTo(e.offset),\n transition: e.shouldAnimateDisplacement ? null : "none"\n };\n}\nfunction yK(e) {\n return e.type === "DRAGGING" ? mK(e) : vK(e);\n}\nfunction LK(e, t, r) {\n r === void 0 && (r = Bt);\n var n = window.getComputedStyle(t), o = t.getBoundingClientRect(), i = Dz(o, n), a = Vl(i, r), s = {\n client: i,\n tagName: t.tagName.toLowerCase(),\n display: n.display\n }, l = {\n x: i.marginBox.width,\n y: i.marginBox.height\n }, c = {\n descriptor: e,\n placeholder: s,\n displaceBy: l,\n client: i,\n page: a\n };\n return c;\n}\nfunction wK(e) {\n var t = R9("draggable"), r = e.descriptor, n = e.registry, o = e.getDraggableRef, i = e.canDragInteractiveElements, a = e.shouldRespectForcePress, s = e.isEnabled, l = ze(function() {\n return {\n canDragInteractiveElements: i,\n shouldRespectForcePress: a,\n isEnabled: s\n };\n }, [i, s, a]), c = F0(function(h) {\n var b = o();\n return b || ( false ? 0 : V1(!1)), LK(r, b, h);\n }, [r, o]), p = ze(function() {\n return {\n uniqueId: t,\n descriptor: r,\n options: l,\n getDimension: c\n };\n }, [r, c, l, t]), d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(p), u = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!0);\n N2(function() {\n return n.draggable.register(d.current), function() {\n return n.draggable.unregister(d.current);\n };\n }, [n.draggable]), N2(function() {\n if (u.current) {\n u.current = !1;\n return;\n }\n var h = d.current;\n d.current = p, n.draggable.update(p, h);\n }, [p, n.draggable]);\n}\nfunction qK(e, t, r) {\n cs(function() {\n function n(i) {\n return "Draggable[id: " + i + "]: ";\n }\n var o = e.draggableId;\n o || ( false ? 0 : V1(!1)), typeof o != "string" && ( false ? 0 : V1(!1)), wX(e.index) || ( false ? 0 : V1(!1)), e.mapped.type !== "DRAGGING" && (EC(r()), e.isEnabled && (vC(t, o) || ( false ? 0 : V1(!1))));\n });\n}\nfunction xK(e) {\n B9(function() {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(e);\n cs(function() {\n e !== t.current && ( false ? 0 : V1(!1));\n }, [e]);\n });\n}\nfunction RK(e) {\n e.preventDefault();\n}\nfunction BK(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), r = F0(function(W) {\n t.current = W;\n }, []), n = F0(function() {\n return t.current;\n }, []), o = Xl(Wc), i = o.contextId, a = o.dragHandleUsageInstructionsId, s = o.registry, l = Xl(k9), c = l.type, p = l.droppableId, d = ze(function() {\n return {\n id: e.draggableId,\n index: e.index,\n type: c,\n droppableId: p\n };\n }, [e.draggableId, e.index, c, p]), u = e.children, h = e.draggableId, b = e.isEnabled, M = e.shouldRespectForcePress, C = e.canDragInteractiveElements, g = e.isClone, f = e.mapped, O = e.dropAnimationFinished;\n if (qK(e, i, n), xK(g), !g) {\n var m = ze(function() {\n return {\n descriptor: d,\n registry: s,\n getDraggableRef: n,\n canDragInteractiveElements: C,\n shouldRespectForcePress: M,\n isEnabled: b\n };\n }, [d, s, n, C, M, b]);\n wK(m);\n }\n var v = ze(function() {\n return b ? {\n tabIndex: 0,\n role: "button",\n "aria-describedby": a,\n "data-rbd-drag-handle-draggable-id": h,\n "data-rbd-drag-handle-context-id": i,\n draggable: !1,\n onDragStart: RK\n } : null;\n }, [i, a, h, b]), y = F0(function(W) {\n f.type === "DRAGGING" && f.dropping && W.propertyName === "transform" && O();\n }, [O, f]), z = ze(function() {\n var W = yK(f), T = f.type === "DRAGGING" && f.dropping ? y : null, x = {\n innerRef: r,\n draggableProps: {\n "data-rbd-draggable-context-id": i,\n "data-rbd-draggable-id": h,\n style: W,\n onTransitionEnd: T\n },\n dragHandleProps: v\n };\n return x;\n }, [i, v, h, f, y, r]), N = ze(function() {\n return {\n draggableId: d.id,\n type: d.type,\n source: {\n index: d.index,\n droppableId: d.droppableId\n }\n };\n }, [d.droppableId, d.id, d.index, d.type]);\n return u(z, f.snapshot, N);\n}\nvar SC = function(e, t) {\n return e === t;\n}, kC = function(e) {\n var t = e.combine, r = e.destination;\n return r ? r.droppableId : t ? t.droppableId : null;\n}, WK = function(t) {\n return t.combine ? t.combine.draggableId : null;\n}, EK = function(t) {\n return t.at && t.at.type === "COMBINE" ? t.at.combine.draggableId : null;\n};\nfunction SK() {\n var e = gt(function(o, i) {\n return {\n x: o,\n y: i\n };\n }), t = gt(function(o, i, a, s, l) {\n return {\n isDragging: !0,\n isClone: i,\n isDropAnimating: !!l,\n dropAnimation: l,\n mode: o,\n draggingOver: a,\n combineWith: s,\n combineTargetFor: null\n };\n }), r = gt(function(o, i, a, s, l, c, p) {\n return {\n mapped: {\n type: "DRAGGING",\n dropping: null,\n draggingOver: l,\n combineWith: c,\n mode: i,\n offset: o,\n dimension: a,\n forceShouldAnimate: p,\n snapshot: t(i, s, l, c, null)\n }\n };\n }), n = function(i, a) {\n if (i.isDragging) {\n if (i.critical.draggable.id !== a.draggableId)\n return null;\n var s = i.current.client.offset, l = i.dimensions.draggables[a.draggableId], c = k2(i.impact), p = EK(i.impact), d = i.forceShouldAnimate;\n return r(e(s.x, s.y), i.movementMode, l, a.isClone, c, p, d);\n }\n if (i.phase === "DROP_ANIMATING") {\n var u = i.completed;\n if (u.result.draggableId !== a.draggableId)\n return null;\n var h = a.isClone, b = i.dimensions.draggables[a.draggableId], M = u.result, C = M.mode, g = kC(M), f = WK(M), O = i.dropDuration, m = {\n duration: O,\n curve: m9.drop,\n moveTo: i.newHomeClientOffset,\n opacity: f ? x4.opacity.drop : null,\n scale: f ? x4.scale.drop : null\n };\n return {\n mapped: {\n type: "DRAGGING",\n offset: i.newHomeClientOffset,\n dimension: b,\n dropping: m,\n draggingOver: g,\n combineWith: f,\n mode: C,\n forceShouldAnimate: null,\n snapshot: t(C, h, g, f, m)\n }\n };\n }\n return null;\n };\n return n;\n}\nfunction NC(e) {\n return {\n isDragging: !1,\n isDropAnimating: !1,\n isClone: !1,\n dropAnimation: null,\n mode: null,\n draggingOver: null,\n combineTargetFor: e,\n combineWith: null\n };\n}\nvar kK = {\n mapped: {\n type: "SECONDARY",\n offset: Bt,\n combineTargetFor: null,\n shouldAnimateDisplacement: !0,\n snapshot: NC(null)\n }\n};\nfunction NK() {\n var e = gt(function(a, s) {\n return {\n x: a,\n y: s\n };\n }), t = gt(NC), r = gt(function(a, s, l) {\n return s === void 0 && (s = null), {\n mapped: {\n type: "SECONDARY",\n offset: a,\n combineTargetFor: s,\n shouldAnimateDisplacement: l,\n snapshot: t(s)\n }\n };\n }), n = function(s) {\n return s ? r(Bt, s, !0) : null;\n }, o = function(s, l, c, p) {\n var d = c.displaced.visible[s], u = !!(p.inVirtualList && p.effected[s]), h = xc(c), b = h && h.draggableId === s ? l : null;\n if (!d) {\n if (!u)\n return n(b);\n if (c.displaced.invisible[s])\n return null;\n var M = Va(p.displacedBy.point), C = e(M.x, M.y);\n return r(C, b, !0);\n }\n if (u)\n return n(b);\n var g = c.displacedBy.point, f = e(g.x, g.y);\n return r(f, b, d.shouldAnimate);\n }, i = function(s, l) {\n if (s.isDragging)\n return s.critical.draggable.id === l.draggableId ? null : o(l.draggableId, s.critical.draggable.id, s.impact, s.afterCritical);\n if (s.phase === "DROP_ANIMATING") {\n var c = s.completed;\n return c.result.draggableId === l.draggableId ? null : o(l.draggableId, c.result.draggableId, c.impact, c.afterCritical);\n }\n return null;\n };\n return i;\n}\nvar IK = function() {\n var t = SK(), r = NK(), n = function(i, a) {\n return t(i, a) || r(i, a) || kK;\n };\n return n;\n}, TK = {\n dropAnimationFinished: AC\n}, DK = Iz(IK, TK, null, {\n context: x9,\n pure: !0,\n areStatePropsEqual: SC\n})(BK);\nfunction IC(e) {\n var t = Xl(k9), r = t.isUsingCloneFor;\n return r === e.draggableId && !e.isClone ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DK, e);\n}\nfunction HK(e) {\n var t = typeof e.isDragDisabled == "boolean" ? !e.isDragDisabled : !0, r = !!e.disableInteractiveElementBlocking, n = !!e.shouldRespectForcePress;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IC, H0({}, e, {\n isClone: !1,\n isEnabled: t,\n canDragInteractiveElements: r,\n shouldRespectForcePress: n\n }));\n}\nfunction PK(e) {\n var t = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Wc);\n t || ( false ? 0 : V1(!1));\n var r = t.contextId, n = t.isMovementAllowed, o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), i = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), a = e.children, s = e.droppableId, l = e.type, c = e.mode, p = e.direction, d = e.ignoreContainerClipping, u = e.isDropDisabled, h = e.isCombineEnabled, b = e.snapshot, M = e.useClone, C = e.updateViewportMaxScroll, g = e.getContainerForClone, f = F0(function() {\n return o.current;\n }, []), O = F0(function(E) {\n o.current = E;\n }, []), m = F0(function() {\n return i.current;\n }, []), v = F0(function(E) {\n i.current = E;\n }, []);\n fK({\n props: e,\n getDroppableRef: f,\n getPlaceholderRef: m\n });\n var y = F0(function() {\n n() && C({\n maxScroll: fC()\n });\n }, [n, C]);\n cK({\n droppableId: s,\n type: l,\n mode: c,\n direction: p,\n isDropDisabled: u,\n isCombineEnabled: h,\n ignoreContainerClipping: d,\n getDroppableRef: f\n });\n var z = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(gK, {\n on: e.placeholder,\n shouldAnimate: e.shouldAnimatePlaceholder\n }, function(E) {\n var L = E.onClose, w = E.data, q = E.animate;\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(uK, {\n placeholder: w,\n onClose: L,\n innerRef: v,\n animate: q,\n contextId: r,\n onTransitionEnd: y\n });\n }), N = ze(function() {\n return {\n innerRef: O,\n placeholder: z,\n droppableProps: {\n "data-rbd-droppable-id": s,\n "data-rbd-droppable-context-id": r\n }\n };\n }, [r, s, z, O]), W = M ? M.dragging.draggableId : null, T = ze(function() {\n return {\n droppableId: s,\n type: l,\n isUsingCloneFor: W\n };\n }, [s, W, l]);\n function x() {\n if (!M)\n return null;\n var E = M.dragging, L = M.render, w = react__WEBPACK_IMPORTED_MODULE_0___default().createElement(IC, {\n draggableId: E.draggableId,\n index: E.source.index,\n isClone: !0,\n isEnabled: !0,\n shouldRespectForcePress: !1,\n canDragInteractiveElements: !0\n }, function(q, S) {\n return L(q, S, E);\n });\n return react_dom__WEBPACK_IMPORTED_MODULE_2___default().createPortal(w, g());\n }\n return react__WEBPACK_IMPORTED_MODULE_0___default().createElement(k9.Provider, {\n value: T\n }, a(N, b), x());\n}\nvar up = function(t, r) {\n return t === r.droppable.type;\n}, Zb = function(t, r) {\n return r.draggables[t.draggable.id];\n}, VK = function() {\n var t = {\n placeholder: null,\n shouldAnimatePlaceholder: !0,\n snapshot: {\n isDraggingOver: !1,\n draggingOverWith: null,\n draggingFromThisWith: null,\n isUsingPlaceholder: !1\n },\n useClone: null\n }, r = H0({}, t, {\n shouldAnimatePlaceholder: !1\n }), n = gt(function(a) {\n return {\n draggableId: a.id,\n type: a.type,\n source: {\n index: a.index,\n droppableId: a.droppableId\n }\n };\n }), o = gt(function(a, s, l, c, p, d) {\n var u = p.descriptor.id, h = p.descriptor.droppableId === a;\n if (h) {\n var b = d ? {\n render: d,\n dragging: n(p.descriptor)\n } : null, M = {\n isDraggingOver: l,\n draggingOverWith: l ? u : null,\n draggingFromThisWith: u,\n isUsingPlaceholder: !0\n };\n return {\n placeholder: p.placeholder,\n shouldAnimatePlaceholder: !1,\n snapshot: M,\n useClone: b\n };\n }\n if (!s)\n return r;\n if (!c)\n return t;\n var C = {\n isDraggingOver: l,\n draggingOverWith: u,\n draggingFromThisWith: null,\n isUsingPlaceholder: !0\n };\n return {\n placeholder: p.placeholder,\n shouldAnimatePlaceholder: !0,\n snapshot: C,\n useClone: null\n };\n }), i = function(s, l) {\n var c = l.droppableId, p = l.type, d = !l.isDropDisabled, u = l.renderClone;\n if (s.isDragging) {\n var h = s.critical;\n if (!up(p, h))\n return r;\n var b = Zb(h, s.dimensions), M = k2(s.impact) === c;\n return o(c, d, M, M, b, u);\n }\n if (s.phase === "DROP_ANIMATING") {\n var C = s.completed;\n if (!up(p, C.critical))\n return r;\n var g = Zb(C.critical, s.dimensions);\n return o(c, d, kC(C.result) === c, k2(C.impact) === c, g, u);\n }\n if (s.phase === "IDLE" && s.completed && !s.shouldFlush) {\n var f = s.completed;\n if (!up(p, f.critical))\n return r;\n var O = k2(f.impact) === c, m = !!(f.impact.at && f.impact.at.type === "COMBINE"), v = f.critical.droppable.id === c;\n return O ? m ? t : r : v ? t : r;\n }\n return r;\n };\n return i;\n}, FK = {\n updateViewportMaxScroll: NQ\n};\nfunction UK() {\n return document.body || ( false ? 0 : V1(!1)), document.body;\n}\nvar YK = {\n mode: "standard",\n type: "DEFAULT",\n direction: "vertical",\n isDropDisabled: !1,\n isCombineEnabled: !1,\n ignoreContainerClipping: !1,\n renderClone: null,\n getContainerForClone: UK\n}, TC = Iz(VK, FK, null, {\n context: x9,\n pure: !0,\n areStatePropsEqual: SC\n})(PK);\nTC.defaultProps = YK;\nconst XK = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div.attrs({\n as: "div"\n})`\n .scrollbar-container {\n padding-right: 0;\n }\n .ps__rail-y {\n right: 0 !important;\n }\n`, QK = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n padding: 2px 0;\n label {\n font-size: 12px;\n }\n`, GK = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div.attrs({\n as: "div"\n})``, jK = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n .icon-system {\n cursor: move;\n padding: 3px;\n color: ${e.textIcon.textPrimary};\n }\n `\n), KK = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n max-height: ${(e) => e.$hasScroll ? "200px" : "338px"};\n`, ZK = ({\n columnsState: e,\n selectedColumns: t,\n handleColumnsStateChange: r,\n handleCheckboxColumnsChange: n,\n pageSize: o,\n filterNames: i\n}) => {\n const a = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (d, u, h) => {\n const b = Array.from(d), [M] = b.splice(u, 1);\n return b.splice(h, 0, M), new Set(b);\n },\n []\n ), s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (d) => {\n if (!d.destination)\n return;\n const u = a(\n e.items,\n d.source.index,\n d.destination.index\n );\n r({\n items: u\n });\n },\n [e, r, a]\n );\n function l(d) {\n return d == null ? void 0 : d.toLowerCase().replace(/\\s+/g, "");\n }\n function c(d, u) {\n for (const h of d)\n if (l(h) === l(u))\n return h;\n return null;\n }\n const p = () => /* @__PURE__ */ A(TC, { droppableId: "droppable", children: (d) => /* @__PURE__ */ c1("div", { ...d.droppableProps, ref: d.innerRef, children: [\n Array.from(e.items).map((u, h) => (\n // @ts-ignore\n /* @__PURE__ */ A(HK, { draggableId: u, index: h, children: (b) => /* @__PURE__ */ A(\n GK,\n {\n ref: b.innerRef,\n ...b.draggableProps,\n ...b.dragHandleProps,\n children: /* @__PURE__ */ c1(QK, { children: [\n /* @__PURE__ */ A(\n vn,\n {\n label: c(i, u) || nt(u),\n checked: t.has(u),\n isRequired: !0,\n onChange: n(u)\n }\n ),\n /* @__PURE__ */ A(jK, { children: /* @__PURE__ */ A(\n f0,\n {\n name: "MoveDots",\n "aria-label": "Drag List Item",\n size: "xxs"\n }\n ) })\n ] })\n }\n ) }, u)\n )),\n d.placeholder\n ] }) });\n return /* @__PURE__ */ A(XK, { children: /* @__PURE__ */ A(ns, { options: { suppressScrollX: !0, useBothWheelAxes: !1 }, children: /* @__PURE__ */ A(KK, { $hasScroll: !!(o && o <= 10), children: /* @__PURE__ */ A(Kj, { onDragEnd: s, children: p() }) }) }) });\n}, Jb = (e, t) => !e && !t || e.size !== t.size ? !1 : String(Array.from(e)) === String(Array.from(t));\nvar DC = { exports: {} };\n(function(e) {\n /**\n * Highcharts JS v11.4.8 (2024-08-29)\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n (function(t, r) {\n e.exports ? (r.default = r, e.exports = t && t.document ? r(t) : r) : (t.Highcharts && t.Highcharts.error(16, !0), t.Highcharts = r(t));\n })(typeof window < "u" ? window : Cn, function(t) {\n var r = {};\n function n(o, i, a, s) {\n !o.hasOwnProperty(i) && (o[i] = s.apply(null, a), t && typeof CustomEvent == "function" && t.dispatchEvent(new CustomEvent("HighchartsModuleLoaded", { detail: { path: i, module: o[i] } })));\n }\n return n(r, "Core/Globals.js", [], function() {\n var o, i;\n return (i = o || (o = {})).SVG_NS = "http://www.w3.org/2000/svg", i.product = "Highcharts", i.version = "11.4.8", i.win = t !== void 0 ? t : {}, i.doc = i.win.document, i.svg = i.doc && i.doc.createElementNS && !!i.doc.createElementNS(i.SVG_NS, "svg").createSVGRect, i.userAgent = i.win.navigator && i.win.navigator.userAgent || "", i.isChrome = i.win.chrome, i.isFirefox = i.userAgent.indexOf("Firefox") !== -1, i.isMS = /(edge|msie|trident)/i.test(i.userAgent) && !i.win.opera, i.isSafari = !i.isChrome && i.userAgent.indexOf("Safari") !== -1, i.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(i.userAgent), i.isWebKit = i.userAgent.indexOf("AppleWebKit") !== -1, i.deg2rad = 2 * Math.PI / 360, i.hasBidiBug = i.isFirefox && 4 > parseInt(i.userAgent.split("Firefox/")[1], 10), i.marginNames = ["plotTop", "marginRight", "marginBottom", "plotLeft"], i.noop = function() {\n }, i.supportsPassiveEvents = function() {\n let a = !1;\n if (!i.isMS) {\n let s = Object.defineProperty({}, "passive", { get: function() {\n a = !0;\n } });\n i.win.addEventListener && i.win.removeEventListener && (i.win.addEventListener("testPassive", i.noop, s), i.win.removeEventListener("testPassive", i.noop, s));\n }\n return a;\n }(), i.charts = [], i.composed = [], i.dateFormats = {}, i.seriesTypes = {}, i.symbolSizes = {}, i.chartCount = 0, o;\n }), n(r, "Core/Utilities.js", [r["Core/Globals.js"]], function(o) {\n let i, { charts: a, doc: s, win: l } = o;\n function c(w, q, S, B) {\n let I = q ? "Highcharts error" : "Highcharts warning";\n w === 32 && (w = `${I}: Deprecated member`);\n let P = C(w), k = P ? `${I} #${w}: www.highcharts.com/errors/${w}/` : w.toString();\n if (B !== void 0) {\n let K = "";\n P && (k += "?"), T(B, function($, j) {\n K += `\n - ${j}: ${$}`, P && (k += encodeURI(j) + "=" + encodeURI($));\n }), k += K;\n }\n E(o, "displayError", { chart: S, code: w, message: k, params: B }, function() {\n if (q)\n throw Error(k);\n l.console && c.messages.indexOf(k) === -1 && console.warn(k);\n }), c.messages.push(k);\n }\n function p(w, q) {\n return parseInt(w, q || 10);\n }\n function d(w) {\n return typeof w == "string";\n }\n function u(w) {\n let q = Object.prototype.toString.call(w);\n return q === "[object Array]" || q === "[object Array Iterator]";\n }\n function h(w, q) {\n return !!w && typeof w == "object" && (!q || !u(w));\n }\n function b(w) {\n return h(w) && typeof w.nodeType == "number";\n }\n function M(w) {\n let q = w && w.constructor;\n return !!(h(w, !0) && !b(w) && q && q.name && q.name !== "Object");\n }\n function C(w) {\n return typeof w == "number" && !isNaN(w) && w < 1 / 0 && w > -1 / 0;\n }\n function g(w) {\n return w != null;\n }\n function f(w, q, S) {\n let B, I = d(q) && !g(S), P = (k, K) => {\n g(k) ? w.setAttribute(K, k) : I ? (B = w.getAttribute(K)) || K !== "class" || (B = w.getAttribute(K + "Name")) : w.removeAttribute(K);\n };\n return d(q) ? P(S, q) : T(q, P), B;\n }\n function O(w) {\n return u(w) ? w : [w];\n }\n function m(w, q) {\n let S;\n for (S in w || (w = {}), q)\n w[S] = q[S];\n return w;\n }\n function v() {\n let w = arguments, q = w.length;\n for (let S = 0; S < q; S++) {\n let B = w[S];\n if (B != null)\n return B;\n }\n }\n function y(w, q) {\n m(w.style, q);\n }\n function z(w) {\n return Math.pow(10, Math.floor(Math.log(w) / Math.LN10));\n }\n function N(w, q) {\n return w > 1e14 ? w : parseFloat(w.toPrecision(q || 14));\n }\n (c || (c = {})).messages = [], Math.easeInOutSine = function(w) {\n return -0.5 * (Math.cos(Math.PI * w) - 1);\n };\n let W = Array.prototype.find ? function(w, q) {\n return w.find(q);\n } : function(w, q) {\n let S, B = w.length;\n for (S = 0; S < B; S++)\n if (q(w[S], S))\n return w[S];\n };\n function T(w, q, S) {\n for (let B in w)\n Object.hasOwnProperty.call(w, B) && q.call(S || w[B], w[B], B, w);\n }\n function x(w, q, S) {\n function B(k, K) {\n let $ = w.removeEventListener;\n $ && $.call(w, k, K, !1);\n }\n function I(k) {\n let K, $;\n w.nodeName && (q ? (K = {})[q] = !0 : K = k, T(K, function(j, r1) {\n if (k[r1])\n for ($ = k[r1].length; $--; )\n B(r1, k[r1][$].fn);\n }));\n }\n let P = typeof w == "function" && w.prototype || w;\n if (Object.hasOwnProperty.call(P, "hcEvents")) {\n let k = P.hcEvents;\n if (q) {\n let K = k[q] || [];\n S ? (k[q] = K.filter(function($) {\n return S !== $.fn;\n }), B(q, S)) : (I(k), k[q] = []);\n } else\n I(k), delete P.hcEvents;\n }\n }\n function E(w, q, S, B) {\n if (S = S || {}, s.createEvent && (w.dispatchEvent || w.fireEvent && w !== o)) {\n let I = s.createEvent("Events");\n I.initEvent(q, !0, !0), S = m(I, S), w.dispatchEvent ? w.dispatchEvent(S) : w.fireEvent(q, S);\n } else if (w.hcEvents) {\n S.target || m(S, { preventDefault: function() {\n S.defaultPrevented = !0;\n }, target: w, type: q });\n let I = [], P = w, k = !1;\n for (; P.hcEvents; )\n Object.hasOwnProperty.call(P, "hcEvents") && P.hcEvents[q] && (I.length && (k = !0), I.unshift.apply(I, P.hcEvents[q])), P = Object.getPrototypeOf(P);\n k && I.sort((K, $) => K.order - $.order), I.forEach((K) => {\n K.fn.call(w, S) === !1 && S.preventDefault();\n });\n }\n B && !S.defaultPrevented && B.call(w, S);\n }\n T({ map: "map", each: "forEach", grep: "filter", reduce: "reduce", some: "some" }, function(w, q) {\n o[q] = function(S) {\n return c(32, !1, void 0, { [`Highcharts.${q}`]: `use Array.${w}` }), Array.prototype[w].apply(S, [].slice.call(arguments, 1));\n };\n });\n let L = function() {\n let w = Math.random().toString(36).substring(2, 9) + "-", q = 0;\n return function() {\n return "highcharts-" + (i ? "" : w) + q++;\n };\n }();\n return l.jQuery && (l.jQuery.fn.highcharts = function() {\n let w = [].slice.call(arguments);\n if (this[0])\n return w[0] ? (new o[d(w[0]) ? w.shift() : "Chart"](this[0], w[0], w[1]), this) : a[f(this[0], "data-highcharts-chart")];\n }), { addEvent: function(w, q, S, B = {}) {\n let I = typeof w == "function" && w.prototype || w;\n Object.hasOwnProperty.call(I, "hcEvents") || (I.hcEvents = {});\n let P = I.hcEvents;\n o.Point && w instanceof o.Point && w.series && w.series.chart && (w.series.chart.runTrackerClick = !0);\n let k = w.addEventListener;\n k && k.call(w, q, S, !!o.supportsPassiveEvents && { passive: B.passive === void 0 ? q.indexOf("touch") !== -1 : B.passive, capture: !1 }), P[q] || (P[q] = []);\n let K = { fn: S, order: typeof B.order == "number" ? B.order : 1 / 0 };\n return P[q].push(K), P[q].sort(($, j) => $.order - j.order), function() {\n x(w, q, S);\n };\n }, arrayMax: function(w) {\n let q = w.length, S = w[0];\n for (; q--; )\n w[q] > S && (S = w[q]);\n return S;\n }, arrayMin: function(w) {\n let q = w.length, S = w[0];\n for (; q--; )\n w[q] < S && (S = w[q]);\n return S;\n }, attr: f, clamp: function(w, q, S) {\n return w > q ? w < S ? w : S : q;\n }, clearTimeout: function(w) {\n g(w) && clearTimeout(w);\n }, correctFloat: N, createElement: function(w, q, S, B, I) {\n let P = s.createElement(w);\n return q && m(P, q), I && y(P, { padding: "0", border: "none", margin: "0" }), S && y(P, S), B && B.appendChild(P), P;\n }, crisp: (w, q = 0, S) => {\n let B = q % 2 / 2, I = S ? -1 : 1;\n return (Math.round(w * I - B) + B) * I;\n }, css: y, defined: g, destroyObjectProperties: function(w, q, S) {\n T(w, function(B, I) {\n B !== q && (B != null && B.destroy) && B.destroy(), (B != null && B.destroy || !S) && delete w[I];\n });\n }, diffObjects: function(w, q, S, B) {\n let I = {};\n return function P(k, K, $, j) {\n let r1 = S ? K : k;\n T(k, function(a1, _) {\n if (!j && B && B.indexOf(_) > -1 && K[_]) {\n a1 = O(a1), $[_] = [];\n for (let Y = 0; Y < Math.max(a1.length, K[_].length); Y++)\n K[_][Y] && (a1[Y] === void 0 ? $[_][Y] = K[_][Y] : ($[_][Y] = {}, P(a1[Y], K[_][Y], $[_][Y], j + 1)));\n } else\n h(a1, !0) && !a1.nodeType ? ($[_] = u(a1) ? [] : {}, P(a1, K[_] || {}, $[_], j + 1), Object.keys($[_]).length !== 0 || _ === "colorAxis" && j === 0 || delete $[_]) : (k[_] !== K[_] || _ in k && !(_ in K)) && _ !== "__proto__" && _ !== "constructor" && ($[_] = r1[_]);\n });\n }(w, q, I, 0), I;\n }, discardElement: function(w) {\n w && w.parentElement && w.parentElement.removeChild(w);\n }, erase: function(w, q) {\n let S = w.length;\n for (; S--; )\n if (w[S] === q) {\n w.splice(S, 1);\n break;\n }\n }, error: c, extend: m, extendClass: function(w, q) {\n let S = function() {\n };\n return S.prototype = new w(), m(S.prototype, q), S;\n }, find: W, fireEvent: E, getClosestDistance: function(w, q) {\n let S, B, I, P = !q;\n return w.forEach((k) => {\n if (k.length > 1)\n for (I = k.length - 1; I > 0; I--)\n (B = k[I] - k[I - 1]) < 0 && !P ? (q == null || q(), q = void 0) : B && (S === void 0 || B < S) && (S = B);\n }), S;\n }, getMagnitude: z, getNestedProperty: function(w, q) {\n let S = w.split(".");\n for (; S.length && g(q); ) {\n let B = S.shift();\n if (B === void 0 || B === "__proto__")\n return;\n if (B === "this") {\n let P;\n return h(q) && (P = q["@this"]), P ?? q;\n }\n let I = q[B];\n if (!g(I) || typeof I == "function" || typeof I.nodeType == "number" || I === l)\n return;\n q = I;\n }\n return q;\n }, getStyle: function w(q, S, B) {\n let I;\n if (S === "width") {\n let k = Math.min(q.offsetWidth, q.scrollWidth), K = q.getBoundingClientRect && q.getBoundingClientRect().width;\n return K < k && K >= k - 1 && (k = Math.floor(K)), Math.max(0, k - (w(q, "padding-left", !0) || 0) - (w(q, "padding-right", !0) || 0));\n }\n if (S === "height")\n return Math.max(0, Math.min(q.offsetHeight, q.scrollHeight) - (w(q, "padding-top", !0) || 0) - (w(q, "padding-bottom", !0) || 0));\n let P = l.getComputedStyle(q, void 0);\n return P && (I = P.getPropertyValue(S), v(B, S !== "opacity") && (I = p(I))), I;\n }, inArray: function(w, q, S) {\n return c(32, !1, void 0, { "Highcharts.inArray": "use Array.indexOf" }), q.indexOf(w, S);\n }, insertItem: function(w, q) {\n let S, B = w.options.index, I = q.length;\n for (S = w.options.isInternal ? I : 0; S < I + 1; S++)\n if (!q[S] || C(B) && B < v(q[S].options.index, q[S]._i) || q[S].options.isInternal) {\n q.splice(S, 0, w);\n break;\n }\n return S;\n }, isArray: u, isClass: M, isDOMElement: b, isFunction: function(w) {\n return typeof w == "function";\n }, isNumber: C, isObject: h, isString: d, keys: function(w) {\n return c(32, !1, void 0, { "Highcharts.keys": "use Object.keys" }), Object.keys(w);\n }, merge: function() {\n let w, q = arguments, S = {}, B = function(P, k) {\n return typeof P != "object" && (P = {}), T(k, function(K, $) {\n $ !== "__proto__" && $ !== "constructor" && (!h(K, !0) || M(K) || b(K) ? P[$] = k[$] : P[$] = B(P[$] || {}, K));\n }), P;\n };\n q[0] === !0 && (S = q[1], q = Array.prototype.slice.call(q, 2));\n let I = q.length;\n for (w = 0; w < I; w++)\n S = B(S, q[w]);\n return S;\n }, normalizeTickInterval: function(w, q, S, B, I) {\n let P, k = w;\n S = v(S, z(w));\n let K = w / S;\n for (!q && (q = I ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], B === !1 && (S === 1 ? q = q.filter(function($) {\n return $ % 1 == 0;\n }) : S <= 0.1 && (q = [1 / S]))), P = 0; P < q.length && (k = q[P], (!I || !(k * S >= w)) && (I || !(K <= (q[P] + (q[P + 1] || q[P])) / 2))); P++)\n ;\n return N(k * S, -Math.round(Math.log(1e-3) / Math.LN10));\n }, objectEach: T, offset: function(w) {\n let q = s.documentElement, S = w.parentElement || w.parentNode ? w.getBoundingClientRect() : { top: 0, left: 0, width: 0, height: 0 };\n return { top: S.top + (l.pageYOffset || q.scrollTop) - (q.clientTop || 0), left: S.left + (l.pageXOffset || q.scrollLeft) - (q.clientLeft || 0), width: S.width, height: S.height };\n }, pad: function(w, q, S) {\n return Array((q || 2) + 1 - String(w).replace("-", "").length).join(S || "0") + w;\n }, pick: v, pInt: p, pushUnique: function(w, q) {\n return 0 > w.indexOf(q) && !!w.push(q);\n }, relativeLength: function(w, q, S) {\n return /%$/.test(w) ? q * parseFloat(w) / 100 + (S || 0) : parseFloat(w);\n }, removeEvent: x, replaceNested: function(w, ...q) {\n let S, B;\n do\n for (B of (S = w, q))\n w = w.replace(B[0], B[1]);\n while (w !== S);\n return w;\n }, splat: O, stableSort: function(w, q) {\n let S, B, I = w.length;\n for (B = 0; B < I; B++)\n w[B].safeI = B;\n for (w.sort(function(P, k) {\n return (S = q(P, k)) === 0 ? P.safeI - k.safeI : S;\n }), B = 0; B < I; B++)\n delete w[B].safeI;\n }, syncTimeout: function(w, q, S) {\n return q > 0 ? setTimeout(w, q, S) : (w.call(0, S), -1);\n }, timeUnits: { millisecond: 1, second: 1e3, minute: 6e4, hour: 36e5, day: 864e5, week: 6048e5, month: 24192e5, year: 314496e5 }, uniqueKey: L, useSerialIds: function(w) {\n return i = v(w, i);\n }, wrap: function(w, q, S) {\n let B = w[q];\n w[q] = function() {\n let I = arguments, P = this;\n return S.apply(this, [function() {\n return B.apply(P, arguments.length ? arguments : I);\n }].concat([].slice.call(arguments)));\n };\n } };\n }), n(r, "Core/Chart/ChartDefaults.js", [], function() {\n return { alignThresholds: !1, panning: { enabled: !1, type: "x" }, styledMode: !1, borderRadius: 0, colorCount: 10, allowMutatingData: !0, ignoreHiddenSeries: !0, spacing: [10, 10, 15, 10], resetZoomButton: { theme: {}, position: {} }, reflow: !0, type: "line", zooming: { singleTouch: !1, resetButton: { theme: { zIndex: 6 }, position: { align: "right", x: -10, y: 10 } } }, width: null, height: null, borderColor: "#334eff", backgroundColor: "#ffffff", plotBorderColor: "#cccccc" };\n }), n(r, "Core/Color/Palettes.js", [], function() {\n return { colors: ["#2caffe", "#544fc5", "#00e272", "#fe6a35", "#6b8abc", "#d568fb", "#2ee0ca", "#fa4b42", "#feb56a", "#91e8e1"] };\n }), n(r, "Core/Time.js", [r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i) {\n let { win: a } = o, { defined: s, error: l, extend: c, isNumber: p, isObject: d, merge: u, objectEach: h, pad: b, pick: M, splat: C, timeUnits: g } = i, f = o.isSafari && a.Intl && a.Intl.DateTimeFormat.prototype.formatRange, O = o.isSafari && a.Intl && !a.Intl.DateTimeFormat.prototype.formatRange;\n class m {\n constructor(y) {\n this.options = {}, this.useUTC = !1, this.variableTimezone = !1, this.Date = a.Date, this.getTimezoneOffset = this.timezoneOffsetFunction(), this.update(y);\n }\n get(y, z) {\n if (this.variableTimezone || this.timezoneOffset) {\n let N = z.getTime(), W = N - this.getTimezoneOffset(z);\n z.setTime(W);\n let T = z["getUTC" + y]();\n return z.setTime(N), T;\n }\n return this.useUTC ? z["getUTC" + y]() : z["get" + y]();\n }\n set(y, z, N) {\n if (this.variableTimezone || this.timezoneOffset) {\n if (y === "Milliseconds" || y === "Seconds" || y === "Minutes" && this.getTimezoneOffset(z) % 36e5 == 0)\n return z["setUTC" + y](N);\n let W = this.getTimezoneOffset(z), T = z.getTime() - W;\n z.setTime(T), z["setUTC" + y](N);\n let x = this.getTimezoneOffset(z);\n return T = z.getTime() + x, z.setTime(T);\n }\n return this.useUTC || f && y === "FullYear" ? z["setUTC" + y](N) : z["set" + y](N);\n }\n update(y = {}) {\n let z = M(y.useUTC, !0);\n this.options = y = u(!0, this.options, y), this.Date = y.Date || a.Date || Date, this.useUTC = z, this.timezoneOffset = z && y.timezoneOffset || void 0, this.getTimezoneOffset = this.timezoneOffsetFunction(), this.variableTimezone = z && !!(y.getTimezoneOffset || y.timezone);\n }\n makeTime(y, z, N, W, T, x) {\n let E, L, w;\n return this.useUTC ? (E = this.Date.UTC.apply(0, arguments), L = this.getTimezoneOffset(E), E += L, L !== (w = this.getTimezoneOffset(E)) ? E += w - L : L - 36e5 !== this.getTimezoneOffset(E - 36e5) || O || (E -= 36e5)) : E = new this.Date(y, z, M(N, 1), M(W, 0), M(T, 0), M(x, 0)).getTime(), E;\n }\n timezoneOffsetFunction() {\n let y = this, z = this.options, N = z.getTimezoneOffset;\n return this.useUTC ? z.timezone ? (W) => {\n try {\n let T = `shortOffset,${z.timezone || ""}`, [x, E, L, w, q = 0] = (m.formatCache[T] = m.formatCache[T] || Intl.DateTimeFormat("en", { timeZone: z.timezone, timeZoneName: "shortOffset" })).format(W).split(/(GMT|:)/).map(Number), S = -(36e5 * (L + q / 60));\n if (p(S))\n return S;\n } catch {\n l(34);\n }\n return 0;\n } : this.useUTC && N ? (W) => 6e4 * N(W.valueOf()) : () => 6e4 * (y.timezoneOffset || 0) : (W) => 6e4 * new Date(W.toString()).getTimezoneOffset();\n }\n dateFormat(y, z, N) {\n if (!s(z) || isNaN(z))\n return o.defaultOptions.lang && o.defaultOptions.lang.invalidDate || "";\n y = M(y, "%Y-%m-%d %H:%M:%S");\n let W = this, T = new this.Date(z), x = this.get("Hours", T), E = this.get("Day", T), L = this.get("Date", T), w = this.get("Month", T), q = this.get("FullYear", T), S = o.defaultOptions.lang, B = S && S.weekdays, I = S && S.shortWeekdays;\n return h(c({ a: I ? I[E] : B[E].substr(0, 3), A: B[E], d: b(L), e: b(L, 2, " "), w: E, b: S.shortMonths[w], B: S.months[w], m: b(w + 1), o: w + 1, y: q.toString().substr(2, 2), Y: q, H: b(x), k: x, I: b(x % 12 || 12), l: x % 12 || 12, M: b(this.get("Minutes", T)), p: x < 12 ? "AM" : "PM", P: x < 12 ? "am" : "pm", S: b(this.get("Seconds", T)), L: b(Math.floor(z % 1e3), 3) }, o.dateFormats), function(P, k) {\n for (; y.indexOf("%" + k) !== -1; )\n y = y.replace("%" + k, typeof P == "function" ? P.call(W, z) : P);\n }), N ? y.substr(0, 1).toUpperCase() + y.substr(1) : y;\n }\n resolveDTLFormat(y) {\n return d(y, !0) ? y : { main: (y = C(y))[0], from: y[1], to: y[2] };\n }\n getTimeTicks(y, z, N, W) {\n let T, x, E, L, w = this, q = w.Date, S = [], B = {}, I = new q(z), P = y.unitRange, k = y.count || 1;\n if (W = M(W, 1), s(z)) {\n w.set("Milliseconds", I, P >= g.second ? 0 : k * Math.floor(w.get("Milliseconds", I) / k)), P >= g.second && w.set("Seconds", I, P >= g.minute ? 0 : k * Math.floor(w.get("Seconds", I) / k)), P >= g.minute && w.set("Minutes", I, P >= g.hour ? 0 : k * Math.floor(w.get("Minutes", I) / k)), P >= g.hour && w.set("Hours", I, P >= g.day ? 0 : k * Math.floor(w.get("Hours", I) / k)), P >= g.day && w.set("Date", I, P >= g.month ? 1 : Math.max(1, k * Math.floor(w.get("Date", I) / k))), P >= g.month && (w.set("Month", I, P >= g.year ? 0 : k * Math.floor(w.get("Month", I) / k)), x = w.get("FullYear", I)), P >= g.year && (x -= x % k, w.set("FullYear", I, x)), P === g.week && (L = w.get("Day", I), w.set("Date", I, w.get("Date", I) - L + W + (L < W ? -7 : 0))), x = w.get("FullYear", I);\n let K = w.get("Month", I), $ = w.get("Date", I), j = w.get("Hours", I);\n z = I.getTime(), (w.variableTimezone || !w.useUTC) && s(N) && (E = N - z > 4 * g.month || w.getTimezoneOffset(z) !== w.getTimezoneOffset(N));\n let r1 = I.getTime();\n for (T = 1; r1 < N; )\n S.push(r1), P === g.year ? r1 = w.makeTime(x + T * k, 0) : P === g.month ? r1 = w.makeTime(x, K + T * k) : E && (P === g.day || P === g.week) ? r1 = w.makeTime(x, K, $ + T * k * (P === g.day ? 1 : 7)) : E && P === g.hour && k > 1 ? r1 = w.makeTime(x, K, $, j + T * k) : r1 += P * k, T++;\n S.push(r1), P <= g.hour && S.length < 1e4 && S.forEach(function(a1) {\n a1 % 18e5 == 0 && w.dateFormat("%H%M%S%L", a1) === "000000000" && (B[a1] = "day");\n });\n }\n return S.info = c(y, { higherRanks: B, totalRange: P * k }), S;\n }\n getDateFormat(y, z, N, W) {\n let T = this.dateFormat("%m-%d %H:%M:%S.%L", z), x = "01-01 00:00:00.000", E = { millisecond: 15, second: 12, minute: 9, hour: 6, day: 3 }, L = "millisecond", w = L;\n for (L in g) {\n if (y === g.week && +this.dateFormat("%w", z) === N && T.substr(6) === x.substr(6)) {\n L = "week";\n break;\n }\n if (g[L] > y) {\n L = w;\n break;\n }\n if (E[L] && T.substr(E[L]) !== x.substr(E[L]))\n break;\n L !== "week" && (w = L);\n }\n return this.resolveDTLFormat(W[L]).main;\n }\n }\n return m.formatCache = {}, m;\n }), n(r, "Core/Defaults.js", [r["Core/Chart/ChartDefaults.js"], r["Core/Globals.js"], r["Core/Color/Palettes.js"], r["Core/Time.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n let { isTouchDevice: c } = i, { fireEvent: p, merge: d } = l, u = { colors: a.colors, symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], lang: { loading: "Loading...", months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], decimalPoint: ".", numericSymbols: ["k", "M", "G", "T", "P", "E"], resetZoom: "Reset zoom", resetZoomTitle: "Reset zoom level 1:1", thousandsSep: " " }, global: { buttonTheme: { fill: "#f7f7f7", padding: 8, r: 2, stroke: "#cccccc", "stroke-width": 1, style: { color: "#333333", cursor: "pointer", fontSize: "0.8em", fontWeight: "normal" }, states: { hover: { fill: "#e6e6e6" }, select: { fill: "#e6e9ff", style: { color: "#000000", fontWeight: "bold" } }, disabled: { style: { color: "#cccccc" } } } } }, time: { Date: void 0, getTimezoneOffset: void 0, timezone: void 0, timezoneOffset: 0, useUTC: !0 }, chart: o, title: { style: { color: "#333333", fontWeight: "bold" }, text: "Chart title", align: "center", margin: 15, widthAdjust: -44 }, subtitle: { style: { color: "#666666", fontSize: "0.8em" }, text: "", align: "center", widthAdjust: -44 }, caption: { margin: 15, style: { color: "#666666", fontSize: "0.8em" }, text: "", align: "left", verticalAlign: "bottom" }, plotOptions: {}, legend: { enabled: !0, align: "center", alignColumns: !0, className: "highcharts-no-tooltip", events: {}, layout: "horizontal", itemMarginBottom: 2, itemMarginTop: 2, labelFormatter: function() {\n return this.name;\n }, borderColor: "#999999", borderRadius: 0, navigation: { style: { fontSize: "0.8em" }, activeColor: "#0022ff", inactiveColor: "#cccccc" }, itemStyle: { color: "#333333", cursor: "pointer", fontSize: "0.8em", textDecoration: "none", textOverflow: "ellipsis" }, itemHoverStyle: { color: "#000000" }, itemHiddenStyle: { color: "#666666", textDecoration: "line-through" }, shadow: !1, itemCheckboxStyle: { position: "absolute", width: "13px", height: "13px" }, squareSymbol: !0, symbolPadding: 5, verticalAlign: "bottom", x: 0, y: 0, title: { style: { fontSize: "0.8em", fontWeight: "bold" } } }, loading: { labelStyle: { fontWeight: "bold", position: "relative", top: "45%" }, style: { position: "absolute", backgroundColor: "#ffffff", opacity: 0.5, textAlign: "center" } }, tooltip: { enabled: !0, animation: { duration: 300, easing: (b) => Math.sqrt(1 - Math.pow(b - 1, 2)) }, borderRadius: 3, dateTimeLabelFormats: { millisecond: "%A, %e %b, %H:%M:%S.%L", second: "%A, %e %b, %H:%M:%S", minute: "%A, %e %b, %H:%M", hour: "%A, %e %b, %H:%M", day: "%A, %e %b %Y", week: "Week from %A, %e %b %Y", month: "%B %Y", year: "%Y" }, footerFormat: "", headerShape: "callout", hideDelay: 500, padding: 8, shape: "callout", shared: !1, snap: c ? 25 : 10, headerFormat: \'{point.key}
\', pointFormat: \' {series.name}: {point.y}
\', backgroundColor: "#ffffff", borderWidth: void 0, shadow: !0, stickOnContact: !1, style: { color: "#333333", cursor: "default", fontSize: "0.8em" }, useHTML: !1 }, credits: { enabled: !0, href: "https://www.highcharts.com?credits", position: { align: "right", x: -10, verticalAlign: "bottom", y: -5 }, style: { cursor: "pointer", color: "#999999", fontSize: "0.6em" }, text: "Highcharts.com" } };\n u.chart.styledMode = !1;\n let h = new s(u.time);\n return { defaultOptions: u, defaultTime: h, getOptions: function() {\n return u;\n }, setOptions: function(b) {\n return p(i, "setOptions", { options: b }), d(!0, u, b), (b.time || b.global) && (i.time ? i.time.update(d(u.global, u.time, b.global, b.time)) : i.time = h), u;\n } };\n }), n(r, "Core/Color/Color.js", [r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i) {\n let { isNumber: a, merge: s, pInt: l } = i;\n class c {\n static parse(d) {\n return d ? new c(d) : c.None;\n }\n constructor(d) {\n let u, h, b, M;\n this.rgba = [NaN, NaN, NaN, NaN], this.input = d;\n let C = o.Color;\n if (C && C !== c)\n return new C(d);\n if (typeof d == "object" && d.stops !== void 0)\n this.stops = d.stops.map((g) => new c(g[1]));\n else if (typeof d == "string") {\n if (this.input = d = c.names[d.toLowerCase()] || d, d.charAt(0) === "#") {\n let g = d.length, f = parseInt(d.substr(1), 16);\n g === 7 ? h = [(16711680 & f) >> 16, (65280 & f) >> 8, 255 & f, 1] : g === 4 && (h = [(3840 & f) >> 4 | (3840 & f) >> 8, (240 & f) >> 4 | 240 & f, (15 & f) << 4 | 15 & f, 1]);\n }\n if (!h)\n for (b = c.parsers.length; b-- && !h; )\n (u = (M = c.parsers[b]).regex.exec(d)) && (h = M.parse(u));\n }\n h && (this.rgba = h);\n }\n get(d) {\n let u = this.input, h = this.rgba;\n if (typeof u == "object" && this.stops !== void 0) {\n let b = s(u);\n return b.stops = [].slice.call(b.stops), this.stops.forEach((M, C) => {\n b.stops[C] = [b.stops[C][0], M.get(d)];\n }), b;\n }\n return h && a(h[0]) ? d !== "rgb" && (d || h[3] !== 1) ? d === "a" ? `${h[3]}` : "rgba(" + h.join(",") + ")" : "rgb(" + h[0] + "," + h[1] + "," + h[2] + ")" : u;\n }\n brighten(d) {\n let u = this.rgba;\n if (this.stops)\n this.stops.forEach(function(h) {\n h.brighten(d);\n });\n else if (a(d) && d !== 0)\n for (let h = 0; h < 3; h++)\n u[h] += l(255 * d), u[h] < 0 && (u[h] = 0), u[h] > 255 && (u[h] = 255);\n return this;\n }\n setOpacity(d) {\n return this.rgba[3] = d, this;\n }\n tweenTo(d, u) {\n let h = this.rgba, b = d.rgba;\n if (!a(h[0]) || !a(b[0]))\n return d.input || "none";\n let M = b[3] !== 1 || h[3] !== 1;\n return (M ? "rgba(" : "rgb(") + Math.round(b[0] + (h[0] - b[0]) * (1 - u)) + "," + Math.round(b[1] + (h[1] - b[1]) * (1 - u)) + "," + Math.round(b[2] + (h[2] - b[2]) * (1 - u)) + (M ? "," + (b[3] + (h[3] - b[3]) * (1 - u)) : "") + ")";\n }\n }\n return c.names = { white: "#ffffff", black: "#000000" }, c.parsers = [{ regex: /rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d?(?:\\.\\d+)?)\\s*\\)/, parse: function(p) {\n return [l(p[1]), l(p[2]), l(p[3]), parseFloat(p[4], 10)];\n } }, { regex: /rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)/, parse: function(p) {\n return [l(p[1]), l(p[2]), l(p[3]), 1];\n } }], c.None = new c(""), c;\n }), n(r, "Core/Animation/Fx.js", [r["Core/Color/Color.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { parse: s } = o, { win: l } = i, { isNumber: c, objectEach: p } = a;\n class d {\n constructor(h, b, M) {\n this.pos = NaN, this.options = b, this.elem = h, this.prop = M;\n }\n dSetter() {\n let h = this.paths, b = h && h[0], M = h && h[1], C = this.now || 0, g = [];\n if (C !== 1 && b && M)\n if (b.length === M.length && C < 1)\n for (let f = 0; f < M.length; f++) {\n let O = b[f], m = M[f], v = [];\n for (let y = 0; y < m.length; y++) {\n let z = O[y], N = m[y];\n c(z) && c(N) && !(m[0] === "A" && (y === 4 || y === 5)) ? v[y] = z + C * (N - z) : v[y] = N;\n }\n g.push(v);\n }\n else\n g = M;\n else\n g = this.toD || [];\n this.elem.attr("d", g, void 0, !0);\n }\n update() {\n let h = this.elem, b = this.prop, M = this.now, C = this.options.step;\n this[b + "Setter"] ? this[b + "Setter"]() : h.attr ? h.element && h.attr(b, M, null, !0) : h.style[b] = M + this.unit, C && C.call(h, M, this);\n }\n run(h, b, M) {\n let C = this, g = C.options, f = function(v) {\n return !f.stopped && C.step(v);\n }, O = l.requestAnimationFrame || function(v) {\n setTimeout(v, 13);\n }, m = function() {\n for (let v = 0; v < d.timers.length; v++)\n d.timers[v]() || d.timers.splice(v--, 1);\n d.timers.length && O(m);\n };\n h !== b || this.elem["forceAnimate:" + this.prop] ? (this.startTime = +/* @__PURE__ */ new Date(), this.start = h, this.end = b, this.unit = M, this.now = this.start, this.pos = 0, f.elem = this.elem, f.prop = this.prop, f() && d.timers.push(f) === 1 && O(m)) : (delete g.curAnim[this.prop], g.complete && Object.keys(g.curAnim).length === 0 && g.complete.call(this.elem));\n }\n step(h) {\n let b, M, C = +/* @__PURE__ */ new Date(), g = this.options, f = this.elem, O = g.complete, m = g.duration, v = g.curAnim;\n return f.attr && !f.element ? b = !1 : h || C >= m + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), v[this.prop] = !0, M = !0, p(v, function(y) {\n y !== !0 && (M = !1);\n }), M && O && O.call(f), b = !1) : (this.pos = g.easing((C - this.startTime) / m), this.now = this.start + (this.end - this.start) * this.pos, this.update(), b = !0), b;\n }\n initPath(h, b, M) {\n let C = h.startX, g = h.endX, f = M.slice(), O = h.isArea, m = O ? 2 : 1, v = b && M.length > b.length && M.hasStackedCliffs, y, z, N, W, T = b && b.slice();\n if (!T || v)\n return [f, f];\n function x(L, w) {\n for (; L.length < z; ) {\n let q = L[0], S = w[z - L.length];\n if (S && q[0] === "M" && (S[0] === "C" ? L[0] = ["C", q[1], q[2], q[1], q[2], q[1], q[2]] : L[0] = ["L", q[1], q[2]]), L.unshift(q), O) {\n let B = L.pop();\n L.push(L[L.length - 1], B);\n }\n }\n }\n function E(L) {\n for (; L.length < z; ) {\n let w = L[Math.floor(L.length / m) - 1].slice();\n if (w[0] === "C" && (w[1] = w[5], w[2] = w[6]), O) {\n let q = L[Math.floor(L.length / m)].slice();\n L.splice(L.length / 2, 0, w, q);\n } else\n L.push(w);\n }\n }\n if (C && g && g.length) {\n for (N = 0; N < C.length; N++) {\n if (C[N] === g[0]) {\n y = N;\n break;\n }\n if (C[0] === g[g.length - C.length + N]) {\n y = N, W = !0;\n break;\n }\n if (C[C.length - 1] === g[g.length - C.length + N]) {\n y = C.length - N;\n break;\n }\n }\n y === void 0 && (T = []);\n }\n return T.length && c(y) && (z = f.length + y * m, W ? (x(T, f), E(f)) : (x(f, T), E(T))), [T, f];\n }\n fillSetter() {\n d.prototype.strokeSetter.apply(this, arguments);\n }\n strokeSetter() {\n this.elem.attr(this.prop, s(this.start).tweenTo(s(this.end), this.pos), void 0, !0);\n }\n }\n return d.timers = [], d;\n }), n(r, "Core/Animation/AnimationUtilities.js", [r["Core/Animation/Fx.js"], r["Core/Utilities.js"]], function(o, i) {\n let { defined: a, getStyle: s, isArray: l, isNumber: c, isObject: p, merge: d, objectEach: u, pick: h } = i;\n function b(C) {\n return p(C) ? d({ duration: 500, defer: 0 }, C) : { duration: C ? 500 : 0, defer: 0 };\n }\n function M(C, g) {\n let f = o.timers.length;\n for (; f--; )\n o.timers[f].elem !== C || g && g !== o.timers[f].prop || (o.timers[f].stopped = !0);\n }\n return { animate: function(C, g, f) {\n let O, m = "", v, y, z;\n p(f) || (z = arguments, f = { duration: z[2], easing: z[3], complete: z[4] }), c(f.duration) || (f.duration = 400), f.easing = typeof f.easing == "function" ? f.easing : Math[f.easing] || Math.easeInOutSine, f.curAnim = d(g), u(g, function(N, W) {\n M(C, W), y = new o(C, f, W), v = void 0, W === "d" && l(g.d) ? (y.paths = y.initPath(C, C.pathArray, g.d), y.toD = g.d, O = 0, v = 1) : C.attr ? O = C.attr(W) : (O = parseFloat(s(C, W)) || 0, W !== "opacity" && (m = "px")), v || (v = N), typeof v == "string" && v.match("px") && (v = v.replace(/px/g, "")), y.run(O, v, m);\n });\n }, animObject: b, getDeferredAnimation: function(C, g, f) {\n let O = b(g), m = f ? [f] : C.series, v = 0, y = 0;\n return m.forEach((z) => {\n let N = b(z.options.animation);\n v = p(g) && a(g.defer) ? O.defer : Math.max(v, N.duration + N.defer), y = Math.min(O.duration, N.duration);\n }), C.renderer.forExport && (v = 0), { defer: Math.max(0, v - y), duration: Math.min(v, y) };\n }, setAnimation: function(C, g) {\n g.renderer.globalAnimation = h(C, g.options.chart.animation, !0);\n }, stop: M };\n }), n(r, "Core/Renderer/HTML/AST.js", [r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i) {\n let { SVG_NS: a, win: s } = o, { attr: l, createElement: c, css: p, error: d, isFunction: u, isString: h, objectEach: b, splat: M } = i, { trustedTypes: C } = s, g = C && u(C.createPolicy) && C.createPolicy("highcharts", { createHTML: (v) => v }), f = g ? g.createHTML("") : "", O = function() {\n try {\n return !!new DOMParser().parseFromString(f, "text/html");\n } catch {\n return !1;\n }\n }();\n class m {\n static filterUserAttributes(y) {\n return b(y, (z, N) => {\n let W = !0;\n m.allowedAttributes.indexOf(N) === -1 && (W = !1), ["background", "dynsrc", "href", "lowsrc", "src"].indexOf(N) !== -1 && (W = h(z) && m.allowedReferences.some((T) => z.indexOf(T) === 0)), W || (d(33, !1, void 0, { "Invalid attribute in config": `${N}` }), delete y[N]), h(z) && y[N] && (y[N] = z.replace(/ {\n let W = N.split(":").map((x) => x.trim()), T = W.shift();\n return T && W.length && (z[T.replace(/-([a-z])/g, (x) => x[1].toUpperCase())] = W.join(":")), z;\n }, {});\n }\n static setElementHTML(y, z) {\n y.innerHTML = m.emptyHTML, z && new m(z).addToDOM(y);\n }\n constructor(y) {\n this.nodes = typeof y == "string" ? this.parseMarkup(y) : y;\n }\n addToDOM(y) {\n return function z(N, W) {\n let T;\n return M(N).forEach(function(x) {\n let E, L = x.tagName, w = x.textContent ? o.doc.createTextNode(x.textContent) : void 0, q = m.bypassHTMLFiltering;\n if (L)\n if (L === "#text")\n E = w;\n else if (m.allowedTags.indexOf(L) !== -1 || q) {\n let S = L === "svg" ? a : W.namespaceURI || a, B = o.doc.createElementNS(S, L), I = x.attributes || {};\n b(x, function(P, k) {\n k !== "tagName" && k !== "attributes" && k !== "children" && k !== "style" && k !== "textContent" && (I[k] = P);\n }), l(B, q ? I : m.filterUserAttributes(I)), x.style && p(B, x.style), w && B.appendChild(w), z(x.children || [], B), E = B;\n } else\n d(33, !1, void 0, { "Invalid tagName in config": L });\n E && W.appendChild(E), T = E;\n }), T;\n }(this.nodes, y);\n }\n parseMarkup(y) {\n let z, N = [];\n if (y = y.trim().replace(/ style=(["\'])/g, " data-style=$1"), O)\n z = new DOMParser().parseFromString(g ? g.createHTML(y) : y, "text/html");\n else {\n let T = c("div");\n T.innerHTML = y, z = { body: T };\n }\n let W = (T, x) => {\n let E = T.nodeName.toLowerCase(), L = { tagName: E };\n E === "#text" && (L.textContent = T.textContent || "");\n let w = T.attributes;\n if (w) {\n let q = {};\n [].forEach.call(w, (S) => {\n S.name === "data-style" ? L.style = m.parseStyle(S.value) : q[S.name] = S.value;\n }), L.attributes = q;\n }\n if (T.childNodes.length) {\n let q = [];\n [].forEach.call(T.childNodes, (S) => {\n W(S, q);\n }), q.length && (L.children = q);\n }\n x.push(L);\n };\n return [].forEach.call(z.body.childNodes, (T) => W(T, N)), N;\n }\n }\n return m.allowedAttributes = ["alt", "aria-controls", "aria-describedby", "aria-expanded", "aria-haspopup", "aria-hidden", "aria-label", "aria-labelledby", "aria-live", "aria-pressed", "aria-readonly", "aria-roledescription", "aria-selected", "class", "clip-path", "color", "colspan", "cx", "cy", "d", "dx", "dy", "disabled", "fill", "filterUnits", "flood-color", "flood-opacity", "height", "href", "id", "in", "in2", "markerHeight", "markerWidth", "offset", "opacity", "operator", "orient", "padding", "paddingLeft", "paddingRight", "patternUnits", "r", "radius", "refX", "refY", "role", "scope", "slope", "src", "startOffset", "stdDeviation", "stroke", "stroke-linecap", "stroke-width", "style", "tableValues", "result", "rowspan", "summary", "target", "tabindex", "text-align", "text-anchor", "textAnchor", "textLength", "title", "type", "valign", "width", "x", "x1", "x2", "xlink:href", "y", "y1", "y2", "zIndex"], m.allowedReferences = ["https://", "http://", "mailto:", "/", "../", "./", "#"], m.allowedTags = ["a", "abbr", "b", "br", "button", "caption", "circle", "clipPath", "code", "dd", "defs", "div", "dl", "dt", "em", "feComponentTransfer", "feComposite", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feMorphology", "feOffset", "feMerge", "feMergeNode", "filter", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "img", "li", "linearGradient", "marker", "ol", "p", "path", "pattern", "pre", "rect", "small", "span", "stop", "strong", "style", "sub", "sup", "svg", "table", "text", "textPath", "thead", "title", "tbody", "tspan", "td", "th", "tr", "u", "ul", "#text"], m.emptyHTML = f, m.bypassHTMLFiltering = !1, m;\n }), n(r, "Core/Templating.js", [r["Core/Defaults.js"], r["Core/Utilities.js"]], function(o, i) {\n let { defaultOptions: a, defaultTime: s } = o, { extend: l, getNestedProperty: c, isArray: p, isNumber: d, isObject: u, pick: h, pInt: b } = i, M = { add: (f, O) => f + O, divide: (f, O) => O !== 0 ? f / O : "", eq: (f, O) => f == O, each: function(f) {\n let O = arguments[arguments.length - 1];\n return !!p(f) && f.map((m, v) => C(O.body, l(u(m) ? m : { "@this": m }, { "@index": v, "@first": v === 0, "@last": v === f.length - 1 }))).join("");\n }, ge: (f, O) => f >= O, gt: (f, O) => f > O, if: (f) => !!f, le: (f, O) => f <= O, lt: (f, O) => f < O, multiply: (f, O) => f * O, ne: (f, O) => f != O, subtract: (f, O) => f - O, unless: (f) => !f };\n function C(f = "", O, m) {\n let v = /\\{([\\w\\:\\.\\,;\\-\\/<>%@"\'’= #\\(\\)]+)\\}/g, y = /\\(([\\w\\:\\.\\,;\\-\\/<>%@"\'= ]+)\\)/g, z = [], N = /f$/, W = /\\.(\\d)/, T = a.lang, x = m && m.time || s, E = m && m.numberFormatter || g, L = (I = "") => {\n let P;\n return I === "true" || I !== "false" && ((P = Number(I)).toString() === I ? P : c(I, O));\n }, w, q, S = 0, B;\n for (; (w = v.exec(f)) !== null; ) {\n let I = y.exec(w[1]);\n I && (w = I, B = !0), q && q.isBlock || (q = { ctx: O, expression: w[1], find: w[0], isBlock: w[1].charAt(0) === "#", start: w.index, startInner: w.index + w[0].length, length: w[0].length });\n let P = w[1].split(" ")[0].replace("#", "");\n M[P] && (q.isBlock && P === q.fn && S++, q.fn || (q.fn = P));\n let k = w[1] === "else";\n if (q.isBlock && q.fn && (w[1] === `/${q.fn}` || k))\n if (S)\n !k && S--;\n else {\n let K = q.startInner, $ = f.substr(K, w.index - K);\n q.body === void 0 ? (q.body = $, q.startInner = w.index + w[0].length) : q.elseBody = $, q.find += $ + w[0], k || (z.push(q), q = void 0);\n }\n else\n q.isBlock || z.push(q);\n if (I && !(q != null && q.isBlock))\n break;\n }\n return z.forEach((I) => {\n let P, k, { body: K, elseBody: $, expression: j, fn: r1 } = I;\n if (r1) {\n let a1 = [I], _ = j.split(" ");\n for (k = M[r1].length; k--; )\n a1.unshift(L(_[k + 1]));\n P = M[r1].apply(O, a1), I.isBlock && typeof P == "boolean" && (P = C(P ? K : $, O, m));\n } else {\n let a1 = j.split(":");\n if (P = L(a1.shift() || ""), a1.length && typeof P == "number") {\n let _ = a1.join(":");\n if (N.test(_)) {\n let Y = parseInt((_.match(W) || ["", "-1"])[1], 10);\n P !== null && (P = E(P, Y, T.decimalPoint, _.indexOf(",") > -1 ? T.thousandsSep : ""));\n } else\n P = x.dateFormat(_, P);\n }\n }\n f = f.replace(I.find, h(P, ""));\n }), B ? C(f, O, m) : f;\n }\n function g(f, O, m, v) {\n let y, z;\n f = +f || 0, O = +O;\n let N = a.lang, W = (f.toString().split(".")[1] || "").split("e")[0].length, T = f.toString().split("e"), x = O;\n O === -1 ? O = Math.min(W, 20) : d(O) ? O && T[1] && T[1] < 0 && ((z = O + +T[1]) >= 0 ? (T[0] = (+T[0]).toExponential(z).split("e")[0], O = z) : (T[0] = T[0].split(".")[0] || 0, f = O < 20 ? (T[0] * Math.pow(10, T[1])).toFixed(O) : 0, T[1] = 0)) : O = 2;\n let E = (Math.abs(T[1] ? T[0] : f) + Math.pow(10, -Math.max(O, W) - 1)).toFixed(O), L = String(b(E)), w = L.length > 3 ? L.length % 3 : 0;\n return m = h(m, N.decimalPoint), v = h(v, N.thousandsSep), y = (f < 0 ? "-" : "") + (w ? L.substr(0, w) + v : ""), 0 > +T[1] && !x ? y = "0" : y += L.substr(w).replace(/(\\d{3})(?=\\d)/g, "$1" + v), O ? y += m + E.slice(-O) : +y == 0 && (y = "0"), T[1] && +y != 0 && (y += "e" + T[1]), y;\n }\n return { dateFormat: function(f, O, m) {\n return s.dateFormat(f, O, m);\n }, format: C, helpers: M, numberFormat: g };\n }), n(r, "Core/Renderer/RendererRegistry.js", [r["Core/Globals.js"]], function(o) {\n var i, a;\n let s;\n return (a = i || (i = {})).rendererTypes = {}, a.getRendererType = function(l = s) {\n return a.rendererTypes[l] || a.rendererTypes[s];\n }, a.registerRendererType = function(l, c, p) {\n a.rendererTypes[l] = c, (!s || p) && (s = l, o.Renderer = c);\n }, i;\n }), n(r, "Core/Renderer/RendererUtilities.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { clamp: a, pick: s, pushUnique: l, stableSort: c } = o;\n return (i || (i = {})).distribute = function p(d, u, h) {\n let b = d, M = b.reducedLen || u, C = (L, w) => L.target - w.target, g = [], f = d.length, O = [], m = g.push, v, y, z, N = !0, W, T, x = 0, E;\n for (v = f; v--; )\n x += d[v].size;\n if (x > M) {\n for (c(d, (L, w) => (w.rank || 0) - (L.rank || 0)), z = (E = d[0].rank === d[d.length - 1].rank) ? f / 2 : -1, y = E ? z : f - 1; z && x > M; )\n W = d[v = Math.floor(y)], l(O, v) && (x -= W.size), y += z, E && y >= d.length && (z /= 2, y = z);\n O.sort((L, w) => w - L).forEach((L) => m.apply(g, d.splice(L, 1)));\n }\n for (c(d, C), d = d.map((L) => ({ size: L.size, targets: [L.target], align: s(L.align, 0.5) })); N; ) {\n for (v = d.length; v--; )\n W = d[v], T = (Math.min.apply(0, W.targets) + Math.max.apply(0, W.targets)) / 2, W.pos = a(T - W.size * W.align, 0, u - W.size);\n for (v = d.length, N = !1; v--; )\n v > 0 && d[v - 1].pos + d[v - 1].size > d[v].pos && (d[v - 1].size += d[v].size, d[v - 1].targets = d[v - 1].targets.concat(d[v].targets), d[v - 1].align = 0.5, d[v - 1].pos + d[v - 1].size > u && (d[v - 1].pos = u - d[v - 1].size), d.splice(v, 1), N = !0);\n }\n return m.apply(b, g), v = 0, d.some((L) => {\n let w = 0;\n return (L.targets || []).some(() => (b[v].pos = L.pos + w, h !== void 0 && Math.abs(b[v].pos - b[v].target) > h ? (b.slice(0, v + 1).forEach((q) => delete q.pos), b.reducedLen = (b.reducedLen || u) - 0.1 * u, b.reducedLen > 0.1 * u && p(b, u, h), !0) : (w += b[v].size, v++, !1)));\n }), c(b, C), b;\n }, i;\n }), n(r, "Core/Renderer/SVG/SVGElement.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Color/Color.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { animate: l, animObject: c, stop: p } = o, { deg2rad: d, doc: u, svg: h, SVG_NS: b, win: M } = a, { addEvent: C, attr: g, createElement: f, crisp: O, css: m, defined: v, erase: y, extend: z, fireEvent: N, isArray: W, isFunction: T, isObject: x, isString: E, merge: L, objectEach: w, pick: q, pInt: S, pushUnique: B, replaceNested: I, syncTimeout: P, uniqueKey: k } = s;\n class K {\n _defaultGetter(j) {\n let r1 = q(this[j + "Value"], this[j], this.element ? this.element.getAttribute(j) : null, 0);\n return /^-?[\\d\\.]+$/.test(r1) && (r1 = parseFloat(r1)), r1;\n }\n _defaultSetter(j, r1, a1) {\n a1.setAttribute(r1, j);\n }\n add(j) {\n let r1, a1 = this.renderer, _ = this.element;\n return j && (this.parentGroup = j), this.textStr !== void 0 && this.element.nodeName === "text" && a1.buildText(this), this.added = !0, (!j || j.handleZ || this.zIndex) && (r1 = this.zIndexSetter()), r1 || (j ? j.element : a1.box).appendChild(_), this.onAdd && this.onAdd(), this;\n }\n addClass(j, r1) {\n let a1 = r1 ? "" : this.attr("class") || "";\n return (j = (j || "").split(/ /g).reduce(function(_, Y) {\n return a1.indexOf(Y) === -1 && _.push(Y), _;\n }, a1 ? [a1] : []).join(" ")) !== a1 && this.attr("class", j), this;\n }\n afterSetters() {\n this.doTransform && (this.updateTransform(), this.doTransform = !1);\n }\n align(j, r1, a1, _ = !0) {\n let Y, D, H, G, J = {}, F = this.renderer, V = F.alignedObjects, Q = !!j;\n j ? (this.alignOptions = j, this.alignByTranslate = r1, this.alignTo = a1) : (j = this.alignOptions || {}, r1 = this.alignByTranslate, a1 = this.alignTo);\n let Z = !a1 || E(a1) ? a1 || "renderer" : void 0;\n Z && (Q && B(V, this), a1 = void 0);\n let t1 = q(a1, F[Z], F), n1 = j.align, U = j.verticalAlign;\n return Y = (t1.x || 0) + (j.x || 0), D = (t1.y || 0) + (j.y || 0), n1 === "right" ? H = 1 : n1 === "center" && (H = 2), H && (Y += ((t1.width || 0) - (j.width || 0)) / H), J[r1 ? "translateX" : "x"] = Math.round(Y), U === "bottom" ? G = 1 : U === "middle" && (G = 2), G && (D += ((t1.height || 0) - (j.height || 0)) / G), J[r1 ? "translateY" : "y"] = Math.round(D), _ && (this[this.placed ? "animate" : "attr"](J), this.placed = !0), this.alignAttr = J, this;\n }\n alignSetter(j) {\n let r1 = { left: "start", center: "middle", right: "end" };\n r1[j] && (this.alignValue = j, this.element.setAttribute("text-anchor", r1[j]));\n }\n animate(j, r1, a1) {\n let _ = c(q(r1, this.renderer.globalAnimation, !0)), Y = _.defer;\n return u.hidden && (_.duration = 0), _.duration !== 0 ? (a1 && (_.complete = a1), P(() => {\n this.element && l(this, j, _);\n }, Y)) : (this.attr(j, void 0, a1 || _.complete), w(j, function(D, H) {\n _.step && _.step.call(this, D, { prop: H, pos: 1, elem: this });\n }, this)), this;\n }\n applyTextOutline(j) {\n let r1 = this.element;\n j.indexOf("contrast") !== -1 && (j = j.replace(/contrast/g, this.renderer.getContrast(r1.style.fill)));\n let a1 = j.split(" "), _ = a1[a1.length - 1], Y = a1[0];\n if (Y && Y !== "none" && a.svg) {\n this.fakeTS = !0, Y = Y.replace(/(^[\\d\\.]+)(.*?)$/g, function(F, V, Q) {\n return 2 * Number(V) + Q;\n }), this.removeTextOutline();\n let D = u.createElementNS(b, "tspan");\n g(D, { class: "highcharts-text-outline", fill: _, stroke: _, "stroke-width": Y, "stroke-linejoin": "round" });\n let H = r1.querySelector("textPath") || r1;\n [].forEach.call(H.childNodes, (F) => {\n let V = F.cloneNode(!0);\n V.removeAttribute && ["fill", "stroke", "stroke-width", "stroke"].forEach((Q) => V.removeAttribute(Q)), D.appendChild(V);\n });\n let G = 0;\n [].forEach.call(H.querySelectorAll("text tspan"), (F) => {\n G += Number(F.getAttribute("dy"));\n });\n let J = u.createElementNS(b, "tspan");\n J.textContent = "​", g(J, { x: Number(r1.getAttribute("x")), dy: -G }), D.appendChild(J), H.insertBefore(D, H.firstChild);\n }\n }\n attr(j, r1, a1, _) {\n let { element: Y } = this, D = K.symbolCustomAttribs, H, G, J = this, F;\n return typeof j == "string" && r1 !== void 0 && (H = j, (j = {})[H] = r1), typeof j == "string" ? J = (this[j + "Getter"] || this._defaultGetter).call(this, j, Y) : (w(j, function(V, Q) {\n F = !1, _ || p(this, Q), this.symbolName && D.indexOf(Q) !== -1 && (G || (this.symbolAttr(j), G = !0), F = !0), this.rotation && (Q === "x" || Q === "y") && (this.doTransform = !0), F || (this[Q + "Setter"] || this._defaultSetter).call(this, V, Q, Y);\n }, this), this.afterSetters()), a1 && a1.call(this), J;\n }\n clip(j) {\n if (j && !j.clipPath) {\n let r1 = k() + "-", a1 = this.renderer.createElement("clipPath").attr({ id: r1 }).add(this.renderer.defs);\n z(j, { clipPath: a1, id: r1, count: 0 }), j.add(a1);\n }\n return this.attr("clip-path", j ? `url(${this.renderer.url}#${j.id})` : "none");\n }\n crisp(j, r1) {\n r1 = Math.round(r1 || j.strokeWidth || 0);\n let a1 = j.x || this.x || 0, _ = j.y || this.y || 0, Y = (j.width || this.width || 0) + a1, D = (j.height || this.height || 0) + _, H = O(a1, r1), G = O(_, r1);\n return z(j, { x: H, y: G, width: O(Y, r1) - H, height: O(D, r1) - G }), v(j.strokeWidth) && (j.strokeWidth = r1), j;\n }\n complexColor(j, r1, a1) {\n let _ = this.renderer, Y, D, H, G, J, F, V, Q, Z, t1, n1 = [], U;\n N(this.renderer, "complexColor", { args: arguments }, function() {\n if (j.radialGradient ? D = "radialGradient" : j.linearGradient && (D = "linearGradient"), D) {\n if (H = j[D], J = _.gradients, F = j.stops, Z = a1.radialReference, W(H) && (j[D] = H = { x1: H[0], y1: H[1], x2: H[2], y2: H[3], gradientUnits: "userSpaceOnUse" }), D === "radialGradient" && Z && !v(H.gradientUnits) && (G = H, H = L(H, _.getRadialAttr(Z, G), { gradientUnits: "userSpaceOnUse" })), w(H, function(e1, o1) {\n o1 !== "id" && n1.push(o1, e1);\n }), w(F, function(e1) {\n n1.push(e1);\n }), J[n1 = n1.join(",")])\n t1 = J[n1].attr("id");\n else {\n H.id = t1 = k();\n let e1 = J[n1] = _.createElement(D).attr(H).add(_.defs);\n e1.radAttr = G, e1.stops = [], F.forEach(function(o1) {\n o1[1].indexOf("rgba") === 0 ? (V = (Y = i.parse(o1[1])).get("rgb"), Q = Y.get("a")) : (V = o1[1], Q = 1);\n let u1 = _.createElement("stop").attr({ offset: o1[0], "stop-color": V, "stop-opacity": Q }).add(e1);\n e1.stops.push(u1);\n });\n }\n U = "url(" + _.url + "#" + t1 + ")", a1.setAttribute(r1, U), a1.gradient = n1, j.toString = function() {\n return U;\n };\n }\n });\n }\n css(j) {\n let r1 = this.styles, a1 = {}, _ = this.element, Y, D = !r1;\n if (r1 && w(j, function(H, G) {\n r1 && r1[G] !== H && (a1[G] = H, D = !0);\n }), D) {\n r1 && (j = z(r1, a1)), j.width === null || j.width === "auto" ? delete this.textWidth : _.nodeName.toLowerCase() === "text" && j.width && (Y = this.textWidth = S(j.width)), z(this.styles, j), Y && !h && this.renderer.forExport && delete j.width;\n let H = L(j);\n _.namespaceURI === this.SVG_NS && (["textOutline", "textOverflow", "width"].forEach((G) => H && delete H[G]), H.color && (H.fill = H.color)), m(_, H);\n }\n return this.added && (this.element.nodeName === "text" && this.renderer.buildText(this), j.textOutline && this.applyTextOutline(j.textOutline)), this;\n }\n dashstyleSetter(j) {\n let r1, a1 = this["stroke-width"];\n if (a1 === "inherit" && (a1 = 1), j = j && j.toLowerCase()) {\n let _ = j.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");\n for (r1 = _.length; r1--; )\n _[r1] = "" + S(_[r1]) * q(a1, NaN);\n j = _.join(",").replace(/NaN/g, "none"), this.element.setAttribute("stroke-dasharray", j);\n }\n }\n destroy() {\n var G;\n let j = this, r1 = j.element || {}, a1 = j.renderer, _ = r1.ownerSVGElement, Y = r1.nodeName === "SPAN" && j.parentGroup || void 0, D, H;\n if (r1.onclick = r1.onmouseout = r1.onmouseover = r1.onmousemove = r1.point = null, p(j), j.clipPath && _) {\n let J = j.clipPath;\n [].forEach.call(_.querySelectorAll("[clip-path],[CLIP-PATH]"), function(F) {\n F.getAttribute("clip-path").indexOf(J.element.id) > -1 && F.removeAttribute("clip-path");\n }), j.clipPath = J.destroy();\n }\n if (j.connector = (G = j.connector) == null ? void 0 : G.destroy(), j.stops) {\n for (H = 0; H < j.stops.length; H++)\n j.stops[H].destroy();\n j.stops.length = 0, j.stops = void 0;\n }\n for (j.safeRemoveChild(r1); Y && Y.div && Y.div.childNodes.length === 0; )\n D = Y.parentGroup, j.safeRemoveChild(Y.div), delete Y.div, Y = D;\n j.alignOptions && y(a1.alignedObjects, j), w(j, function(J, F) {\n j[F] && j[F].parentGroup === j && j[F].destroy && j[F].destroy(), delete j[F];\n });\n }\n dSetter(j, r1, a1) {\n W(j) && (typeof j[0] == "string" && (j = this.renderer.pathToSegments(j)), this.pathArray = j, j = j.reduce((_, Y, D) => Y && Y.join ? (D ? _ + " " : "") + Y.join(" ") : (Y || "").toString(), "")), /(NaN| {2}|^$)/.test(j) && (j = "M 0 0"), this[r1] !== j && (a1.setAttribute(r1, j), this[r1] = j);\n }\n fillSetter(j, r1, a1) {\n typeof j == "string" ? a1.setAttribute(r1, j) : j && this.complexColor(j, r1, a1);\n }\n hrefSetter(j, r1, a1) {\n a1.setAttributeNS("http://www.w3.org/1999/xlink", r1, j);\n }\n getBBox(j, r1) {\n let a1, _, Y, D, { alignValue: H, element: G, renderer: J, styles: F, textStr: V } = this, { cache: Q, cacheKeys: Z } = J, t1 = G.namespaceURI === this.SVG_NS, n1 = q(r1, this.rotation, 0), U = J.styledMode ? G && K.prototype.getStyle.call(G, "font-size") : F.fontSize;\n if (v(V) && ((D = V.toString()).indexOf("<") === -1 && (D = D.replace(/\\d/g, "0")), D += ["", J.rootFontSize, U, n1, this.textWidth, H, F.textOverflow, F.fontWeight].join(",")), D && !j && (a1 = Q[D]), !a1 || a1.polygon) {\n if (t1 || J.forExport) {\n try {\n Y = this.fakeTS && function(o1) {\n let u1 = G.querySelector(".highcharts-text-outline");\n u1 && m(u1, { display: o1 });\n }, T(Y) && Y("none"), a1 = G.getBBox ? z({}, G.getBBox()) : { width: G.offsetWidth, height: G.offsetHeight, x: 0, y: 0 }, T(Y) && Y("");\n } catch {\n }\n (!a1 || a1.width < 0) && (a1 = { x: 0, y: 0, width: 0, height: 0 });\n } else\n a1 = this.htmlGetBBox();\n _ = a1.height, t1 && (a1.height = _ = { "11px,17": 14, "13px,20": 16 }[`${U || ""},${Math.round(_)}`] || _), n1 && (a1 = this.getRotatedBox(a1, n1));\n let e1 = { bBox: a1 };\n N(this, "afterGetBBox", e1), a1 = e1.bBox;\n }\n if (D && (V === "" || a1.height > 0)) {\n for (; Z.length > 250; )\n delete Q[Z.shift()];\n Q[D] || Z.push(D), Q[D] = a1;\n }\n return a1;\n }\n getRotatedBox(j, r1) {\n let { x: a1, y: _, width: Y, height: D } = j, { alignValue: H, translateY: G, rotationOriginX: J = 0, rotationOriginY: F = 0 } = this, V = { right: 1, center: 0.5 }[H || 0] || 0, Q = Number(this.element.getAttribute("y") || 0) - (G ? 0 : _), Z = r1 * d, t1 = (r1 - 90) * d, n1 = Math.cos(Z), U = Math.sin(Z), e1 = Y * n1, o1 = Y * U, u1 = Math.cos(t1), M1 = Math.sin(t1), [[A1, l1], [b1, h1]] = [J, F].map((n0) => [n0 - n0 * n1, n0 * U]), z1 = a1 + V * (Y - e1) + A1 + h1 + Q * u1, O1 = z1 + e1, m1 = O1 - D * u1, L1 = m1 - e1, y1 = _ + Q - V * o1 - l1 + b1 + Q * M1, B1 = y1 + o1, T1 = B1 - D * M1, F1 = T1 - o1, X1 = Math.min(z1, O1, m1, L1), G1 = Math.min(y1, B1, T1, F1), Q1 = Math.max(z1, O1, m1, L1) - X1, K1 = Math.max(y1, B1, T1, F1) - G1;\n return { x: X1, y: G1, width: Q1, height: K1, polygon: [[z1, y1], [O1, B1], [m1, T1], [L1, F1]] };\n }\n getStyle(j) {\n return M.getComputedStyle(this.element || this, "").getPropertyValue(j);\n }\n hasClass(j) {\n return ("" + this.attr("class")).split(" ").indexOf(j) !== -1;\n }\n hide() {\n return this.attr({ visibility: "hidden" });\n }\n htmlGetBBox() {\n return { height: 0, width: 0, x: 0, y: 0 };\n }\n constructor(j, r1) {\n this.onEvents = {}, this.opacity = 1, this.SVG_NS = b, this.element = r1 === "span" || r1 === "body" ? f(r1) : u.createElementNS(this.SVG_NS, r1), this.renderer = j, this.styles = {}, N(this, "afterInit");\n }\n on(j, r1) {\n let { onEvents: a1 } = this;\n return a1[j] && a1[j](), a1[j] = C(this.element, j, r1), this;\n }\n opacitySetter(j, r1, a1) {\n let _ = Number(Number(j).toFixed(3));\n this.opacity = _, a1.setAttribute(r1, _);\n }\n reAlign() {\n var j;\n (j = this.alignOptions) != null && j.width && this.alignOptions.align !== "left" && (this.alignOptions.width = this.getBBox().width, this.placed = !1, this.align());\n }\n removeClass(j) {\n return this.attr("class", ("" + this.attr("class")).replace(E(j) ? RegExp(`(^| )${j}( |$)`) : j, " ").replace(/ +/g, " ").trim());\n }\n removeTextOutline() {\n let j = this.element.querySelector("tspan.highcharts-text-outline");\n j && this.safeRemoveChild(j);\n }\n safeRemoveChild(j) {\n let r1 = j.parentNode;\n r1 && r1.removeChild(j);\n }\n setRadialReference(j) {\n let r1 = this.element.gradient && this.renderer.gradients[this.element.gradient];\n return this.element.radialReference = j, r1 && r1.radAttr && r1.animate(this.renderer.getRadialAttr(j, r1.radAttr)), this;\n }\n shadow(j) {\n var Y;\n let { renderer: r1 } = this, a1 = L(((Y = this.parentGroup) == null ? void 0 : Y.rotation) === 90 ? { offsetX: -1, offsetY: -1 } : {}, x(j) ? j : {}), _ = r1.shadowDefinition(a1);\n return this.attr({ filter: j ? `url(${r1.url}#${_})` : "none" });\n }\n show(j = !0) {\n return this.attr({ visibility: j ? "inherit" : "visible" });\n }\n "stroke-widthSetter"(j, r1, a1) {\n this[r1] = j, a1.setAttribute(r1, j);\n }\n strokeWidth() {\n if (!this.renderer.styledMode)\n return this["stroke-width"] || 0;\n let j = this.getStyle("stroke-width"), r1 = 0, a1;\n return /px$/.test(j) ? r1 = S(j) : j !== "" && (g(a1 = u.createElementNS(b, "rect"), { width: j, "stroke-width": 0 }), this.element.parentNode.appendChild(a1), r1 = a1.getBBox().width, a1.parentNode.removeChild(a1)), r1;\n }\n symbolAttr(j) {\n let r1 = this;\n K.symbolCustomAttribs.forEach(function(a1) {\n r1[a1] = q(j[a1], r1[a1]);\n }), r1.attr({ d: r1.renderer.symbols[r1.symbolName](r1.x, r1.y, r1.width, r1.height, r1) });\n }\n textSetter(j) {\n j !== this.textStr && (delete this.textPxLength, this.textStr = j, this.added && this.renderer.buildText(this), this.reAlign());\n }\n titleSetter(j) {\n let r1 = this.element, a1 = r1.getElementsByTagName("title")[0] || u.createElementNS(this.SVG_NS, "title");\n r1.insertBefore ? r1.insertBefore(a1, r1.firstChild) : r1.appendChild(a1), a1.textContent = I(q(j, ""), [/<[^>]*>/g, ""]).replace(/</g, "<").replace(/>/g, ">");\n }\n toFront() {\n let j = this.element;\n return j.parentNode.appendChild(j), this;\n }\n translate(j, r1) {\n return this.attr({ translateX: j, translateY: r1 });\n }\n updateTransform(j = "transform") {\n var Q;\n let { element: r1, matrix: a1, rotation: _ = 0, rotationOriginX: Y, rotationOriginY: D, scaleX: H, scaleY: G, translateX: J = 0, translateY: F = 0 } = this, V = ["translate(" + J + "," + F + ")"];\n v(a1) && V.push("matrix(" + a1.join(",") + ")"), _ && (V.push("rotate(" + _ + " " + q(Y, r1.getAttribute("x"), 0) + " " + q(D, r1.getAttribute("y") || 0) + ")"), ((Q = this.text) == null ? void 0 : Q.element.tagName) === "SPAN" && this.text.attr({ rotation: _, rotationOriginX: (Y || 0) - this.padding, rotationOriginY: (D || 0) - this.padding })), (v(H) || v(G)) && V.push("scale(" + q(H, 1) + " " + q(G, 1) + ")"), V.length && !(this.text || this).textPath && r1.setAttribute(j, V.join(" "));\n }\n visibilitySetter(j, r1, a1) {\n j === "inherit" ? a1.removeAttribute(r1) : this[r1] !== j && a1.setAttribute(r1, j), this[r1] = j;\n }\n xGetter(j) {\n return this.element.nodeName === "circle" && (j === "x" ? j = "cx" : j === "y" && (j = "cy")), this._defaultGetter(j);\n }\n zIndexSetter(j, r1) {\n let a1 = this.renderer, _ = this.parentGroup, Y = (_ || a1).element || a1.box, D = this.element, H = Y === a1.box, G, J, F, V = !1, Q, Z = this.added, t1;\n if (v(j) ? (D.setAttribute("data-z-index", j), j = +j, this[r1] === j && (Z = !1)) : v(this[r1]) && D.removeAttribute("data-z-index"), this[r1] = j, Z) {\n for ((j = this.zIndex) && _ && (_.handleZ = !0), t1 = (G = Y.childNodes).length - 1; t1 >= 0 && !V; t1--)\n Q = !v(F = (J = G[t1]).getAttribute("data-z-index")), J !== D && (j < 0 && Q && !H && !t1 ? (Y.insertBefore(D, G[t1]), V = !0) : (S(F) <= j || Q && (!v(j) || j >= 0)) && (Y.insertBefore(D, G[t1 + 1]), V = !0));\n V || (Y.insertBefore(D, G[H ? 3 : 0]), V = !0);\n }\n return V;\n }\n }\n return K.symbolCustomAttribs = ["anchorX", "anchorY", "clockwise", "end", "height", "innerR", "r", "start", "width", "x", "y"], K.prototype.strokeSetter = K.prototype.fillSetter, K.prototype.yGetter = K.prototype.xGetter, K.prototype.matrixSetter = K.prototype.rotationOriginXSetter = K.prototype.rotationOriginYSetter = K.prototype.rotationSetter = K.prototype.scaleXSetter = K.prototype.scaleYSetter = K.prototype.translateXSetter = K.prototype.translateYSetter = K.prototype.verticalAlignSetter = function($, j) {\n this[j] = $, this.doTransform = !0;\n }, K;\n }), n(r, "Core/Renderer/SVG/SVGLabel.js", [r["Core/Renderer/SVG/SVGElement.js"], r["Core/Utilities.js"]], function(o, i) {\n let { defined: a, extend: s, isNumber: l, merge: c, pick: p, removeEvent: d } = i;\n class u extends o {\n constructor(b, M, C, g, f, O, m, v, y, z) {\n let N;\n super(b, "g"), this.paddingLeftSetter = this.paddingSetter, this.paddingRightSetter = this.paddingSetter, this.doUpdate = !1, this.textStr = M, this.x = C, this.y = g, this.anchorX = O, this.anchorY = m, this.baseline = y, this.className = z, this.addClass(z === "button" ? "highcharts-no-tooltip" : "highcharts-label"), z && this.addClass("highcharts-" + z), this.text = b.text(void 0, 0, 0, v).attr({ zIndex: 1 }), typeof f == "string" && ((N = /^url\\((.*?)\\)$/.test(f)) || this.renderer.symbols[f]) && (this.symbolKey = f), this.bBox = u.emptyBBox, this.padding = 3, this.baselineOffset = 0, this.needsBox = b.styledMode || N, this.deferredAttr = {}, this.alignFactor = 0;\n }\n alignSetter(b) {\n let M = { left: 0, center: 0.5, right: 1 }[b];\n M !== this.alignFactor && (this.alignFactor = M, this.bBox && l(this.xSetting) && this.attr({ x: this.xSetting }));\n }\n anchorXSetter(b, M) {\n this.anchorX = b, this.boxAttr(M, Math.round(b) - this.getCrispAdjust() - this.xSetting);\n }\n anchorYSetter(b, M) {\n this.anchorY = b, this.boxAttr(M, b - this.ySetting);\n }\n boxAttr(b, M) {\n this.box ? this.box.attr(b, M) : this.deferredAttr[b] = M;\n }\n css(b) {\n if (b) {\n let M = {};\n b = c(b), u.textProps.forEach((C) => {\n b[C] !== void 0 && (M[C] = b[C], delete b[C]);\n }), this.text.css(M), "fontSize" in M || "fontWeight" in M ? this.updateTextPadding() : ("width" in M || "textOverflow" in M) && this.updateBoxSize();\n }\n return o.prototype.css.call(this, b);\n }\n destroy() {\n d(this.element, "mouseenter"), d(this.element, "mouseleave"), this.text && this.text.destroy(), this.box && (this.box = this.box.destroy()), o.prototype.destroy.call(this);\n }\n fillSetter(b, M) {\n b && (this.needsBox = !0), this.fill = b, this.boxAttr(M, b);\n }\n getBBox(b, M) {\n this.textStr && this.bBox.width === 0 && this.bBox.height === 0 && this.updateBoxSize();\n let { padding: C, height: g = 0, translateX: f = 0, translateY: O = 0, width: m = 0 } = this, v = p(this.paddingLeft, C), y = M ?? (this.rotation || 0), z = { width: m, height: g, x: f + this.bBox.x - v, y: O + this.bBox.y - C + this.baselineOffset };\n return y && (z = this.getRotatedBox(z, y)), z;\n }\n getCrispAdjust() {\n return (this.renderer.styledMode && this.box ? this.box.strokeWidth() : this["stroke-width"] ? parseInt(this["stroke-width"], 10) : 0) % 2 / 2;\n }\n heightSetter(b) {\n this.heightSetting = b, this.doUpdate = !0;\n }\n afterSetters() {\n super.afterSetters(), this.doUpdate && (this.updateBoxSize(), this.doUpdate = !1);\n }\n onAdd() {\n this.text.add(this), this.attr({ text: p(this.textStr, ""), x: this.x || 0, y: this.y || 0 }), this.box && a(this.anchorX) && this.attr({ anchorX: this.anchorX, anchorY: this.anchorY });\n }\n paddingSetter(b, M) {\n l(b) ? b !== this[M] && (this[M] = b, this.updateTextPadding()) : this[M] = void 0;\n }\n rSetter(b, M) {\n this.boxAttr(M, b);\n }\n strokeSetter(b, M) {\n this.stroke = b, this.boxAttr(M, b);\n }\n "stroke-widthSetter"(b, M) {\n b && (this.needsBox = !0), this["stroke-width"] = b, this.boxAttr(M, b);\n }\n "text-alignSetter"(b) {\n this.textAlign = b;\n }\n textSetter(b) {\n b !== void 0 && this.text.attr({ text: b }), this.updateTextPadding(), this.reAlign();\n }\n updateBoxSize() {\n let b, M = this.text, C = {}, g = this.padding, f = this.bBox = (!l(this.widthSetting) || !l(this.heightSetting) || this.textAlign) && a(M.textStr) ? M.getBBox(void 0, 0) : u.emptyBBox;\n this.width = this.getPaddedWidth(), this.height = (this.heightSetting || f.height || 0) + 2 * g;\n let O = this.renderer.fontMetrics(M);\n if (this.baselineOffset = g + Math.min((this.text.firstLineMetrics || O).b, f.height || 1 / 0), this.heightSetting && (this.baselineOffset += (this.heightSetting - O.h) / 2), this.needsBox && !M.textPath) {\n if (!this.box) {\n let m = this.box = this.symbolKey ? this.renderer.symbol(this.symbolKey) : this.renderer.rect();\n m.addClass((this.className === "button" ? "" : "highcharts-label-box") + (this.className ? " highcharts-" + this.className + "-box" : "")), m.add(this);\n }\n b = this.getCrispAdjust(), C.x = b, C.y = (this.baseline ? -this.baselineOffset : 0) + b, C.width = Math.round(this.width), C.height = Math.round(this.height), this.box.attr(s(C, this.deferredAttr)), this.deferredAttr = {};\n }\n }\n updateTextPadding() {\n let b = this.text;\n if (!b.textPath) {\n this.updateBoxSize();\n let M = this.baseline ? 0 : this.baselineOffset, C = p(this.paddingLeft, this.padding);\n a(this.widthSetting) && this.bBox && (this.textAlign === "center" || this.textAlign === "right") && (C += { center: 0.5, right: 1 }[this.textAlign] * (this.widthSetting - this.bBox.width)), (C !== b.x || M !== b.y) && (b.attr("x", C), b.hasBoxWidthChanged && (this.bBox = b.getBBox(!0)), M !== void 0 && b.attr("y", M)), b.x = C, b.y = M;\n }\n }\n widthSetter(b) {\n this.widthSetting = l(b) ? b : void 0, this.doUpdate = !0;\n }\n getPaddedWidth() {\n let b = this.padding, M = p(this.paddingLeft, b), C = p(this.paddingRight, b);\n return (this.widthSetting || this.bBox.width || 0) + M + C;\n }\n xSetter(b) {\n this.x = b, this.alignFactor && (b -= this.alignFactor * this.getPaddedWidth(), this["forceAnimate:x"] = !0), this.xSetting = Math.round(b), this.attr("translateX", this.xSetting);\n }\n ySetter(b) {\n this.ySetting = this.y = Math.round(b), this.attr("translateY", this.ySetting);\n }\n }\n return u.emptyBBox = { width: 0, height: 0, x: 0, y: 0 }, u.textProps = ["color", "direction", "fontFamily", "fontSize", "fontStyle", "fontWeight", "lineHeight", "textAlign", "textDecoration", "textOutline", "textOverflow", "whiteSpace", "width"], u;\n }), n(r, "Core/Renderer/SVG/Symbols.js", [r["Core/Utilities.js"]], function(o) {\n let { defined: i, isNumber: a, pick: s } = o;\n function l(d, u, h, b, M) {\n let C = [];\n if (M) {\n let g = M.start || 0, f = s(M.r, h), O = s(M.r, b || h), m = 2e-4 / (M.borderRadius ? 1 : Math.max(f, 1)), v = Math.abs((M.end || 0) - g - 2 * Math.PI) < m, y = (M.end || 0) - (v ? m : 0), z = M.innerR, N = s(M.open, v), W = Math.cos(g), T = Math.sin(g), x = Math.cos(y), E = Math.sin(y), L = s(M.longArc, y - g - Math.PI < m ? 0 : 1), w = ["A", f, O, 0, L, s(M.clockwise, 1), d + f * x, u + O * E];\n w.params = { start: g, end: y, cx: d, cy: u }, C.push(["M", d + f * W, u + O * T], w), i(z) && ((w = ["A", z, z, 0, L, i(M.clockwise) ? 1 - M.clockwise : 0, d + z * W, u + z * T]).params = { start: y, end: g, cx: d, cy: u }, C.push(N ? ["M", d + z * x, u + z * E] : ["L", d + z * x, u + z * E], w)), N || C.push(["Z"]);\n }\n return C;\n }\n function c(d, u, h, b, M) {\n return M && M.r ? p(d, u, h, b, M) : [["M", d, u], ["L", d + h, u], ["L", d + h, u + b], ["L", d, u + b], ["Z"]];\n }\n function p(d, u, h, b, M) {\n let C = (M == null ? void 0 : M.r) || 0;\n return [["M", d + C, u], ["L", d + h - C, u], ["A", C, C, 0, 0, 1, d + h, u + C], ["L", d + h, u + b - C], ["A", C, C, 0, 0, 1, d + h - C, u + b], ["L", d + C, u + b], ["A", C, C, 0, 0, 1, d, u + b - C], ["L", d, u + C], ["A", C, C, 0, 0, 1, d + C, u], ["Z"]];\n }\n return { arc: l, callout: function(d, u, h, b, M) {\n let C = Math.min(M && M.r || 0, h, b), g = C + 6, f = M && M.anchorX, O = M && M.anchorY || 0, m = p(d, u, h, b, { r: C });\n if (!a(f) || f < h && f > 0 && O < b && O > 0)\n return m;\n if (d + f > h - g)\n if (O > u + g && O < u + b - g)\n m.splice(3, 1, ["L", d + h, O - 6], ["L", d + h + 6, O], ["L", d + h, O + 6], ["L", d + h, u + b - C]);\n else if (f < h) {\n let v = O < u + g, y = v ? u : u + b;\n m.splice(v ? 2 : 5, 0, ["L", f, O], ["L", d + h - C, y]);\n } else\n m.splice(3, 1, ["L", d + h, b / 2], ["L", f, O], ["L", d + h, b / 2], ["L", d + h, u + b - C]);\n else if (d + f < g)\n if (O > u + g && O < u + b - g)\n m.splice(7, 1, ["L", d, O + 6], ["L", d - 6, O], ["L", d, O - 6], ["L", d, u + C]);\n else if (f > 0) {\n let v = O < u + g, y = v ? u : u + b;\n m.splice(v ? 1 : 6, 0, ["L", f, O], ["L", d + C, y]);\n } else\n m.splice(7, 1, ["L", d, b / 2], ["L", f, O], ["L", d, b / 2], ["L", d, u + C]);\n else\n O > b && f < h - g ? m.splice(5, 1, ["L", f + 6, u + b], ["L", f, u + b + 6], ["L", f - 6, u + b], ["L", d + C, u + b]) : O < 0 && f > g && m.splice(1, 1, ["L", f - 6, u], ["L", f, u - 6], ["L", f + 6, u], ["L", h - C, u]);\n return m;\n }, circle: function(d, u, h, b) {\n return l(d + h / 2, u + b / 2, h / 2, b / 2, { start: 0.5 * Math.PI, end: 2.5 * Math.PI, open: !1 });\n }, diamond: function(d, u, h, b) {\n return [["M", d + h / 2, u], ["L", d + h, u + b / 2], ["L", d + h / 2, u + b], ["L", d, u + b / 2], ["Z"]];\n }, rect: c, roundedRect: p, square: c, triangle: function(d, u, h, b) {\n return [["M", d + h / 2, u], ["L", d + h, u + b], ["L", d, u + b], ["Z"]];\n }, "triangle-down": function(d, u, h, b) {\n return [["M", d, u], ["L", d + h, u], ["L", d + h / 2, u + b], ["Z"]];\n } };\n }), n(r, "Core/Renderer/SVG/TextBuilder.js", [r["Core/Renderer/HTML/AST.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { doc: s, SVG_NS: l, win: c } = i, { attr: p, extend: d, fireEvent: u, isString: h, objectEach: b, pick: M } = a;\n return class {\n constructor(C) {\n let g = C.styles;\n this.renderer = C.renderer, this.svgElement = C, this.width = C.textWidth, this.textLineHeight = g && g.lineHeight, this.textOutline = g && g.textOutline, this.ellipsis = !!(g && g.textOverflow === "ellipsis"), this.noWrap = !!(g && g.whiteSpace === "nowrap");\n }\n buildSVG() {\n let C = this.svgElement, g = C.element, f = C.renderer, O = M(C.textStr, "").toString(), m = O.indexOf("<") !== -1, v = g.childNodes, y = !C.added && f.box, z = [O, this.ellipsis, this.noWrap, this.textLineHeight, this.textOutline, C.getStyle("font-size"), this.width].join(",");\n if (z !== C.textCache) {\n C.textCache = z, delete C.actualWidth;\n for (let N = v.length; N--; )\n g.removeChild(v[N]);\n if (m || this.ellipsis || this.width || C.textPath || O.indexOf(" ") !== -1 && (!this.noWrap || //g.test(O))) {\n if (O !== "") {\n y && y.appendChild(g);\n let N = new o(O);\n this.modifyTree(N.nodes), N.addToDOM(g), this.modifyDOM(), this.ellipsis && (g.textContent || "").indexOf("…") !== -1 && C.attr("title", this.unescapeEntities(C.textStr || "", ["<", ">"])), y && y.removeChild(g);\n }\n } else\n g.appendChild(s.createTextNode(this.unescapeEntities(O)));\n h(this.textOutline) && C.applyTextOutline && C.applyTextOutline(this.textOutline);\n }\n }\n modifyDOM() {\n let C, g = this.svgElement, f = p(g.element, "x");\n for (g.firstLineMetrics = void 0; (C = g.element.firstChild) && /^[\\s\\u200B]*$/.test(C.textContent || " "); )\n g.element.removeChild(C);\n [].forEach.call(g.element.querySelectorAll("tspan.highcharts-br"), (y, z) => {\n y.nextSibling && y.previousSibling && (z === 0 && y.previousSibling.nodeType === 1 && (g.firstLineMetrics = g.renderer.fontMetrics(y.previousSibling)), p(y, { dy: this.getLineHeight(y.nextSibling), x: f }));\n });\n let O = this.width || 0;\n if (!O)\n return;\n let m = (y, z) => {\n let N = y.textContent || "", W = N.replace(/([^\\^])-/g, "$1- ").split(" "), T = !this.noWrap && (W.length > 1 || g.element.childNodes.length > 1), x = this.getLineHeight(z), E = 0, L = g.actualWidth;\n if (this.ellipsis)\n N && this.truncate(y, N, void 0, 0, Math.max(0, O - 0.8 * x), (w, q) => w.substring(0, q) + "…");\n else if (T) {\n let w = [], q = [];\n for (; z.firstChild && z.firstChild !== y; )\n q.push(z.firstChild), z.removeChild(z.firstChild);\n for (; W.length; )\n W.length && !this.noWrap && E > 0 && (w.push(y.textContent || ""), y.textContent = W.join(" ").replace(/- /g, "-")), this.truncate(y, void 0, W, E === 0 && L || 0, O, (S, B) => W.slice(0, B).join(" ").replace(/- /g, "-")), L = g.actualWidth, E++;\n q.forEach((S) => {\n z.insertBefore(S, y);\n }), w.forEach((S) => {\n z.insertBefore(s.createTextNode(S), y);\n let B = s.createElementNS(l, "tspan");\n B.textContent = "​", p(B, { dy: x, x: f }), z.insertBefore(B, y);\n });\n }\n }, v = (y) => {\n [].slice.call(y.childNodes).forEach((z) => {\n z.nodeType === c.Node.TEXT_NODE ? m(z, y) : (z.className.baseVal.indexOf("highcharts-br") !== -1 && (g.actualWidth = 0), v(z));\n });\n };\n v(g.element);\n }\n getLineHeight(C) {\n let g = C.nodeType === c.Node.TEXT_NODE ? C.parentElement : C;\n return this.textLineHeight ? parseInt(this.textLineHeight.toString(), 10) : this.renderer.fontMetrics(g || this.svgElement.element).h;\n }\n modifyTree(C) {\n let g = (f, O) => {\n let { attributes: m = {}, children: v, style: y = {}, tagName: z } = f, N = this.renderer.styledMode;\n if (z === "b" || z === "strong" ? N ? m.class = "highcharts-strong" : y.fontWeight = "bold" : (z === "i" || z === "em") && (N ? m.class = "highcharts-emphasized" : y.fontStyle = "italic"), y && y.color && (y.fill = y.color), z === "br") {\n m.class = "highcharts-br", f.textContent = "​";\n let W = C[O + 1];\n W && W.textContent && (W.textContent = W.textContent.replace(/^ +/gm, ""));\n } else\n z === "a" && v && v.some((W) => W.tagName === "#text") && (f.children = [{ children: v, tagName: "tspan" }]);\n z !== "#text" && z !== "a" && (f.tagName = "tspan"), d(f, { attributes: m, style: y }), v && v.filter((W) => W.tagName !== "#text").forEach(g);\n };\n C.forEach(g), u(this.svgElement, "afterModifyTree", { nodes: C });\n }\n truncate(C, g, f, O, m, v) {\n let y, z, N = this.svgElement, { rotation: W } = N, T = [], x = f ? 1 : 0, E = (g || f || "").length, L = E, w = function(q, S) {\n let B = S || q, I = C.parentNode;\n if (I && T[B] === void 0 && I.getSubStringLength)\n try {\n T[B] = O + I.getSubStringLength(0, f ? B + 1 : B);\n } catch {\n }\n return T[B];\n };\n if (N.rotation = 0, O + (z = w(C.textContent.length)) > m) {\n for (; x <= E; )\n L = Math.ceil((x + E) / 2), f && (y = v(f, L)), z = w(L, y && y.length - 1), x === E ? x = E + 1 : z > m ? E = L - 1 : x = L;\n E === 0 ? C.textContent = "" : g && E === g.length - 1 || (C.textContent = y || v(g || f, L));\n }\n f && f.splice(0, L), N.actualWidth = z, N.rotation = W;\n }\n unescapeEntities(C, g) {\n return b(this.renderer.escapes, function(f, O) {\n g && g.indexOf(f) !== -1 || (C = C.toString().replace(RegExp(f, "g"), O));\n }), C;\n }\n };\n }), n(r, "Core/Renderer/SVG/SVGRenderer.js", [r["Core/Renderer/HTML/AST.js"], r["Core/Defaults.js"], r["Core/Color/Color.js"], r["Core/Globals.js"], r["Core/Renderer/RendererRegistry.js"], r["Core/Renderer/SVG/SVGElement.js"], r["Core/Renderer/SVG/SVGLabel.js"], r["Core/Renderer/SVG/Symbols.js"], r["Core/Renderer/SVG/TextBuilder.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p, d, u, h) {\n let b, { defaultOptions: M } = i, { charts: C, deg2rad: g, doc: f, isFirefox: O, isMS: m, isWebKit: v, noop: y, SVG_NS: z, symbolSizes: N, win: W } = s, { addEvent: T, attr: x, createElement: E, crisp: L, css: w, defined: q, destroyObjectProperties: S, extend: B, isArray: I, isNumber: P, isObject: k, isString: K, merge: $, pick: j, pInt: r1, replaceNested: a1, uniqueKey: _ } = h;\n class Y {\n constructor(H, G, J, F, V, Q, Z) {\n let t1, n1, U = this.createElement("svg").attr({ version: "1.1", class: "highcharts-root" }), e1 = U.element;\n Z || U.css(this.getStyle(F || {})), H.appendChild(e1), x(H, "dir", "ltr"), H.innerHTML.indexOf("xmlns") === -1 && x(e1, "xmlns", this.SVG_NS), this.box = e1, this.boxWrapper = U, this.alignedObjects = [], this.url = this.getReferenceURL(), this.createElement("desc").add().element.appendChild(f.createTextNode("Created with Highcharts 11.4.8")), this.defs = this.createElement("defs").add(), this.allowHTML = Q, this.forExport = V, this.styledMode = Z, this.gradients = {}, this.cache = {}, this.cacheKeys = [], this.imgCount = 0, this.rootFontSize = U.getStyle("font-size"), this.setSize(G, J, !1), O && H.getBoundingClientRect && ((t1 = function() {\n w(H, { left: 0, top: 0 }), n1 = H.getBoundingClientRect(), w(H, { left: Math.ceil(n1.left) - n1.left + "px", top: Math.ceil(n1.top) - n1.top + "px" });\n })(), this.unSubPixelFix = T(W, "resize", t1));\n }\n definition(H) {\n return new o([H]).addToDOM(this.defs.element);\n }\n getReferenceURL() {\n if ((O || v) && f.getElementsByTagName("base").length) {\n if (!q(b)) {\n let H = _(), G = new o([{ tagName: "svg", attributes: { width: 8, height: 8 }, children: [{ tagName: "defs", children: [{ tagName: "clipPath", attributes: { id: H }, children: [{ tagName: "rect", attributes: { width: 4, height: 4 } }] }] }, { tagName: "rect", attributes: { id: "hitme", width: 8, height: 8, "clip-path": `url(#${H})`, fill: "rgba(0,0,0,0.001)" } }] }]).addToDOM(f.body);\n w(G, { position: "fixed", top: 0, left: 0, zIndex: 9e5 });\n let J = f.elementFromPoint(6, 6);\n b = (J && J.id) === "hitme", f.body.removeChild(G);\n }\n if (b)\n return a1(W.location.href.split("#")[0], [/<[^>]*>/g, ""], [/([\\(\'\\)])/g, "\\\\$1"], [/ /g, "%20"]);\n }\n return "";\n }\n getStyle(H) {\n return this.style = B({ fontFamily: "Helvetica, Arial, sans-serif", fontSize: "1rem" }, H), this.style;\n }\n setStyle(H) {\n this.boxWrapper.css(this.getStyle(H));\n }\n isHidden() {\n return !this.boxWrapper.getBBox().width;\n }\n destroy() {\n let H = this.defs;\n return this.box = null, this.boxWrapper = this.boxWrapper.destroy(), S(this.gradients || {}), this.gradients = null, this.defs = H.destroy(), this.unSubPixelFix && this.unSubPixelFix(), this.alignedObjects = null, null;\n }\n createElement(H) {\n return new this.Element(this, H);\n }\n getRadialAttr(H, G) {\n return { cx: H[0] - H[2] / 2 + (G.cx || 0) * H[2], cy: H[1] - H[2] / 2 + (G.cy || 0) * H[2], r: (G.r || 0) * H[2] };\n }\n shadowDefinition(H) {\n let G = [`highcharts-drop-shadow-${this.chartIndex}`, ...Object.keys(H).map((F) => `${F}-${H[F]}`)].join("-").toLowerCase().replace(/[^a-z\\d\\-]/g, ""), J = $({ color: "#000000", offsetX: 1, offsetY: 1, opacity: 0.15, width: 5 }, H);\n return this.defs.element.querySelector(`#${G}`) || this.definition({ tagName: "filter", attributes: { id: G, filterUnits: J.filterUnits }, children: this.getShadowFilterContent(J) }), G;\n }\n getShadowFilterContent(H) {\n return [{ tagName: "feDropShadow", attributes: { dx: H.offsetX, dy: H.offsetY, "flood-color": H.color, "flood-opacity": Math.min(5 * H.opacity, 1), stdDeviation: H.width / 2 } }];\n }\n buildText(H) {\n new u(H).buildSVG();\n }\n getContrast(H) {\n let G = a.parse(H).rgba.map((F) => {\n let V = F / 255;\n return V <= 0.03928 ? V / 12.92 : Math.pow((V + 0.055) / 1.055, 2.4);\n }), J = 0.2126 * G[0] + 0.7152 * G[1] + 0.0722 * G[2];\n return 1.05 / (J + 0.05) > (J + 0.05) / 0.05 ? "#FFFFFF" : "#000000";\n }\n button(H, G, J, F, V = {}, Q, Z, t1, n1, U) {\n let e1 = this.label(H, G, J, n1, void 0, void 0, U, void 0, "button"), o1 = this.styledMode, u1 = arguments, M1 = 0;\n V = $(M.global.buttonTheme, V), o1 && (delete V.fill, delete V.stroke, delete V["stroke-width"]);\n let A1 = V.states || {}, l1 = V.style || {};\n delete V.states, delete V.style;\n let b1 = [o.filterUserAttributes(V)], h1 = [l1];\n return o1 || ["hover", "select", "disabled"].forEach((z1, O1) => {\n b1.push($(b1[0], o.filterUserAttributes(u1[O1 + 5] || A1[z1] || {}))), h1.push(b1[O1 + 1].style), delete b1[O1 + 1].style;\n }), T(e1.element, m ? "mouseover" : "mouseenter", function() {\n M1 !== 3 && e1.setState(1);\n }), T(e1.element, m ? "mouseout" : "mouseleave", function() {\n M1 !== 3 && e1.setState(M1);\n }), e1.setState = (z1 = 0) => {\n if (z1 !== 1 && (e1.state = M1 = z1), e1.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][z1]), !o1) {\n e1.attr(b1[z1]);\n let O1 = h1[z1];\n k(O1) && e1.css(O1);\n }\n }, e1.attr(b1[0]), !o1 && (e1.css(B({ cursor: "default" }, l1)), U && e1.text.css({ pointerEvents: "none" })), e1.on("touchstart", (z1) => z1.stopPropagation()).on("click", function(z1) {\n M1 !== 3 && F.call(e1, z1);\n });\n }\n crispLine(H, G) {\n let [J, F] = H;\n return q(J[1]) && J[1] === F[1] && (J[1] = F[1] = L(J[1], G)), q(J[2]) && J[2] === F[2] && (J[2] = F[2] = L(J[2], G)), H;\n }\n path(H) {\n let G = this.styledMode ? {} : { fill: "none" };\n return I(H) ? G.d = H : k(H) && B(G, H), this.createElement("path").attr(G);\n }\n circle(H, G, J) {\n let F = k(H) ? H : H === void 0 ? {} : { x: H, y: G, r: J }, V = this.createElement("circle");\n return V.xSetter = V.ySetter = function(Q, Z, t1) {\n t1.setAttribute("c" + Z, Q);\n }, V.attr(F);\n }\n arc(H, G, J, F, V, Q) {\n let Z;\n k(H) ? (G = (Z = H).y, J = Z.r, F = Z.innerR, V = Z.start, Q = Z.end, H = Z.x) : Z = { innerR: F, start: V, end: Q };\n let t1 = this.symbol("arc", H, G, J, J, Z);\n return t1.r = J, t1;\n }\n rect(H, G, J, F, V, Q) {\n let Z = k(H) ? H : H === void 0 ? {} : { x: H, y: G, r: V, width: Math.max(J || 0, 0), height: Math.max(F || 0, 0) }, t1 = this.createElement("rect");\n return this.styledMode || (Q !== void 0 && (Z["stroke-width"] = Q, B(Z, t1.crisp(Z))), Z.fill = "none"), t1.rSetter = function(n1, U, e1) {\n t1.r = n1, x(e1, { rx: n1, ry: n1 });\n }, t1.rGetter = function() {\n return t1.r || 0;\n }, t1.attr(Z);\n }\n roundedRect(H) {\n return this.symbol("roundedRect").attr(H);\n }\n setSize(H, G, J) {\n this.width = H, this.height = G, this.boxWrapper.animate({ width: H, height: G }, { step: function() {\n this.attr({ viewBox: "0 0 " + this.attr("width") + " " + this.attr("height") });\n }, duration: j(J, !0) ? void 0 : 0 }), this.alignElements();\n }\n g(H) {\n let G = this.createElement("g");\n return H ? G.attr({ class: "highcharts-" + H }) : G;\n }\n image(H, G, J, F, V, Q) {\n let Z = { preserveAspectRatio: "none" };\n P(G) && (Z.x = G), P(J) && (Z.y = J), P(F) && (Z.width = F), P(V) && (Z.height = V);\n let t1 = this.createElement("image").attr(Z), n1 = function(U) {\n t1.attr({ href: H }), Q.call(t1, U);\n };\n if (Q) {\n t1.attr({ href: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" });\n let U = new W.Image();\n T(U, "load", n1), U.src = H, U.complete && n1({});\n } else\n t1.attr({ href: H });\n return t1;\n }\n symbol(H, G, J, F, V, Q) {\n let Z, t1, n1, U, e1 = this, o1 = /^url\\((.*?)\\)$/, u1 = o1.test(H), M1 = !u1 && (this.symbols[H] ? H : "circle"), A1 = M1 && this.symbols[M1];\n if (A1)\n typeof G == "number" && (t1 = A1.call(this.symbols, G || 0, J || 0, F || 0, V || 0, Q)), Z = this.path(t1), e1.styledMode || Z.attr("fill", "none"), B(Z, { symbolName: M1 || void 0, x: G, y: J, width: F, height: V }), Q && B(Z, Q);\n else if (u1) {\n n1 = H.match(o1)[1];\n let l1 = Z = this.image(n1);\n l1.imgwidth = j(Q && Q.width, N[n1] && N[n1].width), l1.imgheight = j(Q && Q.height, N[n1] && N[n1].height), U = (b1) => b1.attr({ width: b1.width, height: b1.height }), ["width", "height"].forEach((b1) => {\n l1[`${b1}Setter`] = function(h1, z1) {\n this[z1] = h1;\n let { alignByTranslate: O1, element: m1, width: L1, height: y1, imgwidth: B1, imgheight: T1 } = this, F1 = z1 === "width" ? B1 : T1, X1 = 1;\n Q && Q.backgroundSize === "within" && L1 && y1 && B1 && T1 ? (X1 = Math.min(L1 / B1, y1 / T1), x(m1, { width: Math.round(B1 * X1), height: Math.round(T1 * X1) })) : m1 && F1 && m1.setAttribute(z1, F1), !O1 && B1 && T1 && this.translate(((L1 || 0) - B1 * X1) / 2, ((y1 || 0) - T1 * X1) / 2);\n };\n }), q(G) && l1.attr({ x: G, y: J }), l1.isImg = !0, l1.symbolUrl = H, q(l1.imgwidth) && q(l1.imgheight) ? U(l1) : (l1.attr({ width: 0, height: 0 }), E("img", { onload: function() {\n let b1 = C[e1.chartIndex];\n this.width === 0 && (w(this, { position: "absolute", top: "-999em" }), f.body.appendChild(this)), N[n1] = { width: this.width, height: this.height }, l1.imgwidth = this.width, l1.imgheight = this.height, l1.element && U(l1), this.parentNode && this.parentNode.removeChild(this), e1.imgCount--, e1.imgCount || !b1 || b1.hasLoaded || b1.onload();\n }, src: n1 }), this.imgCount++);\n }\n return Z;\n }\n clipRect(H, G, J, F) {\n return this.rect(H, G, J, F, 0);\n }\n text(H, G, J, F) {\n let V = {};\n if (F && (this.allowHTML || !this.forExport))\n return this.html(H, G, J);\n V.x = Math.round(G || 0), J && (V.y = Math.round(J)), q(H) && (V.text = H);\n let Q = this.createElement("text").attr(V);\n return F && (!this.forExport || this.allowHTML) || (Q.xSetter = function(Z, t1, n1) {\n let U = n1.getElementsByTagName("tspan"), e1 = n1.getAttribute(t1);\n for (let o1 = 0, u1; o1 < U.length; o1++)\n (u1 = U[o1]).getAttribute(t1) === e1 && u1.setAttribute(t1, Z);\n n1.setAttribute(t1, Z);\n }), Q;\n }\n fontMetrics(H) {\n let G = r1(c.prototype.getStyle.call(H, "font-size") || 0), J = G < 24 ? G + 3 : Math.round(1.2 * G), F = Math.round(0.8 * J);\n return { h: J, b: F, f: G };\n }\n rotCorr(H, G, J) {\n let F = H;\n return G && J && (F = Math.max(F * Math.cos(G * g), 4)), { x: -H / 3 * Math.sin(G * g), y: F };\n }\n pathToSegments(H) {\n let G = [], J = [], F = { A: 8, C: 7, H: 2, L: 3, M: 3, Q: 5, S: 5, T: 3, V: 2 };\n for (let V = 0; V < H.length; V++)\n K(J[0]) && P(H[V]) && J.length === F[J[0].toUpperCase()] && H.splice(V, 0, J[0].replace("M", "L").replace("m", "l")), typeof H[V] == "string" && (J.length && G.push(J.slice(0)), J.length = 0), J.push(H[V]);\n return G.push(J.slice(0)), G;\n }\n label(H, G, J, F, V, Q, Z, t1, n1) {\n return new p(this, H, G, J, F, V, Q, Z, t1, n1);\n }\n alignElements() {\n this.alignedObjects.forEach((H) => H.align());\n }\n }\n return B(Y.prototype, { Element: c, SVG_NS: z, escapes: { "&": "&", "<": "<", ">": ">", "\'": "'", \'"\': """ }, symbols: d, draw: y }), l.registerRendererType("svg", Y, !0), Y;\n }), n(r, "Core/Renderer/HTML/HTMLElement.js", [r["Core/Renderer/HTML/AST.js"], r["Core/Globals.js"], r["Core/Renderer/SVG/SVGElement.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { composed: l } = i, { attr: c, css: p, createElement: d, defined: u, extend: h, pInt: b, pushUnique: M } = s;\n function C(m, v, y) {\n var N;\n let z = ((N = this.div) == null ? void 0 : N.style) || y.style;\n a.prototype[`${v}Setter`].call(this, m, v, y), z && (z[v] = m);\n }\n let g = (m, v) => {\n var y;\n if (!m.div) {\n let z = c(m.element, "class"), N = m.css, W = d("div", z ? { className: z } : void 0, { position: "absolute", left: `${m.translateX || 0}px`, top: `${m.translateY || 0}px`, ...m.styles, display: m.display, opacity: m.opacity, visibility: m.visibility }, ((y = m.parentGroup) == null ? void 0 : y.div) || v);\n m.classSetter = (T, x, E) => {\n E.setAttribute("class", T), W.className = T;\n }, m.translateXSetter = m.translateYSetter = (T, x) => {\n m[x] = T, W.style[x === "translateX" ? "left" : "top"] = `${T}px`, m.doTransform = !0;\n }, m.opacitySetter = m.visibilitySetter = C, m.css = (T) => (N.call(m, T), T.cursor && (W.style.cursor = T.cursor), T.pointerEvents && (W.style.pointerEvents = T.pointerEvents), m), m.on = function() {\n return a.prototype.on.apply({ element: W, onEvents: m.onEvents }, arguments), m;\n }, m.div = W;\n }\n return m.div;\n };\n class f extends a {\n static compose(v) {\n M(l, this.compose) && (v.prototype.html = function(y, z, N) {\n return new f(this, "span").attr({ text: y, x: Math.round(z), y: Math.round(N) });\n });\n }\n constructor(v, y) {\n super(v, y), this.css({ position: "absolute", ...v.styledMode ? {} : { fontFamily: v.style.fontFamily, fontSize: v.style.fontSize } }), this.element.style.whiteSpace = "nowrap";\n }\n getSpanCorrection(v, y, z) {\n this.xCorr = -v * z, this.yCorr = -y;\n }\n css(v) {\n let y, { element: z } = this, N = z.tagName === "SPAN" && v && "width" in v, W = N && v.width;\n return N && (delete v.width, this.textWidth = b(W) || void 0, y = !0), (v == null ? void 0 : v.textOverflow) === "ellipsis" && (v.whiteSpace = "nowrap", v.overflow = "hidden"), h(this.styles, v), p(z, v), y && this.updateTransform(), this;\n }\n htmlGetBBox() {\n let { element: v } = this;\n return { x: v.offsetLeft, y: v.offsetTop, width: v.offsetWidth, height: v.offsetHeight };\n }\n updateTransform() {\n var P;\n if (!this.added) {\n this.alignOnAdd = !0;\n return;\n }\n let { element: v, renderer: y, rotation: z, rotationOriginX: N, rotationOriginY: W, styles: T, textAlign: x = "left", textWidth: E, translateX: L = 0, translateY: w = 0, x: q = 0, y: S = 0 } = this, B = { left: 0, center: 0.5, right: 1 }[x], I = T.whiteSpace;\n if (p(v, { marginLeft: `${L}px`, marginTop: `${w}px` }), v.tagName === "SPAN") {\n let k = [z, x, v.innerHTML, E, this.textAlign].join(","), K = -(((P = this.parentGroup) == null ? void 0 : P.padding) * 1) || 0, $, j = !1;\n if (E !== this.oldTextWidth) {\n let D = this.textPxLength ? this.textPxLength : (p(v, { width: "", whiteSpace: I || "nowrap" }), v.offsetWidth), H = E || 0;\n (H > this.oldTextWidth || D > H) && (/[ \\-]/.test(v.textContent || v.innerText) || v.style.textOverflow === "ellipsis") && (p(v, { width: D > H || z ? E + "px" : "auto", display: "block", whiteSpace: I || "normal" }), this.oldTextWidth = E, j = !0);\n }\n this.hasBoxWidthChanged = j, k !== this.cTT && ($ = y.fontMetrics(v).b, u(z) && (z !== (this.oldRotation || 0) || x !== this.oldAlign) && this.setSpanRotation(z, K, K), this.getSpanCorrection(!u(z) && this.textPxLength || v.offsetWidth, $, B));\n let { xCorr: r1 = 0, yCorr: a1 = 0 } = this, _ = (N ?? q) - r1 - q - K, Y = (W ?? S) - a1 - S - K;\n p(v, { left: `${q + r1}px`, top: `${S + a1}px`, transformOrigin: `${_}px ${Y}px` }), this.cTT = k, this.oldRotation = z, this.oldAlign = x;\n }\n }\n setSpanRotation(v, y, z) {\n p(this.element, { transform: `rotate(${v}deg)`, transformOrigin: `${y}% ${z}px` });\n }\n add(v) {\n let y, z = this.renderer.box.parentNode, N = [];\n if (this.parentGroup = v, v && !(y = v.div)) {\n let W = v;\n for (; W; )\n N.push(W), W = W.parentGroup;\n for (let T of N.reverse())\n y = g(T, z);\n }\n return (y || z).appendChild(this.element), this.added = !0, this.alignOnAdd && this.updateTransform(), this;\n }\n textSetter(v) {\n v !== this.textStr && (delete this.bBox, delete this.oldTextWidth, o.setElementHTML(this.element, v ?? ""), this.textStr = v, this.doTransform = !0);\n }\n alignSetter(v) {\n this.alignValue = this.textAlign = v, this.doTransform = !0;\n }\n xSetter(v, y) {\n this[y] = v, this.doTransform = !0;\n }\n }\n let O = f.prototype;\n return O.visibilitySetter = O.opacitySetter = C, O.ySetter = O.rotationSetter = O.rotationOriginXSetter = O.rotationOriginYSetter = O.xSetter, f;\n }), n(r, "Core/Axis/AxisDefaults.js", [], function() {\n var o, i;\n return (i = o || (o = {})).xAxis = { alignTicks: !0, allowDecimals: void 0, panningEnabled: !0, zIndex: 2, zoomEnabled: !0, dateTimeLabelFormats: { millisecond: { main: "%H:%M:%S.%L", range: !1 }, second: { main: "%H:%M:%S", range: !1 }, minute: { main: "%H:%M", range: !1 }, hour: { main: "%H:%M", range: !1 }, day: { main: "%e %b" }, week: { main: "%e %b" }, month: { main: "%b \'%y" }, year: { main: "%Y" } }, endOnTick: !1, gridLineDashStyle: "Solid", gridZIndex: 1, labels: { autoRotationLimit: 80, distance: 15, enabled: !0, indentation: 10, overflow: "justify", reserveSpace: void 0, rotation: void 0, staggerLines: 0, step: 0, useHTML: !1, zIndex: 7, style: { color: "#333333", cursor: "default", fontSize: "0.8em" } }, maxPadding: 0.01, minorGridLineDashStyle: "Solid", minorTickLength: 2, minorTickPosition: "outside", minorTicksPerMajor: 5, minPadding: 0.01, offset: void 0, reversed: void 0, reversedStacks: !1, showEmpty: !0, showFirstLabel: !0, showLastLabel: !0, startOfWeek: 1, startOnTick: !1, tickLength: 10, tickPixelInterval: 100, tickmarkPlacement: "between", tickPosition: "outside", title: { align: "middle", useHTML: !1, x: 0, y: 0, style: { color: "#666666", fontSize: "0.8em" } }, visible: !0, minorGridLineColor: "#f2f2f2", minorGridLineWidth: 1, minorTickColor: "#999999", lineColor: "#333333", lineWidth: 1, gridLineColor: "#e6e6e6", gridLineWidth: void 0, tickColor: "#333333" }, i.yAxis = { reversedStacks: !0, endOnTick: !0, maxPadding: 0.05, minPadding: 0.05, tickPixelInterval: 72, showLastLabel: !0, labels: { x: void 0 }, startOnTick: !0, title: { text: "Values" }, stackLabels: { animation: {}, allowOverlap: !1, enabled: !1, crop: !0, overflow: "justify", formatter: function() {\n let { numberFormatter: a } = this.axis.chart;\n return a(this.total || 0, -1);\n }, style: { color: "#000000", fontSize: "0.7em", fontWeight: "bold", textOutline: "1px contrast" } }, gridLineWidth: 1, lineWidth: 0 }, o;\n }), n(r, "Core/Foundation.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { addEvent: a, isFunction: s, objectEach: l, removeEvent: c } = o;\n return (i || (i = {})).registerEventOptions = function(p, d) {\n p.eventOptions = p.eventOptions || {}, l(d.events, function(u, h) {\n p.eventOptions[h] !== u && (p.eventOptions[h] && (c(p, h, p.eventOptions[h]), delete p.eventOptions[h]), s(u) && (p.eventOptions[h] = u, a(p, h, u, { order: 0 })));\n });\n }, i;\n }), n(r, "Core/Axis/Tick.js", [r["Core/Templating.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { deg2rad: s } = i, { clamp: l, correctFloat: c, defined: p, destroyObjectProperties: d, extend: u, fireEvent: h, isNumber: b, merge: M, objectEach: C, pick: g } = a;\n return class {\n constructor(f, O, m, v, y) {\n this.isNew = !0, this.isNewLabel = !0, this.axis = f, this.pos = O, this.type = m || "", this.parameters = y || {}, this.tickmarkOffset = this.parameters.tickmarkOffset, this.options = this.parameters.options, h(this, "init"), m || v || this.addLabel();\n }\n addLabel() {\n let f = this, O = f.axis, m = O.options, v = O.chart, y = O.categories, z = O.logarithmic, N = O.names, W = f.pos, T = g(f.options && f.options.labels, m.labels), x = O.tickPositions, E = W === x[0], L = W === x[x.length - 1], w = (!T.step || T.step === 1) && O.tickInterval === 1, q = x.info, S = f.label, B, I, P, k = this.parameters.category || (y ? g(y[W], N[W], W) : W);\n z && b(k) && (k = c(z.lin2log(k))), O.dateTime && (q ? B = (I = v.time.resolveDTLFormat(m.dateTimeLabelFormats[!m.grid && q.higherRanks[W] || q.unitName])).main : b(k) && (B = O.dateTime.getXDateFormat(k, m.dateTimeLabelFormats || {}))), f.isFirst = E, f.isLast = L;\n let K = { axis: O, chart: v, dateTimeLabelFormat: B, isFirst: E, isLast: L, pos: W, tick: f, tickPositionInfo: q, value: k };\n h(this, "labelFormat", K);\n let $ = (a1) => T.formatter ? T.formatter.call(a1, a1) : T.format ? (a1.text = O.defaultLabelFormatter.call(a1), o.format(T.format, a1, v)) : O.defaultLabelFormatter.call(a1), j = $.call(K, K), r1 = I && I.list;\n r1 ? f.shortenLabel = function() {\n for (P = 0; P < r1.length; P++)\n if (u(K, { dateTimeLabelFormat: r1[P] }), S.attr({ text: $.call(K, K) }), S.getBBox().width < O.getSlotWidth(f) - 2 * (T.padding || 0))\n return;\n S.attr({ text: "" });\n } : f.shortenLabel = void 0, w && O._addedPlotLB && f.moveLabel(j, T), p(S) || f.movedLabel ? S && S.textStr !== j && !w && (!S.textWidth || T.style.width || S.styles.width || S.css({ width: null }), S.attr({ text: j }), S.textPxLength = S.getBBox().width) : (f.label = S = f.createLabel(j, T), f.rotation = 0);\n }\n createLabel(f, O, m) {\n let v = this.axis, y = v.chart, z = p(f) && O.enabled ? y.renderer.text(f, m == null ? void 0 : m.x, m == null ? void 0 : m.y, O.useHTML).add(v.labelGroup) : void 0;\n return z && (y.styledMode || z.css(M(O.style)), z.textPxLength = z.getBBox().width), z;\n }\n destroy() {\n d(this, this.axis);\n }\n getPosition(f, O, m, v) {\n let y = this.axis, z = y.chart, N = v && z.oldChartHeight || z.chartHeight, W = { x: f ? c(y.translate(O + m, void 0, void 0, v) + y.transB) : y.left + y.offset + (y.opposite ? (v && z.oldChartWidth || z.chartWidth) - y.right - y.left : 0), y: f ? N - y.bottom + y.offset - (y.opposite ? y.height : 0) : c(N - y.translate(O + m, void 0, void 0, v) - y.transB) };\n return W.y = l(W.y, -1e9, 1e9), h(this, "afterGetPosition", { pos: W }), W;\n }\n getLabelPosition(f, O, m, v, y, z, N, W) {\n let T, x, E = this.axis, L = E.transA, w = E.isLinked && E.linkedParent ? E.linkedParent.reversed : E.reversed, q = E.staggerLines, S = E.tickRotCorr || { x: 0, y: 0 }, B = v || E.reserveSpaceDefault ? 0 : -E.labelOffset * (E.labelAlign === "center" ? 0.5 : 1), I = y.distance, P = {};\n return T = E.side === 0 ? m.rotation ? -I : -m.getBBox().height : E.side === 2 ? S.y + I : Math.cos(m.rotation * s) * (S.y - m.getBBox(!1, 0).height / 2), p(y.y) && (T = E.side === 0 && E.horiz ? y.y + T : y.y), f = f + g(y.x, [0, 1, 0, -1][E.side] * I) + B + S.x - (z && v ? z * L * (w ? -1 : 1) : 0), O = O + T - (z && !v ? z * L * (w ? 1 : -1) : 0), q && (x = N / (W || 1) % q, E.opposite && (x = q - x - 1), O += x * (E.labelOffset / q)), P.x = f, P.y = Math.round(O), h(this, "afterGetLabelPosition", { pos: P, tickmarkOffset: z, index: N }), P;\n }\n getLabelSize() {\n return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0;\n }\n getMarkPath(f, O, m, v, y = !1, z) {\n return z.crispLine([["M", f, O], ["L", f + (y ? 0 : -m), O + (y ? m : 0)]], v);\n }\n handleOverflow(f) {\n let O = this.axis, m = O.options.labels, v = f.x, y = O.chart.chartWidth, z = O.chart.spacing, N = g(O.labelLeft, Math.min(O.pos, z[3])), W = g(O.labelRight, Math.max(O.isRadial ? 0 : O.pos + O.len, y - z[1])), T = this.label, x = this.rotation, E = { left: 0, center: 0.5, right: 1 }[O.labelAlign || T.attr("align")], L = T.getBBox().width, w = O.getSlotWidth(this), q = {}, S = w, B = 1, I, P, k;\n x || m.overflow !== "justify" ? x < 0 && v - E * L < N ? k = Math.round(v / Math.cos(x * s) - N) : x > 0 && v + E * L > W && (k = Math.round((y - v) / Math.cos(x * s))) : (I = v - E * L, P = v + (1 - E) * L, I < N ? S = f.x + S * (1 - E) - N : P > W && (S = W - f.x + S * E, B = -1), (S = Math.min(w, S)) < w && O.labelAlign === "center" && (f.x += B * (w - S - E * (w - Math.min(L, S)))), (L > S || O.autoRotation && (T.styles || {}).width) && (k = S)), k && (this.shortenLabel ? this.shortenLabel() : (q.width = Math.floor(k) + "px", (m.style || {}).textOverflow || (q.textOverflow = "ellipsis"), T.css(q)));\n }\n moveLabel(f, O) {\n let m = this, v = m.label, y = m.axis, z = !1, N;\n v && v.textStr === f ? (m.movedLabel = v, z = !0, delete m.label) : C(y.ticks, function(W) {\n z || W.isNew || W === m || !W.label || W.label.textStr !== f || (m.movedLabel = W.label, z = !0, W.labelPos = m.movedLabel.xy, delete W.label);\n }), !z && (m.labelPos || v) && (N = m.labelPos || v.xy, m.movedLabel = m.createLabel(f, O, N), m.movedLabel && m.movedLabel.attr({ opacity: 0 }));\n }\n render(f, O, m) {\n let v = this.axis, y = v.horiz, z = this.pos, N = g(this.tickmarkOffset, v.tickmarkOffset), W = this.getPosition(y, z, N, O), T = W.x, x = W.y, E = v.pos, L = E + v.len, w = y ? T : x;\n !v.chart.polar && this.isNew && (c(w) < E || w > L) && (m = 0);\n let q = g(m, this.label && this.label.newOpacity, 1);\n m = g(m, 1), this.isActive = !0, this.renderGridLine(O, m), this.renderMark(W, m), this.renderLabel(W, O, q, f), this.isNew = !1, h(this, "afterRender");\n }\n renderGridLine(f, O) {\n let m = this.axis, v = m.options, y = {}, z = this.pos, N = this.type, W = g(this.tickmarkOffset, m.tickmarkOffset), T = m.chart.renderer, x = this.gridLine, E, L = v.gridLineWidth, w = v.gridLineColor, q = v.gridLineDashStyle;\n this.type === "minor" && (L = v.minorGridLineWidth, w = v.minorGridLineColor, q = v.minorGridLineDashStyle), x || (m.chart.styledMode || (y.stroke = w, y["stroke-width"] = L || 0, y.dashstyle = q), N || (y.zIndex = 1), f && (O = 0), this.gridLine = x = T.path().attr(y).addClass("highcharts-" + (N ? N + "-" : "") + "grid-line").add(m.gridGroup)), x && (E = m.getPlotLinePath({ value: z + W, lineWidth: x.strokeWidth(), force: "pass", old: f, acrossPanes: !1 })) && x[f || this.isNew ? "attr" : "animate"]({ d: E, opacity: O });\n }\n renderMark(f, O) {\n let m = this.axis, v = m.options, y = m.chart.renderer, z = this.type, N = m.tickSize(z ? z + "Tick" : "tick"), W = f.x, T = f.y, x = g(v[z !== "minor" ? "tickWidth" : "minorTickWidth"], !z && m.isXAxis ? 1 : 0), E = v[z !== "minor" ? "tickColor" : "minorTickColor"], L = this.mark, w = !L;\n N && (m.opposite && (N[0] = -N[0]), L || (this.mark = L = y.path().addClass("highcharts-" + (z ? z + "-" : "") + "tick").add(m.axisGroup), m.chart.styledMode || L.attr({ stroke: E, "stroke-width": x })), L[w ? "attr" : "animate"]({ d: this.getMarkPath(W, T, N[0], L.strokeWidth(), m.horiz, y), opacity: O }));\n }\n renderLabel(f, O, m, v) {\n let y = this.axis, z = y.horiz, N = y.options, W = this.label, T = N.labels, x = T.step, E = g(this.tickmarkOffset, y.tickmarkOffset), L = f.x, w = f.y, q = !0;\n W && b(L) && (W.xy = f = this.getLabelPosition(L, w, W, z, T, E, v, x), (!this.isFirst || this.isLast || N.showFirstLabel) && (!this.isLast || this.isFirst || N.showLastLabel) ? !z || T.step || T.rotation || O || m === 0 || this.handleOverflow(f) : q = !1, x && v % x && (q = !1), q && b(f.y) ? (f.opacity = m, W[this.isNewLabel ? "attr" : "animate"](f).show(!0), this.isNewLabel = !1) : (W.hide(), this.isNewLabel = !0));\n }\n replaceMovedLabel() {\n let f = this.label, O = this.axis;\n f && !this.isNew && (f.animate({ opacity: 0 }, void 0, f.destroy), delete this.label), O.isDirty = !0, this.label = this.movedLabel, delete this.movedLabel;\n }\n };\n }), n(r, "Core/Axis/Axis.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Axis/AxisDefaults.js"], r["Core/Color/Color.js"], r["Core/Defaults.js"], r["Core/Foundation.js"], r["Core/Globals.js"], r["Core/Axis/Tick.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p, d) {\n let { animObject: u } = o, { xAxis: h, yAxis: b } = i, { defaultOptions: M } = s, { registerEventOptions: C } = l, { deg2rad: g } = c, { arrayMax: f, arrayMin: O, clamp: m, correctFloat: v, defined: y, destroyObjectProperties: z, erase: N, error: W, extend: T, fireEvent: x, getClosestDistance: E, insertItem: L, isArray: w, isNumber: q, isString: S, merge: B, normalizeTickInterval: I, objectEach: P, pick: k, relativeLength: K, removeEvent: $, splat: j, syncTimeout: r1 } = d, a1 = (Y, D) => I(D, void 0, void 0, k(Y.options.allowDecimals, D < 0.5 || Y.tickAmount !== void 0), !!Y.tickAmount);\n T(M, { xAxis: h, yAxis: B(h, b) });\n class _ {\n constructor(D, H, G) {\n this.init(D, H, G);\n }\n init(D, H, G = this.coll) {\n let J = G === "xAxis", F = this.isZAxis || (D.inverted ? !J : J);\n this.chart = D, this.horiz = F, this.isXAxis = J, this.coll = G, x(this, "init", { userOptions: H }), this.opposite = k(H.opposite, this.opposite), this.side = k(H.side, this.side, F ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3), this.setOptions(H);\n let V = this.options, Q = V.labels;\n this.type ?? (this.type = V.type || "linear"), this.uniqueNames ?? (this.uniqueNames = V.uniqueNames ?? !0), x(this, "afterSetType"), this.userOptions = H, this.minPixelPadding = 0, this.reversed = k(V.reversed, this.reversed), this.visible = V.visible, this.zoomEnabled = V.zoomEnabled, this.hasNames = this.type === "category" || V.categories === !0, this.categories = w(V.categories) && V.categories || (this.hasNames ? [] : void 0), this.names || (this.names = [], this.names.keys = {}), this.plotLinesAndBandsGroups = {}, this.positiveValuesOnly = !!this.logarithmic, this.isLinked = y(V.linkedTo), this.ticks = {}, this.labelEdge = [], this.minorTicks = {}, this.plotLinesAndBands = [], this.alternateBands = {}, this.len ?? (this.len = 0), this.minRange = this.userMinRange = V.minRange || V.maxZoom, this.range = V.range, this.offset = V.offset || 0, this.max = void 0, this.min = void 0;\n let Z = k(V.crosshair, j(D.options.tooltip.crosshairs)[J ? 0 : 1]);\n this.crosshair = Z === !0 ? {} : Z, D.axes.indexOf(this) === -1 && (J ? D.axes.splice(D.xAxis.length, 0, this) : D.axes.push(this), L(this, D[this.coll])), D.orderItems(this.coll), this.series = this.series || [], D.inverted && !this.isZAxis && J && !y(this.reversed) && (this.reversed = !0), this.labelRotation = q(Q.rotation) ? Q.rotation : void 0, C(this, V), x(this, "afterInit");\n }\n setOptions(D) {\n let H = this.horiz ? { labels: { autoRotation: [-45], padding: 4 }, margin: 15 } : { labels: { padding: 1 }, title: { rotation: 90 * this.side } };\n this.options = B(H, M[this.coll], D), x(this, "afterSetOptions", { userOptions: D });\n }\n defaultLabelFormatter() {\n let D = this.axis, { numberFormatter: H } = this.chart, G = q(this.value) ? this.value : NaN, J = D.chart.time, F = D.categories, V = this.dateTimeLabelFormat, Q = M.lang, Z = Q.numericSymbols, t1 = Q.numericSymbolMagnitude || 1e3, n1 = D.logarithmic ? Math.abs(G) : D.tickInterval, U = Z && Z.length, e1, o1;\n if (F)\n o1 = `${this.value}`;\n else if (V)\n o1 = J.dateFormat(V, G);\n else if (U && Z && n1 >= 1e3)\n for (; U-- && o1 === void 0; )\n n1 >= (e1 = Math.pow(t1, U + 1)) && 10 * G % e1 == 0 && Z[U] !== null && G !== 0 && (o1 = H(G / e1, -1) + Z[U]);\n return o1 === void 0 && (o1 = Math.abs(G) >= 1e4 ? H(G, -1) : H(G, -1, void 0, "")), o1;\n }\n getSeriesExtremes() {\n let D, H = this;\n x(this, "getSeriesExtremes", null, function() {\n H.hasVisibleSeries = !1, H.dataMin = H.dataMax = H.threshold = void 0, H.softThreshold = !H.isXAxis, H.series.forEach((G) => {\n if (G.reserveSpace()) {\n let J = G.options, F, V = J.threshold, Q, Z;\n if (H.hasVisibleSeries = !0, H.positiveValuesOnly && 0 >= (V || 0) && (V = void 0), H.isXAxis)\n (F = G.xData) && F.length && (F = H.logarithmic ? F.filter((t1) => t1 > 0) : F, Q = (D = G.getXExtremes(F)).min, Z = D.max, q(Q) || Q instanceof Date || (F = F.filter(q), Q = (D = G.getXExtremes(F)).min, Z = D.max), F.length && (H.dataMin = Math.min(k(H.dataMin, Q), Q), H.dataMax = Math.max(k(H.dataMax, Z), Z)));\n else {\n let t1 = G.applyExtremes();\n q(t1.dataMin) && (Q = t1.dataMin, H.dataMin = Math.min(k(H.dataMin, Q), Q)), q(t1.dataMax) && (Z = t1.dataMax, H.dataMax = Math.max(k(H.dataMax, Z), Z)), y(V) && (H.threshold = V), (!J.softThreshold || H.positiveValuesOnly) && (H.softThreshold = !1);\n }\n }\n });\n }), x(this, "afterGetSeriesExtremes");\n }\n translate(D, H, G, J, F, V) {\n var M1;\n let Q = this.linkedParent || this, Z = J && Q.old ? Q.old.min : Q.min;\n if (!q(Z))\n return NaN;\n let t1 = Q.minPixelPadding, n1 = (Q.isOrdinal || ((M1 = Q.brokenAxis) == null ? void 0 : M1.hasBreaks) || Q.logarithmic && F) && Q.lin2val, U = 1, e1 = 0, o1 = J && Q.old ? Q.old.transA : Q.transA, u1 = 0;\n return o1 || (o1 = Q.transA), G && (U *= -1, e1 = Q.len), Q.reversed && (U *= -1, e1 -= U * (Q.sector || Q.len)), H ? (u1 = (D = D * U + e1 - t1) / o1 + Z, n1 && (u1 = Q.lin2val(u1))) : (n1 && (D = Q.val2lin(D)), u1 = U * (D - Z) * o1 + e1 + U * t1 + (q(V) ? o1 * V : 0), Q.isRadial || (u1 = v(u1))), u1;\n }\n toPixels(D, H) {\n return this.translate(D, !1, !this.horiz, void 0, !0) + (H ? 0 : this.pos);\n }\n toValue(D, H) {\n return this.translate(D - (H ? 0 : this.pos), !0, !this.horiz, void 0, !0);\n }\n getPlotLinePath(D) {\n let H = this, G = H.chart, J = H.left, F = H.top, V = D.old, Q = D.value, Z = D.lineWidth, t1 = V && G.oldChartHeight || G.chartHeight, n1 = V && G.oldChartWidth || G.chartWidth, U = H.transB, e1 = D.translatedValue, o1 = D.force, u1, M1, A1, l1, b1;\n function h1(O1, m1, L1) {\n return o1 !== "pass" && (O1 < m1 || O1 > L1) && (o1 ? O1 = m(O1, m1, L1) : b1 = !0), O1;\n }\n let z1 = { value: Q, lineWidth: Z, old: V, force: o1, acrossPanes: D.acrossPanes, translatedValue: e1 };\n return x(this, "getPlotLinePath", z1, function(O1) {\n u1 = A1 = (e1 = m(e1 = k(e1, H.translate(Q, void 0, void 0, V)), -1e9, 1e9)) + U, M1 = l1 = t1 - e1 - U, q(e1) ? H.horiz ? (M1 = F, l1 = t1 - H.bottom + (H.options.isInternal ? 0 : G.scrollablePixelsY || 0), u1 = A1 = h1(u1, J, J + H.width)) : (u1 = J, A1 = n1 - H.right + (G.scrollablePixelsX || 0), M1 = l1 = h1(M1, F, F + H.height)) : (b1 = !0, o1 = !1), O1.path = b1 && !o1 ? void 0 : G.renderer.crispLine([["M", u1, M1], ["L", A1, l1]], Z || 1);\n }), z1.path;\n }\n getLinearTickPositions(D, H, G) {\n let J, F, V, Q = v(Math.floor(H / D) * D), Z = v(Math.ceil(G / D) * D), t1 = [];\n if (v(Q + D) === Q && (V = 20), this.single)\n return [H];\n for (J = Q; J <= Z && (t1.push(J), (J = v(J + D, V)) !== F); )\n F = J;\n return t1;\n }\n getMinorTickInterval() {\n let { minorTicks: D, minorTickInterval: H } = this.options;\n return D === !0 ? k(H, "auto") : D !== !1 ? H : void 0;\n }\n getMinorTickPositions() {\n let D = this.options, H = this.tickPositions, G = this.minorTickInterval, J = this.pointRangePadding || 0, F = (this.min || 0) - J, V = (this.max || 0) + J, Q = V - F, Z = [], t1;\n if (Q && Q / G < this.len / 3) {\n let n1 = this.logarithmic;\n if (n1)\n this.paddedTicks.forEach(function(U, e1, o1) {\n e1 && Z.push.apply(Z, n1.getLogTickPositions(G, o1[e1 - 1], o1[e1], !0));\n });\n else if (this.dateTime && this.getMinorTickInterval() === "auto")\n Z = Z.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(G), F, V, D.startOfWeek));\n else\n for (t1 = F + (H[0] - F) % G; t1 <= V && t1 !== Z[0]; t1 += G)\n Z.push(t1);\n }\n return Z.length !== 0 && this.trimTicks(Z), Z;\n }\n adjustForMinRange() {\n let D = this.options, H = this.logarithmic, { max: G, min: J, minRange: F } = this, V, Q, Z, t1;\n this.isXAxis && F === void 0 && !H && (F = y(D.min) || y(D.max) || y(D.floor) || y(D.ceiling) ? null : Math.min(5 * (E(this.series.map((n1) => {\n var U;\n return (n1.xIncrement ? (U = n1.xData) == null ? void 0 : U.slice(0, 2) : n1.xData) || [];\n })) || 0), this.dataMax - this.dataMin)), q(G) && q(J) && q(F) && G - J < F && (Q = this.dataMax - this.dataMin >= F, V = (F - G + J) / 2, Z = [J - V, k(D.min, J - V)], Q && (Z[2] = H ? H.log2lin(this.dataMin) : this.dataMin), t1 = [(J = f(Z)) + F, k(D.max, J + F)], Q && (t1[2] = H ? H.log2lin(this.dataMax) : this.dataMax), (G = O(t1)) - J < F && (Z[0] = G - F, Z[1] = k(D.min, G - F), J = f(Z))), this.minRange = F, this.min = J, this.max = G;\n }\n getClosest() {\n let D, H;\n if (this.categories)\n H = 1;\n else {\n let G = [];\n this.series.forEach(function(J) {\n var V;\n let F = J.closestPointRange;\n ((V = J.xData) == null ? void 0 : V.length) === 1 ? G.push(J.xData[0]) : !J.noSharedTooltip && y(F) && J.reserveSpace() && (H = y(H) ? Math.min(H, F) : F);\n }), G.length && (G.sort((J, F) => J - F), D = E([G]));\n }\n return D && H ? Math.min(D, H) : D || H;\n }\n nameToX(D) {\n let H = w(this.options.categories), G = H ? this.categories : this.names, J = D.options.x, F;\n return D.series.requireSorting = !1, y(J) || (J = this.uniqueNames && G ? H ? G.indexOf(D.name) : k(G.keys[D.name], -1) : D.series.autoIncrement()), J === -1 ? !H && G && (F = G.length) : F = J, F !== void 0 ? (this.names[F] = D.name, this.names.keys[D.name] = F) : D.x && (F = D.x), F;\n }\n updateNames() {\n let D = this, H = this.names;\n H.length > 0 && (Object.keys(H.keys).forEach(function(G) {\n delete H.keys[G];\n }), H.length = 0, this.minRange = this.userMinRange, (this.series || []).forEach((G) => {\n G.xIncrement = null, (!G.points || G.isDirtyData) && (D.max = Math.max(D.max, G.xData.length - 1), G.processData(), G.generatePoints()), G.data.forEach(function(J, F) {\n let V;\n J != null && J.options && J.name !== void 0 && (V = D.nameToX(J)) !== void 0 && V !== J.x && (J.x = V, G.xData[F] = V);\n });\n }));\n }\n setAxisTranslation() {\n let D = this, H = D.max - D.min, G = D.linkedParent, J = !!D.categories, F = D.isXAxis, V = D.axisPointRange || 0, Q, Z = 0, t1 = 0, n1, U = D.transA;\n (F || J || V) && (Q = D.getClosest(), G ? (Z = G.minPointOffset, t1 = G.pointRangePadding) : D.series.forEach(function(e1) {\n let o1 = J ? 1 : F ? k(e1.options.pointRange, Q, 0) : D.axisPointRange || 0, u1 = e1.options.pointPlacement;\n if (V = Math.max(V, o1), !D.single || J) {\n let M1 = e1.is("xrange") ? !F : F;\n Z = Math.max(Z, M1 && S(u1) ? 0 : o1 / 2), t1 = Math.max(t1, M1 && u1 === "on" ? 0 : o1);\n }\n }), n1 = D.ordinal && D.ordinal.slope && Q ? D.ordinal.slope / Q : 1, D.minPointOffset = Z *= n1, D.pointRangePadding = t1 *= n1, D.pointRange = Math.min(V, D.single && J ? 1 : H), F && Q && (D.closestPointRange = Q)), D.translationSlope = D.transA = U = D.staticScale || D.len / (H + t1 || 1), D.transB = D.horiz ? D.left : D.bottom, D.minPixelPadding = U * Z, x(this, "afterSetAxisTranslation");\n }\n minFromRange() {\n let { max: D, min: H } = this;\n return q(D) && q(H) && D - H || void 0;\n }\n setTickInterval(D) {\n var Q1, K1, n0, u0;\n let { categories: H, chart: G, dataMax: J, dataMin: F, dateTime: V, isXAxis: Q, logarithmic: Z, options: t1, softThreshold: n1 } = this, U = q(this.threshold) ? this.threshold : void 0, e1 = this.minRange || 0, { ceiling: o1, floor: u1, linkedTo: M1, softMax: A1, softMin: l1 } = t1, b1 = q(M1) && ((Q1 = G[this.coll]) == null ? void 0 : Q1[M1]), h1 = t1.tickPixelInterval, z1 = t1.maxPadding, O1 = t1.minPadding, m1 = 0, L1, y1 = q(t1.tickInterval) && t1.tickInterval >= 0 ? t1.tickInterval : void 0, B1, T1, F1, X1;\n if (V || H || b1 || this.getTickAmount(), F1 = k(this.userMin, t1.min), X1 = k(this.userMax, t1.max), b1 ? (this.linkedParent = b1, L1 = b1.getExtremes(), this.min = k(L1.min, L1.dataMin), this.max = k(L1.max, L1.dataMax), this.type !== b1.type && W(11, !0, G)) : (n1 && y(U) && q(J) && q(F) && (F >= U ? (B1 = U, O1 = 0) : J <= U && (T1 = U, z1 = 0)), this.min = k(F1, B1, F), this.max = k(X1, T1, J)), q(this.max) && q(this.min) && (Z && (this.positiveValuesOnly && !D && 0 >= Math.min(this.min, k(F, this.min)) && W(10, !0, G), this.min = v(Z.log2lin(this.min), 16), this.max = v(Z.log2lin(this.max), 16)), this.range && q(F) && (this.userMin = this.min = F1 = Math.max(F, this.minFromRange() || 0), this.userMax = X1 = this.max, this.range = void 0)), x(this, "foundExtremes"), this.adjustForMinRange(), q(this.min) && q(this.max)) {\n if (!q(this.userMin) && q(l1) && l1 < this.min && (this.min = F1 = l1), !q(this.userMax) && q(A1) && A1 > this.max && (this.max = X1 = A1), H || this.axisPointRange || (K1 = this.stacking) != null && K1.usePercentage || b1 || !(m1 = this.max - this.min) || (!y(F1) && O1 && (this.min -= m1 * O1), y(X1) || !z1 || (this.max += m1 * z1)), !q(this.userMin) && q(u1) && (this.min = Math.max(this.min, u1)), !q(this.userMax) && q(o1) && (this.max = Math.min(this.max, o1)), n1 && q(F) && q(J)) {\n let c0 = U || 0;\n !y(F1) && this.min < c0 && F >= c0 ? this.min = t1.minRange ? Math.min(c0, this.max - e1) : c0 : !y(X1) && this.max > c0 && J <= c0 && (this.max = t1.minRange ? Math.max(c0, this.min + e1) : c0);\n }\n !G.polar && this.min > this.max && (y(t1.min) ? this.max = this.min : y(t1.max) && (this.min = this.max)), m1 = this.max - this.min;\n }\n if (this.min !== this.max && q(this.min) && q(this.max) ? b1 && !y1 && h1 === b1.options.tickPixelInterval ? this.tickInterval = y1 = b1.tickInterval : this.tickInterval = k(y1, this.tickAmount ? m1 / Math.max(this.tickAmount - 1, 1) : void 0, H ? 1 : m1 * h1 / Math.max(this.len, h1)) : this.tickInterval = 1, Q && !D) {\n let c0 = this.min !== ((n0 = this.old) == null ? void 0 : n0.min) || this.max !== ((u0 = this.old) == null ? void 0 : u0.max);\n this.series.forEach(function(C0) {\n var y0;\n C0.forceCrop = (y0 = C0.forceCropping) == null ? void 0 : y0.call(C0), C0.processData(c0);\n }), x(this, "postProcessData", { hasExtremesChanged: c0 });\n }\n this.setAxisTranslation(), x(this, "initialAxisTranslation"), this.pointRange && !y1 && (this.tickInterval = Math.max(this.pointRange, this.tickInterval));\n let G1 = k(t1.minTickInterval, V && !this.series.some((c0) => c0.noSharedTooltip) ? this.closestPointRange : 0);\n !y1 && this.tickInterval < G1 && (this.tickInterval = G1), V || Z || y1 || (this.tickInterval = a1(this, this.tickInterval)), this.tickAmount || (this.tickInterval = this.unsquish()), this.setTickPositions();\n }\n setTickPositions() {\n var n1, U;\n let D = this.options, H = D.tickPositions, G = D.tickPositioner, J = this.getMinorTickInterval(), F = !this.isPanning, V = F && D.startOnTick, Q = F && D.endOnTick, Z = [], t1;\n if (this.tickmarkOffset = this.categories && D.tickmarkPlacement === "between" && this.tickInterval === 1 ? 0.5 : 0, this.single = this.min === this.max && y(this.min) && !this.tickAmount && (this.min % 1 == 0 || D.allowDecimals !== !1), H)\n Z = H.slice();\n else if (q(this.min) && q(this.max)) {\n if (!((n1 = this.ordinal) != null && n1.positions) && (this.max - this.min) / this.tickInterval > Math.max(2 * this.len, 200))\n Z = [this.min, this.max], W(19, !1, this.chart);\n else if (this.dateTime)\n Z = this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval, D.units), this.min, this.max, D.startOfWeek, (U = this.ordinal) == null ? void 0 : U.positions, this.closestPointRange, !0);\n else if (this.logarithmic)\n Z = this.logarithmic.getLogTickPositions(this.tickInterval, this.min, this.max);\n else {\n let e1 = this.tickInterval, o1 = e1;\n for (; o1 <= 2 * e1 && (Z = this.getLinearTickPositions(this.tickInterval, this.min, this.max), this.tickAmount && Z.length > this.tickAmount); )\n this.tickInterval = a1(this, o1 *= 1.1);\n }\n Z.length > this.len && (Z = [Z[0], Z[Z.length - 1]])[0] === Z[1] && (Z.length = 1), G && (this.tickPositions = Z, (t1 = G.apply(this, [this.min, this.max])) && (Z = t1));\n }\n this.tickPositions = Z, this.minorTickInterval = J === "auto" && this.tickInterval ? this.tickInterval / D.minorTicksPerMajor : J, this.paddedTicks = Z.slice(0), this.trimTicks(Z, V, Q), !this.isLinked && q(this.min) && q(this.max) && (this.single && Z.length < 2 && !this.categories && !this.series.some((e1) => e1.is("heatmap") && e1.options.pointPlacement === "between") && (this.min -= 0.5, this.max += 0.5), H || t1 || this.adjustTickAmount()), x(this, "afterSetTickPositions");\n }\n trimTicks(D, H, G) {\n let J = D[0], F = D[D.length - 1], V = !this.isOrdinal && this.minPointOffset || 0;\n if (x(this, "trimTicks"), !this.isLinked) {\n if (H && J !== -1 / 0)\n this.min = J;\n else\n for (; this.min - V > D[0]; )\n D.shift();\n if (G)\n this.max = F;\n else\n for (; this.max + V < D[D.length - 1]; )\n D.pop();\n D.length === 0 && y(J) && !this.options.tickPositions && D.push((F + J) / 2);\n }\n }\n alignToOthers() {\n let D, H = this, G = H.chart, J = [this], F = H.options, V = G.options.chart, Q = this.coll === "yAxis" && V.alignThresholds, Z = [];\n if (H.thresholdAlignment = void 0, (V.alignTicks !== !1 && F.alignTicks || Q) && F.startOnTick !== !1 && F.endOnTick !== !1 && !H.logarithmic) {\n let t1 = (U) => {\n let { horiz: e1, options: o1 } = U;\n return [e1 ? o1.left : o1.top, o1.width, o1.height, o1.pane].join(",");\n }, n1 = t1(this);\n G[this.coll].forEach(function(U) {\n let { series: e1 } = U;\n e1.length && e1.some((o1) => o1.visible) && U !== H && t1(U) === n1 && (D = !0, J.push(U));\n });\n }\n if (D && Q) {\n J.forEach((n1) => {\n let U = n1.getThresholdAlignment(H);\n q(U) && Z.push(U);\n });\n let t1 = Z.length > 1 ? Z.reduce((n1, U) => n1 += U, 0) / Z.length : void 0;\n J.forEach((n1) => {\n n1.thresholdAlignment = t1;\n });\n }\n return D;\n }\n getThresholdAlignment(D) {\n if ((!q(this.dataMin) || this !== D && this.series.some((H) => H.isDirty || H.isDirtyData)) && this.getSeriesExtremes(), q(this.threshold)) {\n let H = m((this.threshold - (this.dataMin || 0)) / ((this.dataMax || 0) - (this.dataMin || 0)), 0, 1);\n return this.options.reversed && (H = 1 - H), H;\n }\n }\n getTickAmount() {\n let D = this.options, H = D.tickPixelInterval, G = D.tickAmount;\n y(D.tickInterval) || G || !(this.len < H) || this.isRadial || this.logarithmic || !D.startOnTick || !D.endOnTick || (G = 2), !G && this.alignToOthers() && (G = Math.ceil(this.len / H) + 1), G < 4 && (this.finalTickAmt = G, G = 5), this.tickAmount = G;\n }\n adjustTickAmount() {\n let D = this, { finalTickAmt: H, max: G, min: J, options: F, tickPositions: V, tickAmount: Q, thresholdAlignment: Z } = D, t1 = V == null ? void 0 : V.length, n1 = k(D.threshold, D.softThreshold ? 0 : null), U, e1, o1 = D.tickInterval, u1, M1 = () => V.push(v(V[V.length - 1] + o1)), A1 = () => V.unshift(v(V[0] - o1));\n if (q(Z) && (u1 = Z < 0.5 ? Math.ceil(Z * (Q - 1)) : Math.floor(Z * (Q - 1)), F.reversed && (u1 = Q - 1 - u1)), D.hasData() && q(J) && q(G)) {\n let l1 = () => {\n D.transA *= (t1 - 1) / (Q - 1), D.min = F.startOnTick ? V[0] : Math.min(J, V[0]), D.max = F.endOnTick ? V[V.length - 1] : Math.max(G, V[V.length - 1]);\n };\n if (q(u1) && q(D.threshold)) {\n for (; V[u1] !== n1 || V.length !== Q || V[0] > J || V[V.length - 1] < G; ) {\n for (V.length = 0, V.push(D.threshold); V.length < Q; )\n V[u1] === void 0 || V[u1] > D.threshold ? A1() : M1();\n if (o1 > 8 * D.tickInterval)\n break;\n o1 *= 2;\n }\n l1();\n } else if (t1 < Q) {\n for (; V.length < Q; )\n V.length % 2 || J === n1 ? M1() : A1();\n l1();\n }\n if (y(H)) {\n for (e1 = U = V.length; e1--; )\n (H === 3 && e1 % 2 == 1 || H <= 2 && e1 > 0 && e1 < U - 1) && V.splice(e1, 1);\n D.finalTickAmt = void 0;\n }\n }\n }\n setScale() {\n var V, Q;\n let { coll: D, stacking: H } = this, G = !1, J = !1;\n this.series.forEach((Z) => {\n G = G || Z.isDirtyData || Z.isDirty, J = J || Z.xAxis && Z.xAxis.isDirty || !1;\n }), this.setAxisSize();\n let F = this.len !== (this.old && this.old.len);\n F || G || J || this.isLinked || this.forceRedraw || this.userMin !== (this.old && this.old.userMin) || this.userMax !== (this.old && this.old.userMax) || this.alignToOthers() ? (H && D === "yAxis" && H.buildStacks(), this.forceRedraw = !1, this.userMinRange || (this.minRange = void 0), this.getSeriesExtremes(), this.setTickInterval(), H && D === "xAxis" && H.buildStacks(), this.isDirty || (this.isDirty = F || this.min !== ((V = this.old) == null ? void 0 : V.min) || this.max !== ((Q = this.old) == null ? void 0 : Q.max))) : H && H.cleanStacks(), G && delete this.allExtremes, x(this, "afterSetScale");\n }\n setExtremes(D, H, G = !0, J, F) {\n this.series.forEach((V) => {\n delete V.kdTree;\n }), x(this, "setExtremes", F = T(F, { min: D, max: H }), (V) => {\n this.userMin = V.min, this.userMax = V.max, this.eventArgs = V, G && this.chart.redraw(J);\n });\n }\n setAxisSize() {\n let D = this.chart, H = this.options, G = H.offsets || [0, 0, 0, 0], J = this.horiz, F = this.width = Math.round(K(k(H.width, D.plotWidth - G[3] + G[1]), D.plotWidth)), V = this.height = Math.round(K(k(H.height, D.plotHeight - G[0] + G[2]), D.plotHeight)), Q = this.top = Math.round(K(k(H.top, D.plotTop + G[0]), D.plotHeight, D.plotTop)), Z = this.left = Math.round(K(k(H.left, D.plotLeft + G[3]), D.plotWidth, D.plotLeft));\n this.bottom = D.chartHeight - V - Q, this.right = D.chartWidth - F - Z, this.len = Math.max(J ? F : V, 0), this.pos = J ? Z : Q;\n }\n getExtremes() {\n let D = this.logarithmic;\n return { min: D ? v(D.lin2log(this.min)) : this.min, max: D ? v(D.lin2log(this.max)) : this.max, dataMin: this.dataMin, dataMax: this.dataMax, userMin: this.userMin, userMax: this.userMax };\n }\n getThreshold(D) {\n let H = this.logarithmic, G = H ? H.lin2log(this.min) : this.min, J = H ? H.lin2log(this.max) : this.max;\n return D === null || D === -1 / 0 ? D = G : D === 1 / 0 ? D = J : G > D ? D = G : J < D && (D = J), this.translate(D, 0, 1, 0, 1);\n }\n autoLabelAlign(D) {\n let H = (k(D, 0) - 90 * this.side + 720) % 360, G = { align: "center" };\n return x(this, "autoLabelAlign", G, function(J) {\n H > 15 && H < 165 ? J.align = "right" : H > 195 && H < 345 && (J.align = "left");\n }), G.align;\n }\n tickSize(D) {\n let H = this.options, G = k(H[D === "tick" ? "tickWidth" : "minorTickWidth"], D === "tick" && this.isXAxis && !this.categories ? 1 : 0), J = H[D === "tick" ? "tickLength" : "minorTickLength"], F;\n G && J && (H[D + "Position"] === "inside" && (J = -J), F = [J, G]);\n let V = { tickSize: F };\n return x(this, "afterTickSize", V), V.tickSize;\n }\n labelMetrics() {\n let D = this.chart.renderer, H = this.ticks, G = H[Object.keys(H)[0]] || {};\n return this.chart.renderer.fontMetrics(G.label || G.movedLabel || D.box);\n }\n unsquish() {\n let D = this.options.labels, H = D.padding || 0, G = this.horiz, J = this.tickInterval, F = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / J), V = D.rotation, Q = v(0.8 * this.labelMetrics().h), Z = Math.max(this.max - this.min, 0), t1 = function(u1) {\n let M1 = (u1 + 2 * H) / (F || 1);\n return (M1 = M1 > 1 ? Math.ceil(M1) : 1) * J > Z && u1 !== 1 / 0 && F !== 1 / 0 && Z && (M1 = Math.ceil(Z / J)), v(M1 * J);\n }, n1 = J, U, e1 = Number.MAX_VALUE, o1;\n if (G) {\n if (!D.staggerLines && (q(V) ? o1 = [V] : F < D.autoRotationLimit && (o1 = D.autoRotation)), o1) {\n let u1, M1;\n for (let A1 of o1)\n (A1 === V || A1 && A1 >= -90 && A1 <= 90) && (M1 = (u1 = t1(Math.abs(Q / Math.sin(g * A1)))) + Math.abs(A1 / 360)) < e1 && (e1 = M1, U = A1, n1 = u1);\n }\n } else\n n1 = t1(0.75 * Q);\n return this.autoRotation = o1, this.labelRotation = k(U, q(V) ? V : 0), D.step ? J : n1;\n }\n getSlotWidth(D) {\n let H = this.chart, G = this.horiz, J = this.options.labels, F = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), V = H.margin[3];\n if (D && q(D.slotWidth))\n return D.slotWidth;\n if (G && J.step < 2)\n return J.rotation ? 0 : (this.staggerLines || 1) * this.len / F;\n if (!G) {\n let Q = J.style.width;\n if (Q !== void 0)\n return parseInt(String(Q), 10);\n if (V)\n return V - H.spacing[3];\n }\n return 0.33 * H.chartWidth;\n }\n renderUnsquish() {\n let D = this.chart, H = D.renderer, G = this.tickPositions, J = this.ticks, F = this.options.labels, V = F.style, Q = this.horiz, Z = this.getSlotWidth(), t1 = Math.max(1, Math.round(Z - (Q ? 2 * (F.padding || 0) : F.distance || 0))), n1 = {}, U = this.labelMetrics(), e1 = V.textOverflow, o1, u1, M1 = 0, A1, l1;\n if (S(F.rotation) || (n1.rotation = F.rotation || 0), G.forEach(function(b1) {\n let h1 = J[b1];\n h1.movedLabel && h1.replaceMovedLabel(), h1 && h1.label && h1.label.textPxLength > M1 && (M1 = h1.label.textPxLength);\n }), this.maxLabelLength = M1, this.autoRotation)\n M1 > t1 && M1 > U.h ? n1.rotation = this.labelRotation : this.labelRotation = 0;\n else if (Z && (o1 = t1, !e1))\n for (u1 = "clip", l1 = G.length; !Q && l1--; )\n (A1 = J[G[l1]].label) && (A1.styles.textOverflow === "ellipsis" ? A1.css({ textOverflow: "clip" }) : A1.textPxLength > Z && A1.css({ width: Z + "px" }), A1.getBBox().height > this.len / G.length - (U.h - U.f) && (A1.specificTextOverflow = "ellipsis"));\n n1.rotation && (o1 = M1 > 0.5 * D.chartHeight ? 0.33 * D.chartHeight : M1, e1 || (u1 = "ellipsis")), this.labelAlign = F.align || this.autoLabelAlign(this.labelRotation), this.labelAlign && (n1.align = this.labelAlign), G.forEach(function(b1) {\n let h1 = J[b1], z1 = h1 && h1.label, O1 = V.width, m1 = {};\n z1 && (z1.attr(n1), h1.shortenLabel ? h1.shortenLabel() : o1 && !O1 && V.whiteSpace !== "nowrap" && (o1 < z1.textPxLength || z1.element.tagName === "SPAN") ? (m1.width = o1 + "px", e1 || (m1.textOverflow = z1.specificTextOverflow || u1), z1.css(m1)) : !z1.styles.width || m1.width || O1 || z1.css({ width: null }), delete z1.specificTextOverflow, h1.rotation = n1.rotation);\n }, this), this.tickRotCorr = H.rotCorr(U.b, this.labelRotation || 0, this.side !== 0);\n }\n hasData() {\n return this.series.some(function(D) {\n return D.hasData();\n }) || this.options.showEmpty && y(this.min) && y(this.max);\n }\n addTitle(D) {\n let H, G = this.chart.renderer, J = this.horiz, F = this.opposite, V = this.options.title, Q = this.chart.styledMode;\n this.axisTitle || ((H = V.textAlign) || (H = (J ? { low: "left", middle: "center", high: "right" } : { low: F ? "right" : "left", middle: "center", high: F ? "left" : "right" })[V.align]), this.axisTitle = G.text(V.text || "", 0, 0, V.useHTML).attr({ zIndex: 7, rotation: V.rotation || 0, align: H }).addClass("highcharts-axis-title"), Q || this.axisTitle.css(B(V.style)), this.axisTitle.add(this.axisGroup), this.axisTitle.isNew = !0), Q || V.style.width || this.isRadial || this.axisTitle.css({ width: this.len + "px" }), this.axisTitle[D ? "show" : "hide"](D);\n }\n generateTick(D) {\n let H = this.ticks;\n H[D] ? H[D].addLabel() : H[D] = new p(this, D);\n }\n createGroups() {\n let { axisParent: D, chart: H, coll: G, options: J } = this, F = H.renderer, V = (Q, Z, t1) => F.g(Q).attr({ zIndex: t1 }).addClass(`highcharts-${G.toLowerCase()}${Z} ` + (this.isRadial ? `highcharts-radial-axis${Z} ` : "") + (J.className || "")).add(D);\n this.axisGroup || (this.gridGroup = V("grid", "-grid", J.gridZIndex), this.axisGroup = V("axis", "", J.zIndex), this.labelGroup = V("axis-labels", "-labels", J.labels.zIndex));\n }\n getOffset() {\n let D = this, { chart: H, horiz: G, options: J, side: F, ticks: V, tickPositions: Q, coll: Z } = D, t1 = H.inverted && !D.isZAxis ? [1, 0, 3, 2][F] : F, n1 = D.hasData(), U = J.title, e1 = J.labels, o1 = q(J.crossing), u1 = H.axisOffset, M1 = H.clipOffset, A1 = [-1, 1, 1, -1][F], l1, b1 = 0, h1, z1 = 0, O1 = 0, m1, L1;\n if (D.showAxis = l1 = n1 || J.showEmpty, D.staggerLines = D.horiz && e1.staggerLines || void 0, D.createGroups(), n1 || D.isLinked ? (Q.forEach(function(y1) {\n D.generateTick(y1);\n }), D.renderUnsquish(), D.reserveSpaceDefault = F === 0 || F === 2 || { 1: "left", 3: "right" }[F] === D.labelAlign, k(e1.reserveSpace, !o1 && null, D.labelAlign === "center" || null, D.reserveSpaceDefault) && Q.forEach(function(y1) {\n O1 = Math.max(V[y1].getLabelSize(), O1);\n }), D.staggerLines && (O1 *= D.staggerLines), D.labelOffset = O1 * (D.opposite ? -1 : 1)) : P(V, function(y1, B1) {\n y1.destroy(), delete V[B1];\n }), U != null && U.text && U.enabled !== !1 && (D.addTitle(l1), l1 && !o1 && U.reserveSpace !== !1 && (D.titleOffset = b1 = D.axisTitle.getBBox()[G ? "height" : "width"], z1 = y(h1 = U.offset) ? 0 : k(U.margin, G ? 5 : 10))), D.renderLine(), D.offset = A1 * k(J.offset, u1[F] ? u1[F] + (J.margin || 0) : 0), D.tickRotCorr = D.tickRotCorr || { x: 0, y: 0 }, L1 = F === 0 ? -D.labelMetrics().h : F === 2 ? D.tickRotCorr.y : 0, m1 = Math.abs(O1) + z1, O1 && (m1 -= L1, m1 += A1 * (G ? k(e1.y, D.tickRotCorr.y + A1 * e1.distance) : k(e1.x, A1 * e1.distance))), D.axisTitleMargin = k(h1, m1), D.getMaxLabelDimensions && (D.maxLabelDimensions = D.getMaxLabelDimensions(V, Q)), Z !== "colorAxis" && M1) {\n let y1 = this.tickSize("tick");\n u1[F] = Math.max(u1[F], (D.axisTitleMargin || 0) + b1 + A1 * D.offset, m1, Q && Q.length && y1 ? y1[0] + A1 * D.offset : 0);\n let B1 = !D.axisLine || J.offset ? 0 : D.axisLine.strokeWidth() / 2;\n M1[t1] = Math.max(M1[t1], B1);\n }\n x(this, "afterGetOffset");\n }\n getLinePath(D) {\n let H = this.chart, G = this.opposite, J = this.offset, F = this.horiz, V = this.left + (G ? this.width : 0) + J, Q = H.chartHeight - this.bottom - (G ? this.height : 0) + J;\n return G && (D *= -1), H.renderer.crispLine([["M", F ? this.left : V, F ? Q : this.top], ["L", F ? H.chartWidth - this.right : V, F ? Q : H.chartHeight - this.bottom]], D);\n }\n renderLine() {\n this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.chart.styledMode || this.axisLine.attr({ stroke: this.options.lineColor, "stroke-width": this.options.lineWidth, zIndex: 7 }));\n }\n getTitlePosition(D) {\n let H = this.horiz, G = this.left, J = this.top, F = this.len, V = this.options.title, Q = H ? G : J, Z = this.opposite, t1 = this.offset, n1 = V.x, U = V.y, e1 = this.chart.renderer.fontMetrics(D), o1 = D ? Math.max(D.getBBox(!1, 0).height - e1.h - 1, 0) : 0, u1 = { low: Q + (H ? 0 : F), middle: Q + F / 2, high: Q + (H ? F : 0) }[V.align], M1 = (H ? J + this.height : G) + (H ? 1 : -1) * (Z ? -1 : 1) * (this.axisTitleMargin || 0) + [-o1, o1, e1.f, -o1][this.side], A1 = { x: H ? u1 + n1 : M1 + (Z ? this.width : 0) + t1 + n1, y: H ? M1 + U - (Z ? this.height : 0) + t1 : u1 + U };\n return x(this, "afterGetTitlePosition", { titlePosition: A1 }), A1;\n }\n renderMinorTick(D, H) {\n let G = this.minorTicks;\n G[D] || (G[D] = new p(this, D, "minor")), H && G[D].isNew && G[D].render(null, !0), G[D].render(null, !1, 1);\n }\n renderTick(D, H, G) {\n let J = this.isLinked, F = this.ticks;\n (!J || D >= this.min && D <= this.max || this.grid && this.grid.isColumn) && (F[D] || (F[D] = new p(this, D)), G && F[D].isNew && F[D].render(H, !0, -1), F[D].render(H));\n }\n render() {\n let D, H, G = this, J = G.chart, F = G.logarithmic, V = J.renderer, Q = G.options, Z = G.isLinked, t1 = G.tickPositions, n1 = G.axisTitle, U = G.ticks, e1 = G.minorTicks, o1 = G.alternateBands, u1 = Q.stackLabels, M1 = Q.alternateGridColor, A1 = Q.crossing, l1 = G.tickmarkOffset, b1 = G.axisLine, h1 = G.showAxis, z1 = u(V.globalAnimation);\n if (G.labelEdge.length = 0, G.overlap = !1, [U, e1, o1].forEach(function(O1) {\n P(O1, function(m1) {\n m1.isActive = !1;\n });\n }), q(A1)) {\n let O1 = this.isXAxis ? J.yAxis[0] : J.xAxis[0], m1 = [1, -1, -1, 1][this.side];\n if (O1) {\n let L1 = O1.toPixels(A1, !0);\n G.horiz && (L1 = O1.len - L1), G.offset = m1 * L1;\n }\n }\n if (G.hasData() || Z) {\n let O1 = G.chart.hasRendered && G.old && q(G.old.min);\n G.minorTickInterval && !G.categories && G.getMinorTickPositions().forEach(function(m1) {\n G.renderMinorTick(m1, O1);\n }), t1.length && (t1.forEach(function(m1, L1) {\n G.renderTick(m1, L1, O1);\n }), l1 && (G.min === 0 || G.single) && (U[-1] || (U[-1] = new p(G, -1, null, !0)), U[-1].render(-1))), M1 && t1.forEach(function(m1, L1) {\n H = t1[L1 + 1] !== void 0 ? t1[L1 + 1] + l1 : G.max - l1, L1 % 2 == 0 && m1 < G.max && H <= G.max + (J.polar ? -l1 : l1) && (o1[m1] || (o1[m1] = new c.PlotLineOrBand(G, {})), D = m1 + l1, o1[m1].options = { from: F ? F.lin2log(D) : D, to: F ? F.lin2log(H) : H, color: M1, className: "highcharts-alternate-grid" }, o1[m1].render(), o1[m1].isActive = !0);\n }), G._addedPlotLB || (G._addedPlotLB = !0, (Q.plotLines || []).concat(Q.plotBands || []).forEach(function(m1) {\n G.addPlotBandOrLine(m1);\n }));\n }\n [U, e1, o1].forEach(function(O1) {\n let m1 = [], L1 = z1.duration;\n P(O1, function(y1, B1) {\n y1.isActive || (y1.render(B1, !1, 0), y1.isActive = !1, m1.push(B1));\n }), r1(function() {\n let y1 = m1.length;\n for (; y1--; )\n O1[m1[y1]] && !O1[m1[y1]].isActive && (O1[m1[y1]].destroy(), delete O1[m1[y1]]);\n }, O1 !== o1 && J.hasRendered && L1 ? L1 : 0);\n }), b1 && (b1[b1.isPlaced ? "animate" : "attr"]({ d: this.getLinePath(b1.strokeWidth()) }), b1.isPlaced = !0, b1[h1 ? "show" : "hide"](h1)), n1 && h1 && (n1[n1.isNew ? "attr" : "animate"](G.getTitlePosition(n1)), n1.isNew = !1), u1 && u1.enabled && G.stacking && G.stacking.renderStackTotals(), G.old = { len: G.len, max: G.max, min: G.min, transA: G.transA, userMax: G.userMax, userMin: G.userMin }, G.isDirty = !1, x(this, "afterRender");\n }\n redraw() {\n this.visible && (this.render(), this.plotLinesAndBands.forEach(function(D) {\n D.render();\n })), this.series.forEach(function(D) {\n D.isDirty = !0;\n });\n }\n getKeepProps() {\n return this.keepProps || _.keepProps;\n }\n destroy(D) {\n let H = this, G = H.plotLinesAndBands, J = this.eventOptions;\n if (x(this, "destroy", { keepEvents: D }), D || $(H), [H.ticks, H.minorTicks, H.alternateBands].forEach(function(F) {\n z(F);\n }), G) {\n let F = G.length;\n for (; F--; )\n G[F].destroy();\n }\n for (let F in ["axisLine", "axisTitle", "axisGroup", "gridGroup", "labelGroup", "cross", "scrollbar"].forEach(function(V) {\n H[V] && (H[V] = H[V].destroy());\n }), H.plotLinesAndBandsGroups)\n H.plotLinesAndBandsGroups[F] = H.plotLinesAndBandsGroups[F].destroy();\n P(H, function(F, V) {\n H.getKeepProps().indexOf(V) === -1 && delete H[V];\n }), this.eventOptions = J;\n }\n drawCrosshair(D, H) {\n let G = this.crosshair, J = k(G && G.snap, !0), F = this.chart, V, Q, Z, t1 = this.cross, n1;\n if (x(this, "drawCrosshair", { e: D, point: H }), D || (D = this.cross && this.cross.e), G && (y(H) || !J) !== !1) {\n if (J ? y(H) && (Q = k(this.coll !== "colorAxis" ? H.crosshairPos : null, this.isXAxis ? H.plotX : this.len - H.plotY)) : Q = D && (this.horiz ? D.chartX - this.pos : this.len - D.chartY + this.pos), y(Q) && (n1 = { value: H && (this.isXAxis ? H.x : k(H.stackY, H.y)), translatedValue: Q }, F.polar && T(n1, { isCrosshair: !0, chartX: D && D.chartX, chartY: D && D.chartY, point: H }), V = this.getPlotLinePath(n1) || null), !y(V)) {\n this.hideCrosshair();\n return;\n }\n Z = this.categories && !this.isRadial, t1 || (this.cross = t1 = F.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (Z ? "category " : "thin ") + (G.className || "")).attr({ zIndex: k(G.zIndex, 2) }).add(), !F.styledMode && (t1.attr({ stroke: G.color || (Z ? a.parse("#ccd3ff").setOpacity(0.25).get() : "#cccccc"), "stroke-width": k(G.width, 1) }).css({ "pointer-events": "none" }), G.dashStyle && t1.attr({ dashstyle: G.dashStyle }))), t1.show().attr({ d: V }), Z && !G.width && t1.attr({ "stroke-width": this.transA }), this.cross.e = D;\n } else\n this.hideCrosshair();\n x(this, "afterDrawCrosshair", { e: D, point: H });\n }\n hideCrosshair() {\n this.cross && this.cross.hide(), x(this, "afterHideCrosshair");\n }\n update(D, H) {\n let G = this.chart;\n D = B(this.userOptions, D), this.destroy(!0), this.init(G, D), G.isDirtyBox = !0, k(H, !0) && G.redraw();\n }\n remove(D) {\n let H = this.chart, G = this.coll, J = this.series, F = J.length;\n for (; F--; )\n J[F] && J[F].remove(!1);\n N(H.axes, this), N(H[G] || [], this), H.orderItems(G), this.destroy(), H.isDirtyBox = !0, k(D, !0) && H.redraw();\n }\n setTitle(D, H) {\n this.update({ title: D }, H);\n }\n setCategories(D, H) {\n this.update({ categories: D }, H);\n }\n }\n return _.keepProps = ["coll", "extKey", "hcEvents", "len", "names", "series", "userMax", "userMin"], _;\n }), n(r, "Core/Axis/DateTimeAxis.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { addEvent: a, getMagnitude: s, normalizeTickInterval: l, timeUnits: c } = o;\n return function(p) {\n function d() {\n return this.chart.time.getTimeTicks.apply(this.chart.time, arguments);\n }\n function u() {\n if (this.type !== "datetime") {\n this.dateTime = void 0;\n return;\n }\n this.dateTime || (this.dateTime = new h(this));\n }\n p.compose = function(b) {\n return b.keepProps.includes("dateTime") || (b.keepProps.push("dateTime"), b.prototype.getTimeTicks = d, a(b, "afterSetType", u)), b;\n };\n class h {\n constructor(M) {\n this.axis = M;\n }\n normalizeTimeTickInterval(M, C) {\n let g = C || [["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], ["second", [1, 2, 5, 10, 15, 30]], ["minute", [1, 2, 5, 10, 15, 30]], ["hour", [1, 2, 3, 4, 6, 8, 12]], ["day", [1, 2]], ["week", [1, 2]], ["month", [1, 2, 3, 4, 6]], ["year", null]], f = g[g.length - 1], O = c[f[0]], m = f[1], v;\n for (v = 0; v < g.length && (O = c[(f = g[v])[0]], m = f[1], !g[v + 1] || !(M <= (O * m[m.length - 1] + c[g[v + 1][0]]) / 2)); v++)\n ;\n O === c.year && M < 5 * O && (m = [1, 2, 5]);\n let y = l(M / O, m, f[0] === "year" ? Math.max(s(M / O), 1) : 1);\n return { unitRange: O, count: y, unitName: f[0] };\n }\n getXDateFormat(M, C) {\n let { axis: g } = this, f = g.chart.time;\n return g.closestPointRange ? f.getDateFormat(g.closestPointRange, M, g.options.startOfWeek, C) || f.resolveDTLFormat(C.year).main : f.resolveDTLFormat(C.day).main;\n }\n }\n p.Additions = h;\n }(i || (i = {})), i;\n }), n(r, "Core/Axis/LogarithmicAxis.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { addEvent: a, normalizeTickInterval: s, pick: l } = o;\n return function(c) {\n function p() {\n this.type !== "logarithmic" ? this.logarithmic = void 0 : this.logarithmic ?? (this.logarithmic = new u(this));\n }\n function d() {\n let h = this.logarithmic;\n h && (this.lin2val = function(b) {\n return h.lin2log(b);\n }, this.val2lin = function(b) {\n return h.log2lin(b);\n });\n }\n c.compose = function(h) {\n return h.keepProps.includes("logarithmic") || (h.keepProps.push("logarithmic"), a(h, "afterSetType", p), a(h, "afterInit", d)), h;\n };\n class u {\n constructor(b) {\n this.axis = b;\n }\n getLogTickPositions(b, M, C, g) {\n let f = this.axis, O = f.len, m = f.options, v = [];\n if (g || (this.minorAutoInterval = void 0), b >= 0.5)\n b = Math.round(b), v = f.getLinearTickPositions(b, M, C);\n else if (b >= 0.08) {\n let y, z, N, W, T, x, E, L = Math.floor(M);\n for (y = b > 0.3 ? [1, 2, 4] : b > 0.15 ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9], z = L; z < C + 1 && !E; z++)\n for (N = 0, W = y.length; N < W && !E; N++)\n (T = this.log2lin(this.lin2log(z) * y[N])) > M && (!g || x <= C) && x !== void 0 && v.push(x), x > C && (E = !0), x = T;\n } else {\n let y = this.lin2log(M), z = this.lin2log(C), N = g ? f.getMinorTickInterval() : m.tickInterval, W = m.tickPixelInterval / (g ? 5 : 1), T = g ? O / f.tickPositions.length : O;\n b = s(b = l(N === "auto" ? null : N, this.minorAutoInterval, (z - y) * W / (T || 1))), v = f.getLinearTickPositions(b, y, z).map(this.log2lin), g || (this.minorAutoInterval = b / 5);\n }\n return g || (f.tickInterval = b), v;\n }\n lin2log(b) {\n return Math.pow(10, b);\n }\n log2lin(b) {\n return Math.log(b) / Math.LN10;\n }\n }\n c.Additions = u;\n }(i || (i = {})), i;\n }), n(r, "Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { erase: a, extend: s, isNumber: l } = o;\n return function(c) {\n let p;\n function d(f) {\n return this.addPlotBandOrLine(f, "plotBands");\n }\n function u(f, O) {\n let m = this.userOptions, v = new p(this, f);\n if (this.visible && (v = v.render()), v) {\n if (this._addedPlotLB || (this._addedPlotLB = !0, (m.plotLines || []).concat(m.plotBands || []).forEach((y) => {\n this.addPlotBandOrLine(y);\n })), O) {\n let y = m[O] || [];\n y.push(f), m[O] = y;\n }\n this.plotLinesAndBands.push(v);\n }\n return v;\n }\n function h(f) {\n return this.addPlotBandOrLine(f, "plotLines");\n }\n function b(f, O, m) {\n m = m || this.options;\n let v = this.getPlotLinePath({ value: O, force: !0, acrossPanes: m.acrossPanes }), y = [], z = this.horiz, N = !l(this.min) || !l(this.max) || f < this.min && O < this.min || f > this.max && O > this.max, W = this.getPlotLinePath({ value: f, force: !0, acrossPanes: m.acrossPanes }), T, x = 1, E;\n if (W && v)\n for (N && (E = W.toString() === v.toString(), x = 0), T = 0; T < W.length; T += 2) {\n let L = W[T], w = W[T + 1], q = v[T], S = v[T + 1];\n (L[0] === "M" || L[0] === "L") && (w[0] === "M" || w[0] === "L") && (q[0] === "M" || q[0] === "L") && (S[0] === "M" || S[0] === "L") && (z && q[1] === L[1] ? (q[1] += x, S[1] += x) : z || q[2] !== L[2] || (q[2] += x, S[2] += x), y.push(["M", L[1], L[2]], ["L", w[1], w[2]], ["L", S[1], S[2]], ["L", q[1], q[2]], ["Z"])), y.isFlat = E;\n }\n return y;\n }\n function M(f) {\n this.removePlotBandOrLine(f);\n }\n function C(f) {\n let O = this.plotLinesAndBands, m = this.options, v = this.userOptions;\n if (O) {\n let y = O.length;\n for (; y--; )\n O[y].id === f && O[y].destroy();\n [m.plotLines || [], v.plotLines || [], m.plotBands || [], v.plotBands || []].forEach(function(z) {\n for (y = z.length; y--; )\n (z[y] || {}).id === f && a(z, z[y]);\n });\n }\n }\n function g(f) {\n this.removePlotBandOrLine(f);\n }\n c.compose = function(f, O) {\n let m = O.prototype;\n return m.addPlotBand || (p = f, s(m, { addPlotBand: d, addPlotLine: h, addPlotBandOrLine: u, getPlotBandPath: b, removePlotBand: M, removePlotLine: g, removePlotBandOrLine: C })), O;\n };\n }(i || (i = {})), i;\n }), n(r, "Core/Axis/PlotLineOrBand/PlotLineOrBand.js", [r["Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js"], r["Core/Utilities.js"]], function(o, i) {\n let { addEvent: a, arrayMax: s, arrayMin: l, defined: c, destroyObjectProperties: p, erase: d, fireEvent: u, merge: h, objectEach: b, pick: M } = i;\n class C {\n static compose(f, O) {\n return a(f, "afterInit", function() {\n this.labelCollectors.push(() => {\n var v;\n let m = [];\n for (let y of this.axes)\n for (let { label: z, options: N } of y.plotLinesAndBands)\n z && !((v = N == null ? void 0 : N.label) != null && v.allowOverlap) && m.push(z);\n return m;\n });\n }), o.compose(C, O);\n }\n constructor(f, O) {\n this.axis = f, this.options = O, this.id = O.id;\n }\n render() {\n u(this, "render");\n let { axis: f, options: O } = this, { horiz: m, logarithmic: v } = f, { color: y, events: z, zIndex: N = 0 } = O, W = {}, T = f.chart.renderer, x = O.to, E = O.from, L = O.value, w = O.borderWidth, q = O.label, { label: S, svgElem: B } = this, I = [], P, k = c(E) && c(x), K = c(L), $ = !B, j = { class: "highcharts-plot-" + (k ? "band " : "line ") + (O.className || "") }, r1 = k ? "bands" : "lines";\n if (!f.chart.styledMode && (K ? (j.stroke = y || "#999999", j["stroke-width"] = M(O.width, 1), O.dashStyle && (j.dashstyle = O.dashStyle)) : k && (j.fill = y || "#e6e9ff", w && (j.stroke = O.borderColor, j["stroke-width"] = w))), W.zIndex = N, r1 += "-" + N, (P = f.plotLinesAndBandsGroups[r1]) || (f.plotLinesAndBandsGroups[r1] = P = T.g("plot-" + r1).attr(W).add()), B || (this.svgElem = B = T.path().attr(j).add(P)), c(L))\n I = f.getPlotLinePath({ value: (v == null ? void 0 : v.log2lin(L)) ?? L, lineWidth: B.strokeWidth(), acrossPanes: O.acrossPanes });\n else {\n if (!(c(E) && c(x)))\n return;\n I = f.getPlotBandPath((v == null ? void 0 : v.log2lin(E)) ?? E, (v == null ? void 0 : v.log2lin(x)) ?? x, O);\n }\n return !this.eventsAdded && z && (b(z, (a1, _) => {\n B == null || B.on(_, (Y) => {\n z[_].apply(this, [Y]);\n });\n }), this.eventsAdded = !0), ($ || !B.d) && (I != null && I.length) ? B.attr({ d: I }) : B && (I ? (B.show(), B.animate({ d: I })) : B.d && (B.hide(), S && (this.label = S = S.destroy()))), q && (c(q.text) || c(q.formatter)) && (I != null && I.length) && f.width > 0 && f.height > 0 && !I.isFlat ? (q = h({ align: m && k ? "center" : void 0, x: m ? !k && 4 : 10, verticalAlign: !m && k ? "middle" : void 0, y: m ? k ? 16 : 10 : k ? 6 : -4, rotation: m && !k ? 90 : 0, ...k ? { inside: !0 } : {} }, q), this.renderLabel(q, I, k, N)) : S && S.hide(), this;\n }\n renderLabel(f, O, m, v) {\n var q;\n let y = this.axis, z = y.chart.renderer, N = f.inside, W = this.label;\n W || (this.label = W = z.text(this.getLabelText(f), 0, 0, f.useHTML).attr({ align: f.textAlign || f.align, rotation: f.rotation, class: "highcharts-plot-" + (m ? "band" : "line") + "-label " + (f.className || ""), zIndex: v }), y.chart.styledMode || W.css(h({ fontSize: "0.8em", textOverflow: m && !N ? "" : "ellipsis" }, f.style)), W.add());\n let T = O.xBounds || [O[0][1], O[1][1], m ? O[2][1] : O[0][1]], x = O.yBounds || [O[0][2], O[1][2], m ? O[2][2] : O[0][2]], E = l(T), L = l(x), w = s(T) - E;\n W.align(f, !1, { x: E, y: L, width: w, height: s(x) - L }), (!W.alignValue || W.alignValue === "left" || c(N)) && W.css({ width: (((q = f.style) == null ? void 0 : q.width) || (m && N ? w : W.rotation === 90 ? y.height - (W.alignAttr.y - y.top) : (f.clip ? y.width : y.chart.chartWidth) - (W.alignAttr.x - y.left))) + "px" }), W.show(!0);\n }\n getLabelText(f) {\n return c(f.formatter) ? f.formatter.call(this) : f.text;\n }\n destroy() {\n d(this.axis.plotLinesAndBands, this), delete this.axis, p(this);\n }\n }\n return C;\n }), n(r, "Core/Tooltip.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Templating.js"], r["Core/Globals.js"], r["Core/Renderer/RendererUtilities.js"], r["Core/Renderer/RendererRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c) {\n var p;\n let { animObject: d } = o, { format: u } = i, { composed: h, doc: b, isSafari: M } = a, { distribute: C } = s, { addEvent: g, clamp: f, css: O, discardElement: m, extend: v, fireEvent: y, isArray: z, isNumber: N, isString: W, merge: T, pick: x, pushUnique: E, splat: L, syncTimeout: w } = c;\n class q {\n constructor(B, I, P) {\n this.allowShared = !0, this.crosshairs = [], this.distance = 0, this.isHidden = !0, this.isSticky = !1, this.options = {}, this.outside = !1, this.chart = B, this.init(B, I), this.pointer = P;\n }\n bodyFormatter(B) {\n return B.map(function(I) {\n let P = I.series.tooltipOptions;\n return (P[(I.point.formatPrefix || "point") + "Formatter"] || I.point.tooltipFormatter).call(I.point, P[(I.point.formatPrefix || "point") + "Format"] || "");\n });\n }\n cleanSplit(B) {\n this.chart.series.forEach(function(I) {\n let P = I && I.tt;\n P && (!P.isActive || B ? I.tt = P.destroy() : P.isActive = !1);\n });\n }\n defaultFormatter(B) {\n let I, P = this.points || L(this);\n return (I = (I = [B.tooltipFooterHeaderFormatter(P[0])]).concat(B.bodyFormatter(P))).push(B.tooltipFooterHeaderFormatter(P[0], !0)), I;\n }\n destroy() {\n this.label && (this.label = this.label.destroy()), this.split && (this.cleanSplit(!0), this.tt && (this.tt = this.tt.destroy())), this.renderer && (this.renderer = this.renderer.destroy(), m(this.container)), c.clearTimeout(this.hideTimer);\n }\n getAnchor(B, I) {\n let P, { chart: k, pointer: K } = this, $ = k.inverted, j = k.plotTop, r1 = k.plotLeft;\n if ((B = L(B))[0].series && B[0].series.yAxis && !B[0].series.yAxis.options.reversedStacks && (B = B.slice().reverse()), this.followPointer && I)\n I.chartX === void 0 && (I = K.normalize(I)), P = [I.chartX - r1, I.chartY - j];\n else if (B[0].tooltipPos)\n P = B[0].tooltipPos;\n else {\n let a1 = 0, _ = 0;\n B.forEach(function(Y) {\n let D = Y.pos(!0);\n D && (a1 += D[0], _ += D[1]);\n }), a1 /= B.length, _ /= B.length, this.shared && B.length > 1 && I && ($ ? a1 = I.chartX : _ = I.chartY), P = [a1 - r1, _ - j];\n }\n return P.map(Math.round);\n }\n getClassName(B, I, P) {\n let k = this.options, K = B.series, $ = K.options;\n return [k.className, "highcharts-label", P && "highcharts-tooltip-header", I ? "highcharts-tooltip-box" : "highcharts-tooltip", !P && "highcharts-color-" + x(B.colorIndex, K.colorIndex), $ && $.className].filter(W).join(" ");\n }\n getLabel({ anchorX: B, anchorY: I } = { anchorX: 0, anchorY: 0 }) {\n let P = this, k = this.chart.styledMode, K = this.options, $ = this.split && this.allowShared, j = this.container, r1 = this.chart.renderer;\n if (this.label) {\n let a1 = !this.label.hasClass("highcharts-label");\n (!$ && a1 || $ && !a1) && this.destroy();\n }\n if (!this.label) {\n if (this.outside) {\n let a1 = this.chart.options.chart.style, _ = l.getRendererType();\n this.container = j = a.doc.createElement("div"), j.className = "highcharts-tooltip-container", O(j, { position: "absolute", top: "1px", pointerEvents: "none", zIndex: Math.max(this.options.style.zIndex || 0, (a1 && a1.zIndex || 0) + 3) }), this.renderer = r1 = new _(j, 0, 0, a1, void 0, void 0, r1.styledMode);\n }\n if ($ ? this.label = r1.g("tooltip") : (this.label = r1.label("", B, I, K.shape, void 0, void 0, K.useHTML, void 0, "tooltip").attr({ padding: K.padding, r: K.borderRadius }), k || this.label.attr({ fill: K.backgroundColor, "stroke-width": K.borderWidth || 0 }).css(K.style).css({ pointerEvents: K.style.pointerEvents || (this.shouldStickOnContact() ? "auto" : "none") })), P.outside) {\n let a1 = this.label;\n [a1.xSetter, a1.ySetter].forEach((_, Y) => {\n a1[Y ? "ySetter" : "xSetter"] = (D) => {\n _.call(a1, P.distance), a1[Y ? "y" : "x"] = D, j && (j.style[Y ? "top" : "left"] = `${D}px`);\n };\n });\n }\n this.label.attr({ zIndex: 8 }).shadow(K.shadow).add();\n }\n return j && !j.parentElement && a.doc.body.appendChild(j), this.label;\n }\n getPlayingField() {\n let { body: B, documentElement: I } = b, { chart: P, distance: k, outside: K } = this;\n return { width: K ? Math.max(B.scrollWidth, I.scrollWidth, B.offsetWidth, I.offsetWidth, I.clientWidth) - 2 * k : P.chartWidth, height: K ? Math.max(B.scrollHeight, I.scrollHeight, B.offsetHeight, I.offsetHeight, I.clientHeight) : P.chartHeight };\n }\n getPosition(B, I, P) {\n var z1, O1;\n let { distance: k, chart: K, outside: $, pointer: j } = this, { inverted: r1, plotLeft: a1, plotTop: _, polar: Y } = K, { plotX: D = 0, plotY: H = 0 } = P, G = {}, J = r1 && P.h || 0, { height: F, width: V } = this.getPlayingField(), Q = j.getChartPosition(), Z = (m1) => m1 * Q.scaleX, t1 = (m1) => m1 * Q.scaleY, n1 = (m1) => {\n let L1 = m1 === "x";\n return [m1, L1 ? V : F, L1 ? B : I].concat($ ? [L1 ? Z(B) : t1(I), L1 ? Q.left - k + Z(D + a1) : Q.top - k + t1(H + _), 0, L1 ? V : F] : [L1 ? B : I, L1 ? D + a1 : H + _, L1 ? a1 : _, L1 ? a1 + K.plotWidth : _ + K.plotHeight]);\n }, U = n1("y"), e1 = n1("x"), o1, u1 = !!P.negative;\n !Y && ((O1 = (z1 = K.hoverSeries) == null ? void 0 : z1.yAxis) != null && O1.reversed) && (u1 = !u1);\n let M1 = !this.followPointer && x(P.ttBelow, !Y && !r1 === u1), A1 = function(m1, L1, y1, B1, T1, F1, X1) {\n let G1 = $ ? m1 === "y" ? t1(k) : Z(k) : k, Q1 = (y1 - B1) / 2, K1 = B1 < T1 - k, n0 = T1 + k + B1 < L1, u0 = T1 - G1 - y1 + Q1, c0 = T1 + G1 - Q1;\n if (M1 && n0)\n G[m1] = c0;\n else if (!M1 && K1)\n G[m1] = u0;\n else if (K1)\n G[m1] = Math.min(X1 - B1, u0 - J < 0 ? u0 : u0 - J);\n else {\n if (!n0)\n return !1;\n G[m1] = Math.max(F1, c0 + J + y1 > L1 ? c0 : c0 + J);\n }\n }, l1 = function(m1, L1, y1, B1, T1) {\n if (T1 < k || T1 > L1 - k)\n return !1;\n T1 < y1 / 2 ? G[m1] = 1 : T1 > L1 - B1 / 2 ? G[m1] = L1 - B1 - 2 : G[m1] = T1 - y1 / 2;\n }, b1 = function(m1) {\n [U, e1] = [e1, U], o1 = m1;\n }, h1 = () => {\n A1.apply(0, U) !== !1 ? l1.apply(0, e1) !== !1 || o1 || (b1(!0), h1()) : o1 ? G.x = G.y = 0 : (b1(!0), h1());\n };\n return (r1 && !Y || this.len > 1) && b1(), h1(), G;\n }\n hide(B) {\n let I = this;\n c.clearTimeout(this.hideTimer), B = x(B, this.options.hideDelay), this.isHidden || (this.hideTimer = w(function() {\n let P = I.getLabel();\n I.getLabel().animate({ opacity: 0 }, { duration: B && 150, complete: () => {\n P.hide(), I.container && I.container.remove();\n } }), I.isHidden = !0;\n }, B));\n }\n init(B, I) {\n this.chart = B, this.options = I, this.crosshairs = [], this.isHidden = !0, this.split = I.split && !B.inverted && !B.polar, this.shared = I.shared || this.split, this.outside = x(I.outside, !!(B.scrollablePixelsX || B.scrollablePixelsY));\n }\n shouldStickOnContact(B) {\n return !!(!this.followPointer && this.options.stickOnContact && (!B || this.pointer.inClass(B.target, "highcharts-tooltip")));\n }\n move(B, I, P, k) {\n let K = this, $ = d(!K.isHidden && K.options.animation), j = K.followPointer || (K.len || 0) > 1, r1 = { x: B, y: I };\n j || (r1.anchorX = P, r1.anchorY = k), $.step = () => K.drawTracker(), K.getLabel().animate(r1, $);\n }\n refresh(B, I) {\n let { chart: P, options: k, pointer: K, shared: $ } = this, j = L(B), r1 = j[0], a1 = [], _ = k.format, Y = k.formatter || this.defaultFormatter, D = P.styledMode, H = {}, G = this.allowShared;\n if (!k.enabled || !r1.series)\n return;\n c.clearTimeout(this.hideTimer), this.allowShared = !(!z(B) && B.series && B.series.noSharedTooltip), G = G && !this.allowShared, this.followPointer = !this.split && r1.series.tooltipOptions.followPointer;\n let J = this.getAnchor(B, I), F = J[0], V = J[1];\n $ && this.allowShared ? (K.applyInactiveState(j), j.forEach(function(t1) {\n t1.setState("hover"), a1.push(t1.getLabelConfig());\n }), (H = r1.getLabelConfig()).points = a1) : H = r1.getLabelConfig(), this.len = a1.length;\n let Q = W(_) ? u(_, H, P) : Y.call(H, this), Z = r1.series;\n if (this.distance = x(Z.tooltipOptions.distance, 16), Q === !1)\n this.hide();\n else {\n if (this.split && this.allowShared)\n this.renderSplit(Q, j);\n else {\n let t1 = F, n1 = V;\n if (I && K.isDirectTouch && (t1 = I.chartX - P.plotLeft, n1 = I.chartY - P.plotTop), P.polar || Z.options.clip === !1 || j.some((U) => K.isDirectTouch || U.series.shouldShowTooltip(t1, n1))) {\n let U = this.getLabel(G && this.tt || {});\n (!k.style.width || D) && U.css({ width: (this.outside ? this.getPlayingField() : P.spacingBox).width + "px" }), U.attr({ class: this.getClassName(r1), text: Q && Q.join ? Q.join("") : Q }), this.outside && U.attr({ x: f(U.x || 0, 0, this.getPlayingField().width - (U.width || 0)) }), D || U.attr({ stroke: k.borderColor || r1.color || Z.color || "#666666" }), this.updatePosition({ plotX: F, plotY: V, negative: r1.negative, ttBelow: r1.ttBelow, h: J[2] || 0 });\n } else {\n this.hide();\n return;\n }\n }\n this.isHidden && this.label && this.label.attr({ opacity: 1 }).show(), this.isHidden = !1;\n }\n y(this, "refresh");\n }\n renderSplit(B, I) {\n var L1;\n let P = this, { chart: k, chart: { chartWidth: K, chartHeight: $, plotHeight: j, plotLeft: r1, plotTop: a1, scrollablePixelsY: _ = 0, scrollablePixelsX: Y, styledMode: D }, distance: H, options: G, options: { positioner: J }, pointer: F } = P, { scrollLeft: V = 0, scrollTop: Q = 0 } = ((L1 = k.scrollablePlotArea) == null ? void 0 : L1.scrollingContainer) || {}, Z = P.outside && typeof Y != "number" ? b.documentElement.getBoundingClientRect() : { left: V, right: V + K, top: Q, bottom: Q + $ }, t1 = P.getLabel(), n1 = this.renderer || k.renderer, U = !!(k.xAxis[0] && k.xAxis[0].opposite), { left: e1, top: o1 } = F.getChartPosition(), u1 = a1 + Q, M1 = 0, A1 = j - _;\n function l1(y1, B1, T1, F1, X1 = !0) {\n let G1, Q1;\n return T1 ? (G1 = U ? 0 : A1, Q1 = f(y1 - F1 / 2, Z.left, Z.right - F1 - (P.outside ? e1 : 0))) : (G1 = B1 - u1, Q1 = f(Q1 = X1 ? y1 - F1 - H : y1 + H, X1 ? Q1 : Z.left, Z.right)), { x: Q1, y: G1 };\n }\n W(B) && (B = [!1, B]);\n let b1 = B.slice(0, I.length + 1).reduce(function(y1, B1, T1) {\n if (B1 !== !1 && B1 !== "") {\n let F1 = I[T1 - 1] || { isHeader: !0, plotX: I[0].plotX, plotY: j, series: {} }, X1 = F1.isHeader, G1 = X1 ? P : F1.series, Q1 = G1.tt = function(C0, y0, q1) {\n let v1 = C0, { isHeader: k1, series: S1 } = y0;\n if (!v1) {\n let i0 = { padding: G.padding, r: G.borderRadius };\n D || (i0.fill = G.backgroundColor, i0["stroke-width"] = G.borderWidth ?? 1), v1 = n1.label("", 0, 0, G[k1 ? "headerShape" : "shape"], void 0, void 0, G.useHTML).addClass(P.getClassName(y0, !0, k1)).attr(i0).add(t1);\n }\n return v1.isActive = !0, v1.attr({ text: q1 }), D || v1.css(G.style).attr({ stroke: G.borderColor || y0.color || S1.color || "#333333" }), v1;\n }(G1.tt, F1, B1.toString()), K1 = Q1.getBBox(), n0 = K1.width + Q1.strokeWidth();\n X1 && (M1 = K1.height, A1 += M1, U && (u1 -= M1));\n let { anchorX: u0, anchorY: c0 } = function(C0) {\n let y0, q1, { isHeader: v1, plotX: k1 = 0, plotY: S1 = 0, series: i0 } = C0;\n if (v1)\n y0 = Math.max(r1 + k1, r1), q1 = a1 + j / 2;\n else {\n let { xAxis: m0, yAxis: l0 } = i0;\n y0 = m0.pos + f(k1, -H, m0.len + H), i0.shouldShowTooltip(0, l0.pos - a1 + S1, { ignoreX: !0 }) && (q1 = l0.pos + S1);\n }\n return { anchorX: y0 = f(y0, Z.left - H, Z.right + H), anchorY: q1 };\n }(F1);\n if (typeof c0 == "number") {\n let C0 = K1.height + 1, y0 = J ? J.call(P, n0, C0, F1) : l1(u0, c0, X1, n0);\n y1.push({ align: J ? 0 : void 0, anchorX: u0, anchorY: c0, boxWidth: n0, point: F1, rank: x(y0.rank, X1 ? 1 : 0), size: C0, target: y0.y, tt: Q1, x: y0.x });\n } else\n Q1.isActive = !1;\n }\n return y1;\n }, []);\n !J && b1.some((y1) => {\n let { outside: B1 } = P, T1 = (B1 ? e1 : 0) + y1.anchorX;\n return T1 < Z.left && T1 + y1.boxWidth < Z.right || T1 < e1 - Z.left + y1.boxWidth && Z.right - T1 > T1;\n }) && (b1 = b1.map((y1) => {\n let { x: B1, y: T1 } = l1(y1.anchorX, y1.anchorY, y1.point.isHeader, y1.boxWidth, !1);\n return v(y1, { target: T1, x: B1 });\n })), P.cleanSplit(), C(b1, A1);\n let h1 = { left: e1, right: e1 };\n b1.forEach(function(y1) {\n let { x: B1, boxWidth: T1, isHeader: F1 } = y1;\n !F1 && (P.outside && e1 + B1 < h1.left && (h1.left = e1 + B1), !F1 && P.outside && h1.left + T1 > h1.right && (h1.right = e1 + B1));\n }), b1.forEach(function(y1) {\n let { x: B1, anchorX: T1, anchorY: F1, pos: X1, point: { isHeader: G1 } } = y1, Q1 = { visibility: X1 === void 0 ? "hidden" : "inherit", x: B1, y: (X1 || 0) + u1, anchorX: T1, anchorY: F1 };\n if (P.outside && B1 < T1) {\n let K1 = e1 - h1.left;\n K1 > 0 && (G1 || (Q1.x = B1 + K1, Q1.anchorX = T1 + K1), G1 && (Q1.x = (h1.right - h1.left) / 2, Q1.anchorX = T1 + K1));\n }\n y1.tt.attr(Q1);\n });\n let { container: z1, outside: O1, renderer: m1 } = P;\n if (O1 && z1 && m1) {\n let { width: y1, height: B1, x: T1, y: F1 } = t1.getBBox();\n m1.setSize(y1 + T1, B1 + F1, !1), z1.style.left = h1.left + "px", z1.style.top = o1 + "px";\n }\n M && t1.attr({ opacity: t1.opacity === 1 ? 0.999 : 1 });\n }\n drawTracker() {\n if (!this.shouldStickOnContact()) {\n this.tracker && (this.tracker = this.tracker.destroy());\n return;\n }\n let B = this.chart, I = this.label, P = this.shared ? B.hoverPoints : B.hoverPoint;\n if (!I || !P)\n return;\n let k = { x: 0, y: 0, width: 0, height: 0 }, K = this.getAnchor(P), $ = I.getBBox();\n K[0] += B.plotLeft - (I.translateX || 0), K[1] += B.plotTop - (I.translateY || 0), k.x = Math.min(0, K[0]), k.y = Math.min(0, K[1]), k.width = K[0] < 0 ? Math.max(Math.abs(K[0]), $.width - K[0]) : Math.max(Math.abs(K[0]), $.width), k.height = K[1] < 0 ? Math.max(Math.abs(K[1]), $.height - Math.abs(K[1])) : Math.max(Math.abs(K[1]), $.height), this.tracker ? this.tracker.attr(k) : (this.tracker = I.renderer.rect(k).addClass("highcharts-tracker").add(I), B.styledMode || this.tracker.attr({ fill: "rgba(0,0,0,0)" }));\n }\n styledModeFormat(B) {\n return B.replace(\'style="font-size: 0.8em"\', \'class="highcharts-header"\').replace(/style="color:{(point|series)\\.color}"/g, \'class="highcharts-color-{$1.colorIndex} {series.options.className} {point.options.className}"\');\n }\n tooltipFooterHeaderFormatter(B, I) {\n let P = B.series, k = P.tooltipOptions, K = P.xAxis, $ = K && K.dateTime, j = { isFooter: I, labelConfig: B }, r1 = k.xDateFormat, a1 = k[I ? "footerFormat" : "headerFormat"];\n return y(this, "headerFormatter", j, function(_) {\n $ && !r1 && N(B.key) && (r1 = $.getXDateFormat(B.key, k.dateTimeLabelFormats)), $ && r1 && (B.point && B.point.tooltipDateKeys || ["key"]).forEach(function(Y) {\n a1 = a1.replace("{point." + Y + "}", "{point." + Y + ":" + r1 + "}");\n }), P.chart.styledMode && (a1 = this.styledModeFormat(a1)), _.text = u(a1, { point: B, series: P }, this.chart);\n }), j.text;\n }\n update(B) {\n this.destroy(), this.init(this.chart, T(!0, this.options, B));\n }\n updatePosition(B) {\n let { chart: I, container: P, distance: k, options: K, pointer: $, renderer: j } = this, { height: r1 = 0, width: a1 = 0 } = this.getLabel(), { left: _, top: Y, scaleX: D, scaleY: H } = $.getChartPosition(), G = (K.positioner || this.getPosition).call(this, a1, r1, B), J = (B.plotX || 0) + I.plotLeft, F = (B.plotY || 0) + I.plotTop, V;\n j && P && (K.positioner && (G.x += _ - k, G.y += Y - k), V = (K.borderWidth || 0) + 2 * k + 2, j.setSize(a1 + V, r1 + V, !1), (D !== 1 || H !== 1) && (O(P, { transform: `scale(${D}, ${H})` }), J *= D, F *= H), J += _ - G.x, F += Y - G.y), this.move(Math.round(G.x), Math.round(G.y || 0), J, F);\n }\n }\n return (p = q || (q = {})).compose = function(S) {\n E(h, "Core.Tooltip") && g(S, "afterInit", function() {\n let B = this.chart;\n B.options.tooltip && (B.tooltip = new p(B, B.options.tooltip, this));\n });\n }, q;\n }), n(r, "Core/Series/Point.js", [r["Core/Renderer/HTML/AST.js"], r["Core/Animation/AnimationUtilities.js"], r["Core/Defaults.js"], r["Core/Templating.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n let { animObject: c } = i, { defaultOptions: p } = a, { format: d } = s, { addEvent: u, crisp: h, erase: b, extend: M, fireEvent: C, getNestedProperty: g, isArray: f, isFunction: O, isNumber: m, isObject: v, merge: y, pick: z, syncTimeout: N, removeEvent: W, uniqueKey: T } = l;\n class x {\n animateBeforeDestroy() {\n let L = this, w = { x: L.startXPos, opacity: 0 }, q = L.getGraphicalProps();\n q.singular.forEach(function(S) {\n L[S] = L[S].animate(S === "dataLabel" ? { x: L[S].startXPos, y: L[S].startYPos, opacity: 0 } : w);\n }), q.plural.forEach(function(S) {\n L[S].forEach(function(B) {\n B.element && B.animate(M({ x: L.startXPos }, B.startYPos ? { x: B.startXPos, y: B.startYPos } : {}));\n });\n });\n }\n applyOptions(L, w) {\n let q = this.series, S = q.options.pointValKey || q.pointValKey;\n return M(this, L = x.prototype.optionsToObject.call(this, L)), this.options = this.options ? M(this.options, L) : L, L.group && delete this.group, L.dataLabels && delete this.dataLabels, S && (this.y = x.prototype.getNestedProperty.call(this, S)), this.selected && (this.state = "select"), "name" in this && w === void 0 && q.xAxis && q.xAxis.hasNames && (this.x = q.xAxis.nameToX(this)), this.x === void 0 && q ? this.x = w ?? q.autoIncrement() : m(L.x) && q.options.relativeXValue && (this.x = q.autoIncrement(L.x)), this.isNull = this.isValid && !this.isValid(), this.formatPrefix = this.isNull ? "null" : "point", this;\n }\n destroy() {\n if (!this.destroyed) {\n let L = this, w = L.series, q = w.chart, S = w.options.dataSorting, B = q.hoverPoints, I = c(L.series.chart.renderer.globalAnimation), P = () => {\n for (let k in (L.graphic || L.graphics || L.dataLabel || L.dataLabels) && (W(L), L.destroyElements()), L)\n delete L[k];\n };\n L.legendItem && q.legend.destroyItem(L), B && (L.setState(), b(B, L), B.length || (q.hoverPoints = null)), L === q.hoverPoint && L.onMouseOut(), S && S.enabled ? (this.animateBeforeDestroy(), N(P, I.duration)) : P(), q.pointCount--;\n }\n this.destroyed = !0;\n }\n destroyElements(L) {\n let w = this, q = w.getGraphicalProps(L);\n q.singular.forEach(function(S) {\n w[S] = w[S].destroy();\n }), q.plural.forEach(function(S) {\n w[S].forEach(function(B) {\n B && B.element && B.destroy();\n }), delete w[S];\n });\n }\n firePointEvent(L, w, q) {\n let S = this, B = this.series.options;\n S.manageEvent(L), L === "click" && B.allowPointSelect && (q = function(I) {\n !S.destroyed && S.select && S.select(null, I.ctrlKey || I.metaKey || I.shiftKey);\n }), C(S, L, w, q);\n }\n getClassName() {\n return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (this.colorIndex !== void 0 ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", "") : "");\n }\n getGraphicalProps(L) {\n let w, q, S = this, B = [], I = { singular: [], plural: [] };\n for ((L = L || { graphic: 1, dataLabel: 1 }).graphic && B.push("graphic", "connector"), L.dataLabel && B.push("dataLabel", "dataLabelPath", "dataLabelUpper"), q = B.length; q--; )\n S[w = B[q]] && I.singular.push(w);\n return ["graphic", "dataLabel"].forEach(function(P) {\n let k = P + "s";\n L[P] && S[k] && I.plural.push(k);\n }), I;\n }\n getLabelConfig() {\n return { x: this.category, y: this.y, color: this.color, colorIndex: this.colorIndex, key: this.name || this.category, series: this.series, point: this, percentage: this.percentage, total: this.total || this.stackTotal };\n }\n getNestedProperty(L) {\n return L ? L.indexOf("custom.") === 0 ? g(L, this.options) : this[L] : void 0;\n }\n getZone() {\n let L = this.series, w = L.zones, q = L.zoneAxis || "y", S, B = 0;\n for (S = w[0]; this[q] >= S.value; )\n S = w[++B];\n return this.nonZonedColor || (this.nonZonedColor = this.color), S && S.color && !this.options.color ? this.color = S.color : this.color = this.nonZonedColor, S;\n }\n hasNewShapeType() {\n return (this.graphic && (this.graphic.symbolName || this.graphic.element.nodeName)) !== this.shapeType;\n }\n constructor(L, w, q) {\n this.formatPrefix = "point", this.visible = !0, this.series = L, this.applyOptions(w, q), this.id ?? (this.id = T()), this.resolveColor(), L.chart.pointCount++, C(this, "afterInit");\n }\n isValid() {\n return (m(this.x) || this.x instanceof Date) && m(this.y);\n }\n optionsToObject(L) {\n let w = this.series, q = w.options.keys, S = q || w.pointArrayMap || ["y"], B = S.length, I = {}, P, k = 0, K = 0;\n if (m(L) || L === null)\n I[S[0]] = L;\n else if (f(L))\n for (!q && L.length > B && ((P = typeof L[0]) == "string" ? I.name = L[0] : P === "number" && (I.x = L[0]), k++); K < B; )\n q && L[k] === void 0 || (S[K].indexOf(".") > 0 ? x.prototype.setNestedProperty(I, L[k], S[K]) : I[S[K]] = L[k]), k++, K++;\n else\n typeof L == "object" && (I = L, L.dataLabels && (w.hasDataLabels = () => !0), L.marker && (w._hasPointMarkers = !0));\n return I;\n }\n pos(L, w = this.plotY) {\n if (!this.destroyed) {\n let { plotX: q, series: S } = this, { chart: B, xAxis: I, yAxis: P } = S, k = 0, K = 0;\n if (m(q) && m(w))\n return L && (k = I ? I.pos : B.plotLeft, K = P ? P.pos : B.plotTop), B.inverted && I && P ? [P.len - w + K, I.len - q + k] : [q + k, w + K];\n }\n }\n resolveColor() {\n let L = this.series, w = L.chart.options.chart, q = L.chart.styledMode, S, B, I = w.colorCount, P;\n delete this.nonZonedColor, L.options.colorByPoint ? (q || (S = (B = L.options.colors || L.chart.options.colors)[L.colorCounter], I = B.length), P = L.colorCounter, L.colorCounter++, L.colorCounter === I && (L.colorCounter = 0)) : (q || (S = L.color), P = L.colorIndex), this.colorIndex = z(this.options.colorIndex, P), this.color = z(this.options.color, S);\n }\n setNestedProperty(L, w, q) {\n return q.split(".").reduce(function(S, B, I, P) {\n let k = P.length - 1 === I;\n return S[B] = k ? w : v(S[B], !0) ? S[B] : {}, S[B];\n }, L), L;\n }\n shouldDraw() {\n return !this.isNull;\n }\n tooltipFormatter(L) {\n let w = this.series, q = w.tooltipOptions, S = z(q.valueDecimals, ""), B = q.valuePrefix || "", I = q.valueSuffix || "";\n return w.chart.styledMode && (L = w.chart.tooltip.styledModeFormat(L)), (w.pointArrayMap || ["y"]).forEach(function(P) {\n P = "{point." + P, (B || I) && (L = L.replace(RegExp(P + "}", "g"), B + P + "}" + I)), L = L.replace(RegExp(P + "}", "g"), P + ":,." + S + "f}");\n }), d(L, { point: this, series: this.series }, w.chart);\n }\n update(L, w, q, S) {\n let B, I = this, P = I.series, k = I.graphic, K = P.chart, $ = P.options;\n function j() {\n I.applyOptions(L);\n let r1 = k && I.hasMockGraphic, a1 = I.y === null ? !r1 : r1;\n k && a1 && (I.graphic = k.destroy(), delete I.hasMockGraphic), v(L, !0) && (k && k.element && L && L.marker && L.marker.symbol !== void 0 && (I.graphic = k.destroy()), L != null && L.dataLabels && I.dataLabel && (I.dataLabel = I.dataLabel.destroy())), B = I.index, P.updateParallelArrays(I, B), $.data[B] = v($.data[B], !0) || v(L, !0) ? I.options : z(L, $.data[B]), P.isDirty = P.isDirtyData = !0, !P.fixedBox && P.hasCartesianSeries && (K.isDirtyBox = !0), $.legendType === "point" && (K.isDirtyLegend = !0), w && K.redraw(q);\n }\n w = z(w, !0), S === !1 ? j() : I.firePointEvent("update", { options: L }, j);\n }\n remove(L, w) {\n this.series.removePoint(this.series.data.indexOf(this), L, w);\n }\n select(L, w) {\n let q = this, S = q.series, B = S.chart;\n L = z(L, !q.selected), this.selectedStaging = L, q.firePointEvent(L ? "select" : "unselect", { accumulate: w }, function() {\n q.selected = q.options.selected = L, S.options.data[S.data.indexOf(q)] = q.options, q.setState(L && "select"), w || B.getSelectedPoints().forEach(function(I) {\n let P = I.series;\n I.selected && I !== q && (I.selected = I.options.selected = !1, P.options.data[P.data.indexOf(I)] = I.options, I.setState(B.hoverPoints && P.options.inactiveOtherPoints ? "inactive" : ""), I.firePointEvent("unselect"));\n });\n }), delete this.selectedStaging;\n }\n onMouseOver(L) {\n let { inverted: w, pointer: q } = this.series.chart;\n q && (L = L ? q.normalize(L) : q.getChartCoordinatesFromPoint(this, w), q.runPointActions(L, this));\n }\n onMouseOut() {\n let L = this.series.chart;\n this.firePointEvent("mouseOut"), this.series.options.inactiveOtherPoints || (L.hoverPoints || []).forEach(function(w) {\n w.setState();\n }), L.hoverPoints = L.hoverPoint = null;\n }\n manageEvent(L) {\n var S, B, I, P, k, K;\n let w = y(this.series.options.point, this.options), q = (S = w.events) == null ? void 0 : S[L];\n O(q) && (!((B = this.hcEvents) != null && B[L]) || ((P = (I = this.hcEvents) == null ? void 0 : I[L]) == null ? void 0 : P.map(($) => $.fn).indexOf(q)) === -1) ? ((k = this.importedUserEvent) == null || k.call(this), this.importedUserEvent = u(this, L, q)) : this.importedUserEvent && !q && ((K = this.hcEvents) != null && K[L]) && (W(this, L), delete this.hcEvents[L], Object.keys(this.hcEvents) || delete this.importedUserEvent);\n }\n setState(L, w) {\n var Q;\n let q = this.series, S = this.state, B = q.options.states[L || "normal"] || {}, I = p.plotOptions[q.type].marker && q.options.marker, P = I && I.enabled === !1, k = I && I.states && I.states[L || "normal"] || {}, K = k.enabled === !1, $ = this.marker || {}, j = q.chart, r1 = I && q.markerAttribs, a1 = q.halo, _, Y, D, H = q.stateMarkerGraphic, G;\n if ((L = L || "") === this.state && !w || this.selected && L !== "select" || B.enabled === !1 || L && (K || P && k.enabled === !1) || L && $.states && $.states[L] && $.states[L].enabled === !1)\n return;\n if (this.state = L, r1 && (_ = q.markerAttribs(this, L)), this.graphic && !this.hasMockGraphic) {\n if (S && this.graphic.removeClass("highcharts-point-" + S), L && this.graphic.addClass("highcharts-point-" + L), !j.styledMode) {\n Y = q.pointAttribs(this, L), D = z(j.options.chart.animation, B.animation);\n let Z = Y.opacity;\n q.options.inactiveOtherPoints && m(Z) && (this.dataLabels || []).forEach(function(t1) {\n t1 && !t1.hasClass("highcharts-data-label-hidden") && (t1.animate({ opacity: Z }, D), t1.connector && t1.connector.animate({ opacity: Z }, D));\n }), this.graphic.animate(Y, D);\n }\n _ && this.graphic.animate(_, z(j.options.chart.animation, k.animation, I.animation)), H && H.hide();\n } else\n L && k && (G = $.symbol || q.symbol, H && H.currentSymbol !== G && (H = H.destroy()), _ && (H ? H[w ? "animate" : "attr"]({ x: _.x, y: _.y }) : G && (q.stateMarkerGraphic = H = j.renderer.symbol(G, _.x, _.y, _.width, _.height).add(q.markerGroup), H.currentSymbol = G)), !j.styledMode && H && this.state !== "inactive" && H.attr(q.pointAttribs(this, L))), H && (H[L && this.isInside ? "show" : "hide"](), H.element.point = this, H.addClass(this.getClassName(), !0));\n let J = B.halo, F = this.graphic || H, V = F && F.visibility || "inherit";\n J && J.size && F && V !== "hidden" && !this.isCluster ? (a1 || (q.halo = a1 = j.renderer.path().add(F.parentGroup)), a1.show()[w ? "animate" : "attr"]({ d: this.haloPath(J.size) }), a1.attr({ class: "highcharts-halo highcharts-color-" + z(this.colorIndex, q.colorIndex) + (this.className ? " " + this.className : ""), visibility: V, zIndex: -1 }), a1.point = this, j.styledMode || a1.attr(M({ fill: this.color || q.color, "fill-opacity": J.opacity }, o.filterUserAttributes(J.attributes || {})))) : (Q = a1 == null ? void 0 : a1.point) != null && Q.haloPath && !a1.point.destroyed && a1.animate({ d: a1.point.haloPath(0) }, null, a1.hide), C(this, "afterSetState", { state: L });\n }\n haloPath(L) {\n let w = this.pos();\n return w ? this.series.chart.renderer.symbols.circle(h(w[0], 1) - L, w[1] - L, 2 * L, 2 * L) : [];\n }\n }\n return x;\n }), n(r, "Core/Pointer.js", [r["Core/Color/Color.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n var s;\n let { parse: l } = o, { charts: c, composed: p, isTouchDevice: d } = i, { addEvent: u, attr: h, css: b, extend: M, find: C, fireEvent: g, isNumber: f, isObject: O, objectEach: m, offset: v, pick: y, pushUnique: z, splat: N } = a;\n class W {\n applyInactiveState(x) {\n let E = [], L;\n (x || []).forEach(function(w) {\n L = w.series, E.push(L), L.linkedParent && E.push(L.linkedParent), L.linkedSeries && (E = E.concat(L.linkedSeries)), L.navigatorSeries && E.push(L.navigatorSeries);\n }), this.chart.series.forEach(function(w) {\n E.indexOf(w) === -1 ? w.setState("inactive", !0) : w.options.inactiveOtherPoints && w.setAllPointsToState("inactive");\n });\n }\n destroy() {\n let x = this;\n this.eventsToUnbind.forEach((E) => E()), this.eventsToUnbind = [], !i.chartCount && (W.unbindDocumentMouseUp && W.unbindDocumentMouseUp.forEach((E) => E()), W.unbindDocumentTouchEnd && (W.unbindDocumentTouchEnd = W.unbindDocumentTouchEnd())), clearInterval(x.tooltipTimeout), m(x, function(E, L) {\n x[L] = void 0;\n });\n }\n getSelectionMarkerAttrs(x, E) {\n let L = { args: { chartX: x, chartY: E }, attrs: {}, shapeType: "rect" };\n return g(this, "getSelectionMarkerAttrs", L, (w) => {\n let q, { chart: S, zoomHor: B, zoomVert: I } = this, { mouseDownX: P = 0, mouseDownY: k = 0 } = S, K = w.attrs;\n K.x = S.plotLeft, K.y = S.plotTop, K.width = B ? 1 : S.plotWidth, K.height = I ? 1 : S.plotHeight, B && (q = x - P, K.width = Math.max(1, Math.abs(q)), K.x = (q > 0 ? 0 : q) + P), I && (q = E - k, K.height = Math.max(1, Math.abs(q)), K.y = (q > 0 ? 0 : q) + k);\n }), L;\n }\n drag(x) {\n let { chart: E } = this, { mouseDownX: L = 0, mouseDownY: w = 0 } = E, { panning: q, panKey: S, selectionMarkerFill: B } = E.options.chart, I = E.plotLeft, P = E.plotTop, k = E.plotWidth, K = E.plotHeight, $ = O(q) ? q.enabled : q, j = S && x[`${S}Key`], r1 = x.chartX, a1 = x.chartY, _, Y = this.selectionMarker;\n if ((!Y || !Y.touch) && (r1 < I ? r1 = I : r1 > I + k && (r1 = I + k), a1 < P ? a1 = P : a1 > P + K && (a1 = P + K), this.hasDragged = Math.sqrt(Math.pow(L - r1, 2) + Math.pow(w - a1, 2)), this.hasDragged > 10)) {\n _ = E.isInsidePlot(L - I, w - P, { visiblePlotOnly: !0 });\n let { shapeType: D, attrs: H } = this.getSelectionMarkerAttrs(r1, a1);\n (E.hasCartesianSeries || E.mapView) && this.hasZoom && _ && !j && !Y && (this.selectionMarker = Y = E.renderer[D](), Y.attr({ class: "highcharts-selection-marker", zIndex: 7 }).add(), E.styledMode || Y.attr({ fill: B || l("#334eff").setOpacity(0.25).get() })), Y && Y.attr(H), _ && !Y && $ && E.pan(x, q);\n }\n }\n dragStart(x) {\n let E = this.chart;\n E.mouseIsDown = x.type, E.cancelClick = !1, E.mouseDownX = x.chartX, E.mouseDownY = x.chartY;\n }\n getSelectionBox(x) {\n let E = { args: { marker: x }, result: x.getBBox() };\n return g(this, "getSelectionBox", E), E.result;\n }\n drop(x) {\n let E, { chart: L, selectionMarker: w } = this;\n for (let q of L.axes)\n q.isPanning && (q.isPanning = !1, (q.options.startOnTick || q.options.endOnTick || q.series.some((S) => S.boosted)) && (q.forceRedraw = !0, q.setExtremes(q.userMin, q.userMax, !1), E = !0));\n if (E && L.redraw(), w && x) {\n if (this.hasDragged) {\n let q = this.getSelectionBox(w);\n L.transform({ axes: L.axes.filter((S) => S.zoomEnabled && (S.coll === "xAxis" && this.zoomX || S.coll === "yAxis" && this.zoomY)), selection: { originalEvent: x, xAxis: [], yAxis: [], ...q }, from: q });\n }\n f(L.index) && (this.selectionMarker = w.destroy());\n }\n L && f(L.index) && (b(L.container, { cursor: L._cursor }), L.cancelClick = this.hasDragged > 10, L.mouseIsDown = !1, this.hasDragged = 0, this.pinchDown = []);\n }\n findNearestKDPoint(x, E, L) {\n let w;\n return x.forEach(function(q) {\n let S = !(q.noSharedTooltip && E) && 0 > q.options.findNearestPointBy.indexOf("y"), B = q.searchPoint(L, S);\n O(B, !0) && B.series && (!O(w, !0) || function(I, P) {\n var j, r1;\n let k = I.distX - P.distX, K = I.dist - P.dist, $ = ((j = P.series.group) == null ? void 0 : j.zIndex) - ((r1 = I.series.group) == null ? void 0 : r1.zIndex);\n return k !== 0 && E ? k : K !== 0 ? K : $ !== 0 ? $ : I.series.index > P.series.index ? -1 : 1;\n }(w, B) > 0) && (w = B);\n }), w;\n }\n getChartCoordinatesFromPoint(x, E) {\n let { xAxis: L, yAxis: w } = x.series, q = x.shapeArgs;\n if (L && w) {\n let S = x.clientX ?? x.plotX ?? 0, B = x.plotY || 0;\n return x.isNode && q && f(q.x) && f(q.y) && (S = q.x, B = q.y), E ? { chartX: w.len + w.pos - B, chartY: L.len + L.pos - S } : { chartX: S + L.pos, chartY: B + w.pos };\n }\n if (q && q.x && q.y)\n return { chartX: q.x, chartY: q.y };\n }\n getChartPosition() {\n if (this.chartPosition)\n return this.chartPosition;\n let { container: x } = this.chart, E = v(x);\n this.chartPosition = { left: E.left, top: E.top, scaleX: 1, scaleY: 1 };\n let { offsetHeight: L, offsetWidth: w } = x;\n return w > 2 && L > 2 && (this.chartPosition.scaleX = E.width / w, this.chartPosition.scaleY = E.height / L), this.chartPosition;\n }\n getCoordinates(x) {\n let E = { xAxis: [], yAxis: [] };\n for (let L of this.chart.axes)\n E[L.isXAxis ? "xAxis" : "yAxis"].push({ axis: L, value: L.toValue(x[L.horiz ? "chartX" : "chartY"]) });\n return E;\n }\n getHoverData(x, E, L, w, q, S) {\n let B = [], I = function(j) {\n return j.visible && !(!q && j.directTouch) && y(j.options.enableMouseTracking, !0);\n }, P = E, k, K = { chartX: S ? S.chartX : void 0, chartY: S ? S.chartY : void 0, shared: q };\n g(this, "beforeGetHoverData", K), k = P && !P.stickyTracking ? [P] : L.filter((j) => j.stickyTracking && (K.filter || I)(j));\n let $ = w && x || !S ? x : this.findNearestKDPoint(k, q, S);\n return P = $ && $.series, $ && (q && !P.noSharedTooltip ? (k = L.filter(function(j) {\n return K.filter ? K.filter(j) : I(j) && !j.noSharedTooltip;\n })).forEach(function(j) {\n let r1 = C(j.points, function(a1) {\n return a1.x === $.x && !a1.isNull;\n });\n O(r1) && (j.boosted && j.boost && (r1 = j.boost.getPoint(r1)), B.push(r1));\n }) : B.push($)), g(this, "afterGetHoverData", K = { hoverPoint: $ }), { hoverPoint: K.hoverPoint, hoverSeries: P, hoverPoints: B };\n }\n getPointFromEvent(x) {\n let E = x.target, L;\n for (; E && !L; )\n L = E.point, E = E.parentNode;\n return L;\n }\n onTrackerMouseOut(x) {\n let E = this.chart, L = x.relatedTarget, w = E.hoverSeries;\n this.isDirectTouch = !1, !w || !L || w.stickyTracking || this.inClass(L, "highcharts-tooltip") || this.inClass(L, "highcharts-series-" + w.index) && this.inClass(L, "highcharts-tracker") || w.onMouseOut();\n }\n inClass(x, E) {\n let L = x, w;\n for (; L; ) {\n if (w = h(L, "class")) {\n if (w.indexOf(E) !== -1)\n return !0;\n if (w.indexOf("highcharts-container") !== -1)\n return !1;\n }\n L = L.parentElement;\n }\n }\n constructor(x, E) {\n var L;\n this.hasDragged = 0, this.pointerCaptureEventsToUnbind = [], this.eventsToUnbind = [], this.options = E, this.chart = x, this.runChartClick = !!((L = E.chart.events) != null && L.click), this.pinchDown = [], this.setDOMEvents(), g(this, "afterInit");\n }\n normalize(x, E) {\n let L = x.touches, w = L ? L.length ? L.item(0) : y(L.changedTouches, x.changedTouches)[0] : x;\n E || (E = this.getChartPosition());\n let q = w.pageX - E.left, S = w.pageY - E.top;\n return M(x, { chartX: Math.round(q /= E.scaleX), chartY: Math.round(S /= E.scaleY) });\n }\n onContainerClick(x) {\n let E = this.chart, L = E.hoverPoint, w = this.normalize(x), q = E.plotLeft, S = E.plotTop;\n !E.cancelClick && (L && this.inClass(w.target, "highcharts-tracker") ? (g(L.series, "click", M(w, { point: L })), E.hoverPoint && L.firePointEvent("click", w)) : (M(w, this.getCoordinates(w)), E.isInsidePlot(w.chartX - q, w.chartY - S, { visiblePlotOnly: !0 }) && g(E, "click", w)));\n }\n onContainerMouseDown(x) {\n var L;\n let E = (1 & (x.buttons || x.button)) == 1;\n x = this.normalize(x), i.isFirefox && x.button !== 0 && this.onContainerMouseMove(x), (x.button === void 0 || E) && (this.zoomOption(x), E && ((L = x.preventDefault) == null || L.call(x)), this.dragStart(x));\n }\n onContainerMouseLeave(x) {\n let { pointer: E } = c[y(W.hoverChartIndex, -1)] || {};\n x = this.normalize(x), this.onContainerMouseMove(x), E && !this.inClass(x.relatedTarget, "highcharts-tooltip") && (E.reset(), E.chartPosition = void 0);\n }\n onContainerMouseEnter() {\n delete this.chartPosition;\n }\n onContainerMouseMove(x) {\n let E = this.chart, L = E.tooltip, w = this.normalize(x);\n this.setHoverChartIndex(x), (E.mouseIsDown === "mousedown" || this.touchSelect(w)) && this.drag(w), !E.openMenu && (this.inClass(w.target, "highcharts-tracker") || E.isInsidePlot(w.chartX - E.plotLeft, w.chartY - E.plotTop, { visiblePlotOnly: !0 })) && !(L && L.shouldStickOnContact(w)) && (this.inClass(w.target, "highcharts-no-tooltip") ? this.reset(!1, 0) : this.runPointActions(w));\n }\n onDocumentTouchEnd(x) {\n this.onDocumentMouseUp(x);\n }\n onContainerTouchMove(x) {\n this.touchSelect(x) ? this.onContainerMouseMove(x) : this.touch(x);\n }\n onContainerTouchStart(x) {\n this.touchSelect(x) ? this.onContainerMouseDown(x) : (this.zoomOption(x), this.touch(x, !0));\n }\n onDocumentMouseMove(x) {\n let E = this.chart, L = E.tooltip, w = this.chartPosition, q = this.normalize(x, w);\n !w || E.isInsidePlot(q.chartX - E.plotLeft, q.chartY - E.plotTop, { visiblePlotOnly: !0 }) || L && L.shouldStickOnContact(q) || q.target !== E.container.ownerDocument && this.inClass(q.target, "highcharts-tracker") || this.reset();\n }\n onDocumentMouseUp(x) {\n var E, L;\n (L = (E = c[y(W.hoverChartIndex, -1)]) == null ? void 0 : E.pointer) == null || L.drop(x);\n }\n pinch(x) {\n let E = this, { chart: L, hasZoom: w, lastTouches: q } = E, S = [].map.call(x.touches || [], (K) => E.normalize(K)), B = S.length, I = B === 1 && (E.inClass(x.target, "highcharts-tracker") && L.runTrackerClick || E.runChartClick), P = L.tooltip, k = B === 1 && y(P == null ? void 0 : P.options.followTouchMove, !0);\n B > 1 ? E.initiated = !0 : k && (E.initiated = !1), w && E.initiated && !I && x.cancelable !== !1 && x.preventDefault(), x.type === "touchstart" ? (E.pinchDown = S, E.res = !0, L.mouseDownX = x.chartX) : k ? this.runPointActions(E.normalize(x)) : q && (g(L, "touchpan", { originalEvent: x, touches: S }, () => {\n let K = ($) => {\n let j = $[0], r1 = $[1] || j;\n return { x: j.chartX, y: j.chartY, width: r1.chartX - j.chartX, height: r1.chartY - j.chartY };\n };\n L.transform({ axes: L.axes.filter(($) => $.zoomEnabled && (this.zoomHor && $.horiz || this.zoomVert && !$.horiz)), to: K(S), from: K(q), trigger: x.type });\n }), E.res && (E.res = !1, this.reset(!1, 0))), E.lastTouches = S;\n }\n reset(x, E) {\n let L = this.chart, w = L.hoverSeries, q = L.hoverPoint, S = L.hoverPoints, B = L.tooltip, I = B && B.shared ? S : q;\n x && I && N(I).forEach(function(P) {\n P.series.isCartesian && P.plotX === void 0 && (x = !1);\n }), x ? B && I && N(I).length && (B.refresh(I), B.shared && S ? S.forEach(function(P) {\n P.setState(P.state, !0), P.series.isCartesian && (P.series.xAxis.crosshair && P.series.xAxis.drawCrosshair(null, P), P.series.yAxis.crosshair && P.series.yAxis.drawCrosshair(null, P));\n }) : q && (q.setState(q.state, !0), L.axes.forEach(function(P) {\n P.crosshair && q.series[P.coll] === P && P.drawCrosshair(null, q);\n }))) : (q && q.onMouseOut(), S && S.forEach(function(P) {\n P.setState();\n }), w && w.onMouseOut(), B && B.hide(E), this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()), L.axes.forEach(function(P) {\n P.hideCrosshair();\n }), L.hoverPoints = L.hoverPoint = void 0);\n }\n runPointActions(x, E, L) {\n let w = this.chart, q = w.series, S = w.tooltip && w.tooltip.options.enabled ? w.tooltip : void 0, B = !!S && S.shared, I = E || w.hoverPoint, P = I && I.series || w.hoverSeries, k = (!x || x.type !== "touchmove") && (!!E || P && P.directTouch && this.isDirectTouch), K = this.getHoverData(I, P, q, k, B, x);\n I = K.hoverPoint, P = K.hoverSeries;\n let $ = K.hoverPoints, j = P && P.tooltipOptions.followPointer && !P.tooltipOptions.split, r1 = B && P && !P.noSharedTooltip;\n if (I && (L || I !== w.hoverPoint || S && S.isHidden)) {\n if ((w.hoverPoints || []).forEach(function(a1) {\n $.indexOf(a1) === -1 && a1.setState();\n }), w.hoverSeries !== P && P.onMouseOver(), this.applyInactiveState($), ($ || []).forEach(function(a1) {\n a1.setState("hover");\n }), w.hoverPoint && w.hoverPoint.firePointEvent("mouseOut"), !I.series)\n return;\n w.hoverPoints = $, w.hoverPoint = I, I.firePointEvent("mouseOver", void 0, () => {\n S && I && S.refresh(r1 ? $ : I, x);\n });\n } else if (j && S && !S.isHidden) {\n let a1 = S.getAnchor([{}], x);\n w.isInsidePlot(a1[0], a1[1], { visiblePlotOnly: !0 }) && S.updatePosition({ plotX: a1[0], plotY: a1[1] });\n }\n this.unDocMouseMove || (this.unDocMouseMove = u(w.container.ownerDocument, "mousemove", (a1) => {\n var _, Y;\n return (Y = (_ = c[W.hoverChartIndex ?? -1]) == null ? void 0 : _.pointer) == null ? void 0 : Y.onDocumentMouseMove(a1);\n }), this.eventsToUnbind.push(this.unDocMouseMove)), w.axes.forEach(function(a1) {\n let _, Y = y((a1.crosshair || {}).snap, !0);\n !Y || (_ = w.hoverPoint) && _.series[a1.coll] === a1 || (_ = C($, (D) => D.series && D.series[a1.coll] === a1)), _ || !Y ? a1.drawCrosshair(x, _) : a1.hideCrosshair();\n });\n }\n setDOMEvents() {\n let x = this.chart.container, E = x.ownerDocument;\n x.onmousedown = this.onContainerMouseDown.bind(this), x.onmousemove = this.onContainerMouseMove.bind(this), x.onclick = this.onContainerClick.bind(this), this.eventsToUnbind.push(u(x, "mouseenter", this.onContainerMouseEnter.bind(this)), u(x, "mouseleave", this.onContainerMouseLeave.bind(this))), W.unbindDocumentMouseUp || (W.unbindDocumentMouseUp = []), W.unbindDocumentMouseUp.push(u(E, "mouseup", this.onDocumentMouseUp.bind(this)));\n let L = this.chart.renderTo.parentElement;\n for (; L && L.tagName !== "BODY"; )\n this.eventsToUnbind.push(u(L, "scroll", () => {\n delete this.chartPosition;\n })), L = L.parentElement;\n this.eventsToUnbind.push(u(x, "touchstart", this.onContainerTouchStart.bind(this), { passive: !1 }), u(x, "touchmove", this.onContainerTouchMove.bind(this), { passive: !1 })), W.unbindDocumentTouchEnd || (W.unbindDocumentTouchEnd = u(E, "touchend", this.onDocumentTouchEnd.bind(this), { passive: !1 })), this.setPointerCapture(), u(this.chart, "redraw", this.setPointerCapture.bind(this));\n }\n setPointerCapture() {\n var q, S;\n if (!d)\n return;\n let x = this.pointerCaptureEventsToUnbind, E = this.chart, L = E.container, w = y((q = E.options.tooltip) == null ? void 0 : q.followTouchMove, !0) && E.series.some((B) => B.options.findNearestPointBy.indexOf("y") > -1);\n !this.hasPointerCapture && w ? (x.push(u(L, "pointerdown", (B) => {\n var I, P;\n (I = B.target) != null && I.hasPointerCapture(B.pointerId) && ((P = B.target) == null || P.releasePointerCapture(B.pointerId));\n }), u(L, "pointermove", (B) => {\n var I, P;\n (P = (I = E.pointer) == null ? void 0 : I.getPointFromEvent(B)) == null || P.onMouseOver(B);\n })), E.styledMode || b(L, { "touch-action": "none" }), L.className += " highcharts-no-touch-action", this.hasPointerCapture = !0) : this.hasPointerCapture && !w && (x.forEach((B) => B()), x.length = 0, E.styledMode || b(L, { "touch-action": y((S = E.options.chart.style) == null ? void 0 : S["touch-action"], "manipulation") }), L.className = L.className.replace(" highcharts-no-touch-action", ""), this.hasPointerCapture = !1);\n }\n setHoverChartIndex(x) {\n var w;\n let E = this.chart, L = i.charts[y(W.hoverChartIndex, -1)];\n if (L && L !== E) {\n let q = { relatedTarget: E.container };\n x && !(x != null && x.relatedTarget) && (x = { ...q, ...x }), (w = L.pointer) == null || w.onContainerMouseLeave(x || q);\n }\n L && L.mouseIsDown || (W.hoverChartIndex = E.index);\n }\n touch(x, E) {\n let L, { chart: w, pinchDown: q = [] } = this;\n this.setHoverChartIndex(), (x = this.normalize(x)).touches.length === 1 ? w.isInsidePlot(x.chartX - w.plotLeft, x.chartY - w.plotTop, { visiblePlotOnly: !0 }) && !w.openMenu ? (E && this.runPointActions(x), x.type === "touchmove" && (L = !!q[0] && Math.pow(q[0].chartX - x.chartX, 2) + Math.pow(q[0].chartY - x.chartY, 2) >= 16), y(L, !0) && this.pinch(x)) : E && this.reset() : x.touches.length === 2 && this.pinch(x);\n }\n touchSelect(x) {\n return !!(this.chart.zooming.singleTouch && x.touches && x.touches.length === 1);\n }\n zoomOption(x) {\n let E = this.chart, L = E.inverted, w = E.zooming.type || "", q, S;\n /touch/.test(x.type) && (w = y(E.zooming.pinchType, w)), this.zoomX = q = /x/.test(w), this.zoomY = S = /y/.test(w), this.zoomHor = q && !L || S && L, this.zoomVert = S && !L || q && L, this.hasZoom = q || S;\n }\n }\n return (s = W || (W = {})).compose = function(T) {\n z(p, "Core.Pointer") && u(T, "beforeRender", function() {\n this.pointer = new s(this, this.options);\n });\n }, W;\n }), n(r, "Core/Legend/LegendSymbol.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { extend: a, merge: s, pick: l } = o;\n return function(c) {\n function p(d, u, h) {\n var L, w;\n let b = this.legendItem = this.legendItem || {}, { chart: M, options: C } = this, { baseline: g = 0, symbolWidth: f, symbolHeight: O } = d, m = this.symbol || "circle", v = O / 2, y = M.renderer, z = b.group, N = g - Math.round((((L = d.fontMetrics) == null ? void 0 : L.b) || O) * (h ? 0.4 : 0.3)), W = {}, T, x = C.marker, E = 0;\n if (M.styledMode || (W["stroke-width"] = Math.min(C.lineWidth || 0, 24), C.dashStyle ? W.dashstyle = C.dashStyle : C.linecap === "square" || (W["stroke-linecap"] = "round")), b.line = y.path().addClass("highcharts-graph").attr(W).add(z), h && (b.area = y.path().addClass("highcharts-area").add(z)), W["stroke-linecap"] && (E = Math.min(b.line.strokeWidth(), f) / 2), f) {\n let q = [["M", E, N], ["L", f - E, N]];\n b.line.attr({ d: q }), (w = b.area) == null || w.attr({ d: [...q, ["L", f - E, g], ["L", E, g]] });\n }\n if (x && x.enabled !== !1 && f) {\n let q = Math.min(l(x.radius, v), v);\n m.indexOf("url") === 0 && (x = s(x, { width: O, height: O }), q = 0), b.symbol = T = y.symbol(m, f / 2 - q, N - q, 2 * q, 2 * q, a({ context: "legend" }, x)).addClass("highcharts-point").add(z), T.isMarker = !0;\n }\n }\n c.areaMarker = function(d, u) {\n p.call(this, d, u, !0);\n }, c.lineMarker = p, c.rectangle = function(d, u) {\n let h = u.legendItem || {}, b = d.options, M = d.symbolHeight, C = b.squareSymbol, g = C ? M : d.symbolWidth;\n h.symbol = this.chart.renderer.rect(C ? (d.symbolWidth - M) / 2 : 0, d.baseline - M + 1, g, M, l(d.options.symbolRadius, M / 2)).addClass("highcharts-point").attr({ zIndex: 3 }).add(h.group);\n };\n }(i || (i = {})), i;\n }), n(r, "Core/Series/SeriesDefaults.js", [], function() {\n return { lineWidth: 2, allowPointSelect: !1, crisp: !0, showCheckbox: !1, animation: { duration: 1e3 }, enableMouseTracking: !0, events: {}, marker: { enabledThreshold: 2, lineColor: "#ffffff", lineWidth: 0, radius: 4, states: { normal: { animation: !0 }, hover: { animation: { duration: 150 }, enabled: !0, radiusPlus: 2, lineWidthPlus: 1 }, select: { fillColor: "#cccccc", lineColor: "#000000", lineWidth: 2 } } }, point: { events: {} }, dataLabels: { animation: {}, align: "center", borderWidth: 0, defer: !0, formatter: function() {\n let { numberFormatter: o } = this.series.chart;\n return typeof this.y != "number" ? "" : o(this.y, -1);\n }, padding: 5, style: { fontSize: "0.7em", fontWeight: "bold", color: "contrast", textOutline: "1px contrast" }, verticalAlign: "bottom", x: 0, y: 0 }, cropThreshold: 300, opacity: 1, pointRange: 0, softThreshold: !0, states: { normal: { animation: !0 }, hover: { animation: { duration: 150 }, lineWidthPlus: 1, marker: {}, halo: { size: 10, opacity: 0.25 } }, select: { animation: { duration: 0 } }, inactive: { animation: { duration: 150 }, opacity: 0.2 } }, stickyTracking: !0, turboThreshold: 1e3, findNearestPointBy: "x" };\n }), n(r, "Core/Series/SeriesRegistry.js", [r["Core/Globals.js"], r["Core/Defaults.js"], r["Core/Series/Point.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n var l;\n let { defaultOptions: c } = i, { extend: p, extendClass: d, merge: u } = s;\n return function(h) {\n function b(M, C) {\n let g = c.plotOptions || {}, f = C.defaultOptions, O = C.prototype;\n return O.type = M, O.pointClass || (O.pointClass = a), !h.seriesTypes[M] && (f && (g[M] = f), h.seriesTypes[M] = C, !0);\n }\n h.seriesTypes = o.seriesTypes, h.registerSeriesType = b, h.seriesType = function(M, C, g, f, O) {\n let m = c.plotOptions || {};\n if (C = C || "", m[M] = u(m[C], g), delete h.seriesTypes[M], b(M, d(h.seriesTypes[C] || function() {\n }, f)), h.seriesTypes[M].prototype.type = M, O) {\n class v extends a {\n }\n p(v.prototype, O), h.seriesTypes[M].prototype.pointClass = v;\n }\n return h.seriesTypes[M];\n };\n }(l || (l = {})), l;\n }), n(r, "Core/Series/Series.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Defaults.js"], r["Core/Foundation.js"], r["Core/Globals.js"], r["Core/Legend/LegendSymbol.js"], r["Core/Series/Point.js"], r["Core/Series/SeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Renderer/SVG/SVGElement.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p, d, u, h) {\n let { animObject: b, setAnimation: M } = o, { defaultOptions: C } = i, { registerEventOptions: g } = a, { svg: f, win: O } = s, { seriesTypes: m } = d, { arrayMax: v, arrayMin: y, clamp: z, correctFloat: N, crisp: W, defined: T, destroyObjectProperties: x, diffObjects: E, erase: L, error: w, extend: q, find: S, fireEvent: B, getClosestDistance: I, getNestedProperty: P, insertItem: k, isArray: K, isNumber: $, isString: j, merge: r1, objectEach: a1, pick: _, removeEvent: Y, splat: D, syncTimeout: H } = h;\n class G {\n constructor() {\n this.zoneAxis = "y";\n }\n init(F, V) {\n let Q;\n B(this, "init", { options: V });\n let Z = this, t1 = F.series;\n this.eventsToUnbind = [], Z.chart = F, Z.options = Z.setOptions(V);\n let n1 = Z.options, U = n1.visible !== !1;\n Z.linkedSeries = [], Z.bindAxes(), q(Z, { name: n1.name, state: "", visible: U, selected: n1.selected === !0 }), g(this, n1);\n let e1 = n1.events;\n (e1 && e1.click || n1.point && n1.point.events && n1.point.events.click || n1.allowPointSelect) && (F.runTrackerClick = !0), Z.getColor(), Z.getSymbol(), Z.parallelArrays.forEach(function(o1) {\n Z[o1 + "Data"] || (Z[o1 + "Data"] = []);\n }), Z.isCartesian && (F.hasCartesianSeries = !0), t1.length && (Q = t1[t1.length - 1]), Z._i = _(Q && Q._i, -1) + 1, Z.opacity = Z.options.opacity, F.orderItems("series", k(this, t1)), n1.dataSorting && n1.dataSorting.enabled ? Z.setDataSortingOptions() : Z.points || Z.data || Z.setData(n1.data, !1), B(this, "afterInit");\n }\n is(F) {\n return m[F] && this instanceof m[F];\n }\n bindAxes() {\n let F, V = this, Q = V.options, Z = V.chart;\n B(this, "bindAxes", null, function() {\n (V.axisTypes || []).forEach(function(t1) {\n (Z[t1] || []).forEach(function(n1) {\n F = n1.options, (_(Q[t1], 0) === n1.index || Q[t1] !== void 0 && Q[t1] === F.id) && (k(V, n1.series), V[t1] = n1, n1.isDirty = !0);\n }), V[t1] || V.optionalAxis === t1 || w(18, !0, Z);\n });\n }), B(this, "afterBindAxes");\n }\n updateParallelArrays(F, V, Q) {\n let Z = F.series, t1 = $(V) ? function(n1) {\n let U = n1 === "y" && Z.toYData ? Z.toYData(F) : F[n1];\n Z[n1 + "Data"][V] = U;\n } : function(n1) {\n Array.prototype[V].apply(Z[n1 + "Data"], Q);\n };\n Z.parallelArrays.forEach(t1);\n }\n hasData() {\n return this.visible && this.dataMax !== void 0 && this.dataMin !== void 0 || this.visible && this.yData && this.yData.length > 0;\n }\n hasMarkerChanged(F, V) {\n let Q = F.marker, Z = V.marker || {};\n return Q && (Z.enabled && !Q.enabled || Z.symbol !== Q.symbol || Z.height !== Q.height || Z.width !== Q.width);\n }\n autoIncrement(F) {\n let V = this.options, Q = V.pointIntervalUnit, Z = V.relativeXValue, t1 = this.chart.time, n1 = this.xIncrement, U, e1;\n return n1 = _(n1, V.pointStart, 0), this.pointInterval = e1 = _(this.pointInterval, V.pointInterval, 1), Z && $(F) && (e1 *= F), Q && (U = new t1.Date(n1), Q === "day" ? t1.set("Date", U, t1.get("Date", U) + e1) : Q === "month" ? t1.set("Month", U, t1.get("Month", U) + e1) : Q === "year" && t1.set("FullYear", U, t1.get("FullYear", U) + e1), e1 = U.getTime() - n1), Z && $(F) ? n1 + e1 : (this.xIncrement = n1 + e1, n1);\n }\n setDataSortingOptions() {\n let F = this.options;\n q(this, { requireSorting: !1, sorted: !1, enabledDataSorting: !0, allowDG: !1 }), T(F.pointRange) || (F.pointRange = 1);\n }\n setOptions(F) {\n var z1, O1;\n let V, Q = this.chart, Z = Q.options.plotOptions, t1 = Q.userOptions || {}, n1 = r1(F), U = Q.styledMode, e1 = { plotOptions: Z, userOptions: n1 };\n B(this, "setOptions", e1);\n let o1 = e1.plotOptions[this.type], u1 = t1.plotOptions || {}, M1 = u1.series || {}, A1 = C.plotOptions[this.type] || {}, l1 = u1[this.type] || {};\n this.userOptions = e1.userOptions;\n let b1 = r1(o1, Z.series, l1, n1);\n this.tooltipOptions = r1(C.tooltip, (z1 = C.plotOptions.series) == null ? void 0 : z1.tooltip, A1 == null ? void 0 : A1.tooltip, Q.userOptions.tooltip, (O1 = u1.series) == null ? void 0 : O1.tooltip, l1.tooltip, n1.tooltip), this.stickyTracking = _(n1.stickyTracking, l1.stickyTracking, M1.stickyTracking, !!this.tooltipOptions.shared && !this.noSharedTooltip || b1.stickyTracking), o1.marker === null && delete b1.marker, this.zoneAxis = b1.zoneAxis || "y";\n let h1 = this.zones = (b1.zones || []).map((m1) => ({ ...m1 }));\n return (b1.negativeColor || b1.negativeFillColor) && !b1.zones && (V = { value: b1[this.zoneAxis + "Threshold"] || b1.threshold || 0, className: "highcharts-negative" }, U || (V.color = b1.negativeColor, V.fillColor = b1.negativeFillColor), h1.push(V)), h1.length && T(h1[h1.length - 1].value) && h1.push(U ? {} : { color: this.color, fillColor: this.fillColor }), B(this, "afterSetOptions", { options: b1 }), b1;\n }\n getName() {\n return _(this.options.name, "Series " + (this.index + 1));\n }\n getCyclic(F, V, Q) {\n let Z, t1, n1 = this.chart, U = `${F}Index`, e1 = `${F}Counter`, o1 = (Q == null ? void 0 : Q.length) || n1.options.chart.colorCount;\n !V && (T(t1 = _(F === "color" ? this.options.colorIndex : void 0, this[U])) ? Z = t1 : (n1.series.length || (n1[e1] = 0), Z = n1[e1] % o1, n1[e1] += 1), Q && (V = Q[Z])), Z !== void 0 && (this[U] = Z), this[F] = V;\n }\n getColor() {\n this.chart.styledMode ? this.getCyclic("color") : this.options.colorByPoint ? this.color = "#cccccc" : this.getCyclic("color", this.options.color || C.plotOptions[this.type].color, this.chart.options.colors);\n }\n getPointsCollection() {\n return (this.hasGroupedData ? this.points : this.data) || [];\n }\n getSymbol() {\n let F = this.options.marker;\n this.getCyclic("symbol", F.symbol, this.chart.options.symbols);\n }\n findPointIndex(F, V) {\n let Q, Z, t1, n1 = F.id, U = F.x, e1 = this.points, o1 = this.options.dataSorting;\n if (n1) {\n let u1 = this.chart.get(n1);\n u1 instanceof c && (Q = u1);\n } else if (this.linkedParent || this.enabledDataSorting || this.options.relativeXValue) {\n let u1 = (M1) => !M1.touched && M1.index === F.index;\n if (o1 && o1.matchByName ? u1 = (M1) => !M1.touched && M1.name === F.name : this.options.relativeXValue && (u1 = (M1) => !M1.touched && M1.options.x === F.x), !(Q = S(e1, u1)))\n return;\n }\n return Q && (t1 = Q && Q.index) !== void 0 && (Z = !0), t1 === void 0 && $(U) && (t1 = this.xData.indexOf(U, V)), t1 !== -1 && t1 !== void 0 && this.cropped && (t1 = t1 >= this.cropStart ? t1 - this.cropStart : t1), !Z && $(t1) && e1[t1] && e1[t1].touched && (t1 = void 0), t1;\n }\n updateData(F, V) {\n let Q = this.options, Z = Q.dataSorting, t1 = this.points, n1 = [], U = this.requireSorting, e1 = F.length === t1.length, o1, u1, M1, A1, l1 = !0;\n if (this.xIncrement = null, F.forEach(function(b1, h1) {\n let z1, O1 = T(b1) && this.pointClass.prototype.optionsToObject.call({ series: this }, b1) || {}, m1 = O1.x;\n O1.id || $(m1) ? ((z1 = this.findPointIndex(O1, A1)) === -1 || z1 === void 0 ? n1.push(b1) : t1[z1] && b1 !== Q.data[z1] ? (t1[z1].update(b1, !1, null, !1), t1[z1].touched = !0, U && (A1 = z1 + 1)) : t1[z1] && (t1[z1].touched = !0), (!e1 || h1 !== z1 || Z && Z.enabled || this.hasDerivedData) && (o1 = !0)) : n1.push(b1);\n }, this), o1)\n for (u1 = t1.length; u1--; )\n (M1 = t1[u1]) && !M1.touched && M1.remove && M1.remove(!1, V);\n else\n !e1 || Z && Z.enabled ? l1 = !1 : (F.forEach(function(b1, h1) {\n b1 === t1[h1].y || t1[h1].destroyed || t1[h1].update(b1, !1, null, !1);\n }), n1.length = 0);\n return t1.forEach(function(b1) {\n b1 && (b1.touched = !1);\n }), !!l1 && (n1.forEach(function(b1) {\n this.addPoint(b1, !1, null, null, !1);\n }, this), this.xIncrement === null && this.xData && this.xData.length && (this.xIncrement = v(this.xData), this.autoIncrement()), !0);\n }\n setData(F, V = !0, Q, Z) {\n var G1;\n let t1 = this, n1 = t1.points, U = n1 && n1.length || 0, e1 = t1.options, o1 = t1.chart, u1 = e1.dataSorting, M1 = t1.xAxis, A1 = e1.turboThreshold, l1 = this.xData, b1 = this.yData, h1 = t1.pointArrayMap, z1 = h1 && h1.length, O1 = e1.keys, m1, L1, y1, B1 = 0, T1 = 1, F1;\n o1.options.chart.allowMutatingData || (e1.data && delete t1.options.data, t1.userOptions.data && delete t1.userOptions.data, F1 = r1(!0, F));\n let X1 = (F = F1 || F || []).length;\n if (u1 && u1.enabled && (F = this.sortData(F)), o1.options.chart.allowMutatingData && Z !== !1 && X1 && U && !t1.cropped && !t1.hasGroupedData && t1.visible && !t1.boosted && (y1 = this.updateData(F, Q)), !y1) {\n t1.xIncrement = null, t1.colorCounter = 0, this.parallelArrays.forEach(function(K1) {\n t1[K1 + "Data"].length = 0;\n });\n let Q1 = A1 && X1 > A1;\n if (Q1) {\n let K1 = t1.getFirstValidPoint(F), n0 = t1.getFirstValidPoint(F, X1 - 1, -1), u0 = (c0) => !!(K(c0) && (O1 || $(c0[0])));\n if ($(K1) && $(n0))\n for (m1 = 0; m1 < X1; m1++)\n l1[m1] = this.autoIncrement(), b1[m1] = F[m1];\n else if (u0(K1) && u0(n0))\n if (z1)\n if (K1.length === z1)\n for (m1 = 0; m1 < X1; m1++)\n l1[m1] = this.autoIncrement(), b1[m1] = F[m1];\n else\n for (m1 = 0; m1 < X1; m1++)\n L1 = F[m1], l1[m1] = L1[0], b1[m1] = L1.slice(1, z1 + 1);\n else if (O1 && (B1 = O1.indexOf("x"), T1 = O1.indexOf("y"), B1 = B1 >= 0 ? B1 : 0, T1 = T1 >= 0 ? T1 : 1), K1.length === 1 && (T1 = 0), B1 === T1)\n for (m1 = 0; m1 < X1; m1++)\n l1[m1] = this.autoIncrement(), b1[m1] = F[m1][T1];\n else\n for (m1 = 0; m1 < X1; m1++)\n L1 = F[m1], l1[m1] = L1[B1], b1[m1] = L1[T1];\n else\n Q1 = !1;\n }\n if (!Q1)\n for (m1 = 0; m1 < X1; m1++)\n L1 = { series: t1 }, t1.pointClass.prototype.applyOptions.apply(L1, [F[m1]]), t1.updateParallelArrays(L1, m1);\n for (b1 && j(b1[0]) && w(14, !0, o1), t1.data = [], t1.options.data = t1.userOptions.data = F, m1 = U; m1--; )\n (G1 = n1[m1]) == null || G1.destroy();\n M1 && (M1.minRange = M1.userMinRange), t1.isDirty = o1.isDirtyBox = !0, t1.isDirtyData = !!n1, Q = !1;\n }\n e1.legendType === "point" && (this.processData(), this.generatePoints()), V && o1.redraw(Q);\n }\n sortData(F) {\n let V = this, Q = V.options.dataSorting.sortKey || "y", Z = function(t1, n1) {\n return T(n1) && t1.pointClass.prototype.optionsToObject.call({ series: t1 }, n1) || {};\n };\n return F.forEach(function(t1, n1) {\n F[n1] = Z(V, t1), F[n1].index = n1;\n }, this), F.concat().sort((t1, n1) => {\n let U = P(Q, t1), e1 = P(Q, n1);\n return e1 < U ? -1 : e1 > U ? 1 : 0;\n }).forEach(function(t1, n1) {\n t1.x = n1;\n }, this), V.linkedSeries && V.linkedSeries.forEach(function(t1) {\n let n1 = t1.options, U = n1.data;\n n1.dataSorting && n1.dataSorting.enabled || !U || (U.forEach(function(e1, o1) {\n U[o1] = Z(t1, e1), F[o1] && (U[o1].x = F[o1].x, U[o1].index = o1);\n }), t1.setData(U, !1));\n }), F;\n }\n getProcessedData(F) {\n let V = this, Q = V.xAxis, Z = V.options.cropThreshold, t1 = Q == null ? void 0 : Q.logarithmic, n1 = V.isCartesian, U, e1, o1 = 0, u1, M1, A1, l1 = V.xData, b1 = V.yData, h1 = !1, z1 = l1.length;\n Q && (M1 = (u1 = Q.getExtremes()).min, A1 = u1.max, h1 = !!(Q.categories && !Q.names.length)), n1 && V.sorted && !F && (!Z || z1 > Z || V.forceCrop) && (l1[z1 - 1] < M1 || l1[0] > A1 ? (l1 = [], b1 = []) : V.yData && (l1[0] < M1 || l1[z1 - 1] > A1) && (l1 = (U = this.cropData(V.xData, V.yData, M1, A1)).xData, b1 = U.yData, o1 = U.start, e1 = !0));\n let O1 = I([t1 ? l1.map(t1.log2lin) : l1], () => V.requireSorting && !h1 && w(15, !1, V.chart));\n return { xData: l1, yData: b1, cropped: e1, cropStart: o1, closestPointRange: O1 };\n }\n processData(F) {\n let V = this.xAxis;\n if (this.isCartesian && !this.isDirty && !V.isDirty && !this.yAxis.isDirty && !F)\n return !1;\n let Q = this.getProcessedData();\n this.cropped = Q.cropped, this.cropStart = Q.cropStart, this.processedXData = Q.xData, this.processedYData = Q.yData, this.closestPointRange = this.basePointRange = Q.closestPointRange, B(this, "afterProcessData");\n }\n cropData(F, V, Q, Z) {\n let t1 = F.length, n1, U, e1 = 0, o1 = t1;\n for (n1 = 0; n1 < t1; n1++)\n if (F[n1] >= Q) {\n e1 = Math.max(0, n1 - 1);\n break;\n }\n for (U = n1; U < t1; U++)\n if (F[U] > Z) {\n o1 = U + 1;\n break;\n }\n return { xData: F.slice(e1, o1), yData: V.slice(e1, o1), start: e1, end: o1 };\n }\n generatePoints() {\n let F = this.options, V = this.processedData || F.data, Q = this.processedXData, Z = this.processedYData, t1 = this.pointClass, n1 = Q.length, U = this.cropStart || 0, e1 = this.hasGroupedData, o1 = F.keys, u1 = [], M1 = F.dataGrouping && F.dataGrouping.groupAll ? U : 0, A1, l1, b1, h1, z1 = this.data;\n if (!z1 && !e1) {\n let O1 = [];\n O1.length = V.length, z1 = this.data = O1;\n }\n for (o1 && e1 && (this.options.keys = !1), h1 = 0; h1 < n1; h1++)\n l1 = U + h1, e1 ? ((b1 = new t1(this, [Q[h1]].concat(D(Z[h1])))).dataGroup = this.groupMap[M1 + h1], b1.dataGroup.options && (b1.options = b1.dataGroup.options, q(b1, b1.dataGroup.options), delete b1.dataLabels)) : (b1 = z1[l1]) || V[l1] === void 0 || (z1[l1] = b1 = new t1(this, V[l1], Q[h1])), b1 && (b1.index = e1 ? M1 + h1 : l1, u1[h1] = b1);\n if (this.options.keys = o1, z1 && (n1 !== (A1 = z1.length) || e1))\n for (h1 = 0; h1 < A1; h1++)\n h1 !== U || e1 || (h1 += n1), z1[h1] && (z1[h1].destroyElements(), z1[h1].plotX = void 0);\n this.data = z1, this.points = u1, B(this, "afterGeneratePoints");\n }\n getXExtremes(F) {\n return { min: y(F), max: v(F) };\n }\n getExtremes(F, V) {\n let Q = this.xAxis, Z = this.yAxis, t1 = [], n1 = this.requireSorting && !this.is("column") ? 1 : 0, U = !!Z && Z.positiveValuesOnly, e1 = V || this.getExtremesFromAll || this.options.getExtremesFromAll, { processedXData: o1, processedYData: u1 } = this, M1, A1, l1, b1, h1, z1, O1, m1 = 0, L1 = 0, y1 = 0;\n if (this.cropped && e1) {\n let X1 = this.getProcessedData(!0);\n o1 = X1.xData, u1 = X1.yData;\n }\n let B1 = (F = F || this.stackedYData || u1 || []).length, T1 = o1 || this.xData;\n for (Q && (m1 = (M1 = Q.getExtremes()).min, L1 = M1.max), z1 = 0; z1 < B1; z1++)\n if (b1 = T1[z1], A1 = ($(h1 = F[z1]) || K(h1)) && (($(h1) ? h1 > 0 : h1.length) || !U), l1 = V || this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || !Q || (T1[z1 + n1] || b1) >= m1 && (T1[z1 - n1] || b1) <= L1, A1 && l1)\n if (O1 = h1.length)\n for (; O1--; )\n $(h1[O1]) && (t1[y1++] = h1[O1]);\n else\n t1[y1++] = h1;\n let F1 = { activeYData: t1, dataMin: y(t1), dataMax: v(t1) };\n return B(this, "afterGetExtremes", { dataExtremes: F1 }), F1;\n }\n applyExtremes() {\n let F = this.getExtremes();\n return this.dataMin = F.dataMin, this.dataMax = F.dataMax, F;\n }\n getFirstValidPoint(F, V = 0, Q = 1) {\n let Z = F.length, t1 = V;\n for (; t1 >= 0 && t1 < Z; ) {\n if (T(F[t1]))\n return F[t1];\n t1 += Q;\n }\n }\n translate() {\n var L1;\n this.processedXData || this.processData(), this.generatePoints();\n let F = this.options, V = F.stacking, Q = this.xAxis, Z = Q.categories, t1 = this.enabledDataSorting, n1 = this.yAxis, U = this.points, e1 = U.length, o1 = this.pointPlacementToXValue(), u1 = !!o1, M1 = F.threshold, A1 = F.startFromThreshold ? M1 : 0, l1, b1, h1, z1, O1 = Number.MAX_VALUE;\n function m1(y1) {\n return z(y1, -1e9, 1e9);\n }\n for (l1 = 0; l1 < e1; l1++) {\n let y1, B1 = U[l1], T1 = B1.x, F1, X1, G1 = B1.y, Q1 = B1.low, K1 = V && ((L1 = n1.stacking) == null ? void 0 : L1.stacks[(this.negStacks && G1 < (A1 ? 0 : M1) ? "-" : "") + this.stackKey]);\n b1 = Q.translate(T1, !1, !1, !1, !0, o1), B1.plotX = $(b1) ? N(m1(b1)) : void 0, V && this.visible && K1 && K1[T1] && (z1 = this.getStackIndicator(z1, T1, this.index), !B1.isNull && z1.key && (X1 = (F1 = K1[T1]).points[z1.key]), F1 && K(X1) && (Q1 = X1[0], G1 = X1[1], Q1 === A1 && z1.key === K1[T1].base && (Q1 = _($(M1) ? M1 : n1.min)), n1.positiveValuesOnly && T(Q1) && Q1 <= 0 && (Q1 = void 0), B1.total = B1.stackTotal = _(F1.total), B1.percentage = T(B1.y) && F1.total ? B1.y / F1.total * 100 : void 0, B1.stackY = G1, this.irregularWidths || F1.setOffset(this.pointXOffset || 0, this.barW || 0, void 0, void 0, void 0, this.xAxis))), B1.yBottom = T(Q1) ? m1(n1.translate(Q1, !1, !0, !1, !0)) : void 0, this.dataModify && (G1 = this.dataModify.modifyValue(G1, l1)), $(G1) && B1.plotX !== void 0 && (y1 = $(y1 = n1.translate(G1, !1, !0, !1, !0)) ? m1(y1) : void 0), B1.plotY = y1, B1.isInside = this.isPointInside(B1), B1.clientX = u1 ? N(Q.translate(T1, !1, !1, !1, !0, o1)) : b1, B1.negative = (B1.y || 0) < (M1 || 0), B1.category = _(Z && Z[B1.x], B1.x), B1.isNull || B1.visible === !1 || (h1 !== void 0 && (O1 = Math.min(O1, Math.abs(b1 - h1))), h1 = b1), B1.zone = this.zones.length ? B1.getZone() : void 0, !B1.graphic && this.group && t1 && (B1.isNew = !0);\n }\n this.closestPointRangePx = O1, B(this, "afterTranslate");\n }\n getValidPoints(F, V, Q) {\n let Z = this.chart;\n return (F || this.points || []).filter(function(t1) {\n let { plotX: n1, plotY: U } = t1;\n return !!((Q || !t1.isNull && $(U)) && (!V || Z.isInsidePlot(n1, U, { inverted: Z.inverted }))) && t1.visible !== !1;\n });\n }\n getClipBox() {\n let { chart: F, xAxis: V, yAxis: Q } = this, { x: Z, y: t1, width: n1, height: U } = r1(F.clipBox);\n return V && V.len !== F.plotSizeX && (n1 = V.len), Q && Q.len !== F.plotSizeY && (U = Q.len), F.inverted && !this.invertible && ([n1, U] = [U, n1]), { x: Z, y: t1, width: n1, height: U };\n }\n getSharedClipKey() {\n return this.sharedClipKey = (this.options.xAxis || 0) + "," + (this.options.yAxis || 0), this.sharedClipKey;\n }\n setClip() {\n let { chart: F, group: V, markerGroup: Q } = this, Z = F.sharedClips, t1 = F.renderer, n1 = this.getClipBox(), U = this.getSharedClipKey(), e1 = Z[U];\n e1 ? e1.animate(n1) : Z[U] = e1 = t1.clipRect(n1), V && V.clip(this.options.clip === !1 ? void 0 : e1), Q && Q.clip();\n }\n animate(F) {\n let { chart: V, group: Q, markerGroup: Z } = this, t1 = V.inverted, n1 = b(this.options.animation), U = [this.getSharedClipKey(), n1.duration, n1.easing, n1.defer].join(","), e1 = V.sharedClips[U], o1 = V.sharedClips[U + "m"];\n if (F && Q) {\n let u1 = this.getClipBox();\n if (e1)\n e1.attr("height", u1.height);\n else {\n u1.width = 0, t1 && (u1.x = V.plotHeight), e1 = V.renderer.clipRect(u1), V.sharedClips[U] = e1;\n let M1 = { x: -99, y: -99, width: t1 ? V.plotWidth + 199 : 99, height: t1 ? 99 : V.plotHeight + 199 };\n o1 = V.renderer.clipRect(M1), V.sharedClips[U + "m"] = o1;\n }\n Q.clip(e1), Z == null || Z.clip(o1);\n } else if (e1 && !e1.hasClass("highcharts-animating")) {\n let u1 = this.getClipBox(), M1 = n1.step;\n (Z != null && Z.element.childNodes.length || V.series.length > 1) && (n1.step = function(A1, l1) {\n M1 && M1.apply(l1, arguments), l1.prop === "width" && (o1 != null && o1.element) && o1.attr(t1 ? "height" : "width", A1 + 99);\n }), e1.addClass("highcharts-animating").animate(u1, n1);\n }\n }\n afterAnimate() {\n this.setClip(), a1(this.chart.sharedClips, (F, V, Q) => {\n F && !this.chart.container.querySelector(`[clip-path="url(#${F.id})"]`) && (F.destroy(), delete Q[V]);\n }), this.finishedAnimating = !0, B(this, "afterAnimate");\n }\n drawPoints(F = this.points) {\n let V, Q, Z, t1, n1, U, e1, o1 = this.chart, u1 = o1.styledMode, { colorAxis: M1, options: A1 } = this, l1 = A1.marker, b1 = this[this.specialGroup || "markerGroup"], h1 = this.xAxis, z1 = _(l1.enabled, !h1 || !!h1.isRadial || null, this.closestPointRangePx >= l1.enabledThreshold * l1.radius);\n if (l1.enabled !== !1 || this._hasPointMarkers)\n for (V = 0; V < F.length; V++)\n if (t1 = (Z = (Q = F[V]).graphic) ? "animate" : "attr", n1 = Q.marker || {}, U = !!Q.marker, (z1 && n1.enabled === void 0 || n1.enabled) && !Q.isNull && Q.visible !== !1) {\n let O1 = _(n1.symbol, this.symbol, "rect");\n e1 = this.markerAttribs(Q, Q.selected && "select"), this.enabledDataSorting && (Q.startXPos = h1.reversed ? -(e1.width || 0) : h1.width);\n let m1 = Q.isInside !== !1;\n if (!Z && m1 && ((e1.width || 0) > 0 || Q.hasImage) && (Q.graphic = Z = o1.renderer.symbol(O1, e1.x, e1.y, e1.width, e1.height, U ? n1 : l1).add(b1), this.enabledDataSorting && o1.hasRendered && (Z.attr({ x: Q.startXPos }), t1 = "animate")), Z && t1 === "animate" && Z[m1 ? "show" : "hide"](m1).animate(e1), Z) {\n let L1 = this.pointAttribs(Q, u1 || !Q.selected ? void 0 : "select");\n u1 ? M1 && Z.css({ fill: L1.fill }) : Z[t1](L1);\n }\n Z && Z.addClass(Q.getClassName(), !0);\n } else\n Z && (Q.graphic = Z.destroy());\n }\n markerAttribs(F, V) {\n let Q = this.options, Z = Q.marker, t1 = F.marker || {}, n1 = t1.symbol || Z.symbol, U = {}, e1, o1, u1 = _(t1.radius, Z && Z.radius);\n V && (e1 = Z.states[V], u1 = _((o1 = t1.states && t1.states[V]) && o1.radius, e1 && e1.radius, u1 && u1 + (e1 && e1.radiusPlus || 0))), F.hasImage = n1 && n1.indexOf("url") === 0, F.hasImage && (u1 = 0);\n let M1 = F.pos();\n return $(u1) && M1 && (Q.crisp && (M1[0] = W(M1[0], F.hasImage ? 0 : n1 === "rect" ? (Z == null ? void 0 : Z.lineWidth) || 0 : 1)), U.x = M1[0] - u1, U.y = M1[1] - u1), u1 && (U.width = U.height = 2 * u1), U;\n }\n pointAttribs(F, V) {\n let Q = this.options.marker, Z = F && F.options, t1 = Z && Z.marker || {}, n1 = Z && Z.color, U = F && F.color, e1 = F && F.zone && F.zone.color, o1, u1, M1 = this.color, A1, l1, b1 = _(t1.lineWidth, Q.lineWidth), h1 = 1;\n return M1 = n1 || e1 || U || M1, A1 = t1.fillColor || Q.fillColor || M1, l1 = t1.lineColor || Q.lineColor || M1, V = V || "normal", o1 = Q.states[V] || {}, b1 = _((u1 = t1.states && t1.states[V] || {}).lineWidth, o1.lineWidth, b1 + _(u1.lineWidthPlus, o1.lineWidthPlus, 0)), A1 = u1.fillColor || o1.fillColor || A1, { stroke: l1 = u1.lineColor || o1.lineColor || l1, "stroke-width": b1, fill: A1, opacity: h1 = _(u1.opacity, o1.opacity, h1) };\n }\n destroy(F) {\n let V, Q, Z, t1 = this, n1 = t1.chart, U = /AppleWebKit\\/533/.test(O.navigator.userAgent), e1 = t1.data || [];\n for (B(t1, "destroy", { keepEventsForUpdate: F }), this.removeEvents(F), (t1.axisTypes || []).forEach(function(o1) {\n (Z = t1[o1]) && Z.series && (L(Z.series, t1), Z.isDirty = Z.forceRedraw = !0);\n }), t1.legendItem && t1.chart.legend.destroyItem(t1), V = e1.length; V--; )\n (Q = e1[V]) && Q.destroy && Q.destroy();\n for (let o1 of t1.zones)\n x(o1, void 0, !0);\n h.clearTimeout(t1.animationTimeout), a1(t1, function(o1, u1) {\n o1 instanceof u && !o1.survive && o1[U && u1 === "group" ? "hide" : "destroy"]();\n }), n1.hoverSeries === t1 && (n1.hoverSeries = void 0), L(n1.series, t1), n1.orderItems("series"), a1(t1, function(o1, u1) {\n F && u1 === "hcEvents" || delete t1[u1];\n });\n }\n applyZones() {\n let { area: F, chart: V, graph: Q, zones: Z, points: t1, xAxis: n1, yAxis: U, zoneAxis: e1 } = this, { inverted: o1, renderer: u1 } = V, M1 = this[`${e1}Axis`], { isXAxis: A1, len: l1 = 0 } = M1 || {}, b1 = ((Q == null ? void 0 : Q.strokeWidth()) || 0) / 2 + 1, h1 = (z1, O1 = 0, m1 = 0) => {\n o1 && (m1 = l1 - m1);\n let { translated: L1 = 0, lineClip: y1 } = z1, B1 = m1 - L1;\n y1 == null || y1.push(["L", O1, Math.abs(B1) < b1 ? m1 - b1 * (B1 <= 0 ? -1 : 1) : L1]);\n };\n if (Z.length && (Q || F) && M1 && $(M1.min)) {\n let z1 = M1.getExtremes().max, O1 = (y1) => {\n y1.forEach((B1, T1) => {\n (B1[0] === "M" || B1[0] === "L") && (y1[T1] = [B1[0], A1 ? l1 - B1[1] : B1[1], A1 ? B1[2] : l1 - B1[2]]);\n });\n };\n if (Z.forEach((y1) => {\n y1.lineClip = [], y1.translated = z(M1.toPixels(_(y1.value, z1), !0) || 0, 0, l1);\n }), Q && !this.showLine && Q.hide(), F && F.hide(), e1 === "y" && t1.length < n1.len)\n for (let y1 of t1) {\n let { plotX: B1, plotY: T1, zone: F1 } = y1, X1 = F1 && Z[Z.indexOf(F1) - 1];\n F1 && h1(F1, B1, T1), X1 && h1(X1, B1, T1);\n }\n let m1 = [], L1 = M1.toPixels(M1.getExtremes().min, !0);\n Z.forEach((y1) => {\n var C0, y0;\n let B1 = y1.lineClip || [], T1 = Math.round(y1.translated || 0);\n n1.reversed && B1.reverse();\n let { clip: F1, simpleClip: X1 } = y1, G1 = 0, Q1 = 0, K1 = n1.len, n0 = U.len;\n A1 ? (G1 = T1, K1 = L1) : (Q1 = T1, n0 = L1);\n let u0 = [["M", G1, Q1], ["L", K1, Q1], ["L", K1, n0], ["L", G1, n0], ["Z"]], c0 = [u0[0], ...B1, u0[1], u0[2], ...m1, u0[3], u0[4]];\n m1 = B1.reverse(), L1 = T1, o1 && (O1(c0), F && O1(u0)), F1 ? (F1.animate({ d: c0 }), X1 == null || X1.animate({ d: u0 })) : (F1 = y1.clip = u1.path(c0), F && (X1 = y1.simpleClip = u1.path(u0))), Q && ((C0 = y1.graph) == null || C0.clip(F1)), F && ((y0 = y1.area) == null || y0.clip(X1));\n });\n } else\n this.visible && (Q && Q.show(), F && F.show());\n }\n plotGroup(F, V, Q, Z, t1) {\n let n1 = this[F], U = !n1, e1 = { visibility: Q, zIndex: Z || 0.1 };\n return T(this.opacity) && !this.chart.styledMode && this.state !== "inactive" && (e1.opacity = this.opacity), n1 || (this[F] = n1 = this.chart.renderer.g().add(t1)), n1.addClass("highcharts-" + V + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (T(this.colorIndex) ? "highcharts-color-" + this.colorIndex + " " : "") + (this.options.className || "") + (n1.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0), n1.attr(e1)[U ? "attr" : "animate"](this.getPlotBox(V)), n1;\n }\n getPlotBox(F) {\n let V = this.xAxis, Q = this.yAxis, Z = this.chart, t1 = Z.inverted && !Z.polar && V && this.invertible && F === "series";\n return Z.inverted && (V = Q, Q = this.xAxis), { translateX: V ? V.left : Z.plotLeft, translateY: Q ? Q.top : Z.plotTop, rotation: t1 ? 90 : 0, rotationOriginX: t1 ? (V.len - Q.len) / 2 : 0, rotationOriginY: t1 ? (V.len + Q.len) / 2 : 0, scaleX: t1 ? -1 : 1, scaleY: 1 };\n }\n removeEvents(F) {\n let { eventsToUnbind: V } = this;\n F || Y(this), V.length && (V.forEach((Q) => {\n Q();\n }), V.length = 0);\n }\n render() {\n var u1, M1, A1, l1, b1;\n let F = this, { chart: V, options: Q, hasRendered: Z } = F, t1 = b(Q.animation), n1 = F.visible ? "inherit" : "hidden", U = Q.zIndex, e1 = V.seriesGroup, o1 = F.finishedAnimating ? 0 : t1.duration;\n B(this, "render"), F.plotGroup("group", "series", n1, U, e1), F.markerGroup = F.plotGroup("markerGroup", "markers", n1, U, e1), Q.clip !== !1 && F.setClip(), o1 && ((u1 = F.animate) == null || u1.call(F, !0)), F.drawGraph && (F.drawGraph(), F.applyZones()), F.visible && F.drawPoints(), (M1 = F.drawDataLabels) == null || M1.call(F), (A1 = F.redrawPoints) == null || A1.call(F), Q.enableMouseTracking && ((l1 = F.drawTracker) == null || l1.call(F)), o1 && ((b1 = F.animate) == null || b1.call(F)), Z || (o1 && t1.defer && (o1 += t1.defer), F.animationTimeout = H(() => {\n F.afterAnimate();\n }, o1 || 0)), F.isDirty = !1, F.hasRendered = !0, B(F, "afterRender");\n }\n redraw() {\n let F = this.isDirty || this.isDirtyData;\n this.translate(), this.render(), F && delete this.kdTree;\n }\n reserveSpace() {\n return this.visible || !this.chart.options.chart.ignoreHiddenSeries;\n }\n searchPoint(F, V) {\n let { xAxis: Q, yAxis: Z } = this, t1 = this.chart.inverted;\n return this.searchKDTree({ clientX: t1 ? Q.len - F.chartY + Q.pos : F.chartX - Q.pos, plotY: t1 ? Z.len - F.chartX + Z.pos : F.chartY - Z.pos }, V, F);\n }\n buildKDTree(F) {\n this.buildingKdTree = !0;\n let V = this, Q = V.options.findNearestPointBy.indexOf("y") > -1 ? 2 : 1;\n delete V.kdTree, H(function() {\n V.kdTree = function Z(t1, n1, U) {\n let e1, o1, u1 = t1 == null ? void 0 : t1.length;\n if (u1)\n return e1 = V.kdAxisArray[n1 % U], t1.sort((M1, A1) => (M1[e1] || 0) - (A1[e1] || 0)), { point: t1[o1 = Math.floor(u1 / 2)], left: Z(t1.slice(0, o1), n1 + 1, U), right: Z(t1.slice(o1 + 1), n1 + 1, U) };\n }(V.getValidPoints(void 0, !V.directTouch), Q, Q), V.buildingKdTree = !1;\n }, V.options.kdNow || (F == null ? void 0 : F.type) === "touchstart" ? 0 : 1);\n }\n searchKDTree(F, V, Q) {\n let Z = this, [t1, n1] = this.kdAxisArray, U = V ? "distX" : "dist", e1 = (Z.options.findNearestPointBy || "").indexOf("y") > -1 ? 2 : 1, o1 = !!Z.isBubble;\n if (this.kdTree || this.buildingKdTree || this.buildKDTree(Q), this.kdTree)\n return function u1(M1, A1, l1, b1) {\n var F1;\n let h1 = A1.point, z1 = Z.kdAxisArray[l1 % b1], O1, m1, L1 = h1;\n (function(X1, G1) {\n var q1;\n let Q1 = X1[t1], K1 = G1[t1], n0 = T(Q1) && T(K1) ? Q1 - K1 : null, u0 = X1[n1], c0 = G1[n1], C0 = T(u0) && T(c0) ? u0 - c0 : 0, y0 = o1 && ((q1 = G1.marker) == null ? void 0 : q1.radius) || 0;\n G1.dist = Math.sqrt((n0 && n0 * n0 || 0) + C0 * C0) - y0, G1.distX = T(n0) ? Math.abs(n0) - y0 : Number.MAX_VALUE;\n })(M1, h1);\n let y1 = (M1[z1] || 0) - (h1[z1] || 0) + (o1 && ((F1 = h1.marker) == null ? void 0 : F1.radius) || 0), B1 = y1 < 0 ? "left" : "right", T1 = y1 < 0 ? "right" : "left";\n return A1[B1] && (L1 = (O1 = u1(M1, A1[B1], l1 + 1, b1))[U] < L1[U] ? O1 : h1), A1[T1] && Math.sqrt(y1 * y1) < L1[U] && (L1 = (m1 = u1(M1, A1[T1], l1 + 1, b1))[U] < L1[U] ? m1 : L1), L1;\n }(F, this.kdTree, e1, e1);\n }\n pointPlacementToXValue() {\n let { options: F, xAxis: V } = this, Q = F.pointPlacement;\n return Q === "between" && (Q = V.reversed ? -0.5 : 0.5), $(Q) ? Q * (F.pointRange || V.pointRange) : 0;\n }\n isPointInside(F) {\n let { chart: V, xAxis: Q, yAxis: Z } = this, { plotX: t1 = -1, plotY: n1 = -1 } = F;\n return n1 >= 0 && n1 <= (Z ? Z.len : V.plotHeight) && t1 >= 0 && t1 <= (Q ? Q.len : V.plotWidth);\n }\n drawTracker() {\n var A1;\n let F = this, V = F.options, Q = V.trackByArea, Z = [].concat((Q ? F.areaPath : F.graphPath) || []), t1 = F.chart, n1 = t1.pointer, U = t1.renderer, e1 = ((A1 = t1.options.tooltip) == null ? void 0 : A1.snap) || 0, o1 = () => {\n V.enableMouseTracking && t1.hoverSeries !== F && F.onMouseOver();\n }, u1 = "rgba(192,192,192," + (f ? 1e-4 : 2e-3) + ")", M1 = F.tracker;\n M1 ? M1.attr({ d: Z }) : F.graph && (F.tracker = M1 = U.path(Z).attr({ visibility: F.visible ? "inherit" : "hidden", zIndex: 2 }).addClass(Q ? "highcharts-tracker-area" : "highcharts-tracker-line").add(F.group), t1.styledMode || M1.attr({ "stroke-linecap": "round", "stroke-linejoin": "round", stroke: u1, fill: Q ? u1 : "none", "stroke-width": F.graph.strokeWidth() + (Q ? 0 : 2 * e1) }), [F.tracker, F.markerGroup, F.dataLabelsGroup].forEach((l1) => {\n l1 && (l1.addClass("highcharts-tracker").on("mouseover", o1).on("mouseout", (b1) => {\n n1 == null || n1.onTrackerMouseOut(b1);\n }), V.cursor && !t1.styledMode && l1.css({ cursor: V.cursor }), l1.on("touchstart", o1));\n })), B(this, "afterDrawTracker");\n }\n addPoint(F, V, Q, Z, t1) {\n let n1, U, e1 = this.options, o1 = this.data, u1 = this.chart, M1 = this.xAxis, A1 = M1 && M1.hasNames && M1.names, l1 = e1.data, b1 = this.xData;\n V = _(V, !0);\n let h1 = { series: this };\n this.pointClass.prototype.applyOptions.apply(h1, [F]);\n let z1 = h1.x;\n if (U = b1.length, this.requireSorting && z1 < b1[U - 1])\n for (n1 = !0; U && b1[U - 1] > z1; )\n U--;\n this.updateParallelArrays(h1, "splice", [U, 0, 0]), this.updateParallelArrays(h1, U), A1 && h1.name && (A1[z1] = h1.name), l1.splice(U, 0, F), (n1 || this.processedData) && (this.data.splice(U, 0, null), this.processData()), e1.legendType === "point" && this.generatePoints(), Q && (o1[0] && o1[0].remove ? o1[0].remove(!1) : (o1.shift(), this.updateParallelArrays(h1, "shift"), l1.shift())), t1 !== !1 && B(this, "addPoint", { point: h1 }), this.isDirty = !0, this.isDirtyData = !0, V && u1.redraw(Z);\n }\n removePoint(F, V, Q) {\n let Z = this, t1 = Z.data, n1 = t1[F], U = Z.points, e1 = Z.chart, o1 = function() {\n U && U.length === t1.length && U.splice(F, 1), t1.splice(F, 1), Z.options.data.splice(F, 1), Z.updateParallelArrays(n1 || { series: Z }, "splice", [F, 1]), n1 && n1.destroy(), Z.isDirty = !0, Z.isDirtyData = !0, V && e1.redraw();\n };\n M(Q, e1), V = _(V, !0), n1 ? n1.firePointEvent("remove", null, o1) : o1();\n }\n remove(F, V, Q, Z) {\n let t1 = this, n1 = t1.chart;\n function U() {\n t1.destroy(Z), n1.isDirtyLegend = n1.isDirtyBox = !0, n1.linkSeries(Z), _(F, !0) && n1.redraw(V);\n }\n Q !== !1 ? B(t1, "remove", null, U) : U();\n }\n update(F, V) {\n var O1, m1, L1;\n B(this, "update", { options: F = E(F, this.userOptions) });\n let Q = this, Z = Q.chart, t1 = Q.userOptions, n1 = Q.initialType || Q.type, U = Z.options.plotOptions, e1 = m[n1].prototype, o1 = Q.finishedAnimating && { animation: !1 }, u1 = {}, M1, A1, l1 = ["colorIndex", "eventOptions", "navigatorSeries", "symbolIndex", "baseSeries"], b1 = F.type || t1.type || Z.options.chart.type, h1 = !(this.hasDerivedData || b1 && b1 !== this.type || F.pointStart !== void 0 || F.pointInterval !== void 0 || F.relativeXValue !== void 0 || F.joinBy || F.mapData || ["dataGrouping", "pointStart", "pointInterval", "pointIntervalUnit", "keys"].some((y1) => Q.hasOptionChanged(y1)));\n b1 = b1 || n1, h1 && (l1.push("data", "isDirtyData", "isDirtyCanvas", "points", "processedData", "processedXData", "processedYData", "xIncrement", "cropped", "_hasPointMarkers", "hasDataLabels", "nodes", "layout", "level", "mapMap", "mapData", "minY", "maxY", "minX", "maxX", "transformGroups"), F.visible !== !1 && l1.push("area", "graph"), Q.parallelArrays.forEach(function(y1) {\n l1.push(y1 + "Data");\n }), F.data && (F.dataSorting && q(Q.options.dataSorting, F.dataSorting), this.setData(F.data, !1))), F = r1(t1, { index: t1.index === void 0 ? Q.index : t1.index, pointStart: ((O1 = U == null ? void 0 : U.series) == null ? void 0 : O1.pointStart) ?? t1.pointStart ?? ((m1 = Q.xData) == null ? void 0 : m1[0]) }, !h1 && { data: Q.options.data }, F, o1), h1 && F.data && (F.data = Q.options.data), (l1 = ["group", "markerGroup", "dataLabelsGroup", "transformGroup"].concat(l1)).forEach(function(y1) {\n l1[y1] = Q[y1], delete Q[y1];\n });\n let z1 = !1;\n if (m[b1]) {\n if (z1 = b1 !== Q.type, Q.remove(!1, !1, !1, !0), z1)\n if (Z.propFromSeries(), Object.setPrototypeOf)\n Object.setPrototypeOf(Q, m[b1].prototype);\n else {\n let y1 = Object.hasOwnProperty.call(Q, "hcEvents") && Q.hcEvents;\n for (A1 in e1)\n Q[A1] = void 0;\n q(Q, m[b1].prototype), y1 ? Q.hcEvents = y1 : delete Q.hcEvents;\n }\n } else\n w(17, !0, Z, { missingModuleFor: b1 });\n if (l1.forEach(function(y1) {\n Q[y1] = l1[y1];\n }), Q.init(Z, F), h1 && this.points)\n for (let y1 of ((M1 = Q.options).visible === !1 ? (u1.graphic = 1, u1.dataLabel = 1) : (this.hasMarkerChanged(M1, t1) && (u1.graphic = 1), (L1 = Q.hasDataLabels) != null && L1.call(Q) || (u1.dataLabel = 1)), this.points))\n y1 && y1.series && (y1.resolveColor(), Object.keys(u1).length && y1.destroyElements(u1), M1.showInLegend === !1 && y1.legendItem && Z.legend.destroyItem(y1));\n Q.initialType = n1, Z.linkSeries(), Z.setSortedData(), z1 && Q.linkedSeries.length && (Q.isDirtyData = !0), B(this, "afterUpdate"), _(V, !0) && Z.redraw(!!h1 && void 0);\n }\n setName(F) {\n this.name = this.options.name = this.userOptions.name = F, this.chart.isDirtyLegend = !0;\n }\n hasOptionChanged(F) {\n var U, e1;\n let V = this.chart, Q = this.options[F], Z = V.options.plotOptions, t1 = this.userOptions[F], n1 = _((U = Z == null ? void 0 : Z[this.type]) == null ? void 0 : U[F], (e1 = Z == null ? void 0 : Z.series) == null ? void 0 : e1[F]);\n return t1 && !T(n1) ? Q !== t1 : Q !== _(n1, Q);\n }\n onMouseOver() {\n let F = this.chart, V = F.hoverSeries, Q = F.pointer;\n Q == null || Q.setHoverChartIndex(), V && V !== this && V.onMouseOut(), this.options.events.mouseOver && B(this, "mouseOver"), this.setState("hover"), F.hoverSeries = this;\n }\n onMouseOut() {\n let F = this.options, V = this.chart, Q = V.tooltip, Z = V.hoverPoint;\n V.hoverSeries = null, Z && Z.onMouseOut(), this && F.events.mouseOut && B(this, "mouseOut"), Q && !this.stickyTracking && (!Q.shared || this.noSharedTooltip) && Q.hide(), V.series.forEach(function(t1) {\n t1.setState("", !0);\n });\n }\n setState(F, V) {\n let Q = this, Z = Q.options, t1 = Q.graph, n1 = Z.inactiveOtherPoints, U = Z.states, e1 = _(U[F || "normal"] && U[F || "normal"].animation, Q.chart.options.chart.animation), o1 = Z.lineWidth, u1 = Z.opacity;\n if (F = F || "", Q.state !== F && ([Q.group, Q.markerGroup, Q.dataLabelsGroup].forEach(function(M1) {\n M1 && (Q.state && M1.removeClass("highcharts-series-" + Q.state), F && M1.addClass("highcharts-series-" + F));\n }), Q.state = F, !Q.chart.styledMode)) {\n if (U[F] && U[F].enabled === !1)\n return;\n if (F && (o1 = U[F].lineWidth || o1 + (U[F].lineWidthPlus || 0), u1 = _(U[F].opacity, u1)), t1 && !t1.dashstyle && $(o1))\n for (let M1 of [t1, ...this.zones.map((A1) => A1.graph)])\n M1 == null || M1.animate({ "stroke-width": o1 }, e1);\n n1 || [Q.group, Q.markerGroup, Q.dataLabelsGroup, Q.labelBySeries].forEach(function(M1) {\n M1 && M1.animate({ opacity: u1 }, e1);\n });\n }\n V && n1 && Q.points && Q.setAllPointsToState(F || void 0);\n }\n setAllPointsToState(F) {\n this.points.forEach(function(V) {\n V.setState && V.setState(F);\n });\n }\n setVisible(F, V) {\n var e1;\n let Q = this, Z = Q.chart, t1 = Z.options.chart.ignoreHiddenSeries, n1 = Q.visible;\n Q.visible = F = Q.options.visible = Q.userOptions.visible = F === void 0 ? !n1 : F;\n let U = F ? "show" : "hide";\n ["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"].forEach((o1) => {\n var u1;\n (u1 = Q[o1]) == null || u1[U]();\n }), (Z.hoverSeries === Q || ((e1 = Z.hoverPoint) == null ? void 0 : e1.series) === Q) && Q.onMouseOut(), Q.legendItem && Z.legend.colorizeItem(Q, F), Q.isDirty = !0, Q.options.stacking && Z.series.forEach((o1) => {\n o1.options.stacking && o1.visible && (o1.isDirty = !0);\n }), Q.linkedSeries.forEach((o1) => {\n o1.setVisible(F, !1);\n }), t1 && (Z.isDirtyBox = !0), B(Q, U), V !== !1 && Z.redraw();\n }\n show() {\n this.setVisible(!0);\n }\n hide() {\n this.setVisible(!1);\n }\n select(F) {\n this.selected = F = this.options.selected = F === void 0 ? !this.selected : F, this.checkbox && (this.checkbox.checked = F), B(this, F ? "select" : "unselect");\n }\n shouldShowTooltip(F, V, Q = {}) {\n return Q.series = this, Q.visiblePlotOnly = !0, this.chart.isInsidePlot(F, V, Q);\n }\n drawLegendSymbol(F, V) {\n var Q;\n (Q = l[this.options.legendSymbol || "rectangle"]) == null || Q.call(this, F, V);\n }\n }\n return G.defaultOptions = p, G.types = d.seriesTypes, G.registerType = d.registerSeriesType, q(G.prototype, { axisTypes: ["xAxis", "yAxis"], coll: "series", colorCounter: 0, directTouch: !1, invertible: !0, isCartesian: !0, kdAxisArray: ["clientX", "plotY"], parallelArrays: ["x", "y"], pointClass: c, requireSorting: !0, sorted: !0 }), d.series = G, G;\n }), n(r, "Core/Legend/Legend.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Foundation.js"], r["Core/Globals.js"], r["Core/Series/Series.js"], r["Core/Series/Point.js"], r["Core/Renderer/RendererUtilities.js"], r["Core/Templating.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p, d) {\n var u;\n let { animObject: h, setAnimation: b } = o, { registerEventOptions: M } = i, { composed: C, marginNames: g } = a, { distribute: f } = c, { format: O } = p, { addEvent: m, createElement: v, css: y, defined: z, discardElement: N, find: W, fireEvent: T, isNumber: x, merge: E, pick: L, pushUnique: w, relativeLength: q, stableSort: S, syncTimeout: B } = d;\n class I {\n constructor(k, K) {\n this.allItems = [], this.initialItemY = 0, this.itemHeight = 0, this.itemMarginBottom = 0, this.itemMarginTop = 0, this.itemX = 0, this.itemY = 0, this.lastItemY = 0, this.lastLineHeight = 0, this.legendHeight = 0, this.legendWidth = 0, this.maxItemWidth = 0, this.maxLegendWidth = 0, this.offsetWidth = 0, this.padding = 0, this.pages = [], this.symbolHeight = 0, this.symbolWidth = 0, this.titleHeight = 0, this.totalItemWidth = 0, this.widthOption = 0, this.chart = k, this.setOptions(K), K.enabled && (this.render(), M(this, K), m(this.chart, "endResize", function() {\n this.legend.positionCheckboxes();\n })), m(this.chart, "render", () => {\n this.options.enabled && this.proximate && (this.proximatePositions(), this.positionItems());\n });\n }\n setOptions(k) {\n let K = L(k.padding, 8);\n this.options = k, this.chart.styledMode || (this.itemStyle = k.itemStyle, this.itemHiddenStyle = E(this.itemStyle, k.itemHiddenStyle)), this.itemMarginTop = k.itemMarginTop, this.itemMarginBottom = k.itemMarginBottom, this.padding = K, this.initialItemY = K - 5, this.symbolWidth = L(k.symbolWidth, 16), this.pages = [], this.proximate = k.layout === "proximate" && !this.chart.inverted, this.baseline = void 0;\n }\n update(k, K) {\n let $ = this.chart;\n this.setOptions(E(!0, this.options, k)), "events" in this.options && M(this, this.options), this.destroy(), $.isDirtyLegend = $.isDirtyBox = !0, L(K, !0) && $.redraw(), T(this, "afterUpdate", { redraw: K });\n }\n colorizeItem(k, K) {\n let { area: $, group: j, label: r1, line: a1, symbol: _ } = k.legendItem || {};\n if (j == null || j[K ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"), !this.chart.styledMode) {\n let { itemHiddenStyle: Y = {} } = this, D = Y.color, { fillColor: H, fillOpacity: G, lineColor: J, marker: F } = k.options, V = (Q) => (!K && (Q.fill && (Q.fill = D), Q.stroke && (Q.stroke = D)), Q);\n r1 == null || r1.css(E(K ? this.itemStyle : Y)), a1 == null || a1.attr(V({ stroke: J || k.color })), _ && _.attr(V(F && _.isMarker ? k.pointAttribs() : { fill: k.color })), $ == null || $.attr(V({ fill: H || k.color, "fill-opacity": H ? 1 : G ?? 0.75 }));\n }\n T(this, "afterColorizeItem", { item: k, visible: K });\n }\n positionItems() {\n this.allItems.forEach(this.positionItem, this), this.chart.isResizing || this.positionCheckboxes();\n }\n positionItem(k) {\n let { group: K, x: $ = 0, y: j = 0 } = k.legendItem || {}, r1 = this.options, a1 = r1.symbolPadding, _ = !r1.rtl, Y = k.checkbox;\n if (K && K.element) {\n let D = { translateX: _ ? $ : this.legendWidth - $ - 2 * a1 - 4, translateY: j };\n K[z(K.translateY) ? "animate" : "attr"](D, void 0, () => {\n T(this, "afterPositionItem", { item: k });\n });\n }\n Y && (Y.x = $, Y.y = j);\n }\n destroyItem(k) {\n let K = k.checkbox, $ = k.legendItem || {};\n for (let j of ["group", "label", "line", "symbol"])\n $[j] && ($[j] = $[j].destroy());\n K && N(K), k.legendItem = void 0;\n }\n destroy() {\n for (let k of this.getAllItems())\n this.destroyItem(k);\n for (let k of ["clipRect", "up", "down", "pager", "nav", "box", "title", "group"])\n this[k] && (this[k] = this[k].destroy());\n this.display = null;\n }\n positionCheckboxes() {\n let k, K = this.group && this.group.alignAttr, $ = this.clipHeight || this.legendHeight, j = this.titleHeight;\n K && (k = K.translateY, this.allItems.forEach(function(r1) {\n let a1, _ = r1.checkbox;\n _ && (a1 = k + j + _.y + (this.scrollOffset || 0) + 3, y(_, { left: K.translateX + r1.checkboxOffset + _.x - 20 + "px", top: a1 + "px", display: this.proximate || a1 > k - 6 && a1 < k + $ - 6 ? "" : "none" }));\n }, this));\n }\n renderTitle() {\n let k = this.options, K = this.padding, $ = k.title, j, r1 = 0;\n $.text && (this.title || (this.title = this.chart.renderer.label($.text, K - 3, K - 4, void 0, void 0, void 0, k.useHTML, void 0, "legend-title").attr({ zIndex: 1 }), this.chart.styledMode || this.title.css($.style), this.title.add(this.group)), $.width || this.title.css({ width: this.maxLegendWidth + "px" }), r1 = (j = this.title.getBBox()).height, this.offsetWidth = j.width, this.contentGroup.attr({ translateY: r1 })), this.titleHeight = r1;\n }\n setText(k) {\n let K = this.options;\n k.legendItem.label.attr({ text: K.labelFormat ? O(K.labelFormat, k, this.chart) : K.labelFormatter.call(k) });\n }\n renderItem(k) {\n let K = k.legendItem = k.legendItem || {}, $ = this.chart, j = $.renderer, r1 = this.options, a1 = r1.layout === "horizontal", _ = this.symbolWidth, Y = r1.symbolPadding || 0, D = this.itemStyle, H = this.itemHiddenStyle, G = a1 ? L(r1.itemDistance, 20) : 0, J = !r1.rtl, F = !k.series, V = !F && k.series.drawLegendSymbol ? k.series : k, Q = V.options, Z = !!this.createCheckboxForItem && Q && Q.showCheckbox, t1 = r1.useHTML, n1 = k.options.className, U = K.label, e1 = _ + Y + G + (Z ? 20 : 0);\n !U && (K.group = j.g("legend-item").addClass("highcharts-" + V.type + "-series highcharts-color-" + k.colorIndex + (n1 ? " " + n1 : "") + (F ? " highcharts-series-" + k.index : "")).attr({ zIndex: 1 }).add(this.scrollGroup), K.label = U = j.text("", J ? _ + Y : -Y, this.baseline || 0, t1), $.styledMode || U.css(E(k.visible ? D : H)), U.attr({ align: J ? "left" : "right", zIndex: 2 }).add(K.group), !this.baseline && (this.fontMetrics = j.fontMetrics(U), this.baseline = this.fontMetrics.f + 3 + this.itemMarginTop, U.attr("y", this.baseline), this.symbolHeight = L(r1.symbolHeight, this.fontMetrics.f), r1.squareSymbol && (this.symbolWidth = L(r1.symbolWidth, Math.max(this.symbolHeight, 16)), e1 = this.symbolWidth + Y + G + (Z ? 20 : 0), J && U.attr("x", this.symbolWidth + Y))), V.drawLegendSymbol(this, k), this.setItemEvents && this.setItemEvents(k, U, t1)), Z && !k.checkbox && this.createCheckboxForItem && this.createCheckboxForItem(k), this.colorizeItem(k, k.visible), ($.styledMode || !D.width) && U.css({ width: (r1.itemWidth || this.widthOption || $.spacingBox.width) - e1 + "px" }), this.setText(k);\n let o1 = U.getBBox(), u1 = this.fontMetrics && this.fontMetrics.h || 0;\n k.itemWidth = k.checkboxOffset = r1.itemWidth || K.labelWidth || o1.width + e1, this.maxItemWidth = Math.max(this.maxItemWidth, k.itemWidth), this.totalItemWidth += k.itemWidth, this.itemHeight = k.itemHeight = Math.round(K.labelHeight || (o1.height > 1.5 * u1 ? o1.height : u1));\n }\n layoutItem(k) {\n let K = this.options, $ = this.padding, j = K.layout === "horizontal", r1 = k.itemHeight, a1 = this.itemMarginBottom, _ = this.itemMarginTop, Y = j ? L(K.itemDistance, 20) : 0, D = this.maxLegendWidth, H = K.alignColumns && this.totalItemWidth > D ? this.maxItemWidth : k.itemWidth, G = k.legendItem || {};\n j && this.itemX - $ + H > D && (this.itemX = $, this.lastLineHeight && (this.itemY += _ + this.lastLineHeight + a1), this.lastLineHeight = 0), this.lastItemY = _ + this.itemY + a1, this.lastLineHeight = Math.max(r1, this.lastLineHeight), G.x = this.itemX, G.y = this.itemY, j ? this.itemX += H : (this.itemY += _ + r1 + a1, this.lastLineHeight = r1), this.offsetWidth = this.widthOption || Math.max((j ? this.itemX - $ - (k.checkbox ? 0 : Y) : H) + $, this.offsetWidth);\n }\n getAllItems() {\n let k = [];\n return this.chart.series.forEach(function(K) {\n let $ = K && K.options;\n K && L($.showInLegend, !z($.linkedTo) && void 0, !0) && (k = k.concat((K.legendItem || {}).labels || ($.legendType === "point" ? K.data : K)));\n }), T(this, "afterGetAllItems", { allItems: k }), k;\n }\n getAlignment() {\n let k = this.options;\n return this.proximate ? k.align.charAt(0) + "tv" : k.floating ? "" : k.align.charAt(0) + k.verticalAlign.charAt(0) + k.layout.charAt(0);\n }\n adjustMargins(k, K) {\n let $ = this.chart, j = this.options, r1 = this.getAlignment();\n r1 && [/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/].forEach(function(a1, _) {\n a1.test(r1) && !z(k[_]) && ($[g[_]] = Math.max($[g[_]], $.legend[(_ + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][_] * j[_ % 2 ? "x" : "y"] + L(j.margin, 12) + K[_] + ($.titleOffset[_] || 0)));\n });\n }\n proximatePositions() {\n let k, K = this.chart, $ = [], j = this.options.align === "left";\n for (let r1 of (this.allItems.forEach(function(a1) {\n let _, Y, D = j, H, G;\n a1.yAxis && (a1.xAxis.options.reversed && (D = !D), a1.points && (_ = W(D ? a1.points : a1.points.slice(0).reverse(), function(J) {\n return x(J.plotY);\n })), Y = this.itemMarginTop + a1.legendItem.label.getBBox().height + this.itemMarginBottom, G = a1.yAxis.top - K.plotTop, H = a1.visible ? (_ ? _.plotY : a1.yAxis.height) + (G - 0.3 * Y) : G + a1.yAxis.height, $.push({ target: H, size: Y, item: a1 }));\n }, this), f($, K.plotHeight)))\n k = r1.item.legendItem || {}, x(r1.pos) && (k.y = K.plotTop - K.spacing[0] + r1.pos);\n }\n render() {\n let k = this.chart, K = k.renderer, $ = this.options, j = this.padding, r1 = this.getAllItems(), a1, _, Y, D = this.group, H, G = this.box;\n this.itemX = j, this.itemY = this.initialItemY, this.offsetWidth = 0, this.lastItemY = 0, this.widthOption = q($.width, k.spacingBox.width - j), H = k.spacingBox.width - 2 * j - $.x, ["rm", "lm"].indexOf(this.getAlignment().substring(0, 2)) > -1 && (H /= 2), this.maxLegendWidth = this.widthOption || H, D || (this.group = D = K.g("legend").addClass($.className || "").attr({ zIndex: 7 }).add(), this.contentGroup = K.g().attr({ zIndex: 1 }).add(D), this.scrollGroup = K.g().add(this.contentGroup)), this.renderTitle(), S(r1, (J, F) => (J.options && J.options.legendIndex || 0) - (F.options && F.options.legendIndex || 0)), $.reversed && r1.reverse(), this.allItems = r1, this.display = a1 = !!r1.length, this.lastLineHeight = 0, this.maxItemWidth = 0, this.totalItemWidth = 0, this.itemHeight = 0, r1.forEach(this.renderItem, this), r1.forEach(this.layoutItem, this), _ = (this.widthOption || this.offsetWidth) + j, Y = this.lastItemY + this.lastLineHeight + this.titleHeight, Y = this.handleOverflow(Y) + j, G || (this.box = G = K.rect().addClass("highcharts-legend-box").attr({ r: $.borderRadius }).add(D)), k.styledMode || G.attr({ stroke: $.borderColor, "stroke-width": $.borderWidth || 0, fill: $.backgroundColor || "none" }).shadow($.shadow), _ > 0 && Y > 0 && G[G.placed ? "animate" : "attr"](G.crisp.call({}, { x: 0, y: 0, width: _, height: Y }, G.strokeWidth())), D[a1 ? "show" : "hide"](), k.styledMode && D.getStyle("display") === "none" && (_ = Y = 0), this.legendWidth = _, this.legendHeight = Y, a1 && this.align(), this.proximate || this.positionItems(), T(this, "afterRender");\n }\n align(k = this.chart.spacingBox) {\n let K = this.chart, $ = this.options, j = k.y;\n /(lth|ct|rth)/.test(this.getAlignment()) && K.titleOffset[0] > 0 ? j += K.titleOffset[0] : /(lbh|cb|rbh)/.test(this.getAlignment()) && K.titleOffset[2] > 0 && (j -= K.titleOffset[2]), j !== k.y && (k = E(k, { y: j })), K.hasRendered || (this.group.placed = !1), this.group.align(E($, { width: this.legendWidth, height: this.legendHeight, verticalAlign: this.proximate ? "top" : $.verticalAlign }), !0, k);\n }\n handleOverflow(k) {\n let K = this, $ = this.chart, j = $.renderer, r1 = this.options, a1 = r1.y, _ = r1.verticalAlign === "top", Y = this.padding, D = r1.maxHeight, H = r1.navigation, G = L(H.animation, !0), J = H.arrowSize || 12, F = this.pages, V = this.allItems, Q = function(M1) {\n typeof M1 == "number" ? u1.attr({ height: M1 }) : u1 && (K.clipRect = u1.destroy(), K.contentGroup.clip()), K.contentGroup.div && (K.contentGroup.div.style.clip = M1 ? "rect(" + Y + "px,9999px," + (Y + M1) + "px,0)" : "auto");\n }, Z = function(M1) {\n return K[M1] = j.circle(0, 0, 1.3 * J).translate(J / 2, J / 2).add(o1), $.styledMode || K[M1].attr("fill", "rgba(0,0,0,0.0001)"), K[M1];\n }, t1, n1, U, e1 = $.spacingBox.height + (_ ? -a1 : a1) - Y, o1 = this.nav, u1 = this.clipRect;\n return r1.layout !== "horizontal" || r1.verticalAlign === "middle" || r1.floating || (e1 /= 2), D && (e1 = Math.min(e1, D)), F.length = 0, k && e1 > 0 && k > e1 && H.enabled !== !1 ? (this.clipHeight = t1 = Math.max(e1 - 20 - this.titleHeight - Y, 0), this.currentPage = L(this.currentPage, 1), this.fullHeight = k, V.forEach((M1, A1) => {\n let l1 = (U = M1.legendItem || {}).y || 0, b1 = Math.round(U.label.getBBox().height), h1 = F.length;\n (!h1 || l1 - F[h1 - 1] > t1 && (n1 || l1) !== F[h1 - 1]) && (F.push(n1 || l1), h1++), U.pageIx = h1 - 1, n1 && ((V[A1 - 1].legendItem || {}).pageIx = h1 - 1), A1 === V.length - 1 && l1 + b1 - F[h1 - 1] > t1 && l1 > F[h1 - 1] && (F.push(l1), U.pageIx = h1), l1 !== n1 && (n1 = l1);\n }), u1 || (u1 = K.clipRect = j.clipRect(0, Y - 2, 9999, 0), K.contentGroup.clip(u1)), Q(t1), o1 || (this.nav = o1 = j.g().attr({ zIndex: 1 }).add(this.group), this.up = j.symbol("triangle", 0, 0, J, J).add(o1), Z("upTracker").on("click", function() {\n K.scroll(-1, G);\n }), this.pager = j.text("", 15, 10).addClass("highcharts-legend-navigation"), !$.styledMode && H.style && this.pager.css(H.style), this.pager.add(o1), this.down = j.symbol("triangle-down", 0, 0, J, J).add(o1), Z("downTracker").on("click", function() {\n K.scroll(1, G);\n })), K.scroll(0), k = e1) : o1 && (Q(), this.nav = o1.destroy(), this.scrollGroup.attr({ translateY: 1 }), this.clipHeight = 0), k;\n }\n scroll(k, K) {\n let $ = this.chart, j = this.pages, r1 = j.length, a1 = this.clipHeight, _ = this.options.navigation, Y = this.pager, D = this.padding, H = this.currentPage + k;\n H > r1 && (H = r1), H > 0 && (K !== void 0 && b(K, $), this.nav.attr({ translateX: D, translateY: a1 + this.padding + 7 + this.titleHeight, visibility: "inherit" }), [this.up, this.upTracker].forEach(function(G) {\n G.attr({ class: H === 1 ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" });\n }), Y.attr({ text: H + "/" + r1 }), [this.down, this.downTracker].forEach(function(G) {\n G.attr({ x: 18 + this.pager.getBBox().width, class: H === r1 ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" });\n }, this), $.styledMode || (this.up.attr({ fill: H === 1 ? _.inactiveColor : _.activeColor }), this.upTracker.css({ cursor: H === 1 ? "default" : "pointer" }), this.down.attr({ fill: H === r1 ? _.inactiveColor : _.activeColor }), this.downTracker.css({ cursor: H === r1 ? "default" : "pointer" })), this.scrollOffset = -j[H - 1] + this.initialItemY, this.scrollGroup.animate({ translateY: this.scrollOffset }), this.currentPage = H, this.positionCheckboxes(), B(() => {\n T(this, "afterScroll", { currentPage: H });\n }, h(L(K, $.renderer.globalAnimation, !0)).duration));\n }\n setItemEvents(k, K, $) {\n let j = this, r1 = k.legendItem || {}, a1 = j.chart.renderer.boxWrapper, _ = k instanceof l, Y = k instanceof s, D = "highcharts-legend-" + (_ ? "point" : "series") + "-active", H = j.chart.styledMode, G = $ ? [K, r1.symbol] : [r1.group], J = (F) => {\n j.allItems.forEach((V) => {\n k !== V && [V].concat(V.linkedSeries || []).forEach((Q) => {\n Q.setState(F, !_);\n });\n });\n };\n for (let F of G)\n F && F.on("mouseover", function() {\n k.visible && J("inactive"), k.setState("hover"), k.visible && a1.addClass(D), H || K.css(j.options.itemHoverStyle);\n }).on("mouseout", function() {\n j.chart.styledMode || K.css(E(k.visible ? j.itemStyle : j.itemHiddenStyle)), J(""), a1.removeClass(D), k.setState();\n }).on("click", function(V) {\n let Q = function() {\n k.setVisible && k.setVisible(), J(k.visible ? "inactive" : "");\n };\n a1.removeClass(D), T(j, "itemClick", { browserEvent: V, legendItem: k }, Q), _ ? k.firePointEvent("legendItemClick", { browserEvent: V }) : Y && T(k, "legendItemClick", { browserEvent: V });\n });\n }\n createCheckboxForItem(k) {\n k.checkbox = v("input", { type: "checkbox", className: "highcharts-legend-checkbox", checked: k.selected, defaultChecked: k.selected }, this.options.itemCheckboxStyle, this.chart.container), m(k.checkbox, "click", function(K) {\n let $ = K.target;\n T(k.series || k, "checkboxClick", { checked: $.checked, item: k }, function() {\n k.select();\n });\n });\n }\n }\n return (u = I || (I = {})).compose = function(P) {\n w(C, "Core.Legend") && m(P, "beforeMargins", function() {\n this.legend = new u(this, this.options.legend);\n });\n }, I;\n }), n(r, "Core/Chart/Chart.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Axis/Axis.js"], r["Core/Defaults.js"], r["Core/Templating.js"], r["Core/Foundation.js"], r["Core/Globals.js"], r["Core/Renderer/RendererRegistry.js"], r["Core/Series/Series.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Renderer/SVG/SVGRenderer.js"], r["Core/Time.js"], r["Core/Utilities.js"], r["Core/Renderer/HTML/AST.js"], r["Core/Axis/Tick.js"]], function(o, i, a, s, l, c, p, d, u, h, b, M, C, g) {\n let { animate: f, animObject: O, setAnimation: m } = o, { defaultOptions: v, defaultTime: y } = a, { numberFormat: z } = s, { registerEventOptions: N } = l, { charts: W, doc: T, marginNames: x, svg: E, win: L } = c, { seriesTypes: w } = u, { addEvent: q, attr: S, createElement: B, css: I, defined: P, diffObjects: k, discardElement: K, erase: $, error: j, extend: r1, find: a1, fireEvent: _, getStyle: Y, isArray: D, isNumber: H, isObject: G, isString: J, merge: F, objectEach: V, pick: Q, pInt: Z, relativeLength: t1, removeEvent: n1, splat: U, syncTimeout: e1, uniqueKey: o1 } = M;\n class u1 {\n static chart(A1, l1, b1) {\n return new u1(A1, l1, b1);\n }\n constructor(A1, l1, b1) {\n this.sharedClips = {};\n let h1 = [...arguments];\n (J(A1) || A1.nodeName) && (this.renderTo = h1.shift()), this.init(h1[0], h1[1]);\n }\n setZoomOptions() {\n let A1 = this.options.chart, l1 = A1.zooming;\n this.zooming = { ...l1, type: Q(A1.zoomType, l1.type), key: Q(A1.zoomKey, l1.key), pinchType: Q(A1.pinchType, l1.pinchType), singleTouch: Q(A1.zoomBySingleTouch, l1.singleTouch, !1), resetButton: F(l1.resetButton, A1.resetZoomButton) };\n }\n init(A1, l1) {\n _(this, "init", { args: arguments }, function() {\n let b1 = F(v, A1), h1 = b1.chart;\n this.userOptions = r1({}, A1), this.margin = [], this.spacing = [], this.labelCollectors = [], this.callback = l1, this.isResizing = 0, this.options = b1, this.axes = [], this.series = [], this.time = A1.time && Object.keys(A1.time).length ? new b(A1.time) : c.time, this.numberFormatter = h1.numberFormatter || z, this.styledMode = h1.styledMode, this.hasCartesianSeries = h1.showAxes, this.index = W.length, W.push(this), c.chartCount++, N(this, h1), this.xAxis = [], this.yAxis = [], this.pointCount = this.colorCounter = this.symbolCounter = 0, this.setZoomOptions(), _(this, "afterInit"), this.firstRender();\n });\n }\n initSeries(A1) {\n let l1 = this.options.chart, b1 = A1.type || l1.type, h1 = w[b1];\n h1 || j(17, !0, this, { missingModuleFor: b1 });\n let z1 = new h1();\n return typeof z1.init == "function" && z1.init(this, A1), z1;\n }\n setSortedData() {\n this.getSeriesOrderByLinks().forEach(function(A1) {\n A1.points || A1.data || !A1.enabledDataSorting || A1.setData(A1.options.data, !1);\n });\n }\n getSeriesOrderByLinks() {\n return this.series.concat().sort(function(A1, l1) {\n return A1.linkedSeries.length || l1.linkedSeries.length ? l1.linkedSeries.length - A1.linkedSeries.length : 0;\n });\n }\n orderItems(A1, l1 = 0) {\n let b1 = this[A1], h1 = this.options[A1] = U(this.options[A1]).slice(), z1 = this.userOptions[A1] = this.userOptions[A1] ? U(this.userOptions[A1]).slice() : [];\n if (this.hasRendered && (h1.splice(l1), z1.splice(l1)), b1)\n for (let O1 = l1, m1 = b1.length; O1 < m1; ++O1) {\n let L1 = b1[O1];\n L1 && (L1.index = O1, L1 instanceof d && (L1.name = L1.getName()), L1.options.isInternal || (h1[O1] = L1.options, z1[O1] = L1.userOptions));\n }\n }\n isInsidePlot(A1, l1, b1 = {}) {\n var K1;\n let { inverted: h1, plotBox: z1, plotLeft: O1, plotTop: m1, scrollablePlotBox: L1 } = this, { scrollLeft: y1 = 0, scrollTop: B1 = 0 } = b1.visiblePlotOnly && ((K1 = this.scrollablePlotArea) == null ? void 0 : K1.scrollingContainer) || {}, T1 = b1.series, F1 = b1.visiblePlotOnly && L1 || z1, X1 = b1.inverted ? l1 : A1, G1 = b1.inverted ? A1 : l1, Q1 = { x: X1, y: G1, isInsidePlot: !0, options: b1 };\n if (!b1.ignoreX) {\n let n0 = T1 && (h1 && !this.polar ? T1.yAxis : T1.xAxis) || { pos: O1, len: 1 / 0 }, u0 = b1.paneCoordinates ? n0.pos + X1 : O1 + X1;\n u0 >= Math.max(y1 + O1, n0.pos) && u0 <= Math.min(y1 + O1 + F1.width, n0.pos + n0.len) || (Q1.isInsidePlot = !1);\n }\n if (!b1.ignoreY && Q1.isInsidePlot) {\n let n0 = !h1 && b1.axis && !b1.axis.isXAxis && b1.axis || T1 && (h1 ? T1.xAxis : T1.yAxis) || { pos: m1, len: 1 / 0 }, u0 = b1.paneCoordinates ? n0.pos + G1 : m1 + G1;\n u0 >= Math.max(B1 + m1, n0.pos) && u0 <= Math.min(B1 + m1 + F1.height, n0.pos + n0.len) || (Q1.isInsidePlot = !1);\n }\n return _(this, "afterIsInsidePlot", Q1), Q1.isInsidePlot;\n }\n redraw(A1) {\n _(this, "beforeRedraw");\n let l1 = this.hasCartesianSeries ? this.axes : this.colorAxis || [], b1 = this.series, h1 = this.pointer, z1 = this.legend, O1 = this.userOptions.legend, m1 = this.renderer, L1 = m1.isHidden(), y1 = [], B1, T1, F1, X1 = this.isDirtyBox, G1 = this.isDirtyLegend, Q1;\n for (m1.rootFontSize = m1.boxWrapper.getStyle("font-size"), this.setResponsive && this.setResponsive(!1), m(!!this.hasRendered && A1, this), L1 && this.temporaryDisplay(), this.layOutTitles(!1), F1 = b1.length; F1--; )\n if (((Q1 = b1[F1]).options.stacking || Q1.options.centerInCategory) && (T1 = !0, Q1.isDirty)) {\n B1 = !0;\n break;\n }\n if (B1)\n for (F1 = b1.length; F1--; )\n (Q1 = b1[F1]).options.stacking && (Q1.isDirty = !0);\n b1.forEach(function(K1) {\n K1.isDirty && (K1.options.legendType === "point" ? (typeof K1.updateTotals == "function" && K1.updateTotals(), G1 = !0) : O1 && (O1.labelFormatter || O1.labelFormat) && (G1 = !0)), K1.isDirtyData && _(K1, "updatedData");\n }), G1 && z1 && z1.options.enabled && (z1.render(), this.isDirtyLegend = !1), T1 && this.getStacks(), l1.forEach(function(K1) {\n K1.updateNames(), K1.setScale();\n }), this.getMargins(), l1.forEach(function(K1) {\n K1.isDirty && (X1 = !0);\n }), l1.forEach(function(K1) {\n let n0 = K1.min + "," + K1.max;\n K1.extKey !== n0 && (K1.extKey = n0, y1.push(function() {\n _(K1, "afterSetExtremes", r1(K1.eventArgs, K1.getExtremes())), delete K1.eventArgs;\n })), (X1 || T1) && K1.redraw();\n }), X1 && this.drawChartBox(), _(this, "predraw"), b1.forEach(function(K1) {\n (X1 || K1.isDirty) && K1.visible && K1.redraw(), K1.isDirtyData = !1;\n }), h1 && h1.reset(!0), m1.draw(), _(this, "redraw"), _(this, "render"), L1 && this.temporaryDisplay(!0), y1.forEach(function(K1) {\n K1.call();\n });\n }\n get(A1) {\n let l1 = this.series;\n function b1(z1) {\n return z1.id === A1 || z1.options && z1.options.id === A1;\n }\n let h1 = a1(this.axes, b1) || a1(this.series, b1);\n for (let z1 = 0; !h1 && z1 < l1.length; z1++)\n h1 = a1(l1[z1].points || [], b1);\n return h1;\n }\n getAxes() {\n let A1 = this.userOptions;\n for (let l1 of (_(this, "getAxes"), ["xAxis", "yAxis"]))\n for (let b1 of A1[l1] = U(A1[l1] || {}))\n new i(this, b1, l1);\n _(this, "afterGetAxes");\n }\n getSelectedPoints() {\n return this.series.reduce((A1, l1) => (l1.getPointsCollection().forEach((b1) => {\n Q(b1.selectedStaging, b1.selected) && A1.push(b1);\n }), A1), []);\n }\n getSelectedSeries() {\n return this.series.filter(function(A1) {\n return A1.selected;\n });\n }\n setTitle(A1, l1, b1) {\n this.applyDescription("title", A1), this.applyDescription("subtitle", l1), this.applyDescription("caption", void 0), this.layOutTitles(b1);\n }\n applyDescription(A1, l1) {\n let b1 = this, h1 = this.options[A1] = F(this.options[A1], l1), z1 = this[A1];\n z1 && l1 && (this[A1] = z1 = z1.destroy()), h1 && !z1 && ((z1 = this.renderer.text(h1.text, 0, 0, h1.useHTML).attr({ align: h1.align, class: "highcharts-" + A1, zIndex: h1.zIndex || 4 }).add()).update = function(O1, m1) {\n b1.applyDescription(A1, O1), b1.layOutTitles(m1);\n }, this.styledMode || z1.css(r1(A1 === "title" ? { fontSize: this.options.isStock ? "1em" : "1.2em" } : {}, h1.style)), this[A1] = z1);\n }\n layOutTitles(A1 = !0) {\n let l1 = [0, 0, 0], b1 = this.renderer, h1 = this.spacingBox;\n ["title", "subtitle", "caption"].forEach(function(O1) {\n let m1 = this[O1], L1 = this.options[O1], y1 = L1.verticalAlign || "top", B1 = O1 === "title" ? y1 === "top" ? -3 : 0 : y1 === "top" ? l1[0] + 2 : 0;\n if (m1) {\n m1.css({ width: (L1.width || h1.width + (L1.widthAdjust || 0)) + "px" });\n let T1 = b1.fontMetrics(m1).b, F1 = Math.round(m1.getBBox(L1.useHTML).height);\n m1.align(r1({ y: y1 === "bottom" ? T1 : B1 + T1, height: F1 }, L1), !1, "spacingBox"), L1.floating || (y1 === "top" ? l1[0] = Math.ceil(l1[0] + F1) : y1 === "bottom" && (l1[2] = Math.ceil(l1[2] + F1)));\n }\n }, this), l1[0] && (this.options.title.verticalAlign || "top") === "top" && (l1[0] += this.options.title.margin), l1[2] && this.options.caption.verticalAlign === "bottom" && (l1[2] += this.options.caption.margin);\n let z1 = !this.titleOffset || this.titleOffset.join(",") !== l1.join(",");\n this.titleOffset = l1, _(this, "afterLayOutTitles"), !this.isDirtyBox && z1 && (this.isDirtyBox = this.isDirtyLegend = z1, this.hasRendered && A1 && this.isDirtyBox && this.redraw());\n }\n getContainerBox() {\n let A1 = [].map.call(this.renderTo.children, (b1) => {\n if (b1 !== this.container) {\n let h1 = b1.style.display;\n return b1.style.display = "none", [b1, h1];\n }\n }), l1 = { width: Y(this.renderTo, "width", !0) || 0, height: Y(this.renderTo, "height", !0) || 0 };\n return A1.filter(Boolean).forEach(([b1, h1]) => {\n b1.style.display = h1;\n }), l1;\n }\n getChartSize() {\n var O1;\n let A1 = this.options.chart, l1 = A1.width, b1 = A1.height, h1 = this.getContainerBox(), z1 = h1.height > 1 && !(!((O1 = this.renderTo.parentElement) != null && O1.style.height) && this.renderTo.style.height === "100%");\n this.chartWidth = Math.max(0, l1 || h1.width || 600), this.chartHeight = Math.max(0, t1(b1, this.chartWidth) || (z1 ? h1.height : 400)), this.containerBox = h1;\n }\n temporaryDisplay(A1) {\n let l1 = this.renderTo, b1;\n if (A1)\n for (; l1 && l1.style; )\n l1.hcOrigStyle && (I(l1, l1.hcOrigStyle), delete l1.hcOrigStyle), l1.hcOrigDetached && (T.body.removeChild(l1), l1.hcOrigDetached = !1), l1 = l1.parentNode;\n else\n for (; l1 && l1.style && (T.body.contains(l1) || l1.parentNode || (l1.hcOrigDetached = !0, T.body.appendChild(l1)), (Y(l1, "display", !1) === "none" || l1.hcOricDetached) && (l1.hcOrigStyle = { display: l1.style.display, height: l1.style.height, overflow: l1.style.overflow }, b1 = { display: "block", overflow: "hidden" }, l1 !== this.renderTo && (b1.height = 0), I(l1, b1), l1.offsetWidth || l1.style.setProperty("display", "block", "important")), (l1 = l1.parentNode) !== T.body); )\n ;\n }\n setClassName(A1) {\n this.container.className = "highcharts-container " + (A1 || "");\n }\n getContainer() {\n var F1;\n let A1 = this.options, l1 = A1.chart, b1 = "data-highcharts-chart", h1 = o1(), z1, O1 = this.renderTo;\n O1 || (this.renderTo = O1 = l1.renderTo), J(O1) && (this.renderTo = O1 = T.getElementById(O1)), O1 || j(13, !0, this);\n let m1 = Z(S(O1, b1));\n H(m1) && W[m1] && W[m1].hasRendered && W[m1].destroy(), S(O1, b1, this.index), O1.innerHTML = C.emptyHTML, l1.skipClone || O1.offsetWidth || this.temporaryDisplay(), this.getChartSize();\n let L1 = this.chartHeight, y1 = this.chartWidth;\n I(O1, { overflow: "hidden" }), this.styledMode || (z1 = r1({ position: "relative", overflow: "hidden", width: y1 + "px", height: L1 + "px", textAlign: "left", lineHeight: "normal", zIndex: 0, "-webkit-tap-highlight-color": "rgba(0,0,0,0)", userSelect: "none", "touch-action": "manipulation", outline: "none", padding: "0px" }, l1.style || {}));\n let B1 = B("div", { id: h1 }, z1, O1);\n this.container = B1, this.getChartSize(), y1 === this.chartWidth || (y1 = this.chartWidth, this.styledMode || I(B1, { width: Q((F1 = l1.style) == null ? void 0 : F1.width, y1 + "px") })), this.containerBox = this.getContainerBox(), this._cursor = B1.style.cursor;\n let T1 = l1.renderer || !E ? p.getRendererType(l1.renderer) : h;\n if (this.renderer = new T1(B1, y1, L1, void 0, l1.forExport, A1.exporting && A1.exporting.allowHTML, this.styledMode), m(void 0, this), this.setClassName(l1.className), this.styledMode)\n for (let X1 in A1.defs)\n this.renderer.definition(A1.defs[X1]);\n else\n this.renderer.setStyle(l1.style);\n this.renderer.chartIndex = this.index, _(this, "afterGetContainer");\n }\n getMargins(A1) {\n let { spacing: l1, margin: b1, titleOffset: h1 } = this;\n this.resetMargins(), h1[0] && !P(b1[0]) && (this.plotTop = Math.max(this.plotTop, h1[0] + l1[0])), h1[2] && !P(b1[2]) && (this.marginBottom = Math.max(this.marginBottom, h1[2] + l1[2])), this.legend && this.legend.display && this.legend.adjustMargins(b1, l1), _(this, "getMargins"), A1 || this.getAxisMargins();\n }\n getAxisMargins() {\n let A1 = this, l1 = A1.axisOffset = [0, 0, 0, 0], b1 = A1.colorAxis, h1 = A1.margin, z1 = function(O1) {\n O1.forEach(function(m1) {\n m1.visible && m1.getOffset();\n });\n };\n A1.hasCartesianSeries ? z1(A1.axes) : b1 && b1.length && z1(b1), x.forEach(function(O1, m1) {\n P(h1[m1]) || (A1[O1] += l1[m1]);\n }), A1.setChartSize();\n }\n getOptions() {\n return k(this.userOptions, v);\n }\n reflow(A1) {\n var z1;\n let l1 = this, b1 = l1.containerBox, h1 = l1.getContainerBox();\n (z1 = l1.pointer) == null || delete z1.chartPosition, !l1.isPrinting && !l1.isResizing && b1 && h1.width && ((h1.width !== b1.width || h1.height !== b1.height) && (M.clearTimeout(l1.reflowTimeout), l1.reflowTimeout = e1(function() {\n l1.container && l1.setSize(void 0, void 0, !1);\n }, A1 ? 100 : 0)), l1.containerBox = h1);\n }\n setReflow() {\n let A1 = this, l1 = (b1) => {\n var h1;\n (h1 = A1.options) != null && h1.chart.reflow && A1.hasLoaded && A1.reflow(b1);\n };\n if (typeof ResizeObserver == "function")\n new ResizeObserver(l1).observe(A1.renderTo);\n else {\n let b1 = q(L, "resize", l1);\n q(this, "destroy", b1);\n }\n }\n setSize(A1, l1, b1) {\n let h1 = this, z1 = h1.renderer;\n h1.isResizing += 1, m(b1, h1);\n let O1 = z1.globalAnimation;\n h1.oldChartHeight = h1.chartHeight, h1.oldChartWidth = h1.chartWidth, A1 !== void 0 && (h1.options.chart.width = A1), l1 !== void 0 && (h1.options.chart.height = l1), h1.getChartSize();\n let { chartWidth: m1, chartHeight: L1, scrollablePixelsX: y1 = 0, scrollablePixelsY: B1 = 0 } = h1;\n (h1.isDirtyBox || m1 !== h1.oldChartWidth || L1 !== h1.oldChartHeight) && (h1.styledMode || (O1 ? f : I)(h1.container, { width: `${m1 + y1}px`, height: `${L1 + B1}px` }, O1), h1.setChartSize(!0), z1.setSize(m1, L1, O1), h1.axes.forEach(function(T1) {\n T1.isDirty = !0, T1.setScale();\n }), h1.isDirtyLegend = !0, h1.isDirtyBox = !0, h1.layOutTitles(), h1.getMargins(), h1.redraw(O1), h1.oldChartHeight = void 0, _(h1, "resize"), setTimeout(() => {\n h1 && _(h1, "endResize");\n }, O(O1).duration)), h1.isResizing -= 1;\n }\n setChartSize(A1) {\n let l1, b1, h1, z1, { chartHeight: O1, chartWidth: m1, inverted: L1, spacing: y1, renderer: B1 } = this, T1 = this.clipOffset, F1 = Math[L1 ? "floor" : "round"];\n this.plotLeft = l1 = Math.round(this.plotLeft), this.plotTop = b1 = Math.round(this.plotTop), this.plotWidth = h1 = Math.max(0, Math.round(m1 - l1 - this.marginRight)), this.plotHeight = z1 = Math.max(0, Math.round(O1 - b1 - this.marginBottom)), this.plotSizeX = L1 ? z1 : h1, this.plotSizeY = L1 ? h1 : z1, this.spacingBox = B1.spacingBox = { x: y1[3], y: y1[0], width: m1 - y1[3] - y1[1], height: O1 - y1[0] - y1[2] }, this.plotBox = B1.plotBox = { x: l1, y: b1, width: h1, height: z1 }, T1 && (this.clipBox = { x: F1(T1[3]), y: F1(T1[0]), width: F1(this.plotSizeX - T1[1] - T1[3]), height: F1(this.plotSizeY - T1[0] - T1[2]) }), A1 || (this.axes.forEach(function(X1) {\n X1.setAxisSize(), X1.setAxisTranslation();\n }), B1.alignElements()), _(this, "afterSetChartSize", { skipAxes: A1 });\n }\n resetMargins() {\n _(this, "resetMargins");\n let A1 = this, l1 = A1.options.chart, b1 = l1.plotBorderWidth || 0, h1 = b1 / 2;\n ["margin", "spacing"].forEach(function(z1) {\n let O1 = l1[z1], m1 = G(O1) ? O1 : [O1, O1, O1, O1];\n ["Top", "Right", "Bottom", "Left"].forEach(function(L1, y1) {\n A1[z1][y1] = Q(l1[z1 + L1], m1[y1]);\n });\n }), x.forEach(function(z1, O1) {\n A1[z1] = Q(A1.margin[O1], A1.spacing[O1]);\n }), A1.axisOffset = [0, 0, 0, 0], A1.clipOffset = [h1, h1, h1, h1], A1.plotBorderWidth = b1;\n }\n drawChartBox() {\n let A1 = this.options.chart, l1 = this.renderer, b1 = this.chartWidth, h1 = this.chartHeight, z1 = this.styledMode, O1 = this.plotBGImage, m1 = A1.backgroundColor, L1 = A1.plotBackgroundColor, y1 = A1.plotBackgroundImage, B1 = this.plotLeft, T1 = this.plotTop, F1 = this.plotWidth, X1 = this.plotHeight, G1 = this.plotBox, Q1 = this.clipRect, K1 = this.clipBox, n0 = this.chartBackground, u0 = this.plotBackground, c0 = this.plotBorder, C0, y0, q1, v1 = "animate";\n n0 || (this.chartBackground = n0 = l1.rect().addClass("highcharts-background").add(), v1 = "attr"), z1 ? C0 = y0 = n0.strokeWidth() : (y0 = (C0 = A1.borderWidth || 0) + (A1.shadow ? 8 : 0), q1 = { fill: m1 || "none" }, (C0 || n0["stroke-width"]) && (q1.stroke = A1.borderColor, q1["stroke-width"] = C0), n0.attr(q1).shadow(A1.shadow)), n0[v1]({ x: y0 / 2, y: y0 / 2, width: b1 - y0 - C0 % 2, height: h1 - y0 - C0 % 2, r: A1.borderRadius }), v1 = "animate", u0 || (v1 = "attr", this.plotBackground = u0 = l1.rect().addClass("highcharts-plot-background").add()), u0[v1](G1), !z1 && (u0.attr({ fill: L1 || "none" }).shadow(A1.plotShadow), y1 && (O1 ? (y1 !== O1.attr("href") && O1.attr("href", y1), O1.animate(G1)) : this.plotBGImage = l1.image(y1, B1, T1, F1, X1).add())), Q1 ? Q1.animate({ width: K1.width, height: K1.height }) : this.clipRect = l1.clipRect(K1), v1 = "animate", c0 || (v1 = "attr", this.plotBorder = c0 = l1.rect().addClass("highcharts-plot-border").attr({ zIndex: 1 }).add()), z1 || c0.attr({ stroke: A1.plotBorderColor, "stroke-width": A1.plotBorderWidth || 0, fill: "none" }), c0[v1](c0.crisp({ x: B1, y: T1, width: F1, height: X1 }, -c0.strokeWidth())), this.isDirtyBox = !1, _(this, "afterDrawChartBox");\n }\n propFromSeries() {\n let A1, l1, b1, h1 = this, z1 = h1.options.chart, O1 = h1.options.series;\n ["inverted", "angular", "polar"].forEach(function(m1) {\n for (l1 = w[z1.type], b1 = z1[m1] || l1 && l1.prototype[m1], A1 = O1 && O1.length; !b1 && A1--; )\n (l1 = w[O1[A1].type]) && l1.prototype[m1] && (b1 = !0);\n h1[m1] = b1;\n });\n }\n linkSeries(A1) {\n let l1 = this, b1 = l1.series;\n b1.forEach(function(h1) {\n h1.linkedSeries.length = 0;\n }), b1.forEach(function(h1) {\n let { linkedTo: z1 } = h1.options;\n if (J(z1)) {\n let O1;\n (O1 = z1 === ":previous" ? l1.series[h1.index - 1] : l1.get(z1)) && O1.linkedParent !== h1 && (O1.linkedSeries.push(h1), h1.linkedParent = O1, O1.enabledDataSorting && h1.setDataSortingOptions(), h1.visible = Q(h1.options.visible, O1.options.visible, h1.visible));\n }\n }), _(this, "afterLinkSeries", { isUpdating: A1 });\n }\n renderSeries() {\n this.series.forEach(function(A1) {\n A1.translate(), A1.render();\n });\n }\n render() {\n var B1;\n let A1 = this.axes, l1 = this.colorAxis, b1 = this.renderer, h1 = this.options.chart.axisLayoutRuns || 2, z1 = (T1) => {\n T1.forEach((F1) => {\n F1.visible && F1.render();\n });\n }, O1 = 0, m1 = !0, L1, y1 = 0;\n for (let T1 of (this.setTitle(), _(this, "beforeMargins"), (B1 = this.getStacks) == null || B1.call(this), this.getMargins(!0), this.setChartSize(), A1)) {\n let { options: F1 } = T1, { labels: X1 } = F1;\n if (this.hasCartesianSeries && T1.horiz && T1.visible && X1.enabled && T1.series.length && T1.coll !== "colorAxis" && !this.polar) {\n O1 = F1.tickLength, T1.createGroups();\n let G1 = new g(T1, 0, "", !0), Q1 = G1.createLabel("x", X1);\n if (G1.destroy(), Q1 && Q(X1.reserveSpace, !H(F1.crossing)) && (O1 = Q1.getBBox().height + X1.distance + Math.max(F1.offset || 0, 0)), O1) {\n Q1 == null || Q1.destroy();\n break;\n }\n }\n }\n for (this.plotHeight = Math.max(this.plotHeight - O1, 0); (m1 || L1 || h1 > 1) && y1 < h1; ) {\n let T1 = this.plotWidth, F1 = this.plotHeight;\n for (let X1 of A1)\n y1 === 0 ? X1.setScale() : (X1.horiz && m1 || !X1.horiz && L1) && X1.setTickInterval(!0);\n y1 === 0 ? this.getAxisMargins() : this.getMargins(), m1 = T1 / this.plotWidth > (y1 ? 1 : 1.1), L1 = F1 / this.plotHeight > (y1 ? 1 : 1.05), y1++;\n }\n this.drawChartBox(), this.hasCartesianSeries ? z1(A1) : l1 && l1.length && z1(l1), this.seriesGroup || (this.seriesGroup = b1.g("series-group").attr({ zIndex: 3 }).shadow(this.options.chart.seriesGroupShadow).add()), this.renderSeries(), this.addCredits(), this.setResponsive && this.setResponsive(), this.hasRendered = !0;\n }\n addCredits(A1) {\n let l1 = this, b1 = F(!0, this.options.credits, A1);\n b1.enabled && !this.credits && (this.credits = this.renderer.text(b1.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() {\n b1.href && (L.location.href = b1.href);\n }).attr({ align: b1.position.align, zIndex: 8 }), l1.styledMode || this.credits.css(b1.style), this.credits.add().align(b1.position), this.credits.update = function(h1) {\n l1.credits = l1.credits.destroy(), l1.addCredits(h1);\n });\n }\n destroy() {\n let A1, l1 = this, b1 = l1.axes, h1 = l1.series, z1 = l1.container, O1 = z1 && z1.parentNode;\n for (_(l1, "destroy"), l1.renderer.forExport ? $(W, l1) : W[l1.index] = void 0, c.chartCount--, l1.renderTo.removeAttribute("data-highcharts-chart"), n1(l1), A1 = b1.length; A1--; )\n b1[A1] = b1[A1].destroy();\n for (this.scroller && this.scroller.destroy && this.scroller.destroy(), A1 = h1.length; A1--; )\n h1[A1] = h1[A1].destroy();\n ["title", "subtitle", "chartBackground", "plotBackground", "plotBGImage", "plotBorder", "seriesGroup", "clipRect", "credits", "pointer", "rangeSelector", "legend", "resetZoomButton", "tooltip", "renderer"].forEach(function(m1) {\n let L1 = l1[m1];\n L1 && L1.destroy && (l1[m1] = L1.destroy());\n }), z1 && (z1.innerHTML = C.emptyHTML, n1(z1), O1 && K(z1)), V(l1, function(m1, L1) {\n delete l1[L1];\n });\n }\n firstRender() {\n var h1;\n let A1 = this, l1 = A1.options;\n A1.getContainer(), A1.resetMargins(), A1.setChartSize(), A1.propFromSeries(), A1.getAxes();\n let b1 = D(l1.series) ? l1.series : [];\n l1.series = [], b1.forEach(function(z1) {\n A1.initSeries(z1);\n }), A1.linkSeries(), A1.setSortedData(), _(A1, "beforeRender"), A1.render(), (h1 = A1.pointer) == null || h1.getChartPosition(), A1.renderer.imgCount || A1.hasLoaded || A1.onload(), A1.temporaryDisplay(!0);\n }\n onload() {\n this.callbacks.concat([this.callback]).forEach(function(A1) {\n A1 && this.index !== void 0 && A1.apply(this, [this]);\n }, this), _(this, "load"), _(this, "render"), P(this.index) && this.setReflow(), this.warnIfA11yModuleNotLoaded(), this.hasLoaded = !0;\n }\n warnIfA11yModuleNotLoaded() {\n let { options: A1, title: l1 } = this;\n !A1 || this.accessibility || (this.renderer.boxWrapper.attr({ role: "img", "aria-label": (l1 && l1.element.textContent || "").replace(/ this.transform({ reset: !0, trigger: "zoom" }));\n }\n pan(A1, l1) {\n let b1 = this, h1 = typeof l1 == "object" ? l1 : { enabled: l1, type: "x" }, z1 = h1.type, O1 = z1 && b1[{ x: "xAxis", xy: "axes", y: "yAxis" }[z1]].filter((L1) => L1.options.panningEnabled && !L1.options.isInternal), m1 = b1.options.chart;\n m1 != null && m1.panning && (m1.panning = h1), _(this, "pan", { originalEvent: A1 }, () => {\n b1.transform({ axes: O1, event: A1, to: { x: A1.chartX - (b1.mouseDownX || 0), y: A1.chartY - (b1.mouseDownY || 0) }, trigger: "pan" }), I(b1.container, { cursor: "move" });\n });\n }\n transform(A1) {\n var X1;\n let { axes: l1 = this.axes, event: b1, from: h1 = {}, reset: z1, selection: O1, to: m1 = {}, trigger: L1 } = A1, { inverted: y1 } = this, B1 = !1, T1, F1;\n for (let G1 of ((X1 = this.hoverPoints) == null || X1.forEach((Q1) => Q1.setState()), l1)) {\n let { horiz: Q1, len: K1, minPointOffset: n0 = 0, options: u0, reversed: c0 } = G1, C0 = Q1 ? "width" : "height", y0 = Q1 ? "x" : "y", q1 = Q(m1[C0], G1.len), v1 = Q(h1[C0], G1.len), k1 = 10 > Math.abs(q1) ? 1 : q1 / v1, S1 = (h1[y0] || 0) + v1 / 2 - G1.pos, i0 = S1 - ((m1[y0] ?? G1.pos) + q1 / 2 - G1.pos) / k1, m0 = c0 && !y1 || !c0 && y1 ? -1 : 1;\n if (!z1 && (S1 < 0 || S1 > G1.len))\n continue;\n let l0 = G1.toValue(i0, !0) + (O1 || G1.isOrdinal ? 0 : n0 * m0), _1 = G1.toValue(i0 + K1 / k1, !0) - (O1 || G1.isOrdinal ? 0 : n0 * m0 || 0), H1 = G1.allExtremes;\n if (l0 > _1 && ([l0, _1] = [_1, l0]), k1 === 1 && !z1 && G1.coll === "yAxis" && !H1) {\n for (let ae of G1.series) {\n let ee = ae.getExtremes(ae.getProcessedData(!0).yData, !0);\n H1 ?? (H1 = { dataMin: Number.MAX_VALUE, dataMax: -Number.MAX_VALUE }), H(ee.dataMin) && H(ee.dataMax) && (H1.dataMin = Math.min(ee.dataMin, H1.dataMin), H1.dataMax = Math.max(ee.dataMax, H1.dataMax));\n }\n G1.allExtremes = H1;\n }\n let { dataMin: j1, dataMax: s0, min: M0, max: I0 } = r1(G1.getExtremes(), H1 || {}), re = j1 ?? u0.min, R1 = s0 ?? u0.max, r0 = _1 - l0, d0 = G1.categories ? 0 : Math.min(r0, R1 - re), q0 = re - d0 * (P(u0.min) ? 0 : u0.minPadding), D0 = R1 + d0 * (P(u0.max) ? 0 : u0.maxPadding), G0 = G1.allowZoomOutside || k1 === 1 || L1 !== "zoom" && k1 > 1, V0 = Math.min(u0.min ?? q0, q0, G0 ? M0 : q0), W0 = Math.max(u0.max ?? D0, D0, G0 ? I0 : D0);\n (!G1.isOrdinal || G1.options.overscroll || k1 !== 1 || z1) && (l0 < V0 && (l0 = V0, k1 >= 1 && (_1 = l0 + r0)), _1 > W0 && (_1 = W0, k1 >= 1 && (l0 = _1 - r0)), (z1 || G1.series.length && (l0 !== M0 || _1 !== I0) && l0 >= V0 && _1 <= W0) && (O1 ? O1[G1.coll].push({ axis: G1, min: l0, max: _1 }) : (G1.isPanning = L1 !== "zoom", G1.isPanning && (F1 = !0), G1.setExtremes(z1 ? void 0 : l0, z1 ? void 0 : _1, !1, !1, { move: i0, trigger: L1, scale: k1 }), !z1 && (l0 > V0 || _1 < W0) && L1 !== "mousewheel" && (T1 = !0)), B1 = !0), b1 && (this[Q1 ? "mouseDownX" : "mouseDownY"] = b1[Q1 ? "chartX" : "chartY"]));\n }\n return B1 && (O1 ? _(this, "selection", O1, () => {\n delete A1.selection, A1.trigger = "zoom", this.transform(A1);\n }) : (!T1 || F1 || this.resetZoomButton ? !T1 && this.resetZoomButton && (this.resetZoomButton = this.resetZoomButton.destroy()) : this.showResetZoom(), this.redraw(L1 === "zoom" && (this.options.chart.animation ?? this.pointCount < 100)))), B1;\n }\n }\n return r1(u1.prototype, { callbacks: [], collectionsWithInit: { xAxis: [u1.prototype.addAxis, [!0]], yAxis: [u1.prototype.addAxis, [!1]], series: [u1.prototype.addSeries] }, collectionsWithUpdate: ["xAxis", "yAxis", "series"], propsRequireDirtyBox: ["backgroundColor", "borderColor", "borderWidth", "borderRadius", "plotBackgroundColor", "plotBackgroundImage", "plotBorderColor", "plotBorderWidth", "plotShadow", "shadow"], propsRequireReflow: ["margin", "marginTop", "marginRight", "marginBottom", "marginLeft", "spacing", "spacingTop", "spacingRight", "spacingBottom", "spacingLeft"], propsRequireUpdateSeries: ["chart.inverted", "chart.polar", "chart.ignoreHiddenSeries", "chart.type", "colors", "plotOptions", "time", "tooltip"] }), u1;\n }), n(r, "Extensions/ScrollablePlotArea.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Globals.js"], r["Core/Renderer/RendererRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { stop: l } = o, { composed: c } = i, { addEvent: p, createElement: d, css: u, defined: h, merge: b, pushUnique: M } = s;\n function C() {\n let O = this.scrollablePlotArea;\n (this.scrollablePixelsX || this.scrollablePixelsY) && !O && (this.scrollablePlotArea = O = new f(this)), O == null || O.applyFixed();\n }\n function g() {\n this.chart.scrollablePlotArea && (this.chart.scrollablePlotArea.isDirty = !0);\n }\n class f {\n static compose(m, v, y) {\n M(c, this.compose) && (p(m, "afterInit", g), p(v, "afterSetChartSize", (z) => this.afterSetSize(z.target, z)), p(v, "render", C), p(y, "show", g));\n }\n static afterSetSize(m, v) {\n let y, z, N, { minWidth: W, minHeight: T } = m.options.chart.scrollablePlotArea || {}, { clipBox: x, plotBox: E, inverted: L, renderer: w } = m;\n if (!w.forExport && (W ? (m.scrollablePixelsX = y = Math.max(0, W - m.chartWidth), y && (m.scrollablePlotBox = b(m.plotBox), E.width = m.plotWidth += y, x[L ? "height" : "width"] += y, N = !0)) : T && (m.scrollablePixelsY = z = Math.max(0, T - m.chartHeight), h(z) && (m.scrollablePlotBox = b(m.plotBox), E.height = m.plotHeight += z, x[L ? "width" : "height"] += z, N = !1)), h(N) && !v.skipAxes))\n for (let q of m.axes)\n q.horiz === N && (q.setAxisSize(), q.setAxisTranslation());\n }\n constructor(m) {\n var S;\n let v, y = m.options.chart, z = a.getRendererType(), N = y.scrollablePlotArea || {}, W = this.moveFixedElements.bind(this), T = { WebkitOverflowScrolling: "touch", overflowX: "hidden", overflowY: "hidden" };\n m.scrollablePixelsX && (T.overflowX = "auto"), m.scrollablePixelsY && (T.overflowY = "auto"), this.chart = m;\n let x = this.parentDiv = d("div", { className: "highcharts-scrolling-parent" }, { position: "relative" }, m.renderTo), E = this.scrollingContainer = d("div", { className: "highcharts-scrolling" }, T, x), L = this.innerContainer = d("div", { className: "highcharts-inner-container" }, void 0, E), w = this.fixedDiv = d("div", { className: "highcharts-fixed" }, { position: "absolute", overflow: "hidden", pointerEvents: "none", zIndex: (((S = y.style) == null ? void 0 : S.zIndex) || 0) + 2, top: 0 }, void 0, !0), q = this.fixedRenderer = new z(w, m.chartWidth, m.chartHeight, y.style);\n this.mask = q.path().attr({ fill: y.backgroundColor || "#fff", "fill-opacity": N.opacity ?? 0.85, zIndex: -1 }).addClass("highcharts-scrollable-mask").add(), E.parentNode.insertBefore(w, E), u(m.renderTo, { overflow: "visible" }), p(m, "afterShowResetZoom", W), p(m, "afterApplyDrilldown", W), p(m, "afterLayOutTitles", W), p(E, "scroll", () => {\n let { pointer: B, hoverPoint: I } = m;\n B && (delete B.chartPosition, I && (v = I), B.runPointActions(void 0, v, !0));\n }), L.appendChild(m.container);\n }\n applyFixed() {\n var H;\n let { chart: m, fixedRenderer: v, isDirty: y, scrollingContainer: z } = this, { axisOffset: N, chartWidth: W, chartHeight: T, container: x, plotHeight: E, plotLeft: L, plotTop: w, plotWidth: q, scrollablePixelsX: S = 0, scrollablePixelsY: B = 0 } = m, { scrollPositionX: I = 0, scrollPositionY: P = 0 } = m.options.chart.scrollablePlotArea || {}, k = W + S, K = T + B;\n v.setSize(W, T), (y ?? !0) && (this.isDirty = !1, this.moveFixedElements()), l(m.container), u(x, { width: `${k}px`, height: `${K}px` }), m.renderer.boxWrapper.attr({ width: k, height: K, viewBox: [0, 0, k, K].join(" ") }), (H = m.chartBackground) == null || H.attr({ width: k, height: K }), u(z, { width: `${W}px`, height: `${T}px` }), h(y) || (z.scrollLeft = S * I, z.scrollTop = B * P);\n let $ = w - N[0] - 1, j = L - N[3] - 1, r1 = w + E + N[2] + 1, a1 = L + q + N[1] + 1, _ = L + q - S, Y = w + E - B, D = [["M", 0, 0]];\n S ? D = [["M", 0, $], ["L", L - 1, $], ["L", L - 1, r1], ["L", 0, r1], ["Z"], ["M", _, $], ["L", W, $], ["L", W, r1], ["L", _, r1], ["Z"]] : B && (D = [["M", j, 0], ["L", j, w - 1], ["L", a1, w - 1], ["L", a1, 0], ["Z"], ["M", j, Y], ["L", j, T], ["L", a1, T], ["L", a1, Y], ["Z"]]), m.redrawTrigger !== "adjustHeight" && this.mask.attr({ d: D });\n }\n moveFixedElements() {\n let m, { container: v, inverted: y, scrollablePixelsX: z, scrollablePixelsY: N } = this.chart, W = this.fixedRenderer, T = f.fixedSelectors;\n for (let x of (z && !y ? m = ".highcharts-yaxis" : z && y || N && !y ? m = ".highcharts-xaxis" : N && y && (m = ".highcharts-yaxis"), m && T.push(`${m}:not(.highcharts-radial-axis)`, `${m}-labels:not(.highcharts-radial-axis-labels)`), T))\n [].forEach.call(v.querySelectorAll(x), (E) => {\n (E.namespaceURI === W.SVG_NS ? W.box : W.box.parentNode).appendChild(E), E.style.pointerEvents = "auto";\n });\n }\n }\n return f.fixedSelectors = [".highcharts-breadcrumbs-group", ".highcharts-contextbutton", ".highcharts-caption", ".highcharts-credits", ".highcharts-drillup-button", ".highcharts-legend", ".highcharts-legend-checkbox", ".highcharts-navigator-series", ".highcharts-navigator-xaxis", ".highcharts-navigator-yaxis", ".highcharts-navigator", ".highcharts-range-selector-group", ".highcharts-reset-zoom", ".highcharts-scrollbar", ".highcharts-subtitle", ".highcharts-title"], f;\n }), n(r, "Core/Axis/Stacking/StackItem.js", [r["Core/Templating.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { format: s } = o, { series: l } = i, { destroyObjectProperties: c, fireEvent: p, isNumber: d, pick: u } = a;\n return class {\n constructor(h, b, M, C, g) {\n let f = h.chart.inverted, O = h.reversed;\n this.axis = h;\n let m = this.isNegative = !!M != !!O;\n this.options = b = b || {}, this.x = C, this.total = null, this.cumulative = null, this.points = {}, this.hasValidPoints = !1, this.stack = g, this.leftCliff = 0, this.rightCliff = 0, this.alignOptions = { align: b.align || (f ? m ? "left" : "right" : "center"), verticalAlign: b.verticalAlign || (f ? "middle" : m ? "bottom" : "top"), y: b.y, x: b.x }, this.textAlign = b.textAlign || (f ? m ? "right" : "left" : "center");\n }\n destroy() {\n c(this, this.axis);\n }\n render(h) {\n let b = this.axis.chart, M = this.options, C = M.format, g = C ? s(C, this, b) : M.formatter.call(this);\n if (this.label)\n this.label.attr({ text: g, visibility: "hidden" });\n else {\n this.label = b.renderer.label(g, null, void 0, M.shape, void 0, void 0, M.useHTML, !1, "stack-labels");\n let f = { r: M.borderRadius || 0, text: g, padding: u(M.padding, 5), visibility: "hidden" };\n b.styledMode || (f.fill = M.backgroundColor, f.stroke = M.borderColor, f["stroke-width"] = M.borderWidth, this.label.css(M.style || {})), this.label.attr(f), this.label.added || this.label.add(h);\n }\n this.label.labelrank = b.plotSizeY, p(this, "afterRender");\n }\n setOffset(h, b, M, C, g, f) {\n let { alignOptions: O, axis: m, label: v, options: y, textAlign: z } = this, N = m.chart, W = this.getStackBox({ xOffset: h, width: b, boxBottom: M, boxTop: C, defaultX: g, xAxis: f }), { verticalAlign: T } = O;\n if (v && W) {\n let x = v.getBBox(void 0, 0), E = v.padding, L = u(y.overflow, "justify") === "justify", w;\n O.x = y.x || 0, O.y = y.y || 0;\n let { x: q, y: S } = this.adjustStackPosition({ labelBox: x, verticalAlign: T, textAlign: z });\n W.x -= q, W.y -= S, v.align(O, !1, W), (w = N.isInsidePlot(v.alignAttr.x + O.x + q, v.alignAttr.y + O.y + S)) || (L = !1), L && l.prototype.justifyDataLabel.call(m, v, O, v.alignAttr, x, W), v.attr({ x: v.alignAttr.x, y: v.alignAttr.y, rotation: y.rotation, rotationOriginX: x.width * { left: 0, center: 0.5, right: 1 }[y.textAlign || "center"], rotationOriginY: x.height / 2 }), u(!L && y.crop, !0) && (w = d(v.x) && d(v.y) && N.isInsidePlot(v.x - E + (v.width || 0), v.y) && N.isInsidePlot(v.x + E, v.y)), v[w ? "show" : "hide"]();\n }\n p(this, "afterSetOffset", { xOffset: h, width: b });\n }\n adjustStackPosition({ labelBox: h, verticalAlign: b, textAlign: M }) {\n let C = { bottom: 0, middle: 1, top: 2, right: 1, center: 0, left: -1 }, g = C[b], f = C[M];\n return { x: h.width / 2 + h.width / 2 * f, y: h.height / 2 * g };\n }\n getStackBox(h) {\n let b = this.axis, M = b.chart, { boxTop: C, defaultX: g, xOffset: f, width: O, boxBottom: m } = h, v = b.stacking.usePercentage ? 100 : u(C, this.total, 0), y = b.toPixels(v), z = h.xAxis || M.xAxis[0], N = u(g, z.translate(this.x)) + f, W = Math.abs(y - b.toPixels(m || d(b.min) && b.logarithmic && b.logarithmic.lin2log(b.min) || 0)), T = M.inverted, x = this.isNegative;\n return T ? { x: (x ? y : y - W) - M.plotLeft, y: z.height - N - O + z.top - M.plotTop, width: W, height: O } : { x: N + z.transB - M.plotLeft, y: (x ? y - W : y) - M.plotTop, width: O, height: W };\n }\n };\n }), n(r, "Core/Axis/Stacking/StackingAxis.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Axis/Axis.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Axis/Stacking/StackItem.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n var c;\n let { getDeferredAnimation: p } = o, { series: { prototype: d } } = a, { addEvent: u, correctFloat: h, defined: b, destroyObjectProperties: M, fireEvent: C, isArray: g, isNumber: f, objectEach: O, pick: m } = l;\n function v() {\n let w = this.inverted;\n this.axes.forEach((q) => {\n q.stacking && q.stacking.stacks && q.hasVisibleSeries && (q.stacking.oldStacks = q.stacking.stacks);\n }), this.series.forEach((q) => {\n let S = q.xAxis && q.xAxis.options || {};\n q.options.stacking && q.reserveSpace() && (q.stackKey = [q.type, m(q.options.stack, ""), w ? S.top : S.left, w ? S.height : S.width].join(","));\n });\n }\n function y() {\n var q;\n let w = this.stacking;\n if (w) {\n let S = w.stacks;\n O(S, (B, I) => {\n M(B), delete S[I];\n }), (q = w.stackTotalGroup) == null || q.destroy();\n }\n }\n function z() {\n this.stacking || (this.stacking = new L(this));\n }\n function N(w, q, S, B) {\n return !b(w) || w.x !== q || B && w.stackKey !== B ? w = { x: q, index: 0, key: B, stackKey: B } : w.index++, w.key = [S, q, w.index].join(","), w;\n }\n function W() {\n let w, q = this, S = q.yAxis, B = q.stackKey || "", I = S.stacking.stacks, P = q.processedXData, k = q.options.stacking, K = q[k + "Stacker"];\n K && [B, "-" + B].forEach(($) => {\n var Y;\n let j = P.length, r1, a1, _;\n for (; j--; )\n r1 = P[j], w = q.getStackIndicator(w, r1, q.index, $), a1 = (Y = I[$]) == null ? void 0 : Y[r1], (_ = a1 == null ? void 0 : a1.points[w.key || ""]) && K.call(q, _, a1, j);\n });\n }\n function T(w, q, S) {\n let B = q.total ? 100 / q.total : 0;\n w[0] = h(w[0] * B), w[1] = h(w[1] * B), this.stackedYData[S] = w[1];\n }\n function x(w) {\n (this.is("column") || this.is("columnrange")) && (this.options.centerInCategory && !this.options.stacking && this.chart.series.length > 1 ? d.setStackedPoints.call(this, w, "group") : w.stacking.resetStacks());\n }\n function E(w, q) {\n var o1, u1;\n let S, B, I, P, k, K, $, j, r1, a1 = q || this.options.stacking;\n if (!a1 || !this.reserveSpace() || ({ group: "xAxis" }[a1] || "yAxis") !== w.coll)\n return;\n let _ = this.processedXData, Y = this.processedYData, D = [], H = Y.length, G = this.options, J = G.threshold || 0, F = G.startFromThreshold ? J : 0, V = G.stack, Q = q ? `${this.type},${a1}` : this.stackKey || "", Z = "-" + Q, t1 = this.negStacks, n1 = w.stacking, U = n1.stacks, e1 = n1.oldStacks;\n for (n1.stacksTouched += 1, $ = 0; $ < H; $++) {\n j = _[$], r1 = Y[$], K = (S = this.getStackIndicator(S, j, this.index)).key || "", U[k = (B = t1 && r1 < (F ? 0 : J)) ? Z : Q] || (U[k] = {}), U[k][j] || ((o1 = e1[k]) != null && o1[j] ? (U[k][j] = e1[k][j], U[k][j].total = null) : U[k][j] = new s(w, w.options.stackLabels, !!B, j, V)), I = U[k][j], r1 !== null ? (I.points[K] = I.points[this.index] = [m(I.cumulative, F)], b(I.cumulative) || (I.base = K), I.touched = n1.stacksTouched, S.index > 0 && this.singleStacks === !1 && (I.points[K][0] = I.points[this.index + "," + j + ",0"][0])) : (delete I.points[K], delete I.points[this.index]);\n let M1 = I.total || 0;\n a1 === "percent" ? (P = B ? Q : Z, M1 = t1 && ((u1 = U[P]) != null && u1[j]) ? (P = U[P][j]).total = Math.max(P.total || 0, M1) + Math.abs(r1) || 0 : h(M1 + (Math.abs(r1) || 0))) : a1 === "group" ? (g(r1) && (r1 = r1[0]), r1 !== null && M1++) : M1 = h(M1 + (r1 || 0)), a1 === "group" ? I.cumulative = (M1 || 1) - 1 : I.cumulative = h(m(I.cumulative, F) + (r1 || 0)), I.total = M1, r1 !== null && (I.points[K].push(I.cumulative), D[$] = I.cumulative, I.hasValidPoints = !0);\n }\n a1 === "percent" && (n1.usePercentage = !0), a1 !== "group" && (this.stackedYData = D), n1.oldStacks = {};\n }\n class L {\n constructor(q) {\n this.oldStacks = {}, this.stacks = {}, this.stacksTouched = 0, this.axis = q;\n }\n buildStacks() {\n let q, S, B = this.axis, I = B.series, P = B.coll === "xAxis", k = B.options.reversedStacks, K = I.length;\n for (this.resetStacks(), this.usePercentage = !1, S = K; S--; )\n q = I[k ? S : K - S - 1], P && q.setGroupedPoints(B), q.setStackedPoints(B);\n if (!P)\n for (S = 0; S < K; S++)\n I[S].modifyStacks();\n C(B, "afterBuildStacks");\n }\n cleanStacks() {\n this.oldStacks && (this.stacks = this.oldStacks, O(this.stacks, (q) => {\n O(q, (S) => {\n S.cumulative = S.total;\n });\n }));\n }\n resetStacks() {\n O(this.stacks, (q) => {\n O(q, (S, B) => {\n f(S.touched) && S.touched < this.stacksTouched ? (S.destroy(), delete q[B]) : (S.total = null, S.cumulative = null);\n });\n });\n }\n renderStackTotals() {\n var K;\n let q = this.axis, S = q.chart, B = S.renderer, I = this.stacks, P = p(S, ((K = q.options.stackLabels) == null ? void 0 : K.animation) || !1), k = this.stackTotalGroup = this.stackTotalGroup || B.g("stack-labels").attr({ zIndex: 6, opacity: 0 }).add();\n k.translate(S.plotLeft, S.plotTop), O(I, ($) => {\n O($, (j) => {\n j.render(k);\n });\n }), k.animate({ opacity: 1 }, P);\n }\n }\n return (c || (c = {})).compose = function(w, q, S) {\n let B = q.prototype, I = S.prototype;\n B.getStacks || (u(w, "init", z), u(w, "destroy", y), B.getStacks = v, I.getStackIndicator = N, I.modifyStacks = W, I.percentStacker = T, I.setGroupedPoints = x, I.setStackedPoints = E);\n }, c;\n }), n(r, "Series/Line/LineSeries.js", [r["Core/Series/Series.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { defined: s, merge: l, isObject: c } = a;\n class p extends o {\n drawGraph() {\n let u = this.options, h = (this.gappedPath || this.getGraphPath).call(this), b = this.chart.styledMode;\n [this, ...this.zones].forEach((M, C) => {\n let g, f = M.graph, O = f ? "animate" : "attr", m = M.dashStyle || u.dashStyle;\n f ? (f.endX = this.preventGraphAnimation ? null : h.xMap, f.animate({ d: h })) : h.length && (M.graph = f = this.chart.renderer.path(h).addClass("highcharts-graph" + (C ? ` highcharts-zone-graph-${C - 1} ` : " ") + (C && M.className || "")).attr({ zIndex: 1 }).add(this.group)), f && !b && (g = { stroke: !C && u.lineColor || M.color || this.color || "#cccccc", "stroke-width": u.lineWidth || 0, fill: this.fillGraph && this.color || "none" }, m ? g.dashstyle = m : u.linecap !== "square" && (g["stroke-linecap"] = g["stroke-linejoin"] = "round"), f[O](g).shadow(C < 2 && u.shadow && l({ filterUnits: "userSpaceOnUse" }, c(u.shadow) ? u.shadow : {}))), f && (f.startX = h.xMap, f.isArea = h.isArea);\n });\n }\n getGraphPath(u, h, b) {\n let M = this, C = M.options, g = [], f = [], O, m = C.step, v = (u = u || M.points).reversed;\n return v && u.reverse(), (m = { right: 1, center: 2 }[m] || m && 3) && v && (m = 4 - m), (u = this.getValidPoints(u, !1, !(C.connectNulls && !h && !b))).forEach(function(y, z) {\n let N, W = y.plotX, T = y.plotY, x = u[z - 1], E = y.isNull || typeof T != "number";\n (y.leftCliff || x && x.rightCliff) && !b && (O = !0), E && !s(h) && z > 0 ? O = !C.connectNulls : E && !h ? O = !0 : (z === 0 || O ? N = [["M", y.plotX, y.plotY]] : M.getPointSpline ? N = [M.getPointSpline(u, y, z)] : m ? (N = m === 1 ? [["L", x.plotX, T]] : m === 2 ? [["L", (x.plotX + W) / 2, x.plotY], ["L", (x.plotX + W) / 2, T]] : [["L", W, x.plotY]]).push(["L", W, T]) : N = [["L", W, T]], f.push(y.x), m && (f.push(y.x), m === 2 && f.push(y.x)), g.push.apply(g, N), O = !1);\n }), g.xMap = f, M.graphPath = g, g;\n }\n }\n return p.defaultOptions = l(o.defaultOptions, { legendSymbol: "lineMarker" }), i.registerSeriesType("line", p), p;\n }), n(r, "Series/Area/AreaSeriesDefaults.js", [], function() {\n return { threshold: 0, legendSymbol: "areaMarker" };\n }), n(r, "Series/Area/AreaSeries.js", [r["Series/Area/AreaSeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { seriesTypes: { line: s } } = i, { extend: l, merge: c, objectEach: p, pick: d } = a;\n class u extends s {\n drawGraph() {\n this.areaPath = [], super.drawGraph.apply(this);\n let { areaPath: b, options: M } = this;\n [this, ...this.zones].forEach((C, g) => {\n let f = {}, O = C.fillColor || M.fillColor, m = C.area, v = m ? "animate" : "attr";\n m ? (m.endX = this.preventGraphAnimation ? null : b.xMap, m.animate({ d: b })) : (f.zIndex = 0, (m = C.area = this.chart.renderer.path(b).addClass("highcharts-area" + (g ? ` highcharts-zone-area-${g - 1} ` : " ") + (g && C.className || "")).add(this.group)).isArea = !0), this.chart.styledMode || (f.fill = O || C.color || this.color, f["fill-opacity"] = O ? 1 : M.fillOpacity ?? 0.75, m.css({ pointerEvents: this.stickyTracking ? "none" : "auto" })), m[v](f), m.startX = b.xMap, m.shiftUnit = M.step ? 2 : 1;\n });\n }\n getGraphPath(b) {\n let M, C, g, f = s.prototype.getGraphPath, O = this.options, m = O.stacking, v = this.yAxis, y = [], z = [], N = this.index, W = v.stacking.stacks[this.stackKey], T = O.threshold, x = Math.round(v.getThreshold(O.threshold)), E = d(O.connectNulls, m === "percent"), L = function(P, k, K) {\n let $ = b[P], j = m && W[$.x].points[N], r1 = $[K + "Null"] || 0, a1 = $[K + "Cliff"] || 0, _, Y, D = !0;\n a1 || r1 ? (_ = (r1 ? j[0] : j[1]) + a1, Y = j[0] + a1, D = !!r1) : !m && b[k] && b[k].isNull && (_ = Y = T), _ !== void 0 && (z.push({ plotX: M, plotY: _ === null ? x : v.getThreshold(_), isNull: D, isCliff: !0 }), y.push({ plotX: M, plotY: Y === null ? x : v.getThreshold(Y), doCurve: !1 }));\n };\n b = b || this.points, m && (b = this.getStackPoints(b));\n for (let P = 0, k = b.length; P < k; ++P)\n m || (b[P].leftCliff = b[P].rightCliff = b[P].leftNull = b[P].rightNull = void 0), C = b[P].isNull, M = d(b[P].rectPlotX, b[P].plotX), g = m ? d(b[P].yBottom, x) : x, C && !E || (E || L(P, P - 1, "left"), C && !m && E || (z.push(b[P]), y.push({ x: P, plotX: M, plotY: g })), E || L(P, P + 1, "right"));\n let w = f.call(this, z, !0, !0);\n y.reversed = !0;\n let q = f.call(this, y, !0, !0), S = q[0];\n S && S[0] === "M" && (q[0] = ["L", S[1], S[2]]);\n let B = w.concat(q);\n B.length && B.push(["Z"]);\n let I = f.call(this, z, !1, E);\n return this.chart.series.length > 1 && m && z.some((P) => P.isCliff) && (B.hasStackedCliffs = I.hasStackedCliffs = !0), B.xMap = w.xMap, this.areaPath = B, I;\n }\n getStackPoints(b) {\n let M = this, C = [], g = [], f = this.xAxis, O = this.yAxis, m = O.stacking.stacks[this.stackKey], v = {}, y = O.series, z = y.length, N = O.options.reversedStacks ? 1 : -1, W = y.indexOf(M);\n if (b = b || this.points, this.options.stacking) {\n for (let x = 0; x < b.length; x++)\n b[x].leftNull = b[x].rightNull = void 0, v[b[x].x] = b[x];\n p(m, function(x, E) {\n x.total !== null && g.push(E);\n }), g.sort(function(x, E) {\n return x - E;\n });\n let T = y.map((x) => x.visible);\n g.forEach(function(x, E) {\n let L = 0, w, q;\n if (v[x] && !v[x].isNull)\n C.push(v[x]), [-1, 1].forEach(function(S) {\n let B = S === 1 ? "rightNull" : "leftNull", I = m[g[E + S]], P = 0;\n if (I) {\n let k = W;\n for (; k >= 0 && k < z; ) {\n let K = y[k].index;\n !(w = I.points[K]) && (K === M.index ? v[x][B] = !0 : T[k] && (q = m[x].points[K]) && (P -= q[1] - q[0])), k += N;\n }\n }\n v[x][S === 1 ? "rightCliff" : "leftCliff"] = P;\n });\n else {\n let S = W;\n for (; S >= 0 && S < z; ) {\n let B = y[S].index;\n if (w = m[x].points[B]) {\n L = w[1];\n break;\n }\n S += N;\n }\n L = d(L, 0), L = O.translate(L, 0, 1, 0, 1), C.push({ isNull: !0, plotX: f.translate(x, 0, 0, 0, 1), x, plotY: L, yBottom: L });\n }\n });\n }\n return C;\n }\n }\n return u.defaultOptions = c(s.defaultOptions, o), l(u.prototype, { singleStacks: !1 }), i.registerSeriesType("area", u), u;\n }), n(r, "Series/Spline/SplineSeries.js", [r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i) {\n let { line: a } = o.seriesTypes, { merge: s, pick: l } = i;\n class c extends a {\n getPointSpline(d, u, h) {\n let b, M, C, g, f = u.plotX || 0, O = u.plotY || 0, m = d[h - 1], v = d[h + 1];\n function y(N) {\n return N && !N.isNull && N.doCurve !== !1 && !u.isCliff;\n }\n if (y(m) && y(v)) {\n let N = m.plotX || 0, W = m.plotY || 0, T = v.plotX || 0, x = v.plotY || 0, E = 0;\n b = (1.5 * f + N) / 2.5, M = (1.5 * O + W) / 2.5, C = (1.5 * f + T) / 2.5, g = (1.5 * O + x) / 2.5, C !== b && (E = (g - M) * (C - f) / (C - b) + O - g), M += E, g += E, M > W && M > O ? (M = Math.max(W, O), g = 2 * O - M) : M < W && M < O && (M = Math.min(W, O), g = 2 * O - M), g > x && g > O ? (g = Math.max(x, O), M = 2 * O - g) : g < x && g < O && (g = Math.min(x, O), M = 2 * O - g), u.rightContX = C, u.rightContY = g, u.controlPoints = { low: [b, M], high: [C, g] };\n }\n let z = ["C", l(m.rightContX, m.plotX, 0), l(m.rightContY, m.plotY, 0), l(b, f, 0), l(M, O, 0), f, O];\n return m.rightContX = m.rightContY = void 0, z;\n }\n }\n return c.defaultOptions = s(a.defaultOptions), o.registerSeriesType("spline", c), c;\n }), n(r, "Series/AreaSpline/AreaSplineSeries.js", [r["Series/Spline/SplineSeries.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { area: s, area: { prototype: l } } = i.seriesTypes, { extend: c, merge: p } = a;\n class d extends o {\n }\n return d.defaultOptions = p(o.defaultOptions, s.defaultOptions), c(d.prototype, { getGraphPath: l.getGraphPath, getStackPoints: l.getStackPoints, drawGraph: l.drawGraph }), i.registerSeriesType("areaspline", d), d;\n }), n(r, "Series/Column/ColumnSeriesDefaults.js", [], function() {\n return { borderRadius: 3, centerInCategory: !1, groupPadding: 0.2, marker: null, pointPadding: 0.1, minPointLength: 0, cropThreshold: 50, pointRange: null, states: { hover: { halo: !1, brightness: 0.1 }, select: { color: "#cccccc", borderColor: "#000000" } }, dataLabels: { align: void 0, verticalAlign: void 0, y: void 0 }, startFromThreshold: !0, stickyTracking: !1, tooltip: { distance: 6 }, threshold: 0, borderColor: "#ffffff" };\n }), n(r, "Series/Column/ColumnSeries.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Color/Color.js"], r["Series/Column/ColumnSeriesDefaults.js"], r["Core/Globals.js"], r["Core/Series/Series.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p) {\n let { animObject: d } = o, { parse: u } = i, { noop: h } = s, { clamp: b, crisp: M, defined: C, extend: g, fireEvent: f, isArray: O, isNumber: m, merge: v, pick: y, objectEach: z } = p;\n class N extends l {\n animate(T) {\n let x, E, L = this, w = this.yAxis, q = w.pos, S = w.reversed, B = L.options, { clipOffset: I, inverted: P } = this.chart, k = {}, K = P ? "translateX" : "translateY";\n T && I ? (k.scaleY = 1e-3, E = b(w.toPixels(B.threshold), q, q + w.len), P ? (E += S ? -Math.floor(I[0]) : Math.ceil(I[2]), k.translateX = E - w.len) : (E += S ? Math.ceil(I[0]) : -Math.floor(I[2]), k.translateY = E), L.clipBox && L.setClip(), L.group.attr(k)) : (x = Number(L.group.attr(K)), L.group.animate({ scaleY: 1 }, g(d(L.options.animation), { step: function($, j) {\n L.group && (k[K] = x + j.pos * (q - x), L.group.attr(k));\n } })));\n }\n init(T, x) {\n super.init.apply(this, arguments);\n let E = this;\n (T = E.chart).hasRendered && T.series.forEach(function(L) {\n L.type === E.type && (L.isDirty = !0);\n });\n }\n getColumnMetrics() {\n var r1, a1;\n let T = this, x = T.options, E = T.xAxis, L = T.yAxis, w = E.options.reversedStacks, q = E.reversed && !w || !E.reversed && w, S = {}, B, I = 0;\n x.grouping === !1 ? I = 1 : T.chart.series.forEach(function(_) {\n let Y, D = _.yAxis, H = _.options;\n _.type === T.type && _.reserveSpace() && L.len === D.len && L.pos === D.pos && (H.stacking && H.stacking !== "group" ? (S[B = _.stackKey] === void 0 && (S[B] = I++), Y = S[B]) : H.grouping !== !1 && (Y = I++), _.columnIndex = Y);\n });\n let P = Math.min(Math.abs(E.transA) * (!((r1 = E.brokenAxis) != null && r1.hasBreaks) && ((a1 = E.ordinal) == null ? void 0 : a1.slope) || x.pointRange || E.closestPointRange || E.tickInterval || 1), E.len), k = P * x.groupPadding, K = (P - 2 * k) / (I || 1), $ = Math.min(x.maxPointWidth || E.len, y(x.pointWidth, K * (1 - 2 * x.pointPadding))), j = (T.columnIndex || 0) + (q ? 1 : 0);\n return T.columnMetrics = { width: $, offset: (K - $) / 2 + (k + j * K - P / 2) * (q ? -1 : 1), paddedWidth: K, columnCount: I }, T.columnMetrics;\n }\n crispCol(T, x, E, L) {\n let w = this.borderWidth, q = this.chart.inverted;\n return L = M(x + L, w, q) - (x = M(x, w, q)), this.options.crisp && (E = M(T + E, w) - (T = M(T, w))), { x: T, y: x, width: E, height: L };\n }\n adjustForMissingColumns(T, x, E, L) {\n var w;\n if (!E.isNull && L.columnCount > 1) {\n let q = this.xAxis.series.filter((P) => P.visible).map((P) => P.index), S = 0, B = 0;\n z((w = this.xAxis.stacking) == null ? void 0 : w.stacks, (P) => {\n if (typeof E.x == "number") {\n let k = P[E.x.toString()];\n if (k && O(k.points[this.index])) {\n let K = Object.keys(k.points).filter(($) => !$.match(",") && k.points[$] && k.points[$].length > 1).map(parseFloat).filter(($) => q.indexOf($) !== -1).sort(($, j) => j - $);\n S = K.indexOf(this.index), B = K.length;\n }\n }\n }), S = this.xAxis.reversed ? B - 1 - S : S;\n let I = (B - 1) * L.paddedWidth + x;\n T = (E.plotX || 0) + I / 2 - x - S * L.paddedWidth;\n }\n return T;\n }\n translate() {\n let T = this, x = T.chart, E = T.options, L = T.dense = T.closestPointRange * T.xAxis.transA < 2, w = T.borderWidth = y(E.borderWidth, L ? 0 : 1), q = T.xAxis, S = T.yAxis, B = E.threshold, I = y(E.minPointLength, 5), P = T.getColumnMetrics(), k = P.width, K = T.pointXOffset = P.offset, $ = T.dataMin, j = T.dataMax, r1 = T.translatedThreshold = S.getThreshold(B), a1 = T.barW = Math.max(k, 1 + 2 * w);\n E.pointPadding && (a1 = Math.ceil(a1)), l.prototype.translate.apply(T), T.points.forEach(function(_) {\n let Y = y(_.yBottom, r1), D = 999 + Math.abs(Y), H = _.plotX || 0, G = b(_.plotY, -D, S.len + D), J, F = Math.min(G, Y), V = Math.max(G, Y) - F, Q = k, Z = H + K, t1 = a1;\n I && Math.abs(V) < I && (V = I, J = !S.reversed && !_.negative || S.reversed && _.negative, m(B) && m(j) && _.y === B && j <= B && (S.min || 0) < B && ($ !== j || (S.max || 0) <= B) && (J = !J, _.negative = !_.negative), F = Math.abs(F - r1) > I ? Y - I : r1 - (J ? I : 0)), C(_.options.pointWidth) && (Z -= Math.round(((Q = t1 = Math.ceil(_.options.pointWidth)) - k) / 2)), E.centerInCategory && !E.stacking && (Z = T.adjustForMissingColumns(Z, Q, _, P)), _.barX = Z, _.pointWidth = Q, _.tooltipPos = x.inverted ? [b(S.len + S.pos - x.plotLeft - G, S.pos - x.plotLeft, S.len + S.pos - x.plotLeft), q.len + q.pos - x.plotTop - Z - t1 / 2, V] : [q.left - x.plotLeft + Z + t1 / 2, b(G + S.pos - x.plotTop, S.pos - x.plotTop, S.len + S.pos - x.plotTop), V], _.shapeType = T.pointClass.prototype.shapeType || "roundedRect", _.shapeArgs = T.crispCol(Z, _.isNull ? r1 : F, t1, _.isNull ? 0 : V);\n }), f(this, "afterColumnTranslate");\n }\n drawGraph() {\n this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data");\n }\n pointAttribs(T, x) {\n let E = this.options, L = this.pointAttrToOptions || {}, w = L.stroke || "borderColor", q = L["stroke-width"] || "borderWidth", S, B, I, P = T && T.color || this.color, k = T && T[w] || E[w] || P, K = T && T.options.dashStyle || E.dashStyle, $ = T && T[q] || E[q] || this[q] || 0, j = y(T && T.opacity, E.opacity, 1);\n T && this.zones.length && (B = T.getZone(), P = T.options.color || B && (B.color || T.nonZonedColor) || this.color, B && (k = B.borderColor || k, K = B.dashStyle || K, $ = B.borderWidth || $)), x && T && (I = (S = v(E.states[x], T.options.states && T.options.states[x] || {})).brightness, P = S.color || I !== void 0 && u(P).brighten(S.brightness).get() || P, k = S[w] || k, $ = S[q] || $, K = S.dashStyle || K, j = y(S.opacity, j));\n let r1 = { fill: P, stroke: k, "stroke-width": $, opacity: j };\n return K && (r1.dashstyle = K), r1;\n }\n drawPoints(T = this.points) {\n let x, E = this, L = this.chart, w = E.options, q = L.renderer, S = w.animationLimit || 250;\n T.forEach(function(B) {\n let I = B.plotY, P = B.graphic, k = !!P, K = P && L.pointCount < S ? "animate" : "attr";\n m(I) && B.y !== null ? (x = B.shapeArgs, P && B.hasNewShapeType() && (P = P.destroy()), E.enabledDataSorting && (B.startXPos = E.xAxis.reversed ? -(x && x.width || 0) : E.xAxis.width), !P && (B.graphic = P = q[B.shapeType](x).add(B.group || E.group), P && E.enabledDataSorting && L.hasRendered && L.pointCount < S && (P.attr({ x: B.startXPos }), k = !0, K = "animate")), P && k && P[K](v(x)), L.styledMode || P[K](E.pointAttribs(B, B.selected && "select")).shadow(B.allowShadow !== !1 && w.shadow), P && (P.addClass(B.getClassName(), !0), P.attr({ visibility: B.visible ? "inherit" : "hidden" }))) : P && (B.graphic = P.destroy());\n });\n }\n drawTracker(T = this.points) {\n let x, E = this, L = E.chart, w = L.pointer, q = function(S) {\n let B = w == null ? void 0 : w.getPointFromEvent(S);\n w && B && E.options.enableMouseTracking && (w.isDirectTouch = !0, B.onMouseOver(S));\n };\n T.forEach(function(S) {\n x = O(S.dataLabels) ? S.dataLabels : S.dataLabel ? [S.dataLabel] : [], S.graphic && (S.graphic.element.point = S), x.forEach(function(B) {\n (B.div || B.element).point = S;\n });\n }), E._hasTracking || (E.trackerGroups.forEach(function(S) {\n E[S] && (E[S].addClass("highcharts-tracker").on("mouseover", q).on("mouseout", function(B) {\n w == null || w.onTrackerMouseOut(B);\n }).on("touchstart", q), !L.styledMode && E.options.cursor && E[S].css({ cursor: E.options.cursor }));\n }), E._hasTracking = !0), f(this, "afterDrawTracker");\n }\n remove() {\n let T = this, x = T.chart;\n x.hasRendered && x.series.forEach(function(E) {\n E.type === T.type && (E.isDirty = !0);\n }), l.prototype.remove.apply(T, arguments);\n }\n }\n return N.defaultOptions = v(l.defaultOptions, a), g(N.prototype, { directTouch: !0, getSymbol: h, negStacks: !0, trackerGroups: ["group", "dataLabelsGroup"] }), c.registerSeriesType("column", N), N;\n }), n(r, "Core/Series/DataLabel.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Templating.js"], r["Core/Utilities.js"]], function(o, i, a) {\n var s;\n let { getDeferredAnimation: l } = o, { format: c } = i, { defined: p, extend: d, fireEvent: u, isArray: h, isString: b, merge: M, objectEach: C, pick: g, pInt: f, splat: O } = a;\n return function(m) {\n function v() {\n return E(this).some((w) => w == null ? void 0 : w.enabled);\n }\n function y(w, q, S, B, I) {\n var G;\n let { chart: P, enabledDataSorting: k } = this, K = this.isCartesian && P.inverted, $ = w.plotX, j = w.plotY, r1 = S.rotation || 0, a1 = p($) && p(j) && P.isInsidePlot($, Math.round(j), { inverted: K, paneCoordinates: !0, series: this }), _ = r1 === 0 && g(S.overflow, k ? "none" : "justify") === "justify", Y = this.visible && w.visible !== !1 && p($) && (w.series.forceDL || k && !_ || a1 || g(S.inside, !!this.options.stacking) && B && P.isInsidePlot($, K ? B.x + 1 : B.y + B.height - 1, { inverted: K, paneCoordinates: !0, series: this })), D = w.pos();\n if (Y && D) {\n var H;\n let J = q.getBBox(), F = q.getBBox(void 0, 0), V = { right: 1, center: 0.5 }[S.align || 0] || 0, Q = { bottom: 1, middle: 0.5 }[S.verticalAlign || 0] || 0;\n if (B = d({ x: D[0], y: Math.round(D[1]), width: 0, height: 0 }, B || {}), S.alignTo === "plotEdges" && this.isCartesian && (B[K ? "x" : "y"] = 0, B[K ? "width" : "height"] = ((G = this.yAxis) == null ? void 0 : G.len) || 0), d(S, { width: J.width, height: J.height }), H = B, k && this.xAxis && !_ && this.setDataLabelStartPos(w, q, I, a1, H), q.align(M(S, { width: F.width, height: F.height }), !1, B, !1), q.alignAttr.x += V * (F.width - J.width), q.alignAttr.y += Q * (F.height - J.height), q[q.placed ? "animate" : "attr"]({ x: q.alignAttr.x + (J.width - F.width) / 2, y: q.alignAttr.y + (J.height - F.height) / 2, rotationOriginX: (q.width || 0) / 2, rotationOriginY: (q.height || 0) / 2 }), _ && B.height >= 0)\n this.justifyDataLabel(q, S, q.alignAttr, J, B, I);\n else if (g(S.crop, !0)) {\n let { x: Z, y: t1 } = q.alignAttr;\n Y = P.isInsidePlot(Z, t1, { paneCoordinates: !0, series: this }) && P.isInsidePlot(Z + J.width - 1, t1 + J.height - 1, { paneCoordinates: !0, series: this });\n }\n S.shape && !r1 && q[I ? "attr" : "animate"]({ anchorX: D[0], anchorY: D[1] });\n }\n I && k && (q.placed = !1), Y || k && !_ ? (q.show(), q.placed = !0) : (q.hide(), q.placed = !1);\n }\n function z() {\n return this.plotGroup("dataLabelsGroup", "data-labels", this.hasRendered ? "inherit" : "hidden", this.options.dataLabels.zIndex || 6);\n }\n function N(w) {\n let q = this.hasRendered || 0, S = this.initDataLabelsGroup().attr({ opacity: +q });\n return !q && S && (this.visible && S.show(), this.options.animation ? S.animate({ opacity: 1 }, w) : S.attr({ opacity: 1 })), S;\n }\n function W(w) {\n var Y;\n let q;\n w = w || this.points;\n let S = this, B = S.chart, I = S.options, P = B.renderer, { backgroundColor: k, plotBackgroundColor: K } = B.options.chart, $ = P.getContrast(b(K) && K || b(k) && k || "#000000"), j = E(S), { animation: r1, defer: a1 } = j[0], _ = a1 ? l(B, r1, S) : { defer: 0, duration: 0 };\n u(this, "drawDataLabels"), (Y = S.hasDataLabels) != null && Y.call(S) && (q = this.initDataLabels(_), w.forEach((D) => {\n var J, F;\n let H = D.dataLabels || [];\n O(x(j, D.dlOptions || ((J = D.options) == null ? void 0 : J.dataLabels))).forEach((V, Q) => {\n let Z = V.enabled && (D.visible || D.dataLabelOnHidden) && (!D.isNull || D.dataLabelOnNull) && function(O1, m1) {\n let L1 = m1.filter;\n if (L1) {\n let y1 = L1.operator, B1 = O1[L1.property], T1 = L1.value;\n return y1 === ">" && B1 > T1 || y1 === "<" && B1 < T1 || y1 === ">=" && B1 >= T1 || y1 === "<=" && B1 <= T1 || y1 === "==" && B1 == T1 || y1 === "===" && B1 === T1 || y1 === "!=" && B1 != T1 || y1 === "!==" && B1 !== T1;\n }\n return !0;\n }(D, V), { backgroundColor: t1, borderColor: n1, distance: U, style: e1 = {} } = V, o1, u1, M1, A1, l1 = {}, b1 = H[Q], h1 = !b1, z1;\n Z && (u1 = g(V[D.formatPrefix + "Format"], V.format), o1 = D.getLabelConfig(), M1 = p(u1) ? c(u1, o1, B) : (V[D.formatPrefix + "Formatter"] || V.formatter).call(o1, V), A1 = V.rotation, !B.styledMode && (e1.color = g(V.color, e1.color, b(S.color) ? S.color : void 0, "#000000"), e1.color === "contrast" ? (t1 !== "none" && (z1 = t1), D.contrastColor = P.getContrast(z1 !== "auto" && z1 || D.color || S.color), e1.color = z1 || !p(U) && V.inside || 0 > f(U || 0) || I.stacking ? D.contrastColor : $) : delete D.contrastColor, I.cursor && (e1.cursor = I.cursor)), l1 = { r: V.borderRadius || 0, rotation: A1, padding: V.padding, zIndex: 1 }, B.styledMode || (l1.fill = t1 === "auto" ? D.color : t1, l1.stroke = n1 === "auto" ? D.color : n1, l1["stroke-width"] = V.borderWidth), C(l1, (O1, m1) => {\n O1 === void 0 && delete l1[m1];\n })), !b1 || Z && p(M1) && !!b1.div == !!V.useHTML && (b1.rotation && V.rotation || b1.rotation === V.rotation) || (b1 = void 0, h1 = !0), Z && p(M1) && (b1 ? l1.text = M1 : (b1 = P.label(M1, 0, 0, V.shape, void 0, void 0, V.useHTML, void 0, "data-label")).addClass(" highcharts-data-label-color-" + D.colorIndex + " " + (V.className || "") + (V.useHTML ? " highcharts-tracker" : "")), b1 && (b1.options = V, b1.attr(l1), B.styledMode ? e1.width && b1.css({ width: e1.width, textOverflow: e1.textOverflow }) : b1.css(e1).shadow(V.shadow), u(b1, "beforeAddingDataLabel", { labelOptions: V, point: D }), b1.added || b1.add(q), S.alignDataLabel(D, b1, V, void 0, h1), b1.isActive = !0, H[Q] && H[Q] !== b1 && H[Q].destroy(), H[Q] = b1));\n });\n let G = H.length;\n for (; G--; )\n H[G] && H[G].isActive ? H[G].isActive = !1 : ((F = H[G]) == null || F.destroy(), H.splice(G, 1));\n D.dataLabel = H[0], D.dataLabels = H;\n })), u(this, "afterDrawDataLabels");\n }\n function T(w, q, S, B, I, P) {\n let k = this.chart, K = q.align, $ = q.verticalAlign, j = w.box ? 0 : w.padding || 0, r1 = k.inverted ? this.yAxis : this.xAxis, a1 = r1 ? r1.left - k.plotLeft : 0, _ = k.inverted ? this.xAxis : this.yAxis, Y = _ ? _.top - k.plotTop : 0, { x: D = 0, y: H = 0 } = q, G, J;\n return (G = (S.x || 0) + j + a1) < 0 && (K === "right" && D >= 0 ? (q.align = "left", q.inside = !0) : D -= G, J = !0), (G = (S.x || 0) + B.width - j + a1) > k.plotWidth && (K === "left" && D <= 0 ? (q.align = "right", q.inside = !0) : D += k.plotWidth - G, J = !0), (G = S.y + j + Y) < 0 && ($ === "bottom" && H >= 0 ? (q.verticalAlign = "top", q.inside = !0) : H -= G, J = !0), (G = (S.y || 0) + B.height - j + Y) > k.plotHeight && ($ === "top" && H <= 0 ? (q.verticalAlign = "bottom", q.inside = !0) : H += k.plotHeight - G, J = !0), J && (q.x = D, q.y = H, w.placed = !P, w.align(q, void 0, I)), J;\n }\n function x(w, q) {\n let S = [], B;\n if (h(w) && !h(q))\n S = w.map(function(I) {\n return M(I, q);\n });\n else if (h(q) && !h(w))\n S = q.map(function(I) {\n return M(w, I);\n });\n else if (h(w) || h(q)) {\n if (h(w) && h(q))\n for (B = Math.max(w.length, q.length); B--; )\n S[B] = M(w[B], q[B]);\n } else\n S = M(w, q);\n return S;\n }\n function E(w) {\n var S, B;\n let q = w.chart.options.plotOptions;\n return O(x(x((S = q == null ? void 0 : q.series) == null ? void 0 : S.dataLabels, (B = q == null ? void 0 : q[w.type]) == null ? void 0 : B.dataLabels), w.options.dataLabels));\n }\n function L(w, q, S, B, I) {\n let P = this.chart, k = P.inverted, K = this.xAxis, $ = K.reversed, j = ((k ? q.height : q.width) || 0) / 2, r1 = w.pointWidth, a1 = r1 ? r1 / 2 : 0;\n q.startXPos = k ? I.x : $ ? -j - a1 : K.width - j + a1, q.startYPos = k ? $ ? this.yAxis.height - j + a1 : -j - a1 : I.y, B ? q.visibility === "hidden" && (q.show(), q.attr({ opacity: 0 }).animate({ opacity: 1 })) : q.attr({ opacity: 1 }).animate({ opacity: 0 }, void 0, q.hide), P.hasRendered && (S && q.attr({ x: q.startXPos, y: q.startYPos }), q.placed = !0);\n }\n m.compose = function(w) {\n let q = w.prototype;\n q.initDataLabels || (q.initDataLabels = N, q.initDataLabelsGroup = z, q.alignDataLabel = y, q.drawDataLabels = W, q.justifyDataLabel = T, q.setDataLabelStartPos = L, q.hasDataLabels = v);\n };\n }(s || (s = {})), s;\n }), n(r, "Series/Column/ColumnDataLabel.js", [r["Core/Series/DataLabel.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n var l;\n let { composed: c } = i, { series: p } = a, { merge: d, pick: u, pushUnique: h } = s;\n return function(b) {\n function M(C, g, f, O, m) {\n let v = this.chart.inverted, y = C.series, z = (y.xAxis ? y.xAxis.len : this.chart.plotSizeX) || 0, N = (y.yAxis ? y.yAxis.len : this.chart.plotSizeY) || 0, W = C.dlBox || C.shapeArgs, T = u(C.below, C.plotY > u(this.translatedThreshold, N)), x = u(f.inside, !!this.options.stacking);\n if (W) {\n if (O = d(W), !(f.overflow === "allow" && f.crop === !1)) {\n O.y < 0 && (O.height += O.y, O.y = 0);\n let E = O.y + O.height - N;\n E > 0 && E < O.height - 1 && (O.height -= E);\n }\n v && (O = { x: N - O.y - O.height, y: z - O.x - O.width, width: O.height, height: O.width }), x || (v ? (O.x += T ? 0 : O.width, O.width = 0) : (O.y += T ? O.height : 0, O.height = 0));\n }\n f.align = u(f.align, !v || x ? "center" : T ? "right" : "left"), f.verticalAlign = u(f.verticalAlign, v || x ? "middle" : T ? "top" : "bottom"), p.prototype.alignDataLabel.call(this, C, g, f, O, m), f.inside && C.contrastColor && g.css({ color: C.contrastColor });\n }\n b.compose = function(C) {\n o.compose(p), h(c, "ColumnDataLabel") && (C.prototype.alignDataLabel = M);\n };\n }(l || (l = {})), l;\n }), n(r, "Series/Bar/BarSeries.js", [r["Series/Column/ColumnSeries.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { extend: s, merge: l } = a;\n class c extends o {\n }\n return c.defaultOptions = l(o.defaultOptions, {}), s(c.prototype, { inverted: !0 }), i.registerSeriesType("bar", c), c;\n }), n(r, "Series/Scatter/ScatterSeriesDefaults.js", [], function() {\n return { lineWidth: 0, findNearestPointBy: "xy", jitter: { x: 0, y: 0 }, marker: { enabled: !0 }, tooltip: { headerFormat: \' {series.name}
\', pointFormat: "x: {point.x}
y: {point.y}
" } };\n }), n(r, "Series/Scatter/ScatterSeries.js", [r["Series/Scatter/ScatterSeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { column: s, line: l } = i.seriesTypes, { addEvent: c, extend: p, merge: d } = a;\n class u extends l {\n applyJitter() {\n let b = this, M = this.options.jitter, C = this.points.length;\n M && this.points.forEach(function(g, f) {\n ["x", "y"].forEach(function(O, m) {\n if (M[O] && !g.isNull) {\n let v = `plot${O.toUpperCase()}`, y = b[`${O}Axis`], z = M[O] * y.transA;\n if (y && !y.logarithmic) {\n let N = Math.max(0, (g[v] || 0) - z), W = Math.min(y.len, (g[v] || 0) + z);\n g[v] = N + (W - N) * function(T) {\n let x = 1e4 * Math.sin(T);\n return x - Math.floor(x);\n }(f + m * C), O === "x" && (g.clientX = g.plotX);\n }\n }\n });\n });\n }\n drawGraph() {\n this.options.lineWidth ? super.drawGraph() : this.graph && (this.graph = this.graph.destroy());\n }\n }\n return u.defaultOptions = d(l.defaultOptions, o), p(u.prototype, { drawTracker: s.prototype.drawTracker, sorted: !1, requireSorting: !1, noSharedTooltip: !0, trackerGroups: ["group", "markerGroup", "dataLabelsGroup"] }), c(u, "afterTranslate", function() {\n this.applyJitter();\n }), i.registerSeriesType("scatter", u), u;\n }), n(r, "Series/CenteredUtilities.js", [r["Core/Globals.js"], r["Core/Series/Series.js"], r["Core/Utilities.js"]], function(o, i, a) {\n var s, l;\n let { deg2rad: c } = o, { fireEvent: p, isNumber: d, pick: u, relativeLength: h } = a;\n return (l = s || (s = {})).getCenter = function() {\n let b = this.options, M = this.chart, C = 2 * (b.slicedOffset || 0), g = M.plotWidth - 2 * C, f = M.plotHeight - 2 * C, O = b.center, m = Math.min(g, f), v = b.thickness, y, z = b.size, N = b.innerSize || 0, W, T;\n typeof z == "string" && (z = parseFloat(z)), typeof N == "string" && (N = parseFloat(N));\n let x = [u(O[0], "50%"), u(O[1], "50%"), u(z && z < 0 ? void 0 : b.size, "100%"), u(N && N < 0 ? void 0 : b.innerSize || 0, "0%")];\n for (!M.angular || this instanceof i || (x[3] = 0), W = 0; W < 4; ++W)\n T = x[W], y = W < 2 || W === 2 && /%$/.test(T), x[W] = h(T, [g, f, m, x[2]][W]) + (y ? C : 0);\n return x[3] > x[2] && (x[3] = x[2]), d(v) && 2 * v < x[2] && v > 0 && (x[3] = x[2] - 2 * v), p(this, "afterGetCenter", { positions: x }), x;\n }, l.getStartAndEndRadians = function(b, M) {\n let C = d(b) ? b : 0, g = d(M) && M > C && M - C < 360 ? M : C + 360;\n return { start: c * (C + -90), end: c * (g + -90) };\n }, s;\n }), n(r, "Series/Pie/PiePoint.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Series/Point.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { setAnimation: s } = o, { addEvent: l, defined: c, extend: p, isNumber: d, pick: u, relativeLength: h } = a;\n class b extends i {\n getConnectorPath(C) {\n let g = C.dataLabelPosition, f = C.options || {}, O = f.connectorShape, m = this.connectorShapes[O] || O;\n return g && m.call(this, { ...g.computed, alignment: g.alignment }, g.connectorPosition, f) || [];\n }\n getTranslate() {\n return this.sliced && this.slicedTranslation || { translateX: 0, translateY: 0 };\n }\n haloPath(C) {\n let g = this.shapeArgs;\n return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(g.x, g.y, g.r + C, g.r + C, { innerR: g.r - 1, start: g.start, end: g.end, borderRadius: g.borderRadius });\n }\n constructor(C, g, f) {\n super(C, g, f), this.half = 0, this.name ?? (this.name = "Slice");\n let O = (m) => {\n this.slice(m.type === "select");\n };\n l(this, "select", O), l(this, "unselect", O);\n }\n isValid() {\n return d(this.y) && this.y >= 0;\n }\n setVisible(C, g = !0) {\n C !== this.visible && this.update({ visible: C ?? !this.visible }, g, void 0, !1);\n }\n slice(C, g, f) {\n let O = this.series;\n s(f, O.chart), g = u(g, !0), this.sliced = this.options.sliced = C = c(C) ? C : !this.sliced, O.options.data[O.data.indexOf(this)] = this.options, this.graphic && this.graphic.animate(this.getTranslate());\n }\n }\n return p(b.prototype, { connectorShapes: { fixedOffset: function(M, C, g) {\n let f = C.breakAt, O = C.touchingSliceAt, m = g.softConnector ? ["C", M.x + (M.alignment === "left" ? -5 : 5), M.y, 2 * f.x - O.x, 2 * f.y - O.y, f.x, f.y] : ["L", f.x, f.y];\n return [["M", M.x, M.y], m, ["L", O.x, O.y]];\n }, straight: function(M, C) {\n let g = C.touchingSliceAt;\n return [["M", M.x, M.y], ["L", g.x, g.y]];\n }, crookedLine: function(M, C, g) {\n let { breakAt: f, touchingSliceAt: O } = C, { series: m } = this, [v, y, z] = m.center, N = z / 2, { plotLeft: W, plotWidth: T } = m.chart, x = M.alignment === "left", { x: E, y: L } = M, w = f.x;\n if (g.crookDistance) {\n let S = h(g.crookDistance, 1);\n w = x ? v + N + (T + W - v - N) * (1 - S) : W + (v - N) * S;\n } else\n w = v + (y - L) * Math.tan((this.angle || 0) - Math.PI / 2);\n let q = [["M", E, L]];\n return (x ? w <= E && w >= f.x : w >= E && w <= f.x) && q.push(["L", w, L]), q.push(["L", f.x, f.y], ["L", O.x, O.y]), q;\n } } }), b;\n }), n(r, "Series/Pie/PieSeriesDefaults.js", [], function() {\n return { borderRadius: 3, center: [null, null], clip: !1, colorByPoint: !0, dataLabels: { connectorPadding: 5, connectorShape: "crookedLine", crookDistance: void 0, distance: 30, enabled: !0, formatter: function() {\n return this.point.isNull ? void 0 : this.point.name;\n }, softConnector: !0, x: 0 }, fillColor: void 0, ignoreHiddenPoint: !0, inactiveOtherPoints: !0, legendType: "point", marker: null, size: null, showInLegend: !1, slicedOffset: 10, stickyTracking: !1, tooltip: { followPointer: !0 }, borderColor: "#ffffff", borderWidth: 1, lineWidth: void 0, states: { hover: { brightness: 0.1 } } };\n }), n(r, "Series/Pie/PieSeries.js", [r["Series/CenteredUtilities.js"], r["Series/Column/ColumnSeries.js"], r["Core/Globals.js"], r["Series/Pie/PiePoint.js"], r["Series/Pie/PieSeriesDefaults.js"], r["Core/Series/Series.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Renderer/SVG/Symbols.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c, p, d, u) {\n let { getStartAndEndRadians: h } = o, { noop: b } = a, { clamp: M, extend: C, fireEvent: g, merge: f, pick: O } = u;\n class m extends c {\n animate(y) {\n let z = this, N = z.points, W = z.startAngleRad;\n y || N.forEach(function(T) {\n let x = T.graphic, E = T.shapeArgs;\n x && E && (x.attr({ r: O(T.startR, z.center && z.center[3] / 2), start: W, end: W }), x.animate({ r: E.r, start: E.start, end: E.end }, z.options.animation));\n });\n }\n drawEmpty() {\n let y, z, N = this.startAngleRad, W = this.endAngleRad, T = this.options;\n this.total === 0 && this.center ? (y = this.center[0], z = this.center[1], this.graph || (this.graph = this.chart.renderer.arc(y, z, this.center[1] / 2, 0, N, W).addClass("highcharts-empty-series").add(this.group)), this.graph.attr({ d: d.arc(y, z, this.center[2] / 2, 0, { start: N, end: W, innerR: this.center[3] / 2 }) }), this.chart.styledMode || this.graph.attr({ "stroke-width": T.borderWidth, fill: T.fillColor || "none", stroke: T.color || "#cccccc" })) : this.graph && (this.graph = this.graph.destroy());\n }\n drawPoints() {\n let y = this.chart.renderer;\n this.points.forEach(function(z) {\n z.graphic && z.hasNewShapeType() && (z.graphic = z.graphic.destroy()), z.graphic || (z.graphic = y[z.shapeType](z.shapeArgs).add(z.series.group), z.delayedRendering = !0);\n });\n }\n generatePoints() {\n super.generatePoints(), this.updateTotals();\n }\n getX(y, z, N, W) {\n let T = this.center, x = this.radii ? this.radii[N.index] || 0 : T[2] / 2, E = W.dataLabelPosition, L = (E == null ? void 0 : E.distance) || 0, w = Math.asin(M((y - T[1]) / (x + L), -1, 1));\n return T[0] + Math.cos(w) * (x + L) * (z ? -1 : 1) + (L > 0 ? (z ? -1 : 1) * (W.padding || 0) : 0);\n }\n hasData() {\n return !!this.processedXData.length;\n }\n redrawPoints() {\n let y, z, N, W, T = this, x = T.chart;\n this.drawEmpty(), T.group && !x.styledMode && T.group.shadow(T.options.shadow), T.points.forEach(function(E) {\n let L = {};\n z = E.graphic, !E.isNull && z ? (W = E.shapeArgs, y = E.getTranslate(), x.styledMode || (N = T.pointAttribs(E, E.selected && "select")), E.delayedRendering ? (z.setRadialReference(T.center).attr(W).attr(y), x.styledMode || z.attr(N).attr({ "stroke-linejoin": "round" }), E.delayedRendering = !1) : (z.setRadialReference(T.center), x.styledMode || f(!0, L, N), f(!0, L, W, y), z.animate(L)), z.attr({ visibility: E.visible ? "inherit" : "hidden" }), z.addClass(E.getClassName(), !0)) : z && (E.graphic = z.destroy());\n });\n }\n sortByAngle(y, z) {\n y.sort(function(N, W) {\n return N.angle !== void 0 && (W.angle - N.angle) * z;\n });\n }\n translate(y) {\n g(this, "translate"), this.generatePoints();\n let z = this.options, N = z.slicedOffset, W = h(z.startAngle, z.endAngle), T = this.startAngleRad = W.start, x = (this.endAngleRad = W.end) - T, E = this.points, L = z.ignoreHiddenPoint, w = E.length, q, S, B, I, P, k, K, $ = 0;\n for (y || (this.center = y = this.getCenter()), k = 0; k < w; k++) {\n K = E[k], q = T + $ * x, K.isValid() && (!L || K.visible) && ($ += K.percentage / 100), S = T + $ * x;\n let j = { x: y[0], y: y[1], r: y[2] / 2, innerR: y[3] / 2, start: Math.round(1e3 * q) / 1e3, end: Math.round(1e3 * S) / 1e3 };\n K.shapeType = "arc", K.shapeArgs = j, (B = (S + q) / 2) > 1.5 * Math.PI ? B -= 2 * Math.PI : B < -Math.PI / 2 && (B += 2 * Math.PI), K.slicedTranslation = { translateX: Math.round(Math.cos(B) * N), translateY: Math.round(Math.sin(B) * N) }, I = Math.cos(B) * y[2] / 2, P = Math.sin(B) * y[2] / 2, K.tooltipPos = [y[0] + 0.7 * I, y[1] + 0.7 * P], K.half = B < -Math.PI / 2 || B > Math.PI / 2 ? 1 : 0, K.angle = B;\n }\n g(this, "afterTranslate");\n }\n updateTotals() {\n let y = this.points, z = y.length, N = this.options.ignoreHiddenPoint, W, T, x = 0;\n for (W = 0; W < z; W++)\n (T = y[W]).isValid() && (!N || T.visible) && (x += T.y);\n for (W = 0, this.total = x; W < z; W++)\n (T = y[W]).percentage = x > 0 && (T.visible || !N) ? T.y / x * 100 : 0, T.total = x;\n }\n }\n return m.defaultOptions = f(c.defaultOptions, l), C(m.prototype, { axisTypes: [], directTouch: !0, drawGraph: void 0, drawTracker: i.prototype.drawTracker, getCenter: o.getCenter, getSymbol: b, invertible: !1, isCartesian: !1, noSharedTooltip: !0, pointAttribs: i.prototype.pointAttribs, pointClass: s, requireSorting: !1, searchPoint: b, trackerGroups: ["group", "dataLabelsGroup"] }), p.registerSeriesType("pie", m), m;\n }), n(r, "Series/Pie/PieDataLabel.js", [r["Core/Series/DataLabel.js"], r["Core/Globals.js"], r["Core/Renderer/RendererUtilities.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n var c;\n let { composed: p, noop: d } = i, { distribute: u } = a, { series: h } = s, { arrayMax: b, clamp: M, defined: C, pick: g, pushUnique: f, relativeLength: O } = l;\n return function(m) {\n let v = { radialDistributionY: function(T, x) {\n var E;\n return (((E = x.dataLabelPosition) == null ? void 0 : E.top) || 0) + T.distributeBox.pos;\n }, radialDistributionX: function(T, x, E, L, w) {\n let q = w.dataLabelPosition;\n return T.getX(E < ((q == null ? void 0 : q.top) || 0) + 2 || E > ((q == null ? void 0 : q.bottom) || 0) - 2 ? L : E, x.half, x, w);\n }, justify: function(T, x, E, L) {\n var w;\n return L[0] + (T.half ? -1 : 1) * (E + (((w = x.dataLabelPosition) == null ? void 0 : w.distance) || 0));\n }, alignToPlotEdges: function(T, x, E, L) {\n let w = T.getBBox().width;\n return x ? w + L : E - w - L;\n }, alignToConnectors: function(T, x, E, L) {\n let w = 0, q;\n return T.forEach(function(S) {\n (q = S.dataLabel.getBBox().width) > w && (w = q);\n }), x ? w + L : E - w - L;\n } };\n function y(T, x) {\n let { center: E, options: L } = this, w = E[2] / 2, q = T.angle || 0, S = Math.cos(q), B = Math.sin(q), I = E[0] + S * w, P = E[1] + B * w, k = Math.min((L.slicedOffset || 0) + (L.borderWidth || 0), x / 5);\n return { natural: { x: I + S * x, y: P + B * x }, computed: {}, alignment: x < 0 ? "center" : T.half ? "right" : "left", connectorPosition: { breakAt: { x: I + S * k, y: P + B * k }, touchingSliceAt: { x: I, y: P } }, distance: x };\n }\n function z() {\n var Y;\n let T = this, x = T.points, E = T.chart, L = E.plotWidth, w = E.plotHeight, q = E.plotLeft, S = Math.round(E.chartWidth / 3), B = T.center, I = B[2] / 2, P = B[1], k = [[], []], K = [0, 0, 0, 0], $ = T.dataLabelPositioners, j, r1, a1, _ = 0;\n T.visible && ((Y = T.hasDataLabels) != null && Y.call(T)) && (x.forEach((D) => {\n (D.dataLabels || []).forEach((H) => {\n H.shortened && (H.attr({ width: "auto" }).css({ width: "auto", textOverflow: "clip" }), H.shortened = !1);\n });\n }), h.prototype.drawDataLabels.apply(T), x.forEach((D) => {\n (D.dataLabels || []).forEach((H, G) => {\n var Q;\n let J = B[2] / 2, F = H.options, V = O((F == null ? void 0 : F.distance) || 0, J);\n G === 0 && k[D.half].push(D), !C((Q = F == null ? void 0 : F.style) == null ? void 0 : Q.width) && H.getBBox().width > S && (H.css({ width: Math.round(0.7 * S) + "px" }), H.shortened = !0), H.dataLabelPosition = this.getDataLabelPosition(D, V), _ = Math.max(_, V);\n });\n }), k.forEach((D, H) => {\n let G = D.length, J = [], F, V, Q = 0, Z;\n G && (T.sortByAngle(D, H - 0.5), _ > 0 && (F = Math.max(0, P - I - _), V = Math.min(P + I + _, E.plotHeight), D.forEach((t1) => {\n (t1.dataLabels || []).forEach((n1) => {\n var e1;\n let U = n1.dataLabelPosition;\n U && U.distance > 0 && (U.top = Math.max(0, P - I - U.distance), U.bottom = Math.min(P + I + U.distance, E.plotHeight), Q = n1.getBBox().height || 21, n1.lineHeight = E.renderer.fontMetrics(n1.text || n1).h + 2 * n1.padding, t1.distributeBox = { target: (((e1 = n1.dataLabelPosition) == null ? void 0 : e1.natural.y) || 0) - U.top + n1.lineHeight / 2, size: Q, rank: t1.y }, J.push(t1.distributeBox));\n });\n }), u(J, Z = V + Q - F, Z / 5)), D.forEach((t1) => {\n (t1.dataLabels || []).forEach((n1) => {\n let U = n1.options || {}, e1 = t1.distributeBox, o1 = n1.dataLabelPosition, u1 = (o1 == null ? void 0 : o1.natural.y) || 0, M1 = U.connectorPadding || 0, A1 = n1.lineHeight || 21, l1 = (A1 - n1.getBBox().height) / 2, b1 = 0, h1 = u1, z1 = "inherit";\n if (o1) {\n if (J && C(e1) && o1.distance > 0 && (e1.pos === void 0 ? z1 = "hidden" : (a1 = e1.size, h1 = $.radialDistributionY(t1, n1))), U.justify)\n b1 = $.justify(t1, n1, I, B);\n else\n switch (U.alignTo) {\n case "connectors":\n b1 = $.alignToConnectors(D, H, L, q);\n break;\n case "plotEdges":\n b1 = $.alignToPlotEdges(n1, H, L, q);\n break;\n default:\n b1 = $.radialDistributionX(T, t1, h1 - l1, u1, n1);\n }\n if (o1.attribs = { visibility: z1, align: o1.alignment }, o1.posAttribs = { x: b1 + (U.x || 0) + ({ left: M1, right: -M1 }[o1.alignment] || 0), y: h1 + (U.y || 0) - A1 / 2 }, o1.computed.x = b1, o1.computed.y = h1 - l1, g(U.crop, !0)) {\n let O1;\n b1 - (r1 = n1.getBBox().width) < M1 && H === 1 ? (O1 = Math.round(r1 - b1 + M1), K[3] = Math.max(O1, K[3])) : b1 + r1 > L - M1 && H === 0 && (O1 = Math.round(b1 + r1 - L + M1), K[1] = Math.max(O1, K[1])), h1 - a1 / 2 < 0 ? K[0] = Math.max(Math.round(-h1 + a1 / 2), K[0]) : h1 + a1 / 2 > w && (K[2] = Math.max(Math.round(h1 + a1 / 2 - w), K[2])), o1.sideOverflow = O1;\n }\n }\n });\n }));\n }), (b(K) === 0 || this.verifyDataLabelOverflow(K)) && (this.placeDataLabels(), this.points.forEach((D) => {\n (D.dataLabels || []).forEach((H) => {\n var V;\n let { connectorColor: G, connectorWidth: J = 1 } = H.options || {}, F = H.dataLabelPosition;\n if (J) {\n let Q;\n j = H.connector, F && F.distance > 0 ? (Q = !j, j || (H.connector = j = E.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + D.colorIndex + (D.className ? " " + D.className : "")).add(T.dataLabelsGroup)), E.styledMode || j.attr({ "stroke-width": J, stroke: G || D.color || "#666666" }), j[Q ? "attr" : "animate"]({ d: D.getConnectorPath(H) }), j.attr({ visibility: (V = F.attribs) == null ? void 0 : V.visibility })) : j && (H.connector = j.destroy());\n }\n });\n })));\n }\n function N() {\n this.points.forEach((T) => {\n (T.dataLabels || []).forEach((x) => {\n var L;\n let E = x.dataLabelPosition;\n E ? (E.sideOverflow && (x.css({ width: Math.max(x.getBBox().width - E.sideOverflow, 0) + "px", textOverflow: (((L = x.options) == null ? void 0 : L.style) || {}).textOverflow || "ellipsis" }), x.shortened = !0), x.attr(E.attribs), x[x.moved ? "animate" : "attr"](E.posAttribs), x.moved = !0) : x && x.attr({ y: -9999 });\n }), delete T.distributeBox;\n }, this);\n }\n function W(T) {\n let x = this.center, E = this.options, L = E.center, w = E.minSize || 80, q = w, S = E.size !== null;\n return !S && (L[0] !== null ? q = Math.max(x[2] - Math.max(T[1], T[3]), w) : (q = Math.max(x[2] - T[1] - T[3], w), x[0] += (T[3] - T[1]) / 2), L[1] !== null ? q = M(q, w, x[2] - Math.max(T[0], T[2])) : (q = M(q, w, x[2] - T[0] - T[2]), x[1] += (T[0] - T[2]) / 2), q < x[2] ? (x[2] = q, x[3] = Math.min(E.thickness ? Math.max(0, q - 2 * E.thickness) : Math.max(0, O(E.innerSize || 0, q)), q), this.translate(x), this.drawDataLabels && this.drawDataLabels()) : S = !0), S;\n }\n m.compose = function(T) {\n if (o.compose(h), f(p, "PieDataLabel")) {\n let x = T.prototype;\n x.dataLabelPositioners = v, x.alignDataLabel = d, x.drawDataLabels = z, x.getDataLabelPosition = y, x.placeDataLabels = N, x.verifyDataLabelOverflow = W;\n }\n };\n }(c || (c = {})), c;\n }), n(r, "Core/Geometry/GeometryUtilities.js", [], function() {\n var o, i;\n return (i = o || (o = {})).getCenterOfPoints = function(a) {\n let s = a.reduce((l, c) => (l.x += c.x, l.y += c.y, l), { x: 0, y: 0 });\n return { x: s.x / a.length, y: s.y / a.length };\n }, i.getDistanceBetweenPoints = function(a, s) {\n return Math.sqrt(Math.pow(s.x - a.x, 2) + Math.pow(s.y - a.y, 2));\n }, i.getAngleBetweenPoints = function(a, s) {\n return Math.atan2(s.x - a.x, s.y - a.y);\n }, i.pointInPolygon = function({ x: a, y: s }, l) {\n let c = l.length, p, d, u = !1;\n for (p = 0, d = c - 1; p < c; d = p++) {\n let [h, b] = l[p], [M, C] = l[d];\n b > s != C > s && a < (M - h) * (s - b) / (C - b) + h && (u = !u);\n }\n return u;\n }, o;\n }), n(r, "Extensions/OverlappingDataLabels.js", [r["Core/Geometry/GeometryUtilities.js"], r["Core/Utilities.js"]], function(o, i) {\n let { pointInPolygon: a } = o, { addEvent: s, fireEvent: l, objectEach: c, pick: p } = i;\n function d(b) {\n let M = b.length, C = (N, W) => !(W.x >= N.x + N.width || W.x + W.width <= N.x || W.y >= N.y + N.height || W.y + W.height <= N.y), g = (N, W) => {\n for (let T of N)\n if (a({ x: T[0], y: T[1] }, W))\n return !0;\n return !1;\n }, f, O, m, v, y, z = !1;\n for (let N = 0; N < M; N++)\n (f = b[N]) && (f.oldOpacity = f.opacity, f.newOpacity = 1, f.absoluteBox = function(W) {\n var T, x;\n if (W && (!W.alignAttr || W.placed)) {\n let E = W.box ? 0 : W.padding || 0, L = W.alignAttr || { x: W.attr("x"), y: W.attr("y") }, w = W.getBBox();\n return W.width = w.width, W.height = w.height, { x: L.x + (((T = W.parentGroup) == null ? void 0 : T.translateX) || 0) + E, y: L.y + (((x = W.parentGroup) == null ? void 0 : x.translateY) || 0) + E, width: (W.width || 0) - 2 * E, height: (W.height || 0) - 2 * E, polygon: w == null ? void 0 : w.polygon };\n }\n }(f));\n b.sort((N, W) => (W.labelrank || 0) - (N.labelrank || 0));\n for (let N = 0; N < M; ++N) {\n v = (O = b[N]) && O.absoluteBox;\n let W = v == null ? void 0 : v.polygon;\n for (let T = N + 1; T < M; ++T) {\n y = (m = b[T]) && m.absoluteBox;\n let x = !1;\n if (v && y && O !== m && O.newOpacity !== 0 && m.newOpacity !== 0 && O.visibility !== "hidden" && m.visibility !== "hidden") {\n let E = y.polygon;\n if (W && E && W !== E ? g(W, E) && (x = !0) : C(v, y) && (x = !0), x) {\n let L = O.labelrank < m.labelrank ? O : m, w = L.text;\n L.newOpacity = 0, w != null && w.element.querySelector("textPath") && w.hide();\n }\n }\n }\n }\n for (let N of b)\n u(N, this) && (z = !0);\n z && l(this, "afterHideAllOverlappingLabels");\n }\n function u(b, M) {\n let C, g, f = !1;\n return b && (g = b.newOpacity, b.oldOpacity !== g && (b.hasClass("highcharts-data-label") ? (b[g ? "removeClass" : "addClass"]("highcharts-data-label-hidden"), C = function() {\n M.styledMode || b.css({ pointerEvents: g ? "auto" : "none" });\n }, f = !0, b[b.isOld ? "animate" : "attr"]({ opacity: g }, void 0, C), l(M, "afterHideOverlappingLabel")) : b.attr({ opacity: g })), b.isOld = !0), f;\n }\n function h() {\n var C;\n let b = this, M = [];\n for (let g of b.labelCollectors || [])\n M = M.concat(g());\n for (let g of b.yAxis || [])\n g.stacking && g.options.stackLabels && !g.options.stackLabels.allowOverlap && c(g.stacking.stacks, (f) => {\n c(f, (O) => {\n O.label && M.push(O.label);\n });\n });\n for (let g of b.series || [])\n if (g.visible && ((C = g.hasDataLabels) != null && C.call(g))) {\n let f = (O) => {\n for (let m of O)\n m.visible && (m.dataLabels || []).forEach((v) => {\n var z;\n let y = v.options || {};\n v.labelrank = p(y.labelrank, m.labelrank, (z = m.shapeArgs) == null ? void 0 : z.height), y.allowOverlap ?? Number(y.distance) > 0 ? (v.oldOpacity = v.opacity, v.newOpacity = 1, u(v, b)) : M.push(v);\n });\n };\n f(g.nodes || []), f(g.points);\n }\n this.hideOverlappingLabels(M);\n }\n return { compose: function(b) {\n let M = b.prototype;\n M.hideOverlappingLabels || (M.hideOverlappingLabels = d, s(b, "render", h));\n } };\n }), n(r, "Extensions/BorderRadius.js", [r["Core/Defaults.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { defaultOptions: s } = o, { noop: l } = i, { addEvent: c, extend: p, isObject: d, merge: u, relativeLength: h } = a, b = { radius: 0, scope: "stack", where: void 0 }, M = l, C = l;\n function g(y, z, N, W, T = {}) {\n let x = M(y, z, N, W, T), { innerR: E = 0, r: L = N, start: w = 0, end: q = 0 } = T;\n if (T.open || !T.borderRadius)\n return x;\n let S = q - w, B = Math.sin(S / 2), I = Math.max(Math.min(h(T.borderRadius || 0, L - E), (L - E) / 2, L * B / (1 + B)), 0), P = Math.min(I, S / Math.PI * 2 * E), k = x.length - 1;\n for (; k--; )\n (function(K, $, j) {\n let r1, a1, _, Y = K[$], D = K[$ + 1];\n if (D[0] === "Z" && (D = K[0]), (Y[0] === "M" || Y[0] === "L") && D[0] === "A" ? (r1 = Y, a1 = D, _ = !0) : Y[0] === "A" && (D[0] === "M" || D[0] === "L") && (r1 = D, a1 = Y), r1 && a1 && a1.params) {\n let H = a1[1], G = a1[5], J = a1.params, { start: F, end: V, cx: Q, cy: Z } = J, t1 = G ? H - j : H + j, n1 = t1 ? Math.asin(j / t1) : 0, U = G ? n1 : -n1, e1 = Math.cos(n1) * t1;\n _ ? (J.start = F + U, r1[1] = Q + e1 * Math.cos(F), r1[2] = Z + e1 * Math.sin(F), K.splice($ + 1, 0, ["A", j, j, 0, 0, 1, Q + H * Math.cos(J.start), Z + H * Math.sin(J.start)])) : (J.end = V - U, a1[6] = Q + H * Math.cos(J.end), a1[7] = Z + H * Math.sin(J.end), K.splice($ + 1, 0, ["A", j, j, 0, 0, 1, Q + e1 * Math.cos(V), Z + e1 * Math.sin(V)])), a1[4] = Math.abs(J.end - J.start) < Math.PI ? 0 : 1;\n }\n })(x, k, k > 1 ? P : I);\n return x;\n }\n function f() {\n var y, z;\n if (this.options.borderRadius && !(this.chart.is3d && this.chart.is3d())) {\n let { options: N, yAxis: W } = this, T = N.stacking === "percent", x = (z = (y = s.plotOptions) == null ? void 0 : y[this.type]) == null ? void 0 : z.borderRadius, E = O(N.borderRadius, d(x) ? x : {}), L = W.options.reversed;\n for (let w of this.points) {\n let { shapeArgs: q } = w;\n if (w.shapeType === "roundedRect" && q) {\n let { width: S = 0, height: B = 0, y: I = 0 } = q, P = I, k = B;\n if (E.scope === "stack" && w.stackTotal) {\n let r1 = W.translate(T ? 100 : w.stackTotal, !1, !0, !1, !0), a1 = W.translate(N.threshold || 0, !1, !0, !1, !0), _ = this.crispCol(0, Math.min(r1, a1), 0, Math.abs(r1 - a1));\n P = _.y, k = _.height;\n }\n let K = (w.negative ? -1 : 1) * (L ? -1 : 1) == -1, $ = E.where;\n !$ && this.is("waterfall") && Math.abs((w.yBottom || 0) - (this.translatedThreshold || 0)) > this.borderWidth && ($ = "all"), $ || ($ = "end");\n let j = Math.min(h(E.radius, S), S / 2, $ === "all" ? B / 2 : 1 / 0) || 0;\n $ === "end" && (K && (P -= j), k += j), p(q, { brBoxHeight: k, brBoxY: P, r: j });\n }\n }\n }\n }\n function O(y, z) {\n return d(y) || (y = { radius: y || 0 }), u(b, z, y);\n }\n function m() {\n let y = O(this.options.borderRadius);\n for (let z of this.points) {\n let N = z.shapeArgs;\n N && (N.borderRadius = h(y.radius, (N.r || 0) - (N.innerR || 0)));\n }\n }\n function v(y, z, N, W, T = {}) {\n let x = C(y, z, N, W, T), { r: E = 0, brBoxHeight: L = W, brBoxY: w = z } = T, q = z - w, S = w + L - (z + W), B = q - E > -0.1 ? 0 : E, I = S - E > -0.1 ? 0 : E, P = Math.max(B && q, 0), k = Math.max(I && S, 0), K = [y + B, z], $ = [y + N - B, z], j = [y + N, z + B], r1 = [y + N, z + W - I], a1 = [y + N - I, z + W], _ = [y + I, z + W], Y = [y, z + W - I], D = [y, z + B], H = (G, J) => Math.sqrt(Math.pow(G, 2) - Math.pow(J, 2));\n if (P) {\n let G = H(B, B - P);\n K[0] -= G, $[0] += G, j[1] = D[1] = z + B - P;\n }\n if (W < B - P) {\n let G = H(B, B - P - W);\n j[0] = r1[0] = y + N - B + G, a1[0] = Math.min(j[0], a1[0]), _[0] = Math.max(r1[0], _[0]), Y[0] = D[0] = y + B - G, j[1] = D[1] = z + W;\n }\n if (k) {\n let G = H(I, I - k);\n a1[0] += G, _[0] -= G, r1[1] = Y[1] = z + W - I + k;\n }\n if (W < I - k) {\n let G = H(I, I - k - W);\n j[0] = r1[0] = y + N - I + G, $[0] = Math.min(j[0], $[0]), K[0] = Math.max(r1[0], K[0]), Y[0] = D[0] = y + I - G, r1[1] = Y[1] = z;\n }\n return x.length = 0, x.push(["M", ...K], ["L", ...$], ["A", B, B, 0, 0, 1, ...j], ["L", ...r1], ["A", I, I, 0, 0, 1, ...a1], ["L", ..._], ["A", I, I, 0, 0, 1, ...Y], ["L", ...D], ["A", B, B, 0, 0, 1, ...K], ["Z"]), x;\n }\n return { compose: function(y, z, N) {\n let W = y.types.pie;\n if (!z.symbolCustomAttribs.includes("borderRadius")) {\n let T = N.prototype.symbols;\n c(y, "afterColumnTranslate", f, { order: 9 }), c(W, "afterTranslate", m), z.symbolCustomAttribs.push("borderRadius", "brBoxHeight", "brBoxY"), M = T.arc, C = T.roundedRect, T.arc = g, T.roundedRect = v;\n }\n }, optionsToObject: O };\n }), n(r, "Core/Responsive.js", [r["Core/Utilities.js"]], function(o) {\n var i;\n let { diffObjects: a, extend: s, find: l, merge: c, pick: p, uniqueKey: d } = o;\n return function(u) {\n function h(M, C) {\n let g = M.condition;\n (g.callback || function() {\n return this.chartWidth <= p(g.maxWidth, Number.MAX_VALUE) && this.chartHeight <= p(g.maxHeight, Number.MAX_VALUE) && this.chartWidth >= p(g.minWidth, 0) && this.chartHeight >= p(g.minHeight, 0);\n }).call(this) && C.push(M._id);\n }\n function b(M, C) {\n let g = this.options.responsive, f = this.currentResponsive, O = [], m;\n !C && g && g.rules && g.rules.forEach((z) => {\n z._id === void 0 && (z._id = d()), this.matchResponsiveRule(z, O);\n }, this);\n let v = c(...O.map((z) => l((g || {}).rules || [], (N) => N._id === z)).map((z) => z && z.chartOptions));\n v.isResponsiveOptions = !0, O = O.toString() || void 0;\n let y = f && f.ruleIds;\n O === y || (f && (this.currentResponsive = void 0, this.updatingResponsive = !0, this.update(f.undoOptions, M, !0), this.updatingResponsive = !1), O ? ((m = a(v, this.options, !0, this.collectionsWithUpdate)).isResponsiveOptions = !0, this.currentResponsive = { ruleIds: O, mergedOptions: v, undoOptions: m }, this.updatingResponsive || this.update(v, M, !0)) : this.currentResponsive = void 0);\n }\n u.compose = function(M) {\n let C = M.prototype;\n return C.matchResponsiveRule || s(C, { matchResponsiveRule: h, setResponsive: b }), M;\n };\n }(i || (i = {})), i;\n }), n(r, "masters/highcharts.src.js", [r["Core/Globals.js"], r["Core/Utilities.js"], r["Core/Defaults.js"], r["Core/Animation/Fx.js"], r["Core/Animation/AnimationUtilities.js"], r["Core/Renderer/HTML/AST.js"], r["Core/Templating.js"], r["Core/Renderer/RendererRegistry.js"], r["Core/Renderer/RendererUtilities.js"], r["Core/Renderer/SVG/SVGElement.js"], r["Core/Renderer/SVG/SVGRenderer.js"], r["Core/Renderer/HTML/HTMLElement.js"], r["Core/Axis/Axis.js"], r["Core/Axis/DateTimeAxis.js"], r["Core/Axis/LogarithmicAxis.js"], r["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"], r["Core/Axis/Tick.js"], r["Core/Tooltip.js"], r["Core/Series/Point.js"], r["Core/Pointer.js"], r["Core/Legend/Legend.js"], r["Core/Legend/LegendSymbol.js"], r["Core/Chart/Chart.js"], r["Extensions/ScrollablePlotArea.js"], r["Core/Axis/Stacking/StackingAxis.js"], r["Core/Axis/Stacking/StackItem.js"], r["Core/Series/Series.js"], r["Core/Series/SeriesRegistry.js"], r["Series/Column/ColumnDataLabel.js"], r["Series/Pie/PieDataLabel.js"], r["Core/Series/DataLabel.js"], r["Extensions/OverlappingDataLabels.js"], r["Extensions/BorderRadius.js"], r["Core/Responsive.js"], r["Core/Color/Color.js"], r["Core/Time.js"]], function(o, i, a, s, l, c, p, d, u, h, b, M, C, g, f, O, m, v, y, z, N, W, T, x, E, L, w, q, S, B, I, P, k, K, $, j) {\n return o.AST = c, o.Axis = C, o.Chart = T, o.Color = $, o.DataLabel = I, o.Fx = s, o.HTMLElement = M, o.Legend = N, o.LegendSymbol = W, o.OverlappingDataLabels = o.OverlappingDataLabels || P, o.PlotLineOrBand = O, o.Point = y, o.Pointer = z, o.RendererRegistry = d, o.Series = w, o.SeriesRegistry = q, o.StackItem = L, o.SVGElement = h, o.SVGRenderer = b, o.Templating = p, o.Tick = m, o.Time = j, o.Tooltip = v, o.animate = l.animate, o.animObject = l.animObject, o.chart = T.chart, o.color = $.parse, o.dateFormat = p.dateFormat, o.defaultOptions = a.defaultOptions, o.distribute = u.distribute, o.format = p.format, o.getDeferredAnimation = l.getDeferredAnimation, o.getOptions = a.getOptions, o.numberFormat = p.numberFormat, o.seriesType = q.seriesType, o.setAnimation = l.setAnimation, o.setOptions = a.setOptions, o.stop = l.stop, o.time = a.defaultTime, o.timers = s.timers, k.compose(o.Series, o.SVGElement, o.SVGRenderer), S.compose(o.Series.types.column), I.compose(o.Series), g.compose(o.Axis), M.compose(o.SVGRenderer), N.compose(o.Chart), f.compose(o.Axis), P.compose(o.Chart), B.compose(o.Series.types.pie), O.compose(o.Chart, o.Axis), z.compose(o.Chart), K.compose(o.Chart), x.compose(o.Axis, o.Chart, o.Series), E.compose(o.Axis, o.Chart, o.Series), v.compose(o.Pointer), i.extend(o, i), o;\n }), r["masters/highcharts.src.js"]._modules = r, r["masters/highcharts.src.js"];\n });\n})(DC);\nvar JK = DC.exports;\nconst ci = /* @__PURE__ */ $t(JK), _K = ["#312783", "#009FE3", "#831F82", "#EC619F", "#FF0000", "#F39200"];\nvar HC = { exports: {} };\n(function(e) {\n /**\n * Highcharts JS v11.4.8 (2024-08-29)\n *\n * Variable Pie module for Highcharts\n *\n * (c) 2010-2024 Grzegorz Blachliński\n *\n * License: www.highcharts.com/license\n */\n (function(t) {\n e.exports ? (t.default = t, e.exports = t) : t(typeof Highcharts < "u" ? Highcharts : void 0);\n })(function(t) {\n var r = t ? t._modules : {};\n function n(o, i, a, s) {\n o.hasOwnProperty(i) || (o[i] = s.apply(null, a), typeof CustomEvent == "function" && t.win.dispatchEvent(new CustomEvent("HighchartsModuleLoaded", { detail: { path: i, module: o[i] } })));\n }\n n(r, "Series/VariablePie/VariablePieSeriesDefaults.js", [], function() {\n return { minPointSize: "10%", maxPointSize: "100%", zMin: void 0, zMax: void 0, sizeBy: "area", tooltip: { pointFormat: \' {series.name}
Value: {point.y}
Size: {point.z}
\' } };\n }), n(r, "Series/VariablePie/VariablePieSeries.js", [r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"], r["Series/VariablePie/VariablePieSeriesDefaults.js"]], function(o, i, a) {\n let { pie: s } = o.seriesTypes, { arrayMax: l, arrayMin: c, clamp: p, extend: d, fireEvent: u, merge: h, pick: b } = i;\n class M extends s {\n calculateExtremes() {\n let g, f, O = this.chart, m = O.plotWidth, v = O.plotHeight, y = this.options, z = 2 * (y.slicedOffset || 0), N = this.zData, W = Math.min(m, v) - z, T = {}, x = this.center || this.getCenter();\n for (let E of ["minPointSize", "maxPointSize"]) {\n let L = y[E], w = /%$/.test(L);\n L = parseInt(L, 10), T[E] = w ? W * L / 100 : 2 * L;\n }\n this.minPxSize = x[3] + T.minPointSize, this.maxPxSize = p(x[2], x[3] + T.minPointSize, T.maxPointSize), N.length && (g = b(y.zMin, c(N.filter(this.zValEval))), f = b(y.zMax, l(N.filter(this.zValEval))), this.getRadii(g, f, this.minPxSize, this.maxPxSize));\n }\n getRadii(g, f, O, m) {\n let v, y, z, N = this.zData, W = [], T = this.options.sizeBy !== "radius", x = f - g;\n for (let E = 0; E < N.length; E++)\n (y = this.zValEval(N[E]) ? N[E] : g) <= g ? z = O / 2 : y >= f ? z = m / 2 : (v = x > 0 ? (y - g) / x : 0.5, T && (v = Math.sqrt(v)), z = Math.ceil(O + v * (m - O)) / 2), W.push(z);\n this.radii = W;\n }\n redraw() {\n this.center = null, super.redraw();\n }\n getDataLabelPosition(g, f) {\n let { center: O, options: m } = this, v = g.angle || 0, y = this.radii[g.index], z = O[0] + Math.cos(v) * y, N = O[1] + Math.sin(v) * y, W = Math.min((m.slicedOffset || 0) + (m.borderWidth || 0), f / 5);\n return { distance: f, natural: { x: z + Math.cos(v) * f, y: N + Math.sin(v) * f }, computed: {}, alignment: g.half ? "right" : "left", connectorPosition: { breakAt: { x: z + Math.cos(v) * W, y: N + Math.sin(v) * W }, touchingSliceAt: { x: z, y: N } } };\n }\n translate(g) {\n this.generatePoints();\n let f = this.options, O = f.slicedOffset, m = f.startAngle || 0, v = Math.PI / 180 * (m - 90), y = Math.PI / 180 * (b(f.endAngle, m + 360) - 90), z = y - v, N = this.points, W = f.ignoreHiddenPoint, T = 0, x, E, L, w, q, S, B;\n this.startAngleRad = v, this.endAngleRad = y, this.calculateExtremes(), g || (this.center = g = this.getCenter());\n for (let I = 0; I < N.length; I++)\n S = N[I], B = this.radii[I], x = v + T * z, (!W || S.visible) && (T += S.percentage / 100), E = v + T * z, S.shapeType = "arc", S.shapeArgs = { x: g[0], y: g[1], r: B, innerR: g[3] / 2, start: Math.round(1e3 * x) / 1e3, end: Math.round(1e3 * E) / 1e3 }, (L = (E + x) / 2) > 1.5 * Math.PI ? L -= 2 * Math.PI : L < -Math.PI / 2 && (L += 2 * Math.PI), S.slicedTranslation = { translateX: Math.round(Math.cos(L) * O), translateY: Math.round(Math.sin(L) * O) }, w = Math.cos(L) * g[2] / 2, q = Math.sin(L) * g[2] / 2, S.tooltipPos = [g[0] + 0.7 * w, g[1] + 0.7 * q], S.half = L < -Math.PI / 2 || L > Math.PI / 2 ? 1 : 0, S.angle = L;\n u(this, "afterTranslate");\n }\n zValEval(g) {\n return !(typeof g != "number" || isNaN(g)) || null;\n }\n }\n return M.defaultOptions = h(s.defaultOptions, a), d(M.prototype, { pointArrayMap: ["y", "z"], parallelArrays: ["x", "y", "z"] }), o.registerSeriesType("variablepie", M), M;\n }), n(r, "masters/modules/variable-pie.src.js", [r["Core/Globals.js"]], function(o) {\n return o;\n });\n });\n})(HC);\nvar $K = HC.exports;\nconst eZ = /* @__PURE__ */ $t($K);\nvar PC = { exports: {} };\n(function(e) {\n /**\n * Highcharts JS v11.4.8 (2024-08-29)\n *\n * (c) 2009-2024 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n (function(t) {\n e.exports ? (t.default = t, e.exports = t) : t(typeof Highcharts < "u" ? Highcharts : void 0);\n })(function(t) {\n var r = t ? t._modules : {};\n function n(o, i, a, s) {\n o.hasOwnProperty(i) || (o[i] = s.apply(null, a), typeof CustomEvent == "function" && t.win.dispatchEvent(new CustomEvent("HighchartsModuleLoaded", { detail: { path: i, module: o[i] } })));\n }\n n(r, "Extensions/Pane/PaneComposition.js", [r["Core/Utilities.js"]], function(o) {\n let { addEvent: i, correctFloat: a, defined: s, pick: l } = o;\n function c(b) {\n let M, C = this;\n return b && C.pane.forEach((g) => {\n p(b.chartX - C.plotLeft, b.chartY - C.plotTop, g.center) && (M = g);\n }), M;\n }\n function p(b, M, C, g, f) {\n let O = !0, m = C[0], v = C[1], y = Math.sqrt(Math.pow(b - m, 2) + Math.pow(M - v, 2));\n if (s(g) && s(f)) {\n let z = Math.atan2(a(M - v, 8), a(b - m, 8));\n f !== g && (O = g > f ? z >= g && z <= Math.PI || z <= f && z >= -Math.PI : z >= g && z <= a(f, 8));\n }\n return y <= Math.ceil(C[2] / 2) && O;\n }\n function d(b) {\n this.polar && (b.options.inverted && ([b.x, b.y] = [b.y, b.x]), b.isInsidePlot = this.pane.some((M) => p(b.x, b.y, M.center, M.axis && M.axis.normalizedStartAngleRad, M.axis && M.axis.normalizedEndAngleRad)));\n }\n function u(b) {\n let M = this.chart;\n b.hoverPoint && b.hoverPoint.plotX && b.hoverPoint.plotY && M.hoverPane && !p(b.hoverPoint.plotX, b.hoverPoint.plotY, M.hoverPane.center) && (b.hoverPoint = void 0);\n }\n function h(b) {\n let M = this.chart;\n M.polar ? (M.hoverPane = M.getHoverPane(b), b.filter = function(C) {\n return C.visible && !(!b.shared && C.directTouch) && l(C.options.enableMouseTracking, !0) && (!M.hoverPane || C.xAxis.pane === M.hoverPane);\n }) : M.hoverPane = void 0;\n }\n return { compose: function(b, M) {\n let C = b.prototype;\n C.getHoverPane || (C.collectionsWithUpdate.push("pane"), C.getHoverPane = c, i(b, "afterIsInsidePlot", d), i(M, "afterGetHoverData", u), i(M, "beforeGetHoverData", h));\n } };\n }), n(r, "Extensions/Pane/PaneDefaults.js", [], function() {\n return { pane: { center: ["50%", "50%"], size: "85%", innerSize: "0%", startAngle: 0 }, background: { shape: "circle", borderRadius: 0, borderWidth: 1, borderColor: "#cccccc", backgroundColor: { linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, stops: [[0, "#ffffff"], [1, "#e6e6e6"]] }, from: -Number.MAX_VALUE, innerRadius: 0, to: Number.MAX_VALUE, outerRadius: "105%" } };\n }), n(r, "Extensions/Pane/Pane.js", [r["Series/CenteredUtilities.js"], r["Extensions/Pane/PaneComposition.js"], r["Extensions/Pane/PaneDefaults.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { extend: l, merge: c, splat: p } = s;\n class d {\n constructor(h, b) {\n this.coll = "pane", this.init(h, b);\n }\n init(h, b) {\n this.chart = b, this.background = [], b.pane.push(this), this.setOptions(h);\n }\n setOptions(h) {\n this.options = h = c(a.pane, this.chart.angular ? { background: {} } : void 0, h);\n }\n render() {\n let h = this.options, b = this.chart.renderer;\n this.group || (this.group = b.g("pane-group").attr({ zIndex: h.zIndex || 0 }).add()), this.updateCenter();\n let M = this.options.background;\n if (M) {\n let C = Math.max((M = p(M)).length, this.background.length || 0);\n for (let g = 0; g < C; g++)\n M[g] && this.axis ? this.renderBackground(c(a.background, M[g]), g) : this.background[g] && (this.background[g] = this.background[g].destroy(), this.background.splice(g, 1));\n }\n }\n renderBackground(h, b) {\n let M = { class: "highcharts-pane " + (h.className || "") }, C = "animate";\n this.chart.styledMode || l(M, { fill: h.backgroundColor, stroke: h.borderColor, "stroke-width": h.borderWidth }), this.background[b] || (this.background[b] = this.chart.renderer.path().add(this.group), C = "attr"), this.background[b][C]({ d: this.axis.getPlotBandPath(h.from, h.to, h) }).attr(M);\n }\n updateCenter(h) {\n this.center = (h || this.axis || {}).center = o.getCenter.call(this);\n }\n update(h, b) {\n c(!0, this.options, h), this.setOptions(this.options), this.render(), this.chart.axes.forEach(function(M) {\n M.pane === this && (M.pane = null, M.update({}, b));\n }, this);\n }\n }\n return d.compose = i.compose, d;\n }), n(r, "Series/AreaRange/AreaRangePoint.js", [r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i) {\n let { area: { prototype: { pointClass: a, pointClass: { prototype: s } } } } = o.seriesTypes, { defined: l, isNumber: c } = i;\n return class extends a {\n setState() {\n let p = this.state, d = this.series, u = d.chart.polar;\n l(this.plotHigh) || (this.plotHigh = d.yAxis.toPixels(this.high, !0)), l(this.plotLow) || (this.plotLow = this.plotY = d.yAxis.toPixels(this.low, !0)), d.lowerStateMarkerGraphic = d.stateMarkerGraphic, d.stateMarkerGraphic = d.upperStateMarkerGraphic, this.graphic = this.graphics && this.graphics[1], this.plotY = this.plotHigh, u && c(this.plotHighX) && (this.plotX = this.plotHighX), s.setState.apply(this, arguments), this.state = p, this.plotY = this.plotLow, this.graphic = this.graphics && this.graphics[0], u && c(this.plotLowX) && (this.plotX = this.plotLowX), d.upperStateMarkerGraphic = d.stateMarkerGraphic, d.stateMarkerGraphic = d.lowerStateMarkerGraphic, d.lowerStateMarkerGraphic = void 0;\n let h = d.modifyMarkerSettings();\n s.setState.apply(this, arguments), d.restoreMarkerSettings(h);\n }\n haloPath() {\n let p = this.series.chart.polar, d = [];\n return this.plotY = this.plotLow, p && c(this.plotLowX) && (this.plotX = this.plotLowX), this.isInside && (d = s.haloPath.apply(this, arguments)), this.plotY = this.plotHigh, p && c(this.plotHighX) && (this.plotX = this.plotHighX), this.isTopInside && (d = d.concat(s.haloPath.apply(this, arguments))), d;\n }\n isValid() {\n return c(this.low) && c(this.high);\n }\n };\n }), n(r, "Series/AreaRange/AreaRangeSeries.js", [r["Series/AreaRange/AreaRangePoint.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { noop: l } = i, { area: c, area: { prototype: p }, column: { prototype: d } } = a.seriesTypes, { addEvent: u, defined: h, extend: b, isArray: M, isNumber: C, pick: g, merge: f } = s;\n class O extends c {\n toYData(v) {\n return [v.low, v.high];\n }\n highToXY(v) {\n let y = this.chart, z = this.xAxis.postTranslate(v.rectPlotX || 0, this.yAxis.len - (v.plotHigh || 0));\n v.plotHighX = z.x - y.plotLeft, v.plotHigh = z.y - y.plotTop, v.plotLowX = v.plotX;\n }\n getGraphPath(v) {\n let y = [], z = [], N = p.getGraphPath, W = this.options, T = this.chart.polar, x = T && W.connectEnds !== !1, E = W.connectNulls, L, w, q, S = W.step;\n for (L = (v = v || this.points).length; L--; ) {\n w = v[L];\n let K = T ? { plotX: w.rectPlotX, plotY: w.yBottom, doCurve: !1 } : { plotX: w.plotX, plotY: w.plotY, doCurve: !1 };\n w.isNull || x || E || v[L + 1] && !v[L + 1].isNull || z.push(K), q = { polarPlotY: w.polarPlotY, rectPlotX: w.rectPlotX, yBottom: w.yBottom, plotX: g(w.plotHighX, w.plotX), plotY: w.plotHigh, isNull: w.isNull }, z.push(q), y.push(q), w.isNull || x || E || v[L - 1] && !v[L - 1].isNull || z.push(K);\n }\n let B = N.call(this, v);\n S && (S === !0 && (S = "left"), W.step = { left: "right", center: "center", right: "left" }[S]);\n let I = N.call(this, y), P = N.call(this, z);\n W.step = S;\n let k = [].concat(B, I);\n return !this.chart.polar && P[0] && P[0][0] === "M" && (P[0] = ["L", P[0][1], P[0][2]]), this.graphPath = k, this.areaPath = B.concat(P), k.isArea = !0, k.xMap = B.xMap, this.areaPath.xMap = B.xMap, k;\n }\n drawDataLabels() {\n var q, S;\n let v, y, z, N, W, T = this.points, x = T.length, E = [], L = this.options.dataLabels, w = this.chart.inverted;\n if (L) {\n if (M(L) ? (N = L[0] || { enabled: !1 }, W = L[1] || { enabled: !1 }) : ((N = b({}, L)).x = L.xHigh, N.y = L.yHigh, (W = b({}, L)).x = L.xLow, W.y = L.yLow), N.enabled || ((q = this.hasDataLabels) == null ? void 0 : q.call(this))) {\n for (v = x; v--; )\n if (y = T[v]) {\n let { plotHigh: B = 0, plotLow: I = 0 } = y;\n z = N.inside ? B < I : B > I, y.y = y.high, y._plotY = y.plotY, y.plotY = B, E[v] = y.dataLabel, y.dataLabel = y.dataLabelUpper, y.below = z, w ? N.align || (N.align = z ? "right" : "left") : N.verticalAlign || (N.verticalAlign = z ? "top" : "bottom");\n }\n for (this.options.dataLabels = N, p.drawDataLabels && p.drawDataLabels.apply(this, arguments), v = x; v--; )\n (y = T[v]) && (y.dataLabelUpper = y.dataLabel, y.dataLabel = E[v], delete y.dataLabels, y.y = y.low, y.plotY = y._plotY);\n }\n if (W.enabled || (S = this.hasDataLabels) != null && S.call(this)) {\n for (v = x; v--; )\n if (y = T[v]) {\n let { plotHigh: B = 0, plotLow: I = 0 } = y;\n z = W.inside ? B < I : B > I, y.below = !z, w ? W.align || (W.align = z ? "left" : "right") : W.verticalAlign || (W.verticalAlign = z ? "bottom" : "top");\n }\n this.options.dataLabels = W, p.drawDataLabels && p.drawDataLabels.apply(this, arguments);\n }\n if (N.enabled)\n for (v = x; v--; )\n (y = T[v]) && (y.dataLabels = [y.dataLabelUpper, y.dataLabel].filter(function(B) {\n return !!B;\n }));\n this.options.dataLabels = L;\n }\n }\n alignDataLabel() {\n d.alignDataLabel.apply(this, arguments);\n }\n modifyMarkerSettings() {\n let v = { marker: this.options.marker, symbol: this.symbol };\n if (this.options.lowMarker) {\n let { options: { marker: y, lowMarker: z } } = this;\n this.options.marker = f(y, z), z.symbol && (this.symbol = z.symbol);\n }\n return v;\n }\n restoreMarkerSettings(v) {\n this.options.marker = v.marker, this.symbol = v.symbol;\n }\n drawPoints() {\n let v, y, z = this.points.length, N = this.modifyMarkerSettings();\n for (p.drawPoints.apply(this, arguments), this.restoreMarkerSettings(N), v = 0; v < z; )\n (y = this.points[v]).graphics = y.graphics || [], y.origProps = { plotY: y.plotY, plotX: y.plotX, isInside: y.isInside, negative: y.negative, zone: y.zone, y: y.y }, (y.graphic || y.graphics[0]) && (y.graphics[0] = y.graphic), y.graphic = y.graphics[1], y.plotY = y.plotHigh, h(y.plotHighX) && (y.plotX = y.plotHighX), y.y = g(y.high, y.origProps.y), y.negative = y.y < (this.options.threshold || 0), this.zones.length && (y.zone = y.getZone()), this.chart.polar || (y.isInside = y.isTopInside = y.plotY !== void 0 && y.plotY >= 0 && y.plotY <= this.yAxis.len && y.plotX >= 0 && y.plotX <= this.xAxis.len), v++;\n for (p.drawPoints.apply(this, arguments), v = 0; v < z; )\n (y = this.points[v]).graphics = y.graphics || [], (y.graphic || y.graphics[1]) && (y.graphics[1] = y.graphic), y.graphic = y.graphics[0], y.origProps && (b(y, y.origProps), delete y.origProps), v++;\n }\n hasMarkerChanged(v, y) {\n let z = v.lowMarker, N = y.lowMarker || {};\n return z && (z.enabled === !1 || N.symbol !== z.symbol || N.height !== z.height || N.width !== z.width) || super.hasMarkerChanged(v, y);\n }\n }\n return O.defaultOptions = f(c.defaultOptions, { lineWidth: 1, threshold: null, tooltip: { pointFormat: \' {series.name}: {point.low} - {point.high}
\' }, trackByArea: !0, dataLabels: { align: void 0, verticalAlign: void 0, xLow: 0, xHigh: 0, yLow: 0, yHigh: 0 } }), u(O, "afterTranslate", function() {\n this.pointArrayMap.join(",") === "low,high" && this.points.forEach((m) => {\n let v = m.high, y = m.plotY;\n m.isNull ? m.plotY = void 0 : (m.plotLow = y, m.plotHigh = C(v) ? this.yAxis.translate(this.dataModify ? this.dataModify.modifyValue(v) : v, !1, !0, void 0, !0) : void 0, this.dataModify && (m.yBottom = m.plotHigh));\n });\n }, { order: 0 }), u(O, "afterTranslate", function() {\n this.points.forEach((m) => {\n if (this.chart.polar)\n this.highToXY(m), m.plotLow = m.plotY, m.tooltipPos = [((m.plotHighX || 0) + (m.plotLowX || 0)) / 2, ((m.plotHigh || 0) + (m.plotLow || 0)) / 2];\n else {\n let v = m.pos(!1, m.plotLow), y = m.pos(!1, m.plotHigh);\n v && y && (v[0] = (v[0] + y[0]) / 2, v[1] = (v[1] + y[1]) / 2), m.tooltipPos = v;\n }\n });\n }, { order: 3 }), b(O.prototype, { deferTranslatePolar: !0, pointArrayMap: ["low", "high"], pointClass: o, pointValKey: "low", setStackedPoints: l }), a.registerSeriesType("arearange", O), O;\n }), n(r, "Series/AreaSplineRange/AreaSplineRangeSeries.js", [r["Series/AreaRange/AreaRangeSeries.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { spline: { prototype: s } } = i.seriesTypes, { merge: l, extend: c } = a;\n class p extends o {\n }\n return p.defaultOptions = l(o.defaultOptions), c(p.prototype, { getPointSpline: s.getPointSpline }), i.registerSeriesType("areasplinerange", p), p;\n }), n(r, "Series/BoxPlot/BoxPlotSeriesDefaults.js", [], function() {\n return { threshold: null, tooltip: { pointFormat: \' {series.name}
Maximum: {point.high}
Upper quartile: {point.q3}
Median: {point.median}
Lower quartile: {point.q1}
Minimum: {point.low}
\' }, whiskerLength: "50%", fillColor: "#ffffff", lineWidth: 1, medianWidth: 2, whiskerWidth: 2 };\n }), n(r, "Series/BoxPlot/BoxPlotSeries.js", [r["Series/BoxPlot/BoxPlotSeriesDefaults.js"], r["Series/Column/ColumnSeries.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n let { noop: c } = a, { crisp: p, extend: d, merge: u, pick: h } = l;\n class b extends i {\n pointAttribs() {\n return {};\n }\n translate() {\n let C = this.yAxis, g = this.pointArrayMap;\n super.translate.apply(this), this.points.forEach(function(f) {\n g.forEach(function(O) {\n f[O] !== null && (f[O + "Plot"] = C.translate(f[O], 0, 1, 0, 1));\n }), f.plotHigh = f.highPlot;\n });\n }\n drawPoints() {\n let C, g, f, O, m, v, y, z, N, W, T, x, E, L = this.points, w = this.options, q = this.chart, S = q.renderer, B = this.doQuartiles !== !1, I = this.options.whiskerLength;\n for (let P of L) {\n let k = (z = P.graphic) ? "animate" : "attr", K = P.shapeArgs, $ = {}, j = {}, r1 = {}, a1 = {}, _ = P.color || this.color;\n if (P.plotY !== void 0) {\n let Y;\n N = K.width, T = (W = K.x) + N, x = N / 2, C = B ? P.q1Plot : P.lowPlot, g = B ? P.q3Plot : P.lowPlot, f = P.highPlot, O = P.lowPlot, z || (P.graphic = z = S.g("point").add(this.group), P.stem = S.path().addClass("highcharts-boxplot-stem").add(z), I && (P.whiskers = S.path().addClass("highcharts-boxplot-whisker").add(z)), B && (P.box = S.path(y).addClass("highcharts-boxplot-box").add(z)), P.medianShape = S.path(v).addClass("highcharts-boxplot-median").add(z)), q.styledMode || (j.stroke = P.stemColor || w.stemColor || _, j["stroke-width"] = h(P.stemWidth, w.stemWidth, w.lineWidth), j.dashstyle = P.stemDashStyle || w.stemDashStyle || w.dashStyle, P.stem.attr(j), I && (r1.stroke = P.whiskerColor || w.whiskerColor || _, r1["stroke-width"] = h(P.whiskerWidth, w.whiskerWidth, w.lineWidth), r1.dashstyle = P.whiskerDashStyle || w.whiskerDashStyle || w.dashStyle, P.whiskers.attr(r1)), B && ($.fill = P.fillColor || w.fillColor || _, $.stroke = w.lineColor || _, $["stroke-width"] = w.lineWidth || 0, $.dashstyle = P.boxDashStyle || w.boxDashStyle || w.dashStyle, P.box.attr($)), a1.stroke = P.medianColor || w.medianColor || _, a1["stroke-width"] = h(P.medianWidth, w.medianWidth, w.lineWidth), a1.dashstyle = P.medianDashStyle || w.medianDashStyle || w.dashStyle, P.medianShape.attr(a1));\n let D = p((P.plotX || 0) + (this.pointXOffset || 0) + (this.barW || 0) / 2, P.stem.strokeWidth());\n if (Y = [["M", D, g], ["L", D, f], ["M", D, C], ["L", D, O]], P.stem[k]({ d: Y }), B) {\n let H = P.box.strokeWidth();\n C = p(C, H), g = p(g, H), Y = [["M", W = p(W, H), g], ["L", W, C], ["L", T = p(T, H), C], ["L", T, g], ["L", W, g], ["Z"]], P.box[k]({ d: Y });\n }\n if (I) {\n let H = P.whiskers.strokeWidth();\n f = p(P.highPlot, H), O = p(P.lowPlot, H), Y = [["M", p(D - (E = typeof I == "string" && /%$/.test(I) ? x * parseFloat(I) / 100 : Number(I) / 2)), f], ["L", p(D + E), f], ["M", p(D - E), O], ["L", p(D + E), O]], P.whiskers[k]({ d: Y });\n }\n Y = [["M", W, m = p(P.medianPlot, P.medianShape.strokeWidth())], ["L", T, m]], P.medianShape[k]({ d: Y });\n }\n }\n }\n toYData(C) {\n return [C.low, C.q1, C.median, C.q3, C.high];\n }\n }\n return b.defaultOptions = u(i.defaultOptions, o), d(b.prototype, { pointArrayMap: ["low", "q1", "median", "q3", "high"], pointValKey: "high", drawDataLabels: c, setStackedPoints: c }), s.registerSeriesType("boxplot", b), b;\n }), n(r, "Series/Bubble/BubbleLegendDefaults.js", [], function() {\n return { borderColor: void 0, borderWidth: 2, className: void 0, color: void 0, connectorClassName: void 0, connectorColor: void 0, connectorDistance: 60, connectorWidth: 1, enabled: !1, labels: { className: void 0, allowOverlap: !1, format: "", formatter: void 0, align: "right", style: { fontSize: "0.9em", color: "#000000" }, x: 0, y: 0 }, maxSize: 60, minSize: 10, legendIndex: 0, ranges: { value: void 0, borderColor: void 0, color: void 0, connectorColor: void 0 }, sizeBy: "area", sizeByAbsoluteValue: !1, zIndex: 1, zThreshold: 0 };\n }), n(r, "Series/Bubble/BubbleLegendItem.js", [r["Core/Color/Color.js"], r["Core/Templating.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { parse: l } = o, { noop: c } = a, { arrayMax: p, arrayMin: d, isNumber: u, merge: h, pick: b, stableSort: M } = s;\n return class {\n constructor(C, g) {\n this.setState = c, this.init(C, g);\n }\n init(C, g) {\n this.options = C, this.visible = !0, this.chart = g.chart, this.legend = g;\n }\n addToLegend(C) {\n C.splice(this.options.legendIndex, 0, this);\n }\n drawLegendSymbol(C) {\n let g, f = b(C.options.itemDistance, 20), O = this.legendItem || {}, m = this.options, v = m.ranges, y = m.connectorDistance;\n if (!v || !v.length || !u(v[0].value)) {\n C.options.bubbleLegend.autoRanges = !0;\n return;\n }\n M(v, function(T, x) {\n return x.value - T.value;\n }), this.ranges = v, this.setOptions(), this.render();\n let z = this.getMaxLabelSize(), N = this.ranges[0].radius, W = 2 * N;\n g = (g = y - N + z.width) > 0 ? g : 0, this.maxLabel = z, this.movementX = m.labels.align === "left" ? g : 0, O.labelWidth = W + g + f, O.labelHeight = W + z.height / 2;\n }\n setOptions() {\n let C = this.ranges, g = this.options, f = this.chart.series[g.seriesIndex], O = this.legend.baseline, m = { zIndex: g.zIndex, "stroke-width": g.borderWidth }, v = { zIndex: g.zIndex, "stroke-width": g.connectorWidth }, y = { align: this.legend.options.rtl || g.labels.align === "left" ? "right" : "left", zIndex: g.zIndex }, z = f.options.marker.fillOpacity, N = this.chart.styledMode;\n C.forEach(function(W, T) {\n N || (m.stroke = b(W.borderColor, g.borderColor, f.color), m.fill = b(W.color, g.color, z !== 1 ? l(f.color).setOpacity(z).get("rgba") : f.color), v.stroke = b(W.connectorColor, g.connectorColor, f.color)), C[T].radius = this.getRangeRadius(W.value), C[T] = h(C[T], { center: C[0].radius - C[T].radius + O }), N || h(!0, C[T], { bubbleAttribs: h(m), connectorAttribs: h(v), labelAttribs: y });\n }, this);\n }\n getRangeRadius(C) {\n let g = this.options, f = this.options.seriesIndex, O = this.chart.series[f], m = g.ranges[0].value, v = g.ranges[g.ranges.length - 1].value, y = g.minSize, z = g.maxSize;\n return O.getRadius.call(this, v, m, y, z, C);\n }\n render() {\n let C = this.legendItem || {}, g = this.chart.renderer, f = this.options.zThreshold;\n for (let O of (this.symbols || (this.symbols = { connectors: [], bubbleItems: [], labels: [] }), C.symbol = g.g("bubble-legend"), C.label = g.g("bubble-legend-item").css(this.legend.itemStyle || {}), C.symbol.translateX = 0, C.symbol.translateY = 0, C.symbol.add(C.label), C.label.add(C.group), this.ranges))\n O.value >= f && this.renderRange(O);\n this.hideOverlappingLabels();\n }\n renderRange(C) {\n let g = this.ranges[0], f = this.legend, O = this.options, m = O.labels, v = this.chart, y = v.series[O.seriesIndex], z = v.renderer, N = this.symbols, W = N.labels, T = C.center, x = Math.abs(C.radius), E = O.connectorDistance || 0, L = m.align, w = f.options.rtl, q = O.borderWidth, S = O.connectorWidth, B = g.radius || 0, I = T - x - q / 2 + S / 2, P = (I % 1 ? 1 : 0.5) - (S % 2 ? 0 : 0.5), k = z.styledMode, K = w || L === "left" ? -E : E;\n L === "center" && (K = 0, O.connectorDistance = 0, C.labelAttribs.align = "center"), N.bubbleItems.push(z.circle(B, T + P, x).attr(k ? {} : C.bubbleAttribs).addClass((k ? "highcharts-color-" + y.colorIndex + " " : "") + "highcharts-bubble-legend-symbol " + (O.className || "")).add(this.legendItem.symbol)), N.connectors.push(z.path(z.crispLine([["M", B, I], ["L", B + K, I]], O.connectorWidth)).attr(k ? {} : C.connectorAttribs).addClass((k ? "highcharts-color-" + this.options.seriesIndex + " " : "") + "highcharts-bubble-legend-connectors " + (O.connectorClassName || "")).add(this.legendItem.symbol));\n let $ = z.text(this.formatLabel(C)).attr(k ? {} : C.labelAttribs).css(k ? {} : m.style).addClass("highcharts-bubble-legend-labels " + (O.labels.className || "")).add(this.legendItem.symbol), j = { x: B + K + O.labels.x, y: I + O.labels.y + 0.4 * $.getBBox().height };\n $.attr(j), W.push($), $.placed = !0, $.alignAttr = j;\n }\n getMaxLabelSize() {\n let C, g;\n return this.symbols.labels.forEach(function(f) {\n g = f.getBBox(!0), C = C ? g.width > C.width ? g : C : g;\n }), C || {};\n }\n formatLabel(C) {\n let g = this.options, f = g.labels.formatter, O = g.labels.format, { numberFormatter: m } = this.chart;\n return O ? i.format(O, C) : f ? f.call(C) : m(C.value, 1);\n }\n hideOverlappingLabels() {\n let C = this.chart, g = this.options.labels.allowOverlap, f = this.symbols;\n !g && f && (C.hideOverlappingLabels(f.labels), f.labels.forEach(function(O, m) {\n O.newOpacity ? O.newOpacity !== O.oldOpacity && f.connectors[m].show() : f.connectors[m].hide();\n }));\n }\n getRanges() {\n let C = this.legend.bubbleLegend, g = C.chart.series, f = C.options.ranges, O, m, v = Number.MAX_VALUE, y = -Number.MAX_VALUE;\n return g.forEach(function(z) {\n z.isBubble && !z.ignoreSeries && (m = z.zData.filter(u)).length && (v = b(z.options.zMin, Math.min(v, Math.max(d(m), z.options.displayNegative === !1 ? z.options.zThreshold : -Number.MAX_VALUE))), y = b(z.options.zMax, Math.max(y, p(m))));\n }), O = v === y ? [{ value: y }] : [{ value: v }, { value: (v + y) / 2 }, { value: y, autoRanges: !0 }], f.length && f[0].radius && O.reverse(), O.forEach(function(z, N) {\n f && f[N] && (O[N] = h(f[N], z));\n }), O;\n }\n predictBubbleSizes() {\n let C = this.chart, g = C.legend.options, f = g.floating, O = g.layout === "horizontal", m = O ? C.legend.lastLineHeight : 0, v = C.plotSizeX, y = C.plotSizeY, z = C.series[this.options.seriesIndex], N = z.getPxExtremes(), W = Math.ceil(N.minPxSize), T = Math.ceil(N.maxPxSize), x = Math.min(y, v), E, L = z.options.maxSize;\n return f || !/%$/.test(L) ? E = T : (E = (x + m) * (L = parseFloat(L)) / 100 / (L / 100 + 1), (O && y - E >= v || !O && v - E >= y) && (E = T)), [W, Math.ceil(E)];\n }\n updateRanges(C, g) {\n let f = this.legend.options.bubbleLegend;\n f.minSize = C, f.maxSize = g, f.ranges = this.getRanges();\n }\n correctSizes() {\n let C = this.legend, g = this.chart.series[this.options.seriesIndex].getPxExtremes();\n Math.abs(Math.ceil(g.maxPxSize) - this.options.maxSize) > 1 && (this.updateRanges(this.options.minSize, g.maxPxSize), C.render());\n }\n };\n }), n(r, "Series/Bubble/BubbleLegendComposition.js", [r["Series/Bubble/BubbleLegendDefaults.js"], r["Series/Bubble/BubbleLegendItem.js"], r["Core/Defaults.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n let { setOptions: c } = a, { composed: p } = s, { addEvent: d, objectEach: u, pushUnique: h, wrap: b } = l;\n function M(v, y, z) {\n let N, W, T, x = this.legend, E = C(this) >= 0;\n x && x.options.enabled && x.bubbleLegend && x.options.bubbleLegend.autoRanges && E ? (N = x.bubbleLegend.options, W = x.bubbleLegend.predictBubbleSizes(), x.bubbleLegend.updateRanges(W[0], W[1]), N.placed || (x.group.placed = !1, x.allItems.forEach((L) => {\n (T = L.legendItem || {}).group && (T.group.translateY = void 0);\n })), x.render(), N.placed || (this.getMargins(), this.axes.forEach(function(L) {\n L.visible && L.render(), N.placed || (L.setScale(), L.updateNames(), u(L.ticks, function(w) {\n w.isNew = !0, w.isNewLabel = !0;\n }));\n }), this.getMargins()), N.placed = !0, v.call(this, y, z), x.bubbleLegend.correctSizes(), m(x, g(x))) : (v.call(this, y, z), x && x.options.enabled && x.bubbleLegend && (x.render(), m(x, g(x))));\n }\n function C(v) {\n let y = v.series, z = 0;\n for (; z < y.length; ) {\n if (y[z] && y[z].isBubble && y[z].visible && y[z].zData.length)\n return z;\n z++;\n }\n return -1;\n }\n function g(v) {\n let y = v.allItems, z = [], N = y.length, W, T, x, E = 0, L = 0;\n for (E = 0; E < N; E++)\n if (T = y[E].legendItem || {}, x = (y[E + 1] || {}).legendItem || {}, T.labelHeight && (y[E].itemHeight = T.labelHeight), y[E] === y[N - 1] || T.y !== x.y) {\n for (z.push({ height: 0 }), W = z[z.length - 1]; L <= E; L++)\n y[L].itemHeight > W.height && (W.height = y[L].itemHeight);\n W.step = E;\n }\n return z;\n }\n function f(v) {\n let y = this.bubbleLegend, z = this.options, N = z.bubbleLegend, W = C(this.chart);\n y && y.ranges && y.ranges.length && (N.ranges.length && (N.autoRanges = !!N.ranges[0].autoRanges), this.destroyItem(y)), W >= 0 && z.enabled && N.enabled && (N.seriesIndex = W, this.bubbleLegend = new i(N, this), this.bubbleLegend.addToLegend(v.allItems));\n }\n function O(v) {\n let y;\n if (v.defaultPrevented)\n return !1;\n let z = v.legendItem, N = this.chart, W = z.visible;\n this && this.bubbleLegend && (z.visible = !W, z.ignoreSeries = W, y = C(N) >= 0, this.bubbleLegend.visible !== y && (this.update({ bubbleLegend: { enabled: y } }), this.bubbleLegend.visible = y), z.visible = W);\n }\n function m(v, y) {\n let z = v.allItems, N = v.options.rtl, W, T, x, E, L = 0;\n z.forEach((w, q) => {\n (E = w.legendItem || {}).group && (W = E.group.translateX || 0, T = E.y || 0, ((x = w.movementX) || N && w.ranges) && (x = N ? W - w.options.maxSize / 2 : W + x, E.group.attr({ translateX: x })), q > y[L].step && L++, E.group.attr({ translateY: Math.round(T + y[L].height / 2) }), E.y = T + y[L].height / 2);\n });\n }\n return { compose: function(v, y) {\n h(p, "Series.BubbleLegend") && (c({ legend: { bubbleLegend: o } }), b(v.prototype, "drawChartBox", M), d(y, "afterGetAllItems", f), d(y, "itemClick", O));\n } };\n }), n(r, "Series/Bubble/BubblePoint.js", [r["Core/Series/Point.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { seriesTypes: { scatter: { prototype: { pointClass: s } } } } = i, { extend: l } = a;\n class c extends s {\n haloPath(d) {\n let u = (d && this.marker && this.marker.radius || 0) + d;\n if (this.series.chart.inverted) {\n let h = this.pos() || [0, 0], { xAxis: b, yAxis: M, chart: C } = this.series;\n return C.renderer.symbols.circle(b.len - h[1] - u, M.len - h[0] - u, 2 * u, 2 * u);\n }\n return o.prototype.haloPath.call(this, u);\n }\n }\n return l(c.prototype, { ttBelow: !1 }), c;\n }), n(r, "Series/Bubble/BubbleSeries.js", [r["Series/Bubble/BubbleLegendComposition.js"], r["Series/Bubble/BubblePoint.js"], r["Core/Color/Color.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c) {\n let { parse: p } = a, { composed: d, noop: u } = s, { series: h, seriesTypes: { column: { prototype: b }, scatter: M } } = l, { addEvent: C, arrayMax: g, arrayMin: f, clamp: O, extend: m, isNumber: v, merge: y, pick: z, pushUnique: N } = c;\n function W() {\n let x = this.len, { coll: E, isXAxis: L, min: w } = this, q = L ? "xData" : "yData", S = (this.max || 0) - (w || 0), B = 0, I = x, P = x / S, k;\n (E === "xAxis" || E === "yAxis") && (this.series.forEach((K) => {\n if (K.bubblePadding && K.reserveSpace()) {\n this.allowZoomOutside = !0, k = !0;\n let $ = K[q];\n if (L && ((K.onPoint || K).getRadii(0, 0, K), K.onPoint && (K.radii = K.onPoint.radii)), S > 0) {\n let j = $.length;\n for (; j--; )\n if (v($[j]) && this.dataMin <= $[j] && $[j] <= this.max) {\n let r1 = K.radii && K.radii[j] || 0;\n B = Math.min(($[j] - w) * P - r1, B), I = Math.max(($[j] - w) * P + r1, I);\n }\n }\n }\n }), k && S > 0 && !this.logarithmic && (I -= x, P *= (x + Math.max(0, B) - Math.min(I, x)) / x, [["min", "userMin", B], ["max", "userMax", I]].forEach((K) => {\n z(this.options[K[0]], this[K[1]]) === void 0 && (this[K[0]] += K[2] / P);\n })));\n }\n class T extends M {\n static compose(E, L, w) {\n o.compose(L, w), N(d, "Series.Bubble") && C(E, "foundExtremes", W);\n }\n animate(E) {\n !E && this.points.length < this.options.animationLimit && this.points.forEach(function(L) {\n let { graphic: w, plotX: q = 0, plotY: S = 0 } = L;\n w && w.width && (this.hasRendered || w.attr({ x: q, y: S, width: 1, height: 1 }), w.animate(this.markerAttribs(L), this.options.animation));\n }, this);\n }\n getRadii() {\n let E = this.zData, L = this.yData, w = [], q, S, B, I = this.chart.bubbleZExtremes, { minPxSize: P, maxPxSize: k } = this.getPxExtremes();\n if (!I) {\n let K, $ = Number.MAX_VALUE, j = -Number.MAX_VALUE;\n this.chart.series.forEach((r1) => {\n if (r1.bubblePadding && r1.reserveSpace()) {\n let a1 = (r1.onPoint || r1).getZExtremes();\n a1 && ($ = Math.min(z($, a1.zMin), a1.zMin), j = Math.max(z(j, a1.zMax), a1.zMax), K = !0);\n }\n }), K ? (I = { zMin: $, zMax: j }, this.chart.bubbleZExtremes = I) : I = { zMin: 0, zMax: 0 };\n }\n for (S = 0, q = E.length; S < q; S++)\n B = E[S], w.push(this.getRadius(I.zMin, I.zMax, P, k, B, L && L[S]));\n this.radii = w;\n }\n getRadius(E, L, w, q, S, B) {\n let I = this.options, P = I.sizeBy !== "width", k = I.zThreshold, K = L - E, $ = 0.5;\n if (B === null || S === null)\n return null;\n if (v(S)) {\n if (I.sizeByAbsoluteValue && (S = Math.abs(S - k), L = K = Math.max(L - k, Math.abs(E - k)), E = 0), S < E)\n return w / 2 - 1;\n K > 0 && ($ = (S - E) / K);\n }\n return P && $ >= 0 && ($ = Math.sqrt($)), Math.ceil(w + $ * (q - w)) / 2;\n }\n hasData() {\n return !!this.processedXData.length;\n }\n markerAttribs(E, L) {\n let w = super.markerAttribs(E, L), { height: q = 0, width: S = 0 } = w;\n return this.chart.inverted ? m(w, { x: (E.plotX || 0) - S / 2, y: (E.plotY || 0) - q / 2 }) : w;\n }\n pointAttribs(E, L) {\n let w = this.options.marker.fillOpacity, q = h.prototype.pointAttribs.call(this, E, L);\n return w !== 1 && (q.fill = p(q.fill).setOpacity(w).get("rgba")), q;\n }\n translate() {\n super.translate.call(this), this.getRadii(), this.translateBubble();\n }\n translateBubble() {\n let { data: E, options: L, radii: w } = this, { minPxSize: q } = this.getPxExtremes(), S = E.length;\n for (; S--; ) {\n let B = E[S], I = w ? w[S] : 0;\n this.zoneAxis === "z" && (B.negative = (B.z || 0) < (L.zThreshold || 0)), v(I) && I >= q / 2 ? (B.marker = m(B.marker, { radius: I, width: 2 * I, height: 2 * I }), B.dlBox = { x: B.plotX - I, y: B.plotY - I, width: 2 * I, height: 2 * I }) : (B.shapeArgs = B.plotY = B.dlBox = void 0, B.isInside = !1);\n }\n }\n getPxExtremes() {\n let E = Math.min(this.chart.plotWidth, this.chart.plotHeight), L = (S) => {\n let B;\n return typeof S == "string" && (B = /%$/.test(S), S = parseInt(S, 10)), B ? E * S / 100 : S;\n }, w = L(z(this.options.minSize, 8)), q = Math.max(L(z(this.options.maxSize, "20%")), w);\n return { minPxSize: w, maxPxSize: q };\n }\n getZExtremes() {\n let E = this.options, L = (this.zData || []).filter(v);\n if (L.length) {\n let w = z(E.zMin, O(f(L), E.displayNegative === !1 ? E.zThreshold || 0 : -Number.MAX_VALUE, Number.MAX_VALUE)), q = z(E.zMax, g(L));\n if (v(w) && v(q))\n return { zMin: w, zMax: q };\n }\n }\n }\n return T.defaultOptions = y(M.defaultOptions, { dataLabels: { formatter: function() {\n let { numberFormatter: x } = this.series.chart, { z: E } = this.point;\n return v(E) ? x(E, -1) : "";\n }, inside: !0, verticalAlign: "middle" }, animationLimit: 250, marker: { lineColor: null, lineWidth: 1, fillOpacity: 0.5, radius: null, states: { hover: { radiusPlus: 0 } }, symbol: "circle" }, minSize: 8, maxSize: "20%", softThreshold: !1, states: { hover: { halo: { size: 5 } } }, tooltip: { pointFormat: "({point.x}, {point.y}), Size: {point.z}" }, turboThreshold: 0, zThreshold: 0, zoneAxis: "z" }), m(T.prototype, { alignDataLabel: b.alignDataLabel, applyZones: u, bubblePadding: !0, isBubble: !0, pointArrayMap: ["y", "z"], pointClass: i, parallelArrays: ["x", "y", "z"], trackerGroups: ["group", "dataLabelsGroup"], specialGroup: "group", zoneAxis: "z" }), C(T, "updatedData", (x) => {\n delete x.target.chart.bubbleZExtremes;\n }), C(T, "remove", (x) => {\n delete x.target.chart.bubbleZExtremes;\n }), l.registerSeriesType("bubble", T), T;\n }), n(r, "Series/ColumnRange/ColumnRangePoint.js", [r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i) {\n let { seriesTypes: { column: { prototype: { pointClass: { prototype: a } } }, arearange: { prototype: { pointClass: s } } } } = o, { extend: l, isNumber: c } = i;\n class p extends s {\n isValid() {\n return c(this.low);\n }\n }\n return l(p.prototype, { setState: a.setState }), p;\n }), n(r, "Series/ColumnRange/ColumnRangeSeries.js", [r["Series/ColumnRange/ColumnRangePoint.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { noop: l } = i, { seriesTypes: { arearange: c, column: p, column: { prototype: d } } } = a, { addEvent: u, clamp: h, extend: b, isNumber: M, merge: C, pick: g } = s;\n class f extends c {\n setOptions() {\n return C(!0, arguments[0], { stacking: void 0 }), c.prototype.setOptions.apply(this, arguments);\n }\n translate() {\n return d.translate.apply(this);\n }\n pointAttribs() {\n return d.pointAttribs.apply(this, arguments);\n }\n translate3dPoints() {\n return d.translate3dPoints.apply(this, arguments);\n }\n translate3dShapes() {\n return d.translate3dShapes.apply(this, arguments);\n }\n afterColumnTranslate() {\n let m, v, y, z, N = this.yAxis, W = this.xAxis, T = W.startAngleRad, x = this.chart, E = this.xAxis.isRadial, L = Math.max(x.chartWidth, x.chartHeight) + 999;\n this.points.forEach((w) => {\n let q = w.shapeArgs || {}, S = this.options.minPointLength, B = w.plotY, I = N.translate(w.high, 0, 1, 0, 1);\n if (M(I) && M(B))\n if (w.plotHigh = h(I, -L, L), w.plotLow = h(B, -L, L), z = w.plotHigh, Math.abs(m = g(w.rectPlotY, w.plotY) - w.plotHigh) < S ? (v = S - m, m += v, z -= v / 2) : m < 0 && (m *= -1, z -= m), E && this.polar)\n y = w.barX + T, w.shapeType = "arc", w.shapeArgs = this.polar.arc(z + m, z, y, y + w.pointWidth);\n else {\n q.height = m, q.y = z;\n let { x: P = 0, width: k = 0 } = q;\n w.shapeArgs = C(w.shapeArgs, this.crispCol(P, z, k, m)), w.tooltipPos = x.inverted ? [N.len + N.pos - x.plotLeft - z - m / 2, W.len + W.pos - x.plotTop - P - k / 2, m] : [W.left - x.plotLeft + P + k / 2, N.pos - x.plotTop + z + m / 2, m];\n }\n });\n }\n }\n return f.defaultOptions = C(p.defaultOptions, c.defaultOptions, { borderRadius: { where: "all" }, pointRange: null, legendSymbol: "rectangle", marker: null, states: { hover: { halo: !1 } } }), u(f, "afterColumnTranslate", function() {\n f.prototype.afterColumnTranslate.apply(this);\n }, { order: 5 }), b(f.prototype, { directTouch: !0, pointClass: o, trackerGroups: ["group", "dataLabelsGroup"], adjustForMissingColumns: d.adjustForMissingColumns, animate: d.animate, crispCol: d.crispCol, drawGraph: l, drawPoints: d.drawPoints, getSymbol: l, drawTracker: d.drawTracker, getColumnMetrics: d.getColumnMetrics }), a.registerSeriesType("columnrange", f), f;\n }), n(r, "Series/ColumnPyramid/ColumnPyramidSeriesDefaults.js", [], function() {\n return {};\n }), n(r, "Series/ColumnPyramid/ColumnPyramidSeries.js", [r["Series/ColumnPyramid/ColumnPyramidSeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { column: s } = i.seriesTypes, { clamp: l, merge: c, pick: p } = a;\n class d extends s {\n translate() {\n let h = this.chart, b = this.options, M = this.dense = this.closestPointRange * this.xAxis.transA < 2, C = this.borderWidth = p(b.borderWidth, M ? 0 : 1), g = this.yAxis, f = b.threshold, O = p(b.minPointLength, 5), m = this.getColumnMetrics(), v = m.width, y = this.pointXOffset = m.offset, z = this.translatedThreshold = g.getThreshold(f), N = this.barW = Math.max(v, 1 + 2 * C);\n for (let W of (h.inverted && (z -= 0.5), b.pointPadding && (N = Math.ceil(N)), super.translate(), this.points)) {\n let T = p(W.yBottom, z), x = 999 + Math.abs(T), E = l(W.plotY, -x, g.len + x), L = N / 2, w = Math.min(E, T), q = Math.max(E, T) - w, S = W.plotX + y, B, I, P, k, K, $, j, r1, a1, _, Y;\n b.centerInCategory && (S = this.adjustForMissingColumns(S, v, W, m)), W.barX = S, W.pointWidth = v, W.tooltipPos = h.inverted ? [g.len + g.pos - h.plotLeft - E, this.xAxis.len - S - L, q] : [S + L, E + g.pos - h.plotTop, q], B = f + (W.total || W.y), b.stacking === "percent" && (B = f + (W.y < 0) ? -100 : 100);\n let D = g.toPixels(B, !0);\n P = (I = h.plotHeight - D - (h.plotHeight - z)) ? L * (w - D) / I : 0, k = I ? L * (w + q - D) / I : 0, $ = S - P + L, j = S + P + L, r1 = S + k + L, a1 = S - k + L, _ = w - O, Y = w + q, W.y < 0 && (_ = w, Y = w + q + O), h.inverted && (K = g.width - w, I = D - (g.width - z), P = L * (D - K) / I, k = L * (D - (K - q)) / I, j = ($ = S + L + P) - 2 * P, r1 = S - k + L, a1 = S + k + L, _ = w, Y = w + q - O, W.y < 0 && (Y = w + q + O)), W.shapeType = "path", W.shapeArgs = { x: $, y: _, width: j - $, height: q, d: [["M", $, _], ["L", j, _], ["L", r1, Y], ["L", a1, Y], ["Z"]] };\n }\n }\n }\n return d.defaultOptions = c(s.defaultOptions, o), i.registerSeriesType("columnpyramid", d), d;\n }), n(r, "Series/ErrorBar/ErrorBarSeriesDefaults.js", [], function() {\n return { color: "#000000", grouping: !1, linkedTo: ":previous", tooltip: { pointFormat: \' {series.name}: {point.low} - {point.high}
\' }, whiskerWidth: null };\n }), n(r, "Series/ErrorBar/ErrorBarSeries.js", [r["Series/BoxPlot/BoxPlotSeries.js"], r["Series/Column/ColumnSeries.js"], r["Series/ErrorBar/ErrorBarSeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s, l) {\n let { arearange: c } = s.seriesTypes, { addEvent: p, merge: d, extend: u } = l;\n class h extends o {\n getColumnMetrics() {\n return this.linkedParent && this.linkedParent.columnMetrics || i.prototype.getColumnMetrics.call(this);\n }\n drawDataLabels() {\n let M = this.pointValKey;\n if (c)\n for (let C of (c.prototype.drawDataLabels.call(this), this.points))\n C.y = C[M];\n }\n toYData(M) {\n return [M.low, M.high];\n }\n }\n return h.defaultOptions = d(o.defaultOptions, a), p(h, "afterTranslate", function() {\n for (let b of this.points)\n b.plotLow = b.plotY;\n }, { order: 0 }), u(h.prototype, { pointArrayMap: ["low", "high"], pointValKey: "high", doQuartiles: !1 }), s.registerSeriesType("errorbar", h), h;\n }), n(r, "Series/Gauge/GaugePoint.js", [r["Core/Series/SeriesRegistry.js"]], function(o) {\n let { series: { prototype: { pointClass: i } } } = o;\n return class extends i {\n setState(a) {\n this.state = a;\n }\n };\n }), n(r, "Series/Gauge/GaugeSeries.js", [r["Series/Gauge/GaugePoint.js"], r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { noop: l } = i, { series: c, seriesTypes: { column: p } } = a, { clamp: d, isNumber: u, extend: h, merge: b, pick: M, pInt: C, defined: g } = s;\n class f extends c {\n translate() {\n let m = this.yAxis, v = this.options, y = m.center;\n this.generatePoints(), this.points.forEach((z) => {\n let N = b(v.dial, z.dial), W = C(N.radius) * y[2] / 200, T = C(N.baseLength) * W / 100, x = C(N.rearLength) * W / 100, E = N.baseWidth, L = N.topWidth, w = v.overshoot, q = m.startAngleRad + m.translate(z.y, void 0, void 0, void 0, !0);\n (u(w) || v.wrap === !1) && (w = u(w) ? w / 180 * Math.PI : 0, q = d(q, m.startAngleRad - w, m.endAngleRad + w)), q = 180 * q / Math.PI, z.shapeType = "path";\n let S = N.path || [["M", -x, -E / 2], ["L", T, -E / 2], ["L", W, -L / 2], ["L", W, L / 2], ["L", T, E / 2], ["L", -x, E / 2], ["Z"]];\n z.shapeArgs = { d: S, translateX: y[0], translateY: y[1], rotation: q }, z.plotX = y[0], z.plotY = y[1], g(z.y) && m.max - m.min && (z.percentage = (z.y - m.min) / (m.max - m.min) * 100);\n });\n }\n drawPoints() {\n let m = this, v = m.chart, y = m.yAxis.center, z = m.pivot, N = m.options, W = N.pivot, T = v.renderer;\n m.points.forEach((x) => {\n let E = x.graphic, L = x.shapeArgs, w = L.d, q = b(N.dial, x.dial);\n E ? (E.animate(L), L.d = w) : x.graphic = T[x.shapeType](L).addClass("highcharts-dial").add(m.group), v.styledMode || x.graphic[E ? "animate" : "attr"]({ stroke: q.borderColor, "stroke-width": q.borderWidth, fill: q.backgroundColor });\n }), z ? z.animate({ translateX: y[0], translateY: y[1] }) : W && (m.pivot = T.circle(0, 0, W.radius).attr({ zIndex: 2 }).addClass("highcharts-pivot").translate(y[0], y[1]).add(m.group), v.styledMode || m.pivot.attr({ fill: W.backgroundColor, stroke: W.borderColor, "stroke-width": W.borderWidth }));\n }\n animate(m) {\n let v = this;\n m || v.points.forEach((y) => {\n let z = y.graphic;\n z && (z.attr({ rotation: 180 * v.yAxis.startAngleRad / Math.PI }), z.animate({ rotation: y.shapeArgs.rotation }, v.options.animation));\n });\n }\n render() {\n this.group = this.plotGroup("group", "series", this.visible ? "inherit" : "hidden", this.options.zIndex, this.chart.seriesGroup), c.prototype.render.call(this), this.group.clip(this.chart.clipRect);\n }\n setData(m, v) {\n c.prototype.setData.call(this, m, !1), this.processData(), this.generatePoints(), M(v, !0) && this.chart.redraw();\n }\n hasData() {\n return !!this.points.length;\n }\n }\n return f.defaultOptions = b(c.defaultOptions, { dataLabels: { borderColor: "#cccccc", borderRadius: 3, borderWidth: 1, crop: !1, defer: !1, enabled: !0, verticalAlign: "top", y: 15, zIndex: 2 }, dial: { backgroundColor: "#000000", baseLength: "70%", baseWidth: 3, borderColor: "#cccccc", borderWidth: 0, radius: "80%", rearLength: "10%", topWidth: 1 }, pivot: { radius: 5, borderWidth: 0, borderColor: "#cccccc", backgroundColor: "#000000" }, tooltip: { headerFormat: "" }, showInLegend: !1 }), h(f.prototype, { angular: !0, directTouch: !0, drawGraph: l, drawTracker: p.prototype.drawTracker, fixedBox: !0, forceDL: !0, noSharedTooltip: !0, pointClass: o, trackerGroups: ["group", "dataLabelsGroup"] }), a.registerSeriesType("gauge", f), f;\n }), n(r, "Series/DragNodesComposition.js", [r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i) {\n let { composed: a } = o, { addEvent: s, pushUnique: l } = i;\n function c() {\n let p, d, u, h = this;\n h.container && (p = s(h.container, "mousedown", (b) => {\n let M = h.hoverPoint;\n M && M.series && M.series.hasDraggableNodes && M.series.options.draggable && (M.series.onMouseDown(M, b), d = s(h.container, "mousemove", (C) => M && M.series && M.series.onMouseMove(M, C)), u = s(h.container.ownerDocument, "mouseup", (C) => (d(), u(), M && M.series && M.series.onMouseUp(M, C))));\n })), s(h, "destroy", function() {\n p();\n });\n }\n return { compose: function(p) {\n l(a, "DragNodes") && s(p, "load", c);\n }, onMouseDown: function(p, d) {\n var h;\n let u = ((h = this.chart.pointer) == null ? void 0 : h.normalize(d)) || d;\n p.fixedPosition = { chartX: u.chartX, chartY: u.chartY, plotX: p.plotX, plotY: p.plotY }, p.inDragMode = !0;\n }, onMouseMove: function(p, d) {\n var u;\n if (p.fixedPosition && p.inDragMode) {\n let h, b, M = this.chart, C = ((u = M.pointer) == null ? void 0 : u.normalize(d)) || d, g = p.fixedPosition.chartX - C.chartX, f = p.fixedPosition.chartY - C.chartY, O = M.graphLayoutsLookup;\n (Math.abs(g) > 5 || Math.abs(f) > 5) && (h = p.fixedPosition.plotX - g, b = p.fixedPosition.plotY - f, M.isInsidePlot(h, b) && (p.plotX = h, p.plotY = b, p.hasDragged = !0, this.redrawHalo(p), O.forEach((m) => {\n m.restartSimulation();\n })));\n }\n }, onMouseUp: function(p) {\n p.fixedPosition && (p.hasDragged && (this.layout.enableSimulation ? this.layout.start() : this.chart.redraw()), p.inDragMode = p.hasDragged = !1, this.options.fixedDraggable || delete p.fixedPosition);\n }, redrawHalo: function(p) {\n p && this.halo && this.halo.attr({ d: p.haloPath(this.options.states.hover.halo.size) });\n } };\n }), n(r, "Series/GraphLayoutComposition.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { setAnimation: s } = o, { composed: l } = i, { addEvent: c, pushUnique: p } = a;\n function d() {\n this.graphLayoutsLookup && (this.graphLayoutsLookup.forEach((M) => {\n M.updateSimulation();\n }), this.redraw());\n }\n function u() {\n this.graphLayoutsLookup && (this.graphLayoutsLookup.forEach((M) => {\n M.updateSimulation(!1);\n }), this.redraw());\n }\n function h() {\n this.graphLayoutsLookup && this.graphLayoutsLookup.forEach((M) => {\n M.stop();\n });\n }\n function b() {\n let M, C = !1, g = (f) => {\n f.maxIterations-- && isFinite(f.temperature) && !f.isStable() && !f.enableSimulation && (f.beforeStep && f.beforeStep(), f.step(), M = !1, C = !0);\n };\n if (this.graphLayoutsLookup) {\n for (s(!1, this), this.graphLayoutsLookup.forEach((f) => f.start()); !M; )\n M = !0, this.graphLayoutsLookup.forEach(g);\n C && this.series.forEach((f) => {\n f && f.layout && f.render();\n });\n }\n }\n return { compose: function(M) {\n p(l, "GraphLayout") && (c(M, "afterPrint", d), c(M, "beforePrint", u), c(M, "predraw", h), c(M, "render", b));\n }, integrations: {}, layouts: {} };\n }), n(r, "Series/PackedBubble/PackedBubblePoint.js", [r["Core/Chart/Chart.js"], r["Core/Series/Point.js"], r["Core/Series/SeriesRegistry.js"]], function(o, i, a) {\n let { seriesTypes: { bubble: { prototype: { pointClass: s } } } } = a;\n return class extends s {\n destroy() {\n var l;\n return (l = this.series) != null && l.layout && this.series.layout.removeElementFromCollection(this, this.series.layout.nodes), i.prototype.destroy.apply(this, arguments);\n }\n firePointEvent() {\n let l = this.series.options;\n if (this.isParentNode && l.parentNode) {\n let c = l.allowPointSelect;\n l.allowPointSelect = l.parentNode.allowPointSelect, i.prototype.firePointEvent.apply(this, arguments), l.allowPointSelect = c;\n } else\n i.prototype.firePointEvent.apply(this, arguments);\n }\n select() {\n let l = this.series.chart;\n this.isParentNode ? (l.getSelectedPoints = l.getSelectedParentNodes, i.prototype.select.apply(this, arguments), l.getSelectedPoints = o.prototype.getSelectedPoints) : i.prototype.select.apply(this, arguments);\n }\n };\n }), n(r, "Series/PackedBubble/PackedBubbleSeriesDefaults.js", [r["Core/Utilities.js"]], function(o) {\n let { isNumber: i } = o;\n return { minSize: "10%", maxSize: "50%", sizeBy: "area", zoneAxis: "y", crisp: !1, tooltip: { pointFormat: "Value: {point.value}" }, draggable: !0, useSimulation: !0, parentNode: { allowPointSelect: !1 }, dataLabels: { formatter: function() {\n let { numberFormatter: a } = this.series.chart, { value: s } = this.point;\n return i(s) ? a(s, -1) : "";\n }, parentNodeFormatter: function() {\n return this.name;\n }, parentNodeTextPath: { enabled: !0 }, padding: 0, style: { transition: "opacity 2000ms" } }, layoutAlgorithm: { initialPositions: "circle", initialPositionRadius: 20, bubblePadding: 5, parentNodeLimit: !1, seriesInteraction: !0, dragBetweenSeries: !1, parentNodeOptions: { maxIterations: 400, gravitationalConstant: 0.03, maxSpeed: 50, initialPositionRadius: 100, seriesInteraction: !0, marker: { fillColor: null, fillOpacity: 1, lineWidth: null, lineColor: null, symbol: "circle" } }, enableSimulation: !0, type: "packedbubble", integration: "packedbubble", maxIterations: 1e3, splitSeries: !1, maxSpeed: 5, gravitationalConstant: 0.01, friction: -0.981 } };\n }), n(r, "Series/Networkgraph/VerletIntegration.js", [], function() {\n return { attractive: function(o, i, a) {\n let s = o.getMass(), l = -a.x * i * this.diffTemperature, c = -a.y * i * this.diffTemperature;\n o.fromNode.fixedPosition || (o.fromNode.plotX -= l * s.fromNode / o.fromNode.degree, o.fromNode.plotY -= c * s.fromNode / o.fromNode.degree), o.toNode.fixedPosition || (o.toNode.plotX += l * s.toNode / o.toNode.degree, o.toNode.plotY += c * s.toNode / o.toNode.degree);\n }, attractiveForceFunction: function(o, i) {\n return (i - o) / o;\n }, barycenter: function() {\n let o = this.options.gravitationalConstant || 0, i = (this.barycenter.xFactor - (this.box.left + this.box.width) / 2) * o, a = (this.barycenter.yFactor - (this.box.top + this.box.height) / 2) * o;\n this.nodes.forEach(function(s) {\n s.fixedPosition || (s.plotX -= i / s.mass / s.degree, s.plotY -= a / s.mass / s.degree);\n });\n }, getK: function(o) {\n return Math.pow(o.box.width * o.box.height / o.nodes.length, 0.5);\n }, integrate: function(o, i) {\n let a = -o.options.friction, s = o.options.maxSpeed, l = i.prevX, c = i.prevY, p = (i.plotX + i.dispX - l) * a, d = (i.plotY + i.dispY - c) * a, u = Math.abs, h = u(p) / (p || 1), b = u(d) / (d || 1), M = h * Math.min(s, Math.abs(p)), C = b * Math.min(s, Math.abs(d));\n i.prevX = i.plotX + i.dispX, i.prevY = i.plotY + i.dispY, i.plotX += M, i.plotY += C, i.temperature = o.vectorLength({ x: M, y: C });\n }, repulsive: function(o, i, a) {\n let s = i * this.diffTemperature / o.mass / o.degree;\n o.fixedPosition || (o.plotX += a.x * s, o.plotY += a.y * s);\n }, repulsiveForceFunction: function(o, i) {\n return (i - o) / o * (i > o ? 1 : 0);\n } };\n }), n(r, "Series/PackedBubble/PackedBubbleIntegration.js", [r["Core/Globals.js"], r["Series/Networkgraph/VerletIntegration.js"]], function(o, i) {\n let { noop: a } = o;\n return { barycenter: function() {\n let s, l, c = this.options.gravitationalConstant, p = this.box, d = this.nodes;\n for (let u of d)\n this.options.splitSeries && !u.isParentNode ? (s = u.series.parentNode.plotX, l = u.series.parentNode.plotY) : (s = p.width / 2, l = p.height / 2), u.fixedPosition || (u.plotX -= (u.plotX - s) * c / (u.mass * Math.sqrt(d.length)), u.plotY -= (u.plotY - l) * c / (u.mass * Math.sqrt(d.length)));\n }, getK: a, integrate: i.integrate, repulsive: function(s, l, c, p) {\n let d = l * this.diffTemperature / s.mass / s.degree, u = c.x * d, h = c.y * d;\n s.fixedPosition || (s.plotX += u, s.plotY += h), p.fixedPosition || (p.plotX -= u, p.plotY -= h);\n }, repulsiveForceFunction: function(s, l, c, p) {\n return Math.min(s, (c.marker.radius + p.marker.radius) / 2);\n } };\n }), n(r, "Series/Networkgraph/EulerIntegration.js", [], function() {\n return { attractive: function(o, i, a, s) {\n let l = o.getMass(), c = a.x / s * i, p = a.y / s * i;\n o.fromNode.fixedPosition || (o.fromNode.dispX -= c * l.fromNode / o.fromNode.degree, o.fromNode.dispY -= p * l.fromNode / o.fromNode.degree), o.toNode.fixedPosition || (o.toNode.dispX += c * l.toNode / o.toNode.degree, o.toNode.dispY += p * l.toNode / o.toNode.degree);\n }, attractiveForceFunction: function(o, i) {\n return o * o / i;\n }, barycenter: function() {\n let o = this.options.gravitationalConstant, i = this.barycenter.xFactor, a = this.barycenter.yFactor;\n this.nodes.forEach(function(s) {\n if (!s.fixedPosition) {\n let l = s.getDegree(), c = l * (1 + l / 2);\n s.dispX += (i - s.plotX) * o * c / s.degree, s.dispY += (a - s.plotY) * o * c / s.degree;\n }\n });\n }, getK: function(o) {\n return Math.pow(o.box.width * o.box.height / o.nodes.length, 0.3);\n }, integrate: function(o, i) {\n i.dispX += i.dispX * o.options.friction, i.dispY += i.dispY * o.options.friction;\n let a = i.temperature = o.vectorLength({ x: i.dispX, y: i.dispY });\n a !== 0 && (i.plotX += i.dispX / a * Math.min(Math.abs(i.dispX), o.temperature), i.plotY += i.dispY / a * Math.min(Math.abs(i.dispY), o.temperature));\n }, repulsive: function(o, i, a, s) {\n o.dispX += a.x / s * i / o.degree, o.dispY += a.y / s * i / o.degree;\n }, repulsiveForceFunction: function(o, i) {\n return i * i / o;\n } };\n }), n(r, "Series/Networkgraph/QuadTreeNode.js", [], function() {\n class o {\n constructor(a) {\n this.body = !1, this.isEmpty = !1, this.isInternal = !1, this.nodes = [], this.box = a, this.boxSize = Math.min(a.width, a.height);\n }\n divideBox() {\n let a = this.box.width / 2, s = this.box.height / 2;\n this.nodes[0] = new o({ left: this.box.left, top: this.box.top, width: a, height: s }), this.nodes[1] = new o({ left: this.box.left + a, top: this.box.top, width: a, height: s }), this.nodes[2] = new o({ left: this.box.left + a, top: this.box.top + s, width: a, height: s }), this.nodes[3] = new o({ left: this.box.left, top: this.box.top + s, width: a, height: s });\n }\n getBoxPosition(a) {\n let s = a.plotX < this.box.left + this.box.width / 2, l = a.plotY < this.box.top + this.box.height / 2;\n return s ? l ? 0 : 3 : l ? 1 : 2;\n }\n insert(a, s) {\n let l;\n this.isInternal ? this.nodes[this.getBoxPosition(a)].insert(a, s - 1) : (this.isEmpty = !1, this.body ? s ? (this.isInternal = !0, this.divideBox(), this.body !== !0 && (this.nodes[this.getBoxPosition(this.body)].insert(this.body, s - 1), this.body = !0), this.nodes[this.getBoxPosition(a)].insert(a, s - 1)) : ((l = new o({ top: a.plotX || NaN, left: a.plotY || NaN, width: 0.1, height: 0.1 })).body = a, l.isInternal = !1, this.nodes.push(l)) : (this.isInternal = !1, this.body = a));\n }\n updateMassAndCenter() {\n let a = 0, s = 0, l = 0;\n if (this.isInternal) {\n for (let c of this.nodes)\n c.isEmpty || (a += c.mass, s += c.plotX * c.mass, l += c.plotY * c.mass);\n s /= a, l /= a;\n } else\n this.body && (a = this.body.mass, s = this.body.plotX, l = this.body.plotY);\n this.mass = a, this.plotX = s, this.plotY = l;\n }\n }\n return o;\n }), n(r, "Series/Networkgraph/QuadTree.js", [r["Series/Networkgraph/QuadTreeNode.js"]], function(o) {\n return class {\n constructor(i, a, s, l) {\n this.box = { left: i, top: a, width: s, height: l }, this.maxDepth = 25, this.root = new o(this.box), this.root.isInternal = !0, this.root.isRoot = !0, this.root.divideBox();\n }\n calculateMassAndCenter() {\n this.visitNodeRecursive(null, null, function(i) {\n i.updateMassAndCenter();\n });\n }\n insertNodes(i) {\n for (let a of i)\n this.root.insert(a, this.maxDepth);\n }\n visitNodeRecursive(i, a, s) {\n let l;\n if (i || (i = this.root), i === this.root && a && (l = a(i)), l !== !1) {\n for (let c of i.nodes) {\n if (c.isInternal) {\n if (a && (l = a(c)), l === !1)\n continue;\n this.visitNodeRecursive(c, a, s);\n } else\n c.body && a && a(c.body);\n s && s(c);\n }\n i === this.root && s && s(i);\n }\n }\n };\n }), n(r, "Series/Networkgraph/ReingoldFruchtermanLayout.js", [r["Series/Networkgraph/EulerIntegration.js"], r["Core/Globals.js"], r["Series/GraphLayoutComposition.js"], r["Series/Networkgraph/QuadTree.js"], r["Core/Utilities.js"], r["Series/Networkgraph/VerletIntegration.js"]], function(o, i, a, s, l, c) {\n let { win: p } = i, { clamp: d, defined: u, isFunction: h, fireEvent: b, pick: M } = l;\n class C {\n constructor() {\n this.box = {}, this.currentStep = 0, this.initialRendering = !0, this.links = [], this.nodes = [], this.series = [], this.simulation = !1;\n }\n static compose(f) {\n a.compose(f), a.integrations.euler = o, a.integrations.verlet = c, a.layouts["reingold-fruchterman"] = C;\n }\n init(f) {\n this.options = f, this.nodes = [], this.links = [], this.series = [], this.box = { x: 0, y: 0, width: 0, height: 0 }, this.setInitialRendering(!0), this.integration = a.integrations[f.integration], this.enableSimulation = f.enableSimulation, this.attractiveForce = M(f.attractiveForce, this.integration.attractiveForceFunction), this.repulsiveForce = M(f.repulsiveForce, this.integration.repulsiveForceFunction), this.approximation = f.approximation;\n }\n updateSimulation(f) {\n this.enableSimulation = M(f, this.options.enableSimulation);\n }\n start() {\n let f = this.series, O = this.options;\n this.currentStep = 0, this.forces = f[0] && f[0].forces || [], this.chart = f[0] && f[0].chart, this.initialRendering && (this.initPositions(), f.forEach(function(m) {\n m.finishedAnimating = !0, m.render();\n })), this.setK(), this.resetSimulation(O), this.enableSimulation && this.step();\n }\n step() {\n let f = this.series;\n for (let O of (this.currentStep++, this.approximation === "barnes-hut" && (this.createQuadTree(), this.quadTree.calculateMassAndCenter()), this.forces || []))\n this[O + "Forces"](this.temperature);\n if (this.applyLimits(), this.temperature = this.coolDown(this.startTemperature, this.diffTemperature, this.currentStep), this.prevSystemTemperature = this.systemTemperature, this.systemTemperature = this.getSystemTemperature(), this.enableSimulation) {\n for (let O of f)\n O.chart && O.render();\n this.maxIterations-- && isFinite(this.temperature) && !this.isStable() ? (this.simulation && p.cancelAnimationFrame(this.simulation), this.simulation = p.requestAnimationFrame(() => this.step())) : (this.simulation = !1, this.series.forEach((O) => {\n b(O, "afterSimulation");\n }));\n }\n }\n stop() {\n this.simulation && p.cancelAnimationFrame(this.simulation);\n }\n setArea(f, O, m, v) {\n this.box = { left: f, top: O, width: m, height: v };\n }\n setK() {\n this.k = this.options.linkLength || this.integration.getK(this);\n }\n addElementsToCollection(f, O) {\n for (let m of f)\n O.indexOf(m) === -1 && O.push(m);\n }\n removeElementFromCollection(f, O) {\n let m = O.indexOf(f);\n m !== -1 && O.splice(m, 1);\n }\n clear() {\n this.nodes.length = 0, this.links.length = 0, this.series.length = 0, this.resetSimulation();\n }\n resetSimulation() {\n this.forcedStop = !1, this.systemTemperature = 0, this.setMaxIterations(), this.setTemperature(), this.setDiffTemperature();\n }\n restartSimulation() {\n this.simulation ? this.resetSimulation() : (this.setInitialRendering(!1), this.enableSimulation ? this.start() : this.setMaxIterations(1), this.chart && this.chart.redraw(), this.setInitialRendering(!0));\n }\n setMaxIterations(f) {\n this.maxIterations = M(f, this.options.maxIterations);\n }\n setTemperature() {\n this.temperature = this.startTemperature = Math.sqrt(this.nodes.length);\n }\n setDiffTemperature() {\n this.diffTemperature = this.startTemperature / (this.options.maxIterations + 1);\n }\n setInitialRendering(f) {\n this.initialRendering = f;\n }\n createQuadTree() {\n this.quadTree = new s(this.box.left, this.box.top, this.box.width, this.box.height), this.quadTree.insertNodes(this.nodes);\n }\n initPositions() {\n let f = this.options.initialPositions;\n if (h(f))\n for (let O of (f.call(this), this.nodes))\n u(O.prevX) || (O.prevX = O.plotX), u(O.prevY) || (O.prevY = O.plotY), O.dispX = 0, O.dispY = 0;\n else\n f === "circle" ? this.setCircularPositions() : this.setRandomPositions();\n }\n setCircularPositions() {\n let f, O = this.box, m = this.nodes, v = 2 * Math.PI / (m.length + 1), y = m.filter(function(x) {\n return x.linksTo.length === 0;\n }), z = {}, N = this.options.initialPositionRadius, W = (x) => {\n for (let E of x.linksFrom || [])\n z[E.toNode.id] || (z[E.toNode.id] = !0, T.push(E.toNode), W(E.toNode));\n }, T = [];\n for (let x of y)\n T.push(x), W(x);\n if (T.length)\n for (let x of m)\n T.indexOf(x) === -1 && T.push(x);\n else\n T = m;\n for (let x = 0, E = T.length; x < E; ++x)\n (f = T[x]).plotX = f.prevX = M(f.plotX, O.width / 2 + N * Math.cos(x * v)), f.plotY = f.prevY = M(f.plotY, O.height / 2 + N * Math.sin(x * v)), f.dispX = 0, f.dispY = 0;\n }\n setRandomPositions() {\n let f, O = this.box, m = this.nodes, v = m.length + 1, y = (z) => {\n let N = z * z / Math.PI;\n return N - Math.floor(N);\n };\n for (let z = 0, N = m.length; z < N; ++z)\n (f = m[z]).plotX = f.prevX = M(f.plotX, O.width * y(z)), f.plotY = f.prevY = M(f.plotY, O.height * y(v + z)), f.dispX = 0, f.dispY = 0;\n }\n force(f, ...O) {\n this.integration[f].apply(this, O);\n }\n barycenterForces() {\n this.getBarycenter(), this.force("barycenter");\n }\n getBarycenter() {\n let f = 0, O = 0, m = 0;\n for (let v of this.nodes)\n O += v.plotX * v.mass, m += v.plotY * v.mass, f += v.mass;\n return this.barycenter = { x: O, y: m, xFactor: O / f, yFactor: m / f }, this.barycenter;\n }\n barnesHutApproximation(f, O) {\n let m, v, y = this.getDistXY(f, O), z = this.vectorLength(y);\n return f !== O && z !== 0 && (O.isInternal ? O.boxSize / z < this.options.theta && z !== 0 ? (v = this.repulsiveForce(z, this.k), this.force("repulsive", f, v * O.mass, y, z), m = !1) : m = !0 : (v = this.repulsiveForce(z, this.k), this.force("repulsive", f, v * O.mass, y, z))), m;\n }\n repulsiveForces() {\n if (this.approximation === "barnes-hut")\n for (let f of this.nodes)\n this.quadTree.visitNodeRecursive(null, (O) => this.barnesHutApproximation(f, O));\n else {\n let f, O, m;\n for (let v of this.nodes)\n for (let y of this.nodes)\n v === y || v.fixedPosition || (m = this.getDistXY(v, y), (O = this.vectorLength(m)) !== 0 && (f = this.repulsiveForce(O, this.k), this.force("repulsive", v, f * y.mass, m, O)));\n }\n }\n attractiveForces() {\n let f, O, m;\n for (let v of this.links)\n v.fromNode && v.toNode && (f = this.getDistXY(v.fromNode, v.toNode), (O = this.vectorLength(f)) !== 0 && (m = this.attractiveForce(O, this.k), this.force("attractive", v, m, f, O)));\n }\n applyLimits() {\n for (let f of this.nodes)\n f.fixedPosition || (this.integration.integrate(this, f), this.applyLimitBox(f, this.box), f.dispX = 0, f.dispY = 0);\n }\n applyLimitBox(f, O) {\n let m = f.radius;\n f.plotX = d(f.plotX, O.left + m, O.width - m), f.plotY = d(f.plotY, O.top + m, O.height - m);\n }\n coolDown(f, O, m) {\n return f - O * m;\n }\n isStable() {\n return 1e-5 > Math.abs(this.systemTemperature - this.prevSystemTemperature) || this.temperature <= 0;\n }\n getSystemTemperature() {\n let f = 0;\n for (let O of this.nodes)\n f += O.temperature;\n return f;\n }\n vectorLength(f) {\n return Math.sqrt(f.x * f.x + f.y * f.y);\n }\n getDistR(f, O) {\n let m = this.getDistXY(f, O);\n return this.vectorLength(m);\n }\n getDistXY(f, O) {\n let m = f.plotX - O.plotX, v = f.plotY - O.plotY;\n return { x: m, y: v, absX: Math.abs(m), absY: Math.abs(v) };\n }\n }\n return C;\n }), n(r, "Series/PackedBubble/PackedBubbleLayout.js", [r["Series/GraphLayoutComposition.js"], r["Series/PackedBubble/PackedBubbleIntegration.js"], r["Series/Networkgraph/ReingoldFruchtermanLayout.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { addEvent: l, pick: c } = s;\n function p() {\n let h = this.series, b = [];\n return h.forEach((M) => {\n M.parentNode && M.parentNode.selected && b.push(M.parentNode);\n }), b;\n }\n function d() {\n this.allDataPoints && delete this.allDataPoints;\n }\n class u extends a {\n constructor() {\n super(...arguments), this.index = NaN, this.nodes = [], this.series = [];\n }\n static compose(b) {\n a.compose(b), o.integrations.packedbubble = i, o.layouts.packedbubble = u;\n let M = b.prototype;\n M.getSelectedParentNodes || (l(b, "beforeRedraw", d), M.getSelectedParentNodes = p);\n }\n beforeStep() {\n this.options.marker && this.series.forEach((b) => {\n b && b.calculateParentRadius();\n });\n }\n isStable() {\n let b = Math.abs(this.prevSystemTemperature - this.systemTemperature);\n return 1 > Math.abs(10 * this.systemTemperature / Math.sqrt(this.nodes.length)) && b < 1e-5 || this.temperature <= 0;\n }\n setCircularPositions() {\n let b = this.box, M = this.nodes, C = 2 * Math.PI / (M.length + 1), g = this.options.initialPositionRadius, f, O, m = 0;\n for (let v of M)\n this.options.splitSeries && !v.isParentNode ? (f = v.series.parentNode.plotX, O = v.series.parentNode.plotY) : (f = b.width / 2, O = b.height / 2), v.plotX = v.prevX = c(v.plotX, f + g * Math.cos(v.index || m * C)), v.plotY = v.prevY = c(v.plotY, O + g * Math.sin(v.index || m * C)), v.dispX = 0, v.dispY = 0, m++;\n }\n repulsiveForces() {\n let b, M, C, g = this, f = g.options.bubblePadding, O = g.nodes;\n O.forEach((m) => {\n m.degree = m.mass, m.neighbours = 0, O.forEach((v) => {\n b = 0, m !== v && !m.fixedPosition && (g.options.seriesInteraction || m.series === v.series) && (C = g.getDistXY(m, v), (M = g.vectorLength(C) - (m.marker.radius + v.marker.radius + f)) < 0 && (m.degree += 0.01, m.neighbours++, b = g.repulsiveForce(-M / Math.sqrt(m.neighbours), g.k, m, v)), g.force("repulsive", m, b * v.mass, C, v, M));\n });\n });\n }\n applyLimitBox(b, M) {\n let C, g;\n this.options.splitSeries && !b.isParentNode && this.options.parentNodeLimit && (C = this.getDistXY(b, b.series.parentNode), (g = b.series.parentNodeRadius - b.marker.radius - this.vectorLength(C)) < 0 && g > -2 * b.marker.radius && (b.plotX -= 0.01 * C.x, b.plotY -= 0.01 * C.y)), super.applyLimitBox(b, M);\n }\n }\n return o.layouts.packedbubble = u, u;\n }), n(r, "Series/SimulationSeriesUtilities.js", [r["Core/Utilities.js"], r["Core/Animation/AnimationUtilities.js"]], function(o, i) {\n let { merge: a, syncTimeout: s } = o, { animObject: l } = i;\n return { initDataLabels: function() {\n let c = this.options.dataLabels;\n if (!this.dataLabelsGroup) {\n let p = this.initDataLabelsGroup();\n return !this.chart.styledMode && (c != null && c.style) && p.css(c.style), p.attr({ opacity: 0 }), this.visible && p.show(), p;\n }\n return this.dataLabelsGroup.attr(a({ opacity: 1 }, this.getPlotBox("data-labels"))), this.dataLabelsGroup;\n }, initDataLabelsDefer: function() {\n var p;\n let c = this.options.dataLabels;\n c != null && c.defer && ((p = this.options.layoutAlgorithm) != null && p.enableSimulation) ? s(() => {\n this.deferDataLabels = !1;\n }, c ? l(c.animation).defer : 0) : this.deferDataLabels = !1;\n } };\n }), n(r, "Extensions/TextPath.js", [r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i) {\n let { deg2rad: a } = o, { addEvent: s, merge: l, uniqueKey: c, defined: p, extend: d } = i;\n function u(M, C) {\n C = l(!0, { enabled: !0, attributes: { dy: -5, startOffset: "50%", textAnchor: "middle" } }, C);\n let g = this.renderer.url, f = this.text || this, O = f.textPath, { attributes: m, enabled: v } = C;\n if (M = M || O && O.path, O && O.undo(), M && v) {\n let y = s(f, "afterModifyTree", (z) => {\n if (M && v) {\n let N = M.attr("id");\n N || M.attr("id", N = c());\n let W = { x: 0, y: 0 };\n p(m.dx) && (W.dx = m.dx, delete m.dx), p(m.dy) && (W.dy = m.dy, delete m.dy), f.attr(W), this.attr({ transform: "" }), this.box && (this.box = this.box.destroy());\n let T = z.nodes.slice(0);\n z.nodes.length = 0, z.nodes[0] = { tagName: "textPath", attributes: d(m, { "text-anchor": m.textAnchor, href: `${g}#${N}` }), children: T };\n }\n });\n f.textPath = { path: M, undo: y };\n } else\n f.attr({ dx: 0, dy: 0 }), delete f.textPath;\n return this.added && (f.textCache = "", this.renderer.buildText(f)), this;\n }\n function h(M) {\n var f;\n let C = M.bBox, g = (f = this.element) == null ? void 0 : f.querySelector("textPath");\n if (g) {\n let O = [], { b: m, h: v } = this.renderer.fontMetrics(this.element), y = v - m, z = RegExp(\'(|]*>|<\\\\/tspan>)\', "g"), N = g.innerHTML.replace(z, "").split(/]*>/), W = N.length, T = (x, E) => {\n let { x: L, y: w } = E, q = (g.getRotationOfChar(x) - 90) * a, S = Math.cos(q), B = Math.sin(q);\n return [[L - y * S, w - y * B], [L + m * S, w + m * B]];\n };\n for (let x = 0, E = 0; E < W; E++) {\n let L = N[E].length;\n for (let w = 0; w < L; w += 5)\n try {\n let q = x + w + E, [S, B] = T(q, g.getStartPositionOfChar(q));\n w === 0 ? (O.push(B), O.push(S)) : (E === 0 && O.unshift(B), E === W - 1 && O.push(S));\n } catch {\n break;\n }\n x += L - 1;\n try {\n let w = x + E, q = g.getEndPositionOfChar(w), [S, B] = T(w, q);\n O.unshift(B), O.unshift(S);\n } catch {\n break;\n }\n }\n O.length && O.push(O[0].slice()), C.polygon = O;\n }\n return C;\n }\n function b(M) {\n var O;\n let C = M.labelOptions, g = M.point, f = C[g.formatPrefix + "TextPath"] || C.textPath;\n f && !C.useHTML && (this.setTextPath(((O = g.getDataLabelPath) == null ? void 0 : O.call(g, this)) || g.graphic, f), g.dataLabelPath && !f.enabled && (g.dataLabelPath = g.dataLabelPath.destroy()));\n }\n return { compose: function(M) {\n s(M, "afterGetBBox", h), s(M, "beforeAddingDataLabel", b);\n let C = M.prototype;\n C.setTextPath || (C.setTextPath = u);\n } };\n }), n(r, "Series/PackedBubble/PackedBubbleSeries.js", [r["Core/Color/Color.js"], r["Series/DragNodesComposition.js"], r["Series/GraphLayoutComposition.js"], r["Core/Globals.js"], r["Series/PackedBubble/PackedBubblePoint.js"], r["Series/PackedBubble/PackedBubbleSeriesDefaults.js"], r["Series/PackedBubble/PackedBubbleLayout.js"], r["Core/Series/SeriesRegistry.js"], r["Series/SimulationSeriesUtilities.js"], r["Core/Utilities.js"], r["Core/Renderer/SVG/SVGElement.js"], r["Extensions/TextPath.js"]], function(o, i, a, s, l, c, p, d, u, h, b, M) {\n let { parse: C } = o, { noop: g } = s, { series: { prototype: f }, seriesTypes: { bubble: O } } = d, { initDataLabels: m, initDataLabelsDefer: v } = u, { addEvent: y, clamp: z, defined: N, extend: W, fireEvent: T, isArray: x, isNumber: E, merge: L, pick: w } = h;\n M.compose(b);\n class q extends O {\n constructor() {\n super(...arguments), this.parentNodeMass = 0, this.deferDataLabels = !0;\n }\n static compose(B, I, P) {\n O.compose(B, I, P), i.compose(I), p.compose(I);\n }\n accumulateAllPoints() {\n let B, I = this.chart, P = [];\n for (let k of I.series)\n if (k.is("packedbubble") && k.reserveSpace()) {\n B = k.yData || [];\n for (let K = 0; K < B.length; K++)\n P.push([null, null, B[K], k.index, K, { id: K, marker: { radius: 0 } }]);\n }\n return P;\n }\n addLayout() {\n let B = this.options.layoutAlgorithm = this.options.layoutAlgorithm || {}, I = B.type || "packedbubble", P = this.chart.options.chart, k = this.chart.graphLayoutsStorage, K = this.chart.graphLayoutsLookup, $;\n k || (this.chart.graphLayoutsStorage = k = {}, this.chart.graphLayoutsLookup = K = []), ($ = k[I]) || (B.enableSimulation = N(P.forExport) ? !P.forExport : B.enableSimulation, k[I] = $ = new a.layouts[I](), $.init(B), K.splice($.index, 0, $)), this.layout = $, this.points.forEach((j) => {\n j.mass = 2, j.degree = 1, j.collisionNmb = 1;\n }), $.setArea(0, 0, this.chart.plotWidth, this.chart.plotHeight), $.addElementsToCollection([this], $.series), $.addElementsToCollection(this.points, $.nodes);\n }\n addSeriesLayout() {\n let B = this.options.layoutAlgorithm = this.options.layoutAlgorithm || {}, I = B.type || "packedbubble", P = this.chart.graphLayoutsStorage, k = this.chart.graphLayoutsLookup, K = L(B, B.parentNodeOptions, { enableSimulation: this.layout.options.enableSimulation }), $ = P[I + "-series"];\n $ || (P[I + "-series"] = $ = new a.layouts[I](), $.init(K), k.splice($.index, 0, $)), this.parentNodeLayout = $, this.createParentNodes();\n }\n calculateParentRadius() {\n let B = this.seriesBox();\n this.parentNodeRadius = z(Math.sqrt(2 * this.parentNodeMass / Math.PI) + 20, 20, B ? Math.max(Math.sqrt(Math.pow(B.width, 2) + Math.pow(B.height, 2)) / 2 + 20, 20) : Math.sqrt(2 * this.parentNodeMass / Math.PI) + 20), this.parentNode && (this.parentNode.marker.radius = this.parentNode.radius = this.parentNodeRadius);\n }\n calculateZExtremes() {\n let B = this.chart.series, I = this.options.zMin, P = this.options.zMax, k = 1 / 0, K = -1 / 0;\n return I && P ? [I, P] : (B.forEach(($) => {\n $.yData.forEach((j) => {\n N(j) && (j > K && (K = j), j < k && (k = j));\n });\n }), [I = w(I, k), P = w(P, K)]);\n }\n checkOverlap(B, I) {\n let P = B[0] - I[0], k = B[1] - I[1];\n return Math.sqrt(P * P + k * k) - Math.abs(B[2] + I[2]) < -1e-3;\n }\n createParentNodes() {\n let B = this.pointClass, I = this.chart, P = this.parentNodeLayout, k = this.layout.options, K, $ = this.parentNode, j = { radius: this.parentNodeRadius, lineColor: this.color, fillColor: C(this.color).brighten(0.4).get() };\n k.parentNodeOptions && (j = L(k.parentNodeOptions.marker || {}, j)), this.parentNodeMass = 0, this.points.forEach((r1) => {\n this.parentNodeMass += Math.PI * Math.pow(r1.marker.radius, 2);\n }), this.calculateParentRadius(), P.nodes.forEach((r1) => {\n r1.seriesIndex === this.index && (K = !0);\n }), P.setArea(0, 0, I.plotWidth, I.plotHeight), K || ($ || ($ = new B(this, { mass: this.parentNodeRadius / 2, marker: j, dataLabels: { inside: !1 }, states: { normal: { marker: j }, hover: { marker: j } }, dataLabelOnNull: !0, degree: this.parentNodeRadius, isParentNode: !0, seriesIndex: this.index })), this.parentNode && ($.plotX = this.parentNode.plotX, $.plotY = this.parentNode.plotY), this.parentNode = $, P.addElementsToCollection([this], P.series), P.addElementsToCollection([$], P.nodes));\n }\n deferLayout() {\n let B = this.options.layoutAlgorithm;\n this.visible && (this.addLayout(), B.splitSeries && this.addSeriesLayout());\n }\n destroy() {\n this.chart.graphLayoutsLookup && this.chart.graphLayoutsLookup.forEach((B) => {\n B.removeElementFromCollection(this, B.series);\n }, this), this.parentNode && this.parentNodeLayout && (this.parentNodeLayout.removeElementFromCollection(this.parentNode, this.parentNodeLayout.nodes), this.parentNode.dataLabel && (this.parentNode.dataLabel = this.parentNode.dataLabel.destroy())), f.destroy.apply(this, arguments);\n }\n drawDataLabels() {\n !this.deferDataLabels && (f.drawDataLabels.call(this, this.points), this.parentNode && (this.parentNode.formatPrefix = "parentNode", f.drawDataLabels.call(this, [this.parentNode])));\n }\n drawGraph() {\n var K;\n if (!this.layout || !this.layout.options.splitSeries)\n return;\n let B = this.chart, I = this.layout.options.parentNodeOptions.marker, P = { fill: I.fillColor || C(this.color).brighten(0.4).get(), opacity: I.fillOpacity, stroke: I.lineColor || this.color, "stroke-width": w(I.lineWidth, this.options.lineWidth) }, k = {};\n this.parentNodesGroup = this.plotGroup("parentNodesGroup", "parentNode", this.visible ? "inherit" : "hidden", 0.1, B.seriesGroup), (K = this.group) == null || K.attr({ zIndex: 2 }), this.calculateParentRadius(), this.parentNode && N(this.parentNode.plotX) && N(this.parentNode.plotY) && N(this.parentNodeRadius) && (k = L({ x: this.parentNode.plotX - this.parentNodeRadius, y: this.parentNode.plotY - this.parentNodeRadius, width: 2 * this.parentNodeRadius, height: 2 * this.parentNodeRadius }, P), this.parentNode.graphic || (this.graph = this.parentNode.graphic = B.renderer.symbol(P.symbol).add(this.parentNodesGroup)), this.parentNode.graphic.attr(k));\n }\n drawTracker() {\n let B, I = this.parentNode;\n super.drawTracker(), I && (B = x(I.dataLabels) ? I.dataLabels : I.dataLabel ? [I.dataLabel] : [], I.graphic && (I.graphic.element.point = I), B.forEach((P) => {\n (P.div || P.element).point = I;\n }));\n }\n getPointRadius() {\n let B, I, P, k, K = this.chart, $ = K.plotWidth, j = K.plotHeight, r1 = this.options, a1 = r1.useSimulation, _ = Math.min($, j), Y = {}, D = [], H = K.allDataPoints || [], G = H.length;\n ["minSize", "maxSize"].forEach((F) => {\n let V = parseInt(r1[F], 10), Q = /%$/.test(r1[F]);\n Y[F] = Q ? _ * V / 100 : V * Math.sqrt(G);\n }), K.minRadius = B = Y.minSize / Math.sqrt(G), K.maxRadius = I = Y.maxSize / Math.sqrt(G);\n let J = a1 ? this.calculateZExtremes() : [B, I];\n H.forEach((F, V) => {\n P = a1 ? z(F[2], J[0], J[1]) : F[2], (k = this.getRadius(J[0], J[1], B, I, P)) === 0 && (k = null), H[V][2] = k, D.push(k);\n }), this.radii = D;\n }\n init() {\n return f.init.apply(this, arguments), v.call(this), this.eventsToUnbind.push(y(this, "updatedData", function() {\n this.chart.series.forEach((B) => {\n B.type === this.type && (B.isDirty = !0);\n }, this);\n })), this;\n }\n onMouseUp(B) {\n if (B.fixedPosition && !B.removed) {\n let I, P = this.layout, k = this.parentNodeLayout;\n k && P.options.dragBetweenSeries && k.nodes.forEach((K) => {\n B && B.marker && K !== B.series.parentNode && (I = P.getDistXY(B, K), P.vectorLength(I) - K.marker.radius - B.marker.radius < 0 && (K.series.addPoint(L(B.options, { plotX: B.plotX, plotY: B.plotY }), !1), P.removeElementFromCollection(B, P.nodes), B.remove()));\n }), i.onMouseUp.apply(this, arguments);\n }\n }\n placeBubbles(B) {\n let I = this.checkOverlap, P = this.positionBubble, k = [], K = 1, $ = 0, j = 0, r1, a1 = [], _, Y = B.sort((D, H) => H[2] - D[2]);\n if (Y.length) {\n if (k.push([[0, 0, Y[0][2], Y[0][3], Y[0][4]]]), Y.length > 1)\n for (k.push([[0, 0 - Y[1][2] - Y[0][2], Y[1][2], Y[1][3], Y[1][4]]]), _ = 2; _ < Y.length; _++)\n Y[_][2] = Y[_][2] || 1, I(r1 = P(k[K][$], k[K - 1][j], Y[_]), k[K][0]) ? (k.push([]), j = 0, k[K + 1].push(P(k[K][$], k[K][0], Y[_])), K++, $ = 0) : K > 1 && k[K - 1][j + 1] && I(r1, k[K - 1][j + 1]) ? (j++, k[K].push(P(k[K][$], k[K - 1][j], Y[_])), $++) : ($++, k[K].push(r1));\n this.chart.stages = k, this.chart.rawPositions = [].concat.apply([], k), this.resizeRadius(), a1 = this.chart.rawPositions;\n }\n return a1;\n }\n pointAttribs(B, I) {\n let P = this.options, k = B && B.isParentNode, K = P.marker;\n k && P.layoutAlgorithm && P.layoutAlgorithm.parentNodeOptions && (K = P.layoutAlgorithm.parentNodeOptions.marker);\n let $ = K.fillOpacity, j = f.pointAttribs.call(this, B, I);\n return $ !== 1 && (j["fill-opacity"] = $), j;\n }\n positionBubble(B, I, P) {\n let k = Math.asin, K = Math.acos, $ = Math.pow, j = Math.abs, r1 = (0, Math.sqrt)($(B[0] - I[0], 2) + $(B[1] - I[1], 2)), a1 = K(($(r1, 2) + $(P[2] + I[2], 2) - $(P[2] + B[2], 2)) / (2 * (P[2] + I[2]) * r1)), _ = k(j(B[0] - I[0]) / r1), Y = (B[1] - I[1] < 0 ? 0 : Math.PI) + a1 + _ * ((B[0] - I[0]) * (B[1] - I[1]) < 0 ? 1 : -1), D = Math.cos(Y), H = Math.sin(Y);\n return [I[0] + (I[2] + P[2]) * H, I[1] - (I[2] + P[2]) * D, P[2], P[3], P[4]];\n }\n render() {\n let B = [];\n f.render.apply(this, arguments), !this.options.dataLabels.allowOverlap && (this.data.forEach((I) => {\n x(I.dataLabels) && I.dataLabels.forEach((P) => {\n B.push(P);\n });\n }), this.options.useSimulation && this.chart.hideOverlappingLabels(B));\n }\n resizeRadius() {\n let B, I, P, k, K, $ = this.chart, j = $.rawPositions, r1 = Math.min, a1 = Math.max, _ = $.plotLeft, Y = $.plotTop, D = $.plotHeight, H = $.plotWidth;\n for (let V of (B = P = Number.POSITIVE_INFINITY, I = k = Number.NEGATIVE_INFINITY, j))\n K = V[2], B = r1(B, V[0] - K), I = a1(I, V[0] + K), P = r1(P, V[1] - K), k = a1(k, V[1] + K);\n let G = [I - B, k - P], J = [(H - _) / G[0], (D - Y) / G[1]], F = r1.apply([], J);\n if (Math.abs(F - 1) > 1e-10) {\n for (let V of j)\n V[2] *= F;\n this.placeBubbles(j);\n } else\n $.diffY = D / 2 + Y - P - (k - P) / 2, $.diffX = H / 2 + _ - B - (I - B) / 2;\n }\n seriesBox() {\n let B, I = this.chart, P = this.data, k = Math.max, K = Math.min, $ = [I.plotLeft, I.plotLeft + I.plotWidth, I.plotTop, I.plotTop + I.plotHeight];\n return P.forEach((j) => {\n N(j.plotX) && N(j.plotY) && j.marker.radius && (B = j.marker.radius, $[0] = K($[0], j.plotX - B), $[1] = k($[1], j.plotX + B), $[2] = K($[2], j.plotY - B), $[3] = k($[3], j.plotY + B));\n }), E($.width / $.height) ? $ : null;\n }\n setVisible() {\n let B = this;\n f.setVisible.apply(B, arguments), B.parentNodeLayout && B.graph ? B.visible ? (B.graph.show(), B.parentNode.dataLabel && B.parentNode.dataLabel.show()) : (B.graph.hide(), B.parentNodeLayout.removeElementFromCollection(B.parentNode, B.parentNodeLayout.nodes), B.parentNode.dataLabel && B.parentNode.dataLabel.hide()) : B.layout && (B.visible ? B.layout.addElementsToCollection(B.points, B.layout.nodes) : B.points.forEach((I) => {\n B.layout.removeElementFromCollection(I, B.layout.nodes);\n }));\n }\n translate() {\n let B, I, P, k = this.chart, K = this.data, $ = this.index, j = this.options.useSimulation;\n for (let r1 of (this.processedXData = this.xData, this.generatePoints(), N(k.allDataPoints) || (k.allDataPoints = this.accumulateAllPoints(), this.getPointRadius()), j ? P = k.allDataPoints : (P = this.placeBubbles(k.allDataPoints), this.options.draggable = !1), P))\n r1[3] === $ && (B = K[r1[4]], I = w(r1[2], void 0), j || (B.plotX = r1[0] - k.plotLeft + k.diffX, B.plotY = r1[1] - k.plotTop + k.diffY), E(I) && (B.marker = W(B.marker, { radius: I, width: 2 * I, height: 2 * I }), B.radius = I));\n j && this.deferLayout(), T(this, "afterTranslate");\n }\n }\n return q.defaultOptions = L(O.defaultOptions, c), W(q.prototype, { pointClass: l, axisTypes: [], directTouch: !0, forces: ["barycenter", "repulsive"], hasDraggableNodes: !0, invertible: !1, isCartesian: !1, noSharedTooltip: !0, pointArrayMap: ["value"], pointValKey: "value", requireSorting: !1, trackerGroups: ["group", "dataLabelsGroup", "parentNodesGroup"], initDataLabels: m, alignDataLabel: f.alignDataLabel, indexateNodes: g, onMouseDown: i.onMouseDown, onMouseMove: i.onMouseMove, redrawHalo: i.redrawHalo, searchPoint: g }), d.registerSeriesType("packedbubble", q), q;\n }), n(r, "Series/Polygon/PolygonSeriesDefaults.js", [], function() {\n return { marker: { enabled: !1, states: { hover: { enabled: !1 } } }, stickyTracking: !1, tooltip: { followPointer: !0, pointFormat: "" }, trackByArea: !0, legendSymbol: "rectangle" };\n }), n(r, "Series/Polygon/PolygonSeries.js", [r["Core/Globals.js"], r["Series/Polygon/PolygonSeriesDefaults.js"], r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n let { noop: l } = o, { area: c, line: p, scatter: d } = a.seriesTypes, { extend: u, merge: h } = s;\n class b extends d {\n getGraphPath() {\n let C = p.prototype.getGraphPath.call(this), g = C.length + 1;\n for (; g--; )\n (g === C.length || C[g][0] === "M") && g > 0 && C.splice(g, 0, ["Z"]);\n return this.areaPath = C, C;\n }\n drawGraph() {\n this.options.fillColor = this.color, c.prototype.drawGraph.call(this);\n }\n }\n return b.defaultOptions = h(d.defaultOptions, i), u(b.prototype, { type: "polygon", drawTracker: p.prototype.drawTracker, setStackedPoints: l }), a.registerSeriesType("polygon", b), b;\n }), n(r, "Core/Axis/RadialAxisDefaults.js", [], function() {\n return { circular: { gridLineWidth: 1, labels: { align: void 0, x: 0, y: void 0, style: { textOverflow: "none" } }, maxPadding: 0, minPadding: 0, showLastLabel: !1, tickLength: 0 }, radial: { gridLineInterpolation: "circle", gridLineWidth: 1, labels: { align: "right", padding: 5, x: -3, y: -2 }, showLastLabel: !1, title: { x: 4, text: null, rotation: 90 } }, radialGauge: { endOnTick: !1, gridLineWidth: 0, labels: { align: "center", distance: -25, x: 0, y: void 0 }, lineWidth: 1, minorGridLineWidth: 0, minorTickInterval: "auto", minorTickLength: 10, minorTickPosition: "inside", minorTickWidth: 1, startOnTick: !1, tickLength: 10, tickPixelInterval: 100, tickPosition: "inside", tickWidth: 2, title: { rotation: 0, text: "" }, zIndex: 2 } };\n }), n(r, "Core/Axis/RadialAxis.js", [r["Core/Axis/RadialAxisDefaults.js"], r["Core/Defaults.js"], r["Core/Globals.js"], r["Core/Utilities.js"]], function(o, i, a, s) {\n var l;\n let { defaultOptions: c } = i, { composed: p, noop: d } = a, { addEvent: u, correctFloat: h, defined: b, extend: M, fireEvent: C, isObject: g, merge: f, pick: O, pushUnique: m, relativeLength: v, wrap: y } = s;\n return function(z) {\n function N() {\n this.autoConnect = this.isCircular && O(this.userMax, this.options.max) === void 0 && h(this.endAngleRad - this.startAngleRad) === h(2 * Math.PI), !this.isCircular && this.chart.inverted && this.max++, this.autoConnect && (this.max += this.categories && 1 || this.pointRange || this.closestPointRange || 0);\n }\n function W() {\n return () => {\n if (this.isRadial && this.tickPositions && this.options.labels && this.options.labels.allowOverlap !== !0)\n return this.tickPositions.map((V) => this.ticks[V] && this.ticks[V].label).filter((V) => !!V);\n };\n }\n function T() {\n return d;\n }\n function x(V, Q, Z) {\n let t1 = this.pane.center, n1 = V.value, U, e1, o1;\n return this.isCircular ? (b(n1) ? V.point && (V.point.shapeArgs || {}).start && (n1 = this.chart.inverted ? this.translate(V.point.rectPlotY, !0) : V.point.x) : (e1 = V.chartX || 0, o1 = V.chartY || 0, n1 = this.translate(Math.atan2(o1 - Z, e1 - Q) - this.startAngleRad, !0)), e1 = (U = this.getPosition(n1)).x, o1 = U.y) : (b(n1) || (e1 = V.chartX, o1 = V.chartY), b(e1) && b(o1) && (Z = t1[1] + this.chart.plotTop, n1 = this.translate(Math.min(Math.sqrt(Math.pow(e1 - Q, 2) + Math.pow(o1 - Z, 2)), t1[2] / 2) - t1[3] / 2, !0))), [n1, e1 || 0, o1 || 0];\n }\n function E(V, Q, Z) {\n let t1 = this.pane.center, n1 = this.chart, U = this.left || 0, e1 = this.top || 0, o1, u1 = O(Q, t1[2] / 2 - this.offset), M1;\n return Z === void 0 && (Z = this.horiz ? 0 : this.center && -this.center[3] / 2), Z && (u1 += Z), this.isCircular || Q !== void 0 ? ((M1 = this.chart.renderer.symbols.arc(U + t1[0], e1 + t1[1], u1, u1, { start: this.startAngleRad, end: this.endAngleRad, open: !0, innerR: 0 })).xBounds = [U + t1[0]], M1.yBounds = [e1 + t1[1] - u1]) : (o1 = this.postTranslate(this.angleRad, u1), M1 = [["M", this.center[0] + n1.plotLeft, this.center[1] + n1.plotTop], ["L", o1.x, o1.y]]), M1;\n }\n function L() {\n this.constructor.prototype.getOffset.call(this), this.chart.axisOffset[this.side] = 0;\n }\n function w(V, Q, Z) {\n let t1 = this.chart, n1 = (X1) => {\n if (typeof X1 == "string") {\n let G1 = parseInt(X1, 10);\n return l1.test(X1) && (G1 = G1 * o1 / 100), G1;\n }\n return X1;\n }, U = this.center, e1 = this.startAngleRad, o1 = U[2] / 2, u1 = Math.min(this.offset, 0), M1 = this.left || 0, A1 = this.top || 0, l1 = /%$/, b1 = this.isCircular, h1, z1, O1, m1, L1, y1, B1 = O(n1(Z.outerRadius), o1), T1 = n1(Z.innerRadius), F1 = O(n1(Z.thickness), 10);\n if (this.options.gridLineInterpolation === "polygon")\n y1 = this.getPlotLinePath({ value: V }).concat(this.getPlotLinePath({ value: Q, reverse: !0 }));\n else {\n V = Math.max(V, this.min), Q = Math.min(Q, this.max);\n let X1 = this.translate(V), G1 = this.translate(Q);\n b1 || (B1 = X1 || 0, T1 = G1 || 0), Z.shape !== "circle" && b1 ? (h1 = e1 + (X1 || 0), z1 = e1 + (G1 || 0)) : (h1 = -Math.PI / 2, z1 = 1.5 * Math.PI, L1 = !0), B1 -= u1, F1 -= u1, y1 = t1.renderer.symbols.arc(M1 + U[0], A1 + U[1], B1, B1, { start: Math.min(h1, z1), end: Math.max(h1, z1), innerR: O(T1, B1 - F1), open: L1, borderRadius: Z.borderRadius }), b1 && (O1 = (z1 + h1) / 2, m1 = M1 + U[0] + U[2] / 2 * Math.cos(O1), y1.xBounds = O1 > -Math.PI / 2 && O1 < Math.PI / 2 ? [m1, t1.plotWidth] : [0, m1], y1.yBounds = [A1 + U[1] + U[2] / 2 * Math.sin(O1)], y1.yBounds[0] += O1 > -Math.PI && O1 < 0 || O1 > Math.PI ? -10 : 10);\n }\n return y1;\n }\n function q(V) {\n let Q = this.pane.center, Z = this.chart, t1 = Z.inverted, n1 = V.reverse, U = this.pane.options.background ? this.pane.options.background[0] || this.pane.options.background : {}, e1 = U.innerRadius || "0%", o1 = U.outerRadius || "100%", u1 = Q[0] + Z.plotLeft, M1 = Q[1] + Z.plotTop, A1 = this.height, l1 = V.isCrosshair, b1 = Q[3] / 2, h1 = V.value, z1, O1, m1, L1, y1, B1, T1, F1, X1, G1 = this.getPosition(h1), Q1 = G1.x, K1 = G1.y;\n if (l1 && (h1 = (F1 = this.getCrosshairPosition(V, u1, M1))[0], Q1 = F1[1], K1 = F1[2]), this.isCircular)\n O1 = Math.sqrt(Math.pow(Q1 - u1, 2) + Math.pow(K1 - M1, 2)), m1 = typeof e1 == "string" ? v(e1, 1) : e1 / O1, L1 = typeof o1 == "string" ? v(o1, 1) : o1 / O1, Q && b1 && (m1 < (z1 = b1 / O1) && (m1 = z1), L1 < z1 && (L1 = z1)), X1 = [["M", u1 + m1 * (Q1 - u1), M1 - m1 * (M1 - K1)], ["L", Q1 - (1 - L1) * (Q1 - u1), K1 + (1 - L1) * (M1 - K1)]];\n else if ((h1 = this.translate(h1)) && (h1 < 0 || h1 > A1) && (h1 = 0), this.options.gridLineInterpolation === "circle")\n X1 = this.getLinePath(0, h1, b1);\n else if (X1 = [], Z[t1 ? "yAxis" : "xAxis"].forEach((n0) => {\n n0.pane === this.pane && (y1 = n0);\n }), y1) {\n T1 = y1.tickPositions, y1.autoConnect && (T1 = T1.concat([T1[0]])), n1 && (T1 = T1.slice().reverse()), h1 && (h1 += b1);\n for (let n0 = 0; n0 < T1.length; n0++)\n B1 = y1.getPosition(T1[n0], h1), X1.push(n0 ? ["L", B1.x, B1.y] : ["M", B1.x, B1.y]);\n }\n return X1;\n }\n function S(V, Q) {\n let Z = this.translate(V);\n return this.postTranslate(this.isCircular ? Z : this.angleRad, O(this.isCircular ? Q : Z < 0 ? 0 : Z, this.center[2] / 2) - this.offset);\n }\n function B() {\n let V = this.center, Q = this.chart, Z = this.options.title;\n return { x: Q.plotLeft + V[0] + (Z.x || 0), y: Q.plotTop + V[1] - { high: 0.5, middle: 0.25, low: 0 }[Z.align] * V[2] + (Z.y || 0) };\n }\n function I(V) {\n V.beforeSetTickPositions = N, V.createLabelCollector = W, V.getCrosshairPosition = x, V.getLinePath = E, V.getOffset = L, V.getPlotBandPath = w, V.getPlotLinePath = q, V.getPosition = S, V.getTitlePosition = B, V.postTranslate = Y, V.setAxisSize = H, V.setAxisTranslation = G, V.setOptions = J;\n }\n function P() {\n let V = this.chart, Q = this.options, Z = V.angular && this.isXAxis, t1 = this.pane, n1 = t1 && t1.options;\n if (!Z && t1 && (V.angular || V.polar)) {\n let U = 2 * Math.PI, e1 = (O(n1.startAngle, 0) - 90) * Math.PI / 180, o1 = (O(n1.endAngle, O(n1.startAngle, 0) + 360) - 90) * Math.PI / 180;\n this.angleRad = (Q.angle || 0) * Math.PI / 180, this.startAngleRad = e1, this.endAngleRad = o1, this.offset = Q.offset || 0;\n let u1 = (e1 % U + U) % U, M1 = (o1 % U + U) % U;\n u1 > Math.PI && (u1 -= U), M1 > Math.PI && (M1 -= U), this.normalizedStartAngleRad = u1, this.normalizedEndAngleRad = M1;\n }\n }\n function k(V) {\n this.isRadial && (V.align = void 0, V.preventDefault());\n }\n function K() {\n if (this.chart && this.chart.labelCollectors) {\n let V = this.labelCollector ? this.chart.labelCollectors.indexOf(this.labelCollector) : -1;\n V >= 0 && this.chart.labelCollectors.splice(V, 1);\n }\n }\n function $(V) {\n let Q, Z = this.chart, t1 = Z.angular, n1 = Z.polar, U = this.isXAxis, e1 = this.coll, o1 = V.userOptions.pane || 0, u1 = this.pane = Z.pane && Z.pane[o1];\n if (e1 === "colorAxis") {\n this.isRadial = !1;\n return;\n }\n t1 ? (t1 && U ? (this.isHidden = !0, this.createLabelCollector = T, this.getOffset = d, this.redraw = D, this.render = D, this.setScale = d, this.setCategories = d, this.setTitle = d) : I(this), Q = !U) : n1 && (I(this), Q = this.horiz), t1 || n1 ? (this.isRadial = !0, this.labelCollector || (this.labelCollector = this.createLabelCollector()), this.labelCollector && Z.labelCollectors.push(this.labelCollector)) : this.isRadial = !1, u1 && Q && (u1.axis = this), this.isCircular = Q;\n }\n function j() {\n this.isRadial && this.beforeSetTickPositions();\n }\n function r1(V) {\n let Q = this.label;\n if (!Q)\n return;\n let Z = this.axis, t1 = Q.getBBox(), n1 = Z.options.labels, U = (Z.translate(this.pos) + Z.startAngleRad + Math.PI / 2) / Math.PI * 180 % 360, e1 = Math.round(U), o1 = b(n1.y) ? 0 : -(0.3 * t1.height), u1 = n1.y, M1, A1 = 20, l1 = n1.align, b1 = "end", h1 = e1 < 0 ? e1 + 360 : e1, z1 = h1, O1 = 0, m1 = 0;\n Z.isRadial && (M1 = Z.getPosition(this.pos, Z.center[2] / 2 + v(O(n1.distance, -25), Z.center[2] / 2, -Z.center[2] / 2)), n1.rotation === "auto" ? Q.attr({ rotation: U }) : b(u1) || (u1 = Z.chart.renderer.fontMetrics(Q).b - t1.height / 2), b(l1) || (Z.isCircular ? (t1.width > Z.len * Z.tickInterval / (Z.max - Z.min) && (A1 = 0), l1 = U > A1 && U < 180 - A1 ? "left" : U > 180 + A1 && U < 360 - A1 ? "right" : "center") : l1 = "center", Q.attr({ align: l1 })), l1 === "auto" && Z.tickPositions.length === 2 && Z.isCircular && (h1 > 90 && h1 < 180 ? h1 = 180 - h1 : h1 > 270 && h1 <= 360 && (h1 = 540 - h1), z1 > 180 && z1 <= 360 && (z1 = 360 - z1), (Z.pane.options.startAngle === e1 || Z.pane.options.startAngle === e1 + 360 || Z.pane.options.startAngle === e1 - 360) && (b1 = "start"), l1 = e1 >= -90 && e1 <= 90 || e1 >= -360 && e1 <= -270 || e1 >= 270 && e1 <= 360 ? b1 === "start" ? "right" : "left" : b1 === "start" ? "left" : "right", z1 > 70 && z1 < 110 && (l1 = "center"), h1 < 15 || h1 >= 180 && h1 < 195 ? O1 = 0.3 * t1.height : h1 >= 15 && h1 <= 35 ? O1 = b1 === "start" ? 0 : 0.75 * t1.height : h1 >= 195 && h1 <= 215 ? O1 = b1 === "start" ? 0.75 * t1.height : 0 : h1 > 35 && h1 <= 90 ? O1 = b1 === "start" ? -(0.25 * t1.height) : t1.height : h1 > 215 && h1 <= 270 && (O1 = b1 === "start" ? t1.height : -(0.25 * t1.height)), z1 < 15 ? m1 = b1 === "start" ? -(0.15 * t1.height) : 0.15 * t1.height : z1 > 165 && z1 <= 180 && (m1 = b1 === "start" ? 0.15 * t1.height : -(0.15 * t1.height)), Q.attr({ align: l1 }), Q.translate(m1, O1 + o1)), V.pos.x = M1.x + (n1.x || 0), V.pos.y = M1.y + (u1 || 0));\n }\n function a1(V) {\n this.axis.getPosition && M(V.pos, this.axis.getPosition(this.pos));\n }\n function _({ options: V }) {\n V.xAxis && f(!0, z.radialDefaultOptions.circular, V.xAxis), V.yAxis && f(!0, z.radialDefaultOptions.radialGauge, V.yAxis);\n }\n function Y(V, Q) {\n let Z = this.chart, t1 = this.center;\n return V = this.startAngleRad + V, { x: Z.plotLeft + t1[0] + Math.cos(V) * Q, y: Z.plotTop + t1[1] + Math.sin(V) * Q };\n }\n function D() {\n this.isDirty = !1;\n }\n function H() {\n let V, Q;\n this.constructor.prototype.setAxisSize.call(this), this.isRadial && (this.pane.updateCenter(this), V = this.center = this.pane.center.slice(), this.isCircular ? this.sector = this.endAngleRad - this.startAngleRad : (Q = this.postTranslate(this.angleRad, V[3] / 2), V[0] = Q.x - this.chart.plotLeft, V[1] = Q.y - this.chart.plotTop), this.len = this.width = this.height = (V[2] - V[3]) * O(this.sector, 1) / 2);\n }\n function G() {\n this.constructor.prototype.setAxisTranslation.call(this), this.center && (this.isCircular ? this.transA = (this.endAngleRad - this.startAngleRad) / (this.max - this.min || 1) : this.transA = (this.center[2] - this.center[3]) / 2 / (this.max - this.min || 1), this.isXAxis ? this.minPixelPadding = this.transA * this.minPointOffset : this.minPixelPadding = 0);\n }\n function J(V) {\n let { coll: Q } = this, { angular: Z, inverted: t1, polar: n1 } = this.chart, U = {};\n Z ? this.isXAxis || (U = f(c.yAxis, z.radialDefaultOptions.radialGauge)) : n1 && (U = this.horiz ? f(c.xAxis, z.radialDefaultOptions.circular) : f(Q === "xAxis" ? c.xAxis : c.yAxis, z.radialDefaultOptions.radial)), t1 && Q === "yAxis" && (U.stackLabels = g(c.yAxis, !0) ? c.yAxis.stackLabels : {}, U.reversedStacks = !0);\n let e1 = this.options = f(U, V);\n e1.plotBands || (e1.plotBands = []), C(this, "afterSetOptions");\n }\n function F(V, Q, Z, t1, n1, U, e1) {\n let o1, u1 = this.axis;\n return u1.isRadial ? ["M", Q, Z, "L", (o1 = u1.getPosition(this.pos, u1.center[2] / 2 + t1)).x, o1.y] : V.call(this, Q, Z, t1, n1, U, e1);\n }\n z.radialDefaultOptions = f(o), z.compose = function(V, Q) {\n return m(p, "Axis.Radial") && (u(V, "afterInit", P), u(V, "autoLabelAlign", k), u(V, "destroy", K), u(V, "init", $), u(V, "initialAxisTranslation", j), u(Q, "afterGetLabelPosition", r1), u(Q, "afterGetPosition", a1), u(a, "setOptions", _), y(Q.prototype, "getMarkPath", F)), V;\n };\n }(l || (l = {})), l;\n }), n(r, "Series/PolarComposition.js", [r["Core/Animation/AnimationUtilities.js"], r["Core/Globals.js"], r["Core/Series/Series.js"], r["Extensions/Pane/Pane.js"], r["Core/Axis/RadialAxis.js"], r["Core/Utilities.js"]], function(o, i, a, s, l, c) {\n let { animObject: p } = o, { composed: d } = i, { addEvent: u, defined: h, find: b, isNumber: M, merge: C, pick: g, pushUnique: f, relativeLength: O, splat: m, uniqueKey: v, wrap: y } = c;\n function z() {\n (this.pane || []).forEach((_) => {\n _.render();\n });\n }\n function N(_) {\n let Y = _.args[0].xAxis, D = _.args[0].yAxis, H = _.args[0].chart;\n Y && D && (D.gridLineInterpolation === "polygon" ? (Y.startOnTick = !0, Y.endOnTick = !0) : Y.gridLineInterpolation === "polygon" && H.inverted && (D.startOnTick = !0, D.endOnTick = !0));\n }\n function W() {\n this.pane || (this.pane = []), this.options.pane = m(this.options.pane), this.options.pane.forEach((_) => {\n new s(_, this);\n }, this);\n }\n function T(_) {\n let Y = _.args.marker, D = this.chart.xAxis[0], H = this.chart.yAxis[0], G = this.chart.inverted, J = G ? H : D, F = G ? D : H;\n if (this.chart.polar) {\n _.preventDefault();\n let V = (Y.attr ? Y.attr("start") : Y.start) - J.startAngleRad, Q = Y.attr ? Y.attr("r") : Y.r, Z = (Y.attr ? Y.attr("end") : Y.end) - J.startAngleRad, t1 = Y.attr ? Y.attr("innerR") : Y.innerR;\n _.result.x = V + J.pos, _.result.width = Z - V, _.result.y = F.len + F.pos - Q, _.result.height = Q - t1;\n }\n }\n function x(_) {\n let Y = this.chart;\n if (Y.polar && Y.hoverPane && Y.hoverPane.axis) {\n _.preventDefault();\n let D = Y.hoverPane.center, H = Y.mouseDownX || 0, G = Y.mouseDownY || 0, J = _.args.chartY, F = _.args.chartX, V = 2 * Math.PI, Q = Y.hoverPane.axis.startAngleRad, Z = Y.hoverPane.axis.endAngleRad, t1 = Y.inverted ? Y.xAxis[0] : Y.yAxis[0], n1 = {}, U = "arc";\n if (n1.x = D[0] + Y.plotLeft, n1.y = D[1] + Y.plotTop, this.zoomHor) {\n let e1 = Q > 0 ? Z - Q : Math.abs(Q) + Math.abs(Z), o1 = Math.atan2(G - Y.plotTop - D[1], H - Y.plotLeft - D[0]) - Q, u1 = Math.atan2(J - Y.plotTop - D[1], F - Y.plotLeft - D[0]) - Q;\n n1.r = D[2] / 2, n1.innerR = D[3] / 2, o1 <= 0 && (o1 += V), u1 <= 0 && (u1 += V), u1 < o1 && (u1 = [o1, o1 = u1][0]), e1 < V && Q + u1 > Z + (V - e1) / 2 && (u1 = o1, o1 = Q <= 0 ? Q : 0);\n let M1 = n1.start = Math.max(o1 + Q, Q), A1 = n1.end = Math.min(u1 + Q, Z);\n if (t1.options.gridLineInterpolation === "polygon") {\n let l1 = Y.hoverPane.axis, b1 = M1 - l1.startAngleRad + l1.pos, h1 = t1.getPlotLinePath({ value: t1.max }), z1 = l1.toValue(b1), O1 = l1.toValue(b1 + (A1 - M1));\n if (z1 < l1.getExtremes().min) {\n let { min: m1, max: L1 } = l1.getExtremes();\n z1 = L1 - (m1 - z1);\n }\n if (O1 < l1.getExtremes().min) {\n let { min: m1, max: L1 } = l1.getExtremes();\n O1 = L1 - (m1 - O1);\n }\n O1 < z1 && (O1 = [z1, z1 = O1][0]), (h1 = q(h1, z1, O1, l1)).push(["L", D[0] + Y.plotLeft, Y.plotTop + D[1]]), n1.d = h1, U = "path";\n }\n }\n if (this.zoomVert) {\n let e1 = Y.inverted ? Y.xAxis[0] : Y.yAxis[0], o1 = Math.sqrt(Math.pow(H - Y.plotLeft - D[0], 2) + Math.pow(G - Y.plotTop - D[1], 2)), u1 = Math.sqrt(Math.pow(F - Y.plotLeft - D[0], 2) + Math.pow(J - Y.plotTop - D[1], 2));\n if (u1 < o1 && (o1 = [u1, u1 = o1][0]), u1 > D[2] / 2 && (u1 = D[2] / 2), o1 < D[3] / 2 && (o1 = D[3] / 2), this.zoomHor || (n1.start = Q, n1.end = Z), n1.r = u1, n1.innerR = o1, e1.options.gridLineInterpolation === "polygon") {\n let M1 = e1.toValue(e1.len + e1.pos - o1), A1 = e1.toValue(e1.len + e1.pos - u1), l1 = e1.getPlotLinePath({ value: A1 }).concat(e1.getPlotLinePath({ value: M1, reverse: !0 }));\n n1.d = l1, U = "path";\n }\n }\n if (this.zoomHor && this.zoomVert && t1.options.gridLineInterpolation === "polygon") {\n let e1 = Y.hoverPane.axis, o1 = n1.start || 0, u1 = n1.end || 0, M1 = o1 - e1.startAngleRad + e1.pos, A1 = e1.toValue(M1), l1 = e1.toValue(M1 + (u1 - o1));\n if (n1.d instanceof Array) {\n let b1 = n1.d.slice(0, n1.d.length / 2), h1 = n1.d.slice(n1.d.length / 2, n1.d.length);\n h1 = [...h1].reverse();\n let z1 = Y.hoverPane.axis;\n b1 = q(b1, A1, l1, z1), (h1 = q(h1, A1, l1, z1)) && (h1[0][0] = "L"), h1 = [...h1].reverse(), n1.d = b1.concat(h1), U = "path";\n }\n }\n _.attrs = n1, _.shapeType = U;\n }\n }\n function E() {\n let _ = this.chart;\n _.polar && (this.polar = new a1(this), _.inverted && (this.isRadialSeries = !0, this.is("column") && (this.isRadialBar = !0)));\n }\n function L() {\n if (this.chart.polar && this.xAxis) {\n let { xAxis: _, yAxis: Y } = this, D = this.chart;\n this.kdByAngle = D.tooltip && D.tooltip.shared, this.kdByAngle || D.inverted ? this.searchPoint = w : this.options.findNearestPointBy = "xy";\n let H = this.points, G = H.length;\n for (; G--; )\n this.is("column") || this.is("columnrange") || this.polar.toXY(H[G]), D.hasParallelCoordinates || this.yAxis.reversed || (g(H[G].y, Number.MIN_VALUE) < Y.min || H[G].x < _.min || H[G].x > _.max ? (H[G].isNull = !0, H[G].plotY = NaN) : H[G].isNull = H[G].isValid && !H[G].isValid());\n this.hasClipCircleSetter || (this.hasClipCircleSetter = !!this.eventsToUnbind.push(u(this, "afterRender", function() {\n let J;\n D.polar && this.options.clip !== !1 && (J = this.yAxis.pane.center, this.clipCircle ? this.clipCircle.animate({ x: J[0], y: J[1], r: J[2] / 2, innerR: J[3] / 2 }) : this.clipCircle = function(F, V, Q, Z, t1) {\n let n1 = v(), U = F.createElement("clipPath").attr({ id: n1 }).add(F.defs), e1 = t1 ? F.arc(V, Q, Z, t1, 0, 2 * Math.PI).add(U) : F.circle(V, Q, Z).add(U);\n return e1.id = n1, e1.clipPath = U, e1;\n }(D.renderer, J[0], J[1], J[2] / 2, J[3] / 2), this.group.clip(this.clipCircle), this.setClip = i.noop);\n })));\n }\n }\n function w(_) {\n let Y = this.chart, D = this.xAxis, H = this.yAxis, G = D.pane && D.pane.center, J = _.chartX - (G && G[0] || 0) - Y.plotLeft, F = _.chartY - (G && G[1] || 0) - Y.plotTop, V = Y.inverted ? { clientX: _.chartX - H.pos, plotY: _.chartY - D.pos } : { clientX: 180 + -180 / Math.PI * Math.atan2(J, F) };\n return this.searchKDTree(V);\n }\n function q(_, Y, D, H) {\n let G = H.tickInterval, J = H.tickPositions, F = b(J, (Q) => Q >= D), V = b([...J].reverse(), (Q) => Q <= Y);\n return h(F) || (F = J[J.length - 1]), h(V) || (V = J[0], F += G, _[0][0] = "L", _.unshift(_[_.length - 3])), (_ = _.slice(J.indexOf(V), J.indexOf(F) + 1))[0][0] = "M", _;\n }\n function S(_, Y) {\n return b(this.pane || [], (D) => D.options.id === Y) || _.call(this, Y);\n }\n function B(_, Y, D, H, G, J) {\n let F, V, Q, Z = this.chart, t1 = g(H.inside, !!this.options.stacking);\n if (Z.polar) {\n if (F = Y.rectPlotX / Math.PI * 180, Z.inverted)\n this.forceDL = Z.isInsidePlot(Y.plotX, Y.plotY), t1 && Y.shapeArgs ? (V = Y.shapeArgs, G = C(G, { x: (Q = this.yAxis.postTranslate(((V.start || 0) + (V.end || 0)) / 2 - this.xAxis.startAngleRad, Y.barX + Y.pointWidth / 2)).x - Z.plotLeft, y: Q.y - Z.plotTop })) : Y.tooltipPos && (G = C(G, { x: Y.tooltipPos[0], y: Y.tooltipPos[1] })), H.align = g(H.align, "center"), H.verticalAlign = g(H.verticalAlign, "middle");\n else {\n var n1;\n let U, e1;\n (n1 = H).align === null && (U = F > 20 && F < 160 ? "left" : F > 200 && F < 340 ? "right" : "center", n1.align = U), n1.verticalAlign === null && (e1 = F < 45 || F > 315 ? "bottom" : F > 135 && F < 225 ? "top" : "middle", n1.verticalAlign = e1), H = n1;\n }\n a.prototype.alignDataLabel.call(this, Y, D, H, G, J), this.isRadialBar && Y.shapeArgs && Y.shapeArgs.start === Y.shapeArgs.end ? D.hide() : D.show();\n } else\n _.call(this, Y, D, H, G, J);\n }\n function I() {\n let _ = this.options, Y = _.stacking, D = this.chart, H = this.xAxis, G = this.yAxis, J = G.reversed, F = G.center, V = H.startAngleRad, Q = H.endAngleRad - V, Z = _.threshold, t1 = 0, n1, U, e1, o1, u1, M1 = 0, A1 = 0, l1, b1, h1, z1, O1, m1, L1, y1;\n if (H.isRadial)\n for (e1 = (n1 = this.points).length, o1 = G.translate(G.min), u1 = G.translate(G.max), Z = _.threshold || 0, D.inverted && M(Z) && h(t1 = G.translate(Z)) && (t1 < 0 ? t1 = 0 : t1 > Q && (t1 = Q), this.translatedThreshold = t1 + V); e1--; ) {\n if (m1 = (U = n1[e1]).barX, b1 = U.x, h1 = U.y, U.shapeType = "arc", D.inverted) {\n U.plotY = G.translate(h1), Y && G.stacking ? (O1 = G.stacking.stacks[(h1 < 0 ? "-" : "") + this.stackKey], this.visible && O1 && O1[b1] && !U.isNull && (z1 = O1[b1].points[this.getStackIndicator(void 0, b1, this.index).key], M1 = G.translate(z1[0]), A1 = G.translate(z1[1]), h(M1) && (M1 = c.clamp(M1, 0, Q)))) : (M1 = t1, A1 = U.plotY), M1 > A1 && (A1 = [M1, M1 = A1][0]), J ? A1 > o1 ? A1 = o1 : M1 < u1 ? M1 = u1 : (M1 > o1 || A1 < u1) && (M1 = A1 = Q) : M1 < o1 ? M1 = o1 : A1 > u1 ? A1 = u1 : (A1 < o1 || M1 > u1) && (M1 = A1 = 0), G.min > G.max && (M1 = A1 = J ? Q : 0), M1 += V, A1 += V, F && (U.barX = m1 += F[3] / 2), L1 = Math.max(m1, 0), y1 = Math.max(m1 + U.pointWidth, 0);\n let B1 = _.borderRadius, T1 = O((typeof B1 == "object" ? B1.radius : B1) || 0, y1 - L1);\n U.shapeArgs = { x: F[0], y: F[1], r: y1, innerR: L1, start: M1, end: A1, borderRadius: T1 }, U.opacity = M1 === A1 ? 0 : void 0, U.plotY = (h(this.translatedThreshold) && (M1 < this.translatedThreshold ? M1 : A1)) - V;\n } else\n M1 = m1 + V, U.shapeArgs = this.polar.arc(U.yBottom, U.plotY, M1, M1 + U.pointWidth), U.shapeArgs.borderRadius = 0;\n this.polar.toXY(U), D.inverted ? (l1 = G.postTranslate(U.rectPlotY, m1 + U.pointWidth / 2), U.tooltipPos = [l1.x - D.plotLeft, l1.y - D.plotTop]) : U.tooltipPos = [U.plotX, U.plotY], F && (U.ttBelow = U.plotY > F[1]);\n }\n }\n function P(_, Y) {\n let D, H, G = this;\n if (this.chart.polar) {\n Y = Y || this.points;\n for (let F = 0; F < Y.length; F++)\n if (!Y[F].isNull) {\n D = F;\n break;\n }\n this.options.connectEnds !== !1 && D !== void 0 && (this.connectEnds = !0, Y.splice(Y.length, 0, Y[D]), H = !0), Y.forEach((F) => {\n F.polarPlotY === void 0 && G.polar.toXY(F);\n });\n }\n let J = _.apply(this, [].slice.call(arguments, 1));\n return H && Y.pop(), J;\n }\n function k(_, Y) {\n let D = this.chart, H = { xAxis: [], yAxis: [] };\n return D.polar ? D.axes.forEach((G) => {\n if (G.coll === "colorAxis")\n return;\n let J = G.isXAxis, F = G.center, V = Y.chartX - F[0] - D.plotLeft, Q = Y.chartY - F[1] - D.plotTop;\n H[J ? "xAxis" : "yAxis"].push({ axis: G, value: G.translate(J ? Math.PI - Math.atan2(V, Q) : Math.sqrt(Math.pow(V, 2) + Math.pow(Q, 2)), !0) });\n }) : H = _.call(this, Y), H;\n }\n function K(_, Y) {\n this.chart.polar || _.call(this, Y);\n }\n function $(_, Y) {\n let D = this, H = this.chart, G = this.group, J = this.markerGroup, F = this.xAxis && this.xAxis.center, V = H.plotLeft, Q = H.plotTop, Z = this.options.animation, t1, n1, U, e1, o1, u1;\n H.polar ? D.isRadialBar ? Y || (D.startAngleRad = g(D.translatedThreshold, D.xAxis.startAngleRad), i.seriesTypes.pie.prototype.animate.call(D, Y)) : (Z = p(Z), D.is("column") ? Y || (n1 = F[3] / 2, D.points.forEach((M1) => {\n U = M1.graphic, o1 = (e1 = M1.shapeArgs) && e1.r, u1 = e1 && e1.innerR, U && e1 && (U.attr({ r: n1, innerR: n1 }), U.animate({ r: o1, innerR: u1 }, D.options.animation));\n })) : Y ? (t1 = { translateX: F[0] + V, translateY: F[1] + Q, scaleX: 1e-3, scaleY: 1e-3 }, G.attr(t1), J && J.attr(t1)) : (t1 = { translateX: V, translateY: Q, scaleX: 1, scaleY: 1 }, G.animate(t1, Z), J && J.animate(t1, Z))) : _.call(this, Y);\n }\n function j(_, Y, D, H) {\n let G, J;\n if (this.chart.polar)\n if (H) {\n let F = (J = function Q(Z, t1, n1, U) {\n let e1, o1, u1, M1, A1, l1, b1 = U ? 1 : 0, h1 = (e1 = t1 >= 0 && t1 <= Z.length - 1 ? t1 : t1 < 0 ? Z.length - 1 + t1 : 0) - 1 < 0 ? Z.length - (1 + b1) : e1 - 1, z1 = e1 + 1 > Z.length - 1 ? b1 : e1 + 1, O1 = Z[h1], m1 = Z[z1], L1 = O1.plotX, y1 = O1.plotY, B1 = m1.plotX, T1 = m1.plotY, F1 = Z[e1].plotX, X1 = Z[e1].plotY;\n o1 = (1.5 * F1 + L1) / 2.5, u1 = (1.5 * X1 + y1) / 2.5, M1 = (1.5 * F1 + B1) / 2.5, A1 = (1.5 * X1 + T1) / 2.5;\n let G1 = Math.sqrt(Math.pow(o1 - F1, 2) + Math.pow(u1 - X1, 2)), Q1 = Math.sqrt(Math.pow(M1 - F1, 2) + Math.pow(A1 - X1, 2)), K1 = Math.atan2(u1 - X1, o1 - F1);\n l1 = Math.PI / 2 + (K1 + Math.atan2(A1 - X1, M1 - F1)) / 2, Math.abs(K1 - l1) > Math.PI / 2 && (l1 -= Math.PI), o1 = F1 + Math.cos(l1) * G1, u1 = X1 + Math.sin(l1) * G1;\n let n0 = { rightContX: M1 = F1 + Math.cos(Math.PI + l1) * Q1, rightContY: A1 = X1 + Math.sin(Math.PI + l1) * Q1, leftContX: o1, leftContY: u1, plotX: F1, plotY: X1 };\n return n1 && (n0.prevPointCont = Q(Z, h1, !1, U)), n0;\n }(Y, H, !0, this.connectEnds)).prevPointCont && J.prevPointCont.rightContX, V = J.prevPointCont && J.prevPointCont.rightContY;\n G = ["C", M(F) ? F : J.plotX, M(V) ? V : J.plotY, M(J.leftContX) ? J.leftContX : J.plotX, M(J.leftContY) ? J.leftContY : J.plotY, J.plotX, J.plotY];\n } else\n G = ["M", D.plotX, D.plotY];\n else\n G = _.call(this, Y, D, H);\n return G;\n }\n function r1(_, Y, D = this.plotY) {\n if (!this.destroyed) {\n let { plotX: H, series: G } = this, { chart: J } = G;\n return J.polar && M(H) && M(D) ? [H + (Y ? J.plotLeft : 0), D + (Y ? J.plotTop : 0)] : _.call(this, Y, D);\n }\n }\n class a1 {\n static compose(Y, D, H, G, J, F, V, Q, Z, t1) {\n if (s.compose(D, H), l.compose(Y, J), f(d, "Polar")) {\n let n1 = D.prototype, U = F.prototype, e1 = H.prototype, o1 = G.prototype;\n if (u(D, "afterDrawChartBox", z), u(D, "getAxes", W), u(D, "init", N), y(n1, "get", S), y(e1, "getCoordinates", k), y(e1, "pinch", K), u(H, "getSelectionMarkerAttrs", x), u(H, "getSelectionBox", T), u(G, "afterInit", E), u(G, "afterTranslate", L, { order: 2 }), u(G, "afterColumnTranslate", I, { order: 4 }), y(o1, "animate", $), y(U, "pos", r1), Q) {\n let u1 = Q.prototype;\n y(u1, "alignDataLabel", B), y(u1, "animate", $);\n }\n if (Z && y(Z.prototype, "getGraphPath", P), t1) {\n let u1 = t1.prototype;\n y(u1, "getPointSpline", j), V && (V.prototype.getPointSpline = u1.getPointSpline);\n }\n }\n }\n constructor(Y) {\n this.series = Y;\n }\n arc(Y, D, H, G) {\n let J = this.series, F = J.xAxis.center, V = J.yAxis.len, Q = F[3] / 2, Z = V - D + Q, t1 = V - g(Y, V) + Q;\n return J.yAxis.reversed && (Z < 0 && (Z = Q), t1 < 0 && (t1 = Q)), { x: F[0], y: F[1], r: Z, innerR: t1, start: H, end: G };\n }\n toXY(Y) {\n let D = this.series, H = D.chart, G = D.xAxis, J = D.yAxis, F = Y.plotX, V = H.inverted, Q = Y.y, Z = Y.plotY, t1 = V ? F : J.len - Z, n1;\n if (V && D && !D.isRadialBar && (Y.plotY = Z = M(Q) ? J.translate(Q) : 0), Y.rectPlotX = F, Y.rectPlotY = Z, J.center && (t1 += J.center[3] / 2), M(Z)) {\n let U = V ? J.postTranslate(Z, t1) : G.postTranslate(F, t1);\n Y.plotX = Y.polarPlotX = U.x - H.plotLeft, Y.plotY = Y.polarPlotY = U.y - H.plotTop;\n }\n D.kdByAngle ? ((n1 = (F / Math.PI * 180 + G.pane.options.startAngle) % 360) < 0 && (n1 += 360), Y.clientX = n1) : Y.clientX = Y.plotX;\n }\n }\n return a1;\n }), n(r, "Core/Axis/WaterfallAxis.js", [r["Core/Globals.js"], r["Core/Axis/Stacking/StackItem.js"], r["Core/Utilities.js"]], function(o, i, a) {\n var s;\n let { composed: l } = o, { addEvent: c, objectEach: p, pushUnique: d } = a;\n return function(u) {\n function h() {\n let f = this.waterfall.stacks;\n f && (f.changed = !1, delete f.alreadyChanged);\n }\n function b() {\n let f = this.options.stackLabels;\n f && f.enabled && this.waterfall.stacks && this.waterfall.renderStackTotals();\n }\n function M() {\n this.waterfall || (this.waterfall = new g(this));\n }\n function C() {\n let f = this.axes;\n for (let O of this.series)\n if (O.options.stacking) {\n for (let m of f)\n m.isXAxis || (m.waterfall.stacks.changed = !0);\n break;\n }\n }\n u.compose = function(f, O) {\n d(l, "Axis.Waterfall") && (c(f, "init", M), c(f, "afterBuildStacks", h), c(f, "afterRender", b), c(O, "beforeRedraw", C));\n };\n class g {\n constructor(O) {\n this.axis = O, this.stacks = { changed: !1 };\n }\n renderStackTotals() {\n let O = this.axis, m = O.waterfall.stacks, v = O.stacking && O.stacking.stackTotalGroup, y = new i(O, O.options.stackLabels || {}, !1, 0, void 0);\n this.dummyStackItem = y, v && p(m, (z) => {\n p(z, (N, W) => {\n y.total = N.stackTotal, y.x = +W, N.label && (y.label = N.label), i.prototype.render.call(y, v), N.label = y.label, delete y.label;\n });\n }), y.total = null;\n }\n }\n u.Composition = g;\n }(s || (s = {})), s;\n }), n(r, "Series/Waterfall/WaterfallPoint.js", [r["Series/Column/ColumnSeries.js"], r["Core/Series/Point.js"], r["Core/Utilities.js"]], function(o, i, a) {\n let { isNumber: s } = a;\n class l extends o.prototype.pointClass {\n getClassName() {\n let p = i.prototype.getClassName.call(this);\n return this.isSum ? p += " highcharts-sum" : this.isIntermediateSum && (p += " highcharts-intermediate-sum"), p;\n }\n isValid() {\n return s(this.y) || this.isSum || !!this.isIntermediateSum;\n }\n }\n return l;\n }), n(r, "Series/Waterfall/WaterfallSeriesDefaults.js", [], function() {\n return { dataLabels: { inside: !0 }, lineWidth: 1, lineColor: "#333333", dashStyle: "Dot", borderColor: "#333333", states: { hover: { lineWidthPlus: 0 } } };\n }), n(r, "Series/Waterfall/WaterfallSeries.js", [r["Core/Series/SeriesRegistry.js"], r["Core/Utilities.js"], r["Core/Axis/WaterfallAxis.js"], r["Series/Waterfall/WaterfallPoint.js"], r["Series/Waterfall/WaterfallSeriesDefaults.js"]], function(o, i, a, s, l) {\n let { column: c, line: p } = o.seriesTypes, { addEvent: d, arrayMax: u, arrayMin: h, correctFloat: b, crisp: M, extend: C, isNumber: g, merge: f, objectEach: O, pick: m } = i;\n function v(z, N) {\n return Object.hasOwnProperty.call(z, N);\n }\n class y extends c {\n generatePoints() {\n c.prototype.generatePoints.apply(this);\n for (let N = 0, W = this.points.length; N < W; N++) {\n let T = this.points[N], x = this.processedYData[N];\n g(x) && (T.isIntermediateSum || T.isSum) && (T.y = b(x));\n }\n }\n processData(N) {\n let W, T, x, E, L, w, q = this.options, S = this.yData, B = q.data, I = S.length, P = q.threshold || 0;\n x = T = E = L = 0;\n for (let k = 0; k < I; k++)\n w = S[k], W = B && B[k] ? B[k] : {}, w === "sum" || W.isSum ? S[k] = b(x) : w === "intermediateSum" || W.isIntermediateSum ? (S[k] = b(T), T = 0) : (x += w, T += w), E = Math.min(x, E), L = Math.max(x, L);\n super.processData.call(this, N), q.stacking || (this.dataMin = E + P, this.dataMax = L);\n }\n toYData(N) {\n return N.isSum ? "sum" : N.isIntermediateSum ? "intermediateSum" : N.y;\n }\n updateParallelArrays(N, W) {\n super.updateParallelArrays.call(this, N, W), (this.yData[0] === "sum" || this.yData[0] === "intermediateSum") && (this.yData[0] = null);\n }\n pointAttribs(N, W) {\n let T = this.options.upColor;\n T && !N.options.color && g(N.y) && (N.color = N.y > 0 ? T : void 0);\n let x = c.prototype.pointAttribs.call(this, N, W);\n return delete x.dashstyle, x;\n }\n getGraphPath() {\n return [["M", 0, 0]];\n }\n getCrispPath() {\n var S;\n let N = this.data.filter((B) => g(B.y)), W = this.yAxis, T = N.length, x = ((S = this.graph) == null ? void 0 : S.strokeWidth()) || 0, E = this.xAxis.reversed, L = this.yAxis.reversed, w = this.options.stacking, q = [];\n for (let B = 1; B < T; B++) {\n if (!(this.options.connectNulls || g(this.data[N[B].index - 1].y)))\n continue;\n let I = N[B].box, P = N[B - 1], k = P.y || 0, K = N[B - 1].box;\n if (!I || !K)\n continue;\n let $ = W.waterfall.stacks[this.stackKey], j = k > 0 ? -K.height : 0;\n if ($ && K && I) {\n let r1, a1 = $[B - 1];\n if (w) {\n let _ = a1.connectorThreshold;\n r1 = M(W.translate(_, !1, !0, !1, !0) + (L ? j : 0), x);\n } else\n r1 = M(K.y + (P.minPointLengthOffset || 0), x);\n q.push(["M", (K.x || 0) + (E ? 0 : K.width || 0), r1], ["L", (I.x || 0) + (E && I.width || 0), r1]);\n }\n if (K && q.length && (!w && k < 0 && !L || k > 0 && L)) {\n let r1 = q[q.length - 2];\n r1 && typeof r1[2] == "number" && (r1[2] += K.height || 0);\n let a1 = q[q.length - 1];\n a1 && typeof a1[2] == "number" && (a1[2] += K.height || 0);\n }\n }\n return q;\n }\n drawGraph() {\n p.prototype.drawGraph.call(this), this.graph && this.graph.attr({ d: this.getCrispPath() });\n }\n setStackedPoints(N) {\n var G;\n let W = this.options, T = (G = N.waterfall) == null ? void 0 : G.stacks, x = W.threshold || 0, E = this.stackKey, L = this.xData, w = L.length, q = x, S = q, B, I = 0, P = 0, k = 0, K, $, j, r1, a1, _, Y, D, H = (J, F, V, Q) => {\n if (B) {\n if (K)\n for (; V < K; V++)\n B.stackState[V] += Q;\n else\n B.stackState[0] = J, K = B.stackState.length;\n B.stackState.push(B.stackState[K - 1] + F);\n }\n };\n if (N.stacking && T && this.reserveSpace()) {\n D = T.changed, (Y = T.alreadyChanged) && 0 > Y.indexOf(E) && (D = !0), T[E] || (T[E] = {});\n let J = T[E];\n if (J)\n for (let F = 0; F < w; F++)\n (!J[_ = L[F]] || D) && (J[_] = { negTotal: 0, posTotal: 0, stackTotal: 0, threshold: 0, stateIndex: 0, stackState: [], label: D && J[_] ? J[_].label : void 0 }), B = J[_], (a1 = this.yData[F]) >= 0 ? B.posTotal += a1 : B.negTotal += a1, r1 = W.data[F], $ = B.absolutePos = B.posTotal, j = B.absoluteNeg = B.negTotal, B.stackTotal = $ + j, K = B.stackState.length, r1 && r1.isIntermediateSum ? (H(k, P, 0, k), k = P, P = x, q ^= S, S ^= q, q ^= S) : r1 && r1.isSum ? (H(x, I, K, 0), q = x) : (H(q, a1, 0, I), r1 && (I += a1, P += a1)), B.stateIndex++, B.threshold = q, q += B.stackTotal;\n T.changed = !1, T.alreadyChanged || (T.alreadyChanged = []), T.alreadyChanged.push(E);\n }\n }\n getExtremes() {\n let N, W, T, x = this.options.stacking;\n return x ? (N = this.yAxis.waterfall.stacks, W = this.stackedYNeg = [], T = this.stackedYPos = [], x === "overlap" ? O(N[this.stackKey], function(E) {\n W.push(h(E.stackState)), T.push(u(E.stackState));\n }) : O(N[this.stackKey], function(E) {\n W.push(E.negTotal + E.threshold), T.push(E.posTotal + E.threshold);\n }), { dataMin: h(W), dataMax: u(T) }) : { dataMin: this.dataMin, dataMax: this.dataMax };\n }\n }\n return y.defaultOptions = f(c.defaultOptions, l), y.compose = a.compose, C(y.prototype, { pointValKey: "y", showLine: !0, pointClass: s }), d(y, "afterColumnTranslate", function() {\n let { options: z, points: N, yAxis: W } = this, T = m(z.minPointLength, 5), x = T / 2, E = z.threshold || 0, L = z.stacking, w = W.waterfall.stacks[this.stackKey], q = E, S = E, B, I, P, k;\n for (let K = 0; K < N.length; K++) {\n let $ = N[K], j = this.processedYData[K], r1 = C({ x: 0, y: 0, width: 0, height: 0 }, $.shapeArgs || {});\n $.box = r1;\n let a1 = [0, j], _ = $.y || 0;\n if (L) {\n if (w) {\n let H = w[K];\n L === "overlap" ? (I = H.stackState[H.stateIndex--], B = _ >= 0 ? I : I - _, v(H, "absolutePos") && delete H.absolutePos, v(H, "absoluteNeg") && delete H.absoluteNeg) : (_ >= 0 ? (I = H.threshold + H.posTotal, H.posTotal -= _, B = I) : (I = H.threshold + H.negTotal, H.negTotal -= _, B = I - _), !H.posTotal && g(H.absolutePos) && v(H, "absolutePos") && (H.posTotal = H.absolutePos, delete H.absolutePos), !H.negTotal && g(H.absoluteNeg) && v(H, "absoluteNeg") && (H.negTotal = H.absoluteNeg, delete H.absoluteNeg)), $.isSum || (H.connectorThreshold = H.threshold + H.stackTotal), W.reversed ? (P = _ >= 0 ? B - _ : B + _, k = B) : (P = B, k = B - _), $.below = P <= E, r1.y = W.translate(P, !1, !0, !1, !0), r1.height = Math.abs(r1.y - W.translate(k, !1, !0, !1, !0));\n let G = W.waterfall.dummyStackItem;\n G && (G.x = K, G.label = w[K].label, G.setOffset(this.pointXOffset || 0, this.barW || 0, this.stackedYNeg[K], this.stackedYPos[K], void 0, this.xAxis));\n }\n } else\n B = Math.max(S, S + _) + a1[0], r1.y = W.translate(B, !1, !0, !1, !0), $.isSum ? (r1.y = W.translate(a1[1], !1, !0, !1, !0), r1.height = Math.min(W.translate(a1[0], !1, !0, !1, !0), W.len) - r1.y, $.below = a1[1] <= E) : $.isIntermediateSum ? (_ >= 0 ? (P = a1[1] + q, k = q) : (P = q, k = a1[1] + q), W.reversed && (P ^= k, k ^= P, P ^= k), r1.y = W.translate(P, !1, !0, !1, !0), r1.height = Math.abs(r1.y - Math.min(W.translate(k, !1, !0, !1, !0), W.len)), q += a1[1], $.below = P <= E) : (r1.height = j > 0 ? W.translate(S, !1, !0, !1, !0) - r1.y : W.translate(S, !1, !0, !1, !0) - W.translate(S - j, !1, !0, !1, !0), S += j, $.below = S < E), r1.height < 0 && (r1.y += r1.height, r1.height *= -1);\n $.plotY = r1.y, $.yBottom = r1.y + r1.height, r1.height <= T && !$.isNull ? (r1.height = T, r1.y -= x, $.yBottom = r1.y + r1.height, $.plotY = r1.y, _ < 0 ? $.minPointLengthOffset = -x : $.minPointLengthOffset = x) : ($.isNull && (r1.width = 0), $.minPointLengthOffset = 0);\n let Y = $.plotY + ($.negative ? r1.height : 0);\n $.below && ($.plotY += r1.height), $.tooltipPos && (this.chart.inverted ? $.tooltipPos[0] = W.len - Y : $.tooltipPos[1] = Y), $.isInside = this.isPointInside($);\n let D = M($.yBottom, this.borderWidth);\n r1.y = M(r1.y, this.borderWidth), r1.height = D - r1.y, f(!0, $.shapeArgs, r1);\n }\n }, { order: 2 }), o.registerSeriesType("waterfall", y), y;\n }), n(r, "masters/highcharts-more.src.js", [r["Core/Globals.js"], r["Core/Series/SeriesRegistry.js"], r["Extensions/Pane/Pane.js"], r["Series/Bubble/BubbleSeries.js"], r["Series/PackedBubble/PackedBubbleSeries.js"], r["Series/PolarComposition.js"], r["Core/Axis/RadialAxis.js"], r["Series/Waterfall/WaterfallSeries.js"]], function(o, i, a, s, l, c, p, d) {\n return o.RadialAxis = p, s.compose(o.Axis, o.Chart, o.Legend), l.compose(o.Axis, o.Chart, o.Legend), a.compose(o.Chart, o.Pointer), c.compose(o.Axis, o.Chart, o.Pointer, o.Series, o.Tick, o.Point, i.seriesTypes.areasplinerange, i.seriesTypes.column, i.seriesTypes.line, i.seriesTypes.spline), d.compose(o.Axis, o.Chart), o;\n });\n });\n})(PC);\nvar tZ = PC.exports;\nconst rZ = /* @__PURE__ */ $t(tZ);\nlet nZ = {\n credits: {\n enabled: !1\n }\n};\nconst VC = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({\n Highcharts: ci\n}), oZ = ({ children: e }) => {\n const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (o) => {\n var i = o.relativeLength;\n o.Series.prototype.drawLegendSymbol = o.seriesTypes.column.prototype.drawLegendSymbol, o.wrap(\n o.seriesTypes.column.prototype,\n "translate",\n function(a) {\n var s = this.options, l = s.topMargin || 0, c = s.bottomMargin || 0;\n a.call(this), this.points.forEach(function(p) {\n var d = p.shapeArgs, u = d.width, h = d.height, b = d.x, M = d.y, C = i(s.borderRadiusTopLeft || 0, u), g = i(s.borderRadiusTopRight || 0, u), f = i(s.borderRadiusBottomRight || 0, u), O = i(s.borderRadiusBottomLeft || 0, u);\n if ((p == null ? void 0 : p.y) < 0 && (C > 0 && (O = C, C = 0), g > 0 && (f = g, g = 0)), C || g || f || O) {\n var m = Math.min(u, h) / 2;\n C > m && (C = m), g > m && (g = m), f > m && (f = m), O > m && (O = m), p.dlBox = p.shapeArgs, p.shapeType = "path", p.shapeArgs = {\n d: [\n ["M", b + C, M + l],\n // top side\n ["L", b + u - g, M + l],\n // top right corner\n [\n "C",\n b + u - g / 2,\n M,\n b + u,\n M + g / 2,\n b + u,\n M + g\n ],\n // right side\n ["L", b + u, M + h - f],\n // bottom right corner\n [\n "C",\n b + u,\n M + h - f / 2,\n b + u - f / 2,\n M + h,\n b + u - f,\n M + h + c\n ],\n // bottom side\n ["L", b + O, M + h + c],\n // bottom left corner\n [\n "C",\n b + O / 2,\n M + h,\n b,\n M + h - O / 2,\n b,\n M + h - O\n ],\n // left side\n ["L", b, M + C],\n // top left corner\n [\n "C",\n b,\n M + C / 2,\n b + C / 2,\n M,\n b + C,\n M\n ],\n ["Z"]\n ]\n };\n }\n });\n }\n ), r(!0);\n },\n [ci, t]\n );\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n n(ci);\n }, []), /* @__PURE__ */ A(\n VC.Provider,\n {\n value: {\n isRenderChart: t,\n Highcharts: ci,\n defaultSetting: nZ\n },\n children: e\n }\n );\n};\nrZ(ci);\nci.setOptions({\n colors: _K\n});\neZ(ci);\nconst Ua = () => {\n const e = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(VC);\n if (e === void 0)\n throw new Error("Need to have Provider wrapped.");\n return e;\n}, iZ = (e) => typeof e == "number" && Number(e).toFixed(2), aZ = (e, t) => (t ? Number(e) : Number(e).toFixed(2)).toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ",");\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n`;\nconst sZ = (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.keyframes)`\n to {\n background-position: 100%;\n }\n`, lZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { colors: e },\n radius: t,\n width: r,\n height: n,\n circle: o,\n $animate: i,\n $visible: a\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: block;\n position: relative;\n overflow: ${a ? "hidden" : "none"};\n background-color: ${e.dataTable.dataTableLoaderBg};\n border-radius: ${o ? "50%" : `${t}px` || "4px"};\n height: ${typeof n == "number" ? `${n}px` : n || "auto"};\n width: ${`${r}px` || "100%"};\n\n ${i && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:after {\n content: \'\';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background: linear-gradient(\n 0.25turn,\n transparent,\n ${e.dataTable.dataTableLoaderGradient},\n transparent\n ),\n linear-gradient(\n ${e.dataTable.dataTableLoaderBg},\n ${e.dataTable.dataTableLoaderBg}\n ),\n radial-gradient(\n 38px circle at 19px 19px,\n ${e.dataTable.dataTableLoaderGradient} 50%,\n transparent 51%\n ),\n linear-gradient(\n ${e.dataTable.dataTableLoaderBg},\n ${e.dataTable.dataTableLoaderBg}\n );\n background-repeat: no-repeat;\n background-size: 50px;\n background-position: -350px;\n animation: ${sZ} 1.7s infinite linear;\n }\n `}\n\n ${!a && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: transparent;\n &:after {\n content: none;\n }\n `}\n `\n), cZ = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n visibility: ${(e) => e.$visible ? "hidden" : "visible"};\n`, K2 = ({\n visible: e = !0,\n animate: t = !0,\n children: r,\n ...n\n}) => /* @__PURE__ */ A(\n lZ,\n {\n ...n,\n $visible: e,\n $animate: t,\n className: "skeleton-container",\n children: /* @__PURE__ */ A(cZ, { $visible: e, className: "skeleton-child-container", children: r })\n }\n), pZ = ({\n setColumnFilters: e,\n tableData: t,\n maxVisibleFilters: r = 5,\n defaultColumnsState: n,\n allColumnsState: o,\n columnsState: i,\n handleChangeColumnOrder: a,\n handleColumnsStateChange: s,\n handleResetColumnOrder: l,\n resetColumnsState: c,\n handleColumnsHide: p,\n rightSideContainer: d,\n columnFilters: u,\n tableConfig: h,\n loading: b,\n columnVisibility: M,\n showRightSideContent: C,\n tabsMaxHeight: g,\n columnChooserActionLabel: f,\n enableFilterIndicatorDots: O,\n defaultFilterValues: m,\n filteredDataHandler: v\n}) => {\n var Q, Z, t1, n1;\n const [y, z] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}), [N, W] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [T, x] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""), [E, L] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(n), [w, q] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [S, B] = Ta(!1);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n n && i && o && (!Jb(o, i) || !Jb(n, E)) && q(!0);\n }, [i, n, E, o]);\n const I = (U) => {\n const e1 = new Set(E);\n Object.entries(U).forEach(([o1, u1]) => {\n u1 ? e1.add(o1) : e1.delete(o1);\n }), L(e1);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n I(M);\n }, [M]);\n const P = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (U) => () => {\n const e1 = new Set(E);\n e1.has(U) ? e1.delete(U) : e1.add(U), L(e1);\n },\n [E]\n ), k = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n a();\n const U = {};\n i.items.forEach((e1) => {\n U[e1] = E.has(e1);\n }), p(U), B();\n }, [\n i,\n a,\n p,\n E,\n B\n ]), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n L(n), l(), c();\n }, [n, l, c]), $ = (U, e1) => {\n z((o1) => ({\n ...o1,\n [U]: e1\n }));\n }, j = (U) => {\n z((e1) => {\n const o1 = { ...e1 };\n return delete o1[U], r1(o1), o1;\n });\n }, r1 = (U = y) => {\n const e1 = Object.entries(U).map(([o1, u1]) => ({\n id: o1,\n value: u1\n }));\n e(e1);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n v && v(u);\n }, [u]);\n const a1 = (U, e1) => {\n z((M1) => ({\n ...M1,\n [U]: e1\n }));\n const o1 = {\n ...y,\n [U]: e1\n }, u1 = Object.entries(o1).map(\n ([M1, A1]) => ({\n id: M1,\n value: A1\n })\n );\n e(u1);\n }, _ = /* @__PURE__ */ c1(iU, { children: [\n /* @__PURE__ */ A(\n Tt,\n {\n buttonType: "link",\n size: "sm",\n onClick: () => j(T),\n isDisabled: !y[T],\n children: "Clear"\n }\n ),\n /* @__PURE__ */ c1("div", { children: [\n /* @__PURE__ */ A(\n Tt,\n {\n buttonType: "tertiary",\n size: "sm",\n onClick: () => {\n z({}), e([]), W(!1);\n },\n children: "Clear All"\n }\n ),\n /* @__PURE__ */ A(\n Tt,\n {\n size: "sm",\n onClick: () => {\n r1(), W(!1);\n },\n children: "Apply"\n }\n )\n ] })\n ] }), Y = ((Z = (Q = h == null ? void 0 : h.options) == null ? void 0 : Q.data) == null ? void 0 : Z.length) > 0 || (u == null ? void 0 : u.length) !== 0, D = t.slice(r).length < 1, H = h.getAllColumns().filter((U) => {\n var e1;\n return !((e1 = U == null ? void 0 : U.columnDef) != null && e1.hideFromColumnChooser);\n }).map((U) => {\n var e1;\n return (e1 = U.columnDef) == null ? void 0 : e1.filterLabel;\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if ((m == null ? void 0 : m.length) > 0) {\n let U = {};\n m.map((e1) => {\n U[`${e1.id}`] = e1.value;\n }), z(U);\n }\n }, [m]);\n function G(U, e1) {\n const o1 = U.slice(0, e1), u1 = U.slice(e1);\n return { mainFiltersItems: o1, moreFiltersItems: u1 };\n }\n const { moreFiltersItems: J } = G(t, r), F = (U, e1) => {\n const o1 = Object.keys(U);\n return e1.some(\n (u1) => o1.includes(u1.columnId)\n );\n }, V = () => {\n const U = u.map((o1) => o1.id), e1 = Object.keys(y).filter((o1) => U.includes(o1)).reduce((o1, u1) => (o1[u1] = y[u1], o1), {});\n z(e1);\n };\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n V();\n }, [u, N]), /* @__PURE__ */ c1($F, { className: "action-bar-container", loading: b, children: [\n /* @__PURE__ */ c1(Ha, { columns: 12, alignItems: "end", children: [\n /* @__PURE__ */ A(Nl, { width: 6, children: Y ? /* @__PURE__ */ c1(eU, { children: [\n /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: !D && /* @__PURE__ */ A(\n l2,\n {\n count: F(y, J) ? 10 : 0,\n noDigit: !0,\n children: /* @__PURE__ */ A(\n Rt,\n {\n name: "Filters",\n size: "sm",\n buttonType: "tertiary",\n onClick: () => W(!0),\n isDisabled: D\n }\n )\n }\n )\n }\n ),\n t.slice(0, r).map((U) => U.enableFilter ? /* @__PURE__ */ A(tU, { children: /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: /* @__PURE__ */ A(\n ZF,\n {\n filterData: U,\n handleFilterValue: a1,\n filterValues: y,\n clearFilter: j,\n defaultFilterValues: m\n }\n )\n }\n ) }, U.columnId) : null),\n /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: u.length !== 0 && /* @__PURE__ */ A(_F, { children: /* @__PURE__ */ A(\n Tt,\n {\n buttonType: "link",\n children: "Clear all",\n size: "sm",\n onClick: () => {\n z({}), e([]);\n }\n }\n ) })\n }\n )\n ] }) : null }),\n /* @__PURE__ */ A(Nl, { width: 6, $middle: !0, end: !0, children: /* @__PURE__ */ c1(JF, { children: [\n Y ? /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: d && d\n }\n ) : C ? /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: d && d\n }\n ) : null,\n /* @__PURE__ */ A(S0, { children: Y ? /* @__PURE__ */ A(S0, { children: !!i && /* @__PURE__ */ A(\n K2,\n {\n radius: 4,\n height: b ? W2 : "auto",\n visible: b,\n children: /* @__PURE__ */ A(\n _4,\n {\n button: /* @__PURE__ */ A(\n Rt,\n {\n size: "sm",\n buttonType: "tertiary",\n name: "ColumnOptions",\n onClick: B,\n "aria-label": "Open Draggable sort column List"\n }\n ),\n position: "right",\n isShowed: S,\n isFilterValueChanged: w,\n applyText: "Apply",\n clearText: f,\n width: 352,\n onApplyFilter: k,\n onClearFilter: K,\n handleDropdownShowed: B,\n children: /* @__PURE__ */ A(\n ZK,\n {\n filterNames: H,\n columnsState: i,\n selectedColumns: E,\n handleColumnsStateChange: s,\n handleCheckboxColumnsChange: P,\n pageSize: (n1 = (t1 = h == null ? void 0 : h.getPaginationRowModel()) == null ? void 0 : t1.rows) == null ? void 0 : n1.length\n }\n )\n }\n )\n }\n ) }) : null })\n ] }) })\n ] }),\n /* @__PURE__ */ A(\n kU,\n {\n isOpen: N,\n onClose: () => {\n W(!1);\n },\n title: "More filters",\n size: "md",\n hasCloseButton: !0,\n actionsGroup: _,\n isFilterModal: !0,\n children: /* @__PURE__ */ A(S0, { children: /* @__PURE__ */ A(\n nY,\n {\n filters: t,\n handleFilterValue: $,\n filterValues: y,\n clearFilter: j,\n setClearFilterId: x,\n maxVisibleFilters: r,\n tabsMaxHeight: g,\n enableFilterIndicatorDots: O,\n defaultFilterValues: m\n }\n ) })\n }\n )\n ] });\n}, dZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().button(({ theme: { colors: e, borderRadius: t, spacings: r }, $isDisable: n, $isDropdown: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n max-width: 100%;\n background-color: transparent;\n border: none;\n padding: 0;\n border-radius: 2px;\n &:focus-visible {\n outline: ${e.border.borderFocused} solid 1px;\n }\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${gn} {\n border-top-left-radius: ${t.sm};\n border-bottom-left-radius: ${t.sm};\n padding: ${r.sp6} ${r.sp4} ${r.sp6} ${r.sp8};\n border-top-right-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n ${_o} {\n border-top-right-radius: ${t.sm};\n border-bottom-right-radius: ${t.sm};\n }\n `}\n ${!o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${gn} {\n border-radius: ${t.sm};\n padding: 6px 8px;\n }\n ${_o} {\n border-radius: none;\n }\n `}\n ${gn} {\n cursor: pointer;\n &:hover {\n background-color: ${e.actionButton.actionButtonBgHoverButton};\n }\n &:active {\n background-color: ${e.actionButton.actionButtonBgPressedButton};\n }\n }\n\n ${n && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${gn} {\n pointer-events: none;\n color: ${e.textIcon.textDisabledOnbg};\n cursor: none;\n }\n\n ${_o} {\n pointer-events: none;\n color: ${e.textIcon.textDisabledOnbg};\n svg {\n color: ${e.textIcon.textDisabledOnbg} !important;\n }\n }\n `}\n &:has(${_o}:hover) {\n ${gn}{\n background-color: ${e.actionButton.actionButtonBgHoverDropdown};\n }\n }\n\n &:has(${gn}:hover) {\n ${_o}{\n background-color: ${e.actionButton.actionButtonBgHoverDropdown};\n }\n }\n ${_o} {\n cursor: pointer;\n svg {\n color: ${e.textIcon.textLowemphasis};\n }\n &:hover {\n background-color: ${e.backgrounds.bgHoverPrimary};\n }\n &:active {\n background-color: ${e.actionButton.actionButtonBgPressedDropdown};\n svg {\n color: ${e.textIcon.textPrimary};\n }\n }\n }\n `);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n padding: 0;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n gap: ${e.sp4};\n `);\nconst _o = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: { spacings: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding: ${e.sp12} 6px;\n `), gn = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e, typography: t, lineHeight: r, fontWeight: n }, $iconButton: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n max-width: 100%;\n font-size: ${t.t12};\n line-height: ${r.lh20};\n font-weight: ${n.regular};\n border: none;\n background-color: transparent;\n color: ${e.textIcon.textPrimary};\n border-radius: 2px;\n box-sizing: border-box;\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n height: 32px;\n width: 32px;\n `}\n `\n), AZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: {} }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n `), gA1 = ({\n iconName: e,\n text: t,\n isDisable: r,\n count: n,\n dropDown: o,\n iconRight: i,\n iconLeft: a,\n dropDownBody: s,\n onClick: l,\n ...c\n}) => /* @__PURE__ */ A(dZ, { $isDisable: r, $isDropdown: o, children: e && !o && !t && !a && !i ? n ? /* @__PURE__ */ A(gn, { onClick: l, $iconButton: !0, children: /* @__PURE__ */ A(l2, { ...c, count: n, children: /* @__PURE__ */ A(f0, { name: e, size: "xxxs" }) }) }) : /* @__PURE__ */ A(gn, { onClick: l, $iconButton: !0, children: /* @__PURE__ */ A(f0, { name: e, size: "xxxs" }) }) : /* @__PURE__ */ c1(AZ, { className: "actionBtnDropdown", children: [\n /* @__PURE__ */ c1(gn, { onClick: l, children: [\n !i && a && /* @__PURE__ */ A(f0, { name: e, size: "xxxs" }),\n t,\n !a && i && !o && /* @__PURE__ */ A(f0, { name: e, size: "xxxs" })\n ] }),\n o && !i && a && /* @__PURE__ */ A(\n mn,\n {\n body: s,\n position: "right",\n dropdownBodyWidth: "175px",\n children: /* @__PURE__ */ A(_o, { children: /* @__PURE__ */ A(f0, { name: "ChevronDownDropdown", size: "xxxxs" }) })\n }\n )\n] }) }), zn = {\n INFO: "info",\n SUCCESS: "success",\n ERROR: "error",\n WARNING: "warning"\n}, uZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(({ theme: e, type: t }) => {\n const { colors: r, typography: n, lineHeight: o, borderRadius: i, spacings: a } = e;\n let s, l;\n switch (t) {\n case zn.SUCCESS:\n s = r.textIcon.textAlertSuccess, l = r.backgrounds.bgSuccessSecondary;\n break;\n case zn.WARNING:\n s = r.textIcon.textAlertWarning, l = r.backgrounds.bgWarningSecondary;\n break;\n case zn.ERROR:\n s = r.textIcon.textAlertError, l = r.backgrounds.bgErrorSecondary;\n break;\n case zn.INFO:\n default:\n s = r.textIcon.textAlertInformational, l = r.backgrounds.bgInformationalSecondary;\n }\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n gap: 8px;\n width: 444px;\n max-width: 100%;\n border-radius: ${i.base};\n font-size: ${n.t12};\n line-height: ${o.lh22};\n color: ${s};\n background-color: ${l};\n padding: 5px ${a.sp8};\n `;\n});\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n padding: 32px;\n`;\nconst bZ = ({ text: e, type: t = zn.INFO }, r) => /* @__PURE__ */ c1(uZ, { ref: r, type: t, children: [\n /* @__PURE__ */ A(f0, { name: (() => {\n switch (t) {\n case zn.SUCCESS:\n return "Success";\n case zn.ERROR:\n return "Error";\n case zn.WARNING:\n return "Alert";\n case zn.INFO:\n default:\n return "Info";\n }\n })(), size: "xs" }),\n e\n] }), zA1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(bZ), FC = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().button)`\n span {\n .truncate-text {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 20ch;\n vertical-align: middle;\n }\n }\n\n .icon-system {\n margin-top: 1px;\n }\n`, _b = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)`\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 20ch;\n vertical-align: middle;\n`, UC = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().li)``, hZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().ul(\n ({\n theme: {\n typography: e,\n lineHeight: t,\n fontWeight: r,\n colors: n,\n mixins: o,\n fontFamily: i,\n transitions: a\n }\n }) => {\n const s = n.textIcon.textSecondary, l = n.textIcon.textLowemphasis, c = n.textIcon.textLowemphasis, p = n.textIcon.textLowemphasis;\n return (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${o.listReset};\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n color: ${s};\n ${UC} {\n font-size: ${e.t10};\n line-height: ${t.lh18};\n font-weight: ${r.regular};\n font-family: ${i.base};\n color: ${n.textIcon.textSecondary};\n transition: ${a.base};\n\n &:hover {\n text-shadow: 0px 0px 0px ${n.textIcon.textSecondary};\n font-weight: ${r.medium};\n transition: ${a.base};\n }\n &:active {\n text-shadow: 0px 0px 0px ${n.textIcon.textSecondary};\n }\n }\n ${FC} {\n display: flex;\n align-items: center;\n color: ${l};\n text-decoration: none;\n cursor: pointer;\n border: none;\n padding: 3px 0;\n background: transparent;\n font-family: ${i.base};\n font-size: ${e.t10};\n line-height: ${t.lh18};\n font-weight: ${r.regular};\n transition: ${a.base};\n\n &:hover {\n color: ${c};\n text-shadow: 0px 0px 0px #797980;\n transition: ${a.base};\n font-weight: ${r.medium};\n }\n &:hover {\n color: ${c};\n text-shadow: 0px 0px 0px #797980;\n transition: ${a.base};\n }\n &:focus {\n color: ${c};\n text-decoration: none;\n }\n &:active {\n color: ${p};\n }\n .icon-system {\n width: 9px;\n padding: 3.5px;\n color: ${n.textIcon.textLowemphasis};\n svg {\n width: 9px;\n }\n }\n }\n `;\n }\n), MZ = ({ name: e, to: t }) => {\n const r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [n, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const i = () => {\n r.current && o(\n r.current.scrollWidth > r.current.clientWidth\n );\n };\n return i(), window.addEventListener("resize", i), () => window.removeEventListener("resize", i);\n }, [e]), /* @__PURE__ */ c1(FC, { onClick: t, "data-text": e, children: [\n /* @__PURE__ */ A("span", { children: /* @__PURE__ */ A(v2, { text: n ? e : "", place: "bottom-start", children: /* @__PURE__ */ A("span", { className: "truncate-text", ref: r, children: e }) }) }),\n /* @__PURE__ */ A(f0, { size: "xs", name: "ChevronRight" })\n ] });\n}, fZ = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(\n ({ itemsList: e = [] }, t) => {\n const r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)([]), [n, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\n new Array(e.length).fill(!1)\n );\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const i = () => {\n const a = e.map((s, l) => {\n const c = r.current[l];\n return c ? c.scrollWidth > c.clientWidth : !1;\n });\n o(a);\n };\n return i(), window.addEventListener("resize", i), () => window.removeEventListener("resize", i);\n }, [e]), /* @__PURE__ */ A(hZ, { ref: t, children: e.map(({ name: i, to: a }, s) => {\n const l = n[s];\n return /* @__PURE__ */ A(UC, { children: s !== e.length - 1 ? /* @__PURE__ */ A(MZ, { name: i, to: a }) : l ? /* @__PURE__ */ A(v2, { text: i, place: "bottom-start", children: /* @__PURE__ */ A(_b, { ref: (c) => r.current[s] = c, children: i }) }) : /* @__PURE__ */ A(_b, { ref: (c) => r.current[s] = c, children: i }) }, i);\n }) });\n }\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)``;\nconst H8 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)``, gZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default()(bz)(\n ({ theme: { spacings: e }, $iconRight: t, $iconLeft: r, size: n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n ${!!t && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${H8} {\n padding-right: ${n == "sm" ? "10px" : `${e.sp12}`};\n }\n .icon-system {\n padding: 0px;\n\n height: ${n != "sm" ? "16px" : "12px"};\n\n svg {\n height: ${n != "sm" ? "16px" : "12px"};\n }\n }\n `}\n\n ${!!r && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${H8} {\n padding-left: ${n == "sm" ? "10px" : `${e.sp12}`};\n }\n\n .icon-system {\n padding: 0px;\n\n height: ${n != "sm" ? "16px" : "12px"};\n\n svg {\n height: ${n != "sm" ? "16px" : "12px"};\n }\n }\n `}\n `\n);\nfunction N9(e) {\n const { children: t, ...r } = e;\n return /* @__PURE__ */ A(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, { children: r.buttonType != "mini" && /* @__PURE__ */ c1(gZ, { ...r, children: [\n r.$iconLeft && /* @__PURE__ */ A(f0, { name: r.$iconLeft }),\n /* @__PURE__ */ A(H8, { children: t }),\n r.$iconRight && /* @__PURE__ */ A(f0, { name: r.$iconRight })\n ] }) });\n}\nconst zZ = (e, t) => {\n const { isDisabled: r, ...n } = e;\n return /* @__PURE__ */ A(n9, { ref: t, disabled: r, ...n });\n}, CA1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(zZ);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 504px;\n`;\nconst CZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e }, $isEntity: t }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.backgrounds.bgPrimary};\n min-height: ${t ? "auto" : "303px"};\n `\n), OZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)``), mZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin-top: 8px;\n .scrollbar-container {\n max-height: 303px;\n }\n\n .ps--active-y {\n padding-right: ${e.sp8};\n }\n `\n), vZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n () => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: flex-end;\n `\n), yZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100%;\n label{\n display: none;\n }\n .icon-system{\n svg{\n width: 16px;\n height: 16px;\n color: ${e.textIcon.textLowemphasis};\n }\n }\n `\n), LZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n () => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n justify-content: space-between;\n align-items: center;\n `\n), $b = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n padding-top: ${e.sp8};\n padding-bottom: ${e.sp8};\n `\n), wZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(() => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: 100%;\n height: 304px;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n & > div {\n max-width: 215px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n `), Sc = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({});\nfunction qZ() {\n return /* @__PURE__ */ A(wZ, { children: /* @__PURE__ */ c1("div", { children: [\n /* @__PURE__ */ A(\n l4,\n {\n variant: "heading-xs-medium",\n style: { fontWeight: 500, textAlign: "center" },\n children: "We couldn’t find any matches"\n }\n ),\n /* @__PURE__ */ A(\n l4,\n {\n variant: "body-sm-regular",\n style: { fontWeight: 400, textAlign: "center" },\n children: "There is no result for your search. Try searching for a different client"\n }\n )\n ] }) });\n}\nfunction xZ(e) {\n const {\n children: t,\n actionsGroup: r,\n getSearchValue: n,\n hasActionGroup: o,\n loadingProgress: i\n } = e, a = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Sc), s = i ? i == 100 : !0, l = s && ((t == null ? void 0 : t.length) == 0 || !t) && (a == null ? void 0 : a.searchValue);\n return /* @__PURE__ */ c1(CZ, { $isEntity: a == null ? void 0 : a.isEnity, children: [\n /* @__PURE__ */ c1(OZ, { children: [\n /* @__PURE__ */ A(LZ, { children: /* @__PURE__ */ A(yZ, { children: /* @__PURE__ */ A(\n yc,\n {\n getValue: n,\n value: a == null ? void 0 : a.searchValue,\n placeholder: "Search"\n }\n ) }) }),\n !s && i && /* @__PURE__ */ A($b, { children: /* @__PURE__ */ A(C4, { type: "linear", progress: i }) })\n ] }),\n l ? /* @__PURE__ */ A(qZ, {}) : /* @__PURE__ */ A(S0, { children: s && /* @__PURE__ */ c1(S0, { children: [\n t && /* @__PURE__ */ A(mZ, { children: /* @__PURE__ */ A(ns, { children: t }) }),\n o && /* @__PURE__ */ c1(S0, { children: [\n /* @__PURE__ */ A($b, { children: /* @__PURE__ */ A(a2, {}) }),\n r && /* @__PURE__ */ A(vZ, { children: r })\n ] })\n ] }) })\n ] });\n}\nconst RZ = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n align-items: center;\n height: 24px;\n width: 100%;\n`, YC = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t12};\n font-weight: ${e.fontWeight.light};\n line-height: ${e.lineHeight.lh20};\n color: ${e.colors.textIcon.textPrimary};\n word-break: break-word;\n max-width: 357px;\n padding: 0 4px 0 4px;\n margin: 0;\n transition: ${e.transitions.base};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `\n), BZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { itemSize: e, colors: t, borderRadius: r } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n width: ${e.xs};\n height: ${e.xs};\n overflow: hidden;\n border: 1px solid ${t.backgrounds.whiteSmoke};\n border-radius: ${r.circle};\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n .icon-system{\n color:${t.textIcon.textPrimary};\n }\n svg {\n width: 100%;\n border-radius: ${r.circle};\n }\n `\n), WZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { colors: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n \n .icon-system{\n color:${e.textIcon.textPrimary};\n }\n `\n), EZ = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().img)`\n width: 100%;\n`, SZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, colors: t, itemSize: r, transitions: n }, $isFavourite: o }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n transition: ${n.base};\n width: ${r.sm};\n &:hover {\n transition: ${n.base};\n\n .icon-system {\n color: ${o ? t.backgrounds.intertrustOrange : t.whisper};\n }\n }\n .icon-system {\n color: ${o ? t.backgrounds.intertrustOrange : t.whisper};\n }\n ${ca} {\n &,\n &:hover {\n background-color: transparent;\n }\n\n .icon-system {\n color: ${o ? t.backgrounds.intertrustOrange : t.whisper};\n transition: ${n.base};\n }\n\n svg {\n width: 16px;\n margin: ${e.sp4};\n }\n }\n `\n), kZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({\n theme: { colors: e, spacings: t, borderRadius: r, transitions: n },\n $isFocused: o,\n $isSelected: i\n }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: flex;\n align-items: center;\n padding-left: ${t.sp4};\n padding-right: ${t.sp4};\n transition: ${n.base};\n cursor: pointer;\n justify-content: space-between;\n &:hover {\n background-color: ${e.backgrounds.bgHoverPrimary};\n transition: ${n.base};\n }\n\n ${o && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color: ${e.blue};\n border: 1px solid ${e.blue};\n transition: ${n.base};\n\n ${YC} {\n color: ${e.white};\n transition: ${n.base};\n }\n\n &:hover {\n background-color: ${e.blue};\n }\n `}\n ${i && (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n background-color:${e.backgrounds.bgSelected};\n color:${e.textIcon.textPrimary};\n `}\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 456px;\n`;\nfunction NZ(e) {\n const {\n onFavouriteClick: t,\n imgComponent: r,\n hasFavouriteIcon: n,\n $isFavourite: o = !1,\n onRowClick: i,\n $isFocused: a,\n clientName: s = "",\n img: l,\n clientCode: c,\n selectedClient: p,\n isRecent: d,\n data: u\n } = e, { isEnity: h } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Sc), b = h ? u == null ? void 0 : u.entityName : s, M = h ? u == null ? void 0 : u.entityCode : c, C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (f) => {\n f && f.stopPropagation && f.stopPropagation(), t && t({\n clientCode: c,\n clientName: s\n });\n },\n [t, c, s]\n ), g = () => i && i({\n [h ? "entityCode" : "clientCode"]: M,\n [h ? "entityName" : "clientName"]: b\n }) || null;\n return /* @__PURE__ */ c1(\n kZ,\n {\n $isFocused: a,\n $isFavourite: o,\n $isSelected: p != null && p.clientCode ? (p == null ? void 0 : p.clientCode) == c : !1,\n children: [\n /* @__PURE__ */ c1(RZ, { onClick: g, children: [\n d && /* @__PURE__ */ A(WZ, { children: /* @__PURE__ */ A(f0, { name: "Recent", size: "sm", color: "black" }) }),\n (l || r) && /* @__PURE__ */ c1(BZ, { children: [\n l && /* @__PURE__ */ A(EZ, { src: l }),\n !l && r && /* @__PURE__ */ A(z4, { size: "12px", name: r })\n ] }),\n /* @__PURE__ */ A(YC, { children: b })\n ] }),\n n && /* @__PURE__ */ A(SZ, { $isFavourite: o, children: /* @__PURE__ */ A("div", { onClick: C, children: /* @__PURE__ */ A(f0, { name: "StarSolid", size: "sm" }) }) })\n ]\n }\n );\n}\nconst IZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n &:not(:last-of-type) {\n margin-bottom: ${e.sp4};\n }\n `\n), TZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().p(\n ({ theme: e }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n font-family: ${e.fontFamily.base};\n font-size: ${e.typography.t12};\n line-height: ${e.lineHeight.lh20};\n color:${e.colors.textIcon.textLowemphasis};\n padding: 0 ${e.spacings.sp8};\n margin: 0;\n height: 24px;\n\n `\n), DZ = styled_components__WEBPACK_IMPORTED_MODULE_1___default().ul(\n ({ theme: { mixins: e, colors: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n ${e.listReset};\n\n background-color: ${t.backgrounds.bgPrimary};\n `\n), HZ = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().li)`\n & + & {\n margin-top: ${({ theme: { spacings: e } }) => e.sp8};\n }\n`;\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 504px;\n`;\nfunction PZ(e) {\n const {\n title: t,\n clients: r,\n onRowClick: n,\n onFavouriteClick: o,\n selectedClient: i,\n isRecent: a\n } = e, s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n () => r.map(\n (l, c) => /* @__PURE__ */ A(HZ, { children: /* @__PURE__ */ A(\n NZ,\n {\n onRowClick: n,\n onFavouriteClick: o,\n selectedClient: i,\n ...l,\n isRecent: a,\n data: {\n ...l\n }\n }\n ) }, c)\n ),\n [r, n, o]\n );\n return /* @__PURE__ */ c1(IZ, { children: [\n /* @__PURE__ */ A(TZ, { children: t }),\n /* @__PURE__ */ A(DZ, { children: s() })\n ] });\n}\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 504px;\n`;\nconst VZ = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap:${(e) => e.theme.spacings.sp8}\n`;\nfunction FZ() {\n const e = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Sc);\n return /* @__PURE__ */ c1(VZ, { children: [\n /* @__PURE__ */ A(Tt, { buttonType: "link", size: "sm", onClick: e == null ? void 0 : e.onClearFilter, children: "Clear filter" }),\n /* @__PURE__ */ A(Tt, { size: "sm", onClick: e == null ? void 0 : e.onClientSubmit, children: "Select Client" })\n ] });\n}\nfunction XC(e) {\n const { clientsData: t, onRowClick: r, onFavouriteClick: n, onSubmit: o, getSearchValue: i, defaultSearchValue: a = "", ...s } = e, [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\n (e == null ? void 0 : e.selectedClient) ?? null\n ), [p, d] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(a), u = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (g) => {\n r && r(g), c(g);\n },\n [l]\n ), h = (g) => {\n d(g), i && i(g);\n }, b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n c(null), r && r(null), h(""), o && o(null);\n }, []), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n o && o(l);\n }, [l, p]), C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n () => t.map(\n ({ group: g, data: f, isRecent: O }, m) => /* @__PURE__ */ A(\n PZ,\n {\n title: g,\n clients: f,\n isRecent: O,\n onFavouriteClick: n,\n onRowClick: u,\n selectedClient: l,\n isLastGroup: m == (t == null ? void 0 : t.length) - 1\n },\n g\n )\n ),\n [t, r, n, l]\n );\n return /* @__PURE__ */ A(\n Sc.Provider,\n {\n value: {\n onSelectClient: u,\n onClearFilter: b,\n selectedClient: l,\n onClientSubmit: M,\n searchValue: p,\n isEnity: e.isEnity\n },\n children: /* @__PURE__ */ A(xZ, { ...s, getSearchValue: h, actionsGroup: /* @__PURE__ */ A(FZ, {}), children: C() })\n }\n );\n}\nconst kc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABQCAYAAAC6aDOxAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATsSURBVHgB7ZxRThtJEIb/HjvZvC17AsYnCJYwWaSV1j5B4ATrnMDJCRJOkOwJSE4AN/AgrcQGI9mcwO0TJI9RZKZS5Rkb2wjHMNUzbTKfVBoHhZnmp6u6uqsGg4LonQ+bZILnMNQ0wA4IWzBsAuErAlgiWJCJEMRne3u1AQrAIEf6/eHWeBx0EFOb/xniflgD864Sx2f1/ZpFTuQmUK83eotrej2bJQ/HIjAfG43tI+SAc4HOz4dhtWJO2G12oIutxtRyPZsCOOTycvRP1Zi+A3GEcMz3lmfAIc4EEpeia/qo4FJ3w/eWZ0zc19kjHHBxMeoYog/IEVMx7d3d7U9QRl2gScwJzBB5w6kBBdTSTgfUXYzF6aII2N0MmRNJJaCIqkBpLAhRHOH3b3gNRdRcrDDXWoZdrfob1er12lcooDaDKsA7+AC7muYsUhPIBOZveEJgTEcrFqkIdPl5eIBiY88iPIvG33SSUxWB4hgH8AwyOmNSEYjd6zk8wxgdl9eKQS72Wlnxw8VkeYen9BXGllmgSsXhZtQDMgtkrv0VaKywsmYWaCwnfJ5CFWTOpp0emBXNkyfZf3kqe7He//aL04Oxh8B7ssaf4R/IiM4MClBISeYnqIxJRSCK6QqeQdAZk04mTTiFZ2iNSe08yLM4ZBsvwhoUUFvFYqJ/4QlSgYUSagI9fYYPk5p68djdF3rVDTWBkiNOyqUcvArN2ZPcT5nehe3yTGqiCAgR5z4tKKKeSY+v6RWK2X7YKk2erYqbyup/wx1T5fpYXquaVDKI6i4aGZzsxfb+qg1oTK1cgrZUVMfuujyctr+ktTKptIZwg/MWGKe7+X0e+Jh/AN6K6DcVcN5VferGrRaeg5yQnkQuWB0j62zilQpER439WoQcyLVHUZg0bwJtrjq8XDuIc5zhgZ4S0ae8hJmSu0DzTDtdA9AOLc0sHpiNYQaG4qvqMwy0au0lJSUlJSUlJSm550Gc7EnXxdR+T6/ThHF6neY8Nv08YpP+xytOMCPkiHOBWJAmX6RXR67zYmQhYjtjO2XBfKzJrYZFCdnesg3JPUO2Y3kmfEdmC1uXiqPL5vTllgfhgTDLDMkHocg/YZYZsr1E3lASY05oczimvGIUP6jD9oU2DxnzvTvw117m+eayPJ8ABdW89JCmhjecHth1/vNaAlGSy2Q/LvUHy/ZqnaTzp4f2LE6HLy4rE0UQsnX5Z8v2Kiff4D09ft6v0sDcIcxjiTfrErEdssvdOve+JVAqjriUj68XuET2dK1lkRYE+oXFmWKRiGSnX5gJVIozY2EmzQvURynOlJlIk2U+jeSlODeIFpPVzbA4bSRJYMlt3pjStVZiRSBCyZ1IDCqbAu7GikDeNIB7SGTS/EfiUIiSeSxkqZdPlJy2iUiP+v3TeyBhpy4Z9SQPSlPrOjx+vTJHLOa2G7PzoPQL0qWu3nC5QchpY32+GLlwYCYisbX54yF+rdkUIZk1hyt388ukWbbUl5p4nERsR6uOXtc9kw75IhUBqTGF2GxkhkhqE61zJn3v5gVKujMOcNOQsAlESJod1hJlnkzdHWkO1UxN/gKMVvdGFmSGSJCVl3ojJKI8eLeg3v6SzrAQN6KJYK42wxaJGKP0OtBuh8mtgSoVTsQS0eSF/20kQm6lFi59i527io1w01A1WLfwl5Uf/F80XZ+qiYcAAAAASUVORK5CYII=", UZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAADSCAYAAACRit/qAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAALSSURBVHhe7dYxDsIwFAXBmDTc/7JQBAKF+xiJ7WYavwN8rTwex/vcYNF9H3PBtdt8Af5OYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgWHZPuaARQLDMn3hVwLDsuOcAxYJDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAmXF+zQ2Xni/nwjo/GCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBATICA2QEBsgIDJARGCAjMEBGYICMwAAZgQEyAgNkBAbICAyQERggIzBARmCAjMAAGYEBMgIDZAQGyAgMkBEYICMwQEZggIzAABmBASLb9gFP1g6PInFNUAAAAABJRU5ErkJggg==", H2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP9SURBVHgB1ZqJVRsxFEXlYd9NBXEqgFQQ6IBUQFIBUEGgA6ggpALogFABpoI4FWD2ncm7Yv4ceUmwjcGad86cL8memfekr+1rSq4PODk5KcusJEmyWCqVPqRpiqWsbP9RWU1lNdnjoaGho/v7+8P5+fmaeyVKrkdAenh4eE2ElpRdcj1A91YlZvs1YroWEBBfd1kNq2adiPhLreCtlWdE8+vx8TG/yAfYVdlWt0K6EnB+fv49JA7RsbExT9rIdoOHhwen2vc2J1Qqbc7MzGx1+oyO3qpar6jW9/Bt8kq78fHxnki3w9PTk7u7u/NiMtTUGsudtEby0h8uLi5W6XSQp6YnJyfdxMRE38h7EnouFcKzs+dWeKcqbsW9BrjM2dlZynVzc5OqptK3Bu/gXfZeOLheEJK/vb1N3xu8sxMRbf1AN9F0e6TppKOjo24QoF9IiGW/zs7O/mz+T4sAOiz+p2R5kOQNgYi6Ovan5o7d0olF/kCmDPFBkwcBj7I6+17z7w0CMl+rMCrEQN4AF0YnXYunp6eb4W+5C2Wu85v01NSUH9piAjP31dUVSVzpo1ypTiZnKcKb2JGRkejIA2Z9JlD37ErrVu5bIKz96enpvk5S/QQz9uXlJcm8FXxVi/wSFoWxkgfBQjFvBS9ApNewuE/sYGgH4vzZW3Mfah73iR2apL0bpc9L8/nE3MfW8LHD9h5AdiVJsyVyUQQA4wr3RIoWwsIiwIZ5CaiQqriCwQTILuQCYpy8/oVgqC8nbQqjR1sBRQUC/KIobQxxRI2Qay6gSAgE1BBQJcVytShoEKDMH1Ks9IoCq2xxP2YiK1wLGFdxP0qU2bfConRkEyB7mGRbs1+QL4IbEUdNnwPFVSIUfh5Q5hAbxGCihcVP5T7bWC9ANU+GbVrUrQA3i2TjPlgvADdSK+yQjrkVCHJl2LUAV76UsFZAYYwjEpzMfTgIsfJcQNgKig5HNSLB5fr62tINpzgtS1BFvo6IgLHBJ2YfA6hQal/ka3Nzcx/D31pWo3KlLzJ1boihP8AhI18Xt+Xm31sE0DzysQ3STeHtdwfvto4r8t/aHTm13Q/oj7v4GulBiQjJZ36/77oFkWA7JVEnercjJt5l722ORjfjxX0kB22KWPxwz+E8f8D3VvtnhkpGm2ypUNdgsqFTmd3/3dPxMatIH+iBFfKMUIT4+nnMykgTLJOrDCadHLN2xYDmFOn8wI1gMGKysHdXsMUjvh4QZ2G5o6Fys9Pn9PKpAa2BkNX8IcGnBlzZaUrDpwbA1lrNnxoYcVYDdnDxZgJCITJLErPGxOd6A8v4w16IG/rixIEYPrNZIORn/QVkNUynrLKFFWF2gfu9kg7xF0HO2mMolx12AAAAAElFTkSuQmCC", YZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARWSURBVHgBpVZtbFNlFH7u7W3pOrYVO9zE6LqNTRwIzMkUlTESDbIN5IeghgS2+E9inD/8TAwjmij+0Zjww4jp0EkkqOFjcdbEdAqZEqLT8WNA972UbmNrO7uOru2913Nu790XK9ngNCfve8+973ne85zznrfAbURVVTvpIVIPaa86I0HdVk/qxFKFF+kOFiuuVEDCAs5fp6GB1D4xEUXbpT4cb+mBb3QS17pH0TR2Ao/dK0DMc8K8owrL9r5oLA2RHhYE4bOUAEyH7hxnWnvw/udt2LO9EK1/j6B8bTZUiNib7kOxPAZlMgLZ74eSk4O0uldgW7HCcNNAIIeNB2mBneNj11846fZiX81D6Ogex86KPFzuCiEYjiFxYDOUvAxtjaiqgKIgHItBDoeRkaHZG8jXuBGJYHBOQzvT8sGXl9Bx7QbMkhk3YwrKHnbgwr+j2LDajsB4DK8OnMM683+8iCKigX4KTWJXOmGprkHaW+8YdJUSSJ8RAVNjb2q+gvbOYQTCCmxWAeWPZOOXi8N4pjwXf3SMIRKNQy4qprhDGoAeugZkys3FzS4vxJ5uLCsotJPJRbpN0ndfy9/2Xw/i3IXrOLinBFcHJtB83o/qp1bh7O8+bCpxoNcfQey5asSL7LPzpqksy5CJqnGaZxNtoihWcplzBLv5w6+br6Lh2GUcfGENfv7Tj+IHs1BabMepXwdRW5OPb939iMcVSO+9izRzYAbAoGkqBsvQEBIMduQTiNt38Ot6BnieZ+62AeyvKsDRH7pQUZqDKXLmoep5+Vknjn7vxRPrHJiMykjccEC16J55EPQoIhEIkgSB5rHOTpiTAFsZYCPPJqMJnD0/hLqdhXA196L4gUyNli9Oe3GgKh+NZOOSiH5YjyjlZl55UzEpmjJVLOnJV06BjyHP7qs8hk0bV8F9cQSb169E12AYw4Ep7Kq4Hy1tfmzZsBJesrlUN56WRpIhqJhOtgZCo0JjwmzB8h9Pzz0HJUUOUFnhSdpd1nIzHl1zD8KRBNKtEh5f60Ca1YT1lNyMAZFqUsF84bWCBkZhpttm7NzEOJRgMMiZ11T7WLili9xWZlcTr83KymJziCPoYwCb6yuoHg9MQvL03QkAi8w1tWUr8Obb/PgPA/xGWikVrobc9A1EDWBpzll4haLnxex0GuYzTBGfGu7vCFM/YTFoWmoEXEUsmZmZhjlfIkchetlKY6UtMIbEkY9g4v0IS4tD0XuS6TXqmSUlbGqc3YvqSNslZ75dLCiE8t0JasxG4IvYvdbIyflL+2BKOtfuhjke+Pqj4VOeR6NRagvxaZpS0WUklqmxWCywWq3GqzeMdj19Dtig5+MQf2hKJKAcd0EYHESqdLB/NS8Ppv21kGacz7nVFroyORKtfWvPp05CbfkJQn8fVJ+PtkR7SqODVFYGYdduCJXbAJttmpb5V2aq0PnSb1QXLx71Lv5d1OsOgrMc9uq2Bp3WlPI/MWmBpOJJKA0AAAAASUVORK5CYII=", XZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVqSURBVHgBtVddbFRFFP7m7i67tF12KaClkrJtiEaCUiQikZ9SNTH4YGoCD/qAIRIFUakaE4khxRjfVCDBGLQqoIkvGFEfFeUv+GSsf1CjkUshpVDo7tLtdvfu3Xs5Z+7McndZCqVwmtM7szNzzjdnvjM/AjcoruvG6dNB2kbaSpogjavmFKlJ2kN6iHS/ECKFWyHkOEG6jTTpjk8+57HXsy/GcMyz6yLtvKotnUbxv39R7O/Hr4nJsKO1WNg4H7WTaquZ2krReBvjAaCQ/wwvzFKcixeR/6wb1nffwvmntzR4/jMO+qKurN89bQ5Wz+3AukXPIhFv8ps0SdsJiHldAOSc1/cb7dxxHGTIsdO1BSIWR6BxJowZdwA1tRCTQnhziYOzoQKGRpNIjqZwJt2P8yODWLdwDd5a8YYfSFUQYqyZ28eOIr1rFwSBCGdHYMRipQH6u6nNwWDEq3McBP0bsbI4fr4XhjDwxapPsHT24muCqARwUjvPHv8b1oplCLa0INAyByISht3+KEJHD8PIZJQ3CtVzj2BkSo0yULIjy6eSp5HNZ/H6spfQUN/gB7FAZ0nQ53ybdj6aSmEon8fUptkI3DULgsoin0PwwiACxAWomTKAJ5ofgzNteslxpVqWBStjIVeTQyQSgfLB5H6VK4Yv9JLttm0jPTwM484GGM3NQHQKDAJgkKHQTwe8MvURVl4C45nSbMrUMAypXA6FQggEArhIwJlPSjp1ihrqhy7dkuntRVEZsB9fCWfpUnKel47Zof3QYtjL2mRERC7H6EtL6AchjSs7DIAlTenrk04vkl6+J7ni9PVhqPtjFDZslIMYfV3nywicPAmhWObW10tSirS30b2zcRFS8Yr8l+Hn7q5cqnPD55Ev5OFSAD5dvRPxSIx7sYFm5kCHHpf/6EMEeYNRyMNf7kWAIsLO5ZqzwYGzJbKxHDAP4kydn8265BERrsCp1GkUigWaoYv7f5mLrvbN3EFu7QygTQ91fvwBk06ZcJnpBRuR7R9AEAeu3q0UA+lr2Q7y9hVMoqJXJp9BwS2UGg/8f1gDYGljAK2y86VLlDemJEXdi+vlVxpj4njsrSq5QhG5oijDxexnHmQLo8jSnnAFmcCRvmPI2ZQRQWmzlTnA6x/ndBkapDRTpBG8DD5C8TqIKnGwhS5dLa7mAi2+Q+F3nCKKdhENlGHBoNwBUvw/7k2UiEU/CmYsOWeHrlx8UeawUgIYQ4QGYcCRfzSJgJCprgDEDT/asrH+2U9AtI3KvUILw+B0iBdFEYOjF2jyAZW/E3euxVsGV0aZl6GeUlmJXAKTtNVyLNy3Z4lHFr/eEgTlWthyQbeYvAS/c6m+ph7zZtyL2y0PNi5A0CgdQT0M4KCuPXnPStxueXrean/1kN6K+RiO9w8PYM3Xz8vQS6Ko3J2YeKmo9mZ0d+z0X1Kmelnsutvps4nLw3QS8p6gT7OJZoI+lpmA4XAYdXV1umk32V6rASTgRUF2Tibl2SRBsNwsCP+9gG3E6EalbZI0883IUA5M+uzQzqLRaGngzUrlWLbpc75DX8uEbwBz4TeoW9FA+hzeP7aTdkPXx4fxIPBATA5E8Mri9ZgRna5bTPiuZGNeSg+aR7D2+40w031ehxsFoSafiDVh36q9WDiz1e/82pdSBaLsWm6m+vDu0ffQ3bO3vGO1k0lJLDwFLzywFpuXvKYvH9r5U+S8ZywzGkQCFQ8TBrLnj6+w78R+/DV4otowLG96GO2J5ehctMHvWDu/sYeJDwRzYitUevqFz/OegT+RsUbkGTcr2oiWqQl9xlcKk3vrTT9W1eN0tzs+SU74cVoFiH6eryCdj1v0PL8MfSjf9YnNheoAAAAASUVORK5CYII=", QZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaZSURBVHgBrVd9bFNVFP/1u1071o7h2Ni6ymQwqmN8C8hgkYhCIsxAgBBx4B/GxAghRo0mMpPFxIRlTlkMBhlCRIkgmxCdIAobZgYyHDCUsQBluMHGoO0++17b9zz39b3yNrcycKc5vffdj3N+55x7z71XgxGSKIp2KlYSLyLOJXYR2+VuH7GHuIH4FHGlRqPxYTSIFLuIS4m94sNRBZv7IPmaGIqZdduItwzuE/ggAh4P+PY7QDgM/dhEWN3Z0Gi1Q4kqIi4bziOa4aym4jdE3CxRyOdH246d8J+sRdfpuqGmIX7eHIxbtwqOpUtgznCquzzE+QTC80AApJzF97Ci3OfzofnjUoS+3Au9yQTThFQYHxsHrc0KrdEozRGCQYTueRHy+sC1tiFIYIX3CjFp8xYkxyWrQRQQiIZhAQy2vK6uDmvWrMFW0YDn3DnQO+zQiCJICBssz47URUUGcbivH1XxjfhmaQhfL/sOTyblDOuJwUGLKt+3bx/y8vJgNpvhnD0beosZ6A8AHAcEVCy18dCwdmIN1XU6LdKcbuh1Biz9Ph+/eH5W5EsGyutrIAC20hXltbW12LhxI9LT0+F0OhHiApIyTVS5CggpjHyzUq5TuxAMIH1MOhxmBwqPrUdj50U1iG0DAMiul1a7h1b3hg0bJDenpqaSvABERZGkRGW91BZQtdFYeUw4xCEgBJBiS5HK9T+tgp+LboQtyhZVPBBFVFxcLIGwWCyScsZhbqBSkSemNlEGJ9Wj4aGS+sM8B17kEKKfzWRDS88NfNZQqg63ZLBWjkehYn1FRYXUyzzAkUAGQAgoyiJsSEpEwvKlsK8ugHVGLnQ2GyxTJ0tAJBAEJkwhCIQD4AUeITEordVdjTvVXniF6WYeWKm0lJeXQxAEqd7T04Pe3l4JRFiJOwQY0lJgcGXAf6Qaodvt0KWMh4G2pp62pil7UmQ9sTnkAU6IhIEXecnX/qAPn1/YoaiTUjsDsEhpqaqqivqHAens7JRDEJCEWguWwLZ+Ofr/boQmzgi+rRXcpb8QvNWG3jNnYHkpD6YFOZKXQjxT3o+7XKfkAbZzmRd+b6tRh2ERA8ASD7q7u9Hc3KzulNq8Xkow5AFtigNarQF9p/8Af+kqzM/kIOmt1+F4cyP0bhe4y1fBnW0ETFpoJtgRohAwd3cF/ZF8IfPpWzUICkFFRa5W3haor6/HUMTCwHd1weieBCOlV+7cJcqCcbBMcUMIhyD09sGcNRkwahG8fB3xM+bDmJqGQI8ffeG+AbKUrHe965rS5NLKsYDf78dwJARDME6diLg5s2gBJsP67ALw/V7cXL0Jt97+APyd2xhT8AJCLR2wPOWGdVU+RCF8X+sgbvF7FNF2rdrdsciSMUWKvXnBdPgPHIZw7y4mnq1G3KKnCUArvLv2I27eTPD+Dmj79DFl6XX3+xkAaV9kZmbGnNR14jgdv/+AO98EsZeHyTkRvsOVMM90w2JPo71PFtuM6Kv/E4HmKzFlWQ02pepjUDzEudnZ2TEn9decgc6RAEv+LOjMVojtPTBYExC60QFdfALGvrEJmsccdCp2oHd/NVk0tBwWhdxxM5RPD/PAeVaz2+3IysoaFkCwqQWmzCdgTEiGNnc8uCvX0HOiBnzTVXi/PQh9biZsc+dDp7ci2Hp7WDnusTkw0G6SqYEBOKl8rVixArGofcs29DSdg236fCS99irsa1ciLm8u0spLYZk+Df7qo7hbXB5TxoqJBerPUxo5FV9nTmhvb5cOICUbKlRmSUS+cP/kjl+5jLLfeOgTHXT299LKz4H/YCW6jx6LjvkhL4iSdYHIB7skCJGyYW0TnPEZyjCHnt3VCMRX9LE5OTkZhYWF2L17N2JRd+WPGDGJMhNtmLJJrXwP062Y9YnSWlJSgsTERIw2OW0Z2Jr7jrrpQ/YnAZCvSGWszhbjoUOHMCokW6+hX3neLrX1Zcq1TH0lK0JkS2Lx4sXRY/mRdctuZ8f6joVfYEHqQqXLI+vCAADyvT1fHiCthcrKSrhcrmgYRYxAsWpcsmU8jiw7jnVZL6uV56vfCA+8lrNLSstH25Gw98Dwr5jBZDTA9+4aTN36PpLMSWrlsa/lKhAuDHqY8DduomP7p+g+9ivVW/4zkVltnpyFMS8+TzliE11cJqi7PRjpw0QFguWHIuLNg/vCvi70X7hIpR9hOkVNWZMoSz4OfdLYoUSxxV30yI9V+XG6R3w48v7vx+kQQJTn+WLiaRil5/m/Y8uIpykWA70AAAAASUVORK5CYII=", GZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbRSURBVHgBrVd5bBRVGP+9N7s9oZSigAhly2GMXEUQDMRAQWIkJYJiOCSA0Rg1RvAfSfhDiYlKoglXQE4FlAhRRAzBCCQcsYqkWi5NGjmWI1y1dLvttrs7s/P8vdmZZVpaKIRv8+XtvHnv+37f+d4IdJCUUoUcppLHkUvJIXKh+zpCDpOPkw+TfxRCRPAgiIpD5GXkOnVv9JXei/slbbGr+DayTVNZZ86oREWFShw5rMxTJ525dujDO+kR7SgPcTiItJvTc/X1iK9fC6uiAtbvv3HCzghQ7hpZOhzBqS8ip3wKZHGxX2SYXMawhO8KgMp1fHd5yrXi5tWrYH65CcjKgtHrEYiHu0Pk5UNkBdN7TBOqro5rI7CvXIVdW4vg3PnIXbAQsnfvO4IQd7Lc+vs0YnPnQMRiMAYNguzSJbOhNXLlG1VTE6zqarpEImfdBmSNfKpdEK0BnPeUJ3/ei6a33kCgZ08Y/QZAcKVQimN6i/7vTKq0FOWNSP9X/J86ewbWhQvIW7UGWdNf9oMY7lWJ8ClfxmGhY/mpk2gsfx4Burq2TzG60xKDom9ScJVlocZWGBww8IQhESSIE1YK1SkbXShtKOeLOGdQzg2u73ruLFLXryF/9x4ERo321C0ngPcyAFzXa+thX72CWPlk7r6O4LBS/JK0cN5O4e3cHBzg/x8SCdRQmU0l2wryHWmvRmNIEeCjBPpcdhbGBwLYynUPc80LBGQer4Lq0QOdD1dAMIwulehQSPchUyrxlcuBSxdhBIOQFDI0ZaI7k+yj2gi21EcxiB543RBIxOP45GYEa+rqEW1uxgJKGpyysD5Sjw/qIsjm3hEELi0TRqdOEFeuIP7ZUn/EHW9Lt8PNd6y/eBHWtm3QqCTRi2QSl5qacSjaiHwzgX8aG7GJCoqSCUxQKeyJNuAbghrLkpSJJNZEorjA9YXct7+hEWEmo0iYkKblyLS+3upUlUvztO4A0u3VoeTePZDx5jQAbtYcZXyHpFIwUwSYiCPJqC2uTSLB+MbtdC84aCbxK+e9Z5vhGMPg1jbHaSGf+N5JTnoqsXY1chYt1suc1q4BjPMApHZ+l1ZOYVILu1mLgaz3err9KuPeGE9AqzjrVoNyx3PpPEpXB58LKaS/YSAkNYoGhsEiAK7nL7VvH5AGoGmcBlDqJKJedOKEk71OyemRLs/lfEIGECOAJsZdtVLeFoVpdc8gRdNyQXZi7ZZqihWmolGIggI9XaoNDjluY6ZKpyyEO6b5CGO84UYNQsyBXMY2weSKE4gem+lS/d/PAc4PpNJN12+goqEhIweubP3fPvOvhzUUcGMBxW4nXOv91JulVS5tVDOp+jMfLqp0P2hgiLQHPG8E3LVFdLPFQE1gj3jcMDJyPNlCN6nzDNqTI5w8kJkVTDDhs9zb1Ju+GxM0cI7K38/NxkQKfpPPiolpMTwmS1SPC7MCmB6QzppKZr1uUo8Zss3TTnTO9ALH205LlH1D8Hdm798Fdr31zQksys91nuflZKOK+fBKTha60WJt9UtsPkcJcBwPp2xdJXk52M6yPKZLpw2j0CnPUxPRAMLOi+K+aIv60AMD6coijlrhjPpGVFPZ6s750JBidP9GdsRrDMk89ovOXNeLlpeyG/YzZEvLPauHDPWmwjp0J8ilIjcXYsRI4K/KFptOUlkNhS9tYoIxfn8UFSBM97/G9nvZrfspBLWUHhpPDyxsbGI/UOhCsH9yrz4b/CelCJUwBAWe+OMawCHtWf1klJVBuQC8TWNZTsX0wCgK+o+CtcVVls1Eu0VBzl22lWPh5/l59JRAJfOiB0EotCQ58Vn/42HhtmJ9EBUqXiTMkcPZAWMtSrE17WR8daJV0sIYNWhwTxPoTOZFa1Iu2y4HK6sg+mRuS12ley5v0U+iWzfIWbNxN5pEV4+mwjCTscZOJ9+k7OBd98kZs/zKN2vdtx3H4GFhPjMGkmd467K8DUikAQ10/9GuBW2+V36mYmPXbj+AW8exe0Va4UzzvA6s28gbTXtqb9FGVsL2gk53XacByI8/9Stf4V3L/DcinQtV8Frzjm9hv/tOJhdaLO4A+WMvV66m+2d6r8LwXckyhepOlLkLnHgZO75nIyhuUUYdVeys7VpEt//UWnmZ/6upRadw3TINXnMaXwbJuGHmbMcS1VpBO4oVyw9MZnmsEmLMWL/yaXe8lmeEtfFhoq9p9hdrgAP72Z/DaJNKSoDJ5RBz5kL06+d/E0ZHP0x8IHROLCEvuO1llNeq06edinGuWCVUNqA/y/ihtkTp5F5y3x+r7sfpZnVvVNfRj9MOJ7a69Xk+njwMD+jz/H+CmMmCGzRGVQAAAABJRU5ErkJggg==", jZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX7SURBVHgBrVddbBRVFP6mu92t3e6ytFoWCqZVYqIPWDWRQBpLW9BARItEEn+o+uSDUYhiDE8YjTHEB0oi+MMDBP+qgNYHDDHBQlWoFEIRUVCqq7QqhbbbZf+3u9dz7tyZ3t3uYks4ycm9M3Nnvu+evznXwBRFCOGnoZW0kbSetJbUrx6HSIOkfaSHSTsNwwjheggB15JuIR0V05Od/C6uVXjHCniSpMZT4rfRfnFk8AcRi8VEPB4X2Wy2GJFNV8MxioDX0tAF08xSwqkwdvy0E98NHkXPxV57bc+yb+y5y+WCx+NBeXk5nE6n/skgaRO5JZiP5SwAzv79wgJn4K0nt+GDsx1wO92Y7QmgeV4jPK5ylBql8Hq9/A4ymYwcw+EwQqEQKioq4PP5LCJyQ/R8EglngZ3b4CeGTuLZgy8gno2jvnoBZrh9EGw2sluWZimRorkhtaSkRBIoLS0FuQOJREJqVVUV3G53URIleQawzb7vfCdW7X8M7lIX7q6up9GNRDYpQZNZ1qS8tghYJKyRQXkcGhpCNBq1vm+R8E8iwAFngfdePIF13S9jdkUANd45SAoTkMeE4NGcMxkGsYDzla3BLhgZGUEymdRJbMohoEy/nucDkUE8d+hFOB1OBDzV9m5TEpBGJsLXfF9zQb4lLFJMgufDw8PSNUrWWylqxYDNqL1vGwaiA/C4PRKcKRqcLNL55ppyun3vr0lUj9EHz+8GbqqGUX8XMGsWNItKYBaHw4Hx8XEZoH6/bX3e8HpD+WOU71yIDGDx3mZkKMQqiMDcihoIQ8idSKFhVU8cj34fhychzHszK4Hb7wDiMSAwG2h7GkKBMAnedTqdtrMkEAhYxLhS1rEFWi1KH537lMAzMsxjmbhUh1xMyERkQ2cES0+xLwWC1U5sW+HBW099Zu+atgl8202FmqyhSOgZwiQikYhMT5hlvJUJNFrv7w8eUGAMkcVoahRel1c+a+uKoeVYVHri70oHnm/z4kpZVn44R5Y0IV90ElowsjTy9rjwIJqOoj/8u+lzQ76FyHgUY6kxpDJJPNRNFkskkU0mCLwMl11mOuZIx8c5lwzIqgcou0MLxnq2QC3PTo+cUcjIKdDshoYfo6i8HJP3uxaUIegjU2fGFegnFGXE+tIl+gd+Djyx1ga3Y0dZwVImoOKg1ql8gUgqYgKr3eskAkMJiFhU3j9X5UAyM2FGsXw5RebDFMF/guoysJdiYkkzqASikCssK6gS7bcLUSQdy9+8feEQtk0l+4zI2Io0WSKdMgMwRt/oo5bgeG8OaL4FdMswDU4H/83euUX+jZSjnomKPWckk/vwq/3AgyuBsTHg7C/A62+g0M71YLXqA2MzgSBpfZ2vNmfXuhxcQP8Bl4GylKA0TGDzai/CN6iFa9vMkS3w2lV//bZwdVQSZCqneDbT7cdtM+abFS9PrhBYR8MNcu6NC7y5e2zyIvbphlfwf8K+11zQxwQOWVfL5rYUffGd5RWy+LA0nU5i+7sh1AznuYMLDLuBfsOWWKlozcvKyvQ3Dlul+A9S/19Uihu+bJGl2M4ITXj3G/ddQSuVY1vuf8AswVxgqBPC408Ct86fRICDl7WyslL+G5TMNNSidhrW8fyloxvR0b9nIhULxMS8yxmsPJbAPf0pLLpxITCfAFuWAg33TVqrE+CWjTsoJbvIFc9YBGqVFWQLtqizBaF0qCgBXX5ecbzoMwvcKkr8D9B2X8edkcwH1SJt5bnP5cOOxrdlzptfwTWJnnY852ZVA99qtWV6S/YqzJTE4lkLsWXx5gnwaZLQg46VG1Q2v5KgwkIOAXWSaVILsOaW1djV+B7meWqmRUIHZ2Gzq6bUAm/ST005Takyyyq1kNKyGXuWfog1dY+YBAqo7mc95XjH3P1o5wP57fy2fMoHkwvRQWw/8z66/umm+YC99syKXhuUfcyAnOtaudV3HsRURR3N2gudtahHEEf+7REHLnwtqPcX9HcT1O2IItKut+HTFmEeTneJ6QkfZHeKKRxODUxRxMTxfAnpnbhOx/P/ACxevHkMM0o1AAAAAElFTkSuQmCC", KZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaqSURBVHgBrVdrbBRVFP5mZnfbXZZ2t/axpaWs1CgSRQwSBSSIECHEBwZMDIk84i9IUBKjogaRPxpNDKA/NJoIJhh+aEKNNlGUR1EegmApj7Y8usuzpQ+62+5rntdzZ2emU2xrIZzk27n3zp37fefce8/eK2CUxhgL0WMxYQ5hKiFKCFmvE4Q4oZHQQKgTBCGBu2FEHCVsJvSy27Nt/FvcqXGPLeL/mGEoTFNamZxpIOxhau4EtanDCdloRW9IE4Yhj9JjH/JhzrcZCeT6t0KT9xMOUIvhDMCsPqJnGryBl1E4ZimVo+4h44S5NC3x/xVA5Hx+d9nkiZSCa9e+QnVwA/X2QfJUQ5AqIAhBgtf6RiWBN+nZC0O9CkPvgpBcC3/obfiqx7lFvEgiGt184hCeO+SnL97E9FV1OHB8LzyF0+Dzz4bHdy8kKQBJNCAKsglJ1ElYCB5vFF7q4wssQPbMPrQuXI7+v07Yw5tj37ouxFsC4IT996NXMHt1PTweD6orJhFJIZFlCTmIIkfW9ZTzZVMQb5NQUPYgJK8X5xe+gp6dP7pF7HOvCdHl/WabvIk8X/refpSFA6iJBGFQiPNkNpGbTB6oizkHApNRML4SBZEKXFrzLlKHj7tFbBwkwArLOl7u6Mlgyfo9kDWGytIAciojAYpFMgDBhEyLKF92omMLIwHIKfBVlkMimtiqN6An+2zedfZU2BFwFH2yownxG2kUFnhN8pxikADNHFgYBE6ctZ5uZPMiDCrLJFzX4QmOgX69E9c3bYHLTIdFaz5W8sqljhS+qb9g6hIFAbIlQDfIGz44skj2hKHIIuKt03DyyAI0N85D/NxjUHISEt3F1EfOC+PfyBwqBE0zPb35XR20XidBruDcvH2x3VJ/6ArSOZ3IBKRkAxkqcxGGoZnkF84+itj5hWhrmQGdPNONYqT7SiFnVFyOzaZ3z6L5n0dpJCLmU0AR4CIEVTUdQjaHzs+323RmaucC5tgtO39rM8l5ejAoz3QnFZoGHgHFnOuKcc0QYh0o+KgLRSemI3LsICqv7EbR4RYUtxyAT7yEsshJsy/0/BowunsBVTMTDifr+6XBPQ1zeBtPPERi4MiZbpPcFtGf1ZDoV8hbBR1XS3Cx+QkwElQyL4jy52PQTlVAynRDSnXCk+HfptDVMR9tZ8spUcowEkkYfSkaSTAFCHxaT7fSNCRtAVNFe+udutjrELsTZNqchgx6u8Yjk74HiihAKqqFfOk+SOFiMC1HomR68gWpI5UKo69vInmdBMvk4B7Rhnwhbg8fFa25QE9SdnmPgSfyqTb6wCFQfgEbm0F7+0HE639GX0kjMhNCSD0QQjrCF6eH/idymFC7lzpq7lA7LvEoKG2XnXXgJCJVM4bq7rT4/QlEKn+CEEgimPgTIakBJVXNGFd7DupOFYGDPdDUHML37Ea49OagkQSrZI8mjgk477kAc19EK8diJOtqr6KVPoui4BvUric8SFf5kBpbQH9IBoV/Jjqvjx92HC5CCjlc9HX+X2pqtDKIkczroy3F/FBU2u9jahAo1qAJY+Ep6UXNcwo0rYR2XQgStTFDH3Es/8OT7GKcCzjJBRT6JMx8qAyHzvQM+RGjGSoI+JHpB9oiMyB4RBT6Azj/N09SjPJBFoGghFA55Q1dHZbcN6EaUnGRXW3kAvYTVvDavMfGDSsgXNaFyVO+RPuVyVTzIJmsRX+vQZHw05brRu3kdqhKGlU1FxAq7UK6JTzkOMH5s9zVBi6gjsD/CUOvvTQJW79vQV+Gr2D7rDOwEIvCnSa43bjWSal4GnlbgJqJR3H/Q6eGJGSwT0z539J1r7pf13n46ZVy8rdUeT0U9GHloon47IdzfO8N2oq3WkVVE55Z0oTRGqcPLVsMX02V3bSdc9vb0Pmb2rByCqpK/bibxsm9RFz2zhp38yb+YwqwDotbeZlHYcf7tN34GzYQwDsltsMf+Xi9KcKyrfYB1X0k+wD5LYknp5Tj67cez88Ay+tgt6mDOaCDzRcfIrjoaftV3OLCIAHWTWau1QHLF07Er5/ORTQScGIwGhHMJVgMF6GmfjuKl73gJp874q2JH8sJMftWEW9PsWNNm5iWANMJRnIAzAW7TTf7iSx3ajVTr3W4Lygx68g/Gi/M61hs0P1GjzE9s5bpyVqLhJC04NTvoz5vMkNrvfV2FGO3e02zrmZbhrxsGXRNVPcxpuxihryNGeoflH072TC2ZaSr2WijsZ3dnvGL7LbReC1glMYGrudPER7BXbqe/wsDTFOmFRMVLQAAAABJRU5ErkJggg==", ZZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXGSURBVHgBrVdrbFRVEP7O3W2F0kI1bQMFylYRagi0IEQxJqVqVKgYQn/4S6Bpf2gjASNpCMFgMCZqCC3EHwgm5aXGYORRE6omtlVqigq0kGgKaB9YEEO7u2330X2Nc+65d3t3290tDbOZzNzzmPnmcc7eKzBJIqJsFhuYS5lLmB3M2ca0i7mHuYO5lfmMEMKFB0Hs2MFcx+yk+6MGuRdTJRmx4XgcRYJBCt24QaNtbTT6UysFr12jSDicCMieZH5EAucOFs1QaVZjbjf8hw8h1NaG0C8XYgyQodueXAn7xgpMe2kttIICq8ke5jIuS09KAOxc1ve06Vw69h6sR+jYUSA9Hbb8ORC5eRAZMyDS09SeYBDkdPJaFyK37yDiciJtcyWmb90GLT8/KQiRLPJQxxV4KjdD+HywLVkCbdas6IZ45GSR5PUi1NUFaBoyGo7DvmxZQhDxALpN54HT38D71puwz58P26MLIXilIGKptkhdHyRlhUwJpRPr4b9uItTfj4xPjyB93StWEMvNUyIszutYbJd68NLv8Kwvh53TZ1+wgBfJn3IezQDFwiejG3Tn+k+NhSSIwUFknvsW9pLl5vJ6tvV2FICRehk9IrduwbNhPfDfXaQVl0DTFwmVAavPWexiJvMjEaDTbgFiZEDBAZ8OBLmUyJ+LzB9bIbiMBhXKUmjGQ/So+A9yIm71wZaWBm10FEJyYHRMN57FWjew+x5QMwiR7YWw+XjOr7Mm53Wd94WCsGVm6jb9B+pgoe1GKfUbzqlH39eHkdWrYOOutmVlwTZvPjRSyRXGedPFgghEH2NfFgKtCQKrmIc4S7VZII9qCDL6IcJKuK8XYa8HYbaZdfmqmQXZA4UyAxtMSIGvvoTGzuWgxp0s2YwYfhUVpF7G0S/0AL+GIT7WIE6xq0wfkOWNrhF+lS0twBkJBpTN4WEE+C4xSL/a5XipORI+e1ot5Di1CEc5OKAAGMaQ5Qe9MwA8PwzaxfJVDkKOn+BwL3M29nJJlo5E1ws/gxkY4DKElE3p4+dWaxlK5ViJ3jx81un6ddV0RsNhZARwSyd+xf0BiOM842GnQ8yfi+ic+IL16awPy2wZ611uiKEh3ZYmoNum9nbdl0Elsn0dev07O6Mdr6TBXAZwWcBNice54zO4JzY9xNlgfQYbGjD6+JKs6ihoJe9pf0jfIzhyK5nHmXp7IIqekEMOzagFaMg91mzxJAEwENp3lyU7vRMAunjsdlCVQI+YpYflUu4PGeE452OZjfzdHe2D6AE+4x7C685hy47xSFp7wije70L1jjR8fT52zjEP+GNOEC/u0HDBasckoqjaaLfjBUOXAORxyC7gG88fhzqe3tgFnD8GfLAziNmzgX2Hx+bKnlVybn4E/mAkqZ1pGRmm6pK34BX5p+1yudTllYI5UjpRBxr5E7R7K2hOnhrrvwg6sEfpqWz4fD7zXeGKBHDUfCouLk64aWdNrPF1ZaCrTaCLZ0Gf7OU/wC5QzsOpnS9evDjmrUk2YYuZj/Ly8glTlj0T2LQRuMlH+LsTwPs7gJf59vjnX6D9MvD0CuDQSeCeEympoqLC+thqvnrp73u9vb2Unp4+IfLSp0AXToE++wg02Am69j3oyIegqtdUZo7tB/1wkm/pFCXo7u62ZkC91LJSb45UV1enTOMzK0CPFYwfL38O9Nu5xH1QWVkZk/5oHki9+erkdDopNzd3Ug05EZetBr27dYLmdTjio3dYaxGThebm5ikDSMRNTU1W5/WIJ6MXohAbGhoemHNpy0Ld0dpPAMJhBdHY2KinbqqO8/LyqKWlJd65A8mIF5RYQci6bdmy5b4c2+12qqqq0vspznkJJkPxmTCB1NTUUGFhYULHRUVFVFtbG99sSSMXSUDIOr3HvC1+jq9tdHR06FLyokWLdM7JyZnI1AFpZ8ofq0Y2jtL9kcx9A03i41RgkkRjn+drmIvxgD7P/wdFZOTKLeDnbwAAAABJRU5ErkJggg==", JZ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAazSURBVHgBrVdrbFRFFP7ubbetWJZtKS1IbYu1PqttbGNRkVaMPwxqIKL4Qh5KjAkIio8AQRZDgGB4FBISCBHKQ0AU+YGAocpD8Ul5BMobupS1ZQX63LJz9+7ueGb23tvbbZHnSU5m7p2Z85355sycGQXXKZxzFxVDSEtJC0lzSF1GcxOph/Qg6W7SzYqiNOF2CAHnkC4gbeQ3JivE2GvZV/4HWMxuOunE2DZd1+HxeFBfX49QKISUlBTk5+fD4XB0ZcpNbMzAjYgx6xr7dBobG7nb7eZlZWVcVVUuuglNSoJVLyoq4nPnzuU1NTWxbNRcjQ2lC3Cxvt8jusZobm7GvHnzsHjxYiQkJODB+zPRLTkDycnJSEt1QEy63qejoaEBkXAjqo96cfHiRYwdOxZTpkxBdna2adpD+gyx4bmqA4aXO03wo0ePYvDgwfD7/SgoKIDL5cJTxcCRE+RYK5DXD0jtAfxxgCPVpeChPI69+xS0tbXJscQUVq9ejQEDBlzVCTWGAAu8srISJSUlcl2HvlSCJOI6EAjg8DGGEUOZrGf3YcjoGYCmaXi+lOGfeg2MMcTFxaFs4CNy7MCBA1FRUWHalxM04qujAyLSTfDDhw9j2LBh6NWrF7KysogBhhcHMShcw/k6hoIHGB6+V4PzTuGAhl4pDC8M0nDiDEMwyDD8BUaByuTYzMxMjBkzBnv27LE7Mb3DEhjU14i6z+dD//79ZYQXFxdb1Dz3NDD6FWDSTGDcSLLSFwjqCjHDZQj6LgNzlgAzPlKw50+OtZuj48QuqaqqQnp6Oqqrq+UyGtJPLIXJgOURRbHcYiLgeqcxMs4kxVsqNfy1X8OKuRr6Zmi4+y6G3OwA1Rn69mZIczFqYxS0AXy1IboUPKKhT3pIBmxdXR0mT54Mm8jtrRjr0SgjhIBFsLW0tMDpdFIEZ2H0qxxlJUD1KQVnazmmjbeTx+0G0epXsIZm7uzOcR8F6P4jwMpvFRyprpGBmZiYiNraWskGoqdnP8HAENPA9u3bJbgQEfl+fxuWVGiYOEOscwDTxglGNMkKeMAoTdXQnWLi/TcZ8nI0fDZbw7xlGi43iLgISpuCyfLychNOHu3CgVLzz/mN31iziUQiuHTpEu5IFFQy7Pqd4Xy91gGwvdQMhwLw1jN89wPDnUkMSQkBeSaIk9NiaetWO2mlYgkOIJpccCE9FaWPjsLJlBxiWEFmbxUP5CaimyN2t0bJNxdBUWw/RJVH/wX0EI6d1uG9IAI1gmy/Dz/tX4p+x05ATe0puh6Mh7H1wnRwOKlc59mBZ+//Ek2J3eElK95aBY44BQlxahTIBt2OaXhgeBOJcATDHCEq4SDNjDpQsW0S+lDJz56lE0w6kKPCTKlNDdJMfmsdZlct7zBbnYy1BcO4QhrQI2CkAZ1DC0WVyX8cAaqLPlfoW4JbzilwH1qLJxrPRF09fdqKA9tBZHYFxtbsxJjTPyI2VQib4Qik8TBpiBzTjZma/yIcneQ1sje1eqP1rTidVl04IC8OakbvDoDziYV7Wry4Vclp82FR1TLLsixdPczmJuGARza0Zy0pzpCGbTvdcAXbcCuy6ecZSNP87eAk6sOPmM0eEYSHSAsVShzqE09SavvNGnxf6wWcaVgJ//xFuBlR58xCZnMtIsa3jFHKD0oPiwG5C3aRjpQDKG1ywwFzKVMrtyFp8wbwt97GjYheuQOur1cgNiTUskH2z93mUSwSkYs3NUEvKoTqb5XBYQZliNhhW7ZDycvD9Yji9SL+5SFIuPivdV2KGOrYdwDK3Vlm1xTVuL3KhK1QplJHjOhkMJ5Osm7vjAJvbb0mOE0IjhFvSPBYUYe/bgdfKbDNbbjQAvvwY/C7+rZf9MzB3vOInz4N1xJH+QI4znmizthtEHDcJ5/au8qLqnTAuCJFswQFSPzS5eB0q4mVpM2bgDWrcDXRt21F4qKFnf4LB9SZs+yzL4+9G8pruP0mHN6wnusZPXk4PZVHDOWk4dxs7t/3N6ds2UHbjh/nemG+7MON/mKsLsr162JvyK4uZxB7HY/s/YWHiwo7OREsKeYNPp8FTimcBx8vsoBN8HDePWTj1+u6ntudKOzwJqg9x8MTxvOQYdQEYO+9SzHZKvXKF+6OwIK5D8Zx3twUC16I65GuHibSkWlTefjxx6IgpP7F5bxlVYX1Ldvcn/PIqZP8ph8m9pigwk06oVNjSzM9Do4gHA5DD2pITKbkkpsLJS2tK1MiuN03/Vg12FjJb0zEQ3YFv5XHaReOmM/zMtIC3Kbn+X84QpIfwZfpegAAAABJRU5ErkJggg==", _Z = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVfSURBVHgBrVddbBRVFP7uzOxPd7fdZW35SREW0IgkaDHxJ4opPuCDkQBPJvoAJj76YDQxMZoQ45OaCDzw4BOQaGKMCYYHjUqCRMSoRCmCAYJ0DQotLaWlu+3u3pm5nDNzZ3fa3Wm3lNOevXfu3/edc8/cOVegTVFK5ajYQdpP2kdaIM3p7nHSIukZ0hOkXwshxnEvhIALpHtJb6mFyUGei7sVtlgDN4l0XHV1XKqBaxX1B+nlkapyqC1C9syFIyLAC1Qch+9mT0o1F0fOlzEwVMXZIdk8h/ThHgtbCkk8XejA8owV7i6SPkfbUpyXAIHz/h4JwBn4y7MlHL04hbhpoDttIt9hIknrW4bhzbGVi8mKwmRNYbRsY6LiYNv6Dry0sRM9NH4uEmIuyy+O1vDB8XFUbGBtPo7OhOFZKsTMqV4b/3r/ClVb4d9b0ut5rz+L9UsTkSRmExgMwE8MTuPjkxNkQQwrs5ZGFVQIv65mmaFUnY7iOul/EzaGSxJvb85iy9qOMIlNwVtihMD3BuAXblTx4U+3kU/FsKzTglQGpGt4Zc2rC6qHlJ5tpfv1OFaeuyRl4SMy5MJILYBijD0zPKBdz9bjRtnBW9/ewhjt6UPdcTLW8C0W2nrf2eyLhv+068UsD/AfvR24RFuZTwKfbr8PmXjd5jW8FcFTndEXZ8sYnnIRs0xt8UxLPWtJKTZRcwBJynXptflqh8a7tEYqbmJkWuHzgVJo3/CGtwX6hNvND0MlB99drnhWs/qLaLd6pQZmQOVruC6p7pNrzJHkF0fxeia+uVTx3iotuxibX9YdQcv1sTKe7SVXkl9MUyHXwXVSoYLd8uMNrWVmn/LjknSiS0HSm+ES9qWhKTy2KsMDvKOdCfQHU3qTFezeoGAYLgyPBKvZGk05sKdGIEwLRixLZax5iPLjgePAdf3SMKaoJxMM6WcCfcFg27Y9QIPQDX3IcLsffA1x5STkyG8wxDTs6iRcsxvJ5c8QkVRLAkIHMCtjuK4brN/HBApck1LOGCjqUd9Mwh07ifF/TkGVznsE0g+8DCt5DlZuA5HItJwzm0Q8HufmgqH3wmMVBo1ypyyPonJ7FLXhY8haPyMl/oK8cgCVm3/DrpTr41pJsL7jOEFTLnwQNVneiowpSojRkSydLPI9EvluCdfIIJlgD9otQWd7ILwuE/CORMuyWk5sWrBjNWRVIdm9AcXiKtycWIfEyp2oOD0w41lEWR6WIL4Ym1GL4GAgAlGgsyW1ehvteSfs8oO0WgqxrlUwspsgYum25oeMLXJtgAkwOHdwLMwnItaFeO+LsKaH4NSmYaVXNL0BURK8ZVrOMIEfSXfx0/+VJH65WvUG1L96iPIKnw/3+9VRzCHBt0F4B9ETvQl0NzpPCH0U84coNzblYNfREug0aINAu6I/TISuKHE5vL0Ty9J1Dywx9Hf5MD/lUyaeXxv3J+hjdNGiGqkCrx0CP8TYwdO+oPXVviRyifCpvhgWqq7L0gKvbEyEO9/nH4+ATpH2cz0TF3hnc1J7QS0a3/ekwuuPJ8LW7w/SsvoG61j4E/po/mFQ4pNfq34iUk8+FhAPOiHh8s0nE9i6pv6xKiKUks2ZlP5+3caB0zVKUNQCSDSS0y7CfJe8+cjS6Mx43rR8uOzis3MSxwbtRjYsorH5x6D+rQUTr21KIB0TYfCdBH4mPKXtiwkT+eqCxOlrDobKOv8TjaSQ93pll4Gneg28sC6GFRkjvGQREReTSNFXs32t7lqUVqmBYVuduirV91ekOnfDVhOVyKvZPh1fdyfKv5weUgsTvsgeVG1cTtsOa9W4nm8hfRT36Hp+B3Aff8S9N6EYAAAAAElFTkSuQmCC", $Z = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAT+SURBVHgBtVdbbFRFGP5mztltgd22NqVYemFLsZI0kZKoxJhYGgOPahV9IcFEoy/eMDz46KMPElsevISYUOslak30jRgjUgp4icZtQjQYWmtRCDW2W9ouu3vOnvGfOWfOzi67vVH+kz/zn7n93/yXuTCskIQQdVQ8RtxD3E2cIK4LmlPEk8RJ4hHirxhjKawHkeIEcT/xrFgdnZBjsVaSKw4U30ReLifcixdF9txZkT1zRjgXLiwF5PWl9LAKyhNUfAffzH7d3Bwyx9+DMzqK/A/niyYQgWzdvweRJw6g6uF94G1t5pSTxL3klsllAZBy6d8vtXKpON1/FM6HQ2BV1bC2NoFtbgTbuAksGvHHOA7E7Cz1TcG7chUelZFnnsOGl14Gb2xcEgRbauXuTz9i8flnwTJZWF1d4LW14YBS5MIoRToNchHAOTYNfazGVgJRCuBPrTz32adIv/Ii7EQC1vYdYNSTCUGlP0TKqlL4swhdwpcFyfnxS3Cnp7FxcAjRh/aaIHbrLGGG8n4qDkvZOXcWi48/Cru1Dfa2bdRJfr7y0AKiGL4IokEpV59f50oQ5JLYyW9g79ypuw/QXK+GAALTy9XDm5rCYt8jwPQ1RHZ1g6tOzLcAKkStaUVtAR8OvHweTvJXYGszYqdGwMiNAbVLV/DgJ0yVzFtvApenYEUi4NksGDHPZUNZcU6WGYqNjP+f0bLPXLfLsa4DKxZTc2bffdvEejhwpdrhZvXqF+7bDYuWYMXjsFtafb/Dd7dcVmgBZizZqBS+SVUMSNkjIT/1F/LpRXi0+tjPSW0FGQPtNvztVdHJT05jovYB5WvObcSjjbAYR5FOI/GF8cuK3BDEQ/A/F9sCryonXY27PzqF/S/0yWq1tUsAPXrgkbEYxpueotmkUo54JIqaWNSYOlBXTrMwURbqFtI5zDXkSPakPdDzxwbsL/TokQC6FcqFHMb/WQiVy5nmb7hkQqA6apdPfFYEq4AlyNB01kU64/otKmUZRpPTcF0Ptq0s2y0BJKSUvDRTrCTI98VMHjlXIEoDWAkInfuhVwLFHqHOkRI3L0qsx8gGAhNX59HZquIgYQe+QGreKSAt2e8cmkyyHxvlra/rpKU9UaKYGWah4sq/NzSAOlt3ky5YjmQQUVqvkQqwXc8La6Uj1JbY0RzH8tvM+lB9PAzslAQwKaXOthqESG8zjns66rWodsIxKW2uqw6sIAopdRuo+656nQGSkjIGThM/Lf/eOORhLPmtf+iw9TWDjB9B2XHvnoNm9YjeiuVBVOdlJuD+3guL+wGr+dYU+yz3E5meka7zdJFp0c138OBc/kD+8ert4PUHINbZBXqP4A0HTeWDUvdNxzHy1+H89iC4uA5+ixYIj2XKOhFphrVjmAA06+bCcRxckY6paqsGdvvx0HRrtYYwBHk48bYBU/kxfS0zb0QyFujm4G/N3swXEJePqKMhPI5XA0D7XipvOapcG9AkjCtZmA9BRW/QQQ3gifdBl4JVWcPsK+wtsDo+L1Xea76alr2WI/c3vGsDdO0eLrJE2YNJl7yKcupJ8KbXlEsN5X2kPGmOW/HDRAGZfocO+BEll6XqTiC+D6zhEFjkTrNlEhUeJhUpeJoNlH1suXNCzH8vROpr4f03LLyFX4TnzFR6mg0E8bU2Ev7jdFCsjuRD9oRYweN0xbEtCs/zvcS7sE7P8/8B5z4XbC+JrGsAAAAASUVORK5CYII=", eJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaDSURBVHgBtVcLUFRVGP7uvliQBUoRQcWVhzo+EjGfmaCTOsqoyDhaZqXNmJY1WjppDxW1JnNGkXKcydHAHuM41WiJ5ZhlOKBNiYIlAhou6PKQx+7Cslz2dfvP3Xt3FwRB1H/mv+fce8+53/c/zn/O5dBDEQQhjJpU0iTSBFI9aZj02kxqIC0kzSU9wXGcGY9CCFhPmkFqEh5Msthc9FaYxRLwPeJwuITWJqvAX7gg5F2qFApL7gpOl6srItsk73UqXBfgemrOweNmUczNbcj+6ToSh+kQV3sdAds+hBARgVhTKmxOQRwzfkQ4ls6Jw6KZsdBHhfh/0kA6g8Ji6JYAgbP4HpfBGfDerwtxpaQGW5bFIf6fPGgKCuCel4LSmPHY/10Z2uwuNFp4mGissdaKejOP19JGYtPKRAyKCPYnsYhIFHZJoKPlpYZGvPDeGSyeGY03EjXQHDsKITwczQuW4MRVK84V1ErzvF8Qr7ZWB67fMoGjrx/9ZBYmjIro0hMdCdySwVtycnBVFwVOF4pRxflQ5ebCnZqK4uhEfHH8Ju6aeJrMiZAcJ3iwOQ8bsUttWaUZFdVN+DJ9Jp6fE+9PYpy8Sjg/8Axq1rO+42oRmlPmwp2bBzV9SNHUBERGwhEQiKo6XqLumbr5QCEoKb1kRCaiSzxaVmFCWvJAbFszBSHBgTLcPiLwtpeA5HpmPVxGI2wLUoAqI1STp0AhftqDx+HepJnffxVa3ArZCnGcIMeEWrUa2LR8mDjv6af0CNMFyFOHslCopJtt8tPWzzKB25VQBgdDabVK4BwU/jGTXM2M5J9wg3cJ7UgxX7DXrOXtAnYcLkadyYa50+qQsWGaPIx5ez0nrVETe+I2m2FeuQIB+eeh1OmgeG42mAntred8ESCQqZbZ4J3SjVd8HmB9Q1UTWlrt6KNVwnBquewFs+gFIrCCOlnsSYOhEq4gLXSjR0CpVMJeUASFywXl778BsbFoHTMOfxU3oKaB90J9+lUxXO72HmhHhEhU1jSLeUIm4v1XE7B9zUR5wEoWgiT5LveGFS28GUvISoXbTUvJgpvNSqSRN9Qf74Ry0mTEzl+GUyUm/HjeCMnPHq9IcR8ZE4pW3gljfSvsVB+sNgccrFCJycHhdP5tfwJJLLSs8MBODJd+kAcjZbns8kZLG17f9TfeKRsAQ/oewGJGzLursXu0CR+tGQNdHzX4NhcVIifF2oXAABV2r03AgU0ToFYqqDDZYWlxwJe6HC6XNqDZ5pAJJDACeta7UlLvdZxCnkJMWsiarJxyLNx7Ez+nrofjpVeg3rEdS/Oz8cOG4XBSAjISjEB1gw2ff18mVsdyYzNsvEvG9VwkHqUG70apZ1jiRmEmtmwEx/kWmtxzON0oqWjC4s15eKsqHoY9B8GZGhG/9kVat0602pkX3CKJ7JPlOEiFyuldGb70XZESg1kTo/DfHYsMEcaSUBx58rwBaRt/hZbcGOq2i9bz2mBYrF53eUWrUSBAo4SWt6LWGYDuxZOMUf20FGoHDm1NQsq0IeIbloTMH2FDInUiU55ZwmnEPjoBZyKOIbWgJ+A+qaq3ERE3goPU8iMzC4GB9WIHydsnh8ctibRtS2JgBIpYr0+gmnatfmDu0qgUCA1W43FI7OBQ6HweKGQE/pDvFiUPpTgFYfq4/pg3NQohtMyYPoz0CVRhxvgITB7dD0qFAvOeifZ/nSuXYrYRhbGVcPnaHfR/MhAqlRJNLU5MX332PpWue9EGKHEpazYtSSdmvXkWl75Jo9OS95DyhIrty0TiCN2sC9NpEESleHBEEBTEtvhWDQb2D6JS2oLeCt/mxKb9hWICLkzW+4NnM2x5k9snP500JlK0mK3O0xerKV4qPKycyjeiscmOLasS/R9vZxeRgHREypT6qKxzYTOxNtbZcK38YY73voNJ5sYp0Ed6rc+Uj2UKv9HpkJZkwrC+mDw20nvma7/VPgi4pzm89VkqPIPlFwYJS5T7HkrP/HkHa3ddhKFdDvSkTnjA+4ZocGzXTCQlDvAH7/pQKpFodyyvqLZi56FCHMm54T0HdicKGvZyShy2r05EVHiQP/j9j+V+JPTo8GPCiGR8+y9+uWBEeVVzZ9MQN0iH1ORorEodjphBvfwx8SPB6kM66bqO71i9KLrRKLYWqx1xg0MQHx2C8DBtZ59iyZ3e659V6ec0W3gwMfX057THO4/g+z1PJh2LR/R7/j+L23HfQl7paQAAAABJRU5ErkJggg==", tJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASOSURBVHgBvVdfb1RFFP/N3F3Qdgk1oEFsy1LRF1AWY0rUxNoYg/iH0BiCxiDB6JtS/ATyBbQtGGOI0bWJMcSHqvHBB0QLgTSkCUvSiDUa15rYaCK7Ne6yu3fvHc65d+busG23y7JwNmfn3Pn3O3POmTMzAk2SUqqLir3EA8Qp4iRxl27OE2eJM8STxF8JIfJoBxFwkniEOKdujD7lsWiVeMUaeBH5lYqq/jKryufOqfKZM8qdmVG+5y2nyLuNcMQy4EkqfkBo5rBuYQGlEx/BPXsW3tT56yZQWnb6+xF/aR9WP/0MZG+vPWWWeJDckl1RAQJn/04YcAYujr4PdzwNsfoOOBvvhbj7HoiOTohV8XCM60LlctQ3D/+vefj5POKHXsedbw9DbtjQUAnRaOXV6QsovPkGxNWrcLZuhVy7NhpQr7mySlUsojo7C0iJjvQ4Yg89vKwS9Qr8bsArX55EcfgwYr09cPq2QFBPoRSV4RCWg0oVzqJMiVBWJHu//Yrq/Dw6TnyMVbt220rsMLtEWOAjVBxh2b0whcKeFxDr7kFs0ybqxL8QPLKAul59paMhAA9+YV2VlcjnkPj2O8S2bTPdR2mudyIFtOl59fDn5lAY2gP88zfi21OQQScRWgDLRK1tRWOBUB3Q7oCbuQhsvA+J05MQ5EZNm9kVUn9EW6U08h7w5xyceByyXIZgrpRrsv4W5RJEqRR+l4wcsjTt1CarLpxEIpiz/OFxW9cj2pVBhsuZ1f/f/wgc34ezZg0ccoFUoXGF3m+RBYS1ZKtShSYNYoBlnwRv7g94xQJ8Wn1iOmOswDGwOYYwvQZUuPwTPNrHjKYcB1i/Hh7JgZmE0NOLetRFmij972tXeFf+hVdxQakKxUsZdD7J2TxI43tZgQEzRTG1A4r9TtuH2SElmFslxZYg9igOfLIqlx7N11nrMsCLS5nO3IEj3SjAslIKrZJRINg9ml1KWqyMphQrkGSJGwyoYXuiVsDtuWy2FEiyC4Ij1VTawPUT3izZVojFGBpdciWN2wFqgxsXG2IpSIkcbO0AbKTEEt95ViDLkjbJbaF4PG7EIBNeYslsu1tNvFDLAhle9o/EB/mr4+fLqJ46BUcKnf3a4xKOLw5xDvTY8y8C69aZpkmTivkg6vKzWVSf2En5u6oPoZUPnxXBNfua49MXIXqi29JdUp/Ln/GXTCYh9+1Hu8lsYPnqARs8zdiLjmPQFczd+Shk7kpkgVatoGwmYGfia1uB2nGsr0hjQTWdVLFP0rjZtGOPV7z3R4/Z4GPmWmbfiDgW6OYQpmb/5BdQh99q2QqR7xl87API/S+bpiysK1mUknTFoO5AA16BHP8cIK1tUzYLHDDdnp2Jb+rBB+1Xk7QHa7MM6Y4Qu56FJL+BlPHrJm8IzInmwGtwzk9BPPa4DT7U8FoeTbbEw4SvVP7xY8Dp7wN5SXrgQWD3cxAHD0F0d9stWTT7MLGU4Jg4Sjy8qPG/BWBmJtgx/HDB/VuAvj6IWoKxiYP7aMuPVf04Tasbo1yzj9Omg1vVnudPEW9Hm57n1wAxEqQeoILWrwAAAABJRU5ErkJggg==", rJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXBSURBVHgBrVdrbFRFFP7mbpct3e12W4rSlsIu9QcCaoGAiW3C24aEKPhADBqMMRqNhCYaY5QIMf7RRJtqBIzRQoIEDKIYIjExvAJELErBGoFGuoWipTy23dLd7uPe8cy9c7vTbrdsS2dzdu687vedM2fOmcuQZeGc+6haSbKApJLET+KTw10kQZImkqMkPzDGujAWhYD9JHUkIT6y0iDWYrRFaCyB00oiqfNL1+P8VGuEn/wnwpuvRnlCNzIR2TQcDssA7qfqMCwzmyXcZ6Dh1zBOtcXQ2NYHg6evm1XixIqZeVg+04PJvhx1KEiyiLYleEcCBC7293sbXAB/eTKMnY09cDoYJnmdKPZoyBunmW1REjpHd1Qn4egIJ3ArYmDNXA9eq/aitCBnWBJsOM3Pd8Txyp4b6I0buH+SC97xDnBz0ZCGE28w/6M0v+V6HBo91z1RiDnl4zOSGEyg1QY/fDGCDd/dxMR8JwLFTmsqYxY4E3NTq5mCz80/bjZabyRwORTHR48XYdWDHpXEbPuUaAp4nQ3+139xrN97E0UeJ0p9TsR1hpjBrNoUDXGDRNaiHVPmxA1rXmmhE/fSlr21/xZ+v9xnQwmMTQMsIE0vtEdnTxJPN3Si8zbHA2UuUlqzeDImZ7O0TeDKvzSDrA3ouoFzV2OY6AYOvloCb26/zgGxFXarn9HW4z1o7zbgzHGYGlraWlqZ2pEkdFA/iWHVcbOdGrcsAHNtkmtw5zrQcRv45FC3Qhu1pjoywoVEo70rieXbriGaZLQoB2Vkfk7aM8akD+COhVkWtfeV/gy0hxKIECOXQ8eJ2hL4yJlhRc+AOCMr7cU3jpzAijN/mGZ3ODQUFXvBNJvAyAuXzhi6HgYFL4odBpq/nYHqdTVi2AztwgIN9PCC6Ol9dAlY0xk4SA9xxJnHAy3fO1Dx4mLgueeBGTPJn8ltzp0FDhxAygdSs8WJMHp7wcNhUKiALnpmzYL70DF7ynZhgUpzsp4EN8FT/sZu08YZtNG5udb0ssnAzl1AYyOw4XUyIlmxtBRwuShiKftrH9FoH1g0YnZp8ujqzc3g3d1gBQWiu1I4oV88GTSgwfJvDbavk0ToBT09QB8do3c3AmRK1K4Hrl2jvhidHbJCjMYWLwXmzQeKJlB/lAiFTXCm2ERGERgtLTZVvyb3Apy0YVL7tJJIAILIoiXArp0WGSFxIhAjqZwDfL4V2EFjFRWkORFIJge8gimW5cFLdreSMWgBUzQHMji9rqe9HIWFcgGt0LQ04MF5i+W5+5/FbCsklk+BCjkk+MkTwMLFQ/e/uA54+SXg4oW04TSlfAX2UJc4BWfooZKTSWNTykzvl7EvncT06cC+/XTfoWRZX2f5gXDQklLrRPAhcjQsCxhSdJrjamm1nbBJ4Jw1mdGL2Lx5GLacPw/ULAPclFi+2Q1s+QJYQs53uS0juE3ArtlUvw1uEhA+cIRknWhdWLsUB4v/NI9M5sDXCfz8JonSVSOypRPDEeAySVZV1aA6NXTUDsUiEflCsS7M/bEaET2aypOjC4LpDAwrMp5+7BjK3ZPtkUJN5uUdZsvlw7PTViOV0cYIXGbHNYEnVfDtAjstHXfHw1jwUw06Yp0D3fcuCZTnlWHf4l0qgVQ6llekevFcMM6LbVWfUpqEwv7uwMXmfzDnPRW83r6WpW5Tli+II+kX7T2te1H729vgTDIYqSUU16+f/yGeCTxljwShXMmGvZQe6ziON06/gyuRq6lJ2RCR4D6nD19XbcEj9zysgme+lEoSA67lV3rb8XHzZ9gd3Ju1FTT6rfavwvuzN8Lr9Krgqwi8SZ2b9YeJILLtwlf45d/DaItcGWoZAu6pWF62DGsr1qAiP6AOBZHth4lCQvjEZpINg8fCiTCaQ3+btTg1fs9U3Jc/DRNyi4Z6lXDuzaP+WJUfp9v5yEoo24/TrH2bpz7PF5I8hDH6PP8fdgshFKsBvjUAAAAASUVORK5CYII=", nJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWZSURBVHgBrVdrbBRVFP7u7LK0u2W72E2pFtptYoWQIkhUiAaKaKJiUzEaQny0JkiICQkkJoRfghB/oDEI/lFJoPwwWBKDMTExShQ08W0ppggqj5WHCLZ2F/a9O3M9Z+bO7Oy2Sx9wNmfvnbn3nu+87rl3BMZJUsoQNSuJ24kXEEeIQ2o4Rhwl7ic+SvyxECKGW0EEHCHeSTwsJ0b7eC0mS2yxAh5BOV2Xp2IZ+fU/Cfnl3wnZP5SWum5UUmSL8t6oJCqAR6j5CpabTYrlDOw+NYyjV9Iml6yUVrM4PBWrmwLoaAoiUjPFLTJK/BCFJTqmAgTO8T1kgzPwjoEh7Dl9DT6PQKN/CmZUe1HjFZiiCVNE3pD4L6tjmOZeSuXM/ro7a7Gp7Taa73Ur8RQp0V9RgXLLfxzMYPU3l5EygLunT0XI57GWlKktlSApuZVIFgycjGWh0buDSxqwsK6qoifKFThngx+MXkf3d1fQXOPDXUEfzWTRghph9keSVKGQlibEf1zL4VIyjw8emIHOphq3EvfYu0Rzge+0wb//N4Xnv72CmQEfmkiBjBQmZ1WbMUa2WUNzvbP6vLaOwvUcGdI3lLGhGGNLiQeU69l6nL94Ccs/P4+L/hm4P+yHoDhLslhAOF6wVgnLEbbhqsMz+CfIAyQXBcNAH4VyZrWGnx+fRWF0bG7hUNhPjkavb9+GM5tXofrYYbICSBsuy00vwHzOUl6kdZDFReYxnpOjNWlzjkCB2hrKnWhKx44TQ+6YbTTNUHt02AxONIrW1lYUCgUEg0E0P/0SxIo1VO/qR8ZdPZuJJ5QHXI2dB5AGook8kjmS6ZE4+2Sz7QXOgRbeIyttmT09PSY4UyKRQOLIIXhO/ICGZ1bh4ceqVMyEgyFceCW6WWFVetAWDcaQK+iki8SvV+dj6cwOHjJLOyvQbi/s7e11hBgUu8HBQdTm84jufhPxC8CmjQK310u4Nh6KG8mtFhxwQyYg9Th0CpdOYYK2hP467CntHIJj1FmQSqUQCARQTvyuurra7M9qBF7drGFlh1EGXk7WmDRSpETKjATZYylB7K9PU3KbHu3nYES419fXN6qoZDKJeDyOdDqNP89k8MLaFNa/ksX5C1kapZKMzChM72WMciMFp2yollkaZ2zxEU3FArFY5dMzT2FgRdhLrMh7e9NY/kQaBw7mSRopIjOKGThlMQolMkwdlAJG4az9OuQUak66sYjzwqYh2jcFnV1t3HCNabEdLccTDiy4x6aHWlpaMF56ZJmGA/sMhOuMcc03LVc5amaNVmsPxTgEUe7Nnj17TEEhCtb773jxxScMjgmTnbKad6H9yqyExy3hIbS1tVVc3PEo8NtPGtZ2FzBRkq5WeOaSR5zTsZ9DcIS4m586OzsxMDBQsljzT8Os7mdx37og9iTpxVlMkKQqitIsRCsaF2NRcfCoXYr5IApx4WlsbEQul7PA5z0Isf5toL4JkydVkjmBqSyfXtGASPGSMl1T5/J+fgqHw+jq6oIIBOF9+Q2I1z66SXAL347Bi80BN3gPY484jrkezDl0GoO1VPaE5hy9k0ZXh1KEjuPD7XVuBYrHsboi7eI+J2NvxzzXaYZJkixaT3LeXVjrBt9lX8sc01Qu8LkQ4ef9f6Ww5pd4aR2dEL5Cp8Tbe28tupr99kgUrivZDS+ln17OYMPxa4imDcB1ExoD2bkb1vsEPlw0HUvDPjd45UupUqLkWs43me0nr5NHMkUFRlWkCOwlb3U1VWHb3GloqNLc4De+lqOCJ2xF3vo9ic+uZnEuqZdKUHkyZ5oHnXdUYV2LH81+j1tkFOP9MHEpwTmxlXhD+Vgsb+B4vGC28bxEa40HrQEvwlO10URxcm+d9Meq+jjtkROj4fF+nI47tWXx83wZ8Xzcos/z/wG57ULS70NrKQAAAABJRU5ErkJggg==", oJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWRSURBVHgBrVdrTBxVFP5mll2w1GVpoY22IkgxaSSVGhMfTVo18YcxGjQ1mmhNjfG3bRN/qKnSFE3UmgptbCoaKGpajAotklBqStFWolKhGB+kD7YWsCCwu8AOs6+5njM7dxmWN+UkJ/fO3Mf5zj2Pe66CeZIQwkNNMfEW4iLiXGKPNewn9hJ3ELcQ1ymK4sdSEAnOJd5P7BMLo0peO9f+yiyCWbu3iXckjxmRCPSr1xD+9zoQi8HhyUD6XeuhOp3TbVVCp7EHCwFgIW9G/JhNivoD6Dt4GCM/nEPgbCuhMKasW1a0AVnPFCN7azHSbs+xD3mJHyYg3jkBkHC2b60UbpAgX08Pru16A5Gf25C65lY4V2XDsTwdqstlruETiQ77EPX5EertQ3hwCKtffhFrX9tJQNbOCkKZTfNwOIzBwUEThEsIhJqaoZ86DdqEJ1ur430h9yCOaePQ/uqCUFUUVH6MjAfvnxFEMoBuKVzTNAwNDcERjiDWchb692cgaGOWrcAGgCUq8Y6wtuQeG0i/eBnaFS/WfVKOVS88ZwexUUaJYhO+H5bDsea9v7Yh+mMrjNZf6EckMVFJRi1REAghkAAiWbt4CTo5a2HTcbg3PSAXfUQAdiYAWEfP2iMajWJgYAB6yzkYbb8h2t5pCVXk5AkAlubyFASbwjKPMBs6iWgMo+0dcGRnoaj9J6RQxFiUx6aQACqp2c59n8+HYDCIlJQUuMjJjJ4+aN+cINs32wTHgUwiEf8vYANDXYNavduLMEVR9ivbkX9gn1xRRgB2KFa8+6T2/f39ppMxACfFtUqOxN9G/wCCX9UiSGBmJGUCTMIM9E/3/oMIKSVSU7Hx8gW4srJ4FvtAnop4ejVpfHzcFCaFmt7OwC5dwcin1SYAEQpB6HbW42z/H4ozrH/kVGBBCn1fLzskxZmpPQXx3J4AwMIlAJ0cUDtyFOHz7dMmHnnsMhQnnQJ1+PgN0hyRaMJ5fQ2NyNm7W07awgCKzL1oMpvA4XCYAILVxxDYXQqVjk29KQ2LIWNch0HhPOHElEv+7EKEEpUzayVPKWIfYPt7IpTNOOkwAAlCDAxi7MsaaF8fR4x8AEpS4hTWEch8YIUjn5ag0BWkkPQFw2SBGLXrWxpx83338gI/AzCXhsg+HAFSuN0PRCgMra4eI+WHEem+msiEHHKKdXqQ2ZHZZi57TuC/MerlVhxE9rZ4YlLtCkmB0vlkCxdFA+V/lWKZbz9TM2rBLTGsvtkm+Upy4uK+0+NOfLMPcDh4WPNkMJx6tdp6jH5WjfAff2OpSM1IJCM/A/ASFzEAxWbj4LFv4XvrHYiRESw1pW8olF0vm+AC92TykbRs65PI3PsmnFRoLCWlUp3gmEjHHQzgTGKQQi5BdCLpzz6NW07XY/WJGix74jEsBbkffcT+2SJTMV9EHr73h4eHp82GYnQM/j3vYfTzo1gIJUdBYdd5uCaqpUzVupeP8BcLTUubnHQMqnQCH5Sj957NCxaeTCsp9GzCq1j2lOuYY5rzQbijE2MV1dAbT0FQRlssSc2dJLigqY4A3CaHzOvYzANWiVRm9eF2uynOKW+RSYwbFC4v7bX7Su3Cy2RZZq+I2Bfo1omXZJwZuS6IUT0wWn4IWkMThG/+bw277XMqDmDFtjlKMgtELmxFKd8PDMKsbEh48IsaBN79cE7BslUzPcirqcLyzZvswmcuSi0QU8ryIF1E/bteh/bdSUaFuYjviEzSeM37pRTzbrvwp0h4h33uvB8mYXoJ/UcPk9GGkwhRpZu8kDV25eUio/hxrHjpeaTdWWAf9mK+DxMbCPaJEuJXk8di/hGMd/5ObQCxQACp+XcgdV0+UlZlTbcVO3fJoh+r1uO0SiyMfDf8OJ0GiHyeP0R8N5boef4/PCdQ/Jpf1TsAAAAASUVORK5CYII=", iJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX2SURBVHgBrVdrbFRFFP7udrvb7va9bekusLa2oIUilHcMCoiKYkiKGDHUqAn8UNQIJib4g1DxhxoViopElFA0UQwEMJoIokDTEjE+WiQK5dVtu9BtabsP9v26nJm99+4F2qUtnPbsnTt35nzfnDlzZkbAMEUUxTx61JDOJ51GWkqaJ312kdpIW0kbSQ8KguDC3RACLiXdQuoURya7WN/b2RdSALPRbSRde/O3SCwKW/8VODx9iIsiTMYcVJaUI02jGcxUHXnjHYyEgMT8GBJu5uIOeLG9eS+aL7bgRHsra3NLv1nWSVg+9VEsmfwQrAUl6k820oVExHZbAmSYze8BGZwBbz3+LXb+fgA6bTosucUoys6HUZdJ71puIhKNwBnwwOX34oq7F/0+N1bNrcG6hbWw5BWnJCGkGnmL/Sxe/GYDfOEgqszlyDVkJ3uJqt43OcMXDqCtxwYNNWio3YTp1sohSdxMoF0G39/6G9bsfY9GUISKImuSsWaIsBGVH8izc6G3E10uB3as2IBlUx9Rk6iWV4mgAt8CKeD+6TyDxdvXcPeVmixJqoKAnEgMxb4odHGgMzsdPp2GA5JBBZnHh0ziahf6vE78/PI2TB9/vwxXT+3XKQQk17PRw+7swZIvXkPPtQFMow7MsC4uYpHdi6U2D6yeENSxfilXjx/KcnDEmsM9INCfHKAi9YvFYzSVbTBnmXBiXQNyM7PkrmVsKmRbG+Xaj499jU5XD9Ip4EKxCAqu+fDh0Xa8/qcdpVc9SAuFIIRJQ0EIwSDKez1482QXPjt8AfmeAILRMMLxCELSMyrGkKU3wO7p5bZVwr0tSOvdyV46nQ7M+GglIvEocjKMmKU34ZNGO8y+CPM+d6syZ+oAlMoOYzpeWWBFT6YWyhzQo2PgCnyhALJ0Bvz39j7kZnAvsBgoYx6okW1+//chDs7QfJEQ6g+dh3nAy0eMYGLUYOVQ4p2rqlzS78WmxnbyXBhB8h7zRpDKLHExm96wH9ub9spwPLUzAvPlmv3/HuPDYaN95vwAxnY5CJSAOTgDC0ugwQSw8pTLQUy57MLcjn4+BYxAv9+FCE0D9yDZ/vXcH+ppmM98xRIPgpEwzlxtT0Qzae25AcDrA+IU7hkZGIk8e7obh8foESAv+imHQAIXBBF/2f+nugAMlMgYNiNQykqtl8/yRuw/naJ3tsOfWHl+PyX/CFWmQxpGUm5JRnw9YkZHCO5gIaK0ApSkBamtKOBS32VUWSpYTalWmgt4KUhkpmZ/mC89RRgBpowA23DkNS8TEmUmIi9nkdc4uCKq1EleuNhvlwnkaeUmXnKLhE8kBaXbjSMmI7EYRiWSMcKHUZ+cUhaEPCXeU2BWGnUbtHDr0zBa6ablOBi4LGw5SuJiBGysNKFwvNIgSvm+yZKF0UrTWGPK7w+MnSgXeSY8xVlRtppinqA0+rKqEKOVz6cU3VihCqcKGqghXZmCVkbguPz22MQ5SsNmixF77svHSOWrySacKswc/CMRWTJpnrqmkRE4CCkOVtMhIiNNpzRe/6AFF/P0GK60FBnw7mzzkOBMVs2pUdce1Ej78m72Zs4pwnPVjyuN3bo0PLx8AnZUmZBK2KrZXF2MRcsq4NFphkSvnf4krPnKUa2BYd+yHbuDXszc/Dz6AoyXoETwve4QXj3dh1k9fozxRxGler9WQ9twNnZXmtCWr08xchHW3BL8uLoe1jyFAN+O1QeSenq8wcrNdOhcunOtcgi5I5EOJ/te+ACLkjG2lcD5dqz2Vx2kJTmvbBq2Pb0+wV7E6EXqz2ypwG0SFpeUh9Jf2k7irZ/q6YDigHo6hgVMP4XGPOxaUccHpAIf+lAqkbjhWM7A3z/agO9aDiWbC6mAAS3tFyurF2PTE2vkw4cMvozAW9Vdhn0xYUQ+bdqDI7Sfd7i6B+1aUTgOT1XOw0szl6K0wKL+ZMNwLyYqEmyXrIMUmGphK+V09wX+ZFpuGscznMmQO5iprUhcz0Z3WZUupw3iyMR5x5fTQYjI1/MFpFNxl67n1wGedgKTFnxNYAAAAABJRU5ErkJggg==", aJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYFSURBVHgBtVdrbBRVFP5m9mHZtrBKm5a2aRcQYiCRQjUSSGkLBI0hSEAICAUSEJVEww8TNcQgBkNiNBSjiSYawEeikWARtBhrCqmABVJAXpZSuiTlZardvnZmdnbmeu6dmd3ZQrutgZN8vY+de77vnnN7HxKGaYyxIBWLCRWEUkKIELR/jhDChLOEo4RaSZIiuB9GxCHCTkIXG5nt5mPxf43P2Ca+y0xDYfHYJab21zEtWs905QQzzdhgQrYOxSMNQh6iogFWmK0+MwK1dxdi0V9gxk+kDGZ2KXvL4Au8gIzMJVQPuV2GCVWUlnBaAUTO8/uDQx7pi6G78z2M8X4ISc6Ex1sE2ZNHI7MgST57jE4C/6WyC6beAdPoxI3+rQiOfR2FuYEhRcj3mHmCvPHcHUyr3o/zrY3wjZoJ/6hyeP3jSUAAHtmELGkCHtkgYUF4fSH6rhz+wAI0XbiIik2H0Hyl03HPfTYMXBfygAAkwv5lXSvmv1aHQIYfeTlT4PFkEJlCUIlQhSxTPVFqVl0I4n0eFOSWwOf1ouKVn/Fj4/WBIoJ3CeALziFvaL6JDTuOoSQ/G8X5WSLElmOLSJLcZHYp2SJsmDSGj815OAOrtx0dGImtKQLssGzm9eu3+7Bxx3H4fR6My8mEqvMl5pAkIQlotIgcQUpSiMQFxKDGGApysqAbwPItDWI92bbZSYUTgYSi7bvPInynDz6fl8hNcmKK2XDHUgpU9EcVaDFHjANFfMtMHRqNjxN5VsCP63ei+OCb83CZmLBs52OdM/u9h6/SCpfJiUQOmBDAYBFKUFzQ8FuDiqZTqhUFAc0CiTBINI+eFjehx7l3CZ8daHFHYS3n5hFY7PR8vO8SpUMWgenTTERVQ4hgZgzf7lNwvEkV6QB4qWDnJyo+/Vy121b/iZMq6n7VKGqaEM/TECMRpIrIdXz0/SWHTmztnK3C6Tl4rMPaGQgmjensjok0MMrnE9NVrFinYe1LKnp6VOw/oKGXysstGuobNOpT8PxqBWs2qnh8Kq0BQxcCOiOaWAPCKYk40nzLnYYKL6yDBT39Otpu9InwW0tDQq8Sp5kAhqlh0kQNK5cBvx9nGJ0tYckihsP1EtWB+ZWWt7ZrwCr6pqiAwbiqo4vCHVXjCXIwifaWvymqBh6iRc65Zedf70zrP6n7omQ1+ikNcaNfhHzTehUXL2s43WyFPBZToOtWChqPqWhrV7F+jZUeTe8VKXQ5TAhpv9nrdIZkOxeI9OpJpQklVskYzYL1I1QcRdk0hUJOJIyTa4jHKfdMRe1PKqrKFRQXRanNYSR92JNxfIdv9SXWgdep9Sk60puJ8tmgKNgtw1or3HjfvMqhxnJy69jyepMbMK+Ji8OjhdkY5HBMsSmTgdNnCM1Axw0LTaeAPy8AT5VhWJYd8DnVCI9AmFA6UQiwlQ6hY8Z04K8rwJOVyb5Dh62yqBDDsrLJY51qmEfgHK/lBDPwWMloiDCxwQfn5gAn6cjqaAFWLAVeXg/caqV7WB0o/0hrpZMecafgLK8dcVoLZ6X3EBxDs6dQF45L9uXT9WDObJ7btMOxbG6Ju3mUC6iFvQ5eXDQZXo+MB2NWWJfPDbk7a2X79rqXtyYUZKH66fH2xwxD5oKseiWw9DmkJ2aWnw0LJyFER7Rtezi3M90ap/f9TTMwdrQ/HbewZxckd8F0VpKfibeqp7q7tvE/QoB9T9vF68EsP757txzJxTgMJYOaNXue1a/fnoXivEznh13O3dCd8Hdg/UuiojQPX7w5Ew75iCWwZOmRJeFr5tRc59ewzYUUAfZaqLI/wJpnJqB2xxyE8gJiFiyZyqG57cDRWU834gzU18zDqgXj3eRVQ76a+LWc0O68KmjfZm3X3mDxCO3uBLM7CeaC08e/MboDrKV1O+vqTXmstNtX/uHMQjzH2lPeN0Y7M6KvkvOJFokgsuG0e0rpmy30cro98HXUzkb6TLOfZjX3fGyZ3XRRbqB7ykFmal/R9e8P6hv06VjjvoaP2Oxo7GEjM65m93Bmnf74c0UE1v2xkjAN9+l5/h/3UBVQxn4SjQAAAABJRU5ErkJggg==", sJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUgSURBVHgBtVddbFRFFP7m7m7p77JohFAK3VbwhURqAGmTYsEYYlCSNoCoMUjik4mJrS/EF1sTNb6VEkH0xTbRmCiINpiY9EHAxKZPXZSQVEG2rUCr1m2B3e7/cM6dmbu3ZWl3oczNyZw7c2bON+ecOTMjUGCRUgaoaiVqIWogChIFdPc0UZgoRHSO6HshxDSWopDiIFE3UUQWV77gsYvNLxZQzKvrJGq/qy+RQHZ0FOnxcQifF1Z5OTybGoj35Zuqi6zxPooBoJH/DGVm1TYzg/jnJ5A6fx6ZocE5E0jNWxs3wrenFaX79sNat849ZZhoJwEJLwqAlLN/TxvlrDh29AjSfb1ASQk81athPbYSKK+AKFErlqkUZCRCstPIXr+B7H//wnfwEMraO2DVrF0QhFho5elQCNE3DkFEo/DQ6qzly50B85FLVy1jMaRHRsgkFkqPn0DJtsZ7gpgP4KpRnuz/AbG33oS3uhqe+vUQJCmkpFoNYd5ulGoWaWooXhKfuXIZ6XAY5T2foOTAy24QT5ldIlzKu6EDLjU8jOiLz8O7uhre2loS4k8pdywg58KXOhps5fan2tIEIjM5gYrT/fA2NhnxIzRXhwNAm55XTz68juie3cA/k/BRZFu2kFAWwALbxgGiLaDgIJvJIBUahqS4qfrlVwhyoy517ApL/3Sa1ngPGWJ8DB7aUhZtN8GUTOR4/S8ScYh4XP3HDa/IsuVVn5VOwVNZCTFxA/GPPnBjbdeutPd7xF792BhuNzfCQ5N5qqrgoQi2pDKu0PvNsYBwLdnVKJVJ7RhgPktMZmwUmVgU2bIyVFy4CCuwgqU4BurYAq1mePJMPyxSzo0WRTKTWTHiatVgPqH+bXLz2gosI+LKWlaS5ksllStnZ5H89JhRZ6d2bm8xLZlT3yrltBIrm4X4f0qbWE2GRFIrjSvFTm34uAKq5dktmJoiN6TVnKxjYMDthhZ2wTAxDZKEotUr4WUAZG+PtqygNCtKS1FUMVtyNk4UU65g5eSaDNXll8MQfj9Lhlhf0PY/RaqJeFVrIjeAMh04zwuRV5HDQ+cGsh6PEbQodzHbOfvnH/Bs3sJNQa/2BSRlOyfY5hcGwMSdlN1UApI5YZOFGADzDGBeMXNz/pBh2vEKQMDrSPC2wdy9nuegIDtmUExxH1ZOW5WTC2xr2ynRqg3CrXKxhFMsiDmLqiw3XdMMIGx32AAebjEgrCcbTJOdCS/YnRTpYusWPIziPilFXR0EZUZd7F1wluh1/rv02i78uOqSk/eXzA8mNondsf0FbM/1nDOpmA+iQCQxjae/ewax7OwCkXh/AFg76cJQ21msrawxPSssfS732X/LAnhl/f7ccbYURcLJEQce3+tW3su67zqObyZvYueZ3ZiYnSzs/C0QQE3FGpx87ks3gNxxrK9IPcz7S/w43txt5+4c+gdTzhb9cGunW3mPuZa5b0QcC3wuBPn/m79O4Z3Bd+lY1QiKtYQr9LubPsZL9XtNTxj5rmQaRBCuS+ngxBA6hg5jPHotJ1QIEK380WWP4LPmo2hatc2t/N6XUg1izrV8/Pbf6Ll4DF9fOVmwFXzCh311bXhv82H4fX638jZSHnLLFvwwYSv0jXyFn64N4OqtcL5heMK/AbtqnsXBDa9iTUW1u4sHFPYwcYHgmOgient+XzQdw29Tv1MdxUzyFuqqalFfFURgWSDfVBzcXff9WNWP015ZXIk88OM0DxDzPN9BtAlL9Dy/A1IHwLPwShTZAAAAAElFTkSuQmCC", lJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAToSURBVHgBvVddaFxFFP7u3N1lN5UmkEhSzc8WIeShkvigDyEhrYKQPNUiEuqDUvvSgNAnFXyoBnxQCE0wgqUmrRgwD/4EJBSCEIuNJf5uQHyRmE0qiCQku/nZ3bu7945n5s5sZtfdJtGkB76dszNz5/vOmblzZyzs0zjnNVScJfQQOghRQo1qThDihBjhNmHKsqwEDsOIOEq4StjgB7Mb4ln8VxMRK+J/meemeT77G8/s3OJO6mueS9/lnpetJOSKyl5ZsyqQR6mYhZ9mv85LILM1gmxqBl7+u6IBuPJZ4AkEq84jfOx58qPmkHHCGZqW+J4CiFzM75eaPJlMYuPvd1BT9SEsFoEdaASz6+nJh2BZQfVMjgSuU7kBL/cnPHcNwbVLCD/8BuzGRlPEcyQiZvKxMpEXyOfn59HZ2YmFXz5FMPIUQpFuBEInSUAVbOaBWY6EzVwSVoNAMEr9uhGqeha576eReOYMsj/+oIeXY5euC1aSgELaJycn0dfXh3A4jPoTT8K2w0SWJmTAmEDaKB3fl4JEnY3Qo6fAgkEknj6NzOefmSJmzTXBjOivavK5uTkMDAygqalJgnt6YE1kkjm7/1lmF14GweZmBOvrsXXxAnI//2SKuFIkQKXlsvBXVlYkOWMMDQ0NcByHFpkm3YUl4dAi8v1CdrQwEmBlMgiceAR2Po/N/hfgJQpbw2U9FToDBUVDQ0NSRCQSkeQZGgSeP9dWEQRxWpUm0n5fl0Q4BCJnx2jB3ruHnffehWEyYKbm42Ud/cTEhGyl1YpsNitFeJ4aHGkDKvoiOD6EMJkB8ul5O5+TkWbHrptZeElwi/qzumZsbIzIPOmnUikJKYA7hWhBBIAo06rU8Ot1H4uyJqbAoixYFIh439nmJjIfvK/p5NYuBPTomunp6UL0Qsj6+rq/BigacAFHlabvKKQVVDZcfw1Yq2tgOT8DQkR+dtachp4A/A8LdnZ2sLi4KMm1bW1twXVd2lgsFaFcstjd/8pupH6by8ATWZFKP3r1hDt3hzSSMHq9BbcQEBVeLBYrO5SYhlxeTEu+DGElEdTfycNK8UKNZcCLx2G3tYnqqBAgN4Xt7W1UNC/rp7eQSDMD5teAK5AALvraRcPo3u4fi1pATUA3CgFm+isowUGtdLKkiGCw0C5kyveimXatozKrtDx+XDclhIC48FpbW/GgzG7v0G5cCFgQXnV1Ndr8eTla8lOP6zdAWEwI+Eb/6+3txWGbXpbat8+dM5tvCwFTUOtAfISCxgI5bCHCQudfNKunmDq9fiz+1dbWor+/H0dlgQuvgLVE9d+bglt/DYd17eDgIOrq6nAYxg2gpQWh1143m98WP1KAOiyOCF8sxvHxcfxf46ZP+0voo3Ez+hF9QDWPZG9BvZJdXV0YHR0tNHhcHFpwYHa5Jwrya9cR6OrWrXHFVeY5/xKypA/0MzMzvL29nd/6IsK9JCT45v2h++WuMZ4+2czdO9+ad4SlPS8r4lhuilheXua//3qR5xPgbmKXQIoxoOtEHzcZ5vmFS9xbXS0l78C+MliSCWnuEndTr9Lgj/kkkkhB/99spz5v0s3pr5LL0T4iLyNCXM2GeTnzknQXmeU8+xUdmD/hXu4u1VW8Og7z+1zN9puNm/xgJtTc2E/Ue31/izIC//x4mtCOQ7qe/wMfftXZDv5mzwAAAABJRU5ErkJggg==", cJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAk8SURBVHgBrZcLcJTVFcd/+wibx242j81r89qEPEgghMQhxYAEUyuKBFEqMggoo1Ot4xS0oo5OhahYiwJSFKujE6ZVgYoiSqyAICEgYGzCK5AHeT8JYbNJlmyS3ez2fl92M0uLWB935sx3v9c5/3PuOf97roL/c7hcriBxmS8kT8gUISYhQe7XFiGNQk4KKRHyqUKhsPBLDGHYJGSjkB7XjxtF0r8/pF9xHcOSd6uFrPyfd0NDOJuacLS0oPBRo/T3RzU5E8W4cddStUZEo5AfA8CN/GtGwzz6rLeXwXf+hr20lJHj31ylwOWeK9PS8SmYh+/CRSjj4rxVNgq5WQBp/EEAwri0vrs8xi39Q3zy3n7sW4swqIbRRYahDA8D/wDhsY+swmUfxtVjwWWx0N95ia4eGwGL7mXmY/diMgZeF4Tiep5XnG1n4bMHsdocZCSHEqzTyN6GBfuRHBtISKAGpVJBx2Ub7V1XaLs0IMdjwGbnfEMPCqH9vWemk5eb8L0g/htAg8f45/+q5L4XDhMdFURyXBAKpZI502OYMSWC6Ag1AZoAylrLiNfHE64Lp6qzCp0qluLSFvadaAOni5pmC3UtFt5dfTPL5k7wBpHlqRKVl/GN4nKb7HlVFwVP7CUyQi+H0BimZc3DGRgizRgD/XmzeB3BDj/8GcfXdQeI6vfl2+bjGA0GomId/HbmZMrOdYsIKLA7nHxQXMPNNxiJG10OKbl9CwsL90o3Sq/Qy9ne1tHLwqf341SqiDJomWAKZvUjaQTrnVRUHKC+vRpTUgZRqcnU00Z8dBzmCBfamEjC1UGcqzqBdaSdN5/OJWdiOMZwHSqVisXP7JXzyT1WekpU6X6w2vNm3dYKGtut+IjyChZrXPhINt+1HWbjtucxJKcQKbK7fegU75S8wr/P76Hs/AG2H32T/oE2WlzC64hA7LXNvH14M39cOpkJ8UFoAzR0WOw8t+mo94rLDivc9d4j3TR19JOx4ENsDgWB4qfiLTkcu/glU9VJDEX5k6HL4LOSj6lRlRIWEUNyp4kaZyXWMyV0xgWjGUxk1bwXKTWXMnihnfzcO1EpI/nVst10W2xoFE4ai5dgEJFllD0TpAjM90D6bF+VbFwKzLy8eKampFCgyaFGc4n8xHxcnafxr/yc2wIXoW30wTnsYMBh5VJMKMkNTnLOWulruMDizMVEpqezafda/PyHeHhBmqxzyKXk9Q9PeczJ1C5FoEhMHpCe3HjfP/mutlfERcmxogK2nVvL3PGzmRQ2nrr9e8BcQnR2FK7U+3npxMsEmFX4tbjoM40jxicMv+2iEgIUTFn2KBGTsmkxN4KPCmNwFkl3f4TL6WRitB8ndy3xgNgqRUAiHhx2hzBukSvTFKUlMU7NisSl1A61Urv3CKFdX4C2j25zC+b6w8xJuIu5vTPITM0lOjKOqYosetpaqT7fxM7CQoZbq9nZ8gV/PbBelG2A4A29rLuybYDLlgEPgClqT92fOd+FhxnSE4Kx2Cys//ov/OnhzUROi6T7TAK21tNYpWXo6yBl4jR0d99CXN0qJl+x0nz5MpE3pBOanM74rFkk5M7mSWsW9qhWylvLycuOlHlBYrLaBguhWf6SNZPavRaYrzhGrQtJNelp6m1i5a9XUdZcRkF6AYaMfPq1Cajjb8VoNHJi59+JTVXgGDbiF5xHVmoHETflkpCQgF6vl30ZcgzxSs0W8hW3ExGaOKa/rq2PaVlGOQ88ZYh9yO5VIQoSgxL5sOETTAbT2NPAwEB0Oh3dYhcMDYnBpRwkMFyLbugtmk9fIDw8HIfDgd0+qqu9t53C7KdIi0rDm3S1Ot+xudJdDphig8Y+au+2caH7AlnOeDRKDd4jLEwkW0gIplvncVI/nf39C7kSYiImNUAmHI1GIzOgHFWbmScPPUf3QDedYr8YS3/d2LZtkQA0SrMEo3bM++Nnu8hPzadZ3cuh+kPyU5tN7HBaf9nDOnMHu8rbibI1kGbQc5CNtDJLDr0EQPpGGhMjJrI+/8/kjc+jvOryGIDMZINn2ijlgFSYUzR+Gm7KDKf09CVBSFYqqsUPWh8mWcMFN9j4R/lGgtRaBqz1HLmwj5qB5Qw2NouGRId/YixfWd8l93gufnHxLJi+DF9fX177ci0xCgOLtM+OAZAc9YrASQmA5OL90t2snBgZgJSpOw828eIjK1m/83l27T2KST8Ou7WfPj81xqQcOjq2MD2hlUCfEc4NzCAhI5U+RR9l323DqDOgjxzPQ6lLMKVmsnlb3Zj3s3OivVe0xEPF0jYc1NM7SNKdO+izOVGrVVR+dBfbTm1g3uBkxt8xGz8fP97fc4qjBz7lsYcWYtf34q/RcrGqh4rKZnpGjDzzu1x8x/mydN3tzM9fztSYOWTft5teq7QRuajdJTUpnuUmWM4WAeJ1cVkhzZ967QgbP6pB6iayUg3se2M2lYJ43tjzMr9fvIZp0dPosfRx6Nh5WuvKmTRxAsrAJLJSQlConWw4uoFlqpmMRAdjTExh3opvOHbmomSEZXck8d7zMz3Gt4pkXe4BYHJHQWyZw2Qv2klL95AMouCmWF5ZZaJv0IyPeZC3zxax4jdPMzISjL//AHqNnpLacvodFxmua8U3QDQq3WdZu3Azj2/4lqLPamTj8VEBfPXWHJll3SNB6oxkHnC3SJs8JfLBS7NEp+KUQ/a56HAW/OEMBp804lMySPSJQdc5yEs7HqT7XDWvFq8lyeISVO3ArB1ibv4Snrj1Ve5+8uCocbmJc7Hp8Rxv45s8bdkYO7hzoQI3Nb9fXM2DLxzFqRjlKpVoyR69ZwKP3ZtGolHH7srd3Bh/I/XmegaGB8hPyhfNqIjQx9Vs2l4p1nzYo1iEfYYIf/JY6eHVkl23KT3ybTPLXz5BY+cVr68Uoo5DuCEtlOhwmc/pujxISUWn4Po+nE4XnkbdoFWzfd0t8j7gZfz7m1I3iKvacokT9mzZg2PHDvcP33uWGf1fMq4Sh5V77mHpqvneNd8o5C5h/CRXuXMtJdc4mNDSjLNItA5fFkNd3TWNI1o2brsdxf0PoIj9iQcTLxBSTqzBXZ5XjStiSU6dlK/SiUlsgZCYiCI45FqqpORe85MPq+7D6VbXjxs9P/tweg0gnuP5LCGZ/ELH8/8AjloQ8L6qRXgAAAAASUVORK5CYII=", pJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUSSURBVHgBtVddiJRVGH7ONzO74/4xteWIubKroWi1bhZqoWwL1Z2hoBRJVnQRdFNWENWFSnplkUogQaBhEl6IElFJQSnFIiRopF4k7WZbrSn7Yzs73zffz+l9z3fOzPl2dtcdWd/hmfN/3ud9z3vOd47ADEVKmaNkA6Gb0EVoJ+R08wihn3COcIpwQggxgtkQUtxO+JAwLGuTgzwWtypssVZcJVFYlEHpknQLX0tv/DvpF3tlFJWmIrJ9Oj1iCuXtlHyP2M1KxvwbOPbbJ9jYehxh6cfEBFLnnXQXMg1bkG3cRPl2e8p+Qg8tS/9NCZByXt/jRjkrPnxxL77qO4L69BwcWpWCk8rTyCYIkdFjfMhoiNJhRP4AovAaMo0vY07LO0SkbVoSYjrLL1z/GbvOvAIvcrE4txxNdS14a+nQJMwl/WJfSCmITAGBf5GKDrJ3HEVddtWUJBwkpaz82z+OYdvpTajP1GN564OUZuFLD45w4TiMopV6cV6Y9hQydQ9QmsH49XUoFY6a+ZWBekclCXDA2ZbvObsN+cb5mNu4AD5K8MkLioBSZCvzKmXHTSCdWUjIozi8FYF3xiaxPbEE2vV9nL86PoA3Tm/GkPsvlrR20joL1UuIuPv7nVeRXEGJ5DIKno8AhSgK4Htnqdd8NOfPQzhl4zt4KYwHyoyOXNqvSKTTGWVxSVle0vCIiIFLKOrURrHsHaG8EiCVooDFFbg3dtlcX1Mm6PUY5sIgKX7+5FpEIkRjXRMtwT2QIjbUBN3HKwentJ7rpKqyPEAThH4fwrBA3mhGU/6K8QKflB3sgQ1m+Df9nyvlgmo9OQ43LNLaewiiEnmCvEEeoBaCSyjq1CCuZy9w3ngqjpMSgZfxPwrIfUadOtqZQLepOfXXl7FhhIisGA2GletZObvfJyKQroZnpYyiBpGAAZO8RiR8RYARuCdtl3WnEX9Y4AZFDBR+V9YLTcINxyiNUOfUV7yuJjXun/QgrbSRFwWBsw4XCWHYS+cE1TsN3LGLCbRz7vLor2XrdcgrccNxBHTSpenUE6rRq1ZUJRE1lWiaoFKldxJDRmzo/VzbntZrQUfuaFk/khwoBnzQZooJyIkesINRakRVlIxdjCi4TEe0IpBLmw5e6FoesEYl7KXJ72tFLVKhp0nS1hCftZQjjwnwdsjNa2izhkwjXoBaJWET7805DaZphHdBP+famhfhdosh4XR2mSp1Ep7nXEO6GYtaluF2iB0hYslSiGzWNJ1jAj+Y0ur846g+3WZPOYuz/im7+RQTOIE4DrC+YysyvOcnjppFST+7xS6ecPTt9VMu3ZWdhycWbI51z6LysvVbnoNoW2iqD7Fu8zXca2pfWvY2cnW1bbXpFJftIMWpba/bzTsVKf7TVyT1lWjKtODdlQfUSJmYoXbl5TydPs7e/bb1+8y1zL6S7YDekp2ta/Dmig9iEhNnq5FExMr3fQRn7TpT3a91IUFAx0KP7qBiYfeqw8hn2yqemAERu6ucm0fq+Bdwnn7GVt5jv5oSl1Ltlo26Ix6+uxt71hzFk0TGBOVUXBKKeZ+/8CJSP/VCPPKorXzjZG+Daivi51if/bwZHP9THriwU4arH5Lh3DsnR886Ge5+T0b//D3xddQ31TNNTEOCv5I7CK9WNY7RPeEXOkALBcjRUbpYdQCL74XI5SabioN7xy0/VrU3DsnahB+yB+UMHqcCMxRZeZ4/RliBWXqe/w+wzA8cmmPtMwAAAABJRU5ErkJggg==", dJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAeaSURBVHgBrVdrbBzVFf5mdvZhb7y79q7fa+/aJAGc0CQOCg6oTYwrReVRJS2WcEVFVRS1BRFaUFUVISW/8qeNUESL+qAQ0h+USiVJq7aoBUIMSTBg4thJLIfY3sVer72O9+l9zoszszPrWRsTB3Gks3Pn7tzzfeece8+9l8EaRZZlFz32ku4i3UrqJ3Vpf8dJA6RDpGdITzIME8fXIQTsJ32eNCbfnLyijMVXFcVjDXiFSGJOFjKfyrnYaTmfeE/mU4PUl1+NyEEtel8ozCrgfnqcRjHMxT4xidzcX8Anz0JMD5QZkLU2a70N5ur7YKvtBWvxGk0GSLspLYEbEiBwJb8ndHAFOBv+A/jrrxKCBSZLAxhzLRi2Egxj1sYI9F0MspCAVJiFxF+H2dOHisYDRiIK+D4iMbQqgeWeC+nLSE/sByOnYarsAMs5SgMYZjlx7amSzkDIfkoNBjbfb2Fx3LNqJJYTmNTBC7G3kAk+Ac5SD5OtXQUsKqMRkMv8oLEQJRZ5qQU2NqgSEnMTEHIBVPqOwOLuNZLYpq8SzgD+vNHzTOBxcFYPaTOZzxfBdcaMkTn9W2CQxWZEk5QS2zZkF2fRVnsJZmueDOeQDT5DqWgBV9UFDeMg6S9KEdBCr3hP+ZtDemwf0Q/DbN8GlkWZ98yyuKV5HwrsJlRUtZD3jbgyFoHJJKDVfwfi8QhyqWtwi0dhq6xG3ZZTpQiStCmpYLWXg3pvbvZFCsE0GbGBVTxXtUDtgtYuvuttnl+EzK7DTERGVnDDU+eFw9WCWCyGfF6GwLRCajyO0fjTmLnwAQzyc+WH1dboj1TvC9MQon9TvWZZ8pYpqCRYhkKpAMoaAQqr0hYkG+zWNEQ4YarYiGAwCLPZDJvNhkKhAI+7Br7pc8hOXMbiTBCOQw9CjM7oBB5VsJUI7NV7+MQ7BJgtEkCG2GWL3spL4JALpHlVzYio7/MxM5LJJJxOJ+amzlHaR9BuTiF5dRhBrgl8aBLrk0Fc3/sMQldHdTi1tCuTcJfeI8ZOkLfQlKaxHCPQKgKXyyuOQWSuBclFAc5qDhMTE9RRhbbwAOT3z6Ijs4D5x1/E5GwAYmUNLPkY3K/8Euj6RB++SyGwtTgRJUjZQXAmw6STFykvIrGxlcAFqRIcmykR4PgR7Gi+hknhCFwuF3w+H6KpDQhOMdi9MIzFfx/D+s134vrmHvCLcczPTKIiEQHrrFOGb+W0ZQEpN6Z6zqjeM0vLjtIASaCWmTgwiAs9mC/sgcMaxHyUwSbPy5CzFohCGDU1HnUe5PN5tD34Q1xJp5FIJOCycbAKZMNmR3V1DeTQOFAk4Oegb6liouT5igIt80jJd2Jk+h7UtuyhsAsIJVzw+rwYuOZF7eQA6hpC6M9G0dTUhKaGejh/9wRyvc9h09njcH7yJjItHTCRYcvEBcgd24GOneo8WCpEkFYWGwORRIpFe0cvxsbGkEqlIEkSKioq4K71IVXpgWS343aavdFoFIkrF9A+OQjHycNU9y7DJPHgAhchKdVRsbvOsZRCFA8TLpar17oYw29RClINKht/io+Hh+H3cuiM/xWW9+OIfViN5I4HkF3XAKvVqi69hYUFrD/3D3Wc+epHmnMGp5QXu1M3HVcIBJTJwFhbsQKZhBdYpMQ2hOYd5DFtLv1/hzgtojA7hYbkx2gY+T820nfj/h2Y6P4JmvJR3Db6VnHCWu3I3vUA1vW/Xmaabb9DN69Wwovqn7S1svYuLF9rZk6ifb4dU9Mh1cPFtBXiQ09D/O7PkKm/Rf1GZExwd34TfouEsGTG6Peew1zX9xF68k/g730EuaaNS5GoawWzFIEhhcC7+htr31nClzXN5BqRtv5YLTKRSASxrn2IWKshdPch2/es+q1JFuF64wi2/HE/ej58FZnxS+C/9RCad34blg3fwPT9B0pG2e27jf6dUVJwklTZCV2c+zEsRM7Qd144KzPImnZjaKYRqeA4umYHIXK1aA7MwT4UppncBfulfiwXO83y7biAfLsPPEUlHA7Dcuu2Ulw5ip5BTnLKvkw1mY47eAomB6yeR5GMj+PNi7eqXrd4m1F//NeYnaWTzn0HMBO4hLvfeQn430v4MrGeOIpkIoa6zXfDfOV8McI9fWoKNDmmYK/YjhWZGhqAaXoMXCEH8+nXUP3ZsNqfqGvH6GMvoCMXhuPcG8DAf76UhJ5GpZLLBGw6fMpIQN2O1TqgNIjEUTUKJF6rBPFlOkQIUlktCPU+i87OToye70dDXkI91iBykQS7/7AR/Kh+LGMNnx5CcUmCuX0n2CdfgMQyRfbQjFAdF0URXD4N98jbN8JVx0rKuKd+D/au7+h/BTQslBHQzmjdOgm2+2EK2T+B+tbSgXPDxX9RomirHTwFTuRXB9bAUeVSbbA9DxvBu423phseyxH5DNLrv4H89mvqtmwcwCwDLj2VvN3bB/YHvwI8N3EsN5DwY9nFRCXy3z8D52nizQTKR+voXvp8x/1g9jwCpnGj0WQAa72YGEgou+QhaBOzTLJJqr0j6lNOU7vRT3oLGIfni0wpk/vQV76sapfTY/LNSWytl1MGaxR56Xq+m3QLvqbr+ec3p+Xp/7Q+yAAAAABJRU5ErkJggg==", AJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYGSURBVHgBrVdrbBRVFP7uzM4ybXfbopYWaOnSGECxodSiQFRQIYZEAhiBmCg++WNigPBLYgB/qphSNcRHokVJ/EFUYiAa8EHRyEtCGyGmoYVtF2hKgbbsa3Z3Zq7nzmM7S7cPpHdzds7ce8893zn3nHPvMIyzcc5L6bGaaAlRHVGIqNQZHiAKE7UStRAdYIwNYCIaKQ4RNRL18ztrXwnZsdZnoygW1u0g2jxsTNNgdndDj0TAFB+kwkLIdfPBfL58S+0kb7yLOwHgIP8dtpvtvsFBaJ9/isyxYzBOHs9ZgDu89FAtlDXPQV21BtKMGd4lw0RPEpDwmABIudjfH1zlQnFi94fIfL0XbJIKedpUSGVTgMIiML9iy2Qy4P39NHcA5tUemDeuQ9nwCgo2bYFUWTkqCDaa5frfpxHf+DpYMgl57lxIJSVZgduRc8+TJxLQ29vJJRLUz76Av2HBiCBuB3DJVZ7+/jsk3noTvqoqyDX3g9FMxjk9bRHBW53cXoW7T9g8J97o7IDe1YXCj/fA//xaL4j5bpYwj/JGOAGXEZY/uwK+yir4qqtpkvjZyrMe4LnwuRMNlnLrZ/fpBMK41ouiHw/C1/CIO303rbUlC8BxvbAeJkV2fPVKgISUeXWQrEnM9gBGSZssEMcDNhyYhoFM61nwigoEj/4JRtvotJliKyTnZYfbq31Ejoh0Q1YUSKkUmKB0aoh33llKA6N0tN41l7dJsubbY5KegRwIgF25Am3X+16sm52ttPK937Kecju2aAFkimo5GIRMWyBx27nMybesB5jHZE8nt11qxYDgTWKM7i4YiThMqheBtvOuF0QMzBSVY7Urnr6wD9KKGCQSlmQdrCxAa8q5DmaeiPMWAW/z9AtWuhEFT1Oq8hRSp5ugLtsuhqzSLgAsceX06m/BtiZsnWJzZKp0coltvWOq+DdMCQdPqXjsQQ0Gvf/a5scLjyc92rPBBW7GwPRBMJP6aLLuP0QD212VSwSAOmuuqZELzlnKLQ9YBkbFAI0WZI3TDRk9vQoO/1SBky3FiMYIsJrG4tAVVFdGkbMvnMbMhMWK9TgZZaRO2aCkgJhYJ+wMCc5InrEslZxQz0Y9j9NGDpJ0EhQauBmdjME2hnqpGH+kZVxUgaVP1EO7qKCzuwzJlGrNhTlAsgl7He+aRGbqgmtPSIJ7pPJodgIblmukmYAo8k2cahxA/Hwc7Q8Dr5pd2KD24ET6ImKtfbi8txeTfD2W5eSr3LBwDRIAMh1ud+nQ8SXc4s31vEBMTLluINig4UhyNn42/sXkwDSkIlV4bWoaWnsBedAYptjODGSzxXG/1QQAkQ6lzF+TK4gRWpSclmSo1iO4Pmchin1J6DwDpYAjkMh7HOcUMIuXgu7QgNiCsOAk/yyMp7E5GvqOFmH9pVYEYkDRDRMvRk7j6qEgfJQVo8o6f5Ja73aFRSFqJuZl8aZ1NVAVOyMOMYtYHjckEhJ6O/2IRFQUJKlg+Tmk0kkonx6FP8hxb5kxTMbkdjKZguRZUGva3aFm4bOjLoBOeRX+6usgF1Htl4YQD2sVDkFxOsQGO/vaN3y6UC5ql0lIHq1ch3lDQy1uKRYHUWm/1ocNvy1GmioWk7x+u8vmeIATgG+ePo7ywuwlZbLknMt7rTe1DMur1tkyHBPT+NBaz8xY71XeLHQPO45jmVt4o+Up9KevZQvIRAAoV6fjg4X7vQCGjmPnitQk+IBSjG3zP6Eqxmzkd+MJ13qiTbXveZU3udcy741IxMJZOKX5yOX92NW21TqURgzGcSgXl5mttbtoa8e4kjkgQvBcSs/0HUPTubfRm4wMpeR4rkSwlZf678M79XtQe89Cr/KRL6UOiJxreW/yMvZdaMRh8khOXWAjK/cxBcumr8XGB7ahyFfsVb6GlLdijGXyfpgIIAfCX+LEtV9wNR7Oey2vDszGovLlWFn9Eu5Tp3qHwxjvh4kHhIiJnUSbbh9L6HF03PoHSXrG9FuYVhhCZVENgkpJvqVEcO/83x+rzsdpM7+z1n/XH6d5gLif50uJRDUNYQI+z/8DXTD74RCyVP4AAAAASUVORK5CYII=", uJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaTSURBVHgBrVdpbFRVFP7em6XTdihDC6VlKW2hQpEdDAEbsEYRLcVCtFZEBRIKEVDBxAT9YY0hLNEUDLKryKrEBJeiQcKmLRFjoUUidqGdbnSlnZl2Op3tPc99S3lD22khnOb0Lu/e+333nHvOncthgCKKooWKDNL5pNNI40ktymcbqZW0iPQy6Q8cx9nwKISA40lzSdvEB5Ov2Vw8rLAdK8A9RPC7RJ+zVOxqvSS62/JFr+M69Xn7IvJRMByuD/B4Ki5CNrPc53Ogq+FLeNouQ3BeD5gsKiUfOhmGoRkwDV0IPmSUdkkraSq5xdovAQJn/j2tgjPgzprP4G0+BU4fCp0xFrxxKKGFgeOM0gqi4KVxNlI7BHcDBF8rDNGvI3TEW0QkJigJLtjOfe1/wVm2ngZ5oQtLBq+PIFA2iwMnipAbsg1EUV2D1O+Cz1VGFQ5hSfuhN0/qk8T9BCpV8OM/V2C0awVmTOChC02QsGTllEliwD5EpUuU15GI+F2V8HU1IGzc5zBGLtCSmK5GCacBz6XiXVYvt9oxa+kZTIgPwaGN+UiKaSJg8R4419N3otQjA8vK6hxZ4jZ8HhvME09DH56sDt9Ja23sJqCYnu0egiCgvtGOgmstyL9mQ219Kz7JysP4kfXgpD8R3Sw08OhBQFZB8MPbUQzoY2Ge9Cudowh1UgJzBa80ukPlTmM7Bg8yoOiWHTdKbGh16PD+kTSU1UURhJvUo2iXom5ZRaqL8jde+k59nBs854POEA54a+Gu3681mmRtXslwK1ij+k4H9p4oRfraAkRaTHB7RDz75AgioceGQxkoqYsMBJPU3Q0sf5MJ8RwRUevwg+fpKDcfkaJKkTcZti4nJycLcorFlj03sPfkbTQ0e9DQ4sbClFisejkB4aEG6PRG7MsbjdlJFYiOaKPR/l6VY6WolGrbz8YLFK4e8pQR+og5DM5EWsJcMF+l9FtBPTOKdNxLrU6YyRUjh4fhmbnDUXizTbLEqt2Z+KdqOK3n7lNlq8gKfyut6COL0Mq0tNBxVeuG+YwASzywt3tQWetUQluOuTa7F7uPlaO9w4e6RheGRRrB6cxYnpuFYkaCAQRTwU4k2qXokQiQCu1XyRI+lcA0jl0yVLHk/92EtOyLNJjvtkKUJQR3bV7EDDNhUJieLBGNQWYjjv5ohYFz4eiGA5gaX42ewkLAI7lCjQa/IFJEUEkeMT1+AbwpkQ20MTTpSrV1eCFHuRpenATOpJHOw4ql8dj63hR8sGYCNixPgq3TgCXbV6K4MuY+F3SRuiRwrUg5RElmgqdB7baoYQi7w6PBDkwzLKns+7ZCckN5dQe2H/wPjnYyI29G+tbVuFYRpzmIwn3ACEwZUhK7N4YRkFLi2Dgzgslgsx5zsy5gyborGDU8lNoGbCZrODpNyNiRjeuVCX3ODbQriV79HSO7wMpqSWMighK4Weagg+pFTX0nksdGIO9ACjKfH43jn87GyNhoLN62JiiJbnAS3jRB7ZIyYTGrRQ0JwdjRwa2gyvdnayUyBgOPE3nVuHXbgXZXCF7cnk3u6ElC1JRc2GRwvF79VMQIXFJbaamjMBBhfi0obMGczPOUJ0KlvrVZib26Q3tLMuEt6dqlLnNKKmYXkaWipoNuwbMULlwvp6d3mTguAs+lxCD7lUQc/6mKXGXH+YJKnNn8BabE19y7lKSLCTAk/0HJsHujQ3jlXv6GtRLJBcsWxSm8VQ0u/5Y7KF8YEUu5YtpEC84VNEnuSNu6rtsSshVE8FGvasEPM2w1DHeqvVs2TUPkYAMeRNhFs2lbEZydfjhdPkyfOAQCFy6diUJGgjEgYF30eu20j9k/7Q8SRuIdVs8vbMai7N81bujfFUwSRoXDoOfx9htJuFlqw4U/m9BytwWnNh3EjKd3gA+fqQ7dRbuXr2PN/BwoIZkycxj25MzSeKB/VzCx1jmxdMFILF8chw/XJmPeE0Nh7whBue4rLbhVwUIAAeUspCoDsCx9DE7mzkFcbOiASbDD9t0vNaikw1xV78QV+lV15tA8ZL0wRgueqn019fuzvPpOJ7YduEXxXoUeObUnBckNzk4v1r+WhJUvJWJQuF4LvoTAi9DPKr0+TBiR3cfKcO5Kg3RtBy4hW2fKeIsUkqszExEdZdIuacVAHyYaEiw/5EA5mFpx0M15o8ROO/VJGTGR7pHH4s2IMPcaPbvYOg/9WFUep4fFB5O2gT5OBxZfCHieP0U6FY/oef4/fViiDND4iwwAAAAASUVORK5CYII=", bJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAT8SURBVHgBvVdNTF1FFP7mvl8e7wVsEYya5hVIq9FaukBFEmmj1kUTg1uNqQuXLoy6aNw0umxMoFs3xY0xxKQkxhg1aokagUQLlUbbiDxjQUEUKH/v3b/xnLkzl8vPe/CQ9MB599yZO/Odv5k5I7BLklLW06ObuIu4jThPXK+7F4gLxKPEg8QDQogF7AcRcJ64h3heVkeXeCz2SmyxBt5CRceTv887cviPNfnDVFFenylJx/XLKXK+Eo4oA56nx9cI3Kxo2fZx+foKrk4X8dOsu2WgJG6uj+FkcxqnWjK4JxuPdheIT1FYCjsqQOAc38sGnIE/GFvCJzfWkIpbaKiN40CNhTTNH7csNcaVPpaKEku2xNyKi/k1D2eO1OCF4zk0ZmMVlRCVLL8xZ+Odr+ZR8gSaDySRS1nKUiE2DlVt/Kv+JUquBIVI9Zx7sg4PN6XKKrFZgUkDfuW3NVz4ZhFNuQTur4trVEEPEchykxnSqCJ5Hp4MtxZd/Lnk4M3OOjzdWhNV4oRZJVYEvMeA/zJbwoVvb6Mhm1AKONKC41vqaStZkBxheneVTP36O+amXBwHaxN497tFjM/aBooxzm/wgHY9W4/ZFQ9vfDqPfymmRxuSECrOgdVCeyFwuVj3n3a90C/GA/zneT5uUijvSkm8192AbDK0+TCHwryFGn14bQUzqz4S8Zi2SGiLAkuVtcSUm7A9wCFm2VFtAbsRz/g0NpOMYa4I9P24FIkbXlMh0Dvcy/zy17KHz34tkqWW4mASrYR+KmAGlAFHZYfkQDkdCmbyiyd5vhjNXVKrStNZxmYPdJuWQUo8VwbgJZqo5Ao1qaOsldpShNbb3la5pL6R6+O0R3hOVuqj8VUDp7Z23i26TMs/yyU8eq+AZVkq3jVJSWtfB1psu2eVIWESA7YLHMpS3nA42Cjbjn7YxQq0qdShpHmwdA0PJQJwVsLiUNCgWCxWGU4rx3OwrJKQyKcNyhfEcV+1+b4Pb9VDsfgE0uk0f9Im+JBhdwwNDaGjo2NbgEQigWQyGQIZMoCbiYFsstR13W3nGxkZQXt7O4sL7AF1pC4slD89HcdRbEJjrIzKRiFjaSWamJgwCtSHJ4a9MTbb0k4T75ay2Wwo8ypQpufzedwpyuVyRlQhKBC3tba2or+/f4ObRVWZX55MaEx4Ojs7TVeBFRhjBTKZDIotpzG1TKBqBYgql14lDYIVQei4OyMRj4eRH2XpCvFZ9RpPYvCWowKjt32UqVmqQ1fWg7VA99FEtHOQc2AAOg+eO5KijSc4Uved1OFEW98D6WjrgKXP5ff5rS5t4dmWhFF6f/QwcxGdbk6iqTY8DfsY27z1mtaXjtXgYE1YYeD/aSFDbqoVePFYKtr5Nv8oBXSJdJHlbFLgXGcaQppzHXskGfGkxKvtqaj1F01ZFmaYPpavQldFX0w66BkuQfJyDIuP3Sbken3I4K8/lsIzh8PkKyBSklUsSsdmXPSM2FSgyCqUWAevSwJvkTcfaSxfGe9Yls+sUFk+7uDzSXdjNSy2x+YfPsGfysfwyokUahMiCv48gY9Gh+z6YsKKfHzTwffTHqaXdP0n1otCjvWhOguP32fhTGsCjRkrOmUBZS4mZUlfzXq3u2utUclD4ZHDU478ctKRP//tytvFslezXp1feyMZXE77ZHXEF9lLcheX013vs3L9en6S+Dj26Xr+H+H9dPIV0p95AAAAAElFTkSuQmCC", hJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAfPSURBVHgBrVd7cFRXGf/dfWR3s5vNbkLe7/Ioj6YNUmpapRGQkVpHaJUBmTIWVBzpqNSCf2SUtkypg3ag1NaKg5YanLbyaHFqERChkSFpSyFJB8IjyEKeu5vsbvaVfdzd63fO3rt7F2Iott/Mt3vPPfec7/c9z3cEfEqSJMlGf0uJm4gbiGuJbfK0j9hB3EH8PvE7giD48HkQCa4l3k7slW6PXmNrb7W/MIFgpt3TxOtvnIsmIhgM9cIV7IdOq4NRm4tpBXdDp9GNt9UzZI1ncTsAZOTHkTIzp2Dcj/2Xd+H04Al0e8+Mu9kUWz0WVC7Fg9UPozS3Uj3lIJ5PQBy3BEDCmX/fVoQzwX8+tw2HHG/AoDOhyFQGu3ESjDoz9Bo9XyMm4/DHfAgSu8eGMBr14Bt1q7ByxhP0ffmEIISJNO8a/gDPt/8YMSmCybaZsORYUwsE9iuhxiwiImrhjAo0otcS+H9EHMM1/yUaa7Dpi6/izsKG/wniRgBXFeFHHHvxwpmnUG6pRaWlDtCkhNJi8rmEBUVh3Gsf4+8+9Jhx3J2LSBIpBFIKSW/gP3CF+9E89xXMq3xIDWK2kiWCSvh2yAHX4TqFjf9ejlJLFcosNSmF2Y70P8MaxzfLAsjXJzMq0JQ3rsURVx46vXoOgOFAUkBv8Ar8EQ+2P3iAB6pMLxKAJ9MAZNMz7TEU7sOG1mXwRF18AdOYfWXNkbCsIoCZ1giyPSipjYjTXiMOO820XsuBiMkELnm6UGQsw+8XHoZFb1U+rWOuUPLmaeXtnu4dcI71waQ3Iy5FuV+biiP4emkQJp2EuKjHwdYH0HGxDv3uYuToY8g1RLD4/tNY1PgxuSWCqZYA/j5oRvuIkXsjl/Zie7554WV8v75ZEcWsvV6Q892raL/qHw+QvyWYcyy4p7AUK6t9mJoXJ10FdFyajM27HsPgiJ2PwV2digtGZZM8+MX33sDsaRe54PN+E/5y3YJzngGMxcMwa63Ys7hNsQKLgToNUuWV08Eru7lwPdnl2xVD+OWM66RNkERF8a/T07Fm8xO4NpiPaDSJSDSBSCyBaEx+Jr7an4+1W36IC45iAhUld/nw3Kx+PFrpgZ48Ekr4caBnlyKOl3YGoEl5c2rwMOrzY/hdgxsrSHON5CbhEQRCWvzqtaWysCT/T3HihucEwmNJrNu6FolEjNayLHHhseph7PzCEOoobTvcp9Qh08RccJYeGsbEEN7+pJzQ+qEhtFqCJjAWzHD4H8GFwDr0JbtRbqzCNbcXlZiFYZeAfa3d6OnMRaHdANdIRM4oYMu6FqxY9Dd6DvNxkpJGTND3vXlY0eCkImbkCccAMP/bErETiHrnQ8uEE2s0qXrD+LnXX0XrmZlwe6KIJ5IoshlgLAhhVm0R6ueImDJdxMmTMez96xgG+wUkSeJX57ajZfPzqZJATMtACUGWAYyF3dDopvM40Mm+oI+CaYE30r4jWgy6fYiJSQImYMgV4cn3Ufsg8BYwrTYPtXcF8YONYUQcU/HH173o6a/I2oNtq+yfFC8rAGyZ4yvpS3/AQajAxOIUhvFU4UkkJJQUGuAciaaXnu/xEwNtx2xoXNKFZ7fW4Oh+WbCQsgCEDAuCKb1WJ6eDTaObklWY1YaoLfcgIVXwABwNxNPCq8pM8PrjCIZEPvYGYji0pxDXO6L4dXOmQHGlJNW+Gosy5WNZ4OAu0EzDUZcF49HCez9OC7+jypx+P6oSrtCUagu8Lh0cHQdu2ocJf3fICkk7R3nlYAA62ZNWW4CDzrnYcrEYrmh2Y7FmyXuEMNVh+UhoeQmPYOTkaGC36mE0avm4mFwTCIsozB/AtxZk0o0p74zmoPlcEf450kiNi16Z6mAATiij+0sWoW0kBz/pLMZ+KiqSbDZ7XhDbnkwVEM9oDAPOVLoNe2PcBRT2BMpE9UJEkAA0P74TRkMmJd/steJHZ0vQNWrAvPKH1bq9r5RidhDZnFSKHz8+D0kkeA2oyRWxedYwSgxx/vW+Y03YtHMVBtyFGI/qKqL47YYt+HLDJ3x8PmDESz12OEI6SBTDEgFtWdiGkky3ZFdOwxfp76fseVvnRhzueyuTBcQrq4J0Eo7CpE3C5SnAgeNfwrsn78P1oVJeXCZXOrFgzlmsffQ9mE1hhEQNWnrz8c6AJXVe8B4BeKjqO1h/91ZF+G46Q1bfdByzFmw1WcEvetMAGJUYRGyYOkqlOoyJ6EOPCS9dKcBwTJMOAAagxFiBFxr3ojijPT+O1Q1J2gpdI23Y2L48ywoKLS4NYU21H1Z9dvSPxHTYedWO1mFj5qUsnJ2cTPhdBfcpMztIOG9+1ABYLLBzoZaNj/ZRS9b5FOWs/JEKBLPGd2v81JaF+PiQMw9/clgREDU3CddQMP2s/jdYVLlMmXFgvJZMBlELVVP6gfMYXjm/iZqJ3kyJVq2YXxSBj+LzrC9b69ReQKGhFM2zX1Zr7sBETakMIqstZ51My+Xt3CJZ58R4NwpZuF4w4GtVy7H6zp/DrLOqhT9Cwjtwi23GvZgwIPuv/gEfuU9gIOS4aSGTXWedicbihVhSsxp2wyT1tAOf9mKiAsFi4hnIgammsBhAj/8cWA8RFP2oyK1DleUOtbZq2oHU9ez/u6zKl9Pd0u2R9zNfTscBolzPv0J8Dz6n6/l/ASb96aej8w4+AAAAAElFTkSuQmCC", MJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbzSURBVHgBrVdrbBRVFP7uzOxu6bay3T4E5bEFNGJQSyKKBqlilAQxanxFY7SIJppgoiYmGjSIoiSCAYPPQGwD/lN5lYQ3TXlrggVCARGyNRSklXa3j33O3LmeOzuzO1tZWAin/Xbu3Jk757vfPefMHYYiTQgRoMOThHpCHSFECNiXo4QOwmFCK2E9YyyK62HkOERYRoiIq7NGORbXanLGtuP/mckTwkifEMnYZpGK7xB64gD1JQsRWWCrd0ljBZyH6NCCjMyZPjOK5MBX0JO7wNO78x4g7Lai3QHPsOdQUvYStUPuR3YQHqJl6bgiAXIu13ed41w6TvR/AT32Hd3thaqNgqLeSO0yMOaxx+h0Xy8dIzD1Tpi8Gx7/axh2w4dEZKybxFNE4nBBAkNnbqQPIdbzDJgYhOq7C4oSIKeXYi7oL6OFEIzIxGDox+lUQUlFE7wl9QWVGEog7DhPJzYg3vsiNO1mqJ5bLceMkRurIf/JWVKBQbHuGSEyyyDkM3Lg+ikichqlFY3w+l9xk5jsZInicr7McZ5KpdDbcxxMe4Sc19LMkzZSmSOTSNGNScR3iex57r4MNM8YwigkInNgpLJxI30syFPAlj5syW4Y6O7uln3w+XxQ6UGqchoeZT80dhyqK44uLPRDcGDkJzGXiswa66hgmgb01CESpwblN7aDKdmEqJVL4SiQZTQwMECDTKiqSrNQaEAZBJsMHfOQEN8iLlYhhXcwuDsAXygGzU8q7OW0NEkbiYwaVluqYtCzKGBxHsm+D+Cyty0F7ByNOLPv6uqy1lnTNHg8ngwJOpcQsRjiW3dCP3YCiZ2tWQnl+pdM8qD8oX7463V4anhOAVKE62FwHqPs8KG05ixlUrUcKmOgVirwpEMpHo9bjrJOJalTp50YAfP74ZkwnojQfVKhYAVYMAAlMBzCOxHmhCXg1YtIrZlEqhJ6pw4MShXSBCJLMaTHlzvurNIuFWikRoPsaW9vR2VlpUVAQiUSPa+8geCij6CNCyHdfgIKqaLdOgH8QjdS+w5SJiRR+sQsKgtl1NcF3nke3rsng5+/gH9ffwM3/fwYNO96krrNUkGwO+GvPuKQaJIKyMIDXdcxadIkzJw5E/Pnz0dLC5UDSSQYRPTzL5E+fhLxjZutGUtTR9SAlZZSzpuWc6uvugqDa5thnD1Pzt+CetNo6L5XEccGDApaNvyCtHGPFZi21Wl2WuDIkQyro0ePWli1apWlwqPTpuHdtj8x9rZb4O2N0IzT2SjSO8+RrNlMBr/YC7OrG8nWPTBIjarVP2TqhlxCVgqOB5DG/fAbJrxeqzuk2WuBSCSCoSazYcvu3XjWMxzrFi9G7cgyTEn8g7OPPI76+noqIrIYpaz4kJZqbYZ3nAqT6ohaUwOVYsS5ZgWsHcyc82wcaE5LZkAhG7QL7dq+XjzdsQ0r52zCyzyB76tGY8SoUai6tw7jui4ivX4Ryj9cidiOv6AML886tQLYdu7AMUlApkOgtra2IIFOqjZdwkT7gIkdPTqWzFXwcONwsL4B6P0nceaFpxB6zMT+ngCMPy5gon8YqihQBSnBqJg5JBxTcssWlVnQRo26JEXz10uHYdNWYM9+RvKLPBJ+puC1Kh+eL/NhsJSjIsgQNChI/SaSQY62IwwjTAVbwiZ+5HHUTLwN06dPx+zZszFlyhSrrsgllfJXV1c7JA5LAk3UsN4Uqeg0KOY+9A8A+w4q2LydYf9vHEePAdMVLz7VyjFyAlXJShNnDiuIlnPEksAYQ8OY8Sa9laieU/83lG4beCpHnurH1KlTMWvWLMyYMQN1dXXOpSZJoIEajVYcxBdSUH2cKRosB1mLKOWxrhkItpbhDGXCg2NVTB7HEO9UcCrB0RIxMD6hYY2RgInCNm/ePKxYscI5neOUYvkiCkBEkY6MpTren0diqG3fBWxr0bDvAMeB3wWuxsLhMEKhkHNaYf0SieXOBk4ffFfotLnhUaoxfXSp//LoOqOKX3+CeOl5iNoQk2wKoqGhIW/TmmUlMjtfe8cZEenIaGFEiifhRtteiKWfKWLafRAlJUrWOc1a0OzdBEJ50rhVMPW9pIJ6TQTc6PlbFTs2Qrw5F6K5udntPPtGYi4CMhZkSlrMzPRqmPEGigeR2wcyFG251zHlfWkjFG+Dc6kDri3ZUBXkUmR1MtOtgveFskoUo4ZznxzDo1WkZot75mFxpY8VuS13kxA8LHjsVWFElTwiFhkX8h1rNGYujT031HkdipMvX4kskfh7pMgtthNCnw3nvP92uud9+krKH1rUzC9BIuAOzDwzByhfW4RINwsztYZklp9mPaKALReX+TQrVo0mcXUmP2Qbi5l10XEtcp/nDxLuwnX6PP8PpRCQQ/jdBdcAAAAASUVORK5CYII=", fJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARWSURBVHgBvVfNbxtFFH+z/sDGjmvnlooSt6QhUAFBwIELASFx7h2VDwluIBDiilKJP6DqlR7aIjhwgiMVB1rBCTiEAyhCKLEQCSERsR286/V+Pd4bz3jH67Wx07RP+mlmP978fvPem9lZAVMaIlapuUhYI6wS6oSqetwiNAgbhDuEr4QQLTgJI+I64QqhibPZdfaF4xrPWBGPWBiG6HkedjodtG0bu92uvDfG1ifxiDHkdWq+hX6YpUVRBEdHR+A4Dvi+nzpYNpuFUqkE5XJZ9g1rEF6itDT+VwCRc36/1ORM3Gq1gGYLlmVBLpeTLYMG1D5AEZAti2MfFlGpVEwhjTQRYtLMe70eHBwcSKJ8Pg+ZTKbvJFIDJwVo0ZQi2a/ValAsFseKSArY1uQ842azKWfMYFKNScYiNDgaLGR+fl5GxBDxtF4lluF4RZNTUY2Q65DrfhKmQA3tf3h4CK7rairmWB+KgAo9zx6CIID9/X05g0KhMEIOY1Kgw2+2nAoGp5JtYWFBjqXsLKdCXw0UcaWzE+c7ST4pBWnv6Ojo2mm326bL+9JP7XBNPfu9vT3pxNWrK36a3I+LBk+Ga4FXCfeNKHANnOU1clE7/vDXbdj+ZxMEK88IKOXnSL1eRtgXInswaAcRMK9R9VUxdnptiEIWg3AOV+D5h17mp3Jr59HXtN+1zY9hx9mSpSksAcVcGcq5OcWQRptKH98jcse3wfb/BSRyjAAebz+rBbCtsQDeeMANHPjT3iJizmff3w071EaQtx6YyKNXs6CHqIi58QKXxujKvh7z1+ZP4IUu5DMFdlllAXXu/d7+pT+ORJxvN3QgQB+ygpajIsKEClMX9yMSEKAHIYbGS0JFEWDX/gPqlWXu1rMqF9Dx20PcZs0FkQ8B+FKAJSwlIp63GRYmp2wPqZNvYDzurt3QAqqDjbob2PG+mGyV8dBDs5rRmJx15Kz84B5PR26JC6WH01lPyoxJlXRhEzcLaHDvTHkJ7pctnbqgu3In/Jl7rOpc5TG417Y4t6xXANsG18Btwut8dan9Amx98WP/CyWGC/FuDNXGxO3Sq6+Yj+7orZg/RNVodxeclWXI+F68IuHuDBUihQc3fwNrsa4f1yz1Xb7JV9bp05C79FrqXncSln3jTZP8BnOPfI6x3QL3yScA9v8eHBaOGwU0sbgIhVvfmALiz7E6Il2V/VNVyH/2+cDxuGb6Ih/pPrlmkl8dOaCqY/i2Pkv7n95Ep5DDLsFV6M0AV/naxbwcy7BtVXcpqvs/IbGIW19j99HzM4lwDfJu/QyG33+XJK/DxNDRsdwUETUa2Hv7rf6ABoE7ibg6h71338Go2UySr8JU+UtEQgvxPvwA3QsrAzFJuM89g976Rxju7GDCxs5cTBDBebpMeG/kGZ0bcWMD6N+MDnotEI8sgVg+D6JaSxuKi/vysX9WVTRu4GzGsb+OU/ycTr3EMf49f5HwFJzQ7/l/dXd6FwzNupsAAAAASUVORK5CYII=", gJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWsSURBVHgBrVdbbFRFGP7m9Gwvp7eFkm1pKWxjkQQCLpfEYqJQER/0BaOEKMEQniTR4O0BLwiIJj6AgIRE8AGMhvTFSCRGiDGKlwSDkbaCqEW6lRJcCmxpu/fdM/4zZ2b3tJylVPpv/p2Zf+bM9/3//HNmDsMdCufcT8Uq0mWkIdIgqV91D5KGSTtJT5IeZYwNYjKEgIOku0mjfGJySDw73vzsNsDCu62kL97Sl0wi1xdGtu8fMJ8PzLLgC4XAysq8ptpG0diOiYjyutftTi4a5SM73ubXVzzMI2U+Hikfo2QbWLyQD737Ds+Ge8dGo7dYNJgHuFjfz+GsMezBQcTf34XkwQNAaSnMpiYYgQBQVeV4Tz87kwaPRqVmL1+GPXAV5es3oHLzZpTMyuOGSdspGuGiBBTLbzV4prsbQ6ufAo+NwDd/Pkr8/qLMuavk8Tgy58/TIIaqAx+hbPnyoiTGEujV4MljxzC8fh3MxkaYrbNpLvKVc6d0BrvcYOJZORuNkHXRm+3pQfbi35JExbpn3SQW6l3CXOC7oRIu03kGgyvaYQbqYba0wBADPcAZc6aQcEyiOxEQP1EnW7bnL7kstSe+hu/BhzTcHprrpTwBFXrhPXJXruBmO231f6+gdNFiOUCooUYz7godQz72+SVQNlvZ7GwWmTO/gk+tw5Su32AUlrFFLIWhGlu1Nb5rJ0BbzBAJRttNqJGiMpWCkUzJUijIhkTSKdU4RnVDlOmULMVzBhEwKilhr0YQe/MNuERGm6n9HhUNu68PNxaHYMZiMGpqYM5oJs+5zHSm/Cwkjct9bWXKwtUyiB0iokoO5WjOHDnlv3ARJbS0cN6eLSICq/SUqeNfwRDgIuQjI2CUzY7HBS8hvE+mZLtQKk3oMaJM5aPC0mlnzkwGyX37NJx8tQv7Mm1JdxxxEk4Mtm2w69fyyyBJpBRgSoFMzYI12/ll0JoHFuXANQmscylz7Av3Miwz4Rws4ARonzqFEjVQBnV4GDxHABXl8BI21wKbVgL7bNJzWXgiTkkVzyex6Mn9+QdscsyomyYGhQSBoKjlzp0dlfG6zuIxop2Wb0G176DSAcYjlFy1DLmDKdd7QSQCkaawM0pAuKhptXsuaAJBU60F+MBAwfOxQiGUahgoWVMFY221M+l0udHg66iVbfsEJdr+IarY8IyY0hy9G8y2NmHym7rz3Lwy7Dg0HYzcZwZznC1yVs4hD58PGKhHTrbjlNR7btjoarMAoWOFOwHiNpfBee2BBixRXYKA2A7+OqsBw5YtwWHw2xI4TZG9lOGoN50B/dT+IU4IFvd+QBGAIuCzqnXPoFjusKg1VM7EnUotkVxSwdAxxPHpTY7ZPuTJ3IncUztPV8MiAl2kIZ9Rivl1bTgb/XncCVoIcMuAjdMJx+MfEwxzKEcj2XEfRYPVjCpfjW52igh8p1uhaUtR2EbFpTPF8+DSjTTH9/FxnlPdSwLtbutJQeAonDzAqpYNsMzq0Yf7JIqYbk3rRrfpqKHO5Y9Fq7rUj8dmrXUGTxY4L8z16IzVqLdm6J7DAlufhnu09enWFxAob8RkS31FE9bd+7LbtF38Oce8c0XaK+oiQV5ftB8mMx3mdxMJ7T3pxrnb3d7v1dcy941IvBHPQL2av+n/DDu7X4HN7MLlY6LgoqR9/+qCXVjZvFr3hOF1JVMkgnBdSn+/8Qve69qESOJS4RgYj4i+IVFZ7ZuCtxZ9iAV1S93gxS+lisSoa3kk0Y8jFz7A8Usdo84iTyIK3KAX7IqmJ/Hc3C2oNGvc4E8QeCfGmeaWSGgiX/Z9gp8iJ9Afu+h5LZ9Z1Yr7Ayvx+MxnMN2a5e4Ow+OboCgBRULkxDbSTWP7Etk4eoa6qYxhJDuERiuIpsogaijkHiKSe9v//lhVn2mH+cQketcfpx5E9Of5ctL7MEmf5/8B4sgcB+T6/wQAAAAASUVORK5CYII=", zJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAa9SURBVHgBrVcJbFRFGP7e3t3dLrtI6SVQWkQpIIUgGIIi4BE0CniEKiJgqRoSUzQmJBq1RuOZcCgYICIVNIhRqBCMkAgU48ENikBbodvSQltKd+l2315v9/nP7Huvb0vLJX/yZ/6Z+ee/5p/5ZwRcI8iy7KZmBuEkwiLCPEK3Mu0n9BIeJawirBQEwY+bAaQ4j3ApoU++PljH1l5NvnAFxcy7twkXdZ9LhMMI1zcQnoXBbIbBbodzTBHRpp5ElRMu7y0iQm9eU7MbyTBzkPyXcG7Favh3VSHw+76elsE+aiT6zXocGU9Mh23QQP2Ul3AyGeG9qgGknO3vFlU5U3z2oyVoXrseJqsV1twcWPpnwOB0wGCx8DWJWAxSuw+Sz49I0zlE2y4iq2Quchcvgm3ArXojZpIRR3s1oLvngX0HUf3sAsihEBwjCmHyuCHIMkgIY1ZWJ2lZlUEYF0MQT1ZDNhgwdMMauMaN7TUS3Q2oU5W3fvs9Tpe+TKEcAPttBUlGplNgi3QGMI1CkpAVkYxKEBWuPY2Qtx4FX6xE/+In9UaMVnPCoFO+VFUeIo+bf9kD2605yRCGI0mMKC0loUZHokqftQpN4wIhW2vNykTL7r0Ii6Kqiul4OyUCSujr+J5LElpbW9kYhGPHEVy/EYnWC9xrhbkrbIrnahTYGlnZHpkaQ9++cLw0H/Kw2zl7dnY2DAbN58FsK1QD1lEzj9Ht7e0QyVqTyQQLJZlMSSh+txmhrT9rii3D74Bl9J0w5+dBcNgRO1GN8G9/IvbvmeQ2kBFpD02Fo2QOkJaGaDSKeDwOOx1Xj8ejGsCO5iJBOe8+NtIsNuKbvz7DjNwFSLf2gZmdcbKYJV14z68QK7fDOacY1rGj0RNEDx5G4KuNcDz+GKz3TeQRSSQSiNEpCUdFbG2qwLwxr8JpdjF2P48CMTHPWQSw/sRSbKhZggxbDkqHvInR/SZy5TzruWNdOStKQdTu34y0mBGDJpBCsxO6fNJahsfbD2BV7VtoCTVi9tAyzCt8TWWdzzZkktqratrGs6Itdg4fVi/EuroP0CH5UgSrSH4h/v4aJMo/x6X4pZQ5FULxINZ7P8G7J0vQGm3ksg+17tUHbRK7O4t4+OJhNARrIRiU3CLc0bwRxzv2oaTgDYxwjU8Jt5k8ty6cg1hcgtVoQ3eoF2uwomYx6kkmk6XKPOU/grAkwmayM7YiZkAeo2r8fyfPBMeuUDeFzuBUx5HLDLDYnCicVoreoJrW1Iu1XQP8AklGp6mzDgXu4YzMY1vAS2qI9lTVj1QbMNQ5KiXE14I5tsGKoFRZjG4K1qldt1a+QlKnLgLQFjOQEjHehhMiGmv+QDzdikHZY2Az2LXxyNkGtEXOI3fIeG28O/Argto0U1fCsgjwKzHLMTBVqw4alFCG21sQKS6D+GgJArGu6ipGO1Dz7FMIPvEigsGLfOxSrK2b9q42zeRQR/0sAl7CogHOAvQEt1gyUei6i9MhckyadjdstP9SPKrxhOUQhKnjIQdiiIYCQDp4YmZYc3Eh0nSZzNvcI1XSy+6BCiLmst7Cqmk4HfiHx4WF68GsWSgeWAaHKV1bHJQCMApG2IypYY4lIuiUOuCxZGhjFyLn8EPjKuxu2cJrFxIycu0F+HLKHpWlgm2B1huXOQVslzKsOXh92Go8P/iNFOUMWL+7cgZmgzVFOQMm58X8d/DK7Us4zWBi9jQ9SxUzoBJKHjyZX4r7M2fhw5GbMLLP3SnCIgcOo2XmbMS8DegNolQTWp9ZgMi+Aynj4zxT8d6IrzEpYzoeGTRbP1WpFqNl1JQxOhAI8OKh1gCqTPB//CkCq9Zqq1ihsU9/BCYqtQyk8+ch/vgTQjt3aTzpL8xDn0ULIfT1aDWBFbf0dC2iFSR//mXlmDH7fMnrN7b/ENrLFkOix+eNgIneA55P3oXl3gncGZfLBaPRqE7zcsyLs/JEWq7Q3Er/x8vQPOMZxG5QOXfgbCNaiufD99b7cDgceuXL1WeZQcdfjuSR5GXYPbyQXxoqXi9o68ghz/ixPPwKeBVdSDFAeaNNVhjQl+p+/rZNMNPz+noM0fMaM/ujYGcll6VTPln/R9BHQN2KmQojXA9MwRAS4Hnu6ZRX75WQg8WMW0rn4o4DVXDeM0GvfGb3v8E1f0yilAttK9egY/sORE7XXbaQKbeNGAbXww+h30slMOdk6ae9uNaPic4IViXLoRxPPSQCnRCPHEOiM4g4vRktQ/JhHVoAk9vdkyiW3OU3/FlVPqcV8vWB739/TnswRP2e30c4Cjfpe/4fPuJqMVXLvJwAAAAASUVORK5CYII=", CJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbHSURBVHgBrVdpbFRVFP7ezHS6TKf7ItCVUqAUtCCLf0ohBSSpxDaK1EAMKBiNKOAPjMRCQRP8Y4CoQAwGNAgxkEgsMYooWyKNAQoNaaWk7bS0nbZ0ls7W2Z/n3vfe9HWhrCc58+7cd9/5vrPcTcAjiiiKSfSoJC0jLSHNI02SX9tJTaQ3SS+RnhEEwY5nIQScR7qP1CY+nhxl3z7MvjABMPNuF+nW0e9cngBa7w2iZ8CNKJ0G8bFRKJmZhhi9bjxTtRSN3XgcAjLzC5DCzMXu9OHrk42ou9yOhjsDoz4V+e/sqSlY8/I0VK+cjrzJCWqTJtKlRMT0UAIEzvL7iwLOgGu+rccPZ1tgjIvClEwDMlPiYIjTQ0/eMwkEw7AOemGjsd19Lty3e/FuVRG2b5iHnOeME5IQJvL88o0erN3xJ4IhEXMKU5FsjCZfBf4R81kQlO9GWIFnKIDmdht/f3LvciwoznwgidEE2hXwH8/+h417LqIgKxGFOUlkTJBBhQgooxIhInXwJ++jZ0unHZ1mB47uLscbK6apScxVZomgAt8HueDOXe1ExUe/IX9KAldAI9MVhnkrbkvoETI8NpGQhNHSYUO/dQiXjlRi/qwMBW4/EdgWISCHnnmPDrMTy977FeaBIbxYlCEDCPJIYUTsBWFU+OmP1CdG/gfDIdxo6sfk9DhcP7EaSZRGWfJZKpR5s0vptX61DzWNfyPKYEByfxb3jIVdEEfyYETcWh00Yhix4bCcAkEiJJMQJecwONQN720Xevf3I6nmYwWKRXurIM93Gw9YZydc80vAWGmMRuiysnkuheFID+eMGs0rVkKwWDHz+r+RTlH2XJSDFaZGqLMDIY8boXgjjA2NEBIT2ShWA/ksuZWKTdfBgzzbXD0eCEx9Pgh+H0IaLbW9ALVBfU6aGeaiYtjKy+EJBAEv9Xu9fIw/GIBA/9m3Gr8XmoBfsulywv/dYQWOL+2svyySw/Pn+EAWdg2FVbBauBEfudK3ZRvCPr8ERCAOnRapBQXwxMQihnnEyJEO0Zjfq9fCz+wQIVgs0ASDZFfgtoNXrkAlZayvhIff4YC20yQxlXMtuFzAoB1tU6bgCgEPpKbKQD4EcvPItgWWgQEMpGfwPqYdObnQF07H/ZQUCvIgBLIryDb5XKr/B0GPVyFQwvryeNpuN0qg8kKj5NpaNAuJn3yK7Oxs9CxYyEEGKcc9b65FTk4Ops+YgeZXq3hkvP4A/OXLUFxcjO73N8NCkVHbUmyHqSZkydPJuYBodwwXm0o6ySNDcgrCfX24UzIPfaVlxMFHXnhgvnULubm5CCUn449vDvF+fUwM2hsakJ6eDlfpYqSe+lkGl2yz2RTs6IB+5gxeB5HtK+R0RtiqNaPlDrrtdhhpVmRRFKxWK6JiY5GVmYmEhAQ46bu0tDSEqWba2tqQS+kKUs6Z6M6fjyzbatHp9ZE2S4G0JObnY7zNUUvgzLCdngyMecbWBY1Gw4FY20PRYOL3+/m8DwQCMNA6oqOqh8oZpR2Oj1fM2xkBE2cytWAMuDc6Gj1rqrn3JpOJe8nAEim3XV1duHbtGpqamuCiYvVSxbNIMKJ9lK7W1lZYN25CUGVPIaF7/gWly8QYH1OOMM6FC0R/RooYJA2TOmt28H6z2SweP358zJGnvr6e62ipq6vj33CbWz8UQ7JNH6ljcemIUxOLwMVIbioqImx7U1LhXf8O+vv7ucZT2JS2ojabDdEUpdH9MVSIbrebt93r3kIv1YxSB2Lla+ogX2IEzih1gHXrEdDo+GA7TTO3VstDy3LN8svaamUgPFWj+tlsiPxPS4fllVUSOCXB+HqVmsAZZTfcT48trN2yfQ9un/oLDqpUf3QMHxUiHSIS8bqRZz4XLbl6KkY9LdNqcYZCiKPi1GqkbVxPi1ciOVBSvRz5ez9Thh2jAt4wZju2O/0oXn0a/Tbf8Fb8VCKdD3InGXDhcAWynzMoL/h2zCnKR6QDrJ1k1NMxaimGZ6+IJxcJXEvr8E9fLFGDH1COZRrV6FrIU3Lx3En4fmep6rTxJCSkb9ix/eiuUiyaHTkNmWQsLhMeSs/Vd+GDL6/C1OtWjXqUlEjg2ZlxOEGevzRnBPiDD6UyiRHH8g6zC58fuUnH8rtjN4oHiCFWh7dXFWLnprk8pSrwKgK/iYe5M97FhBE5dLqZLib30HLPMd5nWFichhWLJmPzmllITYxRvzLhUS8mKhJsl6yFPD3V4vIEceuuBU66ovkDYQq1AYXZiYiPG/dqxoq79okvq/Ll9Jj4eGJ76svpOESU6/kSUrab5OEZXM//B/xY6v3vhUTjAAAAAElFTkSuQmCC", OJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWGSURBVHgBrVdviFRVFP/d+2ZmZ3a3dRdxd11MR1Ip+7dsBArWphlBYCkFkQpt0pcM1OxTRLhS0gcT/5AgQagfUiIiFQmCyqwgQixTSsOwSTMt12ZX1zfvz7z3Oue+d2fe213H3W3PcOa+e+695/zOn3fvuwKjpCAImqlZStxN3EmcJ26OhvuJC8QniI8SHxBC9GMiiAznibcSF4Ox0W5eeyv9ooZh9m4D8bphY6YJ7/dz8C5dgkilILM5GJ2dENnsSKp6KRobMRYAEfIjCMMcygYGYL23C84Xn8P/4XhicRC1cvYcpJc8iezylZDTp8dVFogXEpDCLQGQcc7vJ9r4oHsNV3duxqQde8lD8rRjKuSUVqC+ASKTDte4LlAswh/oh//XJfh9V5B+YyVyL62HTOVrghC1PP+l7zje/H41ej4YwAL7TshJkyoLhiIPYi2nqJw/Day9gWzL+8hkF90UhByip2L8yIVDWP/1M6hLZzB5ThcMyq+0LEjbhkGsn6VlJ1tmaSDdPpfaNMy+xXBu7NX6lYNRfSlKxbzfqo2fufoj3j62Bm0NHWhtmAa4bMADIa9GIEiGIVCdgPSof0oLSdJcBxZKxRcoFTORqntYg+DifqUSgSj0qtr/MS/irWOrkSIvJte3wQ1swCEAjlP1kFiQTNhVlnYUEZ5r01yPI2Ehle6AYRgw/30WgV/ZGtbpV1SnYIMe2ffru/jb/BOpVFoZd3wL8ELjFYPKuAVBaVB9Sz+HrEC41AoGUYY0Gik+l2ENvIYYKYdllI8e7lwmw5/98ZGCJaVA2XfgwoHvWFWDzCWrCoT7jgblhMwyioAQpQiEC4N0lku74ZWvaADPs22ugaVacpQKrwxaSJOtwITlkwL6Ba5DAqoBrnGqg0rJj0B6WLg+/dlKJqWjakNSRF1zG4ymTSxWWzsD6NaLv7x4KCwsERbSQLmIxvRt8F32zkO85NSkHBkxqB0UqKKKCtXl+SXiQYqCi0BCgfDswyTbpBV1MwDeeCjcLs5d+1l5LyIQljdIrY/AoY5dHu7uAtqAcqT1cCYpZywegQuKvCkofZKdIva8k6oYhVRvYicDyPPT2f5TFe9DBCFZHm0qJimzRChvIO2t1LfpeT552EL97+rDF7qPZCaxT+Mm1YEwY7kJlzP75TMwMvNYmk9FuUCpfKNiH0kMCDzy1CyHQotCtILejJdNVBB/eh3YRQfRjhy5GIQAOAJI2K8ACLzfqKcANFd2Qse3YxGIrUqElpNIud1KZ8CaHCeOmMBtohRsyYR594cYjuuKOAq/Io4A7w7NHQ0zbmL1JrSIDH9LQM4blMlyzanK8yCmXTTqoX4GUCDubK+fjjHRN2T8YFR8z9mjWqJdk6kuLSpwCn7ip4xRh7tbHsSo6WCs8vfX1ZwaPymFMYtS0KSHTjCAr3Svq3UBau4y46BAnc9VBLJuSXz4KAM4gLAO8NTMVcjRvp2APJFAiFK5NXHxARl9ve7lXlOmGU/MWJ5YMJEk63oo/Hnd3cO29Wu4TUuXz16LKdkOTASpb4OIQYaN+g3x4Y0KFP9Fn0jb+bkx3YTXu3bCoF8if2M1PgSIzO2Ke79df5bFP8l6Eb6SuKvlAbx63zvhSag9wThA8KZIB4Bs2A2ZeVyLC5EtJABEtbAwmoBHpz2NLfM/Rlv29jHVZJDgdhiNR8h4T9z4wvitKfFRGoVlWTQRcykSm+d9iDseWgF/mPIahvmC0rmKzv3TdHHpjhtfVvOzvKJshIsJLpyHv38fcIje2rNnMSLdcy+w+DGIVS9CtLXFRwoY7cUkBoJPjF7itcMGSyaCk6cgBq+Hl5L2qRCzZlEFN46kiou7d9yX1ehyuicYGxX/9+V0BCD6ev4I8f2YoOv5f9dz0Aug+qKzAAAAAElFTkSuQmCC", mJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVwSURBVHgBrVddTFxFFP7m3l0WykKBBCLyU0yshtBQqD+PIvHnTcUnfTFNGk1MfMHoY2Pjq5qWJv601rZo0jTa9NcY9UkwjUpACya1T8oK9IeWBAp72V12707PmXvnMsDeZWl6kpO5d2bOnO/8zMwZgRJJSllDTR9xD3EXcRtxjT+8QJwgHiceJr4ghFjAgyBS3EZ8iHhebo1Osizul9hiX/EGcl1XptNpmUwmpeM4MpVKqb4QOlBMjwhR3kbNL/DcrCifz2NxcRHLy8vIZrOesBA8N5CLRCKorKxEPB5X3wYliHtpfmJTALQgx/e8Vs6KFxYWQNbCsixEo1HVMjMAXwbkAdUyOJZhENXV1SaQRCEQopjl5GbMzc0pRWVlZbBtO7C8EGlvMICVlRX1XVtbi4qKilAQ6wFMauVs8fz8vLKYmZVqXmPBujDwt2b2BgOpq6tTHjFAdOtdYhmCh7Ty7G+XNyjXLtffzDbNsVKpNWMma/n52Vnkxsa0KtYRJKZluL5fuW9qCun331PuXq98vaLYxQuI/jq8QbGZIypnqF1+ax/k3btab7/eotoDAaL0wY8hpqdClQpKNkHhEbdvI/rjDyg7fQrCcWBRoopcdk2YNBBORHF9BumBg2b0lMHCP+HmtfXJp7oRoYRL/jkRZLy5qCCXV77zNiR5yLp5g9wHuO3tqt/57EiQB7rlhMwRwG17OpGvqkL8r78htm/nYc6BR9gDfRpS5vgxWCRk+egLZbukjM4TQGuS8jWdIaEM7PFx5Cu2oRAFYeHvpSWsfHlED6mjnft7dE/+55+8iRBBdlvkbm1N2YmvPKt27FCKkUn7bQburl3kChexzz/1FFOflvUAeCByQ0Mmvh4+JbqUAnKT/O9f2EpgFXnk+0so/2YQbmsrIhN019DWcts7ED1/bo2l7sNNiH3yEcrOnoE1Ogr7/0mk9h9A7pkeD4BgI2je6AjoHIcoL2exLs4Bjn+NS1sv0/cyARCwy2NYmriqBO0b11H14nOghPCQMdj6eog7d1T89Uki6xsoMWe9ORR3Brr4x5iKOyuM7+5AngGQUPnl32E99rjKg4gfC8iko9baEHYSlrwd6Q5Qg5wbMzOeOXoyfYvpaShE3E8A8i0tFPNFgAAIH6fyLA8nJjWAmuAgguOsTjSSJzo85Cn3FXGckcuttvrb9Vu2nuVpz9vXrhVMZEFJrIkBeEcixbjQ5ZjZ9yaS352FpDO9VMo3N8M5fQbZ51/wNYpgZdXGq/XUBQaQUAOP7gxd0O3qRvLcRbXwZuTueQLJU9/C3blxPQ3C6uzUXQkGMKEG6XAQHR2hC+ebmgnEJRQjSZeOc+wEZGNj4XHWQ9vVCME4J+EQ8V7+s8ll8p+r3mT/NDNjaM3eQvaVPsiqariURCK1DLm9RsVfxZvGVU6YSqWXmPq+tF7qM4eH9VHM13BN/tZN5J5+khJDBtsw7O5XgEdGKCxNkE3hoVEA9Dak/+jYFYiWVj1ca/n38tcK3UONsF57HaWSWMlA8HG8CQXWv7HXVD7IuvU2HNC9kf0fQDY0rLlQQgEsOwpEqGKjOAEptvvfNYc/VKDUQl6JdFh1UzLaR4+vChYhTkwZrwpVbpL1xVGI5hb9e1iXZcIQ4Fy4Ar8qytBl4vDhZF7FRfKhkHJtBFfKsVhMDydQqCTzO3r9CUqgio9Ro+bbzCOm17hlWa6M1ynvNV9NJZXl9PAIqtzNvKAVcxXN1bAxP0H8Kv2Pm/O39DDhMl3X/SYYbTXXkVx+ldNVywWNQQmEPEyKWcJPs4FCby0CIAmIJK8o5m/uC6EBP7/uj6T3OB2UWyN+yJ6UJTxOS0trrHmeP0u8Gw/oeX4P9HeB41NpHKQAAAAASUVORK5CYII=", vJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZaSURBVHgBrVdpbFRVFP7edLa2M9MprW0tQqfVChGBNnUJgVAxhPWHBbcfQlOiJoQfIDERgZAWoyKJBhA1JkAANUgAhYgBt4ZFMci+lUplmUrBtpTOtNPZZ9713Pfum75ppgvKnZy5971z7jnfOffc8+6VMMTGGHNSV0VUSVRG5CJyCraXyE10jugI0T5Jkry4H40Mu4jWEXnYvbWtfO5g+qUBDHPvaone6MsLhGK42tKFW3f8MBnTkG5JQ8WoXFgtxlSq6igaq3EvAATyQ1DDrDRvTwQbdzfgpxM3cfxSR0plo0Y4MKfShVefGw1XgU3PchNNISDuQQGQcb6+ezXj3PCa7Wex6bsm8tSI4XmZyM9OR2a6CWajQdEQjcro7A7D0xPGrXY/2j1B1MwqxcoF5XogKUFIA3l+qrEDL62qRzAcx9iHc5BtN4MpkyTRi3l9nAgEo2h0eyCRwOdvTcTUJ4f3C6IvgBua8V3111Hz7lEUFThQOtIhjEqKUugA6IGQAgGIKRJNf3crubJlxSRUzyzVgyjXdoluLlsHkXAnG9tRueggHsqzobjQDsUqk4R06rwlhVyHColBQCMQN71oafOjfuNMTC4r0MTXk/zShDYReu49Wiizpyw6gH86Q6gYnUsSBjHHoHNZSoSPJYdQxSoiwZ9j8TjOXOnAMLsJDTueh9Nm1qSL+VJo2mu1t2u/vAA3ITaZjAhFGUIRGWHqw1HRx8SY3geJQnoiflDIq/NkAgDYMsxo90aw/LOTerhKtCWx3z38obm1B2Pn76WkY3BkmjGiwK4sq6R4rF93KSkBE4sioTcmWhQgw327B/5ghHYNcH33C8jPyeAMngPFPAJV2vxvD7vJuKyEuIf6QCiuehPlHsYRicaVcZjGIUGJcVR7p0VDiwxDJKbqjFD0Pt7TqJlTSjsHUKm92fnLDbG+EmSa09EVURTF4zFUjT+LF8tPwWwIJBuMCgoLiiQD6fCGQWw1PKR7/7Gb+mWo5AB44UGUUJ5p6kwI5jt6UP3UUWSZ2+ALAGkIwpnuRXu3CVnWLrw24Vfk2e6qay081nIjFFZ7DxWxrkAsoZP3je4uciykASjjxdvFRxevdSaEOPlCVrw+6QR+u1aC7oATnx6qEMlP7shhvFxxAgcuFRMAR+9uYKoKWVbDHouz3txgUgLI1ZZu5GZZOcfFk1CRqj91GzPerBfbTgJ9Y5Rks1sj8Aasqh6abNDtxjSJQWbJRYnR0smsb21kKkP021ZOxCvTSqDtAkU6FArB7/fDyFphCexB3D4XMJdgoCbF2mD0f4NY+rNg5tH9ysmUUNxMnGoCH9tsNlgsFoXH3VVKoslkUpXK3TCEG4iTgcEaMz6AtNBp8iIyoJykFS7RGwxa+YGXR+AsDcpYOAyf007JpqIyWGivhxnuR+NaZEF8Q9jb7kByZHHWOZ6E5zkAiUKSNms22MULQHoULGhOLjL9eWePg/nSBgXAlB85lpOrGVcA8AjU0GArfwoGg4j6TsPq/Qix3JWQaV21sKVqhsgVWO6uRnjYMsiW8amN09prxHPAbDYjMzNTYy/QSjH/EDl5gjT8eR6m0BHIjrm0IawDxkBifqQFjiBuGUv5MKJfOW6c6+b0eGmBPgeyjfy7TALb6WEJZ+w4Cny4M48ejyE/y4+2bntKpUXDPGjuzKYRB/mXoJTmxXeBoXp6MbYsL9QY27htDcp67e2yeWMwMj8DRTke/Lx4E6Y/1pRQZbeGlb6iqAU/Lt6MyaXXMdRWVJCJVQvG6V+t5n8KAHFE2sDH/Hu9o3YS2nzZqP1+Kq605SrSa+ccwJqqg8r44q0HsWLfTDTcLhjEbK/3nyx9gs6HibXfoB3L9Ccingt8S7r48856N2reO464rErNGNMEB0Vg1+lxGFrrPRlteftpVM9IFDU3Uh3JBAgXdIfSPy53YN47v8PdGuj70R+S8bxsC76um4jJ4/P0xvs/lAoQScfyZjodffDVZWzefzVxFBusWU0GzJ/mwvsLy2lJTXrjc8j4Ob3skC8mza1+fPHDDew+3EyfVF/KmeNKnJg9oRALqx5BYW5SKXdjqBcTHQieE3VES/ry+D2Bnx189K2P0KGvMCcdj9LR3ZFhSqWKJ3fdf76sisvpNnZvzfO/L6cpgGjX82eIeN114T5cz/8FfgqelM8V7toAAAAASUVORK5CYII=", yJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVASURBVHgBvVddbFRFFP7u3dul3XZLqbSULZRigURtpVGIaJQCgQchEmrwgYCRRDSaGCAm4pNQEhQDD9r4ZGICthpNjLE+GFGMpRGSvmBKwEiCsWuiAqVpC/3bu3fvHc+5d2Y7+9dCrZ7kZObOz/m+c87M3BkDdylCiAoqdpC2kDaT1pNWyO4R0jhpH2kPaZdhGCOYCyHgetL3SIfFvckpnjuTfWMaYPbuCOnBnL6Jcbi/98O9cR2GZcGMRBB6eDWM4uJ8ptpI2wtFxCjkNRXdCMLsy8hYEh988Qu8H77D/rMnMiYLWZ5c/zpKt23D7qdXor6mTDcZJ91IJOIzEiBwzu9XCpyBj350Eae+uYbSkiLsKb+OI24vECmFES4K5jgOMDyMo8VP4ZPRGAaGJ/HS9lV48/lmLJsiwuCtRKKvIIFsz3+6dBN72rqRTHloargPC6JhPG7H8crguRzmHIUPF27AhXnLMTHp4Nf4MAwa1HF4PZ5oqikYCTPLThq848xv2Lz/W0SKw1j7YDVK5lmYTAqkki5Ctg0zkYDpl3a65D476cEMmWhsqEQRrY9Nr53Bp2RLiu+gXF+ZBHilK/Cen//GvnfOU/iiqKMQ2o5AgsBtxyOQFAwGtJMBcFISSCbhOC4SNMZOBuN57uKqCF48fh69VwZ0EkcyCMjQ+6v9jxtj2Hf8AkLkxeKFpWSQjXlBSeqQlwxoEDATUWraCTh2KiDryPFEIrawDIZpYtfhbn89STmotqglG9KMBofu4I1dKxEuslA5v4TyaJAST78EYlcot1/azDpIPDeKYB9sXVuFR5pW+e0EINXD7dFlSNgO/ro5hIqy9Hpghw9aMh97ucV1XdRWmlj6ZAwW5Y/VJPYBiWDZWbfJo8lE5h6U9ca6MjzQXKVS6qvnUdpSKd82K3+zTZIXqL+NI7BDURofH/c7dVAd3BfPBSjk+cQg4xnf2ny2yYQYIxqNcrd/tDOBFjUhSQtJJ5BXXAKhfAdua+5TXZCHOriQqVHgXDKGJi1MoFmFjMMTCoWmJ+EWjoAfHU0UAT0CWWloZgL1XHPoNCsUdmXIr+spyAwAkHIzxuo2dLsagXomUJE9aFpREWAgNVZIJlkRyBZlnxclL3DGVtsQvbe+x7GLr4J3HMxgy+X7VW26KnCIDOST9quH8GP5odwO3pZeQFQQx7fXdWJt8Qa/i+H832RNpE7xxPQyU/8M06iMWOkf1AgTiHNtSfR+/F+ysqJRVeNM4BLXmFXD/IfwX8uy6CqEQ+mLSx8TOKe+HqvehKnrxRyLNNsSe0Zv7WECXZDrYGfDywibxVMc5pgLb5YtS3fqTV0W39Vo735MHwfKwhXY27AL1wY+g/z/5EhjSeGt1lQSBspzJ/EO4PNhRdVzWBRZoppPM7YRMPN/jf1+s3cHTnwrTG8wTSLD5Fki8NZQfgbHFgCbrQyPhSJgxRCq7YRRVKu6l/PNyD+O5BWp3W82y2HVvB+cLUpnIUKrcN1cdFIHb1fXMv1K1ga5JY3IGppwHJ6QXohZ8JDz6NCFWf0uzJJHVU9cYiGDgLy3b5QDKBCtCMVO0wWgNh0NcRcshE46tIjC3kG2dujgG/U3QsalVIalFelIrINJBhB91vcknVPkRkRAyzloJ5XvRqjua3qsrNHBW/O9DfJ44T/H+jMeWs6fwr11QridW4RbXZlfP98u3MF24aWGsp9p/YWeaTM9zdpID+R0TkwAly8DY6PBo2RxDMaKFUBpaT5TvLjbZv1YldE4Le5Nhv/14zQPEfU830C6GnP0PP8H61EBI4gFfRcAAAAASUVORK5CYII=", LJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUaSURBVHgBtVddbFRFFP5m9m6lZYWNS+iflOXBiBBDE0PiC9QqGp8IPIBoYkQTNUYkvGBCNEIfjNEXW40vxggkxhBf2BhTE6KW2oDGxIj4G1LZxYCIbtvd0t279+7eO565d2Y7u/2xS7an+Xrmnjt3vm/OmXt3hmGJJoSIk9tF6CP0EpKEuLqdI2QIFwijhBRjLIdmGBEnCW8TpkRjdlw+i1s1OWNFPMd8ryAqzk+iVBgWTvGMKNtjQWwBO7oYD1uAPEluBGGaw5ifQ+nmENziGfiV8zUPC+W5dTeirbuxIvY8tZPmkBlCP5Ul878CiFzW97Qmz824uH5tEJ0rXwfjKxCx7gSPtNOTMTAWVc+UAX8SvpiCX74K3/sH0eyzaE28Ct7Ts6gIPs/Mq+Tf/57F1qdT+ObiGM1sK1pat8Fq2UAC2hDhPjhzAkS4RzOOw4omqd82tLQ9Cm/8a8zs3onyV1/q4eWYI/XrgtcloJr21GgG/QeGYVkWutbeg0hkBZHZhBIRlsA5taveCduBIBmLILp2E3jUQmHfHrinPq4XEZ8jQC44Tf7DpSyeHBhFR2IlejpilNqyGjgkYswkU54pERp+CVb3Olhd3bAPHkDl/DlTxNEaASoth2T72r9F7H1lBIJxdK5pQ6ksSICrSGbBAji0iLQge1aI9IK8QyI6Oyl7ERSf2Q+Rz2veQ7oUOgNVRW99dBGZGwVEKX2SvOT6JLASDMxqIIlt5U3YoQjKAHfIVyh7MVqwkxMoHXsNhgUT5qoe++XFlb9ncPLz8UAXZwyOEuD7ihC2ATX7GjghpDDKGnNlFkhAuYIIjVqhteBd/0sLeEpyywzs0pHPzv2JQsmjV4xhxvFRpLYTlIBeM4SzBREApeA69BphXPdhlAFGGWAuZaLsBu879zyUP3hf0wWfdimgT0dOfZEOyOXnwfeBbN6lMvjwfDeYIaiuECUFx/AStoLKhhRQIkxMUBmohBSVI3vDw2YZ+iyEPyxEKPDtL1ni5lURN+0KzZ4e8spqhsGSRfj90n4+kw/RvRwJtIvh7Jlc7BT+Yxz+RBY8sUZ27JUCkrL18+WpKrE5cCEoQ0GlnM0lmlcEpU+m3Y7WRFnwJyBIBEIBSa5qgclpJxyMqQGZMbBcA4JEiGI1zaF36spiqz4SXh15OGSQu8tpHY5bsz1YXXfTGzNr0HSxamKrVlXbMgPBxqE70YrlMrOogY+v1rdyUkBGtjZ03Y7lNi2Cb75XhzJSwI+yZVkcfb0dWA4Thmfr14OtrmbgghRwVl9t721Hs62+/vyhHeblqBSQgloHB/dsRDwWRa3m5gqxXnzJDKe42r2elFfxWAue23mXeqJ55Nr4Y4+DravukE5Ibv1rOKijh5/YjJ72NjTDhAEQceTwy+btgUCU/Kf2aUOyLbPwycB23BZV385bLIOoa/M33jRnP6T3huaW7BjUK3nfxjvw4ZH70RKICHU0VBGlWzr56eLvvAf+8CP6bkZxoUaAWgv9qgP2PpjE2Xd3INnRJr/e4bhLECGEkfpEApHTn1Lt95nk/YuemuS2nJDWp4orN2bEr5cGRGWKvu45Oh7kZyEM6Jjs4+VbhPfbCxTPmQeUtNryL2UWwXEsXXO+8dLCsweEN70pJAmIFPT19BbhFY/QKelq/ekoLRo9pqmj2eC8hy2/KPzymBDusPDdFLW/o1heLGCD5ja8YVPZOCEaM3mQPb6UWTMs0cTs8fwBwhY06Xj+Hyfoq/J1k2DiAAAAAElFTkSuQmCC", wJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAURSURBVHgBtVdtbBRFGH529z56dy29g0A5SeGAQGIMbY2JQTHWak1MNAb8oZgGRUjUHxD8bWJA/5AYE9PgnyZ+0KCpGJWWao0RU0kqIUEsrR9NGwlXNBT7Rds77m57dzu8Mztz3bsr7RXKmzyZ3Z3ZeZ73Y2dnNJRojLEgNTsJ9YQ6QoQQlN1ThCjhEuEsoV3TtCkshxFxhPAh4QZbmn3G38WdGvdYEhdZPDHL+gbHWFdPlM3EbrJkMsmy2ezthBxeiEe7DXmEmm7YYRY2FTNxrK0fP/w6jAt/j+Ze/avtGXjdurh2uVzw+/2oqKgQ1w6LEhooLdFFBRA5z+8pRc6J32u5gE87BhDwubGuKoCqlX4E/B54XDo+OFgLw9BAEeDvIp1Ow7IsBAIBVFZWOoXMK8I1j+c58nN9I2h6+yeYaQsPb1uLUIUXjDRz1cQhnmuaDl3XCLoQ4Ha7hQDTNDE6OopQKASfzwc5ZzeNyROhFwQgF/YvuobQ8HoHyrxuvPHC/fBRm5y1BGmKg65TJskhYppQQJfXvPV6vaIdGxtDPB5X8ysRwSIBvOCcnu97txsbwiuwfVsVXnl2kyA008wmnmUwRZvNIy4EjwbH5OQkUqmUU8ThvBqQob/Cr4dHYmh88zSqq3w48OIDWB0qQ93WlTj/5zgmZtLo6rmG4f8T9sv09jdHd8DjtsMv58q1PBUqHdzC4bAQK20jT4W6yyk6+slFRK/F0Ts0g4ErM9i6YYXwZtO6Cvx4/jqG/ouLNJjkfdLMKh+KvBfh1XUBwzDE/fT0NBz2lhgj87FXed/63ZBwTSf09I8jUObGdDxDSOP3QQqlaROLlBCgMeekeeTO2uBIJBIiItJe5dw8AjvVk9bOQWQsuzTiqSwi4QDeaenHUwd+phRMYk2wTOTdFAJssHz+InMK4NexWEx1iaWdf4b16snXZy7bIaWBXOjJM1exotwr+t4/MYByv0tEwB4jEi3AFlGhRPBxvBj5+iCtngvgCw9NnMFAdBpzHwapTWRIiEafop3D1GymaPKFqJkU56wNvmDxNMhirOMCIvzq4sC44p3zkOxmKoNZyguvdC23cDIxhi1Ar4idUVDIZDLweDz8cYQLCCoim9UJ29IkgMMOpYy+HMGsxVNQKIJHQVpQY/LtdNf3yO7dA4OTyMl1LI9ZDtA/E54vv4LxZKPo4xxi42Csr4bTaw3LZ854itZfrrqmuICo6Ni4GffalAi9pkY9Eithn+ik36dWV4d7YczRalu2QKM9g7RLXMAv6k7lRQ0urbRKJ+emP/e8s/usJpdi/iMKsokJpB+qhZ5M5grxbmtBOaKK0P1bL7Tq9ao7pMvdayu/01atgr67CcttOe+b9jjJj3Puot8x/bKQfnwH9Osj86wISyfOgYiNUx1OAXO/Y7lFahaP+T6u5WMw/e5WAWf9ML62NB9zkjerbVnOOVkLvZBLs3WyDdahg/x/nf8NL0GAyL0g/wj6S7tVV5TwoDq45NyUDxrkAHrhZRjftgOkurCSSyEWqFoLo72zkLzBeWrKi7MMyy6oxenRx6BT3kDFYxVOvhCxj77z1/bD6DkHbfsjTvJdhdvykg8m+PcqrM9PAJ2ngcv/YF6rqQUan4a2bz+01WucPVGUejBxiOA1cYRwqKgzSZvS/j+AeAyMDiII3wdtMy3l5eXzTcWL+8gdH1bl4fQ4W5rdKPVwWnJhs7nj+RMEivXyHM9vAWFQ6QRq+PkkAAAAAElFTkSuQmCC", qJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWHSURBVHgBtVdbbBVlEP7m33NKb4QixUjLpYDgJSDlEmP0AYsPRn2QEgUxkWi8IkHwzTca44PBGFKCoggK8QE1RoSQ4AURHtTEYCw2PhCtnpYANgg9LT2ne86e3d+Z3f23e3ovrZPMzu7+l5n5Zv75/58wRtJaV7FYy7yauZ65jrkqbE4zp5hbmM8wf0lEaUwGseI65l3MXXp89JGMHW1+GkGxeLeDefugtkwG7l9tcDs7QYkEVEUFrLuWgaZMGWqqJubm4RCh4bxm8T0CmH3yurqQ278P+W++gnfuXNFgHUp1x51IrnsMpY3roObOjU+ZYm5gI1KjGsDKJb5HjHLd3Y3sG6/D+fQwqHIqrJpZUDNvBqZWgOZYwDQN/ZsHzQbq7jS8S5fhXf0XyU3PoGz7q1C1tXEjGtmIlmENGOh54ccfkHn+WVC1A6t6KdS0adEAkfrxnP9Cx0qgbYrQ0NksCufPMyQKpR8cQMmKlcMiMdCAv43y/CeHkX1lCxJL5sN6bTboUBlIa/DgYFCSVSmWVSw7FbR8OxQYwA/Nndy2P1G4cAHl776PkkfXxo1YbnJCxZTvMsqdUyfRJ8rnzoP14CzQ4gwU9UHl81C5HIhZXef3HuYOhx21oZ7qhqrLQtncluNv20aidg4SHK6+rVtQaPnVqBIdO4oQCKEX7+F1dCCz9RFgwx9I3H43Zzh7Xc6cUaA8DzhngT4v444x6G7iHHiuDzhRArQmAwT8cGh4rgtHlNfUovLUGRCHMaT5EgqDQGSR/fZO0E8XYTVXQ7XnQWXsObFXpSxPaKiP2RBbULBZ2j4adImR2Kmgzrr+f5UPUPCRKnD+VFYCFzqQ27M7ZnWwvClc713G+95V9UhIbKZyxq+/BbQ5A2IzqY8Vv1QJciiGHQJXKcwJRwVLkiGQHJB3j1/cjna42Qw0e19xtsWgIDkwXxCIsiO39x0/KXzmTFYr0lBfs9fbSkBpzvglvZydLNkz2CHLe00Weiv7sKjXR0D6BCgxAnlGxMkHycZLOr/vPaPOL+3i7Grzxzv5rd9R8lxJkI/3cMyr+csBNieBpZwEto65HcoUS2LFiqWdjC0t7VdNVSjwGwU5wUs7RqslBJKe9X7BWcRLjj8soggJlJeDSksxiKSjyzyPDW0PU0ncKfTbpfts5mwQCunOoZEh5Re5hCeTMqJFhtT53v/e6ltOoFCGoeZQwGEEZAAVF0791nXgKufGmxVhPdZBH8/zx1ChUNQ/mJtxaE+Bbl0kv+oSYSyg0z2B4qF2BzFAWBqVCqQUpS/EY4HdRhQSWYOeN2gKMzdJ8z+XoQIDqhJRj57uyPM4F7vMo123//ukWcUuhiOTKUX/3H4DZYagJC5ciBF25wlRUUjlMWOGaUqLASm/YfFt+L/JGCHbdkh+JfQ3dykO5KMw+aRjkpavAFmWaWoRA06bL+uhh4sGaUyuciG1dl28+YwpxbIRVekrV+DUL/ELR1CQJp4VxhFJO49XUPLnX/ggE52WpqtwXz4kXzRzJtT6jZhsirzf9HRc+UHRPWg7lnrt3LMK6tq14ZfjOBRHzIqtY8dBNdERrX87Do9Izf5vTsbEgYMTjn98vOYqqvZ/GFfebI5lKtavCWZJ3nsf1O49ftziXtyIEZ4o37MXqn65+Z0KdaHIgDAXGsIOUBs2wjr8GcDQDczk0ZRGPHsOrKPHOfMb48ob4neEOAImFI0wSKx5AOrIUeCJJwehoUdSzIcZbH4Z1nenQStXxZU3DrwbjPliIkcq78B+gC8maGvDkCTH74Y1oBdeBFVNj7ekMNaLScwIqQ9NzNsGNfIhA62tLHuhZZes5WP7ggUAX9GGIEnuphu+rIaX04N6fNQ14cvpEIaY6/n9zMswSdfz/wAMK7gXGJaKMAAAAABJRU5ErkJggg==", xJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATeSURBVHgBvVdbaJxFFP5m9t/sJtlst62JSW11EyJCvLV9sGrRNODloWCbhzaKCAr6ImKUvvnS+iD6UkKgL4piBYuiYFvpgwgaK4hIK9YWq7AQ196obclubnv9/396Zv6Z3X+v3aRpD5z9z1zOnO+cOXtmhqFFEkLE6LOTeJh4I3GcOKaH08RJ4lPEx4mPMMbSWAkiw3HiCeKUWBp9KnWxXJIea8M15DoZUVw8K3KpH0R+9mdRnDtBfdlGQPY2s8MaGI/TZwpemL0+Zw65/z9BIT0FN/tHhbLQXx66F8HYdoR7xsDb1vuXTBKP0LYkbwiAjMv9PWyMS8OZixMoXvsCzGpHoK0XPNhN1jrAWFDr2ICTgmvPwi1chlu8huAdL6C9700/kGQ9EKyZ5/bC71icfp0m5RDoGAK3oiUFxqqBl6MhnAzsbIIEhvA9+9EWfbwhiGoA/xrjhZlvkEnugRXegEB4AIx7k0nZU2Kiwg+hEQjhybLp5KZh55LokCDW7vKD2GT+JdxnfMIYL86fJONvk/E+WKG7wFmeJhrOEYicr11QfZwVfHJesdS1Qr3I/rcH9vxvxpS0sbciAjr00nvawwtYTOym+F9BsPMhcO6FW3nOtELd1PXiL7z1vEi4Aq7roJg5DcHXoGtoCiwQNbP75VaYCJQQ5S4foBBcQCAQVF4w8pIp77SsuOCTNYuyzFHUkSKZ2whYnWDOVeQufeCH+5a3k16FSxnvF/5+EgEmlSK09xR+8olx1jD5aoPAVEaqSLi0psyF/Hk4dobkNnTef5KSWRVQmQP9MgI7jbJMPA5bhZ0jA+5mPW9F2UOIAnG+Ict5MDomT2QEVRIXULjykTGnSrsEMGx6nPQxmgzN5ItIlQAAxkiuKQA5zhRrwO4MgXC8NcmaM/ejP2DDFryDhcKVJ/1/aO9N0snOBVrAIc1wudzdkJSiJ7oEhKII7RTlJW3HWVXcdDJulADiam72LzWJqcnljGeCFnCp0iGI2uKLhpngbYMDf/IwGVVqu/lpKmzK77il98JDZTyvTjRRpJ+iHuBVDrNyGSwZd2sglRyS0wvnAA9AzDITvjszgNF33oMqeeANkCyXhAbpqr/Gkfc3Y7uuztKaKon967pwu6irI2jEtASQlNLAbQSw+b61RlSV8E8ptYcsbBnqxq2mwfVRRNpLO39KAvjJtJ55ZB1uNT23teKictyUYnkQxWbm8hgcO4r5rK2TUdJKJKLw6jJ9E1/uQLw3YgZWW/JcJhCfUWN8TTSEd59djROHvoeq/ozdtHlzOkpp046tfuMHpe2a4xizsyhuewL80kWYP+JyQQg/b7gbgcNHweirqXwc6yvSpOpetQrWhx9DyJp8E1Rdmvj+Cb/xSXMtKzmnc0Fed+Oy7X79FdzxN8Adp1xNsTQAqvTQNvLJA+Bjz5uhJOpdyXTHiJ4Avms3hexbgFAL36KtGlbcc6dao8r4iP/VVFHYdVhG9USwLY+C077hxZfgVi/ezHCYTs+XX0Hgl1/BHqu4EY82vZaXFqvzMMH5c3APfQ4co6gkEqhLDzwIPPU02KuvgXX3+EeSaPVh4gMhc2If8XjNYDYDcfoM2MI8HZR0Svb2gQ0OApFIvaVkcu9b9mNVP04PiqVRqtXHacuJLcrP823ED2OFnufXAaKd0VhPoTLpAAAAAElFTkSuQmCC", RJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXjSURBVHgBrVdpbFRVFP7e65ul05np0NotgzgUTSgKhbg0GpMqJdgfioAsYjRAiD8IGIn4x2iCkBgxJgI/hB8qRTEh0RCXFDQoSIWIBiKlEMEQSoFudpvp0Nnecq/3vmX6pu1Mpw1ncua9++7yfeece8+9V0CeQikNsMdypvVMFzINMQ2Y1RGmHUxbmbYw/V4QhAjuhTDgENM9TMN0atLE+2K6wi02gccJUUeoErtCk+GTNDX8O1XunqdES2QjsiMXjpAFPMQev8Fws/FNiyL53xeQI7+CJNoyOlPzKbrmwjHjBbjLVkJ0zrQP2cH0WRaWjkkJMHAe3+8scA4c7/wIyuA3ECQvCpyVEB1lDM0DQXCYfVRAC4OowyByL4gyAMd9r6KwaisjEsxJQshluTryF2LtW1gjBQWeeRAlf7qDIIwlPuoNqsWhJq6zFwHu0H44fYuykhhL4KYFLg9+i/it7ZDcIRS4qyGIRmPW2egk0Aw7qMmAUuOdF7VkO9TkHXhC++AsWWYnschaJaINfI8FrkTPIHHrLQZ+PyRXEKKQYg0tTTISSVtZ1r+Jgmx7T+nK+0quMjbWNubNixYUx9iR4QHT9dx69MY7cfTCGjR6+xAsXsAGMtytWy6YHSacuob/qTGe4QlCQYgGJd4GKlbAN+8EhAK/1Xo2D4VkFtKMDv/zCU4M3sGFeBHWuefgydIGiKJgc72NeSa26UnzycD5j7Cn4hqGpiZBIt0IlKYJbOMqmRlug2X9UHxAHz1MBBztv4hT0W68POsNzPE9jHxldD5wAgSaqEDTNMSSBH5WFkU98utZ/fsC+9vACk38y4G2nfCLJRhUevFT99coL5ypN+bWP1G6BI2Vr6DUVTElAlxVVdUJcPV6vfD7017YyENQb5XO9f4Cn1TMplEchLlvWA3D6/DpdWcHmnE5cg6NVetQX7YcUxFuADeEk0mlUvaqeu4BPj0XxtURvNhcgwpPEENqHzSo+qRzSx44RZc5EvRgl7uD2PLghwgWzs4JzN1veUEPhemFyspKKwyt/D/E365HLusAq0Ob0VC1Mj1IkiWVuDYCmaSgaDIUIqMz3o532tai6eZuDKS6JwTnoMbKGa+cjCkhHgJ9S02oMd3AY12HkSCxjEynEoX5QwFfB6JgpA4e5RO9R/B3uAXLg5uwuPwlTCYWAUVRIEn6AgxYyxAjSlT3gEJlRJUhs8cYq9hPo1rGt9jgbWgHtsPVvBkioRMCExiENfNdaj4ONCzR6zgBnhIDwaIQHCzWSyvXYkDuwbGerzCZPH1Oxub9EfhGSM525tQZ3UfYSjAlkp6EUTmCVT/Ph9fpg1MqRETpz5rxHrqhYuOhu3jkSgr5CAcnpnIv+KIsxA59J23lHrjECfidAcz218DNttmoOsTc0j9uoKIYxWtHRrD4VALuBMF0pKC21gJPEzjNdD0v1VU0wEOKEVb68EPP5xkdF7ck8fpnUUZiasAUtjTN1LFqjb26RTBTMd+IAkPJPrx9dg26Uu0wJzuqb2nYdDCK+Zfzc3c2AnoI2ArwXP0X4gMhq3qGxPdlRuJLVnizxF2OBWV16OpsB9H8qL72FJb9GEe/Gzj1OKYnPAnByAs1Sx9F9Sj4IY49bjvmy3HD8V3o7drKvpdMsv9Oiq4T4OBVPgGfrvCh0p8+gujbsV4yj0j7+LvX4ce7j+1m2aoY6Q1+2uBGd5GdnnY+V2QH32cdy9KmmXOBL8kQLx+7KuODk3E9c+nNpuQJizjlhzW81+BB41ynVdkB25Es56H0z9sKPj6dQO9dmicJ28mU/ZUXAbuY5fOrJDt49kOpSSLjWN4TJTh4Psk8opj7g5DzSMb/CiUBz9dI2FRXCJ9LsIOvYOCt9i55X0w4kaMs8525qaIzTMZ4w7C8plxE3SwHVtc6EXCL9iE7kOViklXMq9neie5aMZnQS90K/aNDpi03ZHqtT9G/ZZG95vyanlDjcnqITk34RbaJ5nE5zXuB09Hr+TNMa3GPruf/AxiBj0gUYbqpAAAAAElFTkSuQmCC", BJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWtSURBVHgBtVdbbFRFGP7m7Hbv3bYEhNLLbltbtItYX4ziQ9UHH0xM0NDwhBqCidEHBfEBjaFo0BhNkBjfTAoGozExGp8QJIoXAg+aQlRIsewqCKWt7Payu2fPZcd/Zs9sT7fLthX8k29ndmbOfN//z39m5jAs0TjnjVRsIvQT+ghxQqPTnSGkCMOEE4QvGWMZ3Aoj4jhhPyHNl2dD4tnF5mc1iIV3ewgvVvblrSwuzyTxT34cXq0OAW8Q3U3r4fcEqk01SNHYi+UIcJR/i1KYpc2a0/j8woc4feU4RjJnqk4Wi/agv+UxPNIxgDWhVndXivAQCUktKoDIxfp+ocgF8cHf3sWR5KcI1IWwKtiMpsBK8jqMOvJemFU0MW1kMEvw88vY1XUOTQ3bEYy+As0bqymC1fL87ORp7Dv1HExuoquxFxFftPQAE7/c9TiX/9YGbAy0zMCHGVjm79SsIdB0GL7AAzcUUSkgqciPpj7DO7/sQkskjtZIB6CVSBljZcqyDGpr9lvY2j4NHyvSPJCwzRESchGhpiH4wlvdIu5Rbwlzke+Hk3DD4yfx8g9bsCbShuZIrOSwoGIu72XB5N+2oIWnY9Pwa3aZXKJIy0MibHMM4VUn4PXfr+jeIwE7ygKc0AvvMZajNfx+ANcL4+hZsaHkMXN4ZYW7FpChncifiacR9BQdR5iYryyiWLRgFn4myc2oX30WTFNbBzrEUmjOnz2q9fC5A7iWvwyvp47WvgCzqFNpOCjI0nLqq/2zeLbzKkLeHGnRHeRptQoEUadSs+DxREj6JejTb8BlMtrMed/Tyvsnv95IkeUI+yJYHW4RUS45XpE1sZCF5zvTaKizXXMy6bXMEBUBmsA2k7DtLOy/ooh0/wmtUUZB5ECHiMAm9fhXox9JckatBZ6DbucpAgV6zQwYVBoyIgbaQ1ns7L5C5Fl6SndQkKWIgqgL75kTCU0zoE1oKD6Vh/7B+4pObu1CQL9qOXn1SGmtCZTLmLLSMuSC3HTIW4Oz2NF1BQEKNTiRUXsJeQckAgr0HxNg4zbsLR6ZZcY3x9zL0O9F6WCR2+vfuaT0XonQ7Vkqi/Bpfjm6M2Jhd88EJRzH/H2g0pw+iiIb02Fv9oBdpDeZWu1Tp0hnHiwYFAP7hIC4qP2R+dV5zaBSXppu5yjpTCSilKl3TJazfR7RAqMxFDlcK8J6gjwfdU0tei+OwpNYLwbGvc5aIGvNzON2aaAdLofX1pHnGkc5K8vkqq4EcSmAX9NgPe4BH52bR422kykloNGrOsUSlJ1xlesiBvYlJhHx2liqSfJHNfBL86WWRfh85bFiWeSWuDYcdw0pWXfYxFvrJ5ZPvok8vzQ3zwK/olHVlRECUqLWVt85b6I76w28fdc4QvPWfInko7XHefr6VFXuhPJwD3nr0dWQkK09FPbXeyf/H/LeXrBA+eIyLAR8p/7de9vD6CLyNxMTCHtsZ1e7OXKVlqru2Tzg7j6htmJxEDVOG2PIXb8dKwNZefoyNv9tWC65W0DRQej8CLRYXHU3ac65fEj8i/rWYGVk65xk3Bx5pXm3bXeTHxTcC45j8AzMqV56Pa6WdkVUj8JSyLkbsRgCR49Da29X3XPHsXNFOiCbWSO8kU/kuX6jSCyVvFz3eOAfOuQmP7DggipyQVzJ1KXeLgxxMw1uZ+hiM1UCn6bygsaNRB0vBGpDJ+QJ2XCAmx8fdn8vJJ28q6K69BFSFlE0jnF7Kj4nYmRxct1Fnu+iZ3/6sZI8jlomruVuEdxOcju7jVvnNa4n5gj0WsQrGnjhpZ28mE5XkvdhKVYZCRmNVIobr+7m+oZEiaQK9I33cWPvIC9OTPAKu6Hni32aDRJeWNCXy4IPnwGfmaEbhgHW1grW3Q0WjlSbSiT34H/+WHWicZAvz0Tsh/jNfJxWEaI+zx8k3I1b9Hn+Lwhx4k1NVDupAAAAAElFTkSuQmCC", WJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAapSURBVHgBrVcJUFVVGP7u5cFjVVAwlpSHQeKSgahjaqKWS5qmjmnOaIjbWKOlprmMqTU1UZPikjU5OtqCKVrqaGKW5ZZQgwEuyKKsIgjKe8CDt7/bf+6793EhhIfjP/O/c949y/ed///Pf87h4KIIguBPxTTSeNIYUg2pv9SsIy0hzSa9QHqc4zgdnoQQsIY0mVQrdE72s7F4XGErloD/J1arTdBXVQv1qUeFc1eKhfOZFUJDo/lRRDa3h8M9AlxDxZ9wmFmUh3UGfH8qH9E9vRBXmwthzWogMhJRumlosoqjEPl0V0waGY7lcwZCE9pFOWUJ6RhyS0mHBAic+feYDK5rMGHDznTcq65H0oK+CL6YBj79CriE+cgLHYDdRwtgMttQW2eElvpW3NejWmtAwqvR2Lg4TkmkTRJceysvLNNixntpWDQ1CokRRvApKUDvCBhnzUXK5RpcuV4jjWsxC5oMFtwq1oKj2XevG4UJw3s9kkRrAsUyuPFgCm6FPwdvfz+EXf4VXEY6uHnzcDOoH3am5qFOb6HBHBg2AxJZSKX4jcqCMh1ul+uwb/MYvEkWUZCIlXcJpwBPpmIFqzdcuATDpHFQ59yAm1oN3mgA5+MLztcHNVqTiCgPXJqcBYvF5iTDLNBsEjsKSrW4e78R576ZilGDQmW47URgpZOAZPpicUhZKXTjxwFVlfAYFCd2YMpLvTlBwZoq06JWo9HOy6sQrSE4CQiw2mz4N7caAV3UyP3pDfj7qeXREcwV0kg4t4o+KQkoLQHv7g7OaBSVN1FpMpElTGIJUY2AwQgjBaBTLXYYzHaYqDSyktRKO8TXR02WM2LdzgwoRLS2Sspw88XVGwywVN+Hm0oFnufBxcaC9yAXcJxzRZxUl780URyarILY1iyC0yKsbqF2T08VbeMCfPTWEPTo5s1aEwh7C8WKwMD3sy91BbchBHYD/4wGvNkM96JSccXc6V/AhYSAmzQZp69UoKK6SQo4YNeRfNjsLbaBKOHBvrQtjWInTYgPRg4MQvLB63j79f5YkxArd0tkLoiX/525Y0ZaRqXD53Y7btzW4VAOBWD//hC2bYV9/VoM9GpC0T09kr7LJb2JRqNVNLfRZHMouYKZfuyQEJzZOV6sD+oTiJeGhqGBMlafcF8lz3hGIEY0JU00d/NlWp3BGXg6vRnvbM1EwhkBldv2AB4eCFmegE+CCrFjZRyCAjxFUJPZ6gCm3RAT1Q3jhoXi5KVy/JBWBA93N+w9UYipq86RRzj8/Ecp6hvNMoEYRkDDall5Dxy+5Xgx4mVPsxUeu1CGiZ/l4dCIBeA3bYbwxed4JTUJJ5ZHUJQLzpUbqFw6MxrLZvVFRU0T1u7KRHZBLUqr9CijrVjfZEHKmSLkFjkPSg3DEo9UBuTYZwoDSXWL1U5ZsR4LP87Aon+6oHzPYbEpcP5MwGalyHeYPSjACxu+vIr1pGzvM3Jw2hPO+p1yJwF/FoRiBJ26XILpq36jdsaJl9Jbm2dVmzJzrAbvJwzA10fzsf9kYatWOTnZqbTj+LbxmEyHFhxI4mWCTjL/ZkDXcZ2SVfBQxKitM3XY19fbXa7qVHDk5hhNiBydj4FOoif/Dks8heDuXh32jYsOkqtiJsxhNU+1Ci/GPoWWCcV1mfBCGP7aNxnubny7/SJ7dVVaIJv1Pi//Gz04zFHpJAcWLmwHFN9rQEBXdbt9X4sPV/69wEmpmB1E/tp6EyKnHaZ9apOCUJweroinhxvCenhTmvVC+rXqVq2CGHysLDw2my4pzmQUwEvn8rfiPzqxlsyIdgzopBlYHlg3fyBSk0YjsqdfS3BprsQpzyrBDzBs2WHb5a9rE2LQK9in025QuXE4cb4UXx3Jo0tIA4b0C2zBIZyCfMPCWOWQD9mP8kLCSLzL6ldzHyB+ySnplOtcPmCu2PfBCAT6e2Jl8t90l2yk25MZZ3dPxOi4ELnbDlr9itYEWCxkQUrNqb8XI3HLRZitsilcJ7FiTj90p2D89MA17N04HBGhfhjcr3nroa0rmURCA8WlNPNWDeasP4+SqkZFL1eIOEiPiQtGGp2Ibs1bswTtXUolEi2u5XfJhEn7c7DnWIHLYeHjpcKCKVHYtDiWrmAeSvDpBJ6NjpbT1sOktFKPo+SWH88WIadQ29YwDBsQhJeHhmDZbOYCT2VTCVx9mChIsJjYAikwlWKmO19W/kMx/drpAAgN8kbvMD94qVVtTbWDzfPYj1XpcXpA6JxoXX2cuhzaQvPzfDTp83hCz/P/AKw8lTShh+GlAAAAAElFTkSuQmCC", EJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATjSURBVHgBvVdLTFxVGP7OnQcvBwakFLChQ1MsaMRSNzaYIhsTHzU00Y2JlUUXRk2qCxdqIkSNMW4qMXFjqqiJJk18JCbGpI2FlSWmirUVFSKDWC1jZYYOzAzzuNf/P/ee4XBnBoaK/sl377n3PL7vvP7/HIEyzbKsIL0GCH2E/YQQIehkxwhhwiRhnPCZECKG7TAiDhFOEKLW1uxdrrtZ+2IDYu7dEOFpd14ilcWvl69h/kocPq+Bqgovejp3oLrSW6ypYcJIqRERpXpNr7Owh1laLL6KNz+6gNPn5vD1DxFXVUs+9+0OYqB/D44duQWh1lq9yTChn0SENxVA5Dy/nypyJn7tnfN4+5NLqKzw4aadNdjZUI2aaj/81Hu2TNbE4lIKUSp7eWEZkWgSg4c78cKxO3QhTH6EREyWFODu+fmpCB5+9kskV03c1nEj6gMV1FchK3GfhVD11rWCRDKDqdmozH/ruUO452BbyZFwC5hV5B+fmcHg8FfY1RRAR1uQGhMOqciTspS8EPuHfMt/9P7ltxhm5mM4OdSPow906iJ61JoQGvkJOAsulUrh4s+/U64HgZoKSarAbEJpF/lOy4flKLM0xFdSyGQy6Ll1NyorKxXdG9TWM3kBztBz75HNZhGJRGRlrsCkhmGsCdBGwTV6BW/TNCXS6bT8bmlpkW051s5Tob6G1N94PC4reTyeAnJdhNuKleG6Cmyx2LqdKEdbOPs9qnq/sLAgG/B6vfD5fAW9L8fco8BTkMvlJJqbm2XbsL1nO6cGVMXU2Fn4JiZgEJmHiL11dbQMPPmpFnZXFY2Ldr1fYA1cwqCEiEWRIyE500KyuxuBww9yIenaWUCfqpZ75WX4J87BQ2mGEQjAqK3dwF3CtRDX62AR5vIyPNeWkOP2GftoN9gC2Pp4Cr6jxH6Lhid2Q5VN7AjgtkR1DURVJcoz5SHstJVMwEok5B9TCSDUzf8Bo7GRC03yCIRk7y9dtAkdASotEivk6tKA368NP/Jbz+YSmjfiNNHRyhe0pnRpCubMtBIQYgEypFpXr+YLFBgtIgkm4hWtCHVXqP7JcTdRanwYuelpeO88yL+Ca+HLWWy6iCKBgmrnsBXLu23t2wgG8/k82nJzGi2tBRW3y9wdEnV5ATEWEJYC2tvxf5mHtqJj0hN+L1WR0/Ee6sN/bUYoBLE2BXIXjBEek5lPPoVUby88wpBrSmzTRHCYMi0b/q4uPWtcuWIOREF2nYuLi7bS63DBRcm1yMiuuKGhQcYZx+oNJy6/x19MpoXMbTUVXTXyUeYuCMdcMBqVsWnTCFgOqQK3UUtuXRMgw7HXIQpToRFKHlcFZ+YitAJoGgzHM2xZg7V2OKEgtKetUScfUccy/UTEa4HjQoi/T52ZxeDQODJ5v7NVBZZqGCdfvAtH7+9QGWEUO5I5IkLQDqXf/PgXHnl+DOErK1qpcoTY5E3BCnz4aj/6DjTr5KUPpY6IdcfyuT+X8fr7FzD6+TTSWQvlmN8r8Oh9e/HS4wfQ1FClk298LNdEhOC6mLCQD76YwanTs5gKLxWrhu699bi3dxeeeKgLrTuq9awwyr2YaCJ4TQwTjrvzkqtZfPvT34gnMkhnTEl2c1sdamt8xZrixT183ZdV53I6am3Nov/6clpEiLqe3024Hdt0Pf8HBb2Djm/2tAUAAAAASUVORK5CYII=", SJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbCSURBVHgBrVdpcBRVEP5mrxybY3OQAInkgHAVmBApoQKGCFpAoSnR+ActEhIsKAHBH6ilZXEqUP4AfugPRRJQsPxFhFIEBQwVsUhJEqAsIOcEyEVCdnNs2HPGfm9mksmyCaD0Vu9Mv6P7637d770R8Jgky7KNHq8RLyLOIk4ltqndDmKRuJa4grhcEAQHngaR4VTi/cR2+cmolM19lH5hDMPMu23EWwL7JKcT/sZG+NvaIJjNEMLCYM7OhhAaGkzVdorGDjwJqV43693x2+3ywK6dcteCHLkzxCx3hgYwtXXNyZT7d++SfWJzYDSaR4uGEMQ4W98TUNYYksOBgd074SothdFqhTEpCYaEBCAiQvGefpLXA9lu5+xrbYXUdQ+hxWth/eBDGFNSNNUi8YsUDXFUACrKC5pxz6U/0bf6bQguN0yzZ8Nos42KXNY95cFBeG/coEECIkvLYMlZMCqIQADNmnHX8WPof6cEpvR0mKZkkC7yVZaVpzJY54bA5nJtNIK/s15ffT1oORDx9SGErXpLD2KOViWCzvh+qAnnrqxE/9KXYJyUAnNaGh+kNy5bwyEMOCFH2+A2mRHa0wUYjYBfUiLAfvQi03hffR287e2wnT0Hc06OZu4A6Xp/CIAaeuY9pJYWOJa+DHS0w5L9nGKcuD9zLoztbXAkT8O3njlY7KrBr4vy8EAyYEV1NU5bMvFezynE9rfBFRWL2IZ/OBjJ54O3phpy4njE/F0Nw/AyprGlMKjCNq3VuW8P0CLCwBLM5eKMqEhsfXY5Sgq2ooYCt+TWKTS7TLD0liPadRql5nHobbmJTxLfxMaCjfgy7wWab4LB7YKBABislLCtd+GkZNYRj7ZBrfcizXv3d0fBUBkMBghuN1cy6PLjjjUZPR4BP8TPR5/biCh7F6rl+aiTpyNc6MLMWecw1XENM+92o8GWiwEYefIyHUafl+v0lJXyqlKpkNk2QdleFe9FEXJRMfwGCrrJBCk2jsffSn/5UV5cl+PQPcGFMxPzgClpSM9IhNfnh+l2O26IKfBPi0Vm518odV6HMS8XkqxUhUTlKXncJMtwXruGyNxcZo5v7QLbMrUIdHZ28gxm3jM2UmIxZtTc3ovzdT1YmmTBM1bDUNmxCtAqor7Pj6puH5bMSMD42HClGoj9fj8kSeJPlsiJiYna7DIWgSw1EfkAZlADoLWzSWlw4t3D23hk/EeO8j5jyRoqGTf83x/n8iySZ5Hs2bOXAA4D4NWjsgZG1Z/FAKSyN6/XO2KgxkMgGFdeBEJClJpnzl+s4ABGyp4RhocDNazTR4lpsVhYcypbAj7bRdnuoATRR0APgmWx+eRPVOsUxu77yqYTF6/03e/miy3HU84YTfDm50NOSh4Cz5h5rS1DdHQ0wugAY2TSEAaGSkOtJ2nTZqC3F+bJqVz2NooAnYDmpPHDMilnZaz3PFD3iMiwc55lJFuCnp6ehyIwNJAiYLp0ifZXquuqywro5+fRbkcle1knU474aMfTIqA5p49ATEyMtgQOFgGRJwNNDPQ4kEybNvAc8LZ2cNmcPIGtHbzd9hGy70rNmHrMtMmpJDIAVxkAZpyBYCiDErXLz0yikIdAuHNbaSKZ75YBMquU0YhFWOdoLRv5B3Ehk643OfHj2UalRPjBMxwR2wM7Pqq5+lg58MW+3+Cwdg3N5WcjT0YJbyxJx+L4oa4KBqCcmJ2EtpmT43HszHnaeiVlgwk49ZfnNiJzejzGIvFcFfae7aW3Xl0rAyDx59bCufrh5Qb1XD7CpHExYSh6NQPqtQLD1wyF1n1ehf5VhfA1iZzN2Zk8Gpo8uLIArx/qDIA0rGdN/jSkTozQOsqYbe00PKC17lg3FxPHhQfa5nRzwIy8qBI0XWmAHBXNNyGWdOz9ZkM3ltqK0XTP/fBE0pUyIQIfF2fpW/lFVX8hYSA2s/fK2g4sXv8Lv90ADy8Fo4WTQzGvoZI2n3hUR6ajQvSr4wMs8z0A+P2rZcjNnqB1HCTvtwQCYKcTq59UJh/9uR5rd1XqlI5dokHdVmcd+nQBVq/I0DpEBLuSqSBSobuUVlS3Y+3OSogdTt2oxwGiGJ8YH4Zju/OwMCtRb3z0S6kKYsS1vKV9AJ8dvorSk3VqZTyawkOMKHolAzvWZ8MWadEbX0nGa/EodwIjoQH5pvwWTlxoQd3tvmDTkD0tDstykrChYAYS4sL0XSKCfBOMCkAFwXJiO9TE1JPT5UPtrfvoH/TC45WQnGDF1EnRiAgPugMehPJ59t8+VtXPtDL5ycj+vz9OgwDRPs/ziDPxlD7P/wWKNLexikPPIAAAAABJRU5ErkJggg==", kJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX/SURBVHgBrVdpbFVFFP7mvq1L2rSlFNoKPKSFtom0BCUG1CKCQVACYYkEw1IRAlHBRBFCTEuQxBiTUiK4RGzhH6iFALL80FIU+KMB1IBUSF8LbQUs7z37ePu91zNzl3e70E1Oc3rnzdyZ7ztnzjlzh2GQoqpqBj0WkpaTlpG6STP0YR+ph/QyaSPpUcaYD49CCNhNWk3qVYcmtXzuQOuzfoC5dZWkm3uO+QNRXPf40HY3gGSXHWmpDkwpykZKkqOvparIGzswFAI68wZobhbS6Q9h36E/cKThJn6/cb/HVFX8nzQuA0tnF2DVgiK489KtS3pInycingEJEDjf3yMGuK8rgm17LuLAievITHMhf1QqRmWlIDXFCaddEnNicQX3/WF46d22OwHc9YawdmExtlZMxbjctH5JsP4sb/y1Hcu3niH7GJ4oHCEI8DbTbWbMmNdtFQRDMVxr9orxgztfwPTS3IeS6Emg2QA/eOJPvL6jAQVjMlA4NoMWYzooM0E5FZOI1iGeoo+eTa0+NLf5sb9yFlbMm2glMcXIEmYBr4YecKcutGLBppMYn58uFJB0uizB2zBbQzfJCN+YLlHQ1OLF3c4QfvhiAZ6ePNqA200E3jEJ6K5vFlNaWtBZsQbRtzfDOX06mMQgMUlYbljPZ7Ee4aOqJrzmBVKFq6wgHAmLufl5uZAkyZgynm+F8avS6H2waydsF35G6trVcO2phuPePdhsUnelRSROzKKJMa3N++z0tFOgOh12MoLS1++3chbeZnq+ew3rvUWFsFHblp4O22NjICW5oCxaArmiAnD0mee9xPQG94CiIBaLQZZl0c7NNb3AY2A8by00JgZrqsVuc2WBAKRgEIxY2+v2w7VsMWwnv8dQhbteEh7TtjFA6+oiSjvHKjd64mdOJwiQ9crEiWDhsKYeDxzbt8G1YjnYzRvCuodpfyQikYh1qJxvwSVqlKlkqW/0SM39pMrGN8GSk+H8bB+QnNRr0X9mvoS9Y1/GbUeWSASBaxQIaO1wWKYiJWukVIWemh76eB6SnBwFl+3Q816+cgUgq9UxZDknsGQpASdDuXhB2/tQENLVqyaB7NNHsU06gZqcF7E3ew6CzK7jMop+BdGYgris6oyM1FQEEU97F4rc4iB1S/peQPH7RPGQV69B7Nt6KEVFUN1uROqPIs69cesWpcgDIhLippGG4AwF8F5LPc79th2L75xHOCojGI6Tyjq47gqwbm1P+79mHJhJCR50bbfhWv8G7N8cNvPedvwYnK8uBevo0KygaEY8nniSxlVGIe2iLi33+5ZE3bDbE7Dcbz7BZMIEs1MpLCSLWwUBpbikZ7E3JSw58EnOPHyaMwddzIXBSla6+a6PE/CQlkkFhaKHx4B04y84Kdp5Gsa2bIVSUtJt/7m0L16Jz3PnotWZhbkDIRoZQjGgUi2YXDDCGPHwLKijxir+KzC1DIyAzFQ05qelgXV1ibY84xnEK6ugTC7FYMUoSFx5KmZlZRlDdRznrPHLPv+VxCRYMorAVcqQaO1BRL87MmRwa2V0ubptVaNRivlBlKG0tyFYNAm2WDQRu6mpiG/YCJkyQU1JwVDFIGB4gFtvs9mM4UxJP5cP8F9SXj4cK1ealsfXVCBy9ifE390yLPCekkx1xQJex7F7Hccq1YPO5a8hun4j1GnTtOOeMQxLeP3hf2S502FD9ojMXsex9YNkNz028fa5Sx2YveEUTTVeHiYBvQI6HQyNX87HkyUjjYEaAhfHsWR5uwpaSuK5Kbn46oNnzW+cRDgOEZzE5ZBQW1luBffoWEL6/Sht+KUd6z48D8/fDyxvDcYbGvjYUSk4/NEsTC3OtoI//KNUJ9Hts7ylI4BdX19B7bGmQcdCeqod6xZNwvurSpGR5rSCLyLwyxjInL4uJpxI7fEm1P/Ygmsef5/AM0pzMOupPLy1rBiZ6d3y3YPBXkwsJHh9qIIemFYJR2Rcauqk7/84ZEVFfk4KHs9PE9e0PqQG2vVseJdV/XJapw5NvP/7ctoHEeN6PpOU12I3HsH1/D9yjxu0VS38JQAAAABJRU5ErkJggg==", NJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUXSURBVHgBrVdbaJtlGH7+HJp2adImji49bEsPKlh0EZWJB2LBA3QX1lvx2ithXnknQ+9lFRFvhE0EQRxMhgwU0RUZEydaRS/UlWbVHkwPSdskbXP69r5f/jf98idp0rEX3uT7///73ud5D9/JQpuilOqlvynSOGmMNEraa39OkyZIZ0lnSL+0LCuNeyEEHCU9T5pSh5MLPBZ3K+yxDVwnpVJJ7ezsqEwmo7LZrG7zuyZyzo5eQ7GagEfp73tUwqylXC5ja2sLuVwOhUKhMtiypL/+93g86OzsRE9Pj24bkiCdoP6JlgTIGOf3soAzcDqdBnkLl8sFr9er/1lNAtyPtVgsgqIBv9/vJMLgr9CY2aYEnJ7v7e1hdXVVA3V0dMDtdtd43oB8NVr5fF63Q6EQurq6mkbCSWBewNnjVCqlPWZlUNHqYEcKpC3KqWIi4XAY3d3dJolHZZa4jIHnBZyKqg5cQi7tVs/8L+M3Njawu7srUIxxriYCdujZe53DZDKpPeCCcoKbnjdLgURA10U2ifztG1An4ugfimpbtgxzKuSpyogrnQdyvp3gzhQ4xSRobf8L99+X4Z7/Bq7RlwC3TxezIW/qvvYcTYn3KysrGpSrVyq+FXANicwisPgjsPILSiOTKPef1rXAM4M1EonIzGA2w9yaksG0qNTlsw4g8S2s1C1quKGCx4GOABXNGqz0PKzFGxT/MlRoDKWn3yavO9lDbU/Swhg8PVFZxqeYQFyM87QzCSh7MIvk18osAXNXK21+ZXDkR3XyBZQff6Py3R4nqeQ2F6NNgCXOBGICwCng3AsJee++/i4VxwLQ9wis5ZuUqz3buhCw9tuFTJUQ15IQEOU08HvbfowJRLnFeXIWm/v6O2STrN7+jsJJXSnMqiYhjhDwMxWdFRhEefy1ujVDlB3lhY2xPXYuaphWpSMI669LtjsFtgK9dNR5T/mNvQ419BR5kqVxfjQSMwq29FYXameo9LvxV8mjr4H8tnSinxKqYdAkKLdDz6I88iLgjzQEddo2nWQCac2kdveqdOrup4I6C+ufK7BWf9//SEAq8hiN7oQanYQ6+hAOEiEhYixGaUZNkMZk4XHK0sDD6B87o6eZ6jkB10/voXz/y0D4waaABVVAajeJvq7Bht/NHZKp/CYsnVFg+XntGmaWryAfHNBzv3z6rQPBt/MpfD73YdPvMstsmeXWNXny+XzVjrJwDByJYiO/hkuJj2vC2EiSO//hs7kPcNR3DB6Xt8aOCO8vhszIUswbER/BsL6+XrcH/Jm6iUxxEwuZOZzsHsPgkREM+oe1hVwxiyx9+2rhU5oPLhz3j+LJvufh9wZrCMiBhbdmOVeQhDy8L1OHT+jhLIPx4cHYOrWMh55ASZU0ABv74f+ruM/Xh2eOTeKL+Y8Q9IbwQPCUJhUNNE8Pe2+AX2Tsuu2YAfgswNJsB1zKJbCcW8CtrT8Qj5xBwBsmjwN1gObhhG0Eg0GTwDBvx5bReZqjwG1eqTY3Nw+9EzrB5Z9DHwgEZPVjeZ9sVrZjYwDXwq8wzoO8c7VzEDkInJUPqEaBJ9DoSGa/mLA76AHM2lxEWs0Cs+LNsDvAJyzj1tTWsZzPiHLKbRUFAeZwc9EZcz6BVsdyw0gUDS4mnBY53ZhkxGsuMLmcGMCm5wm0K/bVbLrRXYvIKCKilSKjqGj1uyYyfdDVrB0iUdKL6nDCF9kLqo3LadvzS+1fz58jPYV7dD2/A19+feYHkzrMAAAAAElFTkSuQmCC", IJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATCSURBVHgBrVddaFxFFP7uZrNJNn+bhFbTELOtifpkEvsqxqL4IBLjQxXxQbBSBB/qi9Kq0GIRwT6UIlZL0aT+hVahij+IQm0kiIUUYyMWUcjGJqkmaXaT3b337t7dnc6ZndnM/tzNJukHh5nde8983zlz5ucaqBCMsQBvhrgNcOvjFuQWkI8j3ELcJrmNcfvSMIwIbgU4cZDbcW5htjEMky82C4pYEhchnU4zy7JYLBZj8Xhc9Ok/Fxwux2O4kAd58xOyaRZIpVLghDBNE47jZJ0Ng97N+Xm9Xvj9fjQ2Noq+hhC3Pfz90LoC+IA0v+cVeSaTQTgcBo8UHo8H1dXVoiUjAdIHPAOiJXHkU19fj+bmZl1IqJQIo1zktm1jaWlJEPl8PlRVVeUiLwWVDRKQTCZFv6WlBXV1da4iCgVMK3JK9/LysiCmqIlUWV4EBdNAfWWUDRLS2tqKhoYGXUS/WiUezfG4IudFVUSuUq76+jToz3QjXzIai7IpQRyH8zIgU0/RY+Z6FAsLi+jYVouampoiAhW1W/r1lqaCLJFIiP/a29vFWBI7aSrUr5yio6cn8OSr4zg/Nu8aXSmUekdlSdXOysqK7vKS8JM7XFhF3z34GY2GpvoaPDfYg32Du7Bjm9+VuBQKs0C1QKuE+loWqAZ2Um9IOb4zOiXIqTRidhpf/TyHfW9O4OvxeWwWes1Qn4pbQmztJGBA/fPt+AxEWfAXuVgsRRKYW7Lw2vtTOHTyCuYWrbwqd7NyIrRiJAyQANp4EDMd/DMbzQqQFrVSiKwmYSfS+OLCNTz9+i8Y/eFfVAolSK8N2lFpKiT6SECQepevLuail7JFE7dTWI07sJNphK6bOPjuFbx47DJmF8x1yUstTUNkNycgSALEkRqzHM3dyGudVAZxng0SYyVTIhuPvzyOT7+fqXgasjFlBThylyTu3EZNU+ByNuVFxYtZwJz9D7cfOIa6yG9YDxQvSUrLvveb74CHHhbPSAAth0BwR5PkN9bTgWciv+Lt2VEE0uWnQcGQAnJ5XduWIyQgxK3vnmBg3YFaMyY+CJ3GI9E/sBVU3bdbdcVO+Dv1mht8uLe71dVp7+oEpv48tHXy3l4Y/HyQmCQBF9WvR++/AyJZWg11OGF8ODuMkelTFadcB8PacNR69z6lPx5TWzEdRIH/b5joHjrHlxwTy/CJ1Um8NX8WnYkb2CyUACq+DB/Tf/UveLqC6nGLR57LZ+jXbW1+PPtYD7Znojg78x4+nj65JfJCeJ/fr5OPEHfRcRyJJhHb3Y+2a3/nLguVH0P5YLp1daH2xwvwdHaqx2vHsbwinaB+oNGH9uFTYHTTweah+zJedDWfjOrkJ4ouqPIaPq3u0s5HZ5hZ52NWbTWzpSU2YPQ++cab6pnz+Tn9mj4t666E6uxHSE5Eauwis+7u2ZAIWyO37rqTpS9dKiQPomzq+LVcF5EJhVjihf3MlIPaLmLyiLe3seTBV1gmHC4k70NF81eQCSUkefQNZvf3ZklKmL3nAebwdzLhZVYA18iNMiJono5wO1D0jF8q2OQkGP9KQjoFT0cHr+ldMNbu/zqouI9s+mNVZmOEbQyU+2FWwcdpxUucrX2eP8itF7fo8/wmkkXYa8nCyggAAAAASUVORK5CYII=", TJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAasSURBVHgBrVcJbBRVGP7e7G5ZeuzR1FoparmpaGiFGIRIq9FoYlQUj5iCeKFBBPGI8YrEqKlRI5SqQRRBRECDXFITlYTLUIQEiuU+2i1Y7pbt0O3uzvX838zO7hTY0hL+5J/3Zua9+b7/f///v3kM3RTOeYCacaRlpCWkRaSBxOswaYi0jnQj6SrGWBhXQwi4iHQW6TneM1kg5uJKRVicAL5IOhSd7zsR4+sPtPPNhyN8e1OUR1U9HZGZXeGwNOBF1KyH5WZT5JiBBVtlbD7SgZ3/qY7pPDlvQJ4b9w7NxBMjctA34HZ+MkR6Jy1L6LIECFys70obXAB/uTGMZTva4fVIKPB5kJctITNDgsdlTSfj0RbVSTlOyipaIgYeK83Cy2P9TiKhS5FgXVle1xzHtF/OIKozFF+bAV9vVzre9hfMa1QxcOiMAon6lQ8EMbp/77QkLiTQaIOv3R3BG6taURjwoF+exxrKGJjZirH2bPGEJ/G5eeHmTeNZFaFWBZ8+mIvxJdlOEqV2lkgO8Fk2+PGWJhO8wO9BHyKgkAfihmS1plLfvBetdW8+p74YYz1jGJin4PURi3A7L4B2cpMNJTBmdvJAwvXCemjKMXQ0jIWitiIj61bUh0di0cGXEFZzTQ/Y09hFjufJu0xXBPcUrsV9hb/Ce1RGvLIOxoE8BHfVQwrYpQP9xFLYEZJkFD1VSSxCFHB+LG2oQM2xRwmXJcBZkjXv1BGNRar8unWYNGguslpaoc/JgL6d3jTkgLWdQuS9d5Hz5Vc21AyhLFHhzoknhhJC+EAxMlwxrDs5EfMaqujDkkUgsfbp5Pb8TagYOB9F2mEYqyXoqygyDPomvdObQtAjEegeDwJHGuG6Jl9METHQT8TAOPsj8tnl2HpmDFqUazG2YA2ll0brCVpX0JpyxLVEX0tpsX87Zo2qwLuDZuDGFXugP63CWBoH64iBxUjjpIqVEZKqIlY9x4YzS7tYgjL7yee1w7Bs/wQUZjdjzphnMSB7C/a03QmkoiVp8bBgPSYPmY3S3v+Ar3bBWELx3846O4qGs/Z2ExheevoQjXl4Fb34yB5RJpZgJ3VKNLJwSOUJcjfluuSiVkJ//yGciA2F153yfd+sJky9aRbu6rMGxh9uGNVu8FYd6BwdZp9HO8A7OsAeIPunaGjyX495e1/Be49MQyDTrCl1wgNForfnpJrI8ZQ2yEPMbwpyuV4ZLxRXYeLAb2DUStCmE3BDnGbGrfE8BWwuvnD7SA3S2zrkGzMxd+9r+GnbM4ipblQQ4VKLQJE7sRY4H+dJ4KS91PF52jBp8Fw8PfhrZNe1Q3uKgHeQRVxJpSXnKRKkrESHa4aB9pIc/HDwRSysmQJZySFeRIzpaAoTgb5WHCQLtWbYpc1Sn0fGhMHf4bkh1cjedx7682T1NhFKRkIvFka7iGu6hvaRPiw+NBnz106DrPotj8AmyZCVkVpSQUCkQ+CGoMWFMY5H+y/Bm8Pfh/9UGPo0D7SNLnQpfQj4NQPS/TpWhipQWfMhwkqukxqcAezrlSzAYYEaIi0p9LswKn8z3hkxE4OxD/wLF7QfPY61vYT4CPhlqhRPatjaWo7KPz/GvvAwXE6GFaR2SNHbJQj0okifP7oaxrcHoS2lLJAdm8ylgCfqYE9xbIuNQfXf72Db6dHojtwQdCE75QEzCzaQTjJvV94N45va1A6FC4of/Q9IT5Krp2poZIPwwY7PUHuq7DKQHE73lw/s5Xy50S7FYiMK8HPnEBk6CJIsmySYg4D0EIFPV3E6WIiq3W9heWMFuic8mR3c0LFhai76+pMxFZQS+/IPprXBIDzPTe40nY2iSK3R0fGhF5+c/hh3/FbfA3A4NiuO8cO9TvCFAvui7Zi3hRG7bSRY/lG4Z+iI3EK5fGgK5fMUK6V6JCnrC30Miyt8TgLmdpwq25zPpuYV0TfO1EJtuxvzDkzFQlJZC6DnwhPWk+1UB75/PAdj+2fYL6sIXGzHcBIQKGJfKBL3q3fH8ebvERjcuRWzHoML6z+5Pwvjb0kGXwiOX7Iuf0p3Nqt4dU0EzTLvAYkUeF4mQ9W4bNx2ffo/48v+lh+XDXy9JYqfd8WRzIsuf4o5RE155GYP3ijLhM/LnOAPE3idc0q3DybNbQZW1MdRs1/BkRbjgulWqBfnu1A+wI0JpV7k5zirSfqDSVpJHM1mX+qsFVUNvv2YyjccUfhfBxX+73GVn48Z6Y5msxPxdWXCrcPpQt4zEQfZBbwbh9PuhrXzeF5OOhxX6Xj+P60hyoAS/rQ0AAAAAElFTkSuQmCC", DJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAT/SURBVHgBtVddaBxVFP7mzmyahGIWIjVtbRp9Kn1p1AdbG0ijYkuhbYKgtT7EWPsj1BDQvklbXwRBaiIKBZHEFy0oJtVCQCNtag3aVvCl70ssxqIxG7tJZmdn5nrOnXsns5tsmp/1wLc7c++d833n3H8LyzQpZZr+2gmthGZCEyGtq7OEDOE3wihhyLKsLCphRNxE+IAwJVdm/fwtVmscsSZeYEEQSNd1pTt6Vea//04Wxn6SYS5XTsjZpXisMuRN9HcFUZqVhWGIXC6Hubk5+L6vymr3PQvr7l1I3UY88iicvftQ89pxiMbGpMsMoY26JXNfAUTO/TtoyOX0NHI/XsO9x5+AEAKO48C2bdV23XvvwqJ6WSgAU1MIp7MI/5hA+PdfSL30MmrePJ0UkllMhFgk8pjcv3UD/7buhj80iOrqaoVUKqWEsAjhFSDyediUHbuuDk7jVqR27kTV088guDaKXMdBFEZGjHuV1dJxIUoSEKfd++pL5A4egE2kVdu2RYREbECRkIA8hEvIe/pfQ9hIbd8OkXIwc+QFeBc/LxWRXiCAB5whL9y6idlTr8PZtAnO5ochKMVMmIQS4nmRiLwbPXM2jBDXpW+3kI/NmOs+BX/selLE2SIBOi09/BzeuQP3xDHYlGqnoUE5s/ygOHL9bxGpxfUKbtTWM5nwlDBn40aVvdlXu9R40tZjusJkIFbk9p0Hfh9XAoR2LvziDBiLySlahXyEOCv6W7F+Pax/JuGeO4OEqYCF7o9XVPTj4/AvfqFUCR1hlAE/Ji7qCs4AE3tR5Fbei5AoE3kSUPDB88ansRDQtNXWydzM1W5KvG8vRapZwOysgoqQp9n8WIkBIgPVwzXQWWByV2fHo0wUPDXfRRCg8MkF40ot7czVakqCwa8jcmouaGpx2tgJEgKKjIiUAAU3ghYTd83kJHWDr3yyiGB4OOmh1UG0saiI3O4e2HqwqX9Oc1UVsGHD4vxvn+EPTW4Qr2tcRt/Smq0WKfYdMOg9oMBqWJDD1Gi2eJPhdBSoYTabVSPWzPnSQbcaM93FS7kSQEin02pBI8tyxtOmYSUIlzLjn0VoSycXogVTrRJiSn2VBskC1MHBifpkwYeVsFIR3L3assyaITSrnW70SjwIecwqtVQZ1tcj3NG8wLF98xdY93JY2qj/JUfK44CyHNDG1dFhKjM8CAfooZPfvEMHYP08pqfi/F7t79+P/EcXFriu3f0krIkJ3M9CRHOEe15ubcK6G7+aqgHmuWreREtLQjfig8ZarNSHeG5v8nWUBQzBjIPjJyEfqKsIcTkhzomTyeIhoU+vn6lXOlSIzi78XyYOH4G1JT4hDTC3GY69ptR5oxugRqYL1pKNIh/k037rdLL6HSWKf/Q5rU8VUxbsT/sh6SS0FpMlz+L988no+8zZMHkkO4doSsKiKSc+/BghLZcqAhktVKsREfIBhnyJPW2mOKO5UCRAj4U23QDiUDvsy8NxdyiHyxCRTLt8qAH24DcQLx5Okrclb01Fh1Kdlg4jwmp+DOLSZVgdzxedA2KUI66pBbqOwr4+BmvXU0nyjtJj+YouJrxj8qWEn9lqW3bB+jOxENHdAW1tsI4eg1X/YNJlBmUuJmVNX816F7trkQBJQqSkq1n4w4gMb9+Wcmam3NWsN3kMX7HJ6HI6IFdmfJHtl8u4nC57y5Pz1/M9hB2o0PX8P9w5VOv96QXqAAAAAElFTkSuQmCC", HJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXnSURBVHgBrVdbbBRVGP5mdna3pdtuW1oXCsgikICILRdvqCnG+IBixKiJkRjjE08GvAceBKPyYKqEEIyiQrFJwYigBgwoiVSDCHIVBOQiC724ldput937zBz/c2Zmd6bdXuHPfjln9syc77+d/5wjYZjCGCulZgmhllBDCBJKzeEIIUQ4SWgifCNJUgQ3Q4g4SFhH6GIjky38W4xWuMUmcT+JpTV27t8U+yUUZ4ebk+x0OMUSGW0gRVYPxiMNQB6k5icYbhYSTWn49mwcB68mcLlL6/chI0wscWHBrR48PtOHcT7FPhwiPERhCQ2pAJHz+O6yyHvTOj4/GsW+iwn4vC5UFCkoL5RRQPMrsiy+URlDT0onMHTEVHQlNCyaXojnahyKhPIpIQ1m+R/hNN490Amdybit3INirywspUmQV0gRPp5SdVztygi/vP6AH9XjvQMq0VeBKxb5Dxfj+OBgFFUlbkz0K5xVvC7IOVgfM8QzE6B5hDIt3SpaoxmhxCPTCu1KzLFWiWwjX2eRH2tLoo7IA0QeKHYjQx7I6LJo06IvUd8GelZFn8bN9zgCxQoqfW4ypBun29MWFedY7fCA6XpuPVRVxblr17HzsoxurQCSiDO3WjacQH1m+MLhP2618Wh6wGw1TceFjjTKvAybllTA58naPIWHwnrKahSNRlHu1bFsNsNT03QUuSXTIhiWc2sJlJtIa/w/q+X/GVBNr3Dw/BnjcaEjCWw93gubrBDmmBWuy7I+HA7D5XIJuN1u4YHf2l3Yf82FmCo5424Y7Ohb6WDlAaAjHFVBdQJeWUPjM1kv8ByYwntLrDl7e3shE6EFnnB8wgXjdLxUreKugG5YbFot0KdPq1G8Y8HyiEQhTGkyvv4zbtGJ0s4VqLX+SaVSOWKCiCt5hQuP4dNTVayan8GMMlLEJM2YYbA/20PSTbmn8VyXjDw62pq2h6GWK1BjJZGmaYLYUkJubYV7y2b7B6goYFg2S8XzM1T43cxhvcM71MYocRK8HEiGB/icFzp1JKlOmFLDFQjyXiaTcVjPoRw5DM/u78ysdso9FI537svgsaAKReKKGKAtgVzNEEszJDWjdhirKIe2aFaBIE9CMXsymUQkEoGb2qI3XoWruRmujuuQaVVoU6eCFZcg9eZKqPPm91OmIyFh598uNLVlRN451TWXpU6trhF0vPWgH/dPNgpTtlCLePO4+3yIf/wpit5eDff2RjEmkXfi69ZDnzAR+YS5WhFz10H1/Yj8L9BPh1GqKTyeggZ6WJhVgC+HUkVRHDVemz0b2E7flJRAD4zLS66yDHa1fIbvww2Iqz0YVKz1SW2Ru9j6N8JzICQ0URzbJ5SmJsQaGtG7ey+Y3w+pJ+oYP/TfPqw4sRg7Wj4amryPTPPPsrohngP11HmBP3V20s5HMeLJqFCfVVbmDCAFeB6c7zmBL69twNno7xi2ZGsSw2TfDGxamA1VPTf7gKWAx+MRychFGzuWl8lsWLoLVOy4shb7wtswKjEzs7Zqsf3fJqsU842olFvPvWBfjlx2tn6CPf98QaV4ZK62k/MkZOSBhocPITAmm09lCt+XSYmt9LCcE3u9XqTTaUF+KvIrNl95D+2pZoxaLPeTPDp5qZ28nnP32475cjzTdoyI1+Jcz9EBTo0jVyBQMAF1936FW3IK5LZj84i03uxDKtRxPnoc5rZ+w+S0tWFlzUY7+XrrWCbbXl8Dc0neUX43XrmzjpJQyp20RkmuSApeq/4QM8vnWiMhk0vIoIfSM51H8P6pl9GeaEa2Rg0VEmbNBVQWVGHVnI24vWyenXzgQ6mphONY3p5oQeOlDdjbvA2Ow7A0MHmhqxiLJj2LpdOXo0gpsZM/SeQnMcQ0eS8mXJH9LTvwc3gPQj1/5b2YzCybi/kVtXgi+CKK3aX24RCGezGxKcFnWENY3ncsradwqfsMbbsJOmyodEaowvjCSfC6CvNNxZN7zagvq+bltJ6NTLqGezkd9ipnuev5QkI1btL1/H/q+Ky6qIO4MwAAAABJRU5ErkJggg==", PJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAeOSURBVHgBrVcLcFTVGf7uvbvZR/aVB3nZwFqV0SiSohUVBSmtUHR42KnFoANqrCMjo3RsZdoqrbbOlGmFDNrSmTqEQa2WSqLQZFpiIRgpIoUNhVRHJSEkJCQh2exms3vv7r3H/9zHZgMbJ6h/5t9773n83/c/zsk5AiYpjLEAPZaRziOtJA2SBszuMGkHaYi0mbReEIQwvg4h4CDpJtIhdmmyjc/FlxXusQl8kWipEZaMtLK6ujrW0NDA+vr6mKqqExHZYEYvqwgTgAfpsQ9GmHUZjo/gTy07ERv4N34ybT+GRwRcvvCM3tfS0oJgMIjaY/9AVEtgzW33Ymp+SabJDtL5lJaOC7FsWcB5fusscA78u6Zt2H7oHbgdLiwO+uHInw+PLxdVVRF9TlFREVwuF1SB4a1QE7YS0aobvo/133vIIqI7RLaXE4nQhARMz9PgH54+iQdf24B4UsaNwWvhd3lR5lcg2sKQUgyyLI8ZstlQ4ivALd+ciZgSx4FTR9Hy52PYuHQdFlXcapGoI4xxkRAvCEA67LtC72Lx1seRY7fjhmkVcOQ4kEgpSDEFkqBQ7mQkEgnE43GIoggySn0aZDUJSZRQUXoFbJINK7Y/jdePNFr2rUgELiLAC84CP9r5fzz65m9QFihCeV4J5FSSVIGsJZHSOHgiTYBHQdM0nYTKVCJgjOPPcgr/ZYFirNn5AlpOHcsksWEcATP0T/L37nAfVr/+LDQqzxJ/oe6RTKD8qZAmybAIIkGR4OCcBPfeiIBqjE8Z4xM0tpRsSBSJB3b8Uq8nU560lqgVgTSjTftfRWf4HFx2h2FMVcwnN0gEyDstTGSaGR5mXjwq+GFrOgitdwApVdXTpGgGCU6Yk/I43BiKR/GLPVuQIbrDgpmPIf7ROdSL2X94AHFVhteZq4ef0R/3jotHYVh5PI47PjaKr7XYBo1c+FZPSv8+XpGPP17LMJzDxzMzt8DpwbOIyVQrlLgTT+/UUwtj97ycR2CZRWnPiQM6OCFilCp/NJlIey4lFDz/9gBKukZxNKCCJWgcqTQq6+8hakPPAJ6r74cvKutzeDR4GpJaSrepEZutB9+y4PStnS/DeVZL+FwDfjDNzClR8zh6qfq9fC5m7EqhqF/Gp+U2OBVAU5LwJa+Gb6QPTO4lIA1TRhgKwyqeek9F02o7Ly4oyVGMeGJgGoNG38mhvYT0mAU5j6eAl2clbbCIfRikpUOFQeCSaJAQRNpg+t3ofMiNmF1ArmKEVirWsGPOdcDA7bizdQ8KI916+3mniIK4hrIaGY4rogQcJyXCRIA46uqqPArRXsiHh2zW0osOnER3b4oqlggInISgey4IUYjvifivz4HGa5xY1xKDi6I90p2DcOJWtPoOY0aOH/mJdsTI2gu3eFH9QQzCv6IQlkR5EHTVMkhMv7odMAgEbWYucOR//ViwtAfZZL0bWGUXcdXZGJwpAYyIjfqmoFy+Eq8pr+CQM44KOQl3Ati4K44oRX/39jieePlsVnu1tW1Yterbeh2kNyKr0rMJ7xmlys6VeQzJ/RQtrUgvXHIKVzpmYHdBUm/jfTGKoCPJIGFie36/P/3OI8CXQ2Du3Lloa2ujFEjprdUiJb7zLk5seQk1izzY2BCBhwAcKcrxZzvRf1M/+oQcGhXHKIH//jY3Fn8kY9HKJ/DZyqX6fKozfbe0tLS01MIPZxQhw+DgYJqARYKLNhzFuRkLMWBneoFxaS85D9sUNzbdmYuuLg1/e9OwGKVC9RLB4kN1kKaWXUSAzg3Iy8vT7cMswlZOgIPtON6I1p5P0t5npuW62QW46/0+fFJow1mviMpuLyQyuKEtgt1dLhy+zImIQ8B3Tyn4z8wCHDj+V9qZzO2ICDBTy33FeO7uNZZZncB+0lX8K0FbaH1bs3lMEcYdV/55PZFos2GYQLwJDX4lBx/Qf0oOcn93EkdKGUojGnp8Ep69WcDwyX1jk5n5Q8Grnr0ssxyaeRzqzTrAY3N+CL/Dg2wyQmlefV8ehsskzDK3XlVMb7i4kdrU4gCqf0RjnFkK0By4du6KzNZ60Ty9budffqcH1TcvG2N8gcTI4aZ7bAj+PQbv40mc6RhAV+d5aD97BMWH30bzU3eh352t+g1b981aiKmB9FGtlmNby3Cz1br29hVjgxiyir1Ug/NuBc/EuvDz2BkoS74D6Rsl2QebNrjN9QsezOz5Nf/RCZhHpBorCjuqnofL5jRmT0Bi8mLYeHHJukzva6xjWeaR7FcwTq+4vuwq/OXeZ+CUcvCVSDBj7sv3rMeC6bOt1g4TC+MImLUw3xyAxdfMQeOPXzJZXyIJZoAXefKxp7oGVbMWZYLPz7w1jTuUmmFZbg5EZdl0ND6yRV86TpvdNJx2LMPRsXXOO9x0mnr4pqU4uHYb5gRnZoIvz3Y3uNgB4zrWnnm9OT3Uw7a0vMF++sb9TG2dys6/H2SWr6FQiEUiEfbivlfZb5teYeeigxfejtov+ZpmXs02Z71saQqLDx5je/fuZY2NjUxRFEbbLJtANn/R1Wyy0ahllyb8IrttMl4LmKSwsev5HaQ8sUF8DdfzzwEenJ/2NJt7pQAAAABJRU5ErkJggg==", VJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXXSURBVHgBtVdrbBRVFP5mdtutu1taeT/sKxIelWgJoCRECqTy+mFKVETRgM+YEIWkEgh/EEV/AMZCggrBUBJeahQEJEQwUEBoNZGmBoEgbamorZI+tt3uzuzMXM+9M3eZ7e6SFutJzs7snbn3+853zr1zr4I+GmMsly7l5KXkJeSF5LnO4w7yJvI68mryw4qidGAgjIALyT8ib2f9s928L+7VeMQOcJKZpsmi0SgLh8MsEomIe96WxtbfDUdJA15Il9OwZRbWHtLw6aFrOPZDMzYsH4uJBdkJfdRrV+FftxbeBQtx30uvQM3Pdz9uIp9NaWnqjaWmAC9xg3d266jYWosJz32Nz45eh8fjwbAhg+D3+xEIBOKeNXgwPMEAzM8PIjS1BOFVb8FqbpbDioBSpcSbIvJDEvxC/d9YvvEcDAN4rHgEcoKZQjMvkeBE3KZk+uDNLwDj3tMDo/oMus+dRVblNmQ+PtNNIkGJ3grEI9/3XQMWVpxC0J+JKcVDkeXzIhqzoMcYaIAEV1VVDKRqmu2qBxnFxVAzvOh5ehH0g/t7K5GbRIAXnAQ/W9eCFZtrkD8yiAeGB6ERaJScg0d1BqJggzouSEgCUYdENArvmDx4R41GZOWbMGouukmsTyDgSL+K3ze3dGPFllpkEvuRQ/wCXNdtcE24RR2QpAJvFMC6Q0DTyYnEqFGCZM9rL4N1dkrcVbIepAJxRpv3XkZzawQZXo8Daono+VVzSDAlefIojHQhQO42CX5PVyNGxRmE0tqKyAcb3V1EwKqTj+Uy+r2Ue/GAWGuGLbmmW+IaEVeLFEtWQOFtFLVwkl/RbTUULQY1ZohIzQP7YXW0SwLLODZvL5cte47fgMX4gCrCmoWeqEkqUOQGBzYFEa6EZTGetkS3KDVRWwEOrkQ1WwGdFInpgoASjUDf8YmEE0s7n4alsuWbc7d4aPxV8PHaOg1kBzNEfh2hZcGiraMF3//YQlNTw+RxRRjBOxC4fMd5E7RcUhoMUbi8fM1TJ4E16yRkKaWOXaKbEj7o/hO/wkNTiE8jroKqKlSMdqVLM0mNpsZ/YMbaMHlSES02NxFGM3zBEpSqrXAYikBofQbTdUHY5G6Z5BbuX7xEjlnHFSjkd7FYDHOnDhcLDHc5vZQUBXc0UI/Oqzp+Ov8V5vx5Hr9PGIucQj+MSU8mvStTZBGwRYS403dDEihUceeTmhbQbbdCrXivejvULB8i7EHsi81CxvDxePfkh7gd+uuufeX4nIBjufGlmDNMnNdISSbbF0C+mo05Db+g9eIVtHQqaJj6BG6H2+HzZKQE5Qq4x3SPywnwjUNu0tqeRokcXxBPtQaxYVA9ts2fRcAMB67vwCZlBrIDQ5EucjcJV011JBRh6MsvqAhVV/5Tf6+7f2ugXNbhxq0IYgWDUXThCowlq/HzsIdTErDrwJ6+lmnh2XnjJJk6TqCKbpbxf9r8MqiXLtnrOtJsFsh6jp0Ao4+N2y43dmHu2zVpejB7ZsDC+LwganfNlw+qOM4Z+c8zp8zdJT77B9LKZ+a5/1ZzAodh1wE8r74O5g/8L8C2CsDSeUXuxsOqs3vdw/8ptKtRl76AgTUpP+V5QRHyR/jlgyqOLcuxUrZ6V68BGz0mnoKBUoMDVzw/0d20gf8IAs4WaatozsmBZ+cuMFXFfzc7ej7UzrXT3NFvldsyN8o7sHevUKc9CnXbdljU896VkOAKPq6YgunF8TWiycFCAgGnFmZDknhmMTxHvgXy8uPgfSdhg48Zeh+Ob5mJJWUFbvDZ7lNTgs6OLIucF6GQEsqhI8CLy2gGu5VIsR9waRXwefBG+Vhc2FmG6Q8NcYMvSnU2SOZvH8caE843zTeZuWUTM0tnsO7aGhYKhVhXV5dwfn+x/g9WtvI0e3/PZdYW0nqfjhpZf49pztGsMtVZiz5czDAMRp9w4fxYxtvSWKV7G95vc9SoYv0zfpDd3ZeoFfTR2J3j+SzyRzBAx/N/AU0P82oNDBRIAAAAAElFTkSuQmCC", FJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAboSURBVHgBrVdpbFVFFP7mvr7SQjdqC7TaVamFIlIpaHDBxkjApYBGq0EFAQkaopBojAIp9ZcBoRRQK1YoASQiDbKLJliKETEsLY0iaxeWghRet9f2LfeOZ+bde7mv77WAMi9fZt6dmXO+OefMmRmGWyyc8xiqJhHGEkYQUgkxenczoY5QRdhP+IEx1ow7UUhxKqGI4OC3V9aKuTeTz3pRLFZXQJgb0NfaCvXMaaiXLoGFhUGJiIRt+HCwvn2DiVpE1ijE7RDQmf8Cn5ll0a5dg2tNKdy7dkL760+/yVyvlcGDYZ/0AsLyX4WSnGwVWUfIJSJ1NyVAyoV/txrKeUsLOgoL4PluE1h0DGyJCVDiBwB9+4GF2n1zPB7A4YDW0gztUiO0pquwvzEN4XPnQbknqVcSrLeVe9uPoH3+TCg/tcM2NAtKdLQ5oTtzbql5Rwe8J0+SSRSElaxG6KjRPZJQuskxla9btw6T8p7G9fwk2L8dD9tj/aF0dUFxuWAjGG2ly+VfCyg22IcOhWIPQUfes3BvLTfkywXq8SWLzbL6IqrGi/bOnTuRn58PL0vAqfMxyMwKx4BHw8ByKOCcHrAGUu5VwVQrNIIXTH4XtRdKVDTgdsO9ZTNCnsyFkpgoxAvlYYWFhXtNS+qmr5U2qqtDbm4uGhsbkZOTY5rmndcG4uVnYsHEjOukZHcb8HsHRScPcAXnek0/jch5qo6BD0pAZMUBiqNoY2iacIXhggLjKzGTJEJDQ9FFZhZwkVmLvmnAwmXn0NLWCRarAa/RlivsDzY6BIzGSLh8UNzCFaJNtdcDW0QE2MUL6CousnKV25vp/nAYq09LS5O9UVFRSKatxLlvhcRWthMHhmLp/BQMGxx2Q1STSrmvBazSCa75TMCZzwoaNdSGeqgdTmiRkYg4etywgsiUacICkww5S5YsMWW2t7fD6XTK1Qt0dnZKa9Q2tGHyrBqsLDtPGtw+3EUEZkSAf3YX8ChtTdVNFnH5LOAmi3jcMtpZWxvcq0sMFTK1i+9jjS979uwxCWiahilTplAMuU1X2O12xMbGyvaS1fV4e+FpXGh00mAiobl8RGZFAMvjgMfsYOQKUAJTREBSuAll6q8HrG4YK76NkPZobkZtba21U7pg48aNMh7GjRuHHTt2+FmkfHcj8t6qwanaVhrt0UFk4ojInCjwVZFgj/siXWG+Pc8P/uZLXL4yQnxLFa2qqip0L+fOnUN2djaOHDmClStXorKyEmfPnjUDU5A4Q8pz8o5icUm9zwoCXKANbCAR+Ziy5vcpwDNEhlgIMvzGQlMV3RdooZRrLaNGjcKECRNkW5heFJGcjFgQtWEN8X/B0rOY/uFJXLzSThq6COoNYQk0/yMisonOh/GR0C5fNuPAzIQOh9wIiKYILS4uxt69ezFy5Eg/UqWlpcjKyoKXfKrS/ha1h8wpaoGWNjf6hfvnBZk39LzNXGQB2hUsxNIvznnB5ODBgxgzZozZoVAeT09Pl35PSkpCQUGBjAmDSE1NjTnWZlNQtCAZc14fgGCFX/KCr2uG+mMrxasK+75K2IYNE13NgsAxaoxoampCfHx8wOTy8nJcvXoVs2fPDir8/vRwbF51Hx7ICA/svEgZc70DfDudkvRXQKUc0edyE8WDNH6VMEa1IBAXF4chQ4bgxIkTfjKqq6ul74OV55+KwdrF6YiNDvHvaKJzoaQJ+JniwaP5nZQs+yFDuSQgWhXGv4kTJwYoWbFiBerr6/2+iay4jLLhtq8y/JWTqdnXlBFfrAN2twYoF0V56WWrqP1GKhb7IkYoysjIkMmnp3Jvcji2fHEfHsy0mJx0sdJrwBZHwHiuQ7pAHNN/HAZLMm9L/RX99iptnJKSgqlTp/ao/PXJ8Ti0NeuGcuHjBf+AjT8TVLmVhFz9tDetysuE7oDjWGTEzMxMXLlyxRTQr68Nn8y9G/OmD9IVk6nXXjd93JtiE6TYtmMXWEKi0Z3mdz0jEsuN+3RFRYU5Ly2pDz+8LYtrZ0ZzrfIhzmekc353HOcDYnuFpkMleJISuFpdZb2yLzf0MgsBEQtiS6ZK+5SVYdfm91G8MAWD+tCZ/yVtne23/tYwfR8eDuXzEijPPmd01RGyjYdLr5dS7jwE7dMPwDb+DeZUETChB8UmATK7sqYMbPiDVuU9X0r1jsn6QLB+D8M2awOQ94qMYt4NwVYsQZcZzHkXtn0V3ZVP7vVabgoL8jDB+QZoG9bT/t4FnDqJoOXhR4AnxoLNnAUWE2PtqcOtPkwsJISERYT3Ajrp9MPx41R30qFHrqHbLktJpbtuWDBRxfA9z/7bY1V/nJbx2yuO//04DULEeJ4/SRCOTcUdeJ7/Cztb0i452jIqAAAAAElFTkSuQmCC", UJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbBSURBVHgBrVdrbFRFFP7m7t1dtttut63YbqFlEfBBqmBBBQ1F0ahglBajEDEkRBCBBPxlIv4AjYn+MQSJiY8E0RhiIgRQwQR5lWcQCgUBqVBY2lIo0G7b3e3u3r33jmfuo9xCWwpyknNn5s6c95kzMwwDBM55kJpKwsmEYwnDhEFrup0wQlhLWE24iTHWjnsBJDhMuJIwyu8Mvhe0uFsQFluCbwFdjfNM4iRPRnfwdMdersRq6F+iL0WWW97rFVgfwsPU7ILpZvOfFkPq6jqko3ugp+rAHJTcaiVPCeRABbIKZ1K/2MkyQvgchSVyWwVIuIjvRlu4ENzV/BWU1t/A5CzI7kIwdz7gyiIlZItGA1cp5LRWVVrAM1F48l+DLzTPqYgQXkVK1PapwM2Wq/FjiEeW0aIMXL5RcMkBouA0ZpbdzOEDRl9udHUtBS11nvgx+Eo+gicwoU9P3KzABVt4um0Lkg0fwzVoKORBpWQtiWWmIIOIcdziQFM+uG6oQkpchJpqRFbpcvLIq04lHrd3ieQQvtIWnokds4SHIHuLSIxCC9OmJxj1BVJfMv47kPVsXV5BX4iuhk/Im0dtUULG8h4esFwvrIeuXEb83AJSvwVu/6OQJGYknIEwW7BuPziMN83nBooRMzyh6xrUrtPQWRCBR9aDuXJskuEiFLYHujVKtayh4DfD5RpkWMF42mFhBnX1HFv3FODfpmEkKQ2d4rzrkB/7D1M1ijHTepYxPGa0TIUk+8H0ViSbVzt1ft+MpLlHo6b1zYifmUFWa5RwfsOFkkg6Znph9wENR2vjqI8QYykXU18aj4NHz6Hun3pk+xlGhL2oeCYfk57Uuz2h6+RM4qupSVLWDf/DW+By5wlxIgeGi31UaaukUOIxphFzkRwpSDxFY8l0PTF8qtyFB0bkYlihgp9+6cQf2w5Az8Qwe4YXldP8ONMYQFEwTuv1bjOFARwquPC1lkHm+jq4QovFlFHaxe/J9mK1YzsRCCJhMTHRo0YCMq4gpWjI8iRxojqKbXVd8BVKlGBJzHojgMqX3TgYSeLK6WZk+9IUChg0InxMbzfDIHiSNDW2zxmGySIEx6gzlusK4qeeodgDMmkhvMBEAkqDCL24dD0H1SdG4vj5vVA9ftxfUoFEXh7aOxU8EUhjzc49mP1QFG6lDC8+G0Mo2E4hSFEipqxkJAdQq2mAf/QuSsZsoUCtbG89LVnXbb2R5YxZrk+RJ1QMyVdQjiu4VMRw+EwZRo55GKX35eO8X0djQkObGkHM3Y4K3xmEcskKniFazdprzCxgVi3R0xEqpGXGlpStWEBVE1BUmeLO4LKsl3rstAx8Q9ugHJ2Ip2NNaGtqhZt0K5A8aFI45lxNoqvtEQyZdIDCVWDtcLNU69wsTprwgsbhSjfbCgRlm/32U0NQ9eEiGIES9cne8A74YMo2eF0a7rtyDieCCdS2jKbD5zRyggxPtrbguF6GL/6swKrq59ETrAIhkpPr2PTZaLzytDkjW9shOLw4BwMCYnT/ZQkXL49CHh8O/3UJ9W0ZeK92GMwHAgG/x+62C3MjovdAKPu2hImMF+PDjdiZeghzd5xDfWcANa3DsGR/Ew50DcYTwy4ilvTcls/jD+bbXaMSHhc9n1fGxLLB/RLWXAxh2ph6FC95ENfSZ/HepWVYdPVzHGk9j8RbIUwdG8G+CyP75TFqaIC2anfka4UCu+3RC+OL+yVujIawcF0lsuU6ZCaWQtG84DkBqOXFmDDqEub++DqSqax+eUyfVOIcVtulWBxEwfa4ghFvbkJnl2olo4CeiZjr6UKn4sPb5XuRe6QBqSGDcW3wUPx+cjTyaBteT+f1IpZb+cFx9ufpCBd1hztPFucyKfEDDZYGsz349KUg/lq71awBvd/YTNjpwWNtbehoSEEJ5mI2DvW5lFuXtjFVFU7ha4XsW45jdHQgM2UypKZG2BuxHzX6Be7EklK4Nm4Go9aCG8exdUVaZfzOzYX8zXfgbjf+D3Bnn2qKtGq1U/gq+1rWbZyVC+JcCIuxvnED9MULIVHxthfdiSdsy3U6XKSVX0KaOcueisBxJev3UsprasAXzKP0bxiwEtypQKgY0tffgk2Y6BTe41IqOYmtiSprIdi4cZA2/grMmQudQtIjpujdYgP9fmD+u3Dt3nOz8Kqb3wYDfpgIL+gb1gObNwGnT6FXKB9H9k0Be2c+WEGBcyaCgT5MHEqInFhBuPSWyXQaOPk31eYEPUioZhSFwMJhIKvXIiSSe8VdP1atx+lafmcQHejjdMCJzW88z58lHIN79Dz/D65NiCWrgccXAAAAAElFTkSuQmCC", YJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUdSURBVHgBtVdtTFtVGH7O7QctUFqCI2O4Uj6WGPZBTcg08IP5V82cf9CYxSWGGIiJTg2/QX8aFUiMMTGK/wT/aDKXGGMQErcEyBhGpmIwhS4ddrAWkHaX9t57fM/9qJfS8rGxlzw9597z8Tzve95zOJdhn8Y5D1BxgdBBCBNChIDZvEZYJMwSJgjfMcbWcBhGxCHCACHJD2bDYuxe87NdiIV3fYTLO9o2NqAuLEC9EwPzeCCV++A4cwastLTQVP0UjfdwEAGm8p9hhFk3LZHA1hefI3P1e2i/39o2mJul1HQCrvMvwPPKRUjBoH3KRcIzJGRxTwFELtb3W4ucr68j/X4/st+MgPkq4DhWA+lINVBaBuZ2GWOyWSCZhLa+Bu3OMrTVFbguvgrvO+9Cevz4riLYbp4r168h1fUamKbBcfIkJL8/NyBfObeVPJ2GMj9PIZHg+fQzuJ96uqiIfAERizwz8jXSb74BZ0MDHA1NYNSTcU4lMwZRXX/JjVm4VZpNnOrq3wtQlpZQOvQJ3J0v2UU8ae0SZiMfgJlw2bGfkH65E85gHRx1dWD6n41cDOTb5XP9gRvk+p/xTiERavwflF25CmfrWav7IM31dk6AGXrhPbRoFKkXz4PdjcPZEoakd2JGBLDLtskJMSNgyIGmqsjO3gQ/ehS+8V/AaBlNqxdLIZkPfdZb+aMPwG5HIblckLa2DGSMklnIiFIGk2XjWbbqBoz+RpukZOEoLweLxSB//KFd62UjksZ+T1reb7aG4aS65PPBSRmsrzuM5RZu5SJg34O2l9wIqZ4Doq5RRY0uQU2noJGQ8pu/WVEQOVAvuC5Yw1N/zUN5vRsasTkcTvDKABhlspEDJhtjuQTMpG7DWVIFyWE7gEwx9lxQkrQ9sxmotJvStDvKzuq5oB/tQkBHTsCp0wDB4XBAJWKFIOrFbCP2I0qrKGKe6oLtXESCoFIeaEQuSjFn2f9dOkQOhPXwUwcBSXgsst0E53zHxOnVG1Dur8DjfwKp1RnybgP/Lo8XFWCfT1EUnce0sIhASNREQz65fSL7c3xuAC5vNarqn6dDahPxW0NIr9yAr+Zc0TH2eS1HBbf4DVgRKESe742ApsrYjF+DvDaHzPofWJ3/krLWta1PIbPmzoqj27CA005QqPNOIQpBQ0lFE3zVraIn7i39AK5li5LmL4PpvW6iph+JItkKEe4QoMj0q8FTXouN5eu4F7mCyrrn9KgIYcVEFHleEwIWRc3pdGI/plLCeStb8FhTJ+RUjLaZBG/gBMqOtJK4+/uaw+VyWVX9JPxV1KQ9tlxucOkx+I8/i/W7c3BXnIbbf4qEJFDVdInSoGxf5LYIzAq3xwmXxNP09DRGR0f1lmI5YJkiJ5CV4yS6BJLbTwfSn0X72hOzq6sL7e3tVtOEfvWy7nuxWIx7PB7j/8gjADnEI5GI/d4YsBQOWm+6u7sfmYCenp5tl1Z7iELW22QyyWtqag6dPBQK8Wg0ahcQQt465aIwMTGhh+uwyN1uN5+amrKTDyLfzFyI5OIzPHwoIgT5yMiInTySW/sCIkJ2EWNjY3roHpQ8GAzyycnJfPIQdjPqELaLEFlLW+dAxH6/n/f29ur5lEcexn4sPxKWkL6+Pt7c3FyUuK2tTe+TSCR4nhX1fK9Ps37CW/ltMt3/ZmZmkKb7v7hk1NbWorGxEV6vt9BUQzA+zx7sY9WMxlf8YCZiP8wf5uO0gBDr8/wcoQWH9Hn+H+uNGcIBT0PzAAAAAElFTkSuQmCC", XJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXTSURBVHgBrVdtbFNVGH7ObbutW/fRASsbc2w2IIEJReb4jIB8IxoWE00kmuEf5RdgJDERw4zGPwQRf6D+UKb4wQ8EfwAhYYloSAiIY0ynfAzWsW5zLWxr3bquve3hPbf3dqddt/H1Lu/u6T0fz3Oe95xz38Nwn8Y5L6DHZvLl5C7ycvICvbqf3E3eRP4b+S+MsX48DiPgcvL95H38weyQ6DvR+GwcYDG7PeQ7UusGhiK4cduPTm8QmRkm5FgtmDvDDhs901gdqfEhHoSAzvxXxGXWzD8QxsGfr+L0eQ+aWnvTdOVwltiwfnEp3q6ZhbKpNrnSTb6SiLgnJEDgIr7HDXAB/En9FRw+fQvZWWaUTMnGFLsVNipbLIrWJ6LG0BcYRv9ABF2+Qfj6Q9iytgLvvTFXJuJOR4KNN/MLLV7UfnQOw2GOSqcd+bYMvUca4bh4zbVnMKTians/FGq2f3s1VleXjEkilUCbAX7kTBu27T2PipJcOEvzqCHTMBQmnkwHTCXBJTYcrR0B3OwM4Itdi/HauidlEvONXcIk8P3QF9zFFh/W7TyDJxw2lBfnUiumNWVJnFkcSNQRMNM5Gf84HyHRSWE5uW8Vls1zGHCfEYGdidF06cXs4fEOYsM7DejpDcE1cxINrMShmTzdFBLJMmhCCJ3En0rr4/L1O7DnWtBY/2I8jHGrEKFQ9B97jLf7fmjB7Z4gLGYzwhFO8Y8hJJ6RGDmPu8rpnXgf1Z+yc4RVow8RiHHYsjNwxx/G7q8uy0w1tZm+3/vEj9v/DaBq60kNIC8nE6WOHJoNSyjApTkbAeHaimCSMFyKRdzbuwcwSGeHxQT88+NLKCq0igZiDVSYET9eNevyBvDq8yVQFAVmswmF+VbCZZonxGcja43FBuIklKQ9b0RCIyf+9/kLSE0VMR7DXzd8WLWwTLTQjnahwCEq1Io3Xq8XsVhMIyDcZDJpnmpKtBtKxA01cAnhzEXIsfQimlWNmGIf1VaMF41GE08xGYcjsRjrxRpwaYS5WDCq1sAgYLyXjalech/uDk1H2+B6sKzZ6AlWQhluAYsGRoFzbYewhAsSwnVziRCUi1IkEklqKEtvDKLNXvXg+9NNaG+fhs3z7qB3aCq+brCgcs5dvLzoHFTrc1pI5D7x0CWT0JUtV/RYJDFNZ6JeCTWj8dq/ONPgRX5+NsKDXfB1dqDQ6sHxE9fwR7MbPBYepVoqCUmBAkUGSJ15KpmYuYwkn4zLbX2YX3EQMWs9WgNHUTyjCze6ATWzkAaKjAJNVUAeV4RAbIcCs9mctmPySwWOrP8x23kJxy5twHB0MexWOi96VLicf6K8ZAnFKAvpZi6rYqwvgS1KblESMRlL/oRKSi6Kp5SiZkMNIsGbsBF3a0YIPOzBC2tXoyhPoTZ5mMikybpF6Qq5S4CLCrFyx7OodSFeoaRsUg5w6oIJ/nAIa56dhTUuJ6KZczGRiYlKCjSJc6CWCuIswO+N3TjS0EYHmkl89kZOuDTGeBCcZeN+TDuQeHxLblo6DRuXlhlVW42jWHyICvyUUDz9+ikEgqoWbx0Kj25xAuIIbT68EWWOBHG7on+XvxW/8m0WvLlJ/26PsZUeDjw+1pa102XweoE96nMsVFi2rQEd3qFEHvA4CJQ5rDixd7lMYORzrKdIB0RZqPDdB4uQYTG+Oo+iBE+M8fmOBTL4ASMtU6TWddC35PyZdny5q4qSzqQ05yHA4yIefLcKK54pMircOpZm4yaljdd7UfvxRUpQhsZORscBn1qYiW/er8aSysky+Moxk1KdRFJa7vEN4dOfruHQqbYUHVh6YLLsDAVb1k3H7to5yM+xyOA1BN400ShpLyYiTTt2tgNHz3rw9y2/1JMlZrzgqUKsqirCW5udmJSXKQ/pxv1eTCQS4nyoI9+eWifyw+bWfgxS/q9GOYopxaooydYuLmlMLO66h76s6pfTev5g1vfIl9M0RIzr+QryeXhM1/N7D44JZFBCmjQAAAAASUVORK5CYII=", QJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXSSURBVHgBrVddbFRFFP7m7l/ZbukubYV2W9iCGG1RUIqpJQKtwb/4AAr+pQEf1ERNRAIa4wuFFx80IhATCY1A6AMakyLERElQIP5gioF2i2gTcKXF7lra3W6Xbnfv7r2euX97t90tpfQk587cmTvzfefMmTN3GKYosiy7qVhHupp0GamP1K11R0gDpBdJz5AeY4xFMBNCwD7S3aRh+fbkIB97q/nZJMDcuh2k74zvGxVHcC16BQPxftgtDjhtLix2L0GB1Zlrqhbyxk7cDgGN+Y9Q3axINBFG+5WD+LnvO1yN/pFzMq9rER71PoVnFjVjnrPS3BUgbSQigVsSIHC+vu06eEyMotX/Ib4PfIVCexHKZpXDU1BK1hbCJtiUMSlJRDQZQYx0IB5EZOwGnvS9hOaaLWYigVwk2GSWd904h12/vgEJaSxy18Bln60OYPwpm4bL6pusto6l4vgn2kO9At6r242lZfV5SYwn8LcOfpIs/uj3bfAWVaPSVQ0IKihjzIA0aPA2WWuR1V5ijd6Rq/g3FsC7ROLxBRvMJB7Udwkzge+GFnDnQ2fx/k8vo9w1n3SBajCflJmsVwoGDTvjCxkaGRKJoTd2BYOjQXyy6mssKX1Yh/uUCGw1CGiu59YjONqH7Wc3YijxH+6Z84BqHdNwlYqccZmOblhhWhBZ7UtJafQMdcFjL0Pr2lNw2WbrX1fzpRC0lx166xcXvkUo3gerxQZRTkCUxqhMappQypReV/oSWp0Uaj0li0a7JKdomxZiMBHE4UsfwySKt5m238P8pS+Swpp9QXgXboXH0425hV7FEDDTWmVVZPOE1ML05TQ8wqvBWC/i4igczImjT3foXuAxUG2Fml4VOdIRI0ABoes70eRrwwL3HGUJGMtgchA5awfkEFlfBrU+XBSGmEpCTsv4a8CP5RUr+VdKaucEVuvjTvUkCExAKlUKf882vL1OgMViwWSSHOlClNa4aHYZkqKEWQ4JiSSD00Nbz+JRvJFOpyFJklIKgmAevpq/8cSDm0kZgXBaDSwi0RliaOtkGXfmEYvDi+KKFxB1PIQuyQ256AlgVgPtQqcylqvqRVVTqZRCRpNl3AM+XrvUL9JTgBHypHt/A2rnglyW2f8TCNhLMDIcwfZfPkDXUDcq5nhxoH4vnIXFWd+NJ2G323mzz6qtBaVRSdvnghFMvGihvHhoPVDizO+JwfgQNtc2w9EdwryGFXAxV87vdAJ8KTRxGwsyKo4PLDX8ueHJdF5siKKIuwrLsLa6iax2Uu642wAbX5pVF05ASYnzi63IFdm7moDyovwEgsGgasBQPzrOnFTqsVgMoVAIZsvNYgrECK8FeG1hqXXC5K/XUZTMw6QyPDyMjo4ODN5MYeljG9DZ2Qm/349EIpF3jM1m06tKJuzkNZeD4b65GRINVURgOW4pNTU1qK2tVQCDN8Jwu92oq6tDVVVVzu+tVqvZIxc54mnSzfytabEdlwfG4I1ex65zbSjoZpiKzNfKe/nj8qUJ/TwpKfmA1PIsnYolJXrXGT0V84PIPRBLo+nzMNqObMD9Qb8WhncmWjLkp7OitvMXwKp0yvAI2rl8mL+VuSxodfyAWgKfSdE3sLDpFTP4IY494TimqIK4aiWEYL/hgel6QTYrAVuOHQerNGIjcxxrv0h7lObiYlj3t0LOztnTAjfqdJ4I+w+Ywffov2VmlBZoW5LV10PYs49+aFiWFdMhIdGWE/Z9BmF5nd4c0LCQRUCLhUbtAwjPvwhL+3GAXCebJpwKqKHeSnL7CQjPbTSDN5pvTVl+1tyyHronHmmA0P4N0LxJiWB5nOYFLqLU+eZbsJw+C1a3wgy+ftLfcmOyHBcT9F6D9OVR4AR55c/LyCkr6KdzTSPYq6+BuT3mngCmejExkeD5oYV0y4TOsTHIlG5ZfJT+cuikKq8A8/mAgoJcU/Hgbpn2ZVW7nB6Sb0/Cd3w5zUFEv56vIV2KGbqe/w+7QNhI2FND8QAAAABJRU5ErkJggg==", GJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAa7SURBVHgBrVdpbFRVFP7um9dON0rL3tLSAQqEYqUsChSkKAoRwqqpJhoBMUaNyiLqTzExMSasf1QSA0hM1CBCqKBRE4opoCC0gC2GrUOhRWgL7bSdmc72/O5bpm9KN5TTnL43dznfd5a7PIE+iqZpaXwspRZRC6guaprZ3UR1UyuoR6kHhBBNeBBCYBd1K/Wudn+yS87tzb7oAVh69wF1bec+X6gNNZ4rqPfWIc4Rj0Q1CWPS8/lM7srURkbjQ9wPAZP5ERhh1qU16MG+S1/g97pfcanpXJfGMlNGYvrQJ7F83GoMS8qyd7mpj5OIu1cCBJf53W+Ba83N2Ht6C/Y0f42EuCQMTsxAesIgJNDbOCVOnxOKBOEJNKGVWu/7B03+BsxzFeOlvPV2Iu6uSIiePA/9eRJtr6xGONSOq4vyUTM+DVdcKnwJ+mjbdM34pRkmfSEvrnku8k3BWwUfYXrG3G5JdCZQbYEH9n8P75uvQ83OhmNULoSQAERQBGqGKyif4CAZB7xOtslOTZIQBi/5LwJcb7mK2tZqvDtlC+YzIjYSk6xVImzgW2EWXLD8DNoWPg01MxNqTg4HyT+aFyI6QZgBuJDrQOUYBZdJpiVZ52FERD41QRIs1rY6bJ69FxMHz7DgttHWuigBM/TSe0Rqa9G2eCFw+xbiJhYwiDAICGNwd8sm7JBkVFTmCpwfyzQ4FZ1NKBLGxTvnkKymYs/8MqTEpVpTRspUWAR28bFSvnvf24Dw7p1wpKRAHZ1rgAqhE4kyFjBc1aMgLLdhZUBjmipHKzg5UcVfY1Rc815lgXowf8Rz2DBlk0VgO+2uFeZ6v6t7X1OD1lkz4PD74OjXD46sbCiaZpCYwIonCxEhRGUIeMwJlLXH1qKeKIOcZpKJsO1E+g0cnRDAubx4fLbsBAYlZchRsgZGqjC2V10Ch0qgEFx6q3i9uoppTogBbClWIY4HgEsE35QIOMycuPn7UjiaCtGxMPR+aWv6KR8eOR4kGT+aG3YAazbKEfrWLvuLonlk5evgcgFFyP1OI8Rc5j8zDLGpkWXtA/JY3hvqgU/v8ETg+xImXw0C7X5D/e26inaq3w/R2AglFNJtSm79vzkMmxRJvAKdcDgEraLcKDrTORTTDZcXONMC1NF4ndcAeD8eOM6231qB8SQxl+MIaKgkYZJpagY8Ht2WYkYDVy4j0thgESiQbS49/1VV0Yo3ntRh5L2Pnh6m94IG1xF4AL296TPASghwniTyNNNzv9HONOrAPm/MyhFmFDSSMMWlmLnQt1xhzyEji6kEvM38BglaS6BSAjYwCqdaDbAAweoIlsl+zYyAz2cow24XYYusdrXaak5ToiMcjihbnUMc2SbybbKx30MW4gUWITcd5MqCCRsg6UyBMyJzaLSxdjoDdxaRGt0L9GjrW6IyeEjMcJHBrhs0OFAxmgsZjbe51X3rM7dbczg3H7SxIV1BdxKbBul3f6urSc5y6x0uly3+lOqwsc5zGYHXCPwT3z9h6J/nEpznNMZspqEs5mofSd0MozexrCsT8q0mtyRwVu9UVSiFhbEzShnyAzS+IgkYTaBDzPsxtq3kvvVsohGVPayJ73w9Amu2p8hxQfSPRqBCbkSl1BU6s8KZ0I4f65h0LQTxOfNcQ+8W8AyeQ88f4pShJOPjiDeYvTPBPoFLCfH+0LB8BUZ0NB21tmJZlmngSghMnQTF09yxFO3WltFrnnr4memo7BnYEp8zGX9kTcPBsQtQmlOEg+tzkNXfYXWnq/JcJokv+WMNGBrHqpehbd/atbX9vj6BtiSk4ljOLBzMW4pj2TPgVRN5PETwTH68HXy3xL7nOJZRCM2dA3G9JnZZ9iIegp7JmIz9DxejLLsQHqdcapp5amoYnirw1QupdgIdx7FJYpseBfl+7izCvBMo3FB6IiBzWjr6CZSMX4yyETNN0KjF6O1Ier+zuB9mj4q3OvWjGIi9EclaKIe1Nf94GJFXV0MJBGLWsN/Macm4Rfgl9yl4eVG9VzrA5QH98YJkht9pdbrR1ZXMJOGC7VKqna2AtnoVWuqbUM7w/sCcHhk5p5OnnYCjDw1DkgW2LknBo9mqHbz7S6lJIuZajjre504r2FHlNM2L7nNiAieoAsvz4/DO7CSkJgg7+DKCV9in9PnDpLY5gsN/B1BSFcCF2+FO0w1q+cMcKBql4sUpCRiYFLM1u9HNh0m3ImtCFmZXH32BUEQrrw1qZdVB7eiVgFZ1K6i1BSLdfSNuM+vrv4n5cbpbuz+5+78/TruKCIz74xzqRDygz/N/AekvXqNihMKCAAAAAElFTkSuQmCC", jJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASfSURBVHgBvVfPT+NFFP/Mt6UtUNrS7Mq62cQa9ADGWEJCoh6UixoPZj15MVkT/QNM5MZhPXg02eVoogFjjImXXU9GLi4x6gUBU00IYCwuuortFrY/ab/t+N50pgxfWgpud1/6+p3vzHfmfd5n3ryZETilSClj9LhM+gJpkjRBGtPNe6Rp0jXSJdKbQog99ELIcIL0GmlOnk3muW+38cUJhtm7q6TvettKB3Xczpaxm68i6HcwEHTwxMggQn2+dkO9TzrXiRHRyWt6fIsmzUrulV3c/OkffL+Rw2+7FQi7p1Q/XBoO4rkno3ht8gIuRAP2kGnSaQKR7gqAjPP83jDGC5U6PlnaweIvGQwE/Dg/FMDwYB9CAR/6fEIZdusSeQJYqLj4l1jZK9Xw8tPn8ObzF20gbPx1ArHWEYDX89TtAj74aguuFBh9ZADhkL/ZRRwdQEpTaNJRqdaxnSkTSxIzrySQTEQ6MuEF8LsxvpjK4MOvt3FxOIRL8X4aTH8qNADpRQHzR+M0FKqduxX8RTrz6mN4iRixQEyYmHAs49eM8bXte2T8D4zEQhiJhlCj8cgpegrU+OkKVddSqnMbVjs/SbnvuWhQOZLayRtTbOPqEQY09ew9/t6vYuaLDWSKLsYeDUM4Qn2mGBDikDRPENovUs2JVCy49QY27hQR63fw8dtP0TS2VsrjPBWGgRaiz3+4Q8vLpeXl1543valqT2sN2fJasVI3LEjVVlVsMBNClRs0VQNBP7KlOua/+9NGqpa3o9f7W8b7xV+zylPHEZpKtIzzgFWXlQ1JZdSUq9ZUqDYzJfSsS2bQwTepu2pVabnCtjmsL5uaz768ge1bPyq6GUD+fBx+n+8I0w61NSn2io5Enia7nYNxN4N6vTk1H0WexXvvvMEtKrULTpmGgbGxMayvr7f6Dg0NIRqN6nFkayWYsrdOwbAyFNcVCgXs7++36iYnJ7G8vGxeFxjAKhWSpVIJg4ODx/ziuv7+/iODeo17xbTxmKxeyefzCIfDXFzjKUhwaWVlpe1gxWIR1WoVgUDgmMFOIBqNhurjum7bMTc3NzExMcHFBANQWypT1UlqtZpSx3GUQZsBYcUEP1kZwEmytbVlAKggRDcAtme9EE2/Es4DKiWOjo7iYQkHt5Y9pmyVTw8UGDp9PXgtl8vm0LLKDPzMUJiWqakpPGgZHx9HKBQyr2oV3CK9wm+zs7NIpVKt4Oq0zM4qJjhZk8mk3bQkdCrmjSjGH2SzWZ0JnZ6AsFcGazweh+8wuw47el/+lN/YmEVPz4UTmmV8gW0f244ZbS6XgwF0PyzY1PMYkUjEBnC4Hesj0pwxyh+233DOZtwWDnLL+Jw5lgmrA8cC7wsJfj84OFBp2GbgtEx4MyPvJ8Fg0DSn0e5Ipium9QeqAycMb6rtZtj+1rDpMT5t3xG6Hss5cilxqM1FA0U3EPwNb14c0LyaLOMnH8utQRLwXEwYCE8LAzF7gvcswHPsp6Ocx7DteRqnFY4J0uvtLn0EQNLuqJQASdp2VV0Hua7j6/+JbF5OF+TZhC+y8/J+LqftGEHz/Pgi6TPo0fX8PwoKW7Rj4MWpAAAAAElFTkSuQmCC", KJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAeySURBVHgBrVd9UFzVFf+9t7sElgUWAmQXCCwEIyWEEqVEEyLSWmucaRNqotHEhOkf9g8dqxmdOnZaTWc6TpMa4rTTOrXTxrTVTBLNl0k0GgMaQwx+gAbCYIBl+Vq+loVdYJd9+57n3n1veSDGRD3DYe9799zz+51zz733XQHXKIqiWOlnPWkFaQmpg9SqdntJnaSNpHWkRwRB8OL7EAJ2kNaQjirXJ/9hY7/Jv3AVYBbdM6SPze3zh8bhGruC3gknzEYL4k0JWJqynLfnkWcpGztwPQRU5mcRSTOX0cAwjnXsQ233UXT72ud1lmHJxWrbz7BuaTVs5ix9l5O0kog4v5EAgbP5PayBs2hfbPojTncdQuICK9Li7EiOTUWsMR4m0cTHSHII49Ne+EmHptzwEtm7HJuwpfAxPRHnfCSEq0XeOFSPHfUPgQZhibUQlpgkGqDQKDZM0Q1XIk8KawkISJPoGm+jlognb96NkvRbv5bEXAKdGvhp5wHs/Hg7shLySHOjoIIgRCGjg9k7RX2jRHohg6aqA31+J54srcGdORv0JFZoq0TQgddALbj6/nfw+/pq2OOzYbfkRLB55MCkJwP+vlxMeRdh2pfECZnivYizDsGa24wYy2iEHiMiC+j2t2Nk0o3dtx1CUWqZBreHxj0eJaCmnkUP92QPnnhvIzzBQars4kjE9CcF4+H+5Cfw9Tl0vLWpmJGknMtIK6yHyezjWZHkMNo8nyE5Jg3/+ukZWEyJmmkumwpRfXhGe7uvZTcGpnpgNJgQUoKkAUz6Y9F68j4Md+UgGFIQlBQEQjKW2DuQmdrL25oOXLkRbWeqMOFfwMfLigSzKR4jQTf+21Kj58qzLarrvVqL/m3XQR6YKAqQlGlM+OLQ+tYG+OnXahmGzerGVDCM4LSCFHq+raiBt5kuzexArMkP32gCWt/cSHYiQphGGBL3ebJrP19Vqmxj2EZEtlcuXcO78cssH0QDYBQnkBgXg/2H18LntVA2ZTjdVqwt/Qi9I2b4pswoX/YRDAaKfDoMe4oHCXEeDHqz2eQjMGaBp6ECD6x/Fb6kEUiSBFn2wTXyNxTanmZwfGtnBCo0AkWxR7HcMUbpZxkALvdk4nLzMu5Qm/Mj9Tfh3jV16Biw4VxzPtKTxpBncyIrdQinGm4im3A0x20tRSi5ZxK5OSMIk4sw6xJP0b+nNZMKVgMlvBBlWhVyBwfmdUf6/7Nl8PpDcCxyYUVeM9eSvEsY9RmxtfI43B4zeoYt2Hz7SUwFFBQ7WsmmBWmJA1hi6yQ7CYfeK+G+RFUV6RxhBTQCJSwDDtaSpUYIOnCmjR35mAyE0T9iwC9WNsBAO02zK5vXvjl2HFJ4mopSouIL07OXa/myFsQYg/jd3s18bIvLEVnGOr+K7CSsAgbrENW5oDkeixpoq+yLvkz+2+leiKf+vQken4icdBc+bc/C0fMrcPzDFfjfu+XoHkzAZdci5NOqaOu1YtvzD6N7OHmWD+5W9S9LnVoGrGJ0wqhANGzN2CjK0MtzB+7DBy034u8P1+CT9lzKgML1fEsB/vHI8zjTWIydBzdSMDMbrMkkYYaBlglTtJ9NgZczMeZ/5Wi6IbMHA14rkuIncHfpRSokA/o8KXANpeH+irO07HqRaJ6AyRBGY3s+rXkBD1TUYsRvQVPHErhHk2FP9kQiV2Z4QEzRILyMgJMVg2BYirnyoxvaqNKLsMg6ilfrKvm74twOykIR9p25A/98tIbAJfxqzxOcyJX+DNR9Xsztbilo5QTKCy9F/WnxicZi7RXfCZt4J7ESDMWzCNxddpH/tvXOnO0bVp/D+IQZLxH4n2lKao7cg5e370LngB3rVtZH7S608iLD+lXno5s1PzGNZZQRo2bWyFq1pNvYk6GxCsph+tgQI8alQg/WyxdxRIweIlhM651F9uBffsszM0wH0uZdT2F71WtIs47NCmCL8j4W/3WCaiI+ekiKW7cCN0dN6gR1K2ZlaZXd/ZDKSiEGA4wDT9kofWZVFPwB3aaFyE4bpO14Ap915vLR7JkZuQbT+XP1HafxSu2PMS0ZkTM9jLfb/oQ02nr5wcjUYITpwwYIi7M1Asmiei6/zOfGZoe46f5ZUaRIfpxo24lscugaSo+Czyd737mTg+cFB3D8i11IV/d9bQrEbdV68L0M+yvHMcbGEFqzCuKAe9ay7I5ZiOfs6/BKyuqvJWBSwtjs+QA7eg8iKTzJgaNKwIbjJyDYMzRzfhzrP0j20M9vePvCBYSrfg5RlqHbl7h0LUjlJD6Oz8OAMQkSbZ8FU/34QaAHW0beR0bIOytqnv64OBjeOAWhaLnm5gUC58exngCrhU+hbc0H9kN+9BF2Xs/6/LhWUXTg4osvQbxrrdblhO6TLLoTqi8qVQOI926C4egbVPbZs6K5VuBo2k+8ORe8Un9rEvWD1a/VKtUQwspbIB4+Bjy4lVexMkfnBWWamEST+TgM79ZCWFakB6+66md51OE8FxN0uyC//jpwjK4Mly5hXrl1FVC+BuJDvwYYiRlx4lovJjoSrCaehVqYs0QKQWlqghAI0NFKMdtsEBwOdvLM5+oFRK5n3+6yql5O9yrXJ6Pf+XI6DxHten476Q/xPV3PvwQTL7N4S4Z9wQAAAABJRU5ErkJggg==", ZJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbZSURBVHgBrVcLbFNVGP5u165l7baug8E2YIUAAxwy5BHFwUAMQlAeoigPeRmBaEAwwahMhIQEowkPFaNGwkOzSIg4lBnBBLZMI89twGBjc6wbWzbG1rXb+lof1/+ce2/XkjKY40/+ntNzz/nfj3MEPCKIomikYSFhNmEmoZnQKH+2EVoISwkLCfMEQbDhcQAxNhPuJWwTeweH2NmH0Rd6YMy0+4Rw8/3fbB0eVFhsqL5jhyFGA2OsFpnp/RFviI5EagdZYyd6I4As+TlIZubQanfh62NlOHG2GmXV1ghHRQxPjcOcqUOxZUUmzClxoR8thDNJEMtDBSDmzL+/KMyZtjlfnceR3yoQZ9AidaAeA00x0MdEI1qt4me8vgCsdjfaaG/D3U40t7mw8sV0fPzWpFBBLJGEEHrSvKikEcs/PAOvX8S4kYlIIFOLdIQdElQi0vq3Q6fx4VajCYGAELSE0+VFeU0bBFrav3Ua5k1Le6AQqvsMEGR+9FQFZq0/yTWd/MRA9NNqiOE9eLwBuAn10U6syr6MdbMuQqv2wNMV4N8Gm6xQk2UyRiRCo47Cwvd+57Rk4ArK8cUhKkT7vTTMYfPCKw149f0z3HwM/aTdOy9cxNwJlbhxx4Rmez+0O6PQ6dbgZn0CrteZaA8wxGTD27MvYFiSFeerBpHLdOQeP37Mr0L2xBSiFcvIM+a6nTt3ng66QDZ9DZvXNnbg+Q2/orHFhYljksDtSNuWZt1Agr4LRwrGwdElRTv7JIphPsS62cXodGmQW5TB3eHz+1F8s5kyJRrlJ5byjJFhGHOFIsAhGlaz+YZdBTh48hYMei1GDTVyLoIg+1cWRmEmIjIIEk0aRei1HlyrdsHW7sbaBaPxbU62sm0/0d2skv2xWtH+yKlKzmh4kh1b5xdhVHITxIAXbvKxy+OHm5CPzOeE0ihKMRBc8/N4SE9pwrKsEqQNsHKaP+Tfwt0WpyLAKsabBeFCZYVtoIwCi027Q8SiSaV4emQN7HSGM/LIxLkAEnr46Av+l1ASLGNIA5ZOLUW7Q8Vpev3AFz9dU9jx0i6Emn/C0uNUZGwsx2AyeJCcKPLcr2uJJ5sKim0lIytzQTa6Egx8XRrT+tvh9zlRWa9Gm4N8LwYwZlg8rh1boghxWA2psaCLxCurboOSmdbOfrA6BOh1Gui0fvQESjAKMnNRXiu9rYPTrZaFC3CpymtsVFXdSIzXsaOZTAAzm5VUtHRrQD+DEztRb42Fw+1DF/klWqOSSxCCKiphqCgtzQUESNMuigGfX1qN13vIpZQ5giRdVV07EsdxAcwq2ReUOl5+PCbah5cm/os9q/5E9tg6ToCVWofLx4Vxyf5mo0cONhePBSk+nLTH6fYHmTMa36/Px8IpVZKFiEf1nWCnNgYrISPIwNmlIWMJ/GDtPWOYqVlq+f0iJ66MPhJOmktjQAxPzoqG/pg8ogkq0l4UJQsa44K1AMwFTBzjiMFGxf44X5mKQes2I7ZfF/oKHm8U0jdvoBLdHlyLpRYug41ZwMJm5mSDvCaglQKQKdLu1KKvYHPquBDVTd3WfGr0AGVqYQJcZTOdVo1pEwYCIfVtVIoVfYWMIffC/o9Mi+eXGBlKmQAFyr8Zk1KlCckwcXgTcjfmYcu8C9T3/egtqKhdb5p7Cbmb8iioq4LrC6abQ7cVMgHyIMUBNr2ewZsGg+KaQRRYKtgcOkrDKPQW2P3A7tKi+m4CisqHQLHs+sVjQ7flKc1oHw3vsvm2A5fw2dHrIY1HCNOq++IRGbR0QfF41dJ+gWUFBZ3Ogw7qkGvmj8J327KUrYepGa1R0nCfsrp15XgpIEOyid16TAY3Ns65zOcPAoPOi2XP3sDolFa+LyCnXYcrGmlE86O1maHb+UWVCyBfkfazOXPBsd3PIUYXJZuNOh254NNlZ5Gz+C+MTm0NUkg2dvJ6r0BirBO7l53D9leKiKZ0lqWTSiXgyI7pIZnGW7GF81ZW5LZcArk05xXUYkVOATHvrmippk4c/2cMdTUVZ3bgzdPUK7x448sFFCtaXjdmZVjQThqfLZPugVHE4eD2LCyfO0JhxRhPUB4uPV5Ki6k/vPbBOViaHCG7uo/kvPw3nB4N9uRPQThIQg9OikHurhl45smkUOZhl9KHXsvrmx34nILym58reEA9CsTFqOn2k45ta8cHs0pmvoiYlyKiOuFCmHHfw6S2sRMnC2uR+8dtXKlojcg4KzMJMyelYOOSMUiIC6uiFjzqwyRECBYTOyCnZyiwxnO10ooOp5c3qOQBepgHGaiaRqwXLLh3/O/Hqvw4PSz2Dtr6/DiNIIjyPJ9BOB6P6Xn+H/tKnLydvaqSAAAAAElFTkSuQmCC", JJ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXeSURBVHgBrVdbbFVFFF1zzn21ty+a0hJeXiogNCSUH01ELSSIhi984DPR+G8iJH7AFzHRDxNNIX4bMJH4YQwQ+PCVWDQNigSLjxpCSC9aaHmUtrftfZ5zt3vPmXN6Su8tF8u0+56Zc2b2WnvPnj0zCjUWImrhx26WHpZulhRLi/k8wZJmGWA5w3JCKTWBB1EYOMXSyzJO91eOyFj83yIWG+B5Zabo0qVbBfopnaVzw3n6Y7RA+ZJbjchB472KRVUBT/HjB3hu1iVTcHFyMIv+qzlcGXfnDSSW1c02etYksHNdPZY1RMKf0yzbeVrS9yTA4DK/x33w6WIZn57P4JvLOTTEbbQlI2its5Bg/RHL0mMcKmMqT5gqEm7POBjPudi1vg6vb25Ee4MdJvEckxioSuBuy38fLeL9vjsok4XO1hga45a2lJXo/skog5eBvCuKCN4/oeAQro6XtF/2P9WMTR3xqp64m8CQD/7t5Sw+7s9geVMUK5sjgqq7a3ARBtvURkwOGLzjtb0fEj2iDMOTDkamSnh3azN2rK0Lk9jir5JICLzXBz9/LY+PGHwZg3c0RlEiAVABiaYYsGMVsKYJcBlrQytwakghW1IeODwCHY0R8AyyIZNsiI2u9hgMxkGWfdKwQq7fK/XRaReHz07Dti201Uc0eKnMwtPgcN3h+lhO4eyohWSMycQVTqVtTBS8fo7fn6XIYyRmYNn4oG9Sx5Mpe/0lapkXB/0vnw/M4Ga2jHg0okGLBrzERvmKhYToPT1k4ft/GCThfSsa0SQMEYmf+piNWxykxy5Oh2dcG6zMGh33rX/zqzHNOMmD2hsjHkelgsDzCy8IFMqet2UxlI3nFUwkmDjgLxjNOMiVXCQsF8f2tKEhpu2WGFgjtd2+0pN/Z1mDxWAWK2dxfHcCRY508aCus3BsBe/yzmy9oPuQ7uf19TwiOvOuheODOR9Op3Yh0OO/+flayTPHYtexLZPcDFwvT9cD0sr9eoV20VXBlEwWOVCNF8W4C9cLYUf2iI8l8bCLCNenGJbdL2xlQILdPM0kYhbmFt/P4Xa4kPeuyPmgjnVklTI6CYO3XX5fRiyilXbLb0pql8cco8kID3q7m9ASI2xpJ7bGE3EvbwVBu+i3jfCWwIQJXa2E5Ung1Q0I9PkyMh2shpRl5gI5ZqtMsEmGe3o1YXUj8Ml2Qlsd6XkuiLiV3e+LZMXbeWBlA+HDJwmblwLbVhEaJQUY/SMc7H4cBIkoJ5qM9ZbylpptojtfmvUsUQV3Vyj+rEiqJlJajzdzClFrds7EAzolLpvdNHSE9w0rXOLFeaDfwk0O3JiNmovN+q9OAe/0WUhnFH68pjDjzNJKRoOgmpA88BtXuqd5J3vxy0kOQitYipLlMkUsqkjazhRkf2BXlMugsovTr7XwTqrJDAiVi1Jr4LTa2WLNceliwSvp6Fxi++ABgT6/9eiKaKirSW2LLmE9hJ5ULPzxjBA4ARMHz3fFmV1toOGln4zUMMBE77a5BE5YZl/+TFpNnHF2dsZ0Z7qHA55YQdizjuOG5ZHWBTrS7MrZtTaGjmQQgEcF228d8t++1Z3AkkQ41VVWPpQBXlpPWm7lUB3dSEdS4eVN8fDH9+RHEzBHpMNSl2A8sDUh26TZ0earXcJ63tgIjHHCmeDU/sJaL9rnm+5ZLwe5/Y8n0F4fWH/YP5YFU2m2ZVmSKWl/N1RC7y8FPggpOYiZnnOT/jMPEWdQ6HVeEZz/oiz7HotjeyoI8DRCR7IFD6UXbzjoPVfEjSxVJCEpW4C8JGOAA3zCUj4GiuVdbXNOxtUPpYbEnGP5jZkyvvirxB5xjHpVZSSCg2ldROHZh2280hXlPcAKgy98LEcVT/hEvr5SQv+wi38zZJyh/AEae2ObhS0dNnavZ+D4HNVpVLmYVC3manao0l0r75Tpz5sOXRhx6NfrJeKbEvFmVu1qdmihq1ktRORyepTur8hF9gjVcDlVqLHQ7PV8G8tmPKDr+X/KxcdxM1ObPAAAAABJRU5ErkJggg==", _J = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASESURBVHgBrVdLbxtVFD53xu9XnKQbEBJGLFiwIEKsCZEQbNtfAIINYoG6ZZWyZEX6A1DKDlYJuwqEQhdskKBJJaQukLBQWlVOUrup49d45vZ89zG+HtuN3fqLTu6d8Z3zfefct6A5IaWscnGVbZNtg63GVjU/t9jqbIdsd9j2hRAtWgaYuMb2HVtTLoZdfEsvCkRsiCfwpBPKv/7rykazLS8uLmS325VhGM4Ssv08HjGDvMbFAek0K7QuQtr9o02373Xo/qOhevfz55LWiqq9ek6lUpTL5WhlZUXVHdTZtrhb6pcKYGfo3z1LHkUR/XLUoq9+6lAp59Er1RRdKftUyAj6+kOiUlYLQDvYcDgkzgYVi8WkkKkiUlMij8l7vR6dnp5St+fRe2/kqVLwuJEggUJq+UJINkGe5ykh6XRaCen3+9RoNGh1dZXy+TwZnwfcZkyEl0hAnPZ2u00nJycqgrVKjrIZn/pDQYNIcOlRP/QUqTUrwpbZbFaV8AFfBlZEdUIABpwl50FFzWZTRQPjGJmQyUNNrOtCpQCESXJbt9/DF7LpiNgeE2BSfx119CE+8H1ffQxHkdSEMGQhFiBGApJmhcAHfJ2dnamuMbhup6jNQKzo/PxcNXQjQjNFbogHLKI3nJxAaG/LpBCg1Rpbm1TAnumPT230nU5nLI0qA2Qi59kH67ENQjMQFxCBrgWHwSfghrSr9g0vKhPkQCTJCEAWmBxCAhZA02G/s3XXJzgM1NKOabhp32DquI0xrVDXAibpJP8g5SwZFPtwpykGI9YHg00I2FDpDyV98SOH5/k8z9mEpyzNLToDnf4kbtw2MyEpTLFDdERBwCLIZ7FcRui2kL7/LOQV1EerDQioofbPw4D+fsA94mlitdoITZD2eYHxNZEb75//01QgKQMOKIzESJFENviZ39VPYgE1CFCLwtOejAmTIQUhTKqfPRPdKM3jgxH1aGav6KlbfxzSuzX1ohovxegC22DEICYiC21Ec8PkzfrlLJSyI78ISE3O19ZSie8ELQ0JX5V8vAC3wFpn23h93aeP3tKSPCVWxgloPCW6+2BS0PtvSsqnaT5Epmu4fPvV0Q6J2hEEYJB9y7MSW6mnxqIXCz/4V9DdvUmf2x8TrRcv7w93u0ZU5VycgUPUfrdPmUxm7KPnzfF5kfSDA4uDOxCwT2YcFAqFePFYNqwQczaw2PfM6fUHPIE8oXCpgG/sjAa3wG07Y8e+RRbssvmy3eD6gE/4dvAN/ul1RR+Rbpo6lcvlpCd6EXK3jjOiE/1Neyxzj2Q3SE9JdQzDB3EE2g0tSm6/L5VK7gCvGy4aE2DGwpZpoM50lUpFb61wKC8X4XaZ3QXhA74c8i331jR2KDVpuUZOJuBgvZyhlCeNELWzKFN/ibFiS5BOOZZfSx7L576YHDcj+u1+QHuHAR0dqx2Bfv1S0hXnYmLPkfZE7KBOMy4mM2GuZjvT7lpBGMl7x4EMAm18zJK8yskZ2HGP4QtD6svpLbkYcJHdlXNcTufe8uToev4B2zu0pOv5MxefKYNupzPsAAAAAElFTkSuQmCC", $J = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAabSURBVHgBrVd5TFRHGP/N24V1AWG7ihRb6uKFigeioo1XrRKrtkTbmDbxD61GqzQajxgTm9aqra0xnj1M4x9ajfYiFWqrJq22ViseKaKCByLsagUUkGXZXfaefvOOZT1QRD/47Xvz3pv5/b6Zb76ZYWijcc5NdJlKGEvIIFgIJvW1nWAlFBOOEfIZY3Y8CyNiC2EzoYE/me0UddFeEx6rxA9YMBjkrpo73LV3Lz9jc/GL1c3c7Qu2JmTVo3hYK+QWuvwJpZtlq6l34/vDZRjaJwFp5WfAV64AG5yJBVM2abWQ1FGPYSlGTE43oUucPrJJK2EcDYv1sQKIXIzvfo3c3uTF8s0nUd/gxIa5/dDp1zxIxcVgc+fioqkXzjbFIMA5nN4QXN4g6lwBOJqDGNcrDtMz7hHyUBHsUZ5X/GdHzuKDWDajH94y3YW0bx/QPx3uae9g55FqFF2tR9akIZH15as3EMTNBp/ceO7IThjQ1diqiPsFVGrknj27cWXwGCSEvEg8+htYaSnYrNk4HZWCHfnX4GwOUGWGl3OywBiHws1bhBCqGn2ocfiQO6ozxvWMixQxWJslLIJ8M10Wyx4cOoimN6ciqrwSer8fzEfeGI0y7E5/hGqGHRXGMHFLL/AIEV7UOwNYMykJfZM6aJ9tIQFLwgLUrhfeI2SzwT4xm6KuGtGZQyCpNST1a3K2RQDdrFtZgAjnVXK5JVlEMBjC9TovEgzEOrUrYqK1FpEqhkKLkPBUcX26FrBZIcXFgXk8MhkTxPLfPQMm//tDLNz9TP3tfWg70mrKZU3V/UPIKqyBx+dAVelE9Fz9odaA6O3FejXDzZI1U1f7Ghqgo3udJIGNHiM3KjGVmvGwDE2ML6gIlJ+oQhIbK9BlYCmcQSc6JAEDam8g0M+JqMQi8MBCML2cQGcS98eMfgT5TvGksapasIGlvgSJBETX28Gq6dmBArBuFmDSFBT8fRO3at3qeNO4mVJwvw0r2YMePhssvACO4Rw+lw1mKQDXRQbz6x+gU8Ya7dN3xRCM1Up5p2phNnBkC69DIZy/1oCyG3683S8dfC1VOnEcQ6fPwakSN346ekNWMGVeCtS+D5u5shypg6phbM6EscADnS0B7pMXEL8qHd5St7KSKDZWRIRcdLh8mP/5KdTZvcq4E+40ePH+hrOYfdyAmk3fyCTJC2diXXIFNi7KROfnOsAf5ApCLbDlTEPR+CU4nP0eds+ZhRISHdsMXIufjY1dusMd8GgCMoQAi7g7d6UOSqhJYQECLk8AeUdsmLT+KvImzIe0YgX4+s/wRsEm7F+YSoQUiEEFPvUaGxuLK+Vl+Pnf33Gz6haeN3eW2+qoM6Kk8QZNS4cmwCIEyBHRRIlF0ks0ecjRaAO4wSDf69Rn5VVOzP7kNBZcTob16+9oXJvRZd4MxetgC7yEWCIy+zhyk7OQbe6OF+MTZba0F1OxcuB0mKNiNQEmEYTy6J2odGPbP41gko5AvcAkLbyf2Gac2ILXPLfUEuUFeyMCB34BHzUaoZdS4MtdCPMQJYWLIBQp0fQ8rWQPzvX2Gb9UAl5XFi6H7OrepLoK/M5tdGyJWLsQYCVkdI3X45mwk+k3fYWD/ku0Ig6Vs6GusBC6aTnQbfsS9WlevJAcngZWEQPnxZ1Ikd2e0+NZ2KELdzC+/wjo9XpKxUEYDNHhdx8dL6IcE+YpFgL+0kpDXjBETmfgvlJbrTY6BevzzsPhcMiQdEr+9/p9yIy1RH56TLzJhxIHmNg7BtG6pyPXrDyqD5b9cBklFVVotDuUdaHiOmZmvRr5Wb6krsvfipLJqMO4HkY5w6mr6lNZiMZ6b20fLCry4Mc+o3DdZEF8Ulft9S7B/cBy7KL5u/xgPe56oE5F8bS90clVZzg6xzCsnmBCp5hwF8vLsbLMK1ukreI+Npph0cgEotQ2FWincY0fetK/dFR8JPlWbVsWuSMSGfEc1NR8vNKD7WeclAXV7PBEPaGS05+BXMwdEYfhKQbtpRUP25KpIiyI2JSW1fnxRWETat28jSJ4BD/tC2IkLB3ZEanm1nfGj92W17lCyL/sxh/lclC05ErWmuO0FlCfZ/cyIKevETFRUiT5NCIvjqzS5oNJLQk5afOi8KYP1oaAWptpFeRL30Q90pOiMDlNEN/TtBWtHExaNfVotuVhZ61AMMTLav285LaXX6zx8luNAe6nZ63YFjW+2mdcOZzu4k9m4iC7k7fhcNrmCc5bjuevEAbhGR3P/wcSWsUn/c21NAAAAABJRU5ErkJggg==", e_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAW2SURBVHgBrVdbbFRFGP7O2ful7ZbWLg1CtxhuhkIDETQBKoo+EKP18iQP+OI7Jjz4BrwZAgIxJvpgBH3Q6APERGrQcC3EiDEFrCQU2qVcS8t22712L+f4/3MuO7vddgv0T/4zc+bM/N/3//PPnBkFcxRd10NUdJN2kXaSRkhD5uc4aZS0j/Qc6QlFUeKYDyHgCOkh0nH9yeRbHounFfbYBJ4mxWJRz2QyeiKR0FOplKhz2wxyyIxeVVFmAI9QcQZGmIXk83kkk0kQmKiLwYpi9Rel0+mE1+tFQ0ODqEsSJd1K/aM1CZAxnt/jFngyp2F4JI6gnoSqqnC5XKJklQlomia0UCiAooG0GkAo1ICFQadM4l0a0yfjqVU8t8GvjeTw8fFRXH80BZ/PB7/fLwiwdxYBVq5zG3+z+j2YzGN3TwyXhrOWeWG7Mi9UCTwkh/33Wxns/i0Gr8uJlnovHA6HDSYDy9GQy5DfDReN2Xs6jlM3MzKJM3JOyBHYY4H3j0zhYO8kwnUuoTqqA1vvleCs9BBjnwu6cKB3Alcf5mQSe8oImGHZxfWRZBGfXUjA6VDR7HciryvQFXWa97WU0ytHY5sDThG9fWfiIp9M2WVNhSp5L+THqymMpDWaUweBq8hpRACoMF5drG9cctTyNFYjCL/bgURewdeXk3J34bBqzsdH/PKQvD85kCUDqlD2Pq+p0PTZgauRMAgYNoq6Ye/UrSzuThasrjsZmyPQbbWcj1KymOBTxH6qwEYAbQaweHIU6VyqKgmOGkeAI1iAImxywHtu2KtCbO3c2mW1nIvmBAFW9mCC9huRA1Tntc7r+7uezzGRjIn3e3cG8H3PF8jmMkilE/jmlwNIZ5PiGxPgKZ8gkxwBy+7F4ZzMtYsJ8MaDgqbjZkwz59nonC3wRkQGzBD81X8WQ0MD8LmDSMdO48UlE3hnQzt+OPUV7ZA5FLJp9F4+KfrytKXyOjJ5ERI7fx4kNcSzdkw7mUCEa9F4QXS0FYZmiwY5lvuPbmPt6pfFhlO/oB2Jh/+h0ZnGB13dGBzrx8pl63EnFhV9C0WdxpbsyLbvThYtAhHVnAtMZnUjgexMLsWJ8TmsQw8GoJBnCfonjI3T5uR2Y2zwH6jZAdyL3aYpKiCTzpj/Bt1MCMmWGYX7CZtAyN6IHKrRW5FHVGR+a8sims8igoEAkLmGbJ625MZO/H29Dx6nF+PJMXg8bpRLyZbpGoLukl2GFQeHJr+j+kBJVixZgxs3r+DihT+g+DdgJL8Nj7UtSLjbUId6XL3yJ8LNizFdlLIy6Lax4kwgKrwLqqi10tet2IT6uIJff96Pwf6fsKg1DG9Ax6PhXpw+9iUWN7XhrU0fopa80GgHPsq1K1xzqAo6wq6ag1/bvgNtm1/C+cEb+HfoMvqGLmH0cQL+jlZsWb+95vjWOgcCbptAH/+sz5Lu5Lc1YSeujVrr1EyiirgsX7kO4ecjtBfEsWThUownHqOjbR0W1LegqaGlCqSUkFRuWFTm5DmmcgJmHnSv9MDP380Tjj2uQhqCCwQ4S2NdE5YtXj0DuMzD2JzeW+WVW0+o5un1GL9xdr693G31nx/RS7beXOpGOGCH/yhjW2+Hrdb3V3nQElBQCt2zMCnZCJPNHR0e+eM+fhir3zgsHuE6R2HvZh98Th2l/eQpSZje899k10aP7P0R64Aqn4j2wlyS7Y0OfPqKF14Hz5tuGpo7CfEzEsPEbwyfbPSis7TCoiYWygiYubDV7CCy9eA2H8J+xSCB2iQMYKuvhmbKt/2v+/BGexn4VvnWVPNYHstomEhlEXJMWURRiwT3ycCD+oAXAZcig087ls/5YsJn/lwuJ5TPBTIZy2s++/Gfki8nFUSjmOFiMpsnfDU7XO2uRWR0uh3ZSpcR0TaDHJ7tajYXInw5Pao/mYybwJFa9ud20kTZ9fxV0rWYp+v5/xBdVXH9t2CsAAAAAElFTkSuQmCC", t_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWWSURBVHgBtVdfbBRFGP/N7N7R3vWuS5FUaYEe/xSR0AAPRoXCiy9ChUStYiJPxsSgaIyJL4ZqfDDaCFVEYmIoRhOJGCEmSOIDYAwRFK3GEA0Qj/onCAK99u56t3e74zezs3dzpY2Flq/5Oruzs/P7fb/v27kZhgmaEMKhZgN5B3k7eRu5ox8PkqfJ+8mPkR9gjA1iKoyA28i3k18V12d75Lu4UZMRa+BrzHMvidLwd6I4dJzab5X75cx4RLZr9cY0Ng54GzVHEMiszDtzBsWPP0Lpq0Pw382oN8OXhf5n1d8Bq+E+1M/cBB5tNadMk6+ltKT/lwCBy/x+HoKLTAb5HW+htGsn2IxbYM1tBduVArNiYCyi3ylBlDMQ3hD80gXyy4g0PYT6W58Hj8w0SWwkEv3jEhgdefnkCeSeehJsZATWkiWwGhsB2wJejhP4aOaBEkK2/gjKI2fV9LE5PbDjK8ZVghvgjgnu7vsE2Q2dsKZFEVm+AlZdHVihAO4WYTGXXiwaTvfMcM4RiS2i1kb23Ca4Q8dDGBWgWRPciGFbCF46egQjW7fAnjULdksreJFAFLirrhkr1gIy3RcS0v32NHo/2oz8+adRzn1vkthWkwIt/e/y2h8YQG5jJ9jFf2Ava1cMmfzTRccilIJ3EhjTKmkQQSrIfa+MUv4XCD4DidsPUe0kw9EpmQpuRK+s2PMG2B8DVDyRIHLpbtCy0ElyhmKti+o1ZyWlgBzHuQfLpprxL6Jw4W2T7nNKAZ2Pq2H02ZXtsGVuEgnYrbPlgCByFkTIoqRAXxK1HyEzRdBKBCr4Pn3Cxb/geTl4fgyJxV+HKsiVMiUV2FCJ/v3dSnLl+TyYdBkxKcAKMvoCVadLs7tyNLXF4Fq2+r6qiFYgrAnOqM3D/XdvCKeWdonVEfb4h78Mck7hcqIurlzGaUmCwCHBiwRGxagA/ZBAsfbeN4ioZ4MEXCanoGje8vA3Zho6pNrtSrVsFhg4TwRYIDn54StXcSSTRc/MJqPQbK2A0B2s2gjUpkUUKPcjKn+cUUoounLxR1onqJ/XyYHtkkCbiv7nfjVHRvgYFkEaPiy4OObmsEVWPhWlY3E4IqIlH2XCvKHEo0QKeNXyYEEdSRWE+zdY3TzZ22brXJBSQ2psjvyl4Tw+k3JrS124hJRlYb+TwHJRX0tAzirEKCb+NfxkWglaDffdP8EDAo5dGZHPKgKzaRXb19iAF7N5bM8X1KMOiv6g04BGetvzPDzw2zCuy9TyDEVUivL6DIblejmQBOTn4PBUCubndIUGO0TGIdBfCbSRMUzKwhqhNhapLEaDMtVp9Xz+wspYIgnXF/hhehKnmpLoqoviRLmMqbKFjXeFl2ol/EkRcBwiMV/1Fij6vmSc8s7RRJH3NsSwmGpgasCXwuKVufolgaPhndX5oGrjBGrLajVeTE42BXqy1bPWm73HJIEDCOoA/InNEIzjZhmHhTUtNQQOcL17Vesjlz+9XY/WftKTNVH9Su+f04XmWGWr1iexw3B3hL32q69BONOnlgRZc30LNi14xux6Rf5TBPQWqVd107bL3rMXgopO/bZjEqajr6P9Y/fKD8zoe8NtmZnwboSf5D33gvfurBC4ISIaPGbF8cLSHsxL3hk+SWss1BDQtbBWDwB/+BHw/bQ5nj2nAj4hEqIK3lzfijfv/pQqf50JvtY8NdWUvJZlI0IlVq0GP/gF0PWYWt0rSojxgaXZtF1/fMFWvLfqMBYYiw6CbXm6BhNjzTXGwQS0TfN374J36iTWPXu2+qJeYjl9vi3xeei4bT06525GMtpkTpnGRA8mBgn5K9lNvnX0s1x5COeGTutxPmweRVtiEeJ2cqypZHF33/BhVR9O+8T1mTzI7pjI4XTC66uoHs/XkC/DFB3P/wMtLPmfcSS2tAAAAABJRU5ErkJggg==", r_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUHSURBVHgBvVddaFxFFP5m7t2km82mK9X8NGm6ESmCgkkxiE9JsA++VFL7YB+qFVFRKhKsRfSlig+CLTZVFFGKyYM/qNAghVik1T5Uq1BJg/TFVJfYorZNstvuZvfu3b3jmXtndifJbpPYbQ98O/eenZnvO2funXuGYYUmhIhRM0joI3QT4oSY+jtJSBAmCCcJY4yxJGphRBwnHCTMidXZJ3Is/q/JiBXxEiu6c8JN/ypyM2PCSX4n3GunhVe4Vk3IQZW9isaqkMep+R5Bmn0rulfgXB6FmzoOz5nyR+rBQv3w+k7Y0QGEm3eB13WYUyYIA7QsiWUFELlc3yOaXKRSmP/9bbihI2B2E6y6NvDQOmJrAGMhNcYFCil4xavw3H8IM7jS+Cga215Aa0OHKWIbiZioKmBx5IUfTyHz9FNge6Ow+u8Bt5qIVPjDGKuUOQUvizMzU/jwkoOhnrfQ29pfNRPcII+Z5PkvPkd6cCuspihC67thWfXgzCG4sFieBjoG8gGYAueIRTfB5jZePbUTxxJfaho/QPOZ4EYA+zS5e+I4si/uRqhzI+z2DnCRD8gREDNfiEHo3wdiLAT/CerbEunAHZE2HDizB5OXT5si9i0QoFI/JK+96Wnk9u6hiC1Yra3gDk0onHKEKlpWAb5fZUfeu8jh9gZ6ZmiuN39+HsncrOYd0q8oN6L3LffOfrC/psHD4YBcohiQLyR0qkIuk6DWJeEeCmgIRZCkt2j03H4j4UHAXK3Hkzr6wmef+qo4PWU8T0QkgAkFisgnEdTSsgRwytdaHPnkErjkKxCKJEI+7t9Of4WZ7CUtYJfkllyD2uOMHA7IJebnwSSkAE9PnJe9aM10q65lq+51FgT58zQuT76CHEuTFsj/zR+jms7f2iVXn/Z44+M+Ob1k4J4HNjsTCChqMoK3qK3iF0IuQQ6p/CxloBi88IRf/j1hLkOfjeDDAkHRivNT9BTDf8f9/uk0TejRNhimDoG0sgnVsnIjyv8JwZB2U8gVs8GuqQRMXf0N2UIGYTsiO3bLWeN+9JOT5egNKrkMcNMLoy2lPr80Az5yKNCumKMNqWSsvHdfSP+pvXGu1oIykAmirvR18GirFVmFRUKQX+TLKRRLmTHnlNd/ZxL6NmaX/slk9DKVo1+iROa4uNS1QpPksnvYbiz5ZAb8woF3dS2gZKixGVEZApJSQML3d92JW2WbYvfqy4QUcNYXEImAbd6Mm20b6SNVZ63RtxNSwA/6znpoS6mjwKqWd3lTk/W3P2J6T0oBY1DPgf3scxCN0doSG2ZRAbOlY7vpGuOqeg32x7VrwXc+jpqaKlKkPbzhMbSUK6QRya2/hsPaa7/0MkR7e2kJapWNlnA7dty123S9IX98AapEOuS7KQv2R4chQiHcsKnoqbLAaz0foLkc/SFdlpkV0evQr+T9veDvvQ+PRPhZEKvPhK4PQ7Tur3S/i7tv69F/JRQXFghQz8KA6gC+bTuso+PAhs5S2S1WoKJUmNJ1M6X9wINfo2/9VpN8wDw1LVuW4+IFeMmPIcJjQfFh7uvmOEMAeBTJhh2oX/cMIlTKG+TXL8sNEXEsOpigcBFe+hiQPkq1x7nKCtb00j77AHjsCRLRZE6ZQJWDSVVTR7Phioctz6XS/6wQ83Qky/wkPOc8+ZxqR7Ph6x3NViJEHk5HxOpsThHHl5t/xR89UT6e9xPuQ42O5/8BQ69SVUX1B30AAAAASUVORK5CYII=", n_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAc1SURBVHgBrVd5bFTVGv+de2emM9NpO8XSDW0L+MKLfWkrW0tefYBFFsnbfL66B7eoqIk0rviPRWNiINiiRDFxoRjjmqhBI7gBKtaF1IoIKdJ2ukFL2+l09rl37ly/c+fe6aVMCy6n+fXeOeee8/ud7/vO+c5hOM+iqqqbHv8hLCVUEcoIbr3ZR/AQ2gkHCO8xxnz4MwoRlxGaCGPqbyuv8L7nGp9NQ8xn9xhhw+Q2X3QU/cEuSIoEgQla3cW55XBZs9MN1UzYNJVF2BTkZfTYh6SZtXIq1IfdXa/i4MAenAx56JvEWf3muMtRcUE1rp53BwqdF5qbPITlJMJzTgFEzv37rkEelP14q2MH3uh4DtkZbsx0FCHXnge7JRNWwar1iSdk+CUfgoThyCBZaAQrS+txc/kDyHcWm0X8l0S0Tylg8sw7xg7j8W/uRCQewlz3JXDZspMdGP+vmrqryV9qsjYaj6DHf5x+C7h/wRbML6id0hLMRM59/oNBHg6H8drR7egMH4bFIoKcrRExxlKUKRm8TtVr1GQryEN9gS4MBLuxcdEzqCu5yiziUiMmzAKaoAecHGyDf+AFCK41EJw1GJK8OBH8Ecf8bTgd65uQrjLo3BO20AVoT2rvC5yANzyMzZe9jsqZSwy6ZhLQkBKgm75bk+fxYOsT/8Q918dRNqcSTHRAtf4FasYSJGzzMSydxtHx7/HD2FcYlYYMRpMfJ4zA2+IJBce9h5EpZmHX6oPmlTKbu8IQ8Ao9bubvn997N27d8QJQnI0nHl6Ma9ZmQhSTMyU/kIhLCTVQrBXwykFNyM8kqD90Aimf0IvKhalJS5wM9FCA+rGypB4PLthqCNhGAjYw3fdjvCbR24tgzUKEFAXPMgs+nJmPogILNjXkY3GFVSNgOovK7CRkIQnhgqpxMjaII2PfoZ0EDYS7UtbgOBXsQ0QOQ1BFvLaqFXnOIt7KY2C22NjYeC2SWyxiL78I9YsDcNL75RR0/3LnoN0fx9MfjGBwWMJf5wrIdvGZKSQjBiHeDVFqhRj9EDlsGHNdFVhSeBsqc2vhFF3kokEE4j4E5DHSkdAC1y44UJX/d05nJ3Qws/lDl/8D7MgRiDQ8WZ2C0AWWlY33YhI2hyOI5IhouMWNdf9Lu+PpwWlBnLsoow6KpQJDUS++HNyNr07vRXfgGC5yXoyXr9hnfL2TC+BLr0qNxxEqzoeFe5ocLuoRypxOMLsdiiBgczCC5yNR5BWK2PFkEbnFhlT8p/xv2J7HQRRxy2LIGVdAFitxKhpF69DHWFfZAEHQtvB2LoD7360c+h6xK1dNzN4QwD+zWpMgYb0UH5siMbxFuOHfWdi4/gKUzrJOMgPfpmXNVXosQlFtkCyXEarhKriOhtP6+DiPllLVUChJmC47yDLfmTSU0PtLVhEv2kR89s4oll3biWdb+HKM6YjqUM70DCRYY5/CHngSLLzHqHZbUl/EoqkZs1SnSUWbSnLgXDKhQm7zUZBGonGqUZCuMNPmmPKW4Eq1cwF8ObiF0rIzKKfK05000Hp/AJ/EZNSvzcYzj+WjIE/EdCW5hWQiYSmHZFsDq63KaPJxAR5CFSspnXYQH81+WziKpwgVFQ7se7gQy2qc0/ZRWRbtEVWQbSsgW2vRFezHoeEDuKHADt30Hv78URPgcIDNn0/pqO2sgd6XFdw+HoCaQyvhwQLce1NO+ljRSGnF2JYi7liNhHUReiMD+HpoDw55W9A5/hMKHaW4TXzI+LydC9hPWMd/iXUroOoCuMs6lATWB0LYL8m456YZaNwwA3m5YhpSF5FWQ3GsoZ2xBr3hARw89RHavdvxS/CnZH7Qzy+1RWvMXQ8YWzFPRG6Mj0OqLIefor2Jltl2Mve8v9mwZWM+llY7zjYv5QPZcbWWHwboENI68jEOnv4IPeGOSQqTAtSEilfrWlEwcVrKtfC8TCJa6Md9yMlBR/11uLKpCUGnikfuz6N1nnuGefm+H7evphkvQX9kmMy7F9+NNpN/jyG9TyYS5sqL/m8m38m5z0rHPp8Pj26owaN3KCimHQ/MgUTGIiga6VJ4wj34ZuRTtHn30xnhCM5ZdAEF9lnYUvO2WcBEOtZFNGtW4O/RNkgju8inFBO2BegOn8S3o5+QifeiP9yJ8y46uUB/W2vewSUzFhotWirmL1MeySKxMFo6nqbo/YxM3TnNAX56ciuzoqFiC+pmpT+SCUatXrFc/wCODCdqL1wFSZX04xVMyWZ6YoM835E0+yTy5eY7wjmP5d7YMFqOb8aevjfPXPssDXGqSUD9nLtQP/duZFqyzeTTH8tNIsow6WIyFOnH7p5daBv5Ep3+nyc66mmY8xdllmJF8VVYW3IjcjNmmof04HwvJiYRPCYaoQemuYTifhJxVP8uAZEuKLOz5plnay7b+Di/+7KqX053qr+t8Its8x+6nKYRYlzPlxEq8Sddz38FjOikscpED4QAAAAASUVORK5CYII=", o_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYVSURBVHgBrVdrbFRVEP7u3Udftl0KioUCW6A8EpquCpKIKVRMFASkQIBKUPkhgT8okmgwoIj/DPLwh8RHoKjgD6QF1EpMFEgUBeWNpUCkS+kDlrKPbru7d/fuXuecvXf37LYL5THp7Lmdc+bMzDdz5t4joZ+kaZqNhrnEU4kdxHZimz7tJXYSnyE+SrxfkiQvHgaRYTvxFmKPdm+0k+nebX/pDoZZdB8Qv5U+53IHcKXFh3AkClmWuaxizEDY8rP62mor8YeZEJEyGLfTcBhxmDldvubBjv0Xsf9wM662dUHrrYWKsoGY/nQJVi4sh31IgTjpJK4iJ5x3dYCMs/zWG8a9fgUf7zyJT749h0G2bAwdnIfBRXnIy7XAao5HH1FjcPtC8NDatpvdcHmCWDZnHDaunIzHB+WKTlSTE2cyOpAe+fFzN1Dz3i8IKjGUU3QDCGKNVCQeLylLhl4qEoFgBBebPXx+18bnMMUxJCMSkmCc5fy0YXx3wyW88dERjCguQNlwG20m6UalhFHmSsKRuICPXEbj5RYv/mv1oW7Ti5hVaRedeMKoCdGBLdAL7tfjrZi56icyno/SoSyXsu6ulPSbhy3pO2gJZ+JyA5IYrx23T8EP22ai8skEElvJgdUJB3Tom9nztQ4/nl9xEB2dQTw1/jHdqGFISgFOkkT4Nf4Xl2kJmRqN4lSji+onC+f3LhZPSilLhR4aP26cNn7xD5zt3bBYzAiFY5yVCLExRjQ+hsJRqo0oH+NMMpIH9XVcj1hVgUfysnDjdgjrPzsOgTjakp57jxH96Dl7eBgFpDSMUqBpUjLvEPKejFsoSwENIR3O9i70BMPIscpo+XmpgQKrgVKGwFxDbfvef3XIZXSHolTNUYpGiFCJR64IkSt8VAUkognkQjoSYVXjezJ0Pv3uvGGOt3Yz4r2dU/3hZj3fEmIxoNOroCDfGpcREmPtBZg+qTgRfyCoIqIEUWjLT2DR8Md1nkLjRHQHItQnjOKQcOhYC95fPtEwOZU5wBoPX3i1zY94xccLz08GYqSUnWXiq8fZC/HOq+X8eV3dWvx+6xDUiAkLHUuwqpIXNZ1/L5qcPm4vEFI5I9k58HdjJ5flZjPTcLBfO3s6fakTyWpH4sj10OIwdTqrReYdj1E46MaaSUvIVRU5tG7BsCqEQwFYs3P5mqBCOgS/GtVrgdtne8dPCmvlE0YVsRm7Wc8FunrCSK5O7dBsU8ZsU6WnHd98WYemVjeWvVRIchPWrd+NaeVlWPr2Yl4DAaqfJKWWK2Nn0gGb2Vj2wq2T8DvfhYkikoVEpJCrBrdda7G9oRtmQqSy6StkD8lBq2cG9v3Vhrk3e/C9awd1lIYUtZjAUaoLq1ZmAA/mADsONnmEHXd4O+tQhOHvacGiyhMo6GxCTrMVijuIGSV1KBo9Cqoyj3IW6KUmYsrHvEeMKS/rA6z/OzSfD0rZSEIAGRE4P60Em2cXQqMca6bB0BrPQi0yIcs6Ct1FIcgmDzbsiWH8qfYUPS0Ngax2FyQzB/8M+z3LHJAKCyGNGQNcuYxMZL7ShimHfDDRqVCVdgy1lkC5EcItNBKUFmgyFSs7gmmkCaM0YYJhPOHAEeLX2H+mWXOgbdmUoiSiML5NI/YLkou4G2lpozz7ZXH6qNGKWQeyxTo6oE50QKYGnuwGD0bGu5GngD7fLCdOQho23JgeIOvv5V3cu+JiyAsX4WFTIvqaV0Tjtcx2r9cxqBgjkydC9rgTCNwvCprIZNhUf0B0IPk61j+RtnExFaN5Ry00iwUPQinvxpwcmGq/Fo1vMz7LMn6Sxer3IbZiecpxvBckErnPy4O8aTPkeQuMKSeETzLjgwS6oEpfALl6PocM5HV6JffHcBL2g+nGq8Q7giwq67BU6wshPfMs5AM/AotqeBVradynUcbsnK9eA9NvRyBVOETj1el3g35fTHC9BbHPtwN/HgMuXOitxG5IpSOBefMhv74MGPSoOOtEfy8mghOsJjYQv9lrssuXdIJ9hluskMaNBQoK+9qKFfeG+76s6pfTWu3eiF1ktz7Q5bQPR4zr+TTiCjyk6/n/nF5ZE2uNkGQAAAAASUVORK5CYII=", i_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWESURBVHgBrVdNbFRVFP7um+lMO20fM6X82KIO2hA0JoCwEKMpLvyLG0AQozFuVKIbNCQYNwILokYNJdEEN1IWJhIWumAhmgiYutD4A0lDSFBboUmltDPT0k5n5r1513Pue3fmvmGmtJTTnN479+875zv33neuwDxFSpmkYitpL+l60jRpMujOkQ6Tnic9R/qtECKHOyEEnCY9TJqVC5NjPPdW64s5gNm7/aRv1/ZNTJcxdN1ByZGwLH+JB7tjsFusekv1kR5sxIhoAJ6m4gx8mpWMTbk4NjCN04OzGBp34XnGbOkXa1dG8cj9cbzea2NVR9Rccpj0CTJi+JYGEDjH9xsNfqPg4YuzUzh6Zlp5eFcyis72CBIxgVhEqBUcVyKX9zA5K/FfzsH4tIcdmxLY+4yNrmTUNGIbGXG+oQG1ng+OlLD7+ATyJYkHuuKwE0SxFBBckNdC6HmhVTBb9HD5mkOLS3y0M4nH1rQ0ZEIY4BzzPzX4qfMz2Hcyh+V2FKuXNUGh8gSFKmBiqiaJ4J8MDJIYGitRuBwcfjGF7RtbTSM26D1hBmq/Br9wpaTAO9qa0NXRhJLHgEL9SSFq4uajsxFSioAO34jujhgKLrD3RE6FgvdHgMFY71QYCKgf4vpIxsWuo+MYnZLYcE+cHLf8YSIwAH7cRYh0bUYQj8AI1nLZw4WrRbTF6IJ4dzlSrRE9bTWHwjK8V/L5j9MYyXloaYqQ5xZ5IFAsC5TK1bJEbYVAi4FyndtVv+eP5XaX1miLRzBZAA6dmjKpU8dbBLHPau+3fDzmT2qOoivVpHxTcdc7Loh/Ne610ZAVXmTAxkjGQb5Ypu4yBt5bjm7/ZPAeWM21rXr+let5PLWWAS1Eiaml7f6awb4LqK5FbSCyui8zKwQcR9DdYeHS1TwZYHOPutrZgF49pydVwPtPC3DYIxEuPSoj0PH8Z0JgpS2RaKqPWaZh/2YE7lvqG8kMsJbLIHChSiFmqcfWU3p5D6zXg13XVXRbZIEIKJcBpTmad/C0QN9ZgbxzM/gstX16RuDQD8D4DEIG8Fpay2SFp65RJeuZgTTXHMcJDdSqF0q2COxc56F7CSoMzJTIM7KvnU5XC7VtTkv0LBXobEUFWIu5Jjsai8W4Oc2bULlYLBaRzWYV5cyAZsFcxJQp2tWfDfB1DOx+VCoj6olmgb1mZQZs20YikVD9ljmw1vNa8BvFat1upovG9r03wV0vbIC5llbLqn41OQR8HJLRaLTuRC18jvt/EehZBmzpkWglBnesk+q0sBTpxvvuksDgKPAmMdLRGl5LGh8Mw4Ac14a5xtQ3optlCXl88Rrw13UocJZW8jwe2M1lJg+6QRECryeGs8O8B/qp8ir/ymQyKk7mHjCFQ9Ao1qqfWOITsqI93G7uAZbOzk7d1c+mnNUGDI7FcfK3grr/w7ffIkVdiBadGIlnH4rjuQo+zumrmD9EyamCxOYPssi7DGxVr8DFo5N6VHgY2JfCqlRlD6Ss4Lt8nH/ZzQK7NsUx39t2gWZgx8a4Cd7P2Dd9jpmFJw9PYmyaf4lFsqA/CHSBJQW+fq3dNKD6OQ5SpCNcZxaOvtxGOV91jcWBU+ZM2rczYYIf0WlZw5Ts578dvPLljJ+AVDKQ+TJRBY9aEh9uS+D5h7VH4ZRszqT0jysu9pzIU4IiEU6DxLzAmfYjLySw8d5QZlw/KTWMCKXlnGJ/8n0BJ34vBcNFY/wAmLfNG4/H8FZvswqpAT53Wm4YkUbNw2Qk6+GrX4v46bKLi6NeXfy7UwLbieqXNsUomw69koYx34eJYQTviQOke2r7+KRcHC0H4wBKH7FmRcT01hTe3Adu+7EaPE775cKEH7J9i3qc1jFEP8+3kK7DHXqe/w+6utXsWD0fQAAAAABJRU5ErkJggg==", a_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZTSURBVHgBrVdnjFRVFP7ufbMF2TJ0E0BmlRYjoWwwSidICd1EYxB+GKMiiSiYiBQjIN0EWVAkggRZMEb5IVGRUBIE/gmyEA0YiOwiZaXuLttm5pXjufeVfTszLKxyk5N73y3nfOc755Yn8ICFiKJcTWcZyTKAJcYS9YarWSpYTrMcZdkrhKjGwyhsOMaygaWKWld2qLX30y9aMKy8W8oyL3XMqa6Gdf487KtXIdu0gchri8iAgZB5eZlUlbAsbxUjntflYXfMK1fo7gdL6GbxILqek0XXc1OE+24+9STVLF5EVkV5Khvl92JDZDCu4vs93Bhrb+uWLEa8dCeMdu1gdO0K2bkzwN6KrCytwDFNUFWVFotZcW7eQO4rr6LtwoUwegR2K1ieZyZO3xOAh/KIbzx5/BjuznoZwnYQ6dcPRjR6T+QUajsNDbDOnQMJgbwvtyNn+IgwiNEMoiJNjxfzMt94fFcpat94DZGePVl6gXVBsBVe7C6ikEk1yN+kKh4l1eZu68IFWBf/Qt627Wgzc1YYxEA/J8IANsBLuMTBA6idNgVGrAhZRUV6kmClqcaF8FWQ9lZZJfdLT1F91oXzMCsrET14GFlDhvrmSljX/ACAR325pu/SJVSPHwv8U4nsQcWQ3goZokwvUjkwajRE98fg7NoJqqtzHXHxwHErOJYFs+wUqMujaHfyFGRTGItUKHy9S/3e+tUrgUsVkCrB4nEtMsF1IsF1QtdgJZGNnyIy/11IyRZv3XLn8jyp6mRC12qdZACyLYO9egX1q1YiVDTbwot9le99Vd9eMLhtFBTA6NadPVdR9ajXbR5bsw5y3HhXTW0tzLFjAN4JEF4ykhcG7lBM2OyQXV8POz8f7f48D9m+g5qlcqBIMTDdh9Tw2SZNtRLBlMqGet4BtvbMZwPMjDZ++xacfT8BrFQngxprjAdMiHgiWCOSSQ1cMtj4ls99c/poV7ZG+j3W/p/diUocxn77NoznxkJ07Oi6pcDk5nrJICEnTYaz9QvIoUMR2VmKyMFDMDZvgeRkC0BzeCSzo51iSR4+FA7DSJWAZeqocu7epTt8otWw1LE0sMRZzNWrms6zG9fJnDObnJoaci7/TdbaNWRt2UwUj5Nz5TI55ReJbFtPtZZ+SPH2hdTo6arzdCsbTmOjr7FMAYspKHZZWZDhQaarwizosOqDRcKYNx/OurWadnvPtzAmTWHqLIiu3UB//A66dk3PN2bPhsgvSNOpT87ycl97THqxgMMxb2bYK87uXSA+jvHIIwDvadG7D4gPF4czWhQUwpw5A+bgYtgbN3BIpnBfAez3FyD5eIyjJJvp8vXb5ReDPGiaEQLQjIUavvkmT4QoLIR4dggjcmCsWg0MHswBTUIOG4bIj/sgOnWG+czTMPv0hL2pxGWt8lrgULgWOTmB2Qjc7RCVfOLdq9BvJ1n5YIhxEyCLi+GcPQs6sB/G+hLY69bAWLSE02kUIr17wxw+NG29dzY1gWi6tqubkrC6Oi0BEymSHDWCnBO/8t1sene0SeaC99x2ZaXbNXVy2rp4SiI6yWSzJDyjUTHFsn9/tFSM9Z8ATLVKNr3vIxGOs9BJ6Pyw192mzESLOtiGusa9cloB+MX/ikyYGEwkNL9i0aMHJN8NQiWjSi4+D+yP14FOndJA5OuzWbsR7IJMelQdeWlGePiovobJe+/Zd+5QbTSf6pmmxnAYunQia9vW4DhwqqrIWrwwoNicNpUc9QpyHEr27ZVGv9KldNYW5pPd/LXk3kzcKPF74m/PTQcQzoNO7dP6NIgXXyBrxfKM8fcBNM59K2x8hw69ByAG7zom3nbxQfwqYyrDV/B9C+cG+CmWiX4tHMLcw0cgu3Xzh5uuY++JtFG3C6PILt0NkrJ5DtyvZDAetLOzkfP1N2HjG8PPMneSmwtBgMxdpdTQJjsIRaZwtCQB9QVtydzzHaW8kKMZnaCU57h1/Bg19unVKhDxkPHG3k+QffJEqvEYWio8YUAYhFNRQck5b+qDJAwk3pLhzh0oybtE7ZYU4wPwIIUy/JhoIKtWECeoaySDJMaMJnPFR6mGW/T8fr9my1jeSRvjdyGdOeM+RB3bTS5+QQePleZFJfey//yz6rHxFbWuKApK6P/8nGYA4v+ej2JRl0YMD+H3/F+WpR1YvSPhWwAAAABJRU5ErkJggg==", s_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATHSURBVHgBtVddbFRFFP7m/lD7R5cWBdpStqjxAfujYtJooFZjjMYoRLAxxBhD1PhkMeHBmIZq4os0ofUnQR+Uog9KH+TB+EBMkKiYmBBKVWJNqWtLJKX0h4bdbnf33ss5985sp9vtD93lbM7O3HtnzvfNOTNnZgRWKJ7nhajYRdpM2kgaJg3Jz1OkEdI+0jOkJ4UQU8iHEHCY9AjppHdr8iX3Xc6+WAKYR3eItC3zm3vtGtzBQbjJBAzD8N+Z99dBlJVlM9VF+t5iHhGLgIepOI3Azb44Q0OY/aoHyR++hxuJcKN0Z0+WTMLcsROF+1+DUVOjm6QOaCESkWUJEDjH9zsF7l2/jplPPkLi426I8gqYlZsg7rwLoqgYYo0d9Ekm4U1OUtspuP9fIQ+NwX5pHwrfeRfGxo06id1Eom9RApkjT507h9jr+4FoFOa2bTDIxcILemVznac0FkNqYAAUHxR9ehRWU9OinhAaOMf8vAJP9H6L2NttsKqqYG69B4JB2e1UEQpNqFL4IfGkNZfecd25NIgUha6o52usefoZncQDak7oBI5ATrjkLz8j1roH5qZKWFu2QPg/DZw7epjnBi/NRhLwfwIpIuFMTKD4mxOwHnlUNe8iWwfSBKTr//U7Dw8juvs5iKujsBoaYfiNROABLLFs0kR8Z8hweHAdB6m+83DLy1F69nd9pdRyKAz5cEi9jXd+CDEyDMO2YczOBpoISqE0wWUcIh4PnuOqHmjQPh70TSVhlJRAjI0h/sH7Ote2wJNB7CfV6G9sb4RJdbO0FFb15iDuMsw8rLQH5jw+76UXuNSfA4E3KAzD/8GJReEUFKDkj4swQuu4Fc+BWgtBevUlNvA3nL2t1JkMmSa8ivU0kWXchZDm0zMPC50v0jX+d2UonIlxOIkkHCI209+P4p2czf00vosJNCsT0foGeHX1fnYziYAqVysee4LUoXnguq5fJmkgxXNNmnkONKrG3IBnOgMLIdJGciXgrx6pioyURiYQ5lqSspkC1lUZWg14pi2lGoEwh8DfUtVLBZrNYK6iCPBgLYuhETKWY5wPUB080y4T8FOiZHRbJHMgagtnbK5FFIF8jHglYtu2qvqZ8AIky1yW3EolY6B97PefSF/hp6HZP3Fq5ASEIeMUZCDkLHI5epSZnqp5ERVzqeeMSsW8EYWmZsex78eHkaKfUGHKR1Q4I/Iio7R8/PFfsaGoWn1ZZ8h9uYefQgUVeKL6BUU6P+LN2Xpy814d/BhjL9iObySn8erpHZhOTQYbUK4ekAQ23FGFw029OoG57Vgekbq5XmKvRfv2z2ALO2CeiyckeIEoQPtDn+vg3epYZmjNOyCXZH15Ew42dAUGpKFVgxuFONBwGPeW1akvEYnly5KH0v7xs+jsP4jRmRGkV85KjkSQbi+sRvuDRwm8XgdvyXoo1UjMO5aPxa/g+D+dOHW5F/PylMgOzGLAQuvWN7Hn7jdQbK3VwZc+lmskwsi4mIzOXMbJyBe4MP4bLk3/teBkJGjdVhaF0VL5PJ6teZlW1HrdZAQrvZhoJDg/dJC+lfktmpomEhdlOxemYaO29D59tLrw5O5Y9WVVXk6PebcmfJHtyulymoWIup4/RtqAPF3PbwLMVHf5lHJ5kgAAAABJRU5ErkJggg==", l_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX+SURBVHgBrVdpbFRVFP7em2k7dKMNS2lD2wFbMVKwRSGAYmkwYXErxoSYEDAEXOJWg/rHsIhLosRQAhI0BAva8EMMRZHwA2ybYASDtgTBArUpikVJ6SLYvpl5i+fce9/0TdspBXrgdO67977zfWd5d9EwTHEcJ4N+yklLSYtJg6QZariLtJW0kbSetEbTtC6MhBBwkHQLaadza/I5v4vbFfZYAQ8QMxRyDMNwmlranbpTfwnt/NeIR2SLit6gosUBD9JPLWSYhVjX2hHauQORw4cRmTQZoQ83o6LyF9TUXXbfwrS7xmDejGy8vrwYwZx0r8lW0jJKS2t/LP8g4JzfAy54940wNNuAsacKSdXV8OVkQy8qgi85GQ+X5GJUIBkR00ZHt4HO6yHsP9qCHV+dxYrHpmD9czORn50GZauWbC8lEo1ePH0Qz6PgDU1XUV5xCD09PUgKBpE4ezb8ufnwBUbB5/MhYjkIRWxYNjA6LUBej8aDJTlYOCcPdafasOD5gzj2kxshYfNA/7rQPeAZ3rDvP9pMBr4BOYdAIACf3w/dMKCHQ9AtE+QJTCLQG2ISpGFbkOFfncgVFYxBgt+HRS99iy+/O+8lUeutCW8ENrjgZ5qvYc27dRibmYx8yqWu69DITT0chh4iAhFT9EUsTYAaYUuQMMKkigy387LTMTErFas31aH+5zYviQ0xBFRYKrh96cp1PLX2COXVQfbYVITJIHur27YEJ9WsiIoAA0mwXiJhhCwF3qc549PE3KffPIIuqhElFW4qdI/3Qj7+ohGtbTeQkJAgDLCHbEAjAhqDs1IEWJgkey+VAGlur3jHke+SmjQ1NSWJwCN4Y8uPnoBLh3WVj2dd73fV/EYfJ3lMGjLZiIyAxnmnGhBqyghIAnJOSAHKCFgqNdIBnsc29x46j5bL3S6BlYzNESh3ew7WtkA6p+OGYaGn10LYtAQYl7oWMgAqQlAt0Ms0l0PO3pueSFh9KVAkwkyAbJIr2H2wyYUTSzuvA6Vuz5nmdsyaOpa8J16kqSmJKMiVC4pmWyA00XZUCsZnBjB18mjEE4f+GeTIuIxEerDpyab0xmwRpUyg2H16/4Vp4vtmFZXPqdBVmVhMwJDtiCTy6rK7MZTYVDccKVZuW2SDldvKbrHGmwyHw/zjEv7bvg0+GvCpGtBc5Qj83gzfyRPSs7w8WGULhkIWhAU4IAmQWkJtpLz4Mvy0sJF0cQTEoqBd/hOJVbslOOTnoaHfZsG1wJG5eBH+CxfkqCYQ1ExHtplANA1SucfHgeTxkvtpNRAEMqJ7gWM7UUAXdMBOxS9zKm5BFK3YvvS+jYoJcFVkaAWFiKxaDVuF302BK/q5s/D9cFzyKCiAOVQKBvCWdSBSQNFJKCx0h7q4BhqoUcwTOjo6ogXoFmGU6V7aDTeuF21z8RKEPtk5XPxoEbqFmJmZ6RZhI0fgNBNgsM3VF3D89FX2V4FryExLxL735g5quHLfeRw5cWU4FAQJroT8rBRUf/CIOyAI1JGu5KeU5CSc/LVdEIAikDchJa7Zc63dOCHm35wAFIGZ947zDtRzHGog6wCvLCtCekpC7IsjJtLWa89M93bW6Or0uoefMijcq56cgr6PZ+SAWVY8WkiHllT3sYqx3d2w0u19e1UJcrOSR9h5h45mqVi3Zoa39x3+Iwiow+JWbnMU9m6aT6nw484j4Yj/XE7b35qDYHbU+63uAdV7ItoIeXrFQ8UT8PVHC+DnT8VxK/g2wEl8ZGLXunlYNDfXHWhVWIghoGqhTE3A/AdyUP/ZEuTTV+AuJMOnIWdOHJ+M7z9dTLkv8IKXeW9NMadiFZalaiJmFY3D4W0L4acDqZsMl0RfVJwByiFfu3wqGqrLMXd6lhd8af+7wYB7AZ/byThHQpyQA4l+Oe3xJ2DTSunUHhMbiyQQG5NJOWkoL82jL6kQ9wRjLkOtiHMxiSvqalY52F3LpquZaZpOQ1O7U3uqzTne+Lfzz7WeeFezyqGuZsMhwpfTKufWpFMBB29mX8Mwxem7ns8nvQ8jdD3/Hw/P58rnfzWEAAAAAElFTkSuQmCC", c_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAW2SURBVHgBrVd7bJNVFP99Xx/rukfL2AO2OTpAmYphGCOGhEwEAhFjEET/IOERjEH9A/5QI0EDxkT+wAQwgDGGMEyMBDSCJgSMRpeYJRoiDwWizNBtDDZdR9utj/Vrez3n63e3265lA3bg7N6v99xzfudxXxomSEIILzWriFuIm4l9xF5rOEjsJ75A3EZ8UtO0ICaDyLCPeC/xbXF3dITnjqdfu4Nh9m4n8bbcsVQ0AGPAD5E0oOm6+Zuzugm6qzyfqn3E7xeKiFbAuI+an5AJs0lGsAuR88cQ7/gRydtdLDQ6m/tEjuqH4WxYgLIn1sPuqVNV+okXEwj/uADIOOf3G2k8HQ9j8LfDGPr1M+jFXtjLpkEvqYTmdEPX7aYKkTaQjoUg4iEYg71mhNxzV8OzaBtsZTUqiBcIxIWCAHI9T9y6hIFTlIFkjLxrgs1VRkI0qUDihNWmEzEk+jtMQe+K3XDNWFAwEppinHN+XhqPXPkOoTPvwl4+DY4KHwnyP0E518Yil8ZFpiVdZst1khzohPf5fXA3rVBBzJc1oSs6dkrj8ZuXEDq9HfbSKjg8tdDSCejpYegiAS01bPa1EU6Yrc6tsORM+QScNJcdCJ5+G8M3zkk7PsvWqCNW6K9zPxnqQeDYeojofyiaPhe6pplCHHYZ+rExECMR4J9Fmr41zWxT6RSl8k+gyIPqV86oK6WRU6Er3ps01H4QYrAHNpsDeirjccZL7qs8rLAix31hjHzrIgVbUQmFdQDhtj0K6Mzy1qzc3za9D/eg/9OlVN2CJpVmwq+JTP5V7wvtHkLj/+ayFCP1wEu4B6lEBCk4UPVaG+zuCpbmGmjkdbRKzo/2UuXOWk6VQVpsNoiSCjKsZZU9hzZ7D7AACWQvDwWBNiUILclRFIjdvIyy2YtYwtzaGUCLnBPzNAEL3yEAugkgTa3GQHIc7f43hgPHr5krYjBioLaqGJuea0RtpSs7IGYkiFMpWptp2kJTiBLIslGRFgbQLIVTJGAjgzobtrzh3zXFs87eCL4404lXV81EIJxAcZEND1S78fGJa9j4rA8N09xjAPB8yWwjTWD0zBbezH993DMMY8SwylKRpMPfXsfGlY0UhShOtfXgy7OduNgRxBtrZuPgV9eyjOfqkpxMJqWYz27lwkQFM435K0yCiCdSGIoZOHd1AH91DSIaT6JmqgtVXieKXbYssLmkRsEir55PIDcCKhU7dRhJYdZpKJKAjToJI2220Xgqr9F8uiVxBHg5eDn3E6FQhDyuKMK8h7zo7ovBbtfQPMcLN3mvF1iebFCNjJV/piAD8BM32+32guFXaetLD+LD1qt4b/Oj8JY6ERtOo7HWjU++7qDCnIWJkMPhkF0/b0St1NnAX4FAwETKCNWVkEvdfVEcoKrv6BlCpcdFc9LYvuERAlKSV551co3JOqusrJRDrQxgI3WO8Ne5W20423XcXN+ZDYh/HT8q45LcD2gjWlq/BgvqnpEjm+RWzAeRN5QYwLofnoTBp55M0yTYN49pdp748yXtqHHXy5EpunUuH+Uvj7MCy+pflKAnh8SormUNa1XjrWx7zHE8ZISx+ecWBI1AZmu/3whYAGpcddjz1AkVwOhxbF2R9nO/1FGOHY8fglMryiC/n0hYxh2aA2/O26sa3y+vZQWvZL/cOo0Pft9i3pnuqRYt40V6MbY+thtL6lbLET+UK9kdL6WX+tvx0R9voS/WPXrSjgdESF0U9uJ67Jh/CHO8zarxxXkvpQqIrGt5f7wXR//eg+9vnMi+DWv5DWeGdLw883WsnbUFJfZy1fidr+UKCB9yHiZ9sRs46T+Ci4F2/BO+PGYi7xvT3T4srFmOlQ3rqD9DHfZjog8TBQTXxC7irbljkWSYQFyx5PggcqC+ZCa8zqn5VHFx77rnx6r1OG0Vd0f8kN13X4/TPEDk8/xp4nmYpOf5/4gR+gFn7Vg6AAAAAElFTkSuQmCC", p_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASdSURBVHgBvVfNbxtFFP/N7rqJTZxEAiKBaLpFqJeCCKVnkvwDqL0jhATihES5IS4VV4RoKqGqqpAablQIESSQ4ASlonxcEj4ulaB1Am1RIdhNYnvt9e7w3nysJ0scO63pi15mPDvz3m9+782XwIAipZyk4hjpLOkMaUg6aT7XSCukK6QXSZeEEDUMQ8hxSHqKtCr3Jud5bD/7YhfHPLuTpCfy39Jbt5BevYo0bsPzPNXmP/4ExMTETqYWSN/sxYjo4Tyk4ktompUklWtoLZ5H/NmnSFcr2wZLUzIIf24OxRdehDc97ZrkAfMEotIXADnn+H5sncvbt9FYeAfxmXch7n8A/sMPQTw4BVG6D2JfQY+JY8hqlfrWkN64ifTvv1B47nkUX38D3tSUC+I4gVjpCSA/884P36P+8ksQUQT/8GH4TLHUo3aiTlptNNC5cgUUH5TOvYfg6aM9mRCOc475snXevvABGq++giAM4T/6GAQ7lZJKoQcZILoUbABSGAD0j+vJb7+is7qK0oUPse+ZORfEUzYnXACnYBIuvvwNGsefhb9/GsGBAxDqz3HOAyW20SANGuVc11Rbh0FQaMY++gTBkSO2+wLZei0DYKi/xvV0bQ11ci5uXFfUeaqT0Axgl2WTAcE2EGmSIF5ZhqS8KV+67K6UgxwKz/w4aVtbb78F8fsavGIRXqulta1LYbXNZaRyQ/2ObF2r7q+/eZ0Y/tgYxJ83EZFtR05oJnXsq3b2W0dnEFDdK5cRPLJfx92EmaeVMWDjb+umIjWlWT6kVEnWVpE06kgISHn5Z8sC58BBZuBYNvuzZxTlSimTBaudcaRnDaqD2hCZ0taVGhay/sweMcIbFtvc2kL73FnrTm3t3D5rW9IvPtcxp+l6aQrxz7qhmB2R81bbOI6M86gLQtWjDIwNDdbXKQwdsiuU7eTS124YZpntGcXaxgbAsYfIkk0QYhAQjI5iT2JXSJPYaDZUk6dXKjrffQvJ4EZGuHmGAYRq9r/8lDn20A0rhwG006FQMImwgyNbV0kiNGgaI2jmrgjFAuUH7Q3i0CFuCgMTC8jaRjfZ8sIAWPkjHz5m48m2ROnsSlxnADmxtnn/SK//AU8DmORVoLA3aKabm5vwfV+dcKxC9Fv1g0lKgNgNlwntCxO0CkZNWJlttSUGQTA0h3nJ2+VJGqkxgIoFcK/E8aV2wh+5xpQ7yP43KVAyO4ysMICv7K/R3HIz6XFXwjasHS5H9PKzcpEBLMHkQZH2f7fzMMXay01yyTPn8vv8i8PAHYbt3ApP0AnzIvv+z3HMzqtVdTbd9VK09EtzkRkfH3cBdI9jc0U6beoo00noDr5T566wTcf5aXst63kla9F+Xa/X9S3IsDAoG/k8KpVKbvJV4FzJ7IUEpmHedFADGDU73Utiun0tmznn8+4boe+1nLfPZrOpGHHZ2A0A92GnnNBO/wr6XcsdIyFyDxMGEtH5HtOhlJrDxmWHhWPMuxw7ti+m3MwrGFQ4J0gXdnr0EQB6i8TblA6ZHk9EZWMSdypSP04X5d6kahyH/ewPvMhl93k+R/okhvQ8/xcgjgqfyFQw/gAAAABJRU5ErkJggg==", d_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYVSURBVHgBrVdrbFRFFP5m7m7b3XbbXWRbKG1peYhAAhWJ4AOhIRJQEyAGjKIJJCZGjAEi+scEUBONJkohUTCCINEQfyEEIj9UhATllyIStDzahT5CH7Db3b5272M8c/fe7bDdlfI4m7N37ry+b86cc+YOwyhFCBGkxwrShaT1pLWkQac5RhohPUt6kvQHxlgM90MIuJZ0O2lU3Jnsk2NvNz/7H2C5uq2kG7PbYkM30NbXjJSZAmfcrpsSmokSb2muqRpJ38tnEZYHvJYeJ5A2sy0dias42vIdTnccR0d/hPpYI8ZNCs7E7Acew/PTXsU4f5XaFCFtIBKR2xIgcLm/h1zwPj2O75t2kX6B0sIQwr7xCBWNRZGnGF7utccYlo54KoY+0u7B62ShHiyZuBrrZm5G2F+pklhJJM7mJZC98qboObx/5jUMGv2YHJyBkoLS9AAm/4UyXKTfRLp2yBjE1fhFeud4e+6nqC9/PK8lmAIu9/xPF/znq4fw2R/v0ArGoypQB9psG4gxloHM0JB1wqkR6VbQDrUmmtHe14J3H/0cDdXLVRIPuz6hEtgOx+EuRc9j468rEPKXo7KkxgEV6d5MoS4YHOxhWzgE7Ce1tyYuIzrQg08WHMSs8HwXrpHm3JQh4Ji+RZavD7Rh86lVuJnswoOhWWBy5cyxOhQi7lakEZV9HDaCbDMsExdvnkOxFsCBpafVSKmTW8Gdl61u7bcXGtE52AaP5oWOJFLWEHSRQopUvutIwZBlQWW7LemUk5lypp3UggG/txgJI4bd5z5QqdrWZs7eR+VLPBnDx2c22SyLC0tgchNl3jEo9BQhaQ0QiIx7DT6KADI+4nqMAExM8NUhQWVTGEQ4hYCnDBrz2BHUT2oaJgrgs6Nj/dwtCFIUIZ096zxIp1dbookbeCK8jDgnUeGvRkLEUF5Uie5kBwLeoG2NgDeE9sFmlGilKCuzJ4JGv8t9f6PSX2eXvbwAPclOjCusQREvhmUQTdqKlngTevtiLgE7tUsL7KPCWlnT2dkp/QGcc2ialnnmE5ZKUXTQLlJSEt6CEe1yLqmmacKyLPspHbqiosLtsl/6QL3b2e0ggTPhlu1kEjgeBz91EqzpX3g2vwV0dYNfuZKXgJzLVZeMI/WSQK0s6bp+S0dXc5HwvvE6WCwGERpjW4D19oLv2wvtl59uAc81n1TDMNxutdzZC5uVCpp3Nb//BvPpJUBbG1meTE8EzOnTIcJh8IMHM/1yiWoFR4I8VweXRC4yrKcHVnk5WHu7Yw4PWHcXMDgEJJM5QbPnVueVBOyU6PF4cg7MFmvBU+DNzWBkAdbdDfj88Bw4AFFTA2vOIznHZM8lfcyRmESNkNZLb88HqoooK4O5fAXMxYtRsJ58QU/BXPYMrKXLyCdCGI0oi43I0l+SgASXDYqH5idRWWk7nr5lG9g/FyAWLho1uBvejpyVeWAtFWQuwACZ1Th6BJj2UDocydOZoQMU71YVfWD0D4Anh8AuXYI5b156ClkXvWmHpjljBvlBKv2eSMCcOpXO5iQEKYtFYRQXo2DOHPjrJrkE1rmpWB5EQdCqEh99CM3DwU0Brb0VVs1E+9CRSYd1dcEaN54cwSBipoxd+hrRySITKA9chiilg0Y3YE2ZCtbRAX6DHDYQsMkLGbbXrsG3azd4IHMghTzyXCYS39DLBsqt8Ama+Ks9tneqp+/digxIy3nihRdV8P0Se8RxLK2gPzkfnFbL7pGEULW6Btqhw2D0dGT4OHY+kXbY1WQF7cu9sHw+3IuoqUiQc/PGnSr4DvezLO8nmXX8R1hrXwEX4paPoDshYJvf6wXfvhN81Wq3KQLlkywTD05Fg9MBnOJaO3wUINZCmXS0wLZWVYMfOZYN3qDeEbJTseyw0ukINm8+2LHjwEtrMo6kak5QqTLO39wA7cRJ8OHsaM+dfTcY9cUErddgfb0HoGMY58+PHCSz6ETq/uxzYGteBps8RW2NYLQXE4WE9IltkOGZLfFeCCLhhBA5GV1QJk8CGxvONZV07m3sbi+rzuV0v7gzkRfZxnu6nOYg4l7PF5HOxn26nv8HDOBApy0NJS0AAAAASUVORK5CYII=", A_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUxSURBVHgBtVdbbFRFGP7O3ijd7rLQlsZyO8RgGyR0NQaUl2IaLzE+4JuJGpsGE40GIUZDQhCIPGA0ssbLCw/tQ2N9MUhiI2qaUm2s0ZJuME1baWnpFbotu73v5eyO/8ye2c4eeqXlT77MnLl933z/zNk9GlYYjDEfFUcI5QQ/QSf4zO4IoY8QJDQRftQ0LYL1CCLWCRcJYba6qOZzl1tfW4KY7+4M4bi1Lz4aQrS7B6l4AprNJtrc+/fB4du00FIBwrnFHNEWIdepaETaZhFz/3XjTnUt7l35CdFbfQtNEyK8FYdR/HYVcnbtVLv4hGdJRN+yAoic5/eyJDciExj49CJGAt/AWZCPDduK4dpaCFueGzaXS8xJJRIw7oVhhCOIDQ0jHhpDUeVr2HnuFFxFW1URr5CI4KICrDuf+usfdL3xFtjcHNz79sK52ccHgRYRZXp2us7kGoTk7BxmO7oASs+e6m/hPfT0ok5oCjnPeZskH639Hj3vnMDGXTuwcc+j6YGcU+OTFAGcUUtXmLkkr6WoFr3Zg9meXpRe/g5bXnxOFfGEPBOqgIswD9xky99or3iZ8kjk+i4xSEW2hWlCLoIxZIRIzN7sRpzSuLf+B3gPPiWnBUjAiYwA0/peXo/d7kf780dg3LkLz5Nlwm7NJDIHz4swdy79F6RmepgoyAkjiam2IOyFBfC3/anelN08FTbz4YxsHTj/GeIkwu50kpoY+RglxOYRi4PFCdTHqI9RW7oemx9P/XIsDAPOvDwYI3cxcO6Cap5wWzNzH+YPcTrJNw6Ug6tyuN3I2b4NNiatzi4z+c9q5E2qAxBldHAIxswM3VM39jddlS7wM7DbgfTrVcSsTUPx71dht9sFHA5HOgUmVhPcfgmDXEgmkwKcw5seIl7tfLPlclKU7LPR1ZGETF45y4IrgRp8Db4uB+dQopwL8EuCVCqVGayKsEbf9K1MfXh2MKtvYOY2UiyFWCqGrsnOzCYkuBucxww/F6DzWoLeZlKl1XJVxNedAXROdGSeP2/POlgYi43hj9FrOBs8hfM3Ps4il1AE6DYzF5nGxfLNRVz49xMU5RThheKXaOfDos3tdGdZn+fwoH7gCgkJwa7Zs9aQa/PNmuFzqAQqMa9PGZPwOjfh1+GfhaUtoWZsd+9Adc8lVHdfwqv660jO7wYNI7/hl+F6RI25rHWsaVB5uAB+HXz81Ft3/tH140iwBIZmBpDrcGPamBbEPFw2J+KpOJpHm4TlB/KfwQfX34XH4cVkYhIHCw9ROYGvOr/AeyUnstLIucyIcAF9BD+/ctZ4zFsCDzkQ2xzF5g1b7uvf7ytDYU6hfEfiw8dPZfoeySlGlFxLseR98xSuPv4iqqHKm/xpfHxcKBXXJRXF4Fw/9nhKxM69Ti8eNOQNk7csPz9fdtVwKdekgFAohObm5qxctaMDaw31kFZUVKgCmsTPsPy/Nzg4yGj36o/ZuoKsZ729ver/Rp9UGJAtVVVVD03A0aNHs/60qhbpsjUcDjOyaN3JdV237l6HJU8ZFxobG4Vd60Wem5vLWlpaVPIArGGehYzE2tradSH3eDysrq5OJe/N5H4BEboqoqGhQVi3FttbW1ut5DqWChrgV0X09/ezysrKVRG7XC52+vRpcZ4s5H6sJKxOiNl0gI4dO8bKysoWJOXXt7S0lJ08edJ62Jbc+XKfZmcJ71v7IpEIgsGgHAfaMUpKSlBQULDQUl/ydR74Y9V0o4atLrj3AbaWj9MFhMjP88OEMqzT5/n/R7Zht8W7elcAAAAASUVORK5CYII=", u_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASHSURBVHgBvVddaFxFFP7u7M/dP3e3qXabSMqiD6IWrEFEBYlBQR9TRHwp/qDgi0LVF/HBqOCDoDQVfPHF9qlQhcb4UB+EpiIUBDGVVkEtrkmqFTW72dTduz/3jufM3rk7u9lkd+3qCScz987M+b5zZu7ZMxYGFClllppZ0mnSA6R50qw/XCItkC6TniVdsCyrhFEIAedJj5AW5XDyIa/FvxX22AfeIo1GQ1arVVmpVFTL6rrudkSO+NHrKdY24HlqzqAVZiXNZhObm5sgMBCB1mLL0vNVGw6HEYvFkMlkVN+QAukMzS/0JUDGeH9PafCrjTIu/7WCeD0NIQQikYhqWU0CFAHVMlHuJ2UZmV1jCKcnTBIHac2yiSd6eB6A/1j8Fs99/jC+ufIl4vE4EomEIsDeaQKsmhirnlcvruHPE4fgFM5p88p297kQBnjWDPvS6qd48YvHEBER5NI3IhQKBWAmsBkNs7VTYxChCNZPPo3KxUWTxBnzTJgRmNPglza+wztfv4RsbDf2pCbgQQagJnD3u84xiWhmgrZgL0qnX0Ft5SuTxFwHAT8sh7l/pbKGuXPPoEF/18dzaMg6wbtbAPupYNJuDZF0DoKei5+8AM8pa9zDeiuE4b2SE9+/h9+ra7DDMaJQQ91zyJTs8HI70WOKBK/x6rCki5CdBGobKC+9bU5XDgt/P57S3n+2clJ9G0JYaJL3DdRpC7wdgXuS8AkIViJB5lC9cArN8q966pOMzRGY1W+WVhfhWS4seuvIChyXvnmvprZAf+uDk+AtqAO0DRY5ItS2eKic/0hPU6mdCUwHBC4vtjKDBRX2jWZRnQGX/liYxKAK6SlwOEWKQlNFgLX2w2mT6zSnK048cD0Xl8oXlfeWT8Jxr1JLG+C5GFqYQI0OXaPaPhPUusWCOowiluZZBzgCee79tHEh8B7GfjtuRUVheHxK181qYC5oSd31n/W0PBNQSeFvSrkaH+jgAI+8GSb8rS3Qhtptyz5FofSLNp0NElGT9qkdga7F1yBtU1YQAcu+LhhnAqpwGE9Odi0ZnXRbtKJJ3S0xgQL3colJ/F8S3rtfdwtM4Dz3oiEbt+6awn8toewkRCShH5eZwJJ+umsPp4TBE84gItG2yGczevOD5vBZJrAA/xwcvOlZ2CJprMDIRPrG4nceMl8vCL96Pc5PqUgaj+x7PGA7IuSgtW+fhaDawpdjjK0/w3n99olbXsZuO4dRiA4/O2MRcPye583hN/ifIuAXi0e5z1F4dep9xEPJVhSuJRL+Wkkff+KhN03vj+oC1ayIXof/Se4fuxuvTX2AVgYn8TDUr6HKhj6+tMIE/hYi++7TwwUfCx0E/LMw40/A1A334917P0YuNhkcoCDN9gEP2tQ4Uo8eR/S2WRN8xrw19S3L12t/4LfyKsZD+aDcGoSAbdWoQk5Q2k2b4FvK8oEvJp7nwXGcoO7vJbo8t21bVdGGFLDNxWQnT/hqNt/rrkVk1PXM1B2uZvM7Xc0GIZInPSaHk6IPnO9nf+CfPtm+nj9AegdGdD3/B8FmByaDbrrzAAAAAElFTkSuQmCC", b_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUaSURBVHgBrVddaFxFFP7mZn+TJvuDjYmJZYPFBzV2rY0Komlf9EGwrSCioBb0Saj6Yh9EWvTFPghNUVAqaIugBVEL+qAgahW02tAmxQefmrUxMbZrsqm7m/0fz5k7szv7n5Qe9uzMvXdmvm/OOXNmRmCdIqUMU7GHdJI0ThojDevPKdIE6QzpadJTQogUrocQcIz0COmK3Jh8yH1xrcIz1sBNUiwW5dramsxms6pkLZfL7Ygc0dZrKaINeIyK7+GaWQmBIp1Og0BRKpXczkKY9qr0+Xzw+/0YGBiAx+Oxh0yQ7qL2ia4EaDD27xcGvFKpIJVKKXDHceD1etHT06Pa8rMhQBZQJZPjel9fH0KhkE0kQbqXSMy0JdA485lLBbxxKokewrl1yA+fV6guPHNpdZb1fyiXKkj8W8RKVuLg7igmxvxtLSEscPbTeQP++XQGBz5NYTTqxdhmL9vb7SBcEtKehbAJSLgeqWDuclEROfZMFA/d0WuTuMusEsca51Bt5jm8QuBDYS9GiEChIpAvCxTKDnKkbt0oPZeEbsN1R73nciTqw1DIi/0fL+PsXN7gxDRWzQLa9HNc/2u5hCfeS+JyWuLOUT+E8jM1Ew7ciQroX811eiDXCNJVbY1yuYLZ+TyiQeC7AzdiIFid8xi7wmPNXslC8ir2TZTho+CJ9LvmdVVWbV0FU/Gg8apOke5PagoVYHWcLJcv4eLiKuK3RAzUy6xC+36F33AELy0tqShn5YjnSGe/myVny5W0S+CGPln33ixLLnkV8RLmlcE6PDxsVhHHwBjbY4/pmMlkFKDRVqC2fDQNfHCm+b3dj+v2mIyhRaV2JjBp3uRyuboZ8wzsZGPr2UtAtsBWAGYXm783EjIEKGvanyY5BuIGgE3E5mlH4s1vBWYX3Hq6UBvl1a8ENvnc9w9ulXjhfllH2ozFyhjsFp3E4kwgxjX2k21624xmkEdvl7SugZ1bgWQW2P+AC/T2jwLDIYlPzgnsHZd1fWwrGLUIxBztC/XSbtwoPOBtQxJbIhKfXZB4dqJSneHTOyp45yeB7aMSQ/3NLmgkwZPVEnYaZymsjNeKSJF4XsnUv6fMSy4AekRr0EYL2OMyAZUSedPoFvULq8C5eeC5eyRO/FZre+wXgSe3S/z+N/DHP+1JVEGd6rxTnAc4/8fZBclksuMyfP0bgV8Tbv2/vJX9SPr1fnNfDDj4cHNe4PFZOQgHBwfN2DMchLNMgAF5BbTzH8sha+BpssT7PwvKmAL77pW4e7R9P1saLD3DtvjBPPFhwmbdicyOm4Eg+T3S2xncHofLQCBgfz5tUjFvRGE2z/LysrJEq4BpFI4J/npTCF0JGBdEo9HqgYYk4uF9mRqcoIeX+MNiJoDzf3JO0Ltel8BUMt+JAFSgVKRAfEsAmzdXwY8zdtN2fDUnMfnWKlIqYzp6310HidbwVQYjYYGTz/djNFK/HasnfUQ6yvWBgMC7T22C1zF7+rWKrHYPUKhPPd5rgx81x7K2R7IvLxTw4sls7UCAuubrBKeg80gcfqwXu7f5zMcErCNZx0PpmYslHP46i1xRn3k2gM9/oaDAa4/0YXykxwbf1fJQapFoOpbzFprP57uuCt1flbykg8Gg3T6Bbsdya5AYGi4mTITPC+bcrzrr7doIryJONLzWrXTbcuZdRV/NplrdtYiMup7Z2uFqNtXparYeIjHS43JjsqKBY93GX/cCl7Xr+U7SbbhO1/P/AZXfcsW4sXZVAAAAAElFTkSuQmCC", h_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASASURBVHgBtVddiFtFFP5mbtIka5qE3dV1u80afPCp6qKgqA/r+qB9EVsVrCBWQQRFsAUVBGnrsz/dRcEXwYpYrA92q9Inobu16JtuQcHSVmIbsUXW/BBvbnJ/xjOTO+mkm1+bnnAyP/fc+b5zZubOGYYBRQiRoWIH6TzpHGmONBM+LpHmSddIV0mXGWMljEIIOEd6kLQohpNP5Lv4vyI9DoE3iOu6olarCdu2VSnV9/1uRA6G0esorAt4jooTaIZZCYGiWq2CwFRdvcyYtldlJBJBPB5HOp1WdUPypAtkn+9LgAaT83tUg//rVlBYv4BEIwXOOaLRqCqlmgQoAqr0PE/VNxeLSE+Mg2/NmiR20jtrJh7v4HkL/GzxF7z43SP4+dIpJBIJjI2NKQLSO01AqiYmVdu5Fy+g+tijaJxc0cOrsa9eF9wAz5hhX7n4DfaefAJRHsVUagaWZbXATGAzGma5aZy8j0ZgP/k4Gl8eMUmcMNeEGYH9Gvz38m9496fXkIlP4KbkFgQQLVAT+Oq+NlI0TmQmi8iWGdRefQXeD6dMEvvbCIRh2SPrl+0C9v34PIF6mExMwRUNgvc3APbVQIDXHUSmp2HRuPbuZyHKZY27R08FN7xXcuTMR7hcKyBiReGijkbgEAHR5mU30c+ULbnA63VwzwVPJsHKJTj73jLNlcM8nI/nZOMSeX/8j8Nqb3DO4JH3Lho0VNATuCOJgLRBBOpEwPWUp94Xh+Hn89p0t8SW/Tt0z/eF4xRsD4x6HWHD8WnPB3U1BXqvD0wiINIUAdZwiEBDEWA0hvv5Z9pMfdpl/7zuWf3z6+aXgVSGvewV1Rrw6SdFkhhUIYiA4wDr6zQNMgJMkfCPHTW5zsu+Od06Uz4NSZ6FJBy/iqpXJmd8DC0UAZTKYJWK8omz5oITNAUBfaRCmZN9OVk7V/q15T2M+XZ8W0VhWKEDA6xmt4aEKptREOfPa7OcbKuPQqXxT7uxseYCCucw4W9OQfua0X7JUpw7q7szvN3CUKDLUTWcdBqCpVKtuiSgEocb49M9Xrl2Em0+ZdL6UUkSyMva1FgW11s0Cb7tDt2VlwROy9omK4bbJ+7F9RBhlGx21pyCNUlgRbfmJu83zEcLroU/vN1srkoCywjXwc5bX0DCSrZTHjGRyEsvm93LPMxeP5WtZDSF7bO7mi+MNhBK+FNPg2VndfOQxNbbcFH3PnPbXkzGpjEKEYaCgK3X3zAfv61Iyb8wWVySdRmFN+/6gKbihmYURhAJIY/nd94zvV/SCaqZER1AuCW3jd+DA3d/DItZTfwAQ52Gza9hk3tAqRxf+hB84SH9OB9ioY1AuBYWQgPaEQ/g/fu+wlQ8q07GKwOLvuCqlL+ZrbCOfUtzv8sEXzBvTX3T8mL9b/xVKeBm65ZWujUIgbhtI7GZdlQqbYJvSMsHvpgEdLw6dL7rvL+T6PQ8FoupLNqQPLpcTHp5Iq9mi53uWkRGXc9M7XE1W+x1NRuESI70kBhOiiFwrt/4Ax994sr1/EHSOzGi6/l/d5QAXHKQ1vIAAAAASUVORK5CYII=", M_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASNSURBVHgBtVfNT1xVFP/dN29gYAhMWlsKBZwa0wXGSpMuXInowsSFAWK6MdHGJi6sH/gHaP2KW2mCUZPG1i4a40YSYxcmbcFF3ZhAo3WhSTsSqykfcYD5eDPv43rOnXcfd4CBGTIccrj3nXvf/f3OuffdOUegTpFSpqgZJR0mHSJNk6bC4SxphnSedJZ0WgiRRTOEgNOkn5L+JxuTS/wu9irscQi8RXzfl8ViUa6vr8t8Pq/6bKsh53fCETXA09TcRCXMSjzPQy6XQ6FQgOu6lZeF0PNVa9s2EokEurq6VN+QDOkIzc/sSoAW4/39ToNn8y4y95dxIOHCsizE43HVspoEgiBQykQpGuj85z46e4/CGhjYkYS1jecR+E93VjB47gZ+W8iira0N7e3tigB7pwmwcp9tPKbnlX+/g9zYC3BnZvTyvObNzefCqvZ/I+xXbizg2XdvoSsZR++BDsRisQjMBN78rNuWI72w4jbyp8dR/ubqZhKpLQT4wGnwH+cWcXbqNo51JzFwOAlZB/CWZ+nDPtoPm7ah+Pab8H6+ZZI4X0UgDMsE9/9aLODcl7+itSWGnoNtcDxJ42KL97U0ioIvYZUc2D09ylZ47Szk6qrGndBboSMQMfro2z+QWSoiTnvquBJOmQ6YrAapJXpMzZMBRKkEy3MR6+iAePAAzicfm9OVw1a4H2e091dm/qYVKiEteaAIcISwI/C2JAIfVrlEJOjrcT3lqUdnwYjCK4zN9lFtmbp2j8AsFZhcSaJQ8lFyA/jhd16vqAj4YQTKDhEoKwKiWETpi8/0NHW1s31YW374ZYnfVhoQ5vKaH56ByrfeiNKlAOE4wMoKbQNHQCgS/vXrJtdhvq744kGOYv3nvwVyXnFVuk4RCKjrB41FQEXBp73LrpLXBfVsicpW+vNzoPsbIplk8xCjpbk3d3et4j1E2FYk7wRwvQCNiiyXFXi4YoWU+qPg3Lurp6WZgLoU1gpeNK3SbJAI9rQF1VET4ZLcyoUFbU5FF5FT9g3Qze3eZbsVRKI16jMBlTgcO9Je+40mkKhyqbNLD2WZQIZ7x3uT2G/RJKzHT2hThgnc5l5HwsapRzqxHyKNVgwOQrRGWzDPBGb003MnD23M3gdwFmv8RXN4lglMIzwHbzz/MJIJa5vXmiR0yO2xcdMybYXZ69f89FBnC159pi/Ebh545P3LZyD6owzpMmPrz3BSW987/Sj6D7aiGSJhxJCAY29NmMMfKFL8L8zTLnA/lbRx9Z0TsNVOVC2xdyKcR178CqKvT5su6NzQTMneR/hJPnk8hYuvP4ZYeBwkZJT51gWob0TqB3TiranPYQ2d1MOZEAtVBMKzMBJOwEtP9WD2w1NIH26NzsNuJKJrGGH4+/oR+/4arNExE3zErJp2TcsXlh049Dt+qCMiit1I8JzE0iIS3d3mrZchHaOxeXN+3YUJ5/xl+oVj5bzfJGMWJro42UQ0gxqFyU6ecGk2uV2tRWQkVUeRUjGibDVk0kzDGxZZKU4vy8aEC9lLso7itO7fPrlRnj9N+gSaVJ7/D+uTCLUdJlnIAAAAAElFTkSuQmCC", f_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVBSURBVHgBtVddTFxFFP7m7i4su1sK/YPS1S5qTNPGgtKaqI3Qh1LjU7WkxgdrjC/aapQmPvSpJcYYYxSamDT6UGuamhij8GSqRm2JQU1aRYJNJEWWUgqlyM+yLLt7d+94Zu7c3Vl2oVDwbM7O3Pk73/mZMzMMSyTOeRkVB4jriWuJQ8RlqnuKOEzcTXyJuIMxNoXVIBIcIm4lnuTLo0/F3DutzxYRLLQ7Qfzm/L6oGcH16WsYng2jxO1HwFOKB8p3yLIAnSRrtGA5ABTyn2CbWVIkMYX2/jP4+cYFDESuFlys0n8vdlfsxXPbXkWlL6h3hYn3EpDwHQGQcOHfdke40PZM73v4duALlBQFsLFkM8q9G+AlzT2GR85JWSYiySlEiW/PjWIqPo7GrYdweMcxHUi4EAi2mOZ/jV/G278eQZLHcX/ZdgSKSu0JTPxzbTq3v7i95FwqhsFIH9UMHK1pweNVjQuCmA9gwBH+/eBXeP9KM6oCIQQD1YBhC2WMZURmJos2rlq43QsLGJr5B8PRAbxV9yH2hw7pIB52dgnThLdCBZzQvLnzWVT4g9gc2GorLBZlmvayYI7srC0UAFlS/9BMP27P3sQHT36Jmo2POeLaCEBzBoAyvdAeY7FhHOtswkR8DA+u32lrzJRcWeFZkznSc8yYNYLoS1lp9E30wOcK4NxTXfpOqRauMNTHCaf1878/wq3YDbjdHpg8gaQVpzKpOCHLlFOXfQlVT2TqKW2shRR8Hj+iqWmc7jmpQ5XWZmq/T4qPURL80ncNNCUBP0V8hX+LsKKteEZrvZKrPVOd3LEKt3kkOoQ5MyZdcn5/FzbZO0PEQLUbdnqVNDtxAU3rLDDaXm6XiTUlJlnZBeUFms+lEDvcWHYjyCBguhdsVygc0WIOM+0BeQM3R89h033HRbNM7QJAvTOxMv4Nnt/ggcsFuMg5hisK5lpDa3NNawv5VLhdAOBWDJaPIW15iOk79QP1HHeG1AsAtfbgNHiil4TbkW1vt1mxApXFyM9ZOijM84gyDeUP8Dm5lkFKCHemzeuwUv/CcK8XA2sFgJCoWfE+GmQLN1TUS/fTApTriN1Y5OiYFw7iI0lz01lwzpr0x5NhWk4CCIlV5ZHK05NqAHL8aa9n0p+pVjJy+/K2oqjnu0MIZjKR0YjkIOCrE81l7uyIbLBltnz+SUGczm9ahJiWHDPeMrKnplBHpkTDU5k7EatHGaUUILgzAKYEgLDs8GxBnnlXmRwQhneb0yQz4Z82MjcM3y78H8S1khXdo7ugW8TAReIXxdfl2Cto/30fDRABYGTz/wrFc3UucMvCvu1BNGY7LzmpWBxEZZE4R8PpCcwkIAGoLYGVEXcykgRw8eg6BNe6nM5yQ53Ln4mvUi/DC3Xe3HyyUnKOBSoP1nh14WeFbCfq2pzWlx/1IVhqqL3NsTIUaj6tFVxr4PU9Pr2zRfxJAOqKdErUhRU+bloDX5G2xl2B4Fnt6ffO035d+1POtUy/EYlY+AMqNXf2J/FaR5Tud/p5vNR4yN5KRPZ7l4QffKjY6Qyj0JVMgQhBu5RevZXCka+jGI7wJYLQ7gH0V+FnaD0QwO6gWxe+8KVUgci5lo9FLXzyWxznr4ibDpB7Oykkn9MNiKFpZxHe2FMiXaoJf4aEd+tTlvwwGZ628CO5paM3iZ6R9LzptuaPVLnwRLUHh3cVo8ybk1XDWOBhsiCJmCBuK/ToS6ct3jti8l/CJu8aMPm18RSPm9ZCb8Q2FV93R+pxepYvjyZX/DgtZBHY98cG4hqs0vP8P4qr2Hx+98L8AAAAAElFTkSuQmCC", g_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVASURBVHgBrVddbFRFFP7m7m7b7W67C5UiWNoFq2KI0gKRiImoGE1qohKjwUJiJD6INYIx+CAPrUSfiNIaoi9Ga3zA8KCgiYnRhBIjxqeWqAktla5tpcFCusXu9nZ37x3PuXNn93bZ7R897dmZe+fMnO/8zZ0RWCBJKaPUPEu8k7iJOEYcdYcTxHHiPuJzxKeFEAksB5HiGPFx4gm5OPqc5863vphDMVvXTnzoprHJSViXBmANDUGEwzCqq+G7fzNEVVWxpTqIu0p5RJSympqzUG52yL5+HTOffYr0t2dg91+cNVm6rRGLwf/4kwi+egBGfb13yTjxowQiPi8AUs7x/UYrZ2tTR9uR+eokRCQK39o1MFbVApUhiLKAmpPJABMTsCcTsK+Mwb42jsCLexF867AXCCvfTSD6SgIotDx7/hckX9kPYdvwbdoEIxLJTSjmOqk5lUK2v59cYiB47AMEHttV0hOFAIa08jRZnHqjDf4NG+Db0AhBkkJKaoWaJN3ZTit4MqRwAdAP962/BpG9fBmVH51A2Z5WL4hmnRPCo/w43ITL9JxF6oXn4KtvgL+hAcL58yjnibIQPktIB4Ht4OI/gSyBsK78g9Dp7+Df8ZAW7qS13swBcF3P1sMeHkZy99MQNMm/dRsMR0goD2COsvGGQepwSNiWhWxfL+yVNag6/xvlUUSLrudQGO5Du35rfngMYmQYRjAIY2YGgthIz+T6Dqe5NSFMUz2buq9YyZvOHCObgUGlKsb/hfn+US/WQ8qTqt4ntPVTD2yBn5LOoJr2161TcXfDzGaJvMfzJgtvGFCQDxSG4b9hp5KwystR2fcHfDU1LMU5sN4Ptb06ND06AutAm6PN56OhFVEV96KJhwWGQsJK0MaVScMiw0zawEI1D7KIs7UzgJ05AHffAxBLKh/p88Gm1iAWYr7IlwBBCGxSymxRLnBr0lqhvMhOBsAbD1JmFmtavqYepYVQqceeCFUEUFHum1ORW4W5MOnK5DWZnUGuDbed6HkZ4UpnE2tiADHu9V685ir1rEqUpAXSWRtlAQOiIPDS3YR1VFRfwJY20hkbWUsiLyBU7dL/wHACWzau4pEYA3A+qVOpDPLSs12eIQDMHArDKEgDeiedRFWASDcBkF7/zALNPDT6nwYQ9WuxpJlBEefOemJFFMoCkgVtKcr7KRwqy73lYDtbYuO6CHIKl5ZzC6ZwMGd3gntx4qY766oRCQdmJaBYJiRqi3Y/VRSjrffepofivBF1U+clfpqkTy+72bjF8rsJgKccmaJRfZJDN3ugRwMYnL6AH0ZOkRMMVQTLAUBtjU5ySlviifrnsQ0P69FzeivmD1F0KnMD+37ajmk7qSLBtBxOUJ53AHy561esrqzTIysM97v8BT+FA9VoaVDfbTlfUi9GubtWS8Ner/Ju1q3t7NRvW+86iNqKtVhuWh28A62Nr3tfvcs/DgD3iNTFffbCka2fICACucRdMrnWU0rjneaPUZu3vksfywyPeAdUSWJjtBmHN3cqEO5CS1XOa7zd1IWNK5r1SNzV5dCch9KBxAW81/sark6P5AtiIUciKOW15PYjZDkb5FFe+lDqgph1LB83x3By8AR+HD2FjJzJC4riipkq/VV4at0+7GlsQ8hf7VU+97HcAyKGgovJ1elR/Dz2PXrGzuDS5O9F9d+3cjuaanbgmdh+VAUi3uE4Fnox8YDg/aGD+GDhmGVnMXjjT5hW0lFcU7EatwfrEDDKiy3Fyd2x5MuqezntloujiVu+nBYBoq/njxBvxjJdz/8HLriuOiHpcEkAAAAASUVORK5CYII=", z_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUiSURBVHgBrVdLbBxFEH09O/uz8U+AklyIoyROcGJhi1gogGR8QeKCbAHyEc78HHGEQIy4IT6OhJJIHBK4o0QIFASCxIoTIeSDzYHvIavIC/HaYm3HFjs7n6aqp3t3Zj8OG7tWpZ6dqq56VV3dXSPwP0lK2U3DGPEI8SBxL3G3Fq8S54jniWeILwkhVrETRI57iT8mLsrW6DzPvZt9sYVjju4U8Yk62doa/D//gL+0BJHJwCJODA5BtLc3MjVF2XgXrZCO+mY0HNd1ZbFYlPl8XhaeG5f/PNgji5r5+fbrr8rFxUW5srKidGvoZrNs2A2c8/peRLjGCIIA5Bibm5uwLAvJZBKZoSEkurogUslwjuvCOnwYJdtGqVRSuu2UjS7SsW3lgm1dIdujlI1cUwAaZcU5G6OIQJOQzWaRSCSUXoJTLgPAcapzM1kFjplBOyQrFAro6elRc5uBsGoScMU439jYUAY4ggw7JOcMhLNguR6skgOLnIRjGZbvK5nRSafTalxeXla2NBkQ3XUAuNKNc/eby/AGB5CWUkWknGrjijnljgZQ5rEEQQCM3Ojy3Lbr1+A9eRze3E9REKdiAHTqVbUHt25h48Z1YOAokhR91HHl2XMhyLFwIux5MR0z2g/tBY4cwfq5c2r3aDphitJkoILI+eB9uIeooM5+Clq8atRR9skZR001opzz6IcAmMzIIIKH+1H6cBrBnj0oTX+ECKmALb0eL/Efj6K4s38/sG9fPOWaDYlyOXRc1s7LYQZqnUczFzx2HHf29qoC1fQi++ZdMGbecLF4L0yogktoAw2JagAlJ/ZKagAGBBmvPDMAf3gYPtUJ++js7GSROtoZwEgl/VxUkYJjI/ysHGiDisqu3oL8ToMkADGdCBkQLHecGPARBjCoHFCBpN+YRIKUmS1mMi6SpJLOamfKGqyfFwhAKebEnrmKbD6v06F1SSegLSvpF9A7X7M8/zkdYinWGBR8yXA6/BuzcMaeBe12AhBWpzDx0XZSXLskkQSE+GSow+vMy8RZ0SKfOJA8SmRmf4TV18cTVm29FpCr66HDRsvOxphZyEvCo5RVZWmQyPC5WmjVZdC2BYv//ssA6K4exetrlYijHI+YQ/DRCmlYde8McaZV42AdOIAtbudtUTQYNd7/gBGpJciBi+HgQbgTEwiEpQpQpasJIPuH72Et3Y69C/oOwXv0WEN9LkKVPF2E6f5+I8oxgAUFoKsb5an3KlvP2uIcaC8s1QHwHn8C/755sjEAsskHELOya1WuoHl+umr+8Q0WndRsX7dCUTs88s0aoRkGcAm6DrJ8jZ49A3tuDjtNye++RfbMJ7Eg2belu9fP+F+irQ1Z2g2In1Y7QuL335ChrWyaGqIL7NssxrR5a598B6mLX+C+Z55WF812loHn2rPX0D7xPFK//oLEa5NRsWpUFQDdIp1Wr6mPS738CoKODsgW93ytczVSyiX3km+9DbFrlxGfNm1ZtCWbQrglYR0bBr66jID6AVNErWQiWnQe2RJffg1xdMCIc9oXYgB0LYxqBVUsHZSF6NV6NxC1Fc9z2UYqvHiM89HoV1OsKdVpGTcguKfju5sN8B6uZiN+vEqgDiQHEGnLjfPxLdtyDWKeW2foDpkPDu7xubXmu5w+Oio3XC0IrnDTRdccYjkdea7OH5qQbtWmiCfrhNSUyoWFcJfwHbt7N0Rvb3hl1xMX99Q9f6zqz7QLsjUqbvvjtAEQ83n+FPEj2KHP8/8A6SIFuZkiGFAAAAAASUVORK5CYII=", C_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATkSURBVHgBtVdPTKNFFP/N14K7/CklJpBVxC7/kjUokCXRxERBDiZy2DUeMPEAeMZED3jgYDHiwdOyCeqxJTHejHs1MUFIPBkiGgUCbNosJF2B0AoUyrb9Zt+b75vytf26bIF97etM583M+703b97MCDwlSSn9VNwmfpu4mzhA7LfFCeIo8RLxPPE9IUQCl0GkOEB8hzguy6MQjz1rfvEExWxdkPjTQlkikcDq6io2NjZQU1MDv9+Pnp4e1NXVuU01Sd74EuWQbXXEac7u7q6cnJyUnZ2dkru4cWtrqxwbG5ORSKTQG5FS3hAuynl9f4a1xsraiYkJhEIh+Hw+NDU1obGxUVleUVGhxqTTaezt7SEej2Nrawvb29sYGRlBMBhEIJDTGyXuJ29ESwKwUc5p5QsLCxgaGkImk0FXV5dydQmPgSbOlclkEsvLyzAMAzMzMxgcHCwJohBARCufnZ3F6Ogo2tra0NHRkafITakbra2tYX19HeFwGMPDw04QPXqXCIfyO7ADbm5uDgMDA8p9LS0teBrSYNxAbG5uqjn7+vp08zT1/ywHwHZ9RMGLRtHf349YLIbe3t6ylRa28fItLi6ivr5egXEs43VeCsP+E9StU1NTCkRlZSVSqZTik5OTIub24+PjXB/N3KblXDIADtidnR2Mj487sSpvC3u/x7X17e3tahBHfHNzc86aQstKWW97NK+NtqUKTDaKl6OhoYFFHAPXvbDSq6L/fvwBnz9XAYPYI7OoN7MQHsMOFBuIoRXLok1MEvoI1qrkGkbC60G6+ipMqm989y0aJlVeUqmdPRCiygi3JN96E2J1BR6axENzGOQ6UetzSZcSlnZdngJ0omIIkiw39/eRJXGW/9+4ger533WXMHugW3WmNZNKuWWAmubwEDAJ95UrKIs0ruMU8ZGqkuPAjsuurMCk5GZYwdjNAAJcM//5G4YaJ+zS5qMjTnUAZ73C/V7kAGn1YdA0RlAsOUmoD3nh/gZwU+2wAANQUOT+gaXQLacwAGYWUnZTpZSnnaVjSbjOAApIzy24y4MHGoDfm+uRSZ9a7RiUbzH7MItySEdKXlt1Ta7O3lYp0Xg5AKfKkuf0OajIKF+tFiUYQFQJFIBnSxqE8VqXblKZ8C8lpEg33ngdz4KkoxR0uImqKi1a4hj4jVgdVcYn78J8JwLJMcaZTlzSUkg7O9LXeOVDp2Rep2I+iPwyu49H929RYCRp3worai+IQOqNQT+UWFHZdg+i4gUtrjfsc3mW/wmPjxLEBxZiXB5JG4jhv+VUHmbdRccxzAM8inwEI/tQ5X1xgWWwvQ5pUvLxXoP3pe+dAE6PY/uKdFc1G7XwvvgNDaw8vW6eR7kDhaRF9Vz7yqn8rr6WOW9EHAt/wk7N2YNfIR8GqUPGioMyPKGzsuUBSu2NX8DwvafFUbhdyWwQATgupTK1jGxsgnJ6LBeMTwpKmfuxlXsayfKvIa6+6lRe+lJqg8i7lsv0NmR8Fub/P6mD5KxdoRQbVWTxbYjnP6Y4qnUqf5+ULzn7C/dJ8j2hKB2DeTgHefALcLJaPJrPpis9QPVNiLohtaMcFIXLm+AMS6SfeNr11WdmpHn8rzSP/pBmkvgkKmU2JUvQtB1f5yP7mRaW5RE/ZEPyIo9TN4/Auj/2EfNpEsAlPM8fAxpKEkJS3FWAAAAAAElFTkSuQmCC", O_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXRSURBVHgBrVdbbFRFGP7mnLPb7qVlsUot1HZbaiIBwyKo1EgADYoPEnghAkZA4iUhCASJl0Ro4oONN2gICfGSIi+gMUL6JBeDVUQTTVrAYIoQSqHQBmy3pd1u91zGf+acs3u63W25zebfmXPmn/m//zpzGG6xcc4j1C0lmk8UI4oSRZzpOFE7UStRM9Ehxlgc96KR4CjRDqJefnutUawdb382hmCh3XaiTaPm+vpg/nsO5sWLYEVFUIjUmTGwcDjXVnVEDfkswvJpTd1x2GaWzbpxA8ONXyN16CAsEu5dzJ1eqaqGtvgFBNa9BqWiwrtlO9FCAtE+LgASLvx70BUutE3UbYP+7X6wyESok8ugPDAJCIbA/D57ja4Dvb2w+uKwrl4jsNfhW7EKgS1bvUCE8GUEojUvgGzNjZMnMPjqWsmkTp8OZcKE9IJcpuMuJRIw2trIJAoCDbvge3peXktkA7joCk8d2I/EW+uhVVdDra4BI07GOfXMXsSd1bJnYjE4cwDQnxibF87DoDgJEgj/Syu9IGa5McE8wnfACTj9yGEkXl4BraISamUlmPx5hIuFPBu+4OASgSVxiR+DQSDM7i6EDjZBm1vrMu+kvTanATimF9rD6ujA4LIlYFc7oc2eA0UyMdsCGCNtvG7grjs4LNOE3toCTnFT9OtJMHKj06qEKxTnYbv7Nvnpx2CXO6AEAlCGh21K2T1zKSX6JFgyaT8n3bFNNr89pxg6VEpP1nUNyU/qvVg32Za08703rf2cGFQai9zWyh+y/e64WajFMhbPqMy8bsCIeLBoYHZcgpkYhBUKIdz6t2sFEQNVGuzyKtvw6UawFRHpa0VVwUo0GiuOdFsadwJOCBtImHJYFFKR0xnciZ2eEBTdL3lTp/ehYN4GwSBLuwAw311i1rRQMSkBU2mhcI5CwrRQXr8f/rEHkx/0ozYWRKYcscy/sISVIDcUU0/vLA69oAUFmS3mCwAxyWsOUOJ3SsEK3IBLkA1ppVKQU8Hjv99AmLSvjfmz5hy/cIoDKymHQheZmkNnCAzFjb1nTACISu2H2uxIZyzdS01oE1gGjXy4OWghMWQnmWFyHDrSBb9PwfpVEept/nBQRSgoxjqtNR1TyCLi7E2ZkboKtbBKTEQ1uEcqmSodbNk25wKAgZ5eHYvXtuFCR0qkrrMhw9QFf9r2fKIIX9VHEQr4RhksncbCEqnLgA0goqQ5rAFPrrtWGLlJ5RQf/jkyA1vWTYJJ+W0YBnQ6BxRm4cPNZTi672FUTvaNEjyqfrOMSwUAuyT6yx1TYdz20dZyBAMZ7MEAwztvlOXlH4FBiFBD7lRc7NIukRREcaut6ae4jIWliyZKivebOP7HzXHXuSCUwkfcV+0iBk4RxZhKF4vCGoqd8+NudPREHxo+qMSG1aXyuX7PNRz+JY6Fc4ty8nMviMJplAGa+9gqKuEaGjSKp5ZLO9HcsSeTBXnc0TdgYEJYG/Gu+3oKpQ/4kQ8BlzUBeH7qu5g2ZY07s9YtxeIgigyk4lh57HEM82G7EEnIuPsmAMjsZdj3zG8oDZa7MxMV51z+RjyF/REsqlhur+G4N41n9loSXe0VvlfIHnUcD+j9eL35WfyX6s5dE+4QQGnhFHxe+wPuD6SzJXMcO1ekBjEO+4rx/mO7KT8VG/ndWMIR7qe83zb7S6/wBvda5r0RiVhogVOaj135Hp+dfhsWFRk2gvP2hBcoAbw3axdqS59zZ9qR60rmgIjCcyk92/MX6k9tRPfQ5UxVvJUrERyzB8pJ8y9QUzzDKzz/pdQBMeJa3j10BQfO78bRzu9gcD3DyHILFi2oFePFilewfOqbCNHYI3zsa7kHRBRZHyYCyM+dTWjuasKF/rM55T9635OIlTyFZVXrvIJzaj4mAAeEiIk6oo3ZcyYdz+f6zyBlDknBJYWlKAtUQFN8ubYSwV13xx+rzsfpXn57rfeuP05zAHE/zxcQzcQ9+jz/H30Oxz9YrgxHAAAAAElFTkSuQmCC", m_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVcSURBVHgBtVddaFxFFP7m7m/+trsxKdGGdgta/CVRohS1pq1SxKf6QwVpaR6kj1qhFnyqPomCtD4p+NAKgiIRpSAFUdJKtWBrflQ0hbRuQqjRjdlNTDa7uffOeM7cuXc3yea36WHP3rl35pzzzTlnzswIrJKUUkl67CfuJG4nThMnTXeeOEPcT3yB+CshRB4bQWQ4TXySOKfWRqdZdiX9YhnDPLsTxEcX9k3NSgz9PYfhf13UxSwk4gL3tUbRELeqqXqTvPEW1gLAIO+B52ZNjuPg4tUZvH2ugMExZ7G0ArY2hrHnnhiOdCbQSu0KyhDvISCZFQGQcY7vl75xKSVyuRxmZmbw/fUQPu2PoKkhhNqoQDQktAbbUcgXJCZnFcbyNsanJV7oqMVr++YBqQpCLDfzn66X8PXP4zjyKBCNRjHwVxjd/QLC4rEkbKS3JIDWJDtB6fdCSWI4O4emeoWXd6fQmKhZEkR4gQMC491XZvD653kceCiMeDxMxgSkEpiTZJVYVQjt2Azsu1vq+dAkiPkZhW3bmM5nEbUaUV9fD6O7h8Y86K8Sq2L2J8szL+IYGd+SiuCOxog2blkWJBkouRYxAQnYgqO8fn+c345EIpo5hMVi0TfFNk7MC4Fx/Z/c5mT78Ntx3JiUSDfHsf02gYe3Ca0wkxO4MiK0mAikQdkP1IT9ACgdHqX/JP0kspMluPT60q4WJGqCOW/nUPgATtOji9sTExMoFAoIh8M67v5sfK5GZ38T+KzPgPJhkHGDBMPjc5SgLl7siOPdAylf7H3Sd9Qy673Lnz0br3TjSsaZeHZztDJLLrHjsR8iDpejWJeF7t5ZWiWOL3aYbXMS7ve/9PxeQG+GB4dghSxsqhXY3iTwyFavf3iC8mNkMRDG9nyb0h4IktM02AmTBUEJ6SXxtbECWpIJ7tKlnQF0+jLvfVeiIkOfLA9xPVW459oYgNIxvZoV+OjSYg8c6lA42KFQjaRUcF1+CnqyJ2fpa8Lv7mQAXHhgkx8Hx2gkzV4vdOLpEojLil3puXchORJLGJcaeGUYXULDHAqFeEg7A0hz69dRGzqteSBE0HYkAiU8m5KzOASXRwwI5YmRXQ2WV7leGyTP35RUWsehXS7STRpAOmxigZLtlzZRdYdgEA4nlR5X/s4ilzLMZg1Qt1wYDX7XxckrofdvYwC6JxlUQk9IlEHAvFfUPG65at6nVZDR4eslIA3x8gwYAJfE5I6WEI7tVZR/zN54IRS2psqq2rcAbzy1JusecGU8Q7PkMNy1OShGeUGu7WPd7OJsNhvUAL8ObAQpnQNSMydgc3Oz1k/Uz/8D3GJjXP1uNXH2G+MaAFs8T3yY3wbHY/iit0gr0NIrYSM84AdM75BUC555IIYnm4LuC8KUYt6IklNFhcffyeO/Oe6zFiTkTUDwNybii8dTaE0FHkhZZl/+mN/4bHdwZ2yNWb5qGLQZxSqNn2Hbi7Zj9sK5vrxelkKYwrTeUChlDii0skjFE/duwu2bqmzHBsQperzKbd4Vp6am5u2CawWhzwMor4CGhga9vRvSW7HWWyHAucBLMs3vpVJJH0TXA6LSOHNdXR1isZjfnSEOjmTLHkpzMw4+OF/Ajbwp8qt1gvL+WmjTO/50HaKRpU/GKx7Lx6YkgSjik8u23lCWBWIM18cEJVwYr+yt0YldYfxZMt5fKbLqi8loTuKbP2ycHbAxMOouEPdc3rEthMfuDKNrZxTJ2nm3pAyWuJgsSZwTnJjVLn22K9Uvo7b68Zqtfhiy1dA/jiracqk74imTX+sj5V1Oz6i1Ue6mL6fVPALv/LibuA0bdD3/Hx4WMWJU5uxHAAAAAElFTkSuQmCC", v_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAadSURBVHgBrVdpbFRVFP7ue7O0nem0xU5LKepgrSiClmhwiREXosYoIcYY1GiMUWPUBEUT4wqKRqNGJGrAPyqEqIQIRkAJEVl+CCEgGBNKEdIptNNlSjtL+2bmbddz3zJ9HVqgwJl88+5+vnvOuRvDOQrnvJo+CwhzCS2EGKHaqU4R4oRDhF2EXxhjKVwMIcUxwnLCIJ+YfCf6nm18dgbFYnZLCC+X1pmpFPS2NhjHj4NVVkKqqoJv9mxIlB5DlpI13sNExJl1u3c6ejLJh5a9z5PXz+K9QT/vLfPzvpkR3tccttICyWum8/Rrr3I93l5qjfbxrMHGUC78uxG2j63ZDr3xOvJr10KuqYHc2Aiprg7SzFpIC+oAGTDW9MA82gs+OAi9qwtmsg9lTz6F0JtvQr68qDdOuJOsER+XgMNyh6tc3b0bmccWWo18s2ZBrq4e1VG6fxL9EcnNA+CecUxFgd7aCi4xhL9eieDd88YlUUqgvaj81GYMrVoEOXwZ/FOaQJ2oMbe+TmswtzsTfd1SaxwrryWOwxg+ifDjnyFw+QIvidnuKmEe5cvhBJzavxNK52vwlTVCDjZC6JRES0pI44atO84IAZNg5Dug53sRbvoGvsgNbrMviMArRQKO6dst86kJDB1/Hkzvhy80AxJpFAQs2BysBCsJHy7mzj0EhL2IgWka0JXD9I0gMnMDmFxcKdOEKyQns8QtXd+6HH25TkiyHzJTycUFgmqDaTQsgWukpTAKjKtUJ9rY7ax+4st0SL4QOgpJ/PzvR17OlrWZs94HRaZH6cQTW2+xAmv+JVE8PPlKRP2S7f8Rd5ckvMKs2XtdkdE41vUexYb+fgQMP9bNP4SwPyKaiBiYJixQjI6Nrass5YzwW+YUPkx0Y0c6bc3MnSFc8LFQsNsSDLOArdT3nUQPNqVT1piqrGF92ypXnbW1CwJz3ZK9fX8WfWySFzsLp7B6YACLTyTQpgyJABkF3pUFP5F18gUHKlqp7RJS/NPAKXQX+mHQD864+xN/eE021wf7YEGukEGicNJi6pLIG6SUmVDNIN5NKLi9shyP1IRQ22/CWHYSyNLABRMISpA/iaE/KuOH/iH8NZyz+qt6nsaw0+6YR5VW5ElXWdByQ4uwQEyk1EIb7qmq8IS6LXlDgUJEVJrddjLpqye6kXnhMPi+AbA5AbBby8CPpNHzVhteindhVzaFgpHHsJZB3sx5woMV46YrG3dLYz7HFwgNZ/BiXQR+meH3rOLlAN3UoIvop9+kLhOhsAl55VSgudyaljSvArVLOhDq9qEnKpHzTG9cWnrdjUqM25NtR1PtdVYcuMsQxpEk8l9246ZwcCTCSyJdrG5NoujYn4bxVRedhNSkksN4l7aQw0PQmDlaeYm4kwoEQ8UyYYGUxWTGdGzWctg7kMWZRG/wo6+lHJOvLoexIgH4yS63VWKAeJv1NJwxDgHLDPY37Iu4pSmxDxykRIuiZvD4tllQRCtPII70Z1hIATi/KoSqPh3mx50wd6TtulsikN+7lILQh7U0gW0ZBSWms11AOyMnflvuOwp/QLgPh4QF/hEEKgIRTAlciWPqf6eRn1kWwAvRCKaV+e2CxgDkL6+A1KuJ9QrWYJdHCa/UV+ERIrmsJ4UOTTttrCvKm13lFgERAzvd3Jyp9zp2siUqy3ijvgafXnrJiHKvVev9ReVeaSzzYVWsFovrqlAnS0UrCLmr/n5v013uViwOoup0Loknt98KVVLx6KQwHpoUQkg+y/F3FknrJn4cGMKmQQUGpdfM24P6iqludY1PnMtEYjVlFlWVR/HctEdxnbkFU2gW7MJ0WxIhCzxbG8GDlRU4wO71Kv9e6D7tOIaZhXpsIcVhknZF5t0/JiycOxcUEXy+BvgaV4IFp7jVI8exc0VaYRVLlfA1LLOi1e6N8xLuYcEN2qzqPvAqX+Fey7w3IhELYknGRN7o/BXGt4vBaF2f0QoMY5K0r2aEYBDy059CnvyAWxWH50o2ulPJdVzfs4fnpjfzHF258w4KHmg3hrl2c+WoMred6JO7qokbfx84p+u5l0SLl4TZ0cHVl17kSnlgNJEZFdzc18zNHU28cG1olOL85ChX336Lm4ODpcpbcC4y1sPEjMe59vlnPH/zHHt2BPXZWq4+U1vMF+bdxTV6vJQontjDxENCxMRSwqLT6nQd/OBBcGXYcrTUQMEVi1GQBccaSgT30vN+rDrW+J5PTIQJvuMX8jgdg4j7PL+DcD0u0vP8f6EMFnvCe+yuAAAAAElFTkSuQmCC", y_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASISURBVHgBvVdNbBtFFP52vXb8k8QOSWqSWpEvQUKgJifUSxVSCRX1lCCBkBA/N45tUTlxKD0ggUAkPXBDIr2hSqjhR0L0EgpSBOLi0PZSCcVCTVCjhtiO//dn+mZ2Zz1O7dhu3D7pecazb973vTezs280dCmMsQQ1C6RzpLOkadKE9zhHmiXNkN4kXdU0LYd+CAGnSZdI91hv8g2fi8cVHrEH/IiYpskqlQorl8ui5WrbdjsiS172WorWBjxNzRrcNAshUBSLRRCY6IvJmibtRRsKhYTG43EYhqG6zJLOk322IwFyxtf3ugR3qgUUcrso1APQdR3BYBCBQECAqwQoA6K1LEv0c/oOJkdTGIs8q5JYpDkZFU9vEbkPXt/ewM7KAsr3MohEIohGoz4BTkaSkMS4Srts7i7OrS0is7Mu3QvfB/eFroAn1LSX7nyPB9++A90IIjyc9KM+CCxVfcbbscEkjICBi7+/gd/u/aSSWFP3hJqBSxK8uv038j9/BGNwHMH4JHTNaQks/x8E5wqakxxMYTw2gU//OodbD/5USVxqIuCl5TzvW/kt5H+8AD1AaR0+Bt2pi41yMPpO6oDBZFWMRSdgazYu//E+imZB4p6XS6Er0Qsprn8Ftr9FKQ9CtwncrhEB1uS8nchnvGUEarIaEbEQDcaQN3fx9a1PVHMRsO6tx3si+sIWqrevU8rpAf1oPHqHE3AOBW5FgokM1GGR2kSCp/GXf79DrrorTd/l2DwDC3KkvHGNHDAiQOB2hRhVqDVdd9673i0JhzmoUwB1yoIFCoSQLNTww+ZVaSaOdk5gTo7U7t5w15pngKJGlY5zWgI4jhsVY90rzed7IF//nzJguycO6fp/N1Suc5zArHBu0XrtbQpwnkWNW5slYkUbh9noVRyaUzTzKNv7Aljz9J/CHVSskjSb5QTSvGfev+0bubveOyZpGeBY6FV4+qtOpTHgOwS2iptyNM0JiEOB1csiak0ai9Ztekq9p5BbRmu4k663S1n5N9E4Cc1ycwbQ5kt1BJFEIsagP8YJiMIhEE/hiYrWaBUCOU4gy3vGSBpPS55LvCi7WU5gQxALxWCMP48nLVND0wgFwvJvhhP4Vf4LTZ/2DRka+6gv4jk7NXFWHb3JCazC2wfhmbfoDA/2F7iJhIZXp95UR1Z1r3oV56MeGcHACwv8vfMm4OjCGu5emXodyai/2Vc4tnwNl+Vo9NSH0KKjfeXAJRk5jrenL6hDl/mPIOAVi1dEf2AIsbNfggVCLvhRGHjRB2lZL84sqdFfkQWqWhF9DPlKpl5C9Mxn3kfFddLL19Cdx8S8AT2CD058gROjJ+XjrIeFJgLeXpj3DOiNOIPYa1ehDU364N2QUG2TkRQ+P3kNp48vquDz6q2pc1levI/K/h5qA8c6VkQqgZKWx8jgM4gZwyr4I2V51xcTh2qCarXq1/1iMi+9lKzwyplfSMLhsFuYNiSLNheTwyLhV7PlVnctIiOuZ6oecjVbPuxq1g2RNOkK6032POB0J/9df3FZ43r+MukM+nQ9fwjYLA4BbHzZiAAAAABJRU5ErkJggg==", L_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaLSURBVHgBrVcLbFNVGP7ubUu7teta1j3psGPBTB46jEIUDQIBjBMHI9kCCjoMMTE8BE3QBWFgVFQEhiwRxWwigoLKfIXIcyMmPCcoOhNwWwcbe2aPdrWP297rOffR3a0tA+RP/nvOPef8//ef//znP+cwuEUSBMFCinmEpxHOJewgbJG7ewk7CV8iXEO4imGYXtwNIsAOwtsI9wi3RxVUdjj9zE2A6ew2EH5laJ8/5EObpxmdnlawLAujLgHZlnHQstpoqrYT3hjLI0ysWZPiJCQ3i+Ty9+BQfQUutNXg7+7aaGIYa7kfMzML8Fjmk0iLt6u7nISnEyOcwxpAwOn6HlLA+zkX9vy1FYed+6HXxiE5Lh1Wgw0GrRE6VifKBHkOrkAv+gl3etuIsb2YO+Y5LMxZDltcmtqI+cSISzENGDrzP7rO4p0zKxAQfKKLTSPMkgBDv4JKXJD+BKnVF/SiyXWF/LMofeRTjLVOiOkJRgVO1/yiAn7EeQBbfnsNGSYH7KYsgJVAGYYJQ4bNoG2C3CKIysTyursBXd5WlDxcjqmj5qiNmKTEhDpqNijgnPsMjO1vYlxiJkYYMsAhAPCCbK4MKxaMVPIUWjZMNoAWqUY7jCwHpuVVBK2joY2/DzIGxVod9oDs+kZa5wPN8DQsBkKd8Bsm4oQ7hNOeoOR1Opz6edAKqv4FqLzDYko8i9kJZJbeP8knDaax34PRmJXRWXQpWNXsRfJ1lJOoaoFGo4NZ48d8axDLUgSYyEw4wU84gCBhqe6TS8I8YUh1s4bI2EIosPIwakLQkIClOv0du1XGS9ubkde+R1wcpxMnDkxF0dNGImSCVp8hzpxyH8/gpx4Ov/YHEYvoMswwa5CXqEUcKy0HzxNn+lsQCnnwydcCilefh8UiJlAaA1nUA/MUBeXl5Xhx7Q2sKO1CS2s/sc5LVAZIGYCV9WNxEo/lKSzMbAABXpp1QGYz8dAasuMKR/KIZyUZKssSr3T3+JC39AbWbPoHZWVlCpyY2qkB05SWqqoqsaw42IMZi5z48tB1yQCiBILEEw1+rEtnMNXIh42YbgphY4aAe0fQYPUTcL8oQ8s93zRh/JwrqDnrEXVXV1ernTaNLgHderlutxtmsznCrcWFadi81o6UJA0Gpw0B54hOI8tjfJxmSDwKaG4L4eV1TfjxWGeETp/PB71eT6uXqAcctFZbGz29Vhxow6MFdaj6pTvsBYkDmBwfwHhDUPrnB/r2/dCJSU9djgpOqbGxUak6WHkt0NfXh1hU3/Qv5r90Fcteb8K1Fs9gQ2iOkOttnR4sXNmIZ1eSBNTtj6lPZYAlnIjoEgxHcQYBZhP1c2igUZUGfL4g4uOGVQOdTheuUw+IKTE7OzumQGaGFsf22rFjQwosZjbmOIddh882p+KrHaNwzyhdzHEmk0mp9oaDsKurC8nJyRGDn19gwYclNiRZNRF95zwC/GSfP54Qeaq3doTwxvud+Py7yKXlOA5areh8MQh/pzWbzYacnJzwoFSbFlW77Kj8IDUC3ENy/3utHNY3e/H2DS+2tnHoHpKf0lM0qNySRuTTBnkjNzdXAQ8bUK385efni+WSAgvqjmbhmVnGCOsvekIobvDjpIsLtx3p47D6mhdnPBHDsWRBIk7uzySeTBT/i4qK1N01SiqmYWlpaKjH5eMzkTfdIJ6+ShpWZr27g8PhvtipmNJc6wgUWrVIlictnsw0JZPPrn0u5C05DYfDoQy3KqchvbetovVgWwnZEt+Sux4TNuB0v4Dydj+6gjxuhZJ1DFal6vGQkZXBCQb9mIugTd2kDKskp2FxxHEM3gWucRZYoQ8essd2todwyh3AnVBeog6LkvSwkGwpaDOgse8FQ0qZBo5j+YoknRKsGdr0j3CenHpL6/045bozcEo/99LY8KCWxAabukUNXqZcy9SbuhTSdQlM/GS4be/CTVwu5hkBt0/y2ndyDPqS3gIb96DS45SxRLrppfRs+3GU161Hu+/6wEBmeGBJF5CkT0PJpJ2YMHKyGjz6pVRlxKBrebu3GV9c3YajzQfDOyK65AC4jtFjtr0QS3PWwqg1q8Fvfi1XGeHAkIcJNeRgw8e40FWNVs+1CEGKnWUehykpM5A/+gWMNKSou5241YeJygiaH0ohb081eYIu1LvqxEeLl1y1MuLJ1d04Bgm6xGiqaHCX3vFjVX6cVgq3R/Qhu/1/PU6jGKI8z58g/ADu0vP8P7wSTmT+f/ewAAAAAElFTkSuQmCC", w_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASOSURBVHgBrVdLbxRHEK6ZnfXbFrbEwZzGtwQSxXFOycXxIVEiEctEOeRxiURAucEVceAn2FwQSCAbISQ4AQbEiYcPcOBpOHHzSjwkW7bXtmzva3aa+nq7ZntnZ+1di08U3Tvurqquqq6qdqhJKKX28TDBNMo0zOQz7TN/XmPKMM0zzTHddBxnjT4HWLDPNMmUVa1hGntpr8CJjeA6lMtlVSwW1ebmptre3la5XE5/a4BJY71EOA2E+zw8pIqZNcIwpI2NDcrn81QoFBKZeZ5H3d3d1NPTo+cWMkxj7JbMrgqwcPj3hgiH4PX1deLTEjOgdDpNrutqwm+zh9gCeiyVSnoPlOjr67MVgfAjvGe+oQLxk7OZaXl5WTNsb2+nVCpV2eQkGk4rIEpjL9Df30+dnZ0NLeFYm+GnVyKcfUsrKyv6xCAIFdoJUEII1oAiAwMD2iKWEt/KLXGtvWdEOPzcSDhIXGBTfI24C7S6uqp5GvhGVtUCxvQLmAdBQEtLS/oEHR0dkUA5ufv+HXn375Pz7Ck5eROMfT1U/uJLCg+PU/nAgcgScAVIgnZwcFDzMhiCK0SBaR7+xTybzdLW1pYOnra2tprTeTPT5F2/JsbW//QRVPU45d//oNJ/xyiMxQOCtKurS8eEwVnmedIxvs/K6RcXFyvCWAGJeG3O06co9eSxFbUxyWbAl/Crr6k4eZYU74UCiAUoAIIVTDAjBoZgjwlhicCzTS5m9y6cp9SDB2xy9iPMCdNjHo2Gcnm9xn3+jLypyYpOsZjBdTbQqR0KjMoXBIodVPCj+/GDVsApiHAjrCBjoTo3BCXSV6+Q++Z1nRJWMAKjyBLDEjRwAcwji4HUpYvMNBcZe2fUuiU1O0sBu8O+GXAD3GL4D+N/HzP4KekquXOPiHOwdVpxgW0Nmecq33M8rq9R6taNRJ44qIHvGV9oCyQlGofzAWtXIfwNmmNElMtamWME8Qn1Xr7/NbwsK0gcRInaVkCU0KOtEJhXNzfnFBNLcSsI4AKdEmPVq1povDTtFcokpbhVrWS0hlkGMwRfUp4Pf/mV9opw5LvE73aFhAKvRcu4FYDyxBHaK0rH/6/7JrfMYB6zR/ILJVcgFS0cGaHg2HFqFcHf/5A6dCjikySDMSepGIUILZiugnXZkG9A+/hhcl+9bEY2hQcPUvHOPVKc++3yjOhHaZa+gtHvmrp8Gb8gDBWwDlwTCrfvUnD06K7Cgz//ouLsXS3chlRXS/gMZNeVYyxERRSF4tfGefuWvPPnyH35gtyFBTiV1P79FP70MwW/jVP4/Q81QoXAAy2apcBQVI7N4ikeTmCOrIgGNF6UWkUUR5yYent7dXk30KVYH8haXNOSoYlAX1CXmFoUDkKnbAVfhpJaMvNhzCzQG6C1ZDJh2opg7AWPmPAxx3o1NdWW88Mj6nKbaUoBmBsdkLU+Q7u15RYTnxIeJqjl0vfbyohQBBiSGaLdSjb2yTPULMzTbCrprcUKKFZEP884VvR8h6fZ1E5Ps2YU8ZlmVGvIGsH+bvybDmtVfZ7/yPQNfabn+SeQvG+dpYtRmwAAAABJRU5ErkJggg==", q_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAU0SURBVHgBrVdbTBxlFP5mdmlYQ9gBUykNLhdbTCAKDRiTigGkMZbQihJKFa0hmpiQ1tqHhkdoiJUXCjUqthjBIkbFRI010b5UICHahICYkACJu6yQSgLsIAssl53xnNkZmF0GCsIhh9n5b993Lv/5/xGwQ1FVVaJHKWk+aTZpCqmkd8ukHtJB0m7S7wVBkLEfQsAppE2kPnV30sZzH7S+sA0wW1dL+m5kXyAQgMfjwcTEBERRRGxsLLKyshAVFWW1VDPplV15RLfabTZnZmZGraurU/Py8lQeYqU5OTlqY2Oj6na7I73h3sobggU4x/c7hGIMWZZRX1+P1tZWOBwOJCUlISEhATExMesWr66uYnZ2Fj6fT/PK9PQ0qqurUVNTo43XxUP6EnlicEsCOsu7BnhfXx8qKio0l7OLJUnCFh4DLbz+XFhYwPDwsBaerq4u5ObmmkkU0hjPJgJ6zAcM8I6ODlRVVSEtLQ3p6elhQFagVjI6Ogqv14vOzk6UlZWZSRwzcsJMoAl6wvX29qKwsBAul0sjsBMxyETKyMgIKH/Q09Nj9kQzjb+0TkB3vZt/rxLjIgK/NzlpnrBj0Mi2tbU19Pf3a7kwMDBgDmMqh0LUX2qN1sD77+GDSS/KH3JosTd0eXk5TLltaWkpbIzRZvSzMgFOWN62DQ0NZq6atwU99j5+UcbHMZvxOOyKApH29p3DSWgJBjGlqJss28p63aNhbbQttcTkejFOGLoXOAdS7QiVV00Wb96AyOD0W/T7URJYxFOUyZ1SPBYKCrdMuO3aWTgHVlZWtHcOR1FRETdrpZ0J5K/H68cfNHBeionQTCQS68tT96EsLSJ4/gJw6BB2Kgyo0DqsQfIkP3lrmiSf37K1wWSxOja2TkDT+XmoPhkqxVL45ivYz56BQCR3Q4CFvcPA/OScYCK6ZHMOcPyltd4e+J8/QbF3QiQXiZRMIhcT7zjAFe/AAV5Jm6WUn4Fy8RLUjSq3LQnDE+wF1ri4ONjt7HzIbLCWEcq8P2T1wYMIttxA8NYXQHx8aBUqtZRFIWViHbdgKz0N4dsu7EbYA4YXdJHs671+nYBNhO3PIQi0lYQFf6Q5IBNCi8k+CORWdQeg5iQ1SBjCBHg7SGJKcmgAlU/x9ddofyoQpqYsF1WKTkD55CZUcuVOJJKEKRFlJuAhzRaPpm/M+Oe+9UXB6UTwagOUirPYi+jxZ9Eq4R8aK7JGzMjYcpJyshhrv93bM7jNZjOHYJCp/Er6hsasuARBynwWI7ayQ0RbSTKmKzPpZPmUFLsSVf+n7QaqqOWZpTguPW10dxulmA8iSfnbi8XMDNhWV7QQdD9mx9vFURh3CtiTmO5N7neGkCK5jJ44UT+XP+c38VEXoioryWoB1acceOGVA/sDrsubx86ZwdsZe9NxrM7JyGnKxYBteqMk7pUAaYrThbvnbpsJbBzH+hXpuvbbKeFaVXv4AnsBD62P9hdbzODXjWuZ+WSoQ2hLoiA5D22nP94fcPr77NRHyE9+xujx6Fh6v3lOxKX09tgvuPDzZXjmvBajHwyeGJOAr19uw7Ou42Zw60upiUTYtdwje3GlpwHtQ1+GDxSsQVmi7dGoevJVXH2uFlK00wy+/bXcRCIFJk8YRK79/iF+GruDv2SP1TQ88UgGSo6exPmct3A4NtHcxRPCLN+WgE6C60Md6cXIvrnAvxiYGoIcmIN/ZQFH4lKR/vARxDsszwZO7rr//bGqf6a1q7sT/pBtVvfycWpBxPg8LyDNwj59nv8HUn8Rw7ZJ3xUAAAAASUVORK5CYII=", x_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaNSURBVHgBrVdrTBRXFP5mH+zyELfrAwWExSCRgDxqILWkQPEPTSCxxQRbLNqUmFRj0Jg2/hP6Q2miqSb6p9qCrWJIaqq1jdE2VUiDrSkgNEJCQBYMQRoDC/LYBXam51xmlllYQFrP5mTu3Mc53/nOuXfvSHhJURTFRo9dpDmkaaQOUps67CJ1kj4irSe9IUmSC69CyLGD9EvSYWVlUs1rl7MvLeGYoztBemT+2OTkJHp7e9Hf3w+DwYCwsDCkpaXBbDYHMnWWtHJFjKhR9+jDGR4eViorK5WcnBzFaDQG1IyMDOX06dNKT0/PfDZ6FmNDCuCc8/sDZnMMl8uFkydP4tKlS7BarYiKikJERISIWot4enoaQ0NDIJCClefPn+PAgQM4fvw4oqOjNdNO0neJiUeLAlBR3tOcP3jwACUlJZiYmEBKSgpsNhsWYQxk2PccHx9HR0eHSM+1a9dAzOhBvE1znFqHQWfEpnd+5coV5OXlISgoCJmZmSJ6zr3b7V6gHo/H70npQHJyMkwmE7Kzs1FXV6e5EQGqvvwZ4EqHWnCNjY3Izc1FbGws4uLixDgDYAccZSDRMxAaGoqxsTHR39nZicHBQTQ0NOiZOEvzjvoYUKkXzrm6S0tLBX0bN270RcW0lpWV+UXOEa7yTIm2xk5xcbGoB21dZGSkAMb9XE+qHNGKUkvBCW3k1KlTcDqdImLNMBvjiLivoKBAvNs90ziTsA0VGVlYq4LgMbvd7rduZmZGFGxfXx+qqqr0pImATWo+9vMLF9vAwADy8/MFjevXr/fRy9Le3i4i6Wpuwb7Op1i7PR0KOTr2Wz0uJzqwZ88eXL16VdSMLrVwOBzCNrMry7Jgl2QfjVWYMHu8CvF6vbh48aKYwIXEFHNbA6CB+NSxBXJbNwzr1tCYAWvdHhyOSxDj5eXlPscs7JBZ4CfbZyDMCGaP8V0MIEcz3pNXgKnepzCK3EgwhYXAFB7uc84wLGTYTdSaae9LtEMUop/VXPs9Jm/dwVNpdp4iQFBQlLqZF2OQqUemPmt6CpLu3NBM5jCANBE9IXP//VgUBdWyMOAdHYXiGoUh2OoDccfrQZLBhFjJiJmBZ5wfyJRzp+JF0+QoigwW31x50g2Z7CoaIPqN1/9O/ZNkM5inpDEAB7fGW9oEckn85vanQgZkEa1ZOLs7PYohgxkxxmB4Wh9D8c4QAx78NeNGozKF98zhzDuUqWkoRL3GnN6m+4kTIUmJ3HSY1FxAHhnxm6wXhQCwMoDOmTGsMhL1RgkeKkZ2xJE2UX+7PAWZj2dZxnyZC45S2NWjAbCZtAleMiItWDAfiYJhKqQXMgGCF2G7qX6pUN0PmzBG0b6gNMAoL3AslureDcFzaWIAfDrYLLGb/BYsJpy5IHVXuBv/hEwFyBJKKy14OTHO7gIWF9ecUxhO2IL5qAOJnbbdGvX84mKVrLNuVxOoDZIRLyOhr6dqTSdbahWowlchODlp2cVvUAHmGIJEO3hHBiyp20Q7m/q2G0zLrrduTYDB6ttVj3jFfdJ9/Lb5/s9w05mvHT7qieUnh5uaYSp8X7SNGyJgMs5GnU7O32r4FdHxm/3m84Gkqdcrwxoaoh+uZwB8KvA/oc0SEoJDdz+DR5mGSLO0MBmbwqKQnxgLe0cvJItFbEGWiaw0fPusDkP9IwvWQAXAJ9F3RV/pR26Y+K5Gg5fppZwjNtPpVt1Su8g2AEoji1GysxvXu02Y7noiTkMPhVGS2oys3ijUjd6c53zu+XHaXj2rNexbUmly0KOH2y73CLZeyMDgxD8LQMR7Y+kotuCxqRNFLQacsX8IRfbi82e1qN4h4017JtyKB83Drf4ASB2rY3Cv9Cc4bDHaSBzfjAQc9Yp0jts262rU7a5eGAFJuHWVcM5yPV3GUeUmPgm6JZyzNA49hFUOCrj268LzeufntGuZ/kbEJ2IL1KO5prUWH/14cG7GcgfEfFG0ZRK+KbyA/akfaCNO0nTtmr7kpfR21y84ePsYnCN9mrUVOY8IXY+6omrkxGTpnftdSpe9ljtdfahsqEJNW63/xAV/GHPNIKMZ+1P24oudFSKlOudLX8t1IBzQMaEBOfPHeWLlLrpdzkDLkLwuEYUJ7+DQ9jJEhUfqh3iBX+RLAlBBcE1UkJbPHxtxj6JlsE3smLGpccS/FoeENfGwB78WyBQXd8V//lhVP9NqlJUJf8ieVf7Px2kAINrneS4p/5s48Ao+z/8FEByhjcaQyIIAAAAASUVORK5CYII=", R_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAfZSURBVHgBrVfZb1TXGf+de2fzjMceYzzeN5zEJo6wg01QDA1OXVoKgRqlqtKiNg9Vpb5R1D8gaR/6UlUF8VBaVYS+RFUVCYRQ0rQmxHUNBFLbMYVgsOMNe7x7xrPd/fY7984djxsbkjZn9Oku851v+X3buQxfcJmmGaJLN9EBolaiOqJQ5u8o0QTREFEv0SXGWBRfxSLFdUS/JVo1v9x6i+99knz2GMXcuzeIfva5/1QVxvg4tMgsmCBAyMuD2NIK5nZvJuo00S+2QoRt5TVdrsGG2X4Xi0H6wzlo/f3Qrv9zgwAzcy80N8N95Ch833sNQk1NrsgJopfJiIknGkDKeXwvOsq54vj5s1i59Uf44l74t1dB9xfDqwbAXLbHaoUGxR2FK5WAnJ5Fcm4OBc0nsO0HP881hCs/TkYMbWnAf3uu3buL5A9PgCWTEHY1A01FUMImWJULaingvWdArxYhFolwP9ShxwywMR3CoyS0kRGCRIDvzFl49n9tSySEHOWhXOVKz9+ROHIIotsF9+42uNw+uEdTcEVk2iXDFyLlHSb8jfSYlJE0kjBHEnBHJNJLBj37LATam3q1G8qf33bUWA5mdG1EgGc6Mgmn3/034oe/BVdJGK7aWmLiP/KcsewGs82FZDODsWbAfdeASCkmpsiYhAn7x3ODQRsbhU7JGrh4Ga6OfY660yTrVNaADPTj/N6Yn0eSlGNhHm7KbMFioh+zmbcsG8cwS17mSj9D16ENDcLYVozg9Y/ACgsd1noeCicEbzhvpbNUNdNTBL2bkJbBOCny+n3m2fDLUAvp6pWRqpPAJCLZJsHil6w9gqZCyM8HW1yA9Ms3c2210GaZeKxa3k9NIdG5H2IiATEYhFhVDcE0ba85AuSWtp1BribvXvBArBWhJXR4FBEY0ch6E94ezYLAZA4aFIapSRipJHRyyj90ByKFFnb3rOcIdDsmqVd7KIYJC3YhlbLI8ZhJMpWfjNjzMrwnfRDaSHyJBu9TFPvn6P447WrUsdouQSlSLH57LyGhKpYTAjUw9ffnHHVWa+e6Djhv9Hf+YisndsEwgJVlWwhXziTEv28icIxCIyjQNRLMFKiqRJSGRB5KTSoCr3thJtKZfRSS5WUKg2bJ5Ebo772bG4YDXF+r82TcvmUnnZNwhAZihBTFU/NI0EMKBL+K1ZUYAn4DPq+OfD+Vos9AMJ+E6xIkRsb8mCFdqRDIMWBtzfaeZWr+4QMYy0uOylb+rs7ynpqOk/H2NUMUBsTjkI+ZyH+aQSePgwGCXVApwKTElC0SCRW3S4XXrcMsouSbWQVLpzZUDsugYH72mWNAnQBnpEZXbeZN6kxzUyYXK/B4aQgZErweLauYWlb2niMBMw1/iQFl90YZLAdZc2wsmweuLPzhMujU8URCgsePc5v19dC6DkL/xkGI7c9AgkhJNU4x/xtEhcKljVmpbrIADFcTZN9LVJadEDzlMH+zAvnwbQgfXIVw7Srl04qlxywtAyoq1g3jc55bolPDiEajEKmEXNPTQDgMFgqto6CbdhyFdYiYsUgCqAULYTLCn30vKwahlO3yvNHBnJyAwQRopaUoKCiA2x7dUY7AhJUMNDg++HgerY3FKG1ogKoDg8NLeO/mLHpuzeHe+JolrKkuiEN7y3BwbwX2tZQQACWIJVX0DszgSt8M3v8oglhCtXi72svwnQOVaN+5DY00FU2qrNGJGPbsKnJsm+AIXKCb160NP72CfwzOo7o0HytxFcm0bntK4agO+8kTHdMLUtazQJ4LxQVeRJaTUDX7XWG+G4UBD+JpqpY1xcEA2ws9hKCJPJ+I0UuvOSIucAQ+dAz4blc9JucSmIykSJAHr369Gi+3leHIvgoUBe3ZPxlJop+Qudw3jb7BRUzNJ1Fe7MWhFytwvLMKbTuLEfDZqTX0cBUf/mse79+M4MbwIlzUME+90oyc1eu0Yj6IQgZBtMbrljzmIbGmH1E8peL+JJWiomMPwen1iNhqRZbTGHuUQJ7HRcYU2fEn4rI5FdIw4rIzq8jFz2rE8Cd6OMn/SMkM03NrkCiReocWce3jBctjLsRZXe2l6O6sxtPVQRQTtFPzKfQNLOBK/yxGH8WzfDwcnbvDhEwlqkry8ExtCEXryi9w3Z8bx9G4gt0nLmKahNpNgaGmNICOlu1Wco3PJnB/Ym1T7/0E/c66AjTvKMTUXBKDD1Zpj2INp9ryAHp+dxh15fkOuzWOcw8k/PR6kt/fvLOA028Po6m2EN/uqMBzDaENioZHo7hGsb1xZwmJlIaaMj86doVxdH+F5XWOTPQNLeDd/hl888VaHH0pez48Q8rtcZzDzLUMwjmSKQokPkwIheHRGAZGVpDndWFHZT72NhdvigAvx+ufLGFsJoH6cj8aCQ1+9fl88Hg8DtsE0fPOMf2xh9KlaBrHTvXg9qfLOVwMlRTPrj2l2N8StkqRw/3XGxEMEOTxJO8Bdr5sC3pw461XsKOqIFf5hkPpE4/lk5EEfnX+E5y//GDzQbHJEojvR0ca8OuTLyAU3OD544/lWyHhGHLunU9xqXdqQ6bnrsaaAopzNX7S3ZjrtaP8i32Y5BjBc+JNZBIzd/G+MHB/2aqYBHW8hqogniKF20O+zUSd4XL+54/VzMfpBfPLLf4he/r/+jjdxBDn87yTqAVf0ef5fwA6FwS1WEURlQAAAABJRU5ErkJggg==", B_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbKSURBVHgBrVdpbFRVFP5eZ+l0uk2ZQhcKHSi0lkWgUCRaKEtstNQFYoQoW1TwBxExUSPKUtQEQ0gAJWqDCJgQBAlLRFZlsYQIBLuI0pVOpbS0tJ3pMp1OZzrPc+97b/qmnVqqnMnJfW/uu+c72z33XAEPSaIommh4kTiTeDKxhdgkT9uJrcSFxJeJjwuCYMejIAK2EG8ntomDo71s7UDyhX8BZtZtIl7be67V0YVSqx1369tgDNYhxKDF1NShCDPqAonaQby5P48I/VlNw0VIbubUaHNi16FinLpiRUFpU4ClIpISIpH9VCLWvPI4LPER6kkr8RxSwjqgAgTO4ntMAbe3ubD56xvYc+I2wsnC4TGhiBliRKhRD702iK9xe7xobumEjb69V9+OBlJ2WU4KNqycplaEgS8gJQr7VaC35VeL6/DquvPo7PJi4lgzosKDyU6BLxLZYkFZ5++JDqcbt6tsfP7z92ciOyOxX08EqcBNavADp8owZ+UJGCjG6eNjEEKjkxRxub3oJI41h6DTJcJJHBGqR5dbmnPRN0EaDSaMMUOn1eCFd07hu5MlCgw3UMbyVwBSwnHw38jy1zZfRGJcBEbGhXPBU1LMNIow6DVYOCcRi7NGYURsKIZE6LEsezSWEgfrNKSciPRUM3lN5GsTYsLw+uZLuHyzVq3EJj8FZNfzbP/7fhuWbrgAc6QBY0aauKB50+Pw1qIUzEuPw/0mF9o7PNDpgnDrTguq6jp4OByubtQ3u5CZFoNVC8Yi64k4vnZ0ggnDokKw6IOzPJ9kWqtsUUFWYC8NK9jz6i2/4sKNGry7ZBxGxUfiiyPllHx6pI6KRHG5jQMyL3i9InmkG1qNQGHS8jxwUOwtcaHImDQUhWU2tLS7sOSZRHg8Hqz/sgCZ0xKQtz5TUWIn5cJarRwPDl5d10bxKuVuJNloJUvv3HNQMnWguMIuJR79nGQt09xsdKHZqSdgL6S0BEqr24hblcSineGBXiOistaBapK9cdVUDB8WxmaXE3auFlJ55fTD+QoOziKzMe8PDI0yolsUZUcJ3EpB3gIrZ5Ti6eQafHQ6HeWNfnteRSJ2HS5D5b1WLtPj9WLX97ewZc0MNslLO8sBn08OnauUwAjF1uZGXaOTb0HOLnkHkPXsvagmDFrRhU+yrmJbdj5mJNTIc91+Y/V9B3nII2su4GR+tVrDTOYBVnh4MSksa0bPxhDQRgu9Iouxxs+uJHMrnk2upDzogpa+s5hcWDDeg6qmYJQ1RPpqREenhzN6KgdKqlvQaHci2hTCRE1maBb2VFTaqODKXpBeHSSg1eHmFrE97qJxRdqfmDCsHmK3m7iL82hTI3KSKzA8wk454qGM7yLw7oAyK+62KrZYtHIs0EIHjBLrHpbIoHGRN3RYN7cYT1oaEB/hJFDRJ1SphFljqzAs1I43Dmeo/CX48kGRW3G3BTMmxvA80CqfsRD0JWnx1vnXMTHWBoPOI4lSl17Rf0XSkBZsy7mGgwVjUG0PQ6MjWCVL+jicKqdCLAT8mJQODUGN66P3fpruAx+IwoPdmJ1Uh7yX8rF8WlnAb0zhPgXsTAErexo9PFylqT+xRLxSFYvBUJtLhx//GhlwbkrKUOXRyhQoYk96quOz0hiI2GdBR5cWH5+fgsHQmdIRKHsQ2ef/pBGRdHj5GpdCpsAl5S1zarz00FcHqnjB+OZ6CupajRiIKpsisCN/fMC5nAw/r1wW5FJcRWxiW2fsgkO0hTw9h32vkESHdmL7c9eQGmPz+5+5nMX/NFl+pNiCkoYouDxKTSGLRKlclx9bRPkWpiyLCpJ7tf3sjSXHmwtTpQWB3EDU6DBgN3lCoVryyGcXJ+H5vVmooJK84cxUFNWa/cFlWcvnJ6vB9zFs5TS0yF7gBSR96XFY6xy+8tmbmKXnVp7GtzeSsfvaY77/g4JEqo59e0W2bxPplPz5q2w6LX0KjGKdEVdTbpF2Kl44tGUujAYN+vMEczeLc4fbvwvuD5yNeR9mqMF3Km2ZuiPKhbwl01KjsS93lq/pDKTELxXxuFgRh/5JWkNA2LNxJjU18cqEVcaS5v2W9GpKb95+gMXrLsFKJ1oP9XuV6AMeHx2CA5/ORsbkGDW4X1M6YFte0+DA1v3FyDtaSgUJD0WhIVqsyBmD3FVp6qpnxUBtuUoJC3pdTKrr2nH0ghUHz95BAT+2+9L08dHUC8Zj9cvj6Lg1qKeseNiLiUoJVh9yid/uPccOrt9Lmqg5dZNXRMRGG5FEpdxo0AYSxZI79z9fVuXL6T5xcMQusjv+1+U0gCLK9Xw28SQ8ouv5Pza/a0GZw5zKAAAAAElFTkSuQmCC", W_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcMSURBVHgBrVdrjBRVFv6qqh/Tj6J7hnkvQg8irHGAUTaBGFxGWJLVbKLubnazLFk2mhgfia9E4w8T/aUxMb7iL4OKxvg2aIiPiaJiCIqgMDOCCuj0wMwwDe109/SrqutxPfd2VXc1TAsYz8zpW49b5zvn3HPOPVfCeRJjLE7D9cTriAeIE8Rx53WWOEl8kHgX8TuSJGXxexABJ4ifIM6wC6MX+Lf4rcQtdoDPoopps/GMwfZPlNk3Uxo7lNKZQc+a0BOO9+YkqQl4goZPUXWzoELFxvZDRQxP68TGWR8y4sVxBev6WrB+SRjdUZ/3dZL4alqW5DkVIHC+vttdcA785mgB735fQkCR0R5R0BZS0ELyfbIsvjGZjbzGkK8wpIsmMmUL1y4N4b8rVXRGFa8SN5ASB5sqcKblx36u4KFPstBMsq4tADUoC0slqfFT8Yz/in8G3WSgJRJv7rsqhhXdwaaekDzgfJ0OuOB7xst4+PMcOiI+LIj5HVSJBql6zc4wg7mqMC6LC8REzsTkrIF718awcUnIq8TlbpbIHjEPei1/5PNZtIX96FT9MJgMw5bFWBHXEl17mO5NcU3vnXmcu1QfOqJ+PLY7h9FUxcVJOFh1DziuH+PX6ZKFu9/PYIbWdFl7gIyVqxZLjvVVZ3NfUAyYUH1Z+CUDJSuMohUlWVLNA/zPsmwcSVcQCzBsvaEd0UDN5j6+FD6P9YJeHy0iVbIRDviEFVUox/1McnXGReEkloSOIChXYNM8kziiUJbkB3C83AdHB/qRSZaCGd3E8/vzuOPKmAt1F2fZWfv/8yfTBQtDxzRhNeeqex23ilEiBlp90+iP7CerAwRSQZt/Cqoyg+8LS7FC3YelkRGSZlaXjRS2GJenYOhHHbmy6SqwhWNzD1zvPvniuAbdosmUXjqB6aYEWa4tlFiGVn8GV7UN4Wjxj/hn1yuYH0jXgmiw7X28NHkTLgl9i9NaHCeMhfRVNT64QVSr8PZhDTeuivLporRz8etcATt/0glEFsw/zFEmuUEmRovuLYuYYXn0S8z3TQJ2xWEdkq3h750vY0rrxDwlTRLIYnplwY0jGXsnasHIaR1XgBceWKTd0RlbBJrkKMHzv0DzKwRcMasjt+5EuQfLQsP0FRemO6MhWCVg2zbEkhToUZk/dmRy2cmcjVnNdhUYkN3UG8uatWh3c56zRqAlKixLQiPkCRvZSgQKK5HCVoP1XtYtHrA55I0gLo0chiLZDbIn85arQEJ21oK0YvUig9ogaFHLUfSTy9e37cAEubc3MIad6aspLBzL+ehwSo+jaMr4obAMfaEfsWXBVlymfgtXKMeYqisQryWlJSqZk3IuujP2BCaxJrYHg60fUYotxGi+H1kjhqH0NQTKo9oSnNI78Mz4PVgUGqN5CVzTsYMUH8ba1k+r4FWhCPnr1vEs4CUx3l3fNByqTzpcXE6R7MMbJzdjY/sH2D0ziP/0vIRJbQGeHr8XLbKGWXMeBa6MK+Z9hZH8FQgrBVGwZq0Y9mbWNsiMBmpYWa5AkgdDV1RGM5ox5mNXZj1yAgT4c9tOvDa9GSvVb3BJ5AhFfJYCM4G8peKd1L8QVDRcFh3F6yf/hwBVyXGtr0Hexa01LFEJeTgPBBQJ/Z0+HEqzOZUYOv03bO59HttP/RvHSkuxiiw9VenGe6cuhWa3kIcZYqRIvzqC49oi7Jtdg9sXPo7nTtyGn412klCNfO7pSL0cH+RXn7l3A91+DySDd8srkHXPTtxB+X9AlN/dmUGElBKWq8PY1LsNf5n/IRaHj2FfbjWm9R5c1/kWtk7chtNGh0cOw596GxqVXZJTivlGFM9Tnd3ybgFlqoCSWwKlOZsmxGgT4mv/j+5X8fb0JqQqXeDla6X6NTqD09g1s4E8E6qC842JUphR4/LidSq6IjUPtPr4vkxKvEg3d6rkmr9e7Mf2H0yxkTTBFpQz4+ihHM9QfGzq2YaTei/tAwcwXekhL6xxwGv4gjYuDnjBt3Hss7bjArVVt35QRLoMT11orkmEop2D8eVgtOkUrYjnrWM9cVcYeHRD2KuA2I7FndMiPcWvowEJ91/ZItzJGsNgTuI9gMUUFEz1DHDUraefW1YFveBPuW1Z05bs4zEDj+/VwSS3ODVMPzc5DQkf71kdxMa+WoAn4WnJfrUpHTllkhJUXkvsApSoN6fUzeGBtS1Y0dnQGc/dlHqUaGjLU0Ubrx4yMPST2dgNS3Nj8x+Z3m1IKLj58iAi9bKbxLnaco8SCZxxMOGK7Dhi4IspizYT5jhDqiHztb5onozVf5BxLWVST2NlTaLJwaQpOUezJ+c6axUNmw2nTLbnhMF2jhnsu9Mmy2lNj2ZP/trR7HwU4YfTbezCKOMAJ84l/7zDmtWP54PEK/E7Hc9/AbkcMWjs7iOkAAAAAElFTkSuQmCC", E_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUUSURBVHgBvVdvTFtVFP+9V9rQlpXyT5F0pUWcomTTpCH+SWAQlyCJusWYTWHRjA9+MXH+TfxghvvCMo1kTkOiJIPEQCQh0w8mxmRRTIwOEcb+xMgSKWtImStSoJXSlne95/Xdx6N7A4qbJzntfe/ce3+/e855594rYYvCGHPzv/1cG7g+zNXH1a2Zo1yDXC9wHeb6lSRJUdwO4cA+rl1c51lucobGbja/tAEwre4Y16PZtuTqCsLxEG7Ew5BlGfkWO3YV70aenGc2VQf3xvvIhYDG/Htk3KxKLLWIoas9GP/rJ1yOnDedrKrwITR6nkFj5bMod3iMpiDXRk4kuCkBDk7xPSvACbj/90/wzdQXsFpsKLPfg6L8UuTnOWGVreqYtJLCYjKKGNcby7NYSMyhpaoVrQ+8irvWiATNSEgbrfyPvy/i+PlXsJyO4173gyiwuTIDJPplhuEs88QybxPpZUwvTnKrjHcDp1FbFrgliWwCUwJ8cHAQ3dF3UFm5E54dVRlQjiBJkg6p06B3THvDMlYoQGjpT54r03g70IV93ueMJB4RX4lsAO8S4CMjI2hra0O424rCZDlSSCLFElxXkOT/pClQO4k0tyUVsvE2t1OflMJt3H6304MSRzk+GH0dVyKjAoowjq3zgOZ6Wj1CoRDq6+sRDocRCARgK7DAf9CFwvutWndm8JvwgR6JtYCwjFfSyiomeSiLbGXo2XcOBVaX6O2nUAgP6Iw6OzsRDAZhs9mQSCSwGInjUvd1zPy8kFkdaKXJTFvzilg1eYXaaZbS3yssDYfVibmVWfRe+RAGUT9vSfve59XgcOCamhoV2OVywev1kncya+Vx9rQ44X26wHz16htJhFP3CDVnYyEsp/6BTcrHly2/CS9QDvipcuwXE1DiEThJLBZDPB6HxWLRJ706tAy3vRh7n39MB2RZJASNTC4ylcCCcw6pVApMYbh8fRSPeprIqpZ2ItAghvb39+vTKIqCSCSCwsJCnQB5QZp047D/TWxFaAzNQ7q6uqr+i69IkwYiQIUHyWQSExMT6yZYWlpSB9ntdv0d9duqGMNHJZueBRF6Jmwi4KPW2NiY6SQUBgKlpKSJqK3HeBMxrlb1nqZEQiPgIwJusdpbCcWPlAbl4gEzQoKA1aqWcbdeiOjlZiLimSto9r/RM0RALYkVFRW4U5JNQnM/SZRaQWpVV1fj/5K8PP3coFZCNfUdDgfq6upwp4XqiiEEF4jKD1xfoqfm5mZ1I9pIdl+bhu3kCeQiVKwUllG56Um+ITcJ07AoxbQRuanw+Hw+9dMzk/ecdhx32pGLME0VTa2j45B2eoW5SNb25T56Ki0tRXt7u+lEHxU4cgbPFvnQi0bwXsK+aTuORqOora3FzMyM2svBM/a0y4kjNityFWZUDmw5+7WRwNp2rB2RTlHb7XZjYGBATZQKnjDn3Du2BZ5NRD5x0gh+ShzL9HTUcmEcWmke6uvDnreOoop7QHSSto65Lvbyx59CPnhImIIwHMk2PJSyH4fB3uDnhtC1LZNgxv+SEkg9ZyA9/oQRfN2hVDYO1gwHtI6Q6hsg87jhhVZ1JSxLzVasKhWa1sOQf/k1G/zAhsdyfTKTiwl5Qfn8M+C7b3m6TsFU7tvFi8lTkF4+AsmzzYuJgQTlRAfX124y0s556SI/6iyAUc3w+/m1qApSUbHZVJTcHdu+rGqX016Wm8z/58upCRFxPd/LdQ9u0/X8X5OTyBcEudOlAAAAAElFTkSuQmCC", S_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaESURBVHgBrVfrb1RFFP/N3N0+t1ARKBRatlDRgEBFQsCYlH4pig8gEpUYjED0iyL4F4hf/IAPqCE+CAqCQQmJgBI00fCIgEKILUGFIui2xFaQvmh32cfde/3NnXt377alFGU2Z+/cmTPn/M5jzswVGGazbbuUjyWkWlINKUwqdae7SRFSE+koaZ8Qoht3olFxmLSR1GXfXtum1t5KvhhCsbLuddK6AXPxOKzWVpjtbRBSQoZCMGbMhAgEBhO1nt54A7cDwEV+GNrNeqynB/EtHyJ5+DCs06dyBNhuX86qQfCpZShY9DhkZaVfZIRURyCRWwKgchXfvZ5ypTj2zltIfbYDoqAQRvl4yDFjgaJiiLygXpNKwe7qIm83rLZ2WB0dCK5ajcI1ayHLy4cEIYay3Dx1EtGXVkPEEzCmT4ccOTKzoD9y2/e0YzGYzc10iUTRth0IzJx5UxD9AfzpKU/u2Y3YmpcRCIdhTK6GIKewbT71EtV3Bm0txfae0H2b/fSlizDb2lD00VbkPbrID+IBb5cIn/KNcBMudeI4okufRKCiEoFJk8ikflp5xgN2LnzbzQZHufPTY6YC0dmJ0IGD9MQsj30TZb2WAeC6XlnvZLdSjqtXEGRSSYdJaA94C0ZJLSZONWUG0GfRZez32FkPaDiw0mmkmhqB8gkIHToKwTC6rUqFwpXkbDct8923gcutMIJByEQCgiSTCd0vMyHKSYUpiOkWRC1tDKchqkmVHB9HsjS/SMT1WjMFg9tUyUxsfg++ts4NpbPfuzzr++bOhmFZMEpKEJhYoeOuGCdwjxewPyMPGCs1jSSlbO2Jf+iFsyZrBPtX07Avpx0vWEyGdGsL0rEoLFofOt3keUHlQJXywBIPUuKTjyGpXA1KZrJQpCwPJiFGk+oI5X4qGp0CzseAk30svlHgZz7vNoGHCVDNm+QtTbnei0OmkjqU3NJJ1hK3OaVdjdd6I9a3B7Vy2qyAiM4ODWAMhQeptJTPnjiws1uDWOCuDnF8aydQmCQPFU9lKARBsGKCNUGappZJ1vSxH/xhqFUhYIagxo5GEa2qgCqmkhlnuAknJocgakqAOSw61aQttHYyuRJ08G9UXEiu+wJ6S9LtWFEInCO475Owr0VhX+jToVDKGU6uQPHldoj8fAWgSYEKO9afacxkvEQ244W4wapHd1dw6b4eYDWVPUYOm9aWkFIJ4AZJbfNlpEO9BEreiVGI9lh25/hk2y0tngfC0o0F7L6oqxC5LZ8sfUoRgTRT+Fhad4BAGFtU0uIHaZ9BAF9wrIzvv5PH4lwJbR6RFebJVk8r8kcmD2SG43pP1mrfIpXRGMneaLIyL7CNIbBo4QgqXsyQ1NMjUb4HSHs415vWO6OI/Pli0NNO5Bdk+gqAUxJlVRX8pS3TC0nN1ULB1VR2hc88oYM63shuxxD7vxJE2NDzf5OvRGSt98stDnnSu5XoiDNRNQWDNpPWnKfgDgqcTYub2Y9xbFzWebib/W5L89TTukvkUTn2VzrXcs9q3+GkpJxxJkeN4va5ZyAAJYQhRpulw/B8EfAlY9zIXDhnaqt/Yf8Ix14spvvJ267AEOQ1yxHhPynFtGk8xvM86c4uOOK9GQszJ5Zby92/Xgr6Kam3WQVd3MBKFuXYBsZ8A5MuSNveHKFDpQC3ENQ38QHKHeufWOw376hXitVBVGqxZJrz57qFIzd2zl4vN/S+n0sLpga0QhUitbkvmlr5cQItEtpDPkMsl4KnGyEqMreluwLqXCaIT/myVlZOgnx6ObBrJwY0lQcqDPcSxI9JHWelSFWsXqq4wPdOS58JXVbO0oz1z63wK9+udA84jsF6nZo3B5JneP9tmWnKEyGhPaCainUx31vTWW0+6x2iYmPvfj8A5zj2X0g2KS84fV5I0rwTyJsBGEbzx95iBZJ7v4Kc/5A33UDl+jj2AVC5oM6FsHq3dn8O+9VXbu6FYQDIKG/YDPnMs95UBL4rWWYzuwN1LgMXLIfcuYtZX5njyuEqdqhsHIx9X/dXXuf/apL+xe5tdSm84lS/kK7bDxCM1V/4UIoLWIxeWAnj2AmIefP9ypcOeS3PCBvkw0RdqawP3ucx+x33eQSDNhYZ1D8CsXIVr2fj/TMRDPfDxAdC5cR6uImZ065fZ/U76+wYdY+AOkem8OpeWjqYqAboz7P/9rHqfpxut2+vdf3vj9NBgHif5wtI6oIfxh34PP8XvOE27kwabTIAAAAASUVORK5CYII=", k_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWVSURBVHgBrVdpbFRVFP7udJaWTsvUttBSkBYKLthQFktQkrL8ckkEA5oYjDEEMPEHYKJA1JTID0NigPnhn8ZI6w+XxAQSjISgQo1IArELatCW0qHQltI2M531zcybdz33LTOv7ZthipyXk3ffu+ee77vn3JUhT+Gce+i1lbSZtJG0ltSjVwdIfaTdpB2kZxhjATwKIeBa0hOkfj47OSXaPsg/ywEsetdCun9GXTyOlG8A8tAwmM0GVlQEx+rVYA6HlasjpN5ZRUTv9YC5Oym/n4ePfsIntmzmoy4HHy2cpvRvbO1qHjp2jMu+genRGMgWDWYBLvJ7GlqOoQQCiB7/DFJrK+B0wl5TA9u8eYDbrfaY0aMkE+B+v6ry0BCUsfso3LUbxe9/gILFiw3XPtJtFInurAR0lhcN8OT1HgR37ACPhOFoaECBx5OVOTe9eTSK5I0bZMTg/vIUXM9vMJPYRCR82QgMGODS2bMIvbVT7bG9fhn5or5yrr01Y1M3mGireiMLtSxq5b4+yLf64W79AkU73zSTWGWMCWYCPwF9wCW7uxDYvBH2+VWw19XBJgwtwBnTXKhwTEXXIiAeUaZ/cl8vkiMj8Jy/AEcmEifJ14E0AT30ovdIUQ4nt2wC7t6Fs6lJNRBq060ZN4WOIR37dAr0f4r+T5FlJLs6wSsrUdbZA1smjXUiFXb9o8X46227hk55A+bUF6JqbrXaM6Z1VR1w3IzLp5IwJ5QrXGUr0jG6fBWikxGs8f6EAy3bDRMR7f1Mn+9+8ef2SAgNr32HWFxBabELi6pLyEGGADeRKJnjwNqnHoMsK+gdDOG+X4IJ3sirWvYNBxGJJeBy2OD74Q1UlM0RtWIM1IkIbDWanfnllgouAh6WUojGUrAV2DLdI3/lZYX46O2n0bxqHsxy7soIPv++F8NjsalEiERC5qrPeFKB9+s/cfTddaJSXdqF92bD/JvzNzUg6rFCPMYDcUgJRVMiVu5xof3jdTPAhbywvhqth5pQSQSleIrapNS38JGU9UFKvn+8PGhu1iwIiIWHjBT88c8EMolkCMVkBIIJ3aGMd7bVY0FlEbKJqGvZ9YwKHif1hxKYjCSn+Lx+0w9/MJ2uRkGgVpR6escNGz0K2mdEkhEkJ6VuB17dtFCb4zl0fUM5ykocCBB4lNJo5fPf20GDQK1NzwUmqQHSk47BPKRFdJYvLEG+0rSiHHLKPDXYlHL/nfS+5LGlQVKKhasMiUJXAfKVeCK3L3exM10WBFQ6tQtKM0YWm/SlzlHkK919/pz1npI0gYAg4FMJVLuRFZ1kMpzEz9fu4UFy5a8J9N8N57RpXF5hFH2CQI8oFbrseG7lfGSWtZly4GQXBkcjWevv3I9i76dXkUvqFpZirjsdgW5B4JLxtaWpRitk4TB4L4KX3/sV534fnlF3+fo4th/6TbXJJS+uX2T+7DCWYrERecTUWfrKtzTtUsZWh2wpebyqGM/SUuxy2nD17wnczBl2sSJq21Pf6ddpvBnpRpld7MtEop0+9onBcfClBbjYfgHGisiyHRuJcnBAK9bpag3N09v3hq3rzOBtAnvGdswnA5DWrqHt+I7FijA74SYFHc1cdCawLa41qtXtWNvmtSOSVy3P9cDZ1g5ekP+8z4eI47jXDO41H8s0IxoL5pNw8qt2Hily8hideCVd47NQYS/aRkiFr2knZI8102nHcbnjEo89sWxWJCQTeKymiqc6OvI6nptJNJpJKD4fj+/ZzWPToiHlAnYX8fjePVwZGpoO3oi8cmZxMRFEEocPcmnFkxqIhUorG3jiw8M8daufP/TFxDwmoF2r9s2oC4XAu7rUGYNwGGxpPdiSJWAVFVauxOA+8tCXVT0abXx2Ii6yp/j/uZxaEDGu5xtJV+IRXc//A3JH6kNlV3F4AAAAAElFTkSuQmCC", N_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUFSURBVHgBtVdbbJRFFP7m3+2dlm1q6UVKL0hohLZbSVCrWBpvBEVbTOABxJg0PPBCTXynvphoYgqGRMEoKIYnieiLMcYAakwLKiUSxUvDQikodtu1173+45n5Z/5Ot9uWusskZ/ef2/m+c+bMmRmGOyyccx/9tZO0kvhJakh8qjtEEiDpJzlHcpoxFkImCgHXkPSQjPKllWNi7mL62QLAwroDJF3JfYlwGFPXBjE9dAuWZcFbuAxFjethZXlTqeomb7yGpRBQzM/AcbMssX/HEDh8BMNnv8Xo930ppnIU+htRuXM7KtqfRf6qKrMzQNJGRAKLEiBwsb6fanAB/OebPRj84AQ8OTnIu7cS2StK4S0ogJWdJefYsRiiIyHEQyHyyk1EgyOo6tyD1a/ul+MXIsEWsny07wdc3LMXfDqMooZ1yPIVCUPBWLIKrp0gv+JT0xi/8huYxdB04j0Ub2iel0QygasafOjkJ/h5XxcKqleh4L46OZCpGQwzmFoL5zPauCIy+ccAJq/fQNP7h1HxwvMmiWa9S5gB3gMVcKO959H3ZDut40rk11TDkqAOApvDXPQot0hgWXP5Tfw+gMhwEBu/+gy+DX496SAReMXVo1wvrMc0MT6/pQOxv25j+QONpJe51mt4xpV65rjfsV5TcupceoXDjtsIXexHVkU5NvWdgXd5kSZRK5bCUpUDunXgjR5EaIt5sr3gkQh4OAKEo1J03Y5GYdO3TdvRprrTHlZC46lf/kdoXiKG7GUFiA4OUTAfglG6lDFyv4861g/im4aHwBIJZNPezqtaCYsba5+07q6fGWZ9cOUh4QVb6L12HbHJKbDCQmy+8qP2goiBWuGBdj39xrGTElw0cprAKZqlddpyaa22PuL86++w9kjYHeN4T3gkJqnZ4+OUS45qOJnaBVarbvn79OcSXAizOeK0n7kBwKMCULldt6klmCERUSSc79jwCCWTuKs3SInMKK0id/q120r2dcJDqVWkV4sJYfDkZlN8eYw5c/xutLNZ3zZ5U8aLCEZuw7ZtJGznX2AIbBEDYv19URoYDAbh8XikiAFyB6joZmzeYyNlceOAc2c3CHAiJKS0lDKpV54bIa9aCznABJxPYTpF649R6lYEfJYJoAeYkglQEzxZryAgU6JglAnAhUi4oJZrt1yCAIlfEJjsvUCdYv0Ntki/2G4ccArCBFZs26q7AoLAJUFAgN1+/S1MXf7V2YYAMuUPET22+s9duwZ1zz2ju/oF1lldu2fLE7ibRRAo277NbDqnU7E4iHzhm7fQu+5BShwx6FVK1wvcEJt+W365gNyZ21Kxpc7lD0Utt7IC5bt2uBMzXSpf2mWCHxfYc47jOF3Bev0tSPwTzEgc6PXPqa5C8xenTAIzx7G6IsmzUpxU6z86Ost16YA7VwWG+nd6TPBD+lpmGeO74WxJ+Da1oP7dg2mRcOcR+FoCL37sEd0VUFiYRUDFQpsagPLdO9Fw6mPpuqUQMcdmlZWiidwudBngbearyfSAXooONRAlTz8OPyko273DBeeLiNRD1/eKzhex8afv4Hv0YRO8Y8FruWtFiodJmG5Lg28fwciXXyN8NZDyMC64vx4lW59C5d6XkVNZbnYHcKcPE4OEyA/dJPuT++JjY5i4dFnumMTEBPLqapG/ZjW8xb5UqkRwd//vx6p6nB7nSyujaT9OUxDRz/PNJE3I0PP8P0wD97WVommGAAAAAElFTkSuQmCC", I_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYJSURBVHgBrVdrbBRVFP7u7KPtltJ3KZDSLVRBQVo1WgRJgWACkSiQCAgCmugPQyLILxJ/UB8xmhh5VBKCWNBoQvAHRQ3EGCMYMIgQSgnECm2XIn3w6BbbfbQ7O+M5s3PX22VaWuGbnMyduXfO+c6559x7R2CEME0zh25LSapJKkn8JDl2dw9JgKSB5DhJvRCiBw8CZNhPso0kaI4O+/jbe+kXwxhm77aSbLqrb2AARiAAvaMdQtOgZWTAVVEJ4fE4qaqhaLyL0RCwmf+CRJgT7+7cQXTPbugnT0L/7cQgBabd1qZPh2fJC0h/aSW0SZNUlQGS+UQkcE8CZJzn95A0zoYju2oRq/sC8HrhmjAeorAIwpcJ4U14bMZiMINBGtsDo70Dxq2b8LyyDhmbNqtEAk4kxHCe65cuIrR2DUQoBBd5p2VnJz9IZW4qdzMcht7URCHRkL7zM3jnPDskiVQCrdL4wE8/IvzG63AXj4NrcjkEjRSmSffEJ9y2XpoJLaa8I9E2qR1vvgK9tRW+HbXwrlqtknhcVolQjG+DnXD6hUb0LVkMN4XaXVpKg/hKGE9GwBxM37SzwTJuXYl3OpGIU7Jm1n8P9zOz5fDtpOvtJAE79Ow9jM5OhJ5fBNzogocyW7MGiUQEMEzZJInYEUjQgRGPQ284ByO/AFknT0HQNNoo46lw2w9b5dteMty/bj3cHi/MggJoZFmzrNveiwQhVh+O98HnyrIsmtIdadxMUDAMA7FgD/RoBEbTn8h5ukqa4mhvEna9B63Q6zq6urqsULvdbniorjVKJCv0YrDv3f2d2N1Sg6r8hVhQuJz6NSjTmbxbBKhK4hQJluLiYks3EqtnGX+1VH4YiUQsQ05GpVJGvxFGfftedEXbcPh6HTY2LMGRjq/hBKlPSogqyoa1tDOBapWAHMgfmkrWSxIsZ7qPo7nvEiZmTIZbeDDWnYvgwA1LVKLJilFIRKNRlV81E6iUynkK1MGpnjPOBo/hy9aPKTk13KRpMMw4CYXZGEC6ljloLIdfOiFFToWNSrbi55Y0nioqiauhJvwdbsac/MXo0/9BZ+Qqbvd3IcuTi19vfod3LqxGS+hi8hsnfZKEDb9mz4XF1inZ1PBne/JxufcCjnZ+g7AeQpqWQe8KcD54ArmeIni1dJy+/TMGjKijDqmfnbWRozkNUOdO4nJvIz5veQ/jM0rx6Nin0D3QiTux24iblOE0DdfCtOAYupUX/KzqTNUtp5fB9cDlkONyue5iq+KhrJmYMmYGDrTtJM/TUeIrR2+sB7f6O6z+6qIXrVz4of0rikA/FhQtH6RLzSWFQA+3AtxiAkOFP6T34tO/NlP5RTAju4ruUcoB2p7pmeHR0nDsRr2VB7PyFuKJnLkYDvY6wAgwgfOSpdIxOBokj2XPoqRrg983DZ9UHKI5L0Q0nqjpLdN24aOZB7F56jZkewtQe2ULOqJXHXWxo0oEGtjiMZL1/JSWlmatBQwZMibmc2fhuXErLJHo1f878kWICEemLPMR63le0VJK0r6kHjX8bEPBcbkU80aUw5XQ3d095GrI4NAfaKtFaebDKEybQIn5PiXlk1hRsoGeJyIVkgALl19eXh6UfMuVu+F2um3kdrilBbGzf8AlNAi5+9jgRaeTQjuBMl0iTOuBzz0WV/oaUT5mJpwg9wT31GnwVVTI1/vJudfu2o5BR7DY/LnQrl9Pbr/32oKHgqlKySS4Dh2GKEke0cp4O7aywT4i7bBe037t3rMXZkpZ3g+YgPbBh6rxHfJYpp6IOBfOwV6ajW8PwnhrAzReIe0xo4mE9Nxg4zt3QVu5SnYF4HQks0n4oRxKzd9PwdzwJnCtbcQk1MMpcvMg6vZDzJ6jGp+vHkpTl2LuWGYPhKiaBY3mDWvWWp6YKeLksSVc5y+vhnb6TKrxZcMey5PKHH5MOArGvjrg6BGgpRmOmFIOLFoMse5VCL9f7QlgpD8mCgnOiRrY5TkIfbTINJ63KsbkE46/jHK6DCI/30kVJ3eN+L8/q/bP6X5zdAje98+pAxH5ez6PhFcTPx7A7/m/pdEnBpG/s08AAAAASUVORK5CYII=", T_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWASURBVHgBrVd7bJNVFP99o+26thvdGBT3YCU84qLTzQUD/zBQwBgT40wgGkkcRo3/oYEERiTMBHwNg2BCgi+2xIwgcT4Sl4jZzBL/UGLdhqILmKzrHuyha/co7dbH5z1397a3XbsNttOc3u9+937n9zvnnvvSsEjRdd3OimeYVjEtZ+pkahfNPqZupp1M25l+o2maD8shDNjJ9AxTr353cpG+Xci+Ng8weXeC6evJbcGZMNyDkxgYnkJGhgZrlhEV96+G0ZCRylQd07PpIqKl85oVP2E2zFx8k9P46NJ1tF3rw89dQ0mf6vy/YnM+nntyI559bCOcBTmqSTfTnYyEe0ECDJzG92sJTsDvfu7CJ803YM40otBhhSPPAqvFBJPwOBSOYmw8CC/rS1EZ9QXxanUpjr5UiSKHTSVRzUh0piWQ7Pmvfwzj+dofEJiOomzTKuRmZ3JfNfbjpSa/S7CCO4EQ/u7x8vZL7+zGlgccaSORTKBHgn959RZqTrSh5L4cbFpnZ8YkqBYDjRPRIZjxBv7IypseH3pvT6Dhrcexb89GlUSFzAlNAT8DkXC/XB9C1SvfMvBsrC/MEd20uMv0LN3m7/QYGc4kFpIobvZ6MfJfAK0fP42tZWsl3IeMwBsxAiL05D1jPIldr32H/mE/Hn1wrQDQRE8Nauw1LSn8rDL7To/Vw9EIfv9rBAWrLXA17YWdDaOQ9TQUct6ckG/fb+hgU2wKZrOJTbco1+kQU1mGdVGPsNyIsHZF2fuA6Ce/C4cBmzUTniE/3v7MpbCdjbZBzPcaqvgDMxgcHscT2wpgNRuxZpV1NrhaPPyaHH+ZgPId4uOpC+/lcKxzmBEIzsBz24toNMrWDu73iwy7juWKTuAX6c34+Dj8fj/vsGLFChiNRg6uxUIez1mv14sLFy5g5cqV2L9/P7Kzs5WR0GMlaZiFIRKJcLXZbMjJia0RB4hKlawFg0EOTsqzno+plmBYamNjI/Lz8+FwOHD58uWEtmQhG9IuYShSRQTKpXFiqHZWvUkWu92O7u5ujIyM8OdUIgnJKJJSNGgYhJQTipOeQqFQQkc19KlIBAKBWCgl2WTwVPYkCSFOA8SWSqxU0FQGVSkuLsbJkydhMpnQ1NSUNlKqSPsUaSF2SkJdejQxMcGTT+ZAKs9IfD4ftm/fDo/Hw+uVlZVobW1NC0zOEQyVBE6JazabeRsh8CXRYDDMYZtOjhw5EgMncblcOHXqFObzXBXFMR89uSWB+UCl1NbW8qxPlvr6ehw/fhyLEcVZNz11MS0ncGpQMnSO0DrR0tKCmpoa9PX18SEbGxuDxWLBhg0b0NHRgd7eXpSUlKS1IYdYSGfCQjQ1NRVbC5JngpSenh40NzdjYGAAg4ODyM3NRV5eHqxWK6qrq1FaWprQX10faPyzsrL4YiTkgCaWYtqI7OT9adchhHU2JTOUDWipQgSis3p0yzkeBSG5BtqXGYlGVjlInpvNWfje81V8910qvh7fFvYU7VPBGwh7znY8FZrAy+074J35d1kJOMyFqN96BQ5LkWyJb8fiiHSWnm3GHByrOJ/AfKngVB4se08FPyuPZeqJiHKhA2Jp/rH/Ck53HeIrxT2lggJ++KEPsLt4r2xxI9WRTJBwQjmU/jbajnN/HsNwoC/hNLYQ8KwtltWmfLz5yHmU5W1VwXemPZQKEgnH8uFAP764dQZXWUQSZqSWHtygGbGrcC9qNh+GPTNfBZ//WK6QcCLpYkJEmns+xbXRNgz63XM+JOwS22Zsc+zBU+tewJqsQrXZjcVeTBQSlBN1TA8mt90JT+KfiRt8xgQifhRYnCiyrke2MeW5gJK77p4vq+Jy2qDfnXiXfDlNQURez3cwfRjLdD3/H52mHIk4a+3qAAAAAElFTkSuQmCC", D_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAW8SURBVHgBrVdrbBRVFP7u7E67223p9gFtWahbrMSESCsSH2CCJFXjGwz/iAgBjTEmgIox/pCHv4xRQCIxEqVqAv4SIhgNBKEQH6CBiknFmNotVGoptNvnPmZ3xnPuzN1OtwVaumdzcmf23jvnu+d859x7BSYolmUFqVlGuoS0njRMGnS6o6QR0mbSJtKDQogociFkOEy6nbTXmpzs5bk3+764gWFe3WbSDdl9QzED3e1dqOr4E8LrhVZYCM/8Ooi8vPE+tYW8sRWTAeAgPw7bzVKiAwns2n8e3/0Ywa8t3Vgcb8PBrk/t8c4Ybd486M+ugO+Z5dCqq92fjJAuJSCRmwIg4xzfA8o4G35792k0HvoLRQU6QhUBVJQWYIEexZtDTfYcw4DV2wurLwrzcifMa1ehP78G/vUboYVCNwThHWflGeOnzl7GyreOwkhbuH9+JUqK8mm1QqI2b6tF6onFrrm2L7i1kgkMDw9jMBZDcTwOn88H55vHycYoEN7R6x9x+xeHL2DdthO4fVYxVjTU4PzfUcSSJmiyHGikyFJp2VhXEgKNVCc1yDM9PT0IBoMoKChwg7hbZYnXtfrtyvix0x1Yu/UEakLTUF1VhMcXhfBvd5w0BjviAqnOK9CPdY54wAWAn01qPaTewQEMEYi8J5+C9465CgSTe2MGuOP6Nn5u7xxAw0vfYGa5H48tnk0r1vDyirloOnsFLZF+yoAUTp67ivnxDmzvOYBssWwMdks/M52G0XwOmBlC4Q9NEMXFamgNh0JzXjarf9/Z8xsilwdxvrUfhX5dGme3L11YKT1xoX2QQkEfNVIQFF+RSNitfLZVIw5oCbtPSxnwUJri0kXEP9zhxirTWzj53qtWX/v0PvpXYFogH7PJ/e++sgAP1k2XIJZtOokrvQm5unvuLMVHmxaO9YDNRtmymqaJVCqFNHmC38vLy6Fpct3MgRp+WqYm79r/hzROGY3BeBqBfC/mzCzEazvO4sjpTjx8XxXitPpEIo2kkc4YcatbGLRSx6jMDkdkaWcSLlH/HD7VbtOCJhBwJCn9Vm39GZ3X4vj+ly7cVVuMOBnnMUZrG/J2/YTRpcRyvdtktIZj8BpJ+p6FtGXCnD4DeP0NNWEJh4AYgvr+oSTKljbK1UNoGSABnw5fvgfZsijRhq+7PsO44uCwYnHSYTsrSNPkoRS1gY7/VNluZg+E+an1Uh8WUFyZ9VIlEOlIeHUNusd5dwpOdXIG0hV1ytkYSUTnmWoAOO5OcWIA7AWZGZSWnspKHhxmD8iZyWQS/f398Hg8Ml6sKn5TETcZWZmMhZQVTnWESkPZ6SZNLoyzqG+4W/d3OQScDkH9Yjt8r26AhxkrZADshMAUQVhOQYJdHZkH3g92AnNlVYwygAhpvVY+HZ4zZwiA7RaHhjkRlRtO2YU2Z47qijCA3xmAKC2Fue4F2laJIDSUEeciBCymQ0RePUpK5CHGkWYm4Wp62MtvXCSYjG4C5oqErExAJp/f71fda1Qp5o0oyANUJuQagMqCYtqMVFUkKfHyvkwDPqeX9Wy4aBsd3/Z9meHAVIOgipDM9VWrob33vupqZNtjtmP09cF44F5odKwSUwRhuXV2NTwHD0HMmqW65XbsOshYvFeu52ezpQXxbw/JdJS/W0DgFEw7BSkEvkcehVZXr7p3knF7O3YBYC7wvhDmdyZjnPd4Fw8myofsLZmJlzdyZI+QZo5kImtiGK5zIZ/pEt3dEBQWCIEJ1SV1GmIQRDh/RYUktcv49Q+l3EETl8M5Geu6Dj2dgvnxblhf7RvDh+yNONMGAsDK56Btom13tPHl2cfyCV9M+Ehl7vkEOHoE+KcV4wrHuKEBYu2LEGVl7p4IJnoxcYFgTmyBQ8xRMjRE9ZMKKO/1dP5DVQiithbgs99Y2Qn7enZrl1XnctpoTU56p3w5HQeIup4/RMonkTBycD3/H7UcKPwu9LygAAAAAElFTkSuQmCC", H_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVqSURBVHgBtVdrTFxVEP7u3QcrS2FDQNL3QvlRbHiISakppCohjdFqjWl8NEZMmqiJptSaGFOT4o+GRG0ArY3xh6X+EBPQakLUHxjSaEAa6SJRQ5NtWAMtQR4LheW5e48z996z3KW7sFCcm8k9z5nvzMyZc46CJEkI4aHfUeJDxCXEXmKP2T1JHCDuJb5K/J2iKJPYDCLFXuJ64qBYH13iuWvJV1ZRzKs7S1xzV9/cHLR/AgjfugXFZoPqdsNWWATF5Yonqpas8T7WA8BE3gHDzEbb1BTmP/8Mix0d0H6/FiNAmGV17144jjwN13MvQN21yyoyQPwoAQmsCYCUs3+vSOWseLbhPJa+vAwlxQXbtq1Qs+8HUt1QnA5jztISEAxCm5qEdnsY2tgoHMdfwn2nTluBBOKBUFZbebinB6ETr0Ahk9v27YOakRGdsBK5sPzF7CzCN26QSVS4Gj+Bs7wiIYiVAAak8sUr32L2jddh37kTtrx8KDRSEYL+xhQu643CkCLkH0ZZUDly04/wwABSGcTzL1pBPCh3iWJRXg8z4JZ81xF68nHYt26DffduGsSfoTxqARELX5jRoCvXP6MtTCAiw7fh/r4N9gMPy+ENJOtUFIBpel49NIrs0FNPAP+OwFFcAlUfpBgWwCrbJgrEtIABB1okgnCvD1pWFrb8+hsUcqNJuewKu1k5K1vr6+pw/e9+uLekISc4pUtTTbMbJhcxkW/YHsv9yxYlNxjjR2gZIf8AHjpzBm9duCCHsLVrFHO/B7klEAigoKAA8/PzSE9Pxy6KYGEqYPMLi7KVddkmlVvbBigOQqEQUlJSMDg4iOzsbO7iGMhlCxyVg1taWnTlTDMzM/okGyUaq9B4iq3K49Hi4qL+X1hYQENDA86dO8dVPbWziw/Jgc3NzdFJmqZhbGxMBySZBcgyr6awsBBlZWVwOByYo63KbB3P9dHRUSxxnjCpra3Niu0QAyiRKH0+Xwzy6elpyi/BGOUsdM+ePWhtbUVxcbFuUhelYAbEVpBj+M9zpyiRWamvrw+Tk9FzqgTykOnq6jICNw7TCoXb7RZpaWmC/Cf6+/vF4cOHo22S6+rqRF5enqisrBR2uz2hPNZlUlA1faGvNhGxCTkeZinDFRUVwel0or29XbcKM9fZFeXl5eih7Ll//36Ew+GE8vx+vyx65DbUBa1FHBccnEwR2t+SJiYmou1MDHQ18ng80TJbQHcImQ7JEJlf93dFRUVMe3d3tx5gHJhcVlU1oQxylyxOcgz42BkUOAl9tpLJDaKzs1NUV1eL0tJSQSbX4yEjIyOp+RSYMgZ8DKBJ1g4ePJg0iNTUVFFVVaUHHJk06Xn5+fkxtyYGUC1rtbW1SQvaKNfU1FgBVOtXL7kVx8fHBaXg/xUApWUrAI+dz2UqXKbOk5mZmXjzndfwRdvFmINlU4jS97OVx+H1emVLE+u+6zieWbqDV69WYWxx2MBwrziErhs5ru348EALclJ3yB79ONb3inlFauRymiMdZ0o/pf2pGietwMbJVM7/k4V1VuWN8lpmvRFxduDDwMv1n4e+wUd9p6EpmjFovZawKH+76Dyqdh6TPQHEu5KZILywXEr/nLiGD/44hZG5weWQSOZKBEO5x5mF90ovojDzgFV54kupCSLmWj4yN4Sv/B/jp8GvY+NSSazcrjhRtf0YThS8C7c93ar8GVLeizXExH2YMJAfB5vxy/APGArdjHstz01/AGXZj+HI7peR5cqxdgeQ7MPEAoJjopb45Mq++cgs/Hf+wlw4hIXIPLJdW7EjLde6WitxcNdu+LEqjMdpk1gfcWK7JO7lcRoHiHyeP0JcjE16nv8Hkc67vYq56owAAAAASUVORK5CYII=", P_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWuSURBVHgBtVdrbBRVFP5mdnd2u+2WLVBKwd1soYWilQJRlB8IjY1IjBF+mAoxYlDUGOPjFz9MBH5o4i+pUVQwFh+BQKJIxURRQcRHwrOmBlAx3bb0QR9ut9vdnd2ZnfHc2bnT2bWFQstpz96Z+/rO+c65984VMEHRdd1PxTrSVaRLSEOkfrN5iDRM2kJ6gvRLQRCGMBVCwCHSt0gj+o1JExt7vfmFawAz77aRvpzflpAVXO6Iors/DqdTRJFXwpKFM+CRnGNNtZN0x3iMCON5TcVxZGk2ZCCSxLsHWvHtb+04faE/b6hu/N45fzoa1lSSLkBoTrF9yjBpHRkRvq4BBM7ie4iDD8VS2PH+aTQ1X0RhgQtzywpRNt2LQvJaIu+ZKKqGf6MyItS36+oI+odkbFm3CFs3L0Nwts9uxHoyomVcA/I9P3m+B4+/ehRpRce9NcW4vbwXfw9WGYOYz4LAx+XMgkRSwcW2iNG+7416LK+ZPS4Tog3cbwf/5Mgl1D97GF6PhLvvKEOxK4oC9CClaJCZpklTOpKkKTIwRe+sjZWiw4Ga+TPgcjpQt+UwDh69zGEMB02sXAZYpsNMuONnrmDN80ewcWU3lpZ3wuHygljGTF8cnYM+SPowCopn4vt/7kM85Ta8FuhPt+jglGj4qz2CvsEkju95hJgo43A7iYVXLANM6tvYc3tPDPXPNSMW7ceuTT9gQYWbPNVw5aqKdFpHxW0u+IpEyLKGpmML0TKw0qKe/TPadR4TKlUtg3MX+jCn1Iuz+x6F3+fmRlSwUPAQbOO1r394FuHuEbglkehXoaSTBJyCv0hBdQXQ2R2Hz6tCFBWiP0Oh4JoNTdIMhWyWqgoUFbrR0RvHm03nYBODbdGMx5Pc+71f/Zl1Q3CgthpkiILiQgWzZ9Lksox5QYoxZHhcacwLiFmgtJkDpsp5RihqlprdX1w0VpUpmxg2Y2Adr3nvYKsRTZabvcMF2PN1KebM0hCaqyNQphFgBpVBoLxUQ99AAp+fWkSAzHvVxoTJRno0WdPMAJpzOKHi7f2tHM7Y2tnWtYrXNP/UkU0LslajpPvs11p8d6wDI9EIEiNxqqZ6QYJ/mgfB2vvRH/NS30x2DI+7tUazOTCSUCwGoAs4dqoLrz1zF4dcJRAN5+lhCetYsrrJsBSCaBlS6HHB43bgWiKY+IJg5aLxnJBVQ7PGaVYZO7mZ5jS27Rb2G2JP5y6Z26tgm5UkThOkaQ1KLtFYaqNLjC07Pcfp7DOxpBPtLAEzdlbY3FnrWJJXVxhbQchpxgIxYmC0d+4OzbZapiwEopjLMjOULTvBNIiwyQD71sjn0q25L3cOcQP81vFV130asfBWOBiI2VXE1Ihm0wwZJ6bngZ9zDMM4Jp2hIOyeC5g6sXNqPPusA2qIGRA2DKiqwq0WboS4eDGvMnbC343KkhKk5y/ArRDdVqpVi+As8PCmFmbAj/xNWrs2Z5COqQVnoj30sL35hGBuxewg8qc6u5BZvgySplqJONlc4I7wJHSdOQ8hEOTNJaL5rfYxe3MH5kJ8bAOmWizvNz5hB9/LsP93HCMaRfKe5ZAiAxYDN8uCblcCFg81QwwEePPocWx+IjUa1dOmwf1R06Tjbx+foa1dbdxlB2/kn2X2LyKWC+xcCLF37cB+aC++YOVCTucJGqCb4Gh8B66GBt4UJl3KP9Otzc6sqDM7QGzYgMynBwCiLj+TJwJsLLmycghEex54nf2OkLPbmrSsNzvC/UA9xe0w9IaNRgbreToesCJ5oG56CtLPv8C5YoUdfH3+3WDCFxN0dkD+YDfEo9/A2d421jCkqmvgWvsgsPlpOGeV2pvCmOjFxGYEy4ntpC/lt2WGYxD+aIVGHylKIglXMACxshJisW+sqVhyb7/py6p5Od2r35iwi+zOSV1OxzCEX89Xk9Ziiq7n/wHHxxlwzqXs7AAAAABJRU5ErkJggg==", V_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUGSURBVHgBvVddbFRFFP7m3rst25VlrdVSYpsl1YdKjEAgRnyoGGJ8UWli/IkKRqPxwQRNfFWIL8YnROODmmD7oDFoLEjiiybKg8EISpX4R5uyFChBMd1u9//+jOfMzt2d3e5CWwonOffOvXNnvu/8zLkzAgsUKWWCbttJB0nXkyZJE7o7TZoiHSM9QnpQCJHGcggBJ0n3ks7IxcnHPBZLFbZYA8+TwC9KtzAhC+kfZGn2qCxnx9S7FrJXe6+piBbgSbp9h4qblQTeLEr/foZy5hj83JgaGQ6W+mK1JxFJbEP05odhta0xp0yRbqWwpK5IgMA5vqMhuPTnkL+wH+VLX0I4bXAi3RCRTsDugBCOHuNDemnSOfjuRUh3Bm2djyDa87xJhMGHiMRYSwKNlnu5P5E9/Rp9VIIdvR22E6cRkp6Fttv0gaCrVE0KB/zCJPjLaN8baFu5uaUnhAHOcToRgpdmvkVhajfs9m44K/rIWoIVFSA1SMh6/lKHgpuBogK/eAZe8Rw6mETnQyaJDeEqsQwH7A7B3dzvKJx5ncC74LSvJpgyfViiuwtLlCvKbfVeK72zSQXCfnpu76HxtyA/9Sa87C8hTlJj1TygXX+a20H5IrITL0D4l+DE7qDJyGKiKXTSCQGdgGb0yGIZelLNp9zPnggCH17+DwQigfjAFxD2ynDQWg6FZVivpPjPCAV/GpYdUdZw/GtWusoLQrqEUjK0rL/V1gtXeUzdhQfLiUEE/6Ew/Z5BGq9UIlmJ/UzF+mlk/36MBlHS0SB2ocVJp+JvuCxsNKQBpE5EwxNBQLlA8/pegdo2YgNfw+ZVVKmea3kdbQ/H/3zhG0zMzpLLBXnARWxFlOJqV8HnAcuG97WIVGsDE8kWs7QyPCIgkZwawT39r3KvKu1MYDAcNzx5AKcy6UrMiUQ0UsYNER0z0Qy1kVXDO0LPuznk3LnKyiBv9BUPhwRYBpkAFx54gYdTs79VE47HF/0sBwZtdvtlccKO6pXNplvZK9IchUrS6jmnsuPIlNKIt6vqvJ4JJLmVyvyl0xwwfV4M8vAo8RwRqWa+bGBh8uJ2QAQ8SkyfKmTtI6G9CJzPTRKBjdxMOjoWyJRnqvio50DecRUJJiDIRfX5V++WQC3BoI6d+kLW5j2fS2GgUxFIODUQz/CAYY4hUq13H0sVBmceHbTCQuE6oEpiT6y3OepyiWFULBIP36aZQIpb3R29uF7Sv2pd2FSV8FducabfedPduNayOtZHS7vqgTHOge9Jd/LTo/kt2HjwR6p+tdq/HMJxl7oo3frgVrPrSFiK+UeUkOk03E0bYM1lVHKY+XhV4IBaF6yR4ycgevvC7hst/V8e4SeRSMDasRPXSqzHnzTBhxl73u8Y9C9w7x+Ede7svFW5WJGmErA9esgkUPsd6y3SPvV61So4H3wIGYngakQ2tK233jbB94XbspZbsuDzAwh2vQzL91vVpSsSCGNvvfs+uf+JsCsFY0t22U2pPH4M8qUXgbNTCyYhTQJdXbA+2g+x5V4TvG5Tau4Jw1AM6Q8hNm2GNfoV8PQOZYls0GYWK+XwPfUM7KM/NYIPNZ4NFnwwYS8En34CHD4EjI+jqayjCrftAYhnn4NYs8SDiUGCc2IP6a55nfk85MmTEFnaaBSLAIGJ/tuAeLzZVJzce5Z8WNWH02G5OOGD7DsLOZwuOLFl7Xh+H+ldWKbj+f94Ks0nxmF8LgAAAABJRU5ErkJggg==", F_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAS3SURBVHgBvVdNbFRVFP7ufTPTaacNbSyCRMoUdaFQqYqN0cTaBcaNUiKYsEISEzcm1LhhR9gZDbaNCSFuhESNbtQYdiT8JPhDiLaom/rXabG1VaQlMMPMvJ/LOe/dO3NnmOl/OJMz79z37j3fd889909giaKUaqVHP2kvaTdpmrRVf54nzZCOkl4g/VoIMY+1EAJOkw6SzqnlycfcdjH/YgFg7t0R0oG7vuVy8Mf/gj8zA+E4kM3NcLoeh2hoqOVqiPRovYiIer2mxzlEYY7e3biB2yeOwz13FsFPP1Y0VvopH30M8d39SO59DbKjw3aZIe0jEplFCRA4j+9XBpyBc++9C/fTTyCamuBsegBy/f1AUwoiEY/auC7U3BzVnUcw/Q+Ca/8hfuAgGg8NQD642Saxh0iM1iVQ3XPv0g/IvvkGRL4AZ9s2yHXrIFTUqpq5sp48RN7YGIVEInniIySe7qkbCWGB85iPGPDiF58jd+gtxNJpOFsfhmBQpegpokZkhy81IWWe+pMi2//zD3gTE2j68DgSe/fZJJ4wOWETGIROOPe7b5Hd8wpimzsQ27IFIvxZ4NxQoSIMKiyoCDz8Re88IuH/O4vUN6cR21mKxBD5ertEQId+nO1gcjIEx/QU4k/thAwriSgCWGDalIjoCER0EPg+3NERqI0b0XL+IgQNo5ZOHgqpC0fM2/zgMeDqJJzGRshCAYK1WCjbuiwKecqNfFTOGztSGdaPvknPhUPTVExNIX/sfZvrQBTJaOznTO9v9TwJJwjgtLTAoQyWKgquiCJcjoAul2xtqCikYQ6wHZDhT07Az2UREJHmkV9MFDgHOmOIltdQcr+NwX91X4imaIFBezsCM+5CaPcGudY8ECWL/wNN0Lv+P/yiC5+I5a6MIvU8r+bhMt7PBHqNiyytZmp7F80eGapDJFhXKoojQepTHgQUVX565DdVrtLLOdBtKnMFznRDgG2lFFYqhkA4e7R6nheS0dLNBNJsubSa2RWFEBWOVgJe7c8moSXNQxBuqcyqGrja4WrF+OdIa2mVizFeC1AbvNovEwiXxFgstiaAC5EogcpSv+fZyhgC90ri8bgxw5XwClvM8l6Q4GltRWSUEc+THuDS3/kkzo7T0ioda6xWOyxKT0cJFfjoSzegvfzxglmKeSNqvVUMsP/Lm/CgWa4RgXBpplmmVIBTu1uwIVXKgTap9+VTXGpOSLy4NRE1iLaz1YvSZwWSl8i3BX6SsU1pyLw92J1EW9LeaVbDQpV0Q0pgf1fFofUo/4UE9BFpmO3mhMDh55Lh6UeZjX2l4Lr3vIm980zS7v2wOZbVPZKdGXfxwaWC3gXNIXCp+aDB6Ueph4GeBuzqLE891DqSaRJpWIfSkRkPw5eLmM2pZZAog9+XBA4/m8T29Y4N3lfzUGqRqDiWz2YDfParizMZr7KJqI3NfwlHYFda4vUdDUjFhQ2+8LHcIpFG1cWEiZz+3cX3Uz6mbqrSIcUg81g/1CbRs8nBy4/EKJGl7TKDOheTusI5QTpU69J32w3Uz7OeujztqotXXTV2zVPZYlDvjjik82tloi+nJ9XyZE4Dpxfzv+RlTpWv5y+Q7sAaXc/vADCHvd2Xx9fMAAAAAElFTkSuQmCC", U_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbqSURBVHgBrVd7UFRVGP/dffBeXGQBEZXFB5JPVMZsMgEtm2lq0Olhk39gZmk1k49/zCaTprQ/Mh81o5ZTaE2lWZpZk1oNoGgG8hAFRRDWeMOyLLAsu+yyt++cvXe54OIrv5lvz73n7jm/3/m+73zfOQLuUkRR1FOzhDSVNJnUSKqXPltJTaSlpHmkPwuCYMWDEAI2ku4k7RDvTbLZ2DvNL9wGmK1uC+m6od86HXZca2lEvbUdIdpAhAYGYfYYI8Ko9SO7SN8fziLCcKumJgdeM3Opt1qw99xp/FpegrKmf/2OTDTEImPaHLwxfzGMI6OUn0yk6UTCdEcCBM78e0wGt/ba8faJ73Cw8AzCg0MwRj8SMboRCAsIglaj4WNcbjcsdhs6ens40VZbJ1bOTcfmxUuVRBj4UiJROiyBoSvPu3EVyw7uRr8oYuboeOhDQqRRAvuzd7j06O0S+YQ9TicqWuqhorevXlyN9ElTh7WEoABnPi+RwdmKXz60DxMNo5AYFcsRRAmbDRPhBfPSkJ98k/HX621NqG5rRjaRyJybqiQxS44JjcIAW2TwU9fKsOL7fUiIjMa4CAMc/e4BqsJgr2lVIlweBQVRIkING9vr7sPKw18gwRCDBeOTIGEwrPU+C0imr+X0LG1I3/MhmrqtSBk7HlAJPlNjyEqXJtQROTXONkXD5tL4TCpzYA/u/n4U1d1AdOgIlG/8GPrgEHl4AnOFSrF6Lh+cPgpThxkBFGBs5Q4KMNY6qQ1U2TEjohlOmpT1zTY0YGJ4K8wO8PfxunboNDY4PWyci/e5RQ/CgkLQ2N2BLSePKI3Ht7dK8v0KefXZ5Hu+YJWKgKSJJA0gAs9NqIQWPZzQxgvTsKtsAiepFXqRmViOQLUdvS4vOCdO6vL0c9d9WZDLd5UkmQybWWCJ3LMn/w+IgtfPNpcTPa4+PoGTwDUEUNWpxYZzM9BKK9aq1UiJm4KpoyZDQ2TNvcCmf6bgiiWY/uvghJ2cuBt9EgE2347c32Q4ntoZAV94Hq8o8gYZqYf8aLZ381XEk2k3zCimiO1Fu0NEBJn0kydfwPpHnsB7qc/go8efpWBUodEmQKftxra55xEfaqEAdKHN3uWzANNTlWVKN6QyAizxwOZ04Lq5Gb5IIu2m/cySS5ejH8dqotFOq+ylVYyn5EIBhLhwPQwhYYgMDsWc0UZurbpuNX6ojkG3y40OStmdDocE7p26oL4GPX0OmUCyRtoWKGm86WPp+zc1PX1OlJrVqOyMpKh2w0O7gCWYSSNjeOJhMpqIWAnMQeTUZIljNbGwkwvdHqdi4wi+LVJtbuGJjWFrJF+gcyA4FFvOKy6K+tT4BGQ8NAtqIljaXMfdow8K5t/ruywUfBpkLcwgV6jx7aULKGiohV+h8bXtbTIBvS8ROShyocRV5Jtt5OO35i3izywtzxg1FqHaAN/3aVFx2E4xER4YjEDavq/Mfgzbz51EVs4vA5MJAwkqUDGWxQBPiQmsaAxTnPcV5sBCscCEWSCZCMTq9IpFCYgK1XFwJjc727H/4lnFqgfPpw/ylW0rI2BiT5OjYzGcBGm0OHq1CNWWlkH9v1ddxk/lRYP6KtoakVdbCZ3/swGXWWMS5EcTo3yJNJkdJubEGVHEgnGINHRZ8dmFv1DV3oKkyFjoyPdB5PNWioM+2udHK4opY3v3eaW5EcevlqLZ1uUXfHrsWL4gSUoZgVzSTPb2VFKyXwIxYeFYnZKGAAJlMVBjaUUxHUrkbZtEB5HJUaMQp4vAuBEGrEpZQC44g5qONu8EikK5bObDyqnzBCkVs5DVm3u6Eb9tHez9LCCFQb4L1mrxdGIywoOGN60sR64UosvpGOiQyjNrazfthJGqpCQRGlaXicRBellroEBaRXX70/N/SlE7wIDl9xOVpVg+cx4WJiRRMKoGgdooX/xNVe9IxcXB4AMssHreQiX4AYZ9SzlmxWL6jk2op+o11Aqy6CkVp9A+nhoTBw/l7GvmJhQ2mHgyuhXXa3+j3oDcNe8gXu8jwMux8kTETq9r2XO+6TrSPt/K/T30AHLPQnOwrZv/+mbMGzdR7t1N4N5yrPhrFqQtOd+YiOznX/OaWRRx30JjA1QafL1sjRLcJGFxue2h9LypCssP7YXJasZw7vAP7P0Zp4/E4ZfeHAru/1CqIDHoWH6TTkdbc05gf0GONEK4IzBLya/OTcO7izJ4vCjAb38sV5AwYsjFhB3TvinOx4+XC1FGxcifzDdOwqKJ07D20cWIoBKtEBPu9mKiIMHyQxakwFQKO46VNJr41vOQn+PCIzCBTtCKDKeU3Wye+76sSpfTA+K9CbvI7vpfl1M/ROTreRrpTDyg6/l/J9t8sT/JhfkAAAAASUVORK5CYII=", Y_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAfBSURBVHgBrVcNcFRXFf7eX/Y32U2W/G4Sktok0kyEWqjKWAmlOrbWKbQ4MJgBbOtUHWfUgcGpOgPiz7RWBVqmUjuM7agztUhBnU7TQaWdthMdtERIgQAlS9KEbH53s39v9+17z3Pv2928JVlLnZ6Zs+++vefec853ft69Am6QTNP002M98RriFcQtxP7cdIQ4RNxP/DrxcUEQIvgwiBS3EO8jnjU/GP2GrcX/S8zjnOIFZOiqqaUum6nIW2Y62mdm4v38vxK0L4feoiSUUN5Cj5OwYOakRecQOvgMpl57A47gObR8y19YbBKPv5jA1KsB1N73BTR9pQfu5ib7liHitRSW0PsaQMpZfI/llTPF7z5xAMOHn4fkcMAVbEDl6iCav1kHQZBza3SMPD2MmTcnkBodQ3pyGo1bN+PmR3fYDWHKN5AR/SUNuN7zaP9ZnN7yIPR4AhVdnVD8FdxdgVa1/3gJBKmwEpf2zsJIGhyNbDKF2IVBCKKAzid/juq7uksiIdqU++3KZ/pO4B93fRGSoqBy1cchOx2AmgYyxOk00kNJiEKGszaZhj6bgpmx5iVJhK9zGURZwb/u24zxY0fyariD9pwQbQDszivPJgchun6Ihi+1wtUYhJlmSlXrSUaYxKl347Q4w1kdjJHiDM1l+ByTY+xpbkRwcxuU2seQjb9tN2J3UQhy0A+xsTp2DbHzD8FRE4HiuQUTxyi5ehNcUGC/LAT0U77cidbvWI5cfTqKyCkVVjoKbD+YJOr7lBN1m90w9fPQEl5ULDsG2VeR193KQiHavOd05ZcH8c4jZzD7N422yqD+fgW19yhF3hnkbXwgBlMjRExC40qC5lRrnp4Mjeo7JSx90AXFqSNxQcHA9ou48L09NsDxbY5ALh6z7CU1PII3V3bDTCZQVu5F45fb0bDJQ2jICP8xjrEXYvNZS4POp+ogOgWc/eo1O6Co3+RF7UYvtJiBsSMJDB86RwgkYUoSPnPhbTjra5kY65StrI7W5/ec6P0rV85gMWnBVO80Yv+OIdjjRd1GN1WBGyPPRKGrBpcP7RuHIAswWHLmqOlhP2rWl2HudBxXn5qFOqETIho3zdR1Ctez6PjRD5gob+1M15r84vE/HOXKGQuGiez0DDJjCQw9HsbQz8Io7wKC21wQJQ11DzgR3OrgXP+Ai3pElppQGQLrRAw/OYnBXaNQh5PQpmaomWQL+07+pdcehjUsBKdpsMI0DJyoaOBCkpVu1tjthsRKkIq/rFbiMLftrYK3Q4E9Hup7Os7vnCAvKXPC5DHJ66kUdOoJLDUNziYID3SH3kHZkgBb2M9C0MJGmZlL6PhJNfRJHepQFplRDfockLxIsdM0iGUK1KsCqu/1wNtOW5oZK+lz5GwAau5WMEwVQV8LmtYAgtzZqMDRIEGpl+G8uQyCm8XiPfrhBrTIuViQlzHqWE5qIgJEcl0kD1jHQ1ZAOqwjPa5R/OKo+bxsKS84z0rTsiSwVsHEn0y07vDB1SxC9kvUTwQ+bdCPQe7rFFpBHiHp5TwPZHtAGKRWvefGbG+SEEQDkkemd51KkIGoz6+xoaDHNRgMLYf1p+gSaY1piZgohEyQvIU1zABWDn5RqcbUK0mKBcXzsob0mE4JqEEdzVKWG4UFFSuc8H/SgcUoNpBFakjDme1hSxFViKe9DKJbgGOpA86bCJUlEqqpRGWrH0UKSWhkszjpb6TEE6wqwMJPpVwuoqxGQftPA/B+tBi89KiOcztmkI0y47NFc/kkNDl2JrpHL+Y7Yj/T9R8Olyyj8o7VKEWBO9247eUgau/34Oz2cVx5IoL4efI4ZGDkcAynN11DeaeC5b+tRe0Gb8l9XEub7O2YV8FrxNvYm58MiL7RZw8XlICMpd/wUSPyYLJXRegXszApkcZ+N4dIn8qTLD5gNaLwS3PwtClo21NFZwYXhvZFCA2tCInAZ9fZ7Xk934rZh8ifpcNH3y0roUetllv1aRfavl9JZSRj/GgSl/dOFXlz6wsN5A1w6u6xov+bv+ZD89d9yEzpCB2IIPznRKEPrD53Cs75Q0qlmDu9Ps/eGDT1D2+jBJHQ8Vg1Og9Wc+Ujv55boJzJuDsUPu9oUIrmhg9FqQ3PUbORqGkFsGx/DZer79lkV/4c073gc8xQSA9ugcM/wU80I7+K8v5/PflWOtF1uIaPB3dNY/LVxAKZhp4KtOz085Cp0zVQWg/BUdeYn57/HOeOSAfyKLi6HiewFFzaPYPhRZQzqur2FMZ+ivdiNEp5MvDIJAwqClfXd+3KD+SPZfYT0R5YZzZKrE7ERh5F+GWVJ465yOaetvkyLO9a2Bfy62b/SefD0C5I3jvyU6GcLhQZkMuFtTkBVK27F7eeOE4NpKmwmd0Q3+3Owtj9EYkUSEWKGSuBKqx45SgC92y0K19rvzXZEciHYkPeiIpVt9EGL6H+oZ6Ccvb0fszFjjK8x+fZ9wlXQUagD1fdti24/UwfL22b8g3X3w1u+GKi0mkp/PsXMXHkOPyrwrhpZ2XR6pFn5zB1so68/RwZvBXOpqB9yxBKXExKUu5qtn/Ry5aeMo0kXcfib5lG7O+mkRowjWy01NVs//+6mt2IIexy+pz5wWg2p7jl/fYXcINkzl/Pu2F9zFvwIVzP/wu6FSSsK0Jx8QAAAABJRU5ErkJggg==", eh = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATSSURBVHgBvVddaFxFFP7m7s1udhNljTXBpE221oClqQ19UClIjKJIEW1QQaxSBfvcitAHEZrok9Ri8qIvQlPEB31pwDcfrAUV/HmIf/igLYtG0JKYn3Z3793de8dz5s7cnf2zSbt04OzMndk733e+c+78CGyySCmzVB0imyAbJ8uRZfXwGlmebJHsAtmCEGINnSgEnCN7l2xVbq2c4XevNb/4H2D27iTZ8aYxr4Tgz0uo/r0E4bpw0j1wd49DpLpbTTVLNtNOEdHOa6rOI5JZlTAMUfz+S5RnX0f407fN75AlRseQfOxpZJ48DGcwZw/nySaJRP6aBAic43vOgDPwxsYGisUi3MWvkZo/Bef2fohML9DVFb1UqSDcWIVcX0Xwz18I/72M1DNH0XP0BBEZsUlMEYnFtgQaPS+Xy1hZWQG9hGQyicRvP8L9+P22cZO6DktFVC/+Cknv9b59FsnxA22VcCzwrA3OHi8vL8OlGHd3dyORSMCRIZyyr82zzK9rJxwHydE9SLhd2DjyCPxPPzIwykGNpYprOXDSgHueh/X1dVK4S5njRDyFlApEsK/S6CeU75JqEasQjbuDwySjh6tvvAJnaCe69h8wJBjr1VgBLb3K9mq1qmLOoAzO8rPxM/9ZESAvRcWPav1cp4hPz5VozB0YJEUErpx4gfIk/hCOm0/UsbxXpVAoqMRjyQ2wISHCQINqYN+r1abNxuBeREaQQ05PL8TlJRTfe9MSPHLY0fF4iR+CIECpVIq8tYFjAiS0X9Jmk/DrzKE+p6Jzg8g41QoSNH/l3BlbhSOMzQocMj2ceO3AVSEFQJOCwDm2smxqT9XQSsCESRN0KmWVH06pAO/DOQOnlnYmMGF6fI6dRaCpUGikHwFyzYDSkPFrBt8itLasFKA0UCSqX31mzzjBX8G4TsQ49oZEU5FBNHHbor8D9YVQ2ysqU97zCDWCn7+DLF6NFjLCZgI5blVoNWuKuVaByam6qkMgY0YaV/Cfam1yBCx7UI15CRnRYwv++B3uPcrvnIvallof71aFc4ASMPYUWlcpa30hKxCinT7qX7SRISKQjRcilr/R80Yy3+xO4vTMNmy5hJojcwsk3hrrw349xAT4u8hy7OvYtlCC1/aKK7DlIjUBUkc6vK/0mJE1zo28YuK6uFnl7uyYaeaZwA/cYo9vBontvbvQnUibx0Um8IV54i3XFM58k/0dKXqqB+88aPdeYAILiPJAbbsdB7Y50LQHR563uxYcfVY7y0/m4NFZ1NoS8fjwcxjIbDcj84xtlrtZ05vJZBSRePHpkBoD6SEcHj1md83wjyKgj0hzuq1IdCQU2ns+qrx272nb+zlzLLMX/GlYn2Q6nY5JXBcZG3zvO9i3re5cOG0eYgI6Fyb1H1QuMIn6cGBTwAa8L9WPUw98gkd3PGuDT9p3hLotT8sypf+ojmQcDlYkVkEDtAXn90QKTwy/iA8mPsfevvtt8KnGu0HTysPndgJiJc6T5XhbZiV4rxjyRzCUuQtLhUtqd2vE3nXrHtzX/zCeGnkZt6Xq9ow8NnsxiSeMjmrTZMcax0rVIi5e+YXqAvzAwx3pQezo2YmMe0urqTi5p6/7sqovp/Nya4UvsrM3dDltQcRczx8i24cOXc//A6Br15dypOFPAAAAAElFTkSuQmCC", X_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXDSURBVHgBtVdrTFNnGH6+05YWWroqU6Z2rFxkmUugDCExy8ZYtoTExMiyRJMlGvaPH8su2Y85ZF7+TebERDN/bbBlMdEsLluWhRgjiP5wCeJlkigu7RjjIpIWRmlLL9/e9/Sc9oAFRfBt3n7f+d7vvO/zXr7LEXhMklK6qNlJXEfsJfYQuzRxkNhPfJ24h/hnIUQQq0Fk2EN8jDggl0ff8buP0i+WMMzeHSD+aKEsFArh3r17GBkZgdlsRn5+PqqqqmC1WrOpaic+tKyIaF77jO6MjY3J1tZWWVtbK3lKNvZ6vbKtrU36fL6F0fAtFg2RxTjn9xxSOUYwGERLSws6OjrgcDjgdrvhLizEZmc+1lttCEuJqbk53HzwAIFAAMPDw5iYmEBzczP27dunztfIT9xIkbi+KAAN5UXdeE9PD3bv3o14PI7Kykq4XC68Y7XAIQQqzCaMJSViBGCtomAymcRfiSS6YzHcnwlhYGAACo2fOXMGNTU1RhD1BML/EAAt5/268c7OTjQ1NaGsrAzl5eVYrwjsz7PhPgX7PzJ6bS6OEWotFP1iAlNExvIImIv4q9mIOufu3bsYGhrC6dOn0djYaARRpdeEEcAxaAXX1dWFhoYGFBcXo6SkBHZSuteWAwdNv0LRGCRPK0wKtljMFAHgWiyO2xSBWirIV8wKIjR2NhrFOEXozp07mJycRG9vL6qrq3Vz7QTg4zQALfQ+FZ7fj/r6eoyOjmLr1q3q7A9ybXCTwV+jMQRkEofseWpEjPQvgfosNAs3RaLRmoP+eAI/RqJq+vr6+tRa6O/vV9OoUTGnQtEeDuijhw8fVkHk5OQgEolgY2wO7ngMVymvg+FZfGkxoTA+BxGNQJBckKfcumleG8luEIibs7OoTsSQS8XJALh4WeeRI0eMmNVoCy33Ad17DjuT0+lEUVERXibPt5NH58n7AvL6dYsF6qqjtKiLT/0T6Yr6hYyaqfsqzeuai+FPigQtS3XvYO+5r0WBa6CY5+7UIf1+vB1vUZWzOjN59ByxSCjoJqUWKqppGv+NvJW6YRWE1IwL9T0OaZK4l8KfR20t8Qs0N0Z6k+EQLp04gR379/Mb6tbOAOp0AHsuX8JepwMmUmUibUqMQpzv1PwzeJruLxwDjCtb0i9Jnku7DQlJTM+i7w8YqI4BeNXJU1PA337VA64vViNmZsgd8sdmw7JIxxUmB6huoOnkYMWvXIakuhBmNg0v/3u4l7x9K2UUQms1f6igQJsLOPdCZDek9/W0MGh6R5AhI7FmhePi90GUbeYhDwNQK0IGp1OGsx1PDICZhbTMMrnXQiUNKeE+A1hAum7B4rFRKCkALnN6xvRU2nMjz/eY3k4ksBzSK2XeWCIDkFOubolKaSmWOJ1XRPNSyn8FBbooyAD8qqCkFE+bdBDKS1v0IXUnvKEKCZUofTogpKEVlV4Ik0kXXeca6Cbeq8Jp3oFbF75JFQv/VikjXDq8J3C7bccubMqIevStmA8i12hoCO9319FOloDQT4nVAMEAuO6kwPdvXkFhXvqSskbRzuVOftpgL8Lb7nfTqFeFZEbX9qL3jMY72PZDx/FMbBpNF1/DdDyQSsFKI6ABKLRtwtFtP2Fd7kZdkjmOtSvSce47LE60Vp/KIF9JJDQdJvq1VJ0yGj+uX8sUw/SD0JZkRcE2fFp5NKVAU/Skxi3CQrq+xotrKnWJX7Ol0pKX0qvjF3By4AuMh//JrIhHpUTquoB1to34vOoktqypNhrPfik1gJh3LR8PD+OHwWM4P3x2/rIUixu3muxocO/CnvJPYDc7jcaXvpYbQHhgiIQO5JzvW1yduICRkO+hF9l2+TMVqFlXj52eJjhz1hrFfizwfEkAGgjeHw4Sf7hQFo7PYnD6FqKJMGKJKJ7N3YDn7WXINedlU8XFffCJP1a1z7QOuTziD9l2uZKP0yxA9M/zN4i5pD1Yhc/z/wHGvflxD2wW4gAAAABJRU5ErkJggg==", Q_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYsSURBVHgBrVddbBRVFP5mdmd32S3b7dKWHyktVA0kUosJiSBaNBQwUVMSo+ALqC8IIeCL0RgjRmMMBikPIvITkIQHfQGCSRGJCAYKaqDaWKpQu1gqa6F0u3R3dnd+rufenZlOoUtb4ExO5s79O9/5ueeekTBKYoxF6NVAXEdcS1xFHLGGE8Qx4hbiE8QHJUlK4H4QCa4i3kLcx8ZGe/ha3C1xjS3Bt1FK1VjrpV525FSMpX88wbSfzzJTVQsB2WJZb1iSCgivotdx5M0s6EZ/Bp9/3YqjZy7jTGuPs7Trn43wM0205ZkzobzQgMBLyyFPm+beMkb8NLklNiIAEs79e8AWnriZxce7fsWug20Y51fwwMQQJkaDCAV98HllbK3ugqLnYPb1gfX3w0j2w9QN+JavQHD+E/B6vW4QywhES0EAt2p+tjWOFe8chZo1MfuhCSgZ7wejJXwR44upse2tuVAICK219xCsaRpM00QkEkEgEChoCcklnPvpvC286WQrPvziAGSlAtHoJBImWUIlaz4ElH11GSgycysh2CQ2VBVa/CqKa2vhf2aRG8Qc+5S4AWyh1wbeVhPnEG97Dcfan0RvZhau9IZxMR61Zkt5tjQ+1LMbCjOEZbhdeDcTD0Sf3nEJBoEIHTwM7+PzbHGNBOBNB4Bl+k7eNrLdaP9lLV7c9BTKyx/M25mmPTY9Du7O7hvjoea8SKb9MJiMb5dk4ZOZjScvmOW/TXqYpgsrmBMnIfoyBacs2yCmc1fYEfK+3ZuOb8e6HY8gnowiHDEFgPqaGGZXXsPc6qvoSYZw7PcZOP7HNIoNBfqiesheZ9MhbhCuoDgwKR50XUcymRQxYRG39gav5ftVvMfMXcGN+GH81L4G4ZCErG5ifCCHrGZgac0FhINZzCiTMJAGmv8qxU01CP9nm+HzDGpvA8h/81gAPNd6YORyIi7MTzdDjpTw4ZU0byO3QIMNKXH1EEyDt2QMZAykVTpOHhPFgQEwU4PEcpb7swh40kimgpCPNMHD9EH1JQsIjwWrLXd1wSAr8K1z1dUIvP0unyFSOwdQZ6/9vrkDz9eomPdwN5ovVuB6Iouc4UM8oaDp/FQ8O+dvtHdHcebPMsR6AshkDai798L0yYPqD+MKoT25wiDtcqEQAoNT6iSawI9ebY7MPKV+G05/tA+66cHCD1aiLzUOJUWycMfsyh4U+TX82xdCF50K3fAgnfXiwjfPwa/IGI64UHcsGIYhuLS01A7GFg6gj5vjbOt/WPD6IVSW3cT+9YdRHlax84c5ONc5GRktgLYrk+FTTKQyCi3mG8rCx3F9u5OK84mCS6YGac2YaR3HfJch2ERg3354a2qE172WLyjl5sTqy9cjWPDeSsya2osp0RRi14rRES8R20iSTMIN68Sb+TN8uROSmbMks3x+IG0x2DPUO3yccgPyACJOotby0efQhe5S4rLbfGoMnYZ0axsM+xgUINsV3Py8XVRUBFswf/OUGJk+OYyIrFuJR3YS0IiUSkPS5DtOka3ULBMARorK4bA9lHCCkKlpZCsr4JGEeMGjED8qEjFgsUFA/J1dkOg0ELVwC/zGAUjjgsDixTA7OoTyJmDde/cDAMsD4EgmTLCFCwDcAquosYd/qXR7ZbNZcUT4rWfzPQl3pWUeA36/H8Fg0B5+VbJSMb+IIjxABk6fgkxAZAcA7onE7WjFgAjA+sXuC6nEy+9lmvAVfaznA8HvmoAdXzoxcK9OcPIA/1j+CuQlS+2hvVz2bdcxqKzKbPpEQBdW4H13bQbmWIDRHv7Vb0CqcGpFcR27C5JGeq3nbX51plKpIbEwZtGuEo2bnvtdURR7eCvtKYqfgiWZ1tsLffs2xw1jBSG0tt7e1WugUP63KIbhSjJrURVcRSlrPg22bi2vvZ2JI8FgrjcrK4e8czekefPdwocvSl0ghpTlXLh+8iS0jDrECtIty5kr4/OWQvWbt2EZEC52C79zWe4CUYVbfky4H3N0w/H4sP07WCHnv3nMeDwe+Hw+91EbVvMRyfo1axzuX4vAMALCqPZnBEq0eV8BarzTr9logFQR72Vjoz5LcNVI+486tNng7/lC4kdxn37P/wcJKQrBQks+WwAAAABJRU5ErkJggg==", G_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPFSURBVHgBpVZfiJRVFP/db2Z2Zx1bZ0vHYgv8EwapYG4F9mKprBSSmT1mKdhDobTBxlJEjQsl4osPPUREyhJuVi8iqCSxGxRBgc2LMP7BWddddQWd2dGd+Wa+P9dz7nfv7Iwzn3/wDOf7zr333N/v3HPv/c4A9xApZZL0K9IR0pyclbzu6yNdhIcVnqQBHlQOhhGJFuAf0ytNmpQzM6iM/AH32DF4mdOQtg3p+YikUrCWLEXs9TfQvvUdM7VAukcIcSCUgNOhweGcOI7SYBoWJKz5CyCSXbASCeXnEzGT++NjNAeIf/El2ra8bWDSRLKniUBHrtjLXw/CGRpCtKcHViymnETgpC0JqZ5EVirBzWbR9v52xD8dMHCfmJUIk3N6/c9psffvg/PjD4itWEnRQ4MHcYgAWwE3kPCKMxlEd36AjoHPTLpeIJIxQ3CQXturvxyBvetDxJavQITSMUtQW2ddiwkEz4VPzN70NNyzWcR/GkasdyM7jBLBa0JHn+Oed0+uwZQ9gWe7lhMOgVk69qajYNKqDT8gvpA/g6c7luD7DacQs9p4pIuDfIut3y/9qsAF9RTdPCqyjIpfIi3D9sgmdfwKnow/g7nReapd9ctqvCJt3HILKoUTpYs4PfWXiaGPCTaz9ffVkwqcddq5AdsPQG0vIElEO7F72V6k2rtxpZxTpMFYoEXnZjCfSEYmjxqCtVF6rGJrqjypEy7gyiqK1Ztoj8Rr+dn2XD8uzZzHqWu/NaaJflXPhus7AbolkS1kzPAiJkiyNX7rnIrA5NuVDlzXoW2IUEoew/OdL+Jw7oBajUq+4NQTvPT1eQrmMkfVKTUQKIkSkAe3aT996dU2c8YtBpEGoTeJPsUNGBzzGBvzOhbMjtzFwht4ZvpfrJnfi/uLQOecJ0yjUCNYllzZMioj3577HGsXbsam7vfCcGvSnVhszAwT/MnWy6n1sx4tiK7bk/jov17kbmfprC9tdqi74a88tdH0HuWLxpucv+0UsXN0HfLO9eCTEHK5QkUGe78w3o2hdf+Y3sVRus4FIhmdG+t89bA7CH/HthafiPuLr9X6rt90HeJvkaUbO8AbQt93a9fue21FWPBKRP8ArC1b2VS1odEpKH9KvP37pJd6XPpaZYiacfb19n5TX+H6WkciZdp4+D8PS69nVUuiBuCXVkv/xPF68HQ9ZquSyexc2dQNl0eGIam6icvjkBMTlOQIkJgDrO6B2PQmxPoN1E7U0nJ3yQxbCRf9Q/LBZUQ+wr+LPg2QrwPM6b60PuahcgdThI5u+4JVCAAAAABJRU5ErkJggg==", j_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANESURBVHgBpVbLT5NBEP/tfrX4CkEhgYRIMMEoRBOuhkTUgzHGiBcDGg148ESIkAgcPFBiuBnRo48ElH8AEXxHxIMmnjigxotw4KWCLY3pg6/tOrPdbYvQirDt9Nudnfn9ZubbR4EcTSlVQNJFMkoyqdLNb3StJOX438ZOBmC9rS8bkVgD/Co9fCQFKhHFcvAjlv0vEA9NADRWKgHpLYTMK4U3vxZ5haeta4CkWwhxOysBl8OA48Psa1QtPSADF9KzC8KTD+ls13aJRAgqHia+GfbBts8X4T1Xb2F8RNK9isBErtn7P93E0LeHGDh4HI70kJVYlaqiD38T8QhiZ97A29iEre2ddrrNZiJtzW3kj77cwpOpAezbfYjAY5AiCkdEkiIz+qTXc1LAW1kJ995dhHtuWIIu+06kVXDNx6aHiaAXRduLEVVhOGCQCBkZIZ00wHosjITD8JSUIHanF+6zEcYrIOnTBIapiQf3J3ogiFJKiSjVOQkaofJEaNYIkbAIM6cJQiE4W7ZQQGTR2QEVDDLcUV7mnMFZHo1OD+F7ZFoTBGN+nQGDaFFZhDLkpwxTMIGALoecn4P7dNiWqpV1ddx7P/tcg7MsuYuI0CphZyRySdJGUAZicYHei9Ak8VcvLUEtLRFUc28mNJlcU2QUU8sIur+oFPlYuaJVRh9mrAh8EcJ1tVbSb3x83DqVe8wLgT+6wNgp35hyKcLf2kWnpexcBpHiZwIw4CY+4OePFQQZQa1e7xqAdm8q4BwtReLGUjou2RR3tvIuFRmWG2zs6tC+MC2QIjiwq/qfEa67lZXZ3jgTjHHvWGld2mATROzqnDxlh4+ZQJ8Z1UU1KN2xd1NJaN89ZXAazlvVoKRDiY/Zt14nD1eqrm84emXESR94/YQ9Zc+iyySBw8UncKGiJbn61Pq5rJ281glZ38BdfTdoHf8wk1U07m/HpYq2NEkOFmXmtUlzC2R7h53qNpirLhwfkicrRmcGccTtp000l9w82SJ3iiC/NkOkXyyD++xgrSuz1ZDoHa6CI7Sh30HE6PZy55NJ857Jq4LcUQOxs5ZUO1Nl+fvKzJK6vvT71frbqNrEv4tWA+DPAJw0Oh+f+bkw/gDQ+g0xmT//bAAAAABJRU5ErkJggg==", K_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANMSURBVHgBpVZLT1NBFP7mPtrS1tgYJTwiAolGMAYTdS1uENz4iO7VxDWY+CCoUDZGozFudQO/QHRhcIe69hVl44KAbg1tebT3Qukdz5nOlEJaKHKSc2fm3M75znfmdM4FthApZYJ0hHSKdFauS1rbBkhbsVPhTdpBrTJWDUhUcN5PQ5I0EQQBcrkcPM/D6uoqeB3v64FdXw+rrR1u33mEr1w1WzOko0KIF1UBOB3auXKaSqVAG+A4DizLUhodGkSQzUKSBn/maA8QeTCM0KXLxk2S9oyahVUhcmQyGczPz8OliO3sMlzXXQchRg6F5cRjcDuPwWlrg//wPvynT0oAfDYbAHT+lPOFhQWVlrq6OngEklpcVI6ZCY82MbM8X42sDtlDHR3Iv3oJ7/Ej43fEnIlhwKlJZIn20tISQqEQgyK1vITsygo8YmFAhJcjAKOeYsSj09CAtefPkH8/yf4SpGM8cTTSNV4sUrS2bePvzx+QlJJfv+eQJZCwZSNFQIeampRDWekQKY1sXxkdhtN9FiIS6eYyZwYX+T2nhaNmgJhtwfU9NDQ2Yv/+A7TLR1QGkLEYnX5OsRCagVApozmdm0rHzAzWPn00sAMOPS6YqjGVsud4FxIEZE9PIxuNoaWjE4LsQfGHuiqKD8NAMACl0KYg1yZew+05x+YzDHCCZ1zjBoBzzWzqKLICpYqdlySbW88NgxAz4fsQ+bxiwJCFr1/Mr1sdfSAoFAqqFMsleuo0osUqWzcyA7WWxZEC41FoTMEPKopygGJAQmwYq0p+dcvXCiS/Vlozqzme8OFu63wbMbut5mZjypQANqdnV0B0T2n5zgCqpsLh8MZc70Ls3l4zfSv4z0ATvt+RTqeV1VRSJdl7pL2inUPjMg4OtsD9/M2Y26h0BV+zH9hhPB5XLIzuRHRdwR4cMqZx8jlnCvw6aYbvIL7k/sc5i7h9D1axP6jewBMFwEjGEI1GEYlEamIiyxT9t2DfuWtejWqfmzZImTQ90Pd9SX1BUtORdDYllfX7ZKC1wHqySwaT78rbZxJb0i028nQ5EF3hkvqEAigcPaycFm7ekMGbCUkvyz8EBlCL6KY/LmuXKbmLr4sB7SBd5nBW25K6zKvKP9ambxFZGe2oAAAAAElFTkSuQmCC", Z_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATkSURBVHgBpVZtTFtVGH5u20u5tEBlDAbI+JIBGx9jCjjcAsYfuhgC2Q/jEKJZdPzQuZoZl5ih4GIyo4uoQZNNx1ymyVwcogHUDRAZJoAMNtGNsY6OOYF10NKW0g/a+p7bXigBlhnf5uSee+55n+f9Ou8pcA/xer0aGm/T6KAx6l0Uo39NSyMR/1WYkh/gfqVhNSJuBfB99KihoXG43Ojo/Rtf/3gNvUOTmHO44XZ7sC5SheS4MJQUJaHy6TRJ1USjluO4ulUJWDj84Gju0uNgfQ8cLg/io1UIEYKgDuHFfVabC7NzLozeniEdUqjKQ8UiUQ2R1C4j8Fsush862of6b4aQnxkNXiFHVISAuyYH3B7vEsu89LMR0ZBuClU7N6J6T570+TXJE06KOT0GWFgOHevDp2f+Qs6GSKiCeagEHokxagyPmUFKMFmdgS4TgJfp4+JVA3aXbcDhvYVSuHJpv17h38pCo2ls1+Gdo/3ITl0LQcnjofgwireALekRUJAnDNxkdcFmd4v2SyRsHkN5OXLyD2zNikFpcZKGFhtoPK7wW/8C2/vGRz3kkwyhqiCkrg9FWVE8slI1cDg9WBOuROtv47iiN2PWPr80VF4PeJ5sJQ9fOdyFoodjoQlVFrMyl9H3MrbxbJsO+nGrSCBXyLD2AQGJsWrISElQypFM8+Q4NZS8DB4PyIt5zJEn7GmzezBtcRGKDBPTdjS2XZf4tSxEpWzW2K5nrAQcQrFXEKBKBA6UMKqizBQN7OTRbYMN5lmXlAwYzQ4E8x68nNaDJ+av0doH7EMRI9jMZiO3ZsT4mqwW3DE6Ea5W4kEqz6wUjQgxbXbip55x/HljBv1XpqQyEhNso/NRsGYUHxe0IFag0jXGSjYlMgIRwWCy+yJKITHb5kULP/t2BCXb4iiBAk6fu4n+4WkMDBt9efVVH9RyO+ry27Er8TJYFXv4ULhTdiwhCBBuoTC6Bg1IT7Dj8ogJGUlhGBmzYGzSBicdPEn2pA/izexOhPNkHE/5StsJ76YKcHJhYQ8j0DMmIZidUjsCD/fVmxbIZRxVkRvjlDyLP+YJahPqt7bgsahblFce3KZKAi4HgiPAUQUEWG1aIMjbGIVhAvTV9yIJO70sqQw8PMiBvRm9qEr7HWqVElxaBZCzGwgKFd020zn5qnVUrML9lblMfZARdNIoLt+RglOtOqwkd4xz2BY9hrqCn5ESYQOXsQvIInClrwAuXDLg+Pc6tPVNYMbqwBfV2yXVJo4dBpoYndQ5tzzXSC3B4vfA50WcyoKDOV14NnUEXGoJkP08oIrG+F07vmy+gQYak1N2qaSQEKPC9e+ekQiSFNQvTETySxAvL37v1XyU7T8vVhKTqvQBvJ7ZjcicJ8Flv4t5YR2au//B502dYhEsFy/eejFXejnBetGyZld77CJOn+nAkUc7sL24AFxmBbp1HM73TuL4DzoKgWtFYGZ99UubJYKFZhfYrrX0+JDNDZda4RDicfKCE+d6JsQYry4+cG15Jt7ft0q7DiCpga+z4iy1jgOf9FF/msW9JDoiGPUHClFatF5aYrdajfSy0pWp9ZOIJXKqRYemX8fo9qKDNmEV0xNG3faRjEg8VRhHwAnUw4KksCy7Mld22nfpn/Dev3R4/8e/C60fwBgAOOpfq/GX+aryL5IdqBXbLao2AAAAAElFTkSuQmCC", J_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ+SURBVHgBpVZrTJtVGH6+3tu1a9e1xALOGhezsTDH1GQziJcxomNzJOr8oT+YOv1hMss0YTFeSrxhQqLxjz80Y2Yxw5ioJE6dMJFsIV5A2IJbFhaBgoOOQLvSC71+vud85ytlgAH3Nu933u98532f93bOKfAfJMuyg/gt4i7iYXmeQmLOR+zFaokpCQMrpdblgKQljL9Mg5/YEU/NoXuoF1+f/xm9gYtIppPIyjkU2dbjDlcp9mypxIHtNapqmLhJkqSPlgVg6RDG8f1f5+D/4RPkZBluqxMOsw1rjGa+LpZMIJZKYHTmKtPBm4++iCe2Vatm/ATStAhAeM7R3/nxMxz77VvcvaEMeq0OpKCsod/CcAEW5aWJv3Fwx34c3X1Q/dKgRiKpOaehn6WluaMVn/Z8g/LSjfyrpDw4uU05xLMSYmmJG+fzMtfHwNhlPL+jDq8/ckhNVwWBjGgEIkuN46v+DjSfaYXH4UIik8xzPD2HOI0b7VHc655V5jI0l1a+sXeP3YWWrhM8tcwWcSuPQHg/zF62Nh9A4HoQ5cXCe0oNc3StQYbvrih2lyS5N53jRnx4wYpISlKCoAgkWnjh6hC8Dg96Gj6HxWBiS9exCOqY1NZ/moxPQqKZtboQ9y4mvAvGU2j5U49IMomJaArv9ukRjKVEJBQlrXUYQtyhkfAEOi//qtbCp6PHfrVreDGJPaYpjMeLkM5peGGZn15rGs90mskg4DFHCUAPtRAacr/YNA0SgBzQPtiNx8ofZGYfYADbmDQ8849SNGKDJo19t07ixNC6fAf1Btkzy+Ur4XmZpafOG8Z0nL0bmX/oG7+kRuDViIJgNDTJvWcIPUEDXtgchkMfQTQVV4osOCFGlj62F+z6WbyyNYTBkF50m4RIIrYAgJNeq1VFjEa1CBCfrA6hxJJGOpvJc0qMGWKXKY226mn8fs3AdaC2dMH2ZQAjTLAaLCikl8464DRmcWrPNJ7bFIfHkst/W2/MobFiFufqpmDTy3i7z7ZAt9RRpIphnQDw3kO7NjAYzC9iETzZ4cQXu0Jo2Xmd8xxtsiSx3ZDLr3n8tJOPhXSbs1gVB1gE3UzaV1aFG2lwRo+a71w40mPHH5SGuQwDoIJPGfBBvw1V7W5ciegW6dWWVapiO9torMihaDKO+z6ux1jkmij2/yDqqA32W3D+1TZ15nYNtSFrul+sRgve33tYaW0Zqyeh99quZ9WZ44VnETsGw7WbK3Gk6mmsGkFWHo0P1+OpCn4/8LuBCRyAIakTb9QcQuND9TzcFeEI4w3k2FECENQkbC66cPxQTlZ8OfAT3jtzDIFwcIl7b954qd2N5trDYNEXGPerL0tdmT4Bwnf4SToET108S0CTGCMwrUaDNQYztpdswt4t96Pmzp2wGS35tNx4ZS7tmHLpH5dXTl3yTfy78AkDoQKDw2LOL9p8WfoXhQuADB3PGBYAAAAASUVORK5CYII=", __ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOCSURBVHgBpVbdSxRRFP/dmZ11LSMrpQ/6sLIsKvp66Qusl74IrCB7qKggIYJoCyKSyLW36KH+gCgrCgNfDErDQoOghzLtJRQlF7UybXH9Wt3d2ZnuuXPv7pgamgfOzrnnnvv73XPOnbkL/ENs287kWsK1lmubnZJe6fNzzcFUhRZJgMnKw4mI2Djgl/gjwDXTHhhA9HU1zOoqJBo+wxoc4AGAvngxtGU5MA4cRFrhcbU0zLWUMXZvQgIqhwRHvOoVIjeKoXkNaFnZYJlzoM2cKeKsoSHYXK32IF8D+G7chPfIUQUT4CSlYwjkzgX78K0SxJ8+hWfrVmiGIYKYEyQtmxIRakUiMJua4D19Br6r1xTcZZUJUzXnjwYqy8id24g/uA9j/QZoMoDJfTAHWwCPIqGMGxvhOVeE9GvXVbk2c5KgInjIH2diz8sxcvECjHXrofNypAiSebpGRMBoLSzOnOjrg9ncBN+TZzD27aeAOk6wh8ndt5FnVWEFgr8i2Jib5UAxDWrrVB3GVDlThCIp2yIqfGkJIW9JBurLCpBm6BQwx8N/DpP1uKoVwa4IR9EQ6o/Bl+ZxAAjc1bAkthjbqn+IxkyxtrljELX1P7B/2xKa8hNKAVkv3nc4W+RBPeEY5s1mzthVFeYqkj2qYjZ6++MyRYbyN0FFkE8Em8gK/hxKIkVNCz19UcygLJi76mNfHCpXJJpA3EwkO/axKaSmc4ggk6zWzhB8Bs1TsS0RGI3FoWsMmuYuC5PnxwE3EzZ0jqsbtuPg/TDNaJKAmiyiI193wqM7gIylGjpZIRSLlBMmWDbS814KP+0tKAwjK5X+FMFHLWOENVe5wkkClr4GrtM3LWHepcpsJIJ3ZHkydmK6ok6WPitfuSqpB9TkXtsaRPxbITQrJJr6Xz3gTbD0hfCurFTu5R7+IoU5SR3TMnZ/yriE0voiMPWNmOL2+QFC8eabkPsvo2+ROoBnuYZ3LNiHYyvOO5+CqfRBntCTq/zIX3SIPOJuIEMQEJNynFtbjFO5lydPIsFP5PpxavUV5S2VmGMunAB/lJD99nsFHrXcRfdwhzPJxgKTLJqxAkVrirF9/l43eEANxrsy/ZJEvOE1nRX40F2Drkg7wrHfYoFXT0fe7E3YvbAAW7J3waulJcvy95U5ftbOpV9mT15q7Wn8u/BLgF4XYJv0BeQxn1D+ABubAV7ph7P7AAAAAElFTkSuQmCC", $_ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPSSURBVHgBpVZNbBNHFP5213YS4uavFiY0f0QgqyqVSA9V1FZKOFSqWhXooS1UqmgPHBGOBMmBAw4n4AAIwQEkBELiDEECRAQEDnACEf6EgkCYEJyAs7ZjgnfXa3uYN9lx1okTgnjS8+689+b75r2ZnWdgEWGM1XHdw3WI6ws2K0nHFubahk8VmuQALFVOLUSklAHfwR8RrnWFQgGZTAaGYSCbzSKfz4sYr9cLj8eDqqoq+P1+OTXFtV9RlMMLElA5HHDcjg2ilX0DPkGAqaoqlISIeSxs2xbjL+/eQcXvGyRMhM/pR7mVy3xPPtrP/riwlsXjcabrOkskEiyZTJYo2chHMakfO5lxYJ+7ZGGJq8qay5WfeXIQF6Nnsabh2+KqSSkT91iqpmnwhUKwTxyHsTcicffIPVGlgWo+9GqAExxCYFkQFjPmgdPTrUWfacGzYgVyR4/AvnyR8Oq4nhIEDtN/NDj5eB8UTkkTrUKmBFRsmDK7ZW4S1TSg8Y3XuN3s6wVLpymkm445ZbCJRtdHz+GNOSYI0rmkyGCuWJlpvBt/Ns+uGHwxqZQohzoxLrMgCXv4z0Z6uzV+RYCTTtk6atR6ufn81OQQf3oVdwcvITk2Cl9tEzb07EfFsmqHwAT0SWg8I4rPDw4Cf28hVxeRrqO315nozKHlQTmWRTqbKK4wb76FyZ2eggUzY0B/NYKHNwdmM0joUExTTOdFBRu+J11tqrMh0M0JiBI7Zc4xW6wmPvkS5rQJlo1BH4vy8nmxqvM3TE1lMKmPihjk8pBTBYaulxAI8WheETL30zbSz3H76Rvo7zW0dv2JdzkTI48fYNV3PyCVipXuhUuLuFyjxFSpVs56XBFV1SvR1jCCY4l18E9cg7Z+E5RAKyw7hsbgWswVmqq1t8thqkgQauhALPZy3u0UWB6CaU1ha4H7mr08A17T5VnU1K9BbU0QZaWlRb4NE8FNrt3rv9qIodj5GTMrzaKp+XsEbRPxpmk05m0EvqjnF15lWWyaqv3yqxwO0B6I268j8BOa/O0ioJwQ4MraABobGhcFR3MLtM1bpOm8yr9GumZv+LQKbPt6NxZk+IgwufrePmk6zbGj8hT9zzXVGfwZ/6zeDuZEiyO4RHASdWcf1L8206voDcJGP8QkDVtDu/Dv6h5I7MVIyCeUBjt6oO7qla5+B3New4lg5mbFjdgFdFR3iebivuTmEpCv5v4w1K5uN3hEDsq1zLBDIr5wy7JE55JdTIroAz6faJ/OAsq2zIVWRk3/NFu6DLHP+HcRdgCSLsAXji1Cd/5iGB8A2dJV5BcmUTEAAAAASUVORK5CYII=", e$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQjSURBVHgBpVZdbFRFFP7m/uyWbdNtu7axUkoNQQlV0xh5IUTQ8GK01PiiUZooAg9GtOiTUuxWH3wwRh/8Qx8gPpgIqbHggwESkEST1laUgNhA7CImLSzt7nZ/7t2fe8cz986si7urVSc5e8/MnPN9c87MnFngbxrnvIVkhOQUySz/syXk2BBJD/5tE04SYLntYD0iVgP8RfpESVq4a6Gw9C2Kya/g5M7BdXJkUIQeXAkt0AUzvBXBtseUa5JklDH2bl0CkQ4JjmNnYtgYeQ4BvQTNjIAZYWhao2fnullwx4Jb+I18gMDUDjQMDiqYKJGMVhHIlXvsowcm8eGRC5g5MIGgqYFp1aEKYCEuEdkPnERw5240Du9X03tVJJrKuVr5G598j4/GLqJvXQd0VoTGLOiw/C+zSYTuf4UYOkXQexfyH7yHzKuvKIIRtSeaGhA5P3z8Ml7/eBq33dKEnO1KIJuMfGFExMp9n0gQa7kcjM5O5N95G/mj4wKvheSgRyCZnhadfe9PQuSDaRqytkOAPpAHzC2kkmlyEHrOmxPjHlkuC900KVIgs+d5uEmx39gijrmI4FHR+5xWH5vLeAQLqQJF4HigjNv4bsLCUiqP2AWGqUmOuTkL53+2ZFQkFIG2uOgRaNevIf/FmErVkEE/A0I7ejom91xDPJlHJCx0mzaohM/GU+j4WsfGO0NobdZx+EwWtm7i7nWm58GyFFEy4eVbiHPiOLDjWQG7WRD0Ce3S1SWy9MyRL7oeCVxx7h30doWx6pwN4/INxHUXK/NtwCPNNJcQhxa4EQcrFuXyiODsDyqCHkNuCK4nLD8CeR6LJXJ0M0TEMXbWRX87rb4vgN8TAaTnG7E2lUU8nkB7hCAIXJ15IXx+/iYC4KZpoPLUtzc7aO3OwG0tYGKxGdlCAxrCYUTaZglcZJ1XITDHKY8JgphgagqZfs6rqwfWmjYWZhxs3mRgwV6Bltg0riWaUKsJb6O3V3WTZYIN6zswcyVd0+mFwQBmzpcwNR2CVUhh21MBrAgXaEavaa919yj1R7En3wjtyYfWyDFe5dDZoWPLg0GsumMOTzyeRVePjkhrbXDhbfT3q+44E5eBlESh6OC+7V/i4pUlqGymP30LDWYJ/9QK63/1gF1BsHo1Qr9cUlO3a1SUxLU7HTB1vLlng1/B/kPjUgLDr6mhQ4QdU7XoGZLkw5u6MbyzT5Isn0hZmlRNje1e2fbeBqF4BIJJDYzsuhf7d/kkqiTXBZbzwkR76WWY+8rlelRiVj04UfiVFUdOzGJgzW4Y/Kp/wSuMeeVXvxX8p73Qtw1UgkdVp9aTOSRJvBvO08fAsyfBSvR6OQvSKwAE7wFr3AoWup+W31ROy1+fzDqhe4/+Ib78dor/j38XQxIgUQE4K8ei8pjXbX8AIopN11kNNXAAAAAASUVORK5CYII=", t$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAS6SURBVHgBvVfNbxtFFP/Nrh072EkcCRWkgnBUEBIipQEJJKgUckCVOJUr5YCQEFe49URKQYhbE3FBCEhL/wAiwQlFIpXghlr3VCkhtSMlCiWJbJL4Y+31Tt+bnVlPtnbzUavPeprZ8ez8fu9j3swKHFKklDlqzpNOkp4hzZPm9N8V0hJpgfQG6bwQooJ+CAHnSa+QluXRZI7fPWh98RBgtm6a9NP4f8HeHvylJbTX1uCk0xDZLJITExCDg92WukTe+AJHEW110TbH396We19elptvvC7vpZLyXjqmNLY5/rLcvTQt/VIx7o1iL2+ILuAc318QxhhBpYK96c/RuH4NbnYI7smTcE6cAMhqkUzSAgJBqwlZLiv119cRbP6H9IcfIXPxItznItwS6RR5o9STgGb5hwFv/vUndj64ANFqITE+DjeX68lcWq2s1dC6c4cmCWR/nEPq7NmeJOIEiga8cf1n7H7yMRKnTiHx/Au0FtkqZdiGky0zBL+rVqMZqs//+svL8O+uIPvDTxh8/4JNYsLsEmGBX4FOOG9xEbvvnlPuS46NqUndwIUIl1BwQqGHHuAf92nMX15Ca2MDud8XkHzzLQM3Q2t9FhHQrmfrEayuonLuHeDfDQy8+loITuro2UJarAUi30ch0GOBHgt8H61bNyGfehqjf9+E0wnjGIfC0Q/TZrT2zdfAagkOJ1ijAYfVa0B4HvU91UJpA6g3wpbm8FzhhfNF04vec4iAk6GEXV9D9avLsER5W+j9XjbWl196EW4QwB0ehvvMs2S5VJkutJ2dpLHMN6NCj0gdBt4h9Ngmg9rVKtqZDEb/KRovcA6MsQfOR9Z//x0cAudBQcXGoWxmi9kyoa1U1jc8ZXWn1Vo3c7j1Iq+IZjMMI5FofDtr4FRpZ6xJM+L/9msUbyaC7S0L2ICbvgY14bCIRMDcbm7BoW3saD81FxbsMExyCG5R54wkdpUnR+HSg2tI8JQnMlRi0zic7A+LrNdUTVDJyKHQmtsqQ1A4SAoJ6H3fvl2IMt6oWqZWBajSYWDA7LtQJDpgagta+SAJjt1OCWhTM9peWUHi9Gkezid0LKjk/r8PeJ+QC5UykON0AA0h01ebn/dggF7+YQ1Kd4GQQI5DoKjX63Xs7OzAdV3CcJQK0fOwPJIERIhhuG232xgZGUE6HYaVw6xKYiKR6BtgXOLrsnFaKtwrGQKPS5JU5LSoSnibe8zycZCIebrABBbN0wBnuhZ1otkn3jHFXodbE3stN5jAPHQeDHa/UvVFDIkYgXlHn8vX+Il3QCqV6ovl3YQNZAwtVxn7geOYwctldTZF2Xrc3WHcL/VdYpgPuA6BznGsr0izBownPmoOxN/N0h3SAp811zL7RsQVkc+FPD97dMhU6XxQtyDtgcN6wk461gzVfQ6tlhKsK1lUEfTAlJ6gXhgaGlKg9oIHAdtzjTdj4FP2V9PB13Iqn1ym2SO2Nx5Ggufwluaks+aXSN+j54I9X/RYJA/rem6IMIkmnXKBPmzM4sZqjjEXGt5qVrm1LS/hsMI5QTrT5ZtPEgHZarWUEiHV8lgPmdH5dTzRn2lX5dGEP2Tn5KN8nHbzCML749ukr6BPn+f3AYN1QA77ZllbAAAAAElFTkSuQmCC", r$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVGSURBVHgBtVdbbFRFGP5mztnuAqW2UC4tbdnE24OCjQjRSFIxMfBEqk8NImgk+ij6YkxI0BefJJagL4aEm0/6QBVD1BBpNfEGITWIMYhxkQoKW7rSbrvnMmf4Z86cs6fbXXpJ+bPfnrNz+b9v/n92LgwzNCllIz26CV2ETkKW0GiqC4QcYZAwQOhjjBUwH0bEWcL7hBE5Ozuk+mKupkZsiKfYuCvkH3lHfpcblz9dKcnz/zq6rIbtvRMPq0GepcdphGHWNuYGOH6hiJ+HJvB7XkzpKAmrGiw83laH7ofqsbLeTlbnCJsoLblpBRC5yu/xiDwoFND3/RUcubkMaZujeZGNJQs4MuTf5lz38aXEqBMQJPJFHyMTAjuW5LGtczGs1dk7iuBVRh6Te2fP4uaGdbh86gc8uCyDNSszWLnYRjplQTILnmQaktzUp220UN3D1GZD+wIM/ZZDYfMzcL76MnKvfJ6unBe8IgBx2EuffoLC012w0mm03ttKpBxuwGi0nEgJQQKy/PRJEKfIrGhdCm6ncKt7KyaOHa0U0ThFgJpwEblz9gzGXn4J9qo2pNo7IPwgJnA1GYtHr6GFsbDetBMCSHV0INXWhuIru+B9O5AUsXeSABOW3TrnQ0Mobn9ejyLV0gJWKiEQUhMpEp/IVCTikRs4QUIIPUUQ6L5WSytFwsatbT16PhnbHaUiikCsaHzfe8DlHHgqpR2EAoJ4pJpEiwBcGqUXP0NhrhHh+zQznBK474MvqgcbHkbxrTeRMD1gbvLxoh69OwTnxFGtSkWAOY524nthCtyImODJEJrcvCsxoTiVAkniHe3D8j3t0/34GMTVfyIBOxW3Ku+OStzrJ2F38VDA2BjY+Lh2IHxBRDIkNgIUsUbFu2Pa+CJMAaMBMNcNfVI0Sh9+ENHppV2Vd0Ul4tpJsKs+WIZEqBwO58MUkACdAlEOe/xe5bd6qomrBdzIg3ueXnAUvC9OJNPQpZarTj0RhQ/x2Y/g96eB/vFwhRodpfJAp8D1E91Upaz4nTSqU3NAFkZoUoW+uOkiLl5EkCdRzc2qZacSkA1H/yvYCEn/fAxWRwrcom7DFI1bRbgTDoVXVuWuNFWvmpZKrk5hsjxCQCKMgCxHtKU2FMHXZXT47X0rkDrRBr5xYZga8liiCDgKonr4I5RE2CaQ1cUpiD8vRUWN5R3jigd53oW1PhNGtMo2pXxKWaVwmohIlN3pdDTGC6FOjV4d+NJ2ehOQ14VuxVBjq5yDscrnPbGAghKQ04XNFPInF4Itt3C3zVq7NnrNKQG/aAF2GlbnRvAti3A3jWezYOUUDCoB/bGy7BNxQ4lp0zsjS/pRT3vzlmT1gBLQBzMP7CU7IQ7488deIURZ3etvJIv7uDm9HtE/eQPsXa9S43lmN2Zv3wFePiEdVtzRbtgblaZ6XgOa2vXfTQNzN5kAW70adXv2JKvfUV9agDmn7dfv9Bex1vQiUGuFWhnnwZSA1P4DydHvj86GySPZ2zB/Sd7wKG0k78I/J8ziM9tJEYZP9aCFEnUfHUxOvpzhwiQBZi5sMg1gdz+HzDf9AKmWxuf0IoxQ/aGv5cuR+foU7Bd2JMk3JW9N0x7LJR3Rjg/+j4PF7OQurAY/fdH5FT2N19Gzvin5n88RniXywWSXGV9M/isGGLjso/9vH38VpNkvWNRBc9/XxPFYi4WtD9hoykw6cOdQ42JS08zVrLfaXcvxA3nhhi/PXfPlmauevHRTyAkvqHU1600ew2dtMrycHpazM3WRPSRncDmd8YYny9fzpwiPYJ6u57cBNtKhypuCIGgAAAAASUVORK5CYII=", n$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAc3SURBVHgBrVdbbFxXFV3nPmY8d2ac8Th227ixJw8nImkTJ0AqKHLij0ZRK4RLKASE0n5B+SJVEULiI0j8IAQ0+aAUITWpoCgJKgFBlfYjba2kjZRC4z4oTtrYk4cdOx7b43ne9+k+d+4dX9szSV9bs+c+zj17r7POPvvsw/AxhXOeossg6U7SPtIMacpvzpNmSYdJh0j/wRjL4/MQcpwhfYp0jn8yOSL63s4+u4VjMbqDpAeWtjlWBdXCVRjlKUhyBLKqIZ7eCFlpaWTqF6SHmzHCmo2aLq+iRrMntlnEjZFjmL1+BpXZi35P8ce9n5CW1h6kVw/gjt5BtCTuCpvMkg4QiOxtAZBzMb8nA+fWfAEXD/4S4ydOQE21ItbVhWhHB2QtBkmJeH1c26Lv8rDy86iOT8CYzqHrkUew/mc/gda9OgziYQIx3BTA0pHPnj2HC4/+gFA4aL13swdAjJaxpSZ8Cnwy7EoVxZGLYBLD5t//Bh0Du5oysRTAWOD8+vPH8d7jBxBfuwbx9Wu9DwPWGRZ8BlY4X7DGfSDlDy6jNDqGLc8cRtf3vxMGsS2ICRZy/hT8gMsNvYb/PLQPWk83tEwPJM9pzQMLIWctElxNIqrsGi2eY+59GeArXbqM6sQEdrx8Eun7vxK4O0QAnqgD8KkXo0f16jWc3/NNmNcnkNqxneyy+ugD94yGyFoVyJtaUOhIIv7GNNxZJ8wkOKtdXdtF/sIwlJVp9L/1OpQVrcFna8RUSP7DweDt5V/9FsaVa1C0FnDDANcNQDcB2a4/u6YJ5WsRuMxEsjQHeVcU3NSpraaS5tT6GaZYs4gk4rAmp71gDonHtuSv98eC0Y//5YTHphg5FwbIEJfIyAABqvpOCIh+fg5KnwLBnTVaojbD+16o1CtBzrAaYGHDtr1pHP/zcdi0qnx5VPgWDAwGb64+exTMdWtxXa6CUzQLI1Ivg9RDLzuJ2jUSWn60AtE9MZT/NAHz2UnIbS6iT7aDb5I9VuSNEn3PfPZITas2eQRm9PDTgTsvtQsAO4M30/88BfFCqABiz8yCOybYeokSkQHliyrsyyXoL89AitqQ0y6gWpBpxMbQDOwPi1C3qkA7AY1RTMRsWLlZosiu282deik8DTsV1DYWONUyKh+MQvaDTSB2iyU4lGuUeIoinkH+skqsRKD/jYyusKEMxIGbFvT/F2C9mEPk/gTUB2NkjGiPWTCrBbiFgr9qmLeSSu+OwC4WoCS9YOwTADLirnDhnVC0L4jjVGEZJahco6iWyEkU+psMQ3dvIIYUlF0VUWahf2sBGsWJJJPjik0YypAIpItFqcq7F/lhxfZt4jEj+XMBu1QKFlnonzoWXbgGGS1VvAynZ4uQuoH/znWgNzmJsXkN/yu0Yzodhz1agFkog7sUqBqHfUlfnDd8rYyN1eNAqY+0WFzkOLiXVipghgtecuCqDOrdCiLdrZh8JY6eWA4PEpiJYgLy+jhUERM0VP0mMfBWBazs1u3w0J2STNZ9CAa8lKitW7cIbSDuFM0xGeMzBMClxGK5KM0DyaiJYx9uxo1yAvEWGzmdpsjhMOcpOE0a/atFLJXArppIBK/ygoEsaZ+2bi2aiUJE6c/nIN0To0DUoLapuK/7DKZsCVeoPU6WH5CqMKY4rPersF8pQk5IBLqxvWTfluDWy4Rve06IlsT2exp2ME7Pg2WicE8XYR2hpVlxsUcz0S8Z+JJq4uusgnRUgv5cDu5LBbw3uA3vpjMNbWm9a2grjwePwwLAa8FTx+7d3pUv6cQoEKU7VSgbY4jua4NDU1E5V8KGHgV9XWTiok41gInYYyuh7G6Fk5Jx13Z7mXNht3PwofCrIeanYhGWKZEmz24gesrGsiUp729HZFMM+h9vwr1mQX2AipNv1GpS6x1aHU/fBE/LlLKTkETyI4B8xq7vjEIplPHV999Ey0KR0ib5+/Jz3jTQTrVq/3fRSJx/5aEP0xIbo8zYqSD+cFAQM0T6NEj3xsBoR7ReyMP4d95zvlRW7d8Xdn5U+F62HQsWzu/YCXN8spaSwxbEjuL6C2orTcfeNshJGdWTc3BeL4M5HI1oF4sx2rMa2069EAbgbcfhguQQXX4s7vNvnMPwnr20H/BlmXGRUEGCJOm03bC5Tj/trFtePIZ0f3/QJKrkA8DiikhwegF+ap7863GMPP7E7UE0kXpVRKxtfOYQ7vzet4OmLBqVZD6IDEJFaf7sGYz88EmvQGmUpJo5Dq6RVXfgC0f+gNRCKZbFrYpSH8SislynIiX769/RVv13KsVc3E6EY4kOKJ179yLz859Sek6Hnd+6LA+ByGDJwcSs3MDclVMojJ+GXsgu6ygcx9KbkOy8D+3rvgUlmgo3Z9HkYNJ8JBQTIjAbHfocR+fl3Nu8OHWeFybP8Wr+EnescrMz4iE/vj6d+IfTo/yTydxnPpw2YgS1+nEX6VZ8TsfzjwCPm+S/STw1SAAAAABJRU5ErkJggg==", o$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWmSURBVHgBrVdrbFRFFP7u3Ve3u10WwZXWbVnkLVpaEBWCVv2DP0wAMfgHiQkSE39YTJRfRoqJMTFoQTEaaCJYSZQ/kiARFcMriEgCBSEKFNiWVksL2+1z33c4M/fO7d3ta0t7kpM7dx7nfOfMmTNnFORJjDE/fVYRVxFXEIeI/cZwlDhM3EB8nPiAoihRTASR4hBxLXEnGxt9w9eOJl8ZQTG3bgvxptyxdE8veq9dR7z1P9jcBbAVFmLSooWwFRQMJaqGvLEVYwFgID8K3c2CEpFONH9Vh7affkbPxctDLGXwzpuDaWtWIrjuVRSWlVoHw8TPE5DwqABIOd/fH6XyVFc3rrz/IVr27YfDVwT3wyVwBR6EzeOB6nSINVoqhWQkinQ0ihh5JdFxF2UbXsPMzdVwB4MjglBGsjxy4g+cX7+RNDD4Hl8Ah9/HDYWi5Ipg0gmile6PoeffK1BUBQu/3YXJTywaFkQugJtSect3P+DvN6vhnfUIPMSKnKwYX5aNgbEBacwA0kdx0tfcgvK6L1DyyioriEp5ShSL8loYAdd++AjOrVmHwlAZCmdMhyom6hqUQcj5iOEWoVj8mfh6r1Kwtnfgqd8Pwr+4Qi7aTgDeMeUYrufWI9Z8C3+9+DJSbe0U2eUkVzGtl+oVZohXdPfr1itWT4Ip+ldLa4ieb4CjeBqeOXMU9kk+OW0G3wrV+Nkiexs/2oZE0y3YnHawRAIsngDiScHyX0smoVFbi8eJE0Z/3GTQuFiXoHWZFJxeD5K3WtH46eew0CbDGHHeO6X1J+YvAcUOnEVeuEuDNMGy9zn7bvpZQVaDGR7iXtC43KZmpPr6ofomoeqfs9ILPAZmcA+Y0XGz9kvhSS5G64tBo2gW1knLhbXS+oT+le249EjcnKN7jziZEjIz3V0I79wl1YnUzgFUyZ47vx0VASeCTtOQuRsRyqUCluQKDbcTnwy60OpmWXMkENmXuhOhZJI25UZOnLJuQ5Ud+sWCNCWceLgJNujBJhBTykVGoxTrEkHGdP/qbfqcC9jR4XBiZVuPVajYAh68mZjuRZgyGaKnTovEpTpEEqvgAEK81X3xkiXaB0jr7wfjCyjrJe0qGko9AohGCm54gMt+NwLtDhEP7qSG8laazzTyVgosnTaUZ4dL7EYYnrmz+W/IbuwFMuQBxZySDYIDyBDbSamXwnXbilJx2p+82YXbPie2L5uC4mgS7/3SAi1GJ0DTYA1LZjGMc/z/NgnAL48h5fyuQR4YdN2Qa+e29mJH/VXYE2n0qwwxJYNZ1PfJ/kYEovEs5RgkJ/uUcOIe4MfBz9NtvsS4YoeKxkCBEJpWc47oMCSBOKc8ILui3ANh3nLPzB/A2elFWH69G7X7b+CDQ014qDuJawF33uu9j86XTZEJLwhUU6fAM2d2XgLmtMew8WQbHBmGQHcKWw82o7grkdda3+JKqHab/G3gAI7Jv6kvrchLSAkFXC55E9qo6/guTVu72tp1XKZifhH545SKT5cvhZLOQEangvERs7BGOX7ZpTMoGKiWJqvGvbyX//GB4nVrzYUTTcGNr1uV7+G6B13HPCP+WbEMGSqrcpPS/ZCwnNg1vRSVvx5AAZV0Bg1cx0aJtIO3+U31WP3uLNeNR7lIQpR2F9TvsirfIcsy1TK/BsaR9C9finlfbx8XCFO5y4X5dTvhW2RWQ2FDl6CRi9Ijx3C1erMoUIbLjkMpll9XWRAL9tWhqHKhVfnwRakBIqss5ycj/PFnuF3/fd7xYKPyvXjDepS9+7a1BAsTryblDda5eT9MOJDW3XsROXQY/VRoDn6WUJJ5egkmv/Asgm+9Abvfbx0OI9+HiQUEl1BDXJ07xguOnnMX9KqHrlxnSTFVzyGohUOmYx7cNff9WDUep3vY2Khz3I/TIYDI5/lzxDyqQpiA5/k9GqEwuwKIhwcAAAAASUVORK5CYII=", i$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAajSURBVHgBrVdrbBRVFP5m9tl2u922tDVtqUWh8gjloaYiNRWUiBFjsTFqQdHgHxMiPpBEgyAEkKhBIP4RRNoQNQoKNChEkIIIqTzbxIAWtQstdQtld9t9787M9dzZnWUWt7RVzubsnZk795zvfufcO+cKGKIwxhzU1JLWkE4mLSd1JLq9pE7SVtIjpLsFQfDiVgg5Lif9iNTDhifb+NjB7As3ccxnt4L01Rv7/OEQ2nsu45L7CqwmM2wWK6aWjUYmtWnkXWJjJYYDIIG8GXGaVfEGA9h4cDe+azuBkxcvpI5k8aaiqAS1k6fh5RmPoXxEkd6kk3QGAXEOCoCc8/ju0pxzxyv2bMfWn39AFs2wNHcEiuy56qxNRqM6JiZLcPt98AT96PL04kq/Fy9Wz8LyOfV6IM50IISbzfzYhXN4ZvM6hKUYJpWOgiPLlhY+Y/FLRj+BfoFIGOe6L0EUBHy6YDEeGjd5QBBiqsXrzi9/sRP7ap9CIYyouuMuWC0WhAhIWJIQphmr1zFqYzFE6J6DjEjx1iAaMLG0HCaDEQ+vfxuNxw9q9tUJJvIrlQGe6UgknKflBH6ZVYvMslJEx43Gtiml6Mkyp05d0KYuJA0xjQ5d2+7qUsPSvGQdaiomagY2EAuvJQEkqO/g16FLXTgxey5irivImVpJ9ukVUcSusUU4UuZIAZF0yv/Z9acMStw0gZBkGaed7Rhhs+P8qs1wZGZpBkbxUGghWKE9/fODjYhc7ITBbASLRMDCEQjBMOrOXERdWyeEsEZ1lMIQVSlPqhxTn0UkmcLD34tBUhTYrJlwUWK+9e023QTibAuJeHjis+/E0cr7ARpozrYhY2QpxESCqazTdW+mBeuml1Nr1iad5F9IhIYxjRGmdnX0uhAIh2GhnOhc14gCew7v5DvlKL6OajU7lz//WnXOaWGBIFgwhLxHonAfsCbDmh+J4sMDv6PojUVwj6/AQMISOaAQA6FQSG25uv92aQDUrZ0DqNEG9ezeqzrnGpAVyL3XUFkvwdOcC9kvgCChl8koCxvRvXwt9kohNMT86mQ1h4IgpIDw+/3o6+tLPqusrERbW5t2W8NDcJYuJisU74P5t6vO/1AkrAx7MWE8w/59GTj3/gis2SFjnMGE2QZrPPNZnHoXxWVZ0I0eAqZ3zIEEg0FVbxSv14ucHJWFVg6Ax9/hPXEabc8+Cn+GjJfO92FWhQHPzRFxiGLX/psZj0sOTDVaVceyT0DIaYSW+leZgvWRfpxRoknao9EoJErWdNLS0oKqqioVi5iIBVEcgGhgsM4JIO9OGUu3VKPJOxJ7m8dhwt0zUNc4ExO2dqFs0VVIvigUAsZZUygn8iMxrBEyME82Jmc9kHMuHR0d2qXDmKSNUEe6DTB8nIsd8wJYvSmI5qM+1NfXQ7DYsPfYWEw8/j082zITM5dTjDKinH8TDCy+C9xMbLbrWzpnQC0crMW3JbfF9Y0CnF0Cmpqa1Jerq6vR2tqKU83ps95LgN6J9OGzqB8xxjCY2O325NBkEsqhMA4XlGMLGWE5dry3fywKiwpwssmE0qknkZ+XjaXT/0JdkL7/ukw/zySsCHvgUmQMVXw+n8ZCK2dAXROGDCty7rsXT5gy8fqoKIotR+BavR/GpT9C3tSDrPBZvFKV+vX6Rg5hUejasJyPGTNGH4JWngOHSRfwu/yZNfC1nIJjUgS/Pp+HUHs8Ra42ZaD/tBmFT4bQd9gC0ZaFklXLsHDa3Vg4iEP9hsS1oKBA331E24p5Wjpibg+OT7gXzBdQ80FTvWRViBi/IQvWkSKGIuquTKrw5CSiTHccgmAq0bpzxUT12sjvTHm5KHlh/oDGiuvNmLIje8jOU5FQ+HLq9M4buO9/fY6lvn6cvG8GIp3darz5C8ZsAbcvzkTx08bhuExs0XyJkxqLYSjZrgdw/XOcKJE28msjrYDxDZvpRZNqwDKSqpsG239yHkcQb8TCtXrnG7WyTF8R8VzgS7Kc37u+3An3nqUY/aYZplwki6AhA0jGXlCdi/a5WpeTdIp2cLlpUcpCZ8GuLKG4XNYqLwjC4I6TAAyFEG9bD8F6j955SlE6aFkOqRuK+xNaGV/FV4VuRJqjQaKlj1Z2HcT8xcS9Xe98Ljlv1fsb8sGEs6D076FCYR8QvZAegYWKzowHIDjmQzDk6U06McDBZEDhOUG6Ie2pTwkzJXSascAxpgR+ottzjMmBgc6IG/Rl+LAlcThtYMMTz/8+nKZjBPH68UHSSbhFx/N/AN8TxJxiatxOAAAAAElFTkSuQmCC", a$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXzSURBVHgBrVdrbBRVFD53X92223ahBgK0YVtawKThmZAqwdYY/WFMBInhl4GQ+Io8DAmEmJga/WFMSMAYxT+GAj9EBDQY1EgEWv0hNtgKlRgh7fZJsS27tDM7M7szczj3zmNnt93SEk7y5d6d+/i+c86ds3cYzNIQMUrNZkITYQ0hRojaw0lCnNBFaCN8zxhLwuMwIo4RDhMSODc7xtfCoxr32CaeYqYuYUa+jmriF9Tut2NG6kDTUAoJabGjN62xAuQxai6DFWZhpp4EbewkpJMXwVT/FSuZO99qfUW1EIy+COHKV8AXqvJuGSc8S2mJP1QAkfP8fueQozEBqeFDkEmcA+aPgD+0CHzBSmIrAcaC9poMgH4fTJprpkdI7DgE52+D4oVvkZAlXhFbSERXQQH5nuvSnyD37aVJJvhLVoLPX06kKJYxli8826KpgK7cFvPC1YcgFFlfMBL5Anod8vS9c5AaPAiBohj4wzFBaIHZizDHD7TZEXkfhRBD7QVdG4CS6k8gNO9lr4i1zlvi85AfdsgzE+2gCPIqAoWcpQkaTaYWNBKhiWc8JcwXsMbsZ9k2TWsXQyC0AJSB90CX/3KoOEdLTgTs0HPvKYeDIPe8BswYgUDpatqITfXejptR9Izwwa9dAScojvcOTEOHTKob0L8QypafJ9HlDncNT4UTAVeR+v/nwPQhyndYeMwg6xEDLzQwQk+BGVon+gw1q+VRYhl7LfV9BvgDpeTQMKh3j4LH3hUpsN/RHY73evIsLaIBH/MQOwSq3VdpQhQwWA8YqKGIBHPFoZMmR5Ah9tQTp8RbZdt2zh0Aq7wK+62vFeJJtMj9KYiEU+BnXA0T8WVu1hBqK+phqQh5MXRlGmB4ss11DZ102J0JRSNictCUYFl/K2ys2cMHRGnnApqchV/1/gwjiiqOJiPS4uAIRIJlzklxybntmb/BJVSDjfD12HnINSYUpDIyyBmJXk06GyZAg3HFEcCtiZ8BXnggpUtwJ9VnVThC0F8kyDR6pxGdg2W1kUAFNEQbXaony9dByBf2HD4U0AzVPr3gHuTuRAek+XPL1vAIxHjvVvKG5aAAg4ypweaqnfBq7G0I2BXPa4jZOhBkRfDZ+p+mzDFQh5M9h+D84HFbgbXmbmoQqsvqeDfms3MBii473FYAqT0zcBT2d26FUW0I5mqj6hAc7NoGPwwfz6mavD8kxZ2fUbcQSZmJbF30tP3yLdh3bTNcvHMaZmsXhk/Avs4t0CPdzHnuCAmJ9FrGU8BLYnRJaSyPPWspQ4Ivb7fAf5PXYUfNASgNlk9LnEiPQWvPx/D76I9TB53zS20x1QXbkjwCcd6zczKjXbp7Fm7cv1pwvCvRPj15ntVHVzldUQn/5r0IeRUrXznjwgr6G147f1PB8Q2Vz0PQF5ppC6iraICAL+Bq5r0rhO38185kM/Sd6nQPY34yKjY2Q1Fj2P3NBvp5yQRcYl0+SgNlsPv6Wpi4djlnHY+8+F/gAl5/yTvU5ly9xH3PGB/HyYoIpsJBVAgqQfNA/uYUSpIkkDp7BtW6WlTra1G+cMF9Lh/9ImeNau8lEyaLQ2jEe73XNeuqRp0jzhN11zti8hQBkWKUJidRHhtDZe/uHBIO5cB+lEZHURoaQq2sZFoByu5dOZfWbIism6914UwmMLW0WkRB9YhQt25Bubsb1VUNU8hdspX1KN/8B5UXnssh53vJK+rQ6O/3Cojl5skTBb29DWUKlzcK6tONqD0xryC5i6rFqDZvcsUL7ykiekeHl/wI5Jt9FnqdGZkTx3POgvow4vxoOOTlpZj59rSXvLfgNd1OhStCv/QrKivq5yTC67myfBkaV//IJ4/BTMav5V4RZjyO2ptvoFJSlCNEnYl4QSWmDx5AM5HIJ18Ds7H8SDhC0i3vi0OoOER5UJs2YeajD9G8N455VtBzNoMInqcPCHunjCl0R+jsBFTpf13XgS1aBGxZLbCS0um2+pTv88gfq3Y0WnFuxmN/DGfxccpglobZz/Nmwmp4TJ/nDwAUL/lsTci/cQAAAABJRU5ErkJggg==", s$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWfSURBVHgBtVdrbFRFFP7m7t1Nd7tll1IaltLSNo3EkNiamFReLUYhNg0IMSTGGDHRRCUaMUH/GAP8MBL8ARgSjfwQH6gxQYh/REhUyi+l8hKR8mg3fSnl0e1ru929945n5s69e7fdPsWzOTtz752Z880355yZYZihcM6jVGwibSStI60kjarPCdI46QXS06THGWMJ3A8hw5Wk+0j7+ezkU9F3uvHZFIbF7HaSbp/wbXgY5vVrMLu7wYJBaKS+2jqwcDjfULuIjd2YDQCF/GfYNNvvBgaQ+uRjpE+egHXxYk5nrkqtqhr6408g+Mo2aBUV3iHjpI8RkPi0AMi4WN9jjnFhOLl3DzJHvgQLheBbHIO2sBQIFYIF/HafTAbo74c1kIDV+zesO7fhf+ZZBHe87QUSzweCTTVzo/U3jLz0IlgqBd/y5dAiEbdDPuq4o8kkjLY2okRD8P098K9/clIQ4wF0OMbT3x1F8vVt0MvL4auuAaOWjHMqmd2Jq96yZKIzuBrNoneibt68AaO9HaEPDyJAjHhAPOxECfMY3wflcJnz5zDS3AR98WLoS5eCyZ/HuOjIx8MXLbgLQCCz6J1BIMzeHhQe/x76ytVO4/001psuAEV9h+zc04ORjc1A3y34ybM12YjZDGCKsHEmIsdTZX09rPnFMLo6Ya1ajaING+UklFSJpdDVw07nbeoAEUEdfBRS2tiYbZQ6ae481Z9jRdGf/WgD5mJJGtcCj66AZhjgpokU+UawsNAxJdjerqt4f0HOvrMTxjdfw0d1TdCdTkMT667sCIMMyDGGnKVQFe405OSHmlQhBkWLOZqELxgSj1vJ9i7BwCan+8mW62id1wAWoRlrOiKhEiqZTZszSZY1yj1kOMxuWFOOkkiB9AetrMJmjwD8fvUuzl7pw7LyCJrWVIumMrULAI0OgN0to2hd0CTmTyNqKGIBzCsMICvKek4EeJggeWRzA2IPRBURXKoAcKq1D+998QdqysIOACGNAoBIPDAtC62EUhi2p8MwNGpIjy4I6BO9z2M8FwvHeJEMqjFvdA/hdiKFhdEC8alOAKgUtcvtCbeR19pIykTa4AjoGtg4EIJ6XWd49/nl7rtFxQVu/VhLDy53JKidhTOX7tjj0iDXOgcdAJW6WgvcGxxzGyjY7kAZw5Jqr2fujBnz4Y0ty5BPjrZ04dufOu3WBMKOGIabPYNY9VCpaBLVc2jKkjaudGbMQdGUI4Y5kfL84sAGIuGsXwkAIiVGyxaGMBcxTAvvHLrkPr+6qQZL1FjPra9E/YPFsv7jr704ebZX1qNFLoCEABAnrataFIYn2mYBgGPvV3+5zxtXlbkAmupjUgVz/UNjLoDammKneVxkCLm56+RkDbWL8H8I59lpVcWKEM0uwQXBwC+kW8XTjqcyaK4+YScfsOkTfx5ZkLqCVFdQ1gMlT4MV1Mh684oYYsV+VJTmLPVpplKx2IiiMAeR/nMlpd8hSsW207I5gHCl4hB40TrJgEV5Rqjf7/c6/HxN7cufyUffPPhKts7eEWYoblq35bCwPWE7FiwYbU1gmW47KWLuLPDCBnB/ub1xhtfCF103YTuW25Q6Ih2QrwULVUQdK3CZmAshss9wC2W4I+B3j0DzBbzGDzjHMu+JSPjCeajUbA2cou35NfKHVL7kOD0Abqs4FWlLPoBWvMX5FEe+I5kCUQnPoZSPXoYVf9lejhmCcCJOAtBL6VR8kO4L9V7jkx9KFYicYzky/8C69RH4vc+psZUFMC5KvYbppkIxtQVa7C25pB7jm8n4Ba+9GV9MkO6mZfmBkudxgJjJKyHCHm4Eo0hi+gLvlzgmuZhMKsInSPfnvfVZGW6NnON86Ay3Bk9zK3mVczM52R1xv/KvuYm6nB7ms5P+/3w5zccI7PPjWtJa3Kfr+b8mYdJ0uy7Y5QAAAABJRU5ErkJggg==", l$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcaSURBVHgBrVcLUFRVGP7ucnfZXXaXZVMRIlrJ0skHCFZGJaA9eKXZ9Bp7SJlFjWnp9DBh0BTLmoaYsqkMH2WWYw/SygZMNNPCJwpq4WsFRV6yy2Ph7u7dvZ1z91644opQ/jP/3HPueXzf/5///OccBv0UQRDM5PMA0SSicUStRM1Ss4OojWgF0R1EixmGceBqCAG2Ei0gahcGJqvp2CvNz/QBTK3LI/py77aOTg+qaxyorW9HsIaFUa9G3IhBCNGpA021iHhjMQZCQGJeBr+bRXG0u/Dh14exZZcNe482BRgq4MZoM6ZMtCL74dGwRpqUjTaiKYSI7YoECDhd3x9kcAq89LO9+Lz4mGjhteEhCLfoEaLXQMOqxDEe3oeWVg520vdcQwca7V2YkTkSObMSlERsgUgwfVn+1+F6TF9QAq3aiajIKDx021mUn7oO6iAC6NSBYeRxF3uis8uDY6ftSE+MxHuvJEKr1V6WRG8Cp2Xw9Vuq8exbZRg1TIepE1yICmtHqJ7DIAOH9eVj0diuB8+zoNgiEcpC+pqNGjyZZkWcmQPzdj6M6RnQPDZdSWKcvEsYBXgBpIArr6rHxJk/4voII6ZPbMVdN9VgREQzwk0dOHMhDM1OPVZsnYDGNoM0g0A+jEjmzthrkJUZA0vlfqg2fgPv3r3w1p1DSPFmsIl3yHAfEAKvdBOQXE+tRw2J7MnPb8L55i4kjTPjicRD0Gt4ZMRWi5bSAWt3jRMLG4gnujysOKMphMXcR0cgMUaHoKKVUO3aRQgJ8Hm94CsOwmexwLh7D5jQUJnEMLoUKqmSJ/99d/VB2Oo6oFazaG5jse1IFDi3ABVcYAQX6eGGJaQV63bfDLuTIW1e3D5mEIpyJuBO31kEZz8Hddk2qFwcURdUvAcqgwFMUxO4xXnKFRe9zUj73U4rZ863Y/RD34DzCMSiYFxHliB19HEYgnnEW+ugCfKipVOPE40WHKsbgsYuK+ZNH4Gk61mwq4rAlpaIy0DjQGAglgVS4GvOwNfphFethr6iEkGDh9BeNAaGUQ88IFPaWHpCBAext4Pzkmj2ovjAcNRe0GLljjHkvwuVtWHY+U8EBg0di09fH48UexWCZz4NdvMmgCNBRyxn3MRbHFHiAcZNPOFxi0un8njg3rxZhhNTO/XAalLIon9ueeJbVFQTZzAqMTyMZK+bjMFSlDIw6NzQ6Qx4M2sUUkfqoX5nGdgd2+Uwlr49G4vGgOB0wtfWBm+oGZ0LFsJ+bzJiro2Ru6yhSDTxiMmkorpFMQGD9i4ejjY3OJeXrDVPIjwam95LQnrHEWinZoAt+ZU4hZPUJSknekL8OloBAu5LTgH3y6/YHj8Y49em4EJni0wgjoawlZYO/N2kMIDp5uHkeOi0QSicF4/MsSYE58xH0NaSHqMZpQMEf1Lw+YhFHkCvhzt3OZqmpiH393ysrVwvxsfxlpO4Rm+hA6ystBbiAeOfTakQs9kH8xIQWf4bNClvgmlt9YMIEpgUdFIW8pcJAT5lEtxL38bPXBVe+nISGjoausmeaDmFCVG3iHHAyr6gS6AUi0lDrB6PKSNJzs+bD/anTeiPCCYT3IuXoik1GS+VvoriE7/0hIfkYqPG0F2jMSCmRP+h4ac4NSkKB75IwzTHfuhS7+43uPeuiegq24ktsaEYs+p2P3gACdV2JyMH9YCNaNywSCPZ+2p89NqtyBylh3bhPKgHYvXCXDRPSUPeH/koqlzXZ/94soUlsVEChyiBYE0QKr7KgHl3GXRpuQhqbkJ/hJ98N9zLlqPEWYU56+5BbfvZPvsPD4uBSdt9RFdQAtuJzqC1oTtLgTmz5XAS5XJXJiEsDO4FOahLT0b+n+8Tq79EfyTzpvuU1R1yKqYHkRkkwt0JcVC1t8GfigIT4CdNhnvJMmznT+HF0vk401aLPkXo0dNzDsNqjpZbwlTSubxWrJKTSvXUjMvPQ9aa+/hTNKwoxOyjBcj47pH+gUuSFfu4EnwNxb7kOKZe8ExKgups7UUZgU9Nhzuf7GvHPszZ+jrqnQ3ol0iWW0OjUfbUT0oCPcexdEUqhOQFdmURBLX/hisMHgwXCbL6gneQvW8JHvkxa2DgknySUaAEL5SvZcobEY2Fg5BSs6/4B3g2boAnNw+l/EnM3fbGFSM8EDi9Ka26fwVx/xWuZBIJKxSXUp7nkVO2BMvLC+XZBgQeYQjH1w+uQlL0HUrwiy6lKuU4qWGa1BEsy+LFW2chO/6ZnokF9EqtuKRNr9bjhYSZOJq9pzf4tD6v5d1zBXiY2Bw1WFe1ARuOfI+qpmOBhiEhIg5pN9yD2eNnIdwwRNlkQ38fJgoSNCYWEZ3bu43jOew/f4hcSLvACzyGhoRjuCUGBk1IoKno+i36z49V6XG6RhiY2P/34zQAEfl5nkw0Flfpef4vKptb961wQE4AAAAASUVORK5CYII=", c$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYLSURBVHgBrVdrbNNVFP/92+5BW0bZ3IuxtXNsjpdsasAHOkQwDNTNBBBBhSAmRIPgBxM1IgLqN2UEDQkoAolI5ANIBiZiJtPFCMI2EoRRFFqgbMJYO9a169tz7//Ru62DDjjb+d/e5/mdxz33XglJUiwWs1BRS1xFXEFsI7Yo3R5iB3ErcSPxAUmSPLgXRIJtxJuI3bHh0bds7u3Wl24hmGm3jnjNwD6vLwS7043L/3kxIs0A04gUVJZnw5huSLRUHfH6oSwiDaU1Fb9CNjOnjs5ebP3hNH76w4GWczcGTI3xb7l1NObPKsHSF8phG5MhLukgfppAOG4LgIQz/+5XhXt6Alj71Z/YVW/HSGMKCnJNyM00wmRMRapBx+eEwlF0dffBTWNdZJVrbj9erxmP95Y/JAJhwl8kEK1DAhio+e/NV7HkgyMIRWKYXJqF0SPTSFeJT2I6S5I6r98q8PlDOHvRzft3bXgGT1TkD2kJSRDOfN6iCt9d34YVG46iZOwolBZZaDFJESppQhkUDYjcwEveRqX9kgcXXd34Zt1MLJlbJoKoVGNCBLAJSsA1/HUFc96q5+YrLmAm1ClwpThuVW1ZugZGbldNEuXB2n7dh4btNXj8wTxVXB0BeEcDoJj+IvvtbO/BrJUH0d7px8PjcxQBkjJS6md7SRLNH+P/cltM8004GkHzmWvIyxqBlr0LYSE3KlTMXKGoxrcbp0+2n4DjqhcpKQb0BaOcAyFitQzHeNkXjMAfiPBSZmqjdr8yTp0XDgNmUxquXPNh47YTEIhbW1J871a1L63Zww2aQZMK80eSElLc7xD8HtdbCEvBGoI7HFdvotcfhCldD8ehV1QrsBgoZhaoVadt3XeaC2c+9/ZFKJojpIWgYUDWPCBoHuBlWLBERLNcn2KJYDjG1+ylNeu+O6WK46mdAahSWw42OhV/S4hGgU5PIL5YQDFtQBAQEMFF4nWhZGuEwjEtln45dkV0QxXLnSzx8PR6/vJNyBEvD+7xhxElF6Sn6XErUoNR2RBanPr6wpwRzxw49ncnb1PSdgX72tivC5dcsGZ5ZAA6nexXBbVBr0Nqig7JEtsFQbKW2UBCzTFlVxBHWRnFBddNTCrJZENtLAh5xARuNCDqWAY9ly9Bp8iX+uVKOT4G6I/BARgVwMjMZEfpE4lQWbQNppw5vF87vkIhH69IKg8Sri4ewXBIUlKHhpHqeoOWC7hMZndLW9dULPrwbRqg06Szv1HmFHR7Q5g6IQvHz9zgWzKFDqFgKHkgPDlzU0R5Wf9lCcq5B+BhABzEFWVWC5xdbGfo4tmPuMhgwuJ5Vm6+Tl8Xqh8bg3e3tGB4pABgriEQtsICtcPBALCNWZFhSsUUOvFOnXdr016ttuFShw81TxVgzH1GskQQzee6sGi2FSfauvDP5R4MlyaPy0R6qrarWllEHVVr86YXQttHRD/+5sKqhWUYbxvFXVGUZ0JtVSGdkOY7Es5o/qz7xWojA3AAchzgzQUTtGtVmTUDq18qw5OVOYMWeflZK1YtKKOrmAHJk6zV4jmlYuMBnXIu72K13Cwjlj5Xygfbnd34fE8bmlqvD1pq789ObNlnp/weRnKCZeErah+gI96sduxkstVNXae2blj5CPc3mzNtYiZ2H76Af11enoZZSq1vctHJ5qd4sSBporWs+Wa8v6xCbF3PPuKFhIFYzX43tXZg5srD/GAqyDbhtbnF0OsltNo9mD01D6u/OInkSI5+PWW1o9uq8ejkXLVjM2m/ZiCA/leyQ+exYmMT7UgdZbEYCc7HkeMdPBjVQ+m2wonYvfXrtdOxpHqc2uFAoiuZAsIG4VLa2NxO98ImODp6hVESktKcaGyOEd9/OoM0zxGFJ76UCiD6Xcud7V58tuMUdhy0J8rNCYntjuXPl+KjNyrp8pEqCr/1tVwAYcOAhwkDwkDsb3DiLO2QRDRtUjZ31apFE5GZkSZ2OZDsw0QAwWLiYyiBKRLz/8m2Tl6GI1HkZxspOWXQlSthXtjM1rnjx6ryON0ZGx6xh2zdXT1OEwBRn+cziKfgHj3P/weJF1zuKCXClQAAAABJRU5ErkJggg==", p$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVJSURBVHgBrVd7UFRVGP/dXcwQAnnJSj5wAsVSRNQpyxkxnaGXgtnYlDIimtJfojZqj1EZs5cWjyYCZlKoSRNqoKH+aGxsKi2QQBwfzZTNgjW8kdfussvu3q/v3L0Lyy6vBX4zv/32nnPu+X73+84937kSxgkimskmmbmWGceMZM5Uu7uY9cw65s/MckmSujAVYMeRzCxmJ3mHs+JeTBTiiVXHk0WWGj2vn1pPUwc9jTcaPDCOXJwb+6w0RdCLub16clPVVTqQcJAOZ1+h9s4+mgLoaaRIkCPneufInpJSag0Po+5HV9DFnYfp0NEKuvh7A00B9OSyJiQXAVlsMsT/6pstCElchbDZIdDOn68M69D4otQvDi3L12D/9jjoQmZgEsjm13T/gAA1LHpn78ptpSi7fAghS2MGFYpxzD+nhSMrdAOefHYF0pIXYxJYwCLqNerFMdeebkM/tNOmQWOxMM3QKtbBhw13UdBwFtbiM9iaUYH6xh5MEEq0JTUfna490Unn8OvtTATPDlUiICgHBbGyHpDdpkRC5sZGbQA+DEzA7GfWY+/zjyA81Ku0iJ1ygYhAskeXJEGS2Y2fv+LceugI+ou+gG3/AUjh4dBYrZBmBiPC2IbTjaVYeC4X+w6W4Osf78ALKFu7ELB2uF7JaIRt40Zg7jzYE9YBnBJ5/QbIy+Nh3/ICtM3NnBqzkpZNndfwzo18/HHiE7z0+g/4r8WAcWKtEDDM5sAR4Choa2thOXVa+e+kPW23YjW93ey8X10fZuhM7Xir5Tvs+/5tbE05g9Of10GW5bEExIk10InBqqYgOvkr/Fb1GoLkPtaYAFv6q5AfioamqQna819CW/GtMo44S8KFsib4QvnPOROOT/k+gbLop1FwMhGPx0aMJKBLCCD3VlcBGmBgId68PwKXfBc5LtS7hEMxBUG1JINYgLhu8AlEsd8qpGyJxZG0lZin8/dQ4AMvsMTciEK/1bi+JhlvpC1TRTj100BUnNdL+fc5kNJmNPUPO6cQIF6HcZVLMfdHHWVIv6JF5Qodju2NxyTRJSJcP+qQgADF2DYlKVYT4I/C9hI05+Qjs6AWk4SyE14fbYS8JBaW/EL0v/sBLFm5sKbsUCLxccc3aM3OQ2ZhDSaBOrFwUt3LVVTSeWrVPUjmPbvIUFVJvb29ZDAYHLammkzvv0fWWcFkDAullMXpdDy/miaIVBGBcjjWgQektjbIUdFD2mghFyirBeTrywtIRl57Kf7O/QzHPr2KCaBco55eiz29ayDPmQvJ3DfYJDlqIz0QqOyM4nUUIgrbLqCJ14SXIoqEb2c1zHbtCfSfzl54W9FqIfX0DtXV0wNJVEq24maN2DXZZt0rR2tOHouowjiROeSK85HtTEzN7TZqnxup5NmauJ6Mt26RsbmJTJd/IcvJEyRzu51pE/1MS1gwmcKCqDsshHbE7KajeZVj5T7bQw65HclMF0qpTzeLbIuiyD4vgvoPZBCxMzk+1mFHENHLfGXRztFECB+eRzJVRCSbn+D46oGNi5G0Zxekf+8ODHQ/ITkp6oCo4HY4asLu0Bfx2JvpyNi2zNVFPXOdOAk5GzSuvWrHZnUgfOLjIZVVwLY9FXZegOTm1PUpFEqOCe0+9yH/qRlI3RTj7nyzq3PnvR5wj4QCjsKd8kuo4EPHjX/uqTcKUTSgZnlMCBJXz8H8l5MwPUKH0Z58VAGqCJGn48x97n1mix3X/uqAqc8Gm11GOJ+Qo+YEwH/GsLUtR8wz4Y9VcnysFJF36FTfqsix5pcwTtDg53kCU6ysSEzB5/n/P+vss/TQ4MAAAAAASUVORK5CYII=", d$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATKSURBVHgBtVdZbFRVGP7OvXda2k7pQnEhtAwEE5AEyxKQqK1988ENNRGsYmJMfHEp0ffigyE8mJYG9FFMFPdg9JEYJS7E+kDbBxIU6NimLbh0QWaYzl2O/3/PudPTYaYt0+Gf/HP+e8/yff9//nsWgSWKlLKeiidJ20lbSROk9bp6mjRJOkB6hvRrIcQ0yiEEnCDtIZ2StyYfcN/FxhcLALN33aRdN9WlUvAv/gF/bAyishJWTRz21q0Q1dWFhuolfbtYREQxr6n4HirM6t3MDG68fxzud6cRDA7O6yx1aW28B7FHH8OK5w/Aamkxh0ySdhCJ5KIECJzn91QEzsDpw+/APfkRRLwW9pq7Ya2+A6iugaiIqT6uC0xNIZiZRjA+geCfvxHrfAFVB980iTD4XiIxUJRAvufe2bNIvfIyRDYLe8sWWHV1EFL1ymcujVKm0/AuXKCQWFjRdwwVDzxYNBLCAOc5PxeBZz/9BOmu1+AkErA3bIRgUCmpFKoT2eFLTUhGpa6SZPuXLsIbHkZ133FUPLvPJLEtygmTQA90wrk//4TUU0/AaW6Bs24dRPgzwLmjxLwwyPBBKvDwp955RMK/egU1p76Bc/+eqHkvjXUwR0CHfpjtYGQEqb2PA+NjiO3YCStsJFQEsMBnkyOiI6DoIPB9uAPnIClvan/8BYKmUct6ngpLP3RHbzM97wKjI7CrqmDNzkKQWtnZnB1qlssMRCajnjORrVS1V3WW58KOxyGuTCBz5LDJtUtFUs39VOT99V3bYQcB7NpaOGub1bxDTTe7lYuAfs7Z2pAqpGEOsB2Q4Y/8CT+dQkBOxYfOR1HgHFjvQC2voaQvX4K/vzNEkw59YqsayLZ06BWiEGIuAefFXr3LfQ1S5mxvcgq+Ows/kEgNDSL+UBu/Dpd2JtAejZHafC/kps309ViwbRuuLkuVkASpT3kQUFS5dIlkfK5JO+dAa9SYG7CHTCDMePZISpQqEYFoLNaIjJZWJpBgy6XVzGwojBCXQiIf2FTP86JmCZ6CcEtlVvnA+QMuV8woaKm3ijGOOpQD1ATPd5IJhEui4zgFO5ZD8sfiHNMyzVYyIlBO0IUkFotFZrgShps7g+dH4XYIf9aGowOM+APpi/x0/i8HX/b/R2uPpRYaISCw/KiECSwDWhUDPL0jjramXNWZaCnmjaj+2o0A27tHkXb1tiOWsv0sCq/36oA4BOjvbkZzYy7SDZbelz/kp5VVFvbtjusOZRYasnNPrQl+grFv2o45Ch1HxjExw6uVpQNQahQi7yXWNlj46tW7TAJz27E+Ih1lm6Pw3oHVsITqWLrM9WWQY51NJvjR6FhW9Ej2xW/X0XVyUp10clm71EjIaNDQkd7nGvHMztwWlEShI5kmkYBxKP318ixe//hfjE76mDuJiiUAq781dTZFcxV2bag0wTsKHkoNEvOO5aOTHvpOX8Nn/Sl4nBaLLVbkdU2lwP7dNXjrkbpwSg3whY/lBokE8i4mTORzIvHtQBq/X/XyuivPt7VUoGNTJV5qW4nGGsscMomlXkwMEpwTh0jfyK/LeBJDI9mw9Gh27lxpIdHkkOdWoaE4uQ+VfFnVl9MT8taEL7K9y7qcFiASXc8fJr0PZbqe/w9feYEOST8sDAAAAABJRU5ErkJggg==", A$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX4SURBVHgBvVd5UJRlGP+9u0uQICBeaDAsimlACAzTP0kq1tDhYDRqh+U9Gv5h6nSMM2nYmBmWR5NNp+BMmkeM1FjYNJqYx2iDouYBpiwIcYjBcux+u9/ufj3vu9+3+yGgiNgz++zzfu/1/J7jvRh6SYqihJN4nngicTKxmThcbW4hthCXEZcQFzHGWtAfRIrNxJuIm5W7o3w+Fn0lbrGquAvJskuxN95QWnftUfYfqVRKSmuVtg5nT0A2qd7rllgPys0kfofXzYKq6lqx+8AVTEkbhtgrf4KtWQ3Ho8mILn9cG4Ux0WGYNikWi6cnwjwyVD+lhXgyhcVyRwCknMd3n6a8pc2BtzcfR7PVhg2LExGxvxDGv86DzZuPspBYfFFYDtnlwb9WCc3Ut7ahHY3NdszPegQrF6TqgXDl2QSirEcAt1p+raYF2SuKseLVREyPsILt3gkWn4COaTOx7bcalF5qUsd1mgU2u4xLlc1gNHvBmgxMSBnZoyeYTjmP0xlNuXPX97iQlI7BzIkhhw/AcPECMHsOThkeIqsvo93uosEMXDdXJFCoUtSRrKhuISOs2JabgVnPPqwHkaKtEj2ATSSW8bJ0oBiO2bNgKr8Ko8MBJtnBBgSDhYRQSGTvIPrjrp+77qSwWgPjdYfmEg8qqppRd8OG0p3TkTB6sKZuMwFY7gOgur5SDKmuRkd2FlhjA0zjk2EQnZiwkqFzzJzMhMzI132u5z/eT/HFRIHL7YbpZiO2hZ6CueArGI0GbXgsD4X29Z5WK32cB3a9GoaAABjIesFOr2QaO7mUyDMSJKdbZQ8k2QM7SQdJ/u0gdrmA9sBQbJHj8e7Wkzr4Xm+b1NjPFdbLMtytVhipbCBTDBPShWM1D3gtZGq8qc7DIFV4RLvf7fCX1XBYGiScs4dgYN0lvDMvFeEDA3nrHNKdS7micOX5vMba0ARTgAHGcXEwGI0w1tSD1deB/bwfSuwoYMpTKD5ei9rGDjG/y6Pg010X0TMpAkR1fRtk2S1yYtXCVKxelKZ1mGeCd28XVHSyARGBDJlkkcHjwenym/i7xokZo+Jg2rgBytE/MD77NRwubcXeg1X+zAfzr0UqxkWF0rhWUddukylZteRgOHSqVg9gIs8BvvFQdjuxcO0x2kQkX8LVNtqRs+4Eck48iMa8z6E4ZUS9uQh5o+vxybI0RIQFQnK4KdYukQcOsjJthAn5rT8gJdJEG5MT1g4Z/tRlOHaugca4NADJHICZl85WNIkOPMZatvNyh+TCjl+vYcra8/gpMweeJUvB8tbjhYNfYt/ycd4EdHgT0U6yvFnBmrYEHKuUYJPcPq+IPxWHpa5dA2DmAMI1D0BVeivx9X7ZYsXMlSXIuRyJyo35YDYbhi9+RWS8nVvPVwHJiuvt2N4wSFjv1846lS3/tGpTh/MkFMHbQQfN3NUl6rZmUGW3Z1UfSFFzxEPSg+LPnsGTj0WJFu4BsSXGRYV1cdX9oojQQK3YwgFYeGlMdCj+L0qK823JYic8K1CFBSFx1CDcb0qLHwqTybcdl/HSYe3rufQYaHt6f1NmjDeuLz89Wl9dwgEUQc2DJTPiEfSAEf1NKxJkbK0uQGyECVlPxOqbigzqubydf40cOgBzpo6B1wX6Y/VeSEF+dTAyhuUgK3Ms3ZBCtIYCrrvLccz3g6SXClHXJPXTUvQuwZgRwTjy9VRhpEr+41i9Im3h5fCBD2DnB5Opzn+m36vyoEAD9n6UoVe+RbuWGXS9c6EuyQnJkfhmVbp2x0HfQHjHDAgyCYNSxg7RGiyqLkG3vZQeOV2HBe8fhaW+Q9erNyHxKo+JDMae9RlIHedf9+jpUqoD0elaXkUHx4f5Z/HtjxVqTtyZwkMCsCh7LN6anSRCqlN++2u5DoQZXR4m7fjul6soPFSJ81e7f/alJw/HpLQRWPpivF6xprx3DxMdCH5K5hK/cWubk07AM3RZsdFR7XJ7EB0ZAjNxUGC3ewhP7tw+P1bVx2mBcnfEH7Kbe/M47fUiV/zP80nE49FPz/P/ADDLThb4o3BNAAAAAElFTkSuQmCC", u$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWISURBVHgBrVddbFRFFP7uz/62ZZfdVqVQXFCj0QglBiUqIMG/+JPAg6IkaKKJ+qJiCM/YmBifdEmMbwoqJkYTNDwYE0yAmCAhEgoCxlrs0hZKS+ku2+5u9/6NZ2bndu8ud7sFepJz79w7P993zpw5M6NgjsIYi9NrE+l60m7SFGlcVudIM6S9pEdIf1YUJYf5EAJOkX5GmmU3Jnt432bjK7MAc+t2kW6vr8uXHPRfnsbAFQMLIipaQhpWLI2gNaz6DZUm7WnkEaWR1fQ6hIqbhYxeM7DnSBYHz0zh7MVyzQBMlpe1B7HxgRa8vTGJrmTQO2SGdAORyDQlQOB8fn9ywfNFGx8fGMP3x3JoJUs7EwF0tOmIhlQEtYrFps2QLVi4Rp65lDUwPmnhlTUx7Hiuw0uEg28mEr0NCdRbfqy/iHe+GiYA4P7FEcSimrCWBvHhztxBUDRs9I2UqR3DJ1vuIK+0NfSE4gHnc37SBf+BLP7guxGk2kNYfntINGWkAlwROJyJwBV8eIExdyzR+vxoGQNjZaS3dWILecRDYpUbE96o2VW1fArv77uMJYkQOpMhlC0F07YCg7RsQXzzsmFBeMf9V7ZV+ab29F5CfRclgtj+7QiO9hVdnJTEqnpAun6Al4cnTGxOX8CVvIMVd0alxapoyssM1a7eAPSWhCdIGRzYjoNTF0qIhYE/PrxbrBopy/hUqB7rhez+dZxIONB1jSyBsKRiFS9XrDWsiifc73o1uFdsCC9ZjoKWsIYJckDP/lF4RCxvRc59ln8MkfWP9fwH01HRGtFpCoKVWZLzPkva8PiF+4JJh/C3g8GrBorTNgKqjRMf3YWOBTqv5DGwjJc2uZ0HR6fw0kNB8rgGXdOQaA0It89EfXP8mmlgIij5EqV4oWBhjo0zF/LY8GCCtxCpnRNY7/a5J2li59MRqKoqVCMSXK8b25mGYxWh6i2wrUkY+XOIJh+XsVIrDsWAbWvybZMxprd6Pe/RXSHMYFmWsNYl4P6vGdAuwDYmoOhR9BsaBg0g2r4WZvkikSpcBy6WpPQiV06Cq5RujpLiJdM0axpWXV9LwioOQw8tgl2eQt/ZIRwctGCVDQTCXTAK/3pmgPmO55KQklLlXNR08BMm59QyJ0R89eZKOK/piORzOD14QtTp4SUz7fzEh0Bcb8TY7VAv4dgqTJbyGB/eibVLLeTMIPrHIujKLaSgXewL6ucNVziBnGCi69d19LVCDeHiyEFKMc8jNxqgRKMhSTl/ZLyI9lgrGlnu9YobXxybo2ZIu3m0NwKtl6WxGO5b/kLNP7OQwVzFY2yGl05xAhycV/DIbSaBaAqF8UMi8BgzxfLTQx3urjSrcEM9HujlBA6Tvs6/zo3p+PH4ZKWByH6KzPj1cptQxzGgKgEPcNkXVLifMqJD+uLKFjzZPlN1xE3FfCOK86PW6p4hTJbdzOe379+ouNs05QTy7vFdXehKzEzBQlXuy1/zL75TbXu0bWZfn1ehIbeuafOC7+XY7mSk3b/vPRXH4oWaZC573gqq3A+6Ehq2PxP3VvbwhyAgj0i7eZl74cs3OhDS5QC3Ai6FnyLSW9u91u92j2UNj2QHThbw7r4J2prhCbK5xkP1fKhSjvj01QReXj2TIzLwHMlmPZSeGizjrb1XMZS1Ud2OlTkAVx6dMQ1fvJbEw8tDXvANvodSD4maY/mlnI3Pf7uGb44WaBmh+Vonq1tCCrY+0oodzy7wHsEyaHYs95BIoe5iMjRh4ZfTJew/UcBfw2Zd94rlq1NBrLs3jDfXtSEerTkbZNDgYjKLISxOmva79Jm2w/4cmGa/95XY4b9L7J8Rg02bTqM7YlrG182JvJzuZTcmWQmcajb+nNMcq17PnyBdiXm6nv8Ptukpnzqoxe8AAAAASUVORK5CYII=", b$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVSSURBVHgBrVddbFRFFP7m7t3+d1kKtkjRbhViNdTWaiXlpdZqDPAgDcYYgkZiYkx4QI2+QCL1RQ3RWKIkBh9AXjQxIEZQjG1ISeABRUtSYgiVbgpr29iW3f5t9+fe8czcO91he7cttKc5ndk7M+f7zs+dO8OwSOGcB6nZTtpMWk8aIg26w1HSMGkPaTfpKcZYFMshBBwi/Zz0Nr87OSrWLmSfzQMsvDtA+nb2mBWPIjUWhhUdgJEfAMsrQt6ajTCo9ZAO0g9zRYTl8pqac3DCLCU9OYLJy8cx09eF9Eifs1St5s4/c2UI+eufRemTu2CuqNRNhklbiER4QQIELvL7gwK3Z8YRO3cQ072nYBQGYJaugVG8WnptGKY0we0U7HgMfCaG1MQQrOlRFNXuQGDzHp2IAG8jEj05CWR7nhi4hNEf98KgWf7yGvgKSqW3LEfiuNvayTiSbpSCWz5GQdWmnJFgGrjI+V8KfKr3JGI/74NZVgV/WYgmij8OZrC5zDGbBdmSLdmKOkmNDRCJj1Bc26aTeELVhKHZOKDAZ26cR+wXAg+ug3/FWjA7CcNOwOBJMCsh+2xWk7I1LGq5O0/OTyKP1voDFYid3Y/ErT8UTsjFyjjihr5f9NOxCEa/ew18agj5a+so/ExOEmFXoZ8bA+5G0XnMbYoAY7K1bQuJwV6gaDXKd/8EoyCgFlWLVBia91ImLx4Gn4jAZxY4XlnKS9HXNaFpkt7NRGYOT2XWcQu+/GLK6TDGL3yhkXZeb+bm/rb0fjyCkSOtsuh8+SVO+Bl38q97n2v34EzFQkaDu1FJRSOwklOwfYUof6tbRUHUQLV4j7bPev/vNaDmJafQfCZ48UoCVsjMKTIDmXKfT2Q+HBZsOgaWpihRSiYjVxF4uEnMkFu7INCs1swEHwOeIvX5qDwN2KSM+tl4LDUF1ncaGLrsgFS1glc/RwEwszhwRy2LwG1Kk4UZshnITGkWK8TGQ+O2VNM0pddKhQGmv/jpOIyu94DxficSYug/KrK+M+Atn9CGUTyHgG4vnU5LHMOQ5Vcv/oekXRoQD/XJuqFZ78lzPnYNnELKqdBkm04AI1fBrp++Y41uS1dBwJWQ4eZCPvQCz/YGN36TFQ8BKqs/6fZJB3/PzPMQZTuVSqlHQdPLS32yhxVia7mLdIZwSHiAekVDiYiA3BJV7hcSXtmUe+yhFzyfZ9t18y8kKnphRWAxwmt2gK96dO5AeT0R2IrFiN/vV92wQL1CWi9YChJageRYXQJ769dg/5wF6/+VXtk88PsbwTe8mPszmQWuRaRH7ISvU+eo+PXn0AV03jwhNyI5aWF7ixPu7ozk3Jaqnagtb1Qju9VWLD5EwclkFDs7G5HgtI+rNC0HCQlOLenx1ouoKFqnRlYa7nf5G/GrJC+I5x98WZFeHuEZW9tCr+rgxwT2nM/xZGocb3a3YjQ57KR0qRFwCVQUVOKzphO4r3CtGsl8jt0j0iHRL/EHsK/hML2fxuz3ZKngfubH/oavdPBD6limn4ja4b6SG8uexruPf0rfajZ71LpX8DwjH+/XdeCRYJ0aCbtYUuY9lPaOXcLBK+9gOH4z84YtlBKubNHWUFiJDxqOYMOKWh28xfNQqpG441g+HL+Fb/u+RGfke6R5KjOReQMLKTJLse2BXXhl/R4UmwEdfP5juUYihKyLiSDSFTmJ84Nn0D/xtyd+bdkm1K/ajLbqN3RgT8/nJeCSEPtDO+ne7LE0XUSuj/ciYcVh8bQMdUXhOplvDxHF3X7Pl1X3cnqM352Ii2zHki6nHkTU9fwZUlHSISzD9fx/WRveEg87CjEAAAAASUVORK5CYII=", h$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAStSURBVHgBvVc9bBxFFP527y6+Hzs49pGzgw2nQLqQWKJxoDAWCjQUsVCgQRABEqJAMnGFhAihocCSHSkFokloKAgQI6pgJGMagwjIARlREFiCiQE72Bef79b7y3uzO7tzsS8+hwtPeruzszPv++a9+XmjoUHxfb+dXkdIB0j7SIuk7eHvFVKDdJZ0mnRC07QVNEMIuEg6Rrrsb0/OcF/cqvCIQ+AN4rquX62afrm85lcqVVHmujoyFnpvU9HqgBfpNYXAzUIcxwEBwjRNUd5MkskEWlpa0NbWRuWk+ssgHaSwGFsSIHCO73kJXravY37RQJufh67rwrCuJ6BRT13Xwj6A53n09mDbDlzXQ0n7G5278ujK9qgkhojErIqnY+PII/Aflr7B8xcewY//fId0Oo1MJo1UKkUkdCQSTEIXKoklkynRJpvNYH71V4xMH8VXVz+X5oXtG+eFroBznCK3T/72EUa+fAKZHRnsbu2OABkseGuKcp2m/NPRkc0jqSfx2swxXDA+UElMqXNC9cAJCT63dBFvf/sKCrke7M7tATk3AguAtGj0gaokgrKv+Si09uDOXDfZOo5LizMqiRM1BEK3DHP5r8o83rr4MrFPoTNTgO1b1MqrAYvfm2nwDxrNB99EPsveS+Lk1y+K+RTKsAyFroxeyPs/nRYkOJ421mF5Jo3fvwEEG5RFbcMeYPIeHGRTOazay3jn+zcVhwcD1sN4HOOPPwn4syvnBC12pUMGbFgE7wWjCkGCxVOrEli2YdK2vy5suESCm01e+RBLlQVJ4FnGZg8ckTXT859SUwvkRaz7FZhuFba3DpeWV2BYBOymKj3CpC3PgkUEHBoG2/Q0F+d/OSPhxNbOBAZkzdT8J9GgeOKVnOXQjS6CudK4egjmQMm6FnmAdWZhUg3DABPgjQeO5+Dy9bk4pqSmW0bZKYkNZrvCfcp2CRV3VdiSdn9f+xml9WuyWR8TKHLpcmlOCWm8QZpuRbiS4rUttV0LpleNGQkGQfGPsiFri3oYC6zREpH4qOUAdui2PRAB19ri8tWKIT/bo42IQ1AzsYE6R9WtiySSTbZGdUxAJA7dud7bgxqhx+9caqesXWECRkDgHvxfsq99vywaTOASl3jrPZg/hNste3JFCkGb/JxlAl/IrwOd/VCmT3MlNNtfOKzWTjOBCYTzYGjvC8gld8YcmsyFN6ihvc+pVRN6mL2+x1+tNDkeLz4TNW4OamzrsbufQiHOkM4ytlyG47L2yXtfQiHTg2ZLIXMXnt43rFad5IcgECaLp7jMXnj9gXfRoqcD5v/FE+Ho6ZzE8QOj6uhPyQRVzYjeQLgk77tjP17tO40dWjpMOEXSgsbFjw4lBh+5fxR9+YfkTyPEQg2BcC4Mhg1wqOtRjD34MbmuF9INW5OQZ0HQNp/uxmj/ORzuPaqCD6q3pi3T8kVzAWvVMjoSXZIoYtJqv6i/aFPylrAr1xGsqhh8Q1re8MWE837O+W3bFuXa7gF6IhGk63w50WpPMwN1LiZ1JbyajW921yICPpERalm27ziuqKsj4ze7mjVCpEh61t+eLIfAxa3sN3z0+fH1/GHSg2jS9fxfhHELiN4+ExoAAAAASUVORK5CYII=", M$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYPSURBVHgBtVdpbFRVFP7umzelZdraVrQ0bNNYUKhLwYSAilR/EH+oAWPFKKalgmCwDUbBH5K4YICobAExxBgQJQSrgQQL+kP2UBHFiizFQqmlpViWTmc6y5t5713PvfPezCt0WOtJzrv33e1892z3XoYbJM55DhWTiScSlxB7iXOsbh9xM3E98R7irYwxH/qCSLCXeDlxJ785Wifm4lZJ7NgSfBUZhsFD/57ngZoaHu7YzWO+Om7q3amALLe01yuxFMK9VOxCXM2S2jt8+Gb73xh7XyZGtTeAz58HjBgBNv8UVHdEjlHSC6HmTkJGQQXVBzuXbCZ+gszSfF0AJFzYd4st3BfQsGDVfpzrCGBRZTEG7twG5ZeDYJWVOJ5fjJEZy6CyMKB3wtS7YGrnYcYuwn3XVGQMnusEIoRPIRD1KQFcufPTLZ2Y8tYPmDl5JMqHBKFs3AgMH45I2cvYsLcDB49dwJfTt8DtMuLz5RrERgh6qFEun1H4Mdy5E1JqgjmECzv9YQuPfL0BJ4vHoX+aCwX7fgI7RLt+pQJH8u7FqpoGBIIxmsywafZmuFVTipfCORNryboRboIePoP+9yxD2t1lThCj7ShxAlhOxVxRP36kHkveWI3XFs/D6KH9wSJhME8mWKYHFzo1msUSEwdE34FbmABMChUfk1vaIFx6+DQMMotn1LdQs8fZ4lYQgDcTACzVnxH1WKgNNZsXoMsfQLv/MVTt3QGPoUERg7PoGzCTqEVl9UCoaTHYNogLJg0grgnTMKB3H4Gp5CGrZBeYmm3PLhSmUKyf9+zWhV/8homF+1E2thHHLuXBH2VQtAiYKwp1VhqUB2iQRlqgNoSp3dTAuMWIlwqLEeAIsajrUNweGncBkZYlcJDUNrNs3yl+zHAYM2Z+ihHFRxGl5lOXnsRaXgeXtWemEqcr4EGHFmY0QlW1xKpi58IMCYcUZtDOUmSEYPB+8Iw5BEWVacEntUAAKqiyTrR0NzUh6MlGbcmz0NQMvPDrZmTTRGyvBRtM4TTpKeyoa0NbRyiufhJQeX810kg7SWK2T1lOSc6otcIwdJgExpVfhfSh8+zB02lPMrdLqm0Iyd2UBX+HK52hoT2IE+0aphYVgS/8kLL8bjxY9ir2tnWjZmeLXH36YnJAUvOVlNCQQeELA1wohtjoElGeADBR+IBIPGRODdPeP4BzFyNQp3mgzslCp1/DnE8OoXJfP5xftlbuuKCqHIsKmrC0egwG5KYTBlJ/D44m60YXlQERNOQLcUbkqMwTFpUIDXhF7fCJi3HkNJr/GIaZSdhKGYIRHd/9/A/1X8K7lbNR9sh4mB8txDOPTsDYqtnkRHpcWA/iEgjjRlIdInSZ9BCYkdNweYQ3wys0ID2iOxyTIwUAtNPExlhiuZhu4mSLH+Uf1GHWX/k4+/kmsGgU+eXPQzFoHEVCkiPCm0U67GkSlmSutdjNOcIJhcNCv1wL/czrcBEkhXTFFEtlfUAiMQkHNKliUJlWtAGuO0pln9CATIniJEtARYpj8haJIbmeLBWP3eUTAJplR79h+L/JBqHE7S9IZsI/ZaeLspVHBARHXxN3lCxjOJk33e6qFwB223+u7NLEaI6+gcKtj72WkvO0s3uPnYrFQZTDdR9ix8aTY4SkA9pee1sArGwYd0QOd/EBsLTEJSVXsc7lr8Qfoxyt5L3Y51awtaDc+ZJT+Hoh+6rjGIYfsYZJUPR2GYpSC7g14o57AXcPgquohgAMsruTx7F1RVopm13ZUL2f0UTXbTkCd1Q47UQZtsopfKV9LUt5JTMvfw+z9W3yBzPuBzepiYTtaQVlyFIouc/ZXc3o7UpmgfDCcSnldCrylmrKxa0JZ7yeU3LuAKAW0M7XUHiPcQrv/VLqANHjWo5oK8yONeCXN9pnSmImSyEYShZAzqzkV0uTOoRf+1ruAOHFFQ8TCcS3lZLnNjpSG9AreR4GMh8Hu7NCRpSDmpHiYZKSrKfZil4fW2aUm8HDnAf2cdO/h5vhk/ReC6d6mq241tPsRoCIx+l6fnPUaQn2Xm/9G3ZsnnyelxI/hD56nv8HpWmToQlehCgAAAAASUVORK5CYII=", f$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARFSURBVHgBpVZrbFRFFP7m3t1ttw9YilKl28Ia8FmeTSEtBvCP2mpSo4k1JiRowKrBWDX6S+PWF0o0GiIxRLAIaVAbWjQBq/7owyddw2JsY43a3WC7VRG3r+129+691zNz7yxLui0lnJuzZ+7M3O87c+acmQXmENM0PaQvknaShswLErX7GkmX43KFf2QDzFeaZyNiWcCfJOMn9SQ0HV2BIRzt+A2B/r8RT+hizlUeN1aULkTdVh/q71gpPx0lbWKMvTMrAQ+HDY4TX4fx/L5TSGgGlhS5sWhBLgrynGLe5JSGWFxDaHiMvgFe27UR99+eJvITSdMMAttzwd60vxfvtfZjQ3kxnA6VZjF7zsWemfRMEVHfH+fRcO/NeOGRSjn8lFwJkzEnE+RhiZzuw/HuMEq9RVAImD+CQLQ5aNojofwxyEZGoqit8qK0co0M1zoiCUuCZjLbk+1tmG7YAect5VDz86HYHlyIo5nxxqEZ/xYGketjY0j9OoDcwy1w3lnDJ3QRwW3M9j4kYluxFuzPs3CWr7LAC/JhVG0CU1WwoSEofT/joj2zrWFrisZ133Uo6OwBy8vjQ4s4zj28pR1rBQicoKBE/4Nx191INh9BquExmCtWIvH6HiT2H4C5cAFYfEqoEo+TjZOl9uio5VRoEKmeLulDI++r4y3985MEDqgUAZ2WqD36OEy3G2qgF+rxNsvTkhIk3qK9S6VAu0saAxNKhOf/FXvGMVLtbZJgi4N+1orlDg6SB0yEw9iwEepXX4C5XFBbWqAETkHtJq90qw5S5IDj44+sGJkG2PQ0mKaJFfB90YOnJcFyTuARBMPDIlnM1athVFQi5809BHKUlmSlac7Oh2EupRW8uhv69TfCEYtZmWQYwspkEBk9Np4mUJCR10JjUzCLipDY/Qa0HTstrykkpseD+LF26NWbLFAeJj6WWRwSI5lMv3OCsGgUFlqDf42ATVgeMNo45OTAKC4GO3cOcFiVrPb+gGwiE1j1+WTXaJqAra+wsnx8HK691nHCMyJ+8kvEvw9A2/UE1NZPRLqqHR2YU8qWydYZTtAtWGtq0uOODw7C9UoTEgc/hGF7k3z6WaBkKXIfrAebnJgTX62plc1PeaHxTY5iYgLJzdVQI5F0BZteL/SqapgUPmVgAOp3384KylcvCq60DM4fg7LbJ4+KTjJbDaoFY/u2LEfEpUVWs7J3H5T6B3jXIToqHppx2P3z0y/4JjhC6Mq8CcSRR9m0ed21uHrNTbwrfdjxOgBv0AR+hr+9hCb0Babx8vtn7KS+FI11qj6zbRXus8C58IsnDMy8cPxk+KWDIyd+x0sHggiPxOaEv2ZxLt59rhp1W8oywf3yJduV2WiTiAo/TESf9ZxFODKJ/sEoHKpCoG6sv2Exam/1EvAyeApdMiwzrszsi7Yu/UPm/KXTvIJ/F402QDQDMGT3+e00n1X+B2fQVctLrP4LAAAAAElFTkSuQmCC", g$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOtSURBVHgBpVZLbIxRFP7u/5jp1KhqmxHRBSuixJsNwU5igYUQ6hVWIjESrwgxQiQlQYKdYCkeERsVC62EBBtdkAiJItWmi3amOu08//865869f6ePaSpOcub+c/97z3fOd8499wcmESllLel50jbSTjkiST0XJ52LfxXepA1MVe5VAhITGD9KQ4K01vd9pNNp5HI55PN5eJ6n1riuC8dxEIlEEI1GzdYU6QUhxI2KAEyHNo5MJoO+vj5YlqWM8cjKwsC0FoVCQf2vqakpB0oQyIVxANpzhZ45fxaFBw/grFgBi7y1RhbpLRJS/RLY8DCKX74gtG8/qk6cMiuPmUiE4ZyGj0xL9moLCnfvwF20WBkWSkt+iJJtZXgUCGmhowPOwUOInD5j6FpGID8MwD0a9g8NDSGZTKKqqgq2bZNBEdAihBibq1F0FYtFlav6+nqVG5J22rNRaO87eaanp0dtCofDsPv7EX72FO7rdlhDacjqafBWr0F+VzP8WGwUEIOwMgA7EqP32rGZDv1s5adh4pIXq4T29mLa0SOwB//AW7IMmT174c9fQIGnYPV0Aw0NgBVkRhll5ahNJDqKOANsMVVjKiV6YC/sDCVv/UZkLl0e4YU8C7wnZ8QAUT2jNnht9rMtDbCe3VhquOSX7ps3sDq/Q1CJ5g4fwWQSevQQ1revcN6/gyCjJmcchZa5DKBc4EOkav7zJ1Uz3sImeLNnK9rGKTnjtL+C86IV0c2b4Hx4D1RXB1SZAjAAAY9qdJ3SBFVURaG1fkMMkmiQVBCUQIzNR0Ab6Q9+MGXpLVGMwf71E4JKtpJ4TU0orl2HdOtLFLZugxgcDAyzLS2pAICrh6W4chW8pctBzQeRxLmJA8hm1Jhvpuqa0wiPKkxOnx68N7ZIOhjgNT+FQqESd5SH4WvX4Tc2wm19jujO7bCJY9HfB9HVBffJYzq2pR4kifeJhM+Rlmd80DjJ3N/VKVa8EYjd/Rvh2zfhvH2rat+n2i9s34Hc7mbI2KxxRs2BY6mrqzPT80yraKNhA7fkQeKSAcYmazIx1cUA3FV1BPdp/4Fxzc6/mIC8dTNodFMCQKnh4fgp2CdO8lPQ7Mq9iJvrybvaIr1YnfS1ygpq3vNa70pL+Q0XN3bHXjgJGvjSUf0km82qsCtRxbRwSXL35SLRwrdaAhXDLUWSNK4QiKS8yIGBAZlKpQLlOcoZHWq//EMgjilxWrr078upS5v8j6+LuDaQLDPYqecSuswryl9+0Z4k0qJaQQAAAABJRU5ErkJggg==", z$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPtSURBVHgBpVbfb1RFFP5m5u5Cu4qbEGNNUbqCCSuYQFBToyklRAOJiaCoiTFE4h9gI1AiGHaLmlgxtjzKS2tMKIQQ7IMh6YMV4wsJBgwJ6EMtASXxR+jaZvfe7t474zlz72zX4pIlTHM6Z3593znfzJ1Z4A7FGJMlK5BNkk2bhTKT9PWRdeFuCy9KAFotIy0T0cR3kwhNLYzM6PhV83r/WXPu/C/mz+IhM7Nyhflnc4+Z2/WWCcaOm0VZ9S3Gk4vAC1QNk2Xnp6bw4+VpDH55EX/cCtDW1oa2teuwdOs2eJ0rIObmUP1sELMb16N66iQvz5INJRi3E3DkVBXZ9w8XUDn6ObLLMsjnlmN5th0pT0GGIWSlAk8A3n0ZpJ5YCy+XQzBQRHBk0EEVGzORTnMHzhPDseNI5x6DEBLlICLTMBBQUQTl+5B+YGs2Twik83nUjn0B/+MPHW7B7YnLgNPKVk+eQJUIvI6HIWs1O1CZ16gQiTYCIqxB+BUicObbjLj2OjoQHh1C7ew3Tq4RS5Awvc2N6qefQFGtKCpLQBkweExAzUQiYc23tSNRqZRdGxw8AFMuM1wvH3POYDu3aifGgBvXaRKBz9yCqFZJFlhwlskwA5NS5CIxBhdWMvJLJSuH+O0GapPfOqn6PPr3MnvzFLXe/Q60VAiXpCE2PkVRG5T9kFYBUWSg1+QR7ngVi4uhPx3MQxOZ1hrV2Vmk46FNTLCevUuru1F6aAOkotMiOQ+B33/6m6IPGR+Xp0ood64CelbdBh9RdiQHdKTJj2i+wUvxYJfgL8TuyqYRe1pYdxuyNdoPSZJJUYejRBGvsKcvAY+JYkfjwQdSuDmxy87x3EJPLYAu1LAAbC0VXkanrXE6E1zjVM4c6bWyKCVtmILs5l8B3jj4g5147P1n6KNb1hTbCmEz0liaVq67VCd4+uIEzIUL9oiyDLr7WWS6t9UBcp0ZbPj1PNTExP8TIJYqYql6eoF1b3L3JSY4R9abog9FnzltzzJnyluFBgKrwJUr8E6fakIQGxe15QXXPc47Omw7N2+BWdmFFtVuSiIeeRRq52uu62tJWpfI+Q6ZDLzDH/0nkrsFZ1MfHHJdo4R9zd1Fu8lKkq5i+d6eeLIxLRO5eWLvfsjtO9jloAfYsceUmQiQO4bk/gPQyoOh96BVYFvv2Qe1r98NDTBmnSAhGebLidyC3NsP9fNV+0XWYUwT4NWPQxSKEC9ubQQfdg2vMSIa4MeC0yuoNfnsk+R8NdCD8e+vI3t/Gqa9HZpeM9BdBbqrxCs7IZ57ntpL6rI0gjdPPX70R03rZdLcw6+LvgRgpgFwOukrJrI2Lf8CjLd5qfZvAI4AAAAASUVORK5CYII=", C$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANoSURBVHgBpVbbS5RBFP/NfN96w1wfgoJK1Ey0MISlhzDErF58CINuSEEWFQWV0vVN/QvqPchr0UuEEUIJagjVY9BNg1wfSkGIXS/rrnv7Omf2m725yqoHDt/MmZnf78zvzM4ssI5ZllVM3kE+Su62EuaxY23kpdio8SIbIFvrXotIZAC/Q59O8mLL58PK8HsEwiH4DtchEomoOQ6HA6ZpIj8/H4WFhXqpl7xLCPEkGc9MA++wwRFyT2G55TwkLKD1CnJzcyGlVPOi0SjPxcLCgvKioiImKqahxxR3EknXKoKkzOEfH0do6C0cZWWQlK3YVkQzE7kwERMYhqHImIR353Q6ebiTxub1TqTWXIMHFhcRpqxzaLJRvhdyeRkyHAYtUMDpziS8Ox/J6fV6dQ4duiZSB1jzIMkSpIzMoSEC9sFYWYHh9ysCBmOSZNcx/nJdlpaW4Kf5jEXerSSymS5xJzg3B6OvF0ZFBeTzfkg6AoJKIKjI6kQQGEuj21oulol3wu7xeHS9GviYs7DNqqiTk8CNazD+/IV0uSBv3Ybo74OYnYXhdsP8/BGpxy3lcFANwoBvGZFoBIGagyjYf4CH2gSfd2o0BK5fRfT1K5iUmUkZiKpqCCft9NcEpxsDFOkEVrwZJf2jgQDCRCaampDXM8BDY7yDWjVp6jcMQlBFIe3Fj++ggw5bj1VZKzLuW1EIApahkOpSVRD5+k3PKjXtggCkP+MInSgtUE66xgZEAlnVwYp9SX/ouuhcZmZSCGKDhpEATzb715uNiSTXxopMq8GC/NXgmzDGMKqrddcbJ5CuQykSb8lKSnTrC0v0gbzBOHMWkZcvMs4fOZKDkTrHepCxeluq5mg5fhI1sfAgH1MusoeLFTpaDznxU+mWLNfAqRwMNK9PoGu+I28X+ho/6WiZpF8kXyBj4HulowuWzgabMFp0sfKu7vUQ9rS+i1rBBWk8Bnn/YRw8axI7+wv72nFi92mOqLeBG4qAmeKBew8gNkJig58rv0nZt+tol40Zv01h398Jkme9sPaUxIuXCRhK8xJ0up7ictWjZPD4q5bpyWyDfX2r/ptBDM+/w2DZNOaD/9QtasocVDprUb+zCa7t9cgzC+KypD+ZmXcde/R7rOxt1NrCv4s2G8CTBOi2Y532MV/T/gM+BPoylbQ5qQAAAABJRU5ErkJggg==", O$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQmSURBVHgBpVZrTFxFFP7u3Qts90HXSkN30+IiSIvaWPSX8sPHD2jQaGNiDRWqptYfjVEg/aFV08WYxpoYjTGGxEexPhofMT6itW0M9UcfMamCRIU2uNiWBQ2wj3bvPrh7r2fmzixbdtdgPJtz53Xm+2bOnDmzwL+IZVk+0r2kQ6Rha1Gioq+HNIj/KmySAFiuHChHpJQAf4qKEKkvuZDAiamjOD1zDOPzvyCWmeM2a731qHWtRWugHe3BrXJqjLRfUZTXyhIwdwhwnIgcwZvDIVQ4KuBz1qC60gen5uZ2aSOJFGnk8nnefri5D23BByRMiEj6iwjEyjn7W6P7cPjPQ2he1QKNCLgZt7QKVsPmABlDRzg+jnvqu7D9+j452it3okifU/Ezc8u3Ex/hnbH9aPTdYOMqwkqR5tYij7VIND4/go5gJx7f+Jx0VwuRTKrCdC/3eTKJP2bPosZVi4yVQpaUlRlTqg635oWrwmO3aSwtbFa71+CTcwPctQyL9ACrqGL1j7BGIpGA6lChqioHS0twUTZV34TNgW2YSZ+3wcUYYMJT5YPiUPDGyPPQjUsM7g4W5mwHW1hL13XmKgJXkDCiAlTnwOlcig55Fbrq+/Bd5BAy1GaaFTtL5GJ4rOFZ7Gp6AbOZaZye/l6eRQ8juI9HRjrNV64QQXxhzl5djoHbJFvX7cJsegZjl37Kk8qxNv+DqHNfB0/lSpoPnJw+Iglu1+izidVyuZxNQKdqWFkksvOocjj5wXorfNhQfTN+j5+hENVxRWjT74PJV2CZJo5Nf8rnjMWG5XBQEwcCkwwcDgcnYGJYCzCMBaiKAw3eG7n7vJqPr5iHDZmZVFqWyUneC7/Mu9mH3RFJoGKpLLnbppUjV9gT/CuugdexksgNGKbBx6yCu6GIrwkj38cIJlmlcPVLSSJ62Dam3dxftxMlpWDOGnedrMbyBJqmoZxcNhL4Nf4jr3cEtmPLuh1lba921sLvyhMMM4IfWM3pdHI/c7GKJ7498SKSdnyjO7gbTzTtQ6N3Y37crVWjPdCJ1poO3ObfLLu/VNhloArL74hGo/js4gA+nxookWdBkXQLdje/iqsqV+f7TDqPrJlFlboCX188iMOR93HwrlNyuF4lv7O8cZz53+Px2BFSRsYSZ7BnpJPC8WNc0M/xvhTdh9HYKfSP7sDgxEt4dP3T0nyQ5aKiZPfN5Id4/bdnFpPcckQkvK7GXnQ39bKeK5Mdq1DBc/jdwYfQTYaWyJTLBd/W8KQEZ9IvMIsenBDszIrjka/w7tn9+Dt1wR5UioGZBFzXYueGPbi1tq0QPCQbpZ7MHkHCb/hQ5Auc/OsoppJhxLNzdBdUVKhVWO9rwZ3+e7GpphWV1EaZJ7P0ru1Hf9BavgxZ/+PfRY8AiBYAhkVfSIR5WfkHxt+Qo3yLoYQAAAAASUVORK5CYII=", m$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQHSURBVHgBpVbdbxRVFP/dmd2ZHemWXVpppS2pqYpGasUERQVFTTTRQI3xwYgkNjG8WuOriVv/AhN8UB9s42c08kD8IGmClaCgJASQ+EWA3YbSUqC77TLLzM7szHDunTvbXXYLJZz0zL17P36/c88599wCN5AgCFKk75NOkGaDRSnIsWHSXtyq8E0SYLkyuhQRawL+NjUZ0pTp+DiQtXD0vINTcy4WLE+s6VoZR2dSxRM9Op6/945o6zzpCGPswyUJuDskOA5N2tj9ZxGJGEPaUJHUFSTiCi0C7IpPGmC6WOGb8OYjSTzXZ0QwGSIZaSCQlgv2T44UMX7GxgOrNcQUBYwp4Zr6swq1XR+5vIuX7ktg54ZkNPlOdBIW+ZyaY9wtnx838cN/FvradJpl9MdCAhYZIob5npCE2iDwceqSg+3rEuI00l0baG8uJhm5a1Ljpy18+ddV9K3S4AQKDMXCxtQRdOozAnSmvAZ/XxlAvtK2SOCH52pviePrkxbuv1PDph49RUOjpM8waX2WL9q55zIuXmVkvYbH04fwSuf3MFSran3kz58vDWLf5W0IOegE8InIx5k5B90twMfb04irwq1p/n2Z98ZP27hYIhBFRf+Kg3j9rk/pBAUCtcGCUCH1xfZvsSW1Dw4lVZmwHY/BdJnYO2UGODbjRLEY5gSDvHf4nEMLFLTGTQy2f0bA5RDUb67b2r+BrsyjTOA2adEJY8X112yV4GlO8DDvXSiRKUTQ33oCHfo5MK9A1lo1atf1DZbHUyt/guUGBE6n8BFGnwj+z3sRQS8PMg8IJhd8mo+h18hJX1OO+ya1itgkspJFkQgD2xE/C6sS/WLVrON3pJZAiELzHpNW1AmZFvgyR+tnNGZfPySIWA0Gd1GOd9rotvLJ83Z3kwLSXP4x19ficmjRpg0lGp2vEtzTpoqRowuPoeimbgpu+QZ+K2xtOteVVKPucU5wgPce7dJETpe8FuyefBc3kz2zr2HW6Vwc4Jc6/GDz2ng0updfNG5uoUTZsOtHE/lymG6b0r9jV/dHlFEX6oBL3gp8NTOEvbOv1jPKktFhBBgbrNaku6NaNEHN1sNTLj44aIv7wIOtKw62pCfQmzgLXbUxZa/F/rkXYHrJ684jaxLd5vc2J/BkjzjBGAV7qKHYjZ6w8d2/FVnglhltaf2OB+N4o1/nI9ViJ8LNO9SIGj40kMCO9VpYzKKCtjTyIjjtkeBcRiRmw4OTQVhZsT/n4ouTLhU/ecNYIzb/9LQyvDWgYeOaWC14JvrR7MkcliQiV3/JVfDHtIfpKz4W7IBXE2iUhetWqXiW7ulDqxV6lFjkloYns/nBw0d/LFi+TAS38d/FsAQo1ABm5VhGpvmScg2JS1PvFLOr6AAAAABJRU5ErkJggg==", v$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOISURBVHgBpVZbSFRBGP7OurtdlFa3ENMuW9gFwjSoNqTMCgqi0kC6UGE9SD6Z2hULzlnqRQgqwhdf2pCiC6SgUC9RDz1EIEmoUJK7lU/lZRe00r1M/z97RtfdtJU++Hdm/jPzfd8/M5yzwCwQQmRS6BSvKHxiCiNmrpbChbmCF5kEqeJeykI08ZzpUASDQdHS0iIqKiqEy+US6enpMoqKikR5ebnwer0ioaraRD4tgVynxuB+W1sb6uvrYbPZkJ2dDafTiYyMDDlvdHRURn9/vxwbhoHKykpFY2ia5kkSYOfU3OZ+Q0MDmpub4Xa7pUDcHNDiaQ7HxsbQ3d2N6upq6Lqu0nU07/akgLl/7ykyPR4PmpqaUFhYiKRyiZxF4sdKuLOzE1VVVWhsbORUgGITPfcrgXvUnPY9fIDSk6eQWVAwuR0JW5hUgQKdF3p6etDa2go6H069prm7NNO9jzMj69diwO/D4w0F6IhEpzn8WwXxOW67urqQm5uL3t5eOBwOfpxlpR8pN07u8cWPlTTxajCATXY73mwshJabN8154hapcTgcRn5+vhxzJcXFxZyuZYEy7k10tMNCbRovHPyBg3RrDg58Q+jAAUQOleFfiEQiMljITuZM7GTOIums/7MUYJ/a+DgwOAj09cF2ga7q+TpoAwMzkqsKLRaLjFAopB65+AxkjYG8pbAOD8kKlJBEGmVokVi2HOGaGoSPn5hRJBqNyuAqcnJyZN6qJlhs1pj75NpjMTyMaN5yzAZ1TvE3jc36ZYeupTbDwsjRYxh/+w7RkhL8C0xutU76DkwJbHVDJEwWzsWYuN+CiTt3IbKykCrSeFtj6OIzMKijh148x8ThstgtonhaYMP9yq2AY1FKpNJcNHYWeskVlKyS17SOBTKpMyJ+/8Yv9xZ8/f4Jl/bOQ/taC+YEEQuXYwV8NR9UdpWF9ozfG6+1+fPx81YjSk8vQPuaOZLH4XrpNdX18rtIMZ2hCCzZvR9n912adDNX97w1Jzce4Qyblq9sKcBKKuEpbYC+88rUwlTICdd2XISh1hGNyZn0wTGokS/1J72tuPxShz/4NfZQ+ztxvnM1bu65gbJ1++PJDTVIuvrmZ49F+PDxqOcZ2j524ONQHwZ/DVHJFtjT7NiWtxnHNlRgl2s7FtoWQm2L+tDMXnXso+8VqeOV+I9/F7UmwUgcoc/MGeY1nxF/ABP0HWPxZ/3sAAAAAElFTkSuQmCC", y$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPgSURBVHgBpVZNbBtFFP5m17t2vE6ywUpUu03siJAqBoqBlgZxqQqqOBaR8GvUCPEj1Ei4IKEeqthNKg49lQOqkJDi4EhIQA8hKlI4ECQO4VblwIFeTCukEqXEsWI72Sbr1xl7d7u228hpX/TFz7Nvvu+9N7MzBnYxItI5UhyLHDm6Z3lrLMkRxV5NTLIIWrXploV44KdWhmTm81TKTFP+rTfp9sEnaOUxvYr/XzhM+dER2sx+Rw1VJRv5WAN5in+khW/8PIeNzz+D1OaD3N0D1tUFKRCoxlWKRVCpBDOXA/E/bSIN3zvv2jRpxtj5JgGROf+4JPzi2S9gZLNQjhyBpCiQGLOD7iVjoVIuwzy0Au/I+/A/P24/PsNFLjkCVv+uceilC1MwvrkM9dAzkKxoyUmH1YlUxFy/BOliFMbsH/CYJxFIT4pH6xzPcpF/7LmiNfpvMzO4+eUFeEJhSDwzAZmDWb5UKjrjUrcJ5e0A5F7iFW5BPT4A88kruPPXr4JP55iu5mRlnxNf+vv7UblxA18ffg6vMFEes3pIVj+tVnUrYK9yjm0Cez0IqhAqvJzt8nWYRgjtT30P5tVEZJeH/zspvEwmA9M0sc4X8pNbK0hofnzkkXCAsYY9QZDPDYCF1ep3oq3qGKNtSLwfFfUWtgt/Qu15WUxIigoWuXNsbGwMsVgMOzsmJifPIxgMYj8nTykyTkgukSDPPtYGeDlbtwfyB/tqi72ex87SbZgaH/efgDbylYj+XVQQF97y8rJYbKytrcEwDKyurqLk9yPBRd6QJZzl2C90SjzrmwW7GLB9FbC4DBbgG/biv6CoD3T8mp1OFPZboqoquXafA1mWSVEUepw//9bvI6NDI6PdT0ZAoI2MNpUMn0J3zkVo87Ue2uB+8fJLztvnCGiaVkfc29tHw8PDTYIfemS67lWqpG5scWwOaFQ+fYA2Pn66TiAnnGg06pB0dnbS1au/0NLSEoVCoSaRCGOUVT3NAgGVSrqXiqePOccH7ENtdHS0juTo0WFewYv3bZuNU65qHIFYO5XPnLIFFoVAWnjZbNaZqOv6rsSN1cwonpqA6L9Yjx9/sAWS9plPhUKB972XIpEIjY+Ptyxg4z1Zor95NaWDA+4TNlp7T602zc3N7Zm4sZr/rvzk3BGwjWoXTPUOmJqaoo6OjocSSKVS7rshCrdR7fqrmgjcK/nExIS7NU0Xjy2StiNmZ2frtu6DMDQ0RPPz827yNHYzq5K8W0hs4Xg8TuFwmPr6+mhwcJASiQQtLCwQP1bcbUmiFbPWJEOt2yI9wq+LpEWQdxHmrDHRUn03jrsGX4VhytJMYwAAAABJRU5ErkJggg==", L$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWHSURBVHgBrVdvbFNVFP/d917Z2q6sLGyjE6FDMZLFrUvEBLPwR4wxBgz4QYiJkZigREPExBg/KIwYA/ELYjRGQwIkiwZNhGjUmJhMPqGLsqGiDhgrY1DWMVoY7dqtfY9z3nu3fZTXbbCd5vTd9+459/e755x7330C0xTDMIJ02UC6ijRCGiYN2t1J0ihpD+lx0mNCiCRmQwg4TLqPNGHcnRxk36nGF5MA8+x2ke64o+/GDeTPnUW+rw9ibjWUKj/U5haIQMBtqHaKxm7cDQGbeSesMJuiJxLIHvgC4z/+AP30P7c5G/ZVaVwCbe2T8G57DcqiRc4ho6RriEh0SgIEzvk9KsGN69eR3vMBJr7sgKgKQG0IQamtA3x+iDkey2diAiCC+vUk9Msx6FeH4dn8Arxvve0kEnUjISabee7ECaS2bYXIZqE2NUGpri44uIXOkJpOI9fbSyFR4N2zF56nni5LopRAvwQf/+YI0ttfhxYOQ13yIARZCsOgq7CcDNvbvAp2hmGPptMzbuf7ziF3/jx8H3+CORQRB4lWuUqEA3wf7IKb6PoNqWfXQVt4P7TFiyHMnwOcHY1S+mxhFAgwM52e5YhE/vIl+I99B+3xNmn8EY31ZoGAHfp+0/niRaQ2rAfiQ/C0RKCYRsKKACZZNnIi5ngyHUQin0eupxt6dRCB3/+AoDTa0sipUOybXfJpZj8F4uIAVI8HCuWe8y/Gs8W2fS+yGYhMxrrPyLalimmfMX2UXI6WaRXEtRFk2nc6ue6wImmt94Q5+4EB3FyxHCpVtUprWqUUKJx3O808LVGMeHHKwpkGFOrBigalYeAC9HQKeVWFr/tvqAsWsBXXQKMGa3s1JX1pEPnnN5MzDaR5YNTMg6BKFnYaYNeBGWMhXIIvCnuCYRiFdu5aAvmJLPL0bOz0aVRZBMytnSNwkBpb+Ek8Hoeu67R6FFNVYszqJoODg6ipqTGBmJTP53O14/HyVAfyyrb19fWy+xBHICIZ5yhfDCgJyOeiZLapVAqxWAx9tBVnKc/VVFjNzc3wer13gEt/qUyC1Z5YhFHC3JqgvDsNpUoSUpLJpKmfdnbg34orqG8JozcexXla79FotGBXClxKwpawYufiNgc3MXNKypHp6uqCNxLCK63L8EDlOC7XpHHmzBkEg8GCnZu4EAgq5RhLB7dBbtDbMJsaQ/9VBYlsHppHM/1HR0dd7Z3gpZPkGuDlENQ0zdWxVIaGhtBE74VI/WP4PtYNxaNiZV2EZnUToVAI5WbujIqsL8bmVdBNjQgbDA8PFwqQtRwJLkKuGUl6bGwMlZWVCLifB0xwLki5EmprayWJHv4/JVmWRqGc+P1+U7kYeUBePeXAS0WuMlt6GPFX0pf47tS5FDp+OktkFHN3E1Cm3vwxYl/jZfoNa2c0VcfGNY1Yt3K+7Dwut2J+EQWTo+NYuvEIkqM5x043JYNpCJPQzevZo5sQbqiSHfMU+718mO+CgTl49bllKB4tZkOKY21Z/5AT/BBj3/E65igsf/EYorGUHYWZRsBKweKQH7989gzCoQKB4uvYPiLt5zZH4eu9T8BXqWLmkbDAeR4H3m1zgu+XxzLFYd0O67iE1ofn4/DuVajQlOJA9wLOAIrAgffasPrRBtkRtbFMmfRQevL/q9j0TieiV1IOq+mkxAK/r9aLjvdXoy1S7wRfU/ZQapO47Vg+GE/hw8N/4fNve+2z3tTi92p4ef1S7NzaaqbUAb6RwHsw1XTcPkwuxG7iaGcUX/3cj5O9I67AKx6pw9rlC7B9cxNq5lY4u6KY7oeJgwTvD+2kb5T25fI6/vxvBOlMzmwvrPOjsSGAygrXwwsXd/s9f6zaH6eHjLuTxIw/Tl2IyM/z1aQtmKXP81s88/J+3ZpZKAAAAABJRU5ErkJggg==", w$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARpSURBVHgBtVdLbBxFEH3dM2uvrbC2FAns+MMK5Rg54ULEyURI3EBe8TkgBDlALohgCSHEKXBCioSwpYiPAiRI/G5YCAQcDATE5wQO5JJISSZ2IicHJ3a8/5mdTlXP9LjX3vXuJpta1XZPf+q9ru6pqRZoU5RSg1RMkU6S7iPNkg7G3aukHukC6SnSOSHEKrohBJwlfY/0hupMTvBc3K7wimPgLVKr1VSpVFLr6+uqUCjoOrc1kSPb4Ygm4FkqfkHkZi1BECCfz6NYLML3/WiyEGa8Ll3XRTqdxsDAgK5b4pEeoPFeSwJkjPf3GwOu1tZwY3kZ+f5+SCmRSqV0yWoTCMNQKxMlbyBz5TIyI6OQ4+PbkpANVp6AB3/+gZsPPwT/3Fn09fWhn0gwAV6dIcDKdW7jPjPOP/M/8rkn4P/+mzGvvbr5XMhNDkjcXv36K+SnHoeTuQe9994Hx3ESMBt487Mpe4Z3QaZcFJ7Kka0vN5MY3EKAD5wB93+eR+nwy0iN3w+X3CigWgJveabtcEfG4BKR0quvIPj7L5vEkToCsVumuR4uLqL8+mtwenvhDA1BViqQCltW30yTMURAVspEYFi3FQ+9qM9TLNNmK4wHEkbld49CLC2S+1IROKmgQ2aDNBPTp4kQAcHzAx/Ojh0QV5dRPvqOPVwvWMb7cdCsPqC9Z1aSjVSr2ghvwXbAjUggrNF8mlvxIf1A2wy++Nz2wguMze1TpqXyyXFmFBGg912wEgHUQnQi2lO12APVMhGoaptsr/LR+2aYDu3cPmlawp9+jAYiduH1lcgDKtTveicKnl8uAysrtA3sAaFt1+bnba6THK448IBiKnDhfOz+KEIJinxsSGuHImoBfaLWIEpF/cw2mVfw7z9Q7FmKFYzNeFm9+v9OR6D6txEi2W2K9rBTUXx+CLzOVuyF0LtohmX5WQcF+rJEgxudtQ7dH22BqvdIbJtL5V0yzYMbkbBYSNjaeqfSyIZI9yR1JqATB5l9AN2BbExCWHVkkki8ygQ83bF7N+62GBJyYsI0eUzgtO7kaLV3AndDlFWKPXsgepItWGACv5on59HH6iYpdBecReaetLtPMYE5xOfAeekQFH3PuwHcUOg1cKdydsucjLPXz3T/zp2Qzz6Hbkuy+ucPQowlGdJJxjav4Yxpdd94E2rXSLIFd+KNuvkE7Byetrvf1qT4L87TZnUzJ5QfHoeiDKhbovjT/vGnEKOjpmnW5IZ2SvYWzCu5fz/k7DGERCJaRZhkvm0BmohI9ZDBj30Aue9B0+3FWKgjEJ+FA/EAyKefgfPt99p1BrsViSQMI3b/6Bic736A3Dh4HqLMOLk1tUzLsbSEEqXZpUymZUZkSPCY9LVrSA8PUdQbsMFz1Ldgj2/7YsI5f4VyA76UcN6vJze4mLD2Uj7JeaAlHppcTLZbCV/NZhrdtYiMIiJaq9WqosuIbmsiM3Ya3rGo6HJ6UnUmfJE9odq4nLb9+VMb1/NHSPeiS9fzW28h+rExj+5IAAAAAElFTkSuQmCC", q$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYaSURBVHgBrVdrbFRFFP7m7t13oQstFCqUFkGN8igGRNSkQKqgRoX4gGisCkr4YVA0JEZFGhONUYQ0EKBSLcRoTJAgCSnxB2JjeBliW5HQAsGFllYJ0G4fu93de+94Zvbe29vtFlpkmq8zd87OfOecOWceDEMsnPMQVUsIJYRiQiEhZIo7CGFCPaGW8BNjrAO3oxBxIWEzoZ0Pr1SLsTebn92AWFi3gfB2uiwSTaKppRvn27qRHXAjy69i1uQQRgbUTFOVEyoG8wgbzGqqDiPlZlk6epLYcuAC9p9oQ0M4knHo5Dw/Ft+fh7XPTEHh2IBTFCYsICXCN1WAyMX67rPIBXH592fwzaFLGEGW3pETQF7Ii6BPhUdV5JikxnG9O4727iQuX4vhSiSOsgUTsX7Z3U5FBPlSUqJ+UAXSLT/aeB0vfXkSvQmO6YXZGJXlBpeDWKpm1jh7Bvk/2qvhTHMXGOlXsXIanpwzblBPpCvwt0X+XW0LVmypI7cGMTV/BJFZpMykYnIwtyfhtjbij1F9tlXESQ++fnMmyhYWOJWYZcWE6iDfbJEfb7wmySeNCaJgbBBxzZycsT4ipwlciHhKwvucIcb2JjlWbm3AJFqKkmm5MDlEcK+1PWC6XlgPTdNQ19iCioNtaI5YpCZsn7PUp1Md6Qqe6pNrwqU3NN3AH+c7KEMUNG0rRSho21wklkIxPzZYvV1dXRgfUrHx5SKUPzsBIUqzeBImeAo0aTxpIEbotaAZ0tqYkGugNmRN3ZSmbgpSHeuqTzt9J9ObmfneLj6MRCuutDbA8MyEqqpwu91QFAUHGyLYXXsVrZGEaTWzg6cvBpyusKqUJ8L/9qCHNFJg4NyOhSjIlZkhYqBIeGCJNTTWeQ6+3r1EqkNhUZpYk/1PFIdQvXoynp+bI+niCbI2kbLc2U6Bp6D1tRMyhoieK9hWc9Gik1u7UKDE6olHmyks80kBLzyJIwh0rqdhcSkLeBWsWZSHH9ZMweIZ2SkyJ3EiHVz2X+1MImmY8UPY//s/TneViCWoo0Yx5zo6G8ugsm5w3yy4jfNIBp6C7l9sp56zHG3qwod7WtByPZGWjn3taEJHNK6nNgpumNDRVl2K3JFe8dN64YFC0dJ7z0HVz8LF2+CJ10D3zIbmW0RBkjCjun95eGovDn9QhPeeHo/RWS5pbcz0SIxIO6IakRt9A5iZNlSfbY1avYUKrCNVj1heknAnj9ISbIC/6yOoiWNSCQssGUaw41244kfwWskY7HvnLjz3wGi57sLiKCmi6ZbSzOGbVFtsTlYcOI4vl53bAoaSC827gFoadPeMftaL4NTUe6G7psrvcRSw209vRdWhH5GpGA7oZIBnxbfUmiBlQgGRDiFFHWMnF2cBIp+LpPcRYnMPmFBX70RsxDqIyPbu2A5vVSVYZycGK+k+QCjbEnWIJQhLgXci4v4XkPTMQyz7Uyj6ZfiiVRQDPRknVY+fQNaiUvg2fXFD8nRFRFHum251hYUHGgjFjI4ut3cEkPCTe+8h2zrgjf8yYBKlqQn+Tz4mBY5hqMVxPIAVFoFl2x6oFwr8SnhFWuUrgha/IFMl6Z4HzfOQnYKsMwJP1U74Krc7z98hk9sGlD7q/Ky1tmJxEIW40YP2qxfBXXlyCxbkAp6qr+Ct3AElMvx7pnks2UHoPlkHNtE+mkcp5rm8W1qpBOENTrIHqyeOI+vxx+D//LNbIk8vyvIXneS7BPeA41jkeeepU/Ctfx9uWmdnBA+3cCeI2LVvv1OBvuPYvCJVmG2MVF1w/dnQb6JbIXe2lY2bnOQV1rXMNs6MBXEuFIpv4+eDMFavghKN9s/hYSgg154MUiq2Qlm23BKF4biS3fBSyv86BePVMrDmS0NWwplyfNx4KJU7wR6c5yTvdylVnINNwVJYm9O06XAdqAFWvgHDH+i/pshssUQwCLy+Cq7a39LJl6a/DYb8MAF5waghZfbuoa2rHhnL7Dl0ws8HI4VZTo5TEsZQHyYOJURMlBPeGiCkiysnJVgsBk5t5OeDFVD6+nyZphLBXX7Lj1XzcbqLD6+0/+/HaQZFrOf5fMJM3Kbn+X85xkvuxWpV1gAAAABJRU5ErkJggg==", x$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPhSURBVHgBtVdLbxRHEP561s/YyGvfnAS0Vi7JiYU4j0tiiHJO4E5eSoIQQoJ/gP8BsoADAgm4IQ5gcefhuyWwxJ0VCGRZlnfx2157m/raXbM94921dzAllbpn+vF9VV1d3W2wT7HW5qU4JTomWhQtiOZ9c0W0JPpCdEp00hhTwUGIABdEr4iWbXtym2ORVWixB94l29vbdm1tzS4tLdmVlRVX578mcrkVjmkCXpDiKXbc7GRrawvLy8tYXV1FtVrdGWyM9ndlR0cHenp6MDAw4OqBlERPSv/SngRkMq7vQwWv1Wool8sQSxFFETo7O11JDQmwH5VExRvo6+tLEyk1ImFaWb6+vo75+XkH1NXVhVwul7C8AXko6c3NTVcfHBxEb29vUxJpAq8UnO6m5bSYSlDVeHBqCbSuyqUikaGhIfT394ckjukuiYKBVxRcggoLCwsJcHW51vf6ZqnjORe96YUYlxMe8K6n9W4N5+bmXGN3d/cu8NDyZkugHtC4oBf4PTw87ObyMsKl0K+Y0eLiouusoCF4egnSEhIMPaOglUoiN11yfX2GK6v1s7OzLtioGvF7AbfyBD3AWODOoNILPpjJZoTUTulABl7Iuh3QRp7QejgnMby41E4CY/pnY2MjYTEtCCO9HQ2JhCSCYKSMkUBRAeii9LqHW6xdofvVCFVi8L+XIgkUWOM6pQNOJQuJNHCojDUvBeZJd6RaIWC4BBIghkQyBF8ops7EqeHOokcYjMySklmJHSfq3JPHGPj3b+S4BH6CCAcjtUDlzETXvfvAL7+6NmLspMSRQsgb2exuLAb1+Vz5WZyWKyRQcg0jX+FTi5KIikX95TLhjGuU49McP4ZPITYozdffwMidwcsLEnimXzm/Lto5+wZsDE6Jfvs9bJ7SVMyDKG/l+K0eP4podSUOxI+NBTVEg7Bz+jnM4SPaPBj5c/kuv4xcHqIzZ3DQElv/x18h+B1i7zqO8f49qid+QvTubeyBrF6woQpwbvIRzJeHtbl+HPsr0oT7zXvczVuwyUtlJvC4LsktunEzBJ/Qa1mYa8ahW3L0e0QT11CTgaEVWUjUeKRfvY7o21H9XfJYTlpeSu30NOy5/4E3r5OJZA9QLa1Y7Cwf/S4EPxleShPZ1jecRuyJUUQPHwF//oMaT0agqUcSbYcOAecvIPd0Kg1+uuW1PJ6swcOEXqhNynNh8gHw8iUayg8/Aj+Pwfx3FiafD1tK2O/DJCDBGcZFL+5q3KrCzszAyO3Z8mj9/AuYI7K96hkuFAb3eObHqt15nN6x7QkfsrftPh6n+97itv48PyF6FAf0PP8AjJSSpoWkckwAAAAASUVORK5CYII=", R$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAdESURBVHgBrVd7bFRVGv+de2em8552WijY5yCOQlvaQAN0RdlGCEYXA7jE3cgKbLKL7rK7IGF34z9o4jNGkRgM8QGoUXzEFyqgGCxSsVC1NVQKWMtYpFNs60w7nZnbmTv3eM6de6d3+gBRv8mXc+aex/d9v+9xziH4mUQpzWXNMsYLGdcwLmecqw2HGQcYtzI+zPhtQkgYvwUxweWMtzIO0cujXXztpfYnFxHMrdvCeMOYsYEBpE61I9XZCeLxQGAsVs0CcbvH2+pehsZ9uBwFNM0/RhpmlS4M/YAdx5/Di62vYm5TANsbhMxiqrVCeTlMi5fAtu4uCKWlxi0DjOuZIoFLKsCEc/++pQsPSwO4e989eL71ZRTY81HsuQK3hSdjfYcLxGJOr0kmgVAIykAYSncQSl8vzH++HbZNm42KBMZTglzM8oazjbh1zyoIRED11Erk2jyqudd1E9zZNhY8qnMsBvn0aQaJANvWbTBfv3BCJYRRe2SEP9/yEup33ox8uxfzSufAarYiLkuQlARkeRiCxHhYbxMj/zkLIswzZ0IwmxBduQKJV17W91cN1OJLJZPB+q268Hfa92HNW/+Az1uG0rxiSKlhDa+01bLMNB8WRuFHmPVUhUBRkaAgRSUAUyy+4d8sPnwwza/TleDBvTG9agT6sypG4S7V8uDQBdQWsXAgmiCDsGXngLuPjwbP4Aaqu4NCSaWQbG0BnTQZriNH1azRyMddoSOwRf9636GHEBjogivHySxPqIK54Ve5FCwqkuEvSKH4BgV99QKSgwSTv7DA9IlJB0FrCDdKRUJgSohOJ1I9QUiPPgzb/Q/ponh6byCaP0K69b7Hq9TIcOe4Vfi5FbeXJeCbRPHaGTPODIl4bEEMS+5yQs6nGFgkIVqRQsl2O8gFMZ2STDglaRQU1kl1fYdULArF4YCztU1HgVdKH1d9ma7So43b0mHJTB6So4gmY9hUlcRt1Iev22x44Euzap1kkSD7c2CKE0QjCXg63QhtaYTzXy5YYmTEFyS9HU0m0i6JRpF4egdyNv+Pz1BLOx/P5Mj+bw5moFTYb7EviDvmROBRIqiY1YwZZ3pwzckgSuq6kBDPAz3dsExqQTJyHoNhCd+u6VeDjjNh2UAkCejvh8CilpctLkxuaDCGzEKOQI2KBys4Zwe+y0Q6p6XefiQSNog9RShYb2G5+TAwdx6aGrsw/5HJsHusmFJTiVQN8/dZAmX2MGI2E+whko6HuAQSj6l7CSQdnHLzMVCmGLFa+ecarlQ577X2nBjRi00usCg4HxOwp4XleGoIEW+UO1QdPnD0HKJxWe1H7HHEhyU4O5NwfZkCFkQYAnFgcFAVbkwgoqFAu7p0SeUmzRcYiIfT1muza69QUDVVQXPYhL1nKOr2BHG+sR9NvacxrciFo1/14POTIvzrQiiMeECYQDpPRm+TgLK4DaOJQNue1wmmgOD3q3GQSeZIIpq1YDDCIvxHIJ/l8RQzRcmKXOTazSqMeW4rXA4LA4Si8mkL7M0UQ0UJtHzDUEnRMYLHKGPO1D8VEfXiMN07LWtSe8yEXrOANZ84cDDJFpwTMGWoB2tvuRoff96NsqlO/PFKNrEjCdELuA5bcF2bFd5vTeNbb+jD69WHwlyBAO/5C6ZnLQpJBKz04581CVTe1IeOa604Jfwf6OvALQvLUJQjI/jRajQvjkFZa4NrRxRdq2Jwto1VwKiIavXMCv1TgCvwlaqULQ/VhZVZC17vMONG9zDebA9h79I5KD0lAhXzcOt/lyPv+lrkP3sC1xT70OdowrFjrHi1WEC+H1uiqaEls2tBRFEfauWzG/R/f/AvyVp44IIFB3stWDUjgV7XB3izsgzHb74KdE4xEjMKEa6vRdDRidiHZlxtFeHcaruocNX6lSuNw4f1UswPotweduu58slqxOR4luM2VkuozUvhqdM5+DRowms3RrHyJjd+LEyhf5mEnOkUUx50wBKa+I7AzwVFNMF8rBmkJHNJydNPwydY8x/eX79vM7Z/8cyoqGEJ61Gwetow/HkK/LKCgjCBo1tE7rtWmJsn9rsuXEXgb+tguv9BfWg3Ow3XjjmOeUWs2lGH7yPdY45hnda0E+w6KOBSRI3MrBbfPwBSWKgPq8exuot2RdrG+7lWD/as2AlREEd2+QVkXEbtdoi7XzAK36Zfy4xm3AstJReUzseupdshkl+vhOJwQnh2F0hllf45oMlClgLaS6Zem4C/zPoTjqzez3xfOrLbzxSaBft7+yHcsMgovN74aspypAbLcm0i6ornouGO93Hn7L+qB0lmZ4yCeDS72YVj4yaIhxpA2OXUIHz5Ra/lmQ3HeZjw29Ib7Xvxysk3UHGoFTs/GhWE/KSp+x1w7QIIf1/HqpLHOBrABA+TCYnXB56e4776kkmqnDhBaeMRSj87SpWODvXbBPSE8Rp+2aQ9TnfTy6PQr36cjocI0vfH3zOuxm/0PP8JbgOQnabQW8UAAAAASUVORK5CYII=", B$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZfSURBVHgBrVdrbBRVFP5mtku3dNtuS9+l2AoIaN9UWxXaIgRjIITCDxMjWBMiVURKxEQQw8vwQ8SWaCARCKU+SGMIpKlElNiW4CsBC6hpa6G7xD5sC+yWdruzj5nrvbMz29ntbt1GTvLl3pl7537nfufcx3AI0wghJlqspSinKKDIojApzTYKC8V1ijaK8xzH2fAwjBJnUdRSWMn07BT79r/G56YgZrPbQ1ET2CbZbPB0dkLs/gtcnAm8yYSIvDy5DGJ7KY5MSxFl1mbtdDzDw2TswH4ynJdDBiP1ZNAwGcML5pORrW8Sj8UcqIY5lBpcEHIW33Pwxlie7dh7uyA0nIYuPh66jAzwycmA0QhOr6cDcJDcLhCrVYanrw/S8BAML29E9O7d0D3i47VQVFIlrod0QPGyRSW/8ls/ol98AXMcw4jIzYVOI3Gg50RTl8bH4enoAOE5GA/XInLVaq0Ty6gTllAOmFXyhuZObNrfipJ0HbaYerH6wQ1whIB+7P2IaCjpO/ZMWEFbCavT157ubnhu34LxsxOI2rBR60ShmhOchrwWSsK1XO3F8280Iys9FtkZsfQNjyTPA1Tfv4xie4+PnOPUIRi5zC4TM3rWhb3z0ET19PYi7uL30JeVq3R11IHtPgcU6dnscWdgFCuqm9A7aMdTOakKC6f05LA0PwlVq7ORkmBAoBHFMVkBBaIowuWiOSJJSEtPB8/zavdsFgr1aY/69uDJa7D0j8FgmAHBJclwuimU8tLVIWzY9yuOnr2FB3a3nwOcVxJvmBQwQpmU1m02v5Uoq80p692qzn5h5Rl4JCA2OhKZaTF0FpxvYCJrwCklkDLLgFepGqueSQuphERn7na7ZSVYPSUlBREREayZeZPNFFirftjQ3CWTs5iPCSLGHaI8a8ElepVweutOpyiXdwbs2Hv8D6x55wrau6yTlFDrqgqsbrfb1SZ5a2cO+DLj7KUeJd50bVNH7tqcvjBUFCVDYM44Rd87QXHE3G/HRhqWXcd+R9+ww6eANiSqE4IgaMUqZyFop5UCJx3IuOSkPHtwvM+RaIMej86ORtOhMhRXfYdgpqxCuYzU86iaY8eOexehE+wgLjckGjSJtkssKSnizzSCT0hgn15nwciSa113ldG8hY5uIqW5ifKoK0tSaU5EYM3SdPQOOeT2a51WGh7R94m6Kwg0TLV/6vHVeAl29jXhpfs/simBRVZU+kh0afIlpayaxSuxwLjgUYbyQqQjLsqKReOBp7Fl/TxZ1kNb83H4rXy4aaKM2F1gqrEccbDS5c0PNs44zR8zn4DXMqtQvvB9WCKTfI4yiD09vjyIUGtuUZok7YkmM27eGsGF2jL5mRGu2NqKIatT04sElP6W5rRCoiFV05KVfNzEls4UkBfnnNQY+PTXbNBzM4w0IQku/DSAyBk6ZKbORDi2wDmAb29/hEbzp5grDPoNy8UY1W42poCFoiArzajxccJy58Wh/PUf0GEZRWVFBhYvSMC1DmtI4rhoPbYV89gx2AHkF9G4F8lJSHxJKEFXWKR2t7BVUE8rr7Cn5dXNuNw+OLEKKNiAI5odzzgzAmPjnknEhhk81ldkYt/mHJiMer82dUNiYJaYmKg21TOmVvWpfHG68sXExyMB220w8mfzEnHuwyU48nZhUHLtzmgw+J0hbepWzA4ik23UhfmVjbCNetSjDlPc2pCRFIWPawqxvDg5ZB/VAVWBBLr+dTqd2hzPK+fyafZkipmBzesWQT1UQxkLy66qRWj/fOWU5IEWFRWlJa9n3JOOY6bCkxvOw0L3ed9RrJiOI1j3hAEfVOcgMS4yLFJ19hy9wsWkpWkdkI9j7YWkjhbbWP1G9z2UbfoG404RajIuFu7gYP/XWDLaFR6xppQoaeSlFuhKS9VmdkuuCfTUpL0JN7VZSFx5A0kt/oQcn72MCPTW65wGWH8HhT1mJnF/+UXgDdkUSi6/67i542/yz+N58kCCgnCIVXLHY3OJ+MvPYV3PtU4UaJ2QBvqJa3sNccwy+TkiBCH1ESfPIq6d7xLJag0kL0BY8QvyYyJZLMR97CgRypd6SYLAueI54qY/L5L1Pgn3x2QqJ1hO1JFgJopEvHmTeFpbiOdyG5E6O4nkdJIQVhcy5tNQo55Mz5j2p8j/+TkNpgi898cKinw8pN/zfwHaAKCsiO0KMwAAAABJRU5ErkJggg==", W$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVnSURBVHgBtVddbFRFFP7u7fZnt23Y2iK0SFuNCBhiC0qigNT6hwIPmEB5gERfMMoDQmJMMCZUISbGRCQmhgREGiEGJGIU0SUaIQ0EEbSCFkGUbSmVn2Z3abvd3e7evZ4zd+bubCnQ0nKyZ2fmzsz9vnPmnJk7BoYotm37qVhEWkdaS1pN6pfdEdIgaQvpIdKvDMOIYDSEgKtJN5KG7eHJpzz3Vu83bgLM1q0jXT2wL3GtB6HT/6L7nwvIG1OE/DHFKH3oAVEOIo3kjbcxHAKS+U9w3Cyk72oIf27dg3NfBBD5uz1rsi3L4uoKVM2bjdpVy1FcWaG/MkhaT0SCtyRA4Ly+exU4W3tk7Uac2bkP3lI/CivGwXf3Xcgt9MHM84g56WQKidA1Mbb34mXEroYxeflCPLJ2hU4kOBgJ42aWdzafQGDZGzBNE6XTJiHfX+xOskU50AdOLRmNIXzmPA0wMHfTm5j49KM3JDGQwHkF3tfXh9O79qNj9wHkk7UKjiarwdrsDCWbS/GzETnXjgjFSf3mdZi8bKFOYrrKEo8GvlGBx+NxRCIRlM99GNblMLoOt0gIQ2MsrWZCdsYU23b6uCieWI5UvB8HX31HxEfF7BmQGBzca1wPSNez9UilUgiFQrh86AQufPYt0vFExnrNW4YLbmt0Ml6wZSudsnDlt1YUlJWg4fhuPVPu5aUwZWOdetrb28uEUF4/E1PXLId3fBnsRD/SQpOuWtS2YgmnJCvTcdXvlDa1eZ5NBuUXFSJ2qQu/rN+smeCktynz/SVuWJYl3M9Bx1owtkREvgKwyBtpVyUpVeqqyDCJfiJDWcI+PLvjG5EpUl5kbI6BRepJNBp1wS8FjqD13U9g5uQ4Lpdr67rdDUZ9TTJiu6XtEKB+KxrHyY92YuZbr3CX2Np5CerUpP7+fpfAhPmPY1bTBox9rMaxPsHuTgovKLe79YSsC1WecspEV0QQMNkHRKLjx6M6zzr2QK1gSlal02l4PB6Raqz8gj7aWLhkC0Um2MiKRPaMbWRyRKUhz0/G4kj1xbUkBbqOtyJFzz3eAn5DLROo5loymRSWK/DO/c34+eX1YpKZ66FdLxdDFTaG154zQDF1qDmMe4KdKJl6H3dUm8gcqVkyYcFczDvchMolz4itNkW7m0XWWDLorLiWGdozi6zjcQpcT19VvxbsUDB+dyNi9yvrlcYpdWIXr2RZRqmiBdjQxdDGewoK3OdMgLdEf46MdiVtuwM4sfp93AnJK/KqaoSXICiYyOBTUtUwD88f2ynK0Zay6VNVVeyEv3ONwQd6obf9P0TbOzGaUlYzBabHXfkWJnBQtfLy8tyBbXQKNi9+HV1HT2E05f6lz+nNQ4bcivkg8nMgdnd3C29wSsY6ruD0hzvQ9vl3GImIQ4n/TQNLTn6JosxHSokpz+UmbjFobm4m30MtZxA69gdGIupUZJmyYrEOvp2xrzuOOdV6enrQtiuAUxu2IBXuxkjEIWCjsKocCwJb4KsYq7oyx7H8RNok6/D5fKhseBZPff8xJq1swO2KAs/xFeDJHe/p4JvUZ5mpjW+ElpJerxedB46gY1/zsDYcHVy8i8Drtm1Aac1k1RWUWMgiIGOhXg4QGXHPrBn03M564XDAC6vGY/4PW1FJJ6sGXq/fmm75WR69cAknP2jC2W17s1gYNwHO9ReJgJu2ahldXIp18BcIvEWfM+SLCW9KbV8fxPk9AXT9+tf1Eyl2xs2ZjvFzZuDBlUt1YN3y4HXTcAOR+0Mj6WsD+9JWGpHWc0iEe2hXy4GXLipF1RNEfRDh4G687cuqvJxut4cn4RFfTgchoq7nT5DWYJSu5/8DFOwxGIhDmMMAAAAASUVORK5CYII=", E$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWbSURBVHgBvVdbbBRVGP7m7Ox23d12FzFUqNBt5SIB0lKIicGEm9h4IxAjaqKiMUhQIkYlgRdBMTxoghIDJj4ItKCJNYEHxESQSwRMbSuXQoEU6BYoBNqyBba7M7vdPf7nzGWn23IpF//m68zZM3O+77+cyyi4Q+Och+gyhzCVUE4IE0JmdxchQjhM2EfYpihKF+6HEXGY8A0hygdmG8S7txtfuQWx8G4F4aPcvq4bOk6d6UDbxWt4gZ2DEvBDLZ8IFgj0N9RKisbnGIgAU/keGGGW1hmNY33NcWz9vQmNF7rtV9uOLbHfYyNHwfPSbPgXLoSrOOwcMkKYTkIitxVA5CK/Wy1y4e2aDXVYs+UogkEfigr9KHzYB7/PA4/KsP58FTKpJHg0KtHT1oZM+xV4578D//LlTiH9imD9eG6TN5+LomLeTxj6aABTJg/Hp2+VITwsBJ/Xg0wG0FMZKLoGFzVcwSDUcBjeKVPgfbYSPbv/RFflLOh791rDizH35NYFywmAHfaq7Sdx9nwnXpxeihFDC/B65UhJLEg1gSRB52CaBqbrcMmrRoJ0MMbgHjcOTHXj+vOVSFRX5YoI9REgKt0ibzrdgYKHgINHO/DZgkl45skizCSkOfDJGxMQzM+DnjRECHKmJaAkxVU3BWny6h4xAu6iIsQWLUTqwH6niBVWQ3GEvkXct166gecWb8eksYOx5uOnEAzkgfIm0XCiE1W/ncGxs8YUp5/wR/NX2RQKKMZNxmxnenqQOvQveGEhBtUfAgvZzpeIerAiYCv6cVsTlr45Hi/PLLXJRUgF8jwufPjaOMydXgyPmyGhp6kQNEAzoJieG9EwI0ECmD8AhYqze1Wv2Sint2LmI2p5P2r2FvKCYcHcJ7Ds7TIUDQnYEdhZexF76i9hx8E2e/rUnVoBezIphtfiH5d/ioxEujWCdHc30n4/Bp1usaIgwlgiIjDHkrSuukGSvzKrFCHK8w9bm1Hf1Inm8zdQveMM/m5sR8XYRzDysXzKf1rC8l4iQd6bkVCoHuz7ZFJKZCRC+26tRSeXdiFgqvXL9gMXpBs1u1rxdfVxKrxhWFdzEleuJtByMYag342l39ZRLVw1Z4FIgd4rDc50SAHtHWCplKx2ISK5a5czDVNVGBsLYjENzZfigP2ogvdWH0TntaT0+vtfT+Lp8kLDa4dxQQhnTXP7nidovHjc8N7sSf9TCy5+8/nEQ+WiBkT+Q381tGHGoh30nilAYfZAovhUF9WBnXluENDflcbFxnTgWWJwyjyFHVSA3Hxa1oKJQF0D1PETZB2oZi5wPZbM8SR71clrXbTkjMj6KXtFCgS5JUJALJP9mGIiE4kAhoCQanXOaq9HZ+MHcJnhYrjFVjkA6yXWEuHJs/sFj1xVWEkJHpQpuddggdXVJQRExJ1r9Bj8X+YqK7du5Up4RKrKzwebWIEHbS7KveL1Ws3DQsBeq6VWVtoPWtV7r+YcR1zVea86u/dZS7HYiEKZy5cRHzsGjOZvdjW4PwLEvMjQTPGdOAWWPaQMYubpdZNoMdqx3PPn40GZ+u4CJ/lGwd1nO+bXuqBNmkiHvTZkl6K7M+5EcTG8O3eDDR9udWe3Y/OcJncJJRiCZ1M1uMt1TzXgfJerKvI2/+wkX9vngCpqgdBiHepTm6t53JfHE14310zoA4B4XrzbXeDnqZpfnN8LLc4jWa6IsFNEz4H9PDFm1IBEaA7yxOjHebq2Npc8jFuGjo7lThGZ1laefH8Rj5uDajcR04t4yGCeXL6MZ6LRXPJy3FH+ciIhhUQiPLn6S65NrjBI+oE+YxpPrfqCiK/yHLup57f7NFtJWNKnj3ZAfuQIeCxGkzsNRidflJQ6VzinieJeedcfq2Y0NvKBmYj9Bn4vH6f9CLE+z6cRynCfPs//Aw4cu4Vn2huBAAAAAElFTkSuQmCC", S$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUISURBVHgBtVddaFxFFP5m7t01abPbFQt22226aB4UqrZqEcE2Bil9UEqF1r+CVSy1gkjxQexTrQ/ig9D2RStK/8Sfl9JoKwgtNkkRimJMBCGNiayU2oBNsvm/d+/eO565O7M7udlt0rg98O3MPTP3fN+cmZ07w7BAE0KkqNhGaCWsI2QJKdWcJ+QIPYROQjtjLI96GBFnCYcIo+LW7Lh8F4s1OWJFPMd8b0R4k78KZ/i0cPPnhTdxWQTFsVpCDqnsVTVWgzxLxUWU0hya7w7BHf4S3tgFBO5g+KZ+WagfHl8FO7ERjXfvoXrGDJkjtNG05OYVQORyfs9o8vyEi4E/jqKl8VMwOwkrngaP3UVsS8BYTL3jAcUxBP44Am+IMAx7fCsam9+EtSZriniWRPSYfLzKyMvkl367jgd2fINfen9HLLkB8cQG2A2rwK1GWFyAs0IIWbfiSWrLINb0KOLLNsG/8hPyWzbDPfudDh/Gjq4LbpCnzLSfOteHp17/Fk1L4sisaoFl3UFkLsGDJYnhGiiUIMXINs4RS98Hbscw/tx2zHxxyhRx0VwTZgYOaPKu7mvY/X4HsiuTaE4nKLXFEjlKxCwUUjDgqnYF6fNdxJqbEctkMLVnN7yuTlPEgVkCVFr2yfrf1yfw2sEOxGM20sub4BQEAlEsj1CPllVB6NfZEVR3HFjplZQJG+MvPo8gX94a9ump4MboQ/vwWDdy/0wiRgKcQhAiCErkswndmpDTJDPAXQe8SOKXNoGNjGDq3XeMhJcGzNV8vKJHf/L7K/TfYBSEQhWVAJoCJmRwp0QiqJQjDOFW6lqc9AUEh+C6sIpeONICrQX/6lUtYJfklv5t2vPVD/3wiqXETDo+pmd8uJ4PP/BU4AK1uTRnulR1Warncib80hRwAisUQgE8oAEd/VjThVu79Ldqz+nzf6G0wzBKO3Aj74YZ8H1PkRGCSFnLH2bAoSA3wD0v3HAkmXfurDkNrTZKHxYaeYDegVFjWTBMzBRpATL4RSVg1r4lyv3Khai0yQyIPMWbni6Ty+agvx+BFLV8uey4TgrIylp3379GvMo+O+UUaRpmqgiImDAfAuo+CUbkMGRqBAN/agFZruYCk9NepFuFTAQ+/cwoRFKPQsTnKPhzNOqo/uCgdqVsXfMDAVR9JTpMf67rJqZnhhnPPJkst8sMhLtD84oEZs1nHY1Fy2XlnTgvBeRk7d5MMtLt9pm1fr2u5qSAXlmL2Rytj6Qxb07/p/GWFrBEQj/2SAEd+mnTw+lSpY4aBCrhZGk/s9Vs7pQC2qHWwVsvrEUqEY+8Xj8h0uJ795rudq5OryflkyR/Y/v9Ed31M3vXq+CVE9IJya23vcPa+/bOB5FNN9WFXxjAmjWI799vNh+UP6EAdVg8IusyC2c+2ozEEjsaYvFC6NsS//yYOfoj+oBqnojeg/pLrm25E19/0IalDXZlJIvQEO79lhWS209s1O6c4sIsAWottKkO2PJ4Bl2fPY3siqVl8oWIkH0kwo119Wo0XPgR9ks7TfI289Y077F8aHgGE0PHcU/DJ9TZk19qRF8WEQHg9D93doCl94ClUib5nGP5gi8mKF5DMHWJvlp0zHa6qyto2AA0PkakL4PxpBkyhxoXk5qmrmaHq162gkAEbp8Q05cJP1N9kHyFWlezwze7mi1EiLycnhC3ZqOKODtf/AV/eUTlev4k4SHU6Xr+H+UYS9u26jE7AAAAAElFTkSuQmCC", k$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARrSURBVHgBtVdPbxtFFP/NOE4c7MZOTqSoaIPIlaSRuLSg0CtCqPkCBCpUhIQEfADEiXPbC0JIpemRCw2o9AitQPSAlKTqsaWxQBGBRLHj/7XXO7w3u+Mdb7y2U5xnP89b78z7vT8zb2YEhiSlVI6ai8TLxIvEDnEueF0kzhNvEd8jXhdCFDEKImCH+ApxQR2PbvBYPCuxxwHwEWq1Wqper6tyuayq1aqW2+12nCFXguj1JBED7lDzM/wwayJQVCoVEJiW9WAhTH/djo2NIZVKIZvNatmiPPEF6p8faAAp4/zeMuCe56FQKIA8hZQSyWRSt8y2AdyP2XVdUDSQTqejhjD4Co3ZijUg6nmj0cD+/r4GGh8fRyKR6PK8h/EwRjebTS1PT09jcnIyNhLCGsx52jTgHO6DgwMNzF4zqOHO4EgKjGyYU8WGzMzMIJPJ2EacNatEWg58bsA5zxx2A26HnHmYZ255LDM7wtEMyAmwwggEod9mmXO4t7enPZiYmOhSbDwelAITATMvOAr8PDs7q/UFNMepkJb3mkqlkh4UBe6VgijZBtqRMaDFYldt+kT3DXJfMN7v7u7qycZswj8IuF8k2BmeC7wymDkKwWRma+Z4jVw0A9fv7+DBkwIEg8oEcmme+TJIlDANae6Batun+Kv8Vnk4KD+F8trEHpbmFVbOneFeurSzActm3GffbuPxbp2USc2nUklMZcZ87aoPeHwsUKm7OKxR4SJDmJfmKsYApmXWzoUHlYaLx3/XaF3IAEmg/LQNj8RUMtEXxtglOrC+XGu2USMdRh/zxpOSxsqkdIFa5F+HpU16ARF0tPJdbdAsdoHxhEB0GqiIAfzDfTxPodlWcNtWuDqDBf4gRxfmpvjBYQP0RlGquZY6dBnRcmkiuf5fUviGKBV2sbOjCNxT0fjYvQS2/+kYkOsU6gaFy7ayuw1UkI62OtYkCNUoIwCTE2FKOeF6cb70/HNh5xOmbDppxCIbkGdp/nQaJ0thVBf98DPpSviAJZ6Vr76cxcmRn7oF5xStqk453uI5cJd4lZ++cP7F9p2b8BeiGFk29OTkDwnzb1+2X90zpZg3opyiHbC1tABZqyKsBqMAp6XJzDvk7xsQZ140r6dlsC/f5CdBhwf5zipGTWbdyNX3bPA1xj6yHePwEK0Lr0Pu7Fj169mBO0zAiR9uQ5x+wbwOt+PgiHRN/83nuK+vQyWT+D9kVwvWJa/fsMGvmWNZ7JHMW78F76MPIWkr7V2WBhugc0/nQfnlV5BvvmVe5WEdyfoeStXWJtT7l4C//hzaCGUbQGGX36xBvLJgg3cdSu0zoUnFStARYvEs5Pe3gXcvwaNdsiunOOpth6eonnz8KRI/3Y2Cr0TvBkNfTDgK3p0f6cbwHSVqAz3p3Hng/GuQlz8AprqKWh4xF5NYCq5mV3tetlxXeQ8fKvXrL0rd/015jx7xfS3uana139VsGEP4crqmjkeFANgZpH/oia3C6/kbxJxYByO4nv8H/mHhpB97BCYAAAAASUVORK5CYII=", N$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWZSURBVHgBtVddbBRVFP7u7O7stt3dbltpS4G6ghL1QVqiqITfRB9VMMbgg+iDMf48oInxzciLL/4ESSDRqIhGEiUxkKgJihFKEKJiqAgIwcpCIbDQn91u293Z2ZnrOXdm2NntVgqtJzlz78y993zfPefcO/cKTFGklAkq1pCuJO0iTZIm3OYMaYq0l7SHdLcQIoOZEAJOkm4iHZY3Jp/yWNys8Ixd4AmSyZfkibQh95wZlwfP5WXvJUPmDGsyIptc79UUMQl4kop9cNyshEDx9YlxHO4v4FzGmjBQkrZFNdzbEca6RVG0R4P+5hTpagpL6roECJzju8sDHy3a+OTICL4/k0c0HMAtDUE012mIkP2gpqkxJSmRM2xSiYGxEpG18PDtdXi6u4IIg68lEr2TEqie+Z/pIt7aP4SSrWF+s45YWFMzJSOoKUSE26VVwD/DFtUFXl4Sw/2dDZN6QvjAOU5HPfC9fXm8ezCLjlgIcxuDjKq6K3BWWTUNeteEhURwkHlgTvgCeq8mcGoogpeWduChBRUkur1V4g/Umx44JRjeOziCNgJnNSUDijIJWT1zoC6QR0NgBC2hNJpCA1Regd7ahngggq2HNLQ2zMM97TpcDMZ69ZoHXNef5Xp61MJre4YxkLdx16wwhIozg2sOPtWlQ6MigPWBHG4h4AcTB7Cw/i/YRLg/Pwe9mUX46WI7xu0WbHu8HVFd84bcxqHQfLNX8uWxMaTHbYRDQZq5hqItVGkSqsl10hIp5SaKFn9zyrFShPiYBGwhGhhGLDBIhNKKbElrRqYYwge/jvr99go/NDf2z/LLZZr9D30FmqmmlF1v2i4Jt1TApIqQdElQqYsx6mMjInLImlEMm3HySpbsmEQoq+ztJduXRkoegWcYm3NgjfflQCpPS0pTbjcIzCgJeBHwks3NtwmSkfUIa3U4NXYHBs0EOvRz+C3zAC4WZiNvRxQBScnzzekCnr8vykPU1s4EVnpGelJFFWtWXkJZExQzLwGpg+3mHL9KuLngPExLxxBi+N3sQjyYxdzIbFykHDiZ60TOFK5diUP9RSJwjfdKJsAbDyxb4u8hm/oFFFseUHC9pQeqplvtBtdDV4xmCoWBy2hButCCq0YMxZJFmUHJLGy1ii5RmDOU4Ik6lX5dTCDJtbOZkrPMRHm5sRYsZ6cLarWxq8WETokIDBuzYKldSTojfLYv5CyPQDLoxgKGaSAeGnM8QMrBF1U7tXKMj4TX6ick3dCEA5UfpbQhbVYLg2Mh+siKhODfFddKo0dQPP8izdRJPMGlwIwIe8SmB+HDIrfo895BML5KtbEf1Jao6W2+GQvMELZrzbeQOAqBmNeUYQIp1RCaDcwobG0iLFpkofdJ7YR/OMyC0Bq68X+L0Of6PdDLBPZ7b4H6xW7N/a1i+uK3w6UWXeZv7hHuVsw/ogSsHIy+NZQYOUpAUV6R0yEgHbWlk4T6gt0U7g6vuSnI/2Ui8Rm9bAC5pl9fi57TW5wVIMT000IRkIrE4lufQHcZfDtjT/gdZ40RdH24DKns+cr0nQYB1mRjJ/at/xbJRKfXUv4du0ekzVxvDMfx3bqdiOnRsoHpgDv2se3RLX7wzd6xTPN13wh3Sd7deid2PbkDjXq8wtDNgAdEANse2YrVyRVeS8rFcshVjKk6lB5Ln8BjO59ywjGh9/XB58XmYMfaj7C8c6kfvPah1Eei4lieHr2Ctw9vxsdHP8dIMVfuKGqDssTDMTzXtR5vLH8diUijH/y/j+U+EklUXUxSmfPY0/cjvjj+FX7u/6XWMKygmbKrNyx5AU2RistQClO9mPhIsIWN4OU5sQ3Hr57EwPggLVcNbQ2tmN+UpHODXssUJ/fGm76supfT7fLGhC+y70/lcjrlVS7L1/NVpIswQ9fzfwHHRPNExW+7NQAAAABJRU5ErkJggg==", I$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAW1SURBVHgBrVd7TFNXGP/1tkUKRYsMUalYKjNzbvIIOHytsiVqlmgkLs5kGxL8YywaUdxiZlhw2StZtoh7+MiW8MiybNM5XJzJ/lgEzdxmFMVN5OHSCgijBlrAQp9czzk9t9yWWxTlIz967znnnt/v+77zVOEhTRRFA/nZTGAhyCIwERh4tZPARnCNoJGgXqVSOTEdRohNBIcIHOLUrJp++6D+VZMQU+8qCfZE1g0NDaG1tRVdXV3Q6XSIj49HTk4OEhISlLqqInhvShHhXlvl7vT09IgVFRViZmamSJsoISMjQywvLxetVmtkNKzRoqFSIKf5/RnBHMPpdOLAgQOoqalhHhqNRqSkpECv10Or1bJvfD4fBgYG4HA40N3dDbvdjuLiYlRWVsJkCvHaCApJJK5FFcBVnpPIL1y4gG3btsHr9YJ4DoPBgCgRA+k49OtyudDS0gJBEHD06FFs2LBBLqKAtLFNEMBzflUir62tRUlJCRYtWoTFixeHESmRKll7ezs6OjpY9LZv3y4XkS2NCbmAQ+ADrrGxEQUFBSx8ZrMZD2OSmEhra2tjaWloaIDFYpGKq0j7vSEBPPRWJs9mY+S9vb3Izc2dMmlkmd/vx5UrV5CUlMRmjiyN6TQVAn+plEpvf3IYcXd6ERMTA7fbHYLH4wkDLRsdHQ1rI5VJ9RRUAB2wfX192L9/v1wri7aK595BX0Y7u3D+2XyoAgGcjhVwfl5SyJtIz6J5zyMaVkamJRuY1CmajuTkZFpFx0C6BsHlldmdb39k5DQsL3uB/LEZuLkqF9p5KYrESqIkk5f39/ezqUrLmpqasH79elrMlnYqIDQy+k79wsgpVGMi0gcGsbS9E3M3boLeshrRzPX3ZYw0NWPm2lWYseSpsLqxsTEEiFPSb8SMsVAuuvAgQPLlam0LesL+yMfD9zDa0obOnW/h7pFvFMntXxxHT+VHmP3qVgiJiRAJkZxcmqYSJDHcsqgAE30avn6DkTLv5R6MjMBPhPQd+gq2kp3wdveE6jz/WWH//Bjmf1AB9cwEOE6cxgiJhpQCObEcdGByM2l4LuAfHIy6M4kkfwGCod9+ZxExfvY+9Cvz4Tj9KwSyEUFQ49aW1+Bu7YBABpouaxkWVH3MRMlNHgVuBiFEwlWpuAwVJm4U1CtRHINKOyPYRq1h73HZyzBnz04EHE74+uxh5FLOI6MgGRXAlkTdwoUhwmiR0K9ZgSfPnkR8XjZ7T3jxefjv9uPen5fgab9FIvMh5uwuxeiNmxM8lxvdI7g5aQpsBFlx5oWYzOa9+zaSS3eElemWLkHKvl3o3vsOzCfqELMgNRip8RwrmkajkR7ZStjMVMXGYlZ+3oTGWuN81nkkuWQp5buQ9uWncNafgfsmn0XjBBNMrVbLI3CNtmwgYFtV0gsWDP91mZ0uaNBaFgB/7MuA1lNPNul6TGrPEPxfSxBeLPJ/7MRC1patSzfjpSfWSdWN0lJMNyKDjwyii0/nQhx2odriR91KH6bFZOcm6+7rMBnSpJpEge/LtfRNm2hATNnrKC1yo26Fj8ufBnJuO7KL5OQ1lHvCdux0DyLr+GrcHupSnouPIoDANCsN54rOyAWMb8f8iHSYPhtiZ+GHLdWIEbTjHTwOebB/VG86Iic/LB3LBFnzgwhOSTxnzEXd5mPQqh5DBP9GrRJQvfEI1ppCm5mNcwXFhX0TcSi91NOEV34qhm2wU6H1g8mNCan4rvBrrElbKScvkB9K5RGQUlHIG2L5/Bw0Fp1FaU5JcImW3wKUSDnitfEoyyvFP29cjCQvlJNH9SkyEuxrZye+v3GK4CSa7f8qfYb81DysMxegbPmbmK1LlFfZIj2fVAAXQdeHgwRlkXWegBdXe5txz+sC2d2Rqp8L8+x0xGl0Sl3RwX3wkS+r/JpWI07N6EW2Snycy6mCEOl6vpYgE9N0Pb8PfUYnhwdd4vcAAAAASUVORK5CYII=", T$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAc8SURBVHgBrVcNbFPXFf6e48TEP4lDMMQBHNOxpOUnyZoF0ZSQFCla12kSFLI/oJMmrTDUrqVkY4M2DFFpneg6I421TBlJNDZEs60bMI1m2pIUskyFFdY2CFKaOLFL/iB2wEn8E7/Te6/fc5+D3TRSj/X5vnfvfe873znn3veehM9oRGRlzUaGKoZSBieDVRn2M7gZrjB0MPxVkiQ/Pg9jxE6GXzH4aG7WyK+d7f7SpxBzdQcYnp055g/ehjfQx9ALc3o2QxaW56wUbRJzMRxMFREplWrWtCEWZmGDgQGc6T2B/9x8kxF/mOwy5BmXojxvA755/w/Y8RLtkJvhEeaEe1YHGDnP7xsqeSByB6+9ewit7hZkGaywZdqRM28B5ulNSNeli2um5QjuhP0IMIxODbEI3cL3C7ei9v5noMvI1zqxiTlxJaUDM5VfGe3Cof/uBLHfF6wrYM7Iil0g8X/SXE6xM+JDElYbongobRDhCUJ/+IdYV/loykjoNORWLXmr+3XUvVULiyEbK3K/BEP6PEQohAjCog3zYwrGwPqm2Xm2Poqt8w141GrGyG0HdjzvReX6r6K5uVmlEQIVrsQI8EqHUnCXhtrxk85tsJsdApKqWNKoF40kTomdbsgyYoMlE8GgjJNnx/H634fFfa9fvw6v14v29nZUVVWpdC52z91xB5TQ9/HjoUmvUD4WGkFhTjEknSRmSZIyncc57r4Em16Hb+WY4TDoceXqJH7x2iCWfbEcubm5OH36NPLy8mC329HS0oJr167Bao2LX8ZToVdODqi9v7/6CoanvMhMN7HQhiDJPFE6qPxx8exXbc7E161GVoVRvHpiCE1/GhX3GPW9jTNnzqC4uBglJSXYuXMnhoeHsXfvXhw7dkyl4tF+VlLy4VPVP3GuAqQjmDLMWGRazKMcE65Jmk2fhu8usGB5RjouX53CC6940X8zqKQKKCgowPHjx2E0GiHLMsrLy9HT0wODwQCPxwObzcan8X1hGS/Cjeq9T3/YLMgl1huiSQSjU4jIIbbMwgjzlsL4SlY66u3MuUgULx7txzeeeh/Xe/0IhUIs/0Fs2bIFJ0+ehMlkEg7pWPTOnj2LiooKMcflcql0YmvnKYhXRtdQayzXDDIL8fi0j+1uFjGWn67HDlsW7svQ4+3/+1H38wH0eabiqolitdHQ0CCwdu1aNDU1YfPmzSL3GRkZsGbpsdhyCRqr4g7wjQfB6Sl4J3qFetWJYDQAXgSPz5+P2hwjoqFp/OyIB785MSwIVfKZxsc6OzsFWltbRV/Fg2b87egKOOxjIHmS8Rh5dyl3wMmPboy/rywzqCWPpSzHe/KMKMqUcP7SGHbV96P/o1ACUTIneN7Hx8exa9cuZFv0qH86H089sQiyX4b84gjkfT1IKxG6nXolF5iantByY2OOCdtyLZAY3/6XB/Byw01Eo7GdjkMl5+CEah8HP+fmWHgL//zdSjjyDaDzE8DhUdDtCGhbPxBzwKouQ0xFJ4V6nuvn7FasMGbgwqUAvvfjXvR6gpiL8Vy/9CMHnvz2AmCcVdP+IVBHID4usQJVjTvAl4N1sWkZtuRYsNVmRppMOPTrERw84sZcrWqNBX9wLUf+QvagamNRfYntiHfl+DIWrdGsTvfzZejmR/dZnNiea8bFyxNY/Vg3+nzrUVRUJGYVFhZi+/btmE31kXon2v74APIz0yD9dBjS/kFBDi05M11pqdrl5jlrUl9hDh94jFgu+XqiyspKunv3LjU2NhLby2nVqlWiPxlq1mVT31ulJN9YQ3LDKqLlNqKF8+OIMkwzhBiClRUJb008Au2qOxPSmvh6HhwcFG1tba3Ywbq7u+9RbTDocPSgE282FaHAwFQ/z1Tvuwncicbn0IxWt/Fx7S06xGNYfd8bGxsj9rCg3bt308jIiIhAIBAQ6OrqIrbFxlWvK7NQz7+LhWo6tpLogYUJqlXISgQiSgTkgX5tBGJPJnbgUnvq6uoEAdtKac+ePYK8pqaGqqurqaysjNi6JtcLBbFw/+/LRF9bkpRY68C04kCk7rmE8H8SptibrzCfzxdX6nA46NSpU3HVjzyUTb0dJTHyV1OrnqleOFDGasTj0TrgTMinNgoXL14klvd4MZpNOvrlPkX1hQeJvuP8VGKVPB7+xYsoevkdLbnrnoJSaqFPncGVswcIrV9joRttJRTlueaqVy+alTwh90vtFH3jL1ryPkr2SqamApr3wtHBd5ETrIfk/wjS4VuQ/nUn9YdEkqqnJUuha2yGVFyiDruR6qVUeBMb2KRMhM1ejLQlv4X0jxpQW+CeDUBLmoCsbODpZ5DW1jGTfNPMb4PP/GECzwDkc+eAP7cAl99BUqt4GHh4HXRP7gC4E5+YGyk+TFKaUhMuSmbRKMnd7xFdOE/U1UnyBx8QRcKUwlzanM/ZlCXaRHMzn0LsnO3+s9VUQkQQe3+sZuCJdeJz+Dz/GB5y2tYYcffwAAAAAElFTkSuQmCC", D$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaOSURBVHgBrVdbbBZFFP5m/0v//r1SKb3R8peAImBaiCgICGiEaIi2JMYHNaCPigmgJhovBB7whUAxAi+omFZa24cWpChYUi5SEEWKeEtrawtoS1t6b//b7j+emb10ey+Gk5zd2d3Z833nnJkzMwxTFM55It3ySFeR5pL6SBONz92kTaS1pGdJKxhj3bgXQsA+0r2kXfzu5HPxL/6vCI8N4FHSNajy661B/m39IP++2c9rW4K8P6iNR2SvEb0xhY0D7qNbNfQwS2ntU3Hsz0FcaA7g3z5t1I+cNC3OgWWZbuQviEVqrNP+uYl0DaWlaVICBC7yW26C94ciOHi5F9/95Ueix4HpMU4kRSvwkH2nosh/VM7RF4yQcnQMqOjya1g3Nxov5Q4jIsDziUTtuARGen6tNYQdp7ugKAyzk9yIi1Kkp2RE9p8ZB3QFgIGwZUB+D6oRNHeFZVzeWpGA3LSocSPBbOAiT1dN8FP1g9h9oRcZ8S7MTHBBYHLqLsH1BzyTzdEdBGpa9Gf9woUtSeZWj4p/esOSxNo50XYSi8xZotgCsN0Ev3gjIMFTCTwlzoUwZwhxhe6Kfo8weN0M86czLE5hECNCpT7ye0TvJzQlzonkWBf2XOjBr20hE8dnYMEiYIR+i2i39ms48GM/HA6Rbx1cKhkWICqBh0jnJDJcvnQJvR2tSI9REIwwSUwSMdqCrBgzTHFg15luOZ4M2WJOUcXmvZSi2gG0DXBEuRyWobD0ymgbJB5L5zh9ugqVlcexIoPrgIaqFmmGCJHwuh3oCAjb/baA6w4rRu43md6faqSeTIHCdFAR0pDpkVANmDsN8He24HhlJUpKSpDlDSLGDeoDo5+RCqGUHo1IMObAN/UBexQ2CmwRgTzzTen1QeouOouQkqpmBICQoaK9LI2jvKIC/sFBtLe3o7q6Gg/P4MP6mGpGRNgMaArKf/ebcLK0CwKrzDc/tRBfMbdJI0Slh2ZSmMMiESbv48nTB5M4ykpLEQgEEAwG8WVREVbP5DKfoo+IkhmxHhp7mvgiZ4+Cqy0hexpWiX9E4aHQcNweiMhO5lQLUAT6w7rBkKrfl1PuT5w4gYaGBgkuSJw7dw43Gusw/z4jCpoeiQFi7xflgOkREHZ/a9eIJDcJ5Crm1GvsVI0xyaSaxSZAr6n0k0FdH0nlOHToUwnu9/slAaEV5eV4XAxGMk7LAgbIoYDGLHtgQyrGmjklFSMX5Ck3vhsdAatMUWGTRHKmc3TerJejX4ALEiaR/fv3I83RQ1OSKiHZt5y0mdMjwdA2RCDRKkT66LRXZoaRS8WTmcCeggKoqgpN07D9jVS8nD9Ntu/cuYNjR4/KKTlc2BC48SzSYYpoyZKYGe/ARDLDy7FwWginTp6Uzy/mJeO919Ox+51MLMmJle8KCwuxhgZj1ChTbNg9MdpyrFsQaJIEEpxGjsYm8FQWTdOyMrS2tGB2VhQ++yhbN0bESz+eA1+GBzU1Nfjlyg9Ymc4xkfgSLYZNgsA10Yql2j4rQTEWldEiRn8RTTffzChUFc6DyzX0bVaGG8VEwu1SUFJcPEYahmR+spOKnOVlrSBwxnxameW2deUw2YjCM9jWjPM03Qr33E/eRo0y/GiOF7vezkRZWSky3X2YFc9H2RH3J7Jd9t/OCgIVMMbBs/PctMkYzX7dLOCTAwewY0sGli+Oxniy7dUUbNrgRfGRI1iaOuIjLc8OQluSYXcSFYqxLn8hnuLdCtbOdusbC4N4eizHAiow6d6L+GBzBiaTgvezUHf9GJ72ccQ4dRtyf0Cyfq4bKTHWDDgssM2nAvPtK7keJHkYzLDlzeb4+fLX2LrRganKztf60dN6FUvThsKfEsPwwoJhqdshLpKAsUXaJ9piML67wgOx+XJROhYltWJ5djG8HjZlAslJDmRHH8TqjH4ZyWji/uHKaEzzWN7vM7dl427Jqv4O48qtPmzL3AyH2qBXNExNzN1Z2LMeO+u24vn5HuSmDtucWluyCTelIf9NaC1vIhzqsNaGyUhY450aLlcSHJmH4HYn2MHH3pTaSAzblosV8qs/wqhqVGldt/3Cxnfd62R47n4nNsxzIcbF7OATb8ttJHwYcTARRM7fVHH+hoq6Tq7/yIa8pZ07FiY78NAMBfkPDAMe0/NJxTiaFYx11lK1CK/v1HjtbTqitan8Vq8m340jBRMdzaZCRBxOD/O7ky4D2DeZ/SnPLT50PF9NmoN7dDz/D9dX/uu/OosQAAAAAElFTkSuQmCC", H$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWISURBVHgBtVdbbFRFGP5mzm67bVlaUIpSIVsiGitIVSSCGGrExkfrhaAkKjEqmhgVAlFfAF+MJkpJjCLRiBUvD164lKgvAkFAFLQEQ6xWurTSAsV0F9ru7jm7Z/z/Oedsz7bdXqD8m39ndmZnvu+/zE1glKKUKqPiAdLFpNWkEdIytztGGiVtIt1Hul0IEcN4CAFHSDeSdquxycc8dqT5xTDAbN060pcG9p3r7kNLWxzt7d2ok62QpaUwZs+BoHIIqSfdkM8jIp/VVOyB42Ytf7fF8NH2E9ixpxUt/8b10FJhoSW6Hsr9j4xEELi3FkXPPQ85Y4Z/yijpPUQiOiIBAuf4fuuBxy6msGbjATQ0/oWry0KomFqCqZNLUFIcRFlQYWPXV1CWBXR3w47HYHd0wj7fheCjy1G0eo2fCIPXEYmmvAQGWr7vaAeWrv0eUkrMmXUVJoULyVqhB7HVJTKDzWe/6B/vaV8f0s3N5BKJorfrEaypyesJ6QMv84M3NP6JJSt3YnJpEWrvvA5FhUEkTBspy0aSlespGzKZgkyZbumqNBCsqoIMBtC79EGYX37uwWgDXaxcAnASToM37j+FpzbsRWXFRCysvgarlldhZkWYwJUGTpoKKdMhIU0GTVJpanDDI5JMIlAxHYFpFUi8+ALSPx/yk1iXEwLX9a1cP9V5UVveeT6B228qRyBgYNHcKTgRvUDZn/IPQ1imsfP0ZuSEUc/nhUPBzmRgNf0ONaUc4f0H/SulkkMhfdZreX3LEUQ7ehAk9xUUGOhJpPHD4TNoP9un3c9e0GEwM0imMhBkrSBrtaYc9bzCfTJtwZgwAeJMJ5JvveHnqpe3dOPxpGc9ZzuEgCRddl9EZ37SdXci5YByySFg1cAEqJVyQavbJnWbBWmldazTn22Disc9Ak8wdgDO9qrlnU+PafBwcQGsjMKbDScgDZl1O7tWeEuAygKRAWViTgiE8MVCOEmmLDO7OlIfvIfQ2lf5H3prZwKLvcHfHWzHdFrny2orcboriT9OXsB/F0xnJiWc0Ct3Zk0g7SOgskT7vykLenspDGm9fDknMntooTkEWBYzAd54EO8x0dpxEaUTCnH/gmnoTWTwyGsHEDAMhAoNDCWFkj2QHNzhckSCQpHo001SONzTR49AcYhCIW6uZgIRrjU1n9ejegh4Vf1vmDKpKJt0ZtpGQVD6tiDHxqT0hUC5XxwD2wZodxRkeU546CPZD22nIG64kZsiATcWSCRMhCTPYqP5nxiaRZx+u4B2BhnOeMnzCyeuPKF0Q+CFhVu5zgQGCPcyN8HdUTrAHAI6CbUsOfMLuk6+AsMFkBjmqByD+H2WbSsMZeuMo49JWTkT4wM5NAnhqyMc9rpiTCCqO66fhSstHgl5y1yvSe+Ex3QnbZFi9mxcCVG+UlTfChHIRr6JCez1fhm1tTmDFMYXnEU+9LC/e59wt2I+iMrsc+eQnn8bZCKRTcLLzQrPEF4XthFA8PCvENOzl5RJ0r2rfaLZlZdDPrYc4y1Z61es8INvZexBxzHosLBq7obsOJ31wKV6QfmVgI1duyGuneZ19x/H7hVpk26mZAxs+RDKMHA54s8fVVwMY2uDH3yTdy3z34jWw1uSd8yH3PQuxczIseJSSNgELt/fQitsjtccdbG0DHspVUfo4Fj5NNDelruRjADqlex22bANoupmP/jQl1I9udNRB88T8+ZB7tgFPL4CthC5MR0AmqMT6dr18moYP+4dCF438G0w6ocJe8He3Qh88zVtXU2DB/FJs2AhcNciyGeeBSbmvJKiyPMwySu8P5DWD/nqsyxlHz+u1E/7lTp0UNktLbotj9T7r+FjFvdxulWNTbpd4MhI8496iav+53kNKZ8mEYzD8/x/Wb8u5RLRDOMAAAAASUVORK5CYII=", P$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZdSURBVHgBrVdJbBNXGP5mxjNeQ5zViUmJA4HShK0tJYBEA4qKSg8FJFR1kcqptyJVVQ+9VEi9VD0B7aUnChy4gEQpSNCFTW2BVgQStqQiASckcTa8xHa8z/T945nxOLEhVPzRr/ecee///v29x2GBpCiKmw27GHcyXsfYx9itfQ4z9jPuYXyF8U8cx4XxIogB+xgfYBxSno9+pL34v0QWa8DzKJvNKolEQolGo0o8HlfnuVyunCIHNO+VJK4MuI8Nl5B3s0qZTAaxWAwMTJ2rmzlOX6+OFosFVqsVbrdbnZvIz3gbW+9/pgJMGMX3lA4uyzJCoRCYpeB5HqIoqiOxWQFaR8y8A+YNOJ1OVFZWmhUh8N1sT09ZBeZankwmMT09rQJJkgRBEIosL6E8dKXT6bQ6r6qqgt1uL+sJzrSZ4nRLByd3k+VkMTGB6qzT9IQfTpsCh3upAU6jzhQqUqS6uhoul8usxKt6lfAmA/br4BTnueC6y/U5scPugGh1Fn03h0ffT7LImxr5NKyCBzTXP6I5xXByclL9SAk1F5xobOQh+PRjpII9TNkkqn1dcFR44XJ753mB8oG8QPPGxkZVlkYtFAreZL1KMzMzagzNFpndT5aEB44x1Xkocg4y83wiFkbvle9UMNUq03rdI0ThcFFv+kxdq8U+pFs/Pj6uJhuxnvFzYz90+zjE8Dk47TwSKcp8BQnXdixf/7HhAX0kYygXSDmaezwevTJImxZSbZcuWC81s+VmYo1HHd3NO+AfSyE8M4upJ3FE4jk0vLzbWGPeNzcvCEMjtbWTAp36f1KpVNFiskAXRlVx7MxhZOKj6P/1EyAXQ1paCmd1E0LBCILd+/Ak0I/Dv/yAqekpA3yuEqZkJOqkEFDprSOwQCBguN/sif4HfejpPYvhSBp7Xsnh9lAQsliBZNOHsHBZOAInUePKQGThuB5uAB8dwpauvVjVutZIRnI/hYGYwqD1lB7ygI9mFCdz8pjjfvHv3zEVUeBrboErdw8J73aMZTcgGk8jNMsh2/Ae7qXeQFvDCCSHhBTvgtvqKCmPWE9Wwua1WCCdY4mU4zXmMJvNczzDob7RB8Ep4d79ASRmQ5iJWeFirVaYDaPOxiE0EYDFWoNwJAzO6oKf/T7VfU7dq8sh1uUnM4YCbqNR9wU5fHVZYtXFXKMnIJcvH/H2DXgrQ3iUbMZ4ogLuKg6+miW44x+DINmw2G0HVy1hcqIeJ36+hDp3GtMBN65dFPPCFTlfGaxsFVnA/q08Njnzn3itHNDgElBMhUxOV23BwJgX1tB9XB2tRZP8F0aGHyE6EwQvpDE0+ADJgbM4f0fES6zZzMoNkBvfKSErPzpFAytMCvjzCvAoR2JjB6wO1tdjUdxMrYI9eAH3g6eRcVzH4PhxhFy34OWuY1iuZGfyECyL17MkrS0rb3mNoYDaCXtVEIHDGo9YckNWqEbGUo/adZ0QI3dxcqoLrQiyCPHMqwpas2P4/poXg92DcCxaCX5RC3jRWlKWd5EAu8XwrloFl/VfazzmS4SiMaiQIbTvw+iUDZnmj9De3IHHkQ7Uh3issdjgj3Ri44YP4Nu4FSPcZvDeN0vLYePmpiIjr+itmA4idyytYO/pqJqxnNq/ORVcp9rYA3S11aO9MoGrv51BIBiDxVGBVs8irH69A91BG87cHEXW+1qxAtQLZEpEGUd3VsDjNMJdxWvn8lH65ZI4vLtCym9TMI8yUgXSqQRODooItO7BHzP16Jfa8G/tWzhyl0AU1CxZWbxJKch6e5lkBj9C2POOY/LCp+fjmJjVWqnqgdI3oGeTZj1jjwP4tsthVqBwHGtXpEO6F/ZvscMmKHnNFaAQw+cFz1vPDm58sclmBj+kX8vKXsn+Gc3gm6spJGWWD2ouFC1fGDj7I/DPN1jR1WIknx+mK9lTL6UPQzl8/WcKE3HtVDRWc+WBDXwFdewu+uVmG9pqBTP4tpKXUpMSRdfyYELGib4Mzg5kwe4deW+U00ELl4PV+Y5lAt5vl1jX48zgT7+Wm5TwYc7DZCIu40Yghwv+LPqm5cJmrpDlq+tYX/AI2LlCRIVUJNqPMg+TsqQ9zQ6WemvJsqKw8Cg9E1mll/FwJKdkcnK5p9nBpz3NFqIIPU6PKM9HIQ3Y9yz5Cy5wpfA838p4LV7Q8/w/YurrWxk12DgAAAAASUVORK5CYII=", V$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXrSURBVHgBrVdtbFNVGH5u1452ZV/gsOBkZW5qFLEjiwz/DEXBEGNQAv5jQRckGCOEhB9+gfwAo8aBIWpGFoYxBsEoHxLj1IwZGRJl68L8QAarK2Ns3WjZuvXr9h7fc+697W3pGIO929Nzz+f7nPd97znvlXCLwhgroGIloZrgIjgJBVp3gOAhuAkthCOSJAUwFUKKnYQ6gp9NTvbzuROtL91EMd/dNsKm9L5gbBie6+dxOdiN6ZY8gbLC+aLMINvJGu9iMgQ05s1QzSzEHx7EsYsH8LP3CHpHLmVczGGfi0WOpVjz4AY4coqNXR7CE0TEMyEBUs79+62unO/2U/cONP13GHnTClBkm41CaxFslhyYJYuYIysyhqN+GnsdvrE+BIjscucarH14i5GIJxMJ6WY7dw+0Yvvp9TBJEkoLHkJudj7NYMlp+mxmXAQIyWPoGf6XKiZsWvgeHnMsGZdEOoFuXfkPnkN4/4/NKM4tFVBHMtBk9ZmlzTaQYIra4CVX9Y50Y2tlnbCIgUSF/pZIBuV10ALu9JWf8FZrDWZPn0soAdcpdi5JSdaScQ8aG8bEI1MXpH8Jl0cuwjfah4+qv8aCoip90m4isDmxjGZ6vntcHfNiS8tqXIsM4P4ZC8SOVQJIENAV6lXGUs3B65wvb44rcZy/1oF8ywzsX95ifFPmcVeYtMo2vfXs0Q/RH7oMs9mCGIsSwoiKkqBEIDMOrV1REaO2mCjDouT9Ud5GiCOGnGw7/FEfGs7tgkGEtSXtfffzitLTg2ClC51rrDDXzoLVOod2qfndaIAU06e3qRZQ3aDGQyjsRYwC0yzZsKiiFVKWsAKPgXlmqMerkEj9Z+AmWXgoDFOOH1kbZ0IyZaVa3xiA7AbdCQ9p4SDIxLMUcoUZSjyKsK8BNodwvzjaub5qfZ7S1CQIkHdhOhCEVN9LT1FChFbiiNIg7Vkvtfb2zmG1TWvncyReKgF6jWUCrUs/0eFmo8mquT6XID06Si/IJUHApL1pUoMPqO9LKk+U0RTl/b5RvLbNm9bHSyLFRoQL+Zoc3V3nEAxe1wm4uAucYvcdblWp+EtaVNo3SJ0xYH0+0g/OX34fE20tZ0bR8dcwjv44hML8LGRbGKpc5DoWF+NCEYbf2kNQyCdffTeCV+dcQIWrknc5zZovwILBVF8bpYEYm2TgZTu3T6K5q3sUOz4eQm9/TNRXbbiEkjlmfLnHQQtaE+NsVgntf0ewddeAiI0VLyYIFCRXGwsldm6EMbDUn3gCL6224/DeWZBlWaCQgvvscbqQXEnl+hmyaV0hmj6/V7RZrdMT/ZyAOBJNTifGvZ1raee1ORm7/uyKkNlNWPVMLgb9cfQPyjeM0TfzK7ms2GFGeVmR3hXgLvAQXFJ5OSarnEvfQBxtx51wFlvQ1hnG6bYwHijNzjjWYqF4OTgXJWWP6k0efhA10kMNr0WWLYWJglG8CZz1BMq5xCmyskzSTcco2oEkxxlkcxns953Quxq5npN6LevJpxKTGClnEygXcyZQzgwljweWu8LY3aIfxfwiKmBDQ4hVVuDCyjjG1uUkL6E7Ee1U5FZQyApV809Cstyj9xaa+b1MJA5Q5XVp5ky01tVgp7kR8IanlAAvny1Zi8VJ5Y1c9w3XMU/BXml5Gr7IlSklcLe1GHWPf4O7KKXTJHkdaynSHv7M7+s3F34CC+V7OvM7VZ4tTcM7lfVG5Xv0tMyYEfFYaId2NDf3HsUHHZsh032emgFNTvk0kw1vVOzFYscyvceDTCmZRsIJQ1L6T8CNnW0bcTXkTb2OJ1CsrkVpuq0Yb1fuQ3nefKPy8ZNSjURKWu4L9+Fg116c6PmC1lZwK2I35+G5khqsLt0AezIF8xCeJ+Vu49hb/jDhadqpq9+j+coxnCfLpF9a/A59ZEYVFhBeKK0VJAziwTgfJuMKjwnC7kwffXFFZl2BTuYePMXODZ1h3pGLTI7HxvtG3K3F1+2J9nHayCYn/jv+OM1kEaj54xICv02cmILP8/8BTFxWWhi5dtgAAAAASUVORK5CYII=", F$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZ/SURBVHgBvVdpTFRXFP7ezDAMMAzDDoIwgBgFEXCpS1zTitqksbZ1SdpolzRN9YcLsUmTJmJr0x/Giq2JP0oixsbYYrSptak2VqEqWBEBKyIBGVbZGQaGYdbXc++8h68WRC3tIYe3zb3fd892zxXwlCKKopEur5IuJ80iNZEapc8WUjNpJWkx6Q+CIFgwGULAJtJDpP3is8kxNnai+YUnALPV7SXd+fi3IZcVzQP1aB6qh94vhNSAaaHp/DqG5JE19uFZCEjML8NnZi5WRz/ONhxDSct5NA3eH3Oy6MCpmB+zAptnbEdMYLzyk5l0JRExT0iAwJl/z8rgbLUFd77ABfP3CNIGIzIgFqG6COg0QfBT+fExbq8LVqcFQ6Td9g5YRnqQk7gRW9J3K4mYxyIhPGnl1T03sL9sG9yiCynGNOi1Bt8Agf0XFcNF35Pom9LuHkaTtY7uVNieuQ+Lp+SMS+JxAo0y+EVzEQ5U5CJOb0K8PglQ+UAFQRiFHB3M3onSG9H3FV6gZfAB2oYasWful1ht2qgkkS1niaAAPwQp4O70/IHdxa8jRj8VsfpE34LZpIJi9fwiyNiPbCER4Ff63jLYgG5bOw4uK0Jm5CIZLp8I7BolIJmerR6dw63ILdkAu8eOBEMy+d0Aj+iGwzuMAPL7CF39VTqoVRroNSH82ufoHrWiw22HV/QiQB0Er9cDp9uBmt4Keg7EiTWlykxJYq7QSA975bcna49wEukR87Ax5UN46I8F3oXWUwjw0xOJQIRqIzDosiDZQKmnMSDFMAs/NZ9AXGAStCotTjd+g03J27ihHO4R2BNsOFT9EY5W53F3SMKsvVMl5fvb7E0HAV9o/g5RQXFID5tP0R6FYD8jt4CfWgujNpxWokeiYSZlgI7Pwixyp78MwVoj3dsw4Orjbvmz/wYGnL2weaxQqzV8IRebTqOLMCTZyrBV8JVXLsWt5+hnblhc3bTqGG4utUqNewPlUKlUqOy7hg57MxqtNdzPlb1XeQqeavgaCUGpuNrxMx8/J2IpD9bIgCn0Ky/qrFUI0YVRIItUSwplOF7amQuWKwmwqHCJTty1lMNP4w+jfzjmRa5EpG4K2mwPcLPnMkLIEhU9V5Cgn46ZoXPhT/7Vqv2RGpKJTnsrht1DiNbFo2eknVfKrpFWWoiKz3394S/4IOMTGXK5QGa4TTdZbq8ba39MgsB+R8rYr09+D7WWCiyMWoVOmmTQOcBrglpQ46W4N/hVIG0arMWQ20ruCsF9SxV0RKjZVkfjcigGHIgi8kfv7uUZQfGJojW3YaRiRlLJLGDiyWmtldIMMGjDMD00E8nBaRRoaRy0tOtXZEcsgcMzAqd3hAcqc9GN7kuo7ivFkuiXUd59GTOM2Qj1j8acyGU8Bi61nUFKcDqPATlXW22NMgGTSvIFldJ+GR+BLNppFTb3IEaoqt3rv40Iiok2GhgfaELTUB0K6vajhqxT3VdGrkhF+7AZ2eFLUdxxnmdCbtlr+LY+HxlhC4hAGh4ON3FwFqDttsbROGAu4KWjqvs69pRu4uZnVU+Q2UyGEAIzPa+WZIi8FwqwOHY1/8TgeElkK/TJZKE+JsKja9CjYmRhBMzsLiYwgRauwv8h04zp8q2ZIVaxO1ZSM8IX4L+W2KBEBGlGLVDJCFyRn2aHL4S0nU2+SNMuis5Rvi0WpFLMwtLImo8tlxZR+RyE7I1oaiheSdjKi49SWHn2sIiSxEnpyYQVpGhdHC9kdQNVuNVTMhqEolfEiRdL+ZyShGrYvkwkjtPDDpbX65Lewcn6r3xbLAUMq2wF9z9Xmm1CeWvaLqqccXw7vtVdIm3RwOqETUrwQob9j+2YWWHb72t45ZuUVBR9PQKzyoGFRUoCfDvmhpZapMPsnlnhs3mFfD/3NRV4fhHlZkVA7uyDSvDDclum7IhYLLB9wcSeK3uu4dNb71M8DD2fJSRwltq7Mw5gVfwG+YsZY7VkEgkTFE3pA9p284hEp71FasswMRFRnouKmy4WH2cdwSzqLRTg4zelEom/teWs3SpqOIpzzcf53o/xiChcFaAOxtqpm/Fm6g5l8JpJ1xN4pXLYUx9MWDbc7LqC39rP4G5/+Zj4bOPJCl+MdaZ3+dasEDPGOZiMKywmSPPHOvR5vV6xwVojUpyIVb2lIh3RRJfHOd4ZMV+Kr+cT6XBaKD6b9P/rw+lYFoGvf1xBmolJOp7/BeG3YhY44XF/AAAAAElFTkSuQmCC", U$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWuSURBVHgBrVdbbBRVGP5mZofdbRcoNFJ7oRRCRAxpV0M08UFKwos+GFD0QRIlXhIfCGDURE0UJT6oUWmRBEUj4IP3pMQYEyURa0KjBGO9X1LoohV7ke5u6ezM7M7M8T8z50xn224vpP/273/mP5fv+/9zzsw5CuYojLEaMltJN5GmSVtIa0R1jjRD2kvaTXpCUZQcFkIIuIX0AGmWzU+O8r64UuERC+Ap4rlZVjJPM2v8KLMLXVQ+5fsqyD6RvWlFqQDeQuYUgjT74jnDsI3DKBbeo/IfZZ2ZsGpsDWLxW5Fc8hiVW6JDZkg307RkZiVA4Hx+uyT4eGkMQyNPoNZ7E4q6HFqsCapWRz1TUBRd9CkRw1F4LAuvNADPG4aeeQDJ5megNjdHSWwjEr0VCUyOvHe4B/u/eRi71o7hprq1UNUaAp2OOfM9jP8YWc+A83EfcKQayRdfhr5lS8VMqCiXEPzzzId49Ou7sDi+FLWpjdC0BFTFJLWgqRaRoXJo7aCs2NCoXtU06PUboOoxGPfcjeL778rx/QCja0KNRH9Agp8ZPIWXzj6C+lQzVlQ3Uly2DyyBFCUAC33y2SdkBSSZhVjjSsQaGmHu3gWn53SUxL4yAiL1e3l5sPA3Or9/kiKOobaqDiVmUysJMqGKrzYlXpZN4RckPbI2kaivp7E0FB66Hyyfl7h75RaVGQgZvfPrAQyZA4jrCQIvkloiA3YAGGoAqoRkokSovUdEbbKOAzVFC3ZkBNbz+xERP2BVzMdOGf3Jvz7yaam02hyKvkgkAAEIM6Ii+jK1hVK9S7bIs1CEWnKg0SgOrQX30iVJ4D6OzTOwVXo+6TsOpjB/pdusAMs1UfKK8DARLScDcGvCcIrUpiieA384NS5Zm5OgTJSK/q7hGSkdOSzh/Fc7J7BJenoGvwi2GalHic87WX8NMA7AuNrCBuXvsgznDVf4TaFBPV8DikWWIvangQblQ7snT0anYVMMwYcFllPAgHGeXjYISVjuOFmiwgH8CP0lG1SSPZtNYpmu4LrFFsqF2rikOepjFoLoFb7Yyf3zT2CGAaW6mjdMx8S2QF/+l2BcXydeM5ZbgOMVfAKGo+Hb0TiKXrB2z4wGa6U+ofnPCc3DLbV8K1JWaAcoZryMluL/GLxz56C1tnJXiyrmAgXHKMOOcAhetcxAtTaOa1Nj+GBAR2dfAmM0t7mig4NU7rqoYR3VqYpBbYmw504CD8b0c3ehP1wH4YvIcsYn3q+TbSgeGpI2Xk//g1VVNmXZJXXQttTAa23/UiZsv81k4Mki0u8LJ+AfHBpSq2foUi66ynChEMNVcRdLdIY/xxdhkcoqtpczK8ug94KQHCeQ4aWm6tWYq/SMVlHUFl5pHcGh9BAakw5+zMdn7SdJqK1p6cpwAj/wUiJWhfXLbsBcpLmqhBc2/Ie6uOPrwbZhNBGJSsIiVlm/HkoiIat6OYGv5NPGuvZI8xkIJEtTfMsXuZgNnIu69c5odTcncAJiHdyx5kEktdTUXgsltA1i27dHPSdUcXo9zp9S+hLctmpHgL2A4GH09+6EsjI8IR3j2HIbdkjvjmv2YEWiAQshDJEkErC2e2+0+jmfFP8njkidvMyz8PTGN6DTeY+VjTB/8LCs61DfehtKU5N0dcpjWfRI9izEllxXk8bj6Y6ABILpmNeUCOLceHE6yh06DDV9vazNCCyUERBrYbNogPaG2/HqzV24OrEyBJ+VhCAqE8d42j/9jFb+tij45hlvTfxYTtovbxXD5kU2lN3DnFwVc3N04M1PKBMa9fE2br6Gub89RXW56AWlXxz5ZxdxHesvu9+4/cy1Oph7+cYAZDq93M5ccx9dnabckvrnfU0TV7OOaS9bnkN/vfSR/JK0m8q/k6/EKkjHTFezuWbjGJuf8BQcnUvUs3/6IhlBcH5sJ23DAl3P/we+QeSGJdIqAgAAAABJRU5ErkJggg==", Y$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcHSURBVHgBrVdrbFzFFf7m3rtve71Zrx3bqp1Nkz7sJHYghT4SGmzRoFZtaihQqFqhKm2qqoUENXKFkCD5iUAhgBQIQiIQQIqQAAmEECKEQMiLEALEQMCB9drKOna8u17v497d++DMfayv8/ADONbxnJ07c84355w5M8MwRzIMI0JNL/Fa4pXEceKI/TlLnCA+SXyA+GXGWBbfB5HhOPFDxBljfvQUnzubfjaDYb66+4g3X/RNUaAPDkJNnQUTBAgLFkBs7wATxUup2kre2Ib5ALCR74flZqtvYgLyE4+j8s470I4enqbAsGVx1c/guekW+H6zDkJbm1tlgribgCRmBUDGeXxfcoxzw8XtD6Cy5xkwfwBiSzOEhkYgGALzeqw5lQqMTIbGZqGfTUHPZuD5+wYE7tgEoalpRhBsppWrx46isHEDmKxAXLYMuUVN0AIGYin5IuSGqzWKRainTwMUnuDuZyCt6LwsiAsBfO0YL7+wF8U7/gMpHkd59TXIN0fxZUCCKvhxRbmMwOAI/OdSlkXG59otLNkgWTszQHmSQvCJJ+G9/rduEFc4u4S5jD8EO+Eqh95D4Yb1kK5chbPX99DwJWjd+TxGOloQCPgQO/Y1Pu1djTpdQuPhfnjHzpNhKxtM4+YfzD6Vg6CQ1Lz6OqTlyx1zOwjAXVwQXK43jevJJGRauej1Ah0dCJ1PgH1+CLkwg5JJgylpqKoCj1dBzScnoNXXU58CQZGJqS1zuWyzDKm5GSL1l27/q5lPNm12tqhgd9znfJG3PwgMJSF6PPB+/DHGJ4cwls4itcQDVl/Ep7kszv2uCaPDXyITKiF07H3KEdlixWIOwpIJjFqBWFNj6lR2PuqOuLlgZu/3jLP6/NVXQtR1iLW1EH/QCsNP5e1vC1GTLyJTV4NSWUCUst1oqcWy50fhP6+5AsmsZKQ4GHY+6CRoyUFoxQL0ujrUHD8JRi2s6rlYglVeTXrzxUNINKyBwBglsIhb5SRYmYrL4TKMYAlRbwGy6oU6KcNzzoPySIVWALweXQmNCVNro/mGYVR3Ri7aAj1cITAGlu49gJ6N63m3Wdo5gLXOvE0DTRj4yUZSQEZJ4W1f9cHYuhVte7dhaP0m/PRMGlmKI7txNYTn+iDd9T8Ij+1EX+utUJiEi8lAvqRiIlghUTd57XAEPVMD1vJZvPBgkgYOpIrm3rV8yqB398Do7EJ9Xw6ytguBR15GYGwUyV33IvZuFqXeGNhNN0M5rkGmeaxq1tJQLGsoKlpVH+cD/WlUVB0eyfTYSv4/zqUTX03YsWSmC82coNKa5CX4HxsRnAwjSdVuUJQQGffC/5cNGIrWIxX/IZSKDpm4VLZbMpotqmRcnxYWCwPDmZGC0xsX7FggW6hgWl2igRK57NSpUzi6bAXESATBZ/cgduK4WV4He2/E6Ogo0plxlMioCYJWxldcJCCqZlQTc0qvJSdGS46VSDVw+ZI+zVXm8IqKjhVdiJBxNTuBYHwR9EAQ7PQXGBoaQkNDA9jwEDQyphoGLkvVE8vSK0lTCcslsyQuaQpMB0uUpCNXkiT09/fTwXInvNf8Gv7OTvjuvged1OZyOQI2/3tHrb+67iwHkODS0ubQRQOjVA0FSq4fNTZC+f8WyPv2QT54EOP/+ifCFKL29nYsIBBzo6kwrFoSdjoTHMBHXIqFvfjxBSD4aZjP5zF+5Ajk7uvAKAlBBcXX1YWBfW8iRQdNo6ZibmSFqCteC0mshuAk98XbxLfzX9v+vBgfDGQo/wQzCcP76zA5koIc1RHUFiFHJXWMAHnqIhgb+wJLCwUwKtl3/rFtZtO8KFFCG1Rhf9kec3864JRifgxHNE1DOp2GSFcrOq3gvWcLTutvoa6goe2IgFfu3456Onyu6tuCU7FhtC4OIXu+Ay279sxi3IBOxjlHo1FTv00LBPtcfpr/4h/8fr85wZzcewtaP6ODZbkPw9dehYULF5rAUrf1IPSLEHIHJ7Do9zdjrhQIBNzGd3PbTjB2OL015GZm13L16p+jdt2/UXptEo3X9SIWi8Hn86FlxToU9ucR/9N/UfnDesy2es48mTkAF5kXVfeFhIPYxOUK3fH4FuOTOBip/xOU3ngDPrpq1ZKHJsiVnjVroP5qzYzGnZa7vpZOVy+/Y1j0MOndfCEAngsfwi7NCp3lBZ5kBMDhuZLbOOdQKGR6zqYEXFey6n6wO7rtAeYEdzgcno9xTuFw+ELj3e5X06zXcu6+UqmEMl1EbaCYDQAf46HtGQwG3eMTxDfQ75Pu8XN+mHAgMl27eH5w2Q3GWS3PcF66+U4SBMGtMoHLPExmWkmEJ+alHn0EgN4iFYO8YhAoU6Yacrk34g47v74dGdbjdLcxP8p858fppTwC6/54LXEXvqfn+TeQruVrmLsIlwAAAABJRU5ErkJggg==", X$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZsSURBVHgBrVd9bFNVFP/d13Zdxza2GR3I0I3EGBiOIRFYiGwYBAzGAAZEJxmYGAUXp+gfRhMgMSGiMYREDShRiIkRScCEfwwhESREB8o2+XJ8rdu6rts6unbrXtv3Xq/nvo/t7aPdRjjL2bu9X79zfue8c+9jmKRwzvPosY60krSctJg0zxzuI/WSNpKeI/2VMdaHByEEXEy6nzTEpyY/iLW4XxEem8BjJKkluCK3cDl8kccj9VyJ3qA+JZUhu9PhsBTgxfT4HQbNRp/Wj1j3T1D6/4E6cFlfaS3m5j/J8yQy8lcjs2AlpIxH7Vt6SVdQWLwTGkDgIr4nLXABLAd+RKL3OCE44XAVQnIVAI4sMOY012jgah9pP5I+P5K115Dx4uvw1L0PqagorREsnee9oVY4/bVAUia8J+Bw5tIKTouY6bedAwYeVIGjIfCufqjNzWSwhMyD3yLjmcUpjZBG+j8Mfqq+E4eOfQ3J4UJG9nw4HZmQWJwWKKQJatuV+oKDcHwX0J+S5IBr3jxiyonBl9Yi8csxa3/dQfONGmmASDgLvOFuH3Ye/gPbKogB9wyiOqGDMzuwZYjQbhnSV52Qegg8RkbGY/SMwTlrNpyFMyDX1UK9WG83YveIEJjUt4h2R6+Mqk8uYGv5aexcdY/AiHAyk5lJxxhsCUj/u4j2/T1AWBsKBufmk/6SmgalsQG8sBA55y6ATZ9uYZeIUFgMDFn0+YnbkOUgqhdd0z1miA97SlQz8pxxhXZPAIFBsH0+sK4oGHnM4oZKCYMFFqenqsCRnQ3m9yP22V7Y5D3dBTMeIfGjtXsQT9Wdxe6Vv2HHsn/hcM8kUEo6wQKzUSYkoBJ4N9Cj2jqZ+UqS78xgIUkNra0V2mAUSY8H05quQsrLF7NEpSwRDKyzlp/4qxMPZ4VQvbCBPCZPeMzwmLwXHjPhtWj7yfNd7YAvCpCXiFlqMABigNFvnYEE7aMk9GRjsozEwW8sOL20i/5Kq+fn8x3YsqgJeR5azJJkfsgIgwUu1EfgH7cSAwI8Zhiga8zQ2DC4CAt6eykMKhnAdCO006ftYagUlUQUHihaEsF7Pryx6RLRDl0ZZMEh/XAb031E+0edtKmKtGKVCJkYkQf1LrGfSE7t6hXwSAQsN1d0lwsDikXr8u0wNpZdxSPZUSPLmVFuGIUBSQL0UfuDAIErY4GstvgnkiVJ7CkUOnWkofqOOTnQugJwGgYUO81YYJorjO0Vfxqv2+gC7SdPtncYnkvmO8n58ERuWcKNtjBgNCml8xF7rRqxyioqz1QfjO48pzVhTj4BxAZ0K5lhrrF/G9FeS2NB03NNw1REfXY5Ym++BYXKcVIYRuuZzUNhgHgd8jI9MxEf4tM0YjT4JIVneqBsfhWJ9S9DmztXFLoRrEjSUAHuEwZ4ScvZyOMTaJ86OKe4Jmq2Ib51G3hObsp5TucQ8V7RatINkDLBPKX0KlEFbKcEetc/aXBtXikSW2qgrF4DTlUvnTgcDjsDjcKAs6Q1+mD2UvA7ZE9dh3G0IsWNxRR1yVLEa+vouSTlHEG/HgJT3G63fficVYrFQZTH4yEoVYsg3Q0blQtjDeC0gbJpMxIbKL6U2ROJZYBQjRKwoKBAZ8GUfKe4vdLgUfpRx9z5kJ7bDNw9NHYjK741W6k9HZOVOF1mWgZuoDnciFk5xVj58AZr6IjAHnMcIxyGsnwZpECn7n1yQbnusbLmBUqsnAkBu+N+3OxvxJ3+K7hB98eA3IZBNYrCzFn4YulxFGYNXdH041hPR9EgIw4IFkDntfPQYcT37YXy9g5oFGfGxs8EQev1yN9ol2/hevgSbg1cwb1El22CWaNI3yn91A5+wLqWMdtmIhcaYJbmOB0m0WjUPIqNaX1KkLxrwrXIRbRFb6J5oIGOiuT4VJiXEtDwh2Vf4vnZG60RL+lC68Ml7aVUoXp+1ncK9cEz+I/oDMY7078WJrCxF5V9Vz52PX0QZQ9V2MFTX0rNgfXmRLhcLpTNWAyP24OeWOcwAE8PLlGBXVX0Co6uOD8afH3aa/nQPuN8mHTJPpxs+R71PWfgj3rHvp6kRdPmoKJwFdY+Vo2ZWY/bh72Y7IeJzQiRE3sgEnOURNUI7kSuY0CJYIDaRVklBF6C3IyC8bYSyb3nvj9WzY/TI3xqEprsx+lEKWU3xPo8ryJdgAf0ef4/Axmk2Kian+sAAAAASUVORK5CYII=", Q$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATASURBVHgBvVdfbJNVFP/dr+3+0LK1Wytbtmm3oaJRtz2MyDAZhAcICQnESMQYF58lUfzzojHbA4+aMROVEBMxIRhMJj4ZiAaFmBiHyiRjKAYpdLpNRlfL1nb72u96z/fd293VdRtd401O77/vnt/vnHN7z70Mqyycc7+o9grpFtIuJCzEL6fjQiJChoWcF/IFYyyOUhQBHBbSL2Sa31v5mNaupJ8tA0zW9Qp5JX/OzM7jr9lbmEqOgzEDVWXVaK7eBJfhXkpVn5CBQh5hhawW1Tdw3GyXGTOBwd8/wqXJ7zByZ2ipZXjY344d9+9DV+NO1K1r1KciQrYLEpEVCQhwiu9pBU7AJ0YH8OWNkyhzlyNUWY9ARRAVbi88hsdek7FMJObjmBFyOzWBxFwce1qex4FNBxGsrNNJ7BMkhgsSyLf8ytSPOPzDS5izUmj1PwpfWZWzgNEv15Zzp8ed0XQmhZuJa6JvoG/LMTwYeLygJ/IJ3FDgX90cxDs/vYZ6XxMafS2A4YAyxnKQORo0xuUItxXZdfTuH5hKjePNzvextWGnTqJD7QmmgfdDbriRqYt49cLT2OBtFAQecAwmjUyz3q4YHGyClsQkAapgMURnriORjuFI92ndE0cEgUM5AtL1ZD0mkmN4/cIzIpbjeCTY4VjHJK7d4FgcQa3PtYBwxysZK4trscsIVdTj6I6z8Hmq1NfNFApDdnrV6Mmr72FSkCj3VMDkczCttKjnpczZdSbXTsuavhMCp53hZm7c4hms83gxmRrDqd8+0Mg73mby/z6trH/hbJcgz+Et84kQNNiGgGmxYgWst0dUGPiCN0Q9MRNFykzC66rCiV3fKy/QHmimk2OvUnB9ahRbQ7thGAZcLhcClUHb94wtBuF5wMijkYuH3A/xyhjMzDy4BYz+/TM2N2yjD+yjnQh0q6Uby9vQuvEJm4AiQVJsIU+QZLNZWJZl13n6umkPtKuP6QPadIoAtW13rpEAs73oiGmaNhlZ2olAmFo0oUCV6IqKAdd16aIRCFMI7JSqBnXgfIVrLboX3G47cfmNlRiXAlQHz9dLBOwjkTZHKQCXI5EDNXJ2x6kVoZZ0yf9SPB6Paton4S+K1Vr+cqstZKjmkWEy+1shPdS7etuNM5dn7VuOkwMYShEU9XfkPIs9HT7U1uamzqujmBKRPzabRdvbUWQ5OUZloLVS4DJFWuIktDDU24Smmly4A4bMy59Qr8brwv5On1xQ4iJUPvfkeh38OGH/Jx0nUha6Do8hlqSeIR1QrBeU9RyNAQODB+t0AgvpWF6RBqhdVWng2Iv35RYWXxbWUvrqP1Crgw+oa5l+I6K9cAnyaD41NINDn8ZQ3F5YyMUOeA32b/apyQiWupJJEmFol9KvryTx1udxRGNZLOTklYiouwBHaL2Boz1BbGkt18G3F7yUShKLruXRWAbvnvkHn11MyhUrEBBWe9wMz3auwxu7qxH0uXTw5a/lGokw8h4mROTDc3dx7tc0bt3J5C13XP7QBjd2PVaJnqd8qPcvOlkjWO3DRCNBe6JPyMv5c/RPGfnTtOtE2kJryI2WkAcBr7GUKtrcfUU/VuXj9Di/tzK95sfpEkTU83ybkDaU6Hn+L1vtjDmzzyqjAAAAAElFTkSuQmCC", G$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVvSURBVHgBtVddbFRFFP5m7v70h5bFnwdIkGKiqLWxPIiN1dQK+oyJURNjNEbxyQAPIokRsP5iILTR+KS2Gn3QB2maUmN8EExIxAfbYpQEDL21Ldi0ZZfSdn/u3jueMzuzva1d20J7Nid3dmbu+c75zpmfK7BEUUol6LGTtIm0nrSGNGGGU6QuaR/pKdJOIUQKKyEEXEN6jDSplift/O5i9sX/AHN0B0n3/GfM8+APDMAf/QfwA4jqakTr6iCi0YVMHSI23sJyxEQ9EA7HTybV1Nst6spjO9RoWYw0OlfjUTW27X517egRlXcH5rMxUIoNsQA45/c4CjlGkEph6vRpTJ/th8jnEfvrAiLUhzVrdMSCfoGXg0omteZHRhCMj6HsxZdQ+do+OJs2WdMuaTOx4ZZ0wHj5kwXPuS4mCNC/626U9/chdvw7iOlpQEpg/XoIAiu+G3qqmRl4586RdYGq9g7EHmws6YTEXCmCZ3pOYLyrC+LeOlT2/ob4Z59CTkxAKgXVvB3Bk09BZrOQmUzoadrkYKy2FpIYuvr4DqS//sra1wGa+prLAFc6TMF5fb1I7noZQVc3okGA+P59kGNjwMbbIIeHoDZsgIhEIP4eRHDHnRAXzutoOXzNAP+4TX15GvMuX0bihx8RbXzIwrUSC3uLDBjqNbhPk6898zTQ0IAIgThEpRweBrZsQf71/cDaasiLFyHPEyiN+6/uhmp8GCKdgSAWBLOQydIzq/876zfAIUcmn3tW15ORPbYobQoO2pGZo0eAQRfypps1lZIKSlNL9RA/dABi4oo2DuoT4xOIvNMC+euZEDg9c6GUUOHKSipYCmz6wJvhdOuApcnHC/wnGBxEtuNz7ZUzMkysEq0bN5JxMjg0BPHnH4XKz6R1HyrK4fx+VjOkI9aOZQtssIOGCSfvaZu5Lzvgj49bB55nbO7faXvSJ7ohqcq5M0ptjkrdUwt1+2aqSmrXbEbug8NQaxOUtgBey7sI6rfqMa0mDbDghhWRy+li4wLNfNRm4fTWzlhNtif/7TcaXE+mNR15/z0ISoP3BlFXRTRSIUY+PAxBhSgmJxH55GNqD2vAohOZ2VrQz7FxSM8r2vVodYWkSRANvdSoV5SrVFUFHFMYjnkh2PUK8rv36igircfg9HRTZ4CFRWB2RxBQ6Rm9J3APv+EbXXtpFHLdOp7Uxw4kmY48bTRTDds0sHVCGEU8juDR7VC33ApxaQTyzC8Gx4DpJTgLDEoPyGFQUMrMCjuw5uTPiDzQwJNTEZMLKFoiRcD5wpvL9z0FIN4FLaAws21bL35VkiFr36dlbBxIMAPa9Qzl6yrtdI7jQLLyZAIreVwuQwLePUkD36fDM0B1IoGyigo9xgzw7pDgTYc3FvKgEKWJVGEFhB0gYN4ZFTkhGacgKQ7U5RZHLsRKxLu4RGYdcNmBfm4xeGhg1USnWBbPwD5unbT/4lTtVpTJ243KfDthDJJT7EAnCnWA8vLy4kurIWy3whSfkU5pbq9f8D+mpqysDKshDM62OQVGOhhbmMEaegzYiclkUs/gurB6vaAsAa0AtlFNl9eQA5v5ZiQNkEuPNgtaVVW1YmmwdiorK8PgbfZaFr4R8Y7I50IN/8/S7jdNJ2OYgeUwYYuPlcFDxeeSbrUfLsX1YDqazQT9AjPBoDaKpbASBrZszgNvDn81LX4tp/yl02k6W3LWUSzmAEssFtMVH5rvkj5B//vC80UJIzUI3ZCtI3xeeHS2B+awscYtKK+iKN2YOOJQvsORu1iqcE2Qti7wzUfbekBfZ54iVhQ5pdu+76sS0hq+hi9bzGdah1qe8Idsu7qRj9OFGEHh/vgI6X1Yoc/zfwHg44pGuNwetQAAAABJRU5ErkJggg==", j$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAW5SURBVHgBrVdrbFRFFP7m7i1029oHBcICxeVRrAZ5FUwkQm0iGPgjRBF8ICH6ixDx9VMDv/xjTEGD/jBqNRBCCAFjjPwgFmLE1KAQaKC8ZFtA+nQfXe52H/dez5m9c3t3u63L4yQnM/fOzDnfecyZGYEiybbtamrWEzcRLyYOElc7wxHiEPE54lPEx4QQETwMIsVB4hbisH1v9C2vxf0SW+woHkWmadqpVMqOx+O2YRh2IpGwLcsaC8iu8fSIMZQHqWlD1s2SSAFisRiGh4eRTCYLCispKUFZWRkqKiqg67p3KETcTGEJ/S8AUs7xPaqUs+JIJAKyFpqmSSXcMpNAtQbkFdmm02m5hkFUVlZ6gYQKgRDjWc6W9vf3S0UTJkyAz+fLLhIFHScBKNAUItmvqamB3+8fE0Q+gBtKOVscDoelxcysVPF4xCAUszcYSG1tLcrLy70glqhdonkWtijllFSjlCuXq34+ewEqVusHBwdl7jjEOnbleMBxPVuPTCaDvr4+aUFpaeko5RgjBMr93pZDwaySNhAISFkOzeZQqC8XEWc6L/YmW771hcKRb710r7NW5U40GvVifkeucypcWFnf09MjM7dq80bZCpuFU2KtXQcRjcB3+rTrOuvRIIy9n7tWF/IGe4BzgXcJ9z1e4ByYzXtkvVrYdr4Xl7oimDutDM/dvAlt0iQIaTGBm/8YfJ2XIOJDJNmxeqAfbRdjGDIyuenMSaha4ujdFCnnbWqhoU5gTeN0HpWlnQE0qXXvtV5F5z8Gtq+ZgedJkSAx5ptvwVq2HHZgBszqKphPLoTv5C/Qjx8HUkl83daHc6G7KEw24okMokaaupbkFfOjCgBTEwPgwoNEykTnbYMs0eDPJLMG0VYUFzrgGxiEuWoVWTwA7XInRFcXFQnKatpiE3WBZNqSFgtXbbZvkEwjaTpfWT59OYIE/fNPlHmxmIMR5N5ff0edOQJ6Jp0VRiGwGxooWpQinEgmWWEkYD6zkqsUcYrmCQwTAOZEymlJQYTCYiStEWdwHB3513tdjwV1JxaIxDOuDcLMZIeprptNTRBXArCmBSB8OuwSHVZ9PTCc9UCaQCVIqXAsty1KvJyczPeLwDUK84JZlTIP3ELN7lIT0vpE+U+7dQulmzbKfvKjXfBdvAj9yOER2WZGupgOR4xLCp0DxnF/Vgey2wGzp/rdULX3abAXLsqR8cWVUhwIT8n5Z9KcC7cM3Cs94nftjnAvRLy4fnqFO6H92hAuN2/AiX9n4ufapVgSv4FPeufRyDx0zo3hqj+A9QN/oOKJdeg9k0ZxpNwgsHROlfoZ4kLUSp2t/NX4wW84380JomHV41UYSpg421XYwheX1+DPkIFQf7II5bazDW00zPDjwp6VaqCVPXBSAdg9L4yOk0egccbeEFi5dhG2TG5E90CukgUkZOed4/i1/TqKIRvZwsRFaeHql7xDp1Qp5oOo2uq5g8yyJdCodHJysNNuv7EdO6pfwE/nY3LF643laOk+gOrDB4pUnmXL4ZIzZyHqZqnhGnUa7qFmJ/cz778L7P/eBSBrfl0dDr38IaaW0W3iu4+hdXehWPICwOZXodPZ4VArHVrbRh3HdGQhveIpaFT1hAfE/ZDtZbLad/QHr/Ujx7FzRdorf1dVQf/qG9h4MLLz+tqnLV7le9W1zDXOyYWzUJfRQwdhvb3DDUXO5CIBKNdrn+2DtmmzGgqh0JXM+dHsTKAFr8C3/yBAqG2P0GIVS548Bb5jP+Yrb/a+mjTvYsctG5yJEKvXQKO4gcBY+cLHU0y3Kby2Bb7f2yGeXuFVvmHca7krrMDDBDe7YX25DzhxAugKoSDVzwf45rR1G8TMmd6REIp9mHhAcE7shrM9cyhGR3dHh9wx9hDVh7lUpufMgaiZVEgUJ/fu+36sOo/TVvveKFzs47ToxLZHnufPEvNRGcRDeJ7/B0uXU5mCptNqAAAAAElFTkSuQmCC", K$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUySURBVHgBtVdbbFRFGP7m7J5uly3dsy0X2ypsISFgYgBDNGAESUhIRBOIDyJE8c1EQxQffPEBMMRXxMQHE8Dqi/EWwESJDyJEU6OtgoKkEpEFi9Smt91t975n/P/ZM7uz7ba0tP2Sf8/smfnn+28zZ0ZgmpBSOvTYSbKFZB1JlMTxukdIYiSXSC6QnBZCjGAuQMRRkqMkw3Jm+IB1ca9gjz3iCSgWizKXy8lUKqUknU6rd5PgqBe9mhCTkEfp8R1KYVZwXReJRALZbBaZTKbmZH6/H6FQCA0NDaptIEayldISu6sBRM75PaXJNXEymQRNANu2YVmWEv7v6YAioJ75fF7psCHhcNg0hMl3kc6lSQ0Y7zmFGQMDA2rCQCAAn89XUhI1A6cM0EazLiMSiSAYDE4aCWEoc54uanLKLQYHB5XHLEyqZSqwEVo4GmxIU1OTSothxHq9SsxEHTQ9Z/Jc0cI3fyQRG8ijbziJRLYOa1ryCDc0YdsKG9HlkSri8WDD+f3Q0JBKRX19PTwO5jpQjoAX+hvcLhQK6O/vV4o3Tn+PN/uialjIzmOsEECoLoexbAAPJ//GW4e3g4qhygDzyalg4cJltLS0qNrx0M6psAzvFbjYWInzLSnvmZxENk9epGysiPyHoTEb2aKLBQGrTK48MVKk06SLVdfOyEjV3vSaGuPl/kXtPedeK0YW1iFTkMiQAVl65q1l1HaRJqPCQR9qwSTXxuj5eG7m8LCPubkGduo3P1wdQFfPIITlIwUfWnszyvtnHm2GE7KxadVCfHsljjNdgxgdHsXnPw2pHEpFXDHCrAcpXYwks5BuUUX2wSiw45H7uUtt7WzAFj344CfX0flnnGYj74SFHdk+tK9txes72hCsK4V7fTSEpWEbPcc7cfiLXkwNidF0AfFUnpquktVtw9oAxhY2YJ3+19kTV8Sl2hTooewcWVVQ5Il0EXV+QV4A2x5ycMENqHTAGy1RWdO6ncoVkcoWy/OpOXtHMZDIYlFjgIeuYwOi3LocS3hjRDme14P34csT59Atl6C1ycZgsoi2iI1fzl/FFf/SCQbwD6u6rqQlLFEoGkuznCOBa/+mtAFRy8sFVXcBVRujp9DZuBptXeewe+MivPF0K1rH+iG6fsY1q4nqw1WS9p6Zgqs8TuVcg1wY85baf90Z0yyOv5ItWRUqrXCzfjGO3QKuvNSBtkYfzt6pQ3fzZnJz4sYzKcohKs0bpoLWYAN4cTqtTqCa28DNwGKcxGJglP4sxKzhVAwY4RTEuNW+dAHmF5Worm1v1C/VTvgbt2y/hc1rIphvLF8ShLOgnPlL3DpPso//HYjGse3rj2GJUi6EZ/FsIb0K4w1q5YbtZtcF4W3F/CFyJO3V+Q3rYSUTqOwGsyUvieuJ3X0R4oFlujtied/lD/mfcBxYL+zDfMF69jmTvIO5J3yOEY8jv/VxWLdvT1iUM4U0hYh9p86YBlQ+x94R6Zh6zee4949D+nyYK7AB1pG3TfJj+lg26ZHM/exTuPtf5u911T42E1Kde+vd9yj8u3VXDMaRbMpDqfyxE3L/K8A/t6ZthDSfYQei4yOITY+Z5FWHUstU9jp2eQMhNm6CRXnDnr3KEzlOanmshE9Ku/fA6v51PPmu8XeDaV9MOAruyRPA2a+oXG+gJtrbgSefgtj7PMTKlWZPDNO9mBhGcE0cInl1QiedG3H5d7ViJAlWEBkRiubmWlNxcR+658uqdzntkDMDX2TfkdO4nE67sGXlev4EyVrM0fX8f32wBvJ9uKhcAAAAAElFTkSuQmCC", Z$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZxSURBVHgBrVcJUJRlGH5+dgVaQFZQUVJcD7wVPJscZ9S0NHXySMc70dKymnSapqasIGmmccZRmfCYxgKnaZyhQ3PKHCOBUMkoBVTEuHa5EXAPlj3Z/Xu/b/8ffnARRd/Zd7//O5/3/A4BD0miKGqpWEk8jzieWEeslbpNxHriAuIc4jOCIJjwJIiAdcSHiI3io1Eam9vb+sIDgJl2icR7uve53B5U1FpQ12SlBQRow4IwJTYSalWAv6UOE3/Wk0WEnrSmIgs+M3MytTrx5akiZOXXILegvttUkf/PGD8I6xaPwarnRkMX3V+5pJ54AQmh71UAAmf+PS2DM2CTxYpZm88gsJ8KT0eFICpCgxBNIALVPo3d7V7cMztgpLG1jVY0mxzYuXoiPtg2HcOiQpVCrCIhCnoUoLvmZVVGZOZVYu60ISgqM9PCLlwqbORmZzoLgjyvqyVsdjduVxp5/6kvnsesSVE9WiJAAa5VgmdcKEX8+gy42oHRwwdgnG4ALhU1wekW4XB74XARO0XYiZ1Ud1Kd9bEyQKXC5NGR6KdWYd5rZ2itMhmGKyhhdRUAvoDj4Pm3GpGQdBHRg8PQPywY35wt4wubW10+YJcPyOHycHCHBM7aO/qoPWZoGKIiNdiWeBEl5dVKIRK7uEAyfSX79ni8mL3lR9wxmDFjwmDJzgJUFOEerwil7VnRxfyi3CZ2+Ca4nwPrJvyENbPvIWzmDxDUYfKEkcwVaoX2kv/sWLNwBMpqrLhZbuErCmxV0ojLy8HFThA/JPB+YLauAYnL86ARa+FxWVBYnIr4qR/Kw1h67xEkfxhZS7PRTj5xwWprx4aPc9Hm9NJCkgCQlJcDsFNv3iYHIKPIUDvemleIFXGl8HoFtLRWI/lOPb6ta0fVe8XQBoezYWxfGMkssFKeWNNowWXK8VmTBqO0upU2mGAKKEGCE7hWgtCB6peWTDZg74t/Y2BIGxf+stGJrfl6VLU5AHJhSt5RJC7gVuBbO7NAGn0ksJYVe87h3JVaqAJUCApSUxlAQRiIOVOicIUywKeohC5/Cz6jhz/lwP7Vl7FkIg8lWNpFfFJqxElDA8wOcqXXN/6Z6Jn4a+cfsrzpzAJs46GUaifwGrDE8NBAm8NDu5kGE0Zp8emOOCSfKOIbzbWSlvu0XjbFgINrs0kIJ7dOHmmdUHQXNfY22Fw2OTD439Xaf2B1tSE0MIQ1xLM01LGvayXNXQayn5HSLmFZLMbrtPj8zelovOegFPNI7EWwyoavNp3H15vPIjzIAovLjvdvN2DR1QpUWI2wuRXgssuoLGupkGXXqSVfoLXNrRjpY7PVhT+vN3CXa0MDcaPMCPIK7108yYDUdVkYFmHlvs0m4V69cRd62gW9orfTPMr4lIQobSlH/NApPA7kNITV4cb9JNDB04gj35dgxNBQnnoDQ2w4sCYX62eW8BFGssTeUhOOGR72+BcQGtRxPoAJwGZqR0WHo0NERYQXlfIMhaHeirUzypC6/iIiQuy8LYe03lTYhFq/wvdMYT7/MzIxAfTE8bEx/Tv93420GjqK1+eQ1rd9s+j0SyKtU/R9u/RMGxonf/KdsJAJEKrph2ljI3H9P2OXwcun6nFsYyaG9G/j9d+bHdhxswkG+6NpLdPYyDEICdTI1QKWBdlybcmc4ZD39IgQB05sycTpN37m4GbS+u1bLXghv67P4IxWjluqrObIWzHbPbSNLTaMWZmBebGVOLIhGzERrXzny2pxYrsU4X0isZMr3ymCThsj9wxQs7saCXGSKrvZ0Xkh2YNZmrOUbgL39Ufk6+OGx7jgKs6shLhNSvB0hn3fcQxPK9xFq/FbfTV2Fbegztl3c3cIQKwLj0HWK78oBeDHMb+QSFekFN6sCkNx1D6s+LcBdSy9RPSdFHOPLz2kBE+Rr2XKG1ESfCmJuOhnkfbS0c4F+iKEYi5ba/GYhXKPXsLi9MBL6fnyTOw69y705io/o3sHH6QZiIyX0zF/xFwleJdLaa/Xcr2pCvty9yOt8LuuAwX/oIzUAWpsnboRBxYly5cPGfzB13KFEDp0e5gwQQ5eTcWvpRdQYdL7m4YJkeOwgvL89RnbKeiGK7vYhId7mCiEYPtDEvHu7n0mhxkFjTd4aXZaMDZiNGKJB2oi/S3Fgjupz49V6XGaLj4asYfs4cd6nPoRRH6ezydmp4kOT+B5/j/Pu2CeCH99iQAAAABJRU5ErkJggg==", J$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWnSURBVHgBrVdbbFRFGP7m7HYvbbcsW0oNVFkuVsBGQA1GE1MQTXxB4cVoNFEf9FkfNDxgiDz4hsCDF56s8RKNJiUmJgRJhAcgRKUtV6VKF0Wg9H7Zdi9nz/j/c+bsmd3u9oL87b9nzsyZ+b7//+fyj8A8RUoZp8cO0nbSjaRJ0rhuHiVNkXaTniA9LIQYxd0QAk6S7icdkQuTz7gv7lTYYg08Q7J2QV4byctfr0/LszcysncgKwsFpxqR/dp7FUVUAU/S42e4blYymXPQeTGNrhsZnL9tz+goSdc3BbFtVRSb74vgnvqg2Zwi3UphSc1JgMA5vp0eOAN/0TWBI73TCActLKkLIhG1EKHxg5al+tjSwURGYiInMZi2qVzA9rVRvPhQDInagEliJ5Horkqg3PLz/Tl8cHwEeUdgVSKEWNhSlgpR2lXV8a/6l8jaEhQi1bJ3W4L6Bqt6QhjgHKcuD/xo7xT2nRrHslgNWhYFNaqgh3DLsswMKYt0JJdJr4/ZGErnsWdrHI+0REwSm7xVYhnD7PHAu29mse/kBJoJnDUvLfKCpZ45VRZUNpTebanb9XeszbEgYtEg9h4fxdXhnIeT1Fi+B7Tr+7h8a7KAd46MYHDawbqmMISKM1ttFV3vulz4/tOuF2Ue4D9aHbgymMOSqMAnzyVQHyravJJDYRnWK/mqJ43bUw7CNUFtkdAWwbWcrSWluQmLEB2q53Je1blqG55xqG9tKIB+GvP7C2nD4XhLhUDH/jXP+qN/ZsiyAA1u6UE0Cf1kMAVIwK2LgeX1btkl6BHRoWAlvxQke8/CD39k1KrS8ipjswd2eDWdl6a0qy1kqXPWFtpqAi14lrpPfm+NS6xLSLdNt7vfSE0GRY/wmOm8IIxpD05t7bw+2r2aM//S0uGYk28dYj5Gr/UhDquOtybPr7Qi8WCjVIDfXBF6HnjTQs8GqpiiJVnguS6k0nP9eTMM7UyANx6kaRO5OUmwVkCx5RmXsV3gkLlW9PitiwCa4IjS64oY0GsePZpJjsAzNtRY7piS9hab5pCkTUyR3MgEklz6a9jWzLW6U14NYFsSL7RK7FwtS3h4S3/Xo4WS+m97LXT2gmJvLBPhEpGkPNdaGtTmlAzqWGCSZpEQ3kajnaj72+Tmr38XuDYOvLxWoimKijJA4f2oR+DiUKm3eMlK6Rs3RCuipUG1xot7pDs7RQX15eQNgSsjAm+0Odi0tBT8l1sCH58TZEg5LbVN6jC4Xig4/rgcXRW95Q0BzEfYyrHczEM0NY4K4CYJ/9kQLvYfZQIpLq3w9nuBWYU/aWuURdABvara75WYryQX+yckE+jhUn1IYFm9VXrIVJD1tO6X0Bz4sU/gvdMWdp+ycOxvgaVUd398bhKrEwFvBbB0M4Hj3ttTK0Nln88csK0R2HdWoOOSUCtkmDbOQ+cFPiV9IIEKIo1xJLYkSzBOCL0V80EUH6YD6JXDE7RUAv6xWxYT3hP83bRUIuTZTKECAT6YHOpEiUvH8zE01xU3lsWWPpc/5zfOdJ5mL3AHk7gh1cBZZoIX8ZU8uyZkgncwtvd2wKt98+EIYiHd83+LLGpzncBLbWGz8X3+UQR0inSQyzwZdz8ZLZ7nfqZzB+C6Oydy7z4ewdLaovUHvbSsakr2U18eH57JuhuIsTUvCJz+GPztzWEKbY3XmIKRks2alJ6+buNQV46SCWlkQHMR8cEbKQ3c9UQEbU0lmXHlpNQgUZKW96cdfHkhj2N9tp8Ni+rY/FNDnn5mZQCvbwijrkaY4LOn5QaJJMouJkzku8t5/HazgFtpnf8J/7TjWCcpv3lsmYXta2rQWFtyhqdQ5WJSVfTV7ECluxYdXLKn35an/snLY1fz8vKALcczVa9mB2a7ms2HCF9OO+TCZEQDJ+caf95TW/rX8y2kG3CXruf/AbIYg/EzTUO+AAAAAElFTkSuQmCC", _$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYESURBVHgBrVdrUFRlGH7O2cVlYWEPjHIXFhUwHHQlxRsGVk4XdYxpGoumUWeqX1r9aKamP0LRNOaUOjTTTFNKP/xROhliDoPmSpAmo4kjAkEKLihgCOwF2Bt7er+ze9bjursg+u68nHO+7+N9nvfy3TjMUERRFOjxCmkJqZHUQCr4u8dIe0lbSRtJf+U4bgxPQgjYQLqfdFR8NDnM/nc6+1wEYObdHtIPgvtGJkbRde8GblvvICZKi9g5sShMXQqdRhfK1AHSynAR4cJ5TQ8TfGGWpM/SjyNXj6Kp5zxabl8i4BhkxWeA51XoGTXD6rKiIDkfWxdvwqsFW2EQMpUme0k3EIneaQkQOMvvcRmcvvF3XyuOtdXi4sBllBe8BhXHY9wziafm5kCr1mJp8hIca68FT+3eqSl8fLYSjTt+Q0ZCOmI1sUoSZUSiNSyBYM9vkWcWmxX1N09DFx2HBK0eg+N3sTK1EG6vGxp1NJweB8YcFni8U0iI1tO3E0eJzJq0ldCoNNiYtwHp+rSwkeAV4IISvKH7LL76oxrdozdQmG5EclwSTL1N0FLOb9sH0NR3AdfuXodeK8BkbsLieTm4fq8TNvc4UuNTcNN2C88vKEXFmS9wqf+KDCM56Md6kAB8BSeBn+o6jc/P7UMuGXWIDhSlPY3SrGIpvzfGehBHxZaVkIlsUjXVgNVlg3PKieUpy6SYxlJ9rEgz4ndzI9ZnrUXNpSM4b76oJLHngRT4Q98jxWjMjA2HNsHmsmPfxir02fqRqc+Ai0JucViRKWTg35Gb2Jr3MsbdE1ievBSne85hZHKEjPEYnhimdHhgc9qRHJskpaJtsAOfmCpxbfdfEChNfslmqeAV3kvy6dm96LWY8cLC55BFwC8t2kjhzcPw5DBKDcVU9TyWpRTg4p3L4KjoymvfwS//nEDHSDcsLgvUKjXm6eZhUeICiPT7yFQBt+hCv+0OPjPtVQTcN705fz5GZe+zvy6QEvOsoQQZQjqWJC3GlcFr0M2JQedIF7bkvIgzPY0YsA9iYUI2HFR0FqcV6zJWEfE+WJ025CUuhOlWM/UbUJazBV+e34+O/7oQp9bB/GG7HIUxKQpEYAe9HGYtJ9pO4WRnPTieg4o8mRubKL2Tq75kieyVk6Ym5CbxvkucYk5J7fSHPUfGR+H2uCB6vSg3bkPpomJ52E41fGu7JEVzC1FUXEjgKinUTNn7bEWUCIiYorXBS+DsyWwqpIR9sYVHGsCUDWBeyioqXQyS7u5uDA0NTUtAac/j8Ug4fjEyAgb2xjqCwZWGQklDQwPq6urCgittKVVBwMBqQLLucDhgsVgC4Q9FRJaWlhZUVlaio6ND6jcYDKiurkZ+fn7YKMgRZmnQ6/XQarVSf4DA5OQkrFbrA/kPBS5Lc3MzNm/eHCCUm5sbdiwDlkkwAoIgQKPRSH2sCNl0EBhwJMBgaW9vR1VVFex2O+rr6yMSCK4lBc4YiwBbqI2M3fDwcMD76SLAgHU63/7vdrsRFRUVdmxwCpKSkmTbrawIr7I3BqhWqzFTkcGZRAIPFjZW4VgrQzxHup19xVxvg+dkHZFhqzr3SCmJJFIh0m+Knupt5UBiotzVKC/FbCMSvIMD8BStAO90SNskhwhntpmC+5VNPC9FOaqF9pD5gdNSAu8/q/3IvviUVPCvv4EnLXL58dt3KsFrGPZD2zEtBnCvXwt+aDAQgdlGQVQqAatOnASXli5339+O/Uekg1IzLRLq736A+Jj5V66dIhUe//0hJfhB+Vim3Bkq4DuzgVu9GvzBanjZ/FV4MRsSXlpw+G++BW9cLjf3+rEkiXgoFS/8CXH3LjqTmwMDp4uLqHiKGfPBH6oBt8yoBA99KJWM+zrKIEdizTrwx2uBN9+SqlgM0mDggMbHA7veg8rUGAxeFnw3mPHFhEXB+/NPdGohQp0dCCmrVgPPlIB7+11wgqDs6cVMLyYKEsxCBen7D3XSzinSooWJcUoy+ZyaCi4zC4iODmWKFXfFrC+r/stpjfhowi6yBx7rchqCiHw9LyWlC8CTuZ7/D053DjswCuotAAAAAElFTkSuQmCC", $$ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaOSURBVHgBrVcJbFRFGP7e24Neu10sV++FUhBqaMEiacNRvCAgaBGoRqGUQECjKTWowQNqEGsi0FaJFTkKJnIFhWgwmIDQYmkM0iNiKAhlaendpbtp2Xvfc2b2veW1dEur/Js/8+8c///9x7yZ4TBIEkXRQJqXCM8hnELYSNggDVsImwjXEC4jfJLjOAseBRHDRsKFhLvEoVEpXfsw/dwAhql3WwhveGDM7YJwywRPeys4EeDDw6GaNBmcRtOfqiLCnwSKCBfIa9Kcgy/Mvj6rFY5vv4GnogKei7/3UiBKMj8lGerMlxG8aDH4uDilShPhuQSE6aEAiHGa3xOycWrYvutLuEv3A1otVFGR4EaOAhcSCk6rkSLihtjVReZaIDS3QDB3QrNyFYJz88DHxChBZBIQNQEB9PXc5XKhp2Ab1IcPQZWUxEJNQ05X9UUuKlrRZoPn2jUSEh5Bu/dAmzo9YCQ4hXGa82rZ+J+N1YjkRxGntRhWdxWaI4fAEy/JYt9CkZiisgRIlFv4ZJHI3ps34DGZELKrBNqly5Qgpso1oQRQCKngLt2pwqy98/Bk9FTsW7ALUbox4GhYf/wB6sqLEgD0CoMoVQMzzn6+Pg8B4W1rRejPp6BOfUqeXkQA5PkBSKG/ReU71ibM2jcfLT1tSI1OYV6+npRFeDnzXlVeBs3xY+Da29Ef+SPggwPB64W7phri6NHQlVWAI2mUaCxNBS/92SL3FpTvhMnaAK1aA4fXyXjvX99hxal1aL3XDmFOBlwf58M7Iw2cwwHO6fS1TPYx73KCd/rGeI8bqrAwcM3NsH/xuRLrBimVLPddLDmWBkwqToVDdEI/TI+44TG+YBLPaahoBFZPWYF1yauYBtXZM9AcLCXRaINcUqIvpKwGqCwQwdtwG17bPQghIQir/VuOgoVFgQCg2kppj/lWKTafy8fXjVZSwDziDbFQ8SqpuETJBIeosEjsmVeMGF0UuM4OaI4dAXp6HkyFxN5OM7zk4+UlwLRZryLkmWflaTkUADXOXGo8vwQR2nqc7LDjw+tmmMVghAfp/Ao5hXIq56aux5spaxCIiG4IgsDYS2qBtjSKERER8pQDFADdeil0zycaddi+IQYvZujR5PTis3orDre5EawO8m05SSmnAJEwfBwmR0z0A5MmsUjZPQ54BA9bIwqUBYheEQeX7yYpZo7VUAA0/4bKykqkp6ez9W9njcSm1WMwJkKNo612bL5hRbOTkzEoPMT9PkWIBFGAy+tmxnt9oQTfoktrz5EdNo3VAd0F7Ei1kk+uTF8d7UB6zjX8VN6NVyKDcXb6SCwbxcPmtsHudsDhcbLWSXaIk8rEU7pbaJ/NbWfMjAO9P5mcj2/crZd7DGpZoilQkrVHgNPtZbJOzSFUxRHPWEn19mrIxCFsWJj/HwVAt4PBaDT6O+enG/D9tjg8plfhQpcTK2rbcdvuxqOiMK0fgIUCMBFOSUhIgEGnwo534pD9ggHdpFjyrppRZLIOqMwYHodYXfSAc+T9KBdjalSKPGKiAGopgNDQUNSdXobH1HU4b7ZjzZVOmByBveY5Hm+krMZH6e9Bpwkd2L5iO/aJQA0FcJ5wNv0XEj0Lm8orscNk8RdMfxSvj0XJczsxOzYdbV0O7P7lKsxW10AIGAgVL2LBzFg8nyZfJVEmf4rpQWTotJkRX/wEbB57QADrknOwJf19to/Lq9vx1vbLaGi9h4GJxp/tQfxzIgvGKH8EhvPSuXyQ/hsREoGc5Nd6rZNpbHg8ziw/iR1zP4XoCUJeYRUWbywfnHFJ0cqFiUrjB6jtB45ji8OKpJIZaO5p9UdhPc112rswkAPq1z9akLezCs2ddgyOWPUhPjIUZ0oWwBjpB3D/OJauSMVUNgSF4/CS/exTGq+Pwaklx7A9YyvgDkJu4WVkfVAxNOMSF29MUxovlq9lAa9kv9WXY4JuHDmMwnGhpoPkugqNbQ8Ld1/jTDH2bZ7Jwi+RCf1dySQQRigupW5y2y0orcXW/VcUszgM1nhEuBZHC57GnGljlMZ7XUp55TJpIFOaCA15aGQvehzZC8dLt05Z+cCs5jnkLBqPuuNL+xrP7Ps2GPTD5HZLDwoPXcHpi0242dTd3zJMiNNj8exYrM2ciHHReuWQCYN9mChA0JrIJ5zbd8za40LN9buwdLuYnEgMJ8bqMcIQ1J8qWtz5//mxKj1OD4hDI/qQLfpfj9N+gMjP8wzCyXhEz/N/Aawbcf898c9TAAAAAElFTkSuQmCC", e11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYjSURBVHgBrVdbTJRHFP72gizXLnKTFnCpiYkJVkojEK2loMADEm3Rh2pMrWlqg9WoJdQHE1JL+kQUIoT2iSZqNNhGvKfWBiQWoSgIJqYIdEEiUWMAubncdjpn9p9lFnbdpfEkhxn2/+ec71zmnPPr4CMxxsx82co5nXMSZwtns/Z4mHMv5/ucb3Gu1el0w3gTxBVbOJ/gPMQWR9V0Fv+XyGJN8QKanZ1lU1NTbGxsjI2Pj7NXr14xu93uCcgJzXtuSedBuYUvdXC4WRBXgJGREUxMTGB6etqtMD8/PwQGBiI4OBhGo1F91Ms5g4el1ysArpzie0EqJ8XDw8Pg1kKv1wsltBJzgfIMuFfESuDoDIEIDQ1VgZDyT/iZ+x4BzLfcZrPhxYsXQtGSJUtgMBgch3RuHScASNA8RGIfHh4Of39/j57QK4fNqvLOzk7s2rVLuNxkMgnlpFha7o7lM1pJKXlt27ZtGBgYkGqEgWpO6BUDiqVynlTYu3cvgoKCUFtbC6vV6qJYhkDl+WDu3r2La9euYWZmBocPH8bk5KQKotgFgOb6g7SnAydPnkRPTw+SkpLQ3NwsYunN+vmeSEhIwPXr17F9+3ax1tTUiNBodFBeUZ0GoJovu2nf3t6OrKwsFBQUoK6uDvv27UNOTo5TuEDd1wtDRzv0jx8DBiPscbGYWZsCFhXtkgcXL17ElStXsHr1alRWVqKlpQXx8fESRDmXd1CnxWNIWk8xo5jz+43ExEQcOXJkzrrnz2GqKIfx3j0HdKaJ0nJyOjcPk7u/gN0U4EzKy5cvi3A8fPgQMTExqK6uFh6Co3om0G6rhESIW1tbERkZiQcPHmDPnj1zGfL8GQIPHYDxTiNA8bRNOla55+z3268I/KYAOp64klJSUnDu3DmsW7dO5FNTU5N8JEo7AUiXv6xfv14gvHTpEo4ePYqIiAin2wOOlzpcLhTbNOW2ORBib4P+0SOYfq5yAoiKikJxcTHOnDmD+vp6rFy5EgqlUwja+CaJYvb06VNROEZHRxEWFuZMup5/B5G8Ixs+k96A0Rt/YpbfIgoD8eDgIEJCQkTBolBoht0nD1hk/KVCs9nsUmxqbvZTVVKsnXQJQ5suCj+Z1uKC3yqMzHCR42Mw3Pjd5WaQQXJPIDSyGLVYiKxVD6jU1D2K5tlIpE7xEFAC0XOR7TqUhGXjR/Mmno96zgzx/oO4MVCJmM5/ML9jSNlkrFaizc5CpNxRl5eJ/Ax6HIjIx4Sel1RCzwXQWhKaie9DNmGafpq1858YrIYwfBn5mQMk5sr2/FUSwaDrYCZEnmr8KksIqlpj8d7bhfjc1oagWRuumlahwf9dt+83+ltgX25zMYbyQMqXPYV0kwd6BRKlfVLbVSknbZlY+4xLcSx4I757K9ejcqJpnQEzH6W7/KbKVDskAWinHSUgIaNszcjIQENDg/PAh2sikZYYDl9pR85y2N+Jdf5/9uxZ7Ny5E0+ePBHtXPG0uAX18r/bt29jw4YNohru378fL1++dAqpKvoAcdGBXpUvXxaIY18lOv/v7+9HSUkJ0tLSkJubi7a2NvX1W7IUWzmbKREzMzMRGxsrmhGV4tLS0jlhzyaw+4e/0d7lft7MSlmGskPvI3qps//j1KlTogCRd8nLp0+fVnMgTPzlIMrkANfd3c02b97MePdivAuy8+fPMz4RufDNO1b27fG/2Mavr7JPC/9gxVXNrKGlb8F7FRUVLDk5mTU2NrItW7YwXt5dhlYnSuaYfAXRcMljxuLi4lhhYSHj3mB9fQuFe+OOjg7GOx8rKipi0dHRjDclxu+/CsBCukUd0Eakcm2P/Px8rFixQpRmaiLz4uYTPeI9gdo6TVapqanIzs5WXV++YEDVxnCrhNfV1SVCwachNjQ0tCjr6X1iOpuXlydkKWRVR7LXDqU0WNJMqBYRT8VKkeGyUgOaNxlnqNb7NJbTjCinXF8AyCk6ICBAfb8X3sZyRYgFbj5MaEyXc78KRlpLMSZraaLSph6PlnslLSfK3HxqiZvCgYjPMz7tij19rnmgMvaaTzNfgNAV/YUtjoY0xRZv8nXwkdjc5/nHnNfgDX2e/wdfX4iKEkIFfgAAAABJRU5ErkJggg==", t11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARmSURBVHgBtVfNbxtFFP/Nrp3YSWo7AUpSKF0fgAMIUimXVkIpBz6OzYEbEnBDIBD/AQckrm3/AKAcEAdAcEUc0nDhghRX6aFSpWbVU5RIsZvEiePEO31vdp49XntjO02f9TyzOzvz+72P+VIYUrTWJSquky6SzpMGpCXbXCMNSSukK6R/KaVqOAsh4ID0BmlVjyY/cV+cVthiC9wjrVZLHxwc6N3dXV2v102d36XIDeu9vqJSwAMqlhG72QgBYGdnBwSGo6OjuLNS8r0pM5kMcrkcisWiqTsSkr5L34cDCdBgHN8/BTyKItRqNezt7cHzPGSzWVOyugT4O9bj42NDdnJyMkmEwZeoTyWVQNLyw8NDbG1tGaCxsTH4vt9leR/yENLNZtPUp6enkc/nUz2hnM4cp1UBZ4ur1aqxmJVBRdudEyGQuiiHionMzMxgamrKJXFZZonnGPCtgHOck+DicqkPeuZS+m9vb6PRaAhOYLE6HrCuX+c6x3Bzc9M0jo+P94C7lqeFQDwgecFe4Oe5uTkzlpUyh8JzrDfCmc6dBNQFT4YgKS5B1zMCysnsyDfmWxv7qli/sbFhOnD2SsYPAj7JE2wM5wLPDNbZ2VmZGcymzLXr0rG5cge5uxX4BGr0XAGKMp+hVWxaEgopS4lDIoL/+DGBR2hR/fCNN5H54ENuMks7E1hsd/r+O0ysrYEhfRrXo8xVTKIHTOrJd+gipPlXryOisLaoucXPr74GxARYFjkEPPXmNbm/fuE8mJFHlvp2KDUxAUWr20hieemDBum+eYxIabEmEkD+/gN4M8/xlxXGC7gWVVbNnKRo29Lq/j7ASy/lQ08Iehyg428o7txHkVGuKPMjLzykCRcTCJiA2SjYVQawX0iZACs3ckZzqS26iYQTEq4zgYTI2Io/CR8CCwv8utTZMYht22qnU7fFHMgWRhHJlK53nVXReDteEi++Ahdy+Ek3HIkuowoFaaoxgdA0XLqEZy1CwntrXl6ZlfCuaaRl17tyFc9CtFOqctkNgZkFd0g/Mcy+vAp9bdkERlvKTxsK3f6DmYve6++7zSuyFPNGVEJUQ3O9TPg1Wgts1j4lAy0Tg5XyN1teh8oG0jzt2X35Z/PoleAVP+9N27MQGtMrfuaC32bsnu2YvXD86DJUK4SyU/60TtCwHiDXaz+A//IyVCaQ5s52bI9It8xr8oI/+zt1ztsRcCppx54J8Op6/gcX/JYcy1KPZNHub4i2PqZ8aMZ5MKInOrEn8Bd+hFf4VJpCOEeyEw+luvE/9OZHtEqG7WQclJRyPDQE/JfgvfgrbWbvuOBdh1L3TCihWIIsTrkFeBf+Bc59YSwRq4yiv8VxG83zwtfwL95Lgi8l7wZDX0zYC9HeH3Rc/oVOLqvoK7krpO9BFb+ig8zzbkuIlItJqtir2c2+l62oqaPGf1rv/6Oj+t/0uEb3tXra1ezmSVezYYgEpLf1aFK1wMGg8YdObN25nl8jfRtndD1/AmEP5aRP0RtSAAAAAElFTkSuQmCC", r11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYgSURBVHgBrVdrTBRXFP5meezCAjtAm62wrrjCCqiwlNaa+kBqkya+oDXR2sQq1T9qoja1KX9aMa2NsT9EYiWlacEg1NaWNsGGNLbiI6JNS0ExVLB1F4sVq7ALu+yD3Z3pvbMzMLssCOqZfJk759y557vnnLlzL4MpCs/zLLkVExQQmAjSCFjRbCOwELQTnCf4gWEYG56EEMdpBIcJrPz0pJq++7DxmUkc09ntI9gTanO73bBYLOjt7YVCoUBSUhIWLFiAiIiIcEOVE+yfVkTEWZvl0+nv7+fLysr4pUuX8rRLOCxatIivqKjgzWZzaDTME0WDCeOc5vd7BHIMm82GAwcOoKqqCiqVCjqdDlqtFnFxcYiKihLe8Xq9GBgYgNVqFaJC29u3b0dpaSlSUlKkoS0Er5JItE9IQGTZLDm/fPkyNmzYAJfLhdzcXLAsiwkiBjLw6H14eBidnZ1CehoaGpCXlycnUUj6WMYREHPeJjmvra1FSUkJDAYDjEZjkKNwTsNJd3c37ty5g/r6ehQVFclJ5Ek1ISdwGGLBXbx4EYWFhdDr9QKBqYhEJlS6urpA6gctLS0wmUySupz0f3uUgBh6M2333LVjxfoPcLfja+TNN0zbaajO5/OhtbVVqJ22tjZ5GmfTVCjEh32S9uMvWtHjzkR09l54YrKET47C4/EEgepobUh2CVQn2SkoAVqw9LM9dOiQnKsQbUbMvVWavbH4K3BkAglqJWbOiIfCa4XWfwnpqepJ8y2X0Kj09fXB6XRCo9Ggrq5OKE4EVs/ZkQgsr4JUnrouOAcUcLj9cLr8UERoYFasQn6WHltWG5DyVAymIhIJjuOEKNC73+8XiNCIILCMF9MIVJPGFqrJXncSN/+xk7goUGy6hV+6s5AQHw2hVHgGqZFO7HD/hjccvwd0kGZK7fy4VYWqePJJcnY7ONLXT3XP5kP9zXdSlxoaAaE0HU4vcT4kzJ6OtKPgGlRRHBqvz0dcjAJGrRWdd5PwDhbjM+Vc1Px3AgZv/wTTF/m53AROKGRR8Z9rBk9qhFEqqcpEbWm01frn/cBb4ixoqiteP4fKjafR+f4xJCjt8IxwBH50+BORn7wL76pfQS8XC1J15AdB4RbbLmBoCAxxzmAsMIxwESI9PRLVNIWYCzhcXiSoRlCQQRaOrU3I0T0AG+PBxue78PmFTPx49RkMu31wEQJuAteID0eVC/Fy4ls4HpUTcExBvgIBJO9yYcRJ0TtnuSWp2UipZXOMIDbah5lJDmgTXGBjPZAKPiKCHwuhPzja/ZwS9/kYeEiNKDkfQkVeKaM6pWq0TSMgLInpOg367Gqc+DULK8rX4cJNHfodMWi8ZsCeFX+gwNg7bvCVni5c7z2IvYNniXMvJpLgNBBRx43Om0bAQmBK1yWMe/GjphdwtDkXibFuZM0YGNXP5R7g6L1TWO6+iemIREKRkyOpLJTAVUogmVUhcxaLGz1DgqXyfA4a2jKEttWpQsvfKWA5F0ptP2Ob/Qo0pD1V4WV3JjsbTHS0ZGqnBM4RbKZPq5fpcaO2Q/jmG9rSgwZZsyQVR3bnIlm9Xnh2YorOSd1I8JPFSKmOlZvPS0sx/RGxt3rtmLf+W/hooTGBzDHx9/D0wksofE6LRxaRAFmNULuuSlqKqSRG0v8yMR4nD7sNunhsWpmB6sZuININ3ngWvjln8C8x1nXi0UQW/22mzXLnNdT3uN+xzT6CzJ1luK+vA6canGTbOg0CBGkaPZrfPI00Vi9Zxn7H4hbpCG2zZO0/+eFKcMrBsQEex3lgfNQUVcqdH5G2ZQpZ9zIEPkksn7UE1WuPPRnn5PpyzacomLVYslhEX6Jd/k7IprSxuwm7fnoPlsHbYXo/3PmMOC1OvlaNZfoX5c7Db0plJIK25Rbbbey/cBA11+qDOzLhnVKJjohCSe4mHHxpH1iVRu588m25jEQaZJGQiHxypQJNf52B2dYT7jXMezoTa42rsDN/K1ITUuQmC0JmPikBkQRdH8oIdofabO5BtN/rEO5DHrKNS5qDDILk2KRwQ9HiLnvkw6p4TKvhpyf0IFvOP87hNAwR6Xi+nCAXT+h4/j/Tg1tiBFmRAAAAAABJRU5ErkJggg==", n11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAZASURBVHgBrVdbbFRFGP7m7KXddrtsW0ovUNi2CgIpLQYEi1wUDDFipPECGMSo4YEnIPFZ8PJijKEkCmhUMJIYTYhGBJGXClYEqqFFubbAtkBta2l3273v2TP+cy67Z7ctLZRJ/p0958zM9/2X+ecfhnE2zrmburUky0lqSTwkbv2zj8RL0kJyguQHxpgPD6IRsIdkF8kAv7e2X8wda312F2Ch3Q6SbZnflLiM0A0vot294IoCq8sFV/UcSDbrSEs1kLwzmkXYaFpT1wjNzGqL+wfh/fhT3PntFPqb/qBBw2Yhr7YapS+uRdkLzyNnern5o5fkSSLhHZMAgQv/fm+AC+DrDZ+g87P9pKENjqllsBcVwerMhWS3QbNIHLH+Acg+P8K3uxDt68f0Nzai6q2tcEyfZiZRTyRaRiWQqfng3xfw17rXoARCZOK5sLldquZsNMdxzTByKIyhy1fAJIZ5X+5FweKFo1qCmcCFz88Z4N0/HUPr61uQU1aK3IcqkwMFONPBzGpwnlqN60QCbdcQ8naget9uTH3lJTOJ+UZMmAnsgh5w/tZ/cGbVc8ieUoQczwwdlJOwFBETOjfMogKrT0l+gavXEO7uwaJjh5Bft9iY1EAEtifX0U1/Q/yP0OAzT61BjCJ80qPzIDENVBMNhBnLq77guvZMh2ViPXDVKhyKrMB3rgW24iIsbT4J6ySXQaJCuMLYNzuMt+ErH2Ba/SVYs5zIKh5QgVUSzKR5ZgxwpMANq3AFinhLPyVPUzCH2jH459soWNlgzBLW3sZ03w+IN0rEi8DpGlgQhMXmgsVRTuBkeh096f9h6GwYF9UN9ENpAglaNxEPEiEHcpd00G4qEKNEDFRI0NKr2mK9P0LiQQIlrXkAkhIC41GSCPr8wOGzTnT+Z6eVIyaJpj2LsYA2R4gEEh5T12Q8jFjnLgNOTe3CBcuNN4mebzRwIcKAiT4EIoVobMyHPJQAy+boaQ+izZ2DybOAGk8/RmrMZA4ukyKIg0uaRRJ9R4Cq94wRywWBWnWsQoMCzbBYaAFJN7cyBDv10St2dAU4bI4wBvKsiJ1XUDbLL3yWCYk0twgLkkBVCGpgJkLniZQPzKqeY7XivUf1f6BVMxO0wYLAd8cL0NkTxRN1XQhEGZzBHNjzZmPB5lJUlWfj66O58PlkjYgq4VSf8KngDKnEpSoleAUvG0w9ku4LjZU+wFDIPu1x2Oy5aHrXATnYh6n+IjjcS3C1qQ5DfA4KZy6DIpERybdqDKjgIU24nGYcY201XUSuJeNASllNTrIVfaDXgtyLMq4ftiPsBE7nzkX/gA+RaBQ5eYXoabaCnY0i3C7mJnTAhLAlhsVDhoeYxZn8LwioKVFyeGBOc8zK0eeajfwiBotLwZq+LnzkqcPg1QtwxLrhdt+CP8uDfp6HsZrJqFpvNeoY+EQQeklqWbYnbVIwJIFd6oLzZQm5d0LI6o1idccplOTcwKQCyhOkuWvyYgxcJ7PXYFzNiAXJmZzgFRZoVT9K2WCuuuTg4nIZWSvJpCyKREJSd0Z1YRumVIURtzFELAzhghBqngmPCcxNPXNUGDtAtBZB4FfjyZK/KjkyELXieHshmjoqMbNGhnXKTHQu2ICbylLKannwVdrR2MZw9OKMcYEbD1L+avObE0YqFgeRm8f7EW+uosw1pG1Jln72ywqDVeK4l6amZIpLRU/LtoXtMLk73yrOZSLxFT1sZZSjE9mbMXhqr1pMqFuEYWJNPxcEePa8DbCnwA8I7GHHsUwl2NnHViB2+18tIWFizagN7DPKMf/nQ8hO1YrqcawpqZVIu8V/cV7P2b+HnCWlFRYTARfy8Ifvm8F3G2XZ6CXZwW9xect2OsF42j6+H/BH9jWgZOM645MXI5VkOgkPTEWp7+TvKolox80RSrHRgY3eWpiPuQc/h3tpnRk8rSiVzJP1D/X6QLiXLUEt+a341fVpC99NtFUllGxaj0XnT2eC12feDcZ9MYl03sStPV/gzpFfEKFb0UgHsOPhKkx+djVK39wER0VafvBivBcTEwkREztJtmZ+kwcHEaDKWewY2e+Ho6oSOQRuKywYaSkR3Dvv+7KqX04P8Htr4iLbMKHL6QhEjOv5CmjHjwcP4Hr+P/3DF0aIZTnJAAAAAElFTkSuQmCC", o11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbgSURBVHgBrVdpbFRVFP7ufbO2ZTrDIotlOrigFgIIGETRUtTExGhcfqhBERIi6g+FP4REE0kUUFFZJIpKUgi4EZX6S0NEIEQFolCIYFmEobIUW+h01rfMvOu5b2lfoS2FcDqn7857c+/3ne+ce9+9DP00IUSULo+T15JPIE+QR53HKfIkeSP5TvIGxlgK18MIOEG+grxdXJ3Vy764VpMRO8CXmVlSRTHzt1Bbtwmt7RdhdOyje0ZvRFY46vVorBfwBF22w5bZvldMQT21GsbF7SildnUbQDhtXjEJ/uEzERr6GHg44R0ySV5HaUlekQCBy/xuccFFPoX878tgnP4MbEgIyuAqaBdHwMwPIES/TcAswixegDDaUcyegdbajlDiRQyqW4DQjVVeEk8QicZeCVwaefHYLuTWzgTTC1Di48HHxMDiDGcbwshkgECZgH7U7xnAVqOYLyDTdASMM4zf9DliE+/sVQnuAY96wfXfNiD7znQo/hD8N0+BEgiBmwXqoIIVNQybmsbIB9KAqgGaBkFXoVObXFE4KsfcAe7zY8+MR9Cy5VsXxgrQWxM+jwBvuuC/ntiN9PqXcd/gavgGxwmQQEkrZjJYfwbHuXV+mDUaNEND2JRaMkcBYakgvTxeZRE7OJdSEa9GdNJdLgmJtaBTAUf6+bJ96uJpPPfVIsAfhC86ApzAeUm1r6YGLlSAQGXkfD9DuGBHr6oqUmbeUqNLFRWhEcMpJyYOPP8Kih1pN9j57hTlnugtW/LzGiRTZ0i+gAXKHOckOzOpLWypTQIwCcCU0lM7VtuOaLRgkYGu21eNrj4dPFZOM+hfHH//PY/gdsA+Jx+zrQqh6Ov/+N4qTU4FxEoUJYnJLIXpf4nuCUYEFAI1O+efwQWq70/j5I5KmFOyyBzwY9h9VCd3GyBKSF1sQdN2Haj4lFRYCF9lRHZ7gbAXSwUedynV7/kCRTkqgTE9C67nrIKTDqNAChQIVKXpZkduqUCuVeQRG6Ai06YhMDSHGcvbMHhaB3xlBYQDKkZXGaispABb0zi8bbULZy3tsghr3TubD261i0l+hAmWbQMrq3TmKhErEV8qRBg+ycMSQD4LVWpIpSjfeR1H99Ms0ATik0vQaIyinkFLykCw6KdpK9eVn6jHGy5krSQgFx7ktSyaLjR3EZAjqxm5ytCED9s/pxRIAqZBM0C1lZIkTCrKQp7qg3IevTWH+LQS0lSP5cij+Xweo4YzGKoP5+vLkDKOY+xTOSjhcjniBO5OvX1nD9vxOEuTnXdySgMKHVRYJD8VI2kO0ypC3SlCco3S4nzHJ2HsmhtEsTlLNVSASaTLQzS7jCItZJTO8Sq08yddBRI+JxdISRB3XbTC9yySJcP2okIEqAA7FbCpFgZl4ONUC0OzCCYVjHy1HRUJA3sOCUQGSHUZJj9qYMgsAyUSlPtksGOtOuhciLJqtit0XNa0TUjBS/QpQZB3VlOFiZNtBjoiKm6equCOBw3r/sNT7RFM6hYhxU3T/r0ii8ExmQJr4zBqULw7Yo/vyZ6teY8P59qAya/lcW5c7rLnuYJHXOlKxH2UkgSSsnXbDbfiWo0ZDK1JjhBd732khA4SsyPb9VylJaA5yXB4Yxh//cnBKia4j5KSwAHZioYjGDukGtdiOqVm3EAFez8oR+txjqYfgsidVWzwFgWNbw9A00uD0P5lBVp31oAHOxVolAR2uN8eq3mo28AC/bOKgQJVlMHQkSBOzR8IvT6CvQsjVs63bvAj2BhCWNhTdvTEJ71dd0oCDXDqYN7dTyPA+NWhk1UeDOPE61HI7Ql3sh0RHDmaldEq0zOUwI1z5ni7NnBn97pBfovHqjFr4hNOtV+dca2ravVn00gsbce5Yxzapk65MWLWM/RaHul+XS+xrV7Oq9FaHVJqGqOXP4CvWw5herGAbivCJFJnHEPTkghatwfRH3P3BoHqkbjzx++8BEbJnZGlt7NFWiXb0VAEm2eusUXoQ4hCrITozCw0RVwRXPrtHy31gq9yt2Xc8/vFcKbk9JumoO65j+3OomcetyxKo6pWR7DE+gSX8t2+diViMx50HyUdLMs6V0KZD0pFHZx9Ib9nNkR5DOKb+RBtyW7vCGln3o3guF8g3AOwe/UPiaFm4zpEp93jBa/znpquuC1HJgnzn7cg/lsPFqR9QoBeCTmOUhZ9RB4Au+EF+McsczcfLnjf23IPiQQuOZhAIyJnPqQqpfe5egI9WlkNEHsUbNg8Ihv3Pkmil4NJr+YczVb2eNgy6JjYsUOICw3CPL9BmJndwjTaejuarezraNYfIvJwul5cnbU7wIkrjd/vd57oOp5PJx+P63Q8/x/ZBwPdybTu2wAAAABJRU5ErkJggg==", i11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXLSURBVHgBrVdfbBRFGP/N7N21d7TXUoXS0pQLEd9QwBcjkmIw0RhJ0Ac1mID6gC+iPBj1CYLGF18o4clEI4RQo1FpTCAxGhVNVCRA2yACiXCkEijX3l16296fvd3xm9mZvb32rgXDd/ftfjM78/1+3zezOzMMdyhCiE66bSMdIF1HmiLt1I/zpGnSEdJTpMOMsTzuhRBwivQAaU7cnXwm++L/ioxYA88Tt5IVFXtUFKe+FeX8j6JSOCO86nQzIgd09hoKawKeottP8NOsxK1Mopz5HJX8KXjlNFiop9B3Hu1FJPkYEit2gMd6wy7TpE/QsKQXJUDgcnyPG3DhFjB7YxDl7AnwSDsi0W6waBdgJYhERPdxIao05NS2WpmAcHKIdT2LeM+uMBEJ/hyRGGlKYG7kVfsc7GvvEpCAFV8DK5KkHoI6MR03C+WA0VUo03NLcEtXyR9DvO8dxDo2Nc0EC4HLcTpvwK9d/wNLc2/Aau1HhJQ6KSLQ8GAC8xLo40tfpJSQ0nVUS+NI9O+jjGwNk1hv3hIe6r7PgP9yycZHw2MEvBKRlhUEU6GGZbo7sBjZUsnmqj6krL5stfRQ/25k0u9jNPO7wUlpLAQEdOr3SHs86+DtoVvgPAIrtoycOkoZ8wElGaZIOHUq61jouWlvxZbDsizsP/06bGfa4O4xrygPRa/kwMlJjOc8MCuuImIUeS1CR2WBCYdYl+uUCR+8lp2yT45XafIuQYEm5sdjH4QHTAXM9di/YqL/4jSxZJz+XIEFUZP6QFplnQhFrVQSq9lMDRsRYFU1Xb4f/xrZYsYQ2CmxZQa2mZqh3/Lw1MTiCoyLknakwUhBdoFmObSt7qR5p+QTnEPIz0RVxgSXyt/884mBU592SWDA1JwcsVX0MDPeywXgBujirI1DExSFR2WvrO8VDE7cxpXiTFD2CRMhL08k/AxIPX3rh/AwDEgC8sODkuPhykTVT78koH5FciYnTjnQ47ksRmcKuFSy/QxQ3V9FG3+TfpXN6qyUNeEC6Yx+hVVcSNtXMF0J1ql13Lx6F/6t+C0MVaYtGgZ4fmSjFP1Z20aFIh+anAqiPTY1hYpbxhl7WhHxCRRUX+XDXPRn44Z91RBIcT0WmC66GthXFv7ICMqMKOJYJoOyV4JDBM5SFi4Q2BiRGiNb1kk9Sm0gSQsXjUS6vzU7HsyDiLGqrgiiDjeu60zfOS/kOMkF8q4HN1TXxqPzAI1TacsvZZxeSyMyA2pAUsuiaLI4BvLyfe2B/XhbK2aIdAtneCgea9gmTD1wTfcl0aBNXhJIS6v/vigWEwlkwF67P4mj2WkMTdkB6JZkHKtikUX9rOlYa8y0JDAqrdYox6OrWxftLME2UfSZqovzsxX8OVNSaZTEXljatmj/vrbVaI0kTHFE9v3ZlDY+GK9rLBo4kEBvdXfSzC8EdV/mbOzt7UJ/g+iFuWpnA71bw49PSQLD0PNg1+YOtLc22OrMkRxFP1asBOUzM2VEm00fUfMjl+in+18KPx3mel0+IkvJOMeOje2qZRNsJX0U6YZEbbi2JBOIseYT2Ph6ZtV2dCf6TPVhiW1Ww0FTu/vJTvR1WQEJ0YTJi121V2l7V+OxFybzdOmOr8T2B3aHH++XF0VAb5EOSltm4dNXl6M1VgNvNhc2JFrUzO+NWvPBQywEwby37hCW16I/aLZlTbdkk5Pn0Zl7U28w/DZzs3yx5GCpxdEzh4CJ2s9ABLx7L3jyKfM4jdCWbMFNqShdhnuTNqXVm01JNALWgUNY3bB6PgSLrw2DN96UhkjUb8ud2xC5I/AKJ2hpLS5IIADmS8A7ngfr2kmLa3sYfOFteYhECnMOJnBuwrN/hbC/o7X7Qn1vM+Dx9WCJR8A76VXjdZ/kNJocTBaIRB3NBhsetjxXeKXLwpulI9nsOUEnJapzmh3NBhc6mt0JEXk4PSzuTnIaOLWYf4Y7FFE7nm8mfRj36Hj+H0PjnSPBxTGMAAAAAElFTkSuQmCC", a11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVQSURBVHgBrVdtbBRFGH5m76MtB/0glYYGyhXbEMEKYkSpkQoKwYgBookxhFBJjP8QmvSPf6gkxvgRW6Aa1Eih8Q/6oyX+0ARjabFComlLkJqa4lUwLf3Au7Zc7663u8M7uzvb7fWu15a+l+d2dnZnnmeeeWd2l2GOwTnPpcM+QgVhE8FPyLUuhwh9hC5CK6GZMRbCYgQR+wm1hCCfXzSItun6Z7MQi9EdJxydcS0eh94XgDY8BGg6lOxsuNZvAPN4knVVR3g/lSMs1ajp0ALTZrNudBTRr85AbW+HerVd3GR3wGVnj5fBs3cfsva/BqWoyNllH2E7iehLK4DIxfw2SXJBHPn8NOJnvwG8XrgKV4I9sgJsiQ/M67Ed4cEg3RuC3j8AfWQYnoOVyDp2DMqq1U4R+0lEV0oBiSNXu28ifPAAWDgM14YNUHJywLjZKlE5dxz5xATUnh5AUZBZ/wW8W8tTOsEc5GLOOyV5rPUyIpUH4S4ogGttCZggJdsZM5uIslFpCeLyCLPMqazd6oUaCGDJqXp433jTKeJJmRNOAbWwEq574CbYrt1YnZEP95o1dJP4meSygXRiygEzGwxy42fWqSRCG+iH7+IPcD9rO1FHfR2zBVjWB0T57vggtn79EjwDg2jqfwqlozAFWLanXDa2EMsBUw50TYPa1QktPx/Zv14Do2m0olhMhWKdHJe1H7Z9hr7QbdzN8+CtigjOlkbBJmNQYjEwiUlxpPpo1DyPyrIJxbg/arRR1DiUpUuhDA4i8sEJp9aj1lQacx80JoeIN9aXY0wdR3ZGNoryVhmjeH5AwYlrDPkRhwPT1t9UJTctNXLAdIOm4fa/0CfCUDMy4Ou8ARe5AXP3LHbD3F6N+PHvSxiLj1P2MtxXwwjHJ+BSXPi5gPLiRaB2aD3KfMWwM2+G+cwuiX/dEqiN3IOmTkIjYdE/fodv98ui2tjahYAK2cW317+z+9XpNxL5HzmZy4zzW5nA3qIOHNm8Be88UYm5hq7r0CgP5HGSksk3dblCTIFYept0rsNVk2eM3s42gs+7BFnuTHPJGZZyPFf4DD7aVoPCpSvTkov7BaQAgQKxtF0ucUuXSEK/KN0Y7J5y1ZHuYhpGY+OIxKOIqlHEtBh+udOGfRcP4M+Rv1KSc2vPSAYhwgq/EGA8UofCw5ixxVnluB4nIWFMkBhTSAy9wQAqLryCkx1n7FE6kSykAFVVZVWuW5ZcTEm7yHWjY23aviscUrkKN3OnJE10Q1EU+7poJZZDbmH27POZGAW+FTi942PsWrM97b1ShAyHgJAo9YnS2jw/5hrlhVtw6fWmOZEnC7fbdsvYCa+Lktflxbai8rSNq58+gu9fPY+iZauwkBDZ73CgS0i5TDgkznYUb0Pbnd+SNmQTQNk/j0K9dx+f/vQJ5hrSepmcO3fuxJ49e+TlVrkViwdRbjASgv9UGcYmx6ctRfYfrecLYdqwdTxsBOjx7Pf75WmeYj2XzxtnWbl4e/Mhh3wivzIJ/uX4opBXVlY6yc/Z74nWm68R5AJfXbues/dyOHvMYz5VFwFEzGn0zrdm/zR1VFEnr1zpvcrdeYtHLtDc3Owkr0NiiFwg2BIbGxs5WbQo5A0NDU7ygJV3SCbC7xTR0tJiWLdQ4uXLlxt9JJD7MVuI13KnCDFvhw8fnhcxrXNOCUdv6sFE8k2YSyQ6IYVUVVXxkpKSlMSlpaW8urqa9/T08IRIOfJ0n2Y1hHcTr42NjaGjowOhUMgAEWPdunXIN1+1EuOk6GfBH6uWG+f4/EJ4X8cf5uM0iRD5ef4CYSMW6fP8AZoc1e9d2UevAAAAAElFTkSuQmCC", s11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWYSURBVHgBrVd7bJNVFP/dtuuga7eWgQJurDxkomOAPKLBpBgxLJggwqIhRhKJCcZ/QNQQ4x9A1EiM4ZEYEo0JkygGk4ma6AxGdIshERArJjp0j7INzOYe7bZ2a9f285zb77Zf16/bGJzt9J7v3nve9557r8AUQdM0NzVbCX2EKwm9hG59OEgYIPQTNhJ+KYQI4k4AKfYSHiUc0G4NTjLvZPLFBIrZuwOEe8ePReNRtA9cx43QvyBP4ZnpxvK598NmsZmJOkZ4KF9ERD6vqfkRqTBLCI6GcPzCCZxvbUJTxwUzNqyZtwo7qmuxrWoLvO4FxqEA4aNkRGBSA0g55/esUs6KDzcewQeXTsJus6OsZD7uds6B0+5EgbVA8owlxtA/MoCBkSC6QjfRG+nDi2t24XXfPpp/j9GIp8gIf14Dxnt+qesKaj/biUg8ghXzquCeUZLNJRQfkYSa3hWORfBnTzMswoIzT9dhXfnqvJEQBuWc89+U8jNX6/Fc/W54PQuwdM5iOVWjP0FCIakUswbTMBIK/N3bguvBDpza/iGeWb7NaMQqtSaMBhyFvuAudl7GIx/VoMw9H4tmeQ0eizyx40/BMnRh+g/9X/uvBT3DPfj5hXNYW/agmn6MDHg5LUYPfTvT8XgcLV2tCEVDcM0shsViIRRyaqrV2YSJ18p5XXkymaTvJELhQRQXunBfRaWUp8NCToXaNwdU7+DgIJy2Iplvu90uGXirKZwMVBRYuWo9BW4kEgmEQiF4PB41laO9V+i5H5CTb95Ab0OD9NRmL4TN5ZShHa9cpH+QswjSWSCCMUkYHxpCYixGNDBney1EiVzMvAYWcgS2KubY6U/hePcwrERbrVZYy8ohZARSioT8EXqOCeaTl3H67sleG+kloNOJzk4yYAwJ1tHXi8LX9vMMWdo5IT7Fm/j6K3CHhfNNoRP9fRDRKMQoYXSUSmAMIBqSprZyGFg+nKJl36gcT83nlr77+mChdSVlkuz4+R9gAB9HYKU0mCZrzX9J74VaY8PDnERgxgyYwtowpFtni7L7VVpGRiFGIrKL1y+nJ/HrZWiRCITDwd0r2QAvU0m/X1oodEuFQpoMCh8KqOpVJjManITlKeFYRhhWKSCuAOHgGAR5bgSR2qxItrfB+kAVd3ltei7IqnBKodlCZwMY5xI+S2koRrrYSNg/mjKXAoZPCqmc5R5KSrasmG2tQMoAd3pTIhzOeG1gyoIGisK+mUCrXFokKa4j0c3Ut5fGvrXlKM4xpiiTMjZAlkRLRUXW9Lw7vodY3nHk9r9VlBozU4hxTjmcaijIHAE5sGgxpgzr9NwOiIxSX2xSNmWEpbpadQWY+3c56KSiU1WFKcHDtBb8lI5XXcAb5PlFoh+K552uGVqxZInaAQx+NuAn9WXd+HgWk2YmrZR2whXK8wES0qtH4G2i/dRXrE2onMFSs9k43KhKMR9E7mR/P4a/qKc9mym/k1f/iUE6opflBNWU4poaiPL0bcmjTkO+t+1heojqdiwWyzqEbssAdSaQcj7cXC6XGqoj2c/nHMc8ubu3W798qChMzwiWweUiSUdygaUAs9weecbokDmOmSDFx4ncwwqvRVqx4dQTExSEKVuQbr/bUY9NpY+pkePqWmbcuAehb0lfxXqc3HIidwVNUznL2rQkrTyg65Iw4aW0oeV7vNTwCgKhDpPZkyu/yzEbn9d+DN+C9Ubl5pdSgxFZ1/IAXSoPNR1G3dXT2RNzrmQZkvO9s3oH3tv4ZuYmPZVrucEIL8Y9TNiQI7+8j2/+OYe2YMCMDctKK/Fk5WbsXr0L3pJy4xAzTO1hYjCC68NB6NvTCPxY8Xf/IdtQdBBLZy3GvYSzHaVmonhxH5z2Y1V/nNZptwb8kD12W49TE0PU83wD4Qrcoef5/xckt9ZhIG5OAAAAAElFTkSuQmCC", l11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcqSURBVHgBrVdrUBxVFv66p2EGmBkmQHiGdcCwG3F3SVgfq+7WgLgroVSIWGVFS0vLHylTWpryWRUj0agpK1pBE/2hsfSHWpaWFd/xHRK0jIkKqUggGmEEJMMwwAzMMD2vbs+93U16COSlp+bMvX277/2+c+65954r4DRFVVUXFS2kHtLlpG5Sl/46SOol7SbdQ/qOIAhB/BlCwG7SraST6pnJy6zvqcYXTgLMrGsjvXvuOzmWwshoBGMBGZJFhNVmwbJzcyFJ4nxDtZM+spBHhIWspmI3NDdzCUcSeOPdX7D/hzEc/jk0p7vK/6sqHPifpwyXX1aK4sJs85Be0noi4T0lAQJn87vTAGfAO14/gg8+G0KWTUJhQRbyXFZeNyxOJhWEwnGEwwn4A1GEphJobizHTdct5d+bSKwiEt0LEphr+cGeCbQ99QMBqDi3IhfOnAxuq6B3UwVtAFXVS90TUTkJ79A0RGp89P4VOK9q0YKeEEzgbM67DPCPvhjC5m2HsKQkB+Vldv1DhijoYEKaFRq4qv1UrT44EsGoP4KN966A55ISM4kVRkyYCWyFHnByZA/efq8dVms5CvIWaaC6tUYP4XhFH0CPBAJX9TojMj7up8oYrmraAFt2jQHXTgTWzXbXXT/A6krSi0igHoI6DMl6MUQRGrhJMcd2s6g0L6pBglRRkkjEvqdPl8Be2AVBNLYOVLCpkPSHNqO1v/1phPZPIiOnELZiic+joLt9rtHpwGraG0V/VlQJsq8Uicgk8uu3wX37BuMT5u27BX3uJ1lLdHAIe6svgkhWZTjsyCpfAlE97nqB6n1k0WElDp+qoGH19biopgaKP4Dod12IfnMAGYKgk9GCVGHj/jpIBGYgOnPh6T0AKdfJXrMYqGAeaDEo/frci4SjhZcaiUKdIRW1pTagJvFaIoqguxEJOYSgfx+eu+tO2Gw2rfPNN2Bm5BiOPv8i5Pd2pbsnnuBjpqZC8G5/AUvX38ta+dbORvcY343t+hSsgamgKEiOT0CNxfA2ue+BoA++onpc6DwflxVeisWL/4vOzs40nOzSEvzzsYchPL4eUp4LihxDIjABJJKz445+vc/cxcM8wDYeJKemMTP5C8SrZc11pDGE8WxfALsHtVDJCvkQzRMRzFqMyNQY1q5dix07dsDj8aQRufDqqxCuXYHvtzVDGRrRVwQQCEqoeegeCnQiJPExl7MYYPPv8h/qRPeTTTzomNcZ28d3JfD5WAytra1YuXIlQqEQhv12DOwP4oIrVGx+YhPq6+tRW1sLWZb5dLAyMzMTmzZtwjjF1IFHmuAb8KLy4mZUr1qHz9a34ZrtW5HztyoeB5I+F5AmpiEcyZxd7y/1xfD5dIxb1NPTgxhNBVOHw4FpcQp794j82efzoYYC0W63w2Kx0K6Z5CWT/L+U4z8bPkDXTc2I7P4EhwZ6kR8cwNRov0HAZSxDHEQpUKLARqEuEgVfT2rWpQrFAwNLJBKIx+NIpZKk4GBer5fOgDCcTiedDRJfsqJ4/FSU6dlRDlgiSSgzNMXFQIg2N2NflPTl4CpwOuD/0oo4gbPuDwo2+DKC+DEho7q6Go2NjQgGgygqKsLo6Cjv3NHRgTVr1qC3txddXV2zU8DKuro6DA4O4vC1NyL7yCgtRxuPhaP2JSgQKw1+QRYDbP9fHg5N49uyKm49XwWkM9RlY3wKBy0qCgoKuKVmqaysxM6dO7n1PJDJI0wZATEqo7tlNYSePg7M9gNWJum/foJ22Uzu/G6Re5/EnutAzl+r0gByiMaWzFxco1gwPDzMPWDW/v5+tLW1cZe7XC5Osri4GBO9feiua+Lgc8VZ8w8DfJZAh/FUdF0z5pM7Mhxoz8pHiWhJa2egDQ0NPDCZjPv9OProkzhyRQuE346dMA7zQHFrGsYeYytmB5ErHgjg66XLISRTMMJo7r7/VSqGzqSMIdoZjykp2IhUS+0FaK06D/L7H8OuKCeAGsr2lkt79sNGq0OXRcZpyPK2u1jdu2Udpve9ypfjvBneWYiiajHg/PctcN+3xWh+hVbMrSccx1CDSIRYMAbo6NQ8IAg4KzGOZK6CGxZHB415jvH6+HHMKkTiGTAvCC7I4i7s7XxIO4aFk6TOp0NAN+D/DQ+bwZ8x0rIFU7KPdx/D5u29WubDXXCmNFR+LIu0tz94xzJc6Sk2XngxX0qmk3DDlJR+810A7S/9THmdbJqHUxFRjbEoI7aibd35+PuyXDP4/EmpiURaWu4j8JffHCCP+PiUnFII32oV0HR5KW5bXQF7jmQGP3labiLhxpyLCSPy1odD5JVxjPiiWte0e4mKpRV2XPKvfKxaWcbvDibx4nQvJiYSLCY2Ql+eZpmJJvFTfxixeIpUweI8K84py0Z2tjTfUCy4N571ZVW/nL6inpmwi2z7H7qczkPEuJ7XkbIE340/4Xr+O5lEjTuXSmQpAAAAAElFTkSuQmCC", c11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWUSURBVHgBrVdriFVVFP7OOffRzB3HO958jDY29FITTcHHYKGNBVn00EAlIwsM6UeJEf1UCwKhHzlaRBSYFohY4VAURIhNlGmMNRaVUtGd0jGt5s7D+zyP3Vp773PvOXNnnNFmwbr7nnP2Xt+3Hnudsw2MUYQQSRpWk64gXUDaTJrUj/tI06RdpB2k7YZh9GE8hICbSXeRZsSVydu8Flcr7LEGrhLPzQsn/4s4ceaC6Ph5QHT+lhWFkjsSkV06esOKMQJ4Mw1HocKs7rkDKPy9H/bgMbjZk3Jl64F9+OtSxfbsxhgeWFiPdS1JNKViQZNp0lZKS3pUAgTO+T3sgw/kXBz/4SiW1DwPw4rDijXCjKYAsxYvHduC/kICtiuQyTroz3voyZTwz6CDR5dNxNZVk4NEGHwNkegK4kWG8bwM3tWdx6a3zmJJYy9uv28+TKsehiEkbx5t10DRVT5MrI2SCswkwFzJRcfpPL44041XH5uOlpsT0DYPE0YoEmYAPBkMe/vJfjz0SjfiUQuzZqRgkfemUSS1SUu0sEjgQMFhEnTlKTKspmlhzowaRC0LD7f9gUMn+n0Ytn00WBNmIAA7fPDv0jk88855TEvGMCMVh+1BgUMBKyIlUN1RFICiw6oJ6JGJXUdrp02K4dl3z+P4r7kgiR0hAjr0W/l/T8bG5r09sAwTU4lAiYw7nqvApedKDVLbj4BUnwRojSG1QPcaG2IwTBNP7T2HAaoRLVv9LWoGvJey59N/cbbXQyRilUPsekKCGwhqUYMOVXrKUWEiFAmHUpO4xsKFAYGdH14MBFw5bOp8PMEXf/baOMj5MgzJ2vfEdj0YokigBQlsCBqFSkHR8VUR4IgV/Gjo9Y4wpc2DxwfQl3N8Ao8zNkdgtX/no2/75SJCR842kLeVJ0wA7DWB0h3KmRpLVBwVAkoLZTKiHBHeLWyTo/nGkYwPJ1s7E1jh3znceUlOZLZCGOjNCknA8VQEwOpVxqDnBVtp0VdX1UBv1pNp8O1+9mM2mIYV3AcWqEJ0sGX+dpgLTVgmbyXe6wZikSim1OUVaKhvCWxbtoeMR1Etqld4RNJ2bC5y+l9R4b5GTW0CT1xg8EuGw+HmulBMr6f9DiIATUCSph8GiWCEzj2McMps7t8EDqmuBKeRIhpvPgSr9jae2BfRuYDwcgHAIUDCVgYlATP8jOcyQsh7r4oSR5MSq6aXugFFIFlpxV5BEdAwMKp5KONu9a3LiAT052l7OvxS2B354WDGZoYXYvyk7JQmBCvhP5IpSIOLIdaEL88tKheg6YeDJBnvx7zJZ6oMd12ch8FSDUYTLkLOkl+EK2+Z6z9KM4FTkoAZx57vX0Znt623jFnmff9NX+HNe7dXGX7ykx3oGWzA6MKV6Em9PmXh67vKEehilM/9q+Wza8OLRkvwmESUi5R/7741FLEOJtAOXQebltcjETfK68ZdiMjm1tDXWbupv17381VDwsKGlroh22r8wNcvnYCmSeWNt4+x/U3d5t99blUDGpMWVOiA/xeKio2mSRbZDnn/Iv9IAvoTaTf/r68x8frGybQLgjVwNSQCa8n7nWtTQe93+59lwbb2AtSWxNIb4tj1SEp2Ll585eWoZ+s+3LYhhZVzysWX1lgIEdC10KonYO3iOnzw9BQ0NVja0FhLQ4edJl+bMPE+2Vi3pC4I3ho8NYW+ijks1DTWQH8Zt9x4jTRw8vRUUP8YpjsOExsCjkYMrFuUwLYHkzKlAfA1Q88GYz6YwDkHr+8AkDtC7yVlY/H+93BeNiJFYta0CO6ZW4ONd9RhejLkWxojHExGFH00axv2sOVmhch9I478lBcfn8qKzt8LIpMd8WjWdrmj2ViI8OF0n7gyyWjg5tHsj/mlJyrH8ztJ+WXejHE4nv8HVPOhdM2gWC4AAAAASUVORK5CYII=", p11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVJSURBVHgBrVfrT5ZlGP/d9/PCEExZWRwEpERyWoj2pT4hVss+NMFaWqtAq7WWi+gPCOxTay6grXUgB24W2ofEtdlqqzRyfjHDPlRsNF9ALFQOTnl5j8/tdd3P4X2e94AoXOx674f7cP1+13Vf90lggaKUKqSigbSOtJa0krTQbp4hDZIOkp4i7RdCzGAphIArSTtIp9XtSQ+PvZV9MQ8we9dG+k5a29wczJERxMfHIQIByIJ8GJtqIXJyMpnqJN2fLSIim9dU/AIrzFrM6SlEvuxG9OefYP5+1jdY2aV86GHkPPsc8p7ZAVlR4TUZJK0nEsFbEiBwnt9jDri6dg2hDz9A7KvDEPnkaWkJ5L33AfkFELmWxyoWg5qepr4zMC/9B3PyKnKa9mBZSyvk6tVeEo1EYjArgVTP42fOYPbN1yHCERgbN0KuXAmhrFGpzJWnVKEQ4kNDFBKJvO6DyN3ySNZICA84z/kfDnj06BGEWvYhUFkJ44EqCAZVikphDaJvXWkTUk5pNyn6Tvw7jPjYGPI/+RS5DTu9JDY7OeEl0AE74WKnf8Pszh0IlFcgsGYNhP5LgpsvNwFV62wXbPS//4I88rUFrv+4FIgTicTVKyj47gQCm7c4cJ1kq5U/Ap7Qa3BzdBTht/fByM1FoLgYMhKxCNhh14xLSqGqq+GTicu6rxsBWEQCJSVQE/8jtLcZd50cgKBpZCzC7OKpkPbwNsdO+KMDwNgoDFpSGpxURiPuNytME0k6lgqVoLawVqt/2Bobj8FYvhxi/CLCXR1eytphac99s+N9nMLIrCS5LKNRCzhsGdYlq5MLXiVSIhK1lPtELeIiEoOMxbXN+KEevapsaWJsrm9waiK9ByHJkCZAmSxYmQAbCkc0CdA3Egknc5IlR8UmCrc/k6CIxKLaprh+HdEvPnPg9NbO9XVOjfn9CQucQspExNSkRYCMgQ2Tdwg7U6D8JBJxq084Cc6RwOQkTUPcssndBn71TkMdRVPx0qtVs7OYvb9cZyWH32DTbe8DZWVEXcInlM2qqMhXJSYmaBGf81TQ+AQ5QatDdBwAU07Q1HHs8kcvQeTlca9BxqvU3p8ftMJkM9XLrb6elltKtmcRTWj70+n1xUWQRAC2bV7OanQEovpBrqpkLH2kqtCclc++LU5gqcSxrR2jQ8yWwmRsw3O+hQWkkrlT4HQjwjDcbyagt0RZUgyvx8Lzu3gSHqf4hw4yW2Y4B4KktWLtuvSB587qTSlVVM0m4O57/H2npoA/B9P6YnjYR4RF1tQ4VUEmcF4TKCyEWL8eGPrHHWC0tiCTxA/3QW3d5q+k5RV4642M/U2HOJPYsIGO8VynaZCn4KQL+NR2d5BCcqUvRlJ2C0i6rHjkFBPoh5MHzXuh6AxYCuBsEnh+l/fffmmfy4c0Abq9yF0vYKnF9f6lVyDK3ataL2M7y7DTZfheO9SqVe4ULCYavvEEbLS+623er0nxj31F6tLVdF4HunvmBRYXxyDoouHTK5fTwN1vPlnpViTKyp2qLudalvVKZh7tg0kXE4mUNbxAcbw3adORHR/T1O52moLwXMncndCuqLc76Fww+r7RoUvN5IUAay0ugfHt8VTweu8bwXfM2WFptDtCbHsc8thxYPeLMFONzwe8LB/Y8yqMgdMQjz7mBW9MfRss+GHCO6LZ/Tnw4w/AhQvIKPQwwRNPQrxGV3l+OyQliIU+TDwkOCfaSdO3wxs3aNulDZSeaIovHaWlEGurgBUrMpni5G6/48eq/TjtVbcn/JDtXNTjNAMR53m+lZROo6V5nt8E/8WuzGwnYhoAAAAASUVORK5CYII=", d11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUzSURBVHgBtVddTFtlGH5O/6CUlR9LGIxuVReIGRvdYoxmwU2D8YKxOWNijCaSQIw3iz8hGTc6lywmZsZB9GJesaDhwjgxwwv1YmwZkGEClAXjhgPKCCBF2sJaWvr3+X5fzzkcKh0U2Btevv/3ed6f850eCZsUxlg+Na+RHiN1kjpI8+VlP6mb1EV6k/RnSZL82AkhYAfpJVIfy0za+NmN7EuPAObenSP9MHUtHg5jeXIKoQdTkPR6GCwWWJ0Hoc/KWs9UC+n5dBGR0nlNTTeSYRYSXVyC+5tv8e+NW/D19a9zlCH3mQrsfv0kyt55Ezl77dpFN+lLRMK9IQEC5/ntVMA58NjFVky1fQed0QjznlKYiopgyLVAZzKKM4loFBGvDzH/IkLTM1iZX4C9/i08ffZjLREOfppIuNISSPXcPzQM19uNiAeCsB48AGO+lTsKKV3imPhDbDmEh3fvQdJJqLzcCtuLR9NGQtKA85wPKeBzv/wKV/37yCGPLfufEhsl+YQkg2ndYGzVGpOJBP4eQ3DcjUOXW7CH0qIhcVipCS2BS5ALzj/oQn/NKZhLipHj2Cc81iGJIKUypx5TwiKAxUjlFxgdQ2hmFs/91onCo88rh1qIwEeqHTn0E7wfps39NScR+ceDvCOHoJMk1XvRY0nIJLYkoJLeSzKsxO2BiagwJGIJSqULRtsTqB7sgSHPqpB4kqdCJw/OKbPjX36NMD1iepMBWFkBo0eOhSPELEItjWkuEYkgwVtaS8hzyX3JFpHkXqzQuXgUJipY7tDdTy5AIyLakpx7Hx/w5/rWkWoCC8O0Kxdmexl0bDX3YJrQS5o4r5lMei5aGia43ckHiAaXAVMWqkcHkG2ziUzzKJCb4noVsjQ9i8LTJ0TY9XTBZNFGnVzyavZXI71WUuZUEqTmBS/isQjiCQbvgAulr9bwJXG18wi0Uaeez3g8HiQSCeh0OqGcBNftCLcXj8fVlvKO4uJiZfkKrwGnwjgWi4kNCoGph9O44/kTW5Ux3wTcS1PCpqKcBFdZnJyAg/eidJtpN3LtmbmNq/evqeHMRPiZ3yev44d7V/9nV0PAwVMgrK9QJft8PhHyAc8wLvRfxMjCXwjHwygv2I9PXziLV/Yd3xR4z/RtnO/7AqP++2K8N7cMXx37HFW2AwI8Ly8PZrNZrKkEwlT5i4uLggAP/9D8HdT8mKzPn059j5ft1chEOIkTncnb7/ob11BVVKnWASeQnZ0t1vhTwB+HfIPBsMbA+KIbZw6/h1yTBX/MDmRMYMw/jqZnz0Av6UUqOQFFuIOy+HkE+P3v5IGYn59XC3Bu2YPSXSViV5QuE6PeiExkNjiHEkuy2hdCXuSb8tQIFNHbVCbh4v+HeY8XhzYKJbm71X6m4OK8RX3UUJhdoPaVFMvi4og3SN/lo5GREXR0dKjVqhDbroh3g6y1tbWoq6tTlm6K17Dye8/r9TKr1aq8zB6LTkxMaH835isMW5SZpqamxwZeX1+/5kerNkQOZZbuAma323cc3OFwpHrvQEqe1Cj09fUxKsgdJdDV1aUFb0GqyLWgUmxvb2dUsTsC3tbWpgWfUHO/DgmHlkRvb68I3VaBbTYb6+7uTgV34FFCG5xaEjxvjY2NGQGbTCbW0NAg6ikF3InNSGokFCLNzc2svLw8LXBlZaXYMzk5yVIkrecbfZp9RvpB6logEMDg4CCCwSBCoRBKS0tRUVGBgoKC9Uy1cjtb/liVo3GFZSY89i1sOx+n6xBRPs+Pk1Zhhz7P/wMopBv7AAZTEAAAAABJRU5ErkJggg==", A11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXHSURBVHgBrVdZbFRVGP7OvXemM12mpUBbpMCUkGhEWSJBExMBI4YHhNb1AWOIGI0xphAeTPABTHxjKyYSo6iV4IPyoMSoBBKh+oAsCUV5ISCMXahtodNOp+3M3OX4n7v13OlMW6D/5J9zzj3L//3f+c/GME3hnFdR0ki6hnQFaZy0yq0eJE2QtpO2kf7IGBvETAgZjpMeJE3ye5OvRd+pxmeTGBbe7SbdPqEuk4H1bwJGVzeYpkEpK4W6fAVYKFRoqBbSj4oxwop5TckZODTbYiUHkD3yBXJnfoN16WKgM3dTZelShJpeRqSxCcrChfKQCdJ1BCIxJQAyLub3B884HxrC6P690I8dBYtEoT40D8rcGqC0DCzseMx1HTyZpLaDsG73wLp7B6E3tiLavANKfb0MoolAtBcFkO+5ceE8Rt7eBpbJQiXvlMpKMO70ykfOpZSPjsK4do0oURD5/AjCT6wqygSTjIs5v+wZzx3/DqPvvwctHoe6eAmYMMo5pczpRHn7owuIe6lbxSlv/nMDRkcHSg9/hnDjizKIlV5MyAAOwg04/cKfGNm0EVr9AmiLFoHZP8m46MgRoIHbBe4Yt3/ON4NAmP19KDvxM7RVPhMtNNYOH4BL/S2RtwjxSNMmoK8XIYpsxW7EHAYwybLxgbgMOHBgmSb09svgdfNQcfYPMJpGVxrEVChuYbf3NdNyAOjsgEpLSslmwYTmsuN5t8yyGYqNjFPOeHlHFbu9U6cYOtTycrDuLmQO7JOxbneYdOY+KQqGYWDgqy+hWBa0SARaLObQ7nsv+c8wHnmy2PHAfSYsbsFIDcMkQBatnDlbXqfYtP0WMdCgwdlebUmn0zA2vmA34KoKEAsOAEd9G9YwuFKB0ND3FOml0Cs2kjWDKjS4U+qnQk1yzKSpECpsxMgxONt4o4Cyxhs4Kygj40KFQe5GvTyYkruJkr6PKcTJq+hqGJFl9vfS7neI8pu+8QApNIY3boamSpI1YgrE0lshOvb09EAlz4XKQDwQwnOIsOQ5YmhW0Ig1RqxEA0xYNJUecJH3WKirq/OmoV38x0VOp91Mplum3PbKHEK0p5lKpm88PNgKLX3GaeMaL+vcAmb0++wVUhFrrsQVdy5shPmGZeGsDKN1B2CxCgeQMUj2UrQibhKmlBt4KkbqW2GpcwqO4Y0vWHClSpG9LITWrYQ2dg7yLsDVShixzdDLn7MDcrwiB3XsQsCobDzfSQHA3hI1OlaLeS/WoZb6FcwMnqhq5m+o2RvBpnoftOFTyPdcFnf+hQwGgrC/v98PPi8AAx2Jbqb/h1D6JIEZANdmi6MQit5ts5Cd/S5xpMEseTjQzwtCLxBramq8sdtFuF4RAMQHwYJoVEzU7FXa4QiElYJevY3i4C7tZFnoWi15fdIOSK7NmwAgMAatMMkxexWc9UrhcDiAOn9N6xWbwMN0OFlphJJHiYnTZPQsQqmfoBE4XrIEeuVLE7yXN6ZoNCpXt3lbsTiIqgQ9Fzt+h8H0oitCMbphafNRSJhJy0+dO+G7A0JMAcfTi9bbLLgySxPnMjX4hgrNouI8BdAvnd86l47pHH9TCXfvCqQb6l/DM+oGr6ZV2J5wHKf1FN5qW4tk7s6MAqiNzMfep46jttS/ojX4x7F7RTok8uWhGHatPEzBxXzkD2pcnKI7l+2XjR/yrmVFr2Snu45j35Wd9k7BAi3vw/jj+7B+wSteTQKFrmQuiDikS+ml/jZ8cnUXesc64cfjdK5EcIxXl9Tiw5Wf4rHq1bLxdQUvpRKIwLW8d6wLx64fxCliJLAoWHHjIVaC5+tfxZuPfIAyLSYbn/xaLoGII+9hIoCcSLTiXN9p3B65VfBa3hB7FE/WPIvNC7eiOlIjVycw3YeJBELExB7S5vy6MWMU11N/IWtmbJ0TqcOC8sWyt7KI4N7D7vex6j5OW/m9iXjItjzQ47QAEO95vpZ0OWboef4/nss6AKjP6NYAAAAASUVORK5CYII=", u11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAa4SURBVHgBrVdrbBRVFP5mdna3u522W4tFwLSliI9FS+sD8FkRSYz+EIhG4w8SHyUlRkAeQhQk8MMiMbaQQMIjvAxNQ8LDYIKGSCFBEA1QhUArSBfa0q5Adlm2u7Mz07meOzuzTEtLacLJnr1z7517v/Odc+5jBNyjMMYCVEwjrSQtJy0hDVjdUdIQaRPpEdJ9giBEcT+EgEtIa0kjbGiylY8dbH7hLsCc3XLSeX37Uj0KurrbEY63QxRd8EvZGJMfhNeV1d9UdaQrBvKIMBBrKhqRdrMpcS2G3Rc24/R/v+Hs9RP9DUNx7qN4edRbeGP0e3jI/7CzK0Q6mYwIDWoAgfP47rXBOXBD83rsv7QDbpcHD/pGID9rGLKItVt0m2N0Q0NMjSJOei3ZhahyHe+Wvo+qcXMgeoucRkwnI5oGNKAv84vRs1h+vApJvRtjAkHIntz0AIH/M8dwlq6xdOtYKY7JrjPIFoGwtBZjg5MH9IToAA84wY91/IK5jdOIpYRgQQW8UhY0loIG1SxV/swUKhWzTae635XCjLw4ZuRrSKUex+wVOh4d9xq2b99uw5gELazeHuCZDivhOPN5h6cj4HsQI+UiImwxFhwjzCbBKhme9TNMkVXkCAZ2HdCwc78KVQNaWlrQ0dGBxsZGVFZW2nB1NOfnGQMs17fy5xvJMOYemUax7MQTxFwQ0yCCkEF1mC0gIDHMyFUR9OrovGZg1SYVp8/p9gvQdR0nT55EQUEBmpubEQhkyI/mobBDsNxubWhZj65EO7xucjnI1Qa5mBEbQ82EQGfp58e8CSwcFsU4bxz1+2/hgwURHD8VJ/enoCiKqdwAWZYRDoexaNEiOMT0tmDFI8IrHPiTg1OQYglke2QU+kdlskRwuD7fBbyTp+FZn4rWDgPL1qTQdF63QmV6NIPC21pbW9Hd3Q2Px4NQKIQRI0bwLr4vjJaQ3l5N+aPzkAkuEKhCZcpIEr5oTmJOSvO/SLF+P5CETLHetlfHqg0p6D1GBtyRU5k2VVUz5dq1a1FTU8Or5tbODchkxq/tezKJxhfWTT0C2Z1jhj3HxVD1QApP+zS0dTJ8tFrBsVPaHaydhvC2eDwOTdPMuiSJkI0D9FRjv1LJDeAbDwxm4FzkpMlesIxQeuK8B1Pz3PgwPwE/9W1oULF6s4Kbt9gdrPuyTyQSpnJ5vNSFjSt9eDrYCkO/DlEaxpvLuQEl/CkUa7m9zKyJZZFhSWGElpiBti43pi9LEmu9Xzc7xTAM0908AXn/stlefEWa7PHjh87P8MqoPAQLzVdLJCsWtJVGei3zV2Qdc4Yp5HoD63bqWFp3A7G4YE5o54T9zAHtNq68nmbtxtZvfJhQJuBMfCJqL3+HLmUUSm/1kAHmNh6QbKvtZV5ALXMKk5iQreHKVQNvf6mg8YRmc8a9iC9LwJJZXiz+xAvdlYtNVxdi37WPyDU9ZkhlT2YDBjeAL4fAA77heF3uQRWxzpUM1G5TsXKdQqzvDdSWseTUrTU+vFgh4lziOdReWoMOpcQEtv3rMCDKDQiRlj+cXUwuT+BSG8ObSxP4vUnHUIRnOGe9tNoDXcrFxqsLiPUsq7c3iTH5GQNC3IC/uAGCIKH+0EQs+PogoreGxjr4iGTFmrOeQKxr0ZEq7ffd4bKLNrmMAU386bBda7v5wpDBF37sw4ldMsqekrGlcxkWXdjXB5zhtgfo0BopOYcfsbdifhAFotEoiouLEYvFBsPFE2NcJuuJ41040/08aq/UoUst6udNZp6WjFYGo71m+9s5GJ6d8UC+aN3VzAObn1TV1dV3BebLbfmnWTj7k4zxZTkU65VYfHHPAOAZfFOmlnqc4Ns49h3HMfdCeXk5Ll++fMdc5rqmDJ80XsDZ7kn43mRdjIGFWQYYGO4Hvp3idxpw+zi2rkhrbC80NDSYJ5dTeIY37fPjuTIPdnQtwRcX9w4CbrNPu6D6Ga8TfI19LXPeiHgunIa1NdfX12PmzJl4ciywhWJdEXThPF/XxHqgDO8NztI3RSrnT/Ri6mi33RMirbCv6Xe9lP7TfAIPqbMguiKoD8/Hj9eraEpxMGTrx5BDmEtfykJZocsJ3utSOui1HFobdp+PY2tzEZ2YjiFC/9j8j9/iXi9xoarCi2y34AS/+7XcYUQJ+nyYhLsN/PyvhqPtPWiPMcf1PA3KQ12UJ2LSSBFvPuJ2xrtf5oMKzwnSuv4++pKawf4O6+zPqxo72qax89d0FlOMgb4R65zX8CGL9XG6jQ1NIhZwyWDzC7hHYbc/z18lHY/79Hn+PzGTr7zj4PbYAAAAAElFTkSuQmCC", b11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATdSURBVHgBvVddTFxFFP7m3mVZloWlEYgYQGpp/WlCKYkafZDyYHwySk2sjYkV9VEFX/Wh9dnEQtLEaPyp+mC0iagv+oZ9aYzauDxogyl2EX9iILAL7LLsXu54zty5u8PdXVgoeuBkZufnfN+cOffMjECNIqVsoeJx0kHSftIe0hbdnSJNkiZIL5N+IYRIYT+EgHtIz5Muy93JBzx3J/tiG2Be3VnSsbK+XA7uXBLOH39ChGxYjY2w+45BhMOVTI2Tvl7NI6LaqqmYgudmJe7yMjbefQf5qSm4P36/xYDUdevoUdQ9dhKRk0/A6u42TSZJh4hEckcCBM77O+mDy3Qa2TffQOHjjyAiDbBv64DV1g5EG2nFdd6cQgGSCMp0Cu5ff8NdXEDdmRE0jI7B6uwySQwTiURVAsGVO7TSzAvPQ5DLbVqdFY9DSG9WkLk0SpnNwpmZIZdYiLz1NsL33V/VE8IA5z3/yQfPX/oM2bGXEOrqgn1HLwSDSkmlN4XrqlETkn4Jry6pvjl7Hc7cHKITFxB+8pRJ4rgfEyaB89ABl6MVpxIJ1FGAhWJNsIS3ZAYXeopPJOBBhe6RcOFSpbCyAmdzEwcGBlBfX+8PHaf5rxQJaNffUG53HCwtLSljPIGBLHKlAhc7gBt1Vtd1lebzedXe1tambGk5yFvh/zrrt2YyGTXJtu0ycJNEUIJj/LmsbIsJra6umlOUt4Xe+2X+sUmuWlhYUJNCoZDSWlZfyROmF9irbJu1vb3d9wLHwMEQvPSq5JsrSSSu/UMDaPU0KB6LwA55BCDLwXXcFctSu4T3T38UCKlVSlwE7lJc9B3O4NETh3iYSu1MYNCf+NqFq/j5RpqsWcpkUzSM5qawZ17qb08a36H6EoDSZxBgRG1r2QLSaxteIxG4955bfAIsg0yAEw9yGw6Bs1f8sBBYXXeItUCk3sZ2IjS+0OBSt2VzjlKT1Q+/LCpSsahKYv1MoIdrV68tllZgZJoMGcg7LsJ1lv4EZZGg1PWtrUK5Ol+gvd80vaISiRp4fT6N/jtbuacnpPdCsfJGmupJgQiwepEd2Hdq42ATmhBhEwFp+keXsmh3dn7FJ9AS8oet5Qqo4NwtvxiIYikgMlBWk5KfYo2lU5M3XKXEQ51xFAEF/lOJNRTXnWICSa71djbjf0EnOX5Xq19VmXBasaKoHLibO3Zy5c3JkdtbEI0UPZDg2rekZ/jXqyN9mJ5ZUElIeKcP9kV0VpQqEbWaPZf9VMwHUQunyhU6vfwcvl3urx1768EUpzuFcSAdsPS5/CH/4kMjXPlety/Cp6sBfpGxy45j89TyB+/VC7Loev35xWJlx3FIAyRp0ARVRxksGo1i/dcZardUHOx5F/T1iPe+4fARE3zCv5ZVvZK5n34C9+UXYRmDdsNDanU5e9KVzDr1lN+VhHElK1LSDUN6AE04DfvS50BXd825zgRWSrdne/KrIPiQ+UawzMnaLcN6IMRDg7AmvwROPw03aHw74EgEeOZZ2Fe+g3jgQRN8OPg2qPlhgvnf4b7/Ht1avgZ+m0VFoas7Hn4EYuQ5iFs7zJ4kan2YGCQ4Js6RjpZ10r0R0/S+WF9XzzR0dED09gLN8UqmOLjP7fmxqh+nF+XuhB+y4zf1OK1AxH+enyA9hn16nv8LIc2ZtWwLXq8AAAAASUVORK5CYII=", h11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXgSURBVHgBrVdrbFRFFP5m7m4pW2m3Dx59AMurGBugtKBAiIU/atQgD9EAJlQNIZIQESXhj1I0xEd8QKJghEg1WDGEYJX4CC8hRG0M2AISI40sDSmkoXaXlu7evS/PzL13927pA0rP5uzMnZk73zfnnDtnhuEOxbKsIBWLSatIy0lDpEGnO0IaJm0kPUn6LWMsgqEQAg6RfkTaYd2d7BXvDjQ/6wdYrG4L6Ybb+mIxmFeu4Lx6De33cWRlBFBZVA6/4u9tqu2kW/uyCOtr1VScgG1mKWb7DcT37IZ24jjMs2dkW/VjHN+N15LvzRwzA6umP4Nl0xYhFBznnTJMupBIhAckQODCv4dccCsaRfe7b0Or+wosEIBSVAg+chQQyMKnszNwpsCAZmj4L9aBjlgEV6OtuNHdjnWzX8Tmqo0ozi7yklhCJBr7JNBz5fq5JtxatQJM06CUlYHn5IBZ9lvixe0VDH+MMug9yHanC7cS3bjY9jc44zi4Yh8qimb0aQnuAQ96wRP7v0bX8WNQsgLwV1RCycwEj8fBEyoUVZV1XVcRI1UNFXGTStMuFYVj2pgyGRPzdz+K+os/uDBygQ5WOgHYASfBhZ9j9YfgW/kcfJMmgzuAPJGQdSae1YQk4IKqZgJxQUQq1c04xuWWID8rDysOvIDG1vNeElvSXOCY/rKomy0tuLVkEdiGV+Bb/ix4zRtgFy6AOWb3+kxfo0CbZti2T1rSUVE3LZimAbWrEf6MQuSVnQJTctyhE4QrXAJ7qagW9e7WVphtbeCFhfDl5oJ1doJ3dRIBGlpfD/Z9vc1CoKwjA5br8Ipl2esyqWKZcm7o8cswtCj8o19DZvHr7tAdNOcG7vij2l29fuAb8NJSGXCcc/BgECxIROrqwKiPkStYLC7dwMj0zKK6paYUdhunkjPxTG5jOs1Frr2xG5YRdQmsFtgiBha7LequT8C3vQX+268SXKxa6rY3wQ4dJNA4RadKA0njpAY9EyiseFIFCTgkGAQRUqbRfDSPGUWibacLJ7d2QaDKbTGPHZFRyUqn2mV7u02gchbNSQAUeBJY1qnUVYeAmkbEBrctQjsYzUUEyG3CCmbXaa/HqnywE4vccBAOg8+dB64lwJYvBWv4HXh1E7D2JYCCsad81uzDWUUnsPT9jLwv22J6DLoRowafjAdTxITZgH0TdfgUAY1y8R+Sq//rvB3lw4eDLVsMRsEow+n994CjR4D8kUDr1TSgU9c11GdqLmryEzEJLUG7o27qqS9ElKYdpTUd/+L+glLRGvI5voAVuWkToD3gNmn80y6ZY0dRiujWFai6RvPaKxYRL36CQFIYUiQcgtc6r7sEgr7kwJvR5Hfu1XTb0kyGkXw06DvXTB13JwyGh6CINZkm+cSJ6Cc7D6nkDc9zqxFhgTBpOZs8CXhQsc1rEx1Q5k6hv9G+gQdanh2SrDZ99ANuT1i83SQJ5BWAfUA5XG+2weV32P+8G3FnYkpg4TIqh5XDx5OkGwXML+6Tkv14MmAspG3xgxarR8lznvZ2n2TOViwSUdBUw9AvVUDhpp18WMojgybgmF5YwTQZ/KVNYBnJ01Iud85qX0h2w0K09690EsrQieX88dznveC1Avu2dAxKFrF/KsGtSCoFD9IK0o2OBZivBP4Jh8H8JW63TMcyGkSFSOyg6sugfN0QqMXCL59MBeFg3eBYUqHf6eo9mJMC3+Eey7wnohrYnyQWjJ+PvYt23lsUuuBMQe1TuzCnZJbbE3awpPR7KD186Wes/2kTwtGWXkYPDD52RDH2L/0c88Y+5AVPO5QOeCwPR1qw9dQ7qD1Xlz6Q9Q4qJOAPYM3M1ah5eDOCmTle8P6P5R4SIfS4mAgiHzZ8jB+bj6KZsllvUllYjicmP4L1s9eiIJDv7QrjTi8mHhJif6iBCMwe0ql24sz1JsS0uMz5Y7OLMTV/CrKHjehtKhHcNYO+rDqX01rr7kRcZLff0+W0FyLu9XwBqbjqhDAE1/P/Aa1MFsuMWuCvAAAAAElFTkSuQmCC", M11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUXSURBVHgBvVdrbFRFFP7u3bulD9qutWpLWmxjbbUm2AoUadTSRCT8aNJi4gsCJTE+Eo2QEH+ZUH8ZEw1UI/ERw0OjxkhE/IExorYJBGlMqxVTtEChtJKA7dLX7t7dveM5c+/sDtutltJ6sl9mdu7M+c5jngZmKUKIABXNhAZCDaGMEPA+BwkDhB5CB+GQYRhBzIcQcRlhF2FUXJ/s5bGYq7DHHvE0icfjwrZtMTExIS5/3yFGTnSJeDgykyG7vOilFWMG8jIqfoAbZimO42BsbAzhcBiRSCTR91T1KjUKi++5G0UbmlDy1GPIXlqqqxwgNFJaBv7TACLn/H6pyJk4GAyCvIVpmvD7/bJkkEJc3PEKnGgU9sgoYsGrCA0NI3L5b5Ru3YiKl7cja2mJbkQLjemZ0YBUzyeGLyHoxCRRRkYGfD6fO8hIDrvwwg5NgfwhNhXCeN9pGKaBZR/uQcHquhkjYWrkAZ18+ItD6G59FpZlITMzU5IzsfJcAWFKB6VEUClsqhN8PhP5lA7T8uOnR5ox9MnnikY6qM8JUwvATkU++nM3ep9+EX6fhXj/WUT6/pBQpCoFDERsSQ7bJmPcuoi4yKHwZxcXofe57Rg9fkI3Yuc1KfBCf47rocEhnFzXDPviMPLr7oPJpF7HioMfT0vBmQ0babxsdHNAPUkfhCH1wonRHOrugf+2W/BgVyes/Dw1tJxTYWreuwrfeAvh84PwZWd6oQ0TXO8SYdfEUR7Lfm7J0ZBRoeggHkXG4hzYQ5dw+tXX9KHbZAq8fLRK7y8MYvijz6Qz7LmIuMS09uBEwkgnesi5P8MJheXcUG2IxUgfzasDnyI6mtggtzA3R6BZtdgUnoJHm+TEEJNTyKq6E5XffYXKo4epPJzWAIdIOAouwhJM7HgTU05SOypTyNE59/Z7aqjc2pmrQbXwBsMNDMMRiJG1eshlblPheZo0IpJIC5fRKyNANJbQe+XIt7r9DRbcg0Uqi1GoWAy4E0+GlNpT854agVRRY+KhEBzaE5I6BSZ6TyE2Ng4rL5eba9iAMq5FaTfjQQUtTchdUSvngJWff43CtAbwpINaAS6VEA7tCVGIhEP6V2Dyz37kL6/lv2WWlwu55TJJzkpaeqtWJDYc3av0EbAh16Fi4bSQLmiEwisVps6eVwYELNVx/Ggnfnt8M3xe+E3McFLNQZIRcGsWLUslzCPXRVZZSYJwvojTGcJi5S5WTUE2YEAaUF6O/0tya5apqtwJf+GaLzsLeSuXY6Elu6JcT0EPG/Cj+le4tlGWAgsjrLdw/Tq9qcPwtmI+iAKxq2M4Vlkrd0F91t4oqQItTtT/3oXM5G3pJtO7ve7nf3xSFW9+EgslxZue0Mn3Mfe045ijcLJuDZ1ef83LUlTeZ9xeitojB3UDksexd0Vq5zpHoXrvHhh0A1KDb5ScUdX+uk7erq5l+o2oDd6SDNTfj6p33qRLhTFnI3Tyu97djYKHG9WnAY9Lyr9eSoOdx9H3/DZE6IIy201KaKX/1kJUH3gfgQdW6+TpL6VSufuhBSoSD9WjhvJWtIUmpmlO8ywdpJ4MP4q3bkJd97FU8pbUt8GsHyZhui0NfbAfI19/g6n+M9MGMnkO3YRvXr8WS55pxaIlxfrnAcz2YaIZwftDG+Gl1G/xyUmMd/8qz/p4OIRFRUXIrrwDViDtC4wnd9ucH6ve43SfuD7hh+xuMYvH6ayXuUg+z9cQ7sU8Pc//AcWoL5Nsx52dAAAAAElFTkSuQmCC", f11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVUSURBVHgBvVddbFRFFP5m9u52ty3tQmIFMbQlAUTSuCQGMUTACGrkBfTJoPhoNDGIJsYHEoqJ0UhCS5QXXwR80CgJqDHRGH8gJhJNbBUNWNRuKaCwyi5td+/d+zeemXvv7nS7xf7BbL/euTN35nznO+fOnWGYYhFCpOmylbCBkCF0ENJhd4GQJfQTThCOM8YKmItChjsIPYS8mF55R479v/nZdQxL7/YQnq/t80dH4Q78Bu/8MHgqBdbYCGP1avB58+pN1UvYOy1FQq8HdXfcXE6MdO8RubVrxOWGuLicnIjcyhXi2osvCDc7WKvG4GRqsDrGZXyPIYgxhFfA2Nt7YfUcAreaEFu8GLytDWhuBovH1QS+40Dk8wruxYvwc1eQfGIHmnbvRqy9YjdL2EZK9E9KIGT5dWTcPnUKo68+Dr66hFg2A+6kJ2UutLpfKsE9cwaCMzTv70XDI1t0EvcTiWzUwDXjad249f57uLb5AfArKcQvrQUvJcEsC7xcRozAZT2CbFNXC0z2cY74qlXgRhwjj22D+e6RyIxyMLQ13hGZ6QgTrvzD9xjduB6xJe2Ib+oA+weIdQmIb3kwQAT+MhZNQX3yRgRKCPmTdWpzzw3AvXABrZ9/gfj6DZG5XlJhV4VAKP2gkm/4PAqbNwF//4XkfsrsO2myV2Lg9/pgOQbxC6uyDmyPDwML+Mm6L+G6cPp+hGhpwfxfz4KnK853ylBEIdgTtZb2vQEMZcEpwfClDbHPhvFsEWzIBl8eSAwFCzCt4GoFYDIEMhR2OQwXgQjwJkrYq1dRfPklaEWpzcJ45JX3Q0O4mumCIQcT48RDtyN2N3luMcQe9eG9ziH6WB33WeUiQilUGKhBquCRQ16xCI9yI33uD8RuWyyfkutCp1Rga0TJPH4sSCqqx5aNgneNwT9OKlyy4PWQAivNwHurHHpdrnivYAYKBEqEKsh721Zzct+HdfCtyJxa2g0Ea7sqH/UdRaHLCB52iMRnI0g1twJ/hg4O07+lbjXsFOwg91glMaElpvwzzTF4zQK+MNS4lrOfYjtei2bYIAnIhQeua2N7+2kSJRGMV7DRlCgiZSSjlJcJWxG/moxhTURJSGGjtpJjomSTMiIRvR4yznhw5ApuaWmTIzKSQIesnb70c3VGVp296JRgew4SsUTFjiZAtU1j5BMBOcb1XU2V6jMD/56LCHQYYSyQd4pBr24krDu+o8CZfAW58k4pwYJX0ldBCNrkTxIYN0dNrv5eyGId/aRtI3rOqDVep/gqzl51QoEZFIbWVHVJl/mmPpO3NrfhZpV0sjWqFiSBrKwtXdBJiwJuSsks7IqqWRmCn2RbPN6Ao7m1GP3upEostUQyzE2Jlmb6x9vbdQX6JYFvCE/Juy2L1tFn9CtlnGHcyzAb2xVQ9sDY+LDefSJaiuWHKC2uFVC6YzlYoTCOxFwQ8EM0nh0gFTqi7vk83KsdlnesNQ3j6Wdwo4rx5A7d+CFpe8LnWKpg3bNGfRFnGwZdfkGxT9KeQCNQ/RyHW6QDqk4qJD74EIJ2uvpEMzGu1xNvHtSNH9C3ZcFDlAv6Ttj55GNRTM8TJu12rRDlaUA+L8cWUwnhHDlcu0NO12ddsx33+vuEuWLZtEhYmnGzc4nwTp6Y0vZcJ5HRSfgXhoW9a6cwGxvGEbGuZ3hBqyjvfE74+Xyt8QymFL86BxM/mxXOgR5h0cHEjAzVwLpvnbD3dgufDjEzPpjoOUGXbsLOCX3yINLXBzE2Ri+3B75wEa3lS9URrU6Ryd0948NqqMYhMb0ite8Vszmc1iESHc83Eu7CHB3P/wPWqtqymbgfrAAAAABJRU5ErkJggg==", g11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbASURBVHgBrVdpTFRXFP7ezICIbO4LLgjWJVJxj5EYtbQx1sRQY9TEKjWaWEmNGhAtjSwqEg0UsC4gBqXajR8uTWNatUJDWquhBds00ir6EARKEZDFgWFmXs+5vPd84LDYejJn7vru2b5777kS+kmKovhREU68mHgmcQCxnzrcSCwTlxD/QHxJkqRGvAoiwQHEacQNysvRGf62r/WlXgSzdfHEO7uPOaxWPHtYDmtVNUxmM8yenvCdFQKTu5urpdKJE3vyiNST1VTko9PNgmz1DZCPn0Lt9QI0Ff3q4lMF3iHBGL1mFcasWgnP8eOMgzLxUlJC7lMBEs7xvagJdzqdaKypwe9r34O94jEG+o+B+/DhsHgN0i12dnQIBe2NT2F9XAXbk3qM27IRQVE7MHDsGKMS75ASJT0q0N3ywsJCREVFITU1FVNGjUJd9qewVVZB6ilwivjB/syK5tI/IZkkhJzLxuA5s3r0hMkg3M8oPDc3F0uXLkVjYyOysrJQ296O0Tu3YWDgeIDqaDMwtRUqFRvVic1mE3ynT4PJ4oZbYStRfeFrTYwwUJXV1QOMdKiAy8/PR1hYGAICAhAYGCjGvby8EB8fjyB/f9SkHoP1j7v6EgrbzW4RHhAtwUwtf5WhnUIy/9pl+M0O0cSlkxd26Qqorn8ofCTLwvLq6mrMnTu3i4cHDBiAAwcOICQ4GFXJH6O1qFiIUliaiIvSqRB1KJJYF047Yai4BAMIO6E3v4fF10dbbiKHQgtBvNbb1tYGh8MBd3d3Ude4ndzc1NSE2NhYXCcP+X8UDZ/FoXCy60UI2jrDQCVsNlFHu432bAfcCbBt5RW4n3rUaI/wtqTGo4Eb1kcVqCWQtfp5Y/PmzWhpaRFWiImSpNeZ9u/fj+XLlqHmkyzU6zGWtHB2ltR08rrlj9DR+gyStzeWlP6ieYHPhYnsgXBt0fLMHJStfhe+La3Iy8sT8WfLma10+Gie4DImJgZZ2dkYuX0rhq5dJTzhpH5m9ohTBaYAqa1DqOZsboZ87JQmThztrMBireefb76Fs6kZZes2wXz/AXJycgQOjGEw1lNSUpB9+jRGbNuCYRvWqUq062HhsqOuHuiwi+3GXF9QaAzDYg4BI2mmnay+MSoIZjFRgpuPDyZ9lg1Mm4x9+/bh0qVLunu1cEjqgbBnzx5ERkaKcNSeOK2P8ZHtoDPBqcLTSf8OKsPqZJg9PPjTEgvUfd9UfEe4SWMHAe7+mggEZmUgPT1dAPDKlStG7XVBiYmJaG1tRXR0tBBVTdtUIbcrdruODMWAEgbkoCmvcTPApMYCDlpA0qd0/jutbXiwKRJP8i6KcISHh+tY4NKIj4MHDyI5ORkjP9iK0dHbuwiHwTDm1rKHOg4sWo3PceMkXXPakuXbdxOAWpCZmYnhdA+kpaXBFSUlJaGD7oW4uDhIFgsq4w5180BnzTTQQ/+GFeDt4OcZOBG9UUVsorCKDyI+Iw4fPuxy3pEjR0Q4xDiFp3Jfkj6mGcYXmUqNrIBMPNNzUiD6osq4JMJGswClmfKAQ4cOuZx3/PhxERb2lMXXF/KuvRRjpz7uM3OGVpVZgTusgNuQwRhEiLfevderEtUpRyHRNcwnIgOQ3e6KGDM8npGRAYksfhAZBQdhx/v16TC56YlLiTkhIUHL9dBOd/nTm7dfwEJ3ai68CY7l8j3Ros3XtisqLi5GUVERNsTuxaC5s9Bw5Sr8KU/wW7hAm5LBCshUeZ/Yg8Pw+NRZzkK6ANEVtfx0mwBqx9sfxghMFBQUuJxXVlaG0tJSLNu4AYPnzcHIN5eIsKi0yaTmarnc8hg3FqPWrxYjCvqmmrQTqEpKQTQlLRx3xoUr4kNsxYoVcJs/Gx7PU7WzLFu7DdO13klJCbAMG4r+Us3RTDzaG4+IiAgR756ILzYb3ZIGSuQ/oYCaIomv+aYKPndKTyr644m6s59D3hGDiPXrcfny5Rc8we3z589jwoQJWleGlpaZDPMS0Lkl4bdoIaZmpr+UEvVfXoBMSH8jNFQI86RUXRN+5swZhFK/SrIqS1CvSemTqzdwj/ZwO53dfYFSI68F8xCUl4sfb/2M3bt34+TJk1i0aJFReJektM+0vI2SFDk5FX+f+6pP4Rp5U6Y09YsceFACIj1PoWX0lZYblAhAt4cJK1J5LBv1312DtUx28Swh62cEY8jyt+C/dRPcRww3Dsvo78PEoAQfUAnEO7qPOehiai75TTxInIRs92HD4Dk5CBYfH1dLMbgT/vNjVX2cnlVejvghm/6/HqcuFNGO7CXEnOAH4BU8z/8Fpv+sXVUHbWEAAAAASUVORK5CYII=", z11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQVSURBVHgBpVZrbFRFFP5mdrcWkboQqQkmpDX4QCC2XdQKRDFqRPzhIyo1DdKmxsQYY1VM1aa2jUbTVHzFXypQJMQXVYvWsphYC6EJiWgVE2pM2rol/Cl1t0q7y+7eezwzc2e7S7dQwknOzr0z53zfzLnnnFngHEJEQdZm1l7WYZqWqDdXz1qCCxXl5AHMVXbORiTygD/LQwtrkJJJJA8dRKpzL5xfjoISCVA6DV9xMWTp1QjcswGXPLrJusZYW4UQ785KoMLhgSN1IIz4G69DnElAXrEYIrgQYv58Yzc5qdWNjLAPUPhyIwoefsTCtDBJ6wwCb+eaPd72JlI7tsMfCkEGAtpIGCPviUD6F3CnppAeHETBlhoUvthg4Z6zJxE25jz8qsKSaG9j8I8RWLkqAyy9fQiDrYFzSNSJBwbgr6nFvMYmG65yJhmxBDt5qEl+24VEXS0CK1bCx+GQHsF0HCnrTREI5QuXmZ2JCaT/HEThrt0I3HufMviJCe4Q3u6H1czpUBnEaETvXoFLxhIKs6IC2LwFuPY6wO8Hjh8Her4DhcOayvU0/ccxOEuW4LKD/RBFRWppocJ5QH/Ufd8ADO7jXcnoP5DxKQiOr6jeDPHWOxAnTkC81grRsBUi8jePr0CqtXhc28pYzGzq5Emk9vfYI9erufvVk9Pdndm1HB834OtuA+qeAJqbjJaWAi81AmvWApGIXhM332Jsx0/Bx6FSGE44Q3A7vKqkqTvXU2LxIkoVLyKHla66kqivj6jzS6JrSol2bDcl9XWnGUdHzXjkiLZVPspXYUxW3GgLcFgRBjXX2JjOksxHTaWAykpgXxfAOY9NVUD/YeCTXcCqGwA+pZbVq7Wt9dOZdmrMnqBEIqsgcjPGIyko4K+XZk0Z72gU4IpG8oyxkRmIaYxkKjOnVkf04qXzZvaN3waAtevM8549wK1r+CTcGv4aAjhbtBz7PcdFYfiWL7evMb9HUCLKQ6ChoVyCt7cBe78Cen/kLvMqe/J+qqqBfyeA/04bm48+xAxZutQ+DagT9Kkn34MPzTQ8xEtc2ejYzU3kfeCHA5x4zxjQZcuAbe3A55/muKiy8W3YaF+7bM8niscpWXkTpTkTXJVF2fr0U0RHfzZ54ThE/YeJnqzLsVE+yjcZKstu4yW2VfTysN4N74f7eHWeFnF+sdUs3/sAsuoxNdXBraLWpkAta0xyf5fPv+A1s7mLtZdbGyy4vhtyjcz1Z6LQ3qYLx80XrrPC4nqF6TQ3ZYemPv9OiFqshcsV7HA88xHlAK+4ntye7mzwlmzMfFemYlc3m65w+uIzUM/3usERNzwtCxYAZeUQd90NsZFbc9HlmbCcfWXOdhJ16XfQ3KWXLuLfRb0HEM0CHPbmVEiD58L4HySb1gG1pl0zAAAAAElFTkSuQmCC", C11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP9SURBVHgBpVZdaFxFFP5m7m4TidGtpCG2UNI2EkErCftmlFREa6xQa9tHsRVFGgWjpgZBdNtQMEZRqQXFn/TJ1t/SB01VaIhQX4oaTWvrD25Moi+NNEm7P9nde4/nzNzZ3ZhNiPTA2Tv3zpnvO/PNuecusIQRUYz9RfYh9iSV7GL4rIu9Ef/XZFEIsFwbWIxIVQB/ki8J9hil08h9M4z88WPwv/8OlJ0DBT68VfXQ6zcg2nEvqrbvcEun2fcppV5flEDkCMGRP/EF0r37oRlQ162Ciq2EqqmxcamU8WB8jNcA1c+/gBXbHnAwCSbZt4AgzNywZ146gPzAACLxOHQ0aoKUDQpHBDK/QMC7LJw/jxUP7UL13h4H95TbiXKa8+UHkSXb34f8++8ievPGIrAO81AW2wDPI5Edj4wg8sijuKrnOSdXK5OM6ZBRpInlPvkIOSaINFwPncnAE6+9BrqeNdcKKp2CyqR5znkGOm2vkYYGFF7tR/7LE4IXYx8wSYXZJ+XmcrwFamLcZK9vux1698NQjetsCv9MARfYX+nj6GS4B2tB6IUzowiabkDNyWGo6mqZWhnhn/vNoX54BGBwj+XQ23dC7+lkSTjrox9wLu8Bly5ZwVpbgXVM+vNZvlOGRMvvXA4iR/D7byhw5UXv3iywXUKwVUb+4CCDA97atSXwQweBd9624rvz/fYUUMXZZbNAXR3U1AV7PtPT0BzncSEUjn3mCNqFoMVsd/xPc5jqmW67YGICeOM1lE63TJNU2pI1NwOb7oD66Ueo0VFoJiWekHcmtMZIeCCg5B8GRzSX7PH1V8DsLG/JswSORJClXNvagM338P63AVymqr3NVp38pC7PI7DLtGcDqqowz3wfFW1qysrEVYS5rE2EYw1GvlAMk3MZM4NYzFb76dN2pr0dS9rZM8ApPo/up4EnOoENTcW3Vq9Z46KmiwSKq8NIzC3CSMDlhj2PVwZ3cg1y7KcfA7/+Yt1Nu9IGRoRgWEaePXVbJS/32XFiPyCv/+rVJfBbWfv1TXY8O1OJHl5Hhxsedz2faGaG5m65iQr111HATp2PEVdWqSGfO8cN/CTR1vuIZP4/LmtkbS7eUt7GG10vGuLLpoC3HOx60BxMscE138h1di2/hJPA339hMXNvsz70FvSOnfLoMFfj7gXNLuhNgN48WCRZjrmmR9098PY+K4+Kza4UZD9/xvz+PvLDbQcV5CiXRVxi/QO95dJ0Vc6EKOEigqNHyGc9KxHNA27dSMHg5+XgiXLMSp9MYTft29xzEyQ+G+myNDlpl9RezQLEobZsgbrzLr6vdbIs+GQuthP56B+m5dsQXcG/i64Q4GIZYDJ8JpLGlsL4FxCCn+IgugLbAAAAAElFTkSuQmCC", O11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQMSURBVHgBpVZdbFRFFP7u3aVuf2y3UJeyFbLVrUqo0p8HrD+ptAaMNbRRHzSGBBIfND5YfDGGh91ijNEaoy+SGCONITwoYtsHSdTQNjFphQqlbYCmwC60dOmW/enP/ty9e/dyZvbOsoQu6cJJTmbmzMz3nXPm3JkL3Ed0XbeSukgHSD36HQkZtk5SB/IVtskAWKscyUUkrQL+MTVuUquSVDF4aRxHRwZw2jOFWEKBqmmoLFsPp60Se+qasLepRWwNk3ZJkvRdTgKWDgMcf46fwWd/9CCuJrCxtBzlRSUosVj4upV4HCtKHFcXfHx8qH1vNpGbSLruITA85+xTX3Vj5+wo6muewTqzGY1bnJj2zyFCETxls+PizZmMUxFFweSsBx80vw7XnveE+YCIRBY5F55PdXcjPPIj6h1PIJHSEFNVBGMrUFMpKFoSZiJ0brQjQpFFSQkItY9X4/tTffj0t58FgUuciSwMLOfjp/sx2XcYi6ZNGYDtW6qhQcf18C1OFCKtslYgStGwiCKqwtfZyyvw9V+/o/fcMMOzkh7hBAbTPjbwf3sQvvVReLUKg0DB3xfHcH7Gy8FiiQR2bW3AhZuzHDgNzto41pnMhCbho2M/IByNMLhXWJmzCDrYaPjkCcyoc7CslKEmdfWOhwQqyzJ2Pl2Lb97cj0nfNQxNT3Bg5jlbw1oWHeULc0shHD/7r0hVJ9GinfWSJ/6BNFQIu3kRj7YFyNvnoJhMfNX0wg1cD/nRT5XFStc4N2RLKLLMCWgGJydG8f5Lu5m5mRHUsd7xpXmEnI/AumyC43wB/DuWYS60UJlJmWpZTRgRi0ClAuBLdQlnZ66IaYfZOBBYb3ixeZMdw6kgCgJx/kFFYlGYKD2yJGpB54Q69Ay4RnpXNBSFbzGYIRA7UZQw4dbledQEE3hZWcqs16g8mXdp1ZAwWqZJmrs7VelotSwbi8DLmLbFZQR8y9iQTKH01TjVr2ZM5ynEUVvlEKNwhuDKgbewMNiLUakYVd5LQAUeTMh5xwabGI2xFA2xXtOzjbDBBEsJ5VmTaZ2M/CWdmvbtO4ShT2IfA3VCCbrAfm3bDatvApWtdA5qM+KmPFNEuXeU2+D54idhqZbpLmHX7GAB3ZSNnx9C9LFqBP4vyT8CPa2uN94Vlh7C9gqU/aThrS80o8H1JXRbPS/IfBkY+L6mVjbgbwPrcALGJAzOll2obWnh4a4dW8cnrR1wt2W87zIw73lw3EjfrDh2ZggH+4/CG/AjZzDkQ2WpFYff+RAddc9ng7vFYLUns9Mg4V/4L/+dQu/YCDxEdC04z7eUFRajcfOTeG1bA96ufxHWomIgx5OZI2L+6Pfoa5cB/SH+LjoNgFAWoMewuY0yzym3AXtTirBNr+vMAAAAAElFTkSuQmCC", m11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAStSURBVHgBpVZpTFxVFP7um/eGYWaEYQ2UPW1BiEChhRLTVmussaSG/qg02B/S1DRo1KL+UJMapqHVxCU22gRNTKGpDS41aml/WNMU1NpYtGW1bQChhZatMGyzL89z37w3QISK8STn3fPuu/f77lnm3AHuI7IsW0hrSC+S9svzYlPnqknT8V+Fb1IBVir1yxGxJcAP0GAltdhdPlxuH0aUmSGl6SQC53/EweeOw2KSkBghoTjViM2rzdrWKdJDjLGjyxLwcKjgONPSjxNnruPNHQlYe+E0WHIKfs56HD26aLh8Abi9AYzOemkPsKfQgk3zRFYiOfQPAvXkCvvl3/rQ3DGGFyMHwTrbYXuiDA03BFy7OYmSHUV8tbYLLk8At21ubMs0Y3eBRYN7RfOEaTGn4ZoSlsO18OTkQFpXAOHmDbCNJWjtd8BB4WKE2+qxBHfJsnYw0gD6xl14MsuEisIoLVwFRDIgqow8NBbXF41wHqmFPjcPgsmk4HDdGHJVxq8Hm4LYMqM3MgJ8XkCMWcI3nbNYExuGolQjd6WedKuonr6SL3Naa8AZRcYgOOwEykLAWkTdfhYKj0wk/BP/KupEMMGHE7/bkLvKAIMoPMrLnOPt5Mvdc3Ngr78B4YUqCHyMigKbmIC3+GF09tkwbfcqsG6fjMXCFI+8PiDWOIK8mHMYtu1CRlwO/1gt0KOMW5+d7cNVmx46sv+840TjbBLY0BCkqn1IMDF88MMo9n/aSx7I8JC6VWWYw7bUYyiMP4WMyC7sznoHI7ZLGvsjnGAdt+qb+jDr8CohmZzx4Pl3r6BiJB+Db72PxJeexdm0Drz6TDaBgsoUyuim0aAbQ37sl8iJvoCr46V474+vcKr7KY0gnRMotdV7ZyaUVK5eqvXvmgex5XA36g40EJobVUcr4fGpp6fRRTownY66jo/xURvllHLXM10MhycUxnTGf+fcqmy8C1dAB0PAi4AowS2LiyItiZR4vw9enYQlRSlXXlV+GEU/jpcnIlhfwAA3TAYCFAS49eEKiCAKi9RPfi0LHsy14rlRmkGcObRuKkSwJlavngT/KiWJ38Jash0maWrRfHb0JezPfRmbUlq1qTZO0MKt4pSwoJtYiTD4AnqkR3Qumh1zpCE+/BZh6bWp73kOeJJtTq+M185NYNLFcyUoCbuf8NPbvcHeszX5cyIUcWW4FGa9CcfKYrVlGQL1C+5nc7jEsHfDA2qP0XRe9IILkuBW7IdiWrDnwRrEG29hlakH5ZlHyJt2CMyH8rxQV23gvUhQX/aSThUlh6EsxxishgX4Bp0dT2e+je3pdTCJ0wTaS3X/C+IoHHfta/EJlenJ67UozUrElgwD36LcDdxQapEzESif+LAi3wRJx3C6yxnsQ/Rw+U1IMP6FSP092H2ROH97H0adaeie2Kx43Db2GHZmG7Ar16idiV88A+r2eSESK4KdFT/1u/F1lwP3HAFlWUTYBPwBiQgi1MVKu0NMOIV2vRkbkvQLwa3ay1JXZrVKomSwhYhahzwK0bjdr6wxUr5WR4tYnyQRcBh4/rDMlbmkqJd+g7xyuSj/j38X1SqAbQFgvzpnVct8Wfkbenp7Hi4oTt0AAAAASUVORK5CYII=", v11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUKSURBVHgBpVZbbBRVGP52Zi/T3el2d6HbdneprVVWW0q5rQ0SJEjBiEZJfDIxUWKayJP1khiJCYUHH5QEoo8+gMb4YJCbBkk1baEtsYlIbUVpS+lte9ku29ltZ3c7s5fxnMPM2mBLMP7Jv+fMmTPf99/OfxZ4gGia5iJ6hGgH0VHtH5H0tRaiVfivQj/SAR5WTq1GZFoB/G0ytBJ15fN5JJNJLC0tQVVV5HI5tsdiscBsNqOoqAiiKBqfxokeNZlMJ1cloOHQwZFOpxGLxcBxHAOjI1UqlJjsRSaTYc8lJSVwOBwGTCshOfovAt1yxh6Px5nlNpuNgZIPMDM9BXX+ElweP1z+FxgBVUpGvaMElEiXdwxPOCPmhuXSVBsS0ZvMfcNqqot3r+MR9yCJ2w/EcrWwzvM8M2RitA/yzEWD4IiRE85YoDFX5r6D1H8QXvUYUiMfgE9dKXhQ17ATJYIEZ5GKaPgXtkbfLUydxcLwR/DnjiH6+yFMDF2ieC6ip1iIdKZR+nDrciOic+NoDG1CQs7DzJtwbboZFVVbMffnCZLQJOYTeWwOlkEW30Jk9ja2OI+THGlQVGA2PIA870PVrnY4RCeFdJvJzwGWVDmCRMqGdeU8em/MIvhoMUxWL3r6buPclzzZsZslTCuUxG9oqpvHY3s1qEqShFlBOJKD6HFDyyXJe0bQQgleprOh6Rxi3ndR6bwOh/wtcY2HYJpAuViM1FJNoSK0ZaM1MwC7OYbFRA5ZUsJp4QCeCL0PNWczrNhFCTbRWVKN4cx4G/pLavDaxs/ARQ6h61cOz2wQELjzBwNdWJTJWcgSckAlFNVbBYRnFuASVUxYPsGOp/dgYFRCrZA1CKrMekJQ6faQmPPo6u/Grsd3IOA6DJ/vG6RzJvizC7TU4MinUCTaoWWyWMxmUFlmhRR9EoLnADpHtqGjPQ7RaoJHTMHrvUdgVBEs5DBtr2qE4HXg5786IfpeQWD7OfgD1Ygpd0i950hsiWaJkrlQomByfh1qd3+FIu8+XB0BijUJvcMy5uVMIVPUgzHKROs5H8sgNhHFNbkXtWuC2OIthjx0EmubyhD/3kOKumAPFmsmYZm8jLvTDVjr24y91VEEytciZFpAfbXH2BbndALWDl4M7Yev0g/ZnkZ7uAuTQz+Btp9IZiPE5wfA20mozEsI+/uQsq0nFcdBkboxJWXRe2ueZN2ON571s8OnSx8luEJngiCA53g0h15H8XgKIZWcSmUIZRuOICD2IK+FcXPNVUSC7XCWjaC+vAeldR8jIw9iuKsZOzfw2BO0sPZBsXS5QAlYzzD6TsO6ehysfQk+jxkV24+TONeg1J1DZQWPpkYe6wNp7NxiQ6mHh8X5FBa9RzElC2hwzjJwirGM4DxHjjxts5306NPWSzc17X8TFXVncLb/IoJ1IURsn7ITTE922RoOfYM8Eu7PMaf60Py1gjbpPTRs28cQl3XV0wRzjHVTvV3coCWbSqVY/zd6kCHh4R9hSXwBSbYT8g/hcAdx+IKC890jeG6rDydfdTPL7XY7Sy7RzQUCnaSFDCfonJIoilIgMMa4FGFd1iawNoBIYgljU3FkOAG760sNcCqFdn3/hdOKe52VEVBPaL9f7sl9+5mnlNRqtRrL9FZrNR5WujJbdBKXQURvLuMWM4SWIgWl16duwIpX5mqW0Uv/tPbw0qH9j38XLTqAtAxwVF9rJep6EMbfxcyyV4+LRwAAAAAASUVORK5CYII=", y11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAP1SURBVHgBpVZdaJtlFH6+pIn9iZoV+jd1JkgSa4skVqhjiHo9av0plopUbxyFCst6UfHGZBUKKmy7UxDbubX1woKV7cbdLAi78A+HdKQa16QqadW5JG3+f76z8775vjRLm9KyAyfv+c53zvOc932/97wB9hAisrL6WK+yhmlbYprPy2rDQUUkaQD7ldl9E3HgSa1CSiQStLCwQMPDw2S326m9vV2q2+2moaEhmpubo5pZeWvxlBpwHw9+YS8tLWFiYgImkwkMitbWVlgsFhmXTCalrq6uyufp6WmMjIzoMH5FUU7vIBCV83BO2JOTk5iZmUF/f78kqIoBJ99VYSqVwvLyMsbGxuDz+XT3KY47VyHQ1u8XVus/oU+wtPgZHrH1QmCJAImp4ZIwadtmTkkc/etXHB88gS7XuHgVZ/UwSUQnmOXhrfzty8j87Yep2QFjQzMMjKwYNJLKnJXKbCSBCqhslwpJFNM30WQ/C9MDz4qQABO8oGjVh4VnK/gilNI6zC1OBockqEbXSQjbRpmEoDJRIf071IZHYXF+yYXJpT3UwD8vCSu//DXoh5swGhmmaQMwN4I08ApwRyeQznAlie0tJI2lmIeSzIBKQRToGszdz4sAryAYFFZuah50KSRj1fvWwJ8Np5ehlcOHYTxzFhe+ncerx99EczGL0nvvArdj5SI4SY2zncnI/NzrX8D8uSR4ThC4ZXV/rsGgLYOSywG3boGamqXD+OHHKLg92Ji/iDxvvuWpVqClBcVXXi5vAgOjUJC5AkP96Ud9EW3i2Sos9caNuzeTE7CZgMJAhmPHEAqF8PN//yKdTWNzPQrDM0ehNDXycm1VwCv5yVSFoKFiFQm5XAG1YuM1CPLY09OD3sd7cfLE25jd3AS+u4YjiS3Es/kdOQ/lC/hDswVBROAc6uxEJBLZEbwSjiAQCMDlcsHpdMJqtWJ9LYwri4vYiMWxmzzY3qGbcYNGgL6+PtST0dFRBINBSeLxeLA+MIjx8fG68Q6HQzevi3PgZ8O3cv0rrHz/PgzyYCk1XaosbW1tsnVEo9FdgcXhK/GeP3H0I7ieHBCuU4JAbHKMSlsohIdhUP8vkyg4kIjjoIoDZ+yC+bFvdLedD6siFjKgGO9HQ+ckCFoLOCC4ft6Mbe/o7vPVvcgGrdmVfjuD0pVPZavY7yT0pmcYmIDRNiZclWZXVYW8/qTkP5iiTKOJsprm6qj+XsTmp05XXz7eOlMlvx5RvHiBsi7HrkTVwJmebipevlQN7t97uuWZxKqJ8q8NUa7/acp2dVDmyMOU7XZRfvQNCaymUntemfVIxKV/nvYvV+ke/l14NYBYFWBY8/m1z7yu3AE+q8VPPYFSbgAAAABJRU5ErkJggg==", L11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANbSURBVHgBrVbNS1RRFP/d98ZsrKaxtO8oWwXS50IhIiGEFkm5qHYF0S4sDQIXRo3QJihq0V77B0IjoqIyqaVkieAi8BNBRR1T58OZee92zn33Pp9fqdUZztzPc37nnN+dewf4g0gpo6QPSNtI++S8xPVcHelBrFfYSDtYqzStBCSWcV5LTYw0msy4+NIzi5Zv0+jsS2EmnVN7dkc34EDRBpw7tgVXyqPGdIq0UQjxbEUALod2jnddM3jYMgpXChRFQigMh1Cw0VL7kmkXsxkHg+MZSBrXVxXjUtlW4yZGII1LAHTkCv3RqzG8+DqFkyUFyAtZ3jYhaI9nID0LNkKKsuwZTuHa6Sjuni827u6YTISpOTWdXJbHb8bR3B5H6f4wrVqe6jiM84UgrgL6MZjE1VNb0VC9w5TrBIH0WxqRSxNt6ZjGEwLYWZiPVM5CKiu0gsYCSeqnc4E5pUKt7SJenn+I423XLPtjYppUUDr6Ph6U3e/F0JSL0n0UPSyqileaZeii2KVJn3ouO0L3UAq7IkD7vUOIhFXshSH6qubey45fGIo75NdGPCmxMU+XXhcjUBQsJlDSQcjkqFSWhZFpRx2Qy+WK9DqGueidmoSqtyCdTEgqB6cvkaA2GVC/NBkas9IeHk+wuebsfXfCxFDBGRznXu+Y45M65wgCcSkLQUYyQOrC6KVXIaQJJOtA2zPhGbPtYEgTQqllvQi0sEHWkbAtjwYRcC31WSL+6HfigfirtHki4fgATLJaTv88Axuj5FBgAbdrFKmBHELMOQUIH+5U8xxyv0K2wvNRrtN50IYbO/+AmZ2aBwgfma+zxPolaJO31/S+M0A79+xIFf6HcJnsLZVm2MocMMlxuHPIDlyA5Qzwcf4rDlz6Kbj2HuSVfDLTJRaxzvfGZ1j5sIvr1QmRi07G6t41yfSxt982s83Bu+g6mJDNZ2EV3vSdrxVD6i9r2y1YEXUxqLeBOwqAkfyJ7bUQ22o8kFUyMZmqPdEbBFBjlhq1zyUPTgzezQo58xpy8imQG/b58O+eYGvvhihqgNhUGXQeM4Plnsw6DRL1gFohEx8hckOQ2RGysMF8If+ocioKKmi82S/L4idzhdTVo98s1y5t8h/+XdRpB/GAwz49F9PHfEX5DXmAHL4/YdI1AAAAAElFTkSuQmCC", w11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgBpVZNTxNBGH72A2wkIQtFgZjgQi8KBksMFzVKookcTBRvBOMHf8DqQT2QtBA/0nAxHk0MDWqKHJqqEYkHiYkx8aQHLxy0pJresDSh37s7zgwzZUXBFp7N052dfed53vedzW6BLUAIMSiDlAuUCbKOtJgLUJqoFWyREKgWU5sZKf8Qv0ZPIUojZ63iU+odPqTmsZj+jHw5x2NadrehvWE/ju8bxOmOC3LpCuW4oigPNjVg7RDiKL+ZwyjuQVNVGJ4WNNYb8OgNPC5vZVGgTK0m+fVozy2c6jgvZULUZPwvA5E5d8/fnUB5ehrhqaPQtbq1MB5JXNmwNUDRyiGRWcTZzou41H1D3r0uK9Flz2XmhckwrKdPUN/bC4setmOtiTNtRQzIuomiKug0DiD27TFsYuFqz012J0g149RkSRWhrDVGafY5StRAb2uHms+jRPIoMjrynEPJKdD5QmWuIGL2NLTh2eJDfEy9ZXoG5RSvQGR/hV2Uwveh0bNGM1VzObqYQCFYr2ADiJxzCHS9Doqm4NHXOzjSegK7NM8Ae8xZi/julGeiwI8kNaDi6V9QPR50Nx4TbdmojMrucRP6Y9FWerV2ODbBz0wCvuaD7HaAGZxjI3t+TmQPqMvLUJqacNm8jWpAM4XjOLBtG5ZloZ4eAifZHvh5UDIJlabFEysWoVCTWqGw1tLHmpkImKwCgxskvvNuKLL6cplnVou4JKtGGqiVABe3C2ngBjNY4oNm747E3dB1XQ5XKgZKXx+qb0jVBl/Y6D3lgHZmEM6rl38EjoyMoFawfQuFQujv72eXL+Q7n5BMhhQPHyLW3mbiUBJKrD3xNdE0Tfdr3JSuC+zKnntNylTYFibbMYhGo5VvhLssU3yliD0RrFRRq3gwGHR/8Uxs6F1A3rUnw7yKWsTHxsbcrQlgkw0KyQhndob383/CPp+PxONxt3gIW0FUkpbRkUiEDA0NEb/fT7xeL2ltbSVdXV1keHiYxGIxks1m3W0JoBqIPYmQ6rFAdvDvIiAE0i7BhJhjLTW20vgNcfuese6YrzwAAAAASUVORK5CYII=", q11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbCSURBVHgBrVcJbJRVEP7+f69e9KCxLC2UqqRAKNBCAY0KrYJCBCkGNBwiICFYJBI0ypVQYyREQ4CQiBoSkCMkRqDlkqMUEKuEclRCqqLgIt3S2tpu2+1e/+7/nPf2/7e7PShVZjPZ979j5pt5M+/Nk/CQxBhLpL8C4onE2cQZxInasIPYRlxJfIG4WJIkBx4FkeIM4i3ETax3tIuv7Um+9ADF3LoNxCs7jqmqCrWqCoF7f0GyREGOiYE8bhxkWe5KVBF54yP0BoCG/ByCbhbkaPVi+4EbcLQ4sWpOJmJyRoQWM2L39+XYcrwOBqMZy2ZnISM1PlykjTifgNg66jL2pJwr3rjzCnYWVyHaYsLk8amIIYst02dAMpuCaxQFrE88mFSPvcdvYfO+n7Fw+lCsWzJGByJkkuxOIIwPUl5xsw6vrz4Ft1dF7nArkvpYMNAaL1xtYCrg9bYLMhiQ+lgcnslJhcutoKzCjnNX7Ph8zQS8+HR6tyA6blpIeV1DC+atOw0LWTl2eD9hvdunQglAAJA9XsgEIPjvgyxJ8NOYl+bIBCbryWSYjAbMXXsGv9sadPk6iMROAKhzg67cd+8eVKUNJZvzseDlwfAqKjwk2KswKH4GsiConLOP/3tEHwfnoTkcBP+f9lw6zu2YjFizD76mpnAQGyIAaK4v4m3Vboe3YDqiNm1Ef7OKwlmZxEOQEGcWIHx+VXhAIsWSN4w5ABrjyg0GGctezcT6xVkY2EdG9JbN8Dz7FFhzs653pZ6iegyEELnKfwAovSxHSyDX1yNQuBwvjM3BiMFJ+OrwH3A4FTFPIqtF+JNiskBkBN+CYRkJWP9WFhJijZB+/QXG7dsQ+LEcAVLeduwI4ua9EQLBWdL2Q/gnEAignpSar11F9KZPYJRor0l4YMpU+JcsBeLiUHnLgZwhSYieMknbO4hk9hwsxq1GhsED4sgKF4z79sBw+CBh41vjh2vNOii5Y5GSkqKfF/ykfJwDWEiNXbznxm+1MEg+9OsbAwN9Rx36FgbaEmFkPysCs14Di40VemPyJyCc3EdPgBFATqY9JK62VmBTU6zwvDIDgehoNDg8aHUDuVlp+rJFfAsm6l+pyUaxK2KPif1z5kHlbamL80qkoGZ+MJBCQ8qCRVoXE6emxJm8m5xgIY6QMpF74Do1spnfj9YZ08gDkmCeVly0ZDJBIvQSIvXJV69ESFLH5LZ/cDC0nnk8YD4fVD7Ot1LjuL37IfdN5jMruckZYv9v3oSx4jK5ngMIpoek6yMQgjt6IhxQeXmwg88hi0GnI8goPoXLCvCpfJh61Dt/6gAyOIDgodDsCCrs6nbgwjjzQR5AWuSHJjMdCQu2OYAOpMvmIGC7Q4EgPJbYfhQr/pDFUtiiSIsZTxX0hjRYkX0xsaE2944oHOT0dISrlPDoqJNRiaFIdHAP2IizpUGDoNKdDu1OD54x3cMwXPop4lvNGQ1msXQ5l/Ef3xkWDEY5a6Q+ZONZsJsab/KvlpYWkTbisuku/TSKfSI94ttVeRMsPr5rAFo6qlpsJCaG7qLd3APndQC3a9yIMqlIe4z2iFLI9OUOyHQQCQvT0uBfvgLMZMKDiB/Rpi92QKquDiq3WuHTTlGn24+7tR66skMALojSS6/3CCFrampiraVnmJKbzdSUvowRK+8Usja7nTmdTnat6r74Z9qYzm01Naz8erUYczY0MOWD90Q/l+EfPZI5S4pZY2Mjo+M+vG5M1F20Ve/xFhczhRYFOI8aztxnS4VQe10TK3j/NMtberxbAHPXlbFJhSdY1e06McdVcZkFSDmXxWV69n4dUbRy3Xo9sFX3iTkvD2zAQCjz5sN14hT848bjyEU7sud/h2MXa9ATnb/6N/LfLsP+k3cRGDoMrpOl8C1eAgxMh3liXvhUUaiKc4CXSIRoGzXfRUIC5NJzcFEQ1ju8WP3xJZRcsKM39E+zF8s/q8DZq/exYfFwpK1eC+OHayC1B982vSwLL8mKEExJGJKS4PIZMGl5GSnnwcTQe2I4VHYPL604jzafDGO7cpumCxEAtJdMvjYB/anA/GbT88iwxoYEPjyQ4LyUpCjs35hHxWqfcOX54a+miKJUc8tMbSLGZaWgdMdULJ2ZGXbdMpHXrJPK9vEos4ylBZmoPFCACTnWcOUzO5blD/0wuXvfiX0nbuN2tQPbVo1G7OCMiDWu6zfwaQkFqWRA4eyhsCbHhA/b0M3DpKenWRF4YHYeAy5fhuR2gbmpxEkbAIwY0d3JyYO76D8/VrXH6W7WO2r634/TLoDoz/M84lF4RM/zfwHvT853JRDGsgAAAABJRU5ErkJggg==", x11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATXSURBVHgBtVdbTFxFGP7m7AV2Q9nlVlAaWLQQTSqlRknTWJG0RqqJwZhUo2lMX0x80rTWh77Aky/FNDV98sWSJjZGE/rQpJratEiMqSZKi76I1VVoCsnCwnLZy7mM88+ZYQ8LSymsP3zMHM7MfN//z/nnwrBJ45xHRdEr0CXQIRATiKrXcwJxgVGBYYHLjLE5lMIEcUzgrECSP5x9Tn2xVSOPFfEaW87ZfDyR5SPxZf7zZIaPTWV5xrSLCenbiIcVIY+J4gbcMEtbzDkY+n0JtybSiM/ZyNmAIXo7XPURaIr4cDBWjp62MBoq/N4h4wLdYlriDxRQSE7EF39dgM9axvUJHzoafGiuNPBXiuHAowx3EgyLpoOFDMdCjiOxZCGZtnGkNYS3Oiq8QtYVwTYiH5vO4eObSZgOw2PVQewoM6SnYpDVouVAHO4vR9bi+CdpyjcfPRdB+yNlRUUUCvhbk1+7m8blsXlEw374/QHsqWX4bYahNsQQLQfGkwxtVRz/LjBkbKVC/uE0Dg2GyXkL91ImTgkRL+4OeUXs01lieMj7VjyfymJgJIUcCyAYCCDrUMgNWc5m3brJGWZEfcFkMkKWeDa5gZxjyJJQv8OPuooAPvlhXkZTGXH0rYqACj15j6lFG6e+SSKRdvBkXRmYYbjNmAE38kyFnOXjp0LP1IOOAP3YtoM/EjlUlXF81luLiuCKzy00FfppRdGlO0voabYRCvixu0rMfcT17NXHISmaK4H2OghPxYrU6JJSnaKQU3Cj4UbGEX3DQR8SGWDwl0V47APpjlrhktr740MzcECd/GgQIeQ0S8J1gynPmXRulffeOtNfgoqCSFRMpSykTRtBZuPS0ZUo0DfQQjnSqyWlrl7Fe9dvSDKf4UN4Z42gZ5I0/7UyDyv3OFSQGdxVQ8VyYgamZYtoOLhf9TJaXzlETeTSTgK6dKfI88+i8+AzMMS8E3w+n8RWjUQQbFuQO44sC1K4i2LRoRvrBlqA/v92BdCYGlqMsg5iiVHNNM1VDTX0QFshX288gmVZulmMpkBuqaTKS7regNs1bxSURY1iinWHUpB6yQudJAFySfT7/et2LIUVjqW/L+KmWlwLKCXpRhYQy7syuRLehlJZGIX/wyitPY6OEuNNgXfoKfnTCMauDMqFyFDrfilM7gqcDi8cTxx+HbW9b+tXw3oppo0oOp+bxbHvDiDLl2nvca0UGmhVdggcFw/9iPrwLv2mylD78iA9RYLV6Gl6w+2z/azLk6uxjjS96SW/QNxrtuNFM4V3hw9jJjflbr/bjYASUF/eiDP7v/IKyG/H6oh0juoVgUqcfvq8yE/DVb6dSChyOjt8uPesl/ycPpYZnub9UCm5p7oTJ9oHxF7N8ietLZKTIyefGkB7zX79Jq64pG18KJ29hTO3T2A6PYGVzHnQlOhjuihryhpwet956ZCHvLvooVSJoN1xSIuYTk/iiz8/xbV7X4s0svINWXHyoBHCS7uO4ljbSVQGol7y1wT5qLfLpi8mJOTbiS/x/f0rmFi6u6YjcbdG2tFZ143e2HFUiozyWBybvZh4RJD0foH3C99lnQzG58eQtdMCGewMNaIx3IKQP7zeUPRx92/5sqoupxf4w1lys5fTTWc5z1/PXxDYixJdz/8D1xbTOeS5n8AAAAAASUVORK5CYII=", R11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVrSURBVHgBrVdNbFRVFP7umzd/nZnOtDLWCQqj1RjUQCVEQ4wCK7ewcqVIROPGxI1rdu4MsnJlisLCsGpiMNENEKIYNsUQSapGBgUJbWmn03k/M2/mXc+572fuTH8obU9ycu+77937fefnnnevwAZFSlmi5ijpIdIJ0ippKXxdJ62R3iC9QjolhKhjO4SAq6SnSRfl48kkz8VmhS0OgVeI312WnjstXWtK2lZDOo4ju93uWkROrYcj1gCvUnMJgZuDMb8Od/kM2vYP8DvX48kNfwYSafVsmiaGhoZQKBRUX5Ma6REKS+2RBAbBGdheOgXP+hrCyCFhPg0jMUYz8xAiCUeepjkJkAd4LjzPg+/7yOVyKBaLOpFVSYj1wDutX2A9fIc+cpFI74NhlAi0f6IjvyIPmNF81TKBdrut+iMjI8hms2uSMNAvMXjbOofm/FtkcRbJ7OtIJDIwhENKZAyXyFBftYJIBWoYRtym02nVzs3NodlsRusrA8Md1U8gTBYF7rk/w66fgJncpZRBlRotBSrUc0uN6cCDmkwmlS4sLMB1XZ3Eqb4QhK6/rdzXuQNr/jAN3kcyfYAWh3K7rnoEbTlFIUjF7tdbDkUUDn6uVCqKbCjPciiip5iR2/ycWNTI5anYWqGsbam2pzzu9KgMWK/cS2CRstTrfbXpU/VNGI/3A+tr6NiTyuogtq3Q9U4ACEfTlkrOQYnA67O3lNVRiFht21a7JZTjjM3UjkYjbfs8fegFBEST1AqsZTARkAD1oYCdsJUrSNRnb2Lm+lncm/m+jwCrlpCqtPP+ORSNdFsXQuuZgA8h52mBYpQo6G2+qC/VsNRI2PU7aMz+jiQWYc/+ivroixBmEcnMsCLAycj1IZRDTGAiWL8F2b1JsaeljUCBZQ4MaVazrwfea3m+j5npi5RwNlIJD12ZRNOvoGA9xPy9Sxjf/57yBoeAEzPMiwkmUFXx96bJ6iDLDT3rYdHqVFRECisLp4wJdLs+6q1R5ChshfIrGBp+Bl1kYC3+hebtSTjjB1F4Yo8i0el0kErxeqiaYSzIguVVtlkkHn1AqsqG6PNAFIIEue658RfIA7thNRcwJDNYvvstctUPsHvfCRTLL8dJqSViqffHIBcO7vWVZHysJ+VyWbVz/9zD9c9OovLxF3jp+f3k8om4LujblIUJ8OYsGebOvsVW98T6snTnIu7/9yeWZv/AzsobVJ4S+HvmGox0BWPlPMxUkHxaMapzr6YAE+PYijjNeTy4exOG08RT+QNIH3gTu8YqaDaoTppdzM5b8bf6H5IJ/KYIiCxE8iA2K9n8DqRzo8iYYyg9+Rr8xUU4lGyFZQduW6CYV0mnckXzwA2mcpn0uHqZehvSvabehCX9sUKxe+KjuL9Exai8dy92SKniH+VAJpPRp1xhKlMI8gCJzCeUz8Mx+FbEOv8TOr2qF5PQzgYsU0Z4ev2Gn4QxSglzEtsheyYnYebzfWNsPYcglLOMveJ3LP1FdBp0+sG/a/yC+6XhP4jPhIMiNffz1hseHtYJ9H7H4RHpjOobI8T8O3XO24pILY7c5zOiBn4mOpYJ7SOuiNOISnP7HHz7BJXl7jqFaXUP6IeSCJyPaKHUSF+NLi7xfggHjoQfwEi9i0T+Kr2oxkn5qOSMAKN+5PYB8CP6ranvUBq65VhEQpgHYeQvA8kPaQsFBHSF7I9zBMzCoAw+cCw/tu6xXLOkioGLCR/T/DZtFu8C9W/Fsxv+ffo+sJBjzICc7Vqx0S2vYaMSXs2+XPWy5TvS965K6f0o221X0mVEUpFZ42am1ihhsyKDy+lZ+XjCF9lJuYHL6YYLrexdzw+T7sM2Xc//B0TcZiAD2x67AAAAAElFTkSuQmCC", B11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAXNSURBVHgBrVdbbFRFGP5m9uy23XbbLVChdMFdxEq4aKHwIGqgJiQSiUgQtCghEiMCDyokog8EEmNiTJSA+GBIKL5pNBFDAkQToBG8ERqkaJRCuxXoQqHttt1u93L2jP+cW892t3Wp/MmfmTO375vvnzMXhgJNCOGn5HnyZeR15EFyv1kdJQ+TXyRvJj/KGIvifhgBB8n3kfeJe7Mm2RcTNTljEzjHNDUm0rFWkeg9IZLRMyI9cF5omeGxiOwZD4eNAR6k5DQMmXXT1CiS3U1IRX+ANtya1VmYKS+qhbtyFYqr1oF7As4hw+QNFJbwfxIYDS4yA4jf+BDpnq/BlDK4PNPA3VWE5gVjbrOPCmT6iGQ/tNQtaOm7cE95BSXV251EwvlIsPHA1dgvGGrfRo0ycHnngivldgfGRhMfUUNk4lCH2yjDUBw8CI+vfkwSowl0WOApmnG8cyeU4iBcxbPAuNGYOhudmMiahzAZCGHk5Wcm0Q410Qlv8AA8k1Y7SSy0/hLuAN9jgacHmjHcuYPAZ0ApqgFnSWpoeYJIJBzfKb2Ms5Qjn9Rd9lWKptJYb5OaLRaUxNiTpYApvZw9xfAGhtrWg6ndUMoepYEMufWZM7ND3qVr6C+M8QwlNAFNyyAdvwTBp8I393swV7nVOiRDYSlgM0pE9oGlb4C73PoMmZylPjsjb3jKkTddjOQ50qZSlOcqXEopWKaLxj7gpPuWEUljh+uzZh/7cykUosVpxSvFNUbcOcZcfLkiMH1F6kpoNKZcC8nryKhxaChF2bxfLRXkGggpMLZX3Y6dPocrfz1FrBnN2gVfRRVcnI+AWwysBWeWWanVSMovS/VW1DbaH6BQpPWQzOv5ESsbnpU1+tYuCSyz+u464sa1rmeMKdNIPq8H5WUex/yYHegn5k9Ga8eAXjpzqheX2/sdLG05EIun0D+UMuQgDZ5s40TAbrFMIsmDBYPxNK7djJkjGD44rCI6mEIiqSGR0lBfW4HAlBJMKvfg4+0LUOlzIzitBJ9sm48iD8fkCg8Wzvbr7ZPUvi9G4HHVGI8ZY5691E31qkWgThIIylzLlZ5s9mawhxIZDBC5Cq+Crc+FMKvai47IEFbsPIv2riFcvNqPVe/9jNt9SSyYVYE3VoegKAxRAo9T32z1DCLhWzGrMKiYsSCpsplanR7wF2HV49Nw+EQnNn/Ugu5oUq9tI7WcZ4HMf3nqOn66fBe3exPUpxoX/u5FpDdpRk6Y64fh6s1BzHlQh/XbG5FknM+Kizg2rAjgoemliPQkkMkIqORW6szLtCMSJyXK8e6GWiRVMUoBc0yPy85LBeTv4J9d40O+HSY6qGLt7t9oIaVRqLW2D2DlO+eIQCZvfVmJ2x5eKhCWudqZ5SNMTR4fvDYXO9bPvidwy1Kqht0b52BXY21O3eJHJlvZsFTgd/K6Sl8R5oX8+CPcr8dJkjh6NkLSapiIJdMaTp7vpv9fZJXXPTyJFqkd+YuSwBnyTfLr/XoVly8c1/d/yYCdM1q9gAnaGSOR247cluQZsfDVzc4WzdZWLA8ivxbpgrpkEXg6DWMrGvvcKdSE6fo2RH+B+3wL2IyZVnUlN8/lL+QXr54O/lIj7rfZV7aNm5zgRyR2znEs7tyBupzOg7t3HHvixIFtJ2DX0WNgAfuKNnIcm1ek/Xq+qgrKocMQ+H/m7C9cLvDPDznB91vXMu5otxfmL8mWLgU/cFCPm3MWEyGhuele8eln4PWLreKwiYUsAuZaaDAbgL/YCNdX3wAknXAMWAio7TUBXXa+dp0TvMH5anIqYIViDSwlljeAf/sd0PhyjhpiPODSUmDLVrhONYMtXuIEXzPutdweLM/DBNf/gdbUBJw8Dly7iry2iK7fDU+Dvb4FzF/prAmj0IeJg4TcH/aSv5lTORwHLrXqqUgkgMAMsFAIkDPPNbm49074sWo+To+Ie7O+Qh+nBf/iYuR5vpz8Mdyn5/m/mqwlPvzCLKcAAAAASUVORK5CYII=", W11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWeSURBVHgBrVdLbFVFGP5mzr3QJ1wwVUELLY+FqVhIKyANtqgEFWNgBWqkEEpMA4kQY1y26pIAtlGDoLFKXEiibe1CF1YhJi6U0ta4oIaWS2vbRS1tae/tua8z/nPmnHvnvvoA/pM/Z2b+mfm++ef1D8MCRQjho98+0mrSzaQlpD7HPEnqJ+0hvUraxhibxIMQAi4hPUc6IRYnX8q28/XP5gCWo2sgPZlmCwYQG7iF2NAg2NIc8Lw8GOXlYLm5mbpqJG+8j8UQcJj/CuVmVTY1BfPCeYQ7f4Z1vSupsXD+fMNGeF/ei5xDh8HXrNG79JPuIiL+eQmkgkvg4NnTiFz6GiwnF8bqVeBFDwN5+WBLvKpNJAJMTMCamoQ1MgrrvzF4X3sDue+8qxPxZyLB5gKPXvsTgWNHwWZnYZSVgS9fHm+QylxofxEMItrXRy7hyD1zDt6aXVlJpBK45YKHW79H8EQ9PMXFMNZtAKOaTAj6M9WI0nahUL0I9++YBKVj/TcRHRhAXvPHWHLwdZ3EFneXMA1cLrhGmY50X0fglZfgWbUanrVrwexPA5cNRTJ9YWeEArc/VRYlErGRYeS3dcCzo8qt/hH1dSpOwHG9HD2s4WEEXt0LUCNvRSW4XYkpD6S67FGyymUwZGlEHA8oOrBiMUR7umGtXInC3/8Ao2l0pFROBXcyDW6p2XSWOhyEQVuKh0JgUsOhRNrJs5AJtj4M9kQEzDSVhpRyu75pt+HRCHhBAdjYGMwPGnX6J5Un1X6fsEc/OIiZqm0wqKFRWAjj8WJwoZzLlIcTHpCJBtr3efR/bzZeKJRL7TWgvEHTMHgbljw7vF7k9fwNo6hI1pJroFR6YJ/bZ7ijXbGmNKeVLNUdMUw1asg0lWEZbb11YZoG0ocith2OF2QdZrreIk9EwjZfTts1QmeJI/bRLrGq3ZIYrXwbnKpzywK7M646cTpDKKyAJMhGAhUhpVujqkyqqYFLQuPjNA1Ru09JIvbTj/o0VHugLhYIqiT+6oXhuNt29cwMsJwcuacAafK8pcClbKM6U5ZmdLZIJ7UfDajRO1s11ncDFh1afMUKWXGzJFBizz+Buyte/R0dDtDOpc5PEIlHuAZA3nAxi0mPavgzZDg/A3bbTOLsbmfR3w9UVsqiEu7MBcT0dGKxpcovtMiOjwM3aUTCTLje9kA4Of9PEDhyB2hNBU94VvgH3GIfj9egKYiPWmsUl1EaVS1546Jc8bGEimgi3UK2eqozYiUBpworSEypJGAfibx4TVL1rPd0WxRZpYNspkgHRMqgli1zTZOSgN82JF+f2aXKyG6rmcOmkeCbnnKL7JOw1zbmUGCxfTvmFRckQCP9jOa/OZRYjDs9GZvoNyUrLQUrjHugRxK44ub4zmeTGqU5s4iqbyWQUbKcovm+RAQu03lwIKjKyoicj2UEj2Ps3qNnr7pHsbyIfGJyEpHKLeDTd5O2YlxepJvnaQJpolHfTel6CWndUjoPqPybcNpALEe917rBiuPTvYI79/JXMsd8PvBDtcgqfbTSPzTTwaVIzE+JWGf2RcopJtDAWyR22nUMCsEiz1WD/zuUti0XK0JXAjZa23UCievYCZGa7GK6rz0XPofwenE/IlLS/PQZHbzJDcv0iEiuhW64R3Prd7CO14NTQJEtDpyPgDv3vPkT8AMHXZMfmUIyh0QJ9Ii4qwvirTo7QFkoiaTglKJnfvELsGd26OBJQSnXGzuG/XAPp4oK8NYfgDdrYdGUJM0pMo/YVjpTcPgIjCu/pYLvnzMsj3eW4WEivWBd/hZob6PdcAMZ5clNwAu7weqOgcm3Q0L8WOjDRCMh10Qj6dtpRgo0RG8vvReCdDnStlz9GMWH64H8/ExdycXdeM+PVedx2iIWJxP3/TjNQMR9nteQluMBPc//BzGa7u5xvsroAAAAAElFTkSuQmCC", E11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARISURBVHgBtVdNayRFGH6qpydMMhM2h9Ulkk06YjSwh50VHDw5+gc0i585yEKQmIMwux5zyEYQPCxqFMHFSyTgB+QiCKKHoKNEb5msgrLgOmOEjBo3H7AzTma6u/atqq7emt4kk8xO3uahqqur6nnqrbeqqxgOaZzzPkrGCFlCmuAQ+oLP24QSYZWQJ3zBGNtGJ4yIHcK7hC1+NJsXbVv1zw4gFqO7TLh417fKLXg3/oD31xpYdw+sHkI6DSuR2KurWfLGGziKgED5t1BuVmU7O6h9dBW733wN/vO1psY8SK2HH4H9zBi6XxyHNThodlkiPEVCSi0FRMkFcfWtN1H/9BNYqV7EHuiHdd/9QE8SrCuu2jQawNYW/J1t+Otl+P9tIP7yBXRfeh3WwOkDRbCDyN2ffkTl1VfA6g3EzpyBdeJE2CCqnBspr1bhXr9OLrGQ+PAqujKP7ysiKqCoyeuff4Zq7jXYw8OIPfgQGNVknFPKVCPKy0KueuE6DT5xyns3fodbKqHn/Q/Q9cJLpohzepUwg1wE3Kwk/+F7VJ87D/v0IOyhITD5GOSiIW+Wz+ULV+TyUWUuifD+LiP55VewH8vo6nPU16VQQOB6MXr4a2uonH8a7N9/YJ+lyJaVmPIADlg2oZDAA0oOfM9DY7UAfuoUevPLYDSNgQ2LqbCCl8u6tPbOFTBaXlY8Dmt3F4xg1XfDvERdpDWwWk2913ReQdVX3yyX4ieVAltfx/9vXzG1XlSeVOt9S4/+VuZR2L4Pq7cXNkWwnHeo6RbDCj1grkGjkCuXyhgQeZ8y3tqf8KoV+CQkVfhFe0HEwLANtb1Kq/z2K7xnn5cdWjH6dPKkMe8qDlTgBalWwFlTUGgRfpD3bt6ER0vVo7LqtVUknxC7udzGx4SArBZQTZ8DF/NOyycWi6ERpO0aF54geBQHPnlVpC71mbxTJStiIK0riwpixEKAHDmBc452TQvQfQm4rivFBJYWAhyRa5CLTGLGWFNH7ZCbfZkwBDhiCuQvVReaxNEO79W0ADFY2xbU6LNaKe4EqUke7VcIkFtioOhYLDoQMdWBbYtcSQvoxIgPY/F4XGflTih/7oL8OL2gLTLQVcH4HeGCeCsUClhcXOzY/Juml+T4+Diy2XDrycujlz7vlctlnkgk1H/kmFAsFs1zY59WN6dLpqamjo18cnKy6dBqusfRpRsbG7y/v7/j5I7j8FKpZApwEJmj0Av5fJ5TDHSMnP4nfHl52SSfQ9SCWCiG/pmf74gIQb6wsGCSF8O530OEY4pYWlqSrmuXfGBgIDryIm91WaEKaVOEiNqJiYkjESeTSZ7L5fjm5maUPI3DWNQTWsj09DQfHR3dlziTyfCZmRkZyBHbd+StrmazhFz0W5XO/SsrKzIVGKKT88jICFJ05NrD3oO6nrV3WQ288TE/momNbZ7fy+V0DyH6ev4k4Sw6dD2/Dd1iqV9zf22tAAAAAElFTkSuQmCC", S11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWQSURBVHgBvVd7bBRFGP/t3qPXo6UHtWJLW66IDYraUghpEKSgNhpMeGg0xgSxIQH8R0hI1MTII/5hYiIlJD5QAyjRoIE0kagYTSVEjIINtshLscezgdb2ru299nZ3/GZ353baXItA8dt8dzOzM/P9ft833+yMgv8ojLEQ/S0lXUBaSxomDTmvo6QR0uOkh0hbFEWJYiyEDIdJt5L2sRuTnXzs9eZXRjHM2W0kXTf8XVyL469/OhGJXkC+N4CgLx91ZTUI+oO5ptpE3tiMGwHgIG+F7WZLoqkYth15F9+c+R6/XDmWc7Lq4mlYMn0xXqpfhXCoUn4VIV1IQCLXBTDcODf8Zuvb2HFsJ/KJaXlRGSYVlKDAXwCfx2eNyRgZ9Cb70JeM4lLsCq7Fu/HizOfxxqJXZSCRXCCU0YwfvdSGpz9fgYSeQE3p/QgFioaMUhnwRLeGOyYCF1MKTgW96FIUzI3FcODaWXQGfdixeCsem/7oiCCGA+gUxr/o2I8V+1ajMlSB6pK7ra6MHkVReU967MFzDR310QyKTQbNAAaZgppihjZNReT8WYzrPIMZK3fhwcYXZBAzRZYoknG+4Dbx8q/EfN6HjSgPlWHqxLDbS1FywAaKTBMPJAxMGzRwl2aiJMCQ5wHSOnDu3Fn8NnAFT21pRV3VfDGkmQCsz07luJ6zpxhexvyPH0fX4FXMnlxrG7V0qFE4TQzix8X2ZG8atT4TkYxCGwPDR/0dCOVNwJ/r29wwAlU8FKpT2Sha3zq8FZHYBfi9PqSMtKVpI0WadtWkdj2FJLXz/5ThKm/T/Rra0xr25TMcLQAK8grQk+rBhm9flylY6a04+d5nBYfyesb2OUgYSYzPG4/KCeV2tMkDioi8YpcUa00I+kqWve1RUbDbOvvOI56Ow0vP5Q2ncSdlEezds4p7YKmA1HLyAK34pGVkUI8jnkkQY81ibbHl7HXOnuq6w163vZGW6ums1+y6RmnK59SZjneObBfmrK3dC3tvt+Sz9i+zNEx6epK9KAoUDuPplvccVFAepxKzvdJFi/G5WDzbkXtibukAPpnTD0oSGKTBDrLRuEWYXMAB8A8LDNPA0a42Sm53wQ1oAwTDsLZbkQEUsuzim9qtomLAXZ1+ApDqTdh9qH8ikYBXSaDaImQDMHpOQxu4Cn/hJD6klgMI81LH1ZNSurl0eRi4C/0efzYLhZhpimBaybqFEYlUKgWTgGiaBl3Xh0xnJRP103vOCABhrxMLdCd6kM0tSEBIMmbGUtVajKrFjrNkmscGwOygmIZhseYAhs8BCQR6KeOrHuZNIa946VE9o3wbHcaWIcPNe91RIYY51LjMxeHGPaC6ewF4Flhb4uTCUtwOybKWRM0X5xhEOYAIL02dEMb/Jd6yWlG0dsLfeYl/WhvC83BbRNqqVSKqBrIeOM4B/ChqDVPGHgCDZJ8Knnsa5deHOIAWOOvg5fq18sdibIEwG0io4TW5uUV1vsu7eY0bXzOrSRqFWxdpjkDdSnhCYVHdxW2Lr2GzaH3loXWYMr5ibIxLGFQyPO6RjXLzZv5jAXCOSNt4mXth3zOf0oHC746+VQA0R2Bxs8x+mziWqVK/TXBSclZpLXYvfR9+1TcmIAqX70Tw3iWiGnFsYQgAZy0sdDrg2fuW46eVBxEuqrxpEMUlxdjwQSvyKPaS8YXyrUn2gAjFMqcjZpfV4dCKr7GmrskFMSSvXJGbvX4fmlY1ob29HXX1DbLxZaMey7OT5biY8NPSnhN7sfeP/TjRfcpq+3u3B1P63XEXq6fhvfmLsGbtaoQrwvKUEYxwMRlR+FGNtDnXpS+ZSbLDF35mmR++Y4mv9jOt7Rgz+mMj3RGbnWPfzYlzOd3Fbkz6bvlymssjsM+PDaQ1GKPr+b/HUBaX4KkBHgAAAABJRU5ErkJggg==", k11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcLSURBVHgBrVcJUFVVGP7uW4AHCk9JeSLgA7FEJiGXMstMKy0yI3I0p2mqKZfKsmbSmqZS07IZm5CmZUxNKyu3USu11Ea0UZlMFGlCBI1d4Qlv4b13335v/7kLXBcU0X/m3PPfe/9z/u9fzn/O4dBNEkXRTF0+tfHUcqlZqZmV305qtdTKqB2ktoPjOCduBpFiK7VCag7x+mgdG4ueErNYUXwZBUMR0edwiZ69+8SDf9WJJeXNYiAY7gpIoeK9KxLXhXIrdcWQ3SyR3eXH97sqMSqrD7JsleDeXgAxJRWDbI/CL8gywzMTMX3SYMyYfCusyfHaKWupTaCw1F4TACln8d2uKne6A/j4m1JU19qx5LksWEsJV0kJuIInUWUdgaKNFQgEIxJAB8k2tXhgc/gw+4lhWPj8CAwa0FsL4gkCUdYlgEstr65zYPpbe/D0I4PxUjYHbuOP4JKT4SuYic3HnCg+dk4Zd9Es4H0hnKpxgKPZv1v6AMbmDOjSE5xGOYvTCVW5Z8tWVGfmQh8dgyEnisEdOABMfwqnUnPwGVnd5grQYA5MN8eJkBkZjcRSX1XvRE2TC2sXTcTTebdqQdyhrhItgELqXme8/9gxeKfkIbriFPT+AMR2NwyWJAimWDS3+ZVB8nPeihJQUnaAkd2hukRAFXnx/AUe+1c/jrHDLaq6lQTgjY5ZFNfXMD7S0AA+/zHA1gLdiFHQSVMzK5W+Y3IZQF6/FxDkDLJSEZLbRTUm1IeFCI5X2GBJNOHExukw945WQaSzUOiUl0XqV77wU6ChHnqjEUbeCwPvgcHnJd4j8+ybj30nr3jd8FMCyk2APyTAR32Aer/Sh8NAr7hoNNp4LPn6b2hI8rZBif1z7CXspgnrGxFLvI5MEYbdDp1eJ1krcOiwsDPeQMDGISho3Q5kZYRg6tsOkXKDifVNc8Lt5VHe3AwnPxzmWGmJPku6FzPf5asD3XYXTOvXQZeRBh3PQ798OUSPB+LePZSa6cDdY3G43IYmiqlK3jXliAhhrWVo81chrXo3BLMe/whRqK9vwSyRljOF4+gPRkya9Q4Tk0o7AzBeHXioxgf/aR5TCbdOEPDvWScqWwKYlpgI3UdLId41BumPP4NfKhzYur9OTjhOyQc17sQGQiFSLCAnhlK+2QlTQm9kDHoM+uObsaG6GJPwjqpyPPMvKzxSMSlYWIyGFl5yM5vX3h7A7GVH8MpJM1o/+YrM9SL1zRexYmgbVrw2En3io+EPRGhsWMqDAK2GAL37A0EkhbyI9dkRdjnxUMqdSM29B5OTbsMg9yl4PS4VQC4DYGVc2elW2QDSLkddeoHXH8a3O89iwgfl2DV1PsRZL4H78ANMO7gWPy8YhnBElEAwAL6AmoxBOFtd2NYcxC29E3Bn/4HgyStJVLO3txlRaWtQAVh1Siyo5AYVtZ3FUeVCYQGVtS4ULCjGyzVpqF+5Dpy7HWlzZiASDFHmMy8IEgieAPO8H/8lRWPsLUCmmAh7n1iMzroN+w12ZNM3j71OVWE2qJw/KCfS+6uO46O0pXK6LyqBltj6XrOjCht+0yMm6m76MAyeoJr9nasgQkObInrY6n0YPuQM4tpFuAiw3eXGqFQRA/qaOmSZB6SSmD4wXrKZWeHUm+DUmRSvXE7M5ewfk+mKkmml+C0x2NykR96EyYhExWJon2T8URWGI9BLFXMyALWMG5wSf4njb4xS0owY1Y9Di6BDzflGJCQk4P677kFGf2BkZpYqJlXCk4yLMxkxmgUIIm6UrHEZyHJ4aUUI4Kga2i+0SQBy45KRZUmHwdixRZcxAAfUt0ljUmXmBjA8O96H1VM2IX/GEhzlByJiMqBoXyEmLpyKebtWoTHzYa34QQZgB5Q8mDcjG7ExBvSU2IbzYL8NMBr1OL1vEaaZc/DogHycM8XgBG/DyNQHsGDKHO2QHepuuJK6+Yyf/8kRfLmlUin6Fy/L7pC5FxkQ8WHTnFKIrb+j/gKH+H7ZlO1equQTYRnxriq6nmrO85dtxyy7c2Zuw7kLPg2I6ydW0ArGRDDGUgozdxZRUSbMnPs5uJhkVUTajrUHkg4vHCprxsS5uyGiZ17oJLHjgLKraDLl2ED1RxEpl7ZjnUZ6MZQleW+uBWveG6dR25Os7Byz9v1xWuW1ii6JrnooZYfO2csO047m1Uh1xxuy8v7maPy0fALuu8OiVX7lQ6kGxEXH8rrzHixbU4b1O6uVnLg2RRk4PJOXiY9fHU1HsCit8qsfyzUgrLjkYsKAfLGlAr/+2YAzje4rDUN2hhlTxqVibsFQpCTFaX/VorsXEw0ItksuhpKYWvLwYZRWtlIfgtMTRCaV8SFp8egbH32lqYrYPD2+rCqX0/Xi9RG7yK7szuW02+tL7Lye308tBzfpev4/NqPGSM4wHyUAAAAASUVORK5CYII=", N11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAdXSURBVHgBrVcLcFTVGf7u3U3YJLtkCbChCSGb90MiSwRkGBywUwZBpVhiK/hosK2lLWraZnCGjojQaa2gAW21rdKKlYnU6UgfGVoDJQg0pFASRSBAbDZZlmySTfb9uPu6/c/de8MNJjZRv5l/zzl7zzn/9//nP/85h8MEIYqikYq1JMtILCRmEqP82U1iJekgOU5yiOM4N74IkGIzSQOJS5wcfs/G4rOCWSwr/gQi0bgYGhwS/e81i0fbbOLp8w7pv3HQIHtvTHDjKDdTcQxJN0tw+wTs/+slLKrMQnnfBWDrUwjlFSC/7y42QupTXTYD6+8qxdovF8KcM1U9pZXkTloW6/8lQMrZ+r6rKGeKd/zmDGwOD3ZurETuv94D39oKbHgIF2dV4uWDlxCNJTDsCcNFfe39fjjdYWyqqcSW2mrkmvRqEvcRiY5xCdxseZfNjXX1h7Hx3lJ8pyQK/mAjuHwzguvW460TAzj1Qb88bmQG6TcYiuJStwsczf7H51eiunzmuJ7gVMrZOrUryiNvN6KteDFMGRrktR0BR1Zz6x/EBVMF9jRegMcfpcGcpJLjxKRuLslGqlJ5pdeNa/0+HPjZCqxZVqAmMV/ZJWoCDVTUsbr/ny2IPbAO2v/2QONyQQwEoZ2VjURaOhxDYXkQh2g8gR/8olWyXCGTdMcNudLjwhAtScvra9We2EMEfjhCQHZ9N6snensRuG8NuOt2cIsWg5em5iR3ctIAccR5EU6D1TO/fcP9IqR+orImVMYScZy7OECxkIGzB2pgNExRSBSwpeDlxjPKv6Hdu8DZesGnpSElGIA26EdKiIRKrST0X4j974M24Ec4EpclgXA0gRCVApWsPY3ir7pEj3uXGDA1Q4vdfxgVf5K3tfLa17JGzOeDYLNBR3WeTBGrLJJlCdkDioXKeovkgfB16Ssw4pmkN6qKDFhTdAxRXxfsvj7Uf/chbPxlN+oftihe+Cbp3q5FMr1K8Lu9SH19H/iKEvDBIDS7dkF0OiE2N4OrqEBk7jycPu+EYzgo9Y/HRQj7PsDNyM7SQT+jGw63DwPU1znsQ/8/uuDxFuOlxvPY9tgC1k1K7YzAMmXg8a4gdKIPy8kiPpHAuctDsA+E8dVMA7int0K39A4UrX0Ef24ZxKH3bcmA4+RQUtadqk435QOvA01dZ+DtjcIbDmF2aQdS+Dy0nLUrBBiWsRhgfoY3EEHNU8dwbSA4EnD2gRBqt5/Ej7u+BMdzvwIc/ZjzxCN44XYBz22+Dfr0FISFOIRITIoDIUpC7SGPgPTIPGh107Fh3WosuHUhMvUp0KbqcaKjX+onw8I8YGa19k6nRJ8iEzwUwzgEwjH8+k+X0dxmwEv1W7H8ImXCLfX4xqrVWPSTWlQ/eWpUBLB4+PktXky7cBSF7igsoV5keBxIvRzCkrL/oCF/HrrtPpSbpePBzMtrQSk3kpyAu5EclRpLtZ1WD1Y+3oy6wXIM/vYAecOBnEdrpIgPMevZLqAySISzeq9AiLdh2DAAW+TfqCwchLnYhUHrUcorTlivexUVRu1IAIajksonXu7Aljk7Jetjz56EGmx/v/JOJ373Fw10qRQ6vAUxIqdEvgJdjgnt7wcxv8oMF6XrDA9taWE6QnoBfEY6tFp+pC8jwFKisXh2pmSytJ81aUn7g1GMBbbuTChZjPk9vuEBbNu8AmcTelhoN/lm5cB//SNoppdh3+5TMKSnKl3djICVxFKWP+6RPWkcOduJx8/sR1rqEKryH0UkfAinu5qwoPBu9Dhm47byGUpXKyPANrLFaEhFOZHo7PHi80A/JY7K9BiyV5RAk8jFHfPzEIvnYfub7di08la0poXUS9DBai1K6/4VhVBy+mTB8xxyjAKeLj0K/oWf4t0zZXAK1ah98Uc4eGQ/srO/jxdfOYfHdKMMPM7JqZgdRMaB4TDy72kkxpBzLjdhArcY3Ni7yAXrQg9MMQ9Ew9fBTatER+dr0OkKsLDsThiEw8gv/hqMWbOUYdN4+Vzez1omSqEPry6B+jidKOwwwZlxDVMFN05YA/jw6lU0vHoQr/4tF00nNHjm+bfxscOoVv4G0/2J45jlg4qadyidRibthRmZGqRqYlgyV4eqOW0oyA2jKDcHhjQNPrR6sfj2OuSbRghIx7H6QrKHiidZ/fi5Pnzle4dJtxIsEyehgHEvNgmYW6SlLcthV/3dKCswKZ/3kvK6UTPffCV7s+kqvrXjpOyFUV0niOTyaWjYvm1L8eCqYuWDFWNdyWQSZqgupU0nbajbfRpWR2CSJJLKc2em4a2dy7HUkq1WPvalVEVi1LW8p8+PHa+1k0e6VN74dKRP0aD2nhI8u6kaLL+olH/6tVxFwoybHiaMSMOBj/D3Vjs+ptNsLFhKs7BqyWxsvr8Cpumj0rQVE32YqEiwmNgOOTDV8AaiaKfLip/OCrc/gpK8qSidk6m2Vo29bJ7P/FiVH6dviJMDe8jumcjjdMKhLd54ni8nmYcv6Hn+P7zg0EC47FA3AAAAAElFTkSuQmCC", I11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAWXSURBVHgBvVdbbFRFGP7Odnuxl+0WirWlwAJy0YRQpAkmgC1Ggg+oxQdMNALGa4wGjUZeRCBKDD5IedBEkHBJNIpCQYmJRFKqCRoTpGgoFCg9FCjIrbvtdi/d3TP+/8yZ07NLC4WCA39ndubMfN//zcw/MwaGmIQQfsrqyGrIqsgCZH67OUhmkjWTNZHtNgwjiDuRCDhAtp6sS9xa2sJ9bza+cQNg9m4V2VuZbZe6Ijh1thunOoIoLsyFvygX0yePlPkAqZ5szWCKGIN5TVkjlMwynT4XwqZdR9HQ2I42Kl/fVWBceRHmzxqDFS88hECFz91oks0jEuZNCRA4z2+DBg/2xPFe/UFs+7EVpf48jC4rQNmIAhTkZyPH65F9EkkL10IxdNG35/8Nk0JRLFk4BStfrnYTYfBFRKJ5UAKZnndc6Mas57+nrzyYNmkkSkhiQV0M6S9VG7pfuhKRaALH2rtk+6fvzMaTNeMHVcJwgfOcH9bgpzq60Nsbwc7Gs0ikBFpOh2xQwwFlKg4RVSFzWUd/T5wJ0loJYvOqeaTIVDeJGXpNeFzUV2nw/b+14dufWzFxTDHqagM0SBixPgvxhJB5rE8gLnOu4zxlt5EldJvA2HIfKssK8eKaA2g61KlxAjZWvwK29O1cPnOhB4+99gMWPDwaVVNHYcJoH9ZsOmJ/aSAvO4tALNXZcMsv5H9VJ5y6ZCqFv1ouoTDfi5N7nnPvlPE8FR6X9zKt3fgnzM4w9vx6DpsaTmLtln+kl3Hb20dmljteR+MpmSuzJLGoSynuk0wChQW5tJgTeHf9QZfgant77Llfpr3fvveEdCMSI1lpdV8Jxm3ZLUwkNV5ZNEUCx20ABSSc36ouZZNUpBNJJQ2PbXZ2awJLGZsVqNM1W3e3IGVkyaURJgKRKA+UwsjiPOytn4+vPqrBqJI8HPn6Kax7s5qCUDYBsvdJlxIph3DMJtHHBGhM3kGf7ziq4WRoZwI1umbXgTNqWRBbi6ZZe992vgdPvL1f7ndO+/7oxKsf/06K9fYD8nToKXHlPIZWgMfe02S6p6HGC3WwSE9a2oNQG0N93BNNwhK08HKzkDPCQ4BhfLOvHU8/Oo4GTzqj6MVoGM5alOVILCkN/ZEDp8mZK8GYDGqM7bW3BZpbr9ijIS3vpQH6yHMeaM5LP0miO35pR1FBNi53xZxPhdON1BMkO8mfTIn+sQQrq9i1mkGUVt3HLQGvPRcIU/TSnvebSiz9cTMkg5CHBDrZ0W37o1zlbaeCEv2jWbLSQqMeRzjjtp3vxmxFwO/Vn0X7krg+pR8VDETbOiOJjHyw1K9TSVGOU8sTLkPi/ZV+OIAG7mryFToEgkzA5NL4iiL8L+iUqiaX6qKMhEe4lJuThbkzynBzKYeXJlT6KH44CjTzGjhAtpR/ffJ6CFcvbpSLjU5gtWSGK4hQW9QSanGW3/uMu7XJsEMxH0R+YYUQuTiTgEPwqHg0bAJCE7CU5Zcfgsc7VjeXeOxzeRv/MjzFsHKW3LVZMO551g2+lbGvO45ZhbZjdbhwuUdHz9teltoP9ry4sBTTqja6CcjjWMYBLhCJDVRczioEje/w+Pt77UMkPSjdMgUOUtR932cLCLxCN2zQ1zL3jWg17C1Z/WApNn8w17l03t6cqD68oL9cOQe1Mx1w08ZS7WldMi6lh+l8WLyiEebFXtdXQ1FDgVeOugfbP6zF3KoyN/jAl1IXibRr+blLvVi37W98sbN1yDr46Pq1bOEkupbPoCtYjhv8xtdyF4kAMh4mfBQ3NJryOD50/OpA3aSntdXleGPxAxjhS3slmRjqw8RFguPDarLlmW3JlEXTcw3d4T4ZYCpIag7l+XnegYbixb36th+r9uN0q7i1xA/Z+mE9Tgcgop/ntWTTcYee5/8B75RXeo7xsgMAAAAASUVORK5CYII=", T11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAV2SURBVHgBtVdNaFxVFP7ufW/+MpM01ArShUYq6EIx4lK0FloQRGy6EgXblSIuLAiuhKa4VGm6cqNYN7pMBPe1KIJUIRLwB38YFWPBNJlkZvL+7/Wc++59eTOZpEmNZzjzfu7P+c53zj33PoE9itZ6ki6nSY+TTpNOkU7a5g5pm3SR9BrpghCig4MQMjxFeol0Te9PPuSxuF1hj63hbZIGkd78pa27X13Xy9e/1zeXft4NyCXL3kgROxifostV5DS7dwiCEP0vvsbac6+OnKz1/ttonHwCh8bHIKUsN7VJT1BY2sNj/BHGOb7zzjgbXt/oQWUJPM+Df3gSrZOPQzbHIKqVfEySQK2to95swBMKq2sdSK9CQJo0xgAxDtFcMwRisWxPjvC8MJ4kKdY665BCo1aroVqtokLqjzUglYYIY4gohswU/IkJVAhUpVLBWKMOX2r0+z0E1MeKmXs4L/yScY5TQXtvZRUJoa9WfOM5ITeqqU1kMWrP9+AdUWasWvUQfUK0E1tMPbPGQLIsQ7DZh9IKTQJVYuIRt0rKDFxwxuP+JlLBk/jwfd9MWigD6EVI5ykcRwOjyWeUShsJAcBAXx5bpTDFYYgkTctMXBgIgaXlPN+nRGmkMnhM9bBxUkHegfogTCiDI6NYp8lDuldqW3+ew/c9hEEApZSze96FQpa8NxLHkbky7cYg0V4Y5zCQfRGT8Yj7haR05XvOBwLn+ruQ8T3PxRJFcYnw3GFpY3/OxJIQpjaOA17byVjBDNByZBZyBkJGbZIRSg8YHtaAWIrjIhRn2TYn4Wn3pk/LTfpywPvCMMee7wmkJmM6JjpVzhYzoCPJHuSJapko4mwTs1rxECcx5YXJfVPa+e540XP5BhQlSyY9HmVUUDaX5oL65yYZI4MxMaEjU8o0hU2HEurGCtLf/ij6slGdZoZZRXmlaFXEiULr0Qddl+MMYNpMvN7FymNnqJAIkxhkOs94WvOiXsOw6IiYYAAGB9FPDHTfmjOllaPEV0XZrzZDs3SpN0cIKS3tQz9cReXOwzzNNNuYMsm39KMZ5LTxUj9P0c0AutvPE80YcsrGw5wFE4LIrATNhYdyRG10aWyYz/VKL6/59CeJhfTX350fUz62tlRqFxaAQO3pAI0X+xBJebuw8EwysqvKPI9/8LfjJXffNBZvgKbC5nvNwrmMnLIyWVTClLKzHGu+l3UaXte4lYjWLm0wi8M6Z+oofLuHsDCAjkHSGIyz+stD8O44dE+Mnnhco/VOfuboX5yAWvawkzTe3NipqcMA2qTT3r13D7T03qDIdMVOAyGPZsV9+m11VwDdc3dsPdCU1Yfud09tBvAdA6jcdQTN2dfh9agWyJyw8lp2ov5cRvDxpyMN1Z49Bf+B+7a9N8uRNOP8oC1aHppwTYsM4HPSs/zUevkFu/y3FyEn8Zff7Aig/swp1M88NdK4AUArIEpUufkaL7QF5HkAQYa5aGh968Tbr7g5W2MDubYg7b78ET9xqVRK4P8Sx6yVK2zb7YZz7m2jUUV2QCyU6XcASnLRvOM/e1i8vIXUo3ipgcH/FQjsDmnlsjugliHNIl+SqNABgg8RLh9GgajNFNVsq2wPGc0TL98hfa9Ypm1ry0hRCTkeNOAE7LmQ0WZKb3kwJNF8w2gxfmywL18VjWdHSnFvIz+ed7YBsCDafHSGPRkzEyz5dmr3evOjej6i8AzGXBjjJWmTzgx/G8jhSey5/YQdkHeyx6osswZQ3m5QPCvaupm1JNXue2DY88Vt9rCD2KPaLOlrw218dkiXfjJXvb4BeWwK3rF74B8Z+QXGyT172x+rOv84vaL3J/whO6f38HG656qjtz7PnyR9GAf0ef4v7xFSTUgourYAAAAASUVORK5CYII=", D11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAaUSURBVHgBrVdrbBRVFP5m3+22Wx6lBWmxCQoGQTFGDAlIURISiQI/BA0ktD5AoEYekYAECUZFIJHyKgKGEiHG8EPEBA2GhwSUpwrGBKKE1gJ9QEufu92d2ZnrOXf3TqftFgrhJCeze+fe853zncfMaOilCCH60GUa6QTS0aQFpH2St5tIK0kvkp4g/V7TtCY8DCHgAtKNpI3i/qScz+JBhSNOAncTw4gLXTdENBoVsViM/hvCNM2eHNmYZC+laD2AF9DlOBI0Swm367DiBnTDgEsTicOapvbb5jTNjVAoCJfL5TRZSTqR9lfe0wEyxvk9oMDZeDgcga7H4Ha7pSrjXR2wLMtWt8eDYHq605FK0ul05mKPDnSNPB6Po7W1jUBdNjisCEwzSgBpiDaehObOhDswnFhph9Ay4fJkSof4LIvL7UNGMNAjE5oDnPP0pwLXdR2RSAQeioSBOVpWIUzUX10Pn8eCy0tHtAyKVKC5sQ79hi6X4EqpLkD1gmAwHT6fz+nEM6pLPA4CVitwg8CpwOD1ejuBJ9SNPlmU4/BhIEoOcd7jFrL6zrDp5hSwAypFnEKO1efzIonBWIttB5LUL1KHo7GYNKby3dkBDVXn8iD+6o92fxhZOTqMsAfZo3KQXeiSwHxGscAM8pXZ9HpDyqlFtLaJU+FyRJ/g56P1uF22RxrpqsqByNUaZA5rwIAc6ghiyyQm9JZ/7PvO/fIa09GwrRzXPtvsIDwRsCuZ+yL+E626idovv8atDdvx74uvIXL6QrfoWX16OxrP+1F/w4TZqkOLUpdc9XTbx+BtJ87g6suzcWvjTtTt3It4c4tyYA5jMwPT1ErdwcOyKslnGBVVuL5kDapXrYNRc8s2Kr1+chj6j7oJf8CC1mzCChoIjBycqOrkPp3OVy1YgeqVaxG/Xi1talQL9YeOKDg52tmBCWol+82ZeLT0Y/jyH4HG/XynCc2HjuLa9GLc3rkPIm7KfflDHkPV2b6wAtWwcimioxoGPFUo75nUtnWlX6FiVgnCp3+H2dDI/YxAQT6GflOG4KuTnWmYoBEN3HqjVaFw4YnmVjTs2IvbW3bDlZ5Gfe6Xu715gzB41RJkFI7Fla0r0fLzMYQC7UifXoQhbyxC26lzuLFiLYxbtzleqg2aDRYwoKQI2QuLITxu2Zp+fxoVpyy/i+xAI9PBN2iud5p2xo0a3Fz+KVp/OQ3N62F+E9xNnYx+82ajdtc+yocLeSVvofrDz9H22/nEHm5DGtkZLzyPvA2rpeNsnzuMrx6vDz6vbMAmdkDOUZ5c9FCxwZ1Vf2f/D6hdtw065RJynXD8AQxcOhdmWxj15fuJ+lbqZ+5pC77Bg5C3fhVCk8bb7ahGNDtAjYr0tASrtgOxmCGnXFcHlFiRdtRt3Y26L3ZSok2kEndWCDkLizDgnVlwZQQ7zjqeEeyA2+2loeSxHZAp0GlkWma8RweUtBw7hWuvz+fp1Wldo+fF0APlyBj7bLczigGVBgE30gJyKjZxJVTKAqMCuZuYLa2oWbslJbgEMS1cmzGXGNpB3RJPaUMF5PfZWHISXlI39bhIebD5x2O4Mn6aNK7Ame6ByxYip6TY3mdFY9LJy2OmoOXISTgZUFfy0/mIll1QRD/K+R8Xoprl7JBRVY3ri1dTe53t5FDopXHI3/wJvDnZ8j8X538LliN85o9O+/rNnIrcZQtkF6ga4FGSnmY/GYu15CiugGxFgRjNdo+ho347jeRNu+jR2EGn79F8DCldg4xxY5BK7nx7ELUbyqDTSLdppxmS+8F89H97FuIUWMDvc9ZWXy1JTSld3pdGfr2AG++toPFZI8cyqzuUiZwFc5C7ZJ49C3oUirJ2fRlqS3fJbpGdSerJH4SCfWUIjXhc7dxDjhSrZJSq1ayRw2HqBlQ1hCYX4omTB5C79N17g7NQlAOXl2DE+Z+QNWWSXBJsjR9ifbOcO9d0OscsqNfYltMXxKXnJoum46cE5U08iPA51obvDolLY18Rkb8vO2/bAff4SmZSuZpEp8fdMQ+03jDQYS/5WkYvOLqFzGDqVzK7H5ILE5Mb5IuoJTqMOa+9AbZHsNC6gk+861cTv5aTVjipjPFHSCzx8aGodabGucZ7WGmyds0K2xyN3ohIfI5VdLXQGtFFe9SwQZxKM8T+nULYVgHuR0Ti06w0lbU4gTAjHHE8ztGacq0HKRV3+TTrLRt7xP1JYxK44F72e13WouPzvJD0aTykz/P/AYaHERI8iTKiAAAAAElFTkSuQmCC", H11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbgSURBVHgBrVd5bFRFGP+9172v7vbgsO3aApYgijUckpBYwRghUY6YKEG5FCEREQgGvAhiUjRopAgISFKKJUowESI28A9XvDBGaDmUAkJL6UmP7XbP7u4bv3n73vJ27dJimOS3b2a/mfl+88033zcjYJCFMeakz2xCKaGEUEhwKmIPoZ5QQzhNOCwIggf3o5DiQsIWQje7t7KXjx1ofuEuivnqNhBWpcqCUT9u9d5Am/8WjDozTIRi1zgYM0z9TVVO2JjOIkK6VdPnJOJmlosn1IlD1yrwR+spXPHU9jcMBfaHUJr/HKYXvYRhlnytqJ4wlUjUD0iAlPP9PaQq90W8qLz0GY7dOACT3oJc83C4TDm0aiv0ol4eE5Ui8PZ54CPcDrYS2Q7MKJqHl8e8pSXClc8hEjVpCaSu/Lezv6C8eRUiLIyRzodhMzjiAwT+yzTDWbzF4v+GokE0eK+QVMS6CeUYl/tEWkvoNMqdWuU+nw91569CqsvEgrkuWK0S/dtNugVZLePaEqsQ+PgEIV5nQ9xo9/+D368/C7dxO5yOV6DMfZLkj6s+IWgIbIHicB6PB16vFwaDQa5/d3AHkbiMB4ax+OK1AxVjMKXCeSRAnKOROsQiLbDmnoDO+KQ6qpwIrE7Mo5j+Bq9Ho1G0t7fLvYxGo7xiURSxv6oCw3MOY87zEpJ3kCF5G+PWUElIUhSR8J/UayjsQy9CENXQgSK+FaLS2KD+y1csSZKsVFWuq63BgnkLYM58B3v2WRAIhkkWIgSVrxZBiEKYEG+LYhQZGTai2oSQd4OWq2xtQdn7bnX1zc3N0Ol0MOg6IIWroDPPg2PFx4hNexp9c+ehtbUVe77aiJX6OuSJqfuh2ENxRtkC9I21NyDW54fErLBtI+fMzJTXKluBCCyiyl7+T1tbG2KxmLxqKbgWgvQzTFE7jIt1MDlz4N//LaCPH709u3fDUFWJN00pwUfQkFDqscZG8oMIYlTXrXkbpnXvqb0X8y0oVVsR6sSVcxjsn8PuGA1LThd8s3sgNjdB/+MPyv4yLFm6FAUflWGXxYYAjUM4FEeItocjzL/U7uyESJYV5UNJZE6c0NIt5RY4R5USrrzj+nUYLl2EnpxQf+UyopO/h35aN0wmMzqrDNBVDYW59BlII0eBZWdDGjYMN50ubFq+HGVNDXCL4p194KsPhggBuSlvBRHnVrDcaIRgtfKeNVCTTCAQYK3nzjHfnJksMiSLxQiBnUbmb6UuXj1jvVYW+9vB2JQ8xooKmDRuLAvs2sl6enpkrF+/nhW7XKw4y8VGOTNZgdnE8g36JOQpqD17Vk1Y3VBrwWCQtbS0MDqCrPeTTTKBc5UZzNcCFqVuTVfAvE0ia79K/32Qx7wXzjM6MUmoqKhgbrebKTZIi4MHDyZSZiIScueToxyh7/VlaJySDbd7GZpbgdsd/IQAxaMkeHvJnIuaEDHaYU92P4qWVvj9fgxUbDZboq5TjoMztZM9vxu9PqC5BXh0LPDrGaCxCciinu1d4+EudiX137xxI77esR1mqpO50yrnJrDbE9Q9nEA9oYRHPS17Q88kDBnBAxNw7Tq1jeTg5NR/1QHuEZMT/W7evIkNCxdgc2MDypz2tEol3HFE44TxqqieE+DJvYQHHx6IePznxVrbgGaWgewsATarZjbaqohphlw9fvw4Tq5eiYqgH05RuOuq1a9QPBqCyayKajiBU4SFUEwTpvMr68kvgDWb0oPDkTSZ/thRiCUj8emWMjyweye2GQ1IZKgBlPMizpylFZ9WQzFPRE4eCzopcOgp2qm5QEiZnIfq91fMR5mpDmPUc3+Xorq+xMMymV+/kxJSgVsVu3Q8LxOJfdRYyRVzX+DJqL9SXV2NSzVrsXdfEzIdGFxRsiJ3AFH/GgRbQnkl1/2fdMzDbEdHB2WwDNkKvPAjun17GXIdW/DGEgy6JN0NhEJk2E9SOi5UxUVJd0RSXK4Gh1AoJAekrq4uVltby158YSI7f4ZHxMFD6okj5gGLdAks1ndae2UvV/Vqb0TcF3hekCkSCRw5cgRfHl2POa+2gSIs7qUwJSVTasOsEVtht8xXRfWExJUsEQkVX5gK5V5oojT74CPDUZCTjWpvAEJvKuV0mu8QyDENx7sl20j5JK3yqdo3woDX8rbgLXxz7QscazyQfNqE9MoNohnTC+ZiYfEaWHUOrfK7X8s1JAqR8jDhRDiJn1qq0Ui3XaEf3cWZ4zAxdypmFy6Gw5ClFddjsA8TDQnuEx8SVqbKwlIIV3suIBwLEkIYYs5DnqUIZp2lv6m28nn+92NVeZxWsnsr3cqpKhxo/oFcSktEfZ4/RXgM9+l5/i8MVw4y3RM8GwAAAABJRU5ErkJggg==", Wo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEfSURBVHgB7djhDYIwEAXgh3EARsANHEFHcAJxExzBEZzAEXAENoARcAI8EmJII9ArrYT4voQfxdNY7nqtAkRERERkrdHLEdAWbmq5Cou4PQJznUARRdFxKkiefonANli51U/AtYQ+pEwS41Yt5VX3xvGXmEHy3gohmZ1lrOu0a6BRgtLsDIirMTYXbpuNG6ad5UoQmqa3dxmw6kTtZ7pkgF1oaT66kFkiT+kkl4HYB4zdWWJ3mCFEBuKR117wbHYGNE9QYlN4xkW8NB+LODNulVIq94HYFMZmJbEZfsnhKFH2xvnQ0cF1I/NxlNC0wRPGu5Sajy5UKWLbc1ENj9iFlhZBqVtotj/qD9D9ARBLmam+k+sEgtFOgIiIiOifvQF84g6s1RnHrgAAAABJRU5ErkJggg==", P11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAABOESURBVHic7d1brGV3fdjxr8dgJDz2ADYQQcAmXAyYlEsqWgmqChRBcyE0akUfKtJULW2iojykaapKfagaRUmrKioJUURVJSo8oF6kqk1oiRoRIQy0UlUeAjgGEmxuhioe47GNBE7sPqwZcAfbc1t7r3P27/OR/jpz5szZ85tlyf/vWXvtta8KOERPrl5WveTsemn1oupkdW319LMfqx6s7j378f7qc9Ud1WfOfvzD6qE9zg7swVVbDwCs4urqVdXrq9dVb6pOrfTY36g+Vn20uq36cIIAADZ1a/XL1deqR/a0TlfvaYkNAGBPTlU/X326/W36j7c+Xf2j6vqd/osBYLAbq3/W8hP41hv/+etM9a7qe3b1jweAaa6r/kX1QNtv9Bda91e/1HKxIQBwmd5S3dX2G/ulri9XP7GD4wEAB+0F1QfbfiO/0vXfq5vXPTQAcJje2tF8nv9y133V21Y9QgBwQJ7SciHdw22/ae9ivae6ZrWjBQAH4FnV/2r7TXrX6+Mtr2YAgPFuarnd7tab877W56oXrnLkAOCYurX6YttvyvteX6leucLxA4Bj5/s7rIv9LnXdU73iio8iABwjz6u+0Pab8Nbry3mZIABD3Nis5/wvtD5bPfuKjigAHHFPacbV/pe6PpaXCAJwwH6t7Tfbo7p+5QqOKwAcWW/pcG/ys8Z6uPrxyz66AHAEvaC6t+032aO+TrfcFwEADsIH2n5zPS7rg5d5jAHgSHlb22+qx215KgCAY+266kttv6Eet/WF6uRlHG/gIl299QBw4H6h+qGthziGTrWEwIe2HgQO1VVbDwAH7Ibqzvwke7kebLlL4J9sPAccpBNbDwAH7Gez+V+Ja6t3bj0EHCpnAGA3rq/uqp629SDH3H0tLwu8b+tB4NA4AwC78VPZ/NdwqnrH1kMAwMW6ve2vpD+U9alLPPbARXAGANb32uqlWw9xQF5evWbrIeDQCABY39u3HuAAOaawMhcBwrquru6unrn1IAfma9VzWt4wCFiBMwCwrh/I5r8Lz65etfUQcEgEAKzrjVsPcMAcW1iRAIB1vWHrAQ6YYwsrcg0ArOealvezv3brQQ7UA9Uzqoe2HgQOgTMAsJ5bsvnv0snqxVsPAYdCAMB6btl6gAEcY1iJAID12Jx2zzGGlQgAWI/NafccY1iJAID1fN/WAwzwwq0HgEMhAGA9p7YeYADHGFYiAGA91209wACOMaxEAMB6bE675xjDSgQArOfk1gMMIABgJe4ECOt5ZOsBhvD/LViBMwAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAANdtfUA53ly9bLqJWfXS6sXVSera6unn/14zVYDAsBj+Fb1YHXv2Y/3V5+r7qg+c/bjH1YPbTXg+bYOgKurV1Wvr15Xvak6telEALAb36g+Vn20uq36cBsGwVYBcGv19upvV8/aaAYA2NK91X+s3tcSBHu1zwA4Vf396idbTvMDAIvbq9+q3lOd2cdfuI8AuLF6Z/UzLc/hAwCP7f6WEPil6qu7/It2GQDXVf+0+gctF+4BABfngerd1S+e/fXqdhUAb2kZ/Pk7enwAmOAr1T+p3rv2A68dAC+ofqN688qPCwCTfbD66erOtR5wzQB4a8vzFp7nB4D1naneUf2HNR5sjTsBPqV6V/Wfs/kDwK5cX/37llcKXPEN8a70DMCzqt+uXnulgwAAF+1/tlxv9yeX+wBXEgA3Vb9b3XIFjwEAXJ4/arnm7o8u55sv9ymAW1vuWmTzB4BtvLD6SPXKy/nmyzkD8P0t9y/2fD8AbO909ZerT17KN11qADyv5U0MnneJ3wcA7M5XWt5U786L/YZLeQrgxup/ZPMHgKPmOS179LMv9hsuNgCeUn0gz/kDwFH1opaX5F/USwSvvsgH/dfVj1/uRADAXjyvOtnyKr0ndDHXALyl+i8X+WcBgG09Uv21lrMBj+tCm/oLqv9TPW2loQCA3bu3enV11+P9gQtdA/DubP4AcNw8veWWwY/riQLgbdUPrzoOALAvb+4Jrt97vKcArqtur567i4kAgL34YvXy6oHzv/B4rwL4heqHdjkRALBzp1ouCvzQ+V94rDMAN7TcSejkbmcCAPbgwermznvnwMe6BuBns/kDwKG4tnrn+b95/hmA61teMuDKfwA4HPdVN539WH33GYCfyuYPAIfmVPWOR//G+WcAbq9eurdxAIB9+XR167lPHn0G4LXZ/AHgUL28es25Tx4dAG/f/ywAwB59e68/9xTA1dXd1TM3GQcA2IevVc+pHj53BuAHsvkDwKF7dvWq+s5TAG/cbhYAYI/eWN8JgDdsOAgAsD9vqOUagGuq0y13CgIADtsD1TNOVLdk8weAKU5WLz4XAADAHLcIAACYRwAAwEC3nKi+b+spAIC9euGJlncIAgDmOHWium7rKQCAvbpOAADAPNddVX2z5WZAAMAM3zxx4T8DAByaEy23BAQA5rj/RHX/1lMAAHslAABgoDMnqq9vPQUAsFf3nag+v/UUAMBe/fGJ6o6tpwAA9uoOAQAA8wgAABjojqta7gJ4urp242EAgN27v7rhRPWt6raNhwEA9uMj1UPnbgX8+1tOAgDszYdquRXwtz8BAA7eh6quOvvJ1dXd1TM3GwcA2LWvVs+tHj53BuDPqvdvNw8AsAfvrx6u7zwFUPW+bWYBAPbk23v9Ved94Q+qV+x3FgBgDz5d3XrukxPnffG9+50FANiT33z0J+efAbi+urN6+r6mAQB27nR1c8tNgKrvPgNwpvr1PQ4EAOzer/aozb+++wxA1Q0tZwFO7mEgAGC3zrT89H/vo3/z/DMAVfdU797DQADA7r2r8zb/euwzAFVPbbla8KZdTgQA7NQXqpdXD57/hcc6A1D1jerndjkRALBzP9NjbP71+GcAzvlA9cOrjwMA7NrvVn/l8b54oQC4ufpE9bQVBwIAdut09eqWpwAe0+M9BXDOndXbq0fWmwkA2KFHqr/TE2z+tbwL4IV8pnpG9RdWGAoA2K1faXnd/xO60FMA51xTfbj6i1cyEQCwUx+t3lA9dKE/eLEBUHVj9ZHqpZc5FACwO5+tXl/934v5w5cSAFXf21IXz7/E7wMAdufL1euquy72Gy50EeD5vlT9SMvVhQDA9k5Xb+4SNv+69ACo+mT1l6ovXsb3AgDrubt6Y/WpS/3GS30K4NFuqj6YawIAYAu3t9zo5wlf7vd4LucMwDl3tZwJ+PgVPAYAcOk+1rIHX9bmXxd3H4An8o3q31VPabn44ErOKAAAT+yR6teqv1k9cCUPtOaG/WPVb7XcNAgAWNd91d+t/tMaD3YlTwGc779Wr6n+24qPCQAsb87351pp8691A6CW6wJ+pOVswJ0rPzYATPPl6m9VP9oVPN//WK70GoDH85nq35799atarhEAAC7O/dW/rP5G9b938Rfs46K966ufrn4+1wcAwBM5U/1Gy+a/05vu7fOq/eurv1f9ZHXrHv9eADjqPtVyIf2/afnpf+e2etnerdXbW57X+J6NZgCALZ1uuajvfdVt+/7Lt37d/onqZS33EPjB6k3VqU0nAoDdeLDl5nm/d3Z9onp4q2G2DoDzPam65VHrJdWLq5PVddXTzv76mq0GBIDH8K2WG/N8veUU/gMtb897R8uF8XecXX+61YDnO2oBAMfZI1sPMIT/b8EK1r4PAABwDAgAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAAICBBAAADCQAAGAgAQAAAwkAABhIAADAQAIAAAYSAAAwkAAAgIEEAAAMJAAAYCABAAADCQAAGEgAAMBAAgAABhIAADCQAACAgQQAAAwkAABgIAEAAAMJAAAYSAAAwEACAAAGEgAAMJAAgPV8a+sBBvjm1gPAoRAAsJ4Hth5ggPu3HgAOhQCA9dicds8xhpUIAFiPzWn3zmw9ABwKAQDr+frWAwxw39YDwKEQALCez289wAB/vPUAcCgEAKznjq0HGMAxhpUIAFiPzWn3HGNYiQCA9dicds8xhpVctfUAcECuqU5X1249yIG6v7qhemjrQeAQOAMA6/lWddvWQxywj2Tzh9UIAFjX7289wAH70NYDwCERALAum9TuOLawItcAwLquru6unrn1IAfmq9Vzq4e3HgQOhTMAsK4/q96/9RAH6P3Z/AE44v589Yi16nr1Jf0XAICN/EHbb5qHsj51icceuAieAoDdeO/WAxyQ39x6ADhELgKE3bi+urN6+sZzHHenq5vzVsuwOmcAYDfOVL++9RAH4Fez+cNOOAMAu3NDy1mAkxvPcVydafnp/96N54CD5AwA7M491bu3HuIYe1c2fwCOqae2nAXY+kr647buypsqAXDM/fW231CP23rrZR1pADhiPtD2m+pxWR+8zGMMAEfOzS3PZ2+9uR71dU/1/Ms7xABwNP1oy/3st95kj+p6uPqrl310AeAIe1fbb7RHdf2rKziuAHCkXVN9vO0326O2bquefAXHFQCOvBur29t+0z0q6zPVs67oiALAMfG9La9133rz3Xp9qbrpCo8lABwrr2i56n3rTXirdU916xUfRQA4hl5efaHtN+N9r69Ur1zh+AHAsXVTs64J+HRe6w8A1XJh4MfafnPe9fpoy7skAgBnPan65Q7zZkEPt9wD4ZrVjhYAHJgf67AuDvx6yxsiAQAXcFOH8QZCv5Pn+wHgkr2l+nzbb+SXur5U/cQOjgcAjHFt9YvVmbbf2C+0zlT/vHrqTo4EAAx0ffWPO5rXB9zXcgHjM3b2rweA4a6vfq76ZNtv/J+s/mF13U7/xQDA/+fWlp+8725/m/491Xuq1+/h3wfsyFVbDwCs4kT1sup11Q9Wb6pOrfTYD7a8hfHvnV2faHldP3CMCQA4TE+qbnnUekn14upky+n6p539ddUDLa/Vv//srz9b3dHyNr13nF1/usfZgT34f+lcAPIMjPYoAAAAAElFTkSuQmCC", V11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAADkmAAA5JgHuD001AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAPNQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoHlZCgAAAFB0Uk5TAAECAwQFBwkKDxITFBcgJSYwMTU5Oj9ET1FUVmBiZGlscnh9gIWHjY6PkJGUmZ+kq6ytrrfAxMbHztLT1dfY3+Di4+To7O3u7/D19/j5+/5IUs73AAAD+klEQVQYGe3BaVuNCxQA0N1cJCo5SqZE5tIsQxqEUPv//5prfhIR+XDPu9daEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRC51Dr0pXr0zN3+d+amb5+5VJrqDP+teEbc2tvkzbxdm3uxnD8K10X7q4nbWf9zoWuOLG+iw9fJm3q5cOLfXESw492k7a2+2g4/tbQ7H7S9vZnh+JvnL79LmmEd7dPx5/qm3qTNMabqb74E52Xt5JG2brcGcc2sJg0zuJAHNPZZ0kDPTsbx9J6lTTSq1Ycw7W9pKH2rsXv9DxIGuxBT/zS4FLSaEuD8Qv9j5OGe9wfR+qYSxpvriOOMp0UMB1HmNhPCtifiJ8a2U1K2B2JnzizkRSxcSZ+0LuSlLHSG4fdSwq5F4ec20sK2TsX35tPSpmP74wlxYzFQctJMctxwHhSznh80/08Ked5d3x1NSnoanzRv50UtN0fn00kJU3EZ7NJSbPxSc/rpKTXPfFRKymqFR/dT4q6Hx90bCZFbXZExGhS1mhE3EzKuhkRT5OynkacSgo7FeeTws7HZFLYZNxKCrsVC0lhC7GaFLYaT5LCnsSLpLAXsZMUthPvk8Lex/uksPexkxS2Ey+Swl7Ek6SwJ7GaFLYaC0lhC3ErKexWTCaFTcb5pLDzcSop7FTE06SspxFxMynrZkSMJmWNRkTHZlLUZkd8cD8p6n581EqKasVHPa+Tkl73xCezSUmz8dlEUtJEfNa/nRS03R9fXE0KuhpfdT9PynneHd+MJ+WMxwHLSTHLcdBYUsxYfGc+KWU+vnduLylk71wcci8p5F4c1ruSlLHSGz84s5EUsXEmfmJkNylhdyR+amI/KWB/Io4wnRQwHUfpmEsab64jjtT/OGm4x/3xC4NLSaMtDcYv9TxIGuxBT/zOtb2kofauxTG0XiWN9KoVx3L2WdJAz87GMQ0sJo2zOBDH1nl5K2mUrcud8Sf6pt4kjfFmqi/+1Onb75JGeHf7dPyNodn9pO3tzw7F3xp+tJu0td1Hw3ESfRcfvkza1MuHF/vixLou3F1P2s76nQtd8a8M35hbe5u0ibdrczeG41/rHGpdunJ9euYu/1sz09evXGoNdQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACN8B8ko0mAp4BxgAAAAABJRU5ErkJggg==", F11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAuUAAALlAF37bb0AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYZQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMV8x+AAAAIF0Uk5TAAEDBwgMGBkdHiAtNkVJU1VkZW9wgoOEhYaHiImKi42Oj5CRk5SVlpeYmZqbnJ6foKGipKWmp6iqq6ytr7CxsrO1tre4uru8vb7AwcLDxMXGx8jJy8zNzs/R0tPU1tfY2drc3d7f4OLj5OXm5+jp6uvt7u/w8vP09fb4+fr7/P3+ahITkgAACPJJREFUeNrt3Wd7mvUfxuGvJk3UKG5xp25w71mtWyvWgXGPiqNSR50gjqj3O/eh/5GQJ8Ej3Nd5vQKO3/khwA2EKlvQVjr9wWjaHKz9+dXWkYvPhrP4rfcmzYHd1vmAFrvV7qw50Hv1XEgL3NqwOejbvgjTwrYxbpZgh88gtaD7/1L4N00P1WIe/4fNkmwT1iLWbZZmF9BawOu/2fIEcOoQr31fr1miXclr36//TZYpgNNnEtvndZql2nnE9nn95QqgT2yfN1iuAI4R2+eNliuAE8T2edPlCmBCLDuAhlj2Q4AAwp8ECiD8ZaAAwi8ECSD7UrAA9n89AWRvmd4OFsAi1hVA9pbnI2ECWMyW5UOhAljUNsYCCP8bMBRA+POA7kwA4a8GexMBhF8TPIhfDxdAa3eJAPgLgL8A+AuAvwD4C4C/APgLgL8A+AuAvwD4C4C/APgLgL8A+AuAvwD4CyDeXwDh/gII9xdAuL8A2u6/LYBo/+ObAoj2P3SpAKL96zIBRPvv+f9KHGm7/etyAUT71xUCiPavqwQQ7V9XCyDav64RQLR/XSuAaP9yJTDbvw4LINq/rhNAtH9dL4Bo/7pBANH+daMAov3rJgFE+9fNAoj2r1sEEO2/508YOeJ2+9etAoj2r9sEEO1ftwsg2r/uEEC0f90pgGj/uksA0f51twCi/eseAUT7170CiPav+wQQ7V/3CyDavx4QQLR/PSiAaP96SADR/vWwAKL96xEBRPvXowKI9q/HBBDtX0cEEO1fjwsg2r+eEEC0fx0VQLR/PSmAaP96SgDR/vW0AKL96xkBRPvXswKI9q/nBBDtX88LINq/XhBAtH+9KIBo/zomgGj/ekkA0f41EEC0f70sgGj/Oi6AaP96RQDR/vWaAKL963UBRPvXUADR/vWGAKL9a0sA0f71pgCi/estAUT719sCiPavdwQQ7V/vCiDav94TQLR/vS+AaP/6QADR/vWhAKL96yMBRPvXCQFE+9fHAoj2r5EAov3rEwFE+9enAoj2r88EEO1fnwsg2r9OCiDav74QQLR/jQUQ7V+nBBDtX18KINq/vhZAtH99I4Bo/zotgGj/+lYA0f71nQCi/et7AUT71w8CiPavHwUQ7V8/CSDavyYCiPavqQCi/etnAUT710wA0f71iwCi/etXAUT7128CiPav3wUQ7V/bAoj2rz8EEO1ffwkg2r8aAUT773UpeAqu3f57/X+AEbl2++/1q2EDdO32r/7829Jn127/6sy/MR147favlbmfCJms0Gu3f1Vv3q3p0Wu7f63P+UTAbB1f2/2rurvfnC6+9vvX6q6/HDdc5dd+/6q1Xf5LyHiNX4J/1caOBYw3+GX4V63t8CgwdP+P8a9a7f7Pa4FZ1+N/kH9Vrff+44rQpOf1X5h/Va10+oPRdDoa9Duu/wX6G3/jb/yNv/E3/sbf+Bt/42/8jb/xN/7G3/gbf+Nv/I0/f/78+fPnz58/f/78+fPnn7AL+WfvnJP8FcBfAfwVwF8B/BXAXwH8FcBfAfwVwF8B/NML4J9dAP/sAvhnF8A/uwD+2QXwzy6Af3YB/LML4J9dAP/sAvhn7yz+ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZpa2Q2c5g2j/4yfPcQrJ/k2jgGx/BaT7KyDdXwHp/gpI91dAur8C0v0VkO6vgHR/BaT7KyDdXwHp/gpI91dAur8C0v0VkO6vgHR/BaT7KyDdXwHp/gpI92+aCx1YtP8lDoy/8Tf+xt/4G3/jb/yNv/E3/sbf+Bt/42/8jb/xN/7G3/gbf+Nv/I2/8Tf+bd1Kpz8YTaejQb+zwj9u673JPwc66a3zj9pqd/bfZzrrrvLP2drw/491uMY/ZRvjnQ52vME/5P4/3vlox2v8Ix7/h7sd7nCVf8C6ux9vl3/A67/Z7uc7W+ff+vXmnXCPf9u3Mpl3xJMV/i1fZ/4hd/i3fP35p9zn3/IN5h/zgH/LN5p/ziP+Ld90/kFP+bd8ex01/+wA/uKfHcAf/LMD2OafHcDv/LMD+I1/dgC/8s8O4Bf+2QHM+GcH8DP/7ACm/LMDmPDPDuAn/tkB/Mg/O4Af+GcH8D3/7AC+458dwLf8swM4zT87gG/4ZwfwNf/sAL7knx3AKf7ZAYz5ZwfwBf/sAE7yzw7gc/7ZAXzGPzuAT/lnB/AJ/+wARvyzA/iYf3YAJ/hnB/AR/+wAPuSfHcAH/LMDeJ9/dgDv8c8O4F3+2QG8wz87gLf5ZwfwFv/sAN7knx3AFv/sAN7gnx3AkH92AK/zzw7gNf7ZAbzCPzuA4/yzA3iZf3YAA/7ZAbzEPzuAY/yzA3iRf3YAL/DPDuB5/tkBPMc/O4Bn+WcH8Az/7ACe5p8dwFP8swN4kn92AEf5ZwfwBP/sAB7nnx3AEf7ZATzGPzuAR/lnB/AI/+wAHuafHcBD/LMDeJB/dgAP8M8O4H7+2QHcxz87gHv5ZwdwD//sAO7mnx3AXfyzA7iTf3YAd/DPDuB2/tkB3MY/O4Bb+WcH0OOfHcAt/LMDuJl/dgA38c8O4Eb+2QHcwD87gOv5ZwdwHf/sAA7zzw5gk392ANfyzw7gGv7ZAVzNPzuAq/hnB3AF/+wALuefHUCXf3YAl/HPDuBS/tkBbPLPDmCbf3YA/AXAXwD8BcBfAPwFwF8A/AXAXwD8BcBfAPwFwD87AP7ZAfDPDoB/dgD8swPgnx0A/+wA+GcHwD87AP7ZAfD3HOBf2nQ06HdWOMUG0DRN00x666SSA2iaWXeVVXIATTNcgxUdQDPeoBUdQDP2NyA7gGboeUB2AE2XV3YAM68GswPY6SeMLCmAiWuC2QE0HWLZAfSJZQcwIJYdwIhYdgBTYvu8iQCyd8JDQPaOeRKYvb6Xgdk7z4Wg7J152qXg7F3pzaDsHTrl7eDsXeADIeHb9JGw8PV8KDR7Zxz2sfDwXbR98P/+u/8vcue+esCf//tq2KJ3/tYBvv7jy6H/xs6++MjWV38etPd/fT18ofsb4xlc99FSiiAAAAAASUVORK5CYII=", U11 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOdSURBVHgBvVdNTBNBFH5b+RFDpTExtIaYEgGPVr2q4E2jBzjpUQ0XjQY8mKgJAaMHPQHReBED6skTJErwJqhXpV4Rw0aDrcbYSusfhK7vm53ZDm0X2Lr4Ja87293Z75v33ryZMWidsCwrxJd2tla2GFuULSQfp9lMtjjbFNuYYRhp8gNMHGXrZ0tZ3jCMvmt931iFGKPrZesufLaYSLAlafFTkjYFa4XVNDeLawkMsF1z84jhNmq+PCfbzQK/3s3StycTtPDiFRMnintaRJWRMNXuj1G48wxV7QjrT022wyzCXFMAkyO+o4p8OZOl+f7blBqf4JcNp0MJ/vzVsih0/CgLOa0LMdk6WETcVUDhyLNv4mReukq57A8K6B0M1dFwaC2rWEhluJ4iFy9QXdtBcvOEoZEj5tOKPPV0gj5ev+kQBySza9Jo5FBjyfsc/zb0XKFt7BFNxF6VEwGtf68iX5h86ZALM4wi95eygGrjfTa7v0Hz/K3s62nFE5VczreU6+fQRnbPne2iJb7axNqLHuCEgr2RgxCeIbtHH+szpRGhCGijF/hyb1iSrxydVzjCpScsTuYEJ7MGMb0NGfsUbjD6mfYTktwoi7gURD5IT+x6dJ9qWprwN3KgEeLa1YsYvT1iv6jzMGQ405zcEqK0Q0Cr+ucnTzu8KDqQf8iHgyjDhUxDKwSg8IiCg9iXG/P1SgHHEpdwiVgFyan3m0utGr0OZG/w0AHyiuVslv7MzApCm9qGxY3FZJIq7QoZhQCxpC5nMiU/1PhwSNT4cgDy9x0nV/yHTFjCWrJPOD7kFKIcK/5fCASDThsewHQIVUUiJeP/4Vw3VfO02VRbS15RkHDi25iSFflilIYAky3m5maRNIkk+Ynq5ibVFJXwLVoQUG6svaCKObRyHIeASXVXTrZ7Ady/xU4+hSkIGCM7Dyh07Eh+Sd0gbO88pd+OBeS6/AB3SLY6FrFRwLe1MI+Au2g5RgHB3M1l/J2WIN55d0AXkF+O5RZpEG1Mt4ZbN8hv1Hef18kH1bbMdUv2ffwZJXgn4wciPZf10JqkbclW35RyIfncf6fsOoB1BN7UMt8kt02pJmLFthzkX4dGhEe8ACOG2wP5OW/SWttyTUSUCg4mSgj2DG4eQYxRS7Yy+eaWJv2RSes9mGgikBN9bF2FzzBDsHxjAcM+QlVRl0qK5O4r+7AqD6cjljfgIDvwT4fTEkLU8byNbQ/5dDz/C/hg1v2ppkDyAAAAAElFTkSuQmCC", Fi = {\n Countries: [\n {\n CountryName: "RESTRICTED",\n CountryCode: "RESTRICTED",\n Flag: U11\n },\n {\n CountryName: "NOFLAG",\n CountryCode: "NOFLAG",\n Flag: H2\n },\n {\n CountryName: "United States Of America",\n CountryCode: "US",\n Flag: YZ\n },\n {\n CountryName: "Abkhazia",\n CountryCode: "AB",\n Flag: XZ\n },\n {\n CountryName: "Afghanistan",\n CountryCode: "AF",\n Flag: QZ\n },\n {\n CountryName: "Albania",\n CountryCode: "ALB",\n Flag: GZ\n },\n {\n CountryName: "Algeria",\n CountryCode: "ALG",\n Flag: jZ\n },\n {\n CountryName: "Andorra",\n CountryCode: "AND",\n Flag: KZ\n },\n {\n CountryName: "Angola",\n CountryCode: "ANG",\n Flag: ZZ\n },\n {\n CountryName: "Antigua & Barbuda",\n CountryCode: "ANB",\n Flag: JZ\n },\n {\n CountryName: "Argentina",\n CountryCode: "ARG",\n Flag: _Z\n },\n {\n CountryName: "Armenia",\n CountryCode: "ARM",\n Flag: $Z\n },\n {\n CountryName: "Australia",\n CountryCode: "AUS",\n Flag: eJ\n },\n {\n CountryName: "Austria",\n CountryCode: "AS",\n Flag: tJ\n },\n {\n CountryName: "Azerbaijan",\n CountryCode: "AZ",\n Flag: rJ\n },\n {\n CountryName: "Bahamas",\n CountryCode: "BAM",\n Flag: nJ\n },\n {\n CountryName: "Bahrain",\n CountryCode: "BAH",\n Flag: oJ\n },\n {\n CountryName: "Bangladesh",\n CountryCode: "BAN",\n Flag: iJ\n },\n {\n CountryName: "Barbados",\n CountryCode: "BAR",\n Flag: aJ\n },\n {\n CountryName: "Belarus",\n CountryCode: "BER",\n Flag: sJ\n },\n {\n CountryName: "Belgium",\n CountryCode: "BEL",\n Flag: lJ\n },\n {\n CountryName: "Belize",\n CountryCode: "BEZ",\n Flag: cJ\n },\n {\n CountryName: "Benin",\n CountryCode: "BEN",\n Flag: pJ\n },\n {\n CountryName: "Bhutan",\n CountryCode: "BHU",\n Flag: dJ\n },\n {\n CountryName: "Bolivia",\n CountryCode: "BOL",\n Flag: AJ\n },\n {\n CountryName: "Bosnia & Herzegovina",\n CountryCode: "BOS",\n Flag: uJ\n },\n {\n CountryName: "Botswana",\n CountryCode: "BOT",\n Flag: bJ\n },\n {\n CountryName: "Brazil",\n CountryCode: "BRA",\n Flag: hJ\n },\n {\n CountryName: "Brunei",\n CountryCode: "BRU",\n Flag: MJ\n },\n {\n CountryName: "Bulgaria",\n CountryCode: "BUL",\n Flag: fJ\n },\n {\n CountryName: "Burkina Faso",\n CountryCode: "BUR",\n Flag: gJ\n },\n {\n CountryName: "Burundi",\n CountryCode: "BUD",\n Flag: zJ\n },\n {\n CountryName: "Cambodia",\n CountryCode: "CAD",\n Flag: CJ\n },\n {\n CountryName: "Cameroon",\n CountryCode: "CAM",\n Flag: OJ\n },\n {\n CountryName: "Canada",\n CountryCode: "CA",\n Flag: mJ\n },\n {\n CountryName: "Cape Verde",\n CountryCode: "CV",\n Flag: vJ\n },\n {\n CountryName: "Central African Republic",\n CountryCode: "CAR",\n Flag: yJ\n },\n {\n CountryName: "Chad",\n CountryCode: "CH",\n Flag: LJ\n },\n {\n CountryName: "Chile",\n CountryCode: "CHE",\n Flag: wJ\n },\n {\n CountryName: "China",\n CountryCode: "CHI",\n Flag: qJ\n },\n {\n CountryName: "Colombia",\n CountryCode: "COL",\n Flag: xJ\n },\n {\n CountryName: "Comoros",\n CountryCode: "COM",\n Flag: RJ\n },\n {\n CountryName: "Congo",\n CountryCode: "CON",\n Flag: BJ\n },\n {\n CountryName: "Cook Islands",\n CountryCode: "CI",\n Flag: WJ\n },\n {\n CountryName: "Costa Rica",\n CountryCode: "CR",\n Flag: EJ\n },\n {\n CountryName: "Croatia",\n CountryCode: "CRO",\n Flag: SJ\n },\n {\n CountryName: "Cuba",\n CountryCode: "CU",\n Flag: kJ\n },\n {\n CountryName: "Cyprus",\n CountryCode: "CY",\n Flag: NJ\n },\n {\n CountryName: "Czech Republic",\n CountryCode: "CZ",\n Flag: IJ\n },\n {\n CountryName: "Democratic Republic of the Congo",\n CountryCode: "DRC",\n Flag: TJ\n },\n {\n CountryName: "Denmark",\n CountryCode: "DEN",\n Flag: DJ\n },\n {\n CountryName: "Djibouti",\n CountryCode: "DJ",\n Flag: HJ\n },\n {\n CountryName: "Dominica",\n CountryCode: "DOM",\n Flag: PJ\n },\n {\n CountryName: "Dominican Republic",\n CountryCode: "DR",\n Flag: VJ\n },\n {\n CountryName: "East Timor",\n CountryCode: "ET",\n Flag: FJ\n },\n {\n CountryName: "Ecuador",\n CountryCode: "EC",\n Flag: UJ\n },\n {\n CountryName: "Egypt",\n CountryCode: "EG",\n Flag: YJ\n },\n {\n CountryName: "El Salvador",\n CountryCode: "ES",\n Flag: XJ\n },\n {\n CountryName: "Equitorial Guinea",\n CountryCode: "EQG",\n Flag: QJ\n },\n {\n CountryName: "Eritrea",\n CountryCode: "ERI",\n Flag: GJ\n },\n {\n CountryName: "Estonia",\n CountryCode: "EST",\n Flag: jJ\n },\n {\n CountryName: "Ethiopia",\n CountryCode: "ETH",\n Flag: KJ\n },\n {\n CountryName: "EU",\n CountryCode: "EU",\n Flag: ZJ\n },\n {\n CountryName: "F.S. Micronesia",\n CountryCode: "FS",\n Flag: JJ\n },\n {\n CountryName: "Fiji",\n CountryCode: "FI",\n Flag: $J\n },\n {\n CountryName: "Finland",\n CountryCode: "FD",\n Flag: _J\n },\n {\n CountryName: "France",\n CountryCode: "FR",\n Flag: M_\n },\n {\n CountryName: "Gabon",\n CountryCode: "GAB",\n Flag: f_\n },\n {\n CountryName: "Gambia",\n CountryCode: "GAM",\n Flag: g_\n },\n {\n CountryName: "Georgia",\n CountryCode: "GEO",\n Flag: z_\n },\n {\n CountryName: "Germany",\n CountryCode: "GER",\n Flag: C_\n },\n {\n CountryName: "Ghana",\n CountryCode: "GH",\n Flag: O_\n },\n {\n CountryName: "Greece",\n CountryCode: "GR",\n Flag: m_\n },\n {\n CountryName: "Grenada",\n CountryCode: "GRA",\n Flag: v_\n },\n {\n CountryName: "Guatemala",\n CountryCode: "GU",\n Flag: e_\n },\n {\n CountryName: "Guinea-Bissau",\n CountryCode: "GB",\n Flag: t_\n },\n {\n CountryName: "Guinea",\n CountryCode: "GUI",\n Flag: r_\n },\n {\n CountryName: "Guyana",\n CountryCode: "GUY",\n Flag: n_\n },\n {\n CountryName: "Haiti",\n CountryCode: "HAI",\n Flag: o_\n },\n {\n CountryName: "Honduras",\n CountryCode: "HON",\n Flag: i_\n },\n {\n CountryName: "Hong Kong",\n CountryCode: "HK",\n Flag: a_\n },\n {\n CountryName: "Hungary",\n CountryCode: "HU",\n Flag: s_\n },\n {\n CountryName: "Iceland",\n CountryCode: "IL",\n Flag: l_\n },\n {\n CountryName: "India",\n CountryCode: "IND",\n Flag: c_\n },\n {\n CountryName: "Indonesia",\n CountryCode: "INA",\n Flag: p_\n },\n {\n CountryName: "Iran",\n CountryCode: "IRN",\n Flag: d_\n },\n {\n CountryName: "Iraq",\n CountryCode: "IRQ",\n Flag: A_\n },\n {\n CountryName: "Ireland",\n CountryCode: "IRE",\n Flag: u_\n },\n {\n CountryName: "Israel",\n CountryCode: "ISR",\n Flag: b_\n },\n {\n CountryName: "Italy",\n CountryCode: "IT",\n Flag: h_\n },\n {\n CountryName: "Ivory Coast",\n CountryCode: "IC",\n Flag: y_\n },\n {\n CountryName: "Jamaica",\n CountryCode: "JAM",\n Flag: L_\n },\n {\n CountryName: "Japan",\n CountryCode: "JAP",\n Flag: w_\n },\n {\n CountryName: "Jordan",\n CountryCode: "JOR",\n Flag: q_\n },\n {\n CountryName: "Kenya",\n CountryCode: "KEN",\n Flag: x_\n },\n {\n CountryName: "Kiribati",\n CountryCode: "KI",\n Flag: R_\n },\n {\n CountryName: "Kosovo",\n CountryCode: "KO",\n Flag: B_\n },\n {\n CountryName: "Kzakhstan",\n CountryCode: "KZ",\n Flag: W_\n },\n {\n CountryName: "Kuwait",\n CountryCode: "KU",\n Flag: E_\n },\n {\n CountryName: "Kyrgyzstan",\n CountryCode: "KY",\n Flag: S_\n },\n {\n CountryName: "Laos",\n CountryCode: "LAO",\n Flag: k_\n },\n {\n CountryName: "Latvia",\n CountryCode: "LAT",\n Flag: N_\n },\n {\n CountryName: "Lebanon",\n CountryCode: "LEB",\n Flag: I_\n },\n {\n CountryName: "Lesotho",\n CountryCode: "LES",\n Flag: T_\n },\n {\n CountryName: "Liberia",\n CountryCode: "LIB",\n Flag: D_\n },\n {\n CountryName: "Libia",\n CountryCode: "LI",\n Flag: H_\n },\n {\n CountryName: "Liechtenstein",\n CountryCode: "LIN",\n Flag: P_\n },\n {\n CountryName: "Lithuania",\n CountryCode: "LIT",\n Flag: V_\n },\n {\n CountryName: "Luxembourg",\n CountryCode: "LUX",\n Flag: F_\n },\n {\n CountryName: "Macau",\n CountryCode: "MA",\n Flag: U_\n },\n {\n CountryName: "Macedonia",\n CountryCode: "MAE",\n Flag: Y_\n },\n {\n CountryName: "Madagascar",\n CountryCode: "mg",\n Flag: eh\n },\n {\n CountryName: "Malawi",\n CountryCode: "MAW",\n Flag: X_\n },\n {\n CountryName: "Malaysia",\n CountryCode: "MAL",\n Flag: Q_\n },\n {\n CountryName: "Maldives",\n CountryCode: "MV",\n Flag: G_\n },\n {\n CountryName: "Mali",\n CountryCode: "MI",\n Flag: j_\n },\n {\n CountryName: "Malta",\n CountryCode: "MT",\n Flag: K_\n },\n {\n CountryName: "Marshall Islands",\n CountryCode: "MIS",\n Flag: Z_\n },\n {\n CountryName: "Mauritania",\n CountryCode: "MU",\n Flag: J_\n },\n {\n CountryName: "Mauritius",\n CountryCode: "MAU",\n Flag: __\n },\n {\n CountryName: "Mexico",\n CountryCode: "MX",\n Flag: $_\n },\n {\n CountryName: "Moldova",\n CountryCode: "MO",\n Flag: e$\n },\n {\n CountryName: "Monaco",\n CountryCode: "MON",\n Flag: t$\n },\n {\n CountryName: "Mongolia",\n CountryCode: "MGL",\n Flag: r$\n },\n {\n CountryName: "Montenegro",\n CountryCode: "MOG",\n Flag: n$\n },\n {\n CountryName: "Morocco",\n CountryCode: "MOR",\n Flag: o$\n },\n {\n CountryName: "Mozambique",\n CountryCode: "MZ",\n Flag: i$\n },\n {\n CountryName: "Myanmar",\n CountryCode: "MY",\n Flag: a$\n },\n {\n CountryName: "Nagorno-Karabakj",\n CountryCode: "NK",\n Flag: s$\n },\n {\n CountryName: "Namibia",\n CountryCode: "NM",\n Flag: l$\n },\n {\n CountryName: "Nauru",\n CountryCode: "NA",\n Flag: c$\n },\n {\n CountryName: "Nepal",\n CountryCode: "NP",\n Flag: p$\n },\n {\n CountryName: "Netherlands",\n CountryCode: "NL",\n Flag: d$\n },\n {\n CountryName: "New Zealand",\n CountryCode: "NZ",\n Flag: A$\n },\n {\n CountryName: "Nicaragua",\n CountryCode: "NIC",\n Flag: u$\n },\n {\n CountryName: "Niger",\n CountryCode: "NIG",\n Flag: b$\n },\n {\n CountryName: "Nigeria",\n CountryCode: "NGA",\n Flag: h$\n },\n {\n CountryName: "Niue",\n CountryCode: "NI",\n Flag: M$\n },\n {\n CountryName: "North Korea",\n CountryCode: "NKO",\n Flag: f$\n },\n {\n CountryName: "Northern Cyprus",\n CountryCode: "NC",\n Flag: g$\n },\n {\n CountryName: "Norway",\n CountryCode: "NY",\n Flag: z$\n },\n {\n CountryName: "Orman",\n CountryCode: "OR",\n Flag: C$\n },\n {\n CountryName: "Pakistan",\n CountryCode: "PK",\n Flag: O$\n },\n {\n CountryName: "Palau",\n CountryCode: "PA",\n Flag: m$\n },\n {\n CountryName: "Palestine",\n CountryCode: "PAL",\n Flag: v$\n },\n {\n CountryName: "Papa New Guinea",\n CountryCode: "PNG",\n Flag: y$\n },\n {\n CountryName: "Paraguay",\n CountryCode: "PAR",\n Flag: L$\n },\n {\n CountryName: "Peru",\n CountryCode: "PE",\n Flag: w$\n },\n {\n CountryName: "Phillippines",\n CountryCode: "PH",\n Flag: q$\n },\n {\n CountryName: "Poland",\n CountryCode: "PL",\n Flag: x$\n },\n {\n CountryName: "Portugal",\n CountryCode: "POR",\n Flag: R$\n },\n {\n CountryName: "Puerto Rica",\n CountryCode: "PR",\n Flag: B$\n },\n {\n CountryName: "Qatar",\n CountryCode: "QT",\n Flag: W$\n },\n {\n CountryName: "Republic of China",\n CountryCode: "RC",\n Flag: E$\n },\n {\n CountryName: "Romania",\n CountryCode: "RO",\n Flag: S$\n },\n {\n CountryName: "Russia",\n CountryCode: "RU",\n Flag: k$\n },\n {\n CountryName: "Rwanda",\n CountryCode: "RW",\n Flag: N$\n },\n {\n CountryName: "Sahrawi Arab Democratic Republic",\n CountryCode: "SA",\n Flag: I$\n },\n {\n CountryName: "Saint Kitts and Nevis",\n CountryCode: "SK",\n Flag: T$\n },\n {\n CountryName: "Saint Lucia",\n CountryCode: "SL",\n Flag: D$\n },\n {\n CountryName: "Samoa",\n CountryCode: "SAM",\n Flag: H$\n },\n {\n CountryName: "San Marino",\n CountryCode: "SM",\n Flag: P$\n },\n {\n CountryName: "Sao Tome and Principe",\n CountryCode: "STP",\n Flag: V$\n },\n {\n CountryName: "Saudi Arabia",\n CountryCode: "SAU",\n Flag: F$\n },\n {\n CountryName: "Senegal",\n CountryCode: "SEN",\n Flag: U$\n },\n {\n CountryName: "Serbia",\n CountryCode: "SER",\n Flag: Y$\n },\n {\n CountryName: "Seychelles",\n CountryCode: "SY",\n Flag: X$\n },\n {\n CountryName: "Sierra Leone",\n CountryCode: "SLE",\n Flag: Q$\n },\n {\n CountryName: "Singapore",\n CountryCode: "SGP",\n Flag: G$\n },\n {\n CountryName: "Slovakia",\n CountryCode: "SLO",\n Flag: j$\n },\n {\n CountryName: "Slovenia",\n CountryCode: "SLV",\n Flag: K$\n },\n {\n CountryName: "Solomon Islands",\n CountryCode: "SI",\n Flag: Z$\n },\n {\n CountryName: "Somalia",\n CountryCode: "SOM",\n Flag: J$\n },\n {\n CountryName: "Somaliland",\n CountryCode: "SMD",\n Flag: _$\n },\n {\n CountryName: "South Africa",\n CountryCode: "SAF",\n Flag: $$\n },\n {\n CountryName: "South Korea",\n CountryCode: "SKO",\n Flag: e11\n },\n {\n CountryName: "South Ossetia",\n CountryCode: "SO",\n Flag: t11\n },\n {\n CountryName: "South Sudan",\n CountryCode: "SS",\n Flag: r11\n },\n {\n CountryName: "Spain",\n CountryCode: "SP",\n Flag: n11\n },\n {\n CountryName: "Sri Lanka",\n CountryCode: "SLA",\n Flag: o11\n },\n {\n CountryName: "St. Vincent and the Grenadines",\n CountryCode: "SV",\n Flag: i11\n },\n {\n CountryName: "Sudan",\n CountryCode: "SUD",\n Flag: a11\n },\n {\n CountryName: "Suriname",\n CountryCode: "SU",\n Flag: s11\n },\n {\n CountryName: "Swaziland",\n CountryCode: "SWA",\n Flag: l11\n },\n {\n CountryName: "Sweden",\n CountryCode: "SWD",\n Flag: c11\n },\n {\n CountryName: "Switzerland",\n CountryCode: "SW",\n Flag: p11\n },\n {\n CountryName: "Syria",\n CountryCode: "SYR",\n Flag: d11\n },\n {\n CountryName: "Tajikistan",\n CountryCode: "TAJ",\n Flag: A11\n },\n {\n CountryName: "Tanzania",\n CountryCode: "TA",\n Flag: u11\n },\n {\n CountryName: "Thailand",\n CountryCode: "TH",\n Flag: b11\n },\n {\n CountryName: "Togo",\n CountryCode: "TOG",\n Flag: h11\n },\n {\n CountryName: "Tonga",\n CountryCode: "TO",\n Flag: M11\n },\n {\n CountryName: "Transnistria",\n CountryCode: "TR",\n Flag: f11\n },\n {\n CountryName: "Trinidad & Tobago",\n CountryCode: "TT",\n Flag: g11\n },\n {\n CountryName: "Tunisia",\n CountryCode: "TUN",\n Flag: z11\n },\n {\n CountryName: "Turkey",\n CountryCode: "TUR",\n Flag: C11\n },\n {\n CountryName: "Turkmenistan",\n CountryCode: "TK",\n Flag: O11\n },\n {\n CountryName: "Tuvalu",\n CountryCode: "TU",\n Flag: m11\n },\n {\n CountryName: "U.S. Virgin Islands",\n CountryCode: "VI",\n Flag: v11\n },\n {\n CountryName: "Uganda",\n CountryCode: "UG",\n Flag: y11\n },\n {\n CountryName: "Ukraine",\n CountryCode: "UKR",\n Flag: L11\n },\n {\n CountryName: "United Arab Emirates",\n CountryCode: "AE",\n Flag: w11\n },\n {\n CountryName: "United Kingdom",\n CountryCode: "UK",\n Flag: q11\n },\n {\n CountryName: "Uzbekistan",\n CountryCode: "UZ",\n Flag: x11\n },\n {\n CountryName: "Vatican City",\n CountryCode: "VC",\n Flag: R11\n },\n {\n CountryName: "Venezuela",\n CountryCode: "VN",\n Flag: B11\n },\n {\n CountryName: "Vietnam",\n CountryCode: "VT",\n Flag: W11\n },\n {\n CountryName: "Yemen",\n CountryCode: "YM",\n Flag: E11\n },\n {\n CountryName: "Zambia",\n CountryCode: "ZA",\n Flag: S11\n },\n {\n CountryName: "British Virgin Islands",\n CountryCode: "BV",\n Flag: k11\n },\n {\n CountryName: "Cayman Islands",\n CountryCode: "CAY",\n Flag: N11\n },\n {\n CountryName: "Curacao",\n CountryCode: "CUR",\n Flag: I11\n },\n {\n CountryName: "Guernsey",\n CountryCode: "GUE",\n Flag: T11\n },\n {\n CountryName: "Jersey",\n CountryCode: "JE",\n Flag: D11\n },\n {\n CountryName: "Zimbabwe",\n CountryCode: "ZM",\n Flag: H11\n },\n {\n CountryName: "Madagascar",\n CountryCode: "MG",\n Flag: eh\n }\n ]\n}, ar = (e) => {\n var o;\n let t = "", r;\n const n = e.data().id;\n if (n.lastIndexOf("$") > 0) {\n const i = n.split("$");\n r = Fi == null ? void 0 : Fi.Countries.filter(\n (a) => a.CountryCode === i[1]\n );\n }\n return r.length == 0 && (r = Fi == null ? void 0 : Fi.Countries.filter(\n (i) => i.CountryCode === "NOFLAG"\n )), t = (o = r[0]) == null ? void 0 : o.Flag, t;\n}, Ql = (e) => parseInt(e.slice(0, -1), 10), th = (e, t) => {\n const r = Ql(e) <= 49;\n let n = r ? Ct.white : Ct.cscBlue;\n return t && (n = r ? Ct.cscBlue : Ct.white), n;\n}, Y11 = (e) => {\n let t;\n switch (!0) {\n case Ql(e) === 100:\n t = 6;\n break;\n case Ql(e) > 49:\n t = 3;\n break;\n default:\n t = 1;\n }\n return t;\n}, X11 = (e) => Ql(e) > 49 ? "solid" : "dashed", Q11 = (e, t, r, n = 0) => {\n let o = `#${(16777216 + (e << 16) + (t << 8) + r).toString(16).slice(1)}`.replace(/[^0-9a-f]/gi, "");\n o.length < 6 && (o = o[0] + o[0] + o[1] + o[1] + o[2] + o[2]);\n let i = "#", a;\n for (let s = 0; s < 3; s += 1)\n a = parseInt(o.substr(s * 2, 2), 16), a = Math.round(Math.min(Math.max(0, a + a * n), 255)).toString(16), i += `00${a}`.substr(a.length);\n return i;\n};\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: calc(100vw - 2rem);\n height: 100vh;\n`;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().h4(\n ({ theme: { spacings: e } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: ${e.sp16} ${e.sp32};\n `\n);\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().div(\n ({ theme: { spacings: e, itemSize: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n margin: ${e.sp16} ${e.sp32};\n width: ${t.md};\n text-align: center;\n display: inline-block;\n vertical-align: top;\n `\n);\n(styled_components__WEBPACK_IMPORTED_MODULE_1___default().span)``;\nstyled_components__WEBPACK_IMPORTED_MODULE_1___default().img(\n ({ theme: { spacings: e, itemSize: t } }) => (0,styled_components__WEBPACK_IMPORTED_MODULE_1__.css)`\n display: block;\n width: ${t.sm};\n height: ${t.sm};\n margin: 0 auto ${e.sp16};\n `\n);\nconst G11 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n width: 100%;\n height: 100vh;\n background: url(${UZ});\n`, sr = {\n width: 80,\n height: 80,\n "background-position-x": ["50%", "100%", "94%"],\n "background-position-y": ["50%", -2, 2],\n "background-clip": ["node", "none", "none"],\n "background-width": ["36px", "24px", "16px"],\n "background-height": ["40px", "24px", "16px"],\n "overlay-opacity": 0\n}, j11 = [\n {\n selector: ".owner-individual-higherholdings",\n style: {\n ...sr,\n shape: "ellipse",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n kc,\n H2,\n ar(e)\n ]\n }\n }\n], K11 = [\n {\n selector: ".shareholder-individual-higherholdings",\n style: {\n ...sr,\n shape: "ellipse",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n kc,\n H2,\n ar(e)\n ]\n }\n }\n], Z11 = [\n {\n selector: ".owner-individual-lowerholdings",\n style: {\n ...sr,\n shape: "ellipse",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n kc,\n H2,\n ar(e)\n ]\n }\n }\n], J11 = [\n {\n selector: ".shareholder-individual-lowerholdings",\n style: {\n ...sr,\n shape: "ellipse",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n kc,\n H2,\n ar(e)\n ]\n }\n }\n], _11 = [\n {\n selector: ".owner-organization",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": "#00B2A9",\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"],\n label: "data(label)"\n }\n }\n], $11 = [\n {\n selector: ".shareholder-organization",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": "#00B2A9",\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"],\n label: "data(label)"\n }\n }\n], e01 = [\n {\n selector: ".entity",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], t01 = [\n {\n selector: ".subsidary",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": "#42788F",\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], r01 = [\n {\n selector: ".intermediatory",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": "#509E2F",\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], n01 = [\n {\n selector: ".parentEntity",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], o01 = [\n {\n selector: ".hover",\n style: {\n "background-color": (e) => {\n const [t, r, n] = e._private.style["background-color"].value;\n return Q11(t, r, n, -0.2);\n }\n }\n }\n], i01 = [\n {\n selector: "edge",\n style: {\n width: (e) => Y11(e.data("label")),\n "line-color": Zt.backgrounds.bgTertiary,\n "target-arrow-color": Zt.backgrounds.bgTertiary,\n "curve-style": "bezier",\n "target-arrow-fill": "hollow",\n "target-distance-from-node": 5,\n "arrow-scale": 1.5,\n "line-style": (e) => X11(e.data("label")),\n "line-cap": "square"\n }\n }\n], a01 = [\n {\n selector: "node[label]",\n css: {\n "text-background-shape": "roundrectangle",\n label: "data(label)",\n "text-valign": "bottom",\n "text-halign": "center",\n "text-border-color": "colors.gainsboro",\n "text-background-padding": "4px",\n "text-background-color": Zt.backgrounds.bgPrimary,\n "text-border-width": 1,\n "text-background-opacity": 1,\n "text-border-opacity": 1,\n "text-margin-y": 7,\n "font-family": Uf.base,\n "font-size": "10px",\n "text-wrap": "wrap",\n "text-max-width": "300"\n }\n }\n], s01 = [\n {\n selector: "edge[label]",\n css: {\n label: "data(label)",\n "text-valign": "bottom",\n "text-halign": "center",\n "text-background-shape": "round-rectangle",\n "text-background-padding": 5,\n "text-background-color": (e) => th(e.data("label"), !1),\n "text-border-width": 1,\n "text-background-opacity": 1,\n "text-border-opacity": 1,\n "text-border-color": Zt.backgrounds.bgTertiary,\n "text-border-style": "solid",\n color: (e) => th(e.data("label"), !0),\n "font-family": Uf.base,\n "font-size": "10px",\n "font-weight": TL.medium,\n "text-wrap": "wrap",\n "text-max-width": "100"\n }\n }\n], l01 = [\n {\n selector: ".serviced-entity",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": "#42788F",\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], c01 = [\n {\n selector: ".focused-entity",\n style: {\n ...sr,\n shape: "round-rectangle",\n "background-color": Zt.backgrounds.bgTertiary,\n "background-image": (e) => [\n Wo,\n H2,\n ar(e)\n ],\n "background-width": ["48px", "24px", "16px"],\n "background-height": ["48px", "24px", "16px"]\n }\n }\n], p01 = [\n ..._11,\n ...$11,\n ...i01,\n ...j11,\n ...K11,\n ...Z11,\n ...J11,\n ...e01,\n ...a01,\n ...s01,\n ...n01,\n ...o01,\n ...r01,\n ...t01,\n ...l01,\n ...c01\n], d01 = (styled_components__WEBPACK_IMPORTED_MODULE_1___default().div)`\n .cy-panzoom {\n position: absolute;\n font-size: 12px;\n color: #fff;\n font-family: arial, helvetica, sans-serif;\n line-height: 1;\n color: #666;\n font-size: 11px;\n z-index: 99999;\n box-sizing: content-box;\n }\n\n .cy-panzoom-zoom-button {\n cursor: pointer;\n padding: 3px;\n text-align: center;\n position: absolute;\n border-radius: 3px;\n width: 10px;\n height: 10px;\n left: 16px;\n background: #fff;\n border: 1px solid #999;\n margin-left: -1px;\n margin-top: -1px;\n z-index: 1;\n box-sizing: content-box;\n }\n\n .cy-panzoom-zoom-button:active,\n .cy-panzoom-slider-handle:active,\n .cy-panzoom-slider-handle.active {\n background: #ddd;\n box-sizing: content-box;\n }\n\n .cy-panzoom-pan-button {\n position: absolute;\n z-index: 1;\n height: 16px;\n width: 16px;\n box-sizing: content-box;\n }\n\n .cy-panzoom-reset {\n top: 55px;\n box-sizing: content-box;\n background-image: url(${F11}) !important;\n background-repeat: no-repeat;\n background-size: 11px;\n background-position: 2px;\n }\n\n .cy-panzoom-zoom-in {\n top: 80px;\n box-sizing: content-box;\n background-image: url(${P11});\n background-repeat: no-repeat;\n background-size: 11px;\n background-position: 2px;\n }\n\n .cy-panzoom-zoom-out {\n top: 197px;\n box-sizing: content-box;\n background-image: url(${V11});\n background-repeat: no-repeat;\n background-size: 11px;\n background-position: 2px;\n }\n\n .cy-panzoom-pan-up {\n top: 0;\n left: 50%;\n margin-left: -5px;\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 5px solid #666;\n box-sizing: content-box;\n }\n\n .cy-panzoom-pan-down {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 5px solid #666;\n box-sizing: content-box;\n }\n\n .cy-panzoom-pan-left {\n top: 50%;\n left: 0;\n margin-top: -5px;\n width: 0;\n height: 0;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-right: 5px solid #666;\n box-sizing: content-box;\n }\n\n .cy-panzoom-pan-right {\n top: 50%;\n right: 0;\n margin-top: -5px;\n width: 0;\n height: 0;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 5px solid #666;\n box-sizing: content-box;\n }\n\n .cy-panzoom-pan-indicator {\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n border-radius: 8px;\n background: #000;\n border-radius: 8px;\n margin-left: -5px;\n margin-top: -5px;\n display: none;\n z-index: 999;\n opacity: 0.6;\n box-sizing: content-box;\n }\n\n .cy-panzoom-slider {\n position: absolute;\n top: 97px;\n left: 17px;\n height: 100px;\n width: 15px;\n box-sizing: content-box;\n }\n\n .cy-panzoom-slider-background {\n position: absolute;\n top: 0;\n width: 2px;\n height: 100px;\n left: 5px;\n background: #fff;\n border-left: 1px solid #999;\n border-right: 1px solid #999;\n box-sizing: content-box;\n }\n\n .cy-panzoom-slider-handle {\n position: absolute;\n width: 16px;\n height: 8px;\n background: #fff;\n border: 1px solid #999;\n border-radius: 2px;\n margin-left: -2px;\n z-index: 999;\n line-height: 8px;\n cursor: default;\n box-sizing: content-box;\n }\n\n .cy-panzoom-slider-handle .icon {\n margin: 0 4px;\n line-height: 10px;\n box-sizing: content-box;\n }\n\n .cy-panzoom-no-zoom-tick {\n position: absolute;\n background: #666;\n border: 1px solid #fff;\n border-radius: 2px;\n margin-left: -1px;\n width: 8px;\n height: 2px;\n left: 3px;\n z-index: 1;\n margin-top: 3px;\n box-sizing: content-box;\n }\n\n .cy-panzoom-panner {\n position: absolute;\n left: 5px;\n top: 5px;\n height: 40px;\n width: 40px;\n background: #fff;\n border: 1px solid #999;\n border-radius: 40px;\n margin-left: -1px;\n box-sizing: content-box;\n }\n\n .cy-panzoom-panner-handle {\n position: absolute;\n left: 0;\n top: 0;\n outline: none;\n height: 40px;\n width: 40px;\n position: absolute;\n z-index: 999;\n box-sizing: content-box;\n }\n\n .cy-panzoom-zoom-only .cy-panzoom-slider,\n .cy-panzoom-zoom-only .cy-panzoom-panner {\n display: none;\n }\n\n .cy-panzoom-zoom-only .cy-panzoom-reset {\n top: 20px;\n }\n\n .cy-panzoom-zoom-only .cy-panzoom-zoom-in {\n top: 45px;\n }\n\n .cy-panzoom-zoom-only .cy-panzoom-zoom-out {\n top: 70px;\n }\n`;\nvar A01 = "Expected a function", rh = 0 / 0, u01 = "[object Symbol]", b01 = /^\\s+|\\s+$/g, h01 = /^[-+]0x[0-9a-f]+$/i, M01 = /^0b[01]+$/i, f01 = /^0o[0-7]+$/i, g01 = parseInt, z01 = typeof Cn == "object" && Cn && Cn.Object === Object && Cn, C01 = typeof self == "object" && self && self.Object === Object && self, O01 = z01 || C01 || Function("return this")(), m01 = Object.prototype, v01 = m01.toString, y01 = Math.max, L01 = Math.min, bp = function() {\n return O01.Date.now();\n};\nfunction w01(e, t, r) {\n var n, o, i, a, s, l, c = 0, p = !1, d = !1, u = !0;\n if (typeof e != "function")\n throw new TypeError(A01);\n t = nh(t) || 0, P8(r) && (p = !!r.leading, d = "maxWait" in r, i = d ? y01(nh(r.maxWait) || 0, t) : i, u = "trailing" in r ? !!r.trailing : u);\n function h(y) {\n var z = n, N = o;\n return n = o = void 0, c = y, a = e.apply(N, z), a;\n }\n function b(y) {\n return c = y, s = setTimeout(g, t), p ? h(y) : a;\n }\n function M(y) {\n var z = y - l, N = y - c, W = t - z;\n return d ? L01(W, i - N) : W;\n }\n function C(y) {\n var z = y - l, N = y - c;\n return l === void 0 || z >= t || z < 0 || d && N >= i;\n }\n function g() {\n var y = bp();\n if (C(y))\n return f(y);\n s = setTimeout(g, M(y));\n }\n function f(y) {\n return s = void 0, u && n ? h(y) : (n = o = void 0, a);\n }\n function O() {\n s !== void 0 && clearTimeout(s), c = 0, n = l = o = s = void 0;\n }\n function m() {\n return s === void 0 ? a : f(bp());\n }\n function v() {\n var y = bp(), z = C(y);\n if (n = arguments, o = this, l = y, z) {\n if (s === void 0)\n return b(l);\n if (d)\n return s = setTimeout(g, t), h(l);\n }\n return s === void 0 && (s = setTimeout(g, t)), a;\n }\n return v.cancel = O, v.flush = m, v;\n}\nfunction P8(e) {\n var t = typeof e;\n return !!e && (t == "object" || t == "function");\n}\nfunction q01(e) {\n return !!e && typeof e == "object";\n}\nfunction x01(e) {\n return typeof e == "symbol" || q01(e) && v01.call(e) == u01;\n}\nfunction nh(e) {\n if (typeof e == "number")\n return e;\n if (x01(e))\n return rh;\n if (P8(e)) {\n var t = typeof e.valueOf == "function" ? e.valueOf() : e;\n e = P8(t) ? t + "" : t;\n }\n if (typeof e != "string")\n return e === 0 ? e : +e;\n e = e.replace(b01, "");\n var r = M01.test(e);\n return r || f01.test(e) ? g01(e.slice(2), r ? 2 : 8) : h01.test(e) ? rh : +e;\n}\nvar R01 = w01, QC = { exports: {} };\n(function(e, t) {\n (function() {\n var r, n, o, i, a, s, l, c, p, d, u, h, b, M, C;\n o = Math.floor, d = Math.min, n = function(g, f) {\n return g < f ? -1 : g > f ? 1 : 0;\n }, p = function(g, f, O, m, v) {\n var y;\n if (O == null && (O = 0), v == null && (v = n), O < 0)\n throw new Error("lo must be non-negative");\n for (m == null && (m = g.length); O < m; )\n y = o((O + m) / 2), v(f, g[y]) < 0 ? m = y : O = y + 1;\n return [].splice.apply(g, [O, O - O].concat(f)), f;\n }, s = function(g, f, O) {\n return O == null && (O = n), g.push(f), M(g, 0, g.length - 1, O);\n }, a = function(g, f) {\n var O, m;\n return f == null && (f = n), O = g.pop(), g.length ? (m = g[0], g[0] = O, C(g, 0, f)) : m = O, m;\n }, c = function(g, f, O) {\n var m;\n return O == null && (O = n), m = g[0], g[0] = f, C(g, 0, O), m;\n }, l = function(g, f, O) {\n var m;\n return O == null && (O = n), g.length && O(g[0], f) < 0 && (m = [g[0], f], f = m[0], g[0] = m[1], C(g, 0, O)), f;\n }, i = function(g, f) {\n var O, m, v, y, z, N;\n for (f == null && (f = n), y = (function() {\n N = [];\n for (var W = 0, T = o(g.length / 2); 0 <= T ? W < T : W > T; 0 <= T ? W++ : W--)\n N.push(W);\n return N;\n }).apply(this).reverse(), z = [], m = 0, v = y.length; m < v; m++)\n O = y[m], z.push(C(g, O, f));\n return z;\n }, b = function(g, f, O) {\n var m;\n if (O == null && (O = n), m = g.indexOf(f), m !== -1)\n return M(g, 0, m, O), C(g, m, O);\n }, u = function(g, f, O) {\n var m, v, y, z, N;\n if (O == null && (O = n), v = g.slice(0, f), !v.length)\n return v;\n for (i(v, O), N = g.slice(f), y = 0, z = N.length; y < z; y++)\n m = N[y], l(v, m, O);\n return v.sort(O).reverse();\n }, h = function(g, f, O) {\n var m, v, y, z, N, W, T, x, E;\n if (O == null && (O = n), f * 10 <= g.length) {\n if (y = g.slice(0, f).sort(O), !y.length)\n return y;\n for (v = y[y.length - 1], T = g.slice(f), z = 0, W = T.length; z < W; z++)\n m = T[z], O(m, v) < 0 && (p(y, m, 0, null, O), y.pop(), v = y[y.length - 1]);\n return y;\n }\n for (i(g, O), E = [], N = 0, x = d(f, g.length); 0 <= x ? N < x : N > x; 0 <= x ? ++N : --N)\n E.push(a(g, O));\n return E;\n }, M = function(g, f, O, m) {\n var v, y, z;\n for (m == null && (m = n), v = g[O]; O > f; ) {\n if (z = O - 1 >> 1, y = g[z], m(v, y) < 0) {\n g[O] = y, O = z;\n continue;\n }\n break;\n }\n return g[O] = v;\n }, C = function(g, f, O) {\n var m, v, y, z, N;\n for (O == null && (O = n), v = g.length, N = f, y = g[f], m = 2 * f + 1; m < v; )\n z = m + 1, z < v && !(O(g[m], g[z]) < 0) && (m = z), g[f] = g[m], f = m, m = 2 * f + 1;\n return g[f] = y, M(g, N, f, O);\n }, r = function() {\n g.push = s, g.pop = a, g.replace = c, g.pushpop = l, g.heapify = i, g.updateItem = b, g.nlargest = u, g.nsmallest = h;\n function g(f) {\n this.cmp = f ?? n, this.nodes = [];\n }\n return g.prototype.push = function(f) {\n return s(this.nodes, f, this.cmp);\n }, g.prototype.pop = function() {\n return a(this.nodes, this.cmp);\n }, g.prototype.peek = function() {\n return this.nodes[0];\n }, g.prototype.contains = function(f) {\n return this.nodes.indexOf(f) !== -1;\n }, g.prototype.replace = function(f) {\n return c(this.nodes, f, this.cmp);\n }, g.prototype.pushpop = function(f) {\n return l(this.nodes, f, this.cmp);\n }, g.prototype.heapify = function() {\n return i(this.nodes, this.cmp);\n }, g.prototype.updateItem = function(f) {\n return b(this.nodes, f, this.cmp);\n }, g.prototype.clear = function() {\n return this.nodes = [];\n }, g.prototype.empty = function() {\n return this.nodes.length === 0;\n }, g.prototype.size = function() {\n return this.nodes.length;\n }, g.prototype.clone = function() {\n var f;\n return f = new g(), f.nodes = this.nodes.slice(0), f;\n }, g.prototype.toArray = function() {\n return this.nodes.slice(0);\n }, g.prototype.insert = g.prototype.push, g.prototype.top = g.prototype.peek, g.prototype.front = g.prototype.peek, g.prototype.has = g.prototype.contains, g.prototype.copy = g.prototype.clone, g;\n }(), function(g, f) {\n return e.exports = f();\n }(this, function() {\n return r;\n });\n }).call(Cn);\n})(QC);\nvar B01 = QC.exports, W01 = B01;\nfunction GC(e) {\n return e && typeof e == "object" && "default" in e ? e.default : e;\n}\nvar Nc = GC(R01), ps = GC(W01);\nfunction Ot(e) {\n return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? Ot = function(t) {\n return typeof t;\n } : Ot = function(t) {\n return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;\n }, Ot(e);\n}\nfunction I9(e, t) {\n if (!(e instanceof t))\n throw new TypeError("Cannot call a class as a function");\n}\nfunction oh(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);\n }\n}\nfunction T9(e, t, r) {\n return t && oh(e.prototype, t), r && oh(e, r), e;\n}\nfunction jC(e, t, r) {\n return t in e ? Object.defineProperty(e, t, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = r, e;\n}\nfunction un(e, t) {\n return E01(e) || S01(e, t) || k01();\n}\nfunction E01(e) {\n if (Array.isArray(e))\n return e;\n}\nfunction S01(e, t) {\n var r = [], n = !0, o = !1, i = void 0;\n try {\n for (var a = e[Symbol.iterator](), s; !(n = (s = a.next()).done) && (r.push(s.value), !(t && r.length === t)); n = !0)\n ;\n } catch (l) {\n o = !0, i = l;\n } finally {\n try {\n !n && a.return != null && a.return();\n } finally {\n if (o)\n throw i;\n }\n }\n return r;\n}\nfunction k01() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n}\nvar et = typeof window > "u" ? null : window, ih = et ? et.navigator : null;\net && et.document;\nvar N01 = Ot(""), KC = Ot({}), I01 = Ot(function() {\n}), T01 = typeof HTMLElement > "u" ? "undefined" : Ot(HTMLElement), ds = function(t) {\n return t && t.instanceString && at(t.instanceString) ? t.instanceString() : null;\n}, U0 = function(t) {\n return t != null && Ot(t) == N01;\n}, at = function(t) {\n return t != null && Ot(t) === I01;\n}, Ve = function(t) {\n return !I2(t) && (Array.isArray ? Array.isArray(t) : t != null && t instanceof Array);\n}, Ce = function(t) {\n return t != null && Ot(t) === KC && !Ve(t) && t.constructor === Object;\n}, D01 = function(t) {\n return t != null && Ot(t) === KC;\n}, O0 = function(t) {\n return t != null && Ot(t) === Ot(1) && !isNaN(t);\n}, H01 = function(t) {\n return O0(t) && Math.floor(t) === t;\n}, Gl = function(t) {\n if (T01 !== "undefined")\n return t != null && t instanceof HTMLElement;\n}, I2 = function(t) {\n return As(t) || ZC(t);\n}, As = function(t) {\n return ds(t) === "collection" && t._private.single;\n}, ZC = function(t) {\n return ds(t) === "collection" && !t._private.single;\n}, D9 = function(t) {\n return ds(t) === "core";\n}, JC = function(t) {\n return ds(t) === "stylesheet";\n}, P01 = function(t) {\n return ds(t) === "event";\n}, Oo = function(t) {\n return t == null ? !0 : !!(t === "" || t.match(/^\\s+$/));\n}, V01 = function(t) {\n return typeof HTMLElement > "u" ? !1 : t instanceof HTMLElement;\n}, F01 = function(t) {\n return Ce(t) && O0(t.x1) && O0(t.x2) && O0(t.y1) && O0(t.y2);\n}, U01 = function(t) {\n return D01(t) && at(t.then);\n}, Y01 = function() {\n return ih && ih.userAgent.match(/msie|trident|edge/i);\n}, B4 = function(t, r) {\n r || (r = function() {\n if (arguments.length === 1)\n return arguments[0];\n if (arguments.length === 0)\n return "undefined";\n for (var i = [], a = 0; a < arguments.length; a++)\n i.push(arguments[a]);\n return i.join("$");\n });\n var n = function o() {\n var i = this, a = arguments, s, l = r.apply(i, a), c = o.cache;\n return (s = c[l]) || (s = c[l] = t.apply(i, a)), s;\n };\n return n.cache = {}, n;\n}, H9 = B4(function(e) {\n return e.replace(/([A-Z])/g, function(t) {\n return "-" + t.toLowerCase();\n });\n}), Ic = B4(function(e) {\n return e.replace(/(-\\w)/g, function(t) {\n return t[1].toUpperCase();\n });\n}), _C = B4(function(e, t) {\n return e + t[0].toUpperCase() + t.substring(1);\n}, function(e, t) {\n return e + "$" + t;\n}), ah = function(t) {\n return Oo(t) ? t : t.charAt(0).toUpperCase() + t.substring(1);\n}, yt = "(?:[-+]?(?:(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[Ee][+-]?\\\\d+)?))", X01 = "rgb[a]?\\\\((" + yt + "[%]?)\\\\s*,\\\\s*(" + yt + "[%]?)\\\\s*,\\\\s*(" + yt + "[%]?)(?:\\\\s*,\\\\s*(" + yt + "))?\\\\)", Q01 = "rgb[a]?\\\\((?:" + yt + "[%]?)\\\\s*,\\\\s*(?:" + yt + "[%]?)\\\\s*,\\\\s*(?:" + yt + "[%]?)(?:\\\\s*,\\\\s*(?:" + yt + "))?\\\\)", G01 = "hsl[a]?\\\\((" + yt + ")\\\\s*,\\\\s*(" + yt + "[%])\\\\s*,\\\\s*(" + yt + "[%])(?:\\\\s*,\\\\s*(" + yt + "))?\\\\)", j01 = "hsl[a]?\\\\((?:" + yt + ")\\\\s*,\\\\s*(?:" + yt + "[%])\\\\s*,\\\\s*(?:" + yt + "[%])(?:\\\\s*,\\\\s*(?:" + yt + "))?\\\\)", K01 = "\\\\#[0-9a-fA-F]{3}", Z01 = "\\\\#[0-9a-fA-F]{6}", $C = function(t, r) {\n return t < r ? -1 : t > r ? 1 : 0;\n}, J01 = function(t, r) {\n return -1 * $C(t, r);\n}, K0 = Object.assign != null ? Object.assign.bind(Object) : function(e) {\n for (var t = arguments, r = 1; r < t.length; r++) {\n var n = t[r];\n if (n != null)\n for (var o = Object.keys(n), i = 0; i < o.length; i++) {\n var a = o[i];\n e[a] = n[a];\n }\n }\n return e;\n}, _01 = function(t) {\n if (!(!(t.length === 4 || t.length === 7) || t[0] !== "#")) {\n var r = t.length === 4, n, o, i, a = 16;\n return r ? (n = parseInt(t[1] + t[1], a), o = parseInt(t[2] + t[2], a), i = parseInt(t[3] + t[3], a)) : (n = parseInt(t[1] + t[2], a), o = parseInt(t[3] + t[4], a), i = parseInt(t[5] + t[6], a)), [n, o, i];\n }\n}, $01 = function(t) {\n var r, n, o, i, a, s, l, c;\n function p(b, M, C) {\n return C < 0 && (C += 1), C > 1 && (C -= 1), C < 1 / 6 ? b + (M - b) * 6 * C : C < 1 / 2 ? M : C < 2 / 3 ? b + (M - b) * (2 / 3 - C) * 6 : b;\n }\n var d = new RegExp("^" + G01 + "$").exec(t);\n if (d) {\n if (n = parseInt(d[1]), n < 0 ? n = (360 - -1 * n % 360) % 360 : n > 360 && (n = n % 360), n /= 360, o = parseFloat(d[2]), o < 0 || o > 100 || (o = o / 100, i = parseFloat(d[3]), i < 0 || i > 100) || (i = i / 100, a = d[4], a !== void 0 && (a = parseFloat(a), a < 0 || a > 1)))\n return;\n if (o === 0)\n s = l = c = Math.round(i * 255);\n else {\n var u = i < 0.5 ? i * (1 + o) : i + o - i * o, h = 2 * i - u;\n s = Math.round(255 * p(h, u, n + 1 / 3)), l = Math.round(255 * p(h, u, n)), c = Math.round(255 * p(h, u, n - 1 / 3));\n }\n r = [s, l, c, a];\n }\n return r;\n}, ee1 = function(t) {\n var r, n = new RegExp("^" + X01 + "$").exec(t);\n if (n) {\n r = [];\n for (var o = [], i = 1; i <= 3; i++) {\n var a = n[i];\n if (a[a.length - 1] === "%" && (o[i] = !0), a = parseFloat(a), o[i] && (a = a / 100 * 255), a < 0 || a > 255)\n return;\n r.push(Math.floor(a));\n }\n var s = o[1] || o[2] || o[3], l = o[1] && o[2] && o[3];\n if (s && !l)\n return;\n var c = n[4];\n if (c !== void 0) {\n if (c = parseFloat(c), c < 0 || c > 1)\n return;\n r.push(c);\n }\n }\n return r;\n}, te1 = function(t) {\n return ne1[t.toLowerCase()];\n}, re1 = function(t) {\n return (Ve(t) ? t : null) || te1(t) || _01(t) || ee1(t) || $01(t);\n}, ne1 = {\n // special colour names\n transparent: [0, 0, 0, 0],\n // NB alpha === 0\n // regular colours\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n grey: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50]\n}, eO = function(t) {\n for (var r = t.map, n = t.keys, o = n.length, i = 0; i < o; i++) {\n var a = n[i];\n if (Ce(a))\n throw Error("Tried to set map with object key");\n i < n.length - 1 ? (r[a] == null && (r[a] = {}), r = r[a]) : r[a] = t.value;\n }\n}, tO = function(t) {\n for (var r = t.map, n = t.keys, o = n.length, i = 0; i < o; i++) {\n var a = n[i];\n if (Ce(a))\n throw Error("Tried to get map with object key");\n if (r = r[a], r == null)\n return r;\n }\n return r;\n}, hp = et ? et.performance : null, rO = hp && hp.now ? function() {\n return hp.now();\n} : function() {\n return Date.now();\n}, oe1 = function() {\n if (et) {\n if (et.requestAnimationFrame)\n return function(e) {\n et.requestAnimationFrame(e);\n };\n if (et.mozRequestAnimationFrame)\n return function(e) {\n et.mozRequestAnimationFrame(e);\n };\n if (et.webkitRequestAnimationFrame)\n return function(e) {\n et.webkitRequestAnimationFrame(e);\n };\n if (et.msRequestAnimationFrame)\n return function(e) {\n et.msRequestAnimationFrame(e);\n };\n }\n return function(e) {\n e && setTimeout(function() {\n e(rO());\n }, 1e3 / 60);\n };\n}(), jl = function(t) {\n return oe1(t);\n}, Wn = rO, na = 9261, nO = 65599, P3 = 5381, oO = function(t) {\n for (var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : na, n = r, o; o = t.next(), !o.done; )\n n = n * nO + o.value | 0;\n return n;\n}, W4 = function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : na;\n return r * nO + t | 0;\n}, E4 = function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : P3;\n return (r << 5) + r + t | 0;\n}, ie1 = function(t, r) {\n return t * 2097152 + r;\n}, jn = function(t) {\n return t[0] * 2097152 + t[1];\n}, z5 = function(t, r) {\n return [W4(t[0], r[0]), E4(t[1], r[1])];\n}, ae1 = function(t, r) {\n var n = {\n value: 0,\n done: !1\n }, o = 0, i = t.length, a = {\n next: function() {\n return o < i ? n.value = t[o++] : n.done = !0, n;\n }\n };\n return oO(a, r);\n}, fi = function(t, r) {\n var n = {\n value: 0,\n done: !1\n }, o = 0, i = t.length, a = {\n next: function() {\n return o < i ? n.value = t.charCodeAt(o++) : n.done = !0, n;\n }\n };\n return oO(a, r);\n}, iO = function() {\n return se1(arguments);\n}, se1 = function(t) {\n for (var r, n = 0; n < t.length; n++) {\n var o = t[n];\n n === 0 ? r = fi(o) : r = fi(o, r);\n }\n return r;\n}, sh = !0, le1 = console.warn != null, ce1 = console.trace != null, P9 = Number.MAX_SAFE_INTEGER || 9007199254740991, aO = function() {\n return !0;\n}, Kl = function() {\n return !1;\n}, lh = function() {\n return 0;\n}, V9 = function() {\n}, ct = function(t) {\n throw new Error(t);\n}, sO = function(t) {\n if (t !== void 0)\n sh = !!t;\n else\n return sh;\n}, je = function(t) {\n sO() && (le1 ? console.warn(t) : (console.log(t), ce1 && console.trace()));\n}, pe1 = function(t) {\n return K0({}, t);\n}, Fr = function(t) {\n return t == null ? t : Ve(t) ? t.slice() : Ce(t) ? pe1(t) : t;\n}, de1 = function(t) {\n return t.slice();\n}, lO = function(t, r) {\n for (\n // loop :)\n r = t = "";\n // b - result , a - numeric letiable\n t++ < 36;\n //\n r += t * 51 & 52 ? (\n // return a random number or 4\n (t ^ 15 ? (\n // genetate a random number from 0 to 15\n 8 ^ Math.random() * (t ^ 20 ? 16 : 4)\n ) : 4).toString(16)\n ) : "-"\n )\n ;\n return r;\n}, Ae1 = {}, cO = function() {\n return Ae1;\n}, Ut = function(t) {\n var r = Object.keys(t);\n return function(n) {\n for (var o = {}, i = 0; i < r.length; i++) {\n var a = r[i], s = n == null ? void 0 : n[a];\n o[a] = s === void 0 ? t[a] : s;\n }\n return o;\n };\n}, mo = function(t, r, n) {\n for (var o = t.length - 1; o >= 0 && !(t[o] === r && (t.splice(o, 1), n)); o--)\n ;\n}, F9 = function(t) {\n t.splice(0, t.length);\n}, ue1 = function(t, r) {\n for (var n = 0; n < r.length; n++) {\n var o = r[n];\n t.push(o);\n }\n}, hr = function(t, r, n) {\n return n && (r = _C(n, r)), t[r];\n}, to = function(t, r, n, o) {\n n && (r = _C(n, r)), t[r] = o;\n}, be1 = /* @__PURE__ */ function() {\n function e() {\n I9(this, e), this._obj = {};\n }\n return T9(e, [{\n key: "set",\n value: function(r, n) {\n return this._obj[r] = n, this;\n }\n }, {\n key: "delete",\n value: function(r) {\n return this._obj[r] = void 0, this;\n }\n }, {\n key: "clear",\n value: function() {\n this._obj = {};\n }\n }, {\n key: "has",\n value: function(r) {\n return this._obj[r] !== void 0;\n }\n }, {\n key: "get",\n value: function(r) {\n return this._obj[r];\n }\n }]), e;\n}(), Ur = typeof Map < "u" ? Map : be1, he1 = "undefined", Me1 = /* @__PURE__ */ function() {\n function e(t) {\n if (I9(this, e), this._obj = /* @__PURE__ */ Object.create(null), this.size = 0, t != null) {\n var r;\n t.instanceString != null && t.instanceString() === this.instanceString() ? r = t.toArray() : r = t;\n for (var n = 0; n < r.length; n++)\n this.add(r[n]);\n }\n }\n return T9(e, [{\n key: "instanceString",\n value: function() {\n return "set";\n }\n }, {\n key: "add",\n value: function(r) {\n var n = this._obj;\n n[r] !== 1 && (n[r] = 1, this.size++);\n }\n }, {\n key: "delete",\n value: function(r) {\n var n = this._obj;\n n[r] === 1 && (n[r] = 0, this.size--);\n }\n }, {\n key: "clear",\n value: function() {\n this._obj = /* @__PURE__ */ Object.create(null);\n }\n }, {\n key: "has",\n value: function(r) {\n return this._obj[r] === 1;\n }\n }, {\n key: "toArray",\n value: function() {\n var r = this;\n return Object.keys(this._obj).filter(function(n) {\n return r.has(n);\n });\n }\n }, {\n key: "forEach",\n value: function(r, n) {\n return this.toArray().forEach(r, n);\n }\n }]), e;\n}(), Ya = (typeof Set > "u" ? "undefined" : Ot(Set)) !== he1 ? Set : Me1, Tc = function(t, r) {\n var n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : !0;\n if (t === void 0 || r === void 0 || !D9(t)) {\n ct("An element must have a core reference and parameters set");\n return;\n }\n var o = r.group;\n if (o == null && (r.data && r.data.source != null && r.data.target != null ? o = "edges" : o = "nodes"), o !== "nodes" && o !== "edges") {\n ct("An element must be of type `nodes` or `edges`; you specified `" + o + "`");\n return;\n }\n this.length = 1, this[0] = this;\n var i = this._private = {\n cy: t,\n single: !0,\n // indicates this is an element\n data: r.data || {},\n // data object\n position: r.position || {\n x: 0,\n y: 0\n },\n // (x, y) position pair\n autoWidth: void 0,\n // width and height of nodes calculated by the renderer when set to special \'auto\' value\n autoHeight: void 0,\n autoPadding: void 0,\n compoundBoundsClean: !1,\n // whether the compound dimensions need to be recalculated the next time dimensions are read\n listeners: [],\n // array of bound listeners\n group: o,\n // string; \'nodes\' or \'edges\'\n style: {},\n // properties as set by the style\n rstyle: {},\n // properties for style sent from the renderer to the core\n styleCxts: [],\n // applied style contexts from the styler\n styleKeys: {},\n // per-group keys of style property values\n removed: !0,\n // whether it\'s inside the vis; true if removed (set true here since we call restore)\n selected: !!r.selected,\n // whether it\'s selected\n selectable: r.selectable === void 0 ? !0 : !!r.selectable,\n // whether it\'s selectable\n locked: !!r.locked,\n // whether the element is locked (cannot be moved)\n grabbed: !1,\n // whether the element is grabbed by the mouse; renderer sets this privately\n grabbable: r.grabbable === void 0 ? !0 : !!r.grabbable,\n // whether the element can be grabbed\n pannable: r.pannable === void 0 ? o === "edges" : !!r.pannable,\n // whether the element has passthrough panning enabled\n active: !1,\n // whether the element is active from user interaction\n classes: new Ya(),\n // map ( className => true )\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n rscratch: {},\n // object in which the renderer can store information\n scratch: r.scratch || {},\n // scratch objects\n edges: [],\n // array of connected edges\n children: [],\n // array of children\n parent: null,\n // parent ref\n traversalCache: {},\n // cache of output of traversal functions\n backgrounding: !1,\n // whether background images are loading\n bbCache: null,\n // cache of the current bounding box\n bbCacheShift: {\n x: 0,\n y: 0\n },\n // shift applied to cached bb to be applied on next get\n bodyBounds: null,\n // bounds cache of element body, w/o overlay\n overlayBounds: null,\n // bounds cache of element body, including overlay\n labelBounds: {\n // bounds cache of labels\n all: null,\n source: null,\n target: null,\n main: null\n },\n arrowBounds: {\n // bounds cache of edge arrows\n source: null,\n target: null,\n "mid-source": null,\n "mid-target": null\n }\n };\n if (i.position.x == null && (i.position.x = 0), i.position.y == null && (i.position.y = 0), r.renderedPosition) {\n var a = r.renderedPosition, s = t.pan(), l = t.zoom();\n i.position = {\n x: (a.x - s.x) / l,\n y: (a.y - s.y) / l\n };\n }\n var c = [];\n Ve(r.classes) ? c = r.classes : U0(r.classes) && (c = r.classes.split(/\\s+/));\n for (var p = 0, d = c.length; p < d; p++) {\n var u = c[p];\n !u || u === "" || i.classes.add(u);\n }\n this.createEmitter();\n var h = r.style || r.css;\n h && (je("Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead."), this.style(h)), (n === void 0 || n) && this.restore();\n}, ch = function(t) {\n return t = {\n bfs: t.bfs || !t.dfs,\n dfs: t.dfs || !t.bfs\n }, function(n, o, i) {\n var a;\n Ce(n) && !I2(n) && (a = n, n = a.roots || a.root, o = a.visit, i = a.directed), i = arguments.length === 2 && !at(o) ? o : i, o = at(o) ? o : function() {\n };\n for (var s = this._private.cy, l = n = U0(n) ? this.filter(n) : n, c = [], p = [], d = {}, u = {}, h = {}, b = 0, M, C = this.byGroup(), g = C.nodes, f = C.edges, O = 0; O < l.length; O++) {\n var m = l[O], v = m.id();\n m.isNode() && (c.unshift(m), t.bfs && (h[v] = !0, p.push(m)), u[v] = 0);\n }\n var y = function() {\n var L = t.bfs ? c.shift() : c.pop(), w = L.id();\n if (t.dfs) {\n if (h[w])\n return "continue";\n h[w] = !0, p.push(L);\n }\n var q = u[w], S = d[w], B = S != null ? S.source() : null, I = S != null ? S.target() : null, P = S == null ? void 0 : L.same(B) ? I[0] : B[0], k = void 0;\n if (k = o(L, S, P, b++, q), k === !0)\n return M = L, "break";\n if (k === !1)\n return "break";\n for (var K = L.connectedEdges().filter(function(_) {\n return (!i || _.source().same(L)) && f.has(_);\n }), $ = 0; $ < K.length; $++) {\n var j = K[$], r1 = j.connectedNodes().filter(function(_) {\n return !_.same(L) && g.has(_);\n }), a1 = r1.id();\n r1.length !== 0 && !h[a1] && (r1 = r1[0], c.push(r1), t.bfs && (h[a1] = !0, p.push(r1)), d[a1] = j, u[a1] = u[w] + 1);\n }\n };\n e:\n for (; c.length !== 0; ) {\n var z = y();\n switch (z) {\n case "continue":\n continue;\n case "break":\n break e;\n }\n }\n for (var N = s.collection(), W = 0; W < p.length; W++) {\n var T = p[W], x = d[T.id()];\n x != null && N.push(x), N.push(T);\n }\n return {\n path: s.collection(N),\n found: s.collection(M)\n };\n };\n}, S4 = {\n breadthFirstSearch: ch({\n bfs: !0\n }),\n depthFirstSearch: ch({\n dfs: !0\n })\n};\nS4.bfs = S4.breadthFirstSearch;\nS4.dfs = S4.depthFirstSearch;\nvar fe1 = Ut({\n root: null,\n weight: function(t) {\n return 1;\n },\n directed: !1\n}), ge1 = {\n dijkstra: function(t) {\n if (!Ce(t)) {\n var r = arguments;\n t = {\n root: r[0],\n weight: r[1],\n directed: r[2]\n };\n }\n var n = fe1(t), o = n.root, i = n.weight, a = n.directed, s = this, l = i, c = U0(o) ? this.filter(o)[0] : o[0], p = {}, d = {}, u = {}, h = this.byGroup(), b = h.nodes, M = h.edges;\n M.unmergeBy(function(q) {\n return q.isLoop();\n });\n for (var C = function(S) {\n return p[S.id()];\n }, g = function(S, B) {\n p[S.id()] = B, f.updateItem(S);\n }, f = new ps(function(q, S) {\n return C(q) - C(S);\n }), O = 0; O < b.length; O++) {\n var m = b[O];\n p[m.id()] = m.same(c) ? 0 : 1 / 0, f.push(m);\n }\n for (var v = function(S, B) {\n for (var I = (a ? S.edgesTo(B) : S.edgesWith(B)).intersect(M), P = 1 / 0, k, K = 0; K < I.length; K++) {\n var $ = I[K], j = l($);\n (j < P || !k) && (P = j, k = $);\n }\n return {\n edge: k,\n dist: P\n };\n }; f.size() > 0; ) {\n var y = f.pop(), z = C(y), N = y.id();\n if (u[N] = z, z !== 1 / 0)\n for (var W = y.neighborhood().intersect(b), T = 0; T < W.length; T++) {\n var x = W[T], E = x.id(), L = v(y, x), w = z + L.dist;\n w < C(x) && (g(x, w), d[E] = {\n node: y,\n edge: L.edge\n });\n }\n }\n return {\n distanceTo: function(S) {\n var B = U0(S) ? b.filter(S)[0] : S[0];\n return u[B.id()];\n },\n pathTo: function(S) {\n var B = U0(S) ? b.filter(S)[0] : S[0], I = [], P = B, k = P.id();\n if (B.length > 0)\n for (I.unshift(B); d[k]; ) {\n var K = d[k];\n I.unshift(K.edge), I.unshift(K.node), P = K.node, k = P.id();\n }\n return s.spawn(I);\n }\n };\n }\n}, ze1 = {\n // kruskal\'s algorithm (finds min spanning tree, assuming undirected graph)\n // implemented from pseudocode from wikipedia\n kruskal: function(t) {\n t = t || function(O) {\n return 1;\n };\n for (var r = this.byGroup(), n = r.nodes, o = r.edges, i = n.length, a = new Array(i), s = n, l = function(m) {\n for (var v = 0; v < a.length; v++) {\n var y = a[v];\n if (y.has(m))\n return v;\n }\n }, c = 0; c < i; c++)\n a[c] = this.spawn(n[c]);\n for (var p = o.sort(function(O, m) {\n return t(O) - t(m);\n }), d = 0; d < p.length; d++) {\n var u = p[d], h = u.source()[0], b = u.target()[0], M = l(h), C = l(b), g = a[M], f = a[C];\n M !== C && (s.merge(u), g.merge(f), a.splice(C, 1));\n }\n return s;\n }\n}, Ce1 = Ut({\n root: null,\n goal: null,\n weight: function(t) {\n return 1;\n },\n heuristic: function(t) {\n return 0;\n },\n directed: !1\n}), Oe1 = {\n // Implemented from pseudocode from wikipedia\n aStar: function(t) {\n var r = this.cy(), n = Ce1(t), o = n.root, i = n.goal, a = n.heuristic, s = n.directed, l = n.weight;\n o = r.collection(o)[0], i = r.collection(i)[0];\n var c = o.id(), p = i.id(), d = {}, u = {}, h = {}, b = new ps(function(k, K) {\n return u[k.id()] - u[K.id()];\n }), M = new Ya(), C = {}, g = {}, f = function(K, $) {\n b.push(K), M.add($);\n }, O, m, v = function() {\n O = b.pop(), m = O.id(), M.delete(m);\n }, y = function(K) {\n return M.has(K);\n };\n f(o, c), d[c] = 0, u[c] = a(o);\n for (var z = 0; b.size() > 0; ) {\n if (v(), z++, m === p) {\n for (var N = [], W = i, T = p, x = g[T]; N.unshift(W), x != null && N.unshift(x), W = C[T], W != null; )\n T = W.id(), x = g[T];\n return {\n found: !0,\n distance: d[m],\n path: this.spawn(N),\n steps: z\n };\n }\n h[m] = !0;\n for (var E = O._private.edges, L = 0; L < E.length; L++) {\n var w = E[L];\n if (this.hasElementWithId(w.id()) && !(s && w.data("source") !== m)) {\n var q = w.source(), S = w.target(), B = q.id() !== m ? q : S, I = B.id();\n if (this.hasElementWithId(I) && !h[I]) {\n var P = d[m] + l(w);\n if (!y(I)) {\n d[I] = P, u[I] = P + a(B), f(B, I), C[I] = O, g[I] = w;\n continue;\n }\n P < d[I] && (d[I] = P, u[I] = P + a(B), C[I] = O, g[I] = w);\n }\n }\n }\n }\n return {\n found: !1,\n distance: void 0,\n path: void 0,\n steps: z\n };\n }\n}, me1 = Ut({\n weight: function(t) {\n return 1;\n },\n directed: !1\n}), ve1 = {\n // Implemented from pseudocode from wikipedia\n floydWarshall: function(t) {\n for (var r = this.cy(), n = me1(t), o = n.weight, i = n.directed, a = o, s = this.byGroup(), l = s.nodes, c = s.edges, p = l.length, d = p * p, u = function(j) {\n return l.indexOf(j);\n }, h = function(j) {\n return l[j];\n }, b = new Array(d), M = 0; M < d; M++) {\n var C = M % p, g = (M - C) / p;\n g === C ? b[M] = 0 : b[M] = 1 / 0;\n }\n for (var f = new Array(d), O = new Array(d), m = 0; m < c.length; m++) {\n var v = c[m], y = v.source()[0], z = v.target()[0];\n if (y !== z) {\n var N = u(y), W = u(z), T = N * p + W, x = a(v);\n if (b[T] > x && (b[T] = x, f[T] = W, O[T] = v), !i) {\n var E = W * p + N;\n !i && b[E] > x && (b[E] = x, f[E] = N, O[E] = v);\n }\n }\n }\n for (var L = 0; L < p; L++)\n for (var w = 0; w < p; w++)\n for (var q = w * p + L, S = 0; S < p; S++) {\n var B = w * p + S, I = L * p + S;\n b[q] + b[I] < b[B] && (b[B] = b[q] + b[I], f[B] = f[q]);\n }\n var P = function(j) {\n return (U0(j) ? r.filter(j) : j)[0];\n }, k = function(j) {\n return u(P(j));\n }, K = {\n distance: function(j, r1) {\n var a1 = k(j), _ = k(r1);\n return b[a1 * p + _];\n },\n path: function(j, r1) {\n var a1 = k(j), _ = k(r1), Y = h(a1);\n if (a1 === _)\n return Y.collection();\n if (f[a1 * p + _] == null)\n return r.collection();\n var D = r.collection(), H = a1, G;\n for (D.merge(Y); a1 !== _; )\n H = a1, a1 = f[a1 * p + _], G = O[H * p + a1], D.merge(G), D.merge(h(a1));\n return D;\n }\n };\n return K;\n }\n // floydWarshall\n}, ye1 = Ut({\n weight: function(t) {\n return 1;\n },\n directed: !1,\n root: null\n}), Le1 = {\n // Implemented from pseudocode from wikipedia\n bellmanFord: function(t) {\n var r = this, n = ye1(t), o = n.weight, i = n.directed, a = n.root, s = o, l = this, c = this.cy(), p = this.byGroup(), d = p.edges, u = p.nodes, h = u.length, b = new Ur(), M = !1, C = [];\n a = c.collection(a)[0], d.unmergeBy(function(_) {\n return _.isLoop();\n });\n for (var g = d.length, f = function(Y) {\n var D = b.get(Y.id());\n return D || (D = {}, b.set(Y.id(), D)), D;\n }, O = function(Y) {\n return (U0(Y) ? c.$(Y) : Y)[0];\n }, m = function(Y) {\n return f(O(Y)).dist;\n }, v = function(Y) {\n for (var D = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : a, H = O(Y), G = [], J = H; ; ) {\n if (J == null)\n return r.spawn();\n var F = f(J), V = F.edge, Q = F.pred;\n if (G.unshift(J[0]), J.same(D) && G.length > 0)\n break;\n V != null && G.unshift(V), J = Q;\n }\n return l.spawn(G);\n }, y = 0; y < h; y++) {\n var z = u[y], N = f(z);\n z.same(a) ? N.dist = 0 : N.dist = 1 / 0, N.pred = null, N.edge = null;\n }\n for (var W = !1, T = function(Y, D, H, G, J, F) {\n var V = G.dist + F;\n V < J.dist && !H.same(G.edge) && (J.dist = V, J.pred = Y, J.edge = H, W = !0);\n }, x = 1; x < h; x++) {\n W = !1;\n for (var E = 0; E < g; E++) {\n var L = d[E], w = L.source(), q = L.target(), S = s(L), B = f(w), I = f(q);\n T(w, q, L, B, I, S), i || T(q, w, L, I, B, S);\n }\n if (!W)\n break;\n }\n if (W)\n for (var P = 0; P < g; P++) {\n var k = d[P], K = k.source(), $ = k.target(), j = s(k), r1 = f(K).dist, a1 = f($).dist;\n if (r1 + j < a1 || !i && a1 + j < r1) {\n je("Graph contains a negative weight cycle for Bellman-Ford"), M = !0;\n break;\n }\n }\n return {\n distanceTo: m,\n pathTo: v,\n hasNegativeWeightCycle: M,\n negativeWeightCycles: C\n };\n }\n // bellmanFord\n}, we1 = Math.sqrt(2), qe1 = function(t, r, n) {\n n.length === 0 && ct("Karger-Stein must be run on a connected (sub)graph");\n for (var o = n[t], i = o[1], a = o[2], s = r[i], l = r[a], c = n, p = c.length - 1; p >= 0; p--) {\n var d = c[p], u = d[1], h = d[2];\n (r[u] === s && r[h] === l || r[u] === l && r[h] === s) && c.splice(p, 1);\n }\n for (var b = 0; b < c.length; b++) {\n var M = c[b];\n M[1] === l ? (c[b] = M.slice(), c[b][1] = s) : M[2] === l && (c[b] = M.slice(), c[b][2] = s);\n }\n for (var C = 0; C < r.length; C++)\n r[C] === l && (r[C] = s);\n return c;\n}, Mp = function(t, r, n, o) {\n for (; n > o; ) {\n var i = Math.floor(Math.random() * r.length);\n r = qe1(i, t, r), n--;\n }\n return r;\n}, xe1 = {\n // Computes the minimum cut of an undirected graph\n // Returns the correct answer with high probability\n kargerStein: function() {\n var t = this, r = this.byGroup(), n = r.nodes, o = r.edges;\n o.unmergeBy(function(I) {\n return I.isLoop();\n });\n var i = n.length, a = o.length, s = Math.ceil(Math.pow(Math.log(i) / Math.LN2, 2)), l = Math.floor(i / we1);\n if (i < 2) {\n ct("At least 2 nodes are required for Karger-Stein algorithm");\n return;\n }\n for (var c = [], p = 0; p < a; p++) {\n var d = o[p];\n c.push([p, n.indexOf(d.source()), n.indexOf(d.target())]);\n }\n for (var u = 1 / 0, h = [], b = new Array(i), M = new Array(i), C = new Array(i), g = function(P, k) {\n for (var K = 0; K < i; K++)\n k[K] = P[K];\n }, f = 0; f <= s; f++) {\n for (var O = 0; O < i; O++)\n M[O] = O;\n var m = Mp(M, c.slice(), i, l), v = m.slice();\n g(M, C);\n var y = Mp(M, m, l, 2), z = Mp(C, v, l, 2);\n y.length <= z.length && y.length < u ? (u = y.length, h = y, g(M, b)) : z.length <= y.length && z.length < u && (u = z.length, h = z, g(C, b));\n }\n for (var N = this.spawn(h.map(function(I) {\n return o[I[0]];\n })), W = this.spawn(), T = this.spawn(), x = b[0], E = 0; E < b.length; E++) {\n var L = b[E], w = n[E];\n L === x ? W.merge(w) : T.merge(w);\n }\n var q = function(P) {\n var k = t.spawn();\n return P.forEach(function(K) {\n k.merge(K), K.connectedEdges().forEach(function($) {\n t.contains($) && !N.contains($) && k.merge($);\n });\n }), k;\n }, S = [q(W), q(T)], B = {\n cut: N,\n components: S,\n // n.b. partitions are included to be compatible with the old api spec\n // (could be removed in a future major version)\n partition1: W,\n partition2: T\n };\n return B;\n }\n}, Re1 = function(t) {\n return {\n x: t.x,\n y: t.y\n };\n}, Dc = function(t, r, n) {\n return {\n x: t.x * r + n.x,\n y: t.y * r + n.y\n };\n}, pO = function(t, r, n) {\n return {\n x: (t.x - n.x) / r,\n y: (t.y - n.y) / r\n };\n}, oa = function(t) {\n return {\n x: t[0],\n y: t[1]\n };\n}, Be1 = function(t) {\n for (var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : t.length, o = 1 / 0, i = r; i < n; i++) {\n var a = t[i];\n isFinite(a) && (o = Math.min(a, o));\n }\n return o;\n}, We1 = function(t) {\n for (var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : t.length, o = -1 / 0, i = r; i < n; i++) {\n var a = t[i];\n isFinite(a) && (o = Math.max(a, o));\n }\n return o;\n}, Ee1 = function(t) {\n for (var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : t.length, o = 0, i = 0, a = r; a < n; a++) {\n var s = t[a];\n isFinite(s) && (o += s, i++);\n }\n return o / i;\n}, Se1 = function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : t.length, o = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : !0, i = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : !0, a = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : !0;\n o ? t = t.slice(r, n) : (n < t.length && t.splice(n, t.length - n), r > 0 && t.splice(0, r));\n for (var s = 0, l = t.length - 1; l >= 0; l--) {\n var c = t[l];\n a ? isFinite(c) || (t[l] = -1 / 0, s++) : t.splice(l, 1);\n }\n i && t.sort(function(u, h) {\n return u - h;\n });\n var p = t.length, d = Math.floor(p / 2);\n return p % 2 !== 0 ? t[d + 1 + s] : (t[d - 1 + s] + t[d + s]) / 2;\n}, ke1 = function(t) {\n return Math.PI * t / 180;\n}, C5 = function(t, r) {\n return Math.atan2(r, t) - Math.PI / 2;\n}, U9 = Math.log2 || function(e) {\n return Math.log(e) / Math.log(2);\n}, dO = function(t) {\n return t > 0 ? 1 : t < 0 ? -1 : 0;\n}, gi = function(t, r) {\n return Math.sqrt($o(t, r));\n}, $o = function(t, r) {\n var n = r.x - t.x, o = r.y - t.y;\n return n * n + o * o;\n}, Ne1 = function(t) {\n for (var r = t.length, n = 0, o = 0; o < r; o++)\n n += t[o];\n for (var i = 0; i < r; i++)\n t[i] = t[i] / n;\n return t;\n}, qt = function(t, r, n, o) {\n return (1 - o) * (1 - o) * t + 2 * (1 - o) * o * r + o * o * n;\n}, pa = function(t, r, n, o) {\n return {\n x: qt(t.x, r.x, n.x, o),\n y: qt(t.y, r.y, n.y, o)\n };\n}, Ie1 = function(t, r, n, o) {\n var i = {\n x: r.x - t.x,\n y: r.y - t.y\n }, a = gi(t, r), s = {\n x: i.x / a,\n y: i.y / a\n };\n return n = n ?? 0, o = o ?? n * a, {\n x: t.x + s.x * o,\n y: t.y + s.y * o\n };\n}, k4 = function(t, r, n) {\n return Math.max(t, Math.min(n, r));\n}, w2 = function(t) {\n if (t == null)\n return {\n x1: 1 / 0,\n y1: 1 / 0,\n x2: -1 / 0,\n y2: -1 / 0,\n w: 0,\n h: 0\n };\n if (t.x1 != null && t.y1 != null) {\n if (t.x2 != null && t.y2 != null && t.x2 >= t.x1 && t.y2 >= t.y1)\n return {\n x1: t.x1,\n y1: t.y1,\n x2: t.x2,\n y2: t.y2,\n w: t.x2 - t.x1,\n h: t.y2 - t.y1\n };\n if (t.w != null && t.h != null && t.w >= 0 && t.h >= 0)\n return {\n x1: t.x1,\n y1: t.y1,\n x2: t.x1 + t.w,\n y2: t.y1 + t.h,\n w: t.w,\n h: t.h\n };\n }\n}, Te1 = function(t) {\n return {\n x1: t.x1,\n x2: t.x2,\n w: t.w,\n y1: t.y1,\n y2: t.y2,\n h: t.h\n };\n}, De1 = function(t) {\n t.x1 = 1 / 0, t.y1 = 1 / 0, t.x2 = -1 / 0, t.y2 = -1 / 0, t.w = 0, t.h = 0;\n}, He1 = function(t, r) {\n t.x1 = Math.min(t.x1, r.x1), t.x2 = Math.max(t.x2, r.x2), t.w = t.x2 - t.x1, t.y1 = Math.min(t.y1, r.y1), t.y2 = Math.max(t.y2, r.y2), t.h = t.y2 - t.y1;\n}, Pe1 = function(t, r, n) {\n t.x1 = Math.min(t.x1, r), t.x2 = Math.max(t.x2, r), t.w = t.x2 - t.x1, t.y1 = Math.min(t.y1, n), t.y2 = Math.max(t.y2, n), t.h = t.y2 - t.y1;\n}, tl = function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;\n return t.x1 -= r, t.x2 += r, t.y1 -= r, t.y2 += r, t.w = t.x2 - t.x1, t.h = t.y2 - t.y1, t;\n}, fp = function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [0], n, o, i, a;\n if (r.length === 1)\n n = o = i = a = r[0];\n else if (r.length === 2)\n n = i = r[0], a = o = r[1];\n else if (r.length === 4) {\n var s = un(r, 4);\n n = s[0], o = s[1], i = s[2], a = s[3];\n }\n return t.x1 -= a, t.x2 += o, t.y1 -= n, t.y2 += i, t.w = t.x2 - t.x1, t.h = t.y2 - t.y1, t;\n}, ph = function(t, r) {\n t.x1 = r.x1, t.y1 = r.y1, t.x2 = r.x2, t.y2 = r.y2, t.w = t.x2 - t.x1, t.h = t.y2 - t.y1;\n}, Y9 = function(t, r) {\n return !(t.x1 > r.x2 || r.x1 > t.x2 || t.x2 < r.x1 || r.x2 < t.x1 || t.y2 < r.y1 || r.y2 < t.y1 || t.y1 > r.y2 || r.y1 > t.y2);\n}, Wa = function(t, r, n) {\n return t.x1 <= r && r <= t.x2 && t.y1 <= n && n <= t.y2;\n}, Ve1 = function(t, r) {\n return Wa(t, r.x, r.y);\n}, AO = function(t, r) {\n return Wa(t, r.x1, r.y1) && Wa(t, r.x2, r.y2);\n}, uO = function(t, r, n, o, i, a, s) {\n var l = us(i, a), c = i / 2, p = a / 2, d;\n {\n var u = n - c + l - s, h = o - p - s, b = n + c - l + s, M = h;\n if (d = io(t, r, n, o, u, h, b, M, !1), d.length > 0)\n return d;\n }\n {\n var C = n + c + s, g = o - p + l - s, f = C, O = o + p - l + s;\n if (d = io(t, r, n, o, C, g, f, O, !1), d.length > 0)\n return d;\n }\n {\n var m = n - c + l - s, v = o + p + s, y = n + c - l + s, z = v;\n if (d = io(t, r, n, o, m, v, y, z, !1), d.length > 0)\n return d;\n }\n {\n var N = n - c - s, W = o - p + l - s, T = N, x = o + p - l + s;\n if (d = io(t, r, n, o, N, W, T, x, !1), d.length > 0)\n return d;\n }\n var E;\n {\n var L = n - c + l, w = o - p + l;\n if (E = V3(t, r, n, o, L, w, l + s), E.length > 0 && E[0] <= L && E[1] <= w)\n return [E[0], E[1]];\n }\n {\n var q = n + c - l, S = o - p + l;\n if (E = V3(t, r, n, o, q, S, l + s), E.length > 0 && E[0] >= q && E[1] <= S)\n return [E[0], E[1]];\n }\n {\n var B = n + c - l, I = o + p - l;\n if (E = V3(t, r, n, o, B, I, l + s), E.length > 0 && E[0] >= B && E[1] >= I)\n return [E[0], E[1]];\n }\n {\n var P = n - c + l, k = o + p - l;\n if (E = V3(t, r, n, o, P, k, l + s), E.length > 0 && E[0] <= P && E[1] >= k)\n return [E[0], E[1]];\n }\n return [];\n}, Fe1 = function(t, r, n, o, i, a, s) {\n var l = s, c = Math.min(n, i), p = Math.max(n, i), d = Math.min(o, a), u = Math.max(o, a);\n return c - l <= t && t <= p + l && d - l <= r && r <= u + l;\n}, Ue1 = function(t, r, n, o, i, a, s, l, c) {\n var p = {\n x1: Math.min(n, s, i) - c,\n x2: Math.max(n, s, i) + c,\n y1: Math.min(o, l, a) - c,\n y2: Math.max(o, l, a) + c\n };\n return !(t < p.x1 || t > p.x2 || r < p.y1 || r > p.y2);\n}, Ye1 = function(t, r, n, o) {\n n -= o;\n var i = r * r - 4 * t * n;\n if (i < 0)\n return [];\n var a = Math.sqrt(i), s = 2 * t, l = (-r + a) / s, c = (-r - a) / s;\n return [l, c];\n}, Xe1 = function(t, r, n, o, i) {\n var a = 1e-5;\n t === 0 && (t = a), r /= t, n /= t, o /= t;\n var s, l, c, p, d, u, h, b;\n if (l = (3 * n - r * r) / 9, c = -(27 * o) + r * (9 * n - 2 * (r * r)), c /= 54, s = l * l * l + c * c, i[1] = 0, h = r / 3, s > 0) {\n d = c + Math.sqrt(s), d = d < 0 ? -Math.pow(-d, 1 / 3) : Math.pow(d, 1 / 3), u = c - Math.sqrt(s), u = u < 0 ? -Math.pow(-u, 1 / 3) : Math.pow(u, 1 / 3), i[0] = -h + d + u, h += (d + u) / 2, i[4] = i[2] = -h, h = Math.sqrt(3) * (-u + d) / 2, i[3] = h, i[5] = -h;\n return;\n }\n if (i[5] = i[3] = 0, s === 0) {\n b = c < 0 ? -Math.pow(-c, 1 / 3) : Math.pow(c, 1 / 3), i[0] = -h + 2 * b, i[4] = i[2] = -(b + h);\n return;\n }\n l = -l, p = l * l * l, p = Math.acos(c / Math.sqrt(p)), b = 2 * Math.sqrt(l), i[0] = -h + b * Math.cos(p / 3), i[2] = -h + b * Math.cos((p + 2 * Math.PI) / 3), i[4] = -h + b * Math.cos((p + 4 * Math.PI) / 3);\n}, Qe1 = function(t, r, n, o, i, a, s, l) {\n var c = 1 * n * n - 4 * n * i + 2 * n * s + 4 * i * i - 4 * i * s + s * s + o * o - 4 * o * a + 2 * o * l + 4 * a * a - 4 * a * l + l * l, p = 1 * 9 * n * i - 3 * n * n - 3 * n * s - 6 * i * i + 3 * i * s + 9 * o * a - 3 * o * o - 3 * o * l - 6 * a * a + 3 * a * l, d = 1 * 3 * n * n - 6 * n * i + n * s - n * t + 2 * i * i + 2 * i * t - s * t + 3 * o * o - 6 * o * a + o * l - o * r + 2 * a * a + 2 * a * r - l * r, u = 1 * n * i - n * n + n * t - i * t + o * a - o * o + o * r - a * r, h = [];\n Xe1(c, p, d, u, h);\n for (var b = 1e-7, M = [], C = 0; C < 6; C += 2)\n Math.abs(h[C + 1]) < b && h[C] >= 0 && h[C] <= 1 && M.push(h[C]);\n M.push(1), M.push(0);\n for (var g = -1, f, O, m, v = 0; v < M.length; v++)\n f = Math.pow(1 - M[v], 2) * n + 2 * (1 - M[v]) * M[v] * i + M[v] * M[v] * s, O = Math.pow(1 - M[v], 2) * o + 2 * (1 - M[v]) * M[v] * a + M[v] * M[v] * l, m = Math.pow(f - t, 2) + Math.pow(O - r, 2), g >= 0 ? m < g && (g = m) : g = m;\n return g;\n}, Ge1 = function(t, r, n, o, i, a) {\n var s = [t - n, r - o], l = [i - n, a - o], c = l[0] * l[0] + l[1] * l[1], p = s[0] * s[0] + s[1] * s[1], d = s[0] * l[0] + s[1] * l[1], u = d * d / c;\n return d < 0 ? p : u > c ? (t - i) * (t - i) + (r - a) * (r - a) : p - u;\n}, g2 = function(t, r, n) {\n for (var o, i, a, s, l, c = 0, p = 0; p < n.length / 2; p++)\n if (o = n[p * 2], i = n[p * 2 + 1], p + 1 < n.length / 2 ? (a = n[(p + 1) * 2], s = n[(p + 1) * 2 + 1]) : (a = n[(p + 1 - n.length / 2) * 2], s = n[(p + 1 - n.length / 2) * 2 + 1]), !(o == t && a == t))\n if (o >= t && t >= a || o <= t && t <= a)\n l = (t - o) / (a - o) * (s - i) + i, l > r && c++;\n else\n continue;\n return c % 2 !== 0;\n}, En = function(t, r, n, o, i, a, s, l, c) {\n var p = new Array(n.length), d;\n l[0] != null ? (d = Math.atan(l[1] / l[0]), l[0] < 0 ? d = d + Math.PI / 2 : d = -d - Math.PI / 2) : d = l;\n for (var u = Math.cos(-d), h = Math.sin(-d), b = 0; b < p.length / 2; b++)\n p[b * 2] = a / 2 * (n[b * 2] * u - n[b * 2 + 1] * h), p[b * 2 + 1] = s / 2 * (n[b * 2 + 1] * u + n[b * 2] * h), p[b * 2] += o, p[b * 2 + 1] += i;\n var M;\n if (c > 0) {\n var C = hO(p, -c);\n M = bO(C);\n } else\n M = p;\n return g2(t, r, M);\n}, je1 = function(t, r, n, o, i, a, s) {\n for (var l = new Array(n.length), c = a / 2, p = s / 2, d = X9(a, s), u = d * d, h = 0; h < n.length / 4; h++) {\n var b = void 0, M = void 0;\n h === 0 ? b = n.length - 2 : b = h * 4 - 2, M = h * 4 + 2;\n var C = o + c * n[h * 4], g = i + p * n[h * 4 + 1], f = -n[b] * n[M] - n[b + 1] * n[M + 1], O = d / Math.tan(Math.acos(f) / 2), m = C - O * n[b], v = g - O * n[b + 1], y = C + O * n[M], z = g + O * n[M + 1];\n l[h * 4] = m, l[h * 4 + 1] = v, l[h * 4 + 2] = y, l[h * 4 + 3] = z;\n var N = n[b + 1], W = -n[b], T = N * n[M] + W * n[M + 1];\n T < 0 && (N *= -1, W *= -1);\n var x = m + N * d, E = v + W * d, L = Math.pow(x - t, 2) + Math.pow(E - r, 2);\n if (L <= u)\n return !0;\n }\n return g2(t, r, l);\n}, bO = function(t) {\n for (var r = new Array(t.length / 2), n, o, i, a, s, l, c, p, d = 0; d < t.length / 4; d++) {\n n = t[d * 4], o = t[d * 4 + 1], i = t[d * 4 + 2], a = t[d * 4 + 3], d < t.length / 4 - 1 ? (s = t[(d + 1) * 4], l = t[(d + 1) * 4 + 1], c = t[(d + 1) * 4 + 2], p = t[(d + 1) * 4 + 3]) : (s = t[0], l = t[1], c = t[2], p = t[3]);\n var u = io(n, o, i, a, s, l, c, p, !0);\n r[d * 2] = u[0], r[d * 2 + 1] = u[1];\n }\n return r;\n}, hO = function(t, r) {\n for (var n = new Array(t.length * 2), o, i, a, s, l = 0; l < t.length / 2; l++) {\n o = t[l * 2], i = t[l * 2 + 1], l < t.length / 2 - 1 ? (a = t[(l + 1) * 2], s = t[(l + 1) * 2 + 1]) : (a = t[0], s = t[1]);\n var c = s - i, p = -(a - o), d = Math.sqrt(c * c + p * p), u = c / d, h = p / d;\n n[l * 4] = o + u * r, n[l * 4 + 1] = i + h * r, n[l * 4 + 2] = a + u * r, n[l * 4 + 3] = s + h * r;\n }\n return n;\n}, Ke1 = function(t, r, n, o, i, a) {\n var s = n - t, l = o - r;\n s /= i, l /= a;\n var c = Math.sqrt(s * s + l * l), p = c - 1;\n if (p < 0)\n return [];\n var d = p / c;\n return [(n - t) * d + t, (o - r) * d + r];\n}, ii = function(t, r, n, o, i, a, s) {\n return t -= i, r -= a, t /= n / 2 + s, r /= o / 2 + s, t * t + r * r <= 1;\n}, V3 = function(t, r, n, o, i, a, s) {\n var l = [n - t, o - r], c = [t - i, r - a], p = l[0] * l[0] + l[1] * l[1], d = 2 * (c[0] * l[0] + c[1] * l[1]), u = c[0] * c[0] + c[1] * c[1] - s * s, h = d * d - 4 * p * u;\n if (h < 0)\n return [];\n var b = (-d + Math.sqrt(h)) / (2 * p), M = (-d - Math.sqrt(h)) / (2 * p), C = Math.min(b, M), g = Math.max(b, M), f = [];\n if (C >= 0 && C <= 1 && f.push(C), g >= 0 && g <= 1 && f.push(g), f.length === 0)\n return [];\n var O = f[0] * l[0] + t, m = f[0] * l[1] + r;\n if (f.length > 1) {\n if (f[0] == f[1])\n return [O, m];\n var v = f[1] * l[0] + t, y = f[1] * l[1] + r;\n return [O, m, v, y];\n } else\n return [O, m];\n}, gp = function(t, r, n) {\n return r <= t && t <= n || n <= t && t <= r ? t : t <= r && r <= n || n <= r && r <= t ? r : n;\n}, io = function(t, r, n, o, i, a, s, l, c) {\n var p = t - i, d = n - t, u = s - i, h = r - a, b = o - r, M = l - a, C = u * h - M * p, g = d * h - b * p, f = M * d - u * b;\n if (f !== 0) {\n var O = C / f, m = g / f, v = 1e-3, y = 0 - v, z = 1 + v;\n return y <= O && O <= z && y <= m && m <= z ? [t + O * d, r + O * b] : c ? [t + O * d, r + O * b] : [];\n } else\n return C === 0 || g === 0 ? gp(t, n, s) === s ? [s, l] : gp(t, n, i) === i ? [i, a] : gp(i, s, n) === n ? [n, o] : [] : [];\n}, N4 = function(t, r, n, o, i, a, s, l) {\n var c = [], p, d = new Array(n.length), u = !0;\n a == null && (u = !1);\n var h;\n if (u) {\n for (var b = 0; b < d.length / 2; b++)\n d[b * 2] = n[b * 2] * a + o, d[b * 2 + 1] = n[b * 2 + 1] * s + i;\n if (l > 0) {\n var M = hO(d, -l);\n h = bO(M);\n } else\n h = d;\n } else\n h = n;\n for (var C, g, f, O, m = 0; m < h.length / 2; m++)\n C = h[m * 2], g = h[m * 2 + 1], m < h.length / 2 - 1 ? (f = h[(m + 1) * 2], O = h[(m + 1) * 2 + 1]) : (f = h[0], O = h[1]), p = io(t, r, o, i, C, g, f, O), p.length !== 0 && c.push(p[0], p[1]);\n return c;\n}, Ze1 = function(t, r, n, o, i, a, s, l) {\n for (var c = [], p, d = new Array(n.length), u = a / 2, h = s / 2, b = X9(a, s), M = 0; M < n.length / 4; M++) {\n var C = void 0, g = void 0;\n M === 0 ? C = n.length - 2 : C = M * 4 - 2, g = M * 4 + 2;\n var f = o + u * n[M * 4], O = i + h * n[M * 4 + 1], m = -n[C] * n[g] - n[C + 1] * n[g + 1], v = b / Math.tan(Math.acos(m) / 2), y = f - v * n[C], z = O - v * n[C + 1], N = f + v * n[g], W = O + v * n[g + 1];\n M === 0 ? (d[n.length - 2] = y, d[n.length - 1] = z) : (d[M * 4 - 2] = y, d[M * 4 - 1] = z), d[M * 4] = N, d[M * 4 + 1] = W;\n var T = n[C + 1], x = -n[C], E = T * n[g] + x * n[g + 1];\n E < 0 && (T *= -1, x *= -1);\n var L = y + T * b, w = z + x * b;\n p = V3(t, r, o, i, L, w, b), p.length !== 0 && c.push(p[0], p[1]);\n }\n for (var q = 0; q < d.length / 4; q++)\n p = io(t, r, o, i, d[q * 4], d[q * 4 + 1], d[q * 4 + 2], d[q * 4 + 3], !1), p.length !== 0 && c.push(p[0], p[1]);\n if (c.length > 2) {\n for (var S = [c[0], c[1]], B = Math.pow(S[0] - t, 2) + Math.pow(S[1] - r, 2), I = 1; I < c.length / 2; I++) {\n var P = Math.pow(c[I * 2] - t, 2) + Math.pow(c[I * 2 + 1] - r, 2);\n P <= B && (S[0] = c[I * 2], S[1] = c[I * 2 + 1], B = P);\n }\n return S;\n }\n return c;\n}, O5 = function(t, r, n) {\n var o = [t[0] - r[0], t[1] - r[1]], i = Math.sqrt(o[0] * o[0] + o[1] * o[1]), a = (i - n) / i;\n return a < 0 && (a = 1e-5), [r[0] + a * o[0], r[1] + a * o[1]];\n}, n2 = function(t, r) {\n var n = V8(t, r);\n return n = MO(n), n;\n}, MO = function(t) {\n for (var r, n, o = t.length / 2, i = 1 / 0, a = 1 / 0, s = -1 / 0, l = -1 / 0, c = 0; c < o; c++)\n r = t[2 * c], n = t[2 * c + 1], i = Math.min(i, r), s = Math.max(s, r), a = Math.min(a, n), l = Math.max(l, n);\n for (var p = 2 / (s - i), d = 2 / (l - a), u = 0; u < o; u++)\n r = t[2 * u] = t[2 * u] * p, n = t[2 * u + 1] = t[2 * u + 1] * d, i = Math.min(i, r), s = Math.max(s, r), a = Math.min(a, n), l = Math.max(l, n);\n if (a < -1)\n for (var h = 0; h < o; h++)\n n = t[2 * h + 1] = t[2 * h + 1] + (-1 - a);\n return t;\n}, V8 = function(t, r) {\n var n = 1 / t * 2 * Math.PI, o = t % 2 === 0 ? Math.PI / 2 + n / 2 : Math.PI / 2;\n o += r;\n for (var i = new Array(t * 2), a, s = 0; s < t; s++)\n a = s * n + o, i[2 * s] = Math.cos(a), i[2 * s + 1] = Math.sin(-a);\n return i;\n}, us = function(t, r) {\n return Math.min(t / 4, r / 4, 8);\n}, X9 = function(t, r) {\n return Math.min(t / 10, r / 10, 8);\n}, fO = function() {\n return 8;\n}, Je1 = function(t, r, n) {\n return [t - 2 * r + n, 2 * (r - t), t];\n}, F8 = function(t, r) {\n return {\n heightOffset: Math.min(15, 0.05 * r),\n widthOffset: Math.min(100, 0.25 * t),\n ctrlPtOffsetPct: 0.05\n };\n}, _e1 = Ut({\n dampingFactor: 0.8,\n precision: 1e-6,\n iterations: 200,\n weight: function(t) {\n return 1;\n }\n}), $e1 = {\n pageRank: function(t) {\n for (var r = _e1(t), n = r.dampingFactor, o = r.precision, i = r.iterations, a = r.weight, s = this._private.cy, l = this.byGroup(), c = l.nodes, p = l.edges, d = c.length, u = d * d, h = p.length, b = new Array(u), M = new Array(d), C = (1 - n) / d, g = 0; g < d; g++) {\n for (var f = 0; f < d; f++) {\n var O = g * d + f;\n b[O] = 0;\n }\n M[g] = 0;\n }\n for (var m = 0; m < h; m++) {\n var v = p[m], y = v.data("source"), z = v.data("target");\n if (y !== z) {\n var N = c.indexOfId(y), W = c.indexOfId(z), T = a(v), x = W * d + N;\n b[x] += T, M[N] += T;\n }\n }\n for (var E = 1 / d + C, L = 0; L < d; L++)\n if (M[L] === 0)\n for (var w = 0; w < d; w++) {\n var q = w * d + L;\n b[q] = E;\n }\n else\n for (var S = 0; S < d; S++) {\n var B = S * d + L;\n b[B] = b[B] / M[L] + C;\n }\n for (var I = new Array(d), P = new Array(d), k, K = 0; K < d; K++)\n I[K] = 1;\n for (var $ = 0; $ < i; $++) {\n for (var j = 0; j < d; j++)\n P[j] = 0;\n for (var r1 = 0; r1 < d; r1++)\n for (var a1 = 0; a1 < d; a1++) {\n var _ = r1 * d + a1;\n P[r1] += b[_] * I[a1];\n }\n Ne1(P), k = I, I = P, P = k;\n for (var Y = 0, D = 0; D < d; D++) {\n var H = k[D] - I[D];\n Y += H * H;\n }\n if (Y < o)\n break;\n }\n var G = {\n rank: function(F) {\n return F = s.collection(F)[0], I[c.indexOf(F)];\n }\n };\n return G;\n }\n // pageRank\n}, dh = Ut({\n root: null,\n weight: function(t) {\n return 1;\n },\n directed: !1,\n alpha: 0\n}), da = {\n degreeCentralityNormalized: function(t) {\n t = dh(t);\n var r = this.cy(), n = this.nodes(), o = n.length;\n if (t.directed) {\n for (var p = {}, d = {}, u = 0, h = 0, b = 0; b < o; b++) {\n var M = n[b], C = M.id();\n t.root = M;\n var g = this.degreeCentrality(t);\n u < g.indegree && (u = g.indegree), h < g.outdegree && (h = g.outdegree), p[C] = g.indegree, d[C] = g.outdegree;\n }\n return {\n indegree: function(O) {\n return u == 0 ? 0 : (U0(O) && (O = r.filter(O)), p[O.id()] / u);\n },\n outdegree: function(O) {\n return h === 0 ? 0 : (U0(O) && (O = r.filter(O)), d[O.id()] / h);\n }\n };\n } else {\n for (var i = {}, a = 0, s = 0; s < o; s++) {\n var l = n[s];\n t.root = l;\n var c = this.degreeCentrality(t);\n a < c.degree && (a = c.degree), i[l.id()] = c.degree;\n }\n return {\n degree: function(O) {\n return a === 0 ? 0 : (U0(O) && (O = r.filter(O)), i[O.id()] / a);\n }\n };\n }\n },\n // degreeCentralityNormalized\n // Implemented from the algorithm in Opsahl\'s paper\n // "Node centrality in weighted networks: Generalizing degree and shortest paths"\n // check the heading 2 "Degree"\n degreeCentrality: function(t) {\n t = dh(t);\n var r = this.cy(), n = this, o = t, i = o.root, a = o.weight, s = o.directed, l = o.alpha;\n if (i = r.collection(i)[0], s) {\n for (var h = i.connectedEdges(), b = h.filter(function(y) {\n return y.target().same(i) && n.has(y);\n }), M = h.filter(function(y) {\n return y.source().same(i) && n.has(y);\n }), C = b.length, g = M.length, f = 0, O = 0, m = 0; m < b.length; m++)\n f += a(b[m]);\n for (var v = 0; v < M.length; v++)\n O += a(M[v]);\n return {\n indegree: Math.pow(C, 1 - l) * Math.pow(f, l),\n outdegree: Math.pow(g, 1 - l) * Math.pow(O, l)\n };\n } else {\n for (var c = i.connectedEdges().intersection(n), p = c.length, d = 0, u = 0; u < c.length; u++)\n d += a(c[u]);\n return {\n degree: Math.pow(p, 1 - l) * Math.pow(d, l)\n };\n }\n }\n // degreeCentrality\n};\nda.dc = da.degreeCentrality;\nda.dcn = da.degreeCentralityNormalised = da.degreeCentralityNormalized;\nvar Ah = Ut({\n harmonic: !0,\n weight: function() {\n return 1;\n },\n directed: !1,\n root: null\n}), Aa = {\n closenessCentralityNormalized: function(t) {\n for (var r = Ah(t), n = r.harmonic, o = r.weight, i = r.directed, a = this.cy(), s = {}, l = 0, c = this.nodes(), p = this.floydWarshall({\n weight: o,\n directed: i\n }), d = 0; d < c.length; d++) {\n for (var u = 0, h = c[d], b = 0; b < c.length; b++)\n if (d !== b) {\n var M = p.distance(h, c[b]);\n n ? u += 1 / M : u += M;\n }\n n || (u = 1 / u), l < u && (l = u), s[h.id()] = u;\n }\n return {\n closeness: function(g) {\n return l == 0 ? 0 : (U0(g) ? g = a.filter(g)[0].id() : g = g.id(), s[g] / l);\n }\n };\n },\n // Implemented from pseudocode from wikipedia\n closenessCentrality: function(t) {\n var r = Ah(t), n = r.root, o = r.weight, i = r.directed, a = r.harmonic;\n n = this.filter(n)[0];\n for (var s = this.dijkstra({\n root: n,\n weight: o,\n directed: i\n }), l = 0, c = this.nodes(), p = 0; p < c.length; p++) {\n var d = c[p];\n if (!d.same(n)) {\n var u = s.distanceTo(d);\n a ? l += 1 / u : l += u;\n }\n }\n return a ? l : 1 / l;\n }\n // closenessCentrality\n};\nAa.cc = Aa.closenessCentrality;\nAa.ccn = Aa.closenessCentralityNormalised = Aa.closenessCentralityNormalized;\nvar et1 = Ut({\n weight: null,\n directed: !1\n}), U8 = {\n // Implemented from the algorithm in the paper "On Variants of Shortest-Path Betweenness Centrality and their Generic Computation" by Ulrik Brandes\n betweennessCentrality: function(t) {\n for (var r = et1(t), n = r.directed, o = r.weight, i = o != null, a = this.cy(), s = this.nodes(), l = {}, c = {}, p = 0, d = {\n set: function(O, m) {\n c[O] = m, m > p && (p = m);\n },\n get: function(O) {\n return c[O];\n }\n }, u = 0; u < s.length; u++) {\n var h = s[u], b = h.id();\n n ? l[b] = h.outgoers().nodes() : l[b] = h.openNeighborhood().nodes(), d.set(b, 0);\n }\n for (var M = function(O) {\n for (var m = s[O].id(), v = [], y = {}, z = {}, N = {}, W = new ps(function(a1, _) {\n return N[a1] - N[_];\n }), T = 0; T < s.length; T++) {\n var x = s[T].id();\n y[x] = [], z[x] = 0, N[x] = 1 / 0;\n }\n for (z[m] = 1, N[m] = 0, W.push(m); !W.empty(); ) {\n var E = W.pop();\n if (v.push(E), i)\n for (var L = 0; L < l[E].length; L++) {\n var w = l[E][L], q = a.getElementById(E), S = void 0;\n q.edgesTo(w).length > 0 ? S = q.edgesTo(w)[0] : S = w.edgesTo(q)[0];\n var B = o(S);\n w = w.id(), N[w] > N[E] + B && (N[w] = N[E] + B, W.nodes.indexOf(w) < 0 ? W.push(w) : W.updateItem(w), z[w] = 0, y[w] = []), N[w] == N[E] + B && (z[w] = z[w] + z[E], y[w].push(E));\n }\n else\n for (var I = 0; I < l[E].length; I++) {\n var P = l[E][I].id();\n N[P] == 1 / 0 && (W.push(P), N[P] = N[E] + 1), N[P] == N[E] + 1 && (z[P] = z[P] + z[E], y[P].push(E));\n }\n }\n for (var k = {}, K = 0; K < s.length; K++)\n k[s[K].id()] = 0;\n for (; v.length > 0; ) {\n for (var $ = v.pop(), j = 0; j < y[$].length; j++) {\n var r1 = y[$][j];\n k[r1] = k[r1] + z[r1] / z[$] * (1 + k[$]);\n }\n $ != s[O].id() && d.set($, d.get($) + k[$]);\n }\n }, C = 0; C < s.length; C++)\n M(C);\n var g = {\n betweenness: function(O) {\n var m = a.collection(O).id();\n return d.get(m);\n },\n betweennessNormalized: function(O) {\n if (p == 0)\n return 0;\n var m = a.collection(O).id();\n return d.get(m) / p;\n }\n };\n return g.betweennessNormalised = g.betweennessNormalized, g;\n }\n // betweennessCentrality\n};\nU8.bc = U8.betweennessCentrality;\nvar tt1 = Ut({\n expandFactor: 2,\n // affects time of computation and cluster granularity to some extent: M * M\n inflateFactor: 2,\n // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j)\n multFactor: 1,\n // optional self loops for each node. Use a neutral value to improve cluster computations.\n maxIterations: 20,\n // maximum number of iterations of the MCL algorithm in a single run\n attributes: [\n // attributes/features used to group nodes, ie. similarity values between nodes\n function(e) {\n return 1;\n }\n ]\n}), rt1 = function(t) {\n return tt1(t);\n}, nt1 = function(t, r) {\n for (var n = 0, o = 0; o < r.length; o++)\n n += r[o](t);\n return n;\n}, ot1 = function(t, r, n) {\n for (var o = 0; o < r; o++)\n t[o * r + o] = n;\n}, gO = function(t, r) {\n for (var n, o = 0; o < r; o++) {\n n = 0;\n for (var i = 0; i < r; i++)\n n += t[i * r + o];\n for (var a = 0; a < r; a++)\n t[a * r + o] = t[a * r + o] / n;\n }\n}, it1 = function(t, r, n) {\n for (var o = new Array(n * n), i = 0; i < n; i++) {\n for (var a = 0; a < n; a++)\n o[i * n + a] = 0;\n for (var s = 0; s < n; s++)\n for (var l = 0; l < n; l++)\n o[i * n + l] += t[i * n + s] * r[s * n + l];\n }\n return o;\n}, at1 = function(t, r, n) {\n for (var o = t.slice(0), i = 1; i < n; i++)\n t = it1(t, o, r);\n return t;\n}, st1 = function(t, r, n) {\n for (var o = new Array(r * r), i = 0; i < r * r; i++)\n o[i] = Math.pow(t[i], n);\n return gO(o, r), o;\n}, lt1 = function(t, r, n, o) {\n for (var i = 0; i < n; i++) {\n var a = Math.round(t[i] * Math.pow(10, o)) / Math.pow(10, o), s = Math.round(r[i] * Math.pow(10, o)) / Math.pow(10, o);\n if (a !== s)\n return !1;\n }\n return !0;\n}, ct1 = function(t, r, n, o) {\n for (var i = [], a = 0; a < r; a++) {\n for (var s = [], l = 0; l < r; l++)\n Math.round(t[a * r + l] * 1e3) / 1e3 > 0 && s.push(n[l]);\n s.length !== 0 && i.push(o.collection(s));\n }\n return i;\n}, pt1 = function(t, r) {\n for (var n = 0; n < t.length; n++)\n if (!r[n] || t[n].id() !== r[n].id())\n return !1;\n return !0;\n}, dt1 = function(t) {\n for (var r = 0; r < t.length; r++)\n for (var n = 0; n < t.length; n++)\n r != n && pt1(t[r], t[n]) && t.splice(n, 1);\n return t;\n}, uh = function(t) {\n for (var r = this.nodes(), n = this.edges(), o = this.cy(), i = rt1(t), a = {}, s = 0; s < r.length; s++)\n a[r[s].id()] = s;\n for (var l = r.length, c = l * l, p = new Array(c), d, u = 0; u < c; u++)\n p[u] = 0;\n for (var h = 0; h < n.length; h++) {\n var b = n[h], M = a[b.source().id()], C = a[b.target().id()], g = nt1(b, i.attributes);\n p[M * l + C] += g, p[C * l + M] += g;\n }\n ot1(p, l, i.multFactor), gO(p, l);\n for (var f = !0, O = 0; f && O < i.maxIterations; )\n f = !1, d = at1(p, l, i.expandFactor), p = st1(d, l, i.inflateFactor), lt1(p, d, c, 4) || (f = !0), O++;\n var m = ct1(p, l, r, o);\n return m = dt1(m), m;\n}, At1 = {\n markovClustering: uh,\n mcl: uh\n}, ut1 = function(t) {\n return t;\n}, zO = function(t, r) {\n return Math.abs(r - t);\n}, bh = function(t, r, n) {\n return t + zO(r, n);\n}, hh = function(t, r, n) {\n return t + Math.pow(n - r, 2);\n}, bt1 = function(t) {\n return Math.sqrt(t);\n}, ht1 = function(t, r, n) {\n return Math.max(t, zO(r, n));\n}, L3 = function(t, r, n, o, i) {\n for (var a = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : ut1, s = o, l, c, p = 0; p < t; p++)\n l = r(p), c = n(p), s = i(s, l, c);\n return a(s);\n}, Ea = {\n euclidean: function(t, r, n) {\n return t >= 2 ? L3(t, r, n, 0, hh, bt1) : L3(t, r, n, 0, bh);\n },\n squaredEuclidean: function(t, r, n) {\n return L3(t, r, n, 0, hh);\n },\n manhattan: function(t, r, n) {\n return L3(t, r, n, 0, bh);\n },\n max: function(t, r, n) {\n return L3(t, r, n, -1 / 0, ht1);\n }\n};\nEa["squared-euclidean"] = Ea.squaredEuclidean;\nEa.squaredeuclidean = Ea.squaredEuclidean;\nfunction Hc(e, t, r, n, o, i) {\n var a;\n return at(e) ? a = e : a = Ea[e] || Ea.euclidean, t === 0 && at(e) ? a(o, i) : a(t, r, n, o, i);\n}\nvar Mt1 = Ut({\n k: 2,\n m: 2,\n sensitivityThreshold: 1e-4,\n distance: "euclidean",\n maxIterations: 10,\n attributes: [],\n testMode: !1,\n testCentroids: null\n}), Q9 = function(t) {\n return Mt1(t);\n}, Zl = function(t, r, n, o, i) {\n var a = i !== "kMedoids", s = a ? function(d) {\n return n[d];\n } : function(d) {\n return o[d](n);\n }, l = function(u) {\n return o[u](r);\n }, c = n, p = r;\n return Hc(t, o.length, s, l, c, p);\n}, zp = function(t, r, n) {\n for (var o = n.length, i = new Array(o), a = new Array(o), s = new Array(r), l = null, c = 0; c < o; c++)\n i[c] = t.min(n[c]).value, a[c] = t.max(n[c]).value;\n for (var p = 0; p < r; p++) {\n l = [];\n for (var d = 0; d < o; d++)\n l[d] = Math.random() * (a[d] - i[d]) + i[d];\n s[p] = l;\n }\n return s;\n}, CO = function(t, r, n, o, i) {\n for (var a = 1 / 0, s = 0, l = 0; l < r.length; l++) {\n var c = Zl(n, t, r[l], o, i);\n c < a && (a = c, s = l);\n }\n return s;\n}, OO = function(t, r, n) {\n for (var o = [], i = null, a = 0; a < r.length; a++)\n i = r[a], n[i.id()] === t && o.push(i);\n return o;\n}, ft1 = function(t, r, n) {\n return Math.abs(r - t) <= n;\n}, gt1 = function(t, r, n) {\n for (var o = 0; o < t.length; o++)\n for (var i = 0; i < t[o].length; i++) {\n var a = Math.abs(t[o][i] - r[o][i]);\n if (a > n)\n return !1;\n }\n return !0;\n}, zt1 = function(t, r, n) {\n for (var o = 0; o < n; o++)\n if (t === r[o])\n return !0;\n return !1;\n}, Mh = function(t, r) {\n var n = new Array(r);\n if (t.length < 50)\n for (var o = 0; o < r; o++) {\n for (var i = t[Math.floor(Math.random() * t.length)]; zt1(i, n, o); )\n i = t[Math.floor(Math.random() * t.length)];\n n[o] = i;\n }\n else\n for (var a = 0; a < r; a++)\n n[a] = t[Math.floor(Math.random() * t.length)];\n return n;\n}, fh = function(t, r, n) {\n for (var o = 0, i = 0; i < r.length; i++)\n o += Zl("manhattan", r[i], t, n, "kMedoids");\n return o;\n}, Ct1 = function(t) {\n var r = this.cy(), n = this.nodes(), o = null, i = Q9(t), a = new Array(i.k), s = {}, l;\n i.testMode ? typeof i.testCentroids == "number" ? l = zp(n, i.k, i.attributes) : Ot(i.testCentroids) === "object" ? l = i.testCentroids : l = zp(n, i.k, i.attributes) : l = zp(n, i.k, i.attributes);\n for (var c = !0, p = 0; c && p < i.maxIterations; ) {\n for (var d = 0; d < n.length; d++)\n o = n[d], s[o.id()] = CO(o, l, i.distance, i.attributes, "kMeans");\n c = !1;\n for (var u = 0; u < i.k; u++) {\n var h = OO(u, n, s);\n if (h.length !== 0) {\n for (var b = i.attributes.length, M = l[u], C = new Array(b), g = new Array(b), f = 0; f < b; f++) {\n g[f] = 0;\n for (var O = 0; O < h.length; O++)\n o = h[O], g[f] += i.attributes[f](o);\n C[f] = g[f] / h.length, ft1(C[f], M[f], i.sensitivityThreshold) || (c = !0);\n }\n l[u] = C, a[u] = r.collection(h);\n }\n }\n p++;\n }\n return a;\n}, Ot1 = function(t) {\n var r = this.cy(), n = this.nodes(), o = null, i = Q9(t), a = new Array(i.k), s, l = {}, c, p = new Array(i.k);\n i.testMode ? typeof i.testCentroids == "number" || (Ot(i.testCentroids) === "object" ? s = i.testCentroids : s = Mh(n, i.k)) : s = Mh(n, i.k);\n for (var d = !0, u = 0; d && u < i.maxIterations; ) {\n for (var h = 0; h < n.length; h++)\n o = n[h], l[o.id()] = CO(o, s, i.distance, i.attributes, "kMedoids");\n d = !1;\n for (var b = 0; b < s.length; b++) {\n var M = OO(b, n, l);\n if (M.length !== 0) {\n p[b] = fh(s[b], M, i.attributes);\n for (var C = 0; C < M.length; C++)\n c = fh(M[C], M, i.attributes), c < p[b] && (p[b] = c, s[b] = M[C], d = !0);\n a[b] = r.collection(M);\n }\n }\n u++;\n }\n return a;\n}, mt1 = function(t, r, n, o, i) {\n for (var a, s, l = 0; l < r.length; l++)\n for (var c = 0; c < t.length; c++)\n o[l][c] = Math.pow(n[l][c], i.m);\n for (var p = 0; p < t.length; p++)\n for (var d = 0; d < i.attributes.length; d++) {\n a = 0, s = 0;\n for (var u = 0; u < r.length; u++)\n a += o[u][p] * i.attributes[d](r[u]), s += o[u][p];\n t[p][d] = a / s;\n }\n}, vt1 = function(t, r, n, o, i) {\n for (var a = 0; a < t.length; a++)\n r[a] = t[a].slice();\n for (var s, l, c, p = 2 / (i.m - 1), d = 0; d < n.length; d++)\n for (var u = 0; u < o.length; u++) {\n s = 0;\n for (var h = 0; h < n.length; h++)\n l = Zl(i.distance, o[u], n[d], i.attributes, "cmeans"), c = Zl(i.distance, o[u], n[h], i.attributes, "cmeans"), s += Math.pow(l / c, p);\n t[u][d] = 1 / s;\n }\n}, yt1 = function(t, r, n, o) {\n for (var i = new Array(n.k), a = 0; a < i.length; a++)\n i[a] = [];\n for (var s, l, c = 0; c < r.length; c++) {\n s = -1 / 0, l = -1;\n for (var p = 0; p < r[0].length; p++)\n r[c][p] > s && (s = r[c][p], l = p);\n i[l].push(t[c]);\n }\n for (var d = 0; d < i.length; d++)\n i[d] = o.collection(i[d]);\n return i;\n}, gh = function(t) {\n var r = this.cy(), n = this.nodes(), o = Q9(t), i, a, s, l, c;\n l = new Array(n.length);\n for (var p = 0; p < n.length; p++)\n l[p] = new Array(o.k);\n s = new Array(n.length);\n for (var d = 0; d < n.length; d++)\n s[d] = new Array(o.k);\n for (var u = 0; u < n.length; u++) {\n for (var h = 0, b = 0; b < o.k; b++)\n s[u][b] = Math.random(), h += s[u][b];\n for (var M = 0; M < o.k; M++)\n s[u][M] = s[u][M] / h;\n }\n a = new Array(o.k);\n for (var C = 0; C < o.k; C++)\n a[C] = new Array(o.attributes.length);\n c = new Array(n.length);\n for (var g = 0; g < n.length; g++)\n c[g] = new Array(o.k);\n for (var f = !0, O = 0; f && O < o.maxIterations; )\n f = !1, mt1(a, n, s, c, o), vt1(s, l, a, n, o), gt1(s, l, o.sensitivityThreshold) || (f = !0), O++;\n return i = yt1(n, s, o, r), {\n clusters: i,\n degreeOfMembership: s\n };\n}, Lt1 = {\n kMeans: Ct1,\n kMedoids: Ot1,\n fuzzyCMeans: gh,\n fcm: gh\n}, wt1 = Ut({\n distance: "euclidean",\n // distance metric to compare nodes\n linkage: "min",\n // linkage criterion : how to determine the distance between clusters of nodes\n mode: "threshold",\n // mode:\'threshold\' => clusters must be threshold distance apart\n threshold: 1 / 0,\n // the distance threshold\n // mode:\'dendrogram\' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters\n addDendrogram: !1,\n // whether to add the dendrogram to the graph for viz\n dendrogramDepth: 0,\n // depth at which dendrogram branches are merged into the returned clusters\n attributes: []\n // array of attr functions\n}), qt1 = {\n single: "min",\n complete: "max"\n}, xt1 = function(t) {\n var r = wt1(t), n = qt1[r.linkage];\n return n != null && (r.linkage = n), r;\n}, zh = function(t, r, n, o, i) {\n for (var a = 0, s = 1 / 0, l, c = i.attributes, p = function(W, T) {\n return Hc(i.distance, c.length, function(x) {\n return c[x](W);\n }, function(x) {\n return c[x](T);\n }, W, T);\n }, d = 0; d < t.length; d++) {\n var u = t[d].key, h = n[u][o[u]];\n h < s && (a = u, s = h);\n }\n if (i.mode === "threshold" && s >= i.threshold || i.mode === "dendrogram" && t.length === 1)\n return !1;\n var b = r[a], M = r[o[a]], C;\n i.mode === "dendrogram" ? C = {\n left: b,\n right: M,\n key: b.key\n } : C = {\n value: b.value.concat(M.value),\n key: b.key\n }, t[b.index] = C, t.splice(M.index, 1), r[b.key] = C;\n for (var g = 0; g < t.length; g++) {\n var f = t[g];\n b.key === f.key ? l = 1 / 0 : i.linkage === "min" ? (l = n[b.key][f.key], n[b.key][f.key] > n[M.key][f.key] && (l = n[M.key][f.key])) : i.linkage === "max" ? (l = n[b.key][f.key], n[b.key][f.key] < n[M.key][f.key] && (l = n[M.key][f.key])) : i.linkage === "mean" ? l = (n[b.key][f.key] * b.size + n[M.key][f.key] * M.size) / (b.size + M.size) : i.mode === "dendrogram" ? l = p(f.value, b.value) : l = p(f.value[0], b.value[0]), n[b.key][f.key] = n[f.key][b.key] = l;\n }\n for (var O = 0; O < t.length; O++) {\n var m = t[O].key;\n if (o[m] === b.key || o[m] === M.key) {\n for (var v = m, y = 0; y < t.length; y++) {\n var z = t[y].key;\n n[m][z] < n[m][v] && (v = z);\n }\n o[m] = v;\n }\n t[O].index = O;\n }\n return b.key = M.key = b.index = M.index = null, !0;\n}, m5 = function e(t, r, n) {\n t && (t.value ? r.push(t.value) : (t.left && e(t.left, r), t.right && e(t.right, r)));\n}, Rt1 = function e(t, r) {\n if (!t)\n return "";\n if (t.left && t.right) {\n var n = e(t.left, r), o = e(t.right, r), i = r.add({\n group: "nodes",\n data: {\n id: n + "," + o\n }\n });\n return r.add({\n group: "edges",\n data: {\n source: n,\n target: i.id()\n }\n }), r.add({\n group: "edges",\n data: {\n source: o,\n target: i.id()\n }\n }), i.id();\n } else if (t.value)\n return t.value.id();\n}, Bt1 = function e(t, r, n) {\n if (!t)\n return [];\n var o = [], i = [], a = [];\n return r === 0 ? (t.left && m5(t.left, o), t.right && m5(t.right, i), a = o.concat(i), [n.collection(a)]) : r === 1 ? t.value ? [n.collection(t.value)] : (t.left && m5(t.left, o), t.right && m5(t.right, i), [n.collection(o), n.collection(i)]) : t.value ? [n.collection(t.value)] : (t.left && (o = e(t.left, r - 1, n)), t.right && (i = e(t.right, r - 1, n)), o.concat(i));\n}, Ch = function(t) {\n for (var r = this.cy(), n = this.nodes(), o = xt1(t), i = o.attributes, a = function(O, m) {\n return Hc(o.distance, i.length, function(v) {\n return i[v](O);\n }, function(v) {\n return i[v](m);\n }, O, m);\n }, s = [], l = [], c = [], p = [], d = 0; d < n.length; d++) {\n var u = {\n value: o.mode === "dendrogram" ? n[d] : [n[d]],\n key: d,\n index: d\n };\n s[d] = u, p[d] = u, l[d] = [], c[d] = 0;\n }\n for (var h = 0; h < s.length; h++)\n for (var b = 0; b <= h; b++) {\n var M = void 0;\n o.mode === "dendrogram" ? M = h === b ? 1 / 0 : a(s[h].value, s[b].value) : M = h === b ? 1 / 0 : a(s[h].value[0], s[b].value[0]), l[h][b] = M, l[b][h] = M, M < l[h][c[h]] && (c[h] = b);\n }\n for (var C = zh(s, p, l, c, o); C; )\n C = zh(s, p, l, c, o);\n var g;\n return o.mode === "dendrogram" ? (g = Bt1(s[0], o.dendrogramDepth, r), o.addDendrogram && Rt1(s[0], r)) : (g = new Array(s.length), s.forEach(function(f, O) {\n f.key = f.index = null, g[O] = r.collection(f.value);\n })), g;\n}, Wt1 = {\n hierarchicalClustering: Ch,\n hca: Ch\n}, Et1 = Ut({\n distance: "euclidean",\n // distance metric to compare attributes between two nodes\n preference: "median",\n // suitability of a data point to serve as an exemplar\n damping: 0.8,\n // damping factor between [0.5, 1)\n maxIterations: 1e3,\n // max number of iterations to run\n minIterations: 100,\n // min number of iterations to run in order for clustering to stop\n attributes: [\n // functions to quantify the similarity between any two points\n // e.g. node => node.data(\'weight\')\n ]\n}), St1 = function(t) {\n var r = t.damping, n = t.preference;\n 0.5 <= r && r < 1 || ct("Damping must range on [0.5, 1). Got: ".concat(r));\n var o = ["median", "mean", "min", "max"];\n return o.some(function(i) {\n return i === n;\n }) || O0(n) || ct("Preference must be one of [".concat(o.map(function(i) {\n return "\'".concat(i, "\'");\n }).join(", "), "] or a number. Got: ").concat(n)), Et1(t);\n}, kt1 = function(t, r, n, o) {\n var i = function(s, l) {\n return o[l](s);\n };\n return -Hc(t, o.length, function(a) {\n return i(r, a);\n }, function(a) {\n return i(n, a);\n }, r, n);\n}, Nt1 = function(t, r) {\n var n = null;\n return r === "median" ? n = Se1(t) : r === "mean" ? n = Ee1(t) : r === "min" ? n = Be1(t) : r === "max" ? n = We1(t) : n = r, n;\n}, It1 = function(t, r, n) {\n for (var o = [], i = 0; i < t; i++)\n r[i * t + i] + n[i * t + i] > 0 && o.push(i);\n return o;\n}, Oh = function(t, r, n) {\n for (var o = [], i = 0; i < t; i++) {\n for (var a = -1, s = -1 / 0, l = 0; l < n.length; l++) {\n var c = n[l];\n r[i * t + c] > s && (a = c, s = r[i * t + c]);\n }\n a > 0 && o.push(a);\n }\n for (var p = 0; p < n.length; p++)\n o[n[p]] = n[p];\n return o;\n}, Tt1 = function(t, r, n) {\n for (var o = Oh(t, r, n), i = 0; i < n.length; i++) {\n for (var a = [], s = 0; s < o.length; s++)\n o[s] === n[i] && a.push(s);\n for (var l = -1, c = -1 / 0, p = 0; p < a.length; p++) {\n for (var d = 0, u = 0; u < a.length; u++)\n d += r[a[u] * t + a[p]];\n d > c && (l = p, c = d);\n }\n n[i] = a[l];\n }\n return o = Oh(t, r, n), o;\n}, mh = function(t) {\n for (var r = this.cy(), n = this.nodes(), o = St1(t), i = {}, a = 0; a < n.length; a++)\n i[n[a].id()] = a;\n var s, l, c, p, d, u;\n s = n.length, l = s * s, c = new Array(l);\n for (var h = 0; h < l; h++)\n c[h] = -1 / 0;\n for (var b = 0; b < s; b++)\n for (var M = 0; M < s; M++)\n b !== M && (c[b * s + M] = kt1(o.distance, n[b], n[M], o.attributes));\n p = Nt1(c, o.preference);\n for (var C = 0; C < s; C++)\n c[C * s + C] = p;\n d = new Array(l);\n for (var g = 0; g < l; g++)\n d[g] = 0;\n u = new Array(l);\n for (var f = 0; f < l; f++)\n u[f] = 0;\n for (var O = new Array(s), m = new Array(s), v = new Array(s), y = 0; y < s; y++)\n O[y] = 0, m[y] = 0, v[y] = 0;\n for (var z = new Array(s * o.minIterations), N = 0; N < z.length; N++)\n z[N] = 0;\n var W;\n for (W = 0; W < o.maxIterations; W++) {\n for (var T = 0; T < s; T++) {\n for (var x = -1 / 0, E = -1 / 0, L = -1, w = 0, q = 0; q < s; q++)\n O[q] = d[T * s + q], w = u[T * s + q] + c[T * s + q], w >= x ? (E = x, x = w, L = q) : w > E && (E = w);\n for (var S = 0; S < s; S++)\n d[T * s + S] = (1 - o.damping) * (c[T * s + S] - x) + o.damping * O[S];\n d[T * s + L] = (1 - o.damping) * (c[T * s + L] - E) + o.damping * O[L];\n }\n for (var B = 0; B < s; B++) {\n for (var I = 0, P = 0; P < s; P++)\n O[P] = u[P * s + B], m[P] = Math.max(0, d[P * s + B]), I += m[P];\n I -= m[B], m[B] = d[B * s + B], I += m[B];\n for (var k = 0; k < s; k++)\n u[k * s + B] = (1 - o.damping) * Math.min(0, I - m[k]) + o.damping * O[k];\n u[B * s + B] = (1 - o.damping) * (I - m[B]) + o.damping * O[B];\n }\n for (var K = 0, $ = 0; $ < s; $++) {\n var j = u[$ * s + $] + d[$ * s + $] > 0 ? 1 : 0;\n z[W % o.minIterations * s + $] = j, K += j;\n }\n if (K > 0 && (W >= o.minIterations - 1 || W == o.maxIterations - 1)) {\n for (var r1 = 0, a1 = 0; a1 < s; a1++) {\n v[a1] = 0;\n for (var _ = 0; _ < o.minIterations; _++)\n v[a1] += z[_ * s + a1];\n (v[a1] === 0 || v[a1] === o.minIterations) && r1++;\n }\n if (r1 === s)\n break;\n }\n }\n for (var Y = It1(s, d, u), D = Tt1(s, c, Y), H = {}, G = 0; G < Y.length; G++)\n H[Y[G]] = [];\n for (var J = 0; J < n.length; J++) {\n var F = i[n[J].id()], V = D[F];\n V != null && H[V].push(n[J]);\n }\n for (var Q = new Array(Y.length), Z = 0; Z < Y.length; Z++)\n Q[Z] = r.collection(H[Y[Z]]);\n return Q;\n}, Dt1 = {\n affinityPropagation: mh,\n ap: mh\n}, Ht1 = Ut({\n root: void 0,\n directed: !1\n}), Pt1 = {\n hierholzer: function(t) {\n if (!Ce(t)) {\n var r = arguments;\n t = {\n root: r[0],\n directed: r[1]\n };\n }\n var n = Ht1(t), o = n.root, i = n.directed, a = this, s = !1, l, c, p;\n o && (p = U0(o) ? this.filter(o)[0].id() : o[0].id());\n var d = {}, u = {};\n i ? a.forEach(function(f) {\n var O = f.id();\n if (f.isNode()) {\n var m = f.indegree(!0), v = f.outdegree(!0), y = m - v, z = v - m;\n y == 1 ? l ? s = !0 : l = O : z == 1 ? c ? s = !0 : c = O : (z > 1 || y > 1) && (s = !0), d[O] = [], f.outgoers().forEach(function(N) {\n N.isEdge() && d[O].push(N.id());\n });\n } else\n u[O] = [void 0, f.target().id()];\n }) : a.forEach(function(f) {\n var O = f.id();\n if (f.isNode()) {\n var m = f.degree(!0);\n m % 2 && (l ? c ? s = !0 : c = O : l = O), d[O] = [], f.connectedEdges().forEach(function(v) {\n return d[O].push(v.id());\n });\n } else\n u[O] = [f.source().id(), f.target().id()];\n });\n var h = {\n found: !1,\n trail: void 0\n };\n if (s)\n return h;\n if (c && l)\n if (i) {\n if (p && c != p)\n return h;\n p = c;\n } else {\n if (p && c != p && l != p)\n return h;\n p || (p = c);\n }\n else\n p || (p = a[0].id());\n var b = function(O) {\n for (var m = O, v = [O], y, z, N; d[m].length; )\n y = d[m].shift(), z = u[y][0], N = u[y][1], m != N ? (d[N] = d[N].filter(function(W) {\n return W != y;\n }), m = N) : !i && m != z && (d[z] = d[z].filter(function(W) {\n return W != y;\n }), m = z), v.unshift(y), v.unshift(m);\n return v;\n }, M = [], C = [];\n for (C = b(p); C.length != 1; )\n d[C[0]].length == 0 ? (M.unshift(a.getElementById(C.shift())), M.unshift(a.getElementById(C.shift()))) : C = b(C.shift()).concat(C);\n M.unshift(a.getElementById(C.shift()));\n for (var g in d)\n if (d[g].length)\n return h;\n return h.found = !0, h.trail = this.spawn(M, !0), h;\n }\n}, v5 = function() {\n var t = this, r = {}, n = 0, o = 0, i = [], a = [], s = {}, l = function(u, h) {\n for (var b = a.length - 1, M = [], C = t.spawn(); a[b].x != u || a[b].y != h; )\n M.push(a.pop().edge), b--;\n M.push(a.pop().edge), M.forEach(function(g) {\n var f = g.connectedNodes().intersection(t);\n C.merge(g), f.forEach(function(O) {\n var m = O.id(), v = O.connectedEdges().intersection(t);\n C.merge(O), r[m].cutVertex ? C.merge(v.filter(function(y) {\n return y.isLoop();\n })) : C.merge(v);\n });\n }), i.push(C);\n }, c = function d(u, h, b) {\n u === b && (o += 1), r[h] = {\n id: n,\n low: n++,\n cutVertex: !1\n };\n var M = t.getElementById(h).connectedEdges().intersection(t);\n if (M.size() === 0)\n i.push(t.spawn(t.getElementById(h)));\n else {\n var C, g, f, O;\n M.forEach(function(m) {\n C = m.source().id(), g = m.target().id(), f = C === h ? g : C, f !== b && (O = m.id(), s[O] || (s[O] = !0, a.push({\n x: h,\n y: f,\n edge: m\n })), f in r ? r[h].low = Math.min(r[h].low, r[f].id) : (d(u, f, h), r[h].low = Math.min(r[h].low, r[f].low), r[h].id <= r[f].low && (r[h].cutVertex = !0, l(h, f))));\n });\n }\n };\n t.forEach(function(d) {\n if (d.isNode()) {\n var u = d.id();\n u in r || (o = 0, c(u, u), r[u].cutVertex = o > 1);\n }\n });\n var p = Object.keys(r).filter(function(d) {\n return r[d].cutVertex;\n }).map(function(d) {\n return t.getElementById(d);\n });\n return {\n cut: t.spawn(p),\n components: i\n };\n}, Vt1 = {\n hopcroftTarjanBiconnected: v5,\n htbc: v5,\n htb: v5,\n hopcroftTarjanBiconnectedComponents: v5\n}, y5 = function() {\n var t = this, r = {}, n = 0, o = [], i = [], a = t.spawn(t), s = function l(c) {\n i.push(c), r[c] = {\n index: n,\n low: n++,\n explored: !1\n };\n var p = t.getElementById(c).connectedEdges().intersection(t);\n if (p.forEach(function(M) {\n var C = M.target().id();\n C !== c && (C in r || l(C), r[C].explored || (r[c].low = Math.min(r[c].low, r[C].low)));\n }), r[c].index === r[c].low) {\n for (var d = t.spawn(); ; ) {\n var u = i.pop();\n if (d.merge(t.getElementById(u)), r[u].low = r[c].index, r[u].explored = !0, u === c)\n break;\n }\n var h = d.edgesWith(d), b = d.merge(h);\n o.push(b), a = a.difference(b);\n }\n };\n return t.forEach(function(l) {\n if (l.isNode()) {\n var c = l.id();\n c in r || s(c);\n }\n }), {\n cut: a,\n components: o\n };\n}, Ft1 = {\n tarjanStronglyConnected: y5,\n tsc: y5,\n tscc: y5,\n tarjanStronglyConnectedComponents: y5\n}, mO = {};\n[S4, ge1, ze1, Oe1, ve1, Le1, xe1, $e1, da, Aa, U8, At1, Lt1, Wt1, Dt1, Pt1, Vt1, Ft1].forEach(function(e) {\n K0(mO, e);\n});\n/*!\nEmbeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable\nCopyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)\nLicensed under The MIT License (http://opensource.org/licenses/MIT)\n*/\nvar vO = 0, yO = 1, LO = 2, Sn = function e(t) {\n if (!(this instanceof e))\n return new e(t);\n this.id = "Thenable/1.0.7", this.state = vO, this.fulfillValue = void 0, this.rejectReason = void 0, this.onFulfilled = [], this.onRejected = [], this.proxy = {\n then: this.then.bind(this)\n }, typeof t == "function" && t.call(this, this.fulfill.bind(this), this.reject.bind(this));\n};\nSn.prototype = {\n /* promise resolving methods */\n fulfill: function(t) {\n return vh(this, yO, "fulfillValue", t);\n },\n reject: function(t) {\n return vh(this, LO, "rejectReason", t);\n },\n /* "The then Method" [Promises/A+ 1.1, 1.2, 2.2] */\n then: function(t, r) {\n var n = this, o = new Sn();\n return n.onFulfilled.push(Lh(t, o, "fulfill")), n.onRejected.push(Lh(r, o, "reject")), wO(n), o.proxy;\n }\n};\nvar vh = function(t, r, n, o) {\n return t.state === vO && (t.state = r, t[n] = o, wO(t)), t;\n}, wO = function(t) {\n t.state === yO ? yh(t, "onFulfilled", t.fulfillValue) : t.state === LO && yh(t, "onRejected", t.rejectReason);\n}, yh = function(t, r, n) {\n if (t[r].length !== 0) {\n var o = t[r];\n t[r] = [];\n var i = function() {\n for (var s = 0; s < o.length; s++)\n o[s](n);\n };\n typeof setImmediate == "function" ? setImmediate(i) : setTimeout(i, 0);\n }\n}, Lh = function(t, r, n) {\n return function(o) {\n if (typeof t != "function")\n r[n].call(r, o);\n else {\n var i;\n try {\n i = t(o);\n } catch (a) {\n r.reject(a);\n return;\n }\n Ut1(r, i);\n }\n };\n}, Ut1 = function e(t, r) {\n if (t === r || t.proxy === r) {\n t.reject(new TypeError("cannot resolve promise with itself"));\n return;\n }\n var n;\n if (Ot(r) === "object" && r !== null || typeof r == "function")\n try {\n n = r.then;\n } catch (i) {\n t.reject(i);\n return;\n }\n if (typeof n == "function") {\n var o = !1;\n try {\n n.call(\n r,\n /* resolvePromise */\n /* [Promises/A+ 2.3.3.3.1] */\n function(i) {\n o || (o = !0, i === r ? t.reject(new TypeError("circular thenable chain")) : e(t, i));\n },\n /* rejectPromise */\n /* [Promises/A+ 2.3.3.3.2] */\n function(i) {\n o || (o = !0, t.reject(i));\n }\n );\n } catch (i) {\n o || t.reject(i);\n }\n return;\n }\n t.fulfill(r);\n};\nSn.all = function(e) {\n return new Sn(function(t, r) {\n for (var n = new Array(e.length), o = 0, i = function(l, c) {\n n[l] = c, o++, o === e.length && t(n);\n }, a = 0; a < e.length; a++)\n (function(s) {\n var l = e[s], c = l != null && l.then != null;\n if (c)\n l.then(function(d) {\n i(s, d);\n }, function(d) {\n r(d);\n });\n else {\n var p = l;\n i(s, p);\n }\n })(a);\n });\n};\nSn.resolve = function(e) {\n return new Sn(function(t, r) {\n t(e);\n });\n};\nSn.reject = function(e) {\n return new Sn(function(t, r) {\n r(e);\n });\n};\nvar Xa = typeof Promise < "u" ? Promise : Sn, Y8 = function(t, r, n) {\n var o = D9(t), i = !o, a = this._private = K0({\n duration: 1e3\n }, r, n);\n if (a.target = t, a.style = a.style || a.css, a.started = !1, a.playing = !1, a.hooked = !1, a.applying = !1, a.progress = 0, a.completes = [], a.frames = [], a.complete && at(a.complete) && a.completes.push(a.complete), i) {\n var s = t.position();\n a.startPosition = a.startPosition || {\n x: s.x,\n y: s.y\n }, a.startStyle = a.startStyle || t.cy().style().getAnimationStartStyle(t, a.style);\n }\n if (o) {\n var l = t.pan();\n a.startPan = {\n x: l.x,\n y: l.y\n }, a.startZoom = t.zoom();\n }\n this.length = 1, this[0] = this;\n}, zi = Y8.prototype;\nK0(zi, {\n instanceString: function() {\n return "animation";\n },\n hook: function() {\n var t = this._private;\n if (!t.hooked) {\n var r, n = t.target._private.animation;\n t.queue ? r = n.queue : r = n.current, r.push(this), I2(t.target) && t.target.cy().addToAnimationPool(t.target), t.hooked = !0;\n }\n return this;\n },\n play: function() {\n var t = this._private;\n return t.progress === 1 && (t.progress = 0), t.playing = !0, t.started = !1, t.stopped = !1, this.hook(), this;\n },\n playing: function() {\n return this._private.playing;\n },\n apply: function() {\n var t = this._private;\n return t.applying = !0, t.started = !1, t.stopped = !1, this.hook(), this;\n },\n applying: function() {\n return this._private.applying;\n },\n pause: function() {\n var t = this._private;\n return t.playing = !1, t.started = !1, this;\n },\n stop: function() {\n var t = this._private;\n return t.playing = !1, t.started = !1, t.stopped = !0, this;\n },\n rewind: function() {\n return this.progress(0);\n },\n fastforward: function() {\n return this.progress(1);\n },\n time: function(t) {\n var r = this._private;\n return t === void 0 ? r.progress * r.duration : this.progress(t / r.duration);\n },\n progress: function(t) {\n var r = this._private, n = r.playing;\n return t === void 0 ? r.progress : (n && this.pause(), r.progress = t, r.started = !1, n && this.play(), this);\n },\n completed: function() {\n return this._private.progress === 1;\n },\n reverse: function() {\n var t = this._private, r = t.playing;\n r && this.pause(), t.progress = 1 - t.progress, t.started = !1;\n var n = function(c, p) {\n var d = t[c];\n d != null && (t[c] = t[p], t[p] = d);\n };\n if (n("zoom", "startZoom"), n("pan", "startPan"), n("position", "startPosition"), t.style)\n for (var o = 0; o < t.style.length; o++) {\n var i = t.style[o], a = i.name, s = t.startStyle[a];\n t.startStyle[a] = i, t.style[o] = s;\n }\n return r && this.play(), this;\n },\n promise: function(t) {\n var r = this._private, n;\n switch (t) {\n case "frame":\n n = r.frames;\n break;\n default:\n case "complete":\n case "completed":\n n = r.completes;\n }\n return new Xa(function(o, i) {\n n.push(function() {\n o();\n });\n });\n }\n});\nzi.complete = zi.completed;\nzi.run = zi.play;\nzi.running = zi.playing;\nvar Yt1 = {\n animated: function() {\n return function() {\n var r = this, n = r.length !== void 0, o = n ? r : [r], i = this._private.cy || this;\n if (!i.styleEnabled())\n return !1;\n var a = o[0];\n if (a)\n return a._private.animation.current.length > 0;\n };\n },\n // animated\n clearQueue: function() {\n return function() {\n var r = this, n = r.length !== void 0, o = n ? r : [r], i = this._private.cy || this;\n if (!i.styleEnabled())\n return this;\n for (var a = 0; a < o.length; a++) {\n var s = o[a];\n s._private.animation.queue = [];\n }\n return this;\n };\n },\n // clearQueue\n delay: function() {\n return function(r, n) {\n var o = this._private.cy || this;\n return o.styleEnabled() ? this.animate({\n delay: r,\n duration: r,\n complete: n\n }) : this;\n };\n },\n // delay\n delayAnimation: function() {\n return function(r, n) {\n var o = this._private.cy || this;\n return o.styleEnabled() ? this.animation({\n delay: r,\n duration: r,\n complete: n\n }) : this;\n };\n },\n // delay\n animation: function() {\n return function(r, n) {\n var o = this, i = o.length !== void 0, a = i ? o : [o], s = this._private.cy || this, l = !i, c = !l;\n if (!s.styleEnabled())\n return this;\n var p = s.style();\n r = K0({}, r, n);\n var d = Object.keys(r).length === 0;\n if (d)\n return new Y8(a[0], r);\n switch (r.duration === void 0 && (r.duration = 400), r.duration) {\n case "slow":\n r.duration = 600;\n break;\n case "fast":\n r.duration = 200;\n break;\n }\n if (c && (r.style = p.getPropsList(r.style || r.css), r.css = void 0), c && r.renderedPosition != null) {\n var u = r.renderedPosition, h = s.pan(), b = s.zoom();\n r.position = pO(u, b, h);\n }\n if (l && r.panBy != null) {\n var M = r.panBy, C = s.pan();\n r.pan = {\n x: C.x + M.x,\n y: C.y + M.y\n };\n }\n var g = r.center || r.centre;\n if (l && g != null) {\n var f = s.getCenterPan(g.eles, r.zoom);\n f != null && (r.pan = f);\n }\n if (l && r.fit != null) {\n var O = r.fit, m = s.getFitViewport(O.eles || O.boundingBox, O.padding);\n m != null && (r.pan = m.pan, r.zoom = m.zoom);\n }\n if (l && Ce(r.zoom)) {\n var v = s.getZoomedViewport(r.zoom);\n v != null ? (v.zoomed && (r.zoom = v.zoom), v.panned && (r.pan = v.pan)) : r.zoom = null;\n }\n return new Y8(a[0], r);\n };\n },\n // animate\n animate: function() {\n return function(r, n) {\n var o = this, i = o.length !== void 0, a = i ? o : [o], s = this._private.cy || this;\n if (!s.styleEnabled())\n return this;\n n && (r = K0({}, r, n));\n for (var l = 0; l < a.length; l++) {\n var c = a[l], p = c.animated() && (r.queue === void 0 || r.queue), d = c.animation(r, p ? {\n queue: !0\n } : void 0);\n d.play();\n }\n return this;\n };\n },\n // animate\n stop: function() {\n return function(r, n) {\n var o = this, i = o.length !== void 0, a = i ? o : [o], s = this._private.cy || this;\n if (!s.styleEnabled())\n return this;\n for (var l = 0; l < a.length; l++) {\n for (var c = a[l], p = c._private, d = p.animation.current, u = 0; u < d.length; u++) {\n var h = d[u], b = h._private;\n n && (b.duration = 0);\n }\n r && (p.animation.queue = []), n || (p.animation.current = []);\n }\n return s.notify("draw"), this;\n };\n }\n // stop\n}, Xt1 = {\n // access data field\n data: function(t) {\n var r = {\n field: "data",\n bindingEvent: "data",\n allowBinding: !1,\n allowSetting: !1,\n allowGetting: !1,\n settingEvent: "data",\n settingTriggersEvent: !1,\n triggerFnName: "trigger",\n immutableKeys: {},\n // key => true if immutable\n updateStyle: !1,\n beforeGet: function(o) {\n },\n beforeSet: function(o, i) {\n },\n onSet: function(o) {\n },\n canSet: function(o) {\n return !0;\n }\n };\n return t = K0({}, r, t), function(o, i) {\n var a = t, s = this, l = s.length !== void 0, c = l ? s : [s], p = l ? s[0] : s;\n if (U0(o)) {\n if (a.allowGetting && i === void 0) {\n var d;\n return p && (a.beforeGet(p), d = p._private[a.field][o]), d;\n } else if (a.allowSetting && i !== void 0) {\n var u = !a.immutableKeys[o];\n if (u) {\n var h = jC({}, o, i);\n a.beforeSet(s, h);\n for (var b = 0, M = c.length; b < M; b++) {\n var C = c[b];\n a.canSet(C) && (C._private[a.field][o] = i);\n }\n a.updateStyle && s.updateStyle(), a.onSet(s), a.settingTriggersEvent && s[a.triggerFnName](a.settingEvent);\n }\n }\n } else if (a.allowSetting && Ce(o)) {\n var g = o, f, O, m = Object.keys(g);\n a.beforeSet(s, g);\n for (var v = 0; v < m.length; v++) {\n f = m[v], O = g[f];\n var y = !a.immutableKeys[f];\n if (y)\n for (var z = 0; z < c.length; z++) {\n var N = c[z];\n a.canSet(N) && (N._private[a.field][f] = O);\n }\n }\n a.updateStyle && s.updateStyle(), a.onSet(s), a.settingTriggersEvent && s[a.triggerFnName](a.settingEvent);\n } else if (a.allowBinding && at(o)) {\n var W = o;\n s.on(a.bindingEvent, W);\n } else if (a.allowGetting && o === void 0) {\n var T;\n return p && (a.beforeGet(p), T = p._private[a.field]), T;\n }\n return s;\n };\n },\n // data\n // remove data field\n removeData: function(t) {\n var r = {\n field: "data",\n event: "data",\n triggerFnName: "trigger",\n triggerEvent: !1,\n immutableKeys: {}\n // key => true if immutable\n };\n return t = K0({}, r, t), function(o) {\n var i = t, a = this, s = a.length !== void 0, l = s ? a : [a];\n if (U0(o)) {\n for (var c = o.split(/\\s+/), p = c.length, d = 0; d < p; d++) {\n var u = c[d];\n if (!Oo(u)) {\n var h = !i.immutableKeys[u];\n if (h)\n for (var b = 0, M = l.length; b < M; b++)\n l[b]._private[i.field][u] = void 0;\n }\n }\n i.triggerEvent && a[i.triggerFnName](i.event);\n } else if (o === void 0) {\n for (var C = 0, g = l.length; C < g; C++)\n for (var f = l[C]._private[i.field], O = Object.keys(f), m = 0; m < O.length; m++) {\n var v = O[m], y = !i.immutableKeys[v];\n y && (f[v] = void 0);\n }\n i.triggerEvent && a[i.triggerFnName](i.event);\n }\n return a;\n };\n }\n // removeData\n}, Qt1 = {\n eventAliasesOn: function(t) {\n var r = t;\n r.addListener = r.listen = r.bind = r.on, r.unlisten = r.unbind = r.off = r.removeListener, r.trigger = r.emit, r.pon = r.promiseOn = function(n, o) {\n var i = this, a = Array.prototype.slice.call(arguments, 0);\n return new Xa(function(s, l) {\n var c = function(h) {\n i.off.apply(i, d), s(h);\n }, p = a.concat([c]), d = p.concat([]);\n i.on.apply(i, p);\n });\n };\n }\n}, Ee = {};\n[Yt1, Xt1, Qt1].forEach(function(e) {\n K0(Ee, e);\n});\nvar Gt1 = {\n animate: Ee.animate(),\n animation: Ee.animation(),\n animated: Ee.animated(),\n clearQueue: Ee.clearQueue(),\n delay: Ee.delay(),\n delayAnimation: Ee.delayAnimation(),\n stop: Ee.stop()\n}, rl = {\n classes: function(t) {\n var r = this;\n if (t === void 0) {\n var n = [];\n return r[0]._private.classes.forEach(function(b) {\n return n.push(b);\n }), n;\n } else\n Ve(t) || (t = (t || "").match(/\\S+/g) || []);\n for (var o = [], i = new Ya(t), a = 0; a < r.length; a++) {\n for (var s = r[a], l = s._private, c = l.classes, p = !1, d = 0; d < t.length; d++) {\n var u = t[d], h = c.has(u);\n if (!h) {\n p = !0;\n break;\n }\n }\n p || (p = c.size !== t.length), p && (l.classes = i, o.push(s));\n }\n return o.length > 0 && this.spawn(o).updateStyle().emit("class"), r;\n },\n addClass: function(t) {\n return this.toggleClass(t, !0);\n },\n hasClass: function(t) {\n var r = this[0];\n return r != null && r._private.classes.has(t);\n },\n toggleClass: function(t, r) {\n Ve(t) || (t = t.match(/\\S+/g) || []);\n for (var n = this, o = r === void 0, i = [], a = 0, s = n.length; a < s; a++)\n for (var l = n[a], c = l._private.classes, p = !1, d = 0; d < t.length; d++) {\n var u = t[d], h = c.has(u), b = !1;\n r || o && !h ? (c.add(u), b = !0) : (!r || o && h) && (c.delete(u), b = !0), !p && b && (i.push(l), p = !0);\n }\n return i.length > 0 && this.spawn(i).updateStyle().emit("class"), n;\n },\n removeClass: function(t) {\n return this.toggleClass(t, !1);\n },\n flashClass: function(t, r) {\n var n = this;\n if (r == null)\n r = 250;\n else if (r === 0)\n return n;\n return n.addClass(t), setTimeout(function() {\n n.removeClass(t);\n }, r), n;\n }\n};\nrl.className = rl.classNames = rl.classes;\nvar ge = {\n metaChar: "[\\\\!\\\\\\"\\\\#\\\\$\\\\%\\\\&\\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\.\\\\/\\\\:\\\\;\\\\<\\\\=\\\\>\\\\?\\\\@\\\\[\\\\]\\\\^\\\\`\\\\{\\\\|\\\\}\\\\~]",\n // chars we need to escape in let names, etc\n comparatorOp: "=|\\\\!=|>|>=|<|<=|\\\\$=|\\\\^=|\\\\*=",\n // binary comparison op (used in data selectors)\n boolOp: "\\\\?|\\\\!|\\\\^",\n // boolean (unary) operators (used in data selectors)\n string: `"(?:\\\\\\\\"|[^"])*"|\'(?:\\\\\\\\\'|[^\'])*\'`,\n // string literals (used in data selectors) -- doublequotes | singlequotes\n number: yt,\n // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123\n meta: "degree|indegree|outdegree",\n // allowed metadata fields (i.e. allowed functions to use from Collection)\n separator: "\\\\s*,\\\\s*",\n // queries are separated by commas, e.g. edge[foo = \'bar\'], node.someClass\n descendant: "\\\\s+",\n child: "\\\\s+>\\\\s+",\n subject: "\\\\$",\n group: "node|edge|\\\\*",\n directedEdge: "\\\\s+->\\\\s+",\n undirectedEdge: "\\\\s+<->\\\\s+"\n};\nge.variable = "(?:[\\\\w-]|(?:\\\\\\\\" + ge.metaChar + "))+";\nge.value = ge.string + "|" + ge.number;\nge.className = ge.variable;\nge.id = ge.variable;\n(function() {\n var e, t, r;\n for (e = ge.comparatorOp.split("|"), r = 0; r < e.length; r++)\n t = e[r], ge.comparatorOp += "|@" + t;\n for (e = ge.comparatorOp.split("|"), r = 0; r < e.length; r++)\n t = e[r], !(t.indexOf("!") >= 0) && t !== "=" && (ge.comparatorOp += "|\\\\!" + t);\n})();\nvar De = function() {\n return {\n checks: []\n };\n}, N0 = {\n /** E.g. node */\n GROUP: 0,\n /** A collection of elements */\n COLLECTION: 1,\n /** A filter(ele) function */\n FILTER: 2,\n /** E.g. [foo > 1] */\n DATA_COMPARE: 3,\n /** E.g. [foo] */\n DATA_EXIST: 4,\n /** E.g. [?foo] */\n DATA_BOOL: 5,\n /** E.g. [[degree > 2]] */\n META_COMPARE: 6,\n /** E.g. :selected */\n STATE: 7,\n /** E.g. #foo */\n ID: 8,\n /** E.g. .foo */\n CLASS: 9,\n /** E.g. #foo <-> #bar */\n UNDIRECTED_EDGE: 10,\n /** E.g. #foo -> #bar */\n DIRECTED_EDGE: 11,\n /** E.g. $#foo -> #bar */\n NODE_SOURCE: 12,\n /** E.g. #foo -> $#bar */\n NODE_TARGET: 13,\n /** E.g. $#foo <-> #bar */\n NODE_NEIGHBOR: 14,\n /** E.g. #foo > #bar */\n CHILD: 15,\n /** E.g. #foo #bar */\n DESCENDANT: 16,\n /** E.g. $#foo > #bar */\n PARENT: 17,\n /** E.g. $#foo #bar */\n ANCESTOR: 18,\n /** E.g. #foo > $bar > #baz */\n COMPOUND_SPLIT: 19,\n /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */\n TRUE: 20\n}, X8 = [{\n selector: ":selected",\n matches: function(t) {\n return t.selected();\n }\n}, {\n selector: ":unselected",\n matches: function(t) {\n return !t.selected();\n }\n}, {\n selector: ":selectable",\n matches: function(t) {\n return t.selectable();\n }\n}, {\n selector: ":unselectable",\n matches: function(t) {\n return !t.selectable();\n }\n}, {\n selector: ":locked",\n matches: function(t) {\n return t.locked();\n }\n}, {\n selector: ":unlocked",\n matches: function(t) {\n return !t.locked();\n }\n}, {\n selector: ":visible",\n matches: function(t) {\n return t.visible();\n }\n}, {\n selector: ":hidden",\n matches: function(t) {\n return !t.visible();\n }\n}, {\n selector: ":transparent",\n matches: function(t) {\n return t.transparent();\n }\n}, {\n selector: ":grabbed",\n matches: function(t) {\n return t.grabbed();\n }\n}, {\n selector: ":free",\n matches: function(t) {\n return !t.grabbed();\n }\n}, {\n selector: ":removed",\n matches: function(t) {\n return t.removed();\n }\n}, {\n selector: ":inside",\n matches: function(t) {\n return !t.removed();\n }\n}, {\n selector: ":grabbable",\n matches: function(t) {\n return t.grabbable();\n }\n}, {\n selector: ":ungrabbable",\n matches: function(t) {\n return !t.grabbable();\n }\n}, {\n selector: ":animated",\n matches: function(t) {\n return t.animated();\n }\n}, {\n selector: ":unanimated",\n matches: function(t) {\n return !t.animated();\n }\n}, {\n selector: ":parent",\n matches: function(t) {\n return t.isParent();\n }\n}, {\n selector: ":childless",\n matches: function(t) {\n return t.isChildless();\n }\n}, {\n selector: ":child",\n matches: function(t) {\n return t.isChild();\n }\n}, {\n selector: ":orphan",\n matches: function(t) {\n return t.isOrphan();\n }\n}, {\n selector: ":nonorphan",\n matches: function(t) {\n return t.isChild();\n }\n}, {\n selector: ":compound",\n matches: function(t) {\n return t.isNode() ? t.isParent() : t.source().isParent() || t.target().isParent();\n }\n}, {\n selector: ":loop",\n matches: function(t) {\n return t.isLoop();\n }\n}, {\n selector: ":simple",\n matches: function(t) {\n return t.isSimple();\n }\n}, {\n selector: ":active",\n matches: function(t) {\n return t.active();\n }\n}, {\n selector: ":inactive",\n matches: function(t) {\n return !t.active();\n }\n}, {\n selector: ":backgrounding",\n matches: function(t) {\n return t.backgrounding();\n }\n}, {\n selector: ":nonbackgrounding",\n matches: function(t) {\n return !t.backgrounding();\n }\n}].sort(function(e, t) {\n return J01(e.selector, t.selector);\n}), jt1 = function() {\n for (var e = {}, t, r = 0; r < X8.length; r++)\n t = X8[r], e[t.selector] = t.matches;\n return e;\n}(), Kt1 = function(t, r) {\n return jt1[t](r);\n}, Zt1 = "(" + X8.map(function(e) {\n return e.selector;\n}).join("|") + ")", Ui = function(t) {\n return t.replace(new RegExp("\\\\\\\\(" + ge.metaChar + ")", "g"), function(r, n) {\n return n;\n });\n}, Kn = function(t, r, n) {\n t[t.length - 1] = n;\n}, Q8 = [{\n name: "group",\n // just used for identifying when debugging\n query: !0,\n regex: "(" + ge.group + ")",\n populate: function(t, r, n) {\n var o = un(n, 1), i = o[0];\n r.checks.push({\n type: N0.GROUP,\n value: i === "*" ? i : i + "s"\n });\n }\n}, {\n name: "state",\n query: !0,\n regex: Zt1,\n populate: function(t, r, n) {\n var o = un(n, 1), i = o[0];\n r.checks.push({\n type: N0.STATE,\n value: i\n });\n }\n}, {\n name: "id",\n query: !0,\n regex: "\\\\#(" + ge.id + ")",\n populate: function(t, r, n) {\n var o = un(n, 1), i = o[0];\n r.checks.push({\n type: N0.ID,\n value: Ui(i)\n });\n }\n}, {\n name: "className",\n query: !0,\n regex: "\\\\.(" + ge.className + ")",\n populate: function(t, r, n) {\n var o = un(n, 1), i = o[0];\n r.checks.push({\n type: N0.CLASS,\n value: Ui(i)\n });\n }\n}, {\n name: "dataExists",\n query: !0,\n regex: "\\\\[\\\\s*(" + ge.variable + ")\\\\s*\\\\]",\n populate: function(t, r, n) {\n var o = un(n, 1), i = o[0];\n r.checks.push({\n type: N0.DATA_EXIST,\n field: Ui(i)\n });\n }\n}, {\n name: "dataCompare",\n query: !0,\n regex: "\\\\[\\\\s*(" + ge.variable + ")\\\\s*(" + ge.comparatorOp + ")\\\\s*(" + ge.value + ")\\\\s*\\\\]",\n populate: function(t, r, n) {\n var o = un(n, 3), i = o[0], a = o[1], s = o[2], l = new RegExp("^" + ge.string + "$").exec(s) != null;\n l ? s = s.substring(1, s.length - 1) : s = parseFloat(s), r.checks.push({\n type: N0.DATA_COMPARE,\n field: Ui(i),\n operator: a,\n value: s\n });\n }\n}, {\n name: "dataBool",\n query: !0,\n regex: "\\\\[\\\\s*(" + ge.boolOp + ")\\\\s*(" + ge.variable + ")\\\\s*\\\\]",\n populate: function(t, r, n) {\n var o = un(n, 2), i = o[0], a = o[1];\n r.checks.push({\n type: N0.DATA_BOOL,\n field: Ui(a),\n operator: i\n });\n }\n}, {\n name: "metaCompare",\n query: !0,\n regex: "\\\\[\\\\[\\\\s*(" + ge.meta + ")\\\\s*(" + ge.comparatorOp + ")\\\\s*(" + ge.number + ")\\\\s*\\\\]\\\\]",\n populate: function(t, r, n) {\n var o = un(n, 3), i = o[0], a = o[1], s = o[2];\n r.checks.push({\n type: N0.META_COMPARE,\n field: Ui(i),\n operator: a,\n value: parseFloat(s)\n });\n }\n}, {\n name: "nextQuery",\n separator: !0,\n regex: ge.separator,\n populate: function(t, r) {\n var n = t.currentSubject, o = t.edgeCount, i = t.compoundCount, a = t[t.length - 1];\n n != null && (a.subject = n, t.currentSubject = null), a.edgeCount = o, a.compoundCount = i, t.edgeCount = 0, t.compoundCount = 0;\n var s = t[t.length++] = De();\n return s;\n }\n}, {\n name: "directedEdge",\n separator: !0,\n regex: ge.directedEdge,\n populate: function(t, r) {\n if (t.currentSubject == null) {\n var n = De(), o = r, i = De();\n return n.checks.push({\n type: N0.DIRECTED_EDGE,\n source: o,\n target: i\n }), Kn(t, r, n), t.edgeCount++, i;\n } else {\n var a = De(), s = r, l = De();\n return a.checks.push({\n type: N0.NODE_SOURCE,\n source: s,\n target: l\n }), Kn(t, r, a), t.edgeCount++, l;\n }\n }\n}, {\n name: "undirectedEdge",\n separator: !0,\n regex: ge.undirectedEdge,\n populate: function(t, r) {\n if (t.currentSubject == null) {\n var n = De(), o = r, i = De();\n return n.checks.push({\n type: N0.UNDIRECTED_EDGE,\n nodes: [o, i]\n }), Kn(t, r, n), t.edgeCount++, i;\n } else {\n var a = De(), s = r, l = De();\n return a.checks.push({\n type: N0.NODE_NEIGHBOR,\n node: s,\n neighbor: l\n }), Kn(t, r, a), l;\n }\n }\n}, {\n name: "child",\n separator: !0,\n regex: ge.child,\n populate: function(t, r) {\n if (t.currentSubject == null) {\n var n = De(), o = De(), i = t[t.length - 1];\n return n.checks.push({\n type: N0.CHILD,\n parent: i,\n child: o\n }), Kn(t, r, n), t.compoundCount++, o;\n } else if (t.currentSubject === r) {\n var a = De(), s = t[t.length - 1], l = De(), c = De(), p = De(), d = De();\n return a.checks.push({\n type: N0.COMPOUND_SPLIT,\n left: s,\n right: l,\n subject: c\n }), c.checks = r.checks, r.checks = [{\n type: N0.TRUE\n }], d.checks.push({\n type: N0.TRUE\n }), l.checks.push({\n type: N0.PARENT,\n // type is swapped on right side queries\n parent: d,\n child: p\n // empty for now\n }), Kn(t, s, a), t.currentSubject = c, t.compoundCount++, p;\n } else {\n var u = De(), h = De(), b = [{\n type: N0.PARENT,\n parent: u,\n child: h\n }];\n return u.checks = r.checks, r.checks = b, t.compoundCount++, h;\n }\n }\n}, {\n name: "descendant",\n separator: !0,\n regex: ge.descendant,\n populate: function(t, r) {\n if (t.currentSubject == null) {\n var n = De(), o = De(), i = t[t.length - 1];\n return n.checks.push({\n type: N0.DESCENDANT,\n ancestor: i,\n descendant: o\n }), Kn(t, r, n), t.compoundCount++, o;\n } else if (t.currentSubject === r) {\n var a = De(), s = t[t.length - 1], l = De(), c = De(), p = De(), d = De();\n return a.checks.push({\n type: N0.COMPOUND_SPLIT,\n left: s,\n right: l,\n subject: c\n }), c.checks = r.checks, r.checks = [{\n type: N0.TRUE\n }], d.checks.push({\n type: N0.TRUE\n }), l.checks.push({\n type: N0.ANCESTOR,\n // type is swapped on right side queries\n ancestor: d,\n descendant: p\n // empty for now\n }), Kn(t, s, a), t.currentSubject = c, t.compoundCount++, p;\n } else {\n var u = De(), h = De(), b = [{\n type: N0.ANCESTOR,\n ancestor: u,\n descendant: h\n }];\n return u.checks = r.checks, r.checks = b, t.compoundCount++, h;\n }\n }\n}, {\n name: "subject",\n modifier: !0,\n regex: ge.subject,\n populate: function(t, r) {\n if (t.currentSubject != null && t.currentSubject !== r)\n return je("Redefinition of subject in selector `" + t.toString() + "`"), !1;\n t.currentSubject = r;\n var n = t[t.length - 1], o = n.checks[0], i = o == null ? null : o.type;\n i === N0.DIRECTED_EDGE ? o.type = N0.NODE_TARGET : i === N0.UNDIRECTED_EDGE && (o.type = N0.NODE_NEIGHBOR, o.node = o.nodes[1], o.neighbor = o.nodes[0], o.nodes = null);\n }\n}];\nQ8.forEach(function(e) {\n return e.regexObj = new RegExp("^" + e.regex);\n});\nvar Jt1 = function(t) {\n for (var r, n, o, i = 0; i < Q8.length; i++) {\n var a = Q8[i], s = a.name, l = t.match(a.regexObj);\n if (l != null) {\n n = l, r = a, o = s;\n var c = l[0];\n t = t.substring(c.length);\n break;\n }\n }\n return {\n expr: r,\n match: n,\n name: o,\n remaining: t\n };\n}, _t1 = function(t) {\n var r = t.match(/^\\s+/);\n if (r) {\n var n = r[0];\n t = t.substring(n.length);\n }\n return t;\n}, $t1 = function(t) {\n var r = this, n = r.inputText = t, o = r[0] = De();\n for (r.length = 1, n = _t1(n); ; ) {\n var i = Jt1(n);\n if (i.expr == null)\n return je("The selector `" + t + "`is invalid"), !1;\n var a = i.match.slice(1), s = i.expr.populate(r, o, a);\n if (s === !1)\n return !1;\n if (s != null && (o = s), n = i.remaining, n.match(/^\\s*$/))\n break;\n }\n var l = r[r.length - 1];\n r.currentSubject != null && (l.subject = r.currentSubject), l.edgeCount = r.edgeCount, l.compoundCount = r.compoundCount;\n for (var c = 0; c < r.length; c++) {\n var p = r[c];\n if (p.compoundCount > 0 && p.edgeCount > 0)\n return je("The selector `" + t + "` is invalid because it uses both a compound selector and an edge selector"), !1;\n if (p.edgeCount > 1)\n return je("The selector `" + t + "` is invalid because it uses multiple edge selectors"), !1;\n p.edgeCount === 1 && je("The selector `" + t + "` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.");\n }\n return !0;\n}, e21 = function() {\n if (this.toStringCache != null)\n return this.toStringCache;\n for (var t = function(p) {\n return p ?? "";\n }, r = function(p) {\n return U0(p) ? \'"\' + p + \'"\' : t(p);\n }, n = function(p) {\n return " " + p + " ";\n }, o = function(p, d) {\n var u = p.type, h = p.value;\n switch (u) {\n case N0.GROUP: {\n var b = t(h);\n return b.substring(0, b.length - 1);\n }\n case N0.DATA_COMPARE: {\n var M = p.field, C = p.operator;\n return "[" + M + n(t(C)) + r(h) + "]";\n }\n case N0.DATA_BOOL: {\n var g = p.operator, f = p.field;\n return "[" + t(g) + f + "]";\n }\n case N0.DATA_EXIST: {\n var O = p.field;\n return "[" + O + "]";\n }\n case N0.META_COMPARE: {\n var m = p.operator, v = p.field;\n return "[[" + v + n(t(m)) + r(h) + "]]";\n }\n case N0.STATE:\n return h;\n case N0.ID:\n return "#" + h;\n case N0.CLASS:\n return "." + h;\n case N0.PARENT:\n case N0.CHILD:\n return i(p.parent, d) + n(">") + i(p.child, d);\n case N0.ANCESTOR:\n case N0.DESCENDANT:\n return i(p.ancestor, d) + " " + i(p.descendant, d);\n case N0.COMPOUND_SPLIT: {\n var y = i(p.left, d), z = i(p.subject, d), N = i(p.right, d);\n return y + (y.length > 0 ? " " : "") + z + N;\n }\n case N0.TRUE:\n return "";\n }\n }, i = function(p, d) {\n return p.checks.reduce(function(u, h, b) {\n return u + (d === p && b === 0 ? "$" : "") + o(h, d);\n }, "");\n }, a = "", s = 0; s < this.length; s++) {\n var l = this[s];\n a += i(l, l.subject), this.length > 1 && s < this.length - 1 && (a += ", ");\n }\n return this.toStringCache = a, a;\n}, t21 = {\n parse: $t1,\n toString: e21\n}, qO = function(t, r, n) {\n var o, i = U0(t), a = O0(t), s = U0(n), l, c, p = !1, d = !1, u = !1;\n switch (r.indexOf("!") >= 0 && (r = r.replace("!", ""), d = !0), r.indexOf("@") >= 0 && (r = r.replace("@", ""), p = !0), (i || s || p) && (l = !i && !a ? "" : "" + t, c = "" + n), p && (t = l = l.toLowerCase(), n = c = c.toLowerCase()), r) {\n case "*=":\n o = l.indexOf(c) >= 0;\n break;\n case "$=":\n o = l.indexOf(c, l.length - c.length) >= 0;\n break;\n case "^=":\n o = l.indexOf(c) === 0;\n break;\n case "=":\n o = t === n;\n break;\n case ">":\n u = !0, o = t > n;\n break;\n case ">=":\n u = !0, o = t >= n;\n break;\n case "<":\n u = !0, o = t < n;\n break;\n case "<=":\n u = !0, o = t <= n;\n break;\n default:\n o = !1;\n break;\n }\n return d && (t != null || !u) && (o = !o), o;\n}, r21 = function(t, r) {\n switch (r) {\n case "?":\n return !!t;\n case "!":\n return !t;\n case "^":\n return t === void 0;\n }\n}, n21 = function(t) {\n return t !== void 0;\n}, G9 = function(t, r) {\n return t.data(r);\n}, o21 = function(t, r) {\n return t[r]();\n}, dt = [], Ke = function(t, r) {\n return t.checks.every(function(n) {\n return dt[n.type](n, r);\n });\n};\ndt[N0.GROUP] = function(e, t) {\n var r = e.value;\n return r === "*" || r === t.group();\n};\ndt[N0.STATE] = function(e, t) {\n var r = e.value;\n return Kt1(r, t);\n};\ndt[N0.ID] = function(e, t) {\n var r = e.value;\n return t.id() === r;\n};\ndt[N0.CLASS] = function(e, t) {\n var r = e.value;\n return t.hasClass(r);\n};\ndt[N0.META_COMPARE] = function(e, t) {\n var r = e.field, n = e.operator, o = e.value;\n return qO(o21(t, r), n, o);\n};\ndt[N0.DATA_COMPARE] = function(e, t) {\n var r = e.field, n = e.operator, o = e.value;\n return qO(G9(t, r), n, o);\n};\ndt[N0.DATA_BOOL] = function(e, t) {\n var r = e.field, n = e.operator;\n return r21(G9(t, r), n);\n};\ndt[N0.DATA_EXIST] = function(e, t) {\n var r = e.field;\n return e.operator, n21(G9(t, r));\n};\ndt[N0.UNDIRECTED_EDGE] = function(e, t) {\n var r = e.nodes[0], n = e.nodes[1], o = t.source(), i = t.target();\n return Ke(r, o) && Ke(n, i) || Ke(n, o) && Ke(r, i);\n};\ndt[N0.NODE_NEIGHBOR] = function(e, t) {\n return Ke(e.node, t) && t.neighborhood().some(function(r) {\n return r.isNode() && Ke(e.neighbor, r);\n });\n};\ndt[N0.DIRECTED_EDGE] = function(e, t) {\n return Ke(e.source, t.source()) && Ke(e.target, t.target());\n};\ndt[N0.NODE_SOURCE] = function(e, t) {\n return Ke(e.source, t) && t.outgoers().some(function(r) {\n return r.isNode() && Ke(e.target, r);\n });\n};\ndt[N0.NODE_TARGET] = function(e, t) {\n return Ke(e.target, t) && t.incomers().some(function(r) {\n return r.isNode() && Ke(e.source, r);\n });\n};\ndt[N0.CHILD] = function(e, t) {\n return Ke(e.child, t) && Ke(e.parent, t.parent());\n};\ndt[N0.PARENT] = function(e, t) {\n return Ke(e.parent, t) && t.children().some(function(r) {\n return Ke(e.child, r);\n });\n};\ndt[N0.DESCENDANT] = function(e, t) {\n return Ke(e.descendant, t) && t.ancestors().some(function(r) {\n return Ke(e.ancestor, r);\n });\n};\ndt[N0.ANCESTOR] = function(e, t) {\n return Ke(e.ancestor, t) && t.descendants().some(function(r) {\n return Ke(e.descendant, r);\n });\n};\ndt[N0.COMPOUND_SPLIT] = function(e, t) {\n return Ke(e.subject, t) && Ke(e.left, t) && Ke(e.right, t);\n};\ndt[N0.TRUE] = function() {\n return !0;\n};\ndt[N0.COLLECTION] = function(e, t) {\n var r = e.value;\n return r.has(t);\n};\ndt[N0.FILTER] = function(e, t) {\n var r = e.value;\n return r(t);\n};\nvar i21 = function(t) {\n var r = this;\n if (r.length === 1 && r[0].checks.length === 1 && r[0].checks[0].type === N0.ID)\n return t.getElementById(r[0].checks[0].value).collection();\n var n = function(i) {\n for (var a = 0; a < r.length; a++) {\n var s = r[a];\n if (Ke(s, i))\n return !0;\n }\n return !1;\n };\n return r.text() == null && (n = function() {\n return !0;\n }), t.filter(n);\n}, a21 = function(t) {\n for (var r = this, n = 0; n < r.length; n++) {\n var o = r[n];\n if (Ke(o, t))\n return !0;\n }\n return !1;\n}, s21 = {\n matches: a21,\n filter: i21\n}, vo = function(t) {\n this.inputText = t, this.currentSubject = null, this.compoundCount = 0, this.edgeCount = 0, this.length = 0, t == null || U0(t) && t.match(/^\\s*$/) || (I2(t) ? this.addQuery({\n checks: [{\n type: N0.COLLECTION,\n value: t.collection()\n }]\n }) : at(t) ? this.addQuery({\n checks: [{\n type: N0.FILTER,\n value: t\n }]\n }) : U0(t) ? this.parse(t) || (this.invalid = !0) : ct("A selector must be created from a string; found "));\n}, yo = vo.prototype;\n[t21, s21].forEach(function(e) {\n return K0(yo, e);\n});\nyo.text = function() {\n return this.inputText;\n};\nyo.size = function() {\n return this.length;\n};\nyo.eq = function(e) {\n return this[e];\n};\nyo.sameText = function(e) {\n return !this.invalid && !e.invalid && this.text() === e.text();\n};\nyo.addQuery = function(e) {\n this[this.length++] = e;\n};\nyo.selector = yo.toString;\nvar ho = {\n allAre: function(t) {\n var r = new vo(t);\n return this.every(function(n) {\n return r.matches(n);\n });\n },\n is: function(t) {\n var r = new vo(t);\n return this.some(function(n) {\n return r.matches(n);\n });\n },\n some: function(t, r) {\n for (var n = 0; n < this.length; n++) {\n var o = r ? t.apply(r, [this[n], n, this]) : t(this[n], n, this);\n if (o)\n return !0;\n }\n return !1;\n },\n every: function(t, r) {\n for (var n = 0; n < this.length; n++) {\n var o = r ? t.apply(r, [this[n], n, this]) : t(this[n], n, this);\n if (!o)\n return !1;\n }\n return !0;\n },\n same: function(t) {\n if (this === t)\n return !0;\n t = this.cy().collection(t);\n var r = this.length, n = t.length;\n return r !== n ? !1 : r === 1 ? this[0] === t[0] : this.every(function(o) {\n return t.hasElementWithId(o.id());\n });\n },\n anySame: function(t) {\n return t = this.cy().collection(t), this.some(function(r) {\n return t.hasElementWithId(r.id());\n });\n },\n allAreNeighbors: function(t) {\n t = this.cy().collection(t);\n var r = this.neighborhood();\n return t.every(function(n) {\n return r.hasElementWithId(n.id());\n });\n },\n contains: function(t) {\n t = this.cy().collection(t);\n var r = this;\n return t.every(function(n) {\n return r.hasElementWithId(n.id());\n });\n }\n};\nho.allAreNeighbours = ho.allAreNeighbors;\nho.has = ho.contains;\nho.equal = ho.equals = ho.same;\nvar $2 = function(t, r) {\n return function(o, i, a, s) {\n var l = o, c = this, p;\n if (l == null ? p = "" : I2(l) && l.length === 1 && (p = l.id()), c.length === 1 && p) {\n var d = c[0]._private, u = d.traversalCache = d.traversalCache || {}, h = u[r] = u[r] || [], b = fi(p), M = h[b];\n return M || (h[b] = t.call(c, o, i, a, s));\n } else\n return t.call(c, o, i, a, s);\n };\n}, Sa = {\n parent: function(t) {\n var r = [];\n if (this.length === 1) {\n var n = this[0]._private.parent;\n if (n)\n return n;\n }\n for (var o = 0; o < this.length; o++) {\n var i = this[o], a = i._private.parent;\n a && r.push(a);\n }\n return this.spawn(r, !0).filter(t);\n },\n parents: function(t) {\n for (var r = [], n = this.parent(); n.nonempty(); ) {\n for (var o = 0; o < n.length; o++) {\n var i = n[o];\n r.push(i);\n }\n n = n.parent();\n }\n return this.spawn(r, !0).filter(t);\n },\n commonAncestors: function(t) {\n for (var r, n = 0; n < this.length; n++) {\n var o = this[n], i = o.parents();\n r = r || i, r = r.intersect(i);\n }\n return r.filter(t);\n },\n orphans: function(t) {\n return this.stdFilter(function(r) {\n return r.isOrphan();\n }).filter(t);\n },\n nonorphans: function(t) {\n return this.stdFilter(function(r) {\n return r.isChild();\n }).filter(t);\n },\n children: $2(function(e) {\n for (var t = [], r = 0; r < this.length; r++)\n for (var n = this[r], o = n._private.children, i = 0; i < o.length; i++)\n t.push(o[i]);\n return this.spawn(t, !0).filter(e);\n }, "children"),\n siblings: function(t) {\n return this.parent().children().not(this).filter(t);\n },\n isParent: function() {\n var t = this[0];\n if (t)\n return t.isNode() && t._private.children.length !== 0;\n },\n isChildless: function() {\n var t = this[0];\n if (t)\n return t.isNode() && t._private.children.length === 0;\n },\n isChild: function() {\n var t = this[0];\n if (t)\n return t.isNode() && t._private.parent != null;\n },\n isOrphan: function() {\n var t = this[0];\n if (t)\n return t.isNode() && t._private.parent == null;\n },\n descendants: function(t) {\n var r = [];\n function n(o) {\n for (var i = 0; i < o.length; i++) {\n var a = o[i];\n r.push(a), a.children().nonempty() && n(a.children());\n }\n }\n return n(this.children()), this.spawn(r, !0).filter(t);\n }\n};\nfunction j9(e, t, r, n) {\n for (var o = [], i = new Ya(), a = e.cy(), s = a.hasCompoundNodes(), l = 0; l < e.length; l++) {\n var c = e[l];\n r ? o.push(c) : s && n(o, i, c);\n }\n for (; o.length > 0; ) {\n var p = o.shift();\n t(p), i.add(p.id()), s && n(o, i, p);\n }\n return e;\n}\nfunction xO(e, t, r) {\n if (r.isParent())\n for (var n = r._private.children, o = 0; o < n.length; o++) {\n var i = n[o];\n t.has(i.id()) || e.push(i);\n }\n}\nSa.forEachDown = function(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0;\n return j9(this, e, t, xO);\n};\nfunction RO(e, t, r) {\n if (r.isChild()) {\n var n = r._private.parent;\n t.has(n.id()) || e.push(n);\n }\n}\nSa.forEachUp = function(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0;\n return j9(this, e, t, RO);\n};\nfunction l21(e, t, r) {\n RO(e, t, r), xO(e, t, r);\n}\nSa.forEachUpAndDown = function(e) {\n var t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0;\n return j9(this, e, t, l21);\n};\nSa.ancestors = Sa.parents;\nvar I4, BO;\nI4 = BO = {\n data: Ee.data({\n field: "data",\n bindingEvent: "data",\n allowBinding: !0,\n allowSetting: !0,\n settingEvent: "data",\n settingTriggersEvent: !0,\n triggerFnName: "trigger",\n allowGetting: !0,\n immutableKeys: {\n id: !0,\n source: !0,\n target: !0,\n parent: !0\n },\n updateStyle: !0\n }),\n removeData: Ee.removeData({\n field: "data",\n event: "data",\n triggerFnName: "trigger",\n triggerEvent: !0,\n immutableKeys: {\n id: !0,\n source: !0,\n target: !0,\n parent: !0\n },\n updateStyle: !0\n }),\n scratch: Ee.data({\n field: "scratch",\n bindingEvent: "scratch",\n allowBinding: !0,\n allowSetting: !0,\n settingEvent: "scratch",\n settingTriggersEvent: !0,\n triggerFnName: "trigger",\n allowGetting: !0,\n updateStyle: !0\n }),\n removeScratch: Ee.removeData({\n field: "scratch",\n event: "scratch",\n triggerFnName: "trigger",\n triggerEvent: !0,\n updateStyle: !0\n }),\n rscratch: Ee.data({\n field: "rscratch",\n allowBinding: !1,\n allowSetting: !0,\n settingTriggersEvent: !1,\n allowGetting: !0\n }),\n removeRscratch: Ee.removeData({\n field: "rscratch",\n triggerEvent: !1\n }),\n id: function() {\n var t = this[0];\n if (t)\n return t._private.data.id;\n }\n};\nI4.attr = I4.data;\nI4.removeAttr = I4.removeData;\nvar c21 = BO, Pc = {};\nfunction Cp(e) {\n return function(t) {\n var r = this;\n if (t === void 0 && (t = !0), r.length !== 0)\n if (r.isNode() && !r.removed()) {\n for (var n = 0, o = r[0], i = o._private.edges, a = 0; a < i.length; a++) {\n var s = i[a];\n !t && s.isLoop() || (n += e(o, s));\n }\n return n;\n } else\n return;\n };\n}\nK0(Pc, {\n degree: Cp(function(e, t) {\n return t.source().same(t.target()) ? 2 : 1;\n }),\n indegree: Cp(function(e, t) {\n return t.target().same(e) ? 1 : 0;\n }),\n outdegree: Cp(function(e, t) {\n return t.source().same(e) ? 1 : 0;\n })\n});\nfunction Yi(e, t) {\n return function(r) {\n for (var n, o = this.nodes(), i = 0; i < o.length; i++) {\n var a = o[i], s = a[e](r);\n s !== void 0 && (n === void 0 || t(s, n)) && (n = s);\n }\n return n;\n };\n}\nK0(Pc, {\n minDegree: Yi("degree", function(e, t) {\n return e < t;\n }),\n maxDegree: Yi("degree", function(e, t) {\n return e > t;\n }),\n minIndegree: Yi("indegree", function(e, t) {\n return e < t;\n }),\n maxIndegree: Yi("indegree", function(e, t) {\n return e > t;\n }),\n minOutdegree: Yi("outdegree", function(e, t) {\n return e < t;\n }),\n maxOutdegree: Yi("outdegree", function(e, t) {\n return e > t;\n })\n});\nK0(Pc, {\n totalDegree: function(t) {\n for (var r = 0, n = this.nodes(), o = 0; o < n.length; o++)\n r += n[o].degree(t);\n return r;\n }\n});\nvar zr, WO, EO = function(t, r, n) {\n for (var o = 0; o < t.length; o++) {\n var i = t[o];\n if (!i.locked()) {\n var a = i._private.position, s = {\n x: r.x != null ? r.x - a.x : 0,\n y: r.y != null ? r.y - a.y : 0\n };\n i.isParent() && !(s.x === 0 && s.y === 0) && i.children().shift(s, n), i.dirtyBoundingBoxCache();\n }\n }\n}, wh = {\n field: "position",\n bindingEvent: "position",\n allowBinding: !0,\n allowSetting: !0,\n settingEvent: "position",\n settingTriggersEvent: !0,\n triggerFnName: "emitAndNotify",\n allowGetting: !0,\n validKeys: ["x", "y"],\n beforeGet: function(t) {\n t.updateCompoundBounds();\n },\n beforeSet: function(t, r) {\n EO(t, r, !1);\n },\n onSet: function(t) {\n t.dirtyCompoundBoundsCache();\n },\n canSet: function(t) {\n return !t.locked();\n }\n};\nzr = WO = {\n position: Ee.data(wh),\n // position but no notification to renderer\n silentPosition: Ee.data(K0({}, wh, {\n allowBinding: !1,\n allowSetting: !0,\n settingTriggersEvent: !1,\n allowGetting: !1,\n beforeSet: function(t, r) {\n EO(t, r, !0);\n },\n onSet: function(t) {\n t.dirtyCompoundBoundsCache();\n }\n })),\n positions: function(t, r) {\n if (Ce(t))\n r ? this.silentPosition(t) : this.position(t);\n else if (at(t)) {\n var n = t, o = this.cy();\n o.startBatch();\n for (var i = 0; i < this.length; i++) {\n var a = this[i], s = void 0;\n (s = n(a, i)) && (r ? a.silentPosition(s) : a.position(s));\n }\n o.endBatch();\n }\n return this;\n },\n silentPositions: function(t) {\n return this.positions(t, !0);\n },\n shift: function(t, r, n) {\n var o;\n if (Ce(t) ? (o = {\n x: O0(t.x) ? t.x : 0,\n y: O0(t.y) ? t.y : 0\n }, n = r) : U0(t) && O0(r) && (o = {\n x: 0,\n y: 0\n }, o[t] = r), o != null) {\n var i = this.cy();\n i.startBatch();\n for (var a = 0; a < this.length; a++) {\n var s = this[a], l = s.position(), c = {\n x: l.x + o.x,\n y: l.y + o.y\n };\n n ? s.silentPosition(c) : s.position(c);\n }\n i.endBatch();\n }\n return this;\n },\n silentShift: function(t, r) {\n return Ce(t) ? this.shift(t, !0) : U0(t) && O0(r) && this.shift(t, r, !0), this;\n },\n // get/set the rendered (i.e. on screen) positon of the element\n renderedPosition: function(t, r) {\n var n = this[0], o = this.cy(), i = o.zoom(), a = o.pan(), s = Ce(t) ? t : void 0, l = s !== void 0 || r !== void 0 && U0(t);\n if (n && n.isNode())\n if (l)\n for (var c = 0; c < this.length; c++) {\n var p = this[c];\n r !== void 0 ? p.position(t, (r - a[t]) / i) : s !== void 0 && p.position(pO(s, i, a));\n }\n else {\n var d = n.position();\n return s = Dc(d, i, a), t === void 0 ? s : s[t];\n }\n else if (!l)\n return;\n return this;\n },\n // get/set the position relative to the parent\n relativePosition: function(t, r) {\n var n = this[0], o = this.cy(), i = Ce(t) ? t : void 0, a = i !== void 0 || r !== void 0 && U0(t), s = o.hasCompoundNodes();\n if (n && n.isNode())\n if (a)\n for (var l = 0; l < this.length; l++) {\n var c = this[l], p = s ? c.parent() : null, d = p && p.length > 0, u = d;\n d && (p = p[0]);\n var h = u ? p.position() : {\n x: 0,\n y: 0\n };\n r !== void 0 ? c.position(t, r + h[t]) : i !== void 0 && c.position({\n x: i.x + h.x,\n y: i.y + h.y\n });\n }\n else {\n var b = n.position(), M = s ? n.parent() : null, C = M && M.length > 0, g = C;\n C && (M = M[0]);\n var f = g ? M.position() : {\n x: 0,\n y: 0\n };\n return i = {\n x: b.x - f.x,\n y: b.y - f.y\n }, t === void 0 ? i : i[t];\n }\n else if (!a)\n return;\n return this;\n }\n};\nzr.modelPosition = zr.point = zr.position;\nzr.modelPositions = zr.points = zr.positions;\nzr.renderedPoint = zr.renderedPosition;\nzr.relativePoint = zr.relativePosition;\nvar p21 = WO, ua, Eo;\nua = Eo = {};\nEo.renderedBoundingBox = function(e) {\n var t = this.boundingBox(e), r = this.cy(), n = r.zoom(), o = r.pan(), i = t.x1 * n + o.x, a = t.x2 * n + o.x, s = t.y1 * n + o.y, l = t.y2 * n + o.y;\n return {\n x1: i,\n x2: a,\n y1: s,\n y2: l,\n w: a - i,\n h: l - s\n };\n};\nEo.dirtyCompoundBoundsCache = function() {\n var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !1, t = this.cy();\n return !t.styleEnabled() || !t.hasCompoundNodes() ? this : (this.forEachUp(function(r) {\n if (r.isParent()) {\n var n = r._private;\n n.compoundBoundsClean = !1, n.bbCache = null, e || r.emitAndNotify("bounds");\n }\n }), this);\n};\nEo.updateCompoundBounds = function() {\n var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !1, t = this.cy();\n if (!t.styleEnabled() || !t.hasCompoundNodes())\n return this;\n if (!e && t.batching())\n return this;\n function r(a) {\n if (!a.isParent())\n return;\n var s = a._private, l = a.children(), c = a.pstyle("compound-sizing-wrt-labels").value === "include", p = {\n width: {\n val: a.pstyle("min-width").pfValue,\n left: a.pstyle("min-width-bias-left"),\n right: a.pstyle("min-width-bias-right")\n },\n height: {\n val: a.pstyle("min-height").pfValue,\n top: a.pstyle("min-height-bias-top"),\n bottom: a.pstyle("min-height-bias-bottom")\n }\n }, d = l.boundingBox({\n includeLabels: c,\n includeOverlays: !1,\n // updating the compound bounds happens outside of the regular\n // cache cycle (i.e. before fired events)\n useCache: !1\n }), u = s.position;\n (d.w === 0 || d.h === 0) && (d = {\n w: a.pstyle("width").pfValue,\n h: a.pstyle("height").pfValue\n }, d.x1 = u.x - d.w / 2, d.x2 = u.x + d.w / 2, d.y1 = u.y - d.h / 2, d.y2 = u.y + d.h / 2);\n function h(W, T, x) {\n var E = 0, L = 0, w = T + x;\n return W > 0 && w > 0 && (E = T / w * W, L = x / w * W), {\n biasDiff: E,\n biasComplementDiff: L\n };\n }\n function b(W, T, x, E) {\n if (x.units === "%")\n switch (E) {\n case "width":\n return W > 0 ? x.pfValue * W : 0;\n case "height":\n return T > 0 ? x.pfValue * T : 0;\n case "average":\n return W > 0 && T > 0 ? x.pfValue * (W + T) / 2 : 0;\n case "min":\n return W > 0 && T > 0 ? W > T ? x.pfValue * T : x.pfValue * W : 0;\n case "max":\n return W > 0 && T > 0 ? W > T ? x.pfValue * W : x.pfValue * T : 0;\n default:\n return 0;\n }\n else\n return x.units === "px" ? x.pfValue : 0;\n }\n var M = p.width.left.value;\n p.width.left.units === "px" && p.width.val > 0 && (M = M * 100 / p.width.val);\n var C = p.width.right.value;\n p.width.right.units === "px" && p.width.val > 0 && (C = C * 100 / p.width.val);\n var g = p.height.top.value;\n p.height.top.units === "px" && p.height.val > 0 && (g = g * 100 / p.height.val);\n var f = p.height.bottom.value;\n p.height.bottom.units === "px" && p.height.val > 0 && (f = f * 100 / p.height.val);\n var O = h(p.width.val - d.w, M, C), m = O.biasDiff, v = O.biasComplementDiff, y = h(p.height.val - d.h, g, f), z = y.biasDiff, N = y.biasComplementDiff;\n s.autoPadding = b(d.w, d.h, a.pstyle("padding"), a.pstyle("padding-relative-to").value), s.autoWidth = Math.max(d.w, p.width.val), u.x = (-m + d.x1 + d.x2 + v) / 2, s.autoHeight = Math.max(d.h, p.height.val), u.y = (-z + d.y1 + d.y2 + N) / 2;\n }\n for (var n = 0; n < this.length; n++) {\n var o = this[n], i = o._private;\n (!i.compoundBoundsClean || e) && (r(o), t.batching() || (i.compoundBoundsClean = !0));\n }\n return this;\n};\nvar Z2 = function(t) {\n return t === 1 / 0 || t === -1 / 0 ? 0 : t;\n}, ur = function(t, r, n, o, i) {\n o - r === 0 || i - n === 0 || r == null || n == null || o == null || i == null || (t.x1 = r < t.x1 ? r : t.x1, t.x2 = o > t.x2 ? o : t.x2, t.y1 = n < t.y1 ? n : t.y1, t.y2 = i > t.y2 ? i : t.y2, t.w = t.x2 - t.x1, t.h = t.y2 - t.y1);\n}, ei = function(t, r) {\n return r == null ? t : ur(t, r.x1, r.y1, r.x2, r.y2);\n}, w3 = function(t, r, n) {\n return hr(t, r, n);\n}, L5 = function(t, r, n) {\n if (!r.cy().headless()) {\n var o = r._private, i = o.rstyle, a = i.arrowWidth / 2, s = r.pstyle(n + "-arrow-shape").value, l, c;\n if (s !== "none") {\n n === "source" ? (l = i.srcX, c = i.srcY) : n === "target" ? (l = i.tgtX, c = i.tgtY) : (l = i.midX, c = i.midY);\n var p = o.arrowBounds = o.arrowBounds || {}, d = p[n] = p[n] || {};\n d.x1 = l - a, d.y1 = c - a, d.x2 = l + a, d.y2 = c + a, d.w = d.x2 - d.x1, d.h = d.y2 - d.y1, tl(d, 1), ur(t, d.x1, d.y1, d.x2, d.y2);\n }\n }\n}, Op = function(t, r, n) {\n if (!r.cy().headless()) {\n var o;\n n ? o = n + "-" : o = "";\n var i = r._private, a = i.rstyle, s = r.pstyle(o + "label").strValue;\n if (s) {\n var l = r.pstyle("text-halign"), c = r.pstyle("text-valign"), p = w3(a, "labelWidth", n), d = w3(a, "labelHeight", n), u = w3(a, "labelX", n), h = w3(a, "labelY", n), b = r.pstyle(o + "text-margin-x").pfValue, M = r.pstyle(o + "text-margin-y").pfValue, C = r.isEdge(), g = r.pstyle(o + "text-rotation"), f = r.pstyle("text-outline-width").pfValue, O = r.pstyle("text-border-width").pfValue, m = O / 2, v = r.pstyle("text-background-padding").pfValue, y = 2, z = d, N = p, W = N / 2, T = z / 2, x, E, L, w;\n if (C)\n x = u - W, E = u + W, L = h - T, w = h + T;\n else {\n switch (l.value) {\n case "left":\n x = u - N, E = u;\n break;\n case "center":\n x = u - W, E = u + W;\n break;\n case "right":\n x = u, E = u + N;\n break;\n }\n switch (c.value) {\n case "top":\n L = h - z, w = h;\n break;\n case "center":\n L = h - T, w = h + T;\n break;\n case "bottom":\n L = h, w = h + z;\n break;\n }\n }\n x += b - Math.max(f, m) - v - y, E += b + Math.max(f, m) + v + y, L += M - Math.max(f, m) - v - y, w += M + Math.max(f, m) + v + y;\n var q = n || "main", S = i.labelBounds, B = S[q] = S[q] || {};\n B.x1 = x, B.y1 = L, B.x2 = E, B.y2 = w, B.w = E - x, B.h = w - L;\n var I = C && g.strValue === "autorotate", P = g.pfValue != null && g.pfValue !== 0;\n if (I || P) {\n var k = I ? w3(i.rstyle, "labelAngle", n) : g.pfValue, K = Math.cos(k), $ = Math.sin(k), j = (x + E) / 2, r1 = (L + w) / 2;\n if (!C) {\n switch (l.value) {\n case "left":\n j = E;\n break;\n case "right":\n j = x;\n break;\n }\n switch (c.value) {\n case "top":\n r1 = w;\n break;\n case "bottom":\n r1 = L;\n break;\n }\n }\n var a1 = function(V, Q) {\n return V = V - j, Q = Q - r1, {\n x: V * K - Q * $ + j,\n y: V * $ + Q * K + r1\n };\n }, _ = a1(x, L), Y = a1(x, w), D = a1(E, L), H = a1(E, w);\n x = Math.min(_.x, Y.x, D.x, H.x), E = Math.max(_.x, Y.x, D.x, H.x), L = Math.min(_.y, Y.y, D.y, H.y), w = Math.max(_.y, Y.y, D.y, H.y);\n }\n var G = q + "Rot", J = S[G] = S[G] || {};\n J.x1 = x, J.y1 = L, J.x2 = E, J.y2 = w, J.w = E - x, J.h = w - L, ur(t, x, L, E, w), ur(i.labelBounds.all, x, L, E, w);\n }\n return t;\n }\n}, d21 = function(t, r) {\n var n = t._private.cy, o = n.styleEnabled(), i = n.headless(), a = w2(), s = t._private, l = t.isNode(), c = t.isEdge(), p, d, u, h, b, M, C = s.rstyle, g = l && o ? t.pstyle("bounds-expansion").pfValue : [0], f = function(V) {\n return V.pstyle("display").value !== "none";\n }, O = !o || f(t) && (!c || f(t.source()) && f(t.target()));\n if (O) {\n var m = 0, v = 0;\n o && r.includeOverlays && (m = t.pstyle("overlay-opacity").value, m !== 0 && (v = t.pstyle("overlay-padding").value));\n var y = 0, z = 0;\n if (o && (y = t.pstyle("width").pfValue, z = y / 2), l && r.includeNodes) {\n var N = t.position();\n b = N.x, M = N.y;\n var W = t.outerWidth(), T = W / 2, x = t.outerHeight(), E = x / 2;\n p = b - T, d = b + T, u = M - E, h = M + E, ur(a, p, u, d, h);\n } else if (c && r.includeEdges)\n if (o && !i) {\n var L = t.pstyle("curve-style").strValue;\n if (p = Math.min(C.srcX, C.midX, C.tgtX), d = Math.max(C.srcX, C.midX, C.tgtX), u = Math.min(C.srcY, C.midY, C.tgtY), h = Math.max(C.srcY, C.midY, C.tgtY), p -= z, d += z, u -= z, h += z, ur(a, p, u, d, h), L === "haystack") {\n var w = C.haystackPts;\n if (w && w.length === 2) {\n if (p = w[0].x, u = w[0].y, d = w[1].x, h = w[1].y, p > d) {\n var q = p;\n p = d, d = q;\n }\n if (u > h) {\n var S = u;\n u = h, h = S;\n }\n ur(a, p - z, u - z, d + z, h + z);\n }\n } else if (L === "bezier" || L === "unbundled-bezier" || L === "segments" || L === "taxi") {\n var B;\n switch (L) {\n case "bezier":\n case "unbundled-bezier":\n B = C.bezierPts;\n break;\n case "segments":\n case "taxi":\n B = C.linePts;\n break;\n }\n if (B != null)\n for (var I = 0; I < B.length; I++) {\n var P = B[I];\n p = P.x - z, d = P.x + z, u = P.y - z, h = P.y + z, ur(a, p, u, d, h);\n }\n }\n } else {\n var k = t.source(), K = k.position(), $ = t.target(), j = $.position();\n if (p = K.x, d = j.x, u = K.y, h = j.y, p > d) {\n var r1 = p;\n p = d, d = r1;\n }\n if (u > h) {\n var a1 = u;\n u = h, h = a1;\n }\n p -= z, d += z, u -= z, h += z, ur(a, p, u, d, h);\n }\n if (o && r.includeEdges && c && (L5(a, t, "mid-source"), L5(a, t, "mid-target"), L5(a, t, "source"), L5(a, t, "target")), o) {\n var _ = t.pstyle("ghost").value === "yes";\n if (_) {\n var Y = t.pstyle("ghost-offset-x").pfValue, D = t.pstyle("ghost-offset-y").pfValue;\n ur(a, a.x1 + Y, a.y1 + D, a.x2 + Y, a.y2 + D);\n }\n }\n var H = s.bodyBounds = s.bodyBounds || {};\n ph(H, a), fp(H, g), tl(H, 1), o && (p = a.x1, d = a.x2, u = a.y1, h = a.y2, ur(a, p - v, u - v, d + v, h + v));\n var G = s.overlayBounds = s.overlayBounds || {};\n ph(G, a), fp(G, g), tl(G, 1);\n var J = s.labelBounds = s.labelBounds || {};\n J.all != null ? De1(J.all) : J.all = w2(), o && r.includeLabels && (r.includeMainLabels && Op(a, t, null), c && (r.includeSourceLabels && Op(a, t, "source"), r.includeTargetLabels && Op(a, t, "target")));\n }\n return a.x1 = Z2(a.x1), a.y1 = Z2(a.y1), a.x2 = Z2(a.x2), a.y2 = Z2(a.y2), a.w = Z2(a.x2 - a.x1), a.h = Z2(a.y2 - a.y1), a.w > 0 && a.h > 0 && O && (fp(a, g), tl(a, 1)), a;\n}, SO = function(t) {\n var r = 0, n = function(a) {\n return (a ? 1 : 0) << r++;\n }, o = 0;\n return o += n(t.incudeNodes), o += n(t.includeEdges), o += n(t.includeLabels), o += n(t.includeMainLabels), o += n(t.includeSourceLabels), o += n(t.includeTargetLabels), o += n(t.includeOverlays), o;\n}, kO = function(t) {\n if (t.isEdge()) {\n var r = t.source().position(), n = t.target().position(), o = function(a) {\n return Math.round(a);\n };\n return ae1([o(r.x), o(r.y), o(n.x), o(n.y)]);\n } else\n return 0;\n}, qh = function(t, r) {\n var n = t._private, o, i = t.isEdge(), a = r == null ? xh : SO(r), s = a === xh, l = kO(t), c = n.bbCachePosKey === l, p = r.useCache && c, d = function(M) {\n return M._private.bbCache == null || M._private.styleDirty;\n }, u = !p || d(t) || i && d(t.source()) || d(t.target());\n if (u ? (c || t.recalculateRenderedStyle(p), o = d21(t, T4), n.bbCache = o, n.bbCachePosKey = l) : o = n.bbCache, !s) {\n var h = t.isNode();\n o = w2(), (r.includeNodes && h || r.includeEdges && !h) && (r.includeOverlays ? ei(o, n.overlayBounds) : ei(o, n.bodyBounds)), r.includeLabels && (r.includeMainLabels && (!i || r.includeSourceLabels && r.includeTargetLabels) ? ei(o, n.labelBounds.all) : (r.includeMainLabels && ei(o, n.labelBounds.mainRot), r.includeSourceLabels && ei(o, n.labelBounds.sourceRot), r.includeTargetLabels && ei(o, n.labelBounds.targetRot))), o.w = o.x2 - o.x1, o.h = o.y2 - o.y1;\n }\n return o;\n}, T4 = {\n includeNodes: !0,\n includeEdges: !0,\n includeLabels: !0,\n includeMainLabels: !0,\n includeSourceLabels: !0,\n includeTargetLabels: !0,\n includeOverlays: !0,\n useCache: !0\n}, xh = SO(T4), Rh = Ut(T4);\nEo.boundingBox = function(e) {\n var t;\n if (this.length === 1 && this[0]._private.bbCache != null && !this[0]._private.styleDirty && (e === void 0 || e.useCache === void 0 || e.useCache === !0))\n e === void 0 ? e = T4 : e = Rh(e), t = qh(this[0], e);\n else {\n t = w2(), e = e || T4;\n var r = Rh(e), n = this, o = n.cy(), i = o.styleEnabled();\n if (i)\n for (var a = 0; a < n.length; a++) {\n var s = n[a], l = s._private, c = kO(s), p = l.bbCachePosKey === c, d = r.useCache && p && !l.styleDirty;\n s.recalculateRenderedStyle(d);\n }\n this.updateCompoundBounds(!e.useCache);\n for (var u = 0; u < n.length; u++) {\n var h = n[u];\n ei(t, qh(h, r));\n }\n }\n return t.x1 = Z2(t.x1), t.y1 = Z2(t.y1), t.x2 = Z2(t.x2), t.y2 = Z2(t.y2), t.w = Z2(t.x2 - t.x1), t.h = Z2(t.y2 - t.y1), t;\n};\nEo.dirtyBoundingBoxCache = function() {\n for (var e = 0; e < this.length; e++) {\n var t = this[e]._private;\n t.bbCache = null, t.bbCachePosKey = null, t.bodyBounds = null, t.overlayBounds = null, t.labelBounds.all = null, t.labelBounds.source = null, t.labelBounds.target = null, t.labelBounds.main = null, t.labelBounds.sourceRot = null, t.labelBounds.targetRot = null, t.labelBounds.mainRot = null, t.arrowBounds.source = null, t.arrowBounds.target = null, t.arrowBounds["mid-source"] = null, t.arrowBounds["mid-target"] = null;\n }\n return this.emitAndNotify("bounds"), this;\n};\nEo.boundingBoxAt = function(e) {\n var t = this.nodes(), r = this.cy(), n = r.hasCompoundNodes(), o = r.collection();\n if (n && (o = t.filter(function(c) {\n return c.isParent();\n }), t = t.not(o)), Ce(e)) {\n var i = e;\n e = function() {\n return i;\n };\n }\n var a = function(p, d) {\n return p._private.bbAtOldPos = e(p, d);\n }, s = function(p) {\n return p._private.bbAtOldPos;\n };\n r.startBatch(), t.forEach(a).silentPositions(e), n && (o.dirtyCompoundBoundsCache(), o.dirtyBoundingBoxCache(), o.updateCompoundBounds(!0));\n var l = Te1(this.boundingBox({\n useCache: !1\n }));\n return t.silentPositions(s), n && (o.dirtyCompoundBoundsCache(), o.dirtyBoundingBoxCache(), o.updateCompoundBounds(!0)), r.endBatch(), l;\n};\nua.boundingbox = ua.bb = ua.boundingBox;\nua.renderedBoundingbox = ua.renderedBoundingBox;\nvar A21 = Eo, F3, bs;\nF3 = bs = {};\nvar NO = function(t) {\n t.uppercaseName = ah(t.name), t.autoName = "auto" + t.uppercaseName, t.labelName = "label" + t.uppercaseName, t.outerName = "outer" + t.uppercaseName, t.uppercaseOuterName = ah(t.outerName), F3[t.name] = function() {\n var n = this[0], o = n._private, i = o.cy, a = i._private.styleEnabled;\n if (n)\n if (a) {\n if (n.isParent())\n return n.updateCompoundBounds(), o[t.autoName] || 0;\n var s = n.pstyle(t.name);\n switch (s.strValue) {\n case "label":\n return n.recalculateRenderedStyle(), o.rstyle[t.labelName] || 0;\n default:\n return s.pfValue;\n }\n } else\n return 1;\n }, F3["outer" + t.uppercaseName] = function() {\n var n = this[0], o = n._private, i = o.cy, a = i._private.styleEnabled;\n if (n)\n if (a) {\n var s = n[t.name](), l = n.pstyle("border-width").pfValue, c = 2 * n.padding();\n return s + l + c;\n } else\n return 1;\n }, F3["rendered" + t.uppercaseName] = function() {\n var n = this[0];\n if (n) {\n var o = n[t.name]();\n return o * this.cy().zoom();\n }\n }, F3["rendered" + t.uppercaseOuterName] = function() {\n var n = this[0];\n if (n) {\n var o = n[t.outerName]();\n return o * this.cy().zoom();\n }\n };\n};\nNO({\n name: "width"\n});\nNO({\n name: "height"\n});\nbs.padding = function() {\n var e = this[0], t = e._private;\n return e.isParent() ? (e.updateCompoundBounds(), t.autoPadding !== void 0 ? t.autoPadding : e.pstyle("padding").pfValue) : e.pstyle("padding").pfValue;\n};\nbs.paddedHeight = function() {\n var e = this[0];\n return e.height() + 2 * e.padding();\n};\nbs.paddedWidth = function() {\n var e = this[0];\n return e.width() + 2 * e.padding();\n};\nvar u21 = bs, b21 = function(t, r) {\n if (t.isEdge())\n return r(t);\n}, h21 = function(t, r) {\n if (t.isEdge()) {\n var n = t.cy();\n return Dc(r(t), n.zoom(), n.pan());\n }\n}, M21 = function(t, r) {\n if (t.isEdge()) {\n var n = t.cy(), o = n.pan(), i = n.zoom();\n return r(t).map(function(a) {\n return Dc(a, i, o);\n });\n }\n}, f21 = function(t) {\n return t.renderer().getControlPoints(t);\n}, g21 = function(t) {\n return t.renderer().getSegmentPoints(t);\n}, z21 = function(t) {\n return t.renderer().getSourceEndpoint(t);\n}, C21 = function(t) {\n return t.renderer().getTargetEndpoint(t);\n}, O21 = function(t) {\n return t.renderer().getEdgeMidpoint(t);\n}, Bh = {\n controlPoints: {\n get: f21,\n mult: !0\n },\n segmentPoints: {\n get: g21,\n mult: !0\n },\n sourceEndpoint: {\n get: z21\n },\n targetEndpoint: {\n get: C21\n },\n midpoint: {\n get: O21\n }\n}, m21 = function(t) {\n return "rendered" + t[0].toUpperCase() + t.substr(1);\n}, v21 = Object.keys(Bh).reduce(function(e, t) {\n var r = Bh[t], n = m21(t);\n return e[t] = function() {\n return b21(this, r.get);\n }, r.mult ? e[n] = function() {\n return M21(this, r.get);\n } : e[n] = function() {\n return h21(this, r.get);\n }, e;\n}, {}), y21 = K0({}, p21, A21, u21, v21);\n/*!\nEvent object based on jQuery events, MIT license\n\nhttps://jquery.org/license/\nhttps://tldrlegal.com/license/mit-license\nhttps://github.com/jquery/jquery/blob/master/src/event.js\n*/\nvar IO = function(t, r) {\n this.recycle(t, r);\n};\nfunction q3() {\n return !1;\n}\nfunction w5() {\n return !0;\n}\nIO.prototype = {\n instanceString: function() {\n return "event";\n },\n recycle: function(t, r) {\n if (this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = q3, t != null && t.preventDefault ? (this.type = t.type, this.isDefaultPrevented = t.defaultPrevented ? w5 : q3) : t != null && t.type ? r = t : this.type = t, r != null && (this.originalEvent = r.originalEvent, this.type = r.type != null ? r.type : this.type, this.cy = r.cy, this.target = r.target, this.position = r.position, this.renderedPosition = r.renderedPosition, this.namespace = r.namespace, this.layout = r.layout), this.cy != null && this.position != null && this.renderedPosition == null) {\n var n = this.position, o = this.cy.zoom(), i = this.cy.pan();\n this.renderedPosition = {\n x: n.x * o + i.x,\n y: n.y * o + i.y\n };\n }\n this.timeStamp = t && t.timeStamp || Date.now();\n },\n preventDefault: function() {\n this.isDefaultPrevented = w5;\n var t = this.originalEvent;\n t && t.preventDefault && t.preventDefault();\n },\n stopPropagation: function() {\n this.isPropagationStopped = w5;\n var t = this.originalEvent;\n t && t.stopPropagation && t.stopPropagation();\n },\n stopImmediatePropagation: function() {\n this.isImmediatePropagationStopped = w5, this.stopPropagation();\n },\n isDefaultPrevented: q3,\n isPropagationStopped: q3,\n isImmediatePropagationStopped: q3\n};\nvar TO = /^([^.]+)(\\.(?:[^.]+))?$/, L21 = ".*", DO = {\n qualifierCompare: function(t, r) {\n return t === r;\n },\n eventMatches: function() {\n return !0;\n },\n addEventFields: function() {\n },\n callbackContext: function(t) {\n return t;\n },\n beforeEmit: function() {\n },\n afterEmit: function() {\n },\n bubble: function() {\n return !1;\n },\n parent: function() {\n return null;\n },\n context: null\n}, Wh = Object.keys(DO), w21 = {};\nfunction Vc() {\n for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : w21, t = arguments.length > 1 ? arguments[1] : void 0, r = 0; r < Wh.length; r++) {\n var n = Wh[r];\n this[n] = e[n] || DO[n];\n }\n this.context = t || this.context, this.listeners = [], this.emitting = 0;\n}\nvar Lo = Vc.prototype, HO = function(t, r, n, o, i, a, s) {\n at(o) && (i = o, o = null), s && (a == null ? a = s : a = K0({}, a, s));\n for (var l = Ve(n) ? n : n.split(/\\s+/), c = 0; c < l.length; c++) {\n var p = l[c];\n if (!Oo(p)) {\n var d = p.match(TO);\n if (d) {\n var u = d[1], h = d[2] ? d[2] : null, b = r(t, p, u, h, o, i, a);\n if (b === !1)\n break;\n }\n }\n }\n}, Eh = function(t, r) {\n return t.addEventFields(t.context, r), new IO(r.type, r);\n}, q21 = function(t, r, n) {\n if (P01(n)) {\n r(t, n);\n return;\n } else if (Ce(n)) {\n r(t, Eh(t, n));\n return;\n }\n for (var o = Ve(n) ? n : n.split(/\\s+/), i = 0; i < o.length; i++) {\n var a = o[i];\n if (!Oo(a)) {\n var s = a.match(TO);\n if (s) {\n var l = s[1], c = s[2] ? s[2] : null, p = Eh(t, {\n type: l,\n namespace: c,\n target: t.context\n });\n r(t, p);\n }\n }\n }\n};\nLo.on = Lo.addListener = function(e, t, r, n, o) {\n return HO(this, function(i, a, s, l, c, p, d) {\n at(p) && i.listeners.push({\n event: a,\n // full event string\n callback: p,\n // callback to run\n type: s,\n // the event type (e.g. \'click\')\n namespace: l,\n // the event namespace (e.g. ".foo")\n qualifier: c,\n // a restriction on whether to match this emitter\n conf: d\n // additional configuration\n });\n }, e, t, r, n, o), this;\n};\nLo.one = function(e, t, r, n) {\n return this.on(e, t, r, n, {\n one: !0\n });\n};\nLo.removeListener = Lo.off = function(e, t, r, n) {\n var o = this;\n this.emitting !== 0 && (this.listeners = de1(this.listeners));\n for (var i = this.listeners, a = function(c) {\n var p = i[c];\n HO(o, function(d, u, h, b, M, C) {\n if ((p.type === h || e === "*") && (!b && p.namespace !== ".*" || p.namespace === b) && (!M || d.qualifierCompare(p.qualifier, M)) && (!C || p.callback === C))\n return i.splice(c, 1), !1;\n }, e, t, r, n);\n }, s = i.length - 1; s >= 0; s--)\n a(s);\n return this;\n};\nLo.removeAllListeners = function() {\n return this.removeListener("*");\n};\nLo.emit = Lo.trigger = function(e, t, r) {\n var n = this.listeners, o = n.length;\n return this.emitting++, Ve(t) || (t = [t]), q21(this, function(i, a) {\n r != null && (n = [{\n event: a.event,\n type: a.type,\n namespace: a.namespace,\n callback: r\n }], o = n.length);\n for (var s = function(p) {\n var d = n[p];\n if (d.type === a.type && (!d.namespace || d.namespace === a.namespace || d.namespace === L21) && i.eventMatches(i.context, d, a)) {\n var u = [a];\n t != null && ue1(u, t), i.beforeEmit(i.context, d, a), d.conf && d.conf.one && (i.listeners = i.listeners.filter(function(M) {\n return M !== d;\n }));\n var h = i.callbackContext(i.context, d, a), b = d.callback.apply(h, u);\n i.afterEmit(i.context, d, a), b === !1 && (a.stopPropagation(), a.preventDefault());\n }\n }, l = 0; l < o; l++)\n s(l);\n i.bubble(i.context) && !a.isPropagationStopped() && i.parent(i.context).emit(a, t);\n }, e), this.emitting--, this;\n};\nvar x21 = {\n qualifierCompare: function(t, r) {\n return t == null || r == null ? t == null && r == null : t.sameText(r);\n },\n eventMatches: function(t, r, n) {\n var o = r.qualifier;\n return o != null ? t !== n.target && As(n.target) && o.matches(n.target) : !0;\n },\n addEventFields: function(t, r) {\n r.cy = t.cy(), r.target = t;\n },\n callbackContext: function(t, r, n) {\n return r.qualifier != null ? n.target : t;\n },\n beforeEmit: function(t, r) {\n r.conf && r.conf.once && r.conf.onceCollection.removeListener(r.event, r.qualifier, r.callback);\n },\n bubble: function() {\n return !0;\n },\n parent: function(t) {\n return t.isChild() ? t.parent() : t.cy();\n }\n}, q5 = function(t) {\n return U0(t) ? new vo(t) : t;\n}, PO = {\n createEmitter: function() {\n for (var t = 0; t < this.length; t++) {\n var r = this[t], n = r._private;\n n.emitter || (n.emitter = new Vc(x21, r));\n }\n return this;\n },\n emitter: function() {\n return this._private.emitter;\n },\n on: function(t, r, n) {\n for (var o = q5(r), i = 0; i < this.length; i++) {\n var a = this[i];\n a.emitter().on(t, o, n);\n }\n return this;\n },\n removeListener: function(t, r, n) {\n for (var o = q5(r), i = 0; i < this.length; i++) {\n var a = this[i];\n a.emitter().removeListener(t, o, n);\n }\n return this;\n },\n removeAllListeners: function() {\n for (var t = 0; t < this.length; t++) {\n var r = this[t];\n r.emitter().removeAllListeners();\n }\n return this;\n },\n one: function(t, r, n) {\n for (var o = q5(r), i = 0; i < this.length; i++) {\n var a = this[i];\n a.emitter().one(t, o, n);\n }\n return this;\n },\n once: function(t, r, n) {\n for (var o = q5(r), i = 0; i < this.length; i++) {\n var a = this[i];\n a.emitter().on(t, o, n, {\n once: !0,\n onceCollection: this\n });\n }\n },\n emit: function(t, r) {\n for (var n = 0; n < this.length; n++) {\n var o = this[n];\n o.emitter().emit(t, r);\n }\n return this;\n },\n emitAndNotify: function(t, r) {\n if (this.length !== 0)\n return this.cy().notify(t, this), this.emit(t, r), this;\n }\n};\nEe.eventAliasesOn(PO);\nvar VO = {\n nodes: function(t) {\n return this.filter(function(r) {\n return r.isNode();\n }).filter(t);\n },\n edges: function(t) {\n return this.filter(function(r) {\n return r.isEdge();\n }).filter(t);\n },\n // internal helper to get nodes and edges as separate collections with single iteration over elements\n byGroup: function() {\n for (var t = this.spawn(), r = this.spawn(), n = 0; n < this.length; n++) {\n var o = this[n];\n o.isNode() ? t.push(o) : r.push(o);\n }\n return {\n nodes: t,\n edges: r\n };\n },\n filter: function(t, r) {\n if (t === void 0)\n return this;\n if (U0(t) || I2(t))\n return new vo(t).filter(this);\n if (at(t)) {\n for (var n = this.spawn(), o = this, i = 0; i < o.length; i++) {\n var a = o[i], s = r ? t.apply(r, [a, i, o]) : t(a, i, o);\n s && n.push(a);\n }\n return n;\n }\n return this.spawn();\n },\n not: function(t) {\n if (t) {\n U0(t) && (t = this.filter(t));\n for (var r = this.spawn(), n = 0; n < this.length; n++) {\n var o = this[n], i = t.has(o);\n i || r.push(o);\n }\n return r;\n } else\n return this;\n },\n absoluteComplement: function() {\n var t = this.cy();\n return t.mutableElements().not(this);\n },\n intersect: function(t) {\n if (U0(t)) {\n var r = t;\n return this.filter(r);\n }\n for (var n = this.spawn(), o = this, i = t, a = this.length < t.length, s = a ? o : i, l = a ? i : o, c = 0; c < s.length; c++) {\n var p = s[c];\n l.has(p) && n.push(p);\n }\n return n;\n },\n xor: function(t) {\n var r = this._private.cy;\n U0(t) && (t = r.$(t));\n var n = this.spawn(), o = this, i = t, a = function(l, c) {\n for (var p = 0; p < l.length; p++) {\n var d = l[p], u = d._private.data.id, h = c.hasElementWithId(u);\n h || n.push(d);\n }\n };\n return a(o, i), a(i, o), n;\n },\n diff: function(t) {\n var r = this._private.cy;\n U0(t) && (t = r.$(t));\n var n = this.spawn(), o = this.spawn(), i = this.spawn(), a = this, s = t, l = function(p, d, u) {\n for (var h = 0; h < p.length; h++) {\n var b = p[h], M = b._private.data.id, C = d.hasElementWithId(M);\n C ? i.merge(b) : u.push(b);\n }\n };\n return l(a, s, n), l(s, a, o), {\n left: n,\n right: o,\n both: i\n };\n },\n add: function(t) {\n var r = this._private.cy;\n if (!t)\n return this;\n if (U0(t)) {\n var n = t;\n t = r.mutableElements().filter(n);\n }\n for (var o = this.spawnSelf(), i = 0; i < t.length; i++) {\n var a = t[i], s = !this.has(a);\n s && o.push(a);\n }\n return o;\n },\n // in place merge on calling collection\n merge: function(t) {\n var r = this._private, n = r.cy;\n if (!t)\n return this;\n if (t && U0(t)) {\n var o = t;\n t = n.mutableElements().filter(o);\n }\n for (var i = r.map, a = 0; a < t.length; a++) {\n var s = t[a], l = s._private.data.id, c = !i.has(l);\n if (c) {\n var p = this.length++;\n this[p] = s, i.set(l, {\n ele: s,\n index: p\n });\n }\n }\n return this;\n },\n unmergeAt: function(t) {\n var r = this[t], n = r.id(), o = this._private, i = o.map;\n this[t] = void 0, i.delete(n);\n var a = t === this.length - 1;\n if (this.length > 1 && !a) {\n var s = this.length - 1, l = this[s], c = l._private.data.id;\n this[s] = void 0, this[t] = l, i.set(c, {\n ele: l,\n index: t\n });\n }\n return this.length--, this;\n },\n // remove single ele in place in calling collection\n unmergeOne: function(t) {\n t = t[0];\n var r = this._private, n = t._private.data.id, o = r.map, i = o.get(n);\n if (!i)\n return this;\n var a = i.index;\n return this.unmergeAt(a), this;\n },\n // remove eles in place on calling collection\n unmerge: function(t) {\n var r = this._private.cy;\n if (!t)\n return this;\n if (t && U0(t)) {\n var n = t;\n t = r.mutableElements().filter(n);\n }\n for (var o = 0; o < t.length; o++)\n this.unmergeOne(t[o]);\n return this;\n },\n unmergeBy: function(t) {\n for (var r = this.length - 1; r >= 0; r--) {\n var n = this[r];\n t(n) && this.unmergeAt(r);\n }\n return this;\n },\n map: function(t, r) {\n for (var n = [], o = this, i = 0; i < o.length; i++) {\n var a = o[i], s = r ? t.apply(r, [a, i, o]) : t(a, i, o);\n n.push(s);\n }\n return n;\n },\n reduce: function(t, r) {\n for (var n = r, o = this, i = 0; i < o.length; i++)\n n = t(n, o[i], i, o);\n return n;\n },\n max: function(t, r) {\n for (var n = -1 / 0, o, i = this, a = 0; a < i.length; a++) {\n var s = i[a], l = r ? t.apply(r, [s, a, i]) : t(s, a, i);\n l > n && (n = l, o = s);\n }\n return {\n value: n,\n ele: o\n };\n },\n min: function(t, r) {\n for (var n = 1 / 0, o, i = this, a = 0; a < i.length; a++) {\n var s = i[a], l = r ? t.apply(r, [s, a, i]) : t(s, a, i);\n l < n && (n = l, o = s);\n }\n return {\n value: n,\n ele: o\n };\n }\n}, Le = VO;\nLe.u = Le["|"] = Le["+"] = Le.union = Le.or = Le.add;\nLe["\\\\"] = Le["!"] = Le["-"] = Le.difference = Le.relativeComplement = Le.subtract = Le.not;\nLe.n = Le["&"] = Le["."] = Le.and = Le.intersection = Le.intersect;\nLe["^"] = Le["(+)"] = Le["(-)"] = Le.symmetricDifference = Le.symdiff = Le.xor;\nLe.fnFilter = Le.filterFn = Le.stdFilter = Le.filter;\nLe.complement = Le.abscomp = Le.absoluteComplement;\nvar R21 = {\n isNode: function() {\n return this.group() === "nodes";\n },\n isEdge: function() {\n return this.group() === "edges";\n },\n isLoop: function() {\n return this.isEdge() && this.source()[0] === this.target()[0];\n },\n isSimple: function() {\n return this.isEdge() && this.source()[0] !== this.target()[0];\n },\n group: function() {\n var t = this[0];\n if (t)\n return t._private.group;\n }\n}, FO = function(t, r) {\n var n = t.cy(), o = n.hasCompoundNodes();\n function i(p) {\n var d = p.pstyle("z-compound-depth");\n return d.value === "auto" ? o ? p.zDepth() : 0 : d.value === "bottom" ? -1 : d.value === "top" ? P9 : 0;\n }\n var a = i(t) - i(r);\n if (a !== 0)\n return a;\n function s(p) {\n var d = p.pstyle("z-index-compare");\n return d.value === "auto" && p.isNode() ? 1 : 0;\n }\n var l = s(t) - s(r);\n if (l !== 0)\n return l;\n var c = t.pstyle("z-index").value - r.pstyle("z-index").value;\n return c !== 0 ? c : t.poolIndex() - r.poolIndex();\n}, Jl = {\n forEach: function(t, r) {\n if (at(t))\n for (var n = this.length, o = 0; o < n; o++) {\n var i = this[o], a = r ? t.apply(r, [i, o, this]) : t(i, o, this);\n if (a === !1)\n break;\n }\n return this;\n },\n toArray: function() {\n for (var t = [], r = 0; r < this.length; r++)\n t.push(this[r]);\n return t;\n },\n slice: function(t, r) {\n var n = [], o = this.length;\n r == null && (r = o), t == null && (t = 0), t < 0 && (t = o + t), r < 0 && (r = o + r);\n for (var i = t; i >= 0 && i < r && i < o; i++)\n n.push(this[i]);\n return this.spawn(n);\n },\n size: function() {\n return this.length;\n },\n eq: function(t) {\n return this[t] || this.spawn();\n },\n first: function() {\n return this[0] || this.spawn();\n },\n last: function() {\n return this[this.length - 1] || this.spawn();\n },\n empty: function() {\n return this.length === 0;\n },\n nonempty: function() {\n return !this.empty();\n },\n sort: function(t) {\n if (!at(t))\n return this;\n var r = this.toArray().sort(t);\n return this.spawn(r);\n },\n sortByZIndex: function() {\n return this.sort(FO);\n },\n zDepth: function() {\n var t = this[0];\n if (t) {\n var r = t._private, n = r.group;\n if (n === "nodes") {\n var o = r.data.parent ? t.parents().size() : 0;\n return t.isParent() ? o : P9 - 1;\n } else {\n var i = r.source, a = r.target, s = i.zDepth(), l = a.zDepth();\n return Math.max(s, l, 0);\n }\n }\n }\n};\nJl.each = Jl.forEach;\nvar B21 = function() {\n var t = "undefined", r = (typeof Symbol > "u" ? "undefined" : Ot(Symbol)) != t && Ot(Symbol.iterator) != t;\n r && (Jl[Symbol.iterator] = function() {\n var n = this, o = {\n value: void 0,\n done: !1\n }, i = 0, a = this.length;\n return jC({\n next: function() {\n return i < a ? o.value = n[i++] : (o.value = void 0, o.done = !0), o;\n }\n }, Symbol.iterator, function() {\n return this;\n });\n });\n};\nB21();\nvar W21 = Ut({\n nodeDimensionsIncludeLabels: !1\n}), nl = {\n // Calculates and returns node dimensions { x, y } based on options given\n layoutDimensions: function(t) {\n t = W21(t);\n var r;\n if (!this.takesUpSpace())\n r = {\n w: 0,\n h: 0\n };\n else if (t.nodeDimensionsIncludeLabels) {\n var n = this.boundingBox();\n r = {\n w: n.w,\n h: n.h\n };\n } else\n r = {\n w: this.outerWidth(),\n h: this.outerHeight()\n };\n return (r.w === 0 || r.h === 0) && (r.w = r.h = 1), r;\n },\n // using standard layout options, apply position function (w/ or w/o animation)\n layoutPositions: function(t, r, n) {\n var o = this.nodes().filter(function(v) {\n return !v.isParent();\n }), i = this.cy(), a = r.eles, s = function(y) {\n return y.id();\n }, l = B4(n, s);\n t.emit({\n type: "layoutstart",\n layout: t\n }), t.animations = [];\n var c = function(y, z, N) {\n var W = {\n x: z.x1 + z.w / 2,\n y: z.y1 + z.h / 2\n }, T = {\n // scale from center of bounding box (not necessarily 0,0)\n x: (N.x - W.x) * y,\n y: (N.y - W.y) * y\n };\n return {\n x: W.x + T.x,\n y: W.y + T.y\n };\n }, p = r.spacingFactor && r.spacingFactor !== 1, d = function() {\n if (!p)\n return null;\n for (var y = w2(), z = 0; z < o.length; z++) {\n var N = o[z], W = l(N, z);\n Pe1(y, W.x, W.y);\n }\n return y;\n }, u = d(), h = B4(function(v, y) {\n var z = l(v, y);\n if (p) {\n var N = Math.abs(r.spacingFactor);\n z = c(N, u, z);\n }\n return r.transform != null && (z = r.transform(v, z)), z;\n }, s);\n if (r.animate) {\n for (var b = 0; b < o.length; b++) {\n var M = o[b], C = h(M, b), g = r.animateFilter == null || r.animateFilter(M, b);\n if (g) {\n var f = M.animation({\n position: C,\n duration: r.animationDuration,\n easing: r.animationEasing\n });\n t.animations.push(f);\n } else\n M.position(C);\n }\n if (r.fit) {\n var O = i.animation({\n fit: {\n boundingBox: a.boundingBoxAt(h),\n padding: r.padding\n },\n duration: r.animationDuration,\n easing: r.animationEasing\n });\n t.animations.push(O);\n } else if (r.zoom !== void 0 && r.pan !== void 0) {\n var m = i.animation({\n zoom: r.zoom,\n pan: r.pan,\n duration: r.animationDuration,\n easing: r.animationEasing\n });\n t.animations.push(m);\n }\n t.animations.forEach(function(v) {\n return v.play();\n }), t.one("layoutready", r.ready), t.emit({\n type: "layoutready",\n layout: t\n }), Xa.all(t.animations.map(function(v) {\n return v.promise();\n })).then(function() {\n t.one("layoutstop", r.stop), t.emit({\n type: "layoutstop",\n layout: t\n });\n });\n } else\n o.positions(h), r.fit && i.fit(r.eles, r.padding), r.zoom != null && i.zoom(r.zoom), r.pan && i.pan(r.pan), t.one("layoutready", r.ready), t.emit({\n type: "layoutready",\n layout: t\n }), t.one("layoutstop", r.stop), t.emit({\n type: "layoutstop",\n layout: t\n });\n return this;\n },\n layout: function(t) {\n var r = this.cy();\n return r.makeLayout(K0({}, t, {\n eles: this\n }));\n }\n};\nnl.createLayout = nl.makeLayout = nl.layout;\nfunction UO(e, t, r) {\n var n = r._private, o = n.styleCache = n.styleCache || [], i;\n return (i = o[e]) != null || (i = o[e] = t(r)), i;\n}\nfunction Fc(e, t) {\n return e = fi(e), function(n) {\n return UO(e, t, n);\n };\n}\nfunction Uc(e, t) {\n e = fi(e);\n var r = function(o) {\n return t.call(o);\n };\n return function() {\n var o = this[0];\n if (o)\n return UO(e, r, o);\n };\n}\nvar Vt = {\n recalculateRenderedStyle: function(t) {\n var r = this.cy(), n = r.renderer(), o = r.styleEnabled();\n return n && o && n.recalculateRenderedStyle(this, t), this;\n },\n dirtyStyleCache: function() {\n var t = this.cy(), r = function(i) {\n return i._private.styleCache = null;\n };\n if (t.hasCompoundNodes()) {\n var n;\n n = this.spawnSelf().merge(this.descendants()).merge(this.parents()), n.merge(n.connectedEdges()), n.forEach(r);\n } else\n this.forEach(function(o) {\n r(o), o.connectedEdges().forEach(r);\n });\n return this;\n },\n // fully updates (recalculates) the style for the elements\n updateStyle: function(t) {\n var r = this._private.cy;\n if (!r.styleEnabled())\n return this;\n if (r.batching()) {\n var n = r._private.batchStyleEles;\n return n.merge(this), this;\n }\n var o = r.hasCompoundNodes(), i = this;\n t = !!(t || t === void 0), o && (i = this.spawnSelf().merge(this.descendants()).merge(this.parents()));\n var a = i;\n return t ? a.emitAndNotify("style") : a.emit("style"), i.forEach(function(s) {\n return s._private.styleDirty = !0;\n }), this;\n },\n // private: clears dirty flag and recalculates style\n cleanStyle: function() {\n var t = this.cy();\n if (t.styleEnabled())\n for (var r = 0; r < this.length; r++) {\n var n = this[r];\n n._private.styleDirty && (n._private.styleDirty = !1, t.style().apply(n));\n }\n },\n // get the internal parsed style object for the specified property\n parsedStyle: function(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0, n = this[0], o = n.cy();\n if (o.styleEnabled() && n) {\n this.cleanStyle();\n var i = n._private.style[t];\n return i ?? (r ? o.style().getDefaultProperty(t) : null);\n }\n },\n numericStyle: function(t) {\n var r = this[0];\n if (r.cy().styleEnabled() && r) {\n var n = r.pstyle(t);\n return n.pfValue !== void 0 ? n.pfValue : n.value;\n }\n },\n numericStyleUnits: function(t) {\n var r = this[0];\n if (r.cy().styleEnabled() && r)\n return r.pstyle(t).units;\n },\n // get the specified css property as a rendered value (i.e. on-screen value)\n // or get the whole rendered style if no property specified (NB doesn\'t allow setting)\n renderedStyle: function(t) {\n var r = this.cy();\n if (!r.styleEnabled())\n return this;\n var n = this[0];\n if (n)\n return r.style().getRenderedStyle(n, t);\n },\n // read the calculated css style of the element or override the style (via a bypass)\n style: function(t, r) {\n var n = this.cy();\n if (!n.styleEnabled())\n return this;\n var o = !1, i = n.style();\n if (Ce(t)) {\n var a = t;\n i.applyBypass(this, a, o), this.emitAndNotify("style");\n } else if (U0(t))\n if (r === void 0) {\n var s = this[0];\n return s ? i.getStylePropertyValue(s, t) : void 0;\n } else\n i.applyBypass(this, t, r, o), this.emitAndNotify("style");\n else if (t === void 0) {\n var l = this[0];\n return l ? i.getRawStyle(l) : void 0;\n }\n return this;\n },\n removeStyle: function(t) {\n var r = this.cy();\n if (!r.styleEnabled())\n return this;\n var n = !1, o = r.style(), i = this;\n if (t === void 0)\n for (var a = 0; a < i.length; a++) {\n var s = i[a];\n o.removeAllBypasses(s, n);\n }\n else {\n t = t.split(/\\s+/);\n for (var l = 0; l < i.length; l++) {\n var c = i[l];\n o.removeBypasses(c, t, n);\n }\n }\n return this.emitAndNotify("style"), this;\n },\n show: function() {\n return this.css("display", "element"), this;\n },\n hide: function() {\n return this.css("display", "none"), this;\n },\n effectiveOpacity: function() {\n var t = this.cy();\n if (!t.styleEnabled())\n return 1;\n var r = t.hasCompoundNodes(), n = this[0];\n if (n) {\n var o = n._private, i = n.pstyle("opacity").value;\n if (!r)\n return i;\n var a = o.data.parent ? n.parents() : null;\n if (a)\n for (var s = 0; s < a.length; s++) {\n var l = a[s], c = l.pstyle("opacity").value;\n i = c * i;\n }\n return i;\n }\n },\n transparent: function() {\n var t = this.cy();\n if (!t.styleEnabled())\n return !1;\n var r = this[0], n = r.cy().hasCompoundNodes();\n if (r)\n return n ? r.effectiveOpacity() === 0 : r.pstyle("opacity").value === 0;\n },\n backgrounding: function() {\n var t = this.cy();\n if (!t.styleEnabled())\n return !1;\n var r = this[0];\n return !!r._private.backgrounding;\n }\n};\nfunction mp(e, t) {\n var r = e._private, n = r.data.parent ? e.parents() : null;\n if (n)\n for (var o = 0; o < n.length; o++) {\n var i = n[o];\n if (!t(i))\n return !1;\n }\n return !0;\n}\nfunction K9(e) {\n var t = e.ok, r = e.edgeOkViaNode || e.ok, n = e.parentOk || e.ok;\n return function() {\n var o = this.cy();\n if (!o.styleEnabled())\n return !0;\n var i = this[0], a = o.hasCompoundNodes();\n if (i) {\n var s = i._private;\n if (!t(i))\n return !1;\n if (i.isNode())\n return !a || mp(i, n);\n var l = s.source, c = s.target;\n return r(l) && (!a || mp(l, r)) && (l === c || r(c) && (!a || mp(c, r)));\n }\n };\n}\nvar Qa = Fc("eleTakesUpSpace", function(e) {\n return e.pstyle("display").value === "element" && e.width() !== 0 && (e.isNode() ? e.height() !== 0 : !0);\n});\nVt.takesUpSpace = Uc("takesUpSpace", K9({\n ok: Qa\n}));\nvar E21 = Fc("eleInteractive", function(e) {\n return e.pstyle("events").value === "yes" && e.pstyle("visibility").value === "visible" && Qa(e);\n}), S21 = Fc("parentInteractive", function(e) {\n return e.pstyle("visibility").value === "visible" && Qa(e);\n});\nVt.interactive = Uc("interactive", K9({\n ok: E21,\n parentOk: S21,\n edgeOkViaNode: Qa\n}));\nVt.noninteractive = function() {\n var e = this[0];\n if (e)\n return !e.interactive();\n};\nvar k21 = Fc("eleVisible", function(e) {\n return e.pstyle("visibility").value === "visible" && e.pstyle("opacity").pfValue !== 0 && Qa(e);\n}), N21 = Qa;\nVt.visible = Uc("visible", K9({\n ok: k21,\n edgeOkViaNode: N21\n}));\nVt.hidden = function() {\n var e = this[0];\n if (e)\n return !e.visible();\n};\nVt.isBundledBezier = Uc("isBundledBezier", function() {\n return this.cy().styleEnabled() ? !this.removed() && this.pstyle("curve-style").value === "bezier" && this.takesUpSpace() : !1;\n});\nVt.bypass = Vt.css = Vt.style;\nVt.renderedCss = Vt.renderedStyle;\nVt.removeBypass = Vt.removeCss = Vt.removeStyle;\nVt.pstyle = Vt.parsedStyle;\nvar Mo = {};\nfunction Sh(e) {\n return function() {\n var t = arguments, r = [];\n if (t.length === 2) {\n var n = t[0], o = t[1];\n this.on(e.event, n, o);\n } else if (t.length === 1 && at(t[0])) {\n var i = t[0];\n this.on(e.event, i);\n } else if (t.length === 0 || t.length === 1 && Ve(t[0])) {\n for (var a = t.length === 1 ? t[0] : null, s = 0; s < this.length; s++) {\n var l = this[s], c = !e.ableField || l._private[e.ableField], p = l._private[e.field] != e.value;\n if (e.overrideAble) {\n var d = e.overrideAble(l);\n if (d !== void 0 && (c = d, !d))\n return this;\n }\n c && (l._private[e.field] = e.value, p && r.push(l));\n }\n var u = this.spawn(r);\n u.updateStyle(), u.emit(e.event), a && u.emit(a);\n }\n return this;\n };\n}\nfunction Ga(e) {\n Mo[e.field] = function() {\n var t = this[0];\n if (t) {\n if (e.overrideField) {\n var r = e.overrideField(t);\n if (r !== void 0)\n return r;\n }\n return t._private[e.field];\n }\n }, Mo[e.on] = Sh({\n event: e.on,\n field: e.field,\n ableField: e.ableField,\n overrideAble: e.overrideAble,\n value: !0\n }), Mo[e.off] = Sh({\n event: e.off,\n field: e.field,\n ableField: e.ableField,\n overrideAble: e.overrideAble,\n value: !1\n });\n}\nGa({\n field: "locked",\n overrideField: function(t) {\n return t.cy().autolock() ? !0 : void 0;\n },\n on: "lock",\n off: "unlock"\n});\nGa({\n field: "grabbable",\n overrideField: function(t) {\n return t.cy().autoungrabify() || t.pannable() ? !1 : void 0;\n },\n on: "grabify",\n off: "ungrabify"\n});\nGa({\n field: "selected",\n ableField: "selectable",\n overrideAble: function(t) {\n return t.cy().autounselectify() ? !1 : void 0;\n },\n on: "select",\n off: "unselect"\n});\nGa({\n field: "selectable",\n overrideField: function(t) {\n return t.cy().autounselectify() ? !1 : void 0;\n },\n on: "selectify",\n off: "unselectify"\n});\nMo.deselect = Mo.unselect;\nMo.grabbed = function() {\n var e = this[0];\n if (e)\n return e._private.grabbed;\n};\nGa({\n field: "active",\n on: "activate",\n off: "unactivate"\n});\nGa({\n field: "pannable",\n on: "panify",\n off: "unpanify"\n});\nMo.inactive = function() {\n var e = this[0];\n if (e)\n return !e._private.active;\n};\nvar Jt = {}, kh = function(t) {\n return function(n) {\n for (var o = this, i = [], a = 0; a < o.length; a++) {\n var s = o[a];\n if (s.isNode()) {\n for (var l = !1, c = s.connectedEdges(), p = 0; p < c.length; p++) {\n var d = c[p], u = d.source(), h = d.target();\n if (t.noIncomingEdges && h === s && u !== s || t.noOutgoingEdges && u === s && h !== s) {\n l = !0;\n break;\n }\n }\n l || i.push(s);\n }\n }\n return this.spawn(i, !0).filter(n);\n };\n}, Nh = function(t) {\n return function(r) {\n for (var n = this, o = [], i = 0; i < n.length; i++) {\n var a = n[i];\n if (a.isNode())\n for (var s = a.connectedEdges(), l = 0; l < s.length; l++) {\n var c = s[l], p = c.source(), d = c.target();\n t.outgoing && p === a ? (o.push(c), o.push(d)) : t.incoming && d === a && (o.push(c), o.push(p));\n }\n }\n return this.spawn(o, !0).filter(r);\n };\n}, Ih = function(t) {\n return function(r) {\n for (var n = this, o = [], i = {}; ; ) {\n var a = t.outgoing ? n.outgoers() : n.incomers();\n if (a.length === 0)\n break;\n for (var s = !1, l = 0; l < a.length; l++) {\n var c = a[l], p = c.id();\n i[p] || (i[p] = !0, o.push(c), s = !0);\n }\n if (!s)\n break;\n n = a;\n }\n return this.spawn(o, !0).filter(r);\n };\n};\nJt.clearTraversalCache = function() {\n for (var e = 0; e < this.length; e++)\n this[e]._private.traversalCache = null;\n};\nK0(Jt, {\n // get the root nodes in the DAG\n roots: kh({\n noIncomingEdges: !0\n }),\n // get the leaf nodes in the DAG\n leaves: kh({\n noOutgoingEdges: !0\n }),\n // normally called children in graph theory\n // these nodes =edges=> outgoing nodes\n outgoers: $2(Nh({\n outgoing: !0\n }), "outgoers"),\n // aka DAG descendants\n successors: Ih({\n outgoing: !0\n }),\n // normally called parents in graph theory\n // these nodes <=edges= incoming nodes\n incomers: $2(Nh({\n incoming: !0\n }), "incomers"),\n // aka DAG ancestors\n predecessors: Ih({\n incoming: !0\n })\n});\nK0(Jt, {\n neighborhood: $2(function(e) {\n for (var t = [], r = this.nodes(), n = 0; n < r.length; n++)\n for (var o = r[n], i = o.connectedEdges(), a = 0; a < i.length; a++) {\n var s = i[a], l = s.source(), c = s.target(), p = o === l ? c : l;\n p.length > 0 && t.push(p[0]), t.push(s[0]);\n }\n return this.spawn(t, !0).filter(e);\n }, "neighborhood"),\n closedNeighborhood: function(t) {\n return this.neighborhood().add(this).filter(t);\n },\n openNeighborhood: function(t) {\n return this.neighborhood(t);\n }\n});\nJt.neighbourhood = Jt.neighborhood;\nJt.closedNeighbourhood = Jt.closedNeighborhood;\nJt.openNeighbourhood = Jt.openNeighborhood;\nK0(Jt, {\n source: $2(function(t) {\n var r = this[0], n;\n return r && (n = r._private.source || r.cy().collection()), n && t ? n.filter(t) : n;\n }, "source"),\n target: $2(function(t) {\n var r = this[0], n;\n return r && (n = r._private.target || r.cy().collection()), n && t ? n.filter(t) : n;\n }, "target"),\n sources: Th({\n attr: "source"\n }),\n targets: Th({\n attr: "target"\n })\n});\nfunction Th(e) {\n return function(r) {\n for (var n = [], o = 0; o < this.length; o++) {\n var i = this[o], a = i._private[e.attr];\n a && n.push(a);\n }\n return this.spawn(n, !0).filter(r);\n };\n}\nK0(Jt, {\n edgesWith: $2(Dh(), "edgesWith"),\n edgesTo: $2(Dh({\n thisIsSrc: !0\n }), "edgesTo")\n});\nfunction Dh(e) {\n return function(r) {\n var n = [], o = this._private.cy, i = e || {};\n U0(r) && (r = o.$(r));\n for (var a = 0; a < r.length; a++)\n for (var s = r[a]._private.edges, l = 0; l < s.length; l++) {\n var c = s[l], p = c._private.data, d = this.hasElementWithId(p.source) && r.hasElementWithId(p.target), u = r.hasElementWithId(p.source) && this.hasElementWithId(p.target), h = d || u;\n h && ((i.thisIsSrc || i.thisIsTgt) && (i.thisIsSrc && !d || i.thisIsTgt && !u) || n.push(c));\n }\n return this.spawn(n, !0);\n };\n}\nK0(Jt, {\n connectedEdges: $2(function(e) {\n for (var t = [], r = this, n = 0; n < r.length; n++) {\n var o = r[n];\n if (o.isNode())\n for (var i = o._private.edges, a = 0; a < i.length; a++) {\n var s = i[a];\n t.push(s);\n }\n }\n return this.spawn(t, !0).filter(e);\n }, "connectedEdges"),\n connectedNodes: $2(function(e) {\n for (var t = [], r = this, n = 0; n < r.length; n++) {\n var o = r[n];\n o.isEdge() && (t.push(o.source()[0]), t.push(o.target()[0]));\n }\n return this.spawn(t, !0).filter(e);\n }, "connectedNodes"),\n parallelEdges: $2(Hh(), "parallelEdges"),\n codirectedEdges: $2(Hh({\n codirected: !0\n }), "codirectedEdges")\n});\nfunction Hh(e) {\n var t = {\n codirected: !1\n };\n return e = K0({}, t, e), function(n) {\n for (var o = [], i = this.edges(), a = e, s = 0; s < i.length; s++)\n for (var l = i[s], c = l._private, p = c.source, d = p._private.data.id, u = c.data.target, h = p._private.edges, b = 0; b < h.length; b++) {\n var M = h[b], C = M._private.data, g = C.target, f = C.source, O = g === u && f === d, m = d === g && u === f;\n (a.codirected && O || !a.codirected && (O || m)) && o.push(M);\n }\n return this.spawn(o, !0).filter(n);\n };\n}\nK0(Jt, {\n components: function(t) {\n var r = this, n = r.cy(), o = n.collection(), i = t == null ? r.nodes() : t.nodes(), a = [];\n t != null && i.empty() && (i = t.sources());\n var s = function(p, d) {\n o.merge(p), i.unmerge(p), d.merge(p);\n };\n if (i.empty())\n return r.spawn();\n var l = function() {\n var p = n.collection();\n a.push(p);\n var d = i[0];\n s(d, p), r.bfs({\n directed: !1,\n roots: d,\n visit: function(h) {\n return s(h, p);\n }\n }), p.forEach(function(u) {\n u.connectedEdges().forEach(function(h) {\n r.has(h) && p.has(h.source()) && p.has(h.target()) && p.merge(h);\n });\n });\n };\n do\n l();\n while (i.length > 0);\n return a;\n },\n component: function() {\n var t = this[0];\n return t.cy().mutableElements().components(t)[0];\n }\n});\nJt.componentsOf = Jt.components;\nvar Ft = function(t, r) {\n var n = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : !1;\n if (t === void 0) {\n ct("A collection must have a reference to the core");\n return;\n }\n var o = new Ur(), i = !1;\n if (!r)\n r = [];\n else if (r.length > 0 && Ce(r[0]) && !As(r[0])) {\n i = !0;\n for (var a = [], s = new Ya(), l = 0, c = r.length; l < c; l++) {\n var p = r[l];\n p.data == null && (p.data = {});\n var d = p.data;\n if (d.id == null)\n d.id = lO();\n else if (t.hasElementWithId(d.id) || s.has(d.id))\n continue;\n var u = new Tc(t, p, !1);\n a.push(u), s.add(d.id);\n }\n r = a;\n }\n this.length = 0;\n for (var h = 0, b = r.length; h < b; h++) {\n var M = r[h][0];\n if (M != null) {\n var C = M._private.data.id;\n (!n || !o.has(C)) && (n && o.set(C, {\n index: this.length,\n ele: M\n }), this[this.length] = M, this.length++);\n }\n }\n this._private = {\n eles: this,\n cy: t,\n get map() {\n return this.lazyMap == null && this.rebuildMap(), this.lazyMap;\n },\n set map(g) {\n this.lazyMap = g;\n },\n rebuildMap: function() {\n for (var f = this.lazyMap = new Ur(), O = this.eles, m = 0; m < O.length; m++) {\n var v = O[m];\n f.set(v.id(), {\n index: m,\n ele: v\n });\n }\n }\n }, n && (this._private.map = o), i && this.restore();\n}, Ge = Tc.prototype = Ft.prototype = Object.create(Array.prototype);\nGe.instanceString = function() {\n return "collection";\n};\nGe.spawn = function(e, t) {\n return new Ft(this.cy(), e, t);\n};\nGe.spawnSelf = function() {\n return this.spawn(this);\n};\nGe.cy = function() {\n return this._private.cy;\n};\nGe.renderer = function() {\n return this._private.cy.renderer();\n};\nGe.element = function() {\n return this[0];\n};\nGe.collection = function() {\n return ZC(this) ? this : new Ft(this._private.cy, [this]);\n};\nGe.unique = function() {\n return new Ft(this._private.cy, this, !0);\n};\nGe.hasElementWithId = function(e) {\n return e = "" + e, this._private.map.has(e);\n};\nGe.getElementById = function(e) {\n e = "" + e;\n var t = this._private.cy, r = this._private.map.get(e);\n return r ? r.ele : new Ft(t);\n};\nGe.$id = Ge.getElementById;\nGe.poolIndex = function() {\n var e = this._private.cy, t = e._private.elements, r = this[0]._private.data.id;\n return t._private.map.get(r).index;\n};\nGe.indexOf = function(e) {\n var t = e[0]._private.data.id;\n return this._private.map.get(t).index;\n};\nGe.indexOfId = function(e) {\n return e = "" + e, this._private.map.get(e).index;\n};\nGe.json = function(e) {\n var t = this.element(), r = this.cy();\n if (t == null && e)\n return this;\n if (t != null) {\n var n = t._private;\n if (Ce(e)) {\n if (r.startBatch(), e.data) {\n t.data(e.data);\n var o = n.data;\n if (t.isEdge()) {\n var i = !1, a = {}, s = e.data.source, l = e.data.target;\n s != null && s != o.source && (a.source = "" + s, i = !0), l != null && l != o.target && (a.target = "" + l, i = !0), i && (t = t.move(a));\n } else {\n var c = "parent" in e.data, p = e.data.parent;\n c && (p != null || o.parent != null) && p != o.parent && (p === void 0 && (p = null), p != null && (p = "" + p), t = t.move({\n parent: p\n }));\n }\n }\n e.position && t.position(e.position);\n var d = function(M, C, g) {\n var f = e[M];\n f != null && f !== n[M] && (f ? t[C]() : t[g]());\n };\n return d("removed", "remove", "restore"), d("selected", "select", "unselect"), d("selectable", "selectify", "unselectify"), d("locked", "lock", "unlock"), d("grabbable", "grabify", "ungrabify"), d("pannable", "panify", "unpanify"), e.classes != null && t.classes(e.classes), r.endBatch(), this;\n } else if (e === void 0) {\n var u = {\n data: Fr(n.data),\n position: Fr(n.position),\n group: n.group,\n removed: n.removed,\n selected: n.selected,\n selectable: n.selectable,\n locked: n.locked,\n grabbable: n.grabbable,\n pannable: n.pannable,\n classes: null\n };\n u.classes = "";\n var h = 0;\n return n.classes.forEach(function(b) {\n return u.classes += h++ === 0 ? b : " " + b;\n }), u;\n }\n }\n};\nGe.jsons = function() {\n for (var e = [], t = 0; t < this.length; t++) {\n var r = this[t], n = r.json();\n e.push(n);\n }\n return e;\n};\nGe.clone = function() {\n for (var e = this.cy(), t = [], r = 0; r < this.length; r++) {\n var n = this[r], o = n.json(), i = new Tc(e, o, !1);\n t.push(i);\n }\n return new Ft(e, t);\n};\nGe.copy = Ge.clone;\nGe.restore = function() {\n for (var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !0, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0, r = this, n = r.cy(), o = n._private, i = [], a = [], s, l = 0, c = r.length; l < c; l++) {\n var p = r[l];\n t && !p.removed() || (p.isNode() ? i.push(p) : a.push(p));\n }\n s = i.concat(a);\n var d, u = function() {\n s.splice(d, 1), d--;\n };\n for (d = 0; d < s.length; d++) {\n var h = s[d], b = h._private, M = b.data;\n if (h.clearTraversalCache(), !(!t && !b.removed)) {\n if (M.id === void 0)\n M.id = lO();\n else if (O0(M.id))\n M.id = "" + M.id;\n else if (Oo(M.id) || !U0(M.id)) {\n ct("Can not create element with invalid string ID `" + M.id + "`"), u();\n continue;\n } else if (n.hasElementWithId(M.id)) {\n ct("Can not create second element with ID `" + M.id + "`"), u();\n continue;\n }\n }\n var C = M.id;\n if (h.isNode()) {\n var g = b.position;\n g.x == null && (g.x = 0), g.y == null && (g.y = 0);\n }\n if (h.isEdge()) {\n for (var f = h, O = ["source", "target"], m = O.length, v = !1, y = 0; y < m; y++) {\n var z = O[y], N = M[z];\n O0(N) && (N = M[z] = "" + M[z]), N == null || N === "" ? (ct("Can not create edge `" + C + "` with unspecified " + z), v = !0) : n.hasElementWithId(N) || (ct("Can not create edge `" + C + "` with nonexistant " + z + " `" + N + "`"), v = !0);\n }\n if (v) {\n u();\n continue;\n }\n var W = n.getElementById(M.source), T = n.getElementById(M.target);\n W.same(T) ? W._private.edges.push(f) : (W._private.edges.push(f), T._private.edges.push(f)), f._private.source = W, f._private.target = T;\n }\n b.map = new Ur(), b.map.set(C, {\n ele: h,\n index: 0\n }), b.removed = !1, t && n.addToPool(h);\n }\n for (var x = 0; x < i.length; x++) {\n var E = i[x], L = E._private.data;\n O0(L.parent) && (L.parent = "" + L.parent);\n var w = L.parent, q = w != null;\n if (q) {\n var S = n.getElementById(w);\n if (S.empty())\n L.parent = void 0;\n else {\n for (var B = !1, I = S; !I.empty(); ) {\n if (E.same(I)) {\n B = !0, L.parent = void 0;\n break;\n }\n I = I.parent();\n }\n B || (S[0]._private.children.push(E), E._private.parent = S[0], o.hasCompoundNodes = !0);\n }\n }\n }\n if (s.length > 0) {\n for (var P = s.length === r.length ? r : new Ft(n, s), k = 0; k < P.length; k++) {\n var K = P[k];\n K.isNode() || (K.parallelEdges().clearTraversalCache(), K.source().clearTraversalCache(), K.target().clearTraversalCache());\n }\n var $;\n o.hasCompoundNodes ? $ = n.collection().merge(P).merge(P.connectedNodes()).merge(P.parent()) : $ = P, $.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(e), e ? P.emitAndNotify("add") : t && P.emit("add");\n }\n return r;\n};\nGe.removed = function() {\n var e = this[0];\n return e && e._private.removed;\n};\nGe.inside = function() {\n var e = this[0];\n return e && !e._private.removed;\n};\nGe.remove = function() {\n var e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !0, t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0, r = this, n = [], o = {}, i = r._private.cy;\n function a(w) {\n for (var q = w._private.edges, S = 0; S < q.length; S++)\n l(q[S]);\n }\n function s(w) {\n for (var q = w._private.children, S = 0; S < q.length; S++)\n l(q[S]);\n }\n function l(w) {\n var q = o[w.id()];\n t && w.removed() || q || (o[w.id()] = !0, w.isNode() ? (n.push(w), a(w), s(w)) : n.unshift(w));\n }\n for (var c = 0, p = r.length; c < p; c++) {\n var d = r[c];\n l(d);\n }\n function u(w, q) {\n var S = w._private.edges;\n mo(S, q), w.clearTraversalCache();\n }\n function h(w) {\n w.clearTraversalCache();\n }\n var b = [];\n b.ids = {};\n function M(w, q) {\n q = q[0], w = w[0];\n var S = w._private.children, B = w.id();\n mo(S, q), q._private.parent = null, b.ids[B] || (b.ids[B] = !0, b.push(w));\n }\n r.dirtyCompoundBoundsCache(), t && i.removeFromPool(n);\n for (var C = 0; C < n.length; C++) {\n var g = n[C];\n if (g.isEdge()) {\n var f = g.source()[0], O = g.target()[0];\n u(f, g), u(O, g);\n for (var m = g.parallelEdges(), v = 0; v < m.length; v++) {\n var y = m[v];\n h(y), y.isBundledBezier() && y.dirtyBoundingBoxCache();\n }\n } else {\n var z = g.parent();\n z.length !== 0 && M(z, g);\n }\n t && (g._private.removed = !0);\n }\n var N = i._private.elements;\n i._private.hasCompoundNodes = !1;\n for (var W = 0; W < N.length; W++) {\n var T = N[W];\n if (T.isParent()) {\n i._private.hasCompoundNodes = !0;\n break;\n }\n }\n var x = new Ft(this.cy(), n);\n x.size() > 0 && (e ? x.emitAndNotify("remove") : t && x.emit("remove"));\n for (var E = 0; E < b.length; E++) {\n var L = b[E];\n (!t || !L.removed()) && L.updateStyle();\n }\n return x;\n};\nGe.move = function(e) {\n var t = this._private.cy, r = this, n = !1, o = !1, i = function(b) {\n return b == null ? b : "" + b;\n };\n if (e.source !== void 0 || e.target !== void 0) {\n var a = i(e.source), s = i(e.target), l = a != null && t.hasElementWithId(a), c = s != null && t.hasElementWithId(s);\n (l || c) && (t.batch(function() {\n r.remove(n, o), r.emitAndNotify("moveout");\n for (var h = 0; h < r.length; h++) {\n var b = r[h], M = b._private.data;\n b.isEdge() && (l && (M.source = a), c && (M.target = s));\n }\n r.restore(n, o);\n }), r.emitAndNotify("move"));\n } else if (e.parent !== void 0) {\n var p = i(e.parent), d = p === null || t.hasElementWithId(p);\n if (d) {\n var u = p === null ? void 0 : p;\n t.batch(function() {\n var h = r.remove(n, o);\n h.emitAndNotify("moveout");\n for (var b = 0; b < r.length; b++) {\n var M = r[b], C = M._private.data;\n M.isNode() && (C.parent = u);\n }\n h.restore(n, o);\n }), r.emitAndNotify("move");\n }\n }\n return this;\n};\n[mO, Gt1, rl, ho, Sa, c21, Pc, y21, PO, VO, R21, Jl, nl, Vt, Mo, Jt].forEach(function(e) {\n K0(Ge, e);\n});\nvar I21 = {\n add: function(t) {\n var r, n = this;\n if (I2(t)) {\n var o = t;\n if (o._private.cy === n)\n r = o.restore();\n else {\n for (var i = [], a = 0; a < o.length; a++) {\n var s = o[a];\n i.push(s.json());\n }\n r = new Ft(n, i);\n }\n } else if (Ve(t)) {\n var l = t;\n r = new Ft(n, l);\n } else if (Ce(t) && (Ve(t.nodes) || Ve(t.edges))) {\n for (var c = t, p = [], d = ["nodes", "edges"], u = 0, h = d.length; u < h; u++) {\n var b = d[u], M = c[b];\n if (Ve(M))\n for (var C = 0, g = M.length; C < g; C++) {\n var f = K0({\n group: b\n }, M[C]);\n p.push(f);\n }\n }\n r = new Ft(n, p);\n } else {\n var O = t;\n r = new Tc(n, O).collection();\n }\n return r;\n },\n remove: function(t) {\n if (!I2(t)) {\n if (U0(t)) {\n var r = t;\n t = this.$(r);\n }\n }\n return t.remove();\n }\n};\n/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */\nfunction T21(e, t, r, n) {\n var o = 4, i = 1e-3, a = 1e-7, s = 10, l = 11, c = 1 / (l - 1), p = typeof Float32Array < "u";\n if (arguments.length !== 4)\n return !1;\n for (var d = 0; d < 4; ++d)\n if (typeof arguments[d] != "number" || isNaN(arguments[d]) || !isFinite(arguments[d]))\n return !1;\n e = Math.min(e, 1), r = Math.min(r, 1), e = Math.max(e, 0), r = Math.max(r, 0);\n var u = p ? new Float32Array(l) : new Array(l);\n function h(T, x) {\n return 1 - 3 * x + 3 * T;\n }\n function b(T, x) {\n return 3 * x - 6 * T;\n }\n function M(T) {\n return 3 * T;\n }\n function C(T, x, E) {\n return ((h(x, E) * T + b(x, E)) * T + M(x)) * T;\n }\n function g(T, x, E) {\n return 3 * h(x, E) * T * T + 2 * b(x, E) * T + M(x);\n }\n function f(T, x) {\n for (var E = 0; E < o; ++E) {\n var L = g(x, e, r);\n if (L === 0)\n return x;\n var w = C(x, e, r) - T;\n x -= w / L;\n }\n return x;\n }\n function O() {\n for (var T = 0; T < l; ++T)\n u[T] = C(T * c, e, r);\n }\n function m(T, x, E) {\n var L, w, q = 0;\n do\n w = x + (E - x) / 2, L = C(w, e, r) - T, L > 0 ? E = w : x = w;\n while (Math.abs(L) > a && ++q < s);\n return w;\n }\n function v(T) {\n for (var x = 0, E = 1, L = l - 1; E !== L && u[E] <= T; ++E)\n x += c;\n --E;\n var w = (T - u[E]) / (u[E + 1] - u[E]), q = x + w * c, S = g(q, e, r);\n return S >= i ? f(T, q) : S === 0 ? q : m(T, x, x + c);\n }\n var y = !1;\n function z() {\n y = !0, (e !== t || r !== n) && O();\n }\n var N = function(x) {\n return y || z(), e === t && r === n ? x : x === 0 ? 0 : x === 1 ? 1 : C(v(x), t, n);\n };\n N.getControlPoints = function() {\n return [{\n x: e,\n y: t\n }, {\n x: r,\n y: n\n }];\n };\n var W = "generateBezier(" + [e, t, r, n] + ")";\n return N.toString = function() {\n return W;\n }, N;\n}\n/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */\nvar D21 = function() {\n function e(n) {\n return -n.tension * n.x - n.friction * n.v;\n }\n function t(n, o, i) {\n var a = {\n x: n.x + i.dx * o,\n v: n.v + i.dv * o,\n tension: n.tension,\n friction: n.friction\n };\n return {\n dx: a.v,\n dv: e(a)\n };\n }\n function r(n, o) {\n var i = {\n dx: n.v,\n dv: e(n)\n }, a = t(n, o * 0.5, i), s = t(n, o * 0.5, a), l = t(n, o, s), c = 1 / 6 * (i.dx + 2 * (a.dx + s.dx) + l.dx), p = 1 / 6 * (i.dv + 2 * (a.dv + s.dv) + l.dv);\n return n.x = n.x + c * o, n.v = n.v + p * o, n;\n }\n return function n(o, i, a) {\n var s = {\n x: -1,\n v: 0,\n tension: null,\n friction: null\n }, l = [0], c = 0, p = 1 / 1e4, d = 16 / 1e3, u, h, b;\n for (o = parseFloat(o) || 500, i = parseFloat(i) || 20, a = a || null, s.tension = o, s.friction = i, u = a !== null, u ? (c = n(o, i), h = c / a * d) : h = d; b = r(b || s, h), l.push(1 + b.x), c += 16, Math.abs(b.x) > p && Math.abs(b.v) > p; )\n ;\n return u ? function(M) {\n return l[M * (l.length - 1) | 0];\n } : c;\n };\n}(), Ye = function(t, r, n, o) {\n var i = T21(t, r, n, o);\n return function(a, s, l) {\n return a + (s - a) * i(l);\n };\n}, ol = {\n linear: function(t, r, n) {\n return t + (r - t) * n;\n },\n // default easings\n ease: Ye(0.25, 0.1, 0.25, 1),\n "ease-in": Ye(0.42, 0, 1, 1),\n "ease-out": Ye(0, 0, 0.58, 1),\n "ease-in-out": Ye(0.42, 0, 0.58, 1),\n // sine\n "ease-in-sine": Ye(0.47, 0, 0.745, 0.715),\n "ease-out-sine": Ye(0.39, 0.575, 0.565, 1),\n "ease-in-out-sine": Ye(0.445, 0.05, 0.55, 0.95),\n // quad\n "ease-in-quad": Ye(0.55, 0.085, 0.68, 0.53),\n "ease-out-quad": Ye(0.25, 0.46, 0.45, 0.94),\n "ease-in-out-quad": Ye(0.455, 0.03, 0.515, 0.955),\n // cubic\n "ease-in-cubic": Ye(0.55, 0.055, 0.675, 0.19),\n "ease-out-cubic": Ye(0.215, 0.61, 0.355, 1),\n "ease-in-out-cubic": Ye(0.645, 0.045, 0.355, 1),\n // quart\n "ease-in-quart": Ye(0.895, 0.03, 0.685, 0.22),\n "ease-out-quart": Ye(0.165, 0.84, 0.44, 1),\n "ease-in-out-quart": Ye(0.77, 0, 0.175, 1),\n // quint\n "ease-in-quint": Ye(0.755, 0.05, 0.855, 0.06),\n "ease-out-quint": Ye(0.23, 1, 0.32, 1),\n "ease-in-out-quint": Ye(0.86, 0, 0.07, 1),\n // expo\n "ease-in-expo": Ye(0.95, 0.05, 0.795, 0.035),\n "ease-out-expo": Ye(0.19, 1, 0.22, 1),\n "ease-in-out-expo": Ye(1, 0, 0, 1),\n // circ\n "ease-in-circ": Ye(0.6, 0.04, 0.98, 0.335),\n "ease-out-circ": Ye(0.075, 0.82, 0.165, 1),\n "ease-in-out-circ": Ye(0.785, 0.135, 0.15, 0.86),\n // user param easings...\n spring: function(t, r, n) {\n if (n === 0)\n return ol.linear;\n var o = D21(t, r, n);\n return function(i, a, s) {\n return i + (a - i) * o(s);\n };\n },\n "cubic-bezier": Ye\n};\nfunction Ph(e, t, r, n, o) {\n if (n === 1 || t === r)\n return r;\n var i = o(t, r, n);\n return e == null || ((e.roundValue || e.color) && (i = Math.round(i)), e.min !== void 0 && (i = Math.max(i, e.min)), e.max !== void 0 && (i = Math.min(i, e.max))), i;\n}\nfunction Vh(e, t) {\n return e.pfValue != null || e.value != null ? e.pfValue != null && (t == null || t.type.units !== "%") ? e.pfValue : e.value : e;\n}\nfunction Xi(e, t, r, n, o) {\n var i = o != null ? o.type : null;\n r < 0 ? r = 0 : r > 1 && (r = 1);\n var a = Vh(e, o), s = Vh(t, o);\n if (O0(a) && O0(s))\n return Ph(i, a, s, r, n);\n if (Ve(a) && Ve(s)) {\n for (var l = [], c = 0; c < s.length; c++) {\n var p = a[c], d = s[c];\n if (p != null && d != null) {\n var u = Ph(i, p, d, r, n);\n l.push(u);\n } else\n l.push(d);\n }\n return l;\n }\n}\nfunction H21(e, t, r, n) {\n var o = !n, i = e._private, a = t._private, s = a.easing, l = a.startTime, c = n ? e : e.cy(), p = c.style();\n if (!a.easingImpl)\n if (s == null)\n a.easingImpl = ol.linear;\n else {\n var d;\n if (U0(s)) {\n var u = p.parse("transition-timing-function", s);\n d = u.value;\n } else\n d = s;\n var h, b;\n U0(d) ? (h = d, b = []) : (h = d[1], b = d.slice(2).map(function(P) {\n return +P;\n })), b.length > 0 ? (h === "spring" && b.push(a.duration), a.easingImpl = ol[h].apply(null, b)) : a.easingImpl = ol[h];\n }\n var M = a.easingImpl, C;\n if (a.duration === 0 ? C = 1 : C = (r - l) / a.duration, a.applying && (C = a.progress), C < 0 ? C = 0 : C > 1 && (C = 1), a.delay == null) {\n var g = a.startPosition, f = a.position;\n if (f && o && !e.locked()) {\n var O = {};\n x3(g.x, f.x) && (O.x = Xi(g.x, f.x, C, M)), x3(g.y, f.y) && (O.y = Xi(g.y, f.y, C, M)), e.position(O);\n }\n var m = a.startPan, v = a.pan, y = i.pan, z = v != null && n;\n z && (x3(m.x, v.x) && (y.x = Xi(m.x, v.x, C, M)), x3(m.y, v.y) && (y.y = Xi(m.y, v.y, C, M)), e.emit("pan"));\n var N = a.startZoom, W = a.zoom, T = W != null && n;\n T && (x3(N, W) && (i.zoom = k4(i.minZoom, Xi(N, W, C, M), i.maxZoom)), e.emit("zoom")), (z || T) && e.emit("viewport");\n var x = a.style;\n if (x && x.length > 0 && o) {\n for (var E = 0; E < x.length; E++) {\n var L = x[E], w = L.name, q = L, S = a.startStyle[w], B = p.properties[S.name], I = Xi(S, q, C, M, B);\n p.overrideBypass(e, w, I);\n }\n e.emit("style");\n }\n }\n return a.progress = C, C;\n}\nfunction x3(e, t) {\n return e == null || t == null ? !1 : O0(e) && O0(t) ? !0 : !!(e && t);\n}\nfunction P21(e, t, r, n) {\n var o = t._private;\n o.started = !0, o.startTime = r - o.progress * o.duration;\n}\nfunction Fh(e, t) {\n var r = t._private.aniEles, n = [];\n function o(p, d) {\n var u = p._private, h = u.animation.current, b = u.animation.queue, M = !1;\n if (h.length === 0) {\n var C = b.shift();\n C && h.push(C);\n }\n for (var g = function(y) {\n for (var z = y.length - 1; z >= 0; z--) {\n var N = y[z];\n N();\n }\n y.splice(0, y.length);\n }, f = h.length - 1; f >= 0; f--) {\n var O = h[f], m = O._private;\n if (m.stopped) {\n h.splice(f, 1), m.hooked = !1, m.playing = !1, m.started = !1, g(m.frames);\n continue;\n }\n !m.playing && !m.applying || (m.playing && m.applying && (m.applying = !1), m.started || P21(p, O, e), H21(p, O, e, d), m.applying && (m.applying = !1), g(m.frames), m.step != null && m.step(e), O.completed() && (h.splice(f, 1), m.hooked = !1, m.playing = !1, m.started = !1, g(m.completes)), M = !0);\n }\n return !d && h.length === 0 && b.length === 0 && n.push(p), M;\n }\n for (var i = !1, a = 0; a < r.length; a++) {\n var s = r[a], l = o(s);\n i = i || l;\n }\n var c = o(t, !0);\n (i || c) && (r.length > 0 ? t.notify("draw", r) : t.notify("draw")), r.unmerge(n), t.emit("step");\n}\nvar V21 = {\n // pull in animation functions\n animate: Ee.animate(),\n animation: Ee.animation(),\n animated: Ee.animated(),\n clearQueue: Ee.clearQueue(),\n delay: Ee.delay(),\n delayAnimation: Ee.delayAnimation(),\n stop: Ee.stop(),\n addToAnimationPool: function(t) {\n var r = this;\n r.styleEnabled() && r._private.aniEles.merge(t);\n },\n stopAnimationLoop: function() {\n this._private.animationsRunning = !1;\n },\n startAnimationLoop: function() {\n var t = this;\n if (t._private.animationsRunning = !0, !t.styleEnabled())\n return;\n function r() {\n t._private.animationsRunning && jl(function(i) {\n Fh(i, t), r();\n });\n }\n var n = t.renderer();\n n && n.beforeRender ? n.beforeRender(function(i, a) {\n Fh(a, t);\n }, n.beforeRenderPriorities.animations) : r();\n }\n}, F21 = {\n qualifierCompare: function(t, r) {\n return t == null || r == null ? t == null && r == null : t.sameText(r);\n },\n eventMatches: function(t, r, n) {\n var o = r.qualifier;\n return o != null ? t !== n.target && As(n.target) && o.matches(n.target) : !0;\n },\n addEventFields: function(t, r) {\n r.cy = t, r.target = t;\n },\n callbackContext: function(t, r, n) {\n return r.qualifier != null ? n.target : t;\n }\n}, x5 = function(t) {\n return U0(t) ? new vo(t) : t;\n}, YO = {\n createEmitter: function() {\n var t = this._private;\n return t.emitter || (t.emitter = new Vc(F21, this)), this;\n },\n emitter: function() {\n return this._private.emitter;\n },\n on: function(t, r, n) {\n return this.emitter().on(t, x5(r), n), this;\n },\n removeListener: function(t, r, n) {\n return this.emitter().removeListener(t, x5(r), n), this;\n },\n removeAllListeners: function() {\n return this.emitter().removeAllListeners(), this;\n },\n one: function(t, r, n) {\n return this.emitter().one(t, x5(r), n), this;\n },\n once: function(t, r, n) {\n return this.emitter().one(t, x5(r), n), this;\n },\n emit: function(t, r) {\n return this.emitter().emit(t, r), this;\n },\n emitAndNotify: function(t, r) {\n return this.emit(t), this.notify(t, r), this;\n }\n};\nEe.eventAliasesOn(YO);\nvar G8 = {\n png: function(t) {\n var r = this._private.renderer;\n return t = t || {}, r.png(t);\n },\n jpg: function(t) {\n var r = this._private.renderer;\n return t = t || {}, t.bg = t.bg || "#fff", r.jpg(t);\n }\n};\nG8.jpeg = G8.jpg;\nvar il = {\n layout: function(t) {\n var r = this;\n if (t == null) {\n ct("Layout options must be specified to make a layout");\n return;\n }\n if (t.name == null) {\n ct("A `name` must be specified to make a layout");\n return;\n }\n var n = t.name, o = r.extension("layout", n);\n if (o == null) {\n ct("No such layout `" + n + "` found. Did you forget to import it and `cytoscape.use()` it?");\n return;\n }\n var i;\n U0(t.eles) ? i = r.$(t.eles) : i = t.eles != null ? t.eles : r.$();\n var a = new o(K0({}, t, {\n cy: r,\n eles: i\n }));\n return a;\n }\n};\nil.createLayout = il.makeLayout = il.layout;\nvar U21 = {\n notify: function(t, r) {\n var n = this._private;\n if (this.batching()) {\n n.batchNotifications = n.batchNotifications || {};\n var o = n.batchNotifications[t] = n.batchNotifications[t] || this.collection();\n r != null && o.merge(r);\n return;\n }\n if (n.notificationsEnabled) {\n var i = this.renderer();\n this.destroyed() || !i || i.notify(t, r);\n }\n },\n notifications: function(t) {\n var r = this._private;\n return t === void 0 ? r.notificationsEnabled : (r.notificationsEnabled = !!t, this);\n },\n noNotifications: function(t) {\n this.notifications(!1), t(), this.notifications(!0);\n },\n batching: function() {\n return this._private.batchCount > 0;\n },\n startBatch: function() {\n var t = this._private;\n return t.batchCount == null && (t.batchCount = 0), t.batchCount === 0 && (t.batchStyleEles = this.collection(), t.batchNotifications = {}), t.batchCount++, this;\n },\n endBatch: function() {\n var t = this._private;\n if (t.batchCount === 0)\n return this;\n if (t.batchCount--, t.batchCount === 0) {\n t.batchStyleEles.updateStyle();\n var r = this.renderer();\n Object.keys(t.batchNotifications).forEach(function(n) {\n var o = t.batchNotifications[n];\n o.empty() ? r.notify(n) : r.notify(n, o);\n });\n }\n return this;\n },\n batch: function(t) {\n return this.startBatch(), t(), this.endBatch(), this;\n },\n // for backwards compatibility\n batchData: function(t) {\n var r = this;\n return this.batch(function() {\n for (var n = Object.keys(t), o = 0; o < n.length; o++) {\n var i = n[o], a = t[i], s = r.getElementById(i);\n s.data(a);\n }\n });\n }\n}, Y21 = Ut({\n hideEdgesOnViewport: !1,\n textureOnViewport: !1,\n motionBlur: !1,\n motionBlurOpacity: 0.05,\n pixelRatio: void 0,\n desktopTapThreshold: 4,\n touchTapThreshold: 8,\n wheelSensitivity: 1,\n debug: !1,\n showFps: !1\n}), j8 = {\n renderTo: function(t, r, n, o) {\n var i = this._private.renderer;\n return i.renderTo(t, r, n, o), this;\n },\n renderer: function() {\n return this._private.renderer;\n },\n forceRender: function() {\n return this.notify("draw"), this;\n },\n resize: function() {\n return this.invalidateSize(), this.emitAndNotify("resize"), this;\n },\n initRenderer: function(t) {\n var r = this, n = r.extension("renderer", t.name);\n if (n == null) {\n ct("Can not initialise: No such renderer `".concat(t.name, "` found. Did you forget to import it and `cytoscape.use()` it?"));\n return;\n }\n t.wheelSensitivity !== void 0 && je("You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine.");\n var o = Y21(t);\n o.cy = r, r._private.renderer = new n(o), this.notify("init");\n },\n destroyRenderer: function() {\n var t = this;\n t.notify("destroy");\n var r = t.container();\n if (r)\n for (r._cyreg = null; r.childNodes.length > 0; )\n r.removeChild(r.childNodes[0]);\n t._private.renderer = null, t.mutableElements().forEach(function(n) {\n var o = n._private;\n o.rscratch = {}, o.rstyle = {}, o.animation.current = [], o.animation.queue = [];\n });\n },\n onRender: function(t) {\n return this.on("render", t);\n },\n offRender: function(t) {\n return this.off("render", t);\n }\n};\nj8.invalidateDimensions = j8.resize;\nvar al = {\n // get a collection\n // - empty collection on no args\n // - collection of elements in the graph on selector arg\n // - guarantee a returned collection when elements or collection specified\n collection: function(t, r) {\n return U0(t) ? this.$(t) : I2(t) ? t.collection() : Ve(t) ? new Ft(this, t, r) : new Ft(this);\n },\n nodes: function(t) {\n var r = this.$(function(n) {\n return n.isNode();\n });\n return t ? r.filter(t) : r;\n },\n edges: function(t) {\n var r = this.$(function(n) {\n return n.isEdge();\n });\n return t ? r.filter(t) : r;\n },\n // search the graph like jQuery\n $: function(t) {\n var r = this._private.elements;\n return t ? r.filter(t) : r.spawnSelf();\n },\n mutableElements: function() {\n return this._private.elements;\n }\n};\nal.elements = al.filter = al.$;\nvar e2 = {}, $3 = "t", X21 = "f";\ne2.apply = function(e) {\n for (var t = this, r = t._private, n = r.cy, o = n.collection(), i = 0; i < e.length; i++) {\n var a = e[i], s = t.getContextMeta(a);\n if (!s.empty) {\n var l = t.getContextStyle(s), c = t.applyContextStyle(s, l, a);\n a._private.appliedInitStyle ? t.updateTransitions(a, c.diffProps) : a._private.appliedInitStyle = !0;\n var p = t.updateStyleHints(a);\n p && o.push(a);\n }\n }\n return o;\n};\ne2.getPropertiesDiff = function(e, t) {\n var r = this, n = r._private.propDiffs = r._private.propDiffs || {}, o = e + "-" + t, i = n[o];\n if (i)\n return i;\n for (var a = [], s = {}, l = 0; l < r.length; l++) {\n var c = r[l], p = e[l] === $3, d = t[l] === $3, u = p !== d, h = c.mappedProperties.length > 0;\n if (u || d && h) {\n var b = void 0;\n u && h || u ? b = c.properties : h && (b = c.mappedProperties);\n for (var M = 0; M < b.length; M++) {\n for (var C = b[M], g = C.name, f = !1, O = l + 1; O < r.length; O++) {\n var m = r[O], v = t[O] === $3;\n if (v && (f = m.properties[C.name] != null, f))\n break;\n }\n !s[g] && !f && (s[g] = !0, a.push(g));\n }\n }\n }\n return n[o] = a, a;\n};\ne2.getContextMeta = function(e) {\n for (var t = this, r = "", n, o = e._private.styleCxtKey || "", i = 0; i < t.length; i++) {\n var a = t[i], s = a.selector && a.selector.matches(e);\n s ? r += $3 : r += X21;\n }\n return n = t.getPropertiesDiff(o, r), e._private.styleCxtKey = r, {\n key: r,\n diffPropNames: n,\n empty: n.length === 0\n };\n};\ne2.getContextStyle = function(e) {\n var t = e.key, r = this, n = this._private.contextStyles = this._private.contextStyles || {};\n if (n[t])\n return n[t];\n for (var o = {\n _private: {\n key: t\n }\n }, i = 0; i < r.length; i++) {\n var a = r[i], s = t[i] === $3;\n if (s)\n for (var l = 0; l < a.properties.length; l++) {\n var c = a.properties[l];\n o[c.name] = c;\n }\n }\n return n[t] = o, o;\n};\ne2.applyContextStyle = function(e, t, r) {\n for (var n = this, o = e.diffPropNames, i = {}, a = n.types, s = 0; s < o.length; s++) {\n var l = o[s], c = t[l], p = r.pstyle(l);\n if (!c)\n if (p)\n p.bypass ? c = {\n name: l,\n deleteBypassed: !0\n } : c = {\n name: l,\n delete: !0\n };\n else\n continue;\n if (p !== c) {\n if (c.mapped === a.fn && p != null && p.mapping != null && p.mapping.value === c.value) {\n var d = p.mapping, u = d.fnValue = c.value(r);\n if (u === d.prevFnValue)\n continue;\n }\n var h = i[l] = {\n prev: p\n };\n n.applyParsedProperty(r, c), h.next = r.pstyle(l), h.next && h.next.bypass && (h.next = h.next.bypassed);\n }\n }\n return {\n diffProps: i\n };\n};\ne2.updateStyleHints = function(e) {\n var t = e._private, r = this, n = r.propertyGroupNames, o = r.propertyGroupKeys, i = function(G, J, F) {\n return r.getPropertiesHash(G, J, F);\n }, a = t.styleKey;\n if (e.removed())\n return !1;\n var s = t.group === "nodes", l = e._private.style;\n n = Object.keys(l);\n for (var c = 0; c < o.length; c++) {\n var p = o[c];\n t.styleKeys[p] = [na, P3];\n }\n for (var d = function(G, J) {\n return t.styleKeys[J][0] = W4(G, t.styleKeys[J][0]);\n }, u = function(G, J) {\n return t.styleKeys[J][1] = E4(G, t.styleKeys[J][1]);\n }, h = function(G, J) {\n d(G, J), u(G, J);\n }, b = function(G, J) {\n for (var F = 0; F < G.length; F++) {\n var V = G.charCodeAt(F);\n d(V, J), u(V, J);\n }\n }, M = 2e9, C = function(G) {\n return -128 < G && G < 128 && Math.floor(G) !== G ? M - (G * 1024 | 0) : G;\n }, g = 0; g < n.length; g++) {\n var f = n[g], O = l[f];\n if (O != null) {\n var m = this.properties[f], v = m.type, y = m.groupKey, z = void 0;\n m.hashOverride != null ? z = m.hashOverride(e, O) : O.pfValue != null && (z = O.pfValue);\n var N = m.enums == null ? O.value : null, W = z != null, T = N != null, x = W || T, E = O.units;\n if (v.number && x && !v.multiple) {\n var L = W ? z : N;\n h(C(L), y), !W && E != null && b(E, y);\n } else\n b(O.strValue, y);\n }\n }\n for (var w = [na, P3], q = 0; q < o.length; q++) {\n var S = o[q], B = t.styleKeys[S];\n w[0] = W4(B[0], w[0]), w[1] = E4(B[1], w[1]);\n }\n t.styleKey = ie1(w[0], w[1]);\n var I = t.styleKeys;\n t.labelDimsKey = jn(I.labelDimensions);\n var P = i(e, ["label"], I.labelDimensions);\n if (t.labelKey = jn(P), t.labelStyleKey = jn(z5(I.commonLabel, P)), !s) {\n var k = i(e, ["source-label"], I.labelDimensions);\n t.sourceLabelKey = jn(k), t.sourceLabelStyleKey = jn(z5(I.commonLabel, k));\n var K = i(e, ["target-label"], I.labelDimensions);\n t.targetLabelKey = jn(K), t.targetLabelStyleKey = jn(z5(I.commonLabel, K));\n }\n if (s) {\n var $ = t.styleKeys, j = $.nodeBody, r1 = $.nodeBorder, a1 = $.backgroundImage, _ = $.compound, Y = $.pie, D = [j, r1, a1, _, Y].filter(function(H) {\n return H != null;\n }).reduce(z5, [na, P3]);\n t.nodeKey = jn(D), t.hasPie = Y != null && Y[0] !== na && Y[1] !== P3;\n }\n return a !== t.styleKey;\n};\ne2.clearStyleHints = function(e) {\n var t = e._private;\n t.styleCxtKey = "", t.styleKeys = {}, t.styleKey = null, t.labelKey = null, t.labelStyleKey = null, t.sourceLabelKey = null, t.sourceLabelStyleKey = null, t.targetLabelKey = null, t.targetLabelStyleKey = null, t.nodeKey = null, t.hasPie = null;\n};\ne2.applyParsedProperty = function(e, t) {\n var r = this, n = t, o = e._private.style, i, a = r.types, s = r.properties[n.name].type, l = n.bypass, c = o[n.name], p = c && c.bypass, d = e._private, u = "mapping", h = function(j) {\n return j == null ? null : j.pfValue != null ? j.pfValue : j.value;\n }, b = function() {\n var j = h(c), r1 = h(n);\n r.checkTriggers(e, n.name, j, r1);\n };\n if (t.name === "curve-style" && e.isEdge() && // loops must be bundled beziers\n (t.value !== "bezier" && e.isLoop() || // edges connected to compound nodes can not be haystacks\n t.value === "haystack" && (e.source().isParent() || e.target().isParent())) && (n = t = this.parse(t.name, "bezier", l)), n.delete)\n return o[n.name] = void 0, b(), !0;\n if (n.deleteBypassed)\n return c ? c.bypass ? (c.bypassed = void 0, b(), !0) : !1 : (b(), !0);\n if (n.deleteBypass)\n return c ? c.bypass ? (o[n.name] = c.bypassed, b(), !0) : !1 : (b(), !0);\n var M = function() {\n je("Do not assign mappings to elements without corresponding data (i.e. ele `" + e.id() + "` has no mapping for property `" + n.name + "` with data field `" + n.field + "`); try a `[" + n.field + "]` selector to limit scope to elements with `" + n.field + "` defined");\n };\n switch (n.mapped) {\n case a.mapData: {\n for (var C = n.field.split("."), g = d.data, f = 0; f < C.length && g; f++) {\n var O = C[f];\n g = g[O];\n }\n if (g == null)\n return M(), !1;\n var m;\n if (O0(g)) {\n var v = n.fieldMax - n.fieldMin;\n v === 0 ? m = 0 : m = (g - n.fieldMin) / v;\n } else\n return je("Do not use continuous mappers without specifying numeric data (i.e. `" + n.field + ": " + g + "` for `" + e.id() + "` is non-numeric)"), !1;\n if (m < 0 ? m = 0 : m > 1 && (m = 1), s.color) {\n var y = n.valueMin[0], z = n.valueMax[0], N = n.valueMin[1], W = n.valueMax[1], T = n.valueMin[2], x = n.valueMax[2], E = n.valueMin[3] == null ? 1 : n.valueMin[3], L = n.valueMax[3] == null ? 1 : n.valueMax[3], w = [Math.round(y + (z - y) * m), Math.round(N + (W - N) * m), Math.round(T + (x - T) * m), Math.round(E + (L - E) * m)];\n i = {\n // colours are simple, so just create the flat property instead of expensive string parsing\n bypass: n.bypass,\n // we\'re a bypass if the mapping property is a bypass\n name: n.name,\n value: w,\n strValue: "rgb(" + w[0] + ", " + w[1] + ", " + w[2] + ")"\n };\n } else if (s.number) {\n var q = n.valueMin + (n.valueMax - n.valueMin) * m;\n i = this.parse(n.name, q, n.bypass, u);\n } else\n return !1;\n if (!i)\n return M(), !1;\n i.mapping = n, n = i;\n break;\n }\n case a.data: {\n for (var S = n.field.split("."), B = d.data, I = 0; I < S.length && B; I++) {\n var P = S[I];\n B = B[P];\n }\n if (B != null && (i = this.parse(n.name, B, n.bypass, u)), !i)\n return M(), !1;\n i.mapping = n, n = i;\n break;\n }\n case a.fn: {\n var k = n.value, K = n.fnValue != null ? n.fnValue : k(e);\n if (n.prevFnValue = K, K == null)\n return je("Custom function mappers may not return null (i.e. `" + n.name + "` for ele `" + e.id() + "` is null)"), !1;\n if (i = this.parse(n.name, K, n.bypass, u), !i)\n return je("Custom function mappers may not return invalid values for the property type (i.e. `" + n.name + "` for ele `" + e.id() + "` is invalid)"), !1;\n i.mapping = Fr(n), n = i;\n break;\n }\n case void 0:\n break;\n default:\n return !1;\n }\n return l ? (p ? n.bypassed = c.bypassed : n.bypassed = c, o[n.name] = n) : p ? c.bypassed = n : o[n.name] = n, b(), !0;\n};\ne2.cleanElements = function(e, t) {\n for (var r = 0; r < e.length; r++) {\n var n = e[r];\n if (this.clearStyleHints(n), n.dirtyCompoundBoundsCache(), n.dirtyBoundingBoxCache(), !t)\n n._private.style = {};\n else\n for (var o = n._private.style, i = Object.keys(o), a = 0; a < i.length; a++) {\n var s = i[a], l = o[s];\n l != null && (l.bypass ? l.bypassed = null : o[s] = null);\n }\n }\n};\ne2.update = function() {\n var e = this._private.cy, t = e.mutableElements();\n t.updateStyle();\n};\ne2.updateTransitions = function(e, t) {\n var r = this, n = e._private, o = e.pstyle("transition-property").value, i = e.pstyle("transition-duration").pfValue, a = e.pstyle("transition-delay").pfValue;\n if (o.length > 0 && i > 0) {\n for (var s = {}, l = !1, c = 0; c < o.length; c++) {\n var p = o[c], d = e.pstyle(p), u = t[p];\n if (u) {\n var h = u.prev, b = h, M = u.next != null ? u.next : d, C = !1, g = void 0, f = 1e-6;\n b && (O0(b.pfValue) && O0(M.pfValue) ? (C = M.pfValue - b.pfValue, g = b.pfValue + f * C) : O0(b.value) && O0(M.value) ? (C = M.value - b.value, g = b.value + f * C) : Ve(b.value) && Ve(M.value) && (C = b.value[0] !== M.value[0] || b.value[1] !== M.value[1] || b.value[2] !== M.value[2], g = b.strValue), C && (s[p] = M.strValue, this.applyBypass(e, p, g), l = !0));\n }\n }\n if (!l)\n return;\n n.transitioning = !0, new Xa(function(O) {\n a > 0 ? e.delayAnimation(a).play().promise().then(O) : O();\n }).then(function() {\n return e.animation({\n style: s,\n duration: i,\n easing: e.pstyle("transition-timing-function").value,\n queue: !1\n }).play().promise();\n }).then(function() {\n r.removeBypasses(e, o), e.emitAndNotify("style"), n.transitioning = !1;\n });\n } else\n n.transitioning && (this.removeBypasses(e, o), e.emitAndNotify("style"), n.transitioning = !1);\n};\ne2.checkTrigger = function(e, t, r, n, o, i) {\n var a = this.properties[t], s = o(a);\n s != null && s(r, n) && i(a);\n};\ne2.checkZOrderTrigger = function(e, t, r, n) {\n var o = this;\n this.checkTrigger(e, t, r, n, function(i) {\n return i.triggersZOrder;\n }, function() {\n o._private.cy.notify("zorder", e);\n });\n};\ne2.checkBoundsTrigger = function(e, t, r, n) {\n this.checkTrigger(e, t, r, n, function(o) {\n return o.triggersBounds;\n }, function(o) {\n e.dirtyCompoundBoundsCache(), e.dirtyBoundingBoxCache(), // only for beziers -- so performance of other edges isn\'t affected\n t === "curve-style" && (r === "bezier" || n === "bezier") && o.triggersBoundsOfParallelBeziers && e.parallelEdges().forEach(function(i) {\n i.isBundledBezier() && i.dirtyBoundingBoxCache();\n });\n });\n};\ne2.checkTriggers = function(e, t, r, n) {\n e.dirtyStyleCache(), this.checkZOrderTrigger(e, t, r, n), this.checkBoundsTrigger(e, t, r, n);\n};\nvar hs = {};\nhs.applyBypass = function(e, t, r, n) {\n var o = this, i = [], a = !0;\n if (t === "*" || t === "**") {\n if (r !== void 0)\n for (var s = 0; s < o.properties.length; s++) {\n var l = o.properties[s], c = l.name, p = this.parse(c, r, !0);\n p && i.push(p);\n }\n } else if (U0(t)) {\n var d = this.parse(t, r, !0);\n d && i.push(d);\n } else if (Ce(t)) {\n var u = t;\n n = r;\n for (var h = Object.keys(u), b = 0; b < h.length; b++) {\n var M = h[b], C = u[M];\n if (C === void 0 && (C = u[Ic(M)]), C !== void 0) {\n var g = this.parse(M, C, !0);\n g && i.push(g);\n }\n }\n } else\n return !1;\n if (i.length === 0)\n return !1;\n for (var f = !1, O = 0; O < e.length; O++) {\n for (var m = e[O], v = {}, y = void 0, z = 0; z < i.length; z++) {\n var N = i[z];\n if (n) {\n var W = m.pstyle(N.name);\n y = v[N.name] = {\n prev: W\n };\n }\n f = this.applyParsedProperty(m, Fr(N)) || f, n && (y.next = m.pstyle(N.name));\n }\n f && this.updateStyleHints(m), n && this.updateTransitions(m, v, a);\n }\n return f;\n};\nhs.overrideBypass = function(e, t, r) {\n t = H9(t);\n for (var n = 0; n < e.length; n++) {\n var o = e[n], i = o._private.style[t], a = this.properties[t].type, s = a.color, l = a.mutiple, c = i ? i.pfValue != null ? i.pfValue : i.value : null;\n !i || !i.bypass ? this.applyBypass(o, t, r) : (i.value = r, i.pfValue != null && (i.pfValue = r), s ? i.strValue = "rgb(" + r.join(",") + ")" : l ? i.strValue = r.join(" ") : i.strValue = "" + r, this.updateStyleHints(o)), this.checkTriggers(o, t, c, r);\n }\n};\nhs.removeAllBypasses = function(e, t) {\n return this.removeBypasses(e, this.propertyNames, t);\n};\nhs.removeBypasses = function(e, t, r) {\n for (var n = !0, o = 0; o < e.length; o++) {\n for (var i = e[o], a = {}, s = 0; s < t.length; s++) {\n var l = t[s], c = this.properties[l], p = i.pstyle(c.name);\n if (!(!p || !p.bypass)) {\n var d = "", u = this.parse(l, d, !0), h = a[c.name] = {\n prev: p\n };\n this.applyParsedProperty(i, u), h.next = i.pstyle(c.name);\n }\n }\n this.updateStyleHints(i), r && this.updateTransitions(i, a, n);\n }\n};\nvar Z9 = {};\nZ9.getEmSizeInPixels = function() {\n var e = this.containerCss("font-size");\n return e != null ? parseFloat(e) : 1;\n};\nZ9.containerCss = function(e) {\n var t = this._private.cy, r = t.container();\n if (et && r && et.getComputedStyle)\n return et.getComputedStyle(r).getPropertyValue(e);\n};\nvar Jr = {};\nJr.getRenderedStyle = function(e, t) {\n return t ? this.getStylePropertyValue(e, t, !0) : this.getRawStyle(e, !0);\n};\nJr.getRawStyle = function(e, t) {\n var r = this;\n if (e = e[0], e) {\n for (var n = {}, o = 0; o < r.properties.length; o++) {\n var i = r.properties[o], a = r.getStylePropertyValue(e, i.name, t);\n a != null && (n[i.name] = a, n[Ic(i.name)] = a);\n }\n return n;\n }\n};\nJr.getIndexedStyle = function(e, t, r, n) {\n var o = e.pstyle(t)[r][n];\n return o ?? e.cy().style().getDefaultProperty(t)[r][0];\n};\nJr.getStylePropertyValue = function(e, t, r) {\n var n = this;\n if (e = e[0], e) {\n var o = n.properties[t];\n o.alias && (o = o.pointsTo);\n var i = o.type, a = e.pstyle(o.name);\n if (a) {\n var s = a.value, l = a.units, c = a.strValue;\n if (r && i.number && s != null && O0(s)) {\n var p = e.cy().zoom(), d = function(C) {\n return C * p;\n }, u = function(C, g) {\n return d(C) + g;\n }, h = Ve(s), b = h ? l.every(function(M) {\n return M != null;\n }) : l != null;\n return b ? h ? s.map(function(M, C) {\n return u(M, l[C]);\n }).join(" ") : u(s, l) : h ? s.map(function(M) {\n return U0(M) ? M : "" + d(M);\n }).join(" ") : "" + d(s);\n } else if (c != null)\n return c;\n }\n return null;\n }\n};\nJr.getAnimationStartStyle = function(e, t) {\n for (var r = {}, n = 0; n < t.length; n++) {\n var o = t[n], i = o.name, a = e.pstyle(i);\n a !== void 0 && (Ce(a) ? a = this.parse(i, a.strValue) : a = this.parse(i, a)), a && (r[i] = a);\n }\n return r;\n};\nJr.getPropsList = function(e) {\n var t = this, r = [], n = e, o = t.properties;\n if (n)\n for (var i = Object.keys(n), a = 0; a < i.length; a++) {\n var s = i[a], l = n[s], c = o[s] || o[H9(s)], p = this.parse(c.name, l);\n p && r.push(p);\n }\n return r;\n};\nJr.getNonDefaultPropertiesHash = function(e, t, r) {\n var n = r.slice(), o, i, a, s, l, c;\n for (l = 0; l < t.length; l++)\n if (o = t[l], i = e.pstyle(o, !1), i != null)\n if (i.pfValue != null)\n n[0] = W4(s, n[0]), n[1] = E4(s, n[1]);\n else\n for (a = i.strValue, c = 0; c < a.length; c++)\n s = a.charCodeAt(c), n[0] = W4(s, n[0]), n[1] = E4(s, n[1]);\n return n;\n};\nJr.getPropertiesHash = Jr.getNonDefaultPropertiesHash;\nvar Yc = {};\nYc.appendFromJson = function(e) {\n for (var t = this, r = 0; r < e.length; r++) {\n var n = e[r], o = n.selector, i = n.style || n.css, a = Object.keys(i);\n t.selector(o);\n for (var s = 0; s < a.length; s++) {\n var l = a[s], c = i[l];\n t.css(l, c);\n }\n }\n return t;\n};\nYc.fromJson = function(e) {\n var t = this;\n return t.resetToDefault(), t.appendFromJson(e), t;\n};\nYc.json = function() {\n for (var e = [], t = this.defaultLength; t < this.length; t++) {\n for (var r = this[t], n = r.selector, o = r.properties, i = {}, a = 0; a < o.length; a++) {\n var s = o[a];\n i[s.name] = s.strValue;\n }\n e.push({\n selector: n ? n.toString() : "core",\n style: i\n });\n }\n return e;\n};\nvar J9 = {};\nJ9.appendFromString = function(e) {\n var t = this, r = this, n = "" + e, o, i, a;\n n = n.replace(/[/][*](\\s|.)+?[*][/]/g, "");\n function s() {\n n.length > o.length ? n = n.substr(o.length) : n = "";\n }\n function l() {\n i.length > a.length ? i = i.substr(a.length) : i = "";\n }\n for (; ; ) {\n var c = n.match(/^\\s*$/);\n if (c)\n break;\n var p = n.match(/^\\s*((?:.|\\s)+?)\\s*\\{((?:.|\\s)+?)\\}/);\n if (!p) {\n je("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: " + n);\n break;\n }\n o = p[0];\n var d = p[1];\n if (d !== "core") {\n var u = new vo(d);\n if (u.invalid) {\n je("Skipping parsing of block: Invalid selector found in string stylesheet: " + d), s();\n continue;\n }\n }\n var h = p[2], b = !1;\n i = h;\n for (var M = []; ; ) {\n var C = i.match(/^\\s*$/);\n if (C)\n break;\n var g = i.match(/^\\s*(.+?)\\s*:\\s*(.+?)\\s*;/);\n if (!g) {\n je("Skipping parsing of block: Invalid formatting of style property and value definitions found in:" + h), b = !0;\n break;\n }\n a = g[0];\n var f = g[1], O = g[2], m = t.properties[f];\n if (!m) {\n je("Skipping property: Invalid property name in: " + a), l();\n continue;\n }\n var v = r.parse(f, O);\n if (!v) {\n je("Skipping property: Invalid property definition in: " + a), l();\n continue;\n }\n M.push({\n name: f,\n val: O\n }), l();\n }\n if (b) {\n s();\n break;\n }\n r.selector(d);\n for (var y = 0; y < M.length; y++) {\n var z = M[y];\n r.css(z.name, z.val);\n }\n s();\n }\n return r;\n};\nJ9.fromString = function(e) {\n var t = this;\n return t.resetToDefault(), t.appendFromString(e), t;\n};\nvar It = {};\n(function() {\n var e = yt, t = Q01, r = j01, n = K01, o = Z01, i = function(Y) {\n return "^" + Y + "\\\\s*\\\\(\\\\s*([\\\\w\\\\.]+)\\\\s*\\\\)$";\n }, a = function(Y) {\n var D = e + "|\\\\w+|" + t + "|" + r + "|" + n + "|" + o;\n return "^" + Y + "\\\\s*\\\\(([\\\\w\\\\.]+)\\\\s*\\\\,\\\\s*(" + e + ")\\\\s*\\\\,\\\\s*(" + e + ")\\\\s*,\\\\s*(" + D + ")\\\\s*\\\\,\\\\s*(" + D + ")\\\\)$";\n }, s = [`^url\\\\s*\\\\(\\\\s*[\'"]?(.+?)[\'"]?\\\\s*\\\\)$`, "^(none)$", "^(.+)$"];\n It.types = {\n time: {\n number: !0,\n min: 0,\n units: "s|ms",\n implicitUnits: "ms"\n },\n percent: {\n number: !0,\n min: 0,\n max: 100,\n units: "%",\n implicitUnits: "%"\n },\n percentages: {\n number: !0,\n min: 0,\n max: 100,\n units: "%",\n implicitUnits: "%",\n multiple: !0\n },\n zeroOneNumber: {\n number: !0,\n min: 0,\n max: 1,\n unitless: !0\n },\n zeroOneNumbers: {\n number: !0,\n min: 0,\n max: 1,\n unitless: !0,\n multiple: !0\n },\n nOneOneNumber: {\n number: !0,\n min: -1,\n max: 1,\n unitless: !0\n },\n nonNegativeInt: {\n number: !0,\n min: 0,\n integer: !0,\n unitless: !0\n },\n position: {\n enums: ["parent", "origin"]\n },\n nodeSize: {\n number: !0,\n min: 0,\n enums: ["label"]\n },\n number: {\n number: !0,\n unitless: !0\n },\n numbers: {\n number: !0,\n unitless: !0,\n multiple: !0\n },\n positiveNumber: {\n number: !0,\n unitless: !0,\n min: 0,\n strictMin: !0\n },\n size: {\n number: !0,\n min: 0\n },\n bidirectionalSize: {\n number: !0\n },\n // allows negative\n bidirectionalSizeMaybePercent: {\n number: !0,\n allowPercent: !0\n },\n // allows negative\n bidirectionalSizes: {\n number: !0,\n multiple: !0\n },\n // allows negative\n sizeMaybePercent: {\n number: !0,\n min: 0,\n allowPercent: !0\n },\n axisDirection: {\n enums: ["horizontal", "leftward", "rightward", "vertical", "upward", "downward", "auto"]\n },\n paddingRelativeTo: {\n enums: ["width", "height", "average", "min", "max"]\n },\n bgWH: {\n number: !0,\n min: 0,\n allowPercent: !0,\n enums: ["auto"],\n multiple: !0\n },\n bgPos: {\n number: !0,\n allowPercent: !0,\n multiple: !0\n },\n bgRelativeTo: {\n enums: ["inner", "include-padding"],\n multiple: !0\n },\n bgRepeat: {\n enums: ["repeat", "repeat-x", "repeat-y", "no-repeat"],\n multiple: !0\n },\n bgFit: {\n enums: ["none", "contain", "cover"],\n multiple: !0\n },\n bgCrossOrigin: {\n enums: ["anonymous", "use-credentials"],\n multiple: !0\n },\n bgClip: {\n enums: ["none", "node"],\n multiple: !0\n },\n color: {\n color: !0\n },\n colors: {\n color: !0,\n multiple: !0\n },\n fill: {\n enums: ["solid", "linear-gradient", "radial-gradient"]\n },\n bool: {\n enums: ["yes", "no"]\n },\n lineStyle: {\n enums: ["solid", "dotted", "dashed"]\n },\n lineCap: {\n enums: ["butt", "round", "square"]\n },\n borderStyle: {\n enums: ["solid", "dotted", "dashed", "double"]\n },\n curveStyle: {\n enums: ["bezier", "unbundled-bezier", "haystack", "segments", "straight", "taxi"]\n },\n fontFamily: {\n regex: \'^([\\\\w- \\\\"]+(?:\\\\s*,\\\\s*[\\\\w- \\\\"]+)*)$\'\n },\n fontStyle: {\n enums: ["italic", "normal", "oblique"]\n },\n fontWeight: {\n enums: ["normal", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "800", "900", 100, 200, 300, 400, 500, 600, 700, 800, 900]\n },\n textDecoration: {\n enums: ["none", "underline", "overline", "line-through"]\n },\n textTransform: {\n enums: ["none", "uppercase", "lowercase"]\n },\n textWrap: {\n enums: ["none", "wrap", "ellipsis"]\n },\n textOverflowWrap: {\n enums: ["whitespace", "anywhere"]\n },\n textBackgroundShape: {\n enums: ["rectangle", "roundrectangle", "round-rectangle"]\n },\n nodeShape: {\n enums: ["rectangle", "roundrectangle", "round-rectangle", "cutrectangle", "cut-rectangle", "bottomroundrectangle", "bottom-round-rectangle", "barrel", "ellipse", "triangle", "round-triangle", "square", "pentagon", "round-pentagon", "hexagon", "round-hexagon", "concavehexagon", "concave-hexagon", "heptagon", "round-heptagon", "octagon", "round-octagon", "tag", "round-tag", "star", "diamond", "round-diamond", "vee", "rhomboid", "polygon"]\n },\n compoundIncludeLabels: {\n enums: ["include", "exclude"]\n },\n arrowShape: {\n enums: ["tee", "triangle", "triangle-tee", "circle-triangle", "triangle-cross", "triangle-backcurve", "vee", "square", "circle", "diamond", "chevron", "none"]\n },\n arrowFill: {\n enums: ["filled", "hollow"]\n },\n display: {\n enums: ["element", "none"]\n },\n visibility: {\n enums: ["hidden", "visible"]\n },\n zCompoundDepth: {\n enums: ["bottom", "orphan", "auto", "top"]\n },\n zIndexCompare: {\n enums: ["auto", "manual"]\n },\n valign: {\n enums: ["top", "center", "bottom"]\n },\n halign: {\n enums: ["left", "center", "right"]\n },\n justification: {\n enums: ["left", "center", "right", "auto"]\n },\n text: {\n string: !0\n },\n data: {\n mapping: !0,\n regex: i("data")\n },\n layoutData: {\n mapping: !0,\n regex: i("layoutData")\n },\n scratch: {\n mapping: !0,\n regex: i("scratch")\n },\n mapData: {\n mapping: !0,\n regex: a("mapData")\n },\n mapLayoutData: {\n mapping: !0,\n regex: a("mapLayoutData")\n },\n mapScratch: {\n mapping: !0,\n regex: a("mapScratch")\n },\n fn: {\n mapping: !0,\n fn: !0\n },\n url: {\n regexes: s,\n singleRegexMatchValue: !0\n },\n urls: {\n regexes: s,\n singleRegexMatchValue: !0,\n multiple: !0\n },\n propList: {\n propList: !0\n },\n angle: {\n number: !0,\n units: "deg|rad",\n implicitUnits: "rad"\n },\n textRotation: {\n number: !0,\n units: "deg|rad",\n implicitUnits: "rad",\n enums: ["none", "autorotate"]\n },\n polygonPointList: {\n number: !0,\n multiple: !0,\n evenMultiple: !0,\n min: -1,\n max: 1,\n unitless: !0\n },\n edgeDistances: {\n enums: ["intersection", "node-position"]\n },\n edgeEndpoint: {\n number: !0,\n multiple: !0,\n units: "%|px|em|deg|rad",\n implicitUnits: "px",\n enums: ["inside-to-node", "outside-to-node", "outside-to-node-or-label", "outside-to-line", "outside-to-line-or-label"],\n singleEnum: !0,\n validate: function(Y, D) {\n switch (Y.length) {\n case 2:\n return D[0] !== "deg" && D[0] !== "rad" && D[1] !== "deg" && D[1] !== "rad";\n case 1:\n return U0(Y[0]) || D[0] === "deg" || D[0] === "rad";\n default:\n return !1;\n }\n }\n },\n easing: {\n regexes: ["^(spring)\\\\s*\\\\(\\\\s*(" + e + ")\\\\s*,\\\\s*(" + e + ")\\\\s*\\\\)$", "^(cubic-bezier)\\\\s*\\\\(\\\\s*(" + e + ")\\\\s*,\\\\s*(" + e + ")\\\\s*,\\\\s*(" + e + ")\\\\s*,\\\\s*(" + e + ")\\\\s*\\\\)$"],\n enums: ["linear", "ease", "ease-in", "ease-out", "ease-in-out", "ease-in-sine", "ease-out-sine", "ease-in-out-sine", "ease-in-quad", "ease-out-quad", "ease-in-out-quad", "ease-in-cubic", "ease-out-cubic", "ease-in-out-cubic", "ease-in-quart", "ease-out-quart", "ease-in-out-quart", "ease-in-quint", "ease-out-quint", "ease-in-out-quint", "ease-in-expo", "ease-out-expo", "ease-in-out-expo", "ease-in-circ", "ease-out-circ", "ease-in-out-circ"]\n },\n gradientDirection: {\n enums: ["to-bottom", "to-top", "to-left", "to-right", "to-bottom-right", "to-bottom-left", "to-top-right", "to-top-left", "to-right-bottom", "to-left-bottom", "to-right-top", "to-left-top"]\n },\n boundsExpansion: {\n number: !0,\n multiple: !0,\n min: 0,\n validate: function(Y) {\n var D = Y.length;\n return D === 1 || D === 2 || D === 4;\n }\n }\n };\n var l = {\n zeroNonZero: function(Y, D) {\n return (Y == null || D == null) && Y !== D || Y == 0 && D != 0 ? !0 : Y != 0 && D == 0;\n },\n any: function(Y, D) {\n return Y != D;\n },\n emptyNonEmpty: function(Y, D) {\n var H = Oo(Y), G = Oo(D);\n return H && !G || !H && G;\n }\n }, c = It.types, p = [{\n name: "label",\n type: c.text,\n triggersBounds: l.any,\n triggersZOrder: l.emptyNonEmpty\n }, {\n name: "text-rotation",\n type: c.textRotation,\n triggersBounds: l.any\n }, {\n name: "text-margin-x",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "text-margin-y",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }], d = [{\n name: "source-label",\n type: c.text,\n triggersBounds: l.any\n }, {\n name: "source-text-rotation",\n type: c.textRotation,\n triggersBounds: l.any\n }, {\n name: "source-text-margin-x",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "source-text-margin-y",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "source-text-offset",\n type: c.size,\n triggersBounds: l.any\n }], u = [{\n name: "target-label",\n type: c.text,\n triggersBounds: l.any\n }, {\n name: "target-text-rotation",\n type: c.textRotation,\n triggersBounds: l.any\n }, {\n name: "target-text-margin-x",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "target-text-margin-y",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "target-text-offset",\n type: c.size,\n triggersBounds: l.any\n }], h = [{\n name: "font-family",\n type: c.fontFamily,\n triggersBounds: l.any\n }, {\n name: "font-style",\n type: c.fontStyle,\n triggersBounds: l.any\n }, {\n name: "font-weight",\n type: c.fontWeight,\n triggersBounds: l.any\n }, {\n name: "font-size",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "text-transform",\n type: c.textTransform,\n triggersBounds: l.any\n }, {\n name: "text-wrap",\n type: c.textWrap,\n triggersBounds: l.any\n }, {\n name: "text-overflow-wrap",\n type: c.textOverflowWrap,\n triggersBounds: l.any\n }, {\n name: "text-max-width",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "text-outline-width",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "line-height",\n type: c.positiveNumber,\n triggersBounds: l.any\n }], b = [{\n name: "text-valign",\n type: c.valign,\n triggersBounds: l.any\n }, {\n name: "text-halign",\n type: c.halign,\n triggersBounds: l.any\n }, {\n name: "color",\n type: c.color\n }, {\n name: "text-outline-color",\n type: c.color\n }, {\n name: "text-outline-opacity",\n type: c.zeroOneNumber\n }, {\n name: "text-background-color",\n type: c.color\n }, {\n name: "text-background-opacity",\n type: c.zeroOneNumber\n }, {\n name: "text-background-padding",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "text-border-opacity",\n type: c.zeroOneNumber\n }, {\n name: "text-border-color",\n type: c.color\n }, {\n name: "text-border-width",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "text-border-style",\n type: c.borderStyle,\n triggersBounds: l.any\n }, {\n name: "text-background-shape",\n type: c.textBackgroundShape,\n triggersBounds: l.any\n }, {\n name: "text-justification",\n type: c.justification\n }], M = [{\n name: "events",\n type: c.bool\n }, {\n name: "text-events",\n type: c.bool\n }], C = [{\n name: "display",\n type: c.display,\n triggersZOrder: l.any,\n triggersBounds: l.any,\n triggersBoundsOfParallelBeziers: !0\n }, {\n name: "visibility",\n type: c.visibility,\n triggersZOrder: l.any\n }, {\n name: "opacity",\n type: c.zeroOneNumber,\n triggersZOrder: l.zeroNonZero\n }, {\n name: "text-opacity",\n type: c.zeroOneNumber\n }, {\n name: "min-zoomed-font-size",\n type: c.size\n }, {\n name: "z-compound-depth",\n type: c.zCompoundDepth,\n triggersZOrder: l.any\n }, {\n name: "z-index-compare",\n type: c.zIndexCompare,\n triggersZOrder: l.any\n }, {\n name: "z-index",\n type: c.nonNegativeInt,\n triggersZOrder: l.any\n }], g = [{\n name: "overlay-padding",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "overlay-color",\n type: c.color\n }, {\n name: "overlay-opacity",\n type: c.zeroOneNumber,\n triggersBounds: l.zeroNonZero\n }], f = [{\n name: "transition-property",\n type: c.propList\n }, {\n name: "transition-duration",\n type: c.time\n }, {\n name: "transition-delay",\n type: c.time\n }, {\n name: "transition-timing-function",\n type: c.easing\n }], O = function(Y, D) {\n return D.value === "label" ? -Y.poolIndex() : D.pfValue;\n }, m = [{\n name: "height",\n type: c.nodeSize,\n triggersBounds: l.any,\n hashOverride: O\n }, {\n name: "width",\n type: c.nodeSize,\n triggersBounds: l.any,\n hashOverride: O\n }, {\n name: "shape",\n type: c.nodeShape,\n triggersBounds: l.any\n }, {\n name: "shape-polygon-points",\n type: c.polygonPointList,\n triggersBounds: l.any\n }, {\n name: "background-color",\n type: c.color\n }, {\n name: "background-fill",\n type: c.fill\n }, {\n name: "background-opacity",\n type: c.zeroOneNumber\n }, {\n name: "background-blacken",\n type: c.nOneOneNumber\n }, {\n name: "background-gradient-stop-colors",\n type: c.colors\n }, {\n name: "background-gradient-stop-positions",\n type: c.percentages\n }, {\n name: "background-gradient-direction",\n type: c.gradientDirection\n }, {\n name: "padding",\n type: c.sizeMaybePercent,\n triggersBounds: l.any\n }, {\n name: "padding-relative-to",\n type: c.paddingRelativeTo,\n triggersBounds: l.any\n }, {\n name: "bounds-expansion",\n type: c.boundsExpansion,\n triggersBounds: l.any\n }], v = [{\n name: "border-color",\n type: c.color\n }, {\n name: "border-opacity",\n type: c.zeroOneNumber\n }, {\n name: "border-width",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "border-style",\n type: c.borderStyle\n }], y = [{\n name: "background-image",\n type: c.urls\n }, {\n name: "background-image-crossorigin",\n type: c.bgCrossOrigin\n }, {\n name: "background-image-opacity",\n type: c.zeroOneNumbers\n }, {\n name: "background-position-x",\n type: c.bgPos\n }, {\n name: "background-position-y",\n type: c.bgPos\n }, {\n name: "background-width-relative-to",\n type: c.bgRelativeTo\n }, {\n name: "background-height-relative-to",\n type: c.bgRelativeTo\n }, {\n name: "background-repeat",\n type: c.bgRepeat\n }, {\n name: "background-fit",\n type: c.bgFit\n }, {\n name: "background-clip",\n type: c.bgClip\n }, {\n name: "background-width",\n type: c.bgWH\n }, {\n name: "background-height",\n type: c.bgWH\n }, {\n name: "background-offset-x",\n type: c.bgPos\n }, {\n name: "background-offset-y",\n type: c.bgPos\n }], z = [{\n name: "position",\n type: c.position,\n triggersBounds: l.any\n }, {\n name: "compound-sizing-wrt-labels",\n type: c.compoundIncludeLabels,\n triggersBounds: l.any\n }, {\n name: "min-width",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "min-width-bias-left",\n type: c.sizeMaybePercent,\n triggersBounds: l.any\n }, {\n name: "min-width-bias-right",\n type: c.sizeMaybePercent,\n triggersBounds: l.any\n }, {\n name: "min-height",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "min-height-bias-top",\n type: c.sizeMaybePercent,\n triggersBounds: l.any\n }, {\n name: "min-height-bias-bottom",\n type: c.sizeMaybePercent,\n triggersBounds: l.any\n }], N = [{\n name: "line-style",\n type: c.lineStyle\n }, {\n name: "line-color",\n type: c.color\n }, {\n name: "line-fill",\n type: c.fill\n }, {\n name: "line-cap",\n type: c.lineCap\n }, {\n name: "line-opacity",\n type: c.zeroOneNumber\n }, {\n name: "line-dash-pattern",\n type: c.numbers\n }, {\n name: "line-dash-offset",\n type: c.number\n }, {\n name: "line-gradient-stop-colors",\n type: c.colors\n }, {\n name: "line-gradient-stop-positions",\n type: c.percentages\n }, {\n name: "curve-style",\n type: c.curveStyle,\n triggersBounds: l.any,\n triggersBoundsOfParallelBeziers: !0\n }, {\n name: "haystack-radius",\n type: c.zeroOneNumber,\n triggersBounds: l.any\n }, {\n name: "source-endpoint",\n type: c.edgeEndpoint,\n triggersBounds: l.any\n }, {\n name: "target-endpoint",\n type: c.edgeEndpoint,\n triggersBounds: l.any\n }, {\n name: "control-point-step-size",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "control-point-distances",\n type: c.bidirectionalSizes,\n triggersBounds: l.any\n }, {\n name: "control-point-weights",\n type: c.numbers,\n triggersBounds: l.any\n }, {\n name: "segment-distances",\n type: c.bidirectionalSizes,\n triggersBounds: l.any\n }, {\n name: "segment-weights",\n type: c.numbers,\n triggersBounds: l.any\n }, {\n name: "taxi-turn",\n type: c.bidirectionalSizeMaybePercent,\n triggersBounds: l.any\n }, {\n name: "taxi-turn-min-distance",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "taxi-direction",\n type: c.axisDirection,\n triggersBounds: l.any\n }, {\n name: "edge-distances",\n type: c.edgeDistances,\n triggersBounds: l.any\n }, {\n name: "arrow-scale",\n type: c.positiveNumber,\n triggersBounds: l.any\n }, {\n name: "loop-direction",\n type: c.angle,\n triggersBounds: l.any\n }, {\n name: "loop-sweep",\n type: c.angle,\n triggersBounds: l.any\n }, {\n name: "source-distance-from-node",\n type: c.size,\n triggersBounds: l.any\n }, {\n name: "target-distance-from-node",\n type: c.size,\n triggersBounds: l.any\n }], W = [{\n name: "ghost",\n type: c.bool,\n triggersBounds: l.any\n }, {\n name: "ghost-offset-x",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "ghost-offset-y",\n type: c.bidirectionalSize,\n triggersBounds: l.any\n }, {\n name: "ghost-opacity",\n type: c.zeroOneNumber\n }], T = [{\n name: "selection-box-color",\n type: c.color\n }, {\n name: "selection-box-opacity",\n type: c.zeroOneNumber\n }, {\n name: "selection-box-border-color",\n type: c.color\n }, {\n name: "selection-box-border-width",\n type: c.size\n }, {\n name: "active-bg-color",\n type: c.color\n }, {\n name: "active-bg-opacity",\n type: c.zeroOneNumber\n }, {\n name: "active-bg-size",\n type: c.size\n }, {\n name: "outside-texture-bg-color",\n type: c.color\n }, {\n name: "outside-texture-bg-opacity",\n type: c.zeroOneNumber\n }], x = [];\n It.pieBackgroundN = 16, x.push({\n name: "pie-size",\n type: c.sizeMaybePercent\n });\n for (var E = 1; E <= It.pieBackgroundN; E++)\n x.push({\n name: "pie-" + E + "-background-color",\n type: c.color\n }), x.push({\n name: "pie-" + E + "-background-size",\n type: c.percent\n }), x.push({\n name: "pie-" + E + "-background-opacity",\n type: c.zeroOneNumber\n });\n var L = [], w = It.arrowPrefixes = ["source", "mid-source", "target", "mid-target"];\n [{\n name: "arrow-shape",\n type: c.arrowShape,\n triggersBounds: l.any\n }, {\n name: "arrow-color",\n type: c.color\n }, {\n name: "arrow-fill",\n type: c.arrowFill\n }].forEach(function(_) {\n w.forEach(function(Y) {\n var D = Y + "-" + _.name, H = _.type, G = _.triggersBounds;\n L.push({\n name: D,\n type: H,\n triggersBounds: G\n });\n });\n }, {});\n var q = It.properties = [].concat(M, f, C, g, W, b, h, p, d, u, m, v, y, x, z, N, L, T), S = It.propertyGroups = {\n // common to all eles\n behavior: M,\n transition: f,\n visibility: C,\n overlay: g,\n ghost: W,\n // labels\n commonLabel: b,\n labelDimensions: h,\n mainLabel: p,\n sourceLabel: d,\n targetLabel: u,\n // node props\n nodeBody: m,\n nodeBorder: v,\n backgroundImage: y,\n pie: x,\n compound: z,\n // edge props\n edgeLine: N,\n edgeArrow: L,\n core: T\n }, B = It.propertyGroupNames = {}, I = It.propertyGroupKeys = Object.keys(S);\n I.forEach(function(_) {\n B[_] = S[_].map(function(Y) {\n return Y.name;\n }), S[_].forEach(function(Y) {\n return Y.groupKey = _;\n });\n });\n var P = It.aliases = [{\n name: "content",\n pointsTo: "label"\n }, {\n name: "control-point-distance",\n pointsTo: "control-point-distances"\n }, {\n name: "control-point-weight",\n pointsTo: "control-point-weights"\n }, {\n name: "edge-text-rotation",\n pointsTo: "text-rotation"\n }, {\n name: "padding-left",\n pointsTo: "padding"\n }, {\n name: "padding-right",\n pointsTo: "padding"\n }, {\n name: "padding-top",\n pointsTo: "padding"\n }, {\n name: "padding-bottom",\n pointsTo: "padding"\n }];\n It.propertyNames = q.map(function(_) {\n return _.name;\n });\n for (var k = 0; k < q.length; k++) {\n var K = q[k];\n q[K.name] = K;\n }\n for (var $ = 0; $ < P.length; $++) {\n var j = P[$], r1 = q[j.pointsTo], a1 = {\n name: j.name,\n alias: !0,\n pointsTo: r1\n };\n q.push(a1), q[j.name] = a1;\n }\n})();\nIt.getDefaultProperty = function(e) {\n return this.getDefaultProperties()[e];\n};\nIt.getDefaultProperties = function() {\n var e = this._private;\n if (e.defaultProperties != null)\n return e.defaultProperties;\n for (var t = K0({\n // core props\n "selection-box-color": "#ddd",\n "selection-box-opacity": 0.65,\n "selection-box-border-color": "#aaa",\n "selection-box-border-width": 1,\n "active-bg-color": "black",\n "active-bg-opacity": 0.15,\n "active-bg-size": 30,\n "outside-texture-bg-color": "#000",\n "outside-texture-bg-opacity": 0.125,\n // common node/edge props\n events: "yes",\n "text-events": "no",\n "text-valign": "top",\n "text-halign": "center",\n "text-justification": "auto",\n "line-height": 1,\n color: "#000",\n "text-outline-color": "#000",\n "text-outline-width": 0,\n "text-outline-opacity": 1,\n "text-opacity": 1,\n "text-decoration": "none",\n "text-transform": "none",\n "text-wrap": "none",\n "text-overflow-wrap": "whitespace",\n "text-max-width": 9999,\n "text-background-color": "#000",\n "text-background-opacity": 0,\n "text-background-shape": "rectangle",\n "text-background-padding": 0,\n "text-border-opacity": 0,\n "text-border-width": 0,\n "text-border-style": "solid",\n "text-border-color": "#000",\n "font-family": "Helvetica Neue, Helvetica, sans-serif",\n "font-style": "normal",\n "font-weight": "normal",\n "font-size": 16,\n "min-zoomed-font-size": 0,\n "text-rotation": "none",\n "source-text-rotation": "none",\n "target-text-rotation": "none",\n visibility: "visible",\n display: "element",\n opacity: 1,\n "z-compound-depth": "auto",\n "z-index-compare": "auto",\n "z-index": 0,\n label: "",\n "text-margin-x": 0,\n "text-margin-y": 0,\n "source-label": "",\n "source-text-offset": 0,\n "source-text-margin-x": 0,\n "source-text-margin-y": 0,\n "target-label": "",\n "target-text-offset": 0,\n "target-text-margin-x": 0,\n "target-text-margin-y": 0,\n "overlay-opacity": 0,\n "overlay-color": "#000",\n "overlay-padding": 10,\n "transition-property": "none",\n "transition-duration": 0,\n "transition-delay": 0,\n "transition-timing-function": "linear",\n // node props\n "background-blacken": 0,\n "background-color": "#999",\n "background-fill": "solid",\n "background-opacity": 1,\n "background-image": "none",\n "background-image-crossorigin": "anonymous",\n "background-image-opacity": 1,\n "background-position-x": "50%",\n "background-position-y": "50%",\n "background-offset-x": 0,\n "background-offset-y": 0,\n "background-width-relative-to": "include-padding",\n "background-height-relative-to": "include-padding",\n "background-repeat": "no-repeat",\n "background-fit": "none",\n "background-clip": "node",\n "background-width": "auto",\n "background-height": "auto",\n "border-color": "#000",\n "border-opacity": 1,\n "border-width": 0,\n "border-style": "solid",\n height: 30,\n width: 30,\n shape: "ellipse",\n "shape-polygon-points": "-1, -1, 1, -1, 1, 1, -1, 1",\n "bounds-expansion": 0,\n // node gradient\n "background-gradient-direction": "to-bottom",\n "background-gradient-stop-colors": "#999",\n "background-gradient-stop-positions": "0%",\n // ghost props\n ghost: "no",\n "ghost-offset-y": 0,\n "ghost-offset-x": 0,\n "ghost-opacity": 0,\n // compound props\n padding: 0,\n "padding-relative-to": "width",\n position: "origin",\n "compound-sizing-wrt-labels": "include",\n "min-width": 0,\n "min-width-bias-left": 0,\n "min-width-bias-right": 0,\n "min-height": 0,\n "min-height-bias-top": 0,\n "min-height-bias-bottom": 0\n }, {\n // node pie bg\n "pie-size": "100%"\n }, [{\n name: "pie-{{i}}-background-color",\n value: "black"\n }, {\n name: "pie-{{i}}-background-size",\n value: "0%"\n }, {\n name: "pie-{{i}}-background-opacity",\n value: 1\n }].reduce(function(l, c) {\n for (var p = 1; p <= It.pieBackgroundN; p++) {\n var d = c.name.replace("{{i}}", p), u = c.value;\n l[d] = u;\n }\n return l;\n }, {}), {\n // edge props\n "line-style": "solid",\n "line-color": "#999",\n "line-fill": "solid",\n "line-cap": "butt",\n "line-opacity": 1,\n "line-gradient-stop-colors": "#999",\n "line-gradient-stop-positions": "0%",\n "control-point-step-size": 40,\n "control-point-weights": 0.5,\n "segment-weights": 0.5,\n "segment-distances": 20,\n "taxi-turn": "50%",\n "taxi-turn-min-distance": 10,\n "taxi-direction": "auto",\n "edge-distances": "intersection",\n "curve-style": "haystack",\n "haystack-radius": 0,\n "arrow-scale": 1,\n "loop-direction": "-45deg",\n "loop-sweep": "-90deg",\n "source-distance-from-node": 0,\n "target-distance-from-node": 0,\n "source-endpoint": "outside-to-node",\n "target-endpoint": "outside-to-node",\n "line-dash-pattern": [6, 3],\n "line-dash-offset": 0\n }, [{\n name: "arrow-shape",\n value: "none"\n }, {\n name: "arrow-color",\n value: "#999"\n }, {\n name: "arrow-fill",\n value: "filled"\n }].reduce(function(l, c) {\n return It.arrowPrefixes.forEach(function(p) {\n var d = p + "-" + c.name, u = c.value;\n l[d] = u;\n }), l;\n }, {})), r = {}, n = 0; n < this.properties.length; n++) {\n var o = this.properties[n];\n if (!o.pointsTo) {\n var i = o.name, a = t[i], s = this.parse(i, a);\n r[i] = s;\n }\n }\n return e.defaultProperties = r, e.defaultProperties;\n};\nIt.addDefaultStylesheet = function() {\n this.selector(":parent").css({\n shape: "rectangle",\n padding: 10,\n "background-color": "#eee",\n "border-color": "#ccc",\n "border-width": 1\n }).selector("edge").css({\n width: 3\n }).selector(":loop").css({\n "curve-style": "bezier"\n }).selector("edge:compound").css({\n "curve-style": "bezier",\n "source-endpoint": "outside-to-line",\n "target-endpoint": "outside-to-line"\n }).selector(":selected").css({\n "background-color": "#0169D9",\n "line-color": "#0169D9",\n "source-arrow-color": "#0169D9",\n "target-arrow-color": "#0169D9",\n "mid-source-arrow-color": "#0169D9",\n "mid-target-arrow-color": "#0169D9"\n }).selector(":parent:selected").css({\n "background-color": "#CCE1F9",\n "border-color": "#aec8e5"\n }).selector(":active").css({\n "overlay-color": "black",\n "overlay-padding": 10,\n "overlay-opacity": 0.25\n }), this.defaultLength = this.length;\n};\nvar Xc = {};\nXc.parse = function(e, t, r, n) {\n var o = this;\n if (at(t))\n return o.parseImplWarn(e, t, r, n);\n var i = n === "mapping" || n === !0 || n === !1 || n == null ? "dontcare" : n, a = r ? "t" : "f", s = "" + t, l = iO(e, s, a, i), c = o.propCache = o.propCache || [], p;\n return (p = c[l]) || (p = c[l] = o.parseImplWarn(e, t, r, n)), (r || n === "mapping") && (p = Fr(p), p && (p.value = Fr(p.value))), p;\n};\nXc.parseImplWarn = function(e, t, r, n) {\n var o = this.parseImpl(e, t, r, n);\n return !o && t != null && je("The style property `".concat(e, ": ").concat(t, "` is invalid")), o && (o.name === "width" || o.name === "height") && t === "label" && je("The style value of `label` is deprecated for `" + o.name + "`"), o;\n};\nXc.parseImpl = function(e, t, r, n) {\n var o = this;\n e = H9(e);\n var i = o.properties[e], a = t, s = o.types;\n if (!i || t === void 0)\n return null;\n i.alias && (i = i.pointsTo, e = i.name);\n var l = U0(t);\n l && (t = t.trim());\n var c = i.type;\n if (!c)\n return null;\n if (r && (t === "" || t === null))\n return {\n name: e,\n value: t,\n bypass: !0,\n deleteBypass: !0\n };\n if (at(t))\n return {\n name: e,\n value: t,\n strValue: "fn",\n mapped: s.fn,\n bypass: r\n };\n var p, d;\n if (!(!l || n || t.length < 7 || t[1] !== "a")) {\n if (t.length >= 7 && t[0] === "d" && (p = new RegExp(s.data.regex).exec(t))) {\n if (r)\n return !1;\n var u = s.data;\n return {\n name: e,\n value: p,\n strValue: "" + t,\n mapped: u,\n field: p[1],\n bypass: r\n };\n } else if (t.length >= 10 && t[0] === "m" && (d = new RegExp(s.mapData.regex).exec(t))) {\n if (r || c.multiple)\n return !1;\n var h = s.mapData;\n if (!(c.color || c.number))\n return !1;\n var b = this.parse(e, d[4]);\n if (!b || b.mapped)\n return !1;\n var M = this.parse(e, d[5]);\n if (!M || M.mapped)\n return !1;\n if (b.pfValue === M.pfValue || b.strValue === M.strValue)\n return je("`" + e + ": " + t + "` is not a valid mapper because the output range is zero; converting to `" + e + ": " + b.strValue + "`"), this.parse(e, b.strValue);\n if (c.color) {\n var C = b.value, g = M.value, f = C[0] === g[0] && C[1] === g[1] && C[2] === g[2] && // optional alpha\n (C[3] === g[3] || (C[3] == null || C[3] === 1) && // full opacity for colour 1?\n (g[3] == null || g[3] === 1));\n if (f)\n return !1;\n }\n return {\n name: e,\n value: d,\n strValue: "" + t,\n mapped: h,\n field: d[1],\n fieldMin: parseFloat(d[2]),\n // min & max are numeric\n fieldMax: parseFloat(d[3]),\n valueMin: b.value,\n valueMax: M.value,\n bypass: r\n };\n }\n }\n if (c.multiple && n !== "multiple") {\n var O;\n if (l ? O = t.split(/\\s+/) : Ve(t) ? O = t : O = [t], c.evenMultiple && O.length % 2 !== 0)\n return null;\n for (var m = [], v = [], y = [], z = "", N = !1, W = 0; W < O.length; W++) {\n var T = o.parse(e, O[W], r, "multiple");\n N = N || U0(T.value), m.push(T.value), y.push(T.pfValue != null ? T.pfValue : T.value), v.push(T.units), z += (W > 0 ? " " : "") + T.strValue;\n }\n return c.validate && !c.validate(m, v) ? null : c.singleEnum && N ? m.length === 1 && U0(m[0]) ? {\n name: e,\n value: m[0],\n strValue: m[0],\n bypass: r\n } : null : {\n name: e,\n value: m,\n pfValue: y,\n strValue: z,\n bypass: r,\n units: v\n };\n }\n var x = function() {\n for (var H = 0; H < c.enums.length; H++) {\n var G = c.enums[H];\n if (G === t)\n return {\n name: e,\n value: t,\n strValue: "" + t,\n bypass: r\n };\n }\n return null;\n };\n if (c.number) {\n var E, L = "px";\n if (c.units && (E = c.units), c.implicitUnits && (L = c.implicitUnits), !c.unitless)\n if (l) {\n var w = "px|em" + (c.allowPercent ? "|\\\\%" : "");\n E && (w = E);\n var q = t.match("^(" + yt + ")(" + w + ")?$");\n q && (t = q[1], E = q[2] || L);\n } else\n (!E || c.implicitUnits) && (E = L);\n if (t = parseFloat(t), isNaN(t) && c.enums === void 0)\n return null;\n if (isNaN(t) && c.enums !== void 0)\n return t = a, x();\n if (c.integer && !H01(t) || c.min !== void 0 && (t < c.min || c.strictMin && t === c.min) || c.max !== void 0 && (t > c.max || c.strictMax && t === c.max))\n return null;\n var S = {\n name: e,\n value: t,\n strValue: "" + t + (E || ""),\n units: E,\n bypass: r\n };\n return c.unitless || E !== "px" && E !== "em" ? S.pfValue = t : S.pfValue = E === "px" || !E ? t : this.getEmSizeInPixels() * t, (E === "ms" || E === "s") && (S.pfValue = E === "ms" ? t : 1e3 * t), (E === "deg" || E === "rad") && (S.pfValue = E === "rad" ? t : ke1(t)), E === "%" && (S.pfValue = t / 100), S;\n } else if (c.propList) {\n var B = [], I = "" + t;\n if (I !== "none") {\n for (var P = I.split(/\\s*,\\s*|\\s+/), k = 0; k < P.length; k++) {\n var K = P[k].trim();\n o.properties[K] ? B.push(K) : je("`" + K + "` is not a valid property name");\n }\n if (B.length === 0)\n return null;\n }\n return {\n name: e,\n value: B,\n strValue: B.length === 0 ? "none" : B.join(" "),\n bypass: r\n };\n } else if (c.color) {\n var $ = re1(t);\n return $ ? {\n name: e,\n value: $,\n pfValue: $,\n strValue: "rgb(" + $[0] + "," + $[1] + "," + $[2] + ")",\n // n.b. no spaces b/c of multiple support\n bypass: r\n } : null;\n } else if (c.regex || c.regexes) {\n if (c.enums) {\n var j = x();\n if (j)\n return j;\n }\n for (var r1 = c.regexes ? c.regexes : [c.regex], a1 = 0; a1 < r1.length; a1++) {\n var _ = new RegExp(r1[a1]), Y = _.exec(t);\n if (Y)\n return {\n name: e,\n value: c.singleRegexMatchValue ? Y[1] : Y,\n strValue: "" + t,\n bypass: r\n };\n }\n return null;\n } else\n return c.string ? {\n name: e,\n value: "" + t,\n strValue: "" + t,\n bypass: r\n } : c.enums ? x() : null;\n};\nvar Gt = function e(t) {\n if (!(this instanceof e))\n return new e(t);\n if (!D9(t)) {\n ct("A style must have a core reference");\n return;\n }\n this._private = {\n cy: t,\n coreStyle: {}\n }, this.length = 0, this.resetToDefault();\n}, _t = Gt.prototype;\n_t.instanceString = function() {\n return "style";\n};\n_t.clear = function() {\n for (var e = this._private, t = e.cy, r = t.elements(), n = 0; n < this.length; n++)\n this[n] = void 0;\n return this.length = 0, e.contextStyles = {}, e.propDiffs = {}, this.cleanElements(r, !0), r.forEach(function(o) {\n var i = o[0]._private;\n i.styleDirty = !0, i.appliedInitStyle = !1;\n }), this;\n};\n_t.resetToDefault = function() {\n return this.clear(), this.addDefaultStylesheet(), this;\n};\n_t.core = function(e) {\n return this._private.coreStyle[e] || this.getDefaultProperty(e);\n};\n_t.selector = function(e) {\n var t = e === "core" ? null : new vo(e), r = this.length++;\n return this[r] = {\n selector: t,\n properties: [],\n mappedProperties: [],\n index: r\n }, this;\n};\n_t.css = function() {\n var e = this, t = arguments;\n if (t.length === 1)\n for (var r = t[0], n = 0; n < e.properties.length; n++) {\n var o = e.properties[n], i = r[o.name];\n i === void 0 && (i = r[Ic(o.name)]), i !== void 0 && this.cssRule(o.name, i);\n }\n else\n t.length === 2 && this.cssRule(t[0], t[1]);\n return this;\n};\n_t.style = _t.css;\n_t.cssRule = function(e, t) {\n var r = this.parse(e, t);\n if (r) {\n var n = this.length - 1;\n this[n].properties.push(r), this[n].properties[r.name] = r, r.name.match(/pie-(\\d+)-background-size/) && r.value && (this._private.hasPie = !0), r.mapped && this[n].mappedProperties.push(r);\n var o = !this[n].selector;\n o && (this._private.coreStyle[r.name] = r);\n }\n return this;\n};\n_t.append = function(e) {\n return JC(e) ? e.appendToStyle(this) : Ve(e) ? this.appendFromJson(e) : U0(e) && this.appendFromString(e), this;\n};\nGt.fromJson = function(e, t) {\n var r = new Gt(e);\n return r.fromJson(t), r;\n};\nGt.fromString = function(e, t) {\n return new Gt(e).fromString(t);\n};\n[e2, hs, Z9, Jr, Yc, J9, It, Xc].forEach(function(e) {\n K0(_t, e);\n});\nGt.types = _t.types;\nGt.properties = _t.properties;\nGt.propertyGroups = _t.propertyGroups;\nGt.propertyGroupNames = _t.propertyGroupNames;\nGt.propertyGroupKeys = _t.propertyGroupKeys;\nvar Q21 = {\n style: function(t) {\n if (t) {\n var r = this.setStyle(t);\n r.update();\n }\n return this._private.style;\n },\n setStyle: function(t) {\n var r = this._private;\n return JC(t) ? r.style = t.generateStyle(this) : Ve(t) ? r.style = Gt.fromJson(this, t) : U0(t) ? r.style = Gt.fromString(this, t) : r.style = Gt(this), r.style;\n }\n}, G21 = "single", Ci = {\n autolock: function(t) {\n if (t !== void 0)\n this._private.autolock = !!t;\n else\n return this._private.autolock;\n return this;\n },\n autoungrabify: function(t) {\n if (t !== void 0)\n this._private.autoungrabify = !!t;\n else\n return this._private.autoungrabify;\n return this;\n },\n autounselectify: function(t) {\n if (t !== void 0)\n this._private.autounselectify = !!t;\n else\n return this._private.autounselectify;\n return this;\n },\n selectionType: function(t) {\n var r = this._private;\n if (r.selectionType == null && (r.selectionType = G21), t !== void 0)\n (t === "additive" || t === "single") && (r.selectionType = t);\n else\n return r.selectionType;\n return this;\n },\n panningEnabled: function(t) {\n if (t !== void 0)\n this._private.panningEnabled = !!t;\n else\n return this._private.panningEnabled;\n return this;\n },\n userPanningEnabled: function(t) {\n if (t !== void 0)\n this._private.userPanningEnabled = !!t;\n else\n return this._private.userPanningEnabled;\n return this;\n },\n zoomingEnabled: function(t) {\n if (t !== void 0)\n this._private.zoomingEnabled = !!t;\n else\n return this._private.zoomingEnabled;\n return this;\n },\n userZoomingEnabled: function(t) {\n if (t !== void 0)\n this._private.userZoomingEnabled = !!t;\n else\n return this._private.userZoomingEnabled;\n return this;\n },\n boxSelectionEnabled: function(t) {\n if (t !== void 0)\n this._private.boxSelectionEnabled = !!t;\n else\n return this._private.boxSelectionEnabled;\n return this;\n },\n pan: function() {\n var t = arguments, r = this._private.pan, n, o, i, a, s;\n switch (t.length) {\n case 0:\n return r;\n case 1:\n if (U0(t[0]))\n return n = t[0], r[n];\n if (Ce(t[0])) {\n if (!this._private.panningEnabled)\n return this;\n i = t[0], a = i.x, s = i.y, O0(a) && (r.x = a), O0(s) && (r.y = s), this.emit("pan viewport");\n }\n break;\n case 2:\n if (!this._private.panningEnabled)\n return this;\n n = t[0], o = t[1], (n === "x" || n === "y") && O0(o) && (r[n] = o), this.emit("pan viewport");\n break;\n }\n return this.notify("viewport"), this;\n },\n panBy: function(t, r) {\n var n = arguments, o = this._private.pan, i, a, s, l, c;\n if (!this._private.panningEnabled)\n return this;\n switch (n.length) {\n case 1:\n Ce(t) && (s = n[0], l = s.x, c = s.y, O0(l) && (o.x += l), O0(c) && (o.y += c), this.emit("pan viewport"));\n break;\n case 2:\n i = t, a = r, (i === "x" || i === "y") && O0(a) && (o[i] += a), this.emit("pan viewport");\n break;\n }\n return this.notify("viewport"), this;\n },\n fit: function(t, r) {\n var n = this.getFitViewport(t, r);\n if (n) {\n var o = this._private;\n o.zoom = n.zoom, o.pan = n.pan, this.emit("pan zoom viewport"), this.notify("viewport");\n }\n return this;\n },\n getFitViewport: function(t, r) {\n if (O0(t) && r === void 0 && (r = t, t = void 0), !(!this._private.panningEnabled || !this._private.zoomingEnabled)) {\n var n;\n if (U0(t)) {\n var o = t;\n t = this.$(o);\n } else if (F01(t)) {\n var i = t;\n n = {\n x1: i.x1,\n y1: i.y1,\n x2: i.x2,\n y2: i.y2\n }, n.w = n.x2 - n.x1, n.h = n.y2 - n.y1;\n } else\n I2(t) || (t = this.mutableElements());\n if (!(I2(t) && t.empty())) {\n n = n || t.boundingBox();\n var a = this.width(), s = this.height(), l;\n if (r = O0(r) ? r : 0, !isNaN(a) && !isNaN(s) && a > 0 && s > 0 && !isNaN(n.w) && !isNaN(n.h) && n.w > 0 && n.h > 0) {\n l = Math.min((a - 2 * r) / n.w, (s - 2 * r) / n.h), l = l > this._private.maxZoom ? this._private.maxZoom : l, l = l < this._private.minZoom ? this._private.minZoom : l;\n var c = {\n // now pan to middle\n x: (a - l * (n.x1 + n.x2)) / 2,\n y: (s - l * (n.y1 + n.y2)) / 2\n };\n return {\n zoom: l,\n pan: c\n };\n }\n }\n }\n },\n zoomRange: function(t, r) {\n var n = this._private;\n if (r == null) {\n var o = t;\n t = o.min, r = o.max;\n }\n return O0(t) && O0(r) && t <= r ? (n.minZoom = t, n.maxZoom = r) : O0(t) && r === void 0 && t <= n.maxZoom ? n.minZoom = t : O0(r) && t === void 0 && r >= n.minZoom && (n.maxZoom = r), this;\n },\n minZoom: function(t) {\n return t === void 0 ? this._private.minZoom : this.zoomRange({\n min: t\n });\n },\n maxZoom: function(t) {\n return t === void 0 ? this._private.maxZoom : this.zoomRange({\n max: t\n });\n },\n getZoomedViewport: function(t) {\n var r = this._private, n = r.pan, o = r.zoom, i, a, s = !1;\n if (r.zoomingEnabled || (s = !0), O0(t) ? a = t : Ce(t) && (a = t.level, t.position != null ? i = Dc(t.position, o, n) : t.renderedPosition != null && (i = t.renderedPosition), i != null && !r.panningEnabled && (s = !0)), a = a > r.maxZoom ? r.maxZoom : a, a = a < r.minZoom ? r.minZoom : a, s || !O0(a) || a === o || i != null && (!O0(i.x) || !O0(i.y)))\n return null;\n if (i != null) {\n var l = n, c = o, p = a, d = {\n x: -p / c * (i.x - l.x) + i.x,\n y: -p / c * (i.y - l.y) + i.y\n };\n return {\n zoomed: !0,\n panned: !0,\n zoom: p,\n pan: d\n };\n } else\n return {\n zoomed: !0,\n panned: !1,\n zoom: a,\n pan: n\n };\n },\n zoom: function(t) {\n if (t === void 0)\n return this._private.zoom;\n var r = this.getZoomedViewport(t), n = this._private;\n return r == null || !r.zoomed ? this : (n.zoom = r.zoom, r.panned && (n.pan.x = r.pan.x, n.pan.y = r.pan.y), this.emit("zoom" + (r.panned ? " pan" : "") + " viewport"), this.notify("viewport"), this);\n },\n viewport: function(t) {\n var r = this._private, n = !0, o = !0, i = [], a = !1, s = !1;\n if (!t)\n return this;\n if (O0(t.zoom) || (n = !1), Ce(t.pan) || (o = !1), !n && !o)\n return this;\n if (n) {\n var l = t.zoom;\n l < r.minZoom || l > r.maxZoom || !r.zoomingEnabled ? a = !0 : (r.zoom = l, i.push("zoom"));\n }\n if (o && (!a || !t.cancelOnFailedZoom) && r.panningEnabled) {\n var c = t.pan;\n O0(c.x) && (r.pan.x = c.x, s = !1), O0(c.y) && (r.pan.y = c.y, s = !1), s || i.push("pan");\n }\n return i.length > 0 && (i.push("viewport"), this.emit(i.join(" ")), this.notify("viewport")), this;\n },\n center: function(t) {\n var r = this.getCenterPan(t);\n return r && (this._private.pan = r, this.emit("pan viewport"), this.notify("viewport")), this;\n },\n getCenterPan: function(t, r) {\n if (this._private.panningEnabled) {\n if (U0(t)) {\n var n = t;\n t = this.mutableElements().filter(n);\n } else\n I2(t) || (t = this.mutableElements());\n if (t.length !== 0) {\n var o = t.boundingBox(), i = this.width(), a = this.height();\n r = r === void 0 ? this._private.zoom : r;\n var s = {\n // middle\n x: (i - r * (o.x1 + o.x2)) / 2,\n y: (a - r * (o.y1 + o.y2)) / 2\n };\n return s;\n }\n }\n },\n reset: function() {\n return !this._private.panningEnabled || !this._private.zoomingEnabled ? this : (this.viewport({\n pan: {\n x: 0,\n y: 0\n },\n zoom: 1\n }), this);\n },\n invalidateSize: function() {\n this._private.sizeCache = null;\n },\n size: function() {\n var t = this._private, r = t.container;\n return t.sizeCache = t.sizeCache || (r ? function() {\n var n = et.getComputedStyle(r), o = function(a) {\n return parseFloat(n.getPropertyValue(a));\n };\n return {\n width: r.clientWidth - o("padding-left") - o("padding-right"),\n height: r.clientHeight - o("padding-top") - o("padding-bottom")\n };\n }() : {\n // fallback if no container (not 0 b/c can be used for dividing etc)\n width: 1,\n height: 1\n });\n },\n width: function() {\n return this.size().width;\n },\n height: function() {\n return this.size().height;\n },\n extent: function() {\n var t = this._private.pan, r = this._private.zoom, n = this.renderedExtent(), o = {\n x1: (n.x1 - t.x) / r,\n x2: (n.x2 - t.x) / r,\n y1: (n.y1 - t.y) / r,\n y2: (n.y2 - t.y) / r\n };\n return o.w = o.x2 - o.x1, o.h = o.y2 - o.y1, o;\n },\n renderedExtent: function() {\n var t = this.width(), r = this.height();\n return {\n x1: 0,\n y1: 0,\n x2: t,\n y2: r,\n w: t,\n h: r\n };\n }\n};\nCi.centre = Ci.center;\nCi.autolockNodes = Ci.autolock;\nCi.autoungrabifyNodes = Ci.autoungrabify;\nvar D4 = {\n data: Ee.data({\n field: "data",\n bindingEvent: "data",\n allowBinding: !0,\n allowSetting: !0,\n settingEvent: "data",\n settingTriggersEvent: !0,\n triggerFnName: "trigger",\n allowGetting: !0\n }),\n removeData: Ee.removeData({\n field: "data",\n event: "data",\n triggerFnName: "trigger",\n triggerEvent: !0\n }),\n scratch: Ee.data({\n field: "scratch",\n bindingEvent: "scratch",\n allowBinding: !0,\n allowSetting: !0,\n settingEvent: "scratch",\n settingTriggersEvent: !0,\n triggerFnName: "trigger",\n allowGetting: !0\n }),\n removeScratch: Ee.removeData({\n field: "scratch",\n event: "scratch",\n triggerFnName: "trigger",\n triggerEvent: !0\n })\n};\nD4.attr = D4.data;\nD4.removeAttr = D4.removeData;\nvar H4 = function(t) {\n var r = this;\n t = K0({}, t);\n var n = t.container;\n n && !Gl(n) && Gl(n[0]) && (n = n[0]);\n var o = n ? n._cyreg : null;\n o = o || {}, o && o.cy && (o.cy.destroy(), o = {});\n var i = o.readies = o.readies || [];\n n && (n._cyreg = o), o.cy = r;\n var a = et !== void 0 && n !== void 0 && !t.headless, s = t;\n s.layout = K0({\n name: a ? "grid" : "null"\n }, s.layout), s.renderer = K0({\n name: a ? "canvas" : "null"\n }, s.renderer);\n var l = function(b, M, C) {\n return M !== void 0 ? M : C !== void 0 ? C : b;\n }, c = this._private = {\n container: n,\n // html dom ele container\n ready: !1,\n // whether ready has been triggered\n options: s,\n // cached options\n elements: new Ft(this),\n // elements in the graph\n listeners: [],\n // list of listeners\n aniEles: new Ft(this),\n // elements being animated\n data: {},\n // data for the core\n scratch: {},\n // scratch object for core\n layout: null,\n renderer: null,\n destroyed: !1,\n // whether destroy was called\n notificationsEnabled: !0,\n // whether notifications are sent to the renderer\n minZoom: 1e-50,\n maxZoom: 1e50,\n zoomingEnabled: l(!0, s.zoomingEnabled),\n userZoomingEnabled: l(!0, s.userZoomingEnabled),\n panningEnabled: l(!0, s.panningEnabled),\n userPanningEnabled: l(!0, s.userPanningEnabled),\n boxSelectionEnabled: l(!0, s.boxSelectionEnabled),\n autolock: l(!1, s.autolock, s.autolockNodes),\n autoungrabify: l(!1, s.autoungrabify, s.autoungrabifyNodes),\n autounselectify: l(!1, s.autounselectify),\n styleEnabled: s.styleEnabled === void 0 ? a : s.styleEnabled,\n zoom: O0(s.zoom) ? s.zoom : 1,\n pan: {\n x: Ce(s.pan) && O0(s.pan.x) ? s.pan.x : 0,\n y: Ce(s.pan) && O0(s.pan.y) ? s.pan.y : 0\n },\n animation: {\n // object for currently-running animations\n current: [],\n queue: []\n },\n hasCompoundNodes: !1\n };\n this.createEmitter(), this.selectionType(s.selectionType), this.zoomRange({\n min: s.minZoom,\n max: s.maxZoom\n });\n var p = function(b, M) {\n var C = b.some(U01);\n if (C)\n return Xa.all(b).then(M);\n M(b);\n };\n c.styleEnabled && r.setStyle([]);\n var d = K0({}, s, s.renderer);\n r.initRenderer(d);\n var u = function(b, M, C) {\n r.notifications(!1);\n var g = r.mutableElements();\n g.length > 0 && g.remove(), b != null && (Ce(b) || Ve(b)) && r.add(b), r.one("layoutready", function(O) {\n r.notifications(!0), r.emit(O), r.one("load", M), r.emitAndNotify("load");\n }).one("layoutstop", function() {\n r.one("done", C), r.emit("done");\n });\n var f = K0({}, r._private.options.layout);\n f.eles = r.elements(), r.layout(f).run();\n };\n p([s.style, s.elements], function(h) {\n var b = h[0], M = h[1];\n c.styleEnabled && r.style().append(b), u(M, function() {\n r.startAnimationLoop(), c.ready = !0, at(s.ready) && r.on("ready", s.ready);\n for (var C = 0; C < i.length; C++) {\n var g = i[C];\n r.on("ready", g);\n }\n o && (o.readies = []), r.emit("ready");\n }, s.done);\n });\n}, _l = H4.prototype;\nK0(_l, {\n instanceString: function() {\n return "core";\n },\n isReady: function() {\n return this._private.ready;\n },\n destroyed: function() {\n return this._private.destroyed;\n },\n ready: function(t) {\n return this.isReady() ? this.emitter().emit("ready", [], t) : this.on("ready", t), this;\n },\n destroy: function() {\n var t = this;\n if (!t.destroyed())\n return t.stopAnimationLoop(), t.destroyRenderer(), this.emit("destroy"), t._private.destroyed = !0, t;\n },\n hasElementWithId: function(t) {\n return this._private.elements.hasElementWithId(t);\n },\n getElementById: function(t) {\n return this._private.elements.getElementById(t);\n },\n hasCompoundNodes: function() {\n return this._private.hasCompoundNodes;\n },\n headless: function() {\n return this._private.renderer.isHeadless();\n },\n styleEnabled: function() {\n return this._private.styleEnabled;\n },\n addToPool: function(t) {\n return this._private.elements.merge(t), this;\n },\n removeFromPool: function(t) {\n return this._private.elements.unmerge(t), this;\n },\n container: function() {\n return this._private.container || null;\n },\n mount: function(t) {\n if (t != null) {\n var r = this, n = r._private, o = n.options;\n return !Gl(t) && Gl(t[0]) && (t = t[0]), r.stopAnimationLoop(), r.destroyRenderer(), n.container = t, n.styleEnabled = !0, r.invalidateSize(), r.initRenderer(K0({}, o, o.renderer, {\n // allow custom renderer name to be re-used, otherwise use canvas\n name: o.renderer.name === "null" ? "canvas" : o.renderer.name\n })), r.startAnimationLoop(), r.style(o.style), r.emit("mount"), r;\n }\n },\n unmount: function() {\n var t = this;\n return t.stopAnimationLoop(), t.destroyRenderer(), t.initRenderer({\n name: "null"\n }), t.emit("unmount"), t;\n },\n options: function() {\n return Fr(this._private.options);\n },\n json: function(t) {\n var r = this, n = r._private, o = r.mutableElements(), i = function(m) {\n return r.getElementById(m.id());\n };\n if (Ce(t)) {\n if (r.startBatch(), t.elements) {\n var a = {}, s = function(m, v) {\n for (var y = [], z = [], N = 0; N < m.length; N++) {\n var W = m[N], T = "" + W.data.id, x = r.getElementById(T);\n a[T] = !0, x.length !== 0 ? z.push({\n ele: x,\n json: W\n }) : (v && (W.group = v), y.push(W));\n }\n r.add(y);\n for (var E = 0; E < z.length; E++) {\n var L = z[E], w = L.ele, q = L.json;\n w.json(q);\n }\n };\n if (Ve(t.elements))\n s(t.elements);\n else\n for (var l = ["nodes", "edges"], c = 0; c < l.length; c++) {\n var p = l[c], d = t.elements[p];\n Ve(d) && s(d, p);\n }\n var u = r.collection();\n o.filter(function(O) {\n return !a[O.id()];\n }).forEach(function(O) {\n O.isParent() ? u.merge(O) : O.remove();\n }), u.forEach(function(O) {\n return O.children().move({\n parent: null\n });\n }), u.forEach(function(O) {\n return i(O).remove();\n });\n }\n t.style && r.style(t.style), t.zoom != null && t.zoom !== n.zoom && r.zoom(t.zoom), t.pan && (t.pan.x !== n.pan.x || t.pan.y !== n.pan.y) && r.pan(t.pan), t.data && r.data(t.data);\n for (var h = ["minZoom", "maxZoom", "zoomingEnabled", "userZoomingEnabled", "panningEnabled", "userPanningEnabled", "boxSelectionEnabled", "autolock", "autoungrabify", "autounselectify"], b = 0; b < h.length; b++) {\n var M = h[b];\n t[M] != null && r[M](t[M]);\n }\n return r.endBatch(), this;\n } else {\n var C = !!t, g = {};\n C ? g.elements = this.elements().map(function(O) {\n return O.json();\n }) : (g.elements = {}, o.forEach(function(O) {\n var m = O.group();\n g.elements[m] || (g.elements[m] = []), g.elements[m].push(O.json());\n })), this._private.styleEnabled && (g.style = r.style().json()), g.data = Fr(r.data());\n var f = n.options;\n return g.zoomingEnabled = n.zoomingEnabled, g.userZoomingEnabled = n.userZoomingEnabled, g.zoom = n.zoom, g.minZoom = n.minZoom, g.maxZoom = n.maxZoom, g.panningEnabled = n.panningEnabled, g.userPanningEnabled = n.userPanningEnabled, g.pan = Fr(n.pan), g.boxSelectionEnabled = n.boxSelectionEnabled, g.renderer = Fr(f.renderer), g.hideEdgesOnViewport = f.hideEdgesOnViewport, g.textureOnViewport = f.textureOnViewport, g.wheelSensitivity = f.wheelSensitivity, g.motionBlur = f.motionBlur, g;\n }\n }\n});\n_l.$id = _l.getElementById;\n[I21, V21, YO, G8, il, U21, j8, al, Q21, Ci, D4].forEach(function(e) {\n K0(_l, e);\n});\nvar j21 = {\n fit: !0,\n // whether to fit the viewport to the graph\n directed: !1,\n // whether the tree is directed downwards (or edges can point in any direction if false)\n padding: 30,\n // padding on fit\n circle: !1,\n // put depths in concentric circles if true, put depths top down if false\n grid: !1,\n // whether to create an even grid into which the DAG is placed (circle:false only)\n spacingFactor: 1.75,\n // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap)\n boundingBox: void 0,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: !0,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: !1,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n roots: void 0,\n // the roots of the trees\n maximal: !1,\n // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only)\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled,\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts\n}, Qi = function(t) {\n return t.scratch("breadthfirst");\n}, Uh = function(t, r) {\n return t.scratch("breadthfirst", r);\n};\nfunction XO(e) {\n this.options = K0({}, j21, e);\n}\nXO.prototype.run = function() {\n var e = this.options, t = e, r = e.cy, n = t.eles, o = n.nodes().filter(function(Q) {\n return !Q.isParent();\n }), i = n, a = t.directed, s = t.maximal || t.maximalAdjustments > 0, l = w2(t.boundingBox ? t.boundingBox : {\n x1: 0,\n y1: 0,\n w: r.width(),\n h: r.height()\n }), c;\n if (I2(t.roots))\n c = t.roots;\n else if (Ve(t.roots)) {\n for (var p = [], d = 0; d < t.roots.length; d++) {\n var u = t.roots[d], h = r.getElementById(u);\n p.push(h);\n }\n c = r.collection(p);\n } else if (U0(t.roots))\n c = r.$(t.roots);\n else if (a)\n c = o.roots();\n else {\n var b = n.components();\n c = r.collection();\n for (var M = function(Z) {\n var t1 = b[Z], n1 = t1.maxDegree(!1), U = t1.filter(function(e1) {\n return e1.degree(!1) === n1;\n });\n c = c.add(U);\n }, C = 0; C < b.length; C++)\n M(C);\n }\n var g = [], f = {}, O = function(Z, t1) {\n g[t1] == null && (g[t1] = []);\n var n1 = g[t1].length;\n g[t1].push(Z), Uh(Z, {\n index: n1,\n depth: t1\n });\n }, m = function(Z, t1) {\n var n1 = Qi(Z), U = n1.depth, e1 = n1.index;\n g[U][e1] = null, O(Z, t1);\n };\n i.bfs({\n roots: c,\n directed: t.directed,\n visit: function(Z, t1, n1, U, e1) {\n var o1 = Z[0], u1 = o1.id();\n O(o1, e1), f[u1] = !0;\n }\n });\n for (var v = [], y = 0; y < o.length; y++) {\n var z = o[y];\n f[z.id()] || v.push(z);\n }\n var N = function(Z) {\n for (var t1 = g[Z], n1 = 0; n1 < t1.length; n1++) {\n var U = t1[n1];\n if (U == null) {\n t1.splice(n1, 1), n1--;\n continue;\n }\n Uh(U, {\n depth: Z,\n index: n1\n });\n }\n }, W = function() {\n for (var Z = 0; Z < g.length; Z++)\n N(Z);\n }, T = function(Z, t1) {\n for (var n1 = Qi(Z), U = Z.incomers().filter(function(l1) {\n return l1.isNode() && n.has(l1);\n }), e1 = -1, o1 = Z.id(), u1 = 0; u1 < U.length; u1++) {\n var M1 = U[u1], A1 = Qi(M1);\n e1 = Math.max(e1, A1.depth);\n }\n return n1.depth <= e1 ? t1[o1] ? null : (m(Z, e1 + 1), t1[o1] = !0, !0) : !1;\n };\n if (a && s) {\n var x = [], E = {}, L = function(Z) {\n return x.push(Z);\n }, w = function() {\n return x.shift();\n };\n for (o.forEach(function(Q) {\n return x.push(Q);\n }); x.length > 0; ) {\n var q = w(), S = T(q, E);\n if (S)\n q.outgoers().filter(function(Q) {\n return Q.isNode() && n.has(Q);\n }).forEach(L);\n else if (S === null) {\n je("Detected double maximal shift for node `" + q.id() + "`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");\n break;\n }\n }\n }\n W();\n var B = 0;\n if (t.avoidOverlap)\n for (var I = 0; I < o.length; I++) {\n var P = o[I], k = P.layoutDimensions(t), K = k.w, $ = k.h;\n B = Math.max(B, K, $);\n }\n for (var j = {}, r1 = function(Z) {\n if (j[Z.id()])\n return j[Z.id()];\n for (var t1 = Qi(Z).depth, n1 = Z.neighborhood(), U = 0, e1 = 0, o1 = 0; o1 < n1.length; o1++) {\n var u1 = n1[o1];\n if (!(u1.isEdge() || u1.isParent() || !o.has(u1))) {\n var M1 = Qi(u1);\n if (M1 != null) {\n var A1 = M1.index, l1 = M1.depth;\n if (!(A1 == null || l1 == null)) {\n var b1 = g[l1].length;\n l1 < t1 && (U += A1 / b1, e1++);\n }\n }\n }\n }\n return e1 = Math.max(1, e1), U = U / e1, e1 === 0 && (U = 0), j[Z.id()] = U, U;\n }, a1 = function(Z, t1) {\n var n1 = r1(Z), U = r1(t1), e1 = n1 - U;\n return e1 === 0 ? $C(Z.id(), t1.id()) : e1;\n }, _ = 0; _ < g.length; _++)\n g[_].sort(a1), N(_);\n for (var Y = [], D = 0; D < v.length; D++)\n Y.push(v[D]);\n g.unshift(Y), W();\n for (var H = 0, G = 0; G < g.length; G++)\n H = Math.max(g[G].length, H);\n var J = {\n x: l.x1 + l.w / 2,\n y: l.x1 + l.h / 2\n }, F = g.reduce(function(Q, Z) {\n return Math.max(Q, Z.length);\n }, 0), V = function(Z) {\n var t1 = Qi(Z), n1 = t1.depth, U = t1.index, e1 = g[n1].length, o1 = Math.max(l.w / ((t.grid ? F : e1) + 1), B), u1 = Math.max(l.h / (g.length + 1), B), M1 = Math.min(l.w / 2 / g.length, l.h / 2 / g.length);\n if (M1 = Math.max(M1, B), t.circle) {\n var l1 = M1 * n1 + M1 - (g.length > 0 && g[0].length <= 3 ? M1 / 2 : 0), b1 = 2 * Math.PI / g[n1].length * U;\n return n1 === 0 && g[0].length === 1 && (l1 = 1), {\n x: J.x + l1 * Math.cos(b1),\n y: J.y + l1 * Math.sin(b1)\n };\n } else {\n var A1 = {\n x: J.x + (U + 1 - (e1 + 1) / 2) * o1,\n y: (n1 + 1) * u1\n };\n return A1;\n }\n };\n return n.nodes().layoutPositions(this, t, V), this;\n};\nvar K21 = {\n fit: !0,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n boundingBox: void 0,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: !0,\n // prevents node overlap, may overflow boundingBox and radius if not enough space\n nodeDimensionsIncludeLabels: !1,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: void 0,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n radius: void 0,\n // the radius of the circle\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: void 0,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: !0,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n sort: void 0,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data(\'weight\') - b.data(\'weight\') }\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction QO(e) {\n this.options = K0({}, K21, e);\n}\nQO.prototype.run = function() {\n var e = this.options, t = e, r = e.cy, n = t.eles, o = t.counterclockwise !== void 0 ? !t.counterclockwise : t.clockwise, i = n.nodes().not(":parent");\n t.sort && (i = i.sort(t.sort));\n for (var a = w2(t.boundingBox ? t.boundingBox : {\n x1: 0,\n y1: 0,\n w: r.width(),\n h: r.height()\n }), s = {\n x: a.x1 + a.w / 2,\n y: a.y1 + a.h / 2\n }, l = t.sweep === void 0 ? 2 * Math.PI - 2 * Math.PI / i.length : t.sweep, c = l / Math.max(1, i.length - 1), p, d = 0, u = 0; u < i.length; u++) {\n var h = i[u], b = h.layoutDimensions(t), M = b.w, C = b.h;\n d = Math.max(d, M, C);\n }\n if (O0(t.radius) ? p = t.radius : i.length <= 1 ? p = 0 : p = Math.min(a.h, a.w) / 2 - d, i.length > 1 && t.avoidOverlap) {\n d *= 1.75;\n var g = Math.cos(c) - Math.cos(0), f = Math.sin(c) - Math.sin(0), O = Math.sqrt(d * d / (g * g + f * f));\n p = Math.max(O, p);\n }\n var m = function(y, z) {\n var N = t.startAngle + z * c * (o ? 1 : -1), W = p * Math.cos(N), T = p * Math.sin(N), x = {\n x: s.x + W,\n y: s.y + T\n };\n return x;\n };\n return n.nodes().layoutPositions(this, t, m), this;\n};\nvar Z21 = {\n fit: !0,\n // whether to fit the viewport to the graph\n padding: 30,\n // the padding on fit\n startAngle: 3 / 2 * Math.PI,\n // where nodes start in radians\n sweep: void 0,\n // how many radians should be between the first and last node (defaults to full circle)\n clockwise: !0,\n // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\n equidistant: !1,\n // whether levels have an equal radial distance betwen them, may cause bounding box overflow\n minNodeSpacing: 10,\n // min spacing between outside of nodes (used for radius adjustment)\n boundingBox: void 0,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: !0,\n // prevents node overlap, may overflow boundingBox if not enough space\n nodeDimensionsIncludeLabels: !1,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n height: void 0,\n // height of layout area (overrides container height)\n width: void 0,\n // width of layout area (overrides container width)\n spacingFactor: void 0,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n concentric: function(t) {\n return t.degree();\n },\n levelWidth: function(t) {\n return t.maxDegree() / 4;\n },\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts\n};\nfunction GO(e) {\n this.options = K0({}, Z21, e);\n}\nGO.prototype.run = function() {\n for (var e = this.options, t = e, r = t.counterclockwise !== void 0 ? !t.counterclockwise : t.clockwise, n = e.cy, o = t.eles, i = o.nodes().not(":parent"), a = w2(t.boundingBox ? t.boundingBox : {\n x1: 0,\n y1: 0,\n w: n.width(),\n h: n.height()\n }), s = {\n x: a.x1 + a.w / 2,\n y: a.y1 + a.h / 2\n }, l = [], c = 0, p = 0; p < i.length; p++) {\n var d = i[p], u = void 0;\n u = t.concentric(d), l.push({\n value: u,\n node: d\n }), d._private.scratch.concentric = u;\n }\n i.updateStyle();\n for (var h = 0; h < i.length; h++) {\n var b = i[h], M = b.layoutDimensions(t);\n c = Math.max(c, M.w, M.h);\n }\n l.sort(function(Q, Z) {\n return Z.value - Q.value;\n });\n for (var C = t.levelWidth(i), g = [[]], f = g[0], O = 0; O < l.length; O++) {\n var m = l[O];\n if (f.length > 0) {\n var v = Math.abs(f[0].value - m.value);\n v >= C && (f = [], g.push(f));\n }\n f.push(m);\n }\n var y = c + t.minNodeSpacing;\n if (!t.avoidOverlap) {\n var z = g.length > 0 && g[0].length > 1, N = Math.min(a.w, a.h) / 2 - y, W = N / (g.length + z ? 1 : 0);\n y = Math.min(y, W);\n }\n for (var T = 0, x = 0; x < g.length; x++) {\n var E = g[x], L = t.sweep === void 0 ? 2 * Math.PI - 2 * Math.PI / E.length : t.sweep, w = E.dTheta = L / Math.max(1, E.length - 1);\n if (E.length > 1 && t.avoidOverlap) {\n var q = Math.cos(w) - Math.cos(0), S = Math.sin(w) - Math.sin(0), B = Math.sqrt(y * y / (q * q + S * S));\n T = Math.max(B, T);\n }\n E.r = T, T += y;\n }\n if (t.equidistant) {\n for (var I = 0, P = 0, k = 0; k < g.length; k++) {\n var K = g[k], $ = K.r - P;\n I = Math.max(I, $);\n }\n P = 0;\n for (var j = 0; j < g.length; j++) {\n var r1 = g[j];\n j === 0 && (P = r1.r), r1.r = P, P += I;\n }\n }\n for (var a1 = {}, _ = 0; _ < g.length; _++)\n for (var Y = g[_], D = Y.dTheta, H = Y.r, G = 0; G < Y.length; G++) {\n var J = Y[G], F = t.startAngle + (r ? 1 : -1) * D * G, V = {\n x: s.x + H * Math.cos(F),\n y: s.y + H * Math.sin(F)\n };\n a1[J.node.id()] = V;\n }\n return o.nodes().layoutPositions(this, t, function(Q) {\n var Z = Q.id();\n return a1[Z];\n }), this;\n};\nvar vp, J21 = {\n // Called on `layoutready`\n ready: function() {\n },\n // Called on `layoutstop`\n stop: function() {\n },\n // Whether to animate while running the layout\n // true : Animate continuously as the layout is running\n // false : Just show the end result\n // \'end\' : Animate with the end result, from the initial positions to the end positions\n animate: !0,\n // Easing of the animation for animate:\'end\'\n animationEasing: void 0,\n // The duration of the animation for animate:\'end\'\n animationDuration: void 0,\n // A function that determines whether the node should be animated\n // All nodes animated by default on animate enabled\n // Non-animated nodes are positioned immediately when the layout starts\n animateFilter: function(t, r) {\n return !0;\n },\n // The layout animates only after this many milliseconds for animate:true\n // (prevents flashing on fast runs)\n animationThreshold: 250,\n // Number of iterations between consecutive screen positions update\n refresh: 20,\n // Whether to fit the network view after when done\n fit: !0,\n // Padding on fit\n padding: 30,\n // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n boundingBox: void 0,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n nodeDimensionsIncludeLabels: !1,\n // Randomize the initial positions of the nodes (true) or use existing positions (false)\n randomize: !1,\n // Extra spacing between components in non-compound graphs\n componentSpacing: 40,\n // Node repulsion (non overlapping) multiplier\n nodeRepulsion: function(t) {\n return 2048;\n },\n // Node repulsion (overlapping) multiplier\n nodeOverlap: 4,\n // Ideal edge (non nested) length\n idealEdgeLength: function(t) {\n return 32;\n },\n // Divisor to compute edge forces\n edgeElasticity: function(t) {\n return 32;\n },\n // Nesting factor (multiplier) to compute ideal edge length for nested edges\n nestingFactor: 1.2,\n // Gravity force (constant)\n gravity: 1,\n // Maximum number of iterations to perform\n numIter: 1e3,\n // Initial temperature (maximum node displacement)\n initialTemp: 1e3,\n // Cooling factor (how the temperature is reduced between consecutive iterations\n coolingFactor: 0.99,\n // Lower temperature threshold (below this point the layout will end)\n minTemp: 1\n};\nfunction Qc(e) {\n this.options = K0({}, J21, e), this.options.layout = this;\n}\nQc.prototype.run = function() {\n var e = this.options, t = e.cy, r = this;\n r.stopped = !1, (e.animate === !0 || e.animate === !1) && r.emit({\n type: "layoutstart",\n layout: r\n }), e.debug === !0 ? vp = !0 : vp = !1;\n var n = _21(t, r, e);\n vp && tr1(n), e.randomize && rr1(n);\n var o = Wn(), i = function() {\n nr1(n, t, e), e.fit === !0 && t.fit(e.padding);\n }, a = function(u) {\n return !(r.stopped || u >= e.numIter || (or1(n, e), n.temperature = n.temperature * e.coolingFactor, n.temperature < e.minTemp));\n }, s = function() {\n if (e.animate === !0 || e.animate === !1)\n i(), r.one("layoutstop", e.stop), r.emit({\n type: "layoutstop",\n layout: r\n });\n else {\n var u = e.eles.nodes(), h = jO(n, e, u);\n u.layoutPositions(r, e, h);\n }\n }, l = 0, c = !0;\n if (e.animate === !0) {\n var p = function d() {\n for (var u = 0; c && u < e.refresh; )\n c = a(l), l++, u++;\n if (!c)\n Xh(n, e), s();\n else {\n var h = Wn();\n h - o >= e.animationThreshold && i(), jl(d);\n }\n };\n p();\n } else {\n for (; c; )\n c = a(l), l++;\n Xh(n, e), s();\n }\n return this;\n};\nQc.prototype.stop = function() {\n return this.stopped = !0, this.thread && this.thread.stop(), this.emit("layoutstop"), this;\n};\nQc.prototype.destroy = function() {\n return this.thread && this.thread.stop(), this;\n};\nvar _21 = function(t, r, n) {\n for (var o = n.eles.edges(), i = n.eles.nodes(), a = {\n isCompound: t.hasCompoundNodes(),\n layoutNodes: [],\n idToIndex: {},\n nodeSize: i.size(),\n graphSet: [],\n indexToGraph: [],\n layoutEdges: [],\n edgeSize: o.size(),\n temperature: n.initialTemp,\n clientWidth: t.width(),\n clientHeight: t.width(),\n boundingBox: w2(n.boundingBox ? n.boundingBox : {\n x1: 0,\n y1: 0,\n w: t.width(),\n h: t.height()\n })\n }, s = n.eles.components(), l = {}, c = 0; c < s.length; c++)\n for (var p = s[c], d = 0; d < p.length; d++) {\n var u = p[d];\n l[u.id()] = c;\n }\n for (var c = 0; c < a.nodeSize; c++) {\n var h = i[c], b = h.layoutDimensions(n), M = {};\n M.isLocked = h.locked(), M.id = h.data("id"), M.parentId = h.data("parent"), M.cmptId = l[h.id()], M.children = [], M.positionX = h.position("x"), M.positionY = h.position("y"), M.offsetX = 0, M.offsetY = 0, M.height = b.w, M.width = b.h, M.maxX = M.positionX + M.width / 2, M.minX = M.positionX - M.width / 2, M.maxY = M.positionY + M.height / 2, M.minY = M.positionY - M.height / 2, M.padLeft = parseFloat(h.style("padding")), M.padRight = parseFloat(h.style("padding")), M.padTop = parseFloat(h.style("padding")), M.padBottom = parseFloat(h.style("padding")), M.nodeRepulsion = at(n.nodeRepulsion) ? n.nodeRepulsion(h) : n.nodeRepulsion, a.layoutNodes.push(M), a.idToIndex[M.id] = c;\n }\n for (var C = [], g = 0, f = -1, O = [], c = 0; c < a.nodeSize; c++) {\n var h = a.layoutNodes[c], m = h.parentId;\n m != null ? a.layoutNodes[a.idToIndex[m]].children.push(h.id) : (C[++f] = h.id, O.push(h.id));\n }\n for (a.graphSet.push(O); g <= f; ) {\n var v = C[g++], y = a.idToIndex[v], u = a.layoutNodes[y], z = u.children;\n if (z.length > 0) {\n a.graphSet.push(z);\n for (var c = 0; c < z.length; c++)\n C[++f] = z[c];\n }\n }\n for (var c = 0; c < a.graphSet.length; c++)\n for (var N = a.graphSet[c], d = 0; d < N.length; d++) {\n var W = a.idToIndex[N[d]];\n a.indexToGraph[W] = c;\n }\n for (var c = 0; c < a.edgeSize; c++) {\n var T = o[c], x = {};\n x.id = T.data("id"), x.sourceId = T.data("source"), x.targetId = T.data("target");\n var E = at(n.idealEdgeLength) ? n.idealEdgeLength(T) : n.idealEdgeLength, L = at(n.edgeElasticity) ? n.edgeElasticity(T) : n.edgeElasticity, w = a.idToIndex[x.sourceId], q = a.idToIndex[x.targetId], S = a.indexToGraph[w], B = a.indexToGraph[q];\n if (S != B) {\n for (var I = $21(x.sourceId, x.targetId, a), P = a.graphSet[I], k = 0, M = a.layoutNodes[w]; P.indexOf(M.id) === -1; )\n M = a.layoutNodes[a.idToIndex[M.parentId]], k++;\n for (M = a.layoutNodes[q]; P.indexOf(M.id) === -1; )\n M = a.layoutNodes[a.idToIndex[M.parentId]], k++;\n E *= k * n.nestingFactor;\n }\n x.idealLength = E, x.elasticity = L, a.layoutEdges.push(x);\n }\n return a;\n}, $21 = function(t, r, n) {\n var o = er1(t, r, 0, n);\n return 2 > o.count ? 0 : o.graph;\n}, er1 = function e(t, r, n, o) {\n var i = o.graphSet[n];\n if (-1 < i.indexOf(t) && -1 < i.indexOf(r))\n return {\n count: 2,\n graph: n\n };\n for (var a = 0, s = 0; s < i.length; s++) {\n var l = i[s], c = o.idToIndex[l], p = o.layoutNodes[c].children;\n if (p.length !== 0) {\n var d = o.indexToGraph[o.idToIndex[p[0]]], u = e(t, r, d, o);\n if (u.count !== 0)\n if (u.count === 1) {\n if (a++, a === 2)\n break;\n } else\n return u;\n }\n }\n return {\n count: a,\n graph: n\n };\n}, tr1, rr1 = function(t, r) {\n for (var n = t.clientWidth, o = t.clientHeight, i = 0; i < t.nodeSize; i++) {\n var a = t.layoutNodes[i];\n a.children.length === 0 && !a.isLocked && (a.positionX = Math.random() * n, a.positionY = Math.random() * o);\n }\n}, jO = function(t, r, n) {\n var o = t.boundingBox, i = {\n x1: 1 / 0,\n x2: -1 / 0,\n y1: 1 / 0,\n y2: -1 / 0\n };\n return r.boundingBox && (n.forEach(function(a) {\n var s = t.layoutNodes[t.idToIndex[a.data("id")]];\n i.x1 = Math.min(i.x1, s.positionX), i.x2 = Math.max(i.x2, s.positionX), i.y1 = Math.min(i.y1, s.positionY), i.y2 = Math.max(i.y2, s.positionY);\n }), i.w = i.x2 - i.x1, i.h = i.y2 - i.y1), function(a, s) {\n var l = t.layoutNodes[t.idToIndex[a.data("id")]];\n if (r.boundingBox) {\n var c = (l.positionX - i.x1) / i.w, p = (l.positionY - i.y1) / i.h;\n return {\n x: o.x1 + c * o.w,\n y: o.y1 + p * o.h\n };\n } else\n return {\n x: l.positionX,\n y: l.positionY\n };\n };\n}, nr1 = function(t, r, n) {\n var o = n.layout, i = n.eles.nodes(), a = jO(t, n, i);\n i.positions(a), t.ready !== !0 && (t.ready = !0, o.one("layoutready", n.ready), o.emit({\n type: "layoutready",\n layout: this\n }));\n}, or1 = function(t, r, n) {\n ir1(t, r), lr1(t), cr1(t, r), pr1(t), dr1(t);\n}, ir1 = function(t, r) {\n for (var n = 0; n < t.graphSet.length; n++)\n for (var o = t.graphSet[n], i = o.length, a = 0; a < i; a++)\n for (var s = t.layoutNodes[t.idToIndex[o[a]]], l = a + 1; l < i; l++) {\n var c = t.layoutNodes[t.idToIndex[o[l]]];\n ar1(s, c, t, r);\n }\n}, Yh = function(t) {\n return -t + 2 * t * Math.random();\n}, ar1 = function(t, r, n, o) {\n var i = t.cmptId, a = r.cmptId;\n if (!(i !== a && !n.isCompound)) {\n var s = r.positionX - t.positionX, l = r.positionY - t.positionY, c = 1;\n s === 0 && l === 0 && (s = Yh(c), l = Yh(c));\n var p = sr1(t, r, s, l);\n if (p > 0)\n var d = o.nodeOverlap * p, u = Math.sqrt(s * s + l * l), h = d * s / u, b = d * l / u;\n else\n var M = $l(t, s, l), C = $l(r, -1 * s, -1 * l), g = C.x - M.x, f = C.y - M.y, O = g * g + f * f, u = Math.sqrt(O), d = (t.nodeRepulsion + r.nodeRepulsion) / O, h = d * g / u, b = d * f / u;\n t.isLocked || (t.offsetX -= h, t.offsetY -= b), r.isLocked || (r.offsetX += h, r.offsetY += b);\n }\n}, sr1 = function(t, r, n, o) {\n if (n > 0)\n var i = t.maxX - r.minX;\n else\n var i = r.maxX - t.minX;\n if (o > 0)\n var a = t.maxY - r.minY;\n else\n var a = r.maxY - t.minY;\n return i >= 0 && a >= 0 ? Math.sqrt(i * i + a * a) : 0;\n}, $l = function(t, r, n) {\n var o = t.positionX, i = t.positionY, a = t.height || 1, s = t.width || 1, l = n / r, c = a / s, p = {};\n return r === 0 && 0 < n || r === 0 && 0 > n ? (p.x = o, p.y = i + a / 2, p) : 0 < r && -1 * c <= l && l <= c ? (p.x = o + s / 2, p.y = i + s * n / 2 / r, p) : 0 > r && -1 * c <= l && l <= c ? (p.x = o - s / 2, p.y = i - s * n / 2 / r, p) : 0 < n && (l <= -1 * c || l >= c) ? (p.x = o + a * r / 2 / n, p.y = i + a / 2, p) : (0 > n && (l <= -1 * c || l >= c) && (p.x = o - a * r / 2 / n, p.y = i - a / 2), p);\n}, lr1 = function(t, r) {\n for (var n = 0; n < t.edgeSize; n++) {\n var o = t.layoutEdges[n], i = t.idToIndex[o.sourceId], a = t.layoutNodes[i], s = t.idToIndex[o.targetId], l = t.layoutNodes[s], c = l.positionX - a.positionX, p = l.positionY - a.positionY;\n if (!(c === 0 && p === 0)) {\n var d = $l(a, c, p), u = $l(l, -1 * c, -1 * p), h = u.x - d.x, b = u.y - d.y, M = Math.sqrt(h * h + b * b), C = Math.pow(o.idealLength - M, 2) / o.elasticity;\n if (M !== 0)\n var g = C * h / M, f = C * b / M;\n else\n var g = 0, f = 0;\n a.isLocked || (a.offsetX += g, a.offsetY += f), l.isLocked || (l.offsetX -= g, l.offsetY -= f);\n }\n }\n}, cr1 = function(t, r) {\n for (var n = 1, o = 0; o < t.graphSet.length; o++) {\n var i = t.graphSet[o], a = i.length;\n if (o === 0)\n var s = t.clientHeight / 2, l = t.clientWidth / 2;\n else\n var c = t.layoutNodes[t.idToIndex[i[0]]], p = t.layoutNodes[t.idToIndex[c.parentId]], s = p.positionX, l = p.positionY;\n for (var d = 0; d < a; d++) {\n var u = t.layoutNodes[t.idToIndex[i[d]]];\n if (!u.isLocked) {\n var h = s - u.positionX, b = l - u.positionY, M = Math.sqrt(h * h + b * b);\n if (M > n) {\n var C = r.gravity * h / M, g = r.gravity * b / M;\n u.offsetX += C, u.offsetY += g;\n }\n }\n }\n }\n}, pr1 = function(t, r) {\n var n = [], o = 0, i = -1;\n for (n.push.apply(n, t.graphSet[0]), i += t.graphSet[0].length; o <= i; ) {\n var a = n[o++], s = t.idToIndex[a], l = t.layoutNodes[s], c = l.children;\n if (0 < c.length && !l.isLocked) {\n for (var p = l.offsetX, d = l.offsetY, u = 0; u < c.length; u++) {\n var h = t.layoutNodes[t.idToIndex[c[u]]];\n h.offsetX += p, h.offsetY += d, n[++i] = c[u];\n }\n l.offsetX = 0, l.offsetY = 0;\n }\n }\n}, dr1 = function(t, r) {\n for (var n = 0; n < t.nodeSize; n++) {\n var o = t.layoutNodes[n];\n 0 < o.children.length && (o.maxX = void 0, o.minX = void 0, o.maxY = void 0, o.minY = void 0);\n }\n for (var n = 0; n < t.nodeSize; n++) {\n var o = t.layoutNodes[n];\n if (!(0 < o.children.length || o.isLocked)) {\n var i = Ar1(o.offsetX, o.offsetY, t.temperature);\n o.positionX += i.x, o.positionY += i.y, o.offsetX = 0, o.offsetY = 0, o.minX = o.positionX - o.width, o.maxX = o.positionX + o.width, o.minY = o.positionY - o.height, o.maxY = o.positionY + o.height, ur1(o, t);\n }\n }\n for (var n = 0; n < t.nodeSize; n++) {\n var o = t.layoutNodes[n];\n 0 < o.children.length && !o.isLocked && (o.positionX = (o.maxX + o.minX) / 2, o.positionY = (o.maxY + o.minY) / 2, o.width = o.maxX - o.minX, o.height = o.maxY - o.minY);\n }\n}, Ar1 = function(t, r, n) {\n var o = Math.sqrt(t * t + r * r);\n if (o > n)\n var i = {\n x: n * t / o,\n y: n * r / o\n };\n else\n var i = {\n x: t,\n y: r\n };\n return i;\n}, ur1 = function e(t, r) {\n var n = t.parentId;\n if (n != null) {\n var o = r.layoutNodes[r.idToIndex[n]], i = !1;\n if ((o.maxX == null || t.maxX + o.padRight > o.maxX) && (o.maxX = t.maxX + o.padRight, i = !0), (o.minX == null || t.minX - o.padLeft < o.minX) && (o.minX = t.minX - o.padLeft, i = !0), (o.maxY == null || t.maxY + o.padBottom > o.maxY) && (o.maxY = t.maxY + o.padBottom, i = !0), (o.minY == null || t.minY - o.padTop < o.minY) && (o.minY = t.minY - o.padTop, i = !0), i)\n return e(o, r);\n }\n}, Xh = function(t, r) {\n for (var n = t.layoutNodes, o = [], i = 0; i < n.length; i++) {\n var a = n[i], s = a.cmptId, l = o[s] = o[s] || [];\n l.push(a);\n }\n for (var c = 0, i = 0; i < o.length; i++) {\n var p = o[i];\n if (p) {\n p.x1 = 1 / 0, p.x2 = -1 / 0, p.y1 = 1 / 0, p.y2 = -1 / 0;\n for (var d = 0; d < p.length; d++) {\n var u = p[d];\n p.x1 = Math.min(p.x1, u.positionX - u.width / 2), p.x2 = Math.max(p.x2, u.positionX + u.width / 2), p.y1 = Math.min(p.y1, u.positionY - u.height / 2), p.y2 = Math.max(p.y2, u.positionY + u.height / 2);\n }\n p.w = p.x2 - p.x1, p.h = p.y2 - p.y1, c += p.w * p.h;\n }\n }\n o.sort(function(f, O) {\n return O.w * O.h - f.w * f.h;\n });\n for (var h = 0, b = 0, M = 0, C = 0, g = Math.sqrt(c) * t.clientWidth / t.clientHeight, i = 0; i < o.length; i++) {\n var p = o[i];\n if (p) {\n for (var d = 0; d < p.length; d++) {\n var u = p[d];\n u.isLocked || (u.positionX += h - p.x1, u.positionY += b - p.y1);\n }\n h += p.w + r.componentSpacing, M += p.w + r.componentSpacing, C = Math.max(C, p.h), M > g && (b += C + r.componentSpacing, h = 0, M = 0, C = 0);\n }\n }\n}, br1 = {\n fit: !0,\n // whether to fit the viewport to the graph\n padding: 30,\n // padding used on fit\n boundingBox: void 0,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n avoidOverlap: !0,\n // prevents node overlap, may overflow boundingBox if not enough space\n avoidOverlapPadding: 10,\n // extra spacing around nodes when avoidOverlap: true\n nodeDimensionsIncludeLabels: !1,\n // Excludes the label when calculating node bounding boxes for the layout algorithm\n spacingFactor: void 0,\n // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up\n condense: !1,\n // uses all available space on false, uses minimal space on true\n rows: void 0,\n // force num of rows in the grid\n cols: void 0,\n // force num of columns in the grid\n position: function(t) {\n },\n // returns { row, col } for element\n sort: void 0,\n // a sorting function to order the nodes; e.g. function(a, b){ return a.data(\'weight\') - b.data(\'weight\') }\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction KO(e) {\n this.options = K0({}, br1, e);\n}\nKO.prototype.run = function() {\n var e = this.options, t = e, r = e.cy, n = t.eles, o = n.nodes().not(":parent");\n t.sort && (o = o.sort(t.sort));\n var i = w2(t.boundingBox ? t.boundingBox : {\n x1: 0,\n y1: 0,\n w: r.width(),\n h: r.height()\n });\n if (i.h === 0 || i.w === 0)\n n.nodes().layoutPositions(this, t, function(j) {\n return {\n x: i.x1,\n y: i.y1\n };\n });\n else {\n var a = o.size(), s = Math.sqrt(a * i.h / i.w), l = Math.round(s), c = Math.round(i.w / i.h * s), p = function(r1) {\n if (r1 == null)\n return Math.min(l, c);\n var a1 = Math.min(l, c);\n a1 == l ? l = r1 : c = r1;\n }, d = function(r1) {\n if (r1 == null)\n return Math.max(l, c);\n var a1 = Math.max(l, c);\n a1 == l ? l = r1 : c = r1;\n }, u = t.rows, h = t.cols != null ? t.cols : t.columns;\n if (u != null && h != null)\n l = u, c = h;\n else if (u != null && h == null)\n l = u, c = Math.ceil(a / l);\n else if (u == null && h != null)\n c = h, l = Math.ceil(a / c);\n else if (c * l > a) {\n var b = p(), M = d();\n (b - 1) * M >= a ? p(b - 1) : (M - 1) * b >= a && d(M - 1);\n } else\n for (; c * l < a; ) {\n var C = p(), g = d();\n (g + 1) * C >= a ? d(g + 1) : p(C + 1);\n }\n var f = i.w / c, O = i.h / l;\n if (t.condense && (f = 0, O = 0), t.avoidOverlap)\n for (var m = 0; m < o.length; m++) {\n var v = o[m], y = v._private.position;\n (y.x == null || y.y == null) && (y.x = 0, y.y = 0);\n var z = v.layoutDimensions(t), N = t.avoidOverlapPadding, W = z.w + N, T = z.h + N;\n f = Math.max(f, W), O = Math.max(O, T);\n }\n for (var x = {}, E = function(r1, a1) {\n return !!x["c-" + r1 + "-" + a1];\n }, L = function(r1, a1) {\n x["c-" + r1 + "-" + a1] = !0;\n }, w = 0, q = 0, S = function() {\n q++, q >= c && (q = 0, w++);\n }, B = {}, I = 0; I < o.length; I++) {\n var P = o[I], k = t.position(P);\n if (k && (k.row !== void 0 || k.col !== void 0)) {\n var K = {\n row: k.row,\n col: k.col\n };\n if (K.col === void 0)\n for (K.col = 0; E(K.row, K.col); )\n K.col++;\n else if (K.row === void 0)\n for (K.row = 0; E(K.row, K.col); )\n K.row++;\n B[P.id()] = K, L(K.row, K.col);\n }\n }\n var $ = function(r1, a1) {\n var _, Y;\n if (r1.locked() || r1.isParent())\n return !1;\n var D = B[r1.id()];\n if (D)\n _ = D.col * f + f / 2 + i.x1, Y = D.row * O + O / 2 + i.y1;\n else {\n for (; E(w, q); )\n S();\n _ = q * f + f / 2 + i.x1, Y = w * O + O / 2 + i.y1, L(w, q), S();\n }\n return {\n x: _,\n y: Y\n };\n };\n o.layoutPositions(this, t, $);\n }\n return this;\n};\nvar hr1 = {\n ready: function() {\n },\n // on layoutready\n stop: function() {\n }\n // on layoutstop\n};\nfunction _9(e) {\n this.options = K0({}, hr1, e);\n}\n_9.prototype.run = function() {\n var e = this.options, t = e.eles, r = this;\n return e.cy, r.emit("layoutstart"), t.nodes().positions(function() {\n return {\n x: 0,\n y: 0\n };\n }), r.one("layoutready", e.ready), r.emit("layoutready"), r.one("layoutstop", e.stop), r.emit("layoutstop"), this;\n};\n_9.prototype.stop = function() {\n return this;\n};\nvar Mr1 = {\n positions: void 0,\n // map of (node id) => (position obj); or function(node){ return somPos; }\n zoom: void 0,\n // the zoom level to set (prob want fit = false if set)\n pan: void 0,\n // the pan level to set (prob want fit = false if set)\n fit: !0,\n // whether to fit to viewport\n padding: 30,\n // padding on fit\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts\n};\nfunction ZO(e) {\n this.options = K0({}, Mr1, e);\n}\nZO.prototype.run = function() {\n var e = this.options, t = e.eles, r = t.nodes(), n = at(e.positions);\n function o(i) {\n if (e.positions == null)\n return Re1(i.position());\n if (n)\n return e.positions(i);\n var a = e.positions[i._private.data.id];\n return a ?? null;\n }\n return r.layoutPositions(this, e, function(i, a) {\n var s = o(i);\n return i.locked() || s == null ? !1 : s;\n }), this;\n};\nvar fr1 = {\n fit: !0,\n // whether to fit to viewport\n padding: 30,\n // fit padding\n boundingBox: void 0,\n // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h }\n animate: !1,\n // whether to transition the node positions\n animationDuration: 500,\n // duration of animation in ms if enabled\n animationEasing: void 0,\n // easing of animation if enabled\n animateFilter: function(t, r) {\n return !0;\n },\n // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts\n ready: void 0,\n // callback on layoutready\n stop: void 0,\n // callback on layoutstop\n transform: function(t, r) {\n return r;\n }\n // transform a given node position. Useful for changing flow direction in discrete layouts \n};\nfunction JO(e) {\n this.options = K0({}, fr1, e);\n}\nJO.prototype.run = function() {\n var e = this.options, t = e.cy, r = e.eles, n = w2(e.boundingBox ? e.boundingBox : {\n x1: 0,\n y1: 0,\n w: t.width(),\n h: t.height()\n }), o = function(a, s) {\n return {\n x: n.x1 + Math.round(Math.random() * n.w),\n y: n.y1 + Math.round(Math.random() * n.h)\n };\n };\n return r.nodes().layoutPositions(this, e, o), this;\n};\nvar gr1 = [{\n name: "breadthfirst",\n impl: XO\n}, {\n name: "circle",\n impl: QO\n}, {\n name: "concentric",\n impl: GO\n}, {\n name: "cose",\n impl: Qc\n}, {\n name: "grid",\n impl: KO\n}, {\n name: "null",\n impl: _9\n}, {\n name: "preset",\n impl: ZO\n}, {\n name: "random",\n impl: JO\n}];\nfunction _O(e) {\n this.options = e, this.notifications = 0;\n}\nvar Qh = function() {\n}, Gh = function() {\n throw new Error("A headless instance can not render images");\n};\n_O.prototype = {\n recalculateRenderedStyle: Qh,\n notify: function() {\n this.notifications++;\n },\n init: Qh,\n isHeadless: function() {\n return !0;\n },\n png: Gh,\n jpg: Gh\n};\nvar $9 = {};\n$9.arrowShapeWidth = 0.3;\n$9.registerArrowShapes = function() {\n var e = this.arrowShapes = {}, t = this, r = function(c, p, d, u, h, b, M) {\n var C = h.x - d / 2 - M, g = h.x + d / 2 + M, f = h.y - d / 2 - M, O = h.y + d / 2 + M, m = C <= c && c <= g && f <= p && p <= O;\n return m;\n }, n = function(c, p, d, u, h) {\n var b = c * Math.cos(u) - p * Math.sin(u), M = c * Math.sin(u) + p * Math.cos(u), C = b * d, g = M * d, f = C + h.x, O = g + h.y;\n return {\n x: f,\n y: O\n };\n }, o = function(c, p, d, u) {\n for (var h = [], b = 0; b < c.length; b += 2) {\n var M = c[b], C = c[b + 1];\n h.push(n(M, C, p, d, u));\n }\n return h;\n }, i = function(c) {\n for (var p = [], d = 0; d < c.length; d++) {\n var u = c[d];\n p.push(u.x, u.y);\n }\n return p;\n }, a = function(c) {\n return c.pstyle("width").pfValue * c.pstyle("arrow-scale").pfValue * 2;\n }, s = function(c, p) {\n U0(p) && (p = e[p]), e[c] = K0({\n name: c,\n points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3],\n collide: function(u, h, b, M, C, g) {\n var f = i(o(this.points, b + 2 * g, M, C)), O = g2(u, h, f);\n return O;\n },\n roughCollide: r,\n draw: function(u, h, b, M) {\n var C = o(this.points, h, b, M);\n t.arrowShapeImpl("polygon")(u, C);\n },\n spacing: function(u) {\n return 0;\n },\n gap: a\n }, p);\n };\n s("none", {\n collide: Kl,\n roughCollide: Kl,\n draw: V9,\n spacing: lh,\n gap: lh\n }), s("triangle", {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3]\n }), s("arrow", "triangle"), s("triangle-backcurve", {\n points: e.triangle.points,\n controlPoint: [0, -0.15],\n roughCollide: r,\n draw: function(c, p, d, u, h) {\n var b = o(this.points, p, d, u), M = this.controlPoint, C = n(M[0], M[1], p, d, u);\n t.arrowShapeImpl(this.name)(c, b, C);\n },\n gap: function(c) {\n return a(c) * 0.8;\n }\n }), s("triangle-tee", {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4],\n collide: function(c, p, d, u, h, b, M) {\n var C = i(o(this.points, d + 2 * M, u, h)), g = i(o(this.pointsTee, d + 2 * M, u, h)), f = g2(c, p, C) || g2(c, p, g);\n return f;\n },\n draw: function(c, p, d, u, h) {\n var b = o(this.points, p, d, u), M = o(this.pointsTee, p, d, u);\n t.arrowShapeImpl(this.name)(c, b, M);\n }\n }), s("circle-triangle", {\n radius: 0.15,\n pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15],\n collide: function(c, p, d, u, h, b, M) {\n var C = h, g = Math.pow(C.x - c, 2) + Math.pow(C.y - p, 2) <= Math.pow((d + 2 * M) * this.radius, 2), f = i(o(this.points, d + 2 * M, u, h));\n return g2(c, p, f) || g;\n },\n draw: function(c, p, d, u, h) {\n var b = o(this.pointsTr, p, d, u);\n t.arrowShapeImpl(this.name)(c, b, u.x, u.y, this.radius * p);\n },\n spacing: function(c) {\n return t.getArrowWidth(c.pstyle("width").pfValue, c.pstyle("arrow-scale").value) * this.radius;\n }\n }), s("triangle-cross", {\n points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0],\n baseCrossLinePts: [\n -0.15,\n -0.4,\n // first half of the rectangle\n -0.15,\n -0.4,\n 0.15,\n -0.4,\n // second half of the rectangle\n 0.15,\n -0.4\n ],\n crossLinePts: function(c, p) {\n var d = this.baseCrossLinePts.slice(), u = p / c, h = 3, b = 5;\n return d[h] = d[h] - u, d[b] = d[b] - u, d;\n },\n collide: function(c, p, d, u, h, b, M) {\n var C = i(o(this.points, d + 2 * M, u, h)), g = i(o(this.crossLinePts(d, b), d + 2 * M, u, h)), f = g2(c, p, C) || g2(c, p, g);\n return f;\n },\n draw: function(c, p, d, u, h) {\n var b = o(this.points, p, d, u), M = o(this.crossLinePts(p, h), p, d, u);\n t.arrowShapeImpl(this.name)(c, b, M);\n }\n }), s("vee", {\n points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15],\n gap: function(c) {\n return a(c) * 0.525;\n }\n }), s("circle", {\n radius: 0.15,\n collide: function(c, p, d, u, h, b, M) {\n var C = h, g = Math.pow(C.x - c, 2) + Math.pow(C.y - p, 2) <= Math.pow((d + 2 * M) * this.radius, 2);\n return g;\n },\n draw: function(c, p, d, u, h) {\n t.arrowShapeImpl(this.name)(c, u.x, u.y, this.radius * p);\n },\n spacing: function(c) {\n return t.getArrowWidth(c.pstyle("width").pfValue, c.pstyle("arrow-scale").value) * this.radius;\n }\n }), s("tee", {\n points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0],\n spacing: function(c) {\n return 1;\n },\n gap: function(c) {\n return 1;\n }\n }), s("square", {\n points: [-0.15, 0, 0.15, 0, 0.15, -0.3, -0.15, -0.3]\n }), s("diamond", {\n points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0],\n gap: function(c) {\n return c.pstyle("width").pfValue * c.pstyle("arrow-scale").value;\n }\n }), s("chevron", {\n points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15],\n gap: function(c) {\n return 0.95 * c.pstyle("width").pfValue * c.pstyle("arrow-scale").value;\n }\n });\n};\nvar yi = {};\nyi.projectIntoViewport = function(e, t) {\n var r = this.cy, n = this.findContainerClientCoords(), o = n[0], i = n[1], a = n[4], s = r.pan(), l = r.zoom(), c = ((e - o) / a - s.x) / l, p = ((t - i) / a - s.y) / l;\n return [c, p];\n};\nyi.findContainerClientCoords = function() {\n if (this.containerBB)\n return this.containerBB;\n var e = this.container, t = e.getBoundingClientRect(), r = et.getComputedStyle(e), n = function(g) {\n return parseFloat(r.getPropertyValue(g));\n }, o = {\n left: n("padding-left"),\n right: n("padding-right"),\n top: n("padding-top"),\n bottom: n("padding-bottom")\n }, i = {\n left: n("border-left-width"),\n right: n("border-right-width"),\n top: n("border-top-width"),\n bottom: n("border-bottom-width")\n }, a = e.clientWidth, s = e.clientHeight, l = o.left + o.right, c = o.top + o.bottom, p = i.left + i.right, d = t.width / (a + p), u = a - l, h = s - c, b = t.left + o.left + i.left, M = t.top + o.top + i.top;\n return this.containerBB = [b, M, u, h, d];\n};\nyi.invalidateContainerClientCoordsCache = function() {\n this.containerBB = null;\n};\nyi.findNearestElement = function(e, t, r, n) {\n return this.findNearestElements(e, t, r, n)[0];\n};\nyi.findNearestElements = function(e, t, r, n) {\n var o = this, i = this, a = i.getCachedZSortedEles(), s = [], l = i.cy.zoom(), c = i.cy.hasCompoundNodes(), p = (n ? 24 : 8) / l, d = (n ? 8 : 2) / l, u = (n ? 8 : 2) / l, h = 1 / 0, b, M;\n r && (a = a.interactive);\n function C(z, N) {\n if (z.isNode()) {\n if (M)\n return;\n M = z, s.push(z);\n }\n if (z.isEdge() && (N == null || N < h))\n if (b) {\n if (b.pstyle("z-compound-depth").value === z.pstyle("z-compound-depth").value && b.pstyle("z-compound-depth").value === z.pstyle("z-compound-depth").value) {\n for (var W = 0; W < s.length; W++)\n if (s[W].isEdge()) {\n s[W] = z, b = z, h = N ?? h;\n break;\n }\n }\n } else\n s.push(z), b = z, h = N ?? h;\n }\n function g(z) {\n var N = z.outerWidth() + 2 * d, W = z.outerHeight() + 2 * d, T = N / 2, x = W / 2, E = z.position();\n if (E.x - T <= e && e <= E.x + T && E.y - x <= t && t <= E.y + x) {\n var L = i.nodeShapes[o.getNodeShape(z)];\n if (L.checkPoint(e, t, 0, N, W, E.x, E.y))\n return C(z, 0), !0;\n }\n }\n function f(z) {\n var N = z._private, W = N.rscratch, T = z.pstyle("width").pfValue, x = z.pstyle("arrow-scale").value, E = T / 2 + p, L = E * E, w = E * 2, I = N.source, P = N.target, q;\n if (W.edgeType === "segments" || W.edgeType === "straight" || W.edgeType === "haystack") {\n for (var S = W.allpts, B = 0; B + 3 < S.length; B += 2)\n if (Fe1(e, t, S[B], S[B + 1], S[B + 2], S[B + 3], w) && L > (q = Ge1(e, t, S[B], S[B + 1], S[B + 2], S[B + 3])))\n return C(z, q), !0;\n } else if (W.edgeType === "bezier" || W.edgeType === "multibezier" || W.edgeType === "self" || W.edgeType === "compound") {\n for (var S = W.allpts, B = 0; B + 5 < W.allpts.length; B += 4)\n if (Ue1(e, t, S[B], S[B + 1], S[B + 2], S[B + 3], S[B + 4], S[B + 5], w) && L > (q = Qe1(e, t, S[B], S[B + 1], S[B + 2], S[B + 3], S[B + 4], S[B + 5])))\n return C(z, q), !0;\n }\n for (var I = I || N.source, P = P || N.target, k = o.getArrowWidth(T, x), K = [{\n name: "source",\n x: W.arrowStartX,\n y: W.arrowStartY,\n angle: W.srcArrowAngle\n }, {\n name: "target",\n x: W.arrowEndX,\n y: W.arrowEndY,\n angle: W.tgtArrowAngle\n }, {\n name: "mid-source",\n x: W.midX,\n y: W.midY,\n angle: W.midsrcArrowAngle\n }, {\n name: "mid-target",\n x: W.midX,\n y: W.midY,\n angle: W.midtgtArrowAngle\n }], B = 0; B < K.length; B++) {\n var $ = K[B], j = i.arrowShapes[z.pstyle($.name + "-arrow-shape").value], r1 = z.pstyle("width").pfValue;\n if (j.roughCollide(e, t, k, $.angle, {\n x: $.x,\n y: $.y\n }, r1, p) && j.collide(e, t, k, $.angle, {\n x: $.x,\n y: $.y\n }, r1, p))\n return C(z), !0;\n }\n c && s.length > 0 && (g(I), g(P));\n }\n function O(z, N, W) {\n return hr(z, N, W);\n }\n function m(z, N) {\n var W = z._private, T = u, x;\n N ? x = N + "-" : x = "", z.boundingBox();\n var E = W.labelBounds[N || "main"], L = z.pstyle(x + "label").value, w = z.pstyle("text-events").strValue === "yes";\n if (!(!w || !L)) {\n var q = O(W.rscratch, "labelX", N), S = O(W.rscratch, "labelY", N), B = O(W.rscratch, "labelAngle", N), I = z.pstyle(x + "text-margin-x").pfValue, P = z.pstyle(x + "text-margin-y").pfValue, k = E.x1 - T - I, K = E.x2 + T - I, $ = E.y1 - T - P, j = E.y2 + T - P;\n if (B) {\n var r1 = Math.cos(B), a1 = Math.sin(B), _ = function(V, Q) {\n return V = V - q, Q = Q - S, {\n x: V * r1 - Q * a1 + q,\n y: V * a1 + Q * r1 + S\n };\n }, Y = _(k, $), D = _(k, j), H = _(K, $), G = _(K, j), J = [\n // with the margin added after the rotation is applied\n Y.x + I,\n Y.y + P,\n H.x + I,\n H.y + P,\n G.x + I,\n G.y + P,\n D.x + I,\n D.y + P\n ];\n if (g2(e, t, J))\n return C(z), !0;\n } else if (Wa(E, e, t))\n return C(z), !0;\n }\n }\n for (var v = a.length - 1; v >= 0; v--) {\n var y = a[v];\n y.isNode() ? g(y) || m(y) : f(y) || m(y) || m(y, "source") || m(y, "target");\n }\n return s;\n};\nyi.getAllInBox = function(e, t, r, n) {\n var o = this.getCachedZSortedEles().interactive, i = [], a = Math.min(e, r), s = Math.max(e, r), l = Math.min(t, n), c = Math.max(t, n);\n e = a, r = s, t = l, n = c;\n for (var p = w2({\n x1: e,\n y1: t,\n x2: r,\n y2: n\n }), d = 0; d < o.length; d++) {\n var u = o[d];\n if (u.isNode()) {\n var h = u, b = h.boundingBox({\n includeNodes: !0,\n includeEdges: !1,\n includeLabels: !1\n });\n Y9(p, b) && !AO(b, p) && i.push(h);\n } else {\n var M = u, C = M._private, g = C.rscratch;\n if (g.startX != null && g.startY != null && !Wa(p, g.startX, g.startY) || g.endX != null && g.endY != null && !Wa(p, g.endX, g.endY))\n continue;\n if (g.edgeType === "bezier" || g.edgeType === "multibezier" || g.edgeType === "self" || g.edgeType === "compound" || g.edgeType === "segments" || g.edgeType === "haystack") {\n for (var f = C.rstyle.bezierPts || C.rstyle.linePts || C.rstyle.haystackPts, O = !0, m = 0; m < f.length; m++)\n if (!Ve1(p, f[m])) {\n O = !1;\n break;\n }\n O && i.push(M);\n } else\n (g.edgeType === "haystack" || g.edgeType === "straight") && i.push(M);\n }\n }\n return i;\n};\nvar ec = {};\nec.calculateArrowAngles = function(e) {\n var t = e._private.rscratch, r = t.edgeType === "haystack", n = t.edgeType === "bezier", o = t.edgeType === "multibezier", i = t.edgeType === "segments", a = t.edgeType === "compound", s = t.edgeType === "self", l, c, p, d, u, h, g, f;\n if (r ? (p = t.haystackPts[0], d = t.haystackPts[1], u = t.haystackPts[2], h = t.haystackPts[3]) : (p = t.arrowStartX, d = t.arrowStartY, u = t.arrowEndX, h = t.arrowEndY), g = t.midX, f = t.midY, i)\n l = p - t.segpts[0], c = d - t.segpts[1];\n else if (o || a || s || n) {\n var b = t.allpts, M = qt(b[0], b[2], b[4], 0.1), C = qt(b[1], b[3], b[5], 0.1);\n l = p - M, c = d - C;\n } else\n l = p - g, c = d - f;\n t.srcArrowAngle = C5(l, c);\n var g = t.midX, f = t.midY;\n if (r && (g = (p + u) / 2, f = (d + h) / 2), l = u - p, c = h - d, i) {\n var b = t.allpts;\n if (b.length / 2 % 2 === 0) {\n var O = b.length / 2, m = O - 2;\n l = b[O] - b[m], c = b[O + 1] - b[m + 1];\n } else {\n var O = b.length / 2 - 1, m = O - 2, v = O + 2;\n l = b[O] - b[m], c = b[O + 1] - b[m + 1];\n }\n } else if (o || a || s) {\n var b = t.allpts, y = t.ctrlpts, z, N, W, T;\n if (y.length / 2 % 2 === 0) {\n var x = b.length / 2 - 1, E = x + 2, L = E + 2;\n z = qt(b[x], b[E], b[L], 0), N = qt(b[x + 1], b[E + 1], b[L + 1], 0), W = qt(b[x], b[E], b[L], 1e-4), T = qt(b[x + 1], b[E + 1], b[L + 1], 1e-4);\n } else {\n var E = b.length / 2 - 1, x = E - 2, L = E + 2;\n z = qt(b[x], b[E], b[L], 0.4999), N = qt(b[x + 1], b[E + 1], b[L + 1], 0.4999), W = qt(b[x], b[E], b[L], 0.5), T = qt(b[x + 1], b[E + 1], b[L + 1], 0.5);\n }\n l = W - z, c = T - N;\n }\n if (t.midtgtArrowAngle = C5(l, c), t.midDispX = l, t.midDispY = c, l *= -1, c *= -1, i) {\n var b = t.allpts;\n if (b.length / 2 % 2 !== 0) {\n var O = b.length / 2 - 1, v = O + 2;\n l = -(b[v] - b[O]), c = -(b[v + 1] - b[O + 1]);\n }\n }\n if (t.midsrcArrowAngle = C5(l, c), i)\n l = u - t.segpts[t.segpts.length - 2], c = h - t.segpts[t.segpts.length - 1];\n else if (o || a || s || n) {\n var b = t.allpts, w = b.length, M = qt(b[w - 6], b[w - 4], b[w - 2], 0.9), C = qt(b[w - 5], b[w - 3], b[w - 1], 0.9);\n l = u - M, c = h - C;\n } else\n l = u - g, c = h - f;\n t.tgtArrowAngle = C5(l, c);\n};\nec.getArrowWidth = ec.getArrowHeight = function(e, t) {\n var r = this.arrowWidthCache = this.arrowWidthCache || {}, n = r[e + ", " + t];\n return n || (n = Math.max(Math.pow(e * 13.37, 0.9), 29) * t, r[e + ", " + t] = n, n);\n};\nvar c2 = {};\nc2.findHaystackPoints = function(e) {\n for (var t = 0; t < e.length; t++) {\n var r = e[t], n = r._private, o = n.rscratch;\n if (!o.haystack) {\n var i = Math.random() * 2 * Math.PI;\n o.source = {\n x: Math.cos(i),\n y: Math.sin(i)\n }, i = Math.random() * 2 * Math.PI, o.target = {\n x: Math.cos(i),\n y: Math.sin(i)\n };\n }\n var a = n.source, s = n.target, l = a.position(), c = s.position(), p = a.width(), d = s.width(), u = a.height(), h = s.height(), b = r.pstyle("haystack-radius").value, M = b / 2;\n o.haystackPts = o.allpts = [o.source.x * p * M + l.x, o.source.y * u * M + l.y, o.target.x * d * M + c.x, o.target.y * h * M + c.y], o.midX = (o.allpts[0] + o.allpts[2]) / 2, o.midY = (o.allpts[1] + o.allpts[3]) / 2, o.edgeType = "haystack", o.haystack = !0, this.storeEdgeProjections(r), this.calculateArrowAngles(r), this.recalculateEdgeLabelProjections(r), this.calculateLabelAngles(r);\n }\n};\nc2.findSegmentsPoints = function(e, t) {\n var r = e._private.rscratch, n = t.posPts, o = t.intersectionPts, i = t.vectorNormInverse, a = e.pstyle("edge-distances").value, s = e.pstyle("segment-weights"), l = e.pstyle("segment-distances"), c = Math.min(s.pfValue.length, l.pfValue.length);\n r.edgeType = "segments", r.segpts = [];\n for (var p = 0; p < c; p++) {\n var d = s.pfValue[p], u = l.pfValue[p], h = 1 - d, b = d, M = a === "node-position" ? n : o, C = {\n x: M.x1 * h + M.x2 * b,\n y: M.y1 * h + M.y2 * b\n };\n r.segpts.push(C.x + i.x * u, C.y + i.y * u);\n }\n};\nc2.findLoopPoints = function(e, t, r, n) {\n var o = e._private.rscratch, i = t.dirCounts, a = t.srcPos, s = e.pstyle("control-point-distances"), l = s ? s.pfValue[0] : void 0, c = e.pstyle("loop-direction").pfValue, p = e.pstyle("loop-sweep").pfValue, d = e.pstyle("control-point-step-size").pfValue;\n o.edgeType = "self";\n var u = r, h = d;\n n && (u = 0, h = l);\n var b = c - Math.PI / 2, M = b - p / 2, C = b + p / 2, g = c + "_" + p;\n u = i[g] === void 0 ? i[g] = 0 : ++i[g], o.ctrlpts = [a.x + Math.cos(M) * 1.4 * h * (u / 3 + 1), a.y + Math.sin(M) * 1.4 * h * (u / 3 + 1), a.x + Math.cos(C) * 1.4 * h * (u / 3 + 1), a.y + Math.sin(C) * 1.4 * h * (u / 3 + 1)];\n};\nc2.findCompoundLoopPoints = function(e, t, r, n) {\n var o = e._private.rscratch;\n o.edgeType = "compound";\n var i = t.srcPos, a = t.tgtPos, s = t.srcW, l = t.srcH, c = t.tgtW, p = t.tgtH, d = e.pstyle("control-point-step-size").pfValue, u = e.pstyle("control-point-distances"), h = u ? u.pfValue[0] : void 0, b = r, M = d;\n n && (b = 0, M = h);\n var C = 50, g = {\n x: i.x - s / 2,\n y: i.y - l / 2\n }, f = {\n x: a.x - c / 2,\n y: a.y - p / 2\n }, O = {\n x: Math.min(g.x, f.x),\n y: Math.min(g.y, f.y)\n }, m = 0.5, v = Math.max(m, Math.log(s * 0.01)), y = Math.max(m, Math.log(c * 0.01));\n o.ctrlpts = [O.x, O.y - (1 + Math.pow(C, 1.12) / 100) * M * (b / 3 + 1) * v, O.x - (1 + Math.pow(C, 1.12) / 100) * M * (b / 3 + 1) * y, O.y];\n};\nc2.findStraightEdgePoints = function(e) {\n e._private.rscratch.edgeType = "straight";\n};\nc2.findBezierPoints = function(e, t, r, n, o) {\n var i = e._private.rscratch, a = t.vectorNormInverse, s = t.posPts, l = t.intersectionPts, c = e.pstyle("edge-distances").value, p = e.pstyle("control-point-step-size").pfValue, d = e.pstyle("control-point-distances"), u = e.pstyle("control-point-weights"), h = d && u ? Math.min(d.value.length, u.value.length) : 1, b = d ? d.pfValue[0] : void 0, M = u.value[0], C = n;\n i.edgeType = C ? "multibezier" : "bezier", i.ctrlpts = [];\n for (var g = 0; g < h; g++) {\n var f = (0.5 - t.eles.length / 2 + r) * p * (o ? -1 : 1), O = void 0, m = dO(f);\n C && (b = d ? d.pfValue[g] : p, M = u.value[g]), n ? O = b : O = b !== void 0 ? m * b : void 0;\n var v = O !== void 0 ? O : f, y = 1 - M, z = M, N = c === "node-position" ? s : l, W = {\n x: N.x1 * y + N.x2 * z,\n y: N.y1 * y + N.y2 * z\n };\n i.ctrlpts.push(W.x + a.x * v, W.y + a.y * v);\n }\n};\nc2.findTaxiPoints = function(e, t) {\n var r = e._private.rscratch;\n r.edgeType = "segments";\n var n = "vertical", o = "horizontal", i = "leftward", a = "rightward", s = "downward", l = "upward", c = "auto", p = t.posPts, d = t.srcW, u = t.srcH, h = t.tgtW, b = t.tgtH, M = e.pstyle("edge-distances").value, C = M !== "node-position", g = e.pstyle("taxi-direction").value, f = g, O = e.pstyle("taxi-turn"), m = O.units === "%", v = O.pfValue, y = v < 0, z = e.pstyle("taxi-turn-min-distance").pfValue, N = C ? (d + h) / 2 : 0, W = C ? (u + b) / 2 : 0, T = p.x2 - p.x1, x = p.y2 - p.y1, E = function(y1, B1) {\n return y1 > 0 ? Math.max(y1 - B1, 0) : Math.min(y1 + B1, 0);\n }, L = E(T, N), w = E(x, W), q = !1;\n f === c ? g = Math.abs(L) > Math.abs(w) ? o : n : f === l || f === s ? (g = n, q = !0) : (f === i || f === a) && (g = o, q = !0);\n var S = g === n, B = S ? w : L, I = S ? x : T, P = dO(I), k = !1;\n !(q && (m || y)) && (f === s && I < 0 || f === l && I > 0 || f === i && I > 0 || f === a && I < 0) && (P *= -1, B = P * Math.abs(B), k = !0);\n var K;\n if (m) {\n var $ = v < 0 ? 1 + v : v;\n K = $ * B;\n } else {\n var j = v < 0 ? B : 0;\n K = j + v * P;\n }\n var r1 = function(y1) {\n return Math.abs(y1) < z || Math.abs(y1) >= Math.abs(B);\n }, a1 = r1(K), _ = r1(Math.abs(B) - Math.abs(K)), Y = a1 || _;\n if (Y && !k)\n if (S) {\n var D = Math.abs(I) <= u / 2, H = Math.abs(T) <= h / 2;\n if (D) {\n var G = (p.x1 + p.x2) / 2, J = p.y1, F = p.y2;\n r.segpts = [G, J, G, F];\n } else if (H) {\n var V = (p.y1 + p.y2) / 2, Q = p.x1, Z = p.x2;\n r.segpts = [Q, V, Z, V];\n } else\n r.segpts = [p.x1, p.y2];\n } else {\n var t1 = Math.abs(I) <= d / 2, n1 = Math.abs(x) <= b / 2;\n if (t1) {\n var U = (p.y1 + p.y2) / 2, e1 = p.x1, o1 = p.x2;\n r.segpts = [e1, U, o1, U];\n } else if (n1) {\n var u1 = (p.x1 + p.x2) / 2, M1 = p.y1, A1 = p.y2;\n r.segpts = [u1, M1, u1, A1];\n } else\n r.segpts = [p.x2, p.y1];\n }\n else if (S) {\n var l1 = p.y1 + K + (C ? u / 2 * P : 0), b1 = p.x1, h1 = p.x2;\n r.segpts = [b1, l1, h1, l1];\n } else {\n var z1 = p.x1 + K + (C ? d / 2 * P : 0), O1 = p.y1, m1 = p.y2;\n r.segpts = [z1, O1, z1, m1];\n }\n};\nc2.tryToCorrectInvalidPoints = function(e, t) {\n var r = e._private.rscratch;\n if (r.edgeType === "bezier") {\n var n = t.srcPos, o = t.tgtPos, i = t.srcW, a = t.srcH, s = t.tgtW, l = t.tgtH, c = t.srcShape, p = t.tgtShape, d = !O0(r.startX) || !O0(r.startY), u = !O0(r.arrowStartX) || !O0(r.arrowStartY), h = !O0(r.endX) || !O0(r.endY), b = !O0(r.arrowEndX) || !O0(r.arrowEndY), M = 3, C = this.getArrowWidth(e.pstyle("width").pfValue, e.pstyle("arrow-scale").value) * this.arrowShapeWidth, g = M * C, f = gi({\n x: r.ctrlpts[0],\n y: r.ctrlpts[1]\n }, {\n x: r.startX,\n y: r.startY\n }), O = f < g, m = gi({\n x: r.ctrlpts[0],\n y: r.ctrlpts[1]\n }, {\n x: r.endX,\n y: r.endY\n }), v = m < g, y = !1;\n if (d || u || O) {\n y = !0;\n var z = {\n // delta\n x: r.ctrlpts[0] - n.x,\n y: r.ctrlpts[1] - n.y\n }, N = Math.sqrt(z.x * z.x + z.y * z.y), W = {\n // normalised delta\n x: z.x / N,\n y: z.y / N\n }, T = Math.max(i, a), x = {\n // *2 radius guarantees outside shape\n x: r.ctrlpts[0] + W.x * 2 * T,\n y: r.ctrlpts[1] + W.y * 2 * T\n }, E = c.intersectLine(n.x, n.y, i, a, x.x, x.y, 0);\n O ? (r.ctrlpts[0] = r.ctrlpts[0] + W.x * (g - f), r.ctrlpts[1] = r.ctrlpts[1] + W.y * (g - f)) : (r.ctrlpts[0] = E[0] + W.x * g, r.ctrlpts[1] = E[1] + W.y * g);\n }\n if (h || b || v) {\n y = !0;\n var L = {\n // delta\n x: r.ctrlpts[0] - o.x,\n y: r.ctrlpts[1] - o.y\n }, w = Math.sqrt(L.x * L.x + L.y * L.y), q = {\n // normalised delta\n x: L.x / w,\n y: L.y / w\n }, S = Math.max(i, a), B = {\n // *2 radius guarantees outside shape\n x: r.ctrlpts[0] + q.x * 2 * S,\n y: r.ctrlpts[1] + q.y * 2 * S\n }, I = p.intersectLine(o.x, o.y, s, l, B.x, B.y, 0);\n v ? (r.ctrlpts[0] = r.ctrlpts[0] + q.x * (g - m), r.ctrlpts[1] = r.ctrlpts[1] + q.y * (g - m)) : (r.ctrlpts[0] = I[0] + q.x * g, r.ctrlpts[1] = I[1] + q.y * g);\n }\n y && this.findEndpoints(e);\n }\n};\nc2.storeAllpts = function(e) {\n var t = e._private.rscratch;\n if (t.edgeType === "multibezier" || t.edgeType === "bezier" || t.edgeType === "self" || t.edgeType === "compound") {\n t.allpts = [], t.allpts.push(t.startX, t.startY);\n for (var r = 0; r + 1 < t.ctrlpts.length; r += 2)\n t.allpts.push(t.ctrlpts[r], t.ctrlpts[r + 1]), r + 3 < t.ctrlpts.length && t.allpts.push((t.ctrlpts[r] + t.ctrlpts[r + 2]) / 2, (t.ctrlpts[r + 1] + t.ctrlpts[r + 3]) / 2);\n t.allpts.push(t.endX, t.endY);\n var n, o;\n t.ctrlpts.length / 2 % 2 === 0 ? (n = t.allpts.length / 2 - 1, t.midX = t.allpts[n], t.midY = t.allpts[n + 1]) : (n = t.allpts.length / 2 - 3, o = 0.5, t.midX = qt(t.allpts[n], t.allpts[n + 2], t.allpts[n + 4], o), t.midY = qt(t.allpts[n + 1], t.allpts[n + 3], t.allpts[n + 5], o));\n } else if (t.edgeType === "straight")\n t.allpts = [t.startX, t.startY, t.endX, t.endY], t.midX = (t.startX + t.endX + t.arrowStartX + t.arrowEndX) / 4, t.midY = (t.startY + t.endY + t.arrowStartY + t.arrowEndY) / 4;\n else if (t.edgeType === "segments")\n if (t.allpts = [], t.allpts.push(t.startX, t.startY), t.allpts.push.apply(t.allpts, t.segpts), t.allpts.push(t.endX, t.endY), t.segpts.length % 4 === 0) {\n var i = t.segpts.length / 2, a = i - 2;\n t.midX = (t.segpts[a] + t.segpts[i]) / 2, t.midY = (t.segpts[a + 1] + t.segpts[i + 1]) / 2;\n } else {\n var s = t.segpts.length / 2 - 1;\n t.midX = t.segpts[s], t.midY = t.segpts[s + 1];\n }\n};\nc2.checkForInvalidEdgeWarning = function(e) {\n var t = e[0]._private.rscratch;\n t.nodesOverlap || O0(t.startX) && O0(t.startY) && O0(t.endX) && O0(t.endY) ? t.loggedErr = !1 : t.loggedErr || (t.loggedErr = !0, je("Edge `" + e.id() + "` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap."));\n};\nc2.findEdgeControlPoints = function(e) {\n var t = this;\n if (!(!e || e.length === 0)) {\n for (var r = this, n = r.cy, o = n.hasCompoundNodes(), i = {\n map: new Ur(),\n get: function(z) {\n var N = this.map.get(z[0]);\n return N != null ? N.get(z[1]) : null;\n },\n set: function(z, N) {\n var W = this.map.get(z[0]);\n W == null && (W = new Ur(), this.map.set(z[0], W)), W.set(z[1], N);\n }\n }, a = [], s = [], l = 0; l < e.length; l++) {\n var c = e[l], p = c._private, d = c.pstyle("curve-style").value;\n if (!(c.removed() || !c.takesUpSpace())) {\n if (d === "haystack") {\n s.push(c);\n continue;\n }\n var u = d === "unbundled-bezier" || d === "segments" || d === "straight" || d === "taxi", h = d === "unbundled-bezier" || d === "bezier", b = p.source, M = p.target, C = b.poolIndex(), g = M.poolIndex(), f = [C, g].sort(), O = i.get(f);\n O == null && (O = {\n eles: []\n }, i.set(f, O), a.push(f)), O.eles.push(c), u && (O.hasUnbundled = !0), h && (O.hasBezier = !0);\n }\n }\n for (var m = function(z) {\n var N = a[z], W = i.get(N), T = void 0;\n if (!W.hasUnbundled) {\n var x = W.eles[0].parallelEdges().filter(function(A1) {\n return A1.isBundledBezier();\n });\n F9(W.eles), x.forEach(function(A1) {\n return W.eles.push(A1);\n }), W.eles.sort(function(A1, l1) {\n return A1.poolIndex() - l1.poolIndex();\n });\n }\n var E = W.eles[0], L = E.source(), w = E.target();\n if (L.poolIndex() > w.poolIndex()) {\n var q = L;\n L = w, w = q;\n }\n var S = W.srcPos = L.position(), B = W.tgtPos = w.position(), I = W.srcW = L.outerWidth(), P = W.srcH = L.outerHeight(), k = W.tgtW = w.outerWidth(), K = W.tgtH = w.outerHeight(), $ = W.srcShape = r.nodeShapes[t.getNodeShape(L)], j = W.tgtShape = r.nodeShapes[t.getNodeShape(w)];\n W.dirCounts = {\n north: 0,\n west: 0,\n south: 0,\n east: 0,\n northwest: 0,\n southwest: 0,\n northeast: 0,\n southeast: 0\n };\n for (var r1 = 0; r1 < W.eles.length; r1++) {\n var a1 = W.eles[r1], _ = a1[0]._private.rscratch, Y = a1.pstyle("curve-style").value, D = Y === "unbundled-bezier" || Y === "segments" || Y === "taxi", H = !L.same(a1.source());\n if (!W.calculatedIntersection && L !== w && (W.hasBezier || W.hasUnbundled)) {\n W.calculatedIntersection = !0;\n var G = $.intersectLine(S.x, S.y, I, P, B.x, B.y, 0), J = W.srcIntn = G, F = j.intersectLine(B.x, B.y, k, K, S.x, S.y, 0), V = W.tgtIntn = F, Q = W.intersectionPts = {\n x1: G[0],\n x2: F[0],\n y1: G[1],\n y2: F[1]\n }, Z = W.posPts = {\n x1: S.x,\n x2: B.x,\n y1: S.y,\n y2: B.y\n }, t1 = F[1] - G[1], n1 = F[0] - G[0], U = Math.sqrt(n1 * n1 + t1 * t1), e1 = W.vector = {\n x: n1,\n y: t1\n }, o1 = W.vectorNorm = {\n x: e1.x / U,\n y: e1.y / U\n }, u1 = {\n x: -o1.y,\n y: o1.x\n };\n W.nodesOverlap = !O0(U) || j.checkPoint(G[0], G[1], 0, k, K, B.x, B.y) || $.checkPoint(F[0], F[1], 0, I, P, S.x, S.y), W.vectorNormInverse = u1, T = {\n nodesOverlap: W.nodesOverlap,\n dirCounts: W.dirCounts,\n calculatedIntersection: !0,\n hasBezier: W.hasBezier,\n hasUnbundled: W.hasUnbundled,\n eles: W.eles,\n srcPos: B,\n tgtPos: S,\n srcW: k,\n srcH: K,\n tgtW: I,\n tgtH: P,\n srcIntn: V,\n tgtIntn: J,\n srcShape: j,\n tgtShape: $,\n posPts: {\n x1: Z.x2,\n y1: Z.y2,\n x2: Z.x1,\n y2: Z.y1\n },\n intersectionPts: {\n x1: Q.x2,\n y1: Q.y2,\n x2: Q.x1,\n y2: Q.y1\n },\n vector: {\n x: -e1.x,\n y: -e1.y\n },\n vectorNorm: {\n x: -o1.x,\n y: -o1.y\n },\n vectorNormInverse: {\n x: -u1.x,\n y: -u1.y\n }\n };\n }\n var M1 = H ? T : W;\n _.nodesOverlap = M1.nodesOverlap, _.srcIntn = M1.srcIntn, _.tgtIntn = M1.tgtIntn, o && (L.isParent() || L.isChild() || w.isParent() || w.isChild()) && (L.parents().anySame(w) || w.parents().anySame(L) || L.same(w) && L.isParent()) ? t.findCompoundLoopPoints(a1, M1, r1, D) : L === w ? t.findLoopPoints(a1, M1, r1, D) : Y === "segments" ? t.findSegmentsPoints(a1, M1) : Y === "taxi" ? t.findTaxiPoints(a1, M1) : Y === "straight" || !D && W.eles.length % 2 === 1 && r1 === Math.floor(W.eles.length / 2) ? t.findStraightEdgePoints(a1) : t.findBezierPoints(a1, M1, r1, D, H), t.findEndpoints(a1), t.tryToCorrectInvalidPoints(a1, M1), t.checkForInvalidEdgeWarning(a1), t.storeAllpts(a1), t.storeEdgeProjections(a1), t.calculateArrowAngles(a1), t.recalculateEdgeLabelProjections(a1), t.calculateLabelAngles(a1);\n }\n }, v = 0; v < a.length; v++)\n m(v);\n this.findHaystackPoints(s);\n }\n};\nfunction $O(e) {\n var t = [];\n if (e != null) {\n for (var r = 0; r < e.length; r += 2) {\n var n = e[r], o = e[r + 1];\n t.push({\n x: n,\n y: o\n });\n }\n return t;\n }\n}\nc2.getSegmentPoints = function(e) {\n var t = e[0]._private.rscratch, r = t.edgeType;\n if (r === "segments")\n return this.recalculateRenderedStyle(e), $O(t.segpts);\n};\nc2.getControlPoints = function(e) {\n var t = e[0]._private.rscratch, r = t.edgeType;\n if (r === "bezier" || r === "multibezier" || r === "self" || r === "compound")\n return this.recalculateRenderedStyle(e), $O(t.ctrlpts);\n};\nc2.getEdgeMidpoint = function(e) {\n var t = e[0]._private.rscratch;\n return this.recalculateRenderedStyle(e), {\n x: t.midX,\n y: t.midY\n };\n};\nvar Ms = {};\nMs.manualEndptToPx = function(e, t) {\n var r = this, n = e.position(), o = e.outerWidth(), i = e.outerHeight();\n if (t.value.length === 2) {\n var a = [t.pfValue[0], t.pfValue[1]];\n return t.units[0] === "%" && (a[0] = a[0] * o), t.units[1] === "%" && (a[1] = a[1] * i), a[0] += n.x, a[1] += n.y, a;\n } else {\n var s = t.pfValue[0];\n s = -Math.PI / 2 + s;\n var l = 2 * Math.max(o, i), c = [n.x + Math.cos(s) * l, n.y + Math.sin(s) * l];\n return r.nodeShapes[this.getNodeShape(e)].intersectLine(n.x, n.y, o, i, c[0], c[1], 0);\n }\n};\nMs.findEndpoints = function(e) {\n var t = this, r, n = e.source()[0], o = e.target()[0], i = n.position(), a = o.position(), s = e.pstyle("target-arrow-shape").value, l = e.pstyle("source-arrow-shape").value, c = e.pstyle("target-distance-from-node").pfValue, p = e.pstyle("source-distance-from-node").pfValue, d = e.pstyle("curve-style").value, u = e._private.rscratch, h = u.edgeType, b = d === "taxi", M = h === "self" || h === "compound", C = h === "bezier" || h === "multibezier" || M, g = h !== "bezier", f = h === "straight" || h === "segments", O = h === "segments", m = C || g || f, v = M || b, y = e.pstyle("source-endpoint"), z = v ? "outside-to-node" : y.value, N = e.pstyle("target-endpoint"), W = v ? "outside-to-node" : N.value;\n u.srcManEndpt = y, u.tgtManEndpt = N;\n var T, x, E, L;\n if (C) {\n var w = [u.ctrlpts[0], u.ctrlpts[1]], q = g ? [u.ctrlpts[u.ctrlpts.length - 2], u.ctrlpts[u.ctrlpts.length - 1]] : w;\n T = q, x = w;\n } else if (f) {\n var S = O ? u.segpts.slice(0, 2) : [a.x, a.y], B = O ? u.segpts.slice(u.segpts.length - 2) : [i.x, i.y];\n T = B, x = S;\n }\n if (W === "inside-to-node")\n r = [a.x, a.y];\n else if (N.units)\n r = this.manualEndptToPx(o, N);\n else if (W === "outside-to-line")\n r = u.tgtIntn;\n else if (W === "outside-to-node" || W === "outside-to-node-or-label" ? E = T : (W === "outside-to-line" || W === "outside-to-line-or-label") && (E = [i.x, i.y]), r = t.nodeShapes[this.getNodeShape(o)].intersectLine(a.x, a.y, o.outerWidth(), o.outerHeight(), E[0], E[1], 0), W === "outside-to-node-or-label" || W === "outside-to-line-or-label") {\n var I = o._private.rscratch, P = I.labelWidth, k = I.labelHeight, K = I.labelX, $ = I.labelY, j = P / 2, r1 = k / 2, a1 = o.pstyle("text-valign").value;\n a1 === "top" ? $ -= r1 : a1 === "bottom" && ($ += r1);\n var _ = o.pstyle("text-halign").value;\n _ === "left" ? K -= j : _ === "right" && (K += j);\n var Y = N4(E[0], E[1], [K - j, $ - r1, K + j, $ - r1, K + j, $ + r1, K - j, $ + r1], a.x, a.y);\n if (Y.length > 0) {\n var D = i, H = $o(D, oa(r)), G = $o(D, oa(Y)), J = H;\n if (G < H && (r = Y, J = G), Y.length > 2) {\n var F = $o(D, {\n x: Y[2],\n y: Y[3]\n });\n F < J && (r = [Y[2], Y[3]]);\n }\n }\n }\n var V = O5(r, T, t.arrowShapes[s].spacing(e) + c), Q = O5(r, T, t.arrowShapes[s].gap(e) + c);\n if (u.endX = Q[0], u.endY = Q[1], u.arrowEndX = V[0], u.arrowEndY = V[1], z === "inside-to-node")\n r = [i.x, i.y];\n else if (y.units)\n r = this.manualEndptToPx(n, y);\n else if (z === "outside-to-line")\n r = u.srcIntn;\n else if (z === "outside-to-node" || z === "outside-to-node-or-label" ? L = x : (z === "outside-to-line" || z === "outside-to-line-or-label") && (L = [a.x, a.y]), r = t.nodeShapes[this.getNodeShape(n)].intersectLine(i.x, i.y, n.outerWidth(), n.outerHeight(), L[0], L[1], 0), z === "outside-to-node-or-label" || z === "outside-to-line-or-label") {\n var Z = n._private.rscratch, t1 = Z.labelWidth, n1 = Z.labelHeight, U = Z.labelX, e1 = Z.labelY, o1 = t1 / 2, u1 = n1 / 2, M1 = n.pstyle("text-valign").value;\n M1 === "top" ? e1 -= u1 : M1 === "bottom" && (e1 += u1);\n var A1 = n.pstyle("text-halign").value;\n A1 === "left" ? U -= o1 : A1 === "right" && (U += o1);\n var l1 = N4(L[0], L[1], [U - o1, e1 - u1, U + o1, e1 - u1, U + o1, e1 + u1, U - o1, e1 + u1], i.x, i.y);\n if (l1.length > 0) {\n var b1 = a, h1 = $o(b1, oa(r)), z1 = $o(b1, oa(l1)), O1 = h1;\n if (z1 < h1 && (r = [l1[0], l1[1]], O1 = z1), l1.length > 2) {\n var m1 = $o(b1, {\n x: l1[2],\n y: l1[3]\n });\n m1 < O1 && (r = [l1[2], l1[3]]);\n }\n }\n }\n var L1 = O5(r, x, t.arrowShapes[l].spacing(e) + p), y1 = O5(r, x, t.arrowShapes[l].gap(e) + p);\n u.startX = y1[0], u.startY = y1[1], u.arrowStartX = L1[0], u.arrowStartY = L1[1], m && (!O0(u.startX) || !O0(u.startY) || !O0(u.endX) || !O0(u.endY) ? u.badLine = !0 : u.badLine = !1);\n};\nMs.getSourceEndpoint = function(e) {\n var t = e[0]._private.rscratch;\n switch (this.recalculateRenderedStyle(e), t.edgeType) {\n case "haystack":\n return {\n x: t.haystackPts[0],\n y: t.haystackPts[1]\n };\n default:\n return {\n x: t.arrowStartX,\n y: t.arrowStartY\n };\n }\n};\nMs.getTargetEndpoint = function(e) {\n var t = e[0]._private.rscratch;\n switch (this.recalculateRenderedStyle(e), t.edgeType) {\n case "haystack":\n return {\n x: t.haystackPts[2],\n y: t.haystackPts[3]\n };\n default:\n return {\n x: t.arrowEndX,\n y: t.arrowEndY\n };\n }\n};\nvar ed = {};\nfunction zr1(e, t, r) {\n for (var n = function(c, p, d, u) {\n return qt(c, p, d, u);\n }, o = t._private, i = o.rstyle.bezierPts, a = 0; a < e.bezierProjPcts.length; a++) {\n var s = e.bezierProjPcts[a];\n i.push({\n x: n(r[0], r[2], r[4], s),\n y: n(r[1], r[3], r[5], s)\n });\n }\n}\ned.storeEdgeProjections = function(e) {\n var t = e._private, r = t.rscratch, n = r.edgeType;\n if (t.rstyle.bezierPts = null, t.rstyle.linePts = null, t.rstyle.haystackPts = null, n === "multibezier" || n === "bezier" || n === "self" || n === "compound") {\n t.rstyle.bezierPts = [];\n for (var o = 0; o + 5 < r.allpts.length; o += 4)\n zr1(this, e, r.allpts.slice(o, o + 6));\n } else if (n === "segments")\n for (var i = t.rstyle.linePts = [], o = 0; o + 1 < r.allpts.length; o += 2)\n i.push({\n x: r.allpts[o],\n y: r.allpts[o + 1]\n });\n else if (n === "haystack") {\n var a = r.haystackPts;\n t.rstyle.haystackPts = [{\n x: a[0],\n y: a[1]\n }, {\n x: a[2],\n y: a[3]\n }];\n }\n t.rstyle.arrowWidth = this.getArrowWidth(e.pstyle("width").pfValue, e.pstyle("arrow-scale").value) * this.arrowShapeWidth;\n};\ned.recalculateEdgeProjections = function(e) {\n this.findEdgeControlPoints(e);\n};\nvar en = {};\nen.recalculateNodeLabelProjection = function(e) {\n var t = e.pstyle("label").strValue;\n if (!Oo(t)) {\n var r, n, o = e._private, i = e.width(), a = e.height(), s = e.padding(), l = e.position(), c = e.pstyle("text-halign").strValue, p = e.pstyle("text-valign").strValue, d = o.rscratch, u = o.rstyle;\n switch (c) {\n case "left":\n r = l.x - i / 2 - s;\n break;\n case "right":\n r = l.x + i / 2 + s;\n break;\n default:\n r = l.x;\n }\n switch (p) {\n case "top":\n n = l.y - a / 2 - s;\n break;\n case "bottom":\n n = l.y + a / 2 + s;\n break;\n default:\n n = l.y;\n }\n d.labelX = r, d.labelY = n, u.labelX = r, u.labelY = n, this.calculateLabelAngles(e), this.applyLabelDimensions(e);\n }\n};\nvar em = function(t, r) {\n var n = Math.atan(r / t);\n return t === 0 && n < 0 && (n = n * -1), n;\n}, tm = function(t, r) {\n var n = r.x - t.x, o = r.y - t.y;\n return em(n, o);\n}, Cr1 = function(t, r, n, o) {\n var i = k4(0, o - 1e-3, 1), a = k4(0, o + 1e-3, 1), s = pa(t, r, n, i), l = pa(t, r, n, a);\n return tm(s, l);\n};\nen.recalculateEdgeLabelProjections = function(e) {\n var t, r = e._private, n = r.rscratch, o = this, i = {\n mid: e.pstyle("label").strValue,\n source: e.pstyle("source-label").strValue,\n target: e.pstyle("target-label").strValue\n };\n if (i.mid || i.source || i.target) {\n t = {\n x: n.midX,\n y: n.midY\n };\n var a = function(d, u, h) {\n to(r.rscratch, d, u, h), to(r.rstyle, d, u, h);\n };\n a("labelX", null, t.x), a("labelY", null, t.y);\n var s = em(n.midDispX, n.midDispY);\n a("labelAutoAngle", null, s);\n var l = function p() {\n if (p.cache)\n return p.cache;\n for (var d = [], u = 0; u + 5 < n.allpts.length; u += 4) {\n var h = {\n x: n.allpts[u],\n y: n.allpts[u + 1]\n }, b = {\n x: n.allpts[u + 2],\n y: n.allpts[u + 3]\n }, M = {\n x: n.allpts[u + 4],\n y: n.allpts[u + 5]\n };\n d.push({\n p0: h,\n p1: b,\n p2: M,\n startDist: 0,\n length: 0,\n segments: []\n });\n }\n var C = r.rstyle.bezierPts, g = o.bezierProjPcts.length;\n function f(z, N, W, T, x) {\n var E = gi(N, W), L = z.segments[z.segments.length - 1], w = {\n p0: N,\n p1: W,\n t0: T,\n t1: x,\n startDist: L ? L.startDist + L.length : 0,\n length: E\n };\n z.segments.push(w), z.length += E;\n }\n for (var O = 0; O < d.length; O++) {\n var m = d[O], v = d[O - 1];\n v && (m.startDist = v.startDist + v.length), f(m, m.p0, C[O * g], 0, o.bezierProjPcts[0]);\n for (var y = 0; y < g - 1; y++)\n f(m, C[O * g + y], C[O * g + y + 1], o.bezierProjPcts[y], o.bezierProjPcts[y + 1]);\n f(m, C[O * g + g - 1], m.p2, o.bezierProjPcts[g - 1], 1);\n }\n return p.cache = d;\n }, c = function(d) {\n var u, h = d === "source";\n if (i[d]) {\n var b = e.pstyle(d + "-text-offset").pfValue;\n switch (n.edgeType) {\n case "self":\n case "compound":\n case "bezier":\n case "multibezier": {\n for (var M = l(), C, g = 0, f = 0, O = 0; O < M.length; O++) {\n for (var m = M[h ? O : M.length - 1 - O], v = 0; v < m.segments.length; v++) {\n var y = m.segments[h ? v : m.segments.length - 1 - v], z = O === M.length - 1 && v === m.segments.length - 1;\n if (g = f, f += y.length, f >= b || z) {\n C = {\n cp: m,\n segment: y\n };\n break;\n }\n }\n if (C)\n break;\n }\n var N = C.cp, W = C.segment, T = (b - g) / W.length, x = W.t1 - W.t0, E = h ? W.t0 + x * T : W.t1 - x * T;\n E = k4(0, E, 1), t = pa(N.p0, N.p1, N.p2, E), u = Cr1(N.p0, N.p1, N.p2, E);\n break;\n }\n case "straight":\n case "segments":\n case "haystack": {\n for (var L = 0, w, q, S, B, I = n.allpts.length, P = 0; P + 3 < I && (h ? (S = {\n x: n.allpts[P],\n y: n.allpts[P + 1]\n }, B = {\n x: n.allpts[P + 2],\n y: n.allpts[P + 3]\n }) : (S = {\n x: n.allpts[I - 2 - P],\n y: n.allpts[I - 1 - P]\n }, B = {\n x: n.allpts[I - 4 - P],\n y: n.allpts[I - 3 - P]\n }), w = gi(S, B), q = L, L += w, !(L >= b)); P += 2)\n ;\n var k = b - q, K = k / w;\n K = k4(0, K, 1), t = Ie1(S, B, K), u = tm(S, B);\n break;\n }\n }\n a("labelX", d, t.x), a("labelY", d, t.y), a("labelAutoAngle", d, u);\n }\n };\n c("source"), c("target"), this.applyLabelDimensions(e);\n }\n};\nen.applyLabelDimensions = function(e) {\n this.applyPrefixedLabelDimensions(e), e.isEdge() && (this.applyPrefixedLabelDimensions(e, "source"), this.applyPrefixedLabelDimensions(e, "target"));\n};\nen.applyPrefixedLabelDimensions = function(e, t) {\n var r = e._private, n = this.getLabelText(e, t), o = this.calculateLabelDimensions(e, n), i = e.pstyle("line-height").pfValue, a = e.pstyle("text-wrap").strValue, s = hr(r.rscratch, "labelWrapCachedLines", t) || [], l = a !== "wrap" ? 1 : Math.max(s.length, 1), c = o.height / l, p = c * i, d = o.width, u = o.height + (l - 1) * (i - 1) * c;\n to(r.rstyle, "labelWidth", t, d), to(r.rscratch, "labelWidth", t, d), to(r.rstyle, "labelHeight", t, u), to(r.rscratch, "labelHeight", t, u), to(r.rscratch, "labelLineHeight", t, p);\n};\nen.getLabelText = function(e, t) {\n var r = e._private, n = t ? t + "-" : "", o = e.pstyle(n + "label").strValue, i = e.pstyle("text-transform").value, a = function(k, K) {\n return K ? (to(r.rscratch, k, t, K), K) : hr(r.rscratch, k, t);\n };\n if (!o)\n return "";\n i == "none" || (i == "uppercase" ? o = o.toUpperCase() : i == "lowercase" && (o = o.toLowerCase()));\n var s = e.pstyle("text-wrap").value;\n if (s === "wrap") {\n var l = a("labelKey");\n if (l != null && a("labelWrapKey") === l)\n return a("labelWrapCachedText");\n for (var c = "​", p = o.split(`\n`), d = e.pstyle("text-max-width").pfValue, u = e.pstyle("text-overflow-wrap").value, h = u === "anywhere", b = [], M = /[\\s\\u200b]+/, C = h ? "" : " ", g = 0; g < p.length; g++) {\n var f = p[g], O = this.calculateLabelDimensions(e, f), m = O.width;\n if (h) {\n var v = f.split("").join(c);\n f = v;\n }\n if (m > d) {\n for (var y = f.split(M), z = "", N = 0; N < y.length; N++) {\n var W = y[N], T = z.length === 0 ? W : z + C + W, x = this.calculateLabelDimensions(e, T), E = x.width;\n E <= d ? z += W + C : (z && b.push(z), z = W + C);\n }\n z.match(/^[\\s\\u200b]+$/) || b.push(z);\n } else\n b.push(f);\n }\n a("labelWrapCachedLines", b), o = a("labelWrapCachedText", b.join(`\n`)), a("labelWrapKey", l);\n } else if (s === "ellipsis") {\n var L = e.pstyle("text-max-width").pfValue, w = "", q = "…", S = !1;\n if (this.calculateLabelDimensions(e, o).width < L)\n return o;\n for (var B = 0; B < o.length; B++) {\n var I = this.calculateLabelDimensions(e, w + o[B] + q).width;\n if (I > L)\n break;\n w += o[B], B === o.length - 1 && (S = !0);\n }\n return S || (w += q), w;\n }\n return o;\n};\nen.getLabelJustification = function(e) {\n var t = e.pstyle("text-justification").strValue, r = e.pstyle("text-halign").strValue;\n if (t === "auto")\n if (e.isNode())\n switch (r) {\n case "left":\n return "right";\n case "right":\n return "left";\n default:\n return "center";\n }\n else\n return "center";\n else\n return t;\n};\nen.calculateLabelDimensions = function(e, t) {\n var r = this, n = fi(t, e._private.labelDimsKey), o = r.labelDimCache || (r.labelDimCache = []), i = o[n];\n if (i != null)\n return i;\n var a = 0, s = e.pstyle("font-style").strValue, l = e.pstyle("font-size").pfValue, c = e.pstyle("font-family").strValue, p = e.pstyle("font-weight").strValue, d = this.labelCalcCanvas, u = this.labelCalcCanvasContext;\n if (!d) {\n d = this.labelCalcCanvas = document.createElement("canvas"), u = this.labelCalcCanvasContext = d.getContext("2d");\n var h = d.style;\n h.position = "absolute", h.left = "-9999px", h.top = "-9999px", h.zIndex = "-1", h.visibility = "hidden", h.pointerEvents = "none";\n }\n u.font = "".concat(s, " ").concat(p, " ").concat(l, "px ").concat(c);\n for (var b = 0, M = 0, C = t.split(`\n`), g = 0; g < C.length; g++) {\n var f = C[g], O = u.measureText(f), m = Math.ceil(O.width), v = l;\n b = Math.max(m, b), M += v;\n }\n return b += a, M += a, o[n] = {\n width: b,\n height: M\n };\n};\nen.calculateLabelAngle = function(e, t) {\n var r = e._private, n = r.rscratch, o = e.isEdge(), i = t ? t + "-" : "", a = e.pstyle(i + "text-rotation"), s = a.strValue;\n return s === "none" ? 0 : o && s === "autorotate" ? n.labelAutoAngle : s === "autorotate" ? 0 : a.pfValue;\n};\nen.calculateLabelAngles = function(e) {\n var t = this, r = e.isEdge(), n = e._private, o = n.rscratch;\n o.labelAngle = t.calculateLabelAngle(e), r && (o.sourceLabelAngle = t.calculateLabelAngle(e, "source"), o.targetLabelAngle = t.calculateLabelAngle(e, "target"));\n};\nvar rm = {}, jh = 28, Kh = !1;\nrm.getNodeShape = function(e) {\n var t = this, r = e.pstyle("shape").value;\n if (r === "cutrectangle" && (e.width() < jh || e.height() < jh))\n return Kh || (je("The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead"), Kh = !0), "rectangle";\n if (e.isParent())\n return r === "rectangle" || r === "roundrectangle" || r === "round-rectangle" || r === "cutrectangle" || r === "cut-rectangle" || r === "barrel" ? r : "rectangle";\n if (r === "polygon") {\n var n = e.pstyle("shape-polygon-points").value;\n return t.nodeShapes.makePolygon(n).name;\n }\n return r;\n};\nvar Gc = {};\nGc.registerCalculationListeners = function() {\n var e = this.cy, t = e.collection(), r = this, n = function(a) {\n var s = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !0;\n if (t.merge(a), s)\n for (var l = 0; l < a.length; l++) {\n var c = a[l], p = c._private, d = p.rstyle;\n d.clean = !1, d.cleanConnected = !1;\n }\n };\n r.binder(e).on("bounds.* dirty.*", function(a) {\n var s = a.target;\n n(s);\n }).on("style.* background.*", function(a) {\n var s = a.target;\n n(s, !1);\n });\n var o = function(a) {\n if (a) {\n var s = r.onUpdateEleCalcsFns;\n t.cleanStyle();\n for (var l = 0; l < t.length; l++) {\n var c = t[l], p = c._private.rstyle;\n c.isNode() && !p.cleanConnected && (n(c.connectedEdges()), p.cleanConnected = !0);\n }\n if (s)\n for (var d = 0; d < s.length; d++) {\n var u = s[d];\n u(a, t);\n }\n r.recalculateRenderedStyle(t), t = e.collection();\n }\n };\n r.flushRenderedStyleQueue = function() {\n o(!0);\n }, r.beforeRender(o, r.beforeRenderPriorities.eleCalcs);\n};\nGc.onUpdateEleCalcs = function(e) {\n var t = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || [];\n t.push(e);\n};\nGc.recalculateRenderedStyle = function(e, t) {\n var r = function(m) {\n return m._private.rstyle.cleanConnected;\n }, n = [], o = [];\n if (!this.destroyed) {\n t === void 0 && (t = !0);\n for (var i = 0; i < e.length; i++) {\n var a = e[i], s = a._private, l = s.rstyle;\n a.isEdge() && (!r(a.source()) || !r(a.target())) && (l.clean = !1), !(t && l.clean || a.removed()) && a.pstyle("display").value !== "none" && (s.group === "nodes" ? o.push(a) : n.push(a), l.clean = !0);\n }\n for (var c = 0; c < o.length; c++) {\n var p = o[c], d = p._private, u = d.rstyle, h = p.position();\n this.recalculateNodeLabelProjection(p), u.nodeX = h.x, u.nodeY = h.y, u.nodeW = p.pstyle("width").pfValue, u.nodeH = p.pstyle("height").pfValue;\n }\n this.recalculateEdgeProjections(n);\n for (var b = 0; b < n.length; b++) {\n var M = n[b], C = M._private, g = C.rstyle, f = C.rscratch;\n g.srcX = f.arrowStartX, g.srcY = f.arrowStartY, g.tgtX = f.arrowEndX, g.tgtY = f.arrowEndY, g.midX = f.midX, g.midY = f.midY, g.labelAngle = f.labelAngle, g.sourceLabelAngle = f.sourceLabelAngle, g.targetLabelAngle = f.targetLabelAngle;\n }\n }\n};\nvar jc = {};\njc.updateCachedGrabbedEles = function() {\n var e = this.cachedZSortedEles;\n if (e) {\n e.drag = [], e.nondrag = [];\n for (var t = [], r = 0; r < e.length; r++) {\n var n = e[r], o = n._private.rscratch;\n n.grabbed() && !n.isParent() ? t.push(n) : o.inDragLayer ? e.drag.push(n) : e.nondrag.push(n);\n }\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n e.drag.push(n);\n }\n }\n};\njc.invalidateCachedZSortedEles = function() {\n this.cachedZSortedEles = null;\n};\njc.getCachedZSortedEles = function(e) {\n if (e || !this.cachedZSortedEles) {\n var t = this.cy.mutableElements().toArray();\n t.sort(FO), t.interactive = t.filter(function(r) {\n return r.interactive();\n }), this.cachedZSortedEles = t, this.updateCachedGrabbedEles();\n } else\n t = this.cachedZSortedEles;\n return t;\n};\nvar nm = {};\n[yi, ec, c2, Ms, ed, en, rm, Gc, jc].forEach(function(e) {\n K0(nm, e);\n});\nvar om = {};\nom.getCachedImage = function(e, t, r) {\n var n = this, o = n.imageCache = n.imageCache || {}, i = o[e];\n if (i)\n return i.image.complete || i.image.addEventListener("load", r), i.image;\n i = o[e] = o[e] || {};\n var a = i.image = new Image();\n a.addEventListener("load", r), a.addEventListener("error", function() {\n a.error = !0;\n });\n var s = "data:", l = e.substring(0, s.length).toLowerCase() === s;\n return l || (a.crossOrigin = t), a.src = e, a;\n};\nvar ja = {};\nja.registerBinding = function(e, t, r, n) {\n var o = Array.prototype.slice.apply(arguments, [1]), i = this.binder(e);\n return i.on.apply(i, o);\n};\nja.binder = function(e) {\n var t = this, r = e === window || e === document || e === document.body || V01(e);\n if (t.supportsPassiveEvents == null) {\n var n = !1;\n try {\n var o = Object.defineProperty({}, "passive", {\n get: function() {\n return n = !0, !0;\n }\n });\n window.addEventListener("test", null, o);\n } catch {\n }\n t.supportsPassiveEvents = n;\n }\n var i = function(s, l, c) {\n var p = Array.prototype.slice.call(arguments);\n return r && t.supportsPassiveEvents && (p[2] = {\n capture: c ?? !1,\n passive: !1,\n once: !1\n }), t.bindings.push({\n target: e,\n args: p\n }), (e.addEventListener || e.on).apply(e, p), this;\n };\n return {\n on: i,\n addEventListener: i,\n addListener: i,\n bind: i\n };\n};\nja.nodeIsDraggable = function(e) {\n return e && e.isNode() && !e.locked() && e.grabbable();\n};\nja.nodeIsGrabbable = function(e) {\n return this.nodeIsDraggable(e) && e.interactive();\n};\nja.load = function() {\n var e = this, t = function(U) {\n return U.selected();\n }, r = function(U, e1, o1, u1) {\n U == null && (U = e.cy);\n for (var M1 = 0; M1 < e1.length; M1++) {\n var A1 = e1[M1];\n U.emit({\n originalEvent: o1,\n type: A1,\n position: u1\n });\n }\n }, n = function(U) {\n return U.shiftKey || U.metaKey || U.ctrlKey;\n }, o = function(U, e1) {\n var o1 = !0;\n if (e.cy.hasCompoundNodes() && U && U.pannable())\n for (var u1 = 0; e1 && u1 < e1.length; u1++) {\n var U = e1[u1];\n if (U.isNode() && U.isParent() && !U.pannable()) {\n o1 = !1;\n break;\n }\n }\n else\n o1 = !0;\n return o1;\n }, i = function(U) {\n U[0]._private.grabbed = !0;\n }, a = function(U) {\n U[0]._private.grabbed = !1;\n }, s = function(U) {\n U[0]._private.rscratch.inDragLayer = !0;\n }, l = function(U) {\n U[0]._private.rscratch.inDragLayer = !1;\n }, c = function(U) {\n U[0]._private.rscratch.isGrabTarget = !0;\n }, p = function(U) {\n U[0]._private.rscratch.isGrabTarget = !1;\n }, d = function(U, e1) {\n var o1 = e1.addToList, u1 = o1.has(U);\n u1 || (o1.merge(U), i(U));\n }, u = function(U, e1) {\n if (U.cy().hasCompoundNodes() && !(e1.inDragLayer == null && e1.addToList == null)) {\n var o1 = U.descendants();\n e1.inDragLayer && (o1.forEach(s), o1.connectedEdges().forEach(s)), e1.addToList && e1.addToList.unmerge(o1);\n }\n }, h = function(U, e1) {\n e1 = e1 || {};\n var o1 = U.cy().hasCompoundNodes();\n e1.inDragLayer && (U.forEach(s), U.neighborhood().stdFilter(function(u1) {\n return !o1 || u1.isEdge();\n }).forEach(s)), e1.addToList && U.forEach(function(u1) {\n d(u1, e1);\n }), u(U, e1), C(U, {\n inDragLayer: e1.inDragLayer\n }), e.updateCachedGrabbedEles();\n }, b = h, M = function(U) {\n U && (e.getCachedZSortedEles().forEach(function(e1) {\n a(e1), l(e1), p(e1);\n }), e.updateCachedGrabbedEles());\n }, C = function(U, e1) {\n if (!(e1.inDragLayer == null && e1.addToList == null) && U.cy().hasCompoundNodes()) {\n var o1 = U.ancestors().orphans();\n if (!o1.same(U)) {\n var u1 = o1.descendants().spawnSelf().merge(o1).unmerge(U).unmerge(U.descendants()), M1 = u1.connectedEdges();\n e1.inDragLayer && (M1.forEach(s), u1.forEach(s)), e1.addToList && u1.forEach(function(A1) {\n d(A1, e1);\n });\n }\n }\n }, g = function() {\n document.activeElement != null && document.activeElement.blur != null && document.activeElement.blur();\n }, f = typeof MutationObserver < "u", O = typeof ResizeObserver < "u";\n f ? (e.removeObserver = new MutationObserver(function(n1) {\n for (var U = 0; U < n1.length; U++) {\n var e1 = n1[U], o1 = e1.removedNodes;\n if (o1)\n for (var u1 = 0; u1 < o1.length; u1++) {\n var M1 = o1[u1];\n if (M1 === e.container) {\n e.destroy();\n break;\n }\n }\n }\n }), e.container.parentNode && e.removeObserver.observe(e.container.parentNode, {\n childList: !0\n })) : e.registerBinding(e.container, "DOMNodeRemoved", function(n1) {\n e.destroy();\n });\n var m = Nc(function() {\n e.cy.resize();\n }, 100);\n f && (e.styleObserver = new MutationObserver(m), e.styleObserver.observe(e.container, {\n attributes: !0\n })), e.registerBinding(window, "resize", m), O && (e.resizeObserver = new ResizeObserver(m), e.resizeObserver.observe(e.container));\n var v = function(U, e1) {\n for (; U != null; )\n e1(U), U = U.parentNode;\n }, y = function() {\n e.invalidateContainerClientCoordsCache();\n };\n v(e.container, function(n1) {\n e.registerBinding(n1, "transitionend", y), e.registerBinding(n1, "animationend", y), e.registerBinding(n1, "scroll", y);\n }), e.registerBinding(e.container, "contextmenu", function(n1) {\n n1.preventDefault();\n });\n var z = function() {\n return e.selection[4] !== 0;\n }, N = function(U) {\n for (var e1 = e.findContainerClientCoords(), o1 = e1[0], u1 = e1[1], M1 = e1[2], A1 = e1[3], l1 = U.touches ? U.touches : [U], b1 = !1, h1 = 0; h1 < l1.length; h1++) {\n var z1 = l1[h1];\n if (o1 <= z1.clientX && z1.clientX <= o1 + M1 && u1 <= z1.clientY && z1.clientY <= u1 + A1) {\n b1 = !0;\n break;\n }\n }\n if (!b1)\n return !1;\n for (var O1 = e.container, m1 = U.target, L1 = m1.parentNode, y1 = !1; L1; ) {\n if (L1 === O1) {\n y1 = !0;\n break;\n }\n L1 = L1.parentNode;\n }\n return !!y1;\n };\n e.registerBinding(e.container, "mousedown", function(U) {\n if (N(U)) {\n U.preventDefault(), g(), e.hoverData.capture = !0, e.hoverData.which = U.which;\n var e1 = e.cy, o1 = [U.clientX, U.clientY], u1 = e.projectIntoViewport(o1[0], o1[1]), M1 = e.selection, A1 = e.findNearestElements(u1[0], u1[1], !0, !1), l1 = A1[0], b1 = e.dragData.possibleDragElements;\n e.hoverData.mdownPos = u1, e.hoverData.mdownGPos = o1;\n var h1 = function() {\n e.hoverData.tapholdCancelled = !1, clearTimeout(e.hoverData.tapholdTimeout), e.hoverData.tapholdTimeout = setTimeout(function() {\n if (!e.hoverData.tapholdCancelled) {\n var B1 = e.hoverData.down;\n B1 ? B1.emit({\n originalEvent: U,\n type: "taphold",\n position: {\n x: u1[0],\n y: u1[1]\n }\n }) : e1.emit({\n originalEvent: U,\n type: "taphold",\n position: {\n x: u1[0],\n y: u1[1]\n }\n });\n }\n }, e.tapholdDuration);\n };\n if (U.which == 3) {\n e.hoverData.cxtStarted = !0;\n var z1 = {\n originalEvent: U,\n type: "cxttapstart",\n position: {\n x: u1[0],\n y: u1[1]\n }\n };\n l1 ? (l1.activate(), l1.emit(z1), e.hoverData.down = l1) : e1.emit(z1), e.hoverData.downTime = (/* @__PURE__ */ new Date()).getTime(), e.hoverData.cxtDragged = !1;\n } else if (U.which == 1) {\n l1 && l1.activate();\n {\n if (l1 != null && e.nodeIsGrabbable(l1)) {\n var O1 = function(B1) {\n return {\n originalEvent: U,\n type: B1,\n position: {\n x: u1[0],\n y: u1[1]\n }\n };\n }, m1 = function(B1) {\n B1.emit(O1("grab"));\n };\n if (c(l1), !l1.selected())\n b1 = e.dragData.possibleDragElements = e1.collection(), b(l1, {\n addToList: b1\n }), l1.emit(O1("grabon")).emit(O1("grab"));\n else {\n b1 = e.dragData.possibleDragElements = e1.collection();\n var L1 = e1.$(function(y1) {\n return y1.isNode() && y1.selected() && e.nodeIsGrabbable(y1);\n });\n h(L1, {\n addToList: b1\n }), l1.emit(O1("grabon")), L1.forEach(m1);\n }\n e.redrawHint("eles", !0), e.redrawHint("drag", !0);\n }\n e.hoverData.down = l1, e.hoverData.downs = A1, e.hoverData.downTime = (/* @__PURE__ */ new Date()).getTime();\n }\n r(l1, ["mousedown", "tapstart", "vmousedown"], U, {\n x: u1[0],\n y: u1[1]\n }), l1 == null ? (M1[4] = 1, e.data.bgActivePosistion = {\n x: u1[0],\n y: u1[1]\n }, e.redrawHint("select", !0), e.redraw()) : l1.pannable() && (M1[4] = 1), h1();\n }\n M1[0] = M1[2] = u1[0], M1[1] = M1[3] = u1[1];\n }\n }, !1), e.registerBinding(window, "mousemove", function(U) {\n var e1 = e.hoverData.capture;\n if (!(!e1 && !N(U))) {\n var o1 = !1, u1 = e.cy, M1 = u1.zoom(), A1 = [U.clientX, U.clientY], l1 = e.projectIntoViewport(A1[0], A1[1]), b1 = e.hoverData.mdownPos, h1 = e.hoverData.mdownGPos, z1 = e.selection, O1 = null;\n !e.hoverData.draggingEles && !e.hoverData.dragging && !e.hoverData.selecting && (O1 = e.findNearestElement(l1[0], l1[1], !0, !1));\n var m1 = e.hoverData.last, L1 = e.hoverData.down, y1 = [l1[0] - z1[2], l1[1] - z1[3]], B1 = e.dragData.possibleDragElements, T1;\n if (h1) {\n var F1 = A1[0] - h1[0], X1 = F1 * F1, G1 = A1[1] - h1[1], Q1 = G1 * G1, K1 = X1 + Q1;\n e.hoverData.isOverThresholdDrag = T1 = K1 >= e.desktopTapThreshold2;\n }\n var n0 = n(U);\n T1 && (e.hoverData.tapholdCancelled = !0);\n var u0 = function() {\n var j1 = e.hoverData.dragDelta = e.hoverData.dragDelta || [];\n j1.length === 0 ? (j1.push(y1[0]), j1.push(y1[1])) : (j1[0] += y1[0], j1[1] += y1[1]);\n };\n o1 = !0, r(O1, ["mousemove", "vmousemove", "tapdrag"], U, {\n x: l1[0],\n y: l1[1]\n });\n var c0 = function() {\n e.data.bgActivePosistion = void 0, e.hoverData.selecting || u1.emit({\n originalEvent: U,\n type: "boxstart",\n position: {\n x: l1[0],\n y: l1[1]\n }\n }), z1[4] = 1, e.hoverData.selecting = !0, e.redrawHint("select", !0), e.redraw();\n };\n if (e.hoverData.which === 3) {\n if (T1) {\n var C0 = {\n originalEvent: U,\n type: "cxtdrag",\n position: {\n x: l1[0],\n y: l1[1]\n }\n };\n L1 ? L1.emit(C0) : u1.emit(C0), e.hoverData.cxtDragged = !0, (!e.hoverData.cxtOver || O1 !== e.hoverData.cxtOver) && (e.hoverData.cxtOver && e.hoverData.cxtOver.emit({\n originalEvent: U,\n type: "cxtdragout",\n position: {\n x: l1[0],\n y: l1[1]\n }\n }), e.hoverData.cxtOver = O1, O1 && O1.emit({\n originalEvent: U,\n type: "cxtdragover",\n position: {\n x: l1[0],\n y: l1[1]\n }\n }));\n }\n } else if (e.hoverData.dragging) {\n if (o1 = !0, u1.panningEnabled() && u1.userPanningEnabled()) {\n var y0;\n if (e.hoverData.justStartedPan) {\n var q1 = e.hoverData.mdownPos;\n y0 = {\n x: (l1[0] - q1[0]) * M1,\n y: (l1[1] - q1[1]) * M1\n }, e.hoverData.justStartedPan = !1;\n } else\n y0 = {\n x: y1[0] * M1,\n y: y1[1] * M1\n };\n u1.panBy(y0), e.hoverData.dragged = !0;\n }\n l1 = e.projectIntoViewport(U.clientX, U.clientY);\n } else if (z1[4] == 1 && (L1 == null || L1.pannable())) {\n if (T1) {\n if (!e.hoverData.dragging && u1.boxSelectionEnabled() && (n0 || !u1.panningEnabled() || !u1.userPanningEnabled()))\n c0();\n else if (!e.hoverData.selecting && u1.panningEnabled() && u1.userPanningEnabled()) {\n var v1 = o(L1, e.hoverData.downs);\n v1 && (e.hoverData.dragging = !0, e.hoverData.justStartedPan = !0, z1[4] = 0, e.data.bgActivePosistion = oa(b1), e.redrawHint("select", !0), e.redraw());\n }\n L1 && L1.pannable() && L1.active() && L1.unactivate();\n }\n } else {\n if (L1 && L1.pannable() && L1.active() && L1.unactivate(), (!L1 || !L1.grabbed()) && O1 != m1 && (m1 && r(m1, ["mouseout", "tapdragout"], U, {\n x: l1[0],\n y: l1[1]\n }), O1 && r(O1, ["mouseover", "tapdragover"], U, {\n x: l1[0],\n y: l1[1]\n }), e.hoverData.last = O1), L1)\n if (T1) {\n if (u1.boxSelectionEnabled() && n0)\n L1 && L1.grabbed() && (M(B1), L1.emit("freeon"), B1.emit("free"), e.dragData.didDrag && (L1.emit("dragfreeon"), B1.emit("dragfree"))), c0();\n else if (L1 && L1.grabbed() && e.nodeIsDraggable(L1)) {\n var k1 = !e.dragData.didDrag;\n k1 && e.redrawHint("eles", !0), e.dragData.didDrag = !0;\n var S1 = u1.collection();\n e.hoverData.draggingEles || h(B1, {\n inDragLayer: !0\n });\n var i0 = {\n x: 0,\n y: 0\n };\n if (O0(y1[0]) && O0(y1[1]) && (i0.x += y1[0], i0.y += y1[1], k1)) {\n var m0 = e.hoverData.dragDelta;\n m0 && O0(m0[0]) && O0(m0[1]) && (i0.x += m0[0], i0.y += m0[1]);\n }\n for (var l0 = 0; l0 < B1.length; l0++) {\n var _1 = B1[l0];\n e.nodeIsDraggable(_1) && _1.grabbed() && S1.push(_1);\n }\n e.hoverData.draggingEles = !0, S1.silentShift(i0).emit("position drag"), e.redrawHint("drag", !0), e.redraw();\n }\n } else\n u0();\n o1 = !0;\n }\n if (z1[2] = l1[0], z1[3] = l1[1], o1)\n return U.stopPropagation && U.stopPropagation(), U.preventDefault && U.preventDefault(), !1;\n }\n }, !1), e.registerBinding(window, "mouseup", function(U) {\n var e1 = e.hoverData.capture;\n if (e1) {\n e.hoverData.capture = !1;\n var o1 = e.cy, u1 = e.projectIntoViewport(U.clientX, U.clientY), M1 = e.selection, A1 = e.findNearestElement(u1[0], u1[1], !0, !1), l1 = e.dragData.possibleDragElements, b1 = e.hoverData.down, h1 = n(U);\n if (e.data.bgActivePosistion && (e.redrawHint("select", !0), e.redraw()), e.hoverData.tapholdCancelled = !0, e.data.bgActivePosistion = void 0, b1 && b1.unactivate(), e.hoverData.which === 3) {\n var z1 = {\n originalEvent: U,\n type: "cxttapend",\n position: {\n x: u1[0],\n y: u1[1]\n }\n };\n if (b1 ? b1.emit(z1) : o1.emit(z1), !e.hoverData.cxtDragged) {\n var O1 = {\n originalEvent: U,\n type: "cxttap",\n position: {\n x: u1[0],\n y: u1[1]\n }\n };\n b1 ? b1.emit(O1) : o1.emit(O1);\n }\n e.hoverData.cxtDragged = !1, e.hoverData.which = null;\n } else if (e.hoverData.which === 1) {\n if (r(A1, ["mouseup", "tapend", "vmouseup"], U, {\n x: u1[0],\n y: u1[1]\n }), !e.dragData.didDrag && !e.hoverData.dragged && !e.hoverData.selecting && !e.hoverData.isOverThresholdDrag && r(b1, ["click", "tap", "vclick"], U, {\n x: u1[0],\n y: u1[1]\n }), b1 == null && // not mousedown on node\n !e.dragData.didDrag && !e.hoverData.selecting && !e.hoverData.dragged && !n(U) && (o1.$(t).unselect(["tapunselect"]), l1.length > 0 && e.redrawHint("eles", !0), e.dragData.possibleDragElements = l1 = o1.collection()), A1 == b1 && !e.dragData.didDrag && !e.hoverData.selecting && A1 != null && A1._private.selectable && (e.hoverData.dragging || (o1.selectionType() === "additive" || h1 ? A1.selected() ? A1.unselect(["tapunselect"]) : A1.select(["tapselect"]) : h1 || (o1.$(t).unmerge(A1).unselect(["tapunselect"]), A1.select(["tapselect"]))), e.redrawHint("eles", !0)), e.hoverData.selecting) {\n var m1 = o1.collection(e.getAllInBox(M1[0], M1[1], M1[2], M1[3]));\n e.redrawHint("select", !0), m1.length > 0 && e.redrawHint("eles", !0), o1.emit({\n type: "boxend",\n originalEvent: U,\n position: {\n x: u1[0],\n y: u1[1]\n }\n });\n var L1 = function(T1) {\n return T1.selectable() && !T1.selected();\n };\n o1.selectionType() === "additive" || h1 || o1.$(t).unmerge(m1).unselect(), m1.emit("box").stdFilter(L1).select().emit("boxselect"), e.redraw();\n }\n if (e.hoverData.dragging && (e.hoverData.dragging = !1, e.redrawHint("select", !0), e.redrawHint("eles", !0), e.redraw()), !M1[4]) {\n e.redrawHint("drag", !0), e.redrawHint("eles", !0);\n var y1 = b1 && b1.grabbed();\n M(l1), y1 && (b1.emit("freeon"), l1.emit("free"), e.dragData.didDrag && (b1.emit("dragfreeon"), l1.emit("dragfree")));\n }\n }\n M1[4] = 0, e.hoverData.down = null, e.hoverData.cxtStarted = !1, e.hoverData.draggingEles = !1, e.hoverData.selecting = !1, e.hoverData.isOverThresholdDrag = !1, e.dragData.didDrag = !1, e.hoverData.dragged = !1, e.hoverData.dragDelta = [], e.hoverData.mdownPos = null, e.hoverData.mdownGPos = null;\n }\n }, !1);\n var W = function(U) {\n if (!e.scrollingPage) {\n var e1 = e.cy, o1 = e1.zoom(), u1 = e1.pan(), M1 = e.projectIntoViewport(U.clientX, U.clientY), A1 = [M1[0] * o1 + u1.x, M1[1] * o1 + u1.y];\n if (e.hoverData.draggingEles || e.hoverData.dragging || e.hoverData.cxtStarted || z()) {\n U.preventDefault();\n return;\n }\n if (e1.panningEnabled() && e1.userPanningEnabled() && e1.zoomingEnabled() && e1.userZoomingEnabled()) {\n U.preventDefault(), e.data.wheelZooming = !0, clearTimeout(e.data.wheelTimeout), e.data.wheelTimeout = setTimeout(function() {\n e.data.wheelZooming = !1, e.redrawHint("eles", !0), e.redraw();\n }, 150);\n var l1;\n U.deltaY != null ? l1 = U.deltaY / -250 : U.wheelDeltaY != null ? l1 = U.wheelDeltaY / 1e3 : l1 = U.wheelDelta / 1e3, l1 = l1 * e.wheelSensitivity;\n var b1 = U.deltaMode === 1;\n b1 && (l1 *= 33);\n var h1 = e1.zoom() * Math.pow(10, l1);\n U.type === "gesturechange" && (h1 = e.gestureStartZoom * U.scale), e1.zoom({\n level: h1,\n renderedPosition: {\n x: A1[0],\n y: A1[1]\n }\n });\n }\n }\n };\n e.registerBinding(e.container, "wheel", W, !0), e.registerBinding(window, "scroll", function(U) {\n e.scrollingPage = !0, clearTimeout(e.scrollingPageTimeout), e.scrollingPageTimeout = setTimeout(function() {\n e.scrollingPage = !1;\n }, 250);\n }, !0), e.registerBinding(e.container, "gesturestart", function(U) {\n e.gestureStartZoom = e.cy.zoom(), e.hasTouchStarted || U.preventDefault();\n }, !0), e.registerBinding(e.container, "gesturechange", function(n1) {\n e.hasTouchStarted || W(n1);\n }, !0), e.registerBinding(e.container, "mouseout", function(U) {\n var e1 = e.projectIntoViewport(U.clientX, U.clientY);\n e.cy.emit({\n originalEvent: U,\n type: "mouseout",\n position: {\n x: e1[0],\n y: e1[1]\n }\n });\n }, !1), e.registerBinding(e.container, "mouseover", function(U) {\n var e1 = e.projectIntoViewport(U.clientX, U.clientY);\n e.cy.emit({\n originalEvent: U,\n type: "mouseover",\n position: {\n x: e1[0],\n y: e1[1]\n }\n });\n }, !1);\n var T, x, E, L, w, q, S, B, I, P, k, K, $, j = function(U, e1, o1, u1) {\n return Math.sqrt((o1 - U) * (o1 - U) + (u1 - e1) * (u1 - e1));\n }, r1 = function(U, e1, o1, u1) {\n return (o1 - U) * (o1 - U) + (u1 - e1) * (u1 - e1);\n }, a1;\n e.registerBinding(e.container, "touchstart", a1 = function(U) {\n if (e.hasTouchStarted = !0, !!N(U)) {\n g(), e.touchData.capture = !0, e.data.bgActivePosistion = void 0;\n var e1 = e.cy, o1 = e.touchData.now, u1 = e.touchData.earlier;\n if (U.touches[0]) {\n var M1 = e.projectIntoViewport(U.touches[0].clientX, U.touches[0].clientY);\n o1[0] = M1[0], o1[1] = M1[1];\n }\n if (U.touches[1]) {\n var M1 = e.projectIntoViewport(U.touches[1].clientX, U.touches[1].clientY);\n o1[2] = M1[0], o1[3] = M1[1];\n }\n if (U.touches[2]) {\n var M1 = e.projectIntoViewport(U.touches[2].clientX, U.touches[2].clientY);\n o1[4] = M1[0], o1[5] = M1[1];\n }\n if (U.touches[1]) {\n e.touchData.singleTouchMoved = !0, M(e.dragData.touchDragEles);\n var A1 = e.findContainerClientCoords();\n I = A1[0], P = A1[1], k = A1[2], K = A1[3], T = U.touches[0].clientX - I, x = U.touches[0].clientY - P, E = U.touches[1].clientX - I, L = U.touches[1].clientY - P, $ = 0 <= T && T <= k && 0 <= E && E <= k && 0 <= x && x <= K && 0 <= L && L <= K;\n var l1 = e1.pan(), b1 = e1.zoom();\n w = j(T, x, E, L), q = r1(T, x, E, L), S = [(T + E) / 2, (x + L) / 2], B = [(S[0] - l1.x) / b1, (S[1] - l1.y) / b1];\n var h1 = 200, z1 = h1 * h1;\n if (q < z1 && !U.touches[2]) {\n var O1 = e.findNearestElement(o1[0], o1[1], !0, !0), m1 = e.findNearestElement(o1[2], o1[3], !0, !0);\n O1 && O1.isNode() ? (O1.activate().emit({\n originalEvent: U,\n type: "cxttapstart",\n position: {\n x: o1[0],\n y: o1[1]\n }\n }), e.touchData.start = O1) : m1 && m1.isNode() ? (m1.activate().emit({\n originalEvent: U,\n type: "cxttapstart",\n position: {\n x: o1[0],\n y: o1[1]\n }\n }), e.touchData.start = m1) : e1.emit({\n originalEvent: U,\n type: "cxttapstart",\n position: {\n x: o1[0],\n y: o1[1]\n }\n }), e.touchData.start && (e.touchData.start._private.grabbed = !1), e.touchData.cxt = !0, e.touchData.cxtDragged = !1, e.data.bgActivePosistion = void 0, e.redraw();\n return;\n }\n }\n if (U.touches[2])\n e1.boxSelectionEnabled() && U.preventDefault();\n else if (!U.touches[1]) {\n if (U.touches[0]) {\n var L1 = e.findNearestElements(o1[0], o1[1], !0, !0), y1 = L1[0];\n if (y1 != null && (y1.activate(), e.touchData.start = y1, e.touchData.starts = L1, e.nodeIsGrabbable(y1))) {\n var B1 = e.dragData.touchDragEles = e1.collection(), T1 = null;\n e.redrawHint("eles", !0), e.redrawHint("drag", !0), y1.selected() ? (T1 = e1.$(function(K1) {\n return K1.selected() && e.nodeIsGrabbable(K1);\n }), h(T1, {\n addToList: B1\n })) : b(y1, {\n addToList: B1\n }), c(y1);\n var F1 = function(n0) {\n return {\n originalEvent: U,\n type: n0,\n position: {\n x: o1[0],\n y: o1[1]\n }\n };\n };\n y1.emit(F1("grabon")), T1 ? T1.forEach(function(K1) {\n K1.emit(F1("grab"));\n }) : y1.emit(F1("grab"));\n }\n r(y1, ["touchstart", "tapstart", "vmousedown"], U, {\n x: o1[0],\n y: o1[1]\n }), y1 == null && (e.data.bgActivePosistion = {\n x: M1[0],\n y: M1[1]\n }, e.redrawHint("select", !0), e.redraw()), e.touchData.singleTouchMoved = !1, e.touchData.singleTouchStartTime = +/* @__PURE__ */ new Date(), clearTimeout(e.touchData.tapholdTimeout), e.touchData.tapholdTimeout = setTimeout(function() {\n e.touchData.singleTouchMoved === !1 && !e.pinching && !e.touchData.selecting && r(e.touchData.start, ["taphold"], U, {\n x: o1[0],\n y: o1[1]\n });\n }, e.tapholdDuration);\n }\n }\n if (U.touches.length >= 1) {\n for (var X1 = e.touchData.startPosition = [], G1 = 0; G1 < o1.length; G1++)\n X1[G1] = u1[G1] = o1[G1];\n var Q1 = U.touches[0];\n e.touchData.startGPosition = [Q1.clientX, Q1.clientY];\n }\n }\n }, !1);\n var _;\n e.registerBinding(window, "touchmove", _ = function(U) {\n var e1 = e.touchData.capture;\n if (!(!e1 && !N(U))) {\n var o1 = e.selection, u1 = e.cy, M1 = e.touchData.now, A1 = e.touchData.earlier, l1 = u1.zoom();\n if (U.touches[0]) {\n var b1 = e.projectIntoViewport(U.touches[0].clientX, U.touches[0].clientY);\n M1[0] = b1[0], M1[1] = b1[1];\n }\n if (U.touches[1]) {\n var b1 = e.projectIntoViewport(U.touches[1].clientX, U.touches[1].clientY);\n M1[2] = b1[0], M1[3] = b1[1];\n }\n if (U.touches[2]) {\n var b1 = e.projectIntoViewport(U.touches[2].clientX, U.touches[2].clientY);\n M1[4] = b1[0], M1[5] = b1[1];\n }\n var h1 = e.touchData.startGPosition, z1;\n if (e1 && U.touches[0] && h1) {\n for (var O1 = [], m1 = 0; m1 < M1.length; m1++)\n O1[m1] = M1[m1] - A1[m1];\n var L1 = U.touches[0].clientX - h1[0], y1 = L1 * L1, B1 = U.touches[0].clientY - h1[1], T1 = B1 * B1, F1 = y1 + T1;\n z1 = F1 >= e.touchTapThreshold2;\n }\n if (e1 && e.touchData.cxt) {\n U.preventDefault();\n var X1 = U.touches[0].clientX - I, G1 = U.touches[0].clientY - P, Q1 = U.touches[1].clientX - I, K1 = U.touches[1].clientY - P, n0 = r1(X1, G1, Q1, K1), u0 = n0 / q, c0 = 150, C0 = c0 * c0, y0 = 1.5, q1 = y0 * y0;\n if (u0 >= q1 || n0 >= C0) {\n e.touchData.cxt = !1, e.data.bgActivePosistion = void 0, e.redrawHint("select", !0);\n var v1 = {\n originalEvent: U,\n type: "cxttapend",\n position: {\n x: M1[0],\n y: M1[1]\n }\n };\n e.touchData.start ? (e.touchData.start.unactivate().emit(v1), e.touchData.start = null) : u1.emit(v1);\n }\n }\n if (e1 && e.touchData.cxt) {\n var v1 = {\n originalEvent: U,\n type: "cxtdrag",\n position: {\n x: M1[0],\n y: M1[1]\n }\n };\n e.data.bgActivePosistion = void 0, e.redrawHint("select", !0), e.touchData.start ? e.touchData.start.emit(v1) : u1.emit(v1), e.touchData.start && (e.touchData.start._private.grabbed = !1), e.touchData.cxtDragged = !0;\n var k1 = e.findNearestElement(M1[0], M1[1], !0, !0);\n (!e.touchData.cxtOver || k1 !== e.touchData.cxtOver) && (e.touchData.cxtOver && e.touchData.cxtOver.emit({\n originalEvent: U,\n type: "cxtdragout",\n position: {\n x: M1[0],\n y: M1[1]\n }\n }), e.touchData.cxtOver = k1, k1 && k1.emit({\n originalEvent: U,\n type: "cxtdragover",\n position: {\n x: M1[0],\n y: M1[1]\n }\n }));\n } else if (e1 && U.touches[2] && u1.boxSelectionEnabled())\n U.preventDefault(), e.data.bgActivePosistion = void 0, this.lastThreeTouch = +/* @__PURE__ */ new Date(), e.touchData.selecting || u1.emit({\n originalEvent: U,\n type: "boxstart",\n position: {\n x: M1[0],\n y: M1[1]\n }\n }), e.touchData.selecting = !0, e.touchData.didSelect = !0, o1[4] = 1, !o1 || o1.length === 0 || o1[0] === void 0 ? (o1[0] = (M1[0] + M1[2] + M1[4]) / 3, o1[1] = (M1[1] + M1[3] + M1[5]) / 3, o1[2] = (M1[0] + M1[2] + M1[4]) / 3 + 1, o1[3] = (M1[1] + M1[3] + M1[5]) / 3 + 1) : (o1[2] = (M1[0] + M1[2] + M1[4]) / 3, o1[3] = (M1[1] + M1[3] + M1[5]) / 3), e.redrawHint("select", !0), e.redraw();\n else if (e1 && U.touches[1] && !e.touchData.didSelect && u1.zoomingEnabled() && u1.panningEnabled() && u1.userZoomingEnabled() && u1.userPanningEnabled()) {\n U.preventDefault(), e.data.bgActivePosistion = void 0, e.redrawHint("select", !0);\n var S1 = e.dragData.touchDragEles;\n if (S1) {\n e.redrawHint("drag", !0);\n for (var i0 = 0; i0 < S1.length; i0++) {\n var m0 = S1[i0]._private;\n m0.grabbed = !1, m0.rscratch.inDragLayer = !1;\n }\n }\n var l0 = e.touchData.start, X1 = U.touches[0].clientX - I, G1 = U.touches[0].clientY - P, Q1 = U.touches[1].clientX - I, K1 = U.touches[1].clientY - P, _1 = j(X1, G1, Q1, K1), H1 = _1 / w;\n if ($) {\n var j1 = X1 - T, s0 = G1 - x, M0 = Q1 - E, I0 = K1 - L, re = (j1 + M0) / 2, R1 = (s0 + I0) / 2, r0 = u1.zoom(), d0 = r0 * H1, q0 = u1.pan(), D0 = B[0] * r0 + q0.x, G0 = B[1] * r0 + q0.y, V0 = {\n x: -d0 / r0 * (D0 - q0.x - re) + D0,\n y: -d0 / r0 * (G0 - q0.y - R1) + G0\n };\n if (l0 && l0.active()) {\n var S1 = e.dragData.touchDragEles;\n M(S1), e.redrawHint("drag", !0), e.redrawHint("eles", !0), l0.unactivate().emit("freeon"), S1.emit("free"), e.dragData.didDrag && (l0.emit("dragfreeon"), S1.emit("dragfree"));\n }\n u1.viewport({\n zoom: d0,\n pan: V0,\n cancelOnFailedZoom: !0\n }), w = _1, T = X1, x = G1, E = Q1, L = K1, e.pinching = !0;\n }\n if (U.touches[0]) {\n var b1 = e.projectIntoViewport(U.touches[0].clientX, U.touches[0].clientY);\n M1[0] = b1[0], M1[1] = b1[1];\n }\n if (U.touches[1]) {\n var b1 = e.projectIntoViewport(U.touches[1].clientX, U.touches[1].clientY);\n M1[2] = b1[0], M1[3] = b1[1];\n }\n if (U.touches[2]) {\n var b1 = e.projectIntoViewport(U.touches[2].clientX, U.touches[2].clientY);\n M1[4] = b1[0], M1[5] = b1[1];\n }\n } else if (U.touches[0] && !e.touchData.didSelect) {\n var W0 = e.touchData.start, ae = e.touchData.last, k1;\n if (!e.hoverData.draggingEles && !e.swipePanning && (k1 = e.findNearestElement(M1[0], M1[1], !0, !0)), e1 && W0 != null && U.preventDefault(), e1 && W0 != null && e.nodeIsDraggable(W0))\n if (z1) {\n var S1 = e.dragData.touchDragEles, ee = !e.dragData.didDrag;\n ee && h(S1, {\n inDragLayer: !0\n }), e.dragData.didDrag = !0;\n var se = {\n x: 0,\n y: 0\n };\n if (O0(O1[0]) && O0(O1[1]) && (se.x += O1[0], se.y += O1[1], ee)) {\n e.redrawHint("eles", !0);\n var Me = e.touchData.dragDelta;\n Me && O0(Me[0]) && O0(Me[1]) && (se.x += Me[0], se.y += Me[1]);\n }\n e.hoverData.draggingEles = !0, S1.silentShift(se).emit("position drag"), e.redrawHint("drag", !0), e.touchData.startPosition[0] == A1[0] && e.touchData.startPosition[1] == A1[1] && e.redrawHint("eles", !0), e.redraw();\n } else {\n var Me = e.touchData.dragDelta = e.touchData.dragDelta || [];\n Me.length === 0 ? (Me.push(O1[0]), Me.push(O1[1])) : (Me[0] += O1[0], Me[1] += O1[1]);\n }\n if (r(W0 || k1, ["touchmove", "tapdrag", "vmousemove"], U, {\n x: M1[0],\n y: M1[1]\n }), (!W0 || !W0.grabbed()) && k1 != ae && (ae && ae.emit({\n originalEvent: U,\n type: "tapdragout",\n position: {\n x: M1[0],\n y: M1[1]\n }\n }), k1 && k1.emit({\n originalEvent: U,\n type: "tapdragover",\n position: {\n x: M1[0],\n y: M1[1]\n }\n })), e.touchData.last = k1, e1)\n for (var i0 = 0; i0 < M1.length; i0++)\n M1[i0] && e.touchData.startPosition[i0] && z1 && (e.touchData.singleTouchMoved = !0);\n if (e1 && (W0 == null || W0.pannable()) && u1.panningEnabled() && u1.userPanningEnabled()) {\n var At = o(W0, e.touchData.starts);\n At && (U.preventDefault(), e.data.bgActivePosistion || (e.data.bgActivePosistion = oa(e.touchData.startPosition)), e.swipePanning ? u1.panBy({\n x: O1[0] * l1,\n y: O1[1] * l1\n }) : z1 && (e.swipePanning = !0, u1.panBy({\n x: L1 * l1,\n y: B1 * l1\n }), W0 && (W0.unactivate(), e.redrawHint("select", !0), e.touchData.start = null)));\n var b1 = e.projectIntoViewport(U.touches[0].clientX, U.touches[0].clientY);\n M1[0] = b1[0], M1[1] = b1[1];\n }\n }\n for (var m1 = 0; m1 < M1.length; m1++)\n A1[m1] = M1[m1];\n e1 && U.touches.length > 0 && !e.hoverData.draggingEles && !e.swipePanning && e.data.bgActivePosistion != null && (e.data.bgActivePosistion = void 0, e.redrawHint("select", !0), e.redraw());\n }\n }, !1);\n var Y;\n e.registerBinding(window, "touchcancel", Y = function(U) {\n var e1 = e.touchData.start;\n e.touchData.capture = !1, e1 && e1.unactivate();\n });\n var D;\n if (e.registerBinding(window, "touchend", D = function(U) {\n var e1 = e.touchData.start, o1 = e.touchData.capture;\n if (o1)\n U.touches.length === 0 && (e.touchData.capture = !1), U.preventDefault();\n else\n return;\n var u1 = e.selection;\n e.swipePanning = !1, e.hoverData.draggingEles = !1;\n var M1 = e.cy, A1 = M1.zoom(), l1 = e.touchData.now, b1 = e.touchData.earlier;\n if (U.touches[0]) {\n var h1 = e.projectIntoViewport(U.touches[0].clientX, U.touches[0].clientY);\n l1[0] = h1[0], l1[1] = h1[1];\n }\n if (U.touches[1]) {\n var h1 = e.projectIntoViewport(U.touches[1].clientX, U.touches[1].clientY);\n l1[2] = h1[0], l1[3] = h1[1];\n }\n if (U.touches[2]) {\n var h1 = e.projectIntoViewport(U.touches[2].clientX, U.touches[2].clientY);\n l1[4] = h1[0], l1[5] = h1[1];\n }\n e1 && e1.unactivate();\n var z1;\n if (e.touchData.cxt) {\n if (z1 = {\n originalEvent: U,\n type: "cxttapend",\n position: {\n x: l1[0],\n y: l1[1]\n }\n }, e1 ? e1.emit(z1) : M1.emit(z1), !e.touchData.cxtDragged) {\n var O1 = {\n originalEvent: U,\n type: "cxttap",\n position: {\n x: l1[0],\n y: l1[1]\n }\n };\n e1 ? e1.emit(O1) : M1.emit(O1);\n }\n e.touchData.start && (e.touchData.start._private.grabbed = !1), e.touchData.cxt = !1, e.touchData.start = null, e.redraw();\n return;\n }\n if (!U.touches[2] && M1.boxSelectionEnabled() && e.touchData.selecting) {\n e.touchData.selecting = !1;\n var m1 = M1.collection(e.getAllInBox(u1[0], u1[1], u1[2], u1[3]));\n u1[0] = void 0, u1[1] = void 0, u1[2] = void 0, u1[3] = void 0, u1[4] = 0, e.redrawHint("select", !0), M1.emit({\n type: "boxend",\n originalEvent: U,\n position: {\n x: l1[0],\n y: l1[1]\n }\n });\n var L1 = function(C0) {\n return C0.selectable() && !C0.selected();\n };\n m1.emit("box").stdFilter(L1).select().emit("boxselect"), m1.nonempty() && e.redrawHint("eles", !0), e.redraw();\n }\n if (e1 != null && e1.unactivate(), U.touches[2])\n e.data.bgActivePosistion = void 0, e.redrawHint("select", !0);\n else if (!U.touches[1]) {\n if (!U.touches[0]) {\n if (!U.touches[0]) {\n e.data.bgActivePosistion = void 0, e.redrawHint("select", !0);\n var y1 = e.dragData.touchDragEles;\n if (e1 != null) {\n var B1 = e1._private.grabbed;\n M(y1), e.redrawHint("drag", !0), e.redrawHint("eles", !0), B1 && (e1.emit("freeon"), y1.emit("free"), e.dragData.didDrag && (e1.emit("dragfreeon"), y1.emit("dragfree"))), r(e1, ["touchend", "tapend", "vmouseup", "tapdragout"], U, {\n x: l1[0],\n y: l1[1]\n }), e1.unactivate(), e.touchData.start = null;\n } else {\n var T1 = e.findNearestElement(l1[0], l1[1], !0, !0);\n r(T1, ["touchend", "tapend", "vmouseup", "tapdragout"], U, {\n x: l1[0],\n y: l1[1]\n });\n }\n var F1 = e.touchData.startPosition[0] - l1[0], X1 = F1 * F1, G1 = e.touchData.startPosition[1] - l1[1], Q1 = G1 * G1, K1 = X1 + Q1, n0 = K1 * A1 * A1;\n e.touchData.singleTouchMoved || (e1 || M1.$(":selected").unselect(["tapunselect"]), r(e1, ["tap", "vclick"], U, {\n x: l1[0],\n y: l1[1]\n })), e1 != null && !e.dragData.didDrag && e1._private.selectable && n0 < e.touchTapThreshold2 && !e.pinching && (M1.selectionType() === "single" ? (M1.$(t).unmerge(e1).unselect(["tapunselect"]), e1.select(["tapselect"])) : e1.selected() ? e1.unselect(["tapunselect"]) : e1.select(["tapselect"]), e.redrawHint("eles", !0)), e.touchData.singleTouchMoved = !0;\n }\n }\n }\n for (var u0 = 0; u0 < l1.length; u0++)\n b1[u0] = l1[u0];\n e.dragData.didDrag = !1, U.touches.length === 0 && (e.touchData.dragDelta = [], e.touchData.startPosition = null, e.touchData.startGPosition = null, e.touchData.didSelect = !1), U.touches.length < 2 && (U.touches.length === 1 && (e.touchData.startGPosition = [U.touches[0].clientX, U.touches[0].clientY]), e.pinching = !1, e.redrawHint("eles", !0), e.redraw());\n }, !1), typeof TouchEvent > "u") {\n var H = [], G = function(U) {\n return {\n clientX: U.clientX,\n clientY: U.clientY,\n force: 1,\n identifier: U.pointerId,\n pageX: U.pageX,\n pageY: U.pageY,\n radiusX: U.width / 2,\n radiusY: U.height / 2,\n screenX: U.screenX,\n screenY: U.screenY,\n target: U.target\n };\n }, J = function(U) {\n return {\n event: U,\n touch: G(U)\n };\n }, F = function(U) {\n H.push(J(U));\n }, V = function(U) {\n for (var e1 = 0; e1 < H.length; e1++) {\n var o1 = H[e1];\n if (o1.event.pointerId === U.pointerId) {\n H.splice(e1, 1);\n return;\n }\n }\n }, Q = function(U) {\n var e1 = H.filter(function(o1) {\n return o1.event.pointerId === U.pointerId;\n })[0];\n e1.event = U, e1.touch = G(U);\n }, Z = function(U) {\n U.touches = H.map(function(e1) {\n return e1.touch;\n });\n }, t1 = function(U) {\n return U.pointerType === "mouse" || U.pointerType === 4;\n };\n e.registerBinding(e.container, "pointerdown", function(n1) {\n t1(n1) || (n1.preventDefault(), F(n1), Z(n1), a1(n1));\n }), e.registerBinding(e.container, "pointerup", function(n1) {\n t1(n1) || (V(n1), Z(n1), D(n1));\n }), e.registerBinding(e.container, "pointercancel", function(n1) {\n t1(n1) || (V(n1), Z(n1), Y(n1));\n }), e.registerBinding(e.container, "pointermove", function(n1) {\n t1(n1) || (n1.preventDefault(), Q(n1), Z(n1), _(n1));\n });\n }\n};\nvar Tn = {};\nTn.generatePolygon = function(e, t) {\n return this.nodeShapes[e] = {\n renderer: this,\n name: e,\n points: t,\n draw: function(n, o, i, a, s) {\n this.renderer.nodeShapeImpl("polygon", n, o, i, a, s, this.points);\n },\n intersectLine: function(n, o, i, a, s, l, c) {\n return N4(s, l, this.points, n, o, i / 2, a / 2, c);\n },\n checkPoint: function(n, o, i, a, s, l, c) {\n return En(n, o, this.points, l, c, a, s, [0, -1], i);\n }\n };\n};\nTn.generateEllipse = function() {\n return this.nodeShapes.ellipse = {\n renderer: this,\n name: "ellipse",\n draw: function(t, r, n, o, i) {\n this.renderer.nodeShapeImpl(this.name, t, r, n, o, i);\n },\n intersectLine: function(t, r, n, o, i, a, s) {\n return Ke1(i, a, t, r, n / 2 + s, o / 2 + s);\n },\n checkPoint: function(t, r, n, o, i, a, s) {\n return ii(t, r, o, i, a, s, n);\n }\n };\n};\nTn.generateRoundPolygon = function(e, t) {\n for (var r = new Array(t.length * 2), n = 0; n < t.length / 2; n++) {\n var o = n * 2, i = void 0;\n n < t.length / 2 - 1 ? i = (n + 1) * 2 : i = 0, r[n * 4] = t[o], r[n * 4 + 1] = t[o + 1];\n var a = t[i] - t[o], s = t[i + 1] - t[o + 1], l = Math.sqrt(a * a + s * s);\n r[n * 4 + 2] = a / l, r[n * 4 + 3] = s / l;\n }\n return this.nodeShapes[e] = {\n renderer: this,\n name: e,\n points: r,\n draw: function(p, d, u, h, b) {\n this.renderer.nodeShapeImpl("round-polygon", p, d, u, h, b, this.points);\n },\n intersectLine: function(p, d, u, h, b, M, C) {\n return Ze1(b, M, this.points, p, d, u, h);\n },\n checkPoint: function(p, d, u, h, b, M, C) {\n return je1(p, d, this.points, M, C, h, b);\n }\n };\n};\nTn.generateRoundRectangle = function() {\n return this.nodeShapes["round-rectangle"] = this.nodeShapes.roundrectangle = {\n renderer: this,\n name: "round-rectangle",\n points: n2(4, 0),\n draw: function(t, r, n, o, i) {\n this.renderer.nodeShapeImpl(this.name, t, r, n, o, i);\n },\n intersectLine: function(t, r, n, o, i, a, s) {\n return uO(i, a, t, r, n, o, s);\n },\n checkPoint: function(t, r, n, o, i, a, s) {\n var l = us(o, i), c = l * 2;\n return !!(En(t, r, this.points, a, s, o, i - c, [0, -1], n) || En(t, r, this.points, a, s, o - c, i, [0, -1], n) || ii(t, r, c, c, a - o / 2 + l, s - i / 2 + l, n) || ii(t, r, c, c, a + o / 2 - l, s - i / 2 + l, n) || ii(t, r, c, c, a + o / 2 - l, s + i / 2 - l, n) || ii(t, r, c, c, a - o / 2 + l, s + i / 2 - l, n));\n }\n };\n};\nTn.generateCutRectangle = function() {\n return this.nodeShapes["cut-rectangle"] = this.nodeShapes.cutrectangle = {\n renderer: this,\n name: "cut-rectangle",\n cornerLength: fO(),\n points: n2(4, 0),\n draw: function(t, r, n, o, i) {\n this.renderer.nodeShapeImpl(this.name, t, r, n, o, i);\n },\n generateCutTrianglePts: function(t, r, n, o) {\n var i = this.cornerLength, a = r / 2, s = t / 2, l = n - s, c = n + s, p = o - a, d = o + a;\n return {\n topLeft: [l, p + i, l + i, p, l + i, p + i],\n topRight: [c - i, p, c, p + i, c - i, p + i],\n bottomRight: [c, d - i, c - i, d, c - i, d - i],\n bottomLeft: [l + i, d, l, d - i, l + i, d - i]\n };\n },\n intersectLine: function(t, r, n, o, i, a, s) {\n var l = this.generateCutTrianglePts(n + 2 * s, o + 2 * s, t, r), c = [].concat.apply([], [l.topLeft.splice(0, 4), l.topRight.splice(0, 4), l.bottomRight.splice(0, 4), l.bottomLeft.splice(0, 4)]);\n return N4(i, a, c, t, r);\n },\n checkPoint: function(t, r, n, o, i, a, s) {\n if (En(t, r, this.points, a, s, o, i - 2 * this.cornerLength, [0, -1], n) || En(t, r, this.points, a, s, o - 2 * this.cornerLength, i, [0, -1], n))\n return !0;\n var l = this.generateCutTrianglePts(o, i, a, s);\n return g2(t, r, l.topLeft) || g2(t, r, l.topRight) || g2(t, r, l.bottomRight) || g2(t, r, l.bottomLeft);\n }\n };\n};\nTn.generateBarrel = function() {\n return this.nodeShapes.barrel = {\n renderer: this,\n name: "barrel",\n points: n2(4, 0),\n draw: function(t, r, n, o, i) {\n this.renderer.nodeShapeImpl(this.name, t, r, n, o, i);\n },\n intersectLine: function(t, r, n, o, i, a, s) {\n var l = 0.15, c = 0.5, p = 0.85, d = this.generateBarrelBezierPts(n + 2 * s, o + 2 * s, t, r), u = function(M) {\n var C = pa({\n x: M[0],\n y: M[1]\n }, {\n x: M[2],\n y: M[3]\n }, {\n x: M[4],\n y: M[5]\n }, l), g = pa({\n x: M[0],\n y: M[1]\n }, {\n x: M[2],\n y: M[3]\n }, {\n x: M[4],\n y: M[5]\n }, c), f = pa({\n x: M[0],\n y: M[1]\n }, {\n x: M[2],\n y: M[3]\n }, {\n x: M[4],\n y: M[5]\n }, p);\n return [M[0], M[1], C.x, C.y, g.x, g.y, f.x, f.y, M[4], M[5]];\n }, h = [].concat(u(d.topLeft), u(d.topRight), u(d.bottomRight), u(d.bottomLeft));\n return N4(i, a, h, t, r);\n },\n generateBarrelBezierPts: function(t, r, n, o) {\n var i = r / 2, a = t / 2, s = n - a, l = n + a, c = o - i, p = o + i, d = F8(t, r), u = d.heightOffset, h = d.widthOffset, b = d.ctrlPtOffsetPct * t, M = {\n topLeft: [s, c + u, s + b, c, s + h, c],\n topRight: [l - h, c, l - b, c, l, c + u],\n bottomRight: [l, p - u, l - b, p, l - h, p],\n bottomLeft: [s + h, p, s + b, p, s, p - u]\n };\n return M.topLeft.isTop = !0, M.topRight.isTop = !0, M.bottomLeft.isBottom = !0, M.bottomRight.isBottom = !0, M;\n },\n checkPoint: function(t, r, n, o, i, a, s) {\n var l = F8(o, i), c = l.heightOffset, p = l.widthOffset;\n if (En(t, r, this.points, a, s, o, i - 2 * c, [0, -1], n) || En(t, r, this.points, a, s, o - 2 * p, i, [0, -1], n))\n return !0;\n for (var d = this.generateBarrelBezierPts(o, i, a, s), u = function(z, N, W) {\n var T = W[4], x = W[2], E = W[0], L = W[5], w = W[1], q = Math.min(T, E), S = Math.max(T, E), B = Math.min(L, w), I = Math.max(L, w);\n if (q <= z && z <= S && B <= N && N <= I) {\n var P = Je1(T, x, E), k = Ye1(P[0], P[1], P[2], z), K = k.filter(function($) {\n return 0 <= $ && $ <= 1;\n });\n if (K.length > 0)\n return K[0];\n }\n return null;\n }, h = Object.keys(d), b = 0; b < h.length; b++) {\n var M = h[b], C = d[M], g = u(t, r, C);\n if (g != null) {\n var f = C[5], O = C[3], m = C[1], v = qt(f, O, m, g);\n if (C.isTop && v <= r || C.isBottom && r <= v)\n return !0;\n }\n }\n return !1;\n }\n };\n};\nTn.generateBottomRoundrectangle = function() {\n return this.nodeShapes["bottom-round-rectangle"] = this.nodeShapes.bottomroundrectangle = {\n renderer: this,\n name: "bottom-round-rectangle",\n points: n2(4, 0),\n draw: function(t, r, n, o, i) {\n this.renderer.nodeShapeImpl(this.name, t, r, n, o, i);\n },\n intersectLine: function(t, r, n, o, i, a, s) {\n var l = t - (n / 2 + s), c = r - (o / 2 + s), p = c, d = t + (n / 2 + s), u = io(i, a, t, r, l, c, d, p, !1);\n return u.length > 0 ? u : uO(i, a, t, r, n, o, s);\n },\n checkPoint: function(t, r, n, o, i, a, s) {\n var l = us(o, i), c = 2 * l;\n if (En(t, r, this.points, a, s, o, i - c, [0, -1], n) || En(t, r, this.points, a, s, o - c, i, [0, -1], n))\n return !0;\n var p = o / 2 + 2 * n, d = i / 2 + 2 * n, u = [a - p, s - d, a - p, s, a + p, s, a + p, s - d];\n return !!(g2(t, r, u) || ii(t, r, c, c, a + o / 2 - l, s + i / 2 - l, n) || ii(t, r, c, c, a - o / 2 + l, s + i / 2 - l, n));\n }\n };\n};\nTn.registerNodeShapes = function() {\n var e = this.nodeShapes = {}, t = this;\n this.generateEllipse(), this.generatePolygon("triangle", n2(3, 0)), this.generateRoundPolygon("round-triangle", n2(3, 0)), this.generatePolygon("rectangle", n2(4, 0)), e.square = e.rectangle, this.generateRoundRectangle(), this.generateCutRectangle(), this.generateBarrel(), this.generateBottomRoundrectangle();\n {\n var r = [0, 1, 1, 0, 0, -1, -1, 0];\n this.generatePolygon("diamond", r), this.generateRoundPolygon("round-diamond", r);\n }\n this.generatePolygon("pentagon", n2(5, 0)), this.generateRoundPolygon("round-pentagon", n2(5, 0)), this.generatePolygon("hexagon", n2(6, 0)), this.generateRoundPolygon("round-hexagon", n2(6, 0)), this.generatePolygon("heptagon", n2(7, 0)), this.generateRoundPolygon("round-heptagon", n2(7, 0)), this.generatePolygon("octagon", n2(8, 0)), this.generateRoundPolygon("round-octagon", n2(8, 0));\n var n = new Array(20);\n {\n var o = V8(5, 0), i = V8(5, Math.PI / 5), a = 0.5 * (3 - Math.sqrt(5));\n a *= 1.57;\n for (var s = 0; s < i.length / 2; s++)\n i[s * 2] *= a, i[s * 2 + 1] *= a;\n for (var s = 0; s < 20 / 4; s++)\n n[s * 4] = o[s * 2], n[s * 4 + 1] = o[s * 2 + 1], n[s * 4 + 2] = i[s * 2], n[s * 4 + 3] = i[s * 2 + 1];\n }\n n = MO(n), this.generatePolygon("star", n), this.generatePolygon("vee", [-1, -1, 0, -0.333, 1, -1, 0, 1]), this.generatePolygon("rhomboid", [-1, -1, 0.333, -1, 1, 1, -0.333, 1]), this.nodeShapes.concavehexagon = this.generatePolygon("concave-hexagon", [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]);\n {\n var l = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1];\n this.generatePolygon("tag", l), this.generateRoundPolygon("round-tag", l);\n }\n e.makePolygon = function(c) {\n var p = c.join("$"), d = "polygon-" + p, u;\n return (u = this[d]) ? u : t.generatePolygon(d, c);\n };\n};\nvar fs = {};\nfs.timeToRender = function() {\n return this.redrawTotalTime / this.redrawCount;\n};\nfs.redraw = function(e) {\n e = e || cO();\n var t = this;\n t.averageRedrawTime === void 0 && (t.averageRedrawTime = 0), t.lastRedrawTime === void 0 && (t.lastRedrawTime = 0), t.lastDrawTime === void 0 && (t.lastDrawTime = 0), t.requestedFrame = !0, t.renderOptions = e;\n};\nfs.beforeRender = function(e, t) {\n if (!this.destroyed) {\n t == null && ct("Priority is not optional for beforeRender");\n var r = this.beforeRenderCallbacks;\n r.push({\n fn: e,\n priority: t\n }), r.sort(function(n, o) {\n return o.priority - n.priority;\n });\n }\n};\nvar Zh = function(t, r, n) {\n for (var o = t.beforeRenderCallbacks, i = 0; i < o.length; i++)\n o[i].fn(r, n);\n};\nfs.startRenderLoop = function() {\n var e = this, t = e.cy;\n if (!e.renderLoopStarted) {\n e.renderLoopStarted = !0;\n var r = function n(o) {\n if (!e.destroyed) {\n if (!t.batching())\n if (e.requestedFrame && !e.skipFrame) {\n Zh(e, !0, o);\n var i = Wn();\n e.render(e.renderOptions);\n var a = e.lastDrawTime = Wn();\n e.averageRedrawTime === void 0 && (e.averageRedrawTime = a - i), e.redrawCount === void 0 && (e.redrawCount = 0), e.redrawCount++, e.redrawTotalTime === void 0 && (e.redrawTotalTime = 0);\n var s = a - i;\n e.redrawTotalTime += s, e.lastRedrawTime = s, e.averageRedrawTime = e.averageRedrawTime / 2 + s / 2, e.requestedFrame = !1;\n } else\n Zh(e, !1, o);\n e.skipFrame = !1, jl(n);\n }\n };\n jl(r);\n }\n};\nvar Or1 = function(t) {\n this.init(t);\n}, im = Or1, Ka = im.prototype;\nKa.clientFunctions = ["redrawHint", "render", "renderTo", "matchCanvasSize", "nodeShapeImpl", "arrowShapeImpl"];\nKa.init = function(e) {\n var t = this;\n t.options = e, t.cy = e.cy;\n var r = t.container = e.cy.container();\n if (et) {\n var n = et.document, o = n.head, i = "__________cytoscape_stylesheet", a = "__________cytoscape_container", s = n.getElementById(i) != null;\n if (r.className.indexOf(a) < 0 && (r.className = (r.className || "") + " " + a), !s) {\n var l = n.createElement("style");\n l.id = i, l.innerHTML = "." + a + " { position: relative; }", o.insertBefore(l, o.children[0]);\n }\n var c = et.getComputedStyle(r), p = c.getPropertyValue("position");\n p === "static" && je("A Cytoscape container has style position:static and so can not use UI extensions properly");\n }\n t.selection = [void 0, void 0, void 0, void 0, 0], t.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95], t.hoverData = {\n down: null,\n last: null,\n downTime: null,\n triggerMode: null,\n dragging: !1,\n initialPan: [null, null],\n capture: !1\n }, t.dragData = {\n possibleDragElements: []\n }, t.touchData = {\n start: null,\n capture: !1,\n // These 3 fields related to tap, taphold events\n startPosition: [null, null, null, null, null, null],\n singleTouchStartTime: null,\n singleTouchMoved: !0,\n now: [null, null, null, null, null, null],\n earlier: [null, null, null, null, null, null]\n }, t.redraws = 0, t.showFps = e.showFps, t.debug = e.debug, t.hideEdgesOnViewport = e.hideEdgesOnViewport, t.textureOnViewport = e.textureOnViewport, t.wheelSensitivity = e.wheelSensitivity, t.motionBlurEnabled = e.motionBlur, t.forcedPixelRatio = O0(e.pixelRatio) ? e.pixelRatio : null, t.motionBlur = e.motionBlur, t.motionBlurOpacity = e.motionBlurOpacity, t.motionBlurTransparency = 1 - t.motionBlurOpacity, t.motionBlurPxRatio = 1, t.mbPxRBlurry = 1, t.minMbLowQualFrames = 4, t.fullQualityMb = !1, t.clearedForMotionBlur = [], t.desktopTapThreshold = e.desktopTapThreshold, t.desktopTapThreshold2 = e.desktopTapThreshold * e.desktopTapThreshold, t.touchTapThreshold = e.touchTapThreshold, t.touchTapThreshold2 = e.touchTapThreshold * e.touchTapThreshold, t.tapholdDuration = 500, t.bindings = [], t.beforeRenderCallbacks = [], t.beforeRenderPriorities = {\n // higher priority execs before lower one\n animations: 400,\n eleCalcs: 300,\n eleTxrDeq: 200,\n lyrTxrDeq: 150,\n lyrTxrSkip: 100\n }, t.registerNodeShapes(), t.registerArrowShapes(), t.registerCalculationListeners();\n};\nKa.notify = function(e, t) {\n var r = this, n = r.cy;\n if (!this.destroyed) {\n if (e === "init") {\n r.load();\n return;\n }\n if (e === "destroy") {\n r.destroy();\n return;\n }\n (e === "add" || e === "remove" || e === "move" && n.hasCompoundNodes() || e === "load" || e === "zorder" || e === "mount") && r.invalidateCachedZSortedEles(), e === "viewport" && r.redrawHint("select", !0), (e === "load" || e === "resize" || e === "mount") && (r.invalidateContainerClientCoordsCache(), r.matchCanvasSize(r.container)), r.redrawHint("eles", !0), r.redrawHint("drag", !0), this.startRenderLoop(), this.redraw();\n }\n};\nKa.destroy = function() {\n var e = this;\n e.destroyed = !0, e.cy.stopAnimationLoop();\n for (var t = 0; t < e.bindings.length; t++) {\n var r = e.bindings[t], n = r, o = n.target;\n (o.off || o.removeEventListener).apply(o, n.args);\n }\n if (e.bindings = [], e.beforeRenderCallbacks = [], e.onUpdateEleCalcsFns = [], e.removeObserver && e.removeObserver.disconnect(), e.styleObserver && e.styleObserver.disconnect(), e.resizeObserver && e.resizeObserver.disconnect(), e.labelCalcDiv)\n try {\n document.body.removeChild(e.labelCalcDiv);\n } catch {\n }\n};\nKa.isHeadless = function() {\n return !1;\n};\n[$9, nm, om, ja, Tn, fs].forEach(function(e) {\n K0(Ka, e);\n});\nvar yp = 1e3 / 60, am = {\n setupDequeueing: function(t) {\n return function() {\n var n = this, o = this.renderer;\n if (!n.dequeueingSetup) {\n n.dequeueingSetup = !0;\n var i = Nc(function() {\n o.redrawHint("eles", !0), o.redrawHint("drag", !0), o.redraw();\n }, t.deqRedrawThreshold), a = function(c, p) {\n var d = Wn(), u = o.averageRedrawTime, h = o.lastRedrawTime, b = [], M = o.cy.extent(), C = o.getPixelRatio();\n for (c || o.flushRenderedStyleQueue(); ; ) {\n var g = Wn(), f = g - d, O = g - p;\n if (h < yp) {\n var m = yp - (c ? u : 0);\n if (O >= t.deqFastCost * m)\n break;\n } else if (c) {\n if (f >= t.deqCost * h || f >= t.deqAvgCost * u)\n break;\n } else if (O >= t.deqNoDrawCost * yp)\n break;\n var v = t.deq(n, C, M);\n if (v.length > 0)\n for (var y = 0; y < v.length; y++)\n b.push(v[y]);\n else\n break;\n }\n b.length > 0 && (t.onDeqd(n, b), !c && t.shouldRedraw(n, b, C, M) && i());\n }, s = t.priority || V9;\n o.beforeRender(a, s(n));\n }\n };\n }\n}, mr1 = /* @__PURE__ */ function() {\n function e(t) {\n var r = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Kl;\n I9(this, e), this.idsByKey = new Ur(), this.keyForId = new Ur(), this.cachesByLvl = new Ur(), this.lvls = [], this.getKey = t, this.doesEleInvalidateKey = r;\n }\n return T9(e, [{\n key: "getIdsFor",\n value: function(r) {\n r == null && ct("Can not get id list for null key");\n var n = this.idsByKey, o = this.idsByKey.get(r);\n return o || (o = new Ya(), n.set(r, o)), o;\n }\n }, {\n key: "addIdForKey",\n value: function(r, n) {\n r != null && this.getIdsFor(r).add(n);\n }\n }, {\n key: "deleteIdForKey",\n value: function(r, n) {\n r != null && this.getIdsFor(r).delete(n);\n }\n }, {\n key: "getNumberOfIdsForKey",\n value: function(r) {\n return r == null ? 0 : this.getIdsFor(r).size;\n }\n }, {\n key: "updateKeyMappingFor",\n value: function(r) {\n var n = r.id(), o = this.keyForId.get(n), i = this.getKey(r);\n this.deleteIdForKey(o, n), this.addIdForKey(i, n), this.keyForId.set(n, i);\n }\n }, {\n key: "deleteKeyMappingFor",\n value: function(r) {\n var n = r.id(), o = this.keyForId.get(n);\n this.deleteIdForKey(o, n), this.keyForId.delete(n);\n }\n }, {\n key: "keyHasChangedFor",\n value: function(r) {\n var n = r.id(), o = this.keyForId.get(n), i = this.getKey(r);\n return o !== i;\n }\n }, {\n key: "isInvalid",\n value: function(r) {\n return this.keyHasChangedFor(r) || this.doesEleInvalidateKey(r);\n }\n }, {\n key: "getCachesAt",\n value: function(r) {\n var n = this.cachesByLvl, o = this.lvls, i = n.get(r);\n return i || (i = new Ur(), n.set(r, i), o.push(r)), i;\n }\n }, {\n key: "getCache",\n value: function(r, n) {\n return this.getCachesAt(n).get(r);\n }\n }, {\n key: "get",\n value: function(r, n) {\n var o = this.getKey(r), i = this.getCache(o, n);\n return i != null && this.updateKeyMappingFor(r), i;\n }\n }, {\n key: "getForCachedKey",\n value: function(r, n) {\n var o = this.keyForId.get(r.id()), i = this.getCache(o, n);\n return i;\n }\n }, {\n key: "hasCache",\n value: function(r, n) {\n return this.getCachesAt(n).has(r);\n }\n }, {\n key: "has",\n value: function(r, n) {\n var o = this.getKey(r);\n return this.hasCache(o, n);\n }\n }, {\n key: "setCache",\n value: function(r, n, o) {\n o.key = r, this.getCachesAt(n).set(r, o);\n }\n }, {\n key: "set",\n value: function(r, n, o) {\n var i = this.getKey(r);\n this.setCache(i, n, o), this.updateKeyMappingFor(r);\n }\n }, {\n key: "deleteCache",\n value: function(r, n) {\n this.getCachesAt(n).delete(r);\n }\n }, {\n key: "delete",\n value: function(r, n) {\n var o = this.getKey(r);\n this.deleteCache(o, n);\n }\n }, {\n key: "invalidateKey",\n value: function(r) {\n var n = this;\n this.lvls.forEach(function(o) {\n return n.deleteCache(r, o);\n });\n }\n // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key)\n }, {\n key: "invalidate",\n value: function(r) {\n var n = r.id(), o = this.keyForId.get(n);\n this.deleteKeyMappingFor(r);\n var i = this.doesEleInvalidateKey(r);\n return i && this.invalidateKey(o), i || this.getNumberOfIdsForKey(o) === 0;\n }\n }]), e;\n}(), Jh = 25, R5 = 50, sl = -4, K8 = 3, vr1 = 7.99, yr1 = 8, Lr1 = 1024, wr1 = 1024, qr1 = 1024, xr1 = 0.2, Rr1 = 0.8, Br1 = 10, Wr1 = 0.15, Er1 = 0.1, Sr1 = 0.9, kr1 = 0.9, Nr1 = 100, Ir1 = 1, ia = {\n dequeue: "dequeue",\n downscale: "downscale",\n highQuality: "highQuality"\n}, Tr1 = Ut({\n getKey: null,\n doesEleInvalidateKey: Kl,\n drawElement: null,\n getBoundingBox: null,\n getRotationPoint: null,\n getRotationOffset: null,\n isVisible: aO,\n allowEdgeTxrCaching: !0,\n allowParentTxrCaching: !0\n}), U3 = function(t, r) {\n var n = this;\n n.renderer = t, n.onDequeues = [];\n var o = Tr1(r);\n K0(n, o), n.lookup = new mr1(o.getKey, o.doesEleInvalidateKey), n.setupDequeueing();\n}, wt = U3.prototype;\nwt.reasons = ia;\nwt.getTextureQueue = function(e) {\n var t = this;\n return t.eleImgCaches = t.eleImgCaches || {}, t.eleImgCaches[e] = t.eleImgCaches[e] || [];\n};\nwt.getRetiredTextureQueue = function(e) {\n var t = this, r = t.eleImgCaches.retired = t.eleImgCaches.retired || {}, n = r[e] = r[e] || [];\n return n;\n};\nwt.getElementQueue = function() {\n var e = this, t = e.eleCacheQueue = e.eleCacheQueue || new ps(function(r, n) {\n return n.reqs - r.reqs;\n });\n return t;\n};\nwt.getElementKeyToQueue = function() {\n var e = this, t = e.eleKeyToCacheQueue = e.eleKeyToCacheQueue || {};\n return t;\n};\nwt.getElement = function(e, t, r, n, o) {\n var i = this, a = this.renderer, s = a.cy.zoom(), l = this.lookup;\n if (!t || t.w === 0 || t.h === 0 || isNaN(t.w) || isNaN(t.h) || !e.visible() || e.removed() || !i.allowEdgeTxrCaching && e.isEdge() || !i.allowParentTxrCaching && e.isParent())\n return null;\n if (n == null && (n = Math.ceil(U9(s * r))), n < sl)\n n = sl;\n else if (s >= vr1 || n > K8)\n return null;\n var c = Math.pow(2, n), p = t.h * c, d = t.w * c, u = a.eleTextBiggerThanMin(e, c);\n if (!this.isVisible(e, u))\n return null;\n var h = l.get(e, n);\n if (h && h.invalidated && (h.invalidated = !1, h.texture.invalidatedWidth -= h.width), h)\n return h;\n var b;\n if (p <= Jh ? b = Jh : p <= R5 ? b = R5 : b = Math.ceil(p / R5) * R5, p > qr1 || d > wr1)\n return null;\n var M = i.getTextureQueue(b), C = M[M.length - 2], g = function() {\n return i.recycleTexture(b, d) || i.addTexture(b, d);\n };\n C || (C = M[M.length - 1]), C || (C = g()), C.width - C.usedWidth < d && (C = g());\n for (var f = function(S) {\n return S && S.scaledLabelShown === u;\n }, O = o && o === ia.dequeue, m = o && o === ia.highQuality, v = o && o === ia.downscale, y, z = n + 1; z <= K8; z++) {\n var N = l.get(e, z);\n if (N) {\n y = N;\n break;\n }\n }\n var W = y && y.level === n + 1 ? y : null, T = function() {\n C.context.drawImage(W.texture.canvas, W.x, 0, W.width, W.height, C.usedWidth, 0, d, p);\n };\n if (C.context.setTransform(1, 0, 0, 1, 0, 0), C.context.clearRect(C.usedWidth, 0, d, b), f(W))\n T();\n else if (f(y))\n if (m) {\n for (var x = y.level; x > n; x--)\n W = i.getElement(e, t, r, x, ia.downscale);\n T();\n } else\n return i.queueElement(e, y.level - 1), y;\n else {\n var E;\n if (!O && !m && !v)\n for (var L = n - 1; L >= sl; L--) {\n var w = l.get(e, L);\n if (w) {\n E = w;\n break;\n }\n }\n if (f(E))\n return i.queueElement(e, n), E;\n C.context.translate(C.usedWidth, 0), C.context.scale(c, c), this.drawElement(C.context, e, t, u, !1), C.context.scale(1 / c, 1 / c), C.context.translate(-C.usedWidth, 0);\n }\n return h = {\n x: C.usedWidth,\n texture: C,\n level: n,\n scale: c,\n width: d,\n height: p,\n scaledLabelShown: u\n }, C.usedWidth += Math.ceil(d + yr1), C.eleCaches.push(h), l.set(e, n, h), i.checkTextureFullness(C), h;\n};\nwt.invalidateElements = function(e) {\n for (var t = 0; t < e.length; t++)\n this.invalidateElement(e[t]);\n};\nwt.invalidateElement = function(e) {\n var t = this, r = t.lookup, n = [], o = r.isInvalid(e);\n if (o) {\n for (var i = sl; i <= K8; i++) {\n var a = r.getForCachedKey(e, i);\n a && n.push(a);\n }\n var s = r.invalidate(e);\n if (s)\n for (var l = 0; l < n.length; l++) {\n var c = n[l], p = c.texture;\n p.invalidatedWidth += c.width, c.invalidated = !0, t.checkTextureUtility(p);\n }\n t.removeFromQueue(e);\n }\n};\nwt.checkTextureUtility = function(e) {\n e.invalidatedWidth >= xr1 * e.width && this.retireTexture(e);\n};\nwt.checkTextureFullness = function(e) {\n var t = this, r = t.getTextureQueue(e.height);\n e.usedWidth / e.width > Rr1 && e.fullnessChecks >= Br1 ? mo(r, e) : e.fullnessChecks++;\n};\nwt.retireTexture = function(e) {\n var t = this, r = e.height, n = t.getTextureQueue(r), o = this.lookup;\n mo(n, e), e.retired = !0;\n for (var i = e.eleCaches, a = 0; a < i.length; a++) {\n var s = i[a];\n o.deleteCache(s.key, s.level);\n }\n F9(i);\n var l = t.getRetiredTextureQueue(r);\n l.push(e);\n};\nwt.addTexture = function(e, t) {\n var r = this, n = r.getTextureQueue(e), o = {};\n return n.push(o), o.eleCaches = [], o.height = e, o.width = Math.max(Lr1, t), o.usedWidth = 0, o.invalidatedWidth = 0, o.fullnessChecks = 0, o.canvas = r.renderer.makeOffscreenCanvas(o.width, o.height), o.context = o.canvas.getContext("2d"), o;\n};\nwt.recycleTexture = function(e, t) {\n for (var r = this, n = r.getTextureQueue(e), o = r.getRetiredTextureQueue(e), i = 0; i < o.length; i++) {\n var a = o[i];\n if (a.width >= t)\n return a.retired = !1, a.usedWidth = 0, a.invalidatedWidth = 0, a.fullnessChecks = 0, F9(a.eleCaches), a.context.setTransform(1, 0, 0, 1, 0, 0), a.context.clearRect(0, 0, a.width, a.height), mo(o, a), n.push(a), a;\n }\n};\nwt.queueElement = function(e, t) {\n var r = this, n = r.getElementQueue(), o = r.getElementKeyToQueue(), i = this.getKey(e), a = o[i];\n if (a)\n a.level = Math.max(a.level, t), a.eles.merge(e), a.reqs++, n.updateItem(a);\n else {\n var s = {\n eles: e.spawn().merge(e),\n level: t,\n reqs: 1,\n key: i\n };\n n.push(s), o[i] = s;\n }\n};\nwt.dequeue = function(e) {\n for (var t = this, r = t.getElementQueue(), n = t.getElementKeyToQueue(), o = [], i = t.lookup, a = 0; a < Ir1 && r.size() > 0; a++) {\n var s = r.pop(), l = s.key, c = s.eles[0], p = i.hasCache(c, s.level);\n if (n[l] = null, p)\n continue;\n o.push(s);\n var d = t.getBoundingBox(c);\n t.getElement(c, d, e, s.level, ia.dequeue);\n }\n return o;\n};\nwt.removeFromQueue = function(e) {\n var t = this, r = t.getElementQueue(), n = t.getElementKeyToQueue(), o = this.getKey(e), i = n[o];\n i != null && (i.eles.length === 1 ? (i.reqs = P9, r.updateItem(i), r.pop(), n[o] = null) : i.eles.unmerge(e));\n};\nwt.onDequeue = function(e) {\n this.onDequeues.push(e);\n};\nwt.offDequeue = function(e) {\n mo(this.onDequeues, e);\n};\nwt.setupDequeueing = am.setupDequeueing({\n deqRedrawThreshold: Nr1,\n deqCost: Wr1,\n deqAvgCost: Er1,\n deqNoDrawCost: Sr1,\n deqFastCost: kr1,\n deq: function(t, r, n) {\n return t.dequeue(r, n);\n },\n onDeqd: function(t, r) {\n for (var n = 0; n < t.onDequeues.length; n++) {\n var o = t.onDequeues[n];\n o(r);\n }\n },\n shouldRedraw: function(t, r, n, o) {\n for (var i = 0; i < r.length; i++)\n for (var a = r[i].eles, s = 0; s < a.length; s++) {\n var l = a[s].boundingBox();\n if (Y9(l, o))\n return !0;\n }\n return !1;\n },\n priority: function(t) {\n return t.renderer.beforeRenderPriorities.eleTxrDeq;\n }\n});\nvar Dr1 = 1, e4 = -4, tc = 2, Hr1 = 3.99, Pr1 = 50, Vr1 = 50, Fr1 = 0.15, Ur1 = 0.1, Yr1 = 0.9, Xr1 = 0.9, Qr1 = 1, _h = 250, Gr1 = 4e3 * 4e3, jr1 = !0, sm = function(t) {\n var r = this, n = r.renderer = t, o = n.cy;\n r.layersByLevel = {}, r.firstGet = !0, r.lastInvalidationTime = Wn() - 2 * _h, r.skipping = !1, r.eleTxrDeqs = o.collection(), r.scheduleElementRefinement = Nc(function() {\n r.refineElementTextures(r.eleTxrDeqs), r.eleTxrDeqs.unmerge(r.eleTxrDeqs);\n }, Vr1), n.beforeRender(function(a, s) {\n s - r.lastInvalidationTime <= _h ? r.skipping = !0 : r.skipping = !1;\n }, n.beforeRenderPriorities.lyrTxrSkip);\n var i = function(s, l) {\n return l.reqs - s.reqs;\n };\n r.layersQueue = new ps(i), r.setupDequeueing();\n}, Yt = sm.prototype, $h = 0, Kr1 = Math.pow(2, 53) - 1;\nYt.makeLayer = function(e, t) {\n var r = Math.pow(2, t), n = Math.ceil(e.w * r), o = Math.ceil(e.h * r), i = this.renderer.makeOffscreenCanvas(n, o), a = {\n id: $h = ++$h % Kr1,\n bb: e,\n level: t,\n width: n,\n height: o,\n canvas: i,\n context: i.getContext("2d"),\n eles: [],\n elesQueue: [],\n reqs: 0\n }, s = a.context, l = -a.bb.x1, c = -a.bb.y1;\n return s.scale(r, r), s.translate(l, c), a;\n};\nYt.getLayers = function(e, t, r) {\n var n = this, o = n.renderer, i = o.cy, a = i.zoom(), s = n.firstGet;\n if (n.firstGet = !1, r == null) {\n if (r = Math.ceil(U9(a * t)), r < e4)\n r = e4;\n else if (a >= Hr1 || r > tc)\n return null;\n }\n n.validateLayersElesOrdering(r, e);\n var l = n.layersByLevel, c = Math.pow(2, r), p = l[r] = l[r] || [], d, u = n.levelIsComplete(r, e), h, b = function() {\n var T = function(q) {\n if (n.validateLayersElesOrdering(q, e), n.levelIsComplete(q, e))\n return h = l[q], !0;\n }, x = function(q) {\n if (!h)\n for (var S = r + q; e4 <= S && S <= tc && !T(S); S += q)\n ;\n };\n x(1), x(-1);\n for (var E = p.length - 1; E >= 0; E--) {\n var L = p[E];\n L.invalid && mo(p, L);\n }\n };\n if (!u)\n b();\n else\n return p;\n var M = function() {\n if (!d) {\n d = w2();\n for (var T = 0; T < e.length; T++)\n He1(d, e[T].boundingBox());\n }\n return d;\n }, C = function(T) {\n T = T || {};\n var x = T.after;\n M();\n var E = d.w * c * (d.h * c);\n if (E > Gr1)\n return null;\n var L = n.makeLayer(d, r);\n if (x != null) {\n var w = p.indexOf(x) + 1;\n p.splice(w, 0, L);\n } else\n (T.insert === void 0 || T.insert) && p.unshift(L);\n return L;\n };\n if (n.skipping && !s)\n return null;\n for (var g = null, f = e.length / Dr1, O = !s, m = 0; m < e.length; m++) {\n var v = e[m], y = v._private.rscratch, z = y.imgLayerCaches = y.imgLayerCaches || {}, N = z[r];\n if (N) {\n g = N;\n continue;\n }\n if ((!g || g.eles.length >= f || !AO(g.bb, v.boundingBox())) && (g = C({\n insert: !0,\n after: g\n }), !g))\n return null;\n h || O ? n.queueLayer(g, v) : n.drawEleInLayer(g, v, r, t), g.eles.push(v), z[r] = g;\n }\n return h || (O ? null : p);\n};\nYt.getEleLevelForLayerLevel = function(e, t) {\n return e;\n};\nYt.drawEleInLayer = function(e, t, r, n) {\n var o = this, i = this.renderer, a = e.context, s = t.boundingBox();\n s.w === 0 || s.h === 0 || !t.visible() || (r = o.getEleLevelForLayerLevel(r, n), i.setImgSmoothing(a, !1), i.drawCachedElement(a, t, null, null, r, jr1), i.setImgSmoothing(a, !0));\n};\nYt.levelIsComplete = function(e, t) {\n var r = this, n = r.layersByLevel[e];\n if (!n || n.length === 0)\n return !1;\n for (var o = 0, i = 0; i < n.length; i++) {\n var a = n[i];\n if (a.reqs > 0 || a.invalid)\n return !1;\n o += a.eles.length;\n }\n return o === t.length;\n};\nYt.validateLayersElesOrdering = function(e, t) {\n var r = this.layersByLevel[e];\n if (r)\n for (var n = 0; n < r.length; n++) {\n for (var o = r[n], i = -1, a = 0; a < t.length; a++)\n if (o.eles[0] === t[a]) {\n i = a;\n break;\n }\n if (i < 0) {\n this.invalidateLayer(o);\n continue;\n }\n for (var s = i, a = 0; a < o.eles.length; a++)\n if (o.eles[a] !== t[s + a]) {\n this.invalidateLayer(o);\n break;\n }\n }\n};\nYt.updateElementsInLayers = function(e, t) {\n for (var r = this, n = As(e[0]), o = 0; o < e.length; o++)\n for (var i = n ? null : e[o], a = n ? e[o] : e[o].ele, s = a._private.rscratch, l = s.imgLayerCaches = s.imgLayerCaches || {}, c = e4; c <= tc; c++) {\n var p = l[c];\n p && (i && r.getEleLevelForLayerLevel(p.level) !== i.level || t(p, a, i));\n }\n};\nYt.haveLayers = function() {\n for (var e = this, t = !1, r = e4; r <= tc; r++) {\n var n = e.layersByLevel[r];\n if (n && n.length > 0) {\n t = !0;\n break;\n }\n }\n return t;\n};\nYt.invalidateElements = function(e) {\n var t = this;\n e.length !== 0 && (t.lastInvalidationTime = Wn(), !(e.length === 0 || !t.haveLayers()) && t.updateElementsInLayers(e, function(n, o, i) {\n t.invalidateLayer(n);\n }));\n};\nYt.invalidateLayer = function(e) {\n if (this.lastInvalidationTime = Wn(), !e.invalid) {\n var t = e.level, r = e.eles, n = this.layersByLevel[t];\n mo(n, e), e.elesQueue = [], e.invalid = !0, e.replacement && (e.replacement.invalid = !0);\n for (var o = 0; o < r.length; o++) {\n var i = r[o]._private.rscratch.imgLayerCaches;\n i && (i[t] = null);\n }\n }\n};\nYt.refineElementTextures = function(e) {\n var t = this;\n t.updateElementsInLayers(e, function(n, o, i) {\n var a = n.replacement;\n if (a || (a = n.replacement = t.makeLayer(n.bb, n.level), a.replaces = n, a.eles = n.eles), !a.reqs)\n for (var s = 0; s < a.eles.length; s++)\n t.queueLayer(a, a.eles[s]);\n });\n};\nYt.enqueueElementRefinement = function(e) {\n this.eleTxrDeqs.merge(e), this.scheduleElementRefinement();\n};\nYt.queueLayer = function(e, t) {\n var r = this, n = r.layersQueue, o = e.elesQueue, i = o.hasId = o.hasId || {};\n if (!e.replacement) {\n if (t) {\n if (i[t.id()])\n return;\n o.push(t), i[t.id()] = !0;\n }\n e.reqs ? (e.reqs++, n.updateItem(e)) : (e.reqs = 1, n.push(e));\n }\n};\nYt.dequeue = function(e) {\n for (var t = this, r = t.layersQueue, n = [], o = 0; o < Qr1 && r.size() !== 0; ) {\n var i = r.peek();\n if (i.replacement) {\n r.pop();\n continue;\n }\n if (i.replaces && i !== i.replaces.replacement) {\n r.pop();\n continue;\n }\n if (i.invalid) {\n r.pop();\n continue;\n }\n var a = i.elesQueue.shift();\n a && (t.drawEleInLayer(i, a, i.level, e), o++), n.length === 0 && n.push(!0), i.elesQueue.length === 0 && (r.pop(), i.reqs = 0, i.replaces && t.applyLayerReplacement(i), t.requestRedraw());\n }\n return n;\n};\nYt.applyLayerReplacement = function(e) {\n var t = this, r = t.layersByLevel[e.level], n = e.replaces, o = r.indexOf(n);\n if (!(o < 0 || n.invalid)) {\n r[o] = e;\n for (var i = 0; i < e.eles.length; i++) {\n var a = e.eles[i]._private, s = a.imgLayerCaches = a.imgLayerCaches || {};\n s && (s[e.level] = e);\n }\n t.requestRedraw();\n }\n};\nYt.requestRedraw = Nc(function() {\n var e = this.renderer;\n e.redrawHint("eles", !0), e.redrawHint("drag", !0), e.redraw();\n}, 100);\nYt.setupDequeueing = am.setupDequeueing({\n deqRedrawThreshold: Pr1,\n deqCost: Fr1,\n deqAvgCost: Ur1,\n deqNoDrawCost: Yr1,\n deqFastCost: Xr1,\n deq: function(t, r) {\n return t.dequeue(r);\n },\n onDeqd: V9,\n shouldRedraw: aO,\n priority: function(t) {\n return t.renderer.beforeRenderPriorities.lyrTxrDeq;\n }\n});\nvar lm = {}, eM;\nfunction Zr1(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n e.lineTo(n.x, n.y);\n }\n}\nfunction Jr1(e, t, r) {\n for (var n, o = 0; o < t.length; o++) {\n var i = t[o];\n o === 0 && (n = i), e.lineTo(i.x, i.y);\n }\n e.quadraticCurveTo(r.x, r.y, n.x, n.y);\n}\nfunction tM(e, t, r) {\n e.beginPath && e.beginPath();\n for (var n = t, o = 0; o < n.length; o++) {\n var i = n[o];\n e.lineTo(i.x, i.y);\n }\n var a = r, s = r[0];\n e.moveTo(s.x, s.y);\n for (var o = 1; o < a.length; o++) {\n var i = a[o];\n e.lineTo(i.x, i.y);\n }\n e.closePath && e.closePath();\n}\nfunction _r1(e, t, r, n, o) {\n e.beginPath && e.beginPath(), e.arc(r, n, o, 0, Math.PI * 2, !1);\n var i = t, a = i[0];\n e.moveTo(a.x, a.y);\n for (var s = 0; s < i.length; s++) {\n var l = i[s];\n e.lineTo(l.x, l.y);\n }\n e.closePath && e.closePath();\n}\nfunction $r1(e, t, r, n) {\n e.arc(t, r, n, 0, Math.PI * 2, !1);\n}\nlm.arrowShapeImpl = function(e) {\n return (eM || (eM = {\n polygon: Zr1,\n "triangle-backcurve": Jr1,\n "triangle-tee": tM,\n "circle-triangle": _r1,\n "triangle-cross": tM,\n circle: $r1\n }))[e];\n};\nvar Dn = {};\nDn.drawElement = function(e, t, r, n, o, i) {\n var a = this;\n t.isNode() ? a.drawNode(e, t, r, n, o, i) : a.drawEdge(e, t, r, n, o, i);\n};\nDn.drawElementOverlay = function(e, t) {\n var r = this;\n t.isNode() ? r.drawNodeOverlay(e, t) : r.drawEdgeOverlay(e, t);\n};\nDn.drawCachedElementPortion = function(e, t, r, n, o, i, a, s) {\n var l = this, c = r.getBoundingBox(t);\n if (!(c.w === 0 || c.h === 0)) {\n var p = r.getElement(t, c, n, o, i);\n if (p != null) {\n var d = s(l, t);\n if (d === 0)\n return;\n var u = a(l, t), h = c.x1, b = c.y1, M = c.w, C = c.h, g, f, O, m, v;\n if (u !== 0) {\n var y = r.getRotationPoint(t);\n O = y.x, m = y.y, e.translate(O, m), e.rotate(u), v = l.getImgSmoothing(e), v || l.setImgSmoothing(e, !0);\n var z = r.getRotationOffset(t);\n g = z.x, f = z.y;\n } else\n g = h, f = b;\n var N;\n d !== 1 && (N = e.globalAlpha, e.globalAlpha = N * d), e.drawImage(p.texture.canvas, p.x, 0, p.width, p.height, g, f, M, C), d !== 1 && (e.globalAlpha = N), u !== 0 && (e.rotate(-u), e.translate(-O, -m), v || l.setImgSmoothing(e, !1));\n } else\n r.drawElement(e, t);\n }\n};\nvar en1 = function() {\n return 0;\n}, tn1 = function(t, r) {\n return t.getTextAngle(r, null);\n}, rn1 = function(t, r) {\n return t.getTextAngle(r, "source");\n}, nn1 = function(t, r) {\n return t.getTextAngle(r, "target");\n}, on1 = function(t, r) {\n return r.effectiveOpacity();\n}, Lp = function(t, r) {\n return r.pstyle("text-opacity").pfValue * r.effectiveOpacity();\n};\nDn.drawCachedElement = function(e, t, r, n, o, i) {\n var a = this, s = a.data, l = s.eleTxrCache, c = s.lblTxrCache, p = s.slbTxrCache, d = s.tlbTxrCache, u = t.boundingBox(), h = i === !0 ? l.reasons.highQuality : null;\n if (!(u.w === 0 || u.h === 0 || !t.visible()) && (!n || Y9(u, n))) {\n var b = t.isEdge(), M = t.element()._private.rscratch.badLine;\n a.drawCachedElementPortion(e, t, l, r, o, h, en1, on1), (!b || !M) && a.drawCachedElementPortion(e, t, c, r, o, h, tn1, Lp), b && !M && (a.drawCachedElementPortion(e, t, p, r, o, h, rn1, Lp), a.drawCachedElementPortion(e, t, d, r, o, h, nn1, Lp)), a.drawElementOverlay(e, t);\n }\n};\nDn.drawElements = function(e, t) {\n for (var r = this, n = 0; n < t.length; n++) {\n var o = t[n];\n r.drawElement(e, o);\n }\n};\nDn.drawCachedElements = function(e, t, r, n) {\n for (var o = this, i = 0; i < t.length; i++) {\n var a = t[i];\n o.drawCachedElement(e, a, r, n);\n }\n};\nDn.drawCachedNodes = function(e, t, r, n) {\n for (var o = this, i = 0; i < t.length; i++) {\n var a = t[i];\n a.isNode() && o.drawCachedElement(e, a, r, n);\n }\n};\nDn.drawLayeredElements = function(e, t, r, n) {\n var o = this, i = o.data.lyrTxrCache.getLayers(t, r);\n if (i)\n for (var a = 0; a < i.length; a++) {\n var s = i[a], l = s.bb;\n l.w === 0 || l.h === 0 || e.drawImage(s.canvas, l.x1, l.y1, l.w, l.h);\n }\n else\n o.drawCachedElements(e, t, r, n);\n};\nvar Li = {};\nLi.drawEdge = function(e, t, r) {\n var n = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : !0, o = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : !0, i = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : !0, a = this, s = t._private.rscratch;\n if (!(i && !t.visible()) && !(s.badLine || s.allpts == null || isNaN(s.allpts[0]))) {\n var l;\n r && (l = r, e.translate(-l.x1, -l.y1));\n var c = i ? t.pstyle("opacity").value : 1, p = i ? t.pstyle("line-opacity").value : 1, d = t.pstyle("line-style").value, u = t.pstyle("width").pfValue, h = t.pstyle("line-cap").value, b = c * p, M = c * p, C = function() {\n var T = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : b;\n e.lineWidth = u, e.lineCap = h, a.eleStrokeStyle(e, t, T), a.drawEdgePath(t, e, s.allpts, d), e.lineCap = "butt";\n }, g = function() {\n o && a.drawEdgeOverlay(e, t);\n }, f = function() {\n var T = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : M;\n a.drawArrowheads(e, t, T);\n }, O = function() {\n a.drawElementText(e, t, null, n);\n };\n e.lineJoin = "round";\n var m = t.pstyle("ghost").value === "yes";\n if (m) {\n var v = t.pstyle("ghost-offset-x").pfValue, y = t.pstyle("ghost-offset-y").pfValue, z = t.pstyle("ghost-opacity").value, N = b * z;\n e.translate(v, y), C(N), f(N), e.translate(-v, -y);\n }\n C(), f(), g(), O(), r && e.translate(l.x1, l.y1);\n }\n};\nLi.drawEdgeOverlay = function(e, t) {\n if (t.visible()) {\n var r = t.pstyle("overlay-opacity").value;\n if (r !== 0) {\n var n = this, o = n.usePaths(), i = t._private.rscratch, a = t.pstyle("overlay-padding").pfValue, s = 2 * a, l = t.pstyle("overlay-color").value;\n e.lineWidth = s, i.edgeType === "self" && !o ? e.lineCap = "butt" : e.lineCap = "round", n.colorStrokeStyle(e, l[0], l[1], l[2], r), n.drawEdgePath(t, e, i.allpts, "solid");\n }\n }\n};\nLi.drawEdgePath = function(e, t, r, n) {\n var o = e._private.rscratch, i = t, a, s = !1, l = this.usePaths(), c = e.pstyle("line-dash-pattern").pfValue, p = e.pstyle("line-dash-offset").pfValue;\n if (l) {\n var d = r.join("$"), u = o.pathCacheKey && o.pathCacheKey === d;\n u ? (a = t = o.pathCache, s = !0) : (a = t = new Path2D(), o.pathCacheKey = d, o.pathCache = a);\n }\n if (i.setLineDash)\n switch (n) {\n case "dotted":\n i.setLineDash([1, 1]);\n break;\n case "dashed":\n i.setLineDash(c), i.lineDashOffset = p;\n break;\n case "solid":\n i.setLineDash([]);\n break;\n }\n if (!s && !o.badLine)\n switch (t.beginPath && t.beginPath(), t.moveTo(r[0], r[1]), o.edgeType) {\n case "bezier":\n case "self":\n case "compound":\n case "multibezier":\n for (var h = 2; h + 3 < r.length; h += 4)\n t.quadraticCurveTo(r[h], r[h + 1], r[h + 2], r[h + 3]);\n break;\n case "straight":\n case "segments":\n case "haystack":\n for (var b = 2; b + 1 < r.length; b += 2)\n t.lineTo(r[b], r[b + 1]);\n break;\n }\n t = i, l ? t.stroke(a) : t.stroke(), t.setLineDash && t.setLineDash([]);\n};\nLi.drawArrowheads = function(e, t, r) {\n var n = t._private.rscratch, o = n.edgeType === "haystack";\n o || this.drawArrowhead(e, t, "source", n.arrowStartX, n.arrowStartY, n.srcArrowAngle, r), this.drawArrowhead(e, t, "mid-target", n.midX, n.midY, n.midtgtArrowAngle, r), this.drawArrowhead(e, t, "mid-source", n.midX, n.midY, n.midsrcArrowAngle, r), o || this.drawArrowhead(e, t, "target", n.arrowEndX, n.arrowEndY, n.tgtArrowAngle, r);\n};\nLi.drawArrowhead = function(e, t, r, n, o, i, a) {\n if (!(isNaN(n) || n == null || isNaN(o) || o == null || isNaN(i) || i == null)) {\n var s = this, l = t.pstyle(r + "-arrow-shape").value;\n if (l !== "none") {\n var c = t.pstyle(r + "-arrow-fill").value === "hollow" ? "both" : "filled", p = t.pstyle(r + "-arrow-fill").value, d = t.pstyle("width").pfValue, u = t.pstyle("opacity").value;\n a === void 0 && (a = u);\n var h = e.globalCompositeOperation;\n (a !== 1 || p === "hollow") && (e.globalCompositeOperation = "destination-out", s.colorFillStyle(e, 255, 255, 255, 1), s.colorStrokeStyle(e, 255, 255, 255, 1), s.drawArrowShape(t, e, c, d, l, n, o, i), e.globalCompositeOperation = h);\n var b = t.pstyle(r + "-arrow-color").value;\n s.colorFillStyle(e, b[0], b[1], b[2], a), s.colorStrokeStyle(e, b[0], b[1], b[2], a), s.drawArrowShape(t, e, p, d, l, n, o, i);\n }\n }\n};\nLi.drawArrowShape = function(e, t, r, n, o, i, a, s) {\n var l = this, c = this.usePaths() && o !== "triangle-cross", p = !1, d, u = t, h = {\n x: i,\n y: a\n }, b = e.pstyle("arrow-scale").value, M = this.getArrowWidth(n, b), C = l.arrowShapes[o];\n if (c) {\n var g = l.arrowPathCache = l.arrowPathCache || [], f = fi(o), O = g[f];\n O != null ? (d = t = O, p = !0) : (d = t = new Path2D(), g[f] = d);\n }\n p || (t.beginPath && t.beginPath(), c ? C.draw(t, 1, 0, {\n x: 0,\n y: 0\n }, 1) : C.draw(t, M, s, h, n), t.closePath && t.closePath()), t = u, c && (t.translate(i, a), t.rotate(s), t.scale(M, M)), (r === "filled" || r === "both") && (c ? t.fill(d) : t.fill()), (r === "hollow" || r === "both") && (t.lineWidth = (C.matchEdgeWidth ? n : 1) / (c ? M : 1), t.lineJoin = "miter", c ? t.stroke(d) : t.stroke()), c && (t.scale(1 / M, 1 / M), t.rotate(-s), t.translate(-i, -a));\n};\nvar td = {};\ntd.safeDrawImage = function(e, t, r, n, o, i, a, s, l, c) {\n o <= 0 || i <= 0 || l <= 0 || c <= 0 || e.drawImage(t, r, n, o, i, a, s, l, c);\n};\ntd.drawInscribedImage = function(e, t, r, n, o) {\n var i = this, a = r.position(), s = a.x, l = a.y, c = r.cy().style(), p = c.getIndexedStyle.bind(c), d = p(r, "background-fit", "value", n), u = p(r, "background-repeat", "value", n), h = r.width(), b = r.height(), M = r.padding() * 2, C = h + (p(r, "background-width-relative-to", "value", n) === "inner" ? 0 : M), g = b + (p(r, "background-height-relative-to", "value", n) === "inner" ? 0 : M), f = r._private.rscratch, O = p(r, "background-clip", "value", n), m = O === "node", v = p(r, "background-image-opacity", "value", n) * o, y = t.width || t.cachedW, z = t.height || t.cachedH;\n (y == null || z == null) && (document.body.appendChild(t), y = t.cachedW = t.width || t.offsetWidth, z = t.cachedH = t.height || t.offsetHeight, document.body.removeChild(t));\n var N = y, W = z;\n if (p(r, "background-width", "value", n) !== "auto" && (p(r, "background-width", "units", n) === "%" ? N = p(r, "background-width", "pfValue", n) * C : N = p(r, "background-width", "pfValue", n)), p(r, "background-height", "value", n) !== "auto" && (p(r, "background-height", "units", n) === "%" ? W = p(r, "background-height", "pfValue", n) * g : W = p(r, "background-height", "pfValue", n)), !(N === 0 || W === 0)) {\n if (d === "contain") {\n var T = Math.min(C / N, g / W);\n N *= T, W *= T;\n } else if (d === "cover") {\n var T = Math.max(C / N, g / W);\n N *= T, W *= T;\n }\n var x = s - C / 2, E = p(r, "background-position-x", "units", n), L = p(r, "background-position-x", "pfValue", n);\n E === "%" ? x += (C - N) * L : x += L;\n var w = p(r, "background-offset-x", "units", n), q = p(r, "background-offset-x", "pfValue", n);\n w === "%" ? x += (C - N) * q : x += q;\n var S = l - g / 2, B = p(r, "background-position-y", "units", n), I = p(r, "background-position-y", "pfValue", n);\n B === "%" ? S += (g - W) * I : S += I;\n var P = p(r, "background-offset-y", "units", n), k = p(r, "background-offset-y", "pfValue", n);\n P === "%" ? S += (g - W) * k : S += k, f.pathCache && (x -= s, S -= l, s = 0, l = 0);\n var K = e.globalAlpha;\n if (e.globalAlpha = v, u === "no-repeat")\n m && (e.save(), f.pathCache ? e.clip(f.pathCache) : (i.nodeShapes[i.getNodeShape(r)].draw(e, s, l, C, g), e.clip())), i.safeDrawImage(e, t, 0, 0, y, z, x, S, N, W), m && e.restore();\n else {\n var $ = e.createPattern(t, u);\n e.fillStyle = $, i.nodeShapes[i.getNodeShape(r)].draw(e, s, l, C, g), e.translate(x, S), e.fill(), e.translate(-x, -S);\n }\n e.globalAlpha = K;\n }\n};\nvar wi = {};\nwi.eleTextBiggerThanMin = function(e, t) {\n if (!t) {\n var r = e.cy().zoom(), n = this.getPixelRatio(), o = Math.ceil(U9(r * n));\n t = Math.pow(2, o);\n }\n var i = e.pstyle("font-size").pfValue * t, a = e.pstyle("min-zoomed-font-size").pfValue;\n return !(i < a);\n};\nwi.drawElementText = function(e, t, r, n, o) {\n var i = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : !0, a = this;\n if (n == null) {\n if (i && !a.eleTextBiggerThanMin(t))\n return;\n } else if (n === !1)\n return;\n if (t.isNode()) {\n var s = t.pstyle("label");\n if (!s || !s.value)\n return;\n var l = a.getLabelJustification(t);\n e.textAlign = l, e.textBaseline = "bottom";\n } else {\n var c = t.element()._private.rscratch.badLine, p = t.pstyle("label"), d = t.pstyle("source-label"), u = t.pstyle("target-label");\n if (c || (!p || !p.value) && (!d || !d.value) && (!u || !u.value))\n return;\n e.textAlign = "center", e.textBaseline = "bottom";\n }\n var h = !r, b;\n r && (b = r, e.translate(-b.x1, -b.y1)), o == null ? (a.drawText(e, t, null, h, i), t.isEdge() && (a.drawText(e, t, "source", h, i), a.drawText(e, t, "target", h, i))) : a.drawText(e, t, o, h, i), r && e.translate(b.x1, b.y1);\n};\nwi.getFontCache = function(e) {\n var t;\n this.fontCaches = this.fontCaches || [];\n for (var r = 0; r < this.fontCaches.length; r++)\n if (t = this.fontCaches[r], t.context === e)\n return t;\n return t = {\n context: e\n }, this.fontCaches.push(t), t;\n};\nwi.setupTextStyle = function(e, t) {\n var r = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : !0, n = t.pstyle("font-style").strValue, o = t.pstyle("font-size").pfValue + "px", i = t.pstyle("font-family").strValue, a = t.pstyle("font-weight").strValue, s = r ? t.effectiveOpacity() * t.pstyle("text-opacity").value : 1, l = t.pstyle("text-outline-opacity").value * s, c = t.pstyle("color").value, p = t.pstyle("text-outline-color").value;\n e.font = n + " " + a + " " + o + " " + i, e.lineJoin = "round", this.colorFillStyle(e, c[0], c[1], c[2], s), this.colorStrokeStyle(e, p[0], p[1], p[2], l);\n};\nfunction in1(e, t, r, n, o) {\n var i = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : 5;\n e.beginPath(), e.moveTo(t + i, r), e.lineTo(t + n - i, r), e.quadraticCurveTo(t + n, r, t + n, r + i), e.lineTo(t + n, r + o - i), e.quadraticCurveTo(t + n, r + o, t + n - i, r + o), e.lineTo(t + i, r + o), e.quadraticCurveTo(t, r + o, t, r + o - i), e.lineTo(t, r + i), e.quadraticCurveTo(t, r, t + i, r), e.closePath(), e.fill();\n}\nwi.getTextAngle = function(e, t) {\n var r, n = e._private, o = n.rscratch, i = t ? t + "-" : "", a = e.pstyle(i + "text-rotation"), s = hr(o, "labelAngle", t);\n return a.strValue === "autorotate" ? r = e.isEdge() ? s : 0 : a.strValue === "none" ? r = 0 : r = a.pfValue, r;\n};\nwi.drawText = function(e, t, r) {\n var n = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : !0, o = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : !0, i = t._private, a = i.rscratch, s = o ? t.effectiveOpacity() : 1;\n if (!(o && (s === 0 || t.pstyle("text-opacity").value === 0))) {\n r === "main" && (r = null);\n var l = hr(a, "labelX", r), c = hr(a, "labelY", r), p, d, u = this.getLabelText(t, r);\n if (u != null && u !== "" && !isNaN(l) && !isNaN(c)) {\n this.setupTextStyle(e, t, o);\n var h = r ? r + "-" : "", b = hr(a, "labelWidth", r), M = hr(a, "labelHeight", r), C = t.pstyle(h + "text-margin-x").pfValue, g = t.pstyle(h + "text-margin-y").pfValue, f = t.isEdge(), O = t.pstyle("text-halign").value, m = t.pstyle("text-valign").value;\n f && (O = "center", m = "center"), l += C, c += g;\n var v;\n switch (n ? v = this.getTextAngle(t, r) : v = 0, v !== 0 && (p = l, d = c, e.translate(p, d), e.rotate(v), l = 0, c = 0), m) {\n case "top":\n break;\n case "center":\n c += M / 2;\n break;\n case "bottom":\n c += M;\n break;\n }\n var y = t.pstyle("text-background-opacity").value, z = t.pstyle("text-border-opacity").value, N = t.pstyle("text-border-width").pfValue, W = t.pstyle("text-background-padding").pfValue;\n if (y > 0 || N > 0 && z > 0) {\n var T = l - W;\n switch (O) {\n case "left":\n T -= b;\n break;\n case "center":\n T -= b / 2;\n break;\n }\n var x = c - M - W, E = b + 2 * W, L = M + 2 * W;\n if (y > 0) {\n var w = e.fillStyle, q = t.pstyle("text-background-color").value;\n e.fillStyle = "rgba(" + q[0] + "," + q[1] + "," + q[2] + "," + y * s + ")";\n var S = t.pstyle("text-background-shape").strValue;\n S.indexOf("round") === 0 ? in1(e, T, x, E, L, 2) : e.fillRect(T, x, E, L), e.fillStyle = w;\n }\n if (N > 0 && z > 0) {\n var B = e.strokeStyle, I = e.lineWidth, P = t.pstyle("text-border-color").value, k = t.pstyle("text-border-style").value;\n if (e.strokeStyle = "rgba(" + P[0] + "," + P[1] + "," + P[2] + "," + z * s + ")", e.lineWidth = N, e.setLineDash)\n switch (k) {\n case "dotted":\n e.setLineDash([1, 1]);\n break;\n case "dashed":\n e.setLineDash([4, 2]);\n break;\n case "double":\n e.lineWidth = N / 4, e.setLineDash([]);\n break;\n case "solid":\n e.setLineDash([]);\n break;\n }\n if (e.strokeRect(T, x, E, L), k === "double") {\n var K = N / 2;\n e.strokeRect(T + K, x + K, E - K * 2, L - K * 2);\n }\n e.setLineDash && e.setLineDash([]), e.lineWidth = I, e.strokeStyle = B;\n }\n }\n var $ = 2 * t.pstyle("text-outline-width").pfValue;\n if ($ > 0 && (e.lineWidth = $), t.pstyle("text-wrap").value === "wrap") {\n var j = hr(a, "labelWrapCachedLines", r), r1 = hr(a, "labelLineHeight", r), a1 = b / 2, _ = this.getLabelJustification(t);\n switch (_ === "auto" || (O === "left" ? _ === "left" ? l += -b : _ === "center" && (l += -a1) : O === "center" ? _ === "left" ? l += -a1 : _ === "right" && (l += a1) : O === "right" && (_ === "center" ? l += a1 : _ === "right" && (l += b))), m) {\n case "top":\n c -= (j.length - 1) * r1;\n break;\n case "center":\n case "bottom":\n c -= (j.length - 1) * r1;\n break;\n }\n for (var Y = 0; Y < j.length; Y++)\n $ > 0 && e.strokeText(j[Y], l, c), e.fillText(j[Y], l, c), c += r1;\n } else\n $ > 0 && e.strokeText(u, l, c), e.fillText(u, l, c);\n v !== 0 && (e.rotate(-v), e.translate(-p, -d));\n }\n }\n};\nvar gs = {};\ngs.drawNode = function(e, t, r) {\n var n = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : !0, o = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : !0, i = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : !0, a = this, s, l, c = t._private, p = c.rscratch, d = t.position();\n if (!(!O0(d.x) || !O0(d.y)) && !(i && !t.visible())) {\n var u = i ? t.effectiveOpacity() : 1, h = a.usePaths(), b, M = !1, C = t.padding();\n s = t.width() + 2 * C, l = t.height() + 2 * C;\n var g;\n r && (g = r, e.translate(-g.x1, -g.y1));\n for (var f = t.pstyle("background-image"), O = f.value, m = new Array(O.length), v = new Array(O.length), y = 0, z = 0; z < O.length; z++) {\n var N = O[z], W = m[z] = N != null && N !== "none";\n if (W) {\n var T = t.cy().style().getIndexedStyle(t, "background-image-crossorigin", "value", z);\n y++, v[z] = a.getCachedImage(N, T, function() {\n c.backgroundTimestamp = Date.now(), t.emitAndNotify("background");\n });\n }\n }\n var x = t.pstyle("background-blacken").value, E = t.pstyle("border-width").pfValue, L = t.pstyle("background-opacity").value * u, w = t.pstyle("border-color").value, q = t.pstyle("border-style").value, S = t.pstyle("border-opacity").value * u;\n e.lineJoin = "miter";\n var B = function() {\n var n1 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : L;\n a.eleFillStyle(e, t, n1);\n }, I = function() {\n var n1 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : S;\n a.colorStrokeStyle(e, w[0], w[1], w[2], n1);\n }, P = t.pstyle("shape").strValue, k = t.pstyle("shape-polygon-points").pfValue;\n if (h) {\n e.translate(d.x, d.y);\n var K = a.nodePathCache = a.nodePathCache || [], $ = iO(P === "polygon" ? P + "," + k.join(",") : P, "" + l, "" + s), j = K[$];\n j != null ? (b = j, M = !0, p.pathCache = b) : (b = new Path2D(), K[$] = p.pathCache = b);\n }\n var r1 = function() {\n if (!M) {\n var n1 = d;\n h && (n1 = {\n x: 0,\n y: 0\n }), a.nodeShapes[a.getNodeShape(t)].draw(b || e, n1.x, n1.y, s, l);\n }\n h ? e.fill(b) : e.fill();\n }, a1 = function() {\n for (var n1 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : u, U = c.backgrounding, e1 = 0, o1 = 0; o1 < v.length; o1++)\n m[o1] && v[o1].complete && !v[o1].error && (e1++, a.drawInscribedImage(e, v[o1], t, o1, n1));\n c.backgrounding = e1 !== y, U !== c.backgrounding && t.updateStyle(!1);\n }, _ = function() {\n var n1 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : !1, U = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : u;\n a.hasPie(t) && (a.drawPie(e, t, U), n1 && (h || a.nodeShapes[a.getNodeShape(t)].draw(e, d.x, d.y, s, l)));\n }, Y = function() {\n var n1 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : u, U = (x > 0 ? x : -x) * n1, e1 = x > 0 ? 0 : 255;\n x !== 0 && (a.colorFillStyle(e, e1, e1, e1, U), h ? e.fill(b) : e.fill());\n }, D = function() {\n if (E > 0) {\n if (e.lineWidth = E, e.lineCap = "butt", e.setLineDash)\n switch (q) {\n case "dotted":\n e.setLineDash([1, 1]);\n break;\n case "dashed":\n e.setLineDash([4, 2]);\n break;\n case "solid":\n case "double":\n e.setLineDash([]);\n break;\n }\n if (h ? e.stroke(b) : e.stroke(), q === "double") {\n e.lineWidth = E / 3;\n var n1 = e.globalCompositeOperation;\n e.globalCompositeOperation = "destination-out", h ? e.stroke(b) : e.stroke(), e.globalCompositeOperation = n1;\n }\n e.setLineDash && e.setLineDash([]);\n }\n }, H = function() {\n o && a.drawNodeOverlay(e, t, d, s, l);\n }, G = function() {\n a.drawElementText(e, t, null, n);\n }, J = t.pstyle("ghost").value === "yes";\n if (J) {\n var F = t.pstyle("ghost-offset-x").pfValue, V = t.pstyle("ghost-offset-y").pfValue, Q = t.pstyle("ghost-opacity").value, Z = Q * u;\n e.translate(F, V), B(Q * L), r1(), a1(Z), _(x !== 0 || E !== 0), Y(Z), I(Q * S), D(), e.translate(-F, -V);\n }\n B(), r1(), a1(), _(x !== 0 || E !== 0), Y(), I(), D(), h && e.translate(-d.x, -d.y), G(), H(), r && e.translate(g.x1, g.y1);\n }\n};\ngs.drawNodeOverlay = function(e, t, r, n, o) {\n var i = this;\n if (t.visible()) {\n var a = t.pstyle("overlay-padding").pfValue, s = t.pstyle("overlay-opacity").value, l = t.pstyle("overlay-color").value;\n if (s > 0) {\n if (r = r || t.position(), n == null || o == null) {\n var c = t.padding();\n n = t.width() + 2 * c, o = t.height() + 2 * c;\n }\n i.colorFillStyle(e, l[0], l[1], l[2], s), i.nodeShapes.roundrectangle.draw(e, r.x, r.y, n + a * 2, o + a * 2), e.fill();\n }\n }\n};\ngs.hasPie = function(e) {\n return e = e[0], e._private.hasPie;\n};\ngs.drawPie = function(e, t, r, n) {\n t = t[0], n = n || t.position();\n var o = t.cy().style(), i = t.pstyle("pie-size"), a = n.x, s = n.y, l = t.width(), c = t.height(), p = Math.min(l, c) / 2, d = 0, u = this.usePaths();\n u && (a = 0, s = 0), i.units === "%" ? p = p * i.pfValue : i.pfValue !== void 0 && (p = i.pfValue / 2);\n for (var h = 1; h <= o.pieBackgroundN; h++) {\n var b = t.pstyle("pie-" + h + "-background-size").value, M = t.pstyle("pie-" + h + "-background-color").value, C = t.pstyle("pie-" + h + "-background-opacity").value * r, g = b / 100;\n g + d > 1 && (g = 1 - d);\n var f = 1.5 * Math.PI + 2 * Math.PI * d, O = 2 * Math.PI * g, m = f + O;\n b === 0 || d >= 1 || d + g > 1 || (e.beginPath(), e.moveTo(a, s), e.arc(a, s, p, f, m), e.closePath(), this.colorFillStyle(e, M[0], M[1], M[2], C), e.fill(), d += g);\n }\n};\nvar P2 = {}, an1 = 100;\nP2.getPixelRatio = function() {\n var e = this.data.contexts[0];\n if (this.forcedPixelRatio != null)\n return this.forcedPixelRatio;\n var t = e.backingStorePixelRatio || e.webkitBackingStorePixelRatio || e.mozBackingStorePixelRatio || e.msBackingStorePixelRatio || e.oBackingStorePixelRatio || e.backingStorePixelRatio || 1;\n return (window.devicePixelRatio || 1) / t;\n};\nP2.paintCache = function(e) {\n for (var t = this.paintCaches = this.paintCaches || [], r = !0, n, o = 0; o < t.length; o++)\n if (n = t[o], n.context === e) {\n r = !1;\n break;\n }\n return r && (n = {\n context: e\n }, t.push(n)), n;\n};\nP2.createGradientStyleFor = function(e, t, r, n, o) {\n var i, a = this.usePaths(), s = r.pstyle(t + "-gradient-stop-colors").value, l = r.pstyle(t + "-gradient-stop-positions").pfValue;\n if (n === "radial-gradient")\n if (r.isEdge()) {\n var c = r.sourceEndpoint(), p = r.targetEndpoint(), d = r.midpoint(), u = gi(c, d), h = gi(p, d);\n i = e.createRadialGradient(d.x, d.y, 0, d.x, d.y, Math.max(u, h));\n } else {\n var b = a ? {\n x: 0,\n y: 0\n } : r.position(), M = r.paddedWidth(), C = r.paddedHeight();\n i = e.createRadialGradient(b.x, b.y, 0, b.x, b.y, Math.max(M, C));\n }\n else if (r.isEdge()) {\n var g = r.sourceEndpoint(), f = r.targetEndpoint();\n i = e.createLinearGradient(g.x, g.y, f.x, f.y);\n } else {\n var O = a ? {\n x: 0,\n y: 0\n } : r.position(), m = r.paddedWidth(), v = r.paddedHeight(), y = m / 2, z = v / 2, N = r.pstyle("background-gradient-direction").value;\n switch (N) {\n case "to-bottom":\n i = e.createLinearGradient(O.x, O.y - z, O.x, O.y + z);\n break;\n case "to-top":\n i = e.createLinearGradient(O.x, O.y + z, O.x, O.y - z);\n break;\n case "to-left":\n i = e.createLinearGradient(O.x + y, O.y, O.x - y, O.y);\n break;\n case "to-right":\n i = e.createLinearGradient(O.x - y, O.y, O.x + y, O.y);\n break;\n case "to-bottom-right":\n case "to-right-bottom":\n i = e.createLinearGradient(O.x - y, O.y - z, O.x + y, O.y + z);\n break;\n case "to-top-right":\n case "to-right-top":\n i = e.createLinearGradient(O.x - y, O.y + z, O.x + y, O.y - z);\n break;\n case "to-bottom-left":\n case "to-left-bottom":\n i = e.createLinearGradient(O.x + y, O.y - z, O.x - y, O.y + z);\n break;\n case "to-top-left":\n case "to-left-top":\n i = e.createLinearGradient(O.x + y, O.y + z, O.x - y, O.y - z);\n break;\n }\n }\n if (!i)\n return null;\n for (var W = l.length === s.length, T = s.length, x = 0; x < T; x++)\n i.addColorStop(W ? l[x] : x / (T - 1), "rgba(" + s[x][0] + "," + s[x][1] + "," + s[x][2] + "," + o + ")");\n return i;\n};\nP2.gradientFillStyle = function(e, t, r, n) {\n var o = this.createGradientStyleFor(e, "background", t, r, n);\n if (!o)\n return null;\n e.fillStyle = o;\n};\nP2.colorFillStyle = function(e, t, r, n, o) {\n e.fillStyle = "rgba(" + t + "," + r + "," + n + "," + o + ")";\n};\nP2.eleFillStyle = function(e, t, r) {\n var n = t.pstyle("background-fill").value;\n if (n === "linear-gradient" || n === "radial-gradient")\n this.gradientFillStyle(e, t, n, r);\n else {\n var o = t.pstyle("background-color").value;\n this.colorFillStyle(e, o[0], o[1], o[2], r);\n }\n};\nP2.gradientStrokeStyle = function(e, t, r, n) {\n var o = this.createGradientStyleFor(e, "line", t, r, n);\n if (!o)\n return null;\n e.strokeStyle = o;\n};\nP2.colorStrokeStyle = function(e, t, r, n, o) {\n e.strokeStyle = "rgba(" + t + "," + r + "," + n + "," + o + ")";\n};\nP2.eleStrokeStyle = function(e, t, r) {\n var n = t.pstyle("line-fill").value;\n if (n === "linear-gradient" || n === "radial-gradient")\n this.gradientStrokeStyle(e, t, n, r);\n else {\n var o = t.pstyle("line-color").value;\n this.colorStrokeStyle(e, o[0], o[1], o[2], r);\n }\n};\nP2.matchCanvasSize = function(e) {\n var t = this, r = t.data, n = t.findContainerClientCoords(), o = n[2], i = n[3], a = t.getPixelRatio(), s = t.motionBlurPxRatio;\n (e === t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_NODE] || e === t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_DRAG]) && (a = s);\n var l = o * a, c = i * a, p;\n if (!(l === t.canvasWidth && c === t.canvasHeight)) {\n t.fontCaches = null;\n var d = r.canvasContainer;\n d.style.width = o + "px", d.style.height = i + "px";\n for (var u = 0; u < t.CANVAS_LAYERS; u++)\n p = r.canvases[u], p.width = l, p.height = c, p.style.width = o + "px", p.style.height = i + "px";\n for (var u = 0; u < t.BUFFER_COUNT; u++)\n p = r.bufferCanvases[u], p.width = l, p.height = c, p.style.width = o + "px", p.style.height = i + "px";\n t.textureMult = 1, a <= 1 && (p = r.bufferCanvases[t.TEXTURE_BUFFER], t.textureMult = 2, p.width = l * t.textureMult, p.height = c * t.textureMult), t.canvasWidth = l, t.canvasHeight = c;\n }\n};\nP2.renderTo = function(e, t, r, n) {\n this.render({\n forcedContext: e,\n forcedZoom: t,\n forcedPan: r,\n drawAllLayers: !0,\n forcedPxRatio: n\n });\n};\nP2.render = function(e) {\n e = e || cO();\n var t = e.forcedContext, r = e.drawAllLayers, n = e.drawOnlyNodeLayer, o = e.forcedZoom, i = e.forcedPan, a = this, s = e.forcedPxRatio === void 0 ? this.getPixelRatio() : e.forcedPxRatio, l = a.cy, c = a.data, p = c.canvasNeedsRedraw, d = a.textureOnViewport && !t && (a.pinching || a.hoverData.dragging || a.swipePanning || a.data.wheelZooming), u = e.motionBlur !== void 0 ? e.motionBlur : a.motionBlur, h = a.motionBlurPxRatio, b = l.hasCompoundNodes(), M = a.hoverData.draggingEles, C = !!(a.hoverData.selecting || a.touchData.selecting);\n u = u && !t && a.motionBlurEnabled && !C;\n var g = u;\n t || (a.prevPxRatio !== s && (a.invalidateContainerClientCoordsCache(), a.matchCanvasSize(a.container), a.redrawHint("eles", !0), a.redrawHint("drag", !0)), a.prevPxRatio = s), !t && a.motionBlurTimeout && clearTimeout(a.motionBlurTimeout), u && (a.mbFrames == null && (a.mbFrames = 0), a.mbFrames++, a.mbFrames < 3 && (g = !1), a.mbFrames > a.minMbLowQualFrames && (a.motionBlurPxRatio = a.mbPxRBlurry)), a.clearingMotionBlur && (a.motionBlurPxRatio = 1), a.textureDrawLastFrame && !d && (p[a.NODE] = !0, p[a.SELECT_BOX] = !0);\n var f = l.style(), O = l.zoom(), m = o !== void 0 ? o : O, v = l.pan(), y = {\n x: v.x,\n y: v.y\n }, z = {\n zoom: O,\n pan: {\n x: v.x,\n y: v.y\n }\n }, N = a.prevViewport, W = N === void 0 || z.zoom !== N.zoom || z.pan.x !== N.pan.x || z.pan.y !== N.pan.y;\n !W && !(M && !b) && (a.motionBlurPxRatio = 1), i && (y = i), m *= s, y.x *= s, y.y *= s;\n var T = a.getCachedZSortedEles();\n function x(Q, Z, t1, n1, U) {\n var e1 = Q.globalCompositeOperation;\n Q.globalCompositeOperation = "destination-out", a.colorFillStyle(Q, 255, 255, 255, a.motionBlurTransparency), Q.fillRect(Z, t1, n1, U), Q.globalCompositeOperation = e1;\n }\n function E(Q, Z) {\n var t1, n1, U, e1;\n !a.clearingMotionBlur && (Q === c.bufferContexts[a.MOTIONBLUR_BUFFER_NODE] || Q === c.bufferContexts[a.MOTIONBLUR_BUFFER_DRAG]) ? (t1 = {\n x: v.x * h,\n y: v.y * h\n }, n1 = O * h, U = a.canvasWidth * h, e1 = a.canvasHeight * h) : (t1 = y, n1 = m, U = a.canvasWidth, e1 = a.canvasHeight), Q.setTransform(1, 0, 0, 1, 0, 0), Z === "motionBlur" ? x(Q, 0, 0, U, e1) : !t && (Z === void 0 || Z) && Q.clearRect(0, 0, U, e1), r || (Q.translate(t1.x, t1.y), Q.scale(n1, n1)), i && Q.translate(i.x, i.y), o && Q.scale(o, o);\n }\n if (d || (a.textureDrawLastFrame = !1), d) {\n if (a.textureDrawLastFrame = !0, !a.textureCache) {\n a.textureCache = {}, a.textureCache.bb = l.mutableElements().boundingBox(), a.textureCache.texture = a.data.bufferCanvases[a.TEXTURE_BUFFER];\n var L = a.data.bufferContexts[a.TEXTURE_BUFFER];\n L.setTransform(1, 0, 0, 1, 0, 0), L.clearRect(0, 0, a.canvasWidth * a.textureMult, a.canvasHeight * a.textureMult), a.render({\n forcedContext: L,\n drawOnlyNodeLayer: !0,\n forcedPxRatio: s * a.textureMult\n });\n var z = a.textureCache.viewport = {\n zoom: l.zoom(),\n pan: l.pan(),\n width: a.canvasWidth,\n height: a.canvasHeight\n };\n z.mpan = {\n x: (0 - z.pan.x) / z.zoom,\n y: (0 - z.pan.y) / z.zoom\n };\n }\n p[a.DRAG] = !1, p[a.NODE] = !1;\n var w = c.contexts[a.NODE], q = a.textureCache.texture, z = a.textureCache.viewport;\n w.setTransform(1, 0, 0, 1, 0, 0), u ? x(w, 0, 0, z.width, z.height) : w.clearRect(0, 0, z.width, z.height);\n var S = f.core("outside-texture-bg-color").value, B = f.core("outside-texture-bg-opacity").value;\n a.colorFillStyle(w, S[0], S[1], S[2], B), w.fillRect(0, 0, z.width, z.height);\n var O = l.zoom();\n E(w, !1), w.clearRect(z.mpan.x, z.mpan.y, z.width / z.zoom / s, z.height / z.zoom / s), w.drawImage(q, z.mpan.x, z.mpan.y, z.width / z.zoom / s, z.height / z.zoom / s);\n } else\n a.textureOnViewport && !t && (a.textureCache = null);\n var I = l.extent(), P = a.pinching || a.hoverData.dragging || a.swipePanning || a.data.wheelZooming || a.hoverData.draggingEles || a.cy.animated(), k = a.hideEdgesOnViewport && P, K = [];\n if (K[a.NODE] = !p[a.NODE] && u && !a.clearedForMotionBlur[a.NODE] || a.clearingMotionBlur, K[a.NODE] && (a.clearedForMotionBlur[a.NODE] = !0), K[a.DRAG] = !p[a.DRAG] && u && !a.clearedForMotionBlur[a.DRAG] || a.clearingMotionBlur, K[a.DRAG] && (a.clearedForMotionBlur[a.DRAG] = !0), p[a.NODE] || r || n || K[a.NODE]) {\n var $ = u && !K[a.NODE] && h !== 1, w = t || ($ ? a.data.bufferContexts[a.MOTIONBLUR_BUFFER_NODE] : c.contexts[a.NODE]), j = u && !$ ? "motionBlur" : void 0;\n E(w, j), k ? a.drawCachedNodes(w, T.nondrag, s, I) : a.drawLayeredElements(w, T.nondrag, s, I), a.debug && a.drawDebugPoints(w, T.nondrag), !r && !u && (p[a.NODE] = !1);\n }\n if (!n && (p[a.DRAG] || r || K[a.DRAG])) {\n var $ = u && !K[a.DRAG] && h !== 1, w = t || ($ ? a.data.bufferContexts[a.MOTIONBLUR_BUFFER_DRAG] : c.contexts[a.DRAG]);\n E(w, u && !$ ? "motionBlur" : void 0), k ? a.drawCachedNodes(w, T.drag, s, I) : a.drawCachedElements(w, T.drag, s, I), a.debug && a.drawDebugPoints(w, T.drag), !r && !u && (p[a.DRAG] = !1);\n }\n if (a.showFps || !n && p[a.SELECT_BOX] && !r) {\n var w = t || c.contexts[a.SELECT_BOX];\n if (E(w), a.selection[4] == 1 && (a.hoverData.selecting || a.touchData.selecting)) {\n var O = a.cy.zoom(), r1 = f.core("selection-box-border-width").value / O;\n w.lineWidth = r1, w.fillStyle = "rgba(" + f.core("selection-box-color").value[0] + "," + f.core("selection-box-color").value[1] + "," + f.core("selection-box-color").value[2] + "," + f.core("selection-box-opacity").value + ")", w.fillRect(a.selection[0], a.selection[1], a.selection[2] - a.selection[0], a.selection[3] - a.selection[1]), r1 > 0 && (w.strokeStyle = "rgba(" + f.core("selection-box-border-color").value[0] + "," + f.core("selection-box-border-color").value[1] + "," + f.core("selection-box-border-color").value[2] + "," + f.core("selection-box-opacity").value + ")", w.strokeRect(a.selection[0], a.selection[1], a.selection[2] - a.selection[0], a.selection[3] - a.selection[1]));\n }\n if (c.bgActivePosistion && !a.hoverData.selecting) {\n var O = a.cy.zoom(), a1 = c.bgActivePosistion;\n w.fillStyle = "rgba(" + f.core("active-bg-color").value[0] + "," + f.core("active-bg-color").value[1] + "," + f.core("active-bg-color").value[2] + "," + f.core("active-bg-opacity").value + ")", w.beginPath(), w.arc(a1.x, a1.y, f.core("active-bg-size").pfValue / O, 0, 2 * Math.PI), w.fill();\n }\n var _ = a.lastRedrawTime;\n if (a.showFps && _) {\n _ = Math.round(_);\n var Y = Math.round(1e3 / _);\n w.setTransform(1, 0, 0, 1, 0, 0), w.fillStyle = "rgba(255, 0, 0, 0.75)", w.strokeStyle = "rgba(255, 0, 0, 0.75)", w.lineWidth = 1, w.fillText("1 frame = " + _ + " ms = " + Y + " fps", 0, 20);\n var D = 60;\n w.strokeRect(0, 30, 250, 20), w.fillRect(0, 30, 250 * Math.min(Y / D, 1), 20);\n }\n r || (p[a.SELECT_BOX] = !1);\n }\n if (u && h !== 1) {\n var H = c.contexts[a.NODE], G = a.data.bufferCanvases[a.MOTIONBLUR_BUFFER_NODE], J = c.contexts[a.DRAG], F = a.data.bufferCanvases[a.MOTIONBLUR_BUFFER_DRAG], V = function(Z, t1, n1) {\n Z.setTransform(1, 0, 0, 1, 0, 0), n1 || !g ? Z.clearRect(0, 0, a.canvasWidth, a.canvasHeight) : x(Z, 0, 0, a.canvasWidth, a.canvasHeight);\n var U = h;\n Z.drawImage(\n t1,\n // img\n 0,\n 0,\n // sx, sy\n a.canvasWidth * U,\n a.canvasHeight * U,\n // sw, sh\n 0,\n 0,\n // x, y\n a.canvasWidth,\n a.canvasHeight\n // w, h\n );\n };\n (p[a.NODE] || K[a.NODE]) && (V(H, G, K[a.NODE]), p[a.NODE] = !1), (p[a.DRAG] || K[a.DRAG]) && (V(J, F, K[a.DRAG]), p[a.DRAG] = !1);\n }\n a.prevViewport = z, a.clearingMotionBlur && (a.clearingMotionBlur = !1, a.motionBlurCleared = !0, a.motionBlur = !0), u && (a.motionBlurTimeout = setTimeout(function() {\n a.motionBlurTimeout = null, a.clearedForMotionBlur[a.NODE] = !1, a.clearedForMotionBlur[a.DRAG] = !1, a.motionBlur = !1, a.clearingMotionBlur = !d, a.mbFrames = 0, p[a.NODE] = !0, p[a.DRAG] = !0, a.redraw();\n }, an1)), t || l.emit("render");\n};\nvar So = {};\nSo.drawPolygonPath = function(e, t, r, n, o, i) {\n var a = n / 2, s = o / 2;\n e.beginPath && e.beginPath(), e.moveTo(t + a * i[0], r + s * i[1]);\n for (var l = 1; l < i.length / 2; l++)\n e.lineTo(t + a * i[l * 2], r + s * i[l * 2 + 1]);\n e.closePath();\n};\nSo.drawRoundPolygonPath = function(e, t, r, n, o, i) {\n var a = n / 2, s = o / 2, l = X9(n, o);\n e.beginPath && e.beginPath();\n for (var c = 0; c < i.length / 4; c++) {\n var p = void 0, d = void 0;\n c === 0 ? p = i.length - 2 : p = c * 4 - 2, d = c * 4 + 2;\n var u = t + a * i[c * 4], h = r + s * i[c * 4 + 1], b = -i[p] * i[d] - i[p + 1] * i[d + 1], M = l / Math.tan(Math.acos(b) / 2), C = u - M * i[p], g = h - M * i[p + 1], f = u + M * i[d], O = h + M * i[d + 1];\n c === 0 ? e.moveTo(C, g) : e.lineTo(C, g), e.arcTo(u, h, f, O, l);\n }\n e.closePath();\n};\nSo.drawRoundRectanglePath = function(e, t, r, n, o) {\n var i = n / 2, a = o / 2, s = us(n, o);\n e.beginPath && e.beginPath(), e.moveTo(t, r - a), e.arcTo(t + i, r - a, t + i, r, s), e.arcTo(t + i, r + a, t, r + a, s), e.arcTo(t - i, r + a, t - i, r, s), e.arcTo(t - i, r - a, t, r - a, s), e.lineTo(t, r - a), e.closePath();\n};\nSo.drawBottomRoundRectanglePath = function(e, t, r, n, o) {\n var i = n / 2, a = o / 2, s = us(n, o);\n e.beginPath && e.beginPath(), e.moveTo(t, r - a), e.lineTo(t + i, r - a), e.lineTo(t + i, r), e.arcTo(t + i, r + a, t, r + a, s), e.arcTo(t - i, r + a, t - i, r, s), e.lineTo(t - i, r - a), e.lineTo(t, r - a), e.closePath();\n};\nSo.drawCutRectanglePath = function(e, t, r, n, o) {\n var i = n / 2, a = o / 2, s = fO();\n e.beginPath && e.beginPath(), e.moveTo(t - i + s, r - a), e.lineTo(t + i - s, r - a), e.lineTo(t + i, r - a + s), e.lineTo(t + i, r + a - s), e.lineTo(t + i - s, r + a), e.lineTo(t - i + s, r + a), e.lineTo(t - i, r + a - s), e.lineTo(t - i, r - a + s), e.closePath();\n};\nSo.drawBarrelPath = function(e, t, r, n, o) {\n var i = n / 2, a = o / 2, s = t - i, l = t + i, c = r - a, p = r + a, d = F8(n, o), u = d.widthOffset, h = d.heightOffset, b = d.ctrlPtOffsetPct * u;\n e.beginPath && e.beginPath(), e.moveTo(s, c + h), e.lineTo(s, p - h), e.quadraticCurveTo(s + b, p, s + u, p), e.lineTo(l - u, p), e.quadraticCurveTo(l - b, p, l, p - h), e.lineTo(l, c + h), e.quadraticCurveTo(l - b, c, l - u, c), e.lineTo(s + u, c), e.quadraticCurveTo(s + b, c, s, c + h), e.closePath();\n};\nvar rM = Math.sin(0), nM = Math.cos(0), Z8 = {}, J8 = {}, cm = Math.PI / 40;\nfor (var Gi = 0 * Math.PI; Gi < 2 * Math.PI; Gi += cm)\n Z8[Gi] = Math.sin(Gi), J8[Gi] = Math.cos(Gi);\nSo.drawEllipsePath = function(e, t, r, n, o) {\n if (e.beginPath && e.beginPath(), e.ellipse)\n e.ellipse(t, r, n / 2, o / 2, 0, 0, 2 * Math.PI);\n else\n for (var i, a, s = n / 2, l = o / 2, c = 0 * Math.PI; c < 2 * Math.PI; c += cm)\n i = t - s * Z8[c] * rM + s * J8[c] * nM, a = r + l * J8[c] * rM + l * Z8[c] * nM, c === 0 ? e.moveTo(i, a) : e.lineTo(i, a);\n e.closePath();\n};\nvar zs = {};\nzs.createBuffer = function(e, t) {\n var r = document.createElement("canvas");\n return r.width = e, r.height = t, [r, r.getContext("2d")];\n};\nzs.bufferCanvasImage = function(e) {\n var t = this.cy, r = t.mutableElements(), n = r.boundingBox(), o = this.findContainerClientCoords(), i = e.full ? Math.ceil(n.w) : o[2], a = e.full ? Math.ceil(n.h) : o[3], s = O0(e.maxWidth) || O0(e.maxHeight), l = this.getPixelRatio(), c = 1;\n if (e.scale !== void 0)\n i *= e.scale, a *= e.scale, c = e.scale;\n else if (s) {\n var p = 1 / 0, d = 1 / 0;\n O0(e.maxWidth) && (p = c * e.maxWidth / i), O0(e.maxHeight) && (d = c * e.maxHeight / a), c = Math.min(p, d), i *= c, a *= c;\n }\n s || (i *= l, a *= l, c *= l);\n var u = document.createElement("canvas");\n u.width = i, u.height = a, u.style.width = i + "px", u.style.height = a + "px";\n var h = u.getContext("2d");\n if (i > 0 && a > 0) {\n h.clearRect(0, 0, i, a), h.globalCompositeOperation = "source-over";\n var b = this.getCachedZSortedEles();\n if (e.full)\n h.translate(-n.x1 * c, -n.y1 * c), h.scale(c, c), this.drawElements(h, b), h.scale(1 / c, 1 / c), h.translate(n.x1 * c, n.y1 * c);\n else {\n var M = t.pan(), C = {\n x: M.x * c,\n y: M.y * c\n };\n c *= t.zoom(), h.translate(C.x, C.y), h.scale(c, c), this.drawElements(h, b), h.scale(1 / c, 1 / c), h.translate(-C.x, -C.y);\n }\n e.bg && (h.globalCompositeOperation = "destination-over", h.fillStyle = e.bg, h.rect(0, 0, i, a), h.fill());\n }\n return u;\n};\nfunction sn1(e, t) {\n for (var r = atob(e), n = new ArrayBuffer(r.length), o = new Uint8Array(n), i = 0; i < r.length; i++)\n o[i] = r.charCodeAt(i);\n return new Blob([n], {\n type: t\n });\n}\nfunction oM(e) {\n var t = e.indexOf(",");\n return e.substr(t + 1);\n}\nfunction pm(e, t, r) {\n var n = function() {\n return t.toDataURL(r, e.quality);\n };\n switch (e.output) {\n case "blob-promise":\n return new Xa(function(o, i) {\n try {\n t.toBlob(function(a) {\n a != null ? o(a) : i(new Error("`canvas.toBlob()` sent a null value in its callback"));\n }, r, e.quality);\n } catch (a) {\n i(a);\n }\n });\n case "blob":\n return sn1(oM(n()), r);\n case "base64":\n return oM(n());\n case "base64uri":\n default:\n return n();\n }\n}\nzs.png = function(e) {\n return pm(e, this.bufferCanvasImage(e), "image/png");\n};\nzs.jpg = function(e) {\n return pm(e, this.bufferCanvasImage(e), "image/jpeg");\n};\nvar dm = {};\ndm.nodeShapeImpl = function(e, t, r, n, o, i, a) {\n switch (e) {\n case "ellipse":\n return this.drawEllipsePath(t, r, n, o, i);\n case "polygon":\n return this.drawPolygonPath(t, r, n, o, i, a);\n case "round-polygon":\n return this.drawRoundPolygonPath(t, r, n, o, i, a);\n case "roundrectangle":\n case "round-rectangle":\n return this.drawRoundRectanglePath(t, r, n, o, i);\n case "cutrectangle":\n case "cut-rectangle":\n return this.drawCutRectanglePath(t, r, n, o, i);\n case "bottomroundrectangle":\n case "bottom-round-rectangle":\n return this.drawBottomRoundRectanglePath(t, r, n, o, i);\n case "barrel":\n return this.drawBarrelPath(t, r, n, o, i);\n }\n};\nvar ln1 = Am, ye = Am.prototype;\nye.CANVAS_LAYERS = 3;\nye.SELECT_BOX = 0;\nye.DRAG = 1;\nye.NODE = 2;\nye.BUFFER_COUNT = 3;\nye.TEXTURE_BUFFER = 0;\nye.MOTIONBLUR_BUFFER_NODE = 1;\nye.MOTIONBLUR_BUFFER_DRAG = 2;\nfunction Am(e) {\n var t = this;\n t.data = {\n canvases: new Array(ye.CANVAS_LAYERS),\n contexts: new Array(ye.CANVAS_LAYERS),\n canvasNeedsRedraw: new Array(ye.CANVAS_LAYERS),\n bufferCanvases: new Array(ye.BUFFER_COUNT),\n bufferContexts: new Array(ye.CANVAS_LAYERS)\n };\n var r = "-webkit-tap-highlight-color", n = "rgba(0,0,0,0)";\n t.data.canvasContainer = document.createElement("div");\n var o = t.data.canvasContainer.style;\n t.data.canvasContainer.style[r] = n, o.position = "relative", o.zIndex = "0", o.overflow = "hidden";\n var i = e.cy.container();\n i.appendChild(t.data.canvasContainer), i.style[r] = n;\n var a = {\n "-webkit-user-select": "none",\n "-moz-user-select": "-moz-none",\n "user-select": "none",\n "-webkit-tap-highlight-color": "rgba(0,0,0,0)",\n "outline-style": "none"\n };\n Y01() && (a["-ms-touch-action"] = "none", a["touch-action"] = "none");\n for (var s = 0; s < ye.CANVAS_LAYERS; s++) {\n var l = t.data.canvases[s] = document.createElement("canvas");\n t.data.contexts[s] = l.getContext("2d"), Object.keys(a).forEach(function(_) {\n l.style[_] = a[_];\n }), l.style.position = "absolute", l.setAttribute("data-id", "layer" + s), l.style.zIndex = String(ye.CANVAS_LAYERS - s), t.data.canvasContainer.appendChild(l), t.data.canvasNeedsRedraw[s] = !1;\n }\n t.data.topCanvas = t.data.canvases[0], t.data.canvases[ye.NODE].setAttribute("data-id", "layer" + ye.NODE + "-node"), t.data.canvases[ye.SELECT_BOX].setAttribute("data-id", "layer" + ye.SELECT_BOX + "-selectbox"), t.data.canvases[ye.DRAG].setAttribute("data-id", "layer" + ye.DRAG + "-drag");\n for (var s = 0; s < ye.BUFFER_COUNT; s++)\n t.data.bufferCanvases[s] = document.createElement("canvas"), t.data.bufferContexts[s] = t.data.bufferCanvases[s].getContext("2d"), t.data.bufferCanvases[s].style.position = "absolute", t.data.bufferCanvases[s].setAttribute("data-id", "buffer" + s), t.data.bufferCanvases[s].style.zIndex = String(-s - 1), t.data.bufferCanvases[s].style.visibility = "hidden";\n t.pathsEnabled = !0;\n var c = w2(), p = function(Y) {\n return {\n x: (Y.x1 + Y.x2) / 2,\n y: (Y.y1 + Y.y2) / 2\n };\n }, d = function(Y) {\n return {\n x: -Y.w / 2,\n y: -Y.h / 2\n };\n }, u = function(Y) {\n var D = Y[0]._private, H = D.oldBackgroundTimestamp === D.backgroundTimestamp;\n return !H;\n }, h = function(Y) {\n return Y[0]._private.nodeKey;\n }, b = function(Y) {\n return Y[0]._private.labelStyleKey;\n }, M = function(Y) {\n return Y[0]._private.sourceLabelStyleKey;\n }, C = function(Y) {\n return Y[0]._private.targetLabelStyleKey;\n }, g = function(Y, D, H, G, J) {\n return t.drawElement(Y, D, H, !1, !1, J);\n }, f = function(Y, D, H, G, J) {\n return t.drawElementText(Y, D, H, G, "main", J);\n }, O = function(Y, D, H, G, J) {\n return t.drawElementText(Y, D, H, G, "source", J);\n }, m = function(Y, D, H, G, J) {\n return t.drawElementText(Y, D, H, G, "target", J);\n }, v = function(Y) {\n return Y.boundingBox(), Y[0]._private.bodyBounds;\n }, y = function(Y) {\n return Y.boundingBox(), Y[0]._private.labelBounds.main || c;\n }, z = function(Y) {\n return Y.boundingBox(), Y[0]._private.labelBounds.source || c;\n }, N = function(Y) {\n return Y.boundingBox(), Y[0]._private.labelBounds.target || c;\n }, W = function(Y, D) {\n return D;\n }, T = function(Y) {\n return p(v(Y));\n }, x = function(Y, D, H) {\n var G = Y ? Y + "-" : "";\n return {\n x: D.x + H.pstyle(G + "text-margin-x").pfValue,\n y: D.y + H.pstyle(G + "text-margin-y").pfValue\n };\n }, E = function(Y, D, H) {\n var G = Y[0]._private.rscratch;\n return {\n x: G[D],\n y: G[H]\n };\n }, L = function(Y) {\n return x("", E(Y, "labelX", "labelY"), Y);\n }, w = function(Y) {\n return x("source", E(Y, "sourceLabelX", "sourceLabelY"), Y);\n }, q = function(Y) {\n return x("target", E(Y, "targetLabelX", "targetLabelY"), Y);\n }, S = function(Y) {\n return d(v(Y));\n }, B = function(Y) {\n return d(z(Y));\n }, I = function(Y) {\n return d(N(Y));\n }, P = function(Y) {\n var D = y(Y), H = d(y(Y));\n if (Y.isNode()) {\n switch (Y.pstyle("text-halign").value) {\n case "left":\n H.x = -D.w;\n break;\n case "right":\n H.x = 0;\n break;\n }\n switch (Y.pstyle("text-valign").value) {\n case "top":\n H.y = -D.h;\n break;\n case "bottom":\n H.y = 0;\n break;\n }\n }\n return H;\n }, k = t.data.eleTxrCache = new U3(t, {\n getKey: h,\n doesEleInvalidateKey: u,\n drawElement: g,\n getBoundingBox: v,\n getRotationPoint: T,\n getRotationOffset: S,\n allowEdgeTxrCaching: !1,\n allowParentTxrCaching: !1\n }), K = t.data.lblTxrCache = new U3(t, {\n getKey: b,\n drawElement: f,\n getBoundingBox: y,\n getRotationPoint: L,\n getRotationOffset: P,\n isVisible: W\n }), $ = t.data.slbTxrCache = new U3(t, {\n getKey: M,\n drawElement: O,\n getBoundingBox: z,\n getRotationPoint: w,\n getRotationOffset: B,\n isVisible: W\n }), j = t.data.tlbTxrCache = new U3(t, {\n getKey: C,\n drawElement: m,\n getBoundingBox: N,\n getRotationPoint: q,\n getRotationOffset: I,\n isVisible: W\n }), r1 = t.data.lyrTxrCache = new sm(t);\n t.onUpdateEleCalcs(function(Y, D) {\n k.invalidateElements(D), K.invalidateElements(D), $.invalidateElements(D), j.invalidateElements(D), r1.invalidateElements(D);\n for (var H = 0; H < D.length; H++) {\n var G = D[H]._private;\n G.oldBackgroundTimestamp = G.backgroundTimestamp;\n }\n });\n var a1 = function(Y) {\n for (var D = 0; D < Y.length; D++)\n r1.enqueueElementRefinement(Y[D].ele);\n };\n k.onDequeue(a1), K.onDequeue(a1), $.onDequeue(a1), j.onDequeue(a1);\n}\nye.redrawHint = function(e, t) {\n var r = this;\n switch (e) {\n case "eles":\n r.data.canvasNeedsRedraw[ye.NODE] = t;\n break;\n case "drag":\n r.data.canvasNeedsRedraw[ye.DRAG] = t;\n break;\n case "select":\n r.data.canvasNeedsRedraw[ye.SELECT_BOX] = t;\n break;\n }\n};\nvar cn1 = typeof Path2D < "u";\nye.path2dEnabled = function(e) {\n if (e === void 0)\n return this.pathsEnabled;\n this.pathsEnabled = !!e;\n};\nye.usePaths = function() {\n return cn1 && this.pathsEnabled;\n};\nye.setImgSmoothing = function(e, t) {\n e.imageSmoothingEnabled != null ? e.imageSmoothingEnabled = t : (e.webkitImageSmoothingEnabled = t, e.mozImageSmoothingEnabled = t, e.msImageSmoothingEnabled = t);\n};\nye.getImgSmoothing = function(e) {\n return e.imageSmoothingEnabled != null ? e.imageSmoothingEnabled : e.webkitImageSmoothingEnabled || e.mozImageSmoothingEnabled || e.msImageSmoothingEnabled;\n};\nye.makeOffscreenCanvas = function(e, t) {\n var r;\n return (typeof OffscreenCanvas > "u" ? "undefined" : Ot(OffscreenCanvas)) !== "undefined" ? r = new OffscreenCanvas(e, t) : (r = document.createElement("canvas"), r.width = e, r.height = t), r;\n};\n[lm, Dn, Li, td, wi, gs, P2, So, zs, dm].forEach(function(e) {\n K0(ye, e);\n});\nvar pn1 = [{\n name: "null",\n impl: _O\n}, {\n name: "base",\n impl: im\n}, {\n name: "canvas",\n impl: ln1\n}], dn1 = [{\n type: "layout",\n extensions: gr1\n}, {\n type: "renderer",\n extensions: pn1\n}], um = {}, bm = {};\nfunction hm(e, t, r) {\n var n = r, o = function(N) {\n ct("Can not register `" + t + "` for `" + e + "` since `" + N + "` already exists in the prototype and can not be overridden");\n };\n if (e === "core") {\n if (H4.prototype[t])\n return o(t);\n H4.prototype[t] = r;\n } else if (e === "collection") {\n if (Ft.prototype[t])\n return o(t);\n Ft.prototype[t] = r;\n } else if (e === "layout") {\n for (var i = function(N) {\n this.options = N, r.call(this, N), Ce(this._private) || (this._private = {}), this._private.cy = N.cy, this._private.listeners = [], this.createEmitter();\n }, a = i.prototype = Object.create(r.prototype), s = [], l = 0; l < s.length; l++) {\n var c = s[l];\n a[c] = a[c] || function() {\n return this;\n };\n }\n a.start && !a.run ? a.run = function() {\n return this.start(), this;\n } : !a.start && a.run && (a.start = function() {\n return this.run(), this;\n });\n var p = r.prototype.stop;\n a.stop = function() {\n var z = this.options;\n if (z && z.animate) {\n var N = this.animations;\n if (N)\n for (var W = 0; W < N.length; W++)\n N[W].stop();\n }\n return p ? p.call(this) : this.emit("layoutstop"), this;\n }, a.destroy || (a.destroy = function() {\n return this;\n }), a.cy = function() {\n return this._private.cy;\n };\n var d = function(N) {\n return N._private.cy;\n }, u = {\n addEventFields: function(N, W) {\n W.layout = N, W.cy = d(N), W.target = N;\n },\n bubble: function() {\n return !0;\n },\n parent: function(N) {\n return d(N);\n }\n };\n K0(a, {\n createEmitter: function() {\n return this._private.emitter = new Vc(u, this), this;\n },\n emitter: function() {\n return this._private.emitter;\n },\n on: function(N, W) {\n return this.emitter().on(N, W), this;\n },\n one: function(N, W) {\n return this.emitter().one(N, W), this;\n },\n once: function(N, W) {\n return this.emitter().one(N, W), this;\n },\n removeListener: function(N, W) {\n return this.emitter().removeListener(N, W), this;\n },\n removeAllListeners: function() {\n return this.emitter().removeAllListeners(), this;\n },\n emit: function(N, W) {\n return this.emitter().emit(N, W), this;\n }\n }), Ee.eventAliasesOn(a), n = i;\n } else if (e === "renderer" && t !== "null" && t !== "base") {\n var h = Mm("renderer", "base"), b = h.prototype, M = r, C = r.prototype, g = function() {\n h.apply(this, arguments), M.apply(this, arguments);\n }, f = g.prototype;\n for (var O in b) {\n var m = b[O], v = C[O] != null;\n if (v)\n return o(O);\n f[O] = m;\n }\n for (var y in C)\n f[y] = C[y];\n b.clientFunctions.forEach(function(z) {\n f[z] = f[z] || function() {\n ct("Renderer does not implement `renderer." + z + "()` on its prototype");\n };\n }), n = g;\n }\n return eO({\n map: um,\n keys: [e, t],\n value: n\n });\n}\nfunction Mm(e, t) {\n return tO({\n map: um,\n keys: [e, t]\n });\n}\nfunction An1(e, t, r, n, o) {\n return eO({\n map: bm,\n keys: [e, t, r, n],\n value: o\n });\n}\nfunction un1(e, t, r, n) {\n return tO({\n map: bm,\n keys: [e, t, r, n]\n });\n}\nvar _8 = function() {\n if (arguments.length === 2)\n return Mm.apply(null, arguments);\n if (arguments.length === 3)\n return hm.apply(null, arguments);\n if (arguments.length === 4)\n return un1.apply(null, arguments);\n if (arguments.length === 5)\n return An1.apply(null, arguments);\n ct("Invalid extension access syntax");\n};\nH4.prototype.extension = _8;\ndn1.forEach(function(e) {\n e.extensions.forEach(function(t) {\n hm(e.type, t.name, t.impl);\n });\n});\nvar fm = function e() {\n if (!(this instanceof e))\n return new e();\n this.length = 0;\n}, Oi = fm.prototype;\nOi.instanceString = function() {\n return "stylesheet";\n};\nOi.selector = function(e) {\n var t = this.length++;\n return this[t] = {\n selector: e,\n properties: []\n }, this;\n};\nOi.css = function(e, t) {\n var r = this.length - 1;\n if (U0(e))\n this[r].properties.push({\n name: e,\n value: t\n });\n else if (Ce(e))\n for (var n = e, o = Object.keys(n), i = 0; i < o.length; i++) {\n var a = o[i], s = n[a];\n if (s != null) {\n var l = Gt.properties[a] || Gt.properties[Ic(a)];\n if (l != null) {\n var c = l.name, p = s;\n this[r].properties.push({\n name: c,\n value: p\n });\n }\n }\n }\n return this;\n};\nOi.style = Oi.css;\nOi.generateStyle = function(e) {\n var t = new Gt(e);\n return this.appendToStyle(t);\n};\nOi.appendToStyle = function(e) {\n for (var t = 0; t < this.length; t++) {\n var r = this[t], n = r.selector, o = r.properties;\n e.selector(n);\n for (var i = 0; i < o.length; i++) {\n var a = o[i];\n e.css(a.name, a.value);\n }\n }\n return e;\n};\nvar bn1 = "3.17.4", mi = function(t) {\n if (t === void 0 && (t = {}), Ce(t))\n return new H4(t);\n if (U0(t))\n return _8.apply(_8, arguments);\n};\nmi.use = function(e) {\n var t = Array.prototype.slice.call(arguments, 1);\n return t.unshift(mi), e.apply(null, t), this;\n};\nmi.warnings = function(e) {\n return sO(e);\n};\nmi.version = bn1;\nmi.stylesheet = mi.Stylesheet = fm;\nvar hn1 = mi;\nconst gm = /* @__PURE__ */ $t(hn1);\nvar zm = { exports: {} }, wp = { exports: {} };\n/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\nvar iM;\nfunction Mn1() {\n return iM || (iM = 1, function(e) {\n (function(t, r) {\n e.exports = t.document ? r(t, !0) : function(n) {\n if (!n.document)\n throw new Error("jQuery requires a window with a document");\n return r(n);\n };\n })(typeof window < "u" ? window : Cn, function(t, r) {\n var n = [], o = Object.getPrototypeOf, i = n.slice, a = n.flat ? function(R) {\n return n.flat.call(R);\n } : function(R) {\n return n.concat.apply([], R);\n }, s = n.push, l = n.indexOf, c = {}, p = c.toString, d = c.hasOwnProperty, u = d.toString, h = u.call(Object), b = {}, M = function(X) {\n return typeof X == "function" && typeof X.nodeType != "number" && typeof X.item != "function";\n }, C = function(X) {\n return X != null && X === X.window;\n }, g = t.document, f = {\n type: !0,\n src: !0,\n nonce: !0,\n noModule: !0\n };\n function O(R, X, i1) {\n i1 = i1 || g;\n var d1, f1, g1 = i1.createElement("script");\n if (g1.text = R, X)\n for (d1 in f)\n f1 = X[d1] || X.getAttribute && X.getAttribute(d1), f1 && g1.setAttribute(d1, f1);\n i1.head.appendChild(g1).parentNode.removeChild(g1);\n }\n function m(R) {\n return R == null ? R + "" : typeof R == "object" || typeof R == "function" ? c[p.call(R)] || "object" : typeof R;\n }\n var v = "3.7.1", y = /HTML$/i, z = function(R, X) {\n return new z.fn.init(R, X);\n };\n z.fn = z.prototype = {\n // The current version of jQuery being used\n jquery: v,\n constructor: z,\n // The default length of a jQuery object is 0\n length: 0,\n toArray: function() {\n return i.call(this);\n },\n // Get the Nth element in the matched element set OR\n // Get the whole matched element set as a clean array\n get: function(R) {\n return R == null ? i.call(this) : R < 0 ? this[R + this.length] : this[R];\n },\n // Take an array of elements and push it onto the stack\n // (returning the new matched element set)\n pushStack: function(R) {\n var X = z.merge(this.constructor(), R);\n return X.prevObject = this, X;\n },\n // Execute a callback for every element in the matched set.\n each: function(R) {\n return z.each(this, R);\n },\n map: function(R) {\n return this.pushStack(z.map(this, function(X, i1) {\n return R.call(X, i1, X);\n }));\n },\n slice: function() {\n return this.pushStack(i.apply(this, arguments));\n },\n first: function() {\n return this.eq(0);\n },\n last: function() {\n return this.eq(-1);\n },\n even: function() {\n return this.pushStack(z.grep(this, function(R, X) {\n return (X + 1) % 2;\n }));\n },\n odd: function() {\n return this.pushStack(z.grep(this, function(R, X) {\n return X % 2;\n }));\n },\n eq: function(R) {\n var X = this.length, i1 = +R + (R < 0 ? X : 0);\n return this.pushStack(i1 >= 0 && i1 < X ? [this[i1]] : []);\n },\n end: function() {\n return this.prevObject || this.constructor();\n },\n // For internal use only.\n // Behaves like an Array\'s method, not like a jQuery method.\n push: s,\n sort: n.sort,\n splice: n.splice\n }, z.extend = z.fn.extend = function() {\n var R, X, i1, d1, f1, g1, C1 = arguments[0] || {}, I1 = 1, W1 = arguments.length, U1 = !1;\n for (typeof C1 == "boolean" && (U1 = C1, C1 = arguments[I1] || {}, I1++), typeof C1 != "object" && !M(C1) && (C1 = {}), I1 === W1 && (C1 = this, I1--); I1 < W1; I1++)\n if ((R = arguments[I1]) != null)\n for (X in R)\n d1 = R[X], !(X === "__proto__" || C1 === d1) && (U1 && d1 && (z.isPlainObject(d1) || (f1 = Array.isArray(d1))) ? (i1 = C1[X], f1 && !Array.isArray(i1) ? g1 = [] : !f1 && !z.isPlainObject(i1) ? g1 = {} : g1 = i1, f1 = !1, C1[X] = z.extend(U1, g1, d1)) : d1 !== void 0 && (C1[X] = d1));\n return C1;\n }, z.extend({\n // Unique for each copy of jQuery on the page\n expando: "jQuery" + (v + Math.random()).replace(/\\D/g, ""),\n // Assume jQuery is ready without the ready module\n isReady: !0,\n error: function(R) {\n throw new Error(R);\n },\n noop: function() {\n },\n isPlainObject: function(R) {\n var X, i1;\n return !R || p.call(R) !== "[object Object]" ? !1 : (X = o(R), X ? (i1 = d.call(X, "constructor") && X.constructor, typeof i1 == "function" && u.call(i1) === h) : !0);\n },\n isEmptyObject: function(R) {\n var X;\n for (X in R)\n return !1;\n return !0;\n },\n // Evaluates a script in a provided context; falls back to the global one\n // if not specified.\n globalEval: function(R, X, i1) {\n O(R, { nonce: X && X.nonce }, i1);\n },\n each: function(R, X) {\n var i1, d1 = 0;\n if (N(R))\n for (i1 = R.length; d1 < i1 && X.call(R[d1], d1, R[d1]) !== !1; d1++)\n ;\n else\n for (d1 in R)\n if (X.call(R[d1], d1, R[d1]) === !1)\n break;\n return R;\n },\n // Retrieve the text value of an array of DOM nodes\n text: function(R) {\n var X, i1 = "", d1 = 0, f1 = R.nodeType;\n if (!f1)\n for (; X = R[d1++]; )\n i1 += z.text(X);\n return f1 === 1 || f1 === 11 ? R.textContent : f1 === 9 ? R.documentElement.textContent : f1 === 3 || f1 === 4 ? R.nodeValue : i1;\n },\n // results is for internal usage only\n makeArray: function(R, X) {\n var i1 = X || [];\n return R != null && (N(Object(R)) ? z.merge(\n i1,\n typeof R == "string" ? [R] : R\n ) : s.call(i1, R)), i1;\n },\n inArray: function(R, X, i1) {\n return X == null ? -1 : l.call(X, R, i1);\n },\n isXMLDoc: function(R) {\n var X = R && R.namespaceURI, i1 = R && (R.ownerDocument || R).documentElement;\n return !y.test(X || i1 && i1.nodeName || "HTML");\n },\n // Support: Android <=4.0 only, PhantomJS 1 only\n // push.apply(_, arraylike) throws on ancient WebKit\n merge: function(R, X) {\n for (var i1 = +X.length, d1 = 0, f1 = R.length; d1 < i1; d1++)\n R[f1++] = X[d1];\n return R.length = f1, R;\n },\n grep: function(R, X, i1) {\n for (var d1, f1 = [], g1 = 0, C1 = R.length, I1 = !i1; g1 < C1; g1++)\n d1 = !X(R[g1], g1), d1 !== I1 && f1.push(R[g1]);\n return f1;\n },\n // arg is for internal usage only\n map: function(R, X, i1) {\n var d1, f1, g1 = 0, C1 = [];\n if (N(R))\n for (d1 = R.length; g1 < d1; g1++)\n f1 = X(R[g1], g1, i1), f1 != null && C1.push(f1);\n else\n for (g1 in R)\n f1 = X(R[g1], g1, i1), f1 != null && C1.push(f1);\n return a(C1);\n },\n // A global GUID counter for objects\n guid: 1,\n // jQuery.support is not used in Core but other projects attach their\n // properties to it so it needs to exist.\n support: b\n }), typeof Symbol == "function" && (z.fn[Symbol.iterator] = n[Symbol.iterator]), z.each(\n "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),\n function(R, X) {\n c["[object " + X + "]"] = X.toLowerCase();\n }\n );\n function N(R) {\n var X = !!R && "length" in R && R.length, i1 = m(R);\n return M(R) || C(R) ? !1 : i1 === "array" || X === 0 || typeof X == "number" && X > 0 && X - 1 in R;\n }\n function W(R, X) {\n return R.nodeName && R.nodeName.toLowerCase() === X.toLowerCase();\n }\n var T = n.pop, x = n.sort, E = n.splice, L = "[\\\\x20\\\\t\\\\r\\\\n\\\\f]", w = new RegExp(\n "^" + L + "+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)" + L + "+$",\n "g"\n );\n z.contains = function(R, X) {\n var i1 = X && X.parentNode;\n return R === i1 || !!(i1 && i1.nodeType === 1 && // Support: IE 9 - 11+\n // IE doesn\'t have `contains` on SVG.\n (R.contains ? R.contains(i1) : R.compareDocumentPosition && R.compareDocumentPosition(i1) & 16));\n };\n var q = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n function S(R, X) {\n return X ? R === "\\0" ? "�" : R.slice(0, -1) + "\\\\" + R.charCodeAt(R.length - 1).toString(16) + " " : "\\\\" + R;\n }\n z.escapeSelector = function(R) {\n return (R + "").replace(q, S);\n };\n var B = g, I = s;\n (function() {\n var R, X, i1, d1, f1, g1 = I, C1, I1, W1, U1, t0, a0 = z.expando, $1 = 0, A0 = 0, _0 = Xs(), be = Xs(), ne = Xs(), Nt = Xs(), mt = function(w1, P1) {\n return w1 === P1 && (f1 = !0), 0;\n }, Rr = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", Br = "(?:\\\\\\\\[\\\\da-fA-F]{1,6}" + L + "?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+", pe = "\\\\[" + L + "*(" + Br + ")(?:" + L + // Operator (capture 2)\n "*([*^$|!~]?=)" + L + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"\n `*(?:\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|"((?:\\\\\\\\.|[^\\\\\\\\"])*)"|(` + Br + "))|)" + L + "*\\\\]", Fo = ":(" + Br + `)(?:\\\\(((\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|"((?:\\\\\\\\.|[^\\\\\\\\"])*)")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|` + pe + ")*)|.*)\\\\)|)", fe = new RegExp(L + "+", "g"), st = new RegExp("^" + L + "*," + L + "*"), A3 = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"), M6 = new RegExp(L + "|>"), Wr = new RegExp(Fo), u3 = new RegExp("^" + Br + "$"), Er = {\n ID: new RegExp("^#(" + Br + ")"),\n CLASS: new RegExp("^\\\\.(" + Br + ")"),\n TAG: new RegExp("^(" + Br + "|[*])"),\n ATTR: new RegExp("^" + pe),\n PSEUDO: new RegExp("^" + Fo),\n CHILD: new RegExp(\n "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(" + L + "*(even|odd|(([+-]|)(\\\\d*)n|)" + L + "*(?:([+-]|)" + L + "*(\\\\d+)|))" + L + "*\\\\)|)",\n "i"\n ),\n bool: new RegExp("^(?:" + Rr + ")$", "i"),\n // For use in libraries implementing .is()\n // We use this for POS matching in `select`\n needsContext: new RegExp("^" + L + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(" + L + "*((?:-\\\\d)?\\\\d*)" + L + "*\\\\)|)(?=[^-]|$)", "i")\n }, Yn = /^(?:input|select|textarea|button)$/i, Xn = /^h\\d$/i, X2 = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/, f6 = /[+~]/, ln = new RegExp("\\\\\\\\[\\\\da-fA-F]{1,6}" + L + "?|\\\\\\\\([^\\\\r\\\\n\\\\f])", "g"), cn = function(w1, P1) {\n var Z1 = "0x" + w1.slice(1) - 65536;\n return P1 || (Z1 < 0 ? String.fromCharCode(Z1 + 65536) : String.fromCharCode(Z1 >> 10 | 55296, Z1 & 1023 | 56320));\n }, Yy = function() {\n Qn();\n }, Xy = Gs(\n function(w1) {\n return w1.disabled === !0 && W(w1, "fieldset");\n },\n { dir: "parentNode", next: "legend" }\n );\n function Qy() {\n try {\n return C1.activeElement;\n } catch {\n }\n }\n try {\n g1.apply(\n n = i.call(B.childNodes),\n B.childNodes\n ), n[B.childNodes.length].nodeType;\n } catch {\n g1 = {\n apply: function(P1, Z1) {\n I.apply(P1, i.call(Z1));\n },\n call: function(P1) {\n I.apply(P1, i.call(arguments, 1));\n }\n };\n }\n function Se(w1, P1, Z1, e0) {\n var o0, g0, x0, T0, R0, le, J0, $0 = P1 && P1.ownerDocument, ce = P1 ? P1.nodeType : 9;\n if (Z1 = Z1 || [], typeof w1 != "string" || !w1 || ce !== 1 && ce !== 9 && ce !== 11)\n return Z1;\n if (!e0 && (Qn(P1), P1 = P1 || C1, W1)) {\n if (ce !== 11 && (R0 = X2.exec(w1)))\n if (o0 = R0[1]) {\n if (ce === 9)\n if (x0 = P1.getElementById(o0)) {\n if (x0.id === o0)\n return g1.call(Z1, x0), Z1;\n } else\n return Z1;\n else if ($0 && (x0 = $0.getElementById(o0)) && Se.contains(P1, x0) && x0.id === o0)\n return g1.call(Z1, x0), Z1;\n } else {\n if (R0[2])\n return g1.apply(Z1, P1.getElementsByTagName(w1)), Z1;\n if ((o0 = R0[3]) && P1.getElementsByClassName)\n return g1.apply(Z1, P1.getElementsByClassName(o0)), Z1;\n }\n if (!Nt[w1 + " "] && (!U1 || !U1.test(w1))) {\n if (J0 = w1, $0 = P1, ce === 1 && (M6.test(w1) || A3.test(w1))) {\n for ($0 = f6.test(w1) && g6(P1.parentNode) || P1, ($0 != P1 || !b.scope) && ((T0 = P1.getAttribute("id")) ? T0 = z.escapeSelector(T0) : P1.setAttribute("id", T0 = a0)), le = b3(w1), g0 = le.length; g0--; )\n le[g0] = (T0 ? "#" + T0 : ":scope") + " " + Qs(le[g0]);\n J0 = le.join(",");\n }\n try {\n return g1.apply(\n Z1,\n $0.querySelectorAll(J0)\n ), Z1;\n } catch {\n Nt(w1, !0);\n } finally {\n T0 === a0 && P1.removeAttribute("id");\n }\n }\n }\n return Kd(w1.replace(w, "$1"), P1, Z1, e0);\n }\n function Xs() {\n var w1 = [];\n function P1(Z1, e0) {\n return w1.push(Z1 + " ") > X.cacheLength && delete P1[w1.shift()], P1[Z1 + " "] = e0;\n }\n return P1;\n }\n function Ar(w1) {\n return w1[a0] = !0, w1;\n }\n function Ni(w1) {\n var P1 = C1.createElement("fieldset");\n try {\n return !!w1(P1);\n } catch {\n return !1;\n } finally {\n P1.parentNode && P1.parentNode.removeChild(P1), P1 = null;\n }\n }\n function Gy(w1) {\n return function(P1) {\n return W(P1, "input") && P1.type === w1;\n };\n }\n function jy(w1) {\n return function(P1) {\n return (W(P1, "input") || W(P1, "button")) && P1.type === w1;\n };\n }\n function Gd(w1) {\n return function(P1) {\n return "form" in P1 ? P1.parentNode && P1.disabled === !1 ? "label" in P1 ? "label" in P1.parentNode ? P1.parentNode.disabled === w1 : P1.disabled === w1 : P1.isDisabled === w1 || // Where there is no isDisabled, check manually\n P1.isDisabled !== !w1 && Xy(P1) === w1 : P1.disabled === w1 : "label" in P1 ? P1.disabled === w1 : !1;\n };\n }\n function Uo(w1) {\n return Ar(function(P1) {\n return P1 = +P1, Ar(function(Z1, e0) {\n for (var o0, g0 = w1([], Z1.length, P1), x0 = g0.length; x0--; )\n Z1[o0 = g0[x0]] && (Z1[o0] = !(e0[o0] = Z1[o0]));\n });\n });\n }\n function g6(w1) {\n return w1 && typeof w1.getElementsByTagName < "u" && w1;\n }\n function Qn(w1) {\n var P1, Z1 = w1 ? w1.ownerDocument || w1 : B;\n return Z1 == C1 || Z1.nodeType !== 9 || !Z1.documentElement || (C1 = Z1, I1 = C1.documentElement, W1 = !z.isXMLDoc(C1), t0 = I1.matches || I1.webkitMatchesSelector || I1.msMatchesSelector, I1.msMatchesSelector && // Support: IE 11+, Edge 17 - 18+\n // IE/Edge sometimes throw a "Permission denied" error when strict-comparing\n // two documents; shallow comparisons work.\n // eslint-disable-next-line eqeqeq\n B != C1 && (P1 = C1.defaultView) && P1.top !== P1 && P1.addEventListener("unload", Yy), b.getById = Ni(function(e0) {\n return I1.appendChild(e0).id = z.expando, !C1.getElementsByName || !C1.getElementsByName(z.expando).length;\n }), b.disconnectedMatch = Ni(function(e0) {\n return t0.call(e0, "*");\n }), b.scope = Ni(function() {\n return C1.querySelectorAll(":scope");\n }), b.cssHas = Ni(function() {\n try {\n return C1.querySelector(":has(*,:jqfake)"), !1;\n } catch {\n return !0;\n }\n }), b.getById ? (X.filter.ID = function(e0) {\n var o0 = e0.replace(ln, cn);\n return function(g0) {\n return g0.getAttribute("id") === o0;\n };\n }, X.find.ID = function(e0, o0) {\n if (typeof o0.getElementById < "u" && W1) {\n var g0 = o0.getElementById(e0);\n return g0 ? [g0] : [];\n }\n }) : (X.filter.ID = function(e0) {\n var o0 = e0.replace(ln, cn);\n return function(g0) {\n var x0 = typeof g0.getAttributeNode < "u" && g0.getAttributeNode("id");\n return x0 && x0.value === o0;\n };\n }, X.find.ID = function(e0, o0) {\n if (typeof o0.getElementById < "u" && W1) {\n var g0, x0, T0, R0 = o0.getElementById(e0);\n if (R0) {\n if (g0 = R0.getAttributeNode("id"), g0 && g0.value === e0)\n return [R0];\n for (T0 = o0.getElementsByName(e0), x0 = 0; R0 = T0[x0++]; )\n if (g0 = R0.getAttributeNode("id"), g0 && g0.value === e0)\n return [R0];\n }\n return [];\n }\n }), X.find.TAG = function(e0, o0) {\n return typeof o0.getElementsByTagName < "u" ? o0.getElementsByTagName(e0) : o0.querySelectorAll(e0);\n }, X.find.CLASS = function(e0, o0) {\n if (typeof o0.getElementsByClassName < "u" && W1)\n return o0.getElementsByClassName(e0);\n }, U1 = [], Ni(function(e0) {\n var o0;\n I1.appendChild(e0).innerHTML = "
", e0.querySelectorAll("[selected]").length || U1.push("\\\\[" + L + "*(?:value|" + Rr + ")"), e0.querySelectorAll("[id~=" + a0 + "-]").length || U1.push("~="), e0.querySelectorAll("a#" + a0 + "+*").length || U1.push(".#.+[+~]"), e0.querySelectorAll(":checked").length || U1.push(":checked"), o0 = C1.createElement("input"), o0.setAttribute("type", "hidden"), e0.appendChild(o0).setAttribute("name", "D"), I1.appendChild(e0).disabled = !0, e0.querySelectorAll(":disabled").length !== 2 && U1.push(":enabled", ":disabled"), o0 = C1.createElement("input"), o0.setAttribute("name", ""), e0.appendChild(o0), e0.querySelectorAll("[name=\'\']").length || U1.push("\\\\[" + L + "*name" + L + "*=" + L + `*(?:\'\'|"")`);\n }), b.cssHas || U1.push(":has"), U1 = U1.length && new RegExp(U1.join("|")), mt = function(e0, o0) {\n if (e0 === o0)\n return f1 = !0, 0;\n var g0 = !e0.compareDocumentPosition - !o0.compareDocumentPosition;\n return g0 || (g0 = (e0.ownerDocument || e0) == (o0.ownerDocument || o0) ? e0.compareDocumentPosition(o0) : (\n // Otherwise we know they are disconnected\n 1\n ), g0 & 1 || !b.sortDetached && o0.compareDocumentPosition(e0) === g0 ? e0 === C1 || e0.ownerDocument == B && Se.contains(B, e0) ? -1 : o0 === C1 || o0.ownerDocument == B && Se.contains(B, o0) ? 1 : d1 ? l.call(d1, e0) - l.call(d1, o0) : 0 : g0 & 4 ? -1 : 1);\n }), C1;\n }\n Se.matches = function(w1, P1) {\n return Se(w1, null, null, P1);\n }, Se.matchesSelector = function(w1, P1) {\n if (Qn(w1), W1 && !Nt[P1 + " "] && (!U1 || !U1.test(P1)))\n try {\n var Z1 = t0.call(w1, P1);\n if (Z1 || b.disconnectedMatch || // As well, disconnected nodes are said to be in a document\n // fragment in IE 9\n w1.document && w1.document.nodeType !== 11)\n return Z1;\n } catch {\n Nt(P1, !0);\n }\n return Se(P1, C1, null, [w1]).length > 0;\n }, Se.contains = function(w1, P1) {\n return (w1.ownerDocument || w1) != C1 && Qn(w1), z.contains(w1, P1);\n }, Se.attr = function(w1, P1) {\n (w1.ownerDocument || w1) != C1 && Qn(w1);\n var Z1 = X.attrHandle[P1.toLowerCase()], e0 = Z1 && d.call(X.attrHandle, P1.toLowerCase()) ? Z1(w1, P1, !W1) : void 0;\n return e0 !== void 0 ? e0 : w1.getAttribute(P1);\n }, Se.error = function(w1) {\n throw new Error("Syntax error, unrecognized expression: " + w1);\n }, z.uniqueSort = function(w1) {\n var P1, Z1 = [], e0 = 0, o0 = 0;\n if (f1 = !b.sortStable, d1 = !b.sortStable && i.call(w1, 0), x.call(w1, mt), f1) {\n for (; P1 = w1[o0++]; )\n P1 === w1[o0] && (e0 = Z1.push(o0));\n for (; e0--; )\n E.call(w1, Z1[e0], 1);\n }\n return d1 = null, w1;\n }, z.fn.uniqueSort = function() {\n return this.pushStack(z.uniqueSort(i.apply(this)));\n }, X = z.expr = {\n // Can be adjusted by the user\n cacheLength: 50,\n createPseudo: Ar,\n match: Er,\n attrHandle: {},\n find: {},\n relative: {\n ">": { dir: "parentNode", first: !0 },\n " ": { dir: "parentNode" },\n "+": { dir: "previousSibling", first: !0 },\n "~": { dir: "previousSibling" }\n },\n preFilter: {\n ATTR: function(w1) {\n return w1[1] = w1[1].replace(ln, cn), w1[3] = (w1[3] || w1[4] || w1[5] || "").replace(ln, cn), w1[2] === "~=" && (w1[3] = " " + w1[3] + " "), w1.slice(0, 4);\n },\n CHILD: function(w1) {\n return w1[1] = w1[1].toLowerCase(), w1[1].slice(0, 3) === "nth" ? (w1[3] || Se.error(w1[0]), w1[4] = +(w1[4] ? w1[5] + (w1[6] || 1) : 2 * (w1[3] === "even" || w1[3] === "odd")), w1[5] = +(w1[7] + w1[8] || w1[3] === "odd")) : w1[3] && Se.error(w1[0]), w1;\n },\n PSEUDO: function(w1) {\n var P1, Z1 = !w1[6] && w1[2];\n return Er.CHILD.test(w1[0]) ? null : (w1[3] ? w1[2] = w1[4] || w1[5] || "" : Z1 && Wr.test(Z1) && // Get excess from tokenize (recursively)\n (P1 = b3(Z1, !0)) && // advance to the next closing parenthesis\n (P1 = Z1.indexOf(")", Z1.length - P1) - Z1.length) && (w1[0] = w1[0].slice(0, P1), w1[2] = Z1.slice(0, P1)), w1.slice(0, 3));\n }\n },\n filter: {\n TAG: function(w1) {\n var P1 = w1.replace(ln, cn).toLowerCase();\n return w1 === "*" ? function() {\n return !0;\n } : function(Z1) {\n return W(Z1, P1);\n };\n },\n CLASS: function(w1) {\n var P1 = _0[w1 + " "];\n return P1 || (P1 = new RegExp("(^|" + L + ")" + w1 + "(" + L + "|$)")) && _0(w1, function(Z1) {\n return P1.test(\n typeof Z1.className == "string" && Z1.className || typeof Z1.getAttribute < "u" && Z1.getAttribute("class") || ""\n );\n });\n },\n ATTR: function(w1, P1, Z1) {\n return function(e0) {\n var o0 = Se.attr(e0, w1);\n return o0 == null ? P1 === "!=" : P1 ? (o0 += "", P1 === "=" ? o0 === Z1 : P1 === "!=" ? o0 !== Z1 : P1 === "^=" ? Z1 && o0.indexOf(Z1) === 0 : P1 === "*=" ? Z1 && o0.indexOf(Z1) > -1 : P1 === "$=" ? Z1 && o0.slice(-Z1.length) === Z1 : P1 === "~=" ? (" " + o0.replace(fe, " ") + " ").indexOf(Z1) > -1 : P1 === "|=" ? o0 === Z1 || o0.slice(0, Z1.length + 1) === Z1 + "-" : !1) : !0;\n };\n },\n CHILD: function(w1, P1, Z1, e0, o0) {\n var g0 = w1.slice(0, 3) !== "nth", x0 = w1.slice(-4) !== "last", T0 = P1 === "of-type";\n return e0 === 1 && o0 === 0 ? (\n // Shortcut for :nth-*(n)\n function(R0) {\n return !!R0.parentNode;\n }\n ) : function(R0, le, J0) {\n var $0, ce, j0, Ue, A2, Xt = g0 !== x0 ? "nextSibling" : "previousSibling", Q2 = R0.parentNode, Sr = T0 && R0.nodeName.toLowerCase(), Ii = !J0 && !T0, t2 = !1;\n if (Q2) {\n if (g0) {\n for (; Xt; ) {\n for (j0 = R0; j0 = j0[Xt]; )\n if (T0 ? W(j0, Sr) : j0.nodeType === 1)\n return !1;\n A2 = Xt = w1 === "only" && !A2 && "nextSibling";\n }\n return !0;\n }\n if (A2 = [x0 ? Q2.firstChild : Q2.lastChild], x0 && Ii) {\n for (ce = Q2[a0] || (Q2[a0] = {}), $0 = ce[w1] || [], Ue = $0[0] === $1 && $0[1], t2 = Ue && $0[2], j0 = Ue && Q2.childNodes[Ue]; j0 = ++Ue && j0 && j0[Xt] || // Fallback to seeking `elem` from the start\n (t2 = Ue = 0) || A2.pop(); )\n if (j0.nodeType === 1 && ++t2 && j0 === R0) {\n ce[w1] = [$1, Ue, t2];\n break;\n }\n } else if (Ii && (ce = R0[a0] || (R0[a0] = {}), $0 = ce[w1] || [], Ue = $0[0] === $1 && $0[1], t2 = Ue), t2 === !1)\n for (; (j0 = ++Ue && j0 && j0[Xt] || (t2 = Ue = 0) || A2.pop()) && !((T0 ? W(j0, Sr) : j0.nodeType === 1) && ++t2 && (Ii && (ce = j0[a0] || (j0[a0] = {}), ce[w1] = [$1, t2]), j0 === R0)); )\n ;\n return t2 -= o0, t2 === e0 || t2 % e0 === 0 && t2 / e0 >= 0;\n }\n };\n },\n PSEUDO: function(w1, P1) {\n var Z1, e0 = X.pseudos[w1] || X.setFilters[w1.toLowerCase()] || Se.error("unsupported pseudo: " + w1);\n return e0[a0] ? e0(P1) : e0.length > 1 ? (Z1 = [w1, w1, "", P1], X.setFilters.hasOwnProperty(w1.toLowerCase()) ? Ar(function(o0, g0) {\n for (var x0, T0 = e0(o0, P1), R0 = T0.length; R0--; )\n x0 = l.call(o0, T0[R0]), o0[x0] = !(g0[x0] = T0[R0]);\n }) : function(o0) {\n return e0(o0, 0, Z1);\n }) : e0;\n }\n },\n pseudos: {\n // Potentially complex pseudos\n not: Ar(function(w1) {\n var P1 = [], Z1 = [], e0 = m6(w1.replace(w, "$1"));\n return e0[a0] ? Ar(function(o0, g0, x0, T0) {\n for (var R0, le = e0(o0, null, T0, []), J0 = o0.length; J0--; )\n (R0 = le[J0]) && (o0[J0] = !(g0[J0] = R0));\n }) : function(o0, g0, x0) {\n return P1[0] = o0, e0(P1, null, x0, Z1), P1[0] = null, !Z1.pop();\n };\n }),\n has: Ar(function(w1) {\n return function(P1) {\n return Se(w1, P1).length > 0;\n };\n }),\n contains: Ar(function(w1) {\n return w1 = w1.replace(ln, cn), function(P1) {\n return (P1.textContent || z.text(P1)).indexOf(w1) > -1;\n };\n }),\n // "Whether an element is represented by a :lang() selector\n // is based solely on the element\'s language value\n // being equal to the identifier C,\n // or beginning with the identifier C immediately followed by "-".\n // The matching of C against the element\'s language value is performed case-insensitively.\n // The identifier C does not have to be a valid language name."\n // https://www.w3.org/TR/selectors/#lang-pseudo\n lang: Ar(function(w1) {\n return u3.test(w1 || "") || Se.error("unsupported lang: " + w1), w1 = w1.replace(ln, cn).toLowerCase(), function(P1) {\n var Z1;\n do\n if (Z1 = W1 ? P1.lang : P1.getAttribute("xml:lang") || P1.getAttribute("lang"))\n return Z1 = Z1.toLowerCase(), Z1 === w1 || Z1.indexOf(w1 + "-") === 0;\n while ((P1 = P1.parentNode) && P1.nodeType === 1);\n return !1;\n };\n }),\n // Miscellaneous\n target: function(w1) {\n var P1 = t.location && t.location.hash;\n return P1 && P1.slice(1) === w1.id;\n },\n root: function(w1) {\n return w1 === I1;\n },\n focus: function(w1) {\n return w1 === Qy() && C1.hasFocus() && !!(w1.type || w1.href || ~w1.tabIndex);\n },\n // Boolean properties\n enabled: Gd(!1),\n disabled: Gd(!0),\n checked: function(w1) {\n return W(w1, "input") && !!w1.checked || W(w1, "option") && !!w1.selected;\n },\n selected: function(w1) {\n return w1.parentNode && w1.parentNode.selectedIndex, w1.selected === !0;\n },\n // Contents\n empty: function(w1) {\n for (w1 = w1.firstChild; w1; w1 = w1.nextSibling)\n if (w1.nodeType < 6)\n return !1;\n return !0;\n },\n parent: function(w1) {\n return !X.pseudos.empty(w1);\n },\n // Element/input types\n header: function(w1) {\n return Xn.test(w1.nodeName);\n },\n input: function(w1) {\n return Yn.test(w1.nodeName);\n },\n button: function(w1) {\n return W(w1, "input") && w1.type === "button" || W(w1, "button");\n },\n text: function(w1) {\n var P1;\n return W(w1, "input") && w1.type === "text" && // Support: IE <10 only\n // New HTML5 attribute values (e.g., "search") appear\n // with elem.type === "text"\n ((P1 = w1.getAttribute("type")) == null || P1.toLowerCase() === "text");\n },\n // Position-in-collection\n first: Uo(function() {\n return [0];\n }),\n last: Uo(function(w1, P1) {\n return [P1 - 1];\n }),\n eq: Uo(function(w1, P1, Z1) {\n return [Z1 < 0 ? Z1 + P1 : Z1];\n }),\n even: Uo(function(w1, P1) {\n for (var Z1 = 0; Z1 < P1; Z1 += 2)\n w1.push(Z1);\n return w1;\n }),\n odd: Uo(function(w1, P1) {\n for (var Z1 = 1; Z1 < P1; Z1 += 2)\n w1.push(Z1);\n return w1;\n }),\n lt: Uo(function(w1, P1, Z1) {\n var e0;\n for (Z1 < 0 ? e0 = Z1 + P1 : Z1 > P1 ? e0 = P1 : e0 = Z1; --e0 >= 0; )\n w1.push(e0);\n return w1;\n }),\n gt: Uo(function(w1, P1, Z1) {\n for (var e0 = Z1 < 0 ? Z1 + P1 : Z1; ++e0 < P1; )\n w1.push(e0);\n return w1;\n })\n }\n }, X.pseudos.nth = X.pseudos.eq;\n for (R in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 })\n X.pseudos[R] = Gy(R);\n for (R in { submit: !0, reset: !0 })\n X.pseudos[R] = jy(R);\n function jd() {\n }\n jd.prototype = X.filters = X.pseudos, X.setFilters = new jd();\n function b3(w1, P1) {\n var Z1, e0, o0, g0, x0, T0, R0, le = be[w1 + " "];\n if (le)\n return P1 ? 0 : le.slice(0);\n for (x0 = w1, T0 = [], R0 = X.preFilter; x0; ) {\n (!Z1 || (e0 = st.exec(x0))) && (e0 && (x0 = x0.slice(e0[0].length) || x0), T0.push(o0 = [])), Z1 = !1, (e0 = A3.exec(x0)) && (Z1 = e0.shift(), o0.push({\n value: Z1,\n // Cast descendant combinators to space\n type: e0[0].replace(w, " ")\n }), x0 = x0.slice(Z1.length));\n for (g0 in X.filter)\n (e0 = Er[g0].exec(x0)) && (!R0[g0] || (e0 = R0[g0](e0))) && (Z1 = e0.shift(), o0.push({\n value: Z1,\n type: g0,\n matches: e0\n }), x0 = x0.slice(Z1.length));\n if (!Z1)\n break;\n }\n return P1 ? x0.length : x0 ? Se.error(w1) : (\n // Cache the tokens\n be(w1, T0).slice(0)\n );\n }\n function Qs(w1) {\n for (var P1 = 0, Z1 = w1.length, e0 = ""; P1 < Z1; P1++)\n e0 += w1[P1].value;\n return e0;\n }\n function Gs(w1, P1, Z1) {\n var e0 = P1.dir, o0 = P1.next, g0 = o0 || e0, x0 = Z1 && g0 === "parentNode", T0 = A0++;\n return P1.first ? (\n // Check against closest ancestor/preceding element\n function(R0, le, J0) {\n for (; R0 = R0[e0]; )\n if (R0.nodeType === 1 || x0)\n return w1(R0, le, J0);\n return !1;\n }\n ) : (\n // Check against all ancestor/preceding elements\n function(R0, le, J0) {\n var $0, ce, j0 = [$1, T0];\n if (J0) {\n for (; R0 = R0[e0]; )\n if ((R0.nodeType === 1 || x0) && w1(R0, le, J0))\n return !0;\n } else\n for (; R0 = R0[e0]; )\n if (R0.nodeType === 1 || x0)\n if (ce = R0[a0] || (R0[a0] = {}), o0 && W(R0, o0))\n R0 = R0[e0] || R0;\n else {\n if (($0 = ce[g0]) && $0[0] === $1 && $0[1] === T0)\n return j0[2] = $0[2];\n if (ce[g0] = j0, j0[2] = w1(R0, le, J0))\n return !0;\n }\n return !1;\n }\n );\n }\n function z6(w1) {\n return w1.length > 1 ? function(P1, Z1, e0) {\n for (var o0 = w1.length; o0--; )\n if (!w1[o0](P1, Z1, e0))\n return !1;\n return !0;\n } : w1[0];\n }\n function Ky(w1, P1, Z1) {\n for (var e0 = 0, o0 = P1.length; e0 < o0; e0++)\n Se(w1, P1[e0], Z1);\n return Z1;\n }\n function js(w1, P1, Z1, e0, o0) {\n for (var g0, x0 = [], T0 = 0, R0 = w1.length, le = P1 != null; T0 < R0; T0++)\n (g0 = w1[T0]) && (!Z1 || Z1(g0, e0, o0)) && (x0.push(g0), le && P1.push(T0));\n return x0;\n }\n function C6(w1, P1, Z1, e0, o0, g0) {\n return e0 && !e0[a0] && (e0 = C6(e0)), o0 && !o0[a0] && (o0 = C6(o0, g0)), Ar(function(x0, T0, R0, le) {\n var J0, $0, ce, j0, Ue = [], A2 = [], Xt = T0.length, Q2 = x0 || Ky(\n P1 || "*",\n R0.nodeType ? [R0] : R0,\n []\n ), Sr = w1 && (x0 || !P1) ? js(Q2, Ue, w1, R0, le) : Q2;\n if (Z1 ? (j0 = o0 || (x0 ? w1 : Xt || e0) ? (\n // ...intermediate processing is necessary\n []\n ) : (\n // ...otherwise use results directly\n T0\n ), Z1(Sr, j0, R0, le)) : j0 = Sr, e0)\n for (J0 = js(j0, A2), e0(J0, [], R0, le), $0 = J0.length; $0--; )\n (ce = J0[$0]) && (j0[A2[$0]] = !(Sr[A2[$0]] = ce));\n if (x0) {\n if (o0 || w1) {\n if (o0) {\n for (J0 = [], $0 = j0.length; $0--; )\n (ce = j0[$0]) && J0.push(Sr[$0] = ce);\n o0(null, j0 = [], J0, le);\n }\n for ($0 = j0.length; $0--; )\n (ce = j0[$0]) && (J0 = o0 ? l.call(x0, ce) : Ue[$0]) > -1 && (x0[J0] = !(T0[J0] = ce));\n }\n } else\n j0 = js(\n j0 === T0 ? j0.splice(Xt, j0.length) : j0\n ), o0 ? o0(null, T0, j0, le) : g1.apply(T0, j0);\n });\n }\n function O6(w1) {\n for (var P1, Z1, e0, o0 = w1.length, g0 = X.relative[w1[0].type], x0 = g0 || X.relative[" "], T0 = g0 ? 1 : 0, R0 = Gs(function($0) {\n return $0 === P1;\n }, x0, !0), le = Gs(function($0) {\n return l.call(P1, $0) > -1;\n }, x0, !0), J0 = [function($0, ce, j0) {\n var Ue = !g0 && (j0 || ce != i1) || ((P1 = ce).nodeType ? R0($0, ce, j0) : le($0, ce, j0));\n return P1 = null, Ue;\n }]; T0 < o0; T0++)\n if (Z1 = X.relative[w1[T0].type])\n J0 = [Gs(z6(J0), Z1)];\n else {\n if (Z1 = X.filter[w1[T0].type].apply(null, w1[T0].matches), Z1[a0]) {\n for (e0 = ++T0; e0 < o0 && !X.relative[w1[e0].type]; e0++)\n ;\n return C6(\n T0 > 1 && z6(J0),\n T0 > 1 && Qs(\n // If the preceding token was a descendant combinator, insert an implicit any-element `*`\n w1.slice(0, T0 - 1).concat({ value: w1[T0 - 2].type === " " ? "*" : "" })\n ).replace(w, "$1"),\n Z1,\n T0 < e0 && O6(w1.slice(T0, e0)),\n e0 < o0 && O6(w1 = w1.slice(e0)),\n e0 < o0 && Qs(w1)\n );\n }\n J0.push(Z1);\n }\n return z6(J0);\n }\n function Zy(w1, P1) {\n var Z1 = P1.length > 0, e0 = w1.length > 0, o0 = function(g0, x0, T0, R0, le) {\n var J0, $0, ce, j0 = 0, Ue = "0", A2 = g0 && [], Xt = [], Q2 = i1, Sr = g0 || e0 && X.find.TAG("*", le), Ii = $1 += Q2 == null ? 1 : Math.random() || 0.1, t2 = Sr.length;\n for (le && (i1 = x0 == C1 || x0 || le); Ue !== t2 && (J0 = Sr[Ue]) != null; Ue++) {\n if (e0 && J0) {\n for ($0 = 0, !x0 && J0.ownerDocument != C1 && (Qn(J0), T0 = !W1); ce = w1[$0++]; )\n if (ce(J0, x0 || C1, T0)) {\n g1.call(R0, J0);\n break;\n }\n le && ($1 = Ii);\n }\n Z1 && ((J0 = !ce && J0) && j0--, g0 && A2.push(J0));\n }\n if (j0 += Ue, Z1 && Ue !== j0) {\n for ($0 = 0; ce = P1[$0++]; )\n ce(A2, Xt, x0, T0);\n if (g0) {\n if (j0 > 0)\n for (; Ue--; )\n A2[Ue] || Xt[Ue] || (Xt[Ue] = T.call(R0));\n Xt = js(Xt);\n }\n g1.apply(R0, Xt), le && !g0 && Xt.length > 0 && j0 + P1.length > 1 && z.uniqueSort(R0);\n }\n return le && ($1 = Ii, i1 = Q2), A2;\n };\n return Z1 ? Ar(o0) : o0;\n }\n function m6(w1, P1) {\n var Z1, e0 = [], o0 = [], g0 = ne[w1 + " "];\n if (!g0) {\n for (P1 || (P1 = b3(w1)), Z1 = P1.length; Z1--; )\n g0 = O6(P1[Z1]), g0[a0] ? e0.push(g0) : o0.push(g0);\n g0 = ne(\n w1,\n Zy(o0, e0)\n ), g0.selector = w1;\n }\n return g0;\n }\n function Kd(w1, P1, Z1, e0) {\n var o0, g0, x0, T0, R0, le = typeof w1 == "function" && w1, J0 = !e0 && b3(w1 = le.selector || w1);\n if (Z1 = Z1 || [], J0.length === 1) {\n if (g0 = J0[0] = J0[0].slice(0), g0.length > 2 && (x0 = g0[0]).type === "ID" && P1.nodeType === 9 && W1 && X.relative[g0[1].type]) {\n if (P1 = (X.find.ID(\n x0.matches[0].replace(ln, cn),\n P1\n ) || [])[0], P1)\n le && (P1 = P1.parentNode);\n else\n return Z1;\n w1 = w1.slice(g0.shift().value.length);\n }\n for (o0 = Er.needsContext.test(w1) ? 0 : g0.length; o0-- && (x0 = g0[o0], !X.relative[T0 = x0.type]); )\n if ((R0 = X.find[T0]) && (e0 = R0(\n x0.matches[0].replace(ln, cn),\n f6.test(g0[0].type) && g6(P1.parentNode) || P1\n ))) {\n if (g0.splice(o0, 1), w1 = e0.length && Qs(g0), !w1)\n return g1.apply(Z1, e0), Z1;\n break;\n }\n }\n return (le || m6(w1, J0))(\n e0,\n P1,\n !W1,\n Z1,\n !P1 || f6.test(w1) && g6(P1.parentNode) || P1\n ), Z1;\n }\n b.sortStable = a0.split("").sort(mt).join("") === a0, Qn(), b.sortDetached = Ni(function(w1) {\n return w1.compareDocumentPosition(C1.createElement("fieldset")) & 1;\n }), z.find = Se, z.expr[":"] = z.expr.pseudos, z.unique = z.uniqueSort, Se.compile = m6, Se.select = Kd, Se.setDocument = Qn, Se.tokenize = b3, Se.escape = z.escapeSelector, Se.getText = z.text, Se.isXML = z.isXMLDoc, Se.selectors = z.expr, Se.support = z.support, Se.uniqueSort = z.uniqueSort;\n })();\n var P = function(R, X, i1) {\n for (var d1 = [], f1 = i1 !== void 0; (R = R[X]) && R.nodeType !== 9; )\n if (R.nodeType === 1) {\n if (f1 && z(R).is(i1))\n break;\n d1.push(R);\n }\n return d1;\n }, k = function(R, X) {\n for (var i1 = []; R; R = R.nextSibling)\n R.nodeType === 1 && R !== X && i1.push(R);\n return i1;\n }, K = z.expr.match.needsContext, $ = /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;\n function j(R, X, i1) {\n return M(X) ? z.grep(R, function(d1, f1) {\n return !!X.call(d1, f1, d1) !== i1;\n }) : X.nodeType ? z.grep(R, function(d1) {\n return d1 === X !== i1;\n }) : typeof X != "string" ? z.grep(R, function(d1) {\n return l.call(X, d1) > -1 !== i1;\n }) : z.filter(X, R, i1);\n }\n z.filter = function(R, X, i1) {\n var d1 = X[0];\n return i1 && (R = ":not(" + R + ")"), X.length === 1 && d1.nodeType === 1 ? z.find.matchesSelector(d1, R) ? [d1] : [] : z.find.matches(R, z.grep(X, function(f1) {\n return f1.nodeType === 1;\n }));\n }, z.fn.extend({\n find: function(R) {\n var X, i1, d1 = this.length, f1 = this;\n if (typeof R != "string")\n return this.pushStack(z(R).filter(function() {\n for (X = 0; X < d1; X++)\n if (z.contains(f1[X], this))\n return !0;\n }));\n for (i1 = this.pushStack([]), X = 0; X < d1; X++)\n z.find(R, f1[X], i1);\n return d1 > 1 ? z.uniqueSort(i1) : i1;\n },\n filter: function(R) {\n return this.pushStack(j(this, R || [], !1));\n },\n not: function(R) {\n return this.pushStack(j(this, R || [], !0));\n },\n is: function(R) {\n return !!j(\n this,\n // If this is a positional/relative selector, check membership in the returned set\n // so $("p:first").is("p:last") won\'t return true for a doc with two "p".\n typeof R == "string" && K.test(R) ? z(R) : R || [],\n !1\n ).length;\n }\n });\n var r1, a1 = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/, _ = z.fn.init = function(R, X, i1) {\n var d1, f1;\n if (!R)\n return this;\n if (i1 = i1 || r1, typeof R == "string")\n if (R[0] === "<" && R[R.length - 1] === ">" && R.length >= 3 ? d1 = [null, R, null] : d1 = a1.exec(R), d1 && (d1[1] || !X))\n if (d1[1]) {\n if (X = X instanceof z ? X[0] : X, z.merge(this, z.parseHTML(\n d1[1],\n X && X.nodeType ? X.ownerDocument || X : g,\n !0\n )), $.test(d1[1]) && z.isPlainObject(X))\n for (d1 in X)\n M(this[d1]) ? this[d1](X[d1]) : this.attr(d1, X[d1]);\n return this;\n } else\n return f1 = g.getElementById(d1[2]), f1 && (this[0] = f1, this.length = 1), this;\n else\n return !X || X.jquery ? (X || i1).find(R) : this.constructor(X).find(R);\n else {\n if (R.nodeType)\n return this[0] = R, this.length = 1, this;\n if (M(R))\n return i1.ready !== void 0 ? i1.ready(R) : (\n // Execute immediately if ready is not present\n R(z)\n );\n }\n return z.makeArray(R, this);\n };\n _.prototype = z.fn, r1 = z(g);\n var Y = /^(?:parents|prev(?:Until|All))/, D = {\n children: !0,\n contents: !0,\n next: !0,\n prev: !0\n };\n z.fn.extend({\n has: function(R) {\n var X = z(R, this), i1 = X.length;\n return this.filter(function() {\n for (var d1 = 0; d1 < i1; d1++)\n if (z.contains(this, X[d1]))\n return !0;\n });\n },\n closest: function(R, X) {\n var i1, d1 = 0, f1 = this.length, g1 = [], C1 = typeof R != "string" && z(R);\n if (!K.test(R)) {\n for (; d1 < f1; d1++)\n for (i1 = this[d1]; i1 && i1 !== X; i1 = i1.parentNode)\n if (i1.nodeType < 11 && (C1 ? C1.index(i1) > -1 : (\n // Don\'t pass non-elements to jQuery#find\n i1.nodeType === 1 && z.find.matchesSelector(i1, R)\n ))) {\n g1.push(i1);\n break;\n }\n }\n return this.pushStack(g1.length > 1 ? z.uniqueSort(g1) : g1);\n },\n // Determine the position of an element within the set\n index: function(R) {\n return R ? typeof R == "string" ? l.call(z(R), this[0]) : l.call(\n this,\n // If it receives a jQuery object, the first element is used\n R.jquery ? R[0] : R\n ) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1;\n },\n add: function(R, X) {\n return this.pushStack(\n z.uniqueSort(\n z.merge(this.get(), z(R, X))\n )\n );\n },\n addBack: function(R) {\n return this.add(\n R == null ? this.prevObject : this.prevObject.filter(R)\n );\n }\n });\n function H(R, X) {\n for (; (R = R[X]) && R.nodeType !== 1; )\n ;\n return R;\n }\n z.each({\n parent: function(R) {\n var X = R.parentNode;\n return X && X.nodeType !== 11 ? X : null;\n },\n parents: function(R) {\n return P(R, "parentNode");\n },\n parentsUntil: function(R, X, i1) {\n return P(R, "parentNode", i1);\n },\n next: function(R) {\n return H(R, "nextSibling");\n },\n prev: function(R) {\n return H(R, "previousSibling");\n },\n nextAll: function(R) {\n return P(R, "nextSibling");\n },\n prevAll: function(R) {\n return P(R, "previousSibling");\n },\n nextUntil: function(R, X, i1) {\n return P(R, "nextSibling", i1);\n },\n prevUntil: function(R, X, i1) {\n return P(R, "previousSibling", i1);\n },\n siblings: function(R) {\n return k((R.parentNode || {}).firstChild, R);\n },\n children: function(R) {\n return k(R.firstChild);\n },\n contents: function(R) {\n return R.contentDocument != null && // Support: IE 11+\n // elements with no `data` attribute has an object\n // `contentDocument` with a `null` prototype.\n o(R.contentDocument) ? R.contentDocument : (W(R, "template") && (R = R.content || R), z.merge([], R.childNodes));\n }\n }, function(R, X) {\n z.fn[R] = function(i1, d1) {\n var f1 = z.map(this, X, i1);\n return R.slice(-5) !== "Until" && (d1 = i1), d1 && typeof d1 == "string" && (f1 = z.filter(d1, f1)), this.length > 1 && (D[R] || z.uniqueSort(f1), Y.test(R) && f1.reverse()), this.pushStack(f1);\n };\n });\n var G = /[^\\x20\\t\\r\\n\\f]+/g;\n function J(R) {\n var X = {};\n return z.each(R.match(G) || [], function(i1, d1) {\n X[d1] = !0;\n }), X;\n }\n z.Callbacks = function(R) {\n R = typeof R == "string" ? J(R) : z.extend({}, R);\n var X, i1, d1, f1, g1 = [], C1 = [], I1 = -1, W1 = function() {\n for (f1 = f1 || R.once, d1 = X = !0; C1.length; I1 = -1)\n for (i1 = C1.shift(); ++I1 < g1.length; )\n g1[I1].apply(i1[0], i1[1]) === !1 && R.stopOnFalse && (I1 = g1.length, i1 = !1);\n R.memory || (i1 = !1), X = !1, f1 && (i1 ? g1 = [] : g1 = "");\n }, U1 = {\n // Add a callback or a collection of callbacks to the list\n add: function() {\n return g1 && (i1 && !X && (I1 = g1.length - 1, C1.push(i1)), function t0(a0) {\n z.each(a0, function($1, A0) {\n M(A0) ? (!R.unique || !U1.has(A0)) && g1.push(A0) : A0 && A0.length && m(A0) !== "string" && t0(A0);\n });\n }(arguments), i1 && !X && W1()), this;\n },\n // Remove a callback from the list\n remove: function() {\n return z.each(arguments, function(t0, a0) {\n for (var $1; ($1 = z.inArray(a0, g1, $1)) > -1; )\n g1.splice($1, 1), $1 <= I1 && I1--;\n }), this;\n },\n // Check if a given callback is in the list.\n // If no argument is given, return whether or not list has callbacks attached.\n has: function(t0) {\n return t0 ? z.inArray(t0, g1) > -1 : g1.length > 0;\n },\n // Remove all callbacks from the list\n empty: function() {\n return g1 && (g1 = []), this;\n },\n // Disable .fire and .add\n // Abort any current/pending executions\n // Clear all callbacks and values\n disable: function() {\n return f1 = C1 = [], g1 = i1 = "", this;\n },\n disabled: function() {\n return !g1;\n },\n // Disable .fire\n // Also disable .add unless we have memory (since it would have no effect)\n // Abort any pending executions\n lock: function() {\n return f1 = C1 = [], !i1 && !X && (g1 = i1 = ""), this;\n },\n locked: function() {\n return !!f1;\n },\n // Call all callbacks with the given context and arguments\n fireWith: function(t0, a0) {\n return f1 || (a0 = a0 || [], a0 = [t0, a0.slice ? a0.slice() : a0], C1.push(a0), X || W1()), this;\n },\n // Call all the callbacks with the given arguments\n fire: function() {\n return U1.fireWith(this, arguments), this;\n },\n // To know if the callbacks have already been called at least once\n fired: function() {\n return !!d1;\n }\n };\n return U1;\n };\n function F(R) {\n return R;\n }\n function V(R) {\n throw R;\n }\n function Q(R, X, i1, d1) {\n var f1;\n try {\n R && M(f1 = R.promise) ? f1.call(R).done(X).fail(i1) : R && M(f1 = R.then) ? f1.call(R, X, i1) : X.apply(void 0, [R].slice(d1));\n } catch (g1) {\n i1.apply(void 0, [g1]);\n }\n }\n z.extend({\n Deferred: function(R) {\n var X = [\n // action, add listener, callbacks,\n // ... .then handlers, argument index, [final state]\n [\n "notify",\n "progress",\n z.Callbacks("memory"),\n z.Callbacks("memory"),\n 2\n ],\n [\n "resolve",\n "done",\n z.Callbacks("once memory"),\n z.Callbacks("once memory"),\n 0,\n "resolved"\n ],\n [\n "reject",\n "fail",\n z.Callbacks("once memory"),\n z.Callbacks("once memory"),\n 1,\n "rejected"\n ]\n ], i1 = "pending", d1 = {\n state: function() {\n return i1;\n },\n always: function() {\n return f1.done(arguments).fail(arguments), this;\n },\n catch: function(g1) {\n return d1.then(null, g1);\n },\n // Keep pipe for back-compat\n pipe: function() {\n var g1 = arguments;\n return z.Deferred(function(C1) {\n z.each(X, function(I1, W1) {\n var U1 = M(g1[W1[4]]) && g1[W1[4]];\n f1[W1[1]](function() {\n var t0 = U1 && U1.apply(this, arguments);\n t0 && M(t0.promise) ? t0.promise().progress(C1.notify).done(C1.resolve).fail(C1.reject) : C1[W1[0] + "With"](\n this,\n U1 ? [t0] : arguments\n );\n });\n }), g1 = null;\n }).promise();\n },\n then: function(g1, C1, I1) {\n var W1 = 0;\n function U1(t0, a0, $1, A0) {\n return function() {\n var _0 = this, be = arguments, ne = function() {\n var mt, Rr;\n if (!(t0 < W1)) {\n if (mt = $1.apply(_0, be), mt === a0.promise())\n throw new TypeError("Thenable self-resolution");\n Rr = mt && // Support: Promises/A+ section 2.3.4\n // https://promisesaplus.com/#point-64\n // Only check objects and functions for thenability\n (typeof mt == "object" || typeof mt == "function") && mt.then, M(Rr) ? A0 ? Rr.call(\n mt,\n U1(W1, a0, F, A0),\n U1(W1, a0, V, A0)\n ) : (W1++, Rr.call(\n mt,\n U1(W1, a0, F, A0),\n U1(W1, a0, V, A0),\n U1(\n W1,\n a0,\n F,\n a0.notifyWith\n )\n )) : ($1 !== F && (_0 = void 0, be = [mt]), (A0 || a0.resolveWith)(_0, be));\n }\n }, Nt = A0 ? ne : function() {\n try {\n ne();\n } catch (mt) {\n z.Deferred.exceptionHook && z.Deferred.exceptionHook(\n mt,\n Nt.error\n ), t0 + 1 >= W1 && ($1 !== V && (_0 = void 0, be = [mt]), a0.rejectWith(_0, be));\n }\n };\n t0 ? Nt() : (z.Deferred.getErrorHook ? Nt.error = z.Deferred.getErrorHook() : z.Deferred.getStackHook && (Nt.error = z.Deferred.getStackHook()), t.setTimeout(Nt));\n };\n }\n return z.Deferred(function(t0) {\n X[0][3].add(\n U1(\n 0,\n t0,\n M(I1) ? I1 : F,\n t0.notifyWith\n )\n ), X[1][3].add(\n U1(\n 0,\n t0,\n M(g1) ? g1 : F\n )\n ), X[2][3].add(\n U1(\n 0,\n t0,\n M(C1) ? C1 : V\n )\n );\n }).promise();\n },\n // Get a promise for this deferred\n // If obj is provided, the promise aspect is added to the object\n promise: function(g1) {\n return g1 != null ? z.extend(g1, d1) : d1;\n }\n }, f1 = {};\n return z.each(X, function(g1, C1) {\n var I1 = C1[2], W1 = C1[5];\n d1[C1[1]] = I1.add, W1 && I1.add(\n function() {\n i1 = W1;\n },\n // rejected_callbacks.disable\n // fulfilled_callbacks.disable\n X[3 - g1][2].disable,\n // rejected_handlers.disable\n // fulfilled_handlers.disable\n X[3 - g1][3].disable,\n // progress_callbacks.lock\n X[0][2].lock,\n // progress_handlers.lock\n X[0][3].lock\n ), I1.add(C1[3].fire), f1[C1[0]] = function() {\n return f1[C1[0] + "With"](this === f1 ? void 0 : this, arguments), this;\n }, f1[C1[0] + "With"] = I1.fireWith;\n }), d1.promise(f1), R && R.call(f1, f1), f1;\n },\n // Deferred helper\n when: function(R) {\n var X = arguments.length, i1 = X, d1 = Array(i1), f1 = i.call(arguments), g1 = z.Deferred(), C1 = function(I1) {\n return function(W1) {\n d1[I1] = this, f1[I1] = arguments.length > 1 ? i.call(arguments) : W1, --X || g1.resolveWith(d1, f1);\n };\n };\n if (X <= 1 && (Q(\n R,\n g1.done(C1(i1)).resolve,\n g1.reject,\n !X\n ), g1.state() === "pending" || M(f1[i1] && f1[i1].then)))\n return g1.then();\n for (; i1--; )\n Q(f1[i1], C1(i1), g1.reject);\n return g1.promise();\n }\n });\n var Z = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n z.Deferred.exceptionHook = function(R, X) {\n t.console && t.console.warn && R && Z.test(R.name) && t.console.warn(\n "jQuery.Deferred exception: " + R.message,\n R.stack,\n X\n );\n }, z.readyException = function(R) {\n t.setTimeout(function() {\n throw R;\n });\n };\n var t1 = z.Deferred();\n z.fn.ready = function(R) {\n return t1.then(R).catch(function(X) {\n z.readyException(X);\n }), this;\n }, z.extend({\n // Is the DOM ready to be used? Set to true once it occurs.\n isReady: !1,\n // A counter to track how many items to wait for before\n // the ready event fires. See trac-6781\n readyWait: 1,\n // Handle when the DOM is ready\n ready: function(R) {\n (R === !0 ? --z.readyWait : z.isReady) || (z.isReady = !0, !(R !== !0 && --z.readyWait > 0) && t1.resolveWith(g, [z]));\n }\n }), z.ready.then = t1.then;\n function n1() {\n g.removeEventListener("DOMContentLoaded", n1), t.removeEventListener("load", n1), z.ready();\n }\n g.readyState === "complete" || g.readyState !== "loading" && !g.documentElement.doScroll ? t.setTimeout(z.ready) : (g.addEventListener("DOMContentLoaded", n1), t.addEventListener("load", n1));\n var U = function(R, X, i1, d1, f1, g1, C1) {\n var I1 = 0, W1 = R.length, U1 = i1 == null;\n if (m(i1) === "object") {\n f1 = !0;\n for (I1 in i1)\n U(R, X, I1, i1[I1], !0, g1, C1);\n } else if (d1 !== void 0 && (f1 = !0, M(d1) || (C1 = !0), U1 && (C1 ? (X.call(R, d1), X = null) : (U1 = X, X = function(t0, a0, $1) {\n return U1.call(z(t0), $1);\n })), X))\n for (; I1 < W1; I1++)\n X(\n R[I1],\n i1,\n C1 ? d1 : d1.call(R[I1], I1, X(R[I1], i1))\n );\n return f1 ? R : U1 ? X.call(R) : W1 ? X(R[0], i1) : g1;\n }, e1 = /^-ms-/, o1 = /-([a-z])/g;\n function u1(R, X) {\n return X.toUpperCase();\n }\n function M1(R) {\n return R.replace(e1, "ms-").replace(o1, u1);\n }\n var A1 = function(R) {\n return R.nodeType === 1 || R.nodeType === 9 || !+R.nodeType;\n };\n function l1() {\n this.expando = z.expando + l1.uid++;\n }\n l1.uid = 1, l1.prototype = {\n cache: function(R) {\n var X = R[this.expando];\n return X || (X = {}, A1(R) && (R.nodeType ? R[this.expando] = X : Object.defineProperty(R, this.expando, {\n value: X,\n configurable: !0\n }))), X;\n },\n set: function(R, X, i1) {\n var d1, f1 = this.cache(R);\n if (typeof X == "string")\n f1[M1(X)] = i1;\n else\n for (d1 in X)\n f1[M1(d1)] = X[d1];\n return f1;\n },\n get: function(R, X) {\n return X === void 0 ? this.cache(R) : (\n // Always use camelCase key (gh-2257)\n R[this.expando] && R[this.expando][M1(X)]\n );\n },\n access: function(R, X, i1) {\n return X === void 0 || X && typeof X == "string" && i1 === void 0 ? this.get(R, X) : (this.set(R, X, i1), i1 !== void 0 ? i1 : X);\n },\n remove: function(R, X) {\n var i1, d1 = R[this.expando];\n if (d1 !== void 0) {\n if (X !== void 0)\n for (Array.isArray(X) ? X = X.map(M1) : (X = M1(X), X = X in d1 ? [X] : X.match(G) || []), i1 = X.length; i1--; )\n delete d1[X[i1]];\n (X === void 0 || z.isEmptyObject(d1)) && (R.nodeType ? R[this.expando] = void 0 : delete R[this.expando]);\n }\n },\n hasData: function(R) {\n var X = R[this.expando];\n return X !== void 0 && !z.isEmptyObject(X);\n }\n };\n var b1 = new l1(), h1 = new l1(), z1 = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/, O1 = /[A-Z]/g;\n function m1(R) {\n return R === "true" ? !0 : R === "false" ? !1 : R === "null" ? null : R === +R + "" ? +R : z1.test(R) ? JSON.parse(R) : R;\n }\n function L1(R, X, i1) {\n var d1;\n if (i1 === void 0 && R.nodeType === 1)\n if (d1 = "data-" + X.replace(O1, "-$&").toLowerCase(), i1 = R.getAttribute(d1), typeof i1 == "string") {\n try {\n i1 = m1(i1);\n } catch {\n }\n h1.set(R, X, i1);\n } else\n i1 = void 0;\n return i1;\n }\n z.extend({\n hasData: function(R) {\n return h1.hasData(R) || b1.hasData(R);\n },\n data: function(R, X, i1) {\n return h1.access(R, X, i1);\n },\n removeData: function(R, X) {\n h1.remove(R, X);\n },\n // TODO: Now that all calls to _data and _removeData have been replaced\n // with direct calls to dataPriv methods, these can be deprecated.\n _data: function(R, X, i1) {\n return b1.access(R, X, i1);\n },\n _removeData: function(R, X) {\n b1.remove(R, X);\n }\n }), z.fn.extend({\n data: function(R, X) {\n var i1, d1, f1, g1 = this[0], C1 = g1 && g1.attributes;\n if (R === void 0) {\n if (this.length && (f1 = h1.get(g1), g1.nodeType === 1 && !b1.get(g1, "hasDataAttrs"))) {\n for (i1 = C1.length; i1--; )\n C1[i1] && (d1 = C1[i1].name, d1.indexOf("data-") === 0 && (d1 = M1(d1.slice(5)), L1(g1, d1, f1[d1])));\n b1.set(g1, "hasDataAttrs", !0);\n }\n return f1;\n }\n return typeof R == "object" ? this.each(function() {\n h1.set(this, R);\n }) : U(this, function(I1) {\n var W1;\n if (g1 && I1 === void 0)\n return W1 = h1.get(g1, R), W1 !== void 0 || (W1 = L1(g1, R), W1 !== void 0) ? W1 : void 0;\n this.each(function() {\n h1.set(this, R, I1);\n });\n }, null, X, arguments.length > 1, null, !0);\n },\n removeData: function(R) {\n return this.each(function() {\n h1.remove(this, R);\n });\n }\n }), z.extend({\n queue: function(R, X, i1) {\n var d1;\n if (R)\n return X = (X || "fx") + "queue", d1 = b1.get(R, X), i1 && (!d1 || Array.isArray(i1) ? d1 = b1.access(R, X, z.makeArray(i1)) : d1.push(i1)), d1 || [];\n },\n dequeue: function(R, X) {\n X = X || "fx";\n var i1 = z.queue(R, X), d1 = i1.length, f1 = i1.shift(), g1 = z._queueHooks(R, X), C1 = function() {\n z.dequeue(R, X);\n };\n f1 === "inprogress" && (f1 = i1.shift(), d1--), f1 && (X === "fx" && i1.unshift("inprogress"), delete g1.stop, f1.call(R, C1, g1)), !d1 && g1 && g1.empty.fire();\n },\n // Not public - generate a queueHooks object, or return the current one\n _queueHooks: function(R, X) {\n var i1 = X + "queueHooks";\n return b1.get(R, i1) || b1.access(R, i1, {\n empty: z.Callbacks("once memory").add(function() {\n b1.remove(R, [X + "queue", i1]);\n })\n });\n }\n }), z.fn.extend({\n queue: function(R, X) {\n var i1 = 2;\n return typeof R != "string" && (X = R, R = "fx", i1--), arguments.length < i1 ? z.queue(this[0], R) : X === void 0 ? this : this.each(function() {\n var d1 = z.queue(this, R, X);\n z._queueHooks(this, R), R === "fx" && d1[0] !== "inprogress" && z.dequeue(this, R);\n });\n },\n dequeue: function(R) {\n return this.each(function() {\n z.dequeue(this, R);\n });\n },\n clearQueue: function(R) {\n return this.queue(R || "fx", []);\n },\n // Get a promise resolved when queues of a certain type\n // are emptied (fx is the type by default)\n promise: function(R, X) {\n var i1, d1 = 1, f1 = z.Deferred(), g1 = this, C1 = this.length, I1 = function() {\n --d1 || f1.resolveWith(g1, [g1]);\n };\n for (typeof R != "string" && (X = R, R = void 0), R = R || "fx"; C1--; )\n i1 = b1.get(g1[C1], R + "queueHooks"), i1 && i1.empty && (d1++, i1.empty.add(I1));\n return I1(), f1.promise(X);\n }\n });\n var y1 = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source, B1 = new RegExp("^(?:([+-])=|)(" + y1 + ")([a-z%]*)$", "i"), T1 = ["Top", "Right", "Bottom", "Left"], F1 = g.documentElement, X1 = function(R) {\n return z.contains(R.ownerDocument, R);\n }, G1 = { composed: !0 };\n F1.getRootNode && (X1 = function(R) {\n return z.contains(R.ownerDocument, R) || R.getRootNode(G1) === R.ownerDocument;\n });\n var Q1 = function(R, X) {\n return R = X || R, R.style.display === "none" || R.style.display === "" && // Otherwise, check computed style\n // Support: Firefox <=43 - 45\n // Disconnected elements can have computed display: none, so first confirm that elem is\n // in the document.\n X1(R) && z.css(R, "display") === "none";\n };\n function K1(R, X, i1, d1) {\n var f1, g1, C1 = 20, I1 = d1 ? function() {\n return d1.cur();\n } : function() {\n return z.css(R, X, "");\n }, W1 = I1(), U1 = i1 && i1[3] || (z.cssNumber[X] ? "" : "px"), t0 = R.nodeType && (z.cssNumber[X] || U1 !== "px" && +W1) && B1.exec(z.css(R, X));\n if (t0 && t0[3] !== U1) {\n for (W1 = W1 / 2, U1 = U1 || t0[3], t0 = +W1 || 1; C1--; )\n z.style(R, X, t0 + U1), (1 - g1) * (1 - (g1 = I1() / W1 || 0.5)) <= 0 && (C1 = 0), t0 = t0 / g1;\n t0 = t0 * 2, z.style(R, X, t0 + U1), i1 = i1 || [];\n }\n return i1 && (t0 = +t0 || +W1 || 0, f1 = i1[1] ? t0 + (i1[1] + 1) * i1[2] : +i1[2], d1 && (d1.unit = U1, d1.start = t0, d1.end = f1)), f1;\n }\n var n0 = {};\n function u0(R) {\n var X, i1 = R.ownerDocument, d1 = R.nodeName, f1 = n0[d1];\n return f1 || (X = i1.body.appendChild(i1.createElement(d1)), f1 = z.css(X, "display"), X.parentNode.removeChild(X), f1 === "none" && (f1 = "block"), n0[d1] = f1, f1);\n }\n function c0(R, X) {\n for (var i1, d1, f1 = [], g1 = 0, C1 = R.length; g1 < C1; g1++)\n d1 = R[g1], d1.style && (i1 = d1.style.display, X ? (i1 === "none" && (f1[g1] = b1.get(d1, "display") || null, f1[g1] || (d1.style.display = "")), d1.style.display === "" && Q1(d1) && (f1[g1] = u0(d1))) : i1 !== "none" && (f1[g1] = "none", b1.set(d1, "display", i1)));\n for (g1 = 0; g1 < C1; g1++)\n f1[g1] != null && (R[g1].style.display = f1[g1]);\n return R;\n }\n z.fn.extend({\n show: function() {\n return c0(this, !0);\n },\n hide: function() {\n return c0(this);\n },\n toggle: function(R) {\n return typeof R == "boolean" ? R ? this.show() : this.hide() : this.each(function() {\n Q1(this) ? z(this).show() : z(this).hide();\n });\n }\n });\n var C0 = /^(?:checkbox|radio)$/i, y0 = /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i, q1 = /^$|^module$|\\/(?:java|ecma)script/i;\n (function() {\n var R = g.createDocumentFragment(), X = R.appendChild(g.createElement("div")), i1 = g.createElement("input");\n i1.setAttribute("type", "radio"), i1.setAttribute("checked", "checked"), i1.setAttribute("name", "t"), X.appendChild(i1), b.checkClone = X.cloneNode(!0).cloneNode(!0).lastChild.checked, X.innerHTML = "", b.noCloneChecked = !!X.cloneNode(!0).lastChild.defaultValue, X.innerHTML = "", b.option = !!X.lastChild;\n })();\n var v1 = {\n // XHTML parsers do not magically insert elements in the\n // same way that tag soup parsers do. So we cannot shorten\n // this by omitting or other required elements.\n thead: [1, "", "
"],\n col: [2, "", "
"],\n tr: [2, "", "
"],\n td: [3, "", "
"],\n _default: [0, "", ""]\n };\n v1.tbody = v1.tfoot = v1.colgroup = v1.caption = v1.thead, v1.th = v1.td, b.option || (v1.optgroup = v1.option = [1, ""]);\n function k1(R, X) {\n var i1;\n return typeof R.getElementsByTagName < "u" ? i1 = R.getElementsByTagName(X || "*") : typeof R.querySelectorAll < "u" ? i1 = R.querySelectorAll(X || "*") : i1 = [], X === void 0 || X && W(R, X) ? z.merge([R], i1) : i1;\n }\n function S1(R, X) {\n for (var i1 = 0, d1 = R.length; i1 < d1; i1++)\n b1.set(\n R[i1],\n "globalEval",\n !X || b1.get(X[i1], "globalEval")\n );\n }\n var i0 = /<|&#?\\w+;/;\n function m0(R, X, i1, d1, f1) {\n for (var g1, C1, I1, W1, U1, t0, a0 = X.createDocumentFragment(), $1 = [], A0 = 0, _0 = R.length; A0 < _0; A0++)\n if (g1 = R[A0], g1 || g1 === 0)\n if (m(g1) === "object")\n z.merge($1, g1.nodeType ? [g1] : g1);\n else if (!i0.test(g1))\n $1.push(X.createTextNode(g1));\n else {\n for (C1 = C1 || a0.appendChild(X.createElement("div")), I1 = (y0.exec(g1) || ["", ""])[1].toLowerCase(), W1 = v1[I1] || v1._default, C1.innerHTML = W1[1] + z.htmlPrefilter(g1) + W1[2], t0 = W1[0]; t0--; )\n C1 = C1.lastChild;\n z.merge($1, C1.childNodes), C1 = a0.firstChild, C1.textContent = "";\n }\n for (a0.textContent = "", A0 = 0; g1 = $1[A0++]; ) {\n if (d1 && z.inArray(g1, d1) > -1) {\n f1 && f1.push(g1);\n continue;\n }\n if (U1 = X1(g1), C1 = k1(a0.appendChild(g1), "script"), U1 && S1(C1), i1)\n for (t0 = 0; g1 = C1[t0++]; )\n q1.test(g1.type || "") && i1.push(g1);\n }\n return a0;\n }\n var l0 = /^([^.]*)(?:\\.(.+)|)/;\n function _1() {\n return !0;\n }\n function H1() {\n return !1;\n }\n function j1(R, X, i1, d1, f1, g1) {\n var C1, I1;\n if (typeof X == "object") {\n typeof i1 != "string" && (d1 = d1 || i1, i1 = void 0);\n for (I1 in X)\n j1(R, I1, i1, d1, X[I1], g1);\n return R;\n }\n if (d1 == null && f1 == null ? (f1 = i1, d1 = i1 = void 0) : f1 == null && (typeof i1 == "string" ? (f1 = d1, d1 = void 0) : (f1 = d1, d1 = i1, i1 = void 0)), f1 === !1)\n f1 = H1;\n else if (!f1)\n return R;\n return g1 === 1 && (C1 = f1, f1 = function(W1) {\n return z().off(W1), C1.apply(this, arguments);\n }, f1.guid = C1.guid || (C1.guid = z.guid++)), R.each(function() {\n z.event.add(this, X, f1, d1, i1);\n });\n }\n z.event = {\n global: {},\n add: function(R, X, i1, d1, f1) {\n var g1, C1, I1, W1, U1, t0, a0, $1, A0, _0, be, ne = b1.get(R);\n if (A1(R))\n for (i1.handler && (g1 = i1, i1 = g1.handler, f1 = g1.selector), f1 && z.find.matchesSelector(F1, f1), i1.guid || (i1.guid = z.guid++), (W1 = ne.events) || (W1 = ne.events = /* @__PURE__ */ Object.create(null)), (C1 = ne.handle) || (C1 = ne.handle = function(Nt) {\n return typeof z < "u" && z.event.triggered !== Nt.type ? z.event.dispatch.apply(R, arguments) : void 0;\n }), X = (X || "").match(G) || [""], U1 = X.length; U1--; )\n I1 = l0.exec(X[U1]) || [], A0 = be = I1[1], _0 = (I1[2] || "").split(".").sort(), A0 && (a0 = z.event.special[A0] || {}, A0 = (f1 ? a0.delegateType : a0.bindType) || A0, a0 = z.event.special[A0] || {}, t0 = z.extend({\n type: A0,\n origType: be,\n data: d1,\n handler: i1,\n guid: i1.guid,\n selector: f1,\n needsContext: f1 && z.expr.match.needsContext.test(f1),\n namespace: _0.join(".")\n }, g1), ($1 = W1[A0]) || ($1 = W1[A0] = [], $1.delegateCount = 0, (!a0.setup || a0.setup.call(R, d1, _0, C1) === !1) && R.addEventListener && R.addEventListener(A0, C1)), a0.add && (a0.add.call(R, t0), t0.handler.guid || (t0.handler.guid = i1.guid)), f1 ? $1.splice($1.delegateCount++, 0, t0) : $1.push(t0), z.event.global[A0] = !0);\n },\n // Detach an event or set of events from an element\n remove: function(R, X, i1, d1, f1) {\n var g1, C1, I1, W1, U1, t0, a0, $1, A0, _0, be, ne = b1.hasData(R) && b1.get(R);\n if (!(!ne || !(W1 = ne.events))) {\n for (X = (X || "").match(G) || [""], U1 = X.length; U1--; ) {\n if (I1 = l0.exec(X[U1]) || [], A0 = be = I1[1], _0 = (I1[2] || "").split(".").sort(), !A0) {\n for (A0 in W1)\n z.event.remove(R, A0 + X[U1], i1, d1, !0);\n continue;\n }\n for (a0 = z.event.special[A0] || {}, A0 = (d1 ? a0.delegateType : a0.bindType) || A0, $1 = W1[A0] || [], I1 = I1[2] && new RegExp("(^|\\\\.)" + _0.join("\\\\.(?:.*\\\\.|)") + "(\\\\.|$)"), C1 = g1 = $1.length; g1--; )\n t0 = $1[g1], (f1 || be === t0.origType) && (!i1 || i1.guid === t0.guid) && (!I1 || I1.test(t0.namespace)) && (!d1 || d1 === t0.selector || d1 === "**" && t0.selector) && ($1.splice(g1, 1), t0.selector && $1.delegateCount--, a0.remove && a0.remove.call(R, t0));\n C1 && !$1.length && ((!a0.teardown || a0.teardown.call(R, _0, ne.handle) === !1) && z.removeEvent(R, A0, ne.handle), delete W1[A0]);\n }\n z.isEmptyObject(W1) && b1.remove(R, "handle events");\n }\n },\n dispatch: function(R) {\n var X, i1, d1, f1, g1, C1, I1 = new Array(arguments.length), W1 = z.event.fix(R), U1 = (b1.get(this, "events") || /* @__PURE__ */ Object.create(null))[W1.type] || [], t0 = z.event.special[W1.type] || {};\n for (I1[0] = W1, X = 1; X < arguments.length; X++)\n I1[X] = arguments[X];\n if (W1.delegateTarget = this, !(t0.preDispatch && t0.preDispatch.call(this, W1) === !1)) {\n for (C1 = z.event.handlers.call(this, W1, U1), X = 0; (f1 = C1[X++]) && !W1.isPropagationStopped(); )\n for (W1.currentTarget = f1.elem, i1 = 0; (g1 = f1.handlers[i1++]) && !W1.isImmediatePropagationStopped(); )\n (!W1.rnamespace || g1.namespace === !1 || W1.rnamespace.test(g1.namespace)) && (W1.handleObj = g1, W1.data = g1.data, d1 = ((z.event.special[g1.origType] || {}).handle || g1.handler).apply(f1.elem, I1), d1 !== void 0 && (W1.result = d1) === !1 && (W1.preventDefault(), W1.stopPropagation()));\n return t0.postDispatch && t0.postDispatch.call(this, W1), W1.result;\n }\n },\n handlers: function(R, X) {\n var i1, d1, f1, g1, C1, I1 = [], W1 = X.delegateCount, U1 = R.target;\n if (W1 && // Support: IE <=9\n // Black-hole SVG instance trees (trac-13180)\n U1.nodeType && // Support: Firefox <=42\n // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n // Support: IE 11 only\n // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)\n !(R.type === "click" && R.button >= 1)) {\n for (; U1 !== this; U1 = U1.parentNode || this)\n if (U1.nodeType === 1 && !(R.type === "click" && U1.disabled === !0)) {\n for (g1 = [], C1 = {}, i1 = 0; i1 < W1; i1++)\n d1 = X[i1], f1 = d1.selector + " ", C1[f1] === void 0 && (C1[f1] = d1.needsContext ? z(f1, this).index(U1) > -1 : z.find(f1, this, null, [U1]).length), C1[f1] && g1.push(d1);\n g1.length && I1.push({ elem: U1, handlers: g1 });\n }\n }\n return U1 = this, W1 < X.length && I1.push({ elem: U1, handlers: X.slice(W1) }), I1;\n },\n addProp: function(R, X) {\n Object.defineProperty(z.Event.prototype, R, {\n enumerable: !0,\n configurable: !0,\n get: M(X) ? function() {\n if (this.originalEvent)\n return X(this.originalEvent);\n } : function() {\n if (this.originalEvent)\n return this.originalEvent[R];\n },\n set: function(i1) {\n Object.defineProperty(this, R, {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: i1\n });\n }\n });\n },\n fix: function(R) {\n return R[z.expando] ? R : new z.Event(R);\n },\n special: {\n load: {\n // Prevent triggered image.load events from bubbling to window.load\n noBubble: !0\n },\n click: {\n // Utilize native event to ensure correct state for checkable inputs\n setup: function(R) {\n var X = this || R;\n return C0.test(X.type) && X.click && W(X, "input") && s0(X, "click", !0), !1;\n },\n trigger: function(R) {\n var X = this || R;\n return C0.test(X.type) && X.click && W(X, "input") && s0(X, "click"), !0;\n },\n // For cross-browser consistency, suppress native .click() on links\n // Also prevent it if we\'re currently inside a leveraged native-event stack\n _default: function(R) {\n var X = R.target;\n return C0.test(X.type) && X.click && W(X, "input") && b1.get(X, "click") || W(X, "a");\n }\n },\n beforeunload: {\n postDispatch: function(R) {\n R.result !== void 0 && R.originalEvent && (R.originalEvent.returnValue = R.result);\n }\n }\n }\n };\n function s0(R, X, i1) {\n if (!i1) {\n b1.get(R, X) === void 0 && z.event.add(R, X, _1);\n return;\n }\n b1.set(R, X, !1), z.event.add(R, X, {\n namespace: !1,\n handler: function(d1) {\n var f1, g1 = b1.get(this, X);\n if (d1.isTrigger & 1 && this[X]) {\n if (g1)\n (z.event.special[X] || {}).delegateType && d1.stopPropagation();\n else if (g1 = i.call(arguments), b1.set(this, X, g1), this[X](), f1 = b1.get(this, X), b1.set(this, X, !1), g1 !== f1)\n return d1.stopImmediatePropagation(), d1.preventDefault(), f1;\n } else\n g1 && (b1.set(this, X, z.event.trigger(\n g1[0],\n g1.slice(1),\n this\n )), d1.stopPropagation(), d1.isImmediatePropagationStopped = _1);\n }\n });\n }\n z.removeEvent = function(R, X, i1) {\n R.removeEventListener && R.removeEventListener(X, i1);\n }, z.Event = function(R, X) {\n if (!(this instanceof z.Event))\n return new z.Event(R, X);\n R && R.type ? (this.originalEvent = R, this.type = R.type, this.isDefaultPrevented = R.defaultPrevented || R.defaultPrevented === void 0 && // Support: Android <=2.3 only\n R.returnValue === !1 ? _1 : H1, this.target = R.target && R.target.nodeType === 3 ? R.target.parentNode : R.target, this.currentTarget = R.currentTarget, this.relatedTarget = R.relatedTarget) : this.type = R, X && z.extend(this, X), this.timeStamp = R && R.timeStamp || Date.now(), this[z.expando] = !0;\n }, z.Event.prototype = {\n constructor: z.Event,\n isDefaultPrevented: H1,\n isPropagationStopped: H1,\n isImmediatePropagationStopped: H1,\n isSimulated: !1,\n preventDefault: function() {\n var R = this.originalEvent;\n this.isDefaultPrevented = _1, R && !this.isSimulated && R.preventDefault();\n },\n stopPropagation: function() {\n var R = this.originalEvent;\n this.isPropagationStopped = _1, R && !this.isSimulated && R.stopPropagation();\n },\n stopImmediatePropagation: function() {\n var R = this.originalEvent;\n this.isImmediatePropagationStopped = _1, R && !this.isSimulated && R.stopImmediatePropagation(), this.stopPropagation();\n }\n }, z.each({\n altKey: !0,\n bubbles: !0,\n cancelable: !0,\n changedTouches: !0,\n ctrlKey: !0,\n detail: !0,\n eventPhase: !0,\n metaKey: !0,\n pageX: !0,\n pageY: !0,\n shiftKey: !0,\n view: !0,\n char: !0,\n code: !0,\n charCode: !0,\n key: !0,\n keyCode: !0,\n button: !0,\n buttons: !0,\n clientX: !0,\n clientY: !0,\n offsetX: !0,\n offsetY: !0,\n pointerId: !0,\n pointerType: !0,\n screenX: !0,\n screenY: !0,\n targetTouches: !0,\n toElement: !0,\n touches: !0,\n which: !0\n }, z.event.addProp), z.each({ focus: "focusin", blur: "focusout" }, function(R, X) {\n function i1(d1) {\n if (g.documentMode) {\n var f1 = b1.get(this, "handle"), g1 = z.event.fix(d1);\n g1.type = d1.type === "focusin" ? "focus" : "blur", g1.isSimulated = !0, f1(d1), g1.target === g1.currentTarget && f1(g1);\n } else\n z.event.simulate(\n X,\n d1.target,\n z.event.fix(d1)\n );\n }\n z.event.special[R] = {\n // Utilize native event if possible so blur/focus sequence is correct\n setup: function() {\n var d1;\n if (s0(this, R, !0), g.documentMode)\n d1 = b1.get(this, X), d1 || this.addEventListener(X, i1), b1.set(this, X, (d1 || 0) + 1);\n else\n return !1;\n },\n trigger: function() {\n return s0(this, R), !0;\n },\n teardown: function() {\n var d1;\n if (g.documentMode)\n d1 = b1.get(this, X) - 1, d1 ? b1.set(this, X, d1) : (this.removeEventListener(X, i1), b1.remove(this, X));\n else\n return !1;\n },\n // Suppress native focus or blur if we\'re currently inside\n // a leveraged native-event stack\n _default: function(d1) {\n return b1.get(d1.target, R);\n },\n delegateType: X\n }, z.event.special[X] = {\n setup: function() {\n var d1 = this.ownerDocument || this.document || this, f1 = g.documentMode ? this : d1, g1 = b1.get(f1, X);\n g1 || (g.documentMode ? this.addEventListener(X, i1) : d1.addEventListener(R, i1, !0)), b1.set(f1, X, (g1 || 0) + 1);\n },\n teardown: function() {\n var d1 = this.ownerDocument || this.document || this, f1 = g.documentMode ? this : d1, g1 = b1.get(f1, X) - 1;\n g1 ? b1.set(f1, X, g1) : (g.documentMode ? this.removeEventListener(X, i1) : d1.removeEventListener(R, i1, !0), b1.remove(f1, X));\n }\n };\n }), z.each({\n mouseenter: "mouseover",\n mouseleave: "mouseout",\n pointerenter: "pointerover",\n pointerleave: "pointerout"\n }, function(R, X) {\n z.event.special[R] = {\n delegateType: X,\n bindType: X,\n handle: function(i1) {\n var d1, f1 = this, g1 = i1.relatedTarget, C1 = i1.handleObj;\n return (!g1 || g1 !== f1 && !z.contains(f1, g1)) && (i1.type = C1.origType, d1 = C1.handler.apply(this, arguments), i1.type = X), d1;\n }\n };\n }), z.fn.extend({\n on: function(R, X, i1, d1) {\n return j1(this, R, X, i1, d1);\n },\n one: function(R, X, i1, d1) {\n return j1(this, R, X, i1, d1, 1);\n },\n off: function(R, X, i1) {\n var d1, f1;\n if (R && R.preventDefault && R.handleObj)\n return d1 = R.handleObj, z(R.delegateTarget).off(\n d1.namespace ? d1.origType + "." + d1.namespace : d1.origType,\n d1.selector,\n d1.handler\n ), this;\n if (typeof R == "object") {\n for (f1 in R)\n this.off(f1, X, R[f1]);\n return this;\n }\n return (X === !1 || typeof X == "function") && (i1 = X, X = void 0), i1 === !1 && (i1 = H1), this.each(function() {\n z.event.remove(this, R, i1, X);\n });\n }\n });\n var M0 = /\\s*$/g;\n function R1(R, X) {\n return W(R, "table") && W(X.nodeType !== 11 ? X : X.firstChild, "tr") && z(R).children("tbody")[0] || R;\n }\n function r0(R) {\n return R.type = (R.getAttribute("type") !== null) + "/" + R.type, R;\n }\n function d0(R) {\n return (R.type || "").slice(0, 5) === "true/" ? R.type = R.type.slice(5) : R.removeAttribute("type"), R;\n }\n function q0(R, X) {\n var i1, d1, f1, g1, C1, I1, W1;\n if (X.nodeType === 1) {\n if (b1.hasData(R) && (g1 = b1.get(R), W1 = g1.events, W1)) {\n b1.remove(X, "handle events");\n for (f1 in W1)\n for (i1 = 0, d1 = W1[f1].length; i1 < d1; i1++)\n z.event.add(X, f1, W1[f1][i1]);\n }\n h1.hasData(R) && (C1 = h1.access(R), I1 = z.extend({}, C1), h1.set(X, I1));\n }\n }\n function D0(R, X) {\n var i1 = X.nodeName.toLowerCase();\n i1 === "input" && C0.test(R.type) ? X.checked = R.checked : (i1 === "input" || i1 === "textarea") && (X.defaultValue = R.defaultValue);\n }\n function G0(R, X, i1, d1) {\n X = a(X);\n var f1, g1, C1, I1, W1, U1, t0 = 0, a0 = R.length, $1 = a0 - 1, A0 = X[0], _0 = M(A0);\n if (_0 || a0 > 1 && typeof A0 == "string" && !b.checkClone && I0.test(A0))\n return R.each(function(be) {\n var ne = R.eq(be);\n _0 && (X[0] = A0.call(this, be, ne.html())), G0(ne, X, i1, d1);\n });\n if (a0 && (f1 = m0(X, R[0].ownerDocument, !1, R, d1), g1 = f1.firstChild, f1.childNodes.length === 1 && (f1 = g1), g1 || d1)) {\n for (C1 = z.map(k1(f1, "script"), r0), I1 = C1.length; t0 < a0; t0++)\n W1 = f1, t0 !== $1 && (W1 = z.clone(W1, !0, !0), I1 && z.merge(C1, k1(W1, "script"))), i1.call(R[t0], W1, t0);\n if (I1)\n for (U1 = C1[C1.length - 1].ownerDocument, z.map(C1, d0), t0 = 0; t0 < I1; t0++)\n W1 = C1[t0], q1.test(W1.type || "") && !b1.access(W1, "globalEval") && z.contains(U1, W1) && (W1.src && (W1.type || "").toLowerCase() !== "module" ? z._evalUrl && !W1.noModule && z._evalUrl(W1.src, {\n nonce: W1.nonce || W1.getAttribute("nonce")\n }, U1) : O(W1.textContent.replace(re, ""), W1, U1));\n }\n return R;\n }\n function V0(R, X, i1) {\n for (var d1, f1 = X ? z.filter(X, R) : R, g1 = 0; (d1 = f1[g1]) != null; g1++)\n !i1 && d1.nodeType === 1 && z.cleanData(k1(d1)), d1.parentNode && (i1 && X1(d1) && S1(k1(d1, "script")), d1.parentNode.removeChild(d1));\n return R;\n }\n z.extend({\n htmlPrefilter: function(R) {\n return R;\n },\n clone: function(R, X, i1) {\n var d1, f1, g1, C1, I1 = R.cloneNode(!0), W1 = X1(R);\n if (!b.noCloneChecked && (R.nodeType === 1 || R.nodeType === 11) && !z.isXMLDoc(R))\n for (C1 = k1(I1), g1 = k1(R), d1 = 0, f1 = g1.length; d1 < f1; d1++)\n D0(g1[d1], C1[d1]);\n if (X)\n if (i1)\n for (g1 = g1 || k1(R), C1 = C1 || k1(I1), d1 = 0, f1 = g1.length; d1 < f1; d1++)\n q0(g1[d1], C1[d1]);\n else\n q0(R, I1);\n return C1 = k1(I1, "script"), C1.length > 0 && S1(C1, !W1 && k1(R, "script")), I1;\n },\n cleanData: function(R) {\n for (var X, i1, d1, f1 = z.event.special, g1 = 0; (i1 = R[g1]) !== void 0; g1++)\n if (A1(i1)) {\n if (X = i1[b1.expando]) {\n if (X.events)\n for (d1 in X.events)\n f1[d1] ? z.event.remove(i1, d1) : z.removeEvent(i1, d1, X.handle);\n i1[b1.expando] = void 0;\n }\n i1[h1.expando] && (i1[h1.expando] = void 0);\n }\n }\n }), z.fn.extend({\n detach: function(R) {\n return V0(this, R, !0);\n },\n remove: function(R) {\n return V0(this, R);\n },\n text: function(R) {\n return U(this, function(X) {\n return X === void 0 ? z.text(this) : this.empty().each(function() {\n (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) && (this.textContent = X);\n });\n }, null, R, arguments.length);\n },\n append: function() {\n return G0(this, arguments, function(R) {\n if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n var X = R1(this, R);\n X.appendChild(R);\n }\n });\n },\n prepend: function() {\n return G0(this, arguments, function(R) {\n if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {\n var X = R1(this, R);\n X.insertBefore(R, X.firstChild);\n }\n });\n },\n before: function() {\n return G0(this, arguments, function(R) {\n this.parentNode && this.parentNode.insertBefore(R, this);\n });\n },\n after: function() {\n return G0(this, arguments, function(R) {\n this.parentNode && this.parentNode.insertBefore(R, this.nextSibling);\n });\n },\n empty: function() {\n for (var R, X = 0; (R = this[X]) != null; X++)\n R.nodeType === 1 && (z.cleanData(k1(R, !1)), R.textContent = "");\n return this;\n },\n clone: function(R, X) {\n return R = R ?? !1, X = X ?? R, this.map(function() {\n return z.clone(this, R, X);\n });\n },\n html: function(R) {\n return U(this, function(X) {\n var i1 = this[0] || {}, d1 = 0, f1 = this.length;\n if (X === void 0 && i1.nodeType === 1)\n return i1.innerHTML;\n if (typeof X == "string" && !M0.test(X) && !v1[(y0.exec(X) || ["", ""])[1].toLowerCase()]) {\n X = z.htmlPrefilter(X);\n try {\n for (; d1 < f1; d1++)\n i1 = this[d1] || {}, i1.nodeType === 1 && (z.cleanData(k1(i1, !1)), i1.innerHTML = X);\n i1 = 0;\n } catch {\n }\n }\n i1 && this.empty().append(X);\n }, null, R, arguments.length);\n },\n replaceWith: function() {\n var R = [];\n return G0(this, arguments, function(X) {\n var i1 = this.parentNode;\n z.inArray(this, R) < 0 && (z.cleanData(k1(this)), i1 && i1.replaceChild(X, this));\n }, R);\n }\n }), z.each({\n appendTo: "append",\n prependTo: "prepend",\n insertBefore: "before",\n insertAfter: "after",\n replaceAll: "replaceWith"\n }, function(R, X) {\n z.fn[R] = function(i1) {\n for (var d1, f1 = [], g1 = z(i1), C1 = g1.length - 1, I1 = 0; I1 <= C1; I1++)\n d1 = I1 === C1 ? this : this.clone(!0), z(g1[I1])[X](d1), s.apply(f1, d1.get());\n return this.pushStack(f1);\n };\n });\n var W0 = new RegExp("^(" + y1 + ")(?!px)[a-z%]+$", "i"), ae = /^--/, ee = function(R) {\n var X = R.ownerDocument.defaultView;\n return (!X || !X.opener) && (X = t), X.getComputedStyle(R);\n }, se = function(R, X, i1) {\n var d1, f1, g1 = {};\n for (f1 in X)\n g1[f1] = R.style[f1], R.style[f1] = X[f1];\n d1 = i1.call(R);\n for (f1 in X)\n R.style[f1] = g1[f1];\n return d1;\n }, Me = new RegExp(T1.join("|"), "i");\n (function() {\n function R() {\n if (U1) {\n W1.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", U1.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", F1.appendChild(W1).appendChild(U1);\n var t0 = t.getComputedStyle(U1);\n i1 = t0.top !== "1%", I1 = X(t0.marginLeft) === 12, U1.style.right = "60%", g1 = X(t0.right) === 36, d1 = X(t0.width) === 36, U1.style.position = "absolute", f1 = X(U1.offsetWidth / 3) === 12, F1.removeChild(W1), U1 = null;\n }\n }\n function X(t0) {\n return Math.round(parseFloat(t0));\n }\n var i1, d1, f1, g1, C1, I1, W1 = g.createElement("div"), U1 = g.createElement("div");\n U1.style && (U1.style.backgroundClip = "content-box", U1.cloneNode(!0).style.backgroundClip = "", b.clearCloneStyle = U1.style.backgroundClip === "content-box", z.extend(b, {\n boxSizingReliable: function() {\n return R(), d1;\n },\n pixelBoxStyles: function() {\n return R(), g1;\n },\n pixelPosition: function() {\n return R(), i1;\n },\n reliableMarginLeft: function() {\n return R(), I1;\n },\n scrollboxSize: function() {\n return R(), f1;\n },\n // Support: IE 9 - 11+, Edge 15 - 18+\n // IE/Edge misreport `getComputedStyle` of table rows with width/height\n // set in CSS while `offset*` properties report correct values.\n // Behavior in IE 9 is more subtle than in newer versions & it passes\n // some versions of this test; make sure not to make it pass there!\n //\n // Support: Firefox 70+\n // Only Firefox includes border widths\n // in computed dimensions. (gh-4529)\n reliableTrDimensions: function() {\n var t0, a0, $1, A0;\n return C1 == null && (t0 = g.createElement("table"), a0 = g.createElement("tr"), $1 = g.createElement("div"), t0.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", a0.style.cssText = "box-sizing:content-box;border:1px solid", a0.style.height = "1px", $1.style.height = "9px", $1.style.display = "block", F1.appendChild(t0).appendChild(a0).appendChild($1), A0 = t.getComputedStyle(a0), C1 = parseInt(A0.height, 10) + parseInt(A0.borderTopWidth, 10) + parseInt(A0.borderBottomWidth, 10) === a0.offsetHeight, F1.removeChild(t0)), C1;\n }\n }));\n })();\n function At(R, X, i1) {\n var d1, f1, g1, C1, I1 = ae.test(X), W1 = R.style;\n return i1 = i1 || ee(R), i1 && (C1 = i1.getPropertyValue(X) || i1[X], I1 && C1 && (C1 = C1.replace(w, "$1") || void 0), C1 === "" && !X1(R) && (C1 = z.style(R, X)), !b.pixelBoxStyles() && W0.test(C1) && Me.test(X) && (d1 = W1.width, f1 = W1.minWidth, g1 = W1.maxWidth, W1.minWidth = W1.maxWidth = W1.width = C1, C1 = i1.width, W1.width = d1, W1.minWidth = f1, W1.maxWidth = g1)), C1 !== void 0 ? (\n // Support: IE <=9 - 11 only\n // IE returns zIndex value as an integer.\n C1 + ""\n ) : C1;\n }\n function Ne(R, X) {\n return {\n get: function() {\n if (R()) {\n delete this.get;\n return;\n }\n return (this.get = X).apply(this, arguments);\n }\n };\n }\n var _e = ["Webkit", "Moz", "ms"], ut = g.createElement("div").style, pr = {};\n function wr(R) {\n for (var X = R[0].toUpperCase() + R.slice(1), i1 = _e.length; i1--; )\n if (R = _e[i1] + X, R in ut)\n return R;\n }\n function Vn(R) {\n var X = z.cssProps[R] || pr[R];\n return X || (R in ut ? R : pr[R] = wr(R) || R);\n }\n var xi = /^(none|table(?!-c[ea]).+)/, ko = { position: "absolute", visibility: "hidden", display: "block" }, No = {\n letterSpacing: "0",\n fontWeight: "400"\n };\n function Io(R, X, i1) {\n var d1 = B1.exec(X);\n return d1 ? (\n // Guard against undefined "subtract", e.g., when used as in cssHooks\n Math.max(0, d1[2] - (i1 || 0)) + (d1[3] || "px")\n ) : X;\n }\n function p2(R, X, i1, d1, f1, g1) {\n var C1 = X === "width" ? 1 : 0, I1 = 0, W1 = 0, U1 = 0;\n if (i1 === (d1 ? "border" : "content"))\n return 0;\n for (; C1 < 4; C1 += 2)\n i1 === "margin" && (U1 += z.css(R, i1 + T1[C1], !0, f1)), d1 ? (i1 === "content" && (W1 -= z.css(R, "padding" + T1[C1], !0, f1)), i1 !== "margin" && (W1 -= z.css(R, "border" + T1[C1] + "Width", !0, f1))) : (W1 += z.css(R, "padding" + T1[C1], !0, f1), i1 !== "padding" ? W1 += z.css(R, "border" + T1[C1] + "Width", !0, f1) : I1 += z.css(R, "border" + T1[C1] + "Width", !0, f1));\n return !d1 && g1 >= 0 && (W1 += Math.max(0, Math.ceil(\n R["offset" + X[0].toUpperCase() + X.slice(1)] - g1 - W1 - I1 - 0.5\n // If offsetWidth/offsetHeight is unknown, then we can\'t determine content-box scroll gutter\n // Use an explicit zero to avoid NaN (gh-3964)\n )) || 0), W1 + U1;\n }\n function x2(R, X, i1) {\n var d1 = ee(R), f1 = !b.boxSizingReliable() || i1, g1 = f1 && z.css(R, "boxSizing", !1, d1) === "border-box", C1 = g1, I1 = At(R, X, d1), W1 = "offset" + X[0].toUpperCase() + X.slice(1);\n if (W0.test(I1)) {\n if (!i1)\n return I1;\n I1 = "auto";\n }\n return (!b.boxSizingReliable() && g1 || // Support: IE 10 - 11+, Edge 15 - 18+\n // IE/Edge misreport `getComputedStyle` of table rows with width/height\n // set in CSS while `offset*` properties report correct values.\n // Interestingly, in some cases IE 9 doesn\'t suffer from this issue.\n !b.reliableTrDimensions() && W(R, "tr") || // Fall back to offsetWidth/offsetHeight when value is "auto"\n // This happens for inline elements with no explicit setting (gh-3571)\n I1 === "auto" || // Support: Android <=4.1 - 4.3 only\n // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n !parseFloat(I1) && z.css(R, "display", !1, d1) === "inline") && // Make sure the element is visible & connected\n R.getClientRects().length && (g1 = z.css(R, "boxSizing", !1, d1) === "border-box", C1 = W1 in R, C1 && (I1 = R[W1])), I1 = parseFloat(I1) || 0, I1 + p2(\n R,\n X,\n i1 || (g1 ? "border" : "content"),\n C1,\n d1,\n // Provide the current computed size to request scroll gutter calculation (gh-3589)\n I1\n ) + "px";\n }\n z.extend({\n // Add in style property hooks for overriding the default\n // behavior of getting and setting a style property\n cssHooks: {\n opacity: {\n get: function(R, X) {\n if (X) {\n var i1 = At(R, "opacity");\n return i1 === "" ? "1" : i1;\n }\n }\n }\n },\n // Don\'t automatically add "px" to these possibly-unitless properties\n cssNumber: {\n animationIterationCount: !0,\n aspectRatio: !0,\n borderImageSlice: !0,\n columnCount: !0,\n flexGrow: !0,\n flexShrink: !0,\n fontWeight: !0,\n gridArea: !0,\n gridColumn: !0,\n gridColumnEnd: !0,\n gridColumnStart: !0,\n gridRow: !0,\n gridRowEnd: !0,\n gridRowStart: !0,\n lineHeight: !0,\n opacity: !0,\n order: !0,\n orphans: !0,\n scale: !0,\n widows: !0,\n zIndex: !0,\n zoom: !0,\n // SVG-related\n fillOpacity: !0,\n floodOpacity: !0,\n stopOpacity: !0,\n strokeMiterlimit: !0,\n strokeOpacity: !0\n },\n // Add in properties whose names you wish to fix before\n // setting or getting the value\n cssProps: {},\n // Get and set the style property on a DOM Node\n style: function(R, X, i1, d1) {\n if (!(!R || R.nodeType === 3 || R.nodeType === 8 || !R.style)) {\n var f1, g1, C1, I1 = M1(X), W1 = ae.test(X), U1 = R.style;\n if (W1 || (X = Vn(I1)), C1 = z.cssHooks[X] || z.cssHooks[I1], i1 !== void 0) {\n if (g1 = typeof i1, g1 === "string" && (f1 = B1.exec(i1)) && f1[1] && (i1 = K1(R, X, f1), g1 = "number"), i1 == null || i1 !== i1)\n return;\n g1 === "number" && !W1 && (i1 += f1 && f1[3] || (z.cssNumber[I1] ? "" : "px")), !b.clearCloneStyle && i1 === "" && X.indexOf("background") === 0 && (U1[X] = "inherit"), (!C1 || !("set" in C1) || (i1 = C1.set(R, i1, d1)) !== void 0) && (W1 ? U1.setProperty(X, i1) : U1[X] = i1);\n } else\n return C1 && "get" in C1 && (f1 = C1.get(R, !1, d1)) !== void 0 ? f1 : U1[X];\n }\n },\n css: function(R, X, i1, d1) {\n var f1, g1, C1, I1 = M1(X), W1 = ae.test(X);\n return W1 || (X = Vn(I1)), C1 = z.cssHooks[X] || z.cssHooks[I1], C1 && "get" in C1 && (f1 = C1.get(R, !0, i1)), f1 === void 0 && (f1 = At(R, X, d1)), f1 === "normal" && X in No && (f1 = No[X]), i1 === "" || i1 ? (g1 = parseFloat(f1), i1 === !0 || isFinite(g1) ? g1 || 0 : f1) : f1;\n }\n }), z.each(["height", "width"], function(R, X) {\n z.cssHooks[X] = {\n get: function(i1, d1, f1) {\n if (d1)\n return xi.test(z.css(i1, "display")) && // Support: Safari 8+\n // Table columns in Safari have non-zero offsetWidth & zero\n // getBoundingClientRect().width unless display is changed.\n // Support: IE <=11 only\n // Running getBoundingClientRect on a disconnected node\n // in IE throws an error.\n (!i1.getClientRects().length || !i1.getBoundingClientRect().width) ? se(i1, ko, function() {\n return x2(i1, X, f1);\n }) : x2(i1, X, f1);\n },\n set: function(i1, d1, f1) {\n var g1, C1 = ee(i1), I1 = !b.scrollboxSize() && C1.position === "absolute", W1 = I1 || f1, U1 = W1 && z.css(i1, "boxSizing", !1, C1) === "border-box", t0 = f1 ? p2(\n i1,\n X,\n f1,\n U1,\n C1\n ) : 0;\n return U1 && I1 && (t0 -= Math.ceil(\n i1["offset" + X[0].toUpperCase() + X.slice(1)] - parseFloat(C1[X]) - p2(i1, X, "border", !1, C1) - 0.5\n )), t0 && (g1 = B1.exec(d1)) && (g1[3] || "px") !== "px" && (i1.style[X] = d1, d1 = z.css(i1, X)), Io(i1, d1, t0);\n }\n };\n }), z.cssHooks.marginLeft = Ne(\n b.reliableMarginLeft,\n function(R, X) {\n if (X)\n return (parseFloat(At(R, "marginLeft")) || R.getBoundingClientRect().left - se(R, { marginLeft: 0 }, function() {\n return R.getBoundingClientRect().left;\n })) + "px";\n }\n ), z.each({\n margin: "",\n padding: "",\n border: "Width"\n }, function(R, X) {\n z.cssHooks[R + X] = {\n expand: function(i1) {\n for (var d1 = 0, f1 = {}, g1 = typeof i1 == "string" ? i1.split(" ") : [i1]; d1 < 4; d1++)\n f1[R + T1[d1] + X] = g1[d1] || g1[d1 - 2] || g1[0];\n return f1;\n }\n }, R !== "margin" && (z.cssHooks[R + X].set = Io);\n }), z.fn.extend({\n css: function(R, X) {\n return U(this, function(i1, d1, f1) {\n var g1, C1, I1 = {}, W1 = 0;\n if (Array.isArray(d1)) {\n for (g1 = ee(i1), C1 = d1.length; W1 < C1; W1++)\n I1[d1[W1]] = z.css(i1, d1[W1], !1, g1);\n return I1;\n }\n return f1 !== void 0 ? z.style(i1, d1, f1) : z.css(i1, d1);\n }, R, X, arguments.length > 1);\n }\n });\n function Fe(R, X, i1, d1, f1) {\n return new Fe.prototype.init(R, X, i1, d1, f1);\n }\n z.Tween = Fe, Fe.prototype = {\n constructor: Fe,\n init: function(R, X, i1, d1, f1, g1) {\n this.elem = R, this.prop = i1, this.easing = f1 || z.easing._default, this.options = X, this.start = this.now = this.cur(), this.end = d1, this.unit = g1 || (z.cssNumber[i1] ? "" : "px");\n },\n cur: function() {\n var R = Fe.propHooks[this.prop];\n return R && R.get ? R.get(this) : Fe.propHooks._default.get(this);\n },\n run: function(R) {\n var X, i1 = Fe.propHooks[this.prop];\n return this.options.duration ? this.pos = X = z.easing[this.easing](\n R,\n this.options.duration * R,\n 0,\n 1,\n this.options.duration\n ) : this.pos = X = R, this.now = (this.end - this.start) * X + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), i1 && i1.set ? i1.set(this) : Fe.propHooks._default.set(this), this;\n }\n }, Fe.prototype.init.prototype = Fe.prototype, Fe.propHooks = {\n _default: {\n get: function(R) {\n var X;\n return R.elem.nodeType !== 1 || R.elem[R.prop] != null && R.elem.style[R.prop] == null ? R.elem[R.prop] : (X = z.css(R.elem, R.prop, ""), !X || X === "auto" ? 0 : X);\n },\n set: function(R) {\n z.fx.step[R.prop] ? z.fx.step[R.prop](R) : R.elem.nodeType === 1 && (z.cssHooks[R.prop] || R.elem.style[Vn(R.prop)] != null) ? z.style(R.elem, R.prop, R.now + R.unit) : R.elem[R.prop] = R.now;\n }\n }\n }, Fe.propHooks.scrollTop = Fe.propHooks.scrollLeft = {\n set: function(R) {\n R.elem.nodeType && R.elem.parentNode && (R.elem[R.prop] = R.now);\n }\n }, z.easing = {\n linear: function(R) {\n return R;\n },\n swing: function(R) {\n return 0.5 - Math.cos(R * Math.PI) / 2;\n },\n _default: "swing"\n }, z.fx = Fe.prototype.init, z.fx.step = {};\n var F2, nn, on = /^(?:toggle|show|hide)$/, To = /queueHooks$/;\n function qr() {\n nn && (g.hidden === !1 && t.requestAnimationFrame ? t.requestAnimationFrame(qr) : t.setTimeout(qr, z.fx.interval), z.fx.tick());\n }\n function xr() {\n return t.setTimeout(function() {\n F2 = void 0;\n }), F2 = Date.now();\n }\n function U2(R, X) {\n var i1, d1 = 0, f1 = { height: R };\n for (X = X ? 1 : 0; d1 < 4; d1 += 2 - X)\n i1 = T1[d1], f1["margin" + i1] = f1["padding" + i1] = R;\n return X && (f1.opacity = f1.width = R), f1;\n }\n function an(R, X, i1) {\n for (var d1, f1 = (bt.tweeners[X] || []).concat(bt.tweeners["*"]), g1 = 0, C1 = f1.length; g1 < C1; g1++)\n if (d1 = f1[g1].call(i1, X, R))\n return d1;\n }\n function Do(R, X, i1) {\n var d1, f1, g1, C1, I1, W1, U1, t0, a0 = "width" in X || "height" in X, $1 = this, A0 = {}, _0 = R.style, be = R.nodeType && Q1(R), ne = b1.get(R, "fxshow");\n i1.queue || (C1 = z._queueHooks(R, "fx"), C1.unqueued == null && (C1.unqueued = 0, I1 = C1.empty.fire, C1.empty.fire = function() {\n C1.unqueued || I1();\n }), C1.unqueued++, $1.always(function() {\n $1.always(function() {\n C1.unqueued--, z.queue(R, "fx").length || C1.empty.fire();\n });\n }));\n for (d1 in X)\n if (f1 = X[d1], on.test(f1)) {\n if (delete X[d1], g1 = g1 || f1 === "toggle", f1 === (be ? "hide" : "show"))\n if (f1 === "show" && ne && ne[d1] !== void 0)\n be = !0;\n else\n continue;\n A0[d1] = ne && ne[d1] || z.style(R, d1);\n }\n if (W1 = !z.isEmptyObject(X), !(!W1 && z.isEmptyObject(A0))) {\n a0 && R.nodeType === 1 && (i1.overflow = [_0.overflow, _0.overflowX, _0.overflowY], U1 = ne && ne.display, U1 == null && (U1 = b1.get(R, "display")), t0 = z.css(R, "display"), t0 === "none" && (U1 ? t0 = U1 : (c0([R], !0), U1 = R.style.display || U1, t0 = z.css(R, "display"), c0([R]))), (t0 === "inline" || t0 === "inline-block" && U1 != null) && z.css(R, "float") === "none" && (W1 || ($1.done(function() {\n _0.display = U1;\n }), U1 == null && (t0 = _0.display, U1 = t0 === "none" ? "" : t0)), _0.display = "inline-block")), i1.overflow && (_0.overflow = "hidden", $1.always(function() {\n _0.overflow = i1.overflow[0], _0.overflowX = i1.overflow[1], _0.overflowY = i1.overflow[2];\n })), W1 = !1;\n for (d1 in A0)\n W1 || (ne ? "hidden" in ne && (be = ne.hidden) : ne = b1.access(R, "fxshow", { display: U1 }), g1 && (ne.hidden = !be), be && c0([R], !0), $1.done(function() {\n be || c0([R]), b1.remove(R, "fxshow");\n for (d1 in A0)\n z.style(R, d1, A0[d1]);\n })), W1 = an(be ? ne[d1] : 0, d1, $1), d1 in ne || (ne[d1] = W1.start, be && (W1.end = W1.start, W1.start = 0));\n }\n }\n function Ho(R, X) {\n var i1, d1, f1, g1, C1;\n for (i1 in R)\n if (d1 = M1(i1), f1 = X[d1], g1 = R[i1], Array.isArray(g1) && (f1 = g1[1], g1 = R[i1] = g1[0]), i1 !== d1 && (R[d1] = g1, delete R[i1]), C1 = z.cssHooks[d1], C1 && "expand" in C1) {\n g1 = C1.expand(g1), delete R[d1];\n for (i1 in g1)\n i1 in R || (R[i1] = g1[i1], X[i1] = f1);\n } else\n X[d1] = f1;\n }\n function bt(R, X, i1) {\n var d1, f1, g1 = 0, C1 = bt.prefilters.length, I1 = z.Deferred().always(function() {\n delete W1.elem;\n }), W1 = function() {\n if (f1)\n return !1;\n for (var a0 = F2 || xr(), $1 = Math.max(0, U1.startTime + U1.duration - a0), A0 = $1 / U1.duration || 0, _0 = 1 - A0, be = 0, ne = U1.tweens.length; be < ne; be++)\n U1.tweens[be].run(_0);\n return I1.notifyWith(R, [U1, _0, $1]), _0 < 1 && ne ? $1 : (ne || I1.notifyWith(R, [U1, 1, 0]), I1.resolveWith(R, [U1]), !1);\n }, U1 = I1.promise({\n elem: R,\n props: z.extend({}, X),\n opts: z.extend(!0, {\n specialEasing: {},\n easing: z.easing._default\n }, i1),\n originalProperties: X,\n originalOptions: i1,\n startTime: F2 || xr(),\n duration: i1.duration,\n tweens: [],\n createTween: function(a0, $1) {\n var A0 = z.Tween(\n R,\n U1.opts,\n a0,\n $1,\n U1.opts.specialEasing[a0] || U1.opts.easing\n );\n return U1.tweens.push(A0), A0;\n },\n stop: function(a0) {\n var $1 = 0, A0 = a0 ? U1.tweens.length : 0;\n if (f1)\n return this;\n for (f1 = !0; $1 < A0; $1++)\n U1.tweens[$1].run(1);\n return a0 ? (I1.notifyWith(R, [U1, 1, 0]), I1.resolveWith(R, [U1, a0])) : I1.rejectWith(R, [U1, a0]), this;\n }\n }), t0 = U1.props;\n for (Ho(t0, U1.opts.specialEasing); g1 < C1; g1++)\n if (d1 = bt.prefilters[g1].call(U1, R, t0, U1.opts), d1)\n return M(d1.stop) && (z._queueHooks(U1.elem, U1.opts.queue).stop = d1.stop.bind(d1)), d1;\n return z.map(t0, an, U1), M(U1.opts.start) && U1.opts.start.call(R, U1), U1.progress(U1.opts.progress).done(U1.opts.done, U1.opts.complete).fail(U1.opts.fail).always(U1.opts.always), z.fx.timer(\n z.extend(W1, {\n elem: R,\n anim: U1,\n queue: U1.opts.queue\n })\n ), U1;\n }\n z.Animation = z.extend(bt, {\n tweeners: {\n "*": [function(R, X) {\n var i1 = this.createTween(R, X);\n return K1(i1.elem, R, B1.exec(X), i1), i1;\n }]\n },\n tweener: function(R, X) {\n M(R) ? (X = R, R = ["*"]) : R = R.match(G);\n for (var i1, d1 = 0, f1 = R.length; d1 < f1; d1++)\n i1 = R[d1], bt.tweeners[i1] = bt.tweeners[i1] || [], bt.tweeners[i1].unshift(X);\n },\n prefilters: [Do],\n prefilter: function(R, X) {\n X ? bt.prefilters.unshift(R) : bt.prefilters.push(R);\n }\n }), z.speed = function(R, X, i1) {\n var d1 = R && typeof R == "object" ? z.extend({}, R) : {\n complete: i1 || !i1 && X || M(R) && R,\n duration: R,\n easing: i1 && X || X && !M(X) && X\n };\n return z.fx.off ? d1.duration = 0 : typeof d1.duration != "number" && (d1.duration in z.fx.speeds ? d1.duration = z.fx.speeds[d1.duration] : d1.duration = z.fx.speeds._default), (d1.queue == null || d1.queue === !0) && (d1.queue = "fx"), d1.old = d1.complete, d1.complete = function() {\n M(d1.old) && d1.old.call(this), d1.queue && z.dequeue(this, d1.queue);\n }, d1;\n }, z.fn.extend({\n fadeTo: function(R, X, i1, d1) {\n return this.filter(Q1).css("opacity", 0).show().end().animate({ opacity: X }, R, i1, d1);\n },\n animate: function(R, X, i1, d1) {\n var f1 = z.isEmptyObject(R), g1 = z.speed(X, i1, d1), C1 = function() {\n var I1 = bt(this, z.extend({}, R), g1);\n (f1 || b1.get(this, "finish")) && I1.stop(!0);\n };\n return C1.finish = C1, f1 || g1.queue === !1 ? this.each(C1) : this.queue(g1.queue, C1);\n },\n stop: function(R, X, i1) {\n var d1 = function(f1) {\n var g1 = f1.stop;\n delete f1.stop, g1(i1);\n };\n return typeof R != "string" && (i1 = X, X = R, R = void 0), X && this.queue(R || "fx", []), this.each(function() {\n var f1 = !0, g1 = R != null && R + "queueHooks", C1 = z.timers, I1 = b1.get(this);\n if (g1)\n I1[g1] && I1[g1].stop && d1(I1[g1]);\n else\n for (g1 in I1)\n I1[g1] && I1[g1].stop && To.test(g1) && d1(I1[g1]);\n for (g1 = C1.length; g1--; )\n C1[g1].elem === this && (R == null || C1[g1].queue === R) && (C1[g1].anim.stop(i1), f1 = !1, C1.splice(g1, 1));\n (f1 || !i1) && z.dequeue(this, R);\n });\n },\n finish: function(R) {\n return R !== !1 && (R = R || "fx"), this.each(function() {\n var X, i1 = b1.get(this), d1 = i1[R + "queue"], f1 = i1[R + "queueHooks"], g1 = z.timers, C1 = d1 ? d1.length : 0;\n for (i1.finish = !0, z.queue(this, R, []), f1 && f1.stop && f1.stop.call(this, !0), X = g1.length; X--; )\n g1[X].elem === this && g1[X].queue === R && (g1[X].anim.stop(!0), g1.splice(X, 1));\n for (X = 0; X < C1; X++)\n d1[X] && d1[X].finish && d1[X].finish.call(this);\n delete i1.finish;\n });\n }\n }), z.each(["toggle", "show", "hide"], function(R, X) {\n var i1 = z.fn[X];\n z.fn[X] = function(d1, f1, g1) {\n return d1 == null || typeof d1 == "boolean" ? i1.apply(this, arguments) : this.animate(U2(X, !0), d1, f1, g1);\n };\n }), z.each({\n slideDown: U2("show"),\n slideUp: U2("hide"),\n slideToggle: U2("toggle"),\n fadeIn: { opacity: "show" },\n fadeOut: { opacity: "hide" },\n fadeToggle: { opacity: "toggle" }\n }, function(R, X) {\n z.fn[R] = function(i1, d1, f1) {\n return this.animate(X, i1, d1, f1);\n };\n }), z.timers = [], z.fx.tick = function() {\n var R, X = 0, i1 = z.timers;\n for (F2 = Date.now(); X < i1.length; X++)\n R = i1[X], !R() && i1[X] === R && i1.splice(X--, 1);\n i1.length || z.fx.stop(), F2 = void 0;\n }, z.fx.timer = function(R) {\n z.timers.push(R), z.fx.start();\n }, z.fx.interval = 13, z.fx.start = function() {\n nn || (nn = !0, qr());\n }, z.fx.stop = function() {\n nn = null;\n }, z.fx.speeds = {\n slow: 600,\n fast: 200,\n // Default speed\n _default: 400\n }, z.fn.delay = function(R, X) {\n return R = z.fx && z.fx.speeds[R] || R, X = X || "fx", this.queue(X, function(i1, d1) {\n var f1 = t.setTimeout(i1, R);\n d1.stop = function() {\n t.clearTimeout(f1);\n };\n });\n }, function() {\n var R = g.createElement("input"), X = g.createElement("select"), i1 = X.appendChild(g.createElement("option"));\n R.type = "checkbox", b.checkOn = R.value !== "", b.optSelected = i1.selected, R = g.createElement("input"), R.value = "t", R.type = "radio", b.radioValue = R.value === "t";\n }();\n var dr, Y2 = z.expr.attrHandle;\n z.fn.extend({\n attr: function(R, X) {\n return U(this, z.attr, R, X, arguments.length > 1);\n },\n removeAttr: function(R) {\n return this.each(function() {\n z.removeAttr(this, R);\n });\n }\n }), z.extend({\n attr: function(R, X, i1) {\n var d1, f1, g1 = R.nodeType;\n if (!(g1 === 3 || g1 === 8 || g1 === 2)) {\n if (typeof R.getAttribute > "u")\n return z.prop(R, X, i1);\n if ((g1 !== 1 || !z.isXMLDoc(R)) && (f1 = z.attrHooks[X.toLowerCase()] || (z.expr.match.bool.test(X) ? dr : void 0)), i1 !== void 0) {\n if (i1 === null) {\n z.removeAttr(R, X);\n return;\n }\n return f1 && "set" in f1 && (d1 = f1.set(R, i1, X)) !== void 0 ? d1 : (R.setAttribute(X, i1 + ""), i1);\n }\n return f1 && "get" in f1 && (d1 = f1.get(R, X)) !== null ? d1 : (d1 = z.find.attr(R, X), d1 ?? void 0);\n }\n },\n attrHooks: {\n type: {\n set: function(R, X) {\n if (!b.radioValue && X === "radio" && W(R, "input")) {\n var i1 = R.value;\n return R.setAttribute("type", X), i1 && (R.value = i1), X;\n }\n }\n }\n },\n removeAttr: function(R, X) {\n var i1, d1 = 0, f1 = X && X.match(G);\n if (f1 && R.nodeType === 1)\n for (; i1 = f1[d1++]; )\n R.removeAttribute(i1);\n }\n }), dr = {\n set: function(R, X, i1) {\n return X === !1 ? z.removeAttr(R, i1) : R.setAttribute(i1, i1), i1;\n }\n }, z.each(z.expr.match.bool.source.match(/\\w+/g), function(R, X) {\n var i1 = Y2[X] || z.find.attr;\n Y2[X] = function(d1, f1, g1) {\n var C1, I1, W1 = f1.toLowerCase();\n return g1 || (I1 = Y2[W1], Y2[W1] = C1, C1 = i1(d1, f1, g1) != null ? W1 : null, Y2[W1] = I1), C1;\n };\n });\n var Po = /^(?:input|select|textarea|button)$/i, Vo = /^(?:a|area)$/i;\n z.fn.extend({\n prop: function(R, X) {\n return U(this, z.prop, R, X, arguments.length > 1);\n },\n removeProp: function(R) {\n return this.each(function() {\n delete this[z.propFix[R] || R];\n });\n }\n }), z.extend({\n prop: function(R, X, i1) {\n var d1, f1, g1 = R.nodeType;\n if (!(g1 === 3 || g1 === 8 || g1 === 2))\n return (g1 !== 1 || !z.isXMLDoc(R)) && (X = z.propFix[X] || X, f1 = z.propHooks[X]), i1 !== void 0 ? f1 && "set" in f1 && (d1 = f1.set(R, i1, X)) !== void 0 ? d1 : R[X] = i1 : f1 && "get" in f1 && (d1 = f1.get(R, X)) !== null ? d1 : R[X];\n },\n propHooks: {\n tabIndex: {\n get: function(R) {\n var X = z.find.attr(R, "tabindex");\n return X ? parseInt(X, 10) : Po.test(R.nodeName) || Vo.test(R.nodeName) && R.href ? 0 : -1;\n }\n }\n },\n propFix: {\n for: "htmlFor",\n class: "className"\n }\n }), b.optSelected || (z.propHooks.selected = {\n get: function(R) {\n var X = R.parentNode;\n return X && X.parentNode && X.parentNode.selectedIndex, null;\n },\n set: function(R) {\n var X = R.parentNode;\n X && (X.selectedIndex, X.parentNode && X.parentNode.selectedIndex);\n }\n }), z.each([\n "tabIndex",\n "readOnly",\n "maxLength",\n "cellSpacing",\n "cellPadding",\n "rowSpan",\n "colSpan",\n "useMap",\n "frameBorder",\n "contentEditable"\n ], function() {\n z.propFix[this.toLowerCase()] = this;\n });\n function d2(R) {\n var X = R.match(G) || [];\n return X.join(" ");\n }\n function R2(R) {\n return R.getAttribute && R.getAttribute("class") || "";\n }\n function sn(R) {\n return Array.isArray(R) ? R : typeof R == "string" ? R.match(G) || [] : [];\n }\n z.fn.extend({\n addClass: function(R) {\n var X, i1, d1, f1, g1, C1;\n return M(R) ? this.each(function(I1) {\n z(this).addClass(R.call(this, I1, R2(this)));\n }) : (X = sn(R), X.length ? this.each(function() {\n if (d1 = R2(this), i1 = this.nodeType === 1 && " " + d2(d1) + " ", i1) {\n for (g1 = 0; g1 < X.length; g1++)\n f1 = X[g1], i1.indexOf(" " + f1 + " ") < 0 && (i1 += f1 + " ");\n C1 = d2(i1), d1 !== C1 && this.setAttribute("class", C1);\n }\n }) : this);\n },\n removeClass: function(R) {\n var X, i1, d1, f1, g1, C1;\n return M(R) ? this.each(function(I1) {\n z(this).removeClass(R.call(this, I1, R2(this)));\n }) : arguments.length ? (X = sn(R), X.length ? this.each(function() {\n if (d1 = R2(this), i1 = this.nodeType === 1 && " " + d2(d1) + " ", i1) {\n for (g1 = 0; g1 < X.length; g1++)\n for (f1 = X[g1]; i1.indexOf(" " + f1 + " ") > -1; )\n i1 = i1.replace(" " + f1 + " ", " ");\n C1 = d2(i1), d1 !== C1 && this.setAttribute("class", C1);\n }\n }) : this) : this.attr("class", "");\n },\n toggleClass: function(R, X) {\n var i1, d1, f1, g1, C1 = typeof R, I1 = C1 === "string" || Array.isArray(R);\n return M(R) ? this.each(function(W1) {\n z(this).toggleClass(\n R.call(this, W1, R2(this), X),\n X\n );\n }) : typeof X == "boolean" && I1 ? X ? this.addClass(R) : this.removeClass(R) : (i1 = sn(R), this.each(function() {\n if (I1)\n for (g1 = z(this), f1 = 0; f1 < i1.length; f1++)\n d1 = i1[f1], g1.hasClass(d1) ? g1.removeClass(d1) : g1.addClass(d1);\n else\n (R === void 0 || C1 === "boolean") && (d1 = R2(this), d1 && b1.set(this, "__className__", d1), this.setAttribute && this.setAttribute(\n "class",\n d1 || R === !1 ? "" : b1.get(this, "__className__") || ""\n ));\n }));\n },\n hasClass: function(R) {\n var X, i1, d1 = 0;\n for (X = " " + R + " "; i1 = this[d1++]; )\n if (i1.nodeType === 1 && (" " + d2(R2(i1)) + " ").indexOf(X) > -1)\n return !0;\n return !1;\n }\n });\n var xs = /\\r/g;\n z.fn.extend({\n val: function(R) {\n var X, i1, d1, f1 = this[0];\n return arguments.length ? (d1 = M(R), this.each(function(g1) {\n var C1;\n this.nodeType === 1 && (d1 ? C1 = R.call(this, g1, z(this).val()) : C1 = R, C1 == null ? C1 = "" : typeof C1 == "number" ? C1 += "" : Array.isArray(C1) && (C1 = z.map(C1, function(I1) {\n return I1 == null ? "" : I1 + "";\n })), X = z.valHooks[this.type] || z.valHooks[this.nodeName.toLowerCase()], (!X || !("set" in X) || X.set(this, C1, "value") === void 0) && (this.value = C1));\n })) : f1 ? (X = z.valHooks[f1.type] || z.valHooks[f1.nodeName.toLowerCase()], X && "get" in X && (i1 = X.get(f1, "value")) !== void 0 ? i1 : (i1 = f1.value, typeof i1 == "string" ? i1.replace(xs, "") : i1 ?? "")) : void 0;\n }\n }), z.extend({\n valHooks: {\n option: {\n get: function(R) {\n var X = z.find.attr(R, "value");\n return X ?? // Support: IE <=10 - 11 only\n // option.text throws exceptions (trac-14686, trac-14858)\n // Strip and collapse whitespace\n // https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n d2(z.text(R));\n }\n },\n select: {\n get: function(R) {\n var X, i1, d1, f1 = R.options, g1 = R.selectedIndex, C1 = R.type === "select-one", I1 = C1 ? null : [], W1 = C1 ? g1 + 1 : f1.length;\n for (g1 < 0 ? d1 = W1 : d1 = C1 ? g1 : 0; d1 < W1; d1++)\n if (i1 = f1[d1], (i1.selected || d1 === g1) && // Don\'t return options that are disabled or in a disabled optgroup\n !i1.disabled && (!i1.parentNode.disabled || !W(i1.parentNode, "optgroup"))) {\n if (X = z(i1).val(), C1)\n return X;\n I1.push(X);\n }\n return I1;\n },\n set: function(R, X) {\n for (var i1, d1, f1 = R.options, g1 = z.makeArray(X), C1 = f1.length; C1--; )\n d1 = f1[C1], (d1.selected = z.inArray(z.valHooks.option.get(d1), g1) > -1) && (i1 = !0);\n return i1 || (R.selectedIndex = -1), g1;\n }\n }\n }\n }), z.each(["radio", "checkbox"], function() {\n z.valHooks[this] = {\n set: function(R, X) {\n if (Array.isArray(X))\n return R.checked = z.inArray(z(R).val(), X) > -1;\n }\n }, b.checkOn || (z.valHooks[this].get = function(R) {\n return R.getAttribute("value") === null ? "on" : R.value;\n });\n });\n var Fn = t.location, n3 = { guid: Date.now() }, Ri = /\\?/;\n z.parseXML = function(R) {\n var X, i1;\n if (!R || typeof R != "string")\n return null;\n try {\n X = new t.DOMParser().parseFromString(R, "text/xml");\n } catch {\n }\n return i1 = X && X.getElementsByTagName("parsererror")[0], (!X || i1) && z.error("Invalid XML: " + (i1 ? z.map(i1.childNodes, function(d1) {\n return d1.textContent;\n }).join(`\n`) : R)), X;\n };\n var o3 = /^(?:focusinfocus|focusoutblur)$/, i3 = function(R) {\n R.stopPropagation();\n };\n z.extend(z.event, {\n trigger: function(R, X, i1, d1) {\n var f1, g1, C1, I1, W1, U1, t0, a0, $1 = [i1 || g], A0 = d.call(R, "type") ? R.type : R, _0 = d.call(R, "namespace") ? R.namespace.split(".") : [];\n if (g1 = a0 = C1 = i1 = i1 || g, !(i1.nodeType === 3 || i1.nodeType === 8) && !o3.test(A0 + z.event.triggered) && (A0.indexOf(".") > -1 && (_0 = A0.split("."), A0 = _0.shift(), _0.sort()), W1 = A0.indexOf(":") < 0 && "on" + A0, R = R[z.expando] ? R : new z.Event(A0, typeof R == "object" && R), R.isTrigger = d1 ? 2 : 3, R.namespace = _0.join("."), R.rnamespace = R.namespace ? new RegExp("(^|\\\\.)" + _0.join("\\\\.(?:.*\\\\.|)") + "(\\\\.|$)") : null, R.result = void 0, R.target || (R.target = i1), X = X == null ? [R] : z.makeArray(X, [R]), t0 = z.event.special[A0] || {}, !(!d1 && t0.trigger && t0.trigger.apply(i1, X) === !1))) {\n if (!d1 && !t0.noBubble && !C(i1)) {\n for (I1 = t0.delegateType || A0, o3.test(I1 + A0) || (g1 = g1.parentNode); g1; g1 = g1.parentNode)\n $1.push(g1), C1 = g1;\n C1 === (i1.ownerDocument || g) && $1.push(C1.defaultView || C1.parentWindow || t);\n }\n for (f1 = 0; (g1 = $1[f1++]) && !R.isPropagationStopped(); )\n a0 = g1, R.type = f1 > 1 ? I1 : t0.bindType || A0, U1 = (b1.get(g1, "events") || /* @__PURE__ */ Object.create(null))[R.type] && b1.get(g1, "handle"), U1 && U1.apply(g1, X), U1 = W1 && g1[W1], U1 && U1.apply && A1(g1) && (R.result = U1.apply(g1, X), R.result === !1 && R.preventDefault());\n return R.type = A0, !d1 && !R.isDefaultPrevented() && (!t0._default || t0._default.apply($1.pop(), X) === !1) && A1(i1) && W1 && M(i1[A0]) && !C(i1) && (C1 = i1[W1], C1 && (i1[W1] = null), z.event.triggered = A0, R.isPropagationStopped() && a0.addEventListener(A0, i3), i1[A0](), R.isPropagationStopped() && a0.removeEventListener(A0, i3), z.event.triggered = void 0, C1 && (i1[W1] = C1)), R.result;\n }\n },\n // Piggyback on a donor event to simulate a different one\n // Used only for `focus(in | out)` events\n simulate: function(R, X, i1) {\n var d1 = z.extend(\n new z.Event(),\n i1,\n {\n type: R,\n isSimulated: !0\n }\n );\n z.event.trigger(d1, null, X);\n }\n }), z.fn.extend({\n trigger: function(R, X) {\n return this.each(function() {\n z.event.trigger(R, X, this);\n });\n },\n triggerHandler: function(R, X) {\n var i1 = this[0];\n if (i1)\n return z.event.trigger(R, X, i1, !0);\n }\n });\n var Rs = /\\[\\]$/, a3 = /\\r?\\n/g, Bs = /^(?:submit|button|image|reset|file)$/i, Ws = /^(?:input|select|textarea|keygen)/i;\n function Bi(R, X, i1, d1) {\n var f1;\n if (Array.isArray(X))\n z.each(X, function(g1, C1) {\n i1 || Rs.test(R) ? d1(R, C1) : Bi(\n R + "[" + (typeof C1 == "object" && C1 != null ? g1 : "") + "]",\n C1,\n i1,\n d1\n );\n });\n else if (!i1 && m(X) === "object")\n for (f1 in X)\n Bi(R + "[" + f1 + "]", X[f1], i1, d1);\n else\n d1(R, X);\n }\n z.param = function(R, X) {\n var i1, d1 = [], f1 = function(g1, C1) {\n var I1 = M(C1) ? C1() : C1;\n d1[d1.length] = encodeURIComponent(g1) + "=" + encodeURIComponent(I1 ?? "");\n };\n if (R == null)\n return "";\n if (Array.isArray(R) || R.jquery && !z.isPlainObject(R))\n z.each(R, function() {\n f1(this.name, this.value);\n });\n else\n for (i1 in R)\n Bi(i1, R[i1], X, f1);\n return d1.join("&");\n }, z.fn.extend({\n serialize: function() {\n return z.param(this.serializeArray());\n },\n serializeArray: function() {\n return this.map(function() {\n var R = z.prop(this, "elements");\n return R ? z.makeArray(R) : this;\n }).filter(function() {\n var R = this.type;\n return this.name && !z(this).is(":disabled") && Ws.test(this.nodeName) && !Bs.test(R) && (this.checked || !C0.test(R));\n }).map(function(R, X) {\n var i1 = z(this).val();\n return i1 == null ? null : Array.isArray(i1) ? z.map(i1, function(d1) {\n return { name: X.name, value: d1.replace(a3, `\\r\n`) };\n }) : { name: X.name, value: i1.replace(a3, `\\r\n`) };\n }).get();\n }\n });\n var Es = /%20/g, Ss = /#.*$/, ks = /([?&])_=[^&]*/, Ns = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg, Is = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Ts = /^(?:GET|HEAD)$/, Ds = /^\\/\\//, s3 = {}, Wi = {}, l3 = "*/".concat("*"), Ei = g.createElement("a");\n Ei.href = Fn.href;\n function c3(R) {\n return function(X, i1) {\n typeof X != "string" && (i1 = X, X = "*");\n var d1, f1 = 0, g1 = X.toLowerCase().match(G) || [];\n if (M(i1))\n for (; d1 = g1[f1++]; )\n d1[0] === "+" ? (d1 = d1.slice(1) || "*", (R[d1] = R[d1] || []).unshift(i1)) : (R[d1] = R[d1] || []).push(i1);\n };\n }\n function p3(R, X, i1, d1) {\n var f1 = {}, g1 = R === Wi;\n function C1(I1) {\n var W1;\n return f1[I1] = !0, z.each(R[I1] || [], function(U1, t0) {\n var a0 = t0(X, i1, d1);\n if (typeof a0 == "string" && !g1 && !f1[a0])\n return X.dataTypes.unshift(a0), C1(a0), !1;\n if (g1)\n return !(W1 = a0);\n }), W1;\n }\n return C1(X.dataTypes[0]) || !f1["*"] && C1("*");\n }\n function Si(R, X) {\n var i1, d1, f1 = z.ajaxSettings.flatOptions || {};\n for (i1 in X)\n X[i1] !== void 0 && ((f1[i1] ? R : d1 || (d1 = {}))[i1] = X[i1]);\n return d1 && z.extend(!0, R, d1), R;\n }\n function Hs(R, X, i1) {\n for (var d1, f1, g1, C1, I1 = R.contents, W1 = R.dataTypes; W1[0] === "*"; )\n W1.shift(), d1 === void 0 && (d1 = R.mimeType || X.getResponseHeader("Content-Type"));\n if (d1) {\n for (f1 in I1)\n if (I1[f1] && I1[f1].test(d1)) {\n W1.unshift(f1);\n break;\n }\n }\n if (W1[0] in i1)\n g1 = W1[0];\n else {\n for (f1 in i1) {\n if (!W1[0] || R.converters[f1 + " " + W1[0]]) {\n g1 = f1;\n break;\n }\n C1 || (C1 = f1);\n }\n g1 = g1 || C1;\n }\n if (g1)\n return g1 !== W1[0] && W1.unshift(g1), i1[g1];\n }\n function Ps(R, X, i1, d1) {\n var f1, g1, C1, I1, W1, U1 = {}, t0 = R.dataTypes.slice();\n if (t0[1])\n for (C1 in R.converters)\n U1[C1.toLowerCase()] = R.converters[C1];\n for (g1 = t0.shift(); g1; )\n if (R.responseFields[g1] && (i1[R.responseFields[g1]] = X), !W1 && d1 && R.dataFilter && (X = R.dataFilter(X, R.dataType)), W1 = g1, g1 = t0.shift(), g1) {\n if (g1 === "*")\n g1 = W1;\n else if (W1 !== "*" && W1 !== g1) {\n if (C1 = U1[W1 + " " + g1] || U1["* " + g1], !C1) {\n for (f1 in U1)\n if (I1 = f1.split(" "), I1[1] === g1 && (C1 = U1[W1 + " " + I1[0]] || U1["* " + I1[0]], C1)) {\n C1 === !0 ? C1 = U1[f1] : U1[f1] !== !0 && (g1 = I1[0], t0.unshift(I1[1]));\n break;\n }\n }\n if (C1 !== !0)\n if (C1 && R.throws)\n X = C1(X);\n else\n try {\n X = C1(X);\n } catch (a0) {\n return {\n state: "parsererror",\n error: C1 ? a0 : "No conversion from " + W1 + " to " + g1\n };\n }\n }\n }\n return { state: "success", data: X };\n }\n z.extend({\n // Counter for holding the number of active queries\n active: 0,\n // Last-Modified header cache for next request\n lastModified: {},\n etag: {},\n ajaxSettings: {\n url: Fn.href,\n type: "GET",\n isLocal: Is.test(Fn.protocol),\n global: !0,\n processData: !0,\n async: !0,\n contentType: "application/x-www-form-urlencoded; charset=UTF-8",\n /*\n timeout: 0,\n data: null,\n dataType: null,\n username: null,\n password: null,\n cache: null,\n throws: false,\n traditional: false,\n headers: {},\n */\n accepts: {\n "*": l3,\n text: "text/plain",\n html: "text/html",\n xml: "application/xml, text/xml",\n json: "application/json, text/javascript"\n },\n contents: {\n xml: /\\bxml\\b/,\n html: /\\bhtml/,\n json: /\\bjson\\b/\n },\n responseFields: {\n xml: "responseXML",\n text: "responseText",\n json: "responseJSON"\n },\n // Data converters\n // Keys separate source (or catchall "*") and destination types with a single space\n converters: {\n // Convert anything to text\n "* text": String,\n // Text to html (true = no transformation)\n "text html": !0,\n // Evaluate text as a json expression\n "text json": JSON.parse,\n // Parse text as xml\n "text xml": z.parseXML\n },\n // For options that shouldn\'t be deep extended:\n // you can add your own custom options here if\n // and when you create one that shouldn\'t be\n // deep extended (see ajaxExtend)\n flatOptions: {\n url: !0,\n context: !0\n }\n },\n // Creates a full fledged settings object into target\n // with both ajaxSettings and settings fields.\n // If target is omitted, writes into ajaxSettings.\n ajaxSetup: function(R, X) {\n return X ? (\n // Building a settings object\n Si(Si(R, z.ajaxSettings), X)\n ) : (\n // Extending ajaxSettings\n Si(z.ajaxSettings, R)\n );\n },\n ajaxPrefilter: c3(s3),\n ajaxTransport: c3(Wi),\n // Main method\n ajax: function(R, X) {\n typeof R == "object" && (X = R, R = void 0), X = X || {};\n var i1, d1, f1, g1, C1, I1, W1, U1, t0, a0, $1 = z.ajaxSetup({}, X), A0 = $1.context || $1, _0 = $1.context && (A0.nodeType || A0.jquery) ? z(A0) : z.event, be = z.Deferred(), ne = z.Callbacks("once memory"), Nt = $1.statusCode || {}, mt = {}, Rr = {}, Br = "canceled", pe = {\n readyState: 0,\n // Builds headers hashtable if needed\n getResponseHeader: function(fe) {\n var st;\n if (W1) {\n if (!g1)\n for (g1 = {}; st = Ns.exec(f1); )\n g1[st[1].toLowerCase() + " "] = (g1[st[1].toLowerCase() + " "] || []).concat(st[2]);\n st = g1[fe.toLowerCase() + " "];\n }\n return st == null ? null : st.join(", ");\n },\n // Raw string\n getAllResponseHeaders: function() {\n return W1 ? f1 : null;\n },\n // Caches the header\n setRequestHeader: function(fe, st) {\n return W1 == null && (fe = Rr[fe.toLowerCase()] = Rr[fe.toLowerCase()] || fe, mt[fe] = st), this;\n },\n // Overrides response content-type header\n overrideMimeType: function(fe) {\n return W1 == null && ($1.mimeType = fe), this;\n },\n // Status-dependent callbacks\n statusCode: function(fe) {\n var st;\n if (fe)\n if (W1)\n pe.always(fe[pe.status]);\n else\n for (st in fe)\n Nt[st] = [Nt[st], fe[st]];\n return this;\n },\n // Cancel the request\n abort: function(fe) {\n var st = fe || Br;\n return i1 && i1.abort(st), Fo(0, st), this;\n }\n };\n if (be.promise(pe), $1.url = ((R || $1.url || Fn.href) + "").replace(Ds, Fn.protocol + "//"), $1.type = X.method || X.type || $1.method || $1.type, $1.dataTypes = ($1.dataType || "*").toLowerCase().match(G) || [""], $1.crossDomain == null) {\n I1 = g.createElement("a");\n try {\n I1.href = $1.url, I1.href = I1.href, $1.crossDomain = Ei.protocol + "//" + Ei.host != I1.protocol + "//" + I1.host;\n } catch {\n $1.crossDomain = !0;\n }\n }\n if ($1.data && $1.processData && typeof $1.data != "string" && ($1.data = z.param($1.data, $1.traditional)), p3(s3, $1, X, pe), W1)\n return pe;\n U1 = z.event && $1.global, U1 && z.active++ === 0 && z.event.trigger("ajaxStart"), $1.type = $1.type.toUpperCase(), $1.hasContent = !Ts.test($1.type), d1 = $1.url.replace(Ss, ""), $1.hasContent ? $1.data && $1.processData && ($1.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && ($1.data = $1.data.replace(Es, "+")) : (a0 = $1.url.slice(d1.length), $1.data && ($1.processData || typeof $1.data == "string") && (d1 += (Ri.test(d1) ? "&" : "?") + $1.data, delete $1.data), $1.cache === !1 && (d1 = d1.replace(ks, "$1"), a0 = (Ri.test(d1) ? "&" : "?") + "_=" + n3.guid++ + a0), $1.url = d1 + a0), $1.ifModified && (z.lastModified[d1] && pe.setRequestHeader("If-Modified-Since", z.lastModified[d1]), z.etag[d1] && pe.setRequestHeader("If-None-Match", z.etag[d1])), ($1.data && $1.hasContent && $1.contentType !== !1 || X.contentType) && pe.setRequestHeader("Content-Type", $1.contentType), pe.setRequestHeader(\n "Accept",\n $1.dataTypes[0] && $1.accepts[$1.dataTypes[0]] ? $1.accepts[$1.dataTypes[0]] + ($1.dataTypes[0] !== "*" ? ", " + l3 + "; q=0.01" : "") : $1.accepts["*"]\n );\n for (t0 in $1.headers)\n pe.setRequestHeader(t0, $1.headers[t0]);\n if ($1.beforeSend && ($1.beforeSend.call(A0, pe, $1) === !1 || W1))\n return pe.abort();\n if (Br = "abort", ne.add($1.complete), pe.done($1.success), pe.fail($1.error), i1 = p3(Wi, $1, X, pe), !i1)\n Fo(-1, "No Transport");\n else {\n if (pe.readyState = 1, U1 && _0.trigger("ajaxSend", [pe, $1]), W1)\n return pe;\n $1.async && $1.timeout > 0 && (C1 = t.setTimeout(function() {\n pe.abort("timeout");\n }, $1.timeout));\n try {\n W1 = !1, i1.send(mt, Fo);\n } catch (fe) {\n if (W1)\n throw fe;\n Fo(-1, fe);\n }\n }\n function Fo(fe, st, A3, M6) {\n var Wr, u3, Er, Yn, Xn, X2 = st;\n W1 || (W1 = !0, C1 && t.clearTimeout(C1), i1 = void 0, f1 = M6 || "", pe.readyState = fe > 0 ? 4 : 0, Wr = fe >= 200 && fe < 300 || fe === 304, A3 && (Yn = Hs($1, pe, A3)), !Wr && z.inArray("script", $1.dataTypes) > -1 && z.inArray("json", $1.dataTypes) < 0 && ($1.converters["text script"] = function() {\n }), Yn = Ps($1, Yn, pe, Wr), Wr ? ($1.ifModified && (Xn = pe.getResponseHeader("Last-Modified"), Xn && (z.lastModified[d1] = Xn), Xn = pe.getResponseHeader("etag"), Xn && (z.etag[d1] = Xn)), fe === 204 || $1.type === "HEAD" ? X2 = "nocontent" : fe === 304 ? X2 = "notmodified" : (X2 = Yn.state, u3 = Yn.data, Er = Yn.error, Wr = !Er)) : (Er = X2, (fe || !X2) && (X2 = "error", fe < 0 && (fe = 0))), pe.status = fe, pe.statusText = (st || X2) + "", Wr ? be.resolveWith(A0, [u3, X2, pe]) : be.rejectWith(A0, [pe, X2, Er]), pe.statusCode(Nt), Nt = void 0, U1 && _0.trigger(\n Wr ? "ajaxSuccess" : "ajaxError",\n [pe, $1, Wr ? u3 : Er]\n ), ne.fireWith(A0, [pe, X2]), U1 && (_0.trigger("ajaxComplete", [pe, $1]), --z.active || z.event.trigger("ajaxStop")));\n }\n return pe;\n },\n getJSON: function(R, X, i1) {\n return z.get(R, X, i1, "json");\n },\n getScript: function(R, X) {\n return z.get(R, void 0, X, "script");\n }\n }), z.each(["get", "post"], function(R, X) {\n z[X] = function(i1, d1, f1, g1) {\n return M(d1) && (g1 = g1 || f1, f1 = d1, d1 = void 0), z.ajax(z.extend({\n url: i1,\n type: X,\n dataType: g1,\n data: d1,\n success: f1\n }, z.isPlainObject(i1) && i1));\n };\n }), z.ajaxPrefilter(function(R) {\n var X;\n for (X in R.headers)\n X.toLowerCase() === "content-type" && (R.contentType = R.headers[X] || "");\n }), z._evalUrl = function(R, X, i1) {\n return z.ajax({\n url: R,\n // Make this explicit, since user can override this through ajaxSetup (trac-11264)\n type: "GET",\n dataType: "script",\n cache: !0,\n async: !1,\n global: !1,\n // Only evaluate the response if it is successful (gh-4126)\n // dataFilter is not invoked for failure responses, so using it instead\n // of the default converter is kludgy but it works.\n converters: {\n "text script": function() {\n }\n },\n dataFilter: function(d1) {\n z.globalEval(d1, X, i1);\n }\n });\n }, z.fn.extend({\n wrapAll: function(R) {\n var X;\n return this[0] && (M(R) && (R = R.call(this[0])), X = z(R, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && X.insertBefore(this[0]), X.map(function() {\n for (var i1 = this; i1.firstElementChild; )\n i1 = i1.firstElementChild;\n return i1;\n }).append(this)), this;\n },\n wrapInner: function(R) {\n return M(R) ? this.each(function(X) {\n z(this).wrapInner(R.call(this, X));\n }) : this.each(function() {\n var X = z(this), i1 = X.contents();\n i1.length ? i1.wrapAll(R) : X.append(R);\n });\n },\n wrap: function(R) {\n var X = M(R);\n return this.each(function(i1) {\n z(this).wrapAll(X ? R.call(this, i1) : R);\n });\n },\n unwrap: function(R) {\n return this.parent(R).not("body").each(function() {\n z(this).replaceWith(this.childNodes);\n }), this;\n }\n }), z.expr.pseudos.hidden = function(R) {\n return !z.expr.pseudos.visible(R);\n }, z.expr.pseudos.visible = function(R) {\n return !!(R.offsetWidth || R.offsetHeight || R.getClientRects().length);\n }, z.ajaxSettings.xhr = function() {\n try {\n return new t.XMLHttpRequest();\n } catch {\n }\n };\n var Vs = {\n // File protocol always yields status code 0, assume 200\n 0: 200,\n // Support: IE <=9 only\n // trac-1450: sometimes IE returns 1223 when it should be 204\n 1223: 204\n }, Un = z.ajaxSettings.xhr();\n b.cors = !!Un && "withCredentials" in Un, b.ajax = Un = !!Un, z.ajaxTransport(function(R) {\n var X, i1;\n if (b.cors || Un && !R.crossDomain)\n return {\n send: function(d1, f1) {\n var g1, C1 = R.xhr();\n if (C1.open(\n R.type,\n R.url,\n R.async,\n R.username,\n R.password\n ), R.xhrFields)\n for (g1 in R.xhrFields)\n C1[g1] = R.xhrFields[g1];\n R.mimeType && C1.overrideMimeType && C1.overrideMimeType(R.mimeType), !R.crossDomain && !d1["X-Requested-With"] && (d1["X-Requested-With"] = "XMLHttpRequest");\n for (g1 in d1)\n C1.setRequestHeader(g1, d1[g1]);\n X = function(I1) {\n return function() {\n X && (X = i1 = C1.onload = C1.onerror = C1.onabort = C1.ontimeout = C1.onreadystatechange = null, I1 === "abort" ? C1.abort() : I1 === "error" ? typeof C1.status != "number" ? f1(0, "error") : f1(\n // File: protocol always yields status 0; see trac-8605, trac-14207\n C1.status,\n C1.statusText\n ) : f1(\n Vs[C1.status] || C1.status,\n C1.statusText,\n // Support: IE <=9 only\n // IE9 has no XHR2 but throws on binary (trac-11426)\n // For XHR2 non-text, let the caller handle it (gh-2498)\n (C1.responseType || "text") !== "text" || typeof C1.responseText != "string" ? { binary: C1.response } : { text: C1.responseText },\n C1.getAllResponseHeaders()\n ));\n };\n }, C1.onload = X(), i1 = C1.onerror = C1.ontimeout = X("error"), C1.onabort !== void 0 ? C1.onabort = i1 : C1.onreadystatechange = function() {\n C1.readyState === 4 && t.setTimeout(function() {\n X && i1();\n });\n }, X = X("abort");\n try {\n C1.send(R.hasContent && R.data || null);\n } catch (I1) {\n if (X)\n throw I1;\n }\n },\n abort: function() {\n X && X();\n }\n };\n }), z.ajaxPrefilter(function(R) {\n R.crossDomain && (R.contents.script = !1);\n }), z.ajaxSetup({\n accepts: {\n script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"\n },\n contents: {\n script: /\\b(?:java|ecma)script\\b/\n },\n converters: {\n "text script": function(R) {\n return z.globalEval(R), R;\n }\n }\n }), z.ajaxPrefilter("script", function(R) {\n R.cache === void 0 && (R.cache = !1), R.crossDomain && (R.type = "GET");\n }), z.ajaxTransport("script", function(R) {\n if (R.crossDomain || R.scriptAttrs) {\n var X, i1;\n return {\n send: function(d1, f1) {\n X = z("